Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/bin/changelog_spec.rb1
-rw-r--r--spec/bin/storage_check_spec.rb13
-rw-r--r--spec/config/settings_spec.rb9
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb25
-rw-r--r--spec/controllers/admin/health_check_controller_spec.rb12
-rw-r--r--spec/controllers/admin/projects_controller_spec.rb11
-rw-r--r--spec/controllers/application_controller_spec.rb180
-rw-r--r--spec/controllers/autocomplete_controller_spec.rb13
-rw-r--r--spec/controllers/boards/issues_controller_spec.rb68
-rw-r--r--spec/controllers/concerns/issuable_collections_spec.rb43
-rw-r--r--spec/controllers/concerns/send_file_upload_spec.rb52
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb17
-rw-r--r--spec/controllers/groups/boards_controller_spec.rb59
-rw-r--r--spec/controllers/groups/clusters/applications_controller_spec.rb87
-rw-r--r--spec/controllers/groups/clusters_controller_spec.rb574
-rw-r--r--spec/controllers/groups/milestones_controller_spec.rb15
-rw-r--r--spec/controllers/groups/settings/ci_cd_controller_spec.rb14
-rw-r--r--spec/controllers/groups_controller_spec.rb49
-rw-r--r--spec/controllers/health_controller_spec.rb42
-rw-r--r--spec/controllers/import/bitbucket_server_controller_spec.rb11
-rw-r--r--spec/controllers/import/gitlab_projects_controller_spec.rb2
-rw-r--r--spec/controllers/instance_statistics/cohorts_controller_spec.rb14
-rw-r--r--spec/controllers/notification_settings_controller_spec.rb9
-rw-r--r--spec/controllers/oauth/applications_controller_spec.rb34
-rw-r--r--spec/controllers/omniauth_callbacks_controller_spec.rb2
-rw-r--r--spec/controllers/profiles/keys_controller_spec.rb2
-rw-r--r--spec/controllers/profiles/personal_access_tokens_controller_spec.rb6
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb63
-rw-r--r--spec/controllers/projects/avatars_controller_spec.rb53
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb76
-rw-r--r--spec/controllers/projects/boards_controller_spec.rb57
-rw-r--r--spec/controllers/projects/clusters/applications_controller_spec.rb2
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb378
-rw-r--r--spec/controllers/projects/commit_controller_spec.rb3
-rw-r--r--spec/controllers/projects/compare_controller_spec.rb24
-rw-r--r--spec/controllers/projects/deploy_keys_controller_spec.rb149
-rw-r--r--spec/controllers/projects/deployments_controller_spec.rb12
-rw-r--r--spec/controllers/projects/environments_controller_spec.rb2
-rw-r--r--spec/controllers/projects/hooks_controller_spec.rb1
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb19
-rw-r--r--spec/controllers/projects/jobs_controller_spec.rb374
-rw-r--r--spec/controllers/projects/merge_requests/conflicts_controller_spec.rb1
-rw-r--r--spec/controllers/projects/merge_requests/creations_controller_spec.rb49
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb122
-rw-r--r--spec/controllers/projects/milestones_controller_spec.rb2
-rw-r--r--spec/controllers/projects/mirrors_controller_spec.rb63
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb41
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb46
-rw-r--r--spec/controllers/projects/raw_controller_spec.rb101
-rw-r--r--spec/controllers/projects/registry/repositories_controller_spec.rb5
-rw-r--r--spec/controllers/projects/releases_controller_spec.rb2
-rw-r--r--spec/controllers/projects/settings/ci_cd_controller_spec.rb13
-rw-r--r--spec/controllers/projects/uploads_controller_spec.rb14
-rw-r--r--spec/controllers/projects/wikis_controller_spec.rb56
-rw-r--r--spec/controllers/projects_controller_spec.rb43
-rw-r--r--spec/controllers/registrations_controller_spec.rb2
-rw-r--r--spec/controllers/root_controller_spec.rb4
-rw-r--r--spec/controllers/sessions_controller_spec.rb2
-rw-r--r--spec/controllers/uploads_controller_spec.rb25
-rw-r--r--spec/db/development/import_common_metrics_spec.rb15
-rw-r--r--spec/db/importers/common_metrics_importer_spec.rb131
-rw-r--r--spec/db/production/import_common_metrics_spec.rb15
-rw-r--r--spec/db/schema_spec.rb96
-rw-r--r--spec/factories/board_group_recent_visit.rb9
-rw-r--r--spec/factories/board_project_recent_visit.rb9
-rw-r--r--spec/factories/broadcast_messages.rb12
-rw-r--r--spec/factories/ci/builds.rb57
-rw-r--r--spec/factories/ci/job_artifacts.rb43
-rw-r--r--spec/factories/ci/pipelines.rb12
-rw-r--r--spec/factories/ci/runners.rb12
-rw-r--r--spec/factories/clusters/applications/helm.rb22
-rw-r--r--spec/factories/clusters/clusters.rb15
-rw-r--r--spec/factories/clusters/kubernetes_namespaces.rb18
-rw-r--r--spec/factories/clusters/platforms/kubernetes.rb9
-rw-r--r--spec/factories/clusters/projects.rb8
-rw-r--r--spec/factories/commit_statuses.rb4
-rw-r--r--spec/factories/deployments.rb31
-rw-r--r--spec/factories/emails.rb3
-rw-r--r--spec/factories/environments.rb1
-rw-r--r--spec/factories/events.rb2
-rw-r--r--spec/factories/forked_project_links.rb15
-rw-r--r--spec/factories/gpg_keys.rb4
-rw-r--r--spec/factories/group_members.rb2
-rw-r--r--spec/factories/issues.rb4
-rw-r--r--spec/factories/merge_request_diff_files.rb47
-rw-r--r--spec/factories/merge_request_diffs.rb13
-rw-r--r--spec/factories/merge_requests.rb16
-rw-r--r--spec/factories/milestones.rb2
-rw-r--r--spec/factories/notes.rb2
-rw-r--r--spec/factories/oauth_access_grants.rb2
-rw-r--r--spec/factories/project_auto_devops.rb12
-rw-r--r--spec/factories/project_group_links.rb1
-rw-r--r--spec/factories/project_members.rb2
-rw-r--r--spec/factories/projects.rb63
-rw-r--r--spec/factories/prometheus_metrics.rb18
-rw-r--r--spec/factories/resource_label_events.rb7
-rw-r--r--spec/factories/services.rb11
-rw-r--r--spec/factories/site_statistics.rb1
-rw-r--r--spec/factories/todos.rb2
-rw-r--r--spec/factories/uploads.rb15
-rw-r--r--spec/factories/user_preferences.rb12
-rw-r--r--spec/factories/users.rb8
-rw-r--r--spec/fast_spec_helper.rb2
-rw-r--r--spec/features/admin/admin_groups_spec.rb28
-rw-r--r--spec/features/admin/admin_health_check_spec.rb26
-rw-r--r--spec/features/admin/admin_manage_applications_spec.rb4
-rw-r--r--spec/features/admin/admin_runners_spec.rb167
-rw-r--r--spec/features/admin/admin_settings_spec.rb496
-rw-r--r--spec/features/admin/admin_users_impersonation_tokens_spec.rb5
-rw-r--r--spec/features/admin/admin_users_spec.rb63
-rw-r--r--spec/features/admin/admin_uses_repository_checks_spec.rb2
-rw-r--r--spec/features/admin/dashboard_spec.rb28
-rw-r--r--spec/features/atom/dashboard_issues_spec.rb12
-rw-r--r--spec/features/boards/add_issues_modal_spec.rb2
-rw-r--r--spec/features/boards/boards_spec.rb2
-rw-r--r--spec/features/boards/issue_ordering_spec.rb4
-rw-r--r--spec/features/boards/modal_filter_spec.rb2
-rw-r--r--spec/features/boards/new_issue_spec.rb10
-rw-r--r--spec/features/boards/reload_boards_on_browser_back_spec.rb48
-rw-r--r--spec/features/calendar_spec.rb21
-rw-r--r--spec/features/commits/user_uses_quick_actions_spec.rb (renamed from spec/features/commits/user_uses_slash_commands_spec.rb)0
-rw-r--r--spec/features/commits_spec.rb60
-rw-r--r--spec/features/dashboard/archived_projects_spec.rb2
-rw-r--r--spec/features/dashboard/datetime_on_tooltips_spec.rb2
-rw-r--r--spec/features/dashboard/group_spec.rb10
-rw-r--r--spec/features/dashboard/groups_list_spec.rb4
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb4
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb31
-rw-r--r--spec/features/dashboard/issues_spec.rb27
-rw-r--r--spec/features/dashboard/label_filter_spec.rb15
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb15
-rw-r--r--spec/features/dashboard/milestone_filter_spec.rb77
-rw-r--r--spec/features/dashboard/milestones_spec.rb6
-rw-r--r--spec/features/dashboard/project_member_activity_index_spec.rb16
-rw-r--r--spec/features/dashboard/projects_spec.rb8
-rw-r--r--spec/features/dashboard/shortcuts_spec.rb8
-rw-r--r--spec/features/explore/new_menu_spec.rb8
-rw-r--r--spec/features/groups/board_sidebar_spec.rb45
-rw-r--r--spec/features/groups/group_settings_spec.rb18
-rw-r--r--spec/features/groups/labels/search_labels_spec.rb48
-rw-r--r--spec/features/groups/labels/sort_labels_spec.rb48
-rw-r--r--spec/features/groups/labels/subscription_spec.rb50
-rw-r--r--spec/features/groups/milestone_spec.rb12
-rw-r--r--spec/features/groups/settings/ci_cd_spec.rb39
-rw-r--r--spec/features/groups/settings/group_badges_spec.rb2
-rw-r--r--spec/features/groups/share_lock_spec.rb4
-rw-r--r--spec/features/groups/show_spec.rb21
-rw-r--r--spec/features/groups_spec.rb41
-rw-r--r--spec/features/import/manifest_import_spec.rb2
-rw-r--r--spec/features/instance_statistics/cohorts_spec.rb2
-rw-r--r--spec/features/instance_statistics/conversational_development_index_spec.rb20
-rw-r--r--spec/features/instance_statistics/instance_statistics.rb23
-rw-r--r--spec/features/issuables/close_reopen_report_toggle_spec.rb40
-rw-r--r--spec/features/issues/award_emoji_spec.rb146
-rw-r--r--spec/features/issues/award_spec.rb51
-rw-r--r--spec/features/issues/filtered_search/dropdown_assignee_spec.rb12
-rw-r--r--spec/features/issues/filtered_search/dropdown_emoji_spec.rb22
-rw-r--r--spec/features/issues/filtered_search/dropdown_hint_spec.rb18
-rw-r--r--spec/features/issues/filtered_search/dropdown_milestone_spec.rb10
-rw-r--r--spec/features/issues/filtered_search/filter_issues_spec.rb2
-rw-r--r--spec/features/issues/filtered_search/visual_tokens_spec.rb2
-rw-r--r--spec/features/issues/form_spec.rb2
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb49
-rw-r--r--spec/features/issues/issue_detail_spec.rb17
-rw-r--r--spec/features/issues/notes_on_issues_spec.rb23
-rw-r--r--spec/features/issues/resource_label_events_spec.rb67
-rw-r--r--spec/features/issues/rss_spec.rb (renamed from spec/features/projects/issues/rss_spec.rb)0
-rw-r--r--spec/features/issues/user_comments_on_issue_spec.rb (renamed from spec/features/projects/issues/user_comments_on_issue_spec.rb)0
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb8
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb (renamed from spec/features/projects/issues/user_creates_issue_spec.rb)6
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb (renamed from spec/features/projects/issues/user_edits_issue_spec.rb)4
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb347
-rw-r--r--spec/features/issues/user_sees_breadcrumb_links_spec.rb18
-rw-r--r--spec/features/issues/user_sorts_issues_spec.rb (renamed from spec/features/projects/issues/user_sorts_issues_spec.rb)26
-rw-r--r--spec/features/issues/user_toggles_subscription_spec.rb (renamed from spec/features/projects/issues/user_toggles_subscription_spec.rb)0
-rw-r--r--spec/features/issues/user_uses_quick_actions_spec.rb (renamed from spec/features/issues/user_uses_slash_commands_spec.rb)58
-rw-r--r--spec/features/issues/user_views_issue_spec.rb (renamed from spec/features/projects/issues/user_views_issue_spec.rb)6
-rw-r--r--spec/features/issues/user_views_issues_spec.rb (renamed from spec/features/projects/issues/user_views_issues_spec.rb)0
-rw-r--r--spec/features/labels_hierarchy_spec.rb2
-rw-r--r--spec/features/markdown/markdown_spec.rb6
-rw-r--r--spec/features/merge_request/user_accepts_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_closes_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_closes_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_comments_on_commit_spec.rb (renamed from spec/features/projects/merge_requests/user_comments_on_commit_spec.rb)0
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb (renamed from spec/features/projects/merge_requests/user_comments_on_diff_spec.rb)18
-rw-r--r--spec/features/merge_request/user_comments_on_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_creates_image_diff_notes_spec.rb9
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_creates_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_creates_mr_spec.rb25
-rw-r--r--spec/features/merge_request/user_edits_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_edits_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_edits_mr_spec.rb4
-rw-r--r--spec/features/merge_request/user_manages_subscription_spec.rb (renamed from spec/features/projects/merge_requests/user_manages_subscription_spec.rb)0
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_merges_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb35
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb4
-rw-r--r--spec/features/merge_request/user_rebases_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_reopens_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_resolves_conflicts_spec.rb18
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb79
-rw-r--r--spec/features/merge_request/user_reverts_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb17
-rw-r--r--spec/features/merge_request/user_sees_breadcrumb_links_spec.rb18
-rw-r--r--spec/features/merge_request/user_sees_deployment_widget_spec.rb81
-rw-r--r--spec/features/merge_request/user_sees_diff_spec.rb55
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb32
-rw-r--r--spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb3
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb10
-rw-r--r--spec/features/merge_request/user_uses_quick_actions_spec.rb (renamed from spec/features/merge_request/user_uses_slash_commands_spec.rb)0
-rw-r--r--spec/features/merge_request/user_views_diffs_spec.rb (renamed from spec/features/projects/merge_requests/user_views_diffs_spec.rb)2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb)6
-rw-r--r--spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb (renamed from spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb)0
-rw-r--r--spec/features/merge_requests/user_sorts_merge_requests_spec.rb (renamed from spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb)43
-rw-r--r--spec/features/merge_requests/user_views_all_merge_requests_spec.rb (renamed from spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb)0
-rw-r--r--spec/features/merge_requests/user_views_closed_merge_requests_spec.rb (renamed from spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb)0
-rw-r--r--spec/features/merge_requests/user_views_merged_merge_requests_spec.rb (renamed from spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb)0
-rw-r--r--spec/features/merge_requests/user_views_open_merge_requests_spec.rb (renamed from spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb)0
-rw-r--r--spec/features/milestones/user_creates_milestone_spec.rb2
-rw-r--r--spec/features/milestones/user_deletes_milestone_spec.rb44
-rw-r--r--spec/features/profiles/personal_access_tokens_spec.rb3
-rw-r--r--spec/features/profiles/user_edit_profile_spec.rb252
-rw-r--r--spec/features/profiles/user_manages_applications_spec.rb4
-rw-r--r--spec/features/projects/activity/user_sees_activity_spec.rb14
-rw-r--r--spec/features/projects/activity/user_sees_private_activity_spec.rb35
-rw-r--r--spec/features/projects/artifacts/user_downloads_artifacts_spec.rb14
-rw-r--r--spec/features/projects/awards/user_interacts_with_awards_in_issue_spec.rb172
-rw-r--r--spec/features/projects/badges/pipeline_badge_spec.rb2
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb56
-rw-r--r--spec/features/projects/blobs/edit_spec.rb34
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb53
-rw-r--r--spec/features/projects/clusters/user_spec.rb40
-rw-r--r--spec/features/projects/clusters_spec.rb31
-rw-r--r--spec/features/projects/commit/cherry_pick_spec.rb8
-rw-r--r--spec/features/projects/commit/comments/user_adds_comment_spec.rb10
-rw-r--r--spec/features/projects/commit/user_comments_on_commit_spec.rb6
-rw-r--r--spec/features/projects/environments/environment_spec.rb75
-rw-r--r--spec/features/projects/environments/environments_spec.rb99
-rw-r--r--spec/features/projects/files/project_owner_creates_license_file_spec.rb2
-rw-r--r--spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb2
-rw-r--r--spec/features/projects/files/user_creates_files_spec.rb4
-rw-r--r--spec/features/projects/files/user_deletes_files_spec.rb2
-rw-r--r--spec/features/projects/fork_spec.rb12
-rw-r--r--spec/features/projects/import_export/export_file_spec.rb5
-rw-r--r--spec/features/projects/import_export/import_file_object_storage_spec.rb103
-rw-r--r--spec/features/projects/import_export/import_file_spec.rb21
-rw-r--r--spec/features/projects/import_export/namespace_export_file_spec.rb68
-rw-r--r--spec/features/projects/import_export/test_project_export.tar.gzbin3368 -> 3360 bytes
-rw-r--r--spec/features/projects/jobs/permissions_spec.rb2
-rw-r--r--spec/features/projects/jobs/user_browses_job_spec.rb16
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb2
-rw-r--r--spec/features/projects/jobs_spec.rb412
-rw-r--r--spec/features/projects/labels/sort_labels_spec.rb48
-rw-r--r--spec/features/projects/members/invite_group_spec.rb (renamed from spec/features/projects/members/share_with_group_spec.rb)25
-rw-r--r--spec/features/projects/new_project_spec.rb29
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb123
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb58
-rw-r--r--spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb2
-rw-r--r--spec/features/projects/settings/integration_settings_spec.rb1
-rw-r--r--spec/features/projects/settings/pipelines_settings_spec.rb24
-rw-r--r--spec/features/projects/settings/project_badges_spec.rb2
-rw-r--r--spec/features/projects/settings/user_changes_default_branch_spec.rb29
-rw-r--r--spec/features/projects/settings/user_manages_group_links_spec.rb6
-rw-r--r--spec/features/projects/settings/user_tags_project_spec.rb14
-rw-r--r--spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb61
-rw-r--r--spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb231
-rw-r--r--spec/features/projects/tags/user_views_tags_spec.rb69
-rw-r--r--spec/features/projects/tree/create_directory_spec.rb2
-rw-r--r--spec/features/projects/tree/create_file_spec.rb2
-rw-r--r--spec/features/projects/tree/tree_show_spec.rb16
-rw-r--r--spec/features/projects/user_creates_project_spec.rb5
-rw-r--r--spec/features/projects/view_on_env_spec.rb2
-rw-r--r--spec/features/projects/wiki/markdown_preview_spec.rb28
-rw-r--r--spec/features/projects/wiki/user_creates_wiki_page_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_deletes_wiki_page_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_updates_wiki_page_spec.rb26
-rw-r--r--spec/features/projects/wiki/user_views_wiki_empty_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_views_wiki_page_spec.rb33
-rw-r--r--spec/features/projects_spec.rb91
-rw-r--r--spec/features/runners_spec.rb4
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb2
-rw-r--r--spec/features/search/user_uses_header_search_field_spec.rb16
-rw-r--r--spec/features/search/user_uses_search_filters_spec.rb4
-rw-r--r--spec/features/security/dashboard_access_spec.rb14
-rw-r--r--spec/features/snippets/notes_on_personal_snippets_spec.rb2
-rw-r--r--spec/features/snippets/show_spec.rb44
-rw-r--r--spec/features/snippets/user_sees_breadcrumb_links.rb17
-rw-r--r--spec/features/u2f_spec.rb14
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_group_spec.rb2
-rw-r--r--spec/features/usage_stats_consent_spec.rb45
-rw-r--r--spec/features/user_sorts_things_spec.rb2
-rw-r--r--spec/features/users/login_spec.rb24
-rw-r--r--spec/features/users/overview_spec.rb150
-rw-r--r--spec/features/users/show_spec.rb2
-rw-r--r--spec/finders/admin/runners_finder_spec.rb73
-rw-r--r--spec/finders/applications_finder_spec.rb22
-rw-r--r--spec/finders/autocomplete/group_finder_spec.rb58
-rw-r--r--spec/finders/autocomplete/move_to_project_finder_spec.rb (renamed from spec/finders/move_to_project_finder_spec.rb)64
-rw-r--r--spec/finders/autocomplete/project_finder_spec.rb55
-rw-r--r--spec/finders/autocomplete/users_finder_spec.rb (renamed from spec/finders/autocomplete_users_finder_spec.rb)2
-rw-r--r--spec/finders/awarded_emoji_finder_spec.rb25
-rw-r--r--spec/finders/branches_finder_spec.rb33
-rw-r--r--spec/finders/contributed_projects_finder_spec.rb10
-rw-r--r--spec/finders/environments_finder_spec.rb16
-rw-r--r--spec/finders/fork_projects_finder_spec.rb15
-rw-r--r--spec/finders/group_descendants_finder_spec.rb16
-rw-r--r--spec/finders/group_labels_finder_spec.rb42
-rw-r--r--spec/finders/issues_finder_spec.rb72
-rw-r--r--spec/finders/labels_finder_spec.rb10
-rw-r--r--spec/finders/license_template_finder_spec.rb49
-rw-r--r--spec/finders/merge_requests_finder_spec.rb84
-rw-r--r--spec/finders/notes_finder_spec.rb29
-rw-r--r--spec/finders/pending_todos_finder_spec.rb63
-rw-r--r--spec/finders/personal_access_tokens_finder_spec.rb8
-rw-r--r--spec/finders/pipelines_finder_spec.rb2
-rw-r--r--spec/finders/projects_finder_spec.rb7
-rw-r--r--spec/finders/snippets_finder_spec.rb45
-rw-r--r--spec/finders/template_finder_spec.rb51
-rw-r--r--spec/finders/todos_finder_spec.rb17
-rw-r--r--spec/finders/user_finder_spec.rb179
-rw-r--r--spec/finders/user_recent_events_finder_spec.rb46
-rw-r--r--spec/finders/users_finder_spec.rb6
-rw-r--r--spec/finders/users_with_pending_todos_finder_spec.rb19
-rw-r--r--spec/fixtures/api/schemas/deployment.json97
-rw-r--r--spec/fixtures/api/schemas/entities/commit.json26
-rw-r--r--spec/fixtures/api/schemas/entities/diff_line.json14
-rw-r--r--spec/fixtures/api/schemas/entities/diff_line_parallel.json11
-rw-r--r--spec/fixtures/api/schemas/entities/diff_viewer.json8
-rw-r--r--spec/fixtures/api/schemas/entities/issue_board.json39
-rw-r--r--spec/fixtures/api/schemas/entities/merge_request_widget.json1
-rw-r--r--spec/fixtures/api/schemas/entities/note_user_entity.json21
-rw-r--r--spec/fixtures/api/schemas/entities/user.json12
-rw-r--r--spec/fixtures/api/schemas/environment.json38
-rw-r--r--spec/fixtures/api/schemas/http_method.json5
-rw-r--r--spec/fixtures/api/schemas/issue.json2
-rw-r--r--spec/fixtures/api/schemas/job.json24
-rw-r--r--spec/fixtures/api/schemas/job/artifact.json11
-rw-r--r--spec/fixtures/api/schemas/job/deployment_status.json25
-rw-r--r--spec/fixtures/api/schemas/job/job.json35
-rw-r--r--spec/fixtures/api/schemas/job/job_details.json24
-rw-r--r--spec/fixtures/api/schemas/job/runner.json17
-rw-r--r--spec/fixtures/api/schemas/job/runners.json12
-rw-r--r--spec/fixtures/api/schemas/job/trigger.json28
-rw-r--r--spec/fixtures/api/schemas/pipeline_stage.json9
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/branch.json2
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/license.json30
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/merge_requests.json26
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/template.json12
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/template_list.json15
-rw-r--r--spec/fixtures/api/schemas/status/action.json22
-rw-r--r--spec/fixtures/api/schemas/status/ci_detailed_status.json (renamed from spec/fixtures/api/schemas/ci_detailed_status.json)6
-rw-r--r--spec/fixtures/api/schemas/status/illustration.json19
-rw-r--r--spec/fixtures/api/schemas/types/nullable_string.json6
-rw-r--r--spec/fixtures/authentication/saml2_response.xml56
-rw-r--r--spec/fixtures/codequality/codequality.json1
-rw-r--r--spec/fixtures/codequality/codequality.json.gzbin0 -> 101478 bytes
-rw-r--r--spec/fixtures/emails/merge_request_multiple_patches.eml181
-rw-r--r--spec/fixtures/emails/merge_request_with_conflicting_patch.eml45
-rw-r--r--spec/fixtures/emails/merge_request_with_patch_and_target_branch.eml44
-rw-r--r--spec/fixtures/emails/valid_merge_request_with_patch.eml151
-rw-r--r--spec/fixtures/git-cheat-sheet.pdf130423
-rw-r--r--spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml10
-rw-r--r--spec/fixtures/patchfiles/0001-A-commit-from-a-patch.patch19
-rw-r--r--spec/fixtures/patchfiles/0001-This-does-not-apply-to-the-feature-branch.patch23
-rw-r--r--spec/fixtures/security-reports/feature-branch.zipbin0 -> 7163 bytes
-rw-r--r--spec/fixtures/security-reports/feature-branch/gl-container-scanning-report.json18
-rw-r--r--spec/fixtures/security-reports/feature-branch/gl-dast-report.json40
-rw-r--r--spec/fixtures/security-reports/feature-branch/gl-dependency-scanning-report.json46
-rw-r--r--spec/fixtures/security-reports/feature-branch/gl-license-management-report.json242
-rw-r--r--spec/fixtures/security-reports/feature-branch/gl-sast-report.json944
-rw-r--r--spec/fixtures/security-reports/master.zipbin0 -> 6710 bytes
-rw-r--r--spec/fixtures/security-reports/master/gl-container-scanning-report.json18
-rw-r--r--spec/fixtures/security-reports/master/gl-dast-report.json40
-rw-r--r--spec/fixtures/security-reports/master/gl-dependency-scanning-report.json35
-rw-r--r--spec/fixtures/security-reports/master/gl-license-management-report.json150
-rw-r--r--spec/fixtures/security-reports/master/gl-sast-report.json944
-rw-r--r--spec/fixtures/ssh_host_example_key.pub2
-rw-r--r--spec/fixtures/trace/sample_trace24
-rw-r--r--spec/fixtures/valid.po3
-rw-r--r--spec/graphql/types/permission_types/project_spec.rb2
-rw-r--r--spec/helpers/application_helper_spec.rb63
-rw-r--r--spec/helpers/auth_helper_spec.rb10
-rw-r--r--spec/helpers/auto_devops_helper_spec.rb10
-rw-r--r--spec/helpers/avatars_helper_spec.rb24
-rw-r--r--spec/helpers/blob_helper_spec.rb58
-rw-r--r--spec/helpers/button_helper_spec.rb26
-rw-r--r--spec/helpers/commits_helper_spec.rb2
-rw-r--r--spec/helpers/events_helper_spec.rb69
-rw-r--r--spec/helpers/icons_helper_spec.rb20
-rw-r--r--spec/helpers/import_helper_spec.rb10
-rw-r--r--spec/helpers/issuables_helper_spec.rb2
-rw-r--r--spec/helpers/labels_helper_spec.rb25
-rw-r--r--spec/helpers/markup_helper_spec.rb69
-rw-r--r--spec/helpers/namespaces_helper_spec.rb5
-rw-r--r--spec/helpers/preferences_helper_spec.rb7
-rw-r--r--spec/helpers/profiles_helper_spec.rb34
-rw-r--r--spec/helpers/projects_helper_spec.rb12
-rw-r--r--spec/helpers/search_helper_spec.rb35
-rw-r--r--spec/helpers/storage_health_helper_spec.rb20
-rw-r--r--spec/helpers/submodule_helper_spec.rb75
-rw-r--r--spec/helpers/tab_helper_spec.rb76
-rw-r--r--spec/helpers/time_helper_spec.rb23
-rw-r--r--spec/helpers/tree_helper_spec.rb45
-rw-r--r--spec/helpers/users_helper_spec.rb24
-rw-r--r--spec/helpers/visibility_level_helper_spec.rb12
-rw-r--r--spec/javascripts/.eslintrc.yml2
-rw-r--r--spec/javascripts/ajax_loading_spinner_spec.js9
-rw-r--r--spec/javascripts/api_spec.js64
-rw-r--r--spec/javascripts/avatar_helper_spec.js2
-rw-r--r--spec/javascripts/awards_handler_spec.js692
-rw-r--r--spec/javascripts/badges/components/badge_form_spec.js153
-rw-r--r--spec/javascripts/badges/components/badge_list_row_spec.js5
-rw-r--r--spec/javascripts/badges/components/badge_list_spec.js3
-rw-r--r--spec/javascripts/badges/components/badge_settings_spec.js9
-rw-r--r--spec/javascripts/badges/components/badge_spec.js3
-rw-r--r--spec/javascripts/badges/dummy_badge.js3
-rw-r--r--spec/javascripts/badges/store/actions_spec.js7
-rw-r--r--spec/javascripts/behaviors/autosize_spec.js1
-rw-r--r--spec/javascripts/behaviors/bind_in_out_spec.js113
-rw-r--r--spec/javascripts/behaviors/copy_as_gfm_spec.js6
-rw-r--r--spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js4
-rw-r--r--spec/javascripts/behaviors/markdown/highlight_current_user_spec.js55
-rw-r--r--spec/javascripts/behaviors/quick_submit_spec.js19
-rw-r--r--spec/javascripts/behaviors/requires_input_spec.js30
-rw-r--r--spec/javascripts/behaviors/secret_values_spec.js36
-rw-r--r--spec/javascripts/behaviors/shortcuts/shortcuts_issuable_spec.js (renamed from spec/javascripts/shortcuts_issuable_spec.js)5
-rw-r--r--spec/javascripts/blob/3d_viewer/mesh_object_spec.js20
-rw-r--r--spec/javascripts/blob/balsamiq/balsamiq_viewer_integration_spec.js14
-rw-r--r--spec/javascripts/blob/balsamiq/balsamiq_viewer_spec.js18
-rw-r--r--spec/javascripts/blob/blob_file_dropzone_spec.js2
-rw-r--r--spec/javascripts/blob/blob_fork_suggestion_spec.js5
-rw-r--r--spec/javascripts/blob/notebook/index_spec.js86
-rw-r--r--spec/javascripts/blob/pdf/index_spec.js32
-rw-r--r--spec/javascripts/blob/sketch/index_spec.js108
-rw-r--r--spec/javascripts/blob/viewer/index_spec.js48
-rw-r--r--spec/javascripts/boards/board_blank_state_spec.js84
-rw-r--r--spec/javascripts/boards/board_card_spec.js65
-rw-r--r--spec/javascripts/boards/board_list_spec.js100
-rw-r--r--spec/javascripts/boards/board_new_issue_spec.js35
-rw-r--r--spec/javascripts/boards/boards_store_spec.js133
-rw-r--r--spec/javascripts/boards/components/board_spec.js41
-rw-r--r--spec/javascripts/boards/components/issue_due_date_spec.js64
-rw-r--r--spec/javascripts/boards/components/issue_time_estimate_spec.js40
-rw-r--r--spec/javascripts/boards/issue_card_spec.js26
-rw-r--r--spec/javascripts/boards/issue_spec.js52
-rw-r--r--spec/javascripts/boards/list_spec.js107
-rw-r--r--spec/javascripts/boards/mock_data.js5
-rw-r--r--spec/javascripts/boards/modal_store_spec.js2
-rw-r--r--spec/javascripts/boards/utils/query_data_spec.js27
-rw-r--r--spec/javascripts/bootstrap_jquery_spec.js74
-rw-r--r--spec/javascripts/bootstrap_linked_tabs_spec.js87
-rw-r--r--spec/javascripts/breakpoints_spec.js6
-rw-r--r--spec/javascripts/ci_variable_list/ajax_variable_list_spec.js66
-rw-r--r--spec/javascripts/ci_variable_list/ci_variable_list_spec.js26
-rw-r--r--spec/javascripts/ci_variable_list/native_form_variable_list_spec.js10
-rw-r--r--spec/javascripts/close_reopen_report_toggle_spec.js10
-rw-r--r--spec/javascripts/clusters/clusters_bundle_spec.js213
-rw-r--r--spec/javascripts/clusters/components/application_row_spec.js41
-rw-r--r--spec/javascripts/clusters/components/applications_spec.js12
-rw-r--r--spec/javascripts/clusters/services/mock_data.js128
-rw-r--r--spec/javascripts/clusters/stores/clusters_store_spec.js20
-rw-r--r--spec/javascripts/collapsed_sidebar_todo_spec.js50
-rw-r--r--spec/javascripts/comment_type_toggle_spec.js114
-rw-r--r--spec/javascripts/commit/commit_pipeline_status_component_spec.js35
-rw-r--r--spec/javascripts/commit/pipelines/pipelines_spec.js37
-rw-r--r--spec/javascripts/commit_merge_requests_spec.js11
-rw-r--r--spec/javascripts/create_item_dropdown_spec.js49
-rw-r--r--spec/javascripts/create_merge_request_dropdown_spec.js1
-rw-r--r--spec/javascripts/cycle_analytics/banner_spec.js23
-rw-r--r--spec/javascripts/datetime_utility_spec.js170
-rw-r--r--spec/javascripts/deploy_keys/components/app_spec.js7
-rw-r--r--spec/javascripts/deploy_keys/components/key_spec.js3
-rw-r--r--spec/javascripts/diff_comments_store_spec.js12
-rw-r--r--spec/javascripts/diffs/components/app_spec.js83
-rw-r--r--spec/javascripts/diffs/components/changed_files_spec.js105
-rw-r--r--spec/javascripts/diffs/components/commit_item_spec.js164
-rw-r--r--spec/javascripts/diffs/components/commit_widget_spec.js24
-rw-r--r--spec/javascripts/diffs/components/compare_versions_spec.js126
-rw-r--r--spec/javascripts/diffs/components/diff_content_spec.js82
-rw-r--r--spec/javascripts/diffs/components/diff_discussions_spec.js78
-rw-r--r--spec/javascripts/diffs/components/diff_file_header_spec.js126
-rw-r--r--spec/javascripts/diffs/components/diff_file_spec.js66
-rw-r--r--spec/javascripts/diffs/components/diff_gutter_avatars_spec.js2
-rw-r--r--spec/javascripts/diffs/components/diff_line_gutter_content_spec.js58
-rw-r--r--spec/javascripts/diffs/components/diff_line_note_form_spec.js39
-rw-r--r--spec/javascripts/diffs/components/file_row_stats_spec.js33
-rw-r--r--spec/javascripts/diffs/components/image_diff_overlay_spec.js146
-rw-r--r--spec/javascripts/diffs/components/inline_diff_view_spec.js13
-rw-r--r--spec/javascripts/diffs/components/parallel_diff_view_spec.js10
-rw-r--r--spec/javascripts/diffs/components/tree_list_spec.js188
-rw-r--r--spec/javascripts/diffs/create_diffs_store.js15
-rw-r--r--spec/javascripts/diffs/mock_data/diff_discussions.js47
-rw-r--r--spec/javascripts/diffs/mock_data/diff_file.js259
-rw-r--r--spec/javascripts/diffs/mock_data/diff_with_commit.js7
-rw-r--r--spec/javascripts/diffs/mock_data/merge_request_diffs.js42
-rw-r--r--spec/javascripts/diffs/store/actions_spec.js490
-rw-r--r--spec/javascripts/diffs/store/getters_spec.js135
-rw-r--r--spec/javascripts/diffs/store/mutations_spec.js286
-rw-r--r--spec/javascripts/diffs/store/utils_spec.js438
-rw-r--r--spec/javascripts/dirty_submit/dirty_submit_collection_spec.js29
-rw-r--r--spec/javascripts/dirty_submit/dirty_submit_factory_spec.js18
-rw-r--r--spec/javascripts/dirty_submit/dirty_submit_form_spec.js36
-rw-r--r--spec/javascripts/dirty_submit/helper.js31
-rw-r--r--spec/javascripts/droplab/drop_down_spec.js251
-rw-r--r--spec/javascripts/droplab/hook_spec.js34
-rw-r--r--spec/javascripts/droplab/plugins/ajax_filter_spec.js10
-rw-r--r--spec/javascripts/droplab/plugins/ajax_spec.js7
-rw-r--r--spec/javascripts/droplab/plugins/input_setter_spec.js100
-rw-r--r--spec/javascripts/dropzone_input_spec.js66
-rw-r--r--spec/javascripts/emoji_spec.js62
-rw-r--r--spec/javascripts/environments/emtpy_state_spec.js23
-rw-r--r--spec/javascripts/environments/environment_actions_spec.js123
-rw-r--r--spec/javascripts/environments/environment_item_spec.js56
-rw-r--r--spec/javascripts/environments/environments_app_spec.js104
-rw-r--r--spec/javascripts/environments/environments_store_spec.js15
-rw-r--r--spec/javascripts/environments/folder/environments_folder_view_spec.js104
-rw-r--r--spec/javascripts/feature_highlight/feature_highlight_helper_spec.js17
-rw-r--r--spec/javascripts/feature_highlight/feature_highlight_spec.js8
-rw-r--r--spec/javascripts/filtered_search/components/recent_searches_dropdown_content_spec.js32
-rw-r--r--spec/javascripts/filtered_search/dropdown_user_spec.js13
-rw-r--r--spec/javascripts/filtered_search/dropdown_utils_spec.js117
-rw-r--r--spec/javascripts/filtered_search/filtered_search_manager_spec.js52
-rw-r--r--spec/javascripts/filtered_search/filtered_search_token_keys_spec.js105
-rw-r--r--spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js42
-rw-r--r--spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js258
-rw-r--r--spec/javascripts/filtered_search/recent_searches_root_spec.js2
-rw-r--r--spec/javascripts/filtered_search/services/recent_searches_service_spec.js27
-rw-r--r--spec/javascripts/filtered_search/stores/recent_searches_store_spec.js10
-rw-r--r--spec/javascripts/fixtures/admin_users.rb29
-rw-r--r--spec/javascripts/fixtures/application_settings.rb34
-rw-r--r--spec/javascripts/fixtures/groups.rb10
-rw-r--r--spec/javascripts/fixtures/jobs.rb23
-rw-r--r--spec/javascripts/fixtures/merge_requests_diffs.rb14
-rw-r--r--spec/javascripts/fixtures/projects.rb10
-rw-r--r--spec/javascripts/flash_spec.js146
-rw-r--r--spec/javascripts/fly_out_nav_spec.js127
-rw-r--r--spec/javascripts/frequent_items/components/app_spec.js3
-rw-r--r--spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js6
-rw-r--r--spec/javascripts/frequent_items/components/frequent_items_list_spec.js6
-rw-r--r--spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js1
-rw-r--r--spec/javascripts/gfm_auto_complete_spec.js100
-rw-r--r--spec/javascripts/gl_dropdown_spec.js106
-rw-r--r--spec/javascripts/gl_field_errors_spec.js41
-rw-r--r--spec/javascripts/gl_form_spec.js7
-rw-r--r--spec/javascripts/gpg_badges_spec.js2
-rw-r--r--spec/javascripts/graphs/stat_graph_contributors_graph_spec.js106
-rw-r--r--spec/javascripts/graphs/stat_graph_contributors_spec.js4
-rw-r--r--spec/javascripts/graphs/stat_graph_contributors_util_spec.js245
-rw-r--r--spec/javascripts/groups/components/app_spec.js130
-rw-r--r--spec/javascripts/groups/components/group_folder_spec.js3
-rw-r--r--spec/javascripts/groups/components/group_item_spec.js15
-rw-r--r--spec/javascripts/groups/components/groups_spec.js17
-rw-r--r--spec/javascripts/groups/components/item_actions_spec.js9
-rw-r--r--spec/javascripts/groups/components/item_caret_spec.js3
-rw-r--r--spec/javascripts/groups/components/item_stats_spec.js25
-rw-r--r--spec/javascripts/groups/components/item_stats_value_spec.js6
-rw-r--r--spec/javascripts/groups/components/item_type_icon_spec.js5
-rw-r--r--spec/javascripts/groups/mock_data.js3
-rw-r--r--spec/javascripts/groups/service/groups_service_spec.js3
-rw-r--r--spec/javascripts/groups/store/groups_store_spec.js29
-rw-r--r--spec/javascripts/header_spec.js5
-rw-r--r--spec/javascripts/helpers/class_spec_helper_spec.js6
-rw-r--r--spec/javascripts/helpers/locale_helper.js2
-rw-r--r--spec/javascripts/helpers/set_timeout_promise_helper.js7
-rw-r--r--spec/javascripts/helpers/user_mock_data_helper.js14
-rw-r--r--spec/javascripts/helpers/vue_mount_component_helper.js10
-rw-r--r--spec/javascripts/helpers/vue_resource_helper.js3
-rw-r--r--spec/javascripts/ide/components/branches/item_spec.js5
-rw-r--r--spec/javascripts/ide/components/branches/search_list_spec.js5
-rw-r--r--spec/javascripts/ide/components/commit_sidebar/list_item_spec.js6
-rw-r--r--spec/javascripts/ide/components/commit_sidebar/message_field_spec.js23
-rw-r--r--spec/javascripts/ide/components/commit_sidebar/stage_button_spec.js4
-rw-r--r--spec/javascripts/ide/components/file_finder/index_spec.js9
-rw-r--r--spec/javascripts/ide/components/file_row_extra_spec.js159
-rw-r--r--spec/javascripts/ide/components/file_templates/bar_spec.js117
-rw-r--r--spec/javascripts/ide/components/file_templates/dropdown_spec.js201
-rw-r--r--spec/javascripts/ide/components/ide_spec.js9
-rw-r--r--spec/javascripts/ide/components/ide_status_bar_spec.js10
-rw-r--r--spec/javascripts/ide/components/jobs/detail_spec.js3
-rw-r--r--spec/javascripts/ide/components/merge_requests/item_spec.js5
-rw-r--r--spec/javascripts/ide/components/merge_requests/list_spec.js5
-rw-r--r--spec/javascripts/ide/components/new_dropdown/index_spec.js1
-rw-r--r--spec/javascripts/ide/components/new_dropdown/upload_spec.js57
-rw-r--r--spec/javascripts/ide/components/panes/right_spec.js24
-rw-r--r--spec/javascripts/ide/components/preview/clientside_spec.js3
-rw-r--r--spec/javascripts/ide/components/repo_commit_section_spec.js59
-rw-r--r--spec/javascripts/ide/components/repo_editor_spec.js16
-rw-r--r--spec/javascripts/ide/components/repo_file_spec.js124
-rw-r--r--spec/javascripts/ide/components/repo_loading_file_spec.js63
-rw-r--r--spec/javascripts/ide/components/repo_tab_spec.js4
-rw-r--r--spec/javascripts/ide/components/shared/tokened_input_spec.js5
-rw-r--r--spec/javascripts/ide/helpers.js4
-rw-r--r--spec/javascripts/ide/stores/actions/file_spec.js35
-rw-r--r--spec/javascripts/ide/stores/actions/merge_request_spec.js36
-rw-r--r--spec/javascripts/ide/stores/actions/project_spec.js5
-rw-r--r--spec/javascripts/ide/stores/actions/tree_spec.js1
-rw-r--r--spec/javascripts/ide/stores/actions_spec.js28
-rw-r--r--spec/javascripts/ide/stores/modules/branches/actions_spec.js1
-rw-r--r--spec/javascripts/ide/stores/modules/commit/actions_spec.js28
-rw-r--r--spec/javascripts/ide/stores/modules/file_templates/actions_spec.js441
-rw-r--r--spec/javascripts/ide/stores/modules/file_templates/getters_spec.js59
-rw-r--r--spec/javascripts/ide/stores/modules/file_templates/mutations_spec.js69
-rw-r--r--spec/javascripts/ide/stores/modules/pane/actions_spec.js66
-rw-r--r--spec/javascripts/ide/stores/modules/pane/getters_spec.js55
-rw-r--r--spec/javascripts/ide/stores/modules/pane/mutations_spec.js42
-rw-r--r--spec/javascripts/ide/stores/modules/pipelines/actions_spec.js12
-rw-r--r--spec/javascripts/ide/stores/mutations/merge_request_spec.js2
-rw-r--r--spec/javascripts/ide/stores/mutations_spec.js35
-rw-r--r--spec/javascripts/image_diff/helpers/badge_helper_spec.js1
-rw-r--r--spec/javascripts/image_diff/helpers/comment_indicator_helper_spec.js7
-rw-r--r--spec/javascripts/image_diff/helpers/dom_helper_spec.js2
-rw-r--r--spec/javascripts/image_diff/helpers/utils_helper_spec.js18
-rw-r--r--spec/javascripts/image_diff/image_badge_spec.js30
-rw-r--r--spec/javascripts/image_diff/image_diff_spec.js20
-rw-r--r--spec/javascripts/image_diff/init_discussion_tab_spec.js15
-rw-r--r--spec/javascripts/image_diff/replaced_image_diff_spec.js95
-rw-r--r--spec/javascripts/importer_status_spec.js64
-rw-r--r--spec/javascripts/integrations/integration_settings_form_spec.js82
-rw-r--r--spec/javascripts/issuable_spec.js5
-rw-r--r--spec/javascripts/issue_show/components/app_spec.js275
-rw-r--r--spec/javascripts/issue_show/components/description_spec.js49
-rw-r--r--spec/javascripts/issue_show/components/edit_actions_spec.js72
-rw-r--r--spec/javascripts/issue_show/components/fields/description_spec.js24
-rw-r--r--spec/javascripts/issue_show/components/fields/description_template_spec.js16
-rw-r--r--spec/javascripts/issue_show/components/fields/title_spec.js12
-rw-r--r--spec/javascripts/issue_show/components/form_spec.js23
-rw-r--r--spec/javascripts/issue_show/components/title_spec.js21
-rw-r--r--spec/javascripts/issue_show/index_spec.js19
-rw-r--r--spec/javascripts/issue_spec.js20
-rw-r--r--spec/javascripts/job_spec.js314
-rw-r--r--spec/javascripts/jobs/components/artifacts_block_spec.js120
-rw-r--r--spec/javascripts/jobs/components/commit_block_spec.js88
-rw-r--r--spec/javascripts/jobs/components/empty_state_spec.js93
-rw-r--r--spec/javascripts/jobs/components/environments_block_spec.js149
-rw-r--r--spec/javascripts/jobs/components/erased_block_spec.js56
-rw-r--r--spec/javascripts/jobs/components/job_app_spec.js639
-rw-r--r--spec/javascripts/jobs/components/job_container_item_spec.js99
-rw-r--r--spec/javascripts/jobs/components/job_log_controllers_spec.js208
-rw-r--r--spec/javascripts/jobs/components/job_log_spec.js65
-rw-r--r--spec/javascripts/jobs/components/jobs_container_spec.js131
-rw-r--r--spec/javascripts/jobs/components/sidebar_detail_row_spec.js (renamed from spec/javascripts/jobs/sidebar_detail_row_spec.js)6
-rw-r--r--spec/javascripts/jobs/components/sidebar_spec.js189
-rw-r--r--spec/javascripts/jobs/components/stages_dropdown_spec.js59
-rw-r--r--spec/javascripts/jobs/components/stuck_block_spec.js (renamed from spec/javascripts/jobs/stuck_block_spec.js)2
-rw-r--r--spec/javascripts/jobs/components/trigger_block_spec.js76
-rw-r--r--spec/javascripts/jobs/header_spec.js98
-rw-r--r--spec/javascripts/jobs/job_details_mediator_spec.js39
-rw-r--r--spec/javascripts/jobs/job_store_spec.js26
-rw-r--r--spec/javascripts/jobs/mixins/delayed_job_mixin_spec.js93
-rw-r--r--spec/javascripts/jobs/mock_data.js1053
-rw-r--r--spec/javascripts/jobs/sidebar_details_block_spec.js139
-rw-r--r--spec/javascripts/jobs/store/actions_spec.js512
-rw-r--r--spec/javascripts/jobs/store/getters_spec.js212
-rw-r--r--spec/javascripts/jobs/store/helpers.js6
-rw-r--r--spec/javascripts/jobs/store/mutations_spec.js230
-rw-r--r--spec/javascripts/labels_issue_sidebar_spec.js134
-rw-r--r--spec/javascripts/labels_select_spec.js14
-rw-r--r--spec/javascripts/landing_spec.js70
-rw-r--r--spec/javascripts/lazy_loader_spec.js193
-rw-r--r--spec/javascripts/lib/utils/accessor_spec.js14
-rw-r--r--spec/javascripts/lib/utils/ajax_cache_spec.js66
-rw-r--r--spec/javascripts/lib/utils/common_utils_spec.js260
-rw-r--r--spec/javascripts/lib/utils/csrf_token_spec.js5
-rw-r--r--spec/javascripts/lib/utils/datefix_spec.js27
-rw-r--r--spec/javascripts/lib/utils/datetime_utility_spec.js378
-rw-r--r--spec/javascripts/lib/utils/dom_utils_spec.js2
-rw-r--r--spec/javascripts/lib/utils/mock_data.js9
-rw-r--r--spec/javascripts/lib/utils/navigation_utility_spec.js (renamed from spec/javascripts/shortcuts_dashboard_navigation_spec.js)2
-rw-r--r--spec/javascripts/lib/utils/number_utility_spec.js12
-rw-r--r--spec/javascripts/lib/utils/poll_spec.js28
-rw-r--r--spec/javascripts/lib/utils/sticky_spec.js29
-rw-r--r--spec/javascripts/lib/utils/text_markdown_spec.js173
-rw-r--r--spec/javascripts/lib/utils/text_utility_spec.js8
-rw-r--r--spec/javascripts/lib/utils/users_cache_spec.js52
-rw-r--r--spec/javascripts/line_highlighter_spec.js417
-rw-r--r--spec/javascripts/locale/ensure_single_line_spec.js38
-rw-r--r--spec/javascripts/merge_request_spec.js185
-rw-r--r--spec/javascripts/merge_request_tabs_spec.js8
-rw-r--r--spec/javascripts/mini_pipeline_graph_dropdown_spec.js12
-rw-r--r--spec/javascripts/monitoring/dashboard_spec.js96
-rw-r--r--spec/javascripts/monitoring/dashboard_state_spec.js28
-rw-r--r--spec/javascripts/monitoring/graph/deployment_spec.js6
-rw-r--r--spec/javascripts/monitoring/graph/flag_spec.js35
-rw-r--r--spec/javascripts/monitoring/graph/legend_spec.js2
-rw-r--r--spec/javascripts/monitoring/graph/track_info_spec.js2
-rw-r--r--spec/javascripts/monitoring/graph/track_line_spec.js2
-rw-r--r--spec/javascripts/monitoring/graph_path_spec.js6
-rw-r--r--spec/javascripts/monitoring/graph_spec.js24
-rw-r--r--spec/javascripts/monitoring/mock_data.js1
-rw-r--r--spec/javascripts/monitoring/monitoring_store_spec.js4
-rw-r--r--spec/javascripts/monitoring/utils/multiple_time_series_spec.js2
-rw-r--r--spec/javascripts/new_branch_spec.js355
-rw-r--r--spec/javascripts/notebook/cells/code_spec.js4
-rw-r--r--spec/javascripts/notebook/cells/markdown_spec.js30
-rw-r--r--spec/javascripts/notebook/cells/output/html_sanitize_tests.js8
-rw-r--r--spec/javascripts/notebook/cells/output/html_spec.js2
-rw-r--r--spec/javascripts/notebook/cells/output/index_spec.js14
-rw-r--r--spec/javascripts/notebook/cells/prompt_spec.js4
-rw-r--r--spec/javascripts/notebook/index_spec.js10
-rw-r--r--spec/javascripts/notes/components/comment_form_spec.js12
-rw-r--r--spec/javascripts/notes/components/diff_with_note_spec.js7
-rw-r--r--spec/javascripts/notes/components/discussion_filter_spec.js86
-rw-r--r--spec/javascripts/notes/components/note_actions_spec.js20
-rw-r--r--spec/javascripts/notes/components/note_app_spec.js9
-rw-r--r--spec/javascripts/notes/components/note_awards_list_spec.js4
-rw-r--r--spec/javascripts/notes/components/note_form_spec.js20
-rw-r--r--spec/javascripts/notes/components/note_header_spec.js14
-rw-r--r--spec/javascripts/notes/components/noteable_discussion_spec.js39
-rw-r--r--spec/javascripts/notes/components/noteable_note_spec.js1
-rw-r--r--spec/javascripts/notes/components/toggle_replies_widget_spec.js78
-rw-r--r--spec/javascripts/notes/helpers.js2
-rw-r--r--spec/javascripts/notes/mock_data.js87
-rw-r--r--spec/javascripts/notes/stores/actions_spec.js208
-rw-r--r--spec/javascripts/notes/stores/collapse_utils_spec.js13
-rw-r--r--spec/javascripts/notes/stores/getters_spec.js1
-rw-r--r--spec/javascripts/notes/stores/mutation_spec.js98
-rw-r--r--spec/javascripts/notes_spec.js1593
-rw-r--r--spec/javascripts/oauth_remember_me_spec.js9
-rw-r--r--spec/javascripts/pager_spec.js5
-rw-r--r--spec/javascripts/pages/admin/abuse_reports/abuse_reports_spec.js14
-rw-r--r--spec/javascripts/pages/admin/application_settings/account_and_limits_spec.js36
-rw-r--r--spec/javascripts/pages/admin/jobs/index/components/stop_jobs_modal_spec.js20
-rw-r--r--spec/javascripts/pages/admin/users/new/index_spec.js43
-rw-r--r--spec/javascripts/pages/labels/components/promote_label_modal_spec.js36
-rw-r--r--spec/javascripts/pages/milestones/shared/components/delete_milestone_modal_spec.js43
-rw-r--r--spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js36
-rw-r--r--spec/javascripts/pages/profiles/show/emoji_menu_spec.js2
-rw-r--r--spec/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js74
-rw-r--r--spec/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js8
-rw-r--r--spec/javascripts/pdf/index_spec.js6
-rw-r--r--spec/javascripts/pdf/page_spec.js63
-rw-r--r--spec/javascripts/performance_bar/components/detailed_metric_spec.js8
-rw-r--r--spec/javascripts/performance_bar/components/request_selector_spec.js3
-rw-r--r--spec/javascripts/performance_bar/index_spec.js5
-rw-r--r--spec/javascripts/performance_bar/services/performance_bar_service_spec.js68
-rw-r--r--spec/javascripts/pipelines/blank_state_spec.js14
-rw-r--r--spec/javascripts/pipelines/empty_state_spec.js27
-rw-r--r--spec/javascripts/pipelines/graph/action_component_spec.js18
-rw-r--r--spec/javascripts/pipelines/graph/graph_component_spec.js8
-rw-r--r--spec/javascripts/pipelines/graph/job_group_dropdown_spec.js (renamed from spec/javascripts/pipelines/graph/dropdown_job_component_spec.js)26
-rw-r--r--spec/javascripts/pipelines/graph/job_item_spec.js (renamed from spec/javascripts/pipelines/graph/job_component_spec.js)85
-rw-r--r--spec/javascripts/pipelines/graph/stage_column_component_spec.js17
-rw-r--r--spec/javascripts/pipelines/header_component_spec.js9
-rw-r--r--spec/javascripts/pipelines/nav_controls_spec.js12
-rw-r--r--spec/javascripts/pipelines/pipeline_store_spec.js1
-rw-r--r--spec/javascripts/pipelines/pipeline_url_spec.js8
-rw-r--r--spec/javascripts/pipelines/pipelines_actions_spec.js110
-rw-r--r--spec/javascripts/pipelines/pipelines_artifacts_spec.js16
-rw-r--r--spec/javascripts/pipelines/pipelines_spec.js204
-rw-r--r--spec/javascripts/pipelines/pipelines_store_spec.js5
-rw-r--r--spec/javascripts/pipelines/pipelines_table_row_spec.js22
-rw-r--r--spec/javascripts/pipelines/pipelines_table_spec.js20
-rw-r--r--spec/javascripts/pipelines/stage_spec.js16
-rw-r--r--spec/javascripts/pipelines_spec.js4
-rw-r--r--spec/javascripts/polyfills/element_spec.js2
-rw-r--r--spec/javascripts/pretty_time_spec.js133
-rw-r--r--spec/javascripts/profile/account/components/delete_account_modal_spec.js16
-rw-r--r--spec/javascripts/profile/account/components/update_username_spec.js7
-rw-r--r--spec/javascripts/project_select_combo_button_spec.js56
-rw-r--r--spec/javascripts/projects/gke_cluster_dropdowns/components/gke_machine_type_dropdown_spec.js22
-rw-r--r--spec/javascripts/projects/gke_cluster_dropdowns/components/gke_project_id_dropdown_spec.js62
-rw-r--r--spec/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown_spec.js22
-rw-r--r--spec/javascripts/projects/project_new_spec.js35
-rw-r--r--spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js18
-rw-r--r--spec/javascripts/raven/raven_config_spec.js2
-rw-r--r--spec/javascripts/read_more_spec.js23
-rw-r--r--spec/javascripts/registry/components/app_spec.js53
-rw-r--r--spec/javascripts/registry/components/collapsible_container_spec.js16
-rw-r--r--spec/javascripts/registry/components/table_registry_spec.js14
-rw-r--r--spec/javascripts/registry/getters_spec.js41
-rw-r--r--spec/javascripts/registry/mock_data.js3
-rw-r--r--spec/javascripts/registry/stores/mutations_spec.js4
-rw-r--r--spec/javascripts/reports/components/grouped_test_reports_app_spec.js8
-rw-r--r--spec/javascripts/reports/components/modal_spec.js17
-rw-r--r--spec/javascripts/reports/components/report_link_spec.js6
-rw-r--r--spec/javascripts/reports/components/report_section_spec.js5
-rw-r--r--spec/javascripts/reports/components/test_issue_body_spec.js1
-rw-r--r--spec/javascripts/reports/store/mutations_spec.js2
-rw-r--r--spec/javascripts/right_sidebar_spec.js169
-rw-r--r--spec/javascripts/search_autocomplete_spec.js27
-rw-r--r--spec/javascripts/search_spec.js10
-rw-r--r--spec/javascripts/settings_panels_spec.js30
-rw-r--r--spec/javascripts/shared/popover_spec.js34
-rw-r--r--spec/javascripts/shortcuts_spec.js2
-rw-r--r--spec/javascripts/sidebar/assignees_spec.js94
-rw-r--r--spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js48
-rw-r--r--spec/javascripts/sidebar/confidential_edit_buttons_spec.js12
-rw-r--r--spec/javascripts/sidebar/confidential_edit_form_buttons_spec.js12
-rw-r--r--spec/javascripts/sidebar/confidential_issue_sidebar_spec.js32
-rw-r--r--spec/javascripts/sidebar/lock/edit_form_buttons_spec.js12
-rw-r--r--spec/javascripts/sidebar/lock/edit_form_spec.js12
-rw-r--r--spec/javascripts/sidebar/lock/lock_issue_sidebar_spec.js28
-rw-r--r--spec/javascripts/sidebar/participants_spec.js17
-rw-r--r--spec/javascripts/sidebar/sidebar_assignees_spec.js16
-rw-r--r--spec/javascripts/sidebar/sidebar_mediator_spec.js33
-rw-r--r--spec/javascripts/sidebar/sidebar_move_issue_spec.js24
-rw-r--r--spec/javascripts/sidebar/sidebar_store_spec.js18
-rw-r--r--spec/javascripts/sidebar/sidebar_subscriptions_spec.js4
-rw-r--r--spec/javascripts/sidebar/subscriptions_spec.js16
-rw-r--r--spec/javascripts/sidebar/todo_spec.js15
-rw-r--r--spec/javascripts/signin_tabs_memoizer_spec.js240
-rw-r--r--spec/javascripts/smart_interval_spec.js43
-rw-r--r--spec/javascripts/syntax_highlight_spec.js27
-rw-r--r--spec/javascripts/test_bundle.js4
-rw-r--r--spec/javascripts/todos_spec.js4
-rw-r--r--spec/javascripts/toggle_buttons_spec.js18
-rw-r--r--spec/javascripts/u2f/authenticate_spec.js36
-rw-r--r--spec/javascripts/u2f/mock_u2f_device.js14
-rw-r--r--spec/javascripts/u2f/register_spec.js31
-rw-r--r--spec/javascripts/u2f/util_spec.js32
-rw-r--r--spec/javascripts/version_check_image_spec.js14
-rw-r--r--spec/javascripts/vue_mr_widget/components/deployment_spec.js185
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js10
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js8
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js72
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js55
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js32
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js79
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js13
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js5
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js4
-rw-r--r--spec/javascripts/vue_mr_widget/components/review_app_link_spec.js38
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js6
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js6
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js4
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js55
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js10
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js2
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_merge_when_pipeline_succeeds_spec.js56
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js60
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js27
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js1
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js4
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js5
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js6
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js6
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js136
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js6
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js18
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_wip_spec.js22
-rw-r--r--spec/javascripts/vue_mr_widget/mock_data.js4
-rw-r--r--spec/javascripts/vue_mr_widget/mr_widget_options_spec.js297
-rw-r--r--spec/javascripts/vue_mr_widget/stores/get_state_key_spec.js14
-rw-r--r--spec/javascripts/vue_mr_widget/stores/mr_widget_store_spec.js10
-rw-r--r--spec/javascripts/vue_shared/components/bar_chart_spec.js6
-rw-r--r--spec/javascripts/vue_shared/components/changed_file_icon_spec.js (renamed from spec/javascripts/ide/components/changed_file_icon_spec.js)12
-rw-r--r--spec/javascripts/vue_shared/components/ci_badge_link_spec.js6
-rw-r--r--spec/javascripts/vue_shared/components/clipboard_button_spec.js3
-rw-r--r--spec/javascripts/vue_shared/components/commit_spec.js7
-rw-r--r--spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/deprecated_modal_spec.js12
-rw-r--r--spec/javascripts/vue_shared/components/diff_viewer/diff_viewer_spec.js5
-rw-r--r--spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js38
-rw-r--r--spec/javascripts/vue_shared/components/dropdown/dropdown_button_spec.js10
-rw-r--r--spec/javascripts/vue_shared/components/expand_button_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/file_icon_spec.js26
-rw-r--r--spec/javascripts/vue_shared/components/file_row_spec.js110
-rw-r--r--spec/javascripts/vue_shared/components/filtered_search_dropdown_spec.js91
-rw-r--r--spec/javascripts/vue_shared/components/gl_countdown_spec.js77
-rw-r--r--spec/javascripts/vue_shared/components/gl_modal_spec.js7
-rw-r--r--spec/javascripts/vue_shared/components/header_ci_component_spec.js12
-rw-r--r--spec/javascripts/vue_shared/components/icon_spec.js17
-rw-r--r--spec/javascripts/vue_shared/components/identicon_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/issue/issue_warning_spec.js17
-rw-r--r--spec/javascripts/vue_shared/components/loading_button_spec.js4
-rw-r--r--spec/javascripts/vue_shared/components/loading_icon_spec.js54
-rw-r--r--spec/javascripts/vue_shared/components/markdown/field_spec.js81
-rw-r--r--spec/javascripts/vue_shared/components/markdown/header_spec.js32
-rw-r--r--spec/javascripts/vue_shared/components/markdown/toolbar_spec.js9
-rw-r--r--spec/javascripts/vue_shared/components/memory_graph_spec.js16
-rw-r--r--spec/javascripts/vue_shared/components/navigation_tabs_spec.js5
-rw-r--r--spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/notes/placeholder_system_note_spec.js4
-rw-r--r--spec/javascripts/vue_shared/components/notes/system_note_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/pagination_links_spec.js59
-rw-r--r--spec/javascripts/vue_shared/components/panel_resizer_spec.js27
-rw-r--r--spec/javascripts/vue_shared/components/pikaday_spec.js1
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/collapsed_calendar_icon_spec.js1
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js34
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/date_picker_spec.js16
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/base_spec.js7
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_button_spec.js4
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js22
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_footer_spec.js12
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_header_spec.js6
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_search_input_spec.js5
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js1
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js8
-rw-r--r--spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_spec.js23
-rw-r--r--spec/javascripts/vue_shared/components/skeleton_loading_container_spec.js49
-rw-r--r--spec/javascripts/vue_shared/components/smart_virtual_list_spec.js83
-rw-r--r--spec/javascripts/vue_shared/components/stacked_progress_bar_spec.js29
-rw-r--r--spec/javascripts/vue_shared/components/table_pagination_spec.js27
-rw-r--r--spec/javascripts/vue_shared/components/time_ago_tooltip_spec.js7
-rw-r--r--spec/javascripts/vue_shared/components/toggle_button_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/tooltip_on_truncate_spec.js156
-rw-r--r--spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js57
-rw-r--r--spec/javascripts/vue_shared/components/user_avatar/user_avatar_link_spec.js59
-rw-r--r--spec/javascripts/vue_shared/components/user_avatar/user_avatar_svg_spec.js10
-rw-r--r--spec/javascripts/vue_shared/directives/tooltip_spec.js45
-rw-r--r--spec/javascripts/vue_shared/translate_spec.js213
-rw-r--r--spec/javascripts/zen_mode_spec.js7
-rw-r--r--spec/lib/api/helpers/custom_validators_spec.rb64
-rw-r--r--spec/lib/api/helpers/pagination_spec.rb2
-rw-r--r--spec/lib/backup/manager_spec.rb4
-rw-r--r--spec/lib/backup/repository_spec.rb4
-rw-r--r--spec/lib/banzai/cross_project_reference_spec.rb19
-rw-r--r--spec/lib/banzai/filter/autolink_filter_spec.rb2
-rw-r--r--spec/lib/banzai/filter/commit_range_reference_filter_spec.rb1
-rw-r--r--spec/lib/banzai/filter/external_issue_reference_filter_spec.rb34
-rw-r--r--spec/lib/banzai/filter/markdown_filter_spec.rb23
-rw-r--r--spec/lib/banzai/filter/relative_link_filter_spec.rb7
-rw-r--r--spec/lib/banzai/filter/spaced_link_filter_spec.rb96
-rw-r--r--spec/lib/banzai/filter/wiki_link_filter_spec.rb40
-rw-r--r--spec/lib/banzai/pipeline/gfm_pipeline_spec.rb18
-rw-r--r--spec/lib/banzai/pipeline/wiki_pipeline_spec.rb35
-rw-r--r--spec/lib/banzai/reference_parser/base_parser_spec.rb3
-rw-r--r--spec/lib/banzai/reference_parser/commit_parser_spec.rb18
-rw-r--r--spec/lib/bitbucket_server/client_spec.rb12
-rw-r--r--spec/lib/bitbucket_server/collection_spec.rb29
-rw-r--r--spec/lib/bitbucket_server/paginator_spec.rb10
-rw-r--r--spec/lib/container_registry/blob_spec.rb2
-rw-r--r--spec/lib/event_filter_spec.rb131
-rw-r--r--spec/lib/feature_spec.rb88
-rw-r--r--spec/lib/forever_spec.rb2
-rw-r--r--spec/lib/gitaly/server_spec.rb8
-rw-r--r--spec/lib/gitlab/auth/ldap/access_spec.rb152
-rw-r--r--spec/lib/gitlab/auth/o_auth/provider_spec.rb42
-rw-r--r--spec/lib/gitlab/auth/saml/auth_hash_spec.rb11
-rw-r--r--spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/create_gpg_key_subkeys_from_gpg_keys_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb8
-rw-r--r--spec/lib/gitlab/background_migration/digest_column_spec.rb46
-rw-r--r--spec/lib/gitlab/background_migration/encrypt_columns_spec.rb69
-rw-r--r--spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb156
-rw-r--r--spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb97
-rw-r--r--spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb62
-rw-r--r--spec/lib/gitlab/background_migration/redact_links_spec.rb96
-rw-r--r--spec/lib/gitlab/bare_repository_import/importer_spec.rb4
-rw-r--r--spec/lib/gitlab/bitbucket_import/project_creator_spec.rb4
-rw-r--r--spec/lib/gitlab/blob_helper_spec.rb125
-rw-r--r--spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb26
-rw-r--r--spec/lib/gitlab/checks/change_access_spec.rb18
-rw-r--r--spec/lib/gitlab/checks/lfs_integrity_spec.rb5
-rw-r--r--spec/lib/gitlab/checks/timed_logger_spec.rb63
-rw-r--r--spec/lib/gitlab/ci/ansi2html_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/adapters/gzip_stream_spec.rb (renamed from spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb)2
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb47
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb30
-rw-r--r--spec/lib/gitlab/ci/build/policy/changes_spec.rb119
-rw-r--r--spec/lib/gitlab/ci/build/policy/refs_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/build/policy/variables_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/config/entry/artifacts_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/global_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/job_spec.rb110
-rw-r--r--spec/lib/gitlab/ci/config/entry/policy_spec.rb22
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports_spec.rb63
-rw-r--r--spec/lib/gitlab/ci/config/entry/retry_spec.rb236
-rw-r--r--spec/lib/gitlab/ci/config/extendable/entry_spec.rb227
-rw-r--r--spec/lib/gitlab/ci/config/extendable_spec.rb228
-rw-r--r--spec/lib/gitlab/ci/config/external/file/base_spec.rb52
-rw-r--r--spec/lib/gitlab/ci/config/external/file/local_spec.rb78
-rw-r--r--spec/lib/gitlab/ci/config/external/file/remote_spec.rb157
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb98
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb190
-rw-r--r--spec/lib/gitlab/ci/config/normalizer_spec.rb66
-rw-r--r--spec/lib/gitlab/ci/config_spec.rb281
-rw-r--r--spec/lib/gitlab/ci/parsers/test/junit_spec.rb (renamed from spec/lib/gitlab/ci/parsers/junit_spec.rb)66
-rw-r--r--spec/lib/gitlab/ci/parsers/test_spec.rb (renamed from spec/lib/gitlab/ci/parsers_spec.rb)4
-rw-r--r--spec/lib/gitlab/ci/status/build/factory_spec.rb51
-rw-r--r--spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/status/build/failed_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/status/build/retried_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/status/build/scheduled_spec.rb44
-rw-r--r--spec/lib/gitlab/ci/status/build/unschedule_spec.rb94
-rw-r--r--spec/lib/gitlab/ci/status/pipeline/delayed_spec.rb42
-rw-r--r--spec/lib/gitlab/ci/status/pipeline/factory_spec.rb24
-rw-r--r--spec/lib/gitlab/ci/status/scheduled_spec.rb27
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/variables/collection/item_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb122
-rw-r--r--spec/lib/gitlab/cleanup/project_uploads_spec.rb4
-rw-r--r--spec/lib/gitlab/closing_issue_extractor_spec.rb7
-rw-r--r--spec/lib/gitlab/conflict/file_spec.rb13
-rw-r--r--spec/lib/gitlab/contributions_calendar_spec.rb17
-rw-r--r--spec/lib/gitlab/cross_project_access/check_info_spec.rb4
-rw-r--r--spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb6
-rw-r--r--spec/lib/gitlab/data_builder/build_spec.rb1
-rw-r--r--spec/lib/gitlab/data_builder/pipeline_spec.rb47
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb93
-rw-r--r--spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb2
-rw-r--r--spec/lib/gitlab/database/subquery_spec.rb17
-rw-r--r--spec/lib/gitlab/diff/file_collection/commit_spec.rb15
-rw-r--r--spec/lib/gitlab/diff/file_collection/compare_spec.rb29
-rw-r--r--spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb8
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb110
-rw-r--r--spec/lib/gitlab/diff/highlight_cache_spec.rb70
-rw-r--r--spec/lib/gitlab/diff/highlight_spec.rb38
-rw-r--r--spec/lib/gitlab/diff/line_spec.rb22
-rw-r--r--spec/lib/gitlab/diff/lines_unfolder_spec.rb750
-rw-r--r--spec/lib/gitlab/diff/position_spec.rb92
-rw-r--r--spec/lib/gitlab/diff/position_tracer_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/create_issue_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb71
-rw-r--r--spec/lib/gitlab/email/handler/create_note_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler_spec.rb4
-rw-r--r--spec/lib/gitlab/encoding_helper_spec.rb12
-rw-r--r--spec/lib/gitlab/favicon_spec.rb1
-rw-r--r--spec/lib/gitlab/file_detector_spec.rb25
-rw-r--r--spec/lib/gitlab/file_markdown_link_builder_spec.rb80
-rw-r--r--spec/lib/gitlab/file_type_detection_spec.rb82
-rw-r--r--spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/git/attributes_parser_spec.rb4
-rw-r--r--spec/lib/gitlab/git/blob_snippet_spec.rb19
-rw-r--r--spec/lib/gitlab/git/blob_spec.rb17
-rw-r--r--spec/lib/gitlab/git/branch_spec.rb8
-rw-r--r--spec/lib/gitlab/git/commit_spec.rb33
-rw-r--r--spec/lib/gitlab/git/committer_with_hooks_spec.rb156
-rw-r--r--spec/lib/gitlab/git/diff_spec.rb135
-rw-r--r--spec/lib/gitlab/git/diff_stats_collection_spec.rb32
-rw-r--r--spec/lib/gitlab/git/gitlab_projects_spec.rb321
-rw-r--r--spec/lib/gitlab/git/hook_env_spec.rb20
-rw-r--r--spec/lib/gitlab/git/hook_spec.rb111
-rw-r--r--spec/lib/gitlab/git/hooks_service_spec.rb50
-rw-r--r--spec/lib/gitlab/git/index_spec.rb239
-rw-r--r--spec/lib/gitlab/git/lfs_changes_spec.rb4
-rw-r--r--spec/lib/gitlab/git/patches/collection_spec.rb28
-rw-r--r--spec/lib/gitlab/git/patches/commit_patches_spec.rb49
-rw-r--r--spec/lib/gitlab/git/patches/patch_spec.rb16
-rw-r--r--spec/lib/gitlab/git/popen_spec.rb179
-rw-r--r--spec/lib/gitlab/git/push_spec.rb166
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb1027
-rw-r--r--spec/lib/gitlab/git/storage/checker_spec.rb132
-rw-r--r--spec/lib/gitlab/git/storage/circuit_breaker_spec.rb187
-rw-r--r--spec/lib/gitlab/git/storage/failure_info_spec.rb70
-rw-r--r--spec/lib/gitlab/git/storage/forked_storage_check_spec.rb73
-rw-r--r--spec/lib/gitlab/git/storage/health_spec.rb58
-rw-r--r--spec/lib/gitlab/git/storage/null_circuit_breaker_spec.rb70
-rw-r--r--spec/lib/gitlab/git/tag_spec.rb2
-rw-r--r--spec/lib/gitlab/git/user_spec.rb15
-rw-r--r--spec/lib/gitlab/git/wiki_spec.rb47
-rw-r--r--spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb28
-rw-r--r--spec/lib/gitlab/git_access_spec.rb39
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb34
-rw-r--r--spec/lib/gitlab/gitaly_client/diff_spec.rb6
-rw-r--r--spec/lib/gitlab/gitaly_client/operation_service_spec.rb33
-rw-r--r--spec/lib/gitlab/gitaly_client/remote_service_spec.rb20
-rw-r--r--spec/lib/gitlab/gitaly_client/repository_service_spec.rb61
-rw-r--r--spec/lib/gitlab/gitaly_client/wiki_service_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/bulk_importing_spec.rb12
-rw-r--r--spec/lib/gitlab/github_import/importer/issue_importer_spec.rb28
-rw-r--r--spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb14
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb25
-rw-r--r--spec/lib/gitlab/github_import_spec.rb33
-rw-r--r--spec/lib/gitlab/gon_helper_spec.rb32
-rw-r--r--spec/lib/gitlab/gpg_spec.rb4
-rw-r--r--spec/lib/gitlab/highlight_spec.rb100
-rw-r--r--spec/lib/gitlab/hook_data/base_builder_spec.rb129
-rw-r--r--spec/lib/gitlab/hook_data/issue_builder_spec.rb5
-rw-r--r--spec/lib/gitlab/hook_data/merge_request_builder_spec.rb7
-rw-r--r--spec/lib/gitlab/http_spec.rb26
-rw-r--r--spec/lib/gitlab/identifier_spec.rb49
-rw-r--r--spec/lib/gitlab/import/database_helpers_spec.rb46
-rw-r--r--spec/lib/gitlab/import/merge_request_creator_spec.rb43
-rw-r--r--spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_object_storage_spec.rb105
-rw-r--r--spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb3
-rw-r--r--spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb31
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml16
-rw-r--r--spec/lib/gitlab/import_export/attribute_configuration_spec.rb15
-rw-r--r--spec/lib/gitlab/import_export/avatar_restorer_spec.rb33
-rw-r--r--spec/lib/gitlab/import_export/avatar_saver_spec.rb5
-rw-r--r--spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb89
-rw-r--r--spec/lib/gitlab/import_export/file_importer_spec.rb12
-rw-r--r--spec/lib/gitlab/import_export/importer_object_storage_spec.rb115
-rw-r--r--spec/lib/gitlab/import_export/importer_spec.rb25
-rw-r--r--spec/lib/gitlab/import_export/model_configuration_spec.rb42
-rw-r--r--spec/lib/gitlab/import_export/project.json47
-rw-r--r--spec/lib/gitlab/import_export/project.light.json22
-rw-r--r--spec/lib/gitlab/import_export/project_tree_restorer_spec.rb27
-rw-r--r--spec/lib/gitlab/import_export/project_tree_saver_spec.rb11
-rw-r--r--spec/lib/gitlab/import_export/relation_factory_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/repo_restorer_spec.rb6
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml24
-rw-r--r--spec/lib/gitlab/import_export/saver_spec.rb24
-rw-r--r--spec/lib/gitlab/import_export/uploads_manager_spec.rb61
-rw-r--r--spec/lib/gitlab/import_export/uploads_restorer_spec.rb10
-rw-r--r--spec/lib/gitlab/import_export/uploads_saver_spec.rb1
-rw-r--r--spec/lib/gitlab/kubernetes/cluster_role_binding_spec.rb35
-rw-r--r--spec/lib/gitlab/kubernetes/helm/api_spec.rb180
-rw-r--r--spec/lib/gitlab/kubernetes/helm/base_command_spec.rb20
-rw-r--r--spec/lib/gitlab/kubernetes/helm/init_command_spec.rb130
-rw-r--r--spec/lib/gitlab/kubernetes/helm/install_command_spec.rb218
-rw-r--r--spec/lib/gitlab/kubernetes/helm/pod_spec.rb19
-rw-r--r--spec/lib/gitlab/kubernetes/helm/upgrade_command_spec.rb140
-rw-r--r--spec/lib/gitlab/kubernetes/kube_client_spec.rb186
-rw-r--r--spec/lib/gitlab/kubernetes/namespace_spec.rb2
-rw-r--r--spec/lib/gitlab/kubernetes/role_binding_spec.rb48
-rw-r--r--spec/lib/gitlab/kubernetes/service_account_spec.rb24
-rw-r--r--spec/lib/gitlab/kubernetes/service_account_token_spec.rb35
-rw-r--r--spec/lib/gitlab/language_data_spec.rb22
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb59
-rw-r--r--spec/lib/gitlab/middleware/multipart_spec.rb20
-rw-r--r--spec/lib/gitlab/middleware/read_only_spec.rb2
-rw-r--r--spec/lib/gitlab/null_request_store_spec.rb75
-rw-r--r--spec/lib/gitlab/patch/draw_route_spec.rb30
-rw-r--r--spec/lib/gitlab/patch/prependable_spec.rb234
-rw-r--r--spec/lib/gitlab/private_commit_email_spec.rb51
-rw-r--r--spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/prometheus/metric_group_spec.rb41
-rw-r--r--spec/lib/gitlab/quick_actions/command_definition_spec.rb13
-rw-r--r--spec/lib/gitlab/quick_actions/dsl_spec.rb8
-rw-r--r--spec/lib/gitlab/quick_actions/extractor_spec.rb19
-rw-r--r--spec/lib/gitlab/repository_cache_adapter_spec.rb138
-rw-r--r--spec/lib/gitlab/repository_cache_spec.rb97
-rw-r--r--spec/lib/gitlab/safe_request_store_spec.rb245
-rw-r--r--spec/lib/gitlab/sentry_spec.rb24
-rw-r--r--spec/lib/gitlab/shell_spec.rb125
-rw-r--r--spec/lib/gitlab/sidekiq_throttler_spec.rb44
-rw-r--r--spec/lib/gitlab/slash_commands/command_spec.rb2
-rw-r--r--spec/lib/gitlab/slash_commands/deploy_spec.rb2
-rw-r--r--spec/lib/gitlab/storage_check/cli_spec.rb19
-rw-r--r--spec/lib/gitlab/storage_check/gitlab_caller_spec.rb46
-rw-r--r--spec/lib/gitlab/storage_check/option_parser_spec.rb31
-rw-r--r--spec/lib/gitlab/storage_check/response_spec.rb54
-rw-r--r--spec/lib/gitlab/template/finders/repo_template_finders_spec.rb37
-rw-r--r--spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb2
-rw-r--r--spec/lib/gitlab/tree_summary_spec.rb202
-rw-r--r--spec/lib/gitlab/url_blocker_spec.rb45
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb37
-rw-r--r--spec/lib/gitlab/user_extractor_spec.rb58
-rw-r--r--spec/lib/gitlab/utils_spec.rb23
-rw-r--r--spec/lib/gitlab/version_info_spec.rb3
-rw-r--r--spec/lib/gitlab/view/presenter/base_spec.rb2
-rw-r--r--spec/lib/gitlab/web_ide_commits_counter_spec.rb19
-rw-r--r--spec/lib/gitlab/workhorse_spec.rb16
-rw-r--r--spec/lib/google_api/cloud_platform/client_spec.rb47
-rw-r--r--spec/lib/json_web_token/hmac_token_spec.rb133
-rw-r--r--spec/lib/mattermost/session_spec.rb4
-rw-r--r--spec/lib/microsoft_teams/notifier_spec.rb2
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb12
-rw-r--r--spec/lib/quality/helm_client_spec.rb111
-rw-r--r--spec/lib/quality/kubernetes_client_spec.rb33
-rw-r--r--spec/lib/system_check/simple_executor_spec.rb9
-rw-r--r--spec/mailers/emails/auto_devops_spec.rb32
-rw-r--r--spec/migrations/add_pages_access_level_to_project_feature_spec.rb30
-rw-r--r--spec/migrations/delete_inconsistent_internal_id_records_spec.rb134
-rw-r--r--spec/migrations/drop_duplicate_protected_tags_spec.rb40
-rw-r--r--spec/migrations/enqueue_redact_links_spec.rb42
-rw-r--r--spec/migrations/fill_empty_finished_at_in_deployments_spec.rb70
-rw-r--r--spec/migrations/import_common_metrics_spec.rb16
-rw-r--r--spec/migrations/migrate_legacy_artifacts_to_job_artifacts_spec.rb73
-rw-r--r--spec/migrations/migrate_null_wiki_access_levels_spec.rb29
-rw-r--r--spec/migrations/migrate_old_artifacts_spec.rb2
-rw-r--r--spec/migrations/remove_orphaned_label_links_spec.rb40
-rw-r--r--spec/migrations/rename_more_reserved_project_names_spec.rb11
-rw-r--r--spec/migrations/rename_reserved_project_names_spec.rb11
-rw-r--r--spec/migrations/schedule_create_gpg_key_subkeys_from_gpg_keys_spec.rb2
-rw-r--r--spec/migrations/schedule_digest_personal_access_tokens_spec.rb46
-rw-r--r--spec/migrations/steal_fill_store_upload_spec.rb40
-rw-r--r--spec/models/application_setting_spec.rb113
-rw-r--r--spec/models/award_emoji_spec.rb23
-rw-r--r--spec/models/blob_viewer/gitlab_ci_yml_spec.rb10
-rw-r--r--spec/models/blob_viewer/package_json_spec.rb21
-rw-r--r--spec/models/board_group_recent_visit_spec.rb64
-rw-r--r--spec/models/board_project_recent_visit_spec.rb64
-rw-r--r--spec/models/ci/build_spec.rb993
-rw-r--r--spec/models/ci/job_artifact_spec.rb70
-rw-r--r--spec/models/ci/pipeline_spec.rb192
-rw-r--r--spec/models/ci/pipeline_variable_spec.rb9
-rw-r--r--spec/models/ci/runner_spec.rb31
-rw-r--r--spec/models/ci/stage_spec.rb24
-rw-r--r--spec/models/clusters/applications/helm_spec.rb14
-rw-r--r--spec/models/clusters/applications/ingress_spec.rb35
-rw-r--r--spec/models/clusters/applications/jupyter_spec.rb40
-rw-r--r--spec/models/clusters/applications/knative_spec.rb77
-rw-r--r--spec/models/clusters/applications/prometheus_spec.rb82
-rw-r--r--spec/models/clusters/applications/runner_spec.rb41
-rw-r--r--spec/models/clusters/cluster_spec.rb104
-rw-r--r--spec/models/clusters/group_spec.rb8
-rw-r--r--spec/models/clusters/kubernetes_namespace_spec.rb123
-rw-r--r--spec/models/clusters/platforms/kubernetes_spec.rb198
-rw-r--r--spec/models/clusters/project_spec.rb2
-rw-r--r--spec/models/clusters/providers/gcp_spec.rb18
-rw-r--r--spec/models/commit_spec.rb40
-rw-r--r--spec/models/commit_status_spec.rb20
-rw-r--r--spec/models/compare_spec.rb29
-rw-r--r--spec/models/concerns/avatarable_spec.rb20
-rw-r--r--spec/models/concerns/awardable_spec.rb29
-rw-r--r--spec/models/concerns/blob_language_from_git_attributes_spec.rb25
-rw-r--r--spec/models/concerns/cache_markdown_field_spec.rb5
-rw-r--r--spec/models/concerns/cacheable_attributes_spec.rb4
-rw-r--r--spec/models/concerns/case_sensitivity_spec.rb202
-rw-r--r--spec/models/concerns/deployable_spec.rb74
-rw-r--r--spec/models/concerns/each_batch_spec.rb51
-rw-r--r--spec/models/concerns/from_union_spec.rb40
-rw-r--r--spec/models/concerns/has_status_spec.rb52
-rw-r--r--spec/models/concerns/issuable_spec.rb4
-rw-r--r--spec/models/concerns/optionally_search_spec.rb44
-rw-r--r--spec/models/concerns/redactable_spec.rb69
-rw-r--r--spec/models/concerns/relative_positioning_spec.rb34
-rw-r--r--spec/models/concerns/token_authenticatable_spec.rb272
-rw-r--r--spec/models/concerns/triggerable_hooks_spec.rb24
-rw-r--r--spec/models/deployment_spec.rb215
-rw-r--r--spec/models/environment_spec.rb146
-rw-r--r--spec/models/environment_status_spec.rb165
-rw-r--r--spec/models/event_collection_spec.rb2
-rw-r--r--spec/models/event_spec.rb124
-rw-r--r--spec/models/fork_network_member_spec.rb2
-rw-r--r--spec/models/forked_project_link_spec.rb68
-rw-r--r--spec/models/global_milestone_spec.rb35
-rw-r--r--spec/models/group_spec.rb60
-rw-r--r--spec/models/hooks/active_hook_filter_spec.rb68
-rw-r--r--spec/models/hooks/system_hook_spec.rb4
-rw-r--r--spec/models/hooks/web_hook_spec.rb26
-rw-r--r--spec/models/instance_configuration_spec.rb8
-rw-r--r--spec/models/internal_id_spec.rb7
-rw-r--r--spec/models/issue_spec.rb155
-rw-r--r--spec/models/label_note_spec.rb23
-rw-r--r--spec/models/label_spec.rb36
-rw-r--r--spec/models/lfs_object_spec.rb21
-rw-r--r--spec/models/license_template_spec.rb59
-rw-r--r--spec/models/merge_request_diff_spec.rb46
-rw-r--r--spec/models/merge_request_spec.rb120
-rw-r--r--spec/models/milestone_spec.rb55
-rw-r--r--spec/models/namespace_spec.rb72
-rw-r--r--spec/models/note_spec.rb91
-rw-r--r--spec/models/notification_setting_spec.rb36
-rw-r--r--spec/models/personal_access_token_spec.rb28
-rw-r--r--spec/models/postgresql/replication_slot_spec.rb20
-rw-r--r--spec/models/project_auto_devops_spec.rb33
-rw-r--r--spec/models/project_feature_spec.rb73
-rw-r--r--spec/models/project_group_link_spec.rb2
-rw-r--r--spec/models/project_services/bamboo_service_spec.rb3
-rw-r--r--spec/models/project_services/chat_message/merge_message_spec.rb25
-rw-r--r--spec/models/project_services/chat_message/push_message_spec.rb65
-rw-r--r--spec/models/project_services/chat_notification_service_spec.rb50
-rw-r--r--spec/models/project_services/discord_service_spec.rb11
-rw-r--r--spec/models/project_services/gemnasium_service_spec.rb74
-rw-r--r--spec/models/project_services/hangouts_chat_service_spec.rb249
-rw-r--r--spec/models/project_services/hipchat_service_spec.rb18
-rw-r--r--spec/models/project_services/jira_service_spec.rb255
-rw-r--r--spec/models/project_services/kubernetes_service_spec.rb6
-rw-r--r--spec/models/project_services/prometheus_service_spec.rb23
-rw-r--r--spec/models/project_spec.rb693
-rw-r--r--spec/models/project_wiki_spec.rb33
-rw-r--r--spec/models/prometheus_metric_spec.rb98
-rw-r--r--spec/models/remote_mirror_spec.rb18
-rw-r--r--spec/models/repository_spec.rb483
-rw-r--r--spec/models/resource_label_event_spec.rb52
-rw-r--r--spec/models/service_spec.rb27
-rw-r--r--spec/models/shard_spec.rb50
-rw-r--r--spec/models/site_statistic_spec.rb2
-rw-r--r--spec/models/snippet_spec.rb211
-rw-r--r--spec/models/ssh_host_key_spec.rb164
-rw-r--r--spec/models/todo_spec.rb125
-rw-r--r--spec/models/upload_spec.rb64
-rw-r--r--spec/models/user_preference_spec.rb53
-rw-r--r--spec/models/user_spec.rb416
-rw-r--r--spec/models/wiki_page_spec.rb55
-rw-r--r--spec/policies/ci/pipeline_policy_spec.rb18
-rw-r--r--spec/policies/clusters/cluster_policy_spec.rb42
-rw-r--r--spec/policies/group_policy_spec.rb11
-rw-r--r--spec/policies/issue_policy_spec.rb42
-rw-r--r--spec/policies/project_policy_spec.rb5
-rw-r--r--spec/presenters/blob_presenter_spec.rb44
-rw-r--r--spec/presenters/ci/build_presenter_spec.rb50
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb53
-rw-r--r--spec/presenters/clusterable_presenter_spec.rb17
-rw-r--r--spec/presenters/clusters/cluster_presenter_spec.rb21
-rw-r--r--spec/presenters/group_clusterable_presenter_spec.rb77
-rw-r--r--spec/presenters/merge_request_presenter_spec.rb9
-rw-r--r--spec/presenters/project_clusterable_presenter_spec.rb77
-rw-r--r--spec/presenters/project_presenter_spec.rb178
-rw-r--r--spec/rack_servers/configs/config.ru12
-rw-r--r--spec/rack_servers/configs/puma.rb32
-rw-r--r--spec/rack_servers/puma_spec.rb84
-rw-r--r--spec/rack_servers/unicorn_spec.rb (renamed from spec/unicorn/unicorn_spec.rb)33
-rw-r--r--spec/requests/api/applications_spec.rb70
-rw-r--r--spec/requests/api/award_emoji_spec.rb12
-rw-r--r--spec/requests/api/circuit_breakers_spec.rb19
-rw-r--r--spec/requests/api/commits_spec.rb222
-rw-r--r--spec/requests/api/deployments_spec.rb12
-rw-r--r--spec/requests/api/events_spec.rb48
-rw-r--r--spec/requests/api/files_spec.rb58
-rw-r--r--spec/requests/api/groups_spec.rb14
-rw-r--r--spec/requests/api/helpers_spec.rb16
-rw-r--r--spec/requests/api/internal_spec.rb114
-rw-r--r--spec/requests/api/issues_spec.rb186
-rw-r--r--spec/requests/api/jobs_spec.rb76
-rw-r--r--spec/requests/api/labels_spec.rb8
-rw-r--r--spec/requests/api/markdown_spec.rb46
-rw-r--r--spec/requests/api/merge_requests_spec.rb64
-rw-r--r--spec/requests/api/pages/internal_access_spec.rb88
-rw-r--r--spec/requests/api/pages/private_access_spec.rb88
-rw-r--r--spec/requests/api/pages/public_access_spec.rb88
-rw-r--r--spec/requests/api/pipelines_spec.rb77
-rw-r--r--spec/requests/api/project_export_spec.rb33
-rw-r--r--spec/requests/api/project_hooks_spec.rb19
-rw-r--r--spec/requests/api/project_import_spec.rb3
-rw-r--r--spec/requests/api/project_milestones_spec.rb13
-rw-r--r--spec/requests/api/project_snippets_spec.rb16
-rw-r--r--spec/requests/api/project_templates_spec.rb145
-rw-r--r--spec/requests/api/projects_spec.rb282
-rw-r--r--spec/requests/api/protected_tags_spec.rb202
-rw-r--r--spec/requests/api/redacted_events_spec.rb68
-rw-r--r--spec/requests/api/repositories_spec.rb4
-rw-r--r--spec/requests/api/resource_label_events_spec.rb75
-rw-r--r--spec/requests/api/runner_spec.rb18
-rw-r--r--spec/requests/api/runners_spec.rb221
-rw-r--r--spec/requests/api/settings_spec.rb25
-rw-r--r--spec/requests/api/submodules_spec.rb99
-rw-r--r--spec/requests/api/templates_spec.rb3
-rw-r--r--spec/requests/api/users_spec.rb102
-rw-r--r--spec/requests/api/wikis_spec.rb134
-rw-r--r--spec/requests/openid_connect_spec.rb2
-rw-r--r--spec/routing/admin_routing_spec.rb4
-rw-r--r--spec/routing/project_routing_spec.rb17
-rw-r--r--spec/routing/routing_spec.rb7
-rw-r--r--spec/rubocop/code_reuse_helpers_spec.rb249
-rw-r--r--spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb32
-rw-r--r--spec/rubocop/cop/code_reuse/active_record_spec.rb138
-rw-r--r--spec/rubocop/cop/code_reuse/finder_spec.rb77
-rw-r--r--spec/rubocop/cop/code_reuse/presenter_spec.rb117
-rw-r--r--spec/rubocop/cop/code_reuse/serializer_spec.rb117
-rw-r--r--spec/rubocop/cop/code_reuse/service_class_spec.rb89
-rw-r--r--spec/rubocop/cop/code_reuse/worker_spec.rb104
-rw-r--r--spec/rubocop/cop/destroy_all_spec.rb43
-rw-r--r--spec/rubocop/cop/gitlab/union_spec.rb25
-rw-r--r--spec/rubocop/cop/group_public_or_visible_to_user_spec.rb28
-rw-r--r--spec/rubocop/cop/line_break_around_conditional_block_spec.rb16
-rw-r--r--spec/rubocop/cop/prefer_class_methods_over_module_spec.rb98
-rw-r--r--spec/rubocop/cop/qa/element_with_pattern_spec.rb50
-rw-r--r--spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb68
-rw-r--r--spec/rubocop/qa_helpers_spec.rb37
-rw-r--r--spec/serializers/build_action_entity_spec.rb16
-rw-r--r--spec/serializers/build_serializer_spec.rb2
-rw-r--r--spec/serializers/commit_entity_spec.rb59
-rw-r--r--spec/serializers/deployment_entity_spec.rb22
-rw-r--r--spec/serializers/deployment_serializer_spec.rb35
-rw-r--r--spec/serializers/detailed_status_entity_spec.rb (renamed from spec/serializers/status_entity_spec.rb)2
-rw-r--r--spec/serializers/diff_file_entity_spec.rb22
-rw-r--r--spec/serializers/diff_line_entity_spec.rb45
-rw-r--r--spec/serializers/diff_line_serializer_spec.rb25
-rw-r--r--spec/serializers/diff_viewer_entity_spec.rb19
-rw-r--r--spec/serializers/discussion_entity_spec.rb7
-rw-r--r--spec/serializers/environment_serializer_spec.rb3
-rw-r--r--spec/serializers/environment_status_entity_spec.rb79
-rw-r--r--spec/serializers/job_entity_spec.rb17
-rw-r--r--spec/serializers/merge_request_widget_entity_spec.rb42
-rw-r--r--spec/serializers/move_to_project_entity_spec.rb19
-rw-r--r--spec/serializers/move_to_project_serializer_spec.rb14
-rw-r--r--spec/serializers/pipeline_details_entity_spec.rb2
-rw-r--r--spec/services/application_settings/update_service_spec.rb3
-rw-r--r--spec/services/applications/create_service_spec.rb13
-rw-r--r--spec/services/audit_event_service_spec.rb26
-rw-r--r--spec/services/auth/container_registry_authentication_service_spec.rb2
-rw-r--r--spec/services/boards/issues/list_service_spec.rb12
-rw-r--r--spec/services/boards/visits/create_service_spec.rb53
-rw-r--r--spec/services/boards/visits/latest_service_spec.rb47
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb93
-rw-r--r--spec/services/ci/destroy_pipeline_service_spec.rb60
-rw-r--r--spec/services/ci/enqueue_build_service_spec.rb16
-rw-r--r--spec/services/ci/fetch_kubernetes_token_service_spec.rb64
-rw-r--r--spec/services/ci/process_build_service_spec.rb117
-rw-r--r--spec/services/ci/process_pipeline_service_spec.rb213
-rw-r--r--spec/services/ci/register_job_service_spec.rb14
-rw-r--r--spec/services/ci/retry_build_service_spec.rb25
-rw-r--r--spec/services/ci/run_scheduled_build_service_spec.rb62
-rw-r--r--spec/services/clusters/applications/check_installation_progress_service_spec.rb33
-rw-r--r--spec/services/clusters/applications/create_service_spec.rb130
-rw-r--r--spec/services/clusters/applications/install_service_spec.rb2
-rw-r--r--spec/services/clusters/applications/schedule_installation_service_spec.rb7
-rw-r--r--spec/services/clusters/create_service_spec.rb31
-rw-r--r--spec/services/clusters/gcp/fetch_operation_service_spec.rb2
-rw-r--r--spec/services/clusters/gcp/finalize_creation_service_spec.rb225
-rw-r--r--spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb115
-rw-r--r--spec/services/clusters/gcp/kubernetes/create_service_account_service_spec.rb166
-rw-r--r--spec/services/clusters/gcp/kubernetes/fetch_kubernetes_token_service_spec.rb62
-rw-r--r--spec/services/clusters/gcp/provision_service_spec.rb2
-rw-r--r--spec/services/clusters/update_service_spec.rb36
-rw-r--r--spec/services/commits/commit_patch_service_spec.rb92
-rw-r--r--spec/services/create_deployment_service_spec.rb335
-rw-r--r--spec/services/files/create_service_spec.rb16
-rw-r--r--spec/services/files/delete_service_spec.rb11
-rw-r--r--spec/services/files/multi_service_spec.rb36
-rw-r--r--spec/services/files/update_service_spec.rb11
-rw-r--r--spec/services/git_push_service_spec.rb52
-rw-r--r--spec/services/git_tag_push_service_spec.rb5
-rw-r--r--spec/services/groups/destroy_service_spec.rb11
-rw-r--r--spec/services/groups/transfer_service_spec.rb6
-rw-r--r--spec/services/groups/update_service_spec.rb6
-rw-r--r--spec/services/issuable/bulk_update_service_spec.rb2
-rw-r--r--spec/services/issuable/clone/attributes_rewriter_spec.rb79
-rw-r--r--spec/services/issuable/clone/content_rewriter_spec.rb153
-rw-r--r--spec/services/issuable/common_system_notes_service_spec.rb13
-rw-r--r--spec/services/issues/fetch_referenced_merge_requests_service_spec.rb35
-rw-r--r--spec/services/issues/move_service_spec.rb257
-rw-r--r--spec/services/issues/referenced_merge_requests_service_spec.rb133
-rw-r--r--spec/services/issues/related_branches_service_spec.rb39
-rw-r--r--spec/services/issues/update_service_spec.rb57
-rw-r--r--spec/services/merge_requests/build_service_spec.rb45
-rw-r--r--spec/services/merge_requests/create_from_issue_service_spec.rb10
-rw-r--r--spec/services/merge_requests/create_service_spec.rb2
-rw-r--r--spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb2
-rw-r--r--spec/services/merge_requests/rebase_service_spec.rb2
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb60
-rw-r--r--spec/services/merge_requests/reload_diffs_service_spec.rb33
-rw-r--r--spec/services/merge_requests/squash_service_spec.rb6
-rw-r--r--spec/services/merge_requests/update_service_spec.rb59
-rw-r--r--spec/services/milestones/destroy_service_spec.rb30
-rw-r--r--spec/services/notes/build_service_spec.rb15
-rw-r--r--spec/services/notes/create_service_spec.rb51
-rw-r--r--spec/services/notes/destroy_service_spec.rb33
-rw-r--r--spec/services/notes/quick_actions_service_spec.rb2
-rw-r--r--spec/services/notification_recipient_service_spec.rb47
-rw-r--r--spec/services/notification_service_spec.rb177
-rw-r--r--spec/services/preview_markdown_service_spec.rb7
-rw-r--r--spec/services/projects/after_import_service_spec.rb4
-rw-r--r--spec/services/projects/after_rename_service_spec.rb198
-rw-r--r--spec/services/projects/auto_devops/disable_service_spec.rb100
-rw-r--r--spec/services/projects/autocomplete_service_spec.rb4
-rw-r--r--spec/services/projects/container_repository/destroy_service_spec.rb41
-rw-r--r--spec/services/projects/create_service_spec.rb17
-rw-r--r--spec/services/projects/destroy_service_spec.rb26
-rw-r--r--spec/services/projects/detect_repository_languages_service_spec.rb4
-rw-r--r--spec/services/projects/fork_service_spec.rb33
-rw-r--r--spec/services/projects/hashed_storage/migrate_repository_service_spec.rb6
-rw-r--r--spec/services/projects/import_service_spec.rb4
-rw-r--r--spec/services/projects/transfer_service_spec.rb37
-rw-r--r--spec/services/projects/unlink_fork_service_spec.rb9
-rw-r--r--spec/services/projects/update_remote_mirror_service_spec.rb100
-rw-r--r--spec/services/projects/update_service_spec.rb50
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb206
-rw-r--r--spec/services/resource_events/change_labels_service_spec.rb8
-rw-r--r--spec/services/resource_events/merge_into_notes_service_spec.rb79
-rw-r--r--spec/services/submodules/update_service_spec.rb212
-rw-r--r--spec/services/system_hooks_service_spec.rb2
-rw-r--r--spec/services/system_note_service_spec.rb81
-rw-r--r--spec/services/todo_service_spec.rb4
-rw-r--r--spec/services/update_deployment_service_spec.rb217
-rw-r--r--spec/services/users/build_service_spec.rb151
-rw-r--r--spec/services/users/destroy_service_spec.rb39
-rw-r--r--spec/services/web_hook_service_spec.rb2
-rw-r--r--spec/services/wikis/create_attachment_service_spec.rb224
-rw-r--r--spec/spec_helper.rb22
-rw-r--r--spec/support/api/milestones_shared_examples.rb26
-rw-r--r--spec/support/capybara.rb2
-rw-r--r--spec/support/controllers/githubish_import_controller_shared_examples.rb12
-rw-r--r--spec/support/features/discussion_comments_shared_example.rb14
-rw-r--r--spec/support/features/issuable_quick_actions_shared_examples.rb (renamed from spec/support/features/issuable_slash_commands_shared_examples.rb)93
-rw-r--r--spec/support/features/reportable_note_shared_examples.rb4
-rw-r--r--spec/support/features/variable_list_shared_examples.rb2
-rw-r--r--spec/support/helpers/ci_artifact_metadata_generator.rb48
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb25
-rw-r--r--spec/support/helpers/devise_helpers.rb9
-rw-r--r--spec/support/helpers/filter_item_select_helper.rb19
-rw-r--r--spec/support/helpers/filtered_search_helpers.rb8
-rw-r--r--spec/support/helpers/git_helpers.rb17
-rw-r--r--spec/support/helpers/kubernetes_helpers.rb105
-rw-r--r--spec/support/helpers/ldap_helpers.rb17
-rw-r--r--spec/support/helpers/markdown_feature.rb8
-rw-r--r--spec/support/helpers/migrations_helpers.rb26
-rw-r--r--spec/support/helpers/project_forks_helper.rb4
-rw-r--r--spec/support/helpers/reference_parser_helpers.rb6
-rw-r--r--spec/support/helpers/seed_helper.rb20
-rw-r--r--spec/support/helpers/stub_configuration.rb7
-rw-r--r--spec/support/helpers/stub_feature_flags.rb7
-rw-r--r--spec/support/helpers/test_env.rb29
-rw-r--r--spec/support/helpers/test_request_helpers.rb11
-rw-r--r--spec/support/helpers/user_login_helper.rb26
-rw-r--r--spec/support/helpers/wiki_helpers.rb13
-rw-r--r--spec/support/import_export/export_file_helper.rb2
-rw-r--r--spec/support/rspec.rb2
-rw-r--r--spec/support/services/clusters/create_service_shared.rb4
-rw-r--r--spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb66
-rw-r--r--spec/support/shared_examples/controllers/repository_lfs_file_load_examples.rb89
-rw-r--r--spec/support/shared_examples/diff_file_collections.rb47
-rw-r--r--spec/support/shared_examples/dirty_submit_form_shared_examples.rb24
-rw-r--r--spec/support/shared_examples/fast_destroy_all.rb4
-rw-r--r--spec/support/shared_examples/features/editable_merge_request_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/helm_generated_script.rb10
-rw-r--r--spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/chat_service_spec.rb242
-rw-r--r--spec/support/shared_examples/models/cluster_application_core_shared_examples.rb56
-rw-r--r--spec/support/shared_examples/models/cluster_application_helm_cert_examples.rb25
-rw-r--r--spec/support/shared_examples/models/cluster_application_status_shared_examples.rb113
-rw-r--r--spec/support/shared_examples/models/label_note_shared_examples.rb109
-rw-r--r--spec/support/shared_examples/notify_shared_examples.rb17
-rw-r--r--spec/support/shared_examples/requests/api/merge_requests_list.rb7
-rw-r--r--spec/support/shared_examples/requests/api/notes.rb82
-rw-r--r--spec/support/shared_examples/services/boards/issues_move_service.rb2
-rw-r--r--spec/support/shared_examples/services/boards/lists_move_service.rb12
-rw-r--r--spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/wiki_file_attachments_examples.rb88
-rw-r--r--spec/support/sidekiq.rb20
-rw-r--r--spec/support/stored_repositories.rb23
-rw-r--r--spec/support/stub_version.rb8
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb2
-rw-r--r--spec/tasks/gitlab/cleanup_rake_spec.rb35
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb33
-rw-r--r--spec/tasks/gitlab/gitaly_rake_spec.rb67
-rw-r--r--spec/tasks/gitlab/site_statistics_rake_spec.rb23
-rw-r--r--spec/tasks/gitlab/traces_rake_spec.rb112
-rw-r--r--spec/tasks/gitlab/uploads/migrate_rake_spec.rb8
-rw-r--r--spec/uploaders/avatar_uploader_spec.rb8
-rw-r--r--spec/uploaders/file_uploader_spec.rb27
-rw-r--r--spec/uploaders/job_artifact_uploader_spec.rb47
-rw-r--r--spec/uploaders/namespace_file_uploader_spec.rb78
-rw-r--r--spec/uploaders/uploader_helper_spec.rb25
-rw-r--r--spec/validators/branch_filter_validator_spec.rb42
-rw-r--r--spec/validators/js_regex_validator_spec.rb27
-rw-r--r--spec/validators/url_validator_spec.rb15
-rw-r--r--spec/views/help/index.html.haml_spec.rb43
-rw-r--r--spec/views/projects/_home_panel.html.haml_spec.rb6
-rw-r--r--spec/views/projects/blob/_viewer.html.haml_spec.rb2
-rw-r--r--spec/views/projects/jobs/show.html.haml_spec.rb191
-rw-r--r--spec/views/projects/merge_requests/_commits.html.haml_spec.rb13
-rw-r--r--spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb16
-rw-r--r--spec/views/projects/merge_requests/edit.html.haml_spec.rb1
-rw-r--r--spec/views/projects/notes/_more_actions_dropdown.html.haml_spec.rb8
-rw-r--r--spec/views/projects/tree/_tree_row.html.haml_spec.rb (renamed from spec/views/projects/tree/_blob_item.html.haml_spec.rb)9
-rw-r--r--spec/views/shared/runners/show.html.haml_spec.rb155
-rw-r--r--spec/workers/auto_devops/disable_worker_spec.rb57
-rw-r--r--spec/workers/build_success_worker_spec.rb54
-rw-r--r--spec/workers/ci/build_schedule_worker_spec.rb40
-rw-r--r--spec/workers/cluster_platform_configure_worker_spec.rb47
-rw-r--r--spec/workers/cluster_provision_worker_spec.rb9
-rw-r--r--spec/workers/delete_container_repository_worker_spec.rb33
-rw-r--r--spec/workers/deployments/success_worker_spec.rb36
-rw-r--r--spec/workers/email_receiver_worker_spec.rb15
-rw-r--r--spec/workers/emails_on_push_worker_spec.rb2
-rw-r--r--spec/workers/git_garbage_collect_worker_spec.rb6
-rw-r--r--spec/workers/namespaceless_project_destroy_worker_spec.rb4
-rw-r--r--spec/workers/post_receive_spec.rb133
-rw-r--r--spec/workers/project_destroy_worker_spec.rb7
-rw-r--r--spec/workers/project_service_worker_spec.rb25
-rw-r--r--spec/workers/prune_old_events_worker_spec.rb20
-rw-r--r--spec/workers/rebase_worker_spec.rb12
-rw-r--r--spec/workers/repository_check/batch_worker_spec.rb2
-rw-r--r--spec/workers/repository_check/single_repository_worker_spec.rb2
-rw-r--r--spec/workers/repository_fork_worker_spec.rb32
-rw-r--r--spec/workers/repository_remove_remote_worker_spec.rb5
-rw-r--r--spec/workers/stuck_ci_jobs_worker_spec.rb41
-rw-r--r--spec/workers/stuck_import_jobs_worker_spec.rb22
1546 files changed, 190845 insertions, 19691 deletions
diff --git a/spec/bin/changelog_spec.rb b/spec/bin/changelog_spec.rb
index 9dc4edf97d1..c59add88a82 100644
--- a/spec/bin/changelog_spec.rb
+++ b/spec/bin/changelog_spec.rb
@@ -95,6 +95,7 @@ describe 'bin/changelog' do
it 'shows error message and exits the program' do
allow($stdin).to receive(:getc).and_return(type)
+
expect do
expect { described_class.read_type }.to raise_error(
ChangelogHelpers::Abort,
diff --git a/spec/bin/storage_check_spec.rb b/spec/bin/storage_check_spec.rb
deleted file mode 100644
index 02f6fcb6e3a..00000000000
--- a/spec/bin/storage_check_spec.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-require 'spec_helper'
-
-describe 'bin/storage_check' do
- it 'is executable' do
- command = %w[bin/storage_check -t unix://the/path/to/a/unix-socket.sock -i 10 -d]
- expected_output = 'Checking unix://the/path/to/a/unix-socket.sock every 10 seconds'
-
- output, status = Gitlab::Popen.popen(command, Rails.root.to_s)
-
- expect(status).to eq(0)
- expect(output).to include(expected_output)
- end
-end
diff --git a/spec/config/settings_spec.rb b/spec/config/settings_spec.rb
new file mode 100644
index 00000000000..83b2de47741
--- /dev/null
+++ b/spec/config/settings_spec.rb
@@ -0,0 +1,9 @@
+require 'spec_helper'
+
+describe Settings do
+ describe 'omniauth' do
+ it 'defaults to enabled' do
+ expect(described_class.omniauth.enabled).to be true
+ end
+ end
+end
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 9d10d725ff3..2e0f79cd313 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -78,5 +78,30 @@ describe Admin::ApplicationSettingsController do
expect(response).to redirect_to(admin_application_settings_path)
expect(ApplicationSetting.current.restricted_visibility_levels).to be_empty
end
+
+ it 'updates the receive_max_input_size setting' do
+ put :update, application_setting: { receive_max_input_size: "1024" }
+
+ expect(response).to redirect_to(admin_application_settings_path)
+ expect(ApplicationSetting.current.receive_max_input_size).to eq(1024)
+ end
+ end
+
+ describe 'PUT #reset_registration_token' do
+ before do
+ sign_in(admin)
+ end
+
+ subject { put :reset_registration_token }
+
+ it 'resets runner registration token' do
+ expect { subject }.to change { ApplicationSetting.current.runners_registration_token }
+ end
+
+ it 'redirects the user to admin runners page' do
+ subject
+
+ expect(response).to redirect_to(admin_runners_path)
+ end
end
end
diff --git a/spec/controllers/admin/health_check_controller_spec.rb b/spec/controllers/admin/health_check_controller_spec.rb
index d15ee0021d9..e13401fc06b 100644
--- a/spec/controllers/admin/health_check_controller_spec.rb
+++ b/spec/controllers/admin/health_check_controller_spec.rb
@@ -8,18 +8,10 @@ describe Admin::HealthCheckController do
end
describe 'GET show' do
- it 'loads the git storage health information' do
+ it 'loads the health information' do
get :show
- expect(assigns[:failing_storage_statuses]).not_to be_nil
- end
- end
-
- describe 'POST reset_storage_health' do
- it 'resets all storage health information' do
- expect(Gitlab::Git::Storage::FailureInfo).to receive(:reset_all!)
-
- post :reset_storage_health
+ expect(assigns[:errors]).not_to be_nil
end
end
end
diff --git a/spec/controllers/admin/projects_controller_spec.rb b/spec/controllers/admin/projects_controller_spec.rb
index cc200b9fed9..ee1aff09bdf 100644
--- a/spec/controllers/admin/projects_controller_spec.rb
+++ b/spec/controllers/admin/projects_controller_spec.rb
@@ -42,4 +42,15 @@ describe Admin::ProjectsController do
expect { get :index }.not_to exceed_query_limit(control_count)
end
end
+
+ describe 'GET /projects/:id' do
+ render_views
+
+ it 'renders show page' do
+ get :show, namespace_id: project.namespace.path, id: project.path
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.body).to match(project.name)
+ end
+ end
end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index fbf116e533b..efc3ce74627 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -190,30 +190,6 @@ describe ApplicationController do
end
end
- describe 'rescue from Gitlab::Git::Storage::Inaccessible' do
- controller(described_class) do
- def index
- raise Gitlab::Git::Storage::Inaccessible.new('broken', 100)
- end
- end
-
- it 'renders a 503 when storage is not available' do
- sign_in(create(:user))
-
- get :index
-
- expect(response.status).to eq(503)
- end
-
- it 'renders includes a Retry-After header' do
- sign_in(create(:user))
-
- get :index
-
- expect(response.headers['Retry-After']).to eq(100)
- end
- end
-
describe 'response format' do
controller(described_class) do
def index
@@ -674,7 +650,7 @@ describe ApplicationController do
describe '#access_denied' do
controller(described_class) do
def index
- access_denied!(params[:message])
+ access_denied!(params[:message], params[:status])
end
end
@@ -693,5 +669,159 @@ describe ApplicationController do
expect(response).to have_gitlab_http_status(403)
end
+
+ it 'renders a status passed to access denied' do
+ get :index, status: 401
+
+ expect(response).to have_gitlab_http_status(401)
+ end
+ end
+
+ context 'when invalid UTF-8 parameters are received' do
+ controller(described_class) do
+ def index
+ params[:text].split(' ')
+
+ render json: :ok
+ end
+ end
+
+ before do
+ sign_in user
+ end
+
+ context 'html' do
+ subject { get :index, text: "hi \255" }
+
+ it 'renders 412' do
+ if Gitlab.rails5?
+ expect { subject }.to raise_error(ActionController::BadRequest)
+ else
+ subject
+
+ expect(response).to have_gitlab_http_status(412)
+ expect(response).to render_template :precondition_failed
+ end
+ end
+ end
+
+ context 'js' do
+ subject { get :index, text: "hi \255", format: :js }
+
+ it 'renders 412' do
+ if Gitlab.rails5?
+ expect { subject }.to raise_error(ActionController::BadRequest)
+ else
+ subject
+
+ json_response = JSON.parse(response.body)
+
+ expect(response).to have_gitlab_http_status(412)
+ expect(json_response['error']).to eq('Invalid UTF-8')
+ end
+ end
+ end
+ end
+
+ context 'X-GitLab-Custom-Error header' do
+ before do
+ sign_in user
+ end
+
+ context 'given a 422 error page' do
+ controller do
+ def index
+ render 'errors/omniauth_error', layout: 'errors', status: 422
+ end
+ end
+
+ it 'sets a custom header' do
+ get :index
+
+ expect(response.headers['X-GitLab-Custom-Error']).to eq '1'
+ end
+ end
+
+ context 'given a 500 error page' do
+ controller do
+ def index
+ render 'errors/omniauth_error', layout: 'errors', status: 500
+ end
+ end
+
+ it 'sets a custom header' do
+ get :index
+
+ expect(response.headers['X-GitLab-Custom-Error']).to eq '1'
+ end
+ end
+
+ context 'given a 200 success page' do
+ controller do
+ def index
+ render 'errors/omniauth_error', layout: 'errors', status: 200
+ end
+ end
+
+ it 'does not set a custom header' do
+ get :index
+
+ expect(response.headers['X-GitLab-Custom-Error']).to be_nil
+ end
+ end
+
+ context 'given a json response' do
+ controller do
+ def index
+ render json: {}, status: :unprocessable_entity
+ end
+ end
+
+ it 'does not set a custom header' do
+ get :index, format: :json
+
+ expect(response.headers['X-GitLab-Custom-Error']).to be_nil
+ end
+ end
+
+ context 'given a json response for an html request' do
+ controller do
+ def index
+ render json: {}, status: :unprocessable_entity
+ end
+ end
+
+ it 'does not set a custom header' do
+ get :index
+
+ expect(response.headers['X-GitLab-Custom-Error']).to be_nil
+ end
+ end
+ end
+
+ context 'control headers' do
+ controller(described_class) do
+ def index
+ render json: :ok
+ end
+ end
+
+ context 'user not logged in' do
+ it 'sets the default headers' do
+ get :index
+
+ expect(response.headers['Cache-Control']).to be_nil
+ end
+ end
+
+ context 'user logged in' do
+ it 'sets the default headers' do
+ sign_in(user)
+
+ get :index
+
+ expect(response.headers['Cache-Control']).to eq 'max-age=0, private, must-revalidate, no-store'
+ end
+ end
end
end
diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb
index 2c59d1929a1..883bb35f396 100644
--- a/spec/controllers/autocomplete_controller_spec.rb
+++ b/spec/controllers/autocomplete_controller_spec.rb
@@ -274,14 +274,11 @@ describe AutocompleteController do
context 'authorized projects apply limit' do
before do
- authorized_project2 = create(:project)
- authorized_project3 = create(:project)
-
- authorized_project.add_maintainer(user)
- authorized_project2.add_maintainer(user)
- authorized_project3.add_maintainer(user)
+ allow(Kaminari.config).to receive(:default_per_page).and_return(2)
- stub_const 'MoveToProjectFinder::PAGE_SIZE', 2
+ create_list(:project, 2) do |project|
+ project.add_maintainer(user)
+ end
end
describe 'GET #projects with project ID' do
@@ -291,7 +288,7 @@ describe AutocompleteController do
it 'returns projects' do
expect(json_response).to be_kind_of(Array)
- expect(json_response.size).to eq 2 # Of a total of 3
+ expect(json_response.size).to eq(Kaminari.config.default_per_page)
end
end
end
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index d98e6ff0df8..98946e4287b 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -30,6 +30,15 @@ describe Boards::IssuesController do
context 'when list id is present' do
context 'with valid list id' do
+ let(:group) { create(:group, :private, projects: [project]) }
+ let(:group_board) { create(:board, group: group) }
+ let!(:list3) { create(:list, board: group_board, label: development, position: 2) }
+ let(:sub_group_1) { create(:group, :private, parent: group) }
+
+ before do
+ group.add_maintainer(user)
+ end
+
it 'returns issues that have the list label applied' do
issue = create(:labeled_issue, project: project, labels: [planning])
create(:labeled_issue, project: project, labels: [planning])
@@ -56,6 +65,39 @@ describe Boards::IssuesController do
expect { list_issues(user: user, board: board, list: list2) }.not_to exceed_query_limit(control_count)
end
+
+ it 'avoids N+1 database queries when adding a project', :request_store do
+ create(:labeled_issue, project: project, labels: [development])
+ control_count = ActiveRecord::QueryRecorder.new { list_issues(user: user, board: group_board, list: list3) }.count
+
+ 2.times do
+ p = create(:project, group: group)
+ create(:labeled_issue, project: p, labels: [development])
+ end
+
+ project_2 = create(:project, group: group)
+ create(:labeled_issue, project: project_2, labels: [development], assignees: [johndoe])
+
+ # because each issue without relative_position must be updated with
+ # a different value, we have 8 extra queries per issue
+ expect { list_issues(user: user, board: group_board, list: list3) }.not_to exceed_query_limit(control_count + (2 * 8 - 1))
+ end
+
+ it 'avoids N+1 database queries when adding a subgroup, project, and issue', :nested_groups do
+ create(:project, group: sub_group_1)
+ create(:labeled_issue, project: project, labels: [development])
+ control_count = ActiveRecord::QueryRecorder.new { list_issues(user: user, board: group_board, list: list3) }.count
+ project_2 = create(:project, group: group)
+
+ 2.times do
+ p = create(:project, group: sub_group_1)
+ create(:labeled_issue, project: p, labels: [development])
+ end
+
+ create(:labeled_issue, project: project_2, labels: [development], assignees: [johndoe])
+
+ expect { list_issues(user: user, board: group_board, list: list3) }.not_to exceed_query_limit(control_count + (2 * 8 - 1))
+ end
end
context 'with invalid list id' do
@@ -102,12 +144,15 @@ describe Boards::IssuesController do
sign_in(user)
params = {
- namespace_id: project.namespace.to_param,
- project_id: project,
board_id: board.to_param,
list_id: list.try(:to_param)
}
+ unless board.try(:parent)&.is_a?(Group)
+ params[:namespace_id] = project.namespace.to_param
+ params[:project_id] = project
+ end
+
get :index, params.compact
end
end
@@ -163,11 +208,22 @@ describe Boards::IssuesController do
end
end
- context 'with unauthorized user' do
- it 'returns a forbidden 403 response' do
- create_issue user: guest, board: board, list: list1, title: 'New issue'
+ context 'with guest user' do
+ context 'in open list' do
+ it 'returns a successful 200 response' do
+ open_list = board.lists.create(list_type: :backlog)
+ create_issue user: guest, board: board, list: open_list, title: 'New issue'
- expect(response).to have_gitlab_http_status(403)
+ expect(response).to have_gitlab_http_status(200)
+ end
+ end
+
+ context 'in label list' do
+ it 'returns a forbidden 403 response' do
+ create_issue user: guest, board: board, list: list1, title: 'New issue'
+
+ expect(response).to have_gitlab_http_status(403)
+ end
end
end
diff --git a/spec/controllers/concerns/issuable_collections_spec.rb b/spec/controllers/concerns/issuable_collections_spec.rb
index c1f42bbb9d7..e93c923fd39 100644
--- a/spec/controllers/concerns/issuable_collections_spec.rb
+++ b/spec/controllers/concerns/issuable_collections_spec.rb
@@ -21,6 +21,34 @@ describe IssuableCollections do
controller
end
+ describe '#set_set_order_from_cookie' do
+ describe 'when sort param given' do
+ let(:cookies) { {} }
+ let(:params) { { sort: 'downvotes_asc' } }
+
+ it 'sets the cookie with the right values and flags' do
+ allow(controller).to receive(:cookies).and_return(cookies)
+
+ controller.send(:set_sort_order_from_cookie)
+
+ expect(cookies['issue_sort']).to eq({ value: 'popularity', secure: false, httponly: false })
+ end
+ end
+
+ describe 'when cookie exists' do
+ let(:cookies) { { 'issue_sort' => 'id_asc' } }
+ let(:params) { {} }
+
+ it 'sets the cookie with the right values and flags' do
+ allow(controller).to receive(:cookies).and_return(cookies)
+
+ controller.send(:set_sort_order_from_cookie)
+
+ expect(cookies['issue_sort']).to eq({ value: 'created_asc', secure: false, httponly: false })
+ end
+ end
+ end
+
describe '#page_count_for_relation' do
let(:params) { { state: 'opened' } }
@@ -32,7 +60,7 @@ describe IssuableCollections do
end
end
- describe '#filter_params' do
+ describe '#finder_options' do
let(:params) do
{
assignee_id: '1',
@@ -56,25 +84,20 @@ describe IssuableCollections do
}
end
- it 'filters params' do
+ it 'only allows whitelisted params' do
allow(controller).to receive(:cookies).and_return({})
- filtered_params = controller.send(:filter_params)
+ finder_options = controller.send(:finder_options)
- expect(filtered_params).to eq({
+ expect(finder_options).to eq({
'assignee_id' => '1',
'assignee_username' => 'user1',
'author_id' => '2',
'author_username' => 'user2',
- 'authorized_only' => 'true',
- 'due_date' => '2017-01-01',
- 'group_id' => '3',
- 'iids' => '4',
'label_name' => 'foo',
'milestone_title' => 'bar',
'my_reaction_emoji' => 'thumbsup',
- 'non_archived' => 'true',
- 'project_id' => '5',
+ 'due_date' => '2017-01-01',
'scope' => 'all',
'search' => 'baz',
'sort' => 'priority',
diff --git a/spec/controllers/concerns/send_file_upload_spec.rb b/spec/controllers/concerns/send_file_upload_spec.rb
index 58bb91a0c80..379b2d6b935 100644
--- a/spec/controllers/concerns/send_file_upload_spec.rb
+++ b/spec/controllers/concerns/send_file_upload_spec.rb
@@ -28,8 +28,9 @@ describe SendFileUpload do
describe '#send_upload' do
let(:controller) { controller_class.new }
let(:temp_file) { Tempfile.new('test') }
+ let(:params) { {} }
- subject { controller.send_upload(uploader) }
+ subject { controller.send_upload(uploader, **params) }
before do
FileUtils.touch(temp_file)
@@ -52,7 +53,7 @@ describe SendFileUpload do
end
context 'with attachment' do
- subject { controller.send_upload(uploader, attachment: 'test.js') }
+ let(:params) { { attachment: 'test.js' } }
it 'sends a file with content-type of text/plain' do
expected_params = {
@@ -64,6 +65,28 @@ describe SendFileUpload do
subject
end
+
+ context 'with a proxied file in object storage' do
+ before do
+ stub_uploads_object_storage(uploader: uploader_class)
+ uploader.object_store = ObjectStorage::Store::REMOTE
+ uploader.store!(temp_file)
+ allow(Gitlab.config.uploads.object_store).to receive(:proxy_download) { true }
+ end
+
+ it 'sends a file with a custom type' do
+ headers = double
+ expected_headers = %r(response-content-disposition=attachment%3Bfilename%3D%22test.js%22&response-content-type=application/ecmascript)
+ expect(Gitlab::Workhorse).to receive(:send_url).with(expected_headers).and_call_original
+ expect(headers).to receive(:store).with(Gitlab::Workhorse::SEND_DATA_HEADER, /^send-url:/)
+
+ expect(controller).not_to receive(:send_file)
+ expect(controller).to receive(:headers) { headers }
+ expect(controller).to receive(:head).with(:ok)
+
+ subject
+ end
+ end
end
context 'when remote file is used' do
@@ -73,14 +96,15 @@ describe SendFileUpload do
uploader.store!(temp_file)
end
- context 'and proxying is enabled' do
- before do
- allow(Gitlab.config.uploads.object_store).to receive(:proxy_download) { true }
- end
-
+ shared_examples 'proxied file' do
it 'sends a file' do
headers = double
+ expect(Gitlab::Workhorse).not_to receive(:send_url).with(/response-content-disposition/)
+ expect(Gitlab::Workhorse).not_to receive(:send_url).with(/response-content-type/)
+ expect(Gitlab::Workhorse).to receive(:send_url).and_call_original
+
expect(headers).to receive(:store).with(Gitlab::Workhorse::SEND_DATA_HEADER, /^send-url:/)
+ expect(controller).not_to receive(:send_file)
expect(controller).to receive(:headers) { headers }
expect(controller).to receive(:head).with(:ok)
@@ -88,6 +112,14 @@ describe SendFileUpload do
end
end
+ context 'and proxying is enabled' do
+ before do
+ allow(Gitlab.config.uploads.object_store).to receive(:proxy_download) { true }
+ end
+
+ it_behaves_like 'proxied file'
+ end
+
context 'and proxying is disabled' do
before do
allow(Gitlab.config.uploads.object_store).to receive(:proxy_download) { false }
@@ -98,6 +130,12 @@ describe SendFileUpload do
subject
end
+
+ context 'with proxy requested' do
+ let(:params) { { proxy: true } }
+
+ it_behaves_like 'proxied file'
+ end
end
end
end
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index 505c040b5d5..278b980b6d8 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -3,9 +3,11 @@ require 'spec_helper'
describe Dashboard::MilestonesController do
let(:project) { create(:project) }
let(:group) { create(:group) }
+ let(:public_group) { create(:group, :public) }
let(:user) { create(:user) }
let(:project_milestone) { create(:milestone, project: project) }
let(:group_milestone) { create(:milestone, group: group) }
+ let!(:public_milestone) { create(:milestone, group: public_group) }
let(:milestone) do
DashboardMilestone.build(
[project],
@@ -43,13 +45,22 @@ describe Dashboard::MilestonesController do
end
describe "#index" do
- it 'should contain group and project milestones' do
+ render_views
+
+ it 'returns group and project milestones to which the user belongs' do
get :index, format: :json
expect(response).to have_gitlab_http_status(200)
expect(json_response.size).to eq(2)
- expect(json_response.map { |i| i["first_milestone"]["id"] }).to include(group_milestone.id, project_milestone.id)
- expect(json_response.map { |i| i["group_name"] }).to include(group.name)
+ expect(json_response.map { |i| i["first_milestone"]["id"] }).to match_array([group_milestone.id, project_milestone.id])
+ expect(json_response.map { |i| i["group_name"] }.compact).to match_array(group.name)
+ end
+
+ it 'should contain group and project milestones to which the user belongs to' do
+ get :index
+
+ expect(response.body).to include("Open\n<span class=\"badge badge-pill\">3</span>")
+ expect(response.body).to include("Closed\n<span class=\"badge badge-pill\">0</span>")
end
end
end
diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb
index bf41aa0706f..99429c93b82 100644
--- a/spec/controllers/groups/boards_controller_spec.rb
+++ b/spec/controllers/groups/boards_controller_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Groups::BoardsController do
let(:group) { create(:group) }
- let(:user) { create(:user) }
+ let(:user) { create(:user) }
before do
group.add_maintainer(user)
@@ -22,6 +22,28 @@ describe Groups::BoardsController do
expect(response.content_type).to eq 'text/html'
end
+ it 'redirects to latest visited board' do
+ board = create(:board, group: group)
+ create(:board_group_recent_visit, group: board.group, board: board, user: user)
+
+ list_boards
+
+ expect(response).to redirect_to(group_board_path(id: board.id))
+ end
+
+ it 'renders template if visited board is not found' do
+ temporary_board = create(:board, group: group)
+ visited = create(:board_group_recent_visit, group: temporary_board.group, board: temporary_board, user: user)
+ temporary_board.delete
+
+ allow_any_instance_of(Boards::Visits::LatestService).to receive(:execute).and_return(visited)
+
+ list_boards
+
+ expect(response).to render_template :index
+ expect(response.content_type).to eq 'text/html'
+ end
+
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
@@ -35,12 +57,30 @@ describe Groups::BoardsController do
expect(response.content_type).to eq 'text/html'
end
end
+
+ context 'when user is signed out' do
+ let(:group) { create(:group, :public) }
+
+ it 'renders template' do
+ sign_out(user)
+
+ board = create(:board, group: group)
+ create(:board_group_recent_visit, group: board.group, board: board, user: user)
+
+ list_boards
+
+ expect(response).to render_template :index
+ expect(response.content_type).to eq 'text/html'
+ end
+ end
end
context 'when format is JSON' do
it 'return an array with one group board' do
create(:board, group: group)
+ expect(Boards::Visits::LatestService).not_to receive(:new)
+
list_boards format: :json
parsed_response = JSON.parse(response.body)
@@ -74,7 +114,7 @@ describe Groups::BoardsController do
context 'when format is HTML' do
it 'renders template' do
- read_board board: board
+ expect { read_board board: board }.to change(BoardGroupRecentVisit, :count).by(1)
expect(response).to render_template :show
expect(response.content_type).to eq 'text/html'
@@ -93,10 +133,25 @@ describe Groups::BoardsController do
expect(response.content_type).to eq 'text/html'
end
end
+
+ context 'when user is signed out' do
+ let(:group) { create(:group, :public) }
+
+ it 'does not save visit' do
+ sign_out(user)
+
+ expect { read_board board: board }.to change(BoardGroupRecentVisit, :count).by(0)
+
+ expect(response).to render_template :show
+ expect(response.content_type).to eq 'text/html'
+ end
+ end
end
context 'when format is JSON' do
it 'returns project board' do
+ expect(Boards::Visits::CreateService).not_to receive(:new)
+
read_board board: board, format: :json
expect(response).to match_response_schema('board')
diff --git a/spec/controllers/groups/clusters/applications_controller_spec.rb b/spec/controllers/groups/clusters/applications_controller_spec.rb
new file mode 100644
index 00000000000..68a798542b6
--- /dev/null
+++ b/spec/controllers/groups/clusters/applications_controller_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Groups::Clusters::ApplicationsController do
+ include AccessMatchersForController
+
+ def current_application
+ Clusters::Cluster::APPLICATIONS[application]
+ end
+
+ describe 'POST create' do
+ let(:cluster) { create(:cluster, :group, :provided_by_gcp) }
+ let(:group) { cluster.group }
+ let(:application) { 'helm' }
+ let(:params) { { application: application, id: cluster.id } }
+
+ describe 'functionality' do
+ let(:user) { create(:user) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+ end
+
+ it 'schedule an application installation' do
+ expect(ClusterInstallAppWorker).to receive(:perform_async).with(application, anything).once
+
+ expect { go }.to change { current_application.count }
+ expect(response).to have_http_status(:no_content)
+ expect(cluster.application_helm).to be_scheduled
+ end
+
+ context 'when cluster do not exists' do
+ before do
+ cluster.destroy!
+ end
+
+ it 'return 404' do
+ expect { go }.not_to change { current_application.count }
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+
+ context 'when application is unknown' do
+ let(:application) { 'unkwnown-app' }
+
+ it 'return 404' do
+ go
+
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+
+ context 'when application is already installing' do
+ before do
+ create(:clusters_applications_helm, :installing, cluster: cluster)
+ end
+
+ it 'returns 400' do
+ go
+
+ expect(response).to have_http_status(:bad_request)
+ end
+ end
+ end
+
+ describe 'security' do
+ before do
+ allow(ClusterInstallAppWorker).to receive(:perform_async)
+ end
+
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+
+ def go
+ post :create, params.merge(group_id: group)
+ end
+ end
+end
diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb
new file mode 100644
index 00000000000..6e130f830a2
--- /dev/null
+++ b/spec/controllers/groups/clusters_controller_spec.rb
@@ -0,0 +1,574 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Groups::ClustersController do
+ include AccessMatchersForController
+ include GoogleApi::CloudPlatformHelpers
+
+ set(:group) { create(:group) }
+
+ let(:user) { create(:user) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+ end
+
+ describe 'GET index' do
+ def go(params = {})
+ get :index, params.reverse_merge(group_id: group)
+ end
+
+ context 'when feature flag is not enabled' do
+ before do
+ stub_feature_flags(group_clusters: false)
+ end
+
+ it 'renders 404' do
+ go
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context 'when feature flag is enabled' do
+ before do
+ stub_feature_flags(group_clusters: true)
+ end
+
+ describe 'functionality' do
+ context 'when group has one or more clusters' do
+ let(:group) { create(:group) }
+
+ let!(:enabled_cluster) do
+ create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group])
+ end
+
+ let!(:disabled_cluster) do
+ create(:cluster, :disabled, :provided_by_gcp, :production_environment, cluster_type: :group_type, groups: [group])
+ end
+
+ it 'lists available clusters' do
+ go
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index)
+ expect(assigns(:clusters)).to match_array([enabled_cluster, disabled_cluster])
+ end
+
+ context 'when page is specified' do
+ let(:last_page) { group.clusters.page.total_pages }
+
+ before do
+ allow(Clusters::Cluster).to receive(:paginates_per).and_return(1)
+ create_list(:cluster, 2, :provided_by_gcp, :production_environment, cluster_type: :group_type, groups: [group])
+ end
+
+ it 'redirects to the page' do
+ go(page: last_page)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:clusters).current_page).to eq(last_page)
+ end
+ end
+ end
+
+ context 'when group does not have a cluster' do
+ let(:group) { create(:group) }
+
+ it 'returns an empty state page' do
+ go
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index, partial: :empty_state)
+ expect(assigns(:clusters)).to eq([])
+ end
+ end
+ end
+ end
+
+ describe 'security' do
+ let(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
+
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'GET new' do
+ def go
+ get :new, group_id: group
+ end
+
+ describe 'functionality for new cluster' do
+ context 'when omniauth has been configured' do
+ let(:key) { 'secret-key' }
+ let(:session_key_for_redirect_uri) do
+ GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(key)
+ end
+
+ before do
+ allow(SecureRandom).to receive(:hex).and_return(key)
+ end
+
+ it 'has authorize_url' do
+ go
+
+ expect(assigns(:authorize_url)).to include(key)
+ expect(session[session_key_for_redirect_uri]).to eq(new_group_cluster_path(group))
+ end
+ end
+
+ context 'when omniauth has not configured' do
+ before do
+ stub_omniauth_setting(providers: [])
+ end
+
+ it 'does not have authorize_url' do
+ go
+
+ expect(assigns(:authorize_url)).to be_nil
+ end
+ end
+
+ context 'when access token is valid' do
+ before do
+ stub_google_api_validate_token
+ end
+
+ it 'has new object' do
+ go
+
+ expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
+ end
+ end
+
+ context 'when access token is expired' do
+ before do
+ stub_google_api_expired_token
+ end
+
+ it { expect(@valid_gcp_token).to be_falsey }
+ end
+
+ context 'when access token is not stored in session' do
+ it { expect(@valid_gcp_token).to be_falsey }
+ end
+ end
+
+ describe 'functionality for existing cluster' do
+ it 'has new object' do
+ go
+
+ expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
+ end
+ end
+
+ describe 'security' do
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'POST create for new cluster' do
+ let(:legacy_abac_param) { 'true' }
+ let(:params) do
+ {
+ cluster: {
+ name: 'new-cluster',
+ provider_gcp_attributes: {
+ gcp_project_id: 'gcp-project-12345',
+ legacy_abac: legacy_abac_param
+ }
+ }
+ }
+ end
+
+ def go
+ post :create_gcp, params.merge(group_id: group)
+ end
+
+ describe 'functionality' do
+ context 'when access token is valid' do
+ before do
+ stub_google_api_validate_token
+ end
+
+ it 'creates a new cluster' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Providers::Gcp.count }
+
+ cluster = group.clusters.first
+
+ expect(response).to redirect_to(group_cluster_path(group, cluster))
+ expect(cluster).to be_gcp
+ expect(cluster).to be_kubernetes
+ expect(cluster.provider_gcp).to be_legacy_abac
+ end
+
+ context 'when legacy_abac param is false' do
+ let(:legacy_abac_param) { 'false' }
+
+ it 'creates a new cluster with legacy_abac_disabled' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Providers::Gcp.count }
+ expect(group.clusters.first.provider_gcp).not_to be_legacy_abac
+ end
+ end
+ end
+
+ context 'when access token is expired' do
+ before do
+ stub_google_api_expired_token
+ end
+
+ it { expect(@valid_gcp_token).to be_falsey }
+ end
+
+ context 'when access token is not stored in session' do
+ it { expect(@valid_gcp_token).to be_falsey }
+ end
+ end
+
+ describe 'security' do
+ before do
+ allow_any_instance_of(described_class)
+ .to receive(:token_in_session).and_return('token')
+ allow_any_instance_of(described_class)
+ .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
+ allow_any_instance_of(GoogleApi::CloudPlatform::Client)
+ .to receive(:projects_zones_clusters_create) do
+ OpenStruct.new(
+ self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
+ status: 'RUNNING'
+ )
+ end
+
+ allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
+ end
+
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'POST create for existing cluster' do
+ let(:params) do
+ {
+ cluster: {
+ name: 'new-cluster',
+ platform_kubernetes_attributes: {
+ api_url: 'http://my-url',
+ token: 'test'
+ }
+ }
+ }
+ end
+
+ def go
+ post :create_user, params.merge(group_id: group)
+ end
+
+ describe 'functionality' do
+ context 'when creates a cluster' do
+ it 'creates a new cluster' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
+
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Platforms::Kubernetes.count }
+
+ cluster = group.clusters.first
+
+ expect(response).to redirect_to(group_cluster_path(group, cluster))
+ expect(cluster).to be_user
+ expect(cluster).to be_kubernetes
+ end
+ end
+
+ context 'when creates a RBAC-enabled cluster' do
+ let(:params) do
+ {
+ cluster: {
+ name: 'new-cluster',
+ platform_kubernetes_attributes: {
+ api_url: 'http://my-url',
+ token: 'test',
+ authorization_type: 'rbac'
+ }
+ }
+ }
+ end
+
+ it 'creates a new cluster' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
+
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Platforms::Kubernetes.count }
+
+ cluster = group.clusters.first
+
+ expect(response).to redirect_to(group_cluster_path(group, cluster))
+ expect(cluster).to be_user
+ expect(cluster).to be_kubernetes
+ expect(cluster).to be_platform_kubernetes_rbac
+ end
+ end
+ end
+
+ describe 'security' do
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'GET cluster_status' do
+ let(:cluster) { create(:cluster, :providing_by_gcp, cluster_type: :group_type, groups: [group]) }
+
+ def go
+ get :cluster_status,
+ group_id: group.to_param,
+ id: cluster,
+ format: :json
+ end
+
+ describe 'functionality' do
+ it 'responds with matching schema' do
+ go
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('cluster_status')
+ end
+
+ it 'invokes schedule_status_update on each application' do
+ expect_any_instance_of(Clusters::Applications::Ingress).to receive(:schedule_status_update)
+
+ go
+ end
+ end
+
+ describe 'security' do
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'GET show' do
+ let(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
+
+ def go
+ get :show,
+ group_id: group,
+ id: cluster
+ end
+
+ describe 'functionality' do
+ it 'renders view' do
+ go
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:cluster)).to eq(cluster)
+ end
+ end
+
+ describe 'security' do
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'PUT update' do
+ def go(format: :html)
+ put :update, params.merge(
+ group_id: group.to_param,
+ id: cluster,
+ format: format
+ )
+ end
+
+ let(:cluster) { create(:cluster, :provided_by_user, cluster_type: :group_type, groups: [group]) }
+
+ let(:params) do
+ {
+ cluster: {
+ enabled: false,
+ name: 'my-new-cluster-name'
+ }
+ }
+ end
+
+ it 'updates and redirects back to show page' do
+ go
+
+ cluster.reload
+ expect(response).to redirect_to(group_cluster_path(group, cluster))
+ expect(flash[:notice]).to eq('Kubernetes cluster was successfully updated.')
+ expect(cluster.enabled).to be_falsey
+ expect(cluster.name).to eq('my-new-cluster-name')
+ end
+
+ context 'when format is json' do
+ context 'when changing parameters' do
+ context 'when valid parameters are used' do
+ let(:params) do
+ {
+ cluster: {
+ enabled: false,
+ name: 'my-new-cluster-name'
+ }
+ }
+ end
+
+ it 'updates and redirects back to show page' do
+ go(format: :json)
+
+ cluster.reload
+ expect(response).to have_http_status(:no_content)
+ expect(cluster.enabled).to be_falsey
+ expect(cluster.name).to eq('my-new-cluster-name')
+ end
+ end
+
+ context 'when invalid parameters are used' do
+ let(:params) do
+ {
+ cluster: {
+ enabled: false,
+ name: ''
+ }
+ }
+ end
+
+ it 'rejects changes' do
+ go(format: :json)
+
+ expect(response).to have_http_status(:bad_request)
+ end
+ end
+ end
+ end
+
+ describe 'security' do
+ set(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
+
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ describe 'DELETE destroy' do
+ let!(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, cluster_type: :group_type, groups: [group]) }
+
+ def go
+ delete :destroy,
+ group_id: group,
+ id: cluster
+ end
+
+ describe 'functionality' do
+ context 'when cluster is provided by GCP' do
+ context 'when cluster is created' do
+ it 'destroys and redirects back to clusters list' do
+ expect { go }
+ .to change { Clusters::Cluster.count }.by(-1)
+ .and change { Clusters::Platforms::Kubernetes.count }.by(-1)
+ .and change { Clusters::Providers::Gcp.count }.by(-1)
+
+ expect(response).to redirect_to(group_clusters_path(group))
+ expect(flash[:notice]).to eq('Kubernetes cluster integration was successfully removed.')
+ end
+ end
+
+ context 'when cluster is being created' do
+ let!(:cluster) { create(:cluster, :providing_by_gcp, :production_environment, cluster_type: :group_type, groups: [group]) }
+
+ it 'destroys and redirects back to clusters list' do
+ expect { go }
+ .to change { Clusters::Cluster.count }.by(-1)
+ .and change { Clusters::Providers::Gcp.count }.by(-1)
+
+ expect(response).to redirect_to(group_clusters_path(group))
+ expect(flash[:notice]).to eq('Kubernetes cluster integration was successfully removed.')
+ end
+ end
+ end
+
+ context 'when cluster is provided by user' do
+ let!(:cluster) { create(:cluster, :provided_by_user, :production_environment, cluster_type: :group_type, groups: [group]) }
+
+ it 'destroys and redirects back to clusters list' do
+ expect { go }
+ .to change { Clusters::Cluster.count }.by(-1)
+ .and change { Clusters::Platforms::Kubernetes.count }.by(-1)
+ .and change { Clusters::Providers::Gcp.count }.by(0)
+
+ expect(response).to redirect_to(group_clusters_path(group))
+ expect(flash[:notice]).to eq('Kubernetes cluster integration was successfully removed.')
+ end
+ end
+ end
+
+ describe 'security' do
+ set(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, cluster_type: :group_type, groups: [group]) }
+
+ it { expect { go }.to be_allowed_for(:admin) }
+ it { expect { go }.to be_allowed_for(:owner).of(group) }
+ it { expect { go }.to be_allowed_for(:maintainer).of(group) }
+ it { expect { go }.to be_denied_for(:developer).of(group) }
+ it { expect { go }.to be_denied_for(:reporter).of(group) }
+ it { expect { go }.to be_denied_for(:guest).of(group) }
+ it { expect { go }.to be_denied_for(:user) }
+ it { expect { go }.to be_denied_for(:external) }
+ end
+ end
+
+ context 'no group_id param' do
+ it 'does not respond to any action without group_id param' do
+ expect { get :index }.to raise_error(ActionController::UrlGenerationError)
+ end
+ end
+end
diff --git a/spec/controllers/groups/milestones_controller_spec.rb b/spec/controllers/groups/milestones_controller_spec.rb
index f7068546093..42723bb3820 100644
--- a/spec/controllers/groups/milestones_controller_spec.rb
+++ b/spec/controllers/groups/milestones_controller_spec.rb
@@ -63,7 +63,7 @@ describe Groups::MilestonesController do
let(:group_milestone) { create(:milestone, group: group) }
context 'when there is a title parameter' do
- it 'searchs for a legacy group milestone' do
+ it 'searches for a legacy group milestone' do
expect(GlobalMilestone).to receive(:build)
expect(Milestone).not_to receive(:find_by_iid)
@@ -72,7 +72,7 @@ describe Groups::MilestonesController do
end
context 'when there is not a title parameter' do
- it 'searchs for a group milestone' do
+ it 'searches for a group milestone' do
expect(GlobalMilestone).not_to receive(:build)
expect(Milestone).to receive(:find_by_iid)
@@ -141,6 +141,17 @@ describe Groups::MilestonesController do
end
end
+ describe "#destroy" do
+ let(:milestone) { create(:milestone, group: group) }
+
+ it "removes milestone" do
+ delete :destroy, group_id: group.to_param, id: milestone.iid, format: :js
+
+ expect(response).to be_success
+ expect { Milestone.find(milestone.id) }.to raise_exception(ActiveRecord::RecordNotFound)
+ end
+ end
+
describe '#ensure_canonical_path' do
before do
sign_in(user)
diff --git a/spec/controllers/groups/settings/ci_cd_controller_spec.rb b/spec/controllers/groups/settings/ci_cd_controller_spec.rb
index ea18122e0c3..06ccace8242 100644
--- a/spec/controllers/groups/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/groups/settings/ci_cd_controller_spec.rb
@@ -17,4 +17,18 @@ describe Groups::Settings::CiCdController do
expect(response).to render_template(:show)
end
end
+
+ describe 'PUT #reset_registration_token' do
+ subject { put :reset_registration_token, group_id: group }
+
+ it 'resets runner registration token' do
+ expect { subject }.to change { group.reload.runners_token }
+ end
+
+ it 'redirects the user to admin runners page' do
+ subject
+
+ expect(response).to redirect_to(group_settings_ci_cd_path)
+ end
+ end
end
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index 7a037828035..4de61b65f71 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -38,14 +38,6 @@ describe GroupsController do
project
end
- context 'as html' do
- it 'assigns whether or not a group has children' do
- get :show, id: group.to_param
-
- expect(assigns(:has_children)).to be_truthy
- end
- end
-
context 'as atom' do
it 'assigns events for all the projects in the group' do
create(:event, project: project)
@@ -57,6 +49,16 @@ describe GroupsController do
end
end
+ describe 'GET edit' do
+ it 'sets the badge API endpoint' do
+ sign_in(owner)
+
+ get :edit, id: group.to_param
+
+ expect(assigns(:badge_api_endpoint)).not_to be_nil
+ end
+ end
+
describe 'GET #new' do
context 'when creating subgroups', :nested_groups do
[true, false].each do |can_create_group_status|
@@ -200,8 +202,8 @@ describe GroupsController do
end
describe 'GET #issues' do
- let(:issue_1) { create(:issue, project: project) }
- let(:issue_2) { create(:issue, project: project) }
+ let(:issue_1) { create(:issue, project: project, title: 'foo') }
+ let(:issue_2) { create(:issue, project: project, title: 'bar') }
before do
create_list(:award_emoji, 3, awardable: issue_2)
@@ -222,6 +224,31 @@ describe GroupsController do
expect(assigns(:issues)).to eq [issue_2, issue_1]
end
end
+
+ context 'searching' do
+ # Remove as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/52271
+ before do
+ stub_feature_flags(use_cte_for_group_issues_search: false)
+ end
+
+ it 'works with popularity sort' do
+ get :issues, id: group.to_param, search: 'foo', sort: 'popularity'
+
+ expect(assigns(:issues)).to eq([issue_1])
+ end
+
+ it 'works with priority sort' do
+ get :issues, id: group.to_param, search: 'foo', sort: 'priority'
+
+ expect(assigns(:issues)).to eq([issue_1])
+ end
+
+ it 'works with label priority sort' do
+ get :issues, id: group.to_param, search: 'foo', sort: 'label_priority'
+
+ expect(assigns(:issues)).to eq([issue_1])
+ end
+ end
end
describe 'GET #merge_requests' do
@@ -502,7 +529,7 @@ describe GroupsController do
sign_in(user)
end
- context 'when transfering to a subgroup goes right' do
+ context 'when transferring to a subgroup goes right' do
let(:new_parent_group) { create(:group, :public) }
let!(:group_member) { create(:group_member, :owner, group: group, user: user) }
let!(:new_parent_group_member) { create(:group_member, :owner, group: new_parent_group, user: user) }
diff --git a/spec/controllers/health_controller_spec.rb b/spec/controllers/health_controller_spec.rb
index d800ad7c187..ec73c89cb11 100644
--- a/spec/controllers/health_controller_spec.rb
+++ b/spec/controllers/health_controller_spec.rb
@@ -14,48 +14,6 @@ describe HealthController do
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
end
- describe '#storage_check' do
- before do
- allow(Gitlab::RequestContext).to receive(:client_ip).and_return(whitelisted_ip)
- end
-
- subject { post :storage_check }
-
- it 'checks all the configured storages' do
- expect(Gitlab::Git::Storage::Checker).to receive(:check_all).and_call_original
-
- subject
- end
-
- it 'returns the check interval' do
- stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'true')
- stub_application_setting(circuitbreaker_check_interval: 10)
-
- subject
-
- expect(json_response['check_interval']).to eq(10)
- end
-
- context 'with failing storages', :broken_storage do
- before do
- stub_storage_settings(
- broken: { path: 'tmp/tests/non-existent-repositories' }
- )
- end
-
- it 'includes the failure information' do
- subject
-
- expected_results = [
- { 'storage' => 'broken', 'success' => false },
- { 'storage' => 'default', 'success' => true }
- ]
-
- expect(json_response['results']).to eq(expected_results)
- end
- end
- end
-
describe '#readiness' do
shared_context 'endpoint responding with readiness data' do
let(:request_params) { {} }
diff --git a/spec/controllers/import/bitbucket_server_controller_spec.rb b/spec/controllers/import/bitbucket_server_controller_spec.rb
index 5024ef71771..77060fdc3be 100644
--- a/spec/controllers/import/bitbucket_server_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_server_controller_spec.rb
@@ -121,12 +121,19 @@ describe Import::BitbucketServerController do
@repo = double(slug: 'vim', project_key: 'asd', full_name: 'asd/vim', "valid?" => true, project_name: 'asd', browse_url: 'http://test', name: 'vim')
@invalid_repo = double(slug: 'invalid', project_key: 'foobar', full_name: 'asd/foobar', "valid?" => false, browse_url: 'http://bad-repo')
+ @created_repo = double(slug: 'created', project_key: 'existing', full_name: 'group/created', "valid?" => true, browse_url: 'http://existing')
assign_session_tokens
end
it 'assigns repository categories' do
- created_project = create(:project, import_type: 'bitbucket_server', creator_id: user.id, import_source: 'foo/bar', import_status: 'finished')
- expect(client).to receive(:repos).and_return([@repo, @invalid_repo])
+ created_project = create(:project, import_type: 'bitbucket_server', creator_id: user.id, import_status: 'finished', import_source: @created_repo.browse_url)
+ repos = instance_double(BitbucketServer::Collection)
+
+ expect(repos).to receive(:partition).and_return([[@repo, @created_repo], [@invalid_repo]])
+ expect(repos).to receive(:current_page).and_return(1)
+ expect(repos).to receive(:next_page).and_return(2)
+ expect(repos).to receive(:prev_page).and_return(nil)
+ expect(client).to receive(:repos).and_return(repos)
get :status
diff --git a/spec/controllers/import/gitlab_projects_controller_spec.rb b/spec/controllers/import/gitlab_projects_controller_spec.rb
index d624659bce9..cbd1a112602 100644
--- a/spec/controllers/import/gitlab_projects_controller_spec.rb
+++ b/spec/controllers/import/gitlab_projects_controller_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe Import::GitlabProjectsController do
set(:namespace) { create(:namespace) }
set(:user) { namespace.owner }
- let(:file) { fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain') }
+ let(:file) { fixture_file_upload('spec/fixtures/project_export.tar.gz', 'text/plain') }
before do
sign_in(user)
diff --git a/spec/controllers/instance_statistics/cohorts_controller_spec.rb b/spec/controllers/instance_statistics/cohorts_controller_spec.rb
index e4eedede93a..596d3c7abe5 100644
--- a/spec/controllers/instance_statistics/cohorts_controller_spec.rb
+++ b/spec/controllers/instance_statistics/cohorts_controller_spec.rb
@@ -3,5 +3,19 @@
require 'spec_helper'
describe InstanceStatistics::CohortsController do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ end
+
it_behaves_like 'instance statistics availability'
+
+ it 'renders a 404 when the usage ping is disabled' do
+ stub_application_setting(usage_ping_enabled: false)
+
+ get :index
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
diff --git a/spec/controllers/notification_settings_controller_spec.rb b/spec/controllers/notification_settings_controller_spec.rb
index e133950e684..a3356a86d4b 100644
--- a/spec/controllers/notification_settings_controller_spec.rb
+++ b/spec/controllers/notification_settings_controller_spec.rb
@@ -21,10 +21,11 @@ describe NotificationSettingsController do
end
context 'when authorized' do
+ let(:notification_setting) { user.notification_settings_for(source) }
let(:custom_events) do
events = {}
- NotificationSetting::EMAIL_EVENTS.each do |event|
+ NotificationSetting.email_events(source).each do |event|
events[event.to_s] = true
end
@@ -36,7 +37,7 @@ describe NotificationSettingsController do
end
context 'for projects' do
- let(:notification_setting) { user.notification_settings_for(project) }
+ let(:source) { project }
it 'creates notification setting' do
post :create,
@@ -67,7 +68,7 @@ describe NotificationSettingsController do
end
context 'for groups' do
- let(:notification_setting) { user.notification_settings_for(group) }
+ let(:source) { group }
it 'creates notification setting' do
post :create,
@@ -145,7 +146,7 @@ describe NotificationSettingsController do
let(:custom_events) do
events = {}
- NotificationSetting::EMAIL_EVENTS.each do |event|
+ notification_setting.email_events.each do |event|
events[event] = "true"
end
end
diff --git a/spec/controllers/oauth/applications_controller_spec.rb b/spec/controllers/oauth/applications_controller_spec.rb
index 1195f44f37d..ace8a954e92 100644
--- a/spec/controllers/oauth/applications_controller_spec.rb
+++ b/spec/controllers/oauth/applications_controller_spec.rb
@@ -15,14 +15,44 @@ describe Oauth::ApplicationsController do
expect(response).to have_gitlab_http_status(200)
end
- it 'redirects back to profile page if OAuth applications are disabled' do
- allow(Gitlab::CurrentSettings.current_application_settings).to receive(:user_oauth_applications?).and_return(false)
+ it 'shows list of applications' do
+ disable_user_oauth
get :index
+ expect(response).to have_gitlab_http_status(200)
+ end
+ end
+
+ describe 'POST #create' do
+ it 'creates an application' do
+ post :create, oauth_params
+
+ expect(response).to have_gitlab_http_status(302)
+ expect(response).to redirect_to(oauth_application_path(Doorkeeper::Application.last))
+ end
+
+ it 'redirects back to profile page if OAuth applications are disabled' do
+ disable_user_oauth
+
+ post :create, oauth_params
+
expect(response).to have_gitlab_http_status(302)
expect(response).to redirect_to(profile_path)
end
end
end
+
+ def disable_user_oauth
+ allow(Gitlab::CurrentSettings.current_application_settings).to receive(:user_oauth_applications?).and_return(false)
+ end
+
+ def oauth_params
+ {
+ doorkeeper_application: {
+ name: 'foo',
+ redirect_uri: 'http://example.org'
+ }
+ }
+ end
end
diff --git a/spec/controllers/omniauth_callbacks_controller_spec.rb b/spec/controllers/omniauth_callbacks_controller_spec.rb
index b23f183fec8..d377d69457f 100644
--- a/spec/controllers/omniauth_callbacks_controller_spec.rb
+++ b/spec/controllers/omniauth_callbacks_controller_spec.rb
@@ -95,7 +95,7 @@ describe OmniauthCallbacksController, type: :controller do
end
it 'allows linking the disabled provider' do
- user.identities.destroy_all
+ user.identities.destroy_all # rubocop: disable DestroyAll
sign_in(user)
expect { post provider }.to change { user.reload.identities.count }.by(1)
diff --git a/spec/controllers/profiles/keys_controller_spec.rb b/spec/controllers/profiles/keys_controller_spec.rb
index 363ed410bc0..ea26bc83353 100644
--- a/spec/controllers/profiles/keys_controller_spec.rb
+++ b/spec/controllers/profiles/keys_controller_spec.rb
@@ -4,7 +4,7 @@ describe Profiles::KeysController do
let(:user) { create(:user) }
describe "#get_keys" do
- describe "non existant user" do
+ describe "non existent user" do
it "does not generally work" do
get :get_keys, username: 'not-existent'
diff --git a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
index ed08a4c1bf2..f5860d4296b 100644
--- a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
+++ b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
@@ -39,8 +39,10 @@ describe Profiles::PersonalAccessTokensController do
let!(:active_personal_access_token) { create(:personal_access_token, user: user) }
let!(:inactive_personal_access_token) { create(:personal_access_token, :revoked, user: user) }
let!(:impersonation_personal_access_token) { create(:personal_access_token, :impersonation, user: user) }
+ let(:token_value) { 's3cr3t' }
before do
+ PersonalAccessToken.redis_store!(user.id, token_value)
get :index
end
@@ -56,5 +58,9 @@ describe Profiles::PersonalAccessTokensController do
expect(assigns(:active_personal_access_tokens)).not_to include(impersonation_personal_access_token)
expect(assigns(:inactive_personal_access_tokens)).not_to include(impersonation_personal_access_token)
end
+
+ it "retrieves newly created personal access token value" do
+ expect(assigns(:new_personal_access_token)).to eql(token_value)
+ end
end
end
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index 4ea6f869aa3..b3c8d6a954e 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -19,10 +19,67 @@ describe Projects::ArtifactsController do
end
describe 'GET download' do
- it 'sends the artifacts file' do
- expect(controller).to receive(:send_file).with(job.artifacts_file.path, hash_including(disposition: 'attachment')).and_call_original
+ def download_artifact(extra_params = {})
+ params = { namespace_id: project.namespace, project_id: project, job_id: job }.merge(extra_params)
- get :download, namespace_id: project.namespace, project_id: project, job_id: job
+ get :download, params
+ end
+
+ context 'when no file type is supplied' do
+ it 'sends the artifacts file' do
+ expect(controller).to receive(:send_file).with(job.artifacts_file.path, hash_including(disposition: 'attachment')).and_call_original
+
+ download_artifact
+ end
+ end
+
+ context 'when a file type is supplied' do
+ context 'when an invalid file type is supplied' do
+ let(:file_type) { 'invalid' }
+
+ it 'returns 404' do
+ download_artifact(file_type: file_type)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context 'when codequality file type is supplied' do
+ let(:file_type) { 'codequality' }
+
+ context 'when file is stored locally' do
+ before do
+ create(:ci_job_artifact, :codequality, job: job)
+ end
+
+ it 'sends the codequality report' do
+ expect(controller).to receive(:send_file).with(job.job_artifacts_codequality.file.path, hash_including(disposition: 'attachment')).and_call_original
+
+ download_artifact(file_type: file_type)
+ end
+ end
+
+ context 'when file is stored remotely' do
+ before do
+ stub_artifacts_object_storage
+ create(:ci_job_artifact, :remote_store, :codequality, job: job)
+ end
+
+ it 'sends the codequality report' do
+ expect(controller).to receive(:redirect_to).and_call_original
+
+ download_artifact(file_type: file_type)
+ end
+
+ context 'when proxied' do
+ it 'sends the codequality report' do
+ expect(Gitlab::Workhorse).to receive(:send_url).and_call_original
+
+ download_artifact(file_type: file_type, proxy: true)
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/controllers/projects/avatars_controller_spec.rb b/spec/controllers/projects/avatars_controller_spec.rb
index 17c9a61f339..14059cff74c 100644
--- a/spec/controllers/projects/avatars_controller_spec.rb
+++ b/spec/controllers/projects/avatars_controller_spec.rb
@@ -1,24 +1,55 @@
require 'spec_helper'
describe Projects::AvatarsController do
- let(:project) { create(:project, :repository, avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) }
- let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
before do
- sign_in(user)
- project.add_maintainer(user)
controller.instance_variable_set(:@project, project)
end
- it 'GET #show' do
- get :show, namespace_id: project.namespace.id, project_id: project.id
+ describe 'GET #show' do
+ subject { get :show, namespace_id: project.namespace, project_id: project }
- expect(response).to have_gitlab_http_status(404)
+ context 'when repository has no avatar' do
+ it 'shows 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context 'when repository has an avatar' do
+ before do
+ allow(project).to receive(:avatar_in_git).and_return(filepath)
+ end
+
+ context 'when the avatar is stored in the repository' do
+ let(:filepath) { 'files/images/logo-white.png' }
+
+ it 'sends the avatar' do
+ subject
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.header['Content-Type']).to eq('image/png')
+ expect(response.header[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with('git-blob:')
+ end
+ end
+
+ context 'when the avatar is stored in lfs' do
+ it_behaves_like 'repository lfs file load' do
+ let(:filename) { 'lfs_object.iso' }
+ let(:filepath) { "files/lfs/#{filename}" }
+ end
+ end
+ end
end
- it 'removes avatar from DB by calling destroy' do
- delete :destroy, namespace_id: project.namespace.id, project_id: project.id
- expect(project.avatar.present?).to be_falsey
- expect(project).to be_valid
+ describe 'DELETE #destroy' do
+ it 'removes avatar from DB by calling destroy' do
+ delete :destroy, namespace_id: project.namespace.id, project_id: project.id
+
+ expect(project.avatar.present?).to be_falsey
+ expect(project).to be_valid
+ end
end
end
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 32cd7c6e70a..5fdf7f1229d 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -157,7 +157,7 @@ describe Projects::BlobController do
match_line = JSON.parse(response.body).first
- expect(match_line['type']).to eq('context')
+ expect(match_line['type']).to be_nil
end
it 'adds bottom match line when "t"o is less than blob size' do
@@ -177,7 +177,7 @@ describe Projects::BlobController do
match_line = JSON.parse(response.body).last
- expect(match_line['type']).to eq('context')
+ expect(match_line['type']).to be_nil
end
end
end
@@ -343,4 +343,76 @@ describe Projects::BlobController do
end
end
end
+
+ describe 'DELETE destroy' do
+ let(:user) { create(:user) }
+ let(:project_root_path) { project_tree_path(project, 'master') }
+
+ before do
+ project.add_maintainer(user)
+
+ sign_in(user)
+ end
+
+ context 'for a file in a subdirectory' do
+ let(:default_params) do
+ {
+ namespace_id: project.namespace,
+ project_id: project,
+ id: 'master/files/whitespace',
+ original_branch: 'master',
+ branch_name: 'master',
+ commit_message: 'Delete whitespace'
+ }
+ end
+
+ let(:after_delete_path) { project_tree_path(project, 'master/files') }
+
+ it 'redirects to the sub directory' do
+ delete :destroy, default_params
+
+ expect(response).to redirect_to(after_delete_path)
+ end
+ end
+
+ context 'if deleted file is the last one in a subdirectory' do
+ let(:default_params) do
+ {
+ namespace_id: project.namespace,
+ project_id: project,
+ id: 'master/bar/branch-test.txt',
+ original_branch: 'master',
+ branch_name: 'master',
+ commit_message: 'Delete whitespace'
+ }
+ end
+
+ it 'redirects to the project root' do
+ delete :destroy, default_params
+
+ expect(response).to redirect_to(project_root_path)
+ end
+
+ context 'when deleting a file in a branch other than master' do
+ let(:default_params) do
+ {
+ namespace_id: project.namespace,
+ project_id: project,
+ id: 'binary-encoding/foo/bar/.gitkeep',
+ original_branch: 'binary-encoding',
+ branch_name: 'binary-encoding',
+ commit_message: 'Delete whitespace'
+ }
+ end
+
+ let(:after_delete_path) { project_tree_path(project, 'binary-encoding') }
+
+ it 'redirects to the project root of the branch' do
+ delete :destroy, default_params
+
+ expect(response).to redirect_to(after_delete_path)
+ end
+ end
+ end
+ end
end
diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb
index 096efc1c7b2..8d503f6ad32 100644
--- a/spec/controllers/projects/boards_controller_spec.rb
+++ b/spec/controllers/projects/boards_controller_spec.rb
@@ -28,6 +28,28 @@ describe Projects::BoardsController do
expect(response.content_type).to eq 'text/html'
end
+ it 'redirects to latest visited board' do
+ board = create(:board, project: project)
+ create(:board_project_recent_visit, project: board.project, board: board, user: user)
+
+ list_boards
+
+ expect(response).to redirect_to(namespace_project_board_path(id: board.id))
+ end
+
+ it 'renders template if visited board is not found' do
+ temporary_board = create(:board, project: project)
+ visited = create(:board_project_recent_visit, project: temporary_board.project, board: temporary_board, user: user)
+ temporary_board.delete
+
+ allow_any_instance_of(Boards::Visits::LatestService).to receive(:execute).and_return(visited)
+
+ list_boards
+
+ expect(response).to render_template :index
+ expect(response.content_type).to eq 'text/html'
+ end
+
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true)
@@ -41,12 +63,30 @@ describe Projects::BoardsController do
expect(response.content_type).to eq 'text/html'
end
end
+
+ context 'when user is signed out' do
+ let(:project) { create(:project, :public) }
+
+ it 'renders template' do
+ sign_out(user)
+
+ board = create(:board, project: project)
+ create(:board_project_recent_visit, project: board.project, board: board, user: user)
+
+ list_boards
+
+ expect(response).to render_template :index
+ expect(response.content_type).to eq 'text/html'
+ end
+ end
end
context 'when format is JSON' do
it 'returns a list of project boards' do
create_list(:board, 2, project: project)
+ expect(Boards::Visits::LatestService).not_to receive(:new)
+
list_boards format: :json
parsed_response = JSON.parse(response.body)
@@ -98,7 +138,7 @@ describe Projects::BoardsController do
context 'when format is HTML' do
it 'renders template' do
- read_board board: board
+ expect { read_board board: board }.to change(BoardProjectRecentVisit, :count).by(1)
expect(response).to render_template :show
expect(response.content_type).to eq 'text/html'
@@ -117,10 +157,25 @@ describe Projects::BoardsController do
expect(response.content_type).to eq 'text/html'
end
end
+
+ context 'when user is signed out' do
+ let(:project) { create(:project, :public) }
+
+ it 'does not save visit' do
+ sign_out(user)
+
+ expect { read_board board: board }.to change(BoardProjectRecentVisit, :count).by(0)
+
+ expect(response).to render_template :show
+ expect(response.content_type).to eq 'text/html'
+ end
+ end
end
context 'when format is JSON' do
it 'returns project board' do
+ expect(Boards::Visits::CreateService).not_to receive(:new)
+
read_board board: board, format: :json
expect(response).to match_response_schema('board')
diff --git a/spec/controllers/projects/clusters/applications_controller_spec.rb b/spec/controllers/projects/clusters/applications_controller_spec.rb
index 9e17e392d3d..8106453a775 100644
--- a/spec/controllers/projects/clusters/applications_controller_spec.rb
+++ b/spec/controllers/projects/clusters/applications_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Projects::Clusters::ApplicationsController do
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index 42917d0d505..483222363bb 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -1,20 +1,27 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Projects::ClustersController do
include AccessMatchersForController
include GoogleApi::CloudPlatformHelpers
+ include KubernetesHelpers
set(:project) { create(:project) }
- describe 'GET index' do
- describe 'functionality' do
- let(:user) { create(:user) }
+ let(:user) { create(:user) }
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+ describe 'GET index' do
+ def go(params = {})
+ get :index, params.reverse_merge(namespace_id: project.namespace.to_param, project_id: project)
+ end
+
+ describe 'functionality' do
context 'when project has one or more clusters' do
let(:project) { create(:project) }
let!(:enabled_cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
@@ -33,10 +40,11 @@ describe Projects::ClustersController do
before do
allow(Clusters::Cluster).to receive(:paginates_per).and_return(1)
create_list(:cluster, 2, :provided_by_gcp, :production_environment, projects: [project])
- get :index, namespace_id: project.namespace, project_id: project, page: last_page
end
it 'redirects to the page' do
+ go(page: last_page)
+
expect(response).to have_gitlab_http_status(:ok)
expect(assigns(:clusters).current_page).to eq(last_page)
end
@@ -68,21 +76,14 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
+ end
+ describe 'GET new' do
def go
- get :index, namespace_id: project.namespace.to_param, project_id: project
+ get :new, namespace_id: project.namespace, project_id: project
end
- end
- describe 'GET new' do
describe 'functionality for new cluster' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
context 'when omniauth has been configured' do
let(:key) { 'secret-key' }
let(:session_key_for_redirect_uri) do
@@ -121,7 +122,7 @@ describe Projects::ClustersController do
it 'has new object' do
go
- expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::Cluster)
+ expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
end
end
@@ -139,17 +140,10 @@ describe Projects::ClustersController do
end
describe 'functionality for existing cluster' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
it 'has new object' do
go
- expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::Cluster)
+ expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
end
end
@@ -163,32 +157,27 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- get :new, namespace_id: project.namespace, project_id: project
- end
end
describe 'POST create for new cluster' do
+ let(:legacy_abac_param) { 'true' }
let(:params) do
{
cluster: {
name: 'new-cluster',
provider_gcp_attributes: {
- gcp_project_id: 'gcp-project-12345'
+ gcp_project_id: 'gcp-project-12345',
+ legacy_abac: legacy_abac_param
}
}
}
end
- describe 'functionality' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ def go
+ post :create_gcp, params.merge(namespace_id: project.namespace, project_id: project)
+ end
+ describe 'functionality' do
context 'when access token is valid' do
before do
stub_google_api_validate_token
@@ -201,6 +190,18 @@ describe Projects::ClustersController do
expect(response).to redirect_to(project_cluster_path(project, project.clusters.first))
expect(project.clusters.first).to be_gcp
expect(project.clusters.first).to be_kubernetes
+ expect(project.clusters.first.provider_gcp).to be_legacy_abac
+ end
+
+ context 'when legacy_abac param is false' do
+ let(:legacy_abac_param) { 'false' }
+
+ it 'creates a new cluster with legacy_abac_disabled' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Providers::Gcp.count }
+ expect(project.clusters.first.provider_gcp).not_to be_legacy_abac
+ end
end
end
@@ -220,9 +221,9 @@ describe Projects::ClustersController do
describe 'security' do
before do
allow_any_instance_of(described_class)
- .to receive(:token_in_session).and_return('token')
+ .to receive(:token_in_session).and_return('token')
allow_any_instance_of(described_class)
- .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
+ .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
allow_any_instance_of(GoogleApi::CloudPlatform::Client)
.to receive(:projects_zones_clusters_create) do
OpenStruct.new(
@@ -243,10 +244,6 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- post :create_gcp, params.merge(namespace_id: project.namespace, project_id: project)
- end
end
describe 'POST create for existing cluster' do
@@ -263,27 +260,61 @@ describe Projects::ClustersController do
}
end
+ def go
+ post :create_user, params.merge(namespace_id: project.namespace, project_id: project)
+ end
+
describe 'functionality' do
- let(:user) { create(:user) }
+ context 'when creates a cluster' do
+ it 'creates a new cluster' do
+ expect(ClusterProvisionWorker).to receive(:perform_async)
- before do
- project.add_maintainer(user)
- sign_in(user)
+ expect { go }.to change { Clusters::Cluster.count }
+ .and change { Clusters::Platforms::Kubernetes.count }
+
+ expect(response).to redirect_to(project_cluster_path(project, project.clusters.first))
+
+ expect(project.clusters.first).to be_user
+ expect(project.clusters.first).to be_kubernetes
+ end
end
- context 'when creates a cluster' do
+ context 'when creates a RBAC-enabled cluster' do
+ let(:params) do
+ {
+ cluster: {
+ name: 'new-cluster',
+ platform_kubernetes_attributes: {
+ api_url: 'http://my-url',
+ token: 'test',
+ namespace: 'aaa',
+ authorization_type: 'rbac'
+ }
+ }
+ }
+ end
+
it 'creates a new cluster' do
expect(ClusterProvisionWorker).to receive(:perform_async)
+
expect { go }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
+
expect(response).to redirect_to(project_cluster_path(project, project.clusters.first))
+
expect(project.clusters.first).to be_user
expect(project.clusters.first).to be_kubernetes
+ expect(project.clusters.first).to be_platform_kubernetes_rbac
end
end
end
describe 'security' do
+ before do
+ allow(ClusterPlatformConfigureWorker).to receive(:perform_async)
+ stub_kubeclient_get_namespace('https://kubernetes.example.com', namespace: 'my-namespace')
+ end
+
it { expect { go }.to be_allowed_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(project) }
it { expect { go }.to be_allowed_for(:maintainer).of(project) }
@@ -293,23 +324,20 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- post :create_user, params.merge(namespace_id: project.namespace, project_id: project)
- end
end
- describe 'GET status' do
+ describe 'GET cluster_status' do
let(:cluster) { create(:cluster, :providing_by_gcp, projects: [project]) }
- describe 'functionality' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ def go
+ get :cluster_status,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ id: cluster,
+ format: :json
+ end
+ describe 'functionality' do
it "responds with matching schema" do
go
@@ -334,26 +362,19 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- get :status, namespace_id: project.namespace,
- project_id: project,
- id: cluster,
- format: :json
- end
end
describe 'GET show' do
let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
- describe 'functionality' do
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ def go
+ get :show,
+ namespace_id: project.namespace,
+ project_id: project,
+ id: cluster
+ end
+ describe 'functionality' do
it "renders view" do
go
@@ -372,145 +393,89 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- get :show, namespace_id: project.namespace,
- project_id: project,
- id: cluster
- end
end
describe 'PUT update' do
- context 'when cluster is provided by GCP' do
- let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- context 'when changing parameters' do
- let(:params) do
- {
- cluster: {
- enabled: false,
- name: 'my-new-cluster-name',
- platform_kubernetes_attributes: {
- namespace: 'my-namespace'
- }
- }
- }
- end
-
- it "updates and redirects back to show page" do
- go
-
- cluster.reload
- expect(response).to redirect_to(project_cluster_path(project, cluster))
- expect(flash[:notice]).to eq('Kubernetes cluster was successfully updated.')
- expect(cluster.enabled).to be_falsey
- end
-
- it "does not change cluster name" do
- go
-
- expect(cluster.name).to eq('test-cluster')
- end
+ def go(format: :html)
+ put :update, params.merge(namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ id: cluster,
+ format: format
+ )
+ end
- context 'when cluster is being created' do
- let(:cluster) { create(:cluster, :providing_by_gcp, projects: [project]) }
+ before do
+ allow(ClusterPlatformConfigureWorker).to receive(:perform_async)
+ stub_kubeclient_get_namespace('https://kubernetes.example.com', namespace: 'my-namespace')
+ end
- it "rejects changes" do
- go
+ let(:cluster) { create(:cluster, :provided_by_user, projects: [project]) }
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- expect(cluster.enabled).to be_truthy
- end
- end
- end
+ let(:params) do
+ {
+ cluster: {
+ enabled: false,
+ name: 'my-new-cluster-name',
+ platform_kubernetes_attributes: {
+ namespace: 'my-namespace'
+ }
+ }
+ }
end
- context 'when cluster is provided by user' do
- let(:cluster) { create(:cluster, :provided_by_user, projects: [project]) }
- let(:user) { create(:user) }
+ it "updates and redirects back to show page" do
+ go
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ cluster.reload
+ expect(response).to redirect_to(project_cluster_path(project, cluster))
+ expect(flash[:notice]).to eq('Kubernetes cluster was successfully updated.')
+ expect(cluster.enabled).to be_falsey
+ expect(cluster.name).to eq('my-new-cluster-name')
+ expect(cluster.platform_kubernetes.namespace).to eq('my-namespace')
+ end
- context 'when format is json' do
- context 'when changing parameters' do
- context 'when valid parameters are used' do
- let(:params) do
- {
- cluster: {
- enabled: false,
- name: 'my-new-cluster-name',
- platform_kubernetes_attributes: {
- namespace: 'my-namespace'
- }
+ context 'when format is json' do
+ context 'when changing parameters' do
+ context 'when valid parameters are used' do
+ let(:params) do
+ {
+ cluster: {
+ enabled: false,
+ name: 'my-new-cluster-name',
+ platform_kubernetes_attributes: {
+ namespace: 'my-namespace'
}
}
- end
-
- it "updates and redirects back to show page" do
- go_json
-
- cluster.reload
- expect(response).to have_http_status(:no_content)
- expect(cluster.enabled).to be_falsey
- expect(cluster.name).to eq('my-new-cluster-name')
- expect(cluster.platform_kubernetes.namespace).to eq('my-namespace')
- end
+ }
end
- context 'when invalid parameters are used' do
- let(:params) do
- {
- cluster: {
- enabled: false,
- platform_kubernetes_attributes: {
- namespace: 'my invalid namespace #@'
- }
- }
- }
- end
-
- it "rejects changes" do
- go_json
+ it "updates and redirects back to show page" do
+ go(format: :json)
- expect(response).to have_http_status(:bad_request)
- end
+ cluster.reload
+ expect(response).to have_http_status(:no_content)
+ expect(cluster.enabled).to be_falsey
+ expect(cluster.name).to eq('my-new-cluster-name')
+ expect(cluster.platform_kubernetes.namespace).to eq('my-namespace')
end
end
- end
- context 'when format is html' do
- context 'when update enabled' do
+ context 'when invalid parameters are used' do
let(:params) do
{
cluster: {
enabled: false,
- name: 'my-new-cluster-name',
platform_kubernetes_attributes: {
- namespace: 'my-namespace'
+ namespace: 'my invalid namespace #@'
}
}
}
end
- it "updates and redirects back to show page" do
- go
+ it "rejects changes" do
+ go(format: :json)
- cluster.reload
- expect(response).to redirect_to(project_cluster_path(project, cluster))
- expect(flash[:notice]).to eq('Kubernetes cluster was successfully updated.')
- expect(cluster.enabled).to be_falsey
- expect(cluster.name).to eq('my-new-cluster-name')
- expect(cluster.platform_kubernetes.namespace).to eq('my-namespace')
+ expect(response).to have_http_status(:bad_request)
end
end
end
@@ -519,10 +484,6 @@ describe Projects::ClustersController do
describe 'security' do
set(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
- let(:params) do
- { cluster: { enabled: false } }
- end
-
it { expect { go }.to be_allowed_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(project) }
it { expect { go }.to be_allowed_for(:maintainer).of(project) }
@@ -532,34 +493,21 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
-
- def go
- put :update, params.merge(namespace_id: project.namespace,
- project_id: project,
- id: cluster)
- end
-
- def go_json
- put :update, params.merge(namespace_id: project.namespace,
- project_id: project,
- id: cluster,
- format: :json)
- end
end
describe 'DELETE destroy' do
- describe 'functionality' do
- let(:user) { create(:user) }
+ let!(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, projects: [project]) }
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
+ def go
+ delete :destroy,
+ namespace_id: project.namespace,
+ project_id: project,
+ id: cluster
+ end
+ describe 'functionality' do
context 'when cluster is provided by GCP' do
context 'when cluster is created' do
- let!(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, projects: [project]) }
-
it "destroys and redirects back to clusters list" do
expect { go }
.to change { Clusters::Cluster.count }.by(-1)
@@ -612,11 +560,11 @@ describe Projects::ClustersController do
it { expect { go }.to be_denied_for(:user) }
it { expect { go }.to be_denied_for(:external) }
end
+ end
- def go
- delete :destroy, namespace_id: project.namespace,
- project_id: project,
- id: cluster
+ context 'no project_id param' do
+ it 'does not respond to any action without project_id param' do
+ expect { get :index }.to raise_error(ActionController::UrlGenerationError)
end
end
end
diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb
index 916a4be2567..e34fdee62d6 100644
--- a/spec/controllers/projects/commit_controller_spec.rb
+++ b/spec/controllers/projects/commit_controller_spec.rb
@@ -230,7 +230,7 @@ describe Projects::CommitController do
id: master_pickable_commit.id)
expect(response).to redirect_to project_commits_path(project, 'master')
- expect(flash[:notice]).to eq('The commit has been successfully cherry-picked.')
+ expect(flash[:notice]).to eq('The commit has been successfully cherry-picked into master.')
end
end
@@ -356,6 +356,7 @@ describe Projects::CommitController do
expect(response).to be_ok
expect(JSON.parse(response.body)['pipelines']).not_to be_empty
expect(JSON.parse(response.body)['count']['all']).to eq 1
+ expect(response).to include_pagination_headers
end
end
end
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index 8695aa826bb..17883d0fadd 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -97,6 +97,30 @@ describe Projects::CompareController do
expect(assigns(:commits)).to eq([])
end
end
+
+ context 'when the target ref is invalid' do
+ let(:target_ref) { "master%' AND 2554=4423 AND '%'='" }
+ let(:source_ref) { "improve%2Fawesome" }
+
+ it 'shows a flash message and redirects' do
+ show_request
+
+ expect(flash[:alert]).to eq('Invalid branch name')
+ expect(response).to have_http_status(302)
+ end
+ end
+
+ context 'when the source ref is invalid' do
+ let(:source_ref) { "master%' AND 2554=4423 AND '%'='" }
+ let(:target_ref) { "improve%2Fawesome" }
+
+ it 'shows a flash message and redirects' do
+ show_request
+
+ expect(flash[:alert]).to eq('Invalid branch name')
+ expect(response).to have_http_status(302)
+ end
+ end
end
describe 'GET diff_for_path' do
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index 73bf169085f..4567a51b88e 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -27,12 +27,8 @@ describe Projects::DeployKeysController do
let(:project2) { create(:project, :internal)}
let(:project_private) { create(:project, :private)}
- let(:deploy_key_internal) do
- create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== dummy@gitlab.com')
- end
- let(:deploy_key_actual) do
- create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== dummy@gitlab.com')
- end
+ let(:deploy_key_internal) { create(:deploy_key) }
+ let(:deploy_key_actual) { create(:deploy_key) }
let!(:deploy_key_public) { create(:deploy_key, public: true) }
let!(:deploy_keys_project_internal) do
@@ -63,4 +59,145 @@ describe Projects::DeployKeysController do
end
end
end
+
+ describe '/enable/:id' do
+ let(:deploy_key) { create(:deploy_key) }
+ let(:project2) { create(:project) }
+ let!(:deploy_keys_project_internal) do
+ create(:deploy_keys_project, project: project2, deploy_key: deploy_key)
+ end
+
+ context 'with anonymous user' do
+ before do
+ sign_out(:user)
+ end
+
+ it 'redirects to login' do
+ expect do
+ put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+ end.not_to change { DeployKeysProject.count }
+
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ context 'with user with no permission' do
+ before do
+ sign_in(create(:user))
+ end
+
+ it 'returns 404' do
+ expect do
+ put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+ end.not_to change { DeployKeysProject.count }
+
+ expect(response).to have_http_status(404)
+ end
+ end
+
+ context 'with user with permission' do
+ before do
+ project2.add_maintainer(user)
+ end
+
+ it 'returns 302' do
+ expect do
+ put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+ end.to change { DeployKeysProject.count }.by(1)
+
+ expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
+ end
+
+ it 'returns 404' do
+ put :enable, id: 0, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(404)
+ end
+ end
+
+ context 'with admin' do
+ before do
+ sign_in(create(:admin))
+ end
+
+ it 'returns 302' do
+ expect do
+ put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+ end.to change { DeployKeysProject.count }.by(1)
+
+ expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
+ end
+ end
+ end
+
+ describe '/disable/:id' do
+ let(:deploy_key) { create(:deploy_key) }
+ let!(:deploy_key_project) { create(:deploy_keys_project, project: project, deploy_key: deploy_key) }
+
+ context 'with anonymous user' do
+ before do
+ sign_out(:user)
+ end
+
+ it 'redirects to login' do
+ put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(new_user_session_path)
+ expect(DeployKey.find(deploy_key.id)).to eq(deploy_key)
+ end
+ end
+
+ context 'with user with no permission' do
+ before do
+ sign_in(create(:user))
+ end
+
+ it 'returns 404' do
+ put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(404)
+ expect(DeployKey.find(deploy_key.id)).to eq(deploy_key)
+ end
+ end
+
+ context 'with user with permission' do
+ it 'returns 302' do
+ put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
+
+ expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'returns 404' do
+ put :disable, id: 0, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(404)
+ end
+ end
+
+ context 'with admin' do
+ before do
+ sign_in(create(:admin))
+ end
+
+ it 'returns 302' do
+ expect do
+ put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
+ end.to change { DeployKey.count }.by(-1)
+
+ expect(response).to have_http_status(302)
+ expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
+
+ expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
end
diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb
index d1c960e895d..5b7da81b6a1 100644
--- a/spec/controllers/projects/deployments_controller_spec.rb
+++ b/spec/controllers/projects/deployments_controller_spec.rb
@@ -15,9 +15,9 @@ describe Projects::DeploymentsController do
describe 'GET #index' do
it 'returns list of deployments from last 8 hours' do
- create(:deployment, environment: environment, created_at: 9.hours.ago)
- create(:deployment, environment: environment, created_at: 7.hours.ago)
- create(:deployment, environment: environment)
+ create(:deployment, :success, environment: environment, created_at: 9.hours.ago)
+ create(:deployment, :success, environment: environment, created_at: 7.hours.ago)
+ create(:deployment, :success, environment: environment)
get :index, deployment_params(after: 8.hours.ago)
@@ -27,7 +27,7 @@ describe Projects::DeploymentsController do
end
it 'returns a list with deployments information' do
- create(:deployment, environment: environment)
+ create(:deployment, :success, environment: environment)
get :index, deployment_params
@@ -37,7 +37,7 @@ describe Projects::DeploymentsController do
end
describe 'GET #metrics' do
- let(:deployment) { create(:deployment, project: project, environment: environment) }
+ let(:deployment) { create(:deployment, :success, project: project, environment: environment) }
before do
allow(controller).to receive(:deployment).and_return(deployment)
@@ -110,7 +110,7 @@ describe Projects::DeploymentsController do
end
describe 'GET #additional_metrics' do
- let(:deployment) { create(:deployment, project: project, environment: environment) }
+ let(:deployment) { create(:deployment, :success, project: project, environment: environment) }
before do
allow(controller).to receive(:deployment).and_return(deployment)
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb
index b86029a4baf..bc17331f531 100644
--- a/spec/controllers/projects/environments_controller_spec.rb
+++ b/spec/controllers/projects/environments_controller_spec.rb
@@ -216,7 +216,7 @@ describe Projects::EnvironmentsController do
expect(response).to have_gitlab_http_status(200)
end
- it 'loads the terminals for the enviroment' do
+ it 'loads the terminals for the environment' do
expect_any_instance_of(Environment).to receive(:terminals)
get :terminal, environment_params
diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb
index 0f3033b0933..7d3a8c3d0d3 100644
--- a/spec/controllers/projects/hooks_controller_spec.rb
+++ b/spec/controllers/projects/hooks_controller_spec.rb
@@ -30,6 +30,7 @@ describe Projects::HooksController do
tag_push_events: true,
merge_requests_events: true,
issues_events: true,
+ confidential_note_events: true,
confidential_issues_events: true,
note_events: true,
job_events: true,
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 5b347b1109a..80138183c07 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -637,6 +637,18 @@ describe Projects::IssuesController do
project_id: project,
id: id
end
+
+ it 'avoids (most) N+1s loading labels', :request_store do
+ label = create(:label, project: project).to_reference
+ labels = create_list(:label, 10, project: project).map(&:to_reference)
+ issue = create(:issue, project: project, description: 'Test issue')
+
+ control_count = ActiveRecord::QueryRecorder.new { issue.update(description: [issue.description, label].join(' ')) }.count
+
+ # Follow-up to get rid of this `2 * label.count` requirement: https://gitlab.com/gitlab-org/gitlab-ce/issues/52230
+ expect { issue.update(description: [issue.description, labels].join(' ')) }
+ .not_to exceed_query_limit(control_count + 2 * labels.count)
+ end
end
describe 'GET #realtime_changes' do
@@ -1016,6 +1028,13 @@ describe Projects::IssuesController do
.not_to exceed_query_limit(control)
end
+ context 'when user is setting notes filters' do
+ let(:issuable) { issue }
+ let!(:discussion_note) { create(:discussion_note_on_issue, :system, noteable: issuable, project: project) }
+
+ it_behaves_like 'issuable notes filter'
+ end
+
context 'with cross-reference system note', :request_store do
let(:new_issue) { create(:issue) }
let(:cross_reference) { "mentioned in #{new_issue.to_reference(issue.project)}" }
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index 1aca44c6e74..da3d658d061 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -86,7 +86,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
def create_job(name, status)
pipeline = create(:ci_pipeline, project: project)
create(:ci_build, :tags, :triggered, :artifacts,
- pipeline: pipeline, name: name, status: status)
+ pipeline: pipeline, name: name, status: status)
end
end
@@ -147,12 +147,273 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
get_show(id: job.id, format: :json)
end
- it 'exposes needed information' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z})
- expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z})
- expect(json_response['new_issue_path'])
- .to include('/issues/new')
+ context 'when job failed' do
+ it 'exposes needed information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z})
+ expect(json_response['merge_request']['path']).to match(%r{merge_requests/\d+\z})
+ expect(json_response['new_issue_path']).to include('/issues/new')
+ end
+ end
+
+ context 'when job is running' do
+ context 'job is cancelable' do
+ let(:job) { create(:ci_build, :running, pipeline: pipeline) }
+
+ it 'cancel_path is present with correct redirect' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['cancel_path']).to include(CGI.escape(json_response['build_path']))
+ end
+ end
+
+ context 'with web terminal' do
+ let(:job) { create(:ci_build, :running, :with_runner_session, pipeline: pipeline) }
+
+ it 'exposes the terminal path' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['terminal_path']).to match(%r{/terminal})
+ end
+ end
+ end
+
+ context 'when job has artifacts' do
+ context 'with not expiry date' do
+ let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline) }
+
+ it 'exposes needed information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['artifact']['download_path']).to match(%r{artifacts/download})
+ expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse})
+ expect(json_response['artifact']).not_to have_key('expired')
+ expect(json_response['artifact']).not_to have_key('expired_at')
+ end
+ end
+
+ context 'with expiry date' do
+ let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) }
+
+ it 'exposes needed information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['artifact']).not_to have_key('download_path')
+ expect(json_response['artifact']).not_to have_key('browse_path')
+ expect(json_response['artifact']['expired']).to eq(true)
+ expect(json_response['artifact']['expire_at']).not_to be_empty
+ end
+ end
+ end
+
+ context 'when job passed with no trace' do
+ let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline) }
+
+ it 'exposes empty state illustrations' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['status']['illustration']).to have_key('image')
+ expect(json_response['status']['illustration']).to have_key('size')
+ expect(json_response['status']['illustration']).to have_key('title')
+ end
+ end
+
+ context 'with no deployment' do
+ let(:job) { create(:ci_build, :success, pipeline: pipeline) }
+
+ it 'does not exposes the deployment information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['deployment_status']).to be_nil
+ end
+ end
+
+ context 'with deployment' do
+ let(:merge_request) { create(:merge_request, source_project: project) }
+ let(:environment) { create(:environment, project: project, name: 'staging', state: :available) }
+ let(:job) { create(:ci_build, :running, environment: environment.name, pipeline: pipeline) }
+
+ it 'exposes the deployment information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to match_schema('job/job_details')
+ expect(json_response['deployment_status']["status"]).to eq 'creating'
+ expect(json_response['deployment_status']["environment"]).not_to be_nil
+ end
+ end
+
+ context 'when user can edit runner' do
+ context 'that belongs to the project' do
+ let(:runner) { create(:ci_runner, :project, projects: [project]) }
+ let(:job) { create(:ci_build, :success, pipeline: pipeline, runner: runner) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ get_show(id: job.id, format: :json)
+ end
+
+ it 'user can edit runner' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runner']).to have_key('edit_path')
+ end
+ end
+
+ context 'that belongs to group' do
+ let(:group) { create(:group) }
+ let(:runner) { create(:ci_runner, :group, groups: [group]) }
+ let(:job) { create(:ci_build, :success, pipeline: pipeline, runner: runner) }
+ let(:user) { create(:user, :admin) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ get_show(id: job.id, format: :json)
+ end
+
+ it 'user can not edit runner' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runner']).not_to have_key('edit_path')
+ end
+ end
+
+ context 'that belongs to instance' do
+ let(:runner) { create(:ci_runner, :instance) }
+ let(:job) { create(:ci_build, :success, pipeline: pipeline, runner: runner) }
+ let(:user) { create(:user, :admin) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ get_show(id: job.id, format: :json)
+ end
+
+ it 'user can not edit runner' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runner']).not_to have_key('edit_path')
+ end
+ end
+ end
+
+ context 'when no runners are available' do
+ let(:runner) { create(:ci_runner, :instance, active: false) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner) }
+
+ it 'exposes needed information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runners']['online']).to be false
+ expect(json_response['runners']['available']).to be false
+ expect(json_response['stuck']).to be true
+ end
+ end
+
+ context 'when no runner is online' do
+ let(:runner) { create(:ci_runner, :instance) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner) }
+
+ it 'exposes needed information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runners']['online']).to be false
+ expect(json_response['runners']['available']).to be true
+ expect(json_response['stuck']).to be true
+ end
+ end
+
+ context 'settings_path' do
+ context 'when user is developer' do
+ it 'settings_path is not available' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runners']).not_to have_key('settings_path')
+ end
+ end
+
+ context 'when user is maintainer' do
+ let(:user) { create(:user, :admin) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ it 'settings_path is available' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['runners']['settings_path']).to match(/runners/)
+ end
+ end
+ end
+
+ context 'when no trace is available' do
+ it 'has_trace is false' do
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['has_trace']).to be false
+ end
+ end
+
+ context 'when job has trace' do
+ let(:job) { create(:ci_build, :running, :trace_live, pipeline: pipeline) }
+
+ it "has_trace is true" do
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['has_trace']).to be true
+ end
+ end
+
+ it 'exposes the stage the job belongs to' do
+ expect(json_response['stage']).to eq('test')
+ end
+ end
+
+ context 'when requesting JSON job is triggered' do
+ let!(:merge_request) { create(:merge_request, source_project: project) }
+ let(:trigger) { create(:ci_trigger, project: project) }
+ let(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline, trigger: trigger) }
+ let(:job) { create(:ci_build, pipeline: pipeline, trigger_request: trigger_request) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+
+ allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
+ end
+
+ context 'with no variables' do
+ before do
+ get_show(id: job.id, format: :json)
+ end
+
+ it 'exposes trigger information' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['trigger']['short_token']).to eq 'toke'
+ expect(json_response['trigger']['variables'].length).to eq 0
+ end
+ end
+
+ context 'with variables' do
+ before do
+ create(:ci_pipeline_variable, pipeline: pipeline, key: :TRIGGER_KEY_1, value: 'TRIGGER_VALUE_1')
+
+ get_show(id: job.id, format: :json)
+ end
+
+ it 'exposes trigger information and variables' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('job/job_details')
+ expect(json_response['trigger']['short_token']).to eq 'toke'
+ expect(json_response['trigger']['variables'].length).to eq 1
+ expect(json_response['trigger']['variables'].first['key']).to eq "TRIGGER_KEY_1"
+ expect(json_response['trigger']['variables'].first['value']).to eq "TRIGGER_VALUE_1"
+ expect(json_response['trigger']['variables'].first['public']).to eq false
+ end
end
end
@@ -356,35 +617,108 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
before do
project.add_developer(user)
sign_in(user)
-
- post_cancel
end
- context 'when job is cancelable' do
+ context 'when continue url is present' do
let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) }
- it 'redirects to the canceled job page' do
+ context 'when continue to is a safe url' do
+ let(:url) { '/test' }
+
+ before do
+ post_cancel(continue: { to: url })
+ end
+
+ it 'redirects to the continue url' do
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to(url)
+ end
+
+ it 'transits to canceled' do
+ expect(job.reload).to be_canceled
+ end
+ end
+
+ context 'when continue to is not a safe url' do
+ let(:url) { 'http://example.com' }
+
+ it 'raises an error' do
+ expect { cancel_with_redirect(url) }.to raise_error
+ end
+ end
+ end
+
+ context 'when continue url is not present' do
+ before do
+ post_cancel
+ end
+
+ context 'when job is cancelable' do
+ let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) }
+
+ it 'redirects to the builds page' do
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to(builds_namespace_project_pipeline_path(id: pipeline.id))
+ end
+
+ it 'transits to canceled' do
+ expect(job.reload).to be_canceled
+ end
+ end
+
+ context 'when job is not cancelable' do
+ let(:job) { create(:ci_build, :canceled, pipeline: pipeline) }
+
+ it 'returns unprocessable_entity' do
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+ end
+ end
+
+ def post_cancel(additional_params = {})
+ post :cancel, { namespace_id: project.namespace,
+ project_id: project,
+ id: job.id }.merge(additional_params)
+ end
+ end
+
+ describe 'POST unschedule' do
+ before do
+ project.add_developer(user)
+
+ create(:protected_branch, :developers_can_merge,
+ name: 'master', project: project)
+
+ sign_in(user)
+
+ post_unschedule
+ end
+
+ context 'when job is scheduled' do
+ let(:job) { create(:ci_build, :scheduled, pipeline: pipeline) }
+
+ it 'redirects to the unscheduled job page' do
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(namespace_project_job_path(id: job.id))
end
- it 'transits to canceled' do
- expect(job.reload).to be_canceled
+ it 'transits to manual' do
+ expect(job.reload).to be_manual
end
end
- context 'when job is not cancelable' do
- let(:job) { create(:ci_build, :canceled, pipeline: pipeline) }
+ context 'when job is not scheduled' do
+ let(:job) { create(:ci_build, pipeline: pipeline) }
- it 'returns unprocessable_entity' do
+ it 'renders unprocessable_entity' do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
end
- def post_cancel
- post :cancel, namespace_id: project.namespace,
- project_id: project,
- id: job.id
+ def post_unschedule
+ post :unschedule, namespace_id: project.namespace,
+ project_id: project,
+ id: job.id
end
end
diff --git a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb
index 397cc79bde4..1e1ea9a7144 100644
--- a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb
@@ -150,7 +150,6 @@ describe Projects::MergeRequests::ConflictsController do
'new_path' => path,
'blob_icon' => 'file-text-o',
'blob_path' => a_string_ending_with(path),
- 'blob_ace_mode' => 'ruby',
'content' => content)
end
end
diff --git a/spec/controllers/projects/merge_requests/creations_controller_spec.rb b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
index d8995f98575..f8c37c0a676 100644
--- a/spec/controllers/projects/merge_requests/creations_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
@@ -29,6 +29,55 @@ describe Projects::MergeRequests::CreationsController do
expect(response).to be_success
end
end
+
+ context 'merge request with some commits' do
+ render_views
+
+ let(:large_diff_params) do
+ {
+ namespace_id: fork_project.namespace.to_param,
+ project_id: fork_project,
+ merge_request: {
+ source_branch: 'master',
+ target_branch: 'fix'
+ }
+ }
+ end
+
+ describe 'with artificial limits' do
+ before do
+ # Load MergeRequestdiff so stub_const won't override it with its own definition
+ # See https://github.com/rspec/rspec-mocks/issues/1079
+ stub_const("#{MergeRequestDiff}::COMMITS_SAFE_SIZE", 2)
+ end
+
+ it 'limits total commits' do
+ get :new, large_diff_params
+
+ expect(response).to be_success
+
+ total = assigns(:total_commit_count)
+ expect(assigns(:commits)).to be_an Array
+ expect(total).to be > 0
+ expect(assigns(:hidden_commit_count)).to be > 0
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.body).to match %r(<span class="commits-count">2 commits</span>)
+ end
+ end
+
+ it 'shows total commits' do
+ get :new, large_diff_params
+
+ expect(response).to be_success
+
+ total = assigns(:total_commit_count)
+ expect(assigns(:commits)).to be_an Array
+ expect(total).to be > 0
+ expect(assigns(:hidden_commit_count)).to eq(0)
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.body).to match %r(<span class="commits-count">#{total} commits</span>)
+ end
+ end
end
describe 'GET diffs' do
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index d9bb3981539..e62523c65c9 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -76,28 +76,6 @@ describe Projects::MergeRequestsController do
expect(response).to be_success
end
- context "loads notes" do
- let(:first_contributor) { create(:user) }
- let(:contributor) { create(:user) }
- let(:merge_request) { create(:merge_request, author: first_contributor, target_project: project, source_project: project) }
- let(:contributor_merge_request) { create(:merge_request, :merged, author: contributor, target_project: project, source_project: project) }
- # the order here is important
- # as the controller reloads these from DB, references doesn't correspond after
- let!(:first_contributor_note) { create(:note, author: first_contributor, noteable: merge_request, project: project) }
- let!(:contributor_note) { create(:note, author: contributor, noteable: merge_request, project: project) }
- let!(:owner_note) { create(:note, author: user, noteable: merge_request, project: project) }
-
- it "with special_role FIRST_TIME_CONTRIBUTOR" do
- go(format: :html)
-
- notes = assigns(:notes)
- expect(notes).to match(a_collection_containing_exactly(an_object_having_attributes(special_role: Note::SpecialRole::FIRST_TIME_CONTRIBUTOR),
- an_object_having_attributes(special_role: nil),
- an_object_having_attributes(special_role: nil)
- ))
- end
- end
-
context "that is invalid" do
let(:merge_request) { create(:invalid_merge_request, target_project: project, source_project: project) }
@@ -109,6 +87,14 @@ describe Projects::MergeRequestsController do
end
end
+ context 'when user is setting notes filters' do
+ let(:issuable) { merge_request }
+ let!(:discussion_note) { create(:discussion_note_on_merge_request, :system, noteable: issuable, project: project) }
+ let!(:discussion_comment) { create(:discussion_note_on_merge_request, noteable: issuable, project: project) }
+
+ it_behaves_like 'issuable notes filter'
+ end
+
describe 'as json' do
context 'with basic serializer param' do
it 'renders basic MR entity as json' do
@@ -577,6 +563,7 @@ describe Projects::MergeRequestsController do
it 'responds with serialized pipelines' do
expect(json_response['pipelines']).not_to be_empty
expect(json_response['count']['all']).to eq 1
+ expect(response).to include_pagination_headers
end
end
@@ -763,24 +750,69 @@ describe Projects::MergeRequestsController do
describe 'GET ci_environments_status' do
context 'the environment is from a forked project' do
- let!(:forked) { fork_project(project, user, repository: true) }
- let!(:environment) { create(:environment, project: forked) }
- let!(:deployment) { create(:deployment, environment: environment, sha: forked.commit.id, ref: 'master') }
- let(:admin) { create(:admin) }
+ let(:forked) { fork_project(project, user, repository: true) }
+ let(:sha) { forked.commit.sha }
+ let(:environment) { create(:environment, project: forked) }
+ let(:pipeline) { create(:ci_pipeline, sha: sha, project: forked) }
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: 'master', deployable: build) }
let(:merge_request) do
- create(:merge_request, source_project: forked, target_project: project)
+ create(:merge_request, source_project: forked, target_project: project, target_branch: 'master', head_pipeline: pipeline)
end
- before do
- get :ci_environments_status,
+ it 'links to the environment on that project' do
+ get_ci_environments_status
+
+ expect(json_response.first['url']).to match /#{forked.full_path}/
+ end
+
+ context "when environment_target is 'merge_commit'" do
+ it 'returns nothing' do
+ get_ci_environments_status(environment_target: 'merge_commit')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_empty
+ end
+
+ context 'when is merged' do
+ let(:source_environment) { create(:environment, project: project) }
+ let(:merge_commit_sha) { project.repository.merge(user, forked.commit.id, merge_request, "merged in test") }
+ let(:post_merge_pipeline) { create(:ci_pipeline, sha: merge_commit_sha, project: project) }
+ let(:post_merge_build) { create(:ci_build, pipeline: post_merge_pipeline) }
+ let!(:source_deployment) { create(:deployment, :succeed, environment: source_environment, sha: merge_commit_sha, ref: 'master', deployable: post_merge_build) }
+
+ before do
+ merge_request.update!(merge_commit_sha: merge_commit_sha)
+ merge_request.mark_as_merged!
+ end
+
+ it 'returns the environment on the source project' do
+ get_ci_environments_status(environment_target: 'merge_commit')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.first['url']).to match /#{project.full_path}/
+ end
+ end
+ end
+
+ # we're trying to reduce the overall number of queries for this method.
+ # set a hard limit for now. https://gitlab.com/gitlab-org/gitlab-ce/issues/52287
+ it 'keeps queries in check' do
+ control_count = ActiveRecord::QueryRecorder.new { get_ci_environments_status }.count
+
+ expect(control_count).to be <= 137
+ end
+
+ def get_ci_environments_status(extra_params = {})
+ params = {
namespace_id: merge_request.project.namespace.to_param,
project_id: merge_request.project,
- id: merge_request.iid, format: 'json'
- end
+ id: merge_request.iid,
+ format: 'json'
+ }
- it 'links to the environment on that project' do
- expect(json_response.first['url']).to match /#{forked.full_path}/
+ get :ci_environments_status, params.merge(extra_params)
end
end
end
@@ -850,12 +882,14 @@ describe Projects::MergeRequestsController do
end
context 'with a forked project' do
- let(:fork_project) { create(:project, :repository, forked_from_project: project) }
- let(:fork_owner) { fork_project.owner }
+ let(:forked_project) { fork_project(project, fork_owner, repository: true) }
+ let(:fork_owner) { create(:user) }
before do
- merge_request.update!(source_project: fork_project)
- fork_project.add_reporter(user)
+ project.add_developer(fork_owner)
+
+ merge_request.update!(source_project: forked_project)
+ forked_project.add_reporter(user)
end
context 'user cannot push to source branch' do
@@ -885,4 +919,18 @@ describe Projects::MergeRequestsController do
end
end
end
+
+ describe 'GET edit' do
+ it 'responds successfully' do
+ get :edit, namespace_id: project.namespace, project_id: project, id: merge_request
+
+ expect(response).to have_gitlab_http_status(:success)
+ end
+
+ it 'assigns the noteable to make sure autocompletes work' do
+ get :edit, namespace_id: project.namespace, project_id: project, id: merge_request
+
+ expect(assigns(:noteable)).not_to be_nil
+ end
+ end
end
diff --git a/spec/controllers/projects/milestones_controller_spec.rb b/spec/controllers/projects/milestones_controller_spec.rb
index 3190f1ce9d4..ccd4fc4db3a 100644
--- a/spec/controllers/projects/milestones_controller_spec.rb
+++ b/spec/controllers/projects/milestones_controller_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
describe Projects::MilestonesController do
- let(:project) { create(:project) }
+ let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
let(:milestone) { create(:milestone, project: project) }
let(:issue) { create(:issue, project: project, milestone: milestone) }
diff --git a/spec/controllers/projects/mirrors_controller_spec.rb b/spec/controllers/projects/mirrors_controller_spec.rb
index 6114eef7003..00c1e617e3a 100644
--- a/spec/controllers/projects/mirrors_controller_spec.rb
+++ b/spec/controllers/projects/mirrors_controller_spec.rb
@@ -63,6 +63,69 @@ describe Projects::MirrorsController do
end
end
+ describe '#ssh_host_keys', :use_clean_rails_memory_store_caching do
+ let(:project) { create(:project) }
+ let(:cache) { SshHostKey.new(project: project, url: "ssh://example.com:22") }
+
+ before do
+ sign_in(project.owner)
+ end
+
+ context 'invalid URLs' do
+ %w[
+ INVALID
+ git@example.com:foo/bar.git
+ ssh://git@example.com:foo/bar.git
+ ].each do |url|
+ it "returns an error with a 400 response for URL #{url.inspect}" do
+ do_get(project, url)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response).to eq('message' => 'Invalid URL')
+ end
+ end
+ end
+
+ context 'no data in cache' do
+ it 'requests the cache to be filled and returns a 204 response' do
+ expect(ReactiveCachingWorker).to receive(:perform_async).with(cache.class, cache.id).at_least(:once)
+
+ do_get(project)
+
+ expect(response).to have_gitlab_http_status(204)
+ end
+ end
+
+ context 'error in the cache' do
+ it 'returns the error with a 400 response' do
+ stub_reactive_cache(cache, error: 'An error')
+
+ do_get(project)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response).to eq('message' => 'An error')
+ end
+ end
+
+ context 'data in the cache' do
+ let(:ssh_key) { 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfuCHKVTjquxvt6CM6tdG4SLp1Btn/nOeHHE5UOzRdf' }
+ let(:ssh_fp) { { type: 'ed25519', bits: 256, fingerprint: '2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16', index: 0 } }
+
+ it 'returns the data with a 200 response' do
+ stub_reactive_cache(cache, known_hosts: ssh_key)
+
+ do_get(project)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to eq('known_hosts' => ssh_key, 'fingerprints' => [ssh_fp.stringify_keys], 'host_keys_changed' => true)
+ end
+ end
+
+ def do_get(project, url = 'ssh://example.com')
+ get :ssh_host_keys, namespace_id: project.namespace, project_id: project, ssh_url: url
+ end
+ end
+
def do_put(project, options, extra_attrs = {})
attrs = extra_attrs.merge(namespace_id: project.namespace.to_param, project_id: project.to_param)
attrs[:project] = options
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 1458113b90c..9ac7b8ee8a8 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -47,6 +47,37 @@ describe Projects::NotesController do
get :index, request_params
end
+ context 'when user notes_filter is present' do
+ let(:notes_json) { parsed_response[:notes] }
+ let!(:comment) { create(:note, noteable: issue, project: project) }
+ let!(:system_note) { create(:note, noteable: issue, project: project, system: true) }
+
+ it 'filters system notes by comments' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_comments], issue)
+
+ get :index, request_params
+
+ expect(notes_json.count).to eq(1)
+ expect(notes_json.first[:id].to_i).to eq(comment.id)
+ end
+
+ it 'returns all notes' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:all_notes], issue)
+
+ get :index, request_params
+
+ expect(notes_json.map { |note| note[:id].to_i }).to contain_exactly(comment.id, system_note.id)
+ end
+
+ it 'does not merge label event notes' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_comments], issue)
+
+ expect(ResourceEvents::MergeIntoNotesService).not_to receive(:new)
+
+ get :index, request_params
+ end
+ end
+
context 'for a discussion note' do
let(:project) { create(:project, :repository) }
let!(:note) { create(:discussion_note_on_merge_request, project: project) }
@@ -154,7 +185,7 @@ describe Projects::NotesController do
get :index, request_params
expect(parsed_response[:notes].count).to eq(1)
- expect(note_json[:id]).to eq(note.id)
+ expect(note_json[:id]).to eq(note.id.to_s)
end
it 'does not result in N+1 queries' do
@@ -207,6 +238,14 @@ describe Projects::NotesController do
expect(response).to have_gitlab_http_status(200)
end
+ it 'returns discussion JSON when the return_discussion param is set' do
+ post :create, request_params.merge(format: :json, return_discussion: 'true')
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to have_key 'discussion'
+ expect(json_response['discussion']['notes'][0]['note']).to eq(request_params[:note][:note])
+ end
+
context 'when merge_request_diff_head_sha present' do
before do
service_params = {
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index d89716b1b50..5c7415a318d 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -90,6 +90,11 @@ describe Projects::PipelinesController do
context 'when performing gitaly calls', :request_store do
it 'limits the Gitaly requests' do
+ # Isolate from test preparation (Repository#exists? is also cached in RequestStore)
+ RequestStore.end!
+ RequestStore.clear!
+ RequestStore.begin!
+
expect { get_pipelines_index_json }
.to change { Gitlab::GitalyClient.get_request_count }.by(2)
end
@@ -193,14 +198,34 @@ describe Projects::PipelinesController do
context 'when accessing existing stage' do
before do
+ create(:ci_build, :retried, :failed, pipeline: pipeline, stage: 'build')
create(:ci_build, pipeline: pipeline, stage: 'build')
+ end
+
+ context 'without retried' do
+ before do
+ get_stage('build')
+ end
- get_stage('build')
+ it 'returns pipeline jobs without the retried builds' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('pipeline_stage')
+ expect(json_response['latest_statuses'].length).to eq 1
+ expect(json_response).not_to have_key('retried')
+ end
end
- it 'returns html source for stage dropdown' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to match_response_schema('pipeline_stage')
+ context 'with retried' do
+ before do
+ get_stage('build', retried: true)
+ end
+
+ it 'returns pipelines jobs with the retried builds' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('pipeline_stage')
+ expect(json_response['latest_statuses'].length).to eq 1
+ expect(json_response['retried'].length).to eq 1
+ end
end
end
@@ -214,12 +239,13 @@ describe Projects::PipelinesController do
end
end
- def get_stage(name)
- get :stage, namespace_id: project.namespace,
- project_id: project,
- id: pipeline.id,
- stage: name,
- format: :json
+ def get_stage(name, params = {})
+ get :stage, **params.merge(
+ namespace_id: project.namespace,
+ project_id: project,
+ id: pipeline.id,
+ stage: name,
+ format: :json)
end
end
diff --git a/spec/controllers/projects/raw_controller_spec.rb b/spec/controllers/projects/raw_controller_spec.rb
index c3468536ae1..6b658bf5295 100644
--- a/spec/controllers/projects/raw_controller_spec.rb
+++ b/spec/controllers/projects/raw_controller_spec.rb
@@ -1,14 +1,21 @@
require 'spec_helper'
describe Projects::RawController do
- let(:public_project) { create(:project, :public, :repository) }
+ let(:project) { create(:project, :public, :repository) }
+
+ describe 'GET #show' do
+ subject do
+ get(:show,
+ namespace_id: project.namespace,
+ project_id: project,
+ id: filepath)
+ end
- describe '#show' do
context 'regular filename' do
- let(:id) { 'master/README.md' }
+ let(:filepath) { 'master/README.md' }
it 'delivers ASCII file' do
- get_show(public_project, id)
+ subject
expect(response).to have_gitlab_http_status(200)
expect(response.header['Content-Type']).to eq('text/plain; charset=utf-8')
@@ -19,10 +26,10 @@ describe Projects::RawController do
end
context 'image header' do
- let(:id) { 'master/files/images/6049019_460s.jpg' }
+ let(:filepath) { 'master/files/images/6049019_460s.jpg' }
it 'sets image content type header' do
- get_show(public_project, id)
+ subject
expect(response).to have_gitlab_http_status(200)
expect(response.header['Content-Type']).to eq('image/jpeg')
@@ -30,85 +37,9 @@ describe Projects::RawController do
end
end
- context 'lfs object' do
- let(:id) { 'be93687/files/lfs/lfs_object.iso' }
- let!(:lfs_object) { create(:lfs_object, oid: '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', size: '1575078') }
-
- context 'when lfs is enabled' do
- before do
- allow_any_instance_of(Project).to receive(:lfs_enabled?).and_return(true)
- end
-
- context 'when project has access' do
- before do
- public_project.lfs_objects << lfs_object
- allow_any_instance_of(LfsObjectUploader).to receive(:exists?).and_return(true)
- allow(controller).to receive(:send_file) { controller.head :ok }
- end
-
- it 'serves the file' do
- expect(controller).to receive(:send_file).with("#{LfsObjectUploader.root}/91/ef/f75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", filename: 'lfs_object.iso', disposition: 'attachment')
- get_show(public_project, id)
-
- expect(response).to have_gitlab_http_status(200)
- end
-
- context 'and lfs uses object storage' do
- let(:lfs_object) { create(:lfs_object, :with_file, oid: '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', size: '1575078') }
-
- before do
- stub_lfs_object_storage
- lfs_object.file.migrate!(LfsObjectUploader::Store::REMOTE)
- end
-
- it 'responds with redirect to file' do
- get_show(public_project, id)
-
- expect(response).to have_gitlab_http_status(302)
- expect(response.location).to include(lfs_object.reload.file.path)
- end
-
- it 'sets content disposition' do
- get_show(public_project, id)
-
- file_uri = URI.parse(response.location)
- params = CGI.parse(file_uri.query)
-
- expect(params["response-content-disposition"].first).to eq 'attachment;filename="lfs_object.iso"'
- end
- end
- end
-
- context 'when project does not have access' do
- it 'does not serve the file' do
- get_show(public_project, id)
-
- expect(response).to have_gitlab_http_status(404)
- end
- end
- end
-
- context 'when lfs is not enabled' do
- before do
- allow_any_instance_of(Project).to receive(:lfs_enabled?).and_return(false)
- end
-
- it 'delivers ASCII file' do
- get_show(public_project, id)
-
- expect(response).to have_gitlab_http_status(200)
- expect(response.header['Content-Type']).to eq('text/plain; charset=utf-8')
- expect(response.header['Content-Disposition'])
- .to eq('inline')
- expect(response.header[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with('git-blob:')
- end
- end
+ it_behaves_like 'repository lfs file load' do
+ let(:filename) { 'lfs_object.iso' }
+ let(:filepath) { "be93687/files/lfs/#{filename}" }
end
end
-
- def get_show(project, id)
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project,
- id: id)
- end
end
diff --git a/spec/controllers/projects/registry/repositories_controller_spec.rb b/spec/controllers/projects/registry/repositories_controller_spec.rb
index 17769a14def..d11e42b411b 100644
--- a/spec/controllers/projects/registry/repositories_controller_spec.rb
+++ b/spec/controllers/projects/registry/repositories_controller_spec.rb
@@ -86,9 +86,10 @@ describe Projects::Registry::RepositoriesController do
stub_container_registry_tags(repository: :any, tags: [])
end
- it 'deletes a repository' do
- expect { delete_repository(repository) }.to change { ContainerRepository.all.count }.by(-1)
+ it 'schedules a job to delete a repository' do
+ expect(DeleteContainerRepositoryWorker).to receive(:perform_async).with(user.id, repository.id)
+ delete_repository(repository)
expect(response).to have_gitlab_http_status(:no_content)
end
end
diff --git a/spec/controllers/projects/releases_controller_spec.rb b/spec/controllers/projects/releases_controller_spec.rb
index fc1619acec6..20a6beb3df8 100644
--- a/spec/controllers/projects/releases_controller_spec.rb
+++ b/spec/controllers/projects/releases_controller_spec.rb
@@ -14,7 +14,7 @@ describe Projects::ReleasesController do
describe 'GET #edit' do
it 'initializes a new release' do
tag_id = release.tag
- project.releases.destroy_all
+ project.releases.destroy_all # rubocop: disable DestroyAll
get :edit, namespace_id: project.namespace, project_id: project, tag_id: tag_id
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index 1f14a0cc381..4629929f9af 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -74,6 +74,19 @@ describe Projects::Settings::CiCdController do
end
end
+ describe 'PUT #reset_registration_token' do
+ subject { put :reset_registration_token, namespace_id: project.namespace, project_id: project }
+ it 'resets runner registration token' do
+ expect { subject }.to change { project.reload.runners_token }
+ end
+
+ it 'redirects the user to admin runners page' do
+ subject
+
+ expect(response).to redirect_to(namespace_project_settings_ci_cd_path)
+ end
+ end
+
describe 'PATCH update' do
let(:params) { { ci_config_path: '' } }
diff --git a/spec/controllers/projects/uploads_controller_spec.rb b/spec/controllers/projects/uploads_controller_spec.rb
index 325ee53aafb..9802e4d5b1e 100644
--- a/spec/controllers/projects/uploads_controller_spec.rb
+++ b/spec/controllers/projects/uploads_controller_spec.rb
@@ -18,6 +18,20 @@ describe Projects::UploadsController do
end
end
+ context "when exception occurs" do
+ before do
+ allow(FileUploader).to receive(:workhorse_authorize).and_raise(SocketError.new)
+ sign_in(create(:user))
+ end
+
+ it "responds with status internal_server_error" do
+ post_authorize
+
+ expect(response).to have_gitlab_http_status(500)
+ expect(response.body).to eq('Error uploading file')
+ end
+ end
+
def post_authorize(verified: true)
request.headers.merge!(workhorse_internal_api_request_header) if verified
diff --git a/spec/controllers/projects/wikis_controller_spec.rb b/spec/controllers/projects/wikis_controller_spec.rb
index 30623b6cb3d..6d75152857b 100644
--- a/spec/controllers/projects/wikis_controller_spec.rb
+++ b/spec/controllers/projects/wikis_controller_spec.rb
@@ -22,20 +22,18 @@ describe Projects::WikisController do
subject { get :show, namespace_id: project.namespace, project_id: project, id: wiki_title }
- context 'when page content encoding is invalid' do
- it 'limits the retrieved pages for the sidebar' do
- expect(controller).to receive(:load_wiki).and_return(project_wiki)
+ it 'limits the retrieved pages for the sidebar' do
+ expect(controller).to receive(:load_wiki).and_return(project_wiki)
- # empty? call
- expect(project_wiki).to receive(:pages).with(limit: 1).and_call_original
- # Sidebar entries
- expect(project_wiki).to receive(:pages).with(limit: 15).and_call_original
+ # empty? call
+ expect(project_wiki).to receive(:pages).with(limit: 1).and_call_original
+ # Sidebar entries
+ expect(project_wiki).to receive(:pages).with(limit: 15).and_call_original
- subject
+ subject
- expect(response).to have_http_status(:ok)
- expect(response.body).to include(wiki_title)
- end
+ expect(response).to have_http_status(:ok)
+ expect(response.body).to include(wiki_title)
end
context 'when page content encoding is invalid' do
@@ -48,6 +46,42 @@ describe Projects::WikisController do
expect(flash[:notice]).to eq 'The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository.'
end
end
+
+ context 'when page is a file' do
+ include WikiHelpers
+
+ let(:path) { upload_file_to_wiki(project, user, file_name) }
+
+ before do
+ subject
+ end
+
+ subject { get :show, namespace_id: project.namespace, project_id: project, id: path }
+
+ context 'when file is an image' do
+ let(:file_name) { 'dk.png' }
+
+ it 'renders the content inline' do
+ expect(response.headers['Content-Disposition']).to match(/^inline/)
+ end
+
+ context 'when file is a svg' do
+ let(:file_name) { 'unsanitized.svg' }
+
+ it 'renders the content as an attachment' do
+ expect(response.headers['Content-Disposition']).to match(/^attachment/)
+ end
+ end
+ end
+
+ context 'when file is a pdf' do
+ let(:file_name) { 'git-cheat-sheet.pdf' }
+
+ it 'sets the content type to application/octet-stream' do
+ expect(response.headers['Content-Type']).to eq 'application/octet-stream'
+ end
+ end
+ end
end
describe 'POST #preview_markdown' do
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 94644b1f9fd..3bc9cbe64c5 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -284,6 +284,19 @@ describe ProjectsController do
end
end
+ describe 'GET edit' do
+ it 'sets the badge API endpoint' do
+ sign_in(user)
+ project.add_maintainer(user)
+
+ get :edit,
+ namespace_id: project.namespace.path,
+ id: project.path
+
+ expect(assigns(:badge_api_endpoint)).not_to be_nil
+ end
+ end
+
describe "#update" do
render_views
@@ -790,37 +803,7 @@ describe ProjectsController do
project.add_maintainer(user)
end
- context 'object storage disabled' do
- before do
- stub_feature_flags(import_export_object_storage: false)
- end
-
- context 'when project export is enabled' do
- it 'returns 302' do
- get :download_export, namespace_id: project.namespace, id: project
-
- expect(response).to have_gitlab_http_status(302)
- end
- end
-
- context 'when project export is disabled' do
- before do
- stub_application_setting(project_export_enabled?: false)
- end
-
- it 'returns 404' do
- get :download_export, namespace_id: project.namespace, id: project
-
- expect(response).to have_gitlab_http_status(404)
- end
- end
- end
-
context 'object storage enabled' do
- before do
- stub_feature_flags(import_export_object_storage: true)
- end
-
context 'when project export is enabled' do
it 'returns 302' do
get :download_export, namespace_id: project.namespace, id: project
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 898f3863008..d334a2ff566 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -49,7 +49,7 @@ describe RegistrationsController do
end
it 'displays an error when the reCAPTCHA is not solved' do
- # Without this, `verify_recaptcha` arbitraily returns true in test env
+ # Without this, `verify_recaptcha` arbitrarily returns true in test env
Recaptcha.configuration.skip_verify_env.delete('test')
post(:create, user_params)
diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb
index 7688538a468..995f803d757 100644
--- a/spec/controllers/root_controller_spec.rb
+++ b/spec/controllers/root_controller_spec.rb
@@ -98,7 +98,7 @@ describe RootController do
it 'redirects to their assigned issues' do
get :index
- expect(response).to redirect_to issues_dashboard_path(assignee_id: user.id)
+ expect(response).to redirect_to issues_dashboard_path(assignee_username: user.username)
end
end
@@ -110,7 +110,7 @@ describe RootController do
it 'redirects to their assigned merge requests' do
get :index
- expect(response).to redirect_to merge_requests_dashboard_path(assignee_id: user.id)
+ expect(response).to redirect_to merge_requests_dashboard_path(assignee_username: user.username)
end
end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 8e25b61e2f1..c691b3f478b 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -89,7 +89,7 @@ describe SessionsController do
end
it 'displays an error when the reCAPTCHA is not solved' do
- # Without this, `verify_recaptcha` arbitraily returns true in test env
+ # Without this, `verify_recaptcha` arbitrarily returns true in test env
Recaptcha.configuration.skip_verify_env.delete('test')
counter = double(:counter)
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index bcf289f36a9..6420b70a54f 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -5,6 +5,17 @@ shared_examples 'content not cached without revalidation' do
end
end
+shared_examples 'content not cached without revalidation and no-store' do
+ it 'ensures content will not be cached without revalidation' do
+ # Fixed in newer versions of ActivePack, it will only output a single `private`.
+ if Gitlab.rails5?
+ expect(subject['Cache-Control']).to eq('max-age=0, private, must-revalidate, no-store')
+ else
+ expect(subject['Cache-Control']).to eq('max-age=0, private, must-revalidate, private, no-store')
+ end
+ end
+end
+
describe UploadsController do
let!(:user) { create(:user, avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) }
@@ -177,7 +188,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'user', mounted_as: 'avatar', id: user.id, filename: 'dk.png'
@@ -239,7 +250,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'project', mounted_as: 'avatar', id: project.id, filename: 'dk.png'
@@ -292,7 +303,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'project', mounted_as: 'avatar', id: project.id, filename: 'dk.png'
@@ -344,7 +355,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'group', mounted_as: 'avatar', id: group.id, filename: 'dk.png'
@@ -388,7 +399,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'group', mounted_as: 'avatar', id: group.id, filename: 'dk.png'
@@ -445,7 +456,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'note', mounted_as: 'attachment', id: note.id, filename: 'dk.png'
@@ -498,7 +509,7 @@ describe UploadsController do
expect(response).to have_gitlab_http_status(200)
end
- it_behaves_like 'content not cached without revalidation' do
+ it_behaves_like 'content not cached without revalidation and no-store' do
subject do
get :show, model: 'note', mounted_as: 'attachment', id: note.id, filename: 'dk.png'
diff --git a/spec/db/development/import_common_metrics_spec.rb b/spec/db/development/import_common_metrics_spec.rb
new file mode 100644
index 00000000000..25061ef0887
--- /dev/null
+++ b/spec/db/development/import_common_metrics_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Import metrics on development seed' do
+ subject { load Rails.root.join('db', 'fixtures', 'development', '99_common_metrics.rb') }
+
+ it "imports all prometheus metrics" do
+ expect(PrometheusMetric.common).to be_empty
+
+ subject
+
+ expect(PrometheusMetric.common).not_to be_empty
+ end
+end
diff --git a/spec/db/importers/common_metrics_importer_spec.rb b/spec/db/importers/common_metrics_importer_spec.rb
new file mode 100644
index 00000000000..68260820958
--- /dev/null
+++ b/spec/db/importers/common_metrics_importer_spec.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+require Rails.root.join("db", "importers", "common_metrics_importer.rb")
+
+describe Importers::PrometheusMetric do
+ it 'group enum equals ::PrometheusMetric' do
+ expect(described_class.groups).to eq(::PrometheusMetric.groups)
+ end
+
+ it 'GROUP_TITLES equals ::PrometheusMetric' do
+ expect(described_class::GROUP_TITLES).to eq(::PrometheusMetric::GROUP_TITLES)
+ end
+end
+
+describe Importers::CommonMetricsImporter do
+ subject { described_class.new }
+
+ context "does import common_metrics.yml" do
+ let(:groups) { subject.content }
+ let(:metrics) { groups.map { |group| group['metrics'] }.flatten }
+ let(:queries) { metrics.map { |group| group['queries'] }.flatten }
+ let(:query_ids) { queries.map { |query| query['id'] } }
+
+ before do
+ subject.execute
+ end
+
+ it "has the same amount of groups" do
+ expect(PrometheusMetric.common.group(:group).count.count).to eq(groups.count)
+ end
+
+ it "has the same amount of metrics" do
+ expect(PrometheusMetric.common.group(:group, :title).count.count).to eq(metrics.count)
+ end
+
+ it "has the same amount of queries" do
+ expect(PrometheusMetric.common.count).to eq(queries.count)
+ end
+
+ it "does not have duplicate IDs" do
+ expect(query_ids).to eq(query_ids.uniq)
+ end
+
+ it "imports all IDs" do
+ expect(PrometheusMetric.common.pluck(:identifier)).to contain_exactly(*query_ids)
+ end
+ end
+
+ context "does import common_metrics.yml" do
+ it "when executed from outside of the Rails.root" do
+ Dir.chdir(Dir.tmpdir) do
+ expect { subject.execute }.not_to raise_error
+ end
+
+ expect(PrometheusMetric.common).not_to be_empty
+ end
+ end
+
+ context 'does import properly all fields' do
+ let(:query_identifier) { 'response-metric' }
+ let(:group) do
+ {
+ group: 'Response metrics (NGINX Ingress)',
+ metrics: [{
+ title: "Throughput",
+ y_label: "Requests / Sec",
+ queries: [{
+ id: query_identifier,
+ query_range: 'my-query',
+ unit: 'my-unit',
+ label: 'status code'
+ }]
+ }]
+ }
+ end
+
+ before do
+ expect(subject).to receive(:content) { [group.deep_stringify_keys] }
+ end
+
+ shared_examples 'stores metric' do
+ let(:metric) { PrometheusMetric.find_by(identifier: query_identifier) }
+
+ it 'with all data' do
+ expect(metric.group).to eq('nginx_ingress')
+ expect(metric.title).to eq('Throughput')
+ expect(metric.y_label).to eq('Requests / Sec')
+ expect(metric.unit).to eq('my-unit')
+ expect(metric.legend).to eq('status code')
+ expect(metric.query).to eq('my-query')
+ end
+ end
+
+ context 'if ID is missing' do
+ let(:query_identifier) { }
+
+ it 'raises exception' do
+ expect { subject.execute }.to raise_error(described_class::MissingQueryId)
+ end
+ end
+
+ context 'for existing common metric with different ID' do
+ let!(:existing_metric) { create(:prometheus_metric, :common, identifier: 'my-existing-metric') }
+
+ before do
+ subject.execute
+ end
+
+ it_behaves_like 'stores metric' do
+ it 'and existing metric is not changed' do
+ expect(metric).not_to eq(existing_metric)
+ end
+ end
+ end
+
+ context 'when metric with ID exists ' do
+ let!(:existing_metric) { create(:prometheus_metric, :common, identifier: 'response-metric') }
+
+ before do
+ subject.execute
+ end
+
+ it_behaves_like 'stores metric' do
+ it 'and existing metric is changed' do
+ expect(metric).to eq(existing_metric)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/db/production/import_common_metrics_spec.rb b/spec/db/production/import_common_metrics_spec.rb
new file mode 100644
index 00000000000..1e4ff818a86
--- /dev/null
+++ b/spec/db/production/import_common_metrics_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Import metrics on production seed' do
+ subject { load Rails.root.join('db', 'fixtures', 'production', '999_common_metrics.rb') }
+
+ it "imports all prometheus metrics" do
+ expect(PrometheusMetric.common).to be_empty
+
+ subject
+
+ expect(PrometheusMetric.common).not_to be_empty
+ end
+end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
new file mode 100644
index 00000000000..e8584846b56
--- /dev/null
+++ b/spec/db/schema_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Database schema' do
+ let(:connection) { ActiveRecord::Base.connection }
+ let(:tables) { connection.tables }
+
+ # Use if you are certain that this column should not have a foreign key
+ IGNORED_FK_COLUMNS = {
+ abuse_reports: %w[reporter_id user_id],
+ application_settings: %w[performance_bar_allowed_group_id],
+ audit_events: %w[author_id entity_id],
+ award_emoji: %w[awardable_id user_id],
+ chat_names: %w[chat_id service_id team_id user_id],
+ chat_teams: %w[team_id],
+ ci_builds: %w[erased_by_id runner_id trigger_request_id user_id],
+ ci_pipelines: %w[user_id],
+ ci_runner_projects: %w[runner_id],
+ ci_trigger_requests: %w[commit_id],
+ cluster_providers_gcp: %w[gcp_project_id operation_id],
+ deploy_keys_projects: %w[deploy_key_id],
+ deployments: %w[deployable_id environment_id user_id],
+ emails: %w[user_id],
+ events: %w[target_id],
+ forked_project_links: %w[forked_from_project_id],
+ identities: %w[user_id],
+ issues: %w[last_edited_by_id],
+ keys: %w[user_id],
+ label_links: %w[target_id],
+ lfs_objects_projects: %w[lfs_object_id project_id],
+ members: %w[source_id created_by_id],
+ merge_requests: %w[last_edited_by_id],
+ namespaces: %w[owner_id parent_id],
+ notes: %w[author_id commit_id noteable_id updated_by_id resolved_by_id discussion_id],
+ notification_settings: %w[source_id],
+ oauth_access_grants: %w[resource_owner_id application_id],
+ oauth_access_tokens: %w[resource_owner_id application_id],
+ oauth_applications: %w[owner_id],
+ project_group_links: %w[group_id],
+ project_statistics: %w[namespace_id],
+ projects: %w[creator_id namespace_id ci_id],
+ redirect_routes: %w[source_id],
+ repository_languages: %w[programming_language_id],
+ routes: %w[source_id],
+ sent_notifications: %w[project_id noteable_id recipient_id commit_id in_reply_to_discussion_id],
+ snippets: %w[author_id],
+ spam_logs: %w[user_id],
+ subscriptions: %w[user_id subscribable_id],
+ taggings: %w[tag_id taggable_id tagger_id],
+ timelogs: %w[user_id],
+ todos: %w[target_id commit_id],
+ uploads: %w[model_id],
+ user_agent_details: %w[subject_id],
+ users: %w[color_scheme_id created_by_id theme_id],
+ users_star_projects: %w[user_id],
+ web_hooks: %w[service_id]
+ }.with_indifferent_access.freeze
+
+ context 'for table' do
+ ActiveRecord::Base.connection.tables.sort.each do |table|
+ describe table do
+ let(:indexes) { connection.indexes(table) }
+ let(:columns) { connection.columns(table) }
+ let(:foreign_keys) { connection.foreign_keys(table) }
+
+ context 'all foreign keys' do
+ # for index to be effective, the FK constraint has to be at first place
+ it 'are indexed' do
+ first_indexed_column = indexes.map(&:columns).map(&:first)
+ foreign_keys_columns = foreign_keys.map(&:column)
+
+ expect(first_indexed_column.uniq).to include(*foreign_keys_columns)
+ end
+ end
+
+ context 'columns ending with _id' do
+ let(:column_names) { columns.map(&:name) }
+ let(:column_names_with_id) { column_names.select { |column_name| column_name.ends_with?('_id') } }
+ let(:foreign_keys_columns) { foreign_keys.map(&:column) }
+ let(:ignored_columns) { ignored_fk_columns(table) }
+
+ it 'do have the foreign keys' do
+ expect(column_names_with_id - ignored_columns).to contain_exactly(*foreign_keys_columns)
+ end
+ end
+ end
+ end
+ end
+
+ private
+
+ def ignored_fk_columns(column)
+ IGNORED_FK_COLUMNS.fetch(column, [])
+ end
+end
diff --git a/spec/factories/board_group_recent_visit.rb b/spec/factories/board_group_recent_visit.rb
new file mode 100644
index 00000000000..97ad5d6d068
--- /dev/null
+++ b/spec/factories/board_group_recent_visit.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :board_group_recent_visit do
+ user
+ group
+ board
+ end
+end
diff --git a/spec/factories/board_project_recent_visit.rb b/spec/factories/board_project_recent_visit.rb
new file mode 100644
index 00000000000..49ae4d7b391
--- /dev/null
+++ b/spec/factories/board_project_recent_visit.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :board_project_recent_visit do
+ user
+ project
+ board
+ end
+end
diff --git a/spec/factories/broadcast_messages.rb b/spec/factories/broadcast_messages.rb
index 9a65e7f8a3f..1a2be5e9552 100644
--- a/spec/factories/broadcast_messages.rb
+++ b/spec/factories/broadcast_messages.rb
@@ -1,17 +1,17 @@
FactoryBot.define do
factory :broadcast_message do
message "MyText"
- starts_at 1.day.ago
- ends_at 1.day.from_now
+ starts_at { 1.day.ago }
+ ends_at { 1.day.from_now }
trait :expired do
- starts_at 5.days.ago
- ends_at 3.days.ago
+ starts_at { 5.days.ago }
+ ends_at { 3.days.ago }
end
trait :future do
- starts_at 5.days.from_now
- ends_at 6.days.from_now
+ starts_at { 5.days.from_now }
+ ends_at { 6.days.from_now }
end
end
end
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 9813190925b..90754319f05 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -27,6 +27,12 @@ FactoryBot.define do
pipeline factory: :ci_pipeline
+ trait :degenerated do
+ commands nil
+ options nil
+ yaml_variables nil
+ end
+
trait :started do
started_at 'Di 29. Okt 09:51:28 CET 2013'
end
@@ -70,6 +76,18 @@ FactoryBot.define do
status 'created'
end
+ trait :scheduled do
+ schedulable
+ status 'scheduled'
+ scheduled_at { 1.minute.since }
+ end
+
+ trait :expired_scheduled do
+ schedulable
+ status 'scheduled'
+ scheduled_at { 1.minute.ago }
+ end
+
trait :manual do
status 'manual'
self.when 'manual'
@@ -82,6 +100,30 @@ FactoryBot.define do
url: 'http://staging.example.com/$CI_JOB_NAME' }
end
+ trait :deploy_to_production do
+ environment 'production'
+
+ options environment: { name: 'production',
+ url: 'http://prd.example.com/$CI_JOB_NAME' }
+ end
+
+ trait :start_review_app do
+ environment 'review/$CI_COMMIT_REF_NAME'
+
+ options environment: { name: 'review/$CI_COMMIT_REF_NAME',
+ url: 'http://staging.example.com/$CI_JOB_NAME',
+ on_stop: 'stop_review_app' }
+ end
+
+ trait :stop_review_app do
+ name 'stop_review_app'
+ environment 'review/$CI_COMMIT_REF_NAME'
+
+ options environment: { name: 'review/$CI_COMMIT_REF_NAME',
+ url: 'http://staging.example.com/$CI_JOB_NAME',
+ action: 'stop' }
+ end
+
trait :allowed_to_fail do
allow_failure true
end
@@ -98,6 +140,15 @@ FactoryBot.define do
success
end
+ trait :schedulable do
+ self.when 'delayed'
+ options start_in: '1 minute'
+ end
+
+ trait :actionable do
+ self.when 'manual'
+ end
+
trait :retried do
retried true
end
@@ -159,12 +210,12 @@ FactoryBot.define do
end
trait :erased do
- erased_at Time.now
+ erased_at { Time.now }
erased_by factory: :user
end
trait :queued do
- queued_at Time.now
+ queued_at { Time.now }
runner factory: :ci_runner
end
@@ -194,7 +245,7 @@ FactoryBot.define do
end
trait :expired do
- artifacts_expire_at 1.minute.ago
+ artifacts_expire_at { 1.minute.ago }
end
trait :with_commit do
diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb
index 46aaaf6aa5d..2c76c22ba69 100644
--- a/spec/factories/ci/job_artifacts.rb
+++ b/spec/factories/ci/job_artifacts.rb
@@ -14,6 +14,33 @@ FactoryBot.define do
artifact.project ||= artifact.job.project
end
+ trait :raw do
+ file_format :raw
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/trace/sample_trace'), 'text/plain')
+ end
+ end
+
+ trait :zip do
+ file_format :zip
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/ci_build_artifacts.zip'), 'application/zip')
+ end
+ end
+
+ trait :gzip do
+ file_format :gzip
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/ci_build_artifacts_metadata.gz'), 'application/x-gzip')
+ end
+ end
+
trait :archive do
file_type :archive
file_format :zip
@@ -24,6 +51,12 @@ FactoryBot.define do
end
end
+ trait :legacy_archive do
+ archive
+
+ file_location :legacy_path
+ end
+
trait :metadata do
file_type :metadata
file_format :gzip
@@ -84,6 +117,16 @@ FactoryBot.define do
end
end
+ trait :codequality do
+ file_type :codequality
+ file_format :raw
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/codequality/codequality.json'), 'application/json')
+ end
+ end
+
trait :correct_checksum do
after(:build) do |artifact, evaluator|
artifact.file_sha256 = Digest::SHA256.file(artifact.file.path).hexdigest
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index a6ff226fa75..8a44ce52849 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -54,6 +54,10 @@ FactoryBot.define do
status :manual
end
+ trait :scheduled do
+ status :scheduled
+ end
+
trait :success do
status :success
end
@@ -77,6 +81,14 @@ FactoryBot.define do
pipeline.builds << build(:ci_build, :test_reports, pipeline: pipeline, project: pipeline.project)
end
end
+
+ trait :auto_devops_source do
+ config_source { Ci::Pipeline.config_sources[:auto_devops_source] }
+ end
+
+ trait :repository_source do
+ config_source { Ci::Pipeline.config_sources[:repository_source] }
+ end
end
end
end
diff --git a/spec/factories/ci/runners.rb b/spec/factories/ci/runners.rb
index 347e4f433e2..24e70913b87 100644
--- a/spec/factories/ci/runners.rb
+++ b/spec/factories/ci/runners.rb
@@ -9,7 +9,7 @@ FactoryBot.define do
runner_type :instance_type
trait :online do
- contacted_at Time.now
+ contacted_at { Time.now }
end
trait :instance do
@@ -47,5 +47,15 @@ FactoryBot.define do
trait :ref_protected do
access_level :ref_protected
end
+
+ trait :tagged_only do
+ run_untagged false
+
+ tag_list %w(tag1 tag2)
+ end
+
+ trait :locked do
+ locked true
+ end
end
end
diff --git a/spec/factories/clusters/applications/helm.rb b/spec/factories/clusters/applications/helm.rb
index 7c4a440b9a9..ff65c76cf26 100644
--- a/spec/factories/clusters/applications/helm.rb
+++ b/spec/factories/clusters/applications/helm.rb
@@ -22,14 +22,27 @@ FactoryBot.define do
status 3
end
+ trait :updating do
+ status 4
+ end
+
+ trait :updated do
+ status 5
+ end
+
trait :errored do
status(-1)
status_reason 'something went wrong'
end
+ trait :update_errored do
+ status(6)
+ status_reason 'something went wrong'
+ end
+
trait :timeouted do
installing
- updated_at ClusterWaitForAppInstallationWorker::TIMEOUT.ago
+ updated_at { ClusterWaitForAppInstallationWorker::TIMEOUT.ago }
end
factory :clusters_applications_ingress, class: Clusters::Applications::Ingress do
@@ -44,9 +57,14 @@ FactoryBot.define do
cluster factory: %i(cluster with_installed_helm provided_by_gcp)
end
+ factory :clusters_applications_knative, class: Clusters::Applications::Knative do
+ hostname 'example.com'
+ cluster factory: %i(cluster with_installed_helm provided_by_gcp)
+ end
+
factory :clusters_applications_jupyter, class: Clusters::Applications::Jupyter do
oauth_application factory: :oauth_application
- cluster factory: %i(cluster with_installed_helm provided_by_gcp)
+ cluster factory: %i(cluster with_installed_helm provided_by_gcp project)
end
end
end
diff --git a/spec/factories/clusters/clusters.rb b/spec/factories/clusters/clusters.rb
index bbeba8ce8b9..c9f5d0a813e 100644
--- a/spec/factories/clusters/clusters.rb
+++ b/spec/factories/clusters/clusters.rb
@@ -2,13 +2,28 @@ FactoryBot.define do
factory :cluster, class: Clusters::Cluster do
user
name 'test-cluster'
+ cluster_type :project_type
+
+ trait :instance do
+ cluster_type { Clusters::Cluster.cluster_types[:instance_type] }
+ end
trait :project do
+ cluster_type { Clusters::Cluster.cluster_types[:project_type] }
+
before(:create) do |cluster, evaluator|
cluster.projects << create(:project, :repository)
end
end
+ trait :group do
+ cluster_type { Clusters::Cluster.cluster_types[:group_type] }
+
+ before(:create) do |cluster, evalutor|
+ cluster.groups << create(:group)
+ end
+ end
+
trait :provided_by_user do
provider_type :user
platform_type :kubernetes
diff --git a/spec/factories/clusters/kubernetes_namespaces.rb b/spec/factories/clusters/kubernetes_namespaces.rb
new file mode 100644
index 00000000000..6ad93fb0f45
--- /dev/null
+++ b/spec/factories/clusters/kubernetes_namespaces.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :cluster_kubernetes_namespace, class: Clusters::KubernetesNamespace do
+ association :cluster, :project, :provided_by_gcp
+
+ after(:build) do |kubernetes_namespace|
+ cluster_project = kubernetes_namespace.cluster.cluster_project
+
+ kubernetes_namespace.project = cluster_project.project
+ kubernetes_namespace.cluster_project = cluster_project
+ end
+
+ trait :with_token do
+ service_account_token { FFaker::Lorem.characters(10) }
+ end
+ end
+end
diff --git a/spec/factories/clusters/platforms/kubernetes.rb b/spec/factories/clusters/platforms/kubernetes.rb
index 89f6ddebf6a..8169c457ab7 100644
--- a/spec/factories/clusters/platforms/kubernetes.rb
+++ b/spec/factories/clusters/platforms/kubernetes.rb
@@ -3,18 +3,21 @@ FactoryBot.define do
cluster
namespace nil
api_url 'https://kubernetes.example.com'
- token 'a' * 40
+ token { 'a' * 40 }
trait :configured do
api_url 'https://kubernetes.example.com'
- token 'a' * 40
username 'xxxxxx'
password 'xxxxxx'
- after(:create) do |platform_kubernetes, evaluator|
+ before(:create) do |platform_kubernetes, evaluator|
pem_file = File.expand_path(Rails.root.join('spec/fixtures/clusters/sample_cert.pem'))
platform_kubernetes.ca_cert = File.read(pem_file)
end
end
+
+ trait :rbac_enabled do
+ authorization_type :rbac
+ end
end
end
diff --git a/spec/factories/clusters/projects.rb b/spec/factories/clusters/projects.rb
new file mode 100644
index 00000000000..6cda77c6f85
--- /dev/null
+++ b/spec/factories/clusters/projects.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :cluster_project, class: Clusters::Project do
+ cluster
+ project
+ end
+end
diff --git a/spec/factories/commit_statuses.rb b/spec/factories/commit_statuses.rb
index 53368c64e10..381bf07f6a0 100644
--- a/spec/factories/commit_statuses.rb
+++ b/spec/factories/commit_statuses.rb
@@ -41,6 +41,10 @@ FactoryBot.define do
status 'manual'
end
+ trait :scheduled do
+ status 'scheduled'
+ end
+
after(:build) do |build, evaluator|
build.project = build.pipeline.project
end
diff --git a/spec/factories/deployments.rb b/spec/factories/deployments.rb
index cac56695319..011c98599a3 100644
--- a/spec/factories/deployments.rb
+++ b/spec/factories/deployments.rb
@@ -16,5 +16,36 @@ FactoryBot.define do
allow(deployment.project.repository).to receive(:create_ref)
end
end
+
+ trait :review_app do
+ sha { TestEnv::BRANCH_SHA['pages-deploy'] }
+ ref 'pages-deploy'
+ end
+
+ trait :running do
+ status :running
+ end
+
+ trait :success do
+ status :success
+ finished_at { Time.now }
+ end
+
+ trait :failed do
+ status :failed
+ finished_at { Time.now }
+ end
+
+ trait :canceled do
+ status :canceled
+ finished_at { Time.now }
+ end
+
+ # This trait hooks the state maechine's events
+ trait :succeed do
+ after(:create) do |deployment, evaluator|
+ deployment.succeed!
+ end
+ end
end
end
diff --git a/spec/factories/emails.rb b/spec/factories/emails.rb
index 4dc7961060a..feacd5ccf15 100644
--- a/spec/factories/emails.rb
+++ b/spec/factories/emails.rb
@@ -3,6 +3,7 @@ FactoryBot.define do
user
email { generate(:email_alias) }
- trait(:confirmed) { confirmed_at Time.now }
+ trait(:confirmed) { confirmed_at { Time.now } }
+ trait(:skip_validate) { to_create {|instance| instance.save(validate: false) } }
end
end
diff --git a/spec/factories/environments.rb b/spec/factories/environments.rb
index b5db57d5148..9d9e3d693b8 100644
--- a/spec/factories/environments.rb
+++ b/spec/factories/environments.rb
@@ -22,6 +22,7 @@ FactoryBot.define do
pipeline: pipeline)
deployment = create(:deployment,
+ :success,
environment: environment,
project: environment.project,
deployable: deployable,
diff --git a/spec/factories/events.rb b/spec/factories/events.rb
index 5798b81ecad..bf8411b1894 100644
--- a/spec/factories/events.rb
+++ b/spec/factories/events.rb
@@ -24,7 +24,7 @@ FactoryBot.define do
factory :push_event, class: PushEvent do
project factory: :project_empty_repo
- author factory: :user
+ author(factory: :user) { project.creator }
action Event::PUSHED
end
diff --git a/spec/factories/forked_project_links.rb b/spec/factories/forked_project_links.rb
deleted file mode 100644
index bc59fea81ec..00000000000
--- a/spec/factories/forked_project_links.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-FactoryBot.define do
- factory :forked_project_link do
- association :forked_to_project, factory: [:project, :repository]
- association :forked_from_project, factory: [:project, :repository]
-
- after(:create) do |link|
- link.forked_from_project.reload
- link.forked_to_project.reload
- end
-
- trait :forked_to_empty_project do
- association :forked_to_project, factory: [:project, :repository]
- end
- end
-end
diff --git a/spec/factories/gpg_keys.rb b/spec/factories/gpg_keys.rb
index 51b8ddc9934..3c0f43cc1b6 100644
--- a/spec/factories/gpg_keys.rb
+++ b/spec/factories/gpg_keys.rb
@@ -2,11 +2,11 @@ require_relative '../support/helpers/gpg_helpers'
FactoryBot.define do
factory :gpg_key do
- key GpgHelpers::User1.public_key
+ key { GpgHelpers::User1.public_key }
user
factory :gpg_key_with_subkeys do
- key GpgHelpers::User1.public_key_with_extra_signing_key
+ key { GpgHelpers::User1.public_key_with_extra_signing_key }
end
end
end
diff --git a/spec/factories/group_members.rb b/spec/factories/group_members.rb
index 47036560b9d..12be63e5d92 100644
--- a/spec/factories/group_members.rb
+++ b/spec/factories/group_members.rb
@@ -9,7 +9,7 @@ FactoryBot.define do
trait(:developer) { access_level GroupMember::DEVELOPER }
trait(:maintainer) { access_level GroupMember::MAINTAINER }
trait(:owner) { access_level GroupMember::OWNER }
- trait(:access_request) { requested_at Time.now }
+ trait(:access_request) { requested_at { Time.now } }
trait(:invited) do
user_id nil
diff --git a/spec/factories/issues.rb b/spec/factories/issues.rb
index 4d4f74e101e..ab27fee33dc 100644
--- a/spec/factories/issues.rb
+++ b/spec/factories/issues.rb
@@ -13,6 +13,10 @@ FactoryBot.define do
state :opened
end
+ trait :locked do
+ discussion_locked true
+ end
+
trait :closed do
state :closed
closed_at { Time.now }
diff --git a/spec/factories/merge_request_diff_files.rb b/spec/factories/merge_request_diff_files.rb
new file mode 100644
index 00000000000..469a7a0ac8d
--- /dev/null
+++ b/spec/factories/merge_request_diff_files.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :merge_request_diff_file do
+ association :merge_request_diff
+
+ relative_order 0
+ new_file true
+ renamed_file false
+ deleted_file false
+ too_large false
+ a_mode 0
+ b_mode 100644
+ new_path 'foo'
+ old_path 'foo'
+ diff ''
+ binary false
+
+ trait :new_file do
+ relative_order 0
+ new_file true
+ renamed_file false
+ deleted_file false
+ too_large false
+ a_mode 0
+ b_mode 100644
+ new_path 'foo'
+ old_path 'foo'
+ diff ''
+ binary false
+ end
+
+ trait :renamed_file do
+ relative_order 662
+ new_file false
+ renamed_file true
+ deleted_file false
+ too_large false
+ a_mode 100644
+ b_mode 100644
+ new_path 'bar'
+ old_path 'baz'
+ diff ''
+ binary false
+ end
+ end
+end
diff --git a/spec/factories/merge_request_diffs.rb b/spec/factories/merge_request_diffs.rb
new file mode 100644
index 00000000000..e7b51189538
--- /dev/null
+++ b/spec/factories/merge_request_diffs.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :merge_request_diff do
+ association :merge_request
+ state :collected
+ commits_count 1
+
+ base_commit_sha { Digest::SHA1.hexdigest(SecureRandom.hex) }
+ head_commit_sha { Digest::SHA1.hexdigest(SecureRandom.hex) }
+ start_commit_sha { Digest::SHA1.hexdigest(SecureRandom.hex) }
+ end
+end
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index b8b089b069b..2392bfc4a53 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -80,7 +80,7 @@ FactoryBot.define do
trait :merge_when_pipeline_succeeds do
merge_when_pipeline_succeeds true
- merge_user author
+ merge_user { author }
end
trait :remove_source_branch do
@@ -101,6 +101,20 @@ FactoryBot.define do
end
end
+ trait :deployed_review_app do
+ target_branch 'pages-deploy-target'
+
+ transient do
+ deployment { create(:deployment, :review_app) }
+ end
+
+ after(:build) do |merge_request, evaluator|
+ merge_request.source_branch = evaluator.deployment.ref
+ merge_request.source_project = evaluator.deployment.project
+ merge_request.target_project = evaluator.deployment.project
+ end
+ end
+
after(:build) do |merge_request|
target_project = merge_request.target_project
source_project = merge_request.source_project
diff --git a/spec/factories/milestones.rb b/spec/factories/milestones.rb
index 019e4420212..027349b2f8e 100644
--- a/spec/factories/milestones.rb
+++ b/spec/factories/milestones.rb
@@ -34,7 +34,7 @@ FactoryBot.define do
milestone.project_id = evaluator.project_id
elsif evaluator.parent
id = evaluator.parent.id
- evaluator.parent.is_a?(Group) ? board.group_id = id : evaluator.project_id = id
+ evaluator.parent.is_a?(Group) ? evaluator.group_id = id : evaluator.project_id = id
else
milestone.project = create(:project)
end
diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb
index 6844ed8aa4a..2d1f48bf249 100644
--- a/spec/factories/notes.rb
+++ b/spec/factories/notes.rb
@@ -90,7 +90,7 @@ FactoryBot.define do
noteable nil
noteable_type 'Commit'
noteable_id nil
- commit_id RepoHelpers.sample_commit.id
+ commit_id { RepoHelpers.sample_commit.id }
end
trait :legacy_diff_note do
diff --git a/spec/factories/oauth_access_grants.rb b/spec/factories/oauth_access_grants.rb
index 9e6af24c4eb..02c51cd9899 100644
--- a/spec/factories/oauth_access_grants.rb
+++ b/spec/factories/oauth_access_grants.rb
@@ -3,7 +3,7 @@ FactoryBot.define do
resource_owner_id { create(:user).id }
application
token { Doorkeeper::OAuth::Helpers::UniqueToken.generate }
- expires_in 2.hours
+ expires_in { 2.hours }
redirect_uri { application.redirect_uri }
scopes { application.scopes }
diff --git a/spec/factories/project_auto_devops.rb b/spec/factories/project_auto_devops.rb
index b77f702f9e1..75ac7cc7687 100644
--- a/spec/factories/project_auto_devops.rb
+++ b/spec/factories/project_auto_devops.rb
@@ -5,8 +5,16 @@ FactoryBot.define do
domain "example.com"
deploy_strategy :continuous
- trait :manual do
- deploy_strategy :manual
+ trait :continuous_deployment do
+ deploy_strategy ProjectAutoDevops.deploy_strategies[:continuous] # rubocop:disable FactoryBot/DynamicAttributeDefinedStatically
+ end
+
+ trait :manual_deployment do
+ deploy_strategy ProjectAutoDevops.deploy_strategies[:manual] # rubocop:disable FactoryBot/DynamicAttributeDefinedStatically
+ end
+
+ trait :timed_incremental_deployment do
+ deploy_strategy ProjectAutoDevops.deploy_strategies[:timed_incremental] # rubocop:disable FactoryBot/DynamicAttributeDefinedStatically
end
trait :disabled do
diff --git a/spec/factories/project_group_links.rb b/spec/factories/project_group_links.rb
index d5ace9425a0..59c77627ee5 100644
--- a/spec/factories/project_group_links.rb
+++ b/spec/factories/project_group_links.rb
@@ -2,5 +2,6 @@ FactoryBot.define do
factory :project_group_link do
project
group
+ expires_at nil
end
end
diff --git a/spec/factories/project_members.rb b/spec/factories/project_members.rb
index 22a8085ea45..c72e0487895 100644
--- a/spec/factories/project_members.rb
+++ b/spec/factories/project_members.rb
@@ -8,7 +8,7 @@ FactoryBot.define do
trait(:reporter) { access_level ProjectMember::REPORTER }
trait(:developer) { access_level ProjectMember::DEVELOPER }
trait(:maintainer) { access_level ProjectMember::MAINTAINER }
- trait(:access_request) { requested_at Time.now }
+ trait(:access_request) { requested_at { Time.now } }
trait(:invited) do
user_id nil
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index 1215b04913e..e4823a5adf1 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -1,6 +1,8 @@
require_relative '../support/helpers/test_env'
FactoryBot.define do
+ PAGES_ACCESS_LEVEL_SCHEMA_VERSION = 20180423204600
+
# Project without repository
#
# Project does not have bare repository.
@@ -23,6 +25,7 @@ FactoryBot.define do
issues_access_level ProjectFeature::ENABLED
merge_requests_access_level ProjectFeature::ENABLED
repository_access_level ProjectFeature::ENABLED
+ pages_access_level ProjectFeature::ENABLED
# we can't assign the delegated `#ci_cd_settings` attributes directly, as the
# `#ci_cd_settings` relation needs to be created first
@@ -34,13 +37,20 @@ FactoryBot.define do
builds_access_level = [evaluator.builds_access_level, evaluator.repository_access_level].min
merge_requests_access_level = [evaluator.merge_requests_access_level, evaluator.repository_access_level].min
- project.project_feature.update(
+ hash = {
wiki_access_level: evaluator.wiki_access_level,
builds_access_level: builds_access_level,
snippets_access_level: evaluator.snippets_access_level,
issues_access_level: evaluator.issues_access_level,
merge_requests_access_level: merge_requests_access_level,
- repository_access_level: evaluator.repository_access_level)
+ repository_access_level: evaluator.repository_access_level
+ }
+
+ if ActiveRecord::Migrator.current_version >= PAGES_ACCESS_LEVEL_SCHEMA_VERSION
+ hash.store("pages_access_level", evaluator.pages_access_level)
+ end
+
+ project.project_feature.update(hash)
# Normally the class Projects::CreateService is used for creating
# projects, and this class takes care of making sure the owner and current
@@ -103,30 +113,41 @@ FactoryBot.define do
end
trait :with_export do
- before(:create) do |_project, _evaluator|
- allow(Feature).to receive(:enabled?).with(:import_export_object_storage) { false }
- allow(Feature).to receive(:enabled?).with('import_export_object_storage') { false }
- end
-
after(:create) do |project, _evaluator|
ProjectExportWorker.new.perform(project.creator.id, project.id)
end
end
- trait :with_object_export do
- before(:create) do |_project, _evaluator|
- allow(Feature).to receive(:enabled?).with(:import_export_object_storage) { true }
- allow(Feature).to receive(:enabled?).with('import_export_object_storage') { true }
+ trait :broken_storage do
+ after(:create) do |project|
+ project.update_column(:repository_storage, 'broken')
end
+ end
- after(:create) do |project, evaluator|
- ProjectExportWorker.new.perform(project.creator.id, project.id)
+ # Build a custom repository by specifying a hash of `filename => content` in
+ # the transient `files` attribute. Each file will be created in its own
+ # commit, operating against the master branch. So, the following call:
+ #
+ # create(:project, :custom_repo, files: { 'foo/a.txt' => 'foo', 'b.txt' => bar' })
+ #
+ # will create a repository containing two files, and two commits, in master
+ trait :custom_repo do
+ transient do
+ files {}
end
- end
- trait :broken_storage do
- after(:create) do |project|
- project.update_column(:repository_storage, 'broken')
+ after :create do |project, evaluator|
+ raise "Failed to create repository!" unless project.create_repository
+
+ evaluator.files.each do |filename, content|
+ project.repository.create_file(
+ project.creator,
+ filename,
+ content,
+ message: "Automatically created file #{filename}",
+ branch_name: 'master'
+ )
+ end
end
end
@@ -233,6 +254,14 @@ FactoryBot.define do
trait(:repository_enabled) { repository_access_level ProjectFeature::ENABLED }
trait(:repository_disabled) { repository_access_level ProjectFeature::DISABLED }
trait(:repository_private) { repository_access_level ProjectFeature::PRIVATE }
+ trait(:pages_public) { pages_access_level ProjectFeature::PUBLIC }
+ trait(:pages_enabled) { pages_access_level ProjectFeature::ENABLED }
+ trait(:pages_disabled) { pages_access_level ProjectFeature::DISABLED }
+ trait(:pages_private) { pages_access_level ProjectFeature::PRIVATE }
+
+ trait :auto_devops do
+ association :auto_devops, factory: :project_auto_devops
+ end
end
# Project with empty repository
diff --git a/spec/factories/prometheus_metrics.rb b/spec/factories/prometheus_metrics.rb
new file mode 100644
index 00000000000..c56644bfb96
--- /dev/null
+++ b/spec/factories/prometheus_metrics.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :prometheus_metric, class: PrometheusMetric do
+ title 'title'
+ query 'avg(metric)'
+ y_label 'y_label'
+ unit 'm/s'
+ group :business
+ project
+ legend 'legend'
+
+ trait :common do
+ common true
+ project nil
+ end
+ end
+end
diff --git a/spec/factories/resource_label_events.rb b/spec/factories/resource_label_events.rb
index a67ad78c098..739ba901052 100644
--- a/spec/factories/resource_label_events.rb
+++ b/spec/factories/resource_label_events.rb
@@ -2,9 +2,12 @@
FactoryBot.define do
factory :resource_label_event do
- user { issue.project.creator }
action :add
label
- issue
+ user { issuable&.author || create(:user) }
+
+ after(:build) do |event, evaluator|
+ event.issue = create(:issue) unless event.issuable
+ end
end
end
diff --git a/spec/factories/services.rb b/spec/factories/services.rb
index 0d4fd49bf3a..5be56a49903 100644
--- a/spec/factories/services.rb
+++ b/spec/factories/services.rb
@@ -46,6 +46,17 @@ FactoryBot.define do
)
end
+ factory :jira_cloud_service, class: JiraService do
+ project
+ active true
+ properties(
+ url: 'https://mysite.atlassian.net',
+ username: 'jira_user',
+ password: 'my-secret-password',
+ project_key: 'jira-key'
+ )
+ end
+
factory :hipchat_service do
project
type 'HipchatService'
diff --git a/spec/factories/site_statistics.rb b/spec/factories/site_statistics.rb
index dd8c795515a..2533d0eecc2 100644
--- a/spec/factories/site_statistics.rb
+++ b/spec/factories/site_statistics.rb
@@ -2,6 +2,5 @@ FactoryBot.define do
factory :site_statistics, class: 'SiteStatistic' do
id 1
repositories_count 999
- wikis_count 555
end
end
diff --git a/spec/factories/todos.rb b/spec/factories/todos.rb
index 14486c80341..ed3d87eb76b 100644
--- a/spec/factories/todos.rb
+++ b/spec/factories/todos.rb
@@ -49,7 +49,7 @@ FactoryBot.define do
author
user
action { Todo::ASSIGNED }
- commit_id RepoHelpers.sample_commit.id
+ commit_id { RepoHelpers.sample_commit.id }
target_type "Commit"
end
end
diff --git a/spec/factories/uploads.rb b/spec/factories/uploads.rb
index a81b2169b89..7256f785e1f 100644
--- a/spec/factories/uploads.rb
+++ b/spec/factories/uploads.rb
@@ -1,7 +1,7 @@
FactoryBot.define do
factory :upload do
model { build(:project) }
- size 100.kilobytes
+ size { 100.kilobytes }
uploader "AvatarUploader"
mount_point :avatar
secret nil
@@ -19,13 +19,13 @@ FactoryBot.define do
uploader "PersonalFileUploader"
path { File.join(secret, filename) }
model { build(:personal_snippet) }
- secret SecureRandom.hex
+ secret { SecureRandom.hex }
end
trait :issuable_upload do
uploader "FileUploader"
path { File.join(secret, filename) }
- secret SecureRandom.hex
+ secret { SecureRandom.hex }
end
trait :with_file do
@@ -43,7 +43,14 @@ FactoryBot.define do
model { build(:group) }
path { File.join(secret, filename) }
uploader "NamespaceFileUploader"
- secret SecureRandom.hex
+ secret { SecureRandom.hex }
+ end
+
+ trait :favicon_upload do
+ model { build(:appearance) }
+ path { File.join(secret, filename) }
+ uploader "FaviconUploader"
+ secret { SecureRandom.hex }
end
trait :attachment_upload do
diff --git a/spec/factories/user_preferences.rb b/spec/factories/user_preferences.rb
new file mode 100644
index 00000000000..19059a93625
--- /dev/null
+++ b/spec/factories/user_preferences.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :user_preference do
+ user
+
+ trait :only_comments do
+ issue_notes_filter { UserPreference::NOTES_FILTERS[:only_comments] }
+ merge_request_notes_filter { UserPreference::NOTE_FILTERS[:only_comments] }
+ end
+ end
+end
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
index 59db8cdc34b..a47bd7cafca 100644
--- a/spec/factories/users.rb
+++ b/spec/factories/users.rb
@@ -58,6 +58,14 @@ FactoryBot.define do
project_view :readme
end
+ trait :commit_email do
+ after(:create) do |user, evaluator|
+ additional = create(:email, :confirmed, user: user, email: "commit-#{user.email}")
+
+ user.update!(commit_email: additional.email)
+ end
+ end
+
factory :omniauth_user do
transient do
extern_uid '123456'
diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb
index 134eb25e4b1..0b5ab16ad71 100644
--- a/spec/fast_spec_helper.rb
+++ b/spec/fast_spec_helper.rb
@@ -8,3 +8,5 @@ require_relative 'support/rspec'
require 'active_support/all'
ActiveSupport::Dependencies.autoload_paths << 'lib'
+ActiveSupport::Dependencies.autoload_paths << 'ee/lib'
+ActiveSupport::XmlMini.backend = 'Nokogiri'
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index 96dfde2e08c..735ca60f7da 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -53,13 +53,33 @@ describe 'Admin Groups' do
expect_selected_visibility(internal)
end
- it 'when entered in group path, it auto filled the group name', :js do
+ it 'when entered in group name, it auto filled the group path', :js do
visit admin_groups_path
click_link "New group"
- group_path = 'gitlab'
+ group_name = 'gitlab'
+ fill_in 'group_name', with: group_name
+ path_field = find('input#group_path')
+ expect(path_field.value).to eq group_name
+ end
+
+ it 'auto populates the group path with the group name', :js do
+ visit admin_groups_path
+ click_link "New group"
+ group_name = 'my gitlab project'
+ fill_in 'group_name', with: group_name
+ path_field = find('input#group_path')
+ expect(path_field.value).to eq 'my-gitlab-project'
+ end
+
+ it 'when entering in group path, group name does not change anymore', :js do
+ visit admin_groups_path
+ click_link "New group"
+ group_path = 'my-gitlab-project'
+ group_name = 'My modified gitlab project'
fill_in 'group_path', with: group_path
- name_field = find('input#group_name')
- expect(name_field.value).to eq group_path
+ fill_in 'group_name', with: group_name
+ path_field = find('input#group_path')
+ expect(path_field.value).to eq 'my-gitlab-project'
end
end
diff --git a/spec/features/admin/admin_health_check_spec.rb b/spec/features/admin/admin_health_check_spec.rb
index aaa3e8dc821..790051dd933 100644
--- a/spec/features/admin/admin_health_check_spec.rb
+++ b/spec/features/admin/admin_health_check_spec.rb
@@ -2,10 +2,11 @@ require 'spec_helper'
describe "Admin Health Check", :feature do
include StubENV
+ set(:admin) { create(:admin) }
before do
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
- sign_in(create(:admin))
+ sign_in(admin)
end
describe '#show' do
@@ -56,27 +57,4 @@ describe "Admin Health Check", :feature do
expect(page).to have_content('The server is on fire')
end
end
-
- context 'with repository storage failures', :broken_storage do
- before do
- visit admin_health_check_path
- end
-
- it 'shows storage failure information' do
- hostname = Gitlab::Environment.hostname
- maximum_failures = Gitlab::CurrentSettings.current_application_settings
- .circuitbreaker_failure_count_threshold
- number_of_failures = maximum_failures + 1
-
- expect(page).to have_content("broken: #{number_of_failures} failed storage access attempts:")
- expect(page).to have_content("#{hostname}: #{number_of_failures} of #{maximum_failures} failures.")
- end
-
- it 'allows resetting storage failures' do
- click_button 'Reset git storage health information'
-
- expect(page).to have_content('Git storage health information has been reset')
- expect(page).not_to have_content('failed storage access attempt')
- end
- end
end
diff --git a/spec/features/admin/admin_manage_applications_spec.rb b/spec/features/admin/admin_manage_applications_spec.rb
index f979d2f6090..a4904272706 100644
--- a/spec/features/admin/admin_manage_applications_spec.rb
+++ b/spec/features/admin/admin_manage_applications_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'admin manage applications' do
check :doorkeeper_application_trusted
click_on 'Submit'
expect(page).to have_content('Application: test')
- expect(page).to have_content('Application Id')
+ expect(page).to have_content('Application ID')
expect(page).to have_content('Secret')
expect(page).to have_content('Trusted Y')
@@ -28,7 +28,7 @@ RSpec.describe 'admin manage applications' do
click_on 'Submit'
expect(page).to have_content('test_changed')
- expect(page).to have_content('Application Id')
+ expect(page).to have_content('Application ID')
expect(page).to have_content('Secret')
expect(page).to have_content('Trusted N')
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index be8754a5315..ed9c0ea9ac0 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -2,6 +2,8 @@ require 'spec_helper'
describe "Admin Runners" do
include StubENV
+ include FilteredSearchHelpers
+ include SortingHelper
before do
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
@@ -12,39 +14,156 @@ describe "Admin Runners" do
let(:pipeline) { create(:ci_pipeline) }
context "when there are runners" do
- before do
- runner = FactoryBot.create(:ci_runner, contacted_at: Time.now)
- FactoryBot.create(:ci_build, pipeline: pipeline, runner_id: runner.id)
+ it 'has all necessary texts' do
+ runner = create(:ci_runner, contacted_at: Time.now)
+ create(:ci_build, pipeline: pipeline, runner_id: runner.id)
visit admin_runners_path
- end
- it 'has all necessary texts' do
- expect(page).to have_text "Setup a shared Runner manually"
- expect(page).to have_text "Runners with last contact more than a minute ago: 1"
+ expect(page).to have_text "Set up a shared Runner manually"
+ expect(page).to have_text "Runners currently online: 1"
end
- describe 'search' do
+ describe 'search', :js do
before do
- FactoryBot.create :ci_runner, description: 'runner-foo'
- FactoryBot.create :ci_runner, description: 'runner-bar'
+ create(:ci_runner, description: 'runner-foo')
+ create(:ci_runner, description: 'runner-bar')
+
+ visit admin_runners_path
end
it 'shows correct runner when description matches' do
- search_form = find('#runners-search')
- search_form.fill_in 'search', with: 'runner-foo'
- search_form.click_button 'Search'
+ input_filtered_search_keys('runner-foo')
expect(page).to have_content("runner-foo")
expect(page).not_to have_content("runner-bar")
end
it 'shows no runner when description does not match' do
- search_form = find('#runners-search')
- search_form.fill_in 'search', with: 'runner-baz'
- search_form.click_button 'Search'
+ input_filtered_search_keys('runner-baz')
+
+ expect(page).to have_text 'No runners found'
+ end
+ end
+
+ describe 'filter by status', :js do
+ it 'shows correct runner when status matches' do
+ create(:ci_runner, description: 'runner-active', active: true)
+ create(:ci_runner, description: 'runner-paused', active: false)
+
+ visit admin_runners_path
+
+ expect(page).to have_content 'runner-active'
+ expect(page).to have_content 'runner-paused'
+
+ input_filtered_search_keys('status:active')
+ expect(page).to have_content 'runner-active'
+ expect(page).not_to have_content 'runner-paused'
+ end
+
+ it 'shows no runner when status does not match' do
+ create(:ci_runner, :online, description: 'runner-active', active: true)
+ create(:ci_runner, :online, description: 'runner-paused', active: false)
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('status:offline')
+
+ expect(page).not_to have_content 'runner-active'
+ expect(page).not_to have_content 'runner-paused'
+
+ expect(page).to have_text 'No runners found'
+ end
+
+ it 'shows correct runner when status is selected and search term is entered' do
+ create(:ci_runner, description: 'runner-a-1', active: true)
+ create(:ci_runner, description: 'runner-a-2', active: false)
+ create(:ci_runner, description: 'runner-b-1', active: true)
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('status:active')
+ expect(page).to have_content 'runner-a-1'
+ expect(page).to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+
+ input_filtered_search_keys('status:active runner-a')
+ expect(page).to have_content 'runner-a-1'
+ expect(page).not_to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+ end
+ end
+
+ describe 'filter by type', :js do
+ it 'shows correct runner when type matches' do
+ create :ci_runner, :project, description: 'runner-project'
+ create :ci_runner, :group, description: 'runner-group'
+
+ visit admin_runners_path
+
+ expect(page).to have_content 'runner-project'
+ expect(page).to have_content 'runner-group'
+
+ input_filtered_search_keys('type:project_type')
+ expect(page).to have_content 'runner-project'
+ expect(page).not_to have_content 'runner-group'
+ end
+
+ it 'shows no runner when type does not match' do
+ create :ci_runner, :project, description: 'runner-project'
+ create :ci_runner, :group, description: 'runner-group'
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('type:instance_type')
+
+ expect(page).not_to have_content 'runner-project'
+ expect(page).not_to have_content 'runner-group'
expect(page).to have_text 'No runners found'
end
+
+ it 'shows correct runner when type is selected and search term is entered' do
+ create :ci_runner, :project, description: 'runner-a-1'
+ create :ci_runner, :instance, description: 'runner-a-2'
+ create :ci_runner, :project, description: 'runner-b-1'
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('type:project_type')
+ expect(page).to have_content 'runner-a-1'
+ expect(page).to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+
+ input_filtered_search_keys('type:project_type runner-a')
+ expect(page).to have_content 'runner-a-1'
+ expect(page).not_to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+ end
+ end
+
+ it 'sorts by last contact date', :js do
+ create(:ci_runner, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
+ create(:ci_runner, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')
+
+ visit admin_runners_path
+
+ within '.runners-content .gl-responsive-table-row:nth-child(2)' do
+ expect(page).to have_content 'runner-2'
+ end
+
+ within '.runners-content .gl-responsive-table-row:nth-child(3)' do
+ expect(page).to have_content 'runner-1'
+ end
+
+ sorting_by 'Last Contact'
+
+ within '.runners-content .gl-responsive-table-row:nth-child(2)' do
+ expect(page).to have_content 'runner-1'
+ end
+
+ within '.runners-content .gl-responsive-table-row:nth-child(3)' do
+ expect(page).to have_content 'runner-2'
+ end
end
end
@@ -54,8 +173,8 @@ describe "Admin Runners" do
end
it 'has all necessary texts including no runner message' do
- expect(page).to have_text "Setup a shared Runner manually"
- expect(page).to have_text "Runners with last contact more than a minute ago: 0"
+ expect(page).to have_text "Set up a shared Runner manually"
+ expect(page).to have_text "Runners currently online: 0"
expect(page).to have_text 'No runners found'
end
end
@@ -76,7 +195,7 @@ describe "Admin Runners" do
context 'shared runner' do
it 'shows the label and does not show the project count' do
- runner = create :ci_runner, :instance
+ runner = create(:ci_runner, :instance)
visit admin_runners_path
@@ -89,8 +208,8 @@ describe "Admin Runners" do
context 'specific runner' do
it 'shows the label and the project count' do
- project = create :project
- runner = create :ci_runner, :project, projects: [project]
+ project = create(:project)
+ runner = create(:ci_runner, :project, projects: [project])
visit admin_runners_path
@@ -103,11 +222,11 @@ describe "Admin Runners" do
end
describe "Runner show page" do
- let(:runner) { FactoryBot.create :ci_runner }
+ let(:runner) { create(:ci_runner) }
before do
- @project1 = FactoryBot.create(:project)
- @project2 = FactoryBot.create(:project)
+ @project1 = create(:project)
+ @project2 = create(:project)
visit admin_runner_path(runner)
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index af1c153dec8..0a69a26eb3e 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -9,319 +9,365 @@ describe 'Admin updates settings' do
before do
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
sign_in(admin)
- visit admin_application_settings_path
end
- it 'Change visibility settings' do
- page.within('.as-visibility-access') do
- choose "application_setting_default_project_visibility_20"
- click_button 'Save changes'
+ context 'General page' do
+ before do
+ visit admin_application_settings_path
end
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Change visibility settings' do
+ page.within('.as-visibility-access') do
+ choose "application_setting_default_project_visibility_20"
+ click_button 'Save changes'
+ end
- it 'Uncheck all restricted visibility levels' do
- page.within('.as-visibility-access') do
- find('#application_setting_visibility_level_0').set(false)
- find('#application_setting_visibility_level_10').set(false)
- find('#application_setting_visibility_level_20').set(false)
- click_button 'Save changes'
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(page).to have_content "Application settings saved successfully"
- expect(find('#application_setting_visibility_level_0')).not_to be_checked
- expect(find('#application_setting_visibility_level_10')).not_to be_checked
- expect(find('#application_setting_visibility_level_20')).not_to be_checked
- end
+ it 'Uncheck all restricted visibility levels' do
+ page.within('.as-visibility-access') do
+ find('#application_setting_visibility_level_0').set(false)
+ find('#application_setting_visibility_level_10').set(false)
+ find('#application_setting_visibility_level_20').set(false)
+ click_button 'Save changes'
+ end
- it 'Modify import sources' do
- expect(Gitlab::CurrentSettings.import_sources).not_to be_empty
+ expect(page).to have_content "Application settings saved successfully"
+ expect(find('#application_setting_visibility_level_0')).not_to be_checked
+ expect(find('#application_setting_visibility_level_10')).not_to be_checked
+ expect(find('#application_setting_visibility_level_20')).not_to be_checked
+ end
- page.within('.as-visibility-access') do
- Gitlab::ImportSources.options.map do |name, _|
- uncheck name
+ it 'Modify import sources' do
+ expect(Gitlab::CurrentSettings.import_sources).not_to be_empty
+
+ page.within('.as-visibility-access') do
+ Gitlab::ImportSources.options.map do |name, _|
+ uncheck name
+ end
+
+ click_button 'Save changes'
end
- click_button 'Save changes'
- end
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.import_sources).to be_empty
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.import_sources).to be_empty
+ page.within('.as-visibility-access') do
+ check "Repo by URL"
+ click_button 'Save changes'
+ end
- page.within('.as-visibility-access') do
- check "Repo by URL"
- click_button 'Save changes'
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.import_sources).to eq(['git'])
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.import_sources).to eq(['git'])
- end
+ it 'Change Visibility and Access Controls' do
+ page.within('.as-visibility-access') do
+ uncheck 'Project export enabled'
+ click_button 'Save changes'
+ end
- it 'Change Visibility and Access Controls' do
- page.within('.as-visibility-access') do
- uncheck 'Project export enabled'
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.project_export_enabled).to be_falsey
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(Gitlab::CurrentSettings.project_export_enabled).to be_falsey
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Change Keys settings' do
+ page.within('.as-visibility-access') do
+ select 'Are forbidden', from: 'RSA SSH keys'
+ select 'Are allowed', from: 'DSA SSH keys'
+ select 'Must be at least 384 bits', from: 'ECDSA SSH keys'
+ select 'Are forbidden', from: 'ED25519 SSH keys'
+ click_on 'Save changes'
+ end
+
+ forbidden = ApplicationSetting::FORBIDDEN_KEY_VALUE.to_s
- it 'Change Account and Limit Settings' do
- page.within('.as-account-limit') do
- uncheck 'Gravatar enabled'
- click_button 'Save changes'
+ expect(page).to have_content 'Application settings saved successfully'
+ expect(find_field('RSA SSH keys').value).to eq(forbidden)
+ expect(find_field('DSA SSH keys').value).to eq('0')
+ expect(find_field('ECDSA SSH keys').value).to eq('384')
+ expect(find_field('ED25519 SSH keys').value).to eq(forbidden)
end
- expect(Gitlab::CurrentSettings.gravatar_enabled).to be_falsey
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Change Account and Limit Settings' do
+ page.within('.as-account-limit') do
+ uncheck 'Gravatar enabled'
+ click_button 'Save changes'
+ end
- it 'Change Sign-in restrictions' do
- page.within('.as-signin') do
- fill_in 'Home page URL', with: 'https://about.gitlab.com/'
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.gravatar_enabled).to be_falsey
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(Gitlab::CurrentSettings.home_page_url).to eq "https://about.gitlab.com/"
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Change New users set to external', :js do
+ user_internal_regex = find('#application_setting_user_default_internal_regex', visible: :all)
- it 'Terms of Service' do
- # Already have the admin accept terms, so they don't need to accept in this spec.
- _existing_terms = create(:term)
- accept_terms(admin)
+ expect(user_internal_regex).to be_readonly
+ expect(user_internal_regex['placeholder']).to eq 'To define internal users, first enable new users set to external'
- page.within('.as-terms') do
- check 'Require all users to accept Terms of Service and Privacy Policy when they access GitLab.'
- fill_in 'Terms of Service Agreement', with: 'Be nice!'
- click_button 'Save changes'
- end
+ check 'application_setting_user_default_external'
- expect(Gitlab::CurrentSettings.enforce_terms).to be(true)
- expect(Gitlab::CurrentSettings.terms).to eq 'Be nice!'
- expect(page).to have_content 'Application settings saved successfully'
- end
+ expect(user_internal_regex).not_to be_readonly
+ expect(user_internal_regex['placeholder']).to eq 'Regex pattern'
+ end
- it 'Modify oauth providers' do
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to be_empty
+ it 'Change Sign-in restrictions' do
+ page.within('.as-signin') do
+ fill_in 'Home page URL', with: 'https://about.gitlab.com/'
+ click_button 'Save changes'
+ end
- page.within('.as-signin') do
- uncheck 'Google'
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.home_page_url).to eq "https://about.gitlab.com/"
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
+ it 'Terms of Service' do
+ # Already have the admin accept terms, so they don't need to accept in this spec.
+ _existing_terms = create(:term)
+ accept_terms(admin)
+
+ page.within('.as-terms') do
+ check 'Require all users to accept Terms of Service and Privacy Policy when they access GitLab.'
+ fill_in 'Terms of Service Agreement', with: 'Be nice!'
+ click_button 'Save changes'
+ end
- page.within('.as-signin') do
- check "Google"
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.enforce_terms).to be(true)
+ expect(Gitlab::CurrentSettings.terms).to eq 'Be nice!'
+ expect(page).to have_content 'Application settings saved successfully'
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).not_to include('google_oauth2')
- end
+ it 'Modify oauth providers' do
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to be_empty
+
+ page.within('.as-signin') do
+ uncheck 'Google'
+ click_button 'Save changes'
+ end
- it 'Oauth providers do not raise validation errors when saving unrelated changes' do
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to be_empty
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
- page.within('.as-signin') do
- uncheck 'Google'
- click_button 'Save changes'
+ page.within('.as-signin') do
+ check "Google"
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).not_to include('google_oauth2')
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
+ it 'Oauth providers do not raise validation errors when saving unrelated changes' do
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to be_empty
- # Remove google_oauth2 from the Omniauth strategies
- allow(Devise).to receive(:omniauth_providers).and_return([])
+ page.within('.as-signin') do
+ uncheck 'Google'
+ click_button 'Save changes'
+ end
- # Save an unrelated setting
- page.within('.as-ci-cd') do
- click_button 'Save changes'
- end
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
- end
+ # Remove google_oauth2 from the Omniauth strategies
+ allow(Devise).to receive(:omniauth_providers).and_return([])
- it 'Change Help page' do
- page.within('.as-help-page') do
- fill_in 'Help page text', with: 'Example text'
- check 'Hide marketing-related entries from help'
- fill_in 'Support page URL', with: 'http://example.com/help'
- click_button 'Save changes'
+ # Save an unrelated setting
+ page.within('.as-terms') do
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.disabled_oauth_sign_in_sources).to include('google_oauth2')
end
- expect(Gitlab::CurrentSettings.help_page_text).to eq "Example text"
- expect(Gitlab::CurrentSettings.help_page_hide_commercial_content).to be_truthy
- expect(Gitlab::CurrentSettings.help_page_support_url).to eq "http://example.com/help"
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Configure web terminal' do
+ page.within('.as-terminal') do
+ fill_in 'Max session time', with: 15
+ click_button 'Save changes'
+ end
- it 'Change Pages settings' do
- page.within('.as-pages') do
- fill_in 'Maximum size of pages (MB)', with: 15
- check 'Require users to prove ownership of custom domains'
- click_button 'Save changes'
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.terminal_max_session_time).to eq(15)
end
-
- expect(Gitlab::CurrentSettings.max_pages_size).to eq 15
- expect(Gitlab::CurrentSettings.pages_domain_verification_enabled?).to be_truthy
- expect(page).to have_content "Application settings saved successfully"
end
- it 'Change CI/CD settings' do
- page.within('.as-ci-cd') do
- check 'Default to Auto DevOps pipeline for all projects'
- fill_in 'Auto devops domain', with: 'domain.com'
- click_button 'Save changes'
+ context 'Integrations page' do
+ before do
+ visit integrations_admin_application_settings_path
end
- expect(Gitlab::CurrentSettings.auto_devops_enabled?).to be true
- expect(Gitlab::CurrentSettings.auto_devops_domain).to eq('domain.com')
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Enable hiding third party offers' do
+ page.within('.as-third-party-offers') do
+ check 'Do not display offers from third parties within GitLab'
+ click_button 'Save changes'
+ end
- it 'Change Influx settings' do
- page.within('.as-influx') do
- check 'Enable InfluxDB Metrics'
- click_button 'Save changes'
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.hide_third_party_offers).to be true
end
- expect(Gitlab::CurrentSettings.metrics_enabled?).to be true
- expect(page).to have_content "Application settings saved successfully"
- end
+ it 'Change Slack Notifications Service template settings' do
+ first(:link, 'Service Templates').click
+ click_link 'Slack notifications'
+ fill_in 'Webhook', with: 'http://localhost'
+ fill_in 'Username', with: 'test_user'
+ fill_in 'service_push_channel', with: '#test_channel'
+ page.check('Notify only broken pipelines')
+ page.check('Notify only default branch')
- it 'Change Prometheus settings' do
- page.within('.as-prometheus') do
- check 'Enable Prometheus Metrics'
- click_button 'Save changes'
- end
+ check_all_events
+ click_on 'Save'
- expect(Gitlab::CurrentSettings.prometheus_metrics_enabled?).to be true
- expect(page).to have_content "Application settings saved successfully"
- end
+ expect(page).to have_content 'Application settings saved successfully'
- it 'Change Performance bar settings' do
- group = create(:group)
+ click_link 'Slack notifications'
- page.within('.as-performance-bar') do
- check 'Enable the Performance Bar'
- fill_in 'Allowed group', with: group.path
- click_on 'Save changes'
+ page.all('input[type=checkbox]').each do |checkbox|
+ expect(checkbox).to be_checked
+ end
+ expect(find_field('Webhook').value).to eq 'http://localhost'
+ expect(find_field('Username').value).to eq 'test_user'
+ expect(find('#service_push_channel').value).to eq '#test_channel'
end
+ end
- expect(page).to have_content "Application settings saved successfully"
- expect(find_field('Enable the Performance Bar')).to be_checked
- expect(find_field('Allowed group').value).to eq group.path
+ context 'CI/CD page' do
+ it 'Change CI/CD settings' do
+ visit ci_cd_admin_application_settings_path
- page.within('.as-performance-bar') do
- uncheck 'Enable the Performance Bar'
- click_on 'Save changes'
- end
+ page.within('.as-ci-cd') do
+ check 'Default to Auto DevOps pipeline for all projects'
+ fill_in 'Auto devops domain', with: 'domain.com'
+ click_button 'Save changes'
+ end
- expect(page).to have_content 'Application settings saved successfully'
- expect(find_field('Enable the Performance Bar')).not_to be_checked
- expect(find_field('Allowed group').value).to be_nil
+ expect(Gitlab::CurrentSettings.auto_devops_enabled?).to be true
+ expect(Gitlab::CurrentSettings.auto_devops_domain).to eq('domain.com')
+ expect(page).to have_content "Application settings saved successfully"
+ end
end
- it 'Change Background jobs settings' do
- page.within('.as-background') do
- fill_in 'Throttling Factor', with: 1
- click_button 'Save changes'
- end
+ context 'Reporting page' do
+ it 'Change Spam settings' do
+ visit reporting_admin_application_settings_path
+
+ page.within('.as-spam') do
+ check 'Enable reCAPTCHA'
+ fill_in 'reCAPTCHA Site Key', with: 'key'
+ fill_in 'reCAPTCHA Private Key', with: 'key'
+ fill_in 'IPs per user', with: 15
+ click_button 'Save changes'
+ end
- expect(Gitlab::CurrentSettings.sidekiq_throttling_factor).to eq(1)
- expect(page).to have_content "Application settings saved successfully"
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.recaptcha_enabled).to be true
+ expect(Gitlab::CurrentSettings.unique_ips_limit_per_user).to eq(15)
+ end
end
- it 'Change Spam settings' do
- page.within('.as-spam') do
- check 'Enable reCAPTCHA'
- fill_in 'reCAPTCHA Site Key', with: 'key'
- fill_in 'reCAPTCHA Private Key', with: 'key'
- fill_in 'IPs per user', with: 15
- click_button 'Save changes'
+ context 'Metrics and profiling page' do
+ before do
+ visit metrics_and_profiling_admin_application_settings_path
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.recaptcha_enabled).to be true
- expect(Gitlab::CurrentSettings.unique_ips_limit_per_user).to eq(15)
- end
+ it 'Change Influx settings' do
+ page.within('.as-influx') do
+ check 'Enable InfluxDB Metrics'
+ click_button 'Save changes'
+ end
- it 'Configure web terminal' do
- page.within('.as-terminal') do
- fill_in 'Max session time', with: 15
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.metrics_enabled?).to be true
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.terminal_max_session_time).to eq(15)
- end
+ it 'Change Prometheus settings' do
+ page.within('.as-prometheus') do
+ check 'Enable Prometheus Metrics'
+ click_button 'Save changes'
+ end
- it 'Enable outbound requests' do
- page.within('.as-outbound') do
- check 'Allow requests to the local network from hooks and services'
- click_button 'Save changes'
+ expect(Gitlab::CurrentSettings.prometheus_metrics_enabled?).to be true
+ expect(page).to have_content "Application settings saved successfully"
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.allow_local_requests_from_hooks_and_services).to be true
- end
+ it 'Change Performance bar settings' do
+ group = create(:group)
+
+ page.within('.as-performance-bar') do
+ check 'Enable the Performance Bar'
+ fill_in 'Allowed group', with: group.path
+ click_on 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(find_field('Enable the Performance Bar')).to be_checked
+ expect(find_field('Allowed group').value).to eq group.path
- it 'Enable hiding third party offers' do
- page.within('.as-third-party-offers') do
- check 'Do not display offers from third parties within GitLab'
- click_button 'Save changes'
+ page.within('.as-performance-bar') do
+ uncheck 'Enable the Performance Bar'
+ click_on 'Save changes'
+ end
+
+ expect(page).to have_content 'Application settings saved successfully'
+ expect(find_field('Enable the Performance Bar')).not_to be_checked
+ expect(find_field('Allowed group').value).to be_nil
end
- expect(page).to have_content "Application settings saved successfully"
- expect(Gitlab::CurrentSettings.hide_third_party_offers).to be true
- end
+ it 'loads usage ping payload on click', :js do
+ expect(page).to have_button 'Preview payload'
- it 'Change Slack Notifications Service template settings' do
- first(:link, 'Service Templates').click
- click_link 'Slack notifications'
- fill_in 'Webhook', with: 'http://localhost'
- fill_in 'Username', with: 'test_user'
- fill_in 'service_push_channel', with: '#test_channel'
- page.check('Notify only broken pipelines')
- page.check('Notify only default branch')
+ find('.js-usage-ping-payload-trigger').click
- check_all_events
- click_on 'Save'
+ expect(page).to have_selector '.js-usage-ping-payload'
+ expect(page).to have_button 'Hide payload'
+ end
+ end
- expect(page).to have_content 'Application settings saved successfully'
+ context 'Network page' do
+ it 'Enable outbound requests' do
+ visit network_admin_application_settings_path
- click_link 'Slack notifications'
+ page.within('.as-outbound') do
+ check 'Allow requests to the local network from hooks and services'
+ click_button 'Save changes'
+ end
- page.all('input[type=checkbox]').each do |checkbox|
- expect(checkbox).to be_checked
+ expect(page).to have_content "Application settings saved successfully"
+ expect(Gitlab::CurrentSettings.allow_local_requests_from_hooks_and_services).to be true
end
- expect(find_field('Webhook').value).to eq 'http://localhost'
- expect(find_field('Username').value).to eq 'test_user'
- expect(find('#service_push_channel').value).to eq '#test_channel'
end
- it 'Change Keys settings' do
- page.within('.as-visibility-access') do
- select 'Are forbidden', from: 'RSA SSH keys'
- select 'Are allowed', from: 'DSA SSH keys'
- select 'Must be at least 384 bits', from: 'ECDSA SSH keys'
- select 'Are forbidden', from: 'ED25519 SSH keys'
- click_on 'Save changes'
+ context 'Preferences page' do
+ before do
+ visit preferences_admin_application_settings_path
+ end
+
+ it 'Change Help page' do
+ page.within('.as-help-page') do
+ fill_in 'Help page text', with: 'Example text'
+ check 'Hide marketing-related entries from help'
+ fill_in 'Support page URL', with: 'http://example.com/help'
+ click_button 'Save changes'
+ end
+
+ expect(Gitlab::CurrentSettings.help_page_text).to eq "Example text"
+ expect(Gitlab::CurrentSettings.help_page_hide_commercial_content).to be_truthy
+ expect(Gitlab::CurrentSettings.help_page_support_url).to eq "http://example.com/help"
+ expect(page).to have_content "Application settings saved successfully"
end
- forbidden = ApplicationSetting::FORBIDDEN_KEY_VALUE.to_s
+ it 'Change Pages settings' do
+ page.within('.as-pages') do
+ fill_in 'Maximum size of pages (MB)', with: 15
+ check 'Require users to prove ownership of custom domains'
+ click_button 'Save changes'
+ end
- expect(page).to have_content 'Application settings saved successfully'
- expect(find_field('RSA SSH keys').value).to eq(forbidden)
- expect(find_field('DSA SSH keys').value).to eq('0')
- expect(find_field('ECDSA SSH keys').value).to eq('384')
- expect(find_field('ED25519 SSH keys').value).to eq(forbidden)
+ expect(Gitlab::CurrentSettings.max_pages_size).to eq 15
+ expect(Gitlab::CurrentSettings.pages_domain_verification_enabled?).to be_truthy
+ expect(page).to have_content "Application settings saved successfully"
+ end
end
def check_all_events
diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
index e16eae219a4..c7860bebb06 100644
--- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb
+++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
@@ -12,6 +12,10 @@ describe 'Admin > Users > Impersonation Tokens', :js do
find(".settings-message")
end
+ def created_impersonation_token
+ find("#created-personal-access-token").value
+ end
+
before do
sign_in(admin)
end
@@ -39,6 +43,7 @@ describe 'Admin > Users > Impersonation Tokens', :js do
expect(active_impersonation_tokens).to have_text('api')
expect(active_impersonation_tokens).to have_text('read_user')
expect(PersonalAccessTokensFinder.new(impersonation: true).execute.count).to equal(1)
+ expect(created_impersonation_token).not_to be_empty
end
end
diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb
index 1db6c75b85b..f7c7a257075 100644
--- a/spec/features/admin/admin_users_spec.rb
+++ b/spec/features/admin/admin_users_spec.rb
@@ -125,6 +125,68 @@ describe "Admin::Users" do
expect(page).to have_content('Username can contain only letters, digits')
end
end
+
+ context 'with new users set to external enabled' do
+ context 'with regex to match internal user email address set', :js do
+ before do
+ stub_application_setting(user_default_external: true)
+ stub_application_setting(user_default_internal_regex: '\.internal@')
+
+ visit new_admin_user_path
+ end
+
+ def expects_external_to_be_checked
+ expect(find('#user_external')).to be_checked
+ end
+
+ def expects_external_to_be_unchecked
+ expect(find('#user_external')).not_to be_checked
+ end
+
+ def expects_warning_to_be_hidden
+ expect(find('#warning_external_automatically_set', visible: :all)[:class]).to include 'hidden'
+ end
+
+ def expects_warning_to_be_shown
+ expect(find('#warning_external_automatically_set')[:class]).not_to include 'hidden'
+ end
+
+ it 'automatically unchecks external for matching email' do
+ expects_external_to_be_checked
+ expects_warning_to_be_hidden
+
+ fill_in 'user_email', with: 'test.internal@domain.ch'
+
+ expects_external_to_be_unchecked
+ expects_warning_to_be_shown
+
+ fill_in 'user_email', with: 'test@domain.ch'
+
+ expects_external_to_be_checked
+ expects_warning_to_be_hidden
+
+ uncheck 'user_external'
+
+ expects_warning_to_be_hidden
+ end
+
+ it 'creates an internal user' do
+ user_name = 'tester1'
+ fill_in 'user_email', with: 'test.internal@domain.ch'
+ fill_in 'user_name', with: 'tester1 name'
+ fill_in 'user_username', with: user_name
+
+ expects_external_to_be_unchecked
+ expects_warning_to_be_shown
+
+ click_button 'Create user'
+
+ new_user = User.find_by(username: user_name)
+
+ expect(new_user.external).to be_falsy
+ end
+ end
+ end
end
describe "GET /admin/users/:id" do
@@ -134,6 +196,7 @@ describe "Admin::Users" do
expect(page).to have_content(user.email)
expect(page).to have_content(user.name)
+ expect(page).to have_content(user.id)
expect(page).to have_link('Block user', href: block_admin_user_path(user))
expect(page).to have_button('Delete user')
expect(page).to have_button('Delete user and contributions')
diff --git a/spec/features/admin/admin_uses_repository_checks_spec.rb b/spec/features/admin/admin_uses_repository_checks_spec.rb
index e658f1b6738..d04bb9acd9e 100644
--- a/spec/features/admin/admin_uses_repository_checks_spec.rb
+++ b/spec/features/admin/admin_uses_repository_checks_spec.rb
@@ -33,7 +33,7 @@ describe 'Admin uses repository checks' do
end
it 'to clear all repository checks', :js do
- visit admin_application_settings_path
+ visit repository_admin_application_settings_path
expect(RepositoryCheck::ClearWorker).to receive(:perform_async)
diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb
new file mode 100644
index 00000000000..a6ca0803469
--- /dev/null
+++ b/spec/features/admin/dashboard_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe 'admin visits dashboard' do
+ include ProjectForksHelper
+
+ before do
+ sign_in(create(:admin))
+ end
+
+ context 'counting forks' do
+ it 'correctly counts 2 forks of a project' do
+ project = create(:project)
+ project_fork = fork_project(project)
+ fork_project(project_fork)
+
+ # Make sure the fork_networks & fork_networks reltuples have been updated
+ # to get a correct count on postgresql
+ if Gitlab::Database.postgresql?
+ ActiveRecord::Base.connection.execute('ANALYZE fork_networks')
+ ActiveRecord::Base.connection.execute('ANALYZE fork_network_members')
+ end
+
+ visit admin_root_path
+
+ expect(page).to have_content('Forks 2')
+ end
+ end
+end
diff --git a/spec/features/atom/dashboard_issues_spec.rb b/spec/features/atom/dashboard_issues_spec.rb
index bd4c00d97b1..5fa1a26f1a6 100644
--- a/spec/features/atom/dashboard_issues_spec.rb
+++ b/spec/features/atom/dashboard_issues_spec.rb
@@ -25,35 +25,35 @@ describe "Dashboard Issues Feed" do
it "renders atom feed via personal access token" do
personal_access_token = create(:personal_access_token, user: user)
- visit issues_dashboard_path(:atom, private_token: personal_access_token.token, assignee_id: user.id)
+ visit issues_dashboard_path(:atom, private_token: personal_access_token.token, assignee_username: user.username)
expect(response_headers['Content-Type']).to have_content('application/atom+xml')
expect(body).to have_selector('title', text: "#{user.name} issues")
end
it "renders atom feed via feed token" do
- visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_id: user.id)
+ visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_username: user.username)
expect(response_headers['Content-Type']).to have_content('application/atom+xml')
expect(body).to have_selector('title', text: "#{user.name} issues")
end
it "renders atom feed with url parameters" do
- visit issues_dashboard_path(:atom, feed_token: user.feed_token, state: 'opened', assignee_id: user.id)
+ visit issues_dashboard_path(:atom, feed_token: user.feed_token, state: 'opened', assignee_username: user.username)
link = find('link[type="application/atom+xml"]')
params = CGI.parse(URI.parse(link[:href]).query)
expect(params).to include('feed_token' => [user.feed_token])
expect(params).to include('state' => ['opened'])
- expect(params).to include('assignee_id' => [user.id.to_s])
+ expect(params).to include('assignee_username' => [user.username.to_s])
end
context "issue with basic fields" do
let!(:issue2) { create(:issue, author: user, assignees: [assignee], project: project2, description: 'test desc') }
it "renders issue fields" do
- visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_id: assignee.id)
+ visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_username: assignee.username)
entry = find(:xpath, "//feed/entry[contains(summary/text(),'#{issue2.title}')]")
@@ -76,7 +76,7 @@ describe "Dashboard Issues Feed" do
end
it "renders issue label and milestone info" do
- visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_id: assignee.id)
+ visit issues_dashboard_path(:atom, feed_token: user.feed_token, assignee_username: assignee.username)
entry = find(:xpath, "//feed/entry[contains(summary/text(),'#{issue1.title}')]")
diff --git a/spec/features/boards/add_issues_modal_spec.rb b/spec/features/boards/add_issues_modal_spec.rb
index eebc987499d..030993462b5 100644
--- a/spec/features/boards/add_issues_modal_spec.rb
+++ b/spec/features/boards/add_issues_modal_spec.rb
@@ -160,7 +160,7 @@ describe 'Issue Boards add issue modal', :js do
it 'changes button text with plural' do
page.within('.add-issues-modal') do
- all('.board-card .board-card-number').each do |el|
+ all('.board-card .js-board-card-number-container').each do |el|
el.click
end
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index a0af2dea3ad..baa2b1d8af5 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -44,7 +44,7 @@ describe 'Issue Boards', :js do
end
it 'creates default lists' do
- lists = ['Backlog', 'To Do', 'Doing', 'Closed']
+ lists = ['Open', 'To Do', 'Doing', 'Closed']
page.within(find('.board-blank-state')) do
click_button('Add default lists')
diff --git a/spec/features/boards/issue_ordering_spec.rb b/spec/features/boards/issue_ordering_spec.rb
index ec0ca21450a..21779336559 100644
--- a/spec/features/boards/issue_ordering_spec.rb
+++ b/spec/features/boards/issue_ordering_spec.rb
@@ -78,7 +78,7 @@ describe 'Issue Boards', :js do
end
it 'moves from bottom to top' do
- drag(from_index: 2, to_index: 0)
+ drag(from_index: 2, to_index: 0, duration: 1020)
wait_for_requests
@@ -130,7 +130,7 @@ describe 'Issue Boards', :js do
end
it 'moves to bottom of another list' do
- drag(list_from_index: 1, list_to_index: 2, to_index: 2)
+ drag(list_from_index: 1, list_to_index: 2, to_index: 2, duration: 1020)
wait_for_requests
diff --git a/spec/features/boards/modal_filter_spec.rb b/spec/features/boards/modal_filter_spec.rb
index 615223a2a88..2cdd3f55b50 100644
--- a/spec/features/boards/modal_filter_spec.rb
+++ b/spec/features/boards/modal_filter_spec.rb
@@ -106,7 +106,7 @@ describe 'Issue Boards add issue modal filtering', :js do
it 'filters by unassigned' do
set_filter('assignee')
- click_filter_link('No Assignee')
+ click_filter_link('None')
submit_filter
page.within('.add-issues-modal') do
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb
index 0bf1ecbc433..164442a47f5 100644
--- a/spec/features/boards/new_issue_spec.rb
+++ b/spec/features/boards/new_issue_spec.rb
@@ -94,8 +94,14 @@ describe 'Issue Boards new issue', :js do
wait_for_requests
end
- it 'does not display new issue button' do
- expect(page).to have_selector('.issue-count-badge-add-button', count: 0)
+ it 'displays new issue button in open list' do
+ expect(first('.board')).to have_selector('.issue-count-badge-add-button', count: 1)
+ end
+
+ it 'does not display new issue button in label list' do
+ page.within('.board:nth-child(2)') do
+ expect(page).not_to have_selector('.issue-count-badge-add-button')
+ end
end
end
end
diff --git a/spec/features/boards/reload_boards_on_browser_back_spec.rb b/spec/features/boards/reload_boards_on_browser_back_spec.rb
new file mode 100644
index 00000000000..4b4bd705a77
--- /dev/null
+++ b/spec/features/boards/reload_boards_on_browser_back_spec.rb
@@ -0,0 +1,48 @@
+require 'rails_helper'
+
+describe 'Ensure Boards do not show stale data on browser back', :js do
+ let(:project) {create(:project, :public)}
+ let(:board) {create(:board, project: project)}
+ let(:user) {create(:user)}
+
+ context 'authorized user' do
+ before do
+ project.add_maintainer(user)
+
+ sign_in(user)
+
+ visit project_board_path(project, board)
+ wait_for_requests
+
+ page.within(first('.board .issue-count-badge-count')) do
+ expect(page).to have_content('0')
+ end
+ end
+
+ it 'created issue is listed on board' do
+ visit new_project_issue_path(project)
+ wait_for_requests
+
+ fill_in 'issue_title', with: 'issue should be shown'
+
+ click_button 'Submit issue'
+
+ page.go_back
+ wait_for_requests
+
+ page.go_back
+ wait_for_requests
+
+ page.within(first('.board .issue-count-badge-count')) do
+ expect(page).to have_content('1')
+ end
+
+ page.within(first('.board-card')) do
+ issue = project.issues.find_by_title('issue should be shown')
+
+ expect(page).to have_content(issue.to_reference)
+ expect(page).to have_link(issue.title, href: issue_path(issue))
+ end
+ end
+ end
+end
diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb
index f08946b0593..8cb9b57a049 100644
--- a/spec/features/calendar_spec.rb
+++ b/spec/features/calendar_spec.rb
@@ -64,7 +64,7 @@ describe 'Contributions Calendar', :js do
end
def selected_day_activities(visible: true)
- find('.user-calendar-activities', visible: visible).text
+ find('#js-overview .user-calendar-activities', visible: visible).text
end
before do
@@ -74,15 +74,16 @@ describe 'Contributions Calendar', :js do
describe 'calendar day selection' do
before do
visit user.username
+ page.find('.js-overview-tab a').click
wait_for_requests
end
it 'displays calendar' do
- expect(page).to have_css('.js-contrib-calendar')
+ expect(find('#js-overview')).to have_css('.js-contrib-calendar')
end
describe 'select calendar day' do
- let(:cells) { page.all('.user-contrib-cell') }
+ let(:cells) { page.all('#js-overview .user-contrib-cell') }
before do
cells[0].click
@@ -108,6 +109,7 @@ describe 'Contributions Calendar', :js do
describe 'deselect calendar day' do
before do
cells[0].click
+ page.find('.js-overview-tab a').click
wait_for_requests
end
@@ -122,6 +124,7 @@ describe 'Contributions Calendar', :js do
shared_context 'visit user page' do
before do
visit user.username
+ page.find('.js-overview-tab a').click
wait_for_requests
end
end
@@ -130,12 +133,12 @@ describe 'Contributions Calendar', :js do
include_context 'visit user page'
it 'displays calendar activity square color for 1 contribution' do
- expect(page).to have_selector(get_cell_color_selector(contribution_count), count: 1)
+ expect(find('#js-overview')).to have_selector(get_cell_color_selector(contribution_count), count: 1)
end
it 'displays calendar activity square on the correct date' do
today = Date.today.strftime(date_format)
- expect(page).to have_selector(get_cell_date_selector(contribution_count, today), count: 1)
+ expect(find('#js-overview')).to have_selector(get_cell_date_selector(contribution_count, today), count: 1)
end
end
@@ -150,7 +153,7 @@ describe 'Contributions Calendar', :js do
include_context 'visit user page'
it 'displays calendar activity log' do
- expect(find('.content_list .event-note')).to have_content issue_title
+ expect(find('#js-overview .overview-content-list .event-target-title')).to have_content issue_title
end
end
end
@@ -182,17 +185,17 @@ describe 'Contributions Calendar', :js do
include_context 'visit user page'
it 'displays calendar activity squares for both days' do
- expect(page).to have_selector(get_cell_color_selector(1), count: 2)
+ expect(find('#js-overview')).to have_selector(get_cell_color_selector(1), count: 2)
end
it 'displays calendar activity square for yesterday' do
yesterday = Date.yesterday.strftime(date_format)
- expect(page).to have_selector(get_cell_date_selector(1, yesterday), count: 1)
+ expect(find('#js-overview')).to have_selector(get_cell_date_selector(1, yesterday), count: 1)
end
it 'displays calendar activity square for today' do
today = Date.today.strftime(date_format)
- expect(page).to have_selector(get_cell_date_selector(1, today), count: 1)
+ expect(find('#js-overview')).to have_selector(get_cell_date_selector(1, today), count: 1)
end
end
end
diff --git a/spec/features/commits/user_uses_slash_commands_spec.rb b/spec/features/commits/user_uses_quick_actions_spec.rb
index 9a4b7bd2444..9a4b7bd2444 100644
--- a/spec/features/commits/user_uses_slash_commands_spec.rb
+++ b/spec/features/commits/user_uses_quick_actions_spec.rb
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index 8989b2051bb..5c6c1c4fd15 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -114,33 +114,6 @@ describe 'Commits' do
expect(page).to have_content 'canceled'
end
end
-
- describe '.gitlab-ci.yml not found warning' do
- context 'ci builds enabled' do
- it "does not show warning" do
- visit pipeline_path(pipeline)
- expect(page).not_to have_content '.gitlab-ci.yml not found in this commit'
- end
-
- it 'shows warning' do
- stub_ci_pipeline_yaml_file(nil)
- visit pipeline_path(pipeline)
- expect(page).to have_content '.gitlab-ci.yml not found in this commit'
- end
- end
-
- context 'ci builds disabled' do
- before do
- stub_ci_builds_disabled
- stub_ci_pipeline_yaml_file(nil)
- visit pipeline_path(pipeline)
- end
-
- it 'does not show warning' do
- expect(page).not_to have_content '.gitlab-ci.yml not found in this commit'
- end
- end
- end
end
context "when logged as reporter" do
@@ -182,6 +155,39 @@ describe 'Commits' do
end
end
end
+
+ describe '.gitlab-ci.yml not found warning' do
+ before do
+ project.add_reporter(user)
+ end
+
+ context 'ci builds enabled' do
+ it 'does not show warning' do
+ visit pipeline_path(pipeline)
+
+ expect(page).not_to have_content '.gitlab-ci.yml not found in this commit'
+ end
+
+ it 'shows warning' do
+ stub_ci_pipeline_yaml_file(nil)
+
+ visit pipeline_path(pipeline)
+
+ expect(page).to have_content '.gitlab-ci.yml not found in this commit'
+ end
+ end
+
+ context 'ci builds disabled' do
+ it 'does not show warning' do
+ stub_ci_builds_disabled
+ stub_ci_pipeline_yaml_file(nil)
+
+ visit pipeline_path(pipeline)
+
+ expect(page).not_to have_content '.gitlab-ci.yml not found in this commit'
+ end
+ end
+ end
end
context 'viewing commits for a branch' do
diff --git a/spec/features/dashboard/archived_projects_spec.rb b/spec/features/dashboard/archived_projects_spec.rb
index 6a0cd848345..d31df322d10 100644
--- a/spec/features/dashboard/archived_projects_spec.rb
+++ b/spec/features/dashboard/archived_projects_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe 'Dashboard Archived Project' do
expect(page).not_to have_content(project.name)
end
- it 'searchs archived projects', :js do
+ it 'searches archived projects', :js do
click_button 'Last updated'
click_link 'Show archived projects'
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index d7234158fa1..0db8093411b 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -14,7 +14,7 @@ describe 'Tooltips on .timeago dates', :js do
updated_at: created_date, created_at: created_date)
sign_in user
- visit user_path(user)
+ visit user_activity_path(user)
wait_for_requests()
page.find('.js-timeago').hover
diff --git a/spec/features/dashboard/group_spec.rb b/spec/features/dashboard/group_spec.rb
index 1c7932e7964..259f220c68b 100644
--- a/spec/features/dashboard/group_spec.rb
+++ b/spec/features/dashboard/group_spec.rb
@@ -13,16 +13,16 @@ RSpec.describe 'Dashboard Group' do
it 'creates new group', :js do
visit dashboard_groups_path
- find('.btn-new').click
- new_path = 'Samurai'
+ find('.btn-success').click
+ new_name = 'Samurai'
new_description = 'Tokugawa Shogunate'
- fill_in 'group_path', with: new_path
+ fill_in 'group_name', with: new_name
fill_in 'group_description', with: new_description
click_button 'Create group'
- expect(current_path).to eq group_path(Group.find_by(name: new_path))
- expect(page).to have_content(new_path)
+ expect(current_path).to eq group_path(Group.find_by(name: new_name))
+ expect(page).to have_content(new_name)
expect(page).to have_content(new_description)
end
end
diff --git a/spec/features/dashboard/groups_list_spec.rb b/spec/features/dashboard/groups_list_spec.rb
index eceb12e91cd..e75c43d5338 100644
--- a/spec/features/dashboard/groups_list_spec.rb
+++ b/spec/features/dashboard/groups_list_spec.rb
@@ -125,7 +125,7 @@ describe 'Dashboard Groups page', :js do
end
it 'loads results for next page' do
- expect(page).to have_selector('.gl-pagination .page', count: 2)
+ expect(page).to have_selector('.gl-pagination .page-item a[role=menuitemradio]', count: 2)
# Check first page
expect(page).to have_content(group2.full_name)
@@ -134,7 +134,7 @@ describe 'Dashboard Groups page', :js do
expect(page).not_to have_selector("#group-#{group.id}")
# Go to next page
- find(".gl-pagination .page:not(.active) a").click
+ find('.gl-pagination .page-item:not(.active) a[role=menuitemradio]').click
wait_for_requests
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
index b431f72fcc9..fbc2e5cc3d3 100644
--- a/spec/features/dashboard/issuables_counter_spec.rb
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -45,11 +45,11 @@ describe 'Navigation bar counter', :use_clean_rails_memory_store_caching do
end
def issues_path
- issues_dashboard_path(assignee_id: user.id)
+ issues_dashboard_path(assignee_username: user.username)
end
def merge_requests_path
- merge_requests_dashboard_path(assignee_id: user.id)
+ merge_requests_dashboard_path(assignee_username: user.username)
end
def expect_counters(issuable_type, count)
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 95e2610dd4a..c0434f767bb 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe 'Dashboard Issues filtering', :js do
include Spec::Support::Helpers::Features::SortingHelpers
+ include FilteredSearchHelpers
let(:user) { create(:user) }
let(:project) { create(:project) }
@@ -25,27 +26,21 @@ describe 'Dashboard Issues filtering', :js do
context 'filtering by milestone' do
it 'shows all issues with no milestone' do
- show_milestone_dropdown
-
- click_link 'No Milestone'
+ input_filtered_search("milestone:none")
expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
expect(page).to have_selector('.issue', count: 1)
end
it 'shows all issues with the selected milestone' do
- show_milestone_dropdown
-
- page.within '.dropdown-content' do
- click_link milestone.title
- end
+ input_filtered_search("milestone:%\"#{milestone.title}\"")
expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
expect(page).to have_selector('.issue', count: 1)
end
it 'updates atom feed link' do
- visit_issues(milestone_title: '', assignee_id: user.id)
+ visit_issues(milestone_title: '', assignee_username: user.username)
link = find('.nav-controls a[title="Subscribe to RSS feed"]')
params = CGI.parse(URI.parse(link[:href]).query)
@@ -54,10 +49,10 @@ describe 'Dashboard Issues filtering', :js do
expect(params).to include('feed_token' => [user.feed_token])
expect(params).to include('milestone_title' => [''])
- expect(params).to include('assignee_id' => [user.id.to_s])
+ expect(params).to include('assignee_username' => [user.username.to_s])
expect(auto_discovery_params).to include('feed_token' => [user.feed_token])
expect(auto_discovery_params).to include('milestone_title' => [''])
- expect(auto_discovery_params).to include('assignee_id' => [user.id.to_s])
+ expect(auto_discovery_params).to include('assignee_username' => [user.username.to_s])
end
end
@@ -66,10 +61,7 @@ describe 'Dashboard Issues filtering', :js do
let!(:label_link) { create(:label_link, label: label, target: issue) }
it 'shows all issues with the selected label' do
- page.within '.labels-filter' do
- find('.dropdown').click
- click_link label.title
- end
+ input_filtered_search("label:~#{label.title}")
page.within 'ul.content-list' do
expect(page).to have_content issue.title
@@ -80,12 +72,12 @@ describe 'Dashboard Issues filtering', :js do
context 'sorting' do
before do
- visit_issues(assignee_id: user.id)
+ visit_issues(assignee_username: user.username)
end
it 'remembers last sorting value' do
sort_by('Created date')
- visit_issues(assignee_id: user.id)
+ visit_issues(assignee_username: user.username)
expect(find('.issues-filters')).to have_content('Created date')
end
@@ -98,11 +90,6 @@ describe 'Dashboard Issues filtering', :js do
end
end
- def show_milestone_dropdown
- click_button 'Milestone'
- expect(page).to have_selector('.dropdown-content', visible: true)
- end
-
def visit_issues(*args)
visit issues_dashboard_path(*args)
end
diff --git a/spec/features/dashboard/issues_spec.rb b/spec/features/dashboard/issues_spec.rb
index 4ae062f242a..9957bec0f0b 100644
--- a/spec/features/dashboard/issues_spec.rb
+++ b/spec/features/dashboard/issues_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
RSpec.describe 'Dashboard Issues' do
+ include FilteredSearchHelpers
+
let(:current_user) { create :user }
let(:user) { current_user } # Shared examples depend on this being available
let!(:public_project) { create(:project, :public) }
@@ -14,7 +16,7 @@ RSpec.describe 'Dashboard Issues' do
before do
[project, project_with_issues_disabled].each { |project| project.add_maintainer(current_user) }
sign_in(current_user)
- visit issues_dashboard_path(assignee_id: current_user.id)
+ visit issues_dashboard_path(assignee_username: current_user.username)
end
describe 'issues' do
@@ -24,26 +26,9 @@ RSpec.describe 'Dashboard Issues' do
expect(page).not_to have_content(other_issue.title)
end
- it 'shows checkmark when unassigned is selected for assignee', :js do
- find('.js-assignee-search').click
- find('li', text: 'Unassigned').click
- find('.js-assignee-search').click
-
- expect(find('li[data-user-id="0"] a.is-active')).to be_visible
- end
-
it 'shows issues when current user is author', :js do
- execute_script("document.querySelector('#assignee_id').value=''")
- find('.js-author-search', match: :first).click
-
- expect(find('li[data-user-id="null"] a.is-active')).to be_visible
-
- find('.dropdown-menu-author li a', match: :first, text: current_user.to_reference).click
- find('.js-author-search', match: :first).click
-
- page.within '.dropdown-menu-user' do
- expect(find('.dropdown-menu-author li a.is-active', match: :first, text: current_user.to_reference)).to be_visible
- end
+ reset_filters
+ input_filtered_search("author:#{current_user.to_reference}")
expect(page).to have_content(authored_issue.title)
expect(page).to have_content(authored_issue_on_public_project.title)
@@ -53,7 +38,7 @@ RSpec.describe 'Dashboard Issues' do
it 'state filter tabs work' do
find('#state-closed').click
- expect(page).to have_current_path(issues_dashboard_url(assignee_id: current_user.id, state: 'closed'), url: true)
+ expect(page).to have_current_path(issues_dashboard_url(assignee_username: current_user.username, state: 'closed'), url: true)
end
it_behaves_like "it has an RSS button with current_user's feed token"
diff --git a/spec/features/dashboard/label_filter_spec.rb b/spec/features/dashboard/label_filter_spec.rb
index 6802974c2ee..2d4659d380f 100644
--- a/spec/features/dashboard/label_filter_spec.rb
+++ b/spec/features/dashboard/label_filter_spec.rb
@@ -1,6 +1,11 @@
require 'spec_helper'
describe 'Dashboard > label filter', :js do
+ include FilteredSearchHelpers
+
+ let(:filtered_search) { find('.filtered-search') }
+ let(:filter_dropdown) { find("#js-dropdown-label .filter-dropdown") }
+
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
let(:project2) { create(:project, name: 'test2', path: 'test2', namespace: user.namespace) }
@@ -13,17 +18,15 @@ describe 'Dashboard > label filter', :js do
sign_in(user)
visit issues_dashboard_path
+
+ init_label_search
end
context 'duplicate labels' do
it 'removes duplicate labels' do
- page.within('.labels-filter') do
- click_button 'Label'
- end
+ filtered_search.send_keys('bu')
- page.within('.dropdown-menu-labels') do
- expect(page).to have_selector('.dropdown-content a', text: 'bug', count: 1)
- end
+ expect(filter_dropdown).to have_selector('.filter-dropdown-item', text: 'bug', count: 1)
end
end
end
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index f51142f5790..282bf542e77 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe 'Dashboard Merge Requests' do
include Spec::Support::Helpers::Features::SortingHelpers
- include FilterItemSelectHelper
+ include FilteredSearchHelpers
include ProjectForksHelper
let(:current_user) { create :user }
@@ -36,7 +36,7 @@ describe 'Dashboard Merge Requests' do
context 'no merge requests exist' do
it 'shows an empty state' do
- visit merge_requests_dashboard_path(assignee_id: current_user.id)
+ visit merge_requests_dashboard_path(assignee_username: current_user.username)
expect(page).to have_selector('.empty-state')
end
@@ -79,7 +79,7 @@ describe 'Dashboard Merge Requests' do
end
before do
- visit merge_requests_dashboard_path(assignee_id: current_user.id)
+ visit merge_requests_dashboard_path(assignee_username: current_user.username)
end
it 'shows assigned merge requests' do
@@ -92,8 +92,8 @@ describe 'Dashboard Merge Requests' do
end
it 'shows authored merge requests', :js do
- filter_item_select('Any Assignee', '.js-assignee-search')
- filter_item_select(current_user.to_reference, '.js-author-search')
+ reset_filters
+ input_filtered_search("author:#{current_user.to_reference}")
expect(page).to have_content(authored_merge_request.title)
expect(page).to have_content(authored_merge_request_from_fork.title)
@@ -104,8 +104,7 @@ describe 'Dashboard Merge Requests' do
end
it 'shows error message without filter', :js do
- filter_item_select('Any Assignee', '.js-assignee-search')
- filter_item_select('Any Author', '.js-author-search')
+ reset_filters
expect(page).to have_content('Please select at least one filter to see results')
end
@@ -113,7 +112,7 @@ describe 'Dashboard Merge Requests' do
it 'shows sorted merge requests' do
sort_by('Created date')
- visit merge_requests_dashboard_path(assignee_id: current_user.id)
+ visit merge_requests_dashboard_path(assignee_username: current_user.username)
expect(find('.issues-filters')).to have_content('Created date')
end
diff --git a/spec/features/dashboard/milestone_filter_spec.rb b/spec/features/dashboard/milestone_filter_spec.rb
deleted file mode 100644
index 00373050aeb..00000000000
--- a/spec/features/dashboard/milestone_filter_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-require 'spec_helper'
-
-describe 'Dashboard > milestone filter', :js do
- include FilterItemSelectHelper
-
- let(:user) { create(:user) }
- let(:project) { create(:project, name: 'test', namespace: user.namespace) }
- let(:milestone) { create(:milestone, title: 'v1.0', project: project) }
- let(:milestone2) { create(:milestone, title: 'v2.0', project: project) }
- let!(:issue) { create :issue, author: user, project: project, milestone: milestone }
- let!(:issue2) { create :issue, author: user, project: project, milestone: milestone2 }
-
- dropdown_toggle_button = '.js-milestone-select'
-
- before do
- sign_in(user)
- end
-
- context 'default state' do
- it 'shows issues with Any Milestone' do
- visit issues_dashboard_path(author_id: user.id)
-
- page.all('.issue-info').each do |issue_info|
- expect(issue_info.text).to match(/v\d.0/)
- end
- end
- end
-
- context 'filtering by milestone' do
- before do
- visit issues_dashboard_path(author_id: user.id)
- filter_item_select('v1.0', dropdown_toggle_button)
- find(dropdown_toggle_button).click
- wait_for_requests
- end
-
- it 'shows issues with Milestone v1.0' do
- expect(find('.issues-list')).to have_selector('.issue', count: 1)
- expect(find('.milestone-filter .dropdown-content')).to have_selector('a.is-active', count: 1)
- end
-
- it 'should not change active Milestone unless clicked' do
- page.within '.milestone-filter' do
- expect(find('.dropdown-content')).to have_selector('a.is-active', count: 1)
-
- find('.dropdown-menu-close').click
-
- expect(page).not_to have_selector('.dropdown.open')
-
- find(dropdown_toggle_button).click
-
- expect(find('.dropdown-content')).to have_selector('a.is-active', count: 1)
- expect(find('.dropdown-content a.is-active')).to have_content('v1.0')
- end
- end
- end
-
- context 'with milestone filter in URL' do
- before do
- visit issues_dashboard_path(author_id: user.id, milestone_title: milestone.title)
- find(dropdown_toggle_button).click
- wait_for_requests
- end
-
- it 'has milestone selected' do
- expect(find('.milestone-filter .dropdown-content')).to have_css('.is-active', text: milestone.title)
- end
-
- it 'removes milestone filter from URL after clicking "Any Milestone"' do
- expect(current_url).to include("milestone_title=#{milestone.title}")
-
- find('.milestone-filter .dropdown-content li', text: 'Any Milestone').click
-
- expect(current_url).not_to include('milestone_title')
- end
- end
-end
diff --git a/spec/features/dashboard/milestones_spec.rb b/spec/features/dashboard/milestones_spec.rb
index 0db69432702..8fb2e37e269 100644
--- a/spec/features/dashboard/milestones_spec.rb
+++ b/spec/features/dashboard/milestones_spec.rb
@@ -13,10 +13,13 @@ describe 'Dashboard > Milestones' do
describe 'as logged-in user' do
let(:user) { create(:user) }
+ let(:group) { create(:group) }
let(:project) { create(:project, namespace: user.namespace) }
let!(:milestone) { create(:milestone, project: project) }
+ let!(:milestone2) { create(:milestone, group: group) }
+
before do
- project.add_maintainer(user)
+ group.add_developer(user)
sign_in(user)
visit dashboard_milestones_path
end
@@ -24,6 +27,7 @@ describe 'Dashboard > Milestones' do
it 'sees milestones' do
expect(current_path).to eq dashboard_milestones_path
expect(page).to have_content(milestone.title)
+ expect(page).to have_content(group.name)
end
end
end
diff --git a/spec/features/dashboard/project_member_activity_index_spec.rb b/spec/features/dashboard/project_member_activity_index_spec.rb
index 498775acff3..16919fe63ad 100644
--- a/spec/features/dashboard/project_member_activity_index_spec.rb
+++ b/spec/features/dashboard/project_member_activity_index_spec.rb
@@ -14,14 +14,15 @@ describe 'Project member activity', :js do
wait_for_requests
end
- subject { page.find(".event-title").text }
-
context 'when a user joins the project' do
before do
visit_activities_and_wait_with_event(Event::JOINED)
end
- it { is_expected.to eq("#{user.name} joined project") }
+ it "presents the correct message" do
+ expect(page.find('.event-user-info').text).to eq("#{user.name} #{user.to_reference}")
+ expect(page.find('.event-title').text).to eq("joined project")
+ end
end
context 'when a user leaves the project' do
@@ -29,7 +30,10 @@ describe 'Project member activity', :js do
visit_activities_and_wait_with_event(Event::LEFT)
end
- it { is_expected.to eq("#{user.name} left project") }
+ it "presents the correct message" do
+ expect(page.find('.event-user-info').text).to eq("#{user.name} #{user.to_reference}")
+ expect(page.find('.event-title').text).to eq("left project")
+ end
end
context 'when a users membership expires for the project' do
@@ -38,8 +42,8 @@ describe 'Project member activity', :js do
end
it "presents the correct message" do
- message = "#{user.name} removed due to membership expiration from project"
- is_expected.to eq(message)
+ expect(page.find('.event-user-info').text).to eq("#{user.name} #{user.to_reference}")
+ expect(page.find('.event-title').text).to eq("removed due to membership expiration from project")
end
end
end
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 4daacc61d85..975b7944741 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -103,6 +103,14 @@ describe 'Dashboard Projects' do
expect(page).not_to have_content(project.name)
expect(page).to have_content(project3.name)
end
+
+ it 'sorts projects by most stars when sorting by most stars' do
+ project_with_most_stars = create(:project, namespace: user.namespace, star_count: 10)
+
+ visit dashboard_projects_path(sort: :stars_desc)
+
+ expect(first('.project-row')).to have_content(project_with_most_stars.title)
+ end
end
context 'when on Starred projects tab' do
diff --git a/spec/features/dashboard/shortcuts_spec.rb b/spec/features/dashboard/shortcuts_spec.rb
index e5c5ab9c039..31a1dcf826d 100644
--- a/spec/features/dashboard/shortcuts_spec.rb
+++ b/spec/features/dashboard/shortcuts_spec.rb
@@ -2,8 +2,12 @@ require 'spec_helper'
describe 'Dashboard shortcuts', :js do
context 'logged in' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+
before do
- sign_in(create(:user))
+ project.add_developer(user)
+ sign_in(user)
visit root_dashboard_path
end
@@ -50,6 +54,6 @@ describe 'Dashboard shortcuts', :js do
end
def check_page_title(title)
- expect(find('.breadcrumbs-sub-title')).to have_content(title)
+ expect(find('.page-title')).to have_content(title)
end
end
diff --git a/spec/features/explore/new_menu_spec.rb b/spec/features/explore/new_menu_spec.rb
index 0a88988ea09..259f22139ef 100644
--- a/spec/features/explore/new_menu_spec.rb
+++ b/spec/features/explore/new_menu_spec.rb
@@ -20,7 +20,7 @@ describe 'Top Plus Menu', :js do
click_topmenuitem("New project")
- expect(page).to have_content('Project path')
+ expect(page).to have_content('Project URL')
expect(page).to have_content('Project name')
end
@@ -29,7 +29,7 @@ describe 'Top Plus Menu', :js do
click_topmenuitem("New group")
- expect(page).to have_content('Group path')
+ expect(page).to have_content('Group URL')
expect(page).to have_content('Group name')
end
@@ -79,7 +79,7 @@ describe 'Top Plus Menu', :js do
click_topmenuitem("New subgroup")
- expect(page).to have_content('Group path')
+ expect(page).to have_content('Group URL')
expect(page).to have_content('Group name')
end
@@ -92,7 +92,7 @@ describe 'Top Plus Menu', :js do
find('.header-new-group-project a').click
end
- expect(page).to have_content('Project path')
+ expect(page).to have_content('Project URL')
expect(page).to have_content('Project name')
end
end
diff --git a/spec/features/groups/board_sidebar_spec.rb b/spec/features/groups/board_sidebar_spec.rb
new file mode 100644
index 00000000000..9f597efa7b7
--- /dev/null
+++ b/spec/features/groups/board_sidebar_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe 'Group Issue Boards', :js do
+ include BoardHelpers
+
+ let(:group) { create(:group) }
+ let(:user) { create(:group_member, user: create(:user), group: group ).user }
+ let!(:project_1) { create(:project, :public, group: group) }
+ let!(:project_2) { create(:project, :public, group: group) }
+ let!(:project_1_label) { create(:label, project: project_1, name: 'Development 1') }
+ let!(:project_2_label) { create(:label, project: project_2, name: 'Development 2') }
+ let!(:group_label) { create(:group_label, title: 'Bug', description: 'Fusce consequat', group: group) }
+ let!(:issue_1) { create(:labeled_issue, project: project_1, relative_position: 1) }
+ let!(:issue_2) { create(:labeled_issue, project: project_2, relative_position: 2) }
+ let(:board) { create(:board, group: group) }
+ let!(:list) { create(:list, board: board, label: project_1_label, position: 0) }
+ let(:card) { find('.board:nth-child(1)').first('.board-card') }
+
+ before do
+ sign_in(user)
+
+ visit group_board_path(group, board)
+ wait_for_requests
+ end
+
+ context 'labels' do
+ it 'only shows valid labels for the issue project and group' do
+ click_card(card)
+
+ page.within('.labels') do
+ click_link 'Edit'
+
+ wait_for_requests
+
+ page.within('.selectbox') do
+ expect(page).to have_content(project_1_label.title)
+ expect(page).to have_content(group_label.title)
+ expect(page).not_to have_content(project_2_label.title)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb
index 59254ecc982..2cdbdcffbc3 100644
--- a/spec/features/groups/group_settings_spec.rb
+++ b/spec/features/groups/group_settings_spec.rb
@@ -98,6 +98,22 @@ describe 'Edit group settings' do
end
end
+ describe 'edit group path' do
+ it 'has a root URL label for top-level group' do
+ visit edit_group_path(group)
+
+ expect(find(:css, '.group-root-path').text).to eq(root_url)
+ end
+
+ it 'has a parent group URL label for a subgroup group', :postgresql do
+ subgroup = create(:group, parent: group)
+
+ visit edit_group_path(subgroup)
+
+ expect(find(:css, '.group-root-path').text).to eq(group_url(subgroup.parent) + '/')
+ end
+ end
+
def update_path(new_group_path)
visit edit_group_path(group)
@@ -109,7 +125,7 @@ describe 'Edit group settings' do
def save_group
page.within('.gs-general') do
- click_button 'Save group'
+ click_button 'Save changes'
end
end
end
diff --git a/spec/features/groups/labels/search_labels_spec.rb b/spec/features/groups/labels/search_labels_spec.rb
new file mode 100644
index 00000000000..14b88a561b1
--- /dev/null
+++ b/spec/features/groups/labels/search_labels_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Search for labels', :js do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let!(:label1) { create(:group_label, title: 'Foo', description: 'Lorem ipsum', group: group) }
+ let!(:label2) { create(:group_label, title: 'Bar', description: 'Fusce consequat', group: group) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+
+ visit group_labels_path(group)
+ end
+
+ it 'searches for label by title' do
+ fill_in 'label-search', with: 'Bar'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content(label2.title)
+ expect(page).to have_content(label2.description)
+ expect(page).not_to have_content(label1.title)
+ expect(page).not_to have_content(label1.description)
+ end
+
+ it 'searches for label by description' do
+ fill_in 'label-search', with: 'Lorem'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content(label1.title)
+ expect(page).to have_content(label1.description)
+ expect(page).not_to have_content(label2.title)
+ expect(page).not_to have_content(label2.description)
+ end
+
+ it 'shows nothing found message' do
+ fill_in 'label-search', with: 'nonexistent'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content('No labels with such name or description')
+ expect(page).not_to have_content(label1.title)
+ expect(page).not_to have_content(label1.description)
+ expect(page).not_to have_content(label2.title)
+ expect(page).not_to have_content(label2.description)
+ end
+end
diff --git a/spec/features/groups/labels/sort_labels_spec.rb b/spec/features/groups/labels/sort_labels_spec.rb
new file mode 100644
index 00000000000..2aea4d77675
--- /dev/null
+++ b/spec/features/groups/labels/sort_labels_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Sort labels', :js do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let!(:label1) { create(:group_label, title: 'Foo', description: 'Lorem ipsum', group: group) }
+ let!(:label2) { create(:group_label, title: 'Bar', description: 'Fusce consequat', group: group) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+
+ visit group_labels_path(group)
+ end
+
+ it 'sorts by title by default' do
+ expect(page).to have_button('Name')
+
+ # assert default sorting
+ within '.other-labels' do
+ expect(page.all('.label-list-item').first.text).to include('Bar')
+ expect(page.all('.label-list-item').last.text).to include('Foo')
+ end
+ end
+
+ it 'sorts by date' do
+ click_button 'Name'
+
+ sort_options = find('ul.dropdown-menu-sort li').all('a').collect(&:text)
+
+ expect(sort_options[0]).to eq('Name')
+ expect(sort_options[1]).to eq('Name, descending')
+ expect(sort_options[2]).to eq('Last created')
+ expect(sort_options[3]).to eq('Oldest created')
+ expect(sort_options[4]).to eq('Last updated')
+ expect(sort_options[5]).to eq('Oldest updated')
+
+ click_link 'Name, descending'
+
+ # assert default sorting
+ within '.other-labels' do
+ expect(page.all('.label-list-item').first.text).to include('Foo')
+ expect(page.all('.label-list-item').last.text).to include('Bar')
+ end
+ end
+end
diff --git a/spec/features/groups/labels/subscription_spec.rb b/spec/features/groups/labels/subscription_spec.rb
index d9543bfa97f..22b51b297a6 100644
--- a/spec/features/groups/labels/subscription_spec.rb
+++ b/spec/features/groups/labels/subscription_spec.rb
@@ -3,7 +3,8 @@ require 'spec_helper'
describe 'Labels subscription' do
let(:user) { create(:user) }
let(:group) { create(:group) }
- let!(:feature) { create(:group_label, group: group, title: 'feature') }
+ let!(:label1) { create(:group_label, group: group, title: 'foo') }
+ let!(:label2) { create(:group_label, group: group, title: 'bar') }
context 'when signed in' do
before do
@@ -14,9 +15,9 @@ describe 'Labels subscription' do
it 'users can subscribe/unsubscribe to group labels', :js do
visit group_labels_path(group)
- expect(page).to have_content('feature')
+ expect(page).to have_content(label1.title)
- within "#group_label_#{feature.id}" do
+ within "#group_label_#{label1.id}" do
expect(page).not_to have_button 'Unsubscribe'
click_button 'Subscribe'
@@ -30,15 +31,48 @@ describe 'Labels subscription' do
expect(page).not_to have_button 'Unsubscribe'
end
end
+
+ context 'subscription filter' do
+ before do
+ visit group_labels_path(group)
+ end
+
+ it 'shows only subscribed labels' do
+ label1.subscribe(user)
+
+ click_subscribed_tab
+
+ page.within('.labels-container') do
+ expect(page).to have_content label1.title
+ end
+ end
+
+ it 'shows no subscribed labels message' do
+ click_subscribed_tab
+
+ page.within('.labels-container') do
+ expect(page).not_to have_content label1.title
+ expect(page).to have_content('You do not have any subscriptions yet')
+ end
+ end
+ end
end
context 'when not signed in' do
- it 'users can not subscribe/unsubscribe to labels' do
+ before do
visit group_labels_path(group)
+ end
- expect(page).to have_content 'feature'
+ it 'users can not subscribe/unsubscribe to labels' do
+ expect(page).to have_content label1.title
expect(page).not_to have_button('Subscribe')
end
+
+ it 'does not show subscribed tab' do
+ page.within('.nav-tabs') do
+ expect(page).not_to have_link 'Subscribed'
+ end
+ end
end
def click_link_on_dropdown(text)
@@ -48,4 +82,10 @@ describe 'Labels subscription' do
find('a.js-subscribe-button', text: text).click
end
end
+
+ def click_subscribed_tab
+ page.within('.nav-tabs') do
+ click_link 'Subscribed'
+ end
+ end
end
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index 80df0618a6a..174840794ed 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -23,17 +23,17 @@ describe 'Group milestones' do
description.native.send_keys('')
- click_link('Preview')
+ click_button('Preview')
preview = find('.js-md-preview')
expect(preview).to have_content('Nothing to preview.')
- click_link('Write')
+ click_button('Write')
description.native.send_keys(':+1: Nice')
- click_link('Preview')
+ click_button('Preview')
expect(preview).to have_css('gl-emoji')
expect(find('#milestone_description', visible: false)).not_to be_visible
@@ -95,9 +95,9 @@ describe 'Group milestones' do
end
it 'counts milestones correctly' do
- expect(find('.top-area .active .badge').text).to eq("2")
- expect(find('.top-area .closed .badge').text).to eq("2")
- expect(find('.top-area .all .badge').text).to eq("4")
+ expect(find('.top-area .active .badge').text).to eq("3")
+ expect(find('.top-area .closed .badge').text).to eq("3")
+ expect(find('.top-area .all .badge').text).to eq("6")
end
it 'lists legacy group milestones and group milestones' do
diff --git a/spec/features/groups/settings/ci_cd_spec.rb b/spec/features/groups/settings/ci_cd_spec.rb
new file mode 100644
index 00000000000..d422fd18346
--- /dev/null
+++ b/spec/features/groups/settings/ci_cd_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Group CI/CD settings' do
+ include WaitForRequests
+
+ let(:user) {create(:user)}
+ let(:group) {create(:group)}
+
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ describe 'runners registration token' do
+ let!(:token) { group.runners_token }
+
+ before do
+ visit group_settings_ci_cd_path(group)
+ end
+
+ it 'has a registration token' do
+ expect(page.find('#registration_token')).to have_content(token)
+ end
+
+ describe 'reload registration token' do
+ let(:page_token) { find('#registration_token').text }
+
+ before do
+ click_button 'Reset runners registration token'
+ end
+
+ it 'changes registration token' do
+ expect(page_token).not_to eq token
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/settings/group_badges_spec.rb b/spec/features/groups/settings/group_badges_spec.rb
index 070a4a31ffa..a5c8dbf18d0 100644
--- a/spec/features/groups/settings/group_badges_spec.rb
+++ b/spec/features/groups/settings/group_badges_spec.rb
@@ -14,7 +14,7 @@ describe 'Group Badges' do
group.add_owner(user)
sign_in(user)
- visit(group_settings_badges_path(group))
+ visit(edit_group_path(group))
end
it 'shows a list of badges', :js do
diff --git a/spec/features/groups/share_lock_spec.rb b/spec/features/groups/share_lock_spec.rb
index 5bbe77019ca..704d9f12888 100644
--- a/spec/features/groups/share_lock_spec.rb
+++ b/spec/features/groups/share_lock_spec.rb
@@ -60,14 +60,14 @@ describe 'Group share with group lock' do
def enable_group_lock
page.within('.gs-permissions') do
check 'group_share_with_group_lock'
- click_on 'Save group'
+ click_on 'Save changes'
end
end
def disable_group_lock
page.within('.gs-permissions') do
uncheck 'group_share_with_group_lock'
- click_on 'Save group'
+ click_on 'Save changes'
end
end
end
diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb
index ac961e98a61..4e6f73ef58a 100644
--- a/spec/features/groups/show_spec.rb
+++ b/spec/features/groups/show_spec.rb
@@ -101,4 +101,25 @@ describe 'Group show page' do
expect(page).to have_emoji('smile')
end
end
+
+ context 'where group has projects' do
+ let(:user) { create(:user) }
+
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ it 'allows users to sorts projects by most stars', :js do
+ project1 = create(:project, namespace: group, star_count: 2)
+ project2 = create(:project, namespace: group, star_count: 3)
+ project3 = create(:project, namespace: group, star_count: 0)
+
+ visit group_path(group, sort: :stars_desc)
+
+ expect(find('.group-row:nth-child(1) .namespace-title > a')).to have_content(project2.title)
+ expect(find('.group-row:nth-child(2) .namespace-title > a')).to have_content(project1.title)
+ expect(find('.group-row:nth-child(3) .namespace-title > a')).to have_content(project3.title)
+ end
+ end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index e62bd6f8187..d01fc04311a 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -1,13 +1,15 @@
require 'spec_helper'
describe 'Group' do
+ let(:user) { create(:admin) }
+
before do
- sign_in(create(:admin))
+ sign_in(user)
end
matcher :have_namespace_error_message do
match do |page|
- page.has_content?("Path can contain only letters, digits, '_', '-' and '.'. Cannot start with '-' or end in '.', '.git' or '.atom'.")
+ page.has_content?("Group URL can contain only letters, digits, '_', '-' and '.'. Cannot start with '-' or end in '.', '.git' or '.atom'.")
end
end
@@ -16,9 +18,27 @@ describe 'Group' do
visit new_group_path
end
+ describe 'as a non-admin' do
+ let(:user) { create(:user) }
+
+ it 'creates a group and persists visibility radio selection', :js do
+ stub_application_setting(default_group_visibility: :private)
+
+ fill_in 'Group name', with: 'test-group'
+ find("input[name='group[visibility_level]'][value='#{Gitlab::VisibilityLevel::PUBLIC}']").click
+ click_button 'Create group'
+
+ group = Group.find_by(name: 'test-group')
+
+ expect(group.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
+ expect(current_path).to eq(group_path(group))
+ expect(page).to have_selector '.visibility-icon .fa-globe'
+ end
+ end
+
describe 'with space in group path' do
it 'renders new group form with validation errors' do
- fill_in 'Group path', with: 'space group'
+ fill_in 'Group URL', with: 'space group'
click_button 'Create group'
expect(current_path).to eq(groups_path)
@@ -28,7 +48,7 @@ describe 'Group' do
describe 'with .atom at end of group path' do
it 'renders new group form with validation errors' do
- fill_in 'Group path', with: 'atom_group.atom'
+ fill_in 'Group URL', with: 'atom_group.atom'
click_button 'Create group'
expect(current_path).to eq(groups_path)
@@ -38,7 +58,7 @@ describe 'Group' do
describe 'with .git at end of group path' do
it 'renders new group form with validation errors' do
- fill_in 'Group path', with: 'git_group.git'
+ fill_in 'Group URL', with: 'git_group.git'
click_button 'Create group'
expect(current_path).to eq(groups_path)
@@ -94,7 +114,8 @@ describe 'Group' do
end
it 'creates a nested group' do
- fill_in 'Group path', with: 'bar'
+ fill_in 'Group name', with: 'bar'
+ fill_in 'Group URL', with: 'bar'
click_button 'Create group'
expect(current_path).to eq(group_path('foo/bar'))
@@ -112,7 +133,8 @@ describe 'Group' do
visit new_group_path(group, parent_id: group.id)
- fill_in 'Group path', with: 'bar'
+ fill_in 'Group name', with: 'bar'
+ fill_in 'Group URL', with: 'bar'
click_button 'Create group'
expect(current_path).to eq(group_path('foo/bar'))
@@ -140,10 +162,13 @@ describe 'Group' do
visit path
end
+ it_behaves_like 'dirty submit form', [{ form: '.js-general-settings-form', input: 'input[name="group[name]"]' },
+ { form: '.js-general-permissions-form', input: 'input[name="group[two_factor_grace_period]"]' }]
+
it 'saves new settings' do
page.within('.gs-general') do
fill_in 'group_name', with: new_name
- click_button 'Save group'
+ click_button 'Save changes'
end
expect(page).to have_content 'successfully updated'
diff --git a/spec/features/import/manifest_import_spec.rb b/spec/features/import/manifest_import_spec.rb
index e381d073804..a90cdd8d920 100644
--- a/spec/features/import/manifest_import_spec.rb
+++ b/spec/features/import/manifest_import_spec.rb
@@ -22,7 +22,7 @@ describe 'Import multiple repositories by uploading a manifest file', :js, :post
expect(page).to have_content('https://android-review.googlesource.com/platform/build/blueprint')
end
- it 'imports succesfully imports a project' do
+ it 'imports successfully imports a project' do
visit new_import_manifest_path
attach_file('manifest', Rails.root.join('spec/fixtures/aosp_manifest.xml'))
diff --git a/spec/features/instance_statistics/cohorts_spec.rb b/spec/features/instance_statistics/cohorts_spec.rb
index 81fc5eff980..40e65515ceb 100644
--- a/spec/features/instance_statistics/cohorts_spec.rb
+++ b/spec/features/instance_statistics/cohorts_spec.rb
@@ -3,6 +3,8 @@ require 'rails_helper'
describe 'Cohorts page' do
before do
sign_in(create(:admin))
+
+ stub_application_setting(usage_ping_enabled: true)
end
it 'See users count per month' do
diff --git a/spec/features/instance_statistics/conversational_development_index_spec.rb b/spec/features/instance_statistics/conversational_development_index_spec.rb
index d441a7a5af9..d8be554d734 100644
--- a/spec/features/instance_statistics/conversational_development_index_spec.rb
+++ b/spec/features/instance_statistics/conversational_development_index_spec.rb
@@ -5,14 +5,32 @@ describe 'Conversational Development Index' do
sign_in(create(:admin))
end
+ it 'has dismissable intro callout', :js do
+ visit instance_statistics_conversational_development_index_index_path
+
+ expect(page).to have_content 'Introducing Your Conversational Development Index'
+
+ find('.js-close-callout').click
+
+ expect(page).not_to have_content 'Introducing Your Conversational Development Index'
+ end
+
context 'when usage ping is disabled' do
- it 'shows empty state' do
+ before do
stub_application_setting(usage_ping_enabled: false)
+ end
+ it 'shows empty state' do
visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content('Usage ping is not enabled')
end
+
+ it 'hides the intro callout' do
+ visit instance_statistics_conversational_development_index_index_path
+
+ expect(page).not_to have_content 'Introducing Your Conversational Development Index'
+ end
end
context 'when there is no data to display' do
diff --git a/spec/features/instance_statistics/instance_statistics.rb b/spec/features/instance_statistics/instance_statistics.rb
new file mode 100644
index 00000000000..d03e6e68075
--- /dev/null
+++ b/spec/features/instance_statistics/instance_statistics.rb
@@ -0,0 +1,23 @@
+require 'rails_helper'
+
+describe 'Cohorts page', :js do
+ before do
+ sign_in(create(:admin))
+ end
+
+ it 'hides cohorts nav button when usage ping is disabled' do
+ stub_application_setting(usage_ping_enabled: false)
+
+ visit instance_statistics_root_path
+
+ expect(find('.nav-sidebar')).not_to have_content('Cohorts')
+ end
+
+ it 'shows cohorts nav button when usage ping is enabled' do
+ stub_application_setting(usage_ping_enabled: true)
+
+ visit instance_statistics_root_path
+
+ expect(find('.nav-sidebar')).to have_content('Cohorts')
+ end
+end
diff --git a/spec/features/issuables/close_reopen_report_toggle_spec.rb b/spec/features/issuables/close_reopen_report_toggle_spec.rb
index de6f5fe1560..26c44baeb21 100644
--- a/spec/features/issuables/close_reopen_report_toggle_spec.rb
+++ b/spec/features/issuables/close_reopen_report_toggle_spec.rb
@@ -56,6 +56,24 @@ describe 'Issuables Close/Reopen/Report toggle' do
end
it_behaves_like 'an issuable close/reopen/report toggle'
+
+ context 'when the issue is closed and locked' do
+ let(:issuable) { create(:issue, :closed, :locked, project: project) }
+
+ it 'hides the reopen button' do
+ expect(page).not_to have_link('Reopen issue')
+ end
+
+ context 'when the issue author is the current user' do
+ before do
+ issuable.update(author: user)
+ end
+
+ it 'hides the reopen button' do
+ expect(page).not_to have_link('Reopen issue')
+ end
+ end
+ end
end
context 'when user doesnt have permission to update' do
@@ -93,6 +111,28 @@ describe 'Issuables Close/Reopen/Report toggle' do
end
it_behaves_like 'an issuable close/reopen/report toggle'
+
+ context 'when the merge request is merged' do
+ let(:issuable) { create(:merge_request, :merged, source_project: project) }
+
+ it 'shows only the `Report abuse` and `Edit` button' do
+ expect(page).to have_link('Report abuse')
+ expect(page).to have_link('Edit')
+ expect(page).not_to have_link('Close merge request')
+ expect(page).not_to have_link('Reopen merge request')
+ end
+
+ context 'when the merge request author is the current user' do
+ let(:issuable) { create(:merge_request, :merged, source_project: project, author: user) }
+
+ it 'shows only the `Edit` button' do
+ expect(page).to have_link('Edit')
+ expect(page).not_to have_link('Report abuse')
+ expect(page).not_to have_link('Close merge request')
+ expect(page).not_to have_link('Reopen merge request')
+ end
+ end
+ end
end
context 'when user doesnt have permission to update' do
diff --git a/spec/features/issues/award_emoji_spec.rb b/spec/features/issues/award_emoji_spec.rb
deleted file mode 100644
index bf60b18873c..00000000000
--- a/spec/features/issues/award_emoji_spec.rb
+++ /dev/null
@@ -1,146 +0,0 @@
-require 'rails_helper'
-
-describe 'Awards Emoji' do
- let!(:project) { create(:project, :public) }
- let!(:user) { create(:user) }
- let(:issue) do
- create(:issue,
- assignees: [user],
- project: project)
- end
-
- context 'authorized user' do
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- describe 'visiting an issue with a legacy award emoji that is not valid anymore' do
- before do
- # The `heart_tip` emoji is not valid anymore so we need to skip validation
- issue.award_emoji.build(user: user, name: 'heart_tip').save!(validate: false)
- visit project_issue_path(project, issue)
- wait_for_requests
- end
-
- # Regression test: https://gitlab.com/gitlab-org/gitlab-ce/issues/29529
- it 'does not shows a 500 page', :js do
- expect(page).to have_text(issue.title)
- end
- end
-
- describe 'Click award emoji from issue#show' do
- let!(:note) { create(:note_on_issue, noteable: issue, project: issue.project, note: "Hello world") }
-
- before do
- visit project_issue_path(project, issue)
- wait_for_requests
- end
-
- it 'increments the thumbsdown emoji', :js do
- find('[data-name="thumbsdown"]').click
- wait_for_requests
- expect(thumbsdown_emoji).to have_text("1")
- end
-
- context 'click the thumbsup emoji' do
- it 'increments the thumbsup emoji', :js do
- find('[data-name="thumbsup"]').click
- wait_for_requests
- expect(thumbsup_emoji).to have_text("1")
- end
-
- it 'decrements the thumbsdown emoji', :js do
- expect(thumbsdown_emoji).to have_text("0")
- end
- end
-
- context 'click the thumbsdown emoji' do
- it 'increments the thumbsdown emoji', :js do
- find('[data-name="thumbsdown"]').click
- wait_for_requests
- expect(thumbsdown_emoji).to have_text("1")
- end
-
- it 'decrements the thumbsup emoji', :js do
- expect(thumbsup_emoji).to have_text("0")
- end
- end
-
- it 'toggles the smiley emoji on a note', :js do
- toggle_smiley_emoji(true)
-
- within('.note-body') do
- expect(find(emoji_counter)).to have_text("1")
- end
-
- toggle_smiley_emoji(false)
-
- within('.note-body') do
- expect(page).not_to have_selector(emoji_counter)
- end
- end
-
- context 'execute /award quick action' do
- it 'toggles the emoji award on noteable', :js do
- execute_quick_action('/award :100:')
-
- expect(find(noteable_award_counter)).to have_text("1")
-
- execute_quick_action('/award :100:')
-
- expect(page).not_to have_selector(noteable_award_counter)
- end
- end
- end
- end
-
- context 'unauthorized user', :js do
- before do
- visit project_issue_path(project, issue)
- end
-
- it 'has disabled emoji button' do
- expect(first('.award-control')[:class]).to have_text('disabled')
- end
- end
-
- def execute_quick_action(cmd)
- within('.js-main-target-form') do
- fill_in 'note[note]', with: cmd
- click_button 'Comment'
- end
-
- wait_for_requests
- end
-
- def thumbsup_emoji
- page.all(emoji_counter).first
- end
-
- def thumbsdown_emoji
- page.all(emoji_counter).last
- end
-
- def emoji_counter
- 'span.js-counter'
- end
-
- def noteable_award_counter
- ".awards .active"
- end
-
- def toggle_smiley_emoji(status)
- within('.note') do
- find('.note-emoji-button').click
- end
-
- unless status
- first('[data-name="smiley"]').click
- else
- find('[data-name="smiley"]').click
- end
-
- wait_for_requests
- end
-end
diff --git a/spec/features/issues/award_spec.rb b/spec/features/issues/award_spec.rb
deleted file mode 100644
index e53a4ce49c7..00000000000
--- a/spec/features/issues/award_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require 'rails_helper'
-
-describe 'Issue awards', :js do
- let(:user) { create(:user) }
- let(:project) { create(:project, :public) }
- let(:issue) { create(:issue, project: project) }
-
- describe 'logged in' do
- before do
- sign_in(user)
- visit project_issue_path(project, issue)
- wait_for_requests
- end
-
- it 'adds award to issue' do
- first('.js-emoji-btn').click
- expect(page).to have_selector('.js-emoji-btn.active')
- expect(first('.js-emoji-btn')).to have_content '1'
-
- visit project_issue_path(project, issue)
- expect(first('.js-emoji-btn')).to have_content '1'
- end
-
- it 'removes award from issue' do
- first('.js-emoji-btn').click
- find('.js-emoji-btn.active').click
- expect(first('.js-emoji-btn')).to have_content '0'
-
- visit project_issue_path(project, issue)
- expect(first('.js-emoji-btn')).to have_content '0'
- end
-
- it 'only has one menu on the page' do
- first('.js-add-award').click
- expect(page).to have_selector('.emoji-menu')
-
- expect(page).to have_selector('.emoji-menu', count: 1)
- end
- end
-
- describe 'logged out' do
- before do
- visit project_issue_path(project, issue)
- wait_for_requests
- end
-
- it 'does not see award menu button' do
- expect(page).not_to have_selector('.js-award-holder')
- end
- end
-end
diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
index d011d2545bb..e910fb54d23 100644
--- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
@@ -156,13 +156,21 @@ describe 'Dropdown assignee', :js do
expect_filtered_search_input_empty
end
- it 'selects `no assignee`' do
- find('#js-dropdown-assignee .filter-dropdown-item', text: 'No Assignee').click
+ it 'selects `None`' do
+ find('#js-dropdown-assignee .filter-dropdown-item', text: 'None').click
expect(page).to have_css(js_dropdown_assignee, visible: false)
expect_tokens([assignee_token('none')])
expect_filtered_search_input_empty
end
+
+ it 'selects `Any`' do
+ find('#js-dropdown-assignee .filter-dropdown-item', text: 'Any').click
+
+ expect(page).to have_css(js_dropdown_assignee, visible: false)
+ expect_tokens([assignee_token('any')])
+ expect_filtered_search_input_empty
+ end
end
describe 'selecting from dropdown without Ajax call' do
diff --git a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
index be229e8aa7d..97dd0afd002 100644
--- a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
@@ -20,7 +20,7 @@ describe 'Dropdown emoji', :js do
end
def dropdown_emoji_size
- page.all('#js-dropdown-my-reaction .filter-dropdown .filter-dropdown-item').size
+ all('gl-emoji[data-name]').size
end
def click_emoji(text)
@@ -92,7 +92,7 @@ describe 'Dropdown emoji', :js do
it 'shows the most populated emoji at top of dropdown' do
send_keys_to_filtered_search('my-reaction:')
- expect(first('#js-dropdown-my-reaction li')).to have_content(award_emoji_star.name)
+ expect(first('#js-dropdown-my-reaction .filter-dropdown li')).to have_content(award_emoji_star.name)
end
end
@@ -121,13 +121,29 @@ describe 'Dropdown emoji', :js do
send_keys_to_filtered_search(':')
end
+ it 'selects `None`' do
+ find('#js-dropdown-my-reaction .filter-dropdown-item', text: 'None').click
+
+ expect(page).to have_css(js_dropdown_emoji, visible: false)
+ expect_tokens([reaction_token('none', false)])
+ expect_filtered_search_input_empty
+ end
+
+ it 'selects `Any`' do
+ find('#js-dropdown-my-reaction .filter-dropdown-item', text: 'Any').click
+
+ expect(page).to have_css(js_dropdown_emoji, visible: false)
+ expect_tokens([reaction_token('any', false)])
+ expect_filtered_search_input_empty
+ end
+
it 'fills in the my-reaction name' do
click_emoji('thumbsup')
wait_for_requests
expect(page).to have_css(js_dropdown_emoji, visible: false)
- expect_tokens([emoji_token('thumbsup')])
+ expect_tokens([reaction_token('thumbsup')])
expect_filtered_search_input_empty
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
index b99c5a7f4e3..0e296ab2109 100644
--- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
@@ -15,6 +15,7 @@ describe 'Dropdown hint', :js do
before do
project.add_maintainer(user)
create(:issue, project: project)
+ create(:merge_request, source_project: project, target_project: project)
end
context 'when user not logged in' do
@@ -224,4 +225,21 @@ describe 'Dropdown hint', :js do
end
end
end
+
+ context 'merge request page' do
+ before do
+ sign_in(user)
+ visit project_merge_requests_path(project)
+ filtered_search.click
+ end
+
+ it 'shows the WIP menu item and opens the WIP options dropdown' do
+ click_hint('wip')
+
+ expect(page).to have_css(js_dropdown_hint, visible: false)
+ expect(page).to have_css('#js-dropdown-wip', visible: true)
+ expect_tokens([{ name: 'wip' }])
+ expect_filtered_search_input_empty
+ end
+ end
end
diff --git a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
index f76d30056da..ef5801e61e8 100644
--- a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
@@ -189,13 +189,21 @@ describe 'Dropdown milestone', :js do
end
it 'selects `no milestone`' do
- click_static_milestone('No Milestone')
+ click_static_milestone('None')
expect(page).to have_css(js_dropdown_milestone, visible: false)
expect_tokens([milestone_token('none', false)])
expect_filtered_search_input_empty
end
+ it 'selects `any milestone`' do
+ click_static_milestone('Any')
+
+ expect(page).to have_css(js_dropdown_milestone, visible: false)
+ expect_tokens([milestone_token('any', false)])
+ expect_filtered_search_input_empty
+ end
+
it 'selects `upcoming milestone`' do
click_static_milestone('Upcoming')
diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb
index d4949de3f27..35d57b3896d 100644
--- a/spec/features/issues/filtered_search/filter_issues_spec.rb
+++ b/spec/features/issues/filtered_search/filter_issues_spec.rb
@@ -265,7 +265,7 @@ describe 'Filter issues', :js do
context 'issue label clicked' do
it 'filters and displays in search bar' do
- find('.issues-list .issue .issue-main-info .issuable-info a .badge', text: multiple_words_label.title).click
+ find('.issues-list .issue .issuable-main-info .issuable-info a .badge', text: multiple_words_label.title).click
expect_issues_list_count(1)
expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
diff --git a/spec/features/issues/filtered_search/visual_tokens_spec.rb b/spec/features/issues/filtered_search/visual_tokens_spec.rb
index 6ac7ccd00f7..1e1dd5691ab 100644
--- a/spec/features/issues/filtered_search/visual_tokens_spec.rb
+++ b/spec/features/issues/filtered_search/visual_tokens_spec.rb
@@ -118,7 +118,7 @@ describe 'Visual tokens', :js do
describe 'selecting static option from dropdown' do
before do
- find("#js-dropdown-assignee").find('.filter-dropdown-item', text: 'No Assignee').click
+ find("#js-dropdown-assignee").find('.filter-dropdown-item', text: 'None').click
end
it 'changes value in visual token' do
diff --git a/spec/features/issues/form_spec.rb b/spec/features/issues/form_spec.rb
index 1456a2f0375..f2e4c5779df 100644
--- a/spec/features/issues/form_spec.rb
+++ b/spec/features/issues/form_spec.rb
@@ -27,7 +27,7 @@ describe 'New/edit issue', :js do
before do
# Using `allow_any_instance_of`/`and_wrap_original`, `original` would
# somehow refer to the very block we defined to _wrap_ that method, instead of
- # the original method, resulting in infinite recurison when called.
+ # the original method, resulting in infinite recursion when called.
# This is likely a bug with helper modules included into dynamically generated view classes.
# To work around this, we have to hold on to and call to the original implementation manually.
original_issue_dropdown_options = FormHelper.instance_method(:issue_assignees_dropdown_options)
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 98e37d8011a..7c591dacce5 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -1,20 +1,27 @@
require 'rails_helper'
describe 'GFM autocomplete', :js do
+ let(:issue_xss_title) { 'This will execute alert<img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;' }
+ let(:user_xss_title) { 'eve <img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;' }
+
+ let(:user_xss) { create(:user, name: user_xss_title, username: 'xss.user') }
let(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let(:project) { create(:project) }
let(:label) { create(:label, project: project, title: 'special+') }
let(:issue) { create(:issue, project: project) }
+ let!(:project_snippet) { create(:project_snippet, project: project, title: 'code snippet') }
before do
project.add_maintainer(user)
+ project.add_maintainer(user_xss)
+
sign_in(user)
visit project_issue_path(project, issue)
wait_for_requests
end
- it 'updates issue descripton with GFM reference' do
+ it 'updates issue description with GFM reference' do
find('.js-issuable-edit').click
simulate_input('#issue-description', "@#{user.name[0...3]}")
@@ -34,6 +41,32 @@ describe 'GFM autocomplete', :js do
expect(page).to have_selector('.atwho-container')
end
+ it 'opens autocomplete menu for Issues when field starts with text with item escaping HTML characters' do
+ create(:issue, project: project, title: issue_xss_title)
+
+ page.within '.timeline-content-form' do
+ find('#note-body').native.send_keys('#')
+ end
+
+ expect(page).to have_selector('.atwho-container')
+
+ page.within '.atwho-container #at-view-issues' do
+ expect(page.all('li').first.text).to include(issue_xss_title)
+ end
+ end
+
+ it 'opens autocomplete menu for Username when field starts with text with item escaping HTML characters' do
+ page.within '.timeline-content-form' do
+ find('#note-body').native.send_keys('@ev')
+ end
+
+ expect(page).to have_selector('.atwho-container')
+
+ page.within '.atwho-container #at-view-users' do
+ expect(find('li').text).to have_content(user_xss.username)
+ end
+ end
+
it 'doesnt open autocomplete menu character is prefixed with text' do
page.within '.timeline-content-form' do
find('#note-body').native.send_keys('testing')
@@ -91,7 +124,7 @@ describe 'GFM autocomplete', :js do
wait_for_requests
- expect(find('#at-view-64')).to have_selector('.cur:first-of-type')
+ expect(find('#at-view-users')).to have_selector('.cur:first-of-type')
end
it 'includes items for assignee dropdowns with non-ASCII characters in name' do
@@ -104,7 +137,7 @@ describe 'GFM autocomplete', :js do
wait_for_requests
- expect(find('#at-view-64')).to have_content(user.name)
+ expect(find('#at-view-users')).to have_content(user.name)
end
it 'selects the first item for non-assignee dropdowns if a query is entered' do
@@ -301,6 +334,16 @@ describe 'GFM autocomplete', :js do
end
end
+ it 'shows project snippets' do
+ page.within '.timeline-content-form' do
+ find('#note-body').native.send_keys('$')
+ end
+
+ page.within '.atwho-container' do
+ expect(page).to have_content(project_snippet.title)
+ end
+ end
+
private
def expect_to_wrap(should_wrap, item, note, value)
diff --git a/spec/features/issues/issue_detail_spec.rb b/spec/features/issues/issue_detail_spec.rb
index 088ab114df3..76bc93e9766 100644
--- a/spec/features/issues/issue_detail_spec.rb
+++ b/spec/features/issues/issue_detail_spec.rb
@@ -18,6 +18,23 @@ describe 'Issue Detail', :js do
end
end
+ context 'when issue description has xss snippet' do
+ before do
+ issue.update!(description: '![xss" onload=alert(1);//](a)')
+ sign_in(user)
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'should encode the description to prevent xss issues' do
+ page.within('.issuable-details .detail-page-description') do
+ expect(page).to have_selector('img', count: 1)
+ expect(find('img')['onerror']).to be_nil
+ expect(find('img')['src']).to end_with('/a')
+ end
+ end
+ end
+
context 'when edited by a user who is later deleted' do
before do
sign_in(user)
diff --git a/spec/features/issues/notes_on_issues_spec.rb b/spec/features/issues/notes_on_issues_spec.rb
index f08c73f947c..fed77453cbb 100644
--- a/spec/features/issues/notes_on_issues_spec.rb
+++ b/spec/features/issues/notes_on_issues_spec.rb
@@ -3,6 +3,12 @@ require 'spec_helper'
describe 'Create notes on issues', :js do
let(:user) { create(:user) }
+ def submit_comment(text)
+ fill_in 'note[note]', with: text
+ click_button 'Comment'
+ wait_for_requests
+ end
+
shared_examples 'notes with reference' do
let(:issue) { create(:issue, project: project) }
let(:note_text) { "Check #{mention.to_reference}" }
@@ -12,10 +18,7 @@ describe 'Create notes on issues', :js do
sign_in(user)
visit project_issue_path(project, issue)
- fill_in 'note[note]', with: note_text
- click_button 'Comment'
-
- wait_for_requests
+ submit_comment(note_text)
end
it 'creates a note with reference and cross references the issue' do
@@ -74,4 +77,16 @@ describe 'Create notes on issues', :js do
let(:mention) { create(:merge_request, source_project: project) }
end
end
+
+ it 'highlights the current user in a comment' do
+ project = create(:project)
+ issue = create(:issue, project: project)
+ project.add_developer(user)
+ sign_in(user)
+
+ visit project_issue_path(project, issue)
+ submit_comment("@#{user.username} note to self")
+
+ expect(page).to have_selector '.gfm-project_member.current-user', text: user.username
+ end
end
diff --git a/spec/features/issues/resource_label_events_spec.rb b/spec/features/issues/resource_label_events_spec.rb
new file mode 100644
index 00000000000..b0764db7751
--- /dev/null
+++ b/spec/features/issues/resource_label_events_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe 'List issue resource label events', :js do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :public) }
+ let(:issue) { create(:issue, project: project, author: user) }
+ let!(:label) { create(:label, project: project, title: 'foo') }
+ let!(:user_status) { create(:user_status, user: user) }
+
+ context 'when user displays the issue' do
+ let!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue, note: 'some note') }
+ let!(:event) { create(:resource_label_event, user: user, issue: issue, label: label) }
+
+ before do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'shows both notes and resource label events' do
+ page.within('#notes') do
+ expect(find("#note_#{note.id}")).to have_content 'some note'
+ expect(find("#note_#{event.discussion_id}")).to have_content 'added foo label'
+ end
+ end
+
+ it 'shows the user status on the system note for the label' do
+ page.within("#note_#{event.discussion_id}") do
+ expect(page).to show_user_status user_status
+ end
+ end
+ end
+
+ context 'when user adds label to the issue' do
+ def toggle_labels(labels)
+ page.within '.labels' do
+ click_link 'Edit'
+ wait_for_requests
+
+ labels.each { |label| click_link label }
+
+ click_link 'Edit'
+ wait_for_requests
+ end
+ end
+
+ before do
+ create(:label, project: project, title: 'bar')
+ project.add_developer(user)
+
+ sign_in(user)
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'shows add note for newly added labels' do
+ toggle_labels(%w(foo bar))
+ visit project_issue_path(project, issue)
+ wait_for_requests
+
+ page.within('#notes') do
+ expect(page).to have_content 'added bar foo labels'
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/issues/rss_spec.rb b/spec/features/issues/rss_spec.rb
index 0e1383cd607..0e1383cd607 100644
--- a/spec/features/projects/issues/rss_spec.rb
+++ b/spec/features/issues/rss_spec.rb
diff --git a/spec/features/projects/issues/user_comments_on_issue_spec.rb b/spec/features/issues/user_comments_on_issue_spec.rb
index ba5b80ed04b..ba5b80ed04b 100644
--- a/spec/features/projects/issues/user_comments_on_issue_spec.rb
+++ b/spec/features/issues/user_comments_on_issue_spec.rb
diff --git a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
index 3dfcbc2fcb8..32bc851f00f 100644
--- a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
+++ b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
@@ -55,11 +55,11 @@ describe 'User creates branch and merge request on issue page', :js do
test_branch_name_checking(input_branch_name)
test_source_checking(input_source)
- # The button inside dropdown should be disabled if any errors occured.
+ # The button inside dropdown should be disabled if any errors occurred.
expect(page).to have_button('Create branch', disabled: true)
end
- # The top level button should be disabled if any errors occured.
+ # The top level button should be disabled if any errors occurred.
expect(page).to have_button('Create branch', disabled: true)
end
@@ -76,7 +76,7 @@ describe 'User creates branch and merge request on issue page', :js do
visit project_issue_path(project, issue)
- expect(page).to have_content('created branch 1-cherry-coloured-funk')
+ expect(page).to have_content("created merge request !1 to address this issue")
expect(page).to have_content('mentioned in merge request !1')
end
@@ -106,7 +106,7 @@ describe 'User creates branch and merge request on issue page', :js do
visit project_issue_path(project, issue)
- expect(page).to have_content('created branch custom-branch-name')
+ expect(page).to have_content("created merge request !1 to address this issue")
expect(page).to have_content('mentioned in merge request !1')
end
diff --git a/spec/features/projects/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index 5e8662100c5..687a6f1eafc 100644
--- a/spec/features/projects/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -47,15 +47,15 @@ describe "User creates issue" do
textarea = first(".gfm-form textarea")
page.within(form) do
- click_link("Preview")
+ click_button("Preview")
preview = find(".js-md-preview") # this element is findable only when the "Preview" link is clicked.
expect(preview).to have_content("Nothing to preview.")
- click_link("Write")
+ click_button("Write")
fill_in("Description", with: "Bug fixed :smile:")
- click_link("Preview")
+ click_button("Preview")
expect(preview).to have_css("gl-emoji")
expect(textarea).not_to be_visible
diff --git a/spec/features/projects/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index 1d9c3abc20f..60b88ef4bdf 100644
--- a/spec/features/projects/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -17,9 +17,9 @@ describe "User edits issue", :js do
page.within(form) do
fill_in("Description", with: "Bug fixed :smile:")
- click_link("Preview")
+ click_button("Preview")
end
- expect(form).to have_link("Write")
+ expect(form).to have_button("Write")
end
end
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
new file mode 100644
index 00000000000..afa425c2cec
--- /dev/null
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -0,0 +1,347 @@
+require 'spec_helper'
+
+describe 'User interacts with awards' do
+ let(:user) { create(:user) }
+
+ describe 'User interacts with awards in an issue', :js do
+ let(:issue) { create(:issue, project: project)}
+ let(:project) { create(:project) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ visit(project_issue_path(project, issue))
+ end
+
+ it 'toggles the thumbsup award emoji' do
+ page.within('.awards') do
+ thumbsup = page.first('.award-control')
+ thumbsup.click
+ thumbsup.hover
+
+ expect(page).to have_selector('.js-emoji-btn')
+ expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
+ expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
+
+ thumbsup = page.first('.award-control')
+ thumbsup.click
+ thumbsup.hover
+
+ expect(page).to have_selector('.award-control.js-emoji-btn')
+ expect(page.all('.award-control.js-emoji-btn').size).to eq(2)
+
+ page.all('.award-control.js-emoji-btn').each do |element|
+ expect(element['title']).to eq('')
+ end
+
+ expect(page.all('.award-control .js-counter')).to all(have_content('0'))
+
+ thumbsup = page.first('.award-control')
+ thumbsup.click
+ thumbsup.hover
+
+ expect(page).to have_selector('.js-emoji-btn')
+ expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
+ expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
+ end
+ end
+
+ it 'toggles a custom award emoji' do
+ page.within('.awards') do
+ page.find('.js-add-award').click
+ end
+
+ page.find('.emoji-menu.is-visible')
+
+ expect(page).to have_selector('.js-emoji-menu-search')
+ expect(page.evaluate_script("document.activeElement.classList.contains('js-emoji-menu-search')")).to eq(true)
+
+ page.within('.emoji-menu-content') do
+ emoji_button = page.first('.js-emoji-btn')
+ emoji_button.hover
+ emoji_button.click
+ end
+
+ page.within('.awards') do
+ expect(page).to have_selector('.js-emoji-btn')
+ expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
+ expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
+
+ expect do
+ page.find('.js-emoji-btn.active').click
+ wait_for_requests
+ end.to change { page.all('.award-control.js-emoji-btn').size }.from(3).to(2)
+ end
+ end
+
+ it 'shows the list of award emoji categories' do
+ page.within('.awards') do
+ page.find('.js-add-award').click
+ end
+
+ page.find('.emoji-menu.is-visible')
+
+ expect(page).to have_selector('.js-emoji-menu-search')
+ expect(page.evaluate_script("document.activeElement.classList.contains('js-emoji-menu-search')")).to eq(true)
+
+ fill_in('emoji-menu-search', with: 'hand')
+
+ page.within('.emoji-menu-content') do
+ expect(page).to have_selector('[data-name="raised_hand"]')
+ end
+ end
+
+ it 'adds an award emoji by a comment' do
+ page.within('.js-main-target-form') do
+ fill_in('note[note]', with: ':smile:')
+
+ click_button('Comment')
+ end
+
+ expect(page).to have_emoji('smile')
+ end
+
+ context 'when a project is archived' do
+ let(:project) { create(:project, :archived) }
+
+ it 'hides the add award button' do
+ page.within('.awards') do
+ expect(page).not_to have_css('.js-add-award')
+ end
+ end
+ end
+
+ context 'User interacts with awards on a note' do
+ let!(:note) { create(:note, noteable: issue, project: issue.project) }
+ let!(:award_emoji) { create(:award_emoji, awardable: note, name: '100') }
+
+ it 'shows the award on the note' do
+ page.within('.note-awards') do
+ expect(page).to have_emoji('100')
+ end
+ end
+
+ it 'allows adding a vote to an award' do
+ page.within('.note-awards') do
+ find('gl-emoji[data-name="100"]').click
+ end
+ wait_for_requests
+
+ expect(note.reload.award_emoji.size).to eq(2)
+ end
+
+ it 'allows adding a new emoji' do
+ page.within('.note-actions') do
+ find('a.js-add-award').click
+ end
+ page.within('.emoji-menu-content') do
+ find('gl-emoji[data-name="8ball"]').click
+ end
+ wait_for_requests
+
+ page.within('.note-awards') do
+ expect(page).to have_emoji('8ball')
+ end
+ expect(note.reload.award_emoji.size).to eq(2)
+ end
+
+ context 'when the project is archived' do
+ let(:project) { create(:project, :archived) }
+
+ it 'hides the buttons for adding new emoji' do
+ page.within('.note-awards') do
+ expect(page).not_to have_css('.award-menu-holder')
+ end
+
+ page.within('.note-actions') do
+ expect(page).not_to have_css('a.js-add-award')
+ end
+ end
+
+ it 'does not allow toggling existing emoji' do
+ page.within('.note-awards') do
+ find('gl-emoji[data-name="100"]').click
+ end
+ wait_for_requests
+
+ expect(note.reload.award_emoji.size).to eq(1)
+ end
+ end
+ end
+ end
+
+ describe 'User interacts with awards on an issue', :js do
+ let(:project) { create(:project, :public) }
+ let(:issue) { create(:issue, project: project) }
+
+ describe 'logged in' do
+ before do
+ sign_in(user)
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'adds award to issue' do
+ first('.js-emoji-btn').click
+
+ expect(page).to have_selector('.js-emoji-btn.active')
+ expect(first('.js-emoji-btn')).to have_content '1'
+
+ visit project_issue_path(project, issue)
+
+ expect(first('.js-emoji-btn')).to have_content '1'
+ end
+
+ it 'removes award from issue' do
+ first('.js-emoji-btn').click
+ find('.js-emoji-btn.active').click
+
+ expect(first('.js-emoji-btn')).to have_content '0'
+
+ visit project_issue_path(project, issue)
+
+ expect(first('.js-emoji-btn')).to have_content '0'
+ end
+
+ it 'only has one menu on the page' do
+ first('.js-add-award').click
+
+ expect(page).to have_selector('.emoji-menu', count: 1)
+ end
+ end
+
+ describe 'logged out' do
+ before do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'does not see award menu button' do
+ expect(page).not_to have_selector('.js-award-holder')
+ end
+ end
+ end
+
+ describe 'Awards Emoji' do
+ let!(:project) { create(:project, :public) }
+ let(:issue) { create(:issue, assignees: [user], project: project) }
+
+ context 'authorized user' do
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ describe 'visiting an issue with a legacy award emoji that is not valid anymore' do
+ before do
+ # The `heart_tip` emoji is not valid anymore so we need to skip validation
+ issue.award_emoji.build(user: user, name: 'heart_tip').save!(validate: false)
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ # Regression test: https://gitlab.com/gitlab-org/gitlab-ce/issues/29529
+ it 'does not shows a 500 page', :js do
+ expect(page).to have_text(issue.title)
+ end
+ end
+
+ describe 'Click award emoji from issue#show' do
+ let!(:note) { create(:note_on_issue, noteable: issue, project: issue.project, note: "Hello world") }
+
+ before do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ context 'click the thumbsdown emoji' do
+ it 'increments the thumbsdown emoji', :js do
+ find('[data-name="thumbsdown"]').click
+ wait_for_requests
+ expect(thumbsdown_emoji).to have_text("1")
+ end
+
+ it 'decrements the thumbsup emoji', :js do
+ expect(thumbsup_emoji).to have_text("0")
+ end
+ end
+
+ it 'toggles the smiley emoji on a note', :js do
+ toggle_smiley_emoji(true)
+
+ within('.note-body') do
+ expect(find(emoji_counter)).to have_text("1")
+ end
+
+ toggle_smiley_emoji(false)
+
+ within('.note-body') do
+ expect(page).not_to have_selector(emoji_counter)
+ end
+ end
+
+ context 'execute /award quick action' do
+ it 'toggles the emoji award on noteable', :js do
+ execute_quick_action('/award :100:')
+
+ expect(find(noteable_award_counter)).to have_text("1")
+
+ execute_quick_action('/award :100:')
+
+ expect(page).not_to have_selector(noteable_award_counter)
+ end
+ end
+ end
+ end
+
+ context 'unauthorized user', :js do
+ before do
+ visit project_issue_path(project, issue)
+ end
+
+ it 'has disabled emoji button' do
+ expect(first('.award-control')[:class]).to have_text('disabled')
+ end
+ end
+
+ def execute_quick_action(cmd)
+ within('.js-main-target-form') do
+ fill_in 'note[note]', with: cmd
+ click_button 'Comment'
+ end
+
+ wait_for_requests
+ end
+
+ def thumbsup_emoji
+ page.all(emoji_counter).first
+ end
+
+ def thumbsdown_emoji
+ page.all(emoji_counter).last
+ end
+
+ def emoji_counter
+ 'span.js-counter'
+ end
+
+ def noteable_award_counter
+ ".awards .active"
+ end
+
+ def toggle_smiley_emoji(status)
+ within('.note') do
+ find('.note-emoji-button').click
+ end
+
+ if !status
+ first('[data-name="smiley"]').click
+ else
+ find('[data-name="smiley"]').click
+ end
+
+ wait_for_requests
+ end
+ end
+end
diff --git a/spec/features/issues/user_sees_breadcrumb_links_spec.rb b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
new file mode 100644
index 00000000000..ca234321235
--- /dev/null
+++ b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
@@ -0,0 +1,18 @@
+require 'rails_helper'
+
+describe 'New issue breadcrumbs' do
+ let(:project) { create(:project) }
+ let(:user) { project.creator }
+
+ before do
+ sign_in(user)
+ visit new_project_issue_path(project)
+ end
+
+ it 'display a link to project issues and new issue pages' do
+ page.within '.breadcrumbs' do
+ expect(find_link('Issues')[:href]).to end_with(project_issues_path(project))
+ expect(find_link('New')[:href]).to end_with(new_project_issue_path(project))
+ end
+ end
+end
diff --git a/spec/features/projects/issues/user_sorts_issues_spec.rb b/spec/features/issues/user_sorts_issues_spec.rb
index db5936a30cb..4771d2c6d28 100644
--- a/spec/features/projects/issues/user_sorts_issues_spec.rb
+++ b/spec/features/issues/user_sorts_issues_spec.rb
@@ -1,7 +1,9 @@
require "spec_helper"
describe "User sorts issues" do
- set(:project) { create(:project_empty_repo, :public) }
+ set(:user) { create(:user) }
+ set(:group) { create(:group) }
+ set(:project) { create(:project_empty_repo, :public, group: group) }
set(:issue1) { create(:issue, project: project) }
set(:issue2) { create(:issue, project: project) }
set(:issue3) { create(:issue, project: project) }
@@ -12,7 +14,29 @@ describe "User sorts issues" do
create(:award_emoji, :downvote, awardable: issue1)
create(:award_emoji, :upvote, awardable: issue2)
+ sign_in(user)
+
+ visit(project_issues_path(project))
+ end
+
+ it 'keeps the sort option' do
+ find('button.dropdown-toggle').click
+
+ page.within('.content ul.dropdown-menu.dropdown-menu-right li') do
+ click_link('Milestone')
+ end
+
+ visit(issues_dashboard_path(assignee_username: user.username))
+
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+
visit(project_issues_path(project))
+
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+
+ visit(issues_group_path(group))
+
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
end
it "sorts by popularity" do
diff --git a/spec/features/projects/issues/user_toggles_subscription_spec.rb b/spec/features/issues/user_toggles_subscription_spec.rb
index c2b2a193682..c2b2a193682 100644
--- a/spec/features/projects/issues/user_toggles_subscription_spec.rb
+++ b/spec/features/issues/user_toggles_subscription_spec.rb
diff --git a/spec/features/issues/user_uses_slash_commands_spec.rb b/spec/features/issues/user_uses_quick_actions_spec.rb
index 5926e442f24..27cffdc5f8b 100644
--- a/spec/features/issues/user_uses_slash_commands_spec.rb
+++ b/spec/features/issues/user_uses_quick_actions_spec.rb
@@ -303,5 +303,63 @@ describe 'Issues > User uses quick actions', :js do
end
end
end
+
+ describe 'create a merge request starting from an issue' do
+ let(:project) { create(:project, :public, :repository) }
+ let(:issue) { create(:issue, project: project) }
+
+ def expect_mr_quickaction(success)
+ expect(page).to have_content 'Commands applied'
+
+ if success
+ expect(page).to have_content 'created merge request'
+ else
+ expect(page).not_to have_content 'created merge request'
+ end
+ end
+
+ it "doesn't create a merge request when the branch name is invalid" do
+ add_note("/create_merge_request invalid branch name")
+
+ wait_for_requests
+
+ expect_mr_quickaction(false)
+ end
+
+ it "doesn't create a merge request when a branch with that name already exists" do
+ add_note("/create_merge_request feature")
+
+ wait_for_requests
+
+ expect_mr_quickaction(false)
+ end
+
+ it 'creates a new merge request using issue iid and title as branch name when the branch name is empty' do
+ add_note("/create_merge_request")
+
+ wait_for_requests
+
+ expect_mr_quickaction(true)
+
+ created_mr = project.merge_requests.last
+ expect(created_mr.source_branch).to eq(issue.to_branch_name)
+
+ visit project_merge_request_path(project, created_mr)
+ expect(page).to have_content %{WIP: Resolve "#{issue.title}"}
+ end
+
+ it 'creates a merge request using the given branch name' do
+ branch_name = '1-feature'
+ add_note("/create_merge_request #{branch_name}")
+
+ expect_mr_quickaction(true)
+
+ created_mr = project.merge_requests.last
+ expect(created_mr.source_branch).to eq(branch_name)
+
+ visit project_merge_request_path(project, created_mr)
+ expect(page).to have_content %{WIP: Resolve "#{issue.title}"}
+ end
+ end
end
end
diff --git a/spec/features/projects/issues/user_views_issue_spec.rb b/spec/features/issues/user_views_issue_spec.rb
index 117e5986f29..330b6f0e77a 100644
--- a/spec/features/projects/issues/user_views_issue_spec.rb
+++ b/spec/features/issues/user_views_issue_spec.rb
@@ -1,9 +1,9 @@
require "spec_helper"
describe "User views issue" do
- set(:project) { create(:project_empty_repo, :public) }
- set(:user) { create(:user) }
- set(:issue) { create(:issue, project: project, description: "# Description header", author: user) }
+ let(:project) { create(:project_empty_repo, :public) }
+ let(:user) { create(:user) }
+ let(:issue) { create(:issue, project: project, description: "# Description header", author: user) }
before do
project.add_developer(user)
diff --git a/spec/features/projects/issues/user_views_issues_spec.rb b/spec/features/issues/user_views_issues_spec.rb
index 58afb4efb86..58afb4efb86 100644
--- a/spec/features/projects/issues/user_views_issues_spec.rb
+++ b/spec/features/issues/user_views_issues_spec.rb
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index 6f917f522bc..09904cb907f 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -156,7 +156,7 @@ describe 'Labels Hierarchy', :js, :nested_groups do
find('a.label-item', text: parent_group_label.title).click
find('a.label-item', text: project_label_1.title).click
- find('.btn-create').click
+ find('.btn-success').click
expect(page.find('.issue-details h2.title')).to have_content('new created issue')
expect(page).to have_selector('span.badge', text: grandparent_group_label.title)
diff --git a/spec/features/markdown/markdown_spec.rb b/spec/features/markdown/markdown_spec.rb
index cac8a5068ec..3b37ede8579 100644
--- a/spec/features/markdown/markdown_spec.rb
+++ b/spec/features/markdown/markdown_spec.rb
@@ -264,9 +264,9 @@ describe 'GitLab Markdown', :aggregate_failures do
@project_wiki = @feat.project_wiki
@project_wiki_page = @feat.project_wiki_page
- file = Gollum::File.new(@project_wiki.wiki)
- expect(file).to receive(:path).and_return('images/example.jpg')
- expect(@project_wiki).to receive(:find_file).with('images/example.jpg').and_return(file)
+ path = 'images/example.jpg'
+ gitaly_wiki_file = Gitlab::GitalyClient::WikiFile.new(path: path)
+ expect(@project_wiki).to receive(:find_file).with(path).and_return(Gitlab::Git::WikiFile.new(gitaly_wiki_file))
allow(@project_wiki).to receive(:wiki_base_path) { '/namespace1/gitlabhq/wikis' }
@html = markdown(@feat.raw_markdown, { pipeline: :wiki, project_wiki: @project_wiki, page_slug: @project_wiki_page.slug })
diff --git a/spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb b/spec/features/merge_request/user_accepts_merge_request_spec.rb
index 01aeed93947..01aeed93947 100644
--- a/spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb
diff --git a/spec/features/projects/merge_requests/user_closes_merge_request_spec.rb b/spec/features/merge_request/user_closes_merge_request_spec.rb
index 2d12d690151..2d12d690151 100644
--- a/spec/features/projects/merge_requests/user_closes_merge_request_spec.rb
+++ b/spec/features/merge_request/user_closes_merge_request_spec.rb
diff --git a/spec/features/projects/merge_requests/user_comments_on_commit_spec.rb b/spec/features/merge_request/user_comments_on_commit_spec.rb
index 8ea358bcc70..8ea358bcc70 100644
--- a/spec/features/projects/merge_requests/user_comments_on_commit_spec.rb
+++ b/spec/features/merge_request/user_comments_on_commit_spec.rb
diff --git a/spec/features/projects/merge_requests/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb
index 441b080bee5..00cf368e8c9 100644
--- a/spec/features/projects/merge_requests/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -28,7 +28,7 @@ describe 'User comments on a diff', :js do
click_button('Comment')
end
- page.within('.files > div:nth-child(3)') do
+ page.within('.diff-files-holder > div:nth-child(3)') do
expect(page).to have_content('Line is wrong')
find('.js-btn-vue-toggle-comments').click
@@ -49,7 +49,7 @@ describe 'User comments on a diff', :js do
wait_for_requests
- page.within('.files > div:nth-child(2) .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(2) .note-body > .note-text') do
expect(page).to have_content('Line is correct')
end
@@ -63,7 +63,7 @@ describe 'User comments on a diff', :js do
wait_for_requests
# Hide the comment.
- page.within('.files > div:nth-child(3)') do
+ page.within('.diff-files-holder > div:nth-child(3)') do
find('.js-btn-vue-toggle-comments').click
expect(page).not_to have_content('Line is wrong')
@@ -71,21 +71,21 @@ describe 'User comments on a diff', :js do
# At this moment a user should see only one comment.
# The other one should be hidden.
- page.within('.files > div:nth-child(2) .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(2) .note-body > .note-text') do
expect(page).to have_content('Line is correct')
end
# Show the comment.
- page.within('.files > div:nth-child(3)') do
+ page.within('.diff-files-holder > div:nth-child(3)') do
find('.js-btn-vue-toggle-comments').click
end
# Now both the comments should be shown.
- page.within('.files > div:nth-child(3) .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(3) .note-body > .note-text') do
expect(page).to have_content('Line is wrong')
end
- page.within('.files > div:nth-child(2) .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(2) .note-body > .note-text') do
expect(page).to have_content('Line is correct')
end
@@ -95,11 +95,11 @@ describe 'User comments on a diff', :js do
wait_for_requests
- page.within('.files > div:nth-child(3) .parallel .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(3) .parallel .note-body > .note-text') do
expect(page).to have_content('Line is wrong')
end
- page.within('.files > div:nth-child(2) .parallel .note-body > .note-text') do
+ page.within('.diff-files-holder > div:nth-child(2) .parallel .note-body > .note-text') do
expect(page).to have_content('Line is correct')
end
end
diff --git a/spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
index 69bdab85d81..69bdab85d81 100644
--- a/spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb
+++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
index f0d38dc6a0c..d790bdc82ce 100644
--- a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
@@ -114,10 +114,9 @@ describe 'Merge request > User creates image diff notes', :js do
create_image_diff_note
end
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- xit 'shows indicator and avatar badges, and allows collapsing/expanding the discussion notes' do
+ it 'shows indicator and avatar badges, and allows collapsing/expanding the discussion notes' do
indicator = find('.js-image-badge', match: :first)
- badge = find('.image-diff-avatar-link .badge', match: :first)
+ badge = find('.user-avatar-link .badge', match: :first)
expect(indicator).to have_content('1')
expect(badge).to have_content('1')
@@ -157,8 +156,7 @@ describe 'Merge request > User creates image diff notes', :js do
visit project_merge_request_path(project, merge_request)
end
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- xit 'render diff indicators within the image frame' do
+ it 'render diff indicators within the image frame' do
diff_note = create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position)
wait_for_requests
@@ -200,7 +198,6 @@ describe 'Merge request > User creates image diff notes', :js do
def create_image_diff_note
find('.js-add-image-diff-note-button', match: :first).click
- page.all('.js-add-image-diff-note-button')[0].click
find('.diff-content .note-textarea').native.send_keys('image diff test comment')
click_button 'Comment'
wait_for_requests
diff --git a/spec/features/projects/merge_requests/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb
index 38b4e4a6d1b..38b4e4a6d1b 100644
--- a/spec/features/projects/merge_requests/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_creates_mr_spec.rb b/spec/features/merge_request/user_creates_mr_spec.rb
index 1ac31de62cb..9d2a94a4a41 100644
--- a/spec/features/merge_request/user_creates_mr_spec.rb
+++ b/spec/features/merge_request/user_creates_mr_spec.rb
@@ -28,4 +28,29 @@ describe 'Merge request > User creates MR' do
it_behaves_like 'a creatable merge request'
end
end
+
+ context 'source project', :js do
+ let(:user) { create(:user) }
+ let(:target_project) { create(:project, :public, :repository) }
+ let(:source_project) { target_project }
+
+ before do
+ source_project.add_maintainer(user)
+
+ sign_in(user)
+ visit project_new_merge_request_path(
+ target_project,
+ merge_request: {
+ source_project_id: source_project.id,
+ target_project_id: target_project.id
+ })
+ end
+
+ it 'filters source project' do
+ find('.js-source-project').click
+ find('.dropdown-source-project input').set('source')
+
+ expect(find('.dropdown-source-project .dropdown-content')).not_to have_content(source_project.name)
+ end
+ end
end
diff --git a/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb b/spec/features/merge_request/user_edits_merge_request_spec.rb
index 7de0f9daac6..7de0f9daac6 100644
--- a/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb
+++ b/spec/features/merge_request/user_edits_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_edits_mr_spec.rb b/spec/features/merge_request/user_edits_mr_spec.rb
index 8c9e782aa76..3152707136c 100644
--- a/spec/features/merge_request/user_edits_mr_spec.rb
+++ b/spec/features/merge_request/user_edits_mr_spec.rb
@@ -1,11 +1,13 @@
require 'rails_helper'
describe 'Merge request > User edits MR' do
+ include ProjectForksHelper
+
it_behaves_like 'an editable merge request'
context 'for a forked project' do
it_behaves_like 'an editable merge request' do
- let(:source_project) { create(:project, :repository, forked_from_project: target_project) }
+ let(:source_project) { fork_project(target_project, nil, repository: true) }
end
end
end
diff --git a/spec/features/projects/merge_requests/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb
index 68a835e7f77..68a835e7f77 100644
--- a/spec/features/projects/merge_requests/user_manages_subscription_spec.rb
+++ b/spec/features/merge_request/user_manages_subscription_spec.rb
diff --git a/spec/features/projects/merge_requests/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb
index 6539e6e9208..6539e6e9208 100644
--- a/spec/features/projects/merge_requests/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index 77261f9375c..51b78d3e7d1 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -85,12 +85,13 @@ describe 'Merge request > User posts diff notes', :js do
# `.line_holder` will be an unfolded line.
let(:line_holder) { first('#a5cc2925ca8258af241be7e5b0381edf30266302 .line_holder') }
- it 'does not allow commenting on the left side' do
- should_not_allow_commenting(line_holder, 'left')
+ it 'allows commenting on the left side' do
+ should_allow_commenting(line_holder, 'left')
end
- it 'does not allow commenting on the right side' do
- should_not_allow_commenting(line_holder, 'right')
+ it 'allows commenting on the right side' do
+ # Automatically shifts comment box to left side.
+ should_allow_commenting(line_holder, 'right')
end
end
end
@@ -147,8 +148,8 @@ describe 'Merge request > User posts diff notes', :js do
# `.line_holder` will be an unfolded line.
let(:line_holder) { first('.line_holder[id="a5cc2925ca8258af241be7e5b0381edf30266302_1_1"]') }
- it 'does not allow commenting' do
- should_not_allow_commenting line_holder
+ it 'allows commenting' do
+ should_allow_commenting line_holder
end
end
@@ -186,11 +187,8 @@ describe 'Merge request > User posts diff notes', :js do
describe 'posting a note' do
it 'adds as discussion' do
- expect(page).to have_css('.js-temp-notes-holder', count: 2)
-
should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_22_22"]'), asset_form_reset: false)
expect(page).to have_css('.notes_holder .note.note-discussion', count: 1)
- expect(page).to have_css('.js-temp-notes-holder', count: 1)
expect(page).to have_button('Reply...')
end
end
@@ -203,23 +201,20 @@ describe 'Merge request > User posts diff notes', :js do
end
context 'with a new line' do
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- xit 'allows commenting' do
- should_allow_commenting(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]').find(:xpath, '..'))
+ it 'allows commenting' do
+ should_allow_commenting(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]'))
end
end
context 'with an old line' do
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- xit 'allows commenting' do
- should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_22_22"]').find(:xpath, '..'))
+ it 'allows commenting' do
+ should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_22_22"]'))
end
end
context 'with an unchanged line' do
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- xit 'allows commenting' do
- should_allow_commenting(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7"]').find(:xpath, '..'))
+ it 'allows commenting' do
+ should_allow_commenting(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7"]'))
end
end
@@ -267,7 +262,7 @@ describe 'Merge request > User posts diff notes', :js do
def assert_comment_persistence(line_holder, asset_form_reset:)
notes_holder_saved = line_holder.find(:xpath, notes_holder_input_xpath)
- expect(notes_holder_saved[:class]).not_to include(notes_holder_input_class)
+ expect(notes_holder_saved[:class]).not_to include('note-edit-form')
expect(notes_holder_saved).to have_content test_note_comment
assert_form_is_reset if asset_form_reset
@@ -281,6 +276,6 @@ describe 'Merge request > User posts diff notes', :js do
end
def assert_form_is_reset
- expect(page).to have_no_css('.js-temp-notes-holder')
+ expect(page).to have_no_css('.note-edit-form')
end
end
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index 260c5f9c28b..ee5f5377ca6 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -111,7 +111,7 @@ describe 'Merge request > User posts notes', :js do
it 'allows using markdown buttons after saving a note and then trying to edit it again' do
page.within('.current-note-edit-form') do
fill_in 'note[note]', with: 'This is the new content'
- find('.btn-save').click
+ find('.btn-success').click
end
find('.note').hover
@@ -129,7 +129,7 @@ describe 'Merge request > User posts notes', :js do
it 'appends the edited at time to the note' do
page.within('.current-note-edit-form') do
fill_in 'note[note]', with: 'Some new content'
- find('.btn-save').click
+ find('.btn-success').click
end
page.within("#note_#{note.id}") do
diff --git a/spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb b/spec/features/merge_request/user_rebases_merge_request_spec.rb
index 92e1c9942b1..92e1c9942b1 100644
--- a/spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb
+++ b/spec/features/merge_request/user_rebases_merge_request_spec.rb
diff --git a/spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb b/spec/features/merge_request/user_reopens_merge_request_spec.rb
index 745b4537e72..745b4537e72 100644
--- a/spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb
+++ b/spec/features/merge_request/user_reopens_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb
index 629052442b4..50c723776a3 100644
--- a/spec/features/merge_request/user_resolves_conflicts_spec.rb
+++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb
@@ -44,9 +44,7 @@ describe 'Merge request > User resolves conflicts', :js do
within find('.diff-file', text: 'files/ruby/regex.rb') do
expect(page).to have_selector('.line_content.new', text: "def username_regexp")
- expect(page).not_to have_selector('.line_content.new', text: "def username_regex")
expect(page).to have_selector('.line_content.new', text: "def project_name_regexp")
- expect(page).not_to have_selector('.line_content.new', text: "def project_name_regex")
expect(page).to have_selector('.line_content.new', text: "def path_regexp")
expect(page).to have_selector('.line_content.new', text: "def archive_formats_regexp")
expect(page).to have_selector('.line_content.new', text: "def git_reference_regexp")
@@ -110,12 +108,8 @@ describe 'Merge request > User resolves conflicts', :js do
click_link('conflicts', href: %r{/conflicts\Z})
end
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- # include_examples "conflicts are resolved in Interactive mode"
- # include_examples "conflicts are resolved in Edit inline mode"
-
- it 'prevents RSpec/EmptyExampleGroup' do
- end
+ include_examples "conflicts are resolved in Interactive mode"
+ include_examples "conflicts are resolved in Edit inline mode"
end
context 'in Parallel view mode' do
@@ -124,12 +118,8 @@ describe 'Merge request > User resolves conflicts', :js do
click_button 'Side-by-side'
end
- # TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
- # include_examples "conflicts are resolved in Interactive mode"
- # include_examples "conflicts are resolved in Edit inline mode"
-
- it 'prevents RSpec/EmptyExampleGroup' do
- end
+ include_examples "conflicts are resolved in Interactive mode"
+ include_examples "conflicts are resolved in Edit inline mode"
end
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index 2d268ecab58..8a16c011067 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -139,44 +139,64 @@ describe 'Merge request > User resolves diff notes and discussions', :js do
expect(find('.diffs .diff-file .notes_holder')).to be_visible
end
end
- end
- it 'allows user to resolve from reply form without a comment' do
- page.within '.diff-content' do
- click_button 'Reply...'
+ describe 'reply form' do
+ before do
+ click_button 'Toggle discussion'
- click_button 'Resolve discussion'
- end
+ page.within '.diff-content' do
+ click_button 'Reply...'
+ end
+ end
- page.within '.line-resolve-all-container' do
- expect(page).to have_content('1/1 discussion resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
- end
- end
+ it 'allows user to comment' do
+ page.within '.diff-content' do
+ find('.js-note-text').set 'testing'
- it 'allows user to unresolve from reply form without a comment' do
- page.within '.diff-content' do
- click_button 'Resolve discussion'
- sleep 1
+ click_button 'Comment'
- click_button 'Reply...'
+ wait_for_requests
+ end
- click_button 'Unresolve discussion'
- end
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('1/1 discussion resolved')
+ end
+ end
- page.within '.line-resolve-all-container' do
- expect(page).to have_content('0/1 discussion resolved')
- expect(page).not_to have_selector('.line-resolve-btn.is-active')
+ it 'allows user to unresolve from reply form without a comment' do
+ page.within '.diff-content' do
+ click_button 'Unresolve discussion'
+
+ wait_for_requests
+ end
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('0/1 discussion resolved')
+ expect(page).not_to have_selector('.line-resolve-btn.is-active')
+ end
+ end
+
+ it 'allows user to comment & unresolve discussion' do
+ page.within '.diff-content' do
+ find('.js-note-text').set 'testing'
+
+ click_button 'Comment & unresolve discussion'
+
+ wait_for_requests
+ end
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('0/1 discussion resolved')
+ end
+ end
end
end
- it 'allows user to comment & resolve discussion' do
+ it 'allows user to resolve from reply form without a comment' do
page.within '.diff-content' do
click_button 'Reply...'
- find('.js-note-text').set 'testing'
-
- click_button 'Comment & resolve discussion'
+ click_button 'Resolve discussion'
end
page.within '.line-resolve-all-container' do
@@ -185,19 +205,18 @@ describe 'Merge request > User resolves diff notes and discussions', :js do
end
end
- it 'allows user to comment & unresolve discussion' do
+ it 'allows user to comment & resolve discussion' do
page.within '.diff-content' do
- click_button 'Resolve discussion'
-
click_button 'Reply...'
find('.js-note-text').set 'testing'
- click_button 'Comment & unresolve discussion'
+ click_button 'Comment & resolve discussion'
end
page.within '.line-resolve-all-container' do
- expect(page).to have_content('0/1 discussion resolved')
+ expect(page).to have_content('1/1 discussion resolved')
+ expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
diff --git a/spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb b/spec/features/merge_request/user_reverts_merge_request_spec.rb
index 67b6aefb2d8..67b6aefb2d8 100644
--- a/spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index 428eb414274..b58c433bbfe 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -81,22 +81,25 @@ describe 'Merge request > User sees avatars on diff notes', :js do
visit diffs_project_merge_request_path(project, merge_request, view: view)
wait_for_requests
+
+ find('.js-toggle-tree-list').click
end
it 'shows note avatar' do
page.within find_line(position.line_code(project.repository)) do
find('.diff-notes-collapse').send_keys(:return)
- expect(page).to have_selector('img.js-diff-comment-avatar', count: 1)
+ expect(page).to have_selector('.js-diff-comment-avatar img', count: 1)
end
end
it 'shows comment on note avatar' do
page.within find_line(position.line_code(project.repository)) do
find('.diff-notes-collapse').send_keys(:return)
-
- expect(first('img.js-diff-comment-avatar')["data-original-title"]).to eq("#{note.author.name}: #{note.note.truncate(17)}")
+ first('.js-diff-comment-avatar img').hover
end
+
+ expect(page).to have_content "#{note.author.name}: #{note.note.truncate(17)}"
end
it 'toggles comments when clicking avatar' do
@@ -107,7 +110,7 @@ describe 'Merge request > User sees avatars on diff notes', :js do
expect(page).not_to have_selector('.notes_holder')
page.within find_line(position.line_code(project.repository)) do
- first('img.js-diff-comment-avatar').click
+ first('.js-diff-comment-avatar img').click
end
expect(page).to have_selector('.notes_holder')
@@ -123,7 +126,7 @@ describe 'Merge request > User sees avatars on diff notes', :js do
wait_for_requests
page.within find_line(position.line_code(project.repository)) do
- expect(page).not_to have_selector('img.js-diff-comment-avatar')
+ expect(page).not_to have_selector('.js-diff-comment-avatar img')
end
end
@@ -141,7 +144,7 @@ describe 'Merge request > User sees avatars on diff notes', :js do
page.within find_line(position.line_code(project.repository)) do
find('.diff-notes-collapse').send_keys(:return)
- expect(page).to have_selector('img.js-diff-comment-avatar', count: 2)
+ expect(page).to have_selector('.js-diff-comment-avatar img', count: 2)
end
end
@@ -160,7 +163,7 @@ describe 'Merge request > User sees avatars on diff notes', :js do
page.within find_line(position.line_code(project.repository)) do
find('.diff-notes-collapse').send_keys(:return)
- expect(page).to have_selector('img.js-diff-comment-avatar', count: 3)
+ expect(page).to have_selector('.js-diff-comment-avatar img', count: 3)
expect(find('.diff-comments-more-count')).to have_content '+1'
end
end
diff --git a/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb b/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb
new file mode 100644
index 00000000000..f17acb35a5a
--- /dev/null
+++ b/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb
@@ -0,0 +1,18 @@
+require 'rails_helper'
+
+describe 'New merge request breadcrumbs' do
+ let(:project) { create(:project, :repository) }
+ let(:user) { project.creator }
+
+ before do
+ sign_in(user)
+ visit project_new_merge_request_path(project)
+ end
+
+ it 'display a link to project merge requests and new merge request pages' do
+ page.within '.breadcrumbs' do
+ expect(find_link('Merge Requests')[:href]).to end_with(project_merge_requests_path(project))
+ expect(find_link('New')[:href]).to end_with(project_new_merge_request_path(project))
+ end
+ end
+end
diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
index f744d7941f5..74290c0fff9 100644
--- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
@@ -1,45 +1,88 @@
require 'rails_helper'
describe 'Merge request > User sees deployment widget', :js do
- describe 'when deployed to an environment' do
+ describe 'when merge request has associated environments' do
let(:user) { create(:user) }
- let(:project) { merge_request.target_project }
- let(:merge_request) { create(:merge_request, :merged) }
+ let(:project) { create(:project, :repository) }
+ let(:merge_request) { create(:merge_request, :merged, source_project: project) }
let(:environment) { create(:environment, project: project) }
let(:role) { :developer }
- let(:sha) { project.commit('master').id }
- let!(:deployment) { create(:deployment, environment: environment, sha: sha) }
+ let(:ref) { merge_request.target_branch }
+ let(:sha) { project.commit(ref).id }
+ let(:pipeline) { create(:ci_pipeline_without_jobs, sha: sha, project: project, ref: ref) }
let!(:manual) { }
before do
+ merge_request.update!(merge_commit_sha: sha)
project.add_user(user, role)
sign_in(user)
- visit project_merge_request_path(project, merge_request)
- wait_for_requests
end
- it 'displays that the environment is deployed' do
- wait_for_requests
+ context 'when deployment succeeded' do
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) }
- expect(page).to have_content("Deployed to #{environment.name}")
- expect(find('.js-deploy-time')['data-original-title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium))
+ it 'displays that the environment is deployed' do
+ visit project_merge_request_path(project, merge_request)
+ wait_for_requests
+
+ expect(page).to have_content("Deployed to #{environment.name}")
+ expect(find('.js-deploy-time')['data-original-title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium))
+ end
+ end
+
+ context 'when deployment failed' do
+ let(:build) { create(:ci_build, :failed, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, :failed, environment: environment, sha: sha, ref: ref, deployable: build) }
+
+ it 'displays that the deployment failed' do
+ visit project_merge_request_path(project, merge_request)
+ wait_for_requests
+
+ expect(page).to have_content("Failed to deploy to #{environment.name}")
+ expect(page).not_to have_css('.js-deploy-time')
+ end
+ end
+
+ context 'when deployment running' do
+ let(:build) { create(:ci_build, :running, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, :running, environment: environment, sha: sha, ref: ref, deployable: build) }
+
+ it 'displays that the running deployment' do
+ visit project_merge_request_path(project, merge_request)
+ wait_for_requests
+
+ expect(page).to have_content("Deploying to #{environment.name}")
+ expect(page).not_to have_css('.js-deploy-time')
+ end
+ end
+
+ context 'when deployment will happen' do
+ let(:build) { create(:ci_build, :created, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, environment: environment, sha: sha, ref: ref, deployable: build) }
+
+ it 'displays that the environment name' do
+ visit project_merge_request_path(project, merge_request)
+ wait_for_requests
+
+ expect(page).to have_content("Deploying to #{environment.name}")
+ expect(page).not_to have_css('.js-deploy-time')
+ end
end
context 'with stop action' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:build) { create(:ci_build, pipeline: pipeline) }
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+ let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) }
let(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') }
- let(:deployment) do
- create(:deployment, environment: environment, ref: merge_request.target_branch,
- sha: sha, deployable: build, on_stop: 'close_app')
- end
before do
+ deployment.update!(on_stop: manual.name)
+ visit project_merge_request_path(project, merge_request)
wait_for_requests
end
it 'does start build when stop button clicked' do
- accept_confirm { click_button('Stop environment') }
+ accept_confirm { find('.js-stop-env').click }
expect(page).to have_content('close_app')
end
@@ -48,7 +91,7 @@ describe 'Merge request > User sees deployment widget', :js do
let(:role) { :reporter }
it 'does not show stop button' do
- expect(page).not_to have_button('Stop environment')
+ expect(page).not_to have_selector('.js-stop-env')
end
end
end
diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb
index d6e7ff33d5d..0df9e4bbc1a 100644
--- a/spec/features/merge_request/user_sees_diff_spec.rb
+++ b/spec/features/merge_request/user_sees_diff_spec.rb
@@ -2,6 +2,7 @@ require 'rails_helper'
describe 'Merge request > User sees diff', :js do
include ProjectForksHelper
+ include RepoHelpers
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -81,5 +82,59 @@ describe 'Merge request > User sees diff', :js do
expect(page).to have_selector('.js-cancel-fork-suggestion-button', count: 1)
end
end
+
+ context 'when file contains html' do
+ let(:current_user) { project.owner }
+ let(:branch_name) {"test_branch"}
+
+ def create_file(branch_name, file_name, content)
+ Files::CreateService.new(
+ project,
+ current_user,
+ start_branch: branch_name,
+ branch_name: branch_name,
+ commit_message: "Create file",
+ file_path: file_name,
+ file_content: content
+ ).execute
+
+ project.commit(branch_name)
+ end
+
+ it 'escapes any HTML special characters in the diff chunk header' do
+ file_content =
+ <<~CONTENT
+ function foo<input> {
+ let a = 1;
+ let b = 2;
+ let c = 3;
+ let d = 3;
+ }
+ CONTENT
+
+ new_file_content =
+ <<~CONTENT
+ function foo<input> {
+ let a = 1;
+ let b = 2;
+ let c = 3;
+ let x = 3;
+ }
+ CONTENT
+
+ file_name = 'xss_file.rs'
+
+ create_file('master', file_name, file_content)
+ merge_request = create(:merge_request, source_project: project)
+ create_file(merge_request.source_branch, file_name, new_file_content)
+
+ project.commit(merge_request.source_branch)
+
+ visit diffs_project_merge_request_path(project, merge_request)
+
+ expect(page).to have_text("function foo<input> {")
+ expect(page).to have_css(".line[lang='rust'] .k")
+ end
+ end
end
end
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index b285cd7a7ac..582be101399 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -40,21 +40,27 @@ describe 'Merge request > User sees merge widget', :js do
context 'view merge request' do
let!(:environment) { create(:environment, project: project) }
+ let(:sha) { project.commit(merge_request.source_branch).sha }
+ let(:pipeline) { create(:ci_pipeline_without_jobs, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) }
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
let!(:deployment) do
- create(:deployment, environment: environment,
- ref: 'feature',
- sha: merge_request.diff_head_sha)
+ create(:deployment, :succeed,
+ environment: environment,
+ ref: merge_request.source_branch,
+ deployable: build,
+ sha: sha)
end
before do
+ merge_request.update!(head_pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
end
it 'shows environments link' do
wait_for_requests
- page.within('.mr-widget-heading') do
+ page.within('.js-pre-merge-deploy') do
expect(page).to have_content("Deployed to #{environment.name}")
expect(find('.js-deploy-url')[:href]).to include(environment.formatted_external_url)
end
@@ -160,7 +166,7 @@ describe 'Merge request > User sees merge widget', :js do
end
end
- context 'view merge request where project has CI setup but no CI status' do
+ context 'view merge request where project has CI set up but no CI status' do
before do
pipeline = create(:ci_pipeline, project: project,
sha: merge_request.diff_head_sha,
@@ -174,11 +180,11 @@ describe 'Merge request > User sees merge widget', :js do
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
- expect(page).to have_text('Could not connect to the CI server. Please check your settings and try again')
+ expect(page).to have_text("Could not retrieve the pipeline status. For troubleshooting steps, read the documentation.")
end
end
- context 'view merge request in project with only-mwps setting enabled but no CI is setup' do
+ context 'view merge request in project with only-mwps setting enabled but no CI is set up' do
before do
visit project_merge_request_path(project_only_mwps, merge_request_in_only_mwps_project)
end
@@ -423,7 +429,7 @@ describe 'Merge request > User sees merge widget', :js do
end
it 'shows test reports summary which includes the new failure' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
expect(page).to have_content('Test summary contained 1 failed test result out of 2 total tests')
@@ -438,7 +444,7 @@ describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the new failure' do
it 'shows the test report detail' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
within(".js-report-section-container") do
@@ -468,7 +474,7 @@ describe 'Merge request > User sees merge widget', :js do
end
it 'shows test reports summary which includes the existing failure' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
expect(page).to have_content('Test summary contained 1 failed test result out of 2 total tests')
@@ -483,7 +489,7 @@ describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the existing failure' do
it 'shows test report detail of it' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
within(".js-report-section-container") do
@@ -519,7 +525,7 @@ describe 'Merge request > User sees merge widget', :js do
end
it 'shows test reports summary which includes the resolved failure' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
expect(page).to have_content('Test summary contained 1 fixed test result out of 2 total tests')
@@ -533,7 +539,7 @@ describe 'Merge request > User sees merge widget', :js do
context 'when user clicks the resolved failure' do
it 'shows test report detail of it' do
- within(".mr-section-container") do
+ within(".js-reports-container") do
click_button 'Expand'
within(".js-report-section-container") do
diff --git a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
index 029b66b5e8e..fc4a188d4a7 100644
--- a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
@@ -1,18 +1,20 @@
require 'rails_helper'
describe 'Merge request > User sees MR from deleted forked project', :js do
+ include ProjectForksHelper
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
- let(:fork_project) { create(:project, :public, :repository, forked_from_project: project) }
+ let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: fork_project,
+ create(:merge_request_with_diffs, source_project: forked_project,
target_project: project,
description: 'Test merge request')
end
before do
MergeRequests::MergeService.new(project, user).execute(merge_request)
- fork_project.destroy!
+ forked_project.destroy!
sign_in(user)
visit project_merge_request_path(project, merge_request)
end
diff --git a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
index c1608be402a..fd4175d5227 100644
--- a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
@@ -28,7 +28,7 @@ describe 'Merge request > User sees MR with deleted source branch', :js do
click_on 'Changes'
wait_for_requests
- expect(page).to have_selector('.diffs.tab-pane .nothing-here-block')
+ expect(page).to have_selector('.diffs.tab-pane .file-holder')
expect(page).to have_content('Source branch does not exist.')
end
end
diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
index d4ad0b0a377..a6118453540 100644
--- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
@@ -1,18 +1,20 @@
require 'rails_helper'
describe 'Merge request > User sees notes from forked project', :js do
+ include ProjectForksHelper
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
- let(:fork_project) { create(:project, :public, :repository, forked_from_project: project) }
+ let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: fork_project,
+ create(:merge_request_with_diffs, source_project: forked_project,
target_project: project,
description: 'Test merge request')
end
before do
create(:note_on_commit, note: 'A commit comment',
- project: fork_project,
+ project: forked_project,
commit_id: merge_request.commit_shas.first)
sign_in(user)
end
diff --git a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
index d30dcefc6aa..97093bbc2f6 100644
--- a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
@@ -1,17 +1,19 @@
require 'rails_helper'
describe 'Merge request > User sees pipelines from forked project', :js do
+ include ProjectForksHelper
+
let(:target_project) { create(:project, :public, :repository) }
let(:user) { target_project.creator }
- let(:fork_project) { create(:project, :repository, forked_from_project: target_project) }
+ let(:forked_project) { fork_project(target_project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: fork_project,
+ create(:merge_request_with_diffs, source_project: forked_project,
target_project: target_project,
description: 'Test merge request')
end
let(:pipeline) do
create(:ci_pipeline,
- project: fork_project,
+ project: forked_project,
sha: merge_request.diff_head_sha,
ref: merge_request.source_branch)
end
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index 45cccbee63e..8faddee4daa 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -41,8 +41,7 @@ describe 'Merge request > User sees pipelines', :js do
visit project_merge_request_path(project, merge_request)
wait_for_requests
- expect(page.find('.ci-widget')).to have_content(
- 'Could not connect to the CI server. Please check your settings and try again')
+ expect(page.find('.ci-widget')).to have_text("Could not retrieve the pipeline status. For troubleshooting steps, read the documentation.")
end
end
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index f42b4dcbb47..92db4f44098 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -110,7 +110,8 @@ describe 'Merge request > User sees versions', :js do
diff_id: merge_request_diff3.id,
start_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
)
- expect(page).to have_content '4 changed files with 15 additions and 6 deletions'
+ expect(page).to have_content '4 changed files'
+ expect(page).to have_content '15 additions 6 deletions'
expect(page).to have_content 'Not all comments are displayed'
position = Gitlab::Diff::Position.new(
@@ -131,7 +132,8 @@ describe 'Merge request > User sees versions', :js do
end
it 'show diff between new and old version' do
- expect(page).to have_content '4 changed files with 15 additions and 6 deletions'
+ expect(page).to have_content '4 changed files'
+ expect(page).to have_content '15 additions 6 deletions'
end
it 'returns to latest version when "Show latest version" button is clicked' do
@@ -158,7 +160,7 @@ describe 'Merge request > User sees versions', :js do
it 'has 0 chages between versions' do
page.within '.mr-version-compare-dropdown' do
- expect(find('.dropdown-toggle')).to have_content 'version 1'
+ expect(find('.dropdown-menu-toggle')).to have_content 'version 1'
end
page.within '.mr-version-dropdown' do
@@ -179,7 +181,7 @@ describe 'Merge request > User sees versions', :js do
it 'sets the compared versions to be the same' do
page.within '.mr-version-compare-dropdown' do
- expect(find('.dropdown-toggle')).to have_content 'version 2'
+ expect(find('.dropdown-menu-toggle')).to have_content 'version 2'
end
page.within '.mr-version-dropdown' do
diff --git a/spec/features/merge_request/user_uses_slash_commands_spec.rb b/spec/features/merge_request/user_uses_quick_actions_spec.rb
index b81478a481f..b81478a481f 100644
--- a/spec/features/merge_request/user_uses_slash_commands_spec.rb
+++ b/spec/features/merge_request/user_uses_quick_actions_spec.rb
diff --git a/spec/features/projects/merge_requests/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb
index b1bfe9e5de3..7f95a1282f9 100644
--- a/spec/features/projects/merge_requests/user_views_diffs_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_spec.rb
@@ -10,6 +10,8 @@ describe 'User views diffs', :js do
visit(diffs_project_merge_request_path(project, merge_request))
wait_for_requests
+
+ find('.js-toggle-tree-list').click
end
shared_examples 'unfold diffs' do
diff --git a/spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb b/spec/features/merge_request/user_views_open_merge_request_spec.rb
index 6ac495aa03d..71022c6bb08 100644
--- a/spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_open_merge_request_spec.rb
@@ -41,7 +41,7 @@ describe 'User views an open merge request' do
find('.gfm-form').fill_in(:merge_request_description, with: '')
page.within('.gfm-form') do
- click_link('Preview')
+ click_button('Preview')
expect(find('.js-md-preview')).to have_content('Nothing to preview.')
end
@@ -51,12 +51,12 @@ describe 'User views an open merge request' do
find('.gfm-form').fill_in(:merge_request_description, with: ':+1: Nice')
page.within('.gfm-form') do
- click_link('Preview')
+ click_button('Preview')
expect(find('.js-md-preview')).to have_css('gl-emoji')
end
- expect(find('.gfm-form')).to have_css('.js-md-preview').and have_link('Write')
+ expect(find('.gfm-form')).to have_css('.js-md-preview').and have_button('Write')
expect(find('#merge_request_description', visible: false)).not_to be_visible
end
end
diff --git a/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
index 78d9c6c6db1..78d9c6c6db1 100644
--- a/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
diff --git a/spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
index e401933aed2..e163868e8e7 100644
--- a/spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
@@ -1,15 +1,18 @@
require 'spec_helper'
describe 'User sorts merge requests' do
+ include CookieHelper
+
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let!(:merge_request2) do
create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
end
- let(:project) { create(:project, :public, :repository) }
- let(:user) { create(:user) }
+ set(:user) { create(:user) }
+ set(:group) { create(:group) }
+ set(:group_member) { create(:group_member, :maintainer, user: user, group: group) }
+ set(:project) { create(:project, :public, group: group) }
before do
- project.add_maintainer(user)
sign_in(user)
visit(project_merge_requests_path(project))
@@ -19,16 +22,42 @@ describe 'User sorts merge requests' do
find('button.dropdown-toggle').click
page.within('.content ul.dropdown-menu.dropdown-menu-right li') do
- click_link('Last updated')
+ click_link('Milestone')
end
- visit(merge_requests_dashboard_path(assignee_id: user.id))
+ visit(merge_requests_dashboard_path(assignee_username: user.username))
- expect(find('.issues-filters')).to have_content('Last updated')
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
visit(project_merge_requests_path(project))
- expect(find('.issues-filters')).to have_content('Last updated')
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+
+ visit(merge_requests_group_path(group))
+
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ end
+
+ it 'fallbacks to issuable_sort cookie key when remembering the sorting option' do
+ set_cookie('issuable_sort', 'milestone')
+
+ visit(merge_requests_dashboard_path(assignee_username: user.username))
+
+ expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ end
+
+ it 'separates remember sorting with issues' do
+ create(:issue, project: project)
+
+ find('button.dropdown-toggle').click
+
+ page.within('.content ul.dropdown-menu.dropdown-menu-right li') do
+ click_link('Milestone')
+ end
+
+ visit(project_issues_path(project))
+
+ expect(find('.issues-filters a.is-active')).not_to have_content('Milestone')
end
context 'when merge requests have awards' do
diff --git a/spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb
index 6c695bd7aa9..6c695bd7aa9 100644
--- a/spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb
diff --git a/spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb
index 853809fe87a..853809fe87a 100644
--- a/spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb
diff --git a/spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb
index eb012694f1e..eb012694f1e 100644
--- a/spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb
diff --git a/spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
index 115e548b691..115e548b691 100644
--- a/spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
diff --git a/spec/features/milestones/user_creates_milestone_spec.rb b/spec/features/milestones/user_creates_milestone_spec.rb
index 8fd057d587c..5de0c381cdf 100644
--- a/spec/features/milestones/user_creates_milestone_spec.rb
+++ b/spec/features/milestones/user_creates_milestone_spec.rb
@@ -24,6 +24,6 @@ describe "User creates milestone", :js do
visit(activity_project_path(project))
- expect(page).to have_content("#{user.name} opened milestone")
+ expect(page).to have_content("#{user.name} #{user.to_reference} opened milestone")
end
end
diff --git a/spec/features/milestones/user_deletes_milestone_spec.rb b/spec/features/milestones/user_deletes_milestone_spec.rb
index 9d4a68239d3..f68ed1cde07 100644
--- a/spec/features/milestones/user_deletes_milestone_spec.rb
+++ b/spec/features/milestones/user_deletes_milestone_spec.rb
@@ -1,26 +1,46 @@
require "rails_helper"
describe "User deletes milestone", :js do
- set(:user) { create(:user) }
- set(:project) { create(:project) }
- set(:milestone) { create(:milestone, project: project) }
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:project) { create(:project, namespace: group) }
before do
- project.add_developer(user)
sign_in(user)
+ end
+
+ context "when milestone belongs to project" do
+ let!(:milestone) { create(:milestone, parent: project, title: "project milestone") }
+
+ it "deletes milestone" do
+ project.add_developer(user)
+ visit(project_milestones_path(project))
+ click_link(milestone.title)
+ click_button("Delete")
+ click_button("Delete milestone")
+
+ expect(page).to have_content("No milestones to show")
+
+ visit(activity_project_path(project))
- visit(project_milestones_path(project))
+ expect(page).to have_content("#{user.name} #{user.to_reference} destroyed milestone")
+ end
end
- it "deletes milestone" do
- click_link(milestone.title)
- click_button("Delete")
- click_button("Delete milestone")
+ context "when milestone belongs to group" do
+ let!(:milestone_to_be_deleted) { create(:milestone, parent: group, title: "group milestone 1") }
+ let!(:milestone) { create(:milestone, parent: group, title: "group milestone 2") }
- expect(page).to have_content("No milestones to show")
+ it "deletes milestone" do
+ group.add_developer(user)
+ visit(group_milestones_path(group))
- visit(activity_project_path(project))
+ click_link(milestone_to_be_deleted.title)
+ click_button("Delete")
+ click_button("Delete milestone")
- expect(page).to have_content("#{user.name} destroyed milestone")
+ expect(page).to have_content(milestone.title)
+ expect(page).not_to have_content(milestone_to_be_deleted)
+ end
end
end
diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/profiles/personal_access_tokens_spec.rb
index 8461cd0027c..dee213a11d4 100644
--- a/spec/features/profiles/personal_access_tokens_spec.rb
+++ b/spec/features/profiles/personal_access_tokens_spec.rb
@@ -43,10 +43,12 @@ describe 'Profile > Personal Access Tokens', :js do
check "read_user"
click_on "Create personal access token"
+
expect(active_personal_access_tokens).to have_text(name)
expect(active_personal_access_tokens).to have_text('In')
expect(active_personal_access_tokens).to have_text('api')
expect(active_personal_access_tokens).to have_text('read_user')
+ expect(created_personal_access_token).not_to be_empty
end
context "when creation fails" do
@@ -57,6 +59,7 @@ describe 'Profile > Personal Access Tokens', :js do
expect { click_on "Create personal access token" }.not_to change { PersonalAccessToken.count }
expect(page).to have_content("Name cannot be nil")
+ expect(page).not_to have_selector("#created-personal-access-token")
end
end
end
diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb
index 9e60b4995bd..5e0434c1c2c 100644
--- a/spec/features/profiles/user_edit_profile_spec.rb
+++ b/spec/features/profiles/user_edit_profile_spec.rb
@@ -61,74 +61,232 @@ describe 'User edit profile' do
end
context 'user status', :js do
- def select_emoji(emoji_name)
+ def select_emoji(emoji_name, is_modal = false)
+ emoji_menu_class = is_modal ? '.js-modal-status-emoji-menu' : '.js-status-emoji-menu'
toggle_button = find('.js-toggle-emoji-menu')
toggle_button.click
- emoji_button = find(%Q{.js-status-emoji-menu .js-emoji-btn gl-emoji[data-name="#{emoji_name}"]})
+ emoji_button = find(%Q{#{emoji_menu_class} .js-emoji-btn gl-emoji[data-name="#{emoji_name}"]})
emoji_button.click
end
- it 'shows the user status form' do
- visit(profile_path)
+ context 'profile edit form' do
+ it 'shows the user status form' do
+ visit(profile_path)
- expect(page).to have_content('Current status')
- end
+ expect(page).to have_content('Current status')
+ end
- it 'adds emoji to user status' do
- emoji = 'biohazard'
- visit(profile_path)
- select_emoji(emoji)
- submit_settings
+ it 'adds emoji to user status' do
+ emoji = 'biohazard'
+ visit(profile_path)
+ select_emoji(emoji)
+ submit_settings
- visit user_path(user)
- within('.cover-status') do
- expect(page).to have_emoji(emoji)
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(emoji)
+ end
end
- end
- it 'adds message to user status' do
- message = 'I have something to say'
- visit(profile_path)
- fill_in 'js-status-message-field', with: message
- submit_settings
+ it 'adds message to user status' do
+ message = 'I have something to say'
+ visit(profile_path)
+ fill_in 'js-status-message-field', with: message
+ submit_settings
- visit user_path(user)
- within('.cover-status') do
- expect(page).to have_emoji('speech_balloon')
- expect(page).to have_content message
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji('speech_balloon')
+ expect(page).to have_content message
+ end
end
- end
- it 'adds message and emoji to user status' do
- emoji = 'tanabata_tree'
- message = 'Playing outside'
- visit(profile_path)
- select_emoji(emoji)
- fill_in 'js-status-message-field', with: message
- submit_settings
+ it 'adds message and emoji to user status' do
+ emoji = 'tanabata_tree'
+ message = 'Playing outside'
+ visit(profile_path)
+ select_emoji(emoji)
+ fill_in 'js-status-message-field', with: message
+ submit_settings
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(emoji)
+ expect(page).to have_content message
+ end
+ end
+
+ it 'clears the user status' do
+ user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread')
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(user_status.emoji)
+ expect(page).to have_content user_status.message
+ end
+
+ visit(profile_path)
+ click_button 'js-clear-user-status-button'
+ submit_settings
+
+ wait_for_requests
+
+ visit user_path(user)
+ expect(page).not_to have_selector '.cover-status'
+ end
+
+ it 'displays a default emoji if only message is entered' do
+ message = 'a status without emoji'
+ visit(profile_path)
+ fill_in 'js-status-message-field', with: message
- visit user_path(user)
- within('.cover-status') do
- expect(page).to have_emoji(emoji)
- expect(page).to have_content message
+ within('.js-toggle-emoji-menu') do
+ expect(page).to have_emoji('speech_balloon')
+ end
end
end
- it 'clears the user status' do
- user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread')
+ context 'user menu' do
+ def open_user_status_modal
+ find('.header-user-dropdown-toggle').click
- visit user_path(user)
- within('.cover-status') do
- expect(page).to have_emoji(user_status.emoji)
- expect(page).to have_content user_status.message
+ page.within ".header-user" do
+ click_button 'Set status'
+ end
end
- visit(profile_path)
- click_button 'js-clear-user-status-button'
- submit_settings
+ def set_user_status_in_modal
+ page.within "#set-user-status-modal" do
+ click_button 'Set status'
+ end
+ end
+
+ before do
+ visit root_path(user)
+ end
+
+ it 'shows the "Set status" menu item in the user menu' do
+ find('.header-user-dropdown-toggle').click
+
+ page.within ".header-user" do
+ expect(page).to have_content('Set status')
+ end
+ end
+
+ it 'shows the "Edit status" menu item in the user menu' do
+ user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread')
+ visit root_path(user)
+
+ find('.header-user-dropdown-toggle').click
+
+ page.within ".header-user" do
+ expect(page).to have_emoji(user_status.emoji)
+ expect(page).to have_content user_status.message
+ expect(page).to have_content('Edit status')
+ end
+ end
+
+ it 'shows user status modal' do
+ open_user_status_modal
- visit user_path(user)
- expect(page).not_to have_selector '.cover-status'
+ expect(page.find('#set-user-status-modal')).to be_visible
+ expect(page).to have_content('Set a status')
+ end
+
+ it 'adds emoji to user status' do
+ emoji = 'biohazard'
+ open_user_status_modal
+ select_emoji(emoji, true)
+ set_user_status_in_modal
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(emoji)
+ end
+ end
+
+ it 'adds message to user status' do
+ message = 'I have something to say'
+ open_user_status_modal
+ find('.js-status-message-field').native.send_keys(message)
+ set_user_status_in_modal
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji('speech_balloon')
+ expect(page).to have_content message
+ end
+ end
+
+ it 'adds message and emoji to user status' do
+ emoji = 'tanabata_tree'
+ message = 'Playing outside'
+ open_user_status_modal
+ select_emoji(emoji, true)
+ find('.js-status-message-field').native.send_keys(message)
+ set_user_status_in_modal
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(emoji)
+ expect(page).to have_content message
+ end
+ end
+
+ it 'clears the user status with the "X" button' do
+ user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread')
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(user_status.emoji)
+ expect(page).to have_content user_status.message
+ end
+
+ find('.header-user-dropdown-toggle').click
+
+ page.within ".header-user" do
+ click_button 'Edit status'
+ end
+
+ find('.js-clear-user-status-button').click
+ set_user_status_in_modal
+
+ visit user_path(user)
+ expect(page).not_to have_selector '.cover-status'
+ end
+
+ it 'clears the user status with the "Remove status" button' do
+ user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread')
+
+ visit user_path(user)
+ within('.cover-status') do
+ expect(page).to have_emoji(user_status.emoji)
+ expect(page).to have_content user_status.message
+ end
+
+ find('.header-user-dropdown-toggle').click
+
+ page.within ".header-user" do
+ click_button 'Edit status'
+ end
+
+ page.within "#set-user-status-modal" do
+ click_button 'Remove status'
+ end
+
+ visit user_path(user)
+ expect(page).not_to have_selector '.cover-status'
+ end
+
+ it 'displays a default emoji if only message is entered' do
+ message = 'a status without emoji'
+ open_user_status_modal
+ find('.js-status-message-field').native.send_keys(message)
+
+ within('.js-toggle-emoji-menu') do
+ expect(page).to have_emoji('speech_balloon')
+ end
+ end
end
end
end
diff --git a/spec/features/profiles/user_manages_applications_spec.rb b/spec/features/profiles/user_manages_applications_spec.rb
index 387584fef62..34aaab240cc 100644
--- a/spec/features/profiles/user_manages_applications_spec.rb
+++ b/spec/features/profiles/user_manages_applications_spec.rb
@@ -16,7 +16,7 @@ describe 'User manages applications' do
click_on 'Save application'
expect(page).to have_content 'Application: test'
- expect(page).to have_content 'Application Id'
+ expect(page).to have_content 'Application ID'
expect(page).to have_content 'Secret'
click_on 'Edit'
@@ -26,7 +26,7 @@ describe 'User manages applications' do
click_on 'Save application'
expect(page).to have_content 'test_changed'
- expect(page).to have_content 'Application Id'
+ expect(page).to have_content 'Application ID'
expect(page).to have_content 'Secret'
visit applications_profile_path
diff --git a/spec/features/projects/activity/user_sees_activity_spec.rb b/spec/features/projects/activity/user_sees_activity_spec.rb
index e0248911b5f..bb4b2abc3c7 100644
--- a/spec/features/projects/activity/user_sees_activity_spec.rb
+++ b/spec/features/projects/activity/user_sees_activity_spec.rb
@@ -3,8 +3,10 @@ require 'spec_helper'
describe 'Projects > Activity > User sees activity' do
let(:project) { create(:project, :repository, :public) }
let(:user) { project.creator }
+ let(:issue) { create(:issue, project: project) }
before do
+ create(:event, :created, project: project, target: issue, author: user)
event = create(:push_event, project: project, author: user)
create(:push_event_payload,
event: event,
@@ -12,10 +14,18 @@ describe 'Projects > Activity > User sees activity' do
commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
ref: 'fix',
commit_count: 1)
- visit activity_project_path(project)
end
it 'shows the last push in the activity page', :js do
- expect(page).to have_content "#{user.name} pushed new branch fix"
+ visit activity_project_path(project)
+
+ expect(page).to have_content "#{user.name} #{user.to_reference} pushed new branch fix"
+ end
+
+ it 'allows to filter event with the "event_filter=issue" URL param', :js do
+ visit activity_project_path(project, event_filter: 'issue')
+
+ expect(page).not_to have_content "#{user.name} #{user.to_reference} pushed new branch fix"
+ expect(page).to have_content "#{user.name} #{user.to_reference} opened issue #{issue.to_reference}"
end
end
diff --git a/spec/features/projects/activity/user_sees_private_activity_spec.rb b/spec/features/projects/activity/user_sees_private_activity_spec.rb
new file mode 100644
index 00000000000..61ec2ce9d29
--- /dev/null
+++ b/spec/features/projects/activity/user_sees_private_activity_spec.rb
@@ -0,0 +1,35 @@
+require 'spec_helper'
+
+describe 'Project > Activity > User sees private activity', :js do
+ let(:project) { create(:project, :public) }
+ let(:author) { create(:user) }
+ let(:user) { create(:user) }
+ let(:issue) { create(:issue, :confidential, project: project, author: author) }
+ let(:message) { "#{author.name} #{author.to_reference} opened issue #{issue.to_reference}" }
+
+ before do
+ project.add_developer(author)
+
+ create(:event, :created, project: project, target: issue, author: author)
+ end
+
+ it 'shows the activity to a logged-in user with permissions' do
+ sign_in(author)
+ visit activity_project_path(project)
+
+ expect(page).to have_content(message)
+ end
+
+ it 'hides the activity from a logged-in user without permissions' do
+ sign_in(user)
+ visit activity_project_path(project)
+
+ expect(page).not_to have_content(message)
+ end
+
+ it 'hides the activity from an anonymous user' do
+ visit activity_project_path(project)
+
+ expect(page).not_to have_content(message)
+ end
+end
diff --git a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
index 67ed2f18d76..554f0b49052 100644
--- a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
+++ b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
@@ -20,23 +20,13 @@ describe "User downloads artifacts" do
end
context "via job id" do
- set(:url) { download_project_job_artifacts_path(project, job) }
+ let(:url) { download_project_job_artifacts_path(project, job) }
it_behaves_like "downloading"
end
context "via branch name and job name" do
- set(:url) { latest_succeeded_project_artifacts_path(project, "#{pipeline.ref}/download", job: job.name) }
-
- it_behaves_like "downloading"
- end
-
- context "via clicking the `Download` button" do
- set(:url) { project_job_path(project, job) }
-
- before do
- click_link("Download")
- end
+ let(:url) { latest_succeeded_project_artifacts_path(project, "#{pipeline.ref}/download", job: job.name) }
it_behaves_like "downloading"
end
diff --git a/spec/features/projects/awards/user_interacts_with_awards_in_issue_spec.rb b/spec/features/projects/awards/user_interacts_with_awards_in_issue_spec.rb
deleted file mode 100644
index 4d860893abe..00000000000
--- a/spec/features/projects/awards/user_interacts_with_awards_in_issue_spec.rb
+++ /dev/null
@@ -1,172 +0,0 @@
-require 'spec_helper'
-
-describe 'User interacts with awards in an issue', :js do
- let(:issue) { create(:issue, project: project)}
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
-
- visit(project_issue_path(project, issue))
- end
-
- it 'toggles the thumbsup award emoji' do
- page.within('.awards') do
- thumbsup = page.first('.award-control')
- thumbsup.click
- thumbsup.hover
-
- expect(page).to have_selector('.js-emoji-btn')
- expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
- expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
-
- thumbsup = page.first('.award-control')
- thumbsup.click
- thumbsup.hover
-
- expect(page).to have_selector('.award-control.js-emoji-btn')
- expect(page.all('.award-control.js-emoji-btn').size).to eq(2)
-
- page.all('.award-control.js-emoji-btn').each do |element|
- expect(element['title']).to eq('')
- end
-
- page.all('.award-control .js-counter').each do |element|
- expect(element).to have_content('0')
- end
-
- thumbsup = page.first('.award-control')
- thumbsup.click
- thumbsup.hover
-
- expect(page).to have_selector('.js-emoji-btn')
- expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
- expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
- end
- end
-
- it 'toggles a custom award emoji' do
- page.within('.awards') do
- page.find('.js-add-award').click
- end
-
- page.find('.emoji-menu.is-visible')
-
- expect(page).to have_selector('.js-emoji-menu-search')
- expect(page.evaluate_script("document.activeElement.classList.contains('js-emoji-menu-search')")).to eq(true)
-
- page.within('.emoji-menu-content') do
- emoji_button = page.first('.js-emoji-btn')
- emoji_button.hover
- emoji_button.click
- end
-
- page.within('.awards') do
- expect(page).to have_selector('.js-emoji-btn')
- expect(page.find('.js-emoji-btn.active .js-counter')).to have_content('1')
- expect(page).to have_css(".js-emoji-btn.active[data-original-title='You']")
-
- expect do
- page.find('.js-emoji-btn.active').click
- wait_for_requests
- end.to change { page.all('.award-control.js-emoji-btn').size }.from(3).to(2)
- end
- end
-
- it 'shows the list of award emoji categories' do
- page.within('.awards') do
- page.find('.js-add-award').click
- end
-
- page.find('.emoji-menu.is-visible')
-
- expect(page).to have_selector('.js-emoji-menu-search')
- expect(page.evaluate_script("document.activeElement.classList.contains('js-emoji-menu-search')")).to eq(true)
-
- fill_in('emoji-menu-search', with: 'hand')
-
- page.within('.emoji-menu-content') do
- expect(page).to have_selector('[data-name="raised_hand"]')
- end
- end
-
- it 'adds an award emoji by a comment' do
- page.within('.js-main-target-form') do
- fill_in('note[note]', with: ':smile:')
-
- click_button('Comment')
- end
-
- expect(page).to have_emoji('smile')
- end
-
- context 'when a project is archived' do
- let(:project) { create(:project, :archived) }
-
- it 'hides the add award button' do
- page.within('.awards') do
- expect(page).not_to have_css('.js-add-award')
- end
- end
- end
-
- context 'awards on a note' do
- let!(:note) { create(:note, noteable: issue, project: issue.project) }
- let!(:award_emoji) { create(:award_emoji, awardable: note, name: '100') }
-
- it 'shows the award on the note' do
- page.within('.note-awards') do
- expect(page).to have_emoji('100')
- end
- end
-
- it 'allows adding a vote to an award' do
- page.within('.note-awards') do
- find('gl-emoji[data-name="100"]').click
- end
- wait_for_requests
-
- expect(note.reload.award_emoji.size).to eq(2)
- end
-
- it 'allows adding a new emoji' do
- page.within('.note-actions') do
- find('a.js-add-award').click
- end
- page.within('.emoji-menu-content') do
- find('gl-emoji[data-name="8ball"]').click
- end
- wait_for_requests
-
- page.within('.note-awards') do
- expect(page).to have_emoji('8ball')
- end
- expect(note.reload.award_emoji.size).to eq(2)
- end
-
- context 'when the project is archived' do
- let(:project) { create(:project, :archived) }
-
- it 'hides the buttons for adding new emoji' do
- page.within('.note-awards') do
- expect(page).not_to have_css('.award-menu-holder')
- end
-
- page.within('.note-actions') do
- expect(page).not_to have_css('a.js-add-award')
- end
- end
-
- it 'does not allow toggling existing emoji' do
- page.within('.note-awards') do
- find('gl-emoji[data-name="100"]').click
- end
- wait_for_requests
-
- expect(note.reload.award_emoji.size).to eq(1)
- end
- end
- end
-end
diff --git a/spec/features/projects/badges/pipeline_badge_spec.rb b/spec/features/projects/badges/pipeline_badge_spec.rb
index 8c4488b2ca6..dee81898928 100644
--- a/spec/features/projects/badges/pipeline_badge_spec.rb
+++ b/spec/features/projects/badges/pipeline_badge_spec.rb
@@ -19,7 +19,7 @@ describe 'Pipeline Badge' do
let!(:pipeline) { create(:ci_empty_pipeline, project: project, ref: ref, sha: project.commit(ref).sha) }
let!(:job) { create(:ci_build, pipeline: pipeline) }
- context 'when the pipeline was successfull' do
+ context 'when the pipeline was successful' do
it 'displays so on the badge' do
job.success
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 1064f72c271..e2f9e7e9cc5 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -5,8 +5,8 @@ describe 'File blob', :js do
let(:project) { create(:project, :public, :repository) }
- def visit_blob(path, anchor: nil, ref: 'master')
- visit project_blob_path(project, File.join(ref, path), anchor: anchor)
+ def visit_blob(path, anchor: nil, ref: 'master', legacy_render: nil)
+ visit project_blob_path(project, File.join(ref, path), anchor: anchor, legacy_render: legacy_render)
wait_for_requests
end
@@ -142,6 +142,52 @@ describe 'File blob', :js do
end
end
+ context 'Markdown rendering' do
+ before do
+ project.add_maintainer(project.creator)
+
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add RedCarpet and CommonMark Markdown ",
+ file_path: 'files/commonmark/file.md',
+ file_content: "1. one\n - sublist\n"
+ ).execute
+ end
+
+ context 'when rendering default markdown' do
+ before do
+ visit_blob('files/commonmark/file.md')
+
+ wait_for_requests
+ end
+
+ it 'renders using CommonMark' do
+ aggregate_failures do
+ expect(page).to have_content("sublist")
+ expect(page).not_to have_xpath("//ol//li//ul")
+ end
+ end
+ end
+
+ context 'when rendering legacy markdown' do
+ before do
+ visit_blob('files/commonmark/file.md', legacy_render: 1)
+
+ wait_for_requests
+ end
+
+ it 'renders using RedCarpet' do
+ aggregate_failures do
+ expect(page).to have_content("sublist")
+ expect(page).to have_xpath("//ol//li//ul")
+ end
+ end
+ end
+ end
+
context 'Markdown file (stored in LFS)' do
before do
project.add_maintainer(project.creator)
@@ -487,7 +533,7 @@ describe 'File blob', :js do
expect(page).to have_content('This project is licensed under the MIT License.')
# shows a learn more link
- expect(page).to have_link('Learn more', 'http://choosealicense.com/licenses/mit/')
+ expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/')
end
end
end
@@ -520,10 +566,10 @@ describe 'File blob', :js do
expect(page).to have_content('This project manages its dependencies using RubyGems and defines a gem named activerecord.')
# shows a link to the gem
- expect(page).to have_link('activerecord', 'https://rubygems.org/gems/activerecord')
+ expect(page).to have_link('activerecord', href: 'https://rubygems.org/gems/activerecord')
# shows a learn more link
- expect(page).to have_link('Learn more', 'http://choosealicense.com/licenses/mit/')
+ expect(page).to have_link('Learn more', href: 'https://rubygems.org/')
end
end
end
diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb
index 0e036b4ea68..d5b20605860 100644
--- a/spec/features/projects/blobs/edit_spec.rb
+++ b/spec/features/projects/blobs/edit_spec.rb
@@ -7,6 +7,7 @@ describe 'Editing file blob', :js do
let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
let(:branch) { 'master' }
let(:file_path) { project.repository.ls_files(project.repository.root_ref)[1] }
+ let(:readme_file_path) { 'README.md' }
context 'as a developer' do
let(:user) { create(:user) }
@@ -20,14 +21,19 @@ describe 'Editing file blob', :js do
def edit_and_commit(commit_changes: true)
wait_for_requests
find('.js-edit-blob').click
- find('#editor')
- execute_script('ace.edit("editor").setValue("class NextFeature\nend\n")')
+ fill_editor(content: "class NextFeature\\nend\\n")
if commit_changes
click_button 'Commit changes'
end
end
+ def fill_editor(content: "class NextFeature\\nend\\n")
+ wait_for_requests
+ find('#editor')
+ execute_script("ace.edit('editor').setValue('#{content}')")
+ end
+
context 'from MR diff' do
before do
visit diffs_project_merge_request_path(project, merge_request)
@@ -63,6 +69,30 @@ describe 'Editing file blob', :js do
expect(new_line_count).to be > 0
end
end
+
+ context 'when rendering the preview' do
+ it 'renders content with CommonMark' do
+ visit project_edit_blob_path(project, tree_join(branch, readme_file_path))
+ fill_editor(content: "1. one\\n - sublist\\n")
+ click_link 'Preview'
+ wait_for_requests
+
+ # the above generates two seperate lists (not embedded) in CommonMark
+ expect(page).to have_content("sublist")
+ expect(page).not_to have_xpath("//ol//li//ul")
+ end
+
+ it 'renders content with RedCarpet when legacy_render is set' do
+ visit project_edit_blob_path(project, tree_join(branch, readme_file_path), legacy_render: 1)
+ fill_editor(content: "1. one\\n - sublist\\n")
+ click_link 'Preview'
+ wait_for_requests
+
+ # the above generates a sublist list in RedCarpet
+ expect(page).to have_content("sublist")
+ expect(page).to have_xpath("//ol//li//ul")
+ end
+ end
end
context 'visit blob edit' do
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index 31e3ebf675d..3d17eb3a73a 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -33,6 +33,32 @@ describe 'Gcp Cluster', :js do
context 'when user filled form with valid parameters' do
subject { click_button 'Create Kubernetes cluster' }
+ shared_examples 'valid cluster gcp form' do
+ it 'users sees a form with the GCP token' do
+ expect(page).to have_selector(:css, 'form[data-token="token"]')
+ end
+
+ it 'user sees a cluster details page and creation status' do
+ subject
+
+ expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
+
+ Clusters::Cluster.last.provider.make_created!
+
+ expect(page).to have_content('Kubernetes cluster was successfully created on Google Kubernetes Engine')
+ end
+
+ it 'user sees a error if something wrong during creation' do
+ subject
+
+ expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
+
+ Clusters::Cluster.last.provider.make_errored!('Something wrong!')
+
+ expect(page).to have_content('Something wrong!')
+ end
+ end
+
before do
allow_any_instance_of(GoogleApi::CloudPlatform::Client)
.to receive(:projects_zones_clusters_create) do
@@ -56,28 +82,14 @@ describe 'Gcp Cluster', :js do
fill_in 'cluster[provider_gcp_attributes][machine_type]', with: 'n1-standard-2'
end
- it 'users sees a form with the GCP token' do
- expect(page).to have_selector(:css, 'form[data-token="token"]')
- end
-
- it 'user sees a cluster details page and creation status' do
- subject
-
- expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
-
- Clusters::Cluster.last.provider.make_created!
+ it_behaves_like 'valid cluster gcp form'
- expect(page).to have_content('Kubernetes cluster was successfully created on Google Kubernetes Engine')
- end
-
- it 'user sees a error if something wrong during creation' do
- subject
-
- expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
-
- Clusters::Cluster.last.provider.make_errored!('Something wrong!')
+ context 'RBAC is enabled for the cluster' do
+ before do
+ check 'cluster_provider_gcp_attributes_legacy_abac'
+ end
- expect(page).to have_content('Something wrong!')
+ it_behaves_like 'valid cluster gcp form'
end
end
@@ -118,6 +130,7 @@ describe 'Gcp Cluster', :js do
context 'when user changes cluster parameters' do
before do
+ allow(ClusterPlatformConfigureWorker).to receive(:perform_async)
fill_in 'cluster_platform_kubernetes_attributes_namespace', with: 'my-namespace'
page.within('#js-cluster-details') { click_button 'Save changes' }
end
diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb
index babf47cc341..250c964cc32 100644
--- a/spec/features/projects/clusters/user_spec.rb
+++ b/spec/features/projects/clusters/user_spec.rb
@@ -9,7 +9,9 @@ describe 'User Cluster', :js do
before do
project.add_maintainer(user)
gitlab_sign_in(user)
+
allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
+ allow_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute)
end
context 'when user does not have a cluster and visits cluster index page' do
@@ -21,20 +23,41 @@ describe 'User Cluster', :js do
end
context 'when user filled form with valid parameters' do
+ shared_examples 'valid cluster user form' do
+ it 'user sees a cluster details page' do
+ subject
+
+ expect(page).to have_content('Kubernetes cluster integration')
+ expect(page.find_field('cluster[name]').value).to eq('dev-cluster')
+ expect(page.find_field('cluster[platform_kubernetes_attributes][api_url]').value)
+ .to have_content('http://example.com')
+ expect(page.find_field('cluster[platform_kubernetes_attributes][token]').value)
+ .to have_content('my-token')
+ end
+ end
+
before do
fill_in 'cluster_name', with: 'dev-cluster'
fill_in 'cluster_platform_kubernetes_attributes_api_url', with: 'http://example.com'
fill_in 'cluster_platform_kubernetes_attributes_token', with: 'my-token'
- click_button 'Add Kubernetes cluster'
end
- it 'user sees a cluster details page' do
- expect(page).to have_content('Kubernetes cluster integration')
- expect(page.find_field('cluster[name]').value).to eq('dev-cluster')
- expect(page.find_field('cluster[platform_kubernetes_attributes][api_url]').value)
- .to have_content('http://example.com')
- expect(page.find_field('cluster[platform_kubernetes_attributes][token]').value)
- .to have_content('my-token')
+ subject { click_button 'Add Kubernetes cluster' }
+
+ it_behaves_like 'valid cluster user form'
+
+ context 'RBAC is enabled for the cluster' do
+ before do
+ check 'cluster_platform_kubernetes_attributes_authorization_type'
+ end
+
+ it_behaves_like 'valid cluster user form'
+
+ it 'user sees a cluster details page with RBAC enabled' do
+ subject
+
+ expect(page.find_field('cluster[platform_kubernetes_attributes][authorization_type]', disabled: true)).to be_checked
+ end
end
end
@@ -63,7 +86,6 @@ describe 'User Cluster', :js do
context 'when user disables the cluster' do
before do
page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click
- fill_in 'cluster_name', with: 'dev-cluster'
page.within('#cluster-integration') { click_button 'Save changes' }
end
diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb
index 91eac9c8278..a85e7333ba8 100644
--- a/spec/features/projects/clusters_spec.rb
+++ b/spec/features/projects/clusters_spec.rb
@@ -35,37 +35,6 @@ describe 'Clusters', :js do
expect(page).to have_selector('.gl-responsive-table-row', count: 2)
end
- context 'inline update of cluster' do
- it 'user can update cluster' do
- expect(page).to have_selector('.js-project-feature-toggle')
- end
-
- context 'with sucessfull request' do
- it 'user sees updated cluster' do
- expect do
- page.find('.js-project-feature-toggle').click
- wait_for_requests
- end.to change { cluster.reload.enabled }
-
- expect(page).not_to have_selector('.is-checked')
- expect(cluster.reload).not_to be_enabled
- end
- end
-
- context 'with failed request' do
- it 'user sees not update cluster and error message' do
- expect_any_instance_of(Clusters::UpdateService).to receive(:execute).and_call_original
- allow_any_instance_of(Clusters::Cluster).to receive(:valid?) { false }
-
- page.find('.js-project-feature-toggle').click
-
- expect(page).to have_content('Something went wrong on our end.')
- expect(page).to have_selector('.is-checked')
- expect(cluster.reload).to be_enabled
- end
- end
- end
-
context 'when user clicks on a cluster' do
before do
click_link cluster.name
diff --git a/spec/features/projects/commit/cherry_pick_spec.rb b/spec/features/projects/commit/cherry_pick_spec.rb
index bc3c00dafe2..a61b614dbc8 100644
--- a/spec/features/projects/commit/cherry_pick_spec.rb
+++ b/spec/features/projects/commit/cherry_pick_spec.rb
@@ -21,7 +21,7 @@ describe 'Cherry-pick Commits' do
uncheck 'create_merge_request'
click_button 'Cherry-pick'
end
- expect(page).to have_content('The commit has been successfully cherry-picked.')
+ expect(page).to have_content('The commit has been successfully cherry-picked into master.')
end
end
@@ -32,7 +32,7 @@ describe 'Cherry-pick Commits' do
uncheck 'create_merge_request'
click_button 'Cherry-pick'
end
- expect(page).to have_content('The commit has been successfully cherry-picked.')
+ expect(page).to have_content('The commit has been successfully cherry-picked into master.')
end
end
@@ -59,7 +59,7 @@ describe 'Cherry-pick Commits' do
page.within('#modal-cherry-pick-commit') do
click_button 'Cherry-pick'
end
- expect(page).to have_content('The commit has been successfully cherry-picked. You can now submit a merge request to get this change into the original branch.')
+ expect(page).to have_content("The commit has been successfully cherry-picked into cherry-pick-#{master_pickable_commit.short_id}. You can now submit a merge request to get this change into the original branch.")
expect(page).to have_content("From cherry-pick-#{master_pickable_commit.short_id} into master")
end
end
@@ -86,7 +86,7 @@ describe 'Cherry-pick Commits' do
click_button 'Cherry-pick'
end
- expect(page).to have_content('The commit has been successfully cherry-picked.')
+ expect(page).to have_content('The commit has been successfully cherry-picked into feature.')
end
end
diff --git a/spec/features/projects/commit/comments/user_adds_comment_spec.rb b/spec/features/projects/commit/comments/user_adds_comment_spec.rb
index 6397df086a7..29442a58ea4 100644
--- a/spec/features/projects/commit/comments/user_adds_comment_spec.rb
+++ b/spec/features/projects/commit/comments/user_adds_comment_spec.rb
@@ -28,19 +28,19 @@ describe "User adds a comment on a commit", :js do
fill_in("note[note]", with: "#{comment_text} #{emoji}")
# Check on `Preview` tab
- click_link("Preview")
+ click_button("Preview")
expect(find(".js-md-preview")).to have_content(comment_text).and have_css("gl-emoji")
expect(page).not_to have_css(".js-note-text")
# Check on the `Write` tab
- click_link("Write")
+ click_button("Write")
expect(page).to have_field("note[note]", with: "#{comment_text} #{emoji}")
# Submit comment from the `Preview` tab to get rid of a separate `it` block
# which would specially tests if everything gets cleared from the note form.
- click_link("Preview")
+ click_button("Preview")
click_button("Comment")
end
@@ -88,13 +88,13 @@ describe "User adds a comment on a commit", :js do
# Test Preview feature for both forms.
page.within("form[data-line-code='#{sample_commit.line_code}']") do
- click_link("Preview")
+ click_button("Preview")
end
page.within("form[data-line-code='#{sample_commit.del_line_code}']") do
fill_in("note[note]", with: another_comment_text)
- click_link("Preview")
+ click_button("Preview")
end
expect(page).to have_css(".js-md-preview", visible: true, count: 2)
diff --git a/spec/features/projects/commit/user_comments_on_commit_spec.rb b/spec/features/projects/commit/user_comments_on_commit_spec.rb
index 6397a8ad845..73ce8d2b996 100644
--- a/spec/features/projects/commit/user_comments_on_commit_spec.rb
+++ b/spec/features/projects/commit/user_comments_on_commit_spec.rb
@@ -25,19 +25,19 @@ describe "User comments on commit", :js do
fill_in("note[note]", with: "#{comment_text} #{emoji_code}")
# Check on `Preview` tab
- click_link("Preview")
+ click_button("Preview")
expect(find(".js-md-preview")).to have_content(comment_text).and have_css("gl-emoji")
expect(page).not_to have_css(".js-note-text")
# Check on `Write` tab
- click_link("Write")
+ click_button("Write")
expect(page).to have_field("note[note]", with: "#{comment_text} #{emoji_code}")
# Submit comment from the `Preview` tab to get rid of a separate `it` block
# which would specially tests if everything gets cleared from the note form.
- click_link("Preview")
+ click_button("Preview")
click_button("Comment")
end
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index 4c5dda29fee..9772a7bacac 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -25,7 +25,7 @@ describe 'Environment' do
end
context 'without deployments' do
- it 'does show no deployments' do
+ it 'does not show deployments' do
expect(page).to have_content('You don\'t have any deployments right now.')
end
end
@@ -33,7 +33,7 @@ describe 'Environment' do
context 'with deployments' do
context 'when there is no related deployable' do
let(:deployment) do
- create(:deployment, environment: environment, deployable: nil)
+ create(:deployment, :success, environment: environment, deployable: nil)
end
it 'does show deployment SHA' do
@@ -43,24 +43,74 @@ describe 'Environment' do
end
end
+ context 'when there is a successful deployment' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+
+ let(:deployment) do
+ create(:deployment, :success, environment: environment, deployable: build)
+ end
+
+ it 'does show deployments' do
+ expect(page).to have_link("#{build.name} (##{build.id})")
+ end
+ end
+
+ context 'when there is a running deployment' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+
+ let(:deployment) do
+ create(:deployment, :running, environment: environment, deployable: build)
+ end
+
+ it 'does not show deployments' do
+ expect(page).to have_content('You don\'t have any deployments right now.')
+ end
+ end
+
+ context 'when there is a failed deployment' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+
+ let(:deployment) do
+ create(:deployment, :failed, environment: environment, deployable: build)
+ end
+
+ it 'does not show deployments' do
+ expect(page).to have_content('You don\'t have any deployments right now.')
+ end
+ end
+
context 'with related deployable present' do
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) }
let(:deployment) do
- create(:deployment, environment: environment, deployable: build)
+ create(:deployment, :success, environment: environment, deployable: build)
end
it 'does show build name' do
expect(page).to have_link("#{build.name} (##{build.id})")
- expect(page).to have_link('Re-deploy')
+ expect(page).not_to have_link('Re-deploy')
expect(page).not_to have_terminal_button
end
+ context 'when user has ability to re-deploy' do
+ let(:permissions) do
+ create(:protected_branch, :developers_can_merge,
+ name: build.ref, project: project)
+ end
+
+ it 'does show re-deploy' do
+ expect(page).to have_link('Re-deploy')
+ end
+ end
+
context 'with manual action' do
let(:action) do
create(:ci_build, :manual, pipeline: pipeline,
- name: 'deploy to production')
+ name: 'deploy to production', environment: environment.name)
end
context 'when user has ability to trigger deployment' do
@@ -73,12 +123,16 @@ describe 'Environment' do
expect(page).to have_link(action.name.humanize)
end
- it 'does allow to play manual action' do
+ it 'does allow to play manual action', :js do
expect(action).to be_manual
+ find('button.dropdown').click
+
expect { click_link(action.name.humanize) }
.not_to change { Ci::Pipeline.count }
+ wait_for_all_requests
+
expect(page).to have_content(action.name)
expect(action.reload).to be_pending
end
@@ -93,7 +147,7 @@ describe 'Environment' do
context 'with external_url' do
let(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') }
let(:build) { create(:ci_build, pipeline: pipeline) }
- let(:deployment) { create(:deployment, environment: environment, deployable: build) }
+ let(:deployment) { create(:deployment, :success, environment: environment, deployable: build) }
it 'does show an external link button' do
expect(page).to have_link(nil, href: environment.external_url)
@@ -154,7 +208,8 @@ describe 'Environment' do
end
let(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
deployable: build,
on_stop: 'close_app')
end
@@ -165,10 +220,10 @@ describe 'Environment' do
name: action.ref, project: project)
end
- it 'allows to stop environment' do
+ it 'allows to stop environment', :js do
click_button('Stop')
click_button('Stop environment') # confirm modal
-
+ wait_for_all_requests
expect(page).to have_content('close_app')
end
end
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index f0890018286..89954d35f91 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -95,7 +95,7 @@ describe 'Environments page', :js do
end
it 'does not show environments and counters are set to zero' do
- expect(page).to have_content('You don\'t have any environments right now.')
+ expect(page).to have_content('You don\'t have any environments right now')
expect(page.find('.js-environments-tab-available .badge').text).to eq('0')
expect(page.find('.js-environments-tab-stopped .badge').text).to eq('0')
@@ -128,11 +128,12 @@ describe 'Environments page', :js do
end
end
- context 'when there are deployments' do
+ context 'when there are successful deployments' do
let(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
sha: project.commit.id)
end
@@ -152,7 +153,8 @@ describe 'Environments page', :js do
end
let!(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
deployable: build,
sha: project.commit.id)
end
@@ -162,7 +164,7 @@ describe 'Environments page', :js do
end
it 'shows a play button' do
- find('.js-dropdown-play-icon-container').click
+ find('.js-environment-actions-dropdown').click
expect(page).to have_content(action.name.humanize)
end
@@ -170,7 +172,7 @@ describe 'Environments page', :js do
it 'allows to play a manual action', :js do
expect(action).to be_manual
- find('.js-dropdown-play-icon-container').click
+ find('.js-environment-actions-dropdown').click
expect(page).to have_content(action.name.humanize)
expect { find('.js-manual-action-link').click }
@@ -196,7 +198,7 @@ describe 'Environments page', :js do
context 'with external_url' do
let(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') }
let(:build) { create(:ci_build, pipeline: pipeline) }
- let(:deployment) { create(:deployment, environment: environment, deployable: build) }
+ let(:deployment) { create(:deployment, :success, environment: environment, deployable: build) }
it 'shows an external link button' do
expect(page).to have_link(nil, href: environment.external_url)
@@ -209,7 +211,8 @@ describe 'Environments page', :js do
end
let(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
deployable: build,
on_stop: 'close_app')
end
@@ -260,6 +263,86 @@ describe 'Environments page', :js do
end
end
end
+
+ context 'when there is a delayed job' do
+ let!(:pipeline) { create(:ci_pipeline, project: project) }
+ let!(:build) { create(:ci_build, pipeline: pipeline) }
+
+ let!(:delayed_job) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline,
+ name: 'delayed job',
+ stage: 'test',
+ commands: 'test')
+ end
+
+ let!(:deployment) do
+ create(:deployment,
+ :success,
+ environment: environment,
+ deployable: build,
+ sha: project.commit.id)
+ end
+
+ before do
+ visit_environments(project)
+ end
+
+ it 'has a dropdown for actionable jobs' do
+ expect(page).to have_selector('.dropdown-new.btn.btn-default .ic-play')
+ end
+
+ it "has link to the delayed job's action" do
+ find('.js-environment-actions-dropdown').click
+
+ expect(page).to have_button('Delayed job')
+ expect(page).to have_content(/\d{2}:\d{2}:\d{2}/)
+ end
+
+ context 'when delayed job is expired already' do
+ let!(:delayed_job) do
+ create(:ci_build, :expired_scheduled,
+ pipeline: pipeline,
+ name: 'delayed job',
+ stage: 'test',
+ commands: 'test')
+ end
+
+ it "shows 00:00:00 as the remaining time" do
+ find('.js-environment-actions-dropdown').click
+
+ expect(page).to have_content("00:00:00")
+ end
+ end
+
+ context 'when user played a delayed job immediately' do
+ before do
+ find('.js-environment-actions-dropdown').click
+ page.accept_confirm { click_button('Delayed job') }
+ wait_for_requests
+ end
+
+ it 'enqueues the delayed job', :js do
+ expect(delayed_job.reload).to be_pending
+ end
+ end
+ end
+ end
+
+ context 'when there is a failed deployment' do
+ let(:project) { create(:project, :repository) }
+
+ let!(:deployment) do
+ create(:deployment, :failed,
+ environment: environment,
+ sha: project.commit.id)
+ end
+
+ it 'does not show deployments' do
+ visit_environments(project)
+
+ expect(page).to have_content('No deployments yet')
+ end
end
end
diff --git a/spec/features/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/projects/files/project_owner_creates_license_file_spec.rb
index ac6c8c337fa..6762460971f 100644
--- a/spec/features/projects/files/project_owner_creates_license_file_spec.rb
+++ b/spec/features/projects/files/project_owner_creates_license_file_spec.rb
@@ -36,7 +36,7 @@ describe 'Projects > Files > Project owner creates a license file', :js do
end
it 'project maintainer creates a license file from the "Add license" link' do
- click_link 'Add License'
+ click_link 'Add license'
expect(page).to have_content('New file')
expect(current_path).to eq(
diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
index 801291c1f77..0b8474fb87a 100644
--- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
+++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -10,7 +10,7 @@ describe 'Projects > Files > Project owner sees a link to create a license file
it 'project maintainer creates a license file from a template' do
visit project_path(project)
- click_on 'Add License'
+ click_on 'Add license'
expect(page).to have_content('New file')
expect(current_path).to eq(
diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb
index d4dda43c823..a4f94b7a76d 100644
--- a/spec/features/projects/files/user_creates_files_spec.rb
+++ b/spec/features/projects/files/user_creates_files_spec.rb
@@ -16,7 +16,7 @@ describe 'Projects > Files > User creates files' do
sign_in(user)
end
- context 'without commiting a new file' do
+ context 'without committing a new file' do
context 'when an user has write access' do
before do
visit(project_tree_path_root_ref)
@@ -49,7 +49,7 @@ describe 'Projects > Files > User creates files' do
end
end
- context 'with commiting a new file' do
+ context 'with committing a new file' do
context 'when an user has write access' do
before do
visit(project_tree_path_root_ref)
diff --git a/spec/features/projects/files/user_deletes_files_spec.rb b/spec/features/projects/files/user_deletes_files_spec.rb
index dcb7b947c61..614b11fa5c8 100644
--- a/spec/features/projects/files/user_deletes_files_spec.rb
+++ b/spec/features/projects/files/user_deletes_files_spec.rb
@@ -31,7 +31,7 @@ describe 'Projects > Files > User deletes files', :js do
fill_in(:commit_message, with: 'New commit message', visible: true)
click_button('Delete file')
- expect(current_path).to eq(project_tree_path(project, 'master'))
+ expect(current_path).to eq(project_tree_path(project, 'master/'))
expect(page).not_to have_content('.gitignore')
end
end
diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb
index cd5fef8238e..7c71b4c52e0 100644
--- a/spec/features/projects/fork_spec.rb
+++ b/spec/features/projects/fork_spec.rb
@@ -53,6 +53,18 @@ describe 'Project fork' do
expect(current_path).to have_content(/#{user.namespace.name}/i)
end
+ it 'shows avatars when Gravatar is disabled' do
+ stub_application_setting(gravatar_enabled: false)
+
+ visit project_path(project)
+
+ click_link 'Fork'
+
+ page.within('.fork-thumbnail-container') do
+ expect(page).to have_css('div.identicon')
+ end
+ end
+
it 'shows the forked project on the list' do
visit project_path(project)
diff --git a/spec/features/projects/import_export/export_file_spec.rb b/spec/features/projects/import_export/export_file_spec.rb
index eb281cd2122..f76f9ba7577 100644
--- a/spec/features/projects/import_export/export_file_spec.rb
+++ b/spec/features/projects/import_export/export_file_spec.rb
@@ -12,7 +12,7 @@ describe 'Import/Export - project export integration test', :js do
let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
let(:config_hash) { YAML.load_file(Gitlab::ImportExport.config_file).deep_stringify_keys }
- let(:sensitive_words) { %w[pass secret token key] }
+ let(:sensitive_words) { %w[pass secret token key encrypted] }
let(:safe_list) do
{
token: [ProjectHook, Ci::Trigger, CommitStatus],
@@ -25,7 +25,6 @@ describe 'Import/Export - project export integration test', :js do
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- stub_feature_flags(import_export_object_storage: false)
end
after do
@@ -50,6 +49,8 @@ describe 'Import/Export - project export integration test', :js do
expect(file_permissions(project.export_path)).to eq(0700)
+ expect(project.export_file.path).to include('tar.gz')
+
in_directory_with_expanded_export(project) do |exit_status, tmpdir|
expect(exit_status).to eq(0)
diff --git a/spec/features/projects/import_export/import_file_object_storage_spec.rb b/spec/features/projects/import_export/import_file_object_storage_spec.rb
deleted file mode 100644
index 0d364543916..00000000000
--- a/spec/features/projects/import_export/import_file_object_storage_spec.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-require 'spec_helper'
-
-describe 'Import/Export - project import integration test', :js do
- include Select2Helper
-
- let(:user) { create(:user) }
- let(:file) { File.join(Rails.root, 'spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') }
- let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
-
- before do
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(FileUploader)
- allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- gitlab_sign_in(user)
- end
-
- after do
- FileUtils.rm_rf(export_path, secure: true)
- end
-
- context 'when selecting the namespace' do
- let(:user) { create(:admin) }
- let!(:namespace) { user.namespace }
- let(:project_path) { 'test-project-path' + SecureRandom.hex }
-
- context 'prefilled the path' do
- it 'user imports an exported project successfully' do
- visit new_project_path
-
- select2(namespace.id, from: '#project_namespace_id')
- fill_in :project_path, with: project_path, visible: true
- click_import_project_tab
- click_link 'GitLab export'
-
- expect(page).to have_content('Import an exported GitLab project')
- expect(URI.parse(current_url).query).to eq("namespace_id=#{namespace.id}&path=#{project_path}")
-
- attach_file('file', file)
- click_on 'Import project'
-
- expect(Project.count).to eq(1)
-
- project = Project.last
- expect(project).not_to be_nil
- expect(project.description).to eq("Foo Bar")
- expect(project.issues).not_to be_empty
- expect(project.merge_requests).not_to be_empty
- expect(project_hook_exists?(project)).to be true
- expect(wiki_exists?(project)).to be true
- expect(project.import_state.status).to eq('finished')
- end
- end
-
- context 'path is not prefilled' do
- it 'user imports an exported project successfully' do
- visit new_project_path
- click_import_project_tab
- click_link 'GitLab export'
-
- fill_in :path, with: 'test-project-path', visible: true
- attach_file('file', file)
-
- expect { click_on 'Import project' }.to change { Project.count }.by(1)
-
- project = Project.last
- expect(project).not_to be_nil
- expect(page).to have_content("Project 'test-project-path' is being imported")
- end
- end
- end
-
- it 'invalid project' do
- project = create(:project, namespace: user.namespace)
-
- visit new_project_path
-
- select2(user.namespace.id, from: '#project_namespace_id')
- fill_in :project_path, with: project.name, visible: true
- click_import_project_tab
- click_link 'GitLab export'
- attach_file('file', file)
- click_on 'Import project'
-
- page.within('.flash-container') do
- expect(page).to have_content('Project could not be imported')
- end
- end
-
- def wiki_exists?(project)
- wiki = ProjectWiki.new(project)
- wiki.repository.exists? && !wiki.repository.empty?
- end
-
- def project_hook_exists?(project)
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- Gitlab::Git::Hook.new('post-receive', project.repository.raw_repository).exists?
- end
- end
-
- def click_import_project_tab
- find('#import-project-tab').click
- end
-end
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index 2d86115de12..28ae90bc0de 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -2,13 +2,14 @@ require 'spec_helper'
describe 'Import/Export - project import integration test', :js do
include Select2Helper
+ include GitHelpers
let(:user) { create(:user) }
let(:file) { File.join(Rails.root, 'spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') }
let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
before do
- stub_feature_flags(import_export_object_storage: false)
+ stub_uploads_object_storage(FileUploader)
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
gitlab_sign_in(user)
end
@@ -20,20 +21,21 @@ describe 'Import/Export - project import integration test', :js do
context 'when selecting the namespace' do
let(:user) { create(:admin) }
let!(:namespace) { user.namespace }
- let(:project_path) { 'test-project-path' + SecureRandom.hex }
+ let(:randomHex) { SecureRandom.hex }
+ let(:project_name) { 'Test Project Name' + randomHex }
+ let(:project_path) { 'test-project-name' + randomHex }
context 'prefilled the path' do
it 'user imports an exported project successfully' do
visit new_project_path
select2(namespace.id, from: '#project_namespace_id')
- fill_in :project_path, with: project_path, visible: true
+ fill_in :project_name, with: project_name, visible: true
click_import_project_tab
click_link 'GitLab export'
expect(page).to have_content('Import an exported GitLab project')
- expect(URI.parse(current_url).query).to eq("namespace_id=#{namespace.id}&path=#{project_path}")
- expect(Gitlab::ImportExport).to receive(:import_upload_path).with(filename: /\A\h{32}\z/).and_call_original
+ expect(URI.parse(current_url).query).to eq("namespace_id=#{namespace.id}&name=#{ERB::Util.url_encode(project_name)}&path=#{project_path}")
attach_file('file', file)
click_on 'Import project'
@@ -57,6 +59,7 @@ describe 'Import/Export - project import integration test', :js do
click_import_project_tab
click_link 'GitLab export'
+ fill_in :name, with: 'Test Project Name', visible: true
fill_in :path, with: 'test-project-path', visible: true
attach_file('file', file)
@@ -75,7 +78,7 @@ describe 'Import/Export - project import integration test', :js do
visit new_project_path
select2(user.namespace.id, from: '#project_namespace_id')
- fill_in :project_path, with: project.name, visible: true
+ fill_in :project_name, with: project.name, visible: true
click_import_project_tab
click_link 'GitLab export'
attach_file('file', file)
@@ -91,12 +94,6 @@ describe 'Import/Export - project import integration test', :js do
wiki.repository.exists? && !wiki.repository.empty?
end
- def project_hook_exists?(project)
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- Gitlab::Git::Hook.new('post-receive', project.repository.raw_repository).exists?
- end
- end
-
def click_import_project_tab
find('#import-project-tab').click
end
diff --git a/spec/features/projects/import_export/namespace_export_file_spec.rb b/spec/features/projects/import_export/namespace_export_file_spec.rb
deleted file mode 100644
index 9bb8a2063b5..00000000000
--- a/spec/features/projects/import_export/namespace_export_file_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-require 'spec_helper'
-
-describe 'Import/Export - Namespace export file cleanup', :js do
- let(:export_path) { Dir.mktmpdir('namespace_export_file_spec') }
-
- before do
- allow(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- stub_feature_flags(import_export_object_storage: false)
- end
-
- after do
- FileUtils.rm_rf(export_path, secure: true)
- end
-
- shared_examples_for 'handling project exports on namespace change' do
- let!(:old_export_path) { project.export_path }
-
- before do
- sign_in(create(:admin))
-
- setup_export_project
- end
-
- context 'moving the namespace' do
- it 'removes the export file' do
- expect(File).to exist(old_export_path)
-
- project.namespace.update!(path: build(:namespace).path)
-
- expect(File).not_to exist(old_export_path)
- end
- end
-
- context 'deleting the namespace' do
- it 'removes the export file' do
- expect(File).to exist(old_export_path)
-
- project.namespace.destroy
-
- expect(File).not_to exist(old_export_path)
- end
- end
- end
-
- describe 'legacy storage' do
- let(:project) { create(:project, :legacy_storage) }
-
- it_behaves_like 'handling project exports on namespace change'
- end
-
- describe 'hashed storage' do
- let(:project) { create(:project) }
-
- it_behaves_like 'handling project exports on namespace change'
- end
-
- def setup_export_project
- visit edit_project_path(project)
-
- expect(page).to have_content('Export project')
-
- find(:link, 'Export project').send_keys(:return)
-
- visit edit_project_path(project)
-
- expect(page).to have_content('Download export')
- end
-end
diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz
index 3b5df47e0b6..730e586b278 100644
--- a/spec/features/projects/import_export/test_project_export.tar.gz
+++ b/spec/features/projects/import_export/test_project_export.tar.gz
Binary files differ
diff --git a/spec/features/projects/jobs/permissions_spec.rb b/spec/features/projects/jobs/permissions_spec.rb
index e639f0cf82e..6ce37297a7e 100644
--- a/spec/features/projects/jobs/permissions_spec.rb
+++ b/spec/features/projects/jobs/permissions_spec.rb
@@ -67,7 +67,7 @@ describe 'Project Jobs Permissions' do
it_behaves_like 'recent job page details responds with status', 200 do
it 'renders job details', :js do
expect(page).to have_content "Job ##{job.id}"
- expect(page).to have_css '#build-trace'
+ expect(page).to have_css '.js-build-trace'
end
end
diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb
index 50e957bf12b..908c616f2fc 100644
--- a/spec/features/projects/jobs/user_browses_job_spec.rb
+++ b/spec/features/projects/jobs/user_browses_job_spec.rb
@@ -16,9 +16,11 @@ describe 'User browses a job', :js do
visit(project_job_path(project, build))
end
- it 'erases the job log' do
+ it 'erases the job log', :js do
+ wait_for_requests
+
expect(page).to have_content("Job ##{build.id}")
- expect(page).to have_css('#build-trace')
+ expect(page).to have_css('.js-build-trace')
# scroll to the top of the page first
execute_script "window.scrollTo(0,0)"
@@ -29,18 +31,17 @@ describe 'User browses a job', :js do
expect(build.artifacts_file.exists?).to be_falsy
expect(build.artifacts_metadata.exists?).to be_falsy
- page.within('.erased') do
- expect(page).to have_content('Job has been erased')
- end
+ expect(page).to have_content('Job has been erased')
end
context 'with a failed job' do
let!(:build) { create(:ci_build, :failed, :trace_artifact, pipeline: pipeline) }
it 'displays the failure reason' do
+ wait_for_all_requests
within('.builds-container') do
build_link = first('.build-job > a')
- expect(build_link['data-title']).to eq('test - failed <br> (unknown failure)')
+ expect(build_link['data-original-title']).to eq('test - failed - (unknown failure)')
end
end
end
@@ -49,9 +50,10 @@ describe 'User browses a job', :js do
let!(:build) { create(:ci_build, :failed, :retried, :trace_artifact, pipeline: pipeline) }
it 'displays the failure reason and retried label' do
+ wait_for_all_requests
within('.builds-container') do
build_link = first('.build-job > a')
- expect(build_link['data-title']).to eq('test - failed <br> (unknown failure) (retried)')
+ expect(build_link['data-original-title']).to eq('test - failed - (unknown failure) (retried)')
end
end
end
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index 08786fe1630..ebc20d15d67 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -36,7 +36,7 @@ describe 'User browses jobs' do
it 'displays a tooltip with the failure reason' do
page.within('.ci-table') do
failed_job_link = page.find('.ci-failed')
- expect(failed_job_link[:title]).to eq('Failed <br> (unknown failure)')
+ expect(failed_job_link[:title]).to eq('Failed - (unknown failure)')
end
end
end
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index 83293c0ca7d..99a7fbb63bd 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -5,7 +5,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
let(:user) { create(:user) }
let(:user_access_level) { :developer }
let(:project) { create(:project, :repository) }
- let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) }
let(:job) { create(:ci_build, :trace_live, pipeline: pipeline) }
let(:job2) { create(:ci_build) }
@@ -20,7 +20,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
describe "GET /:project/jobs" do
- let!(:job) { create(:ci_build, pipeline: pipeline) }
+ let!(:job) { create(:ci_build, pipeline: pipeline) }
context "Pending scope" do
before do
@@ -115,37 +115,44 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
context "Job from project" do
let(:job) { create(:ci_build, :success, :trace_live, pipeline: pipeline) }
- before do
+ it 'shows status name', :js do
visit project_job_path(project, job)
- end
- it 'shows status name', :js do
+ wait_for_requests
+
expect(page).to have_css('.ci-status.ci-success', text: 'passed')
end
- it 'shows commit`s data' do
- expect(page.status_code).to eq(200)
+ it 'shows commit`s data', :js do
+ requests = inspect_requests() do
+ visit project_job_path(project, job)
+ end
+
+ wait_for_requests
+ expect(requests.first.status_code).to eq(200)
expect(page).to have_content pipeline.sha[0..7]
- expect(page).to have_content pipeline.git_commit_message
- expect(page).to have_content pipeline.git_author_name
+ expect(page).to have_content pipeline.commit.title
end
- it 'shows active job' do
+ it 'shows active job', :js do
+ visit project_job_path(project, job)
+
+ wait_for_requests
expect(page).to have_selector('.build-job.active')
end
end
- context 'sidebar' do
+ context 'sidebar', :js do
let(:job) { create(:ci_build, :success, :trace_live, pipeline: pipeline, name: '<img src=x onerror=alert(document.domain)>') }
before do
visit project_job_path(project, job)
+ wait_for_requests
end
it 'renders escaped tooltip name' do
- page.within('aside.right-sidebar') do
- expect(find('.active.build-job a')['data-title']).to eq('<img src="x"> - passed')
- end
+ page.find('.active.build-job a').hover
+ expect(page).to have_content('<img src=x onerror=alert(document.domain)> - passed')
end
end
@@ -191,6 +198,24 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
+ context 'when job is running', :js do
+ let(:job) { create(:ci_build, :running, pipeline: pipeline) }
+ let(:job_url) { project_job_path(project, job) }
+
+ before do
+ visit job_url
+ wait_for_requests
+ end
+
+ context 'job is cancelable' do
+ it 'shows cancel button' do
+ click_link 'Cancel'
+
+ expect(page.current_path).to eq(job_url)
+ end
+ end
+ end
+
context "Job from other project" do
before do
visit project_job_path(project, job2)
@@ -199,7 +224,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
it { expect(page.status_code).to eq(404) }
end
- context "Download artifacts" do
+ context "Download artifacts", :js do
before do
job.update(legacy_artifacts_file: artifacts_file)
visit project_job_path(project, job)
@@ -208,9 +233,22 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
it 'has button to download artifacts' do
expect(page).to have_content 'Download'
end
+
+ it 'downloads the zip file when user clicks the download button' do
+ requests = inspect_requests() do
+ click_link 'Download'
+ end
+
+ artifact_request = requests.find { |req| req.url.match(%r{artifacts/download}) }
+
+ expect(artifact_request.response_headers["Content-Disposition"]).to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"})
+ expect(artifact_request.response_headers['Content-Transfer-Encoding']).to eq("binary")
+ expect(artifact_request.response_headers['Content-Type']).to eq("image/gif")
+ expect(artifact_request.body).to eq(job.artifacts_file.file.read.b)
+ end
end
- context 'Artifacts expire date' do
+ context 'Artifacts expire date', :js do
before do
job.update(legacy_artifacts_file: artifacts_file,
artifacts_expire_at: expire_at)
@@ -231,12 +269,12 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
context 'when user has ability to update job' do
it 'keeps artifacts when keep button is clicked' do
- expect(page).to have_content 'The artifacts will be removed'
+ expect(page).to have_content 'The artifacts will be removed in'
click_link 'Keep'
expect(page).to have_no_link 'Keep'
- expect(page).to have_no_content 'The artifacts will be removed'
+ expect(page).to have_no_content 'The artifacts will be removed in'
end
end
@@ -273,7 +311,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
- describe 'Raw trace' do
+ describe 'Raw trace', :js do
before do
job.run!
@@ -281,7 +319,8 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it do
- expect(page).to have_css('.js-raw-link')
+ wait_for_all_requests
+ expect(page).to have_css('.js-raw-link-controller')
end
end
@@ -314,6 +353,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
shared_examples 'expected variables behavior' do
it 'shows variable key and value after click', :js do
+ expect(page).to have_content('Token')
expect(page).to have_css('.js-reveal-variables')
expect(page).not_to have_css('.js-build-variable')
expect(page).not_to have_css('.js-build-value')
@@ -347,39 +387,176 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
- context 'when job starts environment' do
- let(:environment) { create(:environment, project: project) }
- let(:pipeline) { create(:ci_pipeline, project: project) }
+ context 'when job starts environment', :js do
+ let(:environment) { create(:environment, name: 'production', project: project) }
+
+ before do
+ visit project_job_path(project, build)
+ wait_for_requests
+ end
- context 'job is successfull and has deployment' do
- let(:deployment) { create(:deployment) }
- let(:job) { create(:ci_build, :success, :trace_artifact, environment: environment.name, deployments: [deployment], pipeline: pipeline) }
+ context 'job is successful and has deployment' do
+ let(:build) { create(:ci_build, :success, :trace_live, environment: environment.name, pipeline: pipeline, deployment: deployment) }
+ let(:deployment) { create(:deployment, :success, environment: environment, project: environment.project) }
it 'shows a link for the job' do
- visit project_job_path(project, job)
-
expect(page).to have_link environment.name
end
+
+ it 'shows deployment message' do
+ expect(page).to have_content 'This job is the most recent deployment'
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ end
end
context 'job is complete and not successful' do
- let(:job) { create(:ci_build, :failed, :trace_artifact, environment: environment.name, pipeline: pipeline) }
+ let(:build) { create(:ci_build, :failed, :trace_artifact, environment: environment.name, pipeline: pipeline) }
it 'shows a link for the job' do
- visit project_job_path(project, job)
-
expect(page).to have_link environment.name
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
end
end
- context 'job creates a new deployment' do
- let!(:deployment) { create(:deployment, environment: environment, sha: project.commit.id) }
- let(:job) { create(:ci_build, :success, :trace_artifact, environment: environment.name, pipeline: pipeline) }
+ context 'deployment still not finished' do
+ let(:build) { create(:ci_build, :running, environment: environment.name, pipeline: pipeline) }
it 'shows a link to latest deployment' do
- visit project_job_path(project, job)
+ expect(page).to have_link environment.name
+ expect(page).to have_content 'This job is creating a deployment'
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ end
+ end
+ end
+
+ context 'when job stops environment', :js do
+ let(:environment) { create(:environment, name: 'production', project: project) }
+ let(:build) do
+ create(
+ :ci_build,
+ :success,
+ :trace_live,
+ environment: environment.name,
+ pipeline: pipeline,
+ options: { environment: { action: 'stop' } }
+ )
+ end
+
+ before do
+ visit project_job_path(project, build)
+ wait_for_requests
+ end
+
+ it 'does not show environment information banner' do
+ expect(page).not_to have_selector('.js-environment-container')
+ expect(page).not_to have_selector('.environment-information')
+ expect(page).not_to have_text(environment.name)
+ end
+ end
+
+ describe 'environment info in job view', :js do
+ before do
+ allow_any_instance_of(Ci::Build).to receive(:create_deployment)
+
+ visit project_job_path(project, job)
+ wait_for_requests
+ end
+
+ context 'job with outdated deployment' do
+ let(:job) { create(:ci_build, :success, :trace_artifact, environment: 'staging', pipeline: pipeline) }
+ let(:second_build) { create(:ci_build, :success, :trace_artifact, environment: 'staging', pipeline: pipeline) }
+ let(:environment) { create(:environment, name: 'staging', project: project) }
+ let!(:first_deployment) { create(:deployment, :success, environment: environment, deployable: job) }
+ let!(:second_deployment) { create(:deployment, :success, environment: environment, deployable: second_build) }
+
+ it 'shows deployment message' do
+ expected_text = 'This job is an out-of-date deployment ' \
+ "to staging. View the most recent deployment ##{second_deployment.iid}."
+
+ expect(page).to have_css('.environment-information', text: expected_text)
+ end
+
+ it 'renders a link to the most recent deployment' do
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ expect(find('.js-job-deployment-link')['href']).to include(second_deployment.deployable.project.path, second_deployment.deployable_id.to_s)
+ end
+ end
+
+ context 'job failed to deploy' do
+ let(:job) { create(:ci_build, :failed, :trace_artifact, environment: 'staging', pipeline: pipeline) }
+ let!(:environment) { create(:environment, name: 'staging', project: project) }
+
+ it 'shows deployment message' do
+ expected_text = 'The deployment of this job to staging did not succeed.'
+
+ expect(page).to have_css('.environment-information', text: expected_text)
+ end
+ end
+
+ context 'job will deploy' do
+ let(:job) { create(:ci_build, :running, :trace_live, environment: 'staging', pipeline: pipeline) }
+
+ context 'when environment exists' do
+ let!(:environment) { create(:environment, name: 'staging', project: project) }
+
+ it 'shows deployment message' do
+ expected_text = 'This job is creating a deployment to staging'
+
+ expect(page).to have_css('.environment-information', text: expected_text)
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ end
+
+ context 'when it has deployment' do
+ let!(:deployment) { create(:deployment, :success, environment: environment) }
+
+ it 'shows that deployment will be overwritten' do
+ expected_text = 'This job is creating a deployment to staging'
- expect(page).to have_link('latest deployment')
+ expect(page).to have_css('.environment-information', text: expected_text)
+ expect(page).to have_css('.environment-information', text: 'latest deployment')
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ end
+ end
+ end
+
+ context 'when environment does not exist' do
+ let!(:environment) { create(:environment, name: 'staging', project: project) }
+
+ it 'shows deployment message' do
+ expected_text = 'This job is creating a deployment to staging'
+
+ expect(page).to have_css(
+ '.environment-information', text: expected_text)
+ expect(page).not_to have_css(
+ '.environment-information', text: 'latest deployment')
+ expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}")
+ end
+ end
+ end
+
+ context 'job that failed to deploy and environment has not been created' do
+ let(:job) { create(:ci_build, :failed, :trace_artifact, environment: 'staging', pipeline: pipeline) }
+ let!(:environment) { create(:environment, name: 'staging', project: project) }
+
+ it 'shows deployment message' do
+ expected_text = 'The deployment of this job to staging did not succeed'
+
+ expect(page).to have_css(
+ '.environment-information', text: expected_text)
+ end
+ end
+
+ context 'job that will deploy and environment has not been created' do
+ let(:job) { create(:ci_build, :running, :trace_live, environment: 'staging', pipeline: pipeline) }
+ let!(:environment) { create(:environment, name: 'staging', project: project) }
+
+ it 'shows deployment message' do
+ expected_text = 'This job is creating a deployment to staging'
+
+ expect(page).to have_css(
+ '.environment-information', text: expected_text)
+ expect(page).not_to have_css(
+ '.environment-information', text: 'latest deployment')
end
end
end
@@ -392,7 +569,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
visit project_job_path(project, job)
end
- it 'shows manual action empty state' do
+ it 'shows manual action empty state', :js do
expect(page).to have_content(job.detailed_status(user).illustration[:title])
expect(page).to have_content('This job requires a manual action')
expect(page).to have_content('This job depends on a user to trigger its process. Often they are used to deploy code to production environments')
@@ -409,6 +586,30 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
+ context 'Delayed job' do
+ let(:job) { create(:ci_build, :scheduled, pipeline: pipeline) }
+
+ before do
+ project.add_developer(user)
+ visit project_job_path(project, job)
+ end
+
+ it 'shows delayed job', :js do
+ expect(page).to have_content('This is a delayed job to run in')
+ expect(page).to have_content("This job will automatically run after it's timer finishes.")
+ expect(page).to have_link('Unschedule job')
+ end
+
+ it 'unschedules delayed job and shows manual action', :js do
+ click_link 'Unschedule job'
+
+ wait_for_requests
+ expect(page).to have_content('This job requires a manual action')
+ expect(page).to have_content('This job depends on a user to trigger its process. Often they are used to deploy code to production environments')
+ expect(page).to have_link('Trigger this manual action')
+ end
+ end
+
context 'Non triggered job' do
let(:job) { create(:ci_build, :created, pipeline: pipeline) }
@@ -416,14 +617,14 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
visit project_job_path(project, job)
end
- it 'shows empty state' do
+ it 'shows empty state', :js do
expect(page).to have_content(job.detailed_status(user).illustration[:title])
expect(page).to have_content('This job has not been triggered yet')
expect(page).to have_content('This job depends on upstream jobs that need to succeed in order for this job to be triggered')
end
end
- context 'Pending job' do
+ context 'Pending job', :js do
let(:job) { create(:ci_build, :pending, pipeline: pipeline) }
before do
@@ -437,7 +638,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
- context 'Canceled job' do
+ context 'Canceled job', :js do
context 'with log' do
let(:job) { create(:ci_build, :canceled, :trace_artifact, pipeline: pipeline) }
@@ -446,11 +647,12 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it 'renders job log' do
- expect(page).to have_selector('.js-build-output')
+ wait_for_all_requests
+ expect(page).to have_selector('.js-build-trace')
end
end
- context 'without log' do
+ context 'without log', :js do
let(:job) { create(:ci_build, :canceled, pipeline: pipeline) }
before do
@@ -459,13 +661,13 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
it 'renders empty state' do
expect(page).to have_content(job.detailed_status(user).illustration[:title])
- expect(page).not_to have_selector('.js-build-output')
+ expect(page).not_to have_selector('.js-build-trace')
expect(page).to have_content('This job has been canceled')
end
end
end
- context 'Skipped job' do
+ context 'Skipped job', :js do
let(:job) { create(:ci_build, :skipped, pipeline: pipeline) }
before do
@@ -474,12 +676,12 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
it 'renders empty state' do
expect(page).to have_content(job.detailed_status(user).illustration[:title])
- expect(page).not_to have_selector('.js-build-output')
+ expect(page).not_to have_selector('.js-build-trace')
expect(page).to have_content('This job has been skipped')
end
end
- context 'when job is failed but has no trace' do
+ context 'when job is failed but has no trace', :js do
let(:job) { create(:ci_build, :failed, pipeline: pipeline) }
it 'renders empty state' do
@@ -489,6 +691,112 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
expect(page).to have_content('This job does not have a trace.')
end
end
+
+ context 'with erased job', :js do
+ let(:job) { create(:ci_build, :erased, pipeline: pipeline) }
+
+ it 'renders erased job warning' do
+ visit project_job_path(project, job)
+ wait_for_requests
+
+ page.within('.js-job-erased-block') do
+ expect(page).to have_content('Job has been erased')
+ end
+ end
+ end
+
+ context 'without erased job', :js do
+ let(:job) { create(:ci_build, pipeline: pipeline) }
+
+ it 'does not render erased job warning' do
+ visit project_job_path(project, job)
+ wait_for_requests
+
+ expect(page).not_to have_css('.js-job-erased-block')
+ end
+ end
+
+ context 'on mobile', :js do
+ let(:job) { create(:ci_build, pipeline: pipeline) }
+
+ it 'renders collapsed sidebar' do
+ page.current_window.resize_to(600, 800)
+
+ visit project_job_path(project, job)
+ wait_for_requests
+
+ expect(page).to have_css('.js-job-sidebar.right-sidebar-collapsed', visible: false)
+ expect(page).not_to have_css('.js-job-sidebar.right-sidebar-expanded', visible: false)
+ end
+ end
+
+ context 'on desktop', :js do
+ let(:job) { create(:ci_build, pipeline: pipeline) }
+
+ it 'renders expanded sidebar' do
+ visit project_job_path(project, job)
+ wait_for_requests
+
+ expect(page).to have_css('.js-job-sidebar.right-sidebar-expanded')
+ expect(page).not_to have_css('.js-job-sidebar.right-sidebar-collapsed')
+ end
+ end
+
+ context 'stuck', :js do
+ before do
+ visit project_job_path(project, job)
+ wait_for_requests
+ end
+
+ context 'without active runners available' do
+ let(:runner) { create(:ci_runner, :instance, active: false) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner) }
+
+ it 'renders message about job being stuck because no runners are active' do
+ expect(page).to have_css('.js-stuck-no-active-runner')
+ expect(page).to have_content("This job is stuck, because you don't have any active runners that can run this job.")
+ end
+ end
+
+ context 'when available runners can not run specified tag' do
+ let(:runner) { create(:ci_runner, :instance, active: false) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner, tag_list: %w(docker linux)) }
+
+ it 'renders message about job being stuck because of no runners with the specified tags' do
+ expect(page).to have_css('.js-stuck-with-tags')
+ expect(page).to have_content("This job is stuck, because you don't have any active runners online with any of these tags assigned to them:")
+ end
+ end
+
+ context 'when runners are offline and build has tags' do
+ let(:runner) { create(:ci_runner, :instance, active: true) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner, tag_list: %w(docker linux)) }
+
+ it 'renders message about job being stuck because of no runners with the specified tags' do
+ expect(page).to have_css('.js-stuck-with-tags')
+ expect(page).to have_content("This job is stuck, because you don't have any active runners online with any of these tags assigned to them:")
+ end
+ end
+
+ context 'without any runners available' do
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline) }
+
+ it 'renders message about job being stuck because not runners are available' do
+ expect(page).to have_css('.js-stuck-no-active-runner')
+ expect(page).to have_content("This job is stuck, because you don't have any active runners that can run this job.")
+ end
+ end
+
+ context 'without available runners online' do
+ let(:runner) { create(:ci_runner, :instance, active: true) }
+ let(:job) { create(:ci_build, :pending, pipeline: pipeline, runner: runner) }
+
+ it 'renders message about job being stuck because runners are offline' do
+ expect(page).to have_css('.js-stuck-no-runners')
+ expect(page).to have_content("This job is stuck, because the project doesn't have any runners online assigned to it.")
+ end
+ end
+ end
end
describe "POST /:project/jobs/:id/cancel", :js do
@@ -542,20 +850,26 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
- describe "GET /:project/jobs/:id/download" do
+ describe "GET /:project/jobs/:id/download", :js do
before do
job.update(legacy_artifacts_file: artifacts_file)
visit project_job_path(project, job)
+
click_link 'Download'
end
context "Build from other project" do
before do
job2.update(legacy_artifacts_file: artifacts_file)
- visit download_project_job_artifacts_path(project, job2)
end
- it { expect(page.status_code).to eq(404) }
+ it do
+ requests = inspect_requests() do
+ visit download_project_job_artifacts_path(project, job2)
+ end
+
+ expect(requests.first.status_code).to eq(404)
+ end
end
end
diff --git a/spec/features/projects/labels/sort_labels_spec.rb b/spec/features/projects/labels/sort_labels_spec.rb
new file mode 100644
index 00000000000..01c3f251173
--- /dev/null
+++ b/spec/features/projects/labels/sort_labels_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Sort labels', :js do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let!(:label1) { create(:label, title: 'Foo', description: 'Lorem ipsum', project: project) }
+ let!(:label2) { create(:label, title: 'Bar', description: 'Fusce consequat', project: project) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ visit project_labels_path(project)
+ end
+
+ it 'sorts by title by default' do
+ expect(page).to have_button('Name')
+
+ # assert default sorting
+ within '.other-labels' do
+ expect(page.all('.label-list-item').first.text).to include('Bar')
+ expect(page.all('.label-list-item').last.text).to include('Foo')
+ end
+ end
+
+ it 'sorts by date' do
+ click_button 'Name'
+
+ sort_options = find('ul.dropdown-menu-sort li').all('a').collect(&:text)
+
+ expect(sort_options[0]).to eq('Name')
+ expect(sort_options[1]).to eq('Name, descending')
+ expect(sort_options[2]).to eq('Last created')
+ expect(sort_options[3]).to eq('Oldest created')
+ expect(sort_options[4]).to eq('Last updated')
+ expect(sort_options[5]).to eq('Oldest updated')
+
+ click_link 'Name, descending'
+
+ # assert default sorting
+ within '.other-labels' do
+ expect(page.all('.label-list-item').first.text).to include('Foo')
+ expect(page.all('.label-list-item').last.text).to include('Bar')
+ end
+ end
+end
diff --git a/spec/features/projects/members/share_with_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index c6d85e5d22f..fceead0b45e 100644
--- a/spec/features/projects/members/share_with_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe 'Project > Members > Share with Group', :js do
+describe 'Project > Members > Invite group', :js do
include Select2Helper
include ActionView::Helpers::DateHelper
@@ -8,17 +8,16 @@ describe 'Project > Members > Share with Group', :js do
describe 'Share with group lock' do
shared_examples 'the project can be shared with groups' do
- it 'the "Share with group" tab exists' do
+ it 'the "Invite group" tab exists' do
visit project_settings_members_path(project)
- expect(page).to have_selector('#share-with-group-tab')
+ expect(page).to have_selector('#invite-group-tab')
end
end
shared_examples 'the project cannot be shared with groups' do
- it 'the "Share with group" tab does not exist' do
+ it 'the "Invite group" tab does not exist' do
visit project_settings_members_path(project)
- expect(page).to have_selector('#add-member-tab')
- expect(page).not_to have_selector('#share-with-group-tab')
+ expect(page).not_to have_selector('#invite-group-tab')
end
end
@@ -37,11 +36,11 @@ describe 'Project > Members > Share with Group', :js do
it 'the project can be shared with another group' do
visit project_settings_members_path(project)
- click_on 'share-with-group-tab'
+ click_on 'invite-group-tab'
select2 group_to_share_with.id, from: '#link_group_id'
page.find('body').click
- find('.btn-create').click
+ find('.btn-success').click
page.within('.project-members-groups') do
expect(page).to have_content(group_to_share_with.name)
@@ -117,13 +116,13 @@ describe 'Project > Members > Share with Group', :js do
visit project_settings_members_path(project)
- click_on 'share-with-group-tab'
+ click_on 'invite-group-tab'
select2 group.id, from: '#link_group_id'
fill_in 'expires_at_groups', with: (Time.now + 4.5.days).strftime('%Y-%m-%d')
- click_on 'share-with-group-tab'
- find('.btn-create').click
+ click_on 'invite-group-tab'
+ find('.btn-success').click
end
it 'the group link shows the expiration time with a warning class' do
@@ -150,7 +149,7 @@ describe 'Project > Members > Share with Group', :js do
visit project_settings_members_path(project)
- click_link 'Share with group'
+ click_link 'Invite group'
find('.ajax-groups-select.select2-container')
@@ -183,7 +182,7 @@ describe 'Project > Members > Share with Group', :js do
it 'the groups dropdown does not show ancestors', :nested_groups do
visit project_settings_members_path(project)
- click_on 'share-with-group-tab'
+ click_on 'invite-group-tab'
click_link 'Search for a group'
page.within '.select2-drop' do
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index bbe08ff83ff..75c72a68069 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -12,8 +12,9 @@ describe 'New project' do
it 'shows "New project" page', :js do
visit new_project_path
- expect(page).to have_content('Project path')
expect(page).to have_content('Project name')
+ expect(page).to have_content('Project URL')
+ expect(page).to have_content('Project slug')
find('#import-project-tab').click
@@ -65,12 +66,34 @@ describe 'New project' do
end
context 'Readme selector' do
- it 'shows the initialize with Readme checkbox' do
+ it 'shows the initialize with Readme checkbox on "Blank project" tab' do
visit new_project_path
expect(page).to have_css('input#project_initialize_with_readme')
expect(page).to have_content('Initialize repository with a README')
end
+
+ it 'does not show the initialize with Readme checkbox on "Create from template" tab' do
+ visit new_project_path
+ find('#create-from-template-pane').click
+ first('.choose-template').click
+
+ page.within '.project-fields-form' do
+ expect(page).not_to have_css('input#project_initialize_with_readme')
+ expect(page).not_to have_content('Initialize repository with a README')
+ end
+ end
+
+ it 'does not show the initialize with Readme checkbox on "Import project" tab' do
+ visit new_project_path
+ find('#import-project-tab').click
+ first('.js-import-git-toggle-button').click
+
+ page.within '.toggle-import-form' do
+ expect(page).not_to have_css('input#project_initialize_with_readme')
+ expect(page).not_to have_content('Initialize repository with a README')
+ end
+ end
end
context 'Namespace selector' do
@@ -187,7 +210,7 @@ describe 'New project' do
collision_project = create(:project, name: 'test-name-collision', namespace: user.namespace)
fill_in 'project_import_url', with: collision_project.http_url_to_repo
- fill_in 'project_path', with: collision_project.path
+ fill_in 'project_name', with: collision_project.name
click_on 'Create project'
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index a84492ea5f1..049bbca958f 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -31,6 +31,11 @@ describe 'Pipeline', :js do
pipeline: pipeline, stage: 'deploy', name: 'manual-build')
end
+ let!(:build_scheduled) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline, stage: 'deploy', name: 'delayed-job')
+ end
+
let!(:build_external) do
create(:generic_commit_status, status: 'success',
pipeline: pipeline,
@@ -63,6 +68,10 @@ describe 'Pipeline', :js do
expect(page).to have_css('#js-tab-pipeline.active')
end
+ it 'shows link to the pipeline ref' do
+ expect(page).to have_link(pipeline.ref)
+ end
+
it_behaves_like 'showing user status' do
let(:user_with_status) { pipeline.user }
@@ -79,10 +88,12 @@ describe 'Pipeline', :js do
end
end
- it 'should be possible to cancel the running build' do
+ it 'cancels the running build and shows retry button' do
find('#ci-badge-deploy .ci-action-icon-container').click
- expect(page).not_to have_content('Cancel running')
+ page.within('#ci-badge-deploy') do
+ expect(page).to have_css('.js-icon-retry')
+ end
end
end
@@ -105,6 +116,27 @@ describe 'Pipeline', :js do
end
end
+ context 'when pipeline has a delayed job' do
+ it 'shows the scheduled icon and an unschedule action for the delayed job' do
+ page.within('#ci-badge-delayed-job') do
+ expect(page).to have_selector('.js-ci-status-icon-scheduled')
+ expect(page).to have_content('delayed-job')
+ end
+
+ page.within('#ci-badge-delayed-job .ci-action-icon-container.js-icon-time-out') do
+ expect(page).to have_selector('svg')
+ end
+ end
+
+ it 'unschedules the delayed job and shows play button as a manual job' do
+ find('#ci-badge-delayed-job .ci-action-icon-container').click
+
+ page.within('#ci-badge-delayed-job') do
+ expect(page).to have_css('.js-icon-play')
+ end
+ end
+ end
+
context 'when pipeline has failed builds' do
it 'shows the failed icon and a retry action for the failed build' do
page.within('#ci-badge-test') do
@@ -126,7 +158,7 @@ describe 'Pipeline', :js do
it 'should include the failure reason' do
page.within('#ci-badge-test') do
build_link = page.find('.js-pipeline-graph-job-link')
- expect(build_link['data-original-title']).to eq('test - failed <br> (unknown failure)')
+ expect(build_link['data-original-title']).to eq('test - failed - (unknown failure)')
end
end
end
@@ -208,6 +240,20 @@ describe 'Pipeline', :js do
it { expect(page).not_to have_content('Cancel running') }
end
end
+
+ context 'when pipeline ref does not exist in repository anymore' do
+ let(:pipeline) do
+ create(:ci_empty_pipeline, project: project,
+ ref: 'non-existent',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ it 'does not render link to the pipeline ref' do
+ expect(page).not_to have_link(pipeline.ref)
+ expect(page).to have_content(pipeline.ref)
+ end
+ end
end
context 'when user does not have access to read jobs' do
@@ -315,11 +361,23 @@ describe 'Pipeline', :js do
it { expect(build_manual.reload).to be_pending }
end
+ context 'when user unschedules a delayed job' do
+ before do
+ within '.pipeline-holder' do
+ click_link('Unschedule')
+ end
+ end
+
+ it 'unschedules the delayed job and shows play button as a manual job' do
+ expect(page).to have_content('Trigger this manual action')
+ end
+ end
+
context 'failed jobs' do
it 'displays a tooltip with the failure reason' do
page.within('.ci-table') do
failed_job_link = page.find('.ci-failed')
- expect(failed_job_link[:title]).to eq('Failed <br> (unknown failure)')
+ expect(failed_job_link[:title]).to eq('Failed - (unknown failure)')
end
end
end
@@ -330,54 +388,83 @@ describe 'Pipeline', :js do
let(:pipeline_failures_page) { failures_project_pipeline_path(project, pipeline) }
let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline) }
+ subject { visit pipeline_failures_page }
+
context 'with failed build' do
before do
failed_build.trace.set('4 examples, 1 failure')
-
- visit pipeline_failures_page
end
it 'shows jobs tab pane as active' do
+ subject
+
expect(page).to have_content('Failed Jobs')
expect(page).to have_css('#js-tab-failures.active')
end
it 'lists failed builds' do
+ subject
+
expect(page).to have_content(failed_build.name)
expect(page).to have_content(failed_build.stage)
end
it 'shows build failure logs' do
+ subject
+
expect(page).to have_content('4 examples, 1 failure')
end
it 'shows the failure reason' do
+ subject
+
expect(page).to have_content('There is an unknown failure, please try again')
end
- it 'shows retry button for failed build' do
- page.within(find('.build-failures', match: :first)) do
- expect(page).to have_link('Retry')
+ context 'when user does not have permission to retry build' do
+ it 'shows retry button for failed build' do
+ subject
+
+ page.within(find('.build-failures', match: :first)) do
+ expect(page).not_to have_link('Retry')
+ end
end
end
- end
- context 'when missing build logs' do
- before do
- visit pipeline_failures_page
+ context 'when user does have permission to retry build' do
+ before do
+ create(:protected_branch, :developers_can_merge,
+ name: pipeline.ref, project: project)
+ end
+
+ it 'shows retry button for failed build' do
+ subject
+
+ page.within(find('.build-failures', match: :first)) do
+ expect(page).to have_link('Retry')
+ end
+ end
end
+ end
+ context 'when missing build logs' do
it 'shows jobs tab pane as active' do
+ subject
+
expect(page).to have_content('Failed Jobs')
expect(page).to have_css('#js-tab-failures.active')
end
it 'lists failed builds' do
+ subject
+
expect(page).to have_content(failed_build.name)
expect(page).to have_content(failed_build.stage)
end
it 'does not show trace' do
+ subject
+
expect(page).to have_content('No job trace')
end
end
@@ -390,11 +477,9 @@ describe 'Pipeline', :js do
end
context 'when accessing failed jobs page' do
- before do
- visit pipeline_failures_page
- end
-
it 'fails to access the page' do
+ subject
+
expect(page).to have_title('Access Denied')
end
end
@@ -403,11 +488,11 @@ describe 'Pipeline', :js do
context 'without failures' do
before do
failed_build.update!(status: :success)
-
- visit pipeline_failures_page
end
it 'displays the pipeline graph' do
+ subject
+
expect(current_path).to eq(pipeline_path(pipeline))
expect(page).not_to have_content('Failed Jobs')
expect(page).to have_selector('.pipeline-visualization')
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 4a83bcc3efb..17772a35779 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -9,6 +9,7 @@ describe 'Pipelines', :js do
before do
sign_in(user)
project.add_developer(user)
+ project.update!(auto_devops_attributes: { enabled: false })
end
describe 'GET /:project/pipelines' do
@@ -231,6 +232,60 @@ describe 'Pipelines', :js do
end
end
+ context 'when there is a delayed job' do
+ let!(:delayed_job) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline,
+ name: 'delayed job',
+ stage: 'test',
+ commands: 'test')
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'has a dropdown for actionable jobs' do
+ expect(page).to have_selector('.dropdown-new.btn.btn-default .icon-play')
+ end
+
+ it "has link to the delayed job's action" do
+ find('.js-pipeline-dropdown-manual-actions').click
+
+ time_diff = [0, delayed_job.scheduled_at - Time.now].max
+ expect(page).to have_button('delayed job')
+ expect(page).to have_content(Time.at(time_diff).utc.strftime("%H:%M:%S"))
+ end
+
+ context 'when delayed job is expired already' do
+ let!(:delayed_job) do
+ create(:ci_build, :expired_scheduled,
+ pipeline: pipeline,
+ name: 'delayed job',
+ stage: 'test',
+ commands: 'test')
+ end
+
+ it "shows 00:00:00 as the remaining time" do
+ find('.js-pipeline-dropdown-manual-actions').click
+
+ expect(page).to have_content("00:00:00")
+ end
+ end
+
+ context 'when user played a delayed job immediately' do
+ before do
+ find('.js-pipeline-dropdown-manual-actions').click
+ page.accept_confirm { click_button('delayed job') }
+ wait_for_requests
+ end
+
+ it 'enqueues the delayed job', :js do
+ expect(delayed_job.reload).to be_pending
+ end
+ end
+ end
+
context 'for generic statuses' do
context 'when running' do
let!(:running) do
@@ -406,7 +461,7 @@ describe 'Pipelines', :js do
within('.js-builds-dropdown-list') do
build_element = page.find('.mini-pipeline-graph-dropdown-item')
- expect(build_element['data-original-title']).to eq('build - failed <br> (unknown failure)')
+ expect(build_element['data-original-title']).to eq('build - failed - (unknown failure)')
end
end
end
@@ -641,6 +696,7 @@ describe 'Pipelines', :js do
context 'when user is not logged in' do
before do
+ project.update!(auto_devops_attributes: { enabled: false })
visit project_pipelines_path(project)
end
diff --git a/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb b/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
index 25b74cc481d..70f3a812ee9 100644
--- a/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
+++ b/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe 'Setup Mattermost slash commands', :js do
+describe 'Set up Mattermost slash commands', :js do
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:service) { project.create_mattermost_slash_commands_service }
diff --git a/spec/features/projects/settings/integration_settings_spec.rb b/spec/features/projects/settings/integration_settings_spec.rb
index 8745ff72df0..32959969f54 100644
--- a/spec/features/projects/settings/integration_settings_spec.rb
+++ b/spec/features/projects/settings/integration_settings_spec.rb
@@ -51,6 +51,7 @@ describe 'Projects > Settings > Integration settings' do
fill_in 'hook_url', with: url
check 'Tag push events'
+ fill_in 'hook_push_events_branch_filter', with: 'master'
check 'Enable SSL verification'
check 'Job events'
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index 30b0a5578ea..6f8ec0015ad 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -137,5 +137,29 @@ describe "Projects > Settings > Pipelines settings" do
end
end
end
+
+ describe 'runners registration token' do
+ let!(:token) { project.runners_token }
+
+ before do
+ visit project_settings_ci_cd_path(project)
+ end
+
+ it 'has a registration token' do
+ expect(page.find('#registration_token')).to have_content(token)
+ end
+
+ describe 'reload registration token' do
+ let(:page_token) { find('#registration_token').text }
+
+ before do
+ click_button 'Reset runners registration token'
+ end
+
+ it 'changes registration token' do
+ expect(page_token).not_to eq token
+ end
+ end
+ end
end
end
diff --git a/spec/features/projects/settings/project_badges_spec.rb b/spec/features/projects/settings/project_badges_spec.rb
index 2ec94274f80..42b5547d43b 100644
--- a/spec/features/projects/settings/project_badges_spec.rb
+++ b/spec/features/projects/settings/project_badges_spec.rb
@@ -15,7 +15,7 @@ describe 'Project Badges' do
group.add_maintainer(user)
sign_in(user)
- visit(project_settings_badges_path(project))
+ visit(edit_project_path(project))
end
it 'shows a list of badges', :js do
diff --git a/spec/features/projects/settings/user_changes_default_branch_spec.rb b/spec/features/projects/settings/user_changes_default_branch_spec.rb
index e925539351d..fcf05e04a5c 100644
--- a/spec/features/projects/settings/user_changes_default_branch_spec.rb
+++ b/spec/features/projects/settings/user_changes_default_branch_spec.rb
@@ -1,20 +1,35 @@
require 'spec_helper'
describe 'Projects > Settings > User changes default branch' do
+ include Select2Helper
+
let(:user) { create(:user) }
- let(:project) { create(:project, :repository, namespace: user.namespace) }
before do
sign_in(user)
- visit edit_project_path(project)
+
+ visit project_settings_repository_path(project)
end
- it 'allows to change the default branch' do
- select 'fix', from: 'project_default_branch'
- page.within '.general-settings' do
- click_button 'Save changes'
+ context 'with normal project' do
+ let(:project) { create(:project, :repository, namespace: user.namespace) }
+
+ it 'allows to change the default branch', :js do
+ select2('fix', from: '#project_default_branch')
+
+ page.within '#default-branch-settings' do
+ click_button 'Save changes'
+ end
+
+ expect(find('#project_default_branch', visible: false).value).to eq 'fix'
end
+ end
- expect(find(:css, 'select#project_default_branch').value).to eq 'fix'
+ context 'with empty project' do
+ let(:project) { create(:project_empty_repo, namespace: user.namespace) }
+
+ it 'does not show default branch selector' do
+ expect(page).not_to have_selector('#project_default_branch')
+ end
end
end
diff --git a/spec/features/projects/settings/user_manages_group_links_spec.rb b/spec/features/projects/settings/user_manages_group_links_spec.rb
index 2f1824d7849..676659b90c3 100644
--- a/spec/features/projects/settings/user_manages_group_links_spec.rb
+++ b/spec/features/projects/settings/user_manages_group_links_spec.rb
@@ -26,13 +26,13 @@ describe 'Projects > Settings > User manages group links' do
end
end
- it 'shares a project with a group', :js do
- click_link('Share with group')
+ it 'invites a group to a project', :js do
+ click_link('Invite group')
select2(group_market.id, from: '#link_group_id')
select('Maintainer', from: 'link_group_access')
- click_button('Share')
+ click_button('Invite')
page.within('.project-members-groups') do
expect(page).to have_content('Market')
diff --git a/spec/features/projects/settings/user_tags_project_spec.rb b/spec/features/projects/settings/user_tags_project_spec.rb
index 57b4b1287fa..9357215ae6f 100644
--- a/spec/features/projects/settings/user_tags_project_spec.rb
+++ b/spec/features/projects/settings/user_tags_project_spec.rb
@@ -9,15 +9,13 @@ describe 'Projects > Settings > User tags a project' do
visit edit_project_path(project)
end
- context 'when a project is archived' do
- it 'unarchives a project' do
- fill_in 'Tags', with: 'tag1, tag2'
+ it 'sets project tags' do
+ fill_in 'Tags', with: 'tag1, tag2'
- page.within '.general-settings' do
- click_button 'Save changes'
- end
-
- expect(find_field('Tags').value).to eq 'tag1, tag2'
+ page.within '.general-settings' do
+ click_button 'Save changes'
end
+
+ expect(find_field('Tags').value).to eq 'tag1, tag2'
end
end
diff --git a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
new file mode 100644
index 00000000000..baf715000a3
--- /dev/null
+++ b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Project > Show > User interacts with auto devops implicitly enabled banner' do
+ let(:project) { create(:project, :repository) }
+ let(:user) { create(:user) }
+
+ before do
+ project.add_user(user, role)
+ sign_in(user)
+ end
+
+ context 'when user does not have maintainer access' do
+ let(:role) { :developer }
+
+ context 'when AutoDevOps is implicitly enabled' do
+ it 'does not display AutoDevOps implicitly enabled banner' do
+ expect(page).not_to have_css('.auto-devops-implicitly-enabled-banner')
+ end
+ end
+ end
+
+ context 'when user has mantainer access' do
+ let(:role) { :maintainer }
+
+ context 'when AutoDevOps is implicitly enabled' do
+ before do
+ stub_application_setting(auto_devops_enabled: true)
+
+ visit project_path(project)
+ end
+
+ it 'display AutoDevOps implicitly enabled banner' do
+ expect(page).to have_css('.auto-devops-implicitly-enabled-banner')
+ end
+
+ context 'when user dismisses the banner', :js do
+ it 'does not display AutoDevOps implicitly enabled banner' do
+ find('.hide-auto-devops-implicitly-enabled-banner').click
+ wait_for_requests
+ visit project_path(project)
+
+ expect(page).not_to have_css('.auto-devops-implicitly-enabled-banner')
+ end
+ end
+ end
+
+ context 'when AutoDevOps is not implicitly enabled' do
+ before do
+ stub_application_setting(auto_devops_enabled: false)
+
+ visit project_path(project)
+ end
+
+ it 'does not display AutoDevOps implicitly enabled banner' do
+ expect(page).not_to have_css('.auto-devops-implicitly-enabled-banner')
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb
index 0405e21a0d7..df2b492ae6b 100644
--- a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb
+++ b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
describe 'Projects > Show > User sees setup shortcut buttons' do
- # For "New file", "Add License" functionality,
+ # For "New file", "Add license" functionality,
# see spec/features/projects/files/project_owner_creates_license_file_spec.rb
# see spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -28,8 +28,6 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
end
it '"Auto DevOps enabled" button not linked' do
- project.create_auto_devops!(enabled: true)
-
visit project_path(project)
page.within('.project-stats') do
@@ -58,26 +56,30 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
end
end
- it '"Add License" button linked to new file populated for a license' do
- page.within('.project-stats') do
- expect(page).to have_link('Add License', href: presenter.add_license_path)
+ it '"Add license" button linked to new file populated for a license' do
+ page.within('.project-metadata') do
+ expect(page).to have_link('Add license', href: presenter.add_license_path)
end
end
describe 'Auto DevOps button' do
- it '"Enable Auto DevOps" button linked to settings page' do
- page.within('.project-stats') do
- expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ context 'when Auto DevOps is enabled' do
+ it '"Auto DevOps enabled" anchor linked to settings page' do
+ visit project_path(project)
+
+ page.within('.project-stats') do
+ expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ end
end
end
- it '"Auto DevOps enabled" anchor linked to settings page' do
- project.create_auto_devops!(enabled: true)
+ context 'when Auto DevOps is not enabled' do
+ let(:project) { create(:project, :public, :empty_repo, auto_devops_attributes: { enabled: false }) }
- visit project_path(project)
-
- page.within('.project-stats') do
- expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ it '"Enable Auto DevOps" button linked to settings page' do
+ page.within('.project-stats') do
+ expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ end
end
end
end
@@ -113,27 +115,31 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
visit project_path(project)
end
- it 'no Auto DevOps button if can not manage pipelines' do
- page.within('.project-stats') do
- expect(page).not_to have_link('Enable Auto DevOps')
- expect(page).not_to have_link('Auto DevOps enabled')
+ context 'when Auto DevOps is enabled' do
+ it '"Auto DevOps enabled" button not linked' do
+ visit project_path(project)
+
+ page.within('.project-stats') do
+ expect(page).to have_text('Auto DevOps enabled')
+ end
end
end
- it '"Auto DevOps enabled" button not linked' do
- project.create_auto_devops!(enabled: true)
-
- visit project_path(project)
+ context 'when Auto DevOps is not enabled' do
+ let(:project) { create(:project, :public, :repository, auto_devops_attributes: { enabled: false }) }
- page.within('.project-stats') do
- expect(page).to have_text('Auto DevOps enabled')
+ it 'no Auto DevOps button if can not manage pipelines' do
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Enable Auto DevOps')
+ expect(page).not_to have_link('Auto DevOps enabled')
+ end
end
- end
- it 'no Kubernetes cluster button if can not manage clusters' do
- page.within('.project-stats') do
- expect(page).not_to have_link('Add Kubernetes cluster')
- expect(page).not_to have_link('Kubernetes configured')
+ it 'no Kubernetes cluster button if can not manage clusters' do
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Add Kubernetes cluster')
+ expect(page).not_to have_link('Kubernetes configured')
+ end
end
end
end
@@ -201,13 +207,13 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
end
end
- it 'no "Add License" button if the project already has a license' do
+ it 'no "Add license" button if the project already has a license' do
visit project_path(project)
expect(project.repository.license_blob).not_to be_nil
page.within('.project-stats') do
- expect(page).not_to have_link('Add License')
+ expect(page).not_to have_link('Add license')
end
end
@@ -222,97 +228,105 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
end
describe 'GitLab CI configuration button' do
- it '"Set up CI/CD" button linked to new file populated for a .gitlab-ci.yml' do
- visit project_path(project)
-
- expect(project.repository.gitlab_ci_yml).to be_nil
+ context 'when Auto DevOps is enabled' do
+ it 'no "Set up CI/CD" button if the project has Auto DevOps enabled' do
+ visit project_path(project)
- page.within('.project-stats') do
- expect(page).to have_link('Set up CI/CD', href: presenter.add_ci_yml_path)
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Set up CI/CD')
+ end
end
end
- it 'no "Set up CI/CD" button if the project already has a .gitlab-ci.yml' do
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab-ci.yml",
- file_path: '.gitlab-ci.yml',
- file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
- ).execute
+ context 'when Auto DevOps is not enabled' do
+ let(:project) { create(:project, :public, :repository, auto_devops_attributes: { enabled: false }) }
- expect(project.repository.gitlab_ci_yml).not_to be_nil
+ it '"Set up CI/CD" button linked to new file populated for a .gitlab-ci.yml' do
+ visit project_path(project)
- visit project_path(project)
+ expect(project.repository.gitlab_ci_yml).to be_nil
- page.within('.project-stats') do
- expect(page).not_to have_link('Set up CI/CD')
+ page.within('.project-stats') do
+ expect(page).to have_link('Set up CI/CD', href: presenter.add_ci_yml_path)
+ end
end
- end
- it 'no "Set up CI/CD" button if the project has Auto DevOps enabled' do
- project.create_auto_devops!(enabled: true)
+ it 'no "Set up CI/CD" button if the project already has a .gitlab-ci.yml' do
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add .gitlab-ci.yml",
+ file_path: '.gitlab-ci.yml',
+ file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
+ ).execute
- visit project_path(project)
+ expect(project.repository.gitlab_ci_yml).not_to be_nil
- page.within('.project-stats') do
- expect(page).not_to have_link('Set up CI/CD')
+ visit project_path(project)
+
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Set up CI/CD')
+ end
end
end
end
describe 'Auto DevOps button' do
- it '"Enable Auto DevOps" button linked to settings page' do
- visit project_path(project)
+ context 'when Auto DevOps is enabled' do
+ it '"Auto DevOps enabled" anchor linked to settings page' do
+ visit project_path(project)
- page.within('.project-stats') do
- expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ page.within('.project-stats') do
+ expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ end
end
end
- it '"Enable Auto DevOps" button linked to settings page' do
- project.create_auto_devops!(enabled: true)
+ context 'when Auto DevOps is not enabled' do
+ let(:project) { create(:project, :public, :repository, auto_devops_attributes: { enabled: false }) }
- visit project_path(project)
+ it '"Enable Auto DevOps" button linked to settings page' do
+ visit project_path(project)
- page.within('.project-stats') do
- expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ page.within('.project-stats') do
+ expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
+ end
end
- end
- it 'no Auto DevOps button if Auto DevOps callout is shown' do
- allow_any_instance_of(AutoDevopsHelper).to receive(:show_auto_devops_callout?).and_return(true)
+ it 'no Auto DevOps button if Auto DevOps callout is shown' do
+ allow_any_instance_of(AutoDevopsHelper).to receive(:show_auto_devops_callout?).and_return(true)
- visit project_path(project)
+ visit project_path(project)
- expect(page).to have_selector('.js-autodevops-banner')
+ expect(page).to have_selector('.js-autodevops-banner')
- page.within('.project-stats') do
- expect(page).not_to have_link('Enable Auto DevOps')
- expect(page).not_to have_link('Auto DevOps enabled')
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Enable Auto DevOps')
+ expect(page).not_to have_link('Auto DevOps enabled')
+ end
end
- end
- it 'no "Enable Auto DevOps" button when .gitlab-ci.yml already exists' do
- Files::CreateService.new(
- project,
- project.creator,
- start_branch: 'master',
- branch_name: 'master',
- commit_message: "Add .gitlab-ci.yml",
- file_path: '.gitlab-ci.yml',
- file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
- ).execute
+ it 'no "Enable Auto DevOps" button when .gitlab-ci.yml already exists' do
+ Files::CreateService.new(
+ project,
+ project.creator,
+ start_branch: 'master',
+ branch_name: 'master',
+ commit_message: "Add .gitlab-ci.yml",
+ file_path: '.gitlab-ci.yml',
+ file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
+ ).execute
- expect(project.repository.gitlab_ci_yml).not_to be_nil
+ expect(project.repository.gitlab_ci_yml).not_to be_nil
- visit project_path(project)
+ visit project_path(project)
- page.within('.project-stats') do
- expect(page).not_to have_link('Enable Auto DevOps')
- expect(page).not_to have_link('Auto DevOps enabled')
+ page.within('.project-stats') do
+ expect(page).not_to have_link('Enable Auto DevOps')
+ expect(page).not_to have_link('Auto DevOps enabled')
+ end
end
end
end
@@ -336,41 +350,6 @@ describe 'Projects > Show > User sees setup shortcut buttons' do
end
end
end
-
- describe '"Set up Koding" button' do
- it 'no "Set up Koding" button if Koding disabled' do
- stub_application_setting(koding_enabled?: false)
-
- visit project_path(project)
-
- page.within('.project-stats') do
- expect(page).not_to have_link('Set up Koding')
- end
- end
-
- it 'no "Set up Koding" button if the project already has a .koding.yml' do
- stub_application_setting(koding_enabled?: true)
- allow(Gitlab::CurrentSettings.current_application_settings).to receive(:koding_url).and_return('http://koding.example.com')
- expect(project.repository.changelog).not_to be_nil
- allow_any_instance_of(Repository).to receive(:koding_yml).and_return(project.repository.changelog)
-
- visit project_path(project)
-
- page.within('.project-stats') do
- expect(page).not_to have_link('Set up Koding')
- end
- end
-
- it '"Set up Koding" button linked to new file populated for a .koding.yml' do
- stub_application_setting(koding_enabled?: true)
-
- visit project_path(project)
-
- page.within('.project-stats') do
- expect(page).to have_link('Set up Koding', href: presenter.add_koding_stack_path)
- end
- end
- end
end
end
end
diff --git a/spec/features/projects/tags/user_views_tags_spec.rb b/spec/features/projects/tags/user_views_tags_spec.rb
new file mode 100644
index 00000000000..f344b682715
--- /dev/null
+++ b/spec/features/projects/tags/user_views_tags_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe 'User views tags', :feature do
+ context 'rss' do
+ shared_examples 'has access to the tags RSS feed' do
+ it do
+ visit project_tags_path(project, format: :atom)
+
+ expect(page).to have_gitlab_http_status(200)
+ end
+ end
+
+ shared_examples 'does not have access to the tags RSS feed' do
+ it do
+ visit project_tags_path(project, format: :atom)
+
+ expect(page).to have_gitlab_http_status(401)
+ end
+ end
+
+ context 'when project public' do
+ let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
+
+ context 'when user signed in' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ visit project_tags_path(project)
+ end
+
+ it_behaves_like "it has an RSS button with current_user's feed token"
+ it_behaves_like "an autodiscoverable RSS feed with current_user's feed token"
+ it_behaves_like 'has access to the tags RSS feed'
+ end
+
+ context 'when user signed out' do
+ before do
+ visit project_tags_path(project)
+ end
+
+ it_behaves_like 'it has an RSS button without a feed token'
+ it_behaves_like 'an autodiscoverable RSS feed without a feed token'
+ it_behaves_like 'has access to the tags RSS feed'
+ end
+ end
+
+ context 'when project is not public' do
+ let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
+
+ context 'when user signed in' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ it_behaves_like 'has access to the tags RSS feed'
+ end
+
+ context 'when user signed out' do
+ it_behaves_like 'does not have access to the tags RSS feed'
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/tree/create_directory_spec.rb b/spec/features/projects/tree/create_directory_spec.rb
index 9e58280b868..2cb2a23b7be 100644
--- a/spec/features/projects/tree/create_directory_spec.rb
+++ b/spec/features/projects/tree/create_directory_spec.rb
@@ -43,7 +43,7 @@ describe 'Multi-file editor new directory', :js do
find('.js-ide-commit-mode').click
find('.multi-file-commit-list-item').hover
- first('.multi-file-discard-btn .btn').click
+ click_button 'Stage'
fill_in('commit-message', with: 'commit message ide')
diff --git a/spec/features/projects/tree/create_file_spec.rb b/spec/features/projects/tree/create_file_spec.rb
index a04d3566a7e..9f5524da8e9 100644
--- a/spec/features/projects/tree/create_file_spec.rb
+++ b/spec/features/projects/tree/create_file_spec.rb
@@ -35,7 +35,7 @@ describe 'Multi-file editor new file', :js do
find('.js-ide-commit-mode').click
find('.multi-file-commit-list-item').hover
- first('.multi-file-discard-btn .btn').click
+ click_button 'Stage'
fill_in('commit-message', with: 'commit message ide')
diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb
index 8ae036cd29f..45e81e1c040 100644
--- a/spec/features/projects/tree/tree_show_spec.rb
+++ b/spec/features/projects/tree/tree_show_spec.rb
@@ -4,16 +4,30 @@ describe 'Projects tree', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
+ # This commit has a known state on the master branch of gitlab-test
+ let(:test_sha) { '7975be0116940bf2ad4321f79d02a55c5f7779aa' }
+
before do
project.add_maintainer(user)
sign_in(user)
end
it 'renders tree table without errors' do
- visit project_tree_path(project, 'master')
+ visit project_tree_path(project, test_sha)
+ wait_for_requests
+
+ expect(page).to have_selector('.tree-item')
+ expect(page).to have_content('add tests for .gitattributes custom highlighting')
+ expect(page).not_to have_selector('.flash-alert')
+ expect(page).not_to have_selector('.label-lfs', text: 'LFS')
+ end
+
+ it 'renders tree table for a subtree without errors' do
+ visit project_tree_path(project, File.join(test_sha, 'files'))
wait_for_requests
expect(page).to have_selector('.tree-item')
+ expect(page).to have_content('add spaces in whitespace file')
expect(page).not_to have_selector('.label-lfs', text: 'LFS')
expect(page).not_to have_selector('.flash-alert')
end
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index 83d18996f4e..8d7e2883b2a 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -11,7 +11,7 @@ describe 'User creates a project', :js do
it 'creates a new project' do
visit(new_project_path)
- fill_in(:project_path, with: 'Empty')
+ fill_in(:project_name, with: 'Empty')
page.within('#content-body') do
click_button('Create project')
@@ -37,6 +37,7 @@ describe 'User creates a project', :js do
it 'creates a new project' do
visit(new_project_path)
+ fill_in :project_name, with: 'A Subgroup Project'
fill_in :project_path, with: 'a-subgroup-project'
page.find('.js-select-namespace').click
@@ -46,7 +47,7 @@ describe 'User creates a project', :js do
click_button('Create project')
end
- expect(page).to have_content("Project 'a-subgroup-project' was successfully created")
+ expect(page).to have_content("Project 'A Subgroup Project' was successfully created")
project = Project.last
diff --git a/spec/features/projects/view_on_env_spec.rb b/spec/features/projects/view_on_env_spec.rb
index a48ad94e9fa..7bfcd46713e 100644
--- a/spec/features/projects/view_on_env_spec.rb
+++ b/spec/features/projects/view_on_env_spec.rb
@@ -44,7 +44,7 @@ describe 'View on environment', :js do
context 'and an active deployment' do
let(:sha) { project.commit(branch_name).sha }
let(:environment) { create(:environment, project: project, name: 'review/feature', external_url: 'http://feature.review.example.com') }
- let!(:deployment) { create(:deployment, environment: environment, ref: branch_name, sha: sha) }
+ let!(:deployment) { create(:deployment, :success, environment: environment, ref: branch_name, sha: sha) }
context 'when visiting the diff of a merge request for the branch' do
let(:merge_request) { create(:merge_request, :simple, source_project: project, source_branch: branch_name) }
diff --git a/spec/features/projects/wiki/markdown_preview_spec.rb b/spec/features/projects/wiki/markdown_preview_spec.rb
index ed5f8105487..f505023d1d0 100644
--- a/spec/features/projects/wiki/markdown_preview_spec.rb
+++ b/spec/features/projects/wiki/markdown_preview_spec.rb
@@ -162,6 +162,34 @@ describe 'Projects > Wiki > User previews markdown changes', :js do
expect(page.html).to include("<a href=\"/#{project.full_path}/wikis/title%20with%20spaces\">spaced link</a>")
end
end
+
+ context 'when rendering the preview' do
+ it 'renders content with CommonMark' do
+ create_wiki_page 'a-page/b-page/c-page/common-mark'
+ click_link 'Edit'
+
+ fill_in :wiki_content, with: "1. one\n - sublist\n"
+ click_on "Preview"
+
+ # the above generates two seperate lists (not embedded) in CommonMark
+ expect(page).to have_content("sublist")
+ expect(page).not_to have_xpath("//ol//li//ul")
+ end
+
+ it 'renders content with RedCarpet when legacy_render is set' do
+ wiki_page = create(:wiki_page,
+ wiki: project.wiki,
+ attrs: { title: 'home', content: "Empty content" })
+ visit(project_wiki_edit_path(project, wiki_page, legacy_render: 1))
+
+ fill_in :wiki_content, with: "1. one\n - sublist\n"
+ click_on "Preview"
+
+ # the above generates a sublist list in RedCarpet
+ expect(page).to have_content("sublist")
+ expect(page).to have_xpath("//ol//li//ul")
+ end
+ end
end
it "does not linkify double brackets inside code blocks as expected" do
diff --git a/spec/features/projects/wiki/user_creates_wiki_page_spec.rb b/spec/features/projects/wiki/user_creates_wiki_page_spec.rb
index 149eeb4f9ba..b30286e4446 100644
--- a/spec/features/projects/wiki/user_creates_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_creates_wiki_page_spec.rb
@@ -146,6 +146,8 @@ describe "User creates wiki page" do
expect(page).to have_selector(".katex", count: 3).and have_content("2+2 is 4")
end
end
+
+ it_behaves_like 'wiki file attachments'
end
context "in a group namespace", :js do
diff --git a/spec/features/projects/wiki/user_deletes_wiki_page_spec.rb b/spec/features/projects/wiki/user_deletes_wiki_page_spec.rb
index 5007794cd77..18ccd31f3d0 100644
--- a/spec/features/projects/wiki/user_deletes_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_deletes_wiki_page_spec.rb
@@ -13,7 +13,7 @@ describe 'User deletes wiki page', :js do
it 'deletes a page' do
click_on('Edit')
click_on('Delete')
- find('.js-modal-primary-action').click
+ find('.modal-footer .btn-danger').click
expect(page).to have_content('Page was successfully deleted')
end
diff --git a/spec/features/projects/wiki/user_updates_wiki_page_spec.rb b/spec/features/projects/wiki/user_updates_wiki_page_spec.rb
index 2840d28cf30..2ce5ee0e87d 100644
--- a/spec/features/projects/wiki/user_updates_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_updates_wiki_page_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe 'User updates wiki page' do
shared_examples 'wiki page user update' do
let(:user) { create(:user) }
+
before do
project.add_maintainer(user)
sign_in(user)
@@ -55,6 +56,8 @@ describe 'User updates wiki page' do
expect(page).to have_content('Updated Wiki Content')
end
+
+ it_behaves_like 'wiki file attachments'
end
end
@@ -64,14 +67,14 @@ describe 'User updates wiki page' do
before do
visit(project_wikis_path(project))
+
+ click_link('Edit')
end
context 'in a user namespace' do
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
it 'updates a page' do
- click_link('Edit')
-
# Commit message field should have correct value.
expect(page).to have_field('wiki[message]', with: 'Update home')
@@ -84,8 +87,6 @@ describe 'User updates wiki page' do
end
it 'shows a validation error message' do
- click_link('Edit')
-
fill_in(:wiki_content, with: '')
click_button('Save changes')
@@ -97,8 +98,6 @@ describe 'User updates wiki page' do
end
it 'shows the emoji autocompletion dropdown', :js do
- click_link('Edit')
-
find('#wiki_content').native.send_keys('')
fill_in(:wiki_content, with: ':')
@@ -106,8 +105,6 @@ describe 'User updates wiki page' do
end
it 'shows the error message' do
- click_link('Edit')
-
wiki_page.update(content: 'Update')
click_button('Save changes')
@@ -116,30 +113,27 @@ describe 'User updates wiki page' do
end
it 'updates a page' do
- click_on('Edit')
fill_in('Content', with: 'Updated Wiki Content')
click_on('Save changes')
expect(page).to have_content('Updated Wiki Content')
end
- it 'cancels edititng of a page' do
- click_on('Edit')
-
+ it 'cancels editing of a page' do
page.within(:css, '.wiki-form .form-actions') do
click_on('Cancel')
end
expect(current_path).to eq(project_wiki_path(project, wiki_page))
end
+
+ it_behaves_like 'wiki file attachments'
end
context 'in a group namespace' do
let(:project) { create(:project, :wiki_repo, namespace: create(:group, :public)) }
it 'updates a page' do
- click_link('Edit')
-
# Commit message field should have correct value.
expect(page).to have_field('wiki[message]', with: 'Update home')
@@ -151,6 +145,8 @@ describe 'User updates wiki page' do
expect(page).to have_content("Last edited by #{user.name}")
expect(page).to have_content('My awesome wiki!')
end
+
+ it_behaves_like 'wiki file attachments'
end
end
@@ -222,6 +218,8 @@ describe 'User updates wiki page' do
expect(current_path).to eq(project_wiki_path(project, "foo1/bar1/#{page_name}"))
end
+
+ it_behaves_like 'wiki file attachments'
end
end
diff --git a/spec/features/projects/wiki/user_views_wiki_empty_spec.rb b/spec/features/projects/wiki/user_views_wiki_empty_spec.rb
index 83ffbb4a94e..e94b3a9432b 100644
--- a/spec/features/projects/wiki/user_views_wiki_empty_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_empty_spec.rb
@@ -54,7 +54,7 @@ describe 'User views empty wiki' do
it_behaves_like 'empty wiki and non-accessible issues'
end
- context 'when user is logged in and a memeber' do
+ context 'when user is logged in and a member' do
let(:project) { create(:project, :public, :wiki_repo) }
before do
diff --git a/spec/features/projects/wiki/user_views_wiki_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
index 760324adacc..4b974a3ca10 100644
--- a/spec/features/projects/wiki/user_views_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
@@ -2,12 +2,15 @@ require 'spec_helper'
describe 'User views a wiki page' do
shared_examples 'wiki page user view' do
+ include WikiHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
+ let(:path) { 'image.png' }
let(:wiki_page) do
create(:wiki_page,
wiki: project.wiki,
- attrs: { title: 'home', content: 'Look at this [image](image.jpg)\n\n ![alt text](image.jpg)' })
+ attrs: { title: 'home', content: "Look at this [image](#{path})\n\n ![alt text](#{path})" })
end
before do
@@ -82,32 +85,26 @@ describe 'User views a wiki page' do
expect(find('.wiki-pages')).to have_content(wiki_page.title.capitalize)
end
- it 'shows a file stored in a page' do
- gollum_file_double = double('Gollum::File',
- mime_type: 'image/jpeg',
- name: 'images/image.jpg',
- path: 'images/image.jpg',
- raw_data: '')
- wiki_file = Gitlab::Git::WikiFile.new(gollum_file_double)
-
- allow(wiki_file).to receive(:mime_type).and_return('image/jpeg')
- allow_any_instance_of(ProjectWiki).to receive(:find_file).with('image.jpg', nil).and_return(wiki_file)
+ context 'shows a file stored in a page' do
+ let(:path) { upload_file_to_wiki(project, user, 'dk.png') }
- expect(page).to have_xpath('//img[@data-src="image.jpg"]')
- expect(page).to have_link('image', href: "#{project.wiki.wiki_base_path}/image.jpg")
+ it do
+ expect(page).to have_xpath("//img[@data-src='#{project.wiki.wiki_base_path}/#{path}']")
+ expect(page).to have_link('image', href: "#{project.wiki.wiki_base_path}/#{path}")
- click_on('image')
+ click_on('image')
- expect(current_path).to match('wikis/image.jpg')
- expect(page).not_to have_xpath('/html') # Page should render the image which means there is no html involved
+ expect(current_path).to match("wikis/#{path}")
+ expect(page).not_to have_xpath('/html') # Page should render the image which means there is no html involved
+ end
end
it 'shows the creation page if file does not exist' do
- expect(page).to have_link('image', href: "#{project.wiki.wiki_base_path}/image.jpg")
+ expect(page).to have_link('image', href: "#{project.wiki.wiki_base_path}/#{path}")
click_on('image')
- expect(current_path).to match('wikis/image.jpg')
+ expect(current_path).to match("wikis/#{path}")
expect(page).to have_content('New Wiki Page')
expect(page).to have_content('Create page')
end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 56ed0c936a6..0add129dde2 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe 'Project' do
include ProjectForksHelper
+ include MobileHelpers
describe 'creating from template' do
let(:user) { create(:user) }
@@ -15,7 +16,7 @@ describe 'Project' do
it "allows creation from templates", :js do
find('#create-from-template-tab').click
find("label[for=#{template.name}]").click
- fill_in("project_path", with: template.name)
+ fill_in("project_name", with: template.name)
page.within '#content-body' do
click_button "Create project"
@@ -54,25 +55,72 @@ describe 'Project' do
it 'parses Markdown' do
project.update_attribute(:description, 'This is **my** project')
visit path
- expect(page).to have_css('.project-home-desc > p > strong')
+ expect(page).to have_css('.project-description > .project-description-markdown > p > strong')
end
it 'passes through html-pipeline' do
project.update_attribute(:description, 'This project is the :poop:')
visit path
- expect(page).to have_css('.project-home-desc > p > gl-emoji')
+ expect(page).to have_css('.project-description > .project-description-markdown > p > gl-emoji')
end
it 'sanitizes unwanted tags' do
project.update_attribute(:description, "```\ncode\n```")
visit path
- expect(page).not_to have_css('.project-home-desc code')
+ expect(page).not_to have_css('.project-description code')
end
it 'permits `rel` attribute on links' do
project.update_attribute(:description, 'https://google.com/')
visit path
- expect(page).to have_css('.project-home-desc a[rel]')
+ expect(page).to have_css('.project-description a[rel]')
+ end
+
+ context 'read more', :js do
+ let(:read_more_selector) { '.read-more-container' }
+ let(:read_more_trigger_selector) { '.project-home-desc .js-read-more-trigger' }
+
+ it 'does not display "read more" link on desktop breakpoint' do
+ project.update_attribute(:description, 'This is **my** project')
+ visit path
+
+ expect(find(read_more_trigger_selector, visible: false)).not_to be_visible
+ end
+
+ it 'displays "read more" link on mobile breakpoint' do
+ project.update_attribute(:description, 'This is **my** project')
+ visit path
+ resize_screen_xs
+
+ find(read_more_trigger_selector).click
+
+ expect(page).to have_css('.project-description .is-expanded')
+ end
+ end
+ end
+
+ describe 'copy clone URL to clipboard', :js do
+ let(:project) { create(:project, :repository) }
+ let(:path) { project_path(project) }
+
+ before do
+ sign_in(create(:admin))
+ visit path
+ end
+
+ context 'desktop component' do
+ it 'shows on md and larger breakpoints' do
+ expect(find('.git-clone-holder')).to be_visible
+ expect(find('.mobile-git-clone', visible: false)).not_to be_visible
+ end
+ end
+
+ context 'mobile component' do
+ it 'shows mobile component on sm and smaller breakpoints' do
+ resize_screen_xs
+ expect(find('.mobile-git-clone')).to be_visible
+ expect(find('.git-clone-holder', visible: false)).not_to be_visible
+ end
end
end
@@ -145,6 +193,23 @@ describe 'Project' do
end
end
+ describe 'when the project repository is disabled', :js do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository_disabled, :repository, namespace: user.namespace) }
+
+ before do
+ sign_in(user)
+ project.add_maintainer(user)
+ visit project_path(project)
+ end
+
+ it 'does not show an error' do
+ wait_for_requests
+
+ expect(page).not_to have_selector('.flash-alert')
+ end
+ end
+
describe 'removal', :js do
let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) }
@@ -257,6 +322,22 @@ describe 'Project' do
end
end
+ context 'content is not cached after signing out', :js do
+ let(:user) { create(:user, project_view: 'activity') }
+ let(:project) { create(:project, :repository) }
+
+ it 'does not load activity', :js do
+ project.add_maintainer(user)
+ sign_in(user)
+ visit project_path(project)
+ sign_out(user)
+
+ page.evaluate_script('window.history.back()')
+
+ expect(page).not_to have_selector('.event-item')
+ end
+ end
+
def remove_with_confirm(button_text, confirm_with)
click_button button_text
fill_in 'confirm_name_input', with: confirm_with
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 0c6cf3dc477..cb7a912946c 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -198,7 +198,7 @@ describe 'Runners' do
expect(page).to have_content 'This group does not provide any group Runners yet'
expect(page).to have_content 'Group maintainers can register group runners in the Group CI/CD settings'
- expect(page).not_to have_content 'Ask your group maintainer to setup a group Runner'
+ expect(page).not_to have_content 'Ask your group maintainer to set up a group Runner'
end
end
end
@@ -224,7 +224,7 @@ describe 'Runners' do
expect(page).to have_content 'This group does not provide any group Runners yet.'
expect(page).not_to have_content 'Group maintainers can register group runners in the Group CI/CD settings'
- expect(page).to have_content 'Ask your group maintainer to setup a group Runner.'
+ expect(page).to have_content 'Ask your group maintainer to set up a group Runner.'
end
end
diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb
index 3ee753b7d23..7225ca65492 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe 'User searches for wiki pages', :js do
let(:user) { create(:user) }
- let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
+ let(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
let!(:wiki_page) { create(:wiki_page, wiki: project.wiki, attrs: { title: 'test_wiki', content: 'Some Wiki content' }) }
before do
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb
index af38f77c0c6..444de26733f 100644
--- a/spec/features/search/user_uses_header_search_field_spec.rb
+++ b/spec/features/search/user_uses_header_search_field_spec.rb
@@ -21,13 +21,17 @@ describe 'User uses header search field' do
it 'shows assigned issues' do
find('.search-input-container .dropdown-menu').click_link('Issues assigned to me')
- expect(find('.js-assignee-search')).to have_content(user.name)
+ expect(page).to have_selector('.filtered-search')
+ expect_tokens([assignee_token(user.name)])
+ expect_filtered_search_input_empty
end
it 'shows created issues' do
find('.search-input-container .dropdown-menu').click_link("Issues I've created")
- expect(find('.js-author-search')).to have_content(user.name)
+ expect(page).to have_selector('.filtered-search')
+ expect_tokens([author_token(user.name)])
+ expect_filtered_search_input_empty
end
end
@@ -37,13 +41,17 @@ describe 'User uses header search field' do
it 'shows assigned merge requests' do
find('.search-input-container .dropdown-menu').click_link('Merge requests assigned to me')
- expect(find('.js-assignee-search')).to have_content(user.name)
+ expect(page).to have_selector('.filtered-search')
+ expect_tokens([assignee_token(user.name)])
+ expect_filtered_search_input_empty
end
it 'shows created merge requests' do
find('.search-input-container .dropdown-menu').click_link("Merge requests I've created")
- expect(find('.js-author-search')).to have_content(user.name)
+ expect(page).to have_selector('.filtered-search')
+ expect_tokens([author_token(user.name)])
+ expect_filtered_search_input_empty
end
end
end
diff --git a/spec/features/search/user_uses_search_filters_spec.rb b/spec/features/search/user_uses_search_filters_spec.rb
index 66afe163447..0725ff178ac 100644
--- a/spec/features/search/user_uses_search_filters_spec.rb
+++ b/spec/features/search/user_uses_search_filters_spec.rb
@@ -14,7 +14,7 @@ describe 'User uses search filters', :js do
visit(search_path)
end
- context' when filtering by group' do
+ context 'when filtering by group' do
it 'shows group projects' do
find('.js-search-group-dropdown').click
@@ -36,7 +36,7 @@ describe 'User uses search filters', :js do
end
end
- context' when filtering by project' do
+ context 'when filtering by project' do
it 'shows a project' do
page.within('.project-filter') do
find('.js-search-project-dropdown').click
diff --git a/spec/features/security/dashboard_access_spec.rb b/spec/features/security/dashboard_access_spec.rb
index 149bd32e736..0c893e65d9c 100644
--- a/spec/features/security/dashboard_access_spec.rb
+++ b/spec/features/security/dashboard_access_spec.rb
@@ -43,20 +43,6 @@ describe "Dashboard access" do
it { is_expected.to be_allowed_for :visitor }
end
- describe "GET /koding" do
- subject { koding_path }
-
- context 'with Koding enabled' do
- before do
- stub_application_setting(koding_enabled?: true)
- end
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
- end
-
describe "GET /projects/new" do
it { expect(new_project_path).to be_allowed_for :admin }
it { expect(new_project_path).to be_allowed_for :user }
diff --git a/spec/features/snippets/notes_on_personal_snippets_spec.rb b/spec/features/snippets/notes_on_personal_snippets_spec.rb
index 1442e011d52..eeacaf5f72a 100644
--- a/spec/features/snippets/notes_on_personal_snippets_spec.rb
+++ b/spec/features/snippets/notes_on_personal_snippets_spec.rb
@@ -103,7 +103,7 @@ describe 'Comments on personal snippets', :js do
page.within('.current-note-edit-form') do
fill_in 'note[note]', with: 'new content'
- find('.btn-save').click
+ find('.btn-success').click
end
page.within("#notes-list li#note_#{snippet_notes[0].id}") do
diff --git a/spec/features/snippets/show_spec.rb b/spec/features/snippets/show_spec.rb
index 3fe0b60b18f..367a479f62a 100644
--- a/spec/features/snippets/show_spec.rb
+++ b/spec/features/snippets/show_spec.rb
@@ -68,23 +68,45 @@ describe 'Snippet', :js do
end
end
- context 'with cached Redcarpet html' do
- let(:snippet) { create(:personal_snippet, :public, file_name: file_name, content: content, cached_markdown_version: CacheMarkdownField::CACHE_REDCARPET_VERSION) }
+ context 'Markdown rendering' do
+ let(:snippet) { create(:personal_snippet, :public, file_name: file_name, content: content) }
let(:file_name) { 'test.md' }
let(:content) { "1. one\n - sublist\n" }
- it 'renders correctly' do
- expect(page).to have_xpath("//ol//li//ul")
+ context 'when rendering default markdown' do
+ it 'renders using CommonMark' do
+ expect(page).to have_content("sublist")
+ expect(page).not_to have_xpath("//ol//li//ul")
+ end
end
- end
- context 'with cached CommonMark html' do
- let(:snippet) { create(:personal_snippet, :public, file_name: file_name, content: content, cached_markdown_version: CacheMarkdownField::CACHE_COMMONMARK_VERSION) }
- let(:file_name) { 'test.md' }
- let(:content) { "1. one\n - sublist\n" }
+ context 'when rendering legacy markdown' do
+ before do
+ visit snippet_path(snippet, legacy_render: 1)
- it 'renders correctly' do
- expect(page).not_to have_xpath("//ol//li//ul")
+ wait_for_requests
+ end
+
+ it 'renders using RedCarpet' do
+ expect(page).to have_content("sublist")
+ expect(page).to have_xpath("//ol//li//ul")
+ end
+ end
+
+ context 'with cached CommonMark html' do
+ let(:snippet) { create(:personal_snippet, :public, file_name: file_name, content: content, cached_markdown_version: CacheMarkdownField::CACHE_COMMONMARK_VERSION) }
+
+ it 'renders correctly' do
+ expect(page).not_to have_xpath("//ol//li//ul")
+ end
+ end
+
+ context 'with cached Redcarpet html' do
+ let(:snippet) { create(:personal_snippet, :public, file_name: file_name, content: content, cached_markdown_version: CacheMarkdownField::CACHE_REDCARPET_VERSION) }
+
+ it 'renders correctly' do
+ expect(page).to have_xpath("//ol//li//ul")
+ end
end
end
diff --git a/spec/features/snippets/user_sees_breadcrumb_links.rb b/spec/features/snippets/user_sees_breadcrumb_links.rb
new file mode 100644
index 00000000000..696f2b93390
--- /dev/null
+++ b/spec/features/snippets/user_sees_breadcrumb_links.rb
@@ -0,0 +1,17 @@
+require 'rails_helper'
+
+describe 'New user snippet breadcrumbs' do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ visit new_snippet_path
+ end
+
+ it 'display a link to user snippets and new user snippet pages' do
+ page.within '.breadcrumbs' do
+ expect(find_link('Snippets')[:href]).to end_with(dashboard_snippets_path)
+ expect(find_link('New')[:href]).to end_with(new_snippet_path)
+ end
+ end
+end
diff --git a/spec/features/u2f_spec.rb b/spec/features/u2f_spec.rb
index f245c1ebbd9..ae9b65d1a39 100644
--- a/spec/features/u2f_spec.rb
+++ b/spec/features/u2f_spec.rb
@@ -3,14 +3,14 @@ require 'spec_helper'
describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
def manage_two_factor_authentication
click_on 'Manage two-factor authentication'
- expect(page).to have_content("Setup new U2F device")
+ expect(page).to have_content("Set up new U2F device")
wait_for_requests
end
def register_u2f_device(u2f_device = nil, name: 'My device')
u2f_device ||= FakeU2fDevice.new(page, name)
u2f_device.respond_to_u2f_registration
- click_on 'Setup new U2F device'
+ click_on 'Set up new U2F device'
expect(page).to have_content('Your device was successfully set up')
fill_in "Pick a name", with: name
click_on 'Register U2F device'
@@ -34,7 +34,7 @@ describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
visit profile_account_path
click_on 'Enable two-factor authentication'
- expect(page).to have_button('Setup new U2F device', disabled: true)
+ expect(page).to have_button('Set up new U2F device', disabled: true)
end
end
@@ -42,7 +42,7 @@ describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
it 'allows registering a new device with a name' do
visit profile_account_path
manage_two_factor_authentication
- expect(page).to have_content("You've already enabled two-factor authentication using mobile")
+ expect(page).to have_content("You've already enabled two-factor authentication using one time password authenticators")
u2f_device = register_u2f_device
@@ -70,7 +70,7 @@ describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
it 'allows deleting a device' do
visit profile_account_path
manage_two_factor_authentication
- expect(page).to have_content("You've already enabled two-factor authentication using mobile")
+ expect(page).to have_content("You've already enabled two-factor authentication using one time password authenticators")
first_u2f_device = register_u2f_device
second_u2f_device = register_u2f_device(name: 'My other device')
@@ -109,7 +109,7 @@ describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
# Have the "u2f device" respond with bad data
page.execute_script("u2f.register = function(_,_,_,callback) { callback('bad response'); };")
- click_on 'Setup new U2F device'
+ click_on 'Set up new U2F device'
expect(page).to have_content('Your device was successfully set up')
click_on 'Register U2F device'
@@ -124,7 +124,7 @@ describe 'Using U2F (Universal 2nd Factor) Devices for Authentication', :js do
# Failed registration
page.execute_script("u2f.register = function(_,_,_,callback) { callback('bad response'); };")
- click_on 'Setup new U2F device'
+ click_on 'Set up new U2F device'
expect(page).to have_content('Your device was successfully set up')
click_on 'Register U2F device'
expect(page).to have_content("The form contains the following error")
diff --git a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
index a07edc42eae..72b53bae46a 100644
--- a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
@@ -15,7 +15,7 @@ describe 'User uploads avatar to group' do
)
page.within('.gs-general') do
- click_button 'Save group'
+ click_button 'Save changes'
end
visit group_path(group)
diff --git a/spec/features/usage_stats_consent_spec.rb b/spec/features/usage_stats_consent_spec.rb
new file mode 100644
index 00000000000..dd8f3179895
--- /dev/null
+++ b/spec/features/usage_stats_consent_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Usage stats consent' do
+ context 'when signed in' do
+ let(:user) { create(:admin, created_at: 8.days.ago) }
+ let(:message) { 'To help improve GitLab, we would like to periodically collect usage information.' }
+
+ before do
+ allow(user).to receive(:has_current_license?).and_return false
+
+ gitlab_sign_in(user)
+ end
+
+ it 'hides the banner permanently when sets usage stats' do
+ visit root_dashboard_path
+
+ expect(page).to have_content(message)
+
+ click_link 'Send usage data'
+
+ expect(page).not_to have_content(message)
+ expect(page).to have_content('Application settings saved successfully')
+
+ gitlab_sign_out
+ gitlab_sign_in(user)
+ visit root_dashboard_path
+
+ expect(page).not_to have_content(message)
+ end
+
+ it 'shows banner on next session if user did not set usage stats' do
+ visit root_dashboard_path
+
+ expect(page).to have_content(message)
+
+ gitlab_sign_out
+ gitlab_sign_in(user)
+ visit root_dashboard_path
+
+ expect(page).to have_content(message)
+ end
+ end
+end
diff --git a/spec/features/user_sorts_things_spec.rb b/spec/features/user_sorts_things_spec.rb
index 69ebdddaeec..0295f588326 100644
--- a/spec/features/user_sorts_things_spec.rb
+++ b/spec/features/user_sorts_things_spec.rb
@@ -6,7 +6,7 @@ require "spec_helper"
# All those specs are moved out to this spec intentionally to keep them all in one place.
describe "User sorts things" do
include Spec::Support::Helpers::Features::SortingHelpers
- include Helpers::DashboardHelper
+ include DashboardHelper
set(:project) { create(:project_empty_repo, :public) }
set(:current_user) { create(:user) } # Using `current_user` instead of just `user` because of the hardoced call in `assigned_mrs_dashboard_path` which is used below.
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 44758f862a8..ad856bd062e 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe 'Login' do
include TermsHelper
+ include UserLoginHelper
before do
stub_authentication_activity_metrics(debug: true)
@@ -546,29 +547,6 @@ describe 'Login' do
ensure_tab_pane_correctness(false)
end
end
-
- def ensure_tab_pane_correctness(visit_path = true)
- if visit_path
- visit new_user_session_path
- end
-
- ensure_tab_pane_counts
- ensure_one_active_tab
- ensure_one_active_pane
- end
-
- def ensure_tab_pane_counts
- tabs_count = page.all('[role="tab"]').size
- expect(page).to have_selector('[role="tabpanel"]', count: tabs_count)
- end
-
- def ensure_one_active_tab
- expect(page).to have_selector('ul.new-session-tabs > li > a.active', count: 1)
- end
-
- def ensure_one_active_pane
- expect(page).to have_selector('.tab-pane.active', count: 1)
- end
end
context 'when terms are enforced' do
diff --git a/spec/features/users/overview_spec.rb b/spec/features/users/overview_spec.rb
new file mode 100644
index 00000000000..34ed771340f
--- /dev/null
+++ b/spec/features/users/overview_spec.rb
@@ -0,0 +1,150 @@
+require 'spec_helper'
+
+describe 'Overview tab on a user profile', :js do
+ let(:user) { create(:user) }
+ let(:contributed_project) { create(:project, :public, :repository) }
+
+ def push_code_contribution
+ event = create(:push_event, project: contributed_project, author: user)
+
+ create(:push_event_payload,
+ event: event,
+ commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
+ commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
+ commit_count: 3,
+ ref: 'master')
+ end
+
+ before do
+ sign_in user
+ end
+
+ describe 'activities section' do
+ shared_context 'visit overview tab' do
+ before do
+ visit user.username
+ page.find('.js-overview-tab a').click
+ wait_for_requests
+ end
+ end
+
+ describe 'user has no activities' do
+ include_context 'visit overview tab'
+
+ it 'does not show any entries in the list of activities' do
+ page.within('.activities-block') do
+ expect(page).not_to have_selector('.event-item')
+ end
+ end
+
+ it 'does not show a link to the activity list' do
+ expect(find('#js-overview .activities-block')).to have_selector('.js-view-all', visible: false)
+ end
+ end
+
+ describe 'user has 3 activities' do
+ before do
+ 3.times { push_code_contribution }
+ end
+
+ include_context 'visit overview tab'
+
+ it 'display 3 entries in the list of activities' do
+ expect(find('#js-overview')).to have_selector('.event-item', count: 3)
+ end
+ end
+
+ describe 'user has 11 activities' do
+ before do
+ 11.times { push_code_contribution }
+ end
+
+ include_context 'visit overview tab'
+
+ it 'displays 10 entries in the list of activities' do
+ expect(find('#js-overview')).to have_selector('.event-item', count: 10)
+ end
+
+ it 'shows a link to the activity list' do
+ expect(find('#js-overview .activities-block')).to have_selector('.js-view-all', visible: true)
+ end
+
+ it 'links to the activity tab' do
+ page.within('.activities-block') do
+ find('.js-view-all').click
+ wait_for_requests
+ expect(URI.parse(current_url).path).to eq("/users/#{user.username}/activity")
+ end
+ end
+ end
+ end
+
+ describe 'projects section' do
+ shared_context 'visit overview tab' do
+ before do
+ visit user.username
+ page.find('.js-overview-tab a').click
+ wait_for_requests
+ end
+ end
+
+ describe 'user has no personal projects' do
+ include_context 'visit overview tab'
+
+ it 'it shows an empty project list with an info message' do
+ page.within('.projects-block') do
+ expect(page).to have_content('No projects found')
+ expect(page).not_to have_selector('.project-row')
+ end
+ end
+
+ it 'does not show a link to the project list' do
+ expect(find('#js-overview .projects-block')).to have_selector('.js-view-all', visible: false)
+ end
+ end
+
+ describe 'user has a personal project' do
+ before do
+ create(:project, :private, namespace: user.namespace, creator: user) { |p| p.add_maintainer(user) }
+ end
+
+ include_context 'visit overview tab'
+
+ it 'it shows one entry in the list of projects' do
+ page.within('.projects-block') do
+ expect(page).to have_selector('.project-row', count: 1)
+ end
+ end
+
+ it 'shows a link to the project list' do
+ expect(find('#js-overview .projects-block')).to have_selector('.js-view-all', visible: true)
+ end
+ end
+
+ describe 'user has more than ten personal projects' do
+ before do
+ create_list(:project, 11, :private, namespace: user.namespace, creator: user) do |project|
+ project.add_maintainer(user)
+ end
+ end
+
+ include_context 'visit overview tab'
+
+ it 'it shows max. ten entries in the list of projects' do
+ page.within('.projects-block') do
+ expect(page).to have_selector('.project-row', count: 10)
+ end
+ end
+
+ it 'shows a link to the project list' do
+ expect(find('#js-overview .projects-block')).to have_selector('.js-view-all', visible: true)
+ end
+
+ it 'does not show pagination' do
+ page.within('.projects-block') do
+ expect(page).not_to have_selector('.gl-pagination')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index bc07ab48c39..86379164cf0 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -8,6 +8,7 @@ describe 'User page' do
visit(user_path(user))
page.within '.nav-links' do
+ expect(page).to have_link('Overview')
expect(page).to have_link('Activity')
expect(page).to have_link('Groups')
expect(page).to have_link('Contributed projects')
@@ -44,6 +45,7 @@ describe 'User page' do
visit(user_path(user))
page.within '.nav-links' do
+ expect(page).to have_link('Overview')
expect(page).to have_link('Activity')
expect(page).to have_link('Groups')
expect(page).to have_link('Contributed projects')
diff --git a/spec/finders/admin/runners_finder_spec.rb b/spec/finders/admin/runners_finder_spec.rb
new file mode 100644
index 00000000000..0b2325cc7ca
--- /dev/null
+++ b/spec/finders/admin/runners_finder_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Admin::RunnersFinder do
+ describe '#execute' do
+ context 'with empty params' do
+ it 'returns all runners' do
+ runner1 = create :ci_runner, active: true
+ runner2 = create :ci_runner, active: false
+
+ expect(described_class.new(params: {}).execute).to match_array [runner1, runner2]
+ end
+ end
+
+ context 'filter by search term' do
+ it 'calls Ci::Runner.search' do
+ expect(Ci::Runner).to receive(:search).with('term').and_call_original
+
+ described_class.new(params: { search: 'term' }).execute
+ end
+ end
+
+ context 'filter by status' do
+ it 'calls the corresponding scope on Ci::Runner' do
+ expect(Ci::Runner).to receive(:paused).and_call_original
+
+ described_class.new(params: { status_status: 'paused' }).execute
+ end
+ end
+
+ context 'filter by runner type' do
+ it 'calls the corresponding scope on Ci::Runner' do
+ expect(Ci::Runner).to receive(:project_type).and_call_original
+
+ described_class.new(params: { type_type: 'project_type' }).execute
+ end
+ end
+
+ context 'sort' do
+ context 'without sort param' do
+ it 'sorts by created_at' do
+ runner1 = create :ci_runner, created_at: '2018-07-12 07:00'
+ runner2 = create :ci_runner, created_at: '2018-07-12 08:00'
+ runner3 = create :ci_runner, created_at: '2018-07-12 09:00'
+
+ expect(described_class.new(params: {}).execute).to eq [runner3, runner2, runner1]
+ end
+ end
+
+ context 'with sort param' do
+ it 'sorts by specified attribute' do
+ runner1 = create :ci_runner, contacted_at: 1.minute.ago
+ runner2 = create :ci_runner, contacted_at: 3.minutes.ago
+ runner3 = create :ci_runner, contacted_at: 2.minutes.ago
+
+ expect(described_class.new(params: { sort: 'contacted_asc' }).execute).to eq [runner2, runner3, runner1]
+ end
+ end
+ end
+
+ context 'paginate' do
+ it 'returns the runners for the specified page' do
+ stub_const('Admin::RunnersFinder::NUMBER_OF_RUNNERS_PER_PAGE', 1)
+ runner1 = create :ci_runner, created_at: '2018-07-12 07:00'
+ runner2 = create :ci_runner, created_at: '2018-07-12 08:00'
+
+ expect(described_class.new(params: { page: 1 }).execute).to eq [runner2]
+ expect(described_class.new(params: { page: 2 }).execute).to eq [runner1]
+ end
+ end
+ end
+end
diff --git a/spec/finders/applications_finder_spec.rb b/spec/finders/applications_finder_spec.rb
new file mode 100644
index 00000000000..14d6b35cc27
--- /dev/null
+++ b/spec/finders/applications_finder_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ApplicationsFinder do
+ let(:application1) { create(:application, name: 'some_application', owner: nil, redirect_uri: 'http://some_application.url', scopes: '') }
+ let(:application2) { create(:application, name: 'another_application', owner: nil, redirect_uri: 'http://other_application.url', scopes: '') }
+
+ describe '#execute' do
+ it 'returns an array of applications' do
+ found = described_class.new.execute
+
+ expect(found).to match_array([application1, application2])
+ end
+ it 'returns the application by id' do
+ params = { id: application1.id }
+ found = described_class.new(params).execute
+
+ expect(found).to match(application1)
+ end
+ end
+end
diff --git a/spec/finders/autocomplete/group_finder_spec.rb b/spec/finders/autocomplete/group_finder_spec.rb
new file mode 100644
index 00000000000..d7cb2c3bbe2
--- /dev/null
+++ b/spec/finders/autocomplete/group_finder_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Autocomplete::GroupFinder do
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ context 'with a project' do
+ it 'returns nil' do
+ project = create(:project)
+
+ expect(described_class.new(user, project).execute).to be_nil
+ end
+ end
+
+ context 'without a group ID' do
+ it 'returns nil' do
+ expect(described_class.new(user).execute).to be_nil
+ end
+ end
+
+ context 'with an empty String as the group ID' do
+ it 'returns nil' do
+ expect(described_class.new(user, nil, group_id: '').execute).to be_nil
+ end
+ end
+
+ context 'without a project and with a group ID' do
+ it 'raises ActiveRecord::RecordNotFound if the group does not exist' do
+ finder = described_class.new(user, nil, group_id: 1)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises ActiveRecord::RecordNotFound if the user can not read the group' do
+ group = create(:group, :private)
+ finder = described_class.new(user, nil, group_id: group.id)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises ActiveRecord::RecordNotFound if an anonymous user can not read the group' do
+ group = create(:group, :private)
+ finder = described_class.new(nil, nil, group_id: group.id)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'returns the group if it exists and is readable' do
+ group = create(:group)
+ finder = described_class.new(user, nil, group_id: group.id)
+
+ expect(finder.execute).to eq(group)
+ end
+ end
+ end
+end
diff --git a/spec/finders/move_to_project_finder_spec.rb b/spec/finders/autocomplete/move_to_project_finder_spec.rb
index 1b3f44cced1..c3bc410a7f6 100644
--- a/spec/finders/move_to_project_finder_spec.rb
+++ b/spec/finders/autocomplete/move_to_project_finder_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe MoveToProjectFinder do
+describe Autocomplete::MoveToProjectFinder do
let(:user) { create(:user) }
let(:project) { create(:project) }
@@ -10,14 +10,14 @@ describe MoveToProjectFinder do
let(:developer_project) { create(:project) }
let(:maintainer_project) { create(:project) }
- subject { described_class.new(user) }
-
describe '#execute' do
context 'filter' do
it 'does not return projects under Gitlab::Access::REPORTER' do
guest_project.add_guest(user)
- expect(subject.execute(project)).to be_empty
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute).to be_empty
end
it 'returns projects equal or above Gitlab::Access::REPORTER ordered by id in descending order' do
@@ -25,13 +25,17 @@ describe MoveToProjectFinder do
developer_project.add_developer(user)
maintainer_project.add_maintainer(user)
- expect(subject.execute(project).to_a).to eq([maintainer_project, developer_project, reporter_project])
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute.to_a).to eq([maintainer_project, developer_project, reporter_project])
end
it 'does not include the source project' do
project.add_reporter(user)
- expect(subject.execute(project).to_a).to be_empty
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute.to_a).to be_empty
end
it 'does not return archived projects' do
@@ -40,7 +44,9 @@ describe MoveToProjectFinder do
other_reporter_project = create(:project)
other_reporter_project.add_reporter(user)
- expect(subject.execute(project).to_a).to eq([other_reporter_project])
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute.to_a).to eq([other_reporter_project])
end
it 'does not return projects for which issues are disabled' do
@@ -49,39 +55,42 @@ describe MoveToProjectFinder do
other_reporter_project = create(:project)
other_reporter_project.add_reporter(user)
- expect(subject.execute(project).to_a).to eq([other_reporter_project])
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute.to_a).to eq([other_reporter_project])
end
it 'returns a page of projects ordered by id in descending order' do
- stub_const 'MoveToProjectFinder::PAGE_SIZE', 2
+ allow(Kaminari.config).to receive(:default_per_page).and_return(2)
- reporter_project.add_reporter(user)
- developer_project.add_developer(user)
- maintainer_project.add_maintainer(user)
+ projects = create_list(:project, 2) do |project|
+ project.add_developer(user)
+ end
- expect(subject.execute(project).to_a).to eq([maintainer_project, developer_project])
+ finder = described_class.new(user, project_id: project.id)
+ page = finder.execute.to_a
+
+ expect(page.length).to eq(Kaminari.config.default_per_page)
+ expect(page[0]).to eq(projects.last)
end
it 'returns projects after the given offset id' do
- stub_const 'MoveToProjectFinder::PAGE_SIZE', 2
-
reporter_project.add_reporter(user)
developer_project.add_developer(user)
maintainer_project.add_maintainer(user)
- expect(subject.execute(project, search: nil, offset_id: maintainer_project.id).to_a).to eq([developer_project, reporter_project])
- expect(subject.execute(project, search: nil, offset_id: developer_project.id).to_a).to eq([reporter_project])
- expect(subject.execute(project, search: nil, offset_id: reporter_project.id).to_a).to be_empty
- end
- end
+ expect(described_class.new(user, project_id: project.id, offset_id: maintainer_project.id).execute.to_a)
+ .to eq([developer_project, reporter_project])
- context 'search' do
- it 'uses Project#search' do
- expect(user).to receive_message_chain(:projects_where_can_admin_issues, :search) { Project.all }
+ expect(described_class.new(user, project_id: project.id, offset_id: developer_project.id).execute.to_a)
+ .to eq([reporter_project])
- subject.execute(project, search: 'wadus')
+ expect(described_class.new(user, project_id: project.id, offset_id: reporter_project.id).execute.to_a)
+ .to be_empty
end
+ end
+ context 'search' do
it 'returns projects matching a search query' do
foo_project = create(:project)
foo_project.add_maintainer(user)
@@ -89,8 +98,11 @@ describe MoveToProjectFinder do
wadus_project = create(:project, name: 'wadus')
wadus_project.add_maintainer(user)
- expect(subject.execute(project).to_a).to eq([wadus_project, foo_project])
- expect(subject.execute(project, search: 'wadus').to_a).to eq([wadus_project])
+ expect(described_class.new(user, project_id: project.id).execute.to_a)
+ .to eq([wadus_project, foo_project])
+
+ expect(described_class.new(user, project_id: project.id, search: 'wadus').execute.to_a)
+ .to eq([wadus_project])
end
end
end
diff --git a/spec/finders/autocomplete/project_finder_spec.rb b/spec/finders/autocomplete/project_finder_spec.rb
new file mode 100644
index 00000000000..207d0598c28
--- /dev/null
+++ b/spec/finders/autocomplete/project_finder_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Autocomplete::ProjectFinder do
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ context 'without a project ID' do
+ it 'returns nil' do
+ expect(described_class.new(user).execute).to be_nil
+ end
+ end
+
+ context 'with an empty String as the project ID' do
+ it 'returns nil' do
+ expect(described_class.new(user, project_id: '').execute).to be_nil
+ end
+ end
+
+ context 'with a project ID' do
+ it 'raises ActiveRecord::RecordNotFound if the project does not exist' do
+ finder = described_class.new(user, project_id: 1)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises ActiveRecord::RecordNotFound if the user can not read the project' do
+ project = create(:project, :private)
+
+ finder = described_class.new(user, project_id: project.id)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises ActiveRecord::RecordNotFound if an anonymous user can not read the project' do
+ project = create(:project, :private)
+
+ finder = described_class.new(nil, project_id: project.id)
+
+ expect { finder.execute }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'returns the project if it exists and is readable' do
+ project = create(:project, :private)
+
+ project.add_maintainer(user)
+
+ finder = described_class.new(user, project_id: project.id)
+
+ expect(finder.execute).to eq(project)
+ end
+ end
+ end
+end
diff --git a/spec/finders/autocomplete_users_finder_spec.rb b/spec/finders/autocomplete/users_finder_spec.rb
index dcf9111776e..abd0d6b5185 100644
--- a/spec/finders/autocomplete_users_finder_spec.rb
+++ b/spec/finders/autocomplete/users_finder_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe AutocompleteUsersFinder do
+describe Autocomplete::UsersFinder do
describe '#execute' do
let!(:user1) { create(:user, username: 'johndoe') }
let!(:user2) { create(:user, :blocked, username: 'notsorandom') }
diff --git a/spec/finders/awarded_emoji_finder_spec.rb b/spec/finders/awarded_emoji_finder_spec.rb
new file mode 100644
index 00000000000..d4479df7418
--- /dev/null
+++ b/spec/finders/awarded_emoji_finder_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe AwardedEmojiFinder do
+ describe '#execute' do
+ it 'returns an Array containing the awarded emoji names' do
+ user = create(:user)
+
+ create(:award_emoji, user: user, name: 'thumbsup')
+ create(:award_emoji, user: user, name: 'thumbsup')
+ create(:award_emoji, user: user, name: 'thumbsdown')
+
+ awarded = described_class.new(user).execute
+
+ expect(awarded).to eq([{ name: 'thumbsup' }, { name: 'thumbsdown' }])
+ end
+
+ it 'returns an empty Array when no user is given' do
+ awarded = described_class.new.execute
+
+ expect(awarded).to be_empty
+ end
+ end
+end
diff --git a/spec/finders/branches_finder_spec.rb b/spec/finders/branches_finder_spec.rb
index 9e3f2c69606..7d164539d9a 100644
--- a/spec/finders/branches_finder_spec.rb
+++ b/spec/finders/branches_finder_spec.rb
@@ -66,7 +66,7 @@ describe BranchesFinder do
context 'filter and sort' do
it 'filters branches by name and sorts by recently_updated' do
- params = { sort: 'updated_desc', search: 'feature' }
+ params = { sort: 'updated_desc', search: 'feat' }
branches_finder = described_class.new(repository, params)
result = branches_finder.execute
@@ -75,6 +75,17 @@ describe BranchesFinder do
expect(result.count).to eq(2)
end
+ it 'filters branches by name and sorts by recently_updated, with exact matches first' do
+ params = { sort: 'updated_desc', search: 'feature' }
+ branches_finder = described_class.new(repository, params)
+
+ result = branches_finder.execute
+
+ expect(result.first.name).to eq('feature')
+ expect(result.second.name).to eq('feature_conflict')
+ expect(result.count).to eq(2)
+ end
+
it 'filters branches by name and sorts by last_updated' do
params = { sort: 'updated_asc', search: 'feature' }
branches_finder = described_class.new(repository, params)
@@ -84,6 +95,26 @@ describe BranchesFinder do
expect(result.first.name).to eq('feature')
expect(result.count).to eq(2)
end
+
+ it 'filters branches by name that begins with' do
+ params = { search: '^feature_' }
+ branches_finder = described_class.new(repository, params)
+
+ result = branches_finder.execute
+
+ expect(result.first.name).to eq('feature_conflict')
+ expect(result.count).to eq(1)
+ end
+
+ it 'filters branches by name that ends with' do
+ params = { search: 'feature$' }
+ branches_finder = described_class.new(repository, params)
+
+ result = branches_finder.execute
+
+ expect(result.first.name).to eq('feature')
+ expect(result.count).to eq(1)
+ end
end
end
end
diff --git a/spec/finders/contributed_projects_finder_spec.rb b/spec/finders/contributed_projects_finder_spec.rb
index 9155a8d6fe9..81fb4e3561c 100644
--- a/spec/finders/contributed_projects_finder_spec.rb
+++ b/spec/finders/contributed_projects_finder_spec.rb
@@ -8,6 +8,7 @@ describe ContributedProjectsFinder do
let!(:public_project) { create(:project, :public) }
let!(:private_project) { create(:project, :private) }
+ let!(:internal_project) { create(:project, :internal) }
before do
private_project.add_maintainer(source_user)
@@ -16,17 +17,18 @@ describe ContributedProjectsFinder do
create(:push_event, project: public_project, author: source_user)
create(:push_event, project: private_project, author: source_user)
+ create(:push_event, project: internal_project, author: source_user)
end
- describe 'without a current user' do
+ describe 'activity without a current user' do
subject { finder.execute }
- it { is_expected.to eq([public_project]) }
+ it { is_expected.to match_array([public_project]) }
end
- describe 'with a current user' do
+ describe 'activity with a current user' do
subject { finder.execute(current_user) }
- it { is_expected.to eq([private_project, public_project]) }
+ it { is_expected.to match_array([private_project, internal_project, public_project]) }
end
end
diff --git a/spec/finders/environments_finder_spec.rb b/spec/finders/environments_finder_spec.rb
index 3cd421f22eb..25835bb4d94 100644
--- a/spec/finders/environments_finder_spec.rb
+++ b/spec/finders/environments_finder_spec.rb
@@ -12,7 +12,7 @@ describe EnvironmentsFinder do
context 'tagged deployment' do
before do
- create(:deployment, environment: environment, ref: 'v1.1.0', tag: true, sha: project.commit.id)
+ create(:deployment, :success, environment: environment, ref: 'v1.1.0', tag: true, sha: project.commit.id)
end
it 'returns environment when with_tags is set' do
@@ -33,7 +33,7 @@ describe EnvironmentsFinder do
context 'branch deployment' do
before do
- create(:deployment, environment: environment, ref: 'master', sha: project.commit.id)
+ create(:deployment, :success, environment: environment, ref: 'master', sha: project.commit.id)
end
it 'returns environment when ref is set' do
@@ -59,7 +59,7 @@ describe EnvironmentsFinder do
context 'commit deployment' do
before do
- create(:deployment, environment: environment, ref: 'master', sha: project.commit.id)
+ create(:deployment, :success, environment: environment, ref: 'master', sha: project.commit.id)
end
it 'returns environment' do
@@ -71,7 +71,7 @@ describe EnvironmentsFinder do
context 'recently updated' do
context 'when last deployment to environment is the most recent one' do
before do
- create(:deployment, environment: environment, ref: 'feature')
+ create(:deployment, :success, environment: environment, ref: 'feature')
end
it 'finds recently updated environment' do
@@ -82,8 +82,8 @@ describe EnvironmentsFinder do
context 'when last deployment to environment is not the most recent' do
before do
- create(:deployment, environment: environment, ref: 'feature')
- create(:deployment, environment: environment, ref: 'master')
+ create(:deployment, :success, environment: environment, ref: 'feature')
+ create(:deployment, :success, environment: environment, ref: 'master')
end
it 'does not find environment' do
@@ -96,8 +96,8 @@ describe EnvironmentsFinder do
let(:second_environment) { create(:environment, project: project) }
before do
- create(:deployment, environment: environment, ref: 'feature')
- create(:deployment, environment: second_environment, ref: 'feature')
+ create(:deployment, :success, environment: environment, ref: 'feature')
+ create(:deployment, :success, environment: second_environment, ref: 'feature')
end
it 'finds both environments' do
diff --git a/spec/finders/fork_projects_finder_spec.rb b/spec/finders/fork_projects_finder_spec.rb
index f0cef7ea406..b3fdffc3331 100644
--- a/spec/finders/fork_projects_finder_spec.rb
+++ b/spec/finders/fork_projects_finder_spec.rb
@@ -1,20 +1,21 @@
require 'spec_helper'
describe ForkProjectsFinder do
- let(:source_project) { create(:project, :empty_repo) }
- let(:private_fork) { create(:project, :private, :empty_repo, name: 'A') }
- let(:internal_fork) { create(:project, :internal, :empty_repo, name: 'B') }
- let(:public_fork) { create(:project, :public, :empty_repo, name: 'C') }
+ include ProjectForksHelper
+
+ let(:source_project) { create(:project, :public, :empty_repo) }
+ let(:private_fork) { fork_project(source_project, nil, name: 'A') }
+ let(:internal_fork) { fork_project(source_project, nil, name: 'B') }
+ let(:public_fork) { fork_project(source_project, nil, name: 'C') }
let(:non_member) { create(:user) }
let(:private_fork_member) { create(:user) }
before do
+ private_fork.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
private_fork.add_developer(private_fork_member)
- source_project.forks << private_fork
- source_project.forks << internal_fork
- source_project.forks << public_fork
+ internal_fork.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
end
describe '#execute' do
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index 796d40cb625..c28fd7cad11 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -74,6 +74,13 @@ describe GroupDescendantsFinder do
end
end
+ it 'sorts elements by latest created as default' do
+ project1 = create(:project, namespace: group, created_at: 1.hour.ago)
+ project2 = create(:project, namespace: group)
+
+ expect(subject.execute).to eq([project2, project1])
+ end
+
context 'sorting by name' do
let!(:project1) { create(:project, namespace: group, name: 'a', path: 'project-a') }
let!(:project2) { create(:project, namespace: group, name: 'z', path: 'project-z') }
@@ -108,6 +115,15 @@ describe GroupDescendantsFinder do
end
end
end
+
+ it 'does not include projects shared with the group' do
+ project = create(:project, namespace: group)
+ other_project = create(:project)
+ other_project.project_group_links.create(group: group,
+ group_access: ProjectGroupLink::MASTER)
+
+ expect(finder.execute).to contain_exactly(project)
+ end
end
context 'with nested groups', :nested_groups do
diff --git a/spec/finders/group_labels_finder_spec.rb b/spec/finders/group_labels_finder_spec.rb
new file mode 100644
index 00000000000..7bdd312eff0
--- /dev/null
+++ b/spec/finders/group_labels_finder_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe GroupLabelsFinder, '#execute' do
+ let!(:group) { create(:group) }
+ let!(:user) { create(:user) }
+ let!(:label1) { create(:group_label, title: 'Foo', description: 'Lorem ipsum', group: group) }
+ let!(:label2) { create(:group_label, title: 'Bar', description: 'Fusce consequat', group: group) }
+
+ it 'returns all group labels sorted by name if no params' do
+ result = described_class.new(user, group).execute
+
+ expect(result.to_a).to match_array([label2, label1])
+ end
+
+ it 'returns all group labels sorted by name desc' do
+ result = described_class.new(user, group, sort: 'name_desc').execute
+
+ expect(result.to_a).to match_array([label2, label1])
+ end
+
+ it 'returns group labels that match search' do
+ result = described_class.new(user, group, search: 'Foo').execute
+
+ expect(result.to_a).to match_array([label1])
+ end
+
+ it 'returns group labels user subscribed to' do
+ label2.subscribe(user)
+
+ result = described_class.new(user, group, subscribed: 'true').execute
+
+ expect(result.to_a).to match_array([label2])
+ end
+
+ it 'returns second page of labels' do
+ result = described_class.new(user, group, page: '2').execute
+
+ expect(result.to_a).to match_array([])
+ end
+end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index 07a2fa86dd7..c0488c83bd8 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -56,6 +56,40 @@ describe IssuesFinder do
end
end
+ context 'filtering by no assignee' do
+ let(:params) { { assignee_id: 'None' } }
+
+ it 'returns issues not assigned to any assignee' do
+ expect(issues).to contain_exactly(issue4)
+ end
+
+ it 'returns issues not assigned to any assignee' do
+ params[:assignee_id] = 0
+
+ expect(issues).to contain_exactly(issue4)
+ end
+
+ it 'returns issues not assigned to any assignee' do
+ params[:assignee_id] = 'none'
+
+ expect(issues).to contain_exactly(issue4)
+ end
+ end
+
+ context 'filtering by any assignee' do
+ let(:params) { { assignee_id: 'Any' } }
+
+ it 'returns issues assigned to any assignee' do
+ expect(issues).to contain_exactly(issue1, issue2, issue3)
+ end
+
+ it 'returns issues assigned to any assignee' do
+ params[:assignee_id] = 'any'
+
+ expect(issues).to contain_exactly(issue1, issue2, issue3)
+ end
+ end
+
context 'filtering by group_id' do
let(:params) { { group_id: group.id } }
@@ -110,11 +144,31 @@ describe IssuesFinder do
end
context 'filtering by no milestone' do
- let(:params) { { milestone_title: Milestone::None.title } }
+ let(:params) { { milestone_title: 'None' } }
it 'returns issues with no milestone' do
expect(issues).to contain_exactly(issue2, issue3, issue4)
end
+
+ it 'returns issues with no milestone (deprecated)' do
+ params[:milestone_title] = Milestone::None.title
+
+ expect(issues).to contain_exactly(issue2, issue3, issue4)
+ end
+ end
+
+ context 'filtering by any milestone' do
+ let(:params) { { milestone_title: 'Any' } }
+
+ it 'returns issues with any assigned milestone' do
+ expect(issues).to contain_exactly(issue1)
+ end
+
+ it 'returns issues with any assigned milestone (deprecated)' do
+ params[:milestone_title] = Milestone::Any.title
+
+ expect(issues).to contain_exactly(issue1)
+ end
end
context 'filtering by upcoming milestone' do
@@ -318,6 +372,22 @@ describe IssuesFinder do
end
context 'filtering by reaction name' do
+ context 'user searches by no reaction' do
+ let(:params) { { my_reaction_emoji: 'None' } }
+
+ it 'returns issues that the user did not react to' do
+ expect(issues).to contain_exactly(issue2, issue4)
+ end
+ end
+
+ context 'user searches by any reaction' do
+ let(:params) { { my_reaction_emoji: 'Any' } }
+
+ it 'returns issues that the user reacted to' do
+ expect(issues).to contain_exactly(issue1, issue3)
+ end
+ end
+
context 'user searches by "thumbsup" reaction' do
let(:params) { { my_reaction_emoji: 'thumbsup' } }
diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb
index f5cec8e349a..9abc52aa664 100644
--- a/spec/finders/labels_finder_spec.rb
+++ b/spec/finders/labels_finder_spec.rb
@@ -210,5 +210,15 @@ describe LabelsFinder do
expect(finder.execute).to eq [project_label_1]
end
end
+
+ context 'filter by subscription' do
+ it 'returns labels user subscribed to' do
+ project_label_1.subscribe(user)
+
+ finder = described_class.new(user, subscribed: 'true')
+
+ expect(finder.execute).to eq [project_label_1]
+ end
+ end
end
end
diff --git a/spec/finders/license_template_finder_spec.rb b/spec/finders/license_template_finder_spec.rb
new file mode 100644
index 00000000000..f6f40bf33cc
--- /dev/null
+++ b/spec/finders/license_template_finder_spec.rb
@@ -0,0 +1,49 @@
+require 'spec_helper'
+
+describe LicenseTemplateFinder do
+ describe '#execute' do
+ subject(:result) { described_class.new(nil, params).execute }
+
+ let(:categories) { categorised_licenses.keys }
+ let(:categorised_licenses) { result.group_by(&:category) }
+
+ context 'popular: true' do
+ let(:params) { { popular: true } }
+
+ it 'only returns popular licenses' do
+ expect(categories).to contain_exactly(:Popular)
+ expect(categorised_licenses[:Popular]).to be_present
+ end
+ end
+
+ context 'popular: false' do
+ let(:params) { { popular: false } }
+
+ it 'only returns unpopular licenses' do
+ expect(categories).to contain_exactly(:Other)
+ expect(categorised_licenses[:Other]).to be_present
+ end
+ end
+
+ context 'popular: nil' do
+ let(:params) { { popular: nil } }
+
+ it 'returns all licenses known by the Licensee gem' do
+ from_licensee = Licensee::License.all.map { |l| l.key }
+
+ expect(result.map(&:key)).to match_array(from_licensee)
+ end
+
+ it 'correctly copies all attributes' do
+ licensee = Licensee::License.all.first
+ found = result.find { |r| r.key == licensee.key }
+
+ aggregate_failures do
+ %i[key name content nickname url meta featured?].each do |k|
+ expect(found.public_send(k)).to eq(licensee.public_send(k))
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 35d0eeda8f6..ff4c6b8dd42 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -3,25 +3,47 @@ require 'spec_helper'
describe MergeRequestsFinder do
include ProjectForksHelper
+ # We need to explicitly permit Gitaly N+1s because of the specs that use
+ # :request_store. Gitaly N+1 detection is only enabled when :request_store is,
+ # but we don't care about potential N+1s when we're just creating several
+ # projects in the setup phase.
+ def create_project_without_n_plus_1(*args)
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ create(:project, :public, *args)
+ end
+ end
+
let(:user) { create :user }
let(:user2) { create :user }
let(:group) { create(:group) }
let(:subgroup) { create(:group, parent: group) }
- let(:project1) { create(:project, :public, group: group) }
- let(:project2) { fork_project(project1, user) }
+ let(:project1) { create_project_without_n_plus_1(group: group) }
+ let(:project2) do
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ fork_project(project1, user)
+ end
+ end
let(:project3) do
- p = fork_project(project1, user)
- p.update!(archived: true)
- p
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ p = fork_project(project1, user)
+ p.update!(archived: true)
+ p
+ end
end
- let(:project4) { create(:project, :public, group: subgroup) }
+ let(:project4) { create_project_without_n_plus_1(group: subgroup) }
+ let(:project5) { create_project_without_n_plus_1(group: subgroup) }
+ let(:project6) { create_project_without_n_plus_1(group: subgroup) }
let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) }
let!(:merge_request2) { create(:merge_request, :conflict, author: user, source_project: project2, target_project: project1, state: 'closed') }
- let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, state: 'locked') }
- let!(:merge_request4) { create(:merge_request, :simple, author: user, source_project: project3, target_project: project3) }
- let!(:merge_request5) { create(:merge_request, :simple, author: user, source_project: project4, target_project: project4) }
+ let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, state: 'locked', title: 'thing WIP thing') }
+ let!(:merge_request4) { create(:merge_request, :simple, author: user, source_project: project3, target_project: project3, title: 'WIP thing') }
+ let!(:merge_request5) { create(:merge_request, :simple, author: user, source_project: project4, target_project: project4, title: '[WIP]') }
+ let!(:merge_request6) { create(:merge_request, :simple, author: user, source_project: project5, target_project: project5, title: 'WIP: thing') }
+ let!(:merge_request7) { create(:merge_request, :simple, author: user, source_project: project6, target_project: project6, title: 'wip thing') }
+ let!(:merge_request8) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project1, title: '[wip] thing') }
+ let!(:merge_request9) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project2, title: 'wip: thing') }
before do
project1.add_maintainer(user)
@@ -29,19 +51,21 @@ describe MergeRequestsFinder do
project3.add_developer(user)
project2.add_developer(user2)
project4.add_developer(user)
+ project5.add_developer(user)
+ project6.add_developer(user)
end
describe "#execute" do
it 'filters by scope' do
params = { scope: 'authored', state: 'opened' }
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(3)
+ expect(merge_requests.size).to eq(7)
end
it 'filters by project' do
params = { project_id: project1.id, scope: 'authored', state: 'opened' }
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(1)
+ expect(merge_requests.size).to eq(2)
end
it 'filters by group' do
@@ -49,7 +73,7 @@ describe MergeRequestsFinder do
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(2)
+ expect(merge_requests.size).to eq(3)
end
it 'filters by group including subgroups', :nested_groups do
@@ -57,13 +81,13 @@ describe MergeRequestsFinder do
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(3)
+ expect(merge_requests.size).to eq(6)
end
it 'filters by non_archived' do
params = { non_archived: true }
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(4)
+ expect(merge_requests.size).to eq(8)
end
it 'filters by iid' do
@@ -98,6 +122,36 @@ describe MergeRequestsFinder do
expect(merge_requests).to contain_exactly(merge_request3)
end
+ it 'filters by wip' do
+ params = { wip: 'yes' }
+
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
+ end
+
+ it 'filters by not wip' do
+ params = { wip: 'no' }
+
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3)
+ end
+
+ it 'returns all items if no valid wip param exists' do
+ params = { wip: '' }
+
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3, merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
+ end
+
+ it 'adds wip to scalar params' do
+ scalar_params = described_class.scalar_params
+
+ expect(scalar_params).to include(:wip, :assignee_id)
+ end
+
context 'filtering by group milestone' do
let!(:group) { create(:group, :public) }
let(:group_milestone) { create(:milestone, group: group) }
@@ -207,7 +261,7 @@ describe MergeRequestsFinder do
it 'returns the number of rows for the default state' do
finder = described_class.new(user)
- expect(finder.row_count).to eq(3)
+ expect(finder.row_count).to eq(7)
end
it 'returns the number of rows for a given state' do
diff --git a/spec/finders/notes_finder_spec.rb b/spec/finders/notes_finder_spec.rb
index b776e9d856a..b51f1955ac4 100644
--- a/spec/finders/notes_finder_spec.rb
+++ b/spec/finders/notes_finder_spec.rb
@@ -9,6 +9,35 @@ describe NotesFinder do
end
describe '#execute' do
+ context 'when notes filter is present' do
+ let!(:comment) { create(:note_on_issue, project: project) }
+ let!(:system_note) { create(:note_on_issue, project: project, system: true) }
+
+ it 'returns only user notes when using only_comments filter' do
+ finder = described_class.new(project, user, notes_filter: UserPreference::NOTES_FILTERS[:only_comments])
+
+ notes = finder.execute
+
+ expect(notes).to match_array(comment)
+ end
+
+ it 'returns only system notes when using only_activity filters' do
+ finder = described_class.new(project, user, notes_filter: UserPreference::NOTES_FILTERS[:only_activity])
+
+ notes = finder.execute
+
+ expect(notes).to match_array(system_note)
+ end
+
+ it 'gets all notes' do
+ finder = described_class.new(project, user, notes_filter: UserPreference::NOTES_FILTERS[:all_activity])
+
+ notes = finder.execute
+
+ expect(notes).to match_array([comment, system_note])
+ end
+ end
+
it 'finds notes on merge requests' do
create(:note_on_merge_request, project: project)
diff --git a/spec/finders/pending_todos_finder_spec.rb b/spec/finders/pending_todos_finder_spec.rb
new file mode 100644
index 00000000000..b41b1b46a93
--- /dev/null
+++ b/spec/finders/pending_todos_finder_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe PendingTodosFinder do
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ it 'returns only pending todos' do
+ create(:todo, :done, user: user)
+
+ todo = create(:todo, :pending, user: user)
+ todos = described_class.new(user).execute
+
+ expect(todos).to eq([todo])
+ end
+
+ it 'supports retrieving of todos for a specific project' do
+ project1 = create(:project)
+ project2 = create(:project)
+
+ create(:todo, :pending, user: user, project: project2)
+
+ todo = create(:todo, :pending, user: user, project: project1)
+ todos = described_class.new(user, project_id: project1.id).execute
+
+ expect(todos).to eq([todo])
+ end
+
+ it 'supports retrieving of todos for a specific todo target' do
+ issue = create(:issue)
+ note = create(:note)
+ todo = create(:todo, :pending, user: user, target: issue)
+
+ create(:todo, :pending, user: user, target: note)
+
+ todos = described_class.new(user, target_id: issue.id).execute
+
+ expect(todos).to eq([todo])
+ end
+
+ it 'supports retrieving of todos for a specific target type' do
+ issue = create(:issue)
+ note = create(:note)
+ todo = create(:todo, :pending, user: user, target: issue)
+
+ create(:todo, :pending, user: user, target: note)
+
+ todos = described_class.new(user, target_type: issue.class.name).execute
+
+ expect(todos).to eq([todo])
+ end
+
+ it 'supports retrieving of todos for a specific commit ID' do
+ create(:todo, :pending, user: user, commit_id: '456')
+
+ todo = create(:todo, :pending, user: user, commit_id: '123')
+ todos = described_class.new(user, commit_id: '123').execute
+
+ expect(todos).to eq([todo])
+ end
+ end
+end
diff --git a/spec/finders/personal_access_tokens_finder_spec.rb b/spec/finders/personal_access_tokens_finder_spec.rb
index 3f22b3a253d..3e849c9a644 100644
--- a/spec/finders/personal_access_tokens_finder_spec.rb
+++ b/spec/finders/personal_access_tokens_finder_spec.rb
@@ -92,7 +92,7 @@ describe PersonalAccessTokensFinder do
end
describe 'with id' do
- subject { finder(params).find_by(id: active_personal_access_token.id) }
+ subject { finder(params).find_by_id(active_personal_access_token.id) }
it { is_expected.to eq(active_personal_access_token) }
@@ -106,7 +106,7 @@ describe PersonalAccessTokensFinder do
end
describe 'with token' do
- subject { finder(params).find_by(token: active_personal_access_token.token) }
+ subject { finder(params).find_by_token(active_personal_access_token.token) }
it { is_expected.to eq(active_personal_access_token) }
@@ -207,7 +207,7 @@ describe PersonalAccessTokensFinder do
end
describe 'with id' do
- subject { finder(params).find_by(id: active_personal_access_token.id) }
+ subject { finder(params).find_by_id(active_personal_access_token.id) }
it { is_expected.to eq(active_personal_access_token) }
@@ -221,7 +221,7 @@ describe PersonalAccessTokensFinder do
end
describe 'with token' do
- subject { finder(params).find_by(token: active_personal_access_token.token) }
+ subject { finder(params).find_by_token(active_personal_access_token.token) }
it { is_expected.to eq(active_personal_access_token) }
diff --git a/spec/finders/pipelines_finder_spec.rb b/spec/finders/pipelines_finder_spec.rb
index c6e832ad69b..c2c304589c9 100644
--- a/spec/finders/pipelines_finder_spec.rb
+++ b/spec/finders/pipelines_finder_spec.rb
@@ -225,7 +225,7 @@ describe PipelinesFinder do
end
end
- context 'when the project has limited access to piplines' do
+ context 'when the project has limited access to pipelines' do
let(:project) { create(:project, :private, :repository) }
let(:current_user) { create(:user) }
let!(:pipelines) { create_list(:ci_pipeline, 2, project: project) }
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index 7931ad9b9f0..590e838f13e 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -174,6 +174,13 @@ describe ProjectsFinder do
end
end
+ describe 'filter by without_deleted' do
+ let(:params) { { without_deleted: true } }
+ let!(:pending_delete_project) { create(:project, :public, pending_delete: true) }
+
+ it { is_expected.to match_array([public_project, internal_project]) }
+ end
+
describe 'sorting' do
let(:params) { { sort: 'name_asc' } }
diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb
index 1ae0bd988f2..dfeeb3040c6 100644
--- a/spec/finders/snippets_finder_spec.rb
+++ b/spec/finders/snippets_finder_spec.rb
@@ -4,16 +4,13 @@ describe SnippetsFinder do
include Gitlab::Allowable
using RSpec::Parameterized::TableSyntax
- context 'filter by visibility' do
- let!(:snippet1) { create(:personal_snippet, :private) }
- let!(:snippet2) { create(:personal_snippet, :internal) }
- let!(:snippet3) { create(:personal_snippet, :public) }
+ describe '#initialize' do
+ it 'raises ArgumentError when a project and author are given' do
+ user = build(:user)
+ project = build(:project)
- it "returns public snippets when visibility is PUBLIC" do
- snippets = described_class.new(nil, visibility: Snippet::PUBLIC).execute
-
- expect(snippets).to include(snippet3)
- expect(snippets).not_to include(snippet1, snippet2)
+ expect { described_class.new(user, author: user, project: project) }
+ .to raise_error(ArgumentError)
end
end
@@ -66,21 +63,21 @@ describe SnippetsFinder do
end
it "returns internal snippets" do
- snippets = described_class.new(user, author: user, visibility: Snippet::INTERNAL).execute
+ snippets = described_class.new(user, author: user, scope: :are_internal).execute
expect(snippets).to include(snippet2)
expect(snippets).not_to include(snippet1, snippet3)
end
it "returns private snippets" do
- snippets = described_class.new(user, author: user, visibility: Snippet::PRIVATE).execute
+ snippets = described_class.new(user, author: user, scope: :are_private).execute
expect(snippets).to include(snippet1)
expect(snippets).not_to include(snippet2, snippet3)
end
it "returns public snippets" do
- snippets = described_class.new(user, author: user, visibility: Snippet::PUBLIC).execute
+ snippets = described_class.new(user, author: user, scope: :are_public).execute
expect(snippets).to include(snippet3)
expect(snippets).not_to include(snippet1, snippet2)
@@ -98,6 +95,13 @@ describe SnippetsFinder do
expect(snippets).to include(snippet3)
expect(snippets).not_to include(snippet2, snippet1)
end
+
+ it 'returns all snippets for an admin' do
+ admin = create(:user, :admin)
+ snippets = described_class.new(admin, author: user).execute
+
+ expect(snippets).to include(snippet1, snippet2, snippet3)
+ end
end
context 'filter by project' do
@@ -126,21 +130,21 @@ describe SnippetsFinder do
end
it "returns public snippets for non project members" do
- snippets = described_class.new(user, project: project1, visibility: Snippet::PUBLIC).execute
+ snippets = described_class.new(user, project: project1, scope: :are_public).execute
expect(snippets).to include(@snippet3)
expect(snippets).not_to include(@snippet1, @snippet2)
end
it "returns internal snippets for non project members" do
- snippets = described_class.new(user, project: project1, visibility: Snippet::INTERNAL).execute
+ snippets = described_class.new(user, project: project1, scope: :are_internal).execute
expect(snippets).to include(@snippet2)
expect(snippets).not_to include(@snippet1, @snippet3)
end
it "does not return private snippets for non project members" do
- snippets = described_class.new(user, project: project1, visibility: Snippet::PRIVATE).execute
+ snippets = described_class.new(user, project: project1, scope: :are_private).execute
expect(snippets).not_to include(@snippet1, @snippet2, @snippet3)
end
@@ -156,10 +160,17 @@ describe SnippetsFinder do
it "returns private snippets for project members" do
project1.add_developer(user)
- snippets = described_class.new(user, project: project1, visibility: Snippet::PRIVATE).execute
+ snippets = described_class.new(user, project: project1, scope: :are_private).execute
expect(snippets).to include(@snippet1)
end
+
+ it 'returns all snippets for an admin' do
+ admin = create(:user, :admin)
+ snippets = described_class.new(admin, project: project1).execute
+
+ expect(snippets).to include(@snippet1, @snippet2, @snippet3)
+ end
end
describe '#execute' do
@@ -184,4 +195,6 @@ describe SnippetsFinder do
end
end
end
+
+ it_behaves_like 'snippet visibility'
end
diff --git a/spec/finders/template_finder_spec.rb b/spec/finders/template_finder_spec.rb
new file mode 100644
index 00000000000..114af9461e0
--- /dev/null
+++ b/spec/finders/template_finder_spec.rb
@@ -0,0 +1,51 @@
+require 'spec_helper'
+
+describe TemplateFinder do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#build' do
+ let(:project) { build_stubbed(:project) }
+
+ where(:type, :expected_class) do
+ :dockerfiles | described_class
+ :gitignores | described_class
+ :gitlab_ci_ymls | described_class
+ :licenses | ::LicenseTemplateFinder
+ end
+
+ with_them do
+ subject(:finder) { described_class.build(type, project) }
+
+ it { is_expected.to be_a(expected_class) }
+ it { expect(finder.project).to eq(project) }
+ end
+ end
+
+ describe '#execute' do
+ where(:type, :vendored_name) do
+ :dockerfiles | 'Binary'
+ :gitignores | 'Actionscript'
+ :gitlab_ci_ymls | 'Android'
+ end
+
+ with_them do
+ it 'returns all vendored templates when no name is specified' do
+ result = described_class.new(type, nil).execute
+
+ expect(result).to include(have_attributes(name: vendored_name))
+ end
+
+ it 'returns only the specified vendored template when a name is specified' do
+ result = described_class.new(type, nil, name: vendored_name).execute
+
+ expect(result).to have_attributes(name: vendored_name)
+ end
+
+ it 'returns nil when an unknown name is specified' do
+ result = described_class.new(type, nil, name: 'unknown').execute
+
+ expect(result).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/finders/todos_finder_spec.rb b/spec/finders/todos_finder_spec.rb
index 7f7cfb2cb98..d4ed41d54f0 100644
--- a/spec/finders/todos_finder_spec.rb
+++ b/spec/finders/todos_finder_spec.rb
@@ -105,9 +105,24 @@ describe TodosFinder do
todos = finder.new(user, { sort: 'priority' }).execute
- puts todos.to_sql
expect(todos).to eq([todo_3, todo_5, todo_4, todo_2, todo_1])
end
end
end
+
+ describe '#any_for_target?' do
+ it 'returns true if there are any todos for the given target' do
+ todo = create(:todo, :pending)
+ finder = described_class.new(todo.user)
+
+ expect(finder.any_for_target?(todo.target)).to eq(true)
+ end
+
+ it 'returns false if there are no todos for the given target' do
+ issue = create(:issue)
+ finder = described_class.new(issue.author)
+
+ expect(finder.any_for_target?(issue)).to eq(false)
+ end
+ end
end
diff --git a/spec/finders/user_finder_spec.rb b/spec/finders/user_finder_spec.rb
new file mode 100644
index 00000000000..4771b878b8e
--- /dev/null
+++ b/spec/finders/user_finder_spec.rb
@@ -0,0 +1,179 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe UserFinder do
+ set(:user) { create(:user) }
+
+ describe '#find_by_id' do
+ context 'when the user exists' do
+ it 'returns the user' do
+ found = described_class.new(user.id).find_by_id
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (id as string)' do
+ it 'returns the user' do
+ found = described_class.new(user.id.to_s).find_by_id
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'returns nil' do
+ found = described_class.new(1).find_by_id
+
+ expect(found).to be_nil
+ end
+ end
+ end
+
+ describe '#find_by_username' do
+ context 'when the user exists' do
+ it 'returns the user' do
+ found = described_class.new(user.username).find_by_username
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'returns nil' do
+ found = described_class.new("non_existent_username").find_by_username
+
+ expect(found).to be_nil
+ end
+ end
+ end
+
+ describe '#find_by_id_or_username' do
+ context 'when the user exists (id)' do
+ it 'returns the user' do
+ found = described_class.new(user.id).find_by_id_or_username
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (id as string)' do
+ it 'returns the user' do
+ found = described_class.new(user.id.to_s).find_by_id_or_username
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (username)' do
+ it 'returns the user' do
+ found = described_class.new(user.username).find_by_id_or_username
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist (username)' do
+ it 'returns nil' do
+ found = described_class.new("non_existent_username").find_by_id_or_username
+
+ expect(found).to be_nil
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'returns nil' do
+ found = described_class.new(1).find_by_id_or_username
+
+ expect(found).to be_nil
+ end
+ end
+ end
+
+ describe '#find_by_id!' do
+ context 'when the user exists' do
+ it 'returns the user' do
+ found = described_class.new(user.id).find_by_id!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (id as string)' do
+ it 'returns the user' do
+ found = described_class.new(user.id.to_s).find_by_id!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'raises ActiveRecord::RecordNotFound' do
+ finder = described_class.new(1)
+
+ expect { finder.find_by_id! }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+
+ describe '#find_by_username!' do
+ context 'when the user exists' do
+ it 'returns the user' do
+ found = described_class.new(user.username).find_by_username!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'raises ActiveRecord::RecordNotFound' do
+ finder = described_class.new("non_existent_username")
+
+ expect { finder.find_by_username! }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+
+ describe '#find_by_id_or_username!' do
+ context 'when the user exists (id)' do
+ it 'returns the user' do
+ found = described_class.new(user.id).find_by_id_or_username!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (id as string)' do
+ it 'returns the user' do
+ found = described_class.new(user.id.to_s).find_by_id_or_username!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user exists (username)' do
+ it 'returns the user' do
+ found = described_class.new(user.username).find_by_id_or_username!
+
+ expect(found).to eq(user)
+ end
+ end
+
+ context 'when the user does not exist (username)' do
+ it 'raises ActiveRecord::RecordNotFound' do
+ finder = described_class.new("non_existent_username")
+
+ expect { finder.find_by_id_or_username! }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'when the user does not exist' do
+ it 'raises ActiveRecord::RecordNotFound' do
+ finder = described_class.new(1)
+
+ expect { finder.find_by_id_or_username! }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+end
diff --git a/spec/finders/user_recent_events_finder_spec.rb b/spec/finders/user_recent_events_finder_spec.rb
index 58470f4c84d..c5fcd68eb4c 100644
--- a/spec/finders/user_recent_events_finder_spec.rb
+++ b/spec/finders/user_recent_events_finder_spec.rb
@@ -13,49 +13,25 @@ describe UserRecentEventsFinder do
subject(:finder) { described_class.new(current_user, project_owner) }
describe '#execute' do
- context 'current user does not have access to projects' do
- it 'returns public and internal events' do
- records = finder.execute
-
- expect(records).to include(public_event, internal_event)
- expect(records).not_to include(private_event)
+ context 'when profile is public' do
+ it 'returns all the events' do
+ expect(finder.execute).to include(private_event, internal_event, public_event)
end
end
- context 'when current user has access to the projects' do
- before do
- private_project.add_developer(current_user)
- internal_project.add_developer(current_user)
- public_project.add_developer(current_user)
- end
-
- context 'when profile is public' do
- it 'returns all the events' do
- expect(finder.execute).to include(private_event, internal_event, public_event)
- end
- end
-
- context 'when profile is private' do
- it 'returns no event' do
- allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
- expect(finder.execute).to be_empty
- end
- end
+ context 'when profile is private' do
+ it 'returns no event' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
- it 'does not include the events if the user cannot read cross project' do
- expect(Ability).to receive(:allowed?).and_call_original
- expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
expect(finder.execute).to be_empty
end
end
- context 'when current user is anonymous' do
- let(:current_user) { nil }
-
- it 'returns public events only' do
- expect(finder.execute).to eq([public_event])
- end
+ it 'does not include the events if the user cannot read cross project' do
+ expect(Ability).to receive(:allowed?).and_call_original
+ expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
+ expect(finder.execute).to be_empty
end
end
end
diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb
index 4249c52c481..fecf97dc641 100644
--- a/spec/finders/users_finder_spec.rb
+++ b/spec/finders/users_finder_spec.rb
@@ -22,6 +22,12 @@ describe UsersFinder do
expect(users).to contain_exactly(user1)
end
+ it 'filters by username (case insensitive)' do
+ users = described_class.new(user, username: 'joHNdoE').execute
+
+ expect(users).to contain_exactly(user1)
+ end
+
it 'filters by search' do
users = described_class.new(user, search: 'orando').execute
diff --git a/spec/finders/users_with_pending_todos_finder_spec.rb b/spec/finders/users_with_pending_todos_finder_spec.rb
new file mode 100644
index 00000000000..fa15355531c
--- /dev/null
+++ b/spec/finders/users_with_pending_todos_finder_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe UsersWithPendingTodosFinder do
+ describe '#execute' do
+ it 'returns the users for all pending todos of a target' do
+ issue = create(:issue)
+ note = create(:note)
+ todo = create(:todo, :pending, target: issue)
+
+ create(:todo, :pending, target: note)
+
+ users = described_class.new(issue).execute
+
+ expect(users).to eq([todo.user])
+ end
+ end
+end
diff --git a/spec/fixtures/api/schemas/deployment.json b/spec/fixtures/api/schemas/deployment.json
index 536e6475c23..0828f113495 100644
--- a/spec/fixtures/api/schemas/deployment.json
+++ b/spec/fixtures/api/schemas/deployment.json
@@ -1,45 +1,58 @@
{
- "additionalProperties": false,
- "properties": {
- "created_at": {
- "type": "string"
- },
- "id": {
- "type": "integer"
- },
- "iid": {
- "type": "integer"
- },
- "last?": {
- "type": "boolean"
- },
- "ref": {
- "additionalProperties": false,
- "properties": {
- "name": {
- "type": "string"
- }
- },
- "required": [
- "name"
- ],
- "type": "object"
- },
- "sha": {
- "type": "string"
- },
- "tag": {
- "type": "boolean"
- }
+ "type": "object",
+ "required": [
+ "sha",
+ "created_at",
+ "iid",
+ "tag",
+ "last?",
+ "ref",
+ "id"
+ ],
+ "properties": {
+ "created_at": { "type": "string" },
+ "id": { "type": "integer" },
+ "iid": { "type": "integer" },
+ "last?": { "type": "boolean" },
+ "ref": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": { "type": "string" },
+ "ref_path": { "type": "string" }
+ },
+ "additionalProperties": false
},
- "required": [
- "sha",
- "created_at",
- "iid",
- "tag",
- "last?",
- "ref",
- "id"
- ],
- "type": "object"
+ "sha": { "type": "string" },
+ "tag": { "type": "boolean" },
+ "user": {
+ "oneOf": [
+ { "type": "null" },
+ { "$ref": "entities/user.json" }
+ ]
+ },
+ "commit": {
+ "oneOf": [
+ { "type": "null" },
+ { "$ref": "entities/commit.json" }
+ ]
+ },
+ "deployable": {
+ "oneOf": [
+ { "type": "null" },
+ { "$ref": "job/job.json" }
+ ]
+ },
+ "manual_actions": {
+ "type": "array",
+ "items": { "$ref": "job/job.json" }
+ },
+ "scheduled_actions": {
+ "type": "array",
+ "items": { "$ref": "job/job.json" }
+ }
+ },
+ "additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/entities/commit.json b/spec/fixtures/api/schemas/entities/commit.json
new file mode 100644
index 00000000000..324702e3f94
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/commit.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "allOf": [
+ { "$ref": "../public_api/v4/commit/basic.json" },
+ {
+ "type": "object",
+ "required": [
+ "author_gravatar_url",
+ "commit_url",
+ "commit_path",
+ "author"
+ ],
+ "properties": {
+ "author_gravatar_url": { "type": "string" },
+ "commit_url": { "type": "string" },
+ "commit_path": { "type": "string" },
+ "author": {
+ "oneOf": [
+ { "type": "null" },
+ { "$ref": "user.json" }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/api/schemas/entities/diff_line.json b/spec/fixtures/api/schemas/entities/diff_line.json
new file mode 100644
index 00000000000..66e8b443e1b
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/diff_line.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "required": ["type"],
+ "properties": {
+ "line_code": { "type": ["string", "null"] },
+ "type": { "type": ["string", "null"] },
+ "old_line": { "type": ["integer", "null"] },
+ "new_line": { "type": ["integer", "null"] },
+ "text": { "type": ["string"] },
+ "rich_text": { "type": ["string"] },
+ "meta_data": { "type": ["object", "null"] }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/diff_line_parallel.json b/spec/fixtures/api/schemas/entities/diff_line_parallel.json
new file mode 100644
index 00000000000..f924eb0c601
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/diff_line_parallel.json
@@ -0,0 +1,11 @@
+{
+ "required" : [
+ "left",
+ "right"
+ ],
+ "properties" : {
+ "left": { "$ref": "diff_line.json" },
+ "right": { "$ref": "diff_line.json" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/diff_viewer.json b/spec/fixtures/api/schemas/entities/diff_viewer.json
new file mode 100644
index 00000000000..19780f49a88
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/diff_viewer.json
@@ -0,0 +1,8 @@
+{
+ "type": "object",
+ "required": ["name"],
+ "properties": {
+ "name": { "type": ["string"] }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/issue_board.json b/spec/fixtures/api/schemas/entities/issue_board.json
new file mode 100644
index 00000000000..3e252ddd13c
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/issue_board.json
@@ -0,0 +1,39 @@
+{
+ "type": "object",
+ "properties" : {
+ "id": { "type": "integer" },
+ "iid": { "type": "integer" },
+ "title": { "type": "string" },
+ "confidential": { "type": "boolean" },
+ "due_date": { "type": "date" },
+ "project_id": { "type": "integer" },
+ "relative_position": { "type": ["integer", "null"] },
+ "time_estimate": { "type": "integer" },
+ "weight": { "type": "integer" },
+ "project": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "integer" },
+ "path": { "type": "string" }
+ }
+ },
+ "milestone": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "integer" },
+ "title": { "type": "string" }
+ }
+ },
+ "assignees": { "type": ["array", "null"] },
+ "labels": {
+ "type": "array",
+ "items": { "$ref": "label.json" }
+ },
+ "reference_path": { "type": "string" },
+ "real_path": { "type": "string" },
+ "issue_sidebar_endpoint": { "type": "string" },
+ "toggle_subscription_endpoint": { "type": "string" },
+ "assignable_labels_endpoint": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/merge_request_widget.json b/spec/fixtures/api/schemas/entities/merge_request_widget.json
index c40977bc4ee..35971d564d5 100644
--- a/spec/fixtures/api/schemas/entities/merge_request_widget.json
+++ b/spec/fixtures/api/schemas/entities/merge_request_widget.json
@@ -46,6 +46,7 @@
"diff_head_commit_short_id": { "type": ["string", "null"] },
"merge_commit_message": { "type": ["string", "null"] },
"pipeline": { "type": ["object", "null"] },
+ "merge_pipeline": { "type": ["object", "null"] },
"work_in_progress": { "type": "boolean" },
"source_branch_exists": { "type": "boolean" },
"mergeable_discussions_state": { "type": "boolean" },
diff --git a/spec/fixtures/api/schemas/entities/note_user_entity.json b/spec/fixtures/api/schemas/entities/note_user_entity.json
new file mode 100644
index 00000000000..9b838054563
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/note_user_entity.json
@@ -0,0 +1,21 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "state",
+ "avatar_url",
+ "path",
+ "name",
+ "username"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "state": { "type": "string" },
+ "avatar_url": { "type": "string" },
+ "path": { "type": "string" },
+ "name": { "type": "string" },
+ "username": { "type": "string" },
+ "status_tooltip_html": { "$ref": "../types/nullable_string.json" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/user.json b/spec/fixtures/api/schemas/entities/user.json
index 6482e0eedd2..82d80b75cef 100644
--- a/spec/fixtures/api/schemas/entities/user.json
+++ b/spec/fixtures/api/schemas/entities/user.json
@@ -5,13 +5,19 @@
"state",
"avatar_url",
"web_url",
- "path"
+ "path",
+ "name",
+ "username"
],
"properties": {
"id": { "type": "integer" },
"state": { "type": "string" },
"avatar_url": { "type": "string" },
"web_url": { "type": "string" },
- "path": { "type": "string" }
- }
+ "path": { "type": "string" },
+ "name": { "type": "string" },
+ "username": { "type": "string" },
+ "status_tooltip_html": { "$ref": "../types/nullable_string.json" }
+ },
+ "additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/environment.json b/spec/fixtures/api/schemas/environment.json
new file mode 100644
index 00000000000..f1d33e3ce7b
--- /dev/null
+++ b/spec/fixtures/api/schemas/environment.json
@@ -0,0 +1,38 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "state",
+ "external_url",
+ "environment_type",
+ "has_stop_action",
+ "environment_path",
+ "stop_path",
+ "folder_path",
+ "created_at",
+ "updated_at",
+ "can_stop"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "state": { "type": "string" },
+ "external_url": { "$ref": "types/nullable_string.json" },
+ "environment_type": { "$ref": "types/nullable_string.json" },
+ "has_stop_action": { "type": "boolean" },
+ "environment_path": { "type": "string" },
+ "stop_path": { "type": "string" },
+ "folder_path": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "updated_at": { "type": "string", "format": "date-time" },
+ "can_stop": { "type": "boolean" },
+ "last_deployment": {
+ "oneOf": [
+ { "type": "null" },
+ { "$ref": "deployment.json" }
+ ]
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/http_method.json b/spec/fixtures/api/schemas/http_method.json
new file mode 100644
index 00000000000..c0f8acc5781
--- /dev/null
+++ b/spec/fixtures/api/schemas/http_method.json
@@ -0,0 +1,5 @@
+{
+ "type": "string",
+ "description": "HTTP methods that the API can specify to send.",
+ "enum": [ "post", "get", "put", "patch" ]
+}
diff --git a/spec/fixtures/api/schemas/issue.json b/spec/fixtures/api/schemas/issue.json
index 8833825e3fb..a83ec55cede 100644
--- a/spec/fixtures/api/schemas/issue.json
+++ b/spec/fixtures/api/schemas/issue.json
@@ -13,8 +13,10 @@
"confidential": { "type": "boolean" },
"due_date": { "type": ["date", "null"] },
"relative_position": { "type": "integer" },
+ "time_estimate": { "type": "integer" },
"issue_sidebar_endpoint": { "type": "string" },
"toggle_subscription_endpoint": { "type": "string" },
+ "assignable_labels_endpoint": { "type": "string" },
"reference_path": { "type": "string" },
"real_path": { "type": "string" },
"project": {
diff --git a/spec/fixtures/api/schemas/job.json b/spec/fixtures/api/schemas/job.json
deleted file mode 100644
index 7b92ab25bc1..00000000000
--- a/spec/fixtures/api/schemas/job.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "type": "object",
- "required": [
- "id",
- "name",
- "started",
- "build_path",
- "playable",
- "created_at",
- "updated_at",
- "status"
- ],
- "properties": {
- "id": { "type": "integer" },
- "name": { "type": "string" },
- "started": { "type": "boolean" } ,
- "build_path": { "type": "string" },
- "playable": { "type": "boolean" },
- "created_at": { "type": "string" },
- "updated_at": { "type": "string" },
- "status": { "$ref": "ci_detailed_status.json" }
- },
- "additionalProperties": false
-}
diff --git a/spec/fixtures/api/schemas/job/artifact.json b/spec/fixtures/api/schemas/job/artifact.json
new file mode 100644
index 00000000000..1812e69fbd6
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/artifact.json
@@ -0,0 +1,11 @@
+{
+ "type": "object",
+ "properties": {
+ "download_path": { "type": "string"},
+ "browse_path": { "type": "string"},
+ "keep_path": { "type": "string"},
+ "expired": { "type": "boolean" },
+ "expire_at": { "type": "string", "format": "date-time" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/job/deployment_status.json b/spec/fixtures/api/schemas/job/deployment_status.json
new file mode 100644
index 00000000000..83b1899fdf3
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/deployment_status.json
@@ -0,0 +1,25 @@
+{
+ "type": "object",
+ "required": [
+ "status",
+ "environment"
+ ],
+ "properties": {
+ "status": {
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "last",
+ "creating",
+ "failed",
+ "out_of_date"
+ ]
+ },
+ { "type": "null" }
+ ]
+ },
+ "environment": { "$ref": "../environment.json" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/job/job.json b/spec/fixtures/api/schemas/job/job.json
new file mode 100644
index 00000000000..f3d5e9b038a
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/job.json
@@ -0,0 +1,35 @@
+{
+ "description": "Basic job information",
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "started",
+ "build_path",
+ "playable",
+ "created_at",
+ "updated_at",
+ "status",
+ "archived"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "started": {
+ "oneOf": [
+ { "type": "string", "format": "date-time" },
+ { "type": "boolean" }
+ ]
+ },
+ "build_path": { "type": "string" },
+ "retry_path": { "type": "string" },
+ "playable": { "type": "boolean" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" },
+ "status": { "$ref": "../status/ci_detailed_status.json" },
+ "callout_message": { "type": "string" },
+ "recoverable": { "type": "boolean" },
+ "archived": { "type": "boolean" }
+ },
+ "additionalProperties": true
+}
diff --git a/spec/fixtures/api/schemas/job/job_details.json b/spec/fixtures/api/schemas/job/job_details.json
new file mode 100644
index 00000000000..cdf7b049ab6
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/job_details.json
@@ -0,0 +1,24 @@
+{
+ "allOf": [
+ { "$ref": "job.json" }
+ ],
+ "description": "An extension of job.json with more detailed information",
+ "required": [
+ "artifact",
+ "runner",
+ "runners",
+ "has_trace",
+ "stage"
+ ],
+ "properties": {
+ "artifact": { "$ref": "artifact.json" },
+ "terminal_path": { "type": "string" },
+ "trigger": { "$ref": "trigger.json" },
+ "deployment_status": { "$ref": "deployment_status.json" },
+ "runner": { "$ref": "runner.json" },
+ "runners": { "$ref": "runners.json" },
+ "has_trace": { "type": "boolean" },
+ "stage": { "type": "string" },
+ "stuck": { "type": "boolean" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/job/runner.json b/spec/fixtures/api/schemas/job/runner.json
new file mode 100644
index 00000000000..acfeeeeb808
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/runner.json
@@ -0,0 +1,17 @@
+{
+ "oneOf": [
+ { "type": "null" },
+ {
+ "type": "object",
+ "required": [
+ "id",
+ "description"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "description": { "type": "string" },
+ "edit_path": { "type": "string" }
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/api/schemas/job/runners.json b/spec/fixtures/api/schemas/job/runners.json
new file mode 100644
index 00000000000..646bfd3a82d
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/runners.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "required": [
+ "online",
+ "available"
+ ],
+ "properties": {
+ "online": { "type": "boolean" },
+ "available": { "type": "boolean" },
+ "settings_path": { "type": "string" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/job/trigger.json b/spec/fixtures/api/schemas/job/trigger.json
new file mode 100644
index 00000000000..1c7e9cc7693
--- /dev/null
+++ b/spec/fixtures/api/schemas/job/trigger.json
@@ -0,0 +1,28 @@
+{
+ "type": "object",
+ "required": [
+ "short_token",
+ "variables"
+ ],
+ "properties": {
+ "short_token": { "type": "string" },
+ "variables": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "key",
+ "value",
+ "public"
+ ],
+ "properties": {
+ "key": { "type": "string" },
+ "value": { "type": "string" },
+ "public": { "type": "boolean" }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/pipeline_stage.json b/spec/fixtures/api/schemas/pipeline_stage.json
index 55454200bb3..c01a1946185 100644
--- a/spec/fixtures/api/schemas/pipeline_stage.json
+++ b/spec/fixtures/api/schemas/pipeline_stage.json
@@ -13,10 +13,15 @@
"groups": { "optional": true },
"latest_statuses": {
"type": "array",
- "items": { "$ref": "job.json" },
+ "items": { "$ref": "job/job.json" },
"optional": true
},
- "status": { "$ref": "ci_detailed_status.json" },
+ "retried": {
+ "type": "array",
+ "items": { "$ref": "job/job.json" },
+ "optional": true
+ },
+ "status": { "$ref": "status/ci_detailed_status.json" },
"path": { "type": "string" },
"dropdown_path": { "type": "string" }
},
diff --git a/spec/fixtures/api/schemas/public_api/v4/branch.json b/spec/fixtures/api/schemas/public_api/v4/branch.json
index a8891680d06..3b0f010bc4f 100644
--- a/spec/fixtures/api/schemas/public_api/v4/branch.json
+++ b/spec/fixtures/api/schemas/public_api/v4/branch.json
@@ -5,6 +5,7 @@
"commit",
"merged",
"protected",
+ "default",
"developers_can_push",
"developers_can_merge"
],
@@ -13,6 +14,7 @@
"commit": { "$ref": "commit/basic.json" },
"merged": { "type": "boolean" },
"protected": { "type": "boolean" },
+ "default": { "type": "boolean" },
"developers_can_push": { "type": "boolean" },
"developers_can_merge": { "type": "boolean" },
"can_push": { "type": "boolean" }
diff --git a/spec/fixtures/api/schemas/public_api/v4/license.json b/spec/fixtures/api/schemas/public_api/v4/license.json
new file mode 100644
index 00000000000..38c8c3e9192
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/license.json
@@ -0,0 +1,30 @@
+{
+ "type": "object",
+ "required": [
+ "key",
+ "name",
+ "nickname",
+ "popular",
+ "html_url",
+ "source_url",
+ "description",
+ "conditions",
+ "permissions",
+ "limitations",
+ "content"
+ ],
+ "properties": {
+ "key": { "type": "string" },
+ "name": { "type": "string" },
+ "nickname": { "type": ["null", "string"] },
+ "popular": { "type": "boolean" },
+ "html_url": { "type": ["null", "string"] },
+ "source_url": { "type": ["null", "string"] },
+ "description": { "type": ["null", "string"] },
+ "conditions": { "type": "array", "items": { "type": "string" } },
+ "permissions": { "type": "array", "items": { "type": "string" } },
+ "limitations": { "type": "array", "items": { "type": "string" } },
+ "content": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/merge_requests.json b/spec/fixtures/api/schemas/public_api/v4/merge_requests.json
index f7adc4e0b91..6df27bf32b9 100644
--- a/spec/fixtures/api/schemas/public_api/v4/merge_requests.json
+++ b/spec/fixtures/api/schemas/public_api/v4/merge_requests.json
@@ -9,6 +9,32 @@
"title": { "type": "string" },
"description": { "type": ["string", "null"] },
"state": { "type": "string" },
+ "merged_by": {
+ "type": ["object", "null"],
+ "properties": {
+ "name": { "type": "string" },
+ "username": { "type": "string" },
+ "id": { "type": "integer" },
+ "state": { "type": "string" },
+ "avatar_url": { "type": "uri" },
+ "web_url": { "type": "uri" }
+ },
+ "additionalProperties": false
+ },
+ "merged_at": { "type": ["date", "null"] },
+ "closed_by": {
+ "type": ["object", "null"],
+ "properties": {
+ "name": { "type": "string" },
+ "username": { "type": "string" },
+ "id": { "type": "integer" },
+ "state": { "type": "string" },
+ "avatar_url": { "type": "uri" },
+ "web_url": { "type": "uri" }
+ },
+ "additionalProperties": false
+ },
+ "closed_at": { "type": ["date", "null"] },
"created_at": { "type": "date" },
"updated_at": { "type": "date" },
"target_branch": { "type": "string" },
diff --git a/spec/fixtures/api/schemas/public_api/v4/template.json b/spec/fixtures/api/schemas/public_api/v4/template.json
new file mode 100644
index 00000000000..38601aa6b45
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/template.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "content"
+ ],
+ "properties": {
+ "name": { "type": "string" },
+ "content": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/template_list.json b/spec/fixtures/api/schemas/public_api/v4/template_list.json
new file mode 100644
index 00000000000..2336dafb17b
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/template_list.json
@@ -0,0 +1,15 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "key",
+ "name"
+ ],
+ "properties": {
+ "key": { "type": "string" },
+ "name": { "type": "string" }
+ },
+ "additionalProperties": false
+ }
+}
diff --git a/spec/fixtures/api/schemas/status/action.json b/spec/fixtures/api/schemas/status/action.json
new file mode 100644
index 00000000000..99a576e6c5b
--- /dev/null
+++ b/spec/fixtures/api/schemas/status/action.json
@@ -0,0 +1,22 @@
+{
+ "type": "object",
+ "required": [
+ "icon",
+ "title",
+ "path",
+ "method"
+ ],
+ "properties": {
+ "icon": {
+ "type": "string",
+ "enum": [
+ "retry",
+ "play",
+ "cancel"
+ ]
+ },
+ "title": { "type": "string" },
+ "path": { "type": "string" },
+ "method": { "$ref": "../http_method.json" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/ci_detailed_status.json b/spec/fixtures/api/schemas/status/ci_detailed_status.json
index 01e34249bf1..8d0f1e4a6af 100644
--- a/spec/fixtures/api/schemas/ci_detailed_status.json
+++ b/spec/fixtures/api/schemas/status/ci_detailed_status.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "required" : [
+ "required": [
"icon",
"text",
"label",
@@ -18,7 +18,9 @@
"tooltip": { "type": "string" },
"has_details": { "type": "boolean" },
"details_path": { "type": "string" },
- "favicon": { "type": "string" }
+ "favicon": { "type": "string" },
+ "illustration": { "$ref": "illustration.json" },
+ "action": { "$ref": "action.json" }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/status/illustration.json b/spec/fixtures/api/schemas/status/illustration.json
new file mode 100644
index 00000000000..9a085f5f1ee
--- /dev/null
+++ b/spec/fixtures/api/schemas/status/illustration.json
@@ -0,0 +1,19 @@
+{
+ "oneOf": [
+ { "type": "null" },
+ {
+ "type": "object",
+ "required": [
+ "image",
+ "size",
+ "title"
+ ],
+ "properties": {
+ "image": { "type": "string" },
+ "size": { "type": "string" },
+ "title": { "type": "string" },
+ "content": { "type": "string" }
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/api/schemas/types/nullable_string.json b/spec/fixtures/api/schemas/types/nullable_string.json
new file mode 100644
index 00000000000..e3b0baef849
--- /dev/null
+++ b/spec/fixtures/api/schemas/types/nullable_string.json
@@ -0,0 +1,6 @@
+{
+ "oneOf": [
+ { "type": "null" },
+ { "type": "string" }
+ ]
+}
diff --git a/spec/fixtures/authentication/saml2_response.xml b/spec/fixtures/authentication/saml2_response.xml
new file mode 100644
index 00000000000..67dea7209e9
--- /dev/null
+++ b/spec/fixtures/authentication/saml2_response.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema" Destination="https://example.hello.com/access/saml" ID="jVFQbyEpSfUwqhZtJtarIaGoshwuAQMDwLoiMhzJXsv" InResponseTo="cfeooghajnhofcmogakmlhpkohnmikicnfhdnjlc" IssueInstant="2011-06-21T13:54:38.661Z" Version="2.0">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">https://idm.orademo.com</saml2:Issuer>
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:SignedInfo>
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+ <ds:Reference URI="#jVFQbyEpSfUwqhZtJtarIaGoshwuAQMDwLoiMhzJXsv">
+ <ds:Transforms>
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
+ <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/>
+ </ds:Transform>
+ </ds:Transforms>
+ <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+ <ds:DigestValue>uHuSry39P16Yh7srS32xESmj4Lw=</ds:DigestValue>
+ </ds:Reference>
+ </ds:SignedInfo>
+ <ds:SignatureValue>fdghdfggfd=</ds:SignatureValue>
+ <ds:KeyInfo>
+ <ds:X509Data>
+ <ds:X509Certificate>dfghjkl</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </ds:Signature>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="emmCjammnYdAbMWDuMAJeZvQIMBayeeYqqwvQoDclKE" IssueInstant="2011-06-21T13:54:38.676Z" Version="2.0">
+ <saml2:Issuer>https://idm.orademo.com</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" NameQualifier="idp.example.org">someone@example.org</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="cfeooghajnhofcmogakmlhpkohnmikicnfhdnjlc" NotOnOrAfter="2011-06-21T14:09:38.676Z" Recipient="https://example.hello.com/access/saml"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2011-06-21T13:54:38.683Z" NotOnOrAfter="2011-06-21T14:09:38.683Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>hello.com</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2011-06-21T13:54:38.685Z" SessionIndex="perdkjfskdjfksdiertusfsdfsddeurtherukjdfgkdffg">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute Name="FirstName">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Someone</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="LastName">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Special</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/spec/fixtures/codequality/codequality.json b/spec/fixtures/codequality/codequality.json
new file mode 100644
index 00000000000..89cc4b46521
--- /dev/null
+++ b/spec/fixtures/codequality/codequality.json
@@ -0,0 +1 @@
+[{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `simulateDrag` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a995a617b0ce0599b6d0a5649a308a8e","location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":75,"end":137}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `simulateEvent` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e50b54fce33185efbb17d1c0d210b439","location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":1,"end":37}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `simulateDrag` has 51 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"75ffb8892dac22a9d50822bc69339ab2","location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":75,"end":137}},"other_locations":[],"remediation_points":1224000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"40f188d222bd1f110e8c11f08ec77c3f","location":{"path":"app/assets/javascripts/blob/3d_viewer/index.js","lines":{"begin":10,"end":47}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 60 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"95b71f07d08eb9e2368568c6d872f677","location":{"path":"app/assets/javascripts/blob/blob_file_dropzone.js","lines":{"begin":21,"end":88}},"other_locations":[],"remediation_points":1440000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`FileTemplateMediator` has 29 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"02a64abfacf06440f6504888503fe571","location":{"path":"app/assets/javascripts/blob/file_template_mediator.js","lines":{"begin":11,"end":246}},"other_locations":[],"remediation_points":2100000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ede6d8c5878fbfdda2348d1c6a808f4b","location":{"path":"app/assets/javascripts/issuable_form.js","lines":{"begin":14,"end":57}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initTargetBranchDropdown` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"748b8a39304544f015c0abcbee9b929c","location":{"path":"app/assets/javascripts/issuable_form.js","lines":{"begin":116,"end":147}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `start` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b0272210e1d618fe95522ee47f652308","location":{"path":"app/assets/javascripts/smart_interval.js","lines":{"begin":44,"end":65}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `render` has 38 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ceb92ce0f43dbe13431f1f07d5787aff","location":{"path":"app/assets/javascripts/vue_shared/components/tabs/tabs.js","lines":{"begin":35,"end":75}},"other_locations":[],"remediation_points":912000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `file_icon_map.js` has 587 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"33d443c482c7a34a3a721ef8677a9b9b","location":{"path":"app/assets/javascripts/vue_shared/components/file_icon/file_icon_map.js","lines":{"begin":1,"end":590}},"other_locations":[],"remediation_points":6052800,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `gl_dropdown.js` has 935 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"144655d5e2aa528a6e4d63861c3bc2f1","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":1,"end":1111}},"other_locations":[],"remediation_points":11064000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `GitLabDropdownInput` has 41 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4679297a043d89d437946bd083443d13","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":14,"end":58}},"other_locations":[],"remediation_points":984000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `GitLabDropdownFilter` has 55 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0c2b6bfd5d744ae2f9724aae0a60a765","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":76,"end":136}},"other_locations":[],"remediation_points":1320000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `filter` has 53 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3be214723bb15219db661db421dccba1","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":142,"end":213}},"other_locations":[],"remediation_points":1272000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `GitLabDropdown` has 172 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"45e3d28c25ef43db19fcd1f8bf7a52dc","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":296,"end":481}},"other_locations":[],"remediation_points":4128000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `parseData` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5a6929b08a7efc020e932267316a1ce4","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":505,"end":538}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `opened` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b32257d5ff71fd022c46be4ff3f196b6","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":580,"end":627}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderItem` has 77 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"119c9b263aba3cc2173646b63b83d58d","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":698,"end":793}},"other_locations":[],"remediation_points":1848000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `rowClicked` has 75 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e37288d65d5701c4b7d06560d3eb6910","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":820,"end":904}},"other_locations":[],"remediation_points":1800000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addArrowKeyEvent` has 39 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4ccf81453af86fd4e7f521423adbf28e","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":971,"end":1015}},"other_locations":[],"remediation_points":936000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `highlightRowAtIndex` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a0b5b8a75d9f5726f8a559a3068bbfd9","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":1026,"end":1073}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"nested_control_flow","content":{"body":""},"description":"Avoid deeply nested control flow statements.","location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":174,"end":184}},"other_locations":[],"remediation_points":450000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"603368a717652923897a9efd4f494784"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `onOptionClick` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a1ead8da9cc948075715df57538a53fb","location":{"path":"app/assets/javascripts/groups/groups_filterable_list.js","lines":{"begin":76,"end":122}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onOptionClick` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"aa9f5f9cb36f5307a7db44c29b5f3a4c","location":{"path":"app/assets/javascripts/groups/groups_filterable_list.js","lines":{"begin":76,"end":122}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `setSearchedGroups` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4116f1bf48693b8dbc3a19233c167489","location":{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":19,"end":33}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `formatGroupItem` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"97209b6e238a05d220f90d1e1fcf7c78","location":{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":63,"end":96}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `getGroups` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4f9fc97d0941125a5eb91818b85ac955","location":{"path":"app/assets/javascripts/groups/service/groups_service.js","lines":{"begin":9,"end":34}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 47 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1cc8f54fcedff8d025db690e89c4d3bc","location":{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":24,"end":78}},"other_locations":[],"remediation_points":1128000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d34e04056341d2986626e42b9927e829","location":{"path":"app/assets/javascripts/clusters/stores/clusters_store.js","lines":{"begin":5,"end":51}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initLayoutNav` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"858063cf6c5a28edd5390360940941f1","location":{"path":"app/assets/javascripts/layout_nav.js","lines":{"begin":12,"end":52}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `sidebarToggleClicked` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e95063093263d654532b1bda2499ae09","location":{"path":"app/assets/javascripts/right_sidebar.js","lines":{"begin":44,"end":69}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleSidebar` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b4667aa48f617e84611c658bd9e6fd42","location":{"path":"app/assets/javascripts/right_sidebar.js","lines":{"begin":201,"end":218}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `message` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f561803cb2a47ffaeed70a1f967105da","location":{"path":"app/assets/javascripts/u2f/error.js","lines":{"begin":9,"end":21}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `issueTemplate` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"36dc94ada0224320b48f9dcddf971dd3","location":{"path":"app/assets/javascripts/api.js","lines":{"begin":223,"end":223}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`Api` has 24 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"62c9c1d73c6c2f6f294b2c13a5c92e49","location":{"path":"app/assets/javascripts/api.js","lines":{"begin":5,"end":282}},"other_locations":[],"remediation_points":1600000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `validate` has 39 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8b07c343f7afe957592fac79043c9586","location":{"path":"app/assets/javascripts/new_branch_form.js","lines":{"begin":53,"end":94}},"other_locations":[],"remediation_points":936000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `labels_select.js` has 444 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"34830d2a928eacedb749d5c66c3637e9","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":1,"end":517}},"other_locations":[],"remediation_points":3993600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `setDropdownData` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"99aee27c164d2c53ee3386f64239ebc9","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":466,"end":507}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 369 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ca542a5aefb3dbadb5e0a0100a94b863","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":16,"end":429}},"other_locations":[],"remediation_points":8856000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `data` has 41 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"00d06b2fdc398a9031e900f76184076f","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":133,"end":176}},"other_locations":[],"remediation_points":984000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderRow` has 50 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ef4d877e54496d7ad4da0e0a0b96d9aa","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":177,"end":235}},"other_locations":[],"remediation_points":1200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `toggleLabel` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"35ba5b5dab8a50aa713a5ba60e1db7a1","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":242,"end":278}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `hidden` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2dc1a005647c9e7e9f81e0eabeb9563d","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":294,"end":324}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `clicked` has 75 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f7fb23f1a88e5dc4c8430529946de3dc","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":327,"end":414}},"other_locations":[],"remediation_points":1800000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setDropdownData` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"955ed39a38f4f36c3ae0d23199b6b90d","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":466,"end":507}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"nested_control_flow","content":{"body":""},"description":"Avoid deeply nested control flow statements.","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":407,"end":412}},"other_locations":[],"remediation_points":450000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"cefdca8d12fc08aff6e7a861750e99d9"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":377,"end":377}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"1d311ac9ae722bf786749b2125e5cf47"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/labels_select.js","lines":{"begin":411,"end":411}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"7d42a3bbce082d2bbdc96d5eaa747454"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `storeEnvironments` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"70cce4c4dfcfa9c7fb820fc6dea68e9c","location":{"path":"app/assets/javascripts/environments/stores/environments_store.js","lines":{"begin":36,"end":71}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `storeEnvironments` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f5b13b9d301832978862f37bcc22708f","location":{"path":"app/assets/javascripts/environments/stores/environments_store.js","lines":{"begin":36,"end":71}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `created` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"139fddb1aa522eb2c141871eab765fc3","location":{"path":"app/assets/javascripts/environments/mixins/environments_mixin.js","lines":{"begin":142,"end":175}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b4d0a598693b87337ee6b071a35c6da2","location":{"path":"app/assets/javascripts/issuable_context.js","lines":{"begin":7,"end":51}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `dropzoneInput` has 210 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"96984c8a7930ad755604f49c3edf6a2b","location":{"path":"app/assets/javascripts/dropzone_input.js","lines":{"begin":23,"end":290}},"other_locations":[],"remediation_points":5040000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1ec26d8ddc2c55de770d1f8038f590f4","location":{"path":"app/assets/javascripts/zen_mode.js","lines":{"begin":39,"end":67}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.ADD_NEW_NOTE` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"026945d2d3de0e3f478ec55a7bb820f5","location":{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":7,"end":31}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.REMOVE_PLACEHOLDER_NOTES` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"26efdceb93879d8478e3c8a4f549bc22","location":{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":66,"end":85}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`` has 22 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"75cd5c2d207814d4a7c7fbf69c709fd6","location":{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":6,"end":224}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `actions.js` has 271 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"9e2580af22da5d9875ac924fda6d0551","location":{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":1,"end":337}},"other_locations":[],"remediation_points":1502400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `saveNote` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9dbdac686defafb20b3397ccb7105ba3","location":{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":151,"end":226}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `getQuickActionText` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3019b0611c6febc7b696f0615d561d1b","location":{"path":"app/assets/javascripts/notes/stores/utils.js","lines":{"begin":7,"end":26}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `collapseSystemNotes` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"757d82e7c89224872a7bd7b269ed55c5","location":{"path":"app/assets/javascripts/notes/stores/collapse_utils.js","lines":{"begin":57,"end":105}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `unresolvedDiscussionsIdsByDiff` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"250bf3d3615586b7cdaecad2c187e0a0","location":{"path":"app/assets/javascripts/notes/stores/getters.js","lines":{"begin":117,"end":139}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `jumpToDiscussion` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ebbd3b5d75f27f2372eb1a56ca4d9206","location":{"path":"app/assets/javascripts/notes/mixins/discussion_navigation.js","lines":{"begin":5,"end":27}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `keydown` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1977a74c9fba9606480c93a63cb0d5c0","location":{"path":"app/assets/javascripts/droplab/plugins/filter.js","lines":{"begin":4,"end":47}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `keydown` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"6356352d7ef34cfddc4738ed0c5ebdbf","location":{"path":"app/assets/javascripts/droplab/plugins/filter.js","lines":{"begin":4,"end":47}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `trigger` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3ad4384530fc0032f4fafe9d12e7dc70","location":{"path":"app/assets/javascripts/droplab/plugins/ajax_filter.js","lines":{"begin":35,"end":71}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `_loadData` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"357b7070736cef3f382a2c3439a40d89","location":{"path":"app/assets/javascripts/droplab/plugins/ajax_filter.js","lines":{"begin":73,"end":92}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `trigger` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"bc97a87fa8ec1b132731256b23616434","location":{"path":"app/assets/javascripts/droplab/plugins/ajax_filter.js","lines":{"begin":35,"end":71}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `Keyboard` has a Cognitive Complexity of 49 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6b1d8f0930c09b5318307d0788ffca30","location":{"path":"app/assets/javascripts/droplab/keyboard.js","lines":{"begin":5,"end":111}},"other_locations":[],"remediation_points":4550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `Keyboard` has 96 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a812687f4ed1c53045b473f0d6aa5cb9","location":{"path":"app/assets/javascripts/droplab/keyboard.js","lines":{"begin":5,"end":111}},"other_locations":[],"remediation_points":2304000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `keydown` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e7cbff360ff21f798bf424a899291302","location":{"path":"app/assets/javascripts/droplab/keyboard.js","lines":{"begin":70,"end":107}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `highlightHash` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2bd33253a3ff30d380e94d478d49a6e7","location":{"path":"app/assets/javascripts/line_highlighter.js","lines":{"begin":59,"end":82}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `highlightRange` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4258948c78c182b6db020222636c12bb","location":{"path":"app/assets/javascripts/line_highlighter.js","lines":{"begin":144,"end":157}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `checkElementsInView` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"08e5457bd1bcf2aa36f67185fb5ab932","location":{"path":"app/assets/javascripts/lazy_loader.js","lines":{"begin":53,"end":75}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `loadImage` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1e063810e532be97a06efabd3c56e4db","location":{"path":"app/assets/javascripts/lazy_loader.js","lines":{"begin":76,"end":94}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `constructor` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a3ef386977d1577238533b8b5352a499","location":{"path":"app/assets/javascripts/diff.js","lines":{"begin":14,"end":43}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `handleClickUnfold` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f82a7cc93be5e64d548469363a77a2fb","location":{"path":"app/assets/javascripts/diff.js","lines":{"begin":45,"end":79}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initMergeConflicts` has 81 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"dd259a46f5e703e8f722acdac619ad79","location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js","lines":{"begin":12,"end":100}},"other_locations":[],"remediation_points":1944000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `merge_conflict_store.js` has 357 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"131a2e61cbfe7efc49cced2ffab3568b","location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":1,"end":436}},"other_locations":[],"remediation_points":2740800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setParallelLine` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f005034ab86d552698a2211ae91ae99a","location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":101,"end":139}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `isReadyToCommit` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"184e70a4c8de2226d5a4b197c147f2e8","location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":315,"end":351}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"nested_control_flow","content":{"body":""},"description":"Avoid deeply nested control flow statements.","location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":331,"end":333}},"other_locations":[],"remediation_points":450000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"78a238497c0c8acd6ddefbb67176f033"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `init` has 216 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0c8af9cd2b45c1c2e6e24c4678a9c6fc","location":{"path":"app/assets/javascripts/milestone_select.js","lines":{"begin":23,"end":253}},"other_locations":[],"remediation_points":5184000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `clicked` has 91 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c5e3838b8db3f11da2f72d9acaf52a17","location":{"path":"app/assets/javascripts/milestone_select.js","lines":{"begin":150,"end":250}},"other_locations":[],"remediation_points":2184000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/milestone_select.js","lines":{"begin":187,"end":187}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"9265cc21e5d1eb1bebd044e85db1bf79"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/milestone_select.js","lines":{"begin":220,"end":248}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"36ba0880a027f4448128be161cf33b26"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `createFlash` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"d8f8d96fc8578fb3f7f7bf875e0668a0","location":{"path":"app/assets/javascripts/flash.js","lines":{"begin":64,"end":69}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `textBuilder` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"877ac84192b385c963c08bb4ef960d3b","location":{"path":"app/assets/javascripts/reports/store/utils.js","lines":{"begin":10,"end":37}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e2f702de12038884b25d0ef63861bd2b","location":{"path":"app/assets/javascripts/ref_select_dropdown.js","lines":{"begin":4,"end":46}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setConfig` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"33b2d4c912bf8eb7a3c4b9c2d3302729","location":{"path":"app/assets/javascripts/close_reopen_report_toggle.js","lines":{"begin":57,"end":94}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `notes.js` has 1338 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"515dff155804bebfe20a78b3935600eb","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1,"end":1859}},"other_locations":[],"remediation_points":16867200,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `keydownNoteText` has a Cognitive Complexity of 24 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4a28bd8f572a9cb26ff49edf77e2d3a3","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":226,"end":278}},"other_locations":[],"remediation_points":2050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `renderNote` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bc0dc1a78ad18f837b6cead5d11a5ac2","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":403,"end":462}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `renderDiscussionNote` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dbb0fd84250020e115dbb0554f3dfc2a","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":471,"end":538}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleDiffNote` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ddb3cba4008791217e07933b09a14951","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1054,"end":1124}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `updateTargetButtons` has a Cognitive Complexity of 22 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4ea9fe607edc9cf98ef50a17584952c2","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1196,"end":1241}},"other_locations":[],"remediation_points":1850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `postComment` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cc8dd67d9f1598e83dc132f50b7f0726","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1604,"end":1796}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`Notes` has 74 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"5363864915c583936ec6c63c5ed96689","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":48,"end":1856}},"other_locations":[],"remediation_points":6600000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 54 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"25812d53d4eb0f340c33a5a5ddca467a","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":59,"end":121}},"other_locations":[],"remediation_points":1296000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addBinding` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9b40ee2b94454885b3fd51a8bc139c1c","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":127,"end":180}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `keydownNoteText` has 48 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"85df701d158d32b25dca1c2039b6a3be","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":226,"end":278}},"other_locations":[],"remediation_points":1152000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderNote` has 50 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8dfb4b9b4d144d82422186651b46b3e4","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":403,"end":462}},"other_locations":[],"remediation_points":1200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderDiscussionNote` has 53 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"52b66ad02e73c9b1c8848bd1affad7fc","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":471,"end":538}},"other_locations":[],"remediation_points":1272000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `removeNote` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8c1e3976ef9bdf79365857e0b8bcb5d8","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":848,"end":911}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setupDiscussionNoteForm` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d1b7947a88bd1e4b3519e282320fbb38","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":956,"end":1009}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `toggleDiffNote` has 61 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"60ae737d4dc10fe0af6e670d2d4bc7e2","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1054,"end":1124}},"other_locations":[],"remediation_points":1464000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `updateTargetButtons` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8ccd0067a20bb8afcaf3317b434b1ece","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1196,"end":1241}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `createPlaceholderNote` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ddcd3bc4735c7d763b0fe5da55217278","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1526,"end":1566}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `postComment` has 143 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"fcdd1766ceaaa90c770bddfe75d120cd","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1604,"end":1796}},"other_locations":[],"remediation_points":3432000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `updateComment` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7c508bf1571f9f4d795de4cb8ef1930a","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1811,"end":1855}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":264,"end":264}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"cd548cc7c1ebbb2263b1d2ecdb94a5dd"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":272,"end":272}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"cd548cc7c1ebbb2263b1d2ecdb94a5dd"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":275,"end":275}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"25fb735695be215146eaf2300412aae0"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `itemClicked` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"86a06125a02d35c7e121952daf7f0f08","location":{"path":"app/assets/javascripts/filtered_search/dropdown_hint.js","lines":{"begin":23,"end":60}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `itemClicked` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e7751795d821a7afa57ab25dbd658ee4","location":{"path":"app/assets/javascripts/filtered_search/dropdown_hint.js","lines":{"begin":23,"end":60}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `filterHint` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"22102abbd93e4d53a0798ecf7e058512","location":{"path":"app/assets/javascripts/filtered_search/dropdown_utils.js","lines":{"begin":117,"end":140}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getSearchQuery` has 40 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"26e123d9f4a95bfa34a59f42db0ae260","location":{"path":"app/assets/javascripts/filtered_search/dropdown_utils.js","lines":{"begin":164,"end":213}},"other_locations":[],"remediation_points":960000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `processTokens` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"28cb3a1b7fa1a51cd968e9016415efea","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_tokenizer.js","lines":{"begin":4,"end":51}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `processTokens` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"287e8c4963cc8869358280d31e4d4005","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_tokenizer.js","lines":{"begin":4,"end":51}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `loadDropdown` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"31af8cc264fa78512d238c04106208fe","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":202,"end":219}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `setDropdown` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6dda613591636a58b06a298d0980498f","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":221,"end":243}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setupMapping` has 55 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f12b787fff78b0b8986506eb90b1997c","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":50,"end":108}},"other_locations":[],"remediation_points":1320000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `load` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"90c65f9cea258055f67defcb61f63abb","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":165,"end":200}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `filtered_search_manager.js` has 514 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"45105bf38088a343a5a9c0e1ca76840e","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":1,"end":645}},"other_locations":[],"remediation_points":5001600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `setup` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c08d2326cb1eb811c4329b3ee92fc04","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":58,"end":106}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `checkForEnter` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2056e10cb965de92a331a6181618ff7f","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":236,"end":265}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `handleInputVisualToken` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3ef6573dc182d159eb13ddd70be42653","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":398,"end":438}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`FilteredSearchManager` has 32 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"dee04c9127382346c9edead8ceb49788","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":20,"end":644}},"other_locations":[],"remediation_points":2400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setup` has 38 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"fc525f4373639fe1e5e079259d587918","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":58,"end":106}},"other_locations":[],"remediation_points":912000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `bindEvents` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0036874f7fdfa7b481bccec4adce2fd9","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":145,"end":182}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `handleInputVisualToken` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"105fd464c05f365ea496107488c4d048","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":398,"end":438}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `loadSearchParamsFromURL` has 63 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"dc0a70cc2480e01d46d52df00f42980b","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":463,"end":543}},"other_locations":[],"remediation_points":1512000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `search` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8d31d46c10a7c7b27cba3e79c2c7e684","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":558,"end":607}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"nested_control_flow","content":{"body":""},"description":"Avoid deeply nested control flow statements.","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":524,"end":529}},"other_locations":[],"remediation_points":450000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"b4fcaa9a90b83251c167ce6bd363ead0"},{"categories":["Complexity"],"check_name":"nested_control_flow","content":{"body":""},"description":"Avoid deeply nested control flow statements.","location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":530,"end":533}},"other_locations":[],"remediation_points":450000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"b9acc2eaf5ae1dd8b6f24ac70e97ace6"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `users_select.js` has 594 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"9e6ca5bcc402f0dae9a9869dd46e4e77","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":1,"end":701}},"other_locations":[],"remediation_points":6153600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `UsersSelect` has 524 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b4438d98e020e34865089e812790a72e","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":14,"end":628}},"other_locations":[],"remediation_points":12576000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `processData` has 88 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9e7c9e224218cce1f434b0a0ff4616c4","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":221,"end":327}},"other_locations":[],"remediation_points":2112000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `clicked` has 64 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"19cb3539002fa7a4aa2abf730fc550bc","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":381,"end":468}},"other_locations":[],"remediation_points":1536000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderRow` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b67cb57917ef04a8b05e4be075bf6c0b","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":493,"end":531}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `query` has 48 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"447defa81cda25e0ae3f708d8cb7f927","location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":553,"end":604}},"other_locations":[],"remediation_points":1152000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleCollapsed` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"01ddc746dbdfa4103552d4d09bda67bd","location":{"path":"app/assets/javascripts/image_diff/helpers/dom_helper.js","lines":{"begin":27,"end":45}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addBadge` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5cb8fbd4ee1e42eb778a29cd02efc8f5","location":{"path":"app/assets/javascripts/image_diff/image_diff.js","lines":{"begin":84,"end":116}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1579b1a9e97ea98e6348df70287ccd85","location":{"path":"app/assets/javascripts/job.js","lines":{"begin":13,"end":70}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getBuildTrace` has 55 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0990625843278c1e0d27866b6e51ec9b","location":{"path":"app/assets/javascripts/job.js","lines":{"begin":96,"end":163}},"other_locations":[],"remediation_points":1320000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setVisibilityOptions` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"bd793c0b96469cb6904241d8beea60c0","location":{"path":"app/assets/javascripts/project_visibility.js","lines":{"begin":3,"end":35}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `restore` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ebd9e5c02ce67b5fecb0e9a610fa01a3","location":{"path":"app/assets/javascripts/autosave.js","lines":{"begin":19,"end":37}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `populateActiveMetrics` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0808d7392776f800f01eb00247cb49fc","location":{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":63,"end":100}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `loadActiveMetrics` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d2f56d70d330df4e004e4e730ec9bd7d","location":{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":102,"end":130}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `adminInit` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cb6b998e81923ba316eb986d14f16ef7","location":{"path":"app/assets/javascripts/pages/admin/admin.js","lines":{"begin":14,"end":60}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `renderState` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d23e829e807e7cfa7fa60a5bd8bd2a4f","location":{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":49,"end":72}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":70,"end":70}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"59ee4d34d9113510c329a2b264aae308"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `showTab` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2db6bb70760f9a2493d374e830395ef3","location":{"path":"app/assets/javascripts/pages/sessions/new/signin_tabs_memoizer.js","lines":{"begin":34,"end":47}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 52 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"364739acddb57495be3b94860555f2ae","location":{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":13,"end":72}},"other_locations":[],"remediation_points":1248000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initRefSwitcher` has 63 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e62a2b92cc28ef2e2c5cc5e391c1b3c1","location":{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":83,"end":155}},"other_locations":[],"remediation_points":1512000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initLabelIndex` has 72 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d6cbf4de48d122212aa6790bce385c52","location":{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":9,"end":91}},"other_locations":[],"remediation_points":1728000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `stat_graph_contributors_graph.js` has 260 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"d70980224b971643c65164d7599d8306","location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":1,"end":315}},"other_locations":[],"remediation_points":1344000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `ContributorsGraph` has 68 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c5ffd1e9b7f7eb20d76540029db76ea5","location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":19,"end":107}},"other_locations":[],"remediation_points":1632000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `ContributorsMasterGraph` has 98 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c90cea5a64860bd8ebc11adfe43f966f","location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":109,"end":225}},"other_locations":[],"remediation_points":2352000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `ContributorsAuthorGraph` has 75 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cb2ba67ac3c7b0319408d414f7ab4a89","location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":227,"end":314}},"other_locations":[],"remediation_points":1800000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `parse_log` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"54a68f13ca92482f197897caa4dde8c6","location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_util.js","lines":{"begin":5,"end":31}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `renderSidebar` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7a8652d503fb546ee9566f5bf3f473ac","location":{"path":"app/assets/javascripts/pages/projects/wikis/wikis.js","lines":{"begin":54,"end":66}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `activity_calendar.js` has 257 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"c8cf6370baf6d39528465c33a636bdaa","location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":1,"end":300}},"other_locations":[],"remediation_points":1300800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `constructor` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"12e8c60549aefe50a5602474054d85e9","location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":46,"end":115}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 49 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"70826affaa552c98140c396bd20b2321","location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":46,"end":115}},"other_locations":[],"remediation_points":1176000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderDays` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b25511a5a67d72f5494bf518b57f8945","location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":144,"end":182}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderKey` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f239dc6410f68cc561519c650b54fe79","location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":226,"end":257}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 65 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"910e3f36c66a265e42a8eaf26a167c4b","location":{"path":"app/assets/javascripts/pages/search/show/search.js","lines":{"begin":6,"end":77}},"other_locations":[],"remediation_points":1560000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `showPreview` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1721f777313e23b7b202fa7491480968","location":{"path":"app/assets/javascripts/behaviors/preview_markdown.js","lines":{"begin":29,"end":64}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `copy_as_gfm.js` has 400 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"ac03b65c923edc62a2698fa8d47bed20","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":1,"end":510}},"other_locations":[],"remediation_points":3360000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `transformCodeSelection` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c2c7d04215c2bd2989380d4ec16d2fdd","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":392,"end":428}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `nodeToGFM` has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.","fingerprint":"203624a0d90ac2910cd61598bd1ba9c4","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":430,"end":473}},"other_locations":[],"remediation_points":1650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`gfmRules` has 23 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"4cef7679aa1f25cb0fb0333b4dfea466","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":169,"end":306}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `transformCodeSelection` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cc79eaa8e95f40163769d11480f6ca8c","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":392,"end":428}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `nodeToGFM` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"abacf74acfb9ae1429676cb952d5250f","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":430,"end":473}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":472,"end":472}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"4dc32f63393b2dba3bb2b4186a5a9d3c"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initPageShortcuts` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7e91b97abbe33722ed743c916435f0ab","location":{"path":"app/assets/javascripts/behaviors/shortcuts.js","lines":{"begin":3,"end":35}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3992dd4b39964f74489f5037465f0968","location":{"path":"app/assets/javascripts/behaviors/shortcuts/shortcuts.js","lines":{"begin":18,"end":51}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `updateTopState` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4115079d252dabe584b1839baffa5696","location":{"path":"app/assets/javascripts/issue.js","lines":{"begin":46,"end":74}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `bindEvents` has 99 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d911289330106e823f8b66a27a6de9a8","location":{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":38,"end":154}},"other_locations":[],"remediation_points":2376000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `chooseTemplate` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"38d61f9d4b3748a9e5ab863d54f4ccf8","location":{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":98,"end":130}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `search_autocomplete.js` has 417 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"92cc9af55c3a4ab73da8e1f0d3edd029","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":1,"end":506}},"other_locations":[],"remediation_points":3604800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `getData` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fc8158cb371adf854571129bd363b7ef","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":149,"end":251}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `getCategoryContents` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d8c7fe125446a794240cdecc04543593","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":253,"end":305}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `onSearchInputKeyUp` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4f647cc28b710d6de8a6b35f3f79f3ce","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":348,"end":382}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `onClick` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b118715fdcf7b3e7ac25f69bb1baa423","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":445,"end":458}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`SearchAutocomplete` has 28 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"4afabdab2d1c2b911d6a1c563638e8e6","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":71,"end":501}},"other_locations":[],"remediation_points":2000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setSearchOptions` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ba3145218ad79282dc1d42a52ae16802","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":32,"end":69}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"27f6673ed668afd5ac9f3fd3c02a5e40","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":72,"end":103}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getData` has 86 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a21aceb13c361e2e3e0299baa560bed5","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":149,"end":251}},"other_locations":[],"remediation_points":2064000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getCategoryContents` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"415e6e1a246f7b01199ed828bdebb278","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":253,"end":305}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onSearchInputKeyUp` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"438f5589be7d3c9865113320e8a85fc4","location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":348,"end":382}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `highlighter` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"034f805c8a510c0c46e35c2e4fb8d329","location":{"path":"app/assets/javascripts/project_find_file.js","lines":{"begin":10,"end":32}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `selectRow` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b2917d9725004429f0a4319beac0822e","location":{"path":"app/assets/javascripts/project_find_file.js","lines":{"begin":123,"end":143}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `constructor` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1b590709d469cb1c8c28f467e53d2154","location":{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":8,"end":58}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 48 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"af0c07eddd69b8e22c3e13c7474122a1","location":{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":8,"end":58}},"other_locations":[],"remediation_points":1152000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleDiff` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"098b6e689349244e7adddfcad90974a3","location":{"path":"app/assets/javascripts/single_file_diff.js","lines":{"begin":41,"end":62}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onSaveClicked` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"18922f177ff6315e508e19e5d7a6cd4d","location":{"path":"app/assets/javascripts/ci_variable_list/ajax_variable_list.js","lines":{"begin":53,"end":90}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cf8b6d0bf24fc15e2c0e87e1c6b6a636","location":{"path":"app/assets/javascripts/ci_variable_list/ci_variable_list.js","lines":{"begin":19,"end":62}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `jumpToNextUnresolvedDiscussion` has a Cognitive Complexity of 54 (exceeds 5 allowed). Consider refactoring.","fingerprint":"792eaacd2770c50c0a42bce535c7bee9","location":{"path":"app/assets/javascripts/diff_notes/components/jump_to_discussion.js","lines":{"begin":61,"end":208}},"other_locations":[],"remediation_points":5050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `jumpToNextUnresolvedDiscussion` has 102 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"784d361fd1ec4da2fc3be0e85d1e354e","location":{"path":"app/assets/javascripts/diff_notes/components/jump_to_discussion.js","lines":{"begin":61,"end":208}},"other_locations":[],"remediation_points":2448000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `buttonText` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5b0d7c1b1146fa7930c3c14fef72db27","location":{"path":"app/assets/javascripts/diff_notes/components/comment_resolve_btn.js","lines":{"begin":31,"end":45}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `diffNotesCompileComponents` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ec443ad0f520ec34248990713c0f0b5a","location":{"path":"app/assets/javascripts/diff_notes/diff_notes_bundle.js","lines":{"begin":30,"end":68}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `queryTimeSeries` has 7 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"01a425e5bd2ad64d006f35854f477ad0","location":{"path":"app/assets/javascripts/monitoring/utils/multiple_time_series.js","lines":{"begin":33,"end":33}},"other_locations":[],"remediation_points":525000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `queryTimeSeries` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f1015e96e281a9a77bdaeeba619aa36b","location":{"path":"app/assets/javascripts/monitoring/utils/multiple_time_series.js","lines":{"begin":33,"end":165}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `queryTimeSeries` has 110 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c99f8cbe0230e2f1d48ff4478f2117c4","location":{"path":"app/assets/javascripts/monitoring/utils/multiple_time_series.js","lines":{"begin":33,"end":165}},"other_locations":[],"remediation_points":2640000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `timeScaleFormat` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f52e997312984f599f152d3260bf8654","location":{"path":"app/assets/javascripts/monitoring/utils/date_time_formatters.js","lines":{"begin":22,"end":42}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"complex_logic","content":{"body":""},"description":"Consider simplifying this complex logical expression.","location":{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":95,"end":134}},"other_locations":[],"remediation_points":800000,"severity":"critical","type":"issue","engine_name":"structure","fingerprint":"531fa4647bfb14d1172613e86257dd28"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.SET_LINE_DISCUSSIONS_FOR_FILE` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f6d1e6ad89a6aec9b87ec051dfa0099d","location":{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":88,"end":135}},"other_locations":[],"remediation_points":1250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.REMOVE_LINE_DISCUSSIONS_FOR_FILE` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"967d987657c3659898f377b3d07be15b","location":{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":137,"end":165}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `types.SET_LINE_DISCUSSIONS_FOR_FILE` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"08263cf95339fef038c9b82b56e70844","location":{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":88,"end":135}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `startRenderDiffsQueue` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9d28a6db58513b7ea1157b081952903c","location":{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":58,"end":83}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `addLineReferences` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"782481c579d96128e5d0793c04d6113b","location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":110,"end":145}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `prepareDiffData` has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.","fingerprint":"69f60a55e02467d84573c99a4caa96e1","location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":191,"end":224}},"other_locations":[],"remediation_points":1650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getNoteFormData` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2408381b663271af2ce36e4cfec0ef64","location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":28,"end":77}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addLineReferences` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9e04f00e197ce4b77a3fa65c55e66cb1","location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":110,"end":145}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `prepareDiffData` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4fa4b2e2a939b7a261a1e47aea3b124e","location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":191,"end":224}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `shouldRenderParallelCommentRow` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cf200732380b3f0a2a2993c8cb3d3a71","location":{"path":"app/assets/javascripts/diffs/store/getters.js","lines":{"begin":75,"end":97}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initDiffsApp` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"37689c9906180d81c8f636a1285361fa","location":{"path":"app/assets/javascripts/diffs/index.js","lines":{"begin":6,"end":41}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `create_merge_request_dropdown.js` has 391 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"efe0e6e60956f829c50aea15ff89a81c","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":1,"end":489}},"other_locations":[],"remediation_points":3230400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `onChangeInput` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"51e3d7e3f8979e2acacf219907cfae33","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":278,"end":322}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `updateInputState` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"15a5141561c69faaf772cc24838b9882","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":433,"end":472}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`CreateMergeRequestDropdown` has 32 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"6d33b610bd5704267ec05a9b7b5e44e0","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":15,"end":488}},"other_locations":[],"remediation_points":2400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 38 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9408c08016dc994d8ab6445d06b9e1ba","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":16,"end":61}},"other_locations":[],"remediation_points":912000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onChangeInput` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e5627e01c10e2d6e1299f91b38024a0a","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":278,"end":322}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `updateInputState` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5126386129e905b8737efa7b7aadb02e","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":433,"end":472}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":321,"end":321}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"8643526d248036a3735dc9a6e2e57920"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addToImport` has 48 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f5c4a1a17a8903f8c6dd885142d0e5a7","location":{"path":"app/assets/javascripts/importer_status.js","lines":{"begin":33,"end":92}},"other_locations":[],"remediation_points":1152000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `autoUpdate` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"86f5ee9b3a803d7476f4c94f06eeb20f","location":{"path":"app/assets/javascripts/importer_status.js","lines":{"begin":94,"end":123}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `deviseState` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cc96fa07083c1de787a6bff9f39300d8","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":3,"end":34}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `deviseState` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b9fdc968681b9a4d1a00bdaebcf5513e","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":3,"end":34}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":13,"end":13}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"7e01335e6a48fbcffe9b977a5893e0c1"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":15,"end":15}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"06b18956af744e4ba0818ef408ae519a"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":17,"end":17}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"b6db36d200c40a47864a6c82d74ecdd9"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":19,"end":19}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"94cbbf89dae775243077f30c7139777f"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":21,"end":21}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"407c4389388a40459b3a50e566ec4695"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":23,"end":23}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"c9317c489fdab4a76a50dbc5cebcfa17"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":25,"end":25}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"d69b63a794f4784245d6a949c148e1c8"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":27,"end":27}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"766dbcf000fa7d4e2636539267ea8cee"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":29,"end":29}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"9c3dd1c5c99c0b2e367eaf0f6c483688"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":31,"end":31}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"9735ac3532df3e31eea793eb471bcd3e"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/get_state_key.js","lines":{"begin":33,"end":33}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"6a3a4a85c8ee79ec2d8e4ea2cf165674"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `setData` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c334ad6c327b60fc52e19d4b1a441be0","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js","lines":{"begin":14,"end":114}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setData` has 88 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"590c6f1bfea578d864bdc64a2fa9a1da","location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js","lines":{"begin":14,"end":114}},"other_locations":[],"remediation_points":2112000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `groupsSelect` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6d30e631abef41c7858e8c2b472ab41b","location":{"path":"app/assets/javascripts/groups_select.js","lines":{"begin":6,"end":88}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `groupsSelect` has 74 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ced5ccd57fcd0e841cc27868cc850186","location":{"path":"app/assets/javascripts/groups_select.js","lines":{"begin":6,"end":88}},"other_locations":[],"remediation_points":1776000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setAjaxGroupsSelect2` has 71 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cb6c68e362058d81fc462714f431d13d","location":{"path":"app/assets/javascripts/groups_select.js","lines":{"begin":9,"end":87}},"other_locations":[],"remediation_points":1704000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `setConfig` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"93dedf1db90bd5e014f609731004784e","location":{"path":"app/assets/javascripts/comment_type_toggle.js","lines":{"begin":25,"end":60}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `memberExpirationDate` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"93c026069e6f3fae025e1bf3bf480e0b","location":{"path":"app/assets/javascripts/member_expiration_date.js","lines":{"begin":10,"end":54}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `merge_request_tabs.js` has 311 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"91dcee71900ea33c229c8f115d145f57","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":1,"end":477}},"other_locations":[],"remediation_points":2078400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `constructor` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2c515fc51ceabbbd6bcacbadf7b409c8","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":71,"end":122}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `tabShown` has a Cognitive Complexity of 29 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ca9c966746914ecd639f907aed00306a","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":159,"end":223}},"other_locations":[],"remediation_points":2550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5e286159c60ca68824ec344d5dec0145","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":71,"end":122}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `tabShown` has 56 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5752347dcb1fd9940bd4bc3d21abd442","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":159,"end":223}},"other_locations":[],"remediation_points":1344000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `loadDiff` has 52 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3eedd69a3c93529e5939b19ecf1b3e32","location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":331,"end":401}},"other_locations":[],"remediation_points":1248000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleLabelPriority` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"17bb8b4767aa6ee7a9db29cd4297dfd1","location":{"path":"app/assets/javascripts/label_manager.js","lines":{"begin":53,"end":94}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `toggleLabelPriority` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ac24663bc55eac3c9635bccf3a68dc5a","location":{"path":"app/assets/javascripts/label_manager.js","lines":{"begin":53,"end":94}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4cd0496900d30272b32ee2e3adf188ae","location":{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":11,"end":46}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `addIssue` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"70f0f8ea0547b7001e920932e4980ddc","location":{"path":"app/assets/javascripts/boards/models/list.js","lines":{"begin":164,"end":200}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `addIssue` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7f1eced6b6dca9d960756de9b56ac3c4","location":{"path":"app/assets/javascripts/boards/models/list.js","lines":{"begin":164,"end":200}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `moveIssueInList` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"3726eea384e1d9e6d6d8eebb989b0a55","location":{"path":"app/assets/javascripts/boards/stores/boards_store.js","lines":{"begin":152,"end":152}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `moveIssueToList` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cc191b6dd17cde39e7dd162fd47e19c7","location":{"path":"app/assets/javascripts/boards/stores/boards_store.js","lines":{"begin":100,"end":144}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `moveIssueToList` has 38 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0501fa18f105e7c808db7348aee50cb4","location":{"path":"app/assets/javascripts/boards/stores/boards_store.js","lines":{"begin":100,"end":144}},"other_locations":[],"remediation_points":912000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `newListDropdownInit` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8f897d86e7796b5b3d49f700124b5adb","location":{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":26,"end":82}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `newListDropdownInit` has 51 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f73b08dfbb16f388d03764aefc71b663","location":{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":26,"end":82}},"other_locations":[],"remediation_points":1224000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `projectSelect` has 74 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8ccd46aac4a6745374730b2c4f0f1a7f","location":{"path":"app/assets/javascripts/project_select.js","lines":{"begin":7,"end":87}},"other_locations":[],"remediation_points":1776000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `query` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8facf3a4b06c65c72b401a6ae241812e","location":{"path":"app/assets/javascripts/project_select.js","lines":{"begin":27,"end":64}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `swipe` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cd344682f57e11e94307c0ae71e31b21","location":{"path":"app/assets/javascripts/commit/image_file.js","lines":{"begin":118,"end":153}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onion-skin` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d98db2ac5d0ba5352c5501d8e616908a","location":{"path":"app/assets/javascripts/commit/image_file.js","lines":{"begin":154,"end":193}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `mergeUrlParams` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9586f62e5526e65ea5dea846d2d34814","location":{"path":"app/assets/javascripts/lib/utils/url_utility.js","lines":{"begin":19,"end":41}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `common_utils.js` has 421 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"5b2e1f175792cddc3122cb26f6f2901b","location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":1,"end":647}},"other_locations":[],"remediation_points":3662400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `handleLocationHash` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"73cd83cbd5164515c6be6e51ced09b94","location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":79,"end":112}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `urlParamsToObject` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"87d0167946e02e230645b1a8b4416926","location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":152,"end":175}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `createOverlayIcon` has 40 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1195653ae898b98df0d276acb1429b55","location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":458,"end":505}},"other_locations":[],"remediation_points":960000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onload` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d3e5a07a00d95bb2f853dee0c1c50e98","location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":462,"end":502}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `isSticky` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b5704d88401ccd1910b07573165064f6","location":{"path":"app/assets/javascripts/lib/utils/sticky.js","lines":{"begin":10,"end":31}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `insertMarkdownText` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"1ff368be1929703177fe923eb38be8a2","location":{"path":"app/assets/javascripts/lib/utils/text_markdown.js","lines":{"begin":54,"end":54}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `moveCursor` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"78da0046365fa4a2a913735a7884c4fe","location":{"path":"app/assets/javascripts/lib/utils/text_markdown.js","lines":{"begin":34,"end":52}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `insertMarkdownText` has a Cognitive Complexity of 18 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9c17d7ff9d0dfd043e0ac8b46e612742","location":{"path":"app/assets/javascripts/lib/utils/text_markdown.js","lines":{"begin":54,"end":111}},"other_locations":[],"remediation_points":1450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `insertMarkdownText` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f38a0d7dccba49d8195065ab71f8ef39","location":{"path":"app/assets/javascripts/lib/utils/text_markdown.js","lines":{"begin":54,"end":111}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `toggleScroll` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a1904c8e94b053af5f2371dece57951f","location":{"path":"app/assets/javascripts/lib/utils/logoutput_behaviours.js","lines":{"begin":14,"end":41}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getMonthNames` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5630d70a3018ea651454e11d959c7e26","location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":16,"end":47}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getTimeago` has 42 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"915cddbb51190cedb7c5488e6d3f715a","location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":77,"end":122}},"other_locations":[],"remediation_points":1008000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `dateInWords` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"35c8c58c18a9af9c0ee997ae5d4b8e48","location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":201,"end":243}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initKeyNav` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"90bcaab65ebc8665cd94e8e6286ad7d3","location":{"path":"app/assets/javascripts/tree.js","lines":{"begin":28,"end":66}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `generateUnicodeSupportMap` has 47 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3235c3b88f6c553ff280eac9faec19fa","location":{"path":"app/assets/javascripts/emoji/support/unicode_support_map.js","lines":{"begin":77,"end":141}},"other_locations":[],"remediation_points":1128000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `getUnicodeSupportMap` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d9342f9326c59d8e19277db8a2cb8500","location":{"path":"app/assets/javascripts/emoji/support/unicode_support_map.js","lines":{"begin":143,"end":178}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `glEmojiTag` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"580f88e3583b6c310ded6fbad9390305","location":{"path":"app/assets/javascripts/emoji/index.js","lines":{"begin":69,"end":102}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initDropdown` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"301e9b71ddb9969243fc57daa227b33b","location":{"path":"app/assets/javascripts/sidebar/lib/sidebar_move_issue.js","lines":{"begin":27,"end":59}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `branch_graph.js` has 307 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"8f961e52cddbca0cb2dd3290c7063853","location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":1,"end":352}},"other_locations":[],"remediation_points":2020800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `buildGraph` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"18ed687a5ecc08e272ec3f5a1e45ba85","location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":103,"end":139}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `renderPartialGraph` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"790548e7db64ebbadd07868d6c20245b","location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":141,"end":171}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `appendLabel` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"918265d9fa262a2ea6ddda4b96f04407","location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":211,"end":246}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `drawLines` has 39 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"df364db884043c3c81e753fb9a58ee90","location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":286,"end":333}},"other_locations":[],"remediation_points":936000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `testWrap` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"65093271e08f9838db54de85e17d7c79","location":{"path":"app/assets/javascripts/network/raphael.js","lines":{"begin":37,"end":72}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `commitTooltip` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c2753572072946d03cae221981b2a147","location":{"path":"app/assets/javascripts/network/raphael.js","lines":{"begin":3,"end":35}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `testWrap` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3ac8fefe6574f998844a591c4dff399c","location":{"path":"app/assets/javascripts/network/raphael.js","lines":{"begin":37,"end":72}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.TOGGLE_LOADING` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"41230e2a140c3c519f16d17067a948c0","location":{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":14,"end":24}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.RENAME_ENTRY` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"65c7f9e9aa2de7fa4e24860dbded9820","location":{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":214,"end":263}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`` has 26 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"ee3f6d8624f678d9741d386c4252f0fc","location":{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":10,"end":269}},"other_locations":[],"remediation_points":1800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `types.RENAME_ENTRY` has 40 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"98f116d65b4aa0e565234027efee827f","location":{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":214,"end":263}},"other_locations":[],"remediation_points":960000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.SET_FILE_RAW_DATA` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6460bb9792e8eedb0b1e558f229e6ffa","location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":53,"end":75}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.DISCARD_FILE_CHANGES` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"aa62953384fc873bd8bddabed1341a3a","location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":128,"end":154}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `closeFile` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ca626095e258a497e9cf9c1fa4b7537e","location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":10,"end":40}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `createCommitPayload` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ead12c6a7c7c105251c94c6af2fda7b0","location":{"path":"app/assets/javascripts/ide/stores/utils.js","lines":{"begin":133,"end":145}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `decorateData` has 44 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f8abacda37ac495ce54d8ce69e488724","location":{"path":"app/assets/javascripts/ide/stores/utils.js","lines":{"begin":55,"end":101}},"other_locations":[],"remediation_points":1056000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this function.","location":{"path":"app/assets/javascripts/ide/stores/utils.js","lines":{"begin":158,"end":158}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"75e7e39f5b8ea0aadff2470a9b44ca68"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `entries` has 67 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1a9caa4d3fce207f88b2afafe14a1df0","location":{"path":"app/assets/javascripts/ide/stores/workers/files_decorator_worker.js","lines":{"begin":11,"end":91}},"other_locations":[],"remediation_points":1608000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Function `types.RECEIVE_LASTEST_PIPELINE_SUCCESS` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ac7ea082c786419244a234de0970ebc9","location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":11,"end":39}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `types.RECEIVE_LASTEST_PIPELINE_SUCCESS` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0883c6639137c6b51cad4b57c0dd1c38","location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":11,"end":39}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0d98be7e83cb9dbc1ca8775da0aa7d19","location":{"path":"app/assets/javascripts/ide/lib/common/model.js","lines":{"begin":6,"end":43}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initIde` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"34f27cc8f1c849369b0095674a48c531","location":{"path":"app/assets/javascripts/ide/index.js","lines":{"begin":11,"end":44}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Function `init` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"0c6f3babcfd2a42ae88ffe4cc05028dc","location":{"path":"app/assets/javascripts/pager.js","lines":{"begin":10,"end":10}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `constructor` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f19d7f17b74ab07e9651e12680b14b9d","location":{"path":"app/assets/javascripts/profile/gl_crop.js","lines":{"begin":12,"end":40}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `onModalShow` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c0421daee7918d81456c8580b8878457","location":{"path":"app/assets/javascripts/profile/gl_crop.js","lines":{"begin":69,"end":101}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Function `initMrNotes` has 74 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4dd3a8bed3022600ffaa03ba5cc77fe6","location":{"path":"app/assets/javascripts/mr_notes/index.js","lines":{"begin":10,"end":92}},"other_locations":[],"remediation_points":1776000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"`` has 24 functions (exceeds 20 allowed). Consider refactoring.","fingerprint":"815b15d961f84ea742e6dce8eb3f8a4d","location":{"path":"app/assets/javascripts/badges/store/actions.js","lines":{"begin":14,"end":167}},"other_locations":[],"remediation_points":1600000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_each` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cbc52cfd6436c771188ac8f4e355cb9b","location":{"path":"app/validators/branch_filter_validator.rb","lines":{"begin":16,"end":30}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_each` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a8179f4c2dfe625c27616c834d37a930","location":{"path":"app/validators/js_regex_validator.rb","lines":{"begin":4,"end":16}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_each` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0d1ca6a4b7e3294fdc110a8e0ea47f92","location":{"path":"app/validators/cluster_name_validator.rb","lines":{"begin":7,"end":25}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_each` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d62539a99ae9fabba3cd2cc96713cf09","location":{"path":"app/validators/abstract_path_validator.rb","lines":{"begin":23,"end":35}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ProjectTeam` has 27 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"ce2cc10520ba3b4b7205e61120d67315","location":{"path":"app/models/project_team.rb","lines":{"begin":3,"end":194}},"other_locations":[],"remediation_points":1900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_kube_client!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e929847f530fa79a8a58054b9aa3fb8e","location":{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":125,"end":140}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `note.rb` has 325 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"5f0768574ccb05a5f08cf2e994799fa2","location":{"path":"app/models/note.rb","lines":{"begin":6,"end":474}},"other_locations":[],"remediation_points":2280000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `grouped_diff_discussions` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3e55577fec2bb70f0e880e0e8d0f42ec","location":{"path":"app/models/note.rb","lines":{"begin":150,"end":168}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `in_reply_to?` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a17100ec3750af84df807aff92514aa5","location":{"path":"app/models/note.rb","lines":{"begin":367,"end":382}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Note` has 56 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"5d5c3b8714fe08a2c7df66bc4bfdc538","location":{"path":"app/models/note.rb","lines":{"begin":6,"end":474}},"other_locations":[],"remediation_points":4800000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `track_greatest` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"ee586dc1932745869e3f752d180242c9","location":{"path":"app/models/internal_id.rb","lines":{"begin":55,"end":55}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `rename_descendants` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"41d2108d52e96b7975591b300d3b2e60","location":{"path":"app/models/route.rb","lines":{"begin":23,"end":51}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"complex_logic","content":{"body":""},"description":"Consider simplifying this complex logical expression.","location":{"path":"app/models/issue.rb","lines":{"begin":306,"end":313}},"other_locations":[],"remediation_points":400000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"1cd63fdd17237f7c081abfa37690a7fe"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `as_json` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"430a48264a7379f4d248d672bb16fe44","location":{"path":"app/models/issue.rb","lines":{"begin":250,"end":273}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `readable_by?` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"05cd07a39aaac900028cc3b49079c531","location":{"path":"app/models/issue.rb","lines":{"begin":301,"end":315}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Issue` has 30 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"9619613b02f7bb8841b9e19c688f5251","location":{"path":"app/models/issue.rb","lines":{"begin":5,"end":326}},"other_locations":[],"remediation_points":2200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cached_attr_reader` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2a0b7bc4cebaa36fff63efc3ada11817","location":{"path":"app/models/concerns/redis_cacheable.rb","lines":{"begin":10,"end":20}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `move_dir` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a75dea312f0b07cc41974f687ba6fc64","location":{"path":"app/models/concerns/storage/legacy_namespace.rb","lines":{"begin":7,"end":41}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `expand_hierarchy_for_child` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f5222419d454a07f66c83180e4789d18","location":{"path":"app/models/concerns/group_descendant.rb","lines":{"begin":37,"end":70}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `expand_hierarchy_for_child` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5cd85b2e5055a268df55df99d4d5a94e","location":{"path":"app/models/concerns/group_descendant.rb","lines":{"begin":37,"end":70}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `avatar_path` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b6177dbe195b50f7a5b10734fbc4a8d2","location":{"path":"app/models/concerns/avatarable.rb","lines":{"begin":45,"end":72}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `with_reactive_cache` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a8e8f8a2e9ccd006ae8f61ca9db92d0c","location":{"path":"app/models/concerns/reactive_caching.rb","lines":{"begin":69,"end":84}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `exclusively_update_reactive_cache!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2811b2ef3d5196f0b89cec43f1f2b465","location":{"path":"app/models/concerns/reactive_caching.rb","lines":{"begin":91,"end":103}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_binary_column_exists!` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"23444612f22a67bddc69d4fb3d9ab40a","location":{"path":"app/models/concerns/sha_attribute.rb","lines":{"begin":18,"end":37}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `current` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"37517b27e64777d7506564ebffc2a9fa","location":{"path":"app/models/concerns/cacheable_attributes.rb","lines":{"begin":44,"end":57}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `chronic_duration_attr_writer` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8acb577138f44873e03ae5712c65f31d","location":{"path":"app/models/concerns/chronic_duration_attribute.rb","lines":{"begin":13,"end":28}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `truncated_diff_lines` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8bade7fdd3ab51990a34487352c56728","location":{"path":"app/models/concerns/discussion_on_diff.rb","lines":{"begin":41,"end":59}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `calculate_reactive_cache` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ff34ec3cc17426f2d12b615f23171aad","location":{"path":"app/models/concerns/prometheus_adapter.rb","lines":{"begin":36,"end":47}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `position_between` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0f9f931c8a1748472719ac1b03432d6c","location":{"path":"app/models/concerns/relative_positioning.rb","lines":{"begin":119,"end":139}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `status_sql` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"46850ccc347015917b7f7d5813dfbb20","location":{"path":"app/models/concerns/has_status.rb","lines":{"begin":19,"end":46}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `has_internal_id` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1753643cebf17fe9b88665c4895f0bc6","location":{"path":"app/models/concerns/atomic_internal_id.rb","lines":{"begin":30,"end":56}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_by_full_path` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9de369584b4bc5dcd50146b7967ef3b0","location":{"path":"app/models/concerns/routable.rb","lines":{"begin":35,"end":60}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `where_full_path_in` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1d7711a695fff8bdfaa49dc578b0132c","location":{"path":"app/models/concerns/routable.rb","lines":{"begin":69,"end":91}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `manual_inverse_association` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"53ad262470fd01998ef23cb50fac0495","location":{"path":"app/models/concerns/manual_inverse_association.rb","lines":{"begin":7,"end":17}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `raw_participants` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"014b735c6a47b089e8ef4112c427cdf6","location":{"path":"app/models/concerns/participable.rb","lines":{"begin":72,"end":104}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_batch` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5ca9b6fe345855869ed62b41036772f6","location":{"path":"app/models/concerns/each_batch.rb","lines":{"begin":42,"end":81}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `each_batch` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e56746932db5150f690993cd09ec2c5a","location":{"path":"app/models/concerns/each_batch.rb","lines":{"begin":42,"end":81}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_authentication_token_field` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9ffe8c5e6736ff7519d2b0ad210f55dd","location":{"path":"app/models/concerns/token_authenticatable.rb","lines":{"begin":31,"end":60}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `to_hook_data` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"651dd445a68aa882af831870aac09fe6","location":{"path":"app/models/concerns/issuable.rb","lines":{"begin":264,"end":290}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `notes_with_associations` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"edf734b8128847bcceb4300c584ab8e9","location":{"path":"app/models/concerns/issuable.rb","lines":{"begin":318,"end":334}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `max_member_access_for_resource_ids` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9a3525a1273d674a7a5dd1b4599a6b80","location":{"path":"app/models/concerns/bulk_member_access_load.rb","lines":{"begin":12,"end":40}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `enum_with_nil` has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d195530dc1d564b6a5a2361310657dd7","location":{"path":"app/models/concerns/enum_with_nil.rb","lines":{"begin":7,"end":33}},"other_locations":[],"remediation_points":1650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `labels_str` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bf445c84a1f8ebfebacc811382517d81","location":{"path":"app/models/label_note.rb","lines":{"begin":77,"end":90}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `notifiable?` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"76278bc24d3f0c41a172b68e2f632daa","location":{"path":"app/models/notification_recipient.rb","lines":{"begin":31,"end":46}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `has_access?` has a Cognitive Complexity of 22 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4264d898878128898c4e12b32b905f8a","location":{"path":"app/models/notification_recipient.rb","lines":{"begin":88,"end":101}},"other_locations":[],"remediation_points":1850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_notification_setting` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cf0f0817b180212c8e825cbbed40b752","location":{"path":"app/models/notification_recipient.rb","lines":{"begin":144,"end":154}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `closest_non_global_group_notification_settting` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9f65343a59de0315d68462b18f90defe","location":{"path":"app/models/notification_recipient.rb","lines":{"begin":157,"end":169}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"app/models/notification_recipient.rb","lines":{"begin":43,"end":43}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"d25d7135d797df677ee520a8a97ae9a6"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `find_commits_by_message` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"0c28ee46d93aa21d37eeb5b2a26d394f","location":{"path":"app/models/repository.rb","lines":{"begin":161,"end":161}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `repository.rb` has 758 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"849ce5e0e3a20d8ed78311435ce5fce9","location":{"path":"app/models/repository.rb","lines":{"begin":3,"end":1058}},"other_locations":[],"remediation_points":8515200,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `keep_around` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8ffb83b66ddf0a719303059ae40ce506","location":{"path":"app/models/repository.rb","lines":{"begin":249,"end":262}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `tree` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"38d273d7d1372c09c7a5c165e170a642","location":{"path":"app/models/repository.rb","lines":{"begin":647,"end":659}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `next_branch` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"53a66b748f45002bcdd585986f4f828f","location":{"path":"app/models/repository.rb","lines":{"begin":684,"end":697}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Repository` has 128 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"1ffa67f7557cad6dc009a3331141e757","location":{"path":"app/models/repository.rb","lines":{"begin":5,"end":1058}},"other_locations":[],"remediation_points":12000000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `enabled` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"38454ee90e05a227558719509fe5ec29","location":{"path":"app/models/remote_mirror.rb","lines":{"begin":104,"end":111}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `RemoteMirror` has 24 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"24334db25a09b73ccd711bb06c29a822","location":{"path":"app/models/remote_mirror.rb","lines":{"begin":3,"end":229}},"other_locations":[],"remediation_points":1600000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9c206e4584e2321188004de82f54d910","location":{"path":"app/models/commit_range.rb","lines":{"begin":62,"end":82}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `user.rb` has 1050 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"11e77959335527c9cb28992c10d37866","location":{"path":"app/models/user.rb","lines":{"begin":3,"end":1502}},"other_locations":[],"remediation_points":12720000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `increment_failed_attempts!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"51accad62fa466380528844722430a98","location":{"path":"app/models/user.rb","lines":{"begin":1253,"end":1264}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_user_rights_and_limits` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c7a575c65331c7b917638baa8941d41c","location":{"path":"app/models/user.rb","lines":{"begin":1405,"end":1414}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `signup_domain_valid?` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a9b5f7bc9d9c55cfe5d888bed2fb420a","location":{"path":"app/models/user.rb","lines":{"begin":1416,"end":1441}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `User` has 178 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"f685bcbb6f822884dec234767db1861a","location":{"path":"app/models/user.rb","lines":{"begin":5,"end":1502}},"other_locations":[],"remediation_points":17000000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `project.rb` has 1664 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"531155f760c7355b54c66683855d1397","location":{"path":"app/models/project.rb","lines":{"begin":3,"end":2277}},"other_locations":[],"remediation_points":21561600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_or_update_import_data` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"669b48913bc191fe053ef3cf863c7b51","location":{"path":"app/models/project.rb","lines":{"begin":691,"end":706}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_import_state` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c647270223f46682704c8933072ea030","location":{"path":"app/models/project.rb","lines":{"begin":732,"end":745}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_limit` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"238a83e94e0d19d7e5bf774e737f1856","location":{"path":"app/models/project.rb","lines":{"begin":887,"end":899}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_or_initialize_services` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b5c439340a2145fd43e3c155a46b8084","location":{"path":"app/models/project.rb","lines":{"begin":1084,"end":1110}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_repository_path_availability` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"84ad9cf46f3288017a0f4b6db6438a6c","location":{"path":"app/models/project.rb","lines":{"begin":1302,"end":1316}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `after_create_default_branch` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2a2d29b10f840adb402e27183b8afb0e","location":{"path":"app/models/project.rb","lines":{"begin":1685,"end":1704}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `container_registry_variables` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"22330faec24429812d37099efaf8566b","location":{"path":"app/models/project.rb","lines":{"begin":1811,"end":1821}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `handle_update_attribute_error` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"103e8043443b236e57b2b71b4071ed2a","location":{"path":"app/models/project.rb","lines":{"begin":2240,"end":2250}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fetch_branch_allows_collaboration?` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0a44b195efa5fdd8f8a133a9382fe540","location":{"path":"app/models/project.rb","lines":{"begin":2252,"end":2276}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Project` has 258 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"64039fbe3749f7d87b4ba7e85868d7fc","location":{"path":"app/models/project.rb","lines":{"begin":5,"end":2277}},"other_locations":[],"remediation_points":25000000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `service.rb` has 261 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"f45455ad20cdb5129a3bfb9eebb6498b","location":{"path":"app/models/service.rb","lines":{"begin":5,"end":346}},"other_locations":[],"remediation_points":1358400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Service` has 40 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"96ce9f4a9d59b553ec55116c8a3be7ae","location":{"path":"app/models/service.rb","lines":{"begin":5,"end":346}},"other_locations":[],"remediation_points":3200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `available_services_names` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f2ec9d5c5ae446fb75d746688a3a72fe","location":{"path":"app/models/service.rb","lines":{"begin":247,"end":284}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `raw_binary?` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0ae3aeb7a760efb26099272499cfbade","location":{"path":"app/models/blob.rb","lines":{"begin":161,"end":175}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Blob` has 27 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"a44f4d9e927f1b91399b8e17fb943f6d","location":{"path":"app/models/blob.rb","lines":{"begin":4,"end":254}},"other_locations":[],"remediation_points":1900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `event.rb` has 309 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"6850b538f65ad91cf5c5ef2e7148924e","location":{"path":"app/models/event.rb","lines":{"begin":3,"end":410}},"other_locations":[],"remediation_points":2049600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `visible_to_user?` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"29269e08d03641e18bd2ba7cd22a0d3f","location":{"path":"app/models/event.rb","lines":{"begin":151,"end":167}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `action_name` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f28caae33540f5326e5ce2d58a03d771","location":{"path":"app/models/event.rb","lines":{"begin":265,"end":287}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Event` has 50 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"613c580b618dad28f34b389f766efe2e","location":{"path":"app/models/event.rb","lines":{"begin":3,"end":410}},"other_locations":[],"remediation_points":4200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `different_group` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2ac2c358921313bb5981e964133c5ecf","location":{"path":"app/models/project_group_link.rb","lines":{"begin":38,"end":49}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `merge_request_version_params` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8d1a8357abf058d725c59df9cca495bf","location":{"path":"app/models/diff_discussion.rb","lines":{"begin":25,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `active?` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"772f6211e69bcffb4fbc411c5d7d31c3","location":{"path":"app/models/legacy_diff_note.rb","lines":{"begin":57,"end":75}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"app/models/legacy_diff_note.rb","lines":{"begin":62,"end":62}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"4e0039e61f3fd67caeb1b978db868447"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `group.rb` has 290 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"d9e231fdbc15e514e21e1596b5e2d930","location":{"path":"app/models/group.rb","lines":{"begin":3,"end":403}},"other_locations":[],"remediation_points":1776000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Group` has 53 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"f82613684deaaf389431887bc5a62c74","location":{"path":"app/models/group.rb","lines":{"begin":5,"end":403}},"other_locations":[],"remediation_points":4500000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Label` has 25 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"9660fb59aa00ace0b608078c78c611a4","location":{"path":"app/models/label.rb","lines":{"begin":3,"end":244}},"other_locations":[],"remediation_points":1700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `has_intermediates?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fc033b957f3fcb1bd690b7edb50aa441","location":{"path":"app/models/pages_domain.rb","lines":{"begin":79,"end":98}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `PagesDomain` has 24 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"389a0c10cffbc7cd770d8d67a31e61ba","location":{"path":"app/models/pages_domain.rb","lines":{"begin":3,"end":201}},"other_locations":[],"remediation_points":1600000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `generate_slug` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0d507615693230a051c9d4ae397fe5d2","location":{"path":"app/models/environment.rb","lines":{"begin":178,"end":203}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Environment` has 27 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"4140683d4224f01a7fe2fad0da3d11c6","location":{"path":"app/models/environment.rb","lines":{"begin":3,"end":243}},"other_locations":[],"remediation_points":1900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ProjectWiki` has 29 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"a7ff4b093a326a93bf1e0887a36ba898","location":{"path":"app/models/project_wiki.rb","lines":{"begin":3,"end":203}},"other_locations":[],"remediation_points":2100000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `track` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d55ffd71690c0e606bcb1fa48074affd","location":{"path":"app/models/user_interacted_project.rb","lines":{"begin":16,"end":41}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8737f9bae4ea49696d911b5b162784ef","location":{"path":"app/models/wiki_page.rb","lines":{"begin":215,"end":244}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_title` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"43c91a5205fef35946442db85ab54267","location":{"path":"app/models/wiki_page.rb","lines":{"begin":283,"end":295}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `WikiPage` has 35 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"35e7d7ce82a5641563ba1029c54645bc","location":{"path":"app/models/wiki_page.rb","lines":{"begin":4,"end":326}},"other_locations":[],"remediation_points":2700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update_position` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fa4f67c27ab14379e44af70d58264c1a","location":{"path":"app/models/diff_note.rb","lines":{"begin":152,"end":173}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `append` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d527adfd814d095e55079d7a898a3fc3","location":{"path":"app/models/ci/build_trace_chunk.rb","lines":{"begin":74,"end":84}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `pipeline.rb` has 488 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"cee8532683fbbb22a3b807c5714c49c7","location":{"path":"app/models/ci/pipeline.rb","lines":{"begin":3,"end":671}},"other_locations":[],"remediation_points":4627200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ci_yaml_from_repo` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f19177ae4080cc2c9d81a39383b45922","location":{"path":"app/models/ci/pipeline.rb","lines":{"begin":632,"end":639}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Pipeline` has 68 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"af1e8c39d8b166628ae043bce72269a5","location":{"path":"app/models/ci/pipeline.rb","lines":{"begin":4,"end":670}},"other_locations":[],"remediation_points":6000000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `build.rb` has 604 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"7967fd1fb861d27e33c208d88261cd76","location":{"path":"app/models/ci/build.rb","lines":{"begin":3,"end":809}},"other_locations":[],"remediation_points":6297600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `scoped_variables` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e310e4c57a2e9123f26a1cbcec9809eb","location":{"path":"app/models/ci/build.rb","lines":{"begin":312,"end":327}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `predefined_variables` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"13282d4d569e2daa02632e5249568733","location":{"path":"app/models/ci/build.rb","lines":{"begin":726,"end":745}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `legacy_variables` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"81e2fd25bb2dd91faed640216e965698","location":{"path":"app/models/ci/build.rb","lines":{"begin":747,"end":759}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `persisted_environment_variables` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"67327cbc303019830fbd1d6586dcde3e","location":{"path":"app/models/ci/build.rb","lines":{"begin":761,"end":772}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Build` has 100 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"736c24725c78f957ee4538a1ef73cab0","location":{"path":"app/models/ci/build.rb","lines":{"begin":4,"end":808}},"other_locations":[],"remediation_points":9200000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `status` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c700cdde3d0b6292dd18227b3e90cf8d","location":{"path":"app/models/ci/runner.rb","lines":{"begin":179,"end":187}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Runner` has 31 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"a9c3d8a2409fd9c5506a846374c16d42","location":{"path":"app/models/ci/runner.rb","lines":{"begin":4,"end":320}},"other_locations":[],"remediation_points":2300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Discussion` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"21189089f43b68ee94981dbac970d566","location":{"path":"app/models/discussion.rb","lines":{"begin":6,"end":138}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `milestone_format_reference` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0e735e47b6b8a533b9ff579e13b277c9","location":{"path":"app/models/milestone.rb","lines":{"begin":261,"end":273}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Milestone` has 26 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"283d777de6e0e7974ccbb1e316f5fd1a","location":{"path":"app/models/milestone.rb","lines":{"begin":3,"end":288}},"other_locations":[],"remediation_points":1800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0d0fba50527ad864dc4649245f95f1bf","location":{"path":"app/models/project_services/drone_ci_service.rb","lines":{"begin":22,"end":31}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `calculate_reactive_cache` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"aa74471515edc43c1ab5339ddf68e505","location":{"path":"app/models/project_services/drone_ci_service.rb","lines":{"begin":53,"end":74}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0a0446e31eb4d865b34fe5938f53bbad","location":{"path":"app/models/project_services/chat_notification_service.rb","lines":{"begin":52,"end":79}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_message` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"07a9999f0d84368d5983e08e2891f237","location":{"path":"app/models/project_services/chat_notification_service.rb","lines":{"begin":111,"end":126}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `notify_for_ref?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6a030ca161112b5f434986ab0ae88c0f","location":{"path":"app/models/project_services/chat_notification_service.rb","lines":{"begin":159,"end":171}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ChatNotificationService` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"5d159cd60a69a3f1a1b5beb530264825","location":{"path":"app/models/project_services/chat_notification_service.rb","lines":{"begin":5,"end":183}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read_commit_status` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"69dbb9ff98b20cc8db3a809b7e239e5f","location":{"path":"app/models/project_services/mock_ci_service.rb","lines":{"begin":70,"end":84}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `KubernetesService` has 25 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"2e6c7a0448e9bb4e799cb7efe0846fc7","location":{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":8,"end":251}},"other_locations":[],"remediation_points":1700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read_commit_status` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8fb7749a6cc98bccd8d5712c1d499494","location":{"path":"app/models/project_services/teamcity_service.rb","lines":{"begin":112,"end":132}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize_properties` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a965dd277aee3504a57790eb7271cadb","location":{"path":"app/models/project_services/issue_tracker_service.rb","lines":{"begin":52,"end":69}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `buildkite_endpoint` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"161d47385d79643f9414ed2ad67502a9","location":{"path":"app/models/project_services/buildkite_service.rb","lines":{"begin":106,"end":119}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"42914696303830e3d209925e13650d83","location":{"path":"app/models/project_services/pushover_service.rb","lines":{"begin":67,"end":104}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `fields` has 39 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"773d8cd6842c7b74f60e9ab8003ad977","location":{"path":"app/models/project_services/pushover_service.rb","lines":{"begin":21,"end":61}},"other_locations":[],"remediation_points":936000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7b760b5c22532a27dbd776328b7db9a6","location":{"path":"app/models/project_services/pushover_service.rb","lines":{"begin":67,"end":104}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"802d66c5bd557b6f1bdd32240846e4c2","location":{"path":"app/models/project_services/pipelines_email_service.rb","lines":{"begin":28,"end":38}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `jira_service.rb` has 261 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"c5f438f6b31722193eb4e10b389655b6","location":{"path":"app/models/project_services/jira_service.rb","lines":{"begin":3,"end":344}},"other_locations":[],"remediation_points":1358400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `close_issue` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f74475ea9bd04b9ed8ff7ddcc5c29633","location":{"path":"app/models/project_services/jira_service.rb","lines":{"begin":117,"end":135}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_cross_reference_note` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6c27b1c9b77bd4f2d2f11a294e90cf36","location":{"path":"app/models/project_services/jira_service.rb","lines":{"begin":137,"end":167}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `JiraService` has 35 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"2d0643b626f1ad53bf43aadedd954eae","location":{"path":"app/models/project_services/jira_service.rb","lines":{"begin":3,"end":344}},"other_locations":[],"remediation_points":2700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read_commit_status` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f2f5469088e256c3b81eccc8ecaf967b","location":{"path":"app/models/project_services/bamboo_service.rb","lines":{"begin":94,"end":112}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_message` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fcb9db20f4fe6adda5925e7da947a943","location":{"path":"app/models/project_services/hipchat_service.rb","lines":{"begin":85,"end":100}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_push_message` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7f972562d25c4198e75c8dac6931a928","location":{"path":"app/models/project_services/hipchat_service.rb","lines":{"begin":106,"end":138}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `HipchatService` has 27 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"bb12852ed6419e4dea808d1d873302a1","location":{"path":"app/models/project_services/hipchat_service.rb","lines":{"begin":3,"end":311}},"other_locations":[],"remediation_points":1900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `create_note_message` has 39 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"96500251c9498d9f1e9c7da0c8384528","location":{"path":"app/models/project_services/hipchat_service.rb","lines":{"begin":200,"end":244}},"other_locations":[],"remediation_points":936000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `format_channel` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e064d1923f5ef24f603e3c03af81644f","location":{"path":"app/models/project_services/irker_service.rb","lines":{"begin":93,"end":112}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_commit` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d6ee148a09cf8c383948472d577bfb74","location":{"path":"app/models/project_services/asana_service.rb","lines":{"begin":81,"end":108}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Namespace` has 34 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"411d817f1a6db72f360bb2cb93e055ec","location":{"path":"app/models/namespace.rb","lines":{"begin":3,"end":302}},"other_locations":[],"remediation_points":2600000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `application_setting.rb` has 387 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"50270695e6d7c5163050078e7cf65e18","location":{"path":"app/models/application_setting.rb","lines":{"begin":3,"end":489}},"other_locations":[],"remediation_points":3172800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ApplicationSetting` has 38 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"02be76880912851331582ab14ef56dd4","location":{"path":"app/models/application_setting.rb","lines":{"begin":3,"end":489}},"other_locations":[],"remediation_points":3000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `defaults` has 76 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4a5e7733302a5f59e7878ab40f6b9f82","location":{"path":"app/models/application_setting.rb","lines":{"begin":232,"end":309}},"other_locations":[],"remediation_points":1824000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `base_commit_sha` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"70d6880ba8e52f184e9eaf896119e352","location":{"path":"app/models/compare.rb","lines":{"begin":50,"end":56}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `commit.rb` has 355 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"c361e4106ded93f757f69964f420b067","location":{"path":"app/models/commit.rb","lines":{"begin":4,"end":508}},"other_locations":[],"remediation_points":2712000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `order_by` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c4e54c836dbfddf9329a85f83378cb5","location":{"path":"app/models/commit.rb","lines":{"begin":63,"end":75}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `uri_type` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ac39422eaa05c0e3880afe76c6341f18","location":{"path":"app/models/commit.rb","lines":{"begin":425,"end":435}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Commit` has 68 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"e2175bec55ffd09f5d7b2352b5c5dcad","location":{"path":"app/models/commit.rb","lines":{"begin":4,"end":508}},"other_locations":[],"remediation_points":6000000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `merge_request.rb` has 897 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"59d143493fc6a1f49dd6ff46bba4459f","location":{"path":"app/models/merge_request.rb","lines":{"begin":3,"end":1238}},"other_locations":[],"remediation_points":10516800,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_branches` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"95d0d3fa4206c77bab101daf5035ee18","location":{"path":"app/models/merge_request.rb","lines":{"begin":511,"end":524}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_fork` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"68cf8c7f9bbbebf2133c22434d2bcae9","location":{"path":"app/models/merge_request.rb","lines":{"begin":532,"end":539}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `mergeable_state?` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bdc249b8456dc07607ba4fe001ff1261","location":{"path":"app/models/merge_request.rb","lines":{"begin":677,"end":685}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cache_merge_request_closes_issues!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bcd9dc4beba740e5c019b9c760cacdd3","location":{"path":"app/models/merge_request.rb","lines":{"begin":769,"end":782}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `compare_test_reports` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b662bb8a5b01a77feb8b7b0a9ffefdb2","location":{"path":"app/models/merge_request.rb","lines":{"begin":1041,"end":1054}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `mergeable_with_quick_action?` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"74fd9deeffa5589190ba744e4af78384","location":{"path":"app/models/merge_request.rb","lines":{"begin":1177,"end":1187}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `MergeRequest` has 137 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"417a10e5eb9495ae2d250b8c195971f7","location":{"path":"app/models/merge_request.rb","lines":{"begin":3,"end":1238}},"other_locations":[],"remediation_points":12900000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"app/models/merge_request.rb","lines":{"begin":682,"end":682}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"ac1600795e5aff84e3d4e9243b88bdbc"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"app/models/merge_request.rb","lines":{"begin":1184,"end":1184}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"4cc86fde220f02f2e1c1443c9c96fe93"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `member.rb` has 297 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"ead9a1c0eaecbe741f755dd85ef04b38","location":{"path":"app/models/member.rb","lines":{"begin":3,"end":419}},"other_locations":[],"remediation_points":1876800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `retrieve_member` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9cf98664280114d55fe07fc00a2931f4","location":{"path":"app/models/member.rb","lines":{"begin":236,"end":248}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Member` has 41 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"5c62b78b2bb4b49f04e64fa24a5e7525","location":{"path":"app/models/member.rb","lines":{"begin":3,"end":419}},"other_locations":[],"remediation_points":3300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `set` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8869fa571b5fb7a617adc0197c7ac362","location":{"path":"app/models/active_session.rb","lines":{"begin":20,"end":50}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `count_to_display_commit_in_center` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b411aa7c155fd11004316e7fd39fd0f0","location":{"path":"app/models/network/graph.rb","lines":{"begin":79,"end":107}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `place_chain` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"177c4e2e8eb1351747941148b8c5841f","location":{"path":"app/models/network/graph.rb","lines":{"begin":180,"end":216}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `take_left_leaves` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"07eb1c8a024e1084d5249e442c56ead6","location":{"path":"app/models/network/graph.rb","lines":{"begin":263,"end":277}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `place_chain` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d89c4cb61eca0dac9322942ca4b87aff","location":{"path":"app/models/network/graph.rb","lines":{"begin":180,"end":216}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `save_diffs` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c6b7ee6cba58c9eb3d9ad5eed75d6ec3","location":{"path":"app/models/merge_request_diff.rb","lines":{"begin":272,"end":296}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `MergeRequestDiff` has 33 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"d7a32bf8ffc7cc2cb0b417114258fc44","location":{"path":"app/models/merge_request_diff.rb","lines":{"begin":3,"end":322}},"other_locations":[],"remediation_points":2500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `object_storage.rb` has 315 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"86494fa0d557a4aa389e5171896783dc","location":{"path":"app/uploaders/object_storage.rb","lines":{"begin":3,"end":458}},"other_locations":[],"remediation_points":2136000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `changed_mounts` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fd0a4f3d9448639f581ace634e78fb9f","location":{"path":"app/uploaders/object_storage.rb","lines":{"begin":113,"end":124}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `workhorse_remote_upload_options` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e022c746daf5a42b94b0696cad68db33","location":{"path":"app/uploaders/object_storage.rb","lines":{"begin":191,"end":201}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `unsafe_migrate!` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1684da513e48bc7fed9d7d05f006f4f3","location":{"path":"app/uploaders/object_storage.rb","lines":{"begin":415,"end":442}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `record_upload` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7714f01e58a6f57d5612758293fdcd98","location":{"path":"app/uploaders/records_uploads.rb","lines":{"begin":22,"end":32}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `open` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e3420c6ebb4c5709171dfe0ad626a693","location":{"path":"app/uploaders/gitlab_uploader.rb","lines":{"begin":78,"end":94}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `FileUploader` has 25 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"377d9736f93da216ab2620478b97b6a7","location":{"path":"app/uploaders/file_uploader.rb","lines":{"begin":11,"end":200}},"other_locations":[],"remediation_points":1700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ci_status` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0ecf5e5baa621e39be46cda7a6b7e79a","location":{"path":"app/presenters/merge_request_presenter.rb","lines":{"begin":13,"end":23}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `MergeRequestPresenter` has 29 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"8382c7b1054d55cea9b796fc549636ad","location":{"path":"app/presenters/merge_request_presenter.rb","lines":{"begin":3,"end":231}},"other_locations":[],"remediation_points":2100000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `cards` has 79 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"56c716082acebaebac8f5817c4770ff3","location":{"path":"app/presenters/conversational_development_index/metric_presenter.rb","lines":{"begin":5,"end":85}},"other_locations":[],"remediation_points":1896000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `idea_to_production_steps` has 52 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3ec38351e7aae7c1eb1bbf782da34f4f","location":{"path":"app/presenters/conversational_development_index/metric_presenter.rb","lines":{"begin":87,"end":140}},"other_locations":[],"remediation_points":1248000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `project_presenter.rb` has 312 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"d892daae824d8e78fe2a0b68c288acda","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":3,"end":370}},"other_locations":[],"remediation_points":2092800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `default_view` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d66dbcb27efcacaf84388d8cfc5f690f","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":64,"end":80}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `readme_anchor_data` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c40df23b551a8abe9f2d5830edfbf472","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":221,"end":231}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `autodevops_anchor_data` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3e4902e11edd6de01b81f9a61f5d9d7b","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":275,"end":285}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `kubernetes_cluster_anchor_data` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"119e536f7905363201fb67bbdcd65824","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":287,"end":299}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ProjectPresenter` has 40 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"174173017516e33835d52eb7c5513209","location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":3,"end":370}},"other_locations":[],"remediation_points":3200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `notification_service.rb` has 356 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"69e4d6c40c4449fefd31aa10ca6d0d74","location":{"path":"app/services/notification_service.rb","lines":{"begin":18,"end":550}},"other_locations":[],"remediation_points":2726400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `NotificationService` has 57 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"f69a1b203ea4d5900672119cebb81b66","location":{"path":"app/services/notification_service.rb","lines":{"begin":18,"end":550}},"other_locations":[],"remediation_points":4900000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"40698d762fba8b2aa8a60c141d6d8790","location":{"path":"app/services/groups/create_service.rb","lines":{"begin":10,"end":29}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `can_create_group?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b75b73bf2d690e5a17c2abe284491440","location":{"path":"app/services/groups/create_service.rb","lines":{"begin":37,"end":54}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_allowed_transfer` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b1a41885cc0a6ac544248d54c07e1636","location":{"path":"app/services/groups/transfer_service.rb","lines":{"begin":41,"end":47}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4bb4279e0d059ae00152e8bdf1ea798d","location":{"path":"app/services/groups/update_service.rb","lines":{"begin":7,"end":25}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_operation_id` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e02445fcf7469e25e1790f6de102578e","location":{"path":"app/services/clusters/gcp/provision_service.rb","lines":{"begin":24,"end":48}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ee86b571c5fd71a16cf372ae35959a1d","location":{"path":"app/services/clusters/applications/check_installation_progress_service.rb","lines":{"begin":6,"end":19}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c7bf557578299a5ba915c32a04c77757","location":{"path":"app/services/gravatar_service.rb","lines":{"begin":4,"end":18}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `valid_visibility_level_change?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5663649284b422de3ee165079f02580a","location":{"path":"app/services/concerns/update_visibility_level.rb","lines":{"begin":4,"end":16}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1e2214a2c7403de3b6b130ef6a8ae0e7","location":{"path":"app/services/labels/transfer_service.rb","lines":{"begin":15,"end":29}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"889d22762e16d3366a67e51333a2ca58","location":{"path":"app/services/labels/promote_service.rb","lines":{"begin":8,"end":30}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"83f2800751c8e1fc38441feba44838e9","location":{"path":"app/services/notes/create_service.rb","lines":{"begin":5,"end":53}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"64400ce10f6b24c336dc2c14dc7631e5","location":{"path":"app/services/notes/create_service.rb","lines":{"begin":5,"end":53}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `project` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"55c1155f35f19aeab86111aa747bcdef","location":{"path":"app/services/search_service.rb","lines":{"begin":12,"end":22}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `group` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9350f7f8937ed59a3c058c18876a72fc","location":{"path":"app/services/search_service.rb","lines":{"begin":26,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `add_commits` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"eb5157bfd09a812f4b9e9e59faa9bd43","location":{"path":"app/services/system_note_service.rb","lines":{"begin":22,"end":22}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `change_status` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"1b2b9c2adcef9eef8232ca3fabba5213","location":{"path":"app/services/system_note_service.rb","lines":{"begin":214,"end":214}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `change_branch` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"d01b8c3144cf8ecd33ca899268167ba5","location":{"path":"app/services/system_note_service.rb","lines":{"begin":370,"end":370}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `change_branch_presence` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"dcdc7164fbd2b97a6ffca4f6dc2e0e44","location":{"path":"app/services/system_note_service.rb","lines":{"begin":390,"end":390}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `system_note_service.rb` has 269 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"9d114264549f2dceede46ea914a3550c","location":{"path":"app/services/system_note_service.rb","lines":{"begin":7,"end":679}},"other_locations":[],"remediation_points":1473600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `change_time_spent` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5c81cb9f69e1de7b23d6f18ba82533d3","location":{"path":"app/services/system_note_service.rb","lines":{"begin":181,"end":197}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cross_reference_disallowed?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cf012be1a6a2e48dd333008fe9d0d152","location":{"path":"app/services/system_note_service.rb","lines":{"begin":455,"end":461}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `existing_commit_summary` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9e510f603309baf5e0cb54ad77970a75","location":{"path":"app/services/system_note_service.rb","lines":{"begin":637,"end":659}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `create_mention_todos` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"8a610af9d7608ea64f58ba654367d763","location":{"path":"app/services/todo_service.rb","lines":{"begin":273,"end":273}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `attributes_for_todo` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"22c5b886bc2bcef31fd1446dabf42446","location":{"path":"app/services/todo_service.rb","lines":{"begin":310,"end":310}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `TodoService` has 43 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"888b933ca386de89d1c664deed0728bd","location":{"path":"app/services/todo_service.rb","lines":{"begin":10,"end":357}},"other_locations":[],"remediation_points":3500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bcfd0e3ea01c9694d57bfccaa03838e6","location":{"path":"app/services/verify_pages_domain_service.rb","lines":{"begin":18,"end":28}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d473aafcb22747b52b1f62e820f2074d","location":{"path":"app/services/create_branch_service.rb","lines":{"begin":4,"end":21}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9a39c0c805730f76077d4c41f5a49ab0","location":{"path":"app/services/todos/destroy/entity_leave_service.rb","lines":{"begin":21,"end":35}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dd806bba9fb1ffe1bffc98d5b313f431","location":{"path":"app/services/todos/destroy/private_features_service.rb","lines":{"begin":14,"end":25}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"669e705b9b727535b65aa70c23908b8a","location":{"path":"app/services/issuable/bulk_update_service.rb","lines":{"begin":6,"end":31}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fa059d9d5e3d40934b6d454456a29e17","location":{"path":"app/services/issuable/common_system_notes_service.rb","lines":{"begin":7,"end":21}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_registry_access` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0a9f93af474354f18c131c4a6f33ce74","location":{"path":"app/services/auth/container_registry_authentication_service.rb","lines":{"begin":71,"end":77}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_repository_access` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d2612abf7127bdfa9f619c175cf5d2cc","location":{"path":"app/services/auth/container_registry_authentication_service.rb","lines":{"begin":79,"end":97}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7189b60fb2402fbb02818934986a95e8","location":{"path":"app/services/projects/overwrite_project_service.rb","lines":{"begin":5,"end":26}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 26 (exceeds 5 allowed). Consider refactoring.","fingerprint":"961ae326b78bf20ee97acef0cec52327","location":{"path":"app/services/projects/create_service.rb","lines":{"begin":11,"end":74}},"other_locations":[],"remediation_points":2250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `after_create_actions` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e38e4c0872ce60d2ba85c11448b4522b","location":{"path":"app/services/projects/create_service.rb","lines":{"begin":98,"end":114}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `save_project_and_import_data` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"49a616d751623502896fe1bf01ddc263","location":{"path":"app/services/projects/create_service.rb","lines":{"begin":143,"end":158}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 41 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"175fda5eebf084d959ea97dbc7ddba89","location":{"path":"app/services/projects/create_service.rb","lines":{"begin":11,"end":74}},"other_locations":[],"remediation_points":984000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"app/services/projects/create_service.rb","lines":{"begin":53,"end":53}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"4406c9c51c68a677aea6fc1c46031379"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `propagate_projects_with_template` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"293ec445efe1987a7ed4d749d241b1c9","location":{"path":"app/services/projects/propagate_service_template.rb","lines":{"begin":25,"end":33}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2a2218c0712e897508cb29f687ddbb15","location":{"path":"app/services/projects/destroy_service.rb","lines":{"begin":17,"end":49}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `attempt_repositories_rollback` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"06f3aaf8a1f066c4e7933483e129d710","location":{"path":"app/services/projects/destroy_service.rb","lines":{"begin":51,"end":63}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_repository_to_project` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0129f188de75c26a852812d70994f671","location":{"path":"app/services/projects/import_service.rb","lines":{"begin":33,"end":52}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_repository` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a7dc266875c644d2161df4f52854509a","location":{"path":"app/services/projects/import_service.rb","lines":{"begin":60,"end":78}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `download_lfs_objects` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e22b343575e9881c97f2271bcd97f948","location":{"path":"app/services/projects/import_service.rb","lines":{"begin":80,"end":99}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_data` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7bc52f032ae36171f9038ca564b8725f","location":{"path":"app/services/projects/import_service.rb","lines":{"begin":101,"end":109}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d3753f60f8dc5d9fdb996971cbdec0ee","location":{"path":"app/services/projects/update_pages_service.rb","lines":{"begin":18,"end":47}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `extract_zip_archive!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fe7709a469edc64e95ec098c80aa4d9e","location":{"path":"app/services/projects/update_pages_service.rb","lines":{"begin":84,"end":104}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `UpdatePagesService` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"d7d865dc59fc4a03d279c1c19c89a168","location":{"path":"app/services/projects/update_pages_service.rb","lines":{"begin":4,"end":191}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `labels_as_hash` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"78f7382b2da989274c44cca4dd67b726","location":{"path":"app/services/projects/autocomplete_service.rb","lines":{"begin":25,"end":47}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ecc06d47c5ab14de0497085a390276e9","location":{"path":"app/services/projects/update_remote_mirror_service.rb","lines":{"begin":7,"end":31}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f166c36283c89cda2c2d1b400fc83d9c","location":{"path":"app/services/projects/transfer_service.rb","lines":{"begin":16,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8619477bd476b8e6c20c420edaafa603","location":{"path":"app/services/projects/update_service.rb","lines":{"begin":10,"end":29}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"eab5a0a1e19f69711efa955efe37831a","location":{"path":"app/services/projects/update_service.rb","lines":{"begin":40,"end":52}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `after_update` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a1014f2a5df19a7195983026335ef76c","location":{"path":"app/services/projects/update_service.rb","lines":{"begin":54,"end":76}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"23b22fd0746b04d1cdb84c038d084b5b","location":{"path":"app/services/projects/hashed_storage/migrate_repository_service.rb","lines":{"begin":18,"end":46}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0543ffb09bae340f0c5077ae46b7cdcc","location":{"path":"app/services/projects/lfs_pointers/lfs_download_service.rb","lines":{"begin":8,"end":23}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"896cabbb6ed77bf3c709bb312f23a6fb","location":{"path":"app/services/projects/lfs_pointers/lfs_import_service.rb","lines":{"begin":17,"end":32}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `lfsconfig_endpoint_uri` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ab48443c563d169a420e80faa5c91bf8","location":{"path":"app/services/projects/lfs_pointers/lfs_import_service.rb","lines":{"begin":56,"end":72}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0d7377f3f82a92babb9d1d653fb3a6c0","location":{"path":"app/services/projects/unlink_fork_service.rb","lines":{"begin":6,"end":29}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `notification_recipient_service.rb` has 261 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"04116f97d81f75dc8b45ce0a5811fa81","location":{"path":"app/services/notification_recipient_service.rb","lines":{"begin":6,"end":384}},"other_locations":[],"remediation_points":1358400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bc4e88abd84c5b4832ac272b050f5372","location":{"path":"app/services/notification_recipient_service.rb","lines":{"begin":257,"end":295}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Base` has 28 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"27695a9b55119263d5fc023bfb91d6e3","location":{"path":"app/services/notification_recipient_service.rb","lines":{"begin":28,"end":238}},"other_locations":[],"remediation_points":2000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6cc1d79d478940cb6d6b9ceed02cb6e6","location":{"path":"app/services/users/destroy_service.rb","lines":{"begin":26,"end":64}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute_without_lease` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"67cb8ef6b0457ad00d8347bcbe3ff3f7","location":{"path":"app/services/users/refresh_authorized_projects_service.rb","lines":{"begin":50,"end":71}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update_authorizations` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6e70e1ba1ea2f084af1fff74047fe8d9","location":{"path":"app/services/users/refresh_authorized_projects_service.rb","lines":{"begin":77,"end":88}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d9165689bde9f912aa84f6f518e598da","location":{"path":"app/services/users/build_service.rb","lines":{"begin":14,"end":36}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_user_params` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"830b5807353157bd5e183aad25f2b282","location":{"path":"app/services/users/build_service.rb","lines":{"begin":88,"end":111}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `admin_create_params` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"fe5ddceb25aafe04827303d1f6d564b4","location":{"path":"app/services/users/build_service.rb","lines":{"begin":45,"end":74}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5bc79f55d7e462657e85385bf64c461b","location":{"path":"app/services/submit_usage_ping_service.rb","lines":{"begin":16,"end":34}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"eff6af7a39548e896b0c36625e41edfa","location":{"path":"app/services/validate_new_branch_service.rb","lines":{"begin":6,"end":20}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f26b8395f9bebcbbe601568ab87f1dac","location":{"path":"app/services/tags/create_service.rb","lines":{"begin":5,"end":32}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"009acc0cc8f2cad1eb48f996869cd8b3","location":{"path":"app/services/tags/destroy_service.rb","lines":{"begin":6,"end":29}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `close_issue` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"268f126190d57eeaaded69cfb25897c3","location":{"path":"app/services/issues/close_service.rb","lines":{"begin":20,"end":39}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `handle_changes` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ff12a5753d6bee667c95cfbc92416e03","location":{"path":"app/services/issues/update_service.rb","lines":{"begin":18,"end":56}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `handle_changes` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8b14e45d1c64f39d6eedb20d84843741","location":{"path":"app/services/issues/update_service.rb","lines":{"begin":18,"end":56}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `filter_assignee` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5691687cb00f6fd194e603429807185a","location":{"path":"app/services/issues/base_service.rb","lines":{"begin":35,"end":51}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1a9702d3dc815e8d64756d8fb212f9b3","location":{"path":"app/services/web_hook_service.rb","lines":{"begin":24,"end":62}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"4d9ca5643eb0d67f71faf5371f5ae764","location":{"path":"app/services/ci/create_pipeline_service.rb","lines":{"begin":15,"end":48}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b8c02fe4ca7afa344ed38920cbc647e3","location":{"path":"app/services/ci/retry_pipeline_service.rb","lines":{"begin":7,"end":28}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bc2e58626fb38ae2a635ad7504d1369f","location":{"path":"app/services/ci/stop_environments_service.rb","lines":{"begin":7,"end":18}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"617800a52fa424a1bcea1ed6a62b6793","location":{"path":"app/services/ci/register_job_service.rb","lines":{"begin":19,"end":66}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"3c427dfa0dd24ca8d0170b6247260b87","location":{"path":"app/services/ci/register_job_service.rb","lines":{"begin":19,"end":66}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_label_ids` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d322faf3023b3e313c8abe2020cf59af","location":{"path":"app/services/issuable_base_service.rb","lines":{"begin":96,"end":111}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"139f887d96d46ca70a22e378422f8bc7","location":{"path":"app/services/issuable_base_service.rb","lines":{"begin":172,"end":224}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `IssuableBaseService` has 30 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"906133099e33d0679f4b8c65cc1eef9b","location":{"path":"app/services/issuable_base_service.rb","lines":{"begin":3,"end":319}},"other_locations":[],"remediation_points":2200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `update` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"009042d6d3df2763254c61f2b3d8536c","location":{"path":"app/services/issuable_base_service.rb","lines":{"begin":172,"end":224}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_event_data` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"181f03475858936500cb1903a2981922","location":{"path":"app/services/system_hooks_service.rb","lines":{"begin":22,"end":70}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_event_name` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"58fb30a590bb73d7a7c014c15cff2f61","location":{"path":"app/services/system_hooks_service.rb","lines":{"begin":72,"end":83}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `build_event_data` has 41 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cb1f235466d69ba0f51ae5082e6ccd1b","location":{"path":"app/services/system_hooks_service.rb","lines":{"begin":22,"end":70}},"other_locations":[],"remediation_points":984000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `include_any_scope?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c3b269346955ff77f7af249761778c5f","location":{"path":"app/services/access_token_validation_service.rb","lines":{"begin":33,"end":48}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b944cb228f06d17cfab396e042f46404","location":{"path":"app/services/create_deployment_service.rb","lines":{"begin":15,"end":29}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2a911c4e00c978f2c3dee8a80d2b123c","location":{"path":"app/services/members/destroy_service.rb","lines":{"begin":5,"end":23}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3e17107f5166483e06d9a3aa43ce4057","location":{"path":"app/services/delete_branch_service.rb","lines":{"begin":4,"end":23}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `can_be_resolved_in_ui?` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"303b72ed1619302f77225ae41471638d","location":{"path":"app/services/merge_requests/conflicts/list_service.rb","lines":{"begin":15,"end":23}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `reload_merge_requests` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a105139484033c8e7ced10c6ce36e8db","location":{"path":"app/services/merge_requests/refresh_service.rb","lines":{"begin":80,"end":106}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_new_commits` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"851ed172a4510d8303c8caf10c7c09e1","location":{"path":"app/services/merge_requests/refresh_service.rb","lines":{"begin":119,"end":141}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `trigger` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8627834675a31ad536bf412edaafd7e7","location":{"path":"app/services/merge_requests/merge_when_pipeline_succeeds_service.rb","lines":{"begin":24,"end":33}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4cd7f00168c6c916f0dc7075f0ca3349","location":{"path":"app/services/merge_requests/merge_service.rb","lines":{"begin":17,"end":37}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"35e1a81d921bd211a80412b3021d8f1f","location":{"path":"app/services/merge_requests/create_from_issue_service.rb","lines":{"begin":16,"end":31}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_branches` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"629d86725d56fa929caf501972ac7cf2","location":{"path":"app/services/merge_requests/build_service.rb","lines":{"begin":92,"end":97}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `BuildService` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"0955c9bbce7bc1720631a8dc579bbf5f","location":{"path":"app/services/merge_requests/build_service.rb","lines":{"begin":4,"end":208}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_branches` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7e605b474bb1fb7b66f5bfbaf51d3c6d","location":{"path":"app/services/merge_requests/get_urls_service.rb","lines":{"begin":33,"end":50}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `handle_changes` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cefad5ecb48fbecc8f4fa6ba026659f8","location":{"path":"app/services/merge_requests/update_service.rb","lines":{"begin":27,"end":78}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `handle_changes` has 42 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"db391ef0b97408393fd716be0c7356dd","location":{"path":"app/services/merge_requests/update_service.rb","lines":{"begin":27,"end":78}},"other_locations":[],"remediation_points":1008000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `commit_status_merge_requests` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"784a58094574fa35608fca082c2548e7","location":{"path":"app/services/merge_requests/base_service.rb","lines":{"begin":76,"end":85}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `interpret_service.rb` has 596 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"83735b0b7c1f8d22c40f49e709c57e70","location":{"path":"app/services/quick_actions/interpret_service.rb","lines":{"begin":3,"end":700}},"other_locations":[],"remediation_points":6182400,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b08fd2ee935cfed15e0505bb9af417b4","location":{"path":"app/services/discussions/update_diff_position_service.rb","lines":{"begin":5,"end":34}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dcb90a6db168562206b2356716e752b6","location":{"path":"app/services/git_push_service.rb","lines":{"begin":24,"end":65}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `index` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8b2781e6841d5d63745094c685fcd1e8","location":{"path":"app/controllers/groups/children_controller.rb","lines":{"begin":6,"end":29}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `index` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3169a6c4ee72f03a1318dedbed6b40ff","location":{"path":"app/controllers/groups/group_members_controller.rb","lines":{"begin":17,"end":39}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `failure_message` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e3605869f669f4cb85ba66bdd5b04c7a","location":{"path":"app/controllers/omniauth_callbacks_controller.rb","lines":{"begin":30,"end":38}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `omniauth_flow` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8cf6a8a0fd40eb5ff273cc6dba558403","location":{"path":"app/controllers/omniauth_callbacks_controller.rb","lines":{"begin":77,"end":95}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sign_in_user_flow` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e780968a46460e3b3fe11a34ddfc0c00","location":{"path":"app/controllers/omniauth_callbacks_controller.rb","lines":{"begin":115,"end":136}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `OmniauthCallbacksController` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"af6b190bf330da08acbe854817a6812f","location":{"path":"app/controllers/omniauth_callbacks_controller.rb","lines":{"begin":3,"end":192}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `impersonate` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f01a1ec9614ccf1b226a3e42206b203b","location":{"path":"app/controllers/admin/users_controller.rb","lines":{"begin":33,"end":56}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"af47e69f6ee053a6f226de336934f214","location":{"path":"app/controllers/admin/users_controller.rb","lines":{"begin":118,"end":147}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `UsersController` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"bb3ecebd549737d88ffb4ea7b2d02d16","location":{"path":"app/controllers/admin/users_controller.rb","lines":{"begin":3,"end":230}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4d5e93c6a88076ccc249e69590f05f53","location":{"path":"app/controllers/admin/system_info_controller.rb","lines":{"begin":34,"end":57}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6c80ea5d1d0a024abdc38fba56cb8435","location":{"path":"app/controllers/concerns/uploads_actions.rb","lines":{"begin":35,"end":48}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `send_blob` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cfa9da0619389a51f42df3b51bf5c65c","location":{"path":"app/controllers/concerns/sends_blob.rb","lines":{"begin":11,"end":25}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `leave` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1f6860cf601d992df6f0af95d95748a0","location":{"path":"app/controllers/concerns/membership_actions.rb","lines":{"begin":63,"end":82}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `set_issuables_index` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f415a6c750063cabd8f90d48e98e5eb0","location":{"path":"app/controllers/concerns/issuable_collections.rb","lines":{"begin":17,"end":38}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `authenticate_with_two_factor` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"36f3a297fab9a3ef0e526b7f851741b2","location":{"path":"app/controllers/concerns/authenticates_with_two_factor.rb","lines":{"begin":43,"end":54}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `safe_redirect_path` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"36420be74fc50045ef291eb40a71bb77","location":{"path":"app/controllers/concerns/internal_redirect.rb","lines":{"begin":6,"end":17}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `safe_redirect_path_for_url` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d5b751dbd9dd362815b574f1cb52225a","location":{"path":"app/controllers/concerns/internal_redirect.rb","lines":{"begin":19,"end":26}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `note_json` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"273ea02f6c72cced154034c12207d3f1","location":{"path":"app/controllers/concerns/notes_actions.rb","lines":{"begin":104,"end":146}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `diff_discussion_html` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"62bc37c3eb9f037889edcbe39ef53aa6","location":{"path":"app/controllers/concerns/notes_actions.rb","lines":{"begin":148,"end":174}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `note_project` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"573f594e00ed6b29987ce9e763457833","location":{"path":"app/controllers/concerns/notes_actions.rb","lines":{"begin":239,"end":256}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `note_json` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2572ca1fa7eb27c9668322b7a098f02a","location":{"path":"app/controllers/concerns/notes_actions.rb","lines":{"begin":104,"end":146}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `recaptcha_check_with_fallback` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f5ab9c6deb983a187870f912e14afaea","location":{"path":"app/controllers/concerns/spammable_actions.rb","lines":{"begin":29,"end":54}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_commit` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"832aa36f617c6cce4927e6c8b561ce98","location":{"path":"app/controllers/concerns/creates_commit.rb","lines":{"begin":8,"end":51}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update_flash_notice` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"89030f5b74776bb2425f95279fdd5b7d","location":{"path":"app/controllers/concerns/creates_commit.rb","lines":{"begin":62,"end":73}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `final_success_path` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"afb1305c0c32730e0b027be235b174a0","location":{"path":"app/controllers/concerns/creates_commit.rb","lines":{"begin":75,"end":83}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `create_commit` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"eaa2bdf0bf7bb61da1f37f4031392e35","location":{"path":"app/controllers/concerns/creates_commit.rb","lines":{"begin":8,"end":51}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `send_upload` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cfa021a786ee32f97584fecedce60cde","location":{"path":"app/controllers/concerns/send_file_upload.rb","lines":{"begin":4,"end":26}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `lfs_check_access!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"46d5167d71a5e6a69a9a236086347aed","location":{"path":"app/controllers/concerns/lfs_request.rb","lines":{"begin":36,"end":45}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"905d81937e68b3931dad7416dc6ef9a6","location":{"path":"app/controllers/import/bitbucket_controller.rb","lines":{"begin":37,"end":65}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"20b781fcddc55e961f42441c445d70d8","location":{"path":"app/controllers/import/github_controller.rb","lines":{"begin":39,"end":58}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `GithubController` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"ab20d51ced6ac78aa49e0f6de0af0ac0","location":{"path":"app/controllers/import/github_controller.rb","lines":{"begin":1,"end":132}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_or_create_namespace` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2f80525d40e648a6d7ea2229b2cb74ae","location":{"path":"app/controllers/import/base_controller.rb","lines":{"begin":19,"end":31}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4d4ab07c39a5534d15b7443e37a7a235","location":{"path":"app/controllers/import/bitbucket_server_controller.rb","lines":{"begin":21,"end":45}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_import_params` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"da2d51f606c44590f847c4640444ac5b","location":{"path":"app/controllers/import/bitbucket_server_controller.rb","lines":{"begin":82,"end":90}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `callback` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3c9e710a6531242212414756cccfe915","location":{"path":"app/controllers/import/google_code_controller.rb","lines":{"begin":8,"end":33}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_captcha` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"de5a9e305854d86a525c3be0d27eaf6d","location":{"path":"app/controllers/sessions_controller.rb","lines":{"begin":62,"end":78}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `auto_sign_in_with_provider` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f619928e9105c1311e52540b45817001","location":{"path":"app/controllers/sessions_controller.rb","lines":{"begin":167,"end":186}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `SessionsController` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"ca547cff8dfcb4f2bb32febd07c3a8b9","location":{"path":"app/controllers/sessions_controller.rb","lines":{"begin":3,"end":221}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"44af899cceadececa5fb2d6343c42fb8","location":{"path":"app/controllers/registrations_controller.rb","lines":{"begin":16,"end":36}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `index` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"07120d763a5a37d3563d108da7618fc2","location":{"path":"app/controllers/snippets_controller.rb","lines":{"begin":30,"end":43}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"19fe68118b5b1cf2a9c1bfef20064546","location":{"path":"app/controllers/projects/wikis_controller.rb","lines":{"begin":20,"end":44}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4754ebccd6eb3ba307dee978dd12dde8","location":{"path":"app/controllers/projects/wikis_controller.rb","lines":{"begin":49,"end":65}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `merge_requests_controller.rb` has 265 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"ed0fbac1699084d99f2798b9ff54b642","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":1,"end":354}},"other_locations":[],"remediation_points":1416000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f6d989eecff0a311d8a4126b524b3d54","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":30,"end":76}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"043aac3b7446fd75e17405d975137865","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":123,"end":145}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ci_environments_status` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"46e544b6af20509fb22aa245f36e853b","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":204,"end":242}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `merge!` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5c7d0579b3b6ee7f277ab6932678009d","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":285,"end":319}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `MergeRequestsController` has 28 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"b062a438177acc72625495d3cbfaa77c","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":1,"end":354}},"other_locations":[],"remediation_points":2000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `show` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e3c966096d2b12e85a670db7911707b8","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":30,"end":76}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `ci_environments_status` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e5b7f8ffd1531062cbb97dd163687759","location":{"path":"app/controllers/projects/merge_requests_controller.rb","lines":{"begin":204,"end":242}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `set_commits` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e6d95cec8ea5cbbfb499acf2d8c47bb9","location":{"path":"app/controllers/projects/commits_controller.rb","lines":{"begin":55,"end":69}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `archive` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"24b42f263d62dd73163666f08a5dab84","location":{"path":"app/controllers/projects/repositories_controller.rb","lines":{"begin":16,"end":28}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"48f2140ee4baa6d602990f3cd3a4e3bd","location":{"path":"app/controllers/projects/branches_controller.rb","lines":{"begin":52,"end":91}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `create` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7b53414d925313d554a03dbde87a17b1","location":{"path":"app/controllers/projects/branches_controller.rb","lines":{"begin":52,"end":91}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `authenticate_user` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"aeab90a0370c820e728a3abfbc25b413","location":{"path":"app/controllers/projects/git_http_client_controller.rb","lines":{"begin":30,"end":59}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"59245dcb34ab6bc8f9698502300494c2","location":{"path":"app/controllers/projects/mirrors_controller.rb","lines":{"begin":15,"end":34}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `resolve` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"43486b045d4b1186318cfc251852d98f","location":{"path":"app/controllers/projects/notes_controller.rb","lines":{"begin":21,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `unresolve` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"687318ee4eb16a33452c1f37b2c881a0","location":{"path":"app/controllers/projects/notes_controller.rb","lines":{"begin":38,"end":52}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"31c48fb29d257a60073d2b38d6e1cb4d","location":{"path":"app/controllers/projects/forks_controller.rb","lines":{"begin":39,"end":60}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `index` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a118caadbf010e6edb81311d4382716d","location":{"path":"app/controllers/projects/pipelines_controller.rb","lines":{"begin":12,"end":44}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3abec97b27020fca915a84ac93bc67d6","location":{"path":"app/controllers/projects/imports_controller.rb","lines":{"begin":23,"end":39}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4da2f2dd27d4fd213b9f9f2f1a5cd41f","location":{"path":"app/controllers/projects/group_links_controller.rb","lines":{"begin":10,"end":22}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `service_test_response` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bca34a40fb26a815c60df6fd1e7dba51","location":{"path":"app/controllers/projects/services_controller.rb","lines":{"begin":36,"end":51}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `metrics` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"519adc463f2dd3de5cb94580d7f50383","location":{"path":"app/controllers/projects/deployments_controller.rb","lines":{"begin":15,"end":26}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `additional_metrics` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c4f6fc892643a150dc844973ad4d976","location":{"path":"app/controllers/projects/deployments_controller.rb","lines":{"begin":28,"end":42}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_match_line` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"07c854b446b4087e5ee7892172f74ee7","location":{"path":"app/controllers/projects/blob_controller.rb","lines":{"begin":133,"end":149}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `blob` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b6f7a07f247048d784135038dce26244","location":{"path":"app/controllers/projects/blob_controller.rb","lines":{"begin":151,"end":165}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `editor_variables` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cfcc7b49429c64315cf6da835ec8bede","location":{"path":"app/controllers/projects/blob_controller.rb","lines":{"begin":192,"end":221}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `BlobController` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"c1e63be99f08c204815ffecf3dd4b66c","location":{"path":"app/controllers/projects/blob_controller.rb","lines":{"begin":2,"end":284}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"979438a3332d8f5f08717dc86472299b","location":{"path":"app/controllers/projects/tree_controller.rb","lines":{"begin":13,"end":47}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `show` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"806fa8153a8d1eb022e92afcd4601d91","location":{"path":"app/controllers/projects/tree_controller.rb","lines":{"begin":13,"end":47}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `raw` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e4f02dd301b3eeb842d85c37f20bae2e","location":{"path":"app/controllers/projects/jobs_controller.rb","lines":{"begin":126,"end":140}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `JobsController` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"6f969a368940183e4fce1acd28147f56","location":{"path":"app/controllers/projects/jobs_controller.rb","lines":{"begin":1,"end":189}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_merge_request_diff_compare` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"91ff93d1ec72c5ce3a260ca7bb0355a1","location":{"path":"app/controllers/projects/merge_requests/diffs_controller.rb","lines":{"begin":47,"end":73}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `download_objects!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b7b7331d3cec46b88359e5648ed2f9a2","location":{"path":"app/controllers/projects/lfs_api_controller.rb","lines":{"begin":52,"end":68}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ClustersController` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"964ab09026b9448f413a95a5f6094e09","location":{"path":"app/controllers/projects/clusters_controller.rb","lines":{"begin":1,"end":222}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `move` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ae70ac550f5ace969dc34ad430e1a506","location":{"path":"app/controllers/projects/issues_controller.rb","lines":{"begin":95,"end":113}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `IssuesController` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"09358857b8d0a59b5b0f1efabe1eb312","location":{"path":"app/controllers/projects/issues_controller.rb","lines":{"begin":1,"end":251}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_root_container_repository!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a31d8c82827ad31ea06cbe929b5bcb9e","location":{"path":"app/controllers/projects/registry/repositories_controller.rb","lines":{"begin":39,"end":47}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_keys` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e98b2fc794e033c8a48c3ee0becb6ada","location":{"path":"app/controllers/profiles/keys_controller.rb","lines":{"begin":36,"end":51}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7fac5d70e69bf9664ceb8d865c808fa2","location":{"path":"app/controllers/profiles/two_factor_auths_controller.rb","lines":{"begin":4,"end":40}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `show` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"053f896df50c58d1c5a7f874e0cf72c3","location":{"path":"app/controllers/profiles/two_factor_auths_controller.rb","lines":{"begin":4,"end":40}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `new` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"17c6af74d7968b2ff43b8ab9795a3e8a","location":{"path":"app/controllers/oauth/authorizations_controller.rb","lines":{"begin":6,"end":18}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `projects_controller.rb` has 328 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"ed6bb55f0c75667bbb0ec51d3c2664cf","location":{"path":"app/controllers/projects_controller.rb","lines":{"begin":3,"end":436}},"other_locations":[],"remediation_points":2323200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `refs` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4477c3a607082b3d28aae895558786dd","location":{"path":"app/controllers/projects_controller.rb","lines":{"begin":241,"end":274}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `render_landing_page` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"278be4b0b74df103253b6e3205fb8a62","location":{"path":"app/controllers/projects_controller.rb","lines":{"begin":281,"end":298}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ProjectsController` has 37 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"8090aa2673614a81e71589f7753eff30","location":{"path":"app/controllers/projects_controller.rb","lines":{"begin":3,"end":436}},"other_locations":[],"remediation_points":2900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `project_params_attributes` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2fdc2a483f87578ca62a61a751d113d7","location":{"path":"app/controllers/projects_controller.rb","lines":{"begin":331,"end":370}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `render_check_results` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ba1563517e02434643d39267194f528e","location":{"path":"app/controllers/health_controller.rb","lines":{"begin":39,"end":56}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f7c994d83ef228aa163c05179f06d2fd","location":{"path":"app/controllers/help_controller.rb","lines":{"begin":23,"end":57}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `clean_path_info` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5db34152511808356524914b64cf554b","location":{"path":"app/controllers/help_controller.rb","lines":{"begin":82,"end":107}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `application_controller.rb` has 341 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"f029769395ddcac92c2b8d2ca3b05b28","location":{"path":"app/controllers/application_controller.rb","lines":{"begin":3,"end":465}},"other_locations":[],"remediation_points":2510400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ldap_security_check` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"523cc3bb278c788d5848949c8c3dead7","location":{"path":"app/controllers/application_controller.rb","lines":{"begin":262,"end":272}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `enforce_terms!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d14876e741b595110a644395f1230e14","location":{"path":"app/controllers/application_controller.rb","lines":{"begin":318,"end":339}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ApplicationController` has 53 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"d63945970dce3ed1ef2b7634b214a4e9","location":{"path":"app/controllers/application_controller.rb","lines":{"begin":6,"end":465}},"other_locations":[],"remediation_points":4500000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `users_select_tag` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a108342e6dd48ba76731363b84661eaf","location":{"path":"app/helpers/selects_helper.rb","lines":{"begin":4,"end":26}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `users_select_data_attributes` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a8bad651f6dba343e0468fd0003dd784","location":{"path":"app/helpers/selects_helper.rb","lines":{"begin":74,"end":85}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `show_last_push_widget?` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2f5475afeb1122f3cfa25ac5955cbb27","location":{"path":"app/helpers/application_helper.rb","lines":{"begin":70,"end":86}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `visible_attributes` has 119 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"17f189b8fca7fc3b1f8a420a4bcbda19","location":{"path":"app/helpers/application_settings_helper.rb","lines":{"begin":146,"end":266}},"other_locations":[],"remediation_points":2856000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `toggle_award_url` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d69f1bff0994f6e3441f85f3f11d5bbe","location":{"path":"app/helpers/award_emoji_helper.rb","lines":{"begin":4,"end":17}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `page_gutter_class` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e65e525a4333beebdf83e031e767ef28","location":{"path":"app/helpers/nav_helper.rb","lines":{"begin":21,"end":39}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_header_links` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f16a544d112fad89ba71d21c6d5db6a3","location":{"path":"app/helpers/nav_helper.rb","lines":{"begin":55,"end":75}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `diff_match_line` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b869dd8c4eaef5740ed1f255a8f1fbf1","location":{"path":"app/helpers/diff_helper.rb","lines":{"begin":37,"end":57}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parallel_diff_discussions` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8ca093d3db0a23030593eb120a3b43fd","location":{"path":"app/helpers/diff_helper.rb","lines":{"begin":69,"end":85}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `active_nav_link?` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a16ad6a8f13c9288d42920124805df7f","location":{"path":"app/helpers/tab_helper.rb","lines":{"begin":75,"end":104}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `user_status` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1c1f76f6143eff8d1d22a334a235fd12","location":{"path":"app/helpers/users_helper.rb","lines":{"begin":55,"end":71}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `namespaces_options` has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7abb679aa0b2ea21e01c24880d3bf77c","location":{"path":"app/helpers/namespaces_helper.rb","lines":{"begin":9,"end":45}},"other_locations":[],"remediation_points":1650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `options_for_group` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1e8e66fbb82bdafdc25047aa1524869b","location":{"path":"app/helpers/namespaces_helper.rb","lines":{"begin":71,"end":86}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `namespaces_options` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d1da7571d4cd35e4edcc84ea6e21ec17","location":{"path":"app/helpers/namespaces_helper.rb","lines":{"begin":9,"end":45}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `submodule_links` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"592e98a3099ca8bf38ff5b45bcb0dffb","location":{"path":"app/helpers/submodule_helper.rb","lines":{"begin":9,"end":47}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `submodule_links` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c06e0c3ec596b1cdfd2de6f634cd6b86","location":{"path":"app/helpers/submodule_helper.rb","lines":{"begin":9,"end":47}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_member_message` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bba34164517c03c61579ce09b9d98bb9","location":{"path":"app/helpers/members_helper.rb","lines":{"begin":4,"end":22}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `chunk_snippet` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"de18ceb549965f7ea862a8c0dc960bea","location":{"path":"app/helpers/snippets_helper.rb","lines":{"begin":64,"end":105}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `labels_filter_path` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9d39f54cf4cda251c101014a6f4c7244","location":{"path":"app/helpers/labels_helper.rb","lines":{"begin":134,"end":149}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `label_status_tooltip` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"64c9182b39df4fa2de87d8d55c2d2cbc","location":{"path":"app/helpers/labels_helper.rb","lines":{"begin":216,"end":222}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `event_feed_title` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0ae609cca64a854e8b692dd72db01e13","location":{"path":"app/helpers/events_helper.rb","lines":{"begin":78,"end":102}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `event_feed_url` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f99a06ad5d757ef02870ca23d95676bc","location":{"path":"app/helpers/events_helper.rb","lines":{"begin":104,"end":122}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `push_event_feed_url` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0a4c5fb26657f91ff277b7ef0d13c32d","location":{"path":"app/helpers/events_helper.rb","lines":{"begin":124,"end":138}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `discussion_path` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f8fcc6a280f6df449c018435d3f92438","location":{"path":"app/helpers/notes_helper.rb","lines":{"begin":77,"end":92}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `clipboard_button` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c29991b281e121dc435a356a600e4e1e","location":{"path":"app/helpers/button_helper.rb","lines":{"begin":22,"end":59}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `dropdown_item_with_description` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8d5076e20cc132338854d62653cd1df8","location":{"path":"app/helpers/button_helper.rb","lines":{"begin":88,"end":97}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `clipboard_button` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"97e66a0f68fa32b384f734ea55e5e044","location":{"path":"app/helpers/button_helper.rb","lines":{"begin":22,"end":59}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `dropdown_tag` has a Cognitive Complexity of 26 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4267997c227f431d5c46888b32748d75","location":{"path":"app/helpers/dropdowns_helper.rb","lines":{"begin":4,"end":41}},"other_locations":[],"remediation_points":2250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `dropdown_toggle` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7a5dbb87125de6801bd8e3f421ea8d82","location":{"path":"app/helpers/dropdowns_helper.rb","lines":{"begin":43,"end":50}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `dropdown_tag` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"5365287d8861b3ecac3eb84417018a2b","location":{"path":"app/helpers/dropdowns_helper.rb","lines":{"begin":4,"end":41}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sprite_icon` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b288e014419e55f1aa86631629c79889","location":{"path":"app/helpers/icons_helper.rb","lines":{"begin":44,"end":56}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `file_type_icon_class` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2ddea2c28588a85667f5b5399507ff46","location":{"path":"app/helpers/icons_helper.rb","lines":{"begin":109,"end":151}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `commit_action_link` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8657821ad7a6c0ec4e6398a6aee36f9c","location":{"path":"app/helpers/commits_helper.rb","lines":{"begin":161,"end":181}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `todo_target_path` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d03a4561eaff01e66db146018ad0c969","location":{"path":"app/helpers/todos_helper.rb","lines":{"begin":39,"end":54}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `todo_due_date` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"db4163fb6bc594c0c7f5188d10a94d61","location":{"path":"app/helpers/todos_helper.rb","lines":{"begin":141,"end":160}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `url_for_issue` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b77357907fc65f32d6adebdec5c99e74","location":{"path":"app/helpers/issues_helper.rb","lines":{"begin":18,"end":32}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `path_breadcrumbs` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"309df9fc4689b2f5fb71f6534a5efd03","location":{"path":"app/helpers/tree_helper.rb","lines":{"begin":105,"end":121}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `edit_fork_button_tag` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"2b6c57301b36358581b2491652866c44","location":{"path":"app/helpers/blob_helper.rb","lines":{"begin":302,"end":302}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `edit_button_tag` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"723d5e25e5499349ff424fa5046927f1","location":{"path":"app/helpers/blob_helper.rb","lines":{"begin":318,"end":318}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `modify_file_button` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4b6850840a5430937e584328e518311d","location":{"path":"app/helpers/blob_helper.rb","lines":{"begin":51,"end":69}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `blob_raw_url` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b8466fa1a816b27c99638fe228016597","location":{"path":"app/helpers/blob_helper.rb","lines":{"begin":119,"end":131}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `edit_button_tag` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"93c71a130633cfcebe91bcda32798413","location":{"path":"app/helpers/blob_helper.rb","lines":{"begin":318,"end":327}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `projects_helper.rb` has 438 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"a3d8d9970bc1e29fb6cf0845a8963a35","location":{"path":"app/helpers/projects_helper.rb","lines":{"begin":3,"end":555}},"other_locations":[],"remediation_points":3907200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `link_to_member` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"92e14b6f78cd2026911faaf78829ba53","location":{"path":"app/helpers/projects_helper.rb","lines":{"begin":49,"end":73}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `project_title` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2ebe86c74e8aaea024bada46109f4e9a","location":{"path":"app/helpers/projects_helper.rb","lines":{"begin":75,"end":93}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_project_nav_tabs` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c4c2cc0402179e15ec7cff7acf71f67","location":{"path":"app/helpers/projects_helper.rb","lines":{"begin":266,"end":300}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `disallowed_project_visibility_level_description` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cde9c43b6e33582ebc01be9dcc6b0cc6","location":{"path":"app/helpers/visibility_level_helper.rb","lines":{"begin":84,"end":102}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `disallowed_group_visibility_level_description` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c964b53a81590235d500b10d64921ffc","location":{"path":"app/helpers/visibility_level_helper.rb","lines":{"begin":106,"end":128}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `webpack_controller_bundle_tags` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d1915400e4cdf8101f80cf09fcaa41a8","location":{"path":"app/helpers/webpack_helper.rb","lines":{"begin":8,"end":34}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `webpack_entrypoint_paths` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2059057b0a4c8c172104d3a69b6d33a1","location":{"path":"app/helpers/webpack_helper.rb","lines":{"begin":36,"end":57}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `webpack_public_host` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5187936b625c537cc83fe49f935245ac","location":{"path":"app/helpers/webpack_helper.rb","lines":{"begin":59,"end":68}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `milestone_class_for_state` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9f98077e679dcc8bdc4adbc9fc03e111","location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":71,"end":79}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `milestone_time_for` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7e9f0e967afa3a497b80340cf11b095e","location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":122,"end":144}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `milestone_date_range` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4843496f3de8ac4a890951c97d469064","location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":181,"end":197}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `share_with_group_lock_help_text` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ff00375205d66e384de0e3f33ec7d0d7","location":{"path":"app/helpers/groups_helper.rb","lines":{"begin":96,"end":108}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `group_title_link` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"98657f045e5336754e6eae56e789418f","location":{"path":"app/helpers/groups_helper.rb","lines":{"begin":141,"end":146}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `ci_icon_for_status` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"7c3efeba2a30134025307449a05b2f77","location":{"path":"app/helpers/ci_status_helper.rb","lines":{"begin":61,"end":91}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `sorting_helper.rb` has 302 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"01923968066dde38b1a1f78557e3aa84","location":{"path":"app/helpers/sorting_helper.rb","lines":{"begin":3,"end":382}},"other_locations":[],"remediation_points":1948800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `link_to_html` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7a4d4827db929df3ce6e16fb4d0b9522","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":45,"end":69}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `first_line_in_markdown` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a45a636cd6cfd627a9b9cb575482d665","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":75,"end":92}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `render_wiki_content` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f59f576a0875d3e1b3150c35d4244f1f","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":124,"end":148}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `markup_unsafe` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0f734634b0f84e17e369619da7591cc9","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":150,"end":166}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `truncate_visible` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7de1befc5006684b8aac21b36b5a2eee","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":198,"end":229}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `truncate_if_block` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c65f7114f8bc0ff0c40ba17a721dc4e7","location":{"path":"app/helpers/markup_helper.rb","lines":{"begin":234,"end":243}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `issuables_helper.rb` has 354 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"b0534175d956cb265e089add14a703e9","location":{"path":"app/helpers/issuables_helper.rb","lines":{"begin":3,"end":436}},"other_locations":[],"remediation_points":2697600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `multi_label_name` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f6f2aa839b3380e86377b58408fcfa15","location":{"path":"app/helpers/issuables_helper.rb","lines":{"begin":40,"end":51}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `issuable_labels_tooltip` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6ed7317a98ede04c4a1cde7f6af1871c","location":{"path":"app/helpers/issuables_helper.rb","lines":{"begin":208,"end":219}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `issuable_todo_button_data` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"382bc77616cd06810f3d2112c8460240","location":{"path":"app/helpers/issuables_helper.rb","lines":{"begin":381,"end":395}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `project_policy.rb` has 333 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"61f7a144aa6cdf7e965d3130c52aacc3","location":{"path":"app/policies/project_policy.rb","lines":{"begin":3,"end":434}},"other_locations":[],"remediation_points":2395200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remaining_days_in_words` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"db6e21e4091f24644db9efa04f03f5f2","location":{"path":"app/serializers/entity_date_helper.rb","lines":{"begin":47,"end":70}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_metrics` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fe3dd187f741789f765000b6e08c77bf","location":{"path":"app/serializers/merge_request_widget_entity.rb","lines":{"begin":252,"end":260}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `reassigned_issue_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"3e2a4c8e9b4b5584a258cdc21bf1779b","location":{"path":"app/mailers/emails/issues.rb","lines":{"begin":23,"end":23}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `relabeled_issue_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"eccd65b7da076099478491ce5ffd1bcd","location":{"path":"app/mailers/emails/issues.rb","lines":{"begin":40,"end":40}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `issue_status_changed_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"8d347450b4f4fa27b8d847a4e282b8f2","location":{"path":"app/mailers/emails/issues.rb","lines":{"begin":48,"end":48}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `issue_moved_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"a1fb6126b5a4051ae7af19c5fd1ea1ef","location":{"path":"app/mailers/emails/issues.rb","lines":{"begin":56,"end":56}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `reassigned_merge_request_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"8bd5f4e62d9db3075aa99840c56f1dc3","location":{"path":"app/mailers/emails/merge_requests.rb","lines":{"begin":26,"end":26}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `relabeled_merge_request_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"e4fbe646413819b74d51d11132d24f75","location":{"path":"app/mailers/emails/merge_requests.rb","lines":{"begin":34,"end":34}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `merge_request_status_email` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"c39ada600f20e34ac7bc271aaa17a489","location":{"path":"app/mailers/emails/merge_requests.rb","lines":{"begin":55,"end":55}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `NotifyPreview` has 26 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"0ad28a90a453e7f0892e2fa27ca7dd74","location":{"path":"app/mailers/previews/notify_preview.rb","lines":{"begin":3,"end":176}},"other_locations":[],"remediation_points":1800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `perform` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"ae09aa8f81cc51243569392f706dea8b","location":{"path":"app/workers/irker_worker.rb","lines":{"begin":9,"end":9}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `send_branch_updates` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"2efa6a64aab186fa6e22c887b82c2da8","location":{"path":"app/workers/irker_worker.rb","lines":{"begin":61,"end":61}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `send_commits` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"bda830a07ed575bd9c98deb67e6efa84","location":{"path":"app/workers/irker_worker.rb","lines":{"begin":84,"end":84}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `send_commits_count` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"fe8fcb808f2da3f31174330b3b8e8d2f","location":{"path":"app/workers/irker_worker.rb","lines":{"begin":113,"end":113}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `process_commit_message` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"0cbd58f4d824762ee08cbe8394a955be","location":{"path":"app/workers/process_commit_worker.rb","lines":{"begin":36,"end":36}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `close_issues` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"0ddd5587d752e08728eca56e8b842057","location":{"path":"app/workers/process_commit_worker.rb","lines":{"begin":45,"end":45}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"00fda5cf89ca2d06f32e73e5948d2d96","location":{"path":"app/workers/process_commit_worker.rb","lines":{"begin":18,"end":33}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b2d21175bd49ce0560d00b41a5d4b105","location":{"path":"app/workers/emails_on_push_worker.rb","lines":{"begin":8,"end":78}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `perform` has 58 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"21b177b9c8aab67c1dd18ac4736d07e0","location":{"path":"app/workers/emails_on_push_worker.rb","lines":{"begin":8,"end":78}},"other_locations":[],"remediation_points":1392000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bc6bfd63748977ec6b13ad1bcd32f3e0","location":{"path":"app/workers/repository_import_worker.rb","lines":{"begin":9,"end":30}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `perform` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"ac08a8c45d58e80f3f9f0e821af8c678","location":{"path":"app/workers/create_pipeline_worker.rb","lines":{"begin":9,"end":9}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sanity_check!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1e3c40adf8befa842892c33a2ef33ef6","location":{"path":"app/workers/object_storage/migrate_uploads_worker.rb","lines":{"begin":71,"end":81}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5767377fdd633dc52d45bb5edaf792ad","location":{"path":"app/workers/object_storage/background_move_worker.rb","lines":{"begin":10,"end":21}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"873b9f464ca14204612b7168bd6cd51a","location":{"path":"app/workers/repository_update_remote_mirror_worker.rb","lines":{"begin":18,"end":42}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform_repository_checks` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c569f618db6dab9061d1c9a4fbd00161","location":{"path":"app/workers/repository_check/batch_worker.rb","lines":{"begin":34,"end":49}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `perform` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"fb73a85eb279eea1e916d045d1752c0b","location":{"path":"app/workers/update_merge_requests_worker.rb","lines":{"begin":9,"end":9}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9c731770fbe34f3e5817178bf1c1c9c2","location":{"path":"app/workers/post_receive.rb","lines":{"begin":6,"end":25}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_project_changes` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dcfa21f106c7ddc7d59ef6a69ed225a5","location":{"path":"app/workers/post_receive.rb","lines":{"begin":29,"end":52}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"90ee5638594e38ee879df3d7b6670837","location":{"path":"app/workers/git_garbage_collect_worker.rb","lines":{"begin":11,"end":36}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c91f311ed659a5cf472f55294f93721e","location":{"path":"app/workers/project_migrate_hashed_storage_worker.rb","lines":{"begin":9,"end":22}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `handle_failure` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ea43d53b1207bf05223f6e3378b7622f","location":{"path":"app/workers/email_receiver_worker.rb","lines":{"begin":18,"end":51}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fb063b327d5645323a0adeb4a475ab88","location":{"path":"app/workers/create_gpg_signature_worker.rb","lines":{"begin":7,"end":29}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"90474c7bc130abea03bc8b0c1a6d72e3","location":{"path":"app/finders/concerns/finder_with_cross_project_access.rb","lines":{"begin":20,"end":32}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `by_due_date` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a7cd7e8d0b5f825ced9cce3fd0921f8b","location":{"path":"app/finders/issues_finder.rb","lines":{"begin":74,"end":90}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `all_groups` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9450c1e48d60393e153d88597dff24f6","location":{"path":"app/finders/groups_finder.rb","lines":{"begin":44,"end":54}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"be7b1d323697075c6c41a353ae096f3b","location":{"path":"app/finders/environments_finder.rb","lines":{"begin":11,"end":47}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `execute` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"caa84d8a4abdc89470c9734cc20f668b","location":{"path":"app/finders/environments_finder.rb","lines":{"begin":11,"end":47}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `issuable_finder.rb` has 326 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"a0da380c5a294186d2f8b47c7dbbefc2","location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":30,"end":487}},"other_locations":[],"remediation_points":2294400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `milestones` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"10f2a889ce05a62411b22bd93f5cc5fb","location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":195,"end":214}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `by_milestone` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4b5705f5f9e383902a98d61545a61a9f","location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":432,"end":447}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `IssuableFinder` has 47 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"863953770234ecee39c26f4a376fd96f","location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":30,"end":487}},"other_locations":[],"remediation_points":3900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `target` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"10931dd4f683d88c8163ae49517c9ab8","location":{"path":"app/finders/notes_finder.rb","lines":{"begin":30,"end":46}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `by_archived` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8a0163155f7d44abda52664f1aeec277","location":{"path":"app/finders/projects_finder.rb","lines":{"begin":153,"end":167}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `label_ids` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8efea533e852a1ae66e134916ddee3ed","location":{"path":"app/finders/labels_finder.rb","lines":{"begin":30,"end":59}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `project` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dcae9d4bea82b824bf3281aee3585c28","location":{"path":"app/finders/labels_finder.rb","lines":{"begin":138,"end":149}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1b10747a7f6c51031eb2aec28a84ab64","location":{"path":"app/finders/autocomplete/users_finder.rb","lines":{"begin":27,"end":40}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `distinct_on` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"684bb4005fc7ad31c75a6725f7cc9bb4","location":{"path":"app/finders/members_finder.rb","lines":{"begin":38,"end":71}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `TodosFinder` has 23 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"bda816f835a5b1d9557e5018542c8d40","location":{"path":"app/finders/todos_finder.rb","lines":{"begin":17,"end":195}},"other_locations":[],"remediation_points":1500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_block` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2764263922dc65629ac261e7b22a4aaa","location":{"path":"rubocop/cop/avoid_break_from_strong_memoize.rb","lines":{"begin":26,"end":37}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d3d826dd296b41ed52a3d279711f08c1","location":{"path":"rubocop/cop/migration/reversible_add_column_with_default.rb","lines":{"begin":22,"end":31}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7c2b352ab3b2b95bfd273eed48b0abde","location":{"path":"rubocop/cop/migration/update_column_in_batches.rb","lines":{"begin":14,"end":23}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1ca44c40f4350122f1d014c4832b0903","location":{"path":"rubocop/cop/migration/update_large_table.rb","lines":{"begin":52,"end":64}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"259f2282957271f68f06320d6e9c9304","location":{"path":"rubocop/cop/migration/add_reference.rb","lines":{"begin":13,"end":31}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_def` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1eade1345b7999362c94ffdd69c9abe5","location":{"path":"rubocop/cop/migration/add_index.rb","lines":{"begin":12,"end":32}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2957b0117eb58305df4d1c4f628f6e22","location":{"path":"rubocop/cop/migration/add_concurrent_index.rb","lines":{"begin":14,"end":26}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a265e4d95fda1c51004e6b280d4faa62","location":{"path":"rubocop/cop/migration/hash_index.rb","lines":{"begin":16,"end":35}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4642fe2fb8caa127e076b834679b38c7","location":{"path":"rubocop/cop/migration/add_column.rb","lines":{"begin":16,"end":35}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"53f08cb9ea1aded1c4867d5ec20513e1","location":{"path":"rubocop/cop/migration/datetime.rb","lines":{"begin":26,"end":38}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_def` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"33c826c076b3d604191dc285ae1c197f","location":{"path":"rubocop/cop/migration/remove_column.rb","lines":{"begin":13,"end":26}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5f6ab7199493398668d2f7fb4ae05a45","location":{"path":"rubocop/cop/migration/safer_boolean_column.rb","lines":{"begin":34,"end":58}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5d3a133fdd5733e12d588c313215673c","location":{"path":"rubocop/cop/migration/remove_concurrent_index.rb","lines":{"begin":14,"end":21}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_block` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"60e29c1a431f0815adefc57a3daa815a","location":{"path":"rubocop/cop/avoid_return_from_blocks.rb","lines":{"begin":28,"end":39}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parent_blocks` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bf710c1583fafaba0fb4a8d7507199ca","location":{"path":"rubocop/cop/avoid_return_from_blocks.rb","lines":{"begin":55,"end":65}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_class` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ac6a847fc937c343670c7deedadaa245","location":{"path":"rubocop/cop/code_reuse/presenter.rb","lines":{"begin":20,"end":37}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_all_send_nodes` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"86036271965f234231993a45bdebb14d","location":{"path":"rubocop/cop/code_reuse/worker.rb","lines":{"begin":31,"end":46}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_class` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3468ff5bbfe02d60179b461cee64dcd2","location":{"path":"rubocop/cop/code_reuse/serializer.rb","lines":{"begin":20,"end":37}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f6cd42fcfb267a05384d5c43432583d9","location":{"path":"rubocop/cop/code_reuse/active_record.rb","lines":{"begin":91,"end":107}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_if` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c31d398a0e65e6ad5bf772ffbe612d27","location":{"path":"rubocop/cop/line_break_around_conditional_block.rb","lines":{"begin":50,"end":58}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `autocorrect` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6790fd3dafb4732df58459faaaee4a86","location":{"path":"rubocop/cop/line_break_around_conditional_block.rb","lines":{"begin":60,"end":71}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `on_send` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"83f3ce0952418f2d18756e7f01d3f37e","location":{"path":"rubocop/cop/project_path_helper.rb","lines":{"begin":10,"end":21}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"rubocop/cop/project_path_helper.rb","lines":{"begin":18,"end":18}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"16132947f8a9d308be379b39b9a5d3e6"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `perform` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"00f629cf63f892026e01afc3ea1f7651","location":{"path":"qa/qa/scenario/test/sanity/selectors.rb","lines":{"begin":10,"end":49}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `configure!` has 44 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"024a3eec035772b027f91725d6217728","location":{"path":"qa/qa/runtime/browser.rb","lines":{"begin":34,"end":100}},"other_locations":[],"remediation_points":1056000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b5bc236abe446161666817def77f8ddf","location":{"path":"qa/qa/specs/runner.rb","lines":{"begin":16,"end":34}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fabricate!` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d6f04a78d84c195424103bc166feb302","location":{"path":"qa/qa/factory/repository/push.rb","lines":{"begin":33,"end":75}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `fabricate!` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0619d32fe486fa8cd5d32a978dbba114","location":{"path":"qa/qa/factory/repository/push.rb","lines":{"begin":33,"end":75}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fabricate!` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3806fbbd18c151ecd8c0b6a777c6eafd","location":{"path":"qa/qa/factory/resource/kubernetes_cluster.rb","lines":{"begin":16,"end":55}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `fabricate!` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9a68225ad27f7d73dc48ba5138c97cc4","location":{"path":"qa/qa/factory/resource/kubernetes_cluster.rb","lines":{"begin":16,"end":55}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fabricate!` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"455a528019b993508c00252ac2356d13","location":{"path":"qa/qa/factory/resource/branch.rb","lines":{"begin":19,"end":73}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `fabricate!` has 40 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8c20ae555f1495416940ef8126556a4b","location":{"path":"qa/qa/factory/resource/branch.rb","lines":{"begin":19,"end":73}},"other_locations":[],"remediation_points":960000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sign_in_using_credentials` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cf2fda789a392298297395e24cd69833","location":{"path":"qa/qa/page/main/login.rb","lines":{"begin":43,"end":60}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `expand_section` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"403c8764d8456908ed9eeef4e0044633","location":{"path":"qa/qa/page/settings/common.rb","lines":{"begin":8,"end":19}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Repository` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"1f47da27b9c8ebadc35daab5ecdfacbd","location":{"path":"qa/qa/git/repository.rb","lines":{"begin":7,"end":126}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Base` has 36 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"e990b96533b4c82f0e6c7290f79ea42e","location":{"path":"lib/declarative_policy/base.rb","lines":{"begin":2,"end":330}},"other_locations":[],"remediation_points":2800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"return_statements","content":{"body":""},"description":"Avoid too many `return` statements within this method.","location":{"path":"lib/declarative_policy/condition.rb","lines":{"begin":72,"end":72}},"other_locations":[],"remediation_points":300000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"453a21507c9d4e6b09338d4ea74a2cb6"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `run` has a Cognitive Complexity of 29 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9109da1712e5180769d6dee88e01ab4b","location":{"path":"lib/declarative_policy/runner.rb","lines":{"begin":76,"end":108}},"other_locations":[],"remediation_points":2550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `steps_by_score` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c728761c8bd550bb676d5ac29cc54f2c","location":{"path":"lib/declarative_policy/runner.rb","lines":{"begin":130,"end":179}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `steps_by_score` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"fda7518f9492e598aeaa14084a16fcad","location":{"path":"lib/declarative_policy/runner.rb","lines":{"begin":130,"end":179}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `flattened` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"938e199f4acb9d23e67b122acf7df125","location":{"path":"lib/declarative_policy/step.rb","lines":{"begin":51,"end":76}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e8ff80c1013b45a887d5b05aebda0a6d","location":{"path":"lib/mattermost/session.rb","lines":{"begin":100,"end":112}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Session` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"b6bc576e4f2b4e33eeb24fbd9a4756e0","location":{"path":"lib/mattermost/session.rb","lines":{"begin":23,"end":185}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `from_params` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8708d87b45e03dda5cf801ba3c8b4ae8","location":{"path":"lib/uploaded_file.rb","lines":{"begin":31,"end":50}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `object_link_commit` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4d75625eef2a0bac64c81e6a99b470c7","location":{"path":"lib/banzai/filter/merge_request_reference_filter.rb","lines":{"begin":66,"end":77}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e4a7914b17bf2c4568c886ae0510580a","location":{"path":"lib/banzai/filter/issuable_state_filter.rb","lines":{"begin":13,"end":29}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c21517ccaabda5807f34857c92c02c20","location":{"path":"lib/banzai/filter/emoji_filter.rb","lines":{"begin":11,"end":26}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5b2ff3f6e59ccd27a3e8df6e92792289","location":{"path":"lib/banzai/filter/gollum_tags_filter.rb","lines":{"begin":64,"end":87}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_relative_path` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1fc007ca58af10483040ad6c3acafc7b","location":{"path":"lib/banzai/filter/relative_link_filter.rb","lines":{"begin":124,"end":140}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0d11bc0fb07cb93de54e50ca187a470c","location":{"path":"lib/banzai/filter/inline_diff_filter.rb","lines":{"begin":8,"end":20}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"229de514760543ff1eae907b8931ae4a","location":{"path":"lib/banzai/filter/spaced_link_filter.rb","lines":{"begin":44,"end":60}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 28 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f2adb2780e68c3edecbf3243959331bc","location":{"path":"lib/banzai/filter/abstract_reference_filter.rb","lines":{"begin":99,"end":148}},"other_locations":[],"remediation_points":2450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `object_link_filter` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"756d39528c96fdea1b53fc02cd2f1b54","location":{"path":"lib/banzai/filter/abstract_reference_filter.rb","lines":{"begin":161,"end":204}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `AbstractReferenceFilter` has 31 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"bf8591fc0f7db3df80a7dd6204670584","location":{"path":"lib/banzai/filter/abstract_reference_filter.rb","lines":{"begin":7,"end":359}},"other_locations":[],"remediation_points":2300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `call` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"158c3e7c7c151f7461c460b58c8eb7fb","location":{"path":"lib/banzai/filter/abstract_reference_filter.rb","lines":{"begin":99,"end":148}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `object_link_filter` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cce139d64bf42a05629c35156d98c24b","location":{"path":"lib/banzai/filter/abstract_reference_filter.rb","lines":{"begin":161,"end":204}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f009def1da08a1c0910203aacb888646","location":{"path":"lib/banzai/filter/external_issue_reference_filter.rb","lines":{"begin":30,"end":55}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e19e0b6d7127e7778817e23a5c2202a6","location":{"path":"lib/banzai/filter/external_link_filter.rb","lines":{"begin":9,"end":23}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `highlight_node` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9dc3f1809c63dc39b3c7b301b2c8b0a8","location":{"path":"lib/banzai/filter/syntax_highlight_filter.rb","lines":{"begin":19,"end":53}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0228be52a5d55a59f39144f901ba3de8","location":{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":28,"end":51}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `user_link_filter` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e1a29dd5f3f29173136fead3b7feacff","location":{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":61,"end":75}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c56c41f7c09938431d527c9d84ee464c","location":{"path":"lib/banzai/filter/project_reference_filter.rb","lines":{"begin":26,"end":47}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"23c5be476e6cfabb3f50b8995a21481e","location":{"path":"lib/banzai/filter/autolink_filter.rb","lines":{"begin":51,"end":67}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `autolink_match` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"63ef57bb6d5d4556a6d292a19e1eb7aa","location":{"path":"lib/banzai/filter/autolink_filter.rb","lines":{"begin":79,"end":116}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_unsafe_links` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"578c89c0c495a9f9912ae5425a9baf35","location":{"path":"lib/banzai/filter/sanitization_filter.rb","lines":{"begin":64,"end":91}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_unsafe_table_style` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"66ae1f700aade40e1b93928de1809522","location":{"path":"lib/banzai/filter/sanitization_filter.rb","lines":{"begin":101,"end":114}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_link_attr` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fe0e7a59ae612e2391ff8956ece5a37e","location":{"path":"lib/banzai/filter/absolute_link_filter.rb","lines":{"begin":21,"end":29}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"91ceeacf382258ddf799f7e8df323086","location":{"path":"lib/banzai/filter/commit_trailers_filter.rb","lines":{"begin":29,"end":43}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `link_to_user` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"2cae91969679378626a39ee56d06c378","location":{"path":"lib/banzai/filter/commit_trailers_filter.rb","lines":{"begin":81,"end":115}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"complex_logic","content":{"body":""},"description":"Consider simplifying this complex logical expression.","location":{"path":"lib/banzai/filter/math_filter.rb","lines":{"begin":27,"end":36}},"other_locations":[],"remediation_points":400000,"severity":"major","type":"issue","engine_name":"structure","fingerprint":"c132e79b1733f1ef2e4fba2f07f29935"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"88347949c1ff362bde8f0c3f4fe03dc2","location":{"path":"lib/banzai/filter/table_of_contents_filter.rb","lines":{"begin":21,"end":52}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_parent` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b3d0438ee7565d4ad0316ba6f05a9baf","location":{"path":"lib/banzai/filter/table_of_contents_filter.rb","lines":{"begin":102,"end":115}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `nodes_visible_to_user` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c851d1fc927d9308df218d02f42fde99","location":{"path":"lib/banzai/reference_parser/user_parser.rb","lines":{"begin":25,"end":48}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `nodes_user_can_reference` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bfa5e9970213f7ef43f0e22780710fb3","location":{"path":"lib/banzai/reference_parser/user_parser.rb","lines":{"begin":64,"end":87}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `grouped_objects_for_nodes` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"56d2576cd012b6e37a94c3cac839a5fd","location":{"path":"lib/banzai/reference_parser/base_parser.rb","lines":{"begin":134,"end":147}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `BaseParser` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"3b65d4312cddf7542466b907246e6568","location":{"path":"lib/banzai/reference_parser/base_parser.rb","lines":{"begin":34,"end":255}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cache_collection_render` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"86955f7d246e45efcedaab9abac1b39e","location":{"path":"lib/banzai/renderer.rb","lines":{"begin":76,"end":103}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `filter_nodes_at_beginning` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"575e435b81c0cb589731931503f3f7ef","location":{"path":"lib/banzai/querying.rb","lines":{"begin":45,"end":64}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a1435f7fb2485ddc0076596fa851b5e1","location":{"path":"lib/file_size_validator.rb","lines":{"begin":8,"end":17}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_validity!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4c0eea681bcd3ea73ab99bdeb9992c52","location":{"path":"lib/file_size_validator.rb","lines":{"begin":19,"end":33}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_each` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4ad97d789c0a7bb2c49b85af370fa1cb","location":{"path":"lib/file_size_validator.rb","lines":{"begin":36,"end":65}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `projects.rb` has 419 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"de2195ccf1e60f3a00e250b69809f314","location":{"path":"lib/api/projects.rb","lines":{"begin":1,"end":513}},"other_locations":[],"remediation_points":3633600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `apply_filters` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3d37733ec13b40a7294cb95cca30d7c0","location":{"path":"lib/api/projects.rb","lines":{"begin":21,"end":27}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `entities.rb` has 1174 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"14ca44a7292f309674c3e6bf5668d68a","location":{"path":"lib/api/entities.rb","lines":{"begin":1,"end":1469}},"other_locations":[],"remediation_points":14505600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_note` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5bdd6d096b03346b779bae1a47c5df19","location":{"path":"lib/api/helpers/notes_helpers.rb","lines":{"begin":89,"end":101}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_job!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9c2df515fd3e4e567e5c43ce34122ebc","location":{"path":"lib/api/helpers/runner.rb","lines":{"begin":34,"end":42}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `filter_runners` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8fe97bd7f7ff40f6f347505c5401de55","location":{"path":"lib/api/runners.rb","lines":{"begin":163,"end":176}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `authenticate_show_runner!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"678c4afecdf242daef2608fb52f16121","location":{"path":"lib/api/runners.rb","lines":{"begin":184,"end":188}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `authenticate_delete_runner!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"229dc324c7b4cd0754d3f429d0efa489","location":{"path":"lib/api/runners.rb","lines":{"begin":196,"end":201}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `authenticate_enable_runner!` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fdde7223cb136c51a33619a48b7e10e9","location":{"path":"lib/api/runners.rb","lines":{"begin":203,"end":210}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `issues.rb` has 266 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"49d5eae8f5a9b7ef20af4a226580c9fb","location":{"path":"lib/api/issues.rb","lines":{"begin":1,"end":332}},"other_locations":[],"remediation_points":1430400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `filter_builds` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b03e3d209e73511af90d54684b559d3a","location":{"path":"lib/api/jobs.rb","lines":{"begin":176,"end":185}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `list_milestones_for` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8e051bd18be2af43510bfc934382e630","location":{"path":"lib/api/milestone_responses.rb","lines":{"begin":30,"end":37}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `assign_file_vars!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4be22423f2ecad963ae6b37b42f43510","location":{"path":"lib/api/files.rb","lines":{"begin":25,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `assign_blob_vars!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e73cbaada1130cabaf0dfa4c08f70656","location":{"path":"lib/api/repositories.rb","lines":{"begin":22,"end":35}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `services.rb` has 836 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"68db3252fd8eaa9d286783dcd5099377","location":{"path":"lib/api/services.rb","lines":{"begin":2,"end":864}},"other_locations":[],"remediation_points":9638400,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `runner.rb` has 266 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"1e11149dffed6dc2e322c584638327bf","location":{"path":"lib/api/runner.rb","lines":{"begin":1,"end":316}},"other_locations":[],"remediation_points":1430400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `merge_requests.rb` has 322 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"3de9fe3d6f81552276ac816a0f052fb7","location":{"path":"lib/api/merge_requests.rb","lines":{"begin":1,"end":398}},"other_locations":[],"remediation_points":2236800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `handle_merge_request_errors!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4b0820e7ae582cfc463b18401dc7dfd6","location":{"path":"lib/api/merge_requests.rb","lines":{"begin":145,"end":159}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `helpers.rb` has 381 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"5db68c679d275d3963e0f9660988e103","location":{"path":"lib/api/helpers.rb","lines":{"begin":1,"end":533}},"other_locations":[],"remediation_points":3086400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `attributes_for_keys` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"63712b203f7a63b38bcb9eea53c3001d","location":{"path":"lib/api/helpers.rb","lines":{"begin":289,"end":299}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `project_finder_params` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"268f87eb93bd855d1807610fcddd6efe","location":{"path":"lib/api/helpers.rb","lines":{"begin":408,"end":420}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `present_carrierwave_file!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"360f85bdb8a06a280a62224143731f15","location":{"path":"lib/api/helpers.rb","lines":{"begin":440,"end":452}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sudo!` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ddabeb34a3b3e3067c6b88323ce10dcc","location":{"path":"lib/api/helpers.rb","lines":{"begin":468,"end":487}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `users.rb` has 652 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"da0cb2b4e7ad1056fa1e4f7a0fc774d7","location":{"path":"lib/api/users.rb","lines":{"begin":1,"end":837}},"other_locations":[],"remediation_points":6988800,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_groups` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"eea17dfbc1a8fa0837c83d51e2708400","location":{"path":"lib/api/groups.rb","lines":{"begin":42,"end":56}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `inject_rblineprof` has a Cognitive Complexity of 49 (exceeds 5 allowed). Consider refactoring.","fingerprint":"16157b2c336822ada397c30b37d0e63b","location":{"path":"lib/peek/rblineprof/custom_controller_helpers.rb","lines":{"begin":17,"end":100}},"other_locations":[],"remediation_points":4550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `inject_rblineprof` has 62 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9665938c091b2575d937990fbc609dac","location":{"path":"lib/peek/rblineprof/custom_controller_helpers.rb","lines":{"begin":17,"end":100}},"other_locations":[],"remediation_points":1488000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `flatten_comments` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3acab7e81bc6f21925b3944dc13c9d25","location":{"path":"lib/bitbucket_server/representation/comment.rb","lines":{"begin":87,"end":111}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_errors!` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5656af648a8148a4747d9750b93c8a0c","location":{"path":"lib/bitbucket_server/connection.rb","lines":{"begin":62,"end":74}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `extract_ref` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8b8bde6183c235753993662c791c5f50","location":{"path":"lib/extracts_path.rb","lines":{"begin":40,"end":74}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `assign_ref_vars` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"994b000ce7697f00c9d2fdef6d5f219c","location":{"path":"lib/extracts_path.rb","lines":{"begin":108,"end":133}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `gitaly_configuration_toml` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7ce1b00e1e01659ed25ab9357f9d47d7","location":{"path":"lib/gitlab/setup_helper.rb","lines":{"begin":14,"end":43}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_with_user_password` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0212b6bdb5ef9f95aaaad8df3d25a15a","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":47,"end":83}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `rate_limit!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"18c084f7a7640dd9934777afe795d6e1","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":85,"end":104}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `service_request_check` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fcdcb167117e9fbdc60bcccfa8c52ce9","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":112,"end":128}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `deploy_token_check` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3349988ec83e4933b92c3a7e3824cc58","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":185,"end":199}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `lfs_token_check` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4f1a1535569de597558d429c01457d5e","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":202,"end":228}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build_access_token_check` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1e8fcdca34d7247788de08e6051143d2","location":{"path":"lib/gitlab/auth.rb","lines":{"begin":230,"end":245}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `setup_subscribers` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"85ca5972d830d83ef927532dcf66122f","location":{"path":"lib/gitlab/performance_bar/peek_query_tracker.rb","lines":{"begin":17,"end":36}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fields` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dbfd2a1c630915fc2b4befaca081c456","location":{"path":"lib/gitlab/slash_commands/presenters/issue_base.rb","lines":{"begin":21,"end":39}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `format_response` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"57bd6ed972d21a41e82e376f51d7a76e","location":{"path":"lib/gitlab/slash_commands/presenters/base.rb","lines":{"begin":47,"end":58}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `text` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0fea0819cd1d628d704dab5f9f56ae5c","location":{"path":"lib/gitlab/slash_commands/presenters/issue_show.rb","lines":{"begin":40,"end":53}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `file.rb` has 255 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"bcd7afc2511311acf93e48f89b257ee8","location":{"path":"lib/gitlab/diff/file.rb","lines":{"begin":1,"end":356}},"other_locations":[],"remediation_points":1272000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `simple_viewer_class` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"455a703cf96823be99c475db08de0c9f","location":{"path":"lib/gitlab/diff/file.rb","lines":{"begin":311,"end":339}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `viewer_class_from` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cae1cebb92d35a5859ef229108d1e4c1","location":{"path":"lib/gitlab/diff/file.rb","lines":{"begin":345,"end":353}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `File` has 54 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"4872155d7a8ab149e4dbfdd0a34d314f","location":{"path":"lib/gitlab/diff/file.rb","lines":{"begin":3,"end":354}},"other_locations":[],"remediation_points":4600000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `simple_viewer_class` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c663249a7eb69d79d53815c02da1287e","location":{"path":"lib/gitlab/diff/file.rb","lines":{"begin":311,"end":339}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `initialize` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"62d56326c2f46a050e8a9f1219488e25","location":{"path":"lib/gitlab/diff/line.rb","lines":{"begin":10,"end":10}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Position` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"44aef8e9a5055d83b7605ef01a8ffcd5","location":{"path":"lib/gitlab/diff/position.rb","lines":{"begin":5,"end":150}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `highlight` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"922e6aee35a311a79f1043b07ee7064d","location":{"path":"lib/gitlab/diff/highlight.rb","lines":{"begin":21,"end":44}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `highlight_line` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b41f2627f4109bdc5b74287cf3ba0d21","location":{"path":"lib/gitlab/diff/highlight.rb","lines":{"begin":48,"end":64}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parallelize` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"631e96ad1ef01b07245ee2a542d76275","location":{"path":"lib/gitlab/diff/parallel_diff.rb","lines":{"begin":10,"end":58}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `parallelize` has 35 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"c801b9d4ce1a0b15a92b13570e4b4a73","location":{"path":"lib/gitlab/diff/parallel_diff.rb","lines":{"begin":10,"end":58}},"other_locations":[],"remediation_points":840000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `diff_stats_collection` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d1edfc550eecbd5daa471adab0ab3385","location":{"path":"lib/gitlab/diff/file_collection/base.rb","lines":{"begin":50,"end":59}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse` has a Cognitive Complexity of 29 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bfc88a6b4fdafecdb4881ebd0a709e90","location":{"path":"lib/gitlab/diff/parser.rb","lines":{"begin":6,"end":63}},"other_locations":[],"remediation_points":2550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `parse` has 42 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"6d81f9668924e2328ae1d3b978012b2e","location":{"path":"lib/gitlab/diff/parser.rb","lines":{"begin":6,"end":63}},"other_locations":[],"remediation_points":1008000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `trace` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"678e46609976cce578070c879cdeaa09","location":{"path":"lib/gitlab/diff/position_tracer.rb","lines":{"begin":18,"end":86}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `trace_added_line` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3d3253565d5f52fdc8e227a610a4ba02","location":{"path":"lib/gitlab/diff/position_tracer.rb","lines":{"begin":90,"end":127}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `trace_removed_line` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7a2345cd4720ceb59ce0efdf2c931d70","location":{"path":"lib/gitlab/diff/position_tracer.rb","lines":{"begin":129,"end":158}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `trace_unchanged_line` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"68d033636c672cf93801ba4a440a9b10","location":{"path":"lib/gitlab/diff/position_tracer.rb","lines":{"begin":160,"end":199}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `map_line_number` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dc329e8839fe1c0b24ddd3dbaa5b8485","location":{"path":"lib/gitlab/diff/line_mapper.rb","lines":{"begin":30,"end":61}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `popen_with_detail` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1f3016518aa9a963248a02cac889fd75","location":{"path":"lib/gitlab/popen.rb","lines":{"begin":18,"end":51}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `request_cache` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c7f577fa9ce2f42e5f27aac8db514fe3","location":{"path":"lib/gitlab/cache/request_cache.rb","lines":{"begin":23,"end":58}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `store_in_cache_if_needed` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"baa77c71d04626f49bd5c1e57a0e2ca9","location":{"path":"lib/gitlab/cache/ci/project_pipeline_status.rb","lines":{"begin":92,"end":100}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `aggregate_rblineprof` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5c969b511dec60cc5ae82a493581e987","location":{"path":"lib/gitlab/sherlock/line_profiler.rb","lines":{"begin":59,"end":85}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `subscribe_to_active_record` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"cb47c9a23a0a444f0c02f2ce82101c23","location":{"path":"lib/gitlab/sherlock/transaction.rb","lines":{"begin":88,"end":96}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_keys_not_found_in_db` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"110e16cf8bc4b13203ae16707be71f9e","location":{"path":"lib/gitlab/shell.rb","lines":{"begin":229,"end":246}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Shell` has 37 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"9bb914cee67608b26add7bcc4f81b00b","location":{"path":"lib/gitlab/shell.rb","lines":{"begin":6,"end":445}},"other_locations":[],"remediation_points":2900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `bulk_insert` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"46738c8e24da7d644d4613d9605d7262","location":{"path":"lib/gitlab/database.rb","lines":{"begin":167,"end":197}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f71d3611436ba9323475933db3b224e0","location":{"path":"lib/gitlab/gitaly_client/conflict_files_stitcher.rb","lines":{"begin":10,"end":26}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a4899ef1be9285a53b4a3412a311ee1f","location":{"path":"lib/gitlab/gitaly_client/blobs_stitcher.rb","lines":{"begin":10,"end":29}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `update_page` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"5e1fe756db8adf0384ead3d7ca4d40bb","location":{"path":"lib/gitlab/gitaly_client/wiki_service.rb","lines":{"begin":41,"end":41}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_file` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f2ac95cd9282cf75ce51181ba7bcf087","location":{"path":"lib/gitlab/gitaly_client/wiki_service.rb","lines":{"begin":128,"end":152}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `wiki_page_from_iterator` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8d18749d8e89aa853f84d5b8ab2fa1e0","location":{"path":"lib/gitlab/gitaly_client/wiki_service.rb","lines":{"begin":171,"end":192}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `commit_service.rb` has 334 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"459baf31c3d4b57e8c9df845211d85c9","location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":1,"end":431}},"other_locations":[],"remediation_points":2409600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `diff` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6776fdb83e8edfae5378441fd52a4925","location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":33,"end":63}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `tree_entry` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"00baf604adba61e863f7d154a8dee72b","location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":78,"end":109}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_commit` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"186f0eba8b7425edc8cc3c73c38cd40a","location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":242,"end":262}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `CommitService` has 31 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"49c846fd451fa9152c64a84b18cea747","location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":3,"end":429}},"other_locations":[],"remediation_points":2300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `ref_service.rb` has 252 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"eb1efcba78462f496979baf4cb6cd2ad","location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":1,"end":327}},"other_locations":[],"remediation_points":1228800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `RefService` has 31 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"00c5cfab9191c2db4747039325616652","location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":3,"end":325}},"other_locations":[],"remediation_points":2300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `repository_service.rb` has 323 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"493989beb71c8d830c2b79d5553c6147","location":{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":1,"end":396}},"other_locations":[],"remediation_points":2251200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fetch_remote` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f3aee0aba331f59ab18ffef3792b052a","location":{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":64,"end":81}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `RepositoryService` has 35 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"6ca9b3950e1ce99211058bd24b696cd9","location":{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":3,"end":394}},"other_locations":[],"remediation_points":2700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `user_squash` has 7 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"3244c060b29a67dfaca14f5fd90c0c69","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":207,"end":207}},"other_locations":[],"remediation_points":525000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `user_commit_files` has 8 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"e11b9bf00977dfd40d466849a02aad7e","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":234,"end":235}},"other_locations":[],"remediation_points":600000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `user_commit_files_request_header` has 8 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"74f8cedbd2e30f093d96c68640b17e2f","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":316,"end":317}},"other_locations":[],"remediation_points":600000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `operation_service.rb` has 284 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"e9b10e91d8aa4aecb2dd40e2ff73151e","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":1,"end":343}},"other_locations":[],"remediation_points":1689600,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `user_create_branch` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f83bdf53147b9d2930979ca6a622f44f","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":48,"end":69}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `user_merge_branch` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"96dce6cec3c6d464fe3b164bf05adf61","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":101,"end":137}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `user_commit_files` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b324bd9e25781ee4f45ebe63530654b5","location":{"path":"lib/gitlab/gitaly_client/operation_service.rb","lines":{"begin":233,"end":274}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `define_predicate_methods` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1748406e1b1a3efed8bbdbc2f7310efb","location":{"path":"lib/gitlab/fake_application_settings.rb","lines":{"begin":9,"end":19}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"306bfd1a5668c64b46f9a50ffcb84761","location":{"path":"lib/gitlab/http_io.rb","lines":{"begin":76,"end":100}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_chunk` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"718a1c6197d9172beada51e8fb725aa8","location":{"path":"lib/gitlab/http_io.rb","lines":{"begin":147,"end":173}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `HttpIO` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"f90f3bbe0002c0551d2c102e8d6cc2bb","location":{"path":"lib/gitlab/http_io.rb","lines":{"begin":5,"end":192}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `system_usage_data` has 49 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e44de166e4765b13674da7e6f1adbb03","location":{"path":"lib/gitlab/usage_data.rb","lines":{"begin":35,"end":85}},"other_locations":[],"remediation_points":1176000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `print_methods` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"74e543934a1cb0119b1cb9bc2bef6f4a","location":{"path":"lib/gitlab/profiler/total_time_flat_printer.rb","lines":{"begin":13,"end":36}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `format_issue_comment_body` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"4b9885935625732368d27f4d57c09a6b","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":327,"end":327}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `importer.rb` has 283 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"1456110a9f0cea86dbda2fdc6ff8b006","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":1,"end":371}},"other_locations":[],"remediation_points":1675200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issues` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fda606a33fed0d051037b3e7ec312764","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":82,"end":126}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issue_comments` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e40d64a7ad3fca74d9f0603fcdfde073","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":146,"end":179}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `format_updates` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"627781504f289b64edb3cae5ded46686","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":237,"end":293}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `format_attachments` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3eae70f0804e77646cf183b658337852","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":312,"end":325}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `import_issues` has 33 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"140622e56443443be6d89cf7f8134759","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":82,"end":126}},"other_locations":[],"remediation_points":792000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `import_issue_comments` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"81d77c1a0b5ebc4248e39438a9b784c1","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":146,"end":179}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `format_updates` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9b843b25138348d8d9e7cf6df7a2f0ed","location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":237,"end":293}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `full_path` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"200d2aea21e0c3f34efb9b3a8051a82f","location":{"path":"lib/gitlab/database/rename_reserved_paths_migration/v1/migration_classes.rb","lines":{"begin":7,"end":15}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `rank_rows` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"dc13ef2bef6a33cc8bc4e67b71564878","location":{"path":"lib/gitlab/database/median.rb","lines":{"begin":140,"end":174}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `migration_helpers.rb` has 543 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"01e21ae134d30a14bd512652b7a940ab","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":1,"end":1078}},"other_locations":[],"remediation_points":5419200,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_timestamps_with_timezone` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c59bbcc4bf6935d5c169f128844c4c91","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":17,"end":40}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_concurrent_foreign_key` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ce151ede627cdfdf31c565ade50905ea","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":152,"end":206}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `disable_statement_timeout` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"31b96e31df6242d18aba1d4abf07f1f9","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":240,"end":272}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update_column_in_batches` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"21d13cfd466605197c31d8958201310c","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":323,"end":380}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `add_column_with_default` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"009915036d7d7932903bc6f766511a5e","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":406,"end":438}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `copy_indexes` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"60d019b8234aa4a0d7d445a95ee1e8ae","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":817,"end":859}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `bulk_queue_background_migration_jobs_by_range` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"128bc9f2059885db7d254bdb6a31d4b3","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":972,"end":993}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `add_concurrent_foreign_key` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"f6243b1ac45a70775392f6137b36e35f","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":152,"end":206}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `update_column_in_batches` has 37 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"6dc99342ecbf79855eb8044b9e00cbdd","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":323,"end":380}},"other_locations":[],"remediation_points":888000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `change_column_type_using_background_migration` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"39133c1e5a2502598dbf0ec8dc0af798","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":593,"end":640}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `rename_column_using_background_migration` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"fc89feb63b650bd5547ac2ba44210012","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":670,"end":731}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `copy_indexes` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"8b98ee08501009b6bf421b8064689b30","location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":817,"end":859}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fetch_config` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4b3b0f6bd727a62eae22091574b81015","location":{"path":"lib/gitlab/mail_room.rb","lines":{"begin":31,"end":49}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `note_url` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"59ca4f1b16f978d96a1c7e36f7e69d62","location":{"path":"lib/gitlab/url_builder.rb","lines":{"begin":52,"end":71}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `rewrite` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f45f6ba5c50a0ab576b49cf1b282a615","location":{"path":"lib/gitlab/gfm/uploads_rewriter.rb","lines":{"begin":19,"end":29}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `unfold_reference` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"be381321436537b6ec6941dcff14d0b9","location":{"path":"lib/gitlab/gfm/reference_rewriter.rb","lines":{"begin":56,"end":72}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sections` has a Cognitive Complexity of 24 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0f6b50ef494458ae4f54e52a28568869","location":{"path":"lib/gitlab/conflict/file.rb","lines":{"begin":49,"end":110}},"other_locations":[],"remediation_points":2050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_match_line_header` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4fef2b9774e94d0bd02f1158378f701c","location":{"path":"lib/gitlab/conflict/file.rb","lines":{"begin":123,"end":137}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `as_json` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ed7b03c5a2c2d110a9a9db9e00f3d8d0","location":{"path":"lib/gitlab/conflict/file.rb","lines":{"begin":150,"end":168}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `sections` has 36 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"629b80d357b767eb9b1f37185affacd4","location":{"path":"lib/gitlab/conflict/file.rb","lines":{"begin":49,"end":110}},"other_locations":[],"remediation_points":864000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `which` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"565d3b45775f71100b9c7277076be0f6","location":{"path":"lib/gitlab/utils.rb","lines":{"begin":63,"end":74}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `render_go_doc` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e0fac0dd89237b115b26def1d32171a6","location":{"path":"lib/gitlab/middleware/go.rb","lines":{"begin":22,"end":33}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `with_open_files` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"83c9d42c4a44fe57eeee2a2b269ddb60","location":{"path":"lib/gitlab/middleware/multipart.rb","lines":{"begin":38,"end":57}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `decorate_params_value` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"32d0634549f8a039069852514c0c4e20","location":{"path":"lib/gitlab/middleware/multipart.rb","lines":{"begin":60,"end":82}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `initialize` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"100b77808e789566083b5722f853d491","location":{"path":"lib/gitlab/legacy_github_import/project_creator.rb","lines":{"begin":6,"end":6}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issues` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3bfd1976bd1c3f5b63ad73183773103c","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":117,"end":136}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_pull_requests` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d3b76e6c4972600af102835c1739459a","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":139,"end":165}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_comments` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8131d9fa54052fb8688da41fca5b29ff","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":222,"end":245}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_wiki` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c9017489731af795ba61fdc442e91922","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":266,"end":278}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_releases` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6cf70c97f808766cb57657e58420cb89","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":280,"end":291}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Importer` has 27 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"564493c4d63110500702ce8552822c02","location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":3,"end":339}},"other_locations":[],"remediation_points":1900000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_object_to_import` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1c46822af079d421dee8173b07f3b80a","location":{"path":"lib/gitlab/github_import/parallel_scheduling.rb","lines":{"begin":78,"end":106}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_page` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d8e73017cc50cf5ae0ff94ea436d3ced","location":{"path":"lib/gitlab/github_import/client.rb","lines":{"begin":91,"end":112}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `with_rate_limit` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f8e67dd27500a710187cc201ddc1dded","location":{"path":"lib/gitlab/github_import/client.rb","lines":{"begin":133,"end":149}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Client` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"8c409ff9cd79515f70c131a687a58c2d","location":{"path":"lib/gitlab/github_import/client.rb","lines":{"begin":16,"end":216}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_sub_relations` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"de78150728d4deb7bbd23ae848875928","location":{"path":"lib/gitlab/import_export/project_tree_restorer.rb","lines":{"begin":134,"end":159}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_sub_relation` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"357889b554818506acea0dfc8f000afc","location":{"path":"lib/gitlab/import_export/project_tree_restorer.rb","lines":{"begin":161,"end":171}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e960e3648215aee14c4e5443b5f897b0","location":{"path":"lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb","lines":{"begin":27,"end":49}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `build!` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1dd9f4457d861e5b12020c99ef408fe4","location":{"path":"lib/gitlab/import_export/after_export_strategy_builder.rb","lines":{"begin":6,"end":17}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"343742e2d2dc60bd360734eccf276cc8","location":{"path":"lib/gitlab/import_export/merge_request_parser.rb","lines":{"begin":13,"end":22}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `copy_project_uploads` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d141822a7e49c9987620bcbcaf7749c0","location":{"path":"lib/gitlab/import_export/uploads_manager.rb","lines":{"begin":44,"end":56}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Importer` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"9b57d9528846dda6448ed9d3a49747c3","location":{"path":"lib/gitlab/import_export/importer.rb","lines":{"begin":3,"end":129}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `imported_object` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7150a66352dfbd84b82e4bfa60942b90","location":{"path":"lib/gitlab/import_export/relation_factory.rb","lines":{"begin":198,"end":209}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `RelationFactory` has 30 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"4f17a460cbd29b77fbb38f05dd3866a4","location":{"path":"lib/gitlab/import_export/relation_factory.rb","lines":{"begin":3,"end":281}},"other_locations":[],"remediation_points":2200000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `project_attributes` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"80346e71805b8ddd466c6b77a8f2e1e6","location":{"path":"lib/gitlab/import_export/group_project_object_builder.rb","lines":{"begin":49,"end":62}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `build` has 7 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"34c8251c050af78b0e432e62b3bf6eaf","location":{"path":"lib/gitlab/data_builder/push.rb","lines":{"begin":56,"end":56}},"other_locations":[],"remediation_points":525000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `build` has 29 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e5d84ee4338c67ad951b6130bf67d21a","location":{"path":"lib/gitlab/data_builder/push.rb","lines":{"begin":56,"end":98}},"other_locations":[],"remediation_points":696000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `build` has 49 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"ac9809b4ea4dd090261cab4784070118","location":{"path":"lib/gitlab/data_builder/build.rb","lines":{"begin":6,"end":68}},"other_locations":[],"remediation_points":1176000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `absolute_image_urls` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b291bb28522abd9dde68b0387000c263","location":{"path":"lib/gitlab/hook_data/base_builder.rb","lines":{"begin":22,"end":35}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `safe_hook_attributes` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"682e99b5b83244042ccc251929255272","location":{"path":"lib/gitlab/hook_data/merge_request_builder.rb","lines":{"begin":4,"end":32}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `gitaly_client.rb` has 321 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"aa680293a25a35a2aacd0db231b38fc3","location":{"path":"lib/gitlab/gitaly_client.rb","lines":{"begin":1,"end":484}},"other_locations":[],"remediation_points":2222400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `call` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"96a0315d42972363e3be0faaf33fcff8","location":{"path":"lib/gitlab/gitaly_client.rb","lines":{"begin":124,"end":149}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `request_kwargs` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"62070bc24b2fd5133e0a7beab00d9b77","location":{"path":"lib/gitlab/gitaly_client.rb","lines":{"begin":197,"end":221}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `feature_enabled?` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"731633ec642f522eb73bf54d30cc752d","location":{"path":"lib/gitlab/gitaly_client.rb","lines":{"begin":239,"end":269}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `enforce_gitaly_request_limits` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a75016ab6541606469d82939c599b4ad","location":{"path":"lib/gitlab/gitaly_client.rb","lines":{"begin":317,"end":340}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `issues` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"625fb557175f1173f5275a5c774ad3d6","location":{"path":"lib/gitlab/reference_extractor.rb","lines":{"begin":34,"end":45}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `metrics` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"77acda463966e33d89aa2e8120528ca8","location":{"path":"lib/gitlab/health_checks/simple_abstract_check.rb","lines":{"begin":17,"end":25}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `profile` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fee59aefc8f7079890f207651b7981f0","location":{"path":"lib/gitlab/profiler.rb","lines":{"begin":38,"end":79}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `debug` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"fdc82615456346012b61b614b718e980","location":{"path":"lib/gitlab/profiler.rb","lines":{"begin":91,"end":109}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `protected_branch_push_checks` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"32eb78f0c97e724ad8a8d5553b542d3f","location":{"path":"lib/gitlab/checks/change_access.rb","lines":{"begin":89,"end":99}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `protected_tag_checks` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"06f719f8ef5751a719db79c5e8c24be7","location":{"path":"lib/gitlab/checks/change_access.rb","lines":{"begin":111,"end":120}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ChangeAccess` has 25 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"c155eb2e64ad1ed777bca59ce76dbaef","location":{"path":"lib/gitlab/checks/change_access.rb","lines":{"begin":3,"end":214}},"other_locations":[],"remediation_points":1700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8ee7f543cac7d3fb2d03c2cf82f45f09","location":{"path":"lib/gitlab/checks/commit_check.rb","lines":{"begin":16,"end":28}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `stop` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0578d528100ce788878962a15cbeec2a","location":{"path":"lib/gitlab/daemon.rb","lines":{"begin":39,"end":51}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `verification_status` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"278e4598e8040e0a02ba62435277a8b2","location":{"path":"lib/gitlab/gpg/commit.rb","lines":{"begin":100,"end":112}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `initialize` has 7 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"26ed72f706cbd880946abd65775661b1","location":{"path":"lib/gitlab/bitbucket_server_import/project_creator.rb","lines":{"begin":6,"end":6}},"other_locations":[],"remediation_points":525000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `importer.rb` has 275 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"144e11b64a9050685cd582324f4c5650","location":{"path":"lib/gitlab/bitbucket_server_import/importer.rb","lines":{"begin":3,"end":388}},"other_locations":[],"remediation_points":1560000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Importer` has 28 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"fe99b8de0e4e755d01efc8644f28aa32","location":{"path":"lib/gitlab/bitbucket_server_import/importer.rb","lines":{"begin":5,"end":386}},"other_locations":[],"remediation_points":2000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_hash` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"32c1c4d58157c12dafbd9c492c51a5aa","location":{"path":"lib/gitlab/graphql/variables.rb","lines":{"begin":17,"end":34}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `instrument` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d95b586a43aa6e99b3f767263ce65d16","location":{"path":"lib/gitlab/graphql/present/instrumentation.rb","lines":{"begin":5,"end":32}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `instrument` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7b1d8edac9e190461296777cc29e22e5","location":{"path":"lib/gitlab/graphql/authorize/instrumentation.rb","lines":{"begin":10,"end":31}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `instrument_methods` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d1438aadd557c25b108eea0106855664","location":{"path":"lib/gitlab/metrics/instrumentation.rb","lines":{"begin":70,"end":81}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `instrument_instance_methods` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"eb2114fa42977c795cf347169a0f542c","location":{"path":"lib/gitlab/metrics/instrumentation.rb","lines":{"begin":88,"end":99}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `instrument` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bca595f2e9128a833295cec69e8c1e4e","location":{"path":"lib/gitlab/metrics/instrumentation.rb","lines":{"begin":118,"end":167}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `instrument` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"46dbb1e9f69c06f7d078548fc6061570","location":{"path":"lib/gitlab/metrics/instrumentation.rb","lines":{"begin":118,"end":167}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `submit` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b4ef0ec3fde55c4188a9f170e0f50760","location":{"path":"lib/gitlab/metrics/transaction.rb","lines":{"begin":114,"end":129}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `submit_metrics` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9b54961b8f59db3e5122c4208ded0a04","location":{"path":"lib/gitlab/metrics/influx_db.rb","lines":{"begin":48,"end":62}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `pool` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"85d4413ec95715375e2c5ed3923bf252","location":{"path":"lib/gitlab/metrics/influx_db.rb","lines":{"begin":165,"end":181}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `measure` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"9ce1cb49fa0e90749c14924f01742eab","location":{"path":"lib/gitlab/metrics/influx_db.rb","lines":{"begin":95,"end":133}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `initialize` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"04b6cf203bf783b43e1ac1b54b888441","location":{"path":"lib/gitlab/fogbugz_import/project_creator.rb","lines":{"begin":6,"end":6}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `format_issue_comment_body` has 6 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"1ec61e94902238cc9befa5a1daf367e9","location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":279,"end":279}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_cases` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.","fingerprint":"deff1dce2bf92e8e8a73a7dad5c4c5c9","location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":102,"end":146}},"other_locations":[],"remediation_points":1250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issue_comments` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3399ad65a3497aa307eaeb32cb5e83e6","location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":158,"end":196}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `import_cases` has 34 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"cdbe17ce063af3997de1ea4bb7b62f8b","location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":102,"end":146}},"other_locations":[],"remediation_points":816000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `import_issue_comments` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a350dd17c12b659d965d2849ad05d077","location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":158,"end":196}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `git_access.rb` has 288 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"217b36994b7bc085e2426b68d5ae12da","location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":3,"end":372}},"other_locations":[],"remediation_points":1747200,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_authentication_abilities!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"12742436ece459400a3eaf9d0a1bb60c","location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":128,"end":139}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ensure_project_on_push!` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"96a9f1789e7e7f1f1ba2da1e54b194c6","location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":189,"end":213}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_push_access!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3ea1e3ce0a376bfea8bcf0212ff90809","location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":233,"end":251}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `GitAccess` has 41 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"8b604fd91125836b6b7febd9f9706b53","location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":4,"end":371}},"other_locations":[],"remediation_points":3300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_service_account` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ede2112edc62f1c1aaab207b4d2d3bb8","location":{"path":"lib/gitlab/kubernetes/helm/api.rb","lines":{"begin":49,"end":59}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `create_cluster_role_binding` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"35fbb979c3d0eb66f9ca187bb5295521","location":{"path":"lib/gitlab/kubernetes/helm/api.rb","lines":{"begin":61,"end":71}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `initialize` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"a6788548613abbede0f945c93f499e01","location":{"path":"lib/gitlab/bitbucket_import/project_creator.rb","lines":{"begin":6,"end":6}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issues` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"dc7e6d5a30b4b296140a3b3ef8f0e44a","location":{"path":"lib/gitlab/bitbucket_import/importer.rb","lines":{"begin":74,"end":106}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_issue_comments` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a48dbffa8fed1a096624520d3125343e","location":{"path":"lib/gitlab/bitbucket_import/importer.rb","lines":{"begin":109,"end":134}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `import_pull_requests` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5a484ad1bd84dce7a3bef35405340b71","location":{"path":"lib/gitlab/bitbucket_import/importer.rb","lines":{"begin":147,"end":183}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `import_pull_requests` has 31 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"bb107ec4ecd65c38b8c57821b432e1bd","location":{"path":"lib/gitlab/bitbucket_import/importer.rb","lines":{"begin":147,"end":183}},"other_locations":[],"remediation_points":744000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_info` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9ccb0c18a6f37f110aadd6045933f910","location":{"path":"lib/gitlab/auth/ldap/auth_hash.rb","lines":{"begin":19,"end":36}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `tls_options` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"f8cf4abbbf7c74ebb10433a1b19d6e25","location":{"path":"lib/gitlab/auth/ldap/config.rb","lines":{"begin":210,"end":227}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Config` has 38 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"d8bf80e499225a5522c5bf02c2b5de50","location":{"path":"lib/gitlab/auth/ldap/config.rb","lines":{"begin":5,"end":248}},"other_locations":[],"remediation_points":3000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `allowed?` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1b6717c2575d1b9634403637d926a53e","location":{"path":"lib/gitlab/auth/ldap/access.rb","lines":{"begin":17,"end":32}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `allowed?` has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1b6717c2575d1b9634403637d926a53e","location":{"path":"lib/gitlab/auth/ldap/access.rb","lines":{"begin":41,"end":63}},"other_locations":[],"remediation_points":1650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `ldap_search` has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5d595594b703b1d9783bd955a198807f","location":{"path":"lib/gitlab/auth/ldap/adapter.rb","lines":{"begin":52,"end":83}},"other_locations":[],"remediation_points":1150000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_pair` has a Cognitive Complexity of 43 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0b175175ba20f21bb15cdf8c88896cd1","location":{"path":"lib/gitlab/auth/ldap/dn.rb","lines":{"begin":58,"end":194}},"other_locations":[],"remediation_points":3950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize_array` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d6d33eb81193471d4408113ca113deac","location":{"path":"lib/gitlab/auth/ldap/dn.rb","lines":{"begin":267,"end":281}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `each_pair` has 131 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"648c4eb09b87d49a1d79f5d0a77de3ea","location":{"path":"lib/gitlab/auth/ldap/dn.rb","lines":{"begin":58,"end":194}},"other_locations":[],"remediation_points":3144000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `login` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c350e7d285ce68091161b324ed9ca293","location":{"path":"lib/gitlab/auth/ldap/authentication.rb","lines":{"begin":11,"end":20}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `save` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5b220e2f520a6fff2f90c05ba11999ba","location":{"path":"lib/gitlab/auth/o_auth/user.rb","lines":{"begin":37,"end":52}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_user` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7a4874f3ff061cb0b1aeef04800ada15","location":{"path":"lib/gitlab/auth/o_auth/user.rb","lines":{"begin":60,"end":69}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `update_profile` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"38ded984fa19d27580db26e0540ac53f","location":{"path":"lib/gitlab/auth/o_auth/user.rb","lines":{"begin":229,"end":253}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `User` has 32 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"e416592e77f689818995fceca5f571bc","location":{"path":"lib/gitlab/auth/o_auth/user.rb","lines":{"begin":9,"end":268}},"other_locations":[],"remediation_points":2400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_user` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ba2b8382483d9be5260822909fe26d56","location":{"path":"lib/gitlab/auth/saml/user.rb","lines":{"begin":16,"end":28}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cache_method_output` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"173a260b95048ce7cfc5164ebeeaa45c","location":{"path":"lib/gitlab/repository_cache_adapter.rb","lines":{"begin":44,"end":70}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `expire_method_caches` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6938667a593219bc8d59f8046973c533","location":{"path":"lib/gitlab/repository_cache_adapter.rb","lines":{"begin":73,"end":86}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `mark` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7f23977dd6af02c109c5ecaf6ec88e79","location":{"path":"lib/gitlab/string_range_marker.rb","lines":{"begin":16,"end":45}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `position_mapping` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"75e44855c1190acfa386bf060fe0c79c","location":{"path":"lib/gitlab/string_range_marker.rb","lines":{"begin":50,"end":88}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `log_response` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7bd641d0b563cc47dc64d5b378494dd5","location":{"path":"lib/gitlab/storage_check/cli.rb","lines":{"begin":49,"end":68}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_permission!` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"596d8f0ed603043a25830a78af0b7870","location":{"path":"lib/gitlab/email/handler/reply_processing.rb","lines":{"begin":38,"end":47}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6fac16f8fc80d183ffc78d03d2d0245d","location":{"path":"lib/gitlab/email/handler/unsubscribe_handler.rb","lines":{"begin":15,"end":23}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `select_body` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"74ea18f19435d9abee264cd1facce76a","location":{"path":"lib/gitlab/email/reply_parser.rb","lines":{"begin":36,"end":58}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fix_charset` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bbfbab207f44913ec99bdb0f738ef744","location":{"path":"lib/gitlab/email/reply_parser.rb","lines":{"begin":61,"end":71}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `target_url` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"587a65f54b3a9d4006c9fb8e97881295","location":{"path":"lib/gitlab/email/message/repository_push.rb","lines":{"begin":96,"end":108}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `subject` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"304068a60d47ba6b4d63d0770a3e66e0","location":{"path":"lib/gitlab/email/message/repository_push.rb","lines":{"begin":118,"end":137}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `run!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"06bf786acefc4467f3887ce0b97790b0","location":{"path":"lib/gitlab/cleanup/remote_uploads.rb","lines":{"begin":13,"end":32}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `steal` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bcfc4aae2401e33076da306af1be4a91","location":{"path":"lib/gitlab/background_migration.rb","lines":{"begin":17,"end":38}},"other_locations":[],"remediation_points":1250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate!` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7f4a6a0b5a98750c352c1646b1b3f685","location":{"path":"lib/gitlab/url_blocker.rb","lines":{"begin":8,"end":37}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `redis_store_options` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8e3b7658d5f2da0b6cfe80e375fba17a","location":{"path":"lib/gitlab/redis/wrapper.rb","lines":{"begin":94,"end":116}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `calculate` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"027f65d9b15a5a20ac32b7746317815a","location":{"path":"lib/gitlab/project_authorizations/with_nested_groups.rb","lines":{"begin":16,"end":57}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `allowed?` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5ffe0c3e3d42265eae2251a019292113","location":{"path":"lib/gitlab/user_access.rb","lines":{"begin":30,"end":38}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `can_push_to_branch?` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"303070bb63eb58bcb7a05b3b95932900","location":{"path":"lib/gitlab/user_access.rb","lines":{"begin":64,"end":75}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `sanitize` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ce964ef0b84100c7c6ad7cb863485dc1","location":{"path":"lib/gitlab/ssh_public_key.rb","lines":{"begin":24,"end":38}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8bb3319e6987280746e3bc73708c56f0","location":{"path":"lib/gitlab/bare_repository_import/importer.rb","lines":{"begin":6,"end":27}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `to_kubeconfig` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"b447110ec4376566b0f143ec7955f597","location":{"path":"lib/gitlab/kubernetes.rb","lines":{"begin":85,"end":115}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `extract_filters` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"52f2917ff84bcee853228888bc9d4f20","location":{"path":"lib/gitlab/search/query.rb","lines":{"begin":28,"end":48}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `encode!` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5023e6a2cc1fe373219230a4ada29baa","location":{"path":"lib/gitlab/encoding_helper.rb","lines":{"begin":16,"end":36}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `encode_utf8` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c7dee9a09179a88f06945225a2a221af","location":{"path":"lib/gitlab/encoding_helper.rb","lines":{"begin":51,"end":69}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `handle_exception_response` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"0c36580ef2976c77eabf04d27eda6e0b","location":{"path":"lib/gitlab/prometheus_client.rb","lines":{"begin":78,"end":87}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `generate_full_url` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6347a85ed559890640d3146272847334","location":{"path":"lib/gitlab/url_sanitizer.rb","lines":{"begin":71,"end":78}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `convert` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"427e98fa770dd0ce1ed98ef15ec75fd5","location":{"path":"lib/gitlab/ci/ansi2html.rb","lines":{"begin":136,"end":189}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `open_new_tag` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"3d7e5bd9e7a6c35c9d687fc490695bed","location":{"path":"lib/gitlab/ci/ansi2html.rb","lines":{"begin":232,"end":256}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_xterm_color_class` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4936b554b5287229c74930b44325b20c","location":{"path":"lib/gitlab/ci/ansi2html.rb","lines":{"begin":329,"end":341}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Converter` has 69 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"61a0cb2a3f0303ed57f185452426b79a","location":{"path":"lib/gitlab/ci/ansi2html.rb","lines":{"begin":31,"end":346}},"other_locations":[],"remediation_points":6100000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `convert` has 43 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"dd13e7297553d67e7801e8ccc8eed932","location":{"path":"lib/gitlab/ci/ansi2html.rb","lines":{"begin":136,"end":189}},"other_locations":[],"remediation_points":1032000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `matches_pattern?` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ebde1954a4f6fc95ac088dde003d1f7c","location":{"path":"lib/gitlab/ci/build/policy/refs.rb","lines":{"begin":27,"end":38}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `match_entries` has a Cognitive Complexity of 18 (exceeds 5 allowed). Consider refactoring.","fingerprint":"12277d192b4e56c2980eae35423fc226","location":{"path":"lib/gitlab/ci/build/artifacts/metadata.rb","lines":{"begin":54,"end":76}},"other_locations":[],"remediation_points":1450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read_version` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c8c5a0217b6a28198bd8cb92d0e82b00","location":{"path":"lib/gitlab/ci/build/artifacts/metadata.rb","lines":{"begin":78,"end":92}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Entry` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"a996c8f128cfc7543769dd21dd5de815","location":{"path":"lib/gitlab/ci/build/artifacts/metadata/entry.rb","lines":{"begin":15,"end":130}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `to_s` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6710c7eee920701d15361f52dbe4bd3d","location":{"path":"lib/gitlab/ci/build/artifacts/path.rb","lines":{"begin":26,"end":36}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `read` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"481c8d08e5e47d4a4d4be68d0d06fe4b","location":{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":69,"end":93}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `chunk_slice_from_offset` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"60dbbad2af42b5e9d17acf1180b8e0d6","location":{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":178,"end":189}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `ChunkedIO` has 26 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"3f6175d5d4d29675f68a7afb44b51fb3","location":{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":7,"end":236}},"other_locations":[],"remediation_points":1800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `extract_coverage` has a Cognitive Complexity of 19 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a126d9b81c791cb0bd1b8cd455422f3b","location":{"path":"lib/gitlab/ci/trace/stream.rb","lines":{"begin":79,"end":102}},"other_locations":[],"remediation_points":1550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `handle_line` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"6e13932e33f438288cd2d7a23cca7b04","location":{"path":"lib/gitlab/ci/trace/section_parser.rb","lines":{"begin":56,"end":56}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_next_marker` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7b78b80d610593251ebbeb9bb18f6246","location":{"path":"lib/gitlab/ci/trace/section_parser.rb","lines":{"begin":78,"end":93}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_string_or_regexp` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a99d0cd045678d388fd755c238f7757f","location":{"path":"lib/gitlab/ci/config/entry/legacy_validation_helpers.rb","lines":{"begin":43,"end":52}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `to_hash` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bc0685829f332ba16f511159006c4cf9","location":{"path":"lib/gitlab/ci/config/entry/job.rb","lines":{"begin":136,"end":155}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `variables_expressions_syntax` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"736e4fd1de9745ba1bb433fcb5443516","location":{"path":"lib/gitlab/ci/config/entry/policy.rb","lines":{"begin":41,"end":53}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `attributes` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"69c16e006586bdd7ac4cb17f7ede9848","location":{"path":"lib/gitlab/ci/config/entry/attributable.rb","lines":{"begin":9,"end":21}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `helpers` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2d39bb63c3e71381a6cfd8d51654bee4","location":{"path":"lib/gitlab/ci/config/entry/configurable.rb","lines":{"begin":63,"end":75}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `extend!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4fa7fe12ebb0fe9c7eed89e17ece5daf","location":{"path":"lib/gitlab/ci/config/extendable/entry.rb","lines":{"begin":48,"end":72}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `write` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4254fbcc9b1008e1fd6a644e17f14b44","location":{"path":"lib/gitlab/ci/trace.rb","lines":{"begin":83,"end":101}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `unsafe_archive!` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"b90c223da9c451bd90087645954fe5ee","location":{"path":"lib/gitlab/ci/trace.rb","lines":{"begin":125,"end":145}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Trace` has 26 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"d9e217fe03ddebc9f270b441d4194d76","location":{"path":"lib/gitlab/ci/trace.rb","lines":{"begin":3,"end":237}},"other_locations":[],"remediation_points":1800000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"56ff592ebb6677c3a386b683db2b6821","location":{"path":"lib/gitlab/ci/pipeline/chain/validate/config.rb","lines":{"begin":9,"end":21}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `tokenize` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"60a6e3ebf3ba798ac11eca1daba671b8","location":{"path":"lib/gitlab/ci/pipeline/expression/lexer.rb","lines":{"begin":36,"end":56}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `tree` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"494fb3f15182110d4c2051f9a07b9ddc","location":{"path":"lib/gitlab/ci/pipeline/expression/parser.rb","lines":{"begin":16,"end":31}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `all_cases` has a Cognitive Complexity of 13 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4f41f387d6f9c748719d97b454bbe92f","location":{"path":"lib/gitlab/ci/parsers/junit.rb","lines":{"begin":22,"end":37}},"other_locations":[],"remediation_points":950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_job_dependencies!` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"97a1046ed696c51fb2ce1bf34f0b7293","location":{"path":"lib/gitlab/ci/yaml_processor.rb","lines":{"begin":139,"end":151}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_on_stop_job!` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"06fcc3fed9dc213e5669186830670f59","location":{"path":"lib/gitlab/ci/yaml_processor.rb","lines":{"begin":161,"end":180}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"5f09e73f4a1aa8458ce984db4f5fce37","location":{"path":"lib/gitlab/downtime_check.rb","lines":{"begin":16,"end":40}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse_entry` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4f46e2835f32393dfdf07c66c0f704d0","location":{"path":"lib/gitlab/route_map.rb","lines":{"begin":30,"end":52}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `execute` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e2058f84cad6a346389ce944d7c1c76e","location":{"path":"lib/gitlab/upgrader.rb","lines":{"begin":3,"end":25}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fuzzy_arel_match` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"44164fac144fbfeea45df1508dfe02db","location":{"path":"lib/gitlab/sql/pattern.rb","lines":{"begin":32,"end":51}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `lazy_page_iterator` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"6ef599b3dc4f1b639d3197c028e40b71","location":{"path":"lib/gitlab/gitlab_import/client.rb","lines":{"begin":59,"end":76}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `merge_hash_tree` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"e6ac0be8cece82ccc2e82ff8dd59e20e","location":{"path":"lib/gitlab/utils/merge_hash.rb","lines":{"begin":58,"end":97}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `listing` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7b99984bc28e1e4cbc4903a72d7ac663","location":{"path":"lib/gitlab/hashed_storage/rake_helper.rb","lines":{"begin":72,"end":87}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `ee_compat_check.rb` has 312 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"2103307f841e293ce32cd4161da95965","location":{"path":"lib/gitlab/ee_compat_check.rb","lines":{"begin":2,"end":440}},"other_locations":[],"remediation_points":2092800,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `generate_patch` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d35820a437b86e532f50e32d127b5ab0","location":{"path":"lib/gitlab/ee_compat_check.rb","lines":{"begin":115,"end":130}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `check_patch` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2b66236ad0f63db5144a0820b94228b9","location":{"path":"lib/gitlab/ee_compat_check.rb","lines":{"begin":178,"end":211}},"other_locations":[],"remediation_points":1250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `EeCompatCheck` has 33 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"36de6fe216cdb6efd396cb08cb43cee5","location":{"path":"lib/gitlab/ee_compat_check.rb","lines":{"begin":4,"end":439}},"other_locations":[],"remediation_points":2500000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `ce_branch_doesnt_apply_cleanly_and_no_ee_branch_msg` has 45 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e819c9434d1b44e764eb37a75eb1f24c","location":{"path":"lib/gitlab/ee_compat_check.rb","lines":{"begin":336,"end":412}},"other_locations":[],"remediation_points":1080000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `scrub` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7d4324ffa269ec245847b9dd62388202","location":{"path":"lib/gitlab/sanitizers/svg.rb","lines":{"begin":12,"end":33}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `<=>` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"07c5403aa1fb1c5999cd6138fc8be4c8","location":{"path":"lib/gitlab/version_info.rb","lines":{"begin":21,"end":40}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform_substitutions` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d72ee6aae32c9c1901f52bf269676a8b","location":{"path":"lib/gitlab/quick_actions/extractor.rb","lines":{"begin":115,"end":134}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `commands_regex` has 30 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"1bf5c2a5cbd5a2d9489e4fefc15a284e","location":{"path":"lib/gitlab/quick_actions/extractor.rb","lines":{"begin":63,"end":113}},"other_locations":[],"remediation_points":720000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `to_h` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a75d7faca54c18a6777848a3850d38cc","location":{"path":"lib/gitlab/quick_actions/command_definition.rb","lines":{"begin":49,"end":66}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `wait` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bf93e6de620ccd0324ee0deae40e9661","location":{"path":"lib/gitlab/job_waiter.rb","lines":{"begin":44,"end":72}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `validate_number_of_plurals` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"ca29b997f9707951ab1c16832eac75dd","location":{"path":"lib/gitlab/i18n/po_linter.rb","lines":{"begin":86,"end":94}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `fill_in_variables` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7baf89f0f9dd60c092411c5d3c85f5c4","location":{"path":"lib/gitlab/i18n/po_linter.rb","lines":{"begin":222,"end":236}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `PoLinter` has 22 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"befcb8a3c9cdc94613a938be76c2abf4","location":{"path":"lib/gitlab/i18n/po_linter.rb","lines":{"begin":3,"end":276}},"other_locations":[],"remediation_points":1400000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `missing_members?` has 26 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"a92dd0b78adf6408e1bb1362dfd52ac0","location":{"path":"lib/gitlab/background_migration/create_fork_network_memberships_range.rb","lines":{"begin":48,"end":78}},"other_locations":[],"remediation_points":624000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `migrate_stage_index_sql` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"17594a98741c619d81f5982d56852229","location":{"path":"lib/gitlab/background_migration/migrate_stage_index.rb","lines":{"begin":15,"end":44}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_restricted_features_todos` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2f6311086002a50283e8edb15d2db097","location":{"path":"lib/gitlab/background_migration/remove_restricted_todos.rb","lines":{"begin":80,"end":94}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `perform` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"3b81cbbe6df91a033cc8895bc63aa0e7","location":{"path":"lib/gitlab/background_migration/copy_column.rb","lines":{"begin":17,"end":17}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_pair` has a Cognitive Complexity of 43 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d8eeaa32395230adf97a240f222c4203","location":{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":53,"end":189}},"other_locations":[],"remediation_points":3950000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize_array` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7098a1e02746bd3280879e695e913e37","location":{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":262,"end":276}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `perform` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bb5327ee9231b73596539ad7b2c167fa","location":{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":300,"end":314}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `each_pair` has 131 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"d03740b18e02c4d6c12a846688367eb2","location":{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":53,"end":189}},"other_locations":[],"remediation_points":3144000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `single_diff_rows` has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c44e90db62947f73461b513d8b2bf71","location":{"path":"lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb","lines":{"begin":86,"end":129}},"other_locations":[],"remediation_points":750000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `single_diff_rows` has 32 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"bc4293178ed4b9812cc3752d52c4c2ae","location":{"path":"lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb","lines":{"begin":86,"end":129}},"other_locations":[],"remediation_points":768000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `median` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8131f9850b467befa49f83c8893e074e","location":{"path":"lib/gitlab/cycle_analytics/base_stage.rb","lines":{"begin":23,"end":46}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `first_time_reference_commit` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"57863573b761b600f6f37177c4bdcc2c","location":{"path":"lib/gitlab/cycle_analytics/plan_event_fetcher.rb","lines":{"begin":40,"end":52}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `groups` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"bb94f91ea8ea9bfebe88077bde7c9c70","location":{"path":"lib/gitlab/blame.rb","lines":{"begin":10,"end":34}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `issuable_meta_data` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"a722790729116e77942fe04c5ea5c2fe","location":{"path":"lib/gitlab/issuable_metadata.rb","lines":{"begin":3,"end":42}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `issuable_meta_data` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"654ad0544dd20bd2a0fa2b2222724814","location":{"path":"lib/gitlab/issuable_metadata.rb","lines":{"begin":3,"end":42}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find_id_by_path` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"249edd9d3a49a4634c75d7f66eddf0d3","location":{"path":"lib/gitlab/git/tree.rb","lines":{"begin":36,"end":52}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `get_submodules_by_name` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1779cdd505003a594a0ec1e401b49750","location":{"path":"lib/gitlab/git/gitmodules_parser.rb","lines":{"begin":45,"end":66}},"other_locations":[],"remediation_points":1250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `merge` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"14d8d23268624da10eee3aa315d71171","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":552,"end":552}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `find_commits_by_message` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"03db09f73721e8dc853a0e8d5c5b586a","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":948,"end":948}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `repository.rb` has 724 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"4fd0011d1b240dc0bd3776dada53d992","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":1,"end":1045}},"other_locations":[],"remediation_points":8025600,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `refs_hash` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"1b3b8f358aa6754b1127fcaf1fc63eab","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":461,"end":473}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_count_commits_options` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d7dfc3dabbbd3403a850821e31ef9869","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":987,"end":1005}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Repository` has 117 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"7e5d4a5ee3414c57e7d1ae875324fab4","location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":7,"end":1043}},"other_locations":[],"remediation_points":10900000,"severity":"major","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `resolve_lines` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"2a9fd4db8c8cf162f378aa963d6765b0","location":{"path":"lib/gitlab/git/conflict/file.rb","lines":{"begin":64,"end":86}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"244c77bd66325eb47245517103368219","location":{"path":"lib/gitlab/git/conflict/parser.rb","lines":{"begin":15,"end":70}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `parse` has 44 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"bf9628db17f21b3c6afe90328a37f6d0","location":{"path":"lib/gitlab/git/conflict/parser.rb","lines":{"begin":15,"end":70}},"other_locations":[],"remediation_points":1056000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c678916b00a357376bbd89e7d450a28","location":{"path":"lib/gitlab/git/blob.rb","lines":{"begin":24,"end":50}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse_attributes` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"4edbf1e31d321135c7006513a4035f15","location":{"path":"lib/gitlab/git/attributes_parser.rb","lines":{"begin":41,"end":77}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `parse_data` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"19a8edffd98f8988b199c80f6919a68a","location":{"path":"lib/gitlab/git/attributes_parser.rb","lines":{"begin":91,"end":108}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `update_page` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"cc6e53b3d35661118499e22b31c33048","location":{"path":"lib/gitlab/git/wiki.rb","lines":{"begin":41,"end":41}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `gitaly_update_page` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"29ae202c7d73dff34ed176c4c489e03c","location":{"path":"lib/gitlab/git/wiki.rb","lines":{"begin":139,"end":139}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Wiki` has 25 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"16108ddc899f6bed5535bed2d4dbd403","location":{"path":"lib/gitlab/git/wiki.rb","lines":{"begin":3,"end":166}},"other_locations":[],"remediation_points":1700000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `initialize` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"992ce430fa1cfa75fffb04b791835530","location":{"path":"lib/gitlab/git/compare.rb","lines":{"begin":8,"end":22}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"file_lines","content":{"body":""},"description":"File `commit.rb` has 261 lines of code (exceeds 250 allowed). Consider refactoring.","fingerprint":"b0e8a3e8bec1d1e4d61a4ca6961eee37","location":{"path":"lib/gitlab/git/commit.rb","lines":{"begin":2,"end":421}},"other_locations":[],"remediation_points":1358400,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `find` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d2501d4f37da4c3f3bfc13d8ddefb8b1","location":{"path":"lib/gitlab/git/commit.rb","lines":{"begin":52,"end":72}},"other_locations":[],"remediation_points":650000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Commit` has 48 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"5c05f17b105a544fbb7b1e653e4e9622","location":{"path":"lib/gitlab/git/commit.rb","lines":{"begin":4,"end":419}},"other_locations":[],"remediation_points":4000000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `each_serialized_patch` has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.","fingerprint":"489c6b7588d70b32aa203aa6c41632df","location":{"path":"lib/gitlab/git/diff_collection.rb","lines":{"begin":120,"end":152}},"other_locations":[],"remediation_points":850000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"argument_count","content":{"body":""},"description":"Method `between` has 5 arguments (exceeds 4 allowed). Consider refactoring.","fingerprint":"4c22ec0e0d894fff0c7dd7383e7e90f2","location":{"path":"lib/gitlab/git/diff.rb","lines":{"begin":31,"end":31}},"other_locations":[],"remediation_points":375000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `process_raw_blame` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"c5cb9f5c58bb1d9925a29d6754967c20","location":{"path":"lib/gitlab/git/blame.rb","lines":{"begin":30,"end":56}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `in_lock` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"68b34982cd05d58d79738b15c96f20f7","location":{"path":"lib/gitlab/exclusive_lease_helpers.rb","lines":{"begin":12,"end":27}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `run_check` has a Cognitive Complexity of 18 (exceeds 5 allowed). Consider refactoring.","fingerprint":"d86f72edc80623f2c31df045a73c54a3","location":{"path":"lib/system_check/simple_executor.rb","lines":{"begin":45,"end":82}},"other_locations":[],"remediation_points":1450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `run_check` has 27 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"32ee25468fc9ba9255e373bf8565a409","location":{"path":"lib/system_check/simple_executor.rb","lines":{"begin":45,"end":82}},"other_locations":[],"remediation_points":648000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `dump` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"90c4b195bc0f9e6e440c936a49f66db4","location":{"path":"lib/backup/database.rb","lines":{"begin":14,"end":48}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `dump` has 28 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"e224fd061ebe87897322d771a18ed4f9","location":{"path":"lib/backup/database.rb","lines":{"begin":14,"end":48}},"other_locations":[],"remediation_points":672000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `dump` has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.","fingerprint":"7e1d28a077c128dd08f453c105fdd9df","location":{"path":"lib/backup/repository.rb","lines":{"begin":11,"end":39}},"other_locations":[],"remediation_points":550000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `restore` has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.","fingerprint":"8c618e2d28195eb4c364400e1b377f3f","location":{"path":"lib/backup/repository.rb","lines":{"begin":74,"end":119}},"other_locations":[],"remediation_points":1050000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `restore` has 38 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"dce1e21850a52796bdc54dd0352fef39","location":{"path":"lib/backup/repository.rb","lines":{"begin":74,"end":119}},"other_locations":[],"remediation_points":912000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `cleanup` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.","fingerprint":"df1565e2084a026c19a57df20f8c1dab","location":{"path":"lib/backup/manager.rb","lines":{"begin":59,"end":72}},"other_locations":[],"remediation_points":350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `remove_old` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"25cd2cf6fbb64afd366f3be6ab9d89fd","location":{"path":"lib/backup/manager.rb","lines":{"begin":74,"end":107}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `unpack` has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.","fingerprint":"67d7ec9e6873944629ee60ae0c82b98f","location":{"path":"lib/backup/manager.rb","lines":{"begin":110,"end":161}},"other_locations":[],"remediation_points":1350000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_count","content":{"body":""},"description":"Class `Manager` has 21 methods (exceeds 20 allowed). Consider refactoring.","fingerprint":"c011f3bde58a57c5c1b310f99fdde1e8","location":{"path":"lib/backup/manager.rb","lines":{"begin":2,"end":247}},"other_locations":[],"remediation_points":1300000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_lines","content":{"body":""},"description":"Method `unpack` has 41 lines of code (exceeds 25 allowed). Consider refactoring.","fingerprint":"0f4697ee5870ab55f0f0482a90f0aafe","location":{"path":"lib/backup/manager.rb","lines":{"begin":110,"end":161}},"other_locations":[],"remediation_points":984000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `decoded` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"9d399e9cd55ad1c8999c18172266e16d","location":{"path":"lib/omni_auth/strategies/jwt.rb","lines":{"begin":37,"end":51}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `class_for_class` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.","fingerprint":"44146c776b1d2705ab1e91d14f931ca6","location":{"path":"lib/declarative_policy.rb","lines":{"begin":62,"end":74}},"other_locations":[],"remediation_points":250000,"severity":"minor","type":"issue","engine_name":"structure"},{"categories":["Complexity"],"check_name":"method_complexity","content":{"body":"# Cognitive Complexity\nCognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.\n\n### A method's cognitive complexity is based on a few simple rules:\n* Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one\n* Code is considered more complex for each \"break in the linear flow of the code\"\n* Code is considered more complex when \"flow breaking structures are nested\"\n\n### Further reading\n* [Cognitive Complexity docs](https://docs.codeclimate.com/v1.0/docs/cognitive-complexity)\n* [Cognitive Complexity: A new way of measuring understandability](https://www.sonarsource.com/docs/CognitiveComplexity.pdf)\n"},"description":"Method `compute_class_for_class` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.","fingerprint":"504ef7ee6e8fa9917bb219a3ce5a6531","location":{"path":"lib/declarative_policy.rb","lines":{"begin":76,"end":93}},"other_locations":[],"remediation_points":450000,"severity":"minor","type":"issue","engine_name":"structure"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/auth/ldap/dn.rb","lines":{"begin":23,"end":298}},"remediation_points":14090000,"other_locations":[{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":18,"end":293}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 722**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1672855f6e5f2e5e61f5f47620f50c44","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb","lines":{"begin":18,"end":293}},"remediation_points":14090000,"other_locations":[{"path":"lib/gitlab/auth/ldap/dn.rb","lines":{"begin":23,"end":298}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 722**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"08b04488cb6c1d433518d22f9fd7ac22","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 6 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":96,"end":96}},"remediation_points":1270000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":8,"end":20}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":38,"end":38}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":45,"end":45}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":65,"end":65}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":73,"end":73}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3612d232382cae9828e7733da5a69ff","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":47,"end":47}},"remediation_points":1170000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":61,"end":61}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":64,"end":64}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":74,"end":74}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":81,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9d3f720528b273e90fa0c600a4007367","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":61,"end":61}},"remediation_points":1170000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":47,"end":47}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":64,"end":64}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":74,"end":74}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":81,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9d3f720528b273e90fa0c600a4007367","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":64,"end":64}},"remediation_points":1170000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":47,"end":47}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":61,"end":61}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":74,"end":74}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":81,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9d3f720528b273e90fa0c600a4007367","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":74,"end":74}},"remediation_points":1170000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":47,"end":47}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":61,"end":61}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":64,"end":64}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":81,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9d3f720528b273e90fa0c600a4007367","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":81,"end":81}},"remediation_points":1170000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":47,"end":47}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":61,"end":61}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":64,"end":64}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":74,"end":74}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9d3f720528b273e90fa0c600a4007367","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":87,"end":87}},"remediation_points":1290000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":88,"end":88}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 82**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3bfe7daee55e5a8099dd7a73db3a63a6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":88,"end":88}},"remediation_points":1290000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":87,"end":87}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 82**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3bfe7daee55e5a8099dd7a73db3a63a6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":41,"end":41}},"remediation_points":1130000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":42,"end":42}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":58,"end":58}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":59,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8f8e7cbf1a02ae8fa5ae5397530797b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":42,"end":42}},"remediation_points":1130000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":41,"end":41}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":58,"end":58}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":59,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8f8e7cbf1a02ae8fa5ae5397530797b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":58,"end":58}},"remediation_points":1130000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":41,"end":41}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":42,"end":42}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":59,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8f8e7cbf1a02ae8fa5ae5397530797b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":59,"end":59}},"remediation_points":1130000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":41,"end":41}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":42,"end":42}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":58,"end":58}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8f8e7cbf1a02ae8fa5ae5397530797b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":30,"end":30}},"remediation_points":1610000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":31,"end":31}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":95,"end":95}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 98**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"22a2073b162b635650c424f759625ae1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":31,"end":31}},"remediation_points":1610000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":30,"end":30}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":95,"end":95}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 98**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"22a2073b162b635650c424f759625ae1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":95,"end":95}},"remediation_points":1610000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":30,"end":30}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":31,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 98**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"22a2073b162b635650c424f759625ae1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":65,"end":78}},"remediation_points":930000,"other_locations":[{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":107,"end":120}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4b2ec9ed4e92599e6bbba9a4a97ebeb0","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":107,"end":120}},"remediation_points":930000,"other_locations":[{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":65,"end":78}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0c7ce0e1a2c6b9abe1956a85bf8e6e52","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":40,"end":40}},"remediation_points":1350000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":72,"end":72}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":78,"end":78}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 85**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2f55aade2bccc69344fa093ec61a30db","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":72,"end":72}},"remediation_points":1350000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":40,"end":40}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":78,"end":78}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 85**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2f55aade2bccc69344fa093ec61a30db","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":78,"end":78}},"remediation_points":1350000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":40,"end":40}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":72,"end":72}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 85**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2f55aade2bccc69344fa093ec61a30db","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":75,"end":75}},"remediation_points":1230000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":79,"end":79}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":97,"end":97}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 79**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9473b40c2cb0f7afc9308169cf2dced6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":79,"end":79}},"remediation_points":1230000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":75,"end":75}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":97,"end":97}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 79**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9473b40c2cb0f7afc9308169cf2dced6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":97,"end":97}},"remediation_points":1230000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":75,"end":75}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":79,"end":79}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 79**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9473b40c2cb0f7afc9308169cf2dced6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":35,"end":35}},"remediation_points":1090000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":43,"end":43}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":63,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6149a95705035fa65fb27a491aa16e7d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":43,"end":43}},"remediation_points":1090000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":35,"end":35}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":63,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6149a95705035fa65fb27a491aa16e7d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":63,"end":63}},"remediation_points":1090000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":35,"end":35}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":43,"end":43}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6149a95705035fa65fb27a491aa16e7d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":49,"end":49}},"remediation_points":1070000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":56,"end":56}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":83,"end":83}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"123ff3d56c152101a1c911f1a95326be","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":56,"end":56}},"remediation_points":1070000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":49,"end":49}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":83,"end":83}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"123ff3d56c152101a1c911f1a95326be","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":83,"end":83}},"remediation_points":1070000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":49,"end":49}},{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":56,"end":56}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"123ff3d56c152101a1c911f1a95326be","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":198,"end":227}},"remediation_points":570000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":270,"end":299}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"672d4e588f6155fa74bf7ca34fedabb2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":270,"end":299}},"remediation_points":570000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":198,"end":227}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"672d4e588f6155fa74bf7ca34fedabb2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":101,"end":101}},"remediation_points":1490000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":103,"end":103}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 92**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"633c7fa21c24339ba725403293231a75","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":103,"end":103}},"remediation_points":1490000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":101,"end":101}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 92**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"633c7fa21c24339ba725403293231a75","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":90,"end":90}},"remediation_points":1390000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":102,"end":102}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 87**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"925e4b3663b9cd9937ee7db7f882dfbc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":102,"end":102}},"remediation_points":1390000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":90,"end":90}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 87**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"925e4b3663b9cd9937ee7db7f882dfbc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":55,"end":55}},"remediation_points":1250000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":89,"end":89}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b931145ce6d6777daae248a043f04d6d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":89,"end":89}},"remediation_points":1250000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":55,"end":55}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b931145ce6d6777daae248a043f04d6d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/bitbucket/collection.rb","lines":{"begin":2,"end":18}},"remediation_points":410000,"other_locations":[{"path":"lib/bitbucket_server/collection.rb","lines":{"begin":4,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 38**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9daf3a24f43b64dd40b3841c26c29df5","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/bitbucket_server/collection.rb","lines":{"begin":4,"end":20}},"remediation_points":410000,"other_locations":[{"path":"lib/bitbucket/collection.rb","lines":{"begin":2,"end":18}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 38**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ebc02a5c26ee206388b48b53d93e24a1","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":40,"end":89}},"remediation_points":1150000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":91,"end":140}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6778d05c8ddc9f6653765ac7ae623751","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":91,"end":140}},"remediation_points":1150000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":40,"end":89}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6778d05c8ddc9f6653765ac7ae623751","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git/tag.rb","lines":{"begin":14,"end":24}},"remediation_points":650000,"other_locations":[{"path":"lib/gitlab/git/commit.rb","lines":{"begin":159,"end":169}},{"path":"lib/gitlab/git/commit.rb","lines":{"begin":179,"end":189}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d27c41bdaed8bbbc1c91788baad098b2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git/commit.rb","lines":{"begin":159,"end":169}},"remediation_points":650000,"other_locations":[{"path":"lib/gitlab/git/commit.rb","lines":{"begin":179,"end":189}},{"path":"lib/gitlab/git/tag.rb","lines":{"begin":14,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e87685897f699d56f0c9bba98c92c792","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git/commit.rb","lines":{"begin":179,"end":189}},"remediation_points":650000,"other_locations":[{"path":"lib/gitlab/git/commit.rb","lines":{"begin":159,"end":169}},{"path":"lib/gitlab/git/tag.rb","lines":{"begin":14,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e87685897f699d56f0c9bba98c92c792","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":46,"end":46}},"remediation_points":1150000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":80,"end":80}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"482f209ad35861d8a59e5e60275568d2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":80,"end":80}},"remediation_points":1150000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":46,"end":46}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"482f209ad35861d8a59e5e60275568d2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/spec/git/location_spec.rb","lines":{"begin":3,"end":24}},"remediation_points":1130000,"other_locations":[{"path":"qa/spec/git/location_spec.rb","lines":{"begin":29,"end":50}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"dd9851dda741bf04f8f991425e6b4fa8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/spec/git/location_spec.rb","lines":{"begin":29,"end":50}},"remediation_points":1130000,"other_locations":[{"path":"qa/spec/git/location_spec.rb","lines":{"begin":3,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"dd9851dda741bf04f8f991425e6b4fa8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":54,"end":54}},"remediation_points":1110000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":66,"end":66}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"62cf424fda0f778b3dcc5914fc2096b6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":66,"end":66}},"remediation_points":1110000,"other_locations":[{"path":"lib/gitlab/sanitizers/svg/whitelist.rb","lines":{"begin":54,"end":54}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"62cf424fda0f778b3dcc5914fc2096b6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/system_hooks.rb","lines":{"begin":24,"end":31}},"remediation_points":550000,"other_locations":[{"path":"lib/api/broadcast_messages.rb","lines":{"begin":66,"end":73}},{"path":"lib/api/pipeline_schedules.rb","lines":{"begin":66,"end":73}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"dc8d377ac78b1e411b24adff2bb25ac8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/broadcast_messages.rb","lines":{"begin":66,"end":73}},"remediation_points":550000,"other_locations":[{"path":"lib/api/pipeline_schedules.rb","lines":{"begin":66,"end":73}},{"path":"lib/api/system_hooks.rb","lines":{"begin":24,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d6ed9adeccc2432c442bb7e3b2de77ca","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/pipeline_schedules.rb","lines":{"begin":66,"end":73}},"remediation_points":550000,"other_locations":[{"path":"lib/api/broadcast_messages.rb","lines":{"begin":66,"end":73}},{"path":"lib/api/system_hooks.rb","lines":{"begin":24,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e53239021b533bc772fd7c38fd9fbf32","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/http_io.rb","lines":{"begin":76,"end":99}},"remediation_points":930000,"other_locations":[{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":69,"end":92}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"06b83fddd1854f4cbb5ee692f2b3c479","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":69,"end":92}},"remediation_points":930000,"other_locations":[{"path":"lib/gitlab/http_io.rb","lines":{"begin":76,"end":99}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fa155c048bfa229583a4b14cba8ef368","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/projects/commits_controller.rb","lines":{"begin":38,"end":49}},"remediation_points":270000,"other_locations":[{"path":"app/controllers/projects/compare_controller.rb","lines":{"begin":47,"end":58}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"25a210eb00ee75fb3a27aef364105444","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/projects/compare_controller.rb","lines":{"begin":47,"end":58}},"remediation_points":270000,"other_locations":[{"path":"app/controllers/projects/commits_controller.rb","lines":{"begin":38,"end":49}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3331c85dad0745b1770318b847052656","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":87,"end":91}},"remediation_points":270000,"other_locations":[{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":129,"end":133}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a485030c77dac9d4720e17783248f6f2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":129,"end":133}},"remediation_points":270000,"other_locations":[{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":87,"end":91}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"70c3aa57163e28d9e2b8cf58b891e37a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":153,"end":161}},"remediation_points":230000,"other_locations":[{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":209,"end":217}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c29d81ebf7e5c4008896a514ac05cd90","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":209,"end":217}},"remediation_points":230000,"other_locations":[{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":153,"end":161}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"562f28dc8f9527c3acb9451bb9905421","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"rubocop/cop/code_reuse/presenter.rb","lines":{"begin":5,"end":36}},"remediation_points":770000,"other_locations":[{"path":"rubocop/cop/code_reuse/serializer.rb","lines":{"begin":5,"end":36}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ee8707c802bad394fc157d1bd785ea38","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"rubocop/cop/code_reuse/serializer.rb","lines":{"begin":5,"end":36}},"remediation_points":770000,"other_locations":[{"path":"rubocop/cop/code_reuse/presenter.rb","lines":{"begin":5,"end":36}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"999d054331f9bf60e9fac34f362dfa33","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":363,"end":376}},"remediation_points":730000,"other_locations":[{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":217,"end":230}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6d5fdcb9f4e92bdc8de77ce0d327e38d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":217,"end":230}},"remediation_points":730000,"other_locations":[{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":363,"end":376}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b9094b2f402bdf758fbd32cced243c48","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":143,"end":151}},"remediation_points":170000,"other_locations":[{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":199,"end":207}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9cdba14c6ea64993cb19a2d65e8cf92c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/kubernetes_service.rb","lines":{"begin":199,"end":207}},"remediation_points":170000,"other_locations":[{"path":"app/models/clusters/platforms/kubernetes.rb","lines":{"begin":143,"end":151}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a53ce766f9ff3869e29a216c2dd49425","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/users_controller.rb","lines":{"begin":37,"end":46}},"remediation_points":150000,"other_locations":[{"path":"app/controllers/users_controller.rb","lines":{"begin":50,"end":59}},{"path":"app/controllers/users_controller.rb","lines":{"begin":63,"end":72}},{"path":"app/controllers/users_controller.rb","lines":{"begin":76,"end":85}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7de6970da5143bb219d1d73c65245a18","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/users_controller.rb","lines":{"begin":50,"end":59}},"remediation_points":150000,"other_locations":[{"path":"app/controllers/users_controller.rb","lines":{"begin":37,"end":46}},{"path":"app/controllers/users_controller.rb","lines":{"begin":63,"end":72}},{"path":"app/controllers/users_controller.rb","lines":{"begin":76,"end":85}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7de6970da5143bb219d1d73c65245a18","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/users_controller.rb","lines":{"begin":63,"end":72}},"remediation_points":150000,"other_locations":[{"path":"app/controllers/users_controller.rb","lines":{"begin":37,"end":46}},{"path":"app/controllers/users_controller.rb","lines":{"begin":50,"end":59}},{"path":"app/controllers/users_controller.rb","lines":{"begin":76,"end":85}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7de6970da5143bb219d1d73c65245a18","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/users_controller.rb","lines":{"begin":76,"end":85}},"remediation_points":150000,"other_locations":[{"path":"app/controllers/users_controller.rb","lines":{"begin":37,"end":46}},{"path":"app/controllers/users_controller.rb","lines":{"begin":50,"end":59}},{"path":"app/controllers/users_controller.rb","lines":{"begin":63,"end":72}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7de6970da5143bb219d1d73c65245a18","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/serializers/note_entity.rb","lines":{"begin":67,"end":68}},"remediation_points":150000,"other_locations":[{"path":"app/serializers/project_note_entity.rb","lines":{"begin":20,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3177b0cd54cd809575f1d61e0a65ac25","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/serializers/project_note_entity.rb","lines":{"begin":20,"end":21}},"remediation_points":150000,"other_locations":[{"path":"app/serializers/note_entity.rb","lines":{"begin":67,"end":68}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bc28db1513fbf8f22f0e63c12ccb87bb","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/project_hooks.rb","lines":{"begin":66,"end":69}},"remediation_points":150000,"other_locations":[{"path":"lib/api/project_hooks.rb","lines":{"begin":88,"end":91}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cd274943b0a85d56266ca30e0dc9e6ce","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/project_hooks.rb","lines":{"begin":88,"end":91}},"remediation_points":150000,"other_locations":[{"path":"lib/api/project_hooks.rb","lines":{"begin":66,"end":69}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cd274943b0a85d56266ca30e0dc9e6ce","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/settings.rb","lines":{"begin":76,"end":83}},"remediation_points":650000,"other_locations":[{"path":"lib/api/runner.rb","lines":{"begin":86,"end":93}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ad9527e40decd629ae978623c4e6dbb3","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/runner.rb","lines":{"begin":86,"end":93}},"remediation_points":650000,"other_locations":[{"path":"lib/api/settings.rb","lines":{"begin":76,"end":83}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5a97fc139bd16e6c2c1ebb387c258035","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/commits.rb","lines":{"begin":28,"end":36}},"remediation_points":590000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":182,"end":190}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4a0f4dd71fe015ff3e29d7ce0c5f5aa0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":182,"end":190}},"remediation_points":590000,"other_locations":[{"path":"lib/api/commits.rb","lines":{"begin":28,"end":36}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"656c922dc9f4dab2a9d07fc10e49f190","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/health_checks/redis/queues_check.rb","lines":{"begin":2,"end":25}},"remediation_points":270000,"other_locations":[{"path":"lib/gitlab/health_checks/redis/cache_check.rb","lines":{"begin":2,"end":25}},{"path":"lib/gitlab/health_checks/redis/shared_state_check.rb","lines":{"begin":2,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a52f4db116344fb82ae762dfb265af18","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/health_checks/redis/cache_check.rb","lines":{"begin":2,"end":25}},"remediation_points":270000,"other_locations":[{"path":"lib/gitlab/health_checks/redis/queues_check.rb","lines":{"begin":2,"end":25}},{"path":"lib/gitlab/health_checks/redis/shared_state_check.rb","lines":{"begin":2,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"31c92fe357e3684090c3440aef2d0b29","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/health_checks/redis/shared_state_check.rb","lines":{"begin":2,"end":25}},"remediation_points":270000,"other_locations":[{"path":"lib/gitlab/health_checks/redis/cache_check.rb","lines":{"begin":2,"end":25}},{"path":"lib/gitlab/health_checks/redis/queues_check.rb","lines":{"begin":2,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fed5fac4efc814d8bd6d479976af387a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":199,"end":206}},"remediation_points":250000,"other_locations":[{"path":"app/helpers/milestones_helper.rb","lines":{"begin":209,"end":216}},{"path":"app/helpers/milestones_helper.rb","lines":{"begin":219,"end":226}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9bdbae2675861886dd810a67f252ae76","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":209,"end":216}},"remediation_points":250000,"other_locations":[{"path":"app/helpers/milestones_helper.rb","lines":{"begin":199,"end":206}},{"path":"app/helpers/milestones_helper.rb","lines":{"begin":219,"end":226}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9bdbae2675861886dd810a67f252ae76","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/helpers/milestones_helper.rb","lines":{"begin":219,"end":226}},"remediation_points":250000,"other_locations":[{"path":"app/helpers/milestones_helper.rb","lines":{"begin":199,"end":206}},{"path":"app/helpers/milestones_helper.rb","lines":{"begin":209,"end":216}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9bdbae2675861886dd810a67f252ae76","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/policies/project_policy.rb","lines":{"begin":217,"end":236}},"remediation_points":510000,"other_locations":[{"path":"app/policies/project_policy.rb","lines":{"begin":330,"end":351}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 43**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6f53dee2e0dbe6e42301dfabd181bed2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/policies/project_policy.rb","lines":{"begin":330,"end":351}},"remediation_points":510000,"other_locations":[{"path":"app/policies/project_policy.rb","lines":{"begin":217,"end":236}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 43**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6f53dee2e0dbe6e42301dfabd181bed2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":5,"end":22}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":250,"end":267}},{"path":"lib/api/services.rb","lines":{"begin":322,"end":339}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":250,"end":267}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":5,"end":22}},{"path":"lib/api/services.rb","lines":{"begin":322,"end":339}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":322,"end":339}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":5,"end":22}},{"path":"lib/api/services.rb","lines":{"begin":250,"end":267}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":230,"end":247}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":302,"end":319}},{"path":"lib/api/services.rb","lines":{"begin":511,"end":528}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":302,"end":319}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":230,"end":247}},{"path":"lib/api/services.rb","lines":{"begin":511,"end":528}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":511,"end":528}},"remediation_points":210000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":230,"end":247}},{"path":"lib/api/services.rb","lines":{"begin":302,"end":319}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14eeea8dcc69e4efb8f98042eb7ee62c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/http_io.rb","lines":{"begin":102,"end":119}},"remediation_points":490000,"other_locations":[{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":95,"end":112}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 42**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9fcdc086aaa42b293828e5799976b36c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/ci/trace/chunked_io.rb","lines":{"begin":95,"end":112}},"remediation_points":490000,"other_locations":[{"path":"lib/gitlab/http_io.rb","lines":{"begin":102,"end":119}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 42**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0aa489542536e966d0d4ee9d92b86de3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/policies/project_policy.rb","lines":{"begin":152,"end":170}},"remediation_points":470000,"other_locations":[{"path":"app/policies/project_policy.rb","lines":{"begin":177,"end":195}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 41**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3960d89aa99311987411af9a2ce4316a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/policies/project_policy.rb","lines":{"begin":177,"end":195}},"remediation_points":470000,"other_locations":[{"path":"app/policies/project_policy.rb","lines":{"begin":152,"end":170}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 41**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3960d89aa99311987411af9a2ce4316a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/tags.rb","lines":{"begin":95,"end":104}},"remediation_points":470000,"other_locations":[{"path":"lib/api/tags.rb","lines":{"begin":115,"end":124}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 41**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"04627bf7d430fe80b4f7d86af94fb085","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/tags.rb","lines":{"begin":115,"end":124}},"remediation_points":470000,"other_locations":[{"path":"lib/api/tags.rb","lines":{"begin":95,"end":104}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 41**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"04627bf7d430fe80b4f7d86af94fb085","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/issues.rb","lines":{"begin":159,"end":171}},"remediation_points":450000,"other_locations":[{"path":"lib/api/commit_statuses.rb","lines":{"begin":16,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 40**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"72cad3326805b4987fbe6343ebb3d0fd","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/commit_statuses.rb","lines":{"begin":16,"end":23}},"remediation_points":450000,"other_locations":[{"path":"lib/api/issues.rb","lines":{"begin":159,"end":171}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 40**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"69ab1e3ccd645591451e705830d55186","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/discussions.rb","lines":{"begin":159,"end":163}},"remediation_points":170000,"other_locations":[{"path":"lib/api/discussions.rb","lines":{"begin":194,"end":198}},{"path":"lib/api/discussions.rb","lines":{"begin":209,"end":213}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"94185a2a13c6fd98f5095f170db11d97","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/discussions.rb","lines":{"begin":194,"end":198}},"remediation_points":170000,"other_locations":[{"path":"lib/api/discussions.rb","lines":{"begin":159,"end":163}},{"path":"lib/api/discussions.rb","lines":{"begin":209,"end":213}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"94185a2a13c6fd98f5095f170db11d97","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/discussions.rb","lines":{"begin":209,"end":213}},"remediation_points":170000,"other_locations":[{"path":"lib/api/discussions.rb","lines":{"begin":159,"end":163}},{"path":"lib/api/discussions.rb","lines":{"begin":194,"end":198}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"94185a2a13c6fd98f5095f170db11d97","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"rubocop/cop/migration/timestamps.rb","lines":{"begin":3,"end":22}},"remediation_points":430000,"other_locations":[{"path":"rubocop/cop/migration/remove_index.rb","lines":{"begin":3,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 39**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c7a34cb081b464faf300442c9a9c35d6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"rubocop/cop/migration/remove_index.rb","lines":{"begin":3,"end":21}},"remediation_points":430000,"other_locations":[{"path":"rubocop/cop/migration/timestamps.rb","lines":{"begin":3,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 39**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1c3d38d7fee5df958c3e432d1dd17b38","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":265,"end":272}},"remediation_points":150000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":330,"end":337}},{"path":"lib/api/users.rb","lines":{"begin":417,"end":423}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b090709c230c91d97c8733ac43a69eb2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":330,"end":337}},"remediation_points":150000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":265,"end":272}},{"path":"lib/api/users.rb","lines":{"begin":417,"end":423}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b090709c230c91d97c8733ac43a69eb2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":417,"end":423}},"remediation_points":150000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":265,"end":272}},{"path":"lib/api/users.rb","lines":{"begin":330,"end":337}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b090709c230c91d97c8733ac43a69eb2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":172,"end":195}},"remediation_points":390000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":645,"end":668}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef781c60f85295b7fcab51d2c5fa6dbf","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":645,"end":668}},"remediation_points":390000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":172,"end":195}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef781c60f85295b7fcab51d2c5fa6dbf","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":469,"end":492}},"remediation_points":390000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":599,"end":622}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef781c60f85295b7fcab51d2c5fa6dbf","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/services.rb","lines":{"begin":599,"end":622}},"remediation_points":390000,"other_locations":[{"path":"lib/api/services.rb","lines":{"begin":469,"end":492}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef781c60f85295b7fcab51d2c5fa6dbf","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/variables.rb","lines":{"begin":70,"end":80}},"remediation_points":390000,"other_locations":[{"path":"lib/api/group_variables.rb","lines":{"begin":70,"end":80}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b710502de22d6ac75887584b4089f55d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/group_variables.rb","lines":{"begin":70,"end":80}},"remediation_points":390000,"other_locations":[{"path":"lib/api/variables.rb","lines":{"begin":70,"end":80}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 37**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5ed54d7e9dec3ef5264c44b21ab42f3b","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/concerns/relative_positioning.rb","lines":{"begin":63,"end":75}},"remediation_points":370000,"other_locations":[{"path":"app/models/concerns/relative_positioning.rb","lines":{"begin":78,"end":90}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6a6be26fc5b134ababae60c5b17185e7","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/concerns/relative_positioning.rb","lines":{"begin":78,"end":90}},"remediation_points":370000,"other_locations":[{"path":"app/models/concerns/relative_positioning.rb","lines":{"begin":63,"end":75}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6a6be26fc5b134ababae60c5b17185e7","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":241,"end":252}},"remediation_points":370000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":305,"end":316}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b03582b4029701d34f64ca56f039ff3c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/users.rb","lines":{"begin":305,"end":316}},"remediation_points":370000,"other_locations":[{"path":"lib/api/users.rb","lines":{"begin":241,"end":252}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b03582b4029701d34f64ca56f039ff3c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":615,"end":622}},"remediation_points":370000,"other_locations":[{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":706,"end":713}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6613d45047514c566568cdc6b20a1433","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":706,"end":713}},"remediation_points":370000,"other_locations":[{"path":"lib/gitlab/database/migration_helpers.rb","lines":{"begin":615,"end":622}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 36**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6613d45047514c566568cdc6b20a1433","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":34,"end":47}},"remediation_points":330000,"other_locations":[{"path":"lib/banzai/filter/project_reference_filter.rb","lines":{"begin":30,"end":43}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 34**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e03c415d22f94144c8a11a51bf75449a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/project_reference_filter.rb","lines":{"begin":30,"end":43}},"remediation_points":330000,"other_locations":[{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":34,"end":47}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 34**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8a3a69b8619d932aa827e537f3525e47","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/cycle_analytics/code_stage.rb","lines":{"begin":2,"end":25}},"remediation_points":330000,"other_locations":[{"path":"lib/gitlab/cycle_analytics/review_stage.rb","lines":{"begin":2,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 34**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9c27f17bb5883c88a2dcf096a1e3eb10","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/cycle_analytics/review_stage.rb","lines":{"begin":2,"end":25}},"remediation_points":330000,"other_locations":[{"path":"lib/gitlab/cycle_analytics/code_stage.rb","lines":{"begin":2,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 34**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1a85a78111fd009c906af5e3e2e5c1b3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/teamcity_service.rb","lines":{"begin":52,"end":61}},"remediation_points":310000,"other_locations":[{"path":"app/models/project_services/bamboo_service.rb","lines":{"begin":49,"end":58}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 33**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"043f75067c16ff3e5d772bc2d1ae6742","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/project_services/bamboo_service.rb","lines":{"begin":49,"end":58}},"remediation_points":310000,"other_locations":[{"path":"app/models/project_services/teamcity_service.rb","lines":{"begin":52,"end":61}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 33**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3bc437123bd781d63ac2e5f1e2ee6eb3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/set_confidential_note_events_on_webhooks.rb","lines":{"begin":5,"end":22}},"remediation_points":310000,"other_locations":[{"path":"lib/gitlab/background_migration/set_confidential_note_events_on_services.rb","lines":{"begin":5,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 33**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3ed85e9f30996e6d2ccc2e0700c1902e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/set_confidential_note_events_on_services.rb","lines":{"begin":5,"end":22}},"remediation_points":310000,"other_locations":[{"path":"lib/gitlab/background_migration/set_confidential_note_events_on_webhooks.rb","lines":{"begin":5,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 33**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7ea2c375fc2078d33f6958933228ed7c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/backup/database.rb","lines":{"begin":23,"end":27}},"remediation_points":290000,"other_locations":[{"path":"lib/backup/database.rb","lines":{"begin":57,"end":61}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 32**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"eb17727d02a7c074c3154590d6ac3890","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/backup/database.rb","lines":{"begin":57,"end":61}},"remediation_points":290000,"other_locations":[{"path":"lib/backup/database.rb","lines":{"begin":23,"end":27}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 32**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"eb17727d02a7c074c3154590d6ac3890","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":130,"end":135}},"remediation_points":290000,"other_locations":[{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":138,"end":143}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 32**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c728f05ae3efb5098c029de0b3280f52","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":138,"end":143}},"remediation_points":290000,"other_locations":[{"path":"lib/banzai/filter/user_reference_filter.rb","lines":{"begin":130,"end":135}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 32**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c728f05ae3efb5098c029de0b3280f52","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/concerns/updated_at_filterable.rb","lines":{"begin":6,"end":11}},"remediation_points":270000,"other_locations":[{"path":"app/models/concerns/created_at_filterable.rb","lines":{"begin":6,"end":11}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cf343522a426e7b5b70965cafd123e2d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/concerns/created_at_filterable.rb","lines":{"begin":6,"end":11}},"remediation_points":270000,"other_locations":[{"path":"app/models/concerns/updated_at_filterable.rb","lines":{"begin":6,"end":11}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"83ce9e73df4d8e3e8128ba7268e47c86","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/user.rb","lines":{"begin":1183,"end":1185}},"remediation_points":270000,"other_locations":[{"path":"app/models/user.rb","lines":{"begin":1189,"end":1191}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5c5665e3faea9b14f82119a1c414984d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/user.rb","lines":{"begin":1189,"end":1191}},"remediation_points":270000,"other_locations":[{"path":"app/models/user.rb","lines":{"begin":1183,"end":1185}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5c5665e3faea9b14f82119a1c414984d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":90,"end":96}},"remediation_points":270000,"other_locations":[{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":105,"end":111}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fb529d437944a41ecb389c07d4f4b95c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":105,"end":111}},"remediation_points":270000,"other_locations":[{"path":"lib/gitlab/legacy_github_import/importer.rb","lines":{"begin":90,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fb529d437944a41ecb389c07d4f4b95c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/system_check/app/tmp_writable_check.rb","lines":{"begin":2,"end":24}},"remediation_points":270000,"other_locations":[{"path":"lib/system_check/app/log_writable_check.rb","lines":{"begin":2,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5873e0223d34261535ea9380a655f530","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/system_check/app/log_writable_check.rb","lines":{"begin":2,"end":24}},"remediation_points":270000,"other_locations":[{"path":"lib/system_check/app/tmp_writable_check.rb","lines":{"begin":2,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 31**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f5f6516f48de36202ed1fb08b864850e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/search_service.rb","lines":{"begin":12,"end":20}},"remediation_points":250000,"other_locations":[{"path":"app/services/search_service.rb","lines":{"begin":26,"end":34}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"71865084b25bec6d7d5ead8d752fb091","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/search_service.rb","lines":{"begin":26,"end":34}},"remediation_points":250000,"other_locations":[{"path":"app/services/search_service.rb","lines":{"begin":12,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"71865084b25bec6d7d5ead8d752fb091","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":192,"end":201}},"remediation_points":250000,"other_locations":[{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":205,"end":214}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"87efcabb3c142197252756a6564676fa","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":205,"end":214}},"remediation_points":250000,"other_locations":[{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":192,"end":201}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"87efcabb3c142197252756a6564676fa","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb","lines":{"begin":3,"end":12}},"remediation_points":250000,"other_locations":[{"path":"qa/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb","lines":{"begin":5,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0022a6eabe051cdbca1e39ad3d0616a0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb","lines":{"begin":5,"end":14}},"remediation_points":250000,"other_locations":[{"path":"qa/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb","lines":{"begin":3,"end":12}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 30**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b769bd2ad86996248bc0cb9e9909ad48","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/admin/impersonation_tokens_controller.rb","lines":{"begin":21,"end":30}},"remediation_points":230000,"other_locations":[{"path":"app/controllers/profiles/personal_access_tokens_controller.rb","lines":{"begin":19,"end":28}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d66178654f9f4136765d0ea5d8b3e694","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/profiles/personal_access_tokens_controller.rb","lines":{"begin":19,"end":28}},"remediation_points":230000,"other_locations":[{"path":"app/controllers/admin/impersonation_tokens_controller.rb","lines":{"begin":21,"end":30}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7450a990959a14aea730f2b6be2c03b2","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/projects/clusters_controller.rb","lines":{"begin":72,"end":85}},"remediation_points":230000,"other_locations":[{"path":"app/controllers/projects/clusters_controller.rb","lines":{"begin":88,"end":101}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9983d989b521b3d7814b329e7276929a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/controllers/projects/clusters_controller.rb","lines":{"begin":88,"end":101}},"remediation_points":230000,"other_locations":[{"path":"app/controllers/projects/clusters_controller.rb","lines":{"begin":72,"end":85}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9983d989b521b3d7814b329e7276929a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/blob_viewer/podspec.rb","lines":{"begin":4,"end":26}},"remediation_points":230000,"other_locations":[{"path":"app/models/blob_viewer/gemspec.rb","lines":{"begin":4,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bff03fdced6cbae88ff2946f20dc10e3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/blob_viewer/gemspec.rb","lines":{"begin":4,"end":26}},"remediation_points":230000,"other_locations":[{"path":"app/models/blob_viewer/podspec.rb","lines":{"begin":4,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"51fdccc6768efcdd38f19730ffe72a7c","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/ci/stage.rb","lines":{"begin":96,"end":103}},"remediation_points":230000,"other_locations":[{"path":"app/models/ci/pipeline.rb","lines":{"begin":442,"end":449}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"25c1e443e5b07fc0b45f399a084137f7","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/ci/pipeline.rb","lines":{"begin":442,"end":449}},"remediation_points":230000,"other_locations":[{"path":"app/models/ci/stage.rb","lines":{"begin":96,"end":103}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"577c618e98095b86078d36b2ac019b73","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/settings.rb","lines":{"begin":59,"end":63}},"remediation_points":230000,"other_locations":[{"path":"lib/api/tags.rb","lines":{"begin":46,"end":50}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"34d52e18accbf89e1d40ad4efe71140e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/tags.rb","lines":{"begin":46,"end":50}},"remediation_points":230000,"other_locations":[{"path":"lib/api/settings.rb","lines":{"begin":59,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 29**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7249b946ecaa77a923de68a038829979","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/group_members_finder.rb","lines":{"begin":18,"end":22}},"remediation_points":210000,"other_locations":[{"path":"app/finders/group_members_finder.rb","lines":{"begin":26,"end":30}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b855af99fe41d98222cc7d488606c72e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/group_members_finder.rb","lines":{"begin":26,"end":30}},"remediation_points":210000,"other_locations":[{"path":"app/finders/group_members_finder.rb","lines":{"begin":18,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b855af99fe41d98222cc7d488606c72e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/members.rb","lines":{"begin":132,"end":137}},"remediation_points":210000,"other_locations":[{"path":"lib/api/access_requests.rb","lines":{"begin":76,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"74eeab655880b068d73bfa1508e15e08","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/access_requests.rb","lines":{"begin":76,"end":81}},"remediation_points":210000,"other_locations":[{"path":"lib/api/members.rb","lines":{"begin":132,"end":137}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"89dd703acaf685f87aef279f54d3c31a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/database.rb","lines":{"begin":98,"end":109}},"remediation_points":210000,"other_locations":[{"path":"lib/gitlab/database.rb","lines":{"begin":112,"end":123}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2b8f3ea2a51c54532c43041c348ab5c3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/database.rb","lines":{"begin":112,"end":123}},"remediation_points":210000,"other_locations":[{"path":"lib/gitlab/database.rb","lines":{"begin":98,"end":109}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2b8f3ea2a51c54532c43041c348ab5c3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":44,"end":47}},"remediation_points":210000,"other_locations":[{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":50,"end":53}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e02e496b4b6107134a36720421ac55a9","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":50,"end":53}},"remediation_points":210000,"other_locations":[{"path":"lib/gitlab/gitaly_client/ref_service.rb","lines":{"begin":44,"end":47}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e02e496b4b6107134a36720421ac55a9","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/spec/runtime/env_spec.rb","lines":{"begin":6,"end":14}},"remediation_points":210000,"other_locations":[{"path":"qa/spec/runtime/env_spec.rb","lines":{"begin":17,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d4456b6f43cef6bfbf9b6d039f749cdc","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"qa/spec/runtime/env_spec.rb","lines":{"begin":17,"end":25}},"remediation_points":210000,"other_locations":[{"path":"qa/spec/runtime/env_spec.rb","lines":{"begin":6,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 28**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d4456b6f43cef6bfbf9b6d039f749cdc","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":252,"end":262}},"remediation_points":190000,"other_locations":[{"path":"app/finders/issuable_finder.rb","lines":{"begin":280,"end":290}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d67c2bf9c225577fade90666e5dfc6e3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":280,"end":290}},"remediation_points":190000,"other_locations":[{"path":"app/finders/issuable_finder.rb","lines":{"begin":252,"end":262}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d67c2bf9c225577fade90666e5dfc6e3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":396,"end":405}},"remediation_points":190000,"other_locations":[{"path":"app/finders/issuable_finder.rb","lines":{"begin":410,"end":419}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d67c2bf9c225577fade90666e5dfc6e3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":410,"end":419}},"remediation_points":190000,"other_locations":[{"path":"app/finders/issuable_finder.rb","lines":{"begin":396,"end":405}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d67c2bf9c225577fade90666e5dfc6e3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/migrate_legacy_artifacts.rb","lines":{"begin":24,"end":61}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/background_migration/migrate_legacy_artifacts.rb","lines":{"begin":66,"end":104}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f75f6fbbc7064f4fdca08c087adf39c3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/migrate_legacy_artifacts.rb","lines":{"begin":66,"end":104}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/background_migration/migrate_legacy_artifacts.rb","lines":{"begin":24,"end":61}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f75f6fbbc7064f4fdca08c087adf39c3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/checks/change_access.rb","lines":{"begin":4,"end":17}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/git_access.rb","lines":{"begin":12,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef81133143dac9759b71c4ff2fbf45ed","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git_access.rb","lines":{"begin":12,"end":25}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/checks/change_access.rb","lines":{"begin":4,"end":17}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"26fd0da9b8c1ef08c93581298c4ae63a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":564,"end":575}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/git/repository.rb","lines":{"begin":579,"end":590}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7853b1dd44bd6645b11dfd03b93082d6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/git/repository.rb","lines":{"begin":579,"end":590}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/git/repository.rb","lines":{"begin":564,"end":575}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7853b1dd44bd6645b11dfd03b93082d6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":211,"end":225}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":204,"end":210}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"85278ceed072f59d95f4d59bb38349cd","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/fogbugz_import/importer.rb","lines":{"begin":204,"end":210}},"remediation_points":190000,"other_locations":[{"path":"lib/gitlab/google_code_import/importer.rb","lines":{"begin":211,"end":225}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 27**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"84267e4195b1ef161585bb368ab56cb4","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/mailers/emails/profile.rb","lines":{"begin":13,"end":20}},"remediation_points":170000,"other_locations":[{"path":"app/mailers/emails/profile.rb","lines":{"begin":25,"end":32}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"08b3c569353eb654d48c0f3d5dfd5507","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/mailers/emails/profile.rb","lines":{"begin":25,"end":32}},"remediation_points":170000,"other_locations":[{"path":"app/mailers/emails/profile.rb","lines":{"begin":13,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"08b3c569353eb654d48c0f3d5dfd5507","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/prometheus_metric.rb","lines":{"begin":31,"end":43}},"remediation_points":170000,"other_locations":[{"path":"app/helpers/preferences_helper.rb","lines":{"begin":13,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"84368938cf4e38b28be7f2494ab7dded","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/helpers/preferences_helper.rb","lines":{"begin":13,"end":22}},"remediation_points":170000,"other_locations":[{"path":"app/models/prometheus_metric.rb","lines":{"begin":31,"end":43}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"60bfb34cb2ceca3dea92da73de2720d1","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/repository.rb","lines":{"begin":826,"end":838}},"remediation_points":170000,"other_locations":[{"path":"app/models/repository.rb","lines":{"begin":842,"end":854}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f850bbad5c6c0dbf53dcda181b0fe2ef","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/repository.rb","lines":{"begin":842,"end":854}},"remediation_points":170000,"other_locations":[{"path":"app/models/repository.rb","lines":{"begin":826,"end":838}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f850bbad5c6c0dbf53dcda181b0fe2ef","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/user.rb","lines":{"begin":1195,"end":1197}},"remediation_points":170000,"other_locations":[{"path":"app/models/user.rb","lines":{"begin":1201,"end":1203}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"79536c6f949eba9317227c4e88951f1f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/user.rb","lines":{"begin":1201,"end":1203}},"remediation_points":170000,"other_locations":[{"path":"app/models/user.rb","lines":{"begin":1195,"end":1197}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"79536c6f949eba9317227c4e88951f1f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":233,"end":242}},"remediation_points":170000,"other_locations":[{"path":"app/presenters/project_presenter.rb","lines":{"begin":263,"end":272}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c2d74780d6448543b93af9ac07770eb6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/presenters/project_presenter.rb","lines":{"begin":263,"end":272}},"remediation_points":170000,"other_locations":[{"path":"app/presenters/project_presenter.rb","lines":{"begin":233,"end":242}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c2d74780d6448543b93af9ac07770eb6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/protected_branches/legacy_api_update_service.rb","lines":{"begin":18,"end":22}},"remediation_points":170000,"other_locations":[{"path":"app/services/protected_branches/legacy_api_update_service.rb","lines":{"begin":25,"end":29}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2a21c2dc3f646e0e31fff25ee48b9b44","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/protected_branches/legacy_api_update_service.rb","lines":{"begin":25,"end":29}},"remediation_points":170000,"other_locations":[{"path":"app/services/protected_branches/legacy_api_update_service.rb","lines":{"begin":18,"end":22}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2a21c2dc3f646e0e31fff25ee48b9b44","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/quick_actions/interpret_service.rb","lines":{"begin":222,"end":229}},"remediation_points":170000,"other_locations":[{"path":"app/services/quick_actions/interpret_service.rb","lines":{"begin":276,"end":283}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c5f1ca2a225a96cfa3b4fc88b12b03b0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/services/quick_actions/interpret_service.rb","lines":{"begin":276,"end":283}},"remediation_points":170000,"other_locations":[{"path":"app/services/quick_actions/interpret_service.rb","lines":{"begin":222,"end":229}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c5f1ca2a225a96cfa3b4fc88b12b03b0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/branches.rb","lines":{"begin":71,"end":75}},"remediation_points":170000,"other_locations":[{"path":"lib/api/triggers.rb","lines":{"begin":12,"end":16}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6da3752f53f9199ec80a8ad0d2b565c1","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/triggers.rb","lines":{"begin":12,"end":16}},"remediation_points":170000,"other_locations":[{"path":"lib/api/branches.rb","lines":{"begin":71,"end":75}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2a596f82671816ebb68812ebe7bf8287","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/variables.rb","lines":{"begin":31,"end":38}},"remediation_points":170000,"other_locations":[{"path":"lib/api/group_variables.rb","lines":{"begin":31,"end":38}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9c68d19fac636a233c57119e7465aae0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/group_variables.rb","lines":{"begin":31,"end":38}},"remediation_points":170000,"other_locations":[{"path":"lib/api/variables.rb","lines":{"begin":31,"end":38}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fb90f649add7621cd688c8cf825bd6ac","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/spaced_link_filter.rb","lines":{"begin":47,"end":56}},"remediation_points":170000,"other_locations":[{"path":"lib/banzai/filter/autolink_filter.rb","lines":{"begin":54,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bde5f678a848776d31606c1f7b9474fa","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/banzai/filter/autolink_filter.rb","lines":{"begin":54,"end":63}},"remediation_points":170000,"other_locations":[{"path":"lib/banzai/filter/spaced_link_filter.rb","lines":{"begin":47,"end":56}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37daabf17a192f4d7be1f8b27c2260a6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/fill_file_store_job_artifact.rb","lines":{"begin":5,"end":15}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/background_migration/fill_file_store_lfs_object.rb","lines":{"begin":5,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8744b4f4833ad7e9ac1e28093ac9f90e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/fill_file_store_lfs_object.rb","lines":{"begin":5,"end":15}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/background_migration/fill_file_store_job_artifact.rb","lines":{"begin":5,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7504dbd080f799a40cd6f4e9f9588e2e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":419,"end":427}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/gitaly_client/blob_service.rb","lines":{"begin":93,"end":101}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"63af7969c300adefbe9421c884f45ddf","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/blob_service.rb","lines":{"begin":93,"end":101}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/gitaly_client/commit_service.rb","lines":{"begin":419,"end":427}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"037891a3606e1c8a2fffd32f88e7cede","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/metrics/samplers/unicorn_sampler.rb","lines":{"begin":23,"end":25}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/metrics/samplers/unicorn_sampler.rb","lines":{"begin":28,"end":30}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8a65a519016a876bba37ba5a3c7a819f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/metrics/samplers/unicorn_sampler.rb","lines":{"begin":28,"end":30}},"remediation_points":170000,"other_locations":[{"path":"lib/gitlab/metrics/samplers/unicorn_sampler.rb","lines":{"begin":23,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8a65a519016a876bba37ba5a3c7a819f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/system_check/orphans/repository_check.rb","lines":{"begin":25,"end":32}},"remediation_points":170000,"other_locations":[{"path":"lib/system_check/orphans/namespace_check.rb","lines":{"begin":23,"end":30}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6d29fff75b609f46ded82f4a44c12b3e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/system_check/orphans/namespace_check.rb","lines":{"begin":23,"end":30}},"remediation_points":170000,"other_locations":[{"path":"lib/system_check/orphans/repository_check.rb","lines":{"begin":25,"end":32}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 26**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f5b93c21edd90205b8238e3ade31ae23","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/concerns/created_at_filter.rb","lines":{"begin":4,"end":8}},"remediation_points":150000,"other_locations":[{"path":"app/finders/issuable_finder.rb","lines":{"begin":315,"end":319}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4781409b61d0fe8557e646dde62af4ee","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/finders/issuable_finder.rb","lines":{"begin":315,"end":319}},"remediation_points":150000,"other_locations":[{"path":"app/finders/concerns/created_at_filter.rb","lines":{"begin":4,"end":8}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"99f151d4d58ba006fbb17af802305432","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/ci/pipeline.rb","lines":{"begin":572,"end":575}},"remediation_points":150000,"other_locations":[{"path":"app/models/ci/runner.rb","lines":{"begin":220,"end":223}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3c0fb0db7a1fa6852c67bd50857aa448","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/models/ci/runner.rb","lines":{"begin":220,"end":223}},"remediation_points":150000,"other_locations":[{"path":"app/models/ci/pipeline.rb","lines":{"begin":572,"end":575}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"44cfa492a10b5b72b394efe01cd9e29d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/variables.rb","lines":{"begin":49,"end":57}},"remediation_points":150000,"other_locations":[{"path":"lib/api/group_variables.rb","lines":{"begin":49,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"320c3b54951e69257faaca3316f72058","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/api/group_variables.rb","lines":{"begin":49,"end":57}},"remediation_points":150000,"other_locations":[{"path":"lib/api/variables.rb","lines":{"begin":49,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fa689b5b4bab39de500b86b3d6814963","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/fix_cross_project_label_links.rb","lines":{"begin":65,"end":75}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/background_migration/fix_cross_project_label_links.rb","lines":{"begin":81,"end":91}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"26a19237576df2b97ff121c3b0cd2342","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/background_migration/fix_cross_project_label_links.rb","lines":{"begin":81,"end":91}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/background_migration/fix_cross_project_label_links.rb","lines":{"begin":65,"end":75}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"26a19237576df2b97ff121c3b0cd2342","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":136,"end":150}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":153,"end":167}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fc526fdd6733948898ee897d1eef487e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":153,"end":167}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/gitaly_client/repository_service.rb","lines":{"begin":136,"end":150}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fc526fdd6733948898ee897d1eef487e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/redis/shared_state.rb","lines":{"begin":13,"end":29}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/redis/queues.rb","lines":{"begin":12,"end":28}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"077a90f16d3842a49d8095f339e2187f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/redis/queues.rb","lines":{"begin":12,"end":28}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/redis/shared_state.rb","lines":{"begin":13,"end":29}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f48114ce0a7710485f176b1b75c08e79","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/template/issue_template.rb","lines":{"begin":2,"end":14}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/template/merge_request_template.rb","lines":{"begin":2,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"685a5435dac10b7fc45977c34f30aba3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"lib/gitlab/template/merge_request_template.rb","lines":{"begin":2,"end":14}},"remediation_points":150000,"other_locations":[{"path":"lib/gitlab/template/issue_template.rb","lines":{"begin":2,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 25**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bc65c6ec010926daa88fbdcb539ddeea","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/environments/mixins/environments_mixin.js","lines":{"begin":164,"end":170}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":41,"end":47}},{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":45,"end":51}},{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":33,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2d6588749bb4b05d1e583e13b9a75e39","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":33,"end":39}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/environments/mixins/environments_mixin.js","lines":{"begin":164,"end":170}},{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":41,"end":47}},{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":45,"end":51}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e1b42460d85ed0074c2f1fbd38bf2631","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":45,"end":51}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/environments/mixins/environments_mixin.js","lines":{"begin":164,"end":170}},{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":41,"end":47}},{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":33,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f4d765094c9218d5390de58501e17b93","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":41,"end":47}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/environments/mixins/environments_mixin.js","lines":{"begin":164,"end":170}},{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":45,"end":51}},{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":33,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"caa789e408f667bb83169e9a6e4f54bb","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":198,"end":200}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":142,"end":144}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":148,"end":150}},{"path":"app/assets/javascripts/ide/stores/mutations/tree.js","lines":{"begin":42,"end":44}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7b7e24c67302a04433b92238befc3cf1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/tree.js","lines":{"begin":42,"end":44}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":198,"end":200}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":142,"end":144}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":148,"end":150}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"935ca74221c521771d96150adf2278fe","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":142,"end":144}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":198,"end":200}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":148,"end":150}},{"path":"app/assets/javascripts/ide/stores/mutations/tree.js","lines":{"begin":42,"end":44}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"db86386cff8c19e24cbadfb75750f1d9","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":148,"end":150}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations.js","lines":{"begin":198,"end":200}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":142,"end":144}},{"path":"app/assets/javascripts/ide/stores/mutations/tree.js","lines":{"begin":42,"end":44}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"db86386cff8c19e24cbadfb75750f1d9","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":7,"end":41}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":43,"end":74}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":76,"end":108}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37429fdf41dd049c7cec6890f8e50c82","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":43,"end":74}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":7,"end":41}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":76,"end":108}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37429fdf41dd049c7cec6890f8e50c82","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":76,"end":108}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":7,"end":41}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":43,"end":74}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37429fdf41dd049c7cec6890f8e50c82","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":79,"end":96}},"remediation_points":4710000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":97,"end":114}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 192**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"860f8a405f1b26af1f14049631bd7aa9","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":97,"end":114}},"remediation_points":4710000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":79,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 192**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"860f8a405f1b26af1f14049631bd7aa9","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/subscription_select.js","lines":{"begin":3,"end":26}},"remediation_points":4710000,"other_locations":[{"path":"app/assets/javascripts/issue_status_select.js","lines":{"begin":3,"end":25}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 192**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d440b0e1b0cca3d485fda9e0c4aaee09","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issue_status_select.js","lines":{"begin":3,"end":25}},"remediation_points":4710000,"other_locations":[{"path":"app/assets/javascripts/subscription_select.js","lines":{"begin":3,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 192**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d85cea2030ab41431ddc90787eb11389","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/blob/template_selectors/ci_yaml_selector.js","lines":{"begin":5,"end":32}},"remediation_points":4620000,"other_locations":[{"path":"app/assets/javascripts/blob/template_selectors/dockerfile_selector.js","lines":{"begin":5,"end":32}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 189**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4a9d91d82457a2a845b5366d5f0ce5b4","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/blob/template_selectors/dockerfile_selector.js","lines":{"begin":5,"end":32}},"remediation_points":4620000,"other_locations":[{"path":"app/assets/javascripts/blob/template_selectors/ci_yaml_selector.js","lines":{"begin":5,"end":32}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 189**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9a6d28971082883e9748dd3bac2a6695","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":316,"end":324}},"remediation_points":1470000,"other_locations":[{"path":"app/assets/javascripts/commit/pipelines/pipelines_bundle.js","lines":{"begin":34,"end":42}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 84**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5595f472c12029fb0da2e625d62d94d6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/commit/pipelines/pipelines_bundle.js","lines":{"begin":34,"end":42}},"remediation_points":1470000,"other_locations":[{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":316,"end":324}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 84**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"30d9e8739fb74a1a2a7618b85b5e6f7a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1204,"end":1222}},"remediation_points":3990000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1222,"end":1240}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 168**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4725f16bae793b141b64c0921a6539b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1222,"end":1240}},"remediation_points":3990000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1204,"end":1222}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 168**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4725f16bae793b141b64c0921a6539b7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":13,"end":37}},"remediation_points":2280000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":49,"end":70}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":82,"end":104}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 111**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bc78d02c62558d8dc38d2567eaf302a7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":49,"end":70}},"remediation_points":2280000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":13,"end":37}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":82,"end":104}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 111**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bc78d02c62558d8dc38d2567eaf302a7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":82,"end":104}},"remediation_points":2280000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":13,"end":37}},{"path":"app/assets/javascripts/ide/stores/actions/merge_request.js","lines":{"begin":49,"end":70}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 111**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"bc78d02c62558d8dc38d2567eaf302a7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/group_avatar.js","lines":{"begin":3,"end":14}},"remediation_points":3810000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/shared/project_avatar.js","lines":{"begin":3,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 162**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"90682f4af3abe93c6405cd6eb215e9c6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/shared/project_avatar.js","lines":{"begin":3,"end":15}},"remediation_points":3810000,"other_locations":[{"path":"app/assets/javascripts/group_avatar.js","lines":{"begin":3,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 162**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"67e63301cd433971695d7cc16ff752b2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":14,"end":23}},"remediation_points":1350000,"other_locations":[{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":66,"end":75}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"272dee8d71a4ab9c8d815e23c04c7742","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":66,"end":75}},"remediation_points":1350000,"other_locations":[{"path":"app/assets/javascripts/boards/components/new_list_dropdown.js","lines":{"begin":14,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"272dee8d71a4ab9c8d815e23c04c7742","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":76,"end":80}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":91,"end":95}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":96,"end":100}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":123,"end":127}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":217,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b1e5c7e2317fc81ce11cbdb1bfee15df","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":91,"end":95}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":76,"end":80}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":96,"end":100}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":123,"end":127}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":217,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b1e5c7e2317fc81ce11cbdb1bfee15df","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":96,"end":100}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":76,"end":80}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":91,"end":95}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":123,"end":127}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":217,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b1e5c7e2317fc81ce11cbdb1bfee15df","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":123,"end":127}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":76,"end":80}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":91,"end":95}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":96,"end":100}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":217,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b1e5c7e2317fc81ce11cbdb1bfee15df","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 5 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":217,"end":221}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":76,"end":80}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":91,"end":95}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":96,"end":100}},{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":123,"end":127}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b1e5c7e2317fc81ce11cbdb1bfee15df","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":55,"end":59}},"remediation_points":1050000,"other_locations":[{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":70,"end":74}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 70**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2f1257b0729020dbf8c1e761c6b423db","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":70,"end":74}},"remediation_points":1050000,"other_locations":[{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":55,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 70**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"39bdab25a792c5662feb840979099a97","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/commons/polyfills/element.js","lines":{"begin":14,"end":19}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":278,"end":283}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b95252006271b6a23d2d59296a0e5778","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/common_utils.js","lines":{"begin":278,"end":283}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/commons/polyfills/element.js","lines":{"begin":14,"end":19}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"67ee0da8e9d2d3b183449d9e8d462f44","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":37,"end":57}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":99,"end":135}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6e9b85292de8771601751d3ed0d9dc18","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":99,"end":135}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":37,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6e9b85292de8771601751d3ed0d9dc18","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":105,"end":115}},"remediation_points":2700000,"other_locations":[{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":117,"end":127}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 125**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0fee1b42ff17f6df3a6f14e35f13cf18","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":117,"end":127}},"remediation_points":2700000,"other_locations":[{"path":"app/assets/javascripts/notes/stores/actions.js","lines":{"begin":105,"end":115}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 125**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0fee1b42ff17f6df3a6f14e35f13cf18","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":183,"end":186}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":188,"end":191}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":193,"end":196}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":198,"end":201}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8fc9b42e2195587e4e8d777e75ad89d8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":188,"end":191}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":183,"end":186}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":193,"end":196}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":198,"end":201}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8fc9b42e2195587e4e8d777e75ad89d8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":193,"end":196}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":183,"end":186}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":188,"end":191}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":198,"end":201}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8fc9b42e2195587e4e8d777e75ad89d8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 4 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":198,"end":201}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":183,"end":186}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":188,"end":191}},{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":193,"end":196}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8fc9b42e2195587e4e8d777e75ad89d8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/snippets/show/index.js","lines":{"begin":7,"end":13}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/snippets/show/index.js","lines":{"begin":7,"end":13}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"15c8237c5ef3dd70061ce1d44bd5d199","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/snippets/show/index.js","lines":{"begin":7,"end":13}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/pages/snippets/show/index.js","lines":{"begin":7,"end":13}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8ae282c95da75609356442ee0da6e6fc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups/new_group_child.js","lines":{"begin":28,"end":36}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":253,"end":262}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"611a498e9c5e5d8f256a05631ef5ac51","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":253,"end":262}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/groups/new_group_child.js","lines":{"begin":28,"end":36}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37087f35974839e5e79033d561c840a6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issuable_bulk_update_actions.js","lines":{"begin":110,"end":117}},"remediation_points":2310000,"other_locations":[{"path":"app/assets/javascripts/issuable_bulk_update_actions.js","lines":{"begin":120,"end":126}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 112**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0e6b703c746c94d22e3a02f1993665ce","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issuable_bulk_update_actions.js","lines":{"begin":120,"end":126}},"remediation_points":2310000,"other_locations":[{"path":"app/assets/javascripts/issuable_bulk_update_actions.js","lines":{"begin":110,"end":117}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 112**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0e6b703c746c94d22e3a02f1993665ce","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"scripts/frontend/prettier.js","lines":{"begin":64,"end":64}},"remediation_points":600000,"other_locations":[{"path":"scripts/frontend/prettier.js","lines":{"begin":71,"end":71}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef21ab3df8b01ca7e22d4d8804157d7a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"scripts/frontend/prettier.js","lines":{"begin":71,"end":71}},"remediation_points":600000,"other_locations":[{"path":"scripts/frontend/prettier.js","lines":{"begin":64,"end":64}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ef21ab3df8b01ca7e22d4d8804157d7a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/api.js","lines":{"begin":208,"end":211}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/api.js","lines":{"begin":213,"end":216}},{"path":"app/assets/javascripts/api.js","lines":{"begin":218,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8774a69c35e7469e5831f013a372ab41","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/api.js","lines":{"begin":213,"end":216}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/api.js","lines":{"begin":208,"end":211}},{"path":"app/assets/javascripts/api.js","lines":{"begin":218,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8774a69c35e7469e5831f013a372ab41","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/api.js","lines":{"begin":218,"end":221}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/api.js","lines":{"begin":208,"end":211}},{"path":"app/assets/javascripts/api.js","lines":{"begin":213,"end":216}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8774a69c35e7469e5831f013a372ab41","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":58,"end":63}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/boards/components/board_sidebar.js","lines":{"begin":95,"end":100}},{"path":"app/assets/javascripts/boards/index.js","lines":{"begin":84,"end":89}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6b694c569da1307b1f359dff7c2ba96a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/components/board_sidebar.js","lines":{"begin":95,"end":100}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/boards/index.js","lines":{"begin":84,"end":89}},{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":58,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3334e14e9af8a36a250b2eeea4a85929","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/index.js","lines":{"begin":84,"end":89}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/boards/components/board_sidebar.js","lines":{"begin":95,"end":100}},{"path":"app/assets/javascripts/pipelines/mixins/pipelines.js","lines":{"begin":58,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7f09eaadb7107879ce06fbd895c6dfd2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issue.js","lines":{"begin":133,"end":142}},"remediation_points":2130000,"other_locations":[{"path":"app/assets/javascripts/issue.js","lines":{"begin":144,"end":153}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 106**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"316f57fc6559be3f06b67e902431d4f3","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issue.js","lines":{"begin":144,"end":153}},"remediation_points":2130000,"other_locations":[{"path":"app/assets/javascripts/issue.js","lines":{"begin":133,"end":142}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 106**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"316f57fc6559be3f06b67e902431d4f3","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js","lines":{"begin":10,"end":15}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js","lines":{"begin":19,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7d9d7ed069d90637ae3219e74dfc3a6a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js","lines":{"begin":19,"end":24}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js","lines":{"begin":10,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"de8d186c2d499f4864bd5be7db1ddad4","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":44,"end":53}},"remediation_points":2010000,"other_locations":[{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":59,"end":68}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 102**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c1e5733385780c688efc3db1ad11f746","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":59,"end":68}},"remediation_points":2010000,"other_locations":[{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":44,"end":53}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 102**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8de13799b826a6e485d4019569e6c278","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":112,"end":122}},"remediation_points":1980000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":124,"end":134}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 101**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"762a1afa922792a6981db079fca70fa7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":124,"end":134}},"remediation_points":1980000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":112,"end":122}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 101**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"762a1afa922792a6981db079fca70fa7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/projects_list.js","lines":{"begin":7,"end":18}},"remediation_points":1980000,"other_locations":[{"path":"app/assets/javascripts/groups_list.js","lines":{"begin":7,"end":18}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 101**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"23431c5334e56a528fc4eb179e3607ec","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups_list.js","lines":{"begin":7,"end":18}},"remediation_points":1980000,"other_locations":[{"path":"app/assets/javascripts/projects_list.js","lines":{"begin":7,"end":18}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 101**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1c7090c499a2a96d464475ad7f818f11","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":605,"end":609}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/users_select.js","lines":{"begin":610,"end":614}},{"path":"app/assets/javascripts/users_select.js","lines":{"begin":615,"end":619}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"448aadd60c1a014f7e3ec3eed8404a65","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":610,"end":614}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/users_select.js","lines":{"begin":605,"end":609}},{"path":"app/assets/javascripts/users_select.js","lines":{"begin":615,"end":619}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"448aadd60c1a014f7e3ec3eed8404a65","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/users_select.js","lines":{"begin":615,"end":619}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/users_select.js","lines":{"begin":605,"end":609}},{"path":"app/assets/javascripts/users_select.js","lines":{"begin":610,"end":614}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"448aadd60c1a014f7e3ec3eed8404a65","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/plugins/filter.js","lines":{"begin":84,"end":90}},"remediation_points":1890000,"other_locations":[{"path":"app/assets/javascripts/droplab/plugins/ajax_filter.js","lines":{"begin":102,"end":108}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 98**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"38d9afeb8b320571be87977725fdcafe","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/plugins/ajax_filter.js","lines":{"begin":102,"end":108}},"remediation_points":1890000,"other_locations":[{"path":"app/assets/javascripts/droplab/plugins/filter.js","lines":{"begin":84,"end":90}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 98**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8f8bc2a8aade90176f81a992ae00dd6e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js","lines":{"begin":1,"end":21}},"remediation_points":1860000,"other_locations":[{"path":"app/assets/javascripts/badges/store/mutation_types.js","lines":{"begin":1,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 97**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7a9bae0109305e0b1d43de56513651bb","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/badges/store/mutation_types.js","lines":{"begin":1,"end":21}},"remediation_points":1860000,"other_locations":[{"path":"app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js","lines":{"begin":1,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 97**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"500922ffefee136d140bb5e95d7a3653","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/protected_tags/protected_tag_edit_list.js","lines":{"begin":6,"end":19}},"remediation_points":1830000,"other_locations":[{"path":"app/assets/javascripts/protected_branches/protected_branch_edit_list.js","lines":{"begin":6,"end":19}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 96**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"746b71495fe41db39299682caa93445c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/protected_branches/protected_branch_edit_list.js","lines":{"begin":6,"end":19}},"remediation_points":1830000,"other_locations":[{"path":"app/assets/javascripts/protected_tags/protected_tag_edit_list.js","lines":{"begin":6,"end":19}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 96**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f5f6ce24443dd76a3e1d0f7521a36be5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/settings_panels.js","lines":{"begin":7,"end":10}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/settings_panels.js","lines":{"begin":17,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e788e65abb5a4f6fb80e4e6628fb6d10","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/settings_panels.js","lines":{"begin":17,"end":20}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/settings_panels.js","lines":{"begin":7,"end":10}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e788e65abb5a4f6fb80e4e6628fb6d10","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":40,"end":40}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":47,"end":47}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3f756c21d7aebceedb361afbef2d4a17","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":47,"end":47}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":40,"end":40}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3f756c21d7aebceedb361afbef2d4a17","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":32,"end":34}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":243,"end":245}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"50b54b3d38d73c256194eed3de425376","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"identical-code","description":"Identical blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":243,"end":245}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/file.js","lines":{"begin":32,"end":34}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"50b54b3d38d73c256194eed3de425376","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request.js","lines":{"begin":96,"end":103}},"remediation_points":1680000,"other_locations":[{"path":"app/assets/javascripts/merge_request.js","lines":{"begin":105,"end":112}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 91**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3d4aa6b1ed1ed8586dbb1479749be92","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request.js","lines":{"begin":105,"end":112}},"remediation_points":1680000,"other_locations":[{"path":"app/assets/javascripts/merge_request.js","lines":{"begin":96,"end":103}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 91**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d3d4aa6b1ed1ed8586dbb1479749be92","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/sidebar/mount_sidebar.js","lines":{"begin":75,"end":92}},"remediation_points":1680000,"other_locations":[{"path":"app/assets/javascripts/sidebar/mount_sidebar.js","lines":{"begin":94,"end":111}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 91**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"961bf4d63d82bd0547b50951a7db6c69","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/sidebar/mount_sidebar.js","lines":{"begin":94,"end":111}},"remediation_points":1680000,"other_locations":[{"path":"app/assets/javascripts/sidebar/mount_sidebar.js","lines":{"begin":75,"end":92}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 91**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"961bf4d63d82bd0547b50951a7db6c69","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":514,"end":533}},"remediation_points":1650000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":522,"end":533}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 90**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e69530c757a3f18db186fc48d529606d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":522,"end":533}},"remediation_points":1650000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":514,"end":533}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 90**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e69530c757a3f18db186fc48d529606d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/badges/store/mutations.js","lines":{"begin":85,"end":99}},"remediation_points":1620000,"other_locations":[{"path":"app/assets/javascripts/badges/store/mutations.js","lines":{"begin":100,"end":114}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 89**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0407713555d3e0c75813d9f23089bcfd","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/badges/store/mutations.js","lines":{"begin":100,"end":114}},"remediation_points":1620000,"other_locations":[{"path":"app/assets/javascripts/badges/store/mutations.js","lines":{"begin":85,"end":99}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 89**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0407713555d3e0c75813d9f23089bcfd","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/monitoring/services/monitoring_service.js","lines":{"begin":34,"end":41}},"remediation_points":1620000,"other_locations":[{"path":"app/assets/javascripts/monitoring/services/monitoring_service.js","lines":{"begin":48,"end":55}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 89**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d4a3e547360e709e6f65d844f47d2578","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/monitoring/services/monitoring_service.js","lines":{"begin":48,"end":55}},"remediation_points":1620000,"other_locations":[{"path":"app/assets/javascripts/monitoring/services/monitoring_service.js","lines":{"begin":34,"end":41}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 89**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d4a3e547360e709e6f65d844f47d2578","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":2,"end":14}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":27,"end":39}},{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":85,"end":97}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ac500b1ccac9075c6ed2fffbc9b3961c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":27,"end":39}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":2,"end":14}},{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":85,"end":97}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ac500b1ccac9075c6ed2fffbc9b3961c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":85,"end":97}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":2,"end":14}},{"path":"app/assets/javascripts/cycle_analytics/default_event_objects.js","lines":{"begin":27,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ac500b1ccac9075c6ed2fffbc9b3961c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":46,"end":57}},"remediation_points":1530000,"other_locations":[{"path":"app/assets/javascripts/pipelines/stores/pipelines_store.js","lines":{"begin":20,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 86**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ac70092b1281d03613501e7bff10586e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/stores/pipelines_store.js","lines":{"begin":20,"end":31}},"remediation_points":1530000,"other_locations":[{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":46,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 86**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d99660a2eda83bcadef8b0ab894abe34","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/badges/store/actions.js","lines":{"begin":28,"end":39}},"remediation_points":1500000,"other_locations":[{"path":"app/assets/javascripts/badges/store/actions.js","lines":{"begin":142,"end":153}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 85**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2d5915d3ead3c5d344920b58d2d29398","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/badges/store/actions.js","lines":{"begin":142,"end":153}},"remediation_points":1500000,"other_locations":[{"path":"app/assets/javascripts/badges/store/actions.js","lines":{"begin":28,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 85**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2d5915d3ead3c5d344920b58d2d29398","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":58,"end":62}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":78,"end":82}},{"path":"app/assets/javascripts/sidebar/stores/sidebar_store.js","lines":{"begin":77,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6bca973f7e7c682a30bc1ec4bf9bd764","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":78,"end":82}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":58,"end":62}},{"path":"app/assets/javascripts/sidebar/stores/sidebar_store.js","lines":{"begin":77,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6bca973f7e7c682a30bc1ec4bf9bd764","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/sidebar/stores/sidebar_store.js","lines":{"begin":77,"end":81}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":58,"end":62}},{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":78,"end":82}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0eb61104cf3e71a06f399141f9b4fa0d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":50,"end":53}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":139,"end":142}},{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":162,"end":165}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ab644c43df256102910e1758c76cc0b5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":139,"end":142}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":50,"end":53}},{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":162,"end":165}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ab644c43df256102910e1758c76cc0b5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":162,"end":165}},"remediation_points":600000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":50,"end":53}},{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":139,"end":142}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 55**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ab644c43df256102910e1758c76cc0b5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":22,"end":35}},"remediation_points":1410000,"other_locations":[{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":83,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 82**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"25ff43fa592634a300a75d479e7131a7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":83,"end":96}},"remediation_points":1410000,"other_locations":[{"path":"app/assets/javascripts/gl_dropdown.js","lines":{"begin":22,"end":35}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 82**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"25ff43fa592634a300a75d479e7131a7","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":85,"end":91}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":93,"end":99}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8761bbf2f2e7182d15c059e6eda61093","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":93,"end":99}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":85,"end":91}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"8761bbf2f2e7182d15c059e6eda61093","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/blob/show/index.js","lines":{"begin":13,"end":29}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/tree/show/index.js","lines":{"begin":24,"end":40}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"10512ee694664bf38a3b98f1983d771f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/tree/show/index.js","lines":{"begin":24,"end":40}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/blob/show/index.js","lines":{"begin":13,"end":29}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cacb4070042747bc39f22b6ed696d288","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":45,"end":51}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":59,"end":65}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14f5cdeb3ea2bd6b45456111559d4372","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":59,"end":65}},"remediation_points":1380000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":45,"end":51}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 81**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"14f5cdeb3ea2bd6b45456111559d4372","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":150,"end":154}},"remediation_points":1350000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":156,"end":160}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c9b1f08a21d96ed70ae569a5f20147b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":156,"end":160}},"remediation_points":1350000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":150,"end":154}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 80**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c9b1f08a21d96ed70ae569a5f20147b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":377,"end":382}},"remediation_points":1320000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":382,"end":387}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 79**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f7da63bef0b10cc1b2852a187aa6da7a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":382,"end":387}},"remediation_points":1320000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":377,"end":382}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 79**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f7da63bef0b10cc1b2852a187aa6da7a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":14,"end":14}},"remediation_points":1290000,"other_locations":[{"path":"app/assets/javascripts/monitoring/utils/multiple_time_series.js","lines":{"begin":8,"end":19}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 78**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c151b6404d32d859c90476abc53a459a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/monitoring/utils/multiple_time_series.js","lines":{"begin":8,"end":19}},"remediation_points":1290000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":14,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 78**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2e1258cb46a94d486ff0c217b7ee506b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/tree.js","lines":{"begin":78,"end":84}},"remediation_points":1260000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":81,"end":87}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 77**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5801c2247d4ab393293432462fbf849b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":81,"end":87}},"remediation_points":1260000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/tree.js","lines":{"begin":78,"end":84}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 77**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0b9486994211d1c4a0385b3c9ac7339f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":4,"end":14}},"remediation_points":1230000,"other_locations":[{"path":"app/assets/javascripts/droplab/hook_button.js","lines":{"begin":4,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ce9535c497280ac0f885dd216908adc4","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/hook_button.js","lines":{"begin":4,"end":14}},"remediation_points":1230000,"other_locations":[{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":4,"end":14}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5ee1687cc7901d1085a41d0b7d5b3730","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":84,"end":96}},"remediation_points":1230000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/file_templates/actions.js","lines":{"begin":53,"end":65}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0d9f79efa645b760bbea0b48922a8231","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/file_templates/actions.js","lines":{"begin":53,"end":65}},"remediation_points":1230000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":84,"end":96}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 76**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9033fca3ba0465c4cc79203ac97a67c6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/preview_markdown.js","lines":{"begin":197,"end":202}},"remediation_points":1200000,"other_locations":[{"path":"app/assets/javascripts/behaviors/preview_markdown.js","lines":{"begin":204,"end":209}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"46e2ef5ccb0e3676b035d790303474f6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/preview_markdown.js","lines":{"begin":204,"end":209}},"remediation_points":1200000,"other_locations":[{"path":"app/assets/javascripts/behaviors/preview_markdown.js","lines":{"begin":197,"end":202}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 75**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"46e2ef5ccb0e3676b035d790303474f6","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/reports/store/actions.js","lines":{"begin":61,"end":67}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":73,"end":79}},{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":56,"end":62}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f6738e3ca61bc9141c14aca35a4ece63","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":56,"end":62}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":73,"end":79}},{"path":"app/assets/javascripts/reports/store/actions.js","lines":{"begin":61,"end":67}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b0ce2389e2ef7f95bdab6dd30392133a","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":73,"end":79}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":56,"end":62}},{"path":"app/assets/javascripts/reports/store/actions.js","lines":{"begin":61,"end":67}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e577605dea8912ffd5b82ee2e188ec76","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":28,"end":40}},"remediation_points":1170000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":123,"end":133}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1825ad84d47a08c46a9dd2a4386db970","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":123,"end":133}},"remediation_points":1170000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/actions.js","lines":{"begin":28,"end":40}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 74**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1825ad84d47a08c46a9dd2a4386db970","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_util.js","lines":{"begin":61,"end":67}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_util.js","lines":{"begin":68,"end":74}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"40924a71c4587ae28cb080829b65871c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_util.js","lines":{"begin":68,"end":74}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_util.js","lines":{"begin":61,"end":67}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"40924a71c4587ae28cb080829b65871c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":7,"end":9}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":13,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ca3e7297c2c42380a6b34e26f5faa025","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":13,"end":15}},"remediation_points":1140000,"other_locations":[{"path":"app/assets/javascripts/test_utils/simulate_drag.js","lines":{"begin":7,"end":9}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 73**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ca3e7297c2c42380a6b34e26f5faa025","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/merge_request.js","lines":{"begin":22,"end":26}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/branch.js","lines":{"begin":26,"end":30}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5b01e7cc1ccdb5b45e44117d01906827","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/mutations/branch.js","lines":{"begin":26,"end":30}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/mutations/merge_request.js","lines":{"begin":22,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e8265ff476562ddb4bd141410d88ad2f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":12,"end":18}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":9,"end":15}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"33bcc15ccc0be1f4e4787d8882ad36e2","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":9,"end":15}},"remediation_points":1110000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":12,"end":18}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 72**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"931ead2443e997ee26d698667339fb06","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":222,"end":229}},"remediation_points":1080000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":237,"end":244}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"36bae5f12de5a60023e0fd8fc19f1842","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":237,"end":244}},"remediation_points":1080000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":222,"end":229}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"36bae5f12de5a60023e0fd8fc19f1842","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":71,"end":77}},"remediation_points":1080000,"other_locations":[{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":81,"end":87}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"47474e924fc42a7e0f1319c7a8ae13d3","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":81,"end":87}},"remediation_points":1080000,"other_locations":[{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":71,"end":77}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 71**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"aade96d11a83331446e70683959d49ec","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":381,"end":385}},"remediation_points":1050000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":418,"end":422}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 70**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fdc3dab0afea85797bddfc16706a3869","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":418,"end":422}},"remediation_points":1050000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":381,"end":385}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 70**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"fdc3dab0afea85797bddfc16706a3869","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/getters.js","lines":{"begin":80,"end":83}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/getters.js","lines":{"begin":84,"end":87}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"85e1a20133858d47a7f4a64e49080aef","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/getters.js","lines":{"begin":84,"end":87}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/getters.js","lines":{"begin":80,"end":83}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"85e1a20133858d47a7f4a64e49080aef","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/frequent_items/constants.js","lines":{"begin":18,"end":28}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/frequent_items/constants.js","lines":{"begin":29,"end":37}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c7c7576a99db4f904055a712b428b46","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/frequent_items/constants.js","lines":{"begin":29,"end":37}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/frequent_items/constants.js","lines":{"begin":18,"end":28}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c7c7576a99db4f904055a712b428b46","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups/index.js","lines":{"begin":79,"end":89}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/environments/folder/environments_folder_bundle.js","lines":{"begin":24,"end":34}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b80cd93182a7ed27e84c9e59840d8f01","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/environments/folder/environments_folder_bundle.js","lines":{"begin":24,"end":34}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/groups/index.js","lines":{"begin":79,"end":89}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2beaf3990d7c635f7339eb68a668c3a8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/file_templates/actions.js","lines":{"begin":9,"end":20}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/commit/actions.js","lines":{"begin":202,"end":213}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9441eb5a1202300a1a6bfdd0f0275a31","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/commit/actions.js","lines":{"begin":202,"end":213}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/file_templates/actions.js","lines":{"begin":9,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f657ac30a9ca0e466c504f33ae3363a1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":259,"end":264}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":264,"end":269}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"40a4102731fea710642a925d4403b398","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":264,"end":269}},"remediation_points":1020000,"other_locations":[{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":259,"end":264}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 69**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"40a4102731fea710642a925d4403b398","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diff_notes/services/resolve.js","lines":{"begin":56,"end":68}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/diff_notes/services/resolve.js","lines":{"begin":70,"end":82}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f5c966c3b72bce8578a3e8c47c412d39","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diff_notes/services/resolve.js","lines":{"begin":70,"end":82}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/diff_notes/services/resolve.js","lines":{"begin":56,"end":68}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f5c966c3b72bce8578a3e8c47c412d39","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":40,"end":45}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":46,"end":51}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5aa5f88f636432f3381edff9ce5eb33c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":46,"end":51}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/pipelines/mutations.js","lines":{"begin":40,"end":45}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5aa5f88f636432f3381edff9ce5eb33c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":207,"end":220}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":221,"end":234}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c3008559d14ec2056a4514ffdfd5d04b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":221,"end":234}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":207,"end":220}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c3008559d14ec2056a4514ffdfd5d04b","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes/stores/utils.js","lines":{"begin":16,"end":23}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1506,"end":1515}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"37585e488e2d24ae8b8b99880ff76099","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1506,"end":1515}},"remediation_points":990000,"other_locations":[{"path":"app/assets/javascripts/notes/stores/utils.js","lines":{"begin":16,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 68**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ea9f3aa39779bc4f5ead96ecdcd5e87c","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1526,"end":1566}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/commit/actions.js","lines":{"begin":103,"end":219}},{"path":"app/assets/javascripts/pages/search/init_filtered_search.js","lines":{"begin":3,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5306c1b3e6d8ac0ac9bed008b527b8a7","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/search/init_filtered_search.js","lines":{"begin":3,"end":23}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/modules/commit/actions.js","lines":{"begin":103,"end":219}},{"path":"app/assets/javascripts/notes.js","lines":{"begin":1526,"end":1566}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4dfd0fcaf710a6337c5924d7c4fa91ea","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/modules/commit/actions.js","lines":{"begin":103,"end":219}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1526,"end":1566}},{"path":"app/assets/javascripts/pages/search/init_filtered_search.js","lines":{"begin":3,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"71749d080c69b950423ce3e73b3671d6","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":44,"end":48}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/pages/milestones/shared/delete_milestone_modal_init.js","lines":{"begin":44,"end":48}},{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":39,"end":43}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"80bd962a66c5ba8f3bb261204e0e8404","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/milestones/shared/delete_milestone_modal_init.js","lines":{"begin":44,"end":48}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":39,"end":43}},{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":44,"end":48}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4dccfbb8118720c67894021eefaeb04f","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 3 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":39,"end":43}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/pages/milestones/shared/delete_milestone_modal_init.js","lines":{"begin":44,"end":48}},{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":44,"end":48}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"594be23bc97d64731abf2df62520ccd3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/clusters/services/clusters_service.js","lines":{"begin":6,"end":12}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":96,"end":102}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5b85961f2c362ae642ccf393b8352fcb","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":96,"end":102}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/clusters/services/clusters_service.js","lines":{"begin":6,"end":12}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cad81c7468728ba369f9f23c8a1271bc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":91,"end":93}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":172,"end":174}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"beda25571cf3ea070a68d9cdfae91c8d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":172,"end":174}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions/file.js","lines":{"begin":91,"end":93}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"beda25571cf3ea070a68d9cdfae91c8d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/target_branch_dropdown.js","lines":{"begin":48,"end":53}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js","lines":{"begin":63,"end":67}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"575f1444e3c2fec5a4f47d049cbd87c0","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js","lines":{"begin":63,"end":67}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/target_branch_dropdown.js","lines":{"begin":48,"end":53}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5e4303b5381a6be7bcaade373d766f34","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":35,"end":42}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":50,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1d8b266328571b1177e922384e474eb5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/u2f/authenticate.js","lines":{"begin":50,"end":57}},"remediation_points":960000,"other_locations":[{"path":"app/assets/javascripts/u2f/register.js","lines":{"begin":35,"end":42}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 67**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"334a900ffecf98fb6a951456c58236a1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":181,"end":183}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":290,"end":292}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"32fbc7cab878611e7f156798ae3d2bca","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":290,"end":292}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":181,"end":183}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"32fbc7cab878611e7f156798ae3d2bca","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":50,"end":56}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":57,"end":63}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c14eefb5c2db69bb969956efd4384de","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":57,"end":63}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/project.js","lines":{"begin":50,"end":56}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2c14eefb5c2db69bb969956efd4384de","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":277,"end":286}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":287,"end":296}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"923d82c4da880c23e929c2402aedd37e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":287,"end":296}},"remediation_points":930000,"other_locations":[{"path":"app/assets/javascripts/search_autocomplete.js","lines":{"begin":277,"end":286}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 66**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"923d82c4da880c23e929c2402aedd37e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/blob/blob_fork_suggestion.js","lines":{"begin":31,"end":34}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/blob/blob_fork_suggestion.js","lines":{"begin":56,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"938856cdef6ef5aa2933db645ea96362","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/blob/blob_fork_suggestion.js","lines":{"begin":56,"end":59}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/blob/blob_fork_suggestion.js","lines":{"begin":31,"end":34}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"938856cdef6ef5aa2933db645ea96362","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/index.js","lines":{"begin":30,"end":39}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/mr_notes/index.js","lines":{"begin":66,"end":75}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b35237501aeed21f2d38aef31627b97e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/mr_notes/index.js","lines":{"begin":66,"end":75}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/diffs/index.js","lines":{"begin":30,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"17da47f3678555baddd89ae6622e441f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":18,"end":31}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":33,"end":46}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a93d28498cd20f4d35a3f8dbbc0a7a35","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":33,"end":46}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/lib/utils/datetime_utility.js","lines":{"begin":18,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a93d28498cd20f4d35a3f8dbbc0a7a35","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":237,"end":241}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":340,"end":344}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"785078efeabfa8c98aa5bf0804b2619d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":340,"end":344}},"remediation_points":870000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":237,"end":241}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 64**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"785078efeabfa8c98aa5bf0804b2619d","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/utils.js","lines":{"begin":112,"end":122}},"remediation_points":840000,"other_locations":[{"path":"app/assets/javascripts/ide/lib/diff/controller.js","lines":{"begin":6,"end":16}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 63**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"09d7d5a8cacd9d95c32bc8b4e6b53930","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/lib/diff/controller.js","lines":{"begin":6,"end":16}},"remediation_points":840000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/utils.js","lines":{"begin":112,"end":122}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 63**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f94a7934b1c80152deb5b61a0c5db3d4","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/api.js","lines":{"begin":118,"end":124}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/api.js","lines":{"begin":126,"end":132}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"104c7ee7f9a45a32c42bacfaa5a5f1bc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/api.js","lines":{"begin":126,"end":132}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/api.js","lines":{"begin":118,"end":124}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"104c7ee7f9a45a32c42bacfaa5a5f1bc","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/comment_type_toggle.js","lines":{"begin":37,"end":46}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/comment_type_toggle.js","lines":{"begin":48,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1f17e867f83499d67ff9ed50b8097db5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/comment_type_toggle.js","lines":{"begin":48,"end":57}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/comment_type_toggle.js","lines":{"begin":37,"end":46}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1f17e867f83499d67ff9ed50b8097db5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/pipeline_details_bundle.js","lines":{"begin":77,"end":84}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/jobs/job_details_bundle.js","lines":{"begin":27,"end":34}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c4a434df3787893bc1f6d897464a8227","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/job_details_bundle.js","lines":{"begin":27,"end":34}},"remediation_points":810000,"other_locations":[{"path":"app/assets/javascripts/pipelines/pipeline_details_bundle.js","lines":{"begin":77,"end":84}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 62**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5c1f719b9039c86ffdc704317d783449","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":20,"end":24}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":17,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ab079e1e6bc28e1fc184b520beb34531","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js","lines":{"begin":17,"end":21}},"remediation_points":780000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/labels/index/index.js","lines":{"begin":20,"end":24}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 61**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e7369e08c5971c04639cff93271173af","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":56,"end":59}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":61,"end":64}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1ad13a005d315ccf15cfe0584579158f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":61,"end":64}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/notes/stores/mutations.js","lines":{"begin":56,"end":59}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1ad13a005d315ccf15cfe0584579158f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":107,"end":111}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":113,"end":117}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c9228663eecdf0fc1a8dbd811c863e38","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":113,"end":117}},"remediation_points":750000,"other_locations":[{"path":"app/assets/javascripts/pages/sessions/new/username_validator.js","lines":{"begin":107,"end":111}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 60**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c9228663eecdf0fc1a8dbd811c863e38","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/hook_button.js","lines":{"begin":33,"end":36}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/landing.js","lines":{"begin":18,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"0cdcc38394199ec6567937ce812cb5a5","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/landing.js","lines":{"begin":18,"end":21}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/droplab/hook_button.js","lines":{"begin":33,"end":36}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6b06657bea1bfe588af0efba4a2bf57e","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":26,"end":31}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":34,"end":39}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1f5e585cdfd268a3748dbdd584f69df8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":34,"end":39}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":26,"end":31}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"67d77d7b888d52cac1d666c6a95ba502","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/tree.js","lines":{"begin":38,"end":46}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/tree.js","lines":{"begin":49,"end":57}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"16eb34236a934fb101dbe1e8b6ab4af1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/tree.js","lines":{"begin":49,"end":57}},"remediation_points":720000,"other_locations":[{"path":"app/assets/javascripts/tree.js","lines":{"begin":38,"end":46}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 59**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"16eb34236a934fb101dbe1e8b6ab4af1","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":191,"end":203}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":236,"end":248}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"13f117af1725bb929e7aa63491a25429","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":236,"end":248}},"remediation_points":690000,"other_locations":[{"path":"app/assets/javascripts/merge_conflicts/merge_conflict_store.js","lines":{"begin":191,"end":203}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 58**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"13f117af1725bb929e7aa63491a25429","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups/groups_filterable_list.js","lines":{"begin":7,"end":16}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":238,"end":247}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2a553868b7fea8b08596f9a95a22d484","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/utils.js","lines":{"begin":238,"end":247}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/groups/groups_filterable_list.js","lines":{"begin":7,"end":16}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"12bd1fc0fd53a6c025f6ed5d690be133","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/admin/application_settings/usage_ping_payload.js","lines":{"begin":45,"end":49}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/pages/admin/application_settings/usage_ping_payload.js","lines":{"begin":51,"end":55}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e7e7f0899a668845138c08c503e337fe","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/admin/application_settings/usage_ping_payload.js","lines":{"begin":51,"end":55}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/pages/admin/application_settings/usage_ping_payload.js","lines":{"begin":45,"end":49}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e7e7f0899a668845138c08c503e337fe","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js","lines":{"begin":8,"end":11}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js","lines":{"begin":13,"end":16}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"21bb124a570e4088d0684442dade767f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js","lines":{"begin":13,"end":16}},"remediation_points":660000,"other_locations":[{"path":"app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js","lines":{"begin":8,"end":11}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 57**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"21bb124a570e4088d0684442dade767f","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":20,"end":26}},"remediation_points":630000,"other_locations":[{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":40,"end":46}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d22f4f9ddac4d361d9f6721a25ded899","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":40,"end":46}},"remediation_points":630000,"other_locations":[{"path":"app/assets/javascripts/namespace_select.js","lines":{"begin":20,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d22f4f9ddac4d361d9f6721a25ded899","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":103,"end":116}},"remediation_points":630000,"other_locations":[{"path":"app/assets/javascripts/ide/constants.js","lines":{"begin":43,"end":56}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"d9ad4d62a2c7b3a5ee02495f81a78cd8","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/constants.js","lines":{"begin":43,"end":56}},"remediation_points":630000,"other_locations":[{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":103,"end":116}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 56**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"b9bd1f7a0fafe178e70f6a652d6fd8be","severity":"major","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_conflicts/components/diff_file_editor.js","lines":{"begin":13,"end":26}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js","lines":{"begin":8,"end":21}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"423d5a0cc874e941bd22657b325446b4","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js","lines":{"begin":8,"end":21}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/merge_conflicts/components/diff_file_editor.js","lines":{"begin":13,"end":26}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"716df5a6c1cbc00338163aa638130bca","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":436,"end":441}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":452,"end":457}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5a2cd4548ee8c0362f69cc88ee5982c0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":452,"end":457}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":436,"end":441}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5a2cd4548ee8c0362f69cc88ee5982c0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":214,"end":221}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/pages/search/init_filtered_search.js","lines":{"begin":13,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e71451918dac542ee62e859e4a694a23","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/search/init_filtered_search.js","lines":{"begin":13,"end":20}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":214,"end":221}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6696916f5ca830f21733956d3dc83b22","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":45,"end":49}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":50,"end":54}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"723e924a871cea3a66a3ccd49f2f4407","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":50,"end":54}},"remediation_points":570000,"other_locations":[{"path":"app/assets/javascripts/prometheus_metrics/prometheus_metrics.js","lines":{"begin":45,"end":49}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 54**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"723e924a871cea3a66a3ccd49f2f4407","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":97,"end":102}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":103,"end":108}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"38cb87a7a94d43c42903f71cfd248953","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":103,"end":108}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":97,"end":102}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"38cb87a7a94d43c42903f71cfd248953","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":125,"end":129}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":150,"end":153}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"77fe9230b5c1c681ca23dd48b5bde881","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":150,"end":153}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/projects/project_new.js","lines":{"begin":125,"end":129}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"77fe9230b5c1c681ca23dd48b5bde881","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/reports/store/utils.js","lines":{"begin":39,"end":42}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/reports/store/utils.js","lines":{"begin":44,"end":47}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6369d3d651e38cbbac285afad5297e9d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/reports/store/utils.js","lines":{"begin":44,"end":47}},"remediation_points":540000,"other_locations":[{"path":"app/assets/javascripts/reports/store/utils.js","lines":{"begin":39,"end":42}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 53**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"6369d3d651e38cbbac285afad5297e9d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":108,"end":111}},"remediation_points":510000,"other_locations":[{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":113,"end":116}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 52**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2b8d07121aa08a0ef9af946ea4e5d60d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":113,"end":116}},"remediation_points":510000,"other_locations":[{"path":"app/assets/javascripts/clusters/clusters_bundle.js","lines":{"begin":108,"end":111}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 52**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2b8d07121aa08a0ef9af946ea4e5d60d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/zen_mode.js","lines":{"begin":42,"end":45}},"remediation_points":510000,"other_locations":[{"path":"app/assets/javascripts/zen_mode.js","lines":{"begin":46,"end":49}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 52**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1c224ff513833f281d7bb58fb1280314","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/zen_mode.js","lines":{"begin":46,"end":49}},"remediation_points":510000,"other_locations":[{"path":"app/assets/javascripts/zen_mode.js","lines":{"begin":42,"end":45}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 52**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1c224ff513833f281d7bb58fb1280314","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions.js","lines":{"begin":133,"end":136}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions.js","lines":{"begin":144,"end":147}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5e09ce34a63a712c502dfcaa775c5a8e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/ide/stores/actions.js","lines":{"begin":144,"end":147}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/ide/stores/actions.js","lines":{"begin":133,"end":136}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5e09ce34a63a712c502dfcaa775c5a8e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":120,"end":123}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":128,"end":131}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5dcf5b9ed09acddcf34d9b99f4f7d4e0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":128,"end":131}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/network/branch_graph.js","lines":{"begin":120,"end":123}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5dcf5b9ed09acddcf34d9b99f4f7d4e0","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/projects/tree/services/commit_pipeline_service.js","lines":{"begin":3,"end":11}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/jobs/services/job_service.js","lines":{"begin":3,"end":11}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"020d87eef79dcc6d4979a4877f795e88","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/services/job_service.js","lines":{"begin":3,"end":11}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/projects/tree/services/commit_pipeline_service.js","lines":{"begin":3,"end":11}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"7f3c54ba927268843f9fe397b30c4541","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/star.js","lines":{"begin":19,"end":23}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/star.js","lines":{"begin":23,"end":27}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cc2a5b7fe6f4a900c4690f4960b1d2ce","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/star.js","lines":{"begin":23,"end":27}},"remediation_points":480000,"other_locations":[{"path":"app/assets/javascripts/star.js","lines":{"begin":19,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 51**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cc2a5b7fe6f4a900c4690f4960b1d2ce","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":102,"end":104}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/boards/stores/modal_store.js","lines":{"begin":71,"end":74}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"e9ffa7b55a2d3d697297bb9c77d9e0c8","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/stores/modal_store.js","lines":{"begin":71,"end":74}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/groups/store/groups_store.js","lines":{"begin":102,"end":104}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"cae962d929e29ddbbe69117801f17860","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/groups/issues/index.js","lines":{"begin":6,"end":13}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/pages/groups/merge_requests/index.js","lines":{"begin":6,"end":13}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"65a33b3fe4ae20436c9fb46d65d9db04","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/groups/merge_requests/index.js","lines":{"begin":6,"end":13}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/pages/groups/issues/index.js","lines":{"begin":6,"end":13}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1b0f3dfb819efd869e74a58517390763","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":55,"end":58}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":51,"end":54}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ed657cc5e6969316c8bd1d2be6204668","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/job_details_mediator.js","lines":{"begin":51,"end":54}},"remediation_points":450000,"other_locations":[{"path":"app/assets/javascripts/pipelines/pipeline_details_mediator.js","lines":{"begin":55,"end":58}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 50**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3da1a06772dc32dbbb550900c97f6cbd","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":125,"end":130}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":154,"end":159}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f6c22427e43838beefc533b33cde9955","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":154,"end":159}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":125,"end":130}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"f6c22427e43838beefc533b33cde9955","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/deploy_keys/service/index.js","lines":{"begin":15,"end":18}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/deploy_keys/service/index.js","lines":{"begin":20,"end":23}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5eaf7d9cd8339dca959f74f384e02906","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/deploy_keys/service/index.js","lines":{"begin":20,"end":23}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/deploy_keys/service/index.js","lines":{"begin":15,"end":18}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5eaf7d9cd8339dca959f74f384e02906","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":146,"end":148}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":250,"end":252}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"70155684217b5724087f40626f7766bc","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":250,"end":252}},"remediation_points":420000,"other_locations":[{"path":"app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js","lines":{"begin":146,"end":148}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 49**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"70155684217b5724087f40626f7766bc","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":134,"end":137}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":138,"end":141}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"180e35eb524273ddfc92de366020a611","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":138,"end":141}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/behaviors/markdown/copy_as_gfm.js","lines":{"begin":134,"end":137}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"180e35eb524273ddfc92de366020a611","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issuable_bulk_update_sidebar.js","lines":{"begin":100,"end":106}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/issuable_bulk_update_sidebar.js","lines":{"begin":117,"end":123}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"672a79b04a463defdd46c0086474fd52","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/issuable_bulk_update_sidebar.js","lines":{"begin":117,"end":123}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/issuable_bulk_update_sidebar.js","lines":{"begin":100,"end":106}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"672a79b04a463defdd46c0086474fd52","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":66,"end":69}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":146,"end":149}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4ebfab6abe3fb873067f7b37190c9136","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":146,"end":149}},"remediation_points":390000,"other_locations":[{"path":"app/assets/javascripts/jobs/store/actions.js","lines":{"begin":66,"end":69}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 48**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"4ebfab6abe3fb873067f7b37190c9136","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":46,"end":53}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":60,"end":67}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"10bdf4c525726570be1c10982443983e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":60,"end":67}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/droplab/hook_input.js","lines":{"begin":46,"end":53}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"10bdf4c525726570be1c10982443983e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/dropdown_hint.js","lines":{"begin":75,"end":77}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/dropdown_user.js","lines":{"begin":78,"end":80}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"223d4160dbc2f173c7019bf4258bf71a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/dropdown_user.js","lines":{"begin":78,"end":80}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/dropdown_hint.js","lines":{"begin":75,"end":77}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2f69c39865bb0c31ba27242592efb90a","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1451,"end":1457}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1459,"end":1465}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"06432a7535afbcbc307fe2c2fad49f03","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/notes.js","lines":{"begin":1459,"end":1465}},"remediation_points":360000,"other_locations":[{"path":"app/assets/javascripts/notes.js","lines":{"begin":1451,"end":1457}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 47**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"06432a7535afbcbc307fe2c2fad49f03","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":63,"end":66}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":423,"end":426}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3cf8b42abcd81551bbf1d4b6a86a23ec","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":423,"end":426}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/create_merge_request_dropdown.js","lines":{"begin":63,"end":66}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"3cf8b42abcd81551bbf1d4b6a86a23ec","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":223,"end":224}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":564,"end":565}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9b59a169ec24710bb17e53176d9f6484","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/filtered_search/filtered_search_manager.js","lines":{"begin":564,"end":565}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js","lines":{"begin":223,"end":224}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"629f61554a8bb6a8eb033206d609a01e","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_form.js","lines":{"begin":93,"end":95}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/gl_form.js","lines":{"begin":96,"end":98}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a37da012d8b9134f9c2c07cbe6e5df45","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/gl_form.js","lines":{"begin":96,"end":98}},"remediation_points":330000,"other_locations":[{"path":"app/assets/javascripts/gl_form.js","lines":{"begin":93,"end":95}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 46**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a37da012d8b9134f9c2c07cbe6e5df45","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":48,"end":52}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":68,"end":72}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ad4849cc4103d257a75a53f533f93f88","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":68,"end":72}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/boards/models/issue.js","lines":{"begin":48,"end":52}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"ad4849cc4103d257a75a53f533f93f88","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/project.js","lines":{"begin":1,"end":6}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/boards/models/milestone.js","lines":{"begin":1,"end":6}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"63e808e699724c7876463b889a910d69","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/boards/models/milestone.js","lines":{"begin":1,"end":6}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/boards/models/project.js","lines":{"begin":1,"end":6}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2d888235869b541141524699d46a10fe","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":142,"end":143}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":139,"end":139}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"a5d03fc520fddde3ecc4ff06b86c9a0d","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/diffs/store/actions.js","lines":{"begin":139,"end":139}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/diffs/store/mutations.js","lines":{"begin":142,"end":143}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"5a0bd2adf62a695699f94e1cef624dd7","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":73,"end":76}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":78,"end":81}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1dc35d639071fed3c333a47b9c544d56","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":78,"end":81}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/merge_request_tabs.js","lines":{"begin":73,"end":76}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"1dc35d639071fed3c333a47b9c544d56","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":234,"end":240}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":260,"end":266}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c9f4b3f70b4ef899508948c84a381a89","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":260,"end":266}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/pages/users/activity_calendar.js","lines":{"begin":234,"end":240}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"c9f4b3f70b4ef899508948c84a381a89","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/protected_tags/protected_tag_edit.js","lines":{"begin":16,"end":20}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/protected_branches/protected_branch_edit.js","lines":{"begin":24,"end":28}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"2d44f8e3653f3f06777c422f4151a7d3","severity":"minor","engine_name":"duplication"},{"type":"issue","check_name":"similar-code","description":"Similar blocks of code found in 2 locations. Consider refactoring.","categories":["Duplication"],"location":{"path":"app/assets/javascripts/protected_branches/protected_branch_edit.js","lines":{"begin":24,"end":28}},"remediation_points":300000,"other_locations":[{"path":"app/assets/javascripts/protected_tags/protected_tag_edit.js","lines":{"begin":16,"end":20}}],"content":{"body":"## Duplicated Code\n\nDuplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:\n\n> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.\n\nWhen you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).\n\n## Tuning\n\n**This issue has a mass of 45**.\n\nWe set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.\n\nThe threshold configuration represents the minimum [mass](https://docs.codeclimate.com/docs/duplication#mass) a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.\n\nIf the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.\n\nSee [`codeclimate-duplication`'s documentation](https://docs.codeclimate.com/docs/duplication) for more information about tuning the mass threshold in your `.codeclimate.yml`.\n\n## Refactorings\n\n* [Extract Method](http://sourcemaking.com/refactoring/extract-method)\n* [Extract Class](http://sourcemaking.com/refactoring/extract-class)\n* [Form Template Method](http://sourcemaking.com/refactoring/form-template-method)\n* [Introduce Null Object](http://sourcemaking.com/refactoring/introduce-null-object)\n* [Pull Up Method](http://sourcemaking.com/refactoring/pull-up-method)\n* [Pull Up Field](http://sourcemaking.com/refactoring/pull-up-field)\n* [Substitute Algorithm](http://sourcemaking.com/refactoring/substitute-algorithm)\n\n## Further Reading\n\n* [Don't Repeat Yourself](http://c2.com/cgi/wiki?DontRepeatYourself) on the C2 Wiki\n* [Duplicated Code](http://sourcemaking.com/refactoring/duplicated-code) on SourceMaking\n* [Refactoring: Improving the Design of Existing Code](http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) by Martin Fowler. _Duplicated Code_, p76\n"},"fingerprint":"9ff0344a1b63248724d8413b03573b43","severity":"minor","engine_name":"duplication"},{"categories":["Security"],"check_name":"Insecure Dependency","content":{"body":"**Advisory**: CVE-2018-1000211\n\n**URL**: https://blog.justinbull.ca/cve-2018-1000211-public-apps-cant-revoke-tokens-in-doorkeeper/\n\n**Solution**: upgrade to >= 4.4.0, >= 5.0.0.rc2"},"description":"Doorkeeper gem does not revoke token for public clients","location":{"path":"Gemfile.lock","lines":{"begin":173,"end":173}},"remediation_points":5000000,"severity":"minor","type":"Issue","fingerprint":"13e50c564110ecb5eba441004fe52261","engine_name":"bundler-audit"},{"categories":["Security"],"check_name":"Insecure Dependency","content":{"body":"**Advisory**: CVE-2018-3769\n\n**URL**: https://github.com/ruby-grape/grape/issues/1762\n\n**Solution**: upgrade to >= 1.1.0"},"description":"ruby-grape Gem has XSS via \"format\" parameter","location":{"path":"Gemfile.lock","lines":{"begin":346,"end":346}},"remediation_points":5000000,"severity":"minor","type":"Issue","fingerprint":"ac6d981abbf80f299374d5a1081c7d66","engine_name":"bundler-audit"}]
diff --git a/spec/fixtures/codequality/codequality.json.gz b/spec/fixtures/codequality/codequality.json.gz
new file mode 100644
index 00000000000..f04ec0065b4
--- /dev/null
+++ b/spec/fixtures/codequality/codequality.json.gz
Binary files differ
diff --git a/spec/fixtures/emails/merge_request_multiple_patches.eml b/spec/fixtures/emails/merge_request_multiple_patches.eml
new file mode 100644
index 00000000000..311b99a525d
--- /dev/null
+++ b/spec/fixtures/emails/merge_request_multiple_patches.eml
@@ -0,0 +1,181 @@
+From: "Jake the Dog" <jake@adventuretime.ooo>
+To: incoming+gitlabhq/gitlabhq+merge-request+auth_token@appmail.adventuretime.ooo
+Subject: new-branch-with-a-patch
+Date: Wed, 31 Oct 2018 17:27:52 +0100
+X-Mailer: MailMate (1.12r5523)
+Message-ID: <7BE7C2E6-F0D9-4C85-9F55-B2A4BA01BFEC@gitlab.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_="
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+
+This applies nicely to a branch freshly created from the root-ref
+
+The other attachments in this email are ignored
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment;
+ filename=0002-This-does-not-apply-to-the-feature-branch.patch
+Content-Transfer-Encoding: quoted-printable
+
+=46rom 00c68c2b4f954370ce82a1162bc29c13f524897e Mon Sep 17 00:00:00 2001
+From: Patch user <patchuser@gitlab.org>
+Date: Mon, 22 Oct 2018 11:05:48 +0200
+Subject: [PATCH] This does not apply to the `feature` branch
+
+---
+ files/ruby/feature.rb | 5 +++++
+ 1 file changed, 5 insertions(+)
+ create mode 100644 files/ruby/feature.rb
+
+diff --git a/files/ruby/feature.rb b/files/ruby/feature.rb
+new file mode 100644
+index 0000000..fef26e4
+--- /dev/null
++++ b/files/ruby/feature.rb
+@@ -0,0 +1,5 @@
++class Feature
++ def bar
++ puts 'foo'
++ end
++end
+-- =
+
+2.19.1
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment; filename=0001-A-commit-from-a-patch.patch
+Content-Transfer-Encoding: quoted-printable
+
+=46rom 3fee0042e610fb3563e4379e316704cb1210f3de Mon Sep 17 00:00:00 2001
+From: Patch user <patchuser@gitlab.org>
+Date: Thu, 18 Oct 2018 13:40:35 +0200
+Subject: [PATCH] A commit from a patch
+
+---
+ README | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/README b/README
+index 3742e48..e40a3b9 100644
+--- a/README
++++ b/README
+@@ -1 +1,3 @@
+ Sample repo for testing gitlab features
++
++This was applied in a patch!
+-- =
+
+2.19.1
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment; filename=really-not-a-patch.png
+Content-Type: image/png
+Content-Transfer-Encoding: base64
+
+iVBORw0KGgoAAAANSUhEUgAAAjMAAAAfCAYAAAASo0ymAAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFj
+YGAqSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxK
+8/x506a1fP4WNq+ZclYlOrj1gQF3SmpxMgMDIweQnZxSnJwLZOcA2TrJBUUlQPYMIFu3vKQAxD4B
+ZIsUAR0IZN8BsdMh7A8gdhKYzcQCVhMS5AxkSwDZAkkQtgaInQ5hW4DYyRmJKUC2B8guiBvAgNPD
+RcHcwFLXkYC7SQa5OaUwO0ChxZOaFxoMcgcQyzB4MLgwKDCYMxgwWDLoMjiWpFaUgBQ65xdUFmWm
+Z5QoOAJDNlXBOT+3oLQktUhHwTMvWU9HwcjA0ACkDhRnEKM/B4FNZxQ7jxDLX8jAYKnMwMDcgxBL
+msbAsH0PA4PEKYSYyjwGBn5rBoZt5woSixLhDmf8xkKIX5xmbARh8zgxMLDe+///sxoDA/skBoa/
+E////73o//+/i4H2A+PsQA4AJHdp4IxrEg8AAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8
+eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQu
+MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1y
+ZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg
+ICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAg
+ICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjU2MzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAg
+ICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zMTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAg
+IDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpZ5vHZAAAS+ElE
+QVR4Ae2cC1QUV5rH/xnA1uZli02MiEHQqBMdTGB8ZIniA5xgfCTRycb1rBmdTHJGJ+toPBtzzGg2
+Rs3LdVTOYhKMcDgmDNHVNXKiGKJINCoqiXpUEFdB0CDKCtrSYp/Zr6q7muqmu+pWd7XgnFtH6Xrc
++h6/+92qr+69VQ9dqrvxd/CFE+AEOAFOgBPgBDiBB5TALx5Qu7nZnAAnwAlwApwAJ8AJiAR4MsMD
+gRPgBDgBToAT4AQeaAI8mXmgq48bzwlwApwAJ8AJcAI8meExwAlwApwAJ8AJcAIPNAGezDzQ1ceN
+5wQ4AU6AE+AEOIFgTwiamls87eb7OAFOgBPgBDgBToAT0I1ARHhXXWTxnhldMHIhnAAnwAlwApwA
+J9BRBIL+vOjfl7srt969577L63Zj1VGU/liHHn1j0I0xNbI1X8TRo5V4yNQLEQbGk7xawH6go/Sy
+W8hLBoqAL3EaKFtY5doaz6PkwCk8FN0H3f1oJx0d93r5wcpN13K2RhzbX4KKn4FH+vSAx65sXRX+
+YwgTYq5k72FUXqzChaoq1DQGI7Z3dwT6ai/oPbj/OJoNDyM6IsRvmL74odTe9LbPbwc7gQCDQZ9W
+5VFK0co52FKp7OW0N9di6sAI1B//G7YU3kHvEb+Gyah8jnTUWncYWdm7kf7GWrz0eIS0O+C/HaVX
+P8dsqPphL07dicFvxg6BQT/BnVSSfv76EqcdDcVafww5X1A7iRmGR/1oJ+pxrx9nT8z08sOT7IDv
+s9YiPzcf10InImlkfy9tLrD8Au5jABRY6w8j56vdbZIFfslxCG/bE5A1Idazqc2EpUVj/cwhfuvw
+xQ+l9qa3fX47eN8EWFC4cj4KKgdjadZiJATg5uUxUQ6JiEGYOQpm8X9bhiLtC4MRIcH2PCg4RBjv
+Mml7YgkOFRFGhnrMpQKHt6P06ubRbZzIy8f2radxVzeZnVmQfv76FKcdjSa4i2hBiL/NRDXu9ePs
+EZlefngUHuCdQcF0daOlRxcEeVUVYH5e9XbeA8aEF/HZZ5vw2Zo/wSyYqchPRz8csdbD70Zjt8kn
+P5Tam8726Ugu4KJaxam4TWixBUaVx8tk6vx3kSrps57HqtdWosI8Ge9/8BylMV4WR0u32WwICvLe
+7IWzjQnP4vPPn/UiKHC7O0qvfh4ZYOxB0lpCYb/N6Se5c0oKgL8a4rRjmNhATUhsQwblZsRsnnrc
+B4Az9PeD2eH7XjAQ/O67E7orFG8Dxm5iMnhNd+n3T6BWP9Tb2/2zvTNpkgb9PCYdOhjKINcxf4Y6
+YJQSquoTxdiVl4eTtwWrYjDzzYVIGyg+0zjNrC3NQ27JFUREGGC1Av/04qsY0ad9f1PD6d3IzdmJ
+k9cs4rlh5niMmTIL01PinLK0rHSE3trSTfikBMhIj8P3m5W5NJwrxqfr81AhsgP6Jk3GnDnP4VEp
+c7ReRM7H2agjpytqBM+/wZqPz0CA2NJiQMYfX8eIXu05KjFqvnwCuwv34shPZ3DNofexpIl4/l+m
+Y6BJ+13U7u9djEg0YR91L4sXL/MwzF/4KpJktjHp1eyvFee+244tW3ejWvTFiMeSnsZvZ09HQrir
+LyxxqsRNOsbkBxXWEgdV1D7WZhfjlqAkNgWzUyRtvv2qxr1mzmx2sPqhGvcOdZarJ1CwaQv2VV4X
+94TFDsfLf/ydS1wJB1iuG1rqw6He+0+A+Kn5a71cgjXritB7yh8oRmJl9jWh6JN1KL07DAvmP2vv
+UaKjavIEAbpykVnEssoaB6zl3HU2nP4auTsO42ZECt6YPzFgQ12q7c3dMMe2N/tY6s2LSI+7Wfhp
+iQO97fNotIadHoeZvJ3veluQSgk30Vps2ZiHq/1SkJ4UY99enYlz9lxEKmj/peLW+gqcPFWOmtuU
+0bgttqvFWPxRPiUyQHLaRExKG47elgvYlV2KZreymjbvs96WhjpUV5YiK1OZS/PpfCxebU9kho4Z
+h6eGRKH62E4sn7cOl5x4gtDFEEFJYATCRKe7wWAwiNuRkeHahvgc0Kr3rseuQ5QQ9R6MVOKcOiQG
+Fcd2Y/XCNahy6mUnbPf3CAookemWNA6TxsQD18qxYckK/CirODa9Wvy1onTDIqzOFRKZKKRmTEb6
+mEdFX0ovOLI00Q2NcariOpsf1InGGAe1peuwQkxkYpA+dSKG3iil+TKlKlYwHFaMey2cGXRREVY/
+2OKebsRVuzFvyXoxkXlsFF0PxgzGrZojFFeLcLih7fGK9brBWh/tvPX4tQr9+bH4a+gRjZZrtdj3
+5X40ygy1XS7DlkMXUA26Vjj2s8gTivrMRabfl1XWOGAt525D7Q+b6H6yDScrDXj+n1MDlsg49Sq2
+N2cp54o3+1jrzSlIZYWVH2sc6G2fivlMhxl6ZpjkIPmltzAvvb9Y+Fdb3sZHRRdwsqYJA2mSsLTE
+pMzCEnratF38Gr9/Z5u02+XXevOmuJ3+xgc0OdjRNTHzFTQ3W30OxI7SKziizMWC4vzdor8zaEJ1
+hshqFp7c/DY27C/H1oM1WDiWnrwMsXhp0WIqZ0PhX15BQcsYzKMnL+H27OvSf+p7WPVCNHo5ey5e
+xIQ9H2LpF2dw4mITEmT1pkVH34w/4Z0ZT4in/Lr3Oiz/ohyFJeeROMkeG0x6NfhrOVeI7GOUNZvH
+YcWqWYhxZNy/faEGV++1J6RcH+yeMvkhE6es9woKs8updBTmf/guknrS6uSn8Om/LcNBeT4mk8ey
+qhr3Gjiz6ANY/WCMe+rf2/Gf+aQ6CnNXrUZKL3vlPjehGAvezkPWl98jef5ocS6L1uuGcn3IvDUM
+wpLPN8l2yFZ158for3EQpowyYsOhYpRdnoE0R+/22ZLvROOmpSU75vcwypO5xMxFdo7vq6xxwFqu
+zZKudOuoKs2iB4QjQOhwLP/gtbae7rZiuq6ptjeZNmX7tNebTLSHVe38lOPAP/vY35X24IrCLt2S
+mcRf9XOq6ZtIs8iLahHipc/Aamt1lm2/Yp/auicnE5HPP4PEuBiYzCaEh0tjLu3PYN3TEXoVuViq
+cbyGrDdPxNOy5CHp2QyE7f8UNxvc72RW2Mm1ihOA29+qWUlQfmR6BIaLJ1D4zQn878+30KVLF9xt
+qGcX0K6k0J1jRMYEeyIjHH40JR19KZmpOHwSFkpmhBrUplfd35qfjguqkD57ijOREbaDwmNpsLP9
+olgf7Yt73aPND0BRr+UmLguaaHhxmJDICEtQLMZNiMfBHRfs2378VY57QbA6Zyb1rH6wxr3lOs6K
+TeA6DnyTgzN37deGLtRHKw7FVV+B0Plrf0NG23VDsT6YnJUX0osfu79Dxv8GOLQNRSWVSBPe2rHV
+YB9dc4HhGDHQca3UxM/uj75c5Iw8rDPHgdbrJA3Hf/UBVogqB2P5XymR8Tys4MEo/3eptzcV+3yo
+N0WrWTnLhCjGgT/2hfbDw/7fymWWtq3qkMwIN7EYmGXzLIK62qentkJ7Dmbsn46Zo05Rd+kZFGyk
+/w5bU//1Lcwa21/hjYI2p3xZ018vAxdqYOK3D4mXS1sLN6M3OVFRXUe3mUEuPTDSJCqX8j44fLqA
+es8KhYsf5VKx8TCRIS3/d8cHSfJTTOguD1RbM3V5uy5a9ar5GxxiT+mMXdVCmaE+XE1V3GL3g0Gv
+ozLND0e7xMG9VuHc+7OocWaygtUPKscU91KQmyktratDg8yIoQPiYe1pdvJib78M9SHTw7qqJz8w
++GtIGIHU0G2UwBSjlpIZ0/mDKCNj+05NRS/JaA38hIRWz+u4ZILir4Y4YIoXj8rOYN/RK5g98hGP
+Rzt+pwf7NNUbgwesnEVRDHHgo33ig7jR5P0lIgZXlIqo3QGUznU91jZ87bpf61aQCWl/eBfjZjXh
+Wn0dzh7dg62F5diXuxHJIz6ENPKkVaxq+UDpVeJCx8ShePfx+LvN4li4uW9vl0SmzYe7NODkx0Jv
+qP2PkMiEplD36xxn96u16r/x2oqdfghuQYvwgCx1GXUJx2O0WUH+ifb6rNe7v9INv5U1b/YLnAON
+L34o6XUcu3NbNrmIVAUbJZAOvQH/8c6ZSTWrH1SOKe4lZt3HYslb45RN0Np+JdnKUjUe1YcfWPyl
+F55TnomnyfblKKtqRJ/9B8hWI9JGDmizWfKRSZ7jNOmcNin+rZE898ubU6B0zL2A+/WPtZxTMBA2
+6hW8P6Mr3l9I8602voeEuL86hyllxdhXJRvYz1AsqWgf6RIXLfWmpE2yXY2zXIZkg3yftC4d02Sf
+EVP/YxOmSjIC8KtpArBe+g1B9ueYkGAPF2ubVbzxBRkj0CtuEFJnvI7X0qJItZib+2VCR+n1arQx
+CoNC6ei1gzgpe+y8VLJXfBvIZHTPNe/Zh5munUKdkED7utju2S8w/eKciQxNtcS3+d/6KpHOE+ry
+OkrLapwyGs+WoYK2zMMG2IcCNOtV9ze6n314c9fXB8QhB6dyetK0WKVW17ZXlzXNfqhoNXRFNBW5
+tX+fbPJ1E04d9n+ISdCsGPeiaeqcxWJqf1j9YI17Q6jIBZXf4Uf5TFfRDrf6DeB1Q81tUA+0+NTp
+b7vU4i8ZlTBivPhCwPaNK7H5EA24xY7Hk455RaLNGuWp++lDCWNvDDXTeTdui30/LhJY44C1nEx4
+j2jqATA9gQULhCTYguwlmaj153Kg5IdMr7Cq3t7osztK9uldbz7wc3PJddMn+yy4dO4sTp87j0Z/
+7l2ulrhsud8tXQ66bFBW508s2JrP40BJFVqNIWi9Qm/R0HL820JEVhthae2G4eNHoyd1X53bthSr
+C7siffpY/DLOhObKE8gvEl7JHIwwD7mPKEjhT0fpVTBJdsiM0S8Mw57ccmQtXoHrr05ExNVjyN4h
+8IlCxuj+srLCagT6D6LErqYWGz7OwoRkupHTNWzI+AntXkF2O9F10xGM1afykEnjeKm/DMdPO3Kw
+p1KYgeDfUpa7DDmWlzHIeAVbc4tFYRmjHU+LmvWq+2tKfg6TzKXYdSof81bWYm76UIS0/Izvs7ch
+ir4wPduPL+d6JaHZD6+S7AeC4jBhagzKqN5XvJeFuVOScP2Hv2F7W16oIqD9Yda4t5+pzrm9Bg97
+mP1gjHuaN/Tiqyko21iKtQsXY9JLk9GPPlF/4+oZFO0oxZ0xC7H+ZZovQove1w0P3ins0osfu7+i
+MT0T8UwsUFBzXZxDlJw+0rULXwM/Bef8PBSKfv1p7JkmK/9l5S2MGRBGHUiPY/KkJ+jxhzEOmMvJ
+TBWzS/qca+IsLEg7h7VF5Vi6thhZi8Y5O45lpRlWlfygeyPj/c2pSMk+3euNlbPTOuUVX+yjN5Iz
+V68BvaQcsC//sycz3UOc49OungoZhudUSz4B2Fp/kj5v7TqEUX1oJ3IOCdKiaLIoJTMU85GxifS0
+UYw9X+Vhj6QoNB6z//x7nyZxdZRee0+FOpeYsfPwhiUTH1F3ccHG/3J4HI+5y15Hon1mo0RB/H38
+hdcx7cYn2H7sCLZXHrEfG/o0JTPyySoup7TfoGD83bKXUf/OZpQV5tF/oUg80tMM2FN0hiZu+76Y
+B0RR1/dm7HOImDTvPaRK3xLyQa+6vyZMX/U+IrPX0TyrUmTT6/D2JQZzI+XZL1ucOk5W/tHkB5ve
+gdMWY279h8g+dATZmUK9RuGpUTQBmF61lb62rWyU61HWuJfOUucslVT+ZfWDNe57jpyDVcEmrMnc
+iV1fbG5THhqDaU887Nxmv26w1YdTMOOKXvxY/bWbZcTwKSkoyBRiPh4TnnyknbXs8gLDhWayI2nu
+Msy4uw4FdM3aVUkmmkORQcmMsLDGAWu5IMfVq6usVztx5kJMOruIHnjy8GXZUMxOFrqKtC7KfrC2
+N1b72OuNzQ9Wfqz3Lc32Ob6kLSQzkarzG9l8ci/10KW6G39339nU7D645l4i0Ns2WCy36UuoNljv
+BcFkivCSSOltR0fppcze0kTdb9T3Rf/Ce5p8fHrQysOKxkZ7b4zR5J/Oqu1vY8UOA5Z+thRx5EvT
+PRvN+aC30IRrZLtFP71y0VZLI+gNfhho+NJIyR119AV40d8PS2Oj+GhgECbKeWQXYJd0Es/qB3vc
+E+uGJqpcA4KDDAj3CKfj2q9O2GRiWPyVFVdd1VueqkJNBVjjgLWcJuWdurC+9aY/P//tiwj3fwqJ
+UIWdNJnp1NHFjfNAwJ7MAG9mvgvpzVAPxfguToAT4AQ4AU7ASUCvZIZ9mMmpmq9wAu0J3Gu1z9Bk
+famovQS+hxPgBDgBToAT8I0A75nxjRs/y42ApaEGV24Go08CfYzP7Rjf5AQ4AU6AE+AEPBHQq2fG
+YzLjSSHfxwlwApwAJ8AJcAKcQGck8IvOaBS3iRPgBDgBToAT4AQ4AVYCPJlhJcXLcQKcACfACXAC
+nECnJMCTmU5ZLdwoToAT4AQ4AU6AE2AlwJMZVlK8HCfACXACnAAnwAl0SgI8memU1cKN4gQ4AU6A
+E+AEOAFWAv8PxvdR0yK8jugAAAAASUVORK5CYII=
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=--
diff --git a/spec/fixtures/emails/merge_request_with_conflicting_patch.eml b/spec/fixtures/emails/merge_request_with_conflicting_patch.eml
new file mode 100644
index 00000000000..ddfdfe9e24a
--- /dev/null
+++ b/spec/fixtures/emails/merge_request_with_conflicting_patch.eml
@@ -0,0 +1,45 @@
+From: "Jake the Dog" <jake@adventuretime.ooo>
+To: incoming+gitlabhq/gitlabhq+merge-request+auth_token@appmail.adventuretime.ooo
+Subject: feature
+Date: Wed, 31 Oct 2018 17:27:52 +0100
+X-Mailer: MailMate (1.12r5523)
+Message-ID: <7BE7C2E6-F0D9-4C85-9F55-B2A4BA01BFEC@gitlab.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_="
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+
+This does not apply
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment;
+ filename=0002-This-does-not-apply-to-the-feature-branch.patch
+Content-Transfer-Encoding: quoted-printable
+
+=46rom 00c68c2b4f954370ce82a1162bc29c13f524897e Mon Sep 17 00:00:00 2001
+From: Patch user <patchuser@gitlab.org>
+Date: Mon, 22 Oct 2018 11:05:48 +0200
+Subject: [PATCH] This does not apply to the `feature` branch
+
+---
+ files/ruby/feature.rb | 5 +++++
+ 1 file changed, 5 insertions(+)
+ create mode 100644 files/ruby/feature.rb
+
+diff --git a/files/ruby/feature.rb b/files/ruby/feature.rb
+new file mode 100644
+index 0000000..fef26e4
+--- /dev/null
++++ b/files/ruby/feature.rb
+@@ -0,0 +1,5 @@
++class Feature
++ def bar
++ puts 'foo'
++ end
++end
+-- =
+
+2.19.1
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=--
diff --git a/spec/fixtures/emails/merge_request_with_patch_and_target_branch.eml b/spec/fixtures/emails/merge_request_with_patch_and_target_branch.eml
new file mode 100644
index 00000000000..965658721cd
--- /dev/null
+++ b/spec/fixtures/emails/merge_request_with_patch_and_target_branch.eml
@@ -0,0 +1,44 @@
+From: "Jake the Dog" <jake@adventuretime.ooo>
+To: incoming+gitlabhq/gitlabhq+merge-request+auth_token@appmail.adventuretime.ooo
+Subject: new-branch-with-a-patch
+Date: Wed, 24 Oct 2018 16:39:49 +0200
+X-Mailer: MailMate (1.12r5523)
+Message-ID: <F1F36291-728D-4E8F-AFEB-C398B8D9BB4E@gitlab.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_="
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+
+This applies nicely to a branch freshly created from the root-ref
+
+The other attachments in this email are ignored
+
+/target_branch with-codeowners
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment; filename=0001-A-commit-from-a-patch.patch
+Content-Transfer-Encoding: quoted-printable
+
+=46rom 3fee0042e610fb3563e4379e316704cb1210f3de Mon Sep 17 00:00:00 2001
+From: Patch user <patchuser@gitlab.org>
+Date: Thu, 18 Oct 2018 13:40:35 +0200
+Subject: [PATCH] A commit from a patch
+
+---
+ README | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/README b/README
+index 3742e48..e40a3b9 100644
+--- a/README
++++ b/README
+@@ -1 +1,3 @@
+ Sample repo for testing gitlab features
++
++This was applied in a patch!
+-- =
+
+2.19.1
diff --git a/spec/fixtures/emails/valid_merge_request_with_patch.eml b/spec/fixtures/emails/valid_merge_request_with_patch.eml
new file mode 100644
index 00000000000..143fa77d1fa
--- /dev/null
+++ b/spec/fixtures/emails/valid_merge_request_with_patch.eml
@@ -0,0 +1,151 @@
+From: "Jake the Dog" <jake@adventuretime.ooo>
+To: incoming+gitlabhq/gitlabhq+merge-request+auth_token@appmail.adventuretime.ooo
+Subject: new-branch-with-a-patch
+Date: Wed, 24 Oct 2018 16:39:49 +0200
+X-Mailer: MailMate (1.12r5523)
+Message-ID: <F1F36291-728D-4E8F-AFEB-C398B8D9BB4E@gitlab.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_="
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+
+This applies nicely to a branch freshly created from the root-ref
+
+The other attachments in this email are ignored
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment; filename=0001-A-commit-from-a-patch.patch
+Content-Transfer-Encoding: quoted-printable
+
+=46rom 3fee0042e610fb3563e4379e316704cb1210f3de Mon Sep 17 00:00:00 2001
+From: Patch user <patchuser@gitlab.org>
+Date: Thu, 18 Oct 2018 13:40:35 +0200
+Subject: [PATCH] A commit from a patch
+
+---
+ README | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/README b/README
+index 3742e48..e40a3b9 100644
+--- a/README
++++ b/README
+@@ -1 +1,3 @@
+ Sample repo for testing gitlab features
++
++This was applied in a patch!
+-- =
+
+2.19.1
+
+
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=
+Content-Disposition: attachment; filename=really-not-a-patch.png
+Content-Type: image/png
+Content-Transfer-Encoding: base64
+
+iVBORw0KGgoAAAANSUhEUgAAAjMAAAAfCAYAAAASo0ymAAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFj
+YGAqSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxK
+8/x506a1fP4WNq+ZclYlOrj1gQF3SmpxMgMDIweQnZxSnJwLZOcA2TrJBUUlQPYMIFu3vKQAxD4B
+ZIsUAR0IZN8BsdMh7A8gdhKYzcQCVhMS5AxkSwDZAkkQtgaInQ5hW4DYyRmJKUC2B8guiBvAgNPD
+RcHcwFLXkYC7SQa5OaUwO0ChxZOaFxoMcgcQyzB4MLgwKDCYMxgwWDLoMjiWpFaUgBQ65xdUFmWm
+Z5QoOAJDNlXBOT+3oLQktUhHwTMvWU9HwcjA0ACkDhRnEKM/B4FNZxQ7jxDLX8jAYKnMwMDcgxBL
+msbAsH0PA4PEKYSYyjwGBn5rBoZt5woSixLhDmf8xkKIX5xmbARh8zgxMLDe+///sxoDA/skBoa/
+E////73o//+/i4H2A+PsQA4AJHdp4IxrEg8AAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8
+eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQu
+MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1y
+ZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg
+ICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAg
+ICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjU2MzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAg
+ICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zMTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAg
+IDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpZ5vHZAAAS+ElE
+QVR4Ae2cC1QUV5rH/xnA1uZli02MiEHQqBMdTGB8ZIniA5xgfCTRycb1rBmdTHJGJ+toPBtzzGg2
+Rs3LdVTOYhKMcDgmDNHVNXKiGKJINCoqiXpUEFdB0CDKCtrSYp/Zr6q7muqmu+pWd7XgnFtH6Xrc
++h6/+92qr+69VQ9dqrvxd/CFE+AEOAFOgBPgBDiBB5TALx5Qu7nZnAAnwAlwApwAJ8AJiAR4MsMD
+gRPgBDgBToAT4AQeaAI8mXmgq48bzwlwApwAJ8AJcAI8meExwAlwApwAJ8AJcAIPNAGezDzQ1ceN
+5wQ4AU6AE+AEOIFgTwiamls87eb7OAFOgBPgBDgBToAT0I1ARHhXXWTxnhldMHIhnAAnwAlwApwA
+J9BRBIL+vOjfl7srt969577L63Zj1VGU/liHHn1j0I0xNbI1X8TRo5V4yNQLEQbGk7xawH6go/Sy
+W8hLBoqAL3EaKFtY5doaz6PkwCk8FN0H3f1oJx0d93r5wcpN13K2RhzbX4KKn4FH+vSAx65sXRX+
+YwgTYq5k72FUXqzChaoq1DQGI7Z3dwT6ai/oPbj/OJoNDyM6IsRvmL74odTe9LbPbwc7gQCDQZ9W
+5VFK0co52FKp7OW0N9di6sAI1B//G7YU3kHvEb+Gyah8jnTUWncYWdm7kf7GWrz0eIS0O+C/HaVX
+P8dsqPphL07dicFvxg6BQT/BnVSSfv76EqcdDcVafww5X1A7iRmGR/1oJ+pxrx9nT8z08sOT7IDv
+s9YiPzcf10InImlkfy9tLrD8Au5jABRY6w8j56vdbZIFfslxCG/bE5A1Idazqc2EpUVj/cwhfuvw
+xQ+l9qa3fX47eN8EWFC4cj4KKgdjadZiJATg5uUxUQ6JiEGYOQpm8X9bhiLtC4MRIcH2PCg4RBjv
+Mml7YgkOFRFGhnrMpQKHt6P06ubRbZzIy8f2radxVzeZnVmQfv76FKcdjSa4i2hBiL/NRDXu9ePs
+EZlefngUHuCdQcF0daOlRxcEeVUVYH5e9XbeA8aEF/HZZ5vw2Zo/wSyYqchPRz8csdbD70Zjt8kn
+P5Tam8726Ugu4KJaxam4TWixBUaVx8tk6vx3kSrps57HqtdWosI8Ge9/8BylMV4WR0u32WwICvLe
+7IWzjQnP4vPPn/UiKHC7O0qvfh4ZYOxB0lpCYb/N6Se5c0oKgL8a4rRjmNhATUhsQwblZsRsnnrc
+B4Az9PeD2eH7XjAQ/O67E7orFG8Dxm5iMnhNd+n3T6BWP9Tb2/2zvTNpkgb9PCYdOhjKINcxf4Y6
+YJQSquoTxdiVl4eTtwWrYjDzzYVIGyg+0zjNrC3NQ27JFUREGGC1Av/04qsY0ad9f1PD6d3IzdmJ
+k9cs4rlh5niMmTIL01PinLK0rHSE3trSTfikBMhIj8P3m5W5NJwrxqfr81AhsgP6Jk3GnDnP4VEp
+c7ReRM7H2agjpytqBM+/wZqPz0CA2NJiQMYfX8eIXu05KjFqvnwCuwv34shPZ3DNofexpIl4/l+m
+Y6BJ+13U7u9djEg0YR91L4sXL/MwzF/4KpJktjHp1eyvFee+244tW3ejWvTFiMeSnsZvZ09HQrir
+LyxxqsRNOsbkBxXWEgdV1D7WZhfjlqAkNgWzUyRtvv2qxr1mzmx2sPqhGvcOdZarJ1CwaQv2VV4X
+94TFDsfLf/ydS1wJB1iuG1rqw6He+0+A+Kn5a71cgjXritB7yh8oRmJl9jWh6JN1KL07DAvmP2vv
+UaKjavIEAbpykVnEssoaB6zl3HU2nP4auTsO42ZECt6YPzFgQ12q7c3dMMe2N/tY6s2LSI+7Wfhp
+iQO97fNotIadHoeZvJ3veluQSgk30Vps2ZiHq/1SkJ4UY99enYlz9lxEKmj/peLW+gqcPFWOmtuU
+0bgttqvFWPxRPiUyQHLaRExKG47elgvYlV2KZreymjbvs96WhjpUV5YiK1OZS/PpfCxebU9kho4Z
+h6eGRKH62E4sn7cOl5x4gtDFEEFJYATCRKe7wWAwiNuRkeHahvgc0Kr3rseuQ5QQ9R6MVOKcOiQG
+Fcd2Y/XCNahy6mUnbPf3CAookemWNA6TxsQD18qxYckK/CirODa9Wvy1onTDIqzOFRKZKKRmTEb6
+mEdFX0ovOLI00Q2NcariOpsf1InGGAe1peuwQkxkYpA+dSKG3iil+TKlKlYwHFaMey2cGXRREVY/
+2OKebsRVuzFvyXoxkXlsFF0PxgzGrZojFFeLcLih7fGK9brBWh/tvPX4tQr9+bH4a+gRjZZrtdj3
+5X40ygy1XS7DlkMXUA26Vjj2s8gTivrMRabfl1XWOGAt525D7Q+b6H6yDScrDXj+n1MDlsg49Sq2
+N2cp54o3+1jrzSlIZYWVH2sc6G2fivlMhxl6ZpjkIPmltzAvvb9Y+Fdb3sZHRRdwsqYJA2mSsLTE
+pMzCEnratF38Gr9/Z5u02+XXevOmuJ3+xgc0OdjRNTHzFTQ3W30OxI7SKziizMWC4vzdor8zaEJ1
+hshqFp7c/DY27C/H1oM1WDiWnrwMsXhp0WIqZ0PhX15BQcsYzKMnL+H27OvSf+p7WPVCNHo5ey5e
+xIQ9H2LpF2dw4mITEmT1pkVH34w/4Z0ZT4in/Lr3Oiz/ohyFJeeROMkeG0x6NfhrOVeI7GOUNZvH
+YcWqWYhxZNy/faEGV++1J6RcH+yeMvkhE6es9woKs8updBTmf/guknrS6uSn8Om/LcNBeT4mk8ey
+qhr3Gjiz6ANY/WCMe+rf2/Gf+aQ6CnNXrUZKL3vlPjehGAvezkPWl98jef5ocS6L1uuGcn3IvDUM
+wpLPN8l2yFZ158for3EQpowyYsOhYpRdnoE0R+/22ZLvROOmpSU75vcwypO5xMxFdo7vq6xxwFqu
+zZKudOuoKs2iB4QjQOhwLP/gtbae7rZiuq6ptjeZNmX7tNebTLSHVe38lOPAP/vY35X24IrCLt2S
+mcRf9XOq6ZtIs8iLahHipc/Aamt1lm2/Yp/auicnE5HPP4PEuBiYzCaEh0tjLu3PYN3TEXoVuViq
+cbyGrDdPxNOy5CHp2QyE7f8UNxvc72RW2Mm1ihOA29+qWUlQfmR6BIaLJ1D4zQn878+30KVLF9xt
+qGcX0K6k0J1jRMYEeyIjHH40JR19KZmpOHwSFkpmhBrUplfd35qfjguqkD57ijOREbaDwmNpsLP9
+olgf7Yt73aPND0BRr+UmLguaaHhxmJDICEtQLMZNiMfBHRfs2378VY57QbA6Zyb1rH6wxr3lOs6K
+TeA6DnyTgzN37deGLtRHKw7FVV+B0Plrf0NG23VDsT6YnJUX0osfu79Dxv8GOLQNRSWVSBPe2rHV
+YB9dc4HhGDHQca3UxM/uj75c5Iw8rDPHgdbrJA3Hf/UBVogqB2P5XymR8Tys4MEo/3eptzcV+3yo
+N0WrWTnLhCjGgT/2hfbDw/7fymWWtq3qkMwIN7EYmGXzLIK62qentkJ7Dmbsn46Zo05Rd+kZFGyk
+/w5bU//1Lcwa21/hjYI2p3xZ018vAxdqYOK3D4mXS1sLN6M3OVFRXUe3mUEuPTDSJCqX8j44fLqA
+es8KhYsf5VKx8TCRIS3/d8cHSfJTTOguD1RbM3V5uy5a9ar5GxxiT+mMXdVCmaE+XE1V3GL3g0Gv
+ozLND0e7xMG9VuHc+7OocWaygtUPKscU91KQmyktratDg8yIoQPiYe1pdvJib78M9SHTw7qqJz8w
++GtIGIHU0G2UwBSjlpIZ0/mDKCNj+05NRS/JaA38hIRWz+u4ZILir4Y4YIoXj8rOYN/RK5g98hGP
+Rzt+pwf7NNUbgwesnEVRDHHgo33ig7jR5P0lIgZXlIqo3QGUznU91jZ87bpf61aQCWl/eBfjZjXh
+Wn0dzh7dg62F5diXuxHJIz6ENPKkVaxq+UDpVeJCx8ShePfx+LvN4li4uW9vl0SmzYe7NODkx0Jv
+qP2PkMiEplD36xxn96u16r/x2oqdfghuQYvwgCx1GXUJx2O0WUH+ifb6rNe7v9INv5U1b/YLnAON
+L34o6XUcu3NbNrmIVAUbJZAOvQH/8c6ZSTWrH1SOKe4lZt3HYslb45RN0Np+JdnKUjUe1YcfWPyl
+F55TnomnyfblKKtqRJ/9B8hWI9JGDmizWfKRSZ7jNOmcNin+rZE898ubU6B0zL2A+/WPtZxTMBA2
+6hW8P6Mr3l9I8602voeEuL86hyllxdhXJRvYz1AsqWgf6RIXLfWmpE2yXY2zXIZkg3yftC4d02Sf
+EVP/YxOmSjIC8KtpArBe+g1B9ueYkGAPF2ubVbzxBRkj0CtuEFJnvI7X0qJItZib+2VCR+n1arQx
+CoNC6ei1gzgpe+y8VLJXfBvIZHTPNe/Zh5munUKdkED7utju2S8w/eKciQxNtcS3+d/6KpHOE+ry
+OkrLapwyGs+WoYK2zMMG2IcCNOtV9ze6n314c9fXB8QhB6dyetK0WKVW17ZXlzXNfqhoNXRFNBW5
+tX+fbPJ1E04d9n+ISdCsGPeiaeqcxWJqf1j9YI17Q6jIBZXf4Uf5TFfRDrf6DeB1Q81tUA+0+NTp
+b7vU4i8ZlTBivPhCwPaNK7H5EA24xY7Hk455RaLNGuWp++lDCWNvDDXTeTdui30/LhJY44C1nEx4
+j2jqATA9gQULhCTYguwlmaj153Kg5IdMr7Cq3t7osztK9uldbz7wc3PJddMn+yy4dO4sTp87j0Z/
+7l2ulrhsud8tXQ66bFBW508s2JrP40BJFVqNIWi9Qm/R0HL820JEVhthae2G4eNHoyd1X53bthSr
+C7siffpY/DLOhObKE8gvEl7JHIwwD7mPKEjhT0fpVTBJdsiM0S8Mw57ccmQtXoHrr05ExNVjyN4h
+8IlCxuj+srLCagT6D6LErqYWGz7OwoRkupHTNWzI+AntXkF2O9F10xGM1afykEnjeKm/DMdPO3Kw
+p1KYgeDfUpa7DDmWlzHIeAVbc4tFYRmjHU+LmvWq+2tKfg6TzKXYdSof81bWYm76UIS0/Izvs7ch
+ir4wPduPL+d6JaHZD6+S7AeC4jBhagzKqN5XvJeFuVOScP2Hv2F7W16oIqD9Yda4t5+pzrm9Bg97
+mP1gjHuaN/Tiqyko21iKtQsXY9JLk9GPPlF/4+oZFO0oxZ0xC7H+ZZovQove1w0P3ins0osfu7+i
+MT0T8UwsUFBzXZxDlJw+0rULXwM/Bef8PBSKfv1p7JkmK/9l5S2MGRBGHUiPY/KkJ+jxhzEOmMvJ
+TBWzS/qca+IsLEg7h7VF5Vi6thhZi8Y5O45lpRlWlfygeyPj/c2pSMk+3euNlbPTOuUVX+yjN5Iz
+V68BvaQcsC//sycz3UOc49OungoZhudUSz4B2Fp/kj5v7TqEUX1oJ3IOCdKiaLIoJTMU85GxifS0
+UYw9X+Vhj6QoNB6z//x7nyZxdZRee0+FOpeYsfPwhiUTH1F3ccHG/3J4HI+5y15Hon1mo0RB/H38
+hdcx7cYn2H7sCLZXHrEfG/o0JTPyySoup7TfoGD83bKXUf/OZpQV5tF/oUg80tMM2FN0hiZu+76Y
+B0RR1/dm7HOImDTvPaRK3xLyQa+6vyZMX/U+IrPX0TyrUmTT6/D2JQZzI+XZL1ucOk5W/tHkB5ve
+gdMWY279h8g+dATZmUK9RuGpUTQBmF61lb62rWyU61HWuJfOUucslVT+ZfWDNe57jpyDVcEmrMnc
+iV1fbG5THhqDaU887Nxmv26w1YdTMOOKXvxY/bWbZcTwKSkoyBRiPh4TnnyknbXs8gLDhWayI2nu
+Msy4uw4FdM3aVUkmmkORQcmMsLDGAWu5IMfVq6usVztx5kJMOruIHnjy8GXZUMxOFrqKtC7KfrC2
+N1b72OuNzQ9Wfqz3Lc32Ob6kLSQzkarzG9l8ci/10KW6G39339nU7D645l4i0Ns2WCy36UuoNljv
+BcFkivCSSOltR0fppcze0kTdb9T3Rf/Ce5p8fHrQysOKxkZ7b4zR5J/Oqu1vY8UOA5Z+thRx5EvT
+PRvN+aC30IRrZLtFP71y0VZLI+gNfhho+NJIyR119AV40d8PS2Oj+GhgECbKeWQXYJd0Es/qB3vc
+E+uGJqpcA4KDDAj3CKfj2q9O2GRiWPyVFVdd1VueqkJNBVjjgLWcJuWdurC+9aY/P//tiwj3fwqJ
+UIWdNJnp1NHFjfNAwJ7MAG9mvgvpzVAPxfguToAT4AQ4AU7ASUCvZIZ9mMmpmq9wAu0J3Gu1z9Bk
+famovQS+hxPgBDgBToAT8I0A75nxjRs/y42ApaEGV24Go08CfYzP7Rjf5AQ4AU6AE+AEPBHQq2fG
+YzLjSSHfxwlwApwAJ8AJcAKcQGck8IvOaBS3iRPgBDgBToAT4AQ4AVYCPJlhJcXLcQKcACfACXAC
+nECnJMCTmU5ZLdwoToAT4AQ4AU6AE2AlwJMZVlK8HCfACXACnAAnwAl0SgI8memU1cKN4gQ4AU6A
+E+AEOAFWAv8PxvdR0yK8jugAAAAASUVORK5CYII=
+--=_MailMate_D2C4B06A-4F8D-4AAB-B247-C507E35AAED6_=--
diff --git a/spec/fixtures/git-cheat-sheet.pdf b/spec/fixtures/git-cheat-sheet.pdf
new file mode 100644
index 00000000000..da38c840fd3
--- /dev/null
+++ b/spec/fixtures/git-cheat-sheet.pdf
@@ -0,0 +1,130423 @@
+%PDF-1.5 %
+1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 52318/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c132 79.159284, 2016/04/19-13:13:40 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">Untitled-2</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ <xmp:MetadataDate>2016-10-31T17:24:20Z</xmp:MetadataDate>
+ <xmp:ModifyDate>2016-10-31T17:24:20Z</xmp:ModifyDate>
+ <xmp:CreateDate>2016-10-31T17:24:20Z</xmp:CreateDate>
+ <xmp:CreatorTool>Adobe Illustrator CC 2015.3 (Macintosh)</xmp:CreatorTool>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>256</xmpGImg:width>
+ <xmpGImg:height>92</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AgedEzdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdir07/nHj/lPn/wCYGb/iceYmt+j4oL6XzUMXYq+aP+ch/wDlPk/5gYf+JyZt&#xA;9F9HxZB5jmWl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpr5b0qTU9RMMfAmONpeD9GpQUHv8Vc1H&#xA;berODTmQuyQLHT8U7PsnFCecce8RvSaab5Qnnu54AymgKVcfZB/arQ9Bml1XtF6ImIINgnz8vi7n&#xA;F2LDFxGZ4oyiRHvF9feFfSvy+F9ollqbah6P1u4a3ZBEHSPixTeQSCrkivAL0INd86o596p5M7FV&#xA;sPys1q9kISQRIxRIGljkQyNJbmdWC0P7v4Speu3U4y1ACsLYFWINKg02II+8ZerWKuxVug8cVb4j&#xA;FWuPviq6ib1Py/zpiq0ih9uxxVxBBoRQ+BxVxBHUUxV6b/zjx/ynz/8AMDN/xOPMTW/R8UF9L5qG&#xA;LsVfNH/OQ/8Aynyf8wMP/E5M2+i+j4sgxyXR/LqQS3q3gNm0PGJ6AsZKUCiP7XMbV+/Ocx6zXHIM&#xA;Rj6hKz/Vv+dy4e75eT088WjGI5R1jw150N658Silj5DeK3/3I3cUjLH9ZZ4wQrHj6nBVVuVPipVh&#xA;2zqbn3PMpJqSael9KunSPLZg/uZJQFcigrUDwO1e/gOmWRut1Qwwqu+Gm9MVbFO3H5HFW/TiqKyA&#xA;VPuaD6MValRUYBWDAiuxr/TFUXoTaYuqRHUwrWdJA3PnwDmNhEX9P4+Ik4luO9MjO62VP7688kPd&#xA;28NnbxparJKWndJxt9UjEPqDk7cPrRcuFq3Ed9q1gTrf8b/qVXSb8u5JJU4CGNjCDKwnPwCOL1vR&#xA;ULIQ/IScQ7Ur+0Bgqaof655Jk1tK2yR6SIpmoROHDyOzRo/FizGOOiihAJ/aH2ganXmqOt7r8ufR&#xA;taQRq4a8+si4NySeQk+q0McTjiDwr3G2zb5Eif3KxXXbnT7i9R7CGOCBYIFZYg4Uy+kpmPxkn+9L&#xA;U9sugCBuqBillhkWWJzHIhqjqSCCO4IxnASBjIWCmMiDY5ppfeaNVu7YwO4jEn+9Lxji0ppT46dq&#xA;dhtmr0vYunw5OOIs9L34fd+tzs/aWXLAQJ2H2pro3lbQrvSrW9utTSKSZ40lhEkauvqXQgPwsP2I&#xA;/wB6T4H9nqdhLIQaAcBrRvLGg6jbwTT6ktiJipZ5ZIyqcroQ+kyr+85rF+85cOO4rxG+MshHS1Vp&#xA;PKXl+KJ5W1NX4N8MKSoGaNYebSVZBT94yIFAP7XxGmDxJdyrbXyhoM2lWN3LrEdvPccfVgd0J3SR&#xA;zxC8uNCij4jT3DfDhOQ2RSqWq+W9CsbKSZLwXEot5ZUSOYH94l2LdEIaFK1jb1dt6A7AUOMZknl+&#xA;KVi1R4ZcrYYeH+f34q7kPD9eKt81I3Ar47n+OKr1liAoyBh/LuPxrirvrPx8zGvI03q1dvA1wUrc&#xA;0sTpsDz2oTXYb16s3iMVej/848f8p8//ADAzf8TjzF1v0fFBfS+ahi7FUDe6BoV/N699p1rdTUC+&#xA;rPDHI3EdByZSab5ITkORV4ALzzoQCLbyoQQSDXStwFVift/yup+RGbDxMX86X2skXpcXn6/umig0&#xA;3y5dLbsgvFtU0uWSNWJG6h9ieLU5eGJyYv50vtVlsOg6iLI+tocRvuDcSlpooiL78agyFuPSuVHJ&#xA;G+e3vktqiaFdFk56CiqVPOltohIaq8QPiFRx5V6dsHiD+d/ulSvzRZ6vpuiRT22m6Ja3El9JHG2p&#xA;RaZCWtvTT0wfi9LnzLbK3hkoZIXuTy81tKtJ0/8AMK9QXP6H0G4sXST0prSHTJAzqCFAblx48xRj&#xA;23yZyYukj9qspm0C4ED+joqtcUPp87PRFStDTlSVj1plQyDv+2S26bQbmi+joaE8zy52miD93xNK&#xA;Uc/Fyp9GIyDv+2S2irLy8X1G1Q6HCbdnT12uLTSFXjy+PaB3k+z0p3wHIK5/bJbYnN5Y/N/1X9Py&#xA;3ofp8jw/0aw+zXbvl/iYv50vtW0+g8seZKf6R5cgr6nWO10enp8W7FvtcuH0V9sqOSP87/dLarB5&#xA;X1v1AJ/L0fpfHVo7TRuX2/g2L/ydd+uJyR7/ALZLaAnXS47n0zb2USRLItwkkXl/1FlHHiKeuKAf&#xA;Fyrv0yQvz/2Sst8peV7Cexnl1bRbBg8wawkNrZcntzDGQx+r+pHvKXpRvs0yjLkIOxP2oJSb8wfJ&#xA;2m6To0Nz5X8oabqOoPcrHLBLbc1EJRyz0RojUMqjr3yeHKZH1SICh5/9X88f+W20f/pCf/sozKuH&#xA;88/P9iUXpun+Z57gJf8AkHSbODkoaVNNkmIUmjEKLpKkeFcjKUekz8/2KnMOgIyVl8s2MblmHEaA&#xA;7AKCeLE/pAdcgZ/0v9l+xWpNAYep6XlfT5WUViU6HJGHNDRSxvm4VNBWh648f9I/6b9ipf5m0vzH&#xA;Za9e2ukfl9pN1pkMpW1uHs2ZnTsSVmQfhkscomIJmb96pZ9X88f+W20f/pCf/soydw/nn5/sVOLL&#xA;RtSktfVvPJ+mW8/EEW8ejyy/ETQjkbyMbda5WZi9pH/TfsVEjQjzUf4WsQhZgzfoF6hQGIan6Q3q&#xA;QopXv7YOP+l/sv2Kp65pq6b5fuL6LyppE12t1FDb/WbA2avG0cjyH03uZCSvAb8/HbGMwTRka9/7&#xA;FYedf1QR+ofJnloR/wA/pLx6V6/WvAZbcP55+f7FRFnq2oTTIs/lDy5BFKsnpyi39QF0X4VAF1Ug&#xA;yFVYj7Neh6YCYfzz8/2Knkdz5WeBJ/qOh+jKwjhlGkgo8oJDorfpKhKkEZXx/wBI/wCm/Yqx5dJS&#xA;ykuG0fQqqjtHTSz6TFR8I9Rr9aVagJ47YeMfzj/pv2K9l0ryf5W0i6N3pelW1nclShmhjVG4mhIq&#xA;O22YUsspCiWKcZWrsVdirwjXNAul1e5FzaTiV5nLx2K601rG7woQ8DwWUyceZoQrUH30KUvt7bVb&#xA;azeW2h1WG+mZPVAi8wJVeG5Yrp55EMx/aoN+Na7lUfI2rvqKpO+txaYgUO8K+YGmKghSy8bFQZK7&#xA;0O3vT4iFTuKPQlLK195sJmcKeVrrJ4ANUUK2tAO1a1od/EKGQ39xd2nkvT7jTrA6vbpIPUj1a2vZ&#xA;rwKX2ZoEt5Lgup/mj6AGvfFUpg86+YYI0jh0CKGECfkiaTrqqJOTNGQFsPsvyVmNP5u+KoOT86NP&#xA;0rUI7fzK+n6cio0t4rWmqxzJGwb0nEc9pHszLT4qe2NKiX/5yD/KgMETVIpJCQBGtpdBtzQfaiX5&#xA;40qF8i+dPy71XzvFb6J5l1DUNRufVeOwne7Nsw4NI3FJ4lVeAU8dx9OKo/zBpVxZeckuW1PldSM1&#xA;/FblY4UEUbqqK0srxxBq+FSaE065mQlcOXkyZnovm6y1O8hsDE0F/La/XPT5Ryx8FZEcLLEzKSrS&#xA;LsaHvTMaWIgWilC/8+aDa313YSB5JbMhLgfulWrKG4r6rxl9m/ZB8MlHDIgFaebaF5D1DW3m+oam&#xA;sENtN9Xu0kDerFQ81UBB6cv7p1NQ4FajsDmVLMI8wm3r2gaSNI0e2071jcG3UhpmHEuxYsxpU03P&#xA;jmDOXEbYoPzdprahpscK6PY63SUMbTUnEcK/A6+oCYbj4qtx+z9kt/qmKvIPMcOm3bahbw+ULTT5&#xA;7W4YTT2GnzXAuHWQq/rPcaDdoVX7YeIPU0+LcVKpK+nB40ki0+QvGIx8OlAgFCQFc/4UYoEptsKe&#xA;2Kr7eKe0vFubGykVopne0uzpwhuatUNKgj8rfCSo5Eqx8K4VZr5Z1jUZL60j1XV9aju3uljWyk04&#xA;m2kBI4pJPJomnsgb9rcUH7XfAqP88eRNQ1vU5JbXQtIQ81Mt88tn61ynKtJhdaVqFOA3AU/tHfFU&#xA;j0u81yyefS9V1DWdNWz4wWn6OsEvYeK/DxEi6BBAoQBQOBdd+u2Ko+TV0NJh5i8zrD8VVXQq+4rX&#xA;RyQBy/V71VWpqqLGS3mbzS2+/LQ0DCgpTiNGB3+WKqPmvTYfMXkE2v6Uv7tl1OKRJtSs47SfkkLM&#xA;I442OgLQjdX5HfxA+FVhWh/lj5ZgnuJfMGk3moUVPQNm9nZRKIgrSQy+tq96snIso/Z35bnqDap/&#xA;pn5d/k/canwm0e905VgDstzqFm1uWJEKqyw3U5aQ8OVaUruTypgtUw/5UV+S6IFKXIWImgbUHIUk&#xA;VOxelaLX/M42qvB+Sf5PSTJbxxSzzN6hWL62HY8l9MlVrUce3HoaeAxtL2HAh2KuxV2KvHdd0nyH&#xA;Jcwg6Je+X+cUipBFpejUcJGtTS6guX+MBYuoX4QNhuSqNMUsnl9X0DzfdW10I1FpaXiaMsMVCP3U&#xA;gt7NuIRPh4r7YqkjW35ncyq+eLLlRgB/oH2qgrVfqJP2evxYpWJb/mkIiW882BdWpJtY0ANK7/Ut&#xA;iN6AjwxVl8cepN5O01dYudT1TUBcP6l55ecKXImNOZhW1T01X4DVex3J3xQhr63c6XCtvD5u9ZQ4&#xA;i/enmH9STi059SrKp9zVOPXFUiu/J35lW0T3VxrqQASIfXmvtSVFBYqF3dVHIuB89sbSm4178wVY&#xA;iXVPLqgDl/eXNQBQt1cdjWvyxVNPLer+cJ9es7fUL3RpbRg5nis5Z2uDRW4mNXJWlePKvauKGVar&#xA;omiaqySXtr6s0SlY5CsqkAnoSnAkV7VycZyjyVj2gaBdWDJepCtprJgmgiSVZJIQryIxDBZJOnpI&#xA;w4v/ADA9qWZJg+5JR19odnqFnKKSQ6veRuHvIVmiSOZAIzMIeciVRqEKeXIjc98iJke5VtnbapoC&#xA;tMFjvLaWQPdRWVlcfWGPEIGMk13KTxoo+ydh26gkiX9v7FT3SdT/AEjbNP8AVZ7Ti5T07lPTc0AP&#xA;IDfbfKpRooY/+Zmt+U9H0GC58z6c2p6e90sUcCRxykStFIQ3GRoxTgrKd++Tw4jM0FDzN/zI/Ih2&#xA;kZvJ7kzNzm/0GzAdg3Lk49ajGvc5kfkZ94TSIPmT8pdcsmj0jy+ml3Z4Rw6g1npCtEIHSQKFuZeF&#xA;CKBaj3G67RlpJjr9/wCpaVY9Rh0vT47bT9cnsrOKqR29pD5eVUPEyMRGs3EcjVthux8TkRpyfwf1&#xA;JpGReaTZ3Md5c69e3NpAY5ZrbhobLKnQopgn9T4qfskkVxGml+L/AFLSH/M/ynLHql5rM+n2slvd&#xA;TwrbN6FpcuXCsaFF0PU7hd058ndviOxGwzHDFh1zYaK9k1xHatNfMT+kA+kQbAtsoY+Wecpb4SQU&#xA;X59yVZpaazo8EEdpZeZ9fggtkWKGCPRYUiWNSI1VFGjqvFduPHantgVVHmLT/TD/AOLPMRUP9oaP&#xA;HU96UGj9Nuo+/FUJ5uuvLmo/l4zapLrvmOxTVYwD9USzvEcQMQvpmytVaLqORj3LU5dsQrzaO08k&#xA;RwzKfKHmQxxyEyoTBJIXBJDhfqxqaAitenjhSmehp+X+nXrahB5K13UWgVDNYX8EE0Mvq8Y6uhgo&#xA;xRpCakj4h74qn8nn78v1VWl/KUlpfiqNMt3AYV5F6Q8tj3oa9saQibX8yPKVleLcW35VywXFrIzw&#xA;3Ftp8QeOQBWd1cQrxJkk4hgd9ySMFK95wK7FXYq7FXz/AOYvMHlvVLyzWw8yPrvoBnYajCEkVUQc&#xA;lAGh33OPghZt13+LwIyfyuQdPu/Wmk5S5DFZG8oaU8n2kItNVGw+JyG/Qrd9/p9t4eDLy+Y/Wrf1&#xA;qMstfJulcAfSX/RtVJ5V3Qf7gx49MfBl5fMfrVtpQrIqeS9L/lCG11UGnGhVf9wZ6Db5D7h4R8vm&#xA;P1qiPMHmLXrDyhp50C90zyrcRXcsF9bTlLWBSQrokY1G1s2qwkVzSIfa6nrlmKMIn1/j5KxRvPP5&#xA;oojSP550FUVzGzm70oAOOqk8Ovtl96fu+9dkwtPOOp3tnPaeZPNmmahGq1ubeG+0L0gUk6yJNbzb&#xA;K3HqNmyuRxdB9/612RGm6ZZa2Gm0b6lqccLenPJbP5duOKcCY0LR2LcTyNd+1cF4/L/ZfrXZkPl/&#xA;yvqdnrVhdRWaQyxSr605j0gUjIKOFNtZwzAmM8fhcfdtkZHHR/b+tXouqTXUOnXEtqjSXCIWiRQG&#xA;YkeCkivyyiIF7oYNbz+cdfkbSdYtJ7Ozm3W9jg9MxslXWQMz/CwZRTr92ZE4wAsHdKLk8p+QNNu4&#xA;YLq/itbmPi8UJmt7Sb4vhVleFYZxUr1VhWmR8Schy+9bS6P8wZLU3t39QDTrK0dta3GrRhpI6rQ+&#xA;mxaKJh4PxYd9ya2HBdC/sTTP9Jvv0hpVnf8ApmH63BFP6RIYp6qB+PJdjStKjMWQokMWO/mbqdjp&#xA;nlsXt7PfW8Mc6qG01bZpmaRHQLS7DRU+Ku/cDAFeAj81vMckdVttRSd3L0W+0srQ0PFVbTHoqsvw&#xA;+zbk5KyqY6R+c/mGCWV20CbUfUarQXd9ZKIIkrvG0Nlb9eVKtyrQbim7Z71R5/PzUeE1fJ0cckXV&#xA;WvomHwmjD4IWJY0Ow6dyemNnvSm/lD839Q1vzDpul3PleO1iv5vSN2LqNuA6giP0uTHf8Ovg2e9W&#xA;U+dNM8r3GqPING1FNTgnhnn1C001roTBHLBAzKyN8W5I3GRQwXQdE/NPSWvNP0WWz0vT4bkusl7C&#xA;1sk4BK8t7DhydI1rxY7DbClP/wBG/ngyFk1XSynMEN6g6cR8Ff0fTf7Xjv4YNlbfSPzxiKt+l9OY&#xA;KfjErKoNAxP2dPBFVo3Xanhjsqtr2n+bY/y7Ca/qmkfpVdQ9Vb7UhavZiEQuKKZ7WKMPTlv6daV+&#xA;Km2W4ZRErkrA49O1oSGFPMHk0yqfTMfDSSwJ+HjT6tWvXbM38xj/AKXzP602zzy55W8/aRG7R3Vn&#xA;aXEyqsx06LTbVWKuxqSLBiw4EUB6Gu++1M8uOX7b/WhkCQee+fx6vdFO4Eumg0p4/o898r4sfd9/&#xA;61Up7f8AMU2kwt9YmW7Ik9B5JNOaMGp9LmosFZhSnKjD2xEsd8vv/Wr0PMZDsVdirsVeJalpug6b&#xA;DBc2N75av7l5PTS2sLO0juJAyIf3TXWp28dQGqfiPwuPh75d48+8ptT0fzNpduZZNW02ymjkI9EW&#xA;zaNZiMoP3jOz61c+pVZEHw0409xg8WXetskhntJ4Uli8kXcluwEsMqSaOyMGHIMhXUTWtdjg8WXe&#xA;tuX6uCgHkG9XckfFo9AevbUcPiy71tMNasJpPKCJY6HdwPPK01xBa366dcWzBOHqyy2twFk4rvwE&#xA;pBoPDaBkTzQ8Lk1a9IedPO96xqwEQ1lVBFD8dPru2/QbHptilM9NudNuYrgah+ZV3pjRSA25bVZZ&#xA;C8KrTkOF2djt9qreO++KExaPRFjEkn5szhCjK4N5cqXG7niBdhg3E7cN6Upilk35c2umR+bbR7b8&#xA;wJ/MDgNx0uS7mmVxJCzgsrzyqSq/EPh7eOAoZ9qXnDUodSaztNFupoNlGomC5MaMdiWjEIZgp3+A&#xA;/EOh8LY4gRdhNIGDytrlk1uLGeadBamGedp47P1TJGAeSi3lmSjKGDci6+P2uUjkBG/P8ea2g7Hz&#xA;Jrk5sbWGMypDfCGaLjLPzj9c27GS5kYl/S5eqaKPsUqBXJGEefkqdaz5e1mfy+tnatbi9W7+t/u0&#xA;9KLkZjcc+LGQFxN+8B/m3675XCUeLfkqd6HBqEGlW0Woyepeqv79+RcFq/zHK5kE7ckJN+YOuWOj&#xA;aLDdXusXOiRPcLEt3aQxzuzNHIeBWWKdaUUtXj1A7VBljxmZoK8gvvzY1MXc6WXmmV7IyMYZpZIk&#xA;m9PfiPTGhui9ehdv9brW/wDJ5O5NIjSfzp1a2Mhnv4NSeZIVihuruZfTdQwcq1tosNTIeJNaiv2e&#xA;I2I/J5O5aZda/mB54uU9SLy+rR8nQMs2pMOUZKkbaVT7S0/zplZwkdR8wtICPV7aTzNFrWveULO3&#xA;uLb45tdEFzPewelHswaXTYG4qXVamUUBr7Y+Ae8fNaRHnfzBqtnrt9Hp/mu0s7aKISXEFzqtvaSw&#xA;FS7PxgfStQPHiuxMldtgN8qQstrzzH5p0WKOTTfLfmPTrdkVJLrVp7oGaNeLO9dI4CXg5rRRSp27&#xA;YqsPkiZ6rJ5F8ntDQUT6wx7VpvpFPtE9sVQOqaBqlq0Yh/LPy1fuqmQSQXcXBWDEhQZdNiblWjV4&#xA;0xVO7K0EfkS+jmsdM/L4zXlXUTmOF1jQOkpmsX0t1duHxAPuilTVTiqR/o+wadoYvzF0lpIixeP9&#xA;JauXRIwSeQGuVPED4q07nFUXbNo02oSWVmdU12/tYoZbiXS/MTehIWRZfUjgl1hZkj5txAkUV/yl&#xA;3xVX/RxO58u+ahSo/wCO+f2jQ7DWd+lf1Yqr2OmNHe2oGgeZI1+sJIZ59cEsMZ5A85UOryl41pUo&#xA;Eav8prir1PArsVdirsVeA+avNOozXMdobaBPqlxJ6N1pUFxEJHEKiN0lhuEDIeQff9mnSnLJJSzS&#xA;9Y0VxN+nYdRf1aywmya4QBaK78/UuJO6pTj8j1xVk0d9prxqILHzc0Kf3TRyXQjKqoZShEwDKwPw&#xA;02OBVRr+0KN/oHnAAIAKPdVIBUbfvup7nr1OKsm/x9YeWtI0uKa0vZlvFkMP1uQLcrxZiRObhg1a&#xA;DarHbLsWEzWkfpX5k2+ppE8GnTLHLJLGJJGQIDC5RyziqgVHWuGWnrqtJnqV5bahaS2Go2Ftc2s6&#xA;/vraa4hZHVSD8StsR0yvg/FISNvKn5fgFW8n6EAoqQYrDYHf+TvjwKmeieWfLdtenU9L8t6ZYX0V&#xA;YhdQJDHJRlBNHhi7g06+2AgBWKW35xeZp7qSA+S7iBY+RE0006o3E0242jbntmUdLGvq/HzTSM17&#xA;zXrd/pvpnTUT4uYS0vb2OYlQaLybTuABPi1MjDEAef2D/ilpfovmfWNMsI7OHToZI6syme7vmdeX&#xA;xEEjTB+1+PtjPGCbv7B/xSohvzD18NGBoluecrRf703vwhQx9Rj+jqcDx277jbI+BHv+79a0yPyv&#xA;rt5rFtdy3Vl9Se2uTbpxeR0lURxyeojSxW78ayFfsdRlWSAieaGI/n3fyWHkiK7js1v3jvYwLZo4&#xA;pK8opVLD1op1XgG5149vCoIhIg7FWJ6D5KurrV4ZNS0U2tm9JJY/qWivaAU5emssUklyQfs8uHXf&#xA;YZPx595TbN/8EeTf+rHYf9I8X/NODx595VWHlPywOmk2g3r/AHKdfuweNPvK22vlPyvy/wCOTabk&#xA;V/cx7/hj40+8raU+er6zupL/AE27876XpEUZRzA4mt7uBgxK/v7W+s5d+NKDrvWvTIIVNP8AJfkX&#xA;VLWSSy1u8v4iTBcy2ut6s8ZkU1dW4XjUYFtwTXfAqhq/lDTLKaNLW28wapDMHMr2mu3yCNif2kud&#xA;St615E1WuKpauhwL6qJ5d81Kk1WNNeZakksems/DU/y+OFU3ZY9M8iau82mapDbrKzSJqGr+pchF&#xA;QcZY7ua6vPSVmAXj6g77b7qvPZ/PnlD64YDeaoRHIsfI+YkEZVeVHryIDKVGzEHeu5GGkplpnmX8&#xA;ub2znM3mO90iaItHCH1p5AUHCk37tgoBc7qGFab4FS9pNJc/vPzVkoTUcJp0pzAaikXPcL8INfbq&#xA;cKpp5auNFfXNNMP5iNqZ9eF4rAzzfvxI4KwvyuGBLl1WjL7UwK91wIdirsVdirzDVbDU9Ikt5rry&#xA;noUyv6p52Nhd3jqwiWm1vayFOT9z+yKCpwq87n8o6g7zyQ2EkIcFz/uJ1NqepIrHiraU/wAXEd69&#xA;BXClk+hR3dvpwg1C68xpJbsDFBYadqPo+kCAsYMunxkcaU4rRePTvgVNpfqcvOU6r5qACxq0a6Xq&#xA;CV4KE+EDTlNW4gsR332qaqGvM3krWPMlroTaXPPIun/vJ5r0yWN46OXX4leBGVjxIPKIbZlafKIA&#xA;31SCq6Z+XGtw2Ho3EcSyetcSji/qALNM0gHLlDUhSP2euSlnjabRn+AdVFSFQmROEpapNaEAqfWF&#xA;Ou+Dxwtpbcw6N5d1OH/EnqLEKMgEMrpKUowXmWkjYLQVXJAmY9Ksj0T8xvJMkrWljLIrSuzQWkNr&#xA;OzUSMV4xxRtX7BNFynJhmBZRSYaFrnmjU9EstRWwsXF1Cspb63NEPiFT8H1eXjvX9o5GcIiRFn5f&#xA;tVCXy+a79r11i+oMbZY7WeymacErIrlv3sdtuQGWgB2777GPCPmqEsdP/MCyE076jLdzLQrbSwxt&#xA;EyMaUDCTkrildgae+SkYGtqVkuq6tq0CRnStKbU3JImQzR2xjoKivq7mvsMqjEdTSozT9RhvoXki&#xA;WRDFI8MqSo0bB424sPiAqPBhsRuDkCKQwz86V8xv5Qji0C0lvLqS7iWaOGN5WEIR2LcEDVHIKNwc&#xA;QrzXSPL/AOf2r2Mtwtx9TLK8YjuDPaOHI5AiOQhlAErKCu2y/wAu52SmD+U/+chTcSulxaiFm5CB&#xA;rpyN52lAV1IZfh4oe1OgwbK6Tyh/zkGwHG9t1DxxRsBck8CjqWcV4lmKp4gGprjsqK0Hyl+ecfmf&#xA;TptUvUOkRXET3SrcK1YUcB0YGvqF4+9BvXpjsr0PzDoHnTU0vLa11ixtLK5BSMfU7tbhAT/y0W99&#xA;bOGp3Tif1YEMWl/Lq80xQLhNZ19pS/ptpur6jaiFI1HBZRe6wOTMT8LR7VFSF2OFUJc+XZFiUSeW&#xA;PODjkoTjr7u3KnIH4daNOJNKnb8MVXHy08UI4eWfNzx1UIo19yRtRSA2sgr9r2p1NKVxVkWnaNr/&#xA;APhnUItGj1TQ9Ua4MkSapfR3Ukh4AErPM2tpHFQ1VVX7S/ZArUKlf6J/OgCZRe1aRWEbtqNmRGxN&#xA;QwA0RSaDYcq+/jhVMdMX82rOFYrm1tNS5MGNxc6oElQMBVeNvpcEbBd6GlTiqtdan+aFvZzXP6As&#xA;pTCjuYItUleRuHI0RRYfEWoOI679MVYfpk91feadNmn/AC2t7W5nuEnn1t4JRLbyvJyeX1G09GLg&#xA;sW5cwCerDrir2fArsVdirsVS7VNNZ9OuF02G2jvyhFs8sYKB+xYAHJxlvvyV5RbXX5rCVo7nTnZe&#xA;QHqNZxKqb0r+5iLMN+wOZpGLv+1ls3cnWXsJ5b9bpEiDl2igvo02FOLN6UdCW/2I/DCKvb9CpJGn&#xA;p3kR0lLs3fJmVLGSO9LAUr6iJLP08CN8s6b/AKkvQfKtp+ZD3tvcXc0cGkSqDcwXEMMNwRuDRYEV&#xA;lbw5N/TMTIcdbc2JpNU0TztFcJEmqQyWS8VNxMZWuCoABZlUpHyPXamQE4Vy3VkkFoVhjWWR5JVU&#xA;CSQM6hmA3YLyNKntXKSUL/q0fi//ACMf/mrG1Y/rvl/V2vFv9EFgLugVmvUn9ToQXE8UnL7NAF4/&#xA;TlsMgqpWm0qS21rR7GNNRtrjUZioiSw0p5xaxRqSOQY0YuQR8LGm22TsSOxr30qiPNGpX7y2Gl6T&#xA;fJqDQOsD3lzNDFzRSalgG+Pw6AnaoG+E4wNyRS0ym70e7nsCLe8mtL1kX4vVkdA6g9ix2JO9D2yk&#xA;TAPLZDHGtvM9netdamNQubSAkhdN4lpafCqspnaQoeXKiqDUdRuDbcSKFfH+xLJfL0U6w3U8ttJa&#xA;/Wrhpo4ZuJlCFEQFyry7nhXc1HSmUzPJD490nWL/AEm4a4sjEJXQxN60MNwvFiCfgmSRe3Wlc3so&#xA;iXNmmI876+IDCfqbIS5+KwsWI9RmdqEw1A5OT7dsj4UfP5lWx568wiN4x9SCyVD006wBNdzuIK4P&#xA;Bj5/Mqtt/O2vW8EUEX1MJDGsSFtPsXcogoOTvCzMadyanvhOKJ7/AJlV0/nnzBMgRxZBQhjXjp9i&#xA;rKrCh4sIOSn3BriMUfP5lWP5YrsVdirsVdirsVdirsVRFlePaTiZI4pSBThPGsqf8C4IwEWr0b/n&#xA;Hj/lPn/5gZv+Jx5i636PigvpfNQxdir5o/5yH/5T5P8AmBh/4nJm30X0fFkGHv5212ScTSLYu3D0&#xA;iradYFChKndPQ4k/AtDSoy/wh5/MpWr5w1dZPUWDTg3Uf7i9OoOnQfV6fs4+EPP5n9auXzlrS3M9&#xA;xwsTLcBPV5adYMtYyxVghg4K3xmrAVPfoMfCHn8yqp/jnXeMg9PT/wB7/ef7jNO3+f7jB4MfP5n9&#xA;apRf39xfXBuJ1iVyAvGCGK3jAHhHCsaD6BlgFKhsKuxV2KuxV2KuxV2KuxV2Ksq/5Bb/ANrz/p0y&#xA;n95/R+1Xf8gt/wC15/06Y/vP6P2q7/kFv/a8/wCnTH95/R+1Xf8AILf+15/06Y/vP6P2q7/kFv8A&#xA;2vP+nTH95/R+1Xf8gt/7Xn/Tpj+8/o/arv8AkFv/AGvP+nTH95/R+1Xf8gt/7Xn/AE6Y/vP6P2q7&#xA;/kFv/a8/6dMf3n9H7Vd/yC3/ALXn/Tpj+8/o/arv+QW/9rz/AKdMf3n9H7Vd/wAgt/7Xn/Tpj+8/&#xA;o/arv+QW/wDa8/6dMf3n9H7Vd/yC3/tef9OmP7z+j9qvQPyR/wAE/wCM3/Qv6S+ufVJa/XPQ9Lhy&#xA;Sv8Ad/FXpmNq+Pg3pBe95rGLsVeHfnL/AMq1/wAXr/iP9M/pD6rFT9HfVfR9Pk/H+++LlWtc2Ol8&#xA;Tg9PDXnbIMF/5Af/AN/N/wBy/Mn99/R+1d3f8gP/AO/m/wC5fj++/o/au7v+QH/9/N/3L8f339H7&#xA;V3d/yA//AL+b/uX4/vv6P2ru7/kB/wD383/cvx/ff0ftXd3/ACA//v5v+5fj++/o/au7v+QH/wDf&#xA;zf8Acvx/ff0ftXd3/ID/APv5v+5fj++/o/au7v8AkB//AH83/cvx/ff0ftXd3/ID/wDv5v8AuX4/&#xA;vv6P2ru7/kB//fzf9y/H99/R+1d3f8gP/wC/m/7l+P77+j9q7u/5Af8A9/N/3L8f339H7V3d/wAg&#xA;P/7+b/uX4/vv6P2ru//Z</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ <xmpMM:InstanceID>uuid:9ceda8ff-23f0-3d4d-bee2-d129ed5be150</xmpMM:InstanceID>
+ <xmpMM:DocumentID>xmp.did:6e0ad609-63ba-4487-8c26-1d3d45c1e92e</xmpMM:DocumentID>
+ <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:1429a63f-381b-4bbe-b610-dcd92ca51b5b</stRef:instanceID>
+ <stRef:documentID>xmp.did:d92220c8-81e6-9646-85ef-ad1bfcf188fa</stRef:documentID>
+ <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:6e0ad609-63ba-4487-8c26-1d3d45c1e92e</stEvt:instanceID>
+ <stEvt:when>2016-10-31T17:23:56Z</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CC 2015.3 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>11.000000</stDim:w>
+ <stDim:h>8.500000</stDim:h>
+ <stDim:unit>Inches</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>100.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Red</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Green</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>15.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>90.000000</xmpG:yellow>
+ <xmpG:black>10.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>90.000000</xmpG:magenta>
+ <xmpG:yellow>85.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>80.000000</xmpG:magenta>
+ <xmpG:yellow>95.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>50.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>35.000000</xmpG:magenta>
+ <xmpG:yellow>85.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>5.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>90.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>20.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>75.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>85.000000</xmpG:cyan>
+ <xmpG:magenta>10.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>10.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>90.000000</xmpG:cyan>
+ <xmpG:magenta>30.000000</xmpG:magenta>
+ <xmpG:yellow>95.000000</xmpG:yellow>
+ <xmpG:black>30.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>75.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>75.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>80.000000</xmpG:cyan>
+ <xmpG:magenta>10.000000</xmpG:magenta>
+ <xmpG:yellow>45.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>70.000000</xmpG:cyan>
+ <xmpG:magenta>15.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>85.000000</xmpG:cyan>
+ <xmpG:magenta>50.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>95.000000</xmpG:magenta>
+ <xmpG:yellow>5.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>25.000000</xmpG:yellow>
+ <xmpG:black>25.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>75.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>35.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>35.000000</xmpG:yellow>
+ <xmpG:black>10.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>10.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>50.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>95.000000</xmpG:magenta>
+ <xmpG:yellow>20.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>25.000000</xmpG:cyan>
+ <xmpG:magenta>25.000000</xmpG:magenta>
+ <xmpG:yellow>40.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>40.000000</xmpG:cyan>
+ <xmpG:magenta>45.000000</xmpG:magenta>
+ <xmpG:yellow>50.000000</xmpG:yellow>
+ <xmpG:black>5.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.000000</xmpG:cyan>
+ <xmpG:magenta>50.000000</xmpG:magenta>
+ <xmpG:yellow>60.000000</xmpG:yellow>
+ <xmpG:black>25.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>55.000000</xmpG:cyan>
+ <xmpG:magenta>60.000000</xmpG:magenta>
+ <xmpG:yellow>65.000000</xmpG:yellow>
+ <xmpG:black>40.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>25.000000</xmpG:cyan>
+ <xmpG:magenta>40.000000</xmpG:magenta>
+ <xmpG:yellow>65.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>30.000000</xmpG:cyan>
+ <xmpG:magenta>50.000000</xmpG:magenta>
+ <xmpG:yellow>75.000000</xmpG:yellow>
+ <xmpG:black>10.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>35.000000</xmpG:cyan>
+ <xmpG:magenta>60.000000</xmpG:magenta>
+ <xmpG:yellow>80.000000</xmpG:yellow>
+ <xmpG:black>25.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>40.000000</xmpG:cyan>
+ <xmpG:magenta>65.000000</xmpG:magenta>
+ <xmpG:yellow>90.000000</xmpG:yellow>
+ <xmpG:black>35.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>40.000000</xmpG:cyan>
+ <xmpG:magenta>70.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>50.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.000000</xmpG:cyan>
+ <xmpG:magenta>70.000000</xmpG:magenta>
+ <xmpG:yellow>80.000000</xmpG:yellow>
+ <xmpG:black>70.000000</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Grays</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>100.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>89.999400</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>79.998800</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>69.999700</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>59.999100</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>50.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>39.999400</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>29.998800</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>19.999700</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>9.999100</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>4.998800</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Brights</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>75.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>10.000000</xmpG:magenta>
+ <xmpG:yellow>95.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>85.000000</xmpG:cyan>
+ <xmpG:magenta>10.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>90.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>60.000000</xmpG:cyan>
+ <xmpG:magenta>90.000000</xmpG:magenta>
+ <xmpG:yellow>0.003100</xmpG:yellow>
+ <xmpG:black>0.003100</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 2/Kids[7 0 R 8 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[9.0 9.0 801.0 621.0]/BleedBox[0.0 0.0 810.0 630.0]/Contents 9 0 R/Group 10 0 R/LastModified(D:20161031172420Z)/MediaBox[0.0 0.0 810.0 630.0]/Parent 3 0 R/PieceInfo<</Illustrator 11 0 R>>/Resources<</ExtGState<</GS0 12 0 R>>/Properties<</MC0 5 0 R>>/XObject<</Fm0 13 0 R>>>>/Thumb 14 0 R/TrimBox[9.0 9.0 801.0 621.0]/Type/Page>> endobj 8 0 obj <</ArtBox[9.0 9.0 801.0 621.0]/BleedBox[0.0 0.0 810.0 630.0]/Contents 15 0 R/Group 16 0 R/LastModified(D:20161031172420Z)/MediaBox[0.0 0.0 810.0 630.0]/Parent 3 0 R/PieceInfo<</Illustrator 11 0 R>>/Resources<</ExtGState<</GS0 12 0 R>>/Properties<</MC0 5 0 R>>/XObject<</Fm0 17 0 R>>>>/Thumb 18 0 R/TrimBox[9.0 9.0 801.0 621.0]/Type/Page>> endobj 15 0 obj <</Filter/FlateDecode/Length 74>>stream
+HwVu6PprqV*2P036P04P1R
+@}\|@.W_@.
+8;Z,'9pXNV$mt_*&*&q$Q^LQqM6=FYXa>kGj/ck9Fc%GnKFj5?R_77h@jVCad\dU!
+!@o_jlu@L%GWqGb9DU0#r%F![m'CIIL+eng%_hma##WkB(D#8`gtokLpXBs3)T[]P
+aS.3->!%A_T&_MJ,.&D(*L5Edr1-s#*Od-"j0Mi3,pO$DiV>V\g<)I+Z1a:?3'!"[
+,E099(b'^6ZSm'GOo6<8kT`ZX*hT,FC^<44q*l4X_u'_.`Qg#05&SD*+".%fD61.H
+R3,5+c1C>:Q`[@B;L74hfr_AP(eMi`mgk?e"PoS0\N%H-D5T74Kt?Ne'YAX&%haHu
+P_QqYYRpg=_9lFk2c2P&U81d_M.nn`,7i-VSHhbY]-AD+,^:i2@Ps=TT$<4M+hb&0
+1ad[Z.E!U&()-Sl?c^U4S*59e(go7lo&#+bq6I3pA,6YCMQYQ$jp8M?hGn2Rf@qKE
+O;X+!e@p\Dq"3iaqO,*W76BMFBCbG<5>kBq[[**iM@5@RdPoGr2R<Ka1(MP&.5G@s
+CjsQb`[@+3'5Ma&:e/^ns)nF7iJOBbYS5QMN8`V<Z^8>.!%X(VM'%%CXt5D=K88^U
+A5PjHofbFW8*?AjCs7^-AA;:^@)W]T#"r6%;SJgZ^htOc6TX`OFo,Lq:^s9]_c?9m
+oR%+FcUm#3ChlpHATYp8hgauV=NRL]JA<tDnj)@OSSo.(PX$L'M54K;L%if51>$rp
+:=oT7;hT@-Q0a#TENIMp$k$ohE)'FaP;p*G$(`5WN]D-E9o,XIAQ!_t]*a?=$],97
+]8g$nlRo3>0LXRJoJ_.mZ(d?t'dU$&'Lsd\loEhPFS5T0'Aju;@L`r:P,Vt.q<\'n
+[<6!\'mG%DPnK(i3iT/pf(<W,DWNZ%IT0K.Oe@i$`[>"]bKqF2Djj_$I]22]I.HH;
+&gn4GDaA%SD4eK()fLpnaiTm!ol;7#Z8:7IVIpulM7Ol(0^A&$=<Tar\`CKE(3a5=
+Z^c<E>oQ?KL:YTRZFFH@4KR"af:8PTLqe7[Gq8(QF<=YlR)Fe:0XaS'<[RW*5LDJ,
+B>MXR==NO+:52b`%n08C`ot099)<O:-n3BMGWXDnl.K3%)bR?Rq\:ZiZq?8T/R1W]
+0*]a#[b`XKMUS3P#)$X9C[nFM-]M?si(b^ZWj]5LoGFjkq;rMWE*=36_=ES@Oqd&k
+bHXok9NT;OH">-<<4'5B+G:Mj-r6@8Bc#iW8s>7%Kc1'=)5=O9Q@fl5`ll*c&2>$C
+HCC:$.mFi2(9d>$,RgouR/$79a$FJ3]Jpki*3)-UbWOAs[IQL,Y8P[,o!c7qm]SnH
+&k7<\!;*UBg&~> endstream endobj 19 0 obj [/Indexed/DeviceRGB 255 20 0 R] endobj 20 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 17 0 obj <</BBox[0.0 630.0 810.0 0.332611]/Group 21 0 R/Length 1521589/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R/GS1 22 0 R/GS2 23 0 R/GS3 24 0 R/GS4 25 0 R/GS5 26 0 R/GS6 27 0 R>>/XObject<</Fm0 28 0 R/Fm1 29 0 R/Fm10 30 0 R/Fm11 31 0 R/Fm12 32 0 R/Fm13 33 0 R/Fm14 34 0 R/Fm15 35 0 R/Fm16 36 0 R/Fm17 37 0 R/Fm18 38 0 R/Fm19 39 0 R/Fm2 40 0 R/Fm20 41 0 R/Fm21 42 0 R/Fm22 43 0 R/Fm23 44 0 R/Fm24 45 0 R/Fm25 46 0 R/Fm26 47 0 R/Fm27 48 0 R/Fm28 49 0 R/Fm29 50 0 R/Fm3 51 0 R/Fm30 52 0 R/Fm31 53 0 R/Fm32 54 0 R/Fm33 55 0 R/Fm34 56 0 R/Fm4 57 0 R/Fm5 58 0 R/Fm6 59 0 R/Fm7 60 0 R/Fm8 61 0 R/Fm9 62 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+0 630 810 -114.999 re
+f
+0 75 810 -74.667 re
+f
+q
+273.583 568.502 m
+272.764 568.502 272.076 567.939 271.892 567.175 c
+245.324 567.175 l
+245.232 567.175 245.159 567.061 245.166 566.97 c
+245.174 566.877 245.265 566.796 245.361 566.796 c
+271.834 566.796 l
+271.834 566.763 l
+271.834 565.801 272.621 565.025 273.583 565.025 c
+274.516 565.025 275.266 565.761 275.306 566.683 c
+278.83 566.191 280.818 564.192 282.861 562.148 c
+284.872 560.138 286.941 558.087 290.472 557.532 c
+290.568 556.662 291.288 555.989 292.184 555.989 c
+293.03 555.989 293.728 556.585 293.886 557.381 c
+300.581 557.381 l
+300.739 556.585 301.441 555.989 302.287 555.989 c
+303.132 555.989 303.83 556.585 303.988 557.381 c
+311.257 557.381 l
+316.026 557.381 318.452 559.793 320.807 562.148 c
+322.916 564.257 324.971 566.311 328.715 566.719 c
+328.738 565.779 329.516 565.025 330.465 565.025 c
+331.423 565.025 332.199 565.801 332.199 566.763 c
+332.199 566.796 l
+347.328 566.796 l
+347.328 566.763 l
+347.328 565.801 348.104 565.025 349.066 565.025 c
+350.003 565.025 350.764 565.763 350.801 566.694 c
+354.542 566.293 357.463 564.695 359.977 562.434 c
+362.895 559.807 365.253 556.286 367.609 552.755 c
+369.965 549.223 372.32 545.678 375.289 543.01 c
+377.454 541.062 379.945 539.588 382.977 538.931 c
+369.38 538.931 l
+369.222 539.729 368.524 540.334 367.679 540.334 c
+366.834 540.334 366.121 539.729 365.963 538.931 c
+350.779 538.931 l
+350.621 539.729 349.912 540.334 349.066 540.334 c
+348.254 540.334 347.578 539.773 347.387 539.019 c
+343.745 539.471 341.717 541.503 339.637 543.579 c
+337.561 545.659 335.418 547.783 331.662 548.253 c
+331.612 549.169 330.854 549.9 329.925 549.9 c
+329.028 549.9 328.308 549.217 328.212 548.346 c
+322.611 548.346 l
+322.52 549.217 321.785 549.9 320.888 549.9 c
+319.992 549.9 319.267 549.217 319.172 548.346 c
+314.295 548.346 l
+317.177 549.11 319.014 550.94 320.807 552.733 c
+322.829 554.754 324.802 556.735 328.256 557.256 c
+328.462 556.522 329.127 555.989 329.925 555.989 c
+330.773 555.989 331.486 556.588 331.641 557.393 c
+347.361 557.393 l
+347.516 556.588 348.217 555.989 349.066 555.989 c
+350.026 555.989 350.812 556.764 350.812 557.724 c
+350.812 558.686 350.026 559.461 349.066 559.461 c
+348.115 559.461 347.346 558.705 347.328 557.761 c
+331.674 557.761 l
+331.655 558.705 330.876 559.461 329.925 559.461 c
+328.965 559.461 328.19 558.686 328.19 557.724 c
+328.19 557.69 328.198 557.657 328.201 557.624 c
+324.637 557.08 322.553 555.016 320.531 552.994 c
+318.253 550.712 316.049 548.481 311.69 548.346 c
+303.473 548.346 l
+303.463 548.456 303.436 548.558 303.403 548.666 c
+303.374 548.764 303.338 548.86 303.29 548.948 c
+303.242 549.047 303.187 549.14 303.12 549.223 c
+303.069 549.29 303.01 549.349 302.948 549.408 c
+302.933 549.418 302.929 549.441 302.915 549.452 c
+302.893 549.47 302.867 549.481 302.845 549.499 c
+302.786 549.547 302.727 549.595 302.661 549.635 c
+302.577 549.691 302.485 549.734 302.389 549.771 c
+302.191 549.848 301.974 549.9 301.75 549.9 c
+301.632 549.9 301.514 549.886 301.404 549.863 c
+301.291 549.841 301.18 549.805 301.074 549.761 c
+300.978 549.72 300.876 549.668 300.787 549.613 c
+300.783 549.61 300.78 549.603 300.776 549.603 c
+300.685 549.539 300.604 549.462 300.527 549.385 c
+300.456 549.312 300.39 549.238 300.332 549.154 c
+300.295 549.103 300.261 549.044 300.228 548.985 c
+300.207 548.945 300.178 548.911 300.159 548.871 c
+300.155 548.86 300.155 548.845 300.148 548.834 c
+300.107 548.735 300.082 548.635 300.056 548.525 c
+300.049 548.481 300.041 548.437 300.034 548.39 c
+300.026 548.334 300.012 548.276 300.012 548.217 c
+296.411 547.688 294.32 545.612 292.288 543.579 c
+291.983 543.274 291.681 542.977 291.372 542.675 c
+289.866 544.288 288.874 546.247 287.878 548.242 c
+286.698 550.594 285.504 552.98 283.409 554.777 c
+281.568 556.353 279.036 557.455 275.241 557.701 c
+275.019 558.414 274.366 558.937 273.583 558.937 c
+272.819 558.937 272.172 558.444 271.937 557.761 c
+226.7 557.761 l
+226.642 557.761 l
+226.546 557.746 226.469 557.639 226.484 557.543 c
+226.494 557.445 226.601 557.371 226.7 557.381 c
+271.856 557.381 l
+271.852 557.319 271.834 557.264 271.834 557.198 c
+271.834 556.239 272.621 555.453 273.583 555.453 c
+274.545 555.453 275.321 556.239 275.321 557.198 c
+275.321 557.242 275.31 557.283 275.306 557.327 c
+278.985 557.069 281.41 555.989 283.17 554.478 c
+285.195 552.745 286.356 550.426 287.532 548.07 c
+288.528 546.078 289.535 544.064 291.089 542.403 c
+289.429 540.831 287.602 539.478 284.813 539.067 c
+284.607 539.794 283.942 540.334 283.145 540.334 c
+282.3 540.334 281.601 539.729 281.443 538.927 c
+275.285 538.927 l
+275.127 539.729 274.428 540.334 273.583 540.334 c
+272.738 540.334 272.029 539.729 271.867 538.927 c
+226.484 538.927 l
+226.476 538.931 198.221 538.931 198.214 538.927 c
+198.114 538.923 198.027 538.824 198.033 538.725 c
+198.037 538.622 198.125 538.538 198.225 538.541 c
+271.834 538.541 l
+271.86 537.601 272.635 536.851 273.583 536.851 c
+274.527 536.851 275.295 537.601 275.321 538.541 c
+281.41 538.541 l
+281.432 537.601 282.2 536.851 283.145 536.851 c
+284.093 536.851 284.857 537.601 284.883 538.541 c
+300.012 538.541 l
+300.037 537.601 300.802 536.851 301.75 536.851 c
+302.694 536.851 303.473 537.601 303.496 538.541 c
+308.217 538.541 l
+305.337 537.77 303.496 535.947 301.703 534.154 c
+299.7 532.147 297.734 530.192 294.335 529.652 c
+294.081 530.299 293.449 530.759 292.71 530.759 c
+291.92 530.759 291.266 530.225 291.052 529.502 c
+275.241 529.502 l
+275.027 530.225 274.373 530.759 273.583 530.759 c
+272.793 530.759 272.128 530.225 271.915 529.502 c
+235.898 529.502 l
+235.792 529.516 235.693 529.425 235.693 529.317 c
+235.693 529.211 235.792 529.123 235.898 529.138 c
+271.844 529.138 l
+271.844 529.097 271.834 529.064 271.834 529.024 c
+271.834 528.061 272.621 527.274 273.583 527.274 c
+274.545 527.274 275.321 528.061 275.321 529.024 c
+275.321 529.064 275.31 529.097 275.306 529.138 c
+290.987 529.138 l
+290.983 529.097 290.972 529.064 290.972 529.024 c
+290.972 528.061 291.748 527.274 292.71 527.274 c
+293.672 527.274 294.459 528.061 294.459 529.024 c
+294.459 529.119 294.452 529.203 294.437 529.296 c
+297.917 529.869 299.972 531.894 301.967 533.889 c
+304.021 535.947 306.031 537.961 309.599 538.439 c
+309.676 537.545 310.411 536.851 311.323 536.851 c
+312.271 536.851 313.036 537.601 313.061 538.541 c
+319.15 538.541 l
+319.176 537.601 319.94 536.851 320.888 536.851 c
+321.833 536.851 322.611 537.601 322.638 538.541 c
+330.086 538.541 l
+334.731 538.541 337.021 536.245 339.376 533.889 c
+341.455 531.813 343.595 529.696 347.35 529.23 c
+347.343 529.159 347.328 529.093 347.328 529.024 c
+347.328 528.061 348.104 527.274 349.066 527.274 c
+350.026 527.274 350.812 528.061 350.812 529.024 c
+350.812 529.064 350.804 529.097 350.801 529.138 c
+356.904 529.138 l
+356.9 529.097 356.894 529.064 356.894 529.024 c
+356.894 528.061 357.68 527.274 358.639 527.274 c
+359.602 527.274 360.377 528.061 360.377 529.024 c
+360.377 529.064 360.37 529.097 360.366 529.138 c
+375.517 529.138 l
+375.514 529.097 375.506 529.064 375.506 529.024 c
+375.506 528.061 376.282 527.274 377.244 527.274 c
+378.204 527.274 378.979 528.061 378.979 529.024 c
+378.979 529.101 378.967 529.174 378.957 529.252 c
+382.595 529.766 384.697 531.846 386.74 533.889 c
+388.75 535.899 390.713 537.857 394.13 538.391 c
+394.229 537.523 394.95 536.851 395.846 536.851 c
+396.791 536.851 397.57 537.601 397.591 538.541 c
+414.859 538.541 l
+419.504 538.541 421.782 536.245 424.138 533.889 c
+426.17 531.856 428.265 529.788 431.874 529.263 c
+431.862 529.182 431.851 529.108 431.851 529.024 c
+431.851 528.061 432.634 527.274 433.597 527.274 c
+434.559 527.274 435.335 528.061 435.335 529.024 c
+435.335 529.064 435.324 529.097 435.324 529.138 c
+441.435 529.138 l
+441.435 529.097 441.424 529.064 441.424 529.024 c
+441.424 528.061 442.199 527.274 443.163 527.274 c
+444.125 527.274 444.911 528.061 444.911 529.024 c
+444.911 529.982 444.125 530.759 443.163 530.759 c
+442.369 530.759 441.718 530.225 441.505 529.502 c
+435.254 529.502 l
+435.041 530.225 434.391 530.759 433.597 530.759 c
+432.847 530.759 432.208 530.281 431.965 529.616 c
+428.441 530.111 426.453 532.11 424.41 534.154 c
+422.617 535.947 420.779 537.77 417.898 538.541 c
+431.851 538.541 l
+431.874 537.601 432.653 536.851 433.597 536.851 c
+434.559 536.851 435.335 537.622 435.335 538.586 c
+435.335 539.548 434.559 540.334 433.597 540.334 c
+432.751 540.334 432.042 539.729 431.884 538.927 c
+408.473 538.927 l
+411.353 539.698 413.191 541.51 414.985 543.303 c
+416.98 545.302 418.938 547.258 422.319 547.809 c
+422.48 547.016 423.182 546.412 424.024 546.412 c
+424.917 546.412 425.652 547.096 425.748 547.967 c
+431.874 547.967 l
+431.969 547.096 432.704 546.412 433.597 546.412 c
+434.559 546.412 435.335 547.199 435.335 548.162 c
+435.335 549.125 434.559 549.9 433.597 549.9 c
+432.701 549.9 431.969 549.217 431.874 548.346 c
+425.748 548.346 l
+425.652 549.217 424.921 549.9 424.024 549.9 c
+423.068 549.9 422.297 549.136 422.286 548.184 c
+418.784 547.618 416.722 545.582 414.723 543.579 c
+412.367 541.224 410.079 538.927 405.433 538.927 c
+397.558 538.927 l
+397.4 539.729 396.691 540.334 395.846 540.334 c
+395 540.334 394.302 539.729 394.141 538.927 c
+388.522 538.927 l
+388.515 538.96 388.507 538.99 388.496 539.019 c
+388.478 539.104 388.452 539.181 388.419 539.262 c
+388.386 539.339 388.349 539.416 388.305 539.49 c
+388.284 539.526 388.257 539.559 388.236 539.592 c
+388.176 539.673 388.11 539.75 388.041 539.82 c
+387.971 539.89 387.904 539.956 387.824 540.015 c
+387.813 540.022 387.802 540.03 387.791 540.037 c
+387.784 540.045 387.773 540.045 387.765 540.048 c
+387.681 540.107 387.589 540.155 387.493 540.199 c
+387.287 540.284 387.056 540.334 386.817 540.334 c
+386.696 540.334 386.582 540.313 386.464 540.286 c
+386.376 540.268 386.284 540.253 386.2 540.221 c
+386.141 540.199 386.086 540.169 386.03 540.14 c
+385.994 540.122 385.961 540.103 385.928 540.085 c
+385.876 540.051 385.824 540.026 385.777 539.993 c
+385.726 539.952 385.678 539.897 385.63 539.853 c
+385.612 539.839 385.589 539.827 385.571 539.809 c
+385.494 539.732 385.428 539.648 385.365 539.555 c
+385.307 539.467 385.252 539.372 385.207 539.272 c
+385.207 539.262 l
+385.171 539.174 385.138 539.089 385.116 538.997 c
+381.184 539.324 378.141 540.941 375.539 543.282 c
+372.621 545.909 370.273 549.429 367.917 552.961 c
+365.566 556.492 363.21 560.046 360.241 562.717 c
+357.673 565.033 354.633 566.683 350.779 567.083 c
+350.631 567.891 349.919 568.502 349.066 568.502 c
+348.247 568.502 347.57 567.936 347.387 567.175 c
+332.144 567.175 l
+331.957 567.936 331.284 568.502 330.465 568.502 c
+329.619 568.502 328.907 567.906 328.749 567.105 c
+324.846 566.701 322.656 564.533 320.535 562.409 c
+318.18 560.057 315.901 557.761 311.257 557.761 c
+304.024 557.761 l
+304.006 558.705 303.238 559.461 302.287 559.461 c
+301.335 559.461 300.567 558.705 300.548 557.761 c
+293.923 557.761 l
+293.905 558.705 293.136 559.461 292.184 559.461 c
+291.288 559.461 290.568 558.789 290.472 557.919 c
+287.084 558.466 285.122 560.41 283.123 562.409 c
+281.068 564.467 278.967 566.573 275.285 567.072 c
+275.141 567.888 274.439 568.502 273.583 568.502 c
+271.639 551.054 m
+271.639 545.329 l
+273.55 542.459 l
+275.457 545.329 l
+275.457 551.054 l
+h
+394.086 551.054 m
+394.086 545.329 l
+395.993 542.459 l
+397.9 545.329 l
+397.9 551.054 l
+h
+303.473 547.967 m
+319.172 547.967 l
+319.271 547.096 319.992 546.412 320.888 546.412 c
+321.785 546.412 322.516 547.096 322.611 547.967 c
+328.212 547.967 l
+328.308 547.096 329.031 546.412 329.925 546.412 c
+330.791 546.412 331.516 547.048 331.652 547.875 c
+335.275 547.419 337.303 545.38 339.376 543.303 c
+341.169 541.51 343.007 539.698 345.887 538.931 c
+341.202 538.931 l
+341.044 539.729 340.346 540.334 339.501 540.334 c
+338.656 540.334 337.946 539.729 337.788 538.931 c
+322.6 538.931 l
+322.443 539.729 321.734 540.334 320.888 540.334 c
+320.043 540.334 319.345 539.729 319.187 538.931 c
+313.028 538.931 l
+312.87 539.729 312.168 540.334 311.323 540.334 c
+310.478 540.334 309.78 539.729 309.622 538.931 c
+303.463 538.931 l
+303.305 539.729 302.595 540.334 301.75 540.334 c
+300.93 540.334 300.255 539.761 300.067 538.997 c
+296.411 539.254 293.996 540.316 292.243 541.819 c
+292.026 542.003 291.821 542.208 291.626 542.403 c
+291.939 542.705 292.243 542.999 292.552 543.303 c
+294.58 545.333 296.565 547.328 300.045 547.842 c
+300.063 547.754 300.085 547.662 300.115 547.577 c
+300.118 547.563 300.122 547.548 300.126 547.534 c
+300.155 547.457 300.199 547.386 300.24 547.317 c
+300.247 547.302 300.255 547.284 300.261 547.269 c
+300.295 547.214 300.328 547.162 300.365 547.111 c
+300.416 547.045 300.467 546.986 300.527 546.927 c
+300.589 546.865 300.651 546.81 300.721 546.754 c
+300.754 546.732 300.787 546.711 300.824 546.688 c
+300.872 546.659 300.92 546.634 300.971 546.607 c
+301.022 546.582 301.074 546.549 301.133 546.526 c
+301.217 546.493 301.313 546.468 301.404 546.449 c
+301.518 546.424 301.628 546.412 301.75 546.412 c
+301.974 546.412 302.18 546.46 302.378 546.538 c
+302.478 546.578 302.573 546.622 302.661 546.677 c
+302.727 546.717 302.786 546.765 302.845 546.813 c
+302.867 546.831 302.893 546.839 302.915 546.857 c
+302.937 546.879 302.959 546.905 302.981 546.927 c
+303.11 547.056 303.209 547.203 303.29 547.361 c
+303.338 547.453 303.374 547.548 303.403 547.648 c
+303.436 547.75 303.463 547.857 303.473 547.967 c
+291.351 542.139 m
+291.556 541.933 291.773 541.731 292.001 541.533 c
+293.397 540.338 295.195 539.416 297.634 538.931 c
+286.036 538.931 l
+288.286 539.53 289.899 540.768 291.351 542.139 c
+441.174 540.687 m
+441.174 534.966 l
+443.082 532.107 l
+444.988 534.966 l
+444.988 540.687 l
+h
+333.125 538.541 m
+337.752 538.541 l
+337.777 537.601 338.556 536.851 339.501 536.851 c
+340.449 536.851 341.214 537.601 341.239 538.541 c
+347.328 538.541 l
+347.354 537.601 348.118 536.851 349.066 536.851 c
+350.01 536.851 350.789 537.601 350.812 538.541 c
+365.93 538.541 l
+365.955 537.601 366.731 536.851 367.679 536.851 c
+368.623 536.851 369.392 537.601 369.417 538.541 c
+385.068 538.541 l
+385.072 538.497 385.076 538.457 385.079 538.416 c
+385.09 538.343 385.097 538.269 385.116 538.2 c
+385.138 538.096 385.167 538.005 385.207 537.913 c
+385.23 537.861 385.259 537.814 385.284 537.762 c
+385.365 537.616 385.465 537.472 385.583 537.35 c
+385.604 537.332 385.63 537.314 385.652 537.296 c
+385.795 537.167 385.953 537.064 386.134 536.987 c
+386.144 536.987 l
+386.244 536.943 386.354 536.906 386.464 536.884 c
+386.475 536.884 l
+386.586 536.862 386.699 536.851 386.817 536.851 c
+386.938 536.851 387.048 536.862 387.158 536.884 c
+387.332 536.917 387.49 536.987 387.64 537.068 c
+387.688 537.094 387.744 537.115 387.787 537.145 c
+387.875 537.204 387.952 537.269 388.03 537.34 c
+388.041 537.35 l
+388.052 537.365 388.062 537.383 388.074 537.398 c
+388.137 537.464 388.206 537.538 388.257 537.616 c
+388.313 537.699 388.364 537.784 388.405 537.876 c
+388.411 537.888 388.411 537.902 388.415 537.913 c
+388.456 538.005 388.486 538.1 388.507 538.2 c
+388.526 538.269 388.537 538.343 388.544 538.416 c
+388.548 538.457 388.552 538.497 388.555 538.541 c
+392.976 538.541 l
+390.095 537.77 388.257 535.947 386.464 534.154 c
+384.413 532.103 382.418 530.104 378.876 529.616 c
+378.63 530.281 377.994 530.759 377.241 530.759 c
+376.451 530.759 375.796 530.225 375.587 529.502 c
+360.297 529.502 l
+360.083 530.225 359.433 530.759 358.639 530.759 c
+357.849 530.759 357.184 530.225 356.971 529.502 c
+350.735 529.502 l
+350.521 530.225 349.856 530.759 349.066 530.759 c
+348.306 530.759 347.67 530.269 347.431 529.593 c
+343.764 530.03 341.724 532.066 339.637 534.154 c
+337.844 535.947 336.006 537.77 333.125 538.541 c
+320.866 535.079 m
+318.955 532.221 l
+318.955 526.485 l
+322.773 526.485 l
+322.773 532.221 l
+h
+W n
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+/GS1 gs
+0 TL/Fm0 Do
+Q
+Q
+0 0 0 0 k
+q 1 0 0 1 40.6324 64.7361 cm
+0 0 m
+-0.276 -0.306 -0.632 -0.541 -1.073 -0.706 c
+-1.507 -0.871 -1.97 -0.948 -2.469 -0.941 c
+-2.911 -0.941 -3.293 -0.846 -3.616 -0.662 c
+-3.939 -0.467 -4.189 -0.188 -4.366 0.176 c
+-4.542 0.536 -4.642 0.955 -4.659 1.425 c
+-4.671 1.679 -4.656 1.944 -4.615 2.219 c
+-4.439 3.424 l
+-4.285 4.453 -3.95 5.247 -3.439 5.805 c
+-2.932 6.364 -2.263 6.632 -1.44 6.614 c
+-0.735 6.603 -0.206 6.393 0.147 5.982 c
+0.5 5.57 0.68 4.968 0.69 4.174 c
+-0.721 4.174 l
+-0.735 4.586 l
+-0.775 5.104 -1.037 5.373 -1.514 5.394 c
+-2.213 5.423 -2.668 4.961 -2.881 4.012 c
+-2.955 3.63 l
+-3.16 2.219 l
+-3.2 1.896 -3.215 1.616 -3.204 1.381 c
+-3.197 1.007 -3.113 0.735 -2.955 0.558 c
+-2.801 0.389 -2.583 0.301 -2.308 0.294 c
+-2.043 0.294 -1.749 0.382 -1.426 0.558 c
+-1.176 1.911 l
+-2.19 1.911 l
+-1.984 3.027 l
+0.47 3.027 l
+h
+2.095 -0.838 m
+0.698 -0.838 l
+1.639 4.629 l
+3.05 4.629 l
+h
+1.83 6.011 m
+1.83 6.247 1.903 6.437 2.051 6.585 c
+2.198 6.732 2.373 6.805 2.579 6.805 c
+2.793 6.813 2.977 6.746 3.123 6.599 c
+3.271 6.46 3.344 6.283 3.344 6.071 c
+3.344 5.835 3.271 5.644 3.123 5.497 c
+2.977 5.35 2.793 5.277 2.579 5.277 c
+2.363 5.265 2.183 5.328 2.036 5.468 c
+1.897 5.614 1.83 5.795 1.83 6.011 c
+5.945 5.967 m
+5.71 4.629 l
+6.416 4.629 l
+6.24 3.557 l
+5.534 3.557 l
+5.064 0.793 l
+5.049 0.631 l
+5.038 0.404 5.13 0.294 5.328 0.294 c
+5.388 0.282 5.505 0.286 5.681 0.309 c
+5.548 -0.809 l
+5.343 -0.897 5.097 -0.941 4.814 -0.941 c
+4.409 -0.93 4.108 -0.786 3.902 -0.5 c
+3.697 -0.206 3.616 0.183 3.667 0.675 c
+4.137 3.557 l
+3.52 3.557 l
+3.697 4.629 l
+4.314 4.629 l
+4.549 5.967 l
+h
+7.915 0.396 m
+10.444 0.396 l
+10.238 -0.838 l
+6.254 -0.838 l
+7.533 6.526 l
+8.974 6.526 l
+h
+13.498 -0.838 m
+13.475 -0.721 13.468 -0.581 13.468 -0.412 c
+13.152 -0.765 12.796 -0.941 12.395 -0.941 c
+11.973 -0.941 11.634 -0.79 11.381 -0.485 c
+11.135 -0.184 11.021 0.195 11.042 0.646 c
+11.072 1.234 11.296 1.69 11.719 2.013 c
+12.137 2.344 12.704 2.513 13.409 2.513 c
+13.82 2.513 l
+13.88 2.954 l
+13.895 3.175 l
+13.895 3.469 13.777 3.615 13.542 3.615 c
+13.218 3.623 13.02 3.417 12.954 2.998 c
+11.557 2.983 l
+11.586 3.501 11.8 3.924 12.204 4.247 c
+12.604 4.579 13.093 4.74 13.674 4.733 c
+14.21 4.722 14.622 4.549 14.909 4.218 c
+15.202 3.895 15.324 3.461 15.276 2.925 c
+14.82 0.147 l
+14.805 -0.133 l
+14.795 -0.368 14.82 -0.574 14.879 -0.75 c
+14.865 -0.838 l
+h
+12.792 0.176 m
+13.034 0.165 13.263 0.272 13.468 0.5 c
+13.718 1.646 l
+13.409 1.646 l
+13.145 1.635 12.928 1.547 12.762 1.381 c
+12.594 1.213 12.498 1.003 12.469 0.749 c
+12.469 0.558 l
+12.469 0.448 12.49 0.357 12.542 0.278 c
+12.601 0.209 12.681 0.176 12.792 0.176 c
+18.057 -0.941 m
+17.595 -0.919 17.249 -0.706 17.014 -0.294 c
+16.837 -0.838 l
+15.53 -0.838 l
+16.882 6.923 l
+18.279 6.923 l
+17.749 4.174 l
+18.061 4.556 18.418 4.74 18.822 4.733 c
+19.3 4.722 19.66 4.542 19.895 4.189 c
+20.13 3.844 20.233 3.34 20.204 2.675 c
+20.182 1.899 20.087 1.227 19.91 0.661 c
+19.74 0.091 19.502 -0.324 19.189 -0.588 c
+18.874 -0.842 18.499 -0.96 18.057 -0.941 c
+18.836 2.66 m
+18.844 2.973 18.807 3.193 18.719 3.322 c
+18.639 3.457 18.506 3.528 18.323 3.528 c
+18.065 3.534 17.83 3.403 17.617 3.131 c
+17.19 0.617 l
+17.286 0.382 17.477 0.253 17.764 0.235 c
+18.282 0.205 18.591 0.577 18.69 1.352 c
+18.734 1.72 l
+h
+25.672 1.72 m
+23.262 1.72 l
+23.482 2.91 l
+25.878 2.91 l
+h
+32.933 2.352 m
+30.684 2.352 l
+30.346 0.396 l
+33.007 0.396 l
+32.787 -0.838 l
+28.685 -0.838 l
+29.964 6.526 l
+34.065 6.526 l
+33.845 5.277 l
+31.199 5.277 l
+30.89 3.542 l
+33.139 3.542 l
+h
+35.424 1.205 m
+36.63 4.629 l
+38.115 4.629 l
+35.807 -0.838 l
+34.484 -0.838 l
+33.867 4.629 l
+35.293 4.629 l
+h
+39.966 -0.941 m
+39.526 -0.941 39.147 -0.834 38.835 -0.618 c
+38.53 -0.405 38.31 -0.103 38.173 0.278 c
+38.034 0.661 37.99 1.095 38.041 1.587 c
+38.085 1.955 l
+38.202 2.865 38.474 3.561 38.908 4.041 c
+39.349 4.519 39.912 4.751 40.599 4.733 c
+41.098 4.71 41.488 4.556 41.774 4.262 c
+42.058 3.968 42.223 3.549 42.274 3.013 c
+42.293 2.69 42.282 2.373 42.245 2.072 c
+42.157 1.411 l
+39.423 1.411 l
+39.401 1.271 39.397 1.135 39.409 0.999 c
+39.438 0.507 39.677 0.257 40.128 0.249 c
+40.548 0.239 40.955 0.4 41.348 0.735 c
+41.819 -0.133 l
+41.631 -0.389 41.371 -0.588 41.04 -0.736 c
+40.706 -0.882 40.349 -0.948 39.966 -0.941 c
+40.467 3.557 m
+40.062 3.564 39.783 3.307 39.629 2.778 c
+39.526 2.41 l
+40.907 2.41 l
+40.944 2.605 40.966 2.763 40.966 2.881 c
+40.974 3.31 40.808 3.534 40.467 3.557 c
+45.799 3.248 m
+45.358 3.307 l
+44.982 3.314 44.681 3.138 44.446 2.778 c
+43.814 -0.838 l
+42.418 -0.838 l
+43.373 4.629 l
+44.681 4.629 l
+44.564 4.027 l
+44.729 4.292 44.891 4.475 45.049 4.586 c
+45.203 4.692 45.376 4.747 45.564 4.747 c
+45.67 4.747 45.813 4.722 45.99 4.674 c
+h
+47.897 1.572 m
+49.146 4.629 l
+50.661 4.629 l
+47.853 -1.661 l
+47.647 -2.151 47.405 -2.503 47.133 -2.72 c
+46.857 -2.944 46.537 -3.057 46.177 -3.057 c
+46.037 -3.057 45.832 -3.021 45.56 -2.955 c
+45.692 -1.838 l
+45.839 -1.852 l
+46.221 -1.852 46.501 -1.68 46.677 -1.338 c
+46.912 -0.823 l
+46.339 4.629 l
+47.808 4.629 l
+h
+52.997 4.733 m
+53.556 4.71 53.986 4.519 54.291 4.159 c
+54.603 3.806 54.776 3.326 54.806 2.719 c
+54.806 2.366 l
+54.754 1.308 54.501 0.484 54.041 -0.103 c
+53.578 -0.684 52.976 -0.96 52.233 -0.941 c
+51.8 -0.93 51.443 -0.817 51.16 -0.588 c
+50.873 -0.364 50.667 -0.056 50.543 0.338 c
+50.426 0.738 50.389 1.198 50.44 1.72 c
+50.469 1.984 l
+50.565 2.844 50.84 3.52 51.292 4.012 c
+51.741 4.512 52.31 4.751 52.997 4.733 c
+51.822 1.146 m
+51.822 0.558 51.997 0.253 52.35 0.235 c
+52.839 0.205 53.159 0.577 53.306 1.352 c
+53.35 1.72 l
+53.398 2.198 53.424 2.506 53.424 2.645 c
+53.424 3.222 53.24 3.528 52.88 3.557 c
+52.604 3.564 52.38 3.439 52.204 3.175 c
+52.035 2.917 51.928 2.547 51.88 2.057 c
+51.839 1.565 51.822 1.263 51.822 1.146 c
+57.246 4.629 m
+57.142 4.086 l
+57.532 4.534 57.958 4.751 58.422 4.733 c
+58.804 4.722 59.091 4.575 59.288 4.292 c
+59.494 4.016 59.598 3.619 59.598 3.101 c
+59.568 2.645 l
+58.98 -0.838 l
+57.584 -0.838 l
+58.157 2.645 l
+58.187 2.94 l
+58.204 3.34 58.058 3.542 57.745 3.542 c
+57.599 3.542 57.47 3.501 57.363 3.424 c
+57.264 3.343 57.175 3.252 57.098 3.145 c
+56.393 -0.838 l
+54.997 -0.838 l
+55.952 4.629 l
+h
+62.141 -0.941 m
+61.699 -0.941 61.321 -0.834 61.009 -0.618 c
+60.703 -0.405 60.483 -0.103 60.347 0.278 c
+60.207 0.661 60.163 1.095 60.215 1.587 c
+60.259 1.955 l
+60.377 2.865 60.649 3.561 61.082 4.041 c
+61.522 4.519 62.085 4.751 62.773 4.733 c
+63.272 4.71 63.662 4.556 63.949 4.262 c
+64.231 3.968 64.396 3.549 64.448 3.013 c
+64.466 2.69 64.456 2.373 64.419 2.072 c
+64.331 1.411 l
+61.597 1.411 l
+61.574 1.271 61.57 1.135 61.582 0.999 c
+61.611 0.507 61.85 0.257 62.302 0.249 c
+62.721 0.239 63.128 0.4 63.522 0.735 c
+63.992 -0.133 l
+63.805 -0.389 63.544 -0.588 63.213 -0.736 c
+62.879 -0.882 62.522 -0.948 62.141 -0.941 c
+62.64 3.557 m
+62.236 3.564 61.956 3.307 61.802 2.778 c
+61.699 2.41 l
+63.081 2.41 l
+63.118 2.605 63.14 2.763 63.14 2.881 c
+63.147 3.31 62.982 3.534 62.64 3.557 c
+69.034 0.235 m
+69.416 0.224 69.655 0.5 69.754 1.058 c
+71.063 1.058 l
+71.004 0.448 70.776 -0.04 70.386 -0.412 c
+69.993 -0.786 69.519 -0.96 68.961 -0.941 c
+68.45 -0.93 68.042 -0.78 67.741 -0.485 c
+67.436 -0.192 67.255 0.213 67.197 0.735 c
+67.145 1.153 67.171 1.664 67.27 2.263 c
+67.365 2.869 67.554 3.373 67.829 3.777 c
+68.269 4.432 68.894 4.751 69.711 4.733 c
+70.258 4.71 70.681 4.512 70.974 4.13 c
+71.269 3.748 71.4 3.233 71.371 2.587 c
+70.048 2.587 l
+70.048 2.896 l
+70.037 3.314 69.875 3.534 69.563 3.557 c
+69.063 3.575 68.77 3.189 68.682 2.395 c
+68.578 1.484 l
+68.538 1.209 68.523 0.984 68.535 0.808 c
+68.564 0.434 68.729 0.242 69.034 0.235 c
+74.028 -0.838 m
+74.006 -0.721 73.999 -0.581 73.999 -0.412 c
+73.682 -0.765 73.326 -0.941 72.926 -0.941 c
+72.503 -0.941 72.165 -0.79 71.911 -0.485 c
+71.666 -0.184 71.552 0.195 71.573 0.646 c
+71.602 1.234 71.827 1.69 72.25 2.013 c
+72.668 2.344 73.235 2.513 73.94 2.513 c
+74.351 2.513 l
+74.411 2.954 l
+74.425 3.175 l
+74.425 3.469 74.307 3.615 74.072 3.615 c
+73.749 3.623 73.551 3.417 73.484 2.998 c
+72.088 2.983 l
+72.117 3.501 72.331 3.924 72.734 4.247 c
+73.135 4.579 73.624 4.74 74.205 4.733 c
+74.741 4.722 75.153 4.549 75.439 4.218 c
+75.733 3.895 75.855 3.461 75.807 2.925 c
+75.351 0.147 l
+75.336 -0.133 l
+75.325 -0.368 75.351 -0.574 75.41 -0.75 c
+75.396 -0.838 l
+h
+73.322 0.176 m
+73.565 0.165 73.793 0.272 73.999 0.5 c
+74.249 1.646 l
+73.94 1.646 l
+73.675 1.635 73.459 1.547 73.293 1.381 c
+73.124 1.213 73.029 1.003 72.999 0.749 c
+72.999 0.558 l
+72.999 0.448 73.021 0.357 73.073 0.278 c
+73.131 0.209 73.212 0.176 73.322 0.176 c
+78.28 4.629 m
+78.177 4.086 l
+78.567 4.534 78.993 4.751 79.456 4.733 c
+79.838 4.722 80.125 4.575 80.323 4.292 c
+80.529 4.016 80.632 3.619 80.632 3.101 c
+80.603 2.645 l
+80.015 -0.838 l
+78.618 -0.838 l
+79.191 2.645 l
+79.221 2.94 l
+79.238 3.34 79.092 3.542 78.779 3.542 c
+78.633 3.542 78.504 3.501 78.397 3.424 c
+78.298 3.343 78.21 3.252 78.133 3.145 c
+77.428 -0.838 l
+76.031 -0.838 l
+76.986 4.629 l
+h
+85.357 0.235 m
+85.74 0.224 85.979 0.5 86.078 1.058 c
+87.386 1.058 l
+87.327 0.448 87.099 -0.04 86.71 -0.412 c
+86.317 -0.786 85.842 -0.96 85.284 -0.941 c
+84.773 -0.93 84.366 -0.78 84.064 -0.485 c
+83.759 -0.192 83.579 0.213 83.52 0.735 c
+83.469 1.153 83.494 1.664 83.593 2.263 c
+83.689 2.869 83.876 3.373 84.152 3.777 c
+84.593 4.432 85.218 4.751 86.033 4.733 c
+86.581 4.71 87.003 4.512 87.298 4.13 c
+87.591 3.748 87.724 3.233 87.695 2.587 c
+86.372 2.587 l
+86.372 2.896 l
+86.361 3.314 86.199 3.534 85.887 3.557 c
+85.387 3.575 85.093 3.189 85.004 2.395 c
+84.902 1.484 l
+84.861 1.209 84.846 0.984 84.858 0.808 c
+84.887 0.434 85.052 0.242 85.357 0.235 c
+90.627 4.733 m
+91.186 4.71 91.616 4.519 91.921 4.159 c
+92.233 3.806 92.406 3.326 92.435 2.719 c
+92.435 2.366 l
+92.383 1.308 92.13 0.484 91.67 -0.103 c
+91.208 -0.684 90.605 -0.96 89.862 -0.941 c
+89.43 -0.93 89.073 -0.817 88.79 -0.588 c
+88.503 -0.364 88.297 -0.056 88.173 0.338 c
+88.055 0.738 88.018 1.198 88.069 1.72 c
+88.098 1.984 l
+88.194 2.844 88.47 3.52 88.921 4.012 c
+89.37 4.512 89.939 4.751 90.627 4.733 c
+89.451 1.146 m
+89.451 0.558 89.627 0.253 89.98 0.235 c
+90.469 0.205 90.789 0.577 90.936 1.352 c
+90.98 1.72 l
+91.028 2.198 91.053 2.506 91.053 2.645 c
+91.053 3.222 90.87 3.528 90.509 3.557 c
+90.234 3.564 90.01 3.439 89.833 3.175 c
+89.665 2.917 89.557 2.547 89.509 2.057 c
+89.469 1.565 89.451 1.263 89.451 1.146 c
+94.878 4.629 m
+94.776 4.086 l
+95.165 4.534 95.591 4.751 96.054 4.733 c
+96.437 4.722 96.723 4.575 96.922 4.292 c
+97.128 4.016 97.23 3.619 97.23 3.101 c
+97.201 2.645 l
+96.613 -0.838 l
+95.217 -0.838 l
+95.79 2.645 l
+95.819 2.94 l
+95.838 3.34 95.691 3.542 95.379 3.542 c
+95.231 3.542 95.103 3.501 94.996 3.424 c
+94.897 3.343 94.809 3.252 94.732 3.145 c
+94.026 -0.838 l
+92.63 -0.838 l
+93.585 4.629 l
+h
+100.318 5.967 m
+100.082 4.629 l
+100.788 4.629 l
+100.611 3.557 l
+99.906 3.557 l
+99.435 0.793 l
+99.421 0.631 l
+99.41 0.404 99.502 0.294 99.7 0.294 c
+99.759 0.282 99.876 0.286 100.052 0.309 c
+99.921 -0.809 l
+99.715 -0.897 99.468 -0.941 99.186 -0.941 c
+98.781 -0.93 98.48 -0.786 98.274 -0.5 c
+98.068 -0.206 97.987 0.183 98.039 0.675 c
+98.51 3.557 l
+97.892 3.557 l
+98.068 4.629 l
+98.685 4.629 l
+98.921 5.967 l
+h
+103.933 3.248 m
+103.493 3.307 l
+103.117 3.314 102.816 3.138 102.581 2.778 c
+101.949 -0.838 l
+100.553 -0.838 l
+101.508 4.629 l
+102.816 4.629 l
+102.699 4.027 l
+102.864 4.292 103.026 4.475 103.184 4.586 c
+103.338 4.692 103.51 4.747 103.698 4.747 c
+103.805 4.747 103.948 4.722 104.125 4.674 c
+h
+105.304 -0.838 m
+103.907 -0.838 l
+104.848 4.629 l
+106.259 4.629 l
+h
+105.039 6.011 m
+105.039 6.247 105.113 6.437 105.26 6.585 c
+105.407 6.732 105.583 6.805 105.789 6.805 c
+106.003 6.813 106.186 6.746 106.333 6.599 c
+106.479 6.46 106.554 6.283 106.554 6.071 c
+106.554 5.835 106.479 5.644 106.333 5.497 c
+106.186 5.35 106.003 5.277 105.789 5.277 c
+105.573 5.265 105.392 5.328 105.245 5.468 c
+105.106 5.614 105.039 5.795 105.039 6.011 c
+108.876 -0.941 m
+108.413 -0.919 108.067 -0.706 107.832 -0.294 c
+107.655 -0.838 l
+106.348 -0.838 l
+107.7 6.923 l
+109.097 6.923 l
+108.567 4.174 l
+108.879 4.556 109.236 4.74 109.64 4.733 c
+110.118 4.722 110.478 4.542 110.713 4.189 c
+110.948 3.844 111.051 3.34 111.022 2.675 c
+111 1.899 110.905 1.227 110.728 0.661 c
+110.559 0.091 110.32 -0.324 110.007 -0.588 c
+109.692 -0.842 109.317 -0.96 108.876 -0.941 c
+109.655 2.66 m
+109.662 2.973 109.625 3.193 109.537 3.322 c
+109.457 3.457 109.324 3.528 109.141 3.528 c
+108.883 3.534 108.648 3.403 108.435 3.131 c
+108.009 0.617 l
+108.104 0.382 108.295 0.253 108.582 0.235 c
+109.1 0.205 109.409 0.577 109.508 1.352 c
+109.552 1.72 l
+h
+114.003 -0.339 m
+113.656 -0.75 113.257 -0.948 112.797 -0.941 c
+112.433 -0.941 112.143 -0.823 111.929 -0.588 c
+111.713 -0.346 111.591 -0.015 111.562 0.396 c
+111.54 0.631 111.54 0.86 111.562 1.087 c
+112.164 4.629 l
+113.546 4.629 l
+112.958 1.072 l
+112.944 0.823 l
+112.933 0.654 112.958 0.517 113.018 0.411 c
+113.076 0.312 113.168 0.257 113.297 0.249 c
+113.569 0.239 113.826 0.382 114.061 0.675 c
+114.751 4.629 l
+116.148 4.629 l
+115.208 -0.838 l
+113.899 -0.838 l
+h
+118.897 5.967 m
+118.662 4.629 l
+119.368 4.629 l
+119.191 3.557 l
+118.485 3.557 l
+118.015 0.793 l
+118.001 0.631 l
+117.989 0.404 118.082 0.294 118.279 0.294 c
+118.338 0.282 118.456 0.286 118.632 0.309 c
+118.5 -0.809 l
+118.294 -0.897 118.048 -0.941 117.766 -0.941 c
+117.361 -0.93 117.06 -0.786 116.854 -0.5 c
+116.648 -0.206 116.567 0.183 116.619 0.675 c
+117.089 3.557 l
+116.472 3.557 l
+116.648 4.629 l
+117.265 4.629 l
+117.5 5.967 l
+h
+121.396 -0.941 m
+120.955 -0.941 120.576 -0.834 120.264 -0.618 c
+119.959 -0.405 119.738 -0.103 119.603 0.278 c
+119.463 0.661 119.418 1.095 119.47 1.587 c
+119.514 1.955 l
+119.632 2.865 119.904 3.561 120.337 4.041 c
+120.779 4.519 121.34 4.751 122.028 4.733 c
+122.528 4.71 122.917 4.556 123.204 4.262 c
+123.487 3.968 123.652 3.549 123.703 3.013 c
+123.722 2.69 123.711 2.373 123.674 2.072 c
+123.586 1.411 l
+120.852 1.411 l
+120.829 1.271 120.826 1.135 120.837 0.999 c
+120.866 0.507 121.105 0.257 121.558 0.249 c
+121.976 0.239 122.385 0.4 122.778 0.735 c
+123.248 -0.133 l
+123.061 -0.389 122.799 -0.588 122.469 -0.736 c
+122.134 -0.882 121.778 -0.948 121.396 -0.941 c
+121.895 3.557 m
+121.492 3.564 121.212 3.307 121.058 2.778 c
+120.955 2.41 l
+122.337 2.41 l
+122.373 2.605 122.395 2.763 122.395 2.881 c
+122.402 3.31 122.237 3.534 121.895 3.557 c
+135.212 4.145 m
+135.565 4.546 135.948 4.74 136.359 4.733 c
+136.76 4.722 137.065 4.571 137.271 4.277 c
+137.484 3.991 137.594 3.594 137.594 3.087 c
+137.579 2.601 l
+136.991 -0.838 l
+135.595 -0.838 l
+136.168 2.616 l
+136.197 2.91 l
+136.205 3.322 136.058 3.528 135.757 3.528 c
+135.529 3.534 135.316 3.417 135.11 3.175 c
+134.404 -0.838 l
+133.008 -0.838 l
+134.36 6.923 l
+135.757 6.923 l
+h
+140.696 5.967 m
+140.461 4.629 l
+141.166 4.629 l
+140.99 3.557 l
+140.284 3.557 l
+139.814 0.793 l
+139.799 0.631 l
+139.788 0.404 139.879 0.294 140.078 0.294 c
+140.137 0.282 140.255 0.286 140.431 0.309 c
+140.299 -0.809 l
+140.093 -0.897 139.847 -0.941 139.563 -0.941 c
+139.16 -0.93 138.858 -0.786 138.653 -0.5 c
+138.447 -0.206 138.366 0.183 138.418 0.675 c
+138.888 3.557 l
+138.27 3.557 l
+138.447 4.629 l
+139.064 4.629 l
+139.299 5.967 l
+h
+143.742 5.967 m
+143.507 4.629 l
+144.213 4.629 l
+144.036 3.557 l
+143.33 3.557 l
+142.86 0.793 l
+142.846 0.631 l
+142.834 0.404 142.927 0.294 143.125 0.294 c
+143.183 0.282 143.301 0.286 143.478 0.309 c
+143.345 -0.809 l
+143.139 -0.897 142.894 -0.941 142.61 -0.941 c
+142.206 -0.93 141.905 -0.786 141.699 -0.5 c
+141.493 -0.206 141.412 0.183 141.464 0.675 c
+141.934 3.557 l
+141.317 3.557 l
+141.493 4.629 l
+142.111 4.629 l
+142.346 5.967 l
+h
+146.491 -0.941 m
+146.069 -0.93 145.734 -0.746 145.491 -0.383 c
+145.007 -2.94 l
+143.625 -2.94 l
+144.933 4.629 l
+146.212 4.629 l
+146.123 4.13 l
+146.454 4.542 146.836 4.74 147.27 4.733 c
+147.748 4.722 148.107 4.542 148.342 4.189 c
+148.578 3.836 148.681 3.326 148.652 2.66 c
+148.629 1.866 148.534 1.194 148.357 0.646 c
+148.182 0.106 147.931 -0.302 147.608 -0.574 c
+147.292 -0.838 146.921 -0.96 146.491 -0.941 c
+147.27 2.675 m
+147.27 2.987 147.226 3.208 147.137 3.336 c
+147.056 3.461 146.931 3.532 146.755 3.542 c
+146.509 3.542 146.285 3.417 146.079 3.175 c
+145.624 0.588 l
+145.73 0.371 145.921 0.257 146.197 0.249 c
+146.704 0.22 147.023 0.621 147.152 1.454 c
+147.255 2.484 l
+h
+151.499 0.661 m
+151.536 0.897 151.356 1.105 150.956 1.294 c
+150.551 1.477 150.25 1.65 150.044 1.807 c
+149.846 1.973 149.699 2.153 149.603 2.352 c
+149.515 2.557 149.475 2.786 149.485 3.042 c
+149.515 3.532 149.721 3.939 150.103 4.262 c
+150.485 4.586 150.948 4.74 151.499 4.733 c
+152.047 4.722 152.477 4.56 152.793 4.247 c
+153.105 3.931 153.256 3.52 153.248 3.013 c
+151.852 3.013 l
+151.86 3.248 151.831 3.414 151.764 3.513 c
+151.694 3.619 151.58 3.675 151.426 3.675 c
+151.257 3.675 151.118 3.615 151 3.498 c
+150.89 3.388 150.827 3.256 150.809 3.101 c
+150.757 2.884 150.927 2.69 151.309 2.513 c
+151.698 2.344 151.977 2.204 152.146 2.087 c
+152.646 1.753 152.874 1.297 152.837 0.72 c
+152.815 0.386 152.712 0.091 152.529 -0.162 c
+152.34 -0.42 152.087 -0.614 151.764 -0.75 c
+151.448 -0.886 151.106 -0.948 150.735 -0.941 c
+150.195 -0.93 149.757 -0.761 149.427 -0.427 c
+149.092 -0.085 148.928 0.345 148.928 0.866 c
+150.264 0.852 l
+150.254 0.588 150.294 0.396 150.382 0.278 c
+150.478 0.168 150.625 0.118 150.823 0.118 c
+151 0.118 151.147 0.161 151.264 0.249 c
+151.389 0.345 151.47 0.484 151.499 0.661 c
+153.595 -0.148 m
+153.595 0.095 153.668 0.294 153.815 0.44 c
+153.969 0.595 154.167 0.675 154.403 0.675 c
+154.638 0.675 154.829 0.602 154.976 0.455 c
+155.13 0.316 155.211 0.139 155.211 -0.074 c
+155.211 -0.32 155.126 -0.522 154.961 -0.676 c
+154.803 -0.823 154.612 -0.897 154.388 -0.897 c
+154.152 -0.897 153.961 -0.831 153.815 -0.691 c
+153.668 -0.545 153.595 -0.364 153.595 -0.148 c
+154.535 3.615 m
+154.535 3.858 154.609 4.056 154.755 4.203 c
+154.91 4.357 155.108 4.438 155.343 4.438 c
+155.579 4.438 155.77 4.365 155.916 4.218 c
+156.071 4.079 156.151 3.902 156.151 3.689 c
+156.151 3.443 156.067 3.241 155.902 3.087 c
+155.744 2.94 155.553 2.865 155.328 2.865 c
+155.093 2.865 154.902 2.932 154.755 3.072 c
+154.609 3.218 154.535 3.399 154.535 3.615 c
+156.5 -1.47 m
+155.442 -1.47 l
+158.97 6.526 l
+160.028 6.526 l
+h
+158.566 -1.47 m
+157.508 -1.47 l
+161.036 6.526 l
+162.094 6.526 l
+h
+164.02 -0.838 m
+163.997 -0.721 163.99 -0.581 163.99 -0.412 c
+163.674 -0.765 163.317 -0.941 162.917 -0.941 c
+162.494 -0.941 162.156 -0.79 161.903 -0.485 c
+161.657 -0.184 161.543 0.195 161.564 0.646 c
+161.594 1.234 161.818 1.69 162.241 2.013 c
+162.659 2.344 163.226 2.513 163.931 2.513 c
+164.342 2.513 l
+164.402 2.954 l
+164.416 3.175 l
+164.416 3.469 164.298 3.615 164.063 3.615 c
+163.74 3.623 163.542 3.417 163.475 2.998 c
+162.079 2.983 l
+162.108 3.501 162.322 3.924 162.726 4.247 c
+163.126 4.579 163.615 4.74 164.196 4.733 c
+164.732 4.722 165.144 4.549 165.431 4.218 c
+165.724 3.895 165.846 3.461 165.798 2.925 c
+165.342 0.147 l
+165.327 -0.133 l
+165.316 -0.368 165.342 -0.574 165.401 -0.75 c
+165.387 -0.838 l
+h
+163.314 0.176 m
+163.556 0.165 163.785 0.272 163.99 0.5 c
+164.24 1.646 l
+163.931 1.646 l
+163.667 1.635 163.45 1.547 163.284 1.381 c
+163.116 1.213 163.02 1.003 162.991 0.749 c
+162.991 0.558 l
+162.991 0.448 163.012 0.357 163.064 0.278 c
+163.122 0.209 163.203 0.176 163.314 0.176 c
+168.58 -0.941 m
+168.117 -0.919 167.771 -0.706 167.536 -0.294 c
+167.359 -0.838 l
+166.052 -0.838 l
+167.404 6.923 l
+168.801 6.923 l
+168.271 4.174 l
+168.583 4.556 168.94 4.74 169.344 4.733 c
+169.822 4.722 170.182 4.542 170.417 4.189 c
+170.652 3.844 170.755 3.34 170.725 2.675 c
+170.704 1.899 170.608 1.227 170.432 0.661 c
+170.263 0.091 170.024 -0.324 169.711 -0.588 c
+169.395 -0.842 169.021 -0.96 168.58 -0.941 c
+169.358 2.66 m
+169.366 2.973 169.329 3.193 169.241 3.322 c
+169.16 3.457 169.028 3.528 168.844 3.528 c
+168.587 3.534 168.352 3.403 168.138 3.131 c
+167.712 0.617 l
+167.808 0.382 167.999 0.253 168.286 0.235 c
+168.803 0.205 169.113 0.577 169.212 1.352 c
+169.256 1.72 l
+h
+173.823 4.733 m
+174.382 4.71 174.812 4.519 175.117 4.159 c
+175.429 3.806 175.602 3.326 175.631 2.719 c
+175.631 2.366 l
+175.581 1.308 175.327 0.484 174.867 -0.103 c
+174.405 -0.684 173.802 -0.96 173.059 -0.941 c
+172.626 -0.93 172.269 -0.817 171.986 -0.588 c
+171.7 -0.364 171.494 -0.056 171.369 0.338 c
+171.251 0.738 171.215 1.198 171.266 1.72 c
+171.295 1.984 l
+171.39 2.844 171.666 3.52 172.119 4.012 c
+172.566 4.512 173.136 4.751 173.823 4.733 c
+172.647 1.146 m
+172.647 0.558 172.824 0.253 173.177 0.235 c
+173.665 0.205 173.985 0.577 174.133 1.352 c
+174.176 1.72 l
+174.224 2.198 174.25 2.506 174.25 2.645 c
+174.25 3.222 174.066 3.528 173.706 3.557 c
+173.43 3.564 173.206 3.439 173.03 3.175 c
+172.861 2.917 172.755 2.547 172.707 2.057 c
+172.666 1.565 172.647 1.263 172.647 1.146 c
+178.615 -0.339 m
+178.27 -0.75 177.869 -0.948 177.41 -0.941 c
+177.046 -0.941 176.756 -0.823 176.543 -0.588 c
+176.327 -0.346 176.205 -0.015 176.175 0.396 c
+176.153 0.631 176.153 0.86 176.175 1.087 c
+176.778 4.629 l
+178.16 4.629 l
+177.572 1.072 l
+177.557 0.823 l
+177.546 0.654 177.572 0.517 177.63 0.411 c
+177.69 0.312 177.781 0.257 177.91 0.249 c
+178.182 0.239 178.439 0.382 178.675 0.675 c
+179.365 4.629 l
+180.761 4.629 l
+179.82 -0.838 l
+178.513 -0.838 l
+h
+183.514 5.967 m
+183.279 4.629 l
+183.984 4.629 l
+183.808 3.557 l
+183.103 3.557 l
+182.632 0.793 l
+182.617 0.631 l
+182.606 0.404 182.698 0.294 182.897 0.294 c
+182.955 0.282 183.073 0.286 183.249 0.309 c
+183.117 -0.809 l
+182.912 -0.897 182.665 -0.941 182.382 -0.941 c
+181.978 -0.93 181.677 -0.786 181.47 -0.5 c
+181.265 -0.206 181.185 0.183 181.235 0.675 c
+181.706 3.557 l
+181.089 3.557 l
+181.265 4.629 l
+181.883 4.629 l
+182.118 5.967 l
+h
+183.999 -0.148 m
+183.999 0.095 184.073 0.294 184.219 0.44 c
+184.374 0.595 184.572 0.675 184.807 0.675 c
+185.042 0.675 185.233 0.602 185.381 0.455 c
+185.535 0.316 185.616 0.139 185.616 -0.074 c
+185.616 -0.32 185.532 -0.522 185.366 -0.676 c
+185.208 -0.823 185.017 -0.897 184.793 -0.897 c
+184.558 -0.897 184.366 -0.831 184.219 -0.691 c
+184.073 -0.545 183.999 -0.364 183.999 -0.148 c
+189.137 4.733 m
+189.614 4.71 189.967 4.512 190.195 4.13 c
+190.371 4.629 l
+191.635 4.629 l
+190.71 -0.838 l
+190.61 -1.551 190.334 -2.095 189.886 -2.469 c
+189.445 -2.841 188.886 -3.017 188.21 -2.999 c
+187.916 -2.988 187.622 -2.926 187.328 -2.808 c
+187.034 -2.698 186.792 -2.544 186.608 -2.338 c
+187.167 -1.353 l
+187.45 -1.676 187.803 -1.841 188.225 -1.852 c
+188.82 -1.881 189.187 -1.548 189.328 -0.853 c
+189.43 -0.397 l
+189.107 -0.761 188.743 -0.941 188.343 -0.941 c
+187.872 -0.941 187.512 -0.761 187.269 -0.397 c
+187.024 -0.037 186.906 0.47 186.916 1.117 c
+186.916 1.506 186.953 1.929 187.034 2.381 c
+187.111 2.84 187.226 3.226 187.373 3.542 c
+187.755 4.355 188.343 4.751 189.137 4.733 c
+188.284 1.132 m
+188.284 0.551 188.468 0.257 188.842 0.249 c
+189.085 0.249 189.316 0.357 189.534 0.573 c
+190.004 3.189 l
+189.875 3.414 189.688 3.532 189.445 3.542 c
+188.857 3.571 188.497 3.09 188.372 2.102 c
+188.313 1.631 188.284 1.308 188.284 1.132 c
+193.054 -0.838 m
+191.657 -0.838 l
+192.598 4.629 l
+194.009 4.629 l
+h
+192.789 6.011 m
+192.789 6.247 192.863 6.437 193.01 6.585 c
+193.156 6.732 193.333 6.805 193.538 6.805 c
+193.752 6.813 193.935 6.746 194.083 6.599 c
+194.23 6.46 194.303 6.283 194.303 6.071 c
+194.303 5.835 194.23 5.644 194.083 5.497 c
+193.935 5.35 193.752 5.277 193.538 5.277 c
+193.322 5.265 193.142 5.328 192.995 5.468 c
+192.855 5.614 192.789 5.795 192.789 6.011 c
+196.909 5.967 m
+196.674 4.629 l
+197.379 4.629 l
+197.202 3.557 l
+196.497 3.557 l
+196.027 0.793 l
+196.012 0.631 l
+196.001 0.404 196.092 0.294 196.291 0.294 c
+196.35 0.282 196.468 0.286 196.644 0.309 c
+196.512 -0.809 l
+196.306 -0.897 196.059 -0.941 195.776 -0.941 c
+195.373 -0.93 195.071 -0.786 194.866 -0.5 c
+194.66 -0.206 194.579 0.183 194.631 0.675 c
+195.101 3.557 l
+194.483 3.557 l
+194.66 4.629 l
+195.277 4.629 l
+195.512 5.967 l
+h
+198.614 -0.838 m
+197.218 -0.838 l
+198.555 6.923 l
+199.966 6.923 l
+h
+202.259 -0.838 m
+202.237 -0.721 202.23 -0.581 202.23 -0.412 c
+201.914 -0.765 201.557 -0.941 201.156 -0.941 c
+200.734 -0.941 200.396 -0.79 200.142 -0.485 c
+199.896 -0.184 199.782 0.195 199.805 0.646 c
+199.834 1.234 200.058 1.69 200.48 2.013 c
+200.9 2.344 201.465 2.513 202.171 2.513 c
+202.583 2.513 l
+202.641 2.954 l
+202.656 3.175 l
+202.656 3.469 202.538 3.615 202.303 3.615 c
+201.98 3.623 201.781 3.417 201.715 2.998 c
+200.318 2.983 l
+200.348 3.501 200.561 3.924 200.965 4.247 c
+201.366 4.579 201.854 4.74 202.435 4.733 c
+202.972 4.722 203.383 4.549 203.67 4.218 c
+203.965 3.895 204.085 3.461 204.038 2.925 c
+203.582 0.147 l
+203.568 -0.133 l
+203.556 -0.368 203.582 -0.574 203.641 -0.75 c
+203.626 -0.838 l
+h
+201.553 0.176 m
+201.796 0.165 202.024 0.272 202.23 0.5 c
+202.479 1.646 l
+202.171 1.646 l
+201.906 1.635 201.69 1.547 201.524 1.381 c
+201.355 1.213 201.259 1.003 201.23 0.749 c
+201.23 0.558 l
+201.23 0.448 201.252 0.357 201.303 0.278 c
+201.362 0.209 201.443 0.176 201.553 0.176 c
+206.82 -0.941 m
+206.356 -0.919 206.011 -0.706 205.775 -0.294 c
+205.6 -0.838 l
+204.291 -0.838 l
+205.644 6.923 l
+207.04 6.923 l
+206.511 4.174 l
+206.823 4.556 207.179 4.74 207.584 4.733 c
+208.061 4.722 208.422 4.542 208.657 4.189 c
+208.892 3.844 208.995 3.34 208.965 2.675 c
+208.943 1.899 208.848 1.227 208.671 0.661 c
+208.503 0.091 208.264 -0.324 207.951 -0.588 c
+207.635 -0.842 207.26 -0.96 206.82 -0.941 c
+207.599 2.66 m
+207.606 2.973 207.569 3.193 207.481 3.322 c
+207.4 3.457 207.267 3.528 207.084 3.528 c
+206.826 3.534 206.591 3.403 206.378 3.131 c
+205.952 0.617 l
+206.047 0.382 206.238 0.253 206.525 0.235 c
+207.044 0.205 207.352 0.577 207.452 1.352 c
+207.495 1.72 l
+h
+209.432 -0.148 m
+209.432 0.095 209.505 0.294 209.652 0.44 c
+209.807 0.595 210.005 0.675 210.24 0.675 c
+210.475 0.675 210.666 0.602 210.814 0.455 c
+210.968 0.316 211.049 0.139 211.049 -0.074 c
+211.049 -0.32 210.965 -0.522 210.799 -0.676 c
+210.641 -0.823 210.45 -0.897 210.226 -0.897 c
+209.991 -0.897 209.8 -0.831 209.652 -0.691 c
+209.505 -0.545 209.432 -0.364 209.432 -0.148 c
+214.217 0.235 m
+214.599 0.224 214.838 0.5 214.937 1.058 c
+216.245 1.058 l
+216.187 0.448 215.959 -0.04 215.569 -0.412 c
+215.175 -0.786 214.702 -0.96 214.143 -0.941 c
+213.632 -0.93 213.224 -0.78 212.923 -0.485 c
+212.618 -0.192 212.438 0.213 212.379 0.735 c
+212.328 1.153 212.353 1.664 212.453 2.263 c
+212.548 2.869 212.736 3.373 213.012 3.777 c
+213.452 4.432 214.077 4.751 214.893 4.733 c
+215.441 4.71 215.863 4.512 216.157 4.13 c
+216.451 3.748 216.584 3.233 216.553 2.587 c
+215.231 2.587 l
+215.231 2.896 l
+215.22 3.314 215.058 3.534 214.745 3.557 c
+214.246 3.575 213.952 3.189 213.864 2.395 c
+213.761 1.484 l
+213.721 1.209 213.706 0.984 213.717 0.808 c
+213.746 0.434 213.912 0.242 214.217 0.235 c
+219.49 4.733 m
+220.048 4.71 220.478 4.519 220.783 4.159 c
+221.095 3.806 221.268 3.326 221.298 2.719 c
+221.298 2.366 l
+221.247 1.308 220.993 0.484 220.534 -0.103 c
+220.071 -0.684 219.468 -0.96 218.726 -0.941 c
+218.292 -0.93 217.935 -0.817 217.652 -0.588 c
+217.366 -0.364 217.16 -0.056 217.035 0.338 c
+216.918 0.738 216.881 1.198 216.933 1.72 c
+216.962 1.984 l
+217.057 2.844 217.332 3.52 217.785 4.012 c
+218.233 4.512 218.803 4.751 219.49 4.733 c
+218.314 1.146 m
+218.314 0.558 218.49 0.253 218.843 0.235 c
+219.331 0.205 219.651 0.577 219.799 1.352 c
+219.842 1.72 l
+219.89 2.198 219.917 2.506 219.917 2.645 c
+219.917 3.222 219.732 3.528 219.372 3.557 c
+219.096 3.564 218.872 3.439 218.696 3.175 c
+218.527 2.917 218.421 2.547 218.373 2.057 c
+218.332 1.565 218.314 1.263 218.314 1.146 c
+223.767 4.629 m
+223.68 4.116 l
+224.062 4.534 224.491 4.74 224.973 4.733 c
+225.491 4.71 225.829 4.469 225.987 3.998 c
+226.398 4.498 226.857 4.74 227.368 4.733 c
+227.758 4.722 228.052 4.575 228.251 4.292 c
+228.457 4.016 228.559 3.619 228.559 3.101 c
+228.53 2.645 l
+227.956 -0.838 l
+226.56 -0.838 l
+227.133 2.645 l
+227.163 2.925 l
+227.192 3.336 227.052 3.542 226.751 3.542 c
+226.516 3.542 226.3 3.373 226.105 3.042 c
+226.075 2.807 l
+225.443 -0.838 l
+224.046 -0.838 l
+224.62 2.645 l
+224.649 2.925 l
+224.679 3.336 224.546 3.542 224.252 3.542 c
+224.106 3.542 223.981 3.501 223.885 3.424 c
+223.786 3.343 223.697 3.252 223.62 3.145 c
+222.93 -0.838 l
+221.533 -0.838 l
+222.474 4.629 l
+h
+229.232 -1.47 m
+228.174 -1.47 l
+231.701 6.526 l
+232.76 6.526 l
+h
+f
+Q
+q 1 0 0 1 127.5482 553.4567 cm
+0 0 m
+-2.23 0 l
+-2.224 -16.602 l
+6.802 -16.602 l
+6.802 -14.548 l
+0.007 -14.548 l
+h
+f
+Q
+q 1 0 0 1 142.9453 539.769 cm
+0 0 m
+-0.559 -0.584 -1.496 -1.166 -2.764 -1.166 c
+-4.461 -1.166 -5.145 -0.331 -5.145 0.76 c
+-5.145 2.406 -4.006 3.193 -1.573 3.193 c
+-1.114 3.193 -0.379 3.141 0 3.068 c
+h
+-2.308 10.065 m
+-4.108 10.065 -5.762 9.425 -7.052 8.363 c
+-6.262 6.996 l
+-5.351 7.53 -4.233 8.062 -2.635 8.062 c
+-0.812 8.062 0 7.121 0 5.552 c
+0 4.74 l
+-0.357 4.818 -1.091 4.868 -1.548 4.868 c
+-5.45 4.868 -7.427 3.498 -7.427 0.635 c
+-7.427 -1.926 -5.858 -3.219 -3.473 -3.219 c
+-1.867 -3.219 -0.331 -2.484 0.202 -1.294 c
+0.61 -2.914 l
+2.179 -2.914 l
+2.179 5.578 l
+2.179 8.264 1.014 10.065 -2.308 10.065 c
+f
+Q
+q 1 0 0 1 152.3235 538.5263 cm
+0 0 m
+-0.834 0 -1.569 0.103 -2.128 0.357 c
+-2.128 8.037 l
+-1.368 8.669 -0.43 9.125 0.76 9.125 c
+2.917 9.125 3.752 7.603 3.752 5.145 c
+3.752 1.646 2.41 0 0 0 c
+0.937 11.308 m
+-1.056 11.308 -2.128 9.948 y
+-2.128 12.09 l
+-2.135 14.93 l
+-4.314 14.93 l
+-4.31 -1.267 l
+-3.219 -1.724 -1.723 -1.977 -0.1 -1.977 c
+4.056 -1.977 6.059 0.684 6.059 5.274 c
+6.059 8.896 4.207 11.308 0.937 11.308 c
+f
+Q
+q 1 0 0 1 103.2978 551.6561 cm
+0 0 m
+1.977 0 3.246 -0.658 4.083 -1.319 c
+5.042 0.342 l
+3.734 1.488 1.977 2.106 0.1 2.106 c
+-4.641 2.106 -7.96 -0.786 -7.96 -6.614 c
+-7.96 -12.725 -4.376 -15.106 -0.279 -15.106 c
+1.775 -15.106 3.524 -14.626 4.663 -14.144 c
+4.619 -7.617 l
+4.619 -5.564 l
+-1.466 -5.564 l
+-1.466 -7.617 l
+2.411 -7.617 l
+2.459 -12.571 l
+1.951 -12.824 1.066 -13.026 -0.128 -13.026 c
+-3.424 -13.026 -5.629 -10.954 -5.629 -6.589 c
+-5.629 -2.153 -3.347 0 0 0 c
+f
+Q
+q 1 0 0 1 118.9894 553.4567 cm
+0 0 m
+-2.183 0 l
+-2.176 -2.788 l
+-2.176 -12.421 l
+-2.176 -15.106 -1.01 -16.907 2.311 -16.907 c
+2.77 -16.907 3.219 -16.867 3.657 -16.786 c
+3.657 -14.827 l
+3.341 -14.875 3.002 -14.904 2.643 -14.904 c
+0.816 -14.904 0.004 -13.967 0.004 -12.394 c
+0.004 -5.755 l
+3.657 -5.755 l
+3.657 -3.928 l
+0.004 -3.928 l
+h
+f
+Q
+111.276 549.529 2.179 -12.675 re
+f
+111.276 553.457 2.179 -2.179 re
+f
+0 0.672 0.855 0 k
+q 1 0 0 1 85.9054 541.8301 cm
+0 0 m
+-2.815 8.665 l
+-8.397 25.841 l
+-8.683 26.723 -9.936 26.723 -10.223 25.841 c
+-15.805 8.665 l
+-34.341 8.665 l
+-39.923 25.841 l
+-40.209 26.723 -41.458 26.723 -41.745 25.841 c
+-47.328 8.665 l
+-50.146 0 l
+-50.403 -0.794 -50.12 -1.658 -49.447 -2.146 c
+-25.073 -19.854 l
+-0.698 -2.146 l
+-0.025 -1.658 0.257 -0.794 0 0 c
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 60.8329 521.9758 cm
+0 0 m
+9.267 28.519 l
+-9.268 28.519 l
+h
+f
+Q
+0 0.672 0.855 0 k
+q 1 0 0 1 60.8329 521.9758 cm
+0 0 m
+-9.268 28.519 l
+-22.255 28.519 l
+h
+f
+Q
+0 0.43 0.871 0 k
+q 1 0 0 1 38.5778 550.4952 cm
+0 0 m
+-2.818 -8.665 l
+-3.075 -9.459 -2.792 -10.323 -2.119 -10.811 c
+22.255 -28.517 l
+h
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 38.5778 550.4952 cm
+0 0 m
+12.987 0 l
+7.405 17.176 l
+7.119 18.058 5.869 18.058 5.582 17.176 c
+h
+f
+Q
+0 0.672 0.855 0 k
+q 1 0 0 1 60.8329 521.9758 cm
+0 0 m
+9.267 28.519 l
+22.258 28.519 l
+h
+f
+Q
+0 0.43 0.871 0 k
+q 1 0 0 1 83.0908 550.4952 cm
+0 0 m
+2.815 -8.665 l
+3.072 -9.459 2.789 -10.323 2.117 -10.811 c
+-22.258 -28.517 l
+h
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 83.0908 550.4952 cm
+0 0 m
+-12.991 0 l
+-7.408 17.176 l
+-7.121 18.058 -5.868 18.058 -5.582 17.176 c
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 537.4641 538.8828 cm
+0 0 m
+-0.559 -0.706 l
+-2.168 -2.58 -4.513 -3.513 -7.599 -3.513 c
+-10.356 -3.513 -12.517 -2.601 -14.082 -0.779 c
+-15.64 1.044 -16.441 3.62 -16.478 6.953 c
+-16.478 11.936 l
+-16.478 15.501 -15.769 18.172 -14.346 19.946 c
+-12.917 21.718 -10.782 22.607 -7.938 22.607 c
+-5.519 22.607 -3.628 21.931 -2.263 20.579 c
+-0.893 19.227 -0.14 17.301 0 14.802 c
+-3.19 14.802 l
+-3.318 16.378 -3.759 17.613 -4.513 18.506 c
+-5.259 19.395 -6.394 19.844 -7.923 19.844 c
+-9.745 19.844 -11.083 19.245 -11.936 18.051 c
+-12.788 16.864 -13.23 14.963 -13.259 12.347 c
+-13.259 7.159 l
+-13.259 4.601 -12.773 2.635 -11.803 1.264 c
+-10.826 -0.099 -9.419 -0.779 -7.585 -0.779 c
+-5.872 -0.779 -4.565 -0.363 -3.66 0.47 c
+-3.19 0.912 l
+-3.19 6.776 l
+-7.834 6.776 l
+-7.834 9.496 l
+0 9.496 l
+h
+8.673 -3.16 -3.19 25.414 re
+28.677 19.491 m
+21.99 19.491 l
+21.99 -3.16 l
+18.8 -3.16 l
+18.8 19.491 l
+12.127 19.491 l
+12.127 22.254 l
+28.677 22.254 l
+h
+55.982 4.91 m
+55.834 2.183 55.062 0.096 53.674 -1.352 c
+52.292 -2.793 50.33 -3.513 47.794 -3.513 c
+45.244 -3.513 43.215 -2.543 41.709 -0.602 c
+40.209 1.338 39.459 3.961 39.459 7.277 c
+39.459 11.892 l
+39.459 15.192 40.228 17.804 41.767 19.726 c
+43.314 21.644 45.42 22.607 48.088 22.607 c
+50.536 22.607 52.431 21.865 53.776 20.388 c
+55.128 18.918 55.864 16.816 55.982 14.082 c
+52.747 14.082 l
+52.608 16.158 52.174 17.639 51.44 18.521 c
+50.704 19.403 49.587 19.844 48.088 19.844 c
+46.353 19.844 45.019 19.16 44.09 17.801 c
+43.156 16.449 42.694 14.464 42.694 11.848 c
+42.694 7.188 l
+42.694 4.619 43.123 2.65 43.987 1.279 c
+44.858 -0.095 46.125 -0.779 47.794 -0.779 c
+49.458 -0.779 50.653 -0.367 51.38 0.456 c
+52.115 1.279 52.571 2.764 52.747 4.91 c
+h
+77 -3.16 m
+73.796 -3.16 l
+73.796 8.584 l
+63.566 8.584 l
+63.566 -3.16 l
+60.362 -3.16 l
+60.362 22.254 l
+63.566 22.254 l
+63.566 11.333 l
+73.796 11.333 l
+73.796 22.254 l
+77 22.254 l
+h
+94.838 8.584 m
+85.858 8.584 l
+85.858 -0.426 l
+96.323 -0.426 l
+96.323 -3.16 l
+82.652 -3.16 l
+82.652 22.254 l
+96.146 22.254 l
+96.146 19.491 l
+85.858 19.491 l
+85.858 11.333 l
+94.838 11.333 l
+h
+112.319 3.469 m
+103.734 3.469 l
+101.75 -3.16 l
+98.473 -3.16 l
+106.66 22.254 l
+109.394 22.254 l
+117.61 -3.16 l
+114.318 -3.16 l
+h
+104.573 6.232 m
+111.495 6.232 l
+108.027 17.786 l
+h
+133.754 19.491 m
+127.066 19.491 l
+127.066 -3.16 l
+123.877 -3.16 l
+123.877 19.491 l
+117.203 19.491 l
+117.203 22.254 l
+133.754 22.254 l
+h
+156.221 3.263 m
+156.221 4.528 155.876 5.498 155.193 6.174 c
+154.505 6.849 153.267 7.504 151.474 8.143 c
+149.68 8.79 148.306 9.467 147.358 10.172 c
+146.406 10.878 145.697 11.678 145.227 12.582 c
+144.756 13.483 144.521 14.512 144.521 15.669 c
+144.521 17.687 145.19 19.348 146.535 20.652 c
+147.876 21.953 149.636 22.607 151.812 22.607 c
+153.3 22.607 154.626 22.269 155.795 21.593 c
+156.96 20.924 157.857 19.998 158.485 18.815 c
+159.11 17.628 159.426 16.324 159.426 14.905 c
+156.221 14.905 l
+156.221 16.47 155.839 17.687 155.075 18.55 c
+154.318 19.41 153.23 19.844 151.812 19.844 c
+150.526 19.844 149.526 19.48 148.813 18.756 c
+148.107 18.04 147.754 17.029 147.754 15.728 c
+147.754 14.659 148.137 13.762 148.901 13.039 c
+149.673 12.31 150.86 11.664 152.458 11.098 c
+154.964 10.275 156.754 9.253 157.824 8.04 c
+158.9 6.835 159.44 5.251 159.44 3.293 c
+159.44 1.235 158.768 -0.419 157.427 -1.66 c
+156.093 -2.896 154.274 -3.513 151.974 -3.513 c
+150.493 -3.513 149.125 -3.189 147.872 -2.543 c
+146.626 -1.896 145.645 -0.992 144.932 0.177 c
+144.216 1.353 143.86 2.694 143.86 4.204 c
+147.064 4.204 l
+147.064 2.635 147.505 1.415 148.387 0.544 c
+149.269 -0.33 150.463 -0.764 151.974 -0.764 c
+153.385 -0.764 154.443 -0.407 155.149 0.309 c
+155.862 1.033 156.221 2.018 156.221 3.263 c
+180.325 -3.16 m
+177.12 -3.16 l
+177.12 8.584 l
+166.889 8.584 l
+166.889 -3.16 l
+163.685 -3.16 l
+163.685 22.254 l
+166.889 22.254 l
+166.889 11.333 l
+177.12 11.333 l
+177.12 22.254 l
+180.325 22.254 l
+h
+198.161 8.584 m
+189.181 8.584 l
+189.181 -0.426 l
+199.646 -0.426 l
+199.646 -3.16 l
+185.976 -3.16 l
+185.976 22.254 l
+199.47 22.254 l
+199.47 19.491 l
+189.181 19.491 l
+189.181 11.333 l
+198.161 11.333 l
+h
+215.969 8.584 m
+206.988 8.584 l
+206.988 -0.426 l
+217.454 -0.426 l
+217.454 -3.16 l
+203.784 -3.16 l
+203.784 22.254 l
+217.278 22.254 l
+217.278 19.491 l
+206.988 19.491 l
+206.988 11.333 l
+215.969 11.333 l
+h
+236.798 19.491 m
+230.11 19.491 l
+230.11 -3.16 l
+226.92 -3.16 l
+226.92 19.491 l
+220.247 19.491 l
+220.247 22.254 l
+236.798 22.254 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+35.668 501.669 238.665 -21.46 re
+f
+0 0 0 0 k
+q 1 0 0 1 142.3903 490.78 cm
+0 0 m
+0.47 4.763 l
+4.997 4.763 l
+4.997 3.205 l
+1.955 3.205 l
+1.793 1.206 l
+2.146 1.441 2.506 1.559 2.881 1.559 c
+3.653 1.559 4.248 1.283 4.659 0.736 c
+5.078 0.184 5.292 -0.595 5.292 -1.602 c
+5.292 -2.535 5.041 -3.289 4.542 -3.865 c
+4.042 -4.446 3.381 -4.733 2.558 -4.733 c
+2.057 -4.733 1.595 -4.615 1.176 -4.38 c
+0.754 -4.145 0.419 -3.821 0.176 -3.41 c
+-0.059 -2.991 -0.177 -2.513 -0.177 -1.984 c
+1.617 -1.984 l
+1.646 -2.377 1.738 -2.682 1.897 -2.896 c
+2.061 -3.112 2.278 -3.218 2.543 -3.218 c
+2.837 -3.218 3.065 -3.079 3.233 -2.792 c
+3.399 -2.499 3.484 -2.065 3.484 -1.484 c
+3.484 -0.947 3.385 -0.54 3.19 -0.264 c
+2.992 0.008 2.72 0.148 2.367 0.148 c
+2.021 0.148 1.756 0.03 1.573 -0.205 c
+1.455 -0.367 l
+h
+6.868 -3.674 m
+6.868 -3.38 6.963 -3.141 7.162 -2.954 c
+7.357 -2.77 7.611 -2.675 7.927 -2.675 c
+8.228 -2.675 8.478 -2.77 8.676 -2.954 c
+8.882 -3.141 8.985 -3.38 8.985 -3.674 c
+8.985 -3.979 8.882 -4.226 8.676 -4.409 c
+8.478 -4.586 8.228 -4.674 7.927 -4.674 c
+7.622 -4.674 7.368 -4.582 7.162 -4.394 c
+6.963 -4.211 6.868 -3.968 6.868 -3.674 c
+16.709 -1.176 m
+15.769 -1.176 l
+15.769 -4.6 l
+13.887 -4.6 l
+13.887 4.763 l
+16.9 4.763 l
+17.849 4.763 18.58 4.516 19.09 4.028 c
+19.609 3.535 19.869 2.841 19.869 1.941 c
+19.869 0.695 19.418 -0.176 18.518 -0.675 c
+20.149 -4.512 l
+20.149 -4.6 l
+18.121 -4.6 l
+h
+15.769 0.397 m
+16.841 0.397 l
+17.224 0.397 17.506 0.518 17.694 0.765 c
+17.878 1.018 17.973 1.357 17.973 1.779 c
+17.973 2.72 17.61 3.19 16.885 3.19 c
+15.769 3.19 l
+h
+26.223 -0.544 m
+23.283 -0.544 l
+23.283 -3.027 l
+26.767 -3.027 l
+26.767 -4.6 l
+21.387 -4.6 l
+21.387 4.763 l
+26.752 4.763 l
+26.752 3.19 l
+23.283 3.19 l
+23.283 0.971 l
+26.223 0.971 l
+h
+31.085 -2.028 m
+32.658 4.763 l
+34.759 4.763 l
+32.07 -4.6 l
+30.1 -4.6 l
+27.41 4.763 l
+29.512 4.763 l
+h
+37.846 -4.6 -1.896 9.363 re
+44.373 -0.544 m
+41.433 -0.544 l
+41.433 -3.027 l
+44.917 -3.027 l
+44.917 -4.6 l
+39.536 -4.6 l
+39.536 4.763 l
+44.901 4.763 l
+44.901 3.19 l
+41.433 3.19 l
+41.433 0.971 l
+44.373 0.971 l
+h
+52.267 -1.117 m
+53.148 4.763 l
+55.029 4.763 l
+53.354 -4.6 l
+51.458 -4.6 l
+50.37 0.912 l
+49.297 -4.6 l
+47.386 -4.6 l
+45.711 4.763 l
+47.592 4.763 l
+48.473 -1.117 l
+49.576 4.763 l
+51.164 4.763 l
+h
+62.284 0.559 m
+63.695 4.763 l
+65.753 4.763 l
+63.239 -1.205 l
+63.239 -4.6 l
+61.328 -4.6 l
+61.328 -1.205 l
+58.814 4.763 l
+60.872 4.763 l
+h
+73.231 -0.764 m
+73.231 -2.021 72.929 -2.994 72.334 -3.689 c
+71.735 -4.388 70.912 -4.733 69.865 -4.733 c
+68.813 -4.733 67.986 -4.391 67.38 -3.704 c
+66.781 -3.009 66.476 -2.042 66.469 -0.808 c
+66.469 0.794 l
+66.469 2.076 66.767 3.08 67.365 3.807 c
+67.961 4.532 68.792 4.896 69.85 4.896 c
+70.887 4.896 71.706 4.535 72.304 3.822 c
+72.911 3.117 73.22 2.12 73.231 0.838 c
+h
+71.334 0.809 m
+71.334 1.65 71.209 2.278 70.967 2.691 c
+70.731 3.102 70.357 3.308 69.85 3.308 c
+69.35 3.308 68.975 3.105 68.732 2.705 c
+68.497 2.311 68.373 1.713 68.365 0.912 c
+68.365 -0.764 l
+68.365 -1.579 68.487 -2.182 68.732 -2.572 c
+68.975 -2.965 69.354 -3.16 69.865 -3.16 c
+70.353 -3.16 70.717 -2.969 70.952 -2.587 c
+71.195 -2.204 71.323 -1.616 71.334 -0.823 c
+h
+80.907 4.763 m
+80.907 -1.72 l
+80.896 -2.69 80.628 -3.436 80.099 -3.954 c
+79.57 -4.475 78.809 -4.733 77.821 -4.733 c
+76.821 -4.733 76.057 -4.475 75.527 -3.954 c
+74.999 -3.424 74.733 -2.668 74.733 -1.675 c
+74.733 4.763 l
+76.63 4.763 l
+76.63 -1.675 l
+76.63 -2.215 76.711 -2.597 76.88 -2.822 c
+77.056 -3.05 77.368 -3.16 77.821 -3.16 c
+78.269 -3.16 78.577 -3.05 78.746 -2.822 c
+78.912 -2.597 79 -2.23 79.011 -1.72 c
+79.011 4.763 l
+h
+85.398 -1.176 m
+84.457 -1.176 l
+84.457 -4.6 l
+82.575 -4.6 l
+82.575 4.763 l
+85.588 4.763 l
+86.537 4.763 87.269 4.516 87.779 4.028 c
+88.297 3.535 88.558 2.841 88.558 1.941 c
+88.558 0.695 88.106 -0.176 87.206 -0.675 c
+88.838 -4.512 l
+88.838 -4.6 l
+86.809 -4.6 l
+h
+84.457 0.397 m
+85.53 0.397 l
+85.912 0.397 86.195 0.518 86.382 0.765 c
+86.566 1.018 86.662 1.357 86.662 1.779 c
+86.662 2.72 86.298 3.19 85.574 3.19 c
+84.457 3.19 l
+h
+99.281 -1.117 m
+100.163 4.763 l
+102.045 4.763 l
+100.368 -4.6 l
+98.473 -4.6 l
+97.384 0.912 l
+96.312 -4.6 l
+94.401 -4.6 l
+92.725 4.763 l
+94.606 4.763 l
+95.489 -1.117 l
+96.591 4.763 l
+98.178 4.763 l
+h
+109.956 -0.764 m
+109.956 -2.021 109.654 -2.994 109.06 -3.689 c
+108.461 -4.388 107.638 -4.733 106.59 -4.733 c
+105.539 -4.733 104.713 -4.391 104.106 -3.704 c
+103.507 -3.009 103.202 -2.042 103.194 -0.808 c
+103.194 0.794 l
+103.194 2.076 103.493 3.08 104.091 3.807 c
+104.686 4.532 105.517 4.896 106.575 4.896 c
+107.612 4.896 108.431 4.535 109.03 3.822 c
+109.637 3.117 109.945 2.12 109.956 0.838 c
+h
+108.06 0.809 m
+108.06 1.65 107.935 2.278 107.693 2.691 c
+107.458 3.102 107.082 3.308 106.575 3.308 c
+106.076 3.308 105.701 3.105 105.459 2.705 c
+105.224 2.311 105.098 1.713 105.091 0.912 c
+105.091 -0.764 l
+105.091 -1.579 105.212 -2.182 105.459 -2.572 c
+105.701 -2.965 106.08 -3.16 106.59 -3.16 c
+107.079 -3.16 107.443 -2.969 107.678 -2.587 c
+107.921 -2.204 108.049 -1.616 108.06 -0.823 c
+h
+114.369 -1.176 m
+113.429 -1.176 l
+113.429 -4.6 l
+111.547 -4.6 l
+111.547 4.763 l
+114.56 4.763 l
+115.509 4.763 116.24 4.516 116.75 4.028 c
+117.269 3.535 117.53 2.841 117.53 1.941 c
+117.53 0.695 117.078 -0.176 116.178 -0.675 c
+117.809 -4.512 l
+117.809 -4.6 l
+115.781 -4.6 l
+h
+113.429 0.397 m
+114.502 0.397 l
+114.884 0.397 115.167 0.518 115.354 0.765 c
+115.538 1.018 115.634 1.357 115.634 1.779 c
+115.634 2.72 115.27 3.19 114.546 3.19 c
+113.429 3.19 l
+h
+121.689 -0.984 m
+120.94 -1.925 l
+120.94 -4.6 l
+119.044 -4.6 l
+119.044 4.763 l
+120.94 4.763 l
+120.94 0.676 l
+121.543 1.69 l
+123.277 4.763 l
+125.6 4.763 l
+122.909 0.647 l
+125.644 -4.6 l
+123.395 -4.6 l
+h
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 471.367 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 464.5277 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+23.221 -0.646 m
+24.353 -0.646 l
+24.353 -1.264 l
+21.045 -1.264 l
+21.045 -0.646 l
+22.31 -0.646 l
+22.31 2.896 l
+21.384 2.896 l
+21.384 3.514 l
+23.221 3.514 l
+h
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.738 25.047 0.974 25.106 1.191 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.191 c
+28.355 0.974 28.384 0.738 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.014 c
+27.362 1.162 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.548 27.046 1.588 c
+26.959 1.635 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.243 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.599 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.206 27.385 -0.058 c
+27.414 0.088 27.429 0.268 27.429 0.485 c
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.526 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.596 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.056 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.467 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.36 2.139 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.279 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.232 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+38.115 -2.631 m
+38.115 3.514 l
+40.041 3.514 l
+40.041 2.896 l
+38.967 2.896 l
+38.967 -2.013 l
+40.041 -2.013 l
+40.041 -2.631 l
+h
+42.013 0.838 1.867 -0.794 re
+42.013 0.044 m
+47.677 -1.264 m
+47.677 0.721 l
+47.677 1.022 47.632 1.242 47.544 1.382 c
+47.463 1.529 47.328 1.602 47.133 1.602 c
+47.023 1.602 46.919 1.577 46.824 1.529 c
+46.736 1.477 46.655 1.411 46.589 1.323 c
+46.53 1.235 46.479 1.124 46.441 1 c
+46.412 0.882 46.398 0.75 46.398 0.603 c
+46.398 -1.264 l
+45.487 -1.264 l
+45.487 1.44 l
+45.487 1.661 l
+45.487 1.75 45.479 1.827 45.472 1.897 c
+45.472 2.087 l
+45.472 2.22 l
+46.324 2.22 l
+46.331 2.19 46.339 2.146 46.339 2.087 c
+46.339 1.897 l
+46.346 1.827 46.354 1.756 46.354 1.691 c
+46.362 1.621 46.368 1.565 46.368 1.529 c
+46.383 1.529 l
+46.501 1.793 46.651 1.985 46.838 2.103 c
+47.023 2.22 47.243 2.278 47.5 2.278 c
+47.684 2.278 47.846 2.249 47.985 2.19 c
+48.122 2.132 48.235 2.043 48.323 1.926 c
+48.411 1.808 48.474 1.665 48.515 1.5 c
+48.562 1.341 48.588 1.154 48.588 0.941 c
+48.588 -1.264 l
+h
+55.17 -1.323 m
+54.883 -1.323 54.64 -1.282 54.435 -1.205 c
+54.229 -1.117 54.056 -0.995 53.92 -0.837 c
+53.78 -0.683 53.678 -0.496 53.612 -0.279 c
+53.541 -0.055 53.508 0.191 53.508 0.456 c
+53.508 0.75 53.541 1.007 53.612 1.235 c
+53.689 1.459 53.795 1.646 53.934 1.793 c
+54.082 1.947 54.258 2.065 54.464 2.146 c
+54.67 2.234 54.905 2.278 55.17 2.278 c
+55.394 2.278 55.596 2.249 55.772 2.19 c
+55.949 2.132 56.099 2.047 56.228 1.941 c
+56.353 1.841 56.456 1.72 56.537 1.573 c
+56.614 1.434 56.669 1.282 56.698 1.118 c
+55.787 1.073 l
+55.758 1.249 55.688 1.389 55.581 1.5 c
+55.482 1.606 55.339 1.661 55.155 1.661 c
+54.908 1.661 54.732 1.558 54.626 1.353 c
+54.515 1.154 54.464 0.867 54.464 0.485 c
+54.464 -0.309 54.699 -0.706 55.17 -0.706 c
+55.335 -0.706 55.478 -0.654 55.596 -0.544 c
+55.713 -0.437 55.787 -0.276 55.816 -0.058 c
+56.728 -0.103 l
+56.698 -0.272 56.643 -0.426 56.566 -0.573 c
+56.496 -0.72 56.394 -0.852 56.257 -0.97 c
+56.128 -1.08 55.97 -1.168 55.787 -1.234 c
+55.611 -1.294 55.405 -1.323 55.17 -1.323 c
+60.876 0.485 m
+60.876 0.21 60.839 -0.04 60.774 -0.264 c
+60.704 -0.482 60.601 -0.669 60.465 -0.823 c
+60.325 -0.981 60.149 -1.103 59.935 -1.19 c
+59.719 -1.278 59.465 -1.323 59.172 -1.323 c
+58.896 -1.323 58.649 -1.278 58.436 -1.19 c
+58.231 -1.103 58.058 -0.981 57.922 -0.823 c
+57.782 -0.669 57.68 -0.482 57.613 -0.264 c
+57.543 -0.04 57.51 0.21 57.51 0.485 c
+57.51 0.738 57.539 0.974 57.599 1.191 c
+57.665 1.415 57.768 1.606 57.907 1.764 c
+58.043 1.929 58.22 2.058 58.436 2.146 c
+58.649 2.234 58.906 2.278 59.201 2.278 c
+59.513 2.278 59.774 2.234 59.98 2.146 c
+60.193 2.058 60.365 1.929 60.494 1.764 c
+60.63 1.606 60.729 1.415 60.788 1.191 c
+60.847 0.974 60.876 0.738 60.876 0.485 c
+59.921 0.485 m
+59.921 0.691 59.906 0.867 59.877 1.014 c
+59.855 1.162 59.818 1.282 59.76 1.382 c
+59.7 1.477 59.627 1.548 59.538 1.588 c
+59.451 1.635 59.34 1.661 59.216 1.661 c
+58.95 1.661 58.76 1.562 58.642 1.367 c
+58.524 1.18 58.466 0.886 58.466 0.485 c
+58.466 0.063 58.524 -0.243 58.642 -0.426 c
+58.76 -0.613 58.936 -0.706 59.172 -0.706 c
+59.297 -0.706 59.411 -0.687 59.509 -0.646 c
+59.605 -0.599 59.686 -0.525 59.744 -0.426 c
+59.81 -0.33 59.855 -0.206 59.877 -0.058 c
+59.906 0.088 59.921 0.268 59.921 0.485 c
+62.615 2.22 m
+62.615 0.264 l
+62.615 0.125 62.622 0 62.644 -0.118 c
+62.663 -0.228 62.696 -0.32 62.746 -0.397 c
+62.794 -0.478 62.854 -0.54 62.923 -0.588 c
+62.989 -0.628 63.074 -0.646 63.173 -0.646 c
+63.261 -0.646 63.342 -0.628 63.423 -0.588 c
+63.511 -0.54 63.585 -0.47 63.644 -0.382 c
+63.702 -0.287 63.746 -0.176 63.776 -0.058 c
+63.812 0.066 63.835 0.206 63.835 0.353 c
+63.835 2.22 l
+64.731 2.22 l
+64.731 -0.484 l
+64.731 -0.72 l
+64.739 -0.801 64.746 -0.878 64.746 -0.955 c
+64.746 -1.147 l
+64.753 -1.198 64.76 -1.234 64.76 -1.264 c
+63.908 -1.264 l
+63.897 -1.234 63.886 -1.198 63.879 -1.147 c
+63.879 -0.955 l
+63.879 -0.889 63.872 -0.819 63.864 -0.75 c
+63.864 -0.573 l
+63.849 -0.573 l
+63.731 -0.837 63.577 -1.029 63.394 -1.147 c
+63.217 -1.264 63.015 -1.323 62.791 -1.323 c
+62.586 -1.323 62.412 -1.286 62.276 -1.22 c
+62.137 -1.153 62.027 -1.058 61.938 -0.941 c
+61.857 -0.823 61.799 -0.687 61.762 -0.529 c
+61.732 -0.364 61.718 -0.187 61.718 0 c
+61.718 2.22 l
+h
+67.983 -1.264 m
+67.983 0.721 l
+67.983 1.022 67.939 1.242 67.851 1.382 c
+67.77 1.529 67.634 1.602 67.44 1.602 c
+67.33 1.602 67.226 1.577 67.131 1.529 c
+67.043 1.477 66.962 1.411 66.896 1.323 c
+66.837 1.235 66.785 1.124 66.748 1 c
+66.719 0.882 66.705 0.75 66.705 0.603 c
+66.705 -1.264 l
+65.793 -1.264 l
+65.793 1.44 l
+65.793 1.661 l
+65.793 1.75 65.786 1.827 65.778 1.897 c
+65.778 2.087 l
+65.778 2.22 l
+66.631 2.22 l
+66.638 2.19 66.646 2.146 66.646 2.087 c
+66.646 1.897 l
+66.653 1.827 66.661 1.756 66.661 1.691 c
+66.667 1.621 66.675 1.565 66.675 1.529 c
+66.69 1.529 l
+66.808 1.793 66.958 1.985 67.145 2.103 c
+67.33 2.22 67.55 2.278 67.807 2.278 c
+67.991 2.278 68.153 2.249 68.292 2.19 c
+68.428 2.132 68.542 2.043 68.63 1.926 c
+68.718 1.808 68.781 1.665 68.822 1.5 c
+68.869 1.341 68.895 1.154 68.895 0.941 c
+68.895 -1.264 l
+h
+70.457 1.602 m
+69.913 1.602 l
+69.913 2.22 l
+70.501 2.22 l
+70.78 3.117 l
+71.353 3.117 l
+71.353 2.22 l
+72.587 2.22 l
+72.587 1.602 l
+71.353 1.602 l
+71.353 -0.103 l
+71.353 -0.324 l
+71.361 -0.393 71.382 -0.455 71.412 -0.515 c
+71.448 -0.565 71.504 -0.61 71.573 -0.646 c
+71.65 -0.676 71.764 -0.691 71.912 -0.691 c
+72.047 -0.691 72.184 -0.687 72.323 -0.676 c
+72.46 -0.658 72.591 -0.632 72.72 -0.602 c
+72.72 -1.205 l
+72.639 -1.216 72.562 -1.23 72.485 -1.249 c
+72.404 -1.261 72.327 -1.267 72.25 -1.278 c
+72.169 -1.286 72.08 -1.294 71.985 -1.294 c
+71.897 -1.301 71.798 -1.308 71.691 -1.308 c
+71.504 -1.308 71.342 -1.294 71.206 -1.264 c
+71.078 -1.228 70.964 -1.183 70.868 -1.132 c
+70.78 -1.084 70.706 -1.025 70.648 -0.955 c
+70.588 -0.878 70.545 -0.801 70.515 -0.72 c
+70.486 -0.632 70.464 -0.544 70.457 -0.455 c
+70.445 -0.36 70.442 -0.264 70.442 -0.176 c
+h
+74.285 -2.631 m
+74.285 -2.013 l
+75.359 -2.013 l
+75.359 2.896 l
+74.285 2.896 l
+74.285 3.514 l
+76.211 3.514 l
+76.211 -2.631 l
+h
+f
+Q
+q 1 0 0 1 47.3793 448.9472 cm
+0 0 m
+2.102 0 l
+2.102 -0.574 l
+-0.676 -0.574 l
+-0.676 4.777 l
+0 4.777 l
+h
+3.513 -0.574 -0.646 3.984 re
+3.557 4.453 m
+3.557 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.314 4.072 3.19 4.072 c
+3.072 4.072 2.977 4.104 2.911 4.174 c
+2.851 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.851 4.663 2.911 4.733 c
+2.977 4.81 3.072 4.85 3.19 4.85 c
+3.314 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.557 4.56 3.557 4.453 c
+6.468 0.44 m
+6.468 0.588 6.412 0.709 6.306 0.808 c
+6.196 0.904 5.99 1.022 5.689 1.161 c
+5.343 1.308 5.101 1.429 4.953 1.529 c
+4.806 1.635 4.696 1.753 4.63 1.881 c
+4.561 2.006 4.527 2.164 4.527 2.352 c
+4.527 2.674 4.644 2.944 4.88 3.16 c
+5.115 3.374 5.417 3.484 5.791 3.484 c
+6.173 3.484 6.483 3.37 6.718 3.145 c
+6.953 2.917 7.07 2.631 7.07 2.278 c
+6.423 2.278 l
+6.423 2.454 6.364 2.605 6.247 2.734 c
+6.129 2.859 5.975 2.925 5.791 2.925 c
+5.593 2.925 5.442 2.869 5.336 2.763 c
+5.226 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.238 5.211 2.131 5.292 2.043 c
+5.369 1.962 5.56 1.859 5.865 1.734 c
+6.342 1.547 6.674 1.359 6.85 1.176 c
+7.026 0.999 7.114 0.771 7.114 0.5 c
+7.114 0.147 6.99 -0.133 6.747 -0.339 c
+6.512 -0.544 6.196 -0.647 5.806 -0.647 c
+5.384 -0.647 5.045 -0.53 4.792 -0.294 c
+4.534 -0.052 4.409 0.253 4.409 0.617 c
+5.056 0.617 l
+5.064 0.389 5.134 0.213 5.262 0.087 c
+5.387 -0.03 5.571 -0.088 5.806 -0.088 c
+6.019 -0.088 6.181 -0.04 6.291 0.058 c
+6.408 0.154 6.468 0.282 6.468 0.44 c
+8.804 4.365 m
+8.804 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.804 2.881 l
+8.804 0.411 l
+8.804 0.253 8.827 0.135 8.878 0.058 c
+8.937 -0.023 9.025 -0.059 9.143 -0.059 c
+9.231 -0.059 9.319 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.261 -0.621 9.106 -0.647 8.951 -0.647 c
+8.694 -0.647 8.5 -0.555 8.364 -0.368 c
+8.224 -0.184 8.158 0.077 8.158 0.411 c
+8.158 2.881 l
+7.555 2.881 l
+7.555 3.41 l
+8.158 3.41 l
+8.158 4.365 l
+h
+13.273 -0.088 m
+13.486 -0.088 13.659 -0.026 13.787 0.103 c
+13.924 0.239 13.997 0.43 14.009 0.675 c
+14.626 0.675 l
+14.603 0.294 14.468 -0.026 14.214 -0.279 c
+13.957 -0.526 13.644 -0.647 13.273 -0.647 c
+12.781 -0.647 12.406 -0.497 12.141 -0.191 c
+11.884 0.121 11.759 0.588 11.759 1.205 c
+11.759 1.646 l
+11.759 2.241 11.884 2.697 12.141 3.013 c
+12.406 3.326 12.781 3.484 13.273 3.484 c
+13.674 3.484 13.993 3.351 14.229 3.087 c
+14.471 2.829 14.603 2.484 14.626 2.043 c
+14.009 2.043 l
+13.986 2.337 13.913 2.557 13.787 2.705 c
+13.67 2.851 13.498 2.925 13.273 2.925 c
+12.979 2.925 12.762 2.826 12.627 2.631 c
+12.486 2.443 12.413 2.135 12.406 1.705 c
+12.406 1.19 l
+12.406 0.72 12.472 0.386 12.612 0.191 c
+12.758 0.004 12.979 -0.088 13.273 -0.088 c
+15.243 1.602 m
+15.243 2.179 15.379 2.634 15.655 2.969 c
+15.937 3.31 16.309 3.484 16.771 3.484 c
+17.231 3.484 17.598 3.314 17.874 2.984 c
+18.157 2.66 18.304 2.212 18.315 1.646 c
+18.315 1.22 l
+18.315 0.65 18.171 0.195 17.888 -0.148 c
+17.613 -0.482 17.246 -0.647 16.787 -0.647 c
+16.323 -0.647 15.952 -0.485 15.669 -0.162 c
+15.393 0.168 15.25 0.61 15.243 1.161 c
+h
+15.89 1.22 m
+15.89 0.816 15.967 0.5 16.125 0.264 c
+16.29 0.029 16.511 -0.088 16.787 -0.088 c
+17.352 -0.088 17.646 0.323 17.668 1.146 c
+17.668 1.602 l
+17.668 2.003 17.583 2.322 17.418 2.557 c
+17.261 2.8 17.043 2.925 16.771 2.925 c
+16.507 2.925 16.29 2.8 16.125 2.557 c
+15.967 2.322 15.89 2.003 15.89 1.602 c
+h
+19.77 3.41 m
+19.785 3.042 l
+20.027 3.337 20.347 3.484 20.74 3.484 c
+21.181 3.484 21.49 3.285 21.666 2.896 c
+21.92 3.285 22.269 3.484 22.71 3.484 c
+23.445 3.484 23.82 3.021 23.842 2.102 c
+23.842 -0.574 l
+23.195 -0.574 l
+23.195 2.043 l
+23.195 2.337 23.14 2.55 23.033 2.69 c
+22.934 2.826 22.761 2.896 22.518 2.896 c
+22.32 2.896 22.159 2.815 22.034 2.66 c
+21.916 2.514 21.847 2.322 21.828 2.087 c
+21.828 -0.574 l
+21.167 -0.574 l
+21.167 2.072 l
+21.167 2.62 20.946 2.896 20.505 2.896 c
+20.17 2.896 19.935 2.734 19.8 2.41 c
+19.8 -0.574 l
+19.153 -0.574 l
+19.153 3.41 l
+h
+25.429 3.41 m
+25.444 3.042 l
+25.687 3.337 26.006 3.484 26.399 3.484 c
+26.84 3.484 27.149 3.285 27.326 2.896 c
+27.579 3.285 27.928 3.484 28.369 3.484 c
+29.104 3.484 29.479 3.021 29.501 2.102 c
+29.501 -0.574 l
+28.854 -0.574 l
+28.854 2.043 l
+28.854 2.337 28.799 2.55 28.693 2.69 c
+28.593 2.826 28.421 2.896 28.178 2.896 c
+27.979 2.896 27.818 2.815 27.693 2.66 c
+27.575 2.514 27.505 2.322 27.487 2.087 c
+27.487 -0.574 l
+26.825 -0.574 l
+26.825 2.072 l
+26.825 2.62 26.605 2.896 26.164 2.896 c
+25.83 2.896 25.595 2.734 25.458 2.41 c
+25.458 -0.574 l
+24.812 -0.574 l
+24.812 3.41 l
+h
+31.177 -0.574 -0.647 3.984 re
+31.22 4.453 m
+31.22 4.343 31.191 4.251 31.133 4.174 c
+31.074 4.104 30.979 4.072 30.853 4.072 c
+30.736 4.072 30.64 4.104 30.574 4.174 c
+30.515 4.251 30.486 4.343 30.486 4.453 c
+30.486 4.571 30.515 4.663 30.574 4.733 c
+30.64 4.81 30.736 4.85 30.853 4.85 c
+30.979 4.85 31.074 4.81 31.133 4.733 c
+31.191 4.652 31.22 4.56 31.22 4.453 c
+33.043 4.365 m
+33.043 3.41 l
+33.646 3.41 l
+33.646 2.881 l
+33.043 2.881 l
+33.043 0.411 l
+33.043 0.253 33.065 0.135 33.117 0.058 c
+33.175 -0.023 33.264 -0.059 33.381 -0.059 c
+33.47 -0.059 33.558 -0.044 33.646 -0.015 c
+33.646 -0.574 l
+33.499 -0.621 33.344 -0.647 33.19 -0.647 c
+32.933 -0.647 32.739 -0.555 32.602 -0.368 c
+32.463 -0.184 32.396 0.077 32.396 0.411 c
+32.396 2.881 l
+31.794 2.881 l
+31.794 3.41 l
+32.396 3.41 l
+32.396 4.365 l
+h
+36.777 2.998 m
+37.03 3.322 37.35 3.484 37.732 3.484 c
+38.438 3.484 38.794 3.013 38.805 2.072 c
+38.805 -0.574 l
+38.158 -0.574 l
+38.158 2.043 l
+38.158 2.356 38.104 2.576 37.997 2.705 c
+37.886 2.829 37.732 2.896 37.527 2.896 c
+37.369 2.896 37.221 2.84 37.086 2.734 c
+36.957 2.624 36.854 2.487 36.777 2.322 c
+36.777 -0.574 l
+36.13 -0.574 l
+36.13 5.071 l
+36.777 5.071 l
+h
+40.466 -0.574 -0.646 3.984 re
+40.51 4.453 m
+40.51 4.343 40.481 4.251 40.423 4.174 c
+40.363 4.104 40.268 4.072 40.143 4.072 c
+40.026 4.072 39.93 4.104 39.864 4.174 c
+39.805 4.251 39.775 4.343 39.775 4.453 c
+39.775 4.571 39.805 4.663 39.864 4.733 c
+39.93 4.81 40.026 4.85 40.143 4.85 c
+40.268 4.85 40.363 4.81 40.423 4.733 c
+40.481 4.652 40.51 4.56 40.51 4.453 c
+43.421 0.44 m
+43.421 0.588 43.366 0.709 43.259 0.808 c
+43.149 0.904 42.943 1.022 42.642 1.161 c
+42.297 1.308 42.054 1.429 41.907 1.529 c
+41.76 1.635 41.649 1.753 41.583 1.881 c
+41.514 2.006 41.481 2.164 41.481 2.352 c
+41.481 2.674 41.599 2.944 41.834 3.16 c
+42.069 3.374 42.37 3.484 42.744 3.484 c
+43.127 3.484 43.436 3.37 43.671 3.145 c
+43.906 2.917 44.024 2.631 44.024 2.278 c
+43.377 2.278 l
+43.377 2.454 43.318 2.605 43.201 2.734 c
+43.083 2.859 42.929 2.925 42.744 2.925 c
+42.546 2.925 42.395 2.869 42.289 2.763 c
+42.179 2.664 42.127 2.532 42.127 2.366 c
+42.127 2.238 42.164 2.131 42.245 2.043 c
+42.322 1.962 42.513 1.859 42.818 1.734 c
+43.296 1.547 43.627 1.359 43.803 1.176 c
+43.98 0.999 44.068 0.771 44.068 0.5 c
+44.068 0.147 43.943 -0.133 43.7 -0.339 c
+43.465 -0.544 43.149 -0.647 42.759 -0.647 c
+42.337 -0.647 41.998 -0.53 41.745 -0.294 c
+41.488 -0.052 41.363 0.253 41.363 0.617 c
+42.01 0.617 l
+42.017 0.389 42.087 0.213 42.216 0.087 c
+42.341 -0.03 42.524 -0.088 42.759 -0.088 c
+42.973 -0.088 43.134 -0.04 43.245 0.058 c
+43.362 0.154 43.421 0.282 43.421 0.44 c
+45.758 4.365 m
+45.758 3.41 l
+46.361 3.41 l
+46.361 2.881 l
+45.758 2.881 l
+45.758 0.411 l
+45.758 0.253 45.78 0.135 45.832 0.058 c
+45.89 -0.023 45.979 -0.059 46.096 -0.059 c
+46.185 -0.059 46.272 -0.044 46.361 -0.015 c
+46.361 -0.574 l
+46.214 -0.621 46.06 -0.647 45.905 -0.647 c
+45.647 -0.647 45.453 -0.555 45.317 -0.368 c
+45.177 -0.184 45.111 0.077 45.111 0.411 c
+45.111 2.881 l
+44.508 2.881 l
+44.508 3.41 l
+45.111 3.41 l
+45.111 4.365 l
+h
+46.919 1.602 m
+46.919 2.179 47.055 2.634 47.33 2.969 c
+47.614 3.31 47.985 3.484 48.448 3.484 c
+48.907 3.484 49.275 3.314 49.551 2.984 c
+49.834 2.66 49.981 2.212 49.992 1.646 c
+49.992 1.22 l
+49.992 0.65 49.848 0.195 49.565 -0.148 c
+49.289 -0.482 48.922 -0.647 48.462 -0.647 c
+47.999 -0.647 47.629 -0.485 47.346 -0.162 c
+47.07 0.168 46.927 0.61 46.919 1.161 c
+h
+47.566 1.22 m
+47.566 0.816 47.643 0.5 47.801 0.264 c
+47.966 0.029 48.187 -0.088 48.462 -0.088 c
+49.029 -0.088 49.323 0.323 49.345 1.146 c
+49.345 1.602 l
+49.345 2.003 49.26 2.322 49.094 2.557 c
+48.936 2.8 48.72 2.925 48.448 2.925 c
+48.184 2.925 47.966 2.8 47.801 2.557 c
+47.643 2.322 47.566 2.003 47.566 1.602 c
+h
+52.475 2.792 m
+52.387 2.811 52.288 2.822 52.182 2.822 c
+51.847 2.822 51.612 2.638 51.476 2.278 c
+51.476 -0.574 l
+50.829 -0.574 l
+50.829 3.41 l
+51.461 3.41 l
+51.476 2.998 l
+51.652 3.322 51.895 3.484 52.211 3.484 c
+52.317 3.484 52.406 3.461 52.475 3.424 c
+h
+54.283 0.515 m
+55.004 3.41 l
+55.695 3.41 l
+54.401 -1.132 l
+54.302 -1.474 54.158 -1.735 53.975 -1.912 c
+53.798 -2.087 53.597 -2.176 53.372 -2.176 c
+53.284 -2.176 53.17 -2.153 53.034 -2.117 c
+53.034 -1.573 l
+53.181 -1.588 l
+53.364 -1.588 53.512 -1.544 53.622 -1.455 c
+53.728 -1.367 53.817 -1.209 53.886 -0.985 c
+54.004 -0.544 l
+52.843 3.41 l
+53.549 3.41 l
+h
+57.914 1.602 m
+57.914 2.179 58.05 2.634 58.326 2.969 c
+58.609 3.31 58.98 3.484 59.443 3.484 c
+59.903 3.484 60.269 3.314 60.545 2.984 c
+60.828 2.66 60.975 2.212 60.986 1.646 c
+60.986 1.22 l
+60.986 0.65 60.843 0.195 60.56 -0.148 c
+60.284 -0.482 59.917 -0.647 59.458 -0.647 c
+58.995 -0.647 58.623 -0.485 58.34 -0.162 c
+58.065 0.168 57.921 0.61 57.914 1.161 c
+h
+58.561 1.22 m
+58.561 0.816 58.638 0.5 58.796 0.264 c
+58.962 0.029 59.182 -0.088 59.458 -0.088 c
+60.024 -0.088 60.317 0.323 60.34 1.146 c
+60.34 1.602 l
+60.34 2.003 60.255 2.322 60.09 2.557 c
+59.932 2.8 59.714 2.925 59.443 2.925 c
+59.178 2.925 58.962 2.8 58.796 2.557 c
+58.638 2.322 58.561 2.003 58.561 1.602 c
+h
+62.118 -0.574 m
+62.118 2.881 l
+61.589 2.881 l
+61.589 3.41 l
+62.118 3.41 l
+62.118 3.866 l
+62.118 4.266 62.214 4.579 62.412 4.806 c
+62.617 5.03 62.897 5.144 63.25 5.144 c
+63.386 5.144 63.518 5.122 63.647 5.086 c
+63.617 4.542 l
+63.518 4.56 63.419 4.571 63.323 4.571 c
+62.949 4.571 62.765 4.307 62.765 3.777 c
+62.765 3.41 l
+63.441 3.41 l
+63.441 2.881 l
+62.765 2.881 l
+62.765 -0.574 l
+h
+67.307 -0.088 m
+67.52 -0.088 67.693 -0.026 67.822 0.103 c
+67.957 0.239 68.031 0.43 68.042 0.675 c
+68.659 0.675 l
+68.637 0.294 68.501 -0.026 68.248 -0.279 c
+67.99 -0.526 67.678 -0.647 67.307 -0.647 c
+66.814 -0.647 66.44 -0.497 66.175 -0.191 c
+65.918 0.121 65.792 0.588 65.792 1.205 c
+65.792 1.646 l
+65.792 2.241 65.918 2.697 66.175 3.013 c
+66.44 3.326 66.814 3.484 67.307 3.484 c
+67.708 3.484 68.027 3.351 68.262 3.087 c
+68.505 2.829 68.637 2.484 68.659 2.043 c
+68.042 2.043 l
+68.02 2.337 67.946 2.557 67.822 2.705 c
+67.704 2.851 67.531 2.925 67.307 2.925 c
+67.013 2.925 66.796 2.826 66.66 2.631 c
+66.521 2.443 66.447 2.135 66.44 1.705 c
+66.44 1.19 l
+66.44 0.72 66.506 0.386 66.646 0.191 c
+66.792 0.004 67.013 -0.088 67.307 -0.088 c
+71.437 -0.221 m
+71.221 -0.507 70.908 -0.647 70.496 -0.647 c
+70.133 -0.647 69.857 -0.526 69.673 -0.279 c
+69.497 -0.026 69.401 0.338 69.394 0.808 c
+69.394 3.41 l
+70.041 3.41 l
+70.041 0.867 l
+70.041 0.239 70.224 -0.073 70.6 -0.073 c
+71 -0.073 71.275 0.103 71.423 0.455 c
+71.423 3.41 l
+72.069 3.41 l
+72.069 -0.574 l
+71.452 -0.574 l
+h
+74.7 2.792 m
+74.612 2.811 74.513 2.822 74.407 2.822 c
+74.072 2.822 73.837 2.638 73.701 2.278 c
+73.701 -0.574 l
+73.054 -0.574 l
+73.054 3.41 l
+73.686 3.41 l
+73.701 2.998 l
+73.877 3.322 74.12 3.484 74.436 3.484 c
+74.542 3.484 74.631 3.461 74.7 3.424 c
+h
+76.994 2.792 m
+76.905 2.811 76.806 2.822 76.699 2.822 c
+76.365 2.822 76.13 2.638 75.994 2.278 c
+75.994 -0.574 l
+75.348 -0.574 l
+75.348 3.41 l
+75.979 3.41 l
+75.994 2.998 l
+76.171 3.322 76.412 3.484 76.729 3.484 c
+76.836 3.484 76.923 3.461 76.994 3.424 c
+h
+78.993 -0.647 m
+78.492 -0.647 78.111 -0.5 77.846 -0.206 c
+77.582 0.087 77.449 0.521 77.449 1.103 c
+77.449 1.573 l
+77.449 2.167 77.574 2.634 77.831 2.969 c
+78.095 3.31 78.456 3.484 78.92 3.484 c
+79.379 3.484 79.72 3.329 79.948 3.027 c
+80.183 2.734 80.304 2.271 80.316 1.646 c
+80.316 1.22 l
+78.095 1.22 l
+78.095 1.132 l
+78.095 0.698 78.174 0.386 78.331 0.191 c
+78.496 0.004 78.728 -0.088 79.022 -0.088 c
+79.217 -0.088 79.39 -0.055 79.537 0.014 c
+79.683 0.091 79.82 0.209 79.948 0.367 c
+80.286 -0.044 l
+80 -0.449 79.57 -0.647 78.993 -0.647 c
+78.92 2.925 m
+78.644 2.925 78.442 2.829 78.317 2.645 c
+78.188 2.458 78.114 2.167 78.095 1.778 c
+79.668 1.778 l
+79.668 1.866 l
+79.647 2.248 79.581 2.516 79.463 2.674 c
+79.346 2.84 79.161 2.925 78.92 2.925 c
+81.712 3.41 m
+81.727 2.969 l
+81.98 3.31 82.303 3.484 82.697 3.484 c
+83.402 3.484 83.759 3.013 83.77 2.072 c
+83.77 -0.574 l
+83.123 -0.574 l
+83.123 2.043 l
+83.123 2.356 83.068 2.576 82.961 2.705 c
+82.851 2.829 82.697 2.896 82.491 2.896 c
+82.333 2.896 82.186 2.84 82.05 2.734 c
+81.921 2.624 81.819 2.487 81.742 2.322 c
+81.742 -0.574 l
+81.095 -0.574 l
+81.095 3.41 l
+h
+85.592 4.365 m
+85.592 3.41 l
+86.195 3.41 l
+86.195 2.881 l
+85.592 2.881 l
+85.592 0.411 l
+85.592 0.253 85.615 0.135 85.666 0.058 c
+85.725 -0.023 85.813 -0.059 85.931 -0.059 c
+86.018 -0.059 86.107 -0.044 86.195 -0.015 c
+86.195 -0.574 l
+86.048 -0.621 85.894 -0.647 85.74 -0.647 c
+85.482 -0.647 85.287 -0.555 85.151 -0.368 c
+85.012 -0.184 84.946 0.077 84.946 0.411 c
+84.946 2.881 l
+84.343 2.881 l
+84.343 3.41 l
+84.946 3.41 l
+84.946 4.365 l
+h
+91.56 1.22 m
+91.56 0.602 91.446 0.135 91.223 -0.177 c
+91.005 -0.493 90.682 -0.647 90.252 -0.647 c
+89.829 -0.647 89.517 -0.467 89.311 -0.103 c
+89.282 -0.574 l
+88.679 -0.574 l
+88.679 5.071 l
+89.326 5.071 l
+89.326 2.969 l
+89.54 3.31 89.848 3.484 90.252 3.484 c
+90.682 3.484 91.005 3.326 91.223 3.013 c
+91.446 2.708 91.56 2.241 91.56 1.616 c
+h
+90.914 1.602 m
+90.914 2.072 90.843 2.403 90.708 2.601 c
+90.579 2.796 90.369 2.896 90.076 2.896 c
+89.741 2.896 89.492 2.711 89.326 2.352 c
+89.326 0.47 l
+89.492 0.106 89.745 -0.073 90.09 -0.073 c
+90.384 -0.073 90.594 0.029 90.722 0.235 c
+90.847 0.44 90.914 0.756 90.914 1.19 c
+h
+94.045 2.792 m
+93.956 2.811 93.857 2.822 93.75 2.822 c
+93.416 2.822 93.181 2.638 93.045 2.278 c
+93.045 -0.574 l
+92.398 -0.574 l
+92.398 3.41 l
+93.031 3.41 l
+93.045 2.998 l
+93.222 3.322 93.463 3.484 93.779 3.484 c
+93.887 3.484 93.974 3.461 94.045 3.424 c
+h
+96.588 -0.574 m
+96.547 -0.485 96.521 -0.339 96.514 -0.133 c
+96.279 -0.478 95.985 -0.647 95.632 -0.647 c
+95.268 -0.647 94.986 -0.551 94.779 -0.353 c
+94.581 -0.148 94.485 0.139 94.485 0.515 c
+94.485 0.914 94.621 1.234 94.897 1.469 c
+95.169 1.712 95.543 1.837 96.014 1.837 c
+96.499 1.837 l
+96.499 2.263 l
+96.499 2.499 96.444 2.664 96.337 2.763 c
+96.227 2.869 96.065 2.925 95.853 2.925 c
+95.654 2.925 95.493 2.866 95.367 2.749 c
+95.25 2.631 95.191 2.484 95.191 2.308 c
+94.544 2.308 l
+94.544 2.502 94.603 2.693 94.72 2.881 c
+94.845 3.064 95.007 3.212 95.206 3.322 c
+95.412 3.428 95.639 3.484 95.896 3.484 c
+96.297 3.484 96.602 3.38 96.808 3.175 c
+97.021 2.969 97.135 2.674 97.145 2.293 c
+97.145 0.279 l
+97.145 -0.026 97.183 -0.291 97.264 -0.515 c
+97.264 -0.574 l
+h
+95.72 -0.059 m
+95.886 -0.059 96.036 -0.015 96.176 0.073 c
+96.323 0.162 96.43 0.272 96.499 0.411 c
+96.499 1.352 l
+96.131 1.352 l
+95.815 1.352 95.573 1.282 95.397 1.146 c
+95.221 1.018 95.132 0.83 95.132 0.588 c
+95.132 0.359 95.176 0.195 95.264 0.087 c
+95.352 -0.011 95.503 -0.059 95.72 -0.059 c
+98.763 3.41 m
+98.778 2.969 l
+99.031 3.31 99.354 3.484 99.748 3.484 c
+100.453 3.484 100.81 3.013 100.821 2.072 c
+100.821 -0.574 l
+100.174 -0.574 l
+100.174 2.043 l
+100.174 2.356 100.119 2.576 100.012 2.705 c
+99.902 2.829 99.748 2.896 99.542 2.896 c
+99.383 2.896 99.237 2.84 99.101 2.734 c
+98.972 2.624 98.87 2.487 98.792 2.322 c
+98.792 -0.574 l
+98.145 -0.574 l
+98.145 3.41 l
+h
+103.173 -0.088 m
+103.385 -0.088 103.558 -0.026 103.687 0.103 c
+103.823 0.239 103.896 0.43 103.907 0.675 c
+104.525 0.675 l
+104.503 0.294 104.367 -0.026 104.113 -0.279 c
+103.856 -0.526 103.543 -0.647 103.173 -0.647 c
+102.68 -0.647 102.305 -0.497 102.041 -0.191 c
+101.783 0.121 101.658 0.588 101.658 1.205 c
+101.658 1.646 l
+101.658 2.241 101.783 2.697 102.041 3.013 c
+102.305 3.326 102.68 3.484 103.173 3.484 c
+103.574 3.484 103.892 3.351 104.128 3.087 c
+104.37 2.829 104.503 2.484 104.525 2.043 c
+103.907 2.043 l
+103.886 2.337 103.812 2.557 103.687 2.705 c
+103.57 2.851 103.397 2.925 103.173 2.925 c
+102.878 2.925 102.662 2.826 102.526 2.631 c
+102.386 2.443 102.313 2.135 102.305 1.705 c
+102.305 1.19 l
+102.305 0.72 102.371 0.386 102.511 0.191 c
+102.658 0.004 102.878 -0.088 103.173 -0.088 c
+105.922 2.998 m
+106.175 3.322 106.495 3.484 106.876 3.484 c
+107.582 3.484 107.939 3.013 107.95 2.072 c
+107.95 -0.574 l
+107.303 -0.574 l
+107.303 2.043 l
+107.303 2.356 107.248 2.576 107.142 2.705 c
+107.031 2.829 106.876 2.896 106.671 2.896 c
+106.513 2.896 106.366 2.84 106.23 2.734 c
+106.101 2.624 105.999 2.487 105.922 2.322 c
+105.922 -0.574 l
+105.274 -0.574 l
+105.274 5.071 l
+105.922 5.071 l
+h
+108.949 -0.221 m
+108.949 -0.103 108.983 -0.008 109.052 0.073 c
+109.118 0.151 109.221 0.191 109.361 0.191 c
+109.508 0.191 109.614 0.151 109.685 0.073 c
+109.762 -0.008 109.802 -0.103 109.802 -0.221 c
+109.802 -0.331 109.762 -0.423 109.685 -0.5 c
+109.614 -0.578 109.508 -0.618 109.361 -0.618 c
+109.221 -0.618 109.118 -0.578 109.052 -0.5 c
+108.983 -0.423 108.949 -0.331 108.949 -0.221 c
+f
+Q
+161.753 450.241 -1.793 0.867 re
+163.575 452.357 m
+163.605 451.96 l
+163.84 452.273 164.141 452.431 164.516 452.431 c
+165.199 452.431 165.552 451.949 165.575 450.99 c
+165.575 448.373 l
+164.531 448.373 l
+164.531 450.916 l
+164.531 451.141 164.494 451.303 164.428 451.402 c
+164.358 451.498 164.241 451.548 164.075 451.548 c
+163.888 451.548 163.74 451.453 163.634 451.269 c
+163.634 448.373 l
+162.591 448.373 l
+162.591 452.357 l
+h
+169.499 449.167 m
+169.793 449.167 169.944 449.362 169.955 449.755 c
+170.925 449.755 l
+170.925 449.322 170.792 448.969 170.528 448.697 c
+170.263 448.433 169.925 448.3 169.514 448.3 c
+169.003 448.3 168.61 448.454 168.338 448.77 c
+168.073 449.094 167.933 449.564 167.927 450.181 c
+167.927 450.505 l
+167.927 451.13 168.058 451.608 168.323 451.931 c
+168.595 452.261 168.992 452.431 169.514 452.431 c
+169.944 452.431 170.285 452.291 170.543 452.019 c
+170.796 451.743 170.925 451.361 170.925 450.873 c
+169.955 450.873 l
+169.955 451.085 169.914 451.255 169.837 451.372 c
+169.768 451.498 169.65 451.563 169.484 451.563 c
+169.308 451.563 169.18 451.498 169.103 451.372 c
+169.022 451.244 168.977 450.993 168.97 450.623 c
+168.97 450.211 l
+168.97 449.888 168.984 449.659 169.014 449.535 c
+169.051 449.406 169.105 449.314 169.176 449.256 c
+169.253 449.196 169.359 449.167 169.499 449.167 c
+171.41 450.49 m
+171.41 451.097 171.549 451.571 171.836 451.916 c
+172.12 452.258 172.512 452.431 173.012 452.431 c
+173.519 452.431 173.916 452.258 174.202 451.916 c
+174.485 451.571 174.628 451.097 174.628 450.49 c
+174.628 450.226 l
+174.628 449.626 174.485 449.156 174.202 448.815 c
+173.916 448.469 173.519 448.3 173.012 448.3 c
+172.501 448.3 172.104 448.469 171.821 448.815 c
+171.546 449.156 171.41 449.63 171.41 450.241 c
+h
+172.453 450.226 m
+172.453 449.52 172.637 449.167 173.012 449.167 c
+173.365 449.167 173.556 449.462 173.585 450.05 c
+173.585 450.49 l
+173.585 450.85 173.533 451.122 173.438 451.299 c
+173.339 451.475 173.196 451.563 173.012 451.563 c
+172.835 451.563 172.696 451.475 172.6 451.299 c
+172.501 451.122 172.453 450.85 172.453 450.49 c
+h
+177.231 448.741 m
+177.014 448.447 176.723 448.3 176.363 448.3 c
+176 448.3 175.721 448.421 175.526 448.668 c
+175.338 448.921 175.247 449.289 175.247 449.77 c
+175.247 452.357 l
+176.29 452.357 l
+176.29 449.755 l
+176.29 449.362 176.415 449.167 176.672 449.167 c
+176.907 449.167 177.076 449.27 177.186 449.476 c
+177.186 452.357 l
+178.231 452.357 l
+178.231 448.373 l
+177.26 448.373 l
+h
+179.935 452.357 m
+179.964 451.96 l
+180.2 452.273 180.501 452.431 180.876 452.431 c
+181.56 452.431 181.913 451.949 181.934 450.99 c
+181.934 448.373 l
+180.891 448.373 l
+180.891 450.916 l
+180.891 451.141 180.854 451.303 180.787 451.402 c
+180.718 451.498 180.6 451.548 180.435 451.548 c
+180.247 451.548 180.101 451.453 179.994 451.269 c
+179.994 448.373 l
+178.95 448.373 l
+178.95 452.357 l
+h
+183.889 453.327 m
+183.889 452.357 l
+184.419 452.357 l
+184.419 451.563 l
+183.889 451.563 l
+183.889 449.593 l
+183.889 449.435 183.908 449.329 183.948 449.27 c
+183.996 449.212 184.08 449.182 184.198 449.182 c
+184.305 449.182 184.39 449.189 184.448 449.212 c
+184.448 448.403 l
+184.271 448.337 184.08 448.3 183.875 448.3 c
+183.199 448.3 182.853 448.686 182.846 449.462 c
+182.846 451.563 l
+182.39 451.563 l
+182.39 452.357 l
+182.846 452.357 l
+182.846 453.327 l
+h
+f
+187.52 448.373 -0.647 5.644 re
+189.24 448.373 -0.647 3.984 re
+189.284 453.401 m
+189.284 453.291 189.254 453.198 189.196 453.121 c
+189.137 453.052 189.042 453.019 188.916 453.019 c
+188.799 453.019 188.703 453.052 188.637 453.121 c
+188.579 453.198 188.549 453.291 188.549 453.401 c
+188.549 453.518 188.579 453.61 188.637 453.68 c
+188.703 453.757 188.799 453.798 188.916 453.798 c
+189.042 453.798 189.137 453.757 189.196 453.68 c
+189.254 453.599 189.284 453.507 189.284 453.401 c
+190.871 452.357 m
+190.886 451.99 l
+191.129 452.284 191.448 452.431 191.841 452.431 c
+192.282 452.431 192.591 452.232 192.768 451.843 c
+193.021 452.232 193.37 452.431 193.811 452.431 c
+194.546 452.431 194.921 451.968 194.943 451.049 c
+194.943 448.373 l
+194.296 448.373 l
+194.296 450.99 l
+194.296 451.284 194.241 451.498 194.135 451.637 c
+194.035 451.773 193.863 451.843 193.62 451.843 c
+193.422 451.843 193.26 451.762 193.135 451.608 c
+193.017 451.461 192.947 451.269 192.93 451.034 c
+192.93 448.373 l
+192.267 448.373 l
+192.267 451.02 l
+192.267 451.567 192.047 451.843 191.606 451.843 c
+191.272 451.843 191.037 451.681 190.9 451.357 c
+190.9 448.373 l
+190.254 448.373 l
+190.254 452.357 l
+h
+196.619 448.373 -0.647 3.984 re
+196.662 453.401 m
+196.662 453.291 196.633 453.198 196.575 453.121 c
+196.516 453.052 196.421 453.019 196.296 453.019 c
+196.178 453.019 196.082 453.052 196.016 453.121 c
+195.957 453.198 195.928 453.291 195.928 453.401 c
+195.928 453.518 195.957 453.61 196.016 453.68 c
+196.082 453.757 196.178 453.798 196.296 453.798 c
+196.421 453.798 196.516 453.757 196.575 453.68 c
+196.633 453.599 196.662 453.507 196.662 453.401 c
+198.486 453.312 m
+198.486 452.357 l
+199.088 452.357 l
+199.088 451.828 l
+198.486 451.828 l
+198.486 449.358 l
+198.486 449.2 198.507 449.083 198.559 449.006 c
+198.617 448.925 198.706 448.888 198.823 448.888 c
+198.912 448.888 199 448.903 199.088 448.932 c
+199.088 448.373 l
+198.941 448.326 198.787 448.3 198.632 448.3 c
+198.376 448.3 198.181 448.392 198.044 448.579 c
+197.905 448.763 197.838 449.024 197.838 449.358 c
+197.838 451.828 l
+197.236 451.828 l
+197.236 452.357 l
+197.838 452.357 l
+197.838 453.312 l
+h
+201.793 449.387 m
+201.793 449.535 201.738 449.656 201.631 449.755 c
+201.52 449.851 201.315 449.969 201.013 450.108 c
+200.668 450.255 200.425 450.376 200.279 450.476 c
+200.132 450.582 200.022 450.7 199.955 450.829 c
+199.885 450.953 199.852 451.111 199.852 451.299 c
+199.852 451.622 199.97 451.891 200.205 452.107 c
+200.44 452.321 200.742 452.431 201.117 452.431 c
+201.499 452.431 201.807 452.317 202.043 452.092 c
+202.278 451.864 202.395 451.578 202.395 451.226 c
+201.749 451.226 l
+201.749 451.402 201.69 451.552 201.572 451.681 c
+201.455 451.806 201.3 451.872 201.117 451.872 c
+200.918 451.872 200.768 451.816 200.661 451.71 c
+200.551 451.611 200.499 451.479 200.499 451.313 c
+200.499 451.185 200.536 451.078 200.617 450.99 c
+200.694 450.91 200.885 450.806 201.19 450.681 c
+201.668 450.494 201.998 450.307 202.175 450.123 c
+202.351 449.946 202.44 449.719 202.44 449.447 c
+202.44 449.094 202.314 448.815 202.072 448.608 c
+201.837 448.403 201.52 448.3 201.131 448.3 c
+200.709 448.3 200.371 448.418 200.117 448.653 c
+199.86 448.895 199.735 449.2 199.735 449.564 c
+200.382 449.564 l
+200.389 449.337 200.459 449.16 200.587 449.035 c
+200.712 448.917 200.896 448.859 201.131 448.859 c
+201.345 448.859 201.506 448.907 201.616 449.006 c
+201.734 449.101 201.793 449.229 201.793 449.387 c
+205.703 448.373 -0.647 5.644 re
+207.423 448.373 -0.647 3.984 re
+207.467 453.401 m
+207.467 453.291 207.438 453.198 207.378 453.121 c
+207.319 453.052 207.224 453.019 207.099 453.019 c
+206.981 453.019 206.886 453.052 206.82 453.121 c
+206.761 453.198 206.732 453.291 206.732 453.401 c
+206.732 453.518 206.761 453.61 206.82 453.68 c
+206.886 453.757 206.981 453.798 207.099 453.798 c
+207.224 453.798 207.319 453.757 207.378 453.68 c
+207.438 453.599 207.467 453.507 207.467 453.401 c
+210.377 449.387 m
+210.377 449.535 210.322 449.656 210.216 449.755 c
+210.105 449.851 209.9 449.969 209.598 450.108 c
+209.252 450.255 209.01 450.376 208.863 450.476 c
+208.716 450.582 208.606 450.7 208.539 450.829 c
+208.47 450.953 208.437 451.111 208.437 451.299 c
+208.437 451.622 208.554 451.891 208.79 452.107 c
+209.025 452.321 209.326 452.431 209.701 452.431 c
+210.083 452.431 210.392 452.317 210.627 452.092 c
+210.862 451.864 210.98 451.578 210.98 451.226 c
+210.333 451.226 l
+210.333 451.402 210.274 451.552 210.156 451.681 c
+210.039 451.806 209.885 451.872 209.701 451.872 c
+209.503 451.872 209.352 451.816 209.245 451.71 c
+209.135 451.611 209.084 451.479 209.084 451.313 c
+209.084 451.185 209.121 451.078 209.201 450.99 c
+209.279 450.91 209.47 450.806 209.774 450.681 c
+210.252 450.494 210.583 450.307 210.759 450.123 c
+210.935 449.946 211.024 449.719 211.024 449.447 c
+211.024 449.094 210.899 448.815 210.656 448.608 c
+210.421 448.403 210.105 448.3 209.715 448.3 c
+209.293 448.3 208.955 448.418 208.701 448.653 c
+208.444 448.895 208.319 449.2 208.319 449.564 c
+208.965 449.564 l
+208.973 449.337 209.044 449.16 209.171 449.035 c
+209.297 448.917 209.48 448.859 209.715 448.859 c
+209.929 448.859 210.091 448.907 210.201 449.006 c
+210.318 449.101 210.377 449.229 210.377 449.387 c
+212.714 453.312 m
+212.714 452.357 l
+213.317 452.357 l
+213.317 451.828 l
+212.714 451.828 l
+212.714 449.358 l
+212.714 449.2 212.736 449.083 212.788 449.006 c
+212.847 448.925 212.934 448.888 213.052 448.888 c
+213.14 448.888 213.229 448.903 213.317 448.932 c
+213.317 448.373 l
+213.17 448.326 213.015 448.3 212.861 448.3 c
+212.604 448.3 212.41 448.392 212.273 448.579 c
+212.134 448.763 212.067 449.024 212.067 449.358 c
+212.067 451.828 l
+211.465 451.828 l
+211.465 452.357 l
+212.067 452.357 l
+212.067 453.312 l
+h
+216.653 453.312 m
+216.653 452.357 l
+217.256 452.357 l
+217.256 451.828 l
+216.653 451.828 l
+216.653 449.358 l
+216.653 449.2 216.676 449.083 216.727 449.006 c
+216.786 448.925 216.874 448.888 216.992 448.888 c
+217.08 448.888 217.168 448.903 217.256 448.932 c
+217.256 448.373 l
+217.109 448.326 216.955 448.3 216.801 448.3 c
+216.543 448.3 216.348 448.392 216.213 448.579 c
+216.073 448.763 216.007 449.024 216.007 449.358 c
+216.007 451.828 l
+215.404 451.828 l
+215.404 452.357 l
+216.007 452.357 l
+216.007 453.312 l
+h
+217.815 450.549 m
+217.815 451.126 217.95 451.581 218.226 451.916 c
+218.509 452.258 218.881 452.431 219.344 452.431 c
+219.803 452.431 220.171 452.261 220.446 451.931 c
+220.728 451.608 220.876 451.159 220.886 450.593 c
+220.886 450.167 l
+220.886 449.597 220.743 449.142 220.46 448.799 c
+220.185 448.466 219.818 448.3 219.358 448.3 c
+218.895 448.3 218.524 448.462 218.241 448.785 c
+217.965 449.116 217.823 449.557 217.815 450.108 c
+h
+218.461 450.167 m
+218.461 449.763 218.538 449.447 218.696 449.212 c
+218.862 448.976 219.082 448.859 219.358 448.859 c
+219.924 448.859 220.218 449.27 220.24 450.093 c
+220.24 450.549 l
+220.24 450.95 220.156 451.269 219.99 451.504 c
+219.832 451.747 219.616 451.872 219.344 451.872 c
+219.078 451.872 218.862 451.747 218.696 451.504 c
+218.538 451.269 218.461 450.95 218.461 450.549 c
+h
+224.15 448.373 -0.646 5.644 re
+227.207 448.373 m
+227.167 448.462 227.141 448.608 227.134 448.815 c
+226.899 448.469 226.604 448.3 226.252 448.3 c
+225.888 448.3 225.605 448.396 225.399 448.594 c
+225.201 448.799 225.106 449.086 225.106 449.462 c
+225.106 449.862 225.241 450.181 225.517 450.417 c
+225.789 450.659 226.164 450.784 226.634 450.784 c
+227.119 450.784 l
+227.119 451.211 l
+227.119 451.446 227.064 451.611 226.958 451.71 c
+226.847 451.816 226.685 451.872 226.473 451.872 c
+226.274 451.872 226.112 451.814 225.987 451.696 c
+225.87 451.578 225.811 451.431 225.811 451.255 c
+225.164 451.255 l
+225.164 451.45 225.223 451.641 225.341 451.828 c
+225.466 452.011 225.627 452.159 225.825 452.269 c
+226.031 452.375 226.259 452.431 226.517 452.431 c
+226.918 452.431 227.222 452.327 227.428 452.122 c
+227.641 451.916 227.755 451.622 227.766 451.24 c
+227.766 449.227 l
+227.766 448.921 227.803 448.656 227.884 448.433 c
+227.884 448.373 l
+h
+226.34 448.888 m
+226.506 448.888 226.656 448.932 226.796 449.021 c
+226.943 449.109 227.049 449.219 227.119 449.358 c
+227.119 450.299 l
+226.752 450.299 l
+226.436 450.299 226.193 450.229 226.017 450.093 c
+225.84 449.965 225.752 449.777 225.752 449.535 c
+225.752 449.307 225.796 449.142 225.885 449.035 c
+225.973 448.936 226.124 448.888 226.34 448.888 c
+230.706 449.387 m
+230.706 449.535 230.65 449.656 230.544 449.755 c
+230.434 449.851 230.228 449.969 229.927 450.108 c
+229.582 450.255 229.339 450.376 229.191 450.476 c
+229.045 450.582 228.935 450.7 228.869 450.829 c
+228.799 450.953 228.765 451.111 228.765 451.299 c
+228.765 451.622 228.883 451.891 229.118 452.107 c
+229.353 452.321 229.655 452.431 230.03 452.431 c
+230.411 452.431 230.721 452.317 230.956 452.092 c
+231.191 451.864 231.308 451.578 231.308 451.226 c
+230.662 451.226 l
+230.662 451.402 230.602 451.552 230.486 451.681 c
+230.367 451.806 230.213 451.872 230.03 451.872 c
+229.831 451.872 229.681 451.816 229.574 451.71 c
+229.464 451.611 229.412 451.479 229.412 451.313 c
+229.412 451.185 229.449 451.078 229.53 450.99 c
+229.607 450.91 229.798 450.806 230.103 450.681 c
+230.581 450.494 230.912 450.307 231.088 450.123 c
+231.265 449.946 231.352 449.719 231.352 449.447 c
+231.352 449.094 231.228 448.815 230.985 448.608 c
+230.75 448.403 230.434 448.3 230.045 448.3 c
+229.622 448.3 229.284 448.418 229.03 448.653 c
+228.773 448.895 228.648 449.2 228.648 449.564 c
+229.295 449.564 l
+229.302 449.337 229.372 449.16 229.501 449.035 c
+229.625 448.917 229.809 448.859 230.045 448.859 c
+230.257 448.859 230.419 448.907 230.529 449.006 c
+230.647 449.101 230.706 449.229 230.706 449.387 c
+233.043 453.312 m
+233.043 452.357 l
+233.646 452.357 l
+233.646 451.828 l
+233.043 451.828 l
+233.043 449.358 l
+233.043 449.2 233.065 449.083 233.116 449.006 c
+233.175 448.925 233.264 448.888 233.381 448.888 c
+233.469 448.888 233.557 448.903 233.646 448.932 c
+233.646 448.373 l
+233.499 448.326 233.345 448.3 233.189 448.3 c
+232.933 448.3 232.738 448.392 232.602 448.579 c
+232.462 448.763 232.396 449.024 232.396 449.358 c
+232.396 451.828 l
+231.793 451.828 l
+231.793 452.357 l
+232.396 452.357 l
+232.396 453.312 l
+h
+f
+q 1 0 0 1 236.9825 452.3574 cm
+0 0 m
+0.029 -0.397 l
+0.264 -0.085 0.565 0.073 0.941 0.073 c
+1.624 0.073 1.977 -0.408 1.999 -1.367 c
+1.999 -3.984 l
+0.955 -3.984 l
+0.955 -1.441 l
+0.955 -1.216 0.918 -1.055 0.852 -0.956 c
+0.783 -0.86 0.665 -0.809 0.5 -0.809 c
+0.312 -0.809 0.166 -0.904 0.058 -1.088 c
+0.058 -3.984 l
+-0.985 -3.984 l
+-0.985 0 l
+h
+f
+Q
+q 1 0 0 1 242.9355 448.8588 cm
+0 0 m
+0.213 0 0.386 0.062 0.515 0.191 c
+0.65 0.327 0.723 0.518 0.735 0.764 c
+1.352 0.764 l
+1.33 0.382 1.194 0.062 0.941 -0.191 c
+0.683 -0.437 0.371 -0.559 0 -0.559 c
+-0.493 -0.559 -0.867 -0.408 -1.132 -0.103 c
+-1.389 0.21 -1.515 0.676 -1.515 1.294 c
+-1.515 1.735 l
+-1.515 2.329 -1.389 2.786 -1.132 3.102 c
+-0.867 3.414 -0.493 3.572 0 3.572 c
+0.401 3.572 0.721 3.439 0.956 3.175 c
+1.198 2.917 1.33 2.572 1.352 2.132 c
+0.735 2.132 l
+0.713 2.425 0.64 2.645 0.515 2.793 c
+0.397 2.94 0.224 3.013 0 3.013 c
+-0.294 3.013 -0.511 2.914 -0.647 2.72 c
+-0.786 2.531 -0.86 2.223 -0.867 1.793 c
+-0.867 1.278 l
+-0.867 0.808 -0.801 0.474 -0.661 0.279 c
+-0.515 0.092 -0.294 0 0 0 c
+1.97 1.69 m
+1.97 2.267 2.105 2.722 2.381 3.057 c
+2.664 3.399 3.035 3.572 3.499 3.572 c
+3.958 3.572 4.326 3.403 4.6 3.072 c
+4.883 2.749 5.031 2.3 5.041 1.735 c
+5.041 1.309 l
+5.041 0.738 4.898 0.283 4.615 -0.059 c
+4.34 -0.393 3.973 -0.559 3.513 -0.559 c
+3.05 -0.559 2.679 -0.397 2.396 -0.073 c
+2.12 0.257 1.977 0.698 1.97 1.249 c
+h
+2.616 1.309 m
+2.616 0.904 2.693 0.588 2.851 0.353 c
+3.017 0.118 3.237 0 3.513 0 c
+4.079 0 4.373 0.411 4.395 1.234 c
+4.395 1.69 l
+4.395 2.091 4.31 2.41 4.145 2.645 c
+3.987 2.888 3.77 3.013 3.499 3.013 c
+3.233 3.013 3.017 2.888 2.851 2.645 c
+2.693 2.41 2.616 2.091 2.616 1.69 c
+h
+6.497 3.499 m
+6.512 3.131 l
+6.755 3.425 7.073 3.572 7.467 3.572 c
+7.908 3.572 8.216 3.373 8.393 2.984 c
+8.646 3.373 8.995 3.572 9.437 3.572 c
+10.171 3.572 10.547 3.109 10.568 2.19 c
+10.568 -0.485 l
+9.922 -0.485 l
+9.922 2.132 l
+9.922 2.425 9.866 2.639 9.76 2.778 c
+9.66 2.914 9.488 2.984 9.246 2.984 c
+9.047 2.984 8.885 2.903 8.76 2.749 c
+8.643 2.602 8.573 2.41 8.555 2.175 c
+8.555 -0.485 l
+7.893 -0.485 l
+7.893 2.161 l
+7.893 2.708 7.673 2.984 7.231 2.984 c
+6.898 2.984 6.662 2.822 6.526 2.499 c
+6.526 -0.485 l
+5.88 -0.485 l
+5.88 3.499 l
+h
+12.156 3.499 m
+12.17 3.131 l
+12.413 3.425 12.733 3.572 13.126 3.572 c
+13.567 3.572 13.876 3.373 14.052 2.984 c
+14.306 3.373 14.655 3.572 15.096 3.572 c
+15.831 3.572 16.205 3.109 16.228 2.19 c
+16.228 -0.485 l
+15.581 -0.485 l
+15.581 2.132 l
+15.581 2.425 15.526 2.639 15.419 2.778 c
+15.32 2.914 15.147 2.984 14.905 2.984 c
+14.707 2.984 14.545 2.903 14.42 2.749 c
+14.302 2.602 14.232 2.41 14.214 2.175 c
+14.214 -0.485 l
+13.552 -0.485 l
+13.552 2.161 l
+13.552 2.708 13.332 2.984 12.891 2.984 c
+12.557 2.984 12.322 2.822 12.185 2.499 c
+12.185 -0.485 l
+11.539 -0.485 l
+11.539 3.499 l
+h
+17.903 -0.485 -0.646 3.984 re
+17.947 4.542 m
+17.947 4.432 17.918 4.34 17.859 4.262 c
+17.801 4.193 17.705 4.16 17.58 4.16 c
+17.462 4.16 17.367 4.193 17.3 4.262 c
+17.242 4.34 17.213 4.432 17.213 4.542 c
+17.213 4.659 17.242 4.752 17.3 4.821 c
+17.367 4.898 17.462 4.939 17.58 4.939 c
+17.705 4.939 17.801 4.898 17.859 4.821 c
+17.918 4.74 17.947 4.648 17.947 4.542 c
+19.771 4.453 m
+19.771 3.499 l
+20.373 3.499 l
+20.373 2.969 l
+19.771 2.969 l
+19.771 0.5 l
+19.771 0.341 19.792 0.224 19.844 0.147 c
+19.902 0.066 19.991 0.029 20.108 0.029 c
+20.197 0.029 20.284 0.044 20.373 0.073 c
+20.373 -0.485 l
+20.226 -0.532 20.072 -0.559 19.917 -0.559 c
+19.66 -0.559 19.465 -0.467 19.329 -0.279 c
+19.189 -0.096 19.123 0.166 19.123 0.5 c
+19.123 2.969 l
+18.52 2.969 l
+18.52 3.499 l
+19.123 3.499 l
+19.123 4.453 l
+h
+23.077 0.529 m
+23.077 0.676 23.023 0.798 22.915 0.897 c
+22.805 0.992 22.599 1.11 22.298 1.249 c
+21.953 1.396 21.71 1.517 21.564 1.617 c
+21.417 1.723 21.306 1.841 21.24 1.97 c
+21.17 2.094 21.137 2.252 21.137 2.44 c
+21.137 2.763 21.255 3.032 21.49 3.248 c
+21.725 3.462 22.026 3.572 22.401 3.572 c
+22.784 3.572 23.092 3.458 23.328 3.233 c
+23.563 3.006 23.68 2.72 23.68 2.367 c
+23.033 2.367 l
+23.033 2.543 22.975 2.693 22.857 2.822 c
+22.74 2.947 22.585 3.013 22.401 3.013 c
+22.202 3.013 22.052 2.958 21.946 2.851 c
+21.835 2.753 21.784 2.62 21.784 2.454 c
+21.784 2.326 21.82 2.219 21.901 2.132 c
+21.979 2.051 22.169 1.947 22.474 1.822 c
+22.952 1.635 23.283 1.448 23.459 1.264 c
+23.636 1.087 23.725 0.86 23.725 0.588 c
+23.725 0.235 23.599 -0.044 23.357 -0.25 c
+23.122 -0.455 22.805 -0.559 22.416 -0.559 c
+21.994 -0.559 21.655 -0.441 21.402 -0.206 c
+21.144 0.037 21.02 0.341 21.02 0.706 c
+21.666 0.706 l
+21.674 0.478 21.743 0.301 21.872 0.176 c
+21.997 0.058 22.181 0 22.416 0 c
+22.629 0 22.79 0.048 22.901 0.147 c
+23.019 0.243 23.077 0.371 23.077 0.529 c
+24.606 -0.133 m
+24.606 -0.015 24.639 0.081 24.709 0.162 c
+24.775 0.239 24.878 0.279 25.018 0.279 c
+25.165 0.279 25.271 0.239 25.341 0.162 c
+25.418 0.081 25.458 -0.015 25.458 -0.133 c
+25.458 -0.243 25.418 -0.335 25.341 -0.412 c
+25.271 -0.489 25.165 -0.53 25.018 -0.53 c
+24.878 -0.53 24.775 -0.489 24.709 -0.412 c
+24.639 -0.335 24.606 -0.243 24.606 -0.133 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 441.263 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 434.424 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.882 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.882 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+23.221 -0.646 m
+24.353 -0.646 l
+24.353 -1.264 l
+21.045 -1.264 l
+21.045 -0.646 l
+22.31 -0.646 l
+22.31 2.896 l
+21.384 2.896 l
+21.384 3.514 l
+23.221 3.514 l
+h
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.738 25.047 0.974 25.106 1.191 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.191 c
+28.355 0.974 28.384 0.738 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.014 c
+27.362 1.162 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.548 27.046 1.588 c
+26.959 1.635 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.243 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.599 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.206 27.385 -0.058 c
+27.414 0.088 27.429 0.268 27.429 0.485 c
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.526 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.595 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.056 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.467 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.36 2.139 32.349 2.028 32.342 1.882 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.278 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.232 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+37.953 0.838 1.866 -0.794 re
+37.953 0.044 m
+42.013 0.838 1.867 -0.794 re
+42.013 0.044 m
+48.691 0.485 m
+48.691 0.21 48.654 -0.04 48.588 -0.264 c
+48.519 -0.482 48.415 -0.669 48.28 -0.823 c
+48.14 -0.981 47.964 -1.103 47.75 -1.19 c
+47.534 -1.278 47.28 -1.323 46.986 -1.323 c
+46.711 -1.323 46.464 -1.278 46.251 -1.19 c
+46.045 -1.103 45.872 -0.981 45.736 -0.823 c
+45.597 -0.669 45.494 -0.482 45.427 -0.264 c
+45.358 -0.04 45.325 0.21 45.325 0.485 c
+45.325 0.738 45.354 0.974 45.413 1.191 c
+45.479 1.415 45.582 1.606 45.722 1.764 c
+45.857 1.929 46.034 2.058 46.251 2.146 c
+46.464 2.234 46.721 2.278 47.015 2.278 c
+47.328 2.278 47.588 2.234 47.794 2.146 c
+48.008 2.058 48.18 1.929 48.309 1.764 c
+48.444 1.606 48.544 1.415 48.602 1.191 c
+48.662 0.974 48.691 0.738 48.691 0.485 c
+47.735 0.485 m
+47.735 0.691 47.721 0.867 47.692 1.014 c
+47.669 1.162 47.632 1.282 47.574 1.382 c
+47.515 1.477 47.441 1.548 47.353 1.588 c
+47.265 1.635 47.155 1.661 47.029 1.661 c
+46.765 1.661 46.574 1.562 46.457 1.367 c
+46.339 1.18 46.281 0.886 46.281 0.485 c
+46.281 0.063 46.339 -0.243 46.457 -0.426 c
+46.574 -0.613 46.751 -0.706 46.986 -0.706 c
+47.11 -0.706 47.224 -0.687 47.324 -0.646 c
+47.42 -0.599 47.5 -0.525 47.559 -0.426 c
+47.625 -0.33 47.669 -0.206 47.692 -0.058 c
+47.721 0.088 47.735 0.268 47.735 0.485 c
+51.737 -1.264 m
+51.737 0.721 l
+51.737 1.022 51.693 1.242 51.605 1.382 c
+51.524 1.529 51.388 1.602 51.193 1.602 c
+51.083 1.602 50.981 1.577 50.885 1.529 c
+50.796 1.477 50.715 1.411 50.649 1.323 c
+50.591 1.235 50.539 1.124 50.503 1 c
+50.473 0.882 50.458 0.75 50.458 0.603 c
+50.458 -1.264 l
+49.547 -1.264 l
+49.547 1.44 l
+49.547 1.661 l
+49.547 1.75 49.539 1.827 49.533 1.897 c
+49.533 2.087 l
+49.533 2.22 l
+50.385 2.22 l
+50.393 2.19 50.4 2.146 50.4 2.087 c
+50.4 1.897 l
+50.407 1.827 50.414 1.756 50.414 1.691 c
+50.422 1.621 50.429 1.565 50.429 1.529 c
+50.443 1.529 l
+50.561 1.793 50.712 1.985 50.9 2.103 c
+51.083 2.22 51.303 2.278 51.561 2.278 c
+51.744 2.278 51.906 2.249 52.046 2.19 c
+52.182 2.132 52.296 2.043 52.384 1.926 c
+52.473 1.808 52.535 1.665 52.575 1.5 c
+52.623 1.341 52.648 1.154 52.648 0.941 c
+52.648 -1.264 l
+h
+55.17 -1.323 m
+54.912 -1.323 54.684 -1.286 54.478 -1.22 c
+54.273 -1.143 54.096 -1.029 53.95 -0.881 c
+53.803 -0.727 53.685 -0.536 53.597 -0.309 c
+53.516 -0.085 53.479 0.181 53.479 0.485 c
+53.479 0.816 53.523 1.095 53.612 1.323 c
+53.707 1.558 53.836 1.742 53.994 1.882 c
+54.159 2.018 54.347 2.117 54.553 2.176 c
+54.758 2.242 54.967 2.278 55.184 2.278 c
+55.456 2.278 55.691 2.227 55.889 2.132 c
+56.095 2.043 56.261 1.911 56.39 1.735 c
+56.525 1.565 56.625 1.359 56.683 1.118 c
+56.75 0.882 56.787 0.617 56.787 0.324 c
+56.787 0.309 l
+54.42 0.309 l
+54.42 0.162 54.435 0.023 54.464 -0.103 c
+54.501 -0.231 54.555 -0.345 54.626 -0.441 c
+54.692 -0.529 54.776 -0.599 54.875 -0.646 c
+54.971 -0.698 55.085 -0.72 55.214 -0.72 c
+55.368 -0.72 55.507 -0.687 55.625 -0.617 c
+55.75 -0.551 55.839 -0.448 55.889 -0.309 c
+56.728 -0.382 l
+56.698 -0.482 56.643 -0.588 56.566 -0.706 c
+56.485 -0.816 56.382 -0.918 56.257 -1.014 c
+56.14 -1.103 55.985 -1.176 55.802 -1.234 c
+55.625 -1.294 55.412 -1.323 55.17 -1.323 c
+55.17 1.706 m
+55.081 1.706 54.993 1.691 54.905 1.661 c
+54.817 1.632 54.736 1.58 54.67 1.515 c
+54.6 1.444 54.541 1.357 54.493 1.249 c
+54.453 1.139 54.435 1.014 54.435 0.867 c
+55.904 0.867 l
+55.904 1.004 55.879 1.124 55.831 1.235 c
+55.791 1.341 55.735 1.43 55.669 1.5 c
+55.611 1.565 55.537 1.617 55.449 1.646 c
+55.361 1.683 55.265 1.706 55.17 1.706 c
+59.774 -0.646 m
+60.905 -0.646 l
+60.905 -1.264 l
+57.599 -1.264 l
+57.599 -0.646 l
+58.863 -0.646 l
+58.863 2.896 l
+57.936 2.896 l
+57.936 3.514 l
+59.774 3.514 l
+h
+63.835 -0.646 m
+64.967 -0.646 l
+64.967 -1.264 l
+61.659 -1.264 l
+61.659 -0.646 l
+62.923 -0.646 l
+62.923 1.602 l
+61.998 1.602 l
+61.998 2.22 l
+63.835 2.22 l
+h
+62.923 3.514 0.912 -0.676 re
+62.923 2.837 m
+67.983 -1.264 m
+67.983 0.721 l
+67.983 1.022 67.939 1.242 67.851 1.382 c
+67.77 1.529 67.634 1.602 67.44 1.602 c
+67.33 1.602 67.226 1.577 67.131 1.529 c
+67.043 1.477 66.962 1.411 66.896 1.323 c
+66.837 1.235 66.785 1.124 66.748 1 c
+66.719 0.882 66.705 0.75 66.705 0.603 c
+66.705 -1.264 l
+65.793 -1.264 l
+65.793 1.44 l
+65.793 1.661 l
+65.793 1.75 65.786 1.827 65.778 1.897 c
+65.778 2.087 l
+65.778 2.22 l
+66.631 2.22 l
+66.638 2.19 66.646 2.146 66.646 2.087 c
+66.646 1.897 l
+66.653 1.827 66.661 1.756 66.661 1.691 c
+66.667 1.621 66.675 1.565 66.675 1.529 c
+66.69 1.529 l
+66.808 1.793 66.958 1.985 67.145 2.103 c
+67.33 2.22 67.55 2.278 67.807 2.278 c
+67.991 2.278 68.153 2.249 68.292 2.19 c
+68.428 2.132 68.542 2.043 68.63 1.926 c
+68.718 1.808 68.781 1.665 68.822 1.5 c
+68.869 1.341 68.895 1.154 68.895 0.941 c
+68.895 -1.264 l
+h
+71.412 -1.323 m
+71.155 -1.323 70.927 -1.286 70.721 -1.22 c
+70.515 -1.143 70.339 -1.029 70.192 -0.881 c
+70.045 -0.727 69.927 -0.536 69.84 -0.309 c
+69.759 -0.085 69.722 0.181 69.722 0.485 c
+69.722 0.816 69.765 1.095 69.854 1.323 c
+69.95 1.558 70.078 1.742 70.236 1.882 c
+70.401 2.018 70.588 2.117 70.794 2.176 c
+71 2.242 71.21 2.278 71.427 2.278 c
+71.698 2.278 71.934 2.227 72.132 2.132 c
+72.338 2.043 72.504 1.911 72.632 1.735 c
+72.768 1.565 72.867 1.359 72.926 1.118 c
+72.992 0.882 73.029 0.617 73.029 0.324 c
+73.029 0.309 l
+70.663 0.309 l
+70.663 0.162 70.677 0.023 70.706 -0.103 c
+70.743 -0.231 70.798 -0.345 70.868 -0.441 c
+70.935 -0.529 71.018 -0.599 71.118 -0.646 c
+71.213 -0.698 71.328 -0.72 71.456 -0.72 c
+71.61 -0.72 71.75 -0.687 71.868 -0.617 c
+71.993 -0.551 72.08 -0.448 72.132 -0.309 c
+72.97 -0.382 l
+72.94 -0.482 72.886 -0.588 72.809 -0.706 c
+72.728 -0.816 72.624 -0.918 72.5 -1.014 c
+72.382 -1.103 72.228 -1.176 72.044 -1.234 c
+71.868 -1.294 71.654 -1.323 71.412 -1.323 c
+71.412 1.706 m
+71.324 1.706 71.236 1.691 71.147 1.661 c
+71.059 1.632 70.978 1.58 70.912 1.515 c
+70.842 1.444 70.783 1.357 70.736 1.249 c
+70.696 1.139 70.677 1.014 70.677 0.867 c
+72.147 0.867 l
+72.147 1.004 72.121 1.124 72.074 1.235 c
+72.033 1.341 71.978 1.43 71.912 1.5 c
+71.853 1.565 71.779 1.617 71.691 1.646 c
+71.603 1.683 71.507 1.706 71.412 1.706 c
+78.567 0.838 1.866 -0.794 re
+78.567 0.044 m
+82.627 0.838 1.867 -0.794 re
+82.627 0.044 m
+87.629 -2.66 m
+87.412 -2.66 87.221 -2.635 87.055 -2.587 c
+86.887 -2.547 86.747 -2.484 86.629 -2.396 c
+86.511 -2.315 86.413 -2.219 86.335 -2.102 c
+86.265 -1.984 86.218 -1.855 86.188 -1.72 c
+87.085 -1.617 l
+87.122 -1.753 87.191 -1.859 87.29 -1.94 c
+87.386 -2.028 87.511 -2.072 87.658 -2.072 c
+87.747 -2.072 87.827 -2.057 87.908 -2.028 c
+87.985 -1.999 88.055 -1.944 88.113 -1.866 c
+88.173 -1.797 88.217 -1.705 88.246 -1.587 c
+88.283 -1.469 88.304 -1.323 88.304 -1.147 c
+88.304 -0.955 l
+88.304 -0.889 88.308 -0.831 88.319 -0.779 c
+88.319 -0.588 l
+88.304 -0.588 l
+88.206 -0.816 88.063 -0.977 87.878 -1.072 c
+87.691 -1.172 87.485 -1.22 87.261 -1.22 c
+87.055 -1.22 86.872 -1.183 86.717 -1.103 c
+86.571 -1.014 86.442 -0.897 86.335 -0.75 c
+86.236 -0.595 86.162 -0.411 86.114 -0.206 c
+86.064 0.008 86.041 0.243 86.041 0.5 c
+86.041 0.771 86.064 1.018 86.114 1.235 c
+86.174 1.448 86.255 1.632 86.365 1.779 c
+86.471 1.933 86.604 2.051 86.762 2.132 c
+86.916 2.22 87.103 2.263 87.32 2.263 c
+87.415 2.263 87.515 2.253 87.614 2.234 c
+87.71 2.213 87.797 2.18 87.878 2.132 c
+87.967 2.08 88.044 2.018 88.113 1.941 c
+88.191 1.86 88.254 1.768 88.304 1.661 c
+88.319 1.661 l
+88.319 1.808 l
+88.327 1.867 88.334 1.918 88.334 1.97 c
+88.342 2.028 88.349 2.076 88.349 2.117 c
+88.356 2.165 88.367 2.198 88.379 2.22 c
+89.231 2.22 l
+89.22 2.139 89.208 2.028 89.202 1.882 c
+89.202 1.411 l
+89.202 -1.161 l
+89.202 -1.415 89.165 -1.635 89.098 -1.822 c
+89.029 -2.007 88.926 -2.161 88.79 -2.278 c
+88.651 -2.404 88.485 -2.499 88.29 -2.558 c
+88.092 -2.624 87.872 -2.66 87.629 -2.66 c
+88.319 0.53 m
+88.319 0.742 88.294 0.919 88.246 1.058 c
+88.206 1.205 88.15 1.323 88.084 1.411 c
+88.026 1.5 87.955 1.558 87.878 1.588 c
+87.797 1.625 87.72 1.646 87.643 1.646 c
+87.544 1.646 87.452 1.621 87.364 1.573 c
+87.284 1.532 87.217 1.463 87.159 1.367 c
+87.107 1.279 87.063 1.162 87.026 1.014 c
+86.997 0.875 86.982 0.706 86.982 0.5 c
+86.982 0.125 87.041 -0.154 87.159 -0.338 c
+87.276 -0.515 87.438 -0.602 87.643 -0.602 c
+87.71 -0.602 87.783 -0.588 87.864 -0.559 c
+87.952 -0.522 88.026 -0.463 88.084 -0.382 c
+88.15 -0.294 88.206 -0.176 88.246 -0.029 c
+88.294 0.118 88.319 0.301 88.319 0.53 c
+93.174 1.47 m
+93.075 1.477 92.971 1.488 92.865 1.5 c
+92.755 1.517 92.634 1.529 92.498 1.529 c
+92.321 1.529 92.163 1.488 92.028 1.411 c
+91.888 1.341 91.77 1.242 91.674 1.118 c
+91.587 0.989 91.517 0.842 91.469 0.676 c
+91.429 0.507 91.41 0.331 91.41 0.147 c
+91.41 -1.264 l
+90.513 -1.264 l
+90.513 0.985 l
+90.513 1.11 90.502 1.235 90.484 1.353 c
+90.473 1.477 90.459 1.595 90.44 1.706 c
+90.429 1.823 90.414 1.918 90.396 1.999 c
+90.374 2.087 90.355 2.161 90.337 2.22 c
+91.219 2.22 l
+91.226 2.168 91.238 2.117 91.248 2.058 c
+91.267 1.999 91.282 1.933 91.292 1.867 c
+91.311 1.808 91.325 1.742 91.336 1.675 c
+91.344 1.606 91.355 1.544 91.366 1.484 c
+91.381 1.484 l
+91.417 1.602 91.469 1.709 91.527 1.808 c
+91.594 1.904 91.674 1.988 91.763 2.058 c
+91.851 2.124 91.954 2.18 92.071 2.22 c
+92.196 2.257 92.343 2.278 92.512 2.278 c
+92.637 2.278 92.755 2.271 92.865 2.263 c
+92.983 2.253 93.085 2.238 93.174 2.22 c
+h
+95.18 -1.323 m
+95.011 -1.323 94.86 -1.301 94.725 -1.264 c
+94.596 -1.216 94.482 -1.147 94.386 -1.058 c
+94.299 -0.97 94.228 -0.864 94.181 -0.735 c
+94.129 -0.599 94.107 -0.448 94.107 -0.279 c
+94.107 -0.073 94.141 0.096 94.21 0.235 c
+94.276 0.382 94.372 0.493 94.49 0.574 c
+94.615 0.661 94.758 0.724 94.916 0.765 c
+95.081 0.802 95.257 0.827 95.445 0.838 c
+96.165 0.852 l
+96.165 1.029 l
+96.165 1.147 96.154 1.249 96.136 1.338 c
+96.113 1.426 96.081 1.492 96.033 1.544 c
+95.992 1.602 95.945 1.639 95.886 1.661 c
+95.827 1.679 95.761 1.691 95.695 1.691 c
+95.625 1.691 95.562 1.679 95.504 1.661 c
+95.452 1.65 95.404 1.625 95.357 1.588 c
+95.317 1.558 95.283 1.507 95.254 1.44 c
+95.232 1.382 95.217 1.301 95.209 1.205 c
+94.269 1.249 l
+94.299 1.397 94.342 1.532 94.401 1.661 c
+94.467 1.786 94.563 1.897 94.681 1.985 c
+94.798 2.08 94.938 2.153 95.107 2.205 c
+95.283 2.253 95.489 2.278 95.724 2.278 c
+96.165 2.278 96.496 2.168 96.724 1.955 c
+96.959 1.75 97.077 1.44 97.077 1.029 c
+97.077 -0.235 l
+97.077 -0.455 l
+97.083 -0.515 97.098 -0.569 97.121 -0.617 c
+97.139 -0.658 97.168 -0.69 97.208 -0.72 c
+97.245 -0.742 97.297 -0.75 97.356 -0.75 c
+97.422 -0.75 97.492 -0.746 97.561 -0.735 c
+97.561 -1.22 l
+97.503 -1.23 97.447 -1.242 97.399 -1.249 c
+97.359 -1.261 97.319 -1.267 97.282 -1.278 c
+97.241 -1.286 97.198 -1.294 97.15 -1.294 c
+97.098 -1.301 97.04 -1.308 96.973 -1.308 c
+96.746 -1.308 96.58 -1.257 96.474 -1.147 c
+96.364 -1.029 96.301 -0.864 96.283 -0.646 c
+96.268 -0.646 l
+96.198 -0.757 96.129 -0.852 96.063 -0.941 c
+95.992 -1.022 95.915 -1.087 95.827 -1.147 c
+95.739 -1.205 95.639 -1.249 95.533 -1.278 c
+95.434 -1.308 95.317 -1.323 95.18 -1.323 c
+96.165 0.353 m
+95.739 0.339 l
+95.639 0.339 95.548 0.331 95.46 0.324 c
+95.379 0.312 95.313 0.287 95.254 0.25 c
+95.195 0.21 95.144 0.151 95.107 0.073 c
+95.066 0.004 95.048 -0.088 95.048 -0.206 c
+95.048 -0.374 95.081 -0.496 95.151 -0.573 c
+95.217 -0.654 95.317 -0.69 95.445 -0.69 c
+95.552 -0.69 95.651 -0.669 95.739 -0.617 c
+95.834 -0.569 95.915 -0.507 95.974 -0.426 c
+96.04 -0.349 96.092 -0.261 96.121 -0.162 c
+96.15 -0.055 96.165 0.059 96.165 0.177 c
+h
+99.153 2.22 m
+99.161 2.198 99.167 2.165 99.167 2.117 c
+99.175 2.076 99.182 2.028 99.182 1.97 c
+99.19 1.918 99.197 1.867 99.197 1.808 c
+99.197 1.646 l
+99.211 1.646 l
+99.271 1.764 99.336 1.86 99.417 1.941 c
+99.494 2.018 99.579 2.08 99.668 2.132 c
+99.755 2.19 99.843 2.227 99.932 2.249 c
+100.027 2.267 100.127 2.278 100.225 2.278 c
+100.431 2.278 100.611 2.234 100.769 2.146 c
+100.924 2.058 101.052 1.929 101.152 1.764 c
+101.258 1.606 101.335 1.415 101.387 1.191 c
+101.446 0.974 101.475 0.738 101.475 0.485 c
+101.475 0.221 101.446 -0.025 101.387 -0.249 c
+101.335 -0.467 101.258 -0.658 101.152 -0.823 c
+101.052 -0.981 100.921 -1.103 100.755 -1.19 c
+100.597 -1.278 100.41 -1.323 100.196 -1.323 c
+100.097 -1.323 99.998 -1.311 99.903 -1.294 c
+99.803 -1.271 99.711 -1.242 99.623 -1.19 c
+99.542 -1.143 99.465 -1.08 99.388 -0.999 c
+99.319 -0.922 99.259 -0.831 99.211 -0.72 c
+99.197 -0.72 l
+99.197 -0.808 l
+99.204 -0.849 99.211 -0.897 99.211 -0.955 c
+99.211 -1.117 l
+99.211 -1.294 l
+99.211 -2.631 l
+98.3 -2.631 l
+98.3 1.455 l
+98.3 1.621 98.293 1.768 98.286 1.897 c
+98.286 2.22 l
+h
+99.197 0.456 m
+99.197 0.228 99.215 0.037 99.256 -0.118 c
+99.303 -0.264 99.358 -0.382 99.417 -0.47 c
+99.483 -0.559 99.557 -0.625 99.637 -0.661 c
+99.715 -0.702 99.792 -0.72 99.873 -0.72 c
+99.969 -0.72 100.057 -0.698 100.138 -0.646 c
+100.225 -0.599 100.292 -0.529 100.343 -0.441 c
+100.402 -0.345 100.446 -0.22 100.476 -0.073 c
+100.512 0.081 100.534 0.268 100.534 0.485 c
+100.534 0.875 100.476 1.168 100.358 1.367 c
+100.248 1.562 100.094 1.661 99.888 1.661 c
+99.807 1.661 99.73 1.639 99.653 1.602 c
+99.572 1.562 99.498 1.5 99.432 1.411 c
+99.362 1.323 99.303 1.198 99.256 1.044 c
+99.215 0.886 99.197 0.691 99.197 0.456 c
+103.242 1.515 m
+103.36 1.786 103.511 1.985 103.699 2.103 c
+103.882 2.22 104.102 2.278 104.36 2.278 c
+104.566 2.278 104.734 2.242 104.875 2.176 c
+105.021 2.105 105.131 2.014 105.212 1.897 c
+105.301 1.779 105.359 1.635 105.389 1.47 c
+105.426 1.301 105.447 1.124 105.447 0.941 c
+105.447 -1.264 l
+104.536 -1.264 l
+104.536 0.735 l
+104.536 0.871 104.526 0.992 104.507 1.103 c
+104.495 1.209 104.47 1.297 104.433 1.367 c
+104.393 1.444 104.335 1.503 104.257 1.544 c
+104.187 1.58 104.096 1.602 103.978 1.602 c
+103.867 1.602 103.772 1.577 103.684 1.529 c
+103.595 1.477 103.514 1.411 103.448 1.323 c
+103.39 1.235 103.338 1.124 103.302 1 c
+103.272 0.882 103.257 0.75 103.257 0.603 c
+103.257 -1.264 l
+102.346 -1.264 l
+102.346 3.514 l
+103.257 3.514 l
+103.257 2.205 l
+103.257 2.135 103.25 2.065 103.242 1.999 c
+103.242 1.793 l
+103.242 1.735 103.236 1.679 103.228 1.632 c
+103.228 1.515 l
+h
+111.055 0.838 1.866 -0.794 re
+111.055 0.044 m
+115.119 0.838 1.867 -0.794 re
+115.119 0.044 m
+120.767 -1.264 m
+120.757 -1.246 120.746 -1.216 120.738 -1.176 c
+120.738 -1.128 120.731 -1.08 120.723 -1.029 c
+120.723 -0.97 120.717 -0.912 120.709 -0.852 c
+120.709 -0.69 l
+120.591 -0.926 120.448 -1.095 120.283 -1.19 c
+120.114 -1.278 119.915 -1.323 119.68 -1.323 c
+119.481 -1.323 119.306 -1.278 119.151 -1.19 c
+118.993 -1.103 118.861 -0.981 118.754 -0.823 c
+118.655 -0.658 118.577 -0.467 118.519 -0.249 c
+118.467 -0.037 118.446 0.206 118.446 0.47 c
+118.446 0.735 118.467 0.974 118.519 1.191 c
+118.577 1.415 118.655 1.606 118.754 1.764 c
+118.861 1.918 118.993 2.043 119.151 2.132 c
+119.316 2.227 119.507 2.278 119.724 2.278 c
+119.819 2.278 119.915 2.263 120.004 2.234 c
+120.099 2.213 120.195 2.18 120.283 2.132 c
+120.37 2.08 120.448 2.018 120.518 1.941 c
+120.595 1.86 120.657 1.768 120.709 1.661 c
+120.709 1.75 l
+120.709 1.897 l
+120.709 2.058 l
+120.709 2.234 l
+120.709 3.514 l
+121.606 3.514 l
+121.606 -0.5 l
+121.606 -0.676 121.609 -0.834 121.621 -0.97 c
+121.627 -1.099 121.635 -1.198 121.635 -1.264 c
+h
+120.723 0.485 m
+120.723 0.721 120.698 0.912 120.65 1.058 c
+120.609 1.213 120.555 1.338 120.488 1.426 c
+120.43 1.515 120.36 1.573 120.283 1.602 c
+120.202 1.639 120.125 1.661 120.048 1.661 c
+119.948 1.661 119.857 1.635 119.768 1.588 c
+119.687 1.548 119.622 1.477 119.562 1.382 c
+119.511 1.282 119.466 1.162 119.43 1.014 c
+119.401 0.867 119.386 0.684 119.386 0.47 c
+119.386 0.077 119.437 -0.216 119.547 -0.411 c
+119.665 -0.61 119.827 -0.706 120.033 -0.706 c
+120.11 -0.706 120.187 -0.687 120.268 -0.646 c
+120.345 -0.61 120.418 -0.544 120.488 -0.455 c
+120.555 -0.367 120.609 -0.246 120.65 -0.088 c
+120.698 0.066 120.723 0.258 120.723 0.485 c
+124.211 -1.323 m
+123.954 -1.323 123.726 -1.286 123.52 -1.22 c
+123.314 -1.143 123.138 -1.029 122.991 -0.881 c
+122.844 -0.727 122.726 -0.536 122.639 -0.309 c
+122.558 -0.085 122.521 0.181 122.521 0.485 c
+122.521 0.816 122.564 1.095 122.653 1.323 c
+122.749 1.558 122.877 1.742 123.035 1.882 c
+123.2 2.018 123.387 2.117 123.593 2.176 c
+123.799 2.242 124.009 2.278 124.226 2.278 c
+124.497 2.278 124.733 2.227 124.931 2.132 c
+125.137 2.043 125.303 1.911 125.431 1.735 c
+125.567 1.565 125.666 1.359 125.725 1.118 c
+125.791 0.882 125.828 0.617 125.828 0.324 c
+125.828 0.309 l
+123.462 0.309 l
+123.462 0.162 123.476 0.023 123.505 -0.103 c
+123.543 -0.231 123.597 -0.345 123.667 -0.441 c
+123.734 -0.529 123.817 -0.599 123.917 -0.646 c
+124.013 -0.698 124.127 -0.72 124.255 -0.72 c
+124.409 -0.72 124.549 -0.687 124.667 -0.617 c
+124.792 -0.551 124.879 -0.448 124.931 -0.309 c
+125.769 -0.382 l
+125.739 -0.482 125.685 -0.588 125.608 -0.706 c
+125.527 -0.816 125.424 -0.918 125.299 -1.014 c
+125.181 -1.103 125.027 -1.176 124.843 -1.234 c
+124.667 -1.294 124.453 -1.323 124.211 -1.323 c
+124.211 1.706 m
+124.123 1.706 124.035 1.691 123.946 1.661 c
+123.858 1.632 123.778 1.58 123.711 1.515 c
+123.641 1.444 123.582 1.357 123.535 1.249 c
+123.495 1.139 123.476 1.014 123.476 0.867 c
+124.946 0.867 l
+124.946 1.004 124.92 1.124 124.873 1.235 c
+124.832 1.341 124.777 1.43 124.711 1.5 c
+124.652 1.565 124.578 1.617 124.49 1.646 c
+124.402 1.683 124.306 1.706 124.211 1.706 c
+128.272 -1.323 m
+127.985 -1.323 127.742 -1.282 127.537 -1.205 c
+127.331 -1.117 127.158 -0.995 127.022 -0.837 c
+126.882 -0.683 126.78 -0.496 126.714 -0.279 c
+126.643 -0.055 126.61 0.191 126.61 0.456 c
+126.61 0.75 126.643 1.007 126.714 1.235 c
+126.791 1.459 126.897 1.646 127.036 1.793 c
+127.184 1.947 127.36 2.065 127.566 2.146 c
+127.772 2.234 128.007 2.278 128.272 2.278 c
+128.496 2.278 128.698 2.249 128.874 2.19 c
+129.051 2.132 129.201 2.047 129.33 1.941 c
+129.455 1.841 129.558 1.72 129.639 1.573 c
+129.716 1.434 129.771 1.282 129.8 1.118 c
+128.889 1.073 l
+128.86 1.249 128.79 1.389 128.683 1.5 c
+128.584 1.606 128.441 1.661 128.257 1.661 c
+128.011 1.661 127.834 1.558 127.728 1.353 c
+127.618 1.154 127.566 0.867 127.566 0.485 c
+127.566 -0.309 127.801 -0.706 128.272 -0.706 c
+128.437 -0.706 128.58 -0.654 128.698 -0.544 c
+128.815 -0.437 128.889 -0.276 128.918 -0.058 c
+129.83 -0.103 l
+129.8 -0.272 129.745 -0.426 129.668 -0.573 c
+129.598 -0.72 129.496 -0.852 129.359 -0.97 c
+129.23 -1.08 129.072 -1.168 128.889 -1.234 c
+128.713 -1.294 128.507 -1.323 128.272 -1.323 c
+133.978 0.485 m
+133.978 0.21 133.942 -0.04 133.876 -0.264 c
+133.806 -0.482 133.703 -0.669 133.567 -0.823 c
+133.427 -0.981 133.251 -1.103 133.037 -1.19 c
+132.821 -1.278 132.567 -1.323 132.274 -1.323 c
+131.998 -1.323 131.751 -1.278 131.539 -1.19 c
+131.333 -1.103 131.16 -0.981 131.024 -0.823 c
+130.884 -0.669 130.782 -0.482 130.715 -0.264 c
+130.645 -0.04 130.612 0.21 130.612 0.485 c
+130.612 0.738 130.641 0.974 130.701 1.191 c
+130.767 1.415 130.87 1.606 131.009 1.764 c
+131.146 1.929 131.322 2.058 131.539 2.146 c
+131.751 2.234 132.009 2.278 132.303 2.278 c
+132.615 2.278 132.876 2.234 133.082 2.146 c
+133.295 2.058 133.467 1.929 133.596 1.764 c
+133.733 1.606 133.831 1.415 133.891 1.191 c
+133.949 0.974 133.978 0.738 133.978 0.485 c
+133.023 0.485 m
+133.023 0.691 133.008 0.867 132.979 1.014 c
+132.957 1.162 132.92 1.282 132.862 1.382 c
+132.802 1.477 132.729 1.548 132.64 1.588 c
+132.553 1.635 132.442 1.661 132.318 1.661 c
+132.053 1.661 131.862 1.562 131.744 1.367 c
+131.626 1.18 131.568 0.886 131.568 0.485 c
+131.568 0.063 131.626 -0.243 131.744 -0.426 c
+131.862 -0.613 132.038 -0.706 132.274 -0.706 c
+132.399 -0.706 132.513 -0.687 132.611 -0.646 c
+132.707 -0.599 132.788 -0.525 132.847 -0.426 c
+132.912 -0.33 132.957 -0.206 132.979 -0.058 c
+133.008 0.088 133.023 0.268 133.023 0.485 c
+137.851 1.47 m
+137.752 1.477 137.65 1.488 137.543 1.5 c
+137.433 1.517 137.311 1.529 137.176 1.529 c
+136.999 1.529 136.841 1.488 136.705 1.411 c
+136.565 1.341 136.448 1.242 136.353 1.118 c
+136.264 0.989 136.195 0.842 136.147 0.676 c
+136.106 0.507 136.087 0.331 136.087 0.147 c
+136.087 -1.264 l
+135.191 -1.264 l
+135.191 0.985 l
+135.191 1.11 135.18 1.235 135.162 1.353 c
+135.15 1.477 135.136 1.595 135.117 1.706 c
+135.106 1.823 135.092 1.918 135.073 1.999 c
+135.052 2.087 135.033 2.161 135.015 2.22 c
+135.896 2.22 l
+135.904 2.168 135.915 2.117 135.926 2.058 c
+135.944 1.999 135.959 1.933 135.97 1.867 c
+135.989 1.808 136.004 1.742 136.014 1.675 c
+136.021 1.606 136.033 1.544 136.044 1.484 c
+136.058 1.484 l
+136.095 1.602 136.147 1.709 136.205 1.808 c
+136.272 1.904 136.353 1.988 136.44 2.058 c
+136.529 2.124 136.632 2.18 136.75 2.22 c
+136.874 2.257 137.022 2.278 137.19 2.278 c
+137.315 2.278 137.433 2.271 137.543 2.263 c
+137.66 2.253 137.764 2.238 137.851 2.22 c
+h
+139.854 -1.323 m
+139.686 -1.323 139.535 -1.301 139.399 -1.264 c
+139.27 -1.216 139.156 -1.147 139.061 -1.058 c
+138.973 -0.97 138.903 -0.864 138.855 -0.735 c
+138.803 -0.599 138.782 -0.448 138.782 -0.279 c
+138.782 -0.073 138.815 0.096 138.884 0.235 c
+138.95 0.382 139.046 0.493 139.164 0.574 c
+139.289 0.661 139.432 0.724 139.59 0.765 c
+139.755 0.802 139.931 0.827 140.119 0.838 c
+140.839 0.852 l
+140.839 1.029 l
+140.839 1.147 140.828 1.249 140.81 1.338 c
+140.788 1.426 140.754 1.492 140.707 1.544 c
+140.667 1.602 140.619 1.639 140.56 1.661 c
+140.501 1.679 140.435 1.691 140.369 1.691 c
+140.299 1.691 140.237 1.679 140.178 1.661 c
+140.126 1.65 140.079 1.625 140.031 1.588 c
+139.99 1.558 139.958 1.507 139.927 1.44 c
+139.906 1.382 139.891 1.301 139.884 1.205 c
+138.943 1.249 l
+138.973 1.397 139.017 1.532 139.075 1.661 c
+139.142 1.786 139.237 1.897 139.355 1.985 c
+139.472 2.08 139.612 2.153 139.781 2.205 c
+139.958 2.253 140.163 2.278 140.398 2.278 c
+140.839 2.278 141.17 2.168 141.398 1.955 c
+141.633 1.75 141.751 1.44 141.751 1.029 c
+141.751 -0.235 l
+141.751 -0.455 l
+141.758 -0.515 141.772 -0.569 141.795 -0.617 c
+141.813 -0.658 141.843 -0.69 141.883 -0.72 c
+141.92 -0.742 141.971 -0.75 142.03 -0.75 c
+142.096 -0.75 142.165 -0.746 142.236 -0.735 c
+142.236 -1.22 l
+142.177 -1.23 142.122 -1.242 142.074 -1.249 c
+142.034 -1.261 141.993 -1.267 141.957 -1.278 c
+141.916 -1.286 141.872 -1.294 141.824 -1.294 c
+141.772 -1.301 141.714 -1.308 141.648 -1.308 c
+141.419 -1.308 141.255 -1.257 141.148 -1.147 c
+141.038 -1.029 140.975 -0.864 140.957 -0.646 c
+140.943 -0.646 l
+140.872 -0.757 140.802 -0.852 140.736 -0.941 c
+140.667 -1.022 140.59 -1.087 140.501 -1.147 c
+140.413 -1.205 140.314 -1.249 140.207 -1.278 c
+140.108 -1.308 139.99 -1.323 139.854 -1.323 c
+140.839 0.353 m
+140.413 0.339 l
+140.314 0.339 140.222 0.331 140.133 0.324 c
+140.053 0.312 139.987 0.287 139.927 0.25 c
+139.869 0.21 139.817 0.151 139.781 0.073 c
+139.74 0.004 139.722 -0.088 139.722 -0.206 c
+139.722 -0.374 139.755 -0.496 139.825 -0.573 c
+139.891 -0.654 139.99 -0.69 140.119 -0.69 c
+140.226 -0.69 140.324 -0.669 140.413 -0.617 c
+140.509 -0.569 140.59 -0.507 140.648 -0.426 c
+140.714 -0.349 140.766 -0.261 140.795 -0.162 c
+140.825 -0.055 140.839 0.059 140.839 0.177 c
+h
+143.562 1.602 m
+143.019 1.602 l
+143.019 2.22 l
+143.607 2.22 l
+143.885 3.117 l
+144.459 3.117 l
+144.459 2.22 l
+145.693 2.22 l
+145.693 1.602 l
+144.459 1.602 l
+144.459 -0.103 l
+144.459 -0.324 l
+144.467 -0.393 144.488 -0.455 144.517 -0.515 c
+144.554 -0.565 144.61 -0.61 144.679 -0.646 c
+144.756 -0.676 144.87 -0.69 145.018 -0.69 c
+145.153 -0.69 145.29 -0.687 145.429 -0.676 c
+145.565 -0.658 145.697 -0.632 145.826 -0.602 c
+145.826 -1.205 l
+145.745 -1.216 145.668 -1.23 145.591 -1.249 c
+145.51 -1.261 145.433 -1.267 145.356 -1.278 c
+145.275 -1.286 145.186 -1.294 145.091 -1.294 c
+145.003 -1.301 144.904 -1.308 144.797 -1.308 c
+144.61 -1.308 144.448 -1.294 144.312 -1.264 c
+144.183 -1.228 144.07 -1.183 143.974 -1.132 c
+143.885 -1.084 143.812 -1.025 143.753 -0.955 c
+143.694 -0.878 143.65 -0.801 143.621 -0.72 c
+143.592 -0.632 143.57 -0.544 143.562 -0.455 c
+143.551 -0.36 143.547 -0.264 143.547 -0.176 c
+h
+148.578 -1.323 m
+148.321 -1.323 148.093 -1.286 147.887 -1.22 c
+147.682 -1.143 147.505 -1.029 147.358 -0.881 c
+147.212 -0.727 147.094 -0.536 147.006 -0.309 c
+146.925 -0.085 146.888 0.181 146.888 0.485 c
+146.888 0.816 146.932 1.095 147.021 1.323 c
+147.116 1.558 147.245 1.742 147.403 1.882 c
+147.568 2.018 147.755 2.117 147.961 2.176 c
+148.166 2.242 148.376 2.278 148.593 2.278 c
+148.864 2.278 149.1 2.227 149.298 2.132 c
+149.504 2.043 149.67 1.911 149.799 1.735 c
+149.934 1.565 150.034 1.359 150.092 1.118 c
+150.158 0.882 150.196 0.617 150.196 0.324 c
+150.196 0.309 l
+147.829 0.309 l
+147.829 0.162 147.844 0.023 147.873 -0.103 c
+147.91 -0.231 147.964 -0.345 148.035 -0.441 c
+148.101 -0.529 148.185 -0.599 148.284 -0.646 c
+148.38 -0.698 148.494 -0.72 148.623 -0.72 c
+148.777 -0.72 148.916 -0.687 149.034 -0.617 c
+149.159 -0.551 149.247 -0.448 149.298 -0.309 c
+150.136 -0.382 l
+150.107 -0.482 150.052 -0.588 149.975 -0.706 c
+149.894 -0.816 149.791 -0.918 149.666 -1.014 c
+149.548 -1.103 149.394 -1.176 149.211 -1.234 c
+149.034 -1.294 148.821 -1.323 148.578 -1.323 c
+148.578 1.706 m
+148.49 1.706 148.402 1.691 148.314 1.661 c
+148.226 1.632 148.145 1.58 148.079 1.515 c
+148.008 1.444 147.95 1.357 147.902 1.249 c
+147.862 1.139 147.844 1.014 147.844 0.867 c
+149.313 0.867 l
+149.313 1.004 149.288 1.124 149.24 1.235 c
+149.199 1.341 149.144 1.43 149.078 1.5 c
+149.02 1.565 148.945 1.617 148.858 1.646 c
+148.769 1.683 148.673 1.706 148.578 1.706 c
+f
+Q
+q 1 0 0 1 51.1272 419.6667 cm
+0 0 m
+-1.808 0 l
+-2.219 -1.397 l
+-2.91 -1.397 l
+-1.19 3.954 l
+-0.617 3.954 l
+1.118 -1.397 l
+0.426 -1.397 l
+h
+-1.631 0.588 m
+-0.176 0.588 l
+-0.897 3.013 l
+h
+2.367 2.587 m
+2.381 2.146 l
+2.635 2.487 2.959 2.66 3.352 2.66 c
+4.057 2.66 4.414 2.19 4.424 1.249 c
+4.424 -1.397 l
+3.778 -1.397 l
+3.778 1.22 l
+3.778 1.532 3.723 1.753 3.616 1.882 c
+3.506 2.006 3.352 2.072 3.146 2.072 c
+2.988 2.072 2.841 2.017 2.705 1.911 c
+2.577 1.801 2.473 1.664 2.396 1.499 c
+2.396 -1.397 l
+1.75 -1.397 l
+1.75 2.587 l
+h
+6.982 0.779 m
+6.982 1.356 7.119 1.811 7.394 2.146 c
+7.676 2.487 8.048 2.66 8.511 2.66 c
+8.97 2.66 9.338 2.491 9.613 2.161 c
+9.897 1.837 10.043 1.389 10.055 0.823 c
+10.055 0.397 l
+10.055 -0.173 9.911 -0.628 9.628 -0.971 c
+9.353 -1.305 8.985 -1.47 8.526 -1.47 c
+8.063 -1.47 7.691 -1.309 7.408 -0.985 c
+7.133 -0.655 6.99 -0.214 6.982 0.338 c
+h
+7.629 0.397 m
+7.629 -0.008 7.707 -0.324 7.865 -0.559 c
+8.029 -0.794 8.25 -0.912 8.526 -0.912 c
+9.091 -0.912 9.386 -0.5 9.407 0.323 c
+9.407 0.779 l
+9.407 1.18 9.323 1.499 9.158 1.734 c
+9 1.976 8.783 2.102 8.511 2.102 c
+8.247 2.102 8.029 1.976 7.865 1.734 c
+7.707 1.499 7.629 1.18 7.629 0.779 c
+h
+11.965 -0.412 m
+12.715 2.587 l
+13.376 2.587 l
+12.2 -1.397 l
+11.715 -1.397 l
+10.525 2.587 l
+11.186 2.587 l
+h
+15.435 -1.47 m
+14.934 -1.47 14.552 -1.324 14.288 -1.029 c
+14.024 -0.736 13.891 -0.302 13.891 0.279 c
+13.891 0.75 l
+13.891 1.344 14.016 1.811 14.273 2.146 c
+14.537 2.487 14.898 2.66 15.36 2.66 c
+15.82 2.66 16.162 2.506 16.39 2.204 c
+16.625 1.911 16.746 1.448 16.757 0.823 c
+16.757 0.397 l
+14.537 0.397 l
+14.537 0.309 l
+14.537 -0.125 14.614 -0.437 14.772 -0.632 c
+14.938 -0.819 15.169 -0.912 15.464 -0.912 c
+15.659 -0.912 15.831 -0.879 15.978 -0.809 c
+16.125 -0.732 16.261 -0.614 16.39 -0.456 c
+16.727 -0.867 l
+16.441 -1.272 16.011 -1.47 15.435 -1.47 c
+15.36 2.102 m
+15.085 2.102 14.883 2.006 14.758 1.822 c
+14.629 1.635 14.556 1.344 14.537 0.955 c
+16.11 0.955 l
+16.11 1.043 l
+16.089 1.425 16.022 1.693 15.905 1.851 c
+15.787 2.017 15.603 2.102 15.36 2.102 c
+19.183 1.969 m
+19.094 1.988 18.995 1.999 18.888 1.999 c
+18.554 1.999 18.319 1.815 18.183 1.455 c
+18.183 -1.397 l
+17.536 -1.397 l
+17.536 2.587 l
+18.169 2.587 l
+18.183 2.175 l
+18.359 2.499 18.602 2.66 18.918 2.66 c
+19.025 2.66 19.113 2.638 19.183 2.601 c
+h
+21.035 -0.412 m
+21.785 2.587 l
+22.446 2.587 l
+21.27 -1.397 l
+20.785 -1.397 l
+19.594 2.587 l
+20.255 2.587 l
+h
+23.827 -1.397 -0.646 3.984 re
+23.871 3.63 m
+23.871 3.52 23.842 3.428 23.783 3.351 c
+23.725 3.281 23.629 3.248 23.504 3.248 c
+23.387 3.248 23.291 3.281 23.225 3.351 c
+23.166 3.428 23.137 3.52 23.137 3.63 c
+23.137 3.748 23.166 3.84 23.225 3.91 c
+23.291 3.987 23.387 4.027 23.504 4.027 c
+23.629 4.027 23.725 3.987 23.783 3.91 c
+23.842 3.829 23.871 3.737 23.871 3.63 c
+26.267 -1.47 m
+25.768 -1.47 25.386 -1.324 25.121 -1.029 c
+24.856 -0.736 24.724 -0.302 24.724 0.279 c
+24.724 0.75 l
+24.724 1.344 24.849 1.811 25.106 2.146 c
+25.371 2.487 25.731 2.66 26.194 2.66 c
+26.653 2.66 26.995 2.506 27.223 2.204 c
+27.458 1.911 27.58 1.448 27.59 0.823 c
+27.59 0.397 l
+25.371 0.397 l
+25.371 0.309 l
+25.371 -0.125 25.448 -0.437 25.606 -0.632 c
+25.772 -0.819 26.003 -0.912 26.296 -0.912 c
+26.491 -0.912 26.664 -0.879 26.811 -0.809 c
+26.959 -0.732 27.094 -0.614 27.223 -0.456 c
+27.561 -0.867 l
+27.274 -1.272 26.844 -1.47 26.267 -1.47 c
+26.194 2.102 m
+25.918 2.102 25.716 2.006 25.591 1.822 c
+25.463 1.635 25.39 1.344 25.371 0.955 c
+26.944 0.955 l
+26.944 1.043 l
+26.921 1.425 26.855 1.693 26.738 1.851 c
+26.62 2.017 26.437 2.102 26.194 2.102 c
+31.339 -0.25 m
+31.941 2.587 l
+32.588 2.587 l
+31.603 -1.397 l
+31.089 -1.397 l
+30.31 1.455 l
+29.56 -1.397 l
+29.031 -1.397 l
+28.075 2.587 l
+28.708 2.587 l
+29.325 -0.177 l
+30.059 2.587 l
+30.574 2.587 l
+h
+37.953 -0.25 m
+38.556 2.587 l
+39.202 2.587 l
+38.218 -1.397 l
+37.703 -1.397 l
+36.924 1.455 l
+36.174 -1.397 l
+35.646 -1.397 l
+34.69 2.587 l
+35.322 2.587 l
+35.939 -0.177 l
+36.675 2.587 l
+37.188 2.587 l
+h
+40.584 -1.397 -0.647 3.984 re
+40.629 3.63 m
+40.629 3.52 40.6 3.428 40.54 3.351 c
+40.481 3.281 40.386 3.248 40.261 3.248 c
+40.143 3.248 40.048 3.281 39.981 3.351 c
+39.923 3.428 39.894 3.52 39.894 3.63 c
+39.894 3.748 39.923 3.84 39.981 3.91 c
+40.048 3.987 40.143 4.027 40.261 4.027 c
+40.386 4.027 40.481 3.987 40.54 3.91 c
+40.6 3.829 40.629 3.737 40.629 3.63 c
+42.451 3.542 m
+42.451 2.587 l
+43.054 2.587 l
+43.054 2.057 l
+42.451 2.057 l
+42.451 -0.412 l
+42.451 -0.57 42.473 -0.688 42.524 -0.765 c
+42.584 -0.846 42.672 -0.882 42.79 -0.882 c
+42.877 -0.882 42.965 -0.867 43.054 -0.838 c
+43.054 -1.397 l
+42.907 -1.444 42.753 -1.47 42.598 -1.47 c
+42.341 -1.47 42.146 -1.378 42.011 -1.191 c
+41.87 -1.008 41.805 -0.746 41.805 -0.412 c
+41.805 2.057 l
+41.202 2.057 l
+41.202 2.587 l
+41.805 2.587 l
+41.805 3.542 l
+h
+44.465 2.175 m
+44.718 2.499 45.038 2.66 45.42 2.66 c
+46.125 2.66 46.482 2.19 46.493 1.249 c
+46.493 -1.397 l
+45.847 -1.397 l
+45.847 1.22 l
+45.847 1.532 45.791 1.753 45.685 1.882 c
+45.575 2.006 45.42 2.072 45.215 2.072 c
+45.057 2.072 44.91 2.017 44.774 1.911 c
+44.645 1.801 44.542 1.664 44.465 1.499 c
+44.465 -1.397 l
+43.818 -1.397 l
+43.818 4.247 l
+44.465 4.247 l
+h
+50.815 1.969 m
+50.727 1.988 50.628 1.999 50.521 1.999 c
+50.187 1.999 49.951 1.815 49.815 1.455 c
+49.815 -1.397 l
+49.169 -1.397 l
+49.169 2.587 l
+49.801 2.587 l
+49.815 2.175 l
+49.992 2.499 50.235 2.66 50.551 2.66 c
+50.657 2.66 50.745 2.638 50.815 2.601 c
+h
+52.814 -1.47 m
+52.315 -1.47 51.932 -1.324 51.667 -1.029 c
+51.403 -0.736 51.27 -0.302 51.27 0.279 c
+51.27 0.75 l
+51.27 1.344 51.395 1.811 51.653 2.146 c
+51.918 2.487 52.278 2.66 52.741 2.66 c
+53.2 2.66 53.541 2.506 53.77 2.204 c
+54.005 1.911 54.125 1.448 54.137 0.823 c
+54.137 0.397 l
+51.918 0.397 l
+51.918 0.309 l
+51.918 -0.125 51.995 -0.437 52.153 -0.632 c
+52.318 -0.819 52.55 -0.912 52.843 -0.912 c
+53.038 -0.912 53.211 -0.879 53.358 -0.809 c
+53.505 -0.732 53.641 -0.614 53.77 -0.456 c
+54.108 -0.867 l
+53.821 -1.272 53.391 -1.47 52.814 -1.47 c
+52.741 2.102 m
+52.465 2.102 52.263 2.006 52.138 1.822 c
+52.009 1.635 51.935 1.344 51.918 0.955 c
+53.49 0.955 l
+53.49 1.043 l
+53.468 1.425 53.402 1.693 53.284 1.851 c
+53.167 2.017 52.983 2.102 52.741 2.102 c
+55.21 -1.397 m
+55.21 2.057 l
+54.68 2.057 l
+54.68 2.587 l
+55.21 2.587 l
+55.21 3.042 l
+55.21 3.443 55.305 3.755 55.504 3.983 c
+55.71 4.207 55.989 4.321 56.342 4.321 c
+56.477 4.321 56.61 4.299 56.739 4.263 c
+56.709 3.719 l
+56.61 3.737 56.511 3.748 56.415 3.748 c
+56.041 3.748 55.856 3.484 55.856 2.954 c
+55.856 2.587 l
+56.533 2.587 l
+56.533 2.057 l
+55.856 2.057 l
+55.856 -1.397 l
+h
+58.634 -1.47 m
+58.135 -1.47 57.753 -1.324 57.489 -1.029 c
+57.223 -0.736 57.092 -0.302 57.092 0.279 c
+57.092 0.75 l
+57.092 1.344 57.217 1.811 57.474 2.146 c
+57.738 2.487 58.098 2.66 58.561 2.66 c
+59.021 2.66 59.363 2.506 59.59 2.204 c
+59.825 1.911 59.947 1.448 59.958 0.823 c
+59.958 0.397 l
+57.738 0.397 l
+57.738 0.309 l
+57.738 -0.125 57.815 -0.437 57.973 -0.632 c
+58.139 -0.819 58.37 -0.912 58.665 -0.912 c
+58.859 -0.912 59.031 -0.879 59.179 -0.809 c
+59.326 -0.732 59.461 -0.614 59.59 -0.456 c
+59.928 -0.867 l
+59.642 -1.272 59.212 -1.47 58.634 -1.47 c
+58.561 2.102 m
+58.285 2.102 58.083 2.006 57.959 1.822 c
+57.83 1.635 57.757 1.344 57.738 0.955 c
+59.311 0.955 l
+59.311 1.043 l
+59.289 1.425 59.222 1.693 59.105 1.851 c
+58.987 2.017 58.804 2.102 58.561 2.102 c
+62.383 1.969 m
+62.295 1.988 62.196 1.999 62.089 1.999 c
+61.755 1.999 61.52 1.815 61.383 1.455 c
+61.383 -1.397 l
+60.737 -1.397 l
+60.737 2.587 l
+61.369 2.587 l
+61.383 2.175 l
+61.56 2.499 61.803 2.66 62.118 2.66 c
+62.225 2.66 62.314 2.638 62.383 2.601 c
+h
+64.382 -1.47 m
+63.883 -1.47 63.5 -1.324 63.236 -1.029 c
+62.971 -0.736 62.839 -0.302 62.839 0.279 c
+62.839 0.75 l
+62.839 1.344 62.964 1.811 63.221 2.146 c
+63.486 2.487 63.845 2.66 64.309 2.66 c
+64.768 2.66 65.11 2.506 65.337 2.204 c
+65.572 1.911 65.694 1.448 65.705 0.823 c
+65.705 0.397 l
+63.486 0.397 l
+63.486 0.309 l
+63.486 -0.125 63.563 -0.437 63.721 -0.632 c
+63.886 -0.819 64.118 -0.912 64.411 -0.912 c
+64.606 -0.912 64.779 -0.879 64.926 -0.809 c
+65.073 -0.732 65.209 -0.614 65.337 -0.456 c
+65.676 -0.867 l
+65.389 -1.272 64.959 -1.47 64.382 -1.47 c
+64.309 2.102 m
+64.033 2.102 63.831 2.006 63.706 1.822 c
+63.577 1.635 63.504 1.344 63.486 0.955 c
+65.059 0.955 l
+65.059 1.043 l
+65.036 1.425 64.97 1.693 64.853 1.851 c
+64.735 2.017 64.551 2.102 64.309 2.102 c
+67.101 2.587 m
+67.116 2.146 l
+67.37 2.487 67.693 2.66 68.086 2.66 c
+68.792 2.66 69.148 2.19 69.159 1.249 c
+69.159 -1.397 l
+68.512 -1.397 l
+68.512 1.22 l
+68.512 1.532 68.458 1.753 68.351 1.882 c
+68.24 2.006 68.086 2.072 67.881 2.072 c
+67.723 2.072 67.575 2.017 67.44 1.911 c
+67.311 1.801 67.208 1.664 67.131 1.499 c
+67.131 -1.397 l
+66.484 -1.397 l
+66.484 2.587 l
+h
+71.511 -0.912 m
+71.724 -0.912 71.897 -0.849 72.026 -0.721 c
+72.161 -0.584 72.235 -0.393 72.246 -0.148 c
+72.863 -0.148 l
+72.841 -0.53 72.705 -0.849 72.452 -1.103 c
+72.194 -1.349 71.882 -1.47 71.511 -1.47 c
+71.018 -1.47 70.644 -1.32 70.38 -1.014 c
+70.122 -0.702 69.998 -0.235 69.998 0.382 c
+69.998 0.823 l
+69.998 1.418 70.122 1.874 70.38 2.19 c
+70.644 2.502 71.018 2.66 71.511 2.66 c
+71.912 2.66 72.231 2.528 72.466 2.263 c
+72.709 2.006 72.841 1.66 72.863 1.22 c
+72.246 1.22 l
+72.224 1.514 72.151 1.734 72.026 1.882 c
+71.908 2.028 71.735 2.102 71.511 2.102 c
+71.217 2.102 71 2.003 70.864 1.808 c
+70.725 1.62 70.651 1.311 70.644 0.882 c
+70.644 0.367 l
+70.644 -0.103 70.71 -0.437 70.85 -0.632 c
+70.997 -0.819 71.217 -0.912 71.511 -0.912 c
+75.039 -1.47 m
+74.539 -1.47 74.157 -1.324 73.892 -1.029 c
+73.628 -0.736 73.495 -0.302 73.495 0.279 c
+73.495 0.75 l
+73.495 1.344 73.62 1.811 73.877 2.146 c
+74.143 2.487 74.503 2.66 74.966 2.66 c
+75.425 2.66 75.766 2.506 75.994 2.204 c
+76.229 1.911 76.35 1.448 76.362 0.823 c
+76.362 0.397 l
+74.143 0.397 l
+74.143 0.309 l
+74.143 -0.125 74.22 -0.437 74.378 -0.632 c
+74.543 -0.819 74.775 -0.912 75.068 -0.912 c
+75.263 -0.912 75.436 -0.879 75.583 -0.809 c
+75.73 -0.732 75.866 -0.614 75.994 -0.456 c
+76.333 -0.867 l
+76.046 -1.272 75.616 -1.47 75.039 -1.47 c
+74.966 2.102 m
+74.69 2.102 74.488 2.006 74.363 1.822 c
+74.234 1.635 74.16 1.344 74.143 0.955 c
+75.715 0.955 l
+75.715 1.043 l
+75.693 1.425 75.627 1.693 75.509 1.851 c
+75.392 2.017 75.208 2.102 74.966 2.102 c
+79.081 -0.383 m
+79.081 -0.235 79.026 -0.114 78.92 -0.015 c
+78.809 0.081 78.603 0.199 78.302 0.338 c
+77.956 0.484 77.714 0.606 77.567 0.706 c
+77.42 0.812 77.31 0.929 77.244 1.058 c
+77.174 1.182 77.141 1.341 77.141 1.529 c
+77.141 1.851 77.258 2.12 77.493 2.337 c
+77.729 2.55 78.031 2.66 78.405 2.66 c
+78.787 2.66 79.095 2.547 79.331 2.322 c
+79.566 2.094 79.683 1.808 79.683 1.455 c
+79.037 1.455 l
+79.037 1.631 78.978 1.782 78.86 1.911 c
+78.743 2.036 78.588 2.102 78.405 2.102 c
+78.206 2.102 78.056 2.046 77.95 1.94 c
+77.839 1.841 77.788 1.708 77.788 1.543 c
+77.788 1.415 77.825 1.308 77.905 1.22 c
+77.983 1.139 78.174 1.036 78.478 0.911 c
+78.956 0.723 79.286 0.536 79.463 0.353 c
+79.64 0.176 79.728 -0.052 79.728 -0.324 c
+79.728 -0.676 79.603 -0.956 79.361 -1.162 c
+79.126 -1.367 78.809 -1.47 78.42 -1.47 c
+77.997 -1.47 77.659 -1.353 77.405 -1.118 c
+77.148 -0.875 77.023 -0.57 77.023 -0.206 c
+77.67 -0.206 l
+77.678 -0.434 77.747 -0.611 77.875 -0.736 c
+78 -0.853 78.185 -0.912 78.42 -0.912 c
+78.633 -0.912 78.794 -0.864 78.905 -0.765 c
+79.022 -0.669 79.081 -0.541 79.081 -0.383 c
+82.991 -1.397 -0.647 5.644 re
+86.048 -1.397 m
+86.008 -1.309 85.983 -1.162 85.975 -0.956 c
+85.74 -1.301 85.445 -1.47 85.093 -1.47 c
+84.73 -1.47 84.446 -1.374 84.24 -1.176 c
+84.042 -0.971 83.947 -0.684 83.947 -0.309 c
+83.947 0.091 84.082 0.411 84.358 0.646 c
+84.63 0.889 85.005 1.014 85.476 1.014 c
+85.96 1.014 l
+85.96 1.44 l
+85.96 1.675 85.906 1.841 85.798 1.94 c
+85.688 2.046 85.526 2.102 85.314 2.102 c
+85.115 2.102 84.953 2.043 84.828 1.926 c
+84.711 1.808 84.652 1.66 84.652 1.484 c
+84.005 1.484 l
+84.005 1.679 84.064 1.87 84.182 2.057 c
+84.306 2.241 84.468 2.389 84.667 2.499 c
+84.873 2.605 85.1 2.66 85.358 2.66 c
+85.758 2.66 86.064 2.557 86.269 2.352 c
+86.482 2.146 86.596 1.851 86.607 1.469 c
+86.607 -0.544 l
+86.607 -0.849 86.644 -1.114 86.725 -1.338 c
+86.725 -1.397 l
+h
+85.181 -0.882 m
+85.347 -0.882 85.497 -0.838 85.636 -0.75 c
+85.784 -0.661 85.89 -0.551 85.96 -0.412 c
+85.96 0.529 l
+85.593 0.529 l
+85.277 0.529 85.034 0.459 84.858 0.323 c
+84.682 0.195 84.593 0.007 84.593 -0.235 c
+84.593 -0.464 84.637 -0.628 84.726 -0.736 c
+84.814 -0.834 84.965 -0.882 85.181 -0.882 c
+90.488 0.397 m
+90.488 -0.221 90.374 -0.688 90.149 -1 c
+89.933 -1.316 89.609 -1.47 89.179 -1.47 c
+88.757 -1.47 88.445 -1.29 88.239 -0.927 c
+88.209 -1.397 l
+87.606 -1.397 l
+87.606 4.247 l
+88.254 4.247 l
+88.254 2.146 l
+88.466 2.487 88.775 2.66 89.179 2.66 c
+89.609 2.66 89.933 2.502 90.149 2.19 c
+90.374 1.885 90.488 1.418 90.488 0.793 c
+h
+89.841 0.779 m
+89.841 1.249 89.771 1.579 89.635 1.778 c
+89.507 1.973 89.297 2.072 89.003 2.072 c
+88.668 2.072 88.419 1.888 88.254 1.529 c
+88.254 -0.353 l
+88.419 -0.717 88.672 -0.897 89.017 -0.897 c
+89.312 -0.897 89.521 -0.794 89.65 -0.588 c
+89.775 -0.383 89.841 -0.067 89.841 0.367 c
+h
+92.751 -1.47 m
+92.252 -1.47 91.87 -1.324 91.605 -1.029 c
+91.34 -0.736 91.208 -0.302 91.208 0.279 c
+91.208 0.75 l
+91.208 1.344 91.333 1.811 91.59 2.146 c
+91.855 2.487 92.215 2.66 92.678 2.66 c
+93.137 2.66 93.478 2.506 93.707 2.204 c
+93.942 1.911 94.064 1.448 94.074 0.823 c
+94.074 0.397 l
+91.855 0.397 l
+91.855 0.309 l
+91.855 -0.125 91.932 -0.437 92.09 -0.632 c
+92.256 -0.819 92.487 -0.912 92.78 -0.912 c
+92.975 -0.912 93.148 -0.879 93.295 -0.809 c
+93.442 -0.732 93.578 -0.614 93.707 -0.456 c
+94.045 -0.867 l
+93.758 -1.272 93.328 -1.47 92.751 -1.47 c
+92.678 2.102 m
+92.402 2.102 92.2 2.006 92.075 1.822 c
+91.947 1.635 91.873 1.344 91.855 0.955 c
+93.428 0.955 l
+93.428 1.043 l
+93.405 1.425 93.339 1.693 93.222 1.851 c
+93.104 2.017 92.921 2.102 92.678 2.102 c
+95.558 -1.397 -0.646 5.644 re
+98.513 -0.383 m
+98.513 -0.235 98.458 -0.114 98.351 -0.015 c
+98.241 0.081 98.035 0.199 97.734 0.338 c
+97.389 0.484 97.146 0.606 97 0.706 c
+96.852 0.812 96.742 0.929 96.676 1.058 c
+96.606 1.182 96.573 1.341 96.573 1.529 c
+96.573 1.851 96.69 2.12 96.925 2.337 c
+97.161 2.55 97.462 2.66 97.837 2.66 c
+98.22 2.66 98.528 2.547 98.764 2.322 c
+98.999 2.094 99.116 1.808 99.116 1.455 c
+98.469 1.455 l
+98.469 1.631 98.411 1.782 98.293 1.911 c
+98.176 2.036 98.021 2.102 97.837 2.102 c
+97.638 2.102 97.488 2.046 97.382 1.94 c
+97.272 1.841 97.22 1.708 97.22 1.543 c
+97.22 1.415 97.256 1.308 97.337 1.22 c
+97.415 1.139 97.605 1.036 97.91 0.911 c
+98.388 0.723 98.719 0.536 98.895 0.353 c
+99.072 0.176 99.161 -0.052 99.161 -0.324 c
+99.161 -0.676 99.035 -0.956 98.793 -1.162 c
+98.558 -1.367 98.241 -1.47 97.852 -1.47 c
+97.43 -1.47 97.091 -1.353 96.838 -1.118 c
+96.58 -0.875 96.455 -0.57 96.455 -0.206 c
+97.102 -0.206 l
+97.11 -0.434 97.179 -0.611 97.308 -0.736 c
+97.433 -0.853 97.617 -0.912 97.852 -0.912 c
+98.065 -0.912 98.226 -0.864 98.336 -0.765 c
+98.455 -0.669 98.513 -0.541 98.513 -0.383 c
+103.761 -1.397 m
+103.72 -1.309 103.695 -1.162 103.687 -0.956 c
+103.452 -1.301 103.159 -1.47 102.805 -1.47 c
+102.442 -1.47 102.159 -1.374 101.953 -1.176 c
+101.754 -0.971 101.659 -0.684 101.659 -0.309 c
+101.659 0.091 101.795 0.411 102.07 0.646 c
+102.342 0.889 102.717 1.014 103.188 1.014 c
+103.672 1.014 l
+103.672 1.44 l
+103.672 1.675 103.618 1.841 103.51 1.94 c
+103.4 2.046 103.239 2.102 103.026 2.102 c
+102.828 2.102 102.666 2.043 102.541 1.926 c
+102.423 1.808 102.365 1.66 102.365 1.484 c
+101.717 1.484 l
+101.717 1.679 101.777 1.87 101.894 2.057 c
+102.019 2.241 102.18 2.389 102.379 2.499 c
+102.585 2.605 102.812 2.66 103.07 2.66 c
+103.471 2.66 103.776 2.557 103.981 2.352 c
+104.194 2.146 104.308 1.851 104.32 1.469 c
+104.32 -0.544 l
+104.32 -0.849 104.356 -1.114 104.437 -1.338 c
+104.437 -1.397 l
+h
+102.893 -0.882 m
+103.059 -0.882 103.209 -0.838 103.35 -0.75 c
+103.496 -0.661 103.603 -0.551 103.672 -0.412 c
+103.672 0.529 l
+103.305 0.529 l
+102.989 0.529 102.747 0.459 102.57 0.323 c
+102.394 0.195 102.305 0.007 102.305 -0.235 c
+102.305 -0.464 102.35 -0.628 102.438 -0.736 c
+102.526 -0.834 102.677 -0.882 102.893 -0.882 c
+105.937 2.587 m
+105.951 2.146 l
+106.205 2.487 106.528 2.66 106.922 2.66 c
+107.627 2.66 107.983 2.19 107.994 1.249 c
+107.994 -1.397 l
+107.348 -1.397 l
+107.348 1.22 l
+107.348 1.532 107.292 1.753 107.186 1.882 c
+107.076 2.006 106.922 2.072 106.716 2.072 c
+106.558 2.072 106.411 2.017 106.274 1.911 c
+106.146 1.801 106.043 1.664 105.966 1.499 c
+105.966 -1.397 l
+105.319 -1.397 l
+105.319 2.587 l
+h
+108.832 0.779 m
+108.832 1.385 108.942 1.851 109.17 2.175 c
+109.405 2.499 109.733 2.66 110.155 2.66 c
+110.537 2.66 110.835 2.502 111.051 2.19 c
+111.051 4.247 l
+111.699 4.247 l
+111.699 -1.397 l
+111.111 -1.397 l
+111.067 -0.971 l
+110.861 -1.305 110.556 -1.47 110.155 -1.47 c
+109.744 -1.47 109.42 -1.316 109.185 -1 c
+108.95 -0.676 108.832 -0.221 108.832 0.367 c
+h
+109.479 0.397 m
+109.479 -0.044 109.542 -0.375 109.67 -0.588 c
+109.806 -0.794 110.026 -0.897 110.331 -0.897 c
+110.654 -0.897 110.893 -0.736 111.051 -0.412 c
+111.051 1.602 l
+110.882 1.914 110.644 2.072 110.331 2.072 c
+110.026 2.072 109.806 1.969 109.67 1.764 c
+109.542 1.558 109.479 1.234 109.479 0.793 c
+h
+115.065 2.175 m
+115.318 2.499 115.638 2.66 116.02 2.66 c
+116.725 2.66 117.082 2.19 117.093 1.249 c
+117.093 -1.397 l
+116.446 -1.397 l
+116.446 1.22 l
+116.446 1.532 116.391 1.753 116.285 1.882 c
+116.174 2.006 116.02 2.072 115.814 2.072 c
+115.656 2.072 115.509 2.017 115.373 1.911 c
+115.244 1.801 115.142 1.664 115.065 1.499 c
+115.065 -1.397 l
+114.417 -1.397 l
+114.417 4.247 l
+115.065 4.247 l
+h
+118.754 -1.397 -0.647 3.984 re
+118.798 3.63 m
+118.798 3.52 118.768 3.428 118.71 3.351 c
+118.651 3.281 118.556 3.248 118.431 3.248 c
+118.313 3.248 118.217 3.281 118.151 3.351 c
+118.092 3.428 118.063 3.52 118.063 3.63 c
+118.063 3.748 118.092 3.84 118.151 3.91 c
+118.217 3.987 118.313 4.027 118.431 4.027 c
+118.556 4.027 118.651 3.987 118.71 3.91 c
+118.768 3.829 118.798 3.737 118.798 3.63 c
+121.708 -0.383 m
+121.708 -0.235 121.654 -0.114 121.546 -0.015 c
+121.436 0.081 121.23 0.199 120.929 0.338 c
+120.584 0.484 120.341 0.606 120.195 0.706 c
+120.048 0.812 119.937 0.929 119.871 1.058 c
+119.801 1.182 119.768 1.341 119.768 1.529 c
+119.768 1.851 119.886 2.12 120.121 2.337 c
+120.356 2.55 120.657 2.66 121.033 2.66 c
+121.415 2.66 121.723 2.547 121.958 2.322 c
+122.194 2.094 122.311 1.808 122.311 1.455 c
+121.664 1.455 l
+121.664 1.631 121.606 1.782 121.488 1.911 c
+121.37 2.036 121.216 2.102 121.033 2.102 c
+120.834 2.102 120.683 2.046 120.576 1.94 c
+120.466 1.841 120.415 1.708 120.415 1.543 c
+120.415 1.415 120.451 1.308 120.532 1.22 c
+120.609 1.139 120.8 1.036 121.106 0.911 c
+121.583 0.723 121.914 0.536 122.09 0.353 c
+122.267 0.176 122.355 -0.052 122.355 -0.324 c
+122.355 -0.676 122.23 -0.956 121.988 -1.162 c
+121.752 -1.367 121.436 -1.47 121.047 -1.47 c
+120.624 -1.47 120.287 -1.353 120.033 -1.118 c
+119.776 -0.875 119.651 -0.57 119.651 -0.206 c
+120.297 -0.206 l
+120.305 -0.434 120.374 -0.611 120.503 -0.736 c
+120.628 -0.853 120.812 -0.912 121.047 -0.912 c
+121.26 -0.912 121.422 -0.864 121.532 -0.765 c
+121.65 -0.669 121.708 -0.541 121.708 -0.383 c
+124.046 3.542 m
+124.046 2.587 l
+124.648 2.587 l
+124.648 2.057 l
+124.046 2.057 l
+124.046 -0.412 l
+124.046 -0.57 124.068 -0.688 124.119 -0.765 c
+124.178 -0.846 124.266 -0.882 124.384 -0.882 c
+124.472 -0.882 124.56 -0.867 124.648 -0.838 c
+124.648 -1.397 l
+124.501 -1.444 124.347 -1.47 124.193 -1.47 c
+123.935 -1.47 123.74 -1.378 123.605 -1.191 c
+123.465 -1.008 123.399 -0.746 123.399 -0.412 c
+123.399 2.057 l
+122.796 2.057 l
+122.796 2.587 l
+123.399 2.587 l
+123.399 3.542 l
+h
+125.207 0.779 m
+125.207 1.356 125.343 1.811 125.618 2.146 c
+125.901 2.487 126.273 2.66 126.735 2.66 c
+127.195 2.66 127.562 2.491 127.838 2.161 c
+128.121 1.837 128.268 1.389 128.279 0.823 c
+128.279 0.397 l
+128.279 -0.173 128.135 -0.628 127.853 -0.971 c
+127.577 -1.305 127.21 -1.47 126.751 -1.47 c
+126.287 -1.47 125.916 -1.309 125.633 -0.985 c
+125.357 -0.655 125.214 -0.214 125.207 0.338 c
+h
+125.853 0.397 m
+125.853 -0.008 125.931 -0.324 126.088 -0.559 c
+126.254 -0.794 126.475 -0.912 126.751 -0.912 c
+127.316 -0.912 127.61 -0.5 127.632 0.323 c
+127.632 0.779 l
+127.632 1.18 127.547 1.499 127.383 1.734 c
+127.225 1.976 127.007 2.102 126.735 2.102 c
+126.471 2.102 126.254 1.976 126.088 1.734 c
+125.931 1.499 125.853 1.18 125.853 0.779 c
+h
+130.763 1.969 m
+130.675 1.988 130.576 1.999 130.469 1.999 c
+130.134 1.999 129.899 1.815 129.764 1.455 c
+129.764 -1.397 l
+129.116 -1.397 l
+129.116 2.587 l
+129.749 2.587 l
+129.764 2.175 l
+129.94 2.499 130.182 2.66 130.498 2.66 c
+130.605 2.66 130.693 2.638 130.763 2.601 c
+h
+132.571 -0.309 m
+133.291 2.587 l
+133.982 2.587 l
+132.688 -1.955 l
+132.59 -2.297 132.446 -2.558 132.262 -2.735 c
+132.086 -2.911 131.884 -2.999 131.659 -2.999 c
+131.572 -2.999 131.458 -2.977 131.322 -2.94 c
+131.322 -2.396 l
+131.468 -2.411 l
+131.653 -2.411 131.799 -2.367 131.91 -2.278 c
+132.016 -2.19 132.104 -2.032 132.174 -1.808 c
+132.291 -1.367 l
+131.131 2.587 l
+131.836 2.587 l
+h
+136.201 0.779 m
+136.201 1.396 136.312 1.859 136.54 2.175 c
+136.764 2.499 137.099 2.66 137.539 2.66 c
+137.94 2.66 138.244 2.484 138.451 2.131 c
+138.495 2.587 l
+139.083 2.587 l
+139.083 -1.441 l
+139.083 -1.929 138.954 -2.308 138.701 -2.573 c
+138.443 -2.837 138.09 -2.97 137.642 -2.97 c
+137.444 -2.97 137.223 -2.918 136.981 -2.822 c
+136.735 -2.723 136.555 -2.602 136.436 -2.455 c
+136.702 -2.014 l
+136.966 -2.278 137.263 -2.411 137.598 -2.411 c
+138.134 -2.411 138.41 -2.117 138.421 -1.529 c
+138.421 -1 l
+138.215 -1.316 137.914 -1.47 137.525 -1.47 c
+137.113 -1.47 136.79 -1.32 136.555 -1.014 c
+136.326 -0.702 136.209 -0.25 136.201 0.338 c
+h
+136.863 0.397 m
+136.863 -0.044 136.926 -0.375 137.054 -0.588 c
+137.18 -0.794 137.396 -0.897 137.701 -0.897 c
+138.024 -0.897 138.263 -0.732 138.421 -0.397 c
+138.421 1.587 l
+138.252 1.911 138.013 2.072 137.701 2.072 c
+137.407 2.072 137.19 1.969 137.054 1.764 c
+136.926 1.558 136.863 1.234 136.863 0.793 c
+h
+141.685 1.969 m
+141.596 1.988 141.497 1.999 141.39 1.999 c
+141.056 1.999 140.821 1.815 140.685 1.455 c
+140.685 -1.397 l
+140.038 -1.397 l
+140.038 2.587 l
+140.67 2.587 l
+140.685 2.175 l
+140.862 2.499 141.103 2.66 141.419 2.66 c
+141.527 2.66 141.614 2.638 141.685 2.601 c
+h
+144.228 -1.397 m
+144.187 -1.309 144.161 -1.162 144.154 -0.956 c
+143.919 -1.301 143.625 -1.47 143.272 -1.47 c
+142.908 -1.47 142.626 -1.374 142.419 -1.176 c
+142.221 -0.971 142.125 -0.684 142.125 -0.309 c
+142.125 0.091 142.261 0.411 142.537 0.646 c
+142.809 0.889 143.183 1.014 143.654 1.014 c
+144.139 1.014 l
+144.139 1.44 l
+144.139 1.675 144.084 1.841 143.977 1.94 c
+143.867 2.046 143.705 2.102 143.492 2.102 c
+143.294 2.102 143.133 2.043 143.007 1.926 c
+142.89 1.808 142.831 1.66 142.831 1.484 c
+142.184 1.484 l
+142.184 1.679 142.243 1.87 142.36 2.057 c
+142.485 2.241 142.647 2.389 142.846 2.499 c
+143.052 2.605 143.279 2.66 143.536 2.66 c
+143.937 2.66 144.242 2.557 144.448 2.352 c
+144.661 2.146 144.775 1.851 144.786 1.469 c
+144.786 -0.544 l
+144.786 -0.849 144.823 -1.114 144.903 -1.338 c
+144.903 -1.397 l
+h
+143.36 -0.882 m
+143.526 -0.882 143.676 -0.838 143.816 -0.75 c
+143.962 -0.661 144.07 -0.551 144.139 -0.412 c
+144.139 0.529 l
+143.771 0.529 l
+143.455 0.529 143.213 0.459 143.037 0.323 c
+142.861 0.195 142.772 0.007 142.772 -0.235 c
+142.772 -0.464 142.816 -0.628 142.905 -0.736 c
+142.992 -0.834 143.143 -0.882 143.36 -0.882 c
+148.666 0.397 m
+148.666 -0.231 148.549 -0.702 148.314 -1.014 c
+148.086 -1.32 147.769 -1.47 147.358 -1.47 c
+146.954 -1.47 146.645 -1.32 146.433 -1.014 c
+146.433 -2.926 l
+145.785 -2.926 l
+145.785 2.587 l
+146.373 2.587 l
+146.418 2.146 l
+146.63 2.487 146.94 2.66 147.343 2.66 c
+147.785 2.66 148.112 2.506 148.328 2.204 c
+148.542 1.899 148.656 1.444 148.666 0.837 c
+h
+148.02 0.779 m
+148.02 1.22 147.95 1.543 147.814 1.749 c
+147.674 1.962 147.453 2.072 147.152 2.072 c
+146.836 2.072 146.597 1.918 146.433 1.616 c
+146.433 -0.456 l
+146.597 -0.761 146.836 -0.912 147.152 -0.912 c
+147.447 -0.912 147.659 -0.809 147.8 -0.603 c
+147.935 -0.389 148.008 -0.059 148.02 0.382 c
+h
+150.151 2.175 m
+150.404 2.499 150.724 2.66 151.106 2.66 c
+151.812 2.66 152.168 2.19 152.18 1.249 c
+152.18 -1.397 l
+151.532 -1.397 l
+151.532 1.22 l
+151.532 1.532 151.478 1.753 151.372 1.882 c
+151.261 2.006 151.106 2.072 150.901 2.072 c
+150.743 2.072 150.595 2.017 150.46 1.911 c
+150.331 1.801 150.229 1.664 150.151 1.499 c
+150.151 -1.397 l
+149.504 -1.397 l
+149.504 4.247 l
+150.151 4.247 l
+h
+153.179 -1.044 m
+153.179 -0.927 153.213 -0.831 153.282 -0.75 c
+153.348 -0.673 153.451 -0.632 153.591 -0.632 c
+153.738 -0.632 153.844 -0.673 153.914 -0.75 c
+153.992 -0.831 154.032 -0.927 154.032 -1.044 c
+154.032 -1.154 153.992 -1.246 153.914 -1.324 c
+153.844 -1.401 153.738 -1.441 153.591 -1.441 c
+153.451 -1.441 153.348 -1.401 153.282 -1.324 c
+153.213 -1.246 153.179 -1.154 153.179 -1.044 c
+160.411 0.808 m
+160.411 0.081 160.253 -0.482 159.941 -0.882 c
+159.636 -1.276 159.195 -1.47 158.618 -1.47 c
+158.067 -1.47 157.633 -1.279 157.31 -0.897 c
+156.993 -0.515 156.828 0.029 156.81 0.735 c
+156.81 1.734 l
+156.81 2.447 156.964 3.006 157.28 3.41 c
+157.603 3.821 158.048 4.027 158.618 4.027 c
+159.176 4.027 159.61 3.829 159.926 3.439 c
+160.238 3.057 160.4 2.502 160.411 1.778 c
+h
+159.735 1.749 m
+159.735 2.315 159.64 2.738 159.455 3.013 c
+159.279 3.285 159 3.424 158.618 3.424 c
+158.243 3.424 157.96 3.281 157.765 2.998 c
+157.578 2.723 157.486 2.311 157.486 1.764 c
+157.486 0.808 l
+157.486 0.257 157.578 -0.158 157.765 -0.441 c
+157.96 -0.728 158.243 -0.867 158.618 -0.867 c
+159 -0.867 159.279 -0.736 159.455 -0.47 c
+159.64 -0.206 159.735 0.199 159.735 0.75 c
+h
+161.984 2.587 m
+161.998 2.146 l
+162.252 2.487 162.576 2.66 162.969 2.66 c
+163.675 2.66 164.031 2.19 164.041 1.249 c
+164.041 -1.397 l
+163.395 -1.397 l
+163.395 1.22 l
+163.395 1.532 163.34 1.753 163.233 1.882 c
+163.123 2.006 162.969 2.072 162.763 2.072 c
+162.605 2.072 162.458 2.017 162.322 1.911 c
+162.193 1.801 162.09 1.664 162.013 1.499 c
+162.013 -1.397 l
+161.366 -1.397 l
+161.366 2.587 l
+h
+166.437 -1.47 m
+165.938 -1.47 165.556 -1.324 165.291 -1.029 c
+165.026 -0.736 164.894 -0.302 164.894 0.279 c
+164.894 0.75 l
+164.894 1.344 165.019 1.811 165.277 2.146 c
+165.541 2.487 165.901 2.66 166.364 2.66 c
+166.823 2.66 167.166 2.506 167.393 2.204 c
+167.628 1.911 167.75 1.448 167.76 0.823 c
+167.76 0.397 l
+165.541 0.397 l
+165.541 0.309 l
+165.541 -0.125 165.618 -0.437 165.776 -0.632 c
+165.942 -0.819 166.173 -0.912 166.467 -0.912 c
+166.661 -0.912 166.834 -0.879 166.981 -0.809 c
+167.129 -0.732 167.264 -0.614 167.393 -0.456 c
+167.731 -0.867 l
+167.444 -1.272 167.014 -1.47 166.437 -1.47 c
+166.364 2.102 m
+166.088 2.102 165.886 2.006 165.761 1.822 c
+165.633 1.635 165.56 1.344 165.541 0.955 c
+167.114 0.955 l
+167.114 1.043 l
+167.091 1.425 167.025 1.693 166.908 1.851 c
+166.79 2.017 166.607 2.102 166.364 2.102 c
+171.641 -0.912 m
+171.854 -0.912 172.027 -0.849 172.155 -0.721 c
+172.292 -0.584 172.365 -0.393 172.376 -0.148 c
+172.993 -0.148 l
+172.971 -0.53 172.835 -0.849 172.581 -1.103 c
+172.325 -1.349 172.012 -1.47 171.641 -1.47 c
+171.149 -1.47 170.773 -1.32 170.509 -1.014 c
+170.252 -0.702 170.127 -0.235 170.127 0.382 c
+170.127 0.823 l
+170.127 1.418 170.252 1.874 170.509 2.19 c
+170.773 2.502 171.149 2.66 171.641 2.66 c
+172.041 2.66 172.361 2.528 172.597 2.263 c
+172.839 2.006 172.971 1.66 172.993 1.22 c
+172.376 1.22 l
+172.354 1.514 172.28 1.734 172.155 1.882 c
+172.038 2.028 171.866 2.102 171.641 2.102 c
+171.347 2.102 171.13 2.003 170.994 1.808 c
+170.854 1.62 170.781 1.311 170.773 0.882 c
+170.773 0.367 l
+170.773 -0.103 170.84 -0.437 170.979 -0.632 c
+171.127 -0.819 171.347 -0.912 171.641 -0.912 c
+173.611 0.779 m
+173.611 1.356 173.747 1.811 174.023 2.146 c
+174.305 2.487 174.676 2.66 175.139 2.66 c
+175.598 2.66 175.966 2.491 176.242 2.161 c
+176.525 1.837 176.672 1.389 176.683 0.823 c
+176.683 0.397 l
+176.683 -0.173 176.539 -0.628 176.257 -0.971 c
+175.981 -1.305 175.613 -1.47 175.154 -1.47 c
+174.692 -1.47 174.32 -1.309 174.037 -0.985 c
+173.761 -0.655 173.618 -0.214 173.611 0.338 c
+h
+174.258 0.397 m
+174.258 -0.008 174.335 -0.324 174.493 -0.559 c
+174.658 -0.794 174.879 -0.912 175.154 -0.912 c
+175.72 -0.912 176.014 -0.5 176.036 0.323 c
+176.036 0.779 l
+176.036 1.18 175.951 1.499 175.787 1.734 c
+175.629 1.976 175.411 2.102 175.139 2.102 c
+174.875 2.102 174.658 1.976 174.493 1.734 c
+174.335 1.499 174.258 1.18 174.258 0.779 c
+h
+178.138 2.587 m
+178.153 2.219 l
+178.395 2.514 178.715 2.66 179.108 2.66 c
+179.55 2.66 179.858 2.462 180.034 2.072 c
+180.288 2.462 180.637 2.66 181.078 2.66 c
+181.813 2.66 182.187 2.198 182.21 1.278 c
+182.21 -1.397 l
+181.563 -1.397 l
+181.563 1.22 l
+181.563 1.514 181.508 1.727 181.401 1.866 c
+181.302 2.003 181.129 2.072 180.886 2.072 c
+180.689 2.072 180.527 1.992 180.402 1.837 c
+180.284 1.691 180.215 1.499 180.196 1.263 c
+180.196 -1.397 l
+179.534 -1.397 l
+179.534 1.249 l
+179.534 1.797 179.314 2.072 178.873 2.072 c
+178.538 2.072 178.303 1.911 178.168 1.587 c
+178.168 -1.397 l
+177.52 -1.397 l
+177.52 2.587 l
+h
+183.797 2.587 m
+183.812 2.219 l
+184.055 2.514 184.375 2.66 184.768 2.66 c
+185.208 2.66 185.517 2.462 185.693 2.072 c
+185.947 2.462 186.296 2.66 186.737 2.66 c
+187.471 2.66 187.847 2.198 187.868 1.278 c
+187.868 -1.397 l
+187.222 -1.397 l
+187.222 1.22 l
+187.222 1.514 187.167 1.727 187.06 1.866 c
+186.962 2.003 186.789 2.072 186.546 2.072 c
+186.347 2.072 186.186 1.992 186.06 1.837 c
+185.944 1.691 185.873 1.499 185.855 1.263 c
+185.855 -1.397 l
+185.194 -1.397 l
+185.194 1.249 l
+185.194 1.797 184.973 2.072 184.533 2.072 c
+184.198 2.072 183.963 1.911 183.827 1.587 c
+183.827 -1.397 l
+183.18 -1.397 l
+183.18 2.587 l
+h
+189.545 -1.397 -0.647 3.984 re
+189.588 3.63 m
+189.588 3.52 189.559 3.428 189.501 3.351 c
+189.441 3.281 189.346 3.248 189.221 3.248 c
+189.104 3.248 189.008 3.281 188.942 3.351 c
+188.883 3.428 188.853 3.52 188.853 3.63 c
+188.853 3.748 188.883 3.84 188.942 3.91 c
+189.008 3.987 189.104 4.027 189.221 4.027 c
+189.346 4.027 189.441 3.987 189.501 3.91 c
+189.559 3.829 189.588 3.737 189.588 3.63 c
+191.411 3.542 m
+191.411 2.587 l
+192.014 2.587 l
+192.014 2.057 l
+191.411 2.057 l
+191.411 -0.412 l
+191.411 -0.57 191.433 -0.688 191.485 -0.765 c
+191.544 -0.846 191.631 -0.882 191.749 -0.882 c
+191.837 -0.882 191.926 -0.867 192.014 -0.838 c
+192.014 -1.397 l
+191.867 -1.444 191.712 -1.47 191.558 -1.47 c
+191.301 -1.47 191.107 -1.378 190.97 -1.191 c
+190.831 -1.008 190.764 -0.746 190.764 -0.412 c
+190.764 2.057 l
+190.162 2.057 l
+190.162 2.587 l
+190.764 2.587 l
+190.764 3.542 l
+h
+197.379 0.397 m
+197.379 -0.231 197.262 -0.702 197.027 -1.014 c
+196.799 -1.32 196.483 -1.47 196.071 -1.47 c
+195.666 -1.47 195.358 -1.32 195.145 -1.014 c
+195.145 -2.926 l
+194.498 -2.926 l
+194.498 2.587 l
+195.086 2.587 l
+195.13 2.146 l
+195.344 2.487 195.652 2.66 196.057 2.66 c
+196.497 2.66 196.824 2.506 197.041 2.204 c
+197.254 1.899 197.368 1.444 197.379 0.837 c
+h
+196.732 0.779 m
+196.732 1.22 196.663 1.543 196.527 1.749 c
+196.387 1.962 196.167 2.072 195.865 2.072 c
+195.549 2.072 195.311 1.918 195.145 1.616 c
+195.145 -0.456 l
+195.311 -0.761 195.549 -0.912 195.865 -0.912 c
+196.159 -0.912 196.372 -0.809 196.512 -0.603 c
+196.647 -0.389 196.722 -0.059 196.732 0.382 c
+h
+199.643 -1.47 m
+199.143 -1.47 198.76 -1.324 198.496 -1.029 c
+198.232 -0.736 198.099 -0.302 198.099 0.279 c
+198.099 0.75 l
+198.099 1.344 198.224 1.811 198.482 2.146 c
+198.746 2.487 199.107 2.66 199.569 2.66 c
+200.028 2.66 200.37 2.506 200.599 2.204 c
+200.834 1.911 200.955 1.448 200.965 0.823 c
+200.965 0.397 l
+198.746 0.397 l
+198.746 0.309 l
+198.746 -0.125 198.823 -0.437 198.981 -0.632 c
+199.147 -0.819 199.378 -0.912 199.672 -0.912 c
+199.867 -0.912 200.04 -0.879 200.187 -0.809 c
+200.333 -0.732 200.47 -0.614 200.599 -0.456 c
+200.936 -0.867 l
+200.649 -1.272 200.219 -1.47 199.643 -1.47 c
+199.569 2.102 m
+199.294 2.102 199.092 2.006 198.966 1.822 c
+198.838 1.635 198.764 1.344 198.746 0.955 c
+200.319 0.955 l
+200.319 1.043 l
+200.297 1.425 200.231 1.693 200.113 1.851 c
+199.996 2.017 199.812 2.102 199.569 2.102 c
+203.391 1.969 m
+203.303 1.988 203.203 1.999 203.097 1.999 c
+202.762 1.999 202.527 1.815 202.392 1.455 c
+202.392 -1.397 l
+201.744 -1.397 l
+201.744 2.587 l
+202.377 2.587 l
+202.392 2.175 l
+202.568 2.499 202.81 2.66 203.126 2.66 c
+203.233 2.66 203.321 2.638 203.391 2.601 c
+h
+206.463 -1.397 -0.647 5.644 re
+208.183 -1.397 -0.646 3.984 re
+208.227 3.63 m
+208.227 3.52 208.198 3.428 208.139 3.351 c
+208.08 3.281 207.984 3.248 207.859 3.248 c
+207.742 3.248 207.647 3.281 207.581 3.351 c
+207.521 3.428 207.492 3.52 207.492 3.63 c
+207.492 3.748 207.521 3.84 207.581 3.91 c
+207.647 3.987 207.742 4.027 207.859 4.027 c
+207.984 4.027 208.08 3.987 208.139 3.91 c
+208.198 3.829 208.227 3.737 208.227 3.63 c
+209.814 2.587 m
+209.829 2.146 l
+210.083 2.487 210.406 2.66 210.799 2.66 c
+211.505 2.66 211.861 2.19 211.872 1.249 c
+211.872 -1.397 l
+211.225 -1.397 l
+211.225 1.22 l
+211.225 1.532 211.171 1.753 211.064 1.882 c
+210.953 2.006 210.799 2.072 210.594 2.072 c
+210.436 2.072 210.288 2.017 210.153 1.911 c
+210.024 1.801 209.921 1.664 209.844 1.499 c
+209.844 -1.397 l
+209.197 -1.397 l
+209.197 2.587 l
+h
+214.268 -1.47 m
+213.769 -1.47 213.386 -1.324 213.122 -1.029 c
+212.857 -0.736 212.725 -0.302 212.725 0.279 c
+212.725 0.75 l
+212.725 1.344 212.85 1.811 213.107 2.146 c
+213.372 2.487 213.732 2.66 214.195 2.66 c
+214.654 2.66 214.996 2.506 215.223 2.204 c
+215.459 1.911 215.58 1.448 215.591 0.823 c
+215.591 0.397 l
+213.372 0.397 l
+213.372 0.309 l
+213.372 -0.125 213.449 -0.437 213.607 -0.632 c
+213.773 -0.819 214.004 -0.912 214.298 -0.912 c
+214.492 -0.912 214.665 -0.879 214.812 -0.809 c
+214.959 -0.732 215.095 -0.614 215.223 -0.456 c
+215.562 -0.867 l
+215.275 -1.272 214.845 -1.47 214.268 -1.47 c
+214.195 2.102 m
+213.919 2.102 213.717 2.006 213.592 1.822 c
+213.463 1.635 213.39 1.344 213.372 0.955 c
+214.945 0.955 l
+214.945 1.043 l
+214.922 1.425 214.856 1.693 214.739 1.851 c
+214.621 2.017 214.438 2.102 214.195 2.102 c
+216.414 -1.044 m
+216.414 -0.927 216.447 -0.831 216.518 -0.75 c
+216.584 -0.673 216.686 -0.632 216.826 -0.632 c
+216.973 -0.632 217.079 -0.673 217.149 -0.75 c
+217.226 -0.831 217.267 -0.927 217.267 -1.044 c
+217.267 -1.154 217.226 -1.246 217.149 -1.324 c
+217.079 -1.401 216.973 -1.441 216.826 -1.441 c
+216.686 -1.441 216.584 -1.401 216.518 -1.324 c
+216.447 -1.246 216.414 -1.154 216.414 -1.044 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 411.16 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 404.3204 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.993 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+23.221 -0.646 m
+24.353 -0.646 l
+24.353 -1.264 l
+21.045 -1.264 l
+21.045 -0.646 l
+22.31 -0.646 l
+22.31 2.896 l
+21.384 2.896 l
+21.384 3.514 l
+23.221 3.514 l
+h
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.738 25.047 0.974 25.106 1.191 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.191 c
+28.355 0.974 28.384 0.738 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.014 c
+27.362 1.162 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.547 27.046 1.588 c
+26.959 1.635 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.243 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.599 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.206 27.385 -0.058 c
+27.414 0.088 27.429 0.268 27.429 0.485 c
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.526 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.596 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.056 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.467 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.36 2.139 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.279 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.232 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+40.378 1.47 m
+40.28 1.477 40.176 1.488 40.07 1.5 c
+39.96 1.517 39.838 1.529 39.702 1.529 c
+39.526 1.529 39.368 1.488 39.232 1.411 c
+39.092 1.341 38.975 1.242 38.879 1.118 c
+38.791 0.989 38.721 0.842 38.674 0.676 c
+38.633 0.507 38.615 0.331 38.615 0.147 c
+38.615 -1.264 l
+37.718 -1.264 l
+37.718 0.985 l
+37.718 1.11 37.707 1.235 37.689 1.353 c
+37.678 1.477 37.663 1.595 37.645 1.706 c
+37.633 1.823 37.619 1.918 37.6 1.999 c
+37.579 2.087 37.56 2.161 37.542 2.22 c
+38.424 2.22 l
+38.431 2.168 38.442 2.117 38.453 2.058 c
+38.472 1.999 38.486 1.933 38.497 1.867 c
+38.516 1.808 38.53 1.742 38.541 1.675 c
+38.549 1.606 38.56 1.544 38.57 1.484 c
+38.585 1.484 l
+38.622 1.602 38.674 1.709 38.732 1.808 c
+38.798 1.904 38.879 1.988 38.967 2.058 c
+39.056 2.124 39.158 2.18 39.276 2.22 c
+39.401 2.257 39.548 2.278 39.717 2.278 c
+39.842 2.278 39.96 2.271 40.07 2.263 c
+40.187 2.253 40.29 2.238 40.378 2.22 c
+h
+42.984 -1.323 m
+42.727 -1.323 42.499 -1.286 42.293 -1.22 c
+42.088 -1.143 41.911 -1.029 41.764 -0.882 c
+41.617 -0.727 41.5 -0.536 41.411 -0.309 c
+41.33 -0.085 41.294 0.181 41.294 0.485 c
+41.294 0.816 41.338 1.095 41.425 1.323 c
+41.521 1.558 41.65 1.742 41.808 1.881 c
+41.973 2.018 42.161 2.117 42.366 2.176 c
+42.572 2.242 42.782 2.278 42.998 2.278 c
+43.27 2.278 43.505 2.227 43.704 2.132 c
+43.91 2.043 44.076 1.911 44.204 1.735 c
+44.34 1.565 44.44 1.359 44.498 1.118 c
+44.564 0.882 44.6 0.617 44.6 0.324 c
+44.6 0.309 l
+42.234 0.309 l
+42.234 0.162 42.249 0.023 42.279 -0.103 c
+42.315 -0.231 42.37 -0.345 42.441 -0.441 c
+42.506 -0.529 42.591 -0.599 42.69 -0.646 c
+42.786 -0.698 42.9 -0.72 43.028 -0.72 c
+43.183 -0.72 43.322 -0.687 43.44 -0.617 c
+43.565 -0.551 43.653 -0.448 43.704 -0.309 c
+44.542 -0.382 l
+44.513 -0.482 44.457 -0.588 44.38 -0.706 c
+44.299 -0.816 44.197 -0.918 44.072 -1.014 c
+43.954 -1.103 43.8 -1.176 43.616 -1.234 c
+43.44 -1.294 43.226 -1.323 42.984 -1.323 c
+42.984 1.706 m
+42.896 1.706 42.807 1.69 42.719 1.661 c
+42.631 1.632 42.551 1.58 42.484 1.515 c
+42.414 1.444 42.356 1.357 42.308 1.249 c
+42.267 1.139 42.249 1.014 42.249 0.867 c
+43.719 0.867 l
+43.719 1.004 43.694 1.124 43.646 1.235 c
+43.605 1.341 43.55 1.43 43.484 1.5 c
+43.425 1.565 43.351 1.617 43.264 1.646 c
+43.175 1.683 43.079 1.706 42.984 1.706 c
+47.133 1.602 m
+47.133 -1.264 l
+46.236 -1.264 l
+46.236 1.602 l
+45.413 1.602 l
+45.413 2.22 l
+46.236 2.22 l
+46.236 2.484 l
+46.236 2.61 46.251 2.741 46.281 2.881 c
+46.317 3.017 46.387 3.134 46.486 3.234 c
+46.593 3.341 46.736 3.429 46.912 3.499 c
+47.089 3.564 47.313 3.601 47.588 3.601 c
+47.802 3.601 48 3.591 48.176 3.572 c
+48.353 3.55 48.504 3.532 48.632 3.514 c
+48.632 2.926 l
+48.504 2.944 48.361 2.959 48.205 2.969 c
+48.048 2.976 47.897 2.984 47.75 2.984 c
+47.621 2.984 47.519 2.969 47.441 2.94 c
+47.361 2.911 47.298 2.87 47.251 2.822 c
+47.199 2.77 47.166 2.708 47.147 2.631 c
+47.137 2.562 47.133 2.484 47.133 2.396 c
+47.133 2.22 l
+48.558 2.22 l
+48.558 1.602 l
+h
+50.605 -0.279 0.927 -0.985 re
+50.605 -1.264 m
+54.67 -0.279 0.926 -0.985 re
+54.67 -1.264 m
+f
+Q
+q 1 0 0 1 58.4255 388.7399 cm
+0 0 m
+2.102 0 l
+2.102 -0.574 l
+-0.676 -0.574 l
+-0.676 4.777 l
+0 4.777 l
+h
+3.513 -0.574 -0.646 3.984 re
+3.557 4.453 m
+3.557 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.314 4.072 3.19 4.072 c
+3.072 4.072 2.977 4.104 2.911 4.174 c
+2.851 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.851 4.663 2.911 4.733 c
+2.977 4.81 3.072 4.85 3.19 4.85 c
+3.314 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.557 4.56 3.557 4.453 c
+6.468 0.44 m
+6.468 0.588 6.412 0.709 6.306 0.808 c
+6.196 0.904 5.99 1.022 5.689 1.161 c
+5.343 1.308 5.101 1.429 4.954 1.529 c
+4.806 1.635 4.696 1.753 4.63 1.881 c
+4.561 2.006 4.528 2.164 4.528 2.352 c
+4.528 2.674 4.645 2.944 4.881 3.16 c
+5.116 3.373 5.417 3.484 5.791 3.484 c
+6.174 3.484 6.483 3.37 6.718 3.145 c
+6.953 2.917 7.071 2.631 7.071 2.278 c
+6.423 2.278 l
+6.423 2.454 6.365 2.605 6.247 2.734 c
+6.13 2.859 5.976 2.925 5.791 2.925 c
+5.593 2.925 5.442 2.869 5.336 2.763 c
+5.226 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.238 5.211 2.131 5.292 2.043 c
+5.369 1.962 5.56 1.859 5.865 1.734 c
+6.342 1.547 6.674 1.359 6.85 1.176 c
+7.026 0.999 7.115 0.771 7.115 0.5 c
+7.115 0.147 6.99 -0.133 6.747 -0.339 c
+6.512 -0.544 6.196 -0.647 5.806 -0.647 c
+5.384 -0.647 5.045 -0.53 4.792 -0.294 c
+4.534 -0.052 4.41 0.253 4.41 0.617 c
+5.056 0.617 l
+5.064 0.389 5.134 0.213 5.262 0.087 c
+5.388 -0.03 5.571 -0.088 5.806 -0.088 c
+6.02 -0.088 6.181 -0.04 6.292 0.058 c
+6.409 0.154 6.468 0.282 6.468 0.44 c
+8.804 4.365 m
+8.804 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.804 2.881 l
+8.804 0.411 l
+8.804 0.253 8.827 0.135 8.879 0.058 c
+8.937 -0.023 9.025 -0.059 9.143 -0.059 c
+9.231 -0.059 9.319 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.261 -0.621 9.106 -0.647 8.952 -0.647 c
+8.694 -0.647 8.5 -0.555 8.364 -0.368 c
+8.224 -0.184 8.158 0.077 8.158 0.411 c
+8.158 2.881 l
+7.555 2.881 l
+7.555 3.41 l
+8.158 3.41 l
+8.158 4.365 l
+h
+13.273 -0.088 m
+13.486 -0.088 13.66 -0.026 13.787 0.103 c
+13.924 0.239 13.997 0.43 14.009 0.675 c
+14.626 0.675 l
+14.603 0.294 14.468 -0.026 14.214 -0.279 c
+13.957 -0.526 13.644 -0.647 13.273 -0.647 c
+12.781 -0.647 12.406 -0.497 12.141 -0.191 c
+11.884 0.121 11.759 0.588 11.759 1.205 c
+11.759 1.646 l
+11.759 2.241 11.884 2.697 12.141 3.013 c
+12.406 3.326 12.781 3.484 13.273 3.484 c
+13.674 3.484 13.993 3.351 14.229 3.087 c
+14.471 2.829 14.603 2.484 14.626 2.043 c
+14.009 2.043 l
+13.986 2.337 13.913 2.557 13.787 2.705 c
+13.67 2.851 13.498 2.925 13.273 2.925 c
+12.979 2.925 12.762 2.826 12.627 2.631 c
+12.486 2.443 12.413 2.135 12.406 1.705 c
+12.406 1.19 l
+12.406 0.72 12.472 0.386 12.612 0.191 c
+12.759 0.004 12.979 -0.088 13.273 -0.088 c
+15.243 1.602 m
+15.243 2.179 15.379 2.634 15.655 2.969 c
+15.937 3.31 16.309 3.484 16.771 3.484 c
+17.231 3.484 17.598 3.314 17.874 2.984 c
+18.157 2.66 18.304 2.212 18.315 1.646 c
+18.315 1.22 l
+18.315 0.65 18.171 0.195 17.889 -0.148 c
+17.613 -0.482 17.246 -0.647 16.787 -0.647 c
+16.324 -0.647 15.952 -0.485 15.669 -0.162 c
+15.393 0.168 15.25 0.61 15.243 1.161 c
+h
+15.89 1.22 m
+15.89 0.816 15.967 0.5 16.125 0.264 c
+16.29 0.029 16.511 -0.088 16.787 -0.088 c
+17.352 -0.088 17.646 0.323 17.668 1.146 c
+17.668 1.602 l
+17.668 2.003 17.583 2.322 17.419 2.557 c
+17.261 2.8 17.043 2.925 16.771 2.925 c
+16.507 2.925 16.29 2.8 16.125 2.557 c
+15.967 2.322 15.89 2.003 15.89 1.602 c
+h
+19.771 3.41 m
+19.785 3.042 l
+20.027 3.337 20.347 3.484 20.74 3.484 c
+21.182 3.484 21.49 3.285 21.666 2.896 c
+21.92 3.285 22.269 3.484 22.71 3.484 c
+23.445 3.484 23.82 3.021 23.842 2.102 c
+23.842 -0.574 l
+23.195 -0.574 l
+23.195 2.043 l
+23.195 2.337 23.14 2.55 23.033 2.69 c
+22.934 2.826 22.761 2.896 22.519 2.896 c
+22.321 2.896 22.159 2.815 22.034 2.66 c
+21.916 2.514 21.847 2.322 21.828 2.087 c
+21.828 -0.574 l
+21.167 -0.574 l
+21.167 2.072 l
+21.167 2.62 20.947 2.896 20.505 2.896 c
+20.17 2.896 19.935 2.734 19.8 2.41 c
+19.8 -0.574 l
+19.153 -0.574 l
+19.153 3.41 l
+h
+25.429 3.41 m
+25.444 3.042 l
+25.687 3.337 26.007 3.484 26.4 3.484 c
+26.84 3.484 27.149 3.285 27.326 2.896 c
+27.579 3.285 27.929 3.484 28.369 3.484 c
+29.105 3.484 29.479 3.021 29.501 2.102 c
+29.501 -0.574 l
+28.854 -0.574 l
+28.854 2.043 l
+28.854 2.337 28.799 2.55 28.693 2.69 c
+28.594 2.826 28.421 2.896 28.178 2.896 c
+27.979 2.896 27.818 2.815 27.693 2.66 c
+27.576 2.514 27.505 2.322 27.487 2.087 c
+27.487 -0.574 l
+26.826 -0.574 l
+26.826 2.072 l
+26.826 2.62 26.605 2.896 26.165 2.896 c
+25.83 2.896 25.595 2.734 25.459 2.41 c
+25.459 -0.574 l
+24.812 -0.574 l
+24.812 3.41 l
+h
+31.177 -0.574 -0.647 3.984 re
+31.221 4.453 m
+31.221 4.343 31.191 4.251 31.133 4.174 c
+31.074 4.104 30.979 4.072 30.853 4.072 c
+30.736 4.072 30.64 4.104 30.574 4.174 c
+30.516 4.251 30.486 4.343 30.486 4.453 c
+30.486 4.571 30.516 4.663 30.574 4.733 c
+30.64 4.81 30.736 4.85 30.853 4.85 c
+30.979 4.85 31.074 4.81 31.133 4.733 c
+31.191 4.652 31.221 4.56 31.221 4.453 c
+33.043 4.365 m
+33.043 3.41 l
+33.646 3.41 l
+33.646 2.881 l
+33.043 2.881 l
+33.043 0.411 l
+33.043 0.253 33.066 0.135 33.117 0.058 c
+33.176 -0.023 33.264 -0.059 33.381 -0.059 c
+33.47 -0.059 33.558 -0.044 33.646 -0.015 c
+33.646 -0.574 l
+33.499 -0.621 33.345 -0.647 33.19 -0.647 c
+32.933 -0.647 32.739 -0.555 32.602 -0.368 c
+32.463 -0.184 32.397 0.077 32.397 0.411 c
+32.397 2.881 l
+31.794 2.881 l
+31.794 3.41 l
+32.397 3.41 l
+32.397 4.365 l
+h
+36.351 0.44 m
+36.351 0.588 36.296 0.709 36.189 0.808 c
+36.079 0.904 35.873 1.022 35.572 1.161 c
+35.226 1.308 34.984 1.429 34.837 1.529 c
+34.69 1.635 34.58 1.753 34.514 1.881 c
+34.443 2.006 34.41 2.164 34.41 2.352 c
+34.41 2.674 34.528 2.944 34.763 3.16 c
+34.998 3.373 35.299 3.484 35.675 3.484 c
+36.057 3.484 36.365 3.37 36.6 3.145 c
+36.836 2.917 36.953 2.631 36.953 2.278 c
+36.307 2.278 l
+36.307 2.454 36.248 2.605 36.13 2.734 c
+36.012 2.859 35.858 2.925 35.675 2.925 c
+35.476 2.925 35.326 2.869 35.219 2.763 c
+35.108 2.664 35.058 2.532 35.058 2.366 c
+35.058 2.238 35.094 2.131 35.175 2.043 c
+35.252 1.962 35.443 1.859 35.748 1.734 c
+36.226 1.547 36.556 1.359 36.733 1.176 c
+36.909 0.999 36.997 0.771 36.997 0.5 c
+36.997 0.147 36.872 -0.133 36.631 -0.339 c
+36.395 -0.544 36.079 -0.647 35.69 -0.647 c
+35.266 -0.647 34.929 -0.53 34.675 -0.294 c
+34.418 -0.052 34.293 0.253 34.293 0.617 c
+34.94 0.617 l
+34.948 0.389 35.017 0.213 35.145 0.087 c
+35.27 -0.03 35.455 -0.088 35.69 -0.088 c
+35.902 -0.088 36.064 -0.04 36.174 0.058 c
+36.292 0.154 36.351 0.282 36.351 0.44 c
+40.408 4.365 m
+40.408 3.41 l
+41.011 3.41 l
+41.011 2.881 l
+40.408 2.881 l
+40.408 0.411 l
+40.408 0.253 40.43 0.135 40.481 0.058 c
+40.54 -0.023 40.629 -0.059 40.746 -0.059 c
+40.834 -0.059 40.922 -0.044 41.011 -0.015 c
+41.011 -0.574 l
+40.864 -0.621 40.709 -0.647 40.554 -0.647 c
+40.298 -0.647 40.103 -0.555 39.966 -0.368 c
+39.827 -0.184 39.761 0.077 39.761 0.411 c
+39.761 2.881 l
+39.158 2.881 l
+39.158 3.41 l
+39.761 3.41 l
+39.761 4.365 l
+h
+42.422 2.998 m
+42.675 3.322 42.995 3.484 43.377 3.484 c
+44.082 3.484 44.439 3.013 44.45 2.072 c
+44.45 -0.574 l
+43.804 -0.574 l
+43.804 2.043 l
+43.804 2.356 43.748 2.576 43.642 2.705 c
+43.531 2.829 43.377 2.896 43.171 2.896 c
+43.013 2.896 42.866 2.84 42.73 2.734 c
+42.601 2.624 42.499 2.487 42.422 2.322 c
+42.422 -0.574 l
+41.774 -0.574 l
+41.774 5.071 l
+42.422 5.071 l
+h
+47.449 -0.574 m
+47.409 -0.485 47.382 -0.339 47.375 -0.133 c
+47.14 -0.478 46.846 -0.647 46.493 -0.647 c
+46.129 -0.647 45.846 -0.551 45.641 -0.353 c
+45.442 -0.148 45.346 0.139 45.346 0.515 c
+45.346 0.914 45.483 1.234 45.759 1.469 c
+46.03 1.712 46.405 1.837 46.875 1.837 c
+47.361 1.837 l
+47.361 2.263 l
+47.361 2.499 47.305 2.664 47.199 2.763 c
+47.089 2.869 46.927 2.925 46.713 2.925 c
+46.515 2.925 46.353 2.866 46.229 2.749 c
+46.111 2.631 46.052 2.484 46.052 2.308 c
+45.406 2.308 l
+45.406 2.502 45.464 2.693 45.582 2.881 c
+45.707 3.064 45.869 3.212 46.067 3.322 c
+46.273 3.428 46.501 3.484 46.758 3.484 c
+47.158 3.484 47.463 3.38 47.669 3.175 c
+47.883 2.969 47.997 2.674 48.007 2.293 c
+48.007 0.279 l
+48.007 -0.026 48.044 -0.291 48.124 -0.515 c
+48.124 -0.574 l
+h
+46.582 -0.059 m
+46.746 -0.059 46.898 -0.015 47.037 0.073 c
+47.184 0.162 47.291 0.272 47.361 0.411 c
+47.361 1.352 l
+46.993 1.352 l
+46.677 1.352 46.434 1.282 46.258 1.146 c
+46.081 1.018 45.994 0.83 45.994 0.588 c
+45.994 0.359 46.038 0.195 46.125 0.087 c
+46.214 -0.011 46.364 -0.059 46.582 -0.059 c
+49.859 4.365 m
+49.859 3.41 l
+50.462 3.41 l
+50.462 2.881 l
+49.859 2.881 l
+49.859 0.411 l
+49.859 0.253 49.881 0.135 49.933 0.058 c
+49.992 -0.023 50.079 -0.059 50.197 -0.059 c
+50.285 -0.059 50.374 -0.044 50.462 -0.015 c
+50.462 -0.574 l
+50.315 -0.621 50.16 -0.647 50.006 -0.647 c
+49.749 -0.647 49.554 -0.555 49.418 -0.368 c
+49.279 -0.184 49.213 0.077 49.213 0.411 c
+49.213 2.881 l
+48.61 2.881 l
+48.61 3.41 l
+49.213 3.41 l
+49.213 4.365 l
+h
+54.989 -0.574 m
+54.949 -0.485 54.923 -0.339 54.916 -0.133 c
+54.68 -0.478 54.387 -0.647 54.034 -0.647 c
+53.67 -0.647 53.387 -0.551 53.181 -0.353 c
+52.982 -0.148 52.887 0.139 52.887 0.515 c
+52.887 0.914 53.023 1.234 53.299 1.469 c
+53.57 1.712 53.946 1.837 54.416 1.837 c
+54.901 1.837 l
+54.901 2.263 l
+54.901 2.499 54.846 2.664 54.74 2.763 c
+54.629 2.869 54.468 2.925 54.254 2.925 c
+54.056 2.925 53.894 2.866 53.769 2.749 c
+53.651 2.631 53.593 2.484 53.593 2.308 c
+52.946 2.308 l
+52.946 2.502 53.005 2.693 53.123 2.881 c
+53.248 3.064 53.409 3.212 53.607 3.322 c
+53.813 3.428 54.041 3.484 54.299 3.484 c
+54.699 3.484 55.004 3.38 55.21 3.175 c
+55.423 2.969 55.537 2.674 55.548 2.293 c
+55.548 0.279 l
+55.548 -0.026 55.585 -0.291 55.665 -0.515 c
+55.665 -0.574 l
+h
+54.122 -0.059 m
+54.287 -0.059 54.438 -0.015 54.578 0.073 c
+54.725 0.162 54.831 0.272 54.901 0.411 c
+54.901 1.352 l
+54.534 1.352 l
+54.218 1.352 53.975 1.282 53.799 1.146 c
+53.622 1.018 53.534 0.83 53.534 0.588 c
+53.534 0.359 53.578 0.195 53.666 0.087 c
+53.755 -0.011 53.905 -0.059 54.122 -0.059 c
+58.193 2.792 m
+58.106 2.811 58.006 2.822 57.9 2.822 c
+57.565 2.822 57.33 2.638 57.194 2.278 c
+57.194 -0.574 l
+56.547 -0.574 l
+56.547 3.41 l
+57.179 3.41 l
+57.194 2.998 l
+57.37 3.322 57.613 3.484 57.929 3.484 c
+58.035 3.484 58.124 3.461 58.193 3.424 c
+h
+60.192 -0.647 m
+59.693 -0.647 59.311 -0.5 59.046 -0.206 c
+58.781 0.087 58.649 0.521 58.649 1.103 c
+58.649 1.573 l
+58.649 2.167 58.775 2.634 59.031 2.969 c
+59.296 3.31 59.656 3.484 60.119 3.484 c
+60.579 3.484 60.92 3.329 61.148 3.027 c
+61.383 2.734 61.505 2.271 61.516 1.646 c
+61.516 1.22 l
+59.296 1.22 l
+59.296 1.132 l
+59.296 0.698 59.373 0.386 59.531 0.191 c
+59.697 0.004 59.928 -0.088 60.222 -0.088 c
+60.417 -0.088 60.589 -0.056 60.737 0.014 c
+60.884 0.091 61.019 0.209 61.148 0.367 c
+61.486 -0.044 l
+61.2 -0.449 60.77 -0.647 60.192 -0.647 c
+60.119 2.925 m
+59.843 2.925 59.642 2.829 59.517 2.645 c
+59.388 2.458 59.315 2.167 59.296 1.778 c
+60.869 1.778 l
+60.869 1.866 l
+60.847 2.248 60.78 2.516 60.663 2.674 c
+60.545 2.84 60.362 2.925 60.119 2.925 c
+66.895 1.22 m
+66.895 0.592 66.777 0.121 66.542 -0.191 c
+66.315 -0.497 65.999 -0.647 65.587 -0.647 c
+65.183 -0.647 64.874 -0.497 64.661 -0.191 c
+64.661 -2.103 l
+64.014 -2.103 l
+64.014 3.41 l
+64.602 3.41 l
+64.647 2.969 l
+64.859 3.31 65.168 3.484 65.572 3.484 c
+66.014 3.484 66.341 3.329 66.557 3.027 c
+66.771 2.722 66.885 2.267 66.895 1.66 c
+h
+66.249 1.602 m
+66.249 2.043 66.179 2.366 66.043 2.572 c
+65.904 2.786 65.682 2.896 65.381 2.896 c
+65.065 2.896 64.826 2.741 64.661 2.439 c
+64.661 0.367 l
+64.826 0.062 65.065 -0.088 65.381 -0.088 c
+65.676 -0.088 65.888 0.014 66.029 0.22 c
+66.164 0.434 66.237 0.764 66.249 1.205 c
+h
+69.38 2.792 m
+69.291 2.811 69.192 2.822 69.086 2.822 c
+68.751 2.822 68.516 2.638 68.38 2.278 c
+68.38 -0.574 l
+67.733 -0.574 l
+67.733 3.41 l
+68.365 3.41 l
+68.38 2.998 l
+68.556 3.322 68.799 3.484 69.115 3.484 c
+69.221 3.484 69.31 3.461 69.38 3.424 c
+h
+71.379 -0.647 m
+70.879 -0.647 70.497 -0.5 70.232 -0.206 c
+69.967 0.087 69.835 0.521 69.835 1.103 c
+69.835 1.573 l
+69.835 2.167 69.96 2.634 70.218 2.969 c
+70.482 3.31 70.842 3.484 71.305 3.484 c
+71.764 3.484 72.107 3.329 72.334 3.027 c
+72.57 2.734 72.691 2.271 72.701 1.646 c
+72.701 1.22 l
+70.482 1.22 l
+70.482 1.132 l
+70.482 0.698 70.559 0.386 70.717 0.191 c
+70.883 0.004 71.114 -0.088 71.408 -0.088 c
+71.602 -0.088 71.776 -0.056 71.922 0.014 c
+72.069 0.091 72.206 0.209 72.334 0.367 c
+72.672 -0.044 l
+72.385 -0.449 71.955 -0.647 71.379 -0.647 c
+71.305 2.925 m
+71.03 2.925 70.827 2.829 70.702 2.645 c
+70.574 2.458 70.5 2.167 70.482 1.778 c
+72.055 1.778 l
+72.055 1.866 l
+72.032 2.248 71.967 2.516 71.849 2.674 c
+71.731 2.84 71.548 2.925 71.305 2.925 c
+75.421 0.44 m
+75.421 0.588 75.365 0.709 75.259 0.808 c
+75.149 0.904 74.943 1.022 74.642 1.161 c
+74.297 1.308 74.054 1.429 73.907 1.529 c
+73.76 1.635 73.65 1.753 73.584 1.881 c
+73.514 2.006 73.48 2.164 73.48 2.352 c
+73.48 2.674 73.598 2.944 73.833 3.16 c
+74.068 3.373 74.37 3.484 74.745 3.484 c
+75.126 3.484 75.436 3.37 75.671 3.145 c
+75.906 2.917 76.024 2.631 76.024 2.278 c
+75.377 2.278 l
+75.377 2.454 75.318 2.605 75.201 2.734 c
+75.083 2.859 74.929 2.925 74.745 2.925 c
+74.546 2.925 74.396 2.869 74.289 2.763 c
+74.179 2.664 74.127 2.532 74.127 2.366 c
+74.127 2.238 74.164 2.131 74.245 2.043 c
+74.322 1.962 74.513 1.859 74.818 1.734 c
+75.296 1.547 75.627 1.359 75.803 1.176 c
+75.98 0.999 76.067 0.771 76.067 0.5 c
+76.067 0.147 75.943 -0.133 75.7 -0.339 c
+75.465 -0.544 75.149 -0.647 74.76 -0.647 c
+74.337 -0.647 73.999 -0.53 73.745 -0.294 c
+73.488 -0.052 73.363 0.253 73.363 0.617 c
+74.01 0.617 l
+74.017 0.389 74.087 0.213 74.216 0.087 c
+74.34 -0.03 74.524 -0.088 74.76 -0.088 c
+74.972 -0.088 75.134 -0.04 75.244 0.058 c
+75.362 0.154 75.421 0.282 75.421 0.44 c
+78.332 -0.647 m
+77.831 -0.647 77.449 -0.5 77.185 -0.206 c
+76.92 0.087 76.788 0.521 76.788 1.103 c
+76.788 1.573 l
+76.788 2.167 76.913 2.634 77.17 2.969 c
+77.435 3.31 77.794 3.484 78.258 3.484 c
+78.717 3.484 79.059 3.329 79.286 3.027 c
+79.522 2.734 79.643 2.271 79.654 1.646 c
+79.654 1.22 l
+77.435 1.22 l
+77.435 1.132 l
+77.435 0.698 77.512 0.386 77.67 0.191 c
+77.835 0.004 78.066 -0.088 78.361 -0.088 c
+78.555 -0.088 78.729 -0.056 78.875 0.014 c
+79.022 0.091 79.159 0.209 79.286 0.367 c
+79.625 -0.044 l
+79.338 -0.449 78.908 -0.647 78.332 -0.647 c
+78.258 2.925 m
+77.983 2.925 77.78 2.829 77.655 2.645 c
+77.526 2.458 77.453 2.167 77.435 1.778 c
+79.007 1.778 l
+79.007 1.866 l
+78.985 2.248 78.92 2.516 78.802 2.674 c
+78.684 2.84 78.5 2.925 78.258 2.925 c
+81.05 3.41 m
+81.065 2.969 l
+81.318 3.31 81.642 3.484 82.035 3.484 c
+82.741 3.484 83.097 3.013 83.109 2.072 c
+83.109 -0.574 l
+82.461 -0.574 l
+82.461 2.043 l
+82.461 2.356 82.407 2.576 82.3 2.705 c
+82.19 2.829 82.035 2.896 81.829 2.896 c
+81.671 2.896 81.524 2.84 81.389 2.734 c
+81.26 2.624 81.158 2.487 81.08 2.322 c
+81.08 -0.574 l
+80.433 -0.574 l
+80.433 3.41 l
+h
+84.931 4.365 m
+84.931 3.41 l
+85.534 3.41 l
+85.534 2.881 l
+84.931 2.881 l
+84.931 0.411 l
+84.931 0.253 84.953 0.135 85.004 0.058 c
+85.064 -0.023 85.152 -0.059 85.27 -0.059 c
+85.357 -0.059 85.445 -0.044 85.534 -0.015 c
+85.534 -0.574 l
+85.387 -0.621 85.233 -0.647 85.079 -0.647 c
+84.821 -0.647 84.626 -0.555 84.491 -0.368 c
+84.35 -0.184 84.285 0.077 84.285 0.411 c
+84.285 2.881 l
+83.682 2.881 l
+83.682 3.41 l
+84.285 3.41 l
+84.285 4.365 l
+h
+87.886 1.602 m
+87.886 2.179 88.021 2.634 88.297 2.969 c
+88.58 3.31 88.952 3.484 89.414 3.484 c
+89.874 3.484 90.241 3.314 90.517 2.984 c
+90.8 2.66 90.947 2.212 90.958 1.646 c
+90.958 1.22 l
+90.958 0.65 90.814 0.195 90.531 -0.148 c
+90.255 -0.482 89.889 -0.647 89.43 -0.647 c
+88.966 -0.647 88.595 -0.485 88.312 -0.162 c
+88.036 0.168 87.893 0.61 87.886 1.161 c
+h
+88.532 1.22 m
+88.532 0.816 88.609 0.5 88.767 0.264 c
+88.933 0.029 89.154 -0.088 89.43 -0.088 c
+89.995 -0.088 90.289 0.323 90.311 1.146 c
+90.311 1.602 l
+90.311 2.003 90.226 2.322 90.061 2.557 c
+89.903 2.8 89.686 2.925 89.414 2.925 c
+89.15 2.925 88.933 2.8 88.767 2.557 c
+88.609 2.322 88.532 2.003 88.532 1.602 c
+h
+92.413 3.41 m
+92.428 2.969 l
+92.682 3.31 93.004 3.484 93.398 3.484 c
+94.103 3.484 94.46 3.013 94.471 2.072 c
+94.471 -0.574 l
+93.824 -0.574 l
+93.824 2.043 l
+93.824 2.356 93.769 2.576 93.663 2.705 c
+93.552 2.829 93.398 2.896 93.192 2.896 c
+93.034 2.896 92.887 2.84 92.751 2.734 c
+92.622 2.624 92.52 2.487 92.443 2.322 c
+92.443 -0.574 l
+91.795 -0.574 l
+91.795 3.41 l
+h
+98.542 -0.088 m
+98.756 -0.088 98.928 -0.026 99.057 0.103 c
+99.192 0.239 99.267 0.43 99.277 0.675 c
+99.895 0.675 l
+99.873 0.294 99.737 -0.026 99.483 -0.279 c
+99.226 -0.526 98.914 -0.647 98.542 -0.647 c
+98.05 -0.647 97.675 -0.497 97.411 -0.191 c
+97.153 0.121 97.029 0.588 97.029 1.205 c
+97.029 1.646 l
+97.029 2.241 97.153 2.697 97.411 3.013 c
+97.675 3.326 98.05 3.484 98.542 3.484 c
+98.943 3.484 99.263 3.351 99.498 3.087 c
+99.74 2.829 99.873 2.484 99.895 2.043 c
+99.277 2.043 l
+99.256 2.337 99.182 2.557 99.057 2.705 c
+98.939 2.851 98.766 2.925 98.542 2.925 c
+98.249 2.925 98.032 2.826 97.896 2.631 c
+97.756 2.443 97.683 2.135 97.675 1.705 c
+97.675 1.19 l
+97.675 0.72 97.742 0.386 97.881 0.191 c
+98.028 0.004 98.249 -0.088 98.542 -0.088 c
+102.673 -0.221 m
+102.456 -0.507 102.144 -0.647 101.732 -0.647 c
+101.368 -0.647 101.093 -0.526 100.909 -0.279 c
+100.732 -0.026 100.637 0.338 100.63 0.808 c
+100.63 3.41 l
+101.276 3.41 l
+101.276 0.867 l
+101.276 0.239 101.461 -0.073 101.835 -0.073 c
+102.236 -0.073 102.511 0.103 102.658 0.455 c
+102.658 3.41 l
+103.305 3.41 l
+103.305 -0.574 l
+102.687 -0.574 l
+h
+105.936 2.792 m
+105.848 2.811 105.749 2.822 105.642 2.822 c
+105.307 2.822 105.072 2.638 104.937 2.278 c
+104.937 -0.574 l
+104.289 -0.574 l
+104.289 3.41 l
+104.922 3.41 l
+104.937 2.998 l
+105.113 3.322 105.355 3.484 105.671 3.484 c
+105.778 3.484 105.866 3.461 105.936 3.424 c
+h
+108.229 2.792 m
+108.141 2.811 108.042 2.822 107.935 2.822 c
+107.601 2.822 107.366 2.638 107.229 2.278 c
+107.229 -0.574 l
+106.583 -0.574 l
+106.583 3.41 l
+107.215 3.41 l
+107.229 2.998 l
+107.406 3.322 107.649 3.484 107.965 3.484 c
+108.071 3.484 108.16 3.461 108.229 3.424 c
+h
+110.228 -0.647 m
+109.729 -0.647 109.346 -0.5 109.082 -0.206 c
+108.817 0.087 108.685 0.521 108.685 1.103 c
+108.685 1.573 l
+108.685 2.167 108.81 2.634 109.067 2.969 c
+109.332 3.31 109.692 3.484 110.155 3.484 c
+110.614 3.484 110.956 3.329 111.184 3.027 c
+111.419 2.734 111.54 2.271 111.551 1.646 c
+111.551 1.22 l
+109.332 1.22 l
+109.332 1.132 l
+109.332 0.698 109.409 0.386 109.567 0.191 c
+109.733 0.004 109.964 -0.088 110.257 -0.088 c
+110.452 -0.088 110.625 -0.056 110.772 0.014 c
+110.919 0.091 111.055 0.209 111.184 0.367 c
+111.522 -0.044 l
+111.235 -0.449 110.805 -0.647 110.228 -0.647 c
+110.155 2.925 m
+109.879 2.925 109.677 2.829 109.552 2.645 c
+109.423 2.458 109.35 2.167 109.332 1.778 c
+110.905 1.778 l
+110.905 1.866 l
+110.882 2.248 110.816 2.516 110.699 2.674 c
+110.581 2.84 110.398 2.925 110.155 2.925 c
+112.948 3.41 m
+112.962 2.969 l
+113.216 3.31 113.539 3.484 113.932 3.484 c
+114.638 3.484 114.994 3.013 115.005 2.072 c
+115.005 -0.574 l
+114.359 -0.574 l
+114.359 2.043 l
+114.359 2.356 114.304 2.576 114.197 2.705 c
+114.086 2.829 113.932 2.896 113.727 2.896 c
+113.569 2.896 113.421 2.84 113.286 2.734 c
+113.157 2.624 113.054 2.487 112.977 2.322 c
+112.977 -0.574 l
+112.33 -0.574 l
+112.33 3.41 l
+h
+116.829 4.365 m
+116.829 3.41 l
+117.431 3.41 l
+117.431 2.881 l
+116.829 2.881 l
+116.829 0.411 l
+116.829 0.253 116.85 0.135 116.902 0.058 c
+116.96 -0.023 117.049 -0.059 117.166 -0.059 c
+117.255 -0.059 117.342 -0.044 117.431 -0.015 c
+117.431 -0.574 l
+117.284 -0.621 117.13 -0.647 116.975 -0.647 c
+116.718 -0.647 116.523 -0.555 116.387 -0.368 c
+116.247 -0.184 116.181 0.077 116.181 0.411 c
+116.181 2.881 l
+115.578 2.881 l
+115.578 3.41 l
+116.181 3.41 l
+116.181 4.365 l
+h
+122.796 1.22 m
+122.796 0.602 122.682 0.135 122.458 -0.177 c
+122.241 -0.493 121.918 -0.647 121.488 -0.647 c
+121.065 -0.647 120.752 -0.467 120.547 -0.104 c
+120.517 -0.574 l
+119.915 -0.574 l
+119.915 5.071 l
+120.561 5.071 l
+120.561 2.969 l
+120.775 3.31 121.084 3.484 121.488 3.484 c
+121.918 3.484 122.241 3.326 122.458 3.013 c
+122.682 2.708 122.796 2.241 122.796 1.616 c
+h
+122.149 1.602 m
+122.149 2.072 122.08 2.403 121.943 2.601 c
+121.814 2.796 121.606 2.896 121.311 2.896 c
+120.977 2.896 120.727 2.711 120.561 2.352 c
+120.561 0.47 l
+120.727 0.106 120.981 -0.073 121.326 -0.073 c
+121.62 -0.073 121.83 0.029 121.958 0.235 c
+122.083 0.44 122.149 0.756 122.149 1.19 c
+h
+125.28 2.792 m
+125.192 2.811 125.093 2.822 124.986 2.822 c
+124.652 2.822 124.417 2.638 124.28 2.278 c
+124.28 -0.574 l
+123.634 -0.574 l
+123.634 3.41 l
+124.266 3.41 l
+124.28 2.998 l
+124.457 3.322 124.7 3.484 125.016 3.484 c
+125.122 3.484 125.211 3.461 125.28 3.424 c
+h
+127.823 -0.574 m
+127.783 -0.485 127.757 -0.339 127.75 -0.133 c
+127.514 -0.478 127.22 -0.647 126.867 -0.647 c
+126.504 -0.647 126.221 -0.551 126.015 -0.353 c
+125.816 -0.148 125.721 0.139 125.721 0.515 c
+125.721 0.914 125.857 1.234 126.132 1.469 c
+126.404 1.712 126.78 1.837 127.25 1.837 c
+127.735 1.837 l
+127.735 2.263 l
+127.735 2.499 127.68 2.664 127.573 2.763 c
+127.463 2.869 127.301 2.925 127.088 2.925 c
+126.89 2.925 126.728 2.866 126.603 2.749 c
+126.485 2.631 126.427 2.484 126.427 2.308 c
+125.78 2.308 l
+125.78 2.502 125.839 2.693 125.957 2.881 c
+126.081 3.064 126.243 3.212 126.441 3.322 c
+126.647 3.428 126.875 3.484 127.132 3.484 c
+127.532 3.484 127.838 3.38 128.043 3.175 c
+128.257 2.969 128.37 2.674 128.382 2.293 c
+128.382 0.279 l
+128.382 -0.026 128.418 -0.291 128.499 -0.515 c
+128.499 -0.574 l
+h
+126.956 -0.059 m
+127.121 -0.059 127.272 -0.015 127.412 0.073 c
+127.559 0.162 127.665 0.272 127.735 0.411 c
+127.735 1.352 l
+127.368 1.352 l
+127.052 1.352 126.809 1.282 126.632 1.146 c
+126.456 1.018 126.368 0.83 126.368 0.588 c
+126.368 0.359 126.412 0.195 126.5 0.087 c
+126.589 -0.011 126.739 -0.059 126.956 -0.059 c
+129.999 3.41 m
+130.013 2.969 l
+130.267 3.31 130.59 3.484 130.983 3.484 c
+131.688 3.484 132.045 3.013 132.056 2.072 c
+132.056 -0.574 l
+131.41 -0.574 l
+131.41 2.043 l
+131.41 2.356 131.354 2.576 131.248 2.705 c
+131.138 2.829 130.983 2.896 130.778 2.896 c
+130.62 2.896 130.472 2.84 130.337 2.734 c
+130.208 2.624 130.105 2.487 130.028 2.322 c
+130.028 -0.574 l
+129.381 -0.574 l
+129.381 3.41 l
+h
+134.408 -0.088 m
+134.622 -0.088 134.794 -0.026 134.923 0.103 c
+135.058 0.239 135.133 0.43 135.143 0.675 c
+135.761 0.675 l
+135.738 0.294 135.603 -0.026 135.349 -0.279 c
+135.092 -0.526 134.78 -0.647 134.408 -0.647 c
+133.916 -0.647 133.541 -0.497 133.276 -0.191 c
+133.02 0.121 132.894 0.588 132.894 1.205 c
+132.894 1.646 l
+132.894 2.241 133.02 2.697 133.276 3.013 c
+133.541 3.326 133.916 3.484 134.408 3.484 c
+134.809 3.484 135.129 3.351 135.364 3.087 c
+135.607 2.829 135.738 2.484 135.761 2.043 c
+135.143 2.043 l
+135.121 2.337 135.048 2.557 134.923 2.705 c
+134.805 2.851 134.632 2.925 134.408 2.925 c
+134.115 2.925 133.897 2.826 133.762 2.631 c
+133.622 2.443 133.548 2.135 133.541 1.705 c
+133.541 1.19 l
+133.541 0.72 133.607 0.386 133.747 0.191 c
+133.894 0.004 134.115 -0.088 134.408 -0.088 c
+137.157 2.998 m
+137.41 3.322 137.73 3.484 138.113 3.484 c
+138.818 3.484 139.174 3.013 139.185 2.072 c
+139.185 -0.574 l
+138.539 -0.574 l
+138.539 2.043 l
+138.539 2.356 138.483 2.576 138.377 2.705 c
+138.267 2.829 138.113 2.896 137.907 2.896 c
+137.749 2.896 137.602 2.84 137.466 2.734 c
+137.337 2.624 137.234 2.487 137.157 2.322 c
+137.157 -0.574 l
+136.51 -0.574 l
+136.51 5.071 l
+137.157 5.071 l
+h
+143.904 -0.574 m
+143.864 -0.485 143.838 -0.339 143.831 -0.133 c
+143.595 -0.478 143.301 -0.647 142.948 -0.647 c
+142.584 -0.647 142.302 -0.551 142.096 -0.353 c
+141.897 -0.148 141.801 0.139 141.801 0.515 c
+141.801 0.914 141.938 1.234 142.213 1.469 c
+142.485 1.712 142.86 1.837 143.33 1.837 c
+143.816 1.837 l
+143.816 2.263 l
+143.816 2.499 143.76 2.664 143.654 2.763 c
+143.544 2.869 143.382 2.925 143.169 2.925 c
+142.971 2.925 142.809 2.866 142.684 2.749 c
+142.566 2.631 142.507 2.484 142.507 2.308 c
+141.861 2.308 l
+141.861 2.502 141.919 2.693 142.037 2.881 c
+142.162 3.064 142.324 3.212 142.522 3.322 c
+142.728 3.428 142.956 3.484 143.213 3.484 c
+143.613 3.484 143.918 3.38 144.124 3.175 c
+144.338 2.969 144.451 2.674 144.463 2.293 c
+144.463 0.279 l
+144.463 -0.026 144.499 -0.291 144.58 -0.515 c
+144.58 -0.574 l
+h
+143.037 -0.059 m
+143.202 -0.059 143.353 -0.015 143.492 0.073 c
+143.64 0.162 143.746 0.272 143.816 0.411 c
+143.816 1.352 l
+143.448 1.352 l
+143.133 1.352 142.89 1.282 142.713 1.146 c
+142.537 1.018 142.449 0.83 142.449 0.588 c
+142.449 0.359 142.493 0.195 142.581 0.087 c
+142.669 -0.011 142.819 -0.059 143.037 -0.059 c
+146.079 3.41 m
+146.094 2.969 l
+146.347 3.31 146.671 3.484 147.064 3.484 c
+147.769 3.484 148.126 3.013 148.137 2.072 c
+148.137 -0.574 l
+147.49 -0.574 l
+147.49 2.043 l
+147.49 2.356 147.435 2.576 147.328 2.705 c
+147.218 2.829 147.064 2.896 146.858 2.896 c
+146.7 2.896 146.553 2.84 146.418 2.734 c
+146.289 2.624 146.186 2.487 146.109 2.322 c
+146.109 -0.574 l
+145.462 -0.574 l
+145.462 3.41 l
+h
+148.975 1.602 m
+148.975 2.208 149.086 2.674 149.313 2.998 c
+149.548 3.322 149.875 3.484 150.298 3.484 c
+150.68 3.484 150.977 3.326 151.195 3.013 c
+151.195 5.071 l
+151.841 5.071 l
+151.841 -0.574 l
+151.253 -0.574 l
+151.209 -0.148 l
+151.004 -0.482 150.698 -0.647 150.298 -0.647 c
+149.886 -0.647 149.562 -0.493 149.327 -0.177 c
+149.092 0.147 148.975 0.602 148.975 1.19 c
+h
+149.622 1.22 m
+149.622 0.779 149.684 0.448 149.813 0.235 c
+149.949 0.029 150.169 -0.073 150.474 -0.073 c
+150.798 -0.073 151.037 0.087 151.195 0.411 c
+151.195 2.425 l
+151.025 2.738 150.786 2.896 150.474 2.896 c
+150.169 2.896 149.949 2.792 149.813 2.587 c
+149.684 2.381 149.622 2.057 149.622 1.616 c
+h
+155.178 3.41 m
+155.193 2.969 l
+155.446 3.31 155.77 3.484 156.163 3.484 c
+156.868 3.484 157.225 3.013 157.236 2.072 c
+157.236 -0.574 l
+156.589 -0.574 l
+156.589 2.043 l
+156.589 2.356 156.534 2.576 156.427 2.705 c
+156.317 2.829 156.163 2.896 155.957 2.896 c
+155.799 2.896 155.652 2.84 155.516 2.734 c
+155.388 2.624 155.284 2.487 155.207 2.322 c
+155.207 -0.574 l
+154.561 -0.574 l
+154.561 3.41 l
+h
+158.073 1.602 m
+158.073 2.179 158.21 2.634 158.485 2.969 c
+158.769 3.31 159.139 3.484 159.602 3.484 c
+160.062 3.484 160.429 3.314 160.705 2.984 c
+160.988 2.66 161.135 2.212 161.146 1.646 c
+161.146 1.22 l
+161.146 0.65 161.003 0.195 160.72 -0.148 c
+160.444 -0.482 160.076 -0.647 159.617 -0.647 c
+159.154 -0.647 158.783 -0.485 158.5 -0.162 c
+158.224 0.168 158.081 0.61 158.073 1.161 c
+h
+158.721 1.22 m
+158.721 0.816 158.798 0.5 158.956 0.264 c
+159.121 0.029 159.341 -0.088 159.617 -0.088 c
+160.183 -0.088 160.477 0.323 160.499 1.146 c
+160.499 1.602 l
+160.499 2.003 160.415 2.322 160.249 2.557 c
+160.091 2.8 159.874 2.925 159.602 2.925 c
+159.338 2.925 159.121 2.8 158.956 2.557 c
+158.798 2.322 158.721 2.003 158.721 1.602 c
+h
+162.836 4.365 m
+162.836 3.41 l
+163.438 3.41 l
+163.438 2.881 l
+162.836 2.881 l
+162.836 0.411 l
+162.836 0.253 162.858 0.135 162.91 0.058 c
+162.968 -0.023 163.056 -0.059 163.174 -0.059 c
+163.262 -0.059 163.351 -0.044 163.438 -0.015 c
+163.438 -0.574 l
+163.292 -0.621 163.137 -0.647 162.983 -0.647 c
+162.726 -0.647 162.532 -0.555 162.395 -0.368 c
+162.256 -0.184 162.189 0.077 162.189 0.411 c
+162.189 2.881 l
+161.587 2.881 l
+161.587 3.41 l
+162.189 3.41 l
+162.189 4.365 l
+h
+166.54 3.41 m
+166.555 3.042 l
+166.798 3.337 167.118 3.484 167.511 3.484 c
+167.951 3.484 168.26 3.285 168.437 2.896 c
+168.69 3.285 169.04 3.484 169.48 3.484 c
+170.215 3.484 170.59 3.021 170.612 2.102 c
+170.612 -0.574 l
+169.965 -0.574 l
+169.965 2.043 l
+169.965 2.337 169.91 2.55 169.803 2.69 c
+169.705 2.826 169.532 2.896 169.289 2.896 c
+169.09 2.896 168.929 2.815 168.804 2.66 c
+168.687 2.514 168.616 2.322 168.598 2.087 c
+168.598 -0.574 l
+167.937 -0.574 l
+167.937 2.072 l
+167.937 2.62 167.716 2.896 167.276 2.896 c
+166.941 2.896 166.706 2.734 166.57 2.41 c
+166.57 -0.574 l
+165.923 -0.574 l
+165.923 3.41 l
+h
+173.008 -0.647 m
+172.508 -0.647 172.126 -0.5 171.862 -0.206 c
+171.597 0.087 171.465 0.521 171.465 1.103 c
+171.465 1.573 l
+171.465 2.167 171.59 2.634 171.847 2.969 c
+172.111 3.31 172.471 3.484 172.934 3.484 c
+173.393 3.484 173.736 3.329 173.963 3.027 c
+174.199 2.734 174.32 2.271 174.331 1.646 c
+174.331 1.22 l
+172.111 1.22 l
+172.111 1.132 l
+172.111 0.698 172.188 0.386 172.346 0.191 c
+172.512 0.004 172.743 -0.088 173.038 -0.088 c
+173.232 -0.088 173.405 -0.056 173.551 0.014 c
+173.699 0.091 173.835 0.209 173.963 0.367 c
+174.301 -0.044 l
+174.015 -0.449 173.585 -0.647 173.008 -0.647 c
+172.934 2.925 m
+172.659 2.925 172.456 2.829 172.332 2.645 c
+172.203 2.458 172.13 2.167 172.111 1.778 c
+173.684 1.778 l
+173.684 1.866 l
+173.662 2.248 173.596 2.516 173.478 2.674 c
+173.36 2.84 173.177 2.925 172.934 2.925 c
+176.756 2.792 m
+176.668 2.811 176.568 2.822 176.462 2.822 c
+176.128 2.822 175.893 2.638 175.756 2.278 c
+175.756 -0.574 l
+175.11 -0.574 l
+175.11 3.41 l
+175.742 3.41 l
+175.756 2.998 l
+175.933 3.322 176.175 3.484 176.491 3.484 c
+176.598 3.484 176.686 3.461 176.756 3.424 c
+h
+177.197 1.602 m
+177.197 2.219 177.308 2.682 177.535 2.998 c
+177.759 3.322 178.094 3.484 178.534 3.484 c
+178.935 3.484 179.24 3.307 179.446 2.954 c
+179.49 3.41 l
+180.078 3.41 l
+180.078 -0.618 l
+180.078 -1.106 179.949 -1.484 179.696 -1.75 c
+179.439 -2.014 179.086 -2.147 178.638 -2.147 c
+178.439 -2.147 178.218 -2.095 177.977 -1.999 c
+177.73 -1.9 177.549 -1.779 177.432 -1.632 c
+177.697 -1.191 l
+177.962 -1.455 178.259 -1.588 178.594 -1.588 c
+179.13 -1.588 179.406 -1.294 179.417 -0.706 c
+179.417 -0.177 l
+179.211 -0.493 178.91 -0.647 178.52 -0.647 c
+178.108 -0.647 177.785 -0.497 177.549 -0.191 c
+177.322 0.121 177.204 0.573 177.197 1.161 c
+h
+177.859 1.22 m
+177.859 0.779 177.921 0.448 178.05 0.235 c
+178.175 0.029 178.391 -0.073 178.696 -0.073 c
+179.02 -0.073 179.259 0.091 179.417 0.426 c
+179.417 2.41 l
+179.248 2.734 179.009 2.896 178.696 2.896 c
+178.403 2.896 178.185 2.792 178.05 2.587 c
+177.921 2.381 177.859 2.057 177.859 1.616 c
+h
+182.459 -0.647 m
+181.96 -0.647 181.578 -0.5 181.312 -0.206 c
+181.048 0.087 180.916 0.521 180.916 1.103 c
+180.916 1.573 l
+180.916 2.167 181.041 2.634 181.298 2.969 c
+181.563 3.31 181.923 3.484 182.386 3.484 c
+182.845 3.484 183.187 3.329 183.415 3.027 c
+183.65 2.734 183.772 2.271 183.782 1.646 c
+183.782 1.22 l
+181.563 1.22 l
+181.563 1.132 l
+181.563 0.698 181.64 0.386 181.798 0.191 c
+181.963 0.004 182.195 -0.088 182.488 -0.088 c
+182.683 -0.088 182.856 -0.056 183.003 0.014 c
+183.151 0.091 183.286 0.209 183.415 0.367 c
+183.753 -0.044 l
+183.466 -0.449 183.036 -0.647 182.459 -0.647 c
+182.386 2.925 m
+182.11 2.925 181.908 2.829 181.783 2.645 c
+181.655 2.458 181.582 2.167 181.563 1.778 c
+183.136 1.778 l
+183.136 1.866 l
+183.114 2.248 183.047 2.516 182.93 2.674 c
+182.812 2.84 182.629 2.925 182.386 2.925 c
+184.429 1.602 m
+184.429 2.208 184.539 2.674 184.767 2.998 c
+185.002 3.322 185.329 3.484 185.752 3.484 c
+186.134 3.484 186.432 3.326 186.648 3.013 c
+186.648 5.071 l
+187.296 5.071 l
+187.296 -0.574 l
+186.708 -0.574 l
+186.663 -0.148 l
+186.457 -0.482 186.153 -0.647 185.752 -0.647 c
+185.341 -0.647 185.017 -0.493 184.782 -0.177 c
+184.547 0.147 184.429 0.602 184.429 1.19 c
+h
+185.075 1.22 m
+185.075 0.779 185.138 0.448 185.267 0.235 c
+185.403 0.029 185.623 -0.073 185.929 -0.073 c
+186.251 -0.073 186.49 0.087 186.648 0.411 c
+186.648 2.425 l
+186.48 2.738 186.241 2.896 185.929 2.896 c
+185.623 2.896 185.403 2.792 185.267 2.587 c
+185.138 2.381 185.075 2.057 185.075 1.616 c
+h
+190.72 -0.574 -0.646 3.984 re
+190.764 4.453 m
+190.764 4.343 190.735 4.251 190.677 4.174 c
+190.617 4.104 190.521 4.072 190.397 4.072 c
+190.28 4.072 190.184 4.104 190.118 4.174 c
+190.059 4.251 190.029 4.343 190.029 4.453 c
+190.029 4.571 190.059 4.663 190.118 4.733 c
+190.184 4.81 190.28 4.85 190.397 4.85 c
+190.521 4.85 190.617 4.81 190.677 4.733 c
+190.735 4.652 190.764 4.56 190.764 4.453 c
+192.352 3.41 m
+192.366 2.969 l
+192.62 3.31 192.944 3.484 193.337 3.484 c
+194.043 3.484 194.399 3.013 194.409 2.072 c
+194.409 -0.574 l
+193.763 -0.574 l
+193.763 2.043 l
+193.763 2.356 193.708 2.576 193.601 2.705 c
+193.491 2.829 193.337 2.896 193.131 2.896 c
+192.973 2.896 192.826 2.84 192.69 2.734 c
+192.561 2.624 192.458 2.487 192.381 2.322 c
+192.381 -0.574 l
+191.735 -0.574 l
+191.735 3.41 l
+h
+196.233 4.365 m
+196.233 3.41 l
+196.835 3.41 l
+196.835 2.881 l
+196.233 2.881 l
+196.233 0.411 l
+196.233 0.253 196.254 0.135 196.306 0.058 c
+196.364 -0.023 196.453 -0.059 196.57 -0.059 c
+196.659 -0.059 196.747 -0.044 196.835 -0.015 c
+196.835 -0.574 l
+196.688 -0.621 196.534 -0.647 196.379 -0.647 c
+196.123 -0.647 195.928 -0.555 195.791 -0.368 c
+195.652 -0.184 195.585 0.077 195.585 0.411 c
+195.585 2.881 l
+194.983 2.881 l
+194.983 3.41 l
+195.585 3.41 l
+195.585 4.365 l
+h
+197.393 1.602 m
+197.393 2.179 197.53 2.634 197.806 2.969 c
+198.088 3.31 198.459 3.484 198.922 3.484 c
+199.381 3.484 199.749 3.314 200.025 2.984 c
+200.308 2.66 200.455 2.212 200.466 1.646 c
+200.466 1.22 l
+200.466 0.65 200.322 0.195 200.04 -0.148 c
+199.764 -0.482 199.396 -0.647 198.937 -0.647 c
+198.474 -0.647 198.103 -0.485 197.82 -0.162 c
+197.544 0.168 197.401 0.61 197.393 1.161 c
+h
+198.041 1.22 m
+198.041 0.816 198.118 0.5 198.276 0.264 c
+198.441 0.029 198.662 -0.088 198.937 -0.088 c
+199.503 -0.088 199.797 0.323 199.819 1.146 c
+199.819 1.602 l
+199.819 2.003 199.734 2.322 199.569 2.557 c
+199.411 2.8 199.194 2.925 198.922 2.925 c
+198.658 2.925 198.441 2.8 198.276 2.557 c
+198.118 2.322 198.041 2.003 198.041 1.602 c
+h
+f
+Q
+q 1 0 0 1 263.3007 391.1359 cm
+0 0 m
+-0.338 0.029 l
+-0.625 0.029 -0.816 -0.096 -0.911 -0.339 c
+-0.911 -2.97 l
+-1.955 -2.97 l
+-1.955 1.014 l
+-0.985 1.014 l
+-0.955 0.573 l
+-0.79 0.914 -0.558 1.087 -0.264 1.087 c
+-0.147 1.087 -0.055 1.065 0.015 1.028 c
+h
+2.072 -3.043 m
+1.544 -3.043 1.125 -2.889 0.823 -2.573 c
+0.53 -2.249 0.383 -1.79 0.383 -1.191 c
+0.383 -0.882 l
+0.383 -0.258 0.518 0.228 0.794 0.573 c
+1.066 0.914 1.459 1.087 1.97 1.087 c
+2.469 1.087 2.841 0.926 3.087 0.602 c
+3.341 0.278 3.473 -0.199 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.43 -1.617 1.492 -1.834 1.602 -1.97 c
+1.72 -2.11 1.9 -2.176 2.147 -2.176 c
+2.488 -2.176 2.778 -2.058 3.013 -1.823 c
+3.425 -2.455 l
+3.296 -2.631 3.109 -2.775 2.866 -2.881 c
+2.62 -2.988 2.356 -3.043 2.072 -3.043 c
+1.426 -0.603 m
+2.455 -0.603 l
+2.455 -0.5 l
+2.455 -0.265 2.415 -0.088 2.338 0.029 c
+2.267 0.154 2.139 0.22 1.955 0.22 c
+1.779 0.22 1.646 0.151 1.559 0.014 c
+1.478 -0.115 1.434 -0.32 1.426 -0.603 c
+4.307 -2.97 m
+4.307 0.22 l
+3.822 0.22 l
+3.822 1.014 l
+4.307 1.014 l
+4.307 1.367 l
+4.307 1.807 4.418 2.146 4.645 2.381 c
+4.881 2.624 5.197 2.748 5.6 2.748 c
+5.725 2.748 5.883 2.723 6.071 2.674 c
+6.071 1.851 l
+6.001 1.87 5.916 1.881 5.821 1.881 c
+5.505 1.881 5.351 1.697 5.351 1.337 c
+5.351 1.014 l
+5.968 1.014 l
+5.968 0.22 l
+5.351 0.22 l
+5.351 -2.97 l
+h
+f
+Q
+q 1 0 0 1 269.9893 388.5188 cm
+0 0 m
+0 0.118 0.033 0.214 0.103 0.294 c
+0.168 0.372 0.272 0.412 0.411 0.412 c
+0.558 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.202 0.735 -0.279 c
+0.665 -0.357 0.558 -0.397 0.411 -0.397 c
+0.272 -0.397 0.168 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.11 0 0 c
+f
+Q
+q 1 0 0 1 135.7129 380.1556 cm
+0 0 m
+-1.808 0 l
+-2.219 -1.397 l
+-2.91 -1.397 l
+-1.19 3.954 l
+-0.617 3.954 l
+1.118 -1.397 l
+0.426 -1.397 l
+h
+-1.631 0.588 m
+-0.176 0.588 l
+-0.897 3.013 l
+h
+f
+Q
+q 1 0 0 1 141.0347 381.7285 cm
+0 0 m
+-0.339 0.029 l
+-0.625 0.029 -0.817 -0.096 -0.912 -0.339 c
+-0.912 -2.97 l
+-1.956 -2.97 l
+-1.956 1.014 l
+-0.985 1.014 l
+-0.956 0.573 l
+-0.79 0.914 -0.559 1.087 -0.265 1.087 c
+-0.148 1.087 -0.056 1.065 0.014 1.028 c
+h
+2.072 -3.043 m
+1.543 -3.043 1.124 -2.889 0.823 -2.573 c
+0.529 -2.249 0.382 -1.79 0.382 -1.191 c
+0.382 -0.882 l
+0.382 -0.258 0.517 0.228 0.793 0.573 c
+1.065 0.914 1.458 1.087 1.969 1.087 c
+2.469 1.087 2.84 0.926 3.087 0.602 c
+3.34 0.278 3.472 -0.198 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.429 -1.617 1.492 -1.834 1.602 -1.97 c
+1.72 -2.11 1.899 -2.176 2.146 -2.176 c
+2.487 -2.176 2.778 -2.058 3.013 -1.823 c
+3.424 -2.455 l
+3.295 -2.631 3.108 -2.775 2.865 -2.881 c
+2.62 -2.988 2.355 -3.043 2.072 -3.043 c
+1.425 -0.603 m
+2.454 -0.603 l
+2.454 -0.5 l
+2.454 -0.265 2.414 -0.088 2.337 0.029 c
+2.267 0.154 2.138 0.22 1.955 0.22 c
+1.778 0.22 1.646 0.151 1.558 0.014 c
+1.477 -0.115 1.433 -0.32 1.425 -0.603 c
+4.307 -2.97 m
+4.307 0.22 l
+3.821 0.22 l
+3.821 1.014 l
+4.307 1.014 l
+4.307 1.367 l
+4.307 1.807 4.417 2.146 4.644 2.381 c
+4.88 2.624 5.196 2.748 5.6 2.748 c
+5.725 2.748 5.882 2.723 6.071 2.675 c
+6.071 1.851 l
+6 1.87 5.916 1.882 5.82 1.882 c
+5.504 1.882 5.35 1.697 5.35 1.337 c
+5.35 1.014 l
+5.967 1.014 l
+5.967 0.22 l
+5.35 0.22 l
+5.35 -2.97 l
+h
+f
+Q
+q 1 0 0 1 150.7798 379.244 cm
+0 0 m
+0.214 0 0.386 0.062 0.515 0.191 c
+0.65 0.327 0.723 0.518 0.735 0.764 c
+1.352 0.764 l
+1.33 0.382 1.194 0.062 0.941 -0.191 c
+0.684 -0.437 0.371 -0.559 0 -0.559 c
+-0.492 -0.559 -0.867 -0.408 -1.132 -0.103 c
+-1.389 0.21 -1.514 0.676 -1.514 1.294 c
+-1.514 1.735 l
+-1.514 2.329 -1.389 2.786 -1.132 3.102 c
+-0.867 3.414 -0.492 3.572 0 3.572 c
+0.401 3.572 0.721 3.439 0.956 3.175 c
+1.198 2.917 1.33 2.572 1.352 2.132 c
+0.735 2.132 l
+0.713 2.425 0.64 2.645 0.515 2.793 c
+0.397 2.94 0.224 3.013 0 3.013 c
+-0.294 3.013 -0.511 2.914 -0.647 2.72 c
+-0.786 2.531 -0.86 2.223 -0.867 1.793 c
+-0.867 1.278 l
+-0.867 0.808 -0.802 0.474 -0.661 0.279 c
+-0.515 0.092 -0.294 0 0 0 c
+4.145 -0.485 m
+4.104 -0.397 4.079 -0.25 4.072 -0.044 c
+3.836 -0.389 3.543 -0.559 3.19 -0.559 c
+2.826 -0.559 2.543 -0.463 2.337 -0.264 c
+2.138 -0.059 2.043 0.228 2.043 0.603 c
+2.043 1.003 2.179 1.323 2.454 1.558 c
+2.726 1.801 3.102 1.926 3.572 1.926 c
+4.056 1.926 l
+4.056 2.352 l
+4.056 2.587 4.002 2.753 3.896 2.851 c
+3.785 2.958 3.623 3.013 3.41 3.013 c
+3.212 3.013 3.05 2.955 2.925 2.837 c
+2.807 2.72 2.749 2.572 2.749 2.396 c
+2.102 2.396 l
+2.102 2.591 2.161 2.782 2.278 2.969 c
+2.404 3.152 2.565 3.3 2.763 3.41 c
+2.969 3.516 3.197 3.572 3.454 3.572 c
+3.855 3.572 4.16 3.468 4.366 3.263 c
+4.579 3.057 4.692 2.763 4.704 2.381 c
+4.704 0.368 l
+4.704 0.062 4.74 -0.202 4.821 -0.426 c
+4.821 -0.485 l
+h
+3.278 0.029 m
+3.443 0.029 3.594 0.073 3.734 0.162 c
+3.881 0.25 3.987 0.36 4.056 0.5 c
+4.056 1.44 l
+3.69 1.44 l
+3.373 1.44 3.131 1.371 2.955 1.234 c
+2.778 1.106 2.69 0.918 2.69 0.676 c
+2.69 0.448 2.734 0.283 2.822 0.176 c
+2.911 0.077 3.061 0.029 3.278 0.029 c
+6.321 3.499 m
+6.335 3.057 l
+6.589 3.399 6.913 3.572 7.306 3.572 c
+8.011 3.572 8.367 3.102 8.378 2.161 c
+8.378 -0.485 l
+7.732 -0.485 l
+7.732 2.132 l
+7.732 2.444 7.676 2.664 7.57 2.793 c
+7.46 2.917 7.306 2.984 7.1 2.984 c
+6.942 2.984 6.795 2.928 6.659 2.822 c
+6.53 2.712 6.427 2.576 6.35 2.41 c
+6.35 -0.485 l
+5.703 -0.485 l
+5.703 3.499 l
+h
+13.949 1.309 m
+13.949 0.69 13.835 0.224 13.612 -0.088 c
+13.394 -0.405 13.071 -0.559 12.641 -0.559 c
+12.218 -0.559 11.906 -0.378 11.7 -0.015 c
+11.671 -0.485 l
+11.069 -0.485 l
+11.069 5.159 l
+11.715 5.159 l
+11.715 3.057 l
+11.929 3.399 12.237 3.572 12.641 3.572 c
+13.071 3.572 13.394 3.414 13.612 3.102 c
+13.835 2.797 13.949 2.329 13.949 1.705 c
+h
+13.303 1.69 m
+13.303 2.161 13.232 2.491 13.097 2.69 c
+12.968 2.884 12.758 2.984 12.465 2.984 c
+12.13 2.984 11.881 2.8 11.715 2.44 c
+11.715 0.559 l
+11.881 0.195 12.134 0.015 12.48 0.015 c
+12.773 0.015 12.983 0.118 13.111 0.324 c
+13.236 0.529 13.303 0.845 13.303 1.278 c
+h
+16.213 -0.559 m
+15.713 -0.559 15.331 -0.412 15.067 -0.118 c
+14.802 0.176 14.67 0.61 14.67 1.191 c
+14.67 1.661 l
+14.67 2.256 14.795 2.722 15.052 3.057 c
+15.316 3.399 15.676 3.572 16.139 3.572 c
+16.598 3.572 16.941 3.418 17.168 3.116 c
+17.404 2.822 17.525 2.359 17.536 1.735 c
+17.536 1.309 l
+15.316 1.309 l
+15.316 1.22 l
+15.316 0.786 15.393 0.474 15.551 0.279 c
+15.717 0.092 15.948 0 16.243 0 c
+16.438 0 16.61 0.033 16.756 0.103 c
+16.904 0.18 17.04 0.297 17.168 0.455 c
+17.506 0.044 l
+17.22 -0.36 16.79 -0.559 16.213 -0.559 c
+16.139 3.013 m
+15.864 3.013 15.661 2.917 15.537 2.734 c
+15.408 2.547 15.335 2.256 15.316 1.866 c
+16.889 1.866 l
+16.889 1.955 l
+16.867 2.337 16.801 2.605 16.683 2.763 c
+16.565 2.928 16.382 3.013 16.139 3.013 c
+21.46 -0.559 m
+20.961 -0.559 20.579 -0.412 20.314 -0.118 c
+20.049 0.176 19.917 0.61 19.917 1.191 c
+19.917 1.661 l
+19.917 2.256 20.042 2.722 20.299 3.057 c
+20.564 3.399 20.924 3.572 21.387 3.572 c
+21.847 3.572 22.188 3.418 22.416 3.116 c
+22.651 2.822 22.772 2.359 22.784 1.735 c
+22.784 1.309 l
+20.564 1.309 l
+20.564 1.22 l
+20.564 0.786 20.641 0.474 20.799 0.279 c
+20.964 0.092 21.196 0 21.49 0 c
+21.685 0 21.857 0.033 22.005 0.103 c
+22.152 0.18 22.287 0.297 22.416 0.455 c
+22.754 0.044 l
+22.468 -0.36 22.038 -0.559 21.46 -0.559 c
+21.387 3.013 m
+21.111 3.013 20.91 2.917 20.785 2.734 c
+20.656 2.547 20.582 2.256 20.564 1.866 c
+22.137 1.866 l
+22.137 1.955 l
+22.115 2.337 22.048 2.605 21.931 2.763 c
+21.813 2.928 21.629 3.013 21.387 3.013 c
+23.607 -0.133 m
+23.607 -0.015 23.64 0.081 23.709 0.162 c
+23.775 0.239 23.879 0.279 24.018 0.279 c
+24.165 0.279 24.272 0.239 24.342 0.162 c
+24.419 0.081 24.459 -0.015 24.459 -0.133 c
+24.459 -0.243 24.419 -0.335 24.342 -0.412 c
+24.272 -0.489 24.165 -0.53 24.018 -0.53 c
+23.879 -0.53 23.775 -0.489 23.709 -0.412 c
+23.64 -0.335 23.607 -0.243 23.607 -0.133 c
+25.415 1.69 m
+25.415 2.308 25.525 2.77 25.753 3.087 c
+25.977 3.41 26.312 3.572 26.752 3.572 c
+27.153 3.572 27.457 3.395 27.663 3.042 c
+27.708 3.499 l
+28.296 3.499 l
+28.296 -0.53 l
+28.296 -1.018 28.167 -1.396 27.914 -1.661 c
+27.656 -1.926 27.303 -2.058 26.855 -2.058 c
+26.657 -2.058 26.436 -2.007 26.194 -1.911 c
+25.947 -1.812 25.768 -1.691 25.65 -1.544 c
+25.915 -1.103 l
+26.179 -1.367 26.476 -1.5 26.811 -1.5 c
+27.347 -1.5 27.623 -1.205 27.634 -0.617 c
+27.634 -0.088 l
+27.428 -0.405 27.127 -0.559 26.738 -0.559 c
+26.326 -0.559 26.003 -0.408 25.768 -0.103 c
+25.539 0.21 25.422 0.661 25.415 1.249 c
+h
+26.076 1.309 m
+26.076 0.867 26.138 0.536 26.267 0.324 c
+26.392 0.118 26.609 0.015 26.914 0.015 c
+27.237 0.015 27.476 0.18 27.634 0.515 c
+27.634 2.499 l
+27.465 2.822 27.226 2.984 26.914 2.984 c
+26.62 2.984 26.403 2.881 26.267 2.675 c
+26.138 2.469 26.076 2.146 26.076 1.705 c
+h
+29.296 -0.133 m
+29.296 -0.015 29.328 0.081 29.398 0.162 c
+29.464 0.239 29.567 0.279 29.707 0.279 c
+29.853 0.279 29.961 0.239 30.03 0.162 c
+30.107 0.081 30.148 -0.015 30.148 -0.133 c
+30.148 -0.243 30.107 -0.335 30.03 -0.412 c
+29.961 -0.489 29.853 -0.53 29.707 -0.53 c
+29.567 -0.53 29.464 -0.489 29.398 -0.412 c
+29.328 -0.335 29.296 -0.243 29.296 -0.133 c
+34.998 -0.485 m
+34.958 -0.397 34.932 -0.25 34.925 -0.044 c
+34.69 -0.389 34.395 -0.559 34.043 -0.559 c
+33.679 -0.559 33.396 -0.463 33.19 -0.264 c
+32.992 -0.059 32.897 0.228 32.897 0.603 c
+32.897 1.003 33.032 1.323 33.308 1.558 c
+33.58 1.801 33.955 1.926 34.425 1.926 c
+34.91 1.926 l
+34.91 2.352 l
+34.91 2.587 34.855 2.753 34.748 2.851 c
+34.638 2.958 34.476 3.013 34.264 3.013 c
+34.065 3.013 33.903 2.955 33.778 2.837 c
+33.661 2.72 33.602 2.572 33.602 2.396 c
+32.955 2.396 l
+32.955 2.591 33.014 2.782 33.132 2.969 c
+33.256 3.152 33.418 3.3 33.616 3.41 c
+33.822 3.516 34.05 3.572 34.308 3.572 c
+34.708 3.572 35.013 3.468 35.218 3.263 c
+35.432 3.057 35.546 2.763 35.557 2.381 c
+35.557 0.368 l
+35.557 0.062 35.594 -0.202 35.675 -0.426 c
+35.675 -0.485 l
+h
+34.131 0.029 m
+34.297 0.029 34.447 0.073 34.587 0.162 c
+34.734 0.25 34.84 0.36 34.91 0.5 c
+34.91 1.44 l
+34.543 1.44 l
+34.227 1.44 33.984 1.371 33.807 1.234 c
+33.631 1.106 33.543 0.918 33.543 0.676 c
+33.543 0.448 33.587 0.283 33.676 0.176 c
+33.764 0.077 33.915 0.029 34.131 0.029 c
+41.157 1.309 m
+41.157 0.69 41.044 0.224 40.82 -0.088 c
+40.602 -0.405 40.279 -0.559 39.849 -0.559 c
+39.426 -0.559 39.114 -0.378 38.908 -0.015 c
+38.879 -0.485 l
+38.276 -0.485 l
+38.276 5.159 l
+38.923 5.159 l
+38.923 3.057 l
+39.136 3.399 39.445 3.572 39.849 3.572 c
+40.279 3.572 40.602 3.414 40.82 3.102 c
+41.044 2.797 41.157 2.329 41.157 1.705 c
+h
+40.51 1.69 m
+40.51 2.161 40.441 2.491 40.305 2.69 c
+40.176 2.884 39.966 2.984 39.673 2.984 c
+39.338 2.984 39.089 2.8 38.923 2.44 c
+38.923 0.559 l
+39.089 0.195 39.342 0.015 39.687 0.015 c
+39.981 0.015 40.191 0.118 40.319 0.324 c
+40.444 0.529 40.51 0.845 40.51 1.278 c
+h
+43.642 2.881 m
+43.553 2.899 43.454 2.911 43.347 2.911 c
+43.013 2.911 42.778 2.726 42.642 2.367 c
+42.642 -0.485 l
+41.996 -0.485 l
+41.996 3.499 l
+42.627 3.499 l
+42.642 3.087 l
+42.819 3.41 43.06 3.572 43.377 3.572 c
+43.484 3.572 43.571 3.549 43.642 3.513 c
+h
+46.185 -0.485 m
+46.144 -0.397 46.118 -0.25 46.111 -0.044 c
+45.876 -0.389 45.582 -0.559 45.229 -0.559 c
+44.865 -0.559 44.583 -0.463 44.377 -0.264 c
+44.178 -0.059 44.082 0.228 44.082 0.603 c
+44.082 1.003 44.219 1.323 44.494 1.558 c
+44.766 1.801 45.14 1.926 45.611 1.926 c
+46.096 1.926 l
+46.096 2.352 l
+46.096 2.587 46.041 2.753 45.934 2.851 c
+45.824 2.958 45.663 3.013 45.449 3.013 c
+45.251 3.013 45.09 2.955 44.965 2.837 c
+44.847 2.72 44.788 2.572 44.788 2.396 c
+44.141 2.396 l
+44.141 2.591 44.2 2.782 44.317 2.969 c
+44.442 3.152 44.604 3.3 44.803 3.41 c
+45.009 3.516 45.236 3.572 45.493 3.572 c
+45.894 3.572 46.199 3.468 46.405 3.263 c
+46.618 3.057 46.732 2.763 46.743 2.381 c
+46.743 0.368 l
+46.743 0.062 46.78 -0.202 46.86 -0.426 c
+46.86 -0.485 l
+h
+45.317 0.029 m
+45.483 0.029 45.633 0.073 45.773 0.162 c
+45.919 0.25 46.027 0.36 46.096 0.5 c
+46.096 1.44 l
+45.728 1.44 l
+45.412 1.44 45.171 1.371 44.994 1.234 c
+44.818 1.106 44.729 0.918 44.729 0.676 c
+44.729 0.448 44.774 0.283 44.861 0.176 c
+44.949 0.077 45.1 0.029 45.317 0.029 c
+48.36 3.499 m
+48.375 3.057 l
+48.628 3.399 48.951 3.572 49.345 3.572 c
+50.05 3.572 50.407 3.102 50.418 2.161 c
+50.418 -0.485 l
+49.771 -0.485 l
+49.771 2.132 l
+49.771 2.444 49.716 2.664 49.609 2.793 c
+49.499 2.917 49.345 2.984 49.139 2.984 c
+48.981 2.984 48.834 2.928 48.698 2.822 c
+48.569 2.712 48.466 2.576 48.389 2.41 c
+48.389 -0.485 l
+47.743 -0.485 l
+47.743 3.499 l
+h
+52.77 0 m
+52.982 0 53.156 0.062 53.284 0.191 c
+53.42 0.327 53.493 0.518 53.505 0.764 c
+54.122 0.764 l
+54.1 0.382 53.964 0.062 53.711 -0.191 c
+53.453 -0.437 53.14 -0.559 52.77 -0.559 c
+52.277 -0.559 51.902 -0.408 51.638 -0.103 c
+51.38 0.21 51.255 0.676 51.255 1.294 c
+51.255 1.735 l
+51.255 2.329 51.38 2.786 51.638 3.102 c
+51.902 3.414 52.277 3.572 52.77 3.572 c
+53.17 3.572 53.49 3.439 53.725 3.175 c
+53.967 2.917 54.1 2.572 54.122 2.132 c
+53.505 2.132 l
+53.482 2.425 53.409 2.645 53.284 2.793 c
+53.167 2.94 52.994 3.013 52.77 3.013 c
+52.475 3.013 52.259 2.914 52.123 2.72 c
+51.983 2.531 51.91 2.223 51.902 1.793 c
+51.902 1.278 l
+51.902 0.808 51.968 0.474 52.109 0.279 c
+52.255 0.092 52.475 0 52.77 0 c
+55.519 3.087 m
+55.772 3.41 56.092 3.572 56.474 3.572 c
+57.179 3.572 57.536 3.102 57.547 2.161 c
+57.547 -0.485 l
+56.9 -0.485 l
+56.9 2.132 l
+56.9 2.444 56.845 2.664 56.738 2.793 c
+56.628 2.917 56.474 2.984 56.268 2.984 c
+56.109 2.984 55.963 2.928 55.827 2.822 c
+55.698 2.712 55.596 2.576 55.519 2.41 c
+55.519 -0.485 l
+54.871 -0.485 l
+54.871 5.159 l
+55.519 5.159 l
+h
+60.839 3.499 m
+60.854 3.057 l
+61.108 3.399 61.431 3.572 61.824 3.572 c
+62.53 3.572 62.887 3.102 62.897 2.161 c
+62.897 -0.485 l
+62.251 -0.485 l
+62.251 2.132 l
+62.251 2.444 62.195 2.664 62.089 2.793 c
+61.979 2.917 61.824 2.984 61.618 2.984 c
+61.46 2.984 61.314 2.928 61.177 2.822 c
+61.048 2.712 60.946 2.576 60.869 2.41 c
+60.869 -0.485 l
+60.222 -0.485 l
+60.222 3.499 l
+h
+65.91 -0.485 m
+65.87 -0.397 65.844 -0.25 65.837 -0.044 c
+65.602 -0.389 65.308 -0.559 64.955 -0.559 c
+64.591 -0.559 64.308 -0.463 64.103 -0.264 c
+63.904 -0.059 63.808 0.228 63.808 0.603 c
+63.808 1.003 63.945 1.323 64.221 1.558 c
+64.492 1.801 64.867 1.926 65.337 1.926 c
+65.823 1.926 l
+65.823 2.352 l
+65.823 2.587 65.767 2.753 65.661 2.851 c
+65.551 2.958 65.389 3.013 65.175 3.013 c
+64.977 3.013 64.815 2.955 64.691 2.837 c
+64.573 2.72 64.514 2.572 64.514 2.396 c
+63.868 2.396 l
+63.868 2.591 63.926 2.782 64.044 2.969 c
+64.169 3.152 64.331 3.3 64.529 3.41 c
+64.734 3.516 64.963 3.572 65.22 3.572 c
+65.62 3.572 65.925 3.468 66.131 3.263 c
+66.344 3.057 66.458 2.763 66.469 2.381 c
+66.469 0.368 l
+66.469 0.062 66.506 -0.202 66.586 -0.426 c
+66.586 -0.485 l
+h
+65.044 0.029 m
+65.208 0.029 65.36 0.073 65.499 0.162 c
+65.646 0.25 65.752 0.36 65.823 0.5 c
+65.823 1.44 l
+65.455 1.44 l
+65.139 1.44 64.896 1.371 64.72 1.234 c
+64.543 1.106 64.456 0.918 64.456 0.676 c
+64.456 0.448 64.499 0.283 64.587 0.176 c
+64.676 0.077 64.826 0.029 65.044 0.029 c
+68.086 3.499 m
+68.101 3.131 l
+68.343 3.425 68.663 3.572 69.056 3.572 c
+69.497 3.572 69.806 3.373 69.983 2.984 c
+70.236 3.373 70.585 3.572 71.026 3.572 c
+71.761 3.572 72.136 3.109 72.158 2.19 c
+72.158 -0.485 l
+71.511 -0.485 l
+71.511 2.132 l
+71.511 2.425 71.456 2.639 71.349 2.778 c
+71.25 2.914 71.078 2.984 70.835 2.984 c
+70.636 2.984 70.475 2.903 70.349 2.749 c
+70.232 2.602 70.162 2.41 70.143 2.175 c
+70.143 -0.485 l
+69.482 -0.485 l
+69.482 2.161 l
+69.482 2.708 69.262 2.984 68.821 2.984 c
+68.487 2.984 68.252 2.822 68.115 2.499 c
+68.115 -0.485 l
+67.469 -0.485 l
+67.469 3.499 l
+h
+74.554 -0.559 m
+74.054 -0.559 73.671 -0.412 73.407 -0.118 c
+73.142 0.176 73.01 0.61 73.01 1.191 c
+73.01 1.661 l
+73.01 2.256 73.135 2.722 73.393 3.057 c
+73.657 3.399 74.017 3.572 74.48 3.572 c
+74.939 3.572 75.281 3.418 75.509 3.116 c
+75.745 2.822 75.865 2.359 75.876 1.735 c
+75.876 1.309 l
+73.657 1.309 l
+73.657 1.22 l
+73.657 0.786 73.734 0.474 73.892 0.279 c
+74.058 0.092 74.289 0 74.583 0 c
+74.777 0 74.951 0.033 75.097 0.103 c
+75.244 0.18 75.381 0.297 75.509 0.455 c
+75.847 0.044 l
+75.56 -0.36 75.13 -0.559 74.554 -0.559 c
+74.48 3.013 m
+74.205 3.013 74.002 2.917 73.877 2.734 c
+73.748 2.547 73.675 2.256 73.657 1.866 c
+75.23 1.866 l
+75.23 1.955 l
+75.207 2.337 75.142 2.605 75.024 2.763 c
+74.906 2.928 74.723 3.013 74.48 3.013 c
+78.243 1.69 m
+78.243 2.267 78.379 2.722 78.654 3.057 c
+78.937 3.399 79.309 3.572 79.772 3.572 c
+80.231 3.572 80.599 3.403 80.874 3.072 c
+81.157 2.749 81.304 2.3 81.315 1.735 c
+81.315 1.309 l
+81.315 0.738 81.172 0.283 80.889 -0.059 c
+80.613 -0.393 80.246 -0.559 79.786 -0.559 c
+79.323 -0.559 78.952 -0.397 78.669 -0.073 c
+78.394 0.257 78.251 0.698 78.243 1.249 c
+h
+78.889 1.309 m
+78.889 0.904 78.967 0.588 79.125 0.353 c
+79.29 0.118 79.51 0 79.786 0 c
+80.352 0 80.647 0.411 80.668 1.234 c
+80.668 1.69 l
+80.668 2.091 80.584 2.41 80.418 2.645 c
+80.26 2.888 80.044 3.013 79.772 3.013 c
+79.508 3.013 79.29 2.888 79.125 2.645 c
+78.967 2.41 78.889 2.091 78.889 1.69 c
+h
+83.799 2.881 m
+83.711 2.899 83.612 2.911 83.506 2.911 c
+83.171 2.911 82.936 2.726 82.8 2.367 c
+82.8 -0.485 l
+82.153 -0.485 l
+82.153 3.499 l
+82.785 3.499 l
+82.8 3.087 l
+82.976 3.41 83.219 3.572 83.535 3.572 c
+83.641 3.572 83.73 3.549 83.799 3.513 c
+h
+88.209 -0.485 m
+88.169 -0.397 88.143 -0.25 88.135 -0.044 c
+87.9 -0.389 87.606 -0.559 87.254 -0.559 c
+86.89 -0.559 86.606 -0.463 86.401 -0.264 c
+86.203 -0.059 86.107 0.228 86.107 0.603 c
+86.107 1.003 86.243 1.323 86.519 1.558 c
+86.791 1.801 87.165 1.926 87.636 1.926 c
+88.121 1.926 l
+88.121 2.352 l
+88.121 2.587 88.065 2.753 87.959 2.851 c
+87.849 2.958 87.687 3.013 87.474 3.013 c
+87.275 3.013 87.113 2.955 86.989 2.837 c
+86.872 2.72 86.812 2.572 86.812 2.396 c
+86.166 2.396 l
+86.166 2.591 86.224 2.782 86.342 2.969 c
+86.467 3.152 86.629 3.3 86.827 3.41 c
+87.033 3.516 87.261 3.572 87.518 3.572 c
+87.919 3.572 88.223 3.468 88.43 3.263 c
+88.643 3.057 88.757 2.763 88.767 2.381 c
+88.767 0.368 l
+88.767 0.062 88.804 -0.202 88.885 -0.426 c
+88.885 -0.485 l
+h
+87.342 0.029 m
+87.507 0.029 87.658 0.073 87.797 0.162 c
+87.944 0.25 88.051 0.36 88.121 0.5 c
+88.121 1.44 l
+87.753 1.44 l
+87.437 1.44 87.194 1.371 87.018 1.234 c
+86.842 1.106 86.754 0.918 86.754 0.676 c
+86.754 0.448 86.798 0.283 86.886 0.176 c
+86.974 0.077 87.125 0.029 87.342 0.029 c
+92.339 4.453 m
+92.339 3.499 l
+92.942 3.499 l
+92.942 2.969 l
+92.339 2.969 l
+92.339 0.5 l
+92.339 0.341 92.362 0.224 92.413 0.147 c
+92.472 0.066 92.56 0.029 92.678 0.029 c
+92.765 0.029 92.854 0.044 92.942 0.073 c
+92.942 -0.485 l
+92.795 -0.532 92.641 -0.559 92.486 -0.559 c
+92.229 -0.559 92.034 -0.467 91.898 -0.279 c
+91.759 -0.096 91.693 0.166 91.693 0.5 c
+91.693 2.969 l
+91.09 2.969 l
+91.09 3.499 l
+91.693 3.499 l
+91.693 4.453 l
+h
+95.749 -0.485 m
+95.709 -0.397 95.684 -0.25 95.676 -0.044 c
+95.441 -0.389 95.147 -0.559 94.795 -0.559 c
+94.43 -0.559 94.147 -0.463 93.941 -0.264 c
+93.743 -0.059 93.648 0.228 93.648 0.603 c
+93.648 1.003 93.783 1.323 94.059 1.558 c
+94.331 1.801 94.706 1.926 95.176 1.926 c
+95.661 1.926 l
+95.661 2.352 l
+95.661 2.587 95.606 2.753 95.5 2.851 c
+95.389 2.958 95.228 3.013 95.015 3.013 c
+94.816 3.013 94.654 2.955 94.529 2.837 c
+94.412 2.72 94.353 2.572 94.353 2.396 c
+93.706 2.396 l
+93.706 2.591 93.765 2.782 93.883 2.969 c
+94.008 3.152 94.169 3.3 94.367 3.41 c
+94.573 3.516 94.801 3.572 95.059 3.572 c
+95.46 3.572 95.764 3.468 95.97 3.263 c
+96.183 3.057 96.297 2.763 96.308 2.381 c
+96.308 0.368 l
+96.308 0.062 96.345 -0.202 96.426 -0.426 c
+96.426 -0.485 l
+h
+94.882 0.029 m
+95.048 0.029 95.198 0.073 95.338 0.162 c
+95.485 0.25 95.591 0.36 95.661 0.5 c
+95.661 1.44 l
+95.294 1.44 l
+94.978 1.44 94.735 1.371 94.559 1.234 c
+94.383 1.106 94.294 0.918 94.294 0.676 c
+94.294 0.448 94.338 0.283 94.427 0.176 c
+94.515 0.077 94.666 0.029 94.882 0.029 c
+97.176 1.69 m
+97.176 2.308 97.286 2.77 97.513 3.087 c
+97.737 3.41 98.072 3.572 98.513 3.572 c
+98.913 3.572 99.219 3.395 99.424 3.042 c
+99.468 3.499 l
+100.056 3.499 l
+100.056 -0.53 l
+100.056 -1.018 99.928 -1.396 99.674 -1.661 c
+99.417 -1.926 99.065 -2.058 98.616 -2.058 c
+98.417 -2.058 98.197 -2.007 97.954 -1.911 c
+97.708 -1.812 97.528 -1.691 97.411 -1.544 c
+97.675 -1.103 l
+97.939 -1.367 98.238 -1.5 98.572 -1.5 c
+99.108 -1.5 99.383 -1.205 99.395 -0.617 c
+99.395 -0.088 l
+99.189 -0.405 98.888 -0.559 98.498 -0.559 c
+98.087 -0.559 97.764 -0.408 97.528 -0.103 c
+97.301 0.21 97.183 0.661 97.176 1.249 c
+h
+97.837 1.309 m
+97.837 0.867 97.899 0.536 98.028 0.324 c
+98.153 0.118 98.369 0.015 98.675 0.015 c
+98.998 0.015 99.237 0.18 99.395 0.515 c
+99.395 2.499 l
+99.226 2.822 98.987 2.984 98.675 2.984 c
+98.381 2.984 98.164 2.881 98.028 2.675 c
+97.899 2.469 97.837 2.146 97.837 1.705 c
+h
+103.349 3.499 m
+103.364 3.057 l
+103.617 3.399 103.94 3.572 104.334 3.572 c
+105.039 3.572 105.396 3.102 105.407 2.161 c
+105.407 -0.485 l
+104.76 -0.485 l
+104.76 2.132 l
+104.76 2.444 104.705 2.664 104.598 2.793 c
+104.488 2.917 104.334 2.984 104.128 2.984 c
+103.97 2.984 103.823 2.928 103.687 2.822 c
+103.558 2.712 103.456 2.576 103.379 2.41 c
+103.379 -0.485 l
+102.732 -0.485 l
+102.732 3.499 l
+h
+108.42 -0.485 m
+108.38 -0.397 108.354 -0.25 108.347 -0.044 c
+108.112 -0.389 107.817 -0.559 107.464 -0.559 c
+107.101 -0.559 106.818 -0.463 106.612 -0.264 c
+106.414 -0.059 106.319 0.228 106.319 0.603 c
+106.319 1.003 106.454 1.323 106.73 1.558 c
+107.002 1.801 107.377 1.926 107.847 1.926 c
+108.332 1.926 l
+108.332 2.352 l
+108.332 2.587 108.277 2.753 108.17 2.851 c
+108.06 2.958 107.898 3.013 107.686 3.013 c
+107.487 3.013 107.325 2.955 107.2 2.837 c
+107.082 2.72 107.024 2.572 107.024 2.396 c
+106.377 2.396 l
+106.377 2.591 106.436 2.782 106.554 2.969 c
+106.678 3.152 106.84 3.3 107.038 3.41 c
+107.244 3.516 107.472 3.572 107.73 3.572 c
+108.13 3.572 108.435 3.468 108.64 3.263 c
+108.854 3.057 108.968 2.763 108.979 2.381 c
+108.979 0.368 l
+108.979 0.062 109.016 -0.202 109.097 -0.426 c
+109.097 -0.485 l
+h
+107.553 0.029 m
+107.718 0.029 107.869 0.073 108.008 0.162 c
+108.156 0.25 108.262 0.36 108.332 0.5 c
+108.332 1.44 l
+107.965 1.44 l
+107.649 1.44 107.406 1.371 107.229 1.234 c
+107.053 1.106 106.965 0.918 106.965 0.676 c
+106.965 0.448 107.009 0.283 107.098 0.176 c
+107.185 0.077 107.336 0.029 107.553 0.029 c
+110.595 3.499 m
+110.61 3.131 l
+110.853 3.425 111.173 3.572 111.566 3.572 c
+112.006 3.572 112.316 3.373 112.492 2.984 c
+112.746 3.373 113.095 3.572 113.535 3.572 c
+114.271 3.572 114.645 3.109 114.668 2.19 c
+114.668 -0.485 l
+114.02 -0.485 l
+114.02 2.132 l
+114.02 2.425 113.965 2.639 113.859 2.778 c
+113.76 2.914 113.587 2.984 113.344 2.984 c
+113.146 2.984 112.984 2.903 112.86 2.749 c
+112.742 2.602 112.671 2.41 112.654 2.175 c
+112.654 -0.485 l
+111.992 -0.485 l
+111.992 2.161 l
+111.992 2.708 111.771 2.984 111.331 2.984 c
+110.996 2.984 110.761 2.822 110.625 2.499 c
+110.625 -0.485 l
+109.978 -0.485 l
+109.978 3.499 l
+h
+117.063 -0.559 m
+116.563 -0.559 116.181 -0.412 115.917 -0.118 c
+115.652 0.176 115.52 0.61 115.52 1.191 c
+115.52 1.661 l
+115.52 2.256 115.645 2.722 115.902 3.057 c
+116.166 3.399 116.527 3.572 116.989 3.572 c
+117.449 3.572 117.791 3.418 118.019 3.116 c
+118.254 2.822 118.375 2.359 118.386 1.735 c
+118.386 1.309 l
+116.166 1.309 l
+116.166 1.22 l
+116.166 0.786 116.243 0.474 116.401 0.279 c
+116.567 0.092 116.798 0 117.093 0 c
+117.288 0 117.46 0.033 117.607 0.103 c
+117.754 0.18 117.89 0.297 118.019 0.455 c
+118.356 0.044 l
+118.07 -0.36 117.64 -0.559 117.063 -0.559 c
+116.989 3.013 m
+116.714 3.013 116.512 2.917 116.387 2.734 c
+116.258 2.547 116.185 2.256 116.166 1.866 c
+117.739 1.866 l
+117.739 1.955 l
+117.718 2.337 117.651 2.605 117.533 2.763 c
+117.416 2.928 117.232 3.013 116.989 3.013 c
+119.21 -0.133 m
+119.21 -0.015 119.242 0.081 119.312 0.162 c
+119.378 0.239 119.481 0.279 119.621 0.279 c
+119.767 0.279 119.875 0.239 119.944 0.162 c
+120.021 0.081 120.062 -0.015 120.062 -0.133 c
+120.062 -0.243 120.021 -0.335 119.944 -0.412 c
+119.875 -0.489 119.767 -0.53 119.621 -0.53 c
+119.481 -0.53 119.378 -0.489 119.312 -0.412 c
+119.242 -0.335 119.21 -0.243 119.21 -0.133 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 373.53 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 366.6908 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.993 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+23.221 -0.646 m
+24.353 -0.646 l
+24.353 -1.264 l
+21.045 -1.264 l
+21.045 -0.646 l
+22.31 -0.646 l
+22.31 2.896 l
+21.384 2.896 l
+21.384 3.514 l
+23.221 3.514 l
+h
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.738 25.047 0.974 25.106 1.191 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.191 c
+28.355 0.974 28.384 0.738 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.014 c
+27.362 1.162 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.547 27.046 1.588 c
+26.959 1.635 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.243 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.599 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.206 27.385 -0.058 c
+27.414 0.088 27.429 0.268 27.429 0.485 c
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.526 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.596 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.056 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.467 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.36 2.139 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.279 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.232 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+38.424 -0.279 0.926 -0.985 re
+38.424 -1.264 m
+42.484 -0.279 0.927 -0.985 re
+42.484 -1.264 m
+48.5 1.47 m
+48.4 1.477 48.298 1.488 48.191 1.5 c
+48.081 1.517 47.96 1.529 47.823 1.529 c
+47.648 1.529 47.489 1.488 47.353 1.411 c
+47.214 1.341 47.096 1.242 47 1.118 c
+46.912 0.989 46.842 0.842 46.794 0.676 c
+46.754 0.507 46.736 0.331 46.736 0.147 c
+46.736 -1.264 l
+45.839 -1.264 l
+45.839 0.985 l
+45.839 1.11 45.828 1.235 45.81 1.353 c
+45.799 1.477 45.784 1.595 45.766 1.706 c
+45.755 1.823 45.74 1.918 45.722 1.999 c
+45.699 2.087 45.681 2.161 45.663 2.22 c
+46.545 2.22 l
+46.552 2.168 46.563 2.117 46.574 2.058 c
+46.593 1.999 46.607 1.933 46.618 1.867 c
+46.637 1.808 46.651 1.742 46.663 1.675 c
+46.67 1.606 46.68 1.544 46.692 1.484 c
+46.707 1.484 l
+46.743 1.602 46.794 1.709 46.854 1.808 c
+46.919 1.904 47 1.988 47.089 2.058 c
+47.177 2.124 47.28 2.18 47.397 2.22 c
+47.522 2.257 47.669 2.278 47.838 2.278 c
+47.964 2.278 48.081 2.271 48.191 2.263 c
+48.309 2.253 48.411 2.238 48.5 2.22 c
+h
+51.106 -1.323 m
+50.848 -1.323 50.62 -1.286 50.414 -1.22 c
+50.208 -1.143 50.032 -1.029 49.886 -0.882 c
+49.738 -0.727 49.62 -0.536 49.533 -0.309 c
+49.452 -0.085 49.415 0.181 49.415 0.485 c
+49.415 0.816 49.459 1.095 49.547 1.323 c
+49.643 1.558 49.772 1.742 49.93 1.881 c
+50.094 2.018 50.282 2.117 50.488 2.176 c
+50.694 2.242 50.903 2.278 51.12 2.278 c
+51.392 2.278 51.627 2.227 51.825 2.132 c
+52.031 2.043 52.197 1.911 52.325 1.735 c
+52.461 1.565 52.56 1.359 52.619 1.118 c
+52.685 0.882 52.722 0.617 52.722 0.324 c
+52.722 0.309 l
+50.356 0.309 l
+50.356 0.162 50.37 0.023 50.4 -0.103 c
+50.437 -0.231 50.491 -0.345 50.561 -0.441 c
+50.628 -0.529 50.712 -0.599 50.811 -0.646 c
+50.907 -0.698 51.021 -0.72 51.149 -0.72 c
+51.303 -0.72 51.443 -0.687 51.561 -0.617 c
+51.686 -0.551 51.774 -0.448 51.825 -0.309 c
+52.664 -0.382 l
+52.633 -0.482 52.579 -0.588 52.502 -0.706 c
+52.421 -0.816 52.318 -0.918 52.193 -1.014 c
+52.076 -1.103 51.921 -1.176 51.737 -1.234 c
+51.561 -1.294 51.347 -1.323 51.106 -1.323 c
+51.106 1.706 m
+51.017 1.706 50.929 1.69 50.84 1.661 c
+50.752 1.632 50.672 1.58 50.605 1.515 c
+50.536 1.444 50.477 1.357 50.429 1.249 c
+50.389 1.139 50.37 1.014 50.37 0.867 c
+51.84 0.867 l
+51.84 1.004 51.814 1.124 51.767 1.235 c
+51.727 1.341 51.671 1.43 51.605 1.5 c
+51.546 1.565 51.473 1.617 51.384 1.646 c
+51.297 1.683 51.201 1.706 51.106 1.706 c
+55.258 1.602 m
+55.258 -1.264 l
+54.361 -1.264 l
+54.361 1.602 l
+53.537 1.602 l
+53.537 2.22 l
+54.361 2.22 l
+54.361 2.484 l
+54.361 2.61 54.376 2.741 54.405 2.881 c
+54.442 3.017 54.512 3.135 54.611 3.234 c
+54.717 3.341 54.861 3.429 55.037 3.499 c
+55.214 3.564 55.438 3.601 55.713 3.601 c
+55.926 3.601 56.125 3.591 56.301 3.572 c
+56.477 3.55 56.629 3.532 56.757 3.514 c
+56.757 2.926 l
+56.629 2.944 56.485 2.959 56.331 2.969 c
+56.172 2.976 56.022 2.984 55.875 2.984 c
+55.746 2.984 55.644 2.969 55.567 2.94 c
+55.486 2.911 55.423 2.87 55.376 2.822 c
+55.324 2.77 55.291 2.708 55.272 2.631 c
+55.261 2.562 55.258 2.484 55.258 2.396 c
+55.258 2.22 l
+56.683 2.22 l
+56.683 1.602 l
+h
+f
+Q
+q 1 0 0 1 60.3663 351.1103 cm
+0 0 m
+2.102 0 l
+2.102 -0.574 l
+-0.676 -0.574 l
+-0.676 4.777 l
+0 4.777 l
+h
+3.513 -0.574 -0.647 3.984 re
+3.557 4.453 m
+3.557 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.314 4.072 3.189 4.072 c
+3.072 4.072 2.977 4.104 2.91 4.174 c
+2.851 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.851 4.663 2.91 4.733 c
+2.977 4.81 3.072 4.85 3.189 4.85 c
+3.314 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.557 4.56 3.557 4.453 c
+6.468 0.44 m
+6.468 0.588 6.412 0.709 6.306 0.808 c
+6.196 0.904 5.99 1.022 5.688 1.161 c
+5.342 1.308 5.1 1.429 4.953 1.529 c
+4.806 1.635 4.696 1.753 4.629 1.881 c
+4.56 2.006 4.527 2.164 4.527 2.352 c
+4.527 2.674 4.644 2.944 4.88 3.16 c
+5.115 3.373 5.416 3.484 5.791 3.484 c
+6.173 3.484 6.482 3.37 6.717 3.145 c
+6.952 2.917 7.07 2.631 7.07 2.278 c
+6.423 2.278 l
+6.423 2.454 6.364 2.605 6.247 2.734 c
+6.129 2.859 5.975 2.925 5.791 2.925 c
+5.593 2.925 5.442 2.869 5.335 2.763 c
+5.225 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.238 5.211 2.131 5.292 2.043 c
+5.369 1.962 5.56 1.859 5.865 1.734 c
+6.342 1.547 6.673 1.359 6.85 1.176 c
+7.025 0.999 7.114 0.771 7.114 0.5 c
+7.114 0.147 6.989 -0.133 6.746 -0.339 c
+6.511 -0.544 6.196 -0.647 5.805 -0.647 c
+5.383 -0.647 5.045 -0.53 4.791 -0.294 c
+4.534 -0.052 4.409 0.253 4.409 0.617 c
+5.056 0.617 l
+5.063 0.389 5.134 0.213 5.262 0.087 c
+5.387 -0.03 5.57 -0.088 5.805 -0.088 c
+6.019 -0.088 6.181 -0.04 6.291 0.058 c
+6.408 0.154 6.468 0.282 6.468 0.44 c
+8.804 4.365 m
+8.804 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.804 2.881 l
+8.804 0.411 l
+8.804 0.253 8.826 0.135 8.878 0.058 c
+8.937 -0.023 9.025 -0.059 9.142 -0.059 c
+9.231 -0.059 9.319 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.26 -0.621 9.105 -0.647 8.951 -0.647 c
+8.694 -0.647 8.5 -0.555 8.363 -0.368 c
+8.224 -0.184 8.157 0.077 8.157 0.411 c
+8.157 2.881 l
+7.555 2.881 l
+7.555 3.41 l
+8.157 3.41 l
+8.157 4.365 l
+h
+13.273 -0.088 m
+13.486 -0.088 13.659 -0.026 13.787 0.103 c
+13.923 0.239 13.996 0.43 14.008 0.675 c
+14.625 0.675 l
+14.603 0.294 14.467 -0.026 14.214 -0.279 c
+13.957 -0.526 13.644 -0.647 13.273 -0.647 c
+12.781 -0.647 12.406 -0.497 12.141 -0.191 c
+11.883 0.121 11.759 0.588 11.759 1.205 c
+11.759 1.646 l
+11.759 2.241 11.883 2.697 12.141 3.013 c
+12.406 3.326 12.781 3.484 13.273 3.484 c
+13.674 3.484 13.993 3.351 14.229 3.087 c
+14.47 2.829 14.603 2.484 14.625 2.043 c
+14.008 2.043 l
+13.986 2.337 13.913 2.557 13.787 2.705 c
+13.67 2.851 13.497 2.925 13.273 2.925 c
+12.978 2.925 12.762 2.826 12.626 2.631 c
+12.486 2.443 12.413 2.135 12.406 1.705 c
+12.406 1.19 l
+12.406 0.72 12.471 0.386 12.612 0.191 c
+12.758 0.004 12.978 -0.088 13.273 -0.088 c
+15.243 1.602 m
+15.243 2.179 15.378 2.634 15.654 2.969 c
+15.937 3.31 16.309 3.484 16.771 3.484 c
+17.231 3.484 17.598 3.314 17.874 2.984 c
+18.156 2.66 18.304 2.212 18.314 1.646 c
+18.314 1.22 l
+18.314 0.65 18.171 0.195 17.888 -0.148 c
+17.613 -0.482 17.246 -0.647 16.786 -0.647 c
+16.323 -0.647 15.952 -0.485 15.669 -0.162 c
+15.393 0.168 15.249 0.61 15.243 1.161 c
+h
+15.889 1.22 m
+15.889 0.816 15.966 0.5 16.124 0.264 c
+16.29 0.029 16.51 -0.088 16.786 -0.088 c
+17.352 -0.088 17.645 0.323 17.668 1.146 c
+17.668 1.602 l
+17.668 2.003 17.583 2.322 17.418 2.557 c
+17.26 2.8 17.043 2.925 16.771 2.925 c
+16.506 2.925 16.29 2.8 16.124 2.557 c
+15.966 2.322 15.889 2.003 15.889 1.602 c
+h
+19.77 3.41 m
+19.785 3.042 l
+20.027 3.337 20.346 3.484 20.74 3.484 c
+21.181 3.484 21.489 3.285 21.666 2.896 c
+21.919 3.285 22.268 3.484 22.709 3.484 c
+23.444 3.484 23.82 3.021 23.841 2.102 c
+23.841 -0.574 l
+23.195 -0.574 l
+23.195 2.043 l
+23.195 2.337 23.139 2.55 23.033 2.69 c
+22.933 2.826 22.761 2.896 22.518 2.896 c
+22.32 2.896 22.158 2.815 22.033 2.66 c
+21.915 2.514 21.846 2.322 21.828 2.087 c
+21.828 -0.574 l
+21.167 -0.574 l
+21.167 2.072 l
+21.167 2.62 20.946 2.896 20.504 2.896 c
+20.17 2.896 19.935 2.734 19.799 2.41 c
+19.799 -0.574 l
+19.153 -0.574 l
+19.153 3.41 l
+h
+25.429 3.41 m
+25.443 3.042 l
+25.686 3.337 26.006 3.484 26.399 3.484 c
+26.84 3.484 27.149 3.285 27.325 2.896 c
+27.579 3.285 27.928 3.484 28.369 3.484 c
+29.104 3.484 29.479 3.021 29.501 2.102 c
+29.501 -0.574 l
+28.853 -0.574 l
+28.853 2.043 l
+28.853 2.337 28.799 2.55 28.693 2.69 c
+28.593 2.826 28.42 2.896 28.178 2.896 c
+27.979 2.896 27.818 2.815 27.693 2.66 c
+27.575 2.514 27.505 2.322 27.487 2.087 c
+27.487 -0.574 l
+26.825 -0.574 l
+26.825 2.072 l
+26.825 2.62 26.605 2.896 26.164 2.896 c
+25.83 2.896 25.595 2.734 25.458 2.41 c
+25.458 -0.574 l
+24.812 -0.574 l
+24.812 3.41 l
+h
+31.176 -0.574 -0.646 3.984 re
+31.22 4.453 m
+31.22 4.343 31.191 4.251 31.132 4.174 c
+31.074 4.104 30.978 4.072 30.852 4.072 c
+30.735 4.072 30.64 4.104 30.574 4.174 c
+30.515 4.251 30.486 4.343 30.486 4.453 c
+30.486 4.571 30.515 4.663 30.574 4.733 c
+30.64 4.81 30.735 4.85 30.852 4.85 c
+30.978 4.85 31.074 4.81 31.132 4.733 c
+31.191 4.652 31.22 4.56 31.22 4.453 c
+33.043 4.365 m
+33.043 3.41 l
+33.646 3.41 l
+33.646 2.881 l
+33.043 2.881 l
+33.043 0.411 l
+33.043 0.253 33.065 0.135 33.117 0.058 c
+33.175 -0.023 33.264 -0.059 33.381 -0.059 c
+33.47 -0.059 33.557 -0.044 33.646 -0.015 c
+33.646 -0.574 l
+33.499 -0.621 33.344 -0.647 33.19 -0.647 c
+32.932 -0.647 32.738 -0.555 32.602 -0.368 c
+32.462 -0.184 32.396 0.077 32.396 0.411 c
+32.396 2.881 l
+31.793 2.881 l
+31.793 3.41 l
+32.396 3.41 l
+32.396 4.365 l
+h
+34.424 -1.646 m
+34.027 -1.382 l
+34.263 -1.058 34.384 -0.724 34.395 -0.383 c
+34.395 0.235 l
+35.057 0.235 l
+35.057 -0.294 l
+35.057 -0.551 34.991 -0.798 34.866 -1.044 c
+34.748 -1.287 34.601 -1.488 34.424 -1.646 c
+38.467 4.365 m
+38.467 3.41 l
+39.07 3.41 l
+39.07 2.881 l
+38.467 2.881 l
+38.467 0.411 l
+38.467 0.253 38.489 0.135 38.54 0.058 c
+38.599 -0.023 38.688 -0.059 38.805 -0.059 c
+38.893 -0.059 38.981 -0.044 39.07 -0.015 c
+39.07 -0.574 l
+38.923 -0.621 38.768 -0.647 38.614 -0.647 c
+38.357 -0.647 38.162 -0.555 38.026 -0.368 c
+37.886 -0.184 37.821 0.077 37.821 0.411 c
+37.821 2.881 l
+37.218 2.881 l
+37.218 3.41 l
+37.821 3.41 l
+37.821 4.365 l
+h
+40.481 2.998 m
+40.734 3.322 41.054 3.484 41.436 3.484 c
+42.141 3.484 42.498 3.013 42.509 2.072 c
+42.509 -0.574 l
+41.863 -0.574 l
+41.863 2.043 l
+41.863 2.356 41.807 2.576 41.701 2.705 c
+41.59 2.829 41.436 2.896 41.231 2.896 c
+41.073 2.896 40.925 2.84 40.79 2.734 c
+40.661 2.624 40.558 2.487 40.481 2.322 c
+40.481 -0.574 l
+39.834 -0.574 l
+39.834 5.071 l
+40.481 5.071 l
+h
+45.508 -0.574 m
+45.468 -0.485 45.441 -0.339 45.434 -0.133 c
+45.199 -0.478 44.905 -0.647 44.552 -0.647 c
+44.188 -0.647 43.905 -0.551 43.7 -0.353 c
+43.502 -0.148 43.406 0.139 43.406 0.515 c
+43.406 0.914 43.542 1.234 43.818 1.469 c
+44.09 1.712 44.464 1.837 44.934 1.837 c
+45.42 1.837 l
+45.42 2.263 l
+45.42 2.499 45.364 2.664 45.258 2.763 c
+45.148 2.869 44.986 2.925 44.773 2.925 c
+44.574 2.925 44.412 2.866 44.288 2.749 c
+44.171 2.631 44.111 2.484 44.111 2.308 c
+43.465 2.308 l
+43.465 2.502 43.523 2.693 43.641 2.881 c
+43.766 3.064 43.928 3.212 44.126 3.322 c
+44.332 3.428 44.56 3.484 44.817 3.484 c
+45.218 3.484 45.522 3.38 45.728 3.175 c
+45.942 2.969 46.056 2.674 46.066 2.293 c
+46.066 0.279 l
+46.066 -0.026 46.103 -0.291 46.184 -0.515 c
+46.184 -0.574 l
+h
+44.641 -0.059 m
+44.806 -0.059 44.957 -0.015 45.096 0.073 c
+45.243 0.162 45.35 0.272 45.42 0.411 c
+45.42 1.352 l
+45.052 1.352 l
+44.736 1.352 44.493 1.282 44.317 1.146 c
+44.14 1.018 44.053 0.83 44.053 0.588 c
+44.053 0.359 44.097 0.195 44.185 0.087 c
+44.273 -0.011 44.424 -0.059 44.641 -0.059 c
+47.918 4.365 m
+47.918 3.41 l
+48.521 3.41 l
+48.521 2.881 l
+47.918 2.881 l
+47.918 0.411 l
+47.918 0.253 47.94 0.135 47.992 0.058 c
+48.051 -0.023 48.139 -0.059 48.256 -0.059 c
+48.345 -0.059 48.433 -0.044 48.521 -0.015 c
+48.521 -0.574 l
+48.374 -0.621 48.219 -0.647 48.065 -0.647 c
+47.808 -0.647 47.614 -0.555 47.477 -0.368 c
+47.338 -0.184 47.272 0.077 47.272 0.411 c
+47.272 2.881 l
+46.669 2.881 l
+46.669 3.41 l
+47.272 3.41 l
+47.272 4.365 l
+h
+53.048 -0.574 m
+53.008 -0.485 52.982 -0.339 52.975 -0.133 c
+52.74 -0.478 52.446 -0.647 52.093 -0.647 c
+51.729 -0.647 51.446 -0.551 51.24 -0.353 c
+51.042 -0.148 50.947 0.139 50.947 0.515 c
+50.947 0.914 51.082 1.234 51.358 1.469 c
+51.63 1.712 52.005 1.837 52.475 1.837 c
+52.96 1.837 l
+52.96 2.263 l
+52.96 2.499 52.905 2.664 52.799 2.763 c
+52.688 2.869 52.527 2.925 52.314 2.925 c
+52.115 2.925 51.953 2.866 51.828 2.749 c
+51.711 2.631 51.652 2.484 51.652 2.308 c
+51.005 2.308 l
+51.005 2.502 51.064 2.693 51.182 2.881 c
+51.307 3.064 51.468 3.212 51.666 3.322 c
+51.872 3.428 52.1 3.484 52.358 3.484 c
+52.759 3.484 53.063 3.38 53.269 3.175 c
+53.482 2.969 53.596 2.674 53.607 2.293 c
+53.607 0.279 l
+53.607 -0.026 53.644 -0.291 53.725 -0.515 c
+53.725 -0.574 l
+h
+52.181 -0.059 m
+52.346 -0.059 52.497 -0.015 52.637 0.073 c
+52.784 0.162 52.89 0.272 52.96 0.411 c
+52.96 1.352 l
+52.593 1.352 l
+52.277 1.352 52.034 1.282 51.858 1.146 c
+51.681 1.018 51.593 0.83 51.593 0.588 c
+51.593 0.359 51.637 0.195 51.726 0.087 c
+51.814 -0.011 51.965 -0.059 52.181 -0.059 c
+56.252 2.792 m
+56.165 2.811 56.065 2.822 55.959 2.822 c
+55.624 2.822 55.389 2.638 55.253 2.278 c
+55.253 -0.574 l
+54.606 -0.574 l
+54.606 3.41 l
+55.238 3.41 l
+55.253 2.998 l
+55.429 3.322 55.672 3.484 55.988 3.484 c
+56.094 3.484 56.183 3.461 56.252 3.424 c
+h
+58.252 -0.647 m
+57.752 -0.647 57.37 -0.5 57.106 -0.206 c
+56.84 0.087 56.709 0.521 56.709 1.103 c
+56.709 1.573 l
+56.709 2.167 56.834 2.634 57.091 2.969 c
+57.355 3.31 57.715 3.484 58.178 3.484 c
+58.638 3.484 58.98 3.329 59.207 3.027 c
+59.443 2.734 59.564 2.271 59.575 1.646 c
+59.575 1.22 l
+57.355 1.22 l
+57.355 1.132 l
+57.355 0.698 57.432 0.386 57.59 0.191 c
+57.756 0.004 57.987 -0.088 58.282 -0.088 c
+58.476 -0.088 58.649 -0.056 58.796 0.014 c
+58.943 0.091 59.078 0.209 59.207 0.367 c
+59.545 -0.044 l
+59.259 -0.449 58.829 -0.647 58.252 -0.647 c
+58.178 2.925 m
+57.903 2.925 57.701 2.829 57.576 2.645 c
+57.447 2.458 57.374 2.167 57.355 1.778 c
+58.928 1.778 l
+58.928 1.866 l
+58.906 2.248 58.839 2.516 58.722 2.674 c
+58.604 2.84 58.421 2.925 58.178 2.925 c
+64.954 1.22 m
+64.954 0.592 64.837 0.121 64.602 -0.191 c
+64.374 -0.497 64.058 -0.647 63.647 -0.647 c
+63.242 -0.647 62.934 -0.497 62.72 -0.191 c
+62.72 -2.103 l
+62.074 -2.103 l
+62.074 3.41 l
+62.662 3.41 l
+62.706 2.969 l
+62.919 3.31 63.227 3.484 63.632 3.484 c
+64.073 3.484 64.4 3.329 64.617 3.027 c
+64.83 2.722 64.944 2.267 64.954 1.66 c
+h
+64.308 1.602 m
+64.308 2.043 64.238 2.366 64.102 2.572 c
+63.963 2.786 63.742 2.896 63.441 2.896 c
+63.125 2.896 62.886 2.741 62.72 2.439 c
+62.72 0.367 l
+62.886 0.062 63.125 -0.088 63.441 -0.088 c
+63.735 -0.088 63.948 0.014 64.088 0.22 c
+64.223 0.434 64.297 0.764 64.308 1.205 c
+h
+67.439 2.792 m
+67.35 2.811 67.252 2.822 67.145 2.822 c
+66.81 2.822 66.575 2.638 66.44 2.278 c
+66.44 -0.574 l
+65.792 -0.574 l
+65.792 3.41 l
+66.425 3.41 l
+66.44 2.998 l
+66.616 3.322 66.858 3.484 67.174 3.484 c
+67.281 3.484 67.369 3.461 67.439 3.424 c
+h
+69.438 -0.647 m
+68.938 -0.647 68.556 -0.5 68.291 -0.206 c
+68.027 0.087 67.894 0.521 67.894 1.103 c
+67.894 1.573 l
+67.894 2.167 68.019 2.634 68.277 2.969 c
+68.541 3.31 68.902 3.484 69.364 3.484 c
+69.824 3.484 70.166 3.329 70.394 3.027 c
+70.629 2.734 70.75 2.271 70.761 1.646 c
+70.761 1.22 l
+68.541 1.22 l
+68.541 1.132 l
+68.541 0.698 68.618 0.386 68.777 0.191 c
+68.942 0.004 69.173 -0.088 69.467 -0.088 c
+69.662 -0.088 69.835 -0.056 69.982 0.014 c
+70.128 0.091 70.265 0.209 70.394 0.367 c
+70.731 -0.044 l
+70.444 -0.449 70.015 -0.647 69.438 -0.647 c
+69.364 2.925 m
+69.089 2.925 68.887 2.829 68.761 2.645 c
+68.634 2.458 68.559 2.167 68.541 1.778 c
+70.114 1.778 l
+70.114 1.866 l
+70.092 2.248 70.026 2.516 69.908 2.674 c
+69.791 2.84 69.607 2.925 69.364 2.925 c
+73.48 0.44 m
+73.48 0.588 73.425 0.709 73.318 0.808 c
+73.208 0.904 73.002 1.022 72.701 1.161 c
+72.356 1.308 72.113 1.429 71.967 1.529 c
+71.819 1.635 71.709 1.753 71.643 1.881 c
+71.573 2.006 71.539 2.164 71.539 2.352 c
+71.539 2.674 71.657 2.944 71.892 3.16 c
+72.127 3.373 72.429 3.484 72.804 3.484 c
+73.186 3.484 73.495 3.37 73.73 3.145 c
+73.966 2.917 74.083 2.631 74.083 2.278 c
+73.436 2.278 l
+73.436 2.454 73.378 2.605 73.26 2.734 c
+73.142 2.859 72.988 2.925 72.804 2.925 c
+72.605 2.925 72.455 2.869 72.348 2.763 c
+72.238 2.664 72.187 2.532 72.187 2.366 c
+72.187 2.238 72.223 2.131 72.304 2.043 c
+72.381 1.962 72.572 1.859 72.877 1.734 c
+73.355 1.547 73.686 1.359 73.862 1.176 c
+74.039 0.999 74.126 0.771 74.126 0.5 c
+74.126 0.147 74.002 -0.133 73.76 -0.339 c
+73.524 -0.544 73.208 -0.647 72.819 -0.647 c
+72.396 -0.647 72.058 -0.53 71.805 -0.294 c
+71.547 -0.052 71.422 0.253 71.422 0.617 c
+72.069 0.617 l
+72.077 0.389 72.146 0.213 72.275 0.087 c
+72.399 -0.03 72.584 -0.088 72.819 -0.088 c
+73.031 -0.088 73.193 -0.04 73.303 0.058 c
+73.421 0.154 73.48 0.282 73.48 0.44 c
+76.391 -0.647 m
+75.89 -0.647 75.508 -0.5 75.244 -0.206 c
+74.98 0.087 74.847 0.521 74.847 1.103 c
+74.847 1.573 l
+74.847 2.167 74.972 2.634 75.229 2.969 c
+75.494 3.31 75.854 3.484 76.317 3.484 c
+76.777 3.484 77.118 3.329 77.346 3.027 c
+77.581 2.734 77.702 2.271 77.714 1.646 c
+77.714 1.22 l
+75.494 1.22 l
+75.494 1.132 l
+75.494 0.698 75.571 0.386 75.73 0.191 c
+75.894 0.004 76.126 -0.088 76.42 -0.088 c
+76.615 -0.088 76.788 -0.056 76.935 0.014 c
+77.081 0.091 77.218 0.209 77.346 0.367 c
+77.684 -0.044 l
+77.397 -0.449 76.968 -0.647 76.391 -0.647 c
+76.317 2.925 m
+76.042 2.925 75.84 2.829 75.714 2.645 c
+75.586 2.458 75.512 2.167 75.494 1.778 c
+77.066 1.778 l
+77.066 1.866 l
+77.045 2.248 76.979 2.516 76.861 2.674 c
+76.744 2.84 76.559 2.925 76.317 2.925 c
+79.11 3.41 m
+79.125 2.969 l
+79.378 3.31 79.701 3.484 80.095 3.484 c
+80.8 3.484 81.157 3.013 81.168 2.072 c
+81.168 -0.574 l
+80.521 -0.574 l
+80.521 2.043 l
+80.521 2.356 80.466 2.576 80.359 2.705 c
+80.249 2.829 80.095 2.896 79.889 2.896 c
+79.73 2.896 79.584 2.84 79.448 2.734 c
+79.319 2.624 79.217 2.487 79.14 2.322 c
+79.14 -0.574 l
+78.492 -0.574 l
+78.492 3.41 l
+h
+82.99 4.365 m
+82.99 3.41 l
+83.593 3.41 l
+83.593 2.881 l
+82.99 2.881 l
+82.99 0.411 l
+82.99 0.253 83.013 0.135 83.064 0.058 c
+83.123 -0.023 83.211 -0.059 83.329 -0.059 c
+83.416 -0.059 83.505 -0.044 83.593 -0.015 c
+83.593 -0.574 l
+83.446 -0.621 83.292 -0.647 83.138 -0.647 c
+82.88 -0.647 82.685 -0.555 82.55 -0.368 c
+82.41 -0.184 82.344 0.077 82.344 0.411 c
+82.344 2.881 l
+81.741 2.881 l
+81.741 3.41 l
+82.344 3.41 l
+82.344 4.365 l
+h
+85.945 1.602 m
+85.945 2.179 86.08 2.634 86.356 2.969 c
+86.639 3.31 87.011 3.484 87.474 3.484 c
+87.933 3.484 88.301 3.314 88.576 2.984 c
+88.859 2.66 89.006 2.212 89.017 1.646 c
+89.017 1.22 l
+89.017 0.65 88.874 0.195 88.59 -0.148 c
+88.315 -0.482 87.948 -0.647 87.489 -0.647 c
+87.025 -0.647 86.654 -0.485 86.371 -0.162 c
+86.096 0.168 85.953 0.61 85.945 1.161 c
+h
+86.591 1.22 m
+86.591 0.816 86.668 0.5 86.826 0.264 c
+86.992 0.029 87.213 -0.088 87.489 -0.088 c
+88.054 -0.088 88.349 0.323 88.37 1.146 c
+88.37 1.602 l
+88.37 2.003 88.286 2.322 88.12 2.557 c
+87.962 2.8 87.746 2.925 87.474 2.925 c
+87.209 2.925 86.992 2.8 86.826 2.557 c
+86.668 2.322 86.591 2.003 86.591 1.602 c
+h
+90.472 3.41 m
+90.487 2.969 l
+90.741 3.31 91.064 3.484 91.457 3.484 c
+92.162 3.484 92.519 3.013 92.53 2.072 c
+92.53 -0.574 l
+91.883 -0.574 l
+91.883 2.043 l
+91.883 2.356 91.828 2.576 91.722 2.705 c
+91.611 2.829 91.457 2.896 91.252 2.896 c
+91.094 2.896 90.946 2.84 90.811 2.734 c
+90.682 2.624 90.579 2.487 90.502 2.322 c
+90.502 -0.574 l
+89.855 -0.574 l
+89.855 3.41 l
+h
+f
+Q
+q 1 0 0 1 157.4383 353.5063 cm
+0 0 m
+-0.338 0.029 l
+-0.625 0.029 -0.816 -0.096 -0.912 -0.339 c
+-0.912 -2.97 l
+-1.955 -2.97 l
+-1.955 1.014 l
+-0.985 1.014 l
+-0.956 0.573 l
+-0.79 0.914 -0.559 1.087 -0.264 1.087 c
+-0.147 1.087 -0.056 1.065 0.015 1.028 c
+h
+2.072 -3.043 m
+1.544 -3.043 1.124 -2.889 0.823 -2.573 c
+0.53 -2.249 0.382 -1.79 0.382 -1.191 c
+0.382 -0.882 l
+0.382 -0.258 0.518 0.228 0.794 0.573 c
+1.066 0.914 1.459 1.087 1.97 1.087 c
+2.469 1.087 2.841 0.926 3.087 0.602 c
+3.341 0.278 3.472 -0.198 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.43 -1.617 1.492 -1.834 1.602 -1.97 c
+1.72 -2.11 1.9 -2.176 2.146 -2.176 c
+2.488 -2.176 2.778 -2.058 3.013 -1.823 c
+3.425 -2.455 l
+3.296 -2.631 3.109 -2.775 2.866 -2.881 c
+2.62 -2.988 2.356 -3.043 2.072 -3.043 c
+1.426 -0.603 m
+2.454 -0.603 l
+2.454 -0.5 l
+2.454 -0.265 2.414 -0.088 2.337 0.029 c
+2.267 0.154 2.138 0.22 1.955 0.22 c
+1.779 0.22 1.646 0.151 1.558 0.014 c
+1.477 -0.115 1.433 -0.32 1.426 -0.603 c
+4.307 -2.97 m
+4.307 0.22 l
+3.822 0.22 l
+3.822 1.014 l
+4.307 1.014 l
+4.307 1.367 l
+4.307 1.807 4.417 2.146 4.645 2.381 c
+4.881 2.624 5.196 2.748 5.6 2.748 c
+5.725 2.748 5.883 2.723 6.071 2.674 c
+6.071 1.851 l
+6.001 1.87 5.916 1.881 5.821 1.881 c
+5.505 1.881 5.351 1.697 5.351 1.337 c
+5.351 1.014 l
+5.968 1.014 l
+5.968 0.22 l
+5.351 0.22 l
+5.351 -2.97 l
+h
+f
+Q
+q 1 0 0 1 167.8457 350.5364 cm
+0 0 m
+-0.04 0.088 -0.067 0.235 -0.074 0.441 c
+-0.31 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.32 -0.073 -1.603 0.023 -1.808 0.221 c
+-2.007 0.426 -2.103 0.713 -2.103 1.088 c
+-2.103 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.044 2.411 -0.574 2.411 c
+-0.088 2.411 l
+-0.088 2.837 l
+-0.088 3.072 -0.144 3.238 -0.25 3.337 c
+-0.36 3.443 -0.522 3.499 -0.736 3.499 c
+-0.934 3.499 -1.095 3.44 -1.22 3.323 c
+-1.338 3.205 -1.397 3.057 -1.397 2.882 c
+-2.043 2.882 l
+-2.043 3.076 -1.985 3.267 -1.867 3.454 c
+-1.742 3.638 -1.58 3.786 -1.382 3.896 c
+-1.176 4.002 -0.948 4.057 -0.691 4.057 c
+-0.291 4.057 0.014 3.954 0.22 3.749 c
+0.433 3.543 0.548 3.248 0.558 2.866 c
+0.558 0.853 l
+0.558 0.548 0.595 0.283 0.675 0.059 c
+0.675 0 l
+h
+-0.867 0.515 m
+-0.703 0.515 -0.551 0.559 -0.412 0.647 c
+-0.265 0.736 -0.158 0.846 -0.088 0.985 c
+-0.088 1.926 l
+-0.456 1.926 l
+-0.772 1.926 -1.015 1.856 -1.191 1.72 c
+-1.368 1.592 -1.455 1.404 -1.455 1.162 c
+-1.455 0.933 -1.411 0.769 -1.324 0.661 c
+-1.235 0.563 -1.085 0.515 -0.867 0.515 c
+2.175 3.984 m
+2.19 3.543 l
+2.443 3.884 2.767 4.057 3.16 4.057 c
+3.865 4.057 4.222 3.587 4.233 2.646 c
+4.233 0 l
+3.586 0 l
+3.586 2.617 l
+3.586 2.929 3.531 3.15 3.424 3.279 c
+3.314 3.403 3.16 3.469 2.954 3.469 c
+2.796 3.469 2.649 3.414 2.513 3.308 c
+2.385 3.198 2.281 3.061 2.204 2.896 c
+2.204 0 l
+1.558 0 l
+1.558 3.984 l
+h
+5.071 2.176 m
+5.071 2.782 5.181 3.248 5.409 3.572 c
+5.644 3.896 5.971 4.057 6.393 4.057 c
+6.776 4.057 7.073 3.899 7.291 3.587 c
+7.291 5.644 l
+7.937 5.644 l
+7.937 0 l
+7.349 0 l
+7.305 0.426 l
+7.099 0.092 6.794 -0.073 6.393 -0.073 c
+5.982 -0.073 5.659 0.081 5.423 0.397 c
+5.188 0.721 5.071 1.176 5.071 1.764 c
+h
+5.718 1.794 m
+5.718 1.353 5.78 1.022 5.909 0.809 c
+6.044 0.603 6.265 0.5 6.57 0.5 c
+6.894 0.5 7.133 0.661 7.291 0.985 c
+7.291 2.999 l
+7.121 3.311 6.882 3.469 6.57 3.469 c
+6.265 3.469 6.044 3.366 5.909 3.161 c
+5.78 2.955 5.718 2.631 5.718 2.19 c
+h
+11.274 3.984 m
+11.289 3.543 l
+11.542 3.884 11.866 4.057 12.259 4.057 c
+12.964 4.057 13.321 3.587 13.331 2.646 c
+13.331 0 l
+12.685 0 l
+12.685 2.617 l
+12.685 2.929 12.629 3.15 12.523 3.279 c
+12.413 3.403 12.259 3.469 12.053 3.469 c
+11.895 3.469 11.748 3.414 11.612 3.308 c
+11.484 3.198 11.38 3.061 11.303 2.896 c
+11.303 0 l
+10.657 0 l
+10.657 3.984 l
+h
+14.169 2.176 m
+14.169 2.753 14.306 3.208 14.581 3.543 c
+14.864 3.884 15.235 4.057 15.698 4.057 c
+16.157 4.057 16.525 3.888 16.801 3.558 c
+17.084 3.234 17.231 2.786 17.242 2.22 c
+17.242 1.794 l
+17.242 1.224 17.098 0.769 16.816 0.426 c
+16.54 0.092 16.172 -0.073 15.713 -0.073 c
+15.249 -0.073 14.879 0.088 14.596 0.412 c
+14.32 0.742 14.177 1.183 14.169 1.735 c
+h
+14.817 1.794 m
+14.817 1.389 14.894 1.073 15.052 0.838 c
+15.216 0.603 15.438 0.485 15.713 0.485 c
+16.279 0.485 16.573 0.897 16.595 1.72 c
+16.595 2.176 l
+16.595 2.577 16.51 2.896 16.345 3.131 c
+16.187 3.374 15.97 3.499 15.698 3.499 c
+15.434 3.499 15.216 3.374 15.052 3.131 c
+14.894 2.896 14.817 2.577 14.817 2.176 c
+h
+18.932 4.939 m
+18.932 3.984 l
+19.534 3.984 l
+19.534 3.454 l
+18.932 3.454 l
+18.932 0.985 l
+18.932 0.827 18.954 0.709 19.006 0.632 c
+19.064 0.551 19.152 0.515 19.27 0.515 c
+19.359 0.515 19.446 0.53 19.534 0.559 c
+19.534 0 l
+19.388 -0.047 19.233 -0.073 19.079 -0.073 c
+18.821 -0.073 18.627 0.019 18.491 0.206 c
+18.351 0.389 18.285 0.651 18.285 0.985 c
+18.285 3.454 l
+17.682 3.454 l
+17.682 3.984 l
+18.285 3.984 l
+18.285 4.939 l
+h
+22.636 3.984 m
+22.651 3.616 l
+22.894 3.911 23.213 4.057 23.606 4.057 c
+24.047 4.057 24.356 3.859 24.533 3.469 c
+24.786 3.859 25.135 4.057 25.576 4.057 c
+26.311 4.057 26.686 3.595 26.708 2.676 c
+26.708 0 l
+26.061 0 l
+26.061 2.617 l
+26.061 2.911 26.006 3.124 25.899 3.263 c
+25.8 3.4 25.628 3.469 25.385 3.469 c
+25.186 3.469 25.025 3.389 24.899 3.234 c
+24.782 3.088 24.712 2.896 24.694 2.66 c
+24.694 0 l
+24.032 0 l
+24.032 2.646 l
+24.032 3.194 23.812 3.469 23.371 3.469 c
+23.037 3.469 22.802 3.308 22.665 2.984 c
+22.665 0 l
+22.019 0 l
+22.019 3.984 l
+h
+29.104 -0.073 m
+28.604 -0.073 28.222 0.073 27.957 0.368 c
+27.693 0.661 27.56 1.095 27.56 1.676 c
+27.56 2.147 l
+27.56 2.741 27.685 3.208 27.943 3.543 c
+28.207 3.884 28.567 4.057 29.03 4.057 c
+29.489 4.057 29.831 3.903 30.059 3.601 c
+30.295 3.308 30.416 2.845 30.426 2.22 c
+30.426 1.794 l
+28.207 1.794 l
+28.207 1.706 l
+28.207 1.272 28.284 0.96 28.442 0.765 c
+28.608 0.578 28.839 0.485 29.133 0.485 c
+29.328 0.485 29.501 0.518 29.647 0.588 c
+29.794 0.665 29.931 0.783 30.059 0.941 c
+30.397 0.53 l
+30.11 0.125 29.68 -0.073 29.104 -0.073 c
+29.03 3.499 m
+28.755 3.499 28.552 3.403 28.427 3.219 c
+28.299 3.032 28.225 2.741 28.207 2.352 c
+29.78 2.352 l
+29.78 2.44 l
+29.757 2.822 29.692 3.09 29.574 3.248 c
+29.456 3.414 29.273 3.499 29.03 3.499 c
+32.852 3.366 m
+32.764 3.385 32.664 3.396 32.558 3.396 c
+32.223 3.396 31.988 3.212 31.852 2.852 c
+31.852 0 l
+31.205 0 l
+31.205 3.984 l
+31.837 3.984 l
+31.852 3.572 l
+32.028 3.896 32.271 4.057 32.587 4.057 c
+32.693 4.057 32.782 4.035 32.852 3.998 c
+h
+33.293 2.176 m
+33.293 2.793 33.403 3.256 33.631 3.572 c
+33.855 3.896 34.189 4.057 34.63 4.057 c
+35.031 4.057 35.336 3.881 35.542 3.528 c
+35.586 3.984 l
+36.174 3.984 l
+36.174 -0.044 l
+36.174 -0.532 36.045 -0.911 35.791 -1.176 c
+35.535 -1.44 35.182 -1.573 34.733 -1.573 c
+34.535 -1.573 34.314 -1.521 34.072 -1.425 c
+33.826 -1.326 33.646 -1.205 33.528 -1.058 c
+33.792 -0.617 l
+34.058 -0.881 34.355 -1.014 34.69 -1.014 c
+35.226 -1.014 35.502 -0.72 35.513 -0.132 c
+35.513 0.397 l
+35.307 0.081 35.005 -0.073 34.615 -0.073 c
+34.204 -0.073 33.881 0.077 33.646 0.383 c
+33.418 0.695 33.3 1.147 33.293 1.735 c
+h
+33.954 1.794 m
+33.954 1.353 34.017 1.022 34.145 0.809 c
+34.27 0.603 34.487 0.5 34.792 0.5 c
+35.116 0.5 35.355 0.665 35.513 1 c
+35.513 2.984 l
+35.344 3.308 35.105 3.469 34.792 3.469 c
+34.498 3.469 34.281 3.366 34.145 3.161 c
+34.017 2.955 33.954 2.631 33.954 2.19 c
+h
+38.555 -0.073 m
+38.056 -0.073 37.673 0.073 37.408 0.368 c
+37.144 0.661 37.012 1.095 37.012 1.676 c
+37.012 2.147 l
+37.012 2.741 37.137 3.208 37.394 3.543 c
+37.659 3.884 38.019 4.057 38.482 4.057 c
+38.941 4.057 39.282 3.903 39.511 3.601 c
+39.746 3.308 39.867 2.845 39.878 2.22 c
+39.878 1.794 l
+37.659 1.794 l
+37.659 1.706 l
+37.659 1.272 37.736 0.96 37.894 0.765 c
+38.059 0.578 38.291 0.485 38.584 0.485 c
+38.779 0.485 38.952 0.518 39.099 0.588 c
+39.246 0.665 39.382 0.783 39.511 0.941 c
+39.849 0.53 l
+39.562 0.125 39.132 -0.073 38.555 -0.073 c
+38.482 3.499 m
+38.206 3.499 38.004 3.403 37.879 3.219 c
+37.75 3.032 37.677 2.741 37.659 2.352 c
+39.232 2.352 l
+39.232 2.44 l
+39.209 2.822 39.143 3.09 39.026 3.248 c
+38.908 3.414 38.725 3.499 38.482 3.499 c
+40.525 2.176 m
+40.525 2.782 40.635 3.248 40.863 3.572 c
+41.098 3.896 41.425 4.057 41.848 4.057 c
+42.23 4.057 42.528 3.899 42.744 3.587 c
+42.744 5.644 l
+43.392 5.644 l
+43.392 0 l
+42.804 0 l
+42.759 0.426 l
+42.553 0.092 42.249 -0.073 41.848 -0.073 c
+41.436 -0.073 41.113 0.081 40.878 0.397 c
+40.643 0.721 40.525 1.176 40.525 1.764 c
+h
+41.171 1.794 m
+41.171 1.353 41.234 1.022 41.362 0.809 c
+41.499 0.603 41.719 0.5 42.024 0.5 c
+42.347 0.5 42.586 0.661 42.744 0.985 c
+42.744 2.999 l
+42.575 3.311 42.336 3.469 42.024 3.469 c
+41.719 3.469 41.499 3.366 41.362 3.161 c
+41.234 2.955 41.171 2.631 41.171 2.19 c
+h
+46.816 0 -0.646 3.984 re
+46.86 5.027 m
+46.86 4.917 46.831 4.825 46.772 4.748 c
+46.713 4.678 46.617 4.645 46.492 4.645 c
+46.375 4.645 46.28 4.678 46.214 4.748 c
+46.155 4.825 46.125 4.917 46.125 5.027 c
+46.125 5.145 46.155 5.237 46.214 5.307 c
+46.28 5.384 46.375 5.424 46.492 5.424 c
+46.617 5.424 46.713 5.384 46.772 5.307 c
+46.831 5.226 46.86 5.134 46.86 5.027 c
+48.448 3.984 m
+48.462 3.543 l
+48.716 3.884 49.039 4.057 49.432 4.057 c
+50.138 4.057 50.494 3.587 50.505 2.646 c
+50.505 0 l
+49.859 0 l
+49.859 2.617 l
+49.859 2.929 49.804 3.15 49.697 3.279 c
+49.586 3.403 49.432 3.469 49.227 3.469 c
+49.069 3.469 48.921 3.414 48.786 3.308 c
+48.657 3.198 48.554 3.061 48.477 2.896 c
+48.477 0 l
+47.83 0 l
+47.83 3.984 l
+h
+52.329 4.939 m
+52.329 3.984 l
+52.931 3.984 l
+52.931 3.454 l
+52.329 3.454 l
+52.329 0.985 l
+52.329 0.827 52.35 0.709 52.402 0.632 c
+52.46 0.551 52.549 0.515 52.666 0.515 c
+52.755 0.515 52.842 0.53 52.931 0.559 c
+52.931 0 l
+52.784 -0.047 52.63 -0.073 52.475 -0.073 c
+52.218 -0.073 52.023 0.019 51.887 0.206 c
+51.747 0.389 51.681 0.651 51.681 0.985 c
+51.681 3.454 l
+51.078 3.454 l
+51.078 3.984 l
+51.681 3.984 l
+51.681 4.939 l
+h
+53.489 2.176 m
+53.489 2.753 53.625 3.208 53.901 3.543 c
+54.184 3.884 54.555 4.057 55.018 4.057 c
+55.477 4.057 55.845 3.888 56.121 3.558 c
+56.404 3.234 56.551 2.786 56.562 2.22 c
+56.562 1.794 l
+56.562 1.224 56.418 0.769 56.135 0.426 c
+55.859 0.092 55.492 -0.073 55.033 -0.073 c
+54.569 -0.073 54.199 0.088 53.916 0.412 c
+53.64 0.742 53.497 1.183 53.489 1.735 c
+h
+54.136 1.794 m
+54.136 1.389 54.213 1.073 54.371 0.838 c
+54.537 0.603 54.758 0.485 55.033 0.485 c
+55.599 0.485 55.893 0.897 55.915 1.72 c
+55.915 2.176 l
+55.915 2.577 55.83 2.896 55.664 3.131 c
+55.506 3.374 55.29 3.499 55.018 3.499 c
+54.754 3.499 54.537 3.374 54.371 3.131 c
+54.213 2.896 54.136 2.577 54.136 2.176 c
+h
+60.501 0.485 m
+60.714 0.485 60.887 0.548 61.015 0.676 c
+61.151 0.813 61.225 1.004 61.236 1.249 c
+61.854 1.249 l
+61.831 0.867 61.696 0.548 61.442 0.294 c
+61.185 0.048 60.872 -0.073 60.501 -0.073 c
+60.009 -0.073 59.633 0.077 59.369 0.383 c
+59.112 0.695 58.987 1.162 58.987 1.779 c
+58.987 2.22 l
+58.987 2.815 59.112 3.271 59.369 3.587 c
+59.633 3.899 60.009 4.057 60.501 4.057 c
+60.902 4.057 61.221 3.925 61.457 3.66 c
+61.699 3.403 61.831 3.057 61.854 2.617 c
+61.236 2.617 l
+61.214 2.911 61.141 3.131 61.015 3.279 c
+60.898 3.425 60.725 3.499 60.501 3.499 c
+60.207 3.499 59.99 3.4 59.855 3.205 c
+59.714 3.017 59.641 2.708 59.633 2.279 c
+59.633 1.764 l
+59.633 1.294 59.699 0.96 59.839 0.765 c
+59.986 0.578 60.207 0.485 60.501 0.485 c
+64.632 0.353 m
+64.414 0.067 64.102 -0.073 63.691 -0.073 c
+63.327 -0.073 63.051 0.048 62.868 0.294 c
+62.691 0.548 62.596 0.912 62.588 1.382 c
+62.588 3.984 l
+63.235 3.984 l
+63.235 1.441 l
+63.235 0.813 63.419 0.5 63.793 0.5 c
+64.194 0.5 64.47 0.676 64.617 1.029 c
+64.617 3.984 l
+65.264 3.984 l
+65.264 0 l
+64.646 0 l
+h
+67.894 3.366 m
+67.807 3.385 67.707 3.396 67.601 3.396 c
+67.266 3.396 67.03 3.212 66.895 2.852 c
+66.895 0 l
+66.248 0 l
+66.248 3.984 l
+66.88 3.984 l
+66.895 3.572 l
+67.071 3.896 67.314 4.057 67.63 4.057 c
+67.736 4.057 67.824 4.035 67.894 3.998 c
+h
+70.188 3.366 m
+70.099 3.385 70 3.396 69.893 3.396 c
+69.559 3.396 69.324 3.212 69.188 2.852 c
+69.188 0 l
+68.541 0 l
+68.541 3.984 l
+69.173 3.984 l
+69.188 3.572 l
+69.364 3.896 69.607 4.057 69.923 4.057 c
+70.03 4.057 70.118 4.035 70.188 3.998 c
+h
+72.187 -0.073 m
+71.687 -0.073 71.304 0.073 71.04 0.368 c
+70.776 0.661 70.643 1.095 70.643 1.676 c
+70.643 2.147 l
+70.643 2.741 70.768 3.208 71.026 3.543 c
+71.29 3.884 71.65 4.057 72.113 4.057 c
+72.572 4.057 72.914 3.903 73.142 3.601 c
+73.378 3.308 73.498 2.845 73.509 2.22 c
+73.509 1.794 l
+71.29 1.794 l
+71.29 1.706 l
+71.29 1.272 71.367 0.96 71.525 0.765 c
+71.691 0.578 71.922 0.485 72.216 0.485 c
+72.411 0.485 72.584 0.518 72.73 0.588 c
+72.877 0.665 73.014 0.783 73.142 0.941 c
+73.48 0.53 l
+73.193 0.125 72.763 -0.073 72.187 -0.073 c
+72.113 3.499 m
+71.838 3.499 71.635 3.403 71.51 3.219 c
+71.381 3.032 71.308 2.741 71.29 2.352 c
+72.863 2.352 l
+72.863 2.44 l
+72.84 2.822 72.775 3.09 72.657 3.248 c
+72.539 3.414 72.356 3.499 72.113 3.499 c
+74.906 3.984 m
+74.92 3.543 l
+75.174 3.884 75.497 4.057 75.89 4.057 c
+76.596 4.057 76.952 3.587 76.964 2.646 c
+76.964 0 l
+76.317 0 l
+76.317 2.617 l
+76.317 2.929 76.262 3.15 76.156 3.279 c
+76.046 3.403 75.89 3.469 75.685 3.469 c
+75.527 3.469 75.38 3.414 75.244 3.308 c
+75.115 3.198 75.013 3.061 74.936 2.896 c
+74.936 0 l
+74.288 0 l
+74.288 3.984 l
+h
+78.787 4.939 m
+78.787 3.984 l
+79.389 3.984 l
+79.389 3.454 l
+78.787 3.454 l
+78.787 0.985 l
+78.787 0.827 78.809 0.709 78.86 0.632 c
+78.919 0.551 79.007 0.515 79.125 0.515 c
+79.213 0.515 79.301 0.53 79.389 0.559 c
+79.389 0 l
+79.242 -0.047 79.088 -0.073 78.934 -0.073 c
+78.676 -0.073 78.481 0.019 78.346 0.206 c
+78.206 0.389 78.14 0.651 78.14 0.985 c
+78.14 3.454 l
+77.537 3.454 l
+77.537 3.984 l
+78.14 3.984 l
+78.14 4.939 l
+h
+84.754 1.794 m
+84.754 1.176 84.64 0.709 84.416 0.397 c
+84.199 0.081 83.876 -0.073 83.446 -0.073 c
+83.023 -0.073 82.711 0.107 82.506 0.47 c
+82.476 0 l
+81.873 0 l
+81.873 5.644 l
+82.52 5.644 l
+82.52 3.543 l
+82.733 3.884 83.042 4.057 83.446 4.057 c
+83.876 4.057 84.199 3.899 84.416 3.587 c
+84.64 3.282 84.754 2.815 84.754 2.19 c
+h
+84.108 2.176 m
+84.108 2.646 84.038 2.977 83.902 3.175 c
+83.773 3.37 83.564 3.469 83.27 3.469 c
+82.936 3.469 82.685 3.285 82.52 2.926 c
+82.52 1.044 l
+82.685 0.68 82.939 0.5 83.285 0.5 c
+83.578 0.5 83.788 0.603 83.917 0.809 c
+84.042 1.014 84.108 1.33 84.108 1.764 c
+h
+87.239 3.366 m
+87.15 3.385 87.051 3.396 86.944 3.396 c
+86.61 3.396 86.375 3.212 86.239 2.852 c
+86.239 0 l
+85.592 0 l
+85.592 3.984 l
+86.224 3.984 l
+86.239 3.572 l
+86.415 3.896 86.658 4.057 86.974 4.057 c
+87.08 4.057 87.169 4.035 87.239 3.998 c
+h
+89.781 0 m
+89.741 0.088 89.715 0.235 89.708 0.441 c
+89.473 0.096 89.178 -0.073 88.826 -0.073 c
+88.462 -0.073 88.179 0.023 87.973 0.221 c
+87.775 0.426 87.68 0.713 87.68 1.088 c
+87.68 1.488 87.815 1.808 88.091 2.043 c
+88.363 2.286 88.738 2.411 89.208 2.411 c
+89.693 2.411 l
+89.693 2.837 l
+89.693 3.072 89.638 3.238 89.531 3.337 c
+89.421 3.443 89.259 3.499 89.047 3.499 c
+88.848 3.499 88.686 3.44 88.561 3.323 c
+88.444 3.205 88.385 3.057 88.385 2.882 c
+87.738 2.882 l
+87.738 3.076 87.797 3.267 87.915 3.454 c
+88.04 3.638 88.201 3.786 88.399 3.896 c
+88.605 4.002 88.833 4.057 89.091 4.057 c
+89.491 4.057 89.796 3.954 90.001 3.749 c
+90.215 3.543 90.329 3.248 90.34 2.866 c
+90.34 0.853 l
+90.34 0.548 90.377 0.283 90.458 0.059 c
+90.458 0 l
+h
+88.914 0.515 m
+89.08 0.515 89.23 0.559 89.37 0.647 c
+89.517 0.736 89.623 0.846 89.693 0.985 c
+89.693 1.926 l
+89.326 1.926 l
+89.01 1.926 88.767 1.856 88.59 1.72 c
+88.414 1.592 88.326 1.404 88.326 1.162 c
+88.326 0.933 88.37 0.769 88.459 0.661 c
+88.547 0.563 88.698 0.515 88.914 0.515 c
+91.957 3.984 m
+91.971 3.543 l
+92.225 3.884 92.548 4.057 92.941 4.057 c
+93.647 4.057 94.003 3.587 94.015 2.646 c
+94.015 0 l
+93.368 0 l
+93.368 2.617 l
+93.368 2.929 93.313 3.15 93.207 3.279 c
+93.096 3.403 92.941 3.469 92.736 3.469 c
+92.578 3.469 92.43 3.414 92.295 3.308 c
+92.166 3.198 92.064 3.061 91.986 2.896 c
+91.986 0 l
+91.339 0 l
+91.339 3.984 l
+h
+96.367 0.485 m
+96.58 0.485 96.752 0.548 96.881 0.676 c
+97.017 0.813 97.091 1.004 97.101 1.249 c
+97.719 1.249 l
+97.697 0.867 97.561 0.548 97.307 0.294 c
+97.05 0.048 96.738 -0.073 96.367 -0.073 c
+95.874 -0.073 95.499 0.077 95.235 0.383 c
+94.977 0.695 94.853 1.162 94.853 1.779 c
+94.853 2.22 l
+94.853 2.815 94.977 3.271 95.235 3.587 c
+95.499 3.899 95.874 4.057 96.367 4.057 c
+96.767 4.057 97.087 3.925 97.322 3.66 c
+97.564 3.403 97.697 3.057 97.719 2.617 c
+97.101 2.617 l
+97.08 2.911 97.006 3.131 96.881 3.279 c
+96.763 3.425 96.59 3.499 96.367 3.499 c
+96.073 3.499 95.856 3.4 95.72 3.205 c
+95.58 3.017 95.507 2.708 95.499 2.279 c
+95.499 1.764 l
+95.499 1.294 95.566 0.96 95.705 0.765 c
+95.852 0.578 96.073 0.485 96.367 0.485 c
+99.115 3.572 m
+99.368 3.896 99.688 4.057 100.071 4.057 c
+100.777 4.057 101.132 3.587 101.144 2.646 c
+101.144 0 l
+100.497 0 l
+100.497 2.617 l
+100.497 2.929 100.442 3.15 100.335 3.279 c
+100.225 3.403 100.071 3.469 99.865 3.469 c
+99.707 3.469 99.56 3.414 99.424 3.308 c
+99.295 3.198 99.192 3.061 99.115 2.896 c
+99.115 0 l
+98.468 0 l
+98.468 5.644 l
+99.115 5.644 l
+h
+102.144 0.353 m
+102.144 0.47 102.177 0.566 102.246 0.647 c
+102.312 0.724 102.415 0.765 102.555 0.765 c
+102.701 0.765 102.809 0.724 102.878 0.647 c
+102.955 0.566 102.996 0.47 102.996 0.353 c
+102.996 0.243 102.955 0.151 102.878 0.073 c
+102.809 -0.004 102.701 -0.044 102.555 -0.044 c
+102.415 -0.044 102.312 -0.004 102.246 0.073 c
+102.177 0.151 102.144 0.243 102.144 0.353 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 343.426 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 336.5872 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+24.133 1.47 m
+24.033 1.477 23.931 1.488 23.824 1.5 c
+23.713 1.517 23.592 1.529 23.456 1.529 c
+23.28 1.529 23.121 1.488 22.986 1.411 c
+22.846 1.341 22.728 1.242 22.633 1.118 c
+22.545 0.989 22.475 0.842 22.427 0.676 c
+22.387 0.507 22.369 0.331 22.369 0.147 c
+22.369 -1.264 l
+21.472 -1.264 l
+21.472 0.985 l
+21.472 1.11 21.461 1.235 21.442 1.353 c
+21.432 1.477 21.417 1.595 21.398 1.706 c
+21.388 1.823 21.373 1.918 21.354 1.999 c
+21.332 2.087 21.314 2.161 21.296 2.22 c
+22.178 2.22 l
+22.185 2.168 22.196 2.117 22.207 2.058 c
+22.225 1.999 22.24 1.933 22.251 1.867 c
+22.269 1.808 22.284 1.742 22.295 1.675 c
+22.302 1.606 22.313 1.544 22.325 1.484 c
+22.339 1.484 l
+22.375 1.602 22.427 1.709 22.486 1.808 c
+22.552 1.904 22.633 1.988 22.722 2.058 c
+22.809 2.124 22.913 2.18 23.03 2.22 c
+23.155 2.257 23.302 2.278 23.471 2.278 c
+23.596 2.278 23.713 2.271 23.824 2.263 c
+23.941 2.253 24.044 2.238 24.133 2.22 c
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.029 25.518 -0.881 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.181 25.047 0.485 c
+25.047 0.816 25.091 1.095 25.18 1.323 c
+25.275 1.558 25.404 1.742 25.562 1.881 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.132 c
+27.664 2.043 27.829 1.911 27.958 1.735 c
+28.094 1.565 28.193 1.359 28.252 1.118 c
+28.318 0.882 28.355 0.617 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.023 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.441 c
+26.26 -0.529 26.344 -0.599 26.444 -0.646 c
+26.539 -0.698 26.653 -0.72 26.782 -0.72 c
+26.936 -0.72 27.076 -0.687 27.194 -0.617 c
+27.318 -0.551 27.407 -0.448 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.482 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.918 27.825 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.649 1.706 26.562 1.691 26.473 1.661 c
+26.385 1.632 26.304 1.58 26.238 1.515 c
+26.169 1.444 26.109 1.357 26.061 1.249 c
+26.021 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.004 27.447 1.124 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.706 26.738 1.706 c
+30.886 1.602 m
+30.886 -1.264 l
+29.99 -1.264 l
+29.99 1.602 l
+29.167 1.602 l
+29.167 2.22 l
+29.99 2.22 l
+29.99 2.484 l
+29.99 2.61 30.005 2.741 30.034 2.881 c
+30.071 3.017 30.14 3.135 30.24 3.234 c
+30.346 3.341 30.489 3.429 30.666 3.499 c
+30.842 3.564 31.067 3.601 31.343 3.601 c
+31.555 3.601 31.754 3.591 31.931 3.572 c
+32.106 3.55 32.257 3.532 32.386 3.514 c
+32.386 2.926 l
+32.257 2.944 32.114 2.959 31.96 2.969 c
+31.802 2.976 31.651 2.984 31.504 2.984 c
+31.376 2.984 31.272 2.969 31.195 2.94 c
+31.115 2.911 31.052 2.87 31.004 2.822 c
+30.953 2.77 30.919 2.708 30.901 2.631 c
+30.89 2.562 30.886 2.484 30.886 2.396 c
+30.886 2.22 l
+32.313 2.22 l
+32.313 1.602 l
+h
+35.407 -0.646 m
+36.538 -0.646 l
+36.538 -1.264 l
+33.232 -1.264 l
+33.232 -0.646 l
+34.495 -0.646 l
+34.495 2.896 l
+33.569 2.896 l
+33.569 3.514 l
+35.407 3.514 l
+h
+40.569 0.485 m
+40.569 0.21 40.533 -0.04 40.467 -0.264 c
+40.397 -0.482 40.294 -0.669 40.158 -0.823 c
+40.018 -0.981 39.842 -1.103 39.629 -1.19 c
+39.412 -1.278 39.158 -1.323 38.865 -1.323 c
+38.589 -1.323 38.343 -1.278 38.13 -1.19 c
+37.924 -1.103 37.751 -0.981 37.615 -0.823 c
+37.475 -0.669 37.373 -0.482 37.307 -0.264 c
+37.236 -0.04 37.203 0.21 37.203 0.485 c
+37.203 0.738 37.233 0.974 37.292 1.191 c
+37.358 1.415 37.461 1.606 37.6 1.764 c
+37.737 1.929 37.913 2.058 38.13 2.146 c
+38.343 2.234 38.6 2.278 38.894 2.278 c
+39.206 2.278 39.467 2.234 39.673 2.146 c
+39.886 2.058 40.059 1.929 40.187 1.764 c
+40.324 1.606 40.423 1.415 40.482 1.191 c
+40.54 0.974 40.569 0.738 40.569 0.485 c
+39.615 0.485 m
+39.615 0.691 39.599 0.867 39.57 1.014 c
+39.548 1.162 39.511 1.282 39.453 1.382 c
+39.393 1.477 39.32 1.548 39.232 1.588 c
+39.144 1.635 39.033 1.661 38.909 1.661 c
+38.644 1.661 38.453 1.562 38.335 1.367 c
+38.218 1.18 38.159 0.886 38.159 0.485 c
+38.159 0.063 38.218 -0.243 38.335 -0.426 c
+38.453 -0.613 38.63 -0.706 38.865 -0.706 c
+38.99 -0.706 39.104 -0.687 39.202 -0.646 c
+39.298 -0.599 39.379 -0.525 39.438 -0.426 c
+39.504 -0.33 39.548 -0.206 39.57 -0.058 c
+39.599 0.088 39.615 0.268 39.615 0.485 c
+42.954 -2.66 m
+42.738 -2.66 42.547 -2.635 42.381 -2.587 c
+42.212 -2.547 42.073 -2.484 41.955 -2.396 c
+41.837 -2.315 41.738 -2.219 41.661 -2.102 c
+41.591 -1.984 41.543 -1.855 41.514 -1.72 c
+42.41 -1.617 l
+42.447 -1.753 42.518 -1.859 42.616 -1.94 c
+42.712 -2.028 42.837 -2.072 42.984 -2.072 c
+43.072 -2.072 43.153 -2.057 43.234 -2.028 c
+43.311 -1.999 43.381 -1.944 43.44 -1.866 c
+43.499 -1.797 43.542 -1.705 43.572 -1.587 c
+43.609 -1.469 43.631 -1.323 43.631 -1.147 c
+43.631 -0.955 l
+43.631 -0.889 43.634 -0.831 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.072 c
+43.017 -1.172 42.811 -1.22 42.587 -1.22 c
+42.381 -1.22 42.198 -1.183 42.044 -1.103 c
+41.896 -1.014 41.768 -0.897 41.661 -0.75 c
+41.562 -0.596 41.488 -0.411 41.441 -0.206 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.771 41.389 1.018 41.441 1.235 c
+41.5 1.448 41.58 1.632 41.691 1.779 c
+41.797 1.933 41.93 2.051 42.088 2.132 c
+42.242 2.22 42.429 2.263 42.646 2.263 c
+42.742 2.263 42.84 2.253 42.94 2.234 c
+43.035 2.213 43.123 2.18 43.204 2.132 c
+43.293 2.08 43.37 2.018 43.44 1.941 c
+43.517 1.86 43.58 1.768 43.631 1.661 c
+43.646 1.661 l
+43.646 1.808 l
+43.653 1.867 43.66 1.918 43.66 1.97 c
+43.667 2.028 43.675 2.076 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.22 c
+44.557 2.22 l
+44.546 2.139 44.535 2.028 44.527 1.881 c
+44.527 1.411 l
+44.527 -1.161 l
+44.527 -1.415 44.49 -1.635 44.425 -1.822 c
+44.355 -2.007 44.251 -2.161 44.116 -2.279 c
+43.976 -2.404 43.811 -2.499 43.616 -2.558 c
+43.418 -2.624 43.197 -2.66 42.954 -2.66 c
+43.646 0.53 m
+43.646 0.742 43.619 0.919 43.572 1.058 c
+43.532 1.205 43.476 1.323 43.41 1.411 c
+43.351 1.5 43.282 1.558 43.204 1.588 c
+43.123 1.625 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.621 42.69 1.573 c
+42.609 1.532 42.543 1.463 42.484 1.367 c
+42.433 1.279 42.389 1.162 42.352 1.014 c
+42.323 0.875 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.366 -0.154 42.484 -0.338 c
+42.601 -0.515 42.763 -0.602 42.969 -0.602 c
+43.035 -0.602 43.109 -0.588 43.189 -0.559 c
+43.278 -0.522 43.351 -0.463 43.41 -0.382 c
+43.476 -0.294 43.532 -0.176 43.572 -0.029 c
+43.619 0.118 43.646 0.301 43.646 0.53 c
+f
+Q
+q 1 0 0 1 60.7924 321.0066 cm
+0 0 m
+2.102 0 l
+2.102 -0.574 l
+-0.676 -0.574 l
+-0.676 4.777 l
+0 4.777 l
+h
+3.513 -0.574 -0.646 3.984 re
+3.557 4.453 m
+3.557 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.314 4.072 3.189 4.072 c
+3.072 4.072 2.977 4.104 2.91 4.174 c
+2.851 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.851 4.663 2.91 4.733 c
+2.977 4.81 3.072 4.85 3.189 4.85 c
+3.314 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.557 4.56 3.557 4.453 c
+6.468 0.44 m
+6.468 0.588 6.412 0.709 6.306 0.808 c
+6.196 0.904 5.99 1.022 5.689 1.161 c
+5.342 1.308 5.101 1.429 4.953 1.529 c
+4.806 1.635 4.696 1.753 4.63 1.881 c
+4.56 2.006 4.527 2.164 4.527 2.352 c
+4.527 2.674 4.644 2.944 4.88 3.16 c
+5.115 3.374 5.416 3.484 5.791 3.484 c
+6.173 3.484 6.482 3.37 6.717 3.145 c
+6.952 2.917 7.07 2.631 7.07 2.278 c
+6.423 2.278 l
+6.423 2.454 6.364 2.605 6.247 2.734 c
+6.129 2.859 5.975 2.925 5.791 2.925 c
+5.593 2.925 5.442 2.869 5.336 2.763 c
+5.225 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.238 5.211 2.131 5.292 2.043 c
+5.369 1.962 5.56 1.859 5.865 1.734 c
+6.342 1.547 6.673 1.359 6.85 1.176 c
+7.025 0.999 7.114 0.771 7.114 0.5 c
+7.114 0.147 6.989 -0.133 6.747 -0.339 c
+6.512 -0.544 6.196 -0.647 5.806 -0.647 c
+5.383 -0.647 5.045 -0.53 4.791 -0.294 c
+4.534 -0.052 4.409 0.253 4.409 0.617 c
+5.056 0.617 l
+5.064 0.389 5.134 0.213 5.262 0.087 c
+5.387 -0.03 5.571 -0.088 5.806 -0.088 c
+6.019 -0.088 6.181 -0.04 6.291 0.058 c
+6.408 0.154 6.468 0.282 6.468 0.44 c
+8.804 4.365 m
+8.804 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.804 2.881 l
+8.804 0.411 l
+8.804 0.253 8.827 0.135 8.878 0.058 c
+8.937 -0.023 9.025 -0.059 9.142 -0.059 c
+9.231 -0.059 9.319 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.26 -0.621 9.105 -0.647 8.951 -0.647 c
+8.694 -0.647 8.5 -0.555 8.363 -0.368 c
+8.224 -0.184 8.158 0.077 8.158 0.411 c
+8.158 2.881 l
+7.555 2.881 l
+7.555 3.41 l
+8.158 3.41 l
+8.158 4.365 l
+h
+11.759 1.602 m
+11.759 2.179 11.895 2.634 12.17 2.969 c
+12.454 3.31 12.825 3.484 13.288 3.484 c
+13.747 3.484 14.115 3.314 14.39 2.984 c
+14.673 2.66 14.82 2.212 14.831 1.646 c
+14.831 1.22 l
+14.831 0.65 14.688 0.195 14.405 -0.148 c
+14.129 -0.482 13.762 -0.647 13.302 -0.647 c
+12.839 -0.647 12.469 -0.485 12.185 -0.162 c
+11.91 0.168 11.766 0.61 11.759 1.161 c
+h
+12.406 1.22 m
+12.406 0.816 12.483 0.5 12.641 0.264 c
+12.806 0.029 13.026 -0.088 13.302 -0.088 c
+13.868 -0.088 14.162 0.323 14.184 1.146 c
+14.184 1.602 l
+14.184 2.003 14.1 2.322 13.934 2.557 c
+13.776 2.8 13.56 2.925 13.288 2.925 c
+13.023 2.925 12.806 2.8 12.641 2.557 c
+12.483 2.322 12.406 2.003 12.406 1.602 c
+h
+18.549 1.22 m
+18.549 0.592 18.432 0.121 18.197 -0.191 c
+17.969 -0.497 17.653 -0.647 17.242 -0.647 c
+16.837 -0.647 16.529 -0.497 16.315 -0.191 c
+16.315 -2.103 l
+15.669 -2.103 l
+15.669 3.41 l
+16.257 3.41 l
+16.301 2.969 l
+16.514 3.31 16.823 3.484 17.227 3.484 c
+17.668 3.484 17.995 3.329 18.212 3.027 c
+18.425 2.722 18.539 2.267 18.549 1.66 c
+h
+17.903 1.602 m
+17.903 2.043 17.834 2.366 17.697 2.572 c
+17.558 2.786 17.337 2.896 17.036 2.896 c
+16.72 2.896 16.481 2.741 16.315 2.439 c
+16.315 0.367 l
+16.481 0.062 16.72 -0.088 17.036 -0.088 c
+17.33 -0.088 17.543 0.014 17.683 0.22 c
+17.819 0.434 17.892 0.764 17.903 1.205 c
+h
+20.814 -0.647 m
+20.313 -0.647 19.931 -0.5 19.667 -0.206 c
+19.403 0.087 19.27 0.521 19.27 1.103 c
+19.27 1.573 l
+19.27 2.167 19.395 2.634 19.652 2.969 c
+19.917 3.31 20.277 3.484 20.74 3.484 c
+21.2 3.484 21.541 3.329 21.769 3.027 c
+22.004 2.734 22.125 2.271 22.137 1.646 c
+22.137 1.22 l
+19.917 1.22 l
+19.917 1.132 l
+19.917 0.698 19.994 0.386 20.153 0.191 c
+20.317 0.004 20.549 -0.088 20.843 -0.088 c
+21.038 -0.088 21.211 -0.055 21.358 0.014 c
+21.504 0.091 21.641 0.209 21.769 0.367 c
+22.107 -0.044 l
+21.82 -0.449 21.391 -0.647 20.814 -0.647 c
+20.74 2.925 m
+20.465 2.925 20.263 2.829 20.137 2.645 c
+20.009 2.458 19.935 2.167 19.917 1.778 c
+21.489 1.778 l
+21.489 1.866 l
+21.468 2.248 21.402 2.516 21.284 2.674 c
+21.167 2.84 20.982 2.925 20.74 2.925 c
+24.562 2.792 m
+24.473 2.811 24.375 2.822 24.268 2.822 c
+23.933 2.822 23.698 2.638 23.563 2.278 c
+23.563 -0.574 l
+22.915 -0.574 l
+22.915 3.41 l
+23.548 3.41 l
+23.563 2.998 l
+23.739 3.322 23.981 3.484 24.297 3.484 c
+24.404 3.484 24.492 3.461 24.562 3.424 c
+h
+27.105 -0.574 m
+27.064 -0.485 27.039 -0.339 27.031 -0.133 c
+26.796 -0.478 26.503 -0.647 26.15 -0.647 c
+25.786 -0.647 25.503 -0.551 25.296 -0.353 c
+25.098 -0.148 25.003 0.139 25.003 0.515 c
+25.003 0.914 25.138 1.234 25.414 1.469 c
+25.686 1.712 26.061 1.837 26.532 1.837 c
+27.016 1.837 l
+27.016 2.263 l
+27.016 2.499 26.962 2.664 26.855 2.763 c
+26.744 2.869 26.582 2.925 26.37 2.925 c
+26.171 2.925 26.01 2.866 25.884 2.749 c
+25.767 2.631 25.709 2.484 25.709 2.308 c
+25.061 2.308 l
+25.061 2.502 25.121 2.693 25.238 2.881 c
+25.363 3.064 25.525 3.212 25.723 3.322 c
+25.929 3.428 26.156 3.484 26.414 3.484 c
+26.815 3.484 27.12 3.38 27.326 3.175 c
+27.538 2.969 27.652 2.674 27.663 2.293 c
+27.663 0.279 l
+27.663 -0.026 27.7 -0.291 27.781 -0.515 c
+27.781 -0.574 l
+h
+26.237 -0.059 m
+26.403 -0.059 26.553 -0.015 26.693 0.073 c
+26.84 0.162 26.947 0.272 27.016 0.411 c
+27.016 1.352 l
+26.649 1.352 l
+26.333 1.352 26.09 1.282 25.915 1.146 c
+25.738 1.018 25.649 0.83 25.649 0.588 c
+25.649 0.359 25.693 0.195 25.782 0.087 c
+25.87 -0.011 26.021 -0.059 26.237 -0.059 c
+29.516 4.365 m
+29.516 3.41 l
+30.118 3.41 l
+30.118 2.881 l
+29.516 2.881 l
+29.516 0.411 l
+29.516 0.253 29.537 0.135 29.589 0.058 c
+29.647 -0.023 29.736 -0.059 29.853 -0.059 c
+29.942 -0.059 30.03 -0.044 30.118 -0.015 c
+30.118 -0.574 l
+29.971 -0.621 29.817 -0.647 29.662 -0.647 c
+29.405 -0.647 29.21 -0.555 29.074 -0.368 c
+28.934 -0.184 28.868 0.077 28.868 0.411 c
+28.868 2.881 l
+28.266 2.881 l
+28.266 3.41 l
+28.868 3.41 l
+28.868 4.365 l
+h
+31.588 -0.574 -0.647 3.984 re
+31.632 4.453 m
+31.632 4.343 31.602 4.251 31.544 4.174 c
+31.485 4.104 31.39 4.072 31.265 4.072 c
+31.147 4.072 31.051 4.104 30.985 4.174 c
+30.927 4.251 30.897 4.343 30.897 4.453 c
+30.897 4.571 30.927 4.663 30.985 4.733 c
+31.051 4.81 31.147 4.85 31.265 4.85 c
+31.39 4.85 31.485 4.81 31.544 4.733 c
+31.602 4.652 31.632 4.56 31.632 4.453 c
+32.47 1.602 m
+32.47 2.179 32.606 2.634 32.882 2.969 c
+33.165 3.31 33.535 3.484 33.998 3.484 c
+34.458 3.484 34.825 3.314 35.101 2.984 c
+35.384 2.66 35.531 2.212 35.542 1.646 c
+35.542 1.22 l
+35.542 0.65 35.399 0.195 35.116 -0.148 c
+34.84 -0.482 34.472 -0.647 34.013 -0.647 c
+33.551 -0.647 33.179 -0.485 32.896 -0.162 c
+32.62 0.168 32.477 0.61 32.47 1.161 c
+h
+33.117 1.22 m
+33.117 0.816 33.194 0.5 33.352 0.264 c
+33.518 0.029 33.738 -0.088 34.013 -0.088 c
+34.579 -0.088 34.873 0.323 34.895 1.146 c
+34.895 1.602 l
+34.895 2.003 34.811 2.322 34.646 2.557 c
+34.488 2.8 34.27 2.925 33.998 2.925 c
+33.734 2.925 33.518 2.8 33.352 2.557 c
+33.194 2.322 33.117 2.003 33.117 1.602 c
+h
+36.997 3.41 m
+37.012 2.969 l
+37.266 3.31 37.589 3.484 37.982 3.484 c
+38.688 3.484 39.044 3.013 39.055 2.072 c
+39.055 -0.574 l
+38.409 -0.574 l
+38.409 2.043 l
+38.409 2.356 38.353 2.576 38.247 2.705 c
+38.137 2.829 37.982 2.896 37.776 2.896 c
+37.618 2.896 37.472 2.84 37.335 2.734 c
+37.206 2.624 37.104 2.487 37.027 2.322 c
+37.027 -0.574 l
+36.38 -0.574 l
+36.38 3.41 l
+h
+41.965 0.44 m
+41.965 0.588 41.91 0.709 41.804 0.808 c
+41.694 0.904 41.488 1.022 41.187 1.161 c
+40.841 1.308 40.599 1.429 40.452 1.529 c
+40.304 1.635 40.194 1.753 40.128 1.881 c
+40.059 2.006 40.026 2.164 40.026 2.352 c
+40.026 2.674 40.143 2.944 40.378 3.16 c
+40.614 3.374 40.915 3.484 41.289 3.484 c
+41.672 3.484 41.98 3.37 42.216 3.145 c
+42.451 2.917 42.568 2.631 42.568 2.278 c
+41.921 2.278 l
+41.921 2.454 41.863 2.605 41.745 2.734 c
+41.628 2.859 41.473 2.925 41.289 2.925 c
+41.091 2.925 40.94 2.869 40.834 2.763 c
+40.724 2.664 40.672 2.532 40.672 2.366 c
+40.672 2.238 40.709 2.131 40.79 2.043 c
+40.867 1.962 41.058 1.859 41.362 1.734 c
+41.84 1.547 42.171 1.359 42.347 1.176 c
+42.524 0.999 42.613 0.771 42.613 0.5 c
+42.613 0.147 42.488 -0.133 42.245 -0.339 c
+42.01 -0.544 41.694 -0.647 41.304 -0.647 c
+40.882 -0.647 40.543 -0.53 40.29 -0.294 c
+40.032 -0.052 39.908 0.253 39.908 0.617 c
+40.554 0.617 l
+40.562 0.389 40.631 0.213 40.76 0.087 c
+40.885 -0.03 41.069 -0.088 41.304 -0.088 c
+41.518 -0.088 41.679 -0.04 41.79 0.058 c
+41.907 0.154 41.965 0.282 41.965 0.44 c
+45.156 1.602 m
+45.156 2.238 45.243 2.84 45.42 3.41 c
+45.596 3.976 45.838 4.472 46.155 4.895 c
+46.349 5.159 46.536 5.35 46.713 5.468 c
+46.846 5.012 l
+46.552 4.737 46.309 4.314 46.125 3.748 c
+45.938 3.179 45.835 2.547 45.817 1.851 c
+45.817 1.558 l
+45.817 0.694 45.934 -0.071 46.17 -0.736 c
+46.353 -1.235 46.581 -1.617 46.846 -1.881 c
+46.713 -2.308 l
+46.486 -2.15 46.261 -1.9 46.037 -1.559 c
+45.449 -0.676 45.156 0.374 45.156 1.602 c
+48.242 -0.574 -0.647 5.644 re
+49.962 -0.574 -0.646 3.984 re
+50.006 4.453 m
+50.006 4.343 49.977 4.251 49.918 4.174 c
+49.859 4.104 49.763 4.072 49.638 4.072 c
+49.521 4.072 49.426 4.104 49.359 4.174 c
+49.3 4.251 49.271 4.343 49.271 4.453 c
+49.271 4.571 49.3 4.663 49.359 4.733 c
+49.426 4.81 49.521 4.85 49.638 4.85 c
+49.763 4.85 49.859 4.81 49.918 4.733 c
+49.977 4.652 50.006 4.56 50.006 4.453 c
+51.976 1.249 m
+51.637 0.852 l
+51.637 -0.574 l
+50.976 -0.574 l
+50.976 5.071 l
+51.637 5.071 l
+51.637 1.691 l
+52.872 3.41 l
+53.651 3.41 l
+52.387 1.749 l
+53.813 -0.574 l
+53.063 -0.574 l
+h
+55.724 -0.647 m
+55.224 -0.647 54.842 -0.5 54.577 -0.206 c
+54.313 0.087 54.18 0.521 54.18 1.103 c
+54.18 1.573 l
+54.18 2.167 54.305 2.634 54.563 2.969 c
+54.827 3.31 55.188 3.484 55.65 3.484 c
+56.109 3.484 56.451 3.329 56.68 3.027 c
+56.915 2.734 57.036 2.271 57.046 1.646 c
+57.046 1.22 l
+54.827 1.22 l
+54.827 1.132 l
+54.827 0.698 54.904 0.386 55.062 0.191 c
+55.228 0.004 55.459 -0.088 55.753 -0.088 c
+55.948 -0.088 56.121 -0.055 56.268 0.014 c
+56.414 0.091 56.551 0.209 56.68 0.367 c
+57.017 -0.044 l
+56.73 -0.449 56.3 -0.647 55.724 -0.647 c
+55.65 2.925 m
+55.375 2.925 55.172 2.829 55.047 2.645 c
+54.919 2.458 54.845 2.167 54.827 1.778 c
+56.4 1.778 l
+56.4 1.866 l
+56.378 2.248 56.312 2.516 56.194 2.674 c
+56.077 2.84 55.893 2.925 55.65 2.925 c
+60.927 -0.088 m
+61.141 -0.088 61.313 -0.026 61.442 0.103 c
+61.578 0.239 61.651 0.43 61.663 0.675 c
+62.28 0.675 l
+62.257 0.294 62.122 -0.026 61.868 -0.279 c
+61.611 -0.526 61.299 -0.647 60.927 -0.647 c
+60.435 -0.647 60.06 -0.497 59.795 -0.191 c
+59.538 0.121 59.413 0.588 59.413 1.205 c
+59.413 1.646 l
+59.413 2.241 59.538 2.697 59.795 3.013 c
+60.06 3.326 60.435 3.484 60.927 3.484 c
+61.328 3.484 61.648 3.351 61.883 3.087 c
+62.125 2.829 62.257 2.484 62.28 2.043 c
+61.663 2.043 l
+61.64 2.337 61.567 2.557 61.442 2.705 c
+61.324 2.851 61.152 2.925 60.927 2.925 c
+60.633 2.925 60.416 2.826 60.281 2.631 c
+60.141 2.443 60.067 2.135 60.06 1.705 c
+60.06 1.19 l
+60.06 0.72 60.126 0.386 60.266 0.191 c
+60.412 0.004 60.633 -0.088 60.927 -0.088 c
+63.676 2.998 m
+63.93 3.322 64.25 3.484 64.632 3.484 c
+65.337 3.484 65.694 3.013 65.704 2.072 c
+65.704 -0.574 l
+65.058 -0.574 l
+65.058 2.043 l
+65.058 2.356 65.002 2.576 64.896 2.705 c
+64.786 2.829 64.632 2.896 64.426 2.896 c
+64.268 2.896 64.121 2.84 63.984 2.734 c
+63.856 2.624 63.753 2.487 63.676 2.322 c
+63.676 -0.574 l
+63.03 -0.574 l
+63.03 5.071 l
+63.676 5.071 l
+h
+68.086 -0.647 m
+67.586 -0.647 67.204 -0.5 66.939 -0.206 c
+66.675 0.087 66.542 0.521 66.542 1.103 c
+66.542 1.573 l
+66.542 2.167 66.667 2.634 66.924 2.969 c
+67.189 3.31 67.549 3.484 68.013 3.484 c
+68.472 3.484 68.813 3.329 69.041 3.027 c
+69.276 2.734 69.397 2.271 69.409 1.646 c
+69.409 1.22 l
+67.189 1.22 l
+67.189 1.132 l
+67.189 0.698 67.267 0.386 67.425 0.191 c
+67.589 0.004 67.821 -0.088 68.115 -0.088 c
+68.31 -0.088 68.483 -0.055 68.63 0.014 c
+68.777 0.091 68.913 0.209 69.041 0.367 c
+69.38 -0.044 l
+69.093 -0.449 68.663 -0.647 68.086 -0.647 c
+68.013 2.925 m
+67.737 2.925 67.535 2.829 67.41 2.645 c
+67.281 2.458 67.207 2.167 67.189 1.778 c
+68.761 1.778 l
+68.761 1.866 l
+68.74 2.248 68.674 2.516 68.556 2.674 c
+68.439 2.84 68.254 2.925 68.013 2.925 c
+71.57 -0.088 m
+71.782 -0.088 71.955 -0.026 72.084 0.103 c
+72.22 0.239 72.293 0.43 72.304 0.675 c
+72.921 0.675 l
+72.9 0.294 72.763 -0.026 72.51 -0.279 c
+72.253 -0.526 71.94 -0.647 71.57 -0.647 c
+71.077 -0.647 70.702 -0.497 70.438 -0.191 c
+70.18 0.121 70.055 0.588 70.055 1.205 c
+70.055 1.646 l
+70.055 2.241 70.18 2.697 70.438 3.013 c
+70.702 3.326 71.077 3.484 71.57 3.484 c
+71.97 3.484 72.289 3.351 72.524 3.087 c
+72.767 2.829 72.9 2.484 72.921 2.043 c
+72.304 2.043 l
+72.283 2.337 72.208 2.557 72.084 2.705 c
+71.967 2.851 71.793 2.925 71.57 2.925 c
+71.275 2.925 71.059 2.826 70.922 2.631 c
+70.783 2.443 70.71 2.135 70.702 1.705 c
+70.702 1.19 l
+70.702 0.72 70.768 0.386 70.908 0.191 c
+71.055 0.004 71.275 -0.088 71.57 -0.088 c
+74.671 1.249 m
+74.333 0.852 l
+74.333 -0.574 l
+73.671 -0.574 l
+73.671 5.071 l
+74.333 5.071 l
+74.333 1.691 l
+75.568 3.41 l
+76.347 3.41 l
+75.082 1.749 l
+76.508 -0.574 l
+75.759 -0.574 l
+h
+76.935 1.602 m
+76.935 2.179 77.07 2.634 77.346 2.969 c
+77.629 3.31 78 3.484 78.463 3.484 c
+78.922 3.484 79.29 3.314 79.566 2.984 c
+79.849 2.66 79.996 2.212 80.007 1.646 c
+80.007 1.22 l
+80.007 0.65 79.863 0.195 79.58 -0.148 c
+79.304 -0.482 78.937 -0.647 78.478 -0.647 c
+78.015 -0.647 77.644 -0.485 77.361 -0.162 c
+77.085 0.168 76.942 0.61 76.935 1.161 c
+h
+77.581 1.22 m
+77.581 0.816 77.658 0.5 77.816 0.264 c
+77.982 0.029 78.203 -0.088 78.478 -0.088 c
+79.044 -0.088 79.338 0.323 79.36 1.146 c
+79.36 1.602 l
+79.36 2.003 79.275 2.322 79.11 2.557 c
+78.952 2.8 78.735 2.925 78.463 2.925 c
+78.199 2.925 77.982 2.8 77.816 2.557 c
+77.658 2.322 77.581 2.003 77.581 1.602 c
+h
+82.873 -0.221 m
+82.656 -0.507 82.344 -0.647 81.932 -0.647 c
+81.569 -0.647 81.293 -0.526 81.109 -0.279 c
+80.933 -0.026 80.837 0.338 80.83 0.808 c
+80.83 3.41 l
+81.477 3.41 l
+81.477 0.867 l
+81.477 0.239 81.66 -0.073 82.035 -0.073 c
+82.436 -0.073 82.712 0.103 82.858 0.455 c
+82.858 3.41 l
+83.505 3.41 l
+83.505 -0.574 l
+82.888 -0.574 l
+h
+85.342 4.365 m
+85.342 3.41 l
+85.945 3.41 l
+85.945 2.881 l
+85.342 2.881 l
+85.342 0.411 l
+85.342 0.253 85.365 0.135 85.416 0.058 c
+85.475 -0.023 85.563 -0.059 85.681 -0.059 c
+85.769 -0.059 85.857 -0.044 85.945 -0.015 c
+85.945 -0.574 l
+85.798 -0.621 85.644 -0.647 85.49 -0.647 c
+85.232 -0.647 85.037 -0.555 84.902 -0.368 c
+84.762 -0.184 84.696 0.077 84.696 0.411 c
+84.696 2.881 l
+84.093 2.881 l
+84.093 3.41 l
+84.696 3.41 l
+84.696 4.365 l
+h
+88.65 0.44 m
+88.65 0.588 88.594 0.709 88.488 0.808 c
+88.378 0.904 88.172 1.022 87.871 1.161 c
+87.525 1.308 87.283 1.429 87.136 1.529 c
+86.988 1.635 86.878 1.753 86.812 1.881 c
+86.743 2.006 86.71 2.164 86.71 2.352 c
+86.71 2.674 86.827 2.944 87.063 3.16 c
+87.298 3.374 87.599 3.484 87.973 3.484 c
+88.356 3.484 88.665 3.37 88.9 3.145 c
+89.135 2.917 89.253 2.631 89.253 2.278 c
+88.605 2.278 l
+88.605 2.454 88.547 2.605 88.429 2.734 c
+88.312 2.859 88.158 2.925 87.973 2.925 c
+87.775 2.925 87.624 2.869 87.518 2.763 c
+87.408 2.664 87.356 2.532 87.356 2.366 c
+87.356 2.238 87.393 2.131 87.474 2.043 c
+87.551 1.962 87.742 1.859 88.047 1.734 c
+88.525 1.547 88.856 1.359 89.032 1.176 c
+89.208 0.999 89.297 0.771 89.297 0.5 c
+89.297 0.147 89.172 -0.133 88.929 -0.339 c
+88.694 -0.544 88.378 -0.647 87.988 -0.647 c
+87.566 -0.647 87.227 -0.53 86.974 -0.294 c
+86.716 -0.052 86.592 0.253 86.592 0.617 c
+87.239 0.617 l
+87.246 0.389 87.316 0.213 87.445 0.087 c
+87.57 -0.03 87.753 -0.088 87.988 -0.088 c
+88.201 -0.088 88.363 -0.04 88.474 0.058 c
+88.591 0.154 88.65 0.282 88.65 0.44 c
+90.149 -1.646 m
+89.752 -1.382 l
+89.987 -1.058 90.109 -0.724 90.12 -0.383 c
+90.12 0.235 l
+90.781 0.235 l
+90.781 -0.294 l
+90.781 -0.551 90.715 -0.798 90.59 -1.044 c
+90.473 -1.287 90.325 -1.488 90.149 -1.646 c
+94.72 -0.088 m
+94.934 -0.088 95.106 -0.026 95.235 0.103 c
+95.371 0.239 95.445 0.43 95.455 0.675 c
+96.073 0.675 l
+96.05 0.294 95.915 -0.026 95.661 -0.279 c
+95.404 -0.526 95.092 -0.647 94.72 -0.647 c
+94.228 -0.647 93.853 -0.497 93.589 -0.191 c
+93.332 0.121 93.207 0.588 93.207 1.205 c
+93.207 1.646 l
+93.207 2.241 93.332 2.697 93.589 3.013 c
+93.853 3.326 94.228 3.484 94.72 3.484 c
+95.121 3.484 95.441 3.351 95.676 3.087 c
+95.919 2.829 96.05 2.484 96.073 2.043 c
+95.455 2.043 l
+95.433 2.337 95.36 2.557 95.235 2.705 c
+95.117 2.851 94.944 2.925 94.72 2.925 c
+94.427 2.925 94.209 2.826 94.074 2.631 c
+93.934 2.443 93.86 2.135 93.853 1.705 c
+93.853 1.19 l
+93.853 0.72 93.92 0.386 94.059 0.191 c
+94.206 0.004 94.427 -0.088 94.72 -0.088 c
+96.69 1.602 m
+96.69 2.179 96.826 2.634 97.101 2.969 c
+97.384 3.31 97.756 3.484 98.219 3.484 c
+98.678 3.484 99.046 3.314 99.321 2.984 c
+99.605 2.66 99.751 2.212 99.763 1.646 c
+99.763 1.22 l
+99.763 0.65 99.619 0.195 99.335 -0.148 c
+99.06 -0.482 98.693 -0.647 98.234 -0.647 c
+97.77 -0.647 97.399 -0.485 97.116 -0.162 c
+96.841 0.168 96.698 0.61 96.69 1.161 c
+h
+97.336 1.22 m
+97.336 0.816 97.414 0.5 97.572 0.264 c
+97.737 0.029 97.958 -0.088 98.234 -0.088 c
+98.799 -0.088 99.094 0.323 99.115 1.146 c
+99.115 1.602 l
+99.115 2.003 99.031 2.322 98.865 2.557 c
+98.707 2.8 98.491 2.925 98.219 2.925 c
+97.954 2.925 97.737 2.8 97.572 2.557 c
+97.414 2.322 97.336 2.003 97.336 1.602 c
+h
+101.217 3.41 m
+101.232 3.042 l
+101.475 3.337 101.795 3.484 102.188 3.484 c
+102.628 3.484 102.938 3.285 103.114 2.896 c
+103.368 3.285 103.717 3.484 104.157 3.484 c
+104.892 3.484 105.267 3.021 105.289 2.102 c
+105.289 -0.574 l
+104.642 -0.574 l
+104.642 2.043 l
+104.642 2.337 104.587 2.55 104.48 2.69 c
+104.382 2.826 104.209 2.896 103.966 2.896 c
+103.767 2.896 103.606 2.815 103.481 2.66 c
+103.364 2.514 103.293 2.322 103.275 2.087 c
+103.275 -0.574 l
+102.614 -0.574 l
+102.614 2.072 l
+102.614 2.62 102.393 2.896 101.953 2.896 c
+101.618 2.896 101.383 2.734 101.247 2.41 c
+101.247 -0.574 l
+100.6 -0.574 l
+100.6 3.41 l
+h
+106.876 3.41 m
+106.892 3.042 l
+107.134 3.337 107.453 3.484 107.846 3.484 c
+108.288 3.484 108.596 3.285 108.773 2.896 c
+109.026 3.285 109.375 3.484 109.816 3.484 c
+110.551 3.484 110.926 3.021 110.948 2.102 c
+110.948 -0.574 l
+110.302 -0.574 l
+110.302 2.043 l
+110.302 2.337 110.246 2.55 110.14 2.69 c
+110.04 2.826 109.868 2.896 109.625 2.896 c
+109.427 2.896 109.265 2.815 109.14 2.66 c
+109.022 2.514 108.953 2.322 108.935 2.087 c
+108.935 -0.574 l
+108.273 -0.574 l
+108.273 2.072 l
+108.273 2.62 108.052 2.896 107.611 2.896 c
+107.277 2.896 107.042 2.734 106.906 2.41 c
+106.906 -0.574 l
+106.259 -0.574 l
+106.259 3.41 l
+h
+112.623 -0.574 -0.646 3.984 re
+112.668 4.453 m
+112.668 4.343 112.638 4.251 112.58 4.174 c
+112.521 4.104 112.425 4.072 112.301 4.072 c
+112.183 4.072 112.087 4.104 112.021 4.174 c
+111.962 4.251 111.933 4.343 111.933 4.453 c
+111.933 4.571 111.962 4.663 112.021 4.733 c
+112.087 4.81 112.183 4.85 112.301 4.85 c
+112.425 4.85 112.521 4.81 112.58 4.733 c
+112.638 4.652 112.668 4.56 112.668 4.453 c
+114.491 4.365 m
+114.491 3.41 l
+115.093 3.41 l
+115.093 2.881 l
+114.491 2.881 l
+114.491 0.411 l
+114.491 0.253 114.512 0.135 114.564 0.058 c
+114.622 -0.023 114.711 -0.059 114.829 -0.059 c
+114.917 -0.059 115.005 -0.044 115.093 -0.015 c
+115.093 -0.574 l
+114.946 -0.621 114.792 -0.647 114.638 -0.647 c
+114.381 -0.647 114.186 -0.555 114.05 -0.368 c
+113.91 -0.184 113.844 0.077 113.844 0.411 c
+113.844 2.881 l
+113.242 2.881 l
+113.242 3.41 l
+113.844 3.41 l
+113.844 4.365 l
+h
+117.798 0.44 m
+117.798 0.588 117.743 0.709 117.637 0.808 c
+117.526 0.904 117.321 1.022 117.019 1.161 c
+116.673 1.308 116.431 1.429 116.284 1.529 c
+116.137 1.635 116.027 1.753 115.96 1.881 c
+115.891 2.006 115.858 2.164 115.858 2.352 c
+115.858 2.674 115.975 2.944 116.21 3.16 c
+116.446 3.374 116.747 3.484 117.122 3.484 c
+117.504 3.484 117.813 3.37 118.048 3.145 c
+118.283 2.917 118.401 2.631 118.401 2.278 c
+117.754 2.278 l
+117.754 2.454 117.695 2.605 117.577 2.734 c
+117.46 2.859 117.305 2.925 117.122 2.925 c
+116.924 2.925 116.773 2.869 116.666 2.763 c
+116.556 2.664 116.504 2.532 116.504 2.366 c
+116.504 2.238 116.542 2.131 116.622 2.043 c
+116.699 1.962 116.891 1.859 117.195 1.734 c
+117.673 1.547 118.004 1.359 118.18 1.176 c
+118.356 0.999 118.445 0.771 118.445 0.5 c
+118.445 0.147 118.32 -0.133 118.077 -0.339 c
+117.842 -0.544 117.526 -0.647 117.136 -0.647 c
+116.714 -0.647 116.376 -0.53 116.122 -0.294 c
+115.865 -0.052 115.74 0.253 115.74 0.617 c
+116.386 0.617 l
+116.394 0.389 116.464 0.213 116.592 0.087 c
+116.718 -0.03 116.901 -0.088 117.136 -0.088 c
+117.35 -0.088 117.512 -0.04 117.622 0.058 c
+117.739 0.154 117.798 0.282 117.798 0.44 c
+122.428 -0.647 m
+121.928 -0.647 121.546 -0.5 121.282 -0.206 c
+121.017 0.087 120.885 0.521 120.885 1.103 c
+120.885 1.573 l
+120.885 2.167 121.01 2.634 121.267 2.969 c
+121.531 3.31 121.892 3.484 122.354 3.484 c
+122.814 3.484 123.156 3.329 123.384 3.027 c
+123.619 2.734 123.74 2.271 123.751 1.646 c
+123.751 1.22 l
+121.531 1.22 l
+121.531 1.132 l
+121.531 0.698 121.608 0.386 121.766 0.191 c
+121.932 0.004 122.163 -0.088 122.458 -0.088 c
+122.653 -0.088 122.825 -0.055 122.972 0.014 c
+123.119 0.091 123.255 0.209 123.384 0.367 c
+123.721 -0.044 l
+123.435 -0.449 123.005 -0.647 122.428 -0.647 c
+122.354 2.925 m
+122.079 2.925 121.877 2.829 121.752 2.645 c
+121.623 2.458 121.55 2.167 121.531 1.778 c
+123.104 1.778 l
+123.104 1.866 l
+123.083 2.248 123.016 2.516 122.898 2.674 c
+122.781 2.84 122.597 2.925 122.354 2.925 c
+125.383 4.365 m
+125.383 3.41 l
+125.986 3.41 l
+125.986 2.881 l
+125.383 2.881 l
+125.383 0.411 l
+125.383 0.253 125.404 0.135 125.456 0.058 c
+125.515 -0.023 125.603 -0.059 125.72 -0.059 c
+125.809 -0.059 125.897 -0.044 125.986 -0.015 c
+125.986 -0.574 l
+125.838 -0.621 125.684 -0.647 125.529 -0.647 c
+125.273 -0.647 125.078 -0.555 124.941 -0.368 c
+124.802 -0.184 124.735 0.077 124.735 0.411 c
+124.735 2.881 l
+124.133 2.881 l
+124.133 3.41 l
+124.735 3.41 l
+124.735 4.365 l
+h
+128.132 -0.088 m
+128.344 -0.088 128.517 -0.026 128.646 0.103 c
+128.782 0.239 128.855 0.43 128.866 0.675 c
+129.483 0.675 l
+129.462 0.294 129.325 -0.026 129.072 -0.279 c
+128.814 -0.526 128.502 -0.647 128.132 -0.647 c
+127.639 -0.647 127.264 -0.497 127 -0.191 c
+126.742 0.121 126.617 0.588 126.617 1.205 c
+126.617 1.646 l
+126.617 2.241 126.742 2.697 127 3.013 c
+127.264 3.326 127.639 3.484 128.132 3.484 c
+128.532 3.484 128.851 3.351 129.086 3.087 c
+129.329 2.829 129.462 2.484 129.483 2.043 c
+128.866 2.043 l
+128.845 2.337 128.771 2.557 128.646 2.705 c
+128.529 2.851 128.355 2.925 128.132 2.925 c
+127.837 2.925 127.621 2.826 127.484 2.631 c
+127.345 2.443 127.272 2.135 127.264 1.705 c
+127.264 1.19 l
+127.264 0.72 127.33 0.386 127.47 0.191 c
+127.617 0.004 127.837 -0.088 128.132 -0.088 c
+130.277 -0.221 m
+130.277 -0.103 130.31 -0.008 130.38 0.073 c
+130.447 0.151 130.549 0.191 130.689 0.191 c
+130.836 0.191 130.942 0.151 131.012 0.073 c
+131.089 -0.008 131.13 -0.103 131.13 -0.221 c
+131.13 -0.331 131.089 -0.423 131.012 -0.5 c
+130.942 -0.578 130.836 -0.618 130.689 -0.618 c
+130.549 -0.618 130.447 -0.578 130.38 -0.5 c
+130.31 -0.423 130.277 -0.331 130.277 -0.221 c
+133.614 1.558 m
+133.614 0.47 133.368 -0.497 132.879 -1.338 c
+132.614 -1.786 132.339 -2.11 132.056 -2.308 c
+131.939 -1.881 l
+132.24 -1.588 132.486 -1.135 132.673 -0.53 c
+132.868 0.077 132.967 0.742 132.967 1.469 c
+132.967 1.602 l
+132.967 2.532 132.813 3.366 132.512 4.101 c
+132.342 4.501 132.151 4.821 131.939 5.056 c
+132.056 5.468 l
+132.328 5.28 132.593 4.983 132.849 4.571 c
+133.356 3.719 133.614 2.711 133.614 1.558 c
+136.951 3.41 m
+136.965 3.042 l
+137.208 3.337 137.528 3.484 137.921 3.484 c
+138.362 3.484 138.671 3.285 138.847 2.896 c
+139.101 3.285 139.45 3.484 139.891 3.484 c
+140.625 3.484 141.001 3.021 141.022 2.102 c
+141.022 -0.574 l
+140.375 -0.574 l
+140.375 2.043 l
+140.375 2.337 140.321 2.55 140.214 2.69 c
+140.115 2.826 139.942 2.896 139.7 2.896 c
+139.501 2.896 139.339 2.815 139.214 2.66 c
+139.097 2.514 139.027 2.322 139.008 2.087 c
+139.008 -0.574 l
+138.347 -0.574 l
+138.347 2.072 l
+138.347 2.62 138.127 2.896 137.686 2.896 c
+137.352 2.896 137.117 2.734 136.98 2.41 c
+136.98 -0.574 l
+136.334 -0.574 l
+136.334 3.41 l
+h
+144.036 -0.574 m
+143.995 -0.485 143.97 -0.339 143.962 -0.133 c
+143.727 -0.478 143.433 -0.647 143.08 -0.647 c
+142.717 -0.647 142.434 -0.551 142.228 -0.353 c
+142.029 -0.148 141.934 0.139 141.934 0.515 c
+141.934 0.914 142.07 1.234 142.345 1.469 c
+142.617 1.712 142.992 1.837 143.463 1.837 c
+143.947 1.837 l
+143.947 2.263 l
+143.947 2.499 143.893 2.664 143.785 2.763 c
+143.675 2.869 143.514 2.925 143.301 2.925 c
+143.102 2.925 142.941 2.866 142.816 2.749 c
+142.698 2.631 142.64 2.484 142.64 2.308 c
+141.992 2.308 l
+141.992 2.502 142.052 2.693 142.169 2.881 c
+142.293 3.064 142.455 3.212 142.654 3.322 c
+142.86 3.428 143.087 3.484 143.345 3.484 c
+143.745 3.484 144.051 3.38 144.256 3.175 c
+144.469 2.969 144.583 2.674 144.594 2.293 c
+144.594 0.279 l
+144.594 -0.026 144.631 -0.291 144.712 -0.515 c
+144.712 -0.574 l
+h
+143.168 -0.059 m
+143.334 -0.059 143.484 -0.015 143.625 0.073 c
+143.771 0.162 143.878 0.272 143.947 0.411 c
+143.947 1.352 l
+143.58 1.352 l
+143.264 1.352 143.022 1.282 142.845 1.146 c
+142.669 1.018 142.58 0.83 142.58 0.588 c
+142.58 0.359 142.625 0.195 142.713 0.087 c
+142.801 -0.011 142.952 -0.059 143.168 -0.059 c
+145.462 1.602 m
+145.462 2.208 145.572 2.674 145.8 2.998 c
+146.035 3.322 146.362 3.484 146.785 3.484 c
+147.166 3.484 147.465 3.326 147.681 3.013 c
+147.681 5.071 l
+148.328 5.071 l
+148.328 -0.574 l
+147.74 -0.574 l
+147.696 -0.148 l
+147.49 -0.482 147.185 -0.647 146.785 -0.647 c
+146.372 -0.647 146.05 -0.493 145.815 -0.177 c
+145.579 0.147 145.462 0.602 145.462 1.19 c
+h
+146.108 1.22 m
+146.108 0.779 146.171 0.448 146.299 0.235 c
+146.435 0.029 146.656 -0.073 146.96 -0.073 c
+147.284 -0.073 147.523 0.087 147.681 0.411 c
+147.681 2.425 l
+147.512 2.738 147.273 2.896 146.96 2.896 c
+146.656 2.896 146.435 2.792 146.299 2.587 c
+146.171 2.381 146.108 2.057 146.108 1.616 c
+h
+150.753 -0.647 m
+150.253 -0.647 149.871 -0.5 149.607 -0.206 c
+149.342 0.087 149.21 0.521 149.21 1.103 c
+149.21 1.573 l
+149.21 2.167 149.335 2.634 149.592 2.969 c
+149.857 3.31 150.216 3.484 150.68 3.484 c
+151.139 3.484 151.481 3.329 151.708 3.027 c
+151.944 2.734 152.065 2.271 152.076 1.646 c
+152.076 1.22 l
+149.857 1.22 l
+149.857 1.132 l
+149.857 0.698 149.934 0.386 150.092 0.191 c
+150.257 0.004 150.488 -0.088 150.783 -0.088 c
+150.977 -0.088 151.15 -0.055 151.297 0.014 c
+151.444 0.091 151.58 0.209 151.708 0.367 c
+152.047 -0.044 l
+151.76 -0.449 151.33 -0.647 150.753 -0.647 c
+150.68 2.925 m
+150.404 2.925 150.202 2.829 150.077 2.645 c
+149.948 2.458 149.875 2.167 149.857 1.778 c
+151.429 1.778 l
+151.429 1.866 l
+151.407 2.248 151.341 2.516 151.224 2.674 c
+151.106 2.84 150.922 2.925 150.68 2.925 c
+154.443 1.602 m
+154.443 2.179 154.579 2.634 154.854 2.969 c
+155.137 3.31 155.508 3.484 155.972 3.484 c
+156.431 3.484 156.798 3.314 157.073 2.984 c
+157.357 2.66 157.503 2.212 157.515 1.646 c
+157.515 1.22 l
+157.515 0.65 157.372 0.195 157.088 -0.148 c
+156.813 -0.482 156.445 -0.647 155.986 -0.647 c
+155.523 -0.647 155.151 -0.485 154.869 -0.162 c
+154.594 0.168 154.45 0.61 154.443 1.161 c
+h
+155.089 1.22 m
+155.089 0.816 155.166 0.5 155.325 0.264 c
+155.49 0.029 155.71 -0.088 155.986 -0.088 c
+156.552 -0.088 156.846 0.323 156.868 1.146 c
+156.868 1.602 l
+156.868 2.003 156.784 2.322 156.618 2.557 c
+156.46 2.8 156.244 2.925 155.972 2.925 c
+155.706 2.925 155.49 2.8 155.325 2.557 c
+155.166 2.322 155.089 2.003 155.089 1.602 c
+h
+158.97 3.41 m
+158.985 2.969 l
+159.238 3.31 159.562 3.484 159.955 3.484 c
+160.66 3.484 161.017 3.013 161.028 2.072 c
+161.028 -0.574 l
+160.381 -0.574 l
+160.381 2.043 l
+160.381 2.356 160.326 2.576 160.219 2.705 c
+160.109 2.829 159.955 2.896 159.749 2.896 c
+159.591 2.896 159.444 2.84 159.308 2.734 c
+159.18 2.624 159.076 2.487 158.999 2.322 c
+158.999 -0.574 l
+158.353 -0.574 l
+158.353 3.41 l
+h
+164.423 -0.574 -0.647 5.644 re
+165.305 1.602 m
+165.305 2.179 165.441 2.634 165.717 2.969 c
+166 3.31 166.371 3.484 166.834 3.484 c
+167.294 3.484 167.66 3.314 167.936 2.984 c
+168.219 2.66 168.366 2.212 168.377 1.646 c
+168.377 1.22 l
+168.377 0.65 168.234 0.195 167.951 -0.148 c
+167.676 -0.482 167.308 -0.647 166.849 -0.647 c
+166.386 -0.647 166.014 -0.485 165.732 -0.162 c
+165.456 0.168 165.312 0.61 165.305 1.161 c
+h
+165.952 1.22 m
+165.952 0.816 166.029 0.5 166.187 0.264 c
+166.353 0.029 166.573 -0.088 166.849 -0.088 c
+167.415 -0.088 167.708 0.323 167.731 1.146 c
+167.731 1.602 l
+167.731 2.003 167.646 2.322 167.481 2.557 c
+167.323 2.8 167.106 2.925 166.834 2.925 c
+166.569 2.925 166.353 2.8 166.187 2.557 c
+166.029 2.322 165.952 2.003 165.952 1.602 c
+h
+170.596 -0.088 m
+170.81 -0.088 170.983 -0.026 171.111 0.103 c
+171.247 0.239 171.321 0.43 171.332 0.675 c
+171.949 0.675 l
+171.927 0.294 171.791 -0.026 171.537 -0.279 c
+171.28 -0.526 170.968 -0.647 170.596 -0.647 c
+170.104 -0.647 169.73 -0.497 169.465 -0.191 c
+169.208 0.121 169.083 0.588 169.083 1.205 c
+169.083 1.646 l
+169.083 2.241 169.208 2.697 169.465 3.013 c
+169.73 3.326 170.104 3.484 170.596 3.484 c
+170.997 3.484 171.317 3.351 171.552 3.087 c
+171.795 2.829 171.927 2.484 171.949 2.043 c
+171.332 2.043 l
+171.31 2.337 171.236 2.557 171.111 2.705 c
+170.993 2.851 170.821 2.925 170.596 2.925 c
+170.303 2.925 170.086 2.826 169.95 2.631 c
+169.81 2.443 169.737 2.135 169.73 1.705 c
+169.73 1.19 l
+169.73 0.72 169.796 0.386 169.935 0.191 c
+170.083 0.004 170.303 -0.088 170.596 -0.088 c
+174.742 -0.574 m
+174.702 -0.485 174.676 -0.339 174.669 -0.133 c
+174.434 -0.478 174.139 -0.647 173.787 -0.647 c
+173.422 -0.647 173.14 -0.551 172.934 -0.353 c
+172.736 -0.148 172.64 0.139 172.64 0.515 c
+172.64 0.914 172.776 1.234 173.052 1.469 c
+173.324 1.712 173.698 1.837 174.169 1.837 c
+174.654 1.837 l
+174.654 2.263 l
+174.654 2.499 174.598 2.664 174.492 2.763 c
+174.382 2.869 174.22 2.925 174.007 2.925 c
+173.808 2.925 173.647 2.866 173.522 2.749 c
+173.405 2.631 173.345 2.484 173.345 2.308 c
+172.699 2.308 l
+172.699 2.502 172.757 2.693 172.875 2.881 c
+173 3.064 173.162 3.212 173.36 3.322 c
+173.566 3.428 173.794 3.484 174.051 3.484 c
+174.452 3.484 174.756 3.38 174.962 3.175 c
+175.176 2.969 175.29 2.674 175.3 2.293 c
+175.3 0.279 l
+175.3 -0.026 175.338 -0.291 175.418 -0.515 c
+175.418 -0.574 l
+h
+173.875 -0.059 m
+174.041 -0.059 174.191 -0.015 174.33 0.073 c
+174.477 0.162 174.584 0.272 174.654 0.411 c
+174.654 1.352 l
+174.286 1.352 l
+173.97 1.352 173.728 1.282 173.551 1.146 c
+173.375 1.018 173.287 0.83 173.287 0.588 c
+173.287 0.359 173.331 0.195 173.419 0.087 c
+173.507 -0.011 173.658 -0.059 173.875 -0.059 c
+177.006 -0.574 -0.647 5.644 re
+181.386 2.792 m
+181.297 2.811 181.199 2.822 181.092 2.822 c
+180.757 2.822 180.522 2.638 180.387 2.278 c
+180.387 -0.574 l
+179.74 -0.574 l
+179.74 3.41 l
+180.372 3.41 l
+180.387 2.998 l
+180.563 3.322 180.805 3.484 181.121 3.484 c
+181.228 3.484 181.316 3.461 181.386 3.424 c
+h
+183.385 -0.647 m
+182.885 -0.647 182.503 -0.5 182.238 -0.206 c
+181.974 0.087 181.842 0.521 181.842 1.103 c
+181.842 1.573 l
+181.842 2.167 181.966 2.634 182.224 2.969 c
+182.488 3.31 182.849 3.484 183.312 3.484 c
+183.771 3.484 184.113 3.329 184.341 3.027 c
+184.576 2.734 184.697 2.271 184.708 1.646 c
+184.708 1.22 l
+182.488 1.22 l
+182.488 1.132 l
+182.488 0.698 182.566 0.386 182.724 0.191 c
+182.889 0.004 183.121 -0.088 183.414 -0.088 c
+183.609 -0.088 183.782 -0.055 183.929 0.014 c
+184.076 0.091 184.212 0.209 184.341 0.367 c
+184.678 -0.044 l
+184.391 -0.449 183.962 -0.647 183.385 -0.647 c
+183.312 2.925 m
+183.036 2.925 182.834 2.829 182.709 2.645 c
+182.581 2.458 182.507 2.167 182.488 1.778 c
+184.061 1.778 l
+184.061 1.866 l
+184.04 2.248 183.973 2.516 183.855 2.674 c
+183.738 2.84 183.554 2.925 183.312 2.925 c
+188.368 1.22 m
+188.368 0.592 188.25 0.121 188.015 -0.191 c
+187.788 -0.497 187.471 -0.647 187.059 -0.647 c
+186.656 -0.647 186.347 -0.497 186.134 -0.191 c
+186.134 -2.103 l
+185.487 -2.103 l
+185.487 3.41 l
+186.075 3.41 l
+186.119 2.969 l
+186.332 3.31 186.641 3.484 187.045 3.484 c
+187.487 3.484 187.813 3.329 188.03 3.027 c
+188.243 2.722 188.357 2.267 188.368 1.66 c
+h
+187.722 1.602 m
+187.722 2.043 187.651 2.366 187.516 2.572 c
+187.376 2.786 187.155 2.896 186.854 2.896 c
+186.538 2.896 186.299 2.741 186.134 2.439 c
+186.134 0.367 l
+186.299 0.062 186.538 -0.088 186.854 -0.088 c
+187.148 -0.088 187.361 0.014 187.501 0.22 c
+187.637 0.434 187.71 0.764 187.722 1.205 c
+h
+189.074 1.602 m
+189.074 2.179 189.21 2.634 189.486 2.969 c
+189.768 3.31 190.139 3.484 190.602 3.484 c
+191.061 3.484 191.429 3.314 191.705 2.984 c
+191.988 2.66 192.135 2.212 192.146 1.646 c
+192.146 1.22 l
+192.146 0.65 192.002 0.195 191.72 -0.148 c
+191.444 -0.482 191.076 -0.647 190.617 -0.647 c
+190.154 -0.647 189.783 -0.485 189.5 -0.162 c
+189.224 0.168 189.081 0.61 189.074 1.161 c
+h
+189.721 1.22 m
+189.721 0.816 189.798 0.5 189.956 0.264 c
+190.121 0.029 190.342 -0.088 190.617 -0.088 c
+191.183 -0.088 191.477 0.323 191.499 1.146 c
+191.499 1.602 l
+191.499 2.003 191.414 2.322 191.249 2.557 c
+191.091 2.8 190.874 2.925 190.602 2.925 c
+190.338 2.925 190.121 2.8 189.956 2.557 c
+189.798 2.322 189.721 2.003 189.721 1.602 c
+h
+194.924 0.44 m
+194.924 0.588 194.869 0.709 194.762 0.808 c
+194.652 0.904 194.446 1.022 194.145 1.161 c
+193.799 1.308 193.557 1.429 193.409 1.529 c
+193.263 1.635 193.153 1.753 193.087 1.881 c
+193.016 2.006 192.983 2.164 192.983 2.352 c
+192.983 2.674 193.101 2.944 193.336 3.16 c
+193.571 3.374 193.873 3.484 194.248 3.484 c
+194.63 3.484 194.938 3.37 195.173 3.145 c
+195.409 2.917 195.526 2.631 195.526 2.278 c
+194.88 2.278 l
+194.88 2.454 194.821 2.605 194.703 2.734 c
+194.585 2.859 194.431 2.925 194.248 2.925 c
+194.049 2.925 193.899 2.869 193.792 2.763 c
+193.682 2.664 193.63 2.532 193.63 2.366 c
+193.63 2.238 193.667 2.131 193.748 2.043 c
+193.825 1.962 194.016 1.859 194.321 1.734 c
+194.799 1.547 195.13 1.359 195.306 1.176 c
+195.483 0.999 195.57 0.771 195.57 0.5 c
+195.57 0.147 195.445 -0.133 195.203 -0.339 c
+194.968 -0.544 194.652 -0.647 194.263 -0.647 c
+193.839 -0.647 193.502 -0.53 193.249 -0.294 c
+192.991 -0.052 192.866 0.253 192.866 0.617 c
+193.513 0.617 l
+193.52 0.389 193.59 0.213 193.719 0.087 c
+193.843 -0.03 194.027 -0.088 194.263 -0.088 c
+194.475 -0.088 194.637 -0.04 194.747 0.058 c
+194.865 0.154 194.924 0.282 194.924 0.44 c
+197.114 -0.574 -0.647 3.984 re
+197.158 4.453 m
+197.158 4.343 197.129 4.251 197.07 4.174 c
+197.012 4.104 196.916 4.072 196.79 4.072 c
+196.673 4.072 196.578 4.104 196.511 4.174 c
+196.453 4.251 196.424 4.343 196.424 4.453 c
+196.424 4.571 196.453 4.663 196.511 4.733 c
+196.578 4.81 196.673 4.85 196.79 4.85 c
+196.916 4.85 197.012 4.81 197.07 4.733 c
+197.129 4.652 197.158 4.56 197.158 4.453 c
+198.98 4.365 m
+198.98 3.41 l
+199.584 3.41 l
+199.584 2.881 l
+198.98 2.881 l
+198.98 0.411 l
+198.98 0.253 199.003 0.135 199.054 0.058 c
+199.113 -0.023 199.202 -0.059 199.319 -0.059 c
+199.407 -0.059 199.495 -0.044 199.584 -0.015 c
+199.584 -0.574 l
+199.437 -0.621 199.282 -0.647 199.128 -0.647 c
+198.87 -0.647 198.676 -0.555 198.54 -0.368 c
+198.4 -0.184 198.334 0.077 198.334 0.411 c
+198.334 2.881 l
+197.731 2.881 l
+197.731 3.41 l
+198.334 3.41 l
+198.334 4.365 l
+h
+200.142 1.602 m
+200.142 2.179 200.278 2.634 200.553 2.969 c
+200.837 3.31 201.208 3.484 201.671 3.484 c
+202.13 3.484 202.498 3.314 202.774 2.984 c
+203.056 2.66 203.203 2.212 203.214 1.646 c
+203.214 1.22 l
+203.214 0.65 203.071 0.195 202.788 -0.148 c
+202.512 -0.482 202.145 -0.647 201.685 -0.647 c
+201.222 -0.647 200.852 -0.485 200.568 -0.162 c
+200.293 0.168 200.149 0.61 200.142 1.161 c
+h
+200.789 1.22 m
+200.789 0.816 200.866 0.5 201.024 0.264 c
+201.189 0.029 201.41 -0.088 201.685 -0.088 c
+202.251 -0.088 202.545 0.323 202.568 1.146 c
+202.568 1.602 l
+202.568 2.003 202.483 2.322 202.317 2.557 c
+202.159 2.8 201.943 2.925 201.671 2.925 c
+201.406 2.925 201.189 2.8 201.024 2.557 c
+200.866 2.322 200.789 2.003 200.789 1.602 c
+h
+205.698 2.792 m
+205.61 2.811 205.511 2.822 205.404 2.822 c
+205.07 2.822 204.835 2.638 204.698 2.278 c
+204.698 -0.574 l
+204.052 -0.574 l
+204.052 3.41 l
+204.684 3.41 l
+204.698 2.998 l
+204.875 3.322 205.118 3.484 205.434 3.484 c
+205.54 3.484 205.629 3.461 205.698 3.424 c
+h
+207.506 0.515 m
+208.226 3.41 l
+208.918 3.41 l
+207.624 -1.132 l
+207.524 -1.474 207.381 -1.735 207.198 -1.912 c
+207.021 -2.087 206.819 -2.176 206.595 -2.176 c
+206.506 -2.176 206.393 -2.153 206.257 -2.117 c
+206.257 -1.573 l
+206.404 -1.588 l
+206.587 -1.588 206.734 -1.544 206.845 -1.455 c
+206.951 -1.367 207.04 -1.209 207.109 -0.985 c
+207.227 -0.544 l
+206.066 3.41 l
+206.772 3.41 l
+h
+209.197 -0.221 m
+209.197 -0.103 209.23 -0.008 209.299 0.073 c
+209.365 0.151 209.469 0.191 209.608 0.191 c
+209.755 0.191 209.862 0.151 209.932 0.073 c
+210.009 -0.008 210.049 -0.103 210.049 -0.221 c
+210.049 -0.331 210.009 -0.423 209.932 -0.5 c
+209.862 -0.578 209.755 -0.618 209.608 -0.618 c
+209.469 -0.618 209.365 -0.578 209.299 -0.5 c
+209.23 -0.423 209.197 -0.331 209.197 -0.221 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+287.665 501.669 234.667 -21.46 re
+f
+0 0 0 0 k
+q 1 0 0 1 356.4047 495.6455 cm
+0 0 m
+0 -1.543 l
+-0.103 -1.543 l
+-0.79 -1.554 -1.334 -1.764 -1.735 -2.175 c
+-2.128 -2.579 -2.367 -3.142 -2.454 -3.865 c
+-2.065 -3.418 -1.573 -3.189 -0.985 -3.189 c
+-0.309 -3.189 0.228 -3.484 0.632 -4.072 c
+1.033 -4.652 1.235 -5.42 1.235 -6.379 c
+1.235 -6.996 1.118 -7.551 0.882 -8.04 c
+0.654 -8.533 0.331 -8.914 -0.088 -9.186 c
+-0.5 -9.462 -0.97 -9.598 -1.5 -9.598 c
+-2.352 -9.598 -3.036 -9.26 -3.543 -8.584 c
+-4.054 -7.9 -4.307 -6.978 -4.307 -5.82 c
+-4.307 -5.144 l
+-4.307 -4.116 -4.145 -3.215 -3.821 -2.439 c
+-3.499 -1.657 -3.036 -1.058 -2.425 -0.646 c
+-1.808 -0.228 -1.095 -0.01 -0.279 0 c
+h
+-1.558 -4.704 m
+-1.793 -4.704 -1.992 -4.777 -2.146 -4.924 c
+-2.304 -5.071 -2.421 -5.247 -2.499 -5.453 c
+-2.499 -6.115 l
+-2.499 -6.772 -2.41 -7.268 -2.234 -7.599 c
+-2.057 -7.923 -1.83 -8.084 -1.544 -8.084 c
+-1.249 -8.084 -1.014 -7.93 -0.838 -7.613 c
+-0.661 -7.301 -0.573 -6.894 -0.573 -6.394 c
+-0.573 -5.894 -0.669 -5.49 -0.852 -5.174 c
+-1.029 -4.862 -1.264 -4.704 -1.558 -4.704 c
+2.708 -8.54 m
+2.708 -8.246 2.804 -8.007 3.002 -7.819 c
+3.198 -7.636 3.451 -7.54 3.767 -7.54 c
+4.068 -7.54 4.318 -7.636 4.516 -7.819 c
+4.723 -8.007 4.825 -8.246 4.825 -8.54 c
+4.825 -8.845 4.723 -9.091 4.516 -9.275 c
+4.318 -9.452 4.068 -9.539 3.767 -9.539 c
+3.462 -9.539 3.208 -9.448 3.002 -9.26 c
+2.804 -9.076 2.708 -8.834 2.708 -8.54 c
+15.387 -1.675 m
+13.064 -1.675 l
+13.064 -9.466 l
+11.168 -9.466 l
+11.168 -1.675 l
+8.889 -1.675 l
+8.889 -0.103 l
+15.387 -0.103 l
+h
+20.347 -7.555 m
+17.775 -7.555 l
+17.275 -9.466 l
+15.276 -9.466 l
+18.201 -0.103 l
+19.921 -0.103 l
+22.875 -9.466 l
+20.847 -9.466 l
+h
+18.186 -5.967 m
+19.935 -5.967 l
+19.054 -2.631 l
+h
+30.206 -8.407 m
+29.843 -8.801 29.398 -9.099 28.869 -9.304 c
+28.34 -9.499 27.759 -9.598 27.135 -9.598 c
+26.054 -9.598 25.217 -9.267 24.621 -8.598 c
+24.022 -7.933 23.717 -6.963 23.709 -5.689 c
+23.709 -3.998 l
+23.709 -2.705 23.989 -1.712 24.548 -1.014 c
+25.113 -0.32 25.936 0.03 27.017 0.03 c
+28.035 0.03 28.799 -0.228 29.31 -0.735 c
+29.828 -1.234 30.125 -2.021 30.206 -3.087 c
+28.369 -3.087 l
+28.318 -2.491 28.197 -2.084 28.002 -1.866 c
+27.804 -1.654 27.495 -1.543 27.075 -1.543 c
+26.565 -1.543 26.194 -1.731 25.959 -2.102 c
+25.731 -2.477 25.613 -3.068 25.606 -3.881 c
+25.606 -5.585 l
+25.606 -6.437 25.731 -7.063 25.988 -7.453 c
+26.242 -7.834 26.657 -8.025 27.237 -8.025 c
+27.609 -8.025 27.914 -7.952 28.149 -7.805 c
+28.311 -7.688 l
+28.311 -5.967 l
+26.988 -5.967 l
+26.988 -4.542 l
+30.206 -4.542 l
+h
+38.144 -8.407 m
+37.78 -8.801 37.336 -9.099 36.806 -9.304 c
+36.278 -9.499 35.696 -9.598 35.072 -9.598 c
+33.992 -9.598 33.154 -9.267 32.558 -8.598 c
+31.96 -7.933 31.655 -6.963 31.647 -5.689 c
+31.647 -3.998 l
+31.647 -2.705 31.927 -1.712 32.485 -1.014 c
+33.051 -0.32 33.874 0.03 34.954 0.03 c
+35.972 0.03 36.737 -0.228 37.248 -0.735 c
+37.766 -1.234 38.063 -2.021 38.144 -3.087 c
+36.307 -3.087 l
+36.255 -2.491 36.134 -2.084 35.939 -1.866 c
+35.741 -1.654 35.432 -1.543 35.013 -1.543 c
+34.503 -1.543 34.131 -1.731 33.896 -2.102 c
+33.668 -2.477 33.551 -3.068 33.543 -3.881 c
+33.543 -5.585 l
+33.543 -6.437 33.668 -7.063 33.926 -7.453 c
+34.179 -7.834 34.594 -8.025 35.175 -8.025 c
+35.546 -8.025 35.851 -7.952 36.086 -7.805 c
+36.248 -7.688 l
+36.248 -5.967 l
+34.925 -5.967 l
+34.925 -4.542 l
+38.144 -4.542 l
+h
+41.701 -9.466 -1.896 9.363 re
+49.951 -9.466 m
+48.055 -9.466 l
+45.292 -3.322 l
+45.292 -9.466 l
+43.395 -9.466 l
+43.395 -0.103 l
+45.292 -0.103 l
+48.055 -6.247 l
+48.055 -0.103 l
+49.951 -0.103 l
+h
+58.069 -8.407 m
+57.705 -8.801 57.26 -9.099 56.731 -9.304 c
+56.202 -9.499 55.621 -9.598 54.997 -9.598 c
+53.917 -9.598 53.078 -9.267 52.483 -8.598 c
+51.884 -7.933 51.579 -6.963 51.571 -5.689 c
+51.571 -3.998 l
+51.571 -2.705 51.851 -1.712 52.41 -1.014 c
+52.976 -0.32 53.799 0.03 54.879 0.03 c
+55.897 0.03 56.662 -0.228 57.172 -0.735 c
+57.69 -1.234 57.988 -2.021 58.069 -3.087 c
+56.231 -3.087 l
+56.18 -2.491 56.059 -2.084 55.864 -1.866 c
+55.665 -1.654 55.357 -1.543 54.938 -1.543 c
+54.427 -1.543 54.056 -1.731 53.821 -2.102 c
+53.593 -2.477 53.475 -3.068 53.468 -3.881 c
+53.468 -5.585 l
+53.468 -6.437 53.593 -7.063 53.85 -7.453 c
+54.104 -7.834 54.519 -8.025 55.099 -8.025 c
+55.471 -8.025 55.776 -7.952 56.011 -7.805 c
+56.172 -7.688 l
+56.172 -5.967 l
+54.85 -5.967 l
+54.85 -4.542 l
+58.069 -4.542 l
+h
+65.407 -5.85 m
+64.658 -6.79 l
+64.658 -9.466 l
+62.761 -9.466 l
+62.761 -0.103 l
+64.658 -0.103 l
+64.658 -4.189 l
+65.26 -3.175 l
+66.995 -0.103 l
+69.317 -0.103 l
+66.627 -4.218 l
+69.362 -9.466 l
+67.112 -9.466 l
+h
+76.807 -9.466 m
+74.91 -9.466 l
+72.146 -3.322 l
+72.146 -9.466 l
+70.251 -9.466 l
+70.251 -0.103 l
+72.146 -0.103 l
+74.91 -6.247 l
+74.91 -0.103 l
+76.807 -0.103 l
+h
+85.159 -5.629 m
+85.159 -6.886 84.858 -7.86 84.262 -8.554 c
+83.664 -9.253 82.841 -9.598 81.793 -9.598 c
+80.742 -9.598 79.915 -9.257 79.309 -8.569 c
+78.71 -7.875 78.405 -6.908 78.397 -5.674 c
+78.397 -4.072 l
+78.397 -2.789 78.695 -1.786 79.294 -1.058 c
+79.889 -0.334 80.72 0.03 81.778 0.03 c
+82.814 0.03 83.634 -0.33 84.233 -1.043 c
+84.84 -1.749 85.148 -2.745 85.159 -4.027 c
+h
+83.263 -4.056 m
+83.263 -3.215 83.138 -2.587 82.895 -2.175 c
+82.66 -1.764 82.286 -1.558 81.778 -1.558 c
+81.279 -1.558 80.904 -1.76 80.661 -2.161 c
+80.426 -2.554 80.301 -3.152 80.294 -3.954 c
+80.294 -5.629 l
+80.294 -6.445 80.415 -7.048 80.661 -7.437 c
+80.904 -7.831 81.282 -8.025 81.793 -8.025 c
+82.282 -8.025 82.646 -7.834 82.881 -7.453 c
+83.123 -7.07 83.252 -6.482 83.263 -5.689 c
+h
+92.821 -5.982 m
+93.703 -0.103 l
+95.585 -0.103 l
+93.908 -9.466 l
+92.013 -9.466 l
+90.924 -3.954 l
+89.852 -9.466 l
+87.941 -9.466 l
+86.265 -0.103 l
+88.146 -0.103 l
+89.029 -5.982 l
+90.131 -0.103 l
+91.718 -0.103 l
+h
+103.448 -9.466 m
+101.552 -9.466 l
+98.789 -3.322 l
+98.789 -9.466 l
+96.892 -9.466 l
+96.892 -0.103 l
+98.789 -0.103 l
+101.552 -6.247 l
+101.552 -0.103 l
+103.448 -0.103 l
+h
+114.675 -6.35 m
+114.623 -7.419 114.322 -8.228 113.764 -8.775 c
+113.212 -9.327 112.44 -9.598 111.441 -9.598 c
+110.371 -9.598 109.552 -9.253 108.987 -8.554 c
+108.428 -7.86 108.148 -6.865 108.148 -5.571 c
+108.148 -3.998 l
+108.148 -2.705 108.435 -1.712 109.016 -1.014 c
+109.604 -0.32 110.416 0.03 111.456 0.03 c
+112.474 0.03 113.249 -0.261 113.778 -0.837 c
+114.307 -1.407 114.608 -2.227 114.689 -3.293 c
+112.794 -3.293 l
+112.771 -2.628 112.669 -2.171 112.484 -1.926 c
+112.297 -1.672 111.956 -1.543 111.456 -1.543 c
+110.956 -1.543 110.596 -1.72 110.383 -2.072 c
+110.177 -2.425 110.063 -3.009 110.045 -3.821 c
+110.045 -5.585 l
+110.045 -6.518 110.147 -7.158 110.353 -7.511 c
+110.566 -7.856 110.93 -8.025 111.441 -8.025 c
+111.93 -8.025 112.268 -7.908 112.455 -7.673 c
+112.65 -7.43 112.756 -6.989 112.779 -6.35 c
+h
+122.649 -5.629 m
+122.649 -6.886 122.348 -7.86 121.752 -8.554 c
+121.153 -9.253 120.33 -9.598 119.283 -9.598 c
+118.232 -9.598 117.405 -9.257 116.798 -8.569 c
+116.2 -7.875 115.894 -6.908 115.888 -5.674 c
+115.888 -4.072 l
+115.888 -2.789 116.185 -1.786 116.784 -1.058 c
+117.379 -0.334 118.21 0.03 119.268 0.03 c
+120.305 0.03 121.124 -0.33 121.723 -1.043 c
+122.329 -1.749 122.638 -2.745 122.649 -4.027 c
+h
+120.752 -4.056 m
+120.752 -3.215 120.628 -2.587 120.385 -2.175 c
+120.15 -1.764 119.775 -1.558 119.268 -1.558 c
+118.768 -1.558 118.394 -1.76 118.151 -2.161 c
+117.916 -2.554 117.791 -3.152 117.783 -3.954 c
+117.783 -5.629 l
+117.783 -6.445 117.905 -7.048 118.151 -7.437 c
+118.394 -7.831 118.772 -8.025 119.283 -8.025 c
+119.771 -8.025 120.135 -7.834 120.37 -7.453 c
+120.613 -7.07 120.742 -6.482 120.752 -5.689 c
+h
+126.695 -0.103 m
+128.473 -6.879 l
+130.223 -0.103 l
+132.692 -0.103 l
+132.692 -9.466 l
+130.796 -9.466 l
+130.796 -6.938 l
+130.973 -3.027 l
+129.105 -9.466 l
+127.812 -9.466 l
+125.945 -3.027 l
+126.121 -6.938 l
+126.121 -9.466 l
+124.226 -9.466 l
+124.226 -0.103 l
+h
+136.962 -0.103 m
+138.741 -6.879 l
+140.49 -0.103 l
+142.96 -0.103 l
+142.96 -9.466 l
+141.063 -9.466 l
+141.063 -6.938 l
+141.24 -3.027 l
+139.372 -9.466 l
+138.079 -9.466 l
+136.212 -3.027 l
+136.389 -6.938 l
+136.389 -9.466 l
+134.493 -9.466 l
+134.493 -0.103 l
+h
+146.74 -9.466 -1.896 9.363 re
+154.322 -1.675 m
+151.999 -1.675 l
+151.999 -9.466 l
+150.103 -9.466 l
+150.103 -1.675 l
+147.825 -1.675 l
+147.825 -0.103 l
+154.322 -0.103 l
+h
+159.452 -7.011 m
+159.452 -6.629 159.353 -6.342 159.158 -6.144 c
+158.96 -5.949 158.607 -5.747 158.1 -5.541 c
+157.159 -5.182 156.483 -4.762 156.071 -4.292 c
+155.659 -3.814 155.453 -3.245 155.453 -2.587 c
+155.453 -1.804 155.733 -1.172 156.292 -0.69 c
+156.85 -0.213 157.559 0.03 158.422 0.03 c
+159 0.03 159.515 -0.095 159.966 -0.338 c
+160.415 -0.584 160.76 -0.926 160.995 -1.367 c
+161.238 -1.808 161.362 -2.308 161.362 -2.866 c
+159.481 -2.866 l
+159.481 -2.425 159.386 -2.094 159.202 -1.866 c
+159.014 -1.643 158.746 -1.529 158.393 -1.529 c
+158.059 -1.529 157.798 -1.627 157.614 -1.822 c
+157.438 -2.009 157.35 -2.271 157.35 -2.601 c
+157.35 -2.859 157.452 -3.094 157.659 -3.307 c
+157.865 -3.513 158.224 -3.73 158.746 -3.954 c
+159.658 -4.278 160.319 -4.681 160.731 -5.159 c
+161.15 -5.641 161.362 -6.254 161.362 -6.996 c
+161.362 -7.812 161.102 -8.448 160.583 -8.907 c
+160.062 -9.371 159.357 -9.598 158.467 -9.598 c
+157.857 -9.598 157.306 -9.473 156.806 -9.231 c
+156.313 -8.977 155.928 -8.621 155.644 -8.158 c
+155.358 -7.688 155.218 -7.14 155.218 -6.512 c
+157.115 -6.512 l
+157.115 -7.052 157.217 -7.445 157.423 -7.688 c
+157.636 -7.933 157.986 -8.055 158.467 -8.055 c
+159.121 -8.055 159.452 -7.709 159.452 -7.011 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 471.367 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 464.5277 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.23 15.626 -1.249 c
+15.545 -1.261 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+21.722 1.602 m
+21.178 1.602 l
+21.178 2.22 l
+21.766 2.22 l
+22.045 3.117 l
+22.618 3.117 l
+22.618 2.22 l
+23.853 2.22 l
+23.853 1.602 l
+22.618 1.602 l
+22.618 -0.103 l
+22.618 -0.324 l
+22.626 -0.393 22.647 -0.455 22.677 -0.515 c
+22.714 -0.565 22.769 -0.61 22.839 -0.646 c
+22.916 -0.676 23.03 -0.691 23.177 -0.691 c
+23.313 -0.691 23.449 -0.687 23.588 -0.676 c
+23.725 -0.658 23.857 -0.632 23.985 -0.602 c
+23.985 -1.205 l
+23.904 -1.216 23.827 -1.23 23.75 -1.249 c
+23.669 -1.261 23.592 -1.267 23.515 -1.278 c
+23.434 -1.286 23.346 -1.294 23.25 -1.294 c
+23.162 -1.301 23.063 -1.308 22.957 -1.308 c
+22.769 -1.308 22.608 -1.294 22.471 -1.264 c
+22.343 -1.228 22.229 -1.183 22.134 -1.132 c
+22.045 -1.084 21.972 -1.025 21.913 -0.955 c
+21.854 -0.878 21.81 -0.801 21.781 -0.72 c
+21.751 -0.632 21.729 -0.544 21.722 -0.455 c
+21.71 -0.36 21.707 -0.264 21.707 -0.176 c
+h
+26.136 -1.323 m
+25.966 -1.323 25.816 -1.301 25.679 -1.264 c
+25.551 -1.216 25.437 -1.147 25.342 -1.058 c
+25.253 -0.97 25.184 -0.864 25.136 -0.735 c
+25.084 -0.599 25.062 -0.448 25.062 -0.279 c
+25.062 -0.073 25.095 0.096 25.165 0.235 c
+25.232 0.382 25.327 0.493 25.444 0.574 c
+25.569 0.661 25.712 0.724 25.87 0.765 c
+26.036 0.802 26.213 0.827 26.4 0.838 c
+27.12 0.852 l
+27.12 1.029 l
+27.12 1.147 27.109 1.249 27.09 1.338 c
+27.069 1.426 27.036 1.492 26.988 1.544 c
+26.947 1.602 26.9 1.639 26.841 1.661 c
+26.782 1.679 26.716 1.691 26.649 1.691 c
+26.58 1.691 26.518 1.679 26.458 1.661 c
+26.408 1.65 26.36 1.625 26.312 1.588 c
+26.271 1.558 26.238 1.507 26.209 1.44 c
+26.186 1.382 26.172 1.301 26.165 1.205 c
+25.224 1.249 l
+25.253 1.397 25.297 1.532 25.356 1.661 c
+25.423 1.786 25.518 1.897 25.635 1.985 c
+25.753 2.08 25.893 2.153 26.061 2.205 c
+26.238 2.253 26.444 2.278 26.679 2.278 c
+27.12 2.278 27.451 2.168 27.678 1.955 c
+27.914 1.75 28.031 1.44 28.031 1.029 c
+28.031 -0.235 l
+28.031 -0.455 l
+28.039 -0.515 28.054 -0.569 28.075 -0.617 c
+28.094 -0.658 28.123 -0.691 28.164 -0.72 c
+28.201 -0.742 28.252 -0.75 28.311 -0.75 c
+28.376 -0.75 28.447 -0.746 28.517 -0.735 c
+28.517 -1.22 l
+28.457 -1.23 28.403 -1.242 28.355 -1.249 c
+28.314 -1.261 28.274 -1.267 28.237 -1.278 c
+28.197 -1.286 28.153 -1.294 28.105 -1.294 c
+28.054 -1.301 27.995 -1.308 27.929 -1.308 c
+27.701 -1.308 27.535 -1.257 27.429 -1.147 c
+27.318 -1.029 27.256 -0.864 27.237 -0.646 c
+27.223 -0.646 l
+27.154 -0.757 27.083 -0.852 27.017 -0.941 c
+26.947 -1.022 26.87 -1.087 26.782 -1.147 c
+26.693 -1.205 26.595 -1.249 26.488 -1.278 c
+26.389 -1.308 26.271 -1.323 26.136 -1.323 c
+27.12 0.353 m
+26.693 0.339 l
+26.595 0.339 26.503 0.331 26.414 0.324 c
+26.333 0.312 26.267 0.287 26.209 0.25 c
+26.15 0.21 26.098 0.15 26.061 0.073 c
+26.021 0.004 26.003 -0.088 26.003 -0.206 c
+26.003 -0.374 26.036 -0.496 26.106 -0.573 c
+26.172 -0.654 26.271 -0.691 26.4 -0.691 c
+26.506 -0.691 26.606 -0.669 26.693 -0.617 c
+26.789 -0.569 26.87 -0.507 26.929 -0.426 c
+26.995 -0.349 27.046 -0.261 27.076 -0.162 c
+27.106 -0.055 27.12 0.059 27.12 0.177 c
+h
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.527 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.596 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.057 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.468 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.361 2.139 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.279 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.233 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+f
+Q
+q 1 0 0 1 482.8862 448.9472 cm
+0 0 m
+2.103 0 l
+2.103 -0.574 l
+-0.675 -0.574 l
+-0.675 4.777 l
+0 4.777 l
+h
+3.514 -0.574 -0.647 3.984 re
+3.558 4.453 m
+3.558 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.315 4.072 3.19 4.072 c
+3.072 4.072 2.977 4.104 2.911 4.174 c
+2.852 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.852 4.663 2.911 4.733 c
+2.977 4.81 3.072 4.85 3.19 4.85 c
+3.315 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.558 4.56 3.558 4.453 c
+6.468 0.44 m
+6.468 0.588 6.413 0.709 6.306 0.808 c
+6.196 0.904 5.99 1.022 5.689 1.161 c
+5.343 1.308 5.101 1.429 4.954 1.529 c
+4.807 1.635 4.696 1.753 4.63 1.881 c
+4.561 2.006 4.528 2.164 4.528 2.352 c
+4.528 2.674 4.645 2.944 4.881 3.16 c
+5.116 3.374 5.417 3.484 5.792 3.484 c
+6.174 3.484 6.483 3.37 6.718 3.145 c
+6.953 2.917 7.071 2.631 7.071 2.278 c
+6.423 2.278 l
+6.423 2.454 6.365 2.605 6.247 2.734 c
+6.13 2.859 5.976 2.925 5.792 2.925 c
+5.594 2.925 5.442 2.869 5.336 2.763 c
+5.226 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.238 5.211 2.131 5.292 2.043 c
+5.369 1.962 5.56 1.859 5.866 1.734 c
+6.342 1.547 6.674 1.359 6.85 1.176 c
+7.026 0.999 7.115 0.771 7.115 0.5 c
+7.115 0.147 6.99 -0.133 6.747 -0.339 c
+6.512 -0.544 6.196 -0.647 5.806 -0.647 c
+5.384 -0.647 5.046 -0.53 4.792 -0.294 c
+4.535 -0.052 4.41 0.253 4.41 0.617 c
+5.056 0.617 l
+5.064 0.389 5.134 0.213 5.262 0.087 c
+5.388 -0.03 5.571 -0.088 5.806 -0.088 c
+6.02 -0.088 6.182 -0.04 6.292 0.058 c
+6.409 0.154 6.468 0.282 6.468 0.44 c
+8.805 4.365 m
+8.805 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.805 2.881 l
+8.805 0.411 l
+8.805 0.253 8.827 0.135 8.879 0.058 c
+8.937 -0.023 9.025 -0.059 9.143 -0.059 c
+9.232 -0.059 9.32 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.261 -0.621 9.106 -0.647 8.952 -0.647 c
+8.694 -0.647 8.5 -0.555 8.364 -0.368 c
+8.224 -0.184 8.158 0.077 8.158 0.411 c
+8.158 2.881 l
+7.556 2.881 l
+7.556 3.41 l
+8.158 3.41 l
+8.158 4.365 l
+h
+13.935 -0.574 m
+13.895 -0.485 13.868 -0.339 13.862 -0.133 c
+13.627 -0.478 13.332 -0.647 12.979 -0.647 c
+12.615 -0.647 12.333 -0.551 12.127 -0.353 c
+11.929 -0.148 11.833 0.139 11.833 0.515 c
+11.833 0.914 11.969 1.234 12.245 1.469 c
+12.517 1.712 12.891 1.837 13.361 1.837 c
+13.847 1.837 l
+13.847 2.263 l
+13.847 2.499 13.791 2.664 13.685 2.763 c
+13.575 2.869 13.413 2.925 13.2 2.925 c
+13.002 2.925 12.84 2.866 12.715 2.749 c
+12.597 2.631 12.538 2.484 12.538 2.308 c
+11.892 2.308 l
+11.892 2.502 11.95 2.693 12.068 2.881 c
+12.193 3.064 12.355 3.212 12.553 3.322 c
+12.759 3.428 12.987 3.484 13.244 3.484 c
+13.645 3.484 13.949 3.38 14.155 3.175 c
+14.369 2.969 14.483 2.674 14.494 2.293 c
+14.494 0.279 l
+14.494 -0.026 14.531 -0.291 14.612 -0.515 c
+14.612 -0.574 l
+h
+13.068 -0.059 m
+13.233 -0.059 13.384 -0.015 13.523 0.073 c
+13.671 0.162 13.777 0.272 13.847 0.411 c
+13.847 1.352 l
+13.479 1.352 l
+13.163 1.352 12.921 1.282 12.744 1.146 c
+12.568 1.018 12.48 0.83 12.48 0.588 c
+12.48 0.359 12.524 0.195 12.613 0.087 c
+12.7 -0.011 12.85 -0.059 13.068 -0.059 c
+16.199 -0.574 -0.646 5.644 re
+17.918 -0.574 -0.646 5.644 re
+21.505 4.365 m
+21.505 3.41 l
+22.107 3.41 l
+22.107 2.881 l
+21.505 2.881 l
+21.505 0.411 l
+21.505 0.253 21.527 0.135 21.579 0.058 c
+21.637 -0.023 21.725 -0.059 21.843 -0.059 c
+21.931 -0.059 22.02 -0.044 22.107 -0.015 c
+22.107 -0.574 l
+21.961 -0.621 21.806 -0.647 21.652 -0.647 c
+21.394 -0.647 21.2 -0.555 21.064 -0.368 c
+20.924 -0.184 20.858 0.077 20.858 0.411 c
+20.858 2.881 l
+20.256 2.881 l
+20.256 3.41 l
+20.858 3.41 l
+20.858 4.365 l
+h
+24.915 -0.574 m
+24.875 -0.485 24.849 -0.339 24.842 -0.133 c
+24.607 -0.478 24.312 -0.647 23.96 -0.647 c
+23.596 -0.647 23.313 -0.551 23.107 -0.353 c
+22.909 -0.148 22.813 0.139 22.813 0.515 c
+22.813 0.914 22.949 1.234 23.225 1.469 c
+23.497 1.712 23.871 1.837 24.342 1.837 c
+24.827 1.837 l
+24.827 2.263 l
+24.827 2.499 24.772 2.664 24.665 2.763 c
+24.555 2.869 24.393 2.925 24.18 2.925 c
+23.981 2.925 23.82 2.866 23.695 2.749 c
+23.578 2.631 23.518 2.484 23.518 2.308 c
+22.872 2.308 l
+22.872 2.502 22.931 2.693 23.048 2.881 c
+23.173 3.064 23.335 3.212 23.534 3.322 c
+23.74 3.428 23.967 3.484 24.224 3.484 c
+24.625 3.484 24.93 3.38 25.136 3.175 c
+25.349 2.969 25.463 2.674 25.473 2.293 c
+25.473 0.279 l
+25.473 -0.026 25.51 -0.291 25.591 -0.515 c
+25.591 -0.574 l
+h
+24.048 -0.059 m
+24.214 -0.059 24.364 -0.015 24.503 0.073 c
+24.65 0.162 24.757 0.272 24.827 0.411 c
+24.827 1.352 l
+24.459 1.352 l
+24.143 1.352 23.901 1.282 23.724 1.146 c
+23.549 1.018 23.46 0.83 23.46 0.588 c
+23.46 0.359 23.504 0.195 23.592 0.087 c
+23.68 -0.011 23.831 -0.059 24.048 -0.059 c
+26.341 1.602 m
+26.341 2.219 26.451 2.682 26.679 2.998 c
+26.903 3.322 27.237 3.484 27.678 3.484 c
+28.079 3.484 28.384 3.307 28.59 2.954 c
+28.634 3.41 l
+29.222 3.41 l
+29.222 -0.618 l
+29.222 -1.106 29.093 -1.484 28.84 -1.75 c
+28.582 -2.014 28.23 -2.147 27.782 -2.147 c
+27.583 -2.147 27.362 -2.095 27.12 -1.999 c
+26.874 -1.9 26.693 -1.779 26.576 -1.632 c
+26.841 -1.191 l
+27.106 -1.455 27.403 -1.588 27.738 -1.588 c
+28.274 -1.588 28.55 -1.294 28.561 -0.706 c
+28.561 -0.177 l
+28.355 -0.493 28.054 -0.647 27.664 -0.647 c
+27.252 -0.647 26.929 -0.497 26.693 -0.191 c
+26.466 0.121 26.348 0.573 26.341 1.161 c
+h
+27.002 1.22 m
+27.002 0.779 27.065 0.448 27.194 0.235 c
+27.318 0.029 27.535 -0.073 27.84 -0.073 c
+28.164 -0.073 28.403 0.091 28.561 0.426 c
+28.561 2.41 l
+28.392 2.734 28.153 2.896 27.84 2.896 c
+27.547 2.896 27.329 2.792 27.194 2.587 c
+27.065 2.381 27.002 2.057 27.002 1.616 c
+h
+32.118 0.44 m
+32.118 0.588 32.062 0.709 31.956 0.808 c
+31.846 0.904 31.64 1.022 31.339 1.161 c
+30.994 1.308 30.751 1.429 30.604 1.529 c
+30.456 1.635 30.346 1.753 30.281 1.881 c
+30.211 2.006 30.177 2.164 30.177 2.352 c
+30.177 2.674 30.295 2.944 30.53 3.16 c
+30.765 3.374 31.067 3.484 31.441 3.484 c
+31.823 3.484 32.133 3.37 32.368 3.145 c
+32.603 2.917 32.721 2.631 32.721 2.278 c
+32.074 2.278 l
+32.074 2.454 32.015 2.605 31.898 2.734 c
+31.78 2.859 31.625 2.925 31.441 2.925 c
+31.243 2.925 31.092 2.869 30.986 2.763 c
+30.876 2.664 30.824 2.532 30.824 2.366 c
+30.824 2.238 30.861 2.131 30.942 2.043 c
+31.019 1.962 31.21 1.859 31.515 1.734 c
+31.993 1.547 32.324 1.359 32.5 1.176 c
+32.677 0.999 32.764 0.771 32.764 0.5 c
+32.764 0.147 32.64 -0.133 32.397 -0.339 c
+32.162 -0.544 31.846 -0.647 31.456 -0.647 c
+31.034 -0.647 30.695 -0.53 30.442 -0.294 c
+30.185 -0.052 30.059 0.253 30.059 0.617 c
+30.707 0.617 l
+30.714 0.389 30.784 0.213 30.913 0.087 c
+31.037 -0.03 31.221 -0.088 31.456 -0.088 c
+31.669 -0.088 31.831 -0.04 31.941 0.058 c
+32.058 0.154 32.118 0.282 32.118 0.44 c
+33.646 -0.221 m
+33.646 -0.103 33.679 -0.008 33.749 0.073 c
+33.816 0.151 33.918 0.191 34.058 0.191 c
+34.205 0.191 34.312 0.151 34.381 0.073 c
+34.458 -0.008 34.499 -0.103 34.499 -0.221 c
+34.499 -0.331 34.458 -0.423 34.381 -0.5 c
+34.312 -0.578 34.205 -0.618 34.058 -0.618 c
+33.918 -0.618 33.816 -0.578 33.749 -0.5 c
+33.679 -0.423 33.646 -0.331 33.646 -0.221 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 441.263 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 434.424 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.882 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.882 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.69 15.052 -0.69 c
+15.188 -0.69 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.23 15.626 -1.249 c
+15.545 -1.261 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+21.722 1.602 m
+21.178 1.602 l
+21.178 2.22 l
+21.766 2.22 l
+22.045 3.117 l
+22.618 3.117 l
+22.618 2.22 l
+23.853 2.22 l
+23.853 1.602 l
+22.618 1.602 l
+22.618 -0.103 l
+22.618 -0.324 l
+22.626 -0.393 22.647 -0.455 22.677 -0.515 c
+22.714 -0.565 22.769 -0.61 22.839 -0.646 c
+22.916 -0.676 23.03 -0.69 23.177 -0.69 c
+23.313 -0.69 23.449 -0.687 23.588 -0.676 c
+23.725 -0.658 23.857 -0.632 23.985 -0.602 c
+23.985 -1.205 l
+23.904 -1.216 23.827 -1.23 23.75 -1.249 c
+23.669 -1.261 23.592 -1.267 23.515 -1.278 c
+23.434 -1.286 23.346 -1.294 23.25 -1.294 c
+23.162 -1.301 23.063 -1.308 22.957 -1.308 c
+22.769 -1.308 22.608 -1.294 22.471 -1.264 c
+22.343 -1.228 22.229 -1.183 22.134 -1.132 c
+22.045 -1.084 21.972 -1.025 21.913 -0.955 c
+21.854 -0.878 21.81 -0.801 21.781 -0.72 c
+21.751 -0.632 21.729 -0.544 21.722 -0.455 c
+21.71 -0.36 21.707 -0.264 21.707 -0.176 c
+h
+26.136 -1.323 m
+25.966 -1.323 25.816 -1.301 25.679 -1.264 c
+25.551 -1.216 25.437 -1.147 25.342 -1.058 c
+25.253 -0.97 25.184 -0.864 25.136 -0.735 c
+25.084 -0.599 25.062 -0.448 25.062 -0.279 c
+25.062 -0.073 25.095 0.096 25.165 0.235 c
+25.232 0.382 25.327 0.493 25.444 0.574 c
+25.569 0.661 25.712 0.724 25.87 0.765 c
+26.036 0.802 26.213 0.827 26.4 0.838 c
+27.12 0.852 l
+27.12 1.029 l
+27.12 1.147 27.109 1.249 27.09 1.338 c
+27.069 1.426 27.036 1.492 26.988 1.544 c
+26.947 1.602 26.9 1.639 26.841 1.661 c
+26.782 1.679 26.716 1.691 26.649 1.691 c
+26.58 1.691 26.518 1.679 26.458 1.661 c
+26.408 1.65 26.36 1.625 26.312 1.588 c
+26.271 1.558 26.238 1.507 26.209 1.44 c
+26.186 1.382 26.172 1.301 26.165 1.205 c
+25.224 1.249 l
+25.253 1.397 25.297 1.532 25.356 1.661 c
+25.423 1.786 25.518 1.897 25.635 1.985 c
+25.753 2.08 25.893 2.153 26.061 2.205 c
+26.238 2.253 26.444 2.278 26.679 2.278 c
+27.12 2.278 27.451 2.168 27.678 1.955 c
+27.914 1.75 28.031 1.44 28.031 1.029 c
+28.031 -0.235 l
+28.031 -0.455 l
+28.039 -0.515 28.054 -0.569 28.075 -0.617 c
+28.094 -0.658 28.123 -0.69 28.164 -0.72 c
+28.201 -0.742 28.252 -0.75 28.311 -0.75 c
+28.376 -0.75 28.447 -0.746 28.517 -0.735 c
+28.517 -1.22 l
+28.457 -1.23 28.403 -1.242 28.355 -1.249 c
+28.314 -1.261 28.274 -1.267 28.237 -1.278 c
+28.197 -1.286 28.153 -1.294 28.105 -1.294 c
+28.054 -1.301 27.995 -1.308 27.929 -1.308 c
+27.701 -1.308 27.535 -1.257 27.429 -1.147 c
+27.318 -1.029 27.256 -0.864 27.237 -0.646 c
+27.223 -0.646 l
+27.154 -0.757 27.083 -0.852 27.017 -0.941 c
+26.947 -1.022 26.87 -1.087 26.782 -1.147 c
+26.693 -1.205 26.595 -1.249 26.488 -1.278 c
+26.389 -1.308 26.271 -1.323 26.136 -1.323 c
+27.12 0.353 m
+26.693 0.339 l
+26.595 0.339 26.503 0.331 26.414 0.324 c
+26.333 0.312 26.267 0.287 26.209 0.25 c
+26.15 0.21 26.098 0.151 26.061 0.073 c
+26.021 0.004 26.003 -0.088 26.003 -0.206 c
+26.003 -0.374 26.036 -0.496 26.106 -0.573 c
+26.172 -0.654 26.271 -0.69 26.4 -0.69 c
+26.506 -0.69 26.606 -0.669 26.693 -0.617 c
+26.789 -0.569 26.87 -0.507 26.929 -0.426 c
+26.995 -0.349 27.046 -0.261 27.076 -0.162 c
+27.106 -0.055 27.12 0.059 27.12 0.177 c
+h
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.527 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.595 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.057 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.468 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.361 2.139 32.349 2.028 32.342 1.882 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.278 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.233 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+38.115 -2.631 m
+38.115 3.514 l
+40.041 3.514 l
+40.041 2.896 l
+38.967 2.896 l
+38.967 -2.013 l
+40.041 -2.013 l
+40.041 -2.631 l
+h
+43.616 -1.264 m
+43.616 0.721 l
+43.616 1.022 43.572 1.242 43.484 1.382 c
+43.403 1.529 43.267 1.602 43.072 1.602 c
+42.962 1.602 42.859 1.577 42.763 1.529 c
+42.676 1.477 42.595 1.411 42.528 1.323 c
+42.47 1.235 42.418 1.124 42.381 1 c
+42.352 0.882 42.337 0.75 42.337 0.603 c
+42.337 -1.264 l
+41.425 -1.264 l
+41.425 1.44 l
+41.425 1.661 l
+41.425 1.75 41.419 1.827 41.411 1.897 c
+41.411 2.087 l
+41.411 2.22 l
+42.264 2.22 l
+42.271 2.19 42.279 2.146 42.279 2.087 c
+42.279 1.897 l
+42.286 1.827 42.293 1.756 42.293 1.691 c
+42.3 1.621 42.308 1.565 42.308 1.529 c
+42.323 1.529 l
+42.441 1.793 42.591 1.985 42.778 2.103 c
+42.962 2.22 43.183 2.278 43.44 2.278 c
+43.623 2.278 43.785 2.249 43.925 2.19 c
+44.06 2.132 44.174 2.043 44.263 1.926 c
+44.351 1.808 44.413 1.665 44.454 1.5 c
+44.502 1.341 44.527 1.154 44.527 0.941 c
+44.527 -1.264 l
+h
+46.441 -1.323 m
+46.273 -1.323 46.123 -1.301 45.986 -1.264 c
+45.857 -1.216 45.743 -1.147 45.648 -1.058 c
+45.56 -0.97 45.49 -0.864 45.442 -0.735 c
+45.391 -0.599 45.369 -0.448 45.369 -0.279 c
+45.369 -0.073 45.402 0.096 45.472 0.235 c
+45.538 0.382 45.633 0.493 45.751 0.574 c
+45.876 0.661 46.019 0.724 46.177 0.765 c
+46.343 0.802 46.52 0.827 46.707 0.838 c
+47.426 0.852 l
+47.426 1.029 l
+47.426 1.147 47.416 1.249 47.397 1.338 c
+47.376 1.426 47.342 1.492 47.295 1.544 c
+47.254 1.602 47.206 1.639 47.147 1.661 c
+47.089 1.679 47.023 1.691 46.956 1.691 c
+46.886 1.691 46.824 1.679 46.765 1.661 c
+46.714 1.65 46.666 1.625 46.618 1.588 c
+46.578 1.558 46.545 1.507 46.516 1.44 c
+46.493 1.382 46.479 1.301 46.472 1.205 c
+45.531 1.249 l
+45.56 1.397 45.604 1.532 45.663 1.661 c
+45.729 1.786 45.824 1.897 45.942 1.985 c
+46.06 2.08 46.2 2.153 46.368 2.205 c
+46.545 2.253 46.751 2.278 46.986 2.278 c
+47.426 2.278 47.758 2.168 47.985 1.955 c
+48.22 1.75 48.338 1.44 48.338 1.029 c
+48.338 -0.235 l
+48.338 -0.455 l
+48.346 -0.515 48.361 -0.569 48.382 -0.617 c
+48.401 -0.658 48.43 -0.69 48.471 -0.72 c
+48.507 -0.742 48.558 -0.75 48.617 -0.75 c
+48.683 -0.75 48.753 -0.746 48.823 -0.735 c
+48.823 -1.22 l
+48.764 -1.23 48.71 -1.242 48.662 -1.249 c
+48.621 -1.261 48.581 -1.267 48.544 -1.278 c
+48.504 -1.286 48.459 -1.294 48.411 -1.294 c
+48.361 -1.301 48.301 -1.308 48.235 -1.308 c
+48.008 -1.308 47.842 -1.257 47.735 -1.147 c
+47.625 -1.029 47.563 -0.864 47.544 -0.646 c
+47.53 -0.646 l
+47.46 -0.757 47.39 -0.852 47.324 -0.941 c
+47.254 -1.022 47.177 -1.087 47.089 -1.147 c
+47 -1.205 46.901 -1.249 46.794 -1.278 c
+46.695 -1.308 46.578 -1.323 46.441 -1.323 c
+47.426 0.353 m
+47 0.339 l
+46.901 0.339 46.809 0.331 46.721 0.324 c
+46.64 0.312 46.574 0.287 46.516 0.25 c
+46.457 0.21 46.405 0.151 46.368 0.073 c
+46.328 0.004 46.31 -0.088 46.31 -0.206 c
+46.31 -0.374 46.343 -0.496 46.412 -0.573 c
+46.479 -0.654 46.578 -0.69 46.707 -0.69 c
+46.813 -0.69 46.912 -0.669 47 -0.617 c
+47.096 -0.569 47.177 -0.507 47.235 -0.426 c
+47.302 -0.349 47.353 -0.261 47.382 -0.162 c
+47.412 -0.055 47.426 0.059 47.426 0.177 c
+h
+50.709 -1.264 m
+50.709 0.852 l
+50.709 1.018 50.701 1.154 50.694 1.264 c
+50.682 1.371 50.664 1.455 50.634 1.515 c
+50.613 1.58 50.584 1.632 50.547 1.661 c
+50.518 1.691 50.477 1.706 50.429 1.706 c
+50.37 1.706 50.315 1.675 50.267 1.617 c
+50.227 1.565 50.194 1.492 50.164 1.397 c
+50.135 1.309 50.109 1.195 50.091 1.058 c
+50.08 0.919 50.077 0.769 50.077 0.603 c
+50.077 -1.264 l
+49.327 -1.264 l
+49.327 1.47 l
+49.327 1.706 l
+49.327 1.926 l
+49.327 2.003 49.319 2.065 49.312 2.117 c
+49.312 2.22 l
+49.988 2.22 l
+49.988 2.132 l
+49.988 1.985 l
+49.996 1.926 50.003 1.867 50.003 1.808 c
+50.003 1.646 l
+50.017 1.646 l
+50.036 1.735 50.065 1.812 50.106 1.882 c
+50.142 1.959 50.187 2.028 50.238 2.087 c
+50.297 2.146 50.362 2.19 50.443 2.22 c
+50.521 2.257 50.609 2.278 50.709 2.278 c
+50.892 2.278 51.031 2.223 51.12 2.117 c
+51.216 2.018 51.285 1.86 51.326 1.646 c
+51.34 1.646 l
+51.378 1.742 51.418 1.83 51.458 1.911 c
+51.505 1.988 51.561 2.051 51.619 2.103 c
+51.679 2.161 51.744 2.205 51.825 2.234 c
+51.902 2.263 51.991 2.278 52.09 2.278 c
+52.226 2.278 52.34 2.253 52.428 2.205 c
+52.516 2.153 52.583 2.08 52.634 1.985 c
+52.693 1.885 52.729 1.756 52.751 1.602 c
+52.781 1.455 52.795 1.272 52.795 1.058 c
+52.795 -1.264 l
+52.076 -1.264 l
+52.076 0.852 l
+52.076 1.018 52.068 1.154 52.061 1.264 c
+52.049 1.371 52.031 1.455 52.002 1.515 c
+51.98 1.58 51.95 1.632 51.914 1.661 c
+51.885 1.691 51.844 1.706 51.796 1.706 c
+51.679 1.706 51.583 1.617 51.517 1.44 c
+51.458 1.272 51.428 1.014 51.428 0.661 c
+51.428 -1.264 l
+h
+55.166 -1.323 m
+54.908 -1.323 54.68 -1.286 54.475 -1.22 c
+54.269 -1.143 54.093 -1.029 53.946 -0.881 c
+53.799 -0.727 53.681 -0.536 53.593 -0.309 c
+53.512 -0.085 53.475 0.181 53.475 0.485 c
+53.475 0.816 53.52 1.095 53.608 1.323 c
+53.703 1.558 53.832 1.742 53.99 1.882 c
+54.156 2.018 54.343 2.117 54.549 2.176 c
+54.754 2.242 54.964 2.278 55.181 2.278 c
+55.453 2.278 55.688 2.227 55.887 2.132 c
+56.092 2.043 56.257 1.911 56.386 1.735 c
+56.522 1.565 56.621 1.359 56.68 1.118 c
+56.746 0.882 56.783 0.617 56.783 0.324 c
+56.783 0.309 l
+54.416 0.309 l
+54.416 0.162 54.431 0.023 54.46 -0.103 c
+54.497 -0.231 54.553 -0.345 54.622 -0.441 c
+54.688 -0.529 54.773 -0.599 54.871 -0.646 c
+54.967 -0.698 55.081 -0.72 55.21 -0.72 c
+55.364 -0.72 55.504 -0.687 55.621 -0.617 c
+55.746 -0.551 55.835 -0.448 55.887 -0.309 c
+56.724 -0.382 l
+56.695 -0.482 56.639 -0.588 56.562 -0.706 c
+56.481 -0.816 56.379 -0.918 56.253 -1.014 c
+56.136 -1.103 55.982 -1.176 55.798 -1.234 c
+55.621 -1.294 55.409 -1.323 55.166 -1.323 c
+55.166 1.706 m
+55.077 1.706 54.989 1.691 54.902 1.661 c
+54.813 1.632 54.732 1.58 54.666 1.515 c
+54.596 1.444 54.537 1.357 54.49 1.249 c
+54.449 1.139 54.431 1.014 54.431 0.867 c
+55.901 0.867 l
+55.901 1.004 55.875 1.124 55.827 1.235 c
+55.787 1.341 55.731 1.43 55.665 1.5 c
+55.607 1.565 55.534 1.617 55.445 1.646 c
+55.357 1.683 55.261 1.706 55.166 1.706 c
+58.04 -2.631 m
+58.04 -2.013 l
+59.112 -2.013 l
+59.112 2.896 l
+58.04 2.896 l
+58.04 3.514 l
+59.965 3.514 l
+59.965 -2.631 l
+h
+66.543 -2.631 m
+66.543 3.514 l
+68.469 3.514 l
+68.469 2.896 l
+67.396 2.896 l
+67.396 -2.013 l
+68.469 -2.013 l
+68.469 -2.631 l
+h
+71.412 -1.323 m
+71.126 -1.323 70.883 -1.282 70.677 -1.205 c
+70.471 -1.117 70.299 -0.995 70.162 -0.837 c
+70.023 -0.683 69.92 -0.496 69.854 -0.279 c
+69.784 -0.055 69.751 0.191 69.751 0.456 c
+69.751 0.75 69.784 1.007 69.854 1.235 c
+69.931 1.459 70.038 1.646 70.177 1.793 c
+70.324 1.947 70.501 2.065 70.706 2.146 c
+70.912 2.234 71.147 2.278 71.412 2.278 c
+71.636 2.278 71.839 2.249 72.015 2.19 c
+72.191 2.132 72.342 2.047 72.47 1.941 c
+72.595 1.841 72.698 1.72 72.779 1.573 c
+72.857 1.434 72.911 1.282 72.94 1.118 c
+72.03 1.073 l
+72 1.249 71.93 1.389 71.824 1.5 c
+71.724 1.606 71.581 1.661 71.397 1.661 c
+71.151 1.661 70.975 1.558 70.868 1.353 c
+70.758 1.154 70.706 0.867 70.706 0.485 c
+70.706 -0.309 70.941 -0.706 71.412 -0.706 c
+71.577 -0.706 71.721 -0.654 71.839 -0.544 c
+71.956 -0.437 72.03 -0.276 72.059 -0.058 c
+72.97 -0.103 l
+72.94 -0.272 72.886 -0.426 72.809 -0.573 c
+72.739 -0.72 72.635 -0.852 72.5 -0.97 c
+72.371 -1.08 72.213 -1.168 72.03 -1.234 c
+71.853 -1.294 71.647 -1.323 71.412 -1.323 c
+77.119 0.485 m
+77.119 0.21 77.082 -0.04 77.016 -0.264 c
+76.946 -0.482 76.843 -0.669 76.707 -0.823 c
+76.568 -0.981 76.391 -1.103 76.178 -1.19 c
+75.961 -1.278 75.708 -1.323 75.413 -1.323 c
+75.138 -1.323 74.892 -1.278 74.679 -1.19 c
+74.473 -1.103 74.301 -0.981 74.164 -0.823 c
+74.025 -0.669 73.921 -0.482 73.856 -0.264 c
+73.786 -0.04 73.753 0.21 73.753 0.485 c
+73.753 0.738 73.782 0.974 73.841 1.191 c
+73.907 1.415 74.01 1.606 74.15 1.764 c
+74.285 1.929 74.462 2.058 74.679 2.146 c
+74.892 2.234 75.149 2.278 75.444 2.278 c
+75.756 2.278 76.016 2.234 76.222 2.146 c
+76.435 2.058 76.608 1.929 76.737 1.764 c
+76.873 1.606 76.972 1.415 77.031 1.191 c
+77.09 0.974 77.119 0.738 77.119 0.485 c
+76.163 0.485 m
+76.163 0.691 76.149 0.867 76.119 1.014 c
+76.097 1.162 76.061 1.282 76.001 1.382 c
+75.943 1.477 75.87 1.548 75.781 1.588 c
+75.693 1.635 75.583 1.661 75.458 1.661 c
+75.193 1.661 75.002 1.562 74.885 1.367 c
+74.767 1.18 74.708 0.886 74.708 0.485 c
+74.708 0.063 74.767 -0.243 74.885 -0.426 c
+75.002 -0.613 75.178 -0.706 75.413 -0.706 c
+75.539 -0.706 75.652 -0.687 75.752 -0.646 c
+75.847 -0.599 75.928 -0.525 75.987 -0.426 c
+76.053 -0.33 76.097 -0.206 76.119 -0.058 c
+76.149 0.088 76.163 0.268 76.163 0.485 c
+79.14 -1.264 m
+79.14 0.852 l
+79.14 1.018 79.132 1.154 79.126 1.264 c
+79.114 1.371 79.095 1.455 79.066 1.515 c
+79.045 1.58 79.015 1.632 78.978 1.661 c
+78.949 1.691 78.908 1.706 78.86 1.706 c
+78.802 1.706 78.746 1.675 78.699 1.617 c
+78.659 1.565 78.625 1.492 78.596 1.397 c
+78.567 1.309 78.541 1.195 78.523 1.058 c
+78.511 0.919 78.508 0.769 78.508 0.603 c
+78.508 -1.264 l
+77.759 -1.264 l
+77.759 1.47 l
+77.759 1.706 l
+77.759 1.926 l
+77.759 2.003 77.751 2.065 77.744 2.117 c
+77.744 2.22 l
+78.42 2.22 l
+78.42 2.132 l
+78.42 1.985 l
+78.427 1.926 78.434 1.867 78.434 1.808 c
+78.434 1.646 l
+78.449 1.646 l
+78.467 1.735 78.497 1.812 78.538 1.882 c
+78.574 1.959 78.619 2.028 78.669 2.087 c
+78.729 2.146 78.794 2.19 78.875 2.22 c
+78.952 2.257 79.041 2.278 79.14 2.278 c
+79.324 2.278 79.463 2.223 79.552 2.117 c
+79.647 2.018 79.717 1.86 79.758 1.646 c
+79.772 1.646 l
+79.809 1.742 79.849 1.83 79.889 1.911 c
+79.937 1.988 79.993 2.051 80.051 2.103 c
+80.111 2.161 80.176 2.205 80.257 2.234 c
+80.334 2.263 80.423 2.278 80.522 2.278 c
+80.658 2.278 80.772 2.253 80.859 2.205 c
+80.948 2.153 81.014 2.08 81.065 1.985 c
+81.125 1.885 81.161 1.756 81.183 1.602 c
+81.212 1.455 81.227 1.272 81.227 1.058 c
+81.227 -1.264 l
+80.507 -1.264 l
+80.507 0.852 l
+80.507 1.018 80.5 1.154 80.492 1.264 c
+80.481 1.371 80.463 1.455 80.433 1.515 c
+80.412 1.58 80.382 1.632 80.346 1.661 c
+80.316 1.691 80.275 1.706 80.228 1.706 c
+80.111 1.706 80.015 1.617 79.949 1.44 c
+79.889 1.272 79.86 1.014 79.86 0.661 c
+79.86 -1.264 l
+h
+83.201 -1.264 m
+83.201 0.852 l
+83.201 1.018 83.193 1.154 83.186 1.264 c
+83.175 1.371 83.157 1.455 83.128 1.515 c
+83.105 1.58 83.076 1.632 83.039 1.661 c
+83.01 1.691 82.969 1.706 82.921 1.706 c
+82.862 1.706 82.808 1.675 82.76 1.617 c
+82.719 1.565 82.686 1.492 82.657 1.397 c
+82.627 1.309 82.602 1.195 82.583 1.058 c
+82.572 0.919 82.569 0.769 82.569 0.603 c
+82.569 -1.264 l
+81.819 -1.264 l
+81.819 1.47 l
+81.819 1.706 l
+81.819 1.926 l
+81.819 2.003 81.811 2.065 81.804 2.117 c
+81.804 2.22 l
+82.48 2.22 l
+82.48 2.132 l
+82.48 1.985 l
+82.488 1.926 82.495 1.867 82.495 1.808 c
+82.495 1.646 l
+82.509 1.646 l
+82.528 1.735 82.557 1.812 82.598 1.882 c
+82.635 1.959 82.679 2.028 82.73 2.087 c
+82.789 2.146 82.855 2.19 82.936 2.22 c
+83.013 2.257 83.101 2.278 83.201 2.278 c
+83.384 2.278 83.524 2.223 83.612 2.117 c
+83.708 2.018 83.778 1.86 83.818 1.646 c
+83.833 1.646 l
+83.87 1.742 83.91 1.83 83.951 1.911 c
+83.998 1.988 84.053 2.051 84.112 2.103 c
+84.171 2.161 84.237 2.205 84.318 2.234 c
+84.395 2.263 84.483 2.278 84.582 2.278 c
+84.718 2.278 84.832 2.253 84.921 2.205 c
+85.009 2.153 85.075 2.08 85.127 1.985 c
+85.185 1.885 85.222 1.756 85.244 1.602 c
+85.273 1.455 85.287 1.272 85.287 1.058 c
+85.287 -1.264 l
+84.568 -1.264 l
+84.568 0.852 l
+84.568 1.018 84.56 1.154 84.553 1.264 c
+84.541 1.371 84.524 1.455 84.494 1.515 c
+84.472 1.58 84.443 1.632 84.406 1.661 c
+84.377 1.691 84.336 1.706 84.288 1.706 c
+84.171 1.706 84.075 1.617 84.009 1.44 c
+83.951 1.272 83.921 1.014 83.921 0.661 c
+83.921 -1.264 l
+h
+88.202 -0.646 m
+89.334 -0.646 l
+89.334 -1.264 l
+86.027 -1.264 l
+86.027 -0.646 l
+87.29 -0.646 l
+87.29 1.602 l
+86.365 1.602 l
+86.365 2.22 l
+88.202 2.22 l
+h
+87.29 3.514 0.912 -0.676 re
+87.29 2.837 m
+90.763 1.602 m
+90.22 1.602 l
+90.22 2.22 l
+90.808 2.22 l
+91.086 3.117 l
+91.66 3.117 l
+91.66 2.22 l
+92.894 2.22 l
+92.894 1.602 l
+91.66 1.602 l
+91.66 -0.103 l
+91.66 -0.324 l
+91.668 -0.393 91.689 -0.455 91.718 -0.515 c
+91.755 -0.565 91.811 -0.61 91.88 -0.646 c
+91.957 -0.676 92.071 -0.69 92.219 -0.69 c
+92.354 -0.69 92.491 -0.687 92.63 -0.676 c
+92.766 -0.658 92.898 -0.632 93.027 -0.602 c
+93.027 -1.205 l
+92.946 -1.216 92.869 -1.23 92.792 -1.249 c
+92.711 -1.261 92.634 -1.267 92.557 -1.278 c
+92.476 -1.286 92.387 -1.294 92.292 -1.294 c
+92.204 -1.301 92.105 -1.308 91.998 -1.308 c
+91.811 -1.308 91.649 -1.294 91.513 -1.264 c
+91.384 -1.228 91.271 -1.183 91.175 -1.132 c
+91.086 -1.084 91.013 -1.025 90.954 -0.955 c
+90.895 -0.878 90.851 -0.801 90.822 -0.72 c
+90.793 -0.632 90.771 -0.544 90.763 -0.455 c
+90.752 -0.36 90.748 -0.264 90.748 -0.176 c
+h
+101.387 -0.249 m
+101.387 -0.419 101.347 -0.569 101.27 -0.706 c
+101.199 -0.834 101.097 -0.948 100.961 -1.043 c
+100.832 -1.132 100.67 -1.201 100.476 -1.249 c
+100.288 -1.297 100.071 -1.323 99.828 -1.323 c
+99.601 -1.323 99.402 -1.308 99.226 -1.278 c
+99.05 -1.249 98.891 -1.201 98.756 -1.132 c
+98.616 -1.055 98.506 -0.955 98.417 -0.837 c
+98.33 -0.72 98.26 -0.573 98.212 -0.397 c
+99.02 -0.279 l
+99.039 -0.378 99.068 -0.455 99.109 -0.515 c
+99.157 -0.573 99.215 -0.617 99.285 -0.646 c
+99.351 -0.676 99.432 -0.702 99.52 -0.72 c
+99.608 -0.731 99.711 -0.735 99.828 -0.735 c
+99.924 -0.735 100.02 -0.731 100.108 -0.72 c
+100.196 -0.702 100.273 -0.676 100.343 -0.646 c
+100.41 -0.617 100.461 -0.58 100.491 -0.529 c
+100.527 -0.482 100.549 -0.419 100.549 -0.338 c
+100.549 -0.243 100.52 -0.169 100.461 -0.118 c
+100.41 -0.07 100.343 -0.029 100.256 0 c
+100.167 0.037 100.057 0.066 99.932 0.088 c
+99.814 0.118 99.682 0.147 99.535 0.177 c
+99.396 0.214 99.256 0.254 99.109 0.294 c
+98.969 0.341 98.844 0.405 98.727 0.485 c
+98.616 0.563 98.528 0.661 98.462 0.779 c
+98.392 0.897 98.359 1.047 98.359 1.235 c
+98.359 1.389 98.388 1.532 98.447 1.661 c
+98.513 1.797 98.609 1.911 98.727 1.999 c
+98.851 2.087 99.009 2.153 99.197 2.205 c
+99.381 2.253 99.593 2.278 99.828 2.278 c
+100.013 2.278 100.189 2.257 100.358 2.22 c
+100.524 2.19 100.67 2.135 100.799 2.058 c
+100.924 1.988 101.034 1.889 101.122 1.764 c
+101.21 1.646 101.27 1.503 101.299 1.338 c
+100.505 1.264 l
+100.483 1.341 100.454 1.404 100.416 1.455 c
+100.377 1.515 100.329 1.558 100.27 1.588 c
+100.219 1.625 100.156 1.65 100.079 1.661 c
+99.998 1.669 99.917 1.675 99.828 1.675 c
+99.612 1.675 99.45 1.646 99.344 1.588 c
+99.234 1.536 99.182 1.448 99.182 1.323 c
+99.182 1.242 99.201 1.18 99.24 1.132 c
+99.288 1.081 99.351 1.044 99.432 1.014 c
+99.52 0.985 99.616 0.956 99.726 0.927 c
+99.832 0.904 99.954 0.882 100.094 0.852 c
+100.248 0.823 100.406 0.783 100.564 0.735 c
+100.718 0.684 100.858 0.621 100.975 0.544 c
+101.093 0.463 101.189 0.36 101.27 0.235 c
+101.347 0.106 101.387 -0.055 101.387 -0.249 c
+103.242 1.515 m
+103.36 1.786 103.511 1.985 103.699 2.103 c
+103.882 2.22 104.102 2.278 104.36 2.278 c
+104.566 2.278 104.734 2.242 104.875 2.176 c
+105.021 2.105 105.131 2.014 105.212 1.897 c
+105.301 1.779 105.359 1.635 105.389 1.47 c
+105.426 1.301 105.447 1.124 105.447 0.941 c
+105.447 -1.264 l
+104.536 -1.264 l
+104.536 0.735 l
+104.536 0.871 104.526 0.992 104.507 1.103 c
+104.495 1.209 104.47 1.297 104.433 1.367 c
+104.393 1.444 104.335 1.503 104.257 1.544 c
+104.187 1.58 104.096 1.602 103.978 1.602 c
+103.867 1.602 103.772 1.577 103.684 1.529 c
+103.595 1.477 103.514 1.411 103.448 1.323 c
+103.39 1.235 103.338 1.124 103.302 1 c
+103.272 0.882 103.257 0.75 103.257 0.603 c
+103.257 -1.264 l
+102.346 -1.264 l
+102.346 3.514 l
+103.257 3.514 l
+103.257 2.205 l
+103.257 2.135 103.25 2.065 103.242 1.999 c
+103.242 1.793 l
+103.242 1.735 103.236 1.679 103.228 1.632 c
+103.228 1.515 l
+h
+107.362 -1.323 m
+107.193 -1.323 107.042 -1.301 106.907 -1.264 c
+106.778 -1.216 106.664 -1.147 106.569 -1.058 c
+106.48 -0.97 106.411 -0.864 106.363 -0.735 c
+106.311 -0.599 106.289 -0.448 106.289 -0.279 c
+106.289 -0.073 106.322 0.096 106.392 0.235 c
+106.458 0.382 106.554 0.493 106.671 0.574 c
+106.797 0.661 106.939 0.724 107.098 0.765 c
+107.263 0.802 107.439 0.827 107.627 0.838 c
+108.347 0.852 l
+108.347 1.029 l
+108.347 1.147 108.336 1.249 108.318 1.338 c
+108.295 1.426 108.262 1.492 108.215 1.544 c
+108.175 1.602 108.127 1.639 108.067 1.661 c
+108.009 1.679 107.942 1.691 107.876 1.691 c
+107.807 1.691 107.745 1.679 107.685 1.661 c
+107.634 1.65 107.587 1.625 107.539 1.588 c
+107.498 1.558 107.465 1.507 107.435 1.44 c
+107.414 1.382 107.399 1.301 107.392 1.205 c
+106.451 1.249 l
+106.48 1.397 106.525 1.532 106.583 1.661 c
+106.649 1.786 106.745 1.897 106.862 1.985 c
+106.98 2.08 107.119 2.153 107.289 2.205 c
+107.465 2.253 107.67 2.278 107.906 2.278 c
+108.347 2.278 108.678 2.168 108.906 1.955 c
+109.141 1.75 109.258 1.44 109.258 1.029 c
+109.258 -0.235 l
+109.258 -0.455 l
+109.266 -0.515 109.28 -0.569 109.303 -0.617 c
+109.321 -0.658 109.351 -0.69 109.391 -0.72 c
+109.428 -0.742 109.479 -0.75 109.538 -0.75 c
+109.604 -0.75 109.673 -0.746 109.744 -0.735 c
+109.744 -1.22 l
+109.685 -1.23 109.629 -1.242 109.582 -1.249 c
+109.542 -1.261 109.501 -1.267 109.464 -1.278 c
+109.424 -1.286 109.38 -1.294 109.332 -1.294 c
+109.28 -1.301 109.222 -1.308 109.156 -1.308 c
+108.927 -1.308 108.763 -1.257 108.655 -1.147 c
+108.545 -1.029 108.483 -0.864 108.464 -0.646 c
+108.45 -0.646 l
+108.38 -0.757 108.31 -0.852 108.244 -0.941 c
+108.175 -1.022 108.098 -1.087 108.009 -1.147 c
+107.921 -1.205 107.822 -1.249 107.715 -1.278 c
+107.616 -1.308 107.498 -1.323 107.362 -1.323 c
+108.347 0.353 m
+107.921 0.339 l
+107.822 0.339 107.73 0.331 107.641 0.324 c
+107.56 0.312 107.495 0.287 107.435 0.25 c
+107.377 0.21 107.325 0.151 107.289 0.073 c
+107.248 0.004 107.23 -0.088 107.23 -0.206 c
+107.23 -0.374 107.263 -0.496 107.333 -0.573 c
+107.399 -0.654 107.498 -0.69 107.627 -0.69 c
+107.733 -0.69 107.832 -0.669 107.921 -0.617 c
+108.017 -0.569 108.098 -0.507 108.156 -0.426 c
+108.222 -0.349 108.273 -0.261 108.303 -0.162 c
+108.333 -0.055 108.347 0.059 108.347 0.177 c
+h
+110.835 -2.631 m
+110.835 -2.013 l
+111.908 -2.013 l
+111.908 2.896 l
+110.835 2.896 l
+110.835 3.514 l
+112.761 3.514 l
+112.761 -2.631 l
+h
+f
+Q
+q 1 0 0 1 300.6696 419.9752 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.485 -1.323 c
+-0.779 -1.628 -1.198 -1.779 -1.735 -1.779 c
+-2.263 -1.779 -2.69 -1.58 -3.013 -1.176 c
+-3.329 -0.765 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.469 l
+-3.484 2.165 -3.322 2.712 -2.999 3.116 c
+-2.675 3.517 -2.23 3.719 -1.661 3.719 c
+-1.154 3.719 -0.757 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.69 1.926 l
+-0.721 2.366 -0.816 2.678 -0.97 2.866 c
+-1.118 3.05 -1.349 3.146 -1.661 3.146 c
+-2.036 3.146 -2.319 2.998 -2.514 2.705 c
+-2.712 2.418 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.07 -2.716 -0.485 -2.529 -0.779 c
+-2.344 -1.066 -2.08 -1.205 -1.735 -1.205 c
+-1.382 -1.205 -1.128 -1.118 -0.97 -0.941 c
+-0.816 -0.765 -0.721 -0.453 -0.69 0 c
+h
+2.454 1.66 m
+2.367 1.679 2.267 1.691 2.161 1.691 c
+1.826 1.691 1.591 1.506 1.455 1.147 c
+1.455 -1.706 l
+0.808 -1.706 l
+0.808 2.278 l
+1.44 2.278 l
+1.455 1.866 l
+1.631 2.19 1.874 2.352 2.19 2.352 c
+2.296 2.352 2.385 2.329 2.454 2.293 c
+h
+4.453 -1.779 m
+3.954 -1.779 3.572 -1.632 3.308 -1.338 c
+3.042 -1.044 2.911 -0.611 2.911 -0.029 c
+2.911 0.441 l
+2.911 1.036 3.036 1.502 3.293 1.837 c
+3.557 2.179 3.917 2.352 4.38 2.352 c
+4.84 2.352 5.182 2.198 5.409 1.896 c
+5.644 1.602 5.766 1.139 5.777 0.515 c
+5.777 0.088 l
+3.557 0.088 l
+3.557 0 l
+3.557 -0.434 3.634 -0.746 3.792 -0.941 c
+3.958 -1.128 4.189 -1.22 4.484 -1.22 c
+4.678 -1.22 4.85 -1.187 4.997 -1.118 c
+5.145 -1.04 5.28 -0.923 5.409 -0.765 c
+5.747 -1.176 l
+5.461 -1.58 5.031 -1.779 4.453 -1.779 c
+4.38 1.793 m
+4.104 1.793 3.902 1.697 3.778 1.514 c
+3.649 1.326 3.576 1.036 3.557 0.646 c
+5.13 0.646 l
+5.13 0.735 l
+5.108 1.117 5.041 1.385 4.924 1.543 c
+4.806 1.708 4.623 1.793 4.38 1.793 c
+8.599 -1.706 m
+8.559 -1.617 8.533 -1.47 8.525 -1.264 c
+8.29 -1.61 7.996 -1.779 7.644 -1.779 c
+7.279 -1.779 6.996 -1.683 6.791 -1.484 c
+6.593 -1.279 6.497 -0.992 6.497 -0.617 c
+6.497 -0.217 6.633 0.103 6.909 0.338 c
+7.181 0.58 7.555 0.706 8.025 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.455 1.532 8.349 1.631 c
+8.239 1.738 8.077 1.793 7.864 1.793 c
+7.665 1.793 7.504 1.735 7.379 1.617 c
+7.262 1.5 7.202 1.352 7.202 1.176 c
+6.556 1.176 l
+6.556 1.371 6.614 1.562 6.732 1.749 c
+6.857 1.932 7.019 2.08 7.217 2.19 c
+7.423 2.296 7.651 2.352 7.908 2.352 c
+8.309 2.352 8.613 2.248 8.819 2.043 c
+9.033 1.837 9.147 1.543 9.157 1.161 c
+9.157 -0.852 l
+9.157 -1.158 9.194 -1.422 9.275 -1.646 c
+9.275 -1.706 l
+h
+7.732 -1.191 m
+7.897 -1.191 8.048 -1.147 8.187 -1.058 c
+8.334 -0.97 8.441 -0.86 8.511 -0.721 c
+8.511 0.22 l
+8.143 0.22 l
+7.827 0.22 7.584 0.151 7.408 0.014 c
+7.231 -0.114 7.144 -0.302 7.144 -0.544 c
+7.144 -0.772 7.188 -0.937 7.276 -1.044 c
+7.364 -1.143 7.515 -1.191 7.732 -1.191 c
+11.009 3.233 m
+11.009 2.278 l
+11.612 2.278 l
+11.612 1.749 l
+11.009 1.749 l
+11.009 -0.721 l
+11.009 -0.879 11.032 -0.996 11.083 -1.073 c
+11.142 -1.154 11.23 -1.191 11.347 -1.191 c
+11.436 -1.191 11.524 -1.176 11.612 -1.147 c
+11.612 -1.706 l
+11.465 -1.753 11.311 -1.779 11.156 -1.779 c
+10.899 -1.779 10.705 -1.687 10.568 -1.5 c
+10.429 -1.316 10.363 -1.055 10.363 -0.721 c
+10.363 1.749 l
+9.76 1.749 l
+9.76 2.278 l
+10.363 2.278 l
+10.363 3.233 l
+h
+13.803 -1.779 m
+13.303 -1.779 12.92 -1.632 12.656 -1.338 c
+12.391 -1.044 12.259 -0.611 12.259 -0.029 c
+12.259 0.441 l
+12.259 1.036 12.384 1.502 12.641 1.837 c
+12.906 2.179 13.266 2.352 13.729 2.352 c
+14.188 2.352 14.53 2.198 14.757 1.896 c
+14.993 1.602 15.114 1.139 15.125 0.515 c
+15.125 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.307 -1.128 13.538 -1.22 13.832 -1.22 c
+14.026 -1.22 14.2 -1.187 14.346 -1.118 c
+14.493 -1.04 14.629 -0.923 14.757 -0.765 c
+15.096 -1.176 l
+14.809 -1.58 14.379 -1.779 13.803 -1.779 c
+13.729 1.793 m
+13.454 1.793 13.251 1.697 13.126 1.514 c
+12.997 1.326 12.924 1.036 12.906 0.646 c
+14.479 0.646 l
+14.479 0.735 l
+14.456 1.117 14.391 1.385 14.273 1.543 c
+14.155 1.708 13.972 1.793 13.729 1.793 c
+19.667 -1.706 m
+19.627 -1.617 19.601 -1.47 19.594 -1.264 c
+19.359 -1.61 19.065 -1.779 18.712 -1.779 c
+18.348 -1.779 18.065 -1.683 17.859 -1.484 c
+17.661 -1.279 17.565 -0.992 17.565 -0.617 c
+17.565 -0.217 17.701 0.103 17.977 0.338 c
+18.248 0.58 18.624 0.706 19.094 0.706 c
+19.579 0.706 l
+19.579 1.132 l
+19.579 1.367 19.524 1.532 19.418 1.631 c
+19.307 1.738 19.146 1.793 18.932 1.793 c
+18.734 1.793 18.572 1.735 18.447 1.617 c
+18.329 1.5 18.271 1.352 18.271 1.176 c
+17.624 1.176 l
+17.624 1.371 17.683 1.562 17.801 1.749 c
+17.926 1.932 18.088 2.08 18.285 2.19 c
+18.491 2.296 18.719 2.352 18.977 2.352 c
+19.377 2.352 19.682 2.248 19.888 2.043 c
+20.101 1.837 20.215 1.543 20.226 1.161 c
+20.226 -0.852 l
+20.226 -1.158 20.263 -1.422 20.344 -1.646 c
+20.344 -1.706 l
+h
+18.8 -1.191 m
+18.965 -1.191 19.116 -1.147 19.256 -1.058 c
+19.403 -0.97 19.509 -0.86 19.579 -0.721 c
+19.579 0.22 l
+19.212 0.22 l
+18.896 0.22 18.653 0.151 18.477 0.014 c
+18.3 -0.114 18.212 -0.302 18.212 -0.544 c
+18.212 -0.772 18.256 -0.937 18.344 -1.044 c
+18.433 -1.143 18.583 -1.191 18.8 -1.191 c
+23.798 3.233 m
+23.798 2.278 l
+24.4 2.278 l
+24.4 1.749 l
+23.798 1.749 l
+23.798 -0.721 l
+23.798 -0.879 23.82 -0.996 23.871 -1.073 c
+23.93 -1.154 24.018 -1.191 24.136 -1.191 c
+24.224 -1.191 24.312 -1.176 24.4 -1.147 c
+24.4 -1.706 l
+24.253 -1.753 24.099 -1.779 23.945 -1.779 c
+23.688 -1.779 23.493 -1.687 23.357 -1.5 c
+23.217 -1.316 23.151 -1.055 23.151 -0.721 c
+23.151 1.749 l
+22.549 1.749 l
+22.549 2.278 l
+23.151 2.278 l
+23.151 3.233 l
+h
+27.208 -1.706 m
+27.168 -1.617 27.142 -1.47 27.135 -1.264 c
+26.9 -1.61 26.605 -1.779 26.252 -1.779 c
+25.888 -1.779 25.606 -1.683 25.4 -1.484 c
+25.201 -1.279 25.106 -0.992 25.106 -0.617 c
+25.106 -0.217 25.242 0.103 25.518 0.338 c
+25.789 0.58 26.164 0.706 26.634 0.706 c
+27.12 0.706 l
+27.12 1.132 l
+27.12 1.367 27.064 1.532 26.958 1.631 c
+26.848 1.738 26.686 1.793 26.473 1.793 c
+26.275 1.793 26.113 1.735 25.988 1.617 c
+25.87 1.5 25.811 1.352 25.811 1.176 c
+25.165 1.176 l
+25.165 1.371 25.223 1.562 25.341 1.749 c
+25.466 1.932 25.628 2.08 25.826 2.19 c
+26.032 2.296 26.26 2.352 26.517 2.352 c
+26.917 2.352 27.222 2.248 27.428 2.043 c
+27.642 1.837 27.756 1.543 27.767 1.161 c
+27.767 -0.852 l
+27.767 -1.158 27.804 -1.422 27.884 -1.646 c
+27.884 -1.706 l
+h
+26.341 -1.191 m
+26.506 -1.191 26.657 -1.147 26.796 -1.058 c
+26.944 -0.97 27.05 -0.86 27.12 -0.721 c
+27.12 0.22 l
+26.752 0.22 l
+26.437 0.22 26.194 0.151 26.017 0.014 c
+25.841 -0.114 25.753 -0.302 25.753 -0.544 c
+25.753 -0.772 25.797 -0.937 25.885 -1.044 c
+25.973 -1.143 26.123 -1.191 26.341 -1.191 c
+28.633 0.47 m
+28.633 1.088 28.744 1.55 28.972 1.866 c
+29.196 2.19 29.531 2.352 29.971 2.352 c
+30.372 2.352 30.677 2.175 30.883 1.822 c
+30.927 2.278 l
+31.515 2.278 l
+31.515 -1.75 l
+31.515 -2.238 31.386 -2.616 31.133 -2.882 c
+30.875 -3.146 30.522 -3.278 30.074 -3.278 c
+29.876 -3.278 29.655 -3.227 29.413 -3.131 c
+29.167 -3.032 28.986 -2.911 28.868 -2.764 c
+29.134 -2.323 l
+29.398 -2.587 29.695 -2.72 30.03 -2.72 c
+30.567 -2.72 30.842 -2.425 30.853 -1.837 c
+30.853 -1.309 l
+30.647 -1.625 30.346 -1.779 29.957 -1.779 c
+29.545 -1.779 29.221 -1.628 28.986 -1.323 c
+28.758 -1.01 28.641 -0.559 28.633 0.029 c
+h
+29.296 0.088 m
+29.296 -0.353 29.358 -0.684 29.487 -0.897 c
+29.612 -1.103 29.828 -1.205 30.133 -1.205 c
+30.456 -1.205 30.695 -1.04 30.853 -0.706 c
+30.853 1.278 l
+30.684 1.602 30.445 1.764 30.133 1.764 c
+29.839 1.764 29.622 1.66 29.487 1.455 c
+29.358 1.249 29.296 0.926 29.296 0.484 c
+h
+35.837 1.66 m
+35.748 1.679 35.649 1.691 35.542 1.691 c
+35.208 1.691 34.973 1.506 34.837 1.147 c
+34.837 -1.706 l
+34.19 -1.706 l
+34.19 2.278 l
+34.822 2.278 l
+34.837 1.866 l
+35.013 2.19 35.256 2.352 35.571 2.352 c
+35.678 2.352 35.766 2.329 35.837 2.293 c
+h
+37.836 -1.779 m
+37.335 -1.779 36.953 -1.632 36.689 -1.338 c
+36.424 -1.044 36.292 -0.611 36.292 -0.029 c
+36.292 0.441 l
+36.292 1.036 36.417 1.502 36.674 1.837 c
+36.939 2.179 37.298 2.352 37.762 2.352 c
+38.221 2.352 38.563 2.198 38.79 1.896 c
+39.026 1.602 39.147 1.139 39.158 0.515 c
+39.158 0.088 l
+36.939 0.088 l
+36.939 0 l
+36.939 -0.434 37.016 -0.746 37.174 -0.941 c
+37.339 -1.128 37.57 -1.22 37.865 -1.22 c
+38.06 -1.22 38.233 -1.187 38.379 -1.118 c
+38.526 -1.04 38.663 -0.923 38.79 -0.765 c
+39.129 -1.176 l
+38.842 -1.58 38.412 -1.779 37.836 -1.779 c
+37.762 1.793 m
+37.487 1.793 37.284 1.697 37.159 1.514 c
+37.03 1.326 36.957 1.036 36.939 0.646 c
+38.511 0.646 l
+38.511 0.735 l
+38.489 1.117 38.424 1.385 38.306 1.543 c
+38.188 1.708 38.004 1.793 37.762 1.793 c
+40.232 -1.706 m
+40.232 1.749 l
+39.702 1.749 l
+39.702 2.278 l
+40.232 2.278 l
+40.232 2.734 l
+40.232 3.135 40.327 3.447 40.525 3.675 c
+40.731 3.898 41.011 4.012 41.363 4.012 c
+41.499 4.012 41.632 3.991 41.76 3.954 c
+41.73 3.41 l
+41.632 3.428 41.532 3.439 41.437 3.439 c
+41.061 3.439 40.878 3.175 40.878 2.645 c
+40.878 2.278 l
+41.554 2.278 l
+41.554 1.749 l
+40.878 1.749 l
+40.878 -1.706 l
+h
+43.656 -1.779 m
+43.156 -1.779 42.774 -1.632 42.509 -1.338 c
+42.245 -1.044 42.113 -0.611 42.113 -0.029 c
+42.113 0.441 l
+42.113 1.036 42.237 1.502 42.495 1.837 c
+42.759 2.179 43.12 2.352 43.583 2.352 c
+44.042 2.352 44.384 2.198 44.612 1.896 c
+44.847 1.602 44.968 1.139 44.979 0.515 c
+44.979 0.088 l
+42.759 0.088 l
+42.759 0 l
+42.759 -0.434 42.837 -0.746 42.995 -0.941 c
+43.16 -1.128 43.392 -1.22 43.685 -1.22 c
+43.881 -1.22 44.053 -1.187 44.2 -1.118 c
+44.347 -1.04 44.483 -0.923 44.612 -0.765 c
+44.949 -1.176 l
+44.663 -1.58 44.233 -1.779 43.656 -1.779 c
+43.583 1.793 m
+43.307 1.793 43.105 1.697 42.98 1.514 c
+42.852 1.326 42.778 1.036 42.759 0.646 c
+44.332 0.646 l
+44.332 0.735 l
+44.311 1.117 44.244 1.385 44.126 1.543 c
+44.009 1.708 43.825 1.793 43.583 1.793 c
+47.405 1.66 m
+47.316 1.679 47.217 1.691 47.11 1.691 c
+46.776 1.691 46.541 1.506 46.405 1.147 c
+46.405 -1.706 l
+45.759 -1.706 l
+45.759 2.278 l
+46.39 2.278 l
+46.405 1.866 l
+46.582 2.19 46.823 2.352 47.14 2.352 c
+47.247 2.352 47.334 2.329 47.405 2.293 c
+h
+49.404 -1.779 m
+48.903 -1.779 48.521 -1.632 48.257 -1.338 c
+47.993 -1.044 47.86 -0.611 47.86 -0.029 c
+47.86 0.441 l
+47.86 1.036 47.985 1.502 48.242 1.837 c
+48.506 2.179 48.867 2.352 49.33 2.352 c
+49.79 2.352 50.131 2.198 50.359 1.896 c
+50.594 1.602 50.715 1.139 50.727 0.515 c
+50.727 0.088 l
+48.506 0.088 l
+48.506 0 l
+48.506 -0.434 48.584 -0.746 48.742 -0.941 c
+48.907 -1.128 49.139 -1.22 49.433 -1.22 c
+49.628 -1.22 49.8 -1.187 49.948 -1.118 c
+50.094 -1.04 50.231 -0.923 50.359 -0.765 c
+50.697 -1.176 l
+50.41 -1.58 49.981 -1.779 49.404 -1.779 c
+49.33 1.793 m
+49.055 1.793 48.853 1.697 48.727 1.514 c
+48.599 1.326 48.525 1.036 48.506 0.646 c
+50.079 0.646 l
+50.079 0.735 l
+50.058 1.117 49.992 1.385 49.874 1.543 c
+49.757 1.708 49.572 1.793 49.33 1.793 c
+52.123 2.278 m
+52.138 1.837 l
+52.391 2.179 52.714 2.352 53.108 2.352 c
+53.813 2.352 54.17 1.882 54.181 0.941 c
+54.181 -1.706 l
+53.534 -1.706 l
+53.534 0.912 l
+53.534 1.224 53.479 1.444 53.372 1.573 c
+53.262 1.697 53.108 1.764 52.902 1.764 c
+52.743 1.764 52.597 1.708 52.461 1.602 c
+52.332 1.492 52.229 1.356 52.152 1.19 c
+52.152 -1.706 l
+51.505 -1.706 l
+51.505 2.278 l
+h
+56.533 -1.22 m
+56.745 -1.22 56.918 -1.158 57.047 -1.029 c
+57.183 -0.893 57.256 -0.702 57.268 -0.456 c
+57.885 -0.456 l
+57.863 -0.838 57.727 -1.158 57.474 -1.411 c
+57.216 -1.658 56.903 -1.779 56.533 -1.779 c
+56.04 -1.779 55.665 -1.628 55.401 -1.323 c
+55.143 -1.01 55.018 -0.544 55.018 0.073 c
+55.018 0.515 l
+55.018 1.109 55.143 1.565 55.401 1.882 c
+55.665 2.194 56.04 2.352 56.533 2.352 c
+56.933 2.352 57.252 2.219 57.488 1.955 c
+57.73 1.697 57.863 1.352 57.885 0.912 c
+57.268 0.912 l
+57.246 1.205 57.172 1.425 57.047 1.573 c
+56.93 1.72 56.757 1.793 56.533 1.793 c
+56.238 1.793 56.022 1.694 55.886 1.5 c
+55.746 1.311 55.673 1.003 55.665 0.573 c
+55.665 0.058 l
+55.665 -0.412 55.731 -0.746 55.871 -0.941 c
+56.018 -1.128 56.238 -1.22 56.533 -1.22 c
+60.061 -1.779 m
+59.56 -1.779 59.178 -1.632 58.914 -1.338 c
+58.649 -1.044 58.517 -0.611 58.517 -0.029 c
+58.517 0.441 l
+58.517 1.036 58.642 1.502 58.899 1.837 c
+59.164 2.179 59.523 2.352 59.987 2.352 c
+60.446 2.352 60.788 2.198 61.015 1.896 c
+61.251 1.602 61.372 1.139 61.383 0.515 c
+61.383 0.088 l
+59.164 0.088 l
+59.164 0 l
+59.164 -0.434 59.241 -0.746 59.399 -0.941 c
+59.564 -1.128 59.795 -1.22 60.09 -1.22 c
+60.284 -1.22 60.458 -1.187 60.604 -1.118 c
+60.751 -1.04 60.887 -0.923 61.015 -0.765 c
+61.354 -1.176 l
+61.067 -1.58 60.637 -1.779 60.061 -1.779 c
+59.987 1.793 m
+59.712 1.793 59.509 1.697 59.384 1.514 c
+59.255 1.326 59.182 1.036 59.164 0.646 c
+60.736 0.646 l
+60.736 0.735 l
+60.714 1.117 60.649 1.385 60.531 1.543 c
+60.413 1.708 60.229 1.793 59.987 1.793 c
+64.499 2.278 m
+64.514 1.837 l
+64.768 2.179 65.091 2.352 65.484 2.352 c
+66.189 2.352 66.546 1.882 66.557 0.941 c
+66.557 -1.706 l
+65.91 -1.706 l
+65.91 0.912 l
+65.91 1.224 65.856 1.444 65.749 1.573 c
+65.638 1.697 65.484 1.764 65.279 1.764 c
+65.121 1.764 64.973 1.708 64.838 1.602 c
+64.709 1.492 64.606 1.356 64.529 1.19 c
+64.529 -1.706 l
+63.882 -1.706 l
+63.882 2.278 l
+h
+69.57 -1.706 m
+69.53 -1.617 69.505 -1.47 69.497 -1.264 c
+69.262 -1.61 68.967 -1.779 68.615 -1.779 c
+68.252 -1.779 67.968 -1.683 67.762 -1.484 c
+67.564 -1.279 67.469 -0.992 67.469 -0.617 c
+67.469 -0.217 67.604 0.103 67.88 0.338 c
+68.152 0.58 68.527 0.706 68.998 0.706 c
+69.482 0.706 l
+69.482 1.132 l
+69.482 1.367 69.428 1.532 69.32 1.631 c
+69.21 1.738 69.048 1.793 68.836 1.793 c
+68.637 1.793 68.475 1.735 68.35 1.617 c
+68.233 1.5 68.174 1.352 68.174 1.176 c
+67.527 1.176 l
+67.527 1.371 67.586 1.562 67.704 1.749 c
+67.829 1.932 67.99 2.08 68.189 2.19 c
+68.395 2.296 68.622 2.352 68.88 2.352 c
+69.281 2.352 69.586 2.248 69.791 2.043 c
+70.004 1.837 70.118 1.543 70.129 1.161 c
+70.129 -0.852 l
+70.129 -1.158 70.166 -1.422 70.247 -1.646 c
+70.247 -1.706 l
+h
+68.703 -1.191 m
+68.869 -1.191 69.019 -1.147 69.159 -1.058 c
+69.306 -0.97 69.412 -0.86 69.482 -0.721 c
+69.482 0.22 l
+69.115 0.22 l
+68.799 0.22 68.556 0.151 68.38 0.014 c
+68.204 -0.114 68.115 -0.302 68.115 -0.544 c
+68.115 -0.772 68.159 -0.937 68.248 -1.044 c
+68.336 -1.143 68.487 -1.191 68.703 -1.191 c
+71.746 2.278 m
+71.761 1.911 l
+72.003 2.205 72.323 2.352 72.716 2.352 c
+73.158 2.352 73.466 2.153 73.642 1.764 c
+73.896 2.153 74.245 2.352 74.686 2.352 c
+75.421 2.352 75.795 1.889 75.818 0.97 c
+75.818 -1.706 l
+75.171 -1.706 l
+75.171 0.912 l
+75.171 1.205 75.116 1.419 75.009 1.558 c
+74.91 1.694 74.737 1.764 74.494 1.764 c
+74.297 1.764 74.135 1.683 74.01 1.529 c
+73.892 1.382 73.823 1.19 73.804 0.955 c
+73.804 -1.706 l
+73.142 -1.706 l
+73.142 0.941 l
+73.142 1.488 72.922 1.764 72.481 1.764 c
+72.146 1.764 71.911 1.602 71.776 1.278 c
+71.776 -1.706 l
+71.128 -1.706 l
+71.128 2.278 l
+h
+78.214 -1.779 m
+77.714 -1.779 77.332 -1.632 77.067 -1.338 c
+76.803 -1.044 76.67 -0.611 76.67 -0.029 c
+76.67 0.441 l
+76.67 1.036 76.795 1.502 77.052 1.837 c
+77.317 2.179 77.677 2.352 78.14 2.352 c
+78.6 2.352 78.941 2.198 79.169 1.896 c
+79.404 1.602 79.525 1.139 79.537 0.515 c
+79.537 0.088 l
+77.317 0.088 l
+77.317 0 l
+77.317 -0.434 77.394 -0.746 77.552 -0.941 c
+77.717 -1.128 77.949 -1.22 78.243 -1.22 c
+78.438 -1.22 78.61 -1.187 78.758 -1.118 c
+78.905 -1.04 79.04 -0.923 79.169 -0.765 c
+79.508 -1.176 l
+79.221 -1.58 78.791 -1.779 78.214 -1.779 c
+78.14 1.793 m
+77.864 1.793 77.663 1.697 77.538 1.514 c
+77.409 1.326 77.335 1.036 77.317 0.646 c
+78.889 0.646 l
+78.889 0.735 l
+78.868 1.117 78.802 1.385 78.684 1.543 c
+78.567 1.708 78.382 1.793 78.14 1.793 c
+80.183 0.47 m
+80.183 1.076 80.294 1.543 80.522 1.866 c
+80.757 2.19 81.083 2.352 81.507 2.352 c
+81.889 2.352 82.186 2.194 82.403 1.882 c
+82.403 3.939 l
+83.049 3.939 l
+83.049 -1.706 l
+82.461 -1.706 l
+82.417 -1.279 l
+82.212 -1.613 81.906 -1.779 81.507 -1.779 c
+81.095 -1.779 80.771 -1.625 80.536 -1.309 c
+80.301 -0.985 80.183 -0.53 80.183 0.058 c
+h
+80.83 0.088 m
+80.83 -0.353 80.892 -0.684 81.021 -0.897 c
+81.157 -1.103 81.378 -1.205 81.683 -1.205 c
+82.006 -1.205 82.245 -1.044 82.403 -0.721 c
+82.403 1.294 l
+82.234 1.606 81.995 1.764 81.683 1.764 c
+81.378 1.764 81.157 1.66 81.021 1.455 c
+80.892 1.249 80.83 0.926 80.83 0.484 c
+h
+f
+Q
+q 1 0 0 1 387.291 422.2537 cm
+0 0 m
+0.029 -0.397 l
+0.264 -0.085 0.566 0.073 0.941 0.073 c
+1.625 0.073 1.977 -0.408 1.999 -1.367 c
+1.999 -3.984 l
+0.956 -3.984 l
+0.956 -1.441 l
+0.956 -1.216 0.919 -1.055 0.852 -0.956 c
+0.783 -0.86 0.665 -0.809 0.5 -0.809 c
+0.312 -0.809 0.166 -0.904 0.059 -1.088 c
+0.059 -3.984 l
+-0.985 -3.984 l
+-0.985 0 l
+h
+4.63 -3.984 m
+4.601 -3.925 4.571 -3.822 4.542 -3.675 c
+4.355 -3.932 4.104 -4.057 3.792 -4.057 c
+3.458 -4.057 3.179 -3.951 2.955 -3.734 c
+2.738 -3.51 2.631 -3.219 2.631 -2.866 c
+2.631 -2.455 2.764 -2.139 3.028 -1.912 c
+3.293 -1.676 3.675 -1.559 4.175 -1.559 c
+4.498 -1.559 l
+4.498 -1.235 l
+4.498 -1.058 4.461 -0.937 4.395 -0.867 c
+4.336 -0.79 4.248 -0.75 4.131 -0.75 c
+3.873 -0.75 3.748 -0.904 3.748 -1.206 c
+2.705 -1.206 l
+2.705 -0.834 2.841 -0.53 3.117 -0.294 c
+3.389 -0.052 3.738 0.073 4.16 0.073 c
+4.601 0.073 4.939 -0.044 5.174 -0.279 c
+5.417 -0.507 5.542 -0.831 5.542 -1.249 c
+5.542 -3.117 l
+5.542 -3.462 5.589 -3.73 5.689 -3.925 c
+5.689 -3.984 l
+h
+4.027 -3.234 m
+4.135 -3.234 4.226 -3.215 4.307 -3.175 c
+4.395 -3.128 4.457 -3.069 4.498 -2.999 c
+4.498 -2.176 l
+4.248 -2.176 l
+4.072 -2.176 3.929 -2.234 3.822 -2.352 c
+3.723 -2.463 3.675 -2.61 3.675 -2.793 c
+3.675 -3.088 3.792 -3.234 4.027 -3.234 c
+7.262 0 m
+7.291 -0.368 l
+7.526 -0.073 7.835 0.073 8.216 0.073 c
+8.617 0.073 8.897 -0.111 9.055 -0.47 c
+9.29 -0.111 9.617 0.073 10.04 0.073 c
+10.734 0.073 11.087 -0.412 11.098 -1.382 c
+11.098 -3.984 l
+10.069 -3.984 l
+10.069 -1.441 l
+10.069 -1.216 10.032 -1.055 9.966 -0.956 c
+9.907 -0.86 9.797 -0.809 9.643 -0.809 c
+9.444 -0.809 9.305 -0.927 9.216 -1.162 c
+9.216 -3.984 l
+8.173 -3.984 l
+8.173 -1.455 l
+8.173 -1.22 8.143 -1.055 8.085 -0.956 c
+8.025 -0.86 7.915 -0.809 7.761 -0.809 c
+7.585 -0.809 7.441 -0.904 7.335 -1.088 c
+7.335 -3.984 l
+6.292 -3.984 l
+6.292 0 l
+h
+13.479 -4.057 m
+12.95 -4.057 12.531 -3.903 12.23 -3.587 c
+11.936 -3.263 11.788 -2.804 11.788 -2.205 c
+11.788 -1.897 l
+11.788 -1.272 11.925 -0.786 12.2 -0.441 c
+12.472 -0.1 12.866 0.073 13.376 0.073 c
+13.876 0.073 14.247 -0.088 14.493 -0.412 c
+14.747 -0.736 14.88 -1.213 14.89 -1.837 c
+14.89 -2.338 l
+12.818 -2.338 l
+12.836 -2.631 12.898 -2.849 13.009 -2.984 c
+13.126 -3.124 13.307 -3.19 13.552 -3.19 c
+13.895 -3.19 14.184 -3.072 14.42 -2.837 c
+14.832 -3.469 l
+14.703 -3.645 14.516 -3.789 14.273 -3.896 c
+14.026 -4.002 13.762 -4.057 13.479 -4.057 c
+12.833 -1.617 m
+13.861 -1.617 l
+13.861 -1.515 l
+13.861 -1.279 13.82 -1.103 13.743 -0.985 c
+13.674 -0.86 13.546 -0.794 13.361 -0.794 c
+13.185 -0.794 13.053 -0.864 12.964 -1 c
+12.883 -1.129 12.84 -1.334 12.833 -1.617 c
+f
+Q
+q 1 0 0 1 404.8857 418.2697 cm
+0 0 m
+0 3.454 l
+-0.529 3.454 l
+-0.529 3.984 l
+0 3.984 l
+0 4.439 l
+0 4.84 0.096 5.152 0.294 5.38 c
+0.5 5.604 0.779 5.718 1.132 5.718 c
+1.268 5.718 1.4 5.696 1.529 5.66 c
+1.5 5.116 l
+1.4 5.134 1.301 5.145 1.205 5.145 c
+0.831 5.145 0.647 4.881 0.647 4.351 c
+0.647 3.984 l
+1.323 3.984 l
+1.323 3.454 l
+0.647 3.454 l
+0.647 0 l
+h
+1.955 2.176 m
+1.955 2.753 2.091 3.208 2.367 3.543 c
+2.65 3.884 3.021 4.057 3.484 4.057 c
+3.944 4.057 4.31 3.888 4.586 3.558 c
+4.869 3.234 5.016 2.786 5.027 2.22 c
+5.027 1.794 l
+5.027 1.224 4.884 0.769 4.601 0.426 c
+4.326 0.092 3.958 -0.073 3.499 -0.073 c
+3.036 -0.073 2.664 0.088 2.381 0.412 c
+2.105 0.742 1.962 1.183 1.955 1.735 c
+h
+2.602 1.794 m
+2.602 1.389 2.679 1.073 2.837 0.838 c
+3.003 0.603 3.223 0.485 3.499 0.485 c
+4.065 0.485 4.358 0.897 4.38 1.72 c
+4.38 2.176 l
+4.38 2.577 4.296 2.896 4.131 3.131 c
+3.973 3.373 3.755 3.499 3.484 3.499 c
+3.219 3.499 3.003 3.373 2.837 3.131 c
+2.679 2.896 2.602 2.577 2.602 2.176 c
+h
+7.512 3.366 m
+7.423 3.385 7.324 3.396 7.217 3.396 c
+6.883 3.396 6.648 3.212 6.512 2.852 c
+6.512 0 l
+5.865 0 l
+5.865 3.984 l
+6.497 3.984 l
+6.512 3.572 l
+6.689 3.896 6.93 4.057 7.247 4.057 c
+7.354 4.057 7.441 4.035 7.512 3.998 c
+h
+11.26 0.485 m
+11.473 0.485 11.645 0.548 11.774 0.676 c
+11.91 0.813 11.983 1.004 11.994 1.249 c
+12.612 1.249 l
+12.59 0.867 12.454 0.548 12.2 0.294 c
+11.944 0.048 11.631 -0.073 11.26 -0.073 c
+10.768 -0.073 10.392 0.077 10.128 0.383 c
+9.87 0.695 9.746 1.162 9.746 1.779 c
+9.746 2.22 l
+9.746 2.815 9.87 3.271 10.128 3.587 c
+10.392 3.899 10.768 4.057 11.26 4.057 c
+11.66 4.057 11.98 3.925 12.215 3.66 c
+12.457 3.403 12.59 3.057 12.612 2.617 c
+11.994 2.617 l
+11.973 2.911 11.899 3.131 11.774 3.279 c
+11.657 3.425 11.484 3.499 11.26 3.499 c
+10.965 3.499 10.749 3.4 10.612 3.205 c
+10.473 3.017 10.4 2.708 10.392 2.279 c
+10.392 1.764 l
+10.392 1.294 10.458 0.96 10.598 0.765 c
+10.745 0.578 10.965 0.485 11.26 0.485 c
+15.39 0.353 m
+15.173 0.067 14.861 -0.073 14.45 -0.073 c
+14.086 -0.073 13.81 0.048 13.627 0.294 c
+13.45 0.548 13.355 0.912 13.347 1.382 c
+13.347 3.984 l
+13.993 3.984 l
+13.993 1.441 l
+13.993 0.813 14.178 0.5 14.552 0.5 c
+14.953 0.5 15.229 0.676 15.375 1.029 c
+15.375 3.984 l
+16.022 3.984 l
+16.022 0 l
+15.405 0 l
+h
+18.653 3.366 m
+18.565 3.385 18.466 3.396 18.359 3.396 c
+18.025 3.396 17.789 3.212 17.654 2.852 c
+17.654 0 l
+17.007 0 l
+17.007 3.984 l
+17.639 3.984 l
+17.654 3.572 l
+17.83 3.896 18.073 4.057 18.389 4.057 c
+18.495 4.057 18.583 4.035 18.653 3.998 c
+h
+20.947 3.366 m
+20.858 3.385 20.759 3.396 20.652 3.396 c
+20.318 3.396 20.083 3.212 19.947 2.852 c
+19.947 0 l
+19.3 0 l
+19.3 3.984 l
+19.932 3.984 l
+19.947 3.572 l
+20.123 3.896 20.366 4.057 20.682 4.057 c
+20.788 4.057 20.877 4.035 20.947 3.998 c
+h
+22.946 -0.073 m
+22.446 -0.073 22.063 0.073 21.799 0.368 c
+21.534 0.661 21.402 1.095 21.402 1.676 c
+21.402 2.147 l
+21.402 2.741 21.527 3.208 21.784 3.543 c
+22.049 3.884 22.409 4.057 22.872 4.057 c
+23.331 4.057 23.673 3.903 23.9 3.601 c
+24.136 3.308 24.257 2.845 24.268 2.22 c
+24.268 1.794 l
+22.049 1.794 l
+22.049 1.706 l
+22.049 1.272 22.126 0.96 22.284 0.765 c
+22.45 0.578 22.681 0.485 22.975 0.485 c
+23.169 0.485 23.343 0.518 23.489 0.588 c
+23.636 0.665 23.772 0.783 23.9 0.941 c
+24.239 0.53 l
+23.952 0.125 23.522 -0.073 22.946 -0.073 c
+22.872 3.499 m
+22.597 3.499 22.394 3.403 22.269 3.219 c
+22.14 3.032 22.067 2.741 22.049 2.352 c
+23.622 2.352 l
+23.622 2.44 l
+23.599 2.822 23.534 3.09 23.416 3.248 c
+23.298 3.414 23.115 3.499 22.872 3.499 c
+25.664 3.984 m
+25.679 3.543 l
+25.933 3.884 26.256 4.057 26.649 4.057 c
+27.355 4.057 27.711 3.587 27.723 2.646 c
+27.723 0 l
+27.075 0 l
+27.075 2.617 l
+27.075 2.929 27.021 3.15 26.915 3.279 c
+26.804 3.403 26.649 3.469 26.444 3.469 c
+26.286 3.469 26.138 3.414 26.003 3.308 c
+25.874 3.198 25.772 3.061 25.694 2.896 c
+25.694 0 l
+25.047 0 l
+25.047 3.984 l
+h
+29.545 4.939 m
+29.545 3.984 l
+30.148 3.984 l
+30.148 3.454 l
+29.545 3.454 l
+29.545 0.985 l
+29.545 0.827 29.567 0.709 29.619 0.632 c
+29.677 0.551 29.766 0.515 29.884 0.515 c
+29.972 0.515 30.059 0.53 30.148 0.559 c
+30.148 0 l
+30.001 -0.047 29.847 -0.073 29.693 -0.073 c
+29.435 -0.073 29.24 0.019 29.105 0.206 c
+28.964 0.389 28.899 0.651 28.899 0.985 c
+28.899 3.454 l
+28.296 3.454 l
+28.296 3.984 l
+28.899 3.984 l
+28.899 4.939 l
+h
+34.013 0.485 m
+34.227 0.485 34.4 0.548 34.528 0.676 c
+34.664 0.813 34.738 1.004 34.749 1.249 c
+35.366 1.249 l
+35.345 0.867 35.208 0.548 34.954 0.294 c
+34.697 0.048 34.385 -0.073 34.013 -0.073 c
+33.521 -0.073 33.147 0.077 32.882 0.383 c
+32.625 0.695 32.5 1.162 32.5 1.779 c
+32.5 2.22 l
+32.5 2.815 32.625 3.271 32.882 3.587 c
+33.147 3.899 33.521 4.057 34.013 4.057 c
+34.414 4.057 34.734 3.925 34.969 3.66 c
+35.212 3.403 35.345 3.057 35.366 2.617 c
+34.749 2.617 l
+34.726 2.911 34.653 3.131 34.528 3.279 c
+34.41 3.425 34.238 3.499 34.013 3.499 c
+33.72 3.499 33.503 3.4 33.367 3.205 c
+33.228 3.017 33.154 2.708 33.147 2.279 c
+33.147 1.764 l
+33.147 1.294 33.213 0.96 33.352 0.765 c
+33.5 0.578 33.72 0.485 34.013 0.485 c
+35.983 2.176 m
+35.983 2.753 36.12 3.208 36.395 3.543 c
+36.678 3.884 37.049 4.057 37.512 4.057 c
+37.972 4.057 38.339 3.888 38.615 3.558 c
+38.898 3.234 39.044 2.786 39.056 2.22 c
+39.056 1.794 l
+39.056 1.224 38.913 0.769 38.63 0.426 c
+38.354 0.092 37.986 -0.073 37.527 -0.073 c
+37.064 -0.073 36.693 0.088 36.409 0.412 c
+36.134 0.742 35.991 1.183 35.983 1.735 c
+h
+36.63 1.794 m
+36.63 1.389 36.708 1.073 36.866 0.838 c
+37.031 0.603 37.251 0.485 37.527 0.485 c
+38.092 0.485 38.387 0.897 38.409 1.72 c
+38.409 2.176 l
+38.409 2.577 38.324 2.896 38.159 3.131 c
+38.001 3.373 37.784 3.499 37.512 3.499 c
+37.248 3.499 37.031 3.373 36.866 3.131 c
+36.708 2.896 36.63 2.577 36.63 2.176 c
+h
+40.511 3.984 m
+40.525 3.616 l
+40.768 3.911 41.088 4.057 41.481 4.057 c
+41.922 4.057 42.231 3.859 42.407 3.469 c
+42.661 3.859 43.01 4.057 43.451 4.057 c
+44.186 4.057 44.56 3.595 44.583 2.675 c
+44.583 0 l
+43.935 0 l
+43.935 2.617 l
+43.935 2.911 43.881 3.124 43.774 3.263 c
+43.675 3.4 43.502 3.469 43.26 3.469 c
+43.061 3.469 42.9 3.389 42.774 3.234 c
+42.657 3.088 42.587 2.896 42.568 2.66 c
+42.568 0 l
+41.907 0 l
+41.907 2.646 l
+41.907 3.194 41.687 3.469 41.246 3.469 c
+40.911 3.469 40.676 3.308 40.54 2.984 c
+40.54 0 l
+39.893 0 l
+39.893 3.984 l
+h
+46.17 3.984 m
+46.185 3.616 l
+46.427 3.911 46.747 4.057 47.14 4.057 c
+47.581 4.057 47.889 3.859 48.066 3.469 c
+48.32 3.859 48.669 4.057 49.109 4.057 c
+49.845 4.057 50.219 3.595 50.241 2.675 c
+50.241 0 l
+49.595 0 l
+49.595 2.617 l
+49.595 2.911 49.539 3.124 49.433 3.263 c
+49.334 3.4 49.161 3.469 48.918 3.469 c
+48.72 3.469 48.558 3.389 48.434 3.234 c
+48.316 3.088 48.246 2.896 48.228 2.66 c
+48.228 0 l
+47.567 0 l
+47.567 2.646 l
+47.567 3.194 47.346 3.469 46.905 3.469 c
+46.57 3.469 46.335 3.308 46.2 2.984 c
+46.2 0 l
+45.552 0 l
+45.552 3.984 l
+h
+51.918 0 -0.647 3.984 re
+51.962 5.027 m
+51.962 4.917 51.932 4.825 51.873 4.748 c
+51.814 4.678 51.719 4.645 51.594 4.645 c
+51.476 4.645 51.38 4.678 51.315 4.748 c
+51.256 4.825 51.226 4.917 51.226 5.027 c
+51.226 5.145 51.256 5.237 51.315 5.307 c
+51.38 5.384 51.476 5.424 51.594 5.424 c
+51.719 5.424 51.814 5.384 51.873 5.307 c
+51.932 5.226 51.962 5.134 51.962 5.027 c
+53.784 4.939 m
+53.784 3.984 l
+54.387 3.984 l
+54.387 3.454 l
+53.784 3.454 l
+53.784 0.985 l
+53.784 0.827 53.807 0.709 53.857 0.632 c
+53.917 0.551 54.004 0.515 54.122 0.515 c
+54.21 0.515 54.299 0.53 54.387 0.559 c
+54.387 0 l
+54.239 -0.047 54.085 -0.073 53.931 -0.073 c
+53.674 -0.073 53.479 0.019 53.343 0.206 c
+53.203 0.389 53.138 0.651 53.138 0.985 c
+53.138 3.454 l
+52.535 3.454 l
+52.535 3.984 l
+53.138 3.984 l
+53.138 4.939 l
+h
+55.195 0.353 m
+55.195 0.47 55.228 0.566 55.298 0.647 c
+55.364 0.724 55.467 0.765 55.607 0.765 c
+55.754 0.765 55.86 0.724 55.93 0.647 c
+56.007 0.566 56.047 0.47 56.047 0.353 c
+56.047 0.243 56.007 0.151 55.93 0.073 c
+55.86 -0.004 55.754 -0.044 55.607 -0.044 c
+55.467 -0.044 55.364 -0.004 55.298 0.073 c
+55.228 0.151 55.195 0.243 55.195 0.353 c
+61.443 1.397 m
+59.634 1.397 l
+59.222 0 l
+58.532 0 l
+60.252 5.351 l
+60.824 5.351 l
+62.559 0 l
+61.869 0 l
+h
+59.81 1.985 m
+61.266 1.985 l
+60.546 4.41 l
+h
+63.059 2.176 m
+63.059 2.782 63.17 3.248 63.397 3.572 c
+63.633 3.896 63.959 4.057 64.382 4.057 c
+64.764 4.057 65.062 3.899 65.279 3.587 c
+65.279 5.644 l
+65.925 5.644 l
+65.925 0 l
+65.337 0 l
+65.293 0.426 l
+65.088 0.092 64.783 -0.073 64.382 -0.073 c
+63.97 -0.073 63.647 0.081 63.411 0.397 c
+63.176 0.721 63.059 1.176 63.059 1.764 c
+h
+63.706 1.794 m
+63.706 1.353 63.768 1.022 63.897 0.809 c
+64.033 0.603 64.253 0.5 64.558 0.5 c
+64.882 0.5 65.121 0.661 65.279 0.985 c
+65.279 2.999 l
+65.109 3.311 64.871 3.469 64.558 3.469 c
+64.253 3.469 64.033 3.366 63.897 3.161 c
+63.768 2.955 63.706 2.631 63.706 2.19 c
+h
+66.792 2.176 m
+66.792 2.782 66.903 3.248 67.131 3.572 c
+67.366 3.896 67.693 4.057 68.115 4.057 c
+68.498 4.057 68.795 3.899 69.013 3.587 c
+69.013 5.644 l
+69.659 5.644 l
+69.659 0 l
+69.071 0 l
+69.027 0.426 l
+68.821 0.092 68.516 -0.073 68.115 -0.073 c
+67.704 -0.073 67.38 0.081 67.145 0.397 c
+66.91 0.721 66.792 1.176 66.792 1.764 c
+h
+67.44 1.794 m
+67.44 1.353 67.502 1.022 67.631 0.809 c
+67.766 0.603 67.987 0.5 68.292 0.5 c
+68.616 0.5 68.855 0.661 69.013 0.985 c
+69.013 2.999 l
+68.843 3.311 68.604 3.469 68.292 3.469 c
+67.987 3.469 67.766 3.366 67.631 3.161 c
+67.502 2.955 67.44 2.631 67.44 2.19 c
+h
+f
+Q
+q 1 0 0 1 478.602 419.0637 cm
+0 0 m
+0.294 0 0.444 0.195 0.455 0.588 c
+1.425 0.588 l
+1.425 0.154 1.294 -0.198 1.028 -0.47 c
+0.764 -0.735 0.426 -0.867 0.014 -0.867 c
+-0.497 -0.867 -0.89 -0.713 -1.162 -0.397 c
+-1.426 -0.073 -1.565 0.397 -1.573 1.014 c
+-1.573 1.338 l
+-1.573 1.962 -1.441 2.44 -1.176 2.764 c
+-0.904 3.094 -0.507 3.263 0.014 3.263 c
+0.444 3.263 0.786 3.123 1.043 2.851 c
+1.296 2.576 1.425 2.194 1.425 1.706 c
+0.455 1.706 l
+0.455 1.918 0.415 2.087 0.338 2.205 c
+0.268 2.33 0.151 2.396 -0.015 2.396 c
+-0.192 2.396 -0.32 2.33 -0.397 2.205 c
+-0.478 2.076 -0.522 1.826 -0.53 1.455 c
+-0.53 1.043 l
+-0.53 0.721 -0.515 0.492 -0.485 0.368 c
+-0.449 0.239 -0.393 0.147 -0.324 0.088 c
+-0.246 0.029 -0.14 0 0 0 c
+1.911 1.323 m
+1.911 1.929 2.05 2.404 2.337 2.749 c
+2.62 3.09 3.013 3.263 3.513 3.263 c
+4.02 3.263 4.417 3.09 4.704 2.749 c
+4.986 2.404 5.13 1.929 5.13 1.323 c
+5.13 1.058 l
+5.13 0.459 4.986 -0.011 4.704 -0.353 c
+4.417 -0.698 4.02 -0.867 3.513 -0.867 c
+3.002 -0.867 2.605 -0.698 2.322 -0.353 c
+2.046 -0.011 1.911 0.463 1.911 1.073 c
+h
+2.954 1.058 m
+2.954 0.353 3.138 0 3.513 0 c
+3.866 0 4.056 0.294 4.086 0.882 c
+4.086 1.323 l
+4.086 1.683 4.035 1.955 3.939 2.132 c
+3.84 2.308 3.696 2.396 3.513 2.396 c
+3.336 2.396 3.197 2.308 3.101 2.132 c
+3.002 1.955 2.954 1.683 2.954 1.323 c
+h
+6.746 3.19 m
+6.776 2.822 l
+7.011 3.117 7.32 3.263 7.702 3.263 c
+8.103 3.263 8.382 3.079 8.54 2.72 c
+8.775 3.079 9.102 3.263 9.525 3.263 c
+10.219 3.263 10.572 2.778 10.583 1.808 c
+10.583 -0.794 l
+9.554 -0.794 l
+9.554 1.749 l
+9.554 1.974 9.517 2.135 9.451 2.234 c
+9.392 2.33 9.282 2.381 9.128 2.381 c
+8.93 2.381 8.789 2.263 8.702 2.028 c
+8.702 -0.794 l
+7.658 -0.794 l
+7.658 1.735 l
+7.658 1.97 7.628 2.135 7.569 2.234 c
+7.511 2.33 7.401 2.381 7.247 2.381 c
+7.07 2.381 6.927 2.286 6.82 2.102 c
+6.82 -0.794 l
+5.776 -0.794 l
+5.776 3.19 l
+h
+12.332 3.19 m
+12.361 2.822 l
+12.596 3.117 12.905 3.263 13.288 3.263 c
+13.688 3.263 13.967 3.079 14.125 2.72 c
+14.36 3.079 14.688 3.263 15.11 3.263 c
+15.804 3.263 16.157 2.778 16.168 1.808 c
+16.168 -0.794 l
+15.139 -0.794 l
+15.139 1.749 l
+15.139 1.974 15.103 2.135 15.037 2.234 c
+14.978 2.33 14.867 2.381 14.713 2.381 c
+14.515 2.381 14.375 2.263 14.287 2.028 c
+14.287 -0.794 l
+13.244 -0.794 l
+13.244 1.735 l
+13.244 1.97 13.214 2.135 13.155 2.234 c
+13.096 2.33 12.986 2.381 12.832 2.381 c
+12.656 2.381 12.512 2.286 12.406 2.102 c
+12.406 -0.794 l
+11.362 -0.794 l
+11.362 3.19 l
+h
+18.035 -0.794 -1.043 3.984 re
+16.947 4.218 m
+16.947 4.373 16.995 4.501 17.094 4.601 c
+17.201 4.707 17.337 4.763 17.506 4.763 c
+17.682 4.763 17.819 4.707 17.917 4.601 c
+18.025 4.501 18.079 4.373 18.079 4.218 c
+18.079 4.05 18.025 3.913 17.917 3.807 c
+17.819 3.707 17.682 3.66 17.506 3.66 c
+17.337 3.66 17.201 3.707 17.094 3.807 c
+16.995 3.913 16.947 4.05 16.947 4.218 c
+20.049 4.16 m
+20.049 3.19 l
+20.579 3.19 l
+20.579 2.396 l
+20.049 2.396 l
+20.049 0.426 l
+20.049 0.268 20.068 0.162 20.108 0.103 c
+20.155 0.044 20.24 0.015 20.358 0.015 c
+20.465 0.015 20.549 0.022 20.608 0.044 c
+20.608 -0.764 l
+20.431 -0.831 20.24 -0.867 20.034 -0.867 c
+19.359 -0.867 19.013 -0.482 19.006 0.294 c
+19.006 2.396 l
+18.549 2.396 l
+18.549 3.19 l
+19.006 3.19 l
+19.006 4.16 l
+h
+24.65 0.279 m
+24.65 0.368 24.606 0.445 24.518 0.515 c
+24.429 0.592 24.242 0.694 23.959 0.823 c
+23.525 1 23.228 1.18 23.062 1.367 c
+22.904 1.55 22.827 1.783 22.827 2.058 c
+22.827 2.4 22.948 2.683 23.195 2.911 c
+23.448 3.146 23.787 3.263 24.209 3.263 c
+24.639 3.263 24.988 3.15 25.252 2.925 c
+25.518 2.697 25.649 2.396 25.649 2.014 c
+24.606 2.014 l
+24.606 2.337 24.466 2.499 24.194 2.499 c
+24.084 2.499 23.995 2.462 23.93 2.396 c
+23.86 2.326 23.827 2.227 23.827 2.102 c
+23.827 2.014 23.864 1.933 23.945 1.866 c
+24.022 1.808 24.201 1.712 24.488 1.588 c
+24.918 1.43 25.216 1.253 25.385 1.058 c
+25.561 0.871 25.649 0.621 25.649 0.309 c
+25.649 -0.044 25.518 -0.331 25.252 -0.544 c
+24.988 -0.761 24.639 -0.867 24.209 -0.867 c
+23.915 -0.867 23.654 -0.812 23.43 -0.706 c
+23.202 -0.588 23.026 -0.426 22.9 -0.22 c
+22.783 -0.015 22.725 0.206 22.725 0.441 c
+23.71 0.441 l
+23.71 0.254 23.746 0.118 23.827 0.029 c
+23.915 -0.058 24.047 -0.103 24.224 -0.103 c
+24.506 -0.103 24.65 0.022 24.65 0.279 c
+27.325 2.837 m
+27.55 3.119 27.825 3.263 28.148 3.263 c
+28.508 3.263 28.784 3.135 28.971 2.881 c
+29.167 2.624 29.266 2.242 29.266 1.735 c
+29.266 -0.794 l
+28.222 -0.794 l
+28.222 1.72 l
+28.222 1.955 28.182 2.12 28.105 2.219 c
+28.034 2.326 27.92 2.381 27.766 2.381 c
+27.579 2.381 27.432 2.296 27.325 2.132 c
+27.325 -0.794 l
+26.281 -0.794 l
+26.281 4.85 l
+27.325 4.85 l
+h
+31.897 -0.794 m
+31.868 -0.735 31.837 -0.632 31.808 -0.485 c
+31.621 -0.742 31.371 -0.867 31.059 -0.867 c
+30.725 -0.867 30.445 -0.761 30.221 -0.544 c
+30.004 -0.32 29.898 -0.029 29.898 0.324 c
+29.898 0.735 30.029 1.051 30.295 1.278 c
+30.559 1.514 30.941 1.631 31.44 1.631 c
+31.764 1.631 l
+31.764 1.955 l
+31.764 2.132 31.727 2.253 31.662 2.323 c
+31.602 2.4 31.515 2.44 31.397 2.44 c
+31.139 2.44 31.014 2.286 31.014 1.984 c
+29.971 1.984 l
+29.971 2.356 30.107 2.66 30.382 2.896 c
+30.655 3.138 31.004 3.263 31.426 3.263 c
+31.868 3.263 32.205 3.146 32.44 2.911 c
+32.683 2.683 32.808 2.359 32.808 1.941 c
+32.808 0.073 l
+32.808 -0.272 32.855 -0.54 32.955 -0.735 c
+32.955 -0.794 l
+h
+31.294 -0.044 m
+31.4 -0.044 31.492 -0.025 31.573 0.015 c
+31.662 0.062 31.724 0.121 31.764 0.191 c
+31.764 1.014 l
+31.515 1.014 l
+31.338 1.014 31.195 0.956 31.088 0.838 c
+30.989 0.727 30.941 0.58 30.941 0.397 c
+30.941 0.103 31.059 -0.044 31.294 -0.044 c
+f
+Q
+q 1 0 0 1 514.8346 423.2085 cm
+0 0 m
+0 -0.955 l
+0.603 -0.955 l
+0.603 -1.484 l
+0 -1.484 l
+0 -3.954 l
+0 -4.112 0.023 -4.23 0.073 -4.307 c
+0.133 -4.388 0.221 -4.424 0.339 -4.424 c
+0.426 -4.424 0.515 -4.409 0.603 -4.38 c
+0.603 -4.939 l
+0.456 -4.986 0.302 -5.012 0.147 -5.012 c
+-0.11 -5.012 -0.305 -4.92 -0.441 -4.733 c
+-0.58 -4.549 -0.646 -4.288 -0.646 -3.954 c
+-0.646 -1.484 l
+-1.249 -1.484 l
+-1.249 -0.955 l
+-0.646 -0.955 l
+-0.646 0 l
+h
+1.162 -2.763 m
+1.162 -2.186 1.297 -1.731 1.573 -1.396 c
+1.856 -1.055 2.227 -0.881 2.691 -0.881 c
+3.15 -0.881 3.517 -1.051 3.792 -1.381 c
+4.075 -1.705 4.223 -2.153 4.233 -2.719 c
+4.233 -3.145 l
+4.233 -3.715 4.09 -4.17 3.807 -4.513 c
+3.532 -4.847 3.164 -5.012 2.705 -5.012 c
+2.242 -5.012 1.871 -4.85 1.588 -4.527 c
+1.312 -4.197 1.168 -3.755 1.162 -3.204 c
+h
+1.808 -3.145 m
+1.808 -3.549 1.885 -3.865 2.043 -4.101 c
+2.209 -4.336 2.429 -4.453 2.705 -4.453 c
+3.271 -4.453 3.564 -4.042 3.587 -3.219 c
+3.587 -2.763 l
+3.587 -2.362 3.502 -2.043 3.337 -1.808 c
+3.179 -1.565 2.962 -1.44 2.691 -1.44 c
+2.425 -1.44 2.209 -1.565 2.043 -1.808 c
+1.885 -2.043 1.808 -2.362 1.808 -2.763 c
+h
+f
+Q
+q 1 0 0 1 388.0258 413.8011 cm
+0 0 m
+0 -0.955 l
+0.603 -0.955 l
+0.603 -1.484 l
+0 -1.484 l
+0 -3.954 l
+0 -4.112 0.023 -4.23 0.073 -4.307 c
+0.133 -4.388 0.221 -4.424 0.339 -4.424 c
+0.426 -4.424 0.515 -4.409 0.603 -4.38 c
+0.603 -4.939 l
+0.456 -4.986 0.302 -5.012 0.148 -5.012 c
+-0.11 -5.012 -0.305 -4.92 -0.44 -4.733 c
+-0.58 -4.549 -0.646 -4.288 -0.646 -3.954 c
+-0.646 -1.484 l
+-1.249 -1.484 l
+-1.249 -0.955 l
+-0.646 -0.955 l
+-0.646 0 l
+h
+3.41 -4.939 m
+3.37 -4.85 3.344 -4.704 3.337 -4.498 c
+3.102 -4.843 2.808 -5.012 2.455 -5.012 c
+2.091 -5.012 1.808 -4.916 1.602 -4.718 c
+1.405 -4.513 1.309 -4.226 1.309 -3.85 c
+1.309 -3.451 1.445 -3.131 1.72 -2.896 c
+1.992 -2.653 2.367 -2.528 2.837 -2.528 c
+3.323 -2.528 l
+3.323 -2.102 l
+3.323 -1.866 3.267 -1.701 3.161 -1.602 c
+3.051 -1.496 2.889 -1.44 2.675 -1.44 c
+2.477 -1.44 2.315 -1.499 2.19 -1.616 c
+2.072 -1.734 2.014 -1.882 2.014 -2.057 c
+1.367 -2.057 l
+1.367 -1.863 1.426 -1.672 1.544 -1.484 c
+1.669 -1.301 1.831 -1.153 2.029 -1.043 c
+2.234 -0.937 2.463 -0.881 2.72 -0.881 c
+3.12 -0.881 3.425 -0.985 3.631 -1.19 c
+3.844 -1.396 3.958 -1.691 3.969 -2.072 c
+3.969 -4.086 l
+3.969 -4.391 4.006 -4.656 4.087 -4.88 c
+4.087 -4.939 l
+h
+2.543 -4.424 m
+2.708 -4.424 2.859 -4.38 2.999 -4.292 c
+3.146 -4.203 3.252 -4.093 3.323 -3.954 c
+3.323 -3.013 l
+2.955 -3.013 l
+2.639 -3.013 2.396 -3.083 2.22 -3.219 c
+2.043 -3.347 1.955 -3.535 1.955 -3.777 c
+1.955 -4.006 1.999 -4.17 2.087 -4.278 c
+2.176 -4.376 2.326 -4.424 2.543 -4.424 c
+4.836 -2.763 m
+4.836 -2.146 4.946 -1.683 5.174 -1.367 c
+5.399 -1.043 5.733 -0.881 6.174 -0.881 c
+6.575 -0.881 6.88 -1.058 7.086 -1.411 c
+7.129 -0.955 l
+7.717 -0.955 l
+7.717 -4.983 l
+7.717 -5.471 7.589 -5.85 7.335 -6.115 c
+7.078 -6.379 6.725 -6.512 6.277 -6.512 c
+6.078 -6.512 5.858 -6.46 5.615 -6.364 c
+5.369 -6.265 5.189 -6.144 5.072 -5.997 c
+5.336 -5.556 l
+5.6 -5.82 5.898 -5.953 6.232 -5.953 c
+6.77 -5.953 7.045 -5.659 7.056 -5.071 c
+7.056 -4.542 l
+6.85 -4.858 6.548 -5.012 6.159 -5.012 c
+5.748 -5.012 5.424 -4.862 5.189 -4.556 c
+4.961 -4.244 4.844 -3.792 4.836 -3.204 c
+h
+5.498 -3.145 m
+5.498 -3.586 5.56 -3.917 5.689 -4.13 c
+5.814 -4.336 6.03 -4.438 6.336 -4.438 c
+6.659 -4.438 6.897 -4.274 7.056 -3.939 c
+7.056 -1.955 l
+6.887 -1.631 6.648 -1.469 6.336 -1.469 c
+6.041 -1.469 5.825 -1.573 5.689 -1.778 c
+5.56 -1.984 5.498 -2.308 5.498 -2.749 c
+h
+12.436 -4.939 m
+12.395 -4.85 12.37 -4.704 12.362 -4.498 c
+12.127 -4.843 11.833 -5.012 11.48 -5.012 c
+11.117 -5.012 10.834 -4.916 10.628 -4.718 c
+10.429 -4.513 10.334 -4.226 10.334 -3.85 c
+10.334 -3.451 10.469 -3.131 10.745 -2.896 c
+11.017 -2.653 11.392 -2.528 11.863 -2.528 c
+12.347 -2.528 l
+12.347 -2.102 l
+12.347 -1.866 12.293 -1.701 12.185 -1.602 c
+12.075 -1.496 11.914 -1.44 11.701 -1.44 c
+11.502 -1.44 11.341 -1.499 11.215 -1.616 c
+11.098 -1.734 11.04 -1.882 11.04 -2.057 c
+10.392 -2.057 l
+10.392 -1.863 10.452 -1.672 10.569 -1.484 c
+10.694 -1.301 10.855 -1.153 11.054 -1.043 c
+11.26 -0.937 11.487 -0.881 11.745 -0.881 c
+12.145 -0.881 12.451 -0.985 12.656 -1.19 c
+12.869 -1.396 12.983 -1.691 12.994 -2.072 c
+12.994 -4.086 l
+12.994 -4.391 13.031 -4.656 13.112 -4.88 c
+13.112 -4.939 l
+h
+11.568 -4.424 m
+11.734 -4.424 11.884 -4.38 12.025 -4.292 c
+12.171 -4.203 12.278 -4.093 12.347 -3.954 c
+12.347 -3.013 l
+11.98 -3.013 l
+11.664 -3.013 11.422 -3.083 11.245 -3.219 c
+11.069 -3.347 10.98 -3.535 10.98 -3.777 c
+10.98 -4.006 11.025 -4.17 11.113 -4.278 c
+11.201 -4.376 11.352 -4.424 11.568 -4.424 c
+17.654 -3.925 m
+17.654 -3.777 17.598 -3.656 17.492 -3.557 c
+17.382 -3.461 17.176 -3.343 16.875 -3.204 c
+16.53 -3.057 16.287 -2.936 16.14 -2.836 c
+15.993 -2.73 15.883 -2.612 15.817 -2.484 c
+15.747 -2.359 15.713 -2.201 15.713 -2.013 c
+15.713 -1.691 15.831 -1.421 16.066 -1.205 c
+16.301 -0.992 16.603 -0.881 16.978 -0.881 c
+17.359 -0.881 17.669 -0.995 17.904 -1.22 c
+18.139 -1.448 18.257 -1.734 18.257 -2.087 c
+17.61 -2.087 l
+17.61 -1.911 17.551 -1.76 17.434 -1.631 c
+17.316 -1.506 17.162 -1.44 16.978 -1.44 c
+16.779 -1.44 16.629 -1.496 16.522 -1.602 c
+16.412 -1.701 16.36 -1.833 16.36 -1.999 c
+16.36 -2.127 16.397 -2.234 16.478 -2.322 c
+16.555 -2.403 16.746 -2.506 17.051 -2.631 c
+17.529 -2.818 17.86 -3.006 18.036 -3.189 c
+18.213 -3.366 18.3 -3.594 18.3 -3.865 c
+18.3 -4.218 18.176 -4.498 17.933 -4.704 c
+17.698 -4.909 17.382 -5.012 16.993 -5.012 c
+16.57 -5.012 16.232 -4.895 15.978 -4.659 c
+15.721 -4.417 15.596 -4.112 15.596 -3.748 c
+16.243 -3.748 l
+16.25 -3.976 16.32 -4.152 16.449 -4.278 c
+16.574 -4.395 16.757 -4.453 16.993 -4.453 c
+17.205 -4.453 17.367 -4.405 17.477 -4.307 c
+17.595 -4.211 17.654 -4.083 17.654 -3.925 c
+22.02 -3.145 m
+22.02 -3.773 21.902 -4.244 21.667 -4.556 c
+21.439 -4.862 21.122 -5.012 20.711 -5.012 c
+20.307 -5.012 19.998 -4.862 19.786 -4.556 c
+19.786 -6.468 l
+19.138 -6.468 l
+19.138 -0.955 l
+19.726 -0.955 l
+19.771 -1.396 l
+19.984 -1.055 20.293 -0.881 20.696 -0.881 c
+21.137 -0.881 21.465 -1.036 21.681 -1.338 c
+21.895 -1.643 22.009 -2.098 22.02 -2.705 c
+h
+21.373 -2.763 m
+21.373 -2.322 21.303 -1.999 21.167 -1.793 c
+21.027 -1.579 20.807 -1.469 20.505 -1.469 c
+20.189 -1.469 19.95 -1.624 19.786 -1.926 c
+19.786 -3.998 l
+19.95 -4.303 20.189 -4.453 20.505 -4.453 c
+20.8 -4.453 21.012 -4.351 21.152 -4.145 c
+21.288 -3.931 21.361 -3.601 21.373 -3.16 c
+h
+24.283 -5.012 m
+23.784 -5.012 23.401 -4.866 23.137 -4.571 c
+22.872 -4.278 22.74 -3.844 22.74 -3.262 c
+22.74 -2.792 l
+22.74 -2.198 22.865 -1.731 23.121 -1.396 c
+23.387 -1.055 23.747 -0.881 24.21 -0.881 c
+24.669 -0.881 25.01 -1.036 25.238 -1.338 c
+25.473 -1.631 25.595 -2.094 25.606 -2.719 c
+25.606 -3.145 l
+23.387 -3.145 l
+23.387 -3.233 l
+23.387 -3.667 23.464 -3.979 23.622 -4.174 c
+23.788 -4.361 24.019 -4.453 24.312 -4.453 c
+24.507 -4.453 24.68 -4.421 24.827 -4.351 c
+24.974 -4.274 25.11 -4.156 25.238 -3.998 c
+25.577 -4.409 l
+25.29 -4.814 24.86 -5.012 24.283 -5.012 c
+24.21 -1.44 m
+23.934 -1.44 23.732 -1.536 23.607 -1.72 c
+23.478 -1.907 23.405 -2.198 23.387 -2.587 c
+24.96 -2.587 l
+24.96 -2.499 l
+24.937 -2.117 24.871 -1.849 24.754 -1.691 c
+24.636 -1.525 24.453 -1.44 24.21 -1.44 c
+27.767 -4.453 m
+27.98 -4.453 28.153 -4.391 28.281 -4.262 c
+28.417 -4.126 28.491 -3.935 28.502 -3.69 c
+29.119 -3.69 l
+29.097 -4.072 28.962 -4.391 28.708 -4.644 c
+28.451 -4.891 28.138 -5.012 27.767 -5.012 c
+27.275 -5.012 26.899 -4.862 26.635 -4.556 c
+26.377 -4.244 26.253 -3.777 26.253 -3.16 c
+26.253 -2.719 l
+26.253 -2.124 26.377 -1.668 26.635 -1.352 c
+26.899 -1.04 27.275 -0.881 27.767 -0.881 c
+28.168 -0.881 28.487 -1.014 28.723 -1.278 c
+28.964 -1.536 29.097 -1.882 29.119 -2.322 c
+28.502 -2.322 l
+28.48 -2.028 28.407 -1.808 28.281 -1.66 c
+28.164 -1.514 27.991 -1.44 27.767 -1.44 c
+27.472 -1.44 27.256 -1.539 27.12 -1.734 c
+26.98 -1.922 26.907 -2.23 26.899 -2.66 c
+26.899 -3.175 l
+26.899 -3.645 26.965 -3.979 27.105 -4.174 c
+27.252 -4.361 27.472 -4.453 27.767 -4.453 c
+30.574 -4.939 -0.646 3.984 re
+30.618 0.088 m
+30.618 -0.022 30.589 -0.114 30.53 -0.191 c
+30.471 -0.261 30.376 -0.293 30.251 -0.293 c
+30.134 -0.293 30.038 -0.261 29.972 -0.191 c
+29.913 -0.114 29.884 -0.022 29.884 0.088 c
+29.884 0.206 29.913 0.298 29.972 0.368 c
+30.038 0.445 30.134 0.485 30.251 0.485 c
+30.376 0.485 30.471 0.445 30.53 0.368 c
+30.589 0.287 30.618 0.195 30.618 0.088 c
+31.765 -4.939 m
+31.765 -1.484 l
+31.25 -1.484 l
+31.25 -0.955 l
+31.765 -0.955 l
+31.765 -0.588 l
+31.773 -0.158 31.886 0.177 32.103 0.412 c
+32.328 0.655 32.64 0.779 33.043 0.779 c
+33.191 0.779 33.33 0.757 33.47 0.721 c
+33.617 0.68 33.768 0.625 33.926 0.559 c
+33.808 -0.014 l
+33.573 0.11 33.33 0.177 33.088 0.177 c
+32.841 0.177 32.669 0.107 32.573 -0.029 c
+32.474 -0.158 32.426 -0.353 32.426 -0.617 c
+32.426 -0.955 l
+33.074 -0.955 l
+33.074 -1.484 l
+32.426 -1.484 l
+32.426 -4.939 l
+h
+34.234 -4.939 -0.647 3.984 re
+36.66 -4.453 m
+36.873 -4.453 37.045 -4.391 37.174 -4.262 c
+37.31 -4.126 37.384 -3.935 37.394 -3.69 c
+38.012 -3.69 l
+37.99 -4.072 37.854 -4.391 37.6 -4.644 c
+37.344 -4.891 37.031 -5.012 36.66 -5.012 c
+36.168 -5.012 35.792 -4.862 35.528 -4.556 c
+35.271 -4.244 35.146 -3.777 35.146 -3.16 c
+35.146 -2.719 l
+35.146 -2.124 35.271 -1.668 35.528 -1.352 c
+35.792 -1.04 36.168 -0.881 36.66 -0.881 c
+37.06 -0.881 37.38 -1.014 37.615 -1.278 c
+37.858 -1.536 37.99 -1.882 38.012 -2.322 c
+37.394 -2.322 l
+37.373 -2.028 37.299 -1.808 37.174 -1.66 c
+37.057 -1.514 36.884 -1.44 36.66 -1.44 c
+36.366 -1.44 36.149 -1.539 36.013 -1.734 c
+35.873 -1.922 35.8 -2.23 35.792 -2.66 c
+35.792 -3.175 l
+35.792 -3.645 35.859 -3.979 35.998 -4.174 c
+36.145 -4.361 36.366 -4.453 36.66 -4.453 c
+41.863 -4.453 m
+42.076 -4.453 42.249 -4.391 42.377 -4.262 c
+42.514 -4.126 42.587 -3.935 42.599 -3.69 c
+43.216 -3.69 l
+43.193 -4.072 43.058 -4.391 42.804 -4.644 c
+42.547 -4.891 42.234 -5.012 41.863 -5.012 c
+41.371 -5.012 40.996 -4.862 40.731 -4.556 c
+40.474 -4.244 40.349 -3.777 40.349 -3.16 c
+40.349 -2.719 l
+40.349 -2.124 40.474 -1.668 40.731 -1.352 c
+40.996 -1.04 41.371 -0.881 41.863 -0.881 c
+42.264 -0.881 42.583 -1.014 42.819 -1.278 c
+43.061 -1.536 43.193 -1.882 43.216 -2.322 c
+42.599 -2.322 l
+42.576 -2.028 42.503 -1.808 42.377 -1.66 c
+42.26 -1.514 42.088 -1.44 41.863 -1.44 c
+41.569 -1.44 41.352 -1.539 41.217 -1.734 c
+41.076 -1.922 41.003 -2.23 40.996 -2.66 c
+40.996 -3.175 l
+40.996 -3.645 41.062 -3.979 41.202 -4.174 c
+41.348 -4.361 41.569 -4.453 41.863 -4.453 c
+43.833 -2.763 m
+43.833 -2.186 43.969 -1.731 44.245 -1.396 c
+44.527 -1.055 44.899 -0.881 45.362 -0.881 c
+45.821 -0.881 46.188 -1.051 46.464 -1.381 c
+46.747 -1.705 46.894 -2.153 46.905 -2.719 c
+46.905 -3.145 l
+46.905 -3.715 46.761 -4.17 46.479 -4.513 c
+46.203 -4.847 45.836 -5.012 45.377 -5.012 c
+44.914 -5.012 44.542 -4.85 44.259 -4.527 c
+43.983 -4.197 43.84 -3.755 43.833 -3.204 c
+h
+44.48 -3.145 m
+44.48 -3.549 44.557 -3.865 44.715 -4.101 c
+44.88 -4.336 45.101 -4.453 45.377 -4.453 c
+45.942 -4.453 46.236 -4.042 46.258 -3.219 c
+46.258 -2.763 l
+46.258 -2.362 46.173 -2.043 46.009 -1.808 c
+45.851 -1.565 45.633 -1.44 45.362 -1.44 c
+45.097 -1.44 44.88 -1.565 44.715 -1.808 c
+44.557 -2.043 44.48 -2.362 44.48 -2.763 c
+h
+48.361 -0.955 m
+48.375 -1.323 l
+48.617 -1.028 48.937 -0.881 49.33 -0.881 c
+49.772 -0.881 50.08 -1.08 50.256 -1.469 c
+50.51 -1.08 50.859 -0.881 51.3 -0.881 c
+52.035 -0.881 52.41 -1.344 52.432 -2.263 c
+52.432 -4.939 l
+51.785 -4.939 l
+51.785 -2.322 l
+51.785 -2.028 51.73 -1.815 51.623 -1.675 c
+51.524 -1.539 51.351 -1.469 51.108 -1.469 c
+50.911 -1.469 50.749 -1.55 50.624 -1.705 c
+50.506 -1.851 50.437 -2.043 50.418 -2.278 c
+50.418 -4.939 l
+49.757 -4.939 l
+49.757 -2.293 l
+49.757 -1.745 49.536 -1.469 49.095 -1.469 c
+48.76 -1.469 48.525 -1.631 48.39 -1.955 c
+48.39 -4.939 l
+47.743 -4.939 l
+47.743 -0.955 l
+h
+54.019 -0.955 m
+54.034 -1.323 l
+54.277 -1.028 54.597 -0.881 54.989 -0.881 c
+55.43 -0.881 55.739 -1.08 55.916 -1.469 c
+56.169 -1.08 56.518 -0.881 56.959 -0.881 c
+57.694 -0.881 58.069 -1.344 58.091 -2.263 c
+58.091 -4.939 l
+57.444 -4.939 l
+57.444 -2.322 l
+57.444 -2.028 57.389 -1.815 57.283 -1.675 c
+57.184 -1.539 57.011 -1.469 56.768 -1.469 c
+56.569 -1.469 56.408 -1.55 56.283 -1.705 c
+56.165 -1.851 56.095 -2.043 56.077 -2.278 c
+56.077 -4.939 l
+55.416 -4.939 l
+55.416 -2.293 l
+55.416 -1.745 55.195 -1.469 54.754 -1.469 c
+54.42 -1.469 54.185 -1.631 54.048 -1.955 c
+54.048 -4.939 l
+53.402 -4.939 l
+53.402 -0.955 l
+h
+59.767 -4.939 -0.647 3.984 re
+59.81 0.088 m
+59.81 -0.022 59.781 -0.114 59.723 -0.191 c
+59.664 -0.261 59.569 -0.293 59.443 -0.293 c
+59.326 -0.293 59.23 -0.261 59.164 -0.191 c
+59.105 -0.114 59.076 -0.022 59.076 0.088 c
+59.076 0.206 59.105 0.298 59.164 0.368 c
+59.23 0.445 59.326 0.485 59.443 0.485 c
+59.569 0.485 59.664 0.445 59.723 0.368 c
+59.781 0.287 59.81 0.195 59.81 0.088 c
+61.633 0 m
+61.633 -0.955 l
+62.236 -0.955 l
+62.236 -1.484 l
+61.633 -1.484 l
+61.633 -3.954 l
+61.633 -4.112 61.655 -4.23 61.707 -4.307 c
+61.766 -4.388 61.854 -4.424 61.971 -4.424 c
+62.06 -4.424 62.148 -4.409 62.236 -4.38 c
+62.236 -4.939 l
+62.089 -4.986 61.935 -5.012 61.78 -5.012 c
+61.523 -5.012 61.329 -4.92 61.192 -4.733 c
+61.053 -4.549 60.986 -4.288 60.986 -3.954 c
+60.986 -1.484 l
+60.384 -1.484 l
+60.384 -0.955 l
+60.986 -0.955 l
+60.986 0 l
+h
+65.426 -4.939 -0.646 3.984 re
+65.47 0.088 m
+65.47 -0.022 65.441 -0.114 65.381 -0.191 c
+65.323 -0.261 65.227 -0.293 65.102 -0.293 c
+64.984 -0.293 64.889 -0.261 64.824 -0.191 c
+64.764 -0.114 64.735 -0.022 64.735 0.088 c
+64.735 0.206 64.764 0.298 64.824 0.368 c
+64.889 0.445 64.984 0.485 65.102 0.485 c
+65.227 0.485 65.323 0.445 65.381 0.368 c
+65.441 0.287 65.47 0.195 65.47 0.088 c
+67.058 -0.955 m
+67.072 -1.396 l
+67.326 -1.055 67.649 -0.881 68.042 -0.881 c
+68.747 -0.881 69.104 -1.352 69.115 -2.293 c
+69.115 -4.939 l
+68.469 -4.939 l
+68.469 -2.322 l
+68.469 -2.009 68.413 -1.789 68.307 -1.66 c
+68.197 -1.536 68.042 -1.469 67.837 -1.469 c
+67.679 -1.469 67.532 -1.525 67.396 -1.631 c
+67.267 -1.741 67.164 -1.878 67.087 -2.043 c
+67.087 -4.939 l
+66.44 -4.939 l
+66.44 -0.955 l
+h
+72.026 -3.925 m
+72.026 -3.777 71.97 -3.656 71.864 -3.557 c
+71.754 -3.461 71.548 -3.343 71.247 -3.204 c
+70.902 -3.057 70.659 -2.936 70.511 -2.836 c
+70.364 -2.73 70.254 -2.612 70.189 -2.484 c
+70.119 -2.359 70.085 -2.201 70.085 -2.013 c
+70.085 -1.691 70.203 -1.421 70.438 -1.205 c
+70.673 -0.992 70.975 -0.881 71.349 -0.881 c
+71.731 -0.881 72.04 -0.995 72.275 -1.22 c
+72.51 -1.448 72.628 -1.734 72.628 -2.087 c
+71.982 -2.087 l
+71.982 -1.911 71.922 -1.76 71.805 -1.631 c
+71.687 -1.506 71.533 -1.44 71.349 -1.44 c
+71.151 -1.44 71 -1.496 70.894 -1.602 c
+70.784 -1.701 70.732 -1.833 70.732 -1.999 c
+70.732 -2.127 70.769 -2.234 70.85 -2.322 c
+70.927 -2.403 71.118 -2.506 71.423 -2.631 c
+71.901 -2.818 72.232 -3.006 72.408 -3.189 c
+72.585 -3.366 72.672 -3.594 72.672 -3.865 c
+72.672 -4.218 72.548 -4.498 72.305 -4.704 c
+72.07 -4.909 71.754 -5.012 71.364 -5.012 c
+70.941 -5.012 70.603 -4.895 70.35 -4.659 c
+70.093 -4.417 69.967 -4.112 69.967 -3.748 c
+70.615 -3.748 l
+70.622 -3.976 70.692 -4.152 70.821 -4.278 c
+70.945 -4.395 71.129 -4.453 71.364 -4.453 c
+71.577 -4.453 71.739 -4.405 71.849 -4.307 c
+71.967 -4.211 72.026 -4.083 72.026 -3.925 c
+74.363 0 m
+74.363 -0.955 l
+74.966 -0.955 l
+74.966 -1.484 l
+74.363 -1.484 l
+74.363 -3.954 l
+74.363 -4.112 74.385 -4.23 74.436 -4.307 c
+74.495 -4.388 74.584 -4.424 74.701 -4.424 c
+74.789 -4.424 74.877 -4.409 74.966 -4.38 c
+74.966 -4.939 l
+74.819 -4.986 74.665 -5.012 74.509 -5.012 c
+74.253 -5.012 74.058 -4.92 73.921 -4.733 c
+73.782 -4.549 73.716 -4.288 73.716 -3.954 c
+73.716 -1.484 l
+73.113 -1.484 l
+73.113 -0.955 l
+73.716 -0.955 l
+73.716 0 l
+h
+77.156 -5.012 m
+76.656 -5.012 76.273 -4.866 76.009 -4.571 c
+75.745 -4.278 75.612 -3.844 75.612 -3.262 c
+75.612 -2.792 l
+75.612 -2.198 75.737 -1.731 75.995 -1.396 c
+76.259 -1.055 76.619 -0.881 77.082 -0.881 c
+77.541 -0.881 77.883 -1.036 78.111 -1.338 c
+78.347 -1.631 78.467 -2.094 78.478 -2.719 c
+78.478 -3.145 l
+76.259 -3.145 l
+76.259 -3.233 l
+76.259 -3.667 76.336 -3.979 76.494 -4.174 c
+76.66 -4.361 76.891 -4.453 77.185 -4.453 c
+77.38 -4.453 77.553 -4.421 77.699 -4.351 c
+77.846 -4.274 77.983 -4.156 78.111 -3.998 c
+78.449 -4.409 l
+78.162 -4.814 77.732 -5.012 77.156 -5.012 c
+77.082 -1.44 m
+76.807 -1.44 76.604 -1.536 76.479 -1.72 c
+76.35 -1.907 76.277 -2.198 76.259 -2.587 c
+77.832 -2.587 l
+77.832 -2.499 l
+77.809 -2.117 77.744 -1.849 77.626 -1.691 c
+77.508 -1.525 77.325 -1.44 77.082 -1.44 c
+81.301 -4.939 m
+81.26 -4.85 81.235 -4.704 81.227 -4.498 c
+80.992 -4.843 80.698 -5.012 80.346 -5.012 c
+79.982 -5.012 79.698 -4.916 79.492 -4.718 c
+79.294 -4.513 79.199 -4.226 79.199 -3.85 c
+79.199 -3.451 79.334 -3.131 79.61 -2.896 c
+79.882 -2.653 80.257 -2.528 80.728 -2.528 c
+81.212 -2.528 l
+81.212 -2.102 l
+81.212 -1.866 81.158 -1.701 81.051 -1.602 c
+80.94 -1.496 80.779 -1.44 80.566 -1.44 c
+80.367 -1.44 80.206 -1.499 80.08 -1.616 c
+79.963 -1.734 79.905 -1.882 79.905 -2.057 c
+79.257 -2.057 l
+79.257 -1.863 79.317 -1.672 79.434 -1.484 c
+79.559 -1.301 79.721 -1.153 79.919 -1.043 c
+80.125 -0.937 80.352 -0.881 80.61 -0.881 c
+81.011 -0.881 81.316 -0.985 81.522 -1.19 c
+81.734 -1.396 81.848 -1.691 81.859 -2.072 c
+81.859 -4.086 l
+81.859 -4.391 81.896 -4.656 81.977 -4.88 c
+81.977 -4.939 l
+h
+80.433 -4.424 m
+80.599 -4.424 80.749 -4.38 80.889 -4.292 c
+81.036 -4.203 81.143 -4.093 81.212 -3.954 c
+81.212 -3.013 l
+80.845 -3.013 l
+80.529 -3.013 80.286 -3.083 80.111 -3.219 c
+79.934 -3.347 79.845 -3.535 79.845 -3.777 c
+79.845 -4.006 79.889 -4.17 79.978 -4.278 c
+80.066 -4.376 80.217 -4.424 80.433 -4.424 c
+82.727 -2.763 m
+82.727 -2.157 82.837 -1.691 83.064 -1.367 c
+83.3 -1.043 83.627 -0.881 84.049 -0.881 c
+84.431 -0.881 84.73 -1.04 84.946 -1.352 c
+84.946 0.706 l
+85.593 0.706 l
+85.593 -4.939 l
+85.005 -4.939 l
+84.961 -4.513 l
+84.755 -4.847 84.45 -5.012 84.049 -5.012 c
+83.638 -5.012 83.315 -4.858 83.079 -4.542 c
+82.844 -4.218 82.727 -3.763 82.727 -3.175 c
+h
+83.373 -3.145 m
+83.373 -3.586 83.436 -3.917 83.564 -4.13 c
+83.7 -4.336 83.921 -4.438 84.226 -4.438 c
+84.549 -4.438 84.788 -4.278 84.946 -3.954 c
+84.946 -1.94 l
+84.778 -1.627 84.539 -1.469 84.226 -1.469 c
+83.921 -1.469 83.7 -1.573 83.564 -1.778 c
+83.436 -1.984 83.373 -2.308 83.373 -2.749 c
+h
+88.18 -2.763 m
+88.18 -2.186 88.316 -1.731 88.591 -1.396 c
+88.874 -1.055 89.246 -0.881 89.709 -0.881 c
+90.168 -0.881 90.536 -1.051 90.811 -1.381 c
+91.094 -1.705 91.241 -2.153 91.252 -2.719 c
+91.252 -3.145 l
+91.252 -3.715 91.109 -4.17 90.826 -4.513 c
+90.55 -4.847 90.183 -5.012 89.723 -5.012 c
+89.26 -5.012 88.889 -4.85 88.606 -4.527 c
+88.331 -4.197 88.188 -3.755 88.18 -3.204 c
+h
+88.826 -3.145 m
+88.826 -3.549 88.904 -3.865 89.062 -4.101 c
+89.227 -4.336 89.447 -4.453 89.723 -4.453 c
+90.289 -4.453 90.583 -4.042 90.605 -3.219 c
+90.605 -2.763 l
+90.605 -2.362 90.521 -2.043 90.355 -1.808 c
+90.197 -1.565 89.981 -1.44 89.709 -1.44 c
+89.444 -1.44 89.227 -1.565 89.062 -1.808 c
+88.904 -2.043 88.826 -2.362 88.826 -2.763 c
+h
+92.383 -4.939 m
+92.383 -1.484 l
+91.855 -1.484 l
+91.855 -0.955 l
+92.383 -0.955 l
+92.383 -0.5 l
+92.383 -0.099 92.479 0.214 92.678 0.441 c
+92.884 0.665 93.163 0.779 93.516 0.779 c
+93.652 0.779 93.784 0.757 93.912 0.721 c
+93.883 0.177 l
+93.784 0.195 93.684 0.206 93.589 0.206 c
+93.214 0.206 93.031 -0.058 93.031 -0.588 c
+93.031 -0.955 l
+93.707 -0.955 l
+93.707 -1.484 l
+93.031 -1.484 l
+93.031 -4.939 l
+h
+97.573 -4.453 m
+97.786 -4.453 97.958 -4.391 98.087 -4.262 c
+98.223 -4.126 98.297 -3.935 98.307 -3.69 c
+98.925 -3.69 l
+98.903 -4.072 98.767 -4.391 98.513 -4.644 c
+98.256 -4.891 97.944 -5.012 97.573 -5.012 c
+97.081 -5.012 96.705 -4.862 96.441 -4.556 c
+96.184 -4.244 96.059 -3.777 96.059 -3.16 c
+96.059 -2.719 l
+96.059 -2.124 96.184 -1.668 96.441 -1.352 c
+96.705 -1.04 97.081 -0.881 97.573 -0.881 c
+97.973 -0.881 98.293 -1.014 98.528 -1.278 c
+98.771 -1.536 98.903 -1.882 98.925 -2.322 c
+98.307 -2.322 l
+98.286 -2.028 98.212 -1.808 98.087 -1.66 c
+97.97 -1.514 97.796 -1.44 97.573 -1.44 c
+97.279 -1.44 97.062 -1.539 96.926 -1.734 c
+96.786 -1.922 96.713 -2.23 96.705 -2.66 c
+96.705 -3.175 l
+96.705 -3.645 96.772 -3.979 96.911 -4.174 c
+97.058 -4.361 97.279 -4.453 97.573 -4.453 c
+101.703 -4.586 m
+101.486 -4.872 101.174 -5.012 100.763 -5.012 c
+100.398 -5.012 100.123 -4.891 99.939 -4.644 c
+99.763 -4.391 99.668 -4.027 99.66 -3.557 c
+99.66 -0.955 l
+100.306 -0.955 l
+100.306 -3.498 l
+100.306 -4.126 100.491 -4.438 100.865 -4.438 c
+101.266 -4.438 101.542 -4.262 101.688 -3.91 c
+101.688 -0.955 l
+102.335 -0.955 l
+102.335 -4.939 l
+101.717 -4.939 l
+h
+104.966 -1.573 m
+104.878 -1.554 104.779 -1.543 104.672 -1.543 c
+104.337 -1.543 104.102 -1.727 103.967 -2.087 c
+103.967 -4.939 l
+103.319 -4.939 l
+103.319 -0.955 l
+103.952 -0.955 l
+103.967 -1.367 l
+104.143 -1.043 104.385 -0.881 104.701 -0.881 c
+104.808 -0.881 104.896 -0.904 104.966 -0.941 c
+h
+107.259 -1.573 m
+107.171 -1.554 107.072 -1.543 106.965 -1.543 c
+106.631 -1.543 106.396 -1.727 106.259 -2.087 c
+106.259 -4.939 l
+105.613 -4.939 l
+105.613 -0.955 l
+106.245 -0.955 l
+106.259 -1.367 l
+106.436 -1.043 106.679 -0.881 106.995 -0.881 c
+107.101 -0.881 107.19 -0.904 107.259 -0.941 c
+h
+109.258 -5.012 m
+108.759 -5.012 108.376 -4.866 108.112 -4.571 c
+107.847 -4.278 107.715 -3.844 107.715 -3.262 c
+107.715 -2.792 l
+107.715 -2.198 107.84 -1.731 108.098 -1.396 c
+108.362 -1.055 108.722 -0.881 109.185 -0.881 c
+109.644 -0.881 109.986 -1.036 110.214 -1.338 c
+110.449 -1.631 110.571 -2.094 110.581 -2.719 c
+110.581 -3.145 l
+108.362 -3.145 l
+108.362 -3.233 l
+108.362 -3.667 108.439 -3.979 108.597 -4.174 c
+108.763 -4.361 108.994 -4.453 109.288 -4.453 c
+109.482 -4.453 109.655 -4.421 109.802 -4.351 c
+109.949 -4.274 110.085 -4.156 110.214 -3.998 c
+110.552 -4.409 l
+110.265 -4.814 109.835 -5.012 109.258 -5.012 c
+109.185 -1.44 m
+108.909 -1.44 108.707 -1.536 108.582 -1.72 c
+108.454 -1.907 108.38 -2.198 108.362 -2.587 c
+109.935 -2.587 l
+109.935 -2.499 l
+109.912 -2.117 109.846 -1.849 109.729 -1.691 c
+109.611 -1.525 109.428 -1.44 109.185 -1.44 c
+111.978 -0.955 m
+111.992 -1.396 l
+112.246 -1.055 112.569 -0.881 112.962 -0.881 c
+113.668 -0.881 114.024 -1.352 114.035 -2.293 c
+114.035 -4.939 l
+113.389 -4.939 l
+113.389 -2.322 l
+113.389 -2.009 113.334 -1.789 113.227 -1.66 c
+113.117 -1.536 112.962 -1.469 112.757 -1.469 c
+112.599 -1.469 112.452 -1.525 112.316 -1.631 c
+112.187 -1.741 112.084 -1.878 112.007 -2.043 c
+112.007 -4.939 l
+111.36 -4.939 l
+111.36 -0.955 l
+h
+115.859 0 m
+115.859 -0.955 l
+116.461 -0.955 l
+116.461 -1.484 l
+115.859 -1.484 l
+115.859 -3.954 l
+115.859 -4.112 115.88 -4.23 115.932 -4.307 c
+115.99 -4.388 116.079 -4.424 116.196 -4.424 c
+116.285 -4.424 116.372 -4.409 116.461 -4.38 c
+116.461 -4.939 l
+116.314 -4.986 116.16 -5.012 116.005 -5.012 c
+115.748 -5.012 115.553 -4.92 115.417 -4.733 c
+115.277 -4.549 115.211 -4.288 115.211 -3.954 c
+115.211 -1.484 l
+114.608 -1.484 l
+114.608 -0.955 l
+115.211 -0.955 l
+115.211 0 l
+h
+118.813 -2.763 m
+118.813 -2.186 118.949 -1.731 119.225 -1.396 c
+119.508 -1.055 119.878 -0.881 120.341 -0.881 c
+120.8 -0.881 121.168 -1.051 121.444 -1.381 c
+121.727 -1.705 121.874 -2.153 121.885 -2.719 c
+121.885 -3.145 l
+121.885 -3.715 121.741 -4.17 121.459 -4.513 c
+121.183 -4.847 120.815 -5.012 120.356 -5.012 c
+119.893 -5.012 119.522 -4.85 119.239 -4.527 c
+118.963 -4.197 118.82 -3.755 118.813 -3.204 c
+h
+119.46 -3.145 m
+119.46 -3.549 119.537 -3.865 119.695 -4.101 c
+119.86 -4.336 120.081 -4.453 120.356 -4.453 c
+120.922 -4.453 121.216 -4.042 121.238 -3.219 c
+121.238 -2.763 l
+121.238 -2.362 121.154 -2.043 120.988 -1.808 c
+120.83 -1.565 120.613 -1.44 120.341 -1.44 c
+120.077 -1.44 119.86 -1.565 119.695 -1.808 c
+119.537 -2.043 119.46 -2.362 119.46 -2.763 c
+h
+123.34 -0.955 m
+123.354 -1.396 l
+123.608 -1.055 123.932 -0.881 124.325 -0.881 c
+125.031 -0.881 125.387 -1.352 125.398 -2.293 c
+125.398 -4.939 l
+124.751 -4.939 l
+124.751 -2.322 l
+124.751 -2.009 124.696 -1.789 124.59 -1.66 c
+124.48 -1.536 124.325 -1.469 124.119 -1.469 c
+123.961 -1.469 123.814 -1.525 123.678 -1.631 c
+123.549 -1.741 123.447 -1.878 123.37 -2.043 c
+123.37 -4.939 l
+122.722 -4.939 l
+122.722 -0.955 l
+h
+127.794 -5.012 m
+127.294 -5.012 126.912 -4.866 126.647 -4.571 c
+126.383 -4.278 126.25 -3.844 126.25 -3.262 c
+126.25 -2.792 l
+126.25 -2.198 126.375 -1.731 126.633 -1.396 c
+126.897 -1.055 127.258 -0.881 127.72 -0.881 c
+128.179 -0.881 128.522 -1.036 128.75 -1.338 c
+128.985 -1.631 129.106 -2.094 129.116 -2.719 c
+129.116 -3.145 l
+126.897 -3.145 l
+126.897 -3.233 l
+126.897 -3.667 126.974 -3.979 127.132 -4.174 c
+127.298 -4.361 127.529 -4.453 127.823 -4.453 c
+128.018 -4.453 128.191 -4.421 128.337 -4.351 c
+128.484 -4.274 128.621 -4.156 128.75 -3.998 c
+129.087 -4.409 l
+128.8 -4.814 128.37 -5.012 127.794 -5.012 c
+127.72 -1.44 m
+127.445 -1.44 127.242 -1.536 127.117 -1.72 c
+126.989 -1.907 126.915 -2.198 126.897 -2.587 c
+128.47 -2.587 l
+128.47 -2.499 l
+128.448 -2.117 128.382 -1.849 128.264 -1.691 c
+128.147 -1.525 127.963 -1.44 127.72 -1.44 c
+129.94 -4.586 m
+129.94 -4.469 129.973 -4.373 130.043 -4.292 c
+130.109 -4.215 130.211 -4.174 130.352 -4.174 c
+130.498 -4.174 130.605 -4.215 130.675 -4.292 c
+130.752 -4.373 130.793 -4.469 130.793 -4.586 c
+130.793 -4.696 130.752 -4.788 130.675 -4.866 c
+130.605 -4.943 130.498 -4.983 130.352 -4.983 c
+130.211 -4.983 130.109 -4.943 130.043 -4.866 c
+129.973 -4.788 129.94 -4.696 129.94 -4.586 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 402.127 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 395.2921 cm
+0 0 m
+0 -0.188 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.776 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.206 -1.278 -1.243 -1.543 -1.25 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.82 -3.23 -0.691 -3.307 -0.545 c
+-3.388 -0.39 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.148 c
+-2.55 -0.229 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.427 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.581 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.675 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.572 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.63 -3.054 2.748 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.263 -0.941 1.205 c
+-0.756 1.146 -0.595 1.065 -0.455 0.97 c
+-0.32 0.87 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.513 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.499 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.356 -1.043 0.396 c
+-1.103 0.433 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.558 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.581 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.346 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.661 m
+6.184 -2.661 5.993 -2.635 5.829 -2.587 c
+5.659 -2.548 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.721 c
+5.858 -1.617 l
+5.895 -1.754 5.964 -1.86 6.064 -1.941 c
+6.159 -2.029 6.284 -2.073 6.431 -2.073 c
+6.519 -2.073 6.6 -2.058 6.681 -2.029 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.798 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.324 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.78 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.817 6.835 -0.978 6.652 -1.073 c
+6.464 -1.173 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.015 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.007 4.814 0.242 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.079 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.767 7.078 1.66 c
+7.092 1.66 l
+7.092 1.807 l
+7.1 1.866 7.107 1.918 7.107 1.969 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.164 7.14 2.197 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.636 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.5 7.063 -2.558 c
+6.865 -2.625 6.644 -2.661 6.402 -2.661 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.499 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.572 c
+6.056 1.531 5.99 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.124 5.814 -0.155 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.464 6.857 -0.383 c
+6.924 -0.294 6.978 -0.177 7.019 -0.03 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.659 15.732 -0.632 15.861 -0.603 c
+15.861 -1.206 l
+15.78 -1.216 15.703 -1.231 15.626 -1.25 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.287 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.133 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.545 13.597 -0.456 c
+13.586 -0.36 13.582 -0.265 13.582 -0.177 c
+h
+21.722 1.602 m
+21.178 1.602 l
+21.178 2.219 l
+21.766 2.219 l
+22.045 3.116 l
+22.618 3.116 l
+22.618 2.219 l
+23.853 2.219 l
+23.853 1.602 l
+22.618 1.602 l
+22.618 -0.103 l
+22.618 -0.324 l
+22.626 -0.393 22.647 -0.456 22.677 -0.515 c
+22.714 -0.566 22.769 -0.611 22.839 -0.647 c
+22.916 -0.676 23.03 -0.691 23.177 -0.691 c
+23.313 -0.691 23.449 -0.688 23.588 -0.676 c
+23.725 -0.659 23.857 -0.632 23.985 -0.603 c
+23.985 -1.206 l
+23.904 -1.216 23.827 -1.231 23.75 -1.25 c
+23.669 -1.261 23.592 -1.268 23.515 -1.279 c
+23.434 -1.287 23.346 -1.294 23.25 -1.294 c
+23.162 -1.301 23.063 -1.309 22.957 -1.309 c
+22.769 -1.309 22.608 -1.294 22.471 -1.264 c
+22.343 -1.228 22.229 -1.183 22.134 -1.133 c
+22.045 -1.085 21.972 -1.025 21.913 -0.956 c
+21.854 -0.879 21.81 -0.802 21.781 -0.721 c
+21.751 -0.632 21.729 -0.545 21.722 -0.456 c
+21.71 -0.36 21.707 -0.265 21.707 -0.177 c
+h
+26.136 -1.324 m
+25.966 -1.324 25.816 -1.301 25.679 -1.264 c
+25.551 -1.216 25.437 -1.147 25.342 -1.058 c
+25.253 -0.971 25.184 -0.864 25.136 -0.736 c
+25.084 -0.599 25.062 -0.449 25.062 -0.279 c
+25.062 -0.074 25.095 0.095 25.165 0.235 c
+25.232 0.382 25.327 0.492 25.444 0.573 c
+25.569 0.661 25.712 0.723 25.87 0.764 c
+26.036 0.801 26.213 0.826 26.4 0.837 c
+27.12 0.852 l
+27.12 1.028 l
+27.12 1.146 27.109 1.249 27.09 1.337 c
+27.069 1.425 27.036 1.491 26.988 1.543 c
+26.947 1.602 26.9 1.639 26.841 1.66 c
+26.782 1.679 26.716 1.69 26.649 1.69 c
+26.58 1.69 26.518 1.679 26.458 1.66 c
+26.408 1.649 26.36 1.624 26.312 1.587 c
+26.271 1.558 26.238 1.506 26.209 1.44 c
+26.186 1.381 26.172 1.3 26.165 1.205 c
+25.224 1.249 l
+25.253 1.396 25.297 1.531 25.356 1.66 c
+25.423 1.786 25.518 1.896 25.635 1.984 c
+25.753 2.079 25.893 2.153 26.061 2.204 c
+26.238 2.252 26.444 2.277 26.679 2.277 c
+27.12 2.277 27.451 2.167 27.678 1.955 c
+27.914 1.749 28.031 1.44 28.031 1.028 c
+28.031 -0.235 l
+28.031 -0.456 l
+28.039 -0.515 28.054 -0.57 28.075 -0.618 c
+28.094 -0.659 28.123 -0.691 28.164 -0.721 c
+28.201 -0.743 28.252 -0.75 28.311 -0.75 c
+28.376 -0.75 28.447 -0.746 28.517 -0.736 c
+28.517 -1.22 l
+28.457 -1.231 28.403 -1.243 28.355 -1.25 c
+28.314 -1.261 28.274 -1.268 28.237 -1.279 c
+28.197 -1.287 28.153 -1.294 28.105 -1.294 c
+28.054 -1.301 27.995 -1.309 27.929 -1.309 c
+27.701 -1.309 27.535 -1.257 27.429 -1.147 c
+27.318 -1.029 27.256 -0.864 27.237 -0.647 c
+27.223 -0.647 l
+27.154 -0.757 27.083 -0.853 27.017 -0.941 c
+26.947 -1.022 26.87 -1.088 26.782 -1.147 c
+26.693 -1.206 26.595 -1.25 26.488 -1.279 c
+26.389 -1.309 26.271 -1.324 26.136 -1.324 c
+27.12 0.353 m
+26.693 0.338 l
+26.595 0.338 26.503 0.33 26.414 0.323 c
+26.333 0.312 26.267 0.286 26.209 0.249 c
+26.15 0.209 26.098 0.151 26.061 0.073 c
+26.021 0.003 26.003 -0.088 26.003 -0.206 c
+26.003 -0.375 26.036 -0.497 26.106 -0.574 c
+26.172 -0.655 26.271 -0.691 26.4 -0.691 c
+26.506 -0.691 26.606 -0.669 26.693 -0.618 c
+26.789 -0.57 26.87 -0.508 26.929 -0.427 c
+26.995 -0.35 27.046 -0.262 27.076 -0.162 c
+27.106 -0.056 27.12 0.058 27.12 0.176 c
+h
+30.769 -2.661 m
+30.552 -2.661 30.361 -2.635 30.196 -2.587 c
+30.027 -2.548 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.22 29.475 -2.103 c
+29.406 -1.985 29.358 -1.856 29.328 -1.721 c
+30.225 -1.617 l
+30.262 -1.754 30.331 -1.86 30.431 -1.941 c
+30.527 -2.029 30.651 -2.073 30.799 -2.073 c
+30.886 -2.073 30.967 -2.058 31.048 -2.029 c
+31.125 -1.999 31.195 -1.945 31.254 -1.867 c
+31.313 -1.798 31.357 -1.706 31.387 -1.588 c
+31.424 -1.47 31.445 -1.324 31.445 -1.147 c
+31.445 -0.956 l
+31.445 -0.89 31.449 -0.831 31.46 -0.78 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.817 31.202 -0.978 31.019 -1.073 c
+30.832 -1.173 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.015 29.582 -0.897 29.475 -0.75 c
+29.376 -0.595 29.303 -0.412 29.255 -0.206 c
+29.203 0.007 29.182 0.242 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.234 c
+29.313 1.448 29.394 1.631 29.505 1.778 c
+29.612 1.932 29.743 2.05 29.901 2.131 c
+30.057 2.219 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.252 30.755 2.234 c
+30.85 2.212 30.938 2.179 31.019 2.131 c
+31.107 2.079 31.185 2.017 31.254 1.94 c
+31.331 1.859 31.393 1.767 31.445 1.66 c
+31.46 1.66 l
+31.46 1.807 l
+31.468 1.866 31.474 1.918 31.474 1.969 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.164 31.507 2.197 31.519 2.219 c
+32.371 2.219 l
+32.361 2.138 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.162 l
+32.342 -1.415 32.305 -1.636 32.239 -1.823 c
+32.17 -2.007 32.066 -2.161 31.931 -2.278 c
+31.79 -2.404 31.625 -2.5 31.43 -2.558 c
+31.233 -2.625 31.011 -2.661 30.769 -2.661 c
+31.46 0.529 m
+31.46 0.742 31.434 0.918 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.499 31.096 1.558 31.019 1.587 c
+30.938 1.624 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.62 30.504 1.572 c
+30.424 1.531 30.358 1.462 30.298 1.367 c
+30.248 1.278 30.203 1.161 30.167 1.014 c
+30.137 0.874 30.122 0.706 30.122 0.5 c
+30.122 0.124 30.181 -0.155 30.298 -0.339 c
+30.416 -0.515 30.578 -0.603 30.784 -0.603 c
+30.85 -0.603 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.464 31.225 -0.383 c
+31.291 -0.294 31.346 -0.177 31.387 -0.03 c
+31.434 0.118 31.46 0.301 31.46 0.529 c
+37.953 0.837 1.866 -0.794 re
+37.953 0.043 m
+42.381 -1.324 m
+42.212 -1.324 42.061 -1.301 41.926 -1.264 c
+41.797 -1.216 41.683 -1.147 41.587 -1.058 c
+41.5 -0.971 41.429 -0.864 41.382 -0.736 c
+41.33 -0.599 41.308 -0.449 41.308 -0.279 c
+41.308 -0.074 41.342 0.095 41.411 0.235 c
+41.477 0.382 41.573 0.492 41.691 0.573 c
+41.816 0.661 41.959 0.723 42.117 0.764 c
+42.282 0.801 42.458 0.826 42.646 0.837 c
+43.366 0.852 l
+43.366 1.028 l
+43.366 1.146 43.355 1.249 43.337 1.337 c
+43.314 1.425 43.282 1.491 43.234 1.543 c
+43.193 1.602 43.146 1.639 43.087 1.66 c
+43.028 1.679 42.962 1.69 42.896 1.69 c
+42.826 1.69 42.763 1.679 42.705 1.66 c
+42.653 1.649 42.605 1.624 42.558 1.587 c
+42.518 1.558 42.484 1.506 42.455 1.44 c
+42.433 1.381 42.418 1.3 42.41 1.205 c
+41.47 1.249 l
+41.5 1.396 41.543 1.531 41.602 1.66 c
+41.668 1.786 41.764 1.896 41.882 1.984 c
+41.999 2.079 42.139 2.153 42.308 2.204 c
+42.484 2.252 42.69 2.277 42.925 2.277 c
+43.366 2.277 43.697 2.167 43.925 1.955 c
+44.16 1.749 44.278 1.44 44.278 1.028 c
+44.278 -0.235 l
+44.278 -0.456 l
+44.284 -0.515 44.299 -0.57 44.322 -0.618 c
+44.34 -0.659 44.369 -0.691 44.409 -0.721 c
+44.446 -0.743 44.498 -0.75 44.557 -0.75 c
+44.623 -0.75 44.693 -0.746 44.762 -0.736 c
+44.762 -1.22 l
+44.704 -1.231 44.648 -1.243 44.6 -1.25 c
+44.56 -1.261 44.52 -1.268 44.483 -1.279 c
+44.442 -1.287 44.399 -1.294 44.351 -1.294 c
+44.299 -1.301 44.241 -1.309 44.174 -1.309 c
+43.947 -1.309 43.781 -1.257 43.675 -1.147 c
+43.565 -1.029 43.502 -0.864 43.484 -0.647 c
+43.469 -0.647 l
+43.399 -0.757 43.33 -0.853 43.264 -0.941 c
+43.193 -1.022 43.116 -1.088 43.028 -1.147 c
+42.94 -1.206 42.84 -1.25 42.734 -1.279 c
+42.635 -1.309 42.518 -1.324 42.381 -1.324 c
+43.366 0.353 m
+42.94 0.338 l
+42.84 0.338 42.749 0.33 42.661 0.323 c
+42.58 0.312 42.514 0.286 42.455 0.249 c
+42.396 0.209 42.345 0.151 42.308 0.073 c
+42.267 0.003 42.249 -0.088 42.249 -0.206 c
+42.249 -0.375 42.282 -0.497 42.352 -0.574 c
+42.418 -0.655 42.518 -0.691 42.646 -0.691 c
+42.753 -0.691 42.852 -0.669 42.94 -0.618 c
+43.035 -0.57 43.116 -0.508 43.175 -0.427 c
+43.241 -0.35 43.293 -0.262 43.322 -0.162 c
+43.351 -0.056 43.366 0.058 43.366 0.176 c
+h
+50.297 -2.631 m
+50.297 3.513 l
+52.222 3.513 l
+52.222 2.896 l
+51.149 2.896 l
+51.149 -2.014 l
+52.222 -2.014 l
+52.222 -2.631 l
+h
+55.798 -1.264 m
+55.798 0.72 l
+55.798 1.021 55.754 1.242 55.665 1.381 c
+55.585 1.529 55.449 1.602 55.254 1.602 c
+55.143 1.602 55.041 1.576 54.946 1.529 c
+54.857 1.477 54.776 1.411 54.711 1.323 c
+54.651 1.234 54.6 1.124 54.563 0.999 c
+54.534 0.881 54.519 0.749 54.519 0.602 c
+54.519 -1.264 l
+53.608 -1.264 l
+53.608 1.44 l
+53.608 1.66 l
+53.608 1.749 53.6 1.826 53.593 1.896 c
+53.593 2.087 l
+53.593 2.219 l
+54.445 2.219 l
+54.453 2.19 54.46 2.146 54.46 2.087 c
+54.46 1.896 l
+54.468 1.826 54.475 1.756 54.475 1.69 c
+54.482 1.62 54.49 1.565 54.49 1.529 c
+54.505 1.529 l
+54.622 1.793 54.773 1.984 54.96 2.102 c
+55.143 2.219 55.364 2.277 55.621 2.277 c
+55.806 2.277 55.966 2.248 56.107 2.19 c
+56.242 2.131 56.357 2.042 56.444 1.925 c
+56.533 1.807 56.595 1.664 56.635 1.499 c
+56.683 1.341 56.71 1.153 56.71 0.941 c
+56.71 -1.264 l
+h
+58.628 -1.324 m
+58.458 -1.324 58.308 -1.301 58.172 -1.264 c
+58.044 -1.216 57.929 -1.147 57.834 -1.058 c
+57.745 -0.971 57.676 -0.864 57.628 -0.736 c
+57.576 -0.599 57.554 -0.449 57.554 -0.279 c
+57.554 -0.074 57.587 0.095 57.657 0.235 c
+57.724 0.382 57.819 0.492 57.936 0.573 c
+58.061 0.661 58.204 0.723 58.363 0.764 c
+58.528 0.801 58.705 0.826 58.892 0.837 c
+59.612 0.852 l
+59.612 1.028 l
+59.612 1.146 59.601 1.249 59.583 1.337 c
+59.561 1.425 59.528 1.491 59.48 1.543 c
+59.44 1.602 59.392 1.639 59.333 1.66 c
+59.274 1.679 59.208 1.69 59.141 1.69 c
+59.072 1.69 59.01 1.679 58.951 1.66 c
+58.9 1.649 58.852 1.624 58.804 1.587 c
+58.763 1.558 58.73 1.506 58.701 1.44 c
+58.679 1.381 58.664 1.3 58.657 1.205 c
+57.716 1.249 l
+57.745 1.396 57.79 1.531 57.848 1.66 c
+57.915 1.786 58.01 1.896 58.127 1.984 c
+58.245 2.079 58.385 2.153 58.554 2.204 c
+58.73 2.252 58.936 2.277 59.172 2.277 c
+59.612 2.277 59.943 2.167 60.171 1.955 c
+60.406 1.749 60.523 1.44 60.523 1.028 c
+60.523 -0.235 l
+60.523 -0.456 l
+60.531 -0.515 60.546 -0.57 60.568 -0.618 c
+60.586 -0.659 60.616 -0.691 60.656 -0.721 c
+60.693 -0.743 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.736 c
+61.009 -1.22 l
+60.95 -1.231 60.895 -1.243 60.847 -1.25 c
+60.807 -1.261 60.766 -1.268 60.729 -1.279 c
+60.689 -1.287 60.645 -1.294 60.597 -1.294 c
+60.546 -1.301 60.487 -1.309 60.421 -1.309 c
+60.193 -1.309 60.028 -1.257 59.921 -1.147 c
+59.81 -1.029 59.748 -0.864 59.729 -0.647 c
+59.715 -0.647 l
+59.646 -0.757 59.575 -0.853 59.509 -0.941 c
+59.44 -1.022 59.363 -1.088 59.274 -1.147 c
+59.186 -1.206 59.087 -1.25 58.981 -1.279 c
+58.881 -1.309 58.763 -1.324 58.628 -1.324 c
+59.612 0.353 m
+59.186 0.338 l
+59.087 0.338 58.995 0.33 58.906 0.323 c
+58.826 0.312 58.76 0.286 58.701 0.249 c
+58.642 0.209 58.591 0.151 58.554 0.073 c
+58.514 0.003 58.495 -0.088 58.495 -0.206 c
+58.495 -0.375 58.528 -0.497 58.598 -0.574 c
+58.664 -0.655 58.763 -0.691 58.892 -0.691 c
+58.998 -0.691 59.098 -0.669 59.186 -0.618 c
+59.282 -0.57 59.363 -0.508 59.421 -0.427 c
+59.488 -0.35 59.538 -0.262 59.569 -0.162 c
+59.598 -0.056 59.612 0.058 59.612 0.176 c
+h
+62.894 -1.264 m
+62.894 0.852 l
+62.894 1.018 62.887 1.153 62.879 1.263 c
+62.868 1.371 62.85 1.454 62.821 1.514 c
+62.798 1.579 62.769 1.631 62.732 1.66 c
+62.703 1.69 62.663 1.705 62.615 1.705 c
+62.555 1.705 62.501 1.675 62.453 1.616 c
+62.412 1.565 62.379 1.491 62.35 1.396 c
+62.32 1.308 62.295 1.194 62.277 1.058 c
+62.266 0.918 62.262 0.768 62.262 0.602 c
+62.262 -1.264 l
+61.512 -1.264 l
+61.512 1.469 l
+61.512 1.705 l
+61.512 1.925 l
+61.512 2.002 61.505 2.065 61.497 2.117 c
+61.497 2.219 l
+62.173 2.219 l
+62.173 2.131 l
+62.173 1.984 l
+62.181 1.925 62.189 1.866 62.189 1.807 c
+62.189 1.646 l
+62.203 1.646 l
+62.221 1.734 62.251 1.811 62.291 1.881 c
+62.328 1.959 62.372 2.028 62.424 2.087 c
+62.482 2.146 62.549 2.19 62.629 2.219 c
+62.707 2.256 62.794 2.277 62.894 2.277 c
+63.078 2.277 63.218 2.223 63.305 2.117 c
+63.401 2.017 63.471 1.859 63.511 1.646 c
+63.526 1.646 l
+63.563 1.741 63.603 1.83 63.644 1.911 c
+63.691 1.988 63.746 2.05 63.805 2.102 c
+63.864 2.16 63.93 2.204 64.011 2.234 c
+64.088 2.263 64.176 2.277 64.275 2.277 c
+64.411 2.277 64.525 2.252 64.614 2.204 c
+64.702 2.153 64.768 2.079 64.82 1.984 c
+64.878 1.884 64.915 1.756 64.937 1.602 c
+64.967 1.454 64.981 1.271 64.981 1.058 c
+64.981 -1.264 l
+64.261 -1.264 l
+64.261 0.852 l
+64.261 1.018 64.253 1.153 64.246 1.263 c
+64.236 1.371 64.217 1.454 64.188 1.514 c
+64.165 1.579 64.136 1.631 64.099 1.66 c
+64.07 1.69 64.03 1.705 63.982 1.705 c
+63.864 1.705 63.768 1.616 63.702 1.44 c
+63.644 1.271 63.614 1.014 63.614 0.661 c
+63.614 -1.264 l
+h
+67.351 -1.324 m
+67.094 -1.324 66.866 -1.287 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.728 65.867 -0.537 65.778 -0.31 c
+65.697 -0.085 65.661 0.18 65.661 0.484 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.741 66.175 1.881 c
+66.341 2.017 66.528 2.117 66.734 2.175 c
+66.94 2.241 67.149 2.277 67.366 2.277 c
+67.638 2.277 67.873 2.227 68.072 2.131 c
+68.277 2.042 68.443 1.911 68.571 1.734 c
+68.707 1.565 68.807 1.359 68.865 1.117 c
+68.932 0.881 68.968 0.617 68.968 0.323 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.161 66.617 0.022 66.646 -0.103 c
+66.682 -0.232 66.738 -0.346 66.808 -0.441 c
+66.873 -0.53 66.958 -0.599 67.058 -0.647 c
+67.153 -0.699 67.267 -0.721 67.396 -0.721 c
+67.55 -0.721 67.689 -0.688 67.807 -0.618 c
+67.932 -0.551 68.02 -0.449 68.072 -0.31 c
+68.909 -0.383 l
+68.88 -0.482 68.824 -0.588 68.747 -0.706 c
+68.666 -0.817 68.564 -0.919 68.439 -1.015 c
+68.321 -1.103 68.167 -1.176 67.983 -1.235 c
+67.807 -1.294 67.594 -1.324 67.351 -1.324 c
+67.351 1.705 m
+67.263 1.705 67.175 1.69 67.087 1.66 c
+66.999 1.631 66.918 1.579 66.852 1.514 c
+66.782 1.444 66.723 1.356 66.675 1.249 c
+66.634 1.138 66.617 1.014 66.617 0.866 c
+68.086 0.866 l
+68.086 1.003 68.061 1.124 68.013 1.234 c
+67.972 1.341 67.918 1.429 67.851 1.499 c
+67.793 1.565 67.719 1.616 67.631 1.646 c
+67.542 1.683 67.447 1.705 67.351 1.705 c
+70.221 -2.631 m
+70.221 -2.014 l
+71.294 -2.014 l
+71.294 2.896 l
+70.221 2.896 l
+70.221 3.513 l
+72.147 3.513 l
+72.147 -2.631 l
+h
+78.729 -2.631 m
+78.729 3.513 l
+80.654 3.513 l
+80.654 2.896 l
+79.581 2.896 l
+79.581 -2.014 l
+80.654 -2.014 l
+80.654 -2.631 l
+h
+83.598 -1.324 m
+83.311 -1.324 83.068 -1.283 82.862 -1.206 c
+82.657 -1.118 82.484 -0.996 82.348 -0.838 c
+82.208 -0.684 82.106 -0.497 82.039 -0.279 c
+81.969 -0.056 81.937 0.191 81.937 0.455 c
+81.937 0.749 81.969 1.007 82.039 1.234 c
+82.116 1.458 82.223 1.646 82.363 1.793 c
+82.509 1.947 82.686 2.065 82.892 2.146 c
+83.097 2.234 83.333 2.277 83.598 2.277 c
+83.822 2.277 84.024 2.248 84.2 2.19 c
+84.377 2.131 84.527 2.046 84.656 1.94 c
+84.78 1.841 84.884 1.72 84.965 1.572 c
+85.042 1.433 85.096 1.282 85.127 1.117 c
+84.215 1.072 l
+84.186 1.249 84.115 1.389 84.009 1.499 c
+83.91 1.606 83.766 1.66 83.583 1.66 c
+83.336 1.66 83.16 1.558 83.053 1.352 c
+82.943 1.153 82.892 0.866 82.892 0.484 c
+82.892 -0.31 83.128 -0.706 83.598 -0.706 c
+83.763 -0.706 83.906 -0.655 84.024 -0.545 c
+84.142 -0.437 84.215 -0.276 84.244 -0.059 c
+85.156 -0.103 l
+85.127 -0.273 85.071 -0.427 84.994 -0.574 c
+84.924 -0.721 84.821 -0.853 84.685 -0.971 c
+84.556 -1.081 84.398 -1.169 84.215 -1.235 c
+84.038 -1.294 83.833 -1.324 83.598 -1.324 c
+89.304 0.484 m
+89.304 0.209 89.268 -0.04 89.202 -0.265 c
+89.131 -0.482 89.029 -0.669 88.892 -0.823 c
+88.753 -0.981 88.577 -1.103 88.364 -1.191 c
+88.147 -1.279 87.893 -1.324 87.599 -1.324 c
+87.323 -1.324 87.078 -1.279 86.864 -1.191 c
+86.658 -1.103 86.486 -0.981 86.35 -0.823 c
+86.21 -0.669 86.108 -0.482 86.041 -0.265 c
+85.971 -0.04 85.938 0.209 85.938 0.484 c
+85.938 0.738 85.968 0.974 86.027 1.19 c
+86.093 1.414 86.195 1.606 86.335 1.764 c
+86.471 1.928 86.648 2.057 86.864 2.146 c
+87.078 2.234 87.335 2.277 87.629 2.277 c
+87.941 2.277 88.202 2.234 88.408 2.146 c
+88.62 2.057 88.794 1.928 88.922 1.764 c
+89.058 1.606 89.158 1.414 89.216 1.19 c
+89.275 0.974 89.304 0.738 89.304 0.484 c
+88.349 0.484 m
+88.349 0.69 88.334 0.866 88.304 1.014 c
+88.283 1.161 88.246 1.282 88.187 1.381 c
+88.128 1.477 88.055 1.547 87.967 1.587 c
+87.878 1.635 87.768 1.66 87.643 1.66 c
+87.379 1.66 87.188 1.562 87.07 1.367 c
+86.953 1.179 86.893 0.885 86.893 0.484 c
+86.893 0.062 86.953 -0.243 87.07 -0.427 c
+87.188 -0.614 87.364 -0.706 87.599 -0.706 c
+87.724 -0.706 87.838 -0.688 87.938 -0.647 c
+88.033 -0.599 88.113 -0.526 88.173 -0.427 c
+88.239 -0.331 88.283 -0.206 88.304 -0.059 c
+88.334 0.087 88.349 0.268 88.349 0.484 c
+91.321 -1.264 m
+91.321 0.852 l
+91.321 1.018 91.315 1.153 91.307 1.263 c
+91.296 1.371 91.278 1.454 91.248 1.514 c
+91.226 1.579 91.197 1.631 91.16 1.66 c
+91.13 1.69 91.09 1.705 91.043 1.705 c
+90.984 1.705 90.929 1.675 90.881 1.616 c
+90.841 1.565 90.808 1.491 90.778 1.396 c
+90.748 1.308 90.723 1.194 90.704 1.058 c
+90.694 0.918 90.69 0.768 90.69 0.602 c
+90.69 -1.264 l
+89.94 -1.264 l
+89.94 1.469 l
+89.94 1.705 l
+89.94 1.925 l
+89.94 2.002 89.933 2.065 89.925 2.117 c
+89.925 2.219 l
+90.602 2.219 l
+90.602 2.131 l
+90.602 1.984 l
+90.609 1.925 90.616 1.866 90.616 1.807 c
+90.616 1.646 l
+90.631 1.646 l
+90.65 1.734 90.679 1.811 90.719 1.881 c
+90.756 1.959 90.8 2.028 90.851 2.087 c
+90.91 2.146 90.976 2.19 91.057 2.219 c
+91.134 2.256 91.223 2.277 91.321 2.277 c
+91.506 2.277 91.645 2.223 91.733 2.117 c
+91.829 2.017 91.899 1.859 91.939 1.646 c
+91.954 1.646 l
+91.99 1.741 92.031 1.83 92.071 1.911 c
+92.119 1.988 92.175 2.05 92.233 2.102 c
+92.292 2.16 92.358 2.204 92.439 2.234 c
+92.516 2.263 92.604 2.277 92.703 2.277 c
+92.84 2.277 92.954 2.252 93.042 2.204 c
+93.129 2.153 93.196 2.079 93.247 1.984 c
+93.306 1.884 93.343 1.756 93.365 1.602 c
+93.395 1.454 93.409 1.271 93.409 1.058 c
+93.409 -1.264 l
+92.689 -1.264 l
+92.689 0.852 l
+92.689 1.018 92.682 1.153 92.674 1.263 c
+92.663 1.371 92.645 1.454 92.616 1.514 c
+92.593 1.579 92.564 1.631 92.527 1.66 c
+92.497 1.69 92.458 1.705 92.41 1.705 c
+92.292 1.705 92.196 1.616 92.13 1.44 c
+92.071 1.271 92.042 1.014 92.042 0.661 c
+92.042 -1.264 l
+h
+95.383 -1.264 m
+95.383 0.852 l
+95.383 1.018 95.375 1.153 95.367 1.263 c
+95.357 1.371 95.338 1.454 95.309 1.514 c
+95.287 1.579 95.257 1.631 95.221 1.66 c
+95.192 1.69 95.151 1.705 95.103 1.705 c
+95.045 1.705 94.989 1.675 94.941 1.616 c
+94.901 1.565 94.868 1.491 94.839 1.396 c
+94.81 1.308 94.783 1.194 94.765 1.058 c
+94.754 0.918 94.75 0.768 94.75 0.602 c
+94.75 -1.264 l
+94.001 -1.264 l
+94.001 1.469 l
+94.001 1.705 l
+94.001 1.925 l
+94.001 2.002 93.993 2.065 93.986 2.117 c
+93.986 2.219 l
+94.662 2.219 l
+94.662 2.131 l
+94.662 1.984 l
+94.669 1.925 94.677 1.866 94.677 1.807 c
+94.677 1.646 l
+94.692 1.646 l
+94.71 1.734 94.739 1.811 94.78 1.881 c
+94.816 1.959 94.86 2.028 94.912 2.087 c
+94.97 2.146 95.037 2.19 95.118 2.219 c
+95.195 2.256 95.283 2.277 95.383 2.277 c
+95.566 2.277 95.706 2.223 95.794 2.117 c
+95.89 2.017 95.959 1.859 96 1.646 c
+96.015 1.646 l
+96.051 1.741 96.092 1.83 96.132 1.911 c
+96.18 1.988 96.235 2.05 96.294 2.102 c
+96.352 2.16 96.418 2.204 96.499 2.234 c
+96.576 2.263 96.665 2.277 96.764 2.277 c
+96.9 2.277 97.014 2.252 97.102 2.204 c
+97.191 2.153 97.256 2.079 97.308 1.984 c
+97.367 1.884 97.403 1.756 97.426 1.602 c
+97.455 1.454 97.47 1.271 97.47 1.058 c
+97.47 -1.264 l
+96.749 -1.264 l
+96.749 0.852 l
+96.749 1.018 96.742 1.153 96.734 1.263 c
+96.724 1.371 96.705 1.454 96.676 1.514 c
+96.653 1.579 96.624 1.631 96.588 1.66 c
+96.558 1.69 96.518 1.705 96.47 1.705 c
+96.352 1.705 96.257 1.616 96.191 1.44 c
+96.132 1.271 96.103 1.014 96.103 0.661 c
+96.103 -1.264 l
+h
+100.387 -0.647 m
+101.519 -0.647 l
+101.519 -1.264 l
+98.212 -1.264 l
+98.212 -0.647 l
+99.476 -0.647 l
+99.476 1.602 l
+98.55 1.602 l
+98.55 2.219 l
+100.387 2.219 l
+h
+99.476 3.513 0.912 -0.676 re
+99.476 2.836 m
+102.949 1.602 m
+102.405 1.602 l
+102.405 2.219 l
+102.993 2.219 l
+103.272 3.116 l
+103.845 3.116 l
+103.845 2.219 l
+105.081 2.219 l
+105.081 1.602 l
+103.845 1.602 l
+103.845 -0.103 l
+103.845 -0.324 l
+103.853 -0.393 103.875 -0.456 103.905 -0.515 c
+103.941 -0.566 103.996 -0.611 104.066 -0.647 c
+104.143 -0.676 104.257 -0.691 104.404 -0.691 c
+104.54 -0.691 104.676 -0.688 104.815 -0.676 c
+104.952 -0.659 105.083 -0.632 105.212 -0.603 c
+105.212 -1.206 l
+105.131 -1.216 105.054 -1.231 104.977 -1.25 c
+104.896 -1.261 104.819 -1.268 104.742 -1.279 c
+104.661 -1.287 104.573 -1.294 104.478 -1.294 c
+104.389 -1.301 104.29 -1.309 104.183 -1.309 c
+103.996 -1.309 103.834 -1.294 103.699 -1.264 c
+103.57 -1.228 103.456 -1.183 103.36 -1.133 c
+103.272 -1.085 103.199 -1.025 103.14 -0.956 c
+103.081 -0.879 103.037 -0.802 103.007 -0.721 c
+102.978 -0.632 102.956 -0.545 102.949 -0.456 c
+102.938 -0.36 102.934 -0.265 102.934 -0.177 c
+h
+113.569 -0.25 m
+113.569 -0.42 113.528 -0.57 113.451 -0.706 c
+113.382 -0.834 113.278 -0.948 113.143 -1.044 c
+113.014 -1.133 112.852 -1.202 112.657 -1.25 c
+112.47 -1.297 112.253 -1.324 112.011 -1.324 c
+111.782 -1.324 111.585 -1.309 111.408 -1.279 c
+111.232 -1.25 111.074 -1.202 110.938 -1.133 c
+110.798 -1.056 110.687 -0.956 110.6 -0.838 c
+110.511 -0.721 110.442 -0.574 110.394 -0.397 c
+111.202 -0.279 l
+111.221 -0.379 111.25 -0.456 111.29 -0.515 c
+111.338 -0.574 111.397 -0.618 111.467 -0.647 c
+111.533 -0.676 111.614 -0.703 111.702 -0.721 c
+111.79 -0.732 111.893 -0.736 112.011 -0.736 c
+112.106 -0.736 112.202 -0.732 112.29 -0.721 c
+112.378 -0.703 112.455 -0.676 112.526 -0.647 c
+112.591 -0.618 112.643 -0.581 112.672 -0.53 c
+112.709 -0.482 112.731 -0.42 112.731 -0.339 c
+112.731 -0.243 112.702 -0.169 112.643 -0.118 c
+112.591 -0.071 112.526 -0.03 112.437 0 c
+112.349 0.037 112.239 0.066 112.114 0.087 c
+111.996 0.118 111.863 0.147 111.717 0.176 c
+111.577 0.213 111.437 0.253 111.29 0.294 c
+111.151 0.341 111.026 0.404 110.908 0.484 c
+110.798 0.562 110.71 0.661 110.644 0.779 c
+110.574 0.897 110.541 1.047 110.541 1.234 c
+110.541 1.389 110.57 1.531 110.629 1.66 c
+110.695 1.797 110.791 1.911 110.908 1.999 c
+111.034 2.087 111.192 2.153 111.379 2.204 c
+111.562 2.252 111.776 2.277 112.011 2.277 c
+112.194 2.277 112.371 2.256 112.54 2.219 c
+112.705 2.19 112.852 2.135 112.981 2.057 c
+113.106 1.988 113.216 1.888 113.305 1.764 c
+113.392 1.646 113.451 1.502 113.48 1.337 c
+112.686 1.263 l
+112.665 1.341 112.636 1.404 112.599 1.454 c
+112.559 1.514 112.511 1.558 112.451 1.587 c
+112.4 1.624 112.337 1.649 112.26 1.66 c
+112.179 1.668 112.099 1.675 112.011 1.675 c
+111.794 1.675 111.632 1.646 111.526 1.587 c
+111.416 1.535 111.364 1.448 111.364 1.323 c
+111.364 1.242 111.383 1.179 111.423 1.132 c
+111.47 1.08 111.533 1.043 111.614 1.014 c
+111.702 0.984 111.797 0.955 111.908 0.926 c
+112.015 0.903 112.136 0.881 112.275 0.852 c
+112.43 0.823 112.588 0.783 112.746 0.735 c
+112.9 0.683 113.039 0.621 113.157 0.544 c
+113.274 0.463 113.37 0.359 113.451 0.235 c
+113.528 0.106 113.569 -0.056 113.569 -0.25 c
+115.425 1.514 m
+115.543 1.786 115.693 1.984 115.88 2.102 c
+116.064 2.219 116.285 2.277 116.542 2.277 c
+116.748 2.277 116.917 2.241 117.056 2.175 c
+117.203 2.105 117.313 2.013 117.394 1.896 c
+117.482 1.778 117.542 1.635 117.571 1.469 c
+117.607 1.3 117.629 1.124 117.629 0.941 c
+117.629 -1.264 l
+116.718 -1.264 l
+116.718 0.735 l
+116.718 0.87 116.707 0.992 116.688 1.102 c
+116.678 1.209 116.652 1.296 116.615 1.367 c
+116.575 1.444 116.516 1.502 116.439 1.543 c
+116.369 1.579 116.277 1.602 116.16 1.602 c
+116.05 1.602 115.954 1.576 115.865 1.529 c
+115.778 1.477 115.697 1.411 115.63 1.323 c
+115.572 1.234 115.52 1.124 115.483 0.999 c
+115.454 0.881 115.439 0.749 115.439 0.602 c
+115.439 -1.264 l
+114.527 -1.264 l
+114.527 3.513 l
+115.439 3.513 l
+115.439 2.204 l
+115.439 2.135 115.432 2.065 115.425 1.999 c
+115.425 1.793 l
+115.425 1.734 115.417 1.679 115.41 1.631 c
+115.41 1.514 l
+h
+119.547 -1.324 m
+119.379 -1.324 119.228 -1.301 119.092 -1.264 c
+118.963 -1.216 118.849 -1.147 118.754 -1.058 c
+118.666 -0.971 118.596 -0.864 118.548 -0.736 c
+118.496 -0.599 118.475 -0.449 118.475 -0.279 c
+118.475 -0.074 118.508 0.095 118.577 0.235 c
+118.643 0.382 118.739 0.492 118.857 0.573 c
+118.982 0.661 119.125 0.723 119.283 0.764 c
+119.449 0.801 119.624 0.826 119.813 0.837 c
+120.532 0.852 l
+120.532 1.028 l
+120.532 1.146 120.522 1.249 120.503 1.337 c
+120.481 1.425 120.448 1.491 120.401 1.543 c
+120.36 1.602 120.312 1.639 120.253 1.66 c
+120.195 1.679 120.129 1.69 120.062 1.69 c
+119.992 1.69 119.93 1.679 119.871 1.66 c
+119.819 1.649 119.772 1.624 119.724 1.587 c
+119.684 1.558 119.651 1.506 119.622 1.44 c
+119.599 1.381 119.584 1.3 119.577 1.205 c
+118.637 1.249 l
+118.666 1.396 118.71 1.531 118.768 1.66 c
+118.835 1.786 118.93 1.896 119.048 1.984 c
+119.165 2.079 119.306 2.153 119.474 2.204 c
+119.651 2.252 119.857 2.277 120.092 2.277 c
+120.532 2.277 120.863 2.167 121.091 1.955 c
+121.326 1.749 121.444 1.44 121.444 1.028 c
+121.444 -0.235 l
+121.444 -0.456 l
+121.451 -0.515 121.465 -0.57 121.488 -0.618 c
+121.506 -0.659 121.536 -0.691 121.576 -0.721 c
+121.613 -0.743 121.664 -0.75 121.723 -0.75 c
+121.789 -0.75 121.859 -0.746 121.929 -0.736 c
+121.929 -1.22 l
+121.87 -1.231 121.815 -1.243 121.767 -1.25 c
+121.727 -1.261 121.687 -1.268 121.65 -1.279 c
+121.609 -1.287 121.565 -1.294 121.517 -1.294 c
+121.465 -1.301 121.407 -1.309 121.341 -1.309 c
+121.113 -1.309 120.948 -1.257 120.841 -1.147 c
+120.731 -1.029 120.669 -0.864 120.65 -0.647 c
+120.636 -0.647 l
+120.565 -0.757 120.496 -0.853 120.43 -0.941 c
+120.36 -1.022 120.283 -1.088 120.195 -1.147 c
+120.106 -1.206 120.007 -1.25 119.9 -1.279 c
+119.801 -1.309 119.684 -1.324 119.547 -1.324 c
+120.532 0.353 m
+120.106 0.338 l
+120.007 0.338 119.915 0.33 119.827 0.323 c
+119.746 0.312 119.68 0.286 119.622 0.249 c
+119.562 0.209 119.511 0.151 119.474 0.073 c
+119.433 0.003 119.416 -0.088 119.416 -0.206 c
+119.416 -0.375 119.449 -0.497 119.518 -0.574 c
+119.584 -0.655 119.684 -0.691 119.813 -0.691 c
+119.919 -0.691 120.018 -0.669 120.106 -0.618 c
+120.202 -0.57 120.283 -0.508 120.341 -0.427 c
+120.407 -0.35 120.459 -0.262 120.488 -0.162 c
+120.518 -0.056 120.532 0.058 120.532 0.176 c
+h
+123.02 -2.631 m
+123.02 -2.014 l
+124.093 -2.014 l
+124.093 2.896 l
+123.02 2.896 l
+123.02 3.513 l
+124.946 3.513 l
+124.946 -2.631 l
+h
+f
+Q
+q 1 0 0 1 368.1085 380.8423 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.484 -1.323 c
+-0.779 -1.627 -1.198 -1.778 -1.734 -1.778 c
+-2.263 -1.778 -2.69 -1.58 -3.013 -1.176 c
+-3.329 -0.764 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.47 l
+-3.484 2.165 -3.322 2.712 -2.998 3.117 c
+-2.675 3.516 -2.23 3.719 -1.66 3.719 c
+-1.153 3.719 -0.756 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.691 1.926 l
+-0.72 2.367 -0.816 2.679 -0.97 2.866 c
+-1.117 3.05 -1.348 3.146 -1.66 3.146 c
+-2.036 3.146 -2.318 2.999 -2.513 2.705 c
+-2.711 2.418 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.07 -2.715 -0.484 -2.528 -0.779 c
+-2.344 -1.066 -2.079 -1.205 -1.734 -1.205 c
+-1.381 -1.205 -1.128 -1.117 -0.97 -0.941 c
+-0.816 -0.764 -0.72 -0.452 -0.691 0 c
+h
+2.455 1.661 m
+2.367 1.679 2.268 1.691 2.161 1.691 c
+1.827 1.691 1.592 1.507 1.455 1.147 c
+1.455 -1.705 l
+0.809 -1.705 l
+0.809 2.278 l
+1.441 2.278 l
+1.455 1.867 l
+1.632 2.19 1.875 2.352 2.191 2.352 c
+2.297 2.352 2.386 2.33 2.455 2.294 c
+h
+4.454 -1.778 m
+3.955 -1.778 3.572 -1.631 3.308 -1.338 c
+3.043 -1.043 2.911 -0.61 2.911 -0.029 c
+2.911 0.441 l
+2.911 1.037 3.036 1.503 3.293 1.837 c
+3.558 2.18 3.918 2.352 4.381 2.352 c
+4.84 2.352 5.182 2.198 5.409 1.897 c
+5.644 1.602 5.766 1.139 5.777 0.515 c
+5.777 0.088 l
+3.558 0.088 l
+3.558 0 l
+3.558 -0.434 3.635 -0.746 3.793 -0.941 c
+3.959 -1.128 4.19 -1.22 4.484 -1.22 c
+4.678 -1.22 4.851 -1.187 4.998 -1.117 c
+5.145 -1.04 5.281 -0.922 5.409 -0.764 c
+5.748 -1.176 l
+5.461 -1.58 5.031 -1.778 4.454 -1.778 c
+4.381 1.793 m
+4.105 1.793 3.903 1.698 3.778 1.515 c
+3.649 1.326 3.576 1.037 3.558 0.647 c
+5.131 0.647 l
+5.131 0.735 l
+5.108 1.118 5.042 1.386 4.925 1.544 c
+4.807 1.709 4.624 1.793 4.381 1.793 c
+8.599 -1.705 m
+8.559 -1.617 8.533 -1.469 8.526 -1.264 c
+8.291 -1.61 7.996 -1.778 7.643 -1.778 c
+7.28 -1.778 6.997 -1.683 6.791 -1.484 c
+6.593 -1.278 6.498 -0.992 6.498 -0.617 c
+6.498 -0.216 6.633 0.103 6.909 0.339 c
+7.181 0.58 7.556 0.706 8.026 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.456 1.532 8.349 1.632 c
+8.239 1.738 8.077 1.793 7.865 1.793 c
+7.666 1.793 7.504 1.735 7.379 1.617 c
+7.262 1.5 7.203 1.353 7.203 1.176 c
+6.556 1.176 l
+6.556 1.371 6.615 1.562 6.733 1.75 c
+6.858 1.933 7.019 2.08 7.217 2.19 c
+7.423 2.297 7.651 2.352 7.909 2.352 c
+8.309 2.352 8.614 2.249 8.819 2.043 c
+9.033 1.837 9.147 1.544 9.158 1.162 c
+9.158 -0.852 l
+9.158 -1.157 9.195 -1.422 9.276 -1.646 c
+9.276 -1.705 l
+h
+7.732 -1.19 m
+7.897 -1.19 8.048 -1.147 8.188 -1.058 c
+8.335 -0.97 8.441 -0.86 8.511 -0.72 c
+8.511 0.221 l
+8.144 0.221 l
+7.828 0.221 7.585 0.151 7.408 0.015 c
+7.232 -0.114 7.144 -0.301 7.144 -0.544 c
+7.144 -0.771 7.188 -0.937 7.277 -1.043 c
+7.365 -1.143 7.516 -1.19 7.732 -1.19 c
+11.01 3.234 m
+11.01 2.278 l
+11.612 2.278 l
+11.612 1.75 l
+11.01 1.75 l
+11.01 -0.72 l
+11.01 -0.878 11.032 -0.995 11.084 -1.072 c
+11.142 -1.153 11.231 -1.19 11.348 -1.19 c
+11.437 -1.19 11.524 -1.176 11.612 -1.147 c
+11.612 -1.705 l
+11.466 -1.753 11.311 -1.778 11.157 -1.778 c
+10.899 -1.778 10.705 -1.687 10.569 -1.5 c
+10.429 -1.315 10.363 -1.055 10.363 -0.72 c
+10.363 1.75 l
+9.76 1.75 l
+9.76 2.278 l
+10.363 2.278 l
+10.363 3.234 l
+h
+13.803 -1.778 m
+13.303 -1.778 12.921 -1.631 12.657 -1.338 c
+12.391 -1.043 12.26 -0.61 12.26 -0.029 c
+12.26 0.441 l
+12.26 1.037 12.385 1.503 12.642 1.837 c
+12.906 2.18 13.266 2.352 13.729 2.352 c
+14.188 2.352 14.531 2.198 14.758 1.897 c
+14.993 1.602 15.115 1.139 15.126 0.515 c
+15.126 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.307 -1.128 13.538 -1.22 13.833 -1.22 c
+14.027 -1.22 14.199 -1.187 14.346 -1.117 c
+14.494 -1.04 14.629 -0.922 14.758 -0.764 c
+15.096 -1.176 l
+14.81 -1.58 14.38 -1.778 13.803 -1.778 c
+13.729 1.793 m
+13.453 1.793 13.251 1.698 13.127 1.515 c
+12.998 1.326 12.925 1.037 12.906 0.647 c
+14.479 0.647 l
+14.479 0.735 l
+14.457 1.118 14.39 1.386 14.273 1.544 c
+14.155 1.709 13.972 1.793 13.729 1.793 c
+19.668 -1.705 m
+19.628 -1.617 19.601 -1.469 19.595 -1.264 c
+19.359 -1.61 19.065 -1.778 18.712 -1.778 c
+18.348 -1.778 18.066 -1.683 17.86 -1.484 c
+17.661 -1.278 17.565 -0.992 17.565 -0.617 c
+17.565 -0.216 17.702 0.103 17.978 0.339 c
+18.249 0.58 18.624 0.706 19.094 0.706 c
+19.58 0.706 l
+19.58 1.132 l
+19.58 1.367 19.524 1.532 19.418 1.632 c
+19.308 1.738 19.146 1.793 18.932 1.793 c
+18.735 1.793 18.573 1.735 18.448 1.617 c
+18.33 1.5 18.271 1.353 18.271 1.176 c
+17.625 1.176 l
+17.625 1.371 17.683 1.562 17.801 1.75 c
+17.926 1.933 18.088 2.08 18.286 2.19 c
+18.492 2.297 18.72 2.352 18.977 2.352 c
+19.377 2.352 19.682 2.249 19.888 2.043 c
+20.102 1.837 20.216 1.544 20.226 1.162 c
+20.226 -0.852 l
+20.226 -1.157 20.263 -1.422 20.343 -1.646 c
+20.343 -1.705 l
+h
+18.801 -1.19 m
+18.966 -1.19 19.117 -1.147 19.256 -1.058 c
+19.403 -0.97 19.51 -0.86 19.58 -0.72 c
+19.58 0.221 l
+19.212 0.221 l
+18.896 0.221 18.654 0.151 18.477 0.015 c
+18.301 -0.114 18.213 -0.301 18.213 -0.544 c
+18.213 -0.771 18.257 -0.937 18.344 -1.043 c
+18.433 -1.143 18.583 -1.19 18.801 -1.19 c
+23.798 3.234 m
+23.798 2.278 l
+24.401 2.278 l
+24.401 1.75 l
+23.798 1.75 l
+23.798 -0.72 l
+23.798 -0.878 23.82 -0.995 23.871 -1.072 c
+23.931 -1.153 24.019 -1.19 24.137 -1.19 c
+24.224 -1.19 24.312 -1.176 24.401 -1.147 c
+24.401 -1.705 l
+24.254 -1.753 24.1 -1.778 23.946 -1.778 c
+23.688 -1.778 23.493 -1.687 23.358 -1.5 c
+23.217 -1.315 23.152 -1.055 23.152 -0.72 c
+23.152 1.75 l
+22.549 1.75 l
+22.549 2.278 l
+23.152 2.278 l
+23.152 3.234 l
+h
+27.208 -1.705 m
+27.168 -1.617 27.142 -1.469 27.135 -1.264 c
+26.899 -1.61 26.606 -1.778 26.253 -1.778 c
+25.889 -1.778 25.606 -1.683 25.4 -1.484 c
+25.202 -1.278 25.106 -0.992 25.106 -0.617 c
+25.106 -0.216 25.242 0.103 25.518 0.339 c
+25.79 0.58 26.165 0.706 26.635 0.706 c
+27.121 0.706 l
+27.121 1.132 l
+27.121 1.367 27.065 1.532 26.959 1.632 c
+26.849 1.738 26.687 1.793 26.473 1.793 c
+26.275 1.793 26.113 1.735 25.988 1.617 c
+25.87 1.5 25.812 1.353 25.812 1.176 c
+25.165 1.176 l
+25.165 1.371 25.224 1.562 25.342 1.75 c
+25.467 1.933 25.629 2.08 25.827 2.19 c
+26.032 2.297 26.261 2.352 26.518 2.352 c
+26.918 2.352 27.223 2.249 27.429 2.043 c
+27.642 1.837 27.756 1.544 27.767 1.162 c
+27.767 -0.852 l
+27.767 -1.157 27.804 -1.422 27.884 -1.646 c
+27.884 -1.705 l
+h
+26.341 -1.19 m
+26.506 -1.19 26.657 -1.147 26.797 -1.058 c
+26.944 -0.97 27.05 -0.86 27.121 -0.72 c
+27.121 0.221 l
+26.753 0.221 l
+26.437 0.221 26.194 0.151 26.018 0.015 c
+25.841 -0.114 25.753 -0.301 25.753 -0.544 c
+25.753 -0.771 25.797 -0.937 25.885 -1.043 c
+25.974 -1.143 26.124 -1.19 26.341 -1.19 c
+28.634 0.47 m
+28.634 1.087 28.744 1.551 28.972 1.867 c
+29.197 2.19 29.531 2.352 29.972 2.352 c
+30.373 2.352 30.677 2.176 30.884 1.823 c
+30.927 2.278 l
+31.515 2.278 l
+31.515 -1.749 l
+31.515 -2.238 31.387 -2.616 31.133 -2.881 c
+30.876 -3.146 30.523 -3.278 30.074 -3.278 c
+29.876 -3.278 29.656 -3.227 29.413 -3.131 c
+29.167 -3.032 28.987 -2.911 28.869 -2.763 c
+29.134 -2.323 l
+29.398 -2.587 29.696 -2.719 30.03 -2.719 c
+30.567 -2.719 30.843 -2.425 30.853 -1.837 c
+30.853 -1.308 l
+30.648 -1.624 30.346 -1.778 29.957 -1.778 c
+29.546 -1.778 29.222 -1.627 28.987 -1.323 c
+28.759 -1.01 28.642 -0.559 28.634 0.029 c
+h
+29.296 0.088 m
+29.296 -0.353 29.359 -0.683 29.487 -0.897 c
+29.612 -1.103 29.829 -1.205 30.134 -1.205 c
+30.456 -1.205 30.695 -1.04 30.853 -0.706 c
+30.853 1.279 l
+30.685 1.602 30.446 1.764 30.134 1.764 c
+29.839 1.764 29.623 1.661 29.487 1.455 c
+29.359 1.249 29.296 0.927 29.296 0.485 c
+h
+34.059 0.47 m
+34.059 1.047 34.194 1.503 34.47 1.837 c
+34.753 2.18 35.123 2.352 35.587 2.352 c
+36.046 2.352 36.414 2.182 36.689 1.852 c
+36.972 1.529 37.12 1.081 37.13 0.515 c
+37.13 0.088 l
+37.13 -0.482 36.987 -0.937 36.704 -1.278 c
+36.428 -1.613 36.06 -1.778 35.601 -1.778 c
+35.138 -1.778 34.768 -1.617 34.485 -1.293 c
+34.209 -0.962 34.065 -0.522 34.059 0.029 c
+h
+34.705 0.088 m
+34.705 -0.316 34.782 -0.632 34.94 -0.867 c
+35.106 -1.103 35.326 -1.22 35.601 -1.22 c
+36.168 -1.22 36.461 -0.808 36.484 0.015 c
+36.484 0.47 l
+36.484 0.871 36.399 1.191 36.233 1.426 c
+36.075 1.669 35.859 1.793 35.587 1.793 c
+35.322 1.793 35.106 1.669 34.94 1.426 c
+34.782 1.191 34.705 0.871 34.705 0.47 c
+h
+40.849 0.088 m
+40.849 -0.529 40.735 -0.995 40.511 -1.308 c
+40.294 -1.624 39.971 -1.778 39.541 -1.778 c
+39.118 -1.778 38.805 -1.598 38.6 -1.234 c
+38.57 -1.705 l
+37.968 -1.705 l
+37.968 3.94 l
+38.615 3.94 l
+38.615 1.837 l
+38.828 2.18 39.137 2.352 39.541 2.352 c
+39.971 2.352 40.294 2.194 40.511 1.882 c
+40.735 1.577 40.849 1.11 40.849 0.485 c
+h
+40.202 0.47 m
+40.202 0.941 40.133 1.272 39.996 1.47 c
+39.868 1.665 39.659 1.764 39.364 1.764 c
+39.03 1.764 38.78 1.58 38.615 1.22 c
+38.615 -0.661 l
+38.78 -1.025 39.034 -1.205 39.379 -1.205 c
+39.673 -1.205 39.883 -1.103 40.012 -0.897 c
+40.137 -0.69 40.202 -0.374 40.202 0.059 c
+h
+42.348 2.278 m
+42.348 -2.205 l
+42.348 -2.94 42.059 -3.307 41.481 -3.307 c
+41.342 -3.307 41.22 -3.285 41.114 -3.248 c
+41.114 -2.705 l
+41.184 -2.723 41.268 -2.734 41.378 -2.734 c
+41.485 -2.734 41.562 -2.69 41.614 -2.601 c
+41.672 -2.521 41.702 -2.381 41.702 -2.175 c
+41.702 2.278 l
+h
+42.377 3.322 m
+42.377 3.212 42.348 3.12 42.29 3.043 c
+42.231 2.973 42.136 2.94 42.011 2.94 c
+41.893 2.94 41.797 2.973 41.731 3.043 c
+41.672 3.12 41.643 3.212 41.643 3.322 c
+41.643 3.439 41.672 3.532 41.731 3.601 c
+41.797 3.678 41.893 3.719 42.011 3.719 c
+42.136 3.719 42.231 3.678 42.29 3.601 c
+42.348 3.52 42.377 3.429 42.377 3.322 c
+44.803 -1.778 m
+44.303 -1.778 43.921 -1.631 43.657 -1.338 c
+43.392 -1.043 43.26 -0.61 43.26 -0.029 c
+43.26 0.441 l
+43.26 1.037 43.385 1.503 43.642 1.837 c
+43.906 2.18 44.266 2.352 44.729 2.352 c
+45.189 2.352 45.531 2.198 45.758 1.897 c
+45.994 1.602 46.115 1.139 46.126 0.515 c
+46.126 0.088 l
+43.906 0.088 l
+43.906 0 l
+43.906 -0.434 43.983 -0.746 44.141 -0.941 c
+44.307 -1.128 44.538 -1.22 44.833 -1.22 c
+45.028 -1.22 45.2 -1.187 45.347 -1.117 c
+45.494 -1.04 45.63 -0.922 45.758 -0.764 c
+46.096 -1.176 l
+45.81 -1.58 45.38 -1.778 44.803 -1.778 c
+44.729 1.793 m
+44.454 1.793 44.252 1.698 44.127 1.515 c
+43.998 1.326 43.925 1.037 43.906 0.647 c
+45.479 0.647 l
+45.479 0.735 l
+45.457 1.118 45.391 1.386 45.273 1.544 c
+45.155 1.709 44.972 1.793 44.729 1.793 c
+48.287 -1.22 m
+48.5 -1.22 48.673 -1.157 48.801 -1.029 c
+48.937 -0.893 49.011 -0.702 49.022 -0.455 c
+49.639 -0.455 l
+49.617 -0.837 49.481 -1.157 49.228 -1.411 c
+48.97 -1.658 48.658 -1.778 48.287 -1.778 c
+47.794 -1.778 47.42 -1.627 47.155 -1.323 c
+46.898 -1.01 46.773 -0.544 46.773 0.073 c
+46.773 0.515 l
+46.773 1.11 46.898 1.565 47.155 1.882 c
+47.42 2.194 47.794 2.352 48.287 2.352 c
+48.687 2.352 49.007 2.22 49.242 1.955 c
+49.485 1.698 49.617 1.353 49.639 0.912 c
+49.022 0.912 l
+48.999 1.205 48.926 1.426 48.801 1.573 c
+48.683 1.72 48.511 1.793 48.287 1.793 c
+47.993 1.793 47.776 1.694 47.64 1.5 c
+47.501 1.312 47.427 1.004 47.42 0.574 c
+47.42 0.059 l
+47.42 -0.411 47.486 -0.746 47.625 -0.941 c
+47.773 -1.128 47.993 -1.22 48.287 -1.22 c
+51.241 3.234 m
+51.241 2.278 l
+51.844 2.278 l
+51.844 1.75 l
+51.241 1.75 l
+51.241 -0.72 l
+51.241 -0.878 51.264 -0.995 51.314 -1.072 c
+51.374 -1.153 51.462 -1.19 51.58 -1.19 c
+51.667 -1.19 51.756 -1.176 51.844 -1.147 c
+51.844 -1.705 l
+51.697 -1.753 51.543 -1.778 51.388 -1.778 c
+51.131 -1.778 50.936 -1.687 50.8 -1.5 c
+50.661 -1.315 50.595 -1.055 50.595 -0.72 c
+50.595 1.75 l
+49.992 1.75 l
+49.992 2.278 l
+50.595 2.278 l
+50.595 3.234 l
+h
+54.946 2.278 m
+54.96 1.837 l
+55.214 2.18 55.537 2.352 55.931 2.352 c
+56.636 2.352 56.992 1.882 57.003 0.941 c
+57.003 -1.705 l
+56.357 -1.705 l
+56.357 0.912 l
+56.357 1.224 56.301 1.444 56.195 1.573 c
+56.085 1.698 55.931 1.764 55.725 1.764 c
+55.567 1.764 55.42 1.709 55.283 1.602 c
+55.155 1.492 55.052 1.357 54.975 1.191 c
+54.975 -1.705 l
+54.328 -1.705 l
+54.328 2.278 l
+h
+60.016 -1.705 m
+59.976 -1.617 59.95 -1.469 59.943 -1.264 c
+59.708 -1.61 59.414 -1.778 59.061 -1.778 c
+58.697 -1.778 58.414 -1.683 58.208 -1.484 c
+58.011 -1.278 57.915 -0.992 57.915 -0.617 c
+57.915 -0.216 58.051 0.103 58.326 0.339 c
+58.599 0.58 58.973 0.706 59.443 0.706 c
+59.929 0.706 l
+59.929 1.132 l
+59.929 1.367 59.873 1.532 59.767 1.632 c
+59.657 1.738 59.495 1.793 59.282 1.793 c
+59.083 1.793 58.921 1.735 58.796 1.617 c
+58.679 1.5 58.62 1.353 58.62 1.176 c
+57.973 1.176 l
+57.973 1.371 58.032 1.562 58.15 1.75 c
+58.275 1.933 58.437 2.08 58.635 2.19 c
+58.84 2.297 59.069 2.352 59.326 2.352 c
+59.727 2.352 60.031 2.249 60.237 2.043 c
+60.45 1.837 60.564 1.544 60.575 1.162 c
+60.575 -0.852 l
+60.575 -1.157 60.612 -1.422 60.693 -1.646 c
+60.693 -1.705 l
+h
+59.149 -1.19 m
+59.315 -1.19 59.465 -1.147 59.605 -1.058 c
+59.752 -0.97 59.858 -0.86 59.929 -0.72 c
+59.929 0.221 l
+59.561 0.221 l
+59.245 0.221 59.002 0.151 58.826 0.015 c
+58.649 -0.114 58.561 -0.301 58.561 -0.544 c
+58.561 -0.771 58.605 -0.937 58.694 -1.043 c
+58.782 -1.143 58.933 -1.19 59.149 -1.19 c
+62.192 2.278 m
+62.206 1.911 l
+62.449 2.205 62.769 2.352 63.162 2.352 c
+63.603 2.352 63.912 2.153 64.088 1.764 c
+64.342 2.153 64.691 2.352 65.132 2.352 c
+65.867 2.352 66.242 1.889 66.264 0.97 c
+66.264 -1.705 l
+65.617 -1.705 l
+65.617 0.912 l
+65.617 1.205 65.562 1.419 65.456 1.558 c
+65.356 1.694 65.184 1.764 64.941 1.764 c
+64.743 1.764 64.581 1.683 64.456 1.529 c
+64.338 1.382 64.268 1.191 64.25 0.956 c
+64.25 -1.705 l
+63.588 -1.705 l
+63.588 0.941 l
+63.588 1.488 63.368 1.764 62.927 1.764 c
+62.593 1.764 62.358 1.602 62.221 1.279 c
+62.221 -1.705 l
+61.575 -1.705 l
+61.575 2.278 l
+h
+68.66 -1.778 m
+68.16 -1.778 67.777 -1.631 67.513 -1.338 c
+67.249 -1.043 67.116 -0.61 67.116 -0.029 c
+67.116 0.441 l
+67.116 1.037 67.241 1.503 67.498 1.837 c
+67.763 2.18 68.124 2.352 68.586 2.352 c
+69.046 2.352 69.387 2.198 69.615 1.897 c
+69.85 1.602 69.971 1.139 69.983 0.515 c
+69.983 0.088 l
+67.763 0.088 l
+67.763 0 l
+67.763 -0.434 67.84 -0.746 67.999 -0.941 c
+68.164 -1.128 68.395 -1.22 68.689 -1.22 c
+68.884 -1.22 69.057 -1.187 69.204 -1.117 c
+69.35 -1.04 69.487 -0.922 69.615 -0.764 c
+69.953 -1.176 l
+69.666 -1.58 69.237 -1.778 68.66 -1.778 c
+68.586 1.793 m
+68.311 1.793 68.109 1.698 67.983 1.515 c
+67.855 1.326 67.781 1.037 67.763 0.647 c
+69.336 0.647 l
+69.336 0.735 l
+69.314 1.118 69.248 1.386 69.13 1.544 c
+69.013 1.709 68.829 1.793 68.586 1.793 c
+70.63 0.47 m
+70.63 1.077 70.74 1.544 70.967 1.867 c
+71.203 2.19 71.53 2.352 71.952 2.352 c
+72.334 2.352 72.633 2.194 72.849 1.882 c
+72.849 3.94 l
+73.495 3.94 l
+73.495 -1.705 l
+72.907 -1.705 l
+72.864 -1.278 l
+72.658 -1.613 72.353 -1.778 71.952 -1.778 c
+71.54 -1.778 71.218 -1.624 70.983 -1.308 c
+70.747 -0.985 70.63 -0.529 70.63 0.059 c
+h
+71.276 0.088 m
+71.276 -0.353 71.338 -0.683 71.467 -0.897 c
+71.603 -1.103 71.824 -1.205 72.128 -1.205 c
+72.452 -1.205 72.691 -1.043 72.849 -0.72 c
+72.849 1.294 l
+72.68 1.606 72.441 1.764 72.128 1.764 c
+71.824 1.764 71.603 1.661 71.467 1.455 c
+71.338 1.249 71.276 0.927 71.276 0.485 c
+h
+f
+Q
+q 1 0 0 1 445.1757 383.1208 cm
+0 0 m
+0.03 -0.397 l
+0.265 -0.085 0.566 0.073 0.941 0.073 c
+1.625 0.073 1.977 -0.408 1.999 -1.367 c
+1.999 -3.983 l
+0.956 -3.983 l
+0.956 -1.44 l
+0.956 -1.216 0.919 -1.055 0.853 -0.956 c
+0.783 -0.86 0.665 -0.808 0.5 -0.808 c
+0.312 -0.808 0.166 -0.904 0.059 -1.087 c
+0.059 -3.983 l
+-0.985 -3.983 l
+-0.985 0 l
+h
+4.63 -3.983 m
+4.601 -3.925 4.572 -3.821 4.542 -3.675 c
+4.355 -3.932 4.105 -4.056 3.793 -4.056 c
+3.458 -4.056 3.179 -3.95 2.955 -3.734 c
+2.738 -3.509 2.631 -3.219 2.631 -2.866 c
+2.631 -2.454 2.764 -2.138 3.028 -1.911 c
+3.293 -1.675 3.675 -1.558 4.175 -1.558 c
+4.499 -1.558 l
+4.499 -1.234 l
+4.499 -1.058 4.462 -0.937 4.395 -0.867 c
+4.337 -0.79 4.248 -0.75 4.131 -0.75 c
+3.874 -0.75 3.749 -0.904 3.749 -1.205 c
+2.705 -1.205 l
+2.705 -0.834 2.841 -0.529 3.117 -0.294 c
+3.389 -0.052 3.738 0.073 4.16 0.073 c
+4.601 0.073 4.939 -0.044 5.174 -0.279 c
+5.417 -0.507 5.542 -0.831 5.542 -1.249 c
+5.542 -3.116 l
+5.542 -3.462 5.59 -3.73 5.689 -3.925 c
+5.689 -3.983 l
+h
+4.028 -3.233 m
+4.135 -3.233 4.227 -3.215 4.307 -3.175 c
+4.395 -3.127 4.458 -3.069 4.499 -2.998 c
+4.499 -2.175 l
+4.248 -2.175 l
+4.072 -2.175 3.929 -2.234 3.822 -2.352 c
+3.723 -2.462 3.675 -2.609 3.675 -2.793 c
+3.675 -3.087 3.793 -3.233 4.028 -3.233 c
+7.262 0 m
+7.291 -0.368 l
+7.526 -0.073 7.835 0.073 8.217 0.073 c
+8.617 0.073 8.897 -0.11 9.055 -0.47 c
+9.29 -0.11 9.617 0.073 10.04 0.073 c
+10.734 0.073 11.088 -0.411 11.098 -1.382 c
+11.098 -3.983 l
+10.069 -3.983 l
+10.069 -1.44 l
+10.069 -1.216 10.032 -1.055 9.966 -0.956 c
+9.908 -0.86 9.797 -0.808 9.643 -0.808 c
+9.444 -0.808 9.305 -0.926 9.216 -1.161 c
+9.216 -3.983 l
+8.173 -3.983 l
+8.173 -1.455 l
+8.173 -1.22 8.144 -1.055 8.085 -0.956 c
+8.026 -0.86 7.915 -0.808 7.761 -0.808 c
+7.585 -0.808 7.441 -0.904 7.335 -1.087 c
+7.335 -3.983 l
+6.292 -3.983 l
+6.292 0 l
+h
+13.479 -4.056 m
+12.95 -4.056 12.532 -3.902 12.23 -3.586 c
+11.936 -3.263 11.789 -2.803 11.789 -2.205 c
+11.789 -1.897 l
+11.789 -1.272 11.925 -0.786 12.2 -0.441 c
+12.472 -0.099 12.866 0.073 13.376 0.073 c
+13.876 0.073 14.247 -0.088 14.494 -0.411 c
+14.747 -0.735 14.88 -1.213 14.89 -1.837 c
+14.89 -2.337 l
+12.818 -2.337 l
+12.836 -2.631 12.898 -2.848 13.009 -2.984 c
+13.126 -3.123 13.307 -3.19 13.553 -3.19 c
+13.895 -3.19 14.184 -3.072 14.42 -2.837 c
+14.832 -3.469 l
+14.703 -3.645 14.516 -3.788 14.273 -3.896 c
+14.026 -4.002 13.762 -4.056 13.479 -4.056 c
+12.833 -1.617 m
+13.862 -1.617 l
+13.862 -1.514 l
+13.862 -1.278 13.821 -1.103 13.744 -0.985 c
+13.675 -0.86 13.546 -0.794 13.361 -0.794 c
+13.185 -0.794 13.053 -0.864 12.965 -0.999 c
+12.884 -1.128 12.84 -1.334 12.833 -1.617 c
+f
+Q
+q 1 0 0 1 462.7704 379.1377 cm
+0 0 m
+0 3.454 l
+-0.529 3.454 l
+-0.529 3.983 l
+0 3.983 l
+0 4.438 l
+0 4.839 0.096 5.151 0.294 5.379 c
+0.5 5.604 0.78 5.718 1.133 5.718 c
+1.268 5.718 1.401 5.695 1.529 5.659 c
+1.5 5.115 l
+1.401 5.134 1.301 5.144 1.206 5.144 c
+0.831 5.144 0.647 4.88 0.647 4.351 c
+0.647 3.983 l
+1.324 3.983 l
+1.324 3.454 l
+0.647 3.454 l
+0.647 0 l
+h
+1.956 2.175 m
+1.956 2.752 2.091 3.208 2.367 3.542 c
+2.65 3.884 3.021 4.056 3.484 4.056 c
+3.944 4.056 4.311 3.887 4.586 3.557 c
+4.869 3.233 5.017 2.786 5.027 2.219 c
+5.027 1.793 l
+5.027 1.223 4.884 0.768 4.601 0.426 c
+4.326 0.091 3.958 -0.073 3.499 -0.073 c
+3.036 -0.073 2.665 0.087 2.382 0.411 c
+2.106 0.742 1.962 1.182 1.956 1.734 c
+h
+2.602 1.793 m
+2.602 1.389 2.679 1.072 2.837 0.837 c
+3.003 0.602 3.223 0.484 3.499 0.484 c
+4.065 0.484 4.358 0.897 4.381 1.72 c
+4.381 2.175 l
+4.381 2.576 4.296 2.896 4.131 3.131 c
+3.973 3.374 3.756 3.498 3.484 3.498 c
+3.219 3.498 3.003 3.374 2.837 3.131 c
+2.679 2.896 2.602 2.576 2.602 2.175 c
+h
+7.512 3.366 m
+7.423 3.384 7.325 3.395 7.217 3.395 c
+6.883 3.395 6.648 3.212 6.512 2.851 c
+6.512 0 l
+5.865 0 l
+5.865 3.983 l
+6.498 3.983 l
+6.512 3.572 l
+6.689 3.895 6.931 4.056 7.247 4.056 c
+7.354 4.056 7.442 4.035 7.512 3.998 c
+h
+11.26 0.484 m
+11.473 0.484 11.645 0.548 11.774 0.675 c
+11.911 0.812 11.984 1.003 11.994 1.249 c
+12.612 1.249 l
+12.59 0.867 12.454 0.548 12.2 0.294 c
+11.944 0.047 11.631 -0.073 11.26 -0.073 c
+10.768 -0.073 10.392 0.077 10.128 0.382 c
+9.871 0.694 9.746 1.161 9.746 1.778 c
+9.746 2.219 l
+9.746 2.815 9.871 3.27 10.128 3.586 c
+10.392 3.898 10.768 4.056 11.26 4.056 c
+11.66 4.056 11.98 3.925 12.215 3.659 c
+12.458 3.403 12.59 3.057 12.612 2.616 c
+11.994 2.616 l
+11.973 2.91 11.899 3.131 11.774 3.278 c
+11.657 3.424 11.484 3.498 11.26 3.498 c
+10.966 3.498 10.749 3.399 10.613 3.204 c
+10.473 3.017 10.4 2.708 10.392 2.278 c
+10.392 1.764 l
+10.392 1.294 10.459 0.959 10.598 0.764 c
+10.745 0.577 10.966 0.484 11.26 0.484 c
+15.39 0.353 m
+15.173 0.066 14.861 -0.073 14.45 -0.073 c
+14.086 -0.073 13.81 0.047 13.627 0.294 c
+13.45 0.548 13.355 0.911 13.347 1.381 c
+13.347 3.983 l
+13.993 3.983 l
+13.993 1.44 l
+13.993 0.812 14.178 0.5 14.552 0.5 c
+14.953 0.5 15.229 0.675 15.375 1.028 c
+15.375 3.983 l
+16.023 3.983 l
+16.023 0 l
+15.405 0 l
+h
+18.654 3.366 m
+18.565 3.384 18.466 3.395 18.359 3.395 c
+18.025 3.395 17.79 3.212 17.654 2.851 c
+17.654 0 l
+17.008 0 l
+17.008 3.983 l
+17.639 3.983 l
+17.654 3.572 l
+17.831 3.895 18.073 4.056 18.389 4.056 c
+18.496 4.056 18.583 4.035 18.654 3.998 c
+h
+20.947 3.366 m
+20.858 3.384 20.759 3.395 20.653 3.395 c
+20.318 3.395 20.083 3.212 19.947 2.851 c
+19.947 0 l
+19.3 0 l
+19.3 3.983 l
+19.932 3.983 l
+19.947 3.572 l
+20.123 3.895 20.366 4.056 20.682 4.056 c
+20.788 4.056 20.877 4.035 20.947 3.998 c
+h
+22.946 -0.073 m
+22.446 -0.073 22.064 0.073 21.799 0.367 c
+21.534 0.661 21.402 1.095 21.402 1.675 c
+21.402 2.146 l
+21.402 2.741 21.527 3.208 21.785 3.542 c
+22.049 3.884 22.409 4.056 22.872 4.056 c
+23.331 4.056 23.674 3.902 23.901 3.601 c
+24.137 3.307 24.258 2.844 24.268 2.219 c
+24.268 1.793 l
+22.049 1.793 l
+22.049 1.705 l
+22.049 1.271 22.126 0.959 22.284 0.764 c
+22.45 0.577 22.681 0.484 22.975 0.484 c
+23.169 0.484 23.343 0.517 23.489 0.588 c
+23.636 0.665 23.772 0.783 23.901 0.941 c
+24.239 0.529 l
+23.952 0.124 23.522 -0.073 22.946 -0.073 c
+22.872 3.498 m
+22.597 3.498 22.394 3.403 22.269 3.219 c
+22.141 3.031 22.067 2.741 22.049 2.352 c
+23.622 2.352 l
+23.622 2.439 l
+23.599 2.822 23.534 3.09 23.416 3.248 c
+23.298 3.414 23.115 3.498 22.872 3.498 c
+25.665 3.983 m
+25.679 3.542 l
+25.933 3.884 26.257 4.056 26.65 4.056 c
+27.356 4.056 27.711 3.586 27.723 2.645 c
+27.723 0 l
+27.076 0 l
+27.076 2.616 l
+27.076 2.929 27.021 3.149 26.915 3.278 c
+26.804 3.403 26.65 3.469 26.444 3.469 c
+26.286 3.469 26.139 3.414 26.003 3.307 c
+25.874 3.197 25.772 3.061 25.694 2.896 c
+25.694 0 l
+25.047 0 l
+25.047 3.983 l
+h
+29.546 4.939 m
+29.546 3.983 l
+30.148 3.983 l
+30.148 3.454 l
+29.546 3.454 l
+29.546 0.985 l
+29.546 0.827 29.567 0.709 29.619 0.632 c
+29.677 0.551 29.766 0.515 29.883 0.515 c
+29.972 0.515 30.06 0.529 30.148 0.558 c
+30.148 0 l
+30.001 -0.048 29.847 -0.073 29.693 -0.073 c
+29.436 -0.073 29.241 0.018 29.105 0.205 c
+28.965 0.389 28.899 0.65 28.899 0.985 c
+28.899 3.454 l
+28.297 3.454 l
+28.297 3.983 l
+28.899 3.983 l
+28.899 4.939 l
+h
+34.014 0.484 m
+34.227 0.484 34.4 0.548 34.529 0.675 c
+34.664 0.812 34.738 1.003 34.749 1.249 c
+35.366 1.249 l
+35.345 0.867 35.208 0.548 34.955 0.294 c
+34.697 0.047 34.385 -0.073 34.014 -0.073 c
+33.521 -0.073 33.147 0.077 32.883 0.382 c
+32.625 0.694 32.5 1.161 32.5 1.778 c
+32.5 2.219 l
+32.5 2.815 32.625 3.27 32.883 3.586 c
+33.147 3.898 33.521 4.056 34.014 4.056 c
+34.415 4.056 34.734 3.925 34.969 3.659 c
+35.212 3.403 35.345 3.057 35.366 2.616 c
+34.749 2.616 l
+34.727 2.91 34.653 3.131 34.529 3.278 c
+34.411 3.424 34.238 3.498 34.014 3.498 c
+33.72 3.498 33.503 3.399 33.367 3.204 c
+33.228 3.017 33.154 2.708 33.147 2.278 c
+33.147 1.764 l
+33.147 1.294 33.213 0.959 33.353 0.764 c
+33.5 0.577 33.72 0.484 34.014 0.484 c
+35.983 2.175 m
+35.983 2.752 36.12 3.208 36.395 3.542 c
+36.678 3.884 37.049 4.056 37.512 4.056 c
+37.972 4.056 38.339 3.887 38.615 3.557 c
+38.898 3.233 39.044 2.786 39.056 2.219 c
+39.056 1.793 l
+39.056 1.223 38.913 0.768 38.63 0.426 c
+38.354 0.091 37.986 -0.073 37.527 -0.073 c
+37.064 -0.073 36.693 0.087 36.41 0.411 c
+36.135 0.742 35.991 1.182 35.983 1.734 c
+h
+36.631 1.793 m
+36.631 1.389 36.708 1.072 36.866 0.837 c
+37.031 0.602 37.251 0.484 37.527 0.484 c
+38.093 0.484 38.387 0.897 38.409 1.72 c
+38.409 2.175 l
+38.409 2.576 38.325 2.896 38.159 3.131 c
+38.001 3.374 37.785 3.498 37.512 3.498 c
+37.248 3.498 37.031 3.374 36.866 3.131 c
+36.708 2.896 36.631 2.576 36.631 2.175 c
+h
+40.511 3.983 m
+40.526 3.615 l
+40.768 3.91 41.088 4.056 41.481 4.056 c
+41.922 4.056 42.231 3.858 42.408 3.469 c
+42.661 3.858 43.01 4.056 43.451 4.056 c
+44.186 4.056 44.561 3.594 44.583 2.674 c
+44.583 0 l
+43.936 0 l
+43.936 2.616 l
+43.936 2.91 43.881 3.123 43.774 3.262 c
+43.675 3.399 43.503 3.469 43.26 3.469 c
+43.061 3.469 42.9 3.388 42.774 3.233 c
+42.657 3.087 42.587 2.896 42.568 2.66 c
+42.568 0 l
+41.907 0 l
+41.907 2.645 l
+41.907 3.193 41.687 3.469 41.246 3.469 c
+40.912 3.469 40.677 3.307 40.54 2.984 c
+40.54 0 l
+39.894 0 l
+39.894 3.983 l
+h
+46.171 3.983 m
+46.185 3.615 l
+46.427 3.91 46.747 4.056 47.14 4.056 c
+47.582 4.056 47.89 3.858 48.066 3.469 c
+48.32 3.858 48.669 4.056 49.11 4.056 c
+49.845 4.056 50.219 3.594 50.242 2.674 c
+50.242 0 l
+49.595 0 l
+49.595 2.616 l
+49.595 2.91 49.54 3.123 49.433 3.262 c
+49.334 3.399 49.161 3.469 48.918 3.469 c
+48.721 3.469 48.559 3.388 48.434 3.233 c
+48.316 3.087 48.247 2.896 48.228 2.66 c
+48.228 0 l
+47.567 0 l
+47.567 2.645 l
+47.567 3.193 47.346 3.469 46.905 3.469 c
+46.57 3.469 46.335 3.307 46.2 2.984 c
+46.2 0 l
+45.552 0 l
+45.552 3.983 l
+h
+51.918 0 -0.647 3.983 re
+51.962 5.026 m
+51.962 4.916 51.933 4.825 51.873 4.748 c
+51.815 4.677 51.719 4.644 51.594 4.644 c
+51.476 4.644 51.381 4.677 51.314 4.748 c
+51.256 4.825 51.227 4.916 51.227 5.026 c
+51.227 5.144 51.256 5.236 51.314 5.306 c
+51.381 5.383 51.476 5.423 51.594 5.423 c
+51.719 5.423 51.815 5.383 51.873 5.306 c
+51.933 5.225 51.962 5.134 51.962 5.026 c
+53.784 4.939 m
+53.784 3.983 l
+54.387 3.983 l
+54.387 3.454 l
+53.784 3.454 l
+53.784 0.985 l
+53.784 0.827 53.807 0.709 53.857 0.632 c
+53.917 0.551 54.005 0.515 54.123 0.515 c
+54.21 0.515 54.298 0.529 54.387 0.558 c
+54.387 0 l
+54.24 -0.048 54.086 -0.073 53.932 -0.073 c
+53.674 -0.073 53.479 0.018 53.344 0.205 c
+53.203 0.389 53.138 0.65 53.138 0.985 c
+53.138 3.454 l
+52.535 3.454 l
+52.535 3.983 l
+53.138 3.983 l
+53.138 4.939 l
+h
+55.195 0.353 m
+55.195 0.47 55.228 0.565 55.299 0.646 c
+55.364 0.723 55.467 0.764 55.607 0.764 c
+55.754 0.764 55.86 0.723 55.931 0.646 c
+56.008 0.565 56.048 0.47 56.048 0.353 c
+56.048 0.242 56.008 0.151 55.931 0.073 c
+55.86 -0.004 55.754 -0.044 55.607 -0.044 c
+55.467 -0.044 55.364 -0.004 55.299 0.073 c
+55.228 0.151 55.195 0.242 55.195 0.353 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 373.53 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 366.6908 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.993 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.279 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.23 15.626 -1.249 c
+15.545 -1.261 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+21.722 1.602 m
+21.178 1.602 l
+21.178 2.22 l
+21.766 2.22 l
+22.045 3.117 l
+22.618 3.117 l
+22.618 2.22 l
+23.853 2.22 l
+23.853 1.602 l
+22.618 1.602 l
+22.618 -0.103 l
+22.618 -0.324 l
+22.626 -0.393 22.647 -0.455 22.677 -0.515 c
+22.714 -0.565 22.769 -0.61 22.839 -0.646 c
+22.916 -0.676 23.03 -0.691 23.177 -0.691 c
+23.313 -0.691 23.449 -0.687 23.588 -0.676 c
+23.725 -0.658 23.857 -0.632 23.985 -0.602 c
+23.985 -1.205 l
+23.904 -1.216 23.827 -1.23 23.75 -1.249 c
+23.669 -1.261 23.592 -1.267 23.515 -1.278 c
+23.434 -1.286 23.346 -1.294 23.25 -1.294 c
+23.162 -1.301 23.063 -1.308 22.957 -1.308 c
+22.769 -1.308 22.608 -1.294 22.471 -1.264 c
+22.343 -1.228 22.229 -1.183 22.134 -1.132 c
+22.045 -1.084 21.972 -1.025 21.913 -0.955 c
+21.854 -0.878 21.81 -0.801 21.781 -0.72 c
+21.751 -0.632 21.729 -0.544 21.722 -0.455 c
+21.71 -0.36 21.707 -0.264 21.707 -0.176 c
+h
+26.136 -1.323 m
+25.966 -1.323 25.816 -1.301 25.679 -1.264 c
+25.551 -1.216 25.437 -1.147 25.342 -1.058 c
+25.253 -0.97 25.184 -0.864 25.136 -0.735 c
+25.084 -0.599 25.062 -0.448 25.062 -0.279 c
+25.062 -0.073 25.095 0.096 25.165 0.235 c
+25.232 0.382 25.327 0.493 25.444 0.574 c
+25.569 0.661 25.712 0.724 25.87 0.765 c
+26.036 0.801 26.213 0.827 26.4 0.838 c
+27.12 0.852 l
+27.12 1.029 l
+27.12 1.147 27.109 1.249 27.09 1.338 c
+27.069 1.426 27.036 1.492 26.988 1.544 c
+26.947 1.602 26.9 1.639 26.841 1.661 c
+26.782 1.679 26.716 1.69 26.649 1.69 c
+26.58 1.69 26.518 1.679 26.458 1.661 c
+26.408 1.65 26.36 1.625 26.312 1.588 c
+26.271 1.558 26.238 1.507 26.209 1.44 c
+26.186 1.382 26.172 1.301 26.165 1.205 c
+25.224 1.249 l
+25.253 1.397 25.297 1.532 25.356 1.661 c
+25.423 1.786 25.518 1.897 25.635 1.985 c
+25.753 2.08 25.893 2.153 26.061 2.205 c
+26.238 2.253 26.444 2.278 26.679 2.278 c
+27.12 2.278 27.451 2.168 27.678 1.955 c
+27.914 1.75 28.031 1.44 28.031 1.029 c
+28.031 -0.235 l
+28.031 -0.455 l
+28.039 -0.515 28.054 -0.569 28.075 -0.617 c
+28.094 -0.658 28.123 -0.691 28.164 -0.72 c
+28.201 -0.742 28.252 -0.75 28.311 -0.75 c
+28.376 -0.75 28.447 -0.746 28.517 -0.735 c
+28.517 -1.22 l
+28.457 -1.23 28.403 -1.242 28.355 -1.249 c
+28.314 -1.261 28.274 -1.267 28.237 -1.278 c
+28.197 -1.286 28.153 -1.294 28.105 -1.294 c
+28.054 -1.301 27.995 -1.308 27.929 -1.308 c
+27.701 -1.308 27.535 -1.257 27.429 -1.147 c
+27.318 -1.029 27.256 -0.864 27.237 -0.646 c
+27.223 -0.646 l
+27.154 -0.757 27.083 -0.852 27.017 -0.941 c
+26.947 -1.022 26.87 -1.087 26.782 -1.147 c
+26.693 -1.205 26.595 -1.249 26.488 -1.278 c
+26.389 -1.308 26.271 -1.323 26.136 -1.323 c
+27.12 0.353 m
+26.693 0.339 l
+26.595 0.339 26.503 0.331 26.414 0.324 c
+26.333 0.312 26.267 0.287 26.209 0.25 c
+26.15 0.21 26.098 0.15 26.061 0.073 c
+26.021 0.004 26.003 -0.088 26.003 -0.206 c
+26.003 -0.374 26.036 -0.496 26.106 -0.573 c
+26.172 -0.654 26.271 -0.691 26.4 -0.691 c
+26.506 -0.691 26.606 -0.669 26.693 -0.617 c
+26.789 -0.569 26.87 -0.507 26.929 -0.426 c
+26.995 -0.349 27.046 -0.261 27.076 -0.162 c
+27.106 -0.055 27.12 0.059 27.12 0.177 c
+h
+30.769 -2.66 m
+30.552 -2.66 30.361 -2.635 30.196 -2.587 c
+30.027 -2.547 29.887 -2.484 29.77 -2.396 c
+29.652 -2.315 29.552 -2.219 29.475 -2.102 c
+29.406 -1.984 29.358 -1.855 29.328 -1.72 c
+30.225 -1.617 l
+30.262 -1.753 30.331 -1.859 30.431 -1.94 c
+30.527 -2.028 30.651 -2.072 30.799 -2.072 c
+30.886 -2.072 30.967 -2.057 31.048 -2.028 c
+31.125 -1.999 31.195 -1.944 31.254 -1.866 c
+31.313 -1.797 31.357 -1.705 31.387 -1.587 c
+31.424 -1.469 31.445 -1.323 31.445 -1.147 c
+31.445 -0.955 l
+31.445 -0.889 31.449 -0.831 31.46 -0.779 c
+31.46 -0.588 l
+31.445 -0.588 l
+31.346 -0.816 31.202 -0.977 31.019 -1.072 c
+30.832 -1.172 30.626 -1.22 30.402 -1.22 c
+30.196 -1.22 30.012 -1.183 29.858 -1.103 c
+29.71 -1.014 29.582 -0.897 29.475 -0.75 c
+29.376 -0.596 29.303 -0.411 29.255 -0.206 c
+29.203 0.008 29.182 0.243 29.182 0.5 c
+29.182 0.771 29.203 1.018 29.255 1.235 c
+29.313 1.448 29.394 1.632 29.505 1.779 c
+29.612 1.933 29.743 2.051 29.901 2.132 c
+30.057 2.22 30.244 2.263 30.46 2.263 c
+30.556 2.263 30.655 2.253 30.755 2.234 c
+30.85 2.213 30.938 2.18 31.019 2.132 c
+31.107 2.08 31.185 2.018 31.254 1.941 c
+31.331 1.86 31.393 1.768 31.445 1.661 c
+31.46 1.661 l
+31.46 1.808 l
+31.468 1.867 31.474 1.918 31.474 1.97 c
+31.482 2.028 31.489 2.076 31.489 2.117 c
+31.497 2.165 31.507 2.198 31.519 2.22 c
+32.371 2.22 l
+32.361 2.139 32.349 2.028 32.342 1.881 c
+32.342 1.411 l
+32.342 -1.161 l
+32.342 -1.415 32.305 -1.635 32.239 -1.822 c
+32.17 -2.007 32.066 -2.161 31.931 -2.279 c
+31.79 -2.404 31.625 -2.499 31.43 -2.558 c
+31.233 -2.624 31.011 -2.66 30.769 -2.66 c
+31.46 0.53 m
+31.46 0.742 31.434 0.919 31.387 1.058 c
+31.346 1.205 31.291 1.323 31.225 1.411 c
+31.166 1.5 31.096 1.558 31.019 1.588 c
+30.938 1.625 30.861 1.646 30.784 1.646 c
+30.684 1.646 30.593 1.621 30.504 1.573 c
+30.424 1.532 30.358 1.463 30.298 1.367 c
+30.248 1.279 30.203 1.162 30.167 1.014 c
+30.137 0.875 30.122 0.706 30.122 0.5 c
+30.122 0.125 30.181 -0.154 30.298 -0.338 c
+30.416 -0.515 30.578 -0.602 30.784 -0.602 c
+30.85 -0.602 30.923 -0.588 31.004 -0.559 c
+31.092 -0.522 31.166 -0.463 31.225 -0.382 c
+31.291 -0.294 31.346 -0.176 31.387 -0.029 c
+31.434 0.118 31.46 0.301 31.46 0.53 c
+37.953 0.838 1.866 -0.794 re
+37.953 0.044 m
+43.601 -1.264 m
+43.59 -1.246 43.579 -1.216 43.572 -1.176 c
+43.572 -1.128 43.565 -1.08 43.557 -1.029 c
+43.557 -0.97 43.55 -0.912 43.542 -0.852 c
+43.542 -0.691 l
+43.425 -0.926 43.282 -1.095 43.116 -1.19 c
+42.948 -1.278 42.749 -1.323 42.514 -1.323 c
+42.315 -1.323 42.139 -1.278 41.984 -1.19 c
+41.826 -1.103 41.695 -0.981 41.587 -0.823 c
+41.488 -0.658 41.411 -0.467 41.352 -0.249 c
+41.301 -0.037 41.279 0.206 41.279 0.47 c
+41.279 0.735 41.301 0.974 41.352 1.191 c
+41.411 1.415 41.488 1.606 41.587 1.764 c
+41.695 1.918 41.826 2.043 41.984 2.132 c
+42.15 2.227 42.341 2.278 42.558 2.278 c
+42.653 2.278 42.749 2.263 42.837 2.234 c
+42.933 2.213 43.028 2.18 43.116 2.132 c
+43.204 2.08 43.282 2.018 43.351 1.941 c
+43.428 1.86 43.491 1.768 43.542 1.661 c
+43.542 1.75 l
+43.542 1.897 l
+43.542 2.058 l
+43.542 2.234 l
+43.542 3.514 l
+44.44 3.514 l
+44.44 -0.5 l
+44.44 -0.676 44.442 -0.834 44.454 -0.97 c
+44.461 -1.099 44.469 -1.198 44.469 -1.264 c
+h
+43.557 0.485 m
+43.557 0.721 43.532 0.912 43.484 1.058 c
+43.443 1.213 43.388 1.338 43.322 1.426 c
+43.264 1.515 43.193 1.573 43.116 1.602 c
+43.035 1.639 42.958 1.661 42.881 1.661 c
+42.782 1.661 42.69 1.635 42.601 1.588 c
+42.521 1.547 42.455 1.477 42.396 1.382 c
+42.345 1.282 42.3 1.162 42.264 1.014 c
+42.234 0.867 42.219 0.684 42.219 0.47 c
+42.219 0.077 42.271 -0.216 42.381 -0.411 c
+42.499 -0.61 42.661 -0.706 42.867 -0.706 c
+42.944 -0.706 43.021 -0.687 43.102 -0.646 c
+43.179 -0.61 43.252 -0.544 43.322 -0.455 c
+43.388 -0.367 43.443 -0.246 43.484 -0.088 c
+43.532 0.066 43.557 0.258 43.557 0.485 c
+50.297 -2.631 m
+50.297 3.514 l
+52.222 3.514 l
+52.222 2.896 l
+51.149 2.896 l
+51.149 -2.013 l
+52.222 -2.013 l
+52.222 -2.631 l
+h
+55.798 -1.264 m
+55.798 0.721 l
+55.798 1.022 55.754 1.242 55.665 1.382 c
+55.585 1.529 55.449 1.602 55.254 1.602 c
+55.143 1.602 55.041 1.577 54.946 1.529 c
+54.857 1.477 54.776 1.411 54.711 1.323 c
+54.651 1.235 54.6 1.124 54.563 1 c
+54.534 0.882 54.519 0.75 54.519 0.603 c
+54.519 -1.264 l
+53.608 -1.264 l
+53.608 1.44 l
+53.608 1.661 l
+53.608 1.75 53.6 1.827 53.593 1.897 c
+53.593 2.087 l
+53.593 2.22 l
+54.445 2.22 l
+54.453 2.19 54.46 2.146 54.46 2.087 c
+54.46 1.897 l
+54.468 1.827 54.475 1.756 54.475 1.69 c
+54.482 1.621 54.49 1.565 54.49 1.529 c
+54.505 1.529 l
+54.622 1.793 54.773 1.985 54.96 2.103 c
+55.143 2.22 55.364 2.278 55.621 2.278 c
+55.806 2.278 55.966 2.249 56.107 2.19 c
+56.242 2.132 56.357 2.043 56.444 1.926 c
+56.533 1.808 56.595 1.665 56.635 1.5 c
+56.683 1.341 56.71 1.154 56.71 0.941 c
+56.71 -1.264 l
+h
+58.628 -1.323 m
+58.458 -1.323 58.308 -1.301 58.172 -1.264 c
+58.044 -1.216 57.929 -1.147 57.834 -1.058 c
+57.745 -0.97 57.676 -0.864 57.628 -0.735 c
+57.576 -0.599 57.554 -0.448 57.554 -0.279 c
+57.554 -0.073 57.587 0.096 57.657 0.235 c
+57.724 0.382 57.819 0.493 57.936 0.574 c
+58.061 0.661 58.204 0.724 58.363 0.765 c
+58.528 0.801 58.705 0.827 58.892 0.838 c
+59.612 0.852 l
+59.612 1.029 l
+59.612 1.147 59.601 1.249 59.583 1.338 c
+59.561 1.426 59.528 1.492 59.48 1.544 c
+59.44 1.602 59.392 1.639 59.333 1.661 c
+59.274 1.679 59.208 1.69 59.141 1.69 c
+59.072 1.69 59.01 1.679 58.951 1.661 c
+58.9 1.65 58.852 1.625 58.804 1.588 c
+58.763 1.558 58.73 1.507 58.701 1.44 c
+58.679 1.382 58.664 1.301 58.657 1.205 c
+57.716 1.249 l
+57.745 1.397 57.79 1.532 57.848 1.661 c
+57.915 1.786 58.01 1.897 58.127 1.985 c
+58.245 2.08 58.385 2.153 58.554 2.205 c
+58.73 2.253 58.936 2.278 59.172 2.278 c
+59.612 2.278 59.943 2.168 60.171 1.955 c
+60.406 1.75 60.523 1.44 60.523 1.029 c
+60.523 -0.235 l
+60.523 -0.455 l
+60.531 -0.515 60.546 -0.569 60.568 -0.617 c
+60.586 -0.658 60.616 -0.691 60.656 -0.72 c
+60.693 -0.742 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.735 c
+61.009 -1.22 l
+60.95 -1.23 60.895 -1.242 60.847 -1.249 c
+60.807 -1.261 60.766 -1.267 60.729 -1.278 c
+60.689 -1.286 60.645 -1.294 60.597 -1.294 c
+60.546 -1.301 60.487 -1.308 60.421 -1.308 c
+60.193 -1.308 60.028 -1.257 59.921 -1.147 c
+59.81 -1.029 59.748 -0.864 59.729 -0.646 c
+59.715 -0.646 l
+59.646 -0.757 59.575 -0.852 59.509 -0.941 c
+59.44 -1.022 59.363 -1.087 59.274 -1.147 c
+59.186 -1.205 59.087 -1.249 58.981 -1.278 c
+58.881 -1.308 58.763 -1.323 58.628 -1.323 c
+59.612 0.353 m
+59.186 0.339 l
+59.087 0.339 58.995 0.331 58.906 0.324 c
+58.826 0.312 58.76 0.287 58.701 0.25 c
+58.642 0.21 58.591 0.15 58.554 0.073 c
+58.514 0.004 58.495 -0.088 58.495 -0.206 c
+58.495 -0.374 58.528 -0.496 58.598 -0.573 c
+58.664 -0.654 58.763 -0.691 58.892 -0.691 c
+58.998 -0.691 59.098 -0.669 59.186 -0.617 c
+59.282 -0.569 59.363 -0.507 59.421 -0.426 c
+59.488 -0.349 59.538 -0.261 59.569 -0.162 c
+59.598 -0.055 59.612 0.059 59.612 0.177 c
+h
+62.894 -1.264 m
+62.894 0.852 l
+62.894 1.018 62.887 1.154 62.879 1.264 c
+62.868 1.371 62.85 1.455 62.821 1.515 c
+62.798 1.58 62.769 1.632 62.732 1.661 c
+62.703 1.69 62.663 1.706 62.615 1.706 c
+62.555 1.706 62.501 1.675 62.453 1.617 c
+62.412 1.565 62.379 1.492 62.35 1.397 c
+62.32 1.309 62.295 1.195 62.277 1.058 c
+62.266 0.919 62.262 0.769 62.262 0.603 c
+62.262 -1.264 l
+61.512 -1.264 l
+61.512 1.47 l
+61.512 1.706 l
+61.512 1.926 l
+61.512 2.003 61.505 2.065 61.497 2.117 c
+61.497 2.22 l
+62.173 2.22 l
+62.173 2.132 l
+62.173 1.985 l
+62.181 1.926 62.189 1.867 62.189 1.808 c
+62.189 1.646 l
+62.203 1.646 l
+62.221 1.735 62.251 1.812 62.291 1.881 c
+62.328 1.959 62.372 2.028 62.424 2.087 c
+62.482 2.146 62.549 2.19 62.629 2.22 c
+62.707 2.257 62.794 2.278 62.894 2.278 c
+63.078 2.278 63.218 2.223 63.305 2.117 c
+63.401 2.018 63.471 1.86 63.511 1.646 c
+63.526 1.646 l
+63.563 1.742 63.603 1.83 63.644 1.911 c
+63.691 1.988 63.746 2.051 63.805 2.103 c
+63.864 2.161 63.93 2.205 64.011 2.234 c
+64.088 2.263 64.176 2.278 64.275 2.278 c
+64.411 2.278 64.525 2.253 64.614 2.205 c
+64.702 2.153 64.768 2.08 64.82 1.985 c
+64.878 1.885 64.915 1.756 64.937 1.602 c
+64.967 1.455 64.981 1.272 64.981 1.058 c
+64.981 -1.264 l
+64.261 -1.264 l
+64.261 0.852 l
+64.261 1.018 64.253 1.154 64.246 1.264 c
+64.236 1.371 64.217 1.455 64.188 1.515 c
+64.165 1.58 64.136 1.632 64.099 1.661 c
+64.07 1.69 64.03 1.706 63.982 1.706 c
+63.864 1.706 63.768 1.617 63.702 1.44 c
+63.644 1.272 63.614 1.014 63.614 0.661 c
+63.614 -1.264 l
+h
+67.351 -1.323 m
+67.094 -1.323 66.866 -1.286 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.727 65.867 -0.536 65.778 -0.309 c
+65.697 -0.085 65.661 0.181 65.661 0.485 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.742 66.175 1.881 c
+66.341 2.018 66.528 2.117 66.734 2.176 c
+66.94 2.242 67.149 2.278 67.366 2.278 c
+67.638 2.278 67.873 2.227 68.072 2.132 c
+68.277 2.043 68.443 1.911 68.571 1.735 c
+68.707 1.565 68.807 1.359 68.865 1.118 c
+68.932 0.882 68.968 0.617 68.968 0.324 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.162 66.617 0.023 66.646 -0.103 c
+66.682 -0.231 66.738 -0.345 66.808 -0.441 c
+66.873 -0.529 66.958 -0.599 67.058 -0.646 c
+67.153 -0.698 67.267 -0.72 67.396 -0.72 c
+67.55 -0.72 67.689 -0.687 67.807 -0.617 c
+67.932 -0.551 68.02 -0.448 68.072 -0.309 c
+68.909 -0.382 l
+68.88 -0.482 68.824 -0.588 68.747 -0.706 c
+68.666 -0.816 68.564 -0.918 68.439 -1.014 c
+68.321 -1.103 68.167 -1.176 67.983 -1.234 c
+67.807 -1.294 67.594 -1.323 67.351 -1.323 c
+67.351 1.706 m
+67.263 1.706 67.175 1.69 67.087 1.661 c
+66.999 1.632 66.918 1.58 66.852 1.515 c
+66.782 1.444 66.723 1.357 66.675 1.249 c
+66.634 1.139 66.617 1.014 66.617 0.867 c
+68.086 0.867 l
+68.086 1.004 68.061 1.124 68.013 1.235 c
+67.972 1.341 67.918 1.43 67.851 1.5 c
+67.793 1.565 67.719 1.617 67.631 1.646 c
+67.542 1.683 67.447 1.706 67.351 1.706 c
+70.221 -2.631 m
+70.221 -2.013 l
+71.294 -2.013 l
+71.294 2.896 l
+70.221 2.896 l
+70.221 3.514 l
+72.147 3.514 l
+72.147 -2.631 l
+h
+f
+Q
+q 1 0 0 1 411.2216 352.6973 cm
+0 0 m
+-0.941 0 l
+-0.941 -2.161 l
+-1.617 -2.161 l
+-1.617 3.19 l
+-0.118 3.19 l
+0.411 3.19 0.808 3.05 1.072 2.778 c
+1.344 2.502 1.484 2.105 1.484 1.588 c
+1.484 1.253 1.411 0.963 1.263 0.721 c
+1.117 0.474 0.911 0.287 0.646 0.162 c
+1.675 -2.117 l
+1.675 -2.161 l
+0.955 -2.161 l
+h
+-0.941 0.588 m
+-0.118 0.588 l
+0.165 0.588 0.389 0.676 0.558 0.852 c
+0.723 1.037 0.808 1.282 0.808 1.588 c
+0.808 2.271 0.492 2.616 -0.133 2.616 c
+-0.941 2.616 l
+h
+3.719 -2.234 m
+3.218 -2.234 2.836 -2.088 2.572 -1.793 c
+2.308 -1.5 2.175 -1.066 2.175 -0.484 c
+2.175 -0.014 l
+2.175 0.58 2.3 1.047 2.557 1.382 c
+2.822 1.723 3.182 1.897 3.645 1.897 c
+4.104 1.897 4.446 1.742 4.674 1.44 c
+4.909 1.147 5.03 0.684 5.041 0.059 c
+5.041 -0.367 l
+2.822 -0.367 l
+2.822 -0.455 l
+2.822 -0.889 2.899 -1.201 3.057 -1.396 c
+3.222 -1.583 3.453 -1.675 3.748 -1.675 c
+3.943 -1.675 4.116 -1.643 4.262 -1.573 c
+4.409 -1.496 4.546 -1.378 4.674 -1.22 c
+5.012 -1.631 l
+4.725 -2.036 4.295 -2.234 3.719 -2.234 c
+3.645 1.338 m
+3.37 1.338 3.167 1.242 3.042 1.058 c
+2.913 0.871 2.84 0.58 2.822 0.191 c
+4.394 0.191 l
+4.394 0.279 l
+4.373 0.661 4.307 0.929 4.189 1.087 c
+4.072 1.253 3.887 1.338 3.645 1.338 c
+6.437 1.823 m
+6.453 1.455 l
+6.695 1.75 7.015 1.897 7.408 1.897 c
+7.849 1.897 8.157 1.698 8.334 1.309 c
+8.588 1.698 8.937 1.897 9.377 1.897 c
+10.113 1.897 10.487 1.434 10.509 0.515 c
+10.509 -2.161 l
+9.863 -2.161 l
+9.863 0.456 l
+9.863 0.75 9.807 0.963 9.701 1.103 c
+9.602 1.239 9.429 1.309 9.186 1.309 c
+8.988 1.309 8.826 1.228 8.702 1.073 c
+8.584 0.927 8.514 0.735 8.496 0.5 c
+8.496 -2.161 l
+7.834 -2.161 l
+7.834 0.485 l
+7.834 1.033 7.613 1.309 7.173 1.309 c
+6.838 1.309 6.603 1.147 6.468 0.823 c
+6.468 -2.161 l
+5.82 -2.161 l
+5.82 1.823 l
+h
+11.347 0.015 m
+11.347 0.592 11.484 1.047 11.759 1.382 c
+12.041 1.723 12.413 1.897 12.876 1.897 c
+13.335 1.897 13.703 1.727 13.978 1.397 c
+14.262 1.073 14.408 0.625 14.42 0.059 c
+14.42 -0.367 l
+14.42 -0.937 14.276 -1.392 13.993 -1.735 c
+13.718 -2.069 13.35 -2.234 12.891 -2.234 c
+12.428 -2.234 12.057 -2.072 11.773 -1.749 c
+11.498 -1.419 11.355 -0.977 11.347 -0.426 c
+h
+11.994 -0.367 m
+11.994 -0.771 12.072 -1.087 12.23 -1.323 c
+12.394 -1.558 12.615 -1.675 12.891 -1.675 c
+13.456 -1.675 13.751 -1.264 13.772 -0.441 c
+13.772 0.015 l
+13.772 0.416 13.688 0.735 13.523 0.97 c
+13.365 1.213 13.148 1.338 12.876 1.338 c
+12.612 1.338 12.394 1.213 12.23 0.97 c
+12.072 0.735 11.994 0.416 11.994 0.015 c
+h
+16.33 -1.176 m
+17.08 1.823 l
+17.741 1.823 l
+16.565 -2.161 l
+16.08 -2.161 l
+14.89 1.823 l
+15.551 1.823 l
+h
+19.799 -2.234 m
+19.299 -2.234 18.917 -2.088 18.653 -1.793 c
+18.388 -1.5 18.256 -1.066 18.256 -0.484 c
+18.256 -0.014 l
+18.256 0.58 18.381 1.047 18.638 1.382 c
+18.902 1.723 19.263 1.897 19.725 1.897 c
+20.185 1.897 20.527 1.742 20.755 1.44 c
+20.99 1.147 21.111 0.684 21.122 0.059 c
+21.122 -0.367 l
+18.902 -0.367 l
+18.902 -0.455 l
+18.902 -0.889 18.979 -1.201 19.137 -1.396 c
+19.303 -1.583 19.534 -1.675 19.829 -1.675 c
+20.024 -1.675 20.196 -1.643 20.343 -1.573 c
+20.49 -1.496 20.626 -1.378 20.755 -1.22 c
+21.092 -1.631 l
+20.806 -2.036 20.376 -2.234 19.799 -2.234 c
+19.725 1.338 m
+19.45 1.338 19.248 1.242 19.123 1.058 c
+18.994 0.871 18.921 0.58 18.902 0.191 c
+20.475 0.191 l
+20.475 0.279 l
+20.454 0.661 20.387 0.929 20.269 1.087 c
+20.152 1.253 19.968 1.338 19.725 1.338 c
+25.664 -2.161 m
+25.624 -2.072 25.598 -1.926 25.591 -1.72 c
+25.356 -2.065 25.061 -2.234 24.709 -2.234 c
+24.345 -2.234 24.062 -2.138 23.856 -1.94 c
+23.658 -1.735 23.562 -1.448 23.562 -1.072 c
+23.562 -0.673 23.698 -0.353 23.974 -0.118 c
+24.246 0.125 24.62 0.25 25.09 0.25 c
+25.576 0.25 l
+25.576 0.676 l
+25.576 0.912 25.521 1.077 25.414 1.176 c
+25.304 1.282 25.142 1.338 24.93 1.338 c
+24.731 1.338 24.569 1.279 24.444 1.162 c
+24.327 1.044 24.267 0.896 24.267 0.721 c
+23.621 0.721 l
+23.621 0.915 23.679 1.106 23.797 1.294 c
+23.922 1.477 24.084 1.625 24.282 1.735 c
+24.488 1.841 24.716 1.897 24.973 1.897 c
+25.374 1.897 25.678 1.793 25.884 1.588 c
+26.098 1.382 26.212 1.087 26.223 0.706 c
+26.223 -1.308 l
+26.223 -1.613 26.26 -1.878 26.341 -2.102 c
+26.341 -2.161 l
+h
+24.797 -1.646 m
+24.963 -1.646 25.113 -1.602 25.252 -1.514 c
+25.4 -1.425 25.506 -1.315 25.576 -1.176 c
+25.576 -0.235 l
+25.208 -0.235 l
+24.893 -0.235 24.65 -0.305 24.473 -0.441 c
+24.297 -0.569 24.209 -0.757 24.209 -0.999 c
+24.209 -1.228 24.253 -1.392 24.342 -1.5 c
+24.429 -1.598 24.581 -1.646 24.797 -1.646 c
+29.794 2.778 m
+29.794 1.823 l
+30.397 1.823 l
+30.397 1.294 l
+29.794 1.294 l
+29.794 -1.176 l
+29.794 -1.334 29.817 -1.452 29.868 -1.529 c
+29.927 -1.61 30.015 -1.646 30.133 -1.646 c
+30.221 -1.646 30.309 -1.631 30.397 -1.602 c
+30.397 -2.161 l
+30.25 -2.208 30.096 -2.234 29.942 -2.234 c
+29.684 -2.234 29.489 -2.142 29.354 -1.955 c
+29.214 -1.771 29.148 -1.51 29.148 -1.176 c
+29.148 1.294 l
+28.545 1.294 l
+28.545 1.823 l
+29.148 1.823 l
+29.148 2.778 l
+h
+33.204 -2.161 m
+33.164 -2.072 33.138 -1.926 33.131 -1.72 c
+32.896 -2.065 32.602 -2.234 32.249 -2.234 c
+31.885 -2.234 31.602 -2.138 31.397 -1.94 c
+31.199 -1.735 31.103 -1.448 31.103 -1.072 c
+31.103 -0.673 31.239 -0.353 31.515 -0.118 c
+31.787 0.125 32.161 0.25 32.631 0.25 c
+33.117 0.25 l
+33.117 0.676 l
+33.117 0.912 33.061 1.077 32.955 1.176 c
+32.845 1.282 32.683 1.338 32.47 1.338 c
+32.271 1.338 32.109 1.279 31.985 1.162 c
+31.868 1.044 31.808 0.896 31.808 0.721 c
+31.162 0.721 l
+31.162 0.915 31.22 1.106 31.338 1.294 c
+31.463 1.477 31.625 1.625 31.823 1.735 c
+32.028 1.841 32.257 1.897 32.514 1.897 c
+32.915 1.897 33.219 1.793 33.425 1.588 c
+33.638 1.382 33.753 1.087 33.763 0.706 c
+33.763 -1.308 l
+33.763 -1.613 33.8 -1.878 33.881 -2.102 c
+33.881 -2.161 l
+h
+32.338 -1.646 m
+32.503 -1.646 32.654 -1.602 32.793 -1.514 c
+32.94 -1.425 33.047 -1.315 33.117 -1.176 c
+33.117 -0.235 l
+32.749 -0.235 l
+32.433 -0.235 32.19 -0.305 32.014 -0.441 c
+31.837 -0.569 31.75 -0.757 31.75 -0.999 c
+31.75 -1.228 31.793 -1.392 31.882 -1.5 c
+31.97 -1.598 32.121 -1.646 32.338 -1.646 c
+34.63 0.015 m
+34.63 0.632 34.741 1.095 34.968 1.411 c
+35.193 1.735 35.527 1.897 35.968 1.897 c
+36.369 1.897 36.674 1.72 36.88 1.367 c
+36.924 1.823 l
+37.512 1.823 l
+37.512 -2.205 l
+37.512 -2.693 37.383 -3.072 37.129 -3.337 c
+36.872 -3.601 36.52 -3.734 36.071 -3.734 c
+35.872 -3.734 35.652 -3.682 35.409 -3.586 c
+35.164 -3.487 34.983 -3.366 34.866 -3.219 c
+35.13 -2.778 l
+35.395 -3.042 35.693 -3.175 36.027 -3.175 c
+36.564 -3.175 36.839 -2.881 36.85 -2.293 c
+36.85 -1.764 l
+36.645 -2.08 36.343 -2.234 35.953 -2.234 c
+35.542 -2.234 35.218 -2.084 34.983 -1.778 c
+34.756 -1.466 34.638 -1.014 34.63 -0.426 c
+h
+35.292 -0.367 m
+35.292 -0.808 35.355 -1.139 35.483 -1.352 c
+35.608 -1.558 35.825 -1.66 36.13 -1.66 c
+36.454 -1.66 36.692 -1.496 36.85 -1.161 c
+36.85 0.823 l
+36.681 1.147 36.442 1.309 36.13 1.309 c
+35.836 1.309 35.619 1.205 35.483 1 c
+35.355 0.794 35.292 0.47 35.292 0.029 c
+h
+40.481 -2.161 m
+40.481 1.294 l
+39.951 1.294 l
+39.951 1.823 l
+40.481 1.823 l
+40.481 2.278 l
+40.481 2.679 40.576 2.992 40.774 3.219 c
+40.98 3.443 41.26 3.557 41.613 3.557 c
+41.749 3.557 41.881 3.535 42.01 3.499 c
+41.98 2.955 l
+41.881 2.973 41.782 2.984 41.686 2.984 c
+41.312 2.984 41.127 2.72 41.127 2.19 c
+41.127 1.823 l
+41.804 1.823 l
+41.804 1.294 l
+41.127 1.294 l
+41.127 -2.161 l
+h
+44.215 1.205 m
+44.126 1.224 44.027 1.235 43.92 1.235 c
+43.586 1.235 43.351 1.051 43.215 0.691 c
+43.215 -2.161 l
+42.568 -2.161 l
+42.568 1.823 l
+43.2 1.823 l
+43.215 1.411 l
+43.392 1.735 43.633 1.897 43.949 1.897 c
+44.057 1.897 44.144 1.874 44.215 1.837 c
+h
+44.655 0.015 m
+44.655 0.592 44.791 1.047 45.067 1.382 c
+45.35 1.723 45.721 1.897 46.184 1.897 c
+46.644 1.897 47.011 1.727 47.286 1.397 c
+47.569 1.073 47.716 0.625 47.727 0.059 c
+47.727 -0.367 l
+47.727 -0.937 47.584 -1.392 47.301 -1.735 c
+47.026 -2.069 46.658 -2.234 46.199 -2.234 c
+45.736 -2.234 45.364 -2.072 45.081 -1.749 c
+44.806 -1.419 44.663 -0.977 44.655 -0.426 c
+h
+45.302 -0.367 m
+45.302 -0.771 45.379 -1.087 45.537 -1.323 c
+45.703 -1.558 45.923 -1.675 46.199 -1.675 c
+46.765 -1.675 47.059 -1.264 47.08 -0.441 c
+47.08 0.015 l
+47.08 0.416 46.996 0.735 46.831 0.97 c
+46.673 1.213 46.456 1.338 46.184 1.338 c
+45.919 1.338 45.703 1.213 45.537 0.97 c
+45.379 0.735 45.302 0.416 45.302 0.015 c
+h
+49.183 1.823 m
+49.197 1.455 l
+49.44 1.75 49.759 1.897 50.153 1.897 c
+50.594 1.897 50.902 1.698 51.078 1.309 c
+51.332 1.698 51.681 1.897 52.123 1.897 c
+52.857 1.897 53.233 1.434 53.254 0.515 c
+53.254 -2.161 l
+52.607 -2.161 l
+52.607 0.456 l
+52.607 0.75 52.553 0.963 52.446 1.103 c
+52.346 1.239 52.174 1.309 51.932 1.309 c
+51.733 1.309 51.571 1.228 51.446 1.073 c
+51.329 0.927 51.259 0.735 51.24 0.5 c
+51.24 -2.161 l
+50.579 -2.161 l
+50.579 0.485 l
+50.579 1.033 50.359 1.309 49.918 1.309 c
+49.584 1.309 49.348 1.147 49.212 0.823 c
+49.212 -2.161 l
+48.566 -2.161 l
+48.566 1.823 l
+h
+57.987 -2.161 m
+57.947 -2.072 57.921 -1.926 57.914 -1.72 c
+57.679 -2.065 57.385 -2.234 57.032 -2.234 c
+56.668 -2.234 56.385 -2.138 56.179 -1.94 c
+55.981 -1.735 55.886 -1.448 55.886 -1.072 c
+55.886 -0.673 56.021 -0.353 56.297 -0.118 c
+56.569 0.125 56.944 0.25 57.414 0.25 c
+57.899 0.25 l
+57.899 0.676 l
+57.899 0.912 57.844 1.077 57.738 1.176 c
+57.627 1.282 57.466 1.338 57.252 1.338 c
+57.054 1.338 56.892 1.279 56.767 1.162 c
+56.649 1.044 56.591 0.896 56.591 0.721 c
+55.944 0.721 l
+55.944 0.915 56.003 1.106 56.121 1.294 c
+56.246 1.477 56.408 1.625 56.605 1.735 c
+56.811 1.841 57.039 1.897 57.297 1.897 c
+57.697 1.897 58.002 1.793 58.208 1.588 c
+58.421 1.382 58.535 1.087 58.546 0.706 c
+58.546 -1.308 l
+58.546 -1.613 58.583 -1.878 58.664 -2.102 c
+58.664 -2.161 l
+h
+57.12 -1.646 m
+57.285 -1.646 57.436 -1.602 57.576 -1.514 c
+57.723 -1.425 57.829 -1.315 57.899 -1.176 c
+57.899 -0.235 l
+57.532 -0.235 l
+57.216 -0.235 56.973 -0.305 56.797 -0.441 c
+56.62 -0.569 56.532 -0.757 56.532 -0.999 c
+56.532 -1.228 56.576 -1.392 56.664 -1.5 c
+56.753 -1.598 56.903 -1.646 57.12 -1.646 c
+61.971 -2.161 -0.647 5.644 re
+62.853 0.015 m
+62.853 0.592 62.989 1.047 63.265 1.382 c
+63.547 1.723 63.919 1.897 64.381 1.897 c
+64.84 1.897 65.208 1.727 65.484 1.397 c
+65.767 1.073 65.914 0.625 65.925 0.059 c
+65.925 -0.367 l
+65.925 -0.937 65.781 -1.392 65.499 -1.735 c
+65.223 -2.069 64.855 -2.234 64.396 -2.234 c
+63.934 -2.234 63.562 -2.072 63.279 -1.749 c
+63.003 -1.419 62.86 -0.977 62.853 -0.426 c
+h
+63.5 -0.367 m
+63.5 -0.771 63.577 -1.087 63.735 -1.323 c
+63.9 -1.558 64.121 -1.675 64.396 -1.675 c
+64.962 -1.675 65.256 -1.264 65.278 -0.441 c
+65.278 0.015 l
+65.278 0.416 65.193 0.735 65.029 0.97 c
+64.871 1.213 64.653 1.338 64.381 1.338 c
+64.117 1.338 63.9 1.213 63.735 0.97 c
+63.577 0.735 63.5 0.416 63.5 0.015 c
+h
+68.144 -1.675 m
+68.358 -1.675 68.53 -1.613 68.659 -1.484 c
+68.795 -1.348 68.869 -1.157 68.879 -0.912 c
+69.497 -0.912 l
+69.475 -1.294 69.339 -1.613 69.085 -1.866 c
+68.828 -2.113 68.516 -2.234 68.144 -2.234 c
+67.652 -2.234 67.277 -2.084 67.013 -1.778 c
+66.756 -1.466 66.631 -0.999 66.631 -0.382 c
+66.631 0.059 l
+66.631 0.654 66.756 1.11 67.013 1.426 c
+67.277 1.738 67.652 1.897 68.144 1.897 c
+68.545 1.897 68.865 1.764 69.1 1.5 c
+69.343 1.242 69.475 0.896 69.497 0.456 c
+68.879 0.456 l
+68.857 0.75 68.784 0.97 68.659 1.118 c
+68.541 1.264 68.368 1.338 68.144 1.338 c
+67.851 1.338 67.634 1.239 67.498 1.044 c
+67.358 0.856 67.284 0.547 67.277 0.118 c
+67.277 -0.397 l
+67.277 -0.867 67.344 -1.201 67.483 -1.396 c
+67.63 -1.583 67.851 -1.675 68.144 -1.675 c
+72.289 -2.161 m
+72.249 -2.072 72.223 -1.926 72.216 -1.72 c
+71.981 -2.065 71.687 -2.234 71.334 -2.234 c
+70.97 -2.234 70.687 -2.138 70.481 -1.94 c
+70.284 -1.735 70.188 -1.448 70.188 -1.072 c
+70.188 -0.673 70.323 -0.353 70.599 -0.118 c
+70.872 0.125 71.246 0.25 71.716 0.25 c
+72.202 0.25 l
+72.202 0.676 l
+72.202 0.912 72.146 1.077 72.04 1.176 c
+71.93 1.282 71.768 1.338 71.555 1.338 c
+71.356 1.338 71.194 1.279 71.069 1.162 c
+70.952 1.044 70.893 0.896 70.893 0.721 c
+70.246 0.721 l
+70.246 0.915 70.305 1.106 70.423 1.294 c
+70.548 1.477 70.71 1.625 70.908 1.735 c
+71.113 1.841 71.342 1.897 71.599 1.897 c
+71.999 1.897 72.304 1.793 72.51 1.588 c
+72.723 1.382 72.837 1.087 72.848 0.706 c
+72.848 -1.308 l
+72.848 -1.613 72.885 -1.878 72.966 -2.102 c
+72.966 -2.161 l
+h
+71.422 -1.646 m
+71.587 -1.646 71.738 -1.602 71.878 -1.514 c
+72.025 -1.425 72.131 -1.315 72.202 -1.176 c
+72.202 -0.235 l
+71.834 -0.235 l
+71.518 -0.235 71.275 -0.305 71.099 -0.441 c
+70.922 -0.569 70.834 -0.757 70.834 -0.999 c
+70.834 -1.228 70.878 -1.392 70.967 -1.5 c
+71.055 -1.598 71.206 -1.646 71.422 -1.646 c
+74.554 -2.161 -0.647 5.644 re
+78.934 1.205 m
+78.845 1.224 78.746 1.235 78.639 1.235 c
+78.305 1.235 78.07 1.051 77.934 0.691 c
+77.934 -2.161 l
+77.287 -2.161 l
+77.287 1.823 l
+77.92 1.823 l
+77.934 1.411 l
+78.111 1.735 78.353 1.897 78.669 1.897 c
+78.776 1.897 78.864 1.874 78.934 1.837 c
+h
+80.933 -2.234 m
+80.433 -2.234 80.05 -2.088 79.786 -1.793 c
+79.522 -1.5 79.389 -1.066 79.389 -0.484 c
+79.389 -0.014 l
+79.389 0.58 79.514 1.047 79.771 1.382 c
+80.036 1.723 80.397 1.897 80.859 1.897 c
+81.318 1.897 81.66 1.742 81.888 1.44 c
+82.123 1.147 82.244 0.684 82.255 0.059 c
+82.255 -0.367 l
+80.036 -0.367 l
+80.036 -0.455 l
+80.036 -0.889 80.113 -1.201 80.271 -1.396 c
+80.436 -1.583 80.668 -1.675 80.962 -1.675 c
+81.157 -1.675 81.33 -1.643 81.477 -1.573 c
+81.623 -1.496 81.76 -1.378 81.888 -1.22 c
+82.226 -1.631 l
+81.939 -2.036 81.509 -2.234 80.933 -2.234 c
+80.859 1.338 m
+80.584 1.338 80.382 1.242 80.256 1.058 c
+80.127 0.871 80.054 0.58 80.036 0.191 c
+81.609 0.191 l
+81.609 0.279 l
+81.587 0.661 81.521 0.929 81.403 1.087 c
+81.286 1.253 81.102 1.338 80.859 1.338 c
+85.916 -0.367 m
+85.916 -0.995 85.798 -1.466 85.563 -1.778 c
+85.335 -2.084 85.019 -2.234 84.607 -2.234 c
+84.203 -2.234 83.894 -2.084 83.682 -1.778 c
+83.682 -3.69 l
+83.034 -3.69 l
+83.034 1.823 l
+83.622 1.823 l
+83.667 1.382 l
+83.88 1.723 84.189 1.897 84.592 1.897 c
+85.033 1.897 85.361 1.742 85.577 1.44 c
+85.791 1.135 85.905 0.68 85.916 0.073 c
+h
+85.269 0.015 m
+85.269 0.456 85.199 0.779 85.063 0.985 c
+84.923 1.198 84.703 1.309 84.401 1.309 c
+84.085 1.309 83.847 1.154 83.682 0.852 c
+83.682 -1.22 l
+83.847 -1.525 84.085 -1.675 84.401 -1.675 c
+84.696 -1.675 84.908 -1.573 85.048 -1.367 c
+85.184 -1.153 85.258 -0.823 85.269 -0.382 c
+h
+86.621 0.015 m
+86.621 0.592 86.757 1.047 87.032 1.382 c
+87.316 1.723 87.687 1.897 88.15 1.897 c
+88.609 1.897 88.977 1.727 89.253 1.397 c
+89.535 1.073 89.683 0.625 89.693 0.059 c
+89.693 -0.367 l
+89.693 -0.937 89.55 -1.392 89.267 -1.735 c
+88.991 -2.069 88.624 -2.234 88.164 -2.234 c
+87.701 -2.234 87.331 -2.072 87.048 -1.749 c
+86.772 -1.419 86.629 -0.977 86.621 -0.426 c
+h
+87.268 -0.367 m
+87.268 -0.771 87.345 -1.087 87.503 -1.323 c
+87.668 -1.558 87.889 -1.675 88.164 -1.675 c
+88.731 -1.675 89.024 -1.264 89.047 -0.441 c
+89.047 0.015 l
+89.047 0.416 88.962 0.735 88.796 0.97 c
+88.638 1.213 88.422 1.338 88.15 1.338 c
+87.885 1.338 87.668 1.213 87.503 0.97 c
+87.345 0.735 87.268 0.416 87.268 0.015 c
+h
+92.471 -1.147 m
+92.471 -0.999 92.416 -0.878 92.31 -0.779 c
+92.199 -0.683 91.994 -0.565 91.692 -0.426 c
+91.347 -0.279 91.104 -0.158 90.957 -0.058 c
+90.811 0.048 90.7 0.166 90.634 0.294 c
+90.564 0.419 90.531 0.577 90.531 0.765 c
+90.531 1.087 90.649 1.357 90.884 1.573 c
+91.119 1.786 91.42 1.897 91.795 1.897 c
+92.177 1.897 92.486 1.783 92.721 1.558 c
+92.956 1.33 93.074 1.044 93.074 0.691 c
+92.428 0.691 l
+92.428 0.867 92.368 1.018 92.251 1.147 c
+92.133 1.272 91.979 1.338 91.795 1.338 c
+91.597 1.338 91.446 1.282 91.339 1.176 c
+91.229 1.077 91.177 0.944 91.177 0.779 c
+91.177 0.651 91.215 0.544 91.295 0.456 c
+91.373 0.375 91.564 0.272 91.869 0.147 c
+92.347 -0.04 92.677 -0.228 92.854 -0.411 c
+93.03 -0.588 93.118 -0.816 93.118 -1.087 c
+93.118 -1.44 92.993 -1.72 92.75 -1.926 c
+92.515 -2.131 92.199 -2.234 91.81 -2.234 c
+91.387 -2.234 91.049 -2.117 90.795 -1.881 c
+90.539 -1.639 90.414 -1.334 90.414 -0.97 c
+91.06 -0.97 l
+91.067 -1.198 91.138 -1.374 91.266 -1.5 c
+91.391 -1.617 91.574 -1.675 91.81 -1.675 c
+92.023 -1.675 92.185 -1.628 92.295 -1.529 c
+92.413 -1.433 92.471 -1.305 92.471 -1.147 c
+94.662 -2.161 -0.647 3.984 re
+94.705 2.866 m
+94.705 2.756 94.676 2.664 94.618 2.587 c
+94.558 2.517 94.463 2.484 94.338 2.484 c
+94.221 2.484 94.125 2.517 94.059 2.587 c
+94 2.664 93.97 2.756 93.97 2.866 c
+93.97 2.984 94 3.076 94.059 3.146 c
+94.125 3.223 94.221 3.263 94.338 3.263 c
+94.463 3.263 94.558 3.223 94.618 3.146 c
+94.676 3.065 94.705 2.973 94.705 2.866 c
+96.528 2.778 m
+96.528 1.823 l
+97.131 1.823 l
+97.131 1.294 l
+96.528 1.294 l
+96.528 -1.176 l
+96.528 -1.334 96.55 -1.452 96.602 -1.529 c
+96.661 -1.61 96.748 -1.646 96.866 -1.646 c
+96.954 -1.646 97.043 -1.631 97.131 -1.602 c
+97.131 -2.161 l
+96.984 -2.208 96.829 -2.234 96.675 -2.234 c
+96.418 -2.234 96.224 -2.142 96.087 -1.955 c
+95.948 -1.771 95.881 -1.51 95.881 -1.176 c
+95.881 1.294 l
+95.279 1.294 l
+95.279 1.823 l
+95.881 1.823 l
+95.881 2.778 l
+h
+97.689 0.015 m
+97.689 0.592 97.826 1.047 98.101 1.382 c
+98.384 1.723 98.755 1.897 99.218 1.897 c
+99.678 1.897 100.045 1.727 100.32 1.397 c
+100.604 1.073 100.75 0.625 100.762 0.059 c
+100.762 -0.367 l
+100.762 -0.937 100.619 -1.392 100.336 -1.735 c
+100.06 -2.069 99.692 -2.234 99.233 -2.234 c
+98.77 -2.234 98.399 -2.072 98.115 -1.749 c
+97.84 -1.419 97.697 -0.977 97.689 -0.426 c
+h
+98.336 -0.367 m
+98.336 -0.771 98.414 -1.087 98.572 -1.323 c
+98.737 -1.558 98.957 -1.675 99.233 -1.675 c
+99.799 -1.675 100.093 -1.264 100.114 -0.441 c
+100.114 0.015 l
+100.114 0.416 100.031 0.735 99.865 0.97 c
+99.707 1.213 99.49 1.338 99.218 1.338 c
+98.954 1.338 98.737 1.213 98.572 0.97 c
+98.414 0.735 98.336 0.416 98.336 0.015 c
+h
+103.246 1.205 m
+103.158 1.224 103.058 1.235 102.952 1.235 c
+102.618 1.235 102.383 1.051 102.246 0.691 c
+102.246 -2.161 l
+101.6 -2.161 l
+101.6 1.823 l
+102.231 1.823 l
+102.246 1.411 l
+102.423 1.735 102.665 1.897 102.981 1.897 c
+103.088 1.897 103.176 1.874 103.246 1.837 c
+h
+105.053 -1.072 m
+105.774 1.823 l
+106.464 1.823 l
+105.171 -2.719 l
+105.072 -3.061 104.929 -3.322 104.745 -3.499 c
+104.569 -3.675 104.367 -3.763 104.143 -3.763 c
+104.054 -3.763 103.94 -3.74 103.804 -3.704 c
+103.804 -3.16 l
+103.952 -3.175 l
+104.135 -3.175 104.282 -3.131 104.392 -3.042 c
+104.499 -2.954 104.587 -2.796 104.657 -2.572 c
+104.775 -2.131 l
+103.613 1.823 l
+104.319 1.823 l
+h
+106.744 -1.808 m
+106.744 -1.691 106.777 -1.595 106.847 -1.514 c
+106.913 -1.437 107.016 -1.396 107.156 -1.396 c
+107.303 -1.396 107.409 -1.437 107.479 -1.514 c
+107.557 -1.595 107.597 -1.691 107.597 -1.808 c
+107.597 -1.918 107.557 -2.01 107.479 -2.088 c
+107.409 -2.165 107.303 -2.205 107.156 -2.205 c
+107.016 -2.205 106.913 -2.165 106.847 -2.088 c
+106.777 -2.01 106.744 -1.918 106.744 -1.808 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+287.665 337.903 234.667 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 389.6758 330.7339 cm
+0 0 m
+-2.954 -8.32 l
+-4.88 -8.32 l
+-1.911 -0.47 l
+-5.659 -0.47 l
+-5.659 1.043 l
+0 1.043 l
+h
+1.562 -7.394 m
+1.562 -7.1 1.658 -6.861 1.856 -6.674 c
+2.051 -6.49 2.304 -6.394 2.62 -6.394 c
+2.922 -6.394 3.171 -6.49 3.37 -6.674 c
+3.576 -6.861 3.678 -7.1 3.678 -7.394 c
+3.678 -7.699 3.576 -7.945 3.37 -8.129 c
+3.171 -8.306 2.922 -8.393 2.62 -8.393 c
+2.315 -8.393 2.062 -8.302 1.856 -8.114 c
+1.658 -7.93 1.562 -7.688 1.562 -7.394 c
+11.403 -4.896 m
+10.462 -4.896 l
+10.462 -8.32 l
+8.58 -8.32 l
+8.58 1.043 l
+11.594 1.043 l
+12.542 1.043 13.274 0.797 13.785 0.309 c
+14.302 -0.184 14.564 -0.879 14.564 -1.779 c
+14.564 -3.024 14.111 -3.896 13.211 -4.395 c
+14.843 -8.231 l
+14.843 -8.32 l
+12.814 -8.32 l
+h
+10.462 -3.323 m
+11.535 -3.323 l
+11.917 -3.323 12.2 -3.201 12.388 -2.955 c
+12.572 -2.702 12.667 -2.363 12.667 -1.941 c
+12.667 -1 12.303 -0.53 11.58 -0.53 c
+10.462 -0.53 l
+h
+20.917 -4.263 m
+17.978 -4.263 l
+17.978 -6.747 l
+21.461 -6.747 l
+21.461 -8.32 l
+16.081 -8.32 l
+16.081 1.043 l
+21.446 1.043 l
+21.446 -0.53 l
+17.978 -0.53 l
+17.978 -2.749 l
+20.917 -2.749 l
+h
+25.779 -5.748 m
+27.351 1.043 l
+29.454 1.043 l
+26.763 -8.32 l
+24.794 -8.32 l
+22.104 1.043 l
+24.206 1.043 l
+h
+35.388 -4.263 m
+32.448 -4.263 l
+32.448 -6.747 l
+35.932 -6.747 l
+35.932 -8.32 l
+30.552 -8.32 l
+30.552 1.043 l
+35.917 1.043 l
+35.917 -0.53 l
+32.448 -0.53 l
+32.448 -2.749 l
+35.388 -2.749 l
+h
+40.033 -4.896 m
+39.092 -4.896 l
+39.092 -8.32 l
+37.211 -8.32 l
+37.211 1.043 l
+40.224 1.043 l
+41.172 1.043 41.903 0.797 42.414 0.309 c
+42.932 -0.184 43.193 -0.879 43.193 -1.779 c
+43.193 -3.024 42.742 -3.896 41.841 -4.395 c
+43.473 -8.231 l
+43.473 -8.32 l
+41.444 -8.32 l
+h
+39.092 -3.323 m
+40.166 -3.323 l
+40.548 -3.323 40.831 -3.201 41.018 -2.955 c
+41.202 -2.702 41.297 -2.363 41.297 -1.941 c
+41.297 -1 40.933 -0.53 40.209 -0.53 c
+39.092 -0.53 l
+h
+50.462 -0.53 m
+48.139 -0.53 l
+48.139 -8.32 l
+46.243 -8.32 l
+46.243 -0.53 l
+43.965 -0.53 l
+43.965 1.043 l
+50.462 1.043 l
+h
+53.732 -8.32 -1.896 9.363 re
+61.979 -8.32 m
+60.082 -8.32 l
+57.319 -2.176 l
+57.319 -8.32 l
+55.423 -8.32 l
+55.423 1.043 l
+57.319 1.043 l
+60.082 -5.101 l
+60.082 1.043 l
+61.979 1.043 l
+h
+70.096 -7.262 m
+69.732 -7.655 69.288 -7.953 68.759 -8.158 c
+68.23 -8.353 67.649 -8.453 67.024 -8.453 c
+65.944 -8.453 65.106 -8.121 64.51 -7.453 c
+63.912 -6.787 63.607 -5.818 63.6 -4.543 c
+63.6 -2.852 l
+63.6 -1.559 63.879 -0.566 64.437 0.132 c
+65.003 0.826 65.826 1.176 66.906 1.176 c
+67.924 1.176 68.689 0.918 69.2 0.411 c
+69.718 -0.088 70.015 -0.875 70.096 -1.941 c
+68.259 -1.941 l
+68.207 -1.345 68.086 -0.938 67.891 -0.721 c
+67.693 -0.508 67.384 -0.397 66.966 -0.397 c
+66.455 -0.397 66.083 -0.585 65.848 -0.956 c
+65.62 -1.331 65.503 -1.922 65.495 -2.735 c
+65.495 -4.439 l
+65.495 -5.292 65.62 -5.917 65.878 -6.307 c
+66.131 -6.689 66.547 -6.88 67.127 -6.88 c
+67.498 -6.88 67.803 -6.806 68.038 -6.659 c
+68.2 -6.542 l
+68.2 -4.821 l
+66.877 -4.821 l
+66.877 -3.396 l
+70.096 -3.396 l
+h
+81.143 -5.204 m
+81.091 -6.273 80.79 -7.082 80.231 -7.629 c
+79.68 -8.181 78.908 -8.453 77.909 -8.453 c
+76.84 -8.453 76.02 -8.107 75.454 -7.408 c
+74.896 -6.714 74.617 -5.719 74.617 -4.425 c
+74.617 -2.852 l
+74.617 -1.559 74.903 -0.566 75.484 0.132 c
+76.072 0.826 76.884 1.176 77.923 1.176 c
+78.941 1.176 79.717 0.885 80.246 0.309 c
+80.776 -0.262 81.077 -1.081 81.158 -2.147 c
+79.261 -2.147 l
+79.239 -1.482 79.136 -1.025 78.952 -0.78 c
+78.765 -0.526 78.424 -0.397 77.923 -0.397 c
+77.424 -0.397 77.063 -0.574 76.851 -0.927 c
+76.645 -1.279 76.531 -1.864 76.512 -2.675 c
+76.512 -4.439 l
+76.512 -5.373 76.616 -6.012 76.821 -6.365 c
+77.034 -6.71 77.398 -6.88 77.909 -6.88 c
+78.397 -6.88 78.736 -6.762 78.923 -6.527 c
+79.118 -6.284 79.224 -5.843 79.247 -5.204 c
+h
+89.087 -8.32 m
+87.206 -8.32 l
+87.206 -4.308 l
+84.413 -4.308 l
+84.413 -8.32 l
+82.517 -8.32 l
+82.517 1.043 l
+84.413 1.043 l
+84.413 -2.749 l
+87.206 -2.749 l
+87.206 1.043 l
+89.087 1.043 l
+h
+95.427 -6.409 m
+92.854 -6.409 l
+92.354 -8.32 l
+90.355 -8.32 l
+93.28 1.043 l
+95.001 1.043 l
+97.954 -8.32 l
+95.926 -8.32 l
+h
+93.266 -4.821 m
+95.015 -4.821 l
+94.133 -1.485 l
+h
+105.609 -8.32 m
+103.713 -8.32 l
+100.95 -2.176 l
+100.95 -8.32 l
+99.053 -8.32 l
+99.053 1.043 l
+100.95 1.043 l
+103.713 -5.101 l
+103.713 1.043 l
+105.609 1.043 l
+h
+113.727 -7.262 m
+113.363 -7.655 112.919 -7.953 112.389 -8.158 c
+111.86 -8.353 111.279 -8.453 110.654 -8.453 c
+109.574 -8.453 108.736 -8.121 108.141 -7.453 c
+107.543 -6.787 107.237 -5.818 107.23 -4.543 c
+107.23 -2.852 l
+107.23 -1.559 107.51 -0.566 108.067 0.132 c
+108.634 0.826 109.457 1.176 110.537 1.176 c
+111.555 1.176 112.32 0.918 112.83 0.411 c
+113.349 -0.088 113.646 -0.875 113.727 -1.941 c
+111.89 -1.941 l
+111.838 -1.345 111.717 -0.938 111.522 -0.721 c
+111.323 -0.508 111.015 -0.397 110.596 -0.397 c
+110.085 -0.397 109.714 -0.585 109.479 -0.956 c
+109.251 -1.331 109.133 -1.922 109.126 -2.735 c
+109.126 -4.439 l
+109.126 -5.292 109.251 -5.917 109.508 -6.307 c
+109.762 -6.689 110.177 -6.88 110.758 -6.88 c
+111.129 -6.88 111.433 -6.806 111.669 -6.659 c
+111.83 -6.542 l
+111.83 -4.821 l
+110.508 -4.821 l
+110.508 -3.396 l
+113.727 -3.396 l
+h
+120.135 -4.263 m
+117.195 -4.263 l
+117.195 -6.747 l
+120.68 -6.747 l
+120.68 -8.32 l
+115.3 -8.32 l
+115.3 1.043 l
+120.665 1.043 l
+120.665 -0.53 l
+117.195 -0.53 l
+117.195 -2.749 l
+120.135 -2.749 l
+h
+125.893 -5.865 m
+125.893 -5.484 125.795 -5.197 125.6 -4.998 c
+125.401 -4.803 125.049 -4.601 124.542 -4.395 c
+123.601 -4.036 122.924 -3.616 122.513 -3.146 c
+122.101 -2.668 121.895 -2.099 121.895 -1.441 c
+121.895 -0.659 122.175 -0.026 122.734 0.455 c
+123.292 0.933 124.002 1.176 124.865 1.176 c
+125.442 1.176 125.957 1.051 126.408 0.808 c
+126.857 0.562 127.202 0.22 127.437 -0.221 c
+127.68 -0.662 127.805 -1.162 127.805 -1.721 c
+125.924 -1.721 l
+125.924 -1.279 125.828 -0.948 125.644 -0.721 c
+125.457 -0.497 125.188 -0.383 124.835 -0.383 c
+124.501 -0.383 124.241 -0.482 124.056 -0.676 c
+123.88 -0.864 123.792 -1.125 123.792 -1.455 c
+123.792 -1.713 123.894 -1.948 124.1 -2.161 c
+124.307 -2.367 124.667 -2.584 125.188 -2.808 c
+126.099 -3.132 126.761 -3.535 127.173 -4.013 c
+127.591 -4.495 127.805 -5.108 127.805 -5.85 c
+127.805 -6.666 127.544 -7.302 127.026 -7.761 c
+126.504 -8.225 125.799 -8.453 124.909 -8.453 c
+124.299 -8.453 123.748 -8.327 123.248 -8.085 c
+122.756 -7.832 122.37 -7.475 122.087 -7.012 c
+121.8 -6.542 121.66 -5.994 121.66 -5.366 c
+123.557 -5.366 l
+123.557 -5.906 123.659 -6.299 123.865 -6.542 c
+124.079 -6.787 124.428 -6.909 124.909 -6.909 c
+125.563 -6.909 125.893 -6.564 125.893 -5.865 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 307.601 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 300.7657 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.485 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.566 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+24.133 1.47 m
+24.033 1.477 23.931 1.488 23.823 1.5 c
+23.713 1.517 23.592 1.529 23.456 1.529 c
+23.28 1.529 23.121 1.488 22.986 1.411 c
+22.846 1.341 22.728 1.242 22.633 1.118 c
+22.545 0.989 22.475 0.842 22.427 0.676 c
+22.387 0.507 22.369 0.331 22.369 0.147 c
+22.369 -1.264 l
+21.471 -1.264 l
+21.471 0.985 l
+21.471 1.11 21.461 1.235 21.442 1.353 c
+21.432 1.477 21.417 1.595 21.398 1.706 c
+21.388 1.823 21.373 1.918 21.355 1.999 c
+21.332 2.087 21.314 2.161 21.296 2.219 c
+22.177 2.219 l
+22.185 2.168 22.196 2.117 22.207 2.058 c
+22.225 1.999 22.24 1.933 22.251 1.866 c
+22.269 1.808 22.284 1.742 22.296 1.675 c
+22.302 1.606 22.313 1.544 22.325 1.484 c
+22.339 1.484 l
+22.375 1.602 22.427 1.708 22.486 1.808 c
+22.552 1.903 22.633 1.988 22.722 2.058 c
+22.809 2.124 22.913 2.179 23.03 2.219 c
+23.155 2.256 23.302 2.278 23.471 2.278 c
+23.596 2.278 23.713 2.271 23.823 2.263 c
+23.942 2.253 24.044 2.238 24.133 2.219 c
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.029 25.518 -0.882 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.18 25.047 0.485 c
+25.047 0.816 25.091 1.095 25.18 1.323 c
+25.275 1.558 25.404 1.742 25.562 1.881 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.132 c
+27.664 2.043 27.829 1.911 27.958 1.735 c
+28.094 1.565 28.193 1.359 28.252 1.118 c
+28.318 0.882 28.355 0.617 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.022 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.441 c
+26.26 -0.529 26.344 -0.599 26.444 -0.646 c
+26.539 -0.698 26.653 -0.721 26.782 -0.721 c
+26.936 -0.721 27.076 -0.687 27.194 -0.617 c
+27.318 -0.551 27.407 -0.449 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.482 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.919 27.825 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.649 1.706 26.562 1.69 26.473 1.661 c
+26.385 1.631 26.304 1.58 26.238 1.514 c
+26.169 1.444 26.109 1.356 26.061 1.249 c
+26.021 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.003 27.447 1.124 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.706 26.738 1.706 c
+32.342 -0.25 m
+32.342 -0.419 32.301 -0.569 32.224 -0.706 c
+32.154 -0.834 32.052 -0.948 31.916 -1.043 c
+31.787 -1.132 31.625 -1.201 31.43 -1.249 c
+31.243 -1.297 31.027 -1.323 30.784 -1.323 c
+30.556 -1.323 30.358 -1.309 30.181 -1.278 c
+30.005 -1.249 29.847 -1.201 29.71 -1.132 c
+29.571 -1.055 29.461 -0.956 29.373 -0.838 c
+29.284 -0.721 29.215 -0.573 29.167 -0.397 c
+29.976 -0.279 l
+29.994 -0.378 30.023 -0.455 30.063 -0.515 c
+30.111 -0.573 30.17 -0.617 30.24 -0.646 c
+30.306 -0.676 30.387 -0.702 30.475 -0.721 c
+30.564 -0.731 30.666 -0.735 30.784 -0.735 c
+30.879 -0.735 30.975 -0.731 31.063 -0.721 c
+31.152 -0.702 31.229 -0.676 31.298 -0.646 c
+31.364 -0.617 31.416 -0.58 31.445 -0.529 c
+31.482 -0.482 31.504 -0.419 31.504 -0.338 c
+31.504 -0.243 31.474 -0.169 31.416 -0.118 c
+31.364 -0.07 31.298 -0.029 31.21 0 c
+31.122 0.037 31.011 0.066 30.886 0.088 c
+30.769 0.118 30.637 0.147 30.489 0.177 c
+30.35 0.214 30.211 0.254 30.063 0.294 c
+29.924 0.341 29.799 0.405 29.681 0.485 c
+29.571 0.563 29.483 0.661 29.417 0.779 c
+29.347 0.897 29.313 1.047 29.313 1.235 c
+29.313 1.389 29.344 1.532 29.402 1.661 c
+29.468 1.797 29.564 1.911 29.681 1.999 c
+29.806 2.087 29.964 2.153 30.152 2.205 c
+30.335 2.253 30.549 2.278 30.784 2.278 c
+30.967 2.278 31.144 2.256 31.313 2.219 c
+31.478 2.19 31.625 2.135 31.754 2.058 c
+31.879 1.988 31.989 1.889 32.077 1.764 c
+32.166 1.646 32.224 1.503 32.253 1.338 c
+31.46 1.264 l
+31.438 1.341 31.408 1.404 31.372 1.455 c
+31.331 1.514 31.283 1.558 31.225 1.588 c
+31.173 1.625 31.111 1.65 31.034 1.661 c
+30.953 1.668 30.872 1.675 30.784 1.675 c
+30.567 1.675 30.406 1.646 30.298 1.588 c
+30.188 1.536 30.137 1.448 30.137 1.323 c
+30.137 1.242 30.155 1.18 30.196 1.132 c
+30.244 1.08 30.306 1.043 30.387 1.014 c
+30.475 0.985 30.57 0.956 30.681 0.926 c
+30.788 0.904 30.909 0.882 31.048 0.852 c
+31.202 0.823 31.361 0.783 31.519 0.735 c
+31.673 0.684 31.813 0.621 31.931 0.544 c
+32.048 0.463 32.143 0.36 32.224 0.235 c
+32.301 0.106 32.342 -0.056 32.342 -0.25 c
+34.859 -1.323 m
+34.602 -1.323 34.374 -1.286 34.169 -1.22 c
+33.963 -1.143 33.786 -1.029 33.639 -0.882 c
+33.492 -0.727 33.375 -0.536 33.286 -0.309 c
+33.205 -0.085 33.169 0.18 33.169 0.485 c
+33.169 0.816 33.213 1.095 33.301 1.323 c
+33.396 1.558 33.525 1.742 33.683 1.881 c
+33.849 2.018 34.036 2.117 34.242 2.176 c
+34.447 2.242 34.657 2.278 34.874 2.278 c
+35.146 2.278 35.381 2.227 35.58 2.132 c
+35.785 2.043 35.95 1.911 36.079 1.735 c
+36.215 1.565 36.314 1.359 36.373 1.118 c
+36.44 0.882 36.476 0.617 36.476 0.324 c
+36.476 0.309 l
+34.109 0.309 l
+34.109 0.162 34.124 0.022 34.154 -0.103 c
+34.19 -0.231 34.246 -0.345 34.315 -0.441 c
+34.381 -0.529 34.466 -0.599 34.565 -0.646 c
+34.661 -0.698 34.774 -0.721 34.903 -0.721 c
+35.058 -0.721 35.197 -0.687 35.314 -0.617 c
+35.44 -0.551 35.528 -0.449 35.58 -0.309 c
+36.417 -0.382 l
+36.388 -0.482 36.332 -0.588 36.255 -0.706 c
+36.174 -0.816 36.072 -0.919 35.947 -1.014 c
+35.829 -1.103 35.675 -1.176 35.491 -1.234 c
+35.314 -1.294 35.102 -1.323 34.859 -1.323 c
+34.859 1.706 m
+34.771 1.706 34.682 1.69 34.595 1.661 c
+34.506 1.631 34.425 1.58 34.36 1.514 c
+34.29 1.444 34.231 1.356 34.183 1.249 c
+34.142 1.139 34.124 1.014 34.124 0.867 c
+35.594 0.867 l
+35.594 1.003 35.568 1.124 35.52 1.235 c
+35.48 1.341 35.425 1.43 35.359 1.5 c
+35.3 1.565 35.227 1.617 35.138 1.646 c
+35.05 1.683 34.955 1.706 34.859 1.706 c
+37.968 1.602 m
+37.424 1.602 l
+37.424 2.219 l
+38.012 2.219 l
+38.291 3.117 l
+38.865 3.117 l
+38.865 2.219 l
+40.099 2.219 l
+40.099 1.602 l
+38.865 1.602 l
+38.865 -0.103 l
+38.865 -0.324 l
+38.872 -0.393 38.894 -0.455 38.923 -0.515 c
+38.96 -0.566 39.015 -0.61 39.085 -0.646 c
+39.162 -0.676 39.276 -0.691 39.424 -0.691 c
+39.559 -0.691 39.695 -0.687 39.835 -0.676 c
+39.971 -0.658 40.103 -0.632 40.232 -0.603 c
+40.232 -1.205 l
+40.151 -1.216 40.074 -1.231 39.996 -1.249 c
+39.916 -1.261 39.838 -1.268 39.761 -1.278 c
+39.68 -1.286 39.592 -1.294 39.497 -1.294 c
+39.409 -1.301 39.309 -1.309 39.202 -1.309 c
+39.015 -1.309 38.853 -1.294 38.718 -1.264 c
+38.589 -1.228 38.475 -1.183 38.379 -1.132 c
+38.291 -1.084 38.218 -1.025 38.159 -0.956 c
+38.1 -0.879 38.056 -0.802 38.027 -0.721 c
+37.997 -0.632 37.975 -0.544 37.968 -0.455 c
+37.957 -0.36 37.953 -0.264 37.953 -0.176 c
+h
+46.236 -2.631 m
+46.236 3.513 l
+48.162 3.513 l
+48.162 2.896 l
+47.089 2.896 l
+47.089 -2.014 l
+48.162 -2.014 l
+48.162 -2.631 l
+h
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+54.196 0.838 1.866 -0.794 re
+54.196 0.044 m
+58.569 1.514 m
+58.686 1.785 58.837 1.984 59.024 2.102 c
+59.208 2.219 59.428 2.278 59.686 2.278 c
+59.891 2.278 60.061 2.242 60.2 2.176 c
+60.347 2.105 60.458 2.014 60.538 1.897 c
+60.627 1.779 60.685 1.635 60.714 1.47 c
+60.751 1.301 60.774 1.124 60.774 0.941 c
+60.774 -1.264 l
+59.862 -1.264 l
+59.862 0.735 l
+59.862 0.871 59.851 0.992 59.833 1.103 c
+59.822 1.209 59.796 1.297 59.76 1.367 c
+59.719 1.444 59.66 1.503 59.583 1.544 c
+59.513 1.58 59.421 1.602 59.303 1.602 c
+59.193 1.602 59.098 1.577 59.01 1.529 c
+58.921 1.477 58.84 1.411 58.775 1.323 c
+58.715 1.235 58.664 1.124 58.628 1 c
+58.598 0.882 58.584 0.75 58.584 0.603 c
+58.584 -1.264 l
+57.672 -1.264 l
+57.672 3.513 l
+58.584 3.513 l
+58.584 2.205 l
+58.584 2.135 58.576 2.065 58.569 1.999 c
+58.569 1.793 l
+58.569 1.735 58.561 1.679 58.554 1.631 c
+58.554 1.514 l
+h
+62.688 -1.323 m
+62.519 -1.323 62.368 -1.301 62.233 -1.264 c
+62.104 -1.216 61.99 -1.147 61.894 -1.058 c
+61.807 -0.97 61.736 -0.864 61.688 -0.735 c
+61.637 -0.599 61.615 -0.449 61.615 -0.279 c
+61.615 -0.073 61.649 0.096 61.718 0.235 c
+61.784 0.382 61.88 0.492 61.998 0.573 c
+62.122 0.661 62.266 0.724 62.424 0.765 c
+62.589 0.801 62.765 0.827 62.952 0.838 c
+63.673 0.852 l
+63.673 1.029 l
+63.673 1.147 63.662 1.249 63.644 1.338 c
+63.621 1.426 63.588 1.492 63.54 1.544 c
+63.5 1.602 63.453 1.639 63.394 1.661 c
+63.334 1.679 63.268 1.69 63.203 1.69 c
+63.133 1.69 63.07 1.679 63.012 1.661 c
+62.96 1.65 62.912 1.625 62.864 1.588 c
+62.824 1.558 62.791 1.507 62.761 1.44 c
+62.74 1.382 62.725 1.301 62.717 1.205 c
+61.776 1.249 l
+61.807 1.396 61.85 1.532 61.909 1.661 c
+61.975 1.785 62.071 1.897 62.189 1.984 c
+62.306 2.08 62.445 2.153 62.615 2.205 c
+62.791 2.253 62.997 2.278 63.232 2.278 c
+63.673 2.278 64.003 2.168 64.232 1.955 c
+64.467 1.749 64.585 1.44 64.585 1.029 c
+64.585 -0.235 l
+64.585 -0.455 l
+64.591 -0.515 64.606 -0.569 64.629 -0.617 c
+64.647 -0.658 64.676 -0.691 64.716 -0.721 c
+64.753 -0.742 64.805 -0.75 64.864 -0.75 c
+64.93 -0.75 64.999 -0.746 65.069 -0.735 c
+65.069 -1.22 l
+65.011 -1.231 64.955 -1.242 64.907 -1.249 c
+64.867 -1.261 64.826 -1.268 64.79 -1.278 c
+64.749 -1.286 64.706 -1.294 64.658 -1.294 c
+64.606 -1.301 64.548 -1.309 64.481 -1.309 c
+64.253 -1.309 64.088 -1.257 63.982 -1.147 c
+63.871 -1.029 63.808 -0.864 63.791 -0.646 c
+63.776 -0.646 l
+63.706 -0.757 63.636 -0.852 63.57 -0.941 c
+63.5 -1.022 63.423 -1.087 63.334 -1.147 c
+63.247 -1.205 63.147 -1.249 63.041 -1.278 c
+62.942 -1.309 62.824 -1.323 62.688 -1.323 c
+63.673 0.353 m
+63.247 0.338 l
+63.147 0.338 63.056 0.331 62.967 0.324 c
+62.887 0.312 62.821 0.287 62.761 0.25 c
+62.703 0.21 62.651 0.15 62.615 0.073 c
+62.574 0.004 62.555 -0.088 62.555 -0.206 c
+62.555 -0.374 62.589 -0.496 62.659 -0.573 c
+62.725 -0.654 62.824 -0.691 62.952 -0.691 c
+63.06 -0.691 63.158 -0.669 63.247 -0.617 c
+63.342 -0.569 63.423 -0.507 63.482 -0.426 c
+63.548 -0.349 63.6 -0.261 63.629 -0.162 c
+63.658 -0.056 63.673 0.059 63.673 0.177 c
+h
+68.807 1.47 m
+68.707 1.477 68.604 1.488 68.498 1.5 c
+68.388 1.517 68.267 1.529 68.13 1.529 c
+67.954 1.529 67.796 1.488 67.66 1.411 c
+67.521 1.341 67.403 1.242 67.307 1.118 c
+67.219 0.989 67.149 0.842 67.101 0.676 c
+67.061 0.507 67.043 0.331 67.043 0.147 c
+67.043 -1.264 l
+66.146 -1.264 l
+66.146 0.985 l
+66.146 1.11 66.135 1.235 66.117 1.353 c
+66.106 1.477 66.091 1.595 66.073 1.706 c
+66.062 1.823 66.047 1.918 66.029 1.999 c
+66.006 2.087 65.988 2.161 65.969 2.219 c
+66.852 2.219 l
+66.859 2.168 66.87 2.117 66.881 2.058 c
+66.9 1.999 66.914 1.933 66.925 1.866 c
+66.943 1.808 66.958 1.742 66.969 1.675 c
+66.977 1.606 66.987 1.544 66.999 1.484 c
+67.014 1.484 l
+67.05 1.602 67.101 1.708 67.16 1.808 c
+67.226 1.903 67.307 1.988 67.396 2.058 c
+67.484 2.124 67.586 2.179 67.704 2.219 c
+67.829 2.256 67.976 2.278 68.145 2.278 c
+68.27 2.278 68.388 2.271 68.498 2.263 c
+68.616 2.253 68.718 2.238 68.807 2.219 c
+h
+72.03 -1.264 m
+72.018 -1.246 72.007 -1.216 72 -1.176 c
+72 -1.128 71.993 -1.08 71.985 -1.029 c
+71.985 -0.97 71.978 -0.912 71.97 -0.852 c
+71.97 -0.691 l
+71.853 -0.926 71.71 -1.095 71.544 -1.191 c
+71.375 -1.278 71.176 -1.323 70.941 -1.323 c
+70.744 -1.323 70.567 -1.278 70.412 -1.191 c
+70.254 -1.103 70.122 -0.981 70.015 -0.823 c
+69.917 -0.658 69.84 -0.467 69.78 -0.25 c
+69.729 -0.037 69.707 0.206 69.707 0.47 c
+69.707 0.735 69.729 0.974 69.78 1.191 c
+69.84 1.415 69.917 1.606 70.015 1.764 c
+70.122 1.918 70.254 2.043 70.412 2.132 c
+70.578 2.227 70.769 2.278 70.985 2.278 c
+71.081 2.278 71.176 2.263 71.265 2.234 c
+71.361 2.213 71.456 2.179 71.544 2.132 c
+71.633 2.08 71.71 2.018 71.779 1.941 c
+71.857 1.86 71.92 1.768 71.97 1.661 c
+71.97 1.749 l
+71.97 1.897 l
+71.97 2.058 l
+71.97 2.234 l
+71.97 3.513 l
+72.867 3.513 l
+72.867 -0.5 l
+72.867 -0.676 72.871 -0.834 72.882 -0.97 c
+72.889 -1.099 72.897 -1.198 72.897 -1.264 c
+h
+71.985 0.485 m
+71.985 0.721 71.959 0.912 71.912 1.058 c
+71.872 1.213 71.816 1.338 71.75 1.426 c
+71.691 1.514 71.621 1.573 71.544 1.602 c
+71.463 1.639 71.386 1.661 71.309 1.661 c
+71.21 1.661 71.118 1.635 71.03 1.588 c
+70.949 1.548 70.883 1.477 70.824 1.382 c
+70.773 1.282 70.729 1.161 70.692 1.014 c
+70.663 0.867 70.648 0.684 70.648 0.47 c
+70.648 0.077 70.699 -0.216 70.809 -0.411 c
+70.927 -0.61 71.089 -0.706 71.294 -0.706 c
+71.371 -0.706 71.449 -0.687 71.529 -0.646 c
+71.606 -0.61 71.681 -0.544 71.75 -0.455 c
+71.816 -0.368 71.872 -0.246 71.912 -0.088 c
+71.959 0.066 71.985 0.257 71.985 0.485 c
+74.282 -2.631 m
+74.282 -2.014 l
+75.355 -2.014 l
+75.355 2.896 l
+74.282 2.896 l
+74.282 3.513 l
+76.207 3.513 l
+76.207 -2.631 l
+h
+82.789 -2.631 m
+82.789 3.513 l
+84.715 3.513 l
+84.715 2.896 l
+83.641 2.896 l
+83.641 -2.014 l
+84.715 -2.014 l
+84.715 -2.631 l
+h
+86.702 1.602 m
+86.159 1.602 l
+86.159 2.219 l
+86.747 2.219 l
+87.026 3.117 l
+87.599 3.117 l
+87.599 2.219 l
+88.834 2.219 l
+88.834 1.602 l
+87.599 1.602 l
+87.599 -0.103 l
+87.599 -0.324 l
+87.606 -0.393 87.629 -0.455 87.658 -0.515 c
+87.695 -0.566 87.75 -0.61 87.82 -0.646 c
+87.897 -0.676 88.011 -0.691 88.158 -0.691 c
+88.294 -0.691 88.43 -0.687 88.57 -0.676 c
+88.705 -0.658 88.838 -0.632 88.967 -0.603 c
+88.967 -1.205 l
+88.886 -1.216 88.809 -1.231 88.731 -1.249 c
+88.651 -1.261 88.573 -1.268 88.496 -1.278 c
+88.415 -1.286 88.327 -1.294 88.231 -1.294 c
+88.144 -1.301 88.044 -1.309 87.938 -1.309 c
+87.75 -1.309 87.588 -1.294 87.452 -1.264 c
+87.323 -1.228 87.209 -1.183 87.114 -1.132 c
+87.026 -1.084 86.953 -1.025 86.893 -0.956 c
+86.835 -0.879 86.791 -0.802 86.762 -0.721 c
+86.732 -0.632 86.71 -0.544 86.702 -0.455 c
+86.692 -0.36 86.688 -0.264 86.688 -0.176 c
+h
+91.116 -1.323 m
+90.947 -1.323 90.796 -1.301 90.66 -1.264 c
+90.532 -1.216 90.418 -1.147 90.322 -1.058 c
+90.234 -0.97 90.164 -0.864 90.116 -0.735 c
+90.065 -0.599 90.043 -0.449 90.043 -0.279 c
+90.043 -0.073 90.076 0.096 90.145 0.235 c
+90.212 0.382 90.307 0.492 90.425 0.573 c
+90.55 0.661 90.694 0.724 90.851 0.765 c
+91.017 0.801 91.193 0.827 91.381 0.838 c
+92.101 0.852 l
+92.101 1.029 l
+92.101 1.147 92.09 1.249 92.071 1.338 c
+92.049 1.426 92.017 1.492 91.969 1.544 c
+91.928 1.602 91.88 1.639 91.822 1.661 c
+91.763 1.679 91.697 1.69 91.631 1.69 c
+91.56 1.69 91.498 1.679 91.44 1.661 c
+91.388 1.65 91.34 1.625 91.292 1.588 c
+91.252 1.558 91.219 1.507 91.19 1.44 c
+91.167 1.382 91.153 1.301 91.145 1.205 c
+90.205 1.249 l
+90.234 1.396 90.278 1.532 90.337 1.661 c
+90.403 1.785 90.499 1.897 90.616 1.984 c
+90.734 2.08 90.874 2.153 91.043 2.205 c
+91.219 2.253 91.425 2.278 91.66 2.278 c
+92.101 2.278 92.431 2.168 92.659 1.955 c
+92.894 1.749 93.012 1.44 93.012 1.029 c
+93.012 -0.235 l
+93.012 -0.455 l
+93.019 -0.515 93.034 -0.569 93.056 -0.617 c
+93.075 -0.658 93.104 -0.691 93.145 -0.721 c
+93.181 -0.742 93.233 -0.75 93.291 -0.75 c
+93.358 -0.75 93.428 -0.746 93.497 -0.735 c
+93.497 -1.22 l
+93.438 -1.231 93.383 -1.242 93.335 -1.249 c
+93.295 -1.261 93.255 -1.268 93.218 -1.278 c
+93.177 -1.286 93.133 -1.294 93.086 -1.294 c
+93.034 -1.301 92.975 -1.309 92.909 -1.309 c
+92.682 -1.309 92.516 -1.257 92.41 -1.147 c
+92.3 -1.029 92.237 -0.864 92.219 -0.646 c
+92.204 -0.646 l
+92.134 -0.757 92.065 -0.852 91.998 -0.941 c
+91.928 -1.022 91.851 -1.087 91.763 -1.147 c
+91.675 -1.205 91.575 -1.249 91.469 -1.278 c
+91.369 -1.309 91.252 -1.323 91.116 -1.323 c
+92.101 0.353 m
+91.675 0.338 l
+91.575 0.338 91.483 0.331 91.396 0.324 c
+91.315 0.312 91.248 0.287 91.19 0.25 c
+91.13 0.21 91.08 0.15 91.043 0.073 c
+91.002 0.004 90.984 -0.088 90.984 -0.206 c
+90.984 -0.374 91.017 -0.496 91.086 -0.573 c
+91.153 -0.654 91.252 -0.691 91.381 -0.691 c
+91.487 -0.691 91.587 -0.669 91.675 -0.617 c
+91.77 -0.569 91.851 -0.507 91.91 -0.426 c
+91.976 -0.349 92.027 -0.261 92.057 -0.162 c
+92.086 -0.056 92.101 0.059 92.101 0.177 c
+h
+97.235 1.47 m
+97.135 1.477 97.033 1.488 96.926 1.5 c
+96.815 1.517 96.694 1.529 96.558 1.529 c
+96.382 1.529 96.224 1.488 96.088 1.411 c
+95.948 1.341 95.83 1.242 95.735 1.118 c
+95.647 0.989 95.577 0.842 95.529 0.676 c
+95.489 0.507 95.471 0.331 95.471 0.147 c
+95.471 -1.264 l
+94.574 -1.264 l
+94.574 0.985 l
+94.574 1.11 94.563 1.235 94.544 1.353 c
+94.534 1.477 94.519 1.595 94.5 1.706 c
+94.49 1.823 94.475 1.918 94.457 1.999 c
+94.434 2.087 94.416 2.161 94.398 2.219 c
+95.28 2.219 l
+95.287 2.168 95.298 2.117 95.309 2.058 c
+95.327 1.999 95.342 1.933 95.353 1.866 c
+95.371 1.808 95.386 1.742 95.398 1.675 c
+95.404 1.606 95.415 1.544 95.427 1.484 c
+95.441 1.484 l
+95.478 1.602 95.529 1.708 95.589 1.808 c
+95.654 1.903 95.735 1.988 95.824 2.058 c
+95.911 2.124 96.015 2.179 96.132 2.219 c
+96.257 2.256 96.404 2.278 96.573 2.278 c
+96.698 2.278 96.815 2.271 96.926 2.263 c
+97.044 2.253 97.146 2.238 97.235 2.219 c
+h
+99.814 -2.66 m
+99.597 -2.66 99.406 -2.635 99.24 -2.587 c
+99.072 -2.547 98.932 -2.485 98.814 -2.396 c
+98.697 -2.315 98.598 -2.219 98.521 -2.102 c
+98.451 -1.984 98.403 -1.856 98.374 -1.72 c
+99.271 -1.617 l
+99.307 -1.753 99.377 -1.86 99.476 -1.94 c
+99.572 -2.028 99.697 -2.072 99.844 -2.072 c
+99.932 -2.072 100.013 -2.057 100.094 -2.028 c
+100.171 -1.999 100.24 -1.944 100.299 -1.866 c
+100.358 -1.797 100.402 -1.705 100.431 -1.587 c
+100.468 -1.469 100.491 -1.323 100.491 -1.147 c
+100.491 -0.956 l
+100.491 -0.889 100.494 -0.831 100.505 -0.779 c
+100.505 -0.588 l
+100.491 -0.588 l
+100.391 -0.816 100.248 -0.977 100.064 -1.073 c
+99.876 -1.172 99.671 -1.22 99.447 -1.22 c
+99.24 -1.22 99.057 -1.183 98.903 -1.103 c
+98.756 -1.014 98.627 -0.897 98.521 -0.75 c
+98.421 -0.596 98.348 -0.411 98.3 -0.206 c
+98.249 0.008 98.226 0.243 98.226 0.5 c
+98.226 0.771 98.249 1.018 98.3 1.235 c
+98.359 1.448 98.44 1.631 98.55 1.779 c
+98.656 1.933 98.789 2.051 98.947 2.132 c
+99.101 2.219 99.288 2.263 99.506 2.263 c
+99.601 2.263 99.701 2.253 99.799 2.234 c
+99.895 2.213 99.984 2.179 100.064 2.132 c
+100.152 2.08 100.229 2.018 100.299 1.941 c
+100.377 1.86 100.439 1.768 100.491 1.661 c
+100.505 1.661 l
+100.505 1.808 l
+100.512 1.866 100.52 1.918 100.52 1.97 c
+100.527 2.028 100.534 2.076 100.534 2.117 c
+100.542 2.165 100.553 2.198 100.564 2.219 c
+101.416 2.219 l
+101.405 2.138 101.395 2.028 101.387 1.881 c
+101.387 1.411 l
+101.387 -1.161 l
+101.387 -1.415 101.351 -1.635 101.284 -1.822 c
+101.214 -2.007 101.112 -2.161 100.975 -2.278 c
+100.836 -2.404 100.67 -2.499 100.476 -2.558 c
+100.277 -2.624 100.057 -2.66 99.814 -2.66 c
+100.505 0.53 m
+100.505 0.742 100.479 0.919 100.431 1.058 c
+100.391 1.205 100.336 1.323 100.27 1.411 c
+100.211 1.5 100.142 1.558 100.064 1.588 c
+99.984 1.625 99.907 1.646 99.828 1.646 c
+99.73 1.646 99.637 1.621 99.55 1.573 c
+99.469 1.532 99.402 1.463 99.344 1.367 c
+99.292 1.278 99.248 1.161 99.211 1.014 c
+99.182 0.875 99.167 0.706 99.167 0.5 c
+99.167 0.125 99.226 -0.154 99.344 -0.338 c
+99.462 -0.515 99.623 -0.603 99.828 -0.603 c
+99.895 -0.603 99.969 -0.588 100.049 -0.559 c
+100.138 -0.522 100.211 -0.463 100.27 -0.382 c
+100.336 -0.294 100.391 -0.176 100.431 -0.029 c
+100.479 0.118 100.505 0.301 100.505 0.53 c
+103.905 -1.323 m
+103.647 -1.323 103.419 -1.286 103.213 -1.22 c
+103.007 -1.143 102.831 -1.029 102.685 -0.882 c
+102.537 -0.727 102.419 -0.536 102.332 -0.309 c
+102.251 -0.085 102.214 0.18 102.214 0.485 c
+102.214 0.816 102.258 1.095 102.346 1.323 c
+102.442 1.558 102.571 1.742 102.729 1.881 c
+102.893 2.018 103.081 2.117 103.287 2.176 c
+103.493 2.242 103.702 2.278 103.919 2.278 c
+104.191 2.278 104.426 2.227 104.624 2.132 c
+104.83 2.043 104.996 1.911 105.124 1.735 c
+105.26 1.565 105.359 1.359 105.418 1.118 c
+105.484 0.882 105.521 0.617 105.521 0.324 c
+105.521 0.309 l
+103.155 0.309 l
+103.155 0.162 103.169 0.022 103.199 -0.103 c
+103.236 -0.231 103.29 -0.345 103.36 -0.441 c
+103.427 -0.529 103.511 -0.599 103.61 -0.646 c
+103.706 -0.698 103.82 -0.721 103.948 -0.721 c
+104.102 -0.721 104.242 -0.687 104.36 -0.617 c
+104.485 -0.551 104.573 -0.449 104.624 -0.309 c
+105.463 -0.382 l
+105.432 -0.482 105.378 -0.588 105.301 -0.706 c
+105.22 -0.816 105.117 -0.919 104.992 -1.014 c
+104.875 -1.103 104.72 -1.176 104.536 -1.234 c
+104.36 -1.294 104.146 -1.323 103.905 -1.323 c
+103.905 1.706 m
+103.816 1.706 103.728 1.69 103.639 1.661 c
+103.551 1.631 103.471 1.58 103.404 1.514 c
+103.335 1.444 103.276 1.356 103.228 1.249 c
+103.188 1.139 103.169 1.014 103.169 0.867 c
+104.639 0.867 l
+104.639 1.003 104.613 1.124 104.566 1.235 c
+104.526 1.341 104.47 1.43 104.404 1.5 c
+104.345 1.565 104.272 1.617 104.183 1.646 c
+104.096 1.683 104 1.706 103.905 1.706 c
+107.009 1.602 m
+106.465 1.602 l
+106.465 2.219 l
+107.053 2.219 l
+107.333 3.117 l
+107.906 3.117 l
+107.906 2.219 l
+109.141 2.219 l
+109.141 1.602 l
+107.906 1.602 l
+107.906 -0.103 l
+107.906 -0.324 l
+107.913 -0.393 107.936 -0.455 107.965 -0.515 c
+108.002 -0.566 108.057 -0.61 108.127 -0.646 c
+108.204 -0.676 108.318 -0.691 108.464 -0.691 c
+108.601 -0.691 108.736 -0.687 108.876 -0.676 c
+109.012 -0.658 109.145 -0.632 109.273 -0.603 c
+109.273 -1.205 l
+109.193 -1.216 109.115 -1.231 109.038 -1.249 c
+108.957 -1.261 108.88 -1.268 108.803 -1.278 c
+108.722 -1.286 108.634 -1.294 108.538 -1.294 c
+108.45 -1.301 108.351 -1.309 108.244 -1.309 c
+108.057 -1.309 107.895 -1.294 107.759 -1.264 c
+107.63 -1.228 107.516 -1.183 107.421 -1.132 c
+107.333 -1.084 107.259 -1.025 107.2 -0.956 c
+107.142 -0.879 107.098 -0.802 107.068 -0.721 c
+107.039 -0.632 107.017 -0.544 107.009 -0.455 c
+106.999 -0.36 106.995 -0.264 106.995 -0.176 c
+h
+117.542 1.47 m
+117.442 1.477 117.339 1.488 117.232 1.5 c
+117.122 1.517 117.001 1.529 116.865 1.529 c
+116.688 1.529 116.53 1.488 116.395 1.411 c
+116.255 1.341 116.137 1.242 116.042 1.118 c
+115.954 0.989 115.884 0.842 115.836 0.676 c
+115.796 0.507 115.778 0.331 115.778 0.147 c
+115.778 -1.264 l
+114.88 -1.264 l
+114.88 0.985 l
+114.88 1.11 114.87 1.235 114.851 1.353 c
+114.84 1.477 114.826 1.595 114.807 1.706 c
+114.797 1.823 114.781 1.918 114.763 1.999 c
+114.741 2.087 114.723 2.161 114.704 2.219 c
+115.586 2.219 l
+115.593 2.168 115.605 2.117 115.616 2.058 c
+115.634 1.999 115.649 1.933 115.66 1.866 c
+115.678 1.808 115.693 1.742 115.703 1.675 c
+115.711 1.606 115.722 1.544 115.734 1.484 c
+115.748 1.484 l
+115.784 1.602 115.836 1.708 115.895 1.808 c
+115.961 1.903 116.042 1.988 116.13 2.058 c
+116.218 2.124 116.321 2.179 116.439 2.219 c
+116.564 2.256 116.711 2.278 116.879 2.278 c
+117.004 2.278 117.122 2.271 117.232 2.263 c
+117.35 2.253 117.453 2.238 117.542 2.219 c
+h
+120.15 -1.323 m
+119.893 -1.323 119.665 -1.286 119.46 -1.22 c
+119.254 -1.143 119.077 -1.029 118.93 -0.882 c
+118.783 -0.727 118.666 -0.536 118.577 -0.309 c
+118.496 -0.085 118.46 0.18 118.46 0.485 c
+118.46 0.816 118.504 1.095 118.592 1.323 c
+118.687 1.558 118.816 1.742 118.974 1.881 c
+119.14 2.018 119.327 2.117 119.533 2.176 c
+119.739 2.242 119.948 2.278 120.165 2.278 c
+120.437 2.278 120.672 2.227 120.871 2.132 c
+121.076 2.043 121.242 1.911 121.37 1.735 c
+121.506 1.565 121.606 1.359 121.664 1.118 c
+121.731 0.882 121.767 0.617 121.767 0.324 c
+121.767 0.309 l
+119.401 0.309 l
+119.401 0.162 119.416 0.022 119.445 -0.103 c
+119.481 -0.231 119.537 -0.345 119.607 -0.441 c
+119.672 -0.529 119.757 -0.599 119.857 -0.646 c
+119.952 -0.698 120.066 -0.721 120.195 -0.721 c
+120.349 -0.721 120.488 -0.687 120.606 -0.617 c
+120.731 -0.551 120.819 -0.449 120.871 -0.309 c
+121.708 -0.382 l
+121.679 -0.482 121.624 -0.588 121.546 -0.706 c
+121.465 -0.816 121.363 -0.919 121.238 -1.014 c
+121.12 -1.103 120.966 -1.176 120.782 -1.234 c
+120.606 -1.294 120.393 -1.323 120.15 -1.323 c
+120.15 1.706 m
+120.062 1.706 119.974 1.69 119.886 1.661 c
+119.798 1.631 119.717 1.58 119.651 1.514 c
+119.581 1.444 119.522 1.356 119.474 1.249 c
+119.433 1.139 119.416 1.014 119.416 0.867 c
+120.885 0.867 l
+120.885 1.003 120.86 1.124 120.812 1.235 c
+120.771 1.341 120.717 1.43 120.65 1.5 c
+120.591 1.565 120.518 1.617 120.43 1.646 c
+120.341 1.683 120.246 1.706 120.15 1.706 c
+124.299 1.602 m
+124.299 -1.264 l
+123.402 -1.264 l
+123.402 1.602 l
+122.579 1.602 l
+122.579 2.219 l
+123.402 2.219 l
+123.402 2.484 l
+123.402 2.609 123.417 2.741 123.447 2.881 c
+123.483 3.017 123.553 3.135 123.653 3.234 c
+123.759 3.341 123.902 3.429 124.079 3.499 c
+124.255 3.564 124.48 3.601 124.755 3.601 c
+124.968 3.601 125.166 3.59 125.343 3.572 c
+125.519 3.549 125.67 3.532 125.798 3.513 c
+125.798 2.925 l
+125.67 2.944 125.527 2.959 125.372 2.969 c
+125.214 2.977 125.064 2.984 124.916 2.984 c
+124.788 2.984 124.685 2.969 124.608 2.94 c
+124.527 2.911 124.465 2.87 124.417 2.822 c
+124.366 2.77 124.332 2.708 124.314 2.631 c
+124.303 2.562 124.299 2.484 124.299 2.396 c
+124.299 2.219 l
+125.725 2.219 l
+125.725 1.602 l
+h
+128.272 -1.323 m
+128.014 -1.323 127.786 -1.286 127.58 -1.22 c
+127.375 -1.143 127.198 -1.029 127.052 -0.882 c
+126.905 -0.727 126.787 -0.536 126.699 -0.309 c
+126.618 -0.085 126.581 0.18 126.581 0.485 c
+126.581 0.816 126.625 1.095 126.714 1.323 c
+126.809 1.558 126.938 1.742 127.096 1.881 c
+127.261 2.018 127.449 2.117 127.655 2.176 c
+127.86 2.242 128.069 2.278 128.286 2.278 c
+128.559 2.278 128.794 2.227 128.991 2.132 c
+129.197 2.043 129.363 1.911 129.492 1.735 c
+129.627 1.565 129.727 1.359 129.785 1.118 c
+129.852 0.882 129.889 0.617 129.889 0.324 c
+129.889 0.309 l
+127.522 0.309 l
+127.522 0.162 127.537 0.022 127.566 -0.103 c
+127.603 -0.231 127.658 -0.345 127.728 -0.441 c
+127.794 -0.529 127.878 -0.599 127.977 -0.646 c
+128.073 -0.698 128.187 -0.721 128.316 -0.721 c
+128.47 -0.721 128.609 -0.687 128.727 -0.617 c
+128.852 -0.551 128.941 -0.449 128.991 -0.309 c
+129.83 -0.382 l
+129.8 -0.482 129.745 -0.588 129.668 -0.706 c
+129.587 -0.816 129.484 -0.919 129.359 -1.014 c
+129.242 -1.103 129.087 -1.176 128.904 -1.234 c
+128.727 -1.294 128.514 -1.323 128.272 -1.323 c
+128.272 1.706 m
+128.183 1.706 128.095 1.69 128.007 1.661 c
+127.919 1.631 127.838 1.58 127.772 1.514 c
+127.702 1.444 127.643 1.356 127.595 1.249 c
+127.555 1.139 127.537 1.014 127.537 0.867 c
+129.006 0.867 l
+129.006 1.003 128.981 1.124 128.933 1.235 c
+128.893 1.341 128.837 1.43 128.771 1.5 c
+128.713 1.565 128.639 1.617 128.551 1.646 c
+128.463 1.683 128.367 1.706 128.272 1.706 c
+133.787 1.47 m
+133.688 1.477 133.585 1.488 133.479 1.5 c
+133.369 1.517 133.247 1.529 133.111 1.529 c
+132.935 1.529 132.777 1.488 132.641 1.411 c
+132.501 1.341 132.384 1.242 132.288 1.118 c
+132.2 0.989 132.13 0.842 132.083 0.676 c
+132.042 0.507 132.023 0.331 132.023 0.147 c
+132.023 -1.264 l
+131.127 -1.264 l
+131.127 0.985 l
+131.127 1.11 131.116 1.235 131.098 1.353 c
+131.086 1.477 131.071 1.595 131.053 1.706 c
+131.042 1.823 131.028 1.918 131.009 1.999 c
+130.988 2.087 130.969 2.161 130.951 2.219 c
+131.832 2.219 l
+131.84 2.168 131.851 2.117 131.862 2.058 c
+131.88 1.999 131.895 1.933 131.906 1.866 c
+131.925 1.808 131.939 1.742 131.95 1.675 c
+131.958 1.606 131.969 1.544 131.979 1.484 c
+131.994 1.484 l
+132.031 1.602 132.083 1.708 132.141 1.808 c
+132.207 1.903 132.288 1.988 132.376 2.058 c
+132.465 2.124 132.567 2.179 132.685 2.219 c
+132.81 2.256 132.957 2.278 133.126 2.278 c
+133.251 2.278 133.369 2.271 133.479 2.263 c
+133.596 2.253 133.699 2.238 133.787 2.219 c
+h
+136.393 -1.323 m
+136.135 -1.323 135.908 -1.286 135.702 -1.22 c
+135.497 -1.143 135.32 -1.029 135.173 -0.882 c
+135.026 -0.727 134.909 -0.536 134.82 -0.309 c
+134.739 -0.085 134.703 0.18 134.703 0.485 c
+134.703 0.816 134.747 1.095 134.834 1.323 c
+134.93 1.558 135.059 1.742 135.217 1.881 c
+135.382 2.018 135.57 2.117 135.775 2.176 c
+135.981 2.242 136.191 2.278 136.407 2.278 c
+136.679 2.278 136.914 2.227 137.113 2.132 c
+137.319 2.043 137.484 1.911 137.613 1.735 c
+137.749 1.565 137.848 1.359 137.907 1.118 c
+137.973 0.882 138.009 0.617 138.009 0.324 c
+138.009 0.309 l
+135.643 0.309 l
+135.643 0.162 135.657 0.022 135.688 -0.103 c
+135.724 -0.231 135.779 -0.345 135.849 -0.441 c
+135.915 -0.529 136 -0.599 136.099 -0.646 c
+136.195 -0.698 136.308 -0.721 136.437 -0.721 c
+136.592 -0.721 136.731 -0.687 136.848 -0.617 c
+136.974 -0.551 137.062 -0.449 137.113 -0.309 c
+137.951 -0.382 l
+137.922 -0.482 137.866 -0.588 137.789 -0.706 c
+137.708 -0.816 137.606 -0.919 137.481 -1.014 c
+137.363 -1.103 137.209 -1.176 137.025 -1.234 c
+136.848 -1.294 136.635 -1.323 136.393 -1.323 c
+136.393 1.706 m
+136.305 1.706 136.216 1.69 136.128 1.661 c
+136.04 1.631 135.959 1.58 135.893 1.514 c
+135.823 1.444 135.765 1.356 135.717 1.249 c
+135.676 1.139 135.657 1.014 135.657 0.867 c
+137.128 0.867 l
+137.128 1.003 137.102 1.124 137.054 1.235 c
+137.014 1.341 136.958 1.43 136.893 1.5 c
+136.833 1.565 136.76 1.617 136.672 1.646 c
+136.584 1.683 136.488 1.706 136.393 1.706 c
+141.089 -1.264 m
+141.089 0.721 l
+141.089 1.022 141.045 1.242 140.957 1.382 c
+140.876 1.529 140.74 1.602 140.546 1.602 c
+140.435 1.602 140.332 1.577 140.237 1.529 c
+140.149 1.477 140.068 1.411 140.002 1.323 c
+139.943 1.235 139.891 1.124 139.854 1 c
+139.825 0.882 139.81 0.75 139.81 0.603 c
+139.81 -1.264 l
+138.899 -1.264 l
+138.899 1.44 l
+138.899 1.661 l
+138.899 1.749 138.892 1.826 138.884 1.897 c
+138.884 2.087 l
+138.884 2.219 l
+139.737 2.219 l
+139.744 2.19 139.752 2.146 139.752 2.087 c
+139.752 1.897 l
+139.759 1.826 139.767 1.756 139.767 1.69 c
+139.773 1.621 139.781 1.565 139.781 1.529 c
+139.796 1.529 l
+139.913 1.793 140.064 1.984 140.251 2.102 c
+140.435 2.219 140.656 2.278 140.912 2.278 c
+141.097 2.278 141.259 2.249 141.398 2.19 c
+141.534 2.132 141.648 2.043 141.736 1.926 c
+141.824 1.808 141.886 1.665 141.927 1.5 c
+141.975 1.341 142.001 1.154 142.001 0.941 c
+142.001 -1.264 l
+h
+144.517 -1.323 m
+144.231 -1.323 143.989 -1.282 143.783 -1.205 c
+143.577 -1.117 143.404 -0.996 143.268 -0.838 c
+143.129 -0.684 143.025 -0.496 142.959 -0.279 c
+142.89 -0.056 142.857 0.191 142.857 0.455 c
+142.857 0.75 142.89 1.007 142.959 1.235 c
+143.037 1.459 143.143 1.646 143.283 1.793 c
+143.43 1.947 143.607 2.065 143.812 2.146 c
+144.018 2.234 144.253 2.278 144.517 2.278 c
+144.742 2.278 144.943 2.249 145.12 2.19 c
+145.297 2.132 145.448 2.047 145.576 1.941 c
+145.701 1.841 145.804 1.72 145.884 1.573 c
+145.962 1.433 146.017 1.282 146.046 1.118 c
+145.135 1.073 l
+145.105 1.249 145.036 1.389 144.929 1.5 c
+144.83 1.606 144.687 1.661 144.503 1.661 c
+144.257 1.661 144.081 1.558 143.974 1.353 c
+143.864 1.154 143.812 0.867 143.812 0.485 c
+143.812 -0.309 144.047 -0.706 144.517 -0.706 c
+144.683 -0.706 144.827 -0.654 144.943 -0.544 c
+145.062 -0.437 145.135 -0.276 145.165 -0.058 c
+146.076 -0.103 l
+146.046 -0.272 145.991 -0.426 145.914 -0.573 c
+145.845 -0.721 145.741 -0.852 145.606 -0.97 c
+145.477 -1.08 145.319 -1.168 145.135 -1.234 c
+144.959 -1.294 144.753 -1.323 144.517 -1.323 c
+148.578 -1.323 m
+148.321 -1.323 148.093 -1.286 147.887 -1.22 c
+147.682 -1.143 147.505 -1.029 147.358 -0.882 c
+147.212 -0.727 147.094 -0.536 147.006 -0.309 c
+146.925 -0.085 146.888 0.18 146.888 0.485 c
+146.888 0.816 146.932 1.095 147.021 1.323 c
+147.116 1.558 147.245 1.742 147.403 1.881 c
+147.568 2.018 147.755 2.117 147.961 2.176 c
+148.166 2.242 148.376 2.278 148.593 2.278 c
+148.865 2.278 149.1 2.227 149.298 2.132 c
+149.504 2.043 149.67 1.911 149.799 1.735 c
+149.934 1.565 150.034 1.359 150.092 1.118 c
+150.158 0.882 150.196 0.617 150.196 0.324 c
+150.196 0.309 l
+147.829 0.309 l
+147.829 0.162 147.844 0.022 147.873 -0.103 c
+147.91 -0.231 147.964 -0.345 148.035 -0.441 c
+148.101 -0.529 148.185 -0.599 148.284 -0.646 c
+148.38 -0.698 148.494 -0.721 148.623 -0.721 c
+148.777 -0.721 148.916 -0.687 149.034 -0.617 c
+149.159 -0.551 149.247 -0.449 149.298 -0.309 c
+150.136 -0.382 l
+150.107 -0.482 150.052 -0.588 149.975 -0.706 c
+149.894 -0.816 149.791 -0.919 149.666 -1.014 c
+149.548 -1.103 149.394 -1.176 149.211 -1.234 c
+149.034 -1.294 148.821 -1.323 148.578 -1.323 c
+148.578 1.706 m
+148.49 1.706 148.402 1.69 148.314 1.661 c
+148.226 1.631 148.145 1.58 148.079 1.514 c
+148.008 1.444 147.95 1.356 147.902 1.249 c
+147.862 1.139 147.844 1.014 147.844 0.867 c
+149.313 0.867 l
+149.313 1.003 149.288 1.124 149.24 1.235 c
+149.199 1.341 149.144 1.43 149.078 1.5 c
+149.02 1.565 148.945 1.617 148.858 1.646 c
+148.769 1.683 148.674 1.706 148.578 1.706 c
+151.449 -2.631 m
+151.449 -2.014 l
+152.521 -2.014 l
+152.521 2.896 l
+151.449 2.896 l
+151.449 3.513 l
+153.373 3.513 l
+153.373 -2.631 l
+h
+f
+Q
+q 1 0 0 1 296.7449 285.9641 cm
+0 0 m
+0 0.264 -0.073 0.463 -0.22 0.602 c
+-0.36 0.75 -0.617 0.889 -0.999 1.028 c
+-1.374 1.165 -1.661 1.308 -1.866 1.455 c
+-2.065 1.602 -2.212 1.768 -2.308 1.955 c
+-2.407 2.15 -2.454 2.37 -2.454 2.616 c
+-2.454 3.035 -2.315 3.384 -2.028 3.659 c
+-1.745 3.931 -1.378 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.088 3.85 c
+0.154 3.711 0.341 3.516 0.47 3.262 c
+0.607 3.017 0.676 2.749 0.676 2.454 c
+0 2.454 l
+0 2.786 -0.081 3.042 -0.235 3.219 c
+-0.393 3.403 -0.625 3.498 -0.926 3.498 c
+-1.191 3.498 -1.404 3.417 -1.558 3.262 c
+-1.705 3.116 -1.779 2.903 -1.779 2.631 c
+-1.779 2.403 -1.702 2.212 -1.544 2.057 c
+-1.378 1.911 -1.124 1.77 -0.779 1.646 c
+-0.261 1.477 0.11 1.267 0.338 1.014 c
+0.573 0.756 0.69 0.426 0.69 0.014 c
+0.69 -0.426 0.548 -0.779 0.264 -1.044 c
+-0.022 -1.301 -0.405 -1.426 -0.882 -1.426 c
+-1.198 -1.426 -1.484 -1.357 -1.749 -1.22 c
+-2.014 -1.085 -2.227 -0.894 -2.381 -0.647 c
+-2.528 -0.405 -2.602 -0.118 -2.602 0.205 c
+-1.926 0.205 l
+-1.926 -0.129 -1.834 -0.389 -1.646 -0.574 c
+-1.463 -0.761 -1.205 -0.853 -0.882 -0.853 c
+-0.588 -0.853 -0.368 -0.779 -0.22 -0.632 c
+-0.073 -0.478 0 -0.265 0 0 c
+4.439 -0.206 m
+5.041 2.631 l
+5.689 2.631 l
+4.704 -1.353 l
+4.189 -1.353 l
+3.41 1.499 l
+2.66 -1.353 l
+2.132 -1.353 l
+1.176 2.631 l
+1.808 2.631 l
+2.425 -0.133 l
+3.16 2.631 l
+3.675 2.631 l
+h
+7.071 -1.353 -0.647 3.984 re
+7.115 3.675 m
+7.115 3.564 7.085 3.472 7.026 3.395 c
+6.967 3.326 6.872 3.293 6.747 3.293 c
+6.629 3.293 6.533 3.326 6.468 3.395 c
+6.409 3.472 6.379 3.564 6.379 3.675 c
+6.379 3.792 6.409 3.884 6.468 3.954 c
+6.533 4.031 6.629 4.072 6.747 4.072 c
+6.872 4.072 6.967 4.031 7.026 3.954 c
+7.085 3.873 7.115 3.781 7.115 3.675 c
+8.937 3.586 m
+8.937 2.631 l
+9.54 2.631 l
+9.54 2.102 l
+8.937 2.102 l
+8.937 -0.368 l
+8.937 -0.526 8.96 -0.643 9.01 -0.721 c
+9.07 -0.802 9.157 -0.838 9.275 -0.838 c
+9.363 -0.838 9.452 -0.823 9.54 -0.794 c
+9.54 -1.353 l
+9.392 -1.401 9.238 -1.426 9.084 -1.426 c
+8.827 -1.426 8.632 -1.334 8.496 -1.147 c
+8.357 -0.963 8.291 -0.702 8.291 -0.368 c
+8.291 2.102 l
+7.688 2.102 l
+7.688 2.631 l
+8.291 2.631 l
+8.291 3.586 l
+h
+11.686 -0.867 m
+11.899 -0.867 12.072 -0.805 12.2 -0.676 c
+12.336 -0.541 12.409 -0.349 12.421 -0.103 c
+13.038 -0.103 l
+13.016 -0.485 12.88 -0.805 12.627 -1.058 c
+12.37 -1.305 12.057 -1.426 11.686 -1.426 c
+11.194 -1.426 10.818 -1.276 10.554 -0.971 c
+10.296 -0.659 10.172 -0.191 10.172 0.426 c
+10.172 0.867 l
+10.172 1.462 10.296 1.918 10.554 2.234 c
+10.818 2.547 11.194 2.705 11.686 2.705 c
+12.087 2.705 12.406 2.572 12.642 2.308 c
+12.883 2.05 13.016 1.705 13.038 1.263 c
+12.421 1.263 l
+12.399 1.558 12.326 1.778 12.2 1.926 c
+12.083 2.072 11.91 2.146 11.686 2.146 c
+11.391 2.146 11.175 2.046 11.039 1.851 c
+10.899 1.664 10.826 1.356 10.818 0.926 c
+10.818 0.411 l
+10.818 -0.059 10.884 -0.393 11.025 -0.588 c
+11.171 -0.776 11.391 -0.867 11.686 -0.867 c
+14.435 2.219 m
+14.688 2.543 15.008 2.705 15.39 2.705 c
+16.095 2.705 16.452 2.234 16.463 1.294 c
+16.463 -1.353 l
+15.817 -1.353 l
+15.817 1.263 l
+15.817 1.576 15.761 1.797 15.655 1.926 c
+15.545 2.05 15.39 2.117 15.184 2.117 c
+15.026 2.117 14.88 2.061 14.743 1.955 c
+14.614 1.845 14.512 1.708 14.435 1.543 c
+14.435 -1.353 l
+13.787 -1.353 l
+13.787 4.292 l
+14.435 4.292 l
+h
+20.52 -0.867 m
+20.733 -0.867 20.906 -0.805 21.034 -0.676 c
+21.17 -0.541 21.244 -0.349 21.255 -0.103 c
+21.872 -0.103 l
+21.851 -0.485 21.714 -0.805 21.461 -1.058 c
+21.203 -1.305 20.891 -1.426 20.52 -1.426 c
+20.027 -1.426 19.653 -1.276 19.388 -0.971 c
+19.131 -0.659 19.006 -0.191 19.006 0.426 c
+19.006 0.867 l
+19.006 1.462 19.131 1.918 19.388 2.234 c
+19.653 2.547 20.027 2.705 20.52 2.705 c
+20.92 2.705 21.24 2.572 21.475 2.308 c
+21.718 2.05 21.851 1.705 21.872 1.263 c
+21.255 1.263 l
+21.232 1.558 21.159 1.778 21.034 1.926 c
+20.916 2.072 20.744 2.146 20.52 2.146 c
+20.226 2.146 20.009 2.046 19.873 1.851 c
+19.734 1.664 19.66 1.356 19.653 0.926 c
+19.653 0.411 l
+19.653 -0.059 19.719 -0.393 19.858 -0.588 c
+20.006 -0.776 20.226 -0.867 20.52 -0.867 c
+24.65 -1 m
+24.434 -1.287 24.121 -1.426 23.709 -1.426 c
+23.346 -1.426 23.071 -1.305 22.886 -1.058 c
+22.71 -0.805 22.614 -0.441 22.607 0.029 c
+22.607 2.631 l
+23.254 2.631 l
+23.254 0.087 l
+23.254 -0.541 23.438 -0.853 23.813 -0.853 c
+24.213 -0.853 24.488 -0.676 24.636 -0.324 c
+24.636 2.631 l
+25.282 2.631 l
+25.282 -1.353 l
+24.665 -1.353 l
+h
+27.914 2.013 m
+27.825 2.032 27.726 2.043 27.619 2.043 c
+27.285 2.043 27.05 1.859 26.914 1.499 c
+26.914 -1.353 l
+26.267 -1.353 l
+26.267 2.631 l
+26.899 2.631 l
+26.914 2.219 l
+27.09 2.543 27.333 2.705 27.649 2.705 c
+27.756 2.705 27.844 2.682 27.914 2.645 c
+h
+30.206 2.013 m
+30.119 2.032 30.019 2.043 29.913 2.043 c
+29.578 2.043 29.343 1.859 29.207 1.499 c
+29.207 -1.353 l
+28.56 -1.353 l
+28.56 2.631 l
+29.192 2.631 l
+29.207 2.219 l
+29.383 2.543 29.626 2.705 29.942 2.705 c
+30.048 2.705 30.137 2.682 30.206 2.645 c
+h
+32.205 -1.426 m
+31.706 -1.426 31.324 -1.279 31.059 -0.985 c
+30.794 -0.691 30.662 -0.258 30.662 0.323 c
+30.662 0.793 l
+30.662 1.389 30.788 1.855 31.044 2.19 c
+31.309 2.532 31.669 2.705 32.132 2.705 c
+32.592 2.705 32.933 2.55 33.161 2.248 c
+33.396 1.955 33.518 1.492 33.529 0.867 c
+33.529 0.44 l
+31.309 0.44 l
+31.309 0.353 l
+31.309 -0.081 31.386 -0.393 31.544 -0.588 c
+31.71 -0.776 31.941 -0.867 32.235 -0.867 c
+32.43 -0.867 32.602 -0.834 32.75 -0.765 c
+32.897 -0.688 33.032 -0.57 33.161 -0.412 c
+33.499 -0.823 l
+33.213 -1.228 32.783 -1.426 32.205 -1.426 c
+32.132 2.146 m
+31.856 2.146 31.655 2.05 31.53 1.866 c
+31.401 1.679 31.328 1.389 31.309 0.999 c
+32.882 0.999 l
+32.882 1.087 l
+32.86 1.469 32.793 1.738 32.676 1.896 c
+32.558 2.061 32.375 2.146 32.132 2.146 c
+34.925 2.631 m
+34.94 2.19 l
+35.193 2.532 35.517 2.705 35.91 2.705 c
+36.615 2.705 36.972 2.234 36.983 1.294 c
+36.983 -1.353 l
+36.336 -1.353 l
+36.336 1.263 l
+36.336 1.576 36.281 1.797 36.174 1.926 c
+36.064 2.05 35.91 2.117 35.704 2.117 c
+35.546 2.117 35.399 2.061 35.263 1.955 c
+35.135 1.845 35.031 1.708 34.954 1.543 c
+34.954 -1.353 l
+34.308 -1.353 l
+34.308 2.631 l
+h
+38.805 3.586 m
+38.805 2.631 l
+39.409 2.631 l
+39.409 2.102 l
+38.805 2.102 l
+38.805 -0.368 l
+38.805 -0.526 38.828 -0.643 38.879 -0.721 c
+38.938 -0.802 39.026 -0.838 39.143 -0.838 c
+39.232 -0.838 39.32 -0.823 39.409 -0.794 c
+39.409 -1.353 l
+39.261 -1.401 39.107 -1.426 38.952 -1.426 c
+38.695 -1.426 38.501 -1.334 38.364 -1.147 c
+38.225 -0.963 38.159 -0.702 38.159 -0.368 c
+38.159 2.102 l
+37.556 2.102 l
+37.556 2.631 l
+38.159 2.631 l
+38.159 3.586 l
+h
+44.774 0.44 m
+44.774 -0.177 44.66 -0.643 44.435 -0.956 c
+44.219 -1.272 43.895 -1.426 43.465 -1.426 c
+43.043 -1.426 42.73 -1.246 42.524 -0.882 c
+42.495 -1.353 l
+41.892 -1.353 l
+41.892 4.292 l
+42.539 4.292 l
+42.539 2.19 l
+42.752 2.532 43.061 2.705 43.465 2.705 c
+43.895 2.705 44.219 2.547 44.435 2.234 c
+44.66 1.928 44.774 1.462 44.774 0.837 c
+h
+44.126 0.823 m
+44.126 1.294 44.057 1.624 43.921 1.822 c
+43.792 2.017 43.583 2.117 43.289 2.117 c
+42.954 2.117 42.705 1.932 42.539 1.573 c
+42.539 -0.309 l
+42.705 -0.673 42.958 -0.853 43.303 -0.853 c
+43.598 -0.853 43.807 -0.75 43.935 -0.544 c
+44.06 -0.339 44.126 -0.023 44.126 0.411 c
+h
+47.257 2.013 m
+47.17 2.032 47.07 2.043 46.964 2.043 c
+46.63 2.043 46.394 1.859 46.258 1.499 c
+46.258 -1.353 l
+45.611 -1.353 l
+45.611 2.631 l
+46.243 2.631 l
+46.258 2.219 l
+46.434 2.543 46.677 2.705 46.993 2.705 c
+47.1 2.705 47.187 2.682 47.257 2.645 c
+h
+49.801 -1.353 m
+49.76 -1.264 49.734 -1.118 49.727 -0.912 c
+49.491 -1.257 49.198 -1.426 48.845 -1.426 c
+48.481 -1.426 48.198 -1.33 47.993 -1.132 c
+47.794 -0.927 47.698 -0.64 47.698 -0.265 c
+47.698 0.135 47.835 0.455 48.11 0.691 c
+48.382 0.933 48.757 1.058 49.227 1.058 c
+49.712 1.058 l
+49.712 1.484 l
+49.712 1.72 49.657 1.885 49.551 1.984 c
+49.441 2.09 49.279 2.146 49.065 2.146 c
+48.867 2.146 48.706 2.087 48.581 1.969 c
+48.463 1.851 48.404 1.705 48.404 1.529 c
+47.758 1.529 l
+47.758 1.723 47.816 1.914 47.933 2.102 c
+48.059 2.285 48.22 2.433 48.419 2.543 c
+48.625 2.649 48.853 2.705 49.109 2.705 c
+49.51 2.705 49.815 2.601 50.021 2.396 c
+50.235 2.19 50.348 1.896 50.359 1.514 c
+50.359 -0.5 l
+50.359 -0.805 50.395 -1.07 50.476 -1.294 c
+50.476 -1.353 l
+h
+48.933 -0.838 m
+49.098 -0.838 49.25 -0.794 49.389 -0.706 c
+49.536 -0.618 49.643 -0.507 49.712 -0.368 c
+49.712 0.573 l
+49.345 0.573 l
+49.029 0.573 48.786 0.503 48.61 0.367 c
+48.433 0.239 48.346 0.051 48.346 -0.191 c
+48.346 -0.42 48.39 -0.584 48.477 -0.691 c
+48.566 -0.79 48.716 -0.838 48.933 -0.838 c
+51.976 2.631 m
+51.991 2.19 l
+52.244 2.532 52.568 2.705 52.961 2.705 c
+53.666 2.705 54.023 2.234 54.034 1.294 c
+54.034 -1.353 l
+53.387 -1.353 l
+53.387 1.263 l
+53.387 1.576 53.331 1.797 53.225 1.926 c
+53.115 2.05 52.961 2.117 52.755 2.117 c
+52.597 2.117 52.45 2.061 52.314 1.955 c
+52.186 1.845 52.082 1.708 52.005 1.543 c
+52.005 -1.353 l
+51.359 -1.353 l
+51.359 2.631 l
+h
+56.386 -0.867 m
+56.599 -0.867 56.772 -0.805 56.9 -0.676 c
+57.036 -0.541 57.109 -0.349 57.121 -0.103 c
+57.738 -0.103 l
+57.716 -0.485 57.58 -0.805 57.327 -1.058 c
+57.069 -1.305 56.757 -1.426 56.386 -1.426 c
+55.893 -1.426 55.519 -1.276 55.253 -0.971 c
+54.997 -0.659 54.871 -0.191 54.871 0.426 c
+54.871 0.867 l
+54.871 1.462 54.997 1.918 55.253 2.234 c
+55.519 2.547 55.893 2.705 56.386 2.705 c
+56.786 2.705 57.106 2.572 57.341 2.308 c
+57.584 2.05 57.716 1.705 57.738 1.263 c
+57.121 1.263 l
+57.098 1.558 57.025 1.778 56.9 1.926 c
+56.782 2.072 56.61 2.146 56.386 2.146 c
+56.092 2.146 55.875 2.046 55.739 1.851 c
+55.6 1.664 55.526 1.356 55.519 0.926 c
+55.519 0.411 l
+55.519 -0.059 55.585 -0.393 55.724 -0.588 c
+55.871 -0.776 56.092 -0.867 56.386 -0.867 c
+59.134 2.219 m
+59.388 2.543 59.708 2.705 60.09 2.705 c
+60.795 2.705 61.152 2.234 61.163 1.294 c
+61.163 -1.353 l
+60.516 -1.353 l
+60.516 1.263 l
+60.516 1.576 60.461 1.797 60.354 1.926 c
+60.244 2.05 60.09 2.117 59.884 2.117 c
+59.726 2.117 59.579 2.061 59.443 1.955 c
+59.315 1.845 59.211 1.708 59.134 1.543 c
+59.134 -1.353 l
+58.488 -1.353 l
+58.488 4.292 l
+59.134 4.292 l
+h
+64.691 3.586 m
+64.691 2.631 l
+65.293 2.631 l
+65.293 2.102 l
+64.691 2.102 l
+64.691 -0.368 l
+64.691 -0.526 64.713 -0.643 64.764 -0.721 c
+64.823 -0.802 64.911 -0.838 65.029 -0.838 c
+65.117 -0.838 65.205 -0.823 65.293 -0.794 c
+65.293 -1.353 l
+65.146 -1.401 64.992 -1.426 64.838 -1.426 c
+64.581 -1.426 64.385 -1.334 64.25 -1.147 c
+64.11 -0.963 64.044 -0.702 64.044 -0.368 c
+64.044 2.102 l
+63.442 2.102 l
+63.442 2.631 l
+64.044 2.631 l
+64.044 3.586 l
+h
+65.852 0.823 m
+65.852 1.4 65.988 1.855 66.264 2.19 c
+66.546 2.532 66.918 2.705 67.38 2.705 c
+67.84 2.705 68.207 2.535 68.483 2.204 c
+68.766 1.881 68.913 1.433 68.924 0.867 c
+68.924 0.44 l
+68.924 -0.129 68.78 -0.584 68.498 -0.927 c
+68.222 -1.261 67.855 -1.426 67.395 -1.426 c
+66.933 -1.426 66.561 -1.264 66.278 -0.941 c
+66.002 -0.611 65.859 -0.169 65.852 0.382 c
+h
+66.499 0.44 m
+66.499 0.037 66.576 -0.279 66.734 -0.515 c
+66.899 -0.75 67.12 -0.867 67.395 -0.867 c
+67.961 -0.867 68.255 -0.456 68.277 0.367 c
+68.277 0.823 l
+68.277 1.223 68.192 1.543 68.028 1.778 c
+67.87 2.021 67.652 2.146 67.38 2.146 c
+67.116 2.146 66.899 2.021 66.734 1.778 c
+66.576 1.543 66.499 1.223 66.499 0.823 c
+h
+72.334 3.586 m
+72.334 2.631 l
+72.936 2.631 l
+72.936 2.102 l
+72.334 2.102 l
+72.334 -0.368 l
+72.334 -0.526 72.356 -0.643 72.408 -0.721 c
+72.466 -0.802 72.555 -0.838 72.672 -0.838 c
+72.761 -0.838 72.849 -0.823 72.936 -0.794 c
+72.936 -1.353 l
+72.79 -1.401 72.635 -1.426 72.481 -1.426 c
+72.224 -1.426 72.03 -1.334 71.893 -1.147 c
+71.754 -0.963 71.687 -0.702 71.687 -0.368 c
+71.687 2.102 l
+71.085 2.102 l
+71.085 2.631 l
+71.687 2.631 l
+71.687 3.586 l
+h
+74.348 2.219 m
+74.602 2.543 74.921 2.705 75.303 2.705 c
+76.009 2.705 76.365 2.234 76.377 1.294 c
+76.377 -1.353 l
+75.73 -1.353 l
+75.73 1.263 l
+75.73 1.576 75.674 1.797 75.568 1.926 c
+75.458 2.05 75.303 2.117 75.097 2.117 c
+74.939 2.117 74.793 2.061 74.656 1.955 c
+74.528 1.845 74.425 1.708 74.348 1.543 c
+74.348 -1.353 l
+73.701 -1.353 l
+73.701 4.292 l
+74.348 4.292 l
+h
+78.758 -1.426 m
+78.258 -1.426 77.875 -1.279 77.611 -0.985 c
+77.347 -0.691 77.214 -0.258 77.214 0.323 c
+77.214 0.793 l
+77.214 1.389 77.339 1.855 77.596 2.19 c
+77.861 2.532 78.222 2.705 78.684 2.705 c
+79.143 2.705 79.485 2.55 79.713 2.248 c
+79.948 1.955 80.069 1.492 80.08 0.867 c
+80.08 0.44 l
+77.861 0.44 l
+77.861 0.353 l
+77.861 -0.081 77.938 -0.393 78.096 -0.588 c
+78.261 -0.776 78.493 -0.867 78.787 -0.867 c
+78.982 -0.867 79.155 -0.834 79.301 -0.765 c
+79.448 -0.688 79.585 -0.57 79.713 -0.412 c
+80.051 -0.823 l
+79.764 -1.228 79.334 -1.426 78.758 -1.426 c
+78.684 2.146 m
+78.409 2.146 78.206 2.05 78.081 1.866 c
+77.952 1.679 77.879 1.389 77.861 0.999 c
+79.434 0.999 l
+79.434 1.087 l
+79.412 1.469 79.346 1.738 79.228 1.896 c
+79.111 2.061 78.927 2.146 78.684 2.146 c
+f
+Q
+q 1 0 0 1 380.4265 289.5652 cm
+0 0 m
+0 -0.97 l
+0.53 -0.97 l
+0.53 -1.764 l
+0 -1.764 l
+0 -3.734 l
+0 -3.892 0.019 -3.998 0.059 -4.057 c
+0.107 -4.116 0.191 -4.145 0.309 -4.145 c
+0.416 -4.145 0.5 -4.138 0.559 -4.116 c
+0.559 -4.925 l
+0.382 -4.991 0.191 -5.027 -0.014 -5.027 c
+-0.691 -5.027 -1.036 -4.642 -1.043 -3.866 c
+-1.043 -1.764 l
+-1.5 -1.764 l
+-1.5 -0.97 l
+-1.043 -0.97 l
+-1.043 0 l
+h
+2.984 -4.954 m
+2.955 -4.895 2.926 -4.792 2.896 -4.645 c
+2.708 -4.902 2.459 -5.027 2.146 -5.027 c
+1.812 -5.027 1.532 -4.921 1.309 -4.704 c
+1.091 -4.48 0.985 -4.189 0.985 -3.836 c
+0.985 -3.425 1.118 -3.109 1.382 -2.882 c
+1.646 -2.646 2.028 -2.529 2.529 -2.529 c
+2.851 -2.529 l
+2.851 -2.205 l
+2.851 -2.028 2.815 -1.908 2.749 -1.837 c
+2.69 -1.76 2.602 -1.72 2.484 -1.72 c
+2.227 -1.72 2.103 -1.874 2.103 -2.176 c
+1.058 -2.176 l
+1.058 -1.804 1.195 -1.5 1.47 -1.264 c
+1.742 -1.022 2.091 -0.897 2.514 -0.897 c
+2.955 -0.897 3.293 -1.014 3.528 -1.249 c
+3.77 -1.478 3.896 -1.801 3.896 -2.22 c
+3.896 -4.087 l
+3.896 -4.432 3.944 -4.7 4.042 -4.895 c
+4.042 -4.954 l
+h
+2.381 -4.204 m
+2.488 -4.204 2.58 -4.185 2.66 -4.145 c
+2.749 -4.098 2.811 -4.039 2.851 -3.969 c
+2.851 -3.146 l
+2.602 -3.146 l
+2.425 -3.146 2.282 -3.204 2.176 -3.322 c
+2.076 -3.433 2.028 -3.58 2.028 -3.763 c
+2.028 -4.057 2.146 -4.204 2.381 -4.204 c
+6.6 -1.985 m
+6.262 -1.955 l
+5.976 -1.955 5.785 -2.08 5.689 -2.323 c
+5.689 -4.954 l
+4.645 -4.954 l
+4.645 -0.97 l
+5.615 -0.97 l
+5.644 -1.411 l
+5.81 -1.07 6.041 -0.897 6.336 -0.897 c
+6.453 -0.897 6.545 -0.919 6.614 -0.956 c
+h
+6.938 -2.837 m
+6.938 -2.19 7.056 -1.706 7.291 -1.382 c
+7.526 -1.058 7.857 -0.897 8.291 -0.897 c
+8.643 -0.897 8.915 -1.04 9.114 -1.323 c
+9.158 -0.97 l
+10.099 -0.97 l
+10.099 -4.954 l
+10.099 -5.461 9.955 -5.85 9.672 -6.115 c
+9.386 -6.387 8.981 -6.527 8.453 -6.527 c
+8.224 -6.527 7.989 -6.483 7.747 -6.394 c
+7.512 -6.306 7.335 -6.192 7.217 -6.057 c
+7.57 -5.336 l
+7.666 -5.442 7.794 -5.527 7.952 -5.586 c
+8.106 -5.652 8.254 -5.689 8.393 -5.689 c
+8.628 -5.689 8.794 -5.63 8.893 -5.513 c
+9 -5.402 9.055 -5.226 9.055 -4.983 c
+9.055 -4.63 l
+8.856 -4.895 8.599 -5.027 8.276 -5.027 c
+7.853 -5.027 7.526 -4.866 7.291 -4.542 c
+7.063 -4.212 6.945 -3.741 6.938 -3.131 c
+h
+7.982 -3.102 m
+7.982 -3.477 8.029 -3.745 8.129 -3.91 c
+8.224 -4.079 8.378 -4.16 8.584 -4.16 c
+8.798 -4.16 8.956 -4.083 9.055 -3.925 c
+9.055 -2.028 l
+8.945 -1.864 8.79 -1.779 8.584 -1.779 c
+8.378 -1.779 8.224 -1.864 8.129 -2.028 c
+8.029 -2.198 7.982 -2.466 7.982 -2.837 c
+h
+12.465 -5.027 m
+11.936 -5.027 11.517 -4.873 11.215 -4.557 c
+10.922 -4.233 10.774 -3.774 10.774 -3.175 c
+10.774 -2.866 l
+10.774 -2.242 10.911 -1.756 11.186 -1.411 c
+11.458 -1.07 11.851 -0.897 12.362 -0.897 c
+12.862 -0.897 13.233 -1.058 13.479 -1.382 c
+13.733 -1.706 13.865 -2.183 13.876 -2.808 c
+13.876 -3.308 l
+11.803 -3.308 l
+11.822 -3.601 11.884 -3.818 11.994 -3.954 c
+12.112 -4.094 12.293 -4.16 12.538 -4.16 c
+12.881 -4.16 13.17 -4.042 13.406 -3.807 c
+13.818 -4.439 l
+13.689 -4.615 13.501 -4.759 13.259 -4.866 c
+13.012 -4.972 12.748 -5.027 12.465 -5.027 c
+11.819 -2.587 m
+12.847 -2.587 l
+12.847 -2.484 l
+12.847 -2.249 12.807 -2.072 12.729 -1.955 c
+12.66 -1.831 12.532 -1.764 12.347 -1.764 c
+12.171 -1.764 12.039 -1.834 11.95 -1.97 c
+11.869 -2.099 11.826 -2.304 11.819 -2.587 c
+15.669 0 m
+15.669 -0.97 l
+16.199 -0.97 l
+16.199 -1.764 l
+15.669 -1.764 l
+15.669 -3.734 l
+15.669 -3.892 15.688 -3.998 15.728 -4.057 c
+15.776 -4.116 15.861 -4.145 15.978 -4.145 c
+16.085 -4.145 16.169 -4.138 16.228 -4.116 c
+16.228 -4.925 l
+16.052 -4.991 15.861 -5.027 15.655 -5.027 c
+14.978 -5.027 14.633 -4.642 14.626 -3.866 c
+14.626 -1.764 l
+14.17 -1.764 l
+14.17 -0.97 l
+14.626 -0.97 l
+14.626 0 l
+h
+20.461 -1.985 m
+20.123 -1.955 l
+19.836 -1.955 19.645 -2.08 19.549 -2.323 c
+19.549 -4.954 l
+18.506 -4.954 l
+18.506 -0.97 l
+19.476 -0.97 l
+19.506 -1.411 l
+19.671 -1.07 19.902 -0.897 20.197 -0.897 c
+20.314 -0.897 20.406 -0.919 20.476 -0.956 c
+h
+22.534 -5.027 m
+22.005 -5.027 21.586 -4.873 21.284 -4.557 c
+20.991 -4.233 20.843 -3.774 20.843 -3.175 c
+20.843 -2.866 l
+20.843 -2.242 20.979 -1.756 21.255 -1.411 c
+21.527 -1.07 21.92 -0.897 22.431 -0.897 c
+22.931 -0.897 23.302 -1.058 23.548 -1.382 c
+23.802 -1.706 23.934 -2.183 23.945 -2.808 c
+23.945 -3.308 l
+21.872 -3.308 l
+21.891 -3.601 21.953 -3.818 22.063 -3.954 c
+22.181 -4.094 22.361 -4.16 22.607 -4.16 c
+22.949 -4.16 23.239 -4.042 23.474 -3.807 c
+23.886 -4.439 l
+23.757 -4.615 23.57 -4.759 23.328 -4.866 c
+23.081 -4.972 22.817 -5.027 22.534 -5.027 c
+21.887 -2.587 m
+22.916 -2.587 l
+22.916 -2.484 l
+22.916 -2.249 22.876 -2.072 22.799 -1.955 c
+22.728 -1.831 22.6 -1.764 22.416 -1.764 c
+22.24 -1.764 22.107 -1.834 22.019 -1.97 c
+21.939 -2.099 21.895 -2.304 21.887 -2.587 c
+24.768 -4.954 m
+24.768 -1.764 l
+24.283 -1.764 l
+24.283 -0.97 l
+24.768 -0.97 l
+24.768 -0.617 l
+24.768 -0.177 24.879 0.162 25.106 0.397 c
+25.342 0.639 25.658 0.764 26.061 0.764 c
+26.186 0.764 26.344 0.738 26.532 0.69 c
+26.532 -0.133 l
+26.462 -0.114 26.377 -0.104 26.282 -0.104 c
+25.966 -0.104 25.812 -0.287 25.812 -0.647 c
+25.812 -0.97 l
+26.429 -0.97 l
+26.429 -1.764 l
+25.812 -1.764 l
+25.812 -4.954 l
+h
+28.517 -5.027 m
+27.987 -5.027 27.568 -4.873 27.267 -4.557 c
+26.973 -4.233 26.826 -3.774 26.826 -3.175 c
+26.826 -2.866 l
+26.826 -2.242 26.962 -1.756 27.237 -1.411 c
+27.509 -1.07 27.902 -0.897 28.413 -0.897 c
+28.914 -0.897 29.284 -1.058 29.531 -1.382 c
+29.784 -1.706 29.916 -2.183 29.928 -2.808 c
+29.928 -3.308 l
+27.855 -3.308 l
+27.873 -3.601 27.936 -3.818 28.046 -3.954 c
+28.164 -4.094 28.344 -4.16 28.59 -4.16 c
+28.931 -4.16 29.222 -4.042 29.457 -3.807 c
+29.868 -4.439 l
+29.741 -4.615 29.552 -4.759 29.31 -4.866 c
+29.064 -4.972 28.8 -5.027 28.517 -5.027 c
+27.869 -2.587 m
+28.899 -2.587 l
+28.899 -2.484 l
+28.899 -2.249 28.858 -2.072 28.781 -1.955 c
+28.711 -1.831 28.582 -1.764 28.399 -1.764 c
+28.222 -1.764 28.09 -1.834 28.002 -1.97 c
+27.921 -2.099 27.877 -2.304 27.869 -2.587 c
+32.471 -1.985 m
+32.132 -1.955 l
+31.846 -1.955 31.655 -2.08 31.559 -2.323 c
+31.559 -4.954 l
+30.516 -4.954 l
+30.516 -0.97 l
+31.486 -0.97 l
+31.515 -1.411 l
+31.68 -1.07 31.912 -0.897 32.206 -0.897 c
+32.324 -0.897 32.415 -0.919 32.485 -0.956 c
+h
+34.543 -5.027 m
+34.013 -5.027 33.595 -4.873 33.294 -4.557 c
+32.999 -4.233 32.853 -3.774 32.853 -3.175 c
+32.853 -2.866 l
+32.853 -2.242 32.989 -1.756 33.265 -1.411 c
+33.536 -1.07 33.93 -0.897 34.44 -0.897 c
+34.94 -0.897 35.311 -1.058 35.557 -1.382 c
+35.811 -1.706 35.943 -2.183 35.954 -2.808 c
+35.954 -3.308 l
+33.882 -3.308 l
+33.9 -3.601 33.963 -3.818 34.073 -3.954 c
+34.19 -4.094 34.37 -4.16 34.616 -4.16 c
+34.958 -4.16 35.249 -4.042 35.484 -3.807 c
+35.895 -4.439 l
+35.767 -4.615 35.58 -4.759 35.337 -4.866 c
+35.091 -4.972 34.826 -5.027 34.543 -5.027 c
+33.896 -2.587 m
+34.925 -2.587 l
+34.925 -2.484 l
+34.925 -2.249 34.884 -2.072 34.807 -1.955 c
+34.738 -1.831 34.609 -1.764 34.425 -1.764 c
+34.249 -1.764 34.117 -1.834 34.028 -1.97 c
+33.948 -2.099 33.903 -2.304 33.896 -2.587 c
+37.498 -0.97 m
+37.527 -1.367 l
+37.762 -1.055 38.063 -0.897 38.439 -0.897 c
+39.122 -0.897 39.474 -1.378 39.497 -2.338 c
+39.497 -4.954 l
+38.453 -4.954 l
+38.453 -2.411 l
+38.453 -2.186 38.416 -2.025 38.35 -1.926 c
+38.281 -1.831 38.163 -1.779 37.997 -1.779 c
+37.81 -1.779 37.663 -1.874 37.556 -2.058 c
+37.556 -4.954 l
+36.513 -4.954 l
+36.513 -0.97 l
+h
+41.687 -4.16 m
+41.98 -4.16 42.131 -3.965 42.142 -3.572 c
+43.112 -3.572 l
+43.112 -4.006 42.98 -4.358 42.715 -4.63 c
+42.451 -4.895 42.113 -5.027 41.701 -5.027 c
+41.19 -5.027 40.797 -4.873 40.525 -4.557 c
+40.261 -4.233 40.122 -3.763 40.114 -3.146 c
+40.114 -2.822 l
+40.114 -2.198 40.246 -1.72 40.511 -1.397 c
+40.783 -1.066 41.18 -0.897 41.701 -0.897 c
+42.131 -0.897 42.473 -1.037 42.73 -1.309 c
+42.984 -1.584 43.112 -1.966 43.112 -2.455 c
+42.142 -2.455 l
+42.142 -2.242 42.102 -2.072 42.025 -1.955 c
+41.955 -1.831 41.837 -1.764 41.672 -1.764 c
+41.496 -1.764 41.367 -1.831 41.29 -1.955 c
+41.209 -2.084 41.165 -2.334 41.157 -2.705 c
+41.157 -3.117 l
+41.157 -3.439 41.172 -3.668 41.202 -3.792 c
+41.238 -3.921 41.294 -4.013 41.363 -4.072 c
+41.441 -4.131 41.547 -4.16 41.687 -4.16 c
+45.317 -5.027 m
+44.789 -5.027 44.369 -4.873 44.068 -4.557 c
+43.774 -4.233 43.627 -3.774 43.627 -3.175 c
+43.627 -2.866 l
+43.627 -2.242 43.763 -1.756 44.039 -1.411 c
+44.311 -1.07 44.704 -0.897 45.215 -0.897 c
+45.714 -0.897 46.085 -1.058 46.331 -1.382 c
+46.585 -1.706 46.717 -2.183 46.728 -2.808 c
+46.728 -3.308 l
+44.656 -3.308 l
+44.674 -3.601 44.737 -3.818 44.847 -3.954 c
+44.965 -4.094 45.144 -4.16 45.391 -4.16 c
+45.733 -4.16 46.023 -4.042 46.258 -3.807 c
+46.67 -4.439 l
+46.541 -4.615 46.354 -4.759 46.111 -4.866 c
+45.865 -4.972 45.6 -5.027 45.317 -5.027 c
+44.671 -2.587 m
+45.699 -2.587 l
+45.699 -2.484 l
+45.699 -2.249 45.659 -2.072 45.582 -1.955 c
+45.512 -1.831 45.383 -1.764 45.2 -1.764 c
+45.024 -1.764 44.891 -1.834 44.803 -1.97 c
+44.722 -2.099 44.678 -2.304 44.671 -2.587 c
+f
+Q
+q 1 0 0 1 427.8604 283.5388 cm
+0 0 m
+-0.397 0.264 l
+-0.162 0.588 -0.04 0.922 -0.029 1.263 c
+-0.029 1.881 l
+0.632 1.881 l
+0.632 1.352 l
+0.632 1.095 0.566 0.849 0.441 0.602 c
+0.324 0.359 0.177 0.158 0 0 c
+5.233 1.072 m
+5.193 1.161 5.167 1.308 5.159 1.514 c
+4.924 1.168 4.63 0.999 4.278 0.999 c
+3.913 0.999 3.63 1.095 3.425 1.294 c
+3.227 1.499 3.131 1.786 3.131 2.16 c
+3.131 2.561 3.267 2.881 3.543 3.116 c
+3.815 3.358 4.189 3.484 4.659 3.484 c
+5.145 3.484 l
+5.145 3.91 l
+5.145 4.145 5.089 4.31 4.983 4.409 c
+4.873 4.516 4.711 4.571 4.498 4.571 c
+4.299 4.571 4.138 4.512 4.013 4.394 c
+3.896 4.277 3.836 4.13 3.836 3.954 c
+3.19 3.954 l
+3.19 4.149 3.248 4.34 3.366 4.527 c
+3.491 4.71 3.653 4.858 3.851 4.968 c
+4.057 5.074 4.285 5.13 4.542 5.13 c
+4.943 5.13 5.247 5.026 5.453 4.821 c
+5.667 4.615 5.781 4.321 5.791 3.939 c
+5.791 1.925 l
+5.791 1.62 5.828 1.356 5.909 1.132 c
+5.909 1.072 l
+h
+4.366 1.587 m
+4.531 1.587 4.682 1.631 4.821 1.72 c
+4.968 1.807 5.075 1.918 5.145 2.057 c
+5.145 2.998 l
+4.777 2.998 l
+4.461 2.998 4.218 2.929 4.042 2.792 c
+3.866 2.664 3.778 2.476 3.778 2.234 c
+3.778 2.006 3.822 1.841 3.91 1.734 c
+3.998 1.635 4.149 1.587 4.366 1.587 c
+7.408 5.056 m
+7.423 4.615 l
+7.676 4.957 8 5.13 8.393 5.13 c
+9.099 5.13 9.455 4.659 9.467 3.719 c
+9.467 1.072 l
+8.819 1.072 l
+8.819 3.689 l
+8.819 4.001 8.764 4.222 8.658 4.351 c
+8.548 4.475 8.393 4.542 8.187 4.542 c
+8.029 4.542 7.882 4.486 7.746 4.38 c
+7.618 4.27 7.515 4.134 7.437 3.968 c
+7.437 1.072 l
+6.791 1.072 l
+6.791 5.056 l
+h
+10.304 3.248 m
+10.304 3.854 10.414 4.321 10.643 4.644 c
+10.878 4.968 11.204 5.13 11.627 5.13 c
+12.009 5.13 12.307 4.972 12.524 4.659 c
+12.524 6.717 l
+13.17 6.717 l
+13.17 1.072 l
+12.582 1.072 l
+12.538 1.499 l
+12.332 1.165 12.027 0.999 11.627 0.999 c
+11.215 0.999 10.892 1.153 10.657 1.469 c
+10.422 1.793 10.304 2.248 10.304 2.836 c
+h
+10.951 2.865 m
+10.951 2.425 11.013 2.094 11.142 1.881 c
+11.278 1.675 11.499 1.572 11.803 1.572 c
+12.127 1.572 12.366 1.734 12.524 2.057 c
+12.524 4.072 l
+12.355 4.384 12.116 4.542 11.803 4.542 c
+11.499 4.542 11.278 4.438 11.142 4.233 c
+11.013 4.027 10.951 3.704 10.951 3.262 c
+h
+16.596 1.072 -0.647 5.644 re
+19.035 0.999 m
+18.535 0.999 18.153 1.146 17.889 1.44 c
+17.624 1.734 17.492 2.167 17.492 2.748 c
+17.492 3.218 l
+17.492 3.814 17.617 4.28 17.874 4.615 c
+18.138 4.957 18.499 5.13 18.962 5.13 c
+19.422 5.13 19.763 4.976 19.991 4.674 c
+20.226 4.38 20.347 3.917 20.359 3.293 c
+20.359 2.865 l
+18.138 2.865 l
+18.138 2.778 l
+18.138 2.344 18.216 2.032 18.374 1.837 c
+18.539 1.649 18.771 1.558 19.065 1.558 c
+19.26 1.558 19.432 1.591 19.58 1.66 c
+19.726 1.738 19.862 1.855 19.991 2.013 c
+20.328 1.602 l
+20.042 1.198 19.613 0.999 19.035 0.999 c
+18.962 4.571 m
+18.686 4.571 18.485 4.475 18.359 4.292 c
+18.231 4.104 18.157 3.814 18.138 3.424 c
+19.711 3.424 l
+19.711 3.513 l
+19.69 3.895 19.623 4.163 19.505 4.321 c
+19.388 4.486 19.204 4.571 18.962 4.571 c
+23.181 1.072 m
+23.14 1.161 23.114 1.308 23.107 1.514 c
+22.872 1.168 22.578 0.999 22.225 0.999 c
+21.861 0.999 21.579 1.095 21.373 1.294 c
+21.174 1.499 21.078 1.786 21.078 2.16 c
+21.078 2.561 21.215 2.881 21.49 3.116 c
+21.762 3.358 22.137 3.484 22.607 3.484 c
+23.092 3.484 l
+23.092 3.91 l
+23.092 4.145 23.037 4.31 22.931 4.409 c
+22.82 4.516 22.659 4.571 22.445 4.571 c
+22.248 4.571 22.086 4.512 21.961 4.394 c
+21.843 4.277 21.784 4.13 21.784 3.954 c
+21.137 3.954 l
+21.137 4.149 21.196 4.34 21.313 4.527 c
+21.439 4.71 21.6 4.858 21.799 4.968 c
+22.005 5.074 22.232 5.13 22.489 5.13 c
+22.89 5.13 23.195 5.026 23.401 4.821 c
+23.614 4.615 23.728 4.321 23.739 3.939 c
+23.739 1.925 l
+23.739 1.62 23.776 1.356 23.856 1.132 c
+23.856 1.072 l
+h
+22.313 1.587 m
+22.479 1.587 22.629 1.631 22.769 1.72 c
+22.915 1.807 23.023 1.918 23.092 2.057 c
+23.092 2.998 l
+22.725 2.998 l
+22.408 2.998 22.167 2.929 21.99 2.792 c
+21.814 2.664 21.725 2.476 21.725 2.234 c
+21.725 2.006 21.77 1.841 21.857 1.734 c
+21.946 1.635 22.096 1.587 22.313 1.587 c
+25.812 2.057 m
+26.561 5.056 l
+27.223 5.056 l
+26.047 1.072 l
+25.562 1.072 l
+24.371 5.056 l
+25.032 5.056 l
+h
+29.281 0.999 m
+28.781 0.999 28.399 1.146 28.134 1.44 c
+27.869 1.734 27.737 2.167 27.737 2.748 c
+27.737 3.218 l
+27.737 3.814 27.862 4.28 28.12 4.615 c
+28.384 4.957 28.744 5.13 29.207 5.13 c
+29.666 5.13 30.009 4.976 30.236 4.674 c
+30.471 4.38 30.593 3.917 30.603 3.293 c
+30.603 2.865 l
+28.384 2.865 l
+28.384 2.778 l
+28.384 2.344 28.461 2.032 28.619 1.837 c
+28.785 1.649 29.016 1.558 29.31 1.558 c
+29.504 1.558 29.677 1.591 29.824 1.66 c
+29.971 1.738 30.107 1.855 30.236 2.013 c
+30.574 1.602 l
+30.287 1.198 29.857 0.999 29.281 0.999 c
+29.207 4.571 m
+28.931 4.571 28.729 4.475 28.604 4.292 c
+28.476 4.104 28.403 3.814 28.384 3.424 c
+29.957 3.424 l
+29.957 3.513 l
+29.934 3.895 29.868 4.163 29.751 4.321 c
+29.633 4.486 29.45 4.571 29.207 4.571 c
+33.323 2.087 m
+33.323 2.234 33.267 2.355 33.161 2.454 c
+33.051 2.549 32.845 2.667 32.544 2.807 c
+32.199 2.954 31.956 3.075 31.809 3.175 c
+31.662 3.281 31.551 3.399 31.486 3.528 c
+31.416 3.652 31.382 3.81 31.382 3.998 c
+31.382 4.321 31.5 4.589 31.735 4.806 c
+31.97 5.019 32.272 5.13 32.646 5.13 c
+33.028 5.13 33.338 5.016 33.573 4.791 c
+33.808 4.564 33.926 4.277 33.926 3.924 c
+33.279 3.924 l
+33.279 4.101 33.22 4.251 33.103 4.38 c
+32.985 4.505 32.831 4.571 32.646 4.571 c
+32.448 4.571 32.297 4.516 32.191 4.409 c
+32.081 4.31 32.029 4.178 32.029 4.012 c
+32.029 3.883 32.066 3.777 32.147 3.689 c
+32.224 3.608 32.415 3.505 32.72 3.38 c
+33.198 3.193 33.529 3.006 33.705 2.822 c
+33.882 2.645 33.969 2.418 33.969 2.146 c
+33.969 1.793 33.845 1.514 33.602 1.308 c
+33.367 1.102 33.051 0.999 32.662 0.999 c
+32.239 0.999 31.9 1.117 31.647 1.352 c
+31.39 1.595 31.265 1.899 31.265 2.263 c
+31.912 2.263 l
+31.919 2.036 31.989 1.859 32.118 1.734 c
+32.243 1.616 32.426 1.558 32.662 1.558 c
+32.874 1.558 33.036 1.606 33.146 1.705 c
+33.264 1.801 33.323 1.928 33.323 2.087 c
+38.57 1.072 m
+38.53 1.161 38.504 1.308 38.497 1.514 c
+38.262 1.168 37.967 0.999 37.615 0.999 c
+37.251 0.999 36.968 1.095 36.762 1.294 c
+36.564 1.499 36.469 1.786 36.469 2.16 c
+36.469 2.561 36.604 2.881 36.88 3.116 c
+37.152 3.358 37.527 3.484 37.997 3.484 c
+38.482 3.484 l
+38.482 3.91 l
+38.482 4.145 38.427 4.31 38.32 4.409 c
+38.21 4.516 38.048 4.571 37.836 4.571 c
+37.637 4.571 37.475 4.512 37.35 4.394 c
+37.233 4.277 37.174 4.13 37.174 3.954 c
+36.527 3.954 l
+36.527 4.149 36.586 4.34 36.704 4.527 c
+36.829 4.71 36.99 4.858 37.188 4.968 c
+37.394 5.074 37.622 5.13 37.88 5.13 c
+38.281 5.13 38.585 5.026 38.79 4.821 c
+39.004 4.615 39.118 4.321 39.129 3.939 c
+39.129 1.925 l
+39.129 1.62 39.166 1.356 39.247 1.132 c
+39.247 1.072 l
+h
+37.703 1.587 m
+37.869 1.587 38.019 1.631 38.159 1.72 c
+38.306 1.807 38.412 1.918 38.482 2.057 c
+38.482 2.998 l
+38.115 2.998 l
+37.799 2.998 37.556 2.929 37.379 2.792 c
+37.203 2.664 37.115 2.476 37.115 2.234 c
+37.115 2.006 37.159 1.841 37.248 1.734 c
+37.336 1.635 37.487 1.587 37.703 1.587 c
+41.716 3.248 m
+41.716 3.854 41.826 4.321 42.054 4.644 c
+42.289 4.968 42.616 5.13 43.039 5.13 c
+43.421 5.13 43.719 4.972 43.935 4.659 c
+43.935 6.717 l
+44.583 6.717 l
+44.583 1.072 l
+43.995 1.072 l
+43.95 1.499 l
+43.744 1.165 43.44 0.999 43.039 0.999 c
+42.628 0.999 42.304 1.153 42.069 1.469 c
+41.834 1.793 41.716 2.248 41.716 2.836 c
+h
+42.362 2.865 m
+42.362 2.425 42.425 2.094 42.553 1.881 c
+42.69 1.675 42.91 1.572 43.216 1.572 c
+43.538 1.572 43.777 1.734 43.935 2.057 c
+43.935 4.072 l
+43.767 4.384 43.528 4.542 43.216 4.542 c
+42.91 4.542 42.69 4.438 42.553 4.233 c
+42.425 4.027 42.362 3.704 42.362 3.262 c
+h
+46.287 1.072 -0.646 3.984 re
+46.331 6.1 m
+46.331 5.99 46.302 5.898 46.243 5.82 c
+46.185 5.751 46.089 5.718 45.964 5.718 c
+45.846 5.718 45.751 5.751 45.685 5.82 c
+45.626 5.898 45.597 5.99 45.597 6.1 c
+45.597 6.217 45.626 6.31 45.685 6.379 c
+45.751 6.456 45.846 6.497 45.964 6.497 c
+46.089 6.497 46.185 6.456 46.243 6.379 c
+46.302 6.298 46.331 6.206 46.331 6.1 c
+47.596 1.072 m
+47.596 4.527 l
+47.066 4.527 l
+47.066 5.056 l
+47.596 5.056 l
+47.596 5.512 l
+47.596 5.913 47.691 6.225 47.889 6.453 c
+48.095 6.676 48.375 6.79 48.727 6.79 c
+48.864 6.79 48.996 6.769 49.124 6.732 c
+49.095 6.188 l
+48.996 6.206 48.897 6.217 48.801 6.217 c
+48.426 6.217 48.242 5.953 48.242 5.423 c
+48.242 5.056 l
+48.918 5.056 l
+48.918 4.527 l
+48.242 4.527 l
+48.242 1.072 l
+h
+49.977 1.072 m
+49.977 4.527 l
+49.448 4.527 l
+49.448 5.056 l
+49.977 5.056 l
+49.977 5.512 l
+49.977 5.913 50.073 6.225 50.271 6.453 c
+50.476 6.676 50.756 6.79 51.108 6.79 c
+51.245 6.79 51.377 6.769 51.505 6.732 c
+51.476 6.188 l
+51.377 6.206 51.278 6.217 51.182 6.217 c
+50.807 6.217 50.624 5.953 50.624 5.423 c
+50.624 5.056 l
+51.299 5.056 l
+51.299 4.527 l
+50.624 4.527 l
+50.624 1.072 l
+h
+53.402 0.999 m
+52.902 0.999 52.52 1.146 52.255 1.44 c
+51.991 1.734 51.858 2.167 51.858 2.748 c
+51.858 3.218 l
+51.858 3.814 51.983 4.28 52.24 4.615 c
+52.505 4.957 52.865 5.13 53.329 5.13 c
+53.788 5.13 54.129 4.976 54.357 4.674 c
+54.592 4.38 54.713 3.917 54.725 3.293 c
+54.725 2.865 l
+52.505 2.865 l
+52.505 2.778 l
+52.505 2.344 52.583 2.032 52.741 1.837 c
+52.905 1.649 53.137 1.558 53.431 1.558 c
+53.626 1.558 53.799 1.591 53.946 1.66 c
+54.092 1.738 54.229 1.855 54.357 2.013 c
+54.696 1.602 l
+54.409 1.198 53.979 0.999 53.402 0.999 c
+53.329 4.571 m
+53.053 4.571 52.851 4.475 52.726 4.292 c
+52.597 4.104 52.523 3.814 52.505 3.424 c
+54.077 3.424 l
+54.077 3.513 l
+54.056 3.895 53.99 4.163 53.872 4.321 c
+53.755 4.486 53.57 4.571 53.329 4.571 c
+57.15 4.438 m
+57.061 4.457 56.963 4.469 56.856 4.469 c
+56.522 4.469 56.286 4.284 56.151 3.924 c
+56.151 1.072 l
+55.504 1.072 l
+55.504 5.056 l
+56.136 5.056 l
+56.151 4.644 l
+56.327 4.968 56.569 5.13 56.886 5.13 c
+56.992 5.13 57.08 5.107 57.15 5.071 c
+h
+59.149 0.999 m
+58.649 0.999 58.268 1.146 58.002 1.44 c
+57.738 1.734 57.605 2.167 57.605 2.748 c
+57.605 3.218 l
+57.605 3.814 57.73 4.28 57.988 4.615 c
+58.252 4.957 58.613 5.13 59.076 5.13 c
+59.535 5.13 59.877 4.976 60.105 4.674 c
+60.34 4.38 60.461 3.917 60.472 3.293 c
+60.472 2.865 l
+58.252 2.865 l
+58.252 2.778 l
+58.252 2.344 58.33 2.032 58.488 1.837 c
+58.653 1.649 58.885 1.558 59.178 1.558 c
+59.373 1.558 59.546 1.591 59.693 1.66 c
+59.84 1.738 59.976 1.855 60.105 2.013 c
+60.443 1.602 l
+60.156 1.198 59.726 0.999 59.149 0.999 c
+59.076 4.571 m
+58.8 4.571 58.598 4.475 58.473 4.292 c
+58.345 4.104 58.271 3.814 58.252 3.424 c
+59.825 3.424 l
+59.825 3.513 l
+59.803 3.895 59.737 4.163 59.619 4.321 c
+59.502 4.486 59.318 4.571 59.076 4.571 c
+61.869 5.056 m
+61.883 4.615 l
+62.137 4.957 62.46 5.13 62.854 5.13 c
+63.559 5.13 63.916 4.659 63.926 3.719 c
+63.926 1.072 l
+63.28 1.072 l
+63.28 3.689 l
+63.28 4.001 63.224 4.222 63.118 4.351 c
+63.008 4.475 62.854 4.542 62.648 4.542 c
+62.49 4.542 62.343 4.486 62.206 4.38 c
+62.078 4.27 61.975 4.134 61.898 3.968 c
+61.898 1.072 l
+61.251 1.072 l
+61.251 5.056 l
+h
+66.278 1.558 m
+66.491 1.558 66.664 1.62 66.792 1.749 c
+66.929 1.884 67.002 2.076 67.013 2.322 c
+67.631 2.322 l
+67.608 1.94 67.473 1.62 67.219 1.367 c
+66.962 1.12 66.65 0.999 66.278 0.999 c
+65.786 0.999 65.411 1.15 65.146 1.454 c
+64.889 1.767 64.764 2.234 64.764 2.851 c
+64.764 3.293 l
+64.764 3.887 64.889 4.343 65.146 4.659 c
+65.411 4.972 65.786 5.13 66.278 5.13 c
+66.679 5.13 66.999 4.997 67.234 4.733 c
+67.476 4.475 67.608 4.13 67.631 3.689 c
+67.013 3.689 l
+66.991 3.983 66.918 4.203 66.792 4.351 c
+66.675 4.498 66.503 4.571 66.278 4.571 c
+65.984 4.571 65.767 4.471 65.632 4.277 c
+65.491 4.089 65.418 3.781 65.411 3.351 c
+65.411 2.836 l
+65.411 2.366 65.477 2.032 65.617 1.837 c
+65.763 1.649 65.984 1.558 66.278 1.558 c
+69.806 0.999 m
+69.306 0.999 68.924 1.146 68.659 1.44 c
+68.395 1.734 68.263 2.167 68.263 2.748 c
+68.263 3.218 l
+68.263 3.814 68.387 4.28 68.645 4.615 c
+68.909 4.957 69.27 5.13 69.732 5.13 c
+70.191 5.13 70.534 4.976 70.762 4.674 c
+70.997 4.38 71.118 3.917 71.128 3.293 c
+71.128 2.865 l
+68.909 2.865 l
+68.909 2.778 l
+68.909 2.344 68.986 2.032 69.144 1.837 c
+69.31 1.649 69.541 1.558 69.835 1.558 c
+70.031 1.558 70.203 1.591 70.349 1.66 c
+70.497 1.738 70.633 1.855 70.762 2.013 c
+71.099 1.602 l
+70.813 1.198 70.382 0.999 69.806 0.999 c
+69.732 4.571 m
+69.457 4.571 69.254 4.475 69.129 4.292 c
+69.001 4.104 68.928 3.814 68.909 3.424 c
+70.482 3.424 l
+70.482 3.513 l
+70.46 3.895 70.394 4.163 70.276 4.321 c
+70.158 4.486 69.975 4.571 69.732 4.571 c
+75.671 1.072 m
+75.631 1.161 75.604 1.308 75.597 1.514 c
+75.362 1.168 75.068 0.999 74.715 0.999 c
+74.351 0.999 74.068 1.095 73.863 1.294 c
+73.665 1.499 73.569 1.786 73.569 2.16 c
+73.569 2.561 73.705 2.881 73.981 3.116 c
+74.253 3.358 74.627 3.484 75.097 3.484 c
+75.583 3.484 l
+75.583 3.91 l
+75.583 4.145 75.527 4.31 75.421 4.409 c
+75.311 4.516 75.149 4.571 74.936 4.571 c
+74.737 4.571 74.576 4.512 74.451 4.394 c
+74.333 4.277 74.274 4.13 74.274 3.954 c
+73.628 3.954 l
+73.628 4.149 73.686 4.34 73.804 4.527 c
+73.929 4.71 74.091 4.858 74.289 4.968 c
+74.495 5.074 74.723 5.13 74.98 5.13 c
+75.38 5.13 75.685 5.026 75.891 4.821 c
+76.105 4.615 76.219 4.321 76.229 3.939 c
+76.229 1.925 l
+76.229 1.62 76.266 1.356 76.347 1.132 c
+76.347 1.072 l
+h
+74.804 1.587 m
+74.969 1.587 75.12 1.631 75.259 1.72 c
+75.406 1.807 75.513 1.918 75.583 2.057 c
+75.583 2.998 l
+75.215 2.998 l
+74.899 2.998 74.656 2.929 74.48 2.792 c
+74.303 2.664 74.216 2.476 74.216 2.234 c
+74.216 2.006 74.26 1.841 74.348 1.734 c
+74.436 1.635 74.587 1.587 74.804 1.587 c
+79.169 2.087 m
+79.169 2.234 79.114 2.355 79.007 2.454 c
+78.897 2.549 78.692 2.667 78.39 2.807 c
+78.045 2.954 77.802 3.075 77.655 3.175 c
+77.508 3.281 77.398 3.399 77.332 3.528 c
+77.262 3.652 77.229 3.81 77.229 3.998 c
+77.229 4.321 77.347 4.589 77.582 4.806 c
+77.817 5.019 78.118 5.13 78.493 5.13 c
+78.875 5.13 79.184 5.016 79.419 4.791 c
+79.654 4.564 79.772 4.277 79.772 3.924 c
+79.125 3.924 l
+79.125 4.101 79.066 4.251 78.949 4.38 c
+78.831 4.505 78.677 4.571 78.493 4.571 c
+78.295 4.571 78.143 4.516 78.037 4.409 c
+77.927 4.31 77.875 4.178 77.875 4.012 c
+77.875 3.883 77.912 3.777 77.993 3.689 c
+78.07 3.608 78.262 3.505 78.567 3.38 c
+79.045 3.193 79.375 3.006 79.552 2.822 c
+79.728 2.645 79.816 2.418 79.816 2.146 c
+79.816 1.793 79.691 1.514 79.448 1.308 c
+79.213 1.102 78.897 0.999 78.508 0.999 c
+78.085 0.999 77.747 1.117 77.493 1.352 c
+77.237 1.595 77.111 1.899 77.111 2.263 c
+77.758 2.263 l
+77.765 2.036 77.835 1.859 77.964 1.734 c
+78.089 1.616 78.272 1.558 78.508 1.558 c
+78.721 1.558 78.883 1.606 78.993 1.705 c
+79.111 1.801 79.169 1.928 79.169 2.087 c
+84.416 1.072 m
+84.377 1.161 84.35 1.308 84.343 1.514 c
+84.108 1.168 83.814 0.999 83.461 0.999 c
+83.097 0.999 82.814 1.095 82.609 1.294 c
+82.411 1.499 82.315 1.786 82.315 2.16 c
+82.315 2.561 82.451 2.881 82.727 3.116 c
+82.999 3.358 83.373 3.484 83.843 3.484 c
+84.329 3.484 l
+84.329 3.91 l
+84.329 4.145 84.273 4.31 84.167 4.409 c
+84.057 4.516 83.895 4.571 83.682 4.571 c
+83.483 4.571 83.321 4.512 83.197 4.394 c
+83.08 4.277 83.02 4.13 83.02 3.954 c
+82.374 3.954 l
+82.374 4.149 82.432 4.34 82.55 4.527 c
+82.675 4.71 82.837 4.858 83.035 4.968 c
+83.24 5.074 83.469 5.13 83.726 5.13 c
+84.127 5.13 84.431 5.026 84.637 4.821 c
+84.85 4.615 84.964 4.321 84.975 3.939 c
+84.975 1.925 l
+84.975 1.62 85.012 1.356 85.093 1.132 c
+85.093 1.072 l
+h
+83.55 1.587 m
+83.715 1.587 83.866 1.631 84.005 1.72 c
+84.152 1.807 84.258 1.918 84.329 2.057 c
+84.329 2.998 l
+83.961 2.998 l
+83.645 2.998 83.402 2.929 83.226 2.792 c
+83.049 2.664 82.962 2.476 82.962 2.234 c
+82.962 2.006 83.005 1.841 83.094 1.734 c
+83.182 1.635 83.333 1.587 83.55 1.587 c
+86.592 5.056 m
+86.607 4.615 l
+86.86 4.957 87.184 5.13 87.577 5.13 c
+88.283 5.13 88.639 4.659 88.65 3.719 c
+88.65 1.072 l
+88.003 1.072 l
+88.003 3.689 l
+88.003 4.001 87.948 4.222 87.842 4.351 c
+87.731 4.475 87.577 4.542 87.371 4.542 c
+87.213 4.542 87.066 4.486 86.93 4.38 c
+86.802 4.27 86.699 4.134 86.621 3.968 c
+86.621 1.072 l
+85.975 1.072 l
+85.975 5.056 l
+h
+f
+Q
+q 1 0 0 1 311.0178 275.5567 cm
+0 0 m
+-0.217 -0.287 -0.53 -0.426 -0.941 -0.426 c
+-1.305 -0.426 -1.58 -0.305 -1.764 -0.058 c
+-1.941 0.195 -2.036 0.559 -2.043 1.029 c
+-2.043 3.631 l
+-1.396 3.631 l
+-1.396 1.087 l
+-1.396 0.459 -1.213 0.147 -0.838 0.147 c
+-0.437 0.147 -0.162 0.324 -0.015 0.676 c
+-0.015 3.631 l
+0.632 3.631 l
+0.632 -0.353 l
+0.015 -0.353 l
+h
+2.234 3.631 m
+2.249 3.19 l
+2.502 3.532 2.826 3.705 3.219 3.705 c
+3.925 3.705 4.281 3.234 4.292 2.294 c
+4.292 -0.353 l
+3.645 -0.353 l
+3.645 2.263 l
+3.645 2.576 3.59 2.797 3.484 2.926 c
+3.373 3.05 3.219 3.117 3.013 3.117 c
+2.855 3.117 2.708 3.061 2.572 2.955 c
+2.444 2.845 2.341 2.708 2.263 2.543 c
+2.263 -0.353 l
+1.617 -0.353 l
+1.617 3.631 l
+h
+6.644 0.133 m
+6.857 0.133 7.03 0.195 7.158 0.324 c
+7.294 0.459 7.368 0.651 7.379 0.897 c
+7.996 0.897 l
+7.975 0.515 7.838 0.195 7.584 -0.058 c
+7.327 -0.305 7.015 -0.426 6.644 -0.426 c
+6.151 -0.426 5.777 -0.276 5.512 0.029 c
+5.255 0.341 5.13 0.809 5.13 1.426 c
+5.13 1.867 l
+5.13 2.462 5.255 2.918 5.512 3.234 c
+5.777 3.547 6.151 3.705 6.644 3.705 c
+7.044 3.705 7.364 3.572 7.599 3.308 c
+7.842 3.05 7.975 2.705 7.996 2.263 c
+7.379 2.263 l
+7.357 2.558 7.283 2.778 7.158 2.926 c
+7.04 3.072 6.868 3.146 6.644 3.146 c
+6.35 3.146 6.133 3.046 5.997 2.851 c
+5.858 2.664 5.784 2.356 5.777 1.926 c
+5.777 1.411 l
+5.777 0.941 5.843 0.607 5.982 0.412 c
+6.13 0.224 6.35 0.133 6.644 0.133 c
+8.613 1.823 m
+8.613 2.4 8.75 2.855 9.025 3.19 c
+9.309 3.532 9.679 3.705 10.142 3.705 c
+10.601 3.705 10.969 3.535 11.245 3.204 c
+11.528 2.882 11.675 2.433 11.686 1.867 c
+11.686 1.44 l
+11.686 0.871 11.542 0.416 11.26 0.073 c
+10.984 -0.261 10.616 -0.426 10.157 -0.426 c
+9.694 -0.426 9.323 -0.264 9.04 0.059 c
+8.764 0.389 8.621 0.831 8.613 1.382 c
+h
+9.261 1.44 m
+9.261 1.037 9.338 0.721 9.496 0.485 c
+9.66 0.25 9.882 0.133 10.157 0.133 c
+10.723 0.133 11.017 0.544 11.039 1.367 c
+11.039 1.823 l
+11.039 2.223 10.955 2.543 10.789 2.778 c
+10.631 3.021 10.414 3.146 10.142 3.146 c
+9.878 3.146 9.66 3.021 9.496 2.778 c
+9.338 2.543 9.261 2.223 9.261 1.823 c
+h
+13.141 3.631 m
+13.155 3.263 l
+13.398 3.557 13.718 3.705 14.111 3.705 c
+14.552 3.705 14.861 3.506 15.037 3.117 c
+15.291 3.506 15.64 3.705 16.081 3.705 c
+16.816 3.705 17.19 3.241 17.213 2.323 c
+17.213 -0.353 l
+16.565 -0.353 l
+16.565 2.263 l
+16.565 2.558 16.511 2.77 16.404 2.911 c
+16.305 3.046 16.132 3.117 15.89 3.117 c
+15.692 3.117 15.53 3.036 15.405 2.882 c
+15.287 2.734 15.217 2.543 15.199 2.308 c
+15.199 -0.353 l
+14.537 -0.353 l
+14.537 2.294 l
+14.537 2.841 14.317 3.117 13.876 3.117 c
+13.542 3.117 13.307 2.955 13.17 2.631 c
+13.17 -0.353 l
+12.523 -0.353 l
+12.523 3.631 l
+h
+18.8 3.631 m
+18.815 3.263 l
+19.057 3.557 19.377 3.705 19.771 3.705 c
+20.211 3.705 20.519 3.506 20.696 3.117 c
+20.949 3.506 21.299 3.705 21.74 3.705 c
+22.475 3.705 22.85 3.241 22.871 2.323 c
+22.871 -0.353 l
+22.225 -0.353 l
+22.225 2.263 l
+22.225 2.558 22.169 2.77 22.063 2.911 c
+21.964 3.046 21.791 3.117 21.549 3.117 c
+21.35 3.117 21.188 3.036 21.064 2.882 c
+20.947 2.734 20.876 2.543 20.858 2.308 c
+20.858 -0.353 l
+20.197 -0.353 l
+20.197 2.294 l
+20.197 2.841 19.976 3.117 19.535 3.117 c
+19.201 3.117 18.965 2.955 18.83 2.631 c
+18.83 -0.353 l
+18.183 -0.353 l
+18.183 3.631 l
+h
+24.548 -0.353 -0.647 3.984 re
+24.592 4.675 m
+24.592 4.564 24.562 4.472 24.503 4.395 c
+24.444 4.326 24.349 4.293 24.224 4.293 c
+24.106 4.293 24.01 4.326 23.945 4.395 c
+23.886 4.472 23.856 4.564 23.856 4.675 c
+23.856 4.792 23.886 4.884 23.945 4.954 c
+24.01 5.031 24.106 5.072 24.224 5.072 c
+24.349 5.072 24.444 5.031 24.503 4.954 c
+24.562 4.873 24.592 4.781 24.592 4.675 c
+26.414 4.586 m
+26.414 3.631 l
+27.017 3.631 l
+27.017 3.102 l
+26.414 3.102 l
+26.414 0.632 l
+26.414 0.474 26.437 0.357 26.487 0.279 c
+26.547 0.199 26.634 0.162 26.752 0.162 c
+26.84 0.162 26.929 0.177 27.017 0.206 c
+27.017 -0.353 l
+26.869 -0.401 26.715 -0.426 26.561 -0.426 c
+26.304 -0.426 26.109 -0.334 25.973 -0.147 c
+25.834 0.037 25.768 0.298 25.768 0.632 c
+25.768 3.102 l
+25.165 3.102 l
+25.165 3.631 l
+25.768 3.631 l
+25.768 4.586 l
+h
+29.207 -0.426 m
+28.708 -0.426 28.325 -0.279 28.06 0.015 c
+27.796 0.309 27.663 0.742 27.663 1.323 c
+27.663 1.793 l
+27.663 2.389 27.789 2.855 28.045 3.19 c
+28.311 3.532 28.671 3.705 29.134 3.705 c
+29.593 3.705 29.934 3.55 30.162 3.248 c
+30.397 2.955 30.519 2.492 30.53 1.867 c
+30.53 1.44 l
+28.311 1.44 l
+28.311 1.353 l
+28.311 0.919 28.388 0.607 28.546 0.412 c
+28.71 0.224 28.943 0.133 29.236 0.133 c
+29.431 0.133 29.604 0.166 29.751 0.235 c
+29.898 0.312 30.034 0.43 30.162 0.588 c
+30.501 0.177 l
+30.214 -0.228 29.784 -0.426 29.207 -0.426 c
+29.134 3.146 m
+28.858 3.146 28.656 3.05 28.531 2.866 c
+28.402 2.679 28.328 2.389 28.311 1.999 c
+29.884 1.999 l
+29.884 2.088 l
+29.861 2.469 29.795 2.738 29.677 2.896 c
+29.56 3.061 29.376 3.146 29.134 3.146 c
+31.177 1.823 m
+31.177 2.429 31.287 2.896 31.515 3.219 c
+31.75 3.543 32.077 3.705 32.5 3.705 c
+32.882 3.705 33.179 3.547 33.396 3.234 c
+33.396 5.292 l
+34.043 5.292 l
+34.043 -0.353 l
+33.455 -0.353 l
+33.411 0.073 l
+33.205 -0.261 32.9 -0.426 32.5 -0.426 c
+32.088 -0.426 31.765 -0.272 31.53 0.044 c
+31.295 0.368 31.177 0.823 31.177 1.411 c
+h
+31.823 1.44 m
+31.823 1 31.886 0.669 32.014 0.456 c
+32.151 0.25 32.371 0.147 32.676 0.147 c
+32.999 0.147 33.238 0.309 33.396 0.632 c
+33.396 2.646 l
+33.227 2.959 32.988 3.117 32.676 3.117 c
+32.371 3.117 32.151 3.013 32.014 2.808 c
+31.886 2.602 31.823 2.279 31.823 1.837 c
+h
+38.144 0.133 m
+38.357 0.133 38.53 0.195 38.659 0.324 c
+38.794 0.459 38.868 0.651 38.879 0.897 c
+39.496 0.897 l
+39.474 0.515 39.338 0.195 39.085 -0.058 c
+38.827 -0.305 38.515 -0.426 38.144 -0.426 c
+37.651 -0.426 37.277 -0.276 37.012 0.029 c
+36.755 0.341 36.63 0.809 36.63 1.426 c
+36.63 1.867 l
+36.63 2.462 36.755 2.918 37.012 3.234 c
+37.277 3.547 37.651 3.705 38.144 3.705 c
+38.545 3.705 38.864 3.572 39.099 3.308 c
+39.342 3.05 39.474 2.705 39.496 2.263 c
+38.879 2.263 l
+38.857 2.558 38.784 2.778 38.659 2.926 c
+38.541 3.072 38.368 3.146 38.144 3.146 c
+37.85 3.146 37.633 3.046 37.497 2.851 c
+37.358 2.664 37.284 2.356 37.277 1.926 c
+37.277 1.411 l
+37.277 0.941 37.343 0.607 37.483 0.412 c
+37.63 0.224 37.85 0.133 38.144 0.133 c
+40.893 3.219 m
+41.146 3.543 41.466 3.705 41.848 3.705 c
+42.553 3.705 42.91 3.234 42.921 2.294 c
+42.921 -0.353 l
+42.274 -0.353 l
+42.274 2.263 l
+42.274 2.576 42.219 2.797 42.113 2.926 c
+42.002 3.05 41.848 3.117 41.643 3.117 c
+41.485 3.117 41.337 3.061 41.202 2.955 c
+41.073 2.845 40.97 2.708 40.893 2.543 c
+40.893 -0.353 l
+40.246 -0.353 l
+40.246 5.292 l
+40.893 5.292 l
+h
+45.919 -0.353 m
+45.879 -0.264 45.854 -0.118 45.846 0.088 c
+45.611 -0.257 45.317 -0.426 44.965 -0.426 c
+44.6 -0.426 44.317 -0.33 44.112 -0.132 c
+43.914 0.073 43.818 0.36 43.818 0.735 c
+43.818 1.135 43.954 1.455 44.23 1.691 c
+44.502 1.933 44.876 2.058 45.346 2.058 c
+45.832 2.058 l
+45.832 2.484 l
+45.832 2.72 45.776 2.885 45.67 2.984 c
+45.56 3.09 45.398 3.146 45.185 3.146 c
+44.986 3.146 44.824 3.087 44.7 2.969 c
+44.583 2.851 44.523 2.705 44.523 2.529 c
+43.877 2.529 l
+43.877 2.723 43.935 2.914 44.053 3.102 c
+44.178 3.285 44.34 3.433 44.538 3.543 c
+44.743 3.649 44.972 3.705 45.229 3.705 c
+45.63 3.705 45.934 3.601 46.14 3.396 c
+46.353 3.19 46.468 2.896 46.478 2.514 c
+46.478 0.5 l
+46.478 0.195 46.515 -0.07 46.596 -0.293 c
+46.596 -0.353 l
+h
+45.053 0.162 m
+45.218 0.162 45.369 0.206 45.508 0.294 c
+45.655 0.382 45.762 0.493 45.832 0.632 c
+45.832 1.573 l
+45.464 1.573 l
+45.148 1.573 44.905 1.503 44.729 1.367 c
+44.552 1.239 44.465 1.051 44.465 0.809 c
+44.465 0.58 44.508 0.416 44.597 0.309 c
+44.685 0.21 44.836 0.162 45.053 0.162 c
+48.095 3.631 m
+48.11 3.19 l
+48.363 3.532 48.687 3.705 49.08 3.705 c
+49.786 3.705 50.142 3.234 50.153 2.294 c
+50.153 -0.353 l
+49.506 -0.353 l
+49.506 2.263 l
+49.506 2.576 49.451 2.797 49.345 2.926 c
+49.235 3.05 49.08 3.117 48.874 3.117 c
+48.716 3.117 48.569 3.061 48.433 2.955 c
+48.305 2.845 48.202 2.708 48.124 2.543 c
+48.124 -0.353 l
+47.478 -0.353 l
+47.478 3.631 l
+h
+50.991 1.823 m
+50.991 2.44 51.101 2.903 51.329 3.219 c
+51.553 3.543 51.887 3.705 52.329 3.705 c
+52.729 3.705 53.034 3.528 53.24 3.175 c
+53.284 3.631 l
+53.872 3.631 l
+53.872 -0.397 l
+53.872 -0.885 53.743 -1.264 53.49 -1.529 c
+53.233 -1.793 52.88 -1.926 52.431 -1.926 c
+52.233 -1.926 52.013 -1.874 51.77 -1.778 c
+51.523 -1.679 51.344 -1.558 51.226 -1.411 c
+51.49 -0.97 l
+51.756 -1.234 52.053 -1.367 52.387 -1.367 c
+52.924 -1.367 53.2 -1.072 53.21 -0.484 c
+53.21 0.044 l
+53.005 -0.272 52.703 -0.426 52.314 -0.426 c
+51.902 -0.426 51.579 -0.276 51.344 0.029 c
+51.116 0.341 50.998 0.794 50.991 1.382 c
+h
+51.652 1.44 m
+51.652 1 51.715 0.669 51.843 0.456 c
+51.968 0.25 52.186 0.147 52.49 0.147 c
+52.814 0.147 53.053 0.312 53.21 0.647 c
+53.21 2.631 l
+53.042 2.955 52.803 3.117 52.49 3.117 c
+52.196 3.117 51.98 3.013 51.843 2.808 c
+51.715 2.602 51.652 2.279 51.652 1.837 c
+h
+56.253 -0.426 m
+55.754 -0.426 55.371 -0.279 55.107 0.015 c
+54.842 0.309 54.71 0.742 54.71 1.323 c
+54.71 1.793 l
+54.71 2.389 54.835 2.855 55.092 3.19 c
+55.357 3.532 55.717 3.705 56.18 3.705 c
+56.639 3.705 56.981 3.55 57.208 3.248 c
+57.443 2.955 57.565 2.492 57.576 1.867 c
+57.576 1.44 l
+55.357 1.44 l
+55.357 1.353 l
+55.357 0.919 55.434 0.607 55.592 0.412 c
+55.757 0.224 55.989 0.133 56.283 0.133 c
+56.477 0.133 56.65 0.166 56.797 0.235 c
+56.944 0.312 57.08 0.43 57.208 0.588 c
+57.547 0.177 l
+57.26 -0.228 56.83 -0.426 56.253 -0.426 c
+56.18 3.146 m
+55.904 3.146 55.702 3.05 55.577 2.866 c
+55.448 2.679 55.375 2.389 55.357 1.999 c
+56.93 1.999 l
+56.93 2.088 l
+56.907 2.469 56.841 2.738 56.724 2.896 c
+56.606 3.061 56.423 3.146 56.18 3.146 c
+60.296 0.661 m
+60.296 0.809 60.24 0.929 60.134 1.029 c
+60.024 1.124 59.818 1.242 59.517 1.382 c
+59.171 1.529 58.929 1.65 58.781 1.75 c
+58.634 1.856 58.524 1.974 58.458 2.103 c
+58.388 2.227 58.355 2.385 58.355 2.573 c
+58.355 2.896 58.473 3.164 58.708 3.381 c
+58.943 3.594 59.245 3.705 59.619 3.705 c
+60.001 3.705 60.31 3.591 60.545 3.366 c
+60.78 3.138 60.898 2.851 60.898 2.499 c
+60.252 2.499 l
+60.252 2.675 60.192 2.826 60.075 2.955 c
+59.957 3.08 59.803 3.146 59.619 3.146 c
+59.421 3.146 59.27 3.09 59.164 2.984 c
+59.053 2.885 59.002 2.753 59.002 2.587 c
+59.002 2.458 59.039 2.352 59.12 2.263 c
+59.197 2.183 59.388 2.08 59.693 1.955 c
+60.171 1.768 60.501 1.58 60.678 1.397 c
+60.854 1.22 60.942 0.992 60.942 0.721 c
+60.942 0.368 60.817 0.088 60.575 -0.118 c
+60.34 -0.324 60.024 -0.426 59.634 -0.426 c
+59.211 -0.426 58.873 -0.309 58.619 -0.073 c
+58.363 0.169 58.237 0.474 58.237 0.838 c
+58.885 0.838 l
+58.892 0.611 58.962 0.434 59.09 0.309 c
+59.215 0.191 59.399 0.133 59.634 0.133 c
+59.847 0.133 60.009 0.181 60.119 0.279 c
+60.236 0.375 60.296 0.503 60.296 0.661 c
+61.824 0 m
+61.824 0.118 61.857 0.214 61.927 0.294 c
+61.993 0.372 62.096 0.412 62.236 0.412 c
+62.382 0.412 62.49 0.372 62.559 0.294 c
+62.636 0.214 62.677 0.118 62.677 0 c
+62.677 -0.11 62.636 -0.202 62.559 -0.279 c
+62.49 -0.357 62.382 -0.397 62.236 -0.397 c
+62.096 -0.397 61.993 -0.357 61.927 -0.279 c
+61.857 -0.202 61.824 -0.11 61.824 0 c
+66.602 1.338 m
+66.675 0.735 l
+66.777 1.264 l
+67.631 4.998 l
+68.189 4.998 l
+69.027 1.264 l
+69.129 0.721 l
+69.203 1.338 l
+69.865 4.998 l
+70.54 4.998 l
+69.468 -0.353 l
+68.865 -0.353 l
+67.968 3.543 l
+67.909 3.866 l
+67.866 3.543 l
+66.939 -0.353 l
+66.322 -0.353 l
+65.264 4.998 l
+65.94 4.998 l
+h
+71.864 3.219 m
+72.117 3.543 72.437 3.705 72.819 3.705 c
+73.524 3.705 73.881 3.234 73.892 2.294 c
+73.892 -0.353 l
+73.245 -0.353 l
+73.245 2.263 l
+73.245 2.576 73.19 2.797 73.083 2.926 c
+72.973 3.05 72.819 3.117 72.613 3.117 c
+72.455 3.117 72.308 3.061 72.173 2.955 c
+72.044 2.845 71.941 2.708 71.864 2.543 c
+71.864 -0.353 l
+71.217 -0.353 l
+71.217 5.292 l
+71.864 5.292 l
+h
+76.273 -0.426 m
+75.774 -0.426 75.392 -0.279 75.126 0.015 c
+74.862 0.309 74.73 0.742 74.73 1.323 c
+74.73 1.793 l
+74.73 2.389 74.855 2.855 75.112 3.19 c
+75.377 3.532 75.737 3.705 76.2 3.705 c
+76.659 3.705 77.001 3.55 77.229 3.248 c
+77.464 2.955 77.586 2.492 77.596 1.867 c
+77.596 1.44 l
+75.377 1.44 l
+75.377 1.353 l
+75.377 0.919 75.454 0.607 75.612 0.412 c
+75.777 0.224 76.009 0.133 76.302 0.133 c
+76.497 0.133 76.67 0.166 76.817 0.235 c
+76.964 0.312 77.1 0.43 77.229 0.588 c
+77.567 0.177 l
+77.28 -0.228 76.85 -0.426 76.273 -0.426 c
+76.2 3.146 m
+75.924 3.146 75.722 3.05 75.597 2.866 c
+75.469 2.679 75.396 2.389 75.377 1.999 c
+76.95 1.999 l
+76.95 2.088 l
+76.927 2.469 76.861 2.738 76.744 2.896 c
+76.626 3.061 76.443 3.146 76.2 3.146 c
+78.993 3.631 m
+79.007 3.19 l
+79.261 3.532 79.585 3.705 79.978 3.705 c
+80.683 3.705 81.04 3.234 81.05 2.294 c
+81.05 -0.353 l
+80.404 -0.353 l
+80.404 2.263 l
+80.404 2.576 80.349 2.797 80.242 2.926 c
+80.132 3.05 79.978 3.117 79.772 3.117 c
+79.614 3.117 79.467 3.061 79.331 2.955 c
+79.202 2.845 79.099 2.708 79.022 2.543 c
+79.022 -0.353 l
+78.375 -0.353 l
+78.375 3.631 l
+h
+f
+Q
+396.523 277.071 -1.794 0.866 re
+399.256 277.071 -1.793 0.866 re
+401.138 278.835 m
+401.362 279.117 401.637 279.261 401.961 279.261 c
+402.321 279.261 402.597 279.132 402.784 278.878 c
+402.979 278.622 403.078 278.24 403.078 277.733 c
+403.078 275.204 l
+402.034 275.204 l
+402.034 277.718 l
+402.034 277.953 401.994 278.118 401.917 278.217 c
+401.847 278.324 401.733 278.379 401.579 278.379 c
+401.391 278.379 401.244 278.294 401.138 278.13 c
+401.138 275.204 l
+400.094 275.204 l
+400.094 280.848 l
+401.138 280.848 l
+h
+405.709 275.204 m
+405.68 275.263 405.651 275.366 405.62 275.512 c
+405.433 275.256 405.184 275.131 404.872 275.131 c
+404.537 275.131 404.257 275.237 404.033 275.454 c
+403.817 275.678 403.71 275.969 403.71 276.322 c
+403.71 276.733 403.842 277.049 404.107 277.276 c
+404.371 277.512 404.754 277.629 405.254 277.629 c
+405.577 277.629 l
+405.577 277.953 l
+405.577 278.13 405.54 278.25 405.474 278.321 c
+405.415 278.398 405.327 278.438 405.209 278.438 c
+404.952 278.438 404.827 278.284 404.827 277.982 c
+403.783 277.982 l
+403.783 278.354 403.92 278.658 404.195 278.893 c
+404.467 279.136 404.816 279.261 405.238 279.261 c
+405.68 279.261 406.017 279.144 406.253 278.909 c
+406.495 278.68 406.62 278.357 406.62 277.938 c
+406.62 276.071 l
+406.62 275.726 406.668 275.458 406.767 275.263 c
+406.767 275.204 l
+h
+405.107 275.954 m
+405.213 275.954 405.305 275.972 405.385 276.013 c
+405.474 276.06 405.537 276.119 405.577 276.189 c
+405.577 277.012 l
+405.327 277.012 l
+405.15 277.012 405.007 276.954 404.901 276.836 c
+404.801 276.725 404.754 276.578 404.754 276.395 c
+404.754 276.1 404.872 275.954 405.107 275.954 c
+409.325 278.173 m
+408.987 278.203 l
+408.7 278.203 408.509 278.078 408.413 277.835 c
+408.413 275.204 l
+407.37 275.204 l
+407.37 279.188 l
+408.34 279.188 l
+408.369 278.747 l
+408.535 279.088 408.766 279.261 409.061 279.261 c
+409.178 279.261 409.27 279.239 409.34 279.202 c
+h
+409.649 277.321 m
+409.649 277.968 409.755 278.452 409.971 278.776 c
+410.196 279.1 410.519 279.261 410.942 279.261 c
+411.255 279.261 411.508 279.129 411.706 278.864 c
+411.706 280.848 l
+412.764 280.848 l
+412.764 275.204 l
+411.81 275.204 l
+411.765 275.616 l
+411.548 275.292 411.272 275.131 410.942 275.131 c
+410.53 275.131 410.21 275.285 409.986 275.601 c
+409.77 275.924 409.656 276.395 409.649 277.012 c
+h
+410.692 277.056 m
+410.692 276.663 410.729 276.387 410.81 276.233 c
+410.898 276.075 411.045 275.998 411.251 275.998 c
+411.457 275.998 411.607 276.09 411.706 276.277 c
+411.706 278.085 l
+411.607 278.28 411.457 278.379 411.251 278.379 c
+411.052 278.379 410.912 278.298 410.825 278.144 c
+410.736 277.997 410.692 277.725 410.692 277.336 c
+h
+f
+416.057 275.204 -0.646 3.984 re
+416.101 280.231 m
+416.101 280.121 416.072 280.029 416.013 279.952 c
+415.954 279.882 415.858 279.849 415.733 279.849 c
+415.616 279.849 415.521 279.882 415.455 279.952 c
+415.396 280.029 415.366 280.121 415.366 280.231 c
+415.366 280.349 415.396 280.441 415.455 280.511 c
+415.521 280.588 415.616 280.628 415.733 280.628 c
+415.858 280.628 415.954 280.588 416.013 280.511 c
+416.072 280.43 416.101 280.337 416.101 280.231 c
+419.012 276.218 m
+419.012 276.366 418.956 276.486 418.85 276.586 c
+418.74 276.681 418.534 276.798 418.233 276.939 c
+417.888 277.085 417.645 277.207 417.497 277.306 c
+417.35 277.413 417.24 277.53 417.175 277.659 c
+417.104 277.783 417.071 277.941 417.071 278.13 c
+417.071 278.452 417.189 278.72 417.424 278.938 c
+417.659 279.15 417.961 279.261 418.335 279.261 c
+418.717 279.261 419.026 279.147 419.261 278.923 c
+419.496 278.695 419.614 278.408 419.614 278.055 c
+418.968 278.055 l
+418.968 278.232 418.908 278.383 418.791 278.512 c
+418.673 278.637 418.519 278.703 418.335 278.703 c
+418.137 278.703 417.986 278.647 417.88 278.541 c
+417.77 278.442 417.718 278.309 417.718 278.144 c
+417.718 278.015 417.755 277.909 417.836 277.82 c
+417.913 277.739 418.104 277.637 418.409 277.512 c
+418.887 277.324 419.218 277.137 419.394 276.954 c
+419.571 276.777 419.658 276.549 419.658 276.277 c
+419.658 275.924 419.534 275.645 419.291 275.439 c
+419.056 275.233 418.74 275.131 418.35 275.131 c
+417.928 275.131 417.589 275.248 417.336 275.483 c
+417.079 275.726 416.954 276.031 416.954 276.395 c
+417.601 276.395 l
+417.608 276.167 417.678 275.99 417.807 275.865 c
+417.931 275.748 418.115 275.689 418.35 275.689 c
+418.563 275.689 418.725 275.737 418.835 275.836 c
+418.953 275.932 419.012 276.06 419.012 276.218 c
+424.244 275.557 m
+424.028 275.27 423.716 275.131 423.303 275.131 c
+422.94 275.131 422.665 275.252 422.48 275.498 c
+422.304 275.751 422.208 276.115 422.201 276.586 c
+422.201 279.188 l
+422.848 279.188 l
+422.848 276.644 l
+422.848 276.016 423.032 275.703 423.407 275.703 c
+423.808 275.703 424.082 275.88 424.23 276.233 c
+424.23 279.188 l
+424.876 279.188 l
+424.876 275.204 l
+424.259 275.204 l
+h
+427.802 276.218 m
+427.802 276.366 427.747 276.486 427.64 276.586 c
+427.53 276.681 427.324 276.798 427.022 276.939 c
+426.677 277.085 426.434 277.207 426.288 277.306 c
+426.141 277.413 426.031 277.53 425.964 277.659 c
+425.894 277.783 425.861 277.941 425.861 278.13 c
+425.861 278.452 425.979 278.72 426.214 278.938 c
+426.449 279.15 426.75 279.261 427.126 279.261 c
+427.508 279.261 427.816 279.147 428.051 278.923 c
+428.287 278.695 428.404 278.408 428.404 278.055 c
+427.758 278.055 l
+427.758 278.232 427.699 278.383 427.581 278.512 c
+427.463 278.637 427.309 278.703 427.126 278.703 c
+426.927 278.703 426.777 278.647 426.669 278.541 c
+426.559 278.442 426.509 278.309 426.509 278.144 c
+426.509 278.015 426.545 277.909 426.626 277.82 c
+426.703 277.739 426.894 277.637 427.199 277.512 c
+427.677 277.324 428.007 277.137 428.184 276.954 c
+428.36 276.777 428.448 276.549 428.448 276.277 c
+428.448 275.924 428.323 275.645 428.081 275.439 c
+427.845 275.233 427.53 275.131 427.14 275.131 c
+426.717 275.131 426.38 275.248 426.126 275.483 c
+425.869 275.726 425.744 276.031 425.744 276.395 c
+426.391 276.395 l
+426.398 276.167 426.468 275.99 426.596 275.865 c
+426.721 275.748 426.905 275.689 427.14 275.689 c
+427.353 275.689 427.515 275.737 427.625 275.836 c
+427.743 275.932 427.802 276.06 427.802 276.218 c
+430.712 275.131 m
+430.212 275.131 429.83 275.277 429.566 275.572 c
+429.301 275.865 429.169 276.299 429.169 276.879 c
+429.169 277.35 l
+429.169 277.945 429.294 278.412 429.551 278.747 c
+429.815 279.088 430.176 279.261 430.638 279.261 c
+431.098 279.261 431.44 279.107 431.668 278.805 c
+431.903 278.512 432.024 278.049 432.035 277.424 c
+432.035 276.997 l
+429.815 276.997 l
+429.815 276.909 l
+429.815 276.476 429.892 276.163 430.05 275.969 c
+430.216 275.781 430.447 275.689 430.742 275.689 c
+430.937 275.689 431.109 275.722 431.256 275.792 c
+431.403 275.869 431.539 275.987 431.668 276.145 c
+432.005 275.734 l
+431.719 275.329 431.289 275.131 430.712 275.131 c
+430.638 278.703 m
+430.363 278.703 430.161 278.607 430.036 278.423 c
+429.908 278.236 429.834 277.945 429.815 277.556 c
+431.388 277.556 l
+431.388 277.644 l
+431.367 278.026 431.3 278.294 431.182 278.452 c
+431.065 278.618 430.881 278.703 430.638 278.703 c
+432.682 277.38 m
+432.682 277.986 432.792 278.452 433.019 278.776 c
+433.255 279.1 433.582 279.261 434.004 279.261 c
+434.387 279.261 434.685 279.103 434.901 278.791 c
+434.901 280.848 l
+435.548 280.848 l
+435.548 275.204 l
+434.96 275.204 l
+434.916 275.63 l
+434.71 275.296 434.405 275.131 434.004 275.131 c
+433.593 275.131 433.27 275.285 433.035 275.601 c
+432.799 275.924 432.682 276.38 432.682 276.968 c
+h
+433.329 276.997 m
+433.329 276.557 433.391 276.226 433.52 276.013 c
+433.655 275.807 433.876 275.703 434.181 275.703 c
+434.505 275.703 434.743 275.865 434.901 276.189 c
+434.901 278.203 l
+434.733 278.515 434.494 278.673 434.181 278.673 c
+433.876 278.673 433.655 278.57 433.52 278.365 c
+433.391 278.159 433.329 277.835 433.329 277.394 c
+h
+436.562 274.131 m
+436.165 274.396 l
+436.4 274.719 436.522 275.053 436.533 275.395 c
+436.533 276.013 l
+437.194 276.013 l
+437.194 275.483 l
+437.194 275.226 437.129 274.98 437.003 274.734 c
+436.886 274.491 436.739 274.289 436.562 274.131 c
+441.796 275.204 m
+441.755 275.292 441.729 275.439 441.721 275.645 c
+441.486 275.3 441.193 275.131 440.84 275.131 c
+440.476 275.131 440.193 275.226 439.988 275.425 c
+439.789 275.63 439.693 275.917 439.693 276.291 c
+439.693 276.692 439.829 277.012 440.105 277.247 c
+440.377 277.49 440.751 277.615 441.222 277.615 c
+441.707 277.615 l
+441.707 278.041 l
+441.707 278.276 441.652 278.442 441.545 278.541 c
+441.435 278.647 441.273 278.703 441.06 278.703 c
+440.861 278.703 440.701 278.643 440.575 278.526 c
+440.458 278.408 440.399 278.261 440.399 278.085 c
+439.752 278.085 l
+439.752 278.28 439.811 278.471 439.928 278.658 c
+440.053 278.842 440.215 278.989 440.414 279.1 c
+440.62 279.206 440.847 279.261 441.104 279.261 c
+441.505 279.261 441.81 279.158 442.016 278.953 c
+442.229 278.747 442.343 278.452 442.353 278.07 c
+442.353 276.056 l
+442.353 275.751 442.39 275.487 442.471 275.263 c
+442.471 275.204 l
+h
+440.928 275.718 m
+441.093 275.718 441.244 275.763 441.384 275.851 c
+441.53 275.939 441.638 276.05 441.707 276.189 c
+441.707 277.13 l
+441.339 277.13 l
+441.023 277.13 440.781 277.06 440.605 276.924 c
+440.428 276.796 440.34 276.607 440.34 276.366 c
+440.34 276.137 440.384 275.972 440.472 275.865 c
+440.56 275.766 440.711 275.718 440.928 275.718 c
+444.059 275.204 -0.647 5.644 re
+445.779 275.204 -0.647 5.644 re
+449.894 275.689 m
+450.108 275.689 450.28 275.751 450.409 275.88 c
+450.544 276.016 450.619 276.208 450.629 276.453 c
+451.246 276.453 l
+451.225 276.071 451.089 275.751 450.835 275.498 c
+450.578 275.252 450.265 275.131 449.894 275.131 c
+449.402 275.131 449.027 275.281 448.763 275.586 c
+448.505 275.898 448.381 276.366 448.381 276.983 c
+448.381 277.424 l
+448.381 278.019 448.505 278.475 448.763 278.791 c
+449.027 279.103 449.402 279.261 449.894 279.261 c
+450.295 279.261 450.615 279.129 450.85 278.864 c
+451.092 278.607 451.225 278.261 451.246 277.82 c
+450.629 277.82 l
+450.608 278.115 450.534 278.335 450.409 278.482 c
+450.291 278.629 450.118 278.703 449.894 278.703 c
+449.6 278.703 449.384 278.603 449.247 278.408 c
+449.108 278.221 449.035 277.912 449.027 277.482 c
+449.027 276.968 l
+449.027 276.497 449.093 276.163 449.233 275.969 c
+449.38 275.781 449.6 275.689 449.894 275.689 c
+452.643 278.776 m
+452.896 279.1 453.216 279.261 453.598 279.261 c
+454.304 279.261 454.66 278.791 454.672 277.85 c
+454.672 275.204 l
+454.025 275.204 l
+454.025 277.82 l
+454.025 278.132 453.97 278.354 453.863 278.482 c
+453.753 278.607 453.598 278.673 453.393 278.673 c
+453.235 278.673 453.087 278.618 452.952 278.512 c
+452.823 278.401 452.72 278.265 452.643 278.099 c
+452.643 275.204 l
+451.996 275.204 l
+451.996 280.848 l
+452.643 280.848 l
+h
+457.671 275.204 m
+457.63 275.292 457.604 275.439 457.596 275.645 c
+457.361 275.3 457.068 275.131 456.715 275.131 c
+456.351 275.131 456.068 275.226 455.862 275.425 c
+455.664 275.63 455.568 275.917 455.568 276.291 c
+455.568 276.692 455.704 277.012 455.98 277.247 c
+456.252 277.49 456.626 277.615 457.097 277.615 c
+457.582 277.615 l
+457.582 278.041 l
+457.582 278.276 457.527 278.442 457.42 278.541 c
+457.31 278.647 457.148 278.703 456.935 278.703 c
+456.736 278.703 456.576 278.643 456.45 278.526 c
+456.333 278.408 456.274 278.261 456.274 278.085 c
+455.627 278.085 l
+455.627 278.28 455.686 278.471 455.803 278.658 c
+455.928 278.842 456.09 278.989 456.289 279.1 c
+456.495 279.206 456.722 279.261 456.979 279.261 c
+457.38 279.261 457.685 279.158 457.891 278.953 c
+458.104 278.747 458.218 278.452 458.228 278.07 c
+458.228 276.056 l
+458.228 275.751 458.265 275.487 458.346 275.263 c
+458.346 275.204 l
+h
+456.803 275.718 m
+456.969 275.718 457.119 275.763 457.259 275.851 c
+457.405 275.939 457.513 276.05 457.582 276.189 c
+457.582 277.13 l
+457.214 277.13 l
+456.898 277.13 456.656 277.06 456.48 276.924 c
+456.303 276.796 456.215 276.607 456.215 276.366 c
+456.215 276.137 456.259 275.972 456.347 275.865 c
+456.435 275.766 456.586 275.718 456.803 275.718 c
+459.846 279.188 m
+459.861 278.747 l
+460.114 279.088 460.437 279.261 460.831 279.261 c
+461.536 279.261 461.893 278.791 461.904 277.85 c
+461.904 275.204 l
+461.257 275.204 l
+461.257 277.82 l
+461.257 278.132 461.202 278.354 461.095 278.482 c
+460.985 278.607 460.831 278.673 460.625 278.673 c
+460.466 278.673 460.32 278.618 460.183 278.512 c
+460.055 278.401 459.952 278.265 459.875 278.099 c
+459.875 275.204 l
+459.228 275.204 l
+459.228 279.188 l
+h
+462.741 277.38 m
+462.741 277.997 462.851 278.46 463.08 278.776 c
+463.304 279.1 463.638 279.261 464.079 279.261 c
+464.48 279.261 464.784 279.084 464.99 278.732 c
+465.035 279.188 l
+465.623 279.188 l
+465.623 275.16 l
+465.623 274.671 465.494 274.292 465.24 274.028 c
+464.983 273.764 464.63 273.631 464.181 273.631 c
+463.984 273.631 463.763 273.683 463.52 273.779 c
+463.275 273.877 463.094 273.999 462.976 274.146 c
+463.241 274.587 l
+463.506 274.322 463.803 274.19 464.138 274.19 c
+464.674 274.19 464.95 274.484 464.961 275.072 c
+464.961 275.601 l
+464.755 275.285 464.454 275.131 464.064 275.131 c
+463.653 275.131 463.329 275.281 463.094 275.586 c
+462.866 275.898 462.749 276.351 462.741 276.939 c
+h
+463.403 276.997 m
+463.403 276.557 463.466 276.226 463.594 276.013 c
+463.719 275.807 463.936 275.703 464.241 275.703 c
+464.564 275.703 464.803 275.869 464.961 276.204 c
+464.961 278.188 l
+464.792 278.512 464.553 278.673 464.241 278.673 c
+463.946 278.673 463.73 278.57 463.594 278.365 c
+463.466 278.159 463.403 277.835 463.403 277.394 c
+h
+468.004 275.131 m
+467.504 275.131 467.121 275.277 466.857 275.572 c
+466.593 275.865 466.46 276.299 466.46 276.879 c
+466.46 277.35 l
+466.46 277.945 466.585 278.412 466.843 278.747 c
+467.107 279.088 467.467 279.261 467.93 279.261 c
+468.389 279.261 468.731 279.107 468.959 278.805 c
+469.195 278.512 469.315 278.049 469.326 277.424 c
+469.326 276.997 l
+467.107 276.997 l
+467.107 276.909 l
+467.107 276.476 467.184 276.163 467.342 275.969 c
+467.508 275.781 467.739 275.689 468.033 275.689 c
+468.228 275.689 468.401 275.722 468.547 275.792 c
+468.694 275.869 468.831 275.987 468.959 276.145 c
+469.297 275.734 l
+469.01 275.329 468.58 275.131 468.004 275.131 c
+467.93 278.703 m
+467.655 278.703 467.452 278.607 467.327 278.423 c
+467.198 278.236 467.125 277.945 467.107 277.556 c
+468.68 277.556 l
+468.68 277.644 l
+468.658 278.026 468.592 278.294 468.474 278.452 c
+468.356 278.618 468.173 278.703 467.93 278.703 c
+472.046 276.218 m
+472.046 276.366 471.991 276.486 471.884 276.586 c
+471.774 276.681 471.568 276.798 471.267 276.939 c
+470.922 277.085 470.679 277.207 470.531 277.306 c
+470.385 277.413 470.275 277.53 470.209 277.659 c
+470.139 277.783 470.105 277.941 470.105 278.13 c
+470.105 278.452 470.223 278.72 470.458 278.938 c
+470.693 279.15 470.995 279.261 471.37 279.261 c
+471.752 279.261 472.06 279.147 472.295 278.923 c
+472.531 278.695 472.648 278.408 472.648 278.055 c
+472.002 278.055 l
+472.002 278.232 471.943 278.383 471.825 278.512 c
+471.707 278.637 471.553 278.703 471.37 278.703 c
+471.171 278.703 471.021 278.647 470.914 278.541 c
+470.804 278.442 470.753 278.309 470.753 278.144 c
+470.753 278.015 470.789 277.909 470.87 277.82 c
+470.947 277.739 471.138 277.637 471.443 277.512 c
+471.921 277.324 472.252 277.137 472.428 276.954 c
+472.605 276.777 472.692 276.549 472.692 276.277 c
+472.692 275.924 472.568 275.645 472.325 275.439 c
+472.09 275.233 471.774 275.131 471.385 275.131 c
+470.961 275.131 470.624 275.248 470.371 275.483 c
+470.113 275.726 469.988 276.031 469.988 276.395 c
+470.635 276.395 l
+470.642 276.167 470.712 275.99 470.841 275.865 c
+470.965 275.748 471.15 275.689 471.385 275.689 c
+471.597 275.689 471.759 275.737 471.869 275.836 c
+471.987 275.932 472.046 276.06 472.046 276.218 c
+477.293 275.204 m
+477.253 275.292 477.228 275.439 477.22 275.645 c
+476.985 275.3 476.69 275.131 476.338 275.131 c
+475.975 275.131 475.691 275.226 475.485 275.425 c
+475.287 275.63 475.192 275.917 475.192 276.291 c
+475.192 276.692 475.327 277.012 475.603 277.247 c
+475.875 277.49 476.25 277.615 476.721 277.615 c
+477.205 277.615 l
+477.205 278.041 l
+477.205 278.276 477.15 278.442 477.043 278.541 c
+476.933 278.647 476.771 278.703 476.559 278.703 c
+476.36 278.703 476.198 278.643 476.073 278.526 c
+475.956 278.408 475.897 278.261 475.897 278.085 c
+475.25 278.085 l
+475.25 278.28 475.309 278.471 475.427 278.658 c
+475.551 278.842 475.713 278.989 475.912 279.1 c
+476.118 279.206 476.345 279.261 476.603 279.261 c
+477.003 279.261 477.309 279.158 477.514 278.953 c
+477.727 278.747 477.841 278.452 477.852 278.07 c
+477.852 276.056 l
+477.852 275.751 477.889 275.487 477.97 275.263 c
+477.97 275.204 l
+h
+476.426 275.718 m
+476.592 275.718 476.742 275.763 476.881 275.851 c
+477.029 275.939 477.135 276.05 477.205 276.189 c
+477.205 277.13 l
+476.838 277.13 l
+476.522 277.13 476.279 277.06 476.103 276.924 c
+475.927 276.796 475.838 276.607 475.838 276.366 c
+475.838 276.137 475.882 275.972 475.971 275.865 c
+476.058 275.766 476.21 275.718 476.426 275.718 c
+480.498 278.57 m
+480.409 278.589 480.31 278.6 480.204 278.6 c
+479.869 278.6 479.634 278.416 479.499 278.055 c
+479.499 275.204 l
+478.851 275.204 l
+478.851 279.188 l
+479.484 279.188 l
+479.499 278.776 l
+479.674 279.1 479.917 279.261 480.233 279.261 c
+480.34 279.261 480.428 279.239 480.498 279.202 c
+h
+482.497 275.131 m
+481.997 275.131 481.615 275.277 481.35 275.572 c
+481.086 275.865 480.954 276.299 480.954 276.879 c
+480.954 277.35 l
+480.954 277.945 481.078 278.412 481.336 278.747 c
+481.6 279.088 481.96 279.261 482.423 279.261 c
+482.882 279.261 483.225 279.107 483.452 278.805 c
+483.688 278.512 483.809 278.049 483.819 277.424 c
+483.819 276.997 l
+481.6 276.997 l
+481.6 276.909 l
+481.6 276.476 481.677 276.163 481.835 275.969 c
+482.001 275.781 482.232 275.689 482.526 275.689 c
+482.721 275.689 482.894 275.722 483.04 275.792 c
+483.188 275.869 483.324 275.987 483.452 276.145 c
+483.79 275.734 l
+483.504 275.329 483.074 275.131 482.497 275.131 c
+482.423 278.703 m
+482.148 278.703 481.945 278.607 481.82 278.423 c
+481.692 278.236 481.619 277.945 481.6 277.556 c
+483.173 277.556 l
+483.173 277.644 l
+483.151 278.026 483.085 278.294 482.967 278.452 c
+482.849 278.618 482.666 278.703 482.423 278.703 c
+486.186 277.38 m
+486.186 277.986 486.296 278.452 486.524 278.776 c
+486.759 279.1 487.087 279.261 487.509 279.261 c
+487.892 279.261 488.189 279.103 488.405 278.791 c
+488.405 280.848 l
+489.053 280.848 l
+489.053 275.204 l
+488.465 275.204 l
+488.421 275.63 l
+488.215 275.296 487.91 275.131 487.509 275.131 c
+487.098 275.131 486.774 275.285 486.539 275.601 c
+486.304 275.924 486.186 276.38 486.186 276.968 c
+h
+486.833 276.997 m
+486.833 276.557 486.896 276.226 487.024 276.013 c
+487.16 275.807 487.381 275.703 487.686 275.703 c
+488.009 275.703 488.248 275.865 488.405 276.189 c
+488.405 278.203 l
+488.237 278.515 487.998 278.673 487.686 278.673 c
+487.381 278.673 487.16 278.57 487.024 278.365 c
+486.896 278.159 486.833 277.835 486.833 277.394 c
+h
+490.757 275.204 -0.646 3.984 re
+490.802 280.231 m
+490.802 280.121 490.772 280.029 490.714 279.952 c
+490.655 279.882 490.56 279.849 490.435 279.849 c
+490.317 279.849 490.221 279.882 490.155 279.952 c
+490.096 280.029 490.067 280.121 490.067 280.231 c
+490.067 280.349 490.096 280.441 490.155 280.511 c
+490.221 280.588 490.317 280.628 490.435 280.628 c
+490.56 280.628 490.655 280.588 490.714 280.511 c
+490.772 280.43 490.802 280.337 490.802 280.231 c
+493.712 276.218 m
+493.712 276.366 493.658 276.486 493.55 276.586 c
+493.44 276.681 493.234 276.798 492.933 276.939 c
+492.588 277.085 492.345 277.207 492.199 277.306 c
+492.051 277.413 491.941 277.53 491.875 277.659 c
+491.805 277.783 491.772 277.941 491.772 278.13 c
+491.772 278.452 491.89 278.72 492.125 278.938 c
+492.36 279.15 492.661 279.261 493.036 279.261 c
+493.419 279.261 493.727 279.147 493.962 278.923 c
+494.198 278.695 494.315 278.408 494.315 278.055 c
+493.668 278.055 l
+493.668 278.232 493.61 278.383 493.492 278.512 c
+493.374 278.637 493.22 278.703 493.036 278.703 c
+492.837 278.703 492.687 278.647 492.581 278.541 c
+492.47 278.442 492.419 278.309 492.419 278.144 c
+492.419 278.015 492.455 277.909 492.536 277.82 c
+492.613 277.739 492.804 277.637 493.109 277.512 c
+493.587 277.324 493.918 277.137 494.094 276.954 c
+494.271 276.777 494.359 276.549 494.359 276.277 c
+494.359 275.924 494.234 275.645 493.992 275.439 c
+493.756 275.233 493.44 275.131 493.051 275.131 c
+492.628 275.131 492.29 275.248 492.037 275.483 c
+491.779 275.726 491.655 276.031 491.655 276.395 c
+492.301 276.395 l
+492.309 276.167 492.378 275.99 492.507 275.865 c
+492.632 275.748 492.816 275.689 493.051 275.689 c
+493.264 275.689 493.425 275.737 493.536 275.836 c
+493.654 275.932 493.712 276.06 493.712 276.218 c
+496.579 275.689 m
+496.792 275.689 496.964 275.751 497.093 275.88 c
+497.229 276.016 497.302 276.208 497.313 276.453 c
+497.93 276.453 l
+497.909 276.071 497.772 275.751 497.519 275.498 c
+497.263 275.252 496.95 275.131 496.579 275.131 c
+496.087 275.131 495.711 275.281 495.447 275.586 c
+495.189 275.898 495.065 276.366 495.065 276.983 c
+495.065 277.424 l
+495.065 278.019 495.189 278.475 495.447 278.791 c
+495.711 279.103 496.087 279.261 496.579 279.261 c
+496.979 279.261 497.299 279.129 497.534 278.864 c
+497.776 278.607 497.909 278.261 497.93 277.82 c
+497.313 277.82 l
+497.292 278.115 497.218 278.335 497.093 278.482 c
+496.976 278.629 496.803 278.703 496.579 278.703 c
+496.284 278.703 496.068 278.603 495.931 278.408 c
+495.792 278.221 495.719 277.912 495.711 277.482 c
+495.711 276.968 l
+495.711 276.497 495.777 276.163 495.917 275.969 c
+496.064 275.781 496.284 275.689 496.579 275.689 c
+500.724 275.204 m
+500.683 275.292 500.658 275.439 500.65 275.645 c
+500.415 275.3 500.121 275.131 499.769 275.131 c
+499.405 275.131 499.121 275.226 498.915 275.425 c
+498.717 275.63 498.622 275.917 498.622 276.291 c
+498.622 276.692 498.757 277.012 499.033 277.247 c
+499.305 277.49 499.68 277.615 500.151 277.615 c
+500.635 277.615 l
+500.635 278.041 l
+500.635 278.276 500.581 278.442 500.474 278.541 c
+500.363 278.647 500.202 278.703 499.989 278.703 c
+499.79 278.703 499.628 278.643 499.503 278.526 c
+499.386 278.408 499.327 278.261 499.327 278.085 c
+498.68 278.085 l
+498.68 278.28 498.74 278.471 498.857 278.658 c
+498.982 278.842 499.144 278.989 499.342 279.1 c
+499.548 279.206 499.775 279.261 500.033 279.261 c
+500.434 279.261 500.739 279.158 500.945 278.953 c
+501.157 278.747 501.271 278.452 501.282 278.07 c
+501.282 276.056 l
+501.282 275.751 501.319 275.487 501.4 275.263 c
+501.4 275.204 l
+h
+499.856 275.718 m
+500.022 275.718 500.172 275.763 500.312 275.851 c
+500.459 275.939 500.565 276.05 500.635 276.189 c
+500.635 277.13 l
+500.268 277.13 l
+499.952 277.13 499.709 277.06 499.534 276.924 c
+499.357 276.796 499.268 276.607 499.268 276.366 c
+499.268 276.137 499.312 275.972 499.401 275.865 c
+499.489 275.766 499.64 275.718 499.856 275.718 c
+503.928 278.57 m
+503.84 278.589 503.74 278.6 503.634 278.6 c
+503.3 278.6 503.065 278.416 502.929 278.055 c
+502.929 275.204 l
+502.281 275.204 l
+502.281 279.188 l
+502.914 279.188 l
+502.929 278.776 l
+503.105 279.1 503.347 279.261 503.663 279.261 c
+503.771 279.261 503.858 279.239 503.928 279.202 c
+h
+504.369 277.38 m
+504.369 277.986 504.479 278.452 504.708 278.776 c
+504.943 279.1 505.269 279.261 505.692 279.261 c
+506.074 279.261 506.372 279.103 506.589 278.791 c
+506.589 280.848 l
+507.235 280.848 l
+507.235 275.204 l
+506.647 275.204 l
+506.603 275.63 l
+506.397 275.296 506.092 275.131 505.692 275.131 c
+505.28 275.131 504.957 275.285 504.722 275.601 c
+504.486 275.924 504.369 276.38 504.369 276.968 c
+h
+505.016 276.997 m
+505.016 276.557 505.078 276.226 505.207 276.013 c
+505.343 275.807 505.564 275.703 505.868 275.703 c
+506.192 275.703 506.431 275.865 506.589 276.189 c
+506.589 278.203 l
+506.42 278.515 506.181 278.673 505.868 278.673 c
+505.564 278.673 505.343 278.57 505.207 278.365 c
+505.078 278.159 505.016 277.835 505.016 277.394 c
+h
+509.661 275.131 m
+509.161 275.131 508.779 275.277 508.514 275.572 c
+508.249 275.865 508.118 276.299 508.118 276.879 c
+508.118 277.35 l
+508.118 277.945 508.242 278.412 508.5 278.747 c
+508.764 279.088 509.124 279.261 509.587 279.261 c
+510.046 279.261 510.389 279.107 510.616 278.805 c
+510.852 278.512 510.973 278.049 510.983 277.424 c
+510.983 276.997 l
+508.764 276.997 l
+508.764 276.909 l
+508.764 276.476 508.841 276.163 508.999 275.969 c
+509.165 275.781 509.396 275.689 509.69 275.689 c
+509.885 275.689 510.058 275.722 510.204 275.792 c
+510.352 275.869 510.487 275.987 510.616 276.145 c
+510.954 275.734 l
+510.668 275.329 510.237 275.131 509.661 275.131 c
+509.587 278.703 m
+509.312 278.703 509.109 278.607 508.984 278.423 c
+508.856 278.236 508.783 277.945 508.764 277.556 c
+510.337 277.556 l
+510.337 277.644 l
+510.315 278.026 510.249 278.294 510.131 278.452 c
+510.013 278.618 509.83 278.703 509.587 278.703 c
+511.63 277.38 m
+511.63 277.986 511.741 278.452 511.968 278.776 c
+512.203 279.1 512.531 279.261 512.953 279.261 c
+513.335 279.261 513.633 279.103 513.85 278.791 c
+513.85 280.848 l
+514.497 280.848 l
+514.497 275.204 l
+513.909 275.204 l
+513.865 275.63 l
+513.659 275.296 513.354 275.131 512.953 275.131 c
+512.542 275.131 512.218 275.285 511.983 275.601 c
+511.748 275.924 511.63 276.38 511.63 276.968 c
+h
+512.277 276.997 m
+512.277 276.557 512.34 276.226 512.469 276.013 c
+512.604 275.807 512.824 275.703 513.13 275.703 c
+513.453 275.703 513.692 275.865 513.85 276.189 c
+513.85 278.203 l
+513.681 278.515 513.442 278.673 513.13 278.673 c
+512.824 278.673 512.604 278.57 512.469 278.365 c
+512.34 278.159 512.277 277.835 512.277 277.394 c
+h
+515.54 275.557 m
+515.54 275.674 515.573 275.77 515.644 275.851 c
+515.71 275.928 515.812 275.969 515.952 275.969 c
+516.099 275.969 516.205 275.928 516.275 275.851 c
+516.352 275.77 516.392 275.674 516.392 275.557 c
+516.392 275.447 516.352 275.354 516.275 275.277 c
+516.205 275.2 516.099 275.16 515.952 275.16 c
+515.812 275.16 515.71 275.2 515.644 275.277 c
+515.573 275.354 515.54 275.447 515.54 275.557 c
+f
+0.113 0.082 0.09 0 k
+287.665 268.468 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 261.629 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.807 l
+-1.896 -1.807 l
+-1.896 -1.263 l
+-2.142 -1.256 -2.359 -1.219 -2.543 -1.161 c
+-2.719 -1.102 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.514 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.662 l
+-1.907 0.662 -1.926 0.666 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.132 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.132 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.484 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.882 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.368 l
+-1.514 1.368 l
+-1.506 1.368 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.743 -0.132 0.588 c
+-0.044 0.431 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.484 -2.19 2.455 c
+-2.26 2.426 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.191 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.838 -2.439 1.779 c
+-2.41 1.721 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.395 c
+5.284 -2.314 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.219 6.034 -1.219 c
+5.829 -1.219 5.644 -1.182 5.49 -1.102 c
+5.343 -1.014 5.215 -0.897 5.108 -0.749 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.019 4.888 1.235 c
+4.946 1.449 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.919 7.107 1.97 c
+7.115 2.029 7.122 2.077 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.882 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.414 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.16 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.743 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.368 c
+5.88 1.279 5.835 1.162 5.799 1.015 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.514 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.603 l
+9.199 1.603 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.603 m
+13.053 1.603 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.603 l
+14.494 1.603 l
+14.494 -0.103 l
+14.494 -0.323 l
+14.501 -0.392 14.523 -0.455 14.552 -0.514 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.675 14.905 -0.69 15.052 -0.69 c
+15.188 -0.69 15.324 -0.687 15.464 -0.675 c
+15.599 -0.658 15.732 -0.631 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.215 15.703 -1.23 15.626 -1.249 c
+15.545 -1.26 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.3 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.263 c
+14.218 -1.227 14.104 -1.182 14.009 -1.132 c
+13.92 -1.084 13.847 -1.024 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.631 13.604 -0.544 13.597 -0.455 c
+13.586 -0.359 13.582 -0.264 13.582 -0.176 c
+h
+24.133 1.47 m
+24.033 1.478 23.931 1.489 23.823 1.5 c
+23.713 1.518 23.592 1.529 23.456 1.529 c
+23.28 1.529 23.121 1.489 22.986 1.411 c
+22.846 1.341 22.728 1.243 22.633 1.118 c
+22.545 0.989 22.475 0.842 22.427 0.676 c
+22.387 0.508 22.369 0.331 22.369 0.148 c
+22.369 -1.263 l
+21.471 -1.263 l
+21.471 0.985 l
+21.471 1.11 21.461 1.235 21.442 1.353 c
+21.432 1.478 21.417 1.595 21.398 1.706 c
+21.388 1.823 21.373 1.919 21.355 1.999 c
+21.332 2.087 21.314 2.161 21.296 2.22 c
+22.177 2.22 l
+22.185 2.168 22.196 2.117 22.207 2.058 c
+22.225 1.999 22.24 1.933 22.251 1.867 c
+22.269 1.808 22.284 1.742 22.296 1.676 c
+22.302 1.607 22.313 1.544 22.325 1.485 c
+22.339 1.485 l
+22.375 1.603 22.427 1.709 22.486 1.808 c
+22.552 1.904 22.633 1.989 22.722 2.058 c
+22.809 2.124 22.913 2.18 23.03 2.22 c
+23.155 2.257 23.302 2.278 23.471 2.278 c
+23.596 2.278 23.713 2.272 23.823 2.264 c
+23.942 2.253 24.044 2.238 24.133 2.22 c
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.219 c
+25.841 -1.142 25.665 -1.028 25.518 -0.881 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.084 25.047 0.181 25.047 0.485 c
+25.047 0.817 25.091 1.096 25.18 1.324 c
+25.275 1.559 25.404 1.742 25.562 1.882 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.228 27.458 2.132 c
+27.664 2.043 27.829 1.912 27.958 1.735 c
+28.094 1.566 28.193 1.36 28.252 1.118 c
+28.318 0.882 28.355 0.618 28.355 0.324 c
+28.355 0.31 l
+25.988 0.31 l
+25.988 0.162 26.003 0.023 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.44 c
+26.26 -0.529 26.344 -0.598 26.444 -0.646 c
+26.539 -0.698 26.653 -0.72 26.782 -0.72 c
+26.936 -0.72 27.076 -0.687 27.194 -0.617 c
+27.318 -0.55 27.407 -0.448 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.481 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.918 27.825 -1.014 c
+27.708 -1.102 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.649 1.706 26.562 1.691 26.473 1.661 c
+26.385 1.632 26.304 1.58 26.238 1.515 c
+26.169 1.445 26.109 1.357 26.061 1.25 c
+26.021 1.139 26.003 1.015 26.003 0.867 c
+27.472 0.867 l
+27.472 1.004 27.447 1.125 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.566 27.106 1.617 27.017 1.646 c
+26.929 1.684 26.834 1.706 26.738 1.706 c
+31.269 -1.263 m
+30.196 -1.263 l
+28.887 2.22 l
+29.843 2.22 l
+30.504 0.221 l
+30.523 0.151 30.541 0.078 30.564 0 c
+30.593 -0.07 30.615 -0.139 30.637 -0.205 c
+30.655 -0.275 30.67 -0.345 30.681 -0.411 c
+30.699 -0.481 30.718 -0.54 30.74 -0.588 c
+30.747 -0.54 30.762 -0.481 30.784 -0.411 c
+30.802 -0.345 30.82 -0.275 30.842 -0.205 c
+30.861 -0.139 30.879 -0.07 30.901 0 c
+30.931 0.067 30.953 0.136 30.975 0.206 c
+31.68 2.22 l
+32.621 2.22 l
+h
+34.859 -1.323 m
+34.602 -1.323 34.374 -1.286 34.169 -1.219 c
+33.963 -1.142 33.786 -1.028 33.639 -0.881 c
+33.492 -0.727 33.375 -0.536 33.286 -0.309 c
+33.205 -0.084 33.169 0.181 33.169 0.485 c
+33.169 0.817 33.213 1.096 33.301 1.324 c
+33.396 1.559 33.525 1.742 33.683 1.882 c
+33.849 2.018 34.036 2.117 34.242 2.176 c
+34.447 2.242 34.657 2.278 34.874 2.278 c
+35.146 2.278 35.381 2.228 35.58 2.132 c
+35.785 2.043 35.95 1.912 36.079 1.735 c
+36.215 1.566 36.314 1.36 36.373 1.118 c
+36.44 0.882 36.476 0.618 36.476 0.324 c
+36.476 0.31 l
+34.109 0.31 l
+34.109 0.162 34.124 0.023 34.154 -0.103 c
+34.19 -0.231 34.246 -0.345 34.315 -0.44 c
+34.381 -0.529 34.466 -0.598 34.565 -0.646 c
+34.661 -0.698 34.774 -0.72 34.903 -0.72 c
+35.058 -0.72 35.197 -0.687 35.314 -0.617 c
+35.44 -0.55 35.528 -0.448 35.58 -0.309 c
+36.417 -0.382 l
+36.388 -0.481 36.332 -0.588 36.255 -0.706 c
+36.174 -0.816 36.072 -0.918 35.947 -1.014 c
+35.829 -1.102 35.675 -1.176 35.491 -1.234 c
+35.314 -1.294 35.102 -1.323 34.859 -1.323 c
+34.859 1.706 m
+34.771 1.706 34.682 1.691 34.595 1.661 c
+34.506 1.632 34.425 1.58 34.36 1.515 c
+34.29 1.445 34.231 1.357 34.183 1.25 c
+34.142 1.139 34.124 1.015 34.124 0.867 c
+35.594 0.867 l
+35.594 1.004 35.568 1.125 35.52 1.235 c
+35.48 1.341 35.425 1.43 35.359 1.5 c
+35.3 1.566 35.227 1.617 35.138 1.646 c
+35.05 1.684 34.955 1.706 34.859 1.706 c
+40.378 1.47 m
+40.28 1.478 40.176 1.489 40.07 1.5 c
+39.96 1.518 39.838 1.529 39.702 1.529 c
+39.526 1.529 39.368 1.489 39.232 1.411 c
+39.092 1.341 38.975 1.243 38.879 1.118 c
+38.791 0.989 38.721 0.842 38.674 0.676 c
+38.633 0.508 38.615 0.331 38.615 0.148 c
+38.615 -1.263 l
+37.718 -1.263 l
+37.718 0.985 l
+37.718 1.11 37.707 1.235 37.689 1.353 c
+37.678 1.478 37.663 1.595 37.645 1.706 c
+37.633 1.823 37.619 1.919 37.6 1.999 c
+37.579 2.087 37.56 2.161 37.542 2.22 c
+38.424 2.22 l
+38.431 2.168 38.442 2.117 38.453 2.058 c
+38.472 1.999 38.486 1.933 38.497 1.867 c
+38.516 1.808 38.53 1.742 38.541 1.676 c
+38.549 1.607 38.56 1.544 38.57 1.485 c
+38.585 1.485 l
+38.622 1.603 38.674 1.709 38.732 1.808 c
+38.798 1.904 38.879 1.989 38.967 2.058 c
+39.056 2.124 39.158 2.18 39.276 2.22 c
+39.401 2.257 39.548 2.278 39.717 2.278 c
+39.842 2.278 39.96 2.272 40.07 2.264 c
+40.187 2.253 40.29 2.238 40.378 2.22 c
+h
+42.028 1.603 m
+41.485 1.603 l
+41.485 2.22 l
+42.073 2.22 l
+42.352 3.117 l
+42.925 3.117 l
+42.925 2.22 l
+44.16 2.22 l
+44.16 1.603 l
+42.925 1.603 l
+42.925 -0.103 l
+42.925 -0.323 l
+42.933 -0.392 42.954 -0.455 42.984 -0.514 c
+43.021 -0.565 43.076 -0.61 43.146 -0.646 c
+43.223 -0.675 43.337 -0.69 43.484 -0.69 c
+43.619 -0.69 43.756 -0.687 43.895 -0.675 c
+44.031 -0.658 44.164 -0.631 44.292 -0.602 c
+44.292 -1.205 l
+44.211 -1.215 44.134 -1.23 44.057 -1.249 c
+43.976 -1.26 43.899 -1.267 43.822 -1.278 c
+43.741 -1.286 43.653 -1.294 43.557 -1.294 c
+43.469 -1.3 43.37 -1.308 43.264 -1.308 c
+43.076 -1.308 42.914 -1.294 42.778 -1.263 c
+42.649 -1.227 42.536 -1.182 42.441 -1.132 c
+42.352 -1.084 42.279 -1.024 42.219 -0.955 c
+42.161 -0.878 42.117 -0.801 42.088 -0.72 c
+42.058 -0.631 42.036 -0.544 42.028 -0.455 c
+42.017 -0.359 42.013 -0.264 42.013 -0.176 c
+h
+50.297 -2.63 m
+50.297 3.514 l
+52.222 3.514 l
+52.222 2.897 l
+51.149 2.897 l
+51.149 -2.013 l
+52.222 -2.013 l
+52.222 -2.63 l
+h
+55.166 -1.323 m
+54.879 -1.323 54.636 -1.282 54.431 -1.205 c
+54.225 -1.117 54.052 -0.995 53.917 -0.837 c
+53.776 -0.683 53.674 -0.496 53.608 -0.278 c
+53.538 -0.055 53.505 0.192 53.505 0.456 c
+53.505 0.75 53.538 1.008 53.608 1.235 c
+53.685 1.459 53.791 1.646 53.931 1.794 c
+54.078 1.948 54.254 2.066 54.46 2.147 c
+54.666 2.234 54.902 2.278 55.166 2.278 c
+55.39 2.278 55.592 2.249 55.769 2.191 c
+55.945 2.132 56.095 2.047 56.224 1.941 c
+56.349 1.842 56.452 1.721 56.533 1.573 c
+56.61 1.434 56.665 1.283 56.695 1.118 c
+55.783 1.073 l
+55.754 1.25 55.684 1.389 55.577 1.5 c
+55.478 1.607 55.335 1.661 55.151 1.661 c
+54.905 1.661 54.728 1.559 54.622 1.353 c
+54.512 1.154 54.46 0.867 54.46 0.485 c
+54.46 -0.309 54.696 -0.706 55.166 -0.706 c
+55.331 -0.706 55.474 -0.654 55.592 -0.544 c
+55.71 -0.436 55.783 -0.275 55.812 -0.058 c
+56.724 -0.103 l
+56.695 -0.272 56.639 -0.426 56.562 -0.573 c
+56.492 -0.72 56.39 -0.852 56.253 -0.97 c
+56.125 -1.08 55.966 -1.168 55.783 -1.234 c
+55.607 -1.294 55.401 -1.323 55.166 -1.323 c
+60.876 0.485 m
+60.876 0.21 60.84 -0.04 60.774 -0.264 c
+60.704 -0.481 60.601 -0.668 60.465 -0.823 c
+60.325 -0.98 60.149 -1.102 59.935 -1.19 c
+59.719 -1.278 59.465 -1.323 59.172 -1.323 c
+58.896 -1.323 58.649 -1.278 58.436 -1.19 c
+58.231 -1.102 58.058 -0.98 57.922 -0.823 c
+57.782 -0.668 57.68 -0.481 57.613 -0.264 c
+57.543 -0.04 57.51 0.21 57.51 0.485 c
+57.51 0.739 57.539 0.975 57.599 1.191 c
+57.665 1.415 57.768 1.607 57.907 1.764 c
+58.044 1.929 58.22 2.058 58.436 2.147 c
+58.649 2.234 58.906 2.278 59.201 2.278 c
+59.513 2.278 59.774 2.234 59.98 2.147 c
+60.193 2.058 60.365 1.929 60.494 1.764 c
+60.631 1.607 60.729 1.415 60.788 1.191 c
+60.847 0.975 60.876 0.739 60.876 0.485 c
+59.921 0.485 m
+59.921 0.691 59.906 0.867 59.877 1.015 c
+59.855 1.162 59.818 1.283 59.76 1.382 c
+59.7 1.478 59.627 1.548 59.538 1.588 c
+59.451 1.636 59.34 1.661 59.216 1.661 c
+58.951 1.661 58.76 1.563 58.642 1.368 c
+58.524 1.18 58.466 0.886 58.466 0.485 c
+58.466 0.063 58.524 -0.242 58.642 -0.426 c
+58.76 -0.613 58.936 -0.706 59.172 -0.706 c
+59.297 -0.706 59.411 -0.687 59.509 -0.646 c
+59.605 -0.598 59.686 -0.525 59.744 -0.426 c
+59.81 -0.33 59.855 -0.205 59.877 -0.058 c
+59.906 0.088 59.921 0.269 59.921 0.485 c
+62.894 -1.263 m
+62.894 0.853 l
+62.894 1.019 62.887 1.154 62.879 1.264 c
+62.868 1.372 62.85 1.455 62.821 1.515 c
+62.798 1.58 62.769 1.632 62.732 1.661 c
+62.703 1.691 62.663 1.706 62.615 1.706 c
+62.555 1.706 62.501 1.676 62.453 1.617 c
+62.412 1.566 62.379 1.492 62.35 1.397 c
+62.32 1.309 62.295 1.195 62.277 1.058 c
+62.266 0.919 62.262 0.769 62.262 0.603 c
+62.262 -1.263 l
+61.512 -1.263 l
+61.512 1.47 l
+61.512 1.706 l
+61.512 1.926 l
+61.512 2.003 61.505 2.066 61.497 2.117 c
+61.497 2.22 l
+62.173 2.22 l
+62.173 2.132 l
+62.173 1.985 l
+62.181 1.926 62.189 1.867 62.189 1.808 c
+62.189 1.646 l
+62.203 1.646 l
+62.221 1.735 62.251 1.812 62.291 1.882 c
+62.328 1.96 62.372 2.029 62.424 2.087 c
+62.482 2.147 62.549 2.191 62.629 2.22 c
+62.707 2.257 62.794 2.278 62.894 2.278 c
+63.078 2.278 63.218 2.224 63.305 2.117 c
+63.401 2.018 63.471 1.86 63.511 1.646 c
+63.526 1.646 l
+63.563 1.742 63.603 1.831 63.644 1.912 c
+63.691 1.989 63.746 2.051 63.805 2.103 c
+63.864 2.161 63.93 2.205 64.011 2.234 c
+64.088 2.264 64.176 2.278 64.275 2.278 c
+64.411 2.278 64.525 2.253 64.614 2.205 c
+64.702 2.154 64.768 2.08 64.82 1.985 c
+64.878 1.885 64.915 1.757 64.937 1.603 c
+64.967 1.455 64.981 1.272 64.981 1.058 c
+64.981 -1.263 l
+64.261 -1.263 l
+64.261 0.853 l
+64.261 1.019 64.253 1.154 64.246 1.264 c
+64.236 1.372 64.217 1.455 64.188 1.515 c
+64.165 1.58 64.136 1.632 64.099 1.661 c
+64.07 1.691 64.03 1.706 63.982 1.706 c
+63.864 1.706 63.768 1.617 63.702 1.441 c
+63.644 1.272 63.614 1.015 63.614 0.662 c
+63.614 -1.263 l
+h
+66.954 -1.263 m
+66.954 0.853 l
+66.954 1.019 66.947 1.154 66.94 1.264 c
+66.929 1.372 66.91 1.455 66.881 1.515 c
+66.859 1.58 66.829 1.632 66.793 1.661 c
+66.763 1.691 66.723 1.706 66.675 1.706 c
+66.617 1.706 66.561 1.676 66.513 1.617 c
+66.473 1.566 66.44 1.492 66.411 1.397 c
+66.381 1.309 66.355 1.195 66.337 1.058 c
+66.326 0.919 66.322 0.769 66.322 0.603 c
+66.322 -1.263 l
+65.572 -1.263 l
+65.572 1.47 l
+65.572 1.706 l
+65.572 1.926 l
+65.572 2.003 65.566 2.066 65.558 2.117 c
+65.558 2.22 l
+66.235 2.22 l
+66.235 2.132 l
+66.235 1.985 l
+66.241 1.926 66.249 1.867 66.249 1.808 c
+66.249 1.646 l
+66.264 1.646 l
+66.282 1.735 66.312 1.812 66.352 1.882 c
+66.389 1.96 66.432 2.029 66.484 2.087 c
+66.543 2.147 66.609 2.191 66.69 2.22 c
+66.767 2.257 66.856 2.278 66.954 2.278 c
+67.138 2.278 67.278 2.224 67.366 2.117 c
+67.461 2.018 67.531 1.86 67.571 1.646 c
+67.586 1.646 l
+67.623 1.742 67.664 1.831 67.704 1.912 c
+67.752 1.989 67.807 2.051 67.866 2.103 c
+67.924 2.161 67.991 2.205 68.072 2.234 c
+68.149 2.264 68.237 2.278 68.336 2.278 c
+68.472 2.278 68.586 2.253 68.674 2.205 c
+68.762 2.154 68.828 2.08 68.88 1.985 c
+68.939 1.885 68.976 1.757 68.998 1.603 c
+69.027 1.455 69.042 1.272 69.042 1.058 c
+69.042 -1.263 l
+68.321 -1.263 l
+68.321 0.853 l
+68.321 1.019 68.314 1.154 68.307 1.264 c
+68.296 1.372 68.277 1.455 68.248 1.515 c
+68.226 1.58 68.196 1.632 68.159 1.661 c
+68.13 1.691 68.09 1.706 68.042 1.706 c
+67.924 1.706 67.829 1.617 67.763 1.441 c
+67.704 1.272 67.675 1.015 67.675 0.662 c
+67.675 -1.263 l
+h
+71.956 -0.646 m
+73.088 -0.646 l
+73.088 -1.263 l
+69.78 -1.263 l
+69.78 -0.646 l
+71.045 -0.646 l
+71.045 1.603 l
+70.118 1.603 l
+70.118 2.22 l
+71.956 2.22 l
+h
+71.045 3.514 0.912 -0.676 re
+71.045 2.837 m
+74.517 1.603 m
+73.973 1.603 l
+73.973 2.22 l
+74.561 2.22 l
+74.841 3.117 l
+75.413 3.117 l
+75.413 2.22 l
+76.649 2.22 l
+76.649 1.603 l
+75.413 1.603 l
+75.413 -0.103 l
+75.413 -0.323 l
+75.421 -0.392 75.444 -0.455 75.473 -0.514 c
+75.509 -0.565 75.564 -0.61 75.634 -0.646 c
+75.712 -0.675 75.825 -0.69 75.972 -0.69 c
+76.109 -0.69 76.244 -0.687 76.384 -0.675 c
+76.52 -0.658 76.652 -0.631 76.78 -0.602 c
+76.78 -1.205 l
+76.7 -1.215 76.623 -1.23 76.545 -1.249 c
+76.465 -1.26 76.388 -1.267 76.31 -1.278 c
+76.23 -1.286 76.142 -1.294 76.046 -1.294 c
+75.957 -1.3 75.858 -1.308 75.752 -1.308 c
+75.564 -1.308 75.403 -1.294 75.267 -1.263 c
+75.138 -1.227 75.024 -1.182 74.929 -1.132 c
+74.841 -1.084 74.767 -1.024 74.708 -0.955 c
+74.65 -0.878 74.605 -0.801 74.576 -0.72 c
+74.546 -0.631 74.524 -0.544 74.517 -0.455 c
+74.507 -0.359 74.503 -0.264 74.503 -0.176 c
+h
+85.141 -0.249 m
+85.141 -0.419 85.1 -0.569 85.023 -0.706 c
+84.953 -0.833 84.851 -0.947 84.715 -1.043 c
+84.586 -1.132 84.424 -1.201 84.229 -1.249 c
+84.042 -1.296 83.826 -1.323 83.583 -1.323 c
+83.355 -1.323 83.157 -1.308 82.98 -1.278 c
+82.804 -1.249 82.646 -1.201 82.509 -1.132 c
+82.37 -1.055 82.26 -0.955 82.172 -0.837 c
+82.083 -0.72 82.014 -0.573 81.966 -0.396 c
+82.775 -0.278 l
+82.793 -0.378 82.822 -0.455 82.862 -0.514 c
+82.91 -0.573 82.969 -0.617 83.039 -0.646 c
+83.105 -0.675 83.186 -0.702 83.274 -0.72 c
+83.363 -0.731 83.465 -0.735 83.583 -0.735 c
+83.679 -0.735 83.774 -0.731 83.862 -0.72 c
+83.951 -0.702 84.028 -0.675 84.097 -0.646 c
+84.163 -0.617 84.215 -0.58 84.244 -0.529 c
+84.281 -0.481 84.303 -0.419 84.303 -0.338 c
+84.303 -0.242 84.273 -0.168 84.215 -0.118 c
+84.163 -0.07 84.097 -0.029 84.009 0 c
+83.921 0.038 83.81 0.067 83.685 0.088 c
+83.568 0.118 83.436 0.148 83.288 0.177 c
+83.149 0.214 83.01 0.254 82.862 0.294 c
+82.723 0.342 82.598 0.405 82.48 0.485 c
+82.37 0.563 82.282 0.662 82.216 0.78 c
+82.146 0.897 82.112 1.048 82.112 1.235 c
+82.112 1.389 82.143 1.532 82.201 1.661 c
+82.268 1.798 82.363 1.912 82.48 1.999 c
+82.605 2.087 82.763 2.154 82.951 2.205 c
+83.134 2.253 83.348 2.278 83.583 2.278 c
+83.766 2.278 83.943 2.257 84.112 2.22 c
+84.277 2.191 84.424 2.135 84.553 2.058 c
+84.678 1.989 84.788 1.889 84.876 1.764 c
+84.965 1.646 85.023 1.503 85.052 1.338 c
+84.259 1.264 l
+84.237 1.341 84.207 1.405 84.171 1.455 c
+84.13 1.515 84.082 1.559 84.024 1.588 c
+83.972 1.625 83.91 1.65 83.833 1.661 c
+83.752 1.669 83.671 1.676 83.583 1.676 c
+83.366 1.676 83.205 1.646 83.097 1.588 c
+82.987 1.536 82.936 1.449 82.936 1.324 c
+82.936 1.243 82.954 1.18 82.995 1.133 c
+83.043 1.081 83.105 1.044 83.186 1.015 c
+83.274 0.985 83.369 0.956 83.48 0.927 c
+83.587 0.904 83.708 0.882 83.847 0.853 c
+84.001 0.823 84.159 0.784 84.318 0.736 c
+84.472 0.684 84.612 0.622 84.73 0.545 c
+84.847 0.464 84.942 0.36 85.023 0.235 c
+85.1 0.107 85.141 -0.055 85.141 -0.249 c
+86.997 1.515 m
+87.114 1.786 87.265 1.985 87.452 2.103 c
+87.636 2.22 87.857 2.278 88.113 2.278 c
+88.319 2.278 88.489 2.242 88.628 2.176 c
+88.775 2.106 88.886 2.014 88.967 1.897 c
+89.054 1.779 89.113 1.636 89.143 1.47 c
+89.179 1.301 89.202 1.125 89.202 0.941 c
+89.202 -1.263 l
+88.29 -1.263 l
+88.29 0.736 l
+88.29 0.871 88.279 0.992 88.261 1.103 c
+88.25 1.21 88.224 1.297 88.187 1.368 c
+88.147 1.445 88.088 1.503 88.011 1.544 c
+87.941 1.58 87.849 1.603 87.731 1.603 c
+87.621 1.603 87.525 1.577 87.438 1.529 c
+87.35 1.478 87.269 1.411 87.203 1.324 c
+87.144 1.235 87.092 1.125 87.055 1 c
+87.026 0.882 87.011 0.75 87.011 0.603 c
+87.011 -1.263 l
+86.1 -1.263 l
+86.1 3.514 l
+87.011 3.514 l
+87.011 2.205 l
+87.011 2.135 87.004 2.066 86.997 1.999 c
+86.997 1.794 l
+86.997 1.735 86.989 1.68 86.982 1.632 c
+86.982 1.515 l
+h
+91.116 -1.323 m
+90.947 -1.323 90.796 -1.3 90.66 -1.263 c
+90.532 -1.215 90.418 -1.146 90.322 -1.058 c
+90.234 -0.97 90.164 -0.863 90.116 -0.735 c
+90.065 -0.598 90.043 -0.448 90.043 -0.278 c
+90.043 -0.073 90.076 0.096 90.145 0.235 c
+90.212 0.383 90.307 0.493 90.425 0.574 c
+90.55 0.662 90.694 0.724 90.851 0.765 c
+91.017 0.802 91.193 0.827 91.381 0.838 c
+92.101 0.853 l
+92.101 1.029 l
+92.101 1.147 92.09 1.25 92.071 1.338 c
+92.049 1.426 92.017 1.492 91.969 1.544 c
+91.928 1.603 91.88 1.64 91.822 1.661 c
+91.763 1.68 91.697 1.691 91.631 1.691 c
+91.56 1.691 91.498 1.68 91.44 1.661 c
+91.388 1.65 91.34 1.625 91.292 1.588 c
+91.252 1.559 91.219 1.507 91.19 1.441 c
+91.167 1.382 91.153 1.301 91.145 1.206 c
+90.205 1.25 l
+90.234 1.397 90.278 1.532 90.337 1.661 c
+90.403 1.786 90.499 1.897 90.616 1.985 c
+90.734 2.08 90.874 2.154 91.043 2.205 c
+91.219 2.253 91.425 2.278 91.66 2.278 c
+92.101 2.278 92.431 2.168 92.659 1.956 c
+92.894 1.75 93.012 1.441 93.012 1.029 c
+93.012 -0.235 l
+93.012 -0.455 l
+93.019 -0.514 93.034 -0.569 93.056 -0.617 c
+93.075 -0.658 93.104 -0.69 93.145 -0.72 c
+93.181 -0.742 93.233 -0.749 93.291 -0.749 c
+93.358 -0.749 93.428 -0.745 93.497 -0.735 c
+93.497 -1.219 l
+93.438 -1.23 93.383 -1.242 93.335 -1.249 c
+93.295 -1.26 93.255 -1.267 93.218 -1.278 c
+93.177 -1.286 93.133 -1.294 93.086 -1.294 c
+93.034 -1.3 92.975 -1.308 92.909 -1.308 c
+92.682 -1.308 92.516 -1.256 92.41 -1.146 c
+92.3 -1.028 92.237 -0.863 92.219 -0.646 c
+92.204 -0.646 l
+92.134 -0.756 92.065 -0.852 91.998 -0.941 c
+91.928 -1.021 91.851 -1.087 91.763 -1.146 c
+91.675 -1.205 91.575 -1.249 91.469 -1.278 c
+91.369 -1.308 91.252 -1.323 91.116 -1.323 c
+92.101 0.353 m
+91.675 0.339 l
+91.575 0.339 91.483 0.331 91.396 0.324 c
+91.315 0.313 91.248 0.287 91.19 0.25 c
+91.13 0.21 91.08 0.151 91.043 0.074 c
+91.002 0.004 90.984 -0.087 90.984 -0.205 c
+90.984 -0.374 91.017 -0.496 91.086 -0.573 c
+91.153 -0.654 91.252 -0.69 91.381 -0.69 c
+91.487 -0.69 91.587 -0.668 91.675 -0.617 c
+91.77 -0.569 91.851 -0.507 91.91 -0.426 c
+91.976 -0.349 92.027 -0.261 92.057 -0.161 c
+92.086 -0.055 92.101 0.059 92.101 0.177 c
+h
+94.589 -2.63 m
+94.589 -2.013 l
+95.662 -2.013 l
+95.662 2.897 l
+94.589 2.897 l
+94.589 3.514 l
+96.514 3.514 l
+96.514 -2.63 l
+h
+f
+Q
+q 1 0 0 1 314.6631 247.1802 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.485 -1.323 c
+-0.779 -1.627 -1.198 -1.779 -1.735 -1.779 c
+-2.263 -1.779 -2.69 -1.58 -3.013 -1.176 c
+-3.329 -0.764 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.47 l
+-3.484 2.165 -3.322 2.712 -2.999 3.117 c
+-2.675 3.516 -2.23 3.719 -1.661 3.719 c
+-1.154 3.719 -0.757 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.69 1.926 l
+-0.721 2.367 -0.816 2.679 -0.97 2.866 c
+-1.118 3.05 -1.349 3.146 -1.661 3.146 c
+-2.036 3.146 -2.319 2.999 -2.514 2.705 c
+-2.712 2.418 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.07 -2.716 -0.485 -2.529 -0.779 c
+-2.344 -1.066 -2.08 -1.205 -1.735 -1.205 c
+-1.382 -1.205 -1.128 -1.117 -0.97 -0.941 c
+-0.816 -0.764 -0.721 -0.452 -0.69 0 c
+h
+2.454 1.661 m
+2.367 1.679 2.267 1.691 2.161 1.691 c
+1.826 1.691 1.591 1.507 1.455 1.147 c
+1.455 -1.705 l
+0.808 -1.705 l
+0.808 2.278 l
+1.44 2.278 l
+1.455 1.866 l
+1.631 2.19 1.874 2.352 2.19 2.352 c
+2.296 2.352 2.385 2.33 2.454 2.294 c
+h
+4.453 -1.779 m
+3.954 -1.779 3.572 -1.631 3.308 -1.338 c
+3.042 -1.043 2.911 -0.61 2.911 -0.029 c
+2.911 0.441 l
+2.911 1.037 3.036 1.503 3.293 1.837 c
+3.557 2.18 3.917 2.352 4.38 2.352 c
+4.839 2.352 5.182 2.198 5.409 1.897 c
+5.644 1.602 5.766 1.139 5.777 0.515 c
+5.777 0.088 l
+3.557 0.088 l
+3.557 0 l
+3.557 -0.434 3.634 -0.746 3.792 -0.941 c
+3.958 -1.128 4.189 -1.22 4.484 -1.22 c
+4.678 -1.22 4.85 -1.187 4.997 -1.117 c
+5.145 -1.04 5.28 -0.922 5.409 -0.764 c
+5.747 -1.176 l
+5.461 -1.58 5.031 -1.779 4.453 -1.779 c
+4.38 1.793 m
+4.104 1.793 3.902 1.698 3.778 1.514 c
+3.649 1.326 3.576 1.037 3.557 0.647 c
+5.13 0.647 l
+5.13 0.735 l
+5.108 1.118 5.041 1.386 4.924 1.544 c
+4.806 1.709 4.623 1.793 4.38 1.793 c
+8.599 -1.705 m
+8.559 -1.617 8.533 -1.469 8.525 -1.264 c
+8.29 -1.61 7.996 -1.779 7.644 -1.779 c
+7.279 -1.779 6.996 -1.683 6.791 -1.484 c
+6.593 -1.278 6.497 -0.992 6.497 -0.617 c
+6.497 -0.216 6.633 0.103 6.909 0.338 c
+7.181 0.58 7.555 0.706 8.025 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.455 1.532 8.349 1.631 c
+8.239 1.738 8.077 1.793 7.864 1.793 c
+7.665 1.793 7.504 1.735 7.379 1.617 c
+7.262 1.5 7.202 1.353 7.202 1.176 c
+6.556 1.176 l
+6.556 1.371 6.614 1.562 6.732 1.749 c
+6.857 1.933 7.019 2.08 7.217 2.19 c
+7.423 2.297 7.651 2.352 7.908 2.352 c
+8.309 2.352 8.613 2.249 8.819 2.043 c
+9.033 1.837 9.147 1.544 9.157 1.161 c
+9.157 -0.852 l
+9.157 -1.157 9.194 -1.422 9.275 -1.646 c
+9.275 -1.705 l
+h
+7.732 -1.191 m
+7.897 -1.191 8.048 -1.147 8.187 -1.058 c
+8.334 -0.97 8.441 -0.86 8.511 -0.721 c
+8.511 0.22 l
+8.143 0.22 l
+7.827 0.22 7.584 0.151 7.408 0.015 c
+7.231 -0.114 7.144 -0.301 7.144 -0.544 c
+7.144 -0.771 7.188 -0.937 7.276 -1.043 c
+7.364 -1.143 7.515 -1.191 7.732 -1.191 c
+11.009 3.234 m
+11.009 2.278 l
+11.612 2.278 l
+11.612 1.749 l
+11.009 1.749 l
+11.009 -0.721 l
+11.009 -0.878 11.032 -0.995 11.083 -1.073 c
+11.142 -1.153 11.23 -1.191 11.347 -1.191 c
+11.436 -1.191 11.524 -1.176 11.612 -1.147 c
+11.612 -1.705 l
+11.465 -1.753 11.311 -1.779 11.156 -1.779 c
+10.899 -1.779 10.705 -1.687 10.568 -1.5 c
+10.429 -1.315 10.363 -1.055 10.363 -0.721 c
+10.363 1.749 l
+9.76 1.749 l
+9.76 2.278 l
+10.363 2.278 l
+10.363 3.234 l
+h
+13.803 -1.779 m
+13.303 -1.779 12.92 -1.631 12.656 -1.338 c
+12.391 -1.043 12.259 -0.61 12.259 -0.029 c
+12.259 0.441 l
+12.259 1.037 12.384 1.503 12.641 1.837 c
+12.906 2.18 13.266 2.352 13.729 2.352 c
+14.188 2.352 14.53 2.198 14.757 1.897 c
+14.993 1.602 15.114 1.139 15.125 0.515 c
+15.125 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.306 -1.128 13.538 -1.22 13.832 -1.22 c
+14.026 -1.22 14.2 -1.187 14.346 -1.117 c
+14.493 -1.04 14.629 -0.922 14.757 -0.764 c
+15.096 -1.176 l
+14.809 -1.58 14.379 -1.779 13.803 -1.779 c
+13.729 1.793 m
+13.454 1.793 13.251 1.698 13.126 1.514 c
+12.997 1.326 12.924 1.037 12.906 0.647 c
+14.479 0.647 l
+14.479 0.735 l
+14.456 1.118 14.391 1.386 14.273 1.544 c
+14.155 1.709 13.972 1.793 13.729 1.793 c
+19.667 -1.705 m
+19.627 -1.617 19.601 -1.469 19.594 -1.264 c
+19.359 -1.61 19.065 -1.779 18.712 -1.779 c
+18.348 -1.779 18.065 -1.683 17.859 -1.484 c
+17.661 -1.278 17.565 -0.992 17.565 -0.617 c
+17.565 -0.216 17.701 0.103 17.977 0.338 c
+18.248 0.58 18.624 0.706 19.094 0.706 c
+19.579 0.706 l
+19.579 1.132 l
+19.579 1.367 19.524 1.532 19.418 1.631 c
+19.307 1.738 19.146 1.793 18.932 1.793 c
+18.734 1.793 18.572 1.735 18.447 1.617 c
+18.329 1.5 18.271 1.353 18.271 1.176 c
+17.624 1.176 l
+17.624 1.371 17.683 1.562 17.801 1.749 c
+17.926 1.933 18.088 2.08 18.285 2.19 c
+18.491 2.297 18.719 2.352 18.977 2.352 c
+19.377 2.352 19.682 2.249 19.888 2.043 c
+20.101 1.837 20.215 1.544 20.226 1.161 c
+20.226 -0.852 l
+20.226 -1.157 20.263 -1.422 20.344 -1.646 c
+20.344 -1.705 l
+h
+18.8 -1.191 m
+18.965 -1.191 19.116 -1.147 19.256 -1.058 c
+19.403 -0.97 19.509 -0.86 19.579 -0.721 c
+19.579 0.22 l
+19.212 0.22 l
+18.896 0.22 18.653 0.151 18.477 0.015 c
+18.3 -0.114 18.212 -0.301 18.212 -0.544 c
+18.212 -0.771 18.256 -0.937 18.344 -1.043 c
+18.433 -1.143 18.583 -1.191 18.8 -1.191 c
+23.563 2.278 m
+23.577 1.837 l
+23.831 2.18 24.154 2.352 24.548 2.352 c
+25.253 2.352 25.61 1.881 25.62 0.941 c
+25.62 -1.705 l
+24.974 -1.705 l
+24.974 0.912 l
+24.974 1.224 24.918 1.444 24.812 1.573 c
+24.702 1.698 24.548 1.764 24.342 1.764 c
+24.184 1.764 24.037 1.709 23.9 1.602 c
+23.772 1.492 23.669 1.357 23.592 1.191 c
+23.592 -1.705 l
+22.946 -1.705 l
+22.946 2.278 l
+h
+28.016 -1.779 m
+27.517 -1.779 27.135 -1.631 26.869 -1.338 c
+26.605 -1.043 26.473 -0.61 26.473 -0.029 c
+26.473 0.441 l
+26.473 1.037 26.598 1.503 26.855 1.837 c
+27.12 2.18 27.48 2.352 27.943 2.352 c
+28.402 2.352 28.744 2.198 28.972 1.897 c
+29.207 1.602 29.328 1.139 29.339 0.515 c
+29.339 0.088 l
+27.12 0.088 l
+27.12 0 l
+27.12 -0.434 27.197 -0.746 27.355 -0.941 c
+27.52 -1.128 27.752 -1.22 28.045 -1.22 c
+28.241 -1.22 28.413 -1.187 28.56 -1.117 c
+28.708 -1.04 28.843 -0.922 28.972 -0.764 c
+29.31 -1.176 l
+29.024 -1.58 28.593 -1.779 28.016 -1.779 c
+27.943 1.793 m
+27.667 1.793 27.465 1.698 27.34 1.514 c
+27.212 1.326 27.138 1.037 27.12 0.647 c
+28.693 0.647 l
+28.693 0.735 l
+28.671 1.118 28.604 1.386 28.487 1.544 c
+28.369 1.709 28.185 1.793 27.943 1.793 c
+33.088 -0.559 m
+33.69 2.278 l
+34.337 2.278 l
+33.352 -1.705 l
+32.837 -1.705 l
+32.059 1.147 l
+31.309 -1.705 l
+30.78 -1.705 l
+29.824 2.278 l
+30.456 2.278 l
+31.074 -0.485 l
+31.808 2.278 l
+32.323 2.278 l
+h
+38.115 -1.22 m
+38.328 -1.22 38.501 -1.157 38.629 -1.029 c
+38.765 -0.893 38.838 -0.702 38.85 -0.455 c
+39.467 -0.455 l
+39.445 -0.838 39.309 -1.157 39.056 -1.411 c
+38.798 -1.658 38.486 -1.779 38.115 -1.779 c
+37.622 -1.779 37.248 -1.627 36.982 -1.323 c
+36.726 -1.01 36.6 -0.544 36.6 0.073 c
+36.6 0.515 l
+36.6 1.11 36.726 1.565 36.982 1.881 c
+37.248 2.194 37.622 2.352 38.115 2.352 c
+38.515 2.352 38.835 2.219 39.07 1.955 c
+39.313 1.698 39.445 1.353 39.467 0.912 c
+38.85 0.912 l
+38.827 1.205 38.754 1.426 38.629 1.573 c
+38.511 1.72 38.339 1.793 38.115 1.793 c
+37.821 1.793 37.604 1.694 37.468 1.5 c
+37.329 1.312 37.255 1.004 37.248 0.573 c
+37.248 0.059 l
+37.248 -0.411 37.314 -0.746 37.453 -0.941 c
+37.6 -1.128 37.821 -1.22 38.115 -1.22 c
+40.084 0.47 m
+40.084 1.047 40.22 1.503 40.496 1.837 c
+40.779 2.18 41.15 2.352 41.613 2.352 c
+42.073 2.352 42.44 2.183 42.715 1.852 c
+42.998 1.529 43.145 1.081 43.156 0.515 c
+43.156 0.088 l
+43.156 -0.482 43.013 -0.937 42.73 -1.278 c
+42.455 -1.613 42.087 -1.779 41.628 -1.779 c
+41.165 -1.779 40.793 -1.617 40.51 -1.294 c
+40.235 -0.962 40.091 -0.522 40.084 0.029 c
+h
+40.731 0.088 m
+40.731 -0.316 40.808 -0.632 40.966 -0.867 c
+41.132 -1.103 41.352 -1.22 41.628 -1.22 c
+42.194 -1.22 42.488 -0.808 42.509 0.015 c
+42.509 0.47 l
+42.509 0.871 42.425 1.191 42.26 1.426 c
+42.102 1.669 41.885 1.793 41.613 1.793 c
+41.348 1.793 41.132 1.669 40.966 1.426 c
+40.808 1.191 40.731 0.871 40.731 0.47 c
+h
+44.612 2.278 m
+44.626 1.911 l
+44.869 2.205 45.188 2.352 45.582 2.352 c
+46.023 2.352 46.331 2.153 46.507 1.764 c
+46.761 2.153 47.11 2.352 47.552 2.352 c
+48.286 2.352 48.662 1.889 48.683 0.97 c
+48.683 -1.705 l
+48.036 -1.705 l
+48.036 0.912 l
+48.036 1.205 47.981 1.419 47.875 1.558 c
+47.775 1.694 47.603 1.764 47.361 1.764 c
+47.162 1.764 47 1.683 46.875 1.529 c
+46.758 1.382 46.688 1.191 46.669 0.956 c
+46.669 -1.705 l
+46.008 -1.705 l
+46.008 0.941 l
+46.008 1.488 45.788 1.764 45.346 1.764 c
+45.012 1.764 44.777 1.602 44.641 1.278 c
+44.641 -1.705 l
+43.995 -1.705 l
+43.995 2.278 l
+h
+50.27 2.278 m
+50.285 1.911 l
+50.528 2.205 50.848 2.352 51.241 2.352 c
+51.681 2.352 51.991 2.153 52.167 1.764 c
+52.421 2.153 52.77 2.352 53.21 2.352 c
+53.946 2.352 54.32 1.889 54.343 0.97 c
+54.343 -1.705 l
+53.696 -1.705 l
+53.696 0.912 l
+53.696 1.205 53.641 1.419 53.534 1.558 c
+53.435 1.694 53.262 1.764 53.019 1.764 c
+52.821 1.764 52.66 1.683 52.535 1.529 c
+52.417 1.382 52.347 1.191 52.329 0.956 c
+52.329 -1.705 l
+51.667 -1.705 l
+51.667 0.941 l
+51.667 1.488 51.446 1.764 51.006 1.764 c
+50.671 1.764 50.436 1.602 50.3 1.278 c
+50.3 -1.705 l
+49.653 -1.705 l
+49.653 2.278 l
+h
+56.018 -1.705 -0.647 3.983 re
+56.062 3.322 m
+56.062 3.212 56.032 3.12 55.974 3.042 c
+55.915 2.973 55.82 2.94 55.695 2.94 c
+55.577 2.94 55.482 2.973 55.415 3.042 c
+55.357 3.12 55.327 3.212 55.327 3.322 c
+55.327 3.439 55.357 3.532 55.415 3.601 c
+55.482 3.678 55.577 3.719 55.695 3.719 c
+55.82 3.719 55.915 3.678 55.974 3.601 c
+56.032 3.52 56.062 3.429 56.062 3.322 c
+57.885 3.234 m
+57.885 2.278 l
+58.488 2.278 l
+58.488 1.749 l
+57.885 1.749 l
+57.885 -0.721 l
+57.885 -0.878 57.907 -0.995 57.958 -1.073 c
+58.017 -1.153 58.106 -1.191 58.223 -1.191 c
+58.311 -1.191 58.399 -1.176 58.488 -1.147 c
+58.488 -1.705 l
+58.341 -1.753 58.187 -1.779 58.031 -1.779 c
+57.775 -1.779 57.58 -1.687 57.443 -1.5 c
+57.304 -1.315 57.238 -1.055 57.238 -0.721 c
+57.238 1.749 l
+56.635 1.749 l
+56.635 2.278 l
+57.238 2.278 l
+57.238 3.234 l
+h
+59.267 -2.778 m
+58.87 -2.514 l
+59.105 -2.19 59.226 -1.856 59.237 -1.514 c
+59.237 -0.897 l
+59.899 -0.897 l
+59.899 -1.426 l
+59.899 -1.683 59.833 -1.929 59.708 -2.175 c
+59.59 -2.418 59.443 -2.62 59.267 -2.778 c
+64.103 1.661 m
+64.014 1.679 63.915 1.691 63.808 1.691 c
+63.475 1.691 63.239 1.507 63.103 1.147 c
+63.103 -1.705 l
+62.457 -1.705 l
+62.457 2.278 l
+63.088 2.278 l
+63.103 1.866 l
+63.28 2.19 63.522 2.352 63.838 2.352 c
+63.945 2.352 64.032 2.33 64.103 2.294 c
+h
+66.102 -1.779 m
+65.602 -1.779 65.22 -1.631 64.955 -1.338 c
+64.691 -1.043 64.558 -0.61 64.558 -0.029 c
+64.558 0.441 l
+64.558 1.037 64.683 1.503 64.94 1.837 c
+65.205 2.18 65.565 2.352 66.028 2.352 c
+66.488 2.352 66.829 2.198 67.057 1.897 c
+67.292 1.602 67.413 1.139 67.425 0.515 c
+67.425 0.088 l
+65.205 0.088 l
+65.205 0 l
+65.205 -0.434 65.282 -0.746 65.44 -0.941 c
+65.605 -1.128 65.837 -1.22 66.131 -1.22 c
+66.326 -1.22 66.498 -1.187 66.646 -1.117 c
+66.793 -1.04 66.928 -0.922 67.057 -0.764 c
+67.396 -1.176 l
+67.109 -1.58 66.679 -1.779 66.102 -1.779 c
+66.028 1.793 m
+65.752 1.793 65.551 1.698 65.426 1.514 c
+65.297 1.326 65.223 1.037 65.205 0.647 c
+66.777 0.647 l
+66.777 0.735 l
+66.756 1.118 66.69 1.386 66.572 1.544 c
+66.455 1.709 66.27 1.793 66.028 1.793 c
+69.291 -0.721 m
+70.041 2.278 l
+70.702 2.278 l
+69.526 -1.705 l
+69.042 -1.705 l
+67.851 2.278 l
+68.512 2.278 l
+h
+72.761 -1.779 m
+72.26 -1.779 71.878 -1.631 71.614 -1.338 c
+71.349 -1.043 71.217 -0.61 71.217 -0.029 c
+71.217 0.441 l
+71.217 1.037 71.342 1.503 71.599 1.837 c
+71.864 2.18 72.223 2.352 72.687 2.352 c
+73.146 2.352 73.488 2.198 73.715 1.897 c
+73.951 1.602 74.072 1.139 74.083 0.515 c
+74.083 0.088 l
+71.864 0.088 l
+71.864 0 l
+71.864 -0.434 71.941 -0.746 72.099 -0.941 c
+72.264 -1.128 72.495 -1.22 72.79 -1.22 c
+72.984 -1.22 73.158 -1.187 73.304 -1.117 c
+73.451 -1.04 73.587 -0.922 73.715 -0.764 c
+74.054 -1.176 l
+73.767 -1.58 73.337 -1.779 72.761 -1.779 c
+72.687 1.793 m
+72.412 1.793 72.209 1.698 72.084 1.514 c
+71.955 1.326 71.882 1.037 71.864 0.647 c
+73.436 0.647 l
+73.436 0.735 l
+73.414 1.118 73.349 1.386 73.231 1.544 c
+73.113 1.709 72.929 1.793 72.687 1.793 c
+76.508 1.661 m
+76.42 1.679 76.321 1.691 76.215 1.691 c
+75.88 1.691 75.645 1.507 75.509 1.147 c
+75.509 -1.705 l
+74.862 -1.705 l
+74.862 2.278 l
+75.494 2.278 l
+75.509 1.866 l
+75.685 2.19 75.928 2.352 76.244 2.352 c
+76.35 2.352 76.439 2.33 76.508 2.294 c
+h
+78.199 3.234 m
+78.199 2.278 l
+78.802 2.278 l
+78.802 1.749 l
+78.199 1.749 l
+78.199 -0.721 l
+78.199 -0.878 78.221 -0.995 78.272 -1.073 c
+78.332 -1.153 78.419 -1.191 78.537 -1.191 c
+78.625 -1.191 78.714 -1.176 78.802 -1.147 c
+78.802 -1.705 l
+78.654 -1.753 78.5 -1.779 78.346 -1.779 c
+78.089 -1.779 77.894 -1.687 77.758 -1.5 c
+77.619 -1.315 77.552 -1.055 77.552 -0.721 c
+77.552 1.749 l
+76.95 1.749 l
+76.95 2.278 l
+77.552 2.278 l
+77.552 3.234 l
+h
+80.271 -1.705 -0.646 3.983 re
+80.316 3.322 m
+80.316 3.212 80.286 3.12 80.227 3.042 c
+80.169 2.973 80.073 2.94 79.948 2.94 c
+79.83 2.94 79.735 2.973 79.668 3.042 c
+79.61 3.12 79.581 3.212 79.581 3.322 c
+79.581 3.439 79.61 3.532 79.668 3.601 c
+79.735 3.678 79.83 3.719 79.948 3.719 c
+80.073 3.719 80.169 3.678 80.227 3.601 c
+80.286 3.52 80.316 3.429 80.316 3.322 c
+81.903 2.278 m
+81.918 1.837 l
+82.172 2.18 82.494 2.352 82.888 2.352 c
+83.593 2.352 83.95 1.881 83.961 0.941 c
+83.961 -1.705 l
+83.314 -1.705 l
+83.314 0.912 l
+83.314 1.224 83.259 1.444 83.153 1.573 c
+83.042 1.698 82.888 1.764 82.683 1.764 c
+82.524 1.764 82.377 1.709 82.241 1.602 c
+82.112 1.492 82.01 1.357 81.933 1.191 c
+81.933 -1.705 l
+81.286 -1.705 l
+81.286 2.278 l
+h
+84.799 0.47 m
+84.799 1.087 84.909 1.551 85.137 1.866 c
+85.361 2.19 85.696 2.352 86.136 2.352 c
+86.537 2.352 86.842 2.176 87.048 1.823 c
+87.092 2.278 l
+87.68 2.278 l
+87.68 -1.749 l
+87.68 -2.238 87.551 -2.616 87.298 -2.881 c
+87.04 -3.146 86.687 -3.278 86.239 -3.278 c
+86.041 -3.278 85.821 -3.227 85.578 -3.131 c
+85.332 -3.032 85.152 -2.911 85.034 -2.763 c
+85.299 -2.323 l
+85.563 -2.587 85.861 -2.72 86.195 -2.72 c
+86.731 -2.72 87.007 -2.425 87.018 -1.837 c
+87.018 -1.309 l
+86.812 -1.624 86.511 -1.779 86.122 -1.779 c
+85.71 -1.779 85.387 -1.627 85.152 -1.323 c
+84.923 -1.01 84.806 -0.559 84.799 0.029 c
+h
+85.461 0.088 m
+85.461 -0.353 85.523 -0.683 85.651 -0.897 c
+85.777 -1.103 85.993 -1.205 86.298 -1.205 c
+86.621 -1.205 86.86 -1.04 87.018 -0.706 c
+87.018 1.278 l
+86.849 1.602 86.61 1.764 86.298 1.764 c
+86.004 1.764 85.787 1.661 85.651 1.455 c
+85.523 1.249 85.461 0.926 85.461 0.485 c
+h
+91.737 -1.22 m
+91.95 -1.22 92.123 -1.157 92.251 -1.029 c
+92.387 -0.893 92.461 -0.702 92.472 -0.455 c
+93.089 -0.455 l
+93.067 -0.838 92.931 -1.157 92.678 -1.411 c
+92.42 -1.658 92.108 -1.779 91.737 -1.779 c
+91.244 -1.779 90.87 -1.627 90.605 -1.323 c
+90.348 -1.01 90.223 -0.544 90.223 0.073 c
+90.223 0.515 l
+90.223 1.11 90.348 1.565 90.605 1.881 c
+90.87 2.194 91.244 2.352 91.737 2.352 c
+92.137 2.352 92.457 2.219 92.692 1.955 c
+92.935 1.698 93.067 1.353 93.089 0.912 c
+92.472 0.912 l
+92.449 1.205 92.376 1.426 92.251 1.573 c
+92.133 1.72 91.961 1.793 91.737 1.793 c
+91.443 1.793 91.226 1.694 91.09 1.5 c
+90.951 1.312 90.877 1.004 90.87 0.573 c
+90.87 0.059 l
+90.87 -0.411 90.936 -0.746 91.075 -0.941 c
+91.223 -1.128 91.443 -1.22 91.737 -1.22 c
+94.485 1.866 m
+94.739 2.19 95.059 2.352 95.441 2.352 c
+96.146 2.352 96.503 1.881 96.514 0.941 c
+96.514 -1.705 l
+95.867 -1.705 l
+95.867 0.912 l
+95.867 1.224 95.812 1.444 95.705 1.573 c
+95.595 1.698 95.441 1.764 95.235 1.764 c
+95.077 1.764 94.93 1.709 94.795 1.602 c
+94.666 1.492 94.563 1.357 94.485 1.191 c
+94.485 -1.705 l
+93.839 -1.705 l
+93.839 3.94 l
+94.485 3.94 l
+h
+99.512 -1.705 m
+99.472 -1.617 99.447 -1.469 99.439 -1.264 c
+99.204 -1.61 98.91 -1.779 98.557 -1.779 c
+98.193 -1.779 97.91 -1.683 97.704 -1.484 c
+97.506 -1.278 97.411 -0.992 97.411 -0.617 c
+97.411 -0.216 97.546 0.103 97.822 0.338 c
+98.094 0.58 98.469 0.706 98.939 0.706 c
+99.424 0.706 l
+99.424 1.132 l
+99.424 1.367 99.369 1.532 99.263 1.631 c
+99.152 1.738 98.991 1.793 98.778 1.793 c
+98.579 1.793 98.417 1.735 98.292 1.617 c
+98.175 1.5 98.116 1.353 98.116 1.176 c
+97.469 1.176 l
+97.469 1.371 97.528 1.562 97.646 1.749 c
+97.771 1.933 97.933 2.08 98.13 2.19 c
+98.336 2.297 98.564 2.352 98.822 2.352 c
+99.223 2.352 99.527 2.249 99.733 2.043 c
+99.946 1.837 100.06 1.544 100.071 1.161 c
+100.071 -0.852 l
+100.071 -1.157 100.108 -1.422 100.189 -1.646 c
+100.189 -1.705 l
+h
+98.645 -1.191 m
+98.811 -1.191 98.961 -1.147 99.101 -1.058 c
+99.248 -0.97 99.354 -0.86 99.424 -0.721 c
+99.424 0.22 l
+99.057 0.22 l
+98.741 0.22 98.498 0.151 98.322 0.015 c
+98.145 -0.114 98.057 -0.301 98.057 -0.544 c
+98.057 -0.771 98.101 -0.937 98.19 -1.043 c
+98.278 -1.143 98.429 -1.191 98.645 -1.191 c
+101.688 2.278 m
+101.702 1.837 l
+101.956 2.18 102.28 2.352 102.673 2.352 c
+103.379 2.352 103.735 1.881 103.746 0.941 c
+103.746 -1.705 l
+103.099 -1.705 l
+103.099 0.912 l
+103.099 1.224 103.044 1.444 102.938 1.573 c
+102.828 1.698 102.673 1.764 102.467 1.764 c
+102.309 1.764 102.162 1.709 102.026 1.602 c
+101.897 1.492 101.795 1.357 101.717 1.191 c
+101.717 -1.705 l
+101.07 -1.705 l
+101.07 2.278 l
+h
+104.584 0.47 m
+104.584 1.087 104.694 1.551 104.922 1.866 c
+105.146 2.19 105.48 2.352 105.922 2.352 c
+106.322 2.352 106.627 2.176 106.832 1.823 c
+106.876 2.278 l
+107.464 2.278 l
+107.464 -1.749 l
+107.464 -2.238 107.336 -2.616 107.082 -2.881 c
+106.826 -3.146 106.473 -3.278 106.024 -3.278 c
+105.826 -3.278 105.606 -3.227 105.363 -3.131 c
+105.116 -3.032 104.937 -2.911 104.819 -2.763 c
+105.083 -2.323 l
+105.348 -2.587 105.646 -2.72 105.98 -2.72 c
+106.517 -2.72 106.793 -2.425 106.803 -1.837 c
+106.803 -1.309 l
+106.597 -1.624 106.296 -1.779 105.907 -1.779 c
+105.495 -1.779 105.172 -1.627 104.937 -1.323 c
+104.709 -1.01 104.591 -0.559 104.584 0.029 c
+h
+105.245 0.088 m
+105.245 -0.353 105.307 -0.683 105.436 -0.897 c
+105.561 -1.103 105.778 -1.205 106.083 -1.205 c
+106.406 -1.205 106.645 -1.04 106.803 -0.706 c
+106.803 1.278 l
+106.635 1.602 106.396 1.764 106.083 1.764 c
+105.789 1.764 105.573 1.661 105.436 1.455 c
+105.307 1.249 105.245 0.926 105.245 0.485 c
+h
+109.846 -1.779 m
+109.346 -1.779 108.964 -1.631 108.7 -1.338 c
+108.435 -1.043 108.303 -0.61 108.303 -0.029 c
+108.303 0.441 l
+108.303 1.037 108.428 1.503 108.685 1.837 c
+108.949 2.18 109.309 2.352 109.772 2.352 c
+110.232 2.352 110.574 2.198 110.801 1.897 c
+111.036 1.602 111.158 1.139 111.169 0.515 c
+111.169 0.088 l
+108.949 0.088 l
+108.949 0 l
+108.949 -0.434 109.026 -0.746 109.184 -0.941 c
+109.35 -1.128 109.581 -1.22 109.876 -1.22 c
+110.07 -1.22 110.242 -1.187 110.39 -1.117 c
+110.537 -1.04 110.672 -0.922 110.801 -0.764 c
+111.14 -1.176 l
+110.853 -1.58 110.423 -1.779 109.846 -1.779 c
+109.772 1.793 m
+109.496 1.793 109.295 1.698 109.17 1.514 c
+109.041 1.326 108.968 1.037 108.949 0.647 c
+110.522 0.647 l
+110.522 0.735 l
+110.5 1.118 110.434 1.386 110.317 1.544 c
+110.199 1.709 110.015 1.793 109.772 1.793 c
+113.888 -0.691 m
+113.888 -0.544 113.833 -0.422 113.727 -0.324 c
+113.616 -0.228 113.411 -0.11 113.109 0.029 c
+112.764 0.177 112.521 0.298 112.374 0.397 c
+112.227 0.503 112.117 0.621 112.051 0.75 c
+111.981 0.875 111.948 1.033 111.948 1.22 c
+111.948 1.544 112.066 1.812 112.301 2.028 c
+112.536 2.242 112.837 2.352 113.212 2.352 c
+113.594 2.352 113.903 2.238 114.138 2.014 c
+114.373 1.786 114.491 1.5 114.491 1.147 c
+113.845 1.147 l
+113.845 1.323 113.785 1.474 113.668 1.602 c
+113.55 1.727 113.396 1.793 113.212 1.793 c
+113.014 1.793 112.863 1.738 112.756 1.631 c
+112.646 1.532 112.594 1.4 112.594 1.235 c
+112.594 1.106 112.632 1 112.712 0.912 c
+112.789 0.831 112.981 0.728 113.286 0.603 c
+113.764 0.416 114.094 0.228 114.271 0.044 c
+114.447 -0.133 114.535 -0.36 114.535 -0.632 c
+114.535 -0.985 114.41 -1.264 114.167 -1.469 c
+113.932 -1.675 113.616 -1.779 113.226 -1.779 c
+112.804 -1.779 112.466 -1.661 112.212 -1.426 c
+111.956 -1.183 111.83 -0.878 111.83 -0.515 c
+112.477 -0.515 l
+112.484 -0.742 112.554 -0.918 112.683 -1.043 c
+112.808 -1.161 112.991 -1.22 113.226 -1.22 c
+113.44 -1.22 113.602 -1.172 113.712 -1.073 c
+113.829 -0.977 113.888 -0.849 113.888 -0.691 c
+117.386 -1.705 m
+117.386 1.749 l
+116.858 1.749 l
+116.858 2.278 l
+117.386 2.278 l
+117.386 2.734 l
+117.386 3.135 117.482 3.447 117.681 3.675 c
+117.886 3.899 118.165 4.013 118.518 4.013 c
+118.655 4.013 118.787 3.991 118.915 3.954 c
+118.886 3.41 l
+118.787 3.429 118.687 3.439 118.591 3.439 c
+118.217 3.439 118.034 3.175 118.034 2.646 c
+118.034 2.278 l
+118.709 2.278 l
+118.709 1.749 l
+118.034 1.749 l
+118.034 -1.705 l
+h
+121.12 1.661 m
+121.032 1.679 120.933 1.691 120.826 1.691 c
+120.492 1.691 120.257 1.507 120.12 1.147 c
+120.12 -1.705 l
+119.474 -1.705 l
+119.474 2.278 l
+120.106 2.278 l
+120.12 1.866 l
+120.297 2.19 120.54 2.352 120.856 2.352 c
+120.962 2.352 121.051 2.33 121.12 2.294 c
+h
+121.561 0.47 m
+121.561 1.047 121.697 1.503 121.973 1.837 c
+122.256 2.18 122.627 2.352 123.09 2.352 c
+123.549 2.352 123.917 2.183 124.193 1.852 c
+124.475 1.529 124.623 1.081 124.633 0.515 c
+124.633 0.088 l
+124.633 -0.482 124.49 -0.937 124.207 -1.278 c
+123.931 -1.613 123.564 -1.779 123.104 -1.779 c
+122.641 -1.779 122.271 -1.617 121.988 -1.294 c
+121.712 -0.962 121.569 -0.522 121.561 0.029 c
+h
+122.208 0.088 m
+122.208 -0.316 122.285 -0.632 122.443 -0.867 c
+122.608 -1.103 122.829 -1.22 123.104 -1.22 c
+123.671 -1.22 123.964 -0.808 123.987 0.015 c
+123.987 0.47 l
+123.987 0.871 123.902 1.191 123.736 1.426 c
+123.578 1.669 123.362 1.793 123.09 1.793 c
+122.825 1.793 122.608 1.669 122.443 1.426 c
+122.285 1.191 122.208 0.871 122.208 0.47 c
+h
+126.088 2.278 m
+126.103 1.911 l
+126.346 2.205 126.665 2.352 127.058 2.352 c
+127.499 2.352 127.808 2.153 127.985 1.764 c
+128.238 2.153 128.587 2.352 129.028 2.352 c
+129.763 2.352 130.138 1.889 130.16 0.97 c
+130.16 -1.705 l
+129.513 -1.705 l
+129.513 0.912 l
+129.513 1.205 129.458 1.419 129.352 1.558 c
+129.252 1.694 129.08 1.764 128.837 1.764 c
+128.639 1.764 128.477 1.683 128.352 1.529 c
+128.234 1.382 128.164 1.191 128.147 0.956 c
+128.147 -1.705 l
+127.485 -1.705 l
+127.485 0.941 l
+127.485 1.488 127.264 1.764 126.823 1.764 c
+126.489 1.764 126.254 1.602 126.117 1.278 c
+126.117 -1.705 l
+125.471 -1.705 l
+125.471 2.278 l
+h
+133.703 3.234 m
+133.703 2.278 l
+134.306 2.278 l
+134.306 1.749 l
+133.703 1.749 l
+133.703 -0.721 l
+133.703 -0.878 133.724 -0.995 133.776 -1.073 c
+133.835 -1.153 133.923 -1.191 134.04 -1.191 c
+134.129 -1.191 134.217 -1.176 134.306 -1.147 c
+134.306 -1.705 l
+134.158 -1.753 134.004 -1.779 133.849 -1.779 c
+133.593 -1.779 133.398 -1.687 133.261 -1.5 c
+133.122 -1.315 133.055 -1.055 133.055 -0.721 c
+133.055 1.749 l
+132.453 1.749 l
+132.453 2.278 l
+133.055 2.278 l
+133.055 3.234 l
+h
+135.717 1.866 m
+135.97 2.19 136.29 2.352 136.672 2.352 c
+137.377 2.352 137.734 1.881 137.745 0.941 c
+137.745 -1.705 l
+137.098 -1.705 l
+137.098 0.912 l
+137.098 1.224 137.043 1.444 136.936 1.573 c
+136.826 1.698 136.672 1.764 136.466 1.764 c
+136.307 1.764 136.161 1.709 136.025 1.602 c
+135.896 1.492 135.794 1.357 135.717 1.191 c
+135.717 -1.705 l
+135.069 -1.705 l
+135.069 3.94 l
+135.717 3.94 l
+h
+140.126 -1.779 m
+139.626 -1.779 139.244 -1.631 138.979 -1.338 c
+138.715 -1.043 138.582 -0.61 138.582 -0.029 c
+138.582 0.441 l
+138.582 1.037 138.707 1.503 138.965 1.837 c
+139.229 2.18 139.59 2.352 140.053 2.352 c
+140.512 2.352 140.854 2.198 141.082 1.897 c
+141.317 1.602 141.438 1.139 141.449 0.515 c
+141.449 0.088 l
+139.229 0.088 l
+139.229 0 l
+139.229 -0.434 139.307 -0.746 139.465 -0.941 c
+139.63 -1.128 139.862 -1.22 140.155 -1.22 c
+140.35 -1.22 140.523 -1.187 140.67 -1.117 c
+140.816 -1.04 140.953 -0.922 141.082 -0.764 c
+141.419 -1.176 l
+141.133 -1.58 140.703 -1.779 140.126 -1.779 c
+140.053 1.793 m
+139.777 1.793 139.575 1.698 139.45 1.514 c
+139.322 1.326 139.248 1.037 139.229 0.647 c
+140.802 0.647 l
+140.802 0.735 l
+140.78 1.118 140.714 1.386 140.596 1.544 c
+140.479 1.709 140.295 1.793 140.053 1.793 c
+145.888 -0.691 m
+145.888 -0.544 145.833 -0.422 145.726 -0.324 c
+145.616 -0.228 145.41 -0.11 145.109 0.029 c
+144.764 0.177 144.521 0.298 144.374 0.397 c
+144.227 0.503 144.117 0.621 144.051 0.75 c
+143.981 0.875 143.948 1.033 143.948 1.22 c
+143.948 1.544 144.066 1.812 144.301 2.028 c
+144.536 2.242 144.837 2.352 145.212 2.352 c
+145.594 2.352 145.903 2.238 146.138 2.014 c
+146.373 1.786 146.491 1.5 146.491 1.147 c
+145.844 1.147 l
+145.844 1.323 145.785 1.474 145.668 1.602 c
+145.55 1.727 145.396 1.793 145.212 1.793 c
+145.013 1.793 144.863 1.738 144.756 1.631 c
+144.646 1.532 144.594 1.4 144.594 1.235 c
+144.594 1.106 144.631 1 144.712 0.912 c
+144.789 0.831 144.98 0.728 145.285 0.603 c
+145.763 0.416 146.094 0.228 146.27 0.044 c
+146.447 -0.133 146.535 -0.36 146.535 -0.632 c
+146.535 -0.985 146.41 -1.264 146.167 -1.469 c
+145.932 -1.675 145.616 -1.779 145.227 -1.779 c
+144.804 -1.779 144.466 -1.661 144.213 -1.426 c
+143.955 -1.183 143.831 -0.878 143.831 -0.515 c
+144.477 -0.515 l
+144.484 -0.742 144.554 -0.918 144.683 -1.043 c
+144.808 -1.161 144.991 -1.22 145.227 -1.22 c
+145.44 -1.22 145.601 -1.172 145.712 -1.073 c
+145.83 -0.977 145.888 -0.849 145.888 -0.691 c
+150.254 0.088 m
+150.254 -0.54 150.136 -1.01 149.901 -1.323 c
+149.674 -1.627 149.357 -1.779 148.945 -1.779 c
+148.541 -1.779 148.232 -1.627 148.02 -1.323 c
+148.02 -3.233 l
+147.372 -3.233 l
+147.372 2.278 l
+147.96 2.278 l
+148.005 1.837 l
+148.218 2.18 148.527 2.352 148.93 2.352 c
+149.372 2.352 149.699 2.198 149.915 1.897 c
+150.129 1.592 150.243 1.135 150.254 0.53 c
+h
+149.607 0.47 m
+149.607 0.912 149.537 1.235 149.401 1.44 c
+149.261 1.654 149.041 1.764 148.739 1.764 c
+148.423 1.764 148.185 1.61 148.02 1.309 c
+148.02 -0.764 l
+148.185 -1.07 148.423 -1.22 148.739 -1.22 c
+149.034 -1.22 149.246 -1.117 149.387 -0.912 c
+149.522 -0.698 149.596 -0.368 149.607 0.073 c
+h
+152.517 -1.779 m
+152.018 -1.779 151.635 -1.631 151.371 -1.338 c
+151.106 -1.043 150.974 -0.61 150.974 -0.029 c
+150.974 0.441 l
+150.974 1.037 151.099 1.503 151.357 1.837 c
+151.621 2.18 151.981 2.352 152.444 2.352 c
+152.903 2.352 153.245 2.198 153.473 1.897 c
+153.708 1.602 153.83 1.139 153.84 0.515 c
+153.84 0.088 l
+151.621 0.088 l
+151.621 0 l
+151.621 -0.434 151.698 -0.746 151.856 -0.941 c
+152.022 -1.128 152.253 -1.22 152.547 -1.22 c
+152.741 -1.22 152.914 -1.187 153.061 -1.117 c
+153.208 -1.04 153.344 -0.922 153.473 -0.764 c
+153.811 -1.176 l
+153.524 -1.58 153.094 -1.779 152.517 -1.779 c
+152.444 1.793 m
+152.168 1.793 151.966 1.698 151.841 1.514 c
+151.713 1.326 151.639 1.037 151.621 0.647 c
+153.194 0.647 l
+153.194 0.735 l
+153.171 1.118 153.105 1.386 152.988 1.544 c
+152.87 1.709 152.687 1.793 152.444 1.793 c
+156.001 -1.22 m
+156.214 -1.22 156.387 -1.157 156.516 -1.029 c
+156.652 -0.893 156.725 -0.702 156.736 -0.455 c
+157.354 -0.455 l
+157.331 -0.838 157.196 -1.157 156.942 -1.411 c
+156.685 -1.658 156.373 -1.779 156.001 -1.779 c
+155.509 -1.779 155.134 -1.627 154.869 -1.323 c
+154.612 -1.01 154.487 -0.544 154.487 0.073 c
+154.487 0.515 l
+154.487 1.11 154.612 1.565 154.869 1.881 c
+155.134 2.194 155.509 2.352 156.001 2.352 c
+156.402 2.352 156.722 2.219 156.957 1.955 c
+157.199 1.698 157.331 1.353 157.354 0.912 c
+156.736 0.912 l
+156.714 1.205 156.641 1.426 156.516 1.573 c
+156.398 1.72 156.225 1.793 156.001 1.793 c
+155.707 1.793 155.49 1.694 155.355 1.5 c
+155.214 1.312 155.141 1.004 155.134 0.573 c
+155.134 0.059 l
+155.134 -0.411 155.2 -0.746 155.34 -0.941 c
+155.486 -1.128 155.707 -1.22 156.001 -1.22 c
+158.808 -1.705 -0.646 3.983 re
+158.852 3.322 m
+158.852 3.212 158.823 3.12 158.765 3.042 c
+158.706 2.973 158.611 2.94 158.485 2.94 c
+158.368 2.94 158.272 2.973 158.206 3.042 c
+158.147 3.12 158.118 3.212 158.118 3.322 c
+158.118 3.439 158.147 3.532 158.206 3.601 c
+158.272 3.678 158.368 3.719 158.485 3.719 c
+158.611 3.719 158.706 3.678 158.765 3.601 c
+158.823 3.52 158.852 3.429 158.852 3.322 c
+159.999 -1.705 m
+159.999 1.749 l
+159.484 1.749 l
+159.484 2.278 l
+159.999 2.278 l
+159.999 2.646 l
+160.007 3.076 160.12 3.41 160.337 3.645 c
+160.562 3.888 160.874 4.013 161.278 4.013 c
+161.425 4.013 161.564 3.991 161.705 3.954 c
+161.851 3.913 162.002 3.859 162.16 3.792 c
+162.042 3.219 l
+161.807 3.344 161.564 3.41 161.322 3.41 c
+161.076 3.41 160.903 3.341 160.807 3.204 c
+160.708 3.076 160.66 2.881 160.66 2.616 c
+160.66 2.278 l
+161.308 2.278 l
+161.308 1.749 l
+160.66 1.749 l
+160.66 -1.705 l
+h
+162.469 -1.705 -0.646 3.983 re
+164.938 -1.779 m
+164.438 -1.779 164.056 -1.631 163.791 -1.338 c
+163.527 -1.043 163.394 -0.61 163.394 -0.029 c
+163.394 0.441 l
+163.394 1.037 163.519 1.503 163.777 1.837 c
+164.041 2.18 164.402 2.352 164.865 2.352 c
+165.324 2.352 165.666 2.198 165.894 1.897 c
+166.129 1.602 166.25 1.139 166.261 0.515 c
+166.261 0.088 l
+164.041 0.088 l
+164.041 0 l
+164.041 -0.434 164.119 -0.746 164.277 -0.941 c
+164.442 -1.128 164.674 -1.22 164.967 -1.22 c
+165.162 -1.22 165.335 -1.187 165.482 -1.117 c
+165.628 -1.04 165.765 -0.922 165.894 -0.764 c
+166.231 -1.176 l
+165.945 -1.58 165.515 -1.779 164.938 -1.779 c
+164.865 1.793 m
+164.589 1.793 164.387 1.698 164.262 1.514 c
+164.134 1.326 164.059 1.037 164.041 0.647 c
+165.614 0.647 l
+165.614 0.735 l
+165.592 1.118 165.526 1.386 165.408 1.544 c
+165.291 1.709 165.107 1.793 164.865 1.793 c
+166.908 0.47 m
+166.908 1.077 167.018 1.544 167.246 1.866 c
+167.481 2.19 167.808 2.352 168.231 2.352 c
+168.612 2.352 168.911 2.194 169.127 1.881 c
+169.127 3.94 l
+169.774 3.94 l
+169.774 -1.705 l
+169.186 -1.705 l
+169.142 -1.278 l
+168.936 -1.613 168.631 -1.779 168.231 -1.779 c
+167.819 -1.779 167.496 -1.624 167.261 -1.309 c
+167.025 -0.985 166.908 -0.529 166.908 0.059 c
+h
+167.554 0.088 m
+167.554 -0.353 167.617 -0.683 167.745 -0.897 c
+167.882 -1.103 168.102 -1.205 168.407 -1.205 c
+168.73 -1.205 168.969 -1.043 169.127 -0.721 c
+169.127 1.294 l
+168.959 1.606 168.72 1.764 168.407 1.764 c
+168.102 1.764 167.882 1.661 167.745 1.455 c
+167.617 1.249 167.554 0.926 167.554 0.485 c
+h
+173.875 -1.22 m
+174.089 -1.22 174.261 -1.157 174.39 -1.029 c
+174.526 -0.893 174.599 -0.702 174.61 -0.455 c
+175.228 -0.455 l
+175.205 -0.838 175.07 -1.157 174.816 -1.411 c
+174.559 -1.658 174.247 -1.779 173.875 -1.779 c
+173.383 -1.779 173.008 -1.627 172.743 -1.323 c
+172.486 -1.01 172.361 -0.544 172.361 0.073 c
+172.361 0.515 l
+172.361 1.11 172.486 1.565 172.743 1.881 c
+173.008 2.194 173.383 2.352 173.875 2.352 c
+174.276 2.352 174.596 2.219 174.831 1.955 c
+175.073 1.698 175.205 1.353 175.228 0.912 c
+174.61 0.912 l
+174.588 1.205 174.515 1.426 174.39 1.573 c
+174.272 1.72 174.099 1.793 173.875 1.793 c
+173.581 1.793 173.364 1.694 173.229 1.5 c
+173.089 1.312 173.015 1.004 173.008 0.573 c
+173.008 0.059 l
+173.008 -0.411 173.074 -0.746 173.214 -0.941 c
+173.36 -1.128 173.581 -1.22 173.875 -1.22 c
+175.845 0.47 m
+175.845 1.047 175.98 1.503 176.256 1.837 c
+176.539 2.18 176.911 2.352 177.374 2.352 c
+177.833 2.352 178.201 2.183 178.476 1.852 c
+178.759 1.529 178.906 1.081 178.916 0.515 c
+178.916 0.088 l
+178.916 -0.482 178.773 -0.937 178.49 -1.278 c
+178.215 -1.613 177.848 -1.779 177.388 -1.779 c
+176.925 -1.779 176.554 -1.617 176.271 -1.294 c
+175.995 -0.962 175.852 -0.522 175.845 0.029 c
+h
+176.491 0.088 m
+176.491 -0.316 176.568 -0.632 176.726 -0.867 c
+176.892 -1.103 177.113 -1.22 177.388 -1.22 c
+177.954 -1.22 178.249 -0.808 178.27 0.015 c
+178.27 0.47 l
+178.27 0.871 178.185 1.191 178.02 1.426 c
+177.862 1.669 177.646 1.793 177.374 1.793 c
+177.109 1.793 176.892 1.669 176.726 1.426 c
+176.568 1.191 176.491 0.871 176.491 0.47 c
+h
+180.372 2.278 m
+180.387 1.911 l
+180.63 2.205 180.949 2.352 181.343 2.352 c
+181.783 2.352 182.091 2.153 182.268 1.764 c
+182.522 2.153 182.871 2.352 183.312 2.352 c
+184.047 2.352 184.422 1.889 184.443 0.97 c
+184.443 -1.705 l
+183.797 -1.705 l
+183.797 0.912 l
+183.797 1.205 183.741 1.419 183.635 1.558 c
+183.536 1.694 183.363 1.764 183.121 1.764 c
+182.922 1.764 182.76 1.683 182.636 1.529 c
+182.519 1.382 182.448 1.191 182.43 0.956 c
+182.43 -1.705 l
+181.769 -1.705 l
+181.769 0.941 l
+181.769 1.488 181.548 1.764 181.107 1.764 c
+180.772 1.764 180.537 1.602 180.402 1.278 c
+180.402 -1.705 l
+179.755 -1.705 l
+179.755 2.278 l
+h
+186.031 2.278 m
+186.046 1.911 l
+186.288 2.205 186.608 2.352 187.001 2.352 c
+187.442 2.352 187.751 2.153 187.928 1.764 c
+188.181 2.153 188.53 2.352 188.971 2.352 c
+189.706 2.352 190.081 1.889 190.103 0.97 c
+190.103 -1.705 l
+189.456 -1.705 l
+189.456 0.912 l
+189.456 1.205 189.401 1.419 189.295 1.558 c
+189.195 1.694 189.023 1.764 188.78 1.764 c
+188.582 1.764 188.42 1.683 188.295 1.529 c
+188.177 1.382 188.107 1.191 188.089 0.956 c
+188.089 -1.705 l
+187.427 -1.705 l
+187.427 0.941 l
+187.427 1.488 187.207 1.764 186.766 1.764 c
+186.432 1.764 186.197 1.602 186.06 1.278 c
+186.06 -1.705 l
+185.414 -1.705 l
+185.414 2.278 l
+h
+191.778 -1.705 -0.646 3.983 re
+191.822 3.322 m
+191.822 3.212 191.793 3.12 191.734 3.042 c
+191.676 2.973 191.58 2.94 191.456 2.94 c
+191.338 2.94 191.242 2.973 191.176 3.042 c
+191.117 3.12 191.088 3.212 191.088 3.322 c
+191.088 3.439 191.117 3.532 191.176 3.601 c
+191.242 3.678 191.338 3.719 191.456 3.719 c
+191.58 3.719 191.676 3.678 191.734 3.601 c
+191.793 3.52 191.822 3.429 191.822 3.322 c
+193.646 3.234 m
+193.646 2.278 l
+194.248 2.278 l
+194.248 1.749 l
+193.646 1.749 l
+193.646 -0.721 l
+193.646 -0.878 193.667 -0.995 193.719 -1.073 c
+193.777 -1.153 193.866 -1.191 193.983 -1.191 c
+194.072 -1.191 194.16 -1.176 194.248 -1.147 c
+194.248 -1.705 l
+194.101 -1.753 193.947 -1.779 193.792 -1.779 c
+193.536 -1.779 193.341 -1.687 193.204 -1.5 c
+193.065 -1.315 192.998 -1.055 192.998 -0.721 c
+192.998 1.749 l
+192.396 1.749 l
+192.396 2.278 l
+192.998 2.278 l
+192.998 3.234 l
+h
+195.057 -1.352 m
+195.057 -1.234 195.09 -1.139 195.159 -1.058 c
+195.225 -0.981 195.329 -0.941 195.468 -0.941 c
+195.615 -0.941 195.722 -0.981 195.791 -1.058 c
+195.869 -1.139 195.909 -1.234 195.909 -1.352 c
+195.909 -1.463 195.869 -1.554 195.791 -1.631 c
+195.722 -1.708 195.615 -1.749 195.468 -1.749 c
+195.329 -1.749 195.225 -1.708 195.159 -1.631 c
+195.09 -1.554 195.057 -1.463 195.057 -1.352 c
+199.51 -1.705 -0.676 5.35 re
+201.451 3.234 m
+201.451 2.278 l
+202.053 2.278 l
+202.053 1.749 l
+201.451 1.749 l
+201.451 -0.721 l
+201.451 -0.878 201.472 -0.995 201.524 -1.073 c
+201.583 -1.153 201.671 -1.191 201.789 -1.191 c
+201.877 -1.191 201.964 -1.176 202.053 -1.147 c
+202.053 -1.705 l
+201.906 -1.753 201.752 -1.779 201.598 -1.779 c
+201.34 -1.779 201.145 -1.687 201.01 -1.5 c
+200.87 -1.315 200.804 -1.055 200.804 -0.721 c
+200.804 1.749 l
+200.201 1.749 l
+200.201 2.278 l
+200.804 2.278 l
+200.804 3.234 l
+h
+f
+Q
+q 1 0 0 1 412.9262 238.2432 cm
+0 0 m
+0 0.617 0.11 1.081 0.338 1.396 c
+0.563 1.72 0.897 1.881 1.338 1.881 c
+1.738 1.881 2.043 1.706 2.249 1.353 c
+2.294 1.808 l
+2.881 1.808 l
+2.881 -2.219 l
+2.881 -2.708 2.753 -3.087 2.499 -3.351 c
+2.242 -3.616 1.889 -3.748 1.44 -3.748 c
+1.242 -3.748 1.022 -3.697 0.779 -3.601 c
+0.533 -3.502 0.353 -3.381 0.235 -3.233 c
+0.5 -2.793 l
+0.765 -3.057 1.062 -3.19 1.396 -3.19 c
+1.933 -3.19 2.209 -2.896 2.219 -2.308 c
+2.219 -1.779 l
+2.014 -2.094 1.712 -2.249 1.323 -2.249 c
+0.912 -2.249 0.588 -2.098 0.353 -1.793 c
+0.125 -1.481 0.008 -1.029 0 -0.441 c
+h
+0.661 -0.382 m
+0.661 -0.823 0.724 -1.153 0.852 -1.367 c
+0.977 -1.573 1.195 -1.675 1.5 -1.675 c
+1.823 -1.675 2.061 -1.51 2.219 -1.176 c
+2.219 0.808 l
+2.051 1.132 1.812 1.294 1.5 1.294 c
+1.205 1.294 0.989 1.191 0.852 0.985 c
+0.724 0.779 0.661 0.455 0.661 0.015 c
+h
+5.262 -2.249 m
+4.763 -2.249 4.38 -2.102 4.116 -1.808 c
+3.851 -1.514 3.719 -1.08 3.719 -0.5 c
+3.719 -0.029 l
+3.719 0.566 3.844 1.033 4.101 1.367 c
+4.366 1.709 4.726 1.881 5.189 1.881 c
+5.648 1.881 5.99 1.727 6.217 1.426 c
+6.453 1.132 6.574 0.669 6.585 0.044 c
+6.585 -0.382 l
+4.366 -0.382 l
+4.366 -0.47 l
+4.366 -0.904 4.443 -1.216 4.601 -1.411 c
+4.767 -1.598 4.998 -1.691 5.292 -1.691 c
+5.486 -1.691 5.659 -1.658 5.806 -1.587 c
+5.953 -1.51 6.089 -1.392 6.217 -1.234 c
+6.556 -1.646 l
+6.269 -2.051 5.839 -2.249 5.262 -2.249 c
+5.189 1.323 m
+4.913 1.323 4.711 1.228 4.586 1.043 c
+4.457 0.856 4.384 0.566 4.366 0.177 c
+5.939 0.177 l
+5.939 0.264 l
+5.916 0.647 5.85 0.915 5.733 1.073 c
+5.615 1.239 5.432 1.323 5.189 1.323 c
+7.981 1.808 m
+7.996 1.367 l
+8.25 1.709 8.573 1.881 8.966 1.881 c
+9.672 1.881 10.028 1.411 10.04 0.47 c
+10.04 -2.175 l
+9.392 -2.175 l
+9.392 0.441 l
+9.392 0.754 9.338 0.974 9.231 1.103 c
+9.12 1.228 8.966 1.294 8.761 1.294 c
+8.603 1.294 8.455 1.239 8.32 1.132 c
+8.191 1.022 8.088 0.886 8.011 0.721 c
+8.011 -2.175 l
+7.364 -2.175 l
+7.364 1.808 l
+h
+12.436 -2.249 m
+11.936 -2.249 11.553 -2.102 11.289 -1.808 c
+11.025 -1.514 10.892 -1.08 10.892 -0.5 c
+10.892 -0.029 l
+10.892 0.566 11.017 1.033 11.274 1.367 c
+11.539 1.709 11.899 1.881 12.362 1.881 c
+12.821 1.881 13.163 1.727 13.391 1.426 c
+13.626 1.132 13.747 0.669 13.758 0.044 c
+13.758 -0.382 l
+11.539 -0.382 l
+11.539 -0.47 l
+11.539 -0.904 11.616 -1.216 11.774 -1.411 c
+11.939 -1.598 12.171 -1.691 12.465 -1.691 c
+12.66 -1.691 12.833 -1.658 12.979 -1.587 c
+13.126 -1.51 13.263 -1.392 13.391 -1.234 c
+13.729 -1.646 l
+13.442 -2.051 13.012 -2.249 12.436 -2.249 c
+12.362 1.323 m
+12.087 1.323 11.884 1.228 11.759 1.043 c
+11.63 0.856 11.557 0.566 11.539 0.177 c
+13.112 0.177 l
+13.112 0.264 l
+13.089 0.647 13.024 0.915 12.906 1.073 c
+12.788 1.239 12.605 1.323 12.362 1.323 c
+16.184 1.191 m
+16.095 1.209 15.996 1.22 15.89 1.22 c
+15.555 1.22 15.32 1.037 15.184 0.676 c
+15.184 -2.175 l
+14.537 -2.175 l
+14.537 1.808 l
+15.169 1.808 l
+15.184 1.396 l
+15.36 1.72 15.603 1.881 15.919 1.881 c
+16.025 1.881 16.114 1.86 16.184 1.823 c
+h
+18.726 -2.175 m
+18.686 -2.087 18.66 -1.94 18.653 -1.735 c
+18.418 -2.08 18.124 -2.249 17.771 -2.249 c
+17.407 -2.249 17.124 -2.153 16.918 -1.955 c
+16.721 -1.749 16.625 -1.463 16.625 -1.087 c
+16.625 -0.687 16.761 -0.368 17.036 -0.133 c
+17.309 0.11 17.683 0.235 18.153 0.235 c
+18.639 0.235 l
+18.639 0.661 l
+18.639 0.897 18.583 1.062 18.477 1.161 c
+18.367 1.268 18.205 1.323 17.992 1.323 c
+17.793 1.323 17.631 1.264 17.506 1.147 c
+17.389 1.029 17.33 0.882 17.33 0.706 c
+16.683 0.706 l
+16.683 0.9 16.742 1.091 16.86 1.278 c
+16.985 1.463 17.147 1.61 17.345 1.72 c
+17.55 1.827 17.779 1.881 18.036 1.881 c
+18.437 1.881 18.741 1.779 18.947 1.573 c
+19.16 1.367 19.274 1.073 19.285 0.691 c
+19.285 -1.323 l
+19.285 -1.627 19.322 -1.893 19.403 -2.117 c
+19.403 -2.175 l
+h
+17.859 -1.661 m
+18.025 -1.661 18.175 -1.617 18.315 -1.529 c
+18.462 -1.44 18.568 -1.33 18.639 -1.191 c
+18.639 -0.25 l
+18.271 -0.25 l
+17.955 -0.25 17.712 -0.32 17.536 -0.455 c
+17.359 -0.584 17.271 -0.771 17.271 -1.014 c
+17.271 -1.242 17.315 -1.407 17.404 -1.514 c
+17.492 -1.613 17.643 -1.661 17.859 -1.661 c
+21.137 2.764 m
+21.137 1.808 l
+21.74 1.808 l
+21.74 1.278 l
+21.137 1.278 l
+21.137 -1.191 l
+21.137 -1.348 21.159 -1.466 21.211 -1.544 c
+21.269 -1.624 21.358 -1.661 21.475 -1.661 c
+21.564 -1.661 21.652 -1.646 21.74 -1.617 c
+21.74 -2.175 l
+21.593 -2.223 21.439 -2.249 21.284 -2.249 c
+21.027 -2.249 20.833 -2.157 20.696 -1.97 c
+20.557 -1.786 20.49 -1.525 20.49 -1.191 c
+20.49 1.278 l
+19.888 1.278 l
+19.888 1.808 l
+20.49 1.808 l
+20.49 2.764 l
+h
+23.931 -2.249 m
+23.43 -2.249 23.048 -2.102 22.784 -1.808 c
+22.519 -1.514 22.387 -1.08 22.387 -0.5 c
+22.387 -0.029 l
+22.387 0.566 22.512 1.033 22.769 1.367 c
+23.033 1.709 23.393 1.881 23.856 1.881 c
+24.316 1.881 24.658 1.727 24.885 1.426 c
+25.121 1.132 25.242 0.669 25.253 0.044 c
+25.253 -0.382 l
+23.033 -0.382 l
+23.033 -0.47 l
+23.033 -0.904 23.111 -1.216 23.268 -1.411 c
+23.434 -1.598 23.665 -1.691 23.96 -1.691 c
+24.154 -1.691 24.327 -1.658 24.474 -1.587 c
+24.621 -1.51 24.757 -1.392 24.885 -1.234 c
+25.224 -1.646 l
+24.937 -2.051 24.507 -2.249 23.931 -2.249 c
+23.856 1.323 m
+23.582 1.323 23.379 1.228 23.254 1.043 c
+23.125 0.856 23.052 0.566 23.033 0.177 c
+24.606 0.177 l
+24.606 0.264 l
+24.584 0.647 24.518 0.915 24.401 1.073 c
+24.283 1.239 24.099 1.323 23.856 1.323 c
+27.972 -1.161 m
+27.972 -1.014 27.917 -0.893 27.811 -0.794 c
+27.7 -0.698 27.495 -0.58 27.193 -0.441 c
+26.848 -0.294 26.605 -0.172 26.458 -0.073 c
+26.312 0.033 26.201 0.151 26.135 0.279 c
+26.065 0.405 26.032 0.563 26.032 0.75 c
+26.032 1.073 26.15 1.341 26.385 1.558 c
+26.62 1.771 26.921 1.881 27.296 1.881 c
+27.678 1.881 27.987 1.768 28.222 1.544 c
+28.457 1.316 28.575 1.029 28.575 0.676 c
+27.929 0.676 l
+27.929 0.852 27.869 1.004 27.752 1.132 c
+27.634 1.257 27.48 1.323 27.296 1.323 c
+27.098 1.323 26.947 1.268 26.84 1.161 c
+26.73 1.062 26.678 0.929 26.678 0.765 c
+26.678 0.636 26.716 0.53 26.796 0.441 c
+26.874 0.36 27.065 0.258 27.37 0.133 c
+27.848 -0.055 28.178 -0.243 28.355 -0.426 c
+28.531 -0.603 28.619 -0.831 28.619 -1.103 c
+28.619 -1.455 28.494 -1.735 28.251 -1.94 c
+28.016 -2.146 27.7 -2.249 27.311 -2.249 c
+26.888 -2.249 26.55 -2.132 26.296 -1.897 c
+26.04 -1.654 25.915 -1.348 25.915 -0.985 c
+26.561 -0.985 l
+26.568 -1.213 26.639 -1.389 26.767 -1.514 c
+26.892 -1.631 27.075 -1.691 27.311 -1.691 c
+27.524 -1.691 27.686 -1.643 27.796 -1.544 c
+27.914 -1.448 27.972 -1.319 27.972 -1.161 c
+33.22 -2.175 m
+33.18 -2.087 33.154 -1.94 33.146 -1.735 c
+32.911 -2.08 32.617 -2.249 32.265 -2.249 c
+31.9 -2.249 31.617 -2.153 31.412 -1.955 c
+31.214 -1.749 31.118 -1.463 31.118 -1.087 c
+31.118 -0.687 31.254 -0.368 31.53 -0.133 c
+31.802 0.11 32.176 0.235 32.646 0.235 c
+33.132 0.235 l
+33.132 0.661 l
+33.132 0.897 33.076 1.062 32.97 1.161 c
+32.86 1.268 32.698 1.323 32.485 1.323 c
+32.286 1.323 32.125 1.264 32 1.147 c
+31.883 1.029 31.823 0.882 31.823 0.706 c
+31.177 0.706 l
+31.177 0.9 31.235 1.091 31.353 1.278 c
+31.478 1.463 31.64 1.61 31.838 1.72 c
+32.044 1.827 32.272 1.881 32.529 1.881 c
+32.93 1.881 33.234 1.779 33.44 1.573 c
+33.654 1.367 33.768 1.073 33.778 0.691 c
+33.778 -1.323 l
+33.778 -1.627 33.815 -1.893 33.896 -2.117 c
+33.896 -2.175 l
+h
+32.353 -1.661 m
+32.519 -1.661 32.669 -1.617 32.808 -1.529 c
+32.955 -1.44 33.062 -1.33 33.132 -1.191 c
+33.132 -0.25 l
+32.764 -0.25 l
+32.448 -0.25 32.205 -0.32 32.029 -0.455 c
+31.853 -0.584 31.765 -0.771 31.765 -1.014 c
+31.765 -1.242 31.809 -1.407 31.897 -1.514 c
+31.985 -1.613 32.136 -1.661 32.353 -1.661 c
+35.395 1.808 m
+35.41 1.367 l
+35.663 1.709 35.987 1.881 36.38 1.881 c
+37.086 1.881 37.442 1.411 37.454 0.47 c
+37.454 -2.175 l
+36.806 -2.175 l
+36.806 0.441 l
+36.806 0.754 36.752 0.974 36.645 1.103 c
+36.535 1.228 36.38 1.294 36.174 1.294 c
+36.016 1.294 35.869 1.239 35.733 1.132 c
+35.605 1.022 35.502 0.886 35.424 0.721 c
+35.424 -2.175 l
+34.778 -2.175 l
+34.778 1.808 l
+h
+f
+Q
+454.054 236.068 -1.044 3.983 re
+452.967 241.08 m
+452.967 241.235 453.014 241.364 453.114 241.462 c
+453.22 241.569 453.356 241.624 453.525 241.624 c
+453.702 241.624 453.837 241.569 453.937 241.462 c
+454.043 241.364 454.099 241.235 454.099 241.08 c
+454.099 240.911 454.043 240.776 453.937 240.668 c
+453.837 240.57 453.702 240.522 453.525 240.522 c
+453.356 240.522 453.22 240.57 453.114 240.668 c
+453.014 240.776 452.967 240.911 452.967 241.08 c
+455.818 240.051 m
+455.847 239.654 l
+456.083 239.967 456.384 240.125 456.759 240.125 c
+457.442 240.125 457.795 239.643 457.817 238.684 c
+457.817 236.068 l
+456.773 236.068 l
+456.773 238.611 l
+456.773 238.835 456.736 238.997 456.671 239.096 c
+456.601 239.191 456.483 239.243 456.318 239.243 c
+456.131 239.243 455.984 239.147 455.877 238.964 c
+455.877 236.068 l
+454.833 236.068 l
+454.833 240.051 l
+h
+459.875 237.538 m
+460.375 240.051 l
+461.463 240.051 l
+460.36 236.068 l
+459.375 236.068 l
+458.273 240.051 l
+459.36 240.051 l
+h
+463.506 235.994 m
+462.976 235.994 462.558 236.149 462.257 236.464 c
+461.962 236.788 461.815 237.248 461.815 237.846 c
+461.815 238.155 l
+461.815 238.779 461.951 239.265 462.227 239.61 c
+462.498 239.953 462.892 240.125 463.403 240.125 c
+463.903 240.125 464.274 239.963 464.52 239.639 c
+464.773 239.317 464.906 238.839 464.917 238.214 c
+464.917 237.714 l
+462.845 237.714 l
+462.863 237.42 462.926 237.204 463.036 237.067 c
+463.153 236.928 463.333 236.861 463.579 236.861 c
+463.921 236.861 464.212 236.979 464.447 237.214 c
+464.858 236.582 l
+464.73 236.406 464.542 236.263 464.299 236.156 c
+464.053 236.049 463.789 235.994 463.506 235.994 c
+462.859 238.434 m
+463.888 238.434 l
+463.888 238.538 l
+463.888 238.773 463.847 238.949 463.77 239.066 c
+463.701 239.191 463.572 239.257 463.388 239.257 c
+463.212 239.257 463.08 239.188 462.991 239.051 c
+462.91 238.923 462.866 238.717 462.859 238.434 c
+467.46 239.037 m
+467.121 239.066 l
+466.835 239.066 466.644 238.941 466.548 238.699 c
+466.548 236.068 l
+465.505 236.068 l
+465.505 240.051 l
+466.475 240.051 l
+466.504 239.61 l
+466.67 239.953 466.901 240.125 467.196 240.125 c
+467.313 240.125 467.404 240.103 467.474 240.066 c
+h
+469.768 237.141 m
+469.768 237.229 469.723 237.306 469.635 237.376 c
+469.547 237.453 469.359 237.556 469.077 237.684 c
+468.643 237.861 468.345 238.041 468.18 238.228 c
+468.022 238.413 467.944 238.644 467.944 238.92 c
+467.944 239.261 468.066 239.544 468.312 239.772 c
+468.566 240.007 468.904 240.125 469.326 240.125 c
+469.756 240.125 470.105 240.011 470.371 239.787 c
+470.635 239.559 470.767 239.257 470.767 238.875 c
+469.723 238.875 l
+469.723 239.199 469.584 239.361 469.312 239.361 c
+469.201 239.361 469.114 239.324 469.047 239.257 c
+468.977 239.188 468.944 239.089 468.944 238.964 c
+468.944 238.875 468.981 238.794 469.062 238.729 c
+469.139 238.669 469.319 238.574 469.606 238.449 c
+470.036 238.291 470.334 238.114 470.502 237.92 c
+470.679 237.732 470.767 237.483 470.767 237.17 c
+470.767 236.817 470.635 236.531 470.371 236.318 c
+470.105 236.101 469.756 235.994 469.326 235.994 c
+469.033 235.994 468.771 236.049 468.547 236.156 c
+468.32 236.273 468.143 236.435 468.019 236.641 c
+467.901 236.847 467.842 237.067 467.842 237.302 c
+468.827 237.302 l
+468.827 237.115 468.863 236.979 468.944 236.891 c
+469.033 236.803 469.165 236.759 469.341 236.759 c
+469.625 236.759 469.768 236.884 469.768 237.141 c
+472.516 236.068 -1.044 3.983 re
+471.429 241.08 m
+471.429 241.235 471.476 241.364 471.576 241.462 c
+471.682 241.569 471.818 241.624 471.987 241.624 c
+472.164 241.624 472.299 241.569 472.399 241.462 c
+472.505 241.364 472.561 241.235 472.561 241.08 c
+472.561 240.911 472.505 240.776 472.399 240.668 c
+472.299 240.57 472.164 240.522 471.987 240.522 c
+471.818 240.522 471.682 240.57 471.576 240.668 c
+471.476 240.776 471.429 240.911 471.429 241.08 c
+473.207 238.185 m
+473.207 238.791 473.347 239.265 473.633 239.61 c
+473.916 239.953 474.309 240.125 474.809 240.125 c
+475.316 240.125 475.713 239.953 476 239.61 c
+476.283 239.265 476.426 238.791 476.426 238.185 c
+476.426 237.92 l
+476.426 237.321 476.283 236.851 476 236.508 c
+475.713 236.163 475.316 235.994 474.809 235.994 c
+474.298 235.994 473.902 236.163 473.619 236.508 c
+473.343 236.851 473.207 237.325 473.207 237.935 c
+h
+474.251 237.92 m
+474.251 237.214 474.435 236.861 474.809 236.861 c
+475.162 236.861 475.353 237.156 475.383 237.744 c
+475.383 238.185 l
+475.383 238.544 475.331 238.816 475.235 238.993 c
+475.136 239.169 474.993 239.257 474.809 239.257 c
+474.633 239.257 474.493 239.169 474.398 238.993 c
+474.298 238.816 474.251 238.544 474.251 238.185 c
+h
+478.028 240.051 m
+478.057 239.654 l
+478.293 239.967 478.595 240.125 478.969 240.125 c
+479.653 240.125 480.006 239.643 480.027 238.684 c
+480.027 236.068 l
+478.984 236.068 l
+478.984 238.611 l
+478.984 238.835 478.947 238.997 478.881 239.096 c
+478.811 239.191 478.693 239.243 478.528 239.243 c
+478.341 239.243 478.194 239.147 478.087 238.964 c
+478.087 236.068 l
+477.043 236.068 l
+477.043 240.051 l
+h
+f
+q 1 0 0 1 482.4675 238.2432 cm
+0 0 m
+0 0.577 0.136 1.033 0.411 1.367 c
+0.694 1.709 1.066 1.881 1.529 1.881 c
+1.988 1.881 2.356 1.712 2.631 1.382 c
+2.914 1.058 3.061 0.611 3.072 0.044 c
+3.072 -0.382 l
+3.072 -0.952 2.929 -1.407 2.645 -1.749 c
+2.37 -2.084 2.003 -2.249 1.544 -2.249 c
+1.08 -2.249 0.709 -2.087 0.426 -1.764 c
+0.151 -1.433 0.008 -0.992 0 -0.441 c
+h
+0.646 -0.382 m
+0.646 -0.786 0.723 -1.103 0.882 -1.338 c
+1.047 -1.573 1.268 -1.691 1.544 -1.691 c
+2.109 -1.691 2.404 -1.278 2.425 -0.455 c
+2.425 0 l
+2.425 0.401 2.341 0.721 2.175 0.956 c
+2.018 1.199 1.801 1.323 1.529 1.323 c
+1.264 1.323 1.047 1.199 0.882 0.956 c
+0.723 0.721 0.646 0.401 0.646 0 c
+h
+4.204 -2.175 m
+4.204 1.278 l
+3.675 1.278 l
+3.675 1.808 l
+4.204 1.808 l
+4.204 2.263 l
+4.204 2.664 4.299 2.977 4.498 3.204 c
+4.704 3.429 4.983 3.543 5.336 3.543 c
+5.471 3.543 5.604 3.52 5.733 3.484 c
+5.703 2.94 l
+5.604 2.959 5.505 2.969 5.409 2.969 c
+5.035 2.969 4.85 2.705 4.85 2.176 c
+4.85 1.808 l
+5.527 1.808 l
+5.527 1.278 l
+4.85 1.278 l
+4.85 -2.175 l
+h
+9.392 -1.691 m
+9.606 -1.691 9.779 -1.627 9.907 -1.5 c
+10.043 -1.363 10.117 -1.172 10.128 -0.926 c
+10.745 -0.926 l
+10.723 -1.309 10.587 -1.627 10.333 -1.881 c
+10.076 -2.128 9.764 -2.249 9.392 -2.249 c
+8.9 -2.249 8.525 -2.098 8.261 -1.793 c
+8.004 -1.481 7.879 -1.014 7.879 -0.397 c
+7.879 0.044 l
+7.879 0.64 8.004 1.095 8.261 1.411 c
+8.525 1.723 8.9 1.881 9.392 1.881 c
+9.793 1.881 10.113 1.749 10.348 1.484 c
+10.591 1.228 10.723 0.882 10.745 0.441 c
+10.128 0.441 l
+10.105 0.735 10.032 0.956 9.907 1.103 c
+9.789 1.249 9.617 1.323 9.392 1.323 c
+9.099 1.323 8.882 1.224 8.746 1.029 c
+8.606 0.842 8.533 0.533 8.525 0.103 c
+8.525 -0.411 l
+8.525 -0.881 8.592 -1.216 8.731 -1.411 c
+8.878 -1.598 9.099 -1.691 9.392 -1.691 c
+12.141 1.396 m
+12.395 1.72 12.715 1.881 13.097 1.881 c
+13.803 1.881 14.159 1.411 14.169 0.47 c
+14.169 -2.175 l
+13.523 -2.175 l
+13.523 0.441 l
+13.523 0.754 13.468 0.974 13.361 1.103 c
+13.251 1.228 13.097 1.294 12.891 1.294 c
+12.733 1.294 12.586 1.239 12.45 1.132 c
+12.322 1.022 12.218 0.886 12.141 0.721 c
+12.141 -2.175 l
+11.495 -2.175 l
+11.495 3.469 l
+12.141 3.469 l
+h
+17.169 -2.175 m
+17.128 -2.087 17.103 -1.94 17.095 -1.735 c
+16.86 -2.08 16.565 -2.249 16.213 -2.249 c
+15.85 -2.249 15.566 -2.153 15.36 -1.955 c
+15.162 -1.749 15.067 -1.463 15.067 -1.087 c
+15.067 -0.687 15.202 -0.368 15.478 -0.133 c
+15.75 0.11 16.125 0.235 16.596 0.235 c
+17.08 0.235 l
+17.08 0.661 l
+17.08 0.897 17.026 1.062 16.918 1.161 c
+16.808 1.268 16.646 1.323 16.434 1.323 c
+16.235 1.323 16.074 1.264 15.948 1.147 c
+15.831 1.029 15.772 0.882 15.772 0.706 c
+15.125 0.706 l
+15.125 0.9 15.185 1.091 15.302 1.278 c
+15.426 1.463 15.588 1.61 15.787 1.72 c
+15.993 1.827 16.22 1.881 16.478 1.881 c
+16.878 1.881 17.184 1.779 17.389 1.573 c
+17.602 1.367 17.716 1.073 17.727 0.691 c
+17.727 -1.323 l
+17.727 -1.627 17.764 -1.893 17.845 -2.117 c
+17.845 -2.175 l
+h
+16.301 -1.661 m
+16.467 -1.661 16.617 -1.617 16.756 -1.529 c
+16.904 -1.44 17.01 -1.33 17.08 -1.191 c
+17.08 -0.25 l
+16.713 -0.25 l
+16.397 -0.25 16.154 -0.32 15.978 -0.455 c
+15.802 -0.584 15.713 -0.771 15.713 -1.014 c
+15.713 -1.242 15.757 -1.407 15.846 -1.514 c
+15.933 -1.613 16.085 -1.661 16.301 -1.661 c
+19.343 1.808 m
+19.359 1.367 l
+19.613 1.709 19.935 1.881 20.328 1.881 c
+21.034 1.881 21.391 1.411 21.402 0.47 c
+21.402 -2.175 l
+20.755 -2.175 l
+20.755 0.441 l
+20.755 0.754 20.7 0.974 20.594 1.103 c
+20.483 1.228 20.328 1.294 20.123 1.294 c
+19.965 1.294 19.818 1.239 19.682 1.132 c
+19.553 1.022 19.451 0.886 19.374 0.721 c
+19.374 -2.175 l
+18.726 -2.175 l
+18.726 1.808 l
+h
+22.24 0 m
+22.24 0.617 22.35 1.081 22.578 1.396 c
+22.802 1.72 23.137 1.881 23.577 1.881 c
+23.978 1.881 24.282 1.706 24.488 1.353 c
+24.533 1.808 l
+25.121 1.808 l
+25.121 -2.219 l
+25.121 -2.708 24.992 -3.087 24.739 -3.351 c
+24.481 -3.616 24.128 -3.748 23.68 -3.748 c
+23.482 -3.748 23.262 -3.697 23.019 -3.601 c
+22.772 -3.502 22.593 -3.381 22.475 -3.233 c
+22.74 -2.793 l
+23.004 -3.057 23.301 -3.19 23.636 -3.19 c
+24.172 -3.19 24.448 -2.896 24.459 -2.308 c
+24.459 -1.779 l
+24.253 -2.094 23.952 -2.249 23.563 -2.249 c
+23.151 -2.249 22.828 -2.098 22.593 -1.793 c
+22.364 -1.481 22.247 -1.029 22.24 -0.441 c
+h
+22.901 -0.382 m
+22.901 -0.823 22.963 -1.153 23.092 -1.367 c
+23.217 -1.573 23.434 -1.675 23.739 -1.675 c
+24.062 -1.675 24.301 -1.51 24.459 -1.176 c
+24.459 0.808 l
+24.29 1.132 24.051 1.294 23.739 1.294 c
+23.445 1.294 23.228 1.191 23.092 0.985 c
+22.963 0.779 22.901 0.455 22.901 0.015 c
+h
+27.502 -2.249 m
+27.002 -2.249 26.62 -2.102 26.356 -1.808 c
+26.09 -1.514 25.959 -1.08 25.959 -0.5 c
+25.959 -0.029 l
+25.959 0.566 26.084 1.033 26.341 1.367 c
+26.605 1.709 26.965 1.881 27.428 1.881 c
+27.888 1.881 28.23 1.727 28.457 1.426 c
+28.693 1.132 28.814 0.669 28.825 0.044 c
+28.825 -0.382 l
+26.605 -0.382 l
+26.605 -0.47 l
+26.605 -0.904 26.682 -1.216 26.84 -1.411 c
+27.006 -1.598 27.237 -1.691 27.532 -1.691 c
+27.726 -1.691 27.899 -1.658 28.045 -1.587 c
+28.193 -1.51 28.328 -1.392 28.457 -1.234 c
+28.795 -1.646 l
+28.509 -2.051 28.079 -2.249 27.502 -2.249 c
+27.428 1.323 m
+27.153 1.323 26.95 1.228 26.826 1.043 c
+26.697 0.856 26.624 0.566 26.605 0.177 c
+28.178 0.177 l
+28.178 0.264 l
+28.156 0.647 28.09 0.915 27.972 1.073 c
+27.854 1.239 27.671 1.323 27.428 1.323 c
+31.544 -1.161 m
+31.544 -1.014 31.489 -0.893 31.382 -0.794 c
+31.272 -0.698 31.066 -0.58 30.765 -0.441 c
+30.42 -0.294 30.177 -0.172 30.03 -0.073 c
+29.884 0.033 29.773 0.151 29.707 0.279 c
+29.637 0.405 29.604 0.563 29.604 0.75 c
+29.604 1.073 29.722 1.341 29.957 1.558 c
+30.192 1.771 30.493 1.881 30.868 1.881 c
+31.25 1.881 31.559 1.768 31.794 1.544 c
+32.029 1.316 32.147 1.029 32.147 0.676 c
+31.5 0.676 l
+31.5 0.852 31.441 1.004 31.324 1.132 c
+31.206 1.257 31.052 1.323 30.868 1.323 c
+30.67 1.323 30.519 1.268 30.412 1.161 c
+30.302 1.062 30.25 0.929 30.25 0.765 c
+30.25 0.636 30.287 0.53 30.368 0.441 c
+30.445 0.36 30.636 0.258 30.942 0.133 c
+31.419 -0.055 31.75 -0.243 31.926 -0.426 c
+32.103 -0.603 32.191 -0.831 32.191 -1.103 c
+32.191 -1.455 32.066 -1.735 31.823 -1.94 c
+31.588 -2.146 31.272 -2.249 30.883 -2.249 c
+30.46 -2.249 30.122 -2.132 29.869 -1.897 c
+29.612 -1.654 29.487 -1.348 29.487 -0.985 c
+30.133 -0.985 l
+30.14 -1.213 30.21 -1.389 30.339 -1.514 c
+30.464 -1.631 30.647 -1.691 30.883 -1.691 c
+31.096 -1.691 31.258 -1.643 31.368 -1.544 c
+31.486 -1.448 31.544 -1.319 31.544 -1.161 c
+33.073 -1.822 m
+33.073 -1.705 33.106 -1.61 33.176 -1.529 c
+33.242 -1.452 33.344 -1.411 33.485 -1.411 c
+33.631 -1.411 33.738 -1.452 33.807 -1.529 c
+33.885 -1.61 33.925 -1.705 33.925 -1.822 c
+33.925 -1.933 33.885 -2.024 33.807 -2.102 c
+33.738 -2.179 33.631 -2.219 33.485 -2.219 c
+33.344 -2.219 33.242 -2.179 33.176 -2.102 c
+33.106 -2.024 33.073 -1.933 33.073 -1.822 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+35.668 310.736 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 84.2441 302.125 cm
+0 0 m
+0 -0.463 -0.099 -0.867 -0.294 -1.22 c
+-0.492 -1.565 -0.756 -1.845 -1.087 -2.057 c
+-0.706 -2.275 -0.404 -2.572 -0.176 -2.954 c
+0.048 -3.337 0.162 -3.788 0.162 -4.307 c
+0.162 -5.14 -0.081 -5.802 -0.558 -6.291 c
+-1.04 -6.772 -1.697 -7.011 -2.528 -7.011 c
+-3.351 -7.011 -4.008 -6.772 -4.498 -6.291 c
+-4.99 -5.802 -5.232 -5.14 -5.232 -4.307 c
+-5.232 -3.788 -5.126 -3.337 -4.909 -2.954 c
+-4.685 -2.572 -4.376 -2.275 -3.983 -2.057 c
+-4.328 -1.845 -4.596 -1.565 -4.791 -1.22 c
+-4.979 -0.867 -5.071 -0.463 -5.071 0 c
+-5.071 0.813 -4.847 1.448 -4.395 1.912 c
+-3.935 2.382 -3.318 2.617 -2.543 2.617 c
+-1.76 2.617 -1.142 2.382 -0.691 1.912 c
+-0.231 1.441 0 0.802 0 0 c
+-2.528 -5.497 m
+-2.256 -5.497 -2.043 -5.379 -1.896 -5.144 c
+-1.749 -4.909 -1.675 -4.586 -1.675 -4.174 c
+-1.675 -3.755 -1.756 -3.424 -1.911 -3.189 c
+-2.057 -2.954 -2.271 -2.836 -2.543 -2.836 c
+-2.807 -2.836 -3.021 -2.954 -3.175 -3.189 c
+-3.333 -3.424 -3.41 -3.755 -3.41 -4.174 c
+-3.41 -4.586 -3.333 -4.909 -3.175 -5.144 c
+-3.021 -5.379 -2.803 -5.497 -2.528 -5.497 c
+-1.822 -0.103 m
+-1.822 0.258 -1.881 0.548 -1.999 0.765 c
+-2.117 0.989 -2.3 1.103 -2.543 1.103 c
+-2.77 1.103 -2.946 0.992 -3.072 0.779 c
+-3.189 0.574 -3.248 0.279 -3.248 -0.103 c
+-3.248 -0.467 -3.189 -0.76 -3.072 -0.985 c
+-2.946 -1.213 -2.763 -1.323 -2.528 -1.323 c
+-2.285 -1.323 -2.109 -1.213 -1.999 -0.985 c
+-1.881 -0.76 -1.822 -0.467 -1.822 -0.103 c
+1.798 -5.953 m
+1.798 -5.659 1.893 -5.42 2.091 -5.232 c
+2.286 -5.049 2.54 -4.953 2.856 -4.953 c
+3.157 -4.953 3.406 -5.049 3.605 -5.232 c
+3.811 -5.42 3.914 -5.659 3.914 -5.953 c
+3.914 -6.258 3.811 -6.504 3.605 -6.688 c
+3.406 -6.865 3.157 -6.952 2.856 -6.952 c
+2.55 -6.952 2.297 -6.861 2.091 -6.673 c
+1.893 -6.489 1.798 -6.246 1.798 -5.953 c
+12.755 -4.424 m
+12.755 -4.042 12.657 -3.755 12.461 -3.557 c
+12.263 -3.362 11.911 -3.16 11.403 -2.954 c
+10.462 -2.594 9.786 -2.175 9.374 -1.705 c
+8.963 -1.227 8.757 -0.658 8.757 0 c
+8.757 0.783 9.037 1.415 9.596 1.897 c
+10.153 2.374 10.863 2.617 11.726 2.617 c
+12.303 2.617 12.818 2.492 13.27 2.249 c
+13.718 2.003 14.064 1.661 14.299 1.22 c
+14.541 0.779 14.666 0.279 14.666 -0.279 c
+12.785 -0.279 l
+12.785 0.162 12.69 0.493 12.505 0.721 c
+12.318 0.944 12.05 1.058 11.697 1.058 c
+11.362 1.058 11.102 0.96 10.918 0.765 c
+10.741 0.578 10.654 0.316 10.654 -0.014 c
+10.654 -0.272 10.756 -0.507 10.962 -0.72 c
+11.168 -0.926 11.528 -1.142 12.05 -1.367 c
+12.962 -1.691 13.623 -2.094 14.034 -2.572 c
+14.454 -3.054 14.666 -3.667 14.666 -4.409 c
+14.666 -5.225 14.406 -5.861 13.887 -6.32 c
+13.365 -6.784 12.66 -7.011 11.771 -7.011 c
+11.161 -7.011 10.61 -6.886 10.109 -6.643 c
+9.617 -6.39 9.231 -6.034 8.948 -5.571 c
+8.661 -5.101 8.522 -4.552 8.522 -3.925 c
+10.419 -3.925 l
+10.419 -4.465 10.521 -4.858 10.727 -5.101 c
+10.94 -5.346 11.289 -5.468 11.771 -5.468 c
+12.424 -5.468 12.755 -5.122 12.755 -4.424 c
+18.955 -1.72 m
+20.366 2.484 l
+22.423 2.484 l
+19.91 -3.484 l
+19.91 -6.879 l
+17.999 -6.879 l
+17.999 -3.484 l
+15.486 2.484 l
+17.544 2.484 l
+h
+30.042 -6.879 m
+28.145 -6.879 l
+25.382 -0.735 l
+25.382 -6.879 l
+23.486 -6.879 l
+23.486 2.484 l
+25.382 2.484 l
+28.145 -3.659 l
+28.145 2.484 l
+30.042 2.484 l
+h
+38.144 -3.763 m
+38.093 -4.832 37.791 -5.641 37.233 -6.188 c
+36.682 -6.739 35.91 -7.011 34.911 -7.011 c
+33.841 -7.011 33.022 -6.666 32.456 -5.967 c
+31.898 -5.273 31.618 -4.278 31.618 -2.984 c
+31.618 -1.411 l
+31.618 -0.118 31.904 0.875 32.486 1.573 c
+33.074 2.268 33.885 2.617 34.925 2.617 c
+35.943 2.617 36.719 2.326 37.248 1.75 c
+37.777 1.18 38.078 0.36 38.159 -0.706 c
+36.263 -0.706 l
+36.241 -0.04 36.138 0.416 35.954 0.661 c
+35.767 0.915 35.425 1.044 34.925 1.044 c
+34.425 1.044 34.065 0.867 33.852 0.515 c
+33.646 0.162 33.533 -0.422 33.514 -1.234 c
+33.514 -2.998 l
+33.514 -3.931 33.617 -4.571 33.823 -4.924 c
+34.036 -5.269 34.4 -5.438 34.911 -5.438 c
+35.399 -5.438 35.738 -5.321 35.925 -5.086 c
+36.12 -4.843 36.226 -4.402 36.249 -3.763 c
+h
+46.09 -6.879 m
+44.208 -6.879 l
+44.208 -2.866 l
+41.415 -2.866 l
+41.415 -6.879 l
+39.519 -6.879 l
+39.519 2.484 l
+41.415 2.484 l
+41.415 -1.308 l
+44.208 -1.308 l
+44.208 2.484 l
+46.09 2.484 l
+h
+50.664 -3.454 m
+49.724 -3.454 l
+49.724 -6.879 l
+47.842 -6.879 l
+47.842 2.484 l
+50.855 2.484 l
+51.804 2.484 52.535 2.238 53.045 1.75 c
+53.564 1.257 53.824 0.563 53.824 -0.338 c
+53.824 -1.583 53.373 -2.454 52.473 -2.954 c
+54.104 -6.79 l
+54.104 -6.879 l
+52.076 -6.879 l
+h
+49.724 -1.881 m
+50.796 -1.881 l
+51.179 -1.881 51.462 -1.76 51.649 -1.514 c
+51.833 -1.26 51.929 -0.922 51.929 -0.5 c
+51.929 0.441 51.565 0.912 50.84 0.912 c
+49.724 0.912 l
+h
+61.942 -3.042 m
+61.942 -4.299 61.641 -5.273 61.046 -5.967 c
+60.446 -6.666 59.623 -7.011 58.576 -7.011 c
+57.525 -7.011 56.698 -6.669 56.092 -5.982 c
+55.493 -5.288 55.188 -4.321 55.181 -3.087 c
+55.181 -1.484 l
+55.181 -0.201 55.478 0.802 56.077 1.529 c
+56.673 2.253 57.503 2.617 58.561 2.617 c
+59.598 2.617 60.417 2.257 61.016 1.544 c
+61.622 0.838 61.931 -0.158 61.942 -1.44 c
+h
+60.046 -1.469 m
+60.046 -0.628 59.921 0 59.679 0.412 c
+59.443 0.823 59.068 1.029 58.561 1.029 c
+58.061 1.029 57.687 0.827 57.444 0.426 c
+57.209 0.034 57.084 -0.565 57.077 -1.367 c
+57.077 -3.042 l
+57.077 -3.858 57.198 -4.461 57.444 -4.85 c
+57.687 -5.244 58.065 -5.438 58.576 -5.438 c
+59.065 -5.438 59.428 -5.247 59.664 -4.866 c
+59.906 -4.483 60.035 -3.895 60.046 -3.102 c
+h
+70.075 -6.879 m
+68.178 -6.879 l
+65.415 -0.735 l
+65.415 -6.879 l
+63.519 -6.879 l
+63.519 2.484 l
+65.415 2.484 l
+68.178 -3.659 l
+68.178 2.484 l
+70.075 2.484 l
+h
+73.811 -6.879 -1.896 9.363 re
+77.472 -5.306 m
+81.323 -5.306 l
+81.323 -6.879 l
+75.253 -6.879 l
+75.253 -5.747 l
+79.074 0.912 l
+75.222 0.912 l
+75.222 2.484 l
+81.25 2.484 l
+81.25 1.367 l
+h
+84.685 -6.879 -1.897 9.363 re
+92.935 -6.879 m
+91.039 -6.879 l
+88.275 -0.735 l
+88.275 -6.879 l
+86.38 -6.879 l
+86.38 2.484 l
+88.275 2.484 l
+91.039 -3.659 l
+91.039 2.484 l
+92.935 2.484 l
+h
+101.049 -5.82 m
+100.685 -6.214 100.24 -6.512 99.712 -6.717 c
+99.182 -6.912 98.602 -7.011 97.977 -7.011 c
+96.896 -7.011 96.059 -6.68 95.463 -6.011 c
+94.864 -5.346 94.559 -4.376 94.552 -3.102 c
+94.552 -1.411 l
+94.552 -0.118 94.831 0.875 95.39 1.573 c
+95.955 2.268 96.779 2.617 97.859 2.617 c
+98.877 2.617 99.641 2.359 100.152 1.852 c
+100.67 1.353 100.968 0.566 101.049 -0.5 c
+99.211 -0.5 l
+99.161 0.096 99.039 0.504 98.844 0.721 c
+98.646 0.934 98.337 1.044 97.918 1.044 c
+97.407 1.044 97.036 0.857 96.801 0.485 c
+96.573 0.111 96.456 -0.481 96.448 -1.294 c
+96.448 -2.998 l
+96.448 -3.85 96.573 -4.475 96.83 -4.866 c
+97.084 -5.247 97.499 -5.438 98.08 -5.438 c
+98.451 -5.438 98.756 -5.365 98.991 -5.218 c
+99.153 -5.101 l
+99.153 -3.38 l
+97.83 -3.38 l
+97.83 -1.955 l
+101.049 -1.955 l
+h
+108.582 -3.454 m
+107.641 -3.454 l
+107.641 -6.879 l
+105.76 -6.879 l
+105.76 2.484 l
+108.773 2.484 l
+109.721 2.484 110.453 2.238 110.964 1.75 c
+111.481 1.257 111.743 0.563 111.743 -0.338 c
+111.743 -1.583 111.29 -2.454 110.39 -2.954 c
+112.021 -6.79 l
+112.021 -6.879 l
+109.993 -6.879 l
+h
+107.641 -1.881 m
+108.715 -1.881 l
+109.097 -1.881 109.38 -1.76 109.567 -1.514 c
+109.75 -1.26 109.846 -0.922 109.846 -0.5 c
+109.846 0.441 109.482 0.912 108.759 0.912 c
+107.641 0.912 l
+h
+118.097 -2.822 m
+115.157 -2.822 l
+115.157 -5.306 l
+118.64 -5.306 l
+118.64 -6.879 l
+113.26 -6.879 l
+113.26 2.484 l
+118.625 2.484 l
+118.625 0.912 l
+115.157 0.912 l
+115.157 -1.308 l
+118.097 -1.308 l
+h
+121.797 -3.586 m
+121.797 -6.879 l
+119.901 -6.879 l
+119.901 2.484 l
+123.09 2.484 l
+124.02 2.484 124.759 2.194 125.31 1.617 c
+125.858 1.048 126.132 0.302 126.132 -0.617 c
+126.132 -1.529 125.858 -2.256 125.31 -2.792 c
+124.769 -3.322 124.02 -3.586 123.061 -3.586 c
+h
+121.797 -2.013 m
+123.09 -2.013 l
+123.45 -2.013 123.73 -1.896 123.928 -1.66 c
+124.123 -1.425 124.222 -1.084 124.222 -0.632 c
+124.222 -0.162 124.119 0.21 123.913 0.485 c
+123.715 0.757 123.45 0.9 123.119 0.912 c
+121.797 0.912 l
+h
+134.199 -3.042 m
+134.199 -4.299 133.897 -5.273 133.303 -5.967 c
+132.704 -6.666 131.88 -7.011 130.833 -7.011 c
+129.782 -7.011 128.955 -6.669 128.349 -5.982 c
+127.75 -5.288 127.445 -4.321 127.437 -3.087 c
+127.437 -1.484 l
+127.437 -0.201 127.735 0.802 128.334 1.529 c
+128.929 2.253 129.76 2.617 130.818 2.617 c
+131.855 2.617 132.674 2.257 133.273 1.544 c
+133.879 0.838 134.188 -0.158 134.199 -1.44 c
+h
+132.303 -1.469 m
+132.303 -0.628 132.178 0 131.935 0.412 c
+131.7 0.823 131.325 1.029 130.818 1.029 c
+130.319 1.029 129.943 0.827 129.701 0.426 c
+129.465 0.034 129.341 -0.565 129.334 -1.367 c
+129.334 -3.042 l
+129.334 -3.858 129.455 -4.461 129.701 -4.85 c
+129.943 -5.244 130.322 -5.438 130.833 -5.438 c
+131.322 -5.438 131.686 -5.247 131.921 -4.866 c
+132.164 -4.483 132.291 -3.895 132.303 -3.102 c
+h
+139.73 -4.424 m
+139.73 -4.042 139.63 -3.755 139.435 -3.557 c
+139.237 -3.362 138.884 -3.16 138.377 -2.954 c
+137.436 -2.594 136.76 -2.175 136.349 -1.705 c
+135.937 -1.227 135.732 -0.658 135.732 0 c
+135.732 0.783 136.01 1.415 136.569 1.897 c
+137.128 2.374 137.837 2.617 138.701 2.617 c
+139.277 2.617 139.792 2.492 140.244 2.249 c
+140.692 2.003 141.038 1.661 141.273 1.22 c
+141.515 0.779 141.641 0.279 141.641 -0.279 c
+139.759 -0.279 l
+139.759 0.162 139.663 0.493 139.48 0.721 c
+139.292 0.944 139.024 1.058 138.672 1.058 c
+138.337 1.058 138.076 0.96 137.892 0.765 c
+137.716 0.578 137.627 0.316 137.627 -0.014 c
+137.627 -0.272 137.731 -0.507 137.936 -0.72 c
+138.142 -0.926 138.502 -1.142 139.024 -1.367 c
+139.935 -1.691 140.597 -2.094 141.008 -2.572 c
+141.427 -3.054 141.641 -3.667 141.641 -4.409 c
+141.641 -5.225 141.38 -5.861 140.862 -6.32 c
+140.339 -6.784 139.634 -7.011 138.745 -7.011 c
+138.134 -7.011 137.583 -6.886 137.084 -6.643 c
+136.592 -6.39 136.206 -6.034 135.923 -5.571 c
+135.636 -5.101 135.497 -4.552 135.497 -3.925 c
+137.392 -3.925 l
+137.392 -4.465 137.496 -4.858 137.701 -5.101 c
+137.914 -5.346 138.263 -5.468 138.745 -5.468 c
+139.399 -5.468 139.73 -5.122 139.73 -4.424 c
+145.087 -6.879 -1.897 9.363 re
+152.669 0.912 m
+150.346 0.912 l
+150.346 -6.879 l
+148.45 -6.879 l
+148.45 0.912 l
+146.171 0.912 l
+146.171 2.484 l
+152.669 2.484 l
+h
+160.367 -3.042 m
+160.367 -4.299 160.066 -5.273 159.47 -5.967 c
+158.871 -6.666 158.048 -7.011 157.001 -7.011 c
+155.95 -7.011 155.123 -6.669 154.516 -5.982 c
+153.918 -5.288 153.612 -4.321 153.606 -3.087 c
+153.606 -1.484 l
+153.606 -0.201 153.903 0.802 154.502 1.529 c
+155.098 2.253 155.928 2.617 156.986 2.617 c
+158.023 2.617 158.842 2.257 159.441 1.544 c
+160.047 0.838 160.356 -0.158 160.367 -1.44 c
+h
+158.471 -1.469 m
+158.471 -0.628 158.346 0 158.103 0.412 c
+157.868 0.823 157.493 1.029 156.986 1.029 c
+156.486 1.029 156.112 0.827 155.869 0.426 c
+155.634 0.034 155.509 -0.565 155.501 -1.367 c
+155.501 -3.042 l
+155.501 -3.858 155.623 -4.461 155.869 -4.85 c
+156.112 -5.244 156.49 -5.438 157.001 -5.438 c
+157.49 -5.438 157.853 -5.247 158.088 -4.866 c
+158.331 -4.483 158.46 -3.895 158.471 -3.102 c
+h
+164.781 -3.454 m
+163.84 -3.454 l
+163.84 -6.879 l
+161.959 -6.879 l
+161.959 2.484 l
+164.972 2.484 l
+165.919 2.484 166.651 2.238 167.162 1.75 c
+167.68 1.257 167.941 0.563 167.941 -0.338 c
+167.941 -1.583 167.488 -2.454 166.588 -2.954 c
+168.22 -6.79 l
+168.22 -6.879 l
+166.192 -6.879 l
+h
+163.84 -1.881 m
+164.913 -1.881 l
+165.294 -1.881 165.578 -1.76 165.765 -1.514 c
+165.949 -1.26 166.044 -0.922 166.044 -0.5 c
+166.044 0.441 165.681 0.912 164.957 0.912 c
+163.84 0.912 l
+h
+171.443 -6.879 -1.897 9.363 re
+177.969 -2.822 m
+175.029 -2.822 l
+175.029 -5.306 l
+178.513 -5.306 l
+178.513 -6.879 l
+173.133 -6.879 l
+173.133 2.484 l
+178.499 2.484 l
+178.499 0.912 l
+175.029 0.912 l
+175.029 -1.308 l
+177.969 -1.308 l
+h
+183.731 -4.424 m
+183.731 -4.042 183.632 -3.755 183.438 -3.557 c
+183.239 -3.362 182.886 -3.16 182.379 -2.954 c
+181.439 -2.594 180.762 -2.175 180.35 -1.705 c
+179.939 -1.227 179.733 -0.658 179.733 0 c
+179.733 0.783 180.012 1.415 180.571 1.897 c
+181.129 2.374 181.838 2.617 182.702 2.617 c
+183.28 2.617 183.793 2.492 184.246 2.249 c
+184.693 2.003 185.04 1.661 185.275 1.22 c
+185.518 0.779 185.642 0.279 185.642 -0.279 c
+183.76 -0.279 l
+183.76 0.162 183.665 0.493 183.481 0.721 c
+183.294 0.944 183.026 1.058 182.673 1.058 c
+182.339 1.058 182.077 0.96 181.894 0.765 c
+181.717 0.578 181.629 0.316 181.629 -0.014 c
+181.629 -0.272 181.732 -0.507 181.938 -0.72 c
+182.144 -0.926 182.503 -1.142 183.026 -1.367 c
+183.937 -1.691 184.598 -2.094 185.01 -2.572 c
+185.429 -3.054 185.642 -3.667 185.642 -4.409 c
+185.642 -5.225 185.381 -5.861 184.863 -6.32 c
+184.342 -6.784 183.636 -7.011 182.746 -7.011 c
+182.137 -7.011 181.585 -6.886 181.086 -6.643 c
+180.593 -6.39 180.207 -6.034 179.924 -5.571 c
+179.638 -5.101 179.498 -4.552 179.498 -3.925 c
+181.394 -3.925 l
+181.394 -4.465 181.497 -4.858 181.703 -5.101 c
+181.915 -5.346 182.264 -5.468 182.746 -5.468 c
+183.401 -5.468 183.731 -5.122 183.731 -4.424 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 280.433 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 273.5943 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.765 1.602 m
+22.765 -1.264 l
+21.868 -1.264 l
+21.868 1.602 l
+21.045 1.602 l
+21.045 2.22 l
+21.868 2.22 l
+21.868 2.484 l
+21.868 2.61 21.883 2.741 21.913 2.882 c
+21.949 3.017 22.02 3.135 22.119 3.234 c
+22.225 3.341 22.369 3.429 22.545 3.499 c
+22.722 3.564 22.946 3.601 23.221 3.601 c
+23.434 3.601 23.632 3.591 23.809 3.572 c
+23.985 3.55 24.137 3.532 24.264 3.514 c
+24.264 2.926 l
+24.137 2.944 23.993 2.959 23.838 2.969 c
+23.68 2.976 23.53 2.984 23.383 2.984 c
+23.254 2.984 23.152 2.969 23.074 2.94 c
+22.994 2.911 22.931 2.87 22.883 2.822 c
+22.832 2.771 22.799 2.708 22.78 2.631 c
+22.769 2.562 22.765 2.484 22.765 2.396 c
+22.765 2.22 l
+24.191 2.22 l
+24.191 1.602 l
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.029 25.518 -0.881 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.181 25.047 0.485 c
+25.047 0.816 25.091 1.095 25.18 1.323 c
+25.275 1.558 25.404 1.742 25.562 1.881 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.132 c
+27.664 2.043 27.829 1.911 27.958 1.735 c
+28.094 1.565 28.193 1.36 28.252 1.118 c
+28.318 0.882 28.355 0.617 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.023 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.441 c
+26.26 -0.529 26.344 -0.598 26.444 -0.646 c
+26.539 -0.698 26.653 -0.72 26.782 -0.72 c
+26.936 -0.72 27.076 -0.687 27.194 -0.617 c
+27.318 -0.551 27.407 -0.448 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.481 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.918 27.825 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.649 1.706 26.562 1.69 26.473 1.661 c
+26.385 1.632 26.304 1.58 26.238 1.515 c
+26.169 1.444 26.109 1.357 26.061 1.249 c
+26.021 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.004 27.447 1.125 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.706 26.738 1.706 c
+29.843 1.602 m
+29.299 1.602 l
+29.299 2.22 l
+29.887 2.22 l
+30.167 3.117 l
+30.74 3.117 l
+30.74 2.22 l
+31.975 2.22 l
+31.975 1.602 l
+30.74 1.602 l
+30.74 -0.103 l
+30.74 -0.324 l
+30.747 -0.393 30.769 -0.455 30.799 -0.515 c
+30.836 -0.565 30.89 -0.61 30.96 -0.646 c
+31.037 -0.676 31.152 -0.69 31.298 -0.69 c
+31.434 -0.69 31.57 -0.687 31.71 -0.676 c
+31.846 -0.658 31.978 -0.632 32.106 -0.602 c
+32.106 -1.205 l
+32.026 -1.216 31.948 -1.23 31.871 -1.249 c
+31.79 -1.261 31.713 -1.267 31.636 -1.278 c
+31.555 -1.286 31.467 -1.294 31.372 -1.294 c
+31.283 -1.301 31.185 -1.308 31.077 -1.308 c
+30.89 -1.308 30.728 -1.294 30.593 -1.264 c
+30.464 -1.227 30.35 -1.183 30.254 -1.132 c
+30.167 -1.084 30.093 -1.025 30.034 -0.955 c
+29.976 -0.878 29.932 -0.801 29.901 -0.72 c
+29.872 -0.632 29.851 -0.544 29.843 -0.455 c
+29.832 -0.36 29.828 -0.264 29.828 -0.176 c
+h
+34.863 -1.323 m
+34.576 -1.323 34.333 -1.282 34.128 -1.205 c
+33.922 -1.117 33.749 -0.995 33.614 -0.837 c
+33.473 -0.683 33.371 -0.496 33.305 -0.279 c
+33.234 -0.055 33.202 0.191 33.202 0.456 c
+33.202 0.75 33.234 1.008 33.305 1.235 c
+33.382 1.459 33.488 1.646 33.628 1.793 c
+33.775 1.948 33.951 2.066 34.157 2.146 c
+34.363 2.234 34.599 2.278 34.863 2.278 c
+35.087 2.278 35.289 2.249 35.465 2.19 c
+35.642 2.132 35.792 2.047 35.921 1.941 c
+36.046 1.841 36.149 1.72 36.23 1.573 c
+36.307 1.434 36.362 1.283 36.392 1.118 c
+35.48 1.073 l
+35.451 1.249 35.381 1.389 35.274 1.5 c
+35.175 1.606 35.032 1.661 34.848 1.661 c
+34.602 1.661 34.425 1.558 34.319 1.353 c
+34.209 1.154 34.157 0.867 34.157 0.485 c
+34.157 -0.309 34.392 -0.706 34.863 -0.706 c
+35.028 -0.706 35.171 -0.654 35.289 -0.544 c
+35.407 -0.437 35.48 -0.276 35.509 -0.058 c
+36.421 -0.103 l
+36.392 -0.272 36.336 -0.426 36.259 -0.573 c
+36.189 -0.72 36.087 -0.852 35.95 -0.97 c
+35.821 -1.08 35.663 -1.168 35.48 -1.234 c
+35.304 -1.294 35.098 -1.323 34.863 -1.323 c
+38.262 1.515 m
+38.379 1.786 38.53 1.985 38.718 2.103 c
+38.901 2.22 39.122 2.278 39.379 2.278 c
+39.584 2.278 39.754 2.242 39.894 2.176 c
+40.041 2.106 40.151 2.014 40.232 1.897 c
+40.32 1.779 40.378 1.636 40.408 1.47 c
+40.444 1.301 40.467 1.125 40.467 0.941 c
+40.467 -1.264 l
+39.555 -1.264 l
+39.555 0.735 l
+39.555 0.871 39.544 0.992 39.526 1.103 c
+39.515 1.209 39.489 1.297 39.453 1.367 c
+39.412 1.444 39.353 1.503 39.276 1.544 c
+39.206 1.58 39.114 1.602 38.996 1.602 c
+38.886 1.602 38.791 1.577 38.703 1.529 c
+38.615 1.478 38.534 1.411 38.468 1.323 c
+38.409 1.235 38.358 1.125 38.321 1 c
+38.291 0.882 38.277 0.75 38.277 0.603 c
+38.277 -1.264 l
+37.365 -1.264 l
+37.365 3.514 l
+38.277 3.514 l
+38.277 2.205 l
+38.277 2.135 38.269 2.066 38.262 1.999 c
+38.262 1.793 l
+38.262 1.735 38.254 1.679 38.248 1.632 c
+38.248 1.515 l
+h
+46.236 -2.631 m
+46.236 3.514 l
+48.162 3.514 l
+48.162 2.896 l
+47.089 2.896 l
+47.089 -2.013 l
+48.162 -2.013 l
+48.162 -2.631 l
+h
+52.56 1.47 m
+52.461 1.478 52.359 1.488 52.251 1.5 c
+52.141 1.518 52.02 1.529 51.885 1.529 c
+51.708 1.529 51.55 1.488 51.414 1.411 c
+51.274 1.341 51.156 1.243 51.061 1.118 c
+50.973 0.989 50.903 0.842 50.855 0.676 c
+50.815 0.507 50.796 0.331 50.796 0.147 c
+50.796 -1.264 l
+49.9 -1.264 l
+49.9 0.985 l
+49.9 1.11 49.889 1.235 49.87 1.353 c
+49.859 1.478 49.845 1.595 49.826 1.706 c
+49.815 1.823 49.801 1.918 49.782 1.999 c
+49.76 2.087 49.742 2.161 49.724 2.22 c
+50.605 2.22 l
+50.613 2.168 50.624 2.117 50.635 2.058 c
+50.653 1.999 50.668 1.933 50.679 1.867 c
+50.697 1.808 50.712 1.742 50.723 1.675 c
+50.73 1.606 50.742 1.544 50.752 1.484 c
+50.767 1.484 l
+50.804 1.602 50.855 1.709 50.914 1.808 c
+50.981 1.904 51.061 1.989 51.149 2.058 c
+51.237 2.124 51.341 2.18 51.458 2.22 c
+51.583 2.257 51.73 2.278 51.899 2.278 c
+52.024 2.278 52.141 2.271 52.251 2.263 c
+52.369 2.253 52.473 2.238 52.56 2.22 c
+h
+55.17 -1.323 m
+54.912 -1.323 54.684 -1.286 54.478 -1.22 c
+54.273 -1.143 54.096 -1.029 53.95 -0.881 c
+53.803 -0.727 53.685 -0.536 53.597 -0.309 c
+53.516 -0.085 53.479 0.181 53.479 0.485 c
+53.479 0.816 53.523 1.095 53.612 1.323 c
+53.707 1.558 53.836 1.742 53.994 1.881 c
+54.159 2.018 54.347 2.117 54.553 2.176 c
+54.758 2.242 54.967 2.278 55.184 2.278 c
+55.456 2.278 55.691 2.227 55.889 2.132 c
+56.095 2.043 56.261 1.911 56.39 1.735 c
+56.525 1.565 56.625 1.36 56.683 1.118 c
+56.75 0.882 56.787 0.617 56.787 0.324 c
+56.787 0.309 l
+54.42 0.309 l
+54.42 0.162 54.435 0.023 54.464 -0.103 c
+54.501 -0.231 54.555 -0.345 54.626 -0.441 c
+54.692 -0.529 54.776 -0.598 54.875 -0.646 c
+54.971 -0.698 55.085 -0.72 55.214 -0.72 c
+55.368 -0.72 55.507 -0.687 55.625 -0.617 c
+55.75 -0.551 55.839 -0.448 55.889 -0.309 c
+56.728 -0.382 l
+56.698 -0.481 56.643 -0.588 56.566 -0.706 c
+56.485 -0.816 56.382 -0.918 56.257 -1.014 c
+56.14 -1.103 55.985 -1.176 55.802 -1.234 c
+55.625 -1.294 55.412 -1.323 55.17 -1.323 c
+55.17 1.706 m
+55.081 1.706 54.993 1.69 54.905 1.661 c
+54.817 1.632 54.736 1.58 54.67 1.515 c
+54.6 1.444 54.541 1.357 54.493 1.249 c
+54.453 1.139 54.435 1.014 54.435 0.867 c
+55.904 0.867 l
+55.904 1.004 55.879 1.125 55.831 1.235 c
+55.791 1.341 55.735 1.43 55.669 1.5 c
+55.611 1.565 55.537 1.617 55.449 1.646 c
+55.361 1.683 55.265 1.706 55.17 1.706 c
+58.833 -1.264 m
+58.833 0.852 l
+58.833 1.018 58.826 1.154 58.819 1.264 c
+58.807 1.371 58.789 1.455 58.76 1.515 c
+58.738 1.58 58.709 1.632 58.671 1.661 c
+58.642 1.69 58.601 1.706 58.553 1.706 c
+58.495 1.706 58.44 1.675 58.393 1.617 c
+58.352 1.565 58.318 1.492 58.289 1.397 c
+58.26 1.309 58.235 1.195 58.216 1.058 c
+58.204 0.919 58.201 0.769 58.201 0.603 c
+58.201 -1.264 l
+57.452 -1.264 l
+57.452 1.47 l
+57.452 1.706 l
+57.452 1.926 l
+57.452 2.003 57.444 2.066 57.437 2.117 c
+57.437 2.22 l
+58.113 2.22 l
+58.113 2.132 l
+58.113 1.985 l
+58.121 1.926 58.127 1.867 58.127 1.808 c
+58.127 1.646 l
+58.142 1.646 l
+58.161 1.735 58.19 1.812 58.231 1.881 c
+58.268 1.959 58.312 2.028 58.363 2.087 c
+58.422 2.146 58.488 2.19 58.569 2.22 c
+58.646 2.257 58.734 2.278 58.833 2.278 c
+59.017 2.278 59.157 2.224 59.245 2.117 c
+59.34 2.018 59.411 1.86 59.451 1.646 c
+59.465 1.646 l
+59.502 1.742 59.542 1.831 59.583 1.911 c
+59.631 1.989 59.686 2.051 59.744 2.103 c
+59.804 2.161 59.87 2.205 59.951 2.234 c
+60.028 2.263 60.116 2.278 60.215 2.278 c
+60.351 2.278 60.465 2.253 60.553 2.205 c
+60.641 2.153 60.708 2.08 60.759 1.985 c
+60.818 1.885 60.855 1.756 60.876 1.602 c
+60.905 1.455 60.92 1.272 60.92 1.058 c
+60.92 -1.264 l
+60.2 -1.264 l
+60.2 0.852 l
+60.2 1.018 60.193 1.154 60.186 1.264 c
+60.174 1.371 60.157 1.455 60.126 1.515 c
+60.105 1.58 60.076 1.632 60.039 1.661 c
+60.009 1.69 59.968 1.706 59.921 1.706 c
+59.804 1.706 59.708 1.617 59.642 1.44 c
+59.583 1.272 59.553 1.014 59.553 0.661 c
+59.553 -1.264 l
+h
+64.937 0.485 m
+64.937 0.21 64.901 -0.04 64.834 -0.264 c
+64.764 -0.481 64.662 -0.669 64.525 -0.823 c
+64.386 -0.981 64.209 -1.103 63.997 -1.19 c
+63.779 -1.278 63.526 -1.323 63.232 -1.323 c
+62.956 -1.323 62.71 -1.278 62.497 -1.19 c
+62.291 -1.103 62.119 -0.981 61.982 -0.823 c
+61.843 -0.669 61.74 -0.481 61.674 -0.264 c
+61.604 -0.04 61.57 0.21 61.57 0.485 c
+61.57 0.738 61.601 0.974 61.659 1.191 c
+61.726 1.415 61.828 1.606 61.967 1.764 c
+62.104 1.929 62.28 2.058 62.497 2.146 c
+62.71 2.234 62.967 2.278 63.261 2.278 c
+63.573 2.278 63.835 2.234 64.041 2.146 c
+64.253 2.058 64.427 1.929 64.554 1.764 c
+64.691 1.606 64.79 1.415 64.849 1.191 c
+64.907 0.974 64.937 0.738 64.937 0.485 c
+63.982 0.485 m
+63.982 0.691 63.967 0.867 63.937 1.014 c
+63.916 1.162 63.879 1.283 63.82 1.382 c
+63.761 1.478 63.687 1.548 63.6 1.588 c
+63.511 1.636 63.401 1.661 63.276 1.661 c
+63.012 1.661 62.821 1.562 62.703 1.367 c
+62.586 1.18 62.526 0.886 62.526 0.485 c
+62.526 0.063 62.586 -0.243 62.703 -0.426 c
+62.821 -0.613 62.997 -0.706 63.232 -0.706 c
+63.357 -0.706 63.471 -0.687 63.57 -0.646 c
+63.665 -0.598 63.746 -0.525 63.806 -0.426 c
+63.872 -0.33 63.916 -0.206 63.937 -0.058 c
+63.967 0.088 63.982 0.268 63.982 0.485 c
+66.396 1.602 m
+65.852 1.602 l
+65.852 2.22 l
+66.44 2.22 l
+66.719 3.117 l
+67.293 3.117 l
+67.293 2.22 l
+68.527 2.22 l
+68.527 1.602 l
+67.293 1.602 l
+67.293 -0.103 l
+67.293 -0.324 l
+67.3 -0.393 67.322 -0.455 67.351 -0.515 c
+67.388 -0.565 67.443 -0.61 67.513 -0.646 c
+67.59 -0.676 67.704 -0.69 67.851 -0.69 c
+67.987 -0.69 68.123 -0.687 68.263 -0.676 c
+68.398 -0.658 68.531 -0.632 68.66 -0.602 c
+68.66 -1.205 l
+68.579 -1.216 68.502 -1.23 68.425 -1.249 c
+68.344 -1.261 68.267 -1.267 68.189 -1.278 c
+68.109 -1.286 68.02 -1.294 67.924 -1.294 c
+67.837 -1.301 67.737 -1.308 67.631 -1.308 c
+67.443 -1.308 67.282 -1.294 67.145 -1.264 c
+67.017 -1.227 66.903 -1.183 66.808 -1.132 c
+66.719 -1.084 66.646 -1.025 66.587 -0.955 c
+66.528 -0.878 66.484 -0.801 66.455 -0.72 c
+66.426 -0.632 66.403 -0.544 66.396 -0.455 c
+66.385 -0.36 66.381 -0.264 66.381 -0.176 c
+h
+71.412 -1.323 m
+71.155 -1.323 70.927 -1.286 70.721 -1.22 c
+70.515 -1.143 70.339 -1.029 70.192 -0.881 c
+70.045 -0.727 69.927 -0.536 69.84 -0.309 c
+69.759 -0.085 69.722 0.181 69.722 0.485 c
+69.722 0.816 69.765 1.095 69.854 1.323 c
+69.95 1.558 70.078 1.742 70.236 1.881 c
+70.401 2.018 70.588 2.117 70.794 2.176 c
+71 2.242 71.21 2.278 71.427 2.278 c
+71.698 2.278 71.934 2.227 72.132 2.132 c
+72.338 2.043 72.504 1.911 72.632 1.735 c
+72.768 1.565 72.867 1.36 72.926 1.118 c
+72.992 0.882 73.029 0.617 73.029 0.324 c
+73.029 0.309 l
+70.663 0.309 l
+70.663 0.162 70.677 0.023 70.706 -0.103 c
+70.743 -0.231 70.798 -0.345 70.868 -0.441 c
+70.935 -0.529 71.018 -0.598 71.118 -0.646 c
+71.213 -0.698 71.328 -0.72 71.456 -0.72 c
+71.61 -0.72 71.75 -0.687 71.868 -0.617 c
+71.993 -0.551 72.08 -0.448 72.132 -0.309 c
+72.97 -0.382 l
+72.94 -0.481 72.886 -0.588 72.809 -0.706 c
+72.728 -0.816 72.624 -0.918 72.5 -1.014 c
+72.382 -1.103 72.228 -1.176 72.044 -1.234 c
+71.868 -1.294 71.654 -1.323 71.412 -1.323 c
+71.412 1.706 m
+71.324 1.706 71.236 1.69 71.147 1.661 c
+71.059 1.632 70.978 1.58 70.912 1.515 c
+70.842 1.444 70.783 1.357 70.736 1.249 c
+70.696 1.139 70.677 1.014 70.677 0.867 c
+72.147 0.867 l
+72.147 1.004 72.121 1.125 72.074 1.235 c
+72.033 1.341 71.978 1.43 71.912 1.5 c
+71.853 1.565 71.779 1.617 71.691 1.646 c
+71.603 1.683 71.507 1.706 71.412 1.706 c
+74.285 -2.631 m
+74.285 -2.013 l
+75.359 -2.013 l
+75.359 2.896 l
+74.285 2.896 l
+74.285 3.514 l
+76.211 3.514 l
+76.211 -2.631 l
+h
+f
+Q
+q 1 0 0 1 76.2337 259.8106 cm
+0 0 m
+-1.808 0 l
+-1.808 -2.367 l
+-2.484 -2.367 l
+-2.484 2.984 l
+0.309 2.984 l
+0.309 2.41 l
+-1.808 2.41 l
+-1.808 0.573 l
+0 0.573 l
+h
+2.396 -2.44 m
+1.896 -2.44 1.514 -2.294 1.249 -1.999 c
+0.985 -1.706 0.852 -1.272 0.852 -0.69 c
+0.852 -0.22 l
+0.852 0.374 0.977 0.841 1.234 1.176 c
+1.499 1.517 1.859 1.691 2.323 1.691 c
+2.782 1.691 3.123 1.536 3.351 1.234 c
+3.586 0.941 3.707 0.478 3.719 -0.147 c
+3.719 -0.573 l
+1.499 -0.573 l
+1.499 -0.661 l
+1.499 -1.095 1.577 -1.407 1.734 -1.602 c
+1.899 -1.789 2.131 -1.881 2.425 -1.881 c
+2.62 -1.881 2.793 -1.849 2.94 -1.779 c
+3.087 -1.702 3.223 -1.584 3.351 -1.426 c
+3.69 -1.837 l
+3.403 -2.242 2.973 -2.44 2.396 -2.44 c
+2.323 1.132 m
+2.047 1.132 1.845 1.036 1.72 0.852 c
+1.591 0.665 1.517 0.374 1.499 -0.015 c
+3.072 -0.015 l
+3.072 0.073 l
+3.05 0.455 2.984 0.723 2.866 0.881 c
+2.749 1.047 2.564 1.132 2.323 1.132 c
+5.35 2.572 m
+5.35 1.617 l
+5.953 1.617 l
+5.953 1.087 l
+5.35 1.087 l
+5.35 -1.382 l
+5.35 -1.54 5.373 -1.658 5.423 -1.735 c
+5.483 -1.816 5.571 -1.852 5.689 -1.852 c
+5.776 -1.852 5.865 -1.837 5.953 -1.808 c
+5.953 -2.367 l
+5.806 -2.415 5.652 -2.44 5.497 -2.44 c
+5.24 -2.44 5.045 -2.348 4.91 -2.161 c
+4.77 -1.977 4.704 -1.716 4.704 -1.382 c
+4.704 1.087 l
+4.101 1.087 l
+4.101 1.617 l
+4.704 1.617 l
+4.704 2.572 l
+h
+8.099 -1.881 m
+8.312 -1.881 8.485 -1.819 8.613 -1.691 c
+8.75 -1.554 8.823 -1.363 8.834 -1.118 c
+9.452 -1.118 l
+9.429 -1.5 9.294 -1.819 9.04 -2.072 c
+8.783 -2.319 8.47 -2.44 8.099 -2.44 c
+7.607 -2.44 7.231 -2.29 6.967 -1.984 c
+6.71 -1.672 6.585 -1.205 6.585 -0.588 c
+6.585 -0.147 l
+6.585 0.448 6.71 0.904 6.967 1.22 c
+7.231 1.532 7.607 1.691 8.099 1.691 c
+8.5 1.691 8.819 1.558 9.055 1.294 c
+9.297 1.036 9.429 0.691 9.452 0.25 c
+8.834 0.25 l
+8.812 0.544 8.739 0.764 8.613 0.912 c
+8.496 1.058 8.323 1.132 8.099 1.132 c
+7.805 1.132 7.588 1.033 7.453 0.838 c
+7.312 0.65 7.239 0.341 7.231 -0.088 c
+7.231 -0.603 l
+7.231 -1.073 7.298 -1.407 7.437 -1.602 c
+7.584 -1.789 7.805 -1.881 8.099 -1.881 c
+10.848 1.205 m
+11.102 1.529 11.421 1.691 11.803 1.691 c
+12.509 1.691 12.866 1.22 12.876 0.279 c
+12.876 -2.367 l
+12.23 -2.367 l
+12.23 0.25 l
+12.23 0.563 12.174 0.783 12.068 0.912 c
+11.958 1.036 11.803 1.103 11.597 1.103 c
+11.439 1.103 11.293 1.047 11.156 0.941 c
+11.027 0.831 10.925 0.694 10.848 0.529 c
+10.848 -2.367 l
+10.2 -2.367 l
+10.2 3.278 l
+10.848 3.278 l
+h
+16.933 -1.881 m
+17.146 -1.881 17.319 -1.819 17.448 -1.691 c
+17.583 -1.554 17.657 -1.363 17.668 -1.118 c
+18.285 -1.118 l
+18.264 -1.5 18.127 -1.819 17.874 -2.072 c
+17.616 -2.319 17.304 -2.44 16.933 -2.44 c
+16.44 -2.44 16.066 -2.29 15.802 -1.984 c
+15.544 -1.672 15.419 -1.205 15.419 -0.588 c
+15.419 -0.147 l
+15.419 0.448 15.544 0.904 15.802 1.22 c
+16.066 1.532 16.44 1.691 16.933 1.691 c
+17.334 1.691 17.653 1.558 17.888 1.294 c
+18.131 1.036 18.264 0.691 18.285 0.25 c
+17.668 0.25 l
+17.646 0.544 17.572 0.764 17.448 0.912 c
+17.33 1.058 17.157 1.132 16.933 1.132 c
+16.639 1.132 16.422 1.033 16.286 0.838 c
+16.147 0.65 16.073 0.341 16.066 -0.088 c
+16.066 -0.603 l
+16.066 -1.073 16.132 -1.407 16.272 -1.602 c
+16.419 -1.789 16.639 -1.881 16.933 -1.881 c
+19.682 1.205 m
+19.935 1.529 20.255 1.691 20.637 1.691 c
+21.343 1.691 21.699 1.22 21.71 0.279 c
+21.71 -2.367 l
+21.063 -2.367 l
+21.063 0.25 l
+21.063 0.563 21.009 0.783 20.902 0.912 c
+20.791 1.036 20.637 1.103 20.432 1.103 c
+20.274 1.103 20.126 1.047 19.991 0.941 c
+19.862 0.831 19.759 0.694 19.682 0.529 c
+19.682 -2.367 l
+19.035 -2.367 l
+19.035 3.278 l
+19.682 3.278 l
+h
+24.709 -2.367 m
+24.668 -2.278 24.643 -2.132 24.635 -1.926 c
+24.4 -2.271 24.106 -2.44 23.754 -2.44 c
+23.39 -2.44 23.106 -2.344 22.9 -2.146 c
+22.703 -1.941 22.607 -1.654 22.607 -1.278 c
+22.607 -0.879 22.743 -0.559 23.019 -0.324 c
+23.291 -0.081 23.665 0.044 24.136 0.044 c
+24.621 0.044 l
+24.621 0.47 l
+24.621 0.706 24.566 0.871 24.459 0.97 c
+24.349 1.076 24.187 1.132 23.974 1.132 c
+23.775 1.132 23.613 1.073 23.489 0.956 c
+23.371 0.838 23.312 0.691 23.312 0.515 c
+22.665 0.515 l
+22.665 0.709 22.725 0.9 22.842 1.087 c
+22.967 1.271 23.129 1.419 23.328 1.529 c
+23.533 1.635 23.761 1.691 24.018 1.691 c
+24.419 1.691 24.724 1.587 24.93 1.382 c
+25.142 1.176 25.256 0.881 25.267 0.5 c
+25.267 -1.514 l
+25.267 -1.819 25.304 -2.084 25.385 -2.308 c
+25.385 -2.367 l
+h
+23.841 -1.852 m
+24.007 -1.852 24.157 -1.808 24.297 -1.72 c
+24.444 -1.631 24.55 -1.521 24.621 -1.382 c
+24.621 -0.441 l
+24.253 -0.441 l
+23.937 -0.441 23.694 -0.511 23.518 -0.647 c
+23.342 -0.775 23.254 -0.963 23.254 -1.205 c
+23.254 -1.434 23.297 -1.598 23.386 -1.706 c
+23.474 -1.804 23.625 -1.852 23.841 -1.852 c
+26.884 1.617 m
+26.899 1.176 l
+27.153 1.517 27.476 1.691 27.869 1.691 c
+28.575 1.691 28.932 1.22 28.942 0.279 c
+28.942 -2.367 l
+28.296 -2.367 l
+28.296 0.25 l
+28.296 0.563 28.24 0.783 28.134 0.912 c
+28.024 1.036 27.869 1.103 27.663 1.103 c
+27.505 1.103 27.359 1.047 27.222 0.941 c
+27.094 0.831 26.991 0.694 26.914 0.529 c
+26.914 -2.367 l
+26.267 -2.367 l
+26.267 1.617 l
+h
+29.78 -0.191 m
+29.78 0.426 29.89 0.889 30.118 1.205 c
+30.343 1.529 30.677 1.691 31.118 1.691 c
+31.519 1.691 31.823 1.514 32.029 1.161 c
+32.073 1.617 l
+32.662 1.617 l
+32.662 -2.411 l
+32.662 -2.899 32.533 -3.278 32.279 -3.543 c
+32.022 -3.807 31.669 -3.94 31.22 -3.94 c
+31.022 -3.94 30.802 -3.888 30.559 -3.792 c
+30.313 -3.693 30.133 -3.572 30.015 -3.425 c
+30.28 -2.984 l
+30.545 -3.248 30.842 -3.381 31.176 -3.381 c
+31.713 -3.381 31.989 -3.087 31.999 -2.499 c
+31.999 -1.97 l
+31.794 -2.286 31.492 -2.44 31.103 -2.44 c
+30.692 -2.44 30.368 -2.29 30.133 -1.984 c
+29.905 -1.672 29.788 -1.22 29.78 -0.632 c
+h
+30.441 -0.573 m
+30.441 -1.014 30.504 -1.345 30.632 -1.558 c
+30.757 -1.764 30.975 -1.866 31.28 -1.866 c
+31.602 -1.866 31.841 -1.702 31.999 -1.367 c
+31.999 0.617 l
+31.831 0.941 31.592 1.103 31.28 1.103 c
+30.985 1.103 30.769 0.999 30.632 0.794 c
+30.504 0.588 30.441 0.264 30.441 -0.177 c
+h
+35.043 -2.44 m
+34.543 -2.44 34.16 -2.294 33.896 -1.999 c
+33.631 -1.706 33.499 -1.272 33.499 -0.69 c
+33.499 -0.22 l
+33.499 0.374 33.624 0.841 33.881 1.176 c
+34.146 1.517 34.505 1.691 34.969 1.691 c
+35.428 1.691 35.77 1.536 35.997 1.234 c
+36.233 0.941 36.354 0.478 36.365 -0.147 c
+36.365 -0.573 l
+34.146 -0.573 l
+34.146 -0.661 l
+34.146 -1.095 34.223 -1.407 34.381 -1.602 c
+34.546 -1.789 34.778 -1.881 35.072 -1.881 c
+35.266 -1.881 35.44 -1.849 35.586 -1.779 c
+35.733 -1.702 35.869 -1.584 35.997 -1.426 c
+36.336 -1.837 l
+36.049 -2.242 35.619 -2.44 35.043 -2.44 c
+34.969 1.132 m
+34.694 1.132 34.491 1.036 34.366 0.852 c
+34.237 0.665 34.164 0.374 34.146 -0.015 c
+35.719 -0.015 l
+35.719 0.073 l
+35.696 0.455 35.631 0.723 35.513 0.881 c
+35.395 1.047 35.211 1.132 34.969 1.132 c
+39.085 -1.353 m
+39.085 -1.205 39.029 -1.084 38.923 -0.985 c
+38.813 -0.889 38.607 -0.771 38.306 -0.632 c
+37.96 -0.485 37.717 -0.364 37.57 -0.264 c
+37.424 -0.158 37.313 -0.04 37.247 0.088 c
+37.177 0.213 37.144 0.371 37.144 0.559 c
+37.144 0.881 37.262 1.151 37.497 1.367 c
+37.732 1.58 38.033 1.691 38.409 1.691 c
+38.79 1.691 39.099 1.577 39.334 1.352 c
+39.569 1.124 39.687 0.838 39.687 0.485 c
+39.041 0.485 l
+39.041 0.661 38.981 0.812 38.864 0.941 c
+38.746 1.066 38.592 1.132 38.409 1.132 c
+38.21 1.132 38.059 1.076 37.952 0.97 c
+37.842 0.871 37.791 0.738 37.791 0.573 c
+37.791 0.445 37.828 0.338 37.909 0.25 c
+37.986 0.169 38.177 0.066 38.482 -0.059 c
+38.96 -0.246 39.29 -0.434 39.467 -0.617 c
+39.643 -0.794 39.731 -1.022 39.731 -1.294 c
+39.731 -1.646 39.606 -1.926 39.363 -2.132 c
+39.128 -2.337 38.813 -2.44 38.423 -2.44 c
+38 -2.44 37.663 -2.323 37.409 -2.087 c
+37.152 -1.845 37.027 -1.54 37.027 -1.176 c
+37.674 -1.176 l
+37.68 -1.404 37.751 -1.58 37.879 -1.706 c
+38.004 -1.823 38.187 -1.881 38.423 -1.881 c
+38.636 -1.881 38.798 -1.833 38.908 -1.735 c
+39.026 -1.639 39.085 -1.511 39.085 -1.353 c
+42.583 -2.367 m
+42.583 1.087 l
+42.054 1.087 l
+42.054 1.617 l
+42.583 1.617 l
+42.583 2.072 l
+42.583 2.473 42.679 2.786 42.877 3.013 c
+43.083 3.237 43.361 3.351 43.715 3.351 c
+43.851 3.351 43.983 3.329 44.111 3.293 c
+44.082 2.749 l
+43.983 2.767 43.884 2.778 43.789 2.778 c
+43.413 2.778 43.23 2.514 43.23 1.984 c
+43.23 1.617 l
+43.906 1.617 l
+43.906 1.087 l
+43.23 1.087 l
+43.23 -2.367 l
+h
+46.316 0.999 m
+46.228 1.018 46.129 1.029 46.023 1.029 c
+45.688 1.029 45.453 0.845 45.317 0.485 c
+45.317 -2.367 l
+44.67 -2.367 l
+44.67 1.617 l
+45.302 1.617 l
+45.317 1.205 l
+45.493 1.529 45.736 1.691 46.052 1.691 c
+46.158 1.691 46.247 1.668 46.316 1.631 c
+h
+46.758 -0.191 m
+46.758 0.386 46.893 0.841 47.169 1.176 c
+47.452 1.517 47.823 1.691 48.286 1.691 c
+48.745 1.691 49.113 1.521 49.389 1.191 c
+49.672 0.867 49.819 0.419 49.83 -0.147 c
+49.83 -0.573 l
+49.83 -1.143 49.686 -1.598 49.403 -1.941 c
+49.127 -2.275 48.76 -2.44 48.3 -2.44 c
+47.838 -2.44 47.467 -2.278 47.184 -1.955 c
+46.908 -1.625 46.765 -1.183 46.758 -0.632 c
+h
+47.404 -0.573 m
+47.404 -0.977 47.481 -1.294 47.639 -1.529 c
+47.805 -1.764 48.026 -1.881 48.3 -1.881 c
+48.867 -1.881 49.161 -1.47 49.183 -0.647 c
+49.183 -0.191 l
+49.183 0.21 49.098 0.529 48.933 0.764 c
+48.775 1.007 48.558 1.132 48.286 1.132 c
+48.022 1.132 47.805 1.007 47.639 0.764 c
+47.481 0.529 47.404 0.21 47.404 -0.191 c
+h
+51.284 1.617 m
+51.299 1.249 l
+51.542 1.544 51.862 1.691 52.255 1.691 c
+52.696 1.691 53.004 1.492 53.181 1.103 c
+53.435 1.492 53.784 1.691 54.224 1.691 c
+54.96 1.691 55.334 1.228 55.356 0.309 c
+55.356 -2.367 l
+54.71 -2.367 l
+54.71 0.25 l
+54.71 0.544 54.654 0.757 54.548 0.897 c
+54.449 1.033 54.276 1.103 54.033 1.103 c
+53.835 1.103 53.673 1.022 53.549 0.867 c
+53.431 0.721 53.361 0.529 53.343 0.294 c
+53.343 -2.367 l
+52.681 -2.367 l
+52.681 0.279 l
+52.681 0.827 52.46 1.103 52.02 1.103 c
+51.685 1.103 51.45 0.941 51.315 0.617 c
+51.315 -2.367 l
+50.667 -2.367 l
+50.667 1.617 l
+h
+58.899 2.572 m
+58.899 1.617 l
+59.502 1.617 l
+59.502 1.087 l
+58.899 1.087 l
+58.899 -1.382 l
+58.899 -1.54 58.921 -1.658 58.972 -1.735 c
+59.031 -1.816 59.119 -1.852 59.237 -1.852 c
+59.325 -1.852 59.413 -1.837 59.502 -1.808 c
+59.502 -2.367 l
+59.354 -2.415 59.2 -2.44 59.046 -2.44 c
+58.789 -2.44 58.594 -2.348 58.458 -2.161 c
+58.318 -1.977 58.252 -1.716 58.252 -1.382 c
+58.252 1.087 l
+57.649 1.087 l
+57.649 1.617 l
+58.252 1.617 l
+58.252 2.572 l
+h
+60.913 1.205 m
+61.166 1.529 61.486 1.691 61.868 1.691 c
+62.573 1.691 62.93 1.22 62.941 0.279 c
+62.941 -2.367 l
+62.295 -2.367 l
+62.295 0.25 l
+62.295 0.563 62.239 0.783 62.133 0.912 c
+62.022 1.036 61.868 1.103 61.663 1.103 c
+61.505 1.103 61.357 1.047 61.221 0.941 c
+61.093 0.831 60.99 0.694 60.913 0.529 c
+60.913 -2.367 l
+60.266 -2.367 l
+60.266 3.278 l
+60.913 3.278 l
+h
+65.322 -2.44 m
+64.823 -2.44 64.441 -2.294 64.176 -1.999 c
+63.911 -1.706 63.779 -1.272 63.779 -0.69 c
+63.779 -0.22 l
+63.779 0.374 63.903 0.841 64.161 1.176 c
+64.426 1.517 64.786 1.691 65.249 1.691 c
+65.708 1.691 66.05 1.536 66.278 1.234 c
+66.513 0.941 66.634 0.478 66.645 -0.147 c
+66.645 -0.573 l
+64.426 -0.573 l
+64.426 -0.661 l
+64.426 -1.095 64.503 -1.407 64.661 -1.602 c
+64.826 -1.789 65.058 -1.881 65.352 -1.881 c
+65.547 -1.881 65.719 -1.849 65.866 -1.779 c
+66.014 -1.702 66.149 -1.584 66.278 -1.426 c
+66.616 -1.837 l
+66.33 -2.242 65.9 -2.44 65.322 -2.44 c
+65.249 1.132 m
+64.973 1.132 64.771 1.036 64.647 0.852 c
+64.518 0.665 64.444 0.374 64.426 -0.015 c
+65.999 -0.015 l
+65.999 0.073 l
+65.977 0.455 65.91 0.723 65.792 0.881 c
+65.675 1.047 65.491 1.132 65.249 1.132 c
+f
+Q
+q 1 0 0 1 147.2304 260.4136 cm
+0 0 m
+-0.339 0.029 l
+-0.626 0.029 -0.817 -0.096 -0.912 -0.339 c
+-0.912 -2.97 l
+-1.956 -2.97 l
+-1.956 1.014 l
+-0.985 1.014 l
+-0.956 0.573 l
+-0.79 0.914 -0.559 1.087 -0.265 1.087 c
+-0.148 1.087 -0.056 1.065 0.014 1.028 c
+h
+2.072 -3.043 m
+1.543 -3.043 1.124 -2.889 0.822 -2.573 c
+0.529 -2.249 0.382 -1.79 0.382 -1.191 c
+0.382 -0.882 l
+0.382 -0.258 0.517 0.228 0.793 0.573 c
+1.065 0.914 1.458 1.087 1.969 1.087 c
+2.468 1.087 2.84 0.926 3.087 0.602 c
+3.34 0.278 3.472 -0.199 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.429 -1.617 1.491 -1.834 1.602 -1.97 c
+1.72 -2.11 1.899 -2.176 2.146 -2.176 c
+2.487 -2.176 2.778 -2.058 3.013 -1.823 c
+3.424 -2.455 l
+3.295 -2.631 3.108 -2.775 2.865 -2.882 c
+2.62 -2.988 2.355 -3.043 2.072 -3.043 c
+1.425 -0.603 m
+2.454 -0.603 l
+2.454 -0.5 l
+2.454 -0.265 2.414 -0.088 2.337 0.029 c
+2.267 0.154 2.138 0.22 1.955 0.22 c
+1.778 0.22 1.646 0.151 1.558 0.014 c
+1.477 -0.115 1.433 -0.32 1.425 -0.603 c
+5.041 1.014 m
+5.071 0.646 l
+5.306 0.941 5.614 1.087 5.996 1.087 c
+6.397 1.087 6.676 0.903 6.834 0.544 c
+7.07 0.903 7.397 1.087 7.819 1.087 c
+8.514 1.087 8.866 0.602 8.878 -0.368 c
+8.878 -2.97 l
+7.849 -2.97 l
+7.849 -0.427 l
+7.849 -0.202 7.812 -0.04 7.746 0.058 c
+7.687 0.154 7.577 0.205 7.422 0.205 c
+7.224 0.205 7.085 0.087 6.996 -0.148 c
+6.996 -2.97 l
+5.953 -2.97 l
+5.953 -0.441 l
+5.953 -0.206 5.923 -0.04 5.865 0.058 c
+5.805 0.154 5.695 0.205 5.541 0.205 c
+5.365 0.205 5.221 0.11 5.115 -0.074 c
+5.115 -2.97 l
+4.072 -2.97 l
+4.072 1.014 l
+h
+9.539 -0.853 m
+9.539 -0.246 9.679 0.228 9.965 0.573 c
+10.248 0.914 10.642 1.087 11.141 1.087 c
+11.648 1.087 12.045 0.914 12.332 0.573 c
+12.615 0.228 12.758 -0.246 12.758 -0.853 c
+12.758 -1.118 l
+12.758 -1.717 12.615 -2.187 12.332 -2.529 c
+12.045 -2.874 11.648 -3.043 11.141 -3.043 c
+10.63 -3.043 10.233 -2.874 9.951 -2.529 c
+9.676 -2.187 9.539 -1.713 9.539 -1.103 c
+h
+10.583 -1.118 m
+10.583 -1.823 10.767 -2.176 11.141 -2.176 c
+11.494 -2.176 11.685 -1.882 11.715 -1.294 c
+11.715 -0.853 l
+11.715 -0.493 11.663 -0.221 11.567 -0.044 c
+11.469 0.132 11.326 0.22 11.141 0.22 c
+10.965 0.22 10.825 0.132 10.73 -0.044 c
+10.63 -0.221 10.583 -0.493 10.583 -0.853 c
+h
+14.611 1.984 m
+14.611 1.014 l
+15.139 1.014 l
+15.139 0.22 l
+14.611 0.22 l
+14.611 -1.75 l
+14.611 -1.908 14.629 -2.014 14.669 -2.073 c
+14.717 -2.132 14.802 -2.161 14.919 -2.161 c
+15.025 -2.161 15.11 -2.154 15.168 -2.132 c
+15.168 -2.94 l
+14.993 -3.007 14.802 -3.043 14.596 -3.043 c
+13.919 -3.043 13.574 -2.658 13.566 -1.882 c
+13.566 0.22 l
+13.111 0.22 l
+13.111 1.014 l
+13.566 1.014 l
+13.566 1.984 l
+h
+17.315 -3.043 m
+16.786 -3.043 16.367 -2.889 16.066 -2.573 c
+15.771 -2.249 15.625 -1.79 15.625 -1.191 c
+15.625 -0.882 l
+15.625 -0.258 15.76 0.228 16.036 0.573 c
+16.308 0.914 16.701 1.087 17.212 1.087 c
+17.712 1.087 18.083 0.926 18.329 0.602 c
+18.582 0.278 18.715 -0.199 18.726 -0.823 c
+18.726 -1.324 l
+16.654 -1.324 l
+16.672 -1.617 16.735 -1.834 16.845 -1.97 c
+16.962 -2.11 17.142 -2.176 17.389 -2.176 c
+17.73 -2.176 18.021 -2.058 18.256 -1.823 c
+18.667 -2.455 l
+18.539 -2.631 18.351 -2.775 18.109 -2.882 c
+17.863 -2.988 17.598 -3.043 17.315 -3.043 c
+16.668 -0.603 m
+17.697 -0.603 l
+17.697 -0.5 l
+17.697 -0.265 17.657 -0.088 17.58 0.029 c
+17.51 0.154 17.381 0.22 17.198 0.22 c
+17.021 0.22 16.889 0.151 16.801 0.014 c
+16.72 -0.115 16.676 -0.32 16.668 -0.603 c
+f
+Q
+q 1 0 0 1 166.6623 256.3712 cm
+0 0 m
+-0.397 0.264 l
+-0.162 0.588 -0.04 0.922 -0.03 1.263 c
+-0.03 1.881 l
+0.632 1.881 l
+0.632 1.352 l
+0.632 1.095 0.565 0.849 0.44 0.602 c
+0.324 0.359 0.176 0.158 0 0 c
+6.071 2.866 m
+6.071 2.248 5.957 1.782 5.733 1.469 c
+5.516 1.153 5.192 0.999 4.762 0.999 c
+4.34 0.999 4.027 1.18 3.821 1.543 c
+3.792 1.072 l
+3.189 1.072 l
+3.189 6.717 l
+3.836 6.717 l
+3.836 4.615 l
+4.049 4.957 4.358 5.13 4.762 5.13 c
+5.192 5.13 5.516 4.972 5.733 4.659 c
+5.957 4.355 6.071 3.887 6.071 3.262 c
+h
+5.423 3.248 m
+5.423 3.719 5.354 4.049 5.218 4.247 c
+5.089 4.442 4.88 4.542 4.586 4.542 c
+4.251 4.542 4.002 4.358 3.836 3.998 c
+3.836 2.117 l
+4.002 1.753 4.255 1.573 4.6 1.573 c
+4.895 1.573 5.104 1.675 5.232 1.881 c
+5.358 2.087 5.423 2.403 5.423 2.836 c
+h
+8.937 1.425 m
+8.72 1.139 8.407 0.999 7.996 0.999 c
+7.632 0.999 7.357 1.12 7.173 1.367 c
+6.996 1.62 6.901 1.984 6.894 2.454 c
+6.894 5.056 l
+7.54 5.056 l
+7.54 2.514 l
+7.54 1.885 7.724 1.573 8.099 1.573 c
+8.5 1.573 8.775 1.749 8.922 2.102 c
+8.922 5.056 l
+9.569 5.056 l
+9.569 1.072 l
+8.951 1.072 l
+h
+11.406 6.011 m
+11.406 5.056 l
+12.009 5.056 l
+12.009 4.527 l
+11.406 4.527 l
+11.406 2.057 l
+11.406 1.899 11.428 1.782 11.48 1.705 c
+11.538 1.624 11.627 1.587 11.744 1.587 c
+11.833 1.587 11.921 1.602 12.009 1.631 c
+12.009 1.072 l
+11.862 1.024 11.708 0.999 11.553 0.999 c
+11.296 0.999 11.102 1.091 10.965 1.278 c
+10.826 1.462 10.759 1.723 10.759 2.057 c
+10.759 4.527 l
+10.157 4.527 l
+10.157 5.056 l
+10.759 5.056 l
+10.759 6.011 l
+h
+15.11 5.056 m
+15.125 4.615 l
+15.378 4.957 15.702 5.13 16.095 5.13 c
+16.801 5.13 17.157 4.659 17.169 3.719 c
+17.169 1.072 l
+16.521 1.072 l
+16.521 3.69 l
+16.521 4.002 16.467 4.222 16.359 4.351 c
+16.249 4.475 16.095 4.542 15.889 4.542 c
+15.731 4.542 15.584 4.486 15.449 4.38 c
+15.32 4.27 15.217 4.134 15.14 3.968 c
+15.14 1.072 l
+14.493 1.072 l
+14.493 5.056 l
+h
+18.006 3.248 m
+18.006 3.825 18.142 4.28 18.418 4.615 c
+18.701 4.957 19.072 5.13 19.534 5.13 c
+19.994 5.13 20.361 4.961 20.637 4.63 c
+20.92 4.307 21.067 3.858 21.078 3.293 c
+21.078 2.866 l
+21.078 2.296 20.935 1.841 20.652 1.499 c
+20.376 1.165 20.009 0.999 19.55 0.999 c
+19.087 0.999 18.715 1.161 18.433 1.484 c
+18.157 1.815 18.013 2.256 18.006 2.807 c
+h
+18.653 2.866 m
+18.653 2.462 18.73 2.146 18.888 1.911 c
+19.054 1.675 19.274 1.558 19.55 1.558 c
+20.116 1.558 20.409 1.969 20.431 2.792 c
+20.431 3.248 l
+20.431 3.649 20.347 3.968 20.182 4.203 c
+20.024 4.446 19.806 4.571 19.534 4.571 c
+19.27 4.571 19.054 4.446 18.888 4.203 c
+18.73 3.968 18.653 3.649 18.653 3.248 c
+h
+22.769 6.011 m
+22.769 5.056 l
+23.372 5.056 l
+23.372 4.527 l
+22.769 4.527 l
+22.769 2.057 l
+22.769 1.899 22.79 1.782 22.842 1.705 c
+22.901 1.624 22.989 1.587 23.106 1.587 c
+23.195 1.587 23.283 1.602 23.372 1.631 c
+23.372 1.072 l
+23.224 1.024 23.07 0.999 22.915 0.999 c
+22.659 0.999 22.464 1.091 22.328 1.278 c
+22.188 1.462 22.121 1.723 22.121 2.057 c
+22.121 4.527 l
+21.519 4.527 l
+21.519 5.056 l
+22.121 5.056 l
+22.121 6.011 l
+h
+27.884 1.425 m
+27.667 1.139 27.355 0.999 26.943 0.999 c
+26.58 0.999 26.304 1.12 26.12 1.367 c
+25.944 1.62 25.848 1.984 25.84 2.454 c
+25.84 5.056 l
+26.487 5.056 l
+26.487 2.514 l
+26.487 1.885 26.671 1.573 27.046 1.573 c
+27.447 1.573 27.722 1.749 27.869 2.102 c
+27.869 5.056 l
+28.516 5.056 l
+28.516 1.072 l
+27.899 1.072 l
+h
+32.382 2.866 m
+32.382 2.238 32.265 1.768 32.029 1.455 c
+31.801 1.15 31.485 0.999 31.074 0.999 c
+30.669 0.999 30.361 1.15 30.148 1.455 c
+30.148 -0.456 l
+29.501 -0.456 l
+29.501 5.056 l
+30.089 5.056 l
+30.133 4.615 l
+30.346 4.957 30.655 5.13 31.059 5.13 c
+31.5 5.13 31.827 4.976 32.043 4.674 c
+32.257 4.369 32.371 3.913 32.382 3.307 c
+h
+31.735 3.248 m
+31.735 3.69 31.665 4.012 31.529 4.218 c
+31.39 4.432 31.17 4.542 30.868 4.542 c
+30.551 4.542 30.313 4.388 30.148 4.086 c
+30.148 2.013 l
+30.313 1.708 30.551 1.558 30.868 1.558 c
+31.162 1.558 31.375 1.66 31.515 1.866 c
+31.65 2.08 31.724 2.41 31.735 2.851 c
+h
+33.088 3.248 m
+33.088 3.854 33.198 4.321 33.425 4.644 c
+33.661 4.968 33.988 5.13 34.41 5.13 c
+34.792 5.13 35.091 4.972 35.307 4.659 c
+35.307 6.717 l
+35.953 6.717 l
+35.953 1.072 l
+35.366 1.072 l
+35.322 1.499 l
+35.116 1.165 34.811 0.999 34.41 0.999 c
+33.998 0.999 33.676 1.153 33.44 1.469 c
+33.205 1.793 33.088 2.248 33.088 2.836 c
+h
+33.734 2.866 m
+33.734 2.425 33.797 2.094 33.925 1.881 c
+34.061 1.675 34.281 1.573 34.586 1.573 c
+34.91 1.573 35.149 1.734 35.307 2.057 c
+35.307 4.072 l
+35.138 4.384 34.899 4.542 34.586 4.542 c
+34.281 4.542 34.061 4.438 33.925 4.233 c
+33.797 4.027 33.734 3.704 33.734 3.262 c
+h
+38.996 1.072 m
+38.956 1.161 38.931 1.308 38.923 1.514 c
+38.688 1.168 38.393 0.999 38.041 0.999 c
+37.678 0.999 37.394 1.095 37.188 1.294 c
+36.99 1.499 36.894 1.786 36.894 2.161 c
+36.894 2.561 37.03 2.881 37.306 3.116 c
+37.578 3.358 37.953 3.484 38.424 3.484 c
+38.908 3.484 l
+38.908 3.91 l
+38.908 4.145 38.853 4.31 38.746 4.409 c
+38.636 4.516 38.474 4.571 38.262 4.571 c
+38.063 4.571 37.901 4.513 37.776 4.395 c
+37.659 4.278 37.599 4.13 37.599 3.954 c
+36.953 3.954 l
+36.953 4.149 37.012 4.34 37.129 4.527 c
+37.254 4.71 37.416 4.858 37.615 4.968 c
+37.821 5.074 38.048 5.13 38.305 5.13 c
+38.706 5.13 39.011 5.026 39.217 4.821 c
+39.43 4.615 39.544 4.321 39.555 3.939 c
+39.555 1.926 l
+39.555 1.62 39.592 1.356 39.673 1.132 c
+39.673 1.072 l
+h
+38.129 1.587 m
+38.295 1.587 38.445 1.631 38.584 1.72 c
+38.732 1.808 38.838 1.918 38.908 2.057 c
+38.908 2.998 l
+38.54 2.998 l
+38.225 2.998 37.982 2.928 37.806 2.792 c
+37.63 2.664 37.541 2.476 37.541 2.234 c
+37.541 2.006 37.585 1.841 37.674 1.734 c
+37.761 1.635 37.913 1.587 38.129 1.587 c
+41.407 6.011 m
+41.407 5.056 l
+42.01 5.056 l
+42.01 4.527 l
+41.407 4.527 l
+41.407 2.057 l
+41.407 1.899 41.429 1.782 41.481 1.705 c
+41.539 1.624 41.628 1.587 41.745 1.587 c
+41.833 1.587 41.921 1.602 42.01 1.631 c
+42.01 1.072 l
+41.863 1.024 41.709 0.999 41.554 0.999 c
+41.297 0.999 41.102 1.091 40.966 1.278 c
+40.826 1.462 40.76 1.723 40.76 2.057 c
+40.76 4.527 l
+40.157 4.527 l
+40.157 5.056 l
+40.76 5.056 l
+40.76 6.011 l
+h
+44.2 0.999 m
+43.7 0.999 43.318 1.146 43.053 1.44 c
+42.789 1.734 42.657 2.167 42.657 2.749 c
+42.657 3.219 l
+42.657 3.814 42.781 4.28 43.039 4.615 c
+43.303 4.957 43.663 5.13 44.126 5.13 c
+44.585 5.13 44.928 4.976 45.156 4.674 c
+45.391 4.38 45.512 3.917 45.522 3.293 c
+45.522 2.866 l
+43.303 2.866 l
+43.303 2.778 l
+43.303 2.344 43.38 2.032 43.538 1.837 c
+43.704 1.65 43.935 1.558 44.229 1.558 c
+44.424 1.558 44.597 1.591 44.743 1.66 c
+44.89 1.738 45.027 1.855 45.156 2.013 c
+45.493 1.602 l
+45.206 1.198 44.776 0.999 44.2 0.999 c
+44.126 4.571 m
+43.851 4.571 43.648 4.475 43.523 4.292 c
+43.395 4.104 43.322 3.814 43.303 3.424 c
+44.876 3.424 l
+44.876 3.513 l
+44.854 3.895 44.788 4.163 44.67 4.321 c
+44.552 4.486 44.369 4.571 44.126 4.571 c
+48.874 6.011 m
+48.874 5.056 l
+49.477 5.056 l
+49.477 4.527 l
+48.874 4.527 l
+48.874 2.057 l
+48.874 1.899 48.896 1.782 48.948 1.705 c
+49.007 1.624 49.094 1.587 49.212 1.587 c
+49.3 1.587 49.389 1.602 49.477 1.631 c
+49.477 1.072 l
+49.33 1.024 49.175 0.999 49.021 0.999 c
+48.764 0.999 48.569 1.091 48.433 1.278 c
+48.294 1.462 48.227 1.723 48.227 2.057 c
+48.227 4.527 l
+47.625 4.527 l
+47.625 5.056 l
+48.227 5.056 l
+48.227 6.011 l
+h
+51.887 4.438 m
+51.799 4.457 51.7 4.469 51.594 4.469 c
+51.259 4.469 51.024 4.284 50.888 3.925 c
+50.888 1.072 l
+50.241 1.072 l
+50.241 5.056 l
+50.873 5.056 l
+50.888 4.644 l
+51.064 4.968 51.307 5.13 51.623 5.13 c
+51.729 5.13 51.818 5.107 51.887 5.071 c
+h
+54.43 1.072 m
+54.39 1.161 54.364 1.308 54.357 1.514 c
+54.122 1.168 53.827 0.999 53.475 0.999 c
+53.111 0.999 52.828 1.095 52.622 1.294 c
+52.424 1.499 52.329 1.786 52.329 2.161 c
+52.329 2.561 52.464 2.881 52.74 3.116 c
+53.012 3.358 53.387 3.484 53.857 3.484 c
+54.342 3.484 l
+54.342 3.91 l
+54.342 4.145 54.287 4.31 54.181 4.409 c
+54.07 4.516 53.908 4.571 53.696 4.571 c
+53.497 4.571 53.335 4.513 53.21 4.395 c
+53.093 4.278 53.034 4.13 53.034 3.954 c
+52.387 3.954 l
+52.387 4.149 52.446 4.34 52.564 4.527 c
+52.689 4.71 52.85 4.858 53.048 4.968 c
+53.254 5.074 53.482 5.13 53.74 5.13 c
+54.141 5.13 54.445 5.026 54.651 4.821 c
+54.864 4.615 54.978 4.321 54.989 3.939 c
+54.989 1.926 l
+54.989 1.62 55.026 1.356 55.107 1.132 c
+55.107 1.072 l
+h
+53.563 1.587 m
+53.728 1.587 53.879 1.631 54.019 1.72 c
+54.166 1.808 54.272 1.918 54.342 2.057 c
+54.342 2.998 l
+53.975 2.998 l
+53.659 2.998 53.416 2.928 53.24 2.792 c
+53.063 2.664 52.975 2.476 52.975 2.234 c
+52.975 2.006 53.019 1.841 53.108 1.734 c
+53.196 1.635 53.347 1.587 53.563 1.587 c
+57.37 1.558 m
+57.584 1.558 57.756 1.62 57.885 1.749 c
+58.021 1.885 58.094 2.076 58.105 2.322 c
+58.723 2.322 l
+58.7 1.94 58.565 1.62 58.311 1.367 c
+58.054 1.12 57.742 0.999 57.37 0.999 c
+56.878 0.999 56.503 1.15 56.238 1.455 c
+55.982 1.768 55.856 2.234 55.856 2.851 c
+55.856 3.293 l
+55.856 3.887 55.982 4.343 56.238 4.659 c
+56.503 4.972 56.878 5.13 57.37 5.13 c
+57.771 5.13 58.091 4.997 58.326 4.733 c
+58.569 4.475 58.7 4.13 58.723 3.69 c
+58.105 3.69 l
+58.083 3.983 58.01 4.203 57.885 4.351 c
+57.767 4.498 57.594 4.571 57.37 4.571 c
+57.077 4.571 56.859 4.472 56.724 4.278 c
+56.584 4.089 56.51 3.781 56.503 3.351 c
+56.503 2.836 l
+56.503 2.366 56.57 2.032 56.709 1.837 c
+56.855 1.65 57.077 1.558 57.37 1.558 c
+60.472 2.896 m
+60.134 2.499 l
+60.134 1.072 l
+59.472 1.072 l
+59.472 6.717 l
+60.134 6.717 l
+60.134 3.337 l
+61.368 5.056 l
+62.147 5.056 l
+60.883 3.395 l
+62.309 1.072 l
+61.559 1.072 l
+h
+63.573 1.072 -0.647 3.984 re
+63.618 6.1 m
+63.618 5.99 63.588 5.897 63.529 5.82 c
+63.47 5.751 63.375 5.718 63.25 5.718 c
+63.132 5.718 63.037 5.751 62.97 5.82 c
+62.912 5.897 62.883 5.99 62.883 6.1 c
+62.883 6.217 62.912 6.31 62.97 6.379 c
+63.037 6.456 63.132 6.497 63.25 6.497 c
+63.375 6.497 63.47 6.456 63.529 6.379 c
+63.588 6.298 63.618 6.206 63.618 6.1 c
+65.205 5.056 m
+65.22 4.615 l
+65.473 4.957 65.796 5.13 66.189 5.13 c
+66.895 5.13 67.252 4.659 67.263 3.719 c
+67.263 1.072 l
+66.616 1.072 l
+66.616 3.69 l
+66.616 4.002 66.561 4.222 66.454 4.351 c
+66.344 4.475 66.189 4.542 65.983 4.542 c
+65.825 4.542 65.679 4.486 65.543 4.38 c
+65.414 4.27 65.312 4.134 65.235 3.968 c
+65.235 1.072 l
+64.587 1.072 l
+64.587 5.056 l
+h
+68.1 3.248 m
+68.1 3.865 68.211 4.328 68.439 4.644 c
+68.663 4.968 68.998 5.13 69.438 5.13 c
+69.839 5.13 70.143 4.953 70.349 4.6 c
+70.394 5.056 l
+70.982 5.056 l
+70.982 1.028 l
+70.982 0.54 70.853 0.162 70.6 -0.103 c
+70.342 -0.368 69.989 -0.5 69.541 -0.5 c
+69.343 -0.5 69.122 -0.449 68.879 -0.353 c
+68.634 -0.254 68.453 -0.133 68.335 0.014 c
+68.601 0.455 l
+68.865 0.191 69.162 0.058 69.497 0.058 c
+70.033 0.058 70.309 0.353 70.32 0.941 c
+70.32 1.469 l
+70.114 1.153 69.813 0.999 69.424 0.999 c
+69.012 0.999 68.688 1.15 68.453 1.455 c
+68.225 1.768 68.108 2.219 68.1 2.807 c
+h
+68.762 2.866 m
+68.762 2.425 68.825 2.094 68.953 1.881 c
+69.078 1.675 69.295 1.573 69.6 1.573 c
+69.923 1.573 70.162 1.738 70.32 2.072 c
+70.32 4.056 l
+70.151 4.38 69.912 4.542 69.6 4.542 c
+69.306 4.542 69.089 4.438 68.953 4.233 c
+68.825 4.027 68.762 3.704 68.762 3.262 c
+h
+76.538 2.866 m
+76.538 2.248 76.424 1.782 76.2 1.469 c
+75.983 1.153 75.66 0.999 75.229 0.999 c
+74.807 0.999 74.494 1.18 74.288 1.543 c
+74.259 1.072 l
+73.657 1.072 l
+73.657 6.717 l
+74.303 6.717 l
+74.303 4.615 l
+74.517 4.957 74.825 5.13 75.229 5.13 c
+75.66 5.13 75.983 4.972 76.2 4.659 c
+76.424 4.355 76.538 3.887 76.538 3.262 c
+h
+75.891 3.248 m
+75.891 3.719 75.821 4.049 75.685 4.247 c
+75.556 4.442 75.348 4.542 75.053 4.542 c
+74.719 4.542 74.469 4.358 74.303 3.998 c
+74.303 2.117 l
+74.469 1.753 74.722 1.573 75.068 1.573 c
+75.362 1.573 75.571 1.675 75.699 1.881 c
+75.825 2.087 75.891 2.403 75.891 2.836 c
+h
+79.022 4.438 m
+78.934 4.457 78.835 4.469 78.728 4.469 c
+78.394 4.469 78.159 4.284 78.022 3.925 c
+78.022 1.072 l
+77.376 1.072 l
+77.376 5.056 l
+78.008 5.056 l
+78.022 4.644 l
+78.199 4.968 78.442 5.13 78.757 5.13 c
+78.864 5.13 78.953 5.107 79.022 5.071 c
+h
+81.565 1.072 m
+81.524 1.161 81.499 1.308 81.492 1.514 c
+81.256 1.168 80.962 0.999 80.609 0.999 c
+80.246 0.999 79.963 1.095 79.757 1.294 c
+79.558 1.499 79.462 1.786 79.462 2.161 c
+79.462 2.561 79.599 2.881 79.874 3.116 c
+80.146 3.358 80.522 3.484 80.992 3.484 c
+81.477 3.484 l
+81.477 3.91 l
+81.477 4.145 81.422 4.31 81.315 4.409 c
+81.205 4.516 81.043 4.571 80.83 4.571 c
+80.632 4.571 80.47 4.513 80.345 4.395 c
+80.227 4.278 80.168 4.13 80.168 3.954 c
+79.522 3.954 l
+79.522 4.149 79.581 4.34 79.698 4.527 c
+79.823 4.71 79.984 4.858 80.183 4.968 c
+80.389 5.074 80.617 5.13 80.873 5.13 c
+81.274 5.13 81.579 5.026 81.785 4.821 c
+81.999 4.615 82.112 4.321 82.124 3.939 c
+82.124 1.926 l
+82.124 1.62 82.16 1.356 82.241 1.132 c
+82.241 1.072 l
+h
+80.698 1.587 m
+80.863 1.587 81.014 1.631 81.153 1.72 c
+81.301 1.808 81.407 1.918 81.477 2.057 c
+81.477 2.998 l
+81.109 2.998 l
+80.794 2.998 80.551 2.928 80.374 2.792 c
+80.198 2.664 80.11 2.476 80.11 2.234 c
+80.11 2.006 80.154 1.841 80.242 1.734 c
+80.33 1.635 80.481 1.587 80.698 1.587 c
+83.74 5.056 m
+83.755 4.615 l
+84.009 4.957 84.332 5.13 84.725 5.13 c
+85.43 5.13 85.787 4.659 85.798 3.719 c
+85.798 1.072 l
+85.151 1.072 l
+85.151 3.69 l
+85.151 4.002 85.096 4.222 84.99 4.351 c
+84.879 4.475 84.725 4.542 84.52 4.542 c
+84.362 4.542 84.214 4.486 84.079 4.38 c
+83.95 4.27 83.847 4.134 83.77 3.968 c
+83.77 1.072 l
+83.123 1.072 l
+83.123 5.056 l
+h
+88.15 1.558 m
+88.363 1.558 88.536 1.62 88.665 1.749 c
+88.8 1.885 88.874 2.076 88.885 2.322 c
+89.502 2.322 l
+89.48 1.94 89.344 1.62 89.091 1.367 c
+88.833 1.12 88.521 0.999 88.15 0.999 c
+87.657 0.999 87.283 1.15 87.018 1.455 c
+86.761 1.768 86.636 2.234 86.636 2.851 c
+86.636 3.293 l
+86.636 3.887 86.761 4.343 87.018 4.659 c
+87.283 4.972 87.657 5.13 88.15 5.13 c
+88.551 5.13 88.87 4.997 89.105 4.733 c
+89.348 4.475 89.48 4.13 89.502 3.69 c
+88.885 3.69 l
+88.863 3.983 88.79 4.203 88.665 4.351 c
+88.547 4.498 88.374 4.571 88.15 4.571 c
+87.856 4.571 87.639 4.472 87.503 4.278 c
+87.364 4.089 87.29 3.781 87.283 3.351 c
+87.283 2.836 l
+87.283 2.366 87.349 2.032 87.489 1.837 c
+87.636 1.65 87.856 1.558 88.15 1.558 c
+90.899 4.644 m
+91.152 4.968 91.472 5.13 91.854 5.13 c
+92.559 5.13 92.916 4.659 92.927 3.719 c
+92.927 1.072 l
+92.281 1.072 l
+92.281 3.69 l
+92.281 4.002 92.225 4.222 92.119 4.351 c
+92.008 4.475 91.854 4.542 91.649 4.542 c
+91.491 4.542 91.343 4.486 91.208 4.38 c
+91.079 4.27 90.976 4.134 90.899 3.968 c
+90.899 1.072 l
+90.252 1.072 l
+90.252 6.717 l
+90.899 6.717 l
+h
+95.308 0.999 m
+94.809 0.999 94.427 1.146 94.162 1.44 c
+93.897 1.734 93.765 2.167 93.765 2.749 c
+93.765 3.219 l
+93.765 3.814 93.89 4.28 94.147 4.615 c
+94.412 4.957 94.772 5.13 95.235 5.13 c
+95.694 5.13 96.036 4.976 96.264 4.674 c
+96.499 4.38 96.621 3.917 96.631 3.293 c
+96.631 2.866 l
+94.412 2.866 l
+94.412 2.778 l
+94.412 2.344 94.489 2.032 94.647 1.837 c
+94.812 1.65 95.044 1.558 95.338 1.558 c
+95.533 1.558 95.705 1.591 95.852 1.66 c
+96 1.738 96.135 1.855 96.264 2.013 c
+96.602 1.602 l
+96.316 1.198 95.886 0.999 95.308 0.999 c
+95.235 4.571 m
+94.959 4.571 94.757 4.475 94.633 4.292 c
+94.504 4.104 94.43 3.814 94.412 3.424 c
+95.985 3.424 l
+95.985 3.513 l
+95.963 3.895 95.896 4.163 95.779 4.321 c
+95.661 4.486 95.478 4.571 95.235 4.571 c
+99.351 2.087 m
+99.351 2.234 99.296 2.356 99.189 2.454 c
+99.079 2.55 98.873 2.668 98.572 2.807 c
+98.226 2.954 97.984 3.075 97.837 3.175 c
+97.69 3.281 97.579 3.399 97.513 3.528 c
+97.444 3.652 97.411 3.81 97.411 3.998 c
+97.411 4.321 97.528 4.59 97.764 4.806 c
+97.999 5.02 98.3 5.13 98.674 5.13 c
+99.057 5.13 99.366 5.016 99.601 4.791 c
+99.836 4.564 99.954 4.278 99.954 3.925 c
+99.306 3.925 l
+99.306 4.101 99.248 4.251 99.13 4.38 c
+99.013 4.505 98.859 4.571 98.674 4.571 c
+98.476 4.571 98.325 4.516 98.219 4.409 c
+98.109 4.31 98.057 4.178 98.057 4.012 c
+98.057 3.884 98.094 3.777 98.175 3.69 c
+98.252 3.609 98.443 3.505 98.748 3.38 c
+99.225 3.193 99.557 3.006 99.733 2.822 c
+99.909 2.645 99.998 2.418 99.998 2.146 c
+99.998 1.793 99.873 1.514 99.63 1.308 c
+99.395 1.103 99.079 0.999 98.689 0.999 c
+98.267 0.999 97.928 1.117 97.675 1.352 c
+97.417 1.595 97.293 1.899 97.293 2.263 c
+97.939 2.263 l
+97.947 2.036 98.017 1.859 98.145 1.734 c
+98.271 1.616 98.454 1.558 98.689 1.558 c
+98.903 1.558 99.064 1.606 99.175 1.705 c
+99.292 1.801 99.351 1.929 99.351 2.087 c
+100.879 1.425 m
+100.879 1.543 100.912 1.639 100.983 1.72 c
+101.049 1.797 101.151 1.837 101.291 1.837 c
+101.438 1.837 101.544 1.797 101.614 1.72 c
+101.691 1.639 101.732 1.543 101.732 1.425 c
+101.732 1.315 101.691 1.223 101.614 1.146 c
+101.544 1.069 101.438 1.028 101.291 1.028 c
+101.151 1.028 101.049 1.069 100.983 1.146 c
+100.912 1.223 100.879 1.315 100.879 1.425 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 250.33 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 243.4906 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.485 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.485 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.485 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.559 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.264 c
+14.221 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.765 1.602 m
+22.765 -1.264 l
+21.868 -1.264 l
+21.868 1.602 l
+21.045 1.602 l
+21.045 2.22 l
+21.868 2.22 l
+21.868 2.485 l
+21.868 2.61 21.883 2.741 21.913 2.882 c
+21.949 3.017 22.02 3.135 22.119 3.234 c
+22.225 3.341 22.369 3.429 22.545 3.499 c
+22.722 3.564 22.946 3.601 23.221 3.601 c
+23.434 3.601 23.632 3.591 23.809 3.572 c
+23.985 3.55 24.137 3.532 24.264 3.514 c
+24.264 2.926 l
+24.137 2.944 23.993 2.959 23.838 2.969 c
+23.68 2.977 23.53 2.984 23.383 2.984 c
+23.254 2.984 23.152 2.969 23.074 2.94 c
+22.994 2.911 22.931 2.87 22.883 2.822 c
+22.832 2.771 22.799 2.708 22.78 2.631 c
+22.769 2.562 22.765 2.485 22.765 2.396 c
+22.765 2.22 l
+24.191 2.22 l
+24.191 1.602 l
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.029 25.518 -0.881 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.181 25.047 0.485 c
+25.047 0.816 25.091 1.095 25.18 1.323 c
+25.275 1.558 25.404 1.742 25.562 1.881 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.132 c
+27.664 2.043 27.829 1.911 27.958 1.735 c
+28.094 1.565 28.193 1.36 28.252 1.118 c
+28.318 0.882 28.355 0.617 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.023 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.441 c
+26.26 -0.529 26.344 -0.598 26.444 -0.646 c
+26.539 -0.698 26.653 -0.72 26.782 -0.72 c
+26.936 -0.72 27.076 -0.687 27.194 -0.617 c
+27.318 -0.551 27.407 -0.448 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.481 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.918 27.825 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.649 1.706 26.562 1.691 26.473 1.661 c
+26.385 1.632 26.304 1.58 26.238 1.515 c
+26.169 1.444 26.109 1.357 26.061 1.249 c
+26.021 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.004 27.447 1.125 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.706 26.738 1.706 c
+29.843 1.602 m
+29.299 1.602 l
+29.299 2.22 l
+29.887 2.22 l
+30.167 3.117 l
+30.74 3.117 l
+30.74 2.22 l
+31.975 2.22 l
+31.975 1.602 l
+30.74 1.602 l
+30.74 -0.103 l
+30.74 -0.324 l
+30.747 -0.393 30.769 -0.455 30.799 -0.515 c
+30.836 -0.565 30.89 -0.61 30.96 -0.646 c
+31.037 -0.676 31.152 -0.69 31.298 -0.69 c
+31.434 -0.69 31.57 -0.687 31.71 -0.676 c
+31.846 -0.658 31.978 -0.632 32.106 -0.602 c
+32.106 -1.205 l
+32.026 -1.216 31.948 -1.23 31.871 -1.249 c
+31.79 -1.261 31.713 -1.267 31.636 -1.278 c
+31.555 -1.286 31.467 -1.294 31.372 -1.294 c
+31.283 -1.301 31.185 -1.308 31.077 -1.308 c
+30.89 -1.308 30.728 -1.294 30.593 -1.264 c
+30.464 -1.227 30.35 -1.183 30.254 -1.132 c
+30.167 -1.084 30.093 -1.025 30.034 -0.955 c
+29.976 -0.878 29.932 -0.801 29.901 -0.72 c
+29.872 -0.632 29.851 -0.544 29.843 -0.455 c
+29.832 -0.36 29.828 -0.264 29.828 -0.176 c
+h
+34.863 -1.323 m
+34.576 -1.323 34.333 -1.282 34.128 -1.205 c
+33.922 -1.117 33.749 -0.995 33.614 -0.837 c
+33.473 -0.683 33.371 -0.496 33.305 -0.279 c
+33.234 -0.055 33.202 0.191 33.202 0.456 c
+33.202 0.75 33.234 1.008 33.305 1.235 c
+33.382 1.459 33.488 1.646 33.628 1.793 c
+33.775 1.948 33.951 2.066 34.157 2.146 c
+34.363 2.234 34.599 2.278 34.863 2.278 c
+35.087 2.278 35.289 2.249 35.465 2.19 c
+35.642 2.132 35.792 2.047 35.921 1.941 c
+36.046 1.841 36.149 1.72 36.23 1.573 c
+36.307 1.434 36.362 1.283 36.392 1.118 c
+35.48 1.073 l
+35.451 1.249 35.381 1.389 35.274 1.5 c
+35.175 1.606 35.032 1.661 34.848 1.661 c
+34.602 1.661 34.425 1.558 34.319 1.353 c
+34.209 1.154 34.157 0.867 34.157 0.485 c
+34.157 -0.309 34.392 -0.706 34.863 -0.706 c
+35.028 -0.706 35.171 -0.654 35.289 -0.544 c
+35.407 -0.437 35.48 -0.276 35.509 -0.058 c
+36.421 -0.103 l
+36.392 -0.272 36.336 -0.426 36.259 -0.573 c
+36.189 -0.72 36.087 -0.852 35.95 -0.97 c
+35.821 -1.08 35.663 -1.168 35.48 -1.234 c
+35.304 -1.294 35.098 -1.323 34.863 -1.323 c
+38.262 1.515 m
+38.379 1.786 38.53 1.985 38.718 2.103 c
+38.901 2.22 39.122 2.278 39.379 2.278 c
+39.584 2.278 39.754 2.242 39.894 2.176 c
+40.041 2.106 40.151 2.014 40.232 1.897 c
+40.32 1.779 40.378 1.636 40.408 1.47 c
+40.444 1.301 40.467 1.125 40.467 0.941 c
+40.467 -1.264 l
+39.555 -1.264 l
+39.555 0.735 l
+39.555 0.871 39.544 0.992 39.526 1.103 c
+39.515 1.209 39.489 1.297 39.453 1.367 c
+39.412 1.444 39.353 1.503 39.276 1.544 c
+39.206 1.58 39.114 1.602 38.996 1.602 c
+38.886 1.602 38.791 1.577 38.703 1.529 c
+38.615 1.478 38.534 1.411 38.468 1.323 c
+38.409 1.235 38.358 1.125 38.321 1 c
+38.291 0.882 38.277 0.75 38.277 0.603 c
+38.277 -1.264 l
+37.365 -1.264 l
+37.365 3.514 l
+38.277 3.514 l
+38.277 2.205 l
+38.277 2.135 38.269 2.066 38.262 1.999 c
+38.262 1.793 l
+38.262 1.735 38.254 1.679 38.248 1.632 c
+38.248 1.515 l
+h
+46.075 0.838 1.866 -0.794 re
+46.075 0.044 m
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+54.478 2.22 m
+54.486 2.198 54.493 2.165 54.493 2.117 c
+54.501 2.076 54.508 2.028 54.508 1.97 c
+54.515 1.918 54.522 1.867 54.522 1.808 c
+54.522 1.646 l
+54.537 1.646 l
+54.596 1.764 54.663 1.86 54.743 1.941 c
+54.821 2.018 54.905 2.08 54.993 2.132 c
+55.081 2.19 55.17 2.227 55.258 2.249 c
+55.353 2.267 55.453 2.278 55.552 2.278 c
+55.758 2.278 55.937 2.234 56.095 2.146 c
+56.25 2.058 56.379 1.929 56.477 1.764 c
+56.585 1.606 56.662 1.415 56.712 1.191 c
+56.772 0.974 56.801 0.738 56.801 0.485 c
+56.801 0.221 56.772 -0.025 56.712 -0.249 c
+56.662 -0.467 56.585 -0.658 56.477 -0.823 c
+56.379 -0.981 56.246 -1.103 56.081 -1.19 c
+55.923 -1.278 55.735 -1.323 55.522 -1.323 c
+55.423 -1.323 55.324 -1.311 55.228 -1.294 c
+55.129 -1.271 55.037 -1.242 54.949 -1.19 c
+54.869 -1.143 54.791 -1.08 54.713 -0.999 c
+54.644 -0.922 54.585 -0.831 54.537 -0.72 c
+54.522 -0.72 l
+54.522 -0.808 l
+54.53 -0.849 54.537 -0.897 54.537 -0.955 c
+54.537 -1.117 l
+54.537 -1.294 l
+54.537 -2.631 l
+53.626 -2.631 l
+53.626 1.455 l
+53.626 1.621 53.618 1.768 53.612 1.897 c
+53.612 2.22 l
+h
+54.522 0.456 m
+54.522 0.228 54.541 0.037 54.582 -0.118 c
+54.63 -0.264 54.684 -0.382 54.743 -0.47 c
+54.809 -0.559 54.883 -0.625 54.964 -0.661 c
+55.041 -0.702 55.118 -0.72 55.199 -0.72 c
+55.295 -0.72 55.382 -0.698 55.463 -0.646 c
+55.552 -0.598 55.617 -0.529 55.669 -0.441 c
+55.728 -0.345 55.772 -0.22 55.802 -0.073 c
+55.839 0.081 55.86 0.268 55.86 0.485 c
+55.86 0.875 55.802 1.168 55.684 1.367 c
+55.574 1.562 55.419 1.661 55.214 1.661 c
+55.133 1.661 55.056 1.639 54.979 1.602 c
+54.898 1.562 54.824 1.5 54.758 1.411 c
+54.688 1.323 54.63 1.199 54.582 1.044 c
+54.541 0.886 54.522 0.691 54.522 0.456 c
+60.685 1.47 m
+60.586 1.478 60.483 1.488 60.377 1.5 c
+60.267 1.518 60.145 1.529 60.009 1.529 c
+59.833 1.529 59.675 1.488 59.538 1.411 c
+59.399 1.341 59.282 1.243 59.186 1.118 c
+59.098 0.989 59.028 0.842 58.981 0.676 c
+58.94 0.507 58.921 0.331 58.921 0.147 c
+58.921 -1.264 l
+58.025 -1.264 l
+58.025 0.985 l
+58.025 1.11 58.014 1.235 57.996 1.353 c
+57.984 1.478 57.969 1.596 57.951 1.706 c
+57.94 1.823 57.926 1.918 57.907 1.999 c
+57.886 2.088 57.867 2.161 57.848 2.22 c
+58.73 2.22 l
+58.738 2.168 58.748 2.117 58.76 2.058 c
+58.778 1.999 58.792 1.933 58.804 1.867 c
+58.823 1.808 58.837 1.742 58.848 1.675 c
+58.855 1.606 58.867 1.544 58.877 1.484 c
+58.892 1.484 l
+58.929 1.602 58.981 1.709 59.039 1.808 c
+59.105 1.904 59.186 1.989 59.274 2.058 c
+59.363 2.124 59.465 2.18 59.583 2.22 c
+59.708 2.257 59.855 2.278 60.024 2.278 c
+60.149 2.278 60.267 2.271 60.377 2.263 c
+60.494 2.253 60.597 2.238 60.685 2.22 c
+h
+62.615 2.22 m
+62.615 0.264 l
+62.615 0.125 62.622 0 62.644 -0.118 c
+62.663 -0.228 62.696 -0.32 62.746 -0.397 c
+62.794 -0.478 62.854 -0.54 62.923 -0.588 c
+62.989 -0.628 63.074 -0.646 63.173 -0.646 c
+63.261 -0.646 63.342 -0.628 63.423 -0.588 c
+63.511 -0.54 63.585 -0.47 63.644 -0.382 c
+63.702 -0.286 63.746 -0.176 63.776 -0.058 c
+63.812 0.067 63.835 0.206 63.835 0.353 c
+63.835 2.22 l
+64.731 2.22 l
+64.731 -0.484 l
+64.731 -0.72 l
+64.739 -0.801 64.746 -0.878 64.746 -0.955 c
+64.746 -1.147 l
+64.753 -1.198 64.76 -1.234 64.76 -1.264 c
+63.908 -1.264 l
+63.897 -1.234 63.886 -1.198 63.879 -1.147 c
+63.879 -0.955 l
+63.879 -0.889 63.872 -0.819 63.864 -0.75 c
+63.864 -0.573 l
+63.849 -0.573 l
+63.731 -0.837 63.577 -1.029 63.394 -1.147 c
+63.217 -1.264 63.015 -1.323 62.791 -1.323 c
+62.586 -1.323 62.412 -1.286 62.276 -1.22 c
+62.137 -1.153 62.027 -1.058 61.938 -0.941 c
+61.857 -0.823 61.799 -0.687 61.762 -0.529 c
+61.732 -0.363 61.718 -0.187 61.718 0 c
+61.718 2.22 l
+h
+67.983 -1.264 m
+67.983 0.721 l
+67.983 1.022 67.939 1.243 67.851 1.382 c
+67.77 1.529 67.634 1.602 67.44 1.602 c
+67.33 1.602 67.226 1.577 67.131 1.529 c
+67.043 1.478 66.962 1.411 66.896 1.323 c
+66.837 1.235 66.785 1.125 66.748 1 c
+66.719 0.882 66.705 0.75 66.705 0.603 c
+66.705 -1.264 l
+65.793 -1.264 l
+65.793 1.44 l
+65.793 1.661 l
+65.793 1.75 65.786 1.827 65.778 1.897 c
+65.778 2.088 l
+65.778 2.22 l
+66.631 2.22 l
+66.638 2.19 66.646 2.146 66.646 2.088 c
+66.646 1.897 l
+66.653 1.827 66.661 1.756 66.661 1.691 c
+66.667 1.621 66.675 1.565 66.675 1.529 c
+66.69 1.529 l
+66.808 1.793 66.958 1.985 67.145 2.103 c
+67.33 2.22 67.55 2.278 67.807 2.278 c
+67.991 2.278 68.153 2.249 68.292 2.19 c
+68.428 2.132 68.542 2.043 68.63 1.926 c
+68.718 1.808 68.781 1.665 68.822 1.5 c
+68.869 1.341 68.895 1.154 68.895 0.941 c
+68.895 -1.264 l
+h
+71.412 -1.323 m
+71.155 -1.323 70.927 -1.286 70.721 -1.22 c
+70.515 -1.143 70.339 -1.029 70.192 -0.881 c
+70.045 -0.727 69.927 -0.536 69.84 -0.309 c
+69.759 -0.085 69.722 0.181 69.722 0.485 c
+69.722 0.816 69.765 1.095 69.854 1.323 c
+69.95 1.558 70.078 1.742 70.236 1.881 c
+70.401 2.018 70.588 2.117 70.794 2.176 c
+71 2.242 71.21 2.278 71.427 2.278 c
+71.698 2.278 71.934 2.227 72.132 2.132 c
+72.338 2.043 72.504 1.911 72.632 1.735 c
+72.768 1.565 72.867 1.36 72.926 1.118 c
+72.992 0.882 73.029 0.617 73.029 0.324 c
+73.029 0.309 l
+70.663 0.309 l
+70.663 0.162 70.677 0.023 70.706 -0.103 c
+70.743 -0.231 70.798 -0.345 70.868 -0.441 c
+70.935 -0.529 71.018 -0.598 71.118 -0.646 c
+71.213 -0.698 71.328 -0.72 71.456 -0.72 c
+71.61 -0.72 71.75 -0.687 71.868 -0.617 c
+71.993 -0.551 72.08 -0.448 72.132 -0.309 c
+72.97 -0.382 l
+72.94 -0.481 72.886 -0.588 72.809 -0.706 c
+72.728 -0.816 72.624 -0.918 72.5 -1.014 c
+72.382 -1.103 72.228 -1.176 72.044 -1.234 c
+71.868 -1.294 71.654 -1.323 71.412 -1.323 c
+71.412 1.706 m
+71.324 1.706 71.236 1.691 71.147 1.661 c
+71.059 1.632 70.978 1.58 70.912 1.515 c
+70.842 1.444 70.783 1.357 70.736 1.249 c
+70.696 1.139 70.677 1.014 70.677 0.867 c
+72.147 0.867 l
+72.147 1.004 72.121 1.125 72.074 1.235 c
+72.033 1.341 71.978 1.43 71.912 1.5 c
+71.853 1.565 71.779 1.617 71.691 1.646 c
+71.603 1.683 71.507 1.706 71.412 1.706 c
+78.729 -2.631 m
+78.729 3.514 l
+80.654 3.514 l
+80.654 2.896 l
+79.581 2.896 l
+79.581 -2.013 l
+80.654 -2.013 l
+80.654 -2.631 l
+h
+85.052 1.47 m
+84.953 1.478 84.851 1.488 84.744 1.5 c
+84.634 1.518 84.512 1.529 84.377 1.529 c
+84.2 1.529 84.042 1.488 83.906 1.411 c
+83.766 1.341 83.649 1.243 83.554 1.118 c
+83.465 0.989 83.396 0.842 83.348 0.676 c
+83.307 0.507 83.288 0.331 83.288 0.147 c
+83.288 -1.264 l
+82.392 -1.264 l
+82.392 0.985 l
+82.392 1.11 82.381 1.235 82.363 1.353 c
+82.351 1.478 82.337 1.596 82.318 1.706 c
+82.307 1.823 82.293 1.918 82.274 1.999 c
+82.253 2.088 82.234 2.161 82.216 2.22 c
+83.097 2.22 l
+83.105 2.168 83.116 2.117 83.127 2.058 c
+83.145 1.999 83.16 1.933 83.171 1.867 c
+83.19 1.808 83.205 1.742 83.215 1.675 c
+83.223 1.606 83.234 1.544 83.245 1.484 c
+83.259 1.484 l
+83.296 1.602 83.348 1.709 83.406 1.808 c
+83.473 1.904 83.554 1.989 83.641 2.058 c
+83.73 2.124 83.833 2.18 83.951 2.22 c
+84.075 2.257 84.223 2.278 84.391 2.278 c
+84.516 2.278 84.634 2.271 84.744 2.263 c
+84.861 2.253 84.965 2.238 85.052 2.22 c
+h
+87.658 -1.323 m
+87.401 -1.323 87.173 -1.286 86.968 -1.22 c
+86.762 -1.143 86.585 -1.029 86.438 -0.881 c
+86.291 -0.727 86.174 -0.536 86.085 -0.309 c
+86.004 -0.085 85.968 0.181 85.968 0.485 c
+85.968 0.816 86.012 1.095 86.1 1.323 c
+86.195 1.558 86.324 1.742 86.482 1.881 c
+86.648 2.018 86.835 2.117 87.041 2.176 c
+87.246 2.242 87.456 2.278 87.673 2.278 c
+87.945 2.278 88.18 2.227 88.379 2.132 c
+88.584 2.043 88.749 1.911 88.878 1.735 c
+89.014 1.565 89.113 1.36 89.172 1.118 c
+89.239 0.882 89.275 0.617 89.275 0.324 c
+89.275 0.309 l
+86.908 0.309 l
+86.908 0.162 86.923 0.023 86.953 -0.103 c
+86.989 -0.231 87.045 -0.345 87.114 -0.441 c
+87.18 -0.529 87.265 -0.598 87.364 -0.646 c
+87.46 -0.698 87.573 -0.72 87.702 -0.72 c
+87.857 -0.72 87.996 -0.687 88.113 -0.617 c
+88.239 -0.551 88.327 -0.448 88.379 -0.309 c
+89.216 -0.382 l
+89.187 -0.481 89.131 -0.588 89.054 -0.706 c
+88.973 -0.816 88.871 -0.918 88.746 -1.014 c
+88.628 -1.103 88.474 -1.176 88.29 -1.234 c
+88.113 -1.294 87.901 -1.323 87.658 -1.323 c
+87.658 1.706 m
+87.57 1.706 87.481 1.691 87.394 1.661 c
+87.305 1.632 87.224 1.58 87.159 1.515 c
+87.089 1.444 87.03 1.357 86.982 1.249 c
+86.941 1.139 86.923 1.014 86.923 0.867 c
+88.393 0.867 l
+88.393 1.004 88.367 1.125 88.319 1.235 c
+88.279 1.341 88.224 1.43 88.158 1.5 c
+88.099 1.565 88.026 1.617 87.937 1.646 c
+87.849 1.683 87.754 1.706 87.658 1.706 c
+91.322 -1.264 m
+91.322 0.852 l
+91.322 1.018 91.315 1.154 91.307 1.264 c
+91.296 1.371 91.278 1.455 91.248 1.515 c
+91.226 1.58 91.197 1.632 91.16 1.661 c
+91.13 1.691 91.09 1.706 91.043 1.706 c
+90.984 1.706 90.929 1.675 90.881 1.617 c
+90.841 1.565 90.808 1.492 90.778 1.397 c
+90.748 1.309 90.723 1.195 90.704 1.058 c
+90.694 0.919 90.69 0.769 90.69 0.603 c
+90.69 -1.264 l
+89.94 -1.264 l
+89.94 1.47 l
+89.94 1.706 l
+89.94 1.926 l
+89.94 2.003 89.933 2.066 89.925 2.117 c
+89.925 2.22 l
+90.602 2.22 l
+90.602 2.132 l
+90.602 1.985 l
+90.609 1.926 90.617 1.867 90.617 1.808 c
+90.617 1.646 l
+90.631 1.646 l
+90.65 1.735 90.679 1.812 90.719 1.881 c
+90.756 1.959 90.8 2.028 90.852 2.088 c
+90.91 2.146 90.976 2.19 91.057 2.22 c
+91.134 2.257 91.223 2.278 91.322 2.278 c
+91.506 2.278 91.645 2.224 91.733 2.117 c
+91.829 2.018 91.899 1.86 91.939 1.646 c
+91.954 1.646 l
+91.99 1.742 92.031 1.831 92.071 1.911 c
+92.119 1.989 92.175 2.051 92.233 2.103 c
+92.292 2.161 92.358 2.205 92.439 2.234 c
+92.516 2.263 92.604 2.278 92.703 2.278 c
+92.84 2.278 92.954 2.253 93.042 2.205 c
+93.129 2.153 93.196 2.08 93.247 1.985 c
+93.306 1.885 93.343 1.756 93.365 1.602 c
+93.395 1.455 93.409 1.272 93.409 1.058 c
+93.409 -1.264 l
+92.689 -1.264 l
+92.689 0.852 l
+92.689 1.018 92.682 1.154 92.674 1.264 c
+92.663 1.371 92.645 1.455 92.615 1.515 c
+92.593 1.58 92.564 1.632 92.527 1.661 c
+92.498 1.691 92.458 1.706 92.41 1.706 c
+92.292 1.706 92.196 1.617 92.13 1.44 c
+92.071 1.272 92.042 1.014 92.042 0.661 c
+92.042 -1.264 l
+h
+97.43 0.485 m
+97.43 0.21 97.393 -0.04 97.326 -0.264 c
+97.256 -0.481 97.154 -0.669 97.018 -0.823 c
+96.878 -0.981 96.701 -1.103 96.489 -1.19 c
+96.271 -1.278 96.018 -1.323 95.724 -1.323 c
+95.448 -1.323 95.202 -1.278 94.989 -1.19 c
+94.783 -1.103 94.611 -0.981 94.475 -0.823 c
+94.335 -0.669 94.232 -0.481 94.166 -0.264 c
+94.096 -0.04 94.064 0.21 94.064 0.485 c
+94.064 0.738 94.093 0.974 94.151 1.191 c
+94.218 1.415 94.32 1.606 94.46 1.764 c
+94.596 1.929 94.772 2.058 94.989 2.146 c
+95.202 2.234 95.46 2.278 95.753 2.278 c
+96.065 2.278 96.327 2.234 96.533 2.146 c
+96.746 2.058 96.919 1.929 97.047 1.764 c
+97.183 1.606 97.282 1.415 97.341 1.191 c
+97.399 0.974 97.43 0.738 97.43 0.485 c
+96.474 0.485 m
+96.474 0.691 96.459 0.867 96.43 1.014 c
+96.408 1.162 96.371 1.283 96.312 1.382 c
+96.254 1.478 96.18 1.548 96.092 1.588 c
+96.003 1.636 95.893 1.661 95.768 1.661 c
+95.504 1.661 95.313 1.562 95.195 1.367 c
+95.078 1.18 95.018 0.886 95.018 0.485 c
+95.018 0.063 95.078 -0.243 95.195 -0.426 c
+95.313 -0.613 95.489 -0.706 95.724 -0.706 c
+95.849 -0.706 95.963 -0.687 96.063 -0.646 c
+96.158 -0.598 96.239 -0.525 96.298 -0.426 c
+96.364 -0.33 96.408 -0.206 96.43 -0.058 c
+96.459 0.088 96.474 0.268 96.474 0.485 c
+98.888 1.602 m
+98.344 1.602 l
+98.344 2.22 l
+98.932 2.22 l
+99.211 3.117 l
+99.785 3.117 l
+99.785 2.22 l
+101.019 2.22 l
+101.019 1.602 l
+99.785 1.602 l
+99.785 -0.103 l
+99.785 -0.324 l
+99.792 -0.393 99.814 -0.455 99.843 -0.515 c
+99.88 -0.565 99.936 -0.61 100.005 -0.646 c
+100.082 -0.676 100.196 -0.69 100.343 -0.69 c
+100.479 -0.69 100.615 -0.687 100.755 -0.676 c
+100.891 -0.658 101.023 -0.632 101.152 -0.602 c
+101.152 -1.205 l
+101.071 -1.216 100.994 -1.23 100.917 -1.249 c
+100.836 -1.261 100.759 -1.267 100.682 -1.278 c
+100.601 -1.286 100.512 -1.294 100.416 -1.294 c
+100.329 -1.301 100.229 -1.308 100.123 -1.308 c
+99.936 -1.308 99.774 -1.294 99.637 -1.264 c
+99.51 -1.227 99.396 -1.183 99.3 -1.132 c
+99.211 -1.084 99.138 -1.025 99.08 -0.955 c
+99.02 -0.878 98.976 -0.801 98.947 -0.72 c
+98.918 -0.632 98.895 -0.544 98.888 -0.455 c
+98.877 -0.36 98.874 -0.264 98.874 -0.176 c
+h
+103.904 -1.323 m
+103.647 -1.323 103.419 -1.286 103.213 -1.22 c
+103.007 -1.143 102.831 -1.029 102.685 -0.881 c
+102.537 -0.727 102.419 -0.536 102.332 -0.309 c
+102.251 -0.085 102.214 0.181 102.214 0.485 c
+102.214 0.816 102.257 1.095 102.346 1.323 c
+102.442 1.558 102.571 1.742 102.728 1.881 c
+102.893 2.018 103.082 2.117 103.287 2.176 c
+103.493 2.242 103.702 2.278 103.919 2.278 c
+104.191 2.278 104.426 2.227 104.624 2.132 c
+104.83 2.043 104.996 1.911 105.124 1.735 c
+105.26 1.565 105.359 1.36 105.418 1.118 c
+105.484 0.882 105.521 0.617 105.521 0.324 c
+105.521 0.309 l
+103.155 0.309 l
+103.155 0.162 103.169 0.023 103.198 -0.103 c
+103.236 -0.231 103.29 -0.345 103.36 -0.441 c
+103.427 -0.529 103.511 -0.598 103.61 -0.646 c
+103.706 -0.698 103.82 -0.72 103.948 -0.72 c
+104.102 -0.72 104.242 -0.687 104.36 -0.617 c
+104.485 -0.551 104.573 -0.448 104.624 -0.309 c
+105.463 -0.382 l
+105.433 -0.481 105.378 -0.588 105.301 -0.706 c
+105.22 -0.816 105.117 -0.918 104.992 -1.014 c
+104.875 -1.103 104.72 -1.176 104.536 -1.234 c
+104.36 -1.294 104.146 -1.323 103.904 -1.323 c
+103.904 1.706 m
+103.816 1.706 103.728 1.691 103.639 1.661 c
+103.552 1.632 103.471 1.58 103.404 1.515 c
+103.335 1.444 103.276 1.357 103.228 1.249 c
+103.188 1.139 103.169 1.014 103.169 0.867 c
+104.639 0.867 l
+104.639 1.004 104.613 1.125 104.566 1.235 c
+104.526 1.341 104.47 1.43 104.404 1.5 c
+104.345 1.565 104.272 1.617 104.183 1.646 c
+104.096 1.683 104 1.706 103.904 1.706 c
+106.774 -2.631 m
+106.774 -2.013 l
+107.847 -2.013 l
+107.847 2.896 l
+106.774 2.896 l
+106.774 3.514 l
+108.7 3.514 l
+108.7 -2.631 l
+h
+f
+Q
+q 1 0 0 1 70.6476 229.5009 cm
+0 0 m
+-0.941 0 l
+-0.941 -2.161 l
+-1.617 -2.161 l
+-1.617 3.19 l
+-0.118 3.19 l
+0.412 3.19 0.809 3.05 1.073 2.778 c
+1.345 2.502 1.484 2.105 1.484 1.588 c
+1.484 1.253 1.411 0.963 1.264 0.721 c
+1.118 0.474 0.912 0.287 0.647 0.162 c
+1.675 -2.117 l
+1.675 -2.161 l
+0.956 -2.161 l
+h
+-0.941 0.588 m
+-0.118 0.588 l
+0.166 0.588 0.389 0.676 0.559 0.852 c
+0.724 1.037 0.809 1.282 0.809 1.588 c
+0.809 2.271 0.493 2.616 -0.132 2.616 c
+-0.941 2.616 l
+h
+3.719 -2.234 m
+3.219 -2.234 2.837 -2.087 2.573 -1.793 c
+2.308 -1.5 2.176 -1.066 2.176 -0.484 c
+2.176 -0.014 l
+2.176 0.58 2.301 1.047 2.558 1.382 c
+2.822 1.723 3.183 1.897 3.645 1.897 c
+4.105 1.897 4.447 1.742 4.675 1.44 c
+4.91 1.147 5.031 0.684 5.042 0.059 c
+5.042 -0.367 l
+2.822 -0.367 l
+2.822 -0.455 l
+2.822 -0.889 2.899 -1.201 3.057 -1.396 c
+3.223 -1.583 3.454 -1.675 3.749 -1.675 c
+3.944 -1.675 4.116 -1.643 4.262 -1.573 c
+4.41 -1.496 4.546 -1.378 4.675 -1.22 c
+5.012 -1.631 l
+4.726 -2.036 4.296 -2.234 3.719 -2.234 c
+3.645 1.338 m
+3.37 1.338 3.167 1.242 3.043 1.058 c
+2.914 0.871 2.841 0.58 2.822 0.191 c
+4.395 0.191 l
+4.395 0.279 l
+4.373 0.661 4.307 0.929 4.189 1.087 c
+4.072 1.253 3.888 1.338 3.645 1.338 c
+6.438 1.823 m
+6.453 1.455 l
+6.695 1.75 7.015 1.897 7.408 1.897 c
+7.85 1.897 8.158 1.698 8.335 1.309 c
+8.588 1.698 8.937 1.897 9.378 1.897 c
+10.113 1.897 10.488 1.434 10.51 0.515 c
+10.51 -2.161 l
+9.864 -2.161 l
+9.864 0.456 l
+9.864 0.75 9.808 0.963 9.702 1.103 c
+9.602 1.239 9.43 1.309 9.187 1.309 c
+8.989 1.309 8.827 1.228 8.702 1.073 c
+8.584 0.927 8.515 0.735 8.496 0.5 c
+8.496 -2.161 l
+7.834 -2.161 l
+7.834 0.485 l
+7.834 1.033 7.614 1.309 7.173 1.309 c
+6.839 1.309 6.604 1.147 6.468 0.823 c
+6.468 -2.161 l
+5.821 -2.161 l
+5.821 1.823 l
+h
+11.348 0.015 m
+11.348 0.592 11.484 1.047 11.759 1.382 c
+12.042 1.723 12.414 1.897 12.877 1.897 c
+13.336 1.897 13.704 1.727 13.979 1.397 c
+14.262 1.073 14.409 0.625 14.42 0.059 c
+14.42 -0.367 l
+14.42 -0.937 14.277 -1.392 13.993 -1.735 c
+13.718 -2.069 13.351 -2.234 12.891 -2.234 c
+12.428 -2.234 12.057 -2.072 11.774 -1.749 c
+11.499 -1.419 11.356 -0.977 11.348 -0.426 c
+h
+11.994 -0.367 m
+11.994 -0.771 12.072 -1.087 12.23 -1.323 c
+12.395 -1.558 12.615 -1.675 12.891 -1.675 c
+13.457 -1.675 13.751 -1.264 13.773 -0.441 c
+13.773 0.015 l
+13.773 0.416 13.689 0.735 13.523 0.97 c
+13.365 1.213 13.149 1.338 12.877 1.338 c
+12.612 1.338 12.395 1.213 12.23 0.97 c
+12.072 0.735 11.994 0.416 11.994 0.015 c
+h
+16.331 -1.176 m
+17.081 1.823 l
+17.742 1.823 l
+16.566 -2.161 l
+16.081 -2.161 l
+14.89 1.823 l
+15.551 1.823 l
+h
+19.8 -2.234 m
+19.3 -2.234 18.918 -2.087 18.653 -1.793 c
+18.389 -1.5 18.257 -1.066 18.257 -0.484 c
+18.257 -0.014 l
+18.257 0.58 18.381 1.047 18.639 1.382 c
+18.903 1.723 19.264 1.897 19.726 1.897 c
+20.185 1.897 20.528 1.742 20.756 1.44 c
+20.991 1.147 21.112 0.684 21.122 0.059 c
+21.122 -0.367 l
+18.903 -0.367 l
+18.903 -0.455 l
+18.903 -0.889 18.98 -1.201 19.138 -1.396 c
+19.304 -1.583 19.535 -1.675 19.829 -1.675 c
+20.024 -1.675 20.197 -1.643 20.343 -1.573 c
+20.49 -1.496 20.627 -1.378 20.756 -1.22 c
+21.093 -1.631 l
+20.806 -2.036 20.376 -2.234 19.8 -2.234 c
+19.726 1.338 m
+19.451 1.338 19.248 1.242 19.123 1.058 c
+18.995 0.871 18.922 0.58 18.903 0.191 c
+20.476 0.191 l
+20.476 0.279 l
+20.454 0.661 20.388 0.929 20.27 1.087 c
+20.153 1.253 19.969 1.338 19.726 1.338 c
+25.268 1.205 m
+25.18 1.224 25.08 1.235 24.974 1.235 c
+24.64 1.235 24.405 1.051 24.268 0.691 c
+24.268 -2.161 l
+23.622 -2.161 l
+23.622 1.823 l
+24.253 1.823 l
+24.268 1.411 l
+24.445 1.735 24.687 1.897 25.003 1.897 c
+25.11 1.897 25.198 1.874 25.268 1.837 c
+h
+27.267 -2.234 m
+26.767 -2.234 26.385 -2.087 26.121 -1.793 c
+25.856 -1.5 25.724 -1.066 25.724 -0.484 c
+25.724 -0.014 l
+25.724 0.58 25.849 1.047 26.106 1.382 c
+26.37 1.723 26.73 1.897 27.194 1.897 c
+27.653 1.897 27.995 1.742 28.222 1.44 c
+28.457 1.147 28.579 0.684 28.59 0.059 c
+28.59 -0.367 l
+26.37 -0.367 l
+26.37 -0.455 l
+26.37 -0.889 26.448 -1.201 26.605 -1.396 c
+26.771 -1.583 27.002 -1.675 27.296 -1.675 c
+27.491 -1.675 27.664 -1.643 27.811 -1.573 c
+27.958 -1.496 28.094 -1.378 28.222 -1.22 c
+28.561 -1.631 l
+28.274 -2.036 27.844 -2.234 27.267 -2.234 c
+27.194 1.338 m
+26.918 1.338 26.716 1.242 26.591 1.058 c
+26.462 0.871 26.389 0.58 26.37 0.191 c
+27.943 0.191 l
+27.943 0.279 l
+27.921 0.661 27.855 0.929 27.738 1.087 c
+27.62 1.253 27.436 1.338 27.194 1.338 c
+29.986 1.823 m
+30.001 1.455 l
+30.244 1.75 30.564 1.897 30.957 1.897 c
+31.397 1.897 31.706 1.698 31.883 1.309 c
+32.136 1.698 32.485 1.897 32.926 1.897 c
+33.661 1.897 34.036 1.434 34.058 0.515 c
+34.058 -2.161 l
+33.411 -2.161 l
+33.411 0.456 l
+33.411 0.75 33.356 0.963 33.249 1.103 c
+33.151 1.239 32.978 1.309 32.735 1.309 c
+32.536 1.309 32.375 1.228 32.249 1.073 c
+32.133 0.927 32.062 0.735 32.044 0.5 c
+32.044 -2.161 l
+31.383 -2.161 l
+31.383 0.485 l
+31.383 1.033 31.162 1.309 30.722 1.309 c
+30.387 1.309 30.152 1.147 30.016 0.823 c
+30.016 -2.161 l
+29.369 -2.161 l
+29.369 1.823 l
+h
+34.896 0.015 m
+34.896 0.592 35.032 1.047 35.307 1.382 c
+35.59 1.723 35.962 1.897 36.424 1.897 c
+36.884 1.897 37.251 1.727 37.527 1.397 c
+37.81 1.073 37.957 0.625 37.968 0.059 c
+37.968 -0.367 l
+37.968 -0.937 37.824 -1.392 37.542 -1.735 c
+37.266 -2.069 36.899 -2.234 36.44 -2.234 c
+35.976 -2.234 35.605 -2.072 35.322 -1.749 c
+35.046 -1.419 34.903 -0.977 34.896 -0.426 c
+h
+35.542 -0.367 m
+35.542 -0.771 35.62 -1.087 35.777 -1.323 c
+35.943 -1.558 36.164 -1.675 36.44 -1.675 c
+37.005 -1.675 37.299 -1.264 37.321 -0.441 c
+37.321 0.015 l
+37.321 0.416 37.236 0.735 37.072 0.97 c
+36.914 1.213 36.696 1.338 36.424 1.338 c
+36.16 1.338 35.943 1.213 35.777 0.97 c
+35.62 0.735 35.542 0.416 35.542 0.015 c
+h
+39.659 2.778 m
+39.659 1.823 l
+40.261 1.823 l
+40.261 1.294 l
+39.659 1.294 l
+39.659 -1.176 l
+39.659 -1.334 39.68 -1.452 39.732 -1.529 c
+39.79 -1.61 39.879 -1.646 39.996 -1.646 c
+40.085 -1.646 40.172 -1.631 40.261 -1.602 c
+40.261 -2.161 l
+40.114 -2.209 39.96 -2.234 39.805 -2.234 c
+39.548 -2.234 39.353 -2.142 39.218 -1.955 c
+39.077 -1.771 39.012 -1.51 39.012 -1.176 c
+39.012 1.294 l
+38.409 1.294 l
+38.409 1.823 l
+39.012 1.823 l
+39.012 2.778 l
+h
+42.451 -2.234 m
+41.951 -2.234 41.569 -2.087 41.305 -1.793 c
+41.04 -1.5 40.908 -1.066 40.908 -0.484 c
+40.908 -0.014 l
+40.908 0.58 41.032 1.047 41.29 1.382 c
+41.554 1.723 41.915 1.897 42.377 1.897 c
+42.837 1.897 43.179 1.742 43.407 1.44 c
+43.642 1.147 43.763 0.684 43.774 0.059 c
+43.774 -0.367 l
+41.554 -0.367 l
+41.554 -0.455 l
+41.554 -0.889 41.631 -1.201 41.79 -1.396 c
+41.955 -1.583 42.187 -1.675 42.481 -1.675 c
+42.676 -1.675 42.848 -1.643 42.995 -1.573 c
+43.142 -1.496 43.278 -1.378 43.407 -1.22 c
+43.744 -1.631 l
+43.458 -2.036 43.028 -2.234 42.451 -2.234 c
+42.377 1.338 m
+42.102 1.338 41.9 1.242 41.775 1.058 c
+41.647 0.871 41.573 0.58 41.554 0.191 c
+43.127 0.191 l
+43.127 0.279 l
+43.106 0.661 43.039 0.929 42.921 1.087 c
+42.804 1.253 42.62 1.338 42.377 1.338 c
+47.919 1.205 m
+47.831 1.224 47.732 1.235 47.625 1.235 c
+47.291 1.235 47.056 1.051 46.919 0.691 c
+46.919 -2.161 l
+46.273 -2.161 l
+46.273 1.823 l
+46.905 1.823 l
+46.919 1.411 l
+47.096 1.735 47.339 1.897 47.655 1.897 c
+47.761 1.897 47.85 1.874 47.919 1.837 c
+h
+49.918 -2.234 m
+49.418 -2.234 49.036 -2.087 48.772 -1.793 c
+48.507 -1.5 48.375 -1.066 48.375 -0.484 c
+48.375 -0.014 l
+48.375 0.58 48.5 1.047 48.757 1.382 c
+49.022 1.723 49.381 1.897 49.845 1.897 c
+50.304 1.897 50.646 1.742 50.873 1.44 c
+51.108 1.147 51.23 0.684 51.241 0.059 c
+51.241 -0.367 l
+49.022 -0.367 l
+49.022 -0.455 l
+49.022 -0.889 49.099 -1.201 49.257 -1.396 c
+49.422 -1.583 49.653 -1.675 49.948 -1.675 c
+50.142 -1.675 50.315 -1.643 50.462 -1.573 c
+50.609 -1.496 50.745 -1.378 50.873 -1.22 c
+51.212 -1.631 l
+50.925 -2.036 50.495 -2.234 49.918 -2.234 c
+49.845 1.338 m
+49.569 1.338 49.367 1.242 49.242 1.058 c
+49.113 0.871 49.04 0.58 49.022 0.191 c
+50.594 0.191 l
+50.594 0.279 l
+50.572 0.661 50.506 0.929 50.389 1.087 c
+50.271 1.253 50.087 1.338 49.845 1.338 c
+52.315 -2.161 m
+52.315 1.294 l
+51.785 1.294 l
+51.785 1.823 l
+52.315 1.823 l
+52.315 2.278 l
+52.315 2.679 52.41 2.992 52.608 3.219 c
+52.814 3.443 53.093 3.557 53.446 3.557 c
+53.582 3.557 53.714 3.535 53.843 3.499 c
+53.813 2.955 l
+53.714 2.973 53.615 2.984 53.52 2.984 c
+53.144 2.984 52.961 2.72 52.961 2.19 c
+52.961 1.823 l
+53.637 1.823 l
+53.637 1.294 l
+52.961 1.294 l
+52.961 -2.161 l
+h
+56.342 -1.147 m
+56.342 -0.999 56.286 -0.878 56.18 -0.779 c
+56.07 -0.683 55.864 -0.565 55.563 -0.426 c
+55.218 -0.279 54.975 -0.158 54.827 -0.058 c
+54.68 0.048 54.57 0.166 54.505 0.294 c
+54.435 0.419 54.401 0.577 54.401 0.765 c
+54.401 1.087 54.519 1.357 54.754 1.573 c
+54.989 1.786 55.291 1.897 55.665 1.897 c
+56.047 1.897 56.357 1.783 56.592 1.558 c
+56.827 1.33 56.944 1.044 56.944 0.691 c
+56.298 0.691 l
+56.298 0.867 56.238 1.018 56.122 1.147 c
+56.003 1.272 55.849 1.338 55.665 1.338 c
+55.467 1.338 55.316 1.282 55.21 1.176 c
+55.1 1.077 55.048 0.945 55.048 0.779 c
+55.048 0.651 55.085 0.544 55.166 0.456 c
+55.243 0.375 55.434 0.272 55.739 0.147 c
+56.217 -0.04 56.548 -0.228 56.724 -0.411 c
+56.901 -0.588 56.988 -0.816 56.988 -1.087 c
+56.988 -1.44 56.864 -1.72 56.621 -1.926 c
+56.386 -2.131 56.07 -2.234 55.68 -2.234 c
+55.258 -2.234 54.919 -2.117 54.666 -1.881 c
+54.409 -1.639 54.283 -1.334 54.283 -0.97 c
+54.931 -0.97 l
+54.938 -1.198 55.008 -1.374 55.137 -1.5 c
+55.261 -1.617 55.445 -1.675 55.68 -1.675 c
+55.893 -1.675 56.055 -1.627 56.165 -1.529 c
+56.283 -1.433 56.342 -1.305 56.342 -1.147 c
+57.841 -3.233 m
+57.444 -2.969 l
+57.68 -2.645 57.801 -2.311 57.811 -1.97 c
+57.811 -1.352 l
+58.474 -1.352 l
+58.474 -1.881 l
+58.474 -2.138 58.407 -2.385 58.282 -2.631 c
+58.164 -2.874 58.017 -3.075 57.841 -3.233 c
+61.883 2.778 m
+61.883 1.823 l
+62.486 1.823 l
+62.486 1.294 l
+61.883 1.294 l
+61.883 -1.176 l
+61.883 -1.334 61.905 -1.452 61.957 -1.529 c
+62.015 -1.61 62.104 -1.646 62.221 -1.646 c
+62.31 -1.646 62.397 -1.631 62.486 -1.602 c
+62.486 -2.161 l
+62.339 -2.209 62.185 -2.234 62.03 -2.234 c
+61.773 -2.234 61.578 -2.142 61.443 -1.955 c
+61.302 -1.771 61.236 -1.51 61.236 -1.176 c
+61.236 1.294 l
+60.633 1.294 l
+60.633 1.823 l
+61.236 1.823 l
+61.236 2.778 l
+h
+63.897 1.411 m
+64.151 1.735 64.47 1.897 64.853 1.897 c
+65.558 1.897 65.915 1.426 65.925 0.485 c
+65.925 -2.161 l
+65.279 -2.161 l
+65.279 0.456 l
+65.279 0.769 65.223 0.989 65.117 1.118 c
+65.007 1.242 64.853 1.309 64.647 1.309 c
+64.489 1.309 64.342 1.253 64.205 1.147 c
+64.078 1.037 63.974 0.9 63.897 0.735 c
+63.897 -2.161 l
+63.251 -2.161 l
+63.251 3.484 l
+63.897 3.484 l
+h
+68.924 -2.161 m
+68.884 -2.072 68.858 -1.926 68.851 -1.72 c
+68.616 -2.065 68.321 -2.234 67.968 -2.234 c
+67.605 -2.234 67.322 -2.138 67.116 -1.94 c
+66.918 -1.735 66.822 -1.448 66.822 -1.072 c
+66.822 -0.673 66.958 -0.353 67.234 -0.118 c
+67.506 0.125 67.881 0.25 68.351 0.25 c
+68.836 0.25 l
+68.836 0.676 l
+68.836 0.912 68.781 1.077 68.674 1.176 c
+68.564 1.282 68.402 1.338 68.189 1.338 c
+67.991 1.338 67.829 1.279 67.704 1.162 c
+67.586 1.044 67.527 0.897 67.527 0.721 c
+66.881 0.721 l
+66.881 0.915 66.94 1.106 67.057 1.294 c
+67.182 1.477 67.344 1.625 67.542 1.735 c
+67.748 1.841 67.976 1.897 68.233 1.897 c
+68.634 1.897 68.938 1.793 69.144 1.588 c
+69.358 1.382 69.472 1.087 69.483 0.706 c
+69.483 -1.308 l
+69.483 -1.613 69.52 -1.878 69.601 -2.102 c
+69.601 -2.161 l
+h
+68.057 -1.646 m
+68.222 -1.646 68.373 -1.602 68.512 -1.514 c
+68.66 -1.425 68.766 -1.315 68.836 -1.176 c
+68.836 -0.235 l
+68.468 -0.235 l
+68.153 -0.235 67.91 -0.305 67.733 -0.441 c
+67.557 -0.569 67.469 -0.757 67.469 -0.999 c
+67.469 -1.228 67.513 -1.392 67.602 -1.5 c
+67.689 -1.598 67.84 -1.646 68.057 -1.646 c
+71.334 2.778 m
+71.334 1.823 l
+71.937 1.823 l
+71.937 1.294 l
+71.334 1.294 l
+71.334 -1.176 l
+71.334 -1.334 71.357 -1.452 71.409 -1.529 c
+71.467 -1.61 71.555 -1.646 71.673 -1.646 c
+71.761 -1.646 71.849 -1.631 71.937 -1.602 c
+71.937 -2.161 l
+71.791 -2.209 71.636 -2.234 71.482 -2.234 c
+71.224 -2.234 71.03 -2.142 70.894 -1.955 c
+70.754 -1.771 70.688 -1.51 70.688 -1.176 c
+70.688 1.294 l
+70.085 1.294 l
+70.085 1.823 l
+70.688 1.823 l
+70.688 2.778 l
+h
+77.391 -1.014 m
+77.994 1.823 l
+78.64 1.823 l
+77.655 -2.161 l
+77.141 -2.161 l
+76.362 0.691 l
+75.612 -2.161 l
+75.083 -2.161 l
+74.127 1.823 l
+74.76 1.823 l
+75.377 -0.941 l
+76.112 1.823 l
+76.626 1.823 l
+h
+80.742 -2.234 m
+80.242 -2.234 79.86 -2.087 79.596 -1.793 c
+79.331 -1.5 79.199 -1.066 79.199 -0.484 c
+79.199 -0.014 l
+79.199 0.58 79.324 1.047 79.581 1.382 c
+79.845 1.723 80.206 1.897 80.668 1.897 c
+81.128 1.897 81.47 1.742 81.698 1.44 c
+81.933 1.147 82.054 0.684 82.065 0.059 c
+82.065 -0.367 l
+79.845 -0.367 l
+79.845 -0.455 l
+79.845 -0.889 79.922 -1.201 80.08 -1.396 c
+80.246 -1.583 80.477 -1.675 80.772 -1.675 c
+80.967 -1.675 81.139 -1.643 81.286 -1.573 c
+81.433 -1.496 81.569 -1.378 81.698 -1.22 c
+82.035 -1.631 l
+81.749 -2.036 81.319 -2.234 80.742 -2.234 c
+80.668 1.338 m
+80.393 1.338 80.19 1.242 80.066 1.058 c
+79.937 0.871 79.864 0.58 79.845 0.191 c
+81.418 0.191 l
+81.418 0.279 l
+81.397 0.661 81.33 0.929 81.212 1.087 c
+81.095 1.253 80.911 1.338 80.668 1.338 c
+84.491 1.205 m
+84.402 1.224 84.303 1.235 84.196 1.235 c
+83.862 1.235 83.627 1.051 83.491 0.691 c
+83.491 -2.161 l
+82.844 -2.161 l
+82.844 1.823 l
+83.477 1.823 l
+83.491 1.411 l
+83.667 1.735 83.91 1.897 84.225 1.897 c
+84.333 1.897 84.421 1.874 84.491 1.837 c
+h
+86.49 -2.234 m
+85.99 -2.234 85.607 -2.087 85.343 -1.793 c
+85.079 -1.5 84.946 -1.066 84.946 -0.484 c
+84.946 -0.014 l
+84.946 0.58 85.071 1.047 85.328 1.382 c
+85.593 1.723 85.953 1.897 86.416 1.897 c
+86.875 1.897 87.217 1.742 87.445 1.44 c
+87.68 1.147 87.801 0.684 87.812 0.059 c
+87.812 -0.367 l
+85.593 -0.367 l
+85.593 -0.455 l
+85.593 -0.889 85.67 -1.201 85.828 -1.396 c
+85.993 -1.583 86.225 -1.675 86.519 -1.675 c
+86.714 -1.675 86.887 -1.643 87.033 -1.573 c
+87.18 -1.496 87.317 -1.378 87.445 -1.22 c
+87.783 -1.631 l
+87.496 -2.036 87.066 -2.234 86.49 -2.234 c
+86.416 1.338 m
+86.141 1.338 85.938 1.242 85.813 1.058 c
+85.684 0.871 85.611 0.58 85.593 0.191 c
+87.166 0.191 l
+87.166 0.279 l
+87.144 0.661 87.078 0.929 86.96 1.087 c
+86.842 1.253 86.658 1.338 86.416 1.338 c
+91.957 1.205 m
+91.87 1.224 91.77 1.235 91.664 1.235 c
+91.329 1.235 91.094 1.051 90.958 0.691 c
+90.958 -2.161 l
+90.311 -2.161 l
+90.311 1.823 l
+90.943 1.823 l
+90.958 1.411 l
+91.134 1.735 91.377 1.897 91.693 1.897 c
+91.799 1.897 91.888 1.874 91.957 1.837 c
+h
+93.956 -2.234 m
+93.457 -2.234 93.075 -2.087 92.811 -1.793 c
+92.545 -1.5 92.414 -1.066 92.414 -0.484 c
+92.414 -0.014 l
+92.414 0.58 92.538 1.047 92.795 1.382 c
+93.06 1.723 93.42 1.897 93.883 1.897 c
+94.342 1.897 94.684 1.742 94.912 1.44 c
+95.147 1.147 95.269 0.684 95.279 0.059 c
+95.279 -0.367 l
+93.06 -0.367 l
+93.06 -0.455 l
+93.06 -0.889 93.137 -1.201 93.295 -1.396 c
+93.461 -1.583 93.692 -1.675 93.986 -1.675 c
+94.181 -1.675 94.353 -1.643 94.5 -1.573 c
+94.648 -1.496 94.783 -1.378 94.912 -1.22 c
+95.25 -1.631 l
+94.964 -2.036 94.534 -2.234 93.956 -2.234 c
+93.883 1.338 m
+93.607 1.338 93.405 1.242 93.281 1.058 c
+93.152 0.871 93.079 0.58 93.06 0.191 c
+94.633 0.191 l
+94.633 0.279 l
+94.611 0.661 94.544 0.929 94.427 1.087 c
+94.309 1.253 94.126 1.338 93.883 1.338 c
+96.676 1.823 m
+96.69 1.455 l
+96.933 1.75 97.253 1.897 97.646 1.897 c
+98.087 1.897 98.396 1.698 98.572 1.309 c
+98.826 1.698 99.175 1.897 99.616 1.897 c
+100.351 1.897 100.726 1.434 100.748 0.515 c
+100.748 -2.161 l
+100.101 -2.161 l
+100.101 0.456 l
+100.101 0.75 100.046 0.963 99.939 1.103 c
+99.84 1.239 99.668 1.309 99.425 1.309 c
+99.226 1.309 99.065 1.228 98.939 1.073 c
+98.822 0.927 98.752 0.735 98.733 0.5 c
+98.733 -2.161 l
+98.072 -2.161 l
+98.072 0.485 l
+98.072 1.033 97.852 1.309 97.411 1.309 c
+97.077 1.309 96.842 1.147 96.705 0.823 c
+96.705 -2.161 l
+96.059 -2.161 l
+96.059 1.823 l
+h
+101.586 0.015 m
+101.586 0.592 101.721 1.047 101.997 1.382 c
+102.28 1.723 102.651 1.897 103.114 1.897 c
+103.574 1.897 103.941 1.727 104.216 1.397 c
+104.499 1.073 104.647 0.625 104.657 0.059 c
+104.657 -0.367 l
+104.657 -0.937 104.514 -1.392 104.231 -1.735 c
+103.955 -2.069 103.589 -2.234 103.129 -2.234 c
+102.666 -2.234 102.295 -2.072 102.012 -1.749 c
+101.736 -1.419 101.592 -0.977 101.586 -0.426 c
+h
+102.232 -0.367 m
+102.232 -0.771 102.309 -1.087 102.467 -1.323 c
+102.633 -1.558 102.853 -1.675 103.129 -1.675 c
+103.695 -1.675 103.988 -1.264 104.011 -0.441 c
+104.011 0.015 l
+104.011 0.416 103.926 0.735 103.761 0.97 c
+103.603 1.213 103.386 1.338 103.114 1.338 c
+102.849 1.338 102.633 1.213 102.467 0.97 c
+102.309 0.735 102.232 0.416 102.232 0.015 c
+h
+106.568 -1.176 m
+107.318 1.823 l
+107.979 1.823 l
+106.803 -2.161 l
+106.319 -2.161 l
+105.128 1.823 l
+105.789 1.823 l
+h
+110.037 -2.234 m
+109.538 -2.234 109.155 -2.087 108.891 -1.793 c
+108.626 -1.5 108.494 -1.066 108.494 -0.484 c
+108.494 -0.014 l
+108.494 0.58 108.619 1.047 108.876 1.382 c
+109.141 1.723 109.501 1.897 109.964 1.897 c
+110.423 1.897 110.765 1.742 110.993 1.44 c
+111.228 1.147 111.35 0.684 111.36 0.059 c
+111.36 -0.367 l
+109.141 -0.367 l
+109.141 -0.455 l
+109.141 -0.889 109.218 -1.201 109.376 -1.396 c
+109.542 -1.583 109.773 -1.675 110.066 -1.675 c
+110.261 -1.675 110.434 -1.643 110.581 -1.573 c
+110.728 -1.496 110.864 -1.378 110.993 -1.22 c
+111.331 -1.631 l
+111.044 -2.036 110.614 -2.234 110.037 -2.234 c
+109.964 1.338 m
+109.688 1.338 109.486 1.242 109.361 1.058 c
+109.233 0.871 109.159 0.58 109.141 0.191 c
+110.714 0.191 l
+110.714 0.279 l
+110.691 0.661 110.625 0.929 110.508 1.087 c
+110.39 1.253 110.207 1.338 109.964 1.338 c
+112.007 0.015 m
+112.007 0.621 112.117 1.087 112.345 1.411 c
+112.58 1.735 112.908 1.897 113.33 1.897 c
+113.712 1.897 114.01 1.738 114.226 1.426 c
+114.226 3.484 l
+114.874 3.484 l
+114.874 -2.161 l
+114.286 -2.161 l
+114.242 -1.735 l
+114.035 -2.069 113.731 -2.234 113.33 -2.234 c
+112.918 -2.234 112.595 -2.08 112.36 -1.764 c
+112.125 -1.44 112.007 -0.985 112.007 -0.397 c
+h
+112.654 -0.367 m
+112.654 -0.808 112.717 -1.139 112.844 -1.352 c
+112.981 -1.558 113.201 -1.66 113.507 -1.66 c
+113.829 -1.66 114.068 -1.5 114.226 -1.176 c
+114.226 0.838 l
+114.057 1.151 113.819 1.309 113.507 1.309 c
+113.201 1.309 112.981 1.205 112.844 1 c
+112.717 0.794 112.654 0.47 112.654 0.029 c
+h
+117.887 -2.161 m
+117.887 1.294 l
+117.357 1.294 l
+117.357 1.823 l
+117.887 1.823 l
+117.887 2.278 l
+117.887 2.679 117.982 2.992 118.18 3.219 c
+118.386 3.443 118.666 3.557 119.019 3.557 c
+119.154 3.557 119.287 3.535 119.416 3.499 c
+119.386 2.955 l
+119.287 2.973 119.188 2.984 119.092 2.984 c
+118.718 2.984 118.533 2.72 118.533 2.19 c
+118.533 1.823 l
+119.21 1.823 l
+119.21 1.294 l
+118.533 1.294 l
+118.533 -2.161 l
+h
+121.62 1.205 m
+121.532 1.224 121.433 1.235 121.326 1.235 c
+120.992 1.235 120.757 1.051 120.621 0.691 c
+120.621 -2.161 l
+119.973 -2.161 l
+119.973 1.823 l
+120.606 1.823 l
+120.621 1.411 l
+120.798 1.735 121.039 1.897 121.355 1.897 c
+121.463 1.897 121.55 1.874 121.62 1.837 c
+h
+122.061 0.015 m
+122.061 0.592 122.197 1.047 122.473 1.382 c
+122.756 1.723 123.127 1.897 123.59 1.897 c
+124.05 1.897 124.417 1.727 124.692 1.397 c
+124.975 1.073 125.122 0.625 125.133 0.059 c
+125.133 -0.367 l
+125.133 -0.937 124.99 -1.392 124.707 -1.735 c
+124.432 -2.069 124.064 -2.234 123.605 -2.234 c
+123.142 -2.234 122.77 -2.072 122.487 -1.749 c
+122.211 -1.419 122.068 -0.977 122.061 -0.426 c
+h
+122.708 -0.367 m
+122.708 -0.771 122.785 -1.087 122.943 -1.323 c
+123.109 -1.558 123.329 -1.675 123.605 -1.675 c
+124.17 -1.675 124.465 -1.264 124.486 -0.441 c
+124.486 0.015 l
+124.486 0.416 124.402 0.735 124.237 0.97 c
+124.079 1.213 123.862 1.338 123.59 1.338 c
+123.325 1.338 123.109 1.213 122.943 0.97 c
+122.785 0.735 122.708 0.416 122.708 0.015 c
+h
+126.589 1.823 m
+126.603 1.455 l
+126.846 1.75 127.165 1.897 127.559 1.897 c
+128 1.897 128.308 1.698 128.484 1.309 c
+128.738 1.698 129.087 1.897 129.529 1.897 c
+130.263 1.897 130.638 1.434 130.66 0.515 c
+130.66 -2.161 l
+130.013 -2.161 l
+130.013 0.456 l
+130.013 0.75 129.958 0.963 129.851 1.103 c
+129.752 1.239 129.579 1.309 129.338 1.309 c
+129.139 1.309 128.977 1.228 128.852 1.073 c
+128.735 0.927 128.665 0.735 128.646 0.5 c
+128.646 -2.161 l
+127.985 -2.161 l
+127.985 0.485 l
+127.985 1.033 127.765 1.309 127.323 1.309 c
+126.989 1.309 126.754 1.147 126.618 0.823 c
+126.618 -2.161 l
+125.972 -2.161 l
+125.972 1.823 l
+h
+134.203 2.778 m
+134.203 1.823 l
+134.805 1.823 l
+134.805 1.294 l
+134.203 1.294 l
+134.203 -1.176 l
+134.203 -1.334 134.225 -1.452 134.276 -1.529 c
+134.335 -1.61 134.423 -1.646 134.541 -1.646 c
+134.629 -1.646 134.717 -1.631 134.805 -1.602 c
+134.805 -2.161 l
+134.658 -2.209 134.504 -2.234 134.35 -2.234 c
+134.092 -2.234 133.897 -2.142 133.762 -1.955 c
+133.622 -1.771 133.556 -1.51 133.556 -1.176 c
+133.556 1.294 l
+132.953 1.294 l
+132.953 1.823 l
+133.556 1.823 l
+133.556 2.778 l
+h
+136.216 1.411 m
+136.47 1.735 136.79 1.897 137.172 1.897 c
+137.878 1.897 138.234 1.426 138.244 0.485 c
+138.244 -2.161 l
+137.598 -2.161 l
+137.598 0.456 l
+137.598 0.769 137.543 0.989 137.436 1.118 c
+137.326 1.242 137.172 1.309 136.966 1.309 c
+136.808 1.309 136.661 1.253 136.525 1.147 c
+136.397 1.037 136.293 0.9 136.216 0.735 c
+136.216 -2.161 l
+135.57 -2.161 l
+135.57 3.484 l
+136.216 3.484 l
+h
+140.626 -2.234 m
+140.126 -2.234 139.744 -2.087 139.48 -1.793 c
+139.215 -1.5 139.083 -1.066 139.083 -0.484 c
+139.083 -0.014 l
+139.083 0.58 139.208 1.047 139.465 1.382 c
+139.729 1.723 140.089 1.897 140.553 1.897 c
+141.012 1.897 141.354 1.742 141.581 1.44 c
+141.816 1.147 141.938 0.684 141.949 0.059 c
+141.949 -0.367 l
+139.729 -0.367 l
+139.729 -0.455 l
+139.729 -0.889 139.807 -1.201 139.964 -1.396 c
+140.13 -1.583 140.361 -1.675 140.656 -1.675 c
+140.85 -1.675 141.023 -1.643 141.17 -1.573 c
+141.317 -1.496 141.453 -1.378 141.581 -1.22 c
+141.92 -1.631 l
+141.633 -2.036 141.203 -2.234 140.626 -2.234 c
+140.553 1.338 m
+140.277 1.338 140.075 1.242 139.95 1.058 c
+139.821 0.871 139.748 0.58 139.729 0.191 c
+141.302 0.191 l
+141.302 0.279 l
+141.28 0.661 141.214 0.929 141.097 1.087 c
+140.979 1.253 140.795 1.338 140.553 1.338 c
+f
+Q
+q 1 0 0 1 216.9476 230.3099 cm
+0 0 m
+-0.338 0.029 l
+-0.625 0.029 -0.816 -0.096 -0.912 -0.339 c
+-0.912 -2.97 l
+-1.955 -2.97 l
+-1.955 1.014 l
+-0.985 1.014 l
+-0.956 0.573 l
+-0.79 0.914 -0.559 1.087 -0.264 1.087 c
+-0.147 1.087 -0.055 1.065 0.014 1.028 c
+h
+2.072 -3.043 m
+1.544 -3.043 1.124 -2.889 0.823 -2.573 c
+0.529 -2.249 0.382 -1.79 0.382 -1.191 c
+0.382 -0.882 l
+0.382 -0.258 0.518 0.228 0.794 0.573 c
+1.066 0.914 1.459 1.087 1.97 1.087 c
+2.469 1.087 2.84 0.926 3.087 0.602 c
+3.341 0.278 3.472 -0.199 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.429 -1.617 1.492 -1.834 1.602 -1.97 c
+1.72 -2.11 1.899 -2.176 2.146 -2.176 c
+2.487 -2.176 2.778 -2.058 3.013 -1.823 c
+3.425 -2.455 l
+3.296 -2.631 3.109 -2.775 2.866 -2.881 c
+2.62 -2.988 2.356 -3.043 2.072 -3.043 c
+1.425 -0.603 m
+2.454 -0.603 l
+2.454 -0.5 l
+2.454 -0.265 2.414 -0.088 2.337 0.029 c
+2.267 0.154 2.138 0.22 1.955 0.22 c
+1.779 0.22 1.646 0.151 1.558 0.014 c
+1.477 -0.115 1.433 -0.32 1.425 -0.603 c
+5.041 1.014 m
+5.072 0.646 l
+5.307 0.941 5.615 1.087 5.997 1.087 c
+6.398 1.087 6.677 0.903 6.834 0.544 c
+7.07 0.903 7.397 1.087 7.819 1.087 c
+8.515 1.087 8.867 0.602 8.878 -0.368 c
+8.878 -2.97 l
+7.85 -2.97 l
+7.85 -0.427 l
+7.85 -0.202 7.813 -0.04 7.746 0.058 c
+7.688 0.154 7.578 0.205 7.423 0.205 c
+7.225 0.205 7.085 0.087 6.996 -0.148 c
+6.996 -2.97 l
+5.953 -2.97 l
+5.953 -0.441 l
+5.953 -0.206 5.924 -0.04 5.865 0.058 c
+5.806 0.154 5.696 0.205 5.542 0.205 c
+5.365 0.205 5.222 0.11 5.115 -0.074 c
+5.115 -2.97 l
+4.072 -2.97 l
+4.072 1.014 l
+h
+9.54 -0.853 m
+9.54 -0.246 9.679 0.228 9.966 0.573 c
+10.248 0.914 10.642 1.087 11.142 1.087 c
+11.649 1.087 12.046 0.914 12.332 0.573 c
+12.615 0.228 12.758 -0.246 12.758 -0.853 c
+12.758 -1.118 l
+12.758 -1.717 12.615 -2.187 12.332 -2.529 c
+12.046 -2.874 11.649 -3.043 11.142 -3.043 c
+10.631 -3.043 10.234 -2.874 9.951 -2.529 c
+9.676 -2.187 9.54 -1.713 9.54 -1.103 c
+h
+10.583 -1.118 m
+10.583 -1.823 10.767 -2.176 11.142 -2.176 c
+11.495 -2.176 11.686 -1.881 11.715 -1.294 c
+11.715 -0.853 l
+11.715 -0.493 11.663 -0.221 11.568 -0.044 c
+11.469 0.132 11.326 0.22 11.142 0.22 c
+10.965 0.22 10.826 0.132 10.73 -0.044 c
+10.631 -0.221 10.583 -0.493 10.583 -0.853 c
+h
+14.611 1.984 m
+14.611 1.014 l
+15.14 1.014 l
+15.14 0.22 l
+14.611 0.22 l
+14.611 -1.75 l
+14.611 -1.908 14.629 -2.014 14.67 -2.073 c
+14.717 -2.132 14.802 -2.161 14.919 -2.161 c
+15.026 -2.161 15.11 -2.154 15.169 -2.132 c
+15.169 -2.94 l
+14.993 -3.007 14.802 -3.043 14.596 -3.043 c
+13.92 -3.043 13.575 -2.658 13.567 -1.881 c
+13.567 0.22 l
+13.111 0.22 l
+13.111 1.014 l
+13.567 1.014 l
+13.567 1.984 l
+h
+17.315 -3.043 m
+16.787 -3.043 16.367 -2.889 16.066 -2.573 c
+15.771 -2.249 15.625 -1.79 15.625 -1.191 c
+15.625 -0.882 l
+15.625 -0.258 15.761 0.228 16.037 0.573 c
+16.309 0.914 16.702 1.087 17.213 1.087 c
+17.712 1.087 18.084 0.926 18.329 0.602 c
+18.583 0.278 18.715 -0.199 18.726 -0.823 c
+18.726 -1.324 l
+16.654 -1.324 l
+16.673 -1.617 16.735 -1.834 16.845 -1.97 c
+16.962 -2.11 17.143 -2.176 17.389 -2.176 c
+17.731 -2.176 18.021 -2.058 18.256 -1.823 c
+18.668 -2.455 l
+18.539 -2.631 18.352 -2.775 18.109 -2.881 c
+17.863 -2.988 17.598 -3.043 17.315 -3.043 c
+16.669 -0.603 m
+17.697 -0.603 l
+17.697 -0.5 l
+17.697 -0.265 17.657 -0.088 17.58 0.029 c
+17.51 0.154 17.381 0.22 17.198 0.22 c
+17.022 0.22 16.889 0.151 16.801 0.014 c
+16.72 -0.115 16.676 -0.32 16.669 -0.603 c
+f
+Q
+q 1 0 0 1 239.7314 230.706 cm
+0 0 m
+-0.088 0.019 -0.188 0.03 -0.294 0.03 c
+-0.628 0.03 -0.864 -0.154 -1 -0.514 c
+-1 -3.366 l
+-1.646 -3.366 l
+-1.646 0.618 l
+-1.014 0.618 l
+-1 0.206 l
+-0.823 0.53 -0.581 0.691 -0.265 0.691 c
+-0.158 0.691 -0.071 0.669 0 0.632 c
+h
+1.999 -3.439 m
+1.499 -3.439 1.117 -3.293 0.852 -2.998 c
+0.588 -2.705 0.455 -2.271 0.455 -1.69 c
+0.455 -1.219 l
+0.455 -0.625 0.58 -0.158 0.837 0.177 c
+1.103 0.518 1.462 0.691 1.925 0.691 c
+2.385 0.691 2.726 0.537 2.954 0.235 c
+3.189 -0.058 3.31 -0.521 3.322 -1.146 c
+3.322 -1.572 l
+1.103 -1.572 l
+1.103 -1.66 l
+1.103 -2.094 1.18 -2.406 1.338 -2.601 c
+1.502 -2.788 1.734 -2.881 2.028 -2.881 c
+2.223 -2.881 2.395 -2.848 2.543 -2.778 c
+2.69 -2.701 2.826 -2.583 2.954 -2.425 c
+3.293 -2.836 l
+3.006 -3.241 2.576 -3.439 1.999 -3.439 c
+1.925 0.133 m
+1.65 0.133 1.448 0.037 1.323 -0.147 c
+1.194 -0.334 1.12 -0.625 1.103 -1.014 c
+2.675 -1.014 l
+2.675 -0.926 l
+2.653 -0.544 2.587 -0.276 2.469 -0.118 c
+2.352 0.048 2.167 0.133 1.925 0.133 c
+6.982 -1.572 m
+6.982 -2.2 6.864 -2.671 6.628 -2.983 c
+6.401 -3.289 6.085 -3.439 5.674 -3.439 c
+5.269 -3.439 4.961 -3.289 4.747 -2.983 c
+4.747 -4.895 l
+4.101 -4.895 l
+4.101 0.618 l
+4.689 0.618 l
+4.733 0.177 l
+4.945 0.518 5.255 0.691 5.659 0.691 c
+6.1 0.691 6.427 0.537 6.644 0.235 c
+6.857 -0.07 6.971 -0.525 6.982 -1.132 c
+h
+6.335 -1.19 m
+6.335 -0.749 6.265 -0.426 6.129 -0.22 c
+5.99 -0.007 5.769 0.103 5.468 0.103 c
+5.151 0.103 4.913 -0.051 4.747 -0.353 c
+4.747 -2.425 l
+4.913 -2.73 5.151 -2.881 5.468 -2.881 c
+5.762 -2.881 5.975 -2.778 6.115 -2.572 c
+6.25 -2.358 6.324 -2.028 6.335 -1.587 c
+h
+7.688 -1.19 m
+7.688 -0.613 7.823 -0.158 8.099 0.177 c
+8.382 0.518 8.753 0.691 9.215 0.691 c
+9.675 0.691 10.042 0.522 10.318 0.192 c
+10.601 -0.132 10.748 -0.58 10.759 -1.146 c
+10.759 -1.572 l
+10.759 -2.142 10.616 -2.597 10.333 -2.94 c
+10.057 -3.274 9.69 -3.439 9.231 -3.439 c
+8.768 -3.439 8.396 -3.278 8.114 -2.954 c
+7.838 -2.624 7.694 -2.183 7.688 -1.631 c
+h
+8.334 -1.572 m
+8.334 -1.976 8.411 -2.293 8.569 -2.528 c
+8.735 -2.763 8.955 -2.881 9.231 -2.881 c
+9.797 -2.881 10.09 -2.469 10.113 -1.646 c
+10.113 -1.19 l
+10.113 -0.789 10.028 -0.47 9.863 -0.235 c
+9.705 0.008 9.488 0.133 9.215 0.133 c
+8.951 0.133 8.735 0.008 8.569 -0.235 c
+8.411 -0.47 8.334 -0.789 8.334 -1.19 c
+h
+13.537 -2.352 m
+13.537 -2.204 13.483 -2.083 13.375 -1.984 c
+13.265 -1.888 13.059 -1.77 12.758 -1.631 c
+12.413 -1.484 12.17 -1.363 12.024 -1.263 c
+11.877 -1.157 11.766 -1.04 11.7 -0.911 c
+11.63 -0.786 11.597 -0.628 11.597 -0.44 c
+11.597 -0.118 11.715 0.151 11.95 0.368 c
+12.185 0.581 12.486 0.691 12.862 0.691 c
+13.244 0.691 13.552 0.578 13.787 0.353 c
+14.023 0.125 14.14 -0.161 14.14 -0.514 c
+13.493 -0.514 l
+13.493 -0.338 13.435 -0.187 13.317 -0.058 c
+13.2 0.067 13.045 0.133 12.862 0.133 c
+12.663 0.133 12.512 0.077 12.406 -0.029 c
+12.295 -0.128 12.244 -0.261 12.244 -0.426 c
+12.244 -0.554 12.28 -0.661 12.361 -0.749 c
+12.438 -0.83 12.629 -0.933 12.935 -1.058 c
+13.412 -1.246 13.743 -1.433 13.919 -1.616 c
+14.096 -1.793 14.184 -2.021 14.184 -2.293 c
+14.184 -2.645 14.059 -2.925 13.817 -3.131 c
+13.581 -3.336 13.265 -3.439 12.876 -3.439 c
+12.454 -3.439 12.116 -3.322 11.862 -3.087 c
+11.605 -2.844 11.48 -2.539 11.48 -2.175 c
+12.126 -2.175 l
+12.134 -2.403 12.203 -2.58 12.332 -2.705 c
+12.457 -2.822 12.641 -2.881 12.876 -2.881 c
+13.089 -2.881 13.251 -2.833 13.361 -2.734 c
+13.479 -2.638 13.537 -2.51 13.537 -2.352 c
+15.727 -3.366 -0.646 3.984 re
+15.771 1.661 m
+15.771 1.551 15.742 1.459 15.684 1.382 c
+15.625 1.312 15.529 1.279 15.405 1.279 c
+15.287 1.279 15.191 1.312 15.125 1.382 c
+15.066 1.459 15.037 1.551 15.037 1.661 c
+15.037 1.779 15.066 1.871 15.125 1.941 c
+15.191 2.018 15.287 2.058 15.405 2.058 c
+15.529 2.058 15.625 2.018 15.684 1.941 c
+15.742 1.86 15.771 1.768 15.771 1.661 c
+17.595 1.573 m
+17.595 0.618 l
+18.197 0.618 l
+18.197 0.088 l
+17.595 0.088 l
+17.595 -2.381 l
+17.595 -2.539 17.616 -2.657 17.668 -2.734 c
+17.726 -2.815 17.815 -2.851 17.932 -2.851 c
+18.021 -2.851 18.109 -2.836 18.197 -2.807 c
+18.197 -3.366 l
+18.05 -3.414 17.896 -3.439 17.741 -3.439 c
+17.485 -3.439 17.29 -3.347 17.153 -3.16 c
+17.014 -2.977 16.947 -2.715 16.947 -2.381 c
+16.947 0.088 l
+16.345 0.088 l
+16.345 0.618 l
+16.947 0.618 l
+16.947 1.573 l
+h
+18.756 -1.19 m
+18.756 -0.613 18.892 -0.158 19.168 0.177 c
+19.45 0.518 19.821 0.691 20.284 0.691 c
+20.743 0.691 21.111 0.522 21.387 0.192 c
+21.67 -0.132 21.817 -0.58 21.828 -1.146 c
+21.828 -1.572 l
+21.828 -2.142 21.684 -2.597 21.402 -2.94 c
+21.126 -3.274 20.758 -3.439 20.299 -3.439 c
+19.836 -3.439 19.465 -3.278 19.182 -2.954 c
+18.906 -2.624 18.763 -2.183 18.756 -1.631 c
+h
+19.403 -1.572 m
+19.403 -1.976 19.48 -2.293 19.638 -2.528 c
+19.803 -2.763 20.024 -2.881 20.299 -2.881 c
+20.865 -2.881 21.159 -2.469 21.181 -1.646 c
+21.181 -1.19 l
+21.181 -0.789 21.096 -0.47 20.931 -0.235 c
+20.773 0.008 20.556 0.133 20.284 0.133 c
+20.02 0.133 19.803 0.008 19.638 -0.235 c
+19.48 -0.47 19.403 -0.789 19.403 -1.19 c
+h
+24.312 0 m
+24.224 0.019 24.124 0.03 24.018 0.03 c
+23.683 0.03 23.448 -0.154 23.312 -0.514 c
+23.312 -3.366 l
+22.665 -3.366 l
+22.665 0.618 l
+23.297 0.618 l
+23.312 0.206 l
+23.488 0.53 23.731 0.691 24.047 0.691 c
+24.154 0.691 24.242 0.669 24.312 0.632 c
+h
+26.12 -2.278 m
+26.84 0.618 l
+27.531 0.618 l
+26.237 -3.924 l
+26.138 -4.266 25.995 -4.527 25.811 -4.704 c
+25.635 -4.88 25.433 -4.968 25.208 -4.968 c
+25.121 -4.968 25.007 -4.945 24.87 -4.909 c
+24.87 -4.365 l
+25.017 -4.38 l
+25.201 -4.38 25.348 -4.336 25.458 -4.247 c
+25.565 -4.159 25.653 -4.002 25.723 -3.777 c
+25.84 -3.336 l
+24.679 0.618 l
+25.385 0.618 l
+h
+27.81 -3.013 m
+27.81 -2.896 27.843 -2.8 27.914 -2.719 c
+27.979 -2.642 28.082 -2.601 28.222 -2.601 c
+28.369 -2.601 28.475 -2.642 28.545 -2.719 c
+28.622 -2.8 28.662 -2.896 28.662 -3.013 c
+28.662 -3.123 28.622 -3.215 28.545 -3.293 c
+28.475 -3.37 28.369 -3.41 28.222 -3.41 c
+28.082 -3.41 27.979 -3.37 27.914 -3.293 c
+27.843 -3.215 27.81 -3.123 27.81 -3.013 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 221.732 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 214.894 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.245 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.116 l
+14.497 3.116 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.456 14.556 -0.515 c
+14.593 -0.566 14.648 -0.611 14.718 -0.647 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.688 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.279 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.085 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.456 c
+13.59 -0.36 13.586 -0.264 13.586 -0.177 c
+h
+21.986 2.219 m
+21.994 2.198 22.001 2.165 22.001 2.117 c
+22.009 2.076 22.016 2.028 22.016 1.97 c
+22.023 1.918 22.03 1.866 22.03 1.808 c
+22.03 1.646 l
+22.045 1.646 l
+22.104 1.764 22.17 1.859 22.251 1.94 c
+22.328 2.017 22.413 2.08 22.501 2.131 c
+22.589 2.19 22.677 2.227 22.765 2.248 c
+22.861 2.267 22.961 2.278 23.059 2.278 c
+23.265 2.278 23.445 2.234 23.603 2.146 c
+23.757 2.057 23.886 1.929 23.985 1.764 c
+24.092 1.606 24.169 1.415 24.22 1.19 c
+24.28 0.974 24.309 0.738 24.309 0.484 c
+24.309 0.22 24.28 -0.026 24.22 -0.25 c
+24.169 -0.467 24.092 -0.658 23.985 -0.823 c
+23.886 -0.981 23.754 -1.103 23.589 -1.191 c
+23.431 -1.279 23.243 -1.323 23.03 -1.323 c
+22.931 -1.323 22.832 -1.312 22.736 -1.294 c
+22.637 -1.272 22.545 -1.243 22.456 -1.191 c
+22.375 -1.143 22.298 -1.081 22.221 -1 c
+22.152 -0.923 22.093 -0.831 22.045 -0.721 c
+22.03 -0.721 l
+22.03 -0.809 l
+22.038 -0.849 22.045 -0.897 22.045 -0.956 c
+22.045 -1.118 l
+22.045 -1.294 l
+22.045 -2.631 l
+21.134 -2.631 l
+21.134 1.455 l
+21.134 1.62 21.126 1.768 21.119 1.896 c
+21.119 2.219 l
+h
+22.03 0.455 m
+22.03 0.228 22.049 0.037 22.089 -0.118 c
+22.137 -0.264 22.192 -0.382 22.251 -0.47 c
+22.317 -0.559 22.391 -0.625 22.471 -0.661 c
+22.549 -0.702 22.626 -0.721 22.707 -0.721 c
+22.803 -0.721 22.89 -0.698 22.971 -0.647 c
+23.059 -0.599 23.125 -0.53 23.177 -0.441 c
+23.235 -0.345 23.28 -0.221 23.31 -0.073 c
+23.346 0.081 23.368 0.268 23.368 0.484 c
+23.368 0.874 23.31 1.168 23.192 1.367 c
+23.081 1.562 22.927 1.66 22.722 1.66 c
+22.641 1.66 22.564 1.639 22.486 1.602 c
+22.406 1.562 22.332 1.5 22.265 1.411 c
+22.196 1.323 22.137 1.198 22.089 1.043 c
+22.049 0.885 22.03 0.691 22.03 0.455 c
+26.061 2.219 m
+26.061 0.264 l
+26.061 0.125 26.069 0 26.091 -0.118 c
+26.109 -0.228 26.142 -0.32 26.194 -0.397 c
+26.242 -0.478 26.3 -0.54 26.371 -0.588 c
+26.437 -0.628 26.521 -0.647 26.62 -0.647 c
+26.709 -0.647 26.789 -0.628 26.87 -0.588 c
+26.959 -0.54 27.032 -0.47 27.09 -0.382 c
+27.15 -0.287 27.194 -0.177 27.223 -0.059 c
+27.26 0.066 27.281 0.206 27.281 0.353 c
+27.281 2.219 l
+28.178 2.219 l
+28.178 -0.485 l
+28.178 -0.721 l
+28.185 -0.802 28.193 -0.879 28.193 -0.956 c
+28.193 -1.147 l
+28.201 -1.199 28.208 -1.235 28.208 -1.264 c
+27.355 -1.264 l
+27.344 -1.235 27.333 -1.199 27.326 -1.147 c
+27.326 -0.956 l
+27.326 -0.89 27.318 -0.819 27.312 -0.75 c
+27.312 -0.574 l
+27.296 -0.574 l
+27.179 -0.838 27.025 -1.029 26.841 -1.147 c
+26.664 -1.264 26.462 -1.323 26.238 -1.323 c
+26.032 -1.323 25.86 -1.286 25.724 -1.22 c
+25.584 -1.154 25.473 -1.058 25.386 -0.941 c
+25.305 -0.823 25.246 -0.688 25.209 -0.53 c
+25.18 -0.364 25.165 -0.187 25.165 0 c
+25.165 2.219 l
+h
+31.343 -0.647 m
+32.474 -0.647 l
+32.474 -1.264 l
+29.167 -1.264 l
+29.167 -0.647 l
+30.431 -0.647 l
+30.431 2.896 l
+29.505 2.896 l
+29.505 3.513 l
+31.343 3.513 l
+h
+35.407 -0.647 m
+36.538 -0.647 l
+36.538 -1.264 l
+33.232 -1.264 l
+33.232 -0.647 l
+34.495 -0.647 l
+34.495 2.896 l
+33.569 2.896 l
+33.569 3.513 l
+35.407 3.513 l
+h
+42.175 -2.631 m
+42.175 3.513 l
+44.101 3.513 l
+44.101 2.896 l
+43.028 2.896 l
+43.028 -2.014 l
+44.101 -2.014 l
+44.101 -2.631 l
+h
+48.5 1.469 m
+48.4 1.477 48.298 1.488 48.191 1.5 c
+48.081 1.517 47.96 1.529 47.823 1.529 c
+47.648 1.529 47.489 1.488 47.353 1.411 c
+47.214 1.341 47.096 1.242 47 1.117 c
+46.912 0.989 46.842 0.841 46.794 0.676 c
+46.754 0.507 46.736 0.33 46.736 0.147 c
+46.736 -1.264 l
+45.839 -1.264 l
+45.839 0.985 l
+45.839 1.109 45.828 1.234 45.81 1.352 c
+45.799 1.477 45.784 1.595 45.766 1.705 c
+45.755 1.822 45.74 1.918 45.722 1.999 c
+45.699 2.087 45.681 2.161 45.663 2.219 c
+46.545 2.219 l
+46.552 2.167 46.563 2.117 46.574 2.057 c
+46.593 1.999 46.607 1.932 46.618 1.866 c
+46.637 1.808 46.651 1.741 46.663 1.675 c
+46.67 1.606 46.68 1.543 46.692 1.484 c
+46.707 1.484 l
+46.743 1.602 46.794 1.708 46.854 1.808 c
+46.919 1.903 47 1.988 47.089 2.057 c
+47.177 2.124 47.28 2.179 47.397 2.219 c
+47.522 2.256 47.669 2.278 47.838 2.278 c
+47.964 2.278 48.081 2.271 48.191 2.263 c
+48.309 2.252 48.411 2.238 48.5 2.219 c
+h
+51.106 -1.323 m
+50.848 -1.323 50.62 -1.286 50.414 -1.22 c
+50.208 -1.143 50.032 -1.029 49.886 -0.882 c
+49.738 -0.728 49.62 -0.537 49.533 -0.309 c
+49.452 -0.085 49.415 0.18 49.415 0.484 c
+49.415 0.816 49.459 1.095 49.547 1.323 c
+49.643 1.558 49.772 1.741 49.93 1.881 c
+50.094 2.017 50.282 2.117 50.488 2.175 c
+50.694 2.242 50.903 2.278 51.12 2.278 c
+51.392 2.278 51.627 2.227 51.825 2.131 c
+52.031 2.043 52.197 1.911 52.325 1.735 c
+52.461 1.565 52.56 1.359 52.619 1.117 c
+52.685 0.881 52.722 0.617 52.722 0.324 c
+52.722 0.309 l
+50.356 0.309 l
+50.356 0.162 50.37 0.022 50.4 -0.103 c
+50.437 -0.231 50.491 -0.345 50.561 -0.441 c
+50.628 -0.53 50.712 -0.599 50.811 -0.647 c
+50.907 -0.698 51.021 -0.721 51.149 -0.721 c
+51.303 -0.721 51.443 -0.688 51.561 -0.617 c
+51.686 -0.551 51.774 -0.449 51.825 -0.309 c
+52.664 -0.382 l
+52.633 -0.482 52.579 -0.588 52.502 -0.706 c
+52.421 -0.816 52.318 -0.919 52.193 -1.014 c
+52.076 -1.103 51.921 -1.176 51.737 -1.235 c
+51.561 -1.294 51.347 -1.323 51.106 -1.323 c
+51.106 1.705 m
+51.017 1.705 50.929 1.691 50.84 1.66 c
+50.752 1.631 50.672 1.58 50.605 1.514 c
+50.536 1.444 50.477 1.356 50.429 1.249 c
+50.389 1.139 50.37 1.014 50.37 0.867 c
+51.84 0.867 l
+51.84 1.003 51.814 1.124 51.767 1.234 c
+51.727 1.341 51.671 1.429 51.605 1.5 c
+51.546 1.565 51.473 1.617 51.384 1.646 c
+51.297 1.683 51.201 1.705 51.106 1.705 c
+54.773 -1.264 m
+54.773 0.852 l
+54.773 1.018 54.765 1.153 54.758 1.264 c
+54.747 1.371 54.728 1.455 54.699 1.514 c
+54.677 1.58 54.648 1.631 54.611 1.66 c
+54.582 1.691 54.541 1.705 54.493 1.705 c
+54.435 1.705 54.379 1.675 54.331 1.617 c
+54.291 1.565 54.258 1.492 54.229 1.396 c
+54.2 1.308 54.173 1.194 54.156 1.058 c
+54.144 0.918 54.14 0.768 54.14 0.602 c
+54.14 -1.264 l
+53.391 -1.264 l
+53.391 1.469 l
+53.391 1.705 l
+53.391 1.926 l
+53.391 2.003 53.383 2.065 53.377 2.117 c
+53.377 2.219 l
+54.052 2.219 l
+54.052 2.131 l
+54.052 1.984 l
+54.06 1.926 54.067 1.866 54.067 1.808 c
+54.067 1.646 l
+54.082 1.646 l
+54.1 1.735 54.129 1.812 54.17 1.881 c
+54.206 1.959 54.251 2.028 54.302 2.087 c
+54.361 2.146 54.427 2.19 54.508 2.219 c
+54.585 2.256 54.673 2.278 54.773 2.278 c
+54.956 2.278 55.096 2.223 55.184 2.117 c
+55.28 2.017 55.349 1.859 55.39 1.646 c
+55.405 1.646 l
+55.442 1.741 55.482 1.83 55.522 1.911 c
+55.57 1.988 55.625 2.05 55.684 2.102 c
+55.743 2.161 55.809 2.205 55.889 2.234 c
+55.966 2.263 56.055 2.278 56.155 2.278 c
+56.29 2.278 56.404 2.252 56.492 2.205 c
+56.581 2.153 56.647 2.08 56.698 1.984 c
+56.757 1.885 56.793 1.756 56.816 1.602 c
+56.845 1.455 56.86 1.271 56.86 1.058 c
+56.86 -1.264 l
+56.14 -1.264 l
+56.14 0.852 l
+56.14 1.018 56.132 1.153 56.125 1.264 c
+56.114 1.371 56.095 1.455 56.066 1.514 c
+56.045 1.58 56.014 1.631 55.978 1.66 c
+55.949 1.691 55.908 1.705 55.86 1.705 c
+55.743 1.705 55.648 1.617 55.581 1.44 c
+55.522 1.271 55.493 1.014 55.493 0.661 c
+55.493 -1.264 l
+h
+60.876 0.484 m
+60.876 0.209 60.839 -0.04 60.774 -0.264 c
+60.704 -0.482 60.601 -0.669 60.465 -0.823 c
+60.325 -0.981 60.149 -1.103 59.935 -1.191 c
+59.719 -1.279 59.465 -1.323 59.172 -1.323 c
+58.896 -1.323 58.649 -1.279 58.436 -1.191 c
+58.231 -1.103 58.058 -0.981 57.922 -0.823 c
+57.782 -0.669 57.68 -0.482 57.613 -0.264 c
+57.543 -0.04 57.51 0.209 57.51 0.484 c
+57.51 0.738 57.539 0.974 57.599 1.19 c
+57.665 1.415 57.768 1.606 57.907 1.764 c
+58.043 1.929 58.22 2.057 58.436 2.146 c
+58.649 2.234 58.906 2.278 59.201 2.278 c
+59.513 2.278 59.774 2.234 59.98 2.146 c
+60.193 2.057 60.365 1.929 60.494 1.764 c
+60.63 1.606 60.729 1.415 60.788 1.19 c
+60.847 0.974 60.876 0.738 60.876 0.484 c
+59.921 0.484 m
+59.921 0.691 59.906 0.867 59.877 1.014 c
+59.855 1.161 59.818 1.282 59.76 1.382 c
+59.7 1.477 59.627 1.547 59.538 1.587 c
+59.451 1.635 59.34 1.66 59.216 1.66 c
+58.95 1.66 58.76 1.562 58.642 1.367 c
+58.524 1.18 58.466 0.885 58.466 0.484 c
+58.466 0.062 58.524 -0.243 58.642 -0.426 c
+58.76 -0.614 58.936 -0.706 59.172 -0.706 c
+59.297 -0.706 59.411 -0.688 59.509 -0.647 c
+59.605 -0.599 59.686 -0.526 59.744 -0.426 c
+59.81 -0.331 59.855 -0.206 59.877 -0.059 c
+59.906 0.088 59.921 0.268 59.921 0.484 c
+62.335 1.602 m
+61.792 1.602 l
+61.792 2.219 l
+62.379 2.219 l
+62.659 3.116 l
+63.232 3.116 l
+63.232 2.219 l
+64.467 2.219 l
+64.467 1.602 l
+63.232 1.602 l
+63.232 -0.103 l
+63.232 -0.324 l
+63.239 -0.393 63.261 -0.456 63.291 -0.515 c
+63.328 -0.566 63.382 -0.611 63.452 -0.647 c
+63.53 -0.676 63.644 -0.691 63.791 -0.691 c
+63.926 -0.691 64.062 -0.688 64.202 -0.676 c
+64.338 -0.658 64.471 -0.632 64.599 -0.603 c
+64.599 -1.205 l
+64.518 -1.216 64.441 -1.231 64.364 -1.249 c
+64.283 -1.261 64.205 -1.268 64.128 -1.279 c
+64.047 -1.286 63.96 -1.294 63.864 -1.294 c
+63.776 -1.301 63.677 -1.309 63.57 -1.309 c
+63.382 -1.309 63.221 -1.294 63.085 -1.264 c
+62.956 -1.228 62.842 -1.183 62.746 -1.132 c
+62.659 -1.085 62.586 -1.025 62.526 -0.956 c
+62.468 -0.879 62.424 -0.802 62.395 -0.721 c
+62.364 -0.632 62.343 -0.544 62.335 -0.456 c
+62.324 -0.36 62.32 -0.264 62.32 -0.177 c
+h
+67.351 -1.323 m
+67.094 -1.323 66.866 -1.286 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.728 65.867 -0.537 65.778 -0.309 c
+65.697 -0.085 65.661 0.18 65.661 0.484 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.741 66.175 1.881 c
+66.341 2.017 66.528 2.117 66.734 2.175 c
+66.94 2.242 67.149 2.278 67.366 2.278 c
+67.638 2.278 67.873 2.227 68.072 2.131 c
+68.277 2.043 68.443 1.911 68.571 1.735 c
+68.707 1.565 68.807 1.359 68.865 1.117 c
+68.932 0.881 68.968 0.617 68.968 0.324 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.162 66.617 0.022 66.646 -0.103 c
+66.682 -0.231 66.738 -0.345 66.808 -0.441 c
+66.873 -0.53 66.958 -0.599 67.058 -0.647 c
+67.153 -0.698 67.267 -0.721 67.396 -0.721 c
+67.55 -0.721 67.689 -0.688 67.807 -0.617 c
+67.932 -0.551 68.02 -0.449 68.072 -0.309 c
+68.909 -0.382 l
+68.88 -0.482 68.824 -0.588 68.747 -0.706 c
+68.666 -0.816 68.564 -0.919 68.439 -1.014 c
+68.321 -1.103 68.167 -1.176 67.983 -1.235 c
+67.807 -1.294 67.594 -1.323 67.351 -1.323 c
+67.351 1.705 m
+67.263 1.705 67.175 1.691 67.087 1.66 c
+66.999 1.631 66.918 1.58 66.852 1.514 c
+66.782 1.444 66.723 1.356 66.675 1.249 c
+66.634 1.139 66.617 1.014 66.617 0.867 c
+68.086 0.867 l
+68.086 1.003 68.061 1.124 68.013 1.234 c
+67.972 1.341 67.918 1.429 67.851 1.5 c
+67.792 1.565 67.719 1.617 67.631 1.646 c
+67.542 1.683 67.447 1.705 67.351 1.705 c
+70.221 -2.631 m
+70.221 -2.014 l
+71.294 -2.014 l
+71.294 2.896 l
+70.221 2.896 l
+70.221 3.513 l
+72.147 3.513 l
+72.147 -2.631 l
+h
+f
+Q
+q 1 0 0 1 46.321 201.1066 cm
+0 0 m
+-1.808 0 l
+-1.808 -2.367 l
+-2.484 -2.367 l
+-2.484 2.983 l
+0.309 2.983 l
+0.309 2.41 l
+-1.808 2.41 l
+-1.808 0.573 l
+0 0.573 l
+h
+2.396 -2.44 m
+1.897 -2.44 1.514 -2.294 1.249 -1.999 c
+0.985 -1.706 0.852 -1.272 0.852 -0.691 c
+0.852 -0.221 l
+0.852 0.374 0.977 0.841 1.234 1.176 c
+1.5 1.517 1.859 1.69 2.323 1.69 c
+2.782 1.69 3.123 1.535 3.351 1.234 c
+3.586 0.941 3.707 0.477 3.719 -0.148 c
+3.719 -0.574 l
+1.5 -0.574 l
+1.5 -0.662 l
+1.5 -1.096 1.577 -1.408 1.735 -1.603 c
+1.899 -1.79 2.132 -1.881 2.425 -1.881 c
+2.62 -1.881 2.793 -1.849 2.94 -1.779 c
+3.087 -1.702 3.223 -1.584 3.351 -1.426 c
+3.69 -1.838 l
+3.403 -2.242 2.973 -2.44 2.396 -2.44 c
+2.323 1.132 m
+2.047 1.132 1.845 1.036 1.72 0.852 c
+1.591 0.665 1.517 0.374 1.5 -0.015 c
+3.072 -0.015 l
+3.072 0.073 l
+3.05 0.455 2.984 0.723 2.866 0.881 c
+2.749 1.047 2.564 1.132 2.323 1.132 c
+5.35 2.572 m
+5.35 1.616 l
+5.953 1.616 l
+5.953 1.087 l
+5.35 1.087 l
+5.35 -1.382 l
+5.35 -1.54 5.373 -1.658 5.424 -1.735 c
+5.483 -1.816 5.571 -1.852 5.689 -1.852 c
+5.776 -1.852 5.865 -1.838 5.953 -1.808 c
+5.953 -2.367 l
+5.806 -2.415 5.652 -2.44 5.498 -2.44 c
+5.24 -2.44 5.045 -2.349 4.91 -2.161 c
+4.77 -1.977 4.704 -1.717 4.704 -1.382 c
+4.704 1.087 l
+4.101 1.087 l
+4.101 1.616 l
+4.704 1.616 l
+4.704 2.572 l
+h
+8.099 -1.881 m
+8.312 -1.881 8.485 -1.819 8.613 -1.691 c
+8.75 -1.555 8.823 -1.364 8.834 -1.118 c
+9.452 -1.118 l
+9.429 -1.5 9.294 -1.819 9.04 -2.073 c
+8.783 -2.319 8.47 -2.44 8.099 -2.44 c
+7.607 -2.44 7.231 -2.29 6.967 -1.985 c
+6.71 -1.673 6.585 -1.206 6.585 -0.588 c
+6.585 -0.148 l
+6.585 0.448 6.71 0.903 6.967 1.219 c
+7.231 1.532 7.607 1.69 8.099 1.69 c
+8.5 1.69 8.819 1.558 9.055 1.294 c
+9.297 1.036 9.429 0.69 9.452 0.249 c
+8.834 0.249 l
+8.812 0.544 8.739 0.764 8.613 0.911 c
+8.496 1.058 8.324 1.132 8.099 1.132 c
+7.805 1.132 7.588 1.032 7.453 0.837 c
+7.312 0.65 7.239 0.341 7.231 -0.088 c
+7.231 -0.603 l
+7.231 -1.073 7.298 -1.408 7.437 -1.603 c
+7.584 -1.79 7.805 -1.881 8.099 -1.881 c
+10.848 1.205 m
+11.102 1.529 11.421 1.69 11.803 1.69 c
+12.509 1.69 12.866 1.219 12.876 0.278 c
+12.876 -2.367 l
+12.23 -2.367 l
+12.23 0.249 l
+12.23 0.562 12.174 0.783 12.068 0.911 c
+11.958 1.036 11.803 1.102 11.597 1.102 c
+11.439 1.102 11.293 1.047 11.156 0.941 c
+11.028 0.83 10.925 0.694 10.848 0.529 c
+10.848 -2.367 l
+10.201 -2.367 l
+10.201 3.278 l
+10.848 3.278 l
+h
+16.933 -1.881 m
+17.146 -1.881 17.319 -1.819 17.448 -1.691 c
+17.583 -1.555 17.657 -1.364 17.668 -1.118 c
+18.285 -1.118 l
+18.264 -1.5 18.127 -1.819 17.874 -2.073 c
+17.616 -2.319 17.304 -2.44 16.933 -2.44 c
+16.44 -2.44 16.066 -2.29 15.802 -1.985 c
+15.544 -1.673 15.419 -1.206 15.419 -0.588 c
+15.419 -0.148 l
+15.419 0.448 15.544 0.903 15.802 1.219 c
+16.066 1.532 16.44 1.69 16.933 1.69 c
+17.334 1.69 17.654 1.558 17.889 1.294 c
+18.131 1.036 18.264 0.69 18.285 0.249 c
+17.668 0.249 l
+17.646 0.544 17.573 0.764 17.448 0.911 c
+17.33 1.058 17.157 1.132 16.933 1.132 c
+16.639 1.132 16.422 1.032 16.286 0.837 c
+16.147 0.65 16.073 0.341 16.066 -0.088 c
+16.066 -0.603 l
+16.066 -1.073 16.132 -1.408 16.272 -1.603 c
+16.419 -1.79 16.639 -1.881 16.933 -1.881 c
+19.682 1.205 m
+19.935 1.529 20.255 1.69 20.637 1.69 c
+21.343 1.69 21.699 1.219 21.71 0.278 c
+21.71 -2.367 l
+21.063 -2.367 l
+21.063 0.249 l
+21.063 0.562 21.009 0.783 20.902 0.911 c
+20.791 1.036 20.637 1.102 20.432 1.102 c
+20.274 1.102 20.126 1.047 19.991 0.941 c
+19.862 0.83 19.759 0.694 19.682 0.529 c
+19.682 -2.367 l
+19.035 -2.367 l
+19.035 3.278 l
+19.682 3.278 l
+h
+24.709 -2.367 m
+24.669 -2.278 24.643 -2.132 24.635 -1.926 c
+24.4 -2.272 24.106 -2.44 23.754 -2.44 c
+23.39 -2.44 23.106 -2.345 22.901 -2.147 c
+22.703 -1.941 22.607 -1.654 22.607 -1.279 c
+22.607 -0.879 22.743 -0.559 23.019 -0.324 c
+23.291 -0.081 23.665 0.043 24.136 0.043 c
+24.621 0.043 l
+24.621 0.47 l
+24.621 0.706 24.566 0.87 24.459 0.97 c
+24.349 1.076 24.187 1.132 23.974 1.132 c
+23.775 1.132 23.614 1.072 23.489 0.955 c
+23.372 0.837 23.312 0.69 23.312 0.514 c
+22.666 0.514 l
+22.666 0.708 22.725 0.9 22.842 1.087 c
+22.967 1.271 23.129 1.418 23.328 1.529 c
+23.534 1.635 23.761 1.69 24.018 1.69 c
+24.419 1.69 24.724 1.587 24.93 1.381 c
+25.142 1.176 25.257 0.881 25.267 0.5 c
+25.267 -1.515 l
+25.267 -1.819 25.304 -2.084 25.385 -2.309 c
+25.385 -2.367 l
+h
+23.842 -1.852 m
+24.007 -1.852 24.158 -1.808 24.297 -1.721 c
+24.444 -1.632 24.551 -1.522 24.621 -1.382 c
+24.621 -0.441 l
+24.253 -0.441 l
+23.937 -0.441 23.694 -0.511 23.518 -0.647 c
+23.342 -0.776 23.254 -0.963 23.254 -1.206 c
+23.254 -1.434 23.298 -1.599 23.386 -1.706 c
+23.474 -1.804 23.625 -1.852 23.842 -1.852 c
+26.884 1.616 m
+26.9 1.176 l
+27.153 1.517 27.476 1.69 27.869 1.69 c
+28.575 1.69 28.932 1.219 28.943 0.278 c
+28.943 -2.367 l
+28.296 -2.367 l
+28.296 0.249 l
+28.296 0.562 28.24 0.783 28.134 0.911 c
+28.024 1.036 27.869 1.102 27.663 1.102 c
+27.505 1.102 27.359 1.047 27.222 0.941 c
+27.094 0.83 26.991 0.694 26.914 0.529 c
+26.914 -2.367 l
+26.267 -2.367 l
+26.267 1.616 l
+h
+29.78 -0.192 m
+29.78 0.426 29.89 0.889 30.119 1.205 c
+30.343 1.529 30.677 1.69 31.118 1.69 c
+31.519 1.69 31.823 1.514 32.029 1.161 c
+32.074 1.616 l
+32.662 1.616 l
+32.662 -2.411 l
+32.662 -2.899 32.533 -3.278 32.279 -3.543 c
+32.022 -3.807 31.669 -3.94 31.22 -3.94 c
+31.022 -3.94 30.802 -3.888 30.559 -3.793 c
+30.313 -3.693 30.133 -3.572 30.015 -3.425 c
+30.28 -2.984 l
+30.545 -3.249 30.842 -3.381 31.176 -3.381 c
+31.713 -3.381 31.989 -3.088 32 -2.5 c
+32 -1.97 l
+31.794 -2.286 31.492 -2.44 31.103 -2.44 c
+30.692 -2.44 30.368 -2.29 30.133 -1.985 c
+29.905 -1.673 29.788 -1.22 29.78 -0.632 c
+h
+30.441 -0.574 m
+30.441 -1.015 30.504 -1.345 30.632 -1.559 c
+30.757 -1.764 30.975 -1.867 31.28 -1.867 c
+31.603 -1.867 31.842 -1.702 32 -1.368 c
+32 0.617 l
+31.831 0.941 31.592 1.102 31.28 1.102 c
+30.985 1.102 30.769 0.999 30.632 0.793 c
+30.504 0.588 30.441 0.264 30.441 -0.177 c
+h
+35.043 -2.44 m
+34.543 -2.44 34.16 -2.294 33.896 -1.999 c
+33.631 -1.706 33.499 -1.272 33.499 -0.691 c
+33.499 -0.221 l
+33.499 0.374 33.624 0.841 33.882 1.176 c
+34.146 1.517 34.506 1.69 34.969 1.69 c
+35.428 1.69 35.77 1.535 35.998 1.234 c
+36.234 0.941 36.354 0.477 36.365 -0.148 c
+36.365 -0.574 l
+34.146 -0.574 l
+34.146 -0.662 l
+34.146 -1.096 34.223 -1.408 34.381 -1.603 c
+34.547 -1.79 34.778 -1.881 35.072 -1.881 c
+35.266 -1.881 35.44 -1.849 35.586 -1.779 c
+35.733 -1.702 35.869 -1.584 35.998 -1.426 c
+36.336 -1.838 l
+36.049 -2.242 35.619 -2.44 35.043 -2.44 c
+34.969 1.132 m
+34.694 1.132 34.491 1.036 34.366 0.852 c
+34.237 0.665 34.164 0.374 34.146 -0.015 c
+35.719 -0.015 l
+35.719 0.073 l
+35.696 0.455 35.631 0.723 35.513 0.881 c
+35.395 1.047 35.212 1.132 34.969 1.132 c
+39.085 -1.353 m
+39.085 -1.206 39.029 -1.085 38.923 -0.985 c
+38.813 -0.89 38.607 -0.772 38.306 -0.632 c
+37.96 -0.485 37.718 -0.364 37.57 -0.265 c
+37.424 -0.158 37.313 -0.04 37.248 0.087 c
+37.177 0.213 37.144 0.371 37.144 0.558 c
+37.144 0.881 37.262 1.15 37.497 1.367 c
+37.732 1.579 38.034 1.69 38.409 1.69 c
+38.79 1.69 39.099 1.576 39.334 1.352 c
+39.569 1.124 39.687 0.837 39.687 0.484 c
+39.041 0.484 l
+39.041 0.661 38.981 0.812 38.864 0.941 c
+38.746 1.065 38.592 1.132 38.409 1.132 c
+38.21 1.132 38.059 1.076 37.953 0.97 c
+37.842 0.87 37.791 0.738 37.791 0.573 c
+37.791 0.444 37.828 0.338 37.909 0.249 c
+37.986 0.168 38.177 0.066 38.482 -0.059 c
+38.96 -0.246 39.291 -0.434 39.467 -0.618 c
+39.643 -0.794 39.731 -1.022 39.731 -1.294 c
+39.731 -1.646 39.606 -1.926 39.364 -2.132 c
+39.129 -2.338 38.813 -2.44 38.424 -2.44 c
+38 -2.44 37.663 -2.323 37.409 -2.087 c
+37.152 -1.845 37.027 -1.54 37.027 -1.176 c
+37.674 -1.176 l
+37.681 -1.405 37.751 -1.58 37.88 -1.706 c
+38.004 -1.823 38.188 -1.881 38.424 -1.881 c
+38.636 -1.881 38.798 -1.834 38.908 -1.735 c
+39.026 -1.64 39.085 -1.511 39.085 -1.353 c
+42.584 -2.367 m
+42.584 1.087 l
+42.054 1.087 l
+42.054 1.616 l
+42.584 1.616 l
+42.584 2.072 l
+42.584 2.472 42.679 2.785 42.877 3.013 c
+43.083 3.237 43.362 3.351 43.715 3.351 c
+43.851 3.351 43.983 3.329 44.111 3.293 c
+44.082 2.748 l
+43.983 2.767 43.884 2.778 43.789 2.778 c
+43.413 2.778 43.23 2.513 43.23 1.984 c
+43.23 1.616 l
+43.906 1.616 l
+43.906 1.087 l
+43.23 1.087 l
+43.23 -2.367 l
+h
+46.316 0.999 m
+46.228 1.018 46.129 1.028 46.023 1.028 c
+45.688 1.028 45.453 0.845 45.317 0.484 c
+45.317 -2.367 l
+44.67 -2.367 l
+44.67 1.616 l
+45.302 1.616 l
+45.317 1.205 l
+45.493 1.529 45.736 1.69 46.052 1.69 c
+46.158 1.69 46.247 1.668 46.316 1.631 c
+h
+46.758 -0.192 m
+46.758 0.386 46.894 0.841 47.169 1.176 c
+47.452 1.517 47.823 1.69 48.286 1.69 c
+48.745 1.69 49.113 1.521 49.389 1.19 c
+49.672 0.866 49.819 0.419 49.83 -0.148 c
+49.83 -0.574 l
+49.83 -1.143 49.686 -1.599 49.404 -1.941 c
+49.128 -2.275 48.76 -2.44 48.301 -2.44 c
+47.838 -2.44 47.467 -2.278 47.184 -1.956 c
+46.908 -1.625 46.765 -1.183 46.758 -0.632 c
+h
+47.404 -0.574 m
+47.404 -0.978 47.482 -1.294 47.639 -1.529 c
+47.805 -1.764 48.026 -1.881 48.301 -1.881 c
+48.867 -1.881 49.161 -1.47 49.183 -0.647 c
+49.183 -0.192 l
+49.183 0.209 49.098 0.529 48.934 0.764 c
+48.775 1.007 48.558 1.132 48.286 1.132 c
+48.022 1.132 47.805 1.007 47.639 0.764 c
+47.482 0.529 47.404 0.209 47.404 -0.192 c
+h
+51.285 1.616 m
+51.299 1.249 l
+51.542 1.543 51.862 1.69 52.255 1.69 c
+52.696 1.69 53.005 1.491 53.181 1.102 c
+53.435 1.491 53.784 1.69 54.224 1.69 c
+54.96 1.69 55.334 1.227 55.357 0.309 c
+55.357 -2.367 l
+54.71 -2.367 l
+54.71 0.249 l
+54.71 0.544 54.655 0.756 54.548 0.897 c
+54.449 1.032 54.276 1.102 54.033 1.102 c
+53.835 1.102 53.674 1.021 53.549 0.866 c
+53.431 0.72 53.362 0.529 53.343 0.294 c
+53.343 -2.367 l
+52.681 -2.367 l
+52.681 0.278 l
+52.681 0.826 52.461 1.102 52.02 1.102 c
+51.685 1.102 51.45 0.941 51.315 0.617 c
+51.315 -2.367 l
+50.667 -2.367 l
+50.667 1.616 l
+h
+58.899 2.572 m
+58.899 1.616 l
+59.502 1.616 l
+59.502 1.087 l
+58.899 1.087 l
+58.899 -1.382 l
+58.899 -1.54 58.921 -1.658 58.972 -1.735 c
+59.031 -1.816 59.12 -1.852 59.237 -1.852 c
+59.325 -1.852 59.413 -1.838 59.502 -1.808 c
+59.502 -2.367 l
+59.355 -2.415 59.201 -2.44 59.046 -2.44 c
+58.789 -2.44 58.594 -2.349 58.458 -2.161 c
+58.318 -1.977 58.252 -1.717 58.252 -1.382 c
+58.252 1.087 l
+57.649 1.087 l
+57.649 1.616 l
+58.252 1.616 l
+58.252 2.572 l
+h
+60.913 1.205 m
+61.166 1.529 61.486 1.69 61.869 1.69 c
+62.574 1.69 62.93 1.219 62.941 0.278 c
+62.941 -2.367 l
+62.295 -2.367 l
+62.295 0.249 l
+62.295 0.562 62.239 0.783 62.133 0.911 c
+62.023 1.036 61.869 1.102 61.663 1.102 c
+61.505 1.102 61.358 1.047 61.221 0.941 c
+61.093 0.83 60.99 0.694 60.913 0.529 c
+60.913 -2.367 l
+60.266 -2.367 l
+60.266 3.278 l
+60.913 3.278 l
+h
+65.322 -2.44 m
+64.823 -2.44 64.441 -2.294 64.176 -1.999 c
+63.911 -1.706 63.779 -1.272 63.779 -0.691 c
+63.779 -0.221 l
+63.779 0.374 63.904 0.841 64.161 1.176 c
+64.426 1.517 64.786 1.69 65.249 1.69 c
+65.709 1.69 66.05 1.535 66.278 1.234 c
+66.513 0.941 66.634 0.477 66.646 -0.148 c
+66.646 -0.574 l
+64.426 -0.574 l
+64.426 -0.662 l
+64.426 -1.096 64.503 -1.408 64.661 -1.603 c
+64.826 -1.79 65.058 -1.881 65.352 -1.881 c
+65.547 -1.881 65.719 -1.849 65.867 -1.779 c
+66.014 -1.702 66.149 -1.584 66.278 -1.426 c
+66.616 -1.838 l
+66.33 -2.242 65.9 -2.44 65.322 -2.44 c
+65.249 1.132 m
+64.973 1.132 64.771 1.036 64.647 0.852 c
+64.518 0.665 64.444 0.374 64.426 -0.015 c
+65.999 -0.015 l
+65.999 0.073 l
+65.977 0.455 65.91 0.723 65.792 0.881 c
+65.675 1.047 65.491 1.132 65.249 1.132 c
+f
+Q
+q 1 0 0 1 117.3177 201.7086 cm
+0 0 m
+-0.339 0.029 l
+-0.625 0.029 -0.817 -0.095 -0.912 -0.338 c
+-0.912 -2.969 l
+-1.956 -2.969 l
+-1.956 1.014 l
+-0.985 1.014 l
+-0.956 0.574 l
+-0.79 0.915 -0.559 1.088 -0.265 1.088 c
+-0.148 1.088 -0.055 1.066 0.014 1.029 c
+h
+2.072 -3.042 m
+1.543 -3.042 1.124 -2.888 0.823 -2.572 c
+0.529 -2.248 0.382 -1.789 0.382 -1.19 c
+0.382 -0.881 l
+0.382 -0.257 0.517 0.228 0.793 0.574 c
+1.065 0.915 1.458 1.088 1.969 1.088 c
+2.469 1.088 2.84 0.927 3.087 0.603 c
+3.34 0.279 3.472 -0.198 3.484 -0.823 c
+3.484 -1.323 l
+1.411 -1.323 l
+1.429 -1.617 1.492 -1.833 1.602 -1.97 c
+1.72 -2.109 1.899 -2.175 2.146 -2.175 c
+2.487 -2.175 2.778 -2.057 3.013 -1.822 c
+3.424 -2.454 l
+3.296 -2.631 3.108 -2.774 2.866 -2.881 c
+2.62 -2.988 2.356 -3.042 2.072 -3.042 c
+1.425 -0.602 m
+2.454 -0.602 l
+2.454 -0.5 l
+2.454 -0.264 2.414 -0.088 2.337 0.029 c
+2.267 0.154 2.138 0.221 1.955 0.221 c
+1.778 0.221 1.646 0.151 1.558 0.015 c
+1.477 -0.114 1.433 -0.32 1.425 -0.602 c
+5.041 1.014 m
+5.071 0.647 l
+5.306 0.941 5.614 1.088 5.997 1.088 c
+6.397 1.088 6.676 0.904 6.834 0.544 c
+7.07 0.904 7.397 1.088 7.819 1.088 c
+8.514 1.088 8.866 0.603 8.878 -0.367 c
+8.878 -2.969 l
+7.849 -2.969 l
+7.849 -0.426 l
+7.849 -0.202 7.812 -0.04 7.746 0.059 c
+7.687 0.154 7.577 0.206 7.422 0.206 c
+7.224 0.206 7.085 0.088 6.996 -0.147 c
+6.996 -2.969 l
+5.953 -2.969 l
+5.953 -0.441 l
+5.953 -0.206 5.924 -0.04 5.865 0.059 c
+5.805 0.154 5.695 0.206 5.541 0.206 c
+5.365 0.206 5.221 0.11 5.115 -0.073 c
+5.115 -2.969 l
+4.072 -2.969 l
+4.072 1.014 l
+h
+9.539 -0.852 m
+9.539 -0.246 9.679 0.228 9.965 0.574 c
+10.248 0.915 10.642 1.088 11.141 1.088 c
+11.648 1.088 12.045 0.915 12.332 0.574 c
+12.615 0.228 12.758 -0.246 12.758 -0.852 c
+12.758 -1.117 l
+12.758 -1.716 12.615 -2.186 12.332 -2.528 c
+12.045 -2.874 11.648 -3.042 11.141 -3.042 c
+10.63 -3.042 10.234 -2.874 9.951 -2.528 c
+9.676 -2.186 9.539 -1.712 9.539 -1.103 c
+h
+10.583 -1.117 m
+10.583 -1.822 10.767 -2.175 11.141 -2.175 c
+11.494 -2.175 11.685 -1.881 11.715 -1.294 c
+11.715 -0.852 l
+11.715 -0.492 11.663 -0.22 11.568 -0.044 c
+11.469 0.133 11.326 0.221 11.141 0.221 c
+10.965 0.221 10.825 0.133 10.73 -0.044 c
+10.63 -0.22 10.583 -0.492 10.583 -0.852 c
+h
+14.611 1.985 m
+14.611 1.014 l
+15.139 1.014 l
+15.139 0.221 l
+14.611 0.221 l
+14.611 -1.749 l
+14.611 -1.907 14.628 -2.013 14.669 -2.072 c
+14.717 -2.131 14.802 -2.161 14.919 -2.161 c
+15.025 -2.161 15.11 -2.153 15.169 -2.131 c
+15.169 -2.94 l
+14.993 -3.006 14.802 -3.042 14.596 -3.042 c
+13.92 -3.042 13.574 -2.657 13.566 -1.881 c
+13.566 0.221 l
+13.111 0.221 l
+13.111 1.014 l
+13.566 1.014 l
+13.566 1.985 l
+h
+17.315 -3.042 m
+16.786 -3.042 16.367 -2.888 16.066 -2.572 c
+15.771 -2.248 15.625 -1.789 15.625 -1.19 c
+15.625 -0.881 l
+15.625 -0.257 15.761 0.228 16.037 0.574 c
+16.309 0.915 16.702 1.088 17.213 1.088 c
+17.712 1.088 18.083 0.927 18.329 0.603 c
+18.583 0.279 18.715 -0.198 18.726 -0.823 c
+18.726 -1.323 l
+16.654 -1.323 l
+16.672 -1.617 16.735 -1.833 16.845 -1.97 c
+16.962 -2.109 17.142 -2.175 17.389 -2.175 c
+17.73 -2.175 18.021 -2.057 18.256 -1.822 c
+18.667 -2.454 l
+18.539 -2.631 18.351 -2.774 18.109 -2.881 c
+17.863 -2.988 17.598 -3.042 17.315 -3.042 c
+16.668 -0.602 m
+17.697 -0.602 l
+17.697 -0.5 l
+17.697 -0.264 17.657 -0.088 17.58 0.029 c
+17.51 0.154 17.381 0.221 17.198 0.221 c
+17.021 0.221 16.889 0.151 16.801 0.015 c
+16.72 -0.114 16.676 -0.32 16.668 -0.602 c
+f
+Q
+q 1 0 0 1 140.4975 198.7397 cm
+0 0 m
+-0.04 0.088 -0.066 0.235 -0.073 0.441 c
+-0.309 0.095 -0.602 -0.073 -0.955 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.713 -2.102 1.088 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.043 2.41 -0.573 2.41 c
+-0.087 2.41 l
+-0.087 2.837 l
+-0.087 3.072 -0.143 3.237 -0.249 3.337 c
+-0.36 3.443 -0.521 3.499 -0.735 3.499 c
+-0.933 3.499 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.267 -1.866 3.454 c
+-1.741 3.638 -1.579 3.785 -1.382 3.896 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.29 4.056 0.015 3.954 0.221 3.748 c
+0.434 3.543 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.559 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.087 0.985 c
+-0.087 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.856 -1.19 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.563 -1.084 0.515 -0.867 0.515 c
+2.176 3.983 m
+2.19 3.543 l
+2.444 3.884 2.768 4.056 3.161 4.056 c
+3.866 4.056 4.223 3.586 4.233 2.645 c
+4.233 0 l
+3.587 0 l
+3.587 2.616 l
+3.587 2.929 3.532 3.15 3.425 3.278 c
+3.315 3.403 3.161 3.469 2.955 3.469 c
+2.797 3.469 2.65 3.414 2.514 3.308 c
+2.385 3.197 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.559 0 l
+1.559 3.983 l
+h
+5.072 2.175 m
+5.072 2.782 5.182 3.248 5.409 3.572 c
+5.644 3.896 5.972 4.056 6.394 4.056 c
+6.776 4.056 7.074 3.898 7.291 3.586 c
+7.291 5.644 l
+7.938 5.644 l
+7.938 0 l
+7.35 0 l
+7.306 0.426 l
+7.1 0.092 6.795 -0.073 6.394 -0.073 c
+5.983 -0.073 5.659 0.081 5.424 0.397 c
+5.189 0.721 5.072 1.176 5.072 1.764 c
+h
+5.718 1.793 m
+5.718 1.352 5.781 1.022 5.909 0.808 c
+6.045 0.603 6.265 0.5 6.571 0.5 c
+6.894 0.5 7.133 0.661 7.291 0.985 c
+7.291 2.998 l
+7.122 3.31 6.883 3.469 6.571 3.469 c
+6.265 3.469 6.045 3.366 5.909 3.16 c
+5.781 2.955 5.718 2.631 5.718 2.19 c
+h
+11.275 3.983 m
+11.289 3.616 l
+11.532 3.91 11.851 4.056 12.245 4.056 c
+12.686 4.056 12.994 3.858 13.17 3.469 c
+13.424 3.858 13.773 4.056 14.215 4.056 c
+14.949 4.056 15.324 3.594 15.346 2.675 c
+15.346 0 l
+14.699 0 l
+14.699 2.616 l
+14.699 2.911 14.644 3.123 14.537 3.263 c
+14.438 3.399 14.265 3.469 14.024 3.469 c
+13.825 3.469 13.663 3.388 13.538 3.233 c
+13.421 3.087 13.351 2.896 13.332 2.66 c
+13.332 0 l
+12.671 0 l
+12.671 2.645 l
+12.671 3.193 12.451 3.469 12.009 3.469 c
+11.675 3.469 11.439 3.308 11.304 2.984 c
+11.304 0 l
+10.657 0 l
+10.657 3.983 l
+h
+17.742 -0.073 m
+17.242 -0.073 16.86 0.073 16.596 0.368 c
+16.331 0.661 16.199 1.095 16.199 1.675 c
+16.199 2.146 l
+16.199 2.741 16.324 3.208 16.581 3.543 c
+16.846 3.884 17.205 4.056 17.668 4.056 c
+18.128 4.056 18.47 3.902 18.697 3.601 c
+18.932 3.308 19.054 2.844 19.065 2.219 c
+19.065 1.793 l
+16.846 1.793 l
+16.846 1.705 l
+16.846 1.271 16.923 0.959 17.081 0.764 c
+17.246 0.577 17.477 0.485 17.771 0.485 c
+17.966 0.485 18.138 0.518 18.286 0.588 c
+18.433 0.665 18.569 0.783 18.697 0.941 c
+19.036 0.529 l
+18.749 0.125 18.319 -0.073 17.742 -0.073 c
+17.668 3.499 m
+17.393 3.499 17.191 3.403 17.066 3.219 c
+16.937 3.032 16.864 2.741 16.846 2.352 c
+18.418 2.352 l
+18.418 2.44 l
+18.396 2.822 18.33 3.09 18.213 3.248 c
+18.095 3.414 17.911 3.499 17.668 3.499 c
+21.49 3.366 m
+21.402 3.385 21.303 3.395 21.196 3.395 c
+20.862 3.395 20.627 3.212 20.49 2.851 c
+20.49 0 l
+19.844 0 l
+19.844 3.983 l
+20.476 3.983 l
+20.49 3.572 l
+20.667 3.896 20.91 4.056 21.226 4.056 c
+21.332 4.056 21.421 4.035 21.49 3.998 c
+h
+21.931 2.175 m
+21.931 2.793 22.042 3.256 22.269 3.572 c
+22.493 3.896 22.828 4.056 23.269 4.056 c
+23.669 4.056 23.975 3.881 24.18 3.528 c
+24.224 3.983 l
+24.812 3.983 l
+24.812 -0.044 l
+24.812 -0.532 24.684 -0.912 24.43 -1.176 c
+24.173 -1.44 23.82 -1.573 23.372 -1.573 c
+23.173 -1.573 22.953 -1.521 22.71 -1.426 c
+22.464 -1.326 22.284 -1.205 22.167 -1.058 c
+22.431 -0.617 l
+22.695 -0.882 22.994 -1.014 23.328 -1.014 c
+23.864 -1.014 24.139 -0.721 24.151 -0.133 c
+24.151 0.397 l
+23.945 0.081 23.644 -0.073 23.254 -0.073 c
+22.842 -0.073 22.519 0.077 22.284 0.382 c
+22.057 0.694 21.939 1.147 21.931 1.735 c
+h
+22.593 1.793 m
+22.593 1.352 22.655 1.022 22.784 0.808 c
+22.909 0.603 23.125 0.5 23.431 0.5 c
+23.754 0.5 23.993 0.665 24.151 0.999 c
+24.151 2.984 l
+23.981 3.308 23.743 3.469 23.431 3.469 c
+23.137 3.469 22.92 3.366 22.784 3.16 c
+22.655 2.955 22.593 2.631 22.593 2.19 c
+h
+27.194 -0.073 m
+26.693 -0.073 26.312 0.073 26.047 0.368 c
+25.783 0.661 25.65 1.095 25.65 1.675 c
+25.65 2.146 l
+25.65 2.741 25.775 3.208 26.032 3.543 c
+26.296 3.884 26.657 4.056 27.12 4.056 c
+27.58 4.056 27.921 3.902 28.149 3.601 c
+28.384 3.308 28.505 2.844 28.517 2.219 c
+28.517 1.793 l
+26.296 1.793 l
+26.296 1.705 l
+26.296 1.271 26.374 0.959 26.532 0.764 c
+26.697 0.577 26.929 0.485 27.223 0.485 c
+27.418 0.485 27.59 0.518 27.738 0.588 c
+27.884 0.665 28.02 0.783 28.149 0.941 c
+28.487 0.529 l
+28.201 0.125 27.771 -0.073 27.194 -0.073 c
+27.12 3.499 m
+26.844 3.499 26.643 3.403 26.518 3.219 c
+26.389 3.032 26.315 2.741 26.296 2.352 c
+27.869 2.352 l
+27.869 2.44 l
+27.848 2.822 27.781 3.09 27.664 3.248 c
+27.546 3.414 27.362 3.499 27.12 3.499 c
+32.397 0.485 m
+32.61 0.485 32.783 0.548 32.912 0.676 c
+33.047 0.812 33.121 1.003 33.132 1.249 c
+33.749 1.249 l
+33.727 0.867 33.591 0.548 33.338 0.294 c
+33.08 0.048 32.768 -0.073 32.397 -0.073 c
+31.904 -0.073 31.53 0.077 31.265 0.382 c
+31.008 0.694 30.883 1.161 30.883 1.779 c
+30.883 2.219 l
+30.883 2.815 31.008 3.27 31.265 3.586 c
+31.53 3.898 31.904 4.056 32.397 4.056 c
+32.798 4.056 33.117 3.925 33.352 3.66 c
+33.595 3.403 33.727 3.057 33.749 2.616 c
+33.132 2.616 l
+33.11 2.911 33.036 3.131 32.912 3.278 c
+32.794 3.425 32.621 3.499 32.397 3.499 c
+32.103 3.499 31.886 3.399 31.75 3.204 c
+31.611 3.017 31.537 2.708 31.53 2.278 c
+31.53 1.764 l
+31.53 1.294 31.596 0.959 31.736 0.764 c
+31.883 0.577 32.103 0.485 32.397 0.485 c
+36.527 0.353 m
+36.311 0.066 35.998 -0.073 35.586 -0.073 c
+35.223 -0.073 34.948 0.048 34.763 0.294 c
+34.587 0.548 34.491 0.912 34.485 1.382 c
+34.485 3.983 l
+35.131 3.983 l
+35.131 1.44 l
+35.131 0.812 35.314 0.5 35.69 0.5 c
+36.091 0.5 36.366 0.676 36.513 1.029 c
+36.513 3.983 l
+37.159 3.983 l
+37.159 0 l
+36.542 0 l
+h
+39.79 3.366 m
+39.702 3.385 39.603 3.395 39.497 3.395 c
+39.162 3.395 38.927 3.212 38.791 2.851 c
+38.791 0 l
+38.144 0 l
+38.144 3.983 l
+38.776 3.983 l
+38.791 3.572 l
+38.967 3.896 39.21 4.056 39.526 4.056 c
+39.632 4.056 39.721 4.035 39.79 3.998 c
+h
+42.084 3.366 m
+41.996 3.385 41.896 3.395 41.79 3.395 c
+41.456 3.395 41.22 3.212 41.084 2.851 c
+41.084 0 l
+40.438 0 l
+40.438 3.983 l
+41.07 3.983 l
+41.084 3.572 l
+41.261 3.896 41.503 4.056 41.819 4.056 c
+41.926 4.056 42.013 4.035 42.084 3.998 c
+h
+44.083 -0.073 m
+43.583 -0.073 43.201 0.073 42.936 0.368 c
+42.672 0.661 42.539 1.095 42.539 1.675 c
+42.539 2.146 l
+42.539 2.741 42.664 3.208 42.921 3.543 c
+43.187 3.884 43.546 4.056 44.009 4.056 c
+44.469 4.056 44.81 3.902 45.038 3.601 c
+45.273 3.308 45.394 2.844 45.406 2.219 c
+45.406 1.793 l
+43.187 1.793 l
+43.187 1.705 l
+43.187 1.271 43.264 0.959 43.422 0.764 c
+43.586 0.577 43.818 0.485 44.112 0.485 c
+44.307 0.485 44.479 0.518 44.627 0.588 c
+44.774 0.665 44.91 0.783 45.038 0.941 c
+45.377 0.529 l
+45.09 0.125 44.66 -0.073 44.083 -0.073 c
+44.009 3.499 m
+43.734 3.499 43.532 3.403 43.407 3.219 c
+43.278 3.032 43.204 2.741 43.187 2.352 c
+44.758 2.352 l
+44.758 2.44 l
+44.737 2.822 44.671 3.09 44.553 3.248 c
+44.436 3.414 44.251 3.499 44.009 3.499 c
+46.802 3.983 m
+46.817 3.543 l
+47.07 3.884 47.394 4.056 47.787 4.056 c
+48.492 4.056 48.849 3.586 48.86 2.645 c
+48.86 0 l
+48.213 0 l
+48.213 2.616 l
+48.213 2.929 48.158 3.15 48.051 3.278 c
+47.941 3.403 47.787 3.469 47.581 3.469 c
+47.423 3.469 47.276 3.414 47.14 3.308 c
+47.012 3.197 46.909 3.061 46.831 2.896 c
+46.831 0 l
+46.185 0 l
+46.185 3.983 l
+h
+50.682 4.939 m
+50.682 3.983 l
+51.285 3.983 l
+51.285 3.454 l
+50.682 3.454 l
+50.682 0.985 l
+50.682 0.827 50.705 0.709 50.756 0.632 c
+50.815 0.551 50.903 0.515 51.021 0.515 c
+51.108 0.515 51.197 0.529 51.285 0.559 c
+51.285 0 l
+51.139 -0.048 50.984 -0.073 50.829 -0.073 c
+50.572 -0.073 50.378 0.018 50.242 0.206 c
+50.102 0.389 50.036 0.65 50.036 0.985 c
+50.036 3.454 l
+49.433 3.454 l
+49.433 3.983 l
+50.036 3.983 l
+50.036 4.939 l
+h
+56.65 1.793 m
+56.65 1.176 56.537 0.709 56.313 0.397 c
+56.095 0.081 55.772 -0.073 55.342 -0.073 c
+54.919 -0.073 54.607 0.106 54.401 0.47 c
+54.372 0 l
+53.77 0 l
+53.77 5.644 l
+54.416 5.644 l
+54.416 3.543 l
+54.63 3.884 54.938 4.056 55.342 4.056 c
+55.772 4.056 56.095 3.898 56.313 3.586 c
+56.537 3.281 56.65 2.815 56.65 2.19 c
+h
+56.003 2.175 m
+56.003 2.645 55.934 2.977 55.798 3.175 c
+55.669 3.37 55.459 3.469 55.166 3.469 c
+54.831 3.469 54.582 3.285 54.416 2.925 c
+54.416 1.043 l
+54.582 0.68 54.835 0.5 55.181 0.5 c
+55.474 0.5 55.684 0.603 55.812 0.808 c
+55.937 1.014 56.003 1.33 56.003 1.764 c
+h
+59.135 3.366 m
+59.046 3.385 58.947 3.395 58.84 3.395 c
+58.506 3.395 58.271 3.212 58.135 2.851 c
+58.135 0 l
+57.489 0 l
+57.489 3.983 l
+58.12 3.983 l
+58.135 3.572 l
+58.312 3.896 58.553 4.056 58.87 4.056 c
+58.977 4.056 59.064 4.035 59.135 3.998 c
+h
+61.678 0 m
+61.637 0.088 61.611 0.235 61.604 0.441 c
+61.369 0.095 61.075 -0.073 60.722 -0.073 c
+60.358 -0.073 60.076 0.022 59.87 0.22 c
+59.671 0.426 59.575 0.713 59.575 1.088 c
+59.575 1.488 59.712 1.808 59.987 2.043 c
+60.259 2.286 60.633 2.41 61.104 2.41 c
+61.589 2.41 l
+61.589 2.837 l
+61.589 3.072 61.534 3.237 61.427 3.337 c
+61.317 3.443 61.156 3.499 60.942 3.499 c
+60.744 3.499 60.583 3.439 60.458 3.322 c
+60.34 3.204 60.281 3.057 60.281 2.881 c
+59.634 2.881 l
+59.634 3.075 59.693 3.267 59.81 3.454 c
+59.935 3.638 60.097 3.785 60.296 3.896 c
+60.502 4.002 60.729 4.056 60.986 4.056 c
+61.387 4.056 61.692 3.954 61.898 3.748 c
+62.111 3.543 62.225 3.248 62.236 2.866 c
+62.236 0.852 l
+62.236 0.548 62.273 0.283 62.353 0.058 c
+62.353 0 l
+h
+60.81 0.515 m
+60.976 0.515 61.126 0.559 61.266 0.646 c
+61.412 0.735 61.52 0.845 61.589 0.985 c
+61.589 1.926 l
+61.221 1.926 l
+60.905 1.926 60.664 1.856 60.487 1.72 c
+60.311 1.591 60.222 1.404 60.222 1.161 c
+60.222 0.933 60.267 0.768 60.355 0.661 c
+60.443 0.563 60.593 0.515 60.81 0.515 c
+63.853 3.983 m
+63.868 3.543 l
+64.121 3.884 64.444 4.056 64.838 4.056 c
+65.543 4.056 65.9 3.586 65.911 2.645 c
+65.911 0 l
+65.264 0 l
+65.264 2.616 l
+65.264 2.929 65.209 3.15 65.102 3.278 c
+64.992 3.403 64.838 3.469 64.632 3.469 c
+64.474 3.469 64.327 3.414 64.191 3.308 c
+64.062 3.197 63.96 3.061 63.883 2.896 c
+63.883 0 l
+63.236 0 l
+63.236 3.983 l
+h
+68.263 0.485 m
+68.475 0.485 68.649 0.548 68.777 0.676 c
+68.913 0.812 68.986 1.003 68.998 1.249 c
+69.615 1.249 l
+69.593 0.867 69.457 0.548 69.204 0.294 c
+68.946 0.048 68.634 -0.073 68.263 -0.073 c
+67.77 -0.073 67.395 0.077 67.131 0.382 c
+66.873 0.694 66.748 1.161 66.748 1.779 c
+66.748 2.219 l
+66.748 2.815 66.873 3.27 67.131 3.586 c
+67.395 3.898 67.77 4.056 68.263 4.056 c
+68.664 4.056 68.983 3.925 69.218 3.66 c
+69.46 3.403 69.593 3.057 69.615 2.616 c
+68.998 2.616 l
+68.976 2.911 68.902 3.131 68.777 3.278 c
+68.66 3.425 68.487 3.499 68.263 3.499 c
+67.968 3.499 67.752 3.399 67.616 3.204 c
+67.476 3.017 67.403 2.708 67.395 2.278 c
+67.395 1.764 l
+67.395 1.294 67.461 0.959 67.602 0.764 c
+67.748 0.577 67.968 0.485 68.263 0.485 c
+71.012 3.572 m
+71.265 3.896 71.585 4.056 71.967 4.056 c
+72.672 4.056 73.029 3.586 73.04 2.645 c
+73.04 0 l
+72.393 0 l
+72.393 2.616 l
+72.393 2.929 72.338 3.15 72.231 3.278 c
+72.121 3.403 71.967 3.469 71.761 3.469 c
+71.603 3.469 71.456 3.414 71.32 3.308 c
+71.191 3.197 71.089 3.061 71.012 2.896 c
+71.012 0 l
+70.364 0 l
+70.364 5.644 l
+71.012 5.644 l
+h
+78.684 1.147 m
+79.286 3.983 l
+79.934 3.983 l
+78.949 0 l
+78.434 0 l
+77.655 2.851 l
+76.905 0 l
+76.377 0 l
+75.421 3.983 l
+76.053 3.983 l
+76.67 1.22 l
+77.405 3.983 l
+77.92 3.983 l
+h
+81.316 0 -0.647 3.983 re
+81.36 5.027 m
+81.36 4.916 81.33 4.825 81.271 4.748 c
+81.212 4.678 81.117 4.644 80.992 4.644 c
+80.874 4.644 80.778 4.678 80.713 4.748 c
+80.654 4.825 80.624 4.916 80.624 5.027 c
+80.624 5.145 80.654 5.236 80.713 5.307 c
+80.778 5.384 80.874 5.424 80.992 5.424 c
+81.117 5.424 81.212 5.384 81.271 5.307 c
+81.33 5.226 81.36 5.134 81.36 5.027 c
+83.182 4.939 m
+83.182 3.983 l
+83.785 3.983 l
+83.785 3.454 l
+83.182 3.454 l
+83.182 0.985 l
+83.182 0.827 83.205 0.709 83.255 0.632 c
+83.315 0.551 83.403 0.515 83.52 0.515 c
+83.608 0.515 83.697 0.529 83.785 0.559 c
+83.785 0 l
+83.638 -0.048 83.483 -0.073 83.329 -0.073 c
+83.072 -0.073 82.877 0.018 82.741 0.206 c
+82.602 0.389 82.536 0.65 82.536 0.985 c
+82.536 3.454 l
+81.933 3.454 l
+81.933 3.983 l
+82.536 3.983 l
+82.536 4.939 l
+h
+85.196 3.572 m
+85.449 3.896 85.769 4.056 86.151 4.056 c
+86.857 4.056 87.213 3.586 87.224 2.645 c
+87.224 0 l
+86.577 0 l
+86.577 2.616 l
+86.577 2.929 86.523 3.15 86.416 3.278 c
+86.305 3.403 86.151 3.469 85.946 3.469 c
+85.788 3.469 85.64 3.414 85.505 3.308 c
+85.376 3.197 85.273 3.061 85.196 2.896 c
+85.196 0 l
+84.549 0 l
+84.549 5.644 l
+85.196 5.644 l
+h
+90.605 0 -0.647 3.983 re
+90.65 5.027 m
+90.65 4.916 90.62 4.825 90.561 4.748 c
+90.502 4.678 90.407 4.644 90.282 4.644 c
+90.164 4.644 90.068 4.678 90.002 4.748 c
+89.944 4.825 89.914 4.916 89.914 5.027 c
+89.914 5.145 89.944 5.236 90.002 5.307 c
+90.068 5.384 90.164 5.424 90.282 5.424 c
+90.407 5.424 90.502 5.384 90.561 5.307 c
+90.62 5.226 90.65 5.134 90.65 5.027 c
+92.472 4.939 m
+92.472 3.983 l
+93.075 3.983 l
+93.075 3.454 l
+92.472 3.454 l
+92.472 0.985 l
+92.472 0.827 92.494 0.709 92.545 0.632 c
+92.604 0.551 92.692 0.515 92.811 0.515 c
+92.898 0.515 92.986 0.529 93.075 0.559 c
+93.075 0 l
+92.927 -0.048 92.773 -0.073 92.619 -0.073 c
+92.362 -0.073 92.167 0.018 92.031 0.206 c
+91.891 0.389 91.826 0.65 91.826 0.985 c
+91.826 3.454 l
+91.223 3.454 l
+91.223 3.983 l
+91.826 3.983 l
+91.826 4.939 l
+h
+95.779 1.014 m
+95.779 1.161 95.724 1.282 95.618 1.382 c
+95.508 1.477 95.302 1.595 95.001 1.735 c
+94.654 1.881 94.413 2.003 94.265 2.102 c
+94.118 2.209 94.008 2.326 93.942 2.454 c
+93.872 2.58 93.839 2.738 93.839 2.925 c
+93.839 3.248 93.956 3.516 94.192 3.734 c
+94.427 3.946 94.729 4.056 95.103 4.056 c
+95.485 4.056 95.794 3.943 96.029 3.719 c
+96.264 3.491 96.382 3.204 96.382 2.851 c
+95.735 2.851 l
+95.735 3.028 95.676 3.179 95.558 3.308 c
+95.441 3.432 95.287 3.499 95.103 3.499 c
+94.905 3.499 94.754 3.443 94.648 3.337 c
+94.537 3.237 94.486 3.105 94.486 2.94 c
+94.486 2.811 94.523 2.705 94.604 2.616 c
+94.681 2.535 94.872 2.433 95.176 2.308 c
+95.654 2.12 95.985 1.933 96.161 1.749 c
+96.338 1.573 96.426 1.345 96.426 1.073 c
+96.426 0.721 96.301 0.441 96.059 0.235 c
+95.824 0.029 95.508 -0.073 95.118 -0.073 c
+94.695 -0.073 94.357 0.044 94.103 0.279 c
+93.846 0.522 93.721 0.827 93.721 1.191 c
+94.368 1.191 l
+94.376 0.962 94.446 0.786 94.573 0.661 c
+94.699 0.544 94.883 0.485 95.118 0.485 c
+95.331 0.485 95.493 0.532 95.603 0.632 c
+95.72 0.727 95.779 0.856 95.779 1.014 c
+101.012 0.353 m
+100.796 0.066 100.483 -0.073 100.071 -0.073 c
+99.708 -0.073 99.432 0.048 99.248 0.294 c
+99.072 0.548 98.976 0.912 98.969 1.382 c
+98.969 3.983 l
+99.616 3.983 l
+99.616 1.44 l
+99.616 0.812 99.799 0.5 100.175 0.5 c
+100.574 0.5 100.85 0.676 100.998 1.029 c
+100.998 3.983 l
+101.644 3.983 l
+101.644 0 l
+101.027 0 l
+h
+105.51 1.793 m
+105.51 1.165 105.392 0.694 105.157 0.382 c
+104.929 0.077 104.613 -0.073 104.202 -0.073 c
+103.797 -0.073 103.489 0.077 103.275 0.382 c
+103.275 -1.529 l
+102.629 -1.529 l
+102.629 3.983 l
+103.217 3.983 l
+103.261 3.543 l
+103.474 3.884 103.783 4.056 104.187 4.056 c
+104.628 4.056 104.955 3.902 105.172 3.601 c
+105.385 3.296 105.499 2.84 105.51 2.234 c
+h
+104.863 2.175 m
+104.863 2.616 104.794 2.94 104.657 3.146 c
+104.518 3.358 104.297 3.469 103.996 3.469 c
+103.68 3.469 103.441 3.314 103.275 3.013 c
+103.275 0.941 l
+103.441 0.636 103.68 0.485 103.996 0.485 c
+104.29 0.485 104.503 0.588 104.643 0.794 c
+104.779 1.007 104.852 1.338 104.863 1.779 c
+h
+108.289 1.014 m
+108.289 1.161 108.233 1.282 108.127 1.382 c
+108.017 1.477 107.811 1.595 107.509 1.735 c
+107.163 1.881 106.922 2.003 106.774 2.102 c
+106.627 2.209 106.517 2.326 106.451 2.454 c
+106.381 2.58 106.348 2.738 106.348 2.925 c
+106.348 3.248 106.465 3.516 106.701 3.734 c
+106.936 3.946 107.237 4.056 107.612 4.056 c
+107.994 4.056 108.303 3.943 108.538 3.719 c
+108.773 3.491 108.891 3.204 108.891 2.851 c
+108.244 2.851 l
+108.244 3.028 108.185 3.179 108.067 3.308 c
+107.95 3.432 107.796 3.499 107.612 3.499 c
+107.414 3.499 107.263 3.443 107.157 3.337 c
+107.046 3.237 106.995 3.105 106.995 2.94 c
+106.995 2.811 107.032 2.705 107.113 2.616 c
+107.19 2.535 107.381 2.433 107.685 2.308 c
+108.163 2.12 108.494 1.933 108.67 1.749 c
+108.846 1.573 108.935 1.345 108.935 1.073 c
+108.935 0.721 108.81 0.441 108.568 0.235 c
+108.333 0.029 108.017 -0.073 107.627 -0.073 c
+107.204 -0.073 106.866 0.044 106.612 0.279 c
+106.355 0.522 106.23 0.827 106.23 1.191 c
+106.877 1.191 l
+106.884 0.962 106.955 0.786 107.082 0.661 c
+107.208 0.544 107.392 0.485 107.627 0.485 c
+107.84 0.485 108.002 0.532 108.112 0.632 c
+108.229 0.727 108.289 0.856 108.289 1.014 c
+110.625 4.939 m
+110.625 3.983 l
+111.228 3.983 l
+111.228 3.454 l
+110.625 3.454 l
+110.625 0.985 l
+110.625 0.827 110.647 0.709 110.699 0.632 c
+110.758 0.551 110.845 0.515 110.963 0.515 c
+111.051 0.515 111.14 0.529 111.228 0.559 c
+111.228 0 l
+111.081 -0.048 110.926 -0.073 110.772 -0.073 c
+110.515 -0.073 110.32 0.018 110.184 0.206 c
+110.045 0.389 109.979 0.65 109.979 0.985 c
+109.979 3.454 l
+109.376 3.454 l
+109.376 3.983 l
+109.979 3.983 l
+109.979 4.939 l
+h
+113.638 3.366 m
+113.55 3.385 113.451 3.395 113.345 3.395 c
+113.01 3.395 112.775 3.212 112.639 2.851 c
+112.639 0 l
+111.992 0 l
+111.992 3.983 l
+112.624 3.983 l
+112.639 3.572 l
+112.815 3.896 113.058 4.056 113.374 4.056 c
+113.48 4.056 113.569 4.035 113.638 3.998 c
+h
+115.638 -0.073 m
+115.138 -0.073 114.756 0.073 114.491 0.368 c
+114.226 0.661 114.094 1.095 114.094 1.675 c
+114.094 2.146 l
+114.094 2.741 114.219 3.208 114.477 3.543 c
+114.741 3.884 115.101 4.056 115.564 4.056 c
+116.023 4.056 116.366 3.902 116.593 3.601 c
+116.829 3.308 116.95 2.844 116.96 2.219 c
+116.96 1.793 l
+114.741 1.793 l
+114.741 1.705 l
+114.741 1.271 114.818 0.959 114.976 0.764 c
+115.142 0.577 115.373 0.485 115.667 0.485 c
+115.861 0.485 116.035 0.518 116.181 0.588 c
+116.329 0.665 116.464 0.783 116.593 0.941 c
+116.931 0.529 l
+116.644 0.125 116.214 -0.073 115.638 -0.073 c
+115.564 3.499 m
+115.289 3.499 115.086 3.403 114.961 3.219 c
+114.833 3.032 114.76 2.741 114.741 2.352 c
+116.314 2.352 l
+116.314 2.44 l
+116.291 2.822 116.226 3.09 116.108 3.248 c
+115.99 3.414 115.807 3.499 115.564 3.499 c
+119.782 0 m
+119.742 0.088 119.717 0.235 119.709 0.441 c
+119.474 0.095 119.18 -0.073 118.828 -0.073 c
+118.464 -0.073 118.18 0.022 117.975 0.22 c
+117.777 0.426 117.681 0.713 117.681 1.088 c
+117.681 1.488 117.817 1.808 118.092 2.043 c
+118.365 2.286 118.739 2.41 119.21 2.41 c
+119.695 2.41 l
+119.695 2.837 l
+119.695 3.072 119.639 3.237 119.533 3.337 c
+119.423 3.443 119.261 3.499 119.048 3.499 c
+118.849 3.499 118.687 3.439 118.562 3.322 c
+118.446 3.204 118.386 3.057 118.386 2.881 c
+117.74 2.881 l
+117.74 3.075 117.798 3.267 117.916 3.454 c
+118.041 3.638 118.203 3.785 118.401 3.896 c
+118.607 4.002 118.835 4.056 119.092 4.056 c
+119.493 4.056 119.798 3.954 120.004 3.748 c
+120.216 3.543 120.33 3.248 120.341 2.866 c
+120.341 0.852 l
+120.341 0.548 120.378 0.283 120.459 0.058 c
+120.459 0 l
+h
+118.916 0.515 m
+119.081 0.515 119.231 0.559 119.371 0.646 c
+119.518 0.735 119.624 0.845 119.695 0.985 c
+119.695 1.926 l
+119.327 1.926 l
+119.011 1.926 118.768 1.856 118.592 1.72 c
+118.416 1.591 118.327 1.404 118.327 1.161 c
+118.327 0.933 118.371 0.768 118.46 0.661 c
+118.548 0.563 118.699 0.515 118.916 0.515 c
+121.958 3.983 m
+121.973 3.616 l
+122.215 3.91 122.535 4.056 122.928 4.056 c
+123.369 4.056 123.678 3.858 123.855 3.469 c
+124.108 3.858 124.457 4.056 124.898 4.056 c
+125.633 4.056 126.008 3.594 126.03 2.675 c
+126.03 0 l
+125.383 0 l
+125.383 2.616 l
+125.383 2.911 125.328 3.123 125.222 3.263 c
+125.122 3.399 124.95 3.469 124.707 3.469 c
+124.509 3.469 124.347 3.388 124.222 3.233 c
+124.104 3.087 124.035 2.896 124.016 2.66 c
+124.016 0 l
+123.354 0 l
+123.354 2.645 l
+123.354 3.193 123.134 3.469 122.693 3.469 c
+122.359 3.469 122.124 3.308 121.988 2.984 c
+121.988 0 l
+121.341 0 l
+121.341 3.983 l
+h
+127.044 0.353 m
+127.044 0.47 127.077 0.565 127.147 0.646 c
+127.213 0.723 127.316 0.764 127.456 0.764 c
+127.603 0.764 127.709 0.723 127.779 0.646 c
+127.856 0.565 127.896 0.47 127.896 0.353 c
+127.896 0.243 127.856 0.151 127.779 0.073 c
+127.709 -0.004 127.603 -0.044 127.456 -0.044 c
+127.316 -0.044 127.213 -0.004 127.147 0.073 c
+127.077 0.151 127.044 0.243 127.044 0.353 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 193.132 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 186.2965 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.263 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.515 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.131 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.484 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.029 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.323 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.675 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.675 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.26 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.3 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.263 c
+14.221 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.024 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.359 13.586 -0.264 13.586 -0.176 c
+h
+21.986 2.22 m
+21.994 2.198 22.001 2.165 22.001 2.117 c
+22.009 2.076 22.016 2.029 22.016 1.97 c
+22.023 1.918 22.03 1.867 22.03 1.808 c
+22.03 1.646 l
+22.045 1.646 l
+22.104 1.764 22.17 1.86 22.251 1.941 c
+22.328 2.018 22.413 2.08 22.501 2.132 c
+22.589 2.19 22.677 2.228 22.765 2.249 c
+22.861 2.268 22.961 2.278 23.059 2.278 c
+23.265 2.278 23.445 2.234 23.603 2.147 c
+23.757 2.058 23.886 1.929 23.985 1.764 c
+24.092 1.606 24.169 1.415 24.22 1.191 c
+24.28 0.975 24.309 0.739 24.309 0.485 c
+24.309 0.221 24.28 -0.025 24.22 -0.249 c
+24.169 -0.467 24.092 -0.658 23.985 -0.823 c
+23.886 -0.981 23.754 -1.103 23.589 -1.19 c
+23.431 -1.278 23.243 -1.323 23.03 -1.323 c
+22.931 -1.323 22.832 -1.311 22.736 -1.294 c
+22.637 -1.271 22.545 -1.242 22.456 -1.19 c
+22.375 -1.142 22.298 -1.08 22.221 -0.999 c
+22.152 -0.922 22.093 -0.83 22.045 -0.72 c
+22.03 -0.72 l
+22.03 -0.808 l
+22.038 -0.849 22.045 -0.897 22.045 -0.955 c
+22.045 -1.117 l
+22.045 -1.294 l
+22.045 -2.631 l
+21.134 -2.631 l
+21.134 1.455 l
+21.134 1.621 21.126 1.768 21.119 1.897 c
+21.119 2.22 l
+h
+22.03 0.456 m
+22.03 0.229 22.049 0.037 22.089 -0.118 c
+22.137 -0.264 22.192 -0.382 22.251 -0.47 c
+22.317 -0.558 22.391 -0.625 22.471 -0.661 c
+22.549 -0.702 22.626 -0.72 22.707 -0.72 c
+22.803 -0.72 22.89 -0.698 22.971 -0.646 c
+23.059 -0.598 23.125 -0.529 23.177 -0.44 c
+23.235 -0.345 23.28 -0.22 23.31 -0.073 c
+23.346 0.081 23.368 0.269 23.368 0.485 c
+23.368 0.875 23.31 1.169 23.192 1.367 c
+23.081 1.563 22.927 1.661 22.722 1.661 c
+22.641 1.661 22.564 1.64 22.486 1.602 c
+22.406 1.563 22.332 1.5 22.265 1.411 c
+22.196 1.324 22.137 1.199 22.089 1.044 c
+22.049 0.886 22.03 0.691 22.03 0.456 c
+26.061 2.22 m
+26.061 0.265 l
+26.061 0.125 26.069 0 26.091 -0.118 c
+26.109 -0.228 26.142 -0.319 26.194 -0.397 c
+26.242 -0.477 26.3 -0.54 26.371 -0.588 c
+26.437 -0.628 26.521 -0.646 26.62 -0.646 c
+26.709 -0.646 26.789 -0.628 26.87 -0.588 c
+26.959 -0.54 27.032 -0.47 27.09 -0.382 c
+27.15 -0.286 27.194 -0.176 27.223 -0.058 c
+27.26 0.067 27.281 0.206 27.281 0.353 c
+27.281 2.22 l
+28.178 2.22 l
+28.178 -0.484 l
+28.178 -0.72 l
+28.185 -0.801 28.193 -0.878 28.193 -0.955 c
+28.193 -1.146 l
+28.201 -1.198 28.208 -1.234 28.208 -1.263 c
+27.355 -1.263 l
+27.344 -1.234 27.333 -1.198 27.326 -1.146 c
+27.326 -0.955 l
+27.326 -0.889 27.318 -0.819 27.312 -0.75 c
+27.312 -0.573 l
+27.296 -0.573 l
+27.179 -0.837 27.025 -1.028 26.841 -1.146 c
+26.664 -1.263 26.462 -1.323 26.238 -1.323 c
+26.032 -1.323 25.86 -1.286 25.724 -1.22 c
+25.584 -1.153 25.473 -1.058 25.386 -0.941 c
+25.305 -0.823 25.246 -0.687 25.209 -0.529 c
+25.18 -0.363 25.165 -0.187 25.165 0 c
+25.165 2.22 l
+h
+32.342 -0.249 m
+32.342 -0.419 32.301 -0.569 32.224 -0.706 c
+32.154 -0.833 32.052 -0.947 31.916 -1.043 c
+31.787 -1.132 31.625 -1.201 31.43 -1.249 c
+31.243 -1.297 31.027 -1.323 30.784 -1.323 c
+30.556 -1.323 30.358 -1.308 30.181 -1.278 c
+30.005 -1.249 29.847 -1.201 29.71 -1.132 c
+29.571 -1.055 29.461 -0.955 29.373 -0.837 c
+29.284 -0.72 29.215 -0.573 29.167 -0.397 c
+29.976 -0.279 l
+29.994 -0.378 30.023 -0.455 30.063 -0.515 c
+30.111 -0.573 30.17 -0.617 30.24 -0.646 c
+30.306 -0.675 30.387 -0.702 30.475 -0.72 c
+30.564 -0.731 30.666 -0.735 30.784 -0.735 c
+30.88 -0.735 30.975 -0.731 31.063 -0.72 c
+31.152 -0.702 31.229 -0.675 31.298 -0.646 c
+31.364 -0.617 31.416 -0.58 31.445 -0.529 c
+31.482 -0.481 31.504 -0.419 31.504 -0.338 c
+31.504 -0.242 31.474 -0.168 31.416 -0.118 c
+31.364 -0.07 31.298 -0.029 31.21 0 c
+31.122 0.037 31.011 0.067 30.886 0.088 c
+30.769 0.118 30.637 0.148 30.489 0.177 c
+30.35 0.214 30.211 0.254 30.063 0.294 c
+29.924 0.342 29.799 0.405 29.681 0.485 c
+29.571 0.563 29.483 0.661 29.417 0.779 c
+29.347 0.897 29.313 1.048 29.313 1.235 c
+29.313 1.389 29.344 1.532 29.402 1.661 c
+29.469 1.798 29.564 1.912 29.681 1.999 c
+29.806 2.087 29.964 2.153 30.152 2.205 c
+30.335 2.253 30.549 2.278 30.784 2.278 c
+30.967 2.278 31.144 2.257 31.313 2.22 c
+31.478 2.19 31.625 2.135 31.754 2.058 c
+31.879 1.989 31.989 1.889 32.077 1.764 c
+32.166 1.646 32.224 1.503 32.253 1.338 c
+31.46 1.264 l
+31.438 1.341 31.408 1.405 31.372 1.455 c
+31.331 1.515 31.283 1.559 31.225 1.588 c
+31.173 1.625 31.111 1.65 31.034 1.661 c
+30.953 1.669 30.872 1.676 30.784 1.676 c
+30.567 1.676 30.406 1.646 30.298 1.588 c
+30.188 1.536 30.137 1.448 30.137 1.324 c
+30.137 1.243 30.155 1.18 30.196 1.132 c
+30.244 1.081 30.306 1.044 30.387 1.014 c
+30.475 0.985 30.57 0.956 30.681 0.927 c
+30.788 0.904 30.909 0.882 31.048 0.853 c
+31.202 0.823 31.36 0.783 31.519 0.736 c
+31.673 0.684 31.813 0.622 31.931 0.544 c
+32.048 0.464 32.143 0.36 32.224 0.235 c
+32.301 0.107 32.342 -0.055 32.342 -0.249 c
+34.202 1.515 m
+34.319 1.786 34.47 1.985 34.657 2.103 c
+34.84 2.22 35.061 2.278 35.318 2.278 c
+35.524 2.278 35.694 2.242 35.833 2.176 c
+35.98 2.106 36.091 2.014 36.17 1.897 c
+36.259 1.779 36.318 1.636 36.347 1.47 c
+36.384 1.301 36.406 1.125 36.406 0.941 c
+36.406 -1.263 l
+35.495 -1.263 l
+35.495 0.736 l
+35.495 0.871 35.484 0.992 35.465 1.103 c
+35.455 1.21 35.428 1.297 35.392 1.367 c
+35.351 1.445 35.293 1.503 35.216 1.544 c
+35.146 1.58 35.054 1.602 34.936 1.602 c
+34.826 1.602 34.73 1.577 34.643 1.529 c
+34.554 1.478 34.473 1.411 34.408 1.324 c
+34.348 1.235 34.297 1.125 34.26 1 c
+34.231 0.882 34.216 0.75 34.216 0.603 c
+34.216 -1.263 l
+33.305 -1.263 l
+33.305 3.514 l
+34.216 3.514 l
+34.216 2.205 l
+34.216 2.135 34.209 2.066 34.202 1.999 c
+34.202 1.794 l
+34.202 1.735 34.194 1.68 34.186 1.632 c
+34.186 1.515 l
+h
+42.175 -2.631 m
+42.175 3.514 l
+44.101 3.514 l
+44.101 2.896 l
+43.028 2.896 l
+43.028 -2.013 l
+44.101 -2.013 l
+44.101 -2.631 l
+h
+46.075 0.838 1.866 -0.794 re
+46.075 0.044 m
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+54.214 1.602 m
+53.67 1.602 l
+53.67 2.22 l
+54.258 2.22 l
+54.537 3.117 l
+55.11 3.117 l
+55.11 2.22 l
+56.346 2.22 l
+56.346 1.602 l
+55.11 1.602 l
+55.11 -0.103 l
+55.11 -0.323 l
+55.118 -0.393 55.14 -0.455 55.17 -0.515 c
+55.206 -0.565 55.261 -0.61 55.331 -0.646 c
+55.409 -0.675 55.522 -0.691 55.669 -0.691 c
+55.806 -0.691 55.941 -0.687 56.081 -0.675 c
+56.217 -0.658 56.349 -0.632 56.477 -0.602 c
+56.477 -1.205 l
+56.396 -1.216 56.319 -1.23 56.242 -1.249 c
+56.161 -1.26 56.084 -1.267 56.007 -1.278 c
+55.926 -1.286 55.839 -1.294 55.743 -1.294 c
+55.654 -1.3 55.555 -1.308 55.449 -1.308 c
+55.261 -1.308 55.1 -1.294 54.964 -1.263 c
+54.835 -1.227 54.721 -1.183 54.626 -1.132 c
+54.537 -1.084 54.464 -1.024 54.405 -0.955 c
+54.347 -0.878 54.302 -0.801 54.273 -0.72 c
+54.243 -0.632 54.221 -0.544 54.214 -0.455 c
+54.203 -0.359 54.2 -0.264 54.2 -0.176 c
+h
+58.628 -1.323 m
+58.458 -1.323 58.308 -1.3 58.172 -1.263 c
+58.043 -1.216 57.929 -1.146 57.834 -1.058 c
+57.745 -0.97 57.676 -0.864 57.628 -0.735 c
+57.576 -0.598 57.554 -0.448 57.554 -0.279 c
+57.554 -0.073 57.587 0.096 57.657 0.235 c
+57.724 0.383 57.819 0.493 57.936 0.574 c
+58.061 0.661 58.204 0.724 58.363 0.765 c
+58.528 0.801 58.705 0.827 58.892 0.838 c
+59.612 0.853 l
+59.612 1.029 l
+59.612 1.147 59.601 1.249 59.583 1.338 c
+59.561 1.426 59.528 1.492 59.48 1.544 c
+59.44 1.602 59.392 1.64 59.333 1.661 c
+59.274 1.68 59.208 1.691 59.141 1.691 c
+59.072 1.691 59.01 1.68 58.95 1.661 c
+58.9 1.65 58.852 1.625 58.804 1.588 c
+58.763 1.559 58.73 1.507 58.701 1.441 c
+58.679 1.382 58.665 1.301 58.657 1.206 c
+57.716 1.249 l
+57.745 1.397 57.79 1.532 57.848 1.661 c
+57.915 1.786 58.01 1.897 58.127 1.985 c
+58.245 2.08 58.385 2.153 58.553 2.205 c
+58.73 2.253 58.936 2.278 59.172 2.278 c
+59.612 2.278 59.943 2.168 60.171 1.955 c
+60.406 1.75 60.523 1.441 60.523 1.029 c
+60.523 -0.235 l
+60.523 -0.455 l
+60.531 -0.515 60.546 -0.569 60.568 -0.617 c
+60.586 -0.658 60.616 -0.691 60.656 -0.72 c
+60.693 -0.742 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.735 c
+61.009 -1.22 l
+60.95 -1.23 60.895 -1.242 60.847 -1.249 c
+60.807 -1.26 60.766 -1.267 60.729 -1.278 c
+60.689 -1.286 60.645 -1.294 60.597 -1.294 c
+60.546 -1.3 60.487 -1.308 60.421 -1.308 c
+60.193 -1.308 60.028 -1.257 59.921 -1.146 c
+59.81 -1.028 59.748 -0.864 59.729 -0.646 c
+59.715 -0.646 l
+59.646 -0.756 59.575 -0.852 59.509 -0.941 c
+59.44 -1.022 59.363 -1.087 59.274 -1.146 c
+59.186 -1.205 59.087 -1.249 58.981 -1.278 c
+58.881 -1.308 58.763 -1.323 58.628 -1.323 c
+59.612 0.353 m
+59.186 0.339 l
+59.087 0.339 58.995 0.331 58.906 0.324 c
+58.826 0.312 58.76 0.287 58.701 0.25 c
+58.642 0.21 58.591 0.151 58.553 0.073 c
+58.513 0.004 58.495 -0.087 58.495 -0.205 c
+58.495 -0.374 58.528 -0.496 58.598 -0.573 c
+58.665 -0.654 58.763 -0.691 58.892 -0.691 c
+58.998 -0.691 59.098 -0.669 59.186 -0.617 c
+59.282 -0.569 59.363 -0.507 59.421 -0.426 c
+59.488 -0.349 59.538 -0.261 59.569 -0.162 c
+59.598 -0.055 59.612 0.059 59.612 0.177 c
+h
+63.261 -2.66 m
+63.045 -2.66 62.854 -2.634 62.688 -2.587 c
+62.519 -2.547 62.379 -2.484 62.262 -2.396 c
+62.144 -2.315 62.045 -2.219 61.967 -2.102 c
+61.898 -1.984 61.85 -1.855 61.821 -1.72 c
+62.717 -1.616 l
+62.754 -1.753 62.824 -1.859 62.923 -1.94 c
+63.019 -2.028 63.143 -2.072 63.291 -2.072 c
+63.379 -2.072 63.459 -2.057 63.54 -2.028 c
+63.617 -1.999 63.687 -1.944 63.746 -1.866 c
+63.806 -1.797 63.849 -1.705 63.879 -1.587 c
+63.916 -1.469 63.937 -1.323 63.937 -1.146 c
+63.937 -0.955 l
+63.937 -0.889 63.941 -0.83 63.952 -0.779 c
+63.952 -0.588 l
+63.937 -0.588 l
+63.839 -0.816 63.695 -0.977 63.511 -1.072 c
+63.324 -1.172 63.118 -1.22 62.894 -1.22 c
+62.688 -1.22 62.505 -1.183 62.35 -1.103 c
+62.203 -1.014 62.075 -0.897 61.967 -0.75 c
+61.869 -0.595 61.795 -0.411 61.747 -0.205 c
+61.696 0.008 61.674 0.243 61.674 0.5 c
+61.674 0.772 61.696 1.018 61.747 1.235 c
+61.806 1.448 61.887 1.632 61.998 1.779 c
+62.104 1.933 62.236 2.051 62.395 2.132 c
+62.549 2.22 62.736 2.264 62.952 2.264 c
+63.048 2.264 63.147 2.253 63.247 2.234 c
+63.342 2.213 63.43 2.18 63.511 2.132 c
+63.6 2.08 63.677 2.018 63.746 1.941 c
+63.824 1.86 63.886 1.768 63.937 1.661 c
+63.952 1.661 l
+63.952 1.808 l
+63.96 1.867 63.967 1.918 63.967 1.97 c
+63.974 2.029 63.982 2.076 63.982 2.117 c
+63.989 2.165 64 2.198 64.011 2.22 c
+64.863 2.22 l
+64.853 2.139 64.841 2.029 64.834 1.881 c
+64.834 1.411 l
+64.834 -1.161 l
+64.834 -1.415 64.797 -1.635 64.731 -1.822 c
+64.662 -2.006 64.558 -2.161 64.423 -2.278 c
+64.283 -2.403 64.118 -2.499 63.922 -2.557 c
+63.725 -2.624 63.504 -2.66 63.261 -2.66 c
+63.952 0.53 m
+63.952 0.742 63.926 0.919 63.879 1.058 c
+63.839 1.206 63.783 1.324 63.717 1.411 c
+63.658 1.5 63.588 1.559 63.511 1.588 c
+63.43 1.625 63.353 1.646 63.276 1.646 c
+63.177 1.646 63.085 1.621 62.997 1.573 c
+62.916 1.532 62.85 1.463 62.791 1.367 c
+62.74 1.279 62.696 1.162 62.659 1.014 c
+62.63 0.875 62.615 0.706 62.615 0.5 c
+62.615 0.125 62.673 -0.154 62.791 -0.338 c
+62.908 -0.515 63.07 -0.602 63.276 -0.602 c
+63.342 -0.602 63.415 -0.588 63.496 -0.558 c
+63.585 -0.521 63.658 -0.463 63.717 -0.382 c
+63.783 -0.294 63.839 -0.176 63.879 -0.029 c
+63.926 0.118 63.952 0.302 63.952 0.53 c
+68.895 -0.249 m
+68.895 -0.419 68.855 -0.569 68.777 -0.706 c
+68.707 -0.833 68.604 -0.947 68.469 -1.043 c
+68.34 -1.132 68.178 -1.201 67.983 -1.249 c
+67.796 -1.297 67.579 -1.323 67.336 -1.323 c
+67.109 -1.323 66.91 -1.308 66.734 -1.278 c
+66.557 -1.249 66.399 -1.201 66.264 -1.132 c
+66.124 -1.055 66.014 -0.955 65.925 -0.837 c
+65.838 -0.72 65.767 -0.573 65.72 -0.397 c
+66.528 -0.279 l
+66.547 -0.378 66.576 -0.455 66.617 -0.515 c
+66.665 -0.573 66.723 -0.617 66.792 -0.646 c
+66.859 -0.675 66.94 -0.702 67.028 -0.72 c
+67.116 -0.731 67.219 -0.735 67.336 -0.735 c
+67.432 -0.735 67.528 -0.731 67.616 -0.72 c
+67.704 -0.702 67.781 -0.675 67.851 -0.646 c
+67.918 -0.617 67.968 -0.58 67.999 -0.529 c
+68.035 -0.481 68.057 -0.419 68.057 -0.338 c
+68.057 -0.242 68.028 -0.168 67.968 -0.118 c
+67.918 -0.07 67.851 -0.029 67.763 0 c
+67.675 0.037 67.565 0.067 67.44 0.088 c
+67.322 0.118 67.189 0.148 67.043 0.177 c
+66.903 0.214 66.763 0.254 66.617 0.294 c
+66.476 0.342 66.352 0.405 66.235 0.485 c
+66.124 0.563 66.036 0.661 65.969 0.779 c
+65.9 0.897 65.867 1.048 65.867 1.235 c
+65.867 1.389 65.896 1.532 65.955 1.661 c
+66.021 1.798 66.117 1.912 66.235 1.999 c
+66.359 2.087 66.517 2.153 66.705 2.205 c
+66.888 2.253 67.101 2.278 67.336 2.278 c
+67.521 2.278 67.697 2.257 67.866 2.22 c
+68.031 2.19 68.178 2.135 68.307 2.058 c
+68.431 1.989 68.542 1.889 68.63 1.764 c
+68.718 1.646 68.777 1.503 68.807 1.338 c
+68.013 1.264 l
+67.991 1.341 67.961 1.405 67.924 1.455 c
+67.884 1.515 67.837 1.559 67.777 1.588 c
+67.726 1.625 67.664 1.65 67.586 1.661 c
+67.506 1.669 67.425 1.676 67.336 1.676 c
+67.12 1.676 66.958 1.646 66.852 1.588 c
+66.742 1.536 66.69 1.448 66.69 1.324 c
+66.69 1.243 66.708 1.18 66.748 1.132 c
+66.796 1.081 66.859 1.044 66.94 1.014 c
+67.028 0.985 67.124 0.956 67.234 0.927 c
+67.34 0.904 67.461 0.882 67.602 0.853 c
+67.756 0.823 67.914 0.783 68.072 0.736 c
+68.226 0.684 68.365 0.622 68.483 0.544 c
+68.601 0.464 68.697 0.36 68.777 0.235 c
+68.855 0.107 68.895 -0.055 68.895 -0.249 c
+70.221 -2.631 m
+70.221 -2.013 l
+71.294 -2.013 l
+71.294 2.896 l
+70.221 2.896 l
+70.221 3.514 l
+72.147 3.514 l
+72.147 -2.631 l
+h
+78.729 -2.631 m
+78.729 3.514 l
+80.654 3.514 l
+80.654 2.896 l
+79.581 2.896 l
+79.581 -2.013 l
+80.654 -2.013 l
+80.654 -2.631 l
+h
+85.052 1.47 m
+84.953 1.478 84.851 1.488 84.744 1.5 c
+84.634 1.518 84.512 1.529 84.377 1.529 c
+84.2 1.529 84.042 1.488 83.906 1.411 c
+83.766 1.341 83.649 1.243 83.554 1.118 c
+83.465 0.989 83.396 0.842 83.348 0.676 c
+83.307 0.507 83.288 0.331 83.288 0.148 c
+83.288 -1.263 l
+82.392 -1.263 l
+82.392 0.985 l
+82.392 1.11 82.381 1.235 82.363 1.353 c
+82.351 1.478 82.337 1.595 82.318 1.706 c
+82.307 1.823 82.293 1.918 82.274 1.999 c
+82.253 2.087 82.234 2.161 82.216 2.22 c
+83.097 2.22 l
+83.105 2.168 83.116 2.117 83.127 2.058 c
+83.145 1.999 83.16 1.933 83.171 1.867 c
+83.19 1.808 83.205 1.742 83.215 1.676 c
+83.223 1.606 83.234 1.544 83.245 1.484 c
+83.259 1.484 l
+83.296 1.602 83.348 1.709 83.406 1.808 c
+83.473 1.904 83.554 1.989 83.641 2.058 c
+83.73 2.124 83.833 2.18 83.951 2.22 c
+84.075 2.257 84.223 2.278 84.391 2.278 c
+84.516 2.278 84.634 2.271 84.744 2.264 c
+84.861 2.253 84.965 2.238 85.052 2.22 c
+h
+87.658 -1.323 m
+87.401 -1.323 87.173 -1.286 86.968 -1.22 c
+86.762 -1.142 86.585 -1.028 86.438 -0.881 c
+86.291 -0.727 86.174 -0.536 86.085 -0.309 c
+86.004 -0.084 85.968 0.181 85.968 0.485 c
+85.968 0.817 86.012 1.095 86.1 1.324 c
+86.195 1.559 86.324 1.742 86.482 1.881 c
+86.648 2.018 86.835 2.117 87.041 2.176 c
+87.246 2.242 87.456 2.278 87.673 2.278 c
+87.945 2.278 88.18 2.228 88.379 2.132 c
+88.584 2.043 88.749 1.912 88.878 1.735 c
+89.014 1.565 89.113 1.36 89.172 1.118 c
+89.239 0.882 89.275 0.618 89.275 0.324 c
+89.275 0.309 l
+86.908 0.309 l
+86.908 0.162 86.923 0.023 86.953 -0.103 c
+86.989 -0.231 87.045 -0.345 87.114 -0.44 c
+87.18 -0.529 87.265 -0.598 87.364 -0.646 c
+87.46 -0.698 87.573 -0.72 87.702 -0.72 c
+87.857 -0.72 87.996 -0.687 88.113 -0.617 c
+88.239 -0.551 88.327 -0.448 88.379 -0.309 c
+89.216 -0.382 l
+89.187 -0.481 89.131 -0.588 89.054 -0.706 c
+88.973 -0.816 88.871 -0.918 88.746 -1.014 c
+88.628 -1.103 88.474 -1.176 88.29 -1.234 c
+88.113 -1.294 87.901 -1.323 87.658 -1.323 c
+87.658 1.706 m
+87.57 1.706 87.481 1.691 87.394 1.661 c
+87.305 1.632 87.224 1.58 87.159 1.515 c
+87.089 1.445 87.03 1.357 86.982 1.249 c
+86.941 1.139 86.923 1.014 86.923 0.867 c
+88.393 0.867 l
+88.393 1.004 88.367 1.125 88.319 1.235 c
+88.279 1.341 88.224 1.43 88.158 1.5 c
+88.099 1.565 88.026 1.617 87.937 1.646 c
+87.849 1.683 87.754 1.706 87.658 1.706 c
+91.322 -1.263 m
+91.322 0.853 l
+91.322 1.018 91.315 1.154 91.307 1.264 c
+91.296 1.371 91.278 1.455 91.248 1.515 c
+91.226 1.58 91.197 1.632 91.16 1.661 c
+91.13 1.691 91.09 1.706 91.043 1.706 c
+90.984 1.706 90.929 1.676 90.881 1.617 c
+90.841 1.565 90.808 1.492 90.778 1.397 c
+90.748 1.309 90.723 1.195 90.704 1.058 c
+90.694 0.919 90.69 0.769 90.69 0.603 c
+90.69 -1.263 l
+89.94 -1.263 l
+89.94 1.47 l
+89.94 1.706 l
+89.94 1.926 l
+89.94 2.003 89.933 2.066 89.925 2.117 c
+89.925 2.22 l
+90.602 2.22 l
+90.602 2.132 l
+90.602 1.985 l
+90.609 1.926 90.617 1.867 90.617 1.808 c
+90.617 1.646 l
+90.631 1.646 l
+90.65 1.735 90.679 1.812 90.719 1.881 c
+90.756 1.959 90.8 2.029 90.852 2.087 c
+90.91 2.147 90.976 2.19 91.057 2.22 c
+91.134 2.257 91.223 2.278 91.322 2.278 c
+91.506 2.278 91.645 2.224 91.733 2.117 c
+91.829 2.018 91.899 1.86 91.939 1.646 c
+91.954 1.646 l
+91.99 1.742 92.031 1.831 92.071 1.912 c
+92.119 1.989 92.175 2.051 92.233 2.103 c
+92.292 2.161 92.358 2.205 92.439 2.234 c
+92.516 2.264 92.604 2.278 92.703 2.278 c
+92.84 2.278 92.954 2.253 93.042 2.205 c
+93.129 2.153 93.196 2.08 93.247 1.985 c
+93.306 1.885 93.343 1.757 93.365 1.602 c
+93.395 1.455 93.409 1.272 93.409 1.058 c
+93.409 -1.263 l
+92.689 -1.263 l
+92.689 0.853 l
+92.689 1.018 92.682 1.154 92.674 1.264 c
+92.663 1.371 92.645 1.455 92.615 1.515 c
+92.593 1.58 92.564 1.632 92.527 1.661 c
+92.498 1.691 92.458 1.706 92.41 1.706 c
+92.292 1.706 92.196 1.617 92.13 1.441 c
+92.071 1.272 92.042 1.014 92.042 0.661 c
+92.042 -1.263 l
+h
+97.43 0.485 m
+97.43 0.21 97.393 -0.04 97.326 -0.264 c
+97.256 -0.481 97.154 -0.669 97.018 -0.823 c
+96.878 -0.981 96.701 -1.103 96.489 -1.19 c
+96.271 -1.278 96.018 -1.323 95.724 -1.323 c
+95.448 -1.323 95.202 -1.278 94.989 -1.19 c
+94.783 -1.103 94.611 -0.981 94.475 -0.823 c
+94.335 -0.669 94.232 -0.481 94.166 -0.264 c
+94.096 -0.04 94.064 0.21 94.064 0.485 c
+94.064 0.739 94.093 0.975 94.151 1.191 c
+94.218 1.415 94.32 1.606 94.46 1.764 c
+94.596 1.929 94.772 2.058 94.989 2.147 c
+95.202 2.234 95.46 2.278 95.753 2.278 c
+96.065 2.278 96.327 2.234 96.533 2.147 c
+96.746 2.058 96.919 1.929 97.047 1.764 c
+97.183 1.606 97.282 1.415 97.341 1.191 c
+97.399 0.975 97.43 0.739 97.43 0.485 c
+96.474 0.485 m
+96.474 0.691 96.459 0.867 96.43 1.014 c
+96.408 1.162 96.371 1.283 96.312 1.382 c
+96.254 1.478 96.18 1.548 96.092 1.588 c
+96.003 1.636 95.893 1.661 95.768 1.661 c
+95.504 1.661 95.313 1.563 95.195 1.367 c
+95.078 1.18 95.018 0.886 95.018 0.485 c
+95.018 0.063 95.078 -0.242 95.195 -0.426 c
+95.313 -0.613 95.489 -0.706 95.724 -0.706 c
+95.849 -0.706 95.963 -0.687 96.063 -0.646 c
+96.158 -0.598 96.239 -0.525 96.298 -0.426 c
+96.364 -0.33 96.408 -0.205 96.43 -0.058 c
+96.459 0.088 96.474 0.269 96.474 0.485 c
+98.888 1.602 m
+98.344 1.602 l
+98.344 2.22 l
+98.932 2.22 l
+99.211 3.117 l
+99.785 3.117 l
+99.785 2.22 l
+101.019 2.22 l
+101.019 1.602 l
+99.785 1.602 l
+99.785 -0.103 l
+99.785 -0.323 l
+99.792 -0.393 99.814 -0.455 99.843 -0.515 c
+99.88 -0.565 99.936 -0.61 100.005 -0.646 c
+100.082 -0.675 100.196 -0.691 100.343 -0.691 c
+100.479 -0.691 100.615 -0.687 100.755 -0.675 c
+100.891 -0.658 101.023 -0.632 101.152 -0.602 c
+101.152 -1.205 l
+101.071 -1.216 100.994 -1.23 100.917 -1.249 c
+100.836 -1.26 100.759 -1.267 100.682 -1.278 c
+100.601 -1.286 100.512 -1.294 100.416 -1.294 c
+100.329 -1.3 100.229 -1.308 100.123 -1.308 c
+99.936 -1.308 99.774 -1.294 99.637 -1.263 c
+99.51 -1.227 99.396 -1.183 99.3 -1.132 c
+99.211 -1.084 99.138 -1.024 99.08 -0.955 c
+99.02 -0.878 98.976 -0.801 98.947 -0.72 c
+98.918 -0.632 98.895 -0.544 98.888 -0.455 c
+98.877 -0.359 98.874 -0.264 98.874 -0.176 c
+h
+103.904 -1.323 m
+103.647 -1.323 103.419 -1.286 103.213 -1.22 c
+103.007 -1.142 102.831 -1.028 102.685 -0.881 c
+102.537 -0.727 102.419 -0.536 102.332 -0.309 c
+102.251 -0.084 102.214 0.181 102.214 0.485 c
+102.214 0.817 102.257 1.095 102.346 1.324 c
+102.442 1.559 102.571 1.742 102.728 1.881 c
+102.893 2.018 103.082 2.117 103.287 2.176 c
+103.493 2.242 103.702 2.278 103.919 2.278 c
+104.191 2.278 104.426 2.228 104.624 2.132 c
+104.83 2.043 104.996 1.912 105.124 1.735 c
+105.26 1.565 105.359 1.36 105.418 1.118 c
+105.484 0.882 105.521 0.618 105.521 0.324 c
+105.521 0.309 l
+103.155 0.309 l
+103.155 0.162 103.169 0.023 103.198 -0.103 c
+103.236 -0.231 103.29 -0.345 103.36 -0.44 c
+103.427 -0.529 103.511 -0.598 103.61 -0.646 c
+103.706 -0.698 103.82 -0.72 103.948 -0.72 c
+104.102 -0.72 104.242 -0.687 104.36 -0.617 c
+104.485 -0.551 104.573 -0.448 104.624 -0.309 c
+105.463 -0.382 l
+105.433 -0.481 105.378 -0.588 105.301 -0.706 c
+105.22 -0.816 105.117 -0.918 104.992 -1.014 c
+104.875 -1.103 104.72 -1.176 104.536 -1.234 c
+104.36 -1.294 104.146 -1.323 103.904 -1.323 c
+103.904 1.706 m
+103.816 1.706 103.728 1.691 103.639 1.661 c
+103.552 1.632 103.471 1.58 103.404 1.515 c
+103.335 1.445 103.276 1.357 103.228 1.249 c
+103.188 1.139 103.169 1.014 103.169 0.867 c
+104.639 0.867 l
+104.639 1.004 104.613 1.125 104.566 1.235 c
+104.526 1.341 104.47 1.43 104.404 1.5 c
+104.345 1.565 104.272 1.617 104.183 1.646 c
+104.096 1.683 104 1.706 103.904 1.706 c
+106.774 -2.631 m
+106.774 -2.013 l
+107.847 -2.013 l
+107.847 2.896 l
+106.774 2.896 l
+106.774 3.514 l
+108.7 3.514 l
+108.7 -2.631 l
+h
+f
+Q
+q 1 0 0 1 95.2978 172.2447 cm
+0 0 m
+0 -2.103 l
+-0.675 -2.103 l
+-0.675 3.248 l
+1.029 3.248 l
+1.529 3.248 1.918 3.094 2.205 2.793 c
+2.488 2.499 2.631 2.105 2.631 1.617 c
+2.631 1.095 2.492 0.698 2.22 0.426 c
+1.955 0.151 1.577 0.008 1.088 0 c
+h
+0 0.573 m
+1.029 0.573 l
+1.33 0.573 1.563 0.661 1.72 0.837 c
+1.875 1.014 1.955 1.268 1.955 1.602 c
+1.955 1.926 1.871 2.183 1.706 2.381 c
+1.548 2.576 1.327 2.675 1.044 2.675 c
+0 2.675 l
+h
+5.439 -1.75 m
+5.222 -2.036 4.91 -2.176 4.499 -2.176 c
+4.135 -2.176 3.859 -2.055 3.675 -1.808 c
+3.499 -1.554 3.404 -1.191 3.396 -0.721 c
+3.396 1.881 l
+4.042 1.881 l
+4.042 -0.661 l
+4.042 -1.29 4.227 -1.602 4.601 -1.602 c
+5.002 -1.602 5.278 -1.426 5.424 -1.073 c
+5.424 1.881 l
+6.072 1.881 l
+6.072 -2.103 l
+5.453 -2.103 l
+h
+8.996 -1.088 m
+8.996 -0.941 8.941 -0.819 8.834 -0.721 c
+8.724 -0.625 8.518 -0.507 8.217 -0.368 c
+7.872 -0.221 7.629 -0.1 7.483 0 c
+7.335 0.106 7.225 0.224 7.159 0.353 c
+7.089 0.478 7.056 0.636 7.056 0.823 c
+7.056 1.147 7.173 1.415 7.408 1.631 c
+7.644 1.845 7.945 1.955 8.32 1.955 c
+8.702 1.955 9.01 1.841 9.246 1.617 c
+9.481 1.389 9.599 1.103 9.599 0.75 c
+8.952 0.75 l
+8.952 0.926 8.894 1.076 8.775 1.205 c
+8.659 1.33 8.503 1.396 8.32 1.396 c
+8.121 1.396 7.971 1.341 7.865 1.234 c
+7.755 1.135 7.703 1.003 7.703 0.837 c
+7.703 0.709 7.739 0.602 7.82 0.515 c
+7.898 0.434 8.088 0.33 8.393 0.206 c
+8.871 0.018 9.202 -0.169 9.378 -0.353 c
+9.555 -0.53 9.643 -0.757 9.643 -1.029 c
+9.643 -1.382 9.518 -1.661 9.276 -1.867 c
+9.041 -2.072 8.724 -2.176 8.335 -2.176 c
+7.913 -2.176 7.574 -2.058 7.321 -1.823 c
+7.063 -1.58 6.938 -1.276 6.938 -0.912 c
+7.585 -0.912 l
+7.593 -1.139 7.662 -1.316 7.791 -1.44 c
+7.915 -1.558 8.1 -1.617 8.335 -1.617 c
+8.548 -1.617 8.709 -1.569 8.819 -1.47 c
+8.937 -1.374 8.996 -1.246 8.996 -1.088 c
+11.127 1.469 m
+11.381 1.793 11.701 1.955 12.083 1.955 c
+12.788 1.955 13.145 1.484 13.156 0.544 c
+13.156 -2.103 l
+12.509 -2.103 l
+12.509 0.515 l
+12.509 0.827 12.454 1.047 12.347 1.176 c
+12.237 1.301 12.083 1.367 11.877 1.367 c
+11.719 1.367 11.572 1.311 11.437 1.205 c
+11.308 1.095 11.205 0.959 11.127 0.794 c
+11.127 -2.103 l
+10.481 -2.103 l
+10.481 3.542 l
+11.127 3.542 l
+h
+16.536 -2.103 -0.646 5.644 re
+17.419 0.073 m
+17.419 0.65 17.555 1.106 17.831 1.44 c
+18.113 1.782 18.485 1.955 18.947 1.955 c
+19.407 1.955 19.774 1.786 20.05 1.455 c
+20.333 1.132 20.48 0.683 20.491 0.118 c
+20.491 -0.309 l
+20.491 -0.879 20.347 -1.334 20.064 -1.675 c
+19.789 -2.01 19.422 -2.176 18.962 -2.176 c
+18.499 -2.176 18.128 -2.014 17.845 -1.691 c
+17.569 -1.359 17.426 -0.919 17.419 -0.368 c
+h
+18.066 -0.309 m
+18.066 -0.713 18.143 -1.029 18.301 -1.264 c
+18.466 -1.5 18.687 -1.617 18.962 -1.617 c
+19.528 -1.617 19.822 -1.205 19.844 -0.382 c
+19.844 0.073 l
+19.844 0.474 19.759 0.794 19.594 1.029 c
+19.437 1.271 19.219 1.396 18.947 1.396 c
+18.683 1.396 18.466 1.271 18.301 1.029 c
+18.143 0.794 18.066 0.474 18.066 0.073 c
+h
+22.71 -1.617 m
+22.924 -1.617 23.096 -1.554 23.225 -1.426 c
+23.36 -1.29 23.435 -1.099 23.445 -0.852 c
+24.062 -0.852 l
+24.041 -1.235 23.905 -1.554 23.651 -1.808 c
+23.394 -2.055 23.082 -2.176 22.71 -2.176 c
+22.218 -2.176 21.843 -2.024 21.579 -1.72 c
+21.321 -1.407 21.197 -0.941 21.197 -0.324 c
+21.197 0.118 l
+21.197 0.713 21.321 1.168 21.579 1.484 c
+21.843 1.797 22.218 1.955 22.71 1.955 c
+23.111 1.955 23.431 1.822 23.666 1.558 c
+23.908 1.301 24.041 0.955 24.062 0.515 c
+23.445 0.515 l
+23.423 0.808 23.35 1.029 23.225 1.176 c
+23.107 1.323 22.934 1.396 22.71 1.396 c
+22.416 1.396 22.2 1.297 22.064 1.103 c
+21.924 0.915 21.851 0.606 21.843 0.176 c
+21.843 -0.339 l
+21.843 -0.809 21.909 -1.143 22.049 -1.338 c
+22.196 -1.525 22.416 -1.617 22.71 -1.617 c
+26.855 -2.103 m
+26.815 -2.014 26.789 -1.867 26.782 -1.661 c
+26.547 -2.007 26.253 -2.176 25.9 -2.176 c
+25.536 -2.176 25.253 -2.08 25.047 -1.881 c
+24.849 -1.675 24.754 -1.389 24.754 -1.014 c
+24.754 -0.613 24.889 -0.294 25.165 -0.059 c
+25.437 0.183 25.812 0.309 26.282 0.309 c
+26.768 0.309 l
+26.768 0.735 l
+26.768 0.97 26.712 1.135 26.606 1.234 c
+26.495 1.341 26.334 1.396 26.121 1.396 c
+25.922 1.396 25.76 1.338 25.635 1.22 c
+25.518 1.103 25.459 0.955 25.459 0.779 c
+24.812 0.779 l
+24.812 0.974 24.871 1.165 24.989 1.352 c
+25.114 1.536 25.276 1.683 25.473 1.793 c
+25.679 1.899 25.907 1.955 26.165 1.955 c
+26.566 1.955 26.87 1.852 27.076 1.646 c
+27.289 1.44 27.403 1.147 27.414 0.764 c
+27.414 -1.249 l
+27.414 -1.554 27.451 -1.819 27.532 -2.043 c
+27.532 -2.103 l
+h
+25.988 -1.588 m
+26.154 -1.588 26.304 -1.544 26.444 -1.455 c
+26.591 -1.367 26.697 -1.257 26.768 -1.118 c
+26.768 -0.177 l
+26.4 -0.177 l
+26.084 -0.177 25.841 -0.246 25.665 -0.382 c
+25.488 -0.511 25.4 -0.698 25.4 -0.941 c
+25.4 -1.168 25.444 -1.334 25.533 -1.44 c
+25.621 -1.54 25.772 -1.588 25.988 -1.588 c
+29.12 -2.103 -0.647 5.644 re
+33.234 -1.617 m
+33.448 -1.617 33.621 -1.554 33.749 -1.426 c
+33.885 -1.29 33.959 -1.099 33.97 -0.852 c
+34.587 -0.852 l
+34.566 -1.235 34.429 -1.554 34.175 -1.808 c
+33.918 -2.055 33.606 -2.176 33.234 -2.176 c
+32.742 -2.176 32.368 -2.024 32.103 -1.72 c
+31.846 -1.407 31.721 -0.941 31.721 -0.324 c
+31.721 0.118 l
+31.721 0.713 31.846 1.168 32.103 1.484 c
+32.368 1.797 32.742 1.955 33.234 1.955 c
+33.635 1.955 33.955 1.822 34.19 1.558 c
+34.433 1.301 34.566 0.955 34.587 0.515 c
+33.97 0.515 l
+33.948 0.808 33.874 1.029 33.749 1.176 c
+33.631 1.323 33.459 1.396 33.234 1.396 c
+32.941 1.396 32.725 1.297 32.588 1.103 c
+32.449 0.915 32.375 0.606 32.368 0.176 c
+32.368 -0.339 l
+32.368 -0.809 32.434 -1.143 32.573 -1.338 c
+32.721 -1.525 32.941 -1.617 33.234 -1.617 c
+35.983 1.469 m
+36.237 1.793 36.557 1.955 36.939 1.955 c
+37.645 1.955 38.001 1.484 38.012 0.544 c
+38.012 -2.103 l
+37.365 -2.103 l
+37.365 0.515 l
+37.365 0.827 37.311 1.047 37.203 1.176 c
+37.093 1.301 36.939 1.367 36.733 1.367 c
+36.575 1.367 36.428 1.311 36.292 1.205 c
+36.164 1.095 36.06 0.959 35.983 0.794 c
+35.983 -2.103 l
+35.337 -2.103 l
+35.337 3.542 l
+35.983 3.542 l
+h
+41.011 -2.103 m
+40.97 -2.014 40.945 -1.867 40.937 -1.661 c
+40.702 -2.007 40.409 -2.176 40.055 -2.176 c
+39.692 -2.176 39.409 -2.08 39.202 -1.881 c
+39.004 -1.675 38.909 -1.389 38.909 -1.014 c
+38.909 -0.613 39.044 -0.294 39.32 -0.059 c
+39.592 0.183 39.967 0.309 40.438 0.309 c
+40.922 0.309 l
+40.922 0.735 l
+40.922 0.97 40.868 1.135 40.76 1.234 c
+40.65 1.341 40.488 1.396 40.276 1.396 c
+40.077 1.396 39.916 1.338 39.79 1.22 c
+39.673 1.103 39.615 0.955 39.615 0.779 c
+38.967 0.779 l
+38.967 0.974 39.027 1.165 39.144 1.352 c
+39.269 1.536 39.43 1.683 39.629 1.793 c
+39.835 1.899 40.062 1.955 40.32 1.955 c
+40.721 1.955 41.026 1.852 41.231 1.646 c
+41.444 1.44 41.558 1.147 41.569 0.764 c
+41.569 -1.249 l
+41.569 -1.554 41.606 -1.819 41.687 -2.043 c
+41.687 -2.103 l
+h
+40.143 -1.588 m
+40.309 -1.588 40.459 -1.544 40.599 -1.455 c
+40.746 -1.367 40.853 -1.257 40.922 -1.118 c
+40.922 -0.177 l
+40.555 -0.177 l
+40.239 -0.177 39.996 -0.246 39.82 -0.382 c
+39.644 -0.511 39.555 -0.698 39.555 -0.941 c
+39.555 -1.168 39.599 -1.334 39.688 -1.44 c
+39.776 -1.54 39.927 -1.588 40.143 -1.588 c
+43.187 1.881 m
+43.201 1.44 l
+43.455 1.782 43.778 1.955 44.171 1.955 c
+44.877 1.955 45.233 1.484 45.244 0.544 c
+45.244 -2.103 l
+44.598 -2.103 l
+44.598 0.515 l
+44.598 0.827 44.542 1.047 44.436 1.176 c
+44.326 1.301 44.171 1.367 43.965 1.367 c
+43.807 1.367 43.661 1.311 43.524 1.205 c
+43.395 1.095 43.293 0.959 43.216 0.794 c
+43.216 -2.103 l
+42.568 -2.103 l
+42.568 1.881 l
+h
+46.082 0.073 m
+46.082 0.69 46.192 1.153 46.42 1.469 c
+46.644 1.793 46.979 1.955 47.42 1.955 c
+47.82 1.955 48.125 1.778 48.33 1.425 c
+48.375 1.881 l
+48.963 1.881 l
+48.963 -2.146 l
+48.963 -2.635 48.835 -3.013 48.581 -3.278 c
+48.324 -3.543 47.971 -3.675 47.522 -3.675 c
+47.324 -3.675 47.104 -3.624 46.861 -3.528 c
+46.615 -3.429 46.435 -3.308 46.317 -3.161 c
+46.582 -2.72 l
+46.846 -2.984 47.144 -3.117 47.478 -3.117 c
+48.014 -3.117 48.29 -2.822 48.301 -2.234 c
+48.301 -1.706 l
+48.095 -2.022 47.794 -2.176 47.405 -2.176 c
+46.994 -2.176 46.67 -2.024 46.435 -1.72 c
+46.207 -1.407 46.09 -0.956 46.082 -0.368 c
+h
+46.743 -0.309 m
+46.743 -0.75 46.806 -1.081 46.934 -1.294 c
+47.06 -1.5 47.276 -1.602 47.581 -1.602 c
+47.904 -1.602 48.143 -1.437 48.301 -1.103 c
+48.301 0.881 l
+48.132 1.205 47.894 1.367 47.581 1.367 c
+47.287 1.367 47.071 1.264 46.934 1.058 c
+46.806 0.852 46.743 0.529 46.743 0.088 c
+h
+51.344 -2.176 m
+50.844 -2.176 50.462 -2.028 50.198 -1.735 c
+49.933 -1.44 49.801 -1.007 49.801 -0.426 c
+49.801 0.044 l
+49.801 0.64 49.926 1.106 50.183 1.44 c
+50.447 1.782 50.807 1.955 51.27 1.955 c
+51.73 1.955 52.072 1.801 52.299 1.5 c
+52.535 1.205 52.656 0.742 52.667 0.118 c
+52.667 -0.309 l
+50.447 -0.309 l
+50.447 -0.397 l
+50.447 -0.831 50.524 -1.143 50.682 -1.338 c
+50.848 -1.525 51.079 -1.617 51.374 -1.617 c
+51.568 -1.617 51.741 -1.584 51.888 -1.515 c
+52.035 -1.437 52.171 -1.319 52.299 -1.162 c
+52.638 -1.573 l
+52.351 -1.977 51.921 -2.176 51.344 -2.176 c
+51.27 1.396 m
+50.995 1.396 50.793 1.301 50.668 1.117 c
+50.539 0.929 50.466 0.64 50.447 0.249 c
+52.02 0.249 l
+52.02 0.338 l
+51.998 0.72 51.933 0.989 51.814 1.147 c
+51.697 1.311 51.513 1.396 51.27 1.396 c
+55.386 -1.088 m
+55.386 -0.941 55.331 -0.819 55.225 -0.721 c
+55.114 -0.625 54.909 -0.507 54.607 -0.368 c
+54.262 -0.221 54.019 -0.1 53.872 0 c
+53.726 0.106 53.616 0.224 53.549 0.353 c
+53.479 0.478 53.446 0.636 53.446 0.823 c
+53.446 1.147 53.564 1.415 53.799 1.631 c
+54.034 1.845 54.335 1.955 54.711 1.955 c
+55.093 1.955 55.401 1.841 55.636 1.617 c
+55.871 1.389 55.989 1.103 55.989 0.75 c
+55.342 0.75 l
+55.342 0.926 55.283 1.076 55.166 1.205 c
+55.048 1.33 54.894 1.396 54.711 1.396 c
+54.512 1.396 54.362 1.341 54.254 1.234 c
+54.144 1.135 54.092 1.003 54.092 0.837 c
+54.092 0.709 54.129 0.602 54.21 0.515 c
+54.287 0.434 54.479 0.33 54.784 0.206 c
+55.262 0.018 55.592 -0.169 55.769 -0.353 c
+55.945 -0.53 56.033 -0.757 56.033 -1.029 c
+56.033 -1.382 55.908 -1.661 55.665 -1.867 c
+55.43 -2.072 55.114 -2.176 54.725 -2.176 c
+54.302 -2.176 53.965 -2.058 53.711 -1.823 c
+53.454 -1.58 53.329 -1.276 53.329 -0.912 c
+53.975 -0.912 l
+53.982 -1.139 54.052 -1.316 54.181 -1.44 c
+54.306 -1.558 54.49 -1.617 54.725 -1.617 c
+54.938 -1.617 55.1 -1.569 55.21 -1.47 c
+55.328 -1.374 55.386 -1.246 55.386 -1.088 c
+59.443 2.836 m
+59.443 1.881 l
+60.046 1.881 l
+60.046 1.352 l
+59.443 1.352 l
+59.443 -1.118 l
+59.443 -1.276 59.465 -1.393 59.517 -1.47 c
+59.575 -1.551 59.664 -1.588 59.781 -1.588 c
+59.87 -1.588 59.958 -1.573 60.046 -1.544 c
+60.046 -2.103 l
+59.899 -2.15 59.744 -2.176 59.59 -2.176 c
+59.333 -2.176 59.139 -2.084 59.002 -1.897 c
+58.863 -1.712 58.796 -1.452 58.796 -1.118 c
+58.796 1.352 l
+58.194 1.352 l
+58.194 1.881 l
+58.796 1.881 l
+58.796 2.836 l
+h
+60.604 0.073 m
+60.604 0.65 60.741 1.106 61.016 1.44 c
+61.3 1.782 61.67 1.955 62.133 1.955 c
+62.593 1.955 62.96 1.786 63.236 1.455 c
+63.519 1.132 63.665 0.683 63.677 0.118 c
+63.677 -0.309 l
+63.677 -0.879 63.534 -1.334 63.251 -1.675 c
+62.975 -2.01 62.607 -2.176 62.148 -2.176 c
+61.685 -2.176 61.314 -2.014 61.03 -1.691 c
+60.755 -1.359 60.612 -0.919 60.604 -0.368 c
+h
+61.252 -0.309 m
+61.252 -0.713 61.329 -1.029 61.487 -1.264 c
+61.652 -1.5 61.872 -1.617 62.148 -1.617 c
+62.713 -1.617 63.008 -1.205 63.03 -0.382 c
+63.03 0.073 l
+63.03 0.474 62.946 0.794 62.78 1.029 c
+62.622 1.271 62.405 1.396 62.133 1.396 c
+61.869 1.396 61.652 1.271 61.487 1.029 c
+61.329 0.794 61.252 0.474 61.252 0.073 c
+h
+67.087 2.836 m
+67.087 1.881 l
+67.69 1.881 l
+67.69 1.352 l
+67.087 1.352 l
+67.087 -1.118 l
+67.087 -1.276 67.109 -1.393 67.16 -1.47 c
+67.22 -1.551 67.307 -1.588 67.425 -1.588 c
+67.513 -1.588 67.602 -1.573 67.69 -1.544 c
+67.69 -2.103 l
+67.542 -2.15 67.388 -2.176 67.234 -2.176 c
+66.977 -2.176 66.782 -2.084 66.646 -1.897 c
+66.507 -1.712 66.44 -1.452 66.44 -1.118 c
+66.44 1.352 l
+65.838 1.352 l
+65.838 1.881 l
+66.44 1.881 l
+66.44 2.836 l
+h
+69.101 1.469 m
+69.354 1.793 69.674 1.955 70.056 1.955 c
+70.761 1.955 71.118 1.484 71.129 0.544 c
+71.129 -2.103 l
+70.482 -2.103 l
+70.482 0.515 l
+70.482 0.827 70.428 1.047 70.32 1.176 c
+70.21 1.301 70.056 1.367 69.85 1.367 c
+69.692 1.367 69.545 1.311 69.41 1.205 c
+69.281 1.095 69.178 0.959 69.101 0.794 c
+69.101 -2.103 l
+68.454 -2.103 l
+68.454 3.542 l
+69.101 3.542 l
+h
+73.51 -2.176 m
+73.011 -2.176 72.629 -2.028 72.364 -1.735 c
+72.099 -1.44 71.967 -1.007 71.967 -0.426 c
+71.967 0.044 l
+71.967 0.64 72.092 1.106 72.349 1.44 c
+72.614 1.782 72.974 1.955 73.437 1.955 c
+73.896 1.955 74.238 1.801 74.466 1.5 c
+74.701 1.205 74.823 0.742 74.833 0.118 c
+74.833 -0.309 l
+72.614 -0.309 l
+72.614 -0.397 l
+72.614 -0.831 72.691 -1.143 72.849 -1.338 c
+73.015 -1.525 73.246 -1.617 73.539 -1.617 c
+73.734 -1.617 73.907 -1.584 74.054 -1.515 c
+74.201 -1.437 74.337 -1.319 74.466 -1.162 c
+74.804 -1.573 l
+74.517 -1.977 74.087 -2.176 73.51 -2.176 c
+73.437 1.396 m
+73.161 1.396 72.959 1.301 72.834 1.117 c
+72.706 0.929 72.632 0.64 72.614 0.249 c
+74.187 0.249 l
+74.187 0.338 l
+74.164 0.72 74.098 0.989 73.981 1.147 c
+73.863 1.311 73.68 1.396 73.437 1.396 c
+f
+Q
+q 1 0 0 1 174.4817 173.112 cm
+0 0 m
+-0.338 0.029 l
+-0.625 0.029 -0.816 -0.096 -0.911 -0.339 c
+-0.911 -2.97 l
+-1.955 -2.97 l
+-1.955 1.014 l
+-0.985 1.014 l
+-0.955 0.573 l
+-0.79 0.914 -0.559 1.087 -0.264 1.087 c
+-0.147 1.087 -0.055 1.066 0.015 1.028 c
+h
+2.072 -3.043 m
+1.544 -3.043 1.125 -2.889 0.823 -2.573 c
+0.53 -2.249 0.382 -1.79 0.382 -1.191 c
+0.382 -0.882 l
+0.382 -0.258 0.518 0.228 0.794 0.573 c
+1.066 0.914 1.459 1.087 1.97 1.087 c
+2.469 1.087 2.841 0.926 3.088 0.602 c
+3.341 0.279 3.473 -0.198 3.484 -0.823 c
+3.484 -1.324 l
+1.411 -1.324 l
+1.43 -1.617 1.492 -1.834 1.602 -1.97 c
+1.72 -2.109 1.9 -2.176 2.147 -2.176 c
+2.488 -2.176 2.778 -2.058 3.013 -1.823 c
+3.425 -2.455 l
+3.296 -2.631 3.109 -2.774 2.866 -2.881 c
+2.62 -2.988 2.356 -3.043 2.072 -3.043 c
+1.426 -0.603 m
+2.455 -0.603 l
+2.455 -0.5 l
+2.455 -0.265 2.415 -0.088 2.338 0.029 c
+2.267 0.154 2.139 0.22 1.955 0.22 c
+1.779 0.22 1.646 0.151 1.558 0.014 c
+1.478 -0.114 1.434 -0.32 1.426 -0.603 c
+5.042 1.014 m
+5.072 0.646 l
+5.307 0.941 5.615 1.087 5.997 1.087 c
+6.398 1.087 6.677 0.904 6.835 0.544 c
+7.071 0.904 7.398 1.087 7.82 1.087 c
+8.515 1.087 8.867 0.602 8.879 -0.368 c
+8.879 -2.97 l
+7.85 -2.97 l
+7.85 -0.426 l
+7.85 -0.202 7.813 -0.04 7.747 0.058 c
+7.688 0.154 7.578 0.205 7.423 0.205 c
+7.225 0.205 7.086 0.087 6.997 -0.148 c
+6.997 -2.97 l
+5.953 -2.97 l
+5.953 -0.441 l
+5.953 -0.206 5.924 -0.04 5.866 0.058 c
+5.806 0.154 5.696 0.205 5.542 0.205 c
+5.365 0.205 5.222 0.11 5.116 -0.073 c
+5.116 -2.97 l
+4.072 -2.97 l
+4.072 1.014 l
+h
+9.54 -0.853 m
+9.54 -0.246 9.679 0.228 9.966 0.573 c
+10.249 0.914 10.643 1.087 11.142 1.087 c
+11.649 1.087 12.046 0.914 12.333 0.573 c
+12.615 0.228 12.759 -0.246 12.759 -0.853 c
+12.759 -1.118 l
+12.759 -1.716 12.615 -2.186 12.333 -2.529 c
+12.046 -2.874 11.649 -3.043 11.142 -3.043 c
+10.631 -3.043 10.234 -2.874 9.951 -2.529 c
+9.675 -2.186 9.54 -1.713 9.54 -1.103 c
+h
+10.583 -1.118 m
+10.583 -1.823 10.768 -2.176 11.142 -2.176 c
+11.495 -2.176 11.686 -1.881 11.715 -1.294 c
+11.715 -0.853 l
+11.715 -0.493 11.664 -0.221 11.568 -0.044 c
+11.469 0.132 11.326 0.22 11.142 0.22 c
+10.965 0.22 10.826 0.132 10.73 -0.044 c
+10.631 -0.221 10.583 -0.493 10.583 -0.853 c
+h
+14.612 1.984 m
+14.612 1.014 l
+15.14 1.014 l
+15.14 0.22 l
+14.612 0.22 l
+14.612 -1.75 l
+14.612 -1.908 14.629 -2.014 14.67 -2.072 c
+14.718 -2.132 14.803 -2.161 14.92 -2.161 c
+15.026 -2.161 15.111 -2.153 15.169 -2.132 c
+15.169 -2.94 l
+14.993 -3.007 14.803 -3.043 14.596 -3.043 c
+13.92 -3.043 13.575 -2.657 13.567 -1.881 c
+13.567 0.22 l
+13.112 0.22 l
+13.112 1.014 l
+13.567 1.014 l
+13.567 1.984 l
+h
+17.315 -3.043 m
+16.787 -3.043 16.368 -2.889 16.066 -2.573 c
+15.772 -2.249 15.626 -1.79 15.626 -1.191 c
+15.626 -0.882 l
+15.626 -0.258 15.761 0.228 16.037 0.573 c
+16.309 0.914 16.702 1.087 17.213 1.087 c
+17.712 1.087 18.084 0.926 18.33 0.602 c
+18.583 0.279 18.716 -0.198 18.726 -0.823 c
+18.726 -1.324 l
+16.654 -1.324 l
+16.673 -1.617 16.735 -1.834 16.845 -1.97 c
+16.963 -2.109 17.143 -2.176 17.39 -2.176 c
+17.731 -2.176 18.021 -2.058 18.256 -1.823 c
+18.668 -2.455 l
+18.539 -2.631 18.352 -2.774 18.109 -2.881 c
+17.864 -2.988 17.598 -3.043 17.315 -3.043 c
+16.669 -0.603 m
+17.698 -0.603 l
+17.698 -0.5 l
+17.698 -0.265 17.658 -0.088 17.581 0.029 c
+17.511 0.154 17.382 0.22 17.199 0.22 c
+17.022 0.22 16.889 0.151 16.802 0.014 c
+16.721 -0.114 16.676 -0.32 16.669 -0.603 c
+f
+Q
+q 1 0 0 1 193.9437 170.4949 cm
+0 0 m
+0 0.118 0.033 0.214 0.103 0.294 c
+0.168 0.372 0.272 0.412 0.411 0.412 c
+0.559 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.201 0.735 -0.278 c
+0.665 -0.356 0.559 -0.396 0.411 -0.396 c
+0.272 -0.396 0.168 -0.356 0.103 -0.278 c
+0.033 -0.201 0 -0.11 0 0 c
+6.938 4.998 m
+6.938 1.191 l
+6.938 0.691 6.79 0.294 6.497 0 c
+6.21 -0.286 5.81 -0.426 5.292 -0.426 c
+4.762 -0.426 4.355 -0.29 4.072 -0.014 c
+3.796 0.269 3.659 0.669 3.659 1.191 c
+3.659 4.998 l
+4.322 4.998 l
+4.322 1.22 l
+4.322 0.857 4.395 0.588 4.542 0.412 c
+4.696 0.235 4.946 0.148 5.292 0.148 c
+5.633 0.148 5.88 0.235 6.026 0.412 c
+6.181 0.588 6.262 0.857 6.262 1.22 c
+6.262 4.998 l
+h
+9.834 0.662 m
+9.834 0.809 9.778 0.93 9.672 1.029 c
+9.562 1.125 9.356 1.243 9.055 1.382 c
+8.709 1.529 8.467 1.65 8.32 1.75 c
+8.172 1.856 8.062 1.974 7.996 2.103 c
+7.927 2.228 7.893 2.386 7.893 2.573 c
+7.893 2.897 8.01 3.165 8.246 3.381 c
+8.481 3.595 8.783 3.705 9.157 3.705 c
+9.539 3.705 9.848 3.591 10.083 3.367 c
+10.318 3.138 10.437 2.852 10.437 2.5 c
+9.789 2.5 l
+9.789 2.675 9.731 2.826 9.612 2.955 c
+9.496 3.08 9.341 3.146 9.157 3.146 c
+8.959 3.146 8.808 3.091 8.702 2.984 c
+8.592 2.885 8.54 2.753 8.54 2.587 c
+8.54 2.459 8.577 2.352 8.658 2.264 c
+8.735 2.183 8.926 2.08 9.231 1.956 c
+9.708 1.768 10.04 1.58 10.215 1.397 c
+10.392 1.22 10.48 0.992 10.48 0.721 c
+10.48 0.368 10.356 0.088 10.113 -0.118 c
+9.878 -0.323 9.562 -0.426 9.172 -0.426 c
+8.75 -0.426 8.411 -0.309 8.158 -0.073 c
+7.9 0.169 7.775 0.474 7.775 0.838 c
+8.422 0.838 l
+8.43 0.611 8.5 0.434 8.628 0.309 c
+8.753 0.192 8.937 0.133 9.172 0.133 c
+9.385 0.133 9.547 0.181 9.657 0.279 c
+9.774 0.375 9.834 0.504 9.834 0.662 c
+12.744 -0.426 m
+12.244 -0.426 11.862 -0.278 11.597 0.015 c
+11.333 0.309 11.2 0.743 11.2 1.324 c
+11.2 1.794 l
+11.2 2.389 11.326 2.856 11.582 3.19 c
+11.848 3.532 12.207 3.705 12.67 3.705 c
+13.13 3.705 13.471 3.55 13.699 3.249 c
+13.934 2.955 14.056 2.492 14.067 1.867 c
+14.067 1.441 l
+11.848 1.441 l
+11.848 1.353 l
+11.848 0.919 11.925 0.607 12.083 0.412 c
+12.247 0.225 12.479 0.133 12.773 0.133 c
+12.968 0.133 13.14 0.166 13.288 0.235 c
+13.435 0.313 13.571 0.431 13.699 0.588 c
+14.038 0.177 l
+13.751 -0.228 13.321 -0.426 12.744 -0.426 c
+12.67 3.146 m
+12.395 3.146 12.193 3.051 12.068 2.866 c
+11.939 2.679 11.866 2.389 11.848 1.999 c
+13.42 1.999 l
+13.42 2.087 l
+13.398 2.469 13.332 2.738 13.215 2.897 c
+13.097 3.061 12.913 3.146 12.67 3.146 c
+f
+Q
+212.273 172.01 -1.793 0.867 re
+215.007 172.01 -1.793 0.867 re
+217.08 175.096 m
+217.08 174.126 l
+217.609 174.126 l
+217.609 173.332 l
+217.08 173.332 l
+217.08 171.362 l
+217.08 171.204 217.098 171.098 217.139 171.04 c
+217.187 170.98 217.271 170.951 217.389 170.951 c
+217.495 170.951 217.58 170.959 217.638 170.98 c
+217.638 170.172 l
+217.462 170.105 217.271 170.069 217.065 170.069 c
+216.389 170.069 216.044 170.455 216.036 171.231 c
+216.036 173.332 l
+215.581 173.332 l
+215.581 174.126 l
+216.036 174.126 l
+216.036 175.096 l
+h
+220.063 170.142 m
+220.034 170.201 220.005 170.304 219.976 170.452 c
+219.788 170.194 219.538 170.069 219.226 170.069 c
+218.891 170.069 218.612 170.176 218.388 170.392 c
+218.172 170.616 218.064 170.907 218.064 171.26 c
+218.064 171.671 218.197 171.987 218.461 172.216 c
+218.727 172.451 219.108 172.568 219.608 172.568 c
+219.932 172.568 l
+219.932 172.891 l
+219.932 173.068 219.895 173.189 219.828 173.259 c
+219.77 173.336 219.681 173.376 219.564 173.376 c
+219.307 173.376 219.182 173.222 219.182 172.921 c
+218.138 172.921 l
+218.138 173.292 218.274 173.597 218.55 173.832 c
+218.822 174.074 219.171 174.2 219.593 174.2 c
+220.034 174.2 220.373 174.082 220.608 173.847 c
+220.85 173.619 220.975 173.295 220.975 172.877 c
+220.975 171.009 l
+220.975 170.664 221.023 170.396 221.122 170.201 c
+221.122 170.142 l
+h
+219.461 170.892 m
+219.568 170.892 219.66 170.911 219.741 170.951 c
+219.828 170.999 219.891 171.057 219.932 171.127 c
+219.932 171.95 l
+219.681 171.95 l
+219.505 171.95 219.362 171.892 219.255 171.774 c
+219.156 171.664 219.108 171.517 219.108 171.333 c
+219.108 171.04 219.226 170.892 219.461 170.892 c
+221.592 172.259 m
+221.592 172.906 221.71 173.391 221.945 173.714 c
+222.18 174.038 222.511 174.2 222.945 174.2 c
+223.298 174.2 223.569 174.057 223.768 173.773 c
+223.812 174.126 l
+224.753 174.126 l
+224.753 170.142 l
+224.753 169.635 224.609 169.246 224.327 168.981 c
+224.04 168.709 223.635 168.57 223.107 168.57 c
+222.879 168.57 222.644 168.613 222.401 168.702 c
+222.166 168.79 221.989 168.904 221.871 169.041 c
+222.224 169.76 l
+222.32 169.654 222.449 169.569 222.606 169.511 c
+222.761 169.444 222.908 169.407 223.047 169.407 c
+223.283 169.407 223.448 169.467 223.547 169.584 c
+223.654 169.694 223.709 169.87 223.709 170.113 c
+223.709 170.466 l
+223.51 170.201 223.253 170.069 222.93 170.069 c
+222.507 170.069 222.18 170.231 221.945 170.554 c
+221.717 170.885 221.6 171.356 221.592 171.965 c
+h
+222.636 171.994 m
+222.636 171.62 222.684 171.352 222.783 171.186 c
+222.879 171.017 223.033 170.936 223.238 170.936 c
+223.452 170.936 223.61 171.013 223.709 171.171 c
+223.709 173.068 l
+223.599 173.233 223.444 173.317 223.238 173.317 c
+223.033 173.317 222.879 173.233 222.783 173.068 c
+222.684 172.898 222.636 172.63 222.636 172.259 c
+h
+227.281 171.216 m
+227.281 171.304 227.236 171.381 227.149 171.451 c
+227.061 171.528 226.873 171.631 226.59 171.759 c
+226.157 171.936 225.859 172.116 225.694 172.303 c
+225.536 172.487 225.458 172.719 225.458 172.994 c
+225.458 173.336 225.58 173.619 225.825 173.847 c
+226.079 174.082 226.417 174.2 226.839 174.2 c
+227.27 174.2 227.619 174.086 227.884 173.862 c
+228.148 173.633 228.281 173.332 228.281 172.95 c
+227.236 172.95 l
+227.236 173.274 227.097 173.435 226.825 173.435 c
+226.715 173.435 226.627 173.398 226.561 173.332 c
+226.49 173.263 226.458 173.163 226.458 173.039 c
+226.458 172.95 226.494 172.869 226.575 172.803 c
+226.652 172.744 226.833 172.649 227.119 172.524 c
+227.549 172.366 227.847 172.189 228.015 171.994 c
+228.192 171.807 228.281 171.557 228.281 171.245 c
+228.281 170.892 228.148 170.606 227.884 170.392 c
+227.619 170.176 227.27 170.069 226.839 170.069 c
+226.546 170.069 226.285 170.124 226.061 170.231 c
+225.833 170.348 225.657 170.51 225.532 170.716 c
+225.414 170.922 225.355 171.142 225.355 171.377 c
+226.34 171.377 l
+226.34 171.19 226.377 171.054 226.458 170.965 c
+226.546 170.878 226.679 170.834 226.855 170.834 c
+227.138 170.834 227.281 170.959 227.281 171.216 c
+f
+q 1 0 0 1 231.6175 175.081 cm
+0 0 m
+0 -0.955 l
+0.602 -0.955 l
+0.602 -1.484 l
+0 -1.484 l
+0 -3.954 l
+0 -4.112 0.022 -4.23 0.073 -4.307 c
+0.132 -4.388 0.22 -4.424 0.338 -4.424 c
+0.426 -4.424 0.515 -4.409 0.602 -4.38 c
+0.602 -4.939 l
+0.455 -4.986 0.301 -5.012 0.147 -5.012 c
+-0.111 -5.012 -0.306 -4.92 -0.441 -4.733 c
+-0.581 -4.548 -0.647 -4.288 -0.647 -3.954 c
+-0.647 -1.484 l
+-1.25 -1.484 l
+-1.25 -0.955 l
+-0.647 -0.955 l
+-0.647 0 l
+h
+1.161 -2.763 m
+1.161 -2.186 1.297 -1.73 1.572 -1.396 c
+1.855 -1.055 2.227 -0.881 2.69 -0.881 c
+3.149 -0.881 3.516 -1.051 3.792 -1.381 c
+4.075 -1.705 4.222 -2.153 4.233 -2.719 c
+4.233 -3.145 l
+4.233 -3.715 4.089 -4.17 3.807 -4.512 c
+3.532 -4.847 3.164 -5.012 2.705 -5.012 c
+2.241 -5.012 1.87 -4.85 1.587 -4.527 c
+1.311 -4.196 1.168 -3.755 1.161 -3.204 c
+h
+1.807 -3.145 m
+1.807 -3.549 1.885 -3.866 2.042 -4.101 c
+2.208 -4.336 2.429 -4.453 2.705 -4.453 c
+3.27 -4.453 3.564 -4.041 3.586 -3.218 c
+3.586 -2.763 l
+3.586 -2.362 3.501 -2.042 3.337 -1.807 c
+3.179 -1.565 2.961 -1.44 2.69 -1.44 c
+2.425 -1.44 2.208 -1.565 2.042 -1.807 c
+1.885 -2.042 1.807 -2.362 1.807 -2.763 c
+h
+9.672 -3.145 m
+9.672 -3.773 9.554 -4.244 9.319 -4.556 c
+9.091 -4.861 8.775 -5.012 8.363 -5.012 c
+7.96 -5.012 7.65 -4.861 7.437 -4.556 c
+7.437 -6.468 l
+6.79 -6.468 l
+6.79 -0.955 l
+7.378 -0.955 l
+7.422 -1.396 l
+7.636 -1.055 7.945 -0.881 8.349 -0.881 c
+8.789 -0.881 9.117 -1.036 9.333 -1.337 c
+9.547 -1.643 9.66 -2.098 9.672 -2.705 c
+h
+9.025 -2.763 m
+9.025 -2.322 8.955 -1.999 8.819 -1.793 c
+8.679 -1.58 8.459 -1.469 8.157 -1.469 c
+7.842 -1.469 7.603 -1.624 7.437 -1.925 c
+7.437 -3.998 l
+7.603 -4.303 7.842 -4.453 8.157 -4.453 c
+8.452 -4.453 8.665 -4.351 8.804 -4.145 c
+8.941 -3.931 9.014 -3.601 9.025 -3.16 c
+h
+12.538 -4.586 m
+12.321 -4.872 12.009 -5.012 11.597 -5.012 c
+11.233 -5.012 10.958 -4.891 10.774 -4.644 c
+10.597 -4.39 10.502 -4.027 10.495 -3.557 c
+10.495 -0.955 l
+11.141 -0.955 l
+11.141 -3.498 l
+11.141 -4.126 11.326 -4.438 11.7 -4.438 c
+12.101 -4.438 12.376 -4.262 12.523 -3.91 c
+12.523 -0.955 l
+13.17 -0.955 l
+13.17 -4.939 l
+12.552 -4.939 l
+h
+16.095 -3.924 m
+16.095 -3.777 16.04 -3.656 15.933 -3.557 c
+15.823 -3.461 15.617 -3.343 15.316 -3.204 c
+14.971 -3.057 14.728 -2.936 14.581 -2.836 c
+14.434 -2.73 14.324 -2.612 14.258 -2.484 c
+14.188 -2.358 14.155 -2.2 14.155 -2.013 c
+14.155 -1.69 14.272 -1.421 14.507 -1.205 c
+14.742 -0.992 15.044 -0.881 15.419 -0.881 c
+15.802 -0.881 16.11 -0.995 16.345 -1.219 c
+16.581 -1.448 16.698 -1.734 16.698 -2.087 c
+16.051 -2.087 l
+16.051 -1.911 15.993 -1.76 15.875 -1.631 c
+15.757 -1.506 15.603 -1.44 15.419 -1.44 c
+15.22 -1.44 15.07 -1.495 14.963 -1.602 c
+14.853 -1.701 14.802 -1.834 14.802 -1.999 c
+14.802 -2.127 14.838 -2.234 14.919 -2.322 c
+14.996 -2.403 15.187 -2.506 15.492 -2.63 c
+15.97 -2.818 16.301 -3.006 16.477 -3.189 c
+16.654 -3.366 16.742 -3.594 16.742 -3.866 c
+16.742 -4.218 16.617 -4.498 16.374 -4.704 c
+16.139 -4.909 15.823 -5.012 15.434 -5.012 c
+15.011 -5.012 14.673 -4.895 14.42 -4.659 c
+14.162 -4.417 14.037 -4.112 14.037 -3.748 c
+14.684 -3.748 l
+14.692 -3.976 14.761 -4.152 14.89 -4.277 c
+15.015 -4.394 15.199 -4.453 15.434 -4.453 c
+15.646 -4.453 15.808 -4.406 15.918 -4.307 c
+16.037 -4.211 16.095 -4.082 16.095 -3.924 c
+18.227 -1.367 m
+18.48 -1.043 18.8 -0.881 19.182 -0.881 c
+19.887 -0.881 20.244 -1.352 20.255 -2.293 c
+20.255 -4.939 l
+19.608 -4.939 l
+19.608 -2.322 l
+19.608 -2.009 19.553 -1.789 19.446 -1.66 c
+19.336 -1.535 19.182 -1.469 18.976 -1.469 c
+18.819 -1.469 18.671 -1.525 18.535 -1.631 c
+18.407 -1.741 18.304 -1.878 18.227 -2.042 c
+18.227 -4.939 l
+17.58 -4.939 l
+17.58 0.706 l
+18.227 0.706 l
+h
+23.783 0 m
+23.783 -0.955 l
+24.385 -0.955 l
+24.385 -1.484 l
+23.783 -1.484 l
+23.783 -3.954 l
+23.783 -4.112 23.804 -4.23 23.856 -4.307 c
+23.915 -4.388 24.003 -4.424 24.121 -4.424 c
+24.209 -4.424 24.297 -4.409 24.385 -4.38 c
+24.385 -4.939 l
+24.238 -4.986 24.084 -5.012 23.93 -5.012 c
+23.673 -5.012 23.478 -4.92 23.342 -4.733 c
+23.202 -4.548 23.136 -4.288 23.136 -3.954 c
+23.136 -1.484 l
+22.534 -1.484 l
+22.534 -0.955 l
+23.136 -0.955 l
+23.136 0 l
+h
+27.193 -4.939 m
+27.153 -4.85 27.127 -4.704 27.12 -4.498 c
+26.884 -4.843 26.59 -5.012 26.237 -5.012 c
+25.874 -5.012 25.591 -4.916 25.385 -4.718 c
+25.186 -4.512 25.09 -4.226 25.09 -3.85 c
+25.09 -3.45 25.227 -3.131 25.502 -2.896 c
+25.774 -2.653 26.15 -2.528 26.62 -2.528 c
+27.105 -2.528 l
+27.105 -2.102 l
+27.105 -1.866 27.05 -1.701 26.943 -1.602 c
+26.833 -1.495 26.671 -1.44 26.458 -1.44 c
+26.26 -1.44 26.098 -1.499 25.973 -1.616 c
+25.855 -1.734 25.796 -1.881 25.796 -2.057 c
+25.15 -2.057 l
+25.15 -1.863 25.209 -1.672 25.326 -1.484 c
+25.451 -1.3 25.613 -1.153 25.811 -1.043 c
+26.017 -0.937 26.245 -0.881 26.502 -0.881 c
+26.902 -0.881 27.207 -0.984 27.413 -1.19 c
+27.627 -1.396 27.741 -1.69 27.752 -2.072 c
+27.752 -4.086 l
+27.752 -4.39 27.788 -4.656 27.869 -4.88 c
+27.869 -4.939 l
+h
+26.326 -4.424 m
+26.491 -4.424 26.642 -4.38 26.781 -4.292 c
+26.929 -4.203 27.035 -4.093 27.105 -3.954 c
+27.105 -3.013 l
+26.737 -3.013 l
+26.422 -3.013 26.179 -3.083 26.002 -3.218 c
+25.826 -3.347 25.738 -3.534 25.738 -3.777 c
+25.738 -4.005 25.782 -4.17 25.87 -4.277 c
+25.958 -4.376 26.109 -4.424 26.326 -4.424 c
+28.618 -2.763 m
+28.618 -2.146 28.729 -1.683 28.957 -1.367 c
+29.181 -1.043 29.516 -0.881 29.956 -0.881 c
+30.357 -0.881 30.662 -1.058 30.868 -1.411 c
+30.912 -0.955 l
+31.5 -0.955 l
+31.5 -4.982 l
+31.5 -5.471 31.371 -5.85 31.118 -6.115 c
+30.86 -6.379 30.507 -6.511 30.059 -6.511 c
+29.861 -6.511 29.64 -6.46 29.398 -6.364 c
+29.152 -6.265 28.972 -6.144 28.853 -5.997 c
+29.119 -5.556 l
+29.383 -5.82 29.68 -5.953 30.015 -5.953 c
+30.551 -5.953 30.827 -5.659 30.838 -5.071 c
+30.838 -4.542 l
+30.632 -4.858 30.331 -5.012 29.942 -5.012 c
+29.53 -5.012 29.207 -4.861 28.972 -4.556 c
+28.743 -4.244 28.626 -3.792 28.618 -3.204 c
+h
+29.281 -3.145 m
+29.281 -3.586 29.343 -3.917 29.471 -4.13 c
+29.597 -4.336 29.813 -4.438 30.118 -4.438 c
+30.441 -4.438 30.68 -4.273 30.838 -3.939 c
+30.838 -1.955 l
+30.669 -1.631 30.43 -1.469 30.118 -1.469 c
+29.824 -1.469 29.607 -1.572 29.471 -1.778 c
+29.343 -1.984 29.281 -2.308 29.281 -2.748 c
+h
+34.395 -3.924 m
+34.395 -3.777 34.341 -3.656 34.234 -3.557 c
+34.123 -3.461 33.917 -3.343 33.616 -3.204 c
+33.271 -3.057 33.028 -2.936 32.882 -2.836 c
+32.735 -2.73 32.624 -2.612 32.558 -2.484 c
+32.488 -2.358 32.455 -2.2 32.455 -2.013 c
+32.455 -1.69 32.573 -1.421 32.808 -1.205 c
+33.043 -0.992 33.344 -0.881 33.719 -0.881 c
+34.102 -0.881 34.41 -0.995 34.646 -1.219 c
+34.881 -1.448 34.998 -1.734 34.998 -2.087 c
+34.351 -2.087 l
+34.351 -1.911 34.293 -1.76 34.175 -1.631 c
+34.058 -1.506 33.903 -1.44 33.719 -1.44 c
+33.52 -1.44 33.37 -1.495 33.264 -1.602 c
+33.154 -1.701 33.102 -1.834 33.102 -1.999 c
+33.102 -2.127 33.138 -2.234 33.219 -2.322 c
+33.297 -2.403 33.488 -2.506 33.792 -2.63 c
+34.27 -2.818 34.601 -3.006 34.777 -3.189 c
+34.954 -3.366 35.043 -3.594 35.043 -3.866 c
+35.043 -4.218 34.917 -4.498 34.675 -4.704 c
+34.44 -4.909 34.123 -5.012 33.734 -5.012 c
+33.312 -5.012 32.973 -4.895 32.72 -4.659 c
+32.462 -4.417 32.338 -4.112 32.338 -3.748 c
+32.984 -3.748 l
+32.992 -3.976 33.061 -4.152 33.19 -4.277 c
+33.315 -4.394 33.499 -4.453 33.734 -4.453 c
+33.947 -4.453 34.108 -4.406 34.219 -4.307 c
+34.337 -4.211 34.395 -4.082 34.395 -3.924 c
+35.924 -4.586 m
+35.924 -4.469 35.957 -4.373 36.027 -4.292 c
+36.093 -4.215 36.196 -4.174 36.336 -4.174 c
+36.483 -4.174 36.589 -4.215 36.659 -4.292 c
+36.736 -4.373 36.776 -4.469 36.776 -4.586 c
+36.776 -4.696 36.736 -4.787 36.659 -4.865 c
+36.589 -4.942 36.483 -4.982 36.336 -4.982 c
+36.196 -4.982 36.093 -4.942 36.027 -4.865 c
+35.957 -4.787 35.924 -4.696 35.924 -4.586 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 164.535 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 157.6961 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.485 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.485 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.485 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.566 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.801 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+21.986 2.219 m
+21.994 2.198 22.001 2.165 22.001 2.117 c
+22.009 2.076 22.016 2.028 22.016 1.97 c
+22.023 1.918 22.03 1.866 22.03 1.808 c
+22.03 1.646 l
+22.045 1.646 l
+22.104 1.764 22.17 1.86 22.251 1.941 c
+22.328 2.018 22.413 2.08 22.501 2.132 c
+22.589 2.19 22.677 2.227 22.765 2.249 c
+22.861 2.267 22.961 2.278 23.059 2.278 c
+23.265 2.278 23.445 2.234 23.603 2.146 c
+23.757 2.058 23.886 1.929 23.985 1.764 c
+24.092 1.606 24.169 1.415 24.22 1.191 c
+24.28 0.974 24.309 0.738 24.309 0.485 c
+24.309 0.22 24.28 -0.025 24.22 -0.25 c
+24.169 -0.467 24.092 -0.658 23.985 -0.823 c
+23.886 -0.981 23.754 -1.103 23.589 -1.191 c
+23.431 -1.278 23.243 -1.323 23.03 -1.323 c
+22.931 -1.323 22.832 -1.312 22.736 -1.294 c
+22.637 -1.272 22.545 -1.242 22.456 -1.191 c
+22.375 -1.143 22.298 -1.08 22.221 -0.999 c
+22.152 -0.922 22.093 -0.831 22.045 -0.721 c
+22.03 -0.721 l
+22.03 -0.808 l
+22.038 -0.849 22.045 -0.897 22.045 -0.956 c
+22.045 -1.117 l
+22.045 -1.294 l
+22.045 -2.631 l
+21.134 -2.631 l
+21.134 1.455 l
+21.134 1.621 21.126 1.768 21.119 1.897 c
+21.119 2.219 l
+h
+22.03 0.455 m
+22.03 0.228 22.049 0.037 22.089 -0.118 c
+22.137 -0.264 22.192 -0.382 22.251 -0.47 c
+22.317 -0.559 22.391 -0.625 22.471 -0.661 c
+22.549 -0.702 22.626 -0.721 22.707 -0.721 c
+22.803 -0.721 22.89 -0.698 22.971 -0.646 c
+23.059 -0.599 23.125 -0.529 23.177 -0.441 c
+23.235 -0.345 23.28 -0.22 23.31 -0.073 c
+23.346 0.081 23.368 0.268 23.368 0.485 c
+23.368 0.875 23.31 1.168 23.192 1.367 c
+23.081 1.562 22.927 1.661 22.722 1.661 c
+22.641 1.661 22.564 1.639 22.486 1.602 c
+22.406 1.562 22.332 1.5 22.265 1.411 c
+22.196 1.323 22.137 1.198 22.089 1.043 c
+22.049 0.885 22.03 0.691 22.03 0.455 c
+26.061 2.219 m
+26.061 0.264 l
+26.061 0.125 26.069 0 26.091 -0.118 c
+26.109 -0.228 26.142 -0.32 26.194 -0.397 c
+26.242 -0.478 26.3 -0.54 26.371 -0.588 c
+26.437 -0.628 26.521 -0.646 26.62 -0.646 c
+26.709 -0.646 26.789 -0.628 26.87 -0.588 c
+26.959 -0.54 27.032 -0.47 27.09 -0.382 c
+27.15 -0.287 27.194 -0.176 27.223 -0.058 c
+27.26 0.066 27.281 0.206 27.281 0.353 c
+27.281 2.219 l
+28.178 2.219 l
+28.178 -0.485 l
+28.178 -0.721 l
+28.185 -0.801 28.193 -0.879 28.193 -0.956 c
+28.193 -1.147 l
+28.201 -1.198 28.208 -1.234 28.208 -1.264 c
+27.355 -1.264 l
+27.344 -1.234 27.333 -1.198 27.326 -1.147 c
+27.326 -0.956 l
+27.326 -0.889 27.318 -0.819 27.312 -0.75 c
+27.312 -0.573 l
+27.296 -0.573 l
+27.179 -0.838 27.025 -1.029 26.841 -1.147 c
+26.664 -1.264 26.462 -1.323 26.238 -1.323 c
+26.032 -1.323 25.86 -1.286 25.724 -1.22 c
+25.584 -1.154 25.473 -1.058 25.386 -0.941 c
+25.305 -0.823 25.246 -0.687 25.209 -0.529 c
+25.18 -0.364 25.165 -0.187 25.165 0 c
+25.165 2.219 l
+h
+32.342 -0.25 m
+32.342 -0.419 32.301 -0.569 32.224 -0.706 c
+32.154 -0.834 32.052 -0.948 31.916 -1.043 c
+31.787 -1.132 31.625 -1.201 31.43 -1.249 c
+31.243 -1.297 31.027 -1.323 30.784 -1.323 c
+30.556 -1.323 30.358 -1.309 30.181 -1.278 c
+30.005 -1.249 29.847 -1.201 29.71 -1.132 c
+29.571 -1.055 29.461 -0.956 29.373 -0.838 c
+29.284 -0.721 29.215 -0.573 29.167 -0.397 c
+29.976 -0.279 l
+29.994 -0.378 30.023 -0.455 30.063 -0.515 c
+30.111 -0.573 30.17 -0.617 30.24 -0.646 c
+30.306 -0.676 30.387 -0.702 30.475 -0.721 c
+30.564 -0.731 30.666 -0.735 30.784 -0.735 c
+30.88 -0.735 30.975 -0.731 31.063 -0.721 c
+31.152 -0.702 31.229 -0.676 31.298 -0.646 c
+31.364 -0.617 31.416 -0.58 31.445 -0.529 c
+31.482 -0.482 31.504 -0.419 31.504 -0.338 c
+31.504 -0.243 31.474 -0.169 31.416 -0.118 c
+31.364 -0.07 31.298 -0.029 31.21 0 c
+31.122 0.037 31.011 0.066 30.886 0.088 c
+30.769 0.118 30.637 0.147 30.489 0.177 c
+30.35 0.214 30.211 0.254 30.063 0.294 c
+29.924 0.342 29.799 0.405 29.681 0.485 c
+29.571 0.563 29.483 0.661 29.417 0.779 c
+29.347 0.897 29.313 1.047 29.313 1.235 c
+29.313 1.389 29.344 1.532 29.402 1.661 c
+29.469 1.797 29.564 1.911 29.681 1.999 c
+29.806 2.088 29.964 2.153 30.152 2.205 c
+30.335 2.253 30.549 2.278 30.784 2.278 c
+30.967 2.278 31.144 2.256 31.313 2.219 c
+31.478 2.19 31.625 2.135 31.754 2.058 c
+31.879 1.988 31.989 1.889 32.077 1.764 c
+32.166 1.646 32.224 1.503 32.253 1.338 c
+31.46 1.264 l
+31.438 1.342 31.408 1.404 31.372 1.455 c
+31.331 1.514 31.283 1.558 31.225 1.588 c
+31.173 1.625 31.111 1.65 31.034 1.661 c
+30.953 1.668 30.872 1.675 30.784 1.675 c
+30.567 1.675 30.406 1.646 30.298 1.588 c
+30.188 1.536 30.137 1.448 30.137 1.323 c
+30.137 1.242 30.155 1.18 30.196 1.132 c
+30.244 1.08 30.306 1.043 30.387 1.014 c
+30.475 0.985 30.57 0.956 30.681 0.926 c
+30.788 0.904 30.909 0.882 31.048 0.852 c
+31.202 0.823 31.36 0.783 31.519 0.735 c
+31.673 0.684 31.813 0.621 31.931 0.544 c
+32.048 0.463 32.143 0.36 32.224 0.235 c
+32.301 0.106 32.342 -0.055 32.342 -0.25 c
+34.202 1.514 m
+34.319 1.786 34.47 1.984 34.657 2.102 c
+34.84 2.219 35.061 2.278 35.318 2.278 c
+35.524 2.278 35.694 2.242 35.833 2.176 c
+35.98 2.105 36.091 2.014 36.17 1.897 c
+36.259 1.779 36.318 1.635 36.347 1.47 c
+36.384 1.301 36.406 1.124 36.406 0.941 c
+36.406 -1.264 l
+35.495 -1.264 l
+35.495 0.735 l
+35.495 0.871 35.484 0.992 35.465 1.103 c
+35.455 1.209 35.428 1.297 35.392 1.367 c
+35.351 1.444 35.293 1.503 35.216 1.544 c
+35.146 1.58 35.054 1.602 34.936 1.602 c
+34.826 1.602 34.73 1.577 34.643 1.529 c
+34.554 1.477 34.473 1.411 34.408 1.323 c
+34.348 1.235 34.297 1.124 34.26 1 c
+34.231 0.882 34.216 0.75 34.216 0.603 c
+34.216 -1.264 l
+33.305 -1.264 l
+33.305 3.513 l
+34.216 3.513 l
+34.216 2.205 l
+34.216 2.135 34.209 2.065 34.202 1.999 c
+34.202 1.793 l
+34.202 1.735 34.194 1.679 34.186 1.631 c
+34.186 1.514 l
+h
+42.013 0.838 1.867 -0.794 re
+42.013 0.044 m
+46.368 2.219 m
+46.368 0.264 l
+46.368 0.125 46.376 0 46.398 -0.118 c
+46.416 -0.228 46.449 -0.32 46.501 -0.397 c
+46.549 -0.478 46.607 -0.54 46.677 -0.588 c
+46.743 -0.628 46.828 -0.646 46.927 -0.646 c
+47.015 -0.646 47.096 -0.628 47.177 -0.588 c
+47.265 -0.54 47.339 -0.47 47.397 -0.382 c
+47.457 -0.287 47.5 -0.176 47.53 -0.058 c
+47.567 0.066 47.588 0.206 47.588 0.353 c
+47.588 2.219 l
+48.485 2.219 l
+48.485 -0.485 l
+48.485 -0.721 l
+48.492 -0.801 48.5 -0.879 48.5 -0.956 c
+48.5 -1.147 l
+48.507 -1.198 48.515 -1.234 48.515 -1.264 c
+47.662 -1.264 l
+47.651 -1.234 47.64 -1.198 47.632 -1.147 c
+47.632 -0.956 l
+47.632 -0.889 47.625 -0.819 47.617 -0.75 c
+47.617 -0.573 l
+47.603 -0.573 l
+47.486 -0.838 47.331 -1.029 47.147 -1.147 c
+46.971 -1.264 46.769 -1.323 46.545 -1.323 c
+46.339 -1.323 46.167 -1.286 46.03 -1.22 c
+45.891 -1.154 45.78 -1.058 45.693 -0.941 c
+45.612 -0.823 45.552 -0.687 45.516 -0.529 c
+45.487 -0.364 45.472 -0.187 45.472 0 c
+45.472 2.219 l
+h
+54.361 -2.631 m
+54.361 3.513 l
+56.286 3.513 l
+56.286 2.896 l
+55.214 2.896 l
+55.214 -2.014 l
+56.286 -2.014 l
+56.286 -2.631 l
+h
+60.685 1.47 m
+60.586 1.477 60.483 1.488 60.377 1.5 c
+60.267 1.517 60.145 1.529 60.009 1.529 c
+59.833 1.529 59.675 1.488 59.538 1.411 c
+59.399 1.342 59.282 1.242 59.186 1.118 c
+59.098 0.989 59.028 0.842 58.981 0.676 c
+58.94 0.507 58.921 0.331 58.921 0.147 c
+58.921 -1.264 l
+58.025 -1.264 l
+58.025 0.985 l
+58.025 1.11 58.014 1.235 57.996 1.353 c
+57.984 1.477 57.969 1.595 57.951 1.706 c
+57.94 1.823 57.926 1.918 57.907 1.999 c
+57.886 2.088 57.867 2.161 57.848 2.219 c
+58.73 2.219 l
+58.738 2.168 58.748 2.117 58.76 2.058 c
+58.778 1.999 58.792 1.933 58.804 1.866 c
+58.823 1.808 58.837 1.742 58.848 1.675 c
+58.855 1.606 58.867 1.544 58.877 1.484 c
+58.892 1.484 l
+58.929 1.602 58.981 1.708 59.039 1.808 c
+59.105 1.903 59.186 1.988 59.274 2.058 c
+59.363 2.124 59.465 2.179 59.583 2.219 c
+59.708 2.256 59.855 2.278 60.024 2.278 c
+60.149 2.278 60.267 2.271 60.377 2.263 c
+60.494 2.253 60.597 2.238 60.685 2.219 c
+h
+63.291 -1.323 m
+63.033 -1.323 62.806 -1.286 62.6 -1.22 c
+62.395 -1.143 62.218 -1.029 62.071 -0.881 c
+61.924 -0.727 61.806 -0.536 61.718 -0.309 c
+61.637 -0.085 61.601 0.18 61.601 0.485 c
+61.601 0.816 61.645 1.095 61.732 1.323 c
+61.828 1.558 61.957 1.742 62.115 1.881 c
+62.28 2.018 62.468 2.117 62.673 2.176 c
+62.879 2.242 63.089 2.278 63.305 2.278 c
+63.577 2.278 63.812 2.227 64.011 2.132 c
+64.217 2.043 64.382 1.911 64.511 1.735 c
+64.647 1.565 64.746 1.359 64.805 1.118 c
+64.871 0.882 64.907 0.617 64.907 0.324 c
+64.907 0.309 l
+62.541 0.309 l
+62.541 0.162 62.555 0.022 62.586 -0.103 c
+62.622 -0.231 62.677 -0.345 62.746 -0.441 c
+62.813 -0.529 62.898 -0.599 62.997 -0.646 c
+63.093 -0.698 63.206 -0.721 63.335 -0.721 c
+63.49 -0.721 63.629 -0.687 63.746 -0.617 c
+63.872 -0.551 63.96 -0.449 64.011 -0.309 c
+64.849 -0.382 l
+64.82 -0.482 64.764 -0.588 64.687 -0.706 c
+64.606 -0.816 64.504 -0.919 64.379 -1.014 c
+64.261 -1.103 64.107 -1.176 63.922 -1.234 c
+63.746 -1.294 63.533 -1.323 63.291 -1.323 c
+63.291 1.706 m
+63.203 1.706 63.114 1.691 63.026 1.661 c
+62.938 1.631 62.857 1.58 62.791 1.514 c
+62.721 1.444 62.663 1.356 62.615 1.249 c
+62.574 1.139 62.555 1.014 62.555 0.867 c
+64.026 0.867 l
+64.026 1.003 64 1.124 63.952 1.235 c
+63.912 1.342 63.856 1.43 63.791 1.5 c
+63.731 1.565 63.658 1.617 63.57 1.646 c
+63.482 1.683 63.386 1.706 63.291 1.706 c
+66.954 -1.264 m
+66.954 0.852 l
+66.954 1.018 66.947 1.154 66.94 1.264 c
+66.929 1.371 66.91 1.455 66.881 1.514 c
+66.859 1.58 66.829 1.631 66.792 1.661 c
+66.763 1.691 66.723 1.706 66.675 1.706 c
+66.617 1.706 66.561 1.675 66.513 1.617 c
+66.473 1.565 66.44 1.492 66.411 1.396 c
+66.381 1.309 66.355 1.195 66.337 1.058 c
+66.326 0.919 66.322 0.768 66.322 0.603 c
+66.322 -1.264 l
+65.572 -1.264 l
+65.572 1.47 l
+65.572 1.706 l
+65.572 1.926 l
+65.572 2.003 65.566 2.065 65.558 2.117 c
+65.558 2.219 l
+66.235 2.219 l
+66.235 2.132 l
+66.235 1.984 l
+66.241 1.926 66.249 1.866 66.249 1.808 c
+66.249 1.646 l
+66.264 1.646 l
+66.282 1.735 66.312 1.812 66.352 1.881 c
+66.389 1.959 66.432 2.028 66.484 2.088 c
+66.543 2.146 66.609 2.19 66.69 2.219 c
+66.767 2.256 66.856 2.278 66.954 2.278 c
+67.138 2.278 67.278 2.223 67.366 2.117 c
+67.461 2.018 67.531 1.86 67.571 1.646 c
+67.586 1.646 l
+67.623 1.742 67.664 1.83 67.704 1.911 c
+67.752 1.988 67.807 2.051 67.866 2.102 c
+67.924 2.161 67.991 2.205 68.072 2.234 c
+68.149 2.263 68.237 2.278 68.336 2.278 c
+68.472 2.278 68.586 2.253 68.674 2.205 c
+68.762 2.153 68.828 2.08 68.88 1.984 c
+68.939 1.885 68.976 1.756 68.998 1.602 c
+69.027 1.455 69.042 1.272 69.042 1.058 c
+69.042 -1.264 l
+68.321 -1.264 l
+68.321 0.852 l
+68.321 1.018 68.314 1.154 68.307 1.264 c
+68.296 1.371 68.277 1.455 68.248 1.514 c
+68.226 1.58 68.196 1.631 68.159 1.661 c
+68.13 1.691 68.09 1.706 68.042 1.706 c
+67.924 1.706 67.829 1.617 67.763 1.44 c
+67.704 1.272 67.675 1.014 67.675 0.661 c
+67.675 -1.264 l
+h
+73.058 0.485 m
+73.058 0.21 73.021 -0.04 72.955 -0.264 c
+72.886 -0.482 72.782 -0.669 72.647 -0.823 c
+72.507 -0.981 72.331 -1.103 72.117 -1.191 c
+71.901 -1.278 71.647 -1.323 71.353 -1.323 c
+71.078 -1.323 70.831 -1.278 70.618 -1.191 c
+70.412 -1.103 70.239 -0.981 70.104 -0.823 c
+69.964 -0.669 69.861 -0.482 69.795 -0.264 c
+69.725 -0.04 69.692 0.21 69.692 0.485 c
+69.692 0.738 69.722 0.974 69.78 1.191 c
+69.846 1.415 69.95 1.606 70.089 1.764 c
+70.225 1.929 70.401 2.058 70.618 2.146 c
+70.831 2.234 71.089 2.278 71.382 2.278 c
+71.695 2.278 71.956 2.234 72.161 2.146 c
+72.375 2.058 72.547 1.929 72.676 1.764 c
+72.812 1.606 72.911 1.415 72.97 1.191 c
+73.029 0.974 73.058 0.738 73.058 0.485 c
+72.103 0.485 m
+72.103 0.691 72.088 0.867 72.059 1.014 c
+72.037 1.161 71.999 1.282 71.941 1.382 c
+71.882 1.477 71.809 1.548 71.721 1.588 c
+71.633 1.635 71.523 1.661 71.397 1.661 c
+71.133 1.661 70.941 1.562 70.824 1.367 c
+70.706 1.18 70.648 0.885 70.648 0.485 c
+70.648 0.062 70.706 -0.243 70.824 -0.426 c
+70.941 -0.613 71.118 -0.706 71.353 -0.706 c
+71.478 -0.706 71.592 -0.687 71.691 -0.646 c
+71.787 -0.599 71.868 -0.526 71.926 -0.426 c
+71.993 -0.331 72.037 -0.206 72.059 -0.058 c
+72.088 0.088 72.103 0.268 72.103 0.485 c
+74.521 1.602 m
+73.977 1.602 l
+73.977 2.219 l
+74.565 2.219 l
+74.844 3.117 l
+75.417 3.117 l
+75.417 2.219 l
+76.652 2.219 l
+76.652 1.602 l
+75.417 1.602 l
+75.417 -0.103 l
+75.417 -0.324 l
+75.425 -0.393 75.446 -0.455 75.476 -0.515 c
+75.513 -0.566 75.568 -0.61 75.638 -0.646 c
+75.715 -0.676 75.829 -0.69 75.976 -0.69 c
+76.112 -0.69 76.248 -0.687 76.387 -0.676 c
+76.523 -0.658 76.656 -0.632 76.784 -0.603 c
+76.784 -1.205 l
+76.703 -1.216 76.626 -1.231 76.549 -1.249 c
+76.468 -1.261 76.391 -1.268 76.314 -1.278 c
+76.233 -1.286 76.145 -1.294 76.049 -1.294 c
+75.961 -1.301 75.862 -1.309 75.756 -1.309 c
+75.568 -1.309 75.407 -1.294 75.27 -1.264 c
+75.142 -1.228 75.028 -1.183 74.933 -1.132 c
+74.844 -1.084 74.771 -1.025 74.712 -0.956 c
+74.653 -0.879 74.609 -0.801 74.58 -0.721 c
+74.55 -0.632 74.528 -0.544 74.521 -0.455 c
+74.509 -0.36 74.506 -0.264 74.506 -0.176 c
+h
+79.537 -1.323 m
+79.28 -1.323 79.052 -1.286 78.846 -1.22 c
+78.64 -1.143 78.464 -1.029 78.317 -0.881 c
+78.17 -0.727 78.052 -0.536 77.964 -0.309 c
+77.883 -0.085 77.846 0.18 77.846 0.485 c
+77.846 0.816 77.89 1.095 77.979 1.323 c
+78.074 1.558 78.203 1.742 78.361 1.881 c
+78.526 2.018 78.714 2.117 78.92 2.176 c
+79.126 2.242 79.334 2.278 79.552 2.278 c
+79.824 2.278 80.059 2.227 80.257 2.132 c
+80.463 2.043 80.628 1.911 80.757 1.735 c
+80.893 1.565 80.992 1.359 81.051 1.118 c
+81.117 0.882 81.154 0.617 81.154 0.324 c
+81.154 0.309 l
+78.787 0.309 l
+78.787 0.162 78.802 0.022 78.831 -0.103 c
+78.868 -0.231 78.923 -0.345 78.993 -0.441 c
+79.059 -0.529 79.143 -0.599 79.243 -0.646 c
+79.338 -0.698 79.452 -0.721 79.581 -0.721 c
+79.735 -0.721 79.875 -0.687 79.993 -0.617 c
+80.117 -0.551 80.206 -0.449 80.257 -0.309 c
+81.095 -0.382 l
+81.065 -0.482 81.011 -0.588 80.934 -0.706 c
+80.853 -0.816 80.749 -0.919 80.624 -1.014 c
+80.507 -1.103 80.352 -1.176 80.169 -1.234 c
+79.993 -1.294 79.779 -1.323 79.537 -1.323 c
+79.537 1.706 m
+79.448 1.706 79.361 1.691 79.272 1.661 c
+79.184 1.631 79.103 1.58 79.037 1.514 c
+78.968 1.444 78.908 1.356 78.86 1.249 c
+78.82 1.139 78.802 1.014 78.802 0.867 c
+80.271 0.867 l
+80.271 1.003 80.246 1.124 80.198 1.235 c
+80.158 1.342 80.103 1.43 80.036 1.5 c
+79.978 1.565 79.905 1.617 79.816 1.646 c
+79.728 1.683 79.633 1.706 79.537 1.706 c
+82.407 -2.631 m
+82.407 -2.014 l
+83.48 -2.014 l
+83.48 2.896 l
+82.407 2.896 l
+82.407 3.513 l
+84.333 3.513 l
+84.333 -2.631 l
+h
+90.91 -2.631 m
+90.91 3.513 l
+92.836 3.513 l
+92.836 2.896 l
+91.763 2.896 l
+91.763 -2.014 l
+92.836 -2.014 l
+92.836 -2.631 l
+h
+94.224 -1.264 m
+94.224 -0.97 l
+94.232 -0.834 94.24 -0.676 94.24 -0.5 c
+94.24 3.513 l
+95.151 3.513 l
+95.151 2.234 l
+95.151 2.072 l
+95.151 1.897 l
+95.151 1.845 95.144 1.801 95.136 1.764 c
+95.136 1.675 l
+95.151 1.675 l
+95.199 1.783 95.261 1.874 95.342 1.955 c
+95.419 2.032 95.504 2.095 95.592 2.146 c
+95.68 2.194 95.772 2.227 95.871 2.249 c
+95.967 2.267 96.065 2.278 96.165 2.278 c
+96.378 2.278 96.566 2.234 96.724 2.146 c
+96.878 2.058 97.006 1.929 97.106 1.764 c
+97.212 1.606 97.289 1.415 97.341 1.191 c
+97.389 0.974 97.415 0.735 97.415 0.47 c
+97.415 0.214 97.385 -0.025 97.326 -0.25 c
+97.268 -0.467 97.183 -0.658 97.077 -0.823 c
+96.967 -0.981 96.834 -1.103 96.68 -1.191 c
+96.522 -1.278 96.341 -1.323 96.136 -1.323 c
+96.036 -1.323 95.938 -1.312 95.842 -1.294 c
+95.753 -1.272 95.666 -1.242 95.577 -1.191 c
+95.489 -1.132 95.408 -1.066 95.342 -0.985 c
+95.272 -0.908 95.209 -0.808 95.151 -0.69 c
+95.136 -0.69 l
+95.136 -0.852 l
+95.136 -0.912 95.128 -0.97 95.122 -1.029 c
+95.122 -1.08 95.114 -1.128 95.107 -1.176 c
+95.107 -1.216 95.099 -1.246 95.092 -1.264 c
+h
+95.136 0.5 m
+95.136 0.264 95.155 0.066 95.195 -0.088 c
+95.242 -0.246 95.302 -0.368 95.371 -0.455 c
+95.437 -0.544 95.511 -0.61 95.592 -0.646 c
+95.669 -0.687 95.747 -0.706 95.827 -0.706 c
+96.033 -0.706 96.187 -0.61 96.298 -0.411 c
+96.415 -0.216 96.474 0.077 96.474 0.47 c
+96.474 0.684 96.452 0.867 96.415 1.014 c
+96.385 1.168 96.341 1.294 96.283 1.382 c
+96.231 1.477 96.165 1.55 96.077 1.602 c
+95.996 1.65 95.907 1.675 95.812 1.675 c
+95.732 1.675 95.654 1.654 95.577 1.617 c
+95.496 1.577 95.423 1.514 95.357 1.426 c
+95.298 1.338 95.242 1.213 95.195 1.058 c
+95.155 0.912 95.136 0.724 95.136 0.5 c
+101.299 1.47 m
+101.2 1.477 101.097 1.488 100.99 1.5 c
+100.88 1.517 100.759 1.529 100.622 1.529 c
+100.446 1.529 100.288 1.488 100.152 1.411 c
+100.013 1.342 99.895 1.242 99.799 1.118 c
+99.711 0.989 99.641 0.842 99.593 0.676 c
+99.554 0.507 99.535 0.331 99.535 0.147 c
+99.535 -1.264 l
+98.638 -1.264 l
+98.638 0.985 l
+98.638 1.11 98.627 1.235 98.609 1.353 c
+98.598 1.477 98.583 1.595 98.565 1.706 c
+98.554 1.823 98.539 1.918 98.521 1.999 c
+98.498 2.088 98.48 2.161 98.462 2.219 c
+99.344 2.219 l
+99.351 2.168 99.362 2.117 99.373 2.058 c
+99.392 1.999 99.406 1.933 99.417 1.866 c
+99.435 1.808 99.45 1.742 99.462 1.675 c
+99.469 1.606 99.479 1.544 99.491 1.484 c
+99.506 1.484 l
+99.542 1.602 99.593 1.708 99.653 1.808 c
+99.718 1.903 99.799 1.988 99.888 2.058 c
+99.976 2.124 100.079 2.179 100.196 2.219 c
+100.321 2.256 100.468 2.278 100.637 2.278 c
+100.763 2.278 100.88 2.271 100.99 2.263 c
+101.108 2.253 101.21 2.238 101.299 2.219 c
+h
+103.302 -1.323 m
+103.132 -1.323 102.982 -1.301 102.846 -1.264 c
+102.717 -1.216 102.604 -1.147 102.508 -1.058 c
+102.419 -0.97 102.35 -0.864 102.302 -0.735 c
+102.251 -0.599 102.228 -0.449 102.228 -0.279 c
+102.228 -0.073 102.261 0.096 102.332 0.235 c
+102.398 0.382 102.493 0.492 102.611 0.573 c
+102.735 0.661 102.879 0.724 103.037 0.765 c
+103.202 0.802 103.379 0.827 103.566 0.838 c
+104.287 0.852 l
+104.287 1.029 l
+104.287 1.147 104.275 1.249 104.257 1.338 c
+104.235 1.426 104.202 1.492 104.154 1.544 c
+104.114 1.602 104.066 1.639 104.007 1.661 c
+103.948 1.679 103.882 1.691 103.816 1.691 c
+103.747 1.691 103.684 1.679 103.625 1.661 c
+103.574 1.65 103.526 1.625 103.478 1.588 c
+103.437 1.558 103.404 1.507 103.375 1.44 c
+103.353 1.382 103.338 1.301 103.331 1.205 c
+102.39 1.249 l
+102.419 1.396 102.463 1.532 102.523 1.661 c
+102.589 1.786 102.685 1.897 102.802 1.984 c
+102.92 2.08 103.059 2.153 103.228 2.205 c
+103.404 2.253 103.61 2.278 103.845 2.278 c
+104.287 2.278 104.617 2.168 104.844 1.955 c
+105.08 1.749 105.198 1.44 105.198 1.029 c
+105.198 -0.235 l
+105.198 -0.455 l
+105.205 -0.515 105.22 -0.569 105.241 -0.617 c
+105.26 -0.658 105.289 -0.69 105.33 -0.721 c
+105.367 -0.742 105.418 -0.75 105.477 -0.75 c
+105.543 -0.75 105.613 -0.746 105.683 -0.735 c
+105.683 -1.22 l
+105.624 -1.231 105.569 -1.242 105.521 -1.249 c
+105.48 -1.261 105.44 -1.268 105.403 -1.278 c
+105.363 -1.286 105.319 -1.294 105.272 -1.294 c
+105.22 -1.301 105.161 -1.309 105.095 -1.309 c
+104.867 -1.309 104.701 -1.257 104.595 -1.147 c
+104.485 -1.029 104.422 -0.864 104.404 -0.646 c
+104.389 -0.646 l
+104.32 -0.757 104.25 -0.852 104.183 -0.941 c
+104.114 -1.022 104.036 -1.087 103.948 -1.147 c
+103.86 -1.205 103.761 -1.249 103.654 -1.278 c
+103.555 -1.309 103.437 -1.323 103.302 -1.323 c
+104.287 0.353 m
+103.86 0.338 l
+103.761 0.338 103.669 0.331 103.581 0.324 c
+103.5 0.312 103.433 0.287 103.375 0.25 c
+103.317 0.21 103.265 0.151 103.228 0.073 c
+103.188 0.004 103.169 -0.088 103.169 -0.206 c
+103.169 -0.374 103.202 -0.496 103.272 -0.573 c
+103.338 -0.654 103.437 -0.69 103.566 -0.69 c
+103.672 -0.69 103.772 -0.669 103.86 -0.617 c
+103.955 -0.569 104.036 -0.507 104.096 -0.426 c
+104.161 -0.349 104.213 -0.261 104.242 -0.162 c
+104.272 -0.055 104.287 0.059 104.287 0.177 c
+h
+108.597 -1.264 m
+108.597 0.721 l
+108.597 1.022 108.553 1.242 108.464 1.382 c
+108.384 1.529 108.248 1.602 108.053 1.602 c
+107.942 1.602 107.84 1.577 107.745 1.529 c
+107.656 1.477 107.575 1.411 107.51 1.323 c
+107.45 1.235 107.399 1.124 107.362 1 c
+107.333 0.882 107.318 0.75 107.318 0.603 c
+107.318 -1.264 l
+106.407 -1.264 l
+106.407 1.44 l
+106.407 1.661 l
+106.407 1.749 106.399 1.826 106.392 1.897 c
+106.392 2.088 l
+106.392 2.219 l
+107.244 2.219 l
+107.252 2.19 107.259 2.146 107.259 2.088 c
+107.259 1.897 l
+107.267 1.826 107.274 1.756 107.274 1.691 c
+107.281 1.621 107.288 1.565 107.288 1.529 c
+107.304 1.529 l
+107.421 1.793 107.572 1.984 107.759 2.102 c
+107.942 2.219 108.163 2.278 108.42 2.278 c
+108.605 2.278 108.765 2.249 108.906 2.19 c
+109.041 2.132 109.156 2.043 109.243 1.926 c
+109.332 1.808 109.394 1.665 109.434 1.5 c
+109.482 1.342 109.509 1.154 109.509 0.941 c
+109.509 -1.264 l
+h
+112.025 -1.323 m
+111.739 -1.323 111.496 -1.282 111.29 -1.205 c
+111.084 -1.117 110.912 -0.996 110.776 -0.838 c
+110.637 -0.684 110.533 -0.496 110.467 -0.279 c
+110.398 -0.055 110.365 0.191 110.365 0.455 c
+110.365 0.75 110.398 1.007 110.467 1.235 c
+110.544 1.459 110.651 1.646 110.791 1.793 c
+110.938 1.947 111.114 2.065 111.32 2.146 c
+111.526 2.234 111.761 2.278 112.025 2.278 c
+112.25 2.278 112.451 2.249 112.628 2.19 c
+112.804 2.132 112.956 2.047 113.083 1.941 c
+113.209 1.841 113.311 1.72 113.392 1.573 c
+113.469 1.433 113.525 1.282 113.554 1.118 c
+112.643 1.073 l
+112.613 1.249 112.543 1.389 112.437 1.5 c
+112.337 1.606 112.194 1.661 112.011 1.661 c
+111.765 1.661 111.588 1.558 111.481 1.353 c
+111.371 1.154 111.32 0.867 111.32 0.485 c
+111.32 -0.309 111.555 -0.706 112.025 -0.706 c
+112.191 -0.706 112.334 -0.654 112.451 -0.544 c
+112.569 -0.437 112.643 -0.276 112.672 -0.058 c
+113.584 -0.103 l
+113.554 -0.272 113.499 -0.426 113.422 -0.573 c
+113.352 -0.721 113.249 -0.852 113.114 -0.97 c
+112.985 -1.08 112.827 -1.168 112.643 -1.234 c
+112.466 -1.294 112.26 -1.323 112.025 -1.323 c
+115.428 1.514 m
+115.546 1.786 115.697 1.984 115.884 2.102 c
+116.067 2.219 116.289 2.278 116.545 2.278 c
+116.751 2.278 116.92 2.242 117.06 2.176 c
+117.207 2.105 117.317 2.014 117.398 1.897 c
+117.486 1.779 117.544 1.635 117.575 1.47 c
+117.611 1.301 117.633 1.124 117.633 0.941 c
+117.633 -1.264 l
+116.722 -1.264 l
+116.722 0.735 l
+116.722 0.871 116.711 0.992 116.692 1.103 c
+116.682 1.209 116.655 1.297 116.619 1.367 c
+116.578 1.444 116.52 1.503 116.443 1.544 c
+116.372 1.58 116.281 1.602 116.163 1.602 c
+116.053 1.602 115.957 1.577 115.869 1.529 c
+115.781 1.477 115.701 1.411 115.634 1.323 c
+115.575 1.235 115.524 1.124 115.487 1 c
+115.458 0.882 115.443 0.75 115.443 0.603 c
+115.443 -1.264 l
+114.531 -1.264 l
+114.531 3.513 l
+115.443 3.513 l
+115.443 2.205 l
+115.443 2.135 115.435 2.065 115.428 1.999 c
+115.428 1.793 l
+115.428 1.735 115.421 1.679 115.414 1.631 c
+115.414 1.514 l
+h
+118.959 -2.631 m
+118.959 -2.014 l
+120.033 -2.014 l
+120.033 2.896 l
+118.959 2.896 l
+118.959 3.513 l
+120.885 3.513 l
+120.885 -2.631 l
+h
+f
+Q
+q 1 0 0 1 67.9872 143.6443 cm
+0 0 m
+0 -2.103 l
+-0.676 -2.103 l
+-0.676 3.248 l
+1.029 3.248 l
+1.529 3.248 1.918 3.094 2.205 2.792 c
+2.488 2.499 2.631 2.105 2.631 1.616 c
+2.631 1.095 2.492 0.698 2.219 0.426 c
+1.955 0.151 1.577 0.007 1.087 0 c
+h
+0 0.573 m
+1.029 0.573 l
+1.33 0.573 1.562 0.661 1.72 0.837 c
+1.874 1.014 1.955 1.267 1.955 1.602 c
+1.955 1.925 1.87 2.183 1.706 2.381 c
+1.548 2.576 1.326 2.675 1.043 2.675 c
+0 2.675 l
+h
+5.438 -1.75 m
+5.222 -2.037 4.91 -2.176 4.498 -2.176 c
+4.135 -2.176 3.859 -2.055 3.675 -1.808 c
+3.499 -1.555 3.403 -1.191 3.395 -0.721 c
+3.395 1.881 l
+4.042 1.881 l
+4.042 -0.662 l
+4.042 -1.291 4.226 -1.603 4.601 -1.603 c
+5.002 -1.603 5.277 -1.426 5.424 -1.073 c
+5.424 1.881 l
+6.071 1.881 l
+6.071 -2.103 l
+5.453 -2.103 l
+h
+8.996 -1.088 m
+8.996 -0.941 8.941 -0.82 8.834 -0.721 c
+8.724 -0.626 8.518 -0.508 8.217 -0.368 c
+7.871 -0.221 7.628 -0.1 7.482 0 c
+7.335 0.106 7.225 0.224 7.158 0.353 c
+7.088 0.477 7.056 0.635 7.056 0.823 c
+7.056 1.146 7.173 1.414 7.408 1.631 c
+7.644 1.844 7.945 1.955 8.32 1.955 c
+8.702 1.955 9.01 1.841 9.246 1.616 c
+9.481 1.389 9.598 1.102 9.598 0.749 c
+8.952 0.749 l
+8.952 0.926 8.893 1.076 8.775 1.205 c
+8.658 1.33 8.503 1.396 8.32 1.396 c
+8.121 1.396 7.971 1.341 7.864 1.234 c
+7.754 1.135 7.703 1.003 7.703 0.837 c
+7.703 0.708 7.739 0.602 7.82 0.514 c
+7.898 0.433 8.088 0.33 8.393 0.205 c
+8.871 0.018 9.201 -0.169 9.378 -0.353 c
+9.554 -0.53 9.643 -0.757 9.643 -1.029 c
+9.643 -1.382 9.517 -1.661 9.275 -1.867 c
+9.04 -2.073 8.724 -2.176 8.334 -2.176 c
+7.912 -2.176 7.574 -2.058 7.32 -1.823 c
+7.063 -1.58 6.938 -1.276 6.938 -0.912 c
+7.585 -0.912 l
+7.592 -1.139 7.662 -1.316 7.79 -1.441 c
+7.915 -1.559 8.099 -1.617 8.334 -1.617 c
+8.548 -1.617 8.709 -1.569 8.819 -1.47 c
+8.937 -1.374 8.996 -1.246 8.996 -1.088 c
+11.127 1.469 m
+11.381 1.793 11.701 1.955 12.083 1.955 c
+12.788 1.955 13.145 1.484 13.156 0.544 c
+13.156 -2.103 l
+12.509 -2.103 l
+12.509 0.514 l
+12.509 0.826 12.454 1.047 12.347 1.176 c
+12.237 1.3 12.083 1.367 11.877 1.367 c
+11.719 1.367 11.572 1.311 11.436 1.205 c
+11.308 1.095 11.204 0.959 11.127 0.793 c
+11.127 -2.103 l
+10.481 -2.103 l
+10.481 3.542 l
+11.127 3.542 l
+h
+16.536 -2.103 -0.646 5.644 re
+17.419 0.073 m
+17.419 0.65 17.554 1.105 17.83 1.44 c
+18.113 1.782 18.485 1.955 18.947 1.955 c
+19.407 1.955 19.774 1.786 20.05 1.454 c
+20.332 1.132 20.48 0.683 20.49 0.118 c
+20.49 -0.309 l
+20.49 -0.879 20.347 -1.334 20.064 -1.676 c
+19.788 -2.01 19.422 -2.176 18.962 -2.176 c
+18.499 -2.176 18.128 -2.014 17.845 -1.691 c
+17.569 -1.36 17.426 -0.919 17.419 -0.368 c
+h
+18.065 -0.309 m
+18.065 -0.713 18.142 -1.029 18.3 -1.264 c
+18.466 -1.5 18.686 -1.617 18.962 -1.617 c
+19.528 -1.617 19.821 -1.206 19.844 -0.383 c
+19.844 0.073 l
+19.844 0.473 19.759 0.793 19.594 1.028 c
+19.436 1.271 19.219 1.396 18.947 1.396 c
+18.682 1.396 18.466 1.271 18.3 1.028 c
+18.142 0.793 18.065 0.473 18.065 0.073 c
+h
+22.71 -1.617 m
+22.923 -1.617 23.096 -1.555 23.225 -1.426 c
+23.36 -1.291 23.434 -1.099 23.445 -0.853 c
+24.062 -0.853 l
+24.041 -1.235 23.904 -1.555 23.651 -1.808 c
+23.393 -2.055 23.081 -2.176 22.71 -2.176 c
+22.217 -2.176 21.843 -2.025 21.579 -1.721 c
+21.321 -1.408 21.196 -0.941 21.196 -0.324 c
+21.196 0.118 l
+21.196 0.712 21.321 1.168 21.579 1.484 c
+21.843 1.797 22.217 1.955 22.71 1.955 c
+23.111 1.955 23.43 1.822 23.665 1.558 c
+23.908 1.3 24.041 0.955 24.062 0.514 c
+23.445 0.514 l
+23.423 0.808 23.349 1.028 23.225 1.176 c
+23.107 1.323 22.934 1.396 22.71 1.396 c
+22.416 1.396 22.2 1.296 22.063 1.102 c
+21.924 0.914 21.851 0.606 21.843 0.176 c
+21.843 -0.339 l
+21.843 -0.809 21.909 -1.143 22.049 -1.338 c
+22.196 -1.526 22.416 -1.617 22.71 -1.617 c
+26.855 -2.103 m
+26.815 -2.014 26.789 -1.867 26.782 -1.661 c
+26.547 -2.007 26.252 -2.176 25.9 -2.176 c
+25.536 -2.176 25.253 -2.08 25.047 -1.881 c
+24.849 -1.676 24.754 -1.389 24.754 -1.015 c
+24.754 -0.614 24.889 -0.294 25.165 -0.059 c
+25.437 0.183 25.812 0.309 26.282 0.309 c
+26.767 0.309 l
+26.767 0.735 l
+26.767 0.97 26.712 1.135 26.605 1.234 c
+26.495 1.341 26.333 1.396 26.121 1.396 c
+25.922 1.396 25.76 1.337 25.635 1.219 c
+25.518 1.102 25.459 0.955 25.459 0.779 c
+24.812 0.779 l
+24.812 0.974 24.871 1.165 24.989 1.352 c
+25.113 1.535 25.275 1.683 25.473 1.793 c
+25.679 1.899 25.907 1.955 26.165 1.955 c
+26.565 1.955 26.87 1.851 27.075 1.646 c
+27.289 1.44 27.403 1.146 27.414 0.764 c
+27.414 -1.25 l
+27.414 -1.555 27.451 -1.819 27.532 -2.043 c
+27.532 -2.103 l
+h
+25.988 -1.588 m
+26.153 -1.588 26.304 -1.544 26.443 -1.455 c
+26.591 -1.368 26.697 -1.257 26.767 -1.118 c
+26.767 -0.177 l
+26.4 -0.177 l
+26.084 -0.177 25.841 -0.246 25.664 -0.383 c
+25.488 -0.511 25.4 -0.699 25.4 -0.941 c
+25.4 -1.169 25.444 -1.334 25.533 -1.441 c
+25.621 -1.54 25.772 -1.588 25.988 -1.588 c
+29.119 -2.103 -0.646 5.644 re
+34.734 -0.309 m
+34.734 -0.927 34.62 -1.393 34.396 -1.706 c
+34.179 -2.022 33.855 -2.176 33.425 -2.176 c
+33.003 -2.176 32.691 -1.996 32.485 -1.632 c
+32.456 -2.103 l
+31.852 -2.103 l
+31.852 3.542 l
+32.5 3.542 l
+32.5 1.44 l
+32.713 1.782 33.022 1.955 33.425 1.955 c
+33.855 1.955 34.179 1.797 34.396 1.484 c
+34.62 1.179 34.734 0.712 34.734 0.087 c
+h
+34.088 0.073 m
+34.088 0.544 34.017 0.874 33.882 1.072 c
+33.753 1.267 33.543 1.367 33.249 1.367 c
+32.915 1.367 32.665 1.183 32.5 0.823 c
+32.5 -1.058 l
+32.665 -1.422 32.918 -1.603 33.264 -1.603 c
+33.558 -1.603 33.768 -1.5 33.896 -1.294 c
+34.021 -1.088 34.088 -0.772 34.088 -0.339 c
+h
+37.218 1.263 m
+37.13 1.282 37.03 1.294 36.924 1.294 c
+36.59 1.294 36.355 1.109 36.218 0.749 c
+36.218 -2.103 l
+35.572 -2.103 l
+35.572 1.881 l
+36.204 1.881 l
+36.218 1.469 l
+36.395 1.793 36.637 1.955 36.953 1.955 c
+37.06 1.955 37.148 1.932 37.218 1.896 c
+h
+39.761 -2.103 m
+39.721 -2.014 39.695 -1.867 39.688 -1.661 c
+39.453 -2.007 39.158 -2.176 38.805 -2.176 c
+38.441 -2.176 38.159 -2.08 37.953 -1.881 c
+37.755 -1.676 37.659 -1.389 37.659 -1.015 c
+37.659 -0.614 37.795 -0.294 38.071 -0.059 c
+38.343 0.183 38.717 0.309 39.187 0.309 c
+39.673 0.309 l
+39.673 0.735 l
+39.673 0.97 39.617 1.135 39.511 1.234 c
+39.401 1.341 39.239 1.396 39.027 1.396 c
+38.828 1.396 38.666 1.337 38.541 1.219 c
+38.424 1.102 38.364 0.955 38.364 0.779 c
+37.718 0.779 l
+37.718 0.974 37.776 1.165 37.894 1.352 c
+38.019 1.535 38.181 1.683 38.379 1.793 c
+38.585 1.899 38.813 1.955 39.07 1.955 c
+39.471 1.955 39.775 1.851 39.981 1.646 c
+40.195 1.44 40.309 1.146 40.319 0.764 c
+40.319 -1.25 l
+40.319 -1.555 40.357 -1.819 40.438 -2.043 c
+40.438 -2.103 l
+h
+38.894 -1.588 m
+39.059 -1.588 39.21 -1.544 39.349 -1.455 c
+39.497 -1.368 39.603 -1.257 39.673 -1.118 c
+39.673 -0.177 l
+39.305 -0.177 l
+38.989 -0.177 38.747 -0.246 38.57 -0.383 c
+38.394 -0.511 38.306 -0.699 38.306 -0.941 c
+38.306 -1.169 38.35 -1.334 38.438 -1.441 c
+38.526 -1.54 38.677 -1.588 38.894 -1.588 c
+41.936 1.881 m
+41.951 1.44 l
+42.204 1.782 42.528 1.955 42.921 1.955 c
+43.627 1.955 43.983 1.484 43.995 0.544 c
+43.995 -2.103 l
+43.347 -2.103 l
+43.347 0.514 l
+43.347 0.826 43.293 1.047 43.186 1.176 c
+43.076 1.3 42.921 1.367 42.715 1.367 c
+42.557 1.367 42.41 1.311 42.275 1.205 c
+42.146 1.095 42.044 0.959 41.965 0.793 c
+41.965 -2.103 l
+41.319 -2.103 l
+41.319 1.881 l
+h
+46.346 -1.617 m
+46.559 -1.617 46.732 -1.555 46.861 -1.426 c
+46.997 -1.291 47.07 -1.099 47.081 -0.853 c
+47.698 -0.853 l
+47.677 -1.235 47.54 -1.555 47.287 -1.808 c
+47.029 -2.055 46.717 -2.176 46.346 -2.176 c
+45.854 -2.176 45.479 -2.025 45.215 -1.721 c
+44.957 -1.408 44.832 -0.941 44.832 -0.324 c
+44.832 0.118 l
+44.832 0.712 44.957 1.168 45.215 1.484 c
+45.479 1.797 45.854 1.955 46.346 1.955 c
+46.747 1.955 47.066 1.822 47.301 1.558 c
+47.544 1.3 47.677 0.955 47.698 0.514 c
+47.081 0.514 l
+47.06 0.808 46.985 1.028 46.861 1.176 c
+46.743 1.323 46.57 1.396 46.346 1.396 c
+46.052 1.396 45.836 1.296 45.699 1.102 c
+45.56 0.914 45.487 0.606 45.479 0.176 c
+45.479 -0.339 l
+45.479 -0.809 45.545 -1.143 45.685 -1.338 c
+45.832 -1.526 46.052 -1.617 46.346 -1.617 c
+49.095 1.469 m
+49.348 1.793 49.668 1.955 50.05 1.955 c
+50.756 1.955 51.112 1.484 51.124 0.544 c
+51.124 -2.103 l
+50.476 -2.103 l
+50.476 0.514 l
+50.476 0.826 50.422 1.047 50.315 1.176 c
+50.204 1.3 50.05 1.367 49.845 1.367 c
+49.687 1.367 49.539 1.311 49.404 1.205 c
+49.275 1.095 49.172 0.959 49.095 0.793 c
+49.095 -2.103 l
+48.448 -2.103 l
+48.448 3.542 l
+49.095 3.542 l
+h
+54.651 2.836 m
+54.651 1.881 l
+55.254 1.881 l
+55.254 1.352 l
+54.651 1.352 l
+54.651 -1.118 l
+54.651 -1.276 54.673 -1.393 54.725 -1.47 c
+54.784 -1.551 54.871 -1.588 54.989 -1.588 c
+55.077 -1.588 55.166 -1.573 55.254 -1.544 c
+55.254 -2.103 l
+55.107 -2.151 54.952 -2.176 54.798 -2.176 c
+54.541 -2.176 54.347 -2.084 54.21 -1.897 c
+54.071 -1.713 54.004 -1.452 54.004 -1.118 c
+54.004 1.352 l
+53.402 1.352 l
+53.402 1.881 l
+54.004 1.881 l
+54.004 2.836 l
+h
+55.812 0.073 m
+55.812 0.65 55.949 1.105 56.224 1.44 c
+56.507 1.782 56.878 1.955 57.341 1.955 c
+57.801 1.955 58.168 1.786 58.443 1.454 c
+58.727 1.132 58.873 0.683 58.885 0.118 c
+58.885 -0.309 l
+58.885 -0.879 58.742 -1.334 58.458 -1.676 c
+58.183 -2.01 57.815 -2.176 57.356 -2.176 c
+56.893 -2.176 56.522 -2.014 56.238 -1.691 c
+55.963 -1.36 55.82 -0.919 55.812 -0.368 c
+h
+56.459 -0.309 m
+56.459 -0.713 56.537 -1.029 56.695 -1.264 c
+56.86 -1.5 57.08 -1.617 57.356 -1.617 c
+57.921 -1.617 58.216 -1.206 58.237 -0.383 c
+58.237 0.073 l
+58.237 0.473 58.154 0.793 57.988 1.028 c
+57.83 1.271 57.613 1.396 57.341 1.396 c
+57.077 1.396 56.86 1.271 56.695 1.028 c
+56.537 0.793 56.459 0.473 56.459 0.073 c
+h
+f
+Q
+q 1 0 0 1 131.2811 144.5107 cm
+0 0 m
+-0.338 0.03 l
+-0.625 0.03 -0.816 -0.095 -0.911 -0.338 c
+-0.911 -2.969 l
+-1.955 -2.969 l
+-1.955 1.015 l
+-0.984 1.015 l
+-0.955 0.574 l
+-0.789 0.915 -0.558 1.088 -0.264 1.088 c
+-0.147 1.088 -0.055 1.066 0.015 1.029 c
+h
+2.073 -3.042 m
+1.544 -3.042 1.125 -2.888 0.823 -2.572 c
+0.53 -2.248 0.383 -1.789 0.383 -1.19 c
+0.383 -0.881 l
+0.383 -0.257 0.518 0.229 0.794 0.574 c
+1.066 0.915 1.459 1.088 1.97 1.088 c
+2.469 1.088 2.841 0.927 3.088 0.603 c
+3.341 0.279 3.473 -0.199 3.484 -0.823 c
+3.484 -1.323 l
+1.411 -1.323 l
+1.43 -1.616 1.492 -1.833 1.603 -1.969 c
+1.72 -2.109 1.9 -2.175 2.147 -2.175 c
+2.488 -2.175 2.779 -2.057 3.014 -1.822 c
+3.425 -2.454 l
+3.296 -2.63 3.109 -2.774 2.866 -2.881 c
+2.621 -2.987 2.356 -3.042 2.073 -3.042 c
+1.426 -0.602 m
+2.455 -0.602 l
+2.455 -0.5 l
+2.455 -0.264 2.415 -0.087 2.338 0.03 c
+2.268 0.154 2.139 0.221 1.955 0.221 c
+1.779 0.221 1.646 0.151 1.559 0.015 c
+1.478 -0.114 1.434 -0.319 1.426 -0.602 c
+5.042 1.015 m
+5.072 0.647 l
+5.307 0.941 5.615 1.088 5.997 1.088 c
+6.398 1.088 6.677 0.904 6.835 0.545 c
+7.071 0.904 7.398 1.088 7.82 1.088 c
+8.515 1.088 8.867 0.603 8.879 -0.367 c
+8.879 -2.969 l
+7.85 -2.969 l
+7.85 -0.426 l
+7.85 -0.201 7.813 -0.04 7.747 0.059 c
+7.688 0.154 7.578 0.206 7.423 0.206 c
+7.225 0.206 7.086 0.088 6.997 -0.147 c
+6.997 -2.969 l
+5.953 -2.969 l
+5.953 -0.44 l
+5.953 -0.205 5.924 -0.04 5.866 0.059 c
+5.806 0.154 5.696 0.206 5.542 0.206 c
+5.366 0.206 5.222 0.111 5.116 -0.073 c
+5.116 -2.969 l
+4.072 -2.969 l
+4.072 1.015 l
+h
+9.54 -0.852 m
+9.54 -0.246 9.679 0.229 9.966 0.574 c
+10.249 0.915 10.643 1.088 11.142 1.088 c
+11.649 1.088 12.046 0.915 12.333 0.574 c
+12.616 0.229 12.759 -0.246 12.759 -0.852 c
+12.759 -1.117 l
+12.759 -1.716 12.616 -2.186 12.333 -2.528 c
+12.046 -2.873 11.649 -3.042 11.142 -3.042 c
+10.631 -3.042 10.234 -2.873 9.951 -2.528 c
+9.676 -2.186 9.54 -1.712 9.54 -1.102 c
+h
+10.583 -1.117 m
+10.583 -1.822 10.768 -2.175 11.142 -2.175 c
+11.495 -2.175 11.686 -1.881 11.716 -1.294 c
+11.716 -0.852 l
+11.716 -0.492 11.664 -0.22 11.568 -0.043 c
+11.469 0.133 11.326 0.221 11.142 0.221 c
+10.966 0.221 10.826 0.133 10.731 -0.043 c
+10.631 -0.22 10.583 -0.492 10.583 -0.852 c
+h
+14.612 1.985 m
+14.612 1.015 l
+15.14 1.015 l
+15.14 0.221 l
+14.612 0.221 l
+14.612 -1.749 l
+14.612 -1.907 14.629 -2.013 14.67 -2.072 c
+14.718 -2.131 14.803 -2.16 14.92 -2.16 c
+15.026 -2.16 15.111 -2.153 15.169 -2.131 c
+15.169 -2.94 l
+14.993 -3.006 14.803 -3.042 14.597 -3.042 c
+13.92 -3.042 13.575 -2.657 13.567 -1.881 c
+13.567 0.221 l
+13.112 0.221 l
+13.112 1.015 l
+13.567 1.015 l
+13.567 1.985 l
+h
+17.316 -3.042 m
+16.787 -3.042 16.368 -2.888 16.066 -2.572 c
+15.772 -2.248 15.626 -1.789 15.626 -1.19 c
+15.626 -0.881 l
+15.626 -0.257 15.761 0.229 16.037 0.574 c
+16.309 0.915 16.702 1.088 17.213 1.088 c
+17.712 1.088 18.084 0.927 18.33 0.603 c
+18.583 0.279 18.716 -0.199 18.727 -0.823 c
+18.727 -1.323 l
+16.655 -1.323 l
+16.673 -1.616 16.735 -1.833 16.846 -1.969 c
+16.963 -2.109 17.143 -2.175 17.39 -2.175 c
+17.731 -2.175 18.022 -2.057 18.257 -1.822 c
+18.668 -2.454 l
+18.539 -2.63 18.352 -2.774 18.109 -2.881 c
+17.864 -2.987 17.598 -3.042 17.316 -3.042 c
+16.669 -0.602 m
+17.698 -0.602 l
+17.698 -0.5 l
+17.698 -0.264 17.658 -0.087 17.581 0.03 c
+17.511 0.154 17.382 0.221 17.199 0.221 c
+17.022 0.221 16.89 0.151 16.802 0.015 c
+16.721 -0.114 16.676 -0.319 16.669 -0.602 c
+f
+Q
+q 1 0 0 1 154.0648 144.9077 cm
+0 0 m
+-0.088 0.019 -0.187 0.03 -0.294 0.03 c
+-0.628 0.03 -0.864 -0.154 -0.999 -0.515 c
+-0.999 -3.366 l
+-1.646 -3.366 l
+-1.646 0.618 l
+-1.014 0.618 l
+-0.999 0.206 l
+-0.823 0.53 -0.58 0.691 -0.264 0.691 c
+-0.158 0.691 -0.07 0.669 0 0.632 c
+h
+1.999 -3.439 m
+1.5 -3.439 1.118 -3.293 0.852 -2.998 c
+0.588 -2.705 0.456 -2.271 0.456 -1.691 c
+0.456 -1.22 l
+0.456 -0.625 0.58 -0.158 0.838 0.177 c
+1.103 0.518 1.463 0.691 1.926 0.691 c
+2.385 0.691 2.727 0.537 2.955 0.235 c
+3.19 -0.058 3.311 -0.521 3.322 -1.146 c
+3.322 -1.573 l
+1.103 -1.573 l
+1.103 -1.66 l
+1.103 -2.094 1.18 -2.406 1.338 -2.601 c
+1.503 -2.789 1.735 -2.881 2.028 -2.881 c
+2.223 -2.881 2.396 -2.848 2.543 -2.778 c
+2.69 -2.701 2.826 -2.583 2.955 -2.425 c
+3.293 -2.836 l
+3.006 -3.241 2.576 -3.439 1.999 -3.439 c
+1.926 0.133 m
+1.65 0.133 1.448 0.037 1.323 -0.147 c
+1.195 -0.334 1.121 -0.625 1.103 -1.014 c
+2.675 -1.014 l
+2.675 -0.926 l
+2.653 -0.544 2.587 -0.276 2.469 -0.118 c
+2.352 0.048 2.168 0.133 1.926 0.133 c
+6.982 -1.573 m
+6.982 -2.201 6.865 -2.672 6.629 -2.984 c
+6.402 -3.289 6.086 -3.439 5.674 -3.439 c
+5.27 -3.439 4.961 -3.289 4.748 -2.984 c
+4.748 -4.895 l
+4.101 -4.895 l
+4.101 0.618 l
+4.69 0.618 l
+4.733 0.177 l
+4.946 0.518 5.255 0.691 5.659 0.691 c
+6.101 0.691 6.427 0.537 6.644 0.235 c
+6.857 -0.07 6.971 -0.525 6.982 -1.132 c
+h
+6.336 -1.19 m
+6.336 -0.75 6.265 -0.426 6.13 -0.22 c
+5.99 -0.008 5.77 0.103 5.469 0.103 c
+5.152 0.103 4.913 -0.051 4.748 -0.353 c
+4.748 -2.425 l
+4.913 -2.73 5.152 -2.881 5.469 -2.881 c
+5.762 -2.881 5.976 -2.778 6.115 -2.572 c
+6.251 -2.359 6.325 -2.028 6.336 -1.587 c
+h
+7.688 -1.19 m
+7.688 -0.613 7.824 -0.158 8.099 0.177 c
+8.382 0.518 8.754 0.691 9.216 0.691 c
+9.676 0.691 10.043 0.522 10.319 0.191 c
+10.602 -0.132 10.749 -0.58 10.76 -1.146 c
+10.76 -1.573 l
+10.76 -2.142 10.616 -2.597 10.334 -2.94 c
+10.058 -3.274 9.691 -3.439 9.231 -3.439 c
+8.768 -3.439 8.397 -3.278 8.114 -2.954 c
+7.838 -2.624 7.695 -2.183 7.688 -1.631 c
+h
+8.334 -1.573 m
+8.334 -1.976 8.412 -2.293 8.569 -2.528 c
+8.735 -2.763 8.956 -2.881 9.231 -2.881 c
+9.797 -2.881 10.091 -2.469 10.113 -1.646 c
+10.113 -1.19 l
+10.113 -0.79 10.028 -0.47 9.864 -0.235 c
+9.706 0.008 9.488 0.133 9.216 0.133 c
+8.952 0.133 8.735 0.008 8.569 -0.235 c
+8.412 -0.47 8.334 -0.79 8.334 -1.19 c
+h
+13.538 -2.352 m
+13.538 -2.204 13.483 -2.084 13.376 -1.984 c
+13.266 -1.889 13.06 -1.771 12.759 -1.631 c
+12.413 -1.484 12.171 -1.363 12.024 -1.263 c
+11.877 -1.157 11.767 -1.04 11.701 -0.911 c
+11.63 -0.786 11.597 -0.628 11.597 -0.44 c
+11.597 -0.118 11.715 0.151 11.95 0.368 c
+12.185 0.58 12.487 0.691 12.862 0.691 c
+13.244 0.691 13.552 0.578 13.787 0.353 c
+14.023 0.125 14.14 -0.162 14.14 -0.515 c
+13.494 -0.515 l
+13.494 -0.338 13.435 -0.187 13.317 -0.058 c
+13.2 0.067 13.045 0.133 12.862 0.133 c
+12.663 0.133 12.513 0.077 12.406 -0.029 c
+12.295 -0.128 12.245 -0.261 12.245 -0.426 c
+12.245 -0.555 12.281 -0.661 12.362 -0.75 c
+12.439 -0.831 12.63 -0.933 12.935 -1.058 c
+13.413 -1.246 13.743 -1.433 13.92 -1.616 c
+14.097 -1.793 14.184 -2.021 14.184 -2.293 c
+14.184 -2.645 14.059 -2.925 13.818 -3.131 c
+13.582 -3.337 13.266 -3.439 12.877 -3.439 c
+12.454 -3.439 12.116 -3.322 11.862 -3.087 c
+11.605 -2.844 11.48 -2.539 11.48 -2.175 c
+12.127 -2.175 l
+12.135 -2.403 12.204 -2.579 12.332 -2.705 c
+12.457 -2.822 12.642 -2.881 12.877 -2.881 c
+13.089 -2.881 13.251 -2.833 13.361 -2.734 c
+13.479 -2.638 13.538 -2.51 13.538 -2.352 c
+15.728 -3.366 -0.647 3.984 re
+15.772 1.661 m
+15.772 1.551 15.743 1.459 15.684 1.382 c
+15.625 1.312 15.53 1.279 15.405 1.279 c
+15.287 1.279 15.192 1.312 15.125 1.382 c
+15.067 1.459 15.038 1.551 15.038 1.661 c
+15.038 1.779 15.067 1.871 15.125 1.941 c
+15.192 2.018 15.287 2.058 15.405 2.058 c
+15.53 2.058 15.625 2.018 15.684 1.941 c
+15.743 1.86 15.772 1.768 15.772 1.661 c
+17.595 1.573 m
+17.595 0.618 l
+18.198 0.618 l
+18.198 0.088 l
+17.595 0.088 l
+17.595 -2.381 l
+17.595 -2.539 17.617 -2.657 17.668 -2.734 c
+17.727 -2.815 17.816 -2.851 17.933 -2.851 c
+18.021 -2.851 18.109 -2.836 18.198 -2.807 c
+18.198 -3.366 l
+18.051 -3.414 17.897 -3.439 17.741 -3.439 c
+17.485 -3.439 17.29 -3.347 17.154 -3.16 c
+17.014 -2.976 16.948 -2.715 16.948 -2.381 c
+16.948 0.088 l
+16.345 0.088 l
+16.345 0.618 l
+16.948 0.618 l
+16.948 1.573 l
+h
+18.756 -1.19 m
+18.756 -0.613 18.892 -0.158 19.168 0.177 c
+19.451 0.518 19.821 0.691 20.285 0.691 c
+20.744 0.691 21.112 0.522 21.388 0.191 c
+21.67 -0.132 21.818 -0.58 21.828 -1.146 c
+21.828 -1.573 l
+21.828 -2.142 21.685 -2.597 21.402 -2.94 c
+21.126 -3.274 20.759 -3.439 20.299 -3.439 c
+19.836 -3.439 19.466 -3.278 19.183 -2.954 c
+18.907 -2.624 18.763 -2.183 18.756 -1.631 c
+h
+19.403 -1.573 m
+19.403 -1.976 19.48 -2.293 19.638 -2.528 c
+19.803 -2.763 20.024 -2.881 20.299 -2.881 c
+20.866 -2.881 21.159 -2.469 21.182 -1.646 c
+21.182 -1.19 l
+21.182 -0.79 21.097 -0.47 20.931 -0.235 c
+20.773 0.008 20.557 0.133 20.285 0.133 c
+20.02 0.133 19.803 0.008 19.638 -0.235 c
+19.48 -0.47 19.403 -0.79 19.403 -1.19 c
+h
+24.312 0 m
+24.224 0.019 24.125 0.03 24.018 0.03 c
+23.684 0.03 23.449 -0.154 23.312 -0.515 c
+23.312 -3.366 l
+22.666 -3.366 l
+22.666 0.618 l
+23.298 0.618 l
+23.312 0.206 l
+23.489 0.53 23.732 0.691 24.048 0.691 c
+24.154 0.691 24.243 0.669 24.312 0.632 c
+h
+26.121 -2.278 m
+26.84 0.618 l
+27.532 0.618 l
+26.238 -3.925 l
+26.138 -4.266 25.995 -4.527 25.812 -4.704 c
+25.635 -4.88 25.433 -4.968 25.209 -4.968 c
+25.121 -4.968 25.007 -4.946 24.871 -4.909 c
+24.871 -4.365 l
+25.018 -4.38 l
+25.201 -4.38 25.348 -4.336 25.459 -4.247 c
+25.566 -4.16 25.654 -4.002 25.724 -3.777 c
+25.841 -3.337 l
+24.68 0.618 l
+25.386 0.618 l
+h
+27.811 -3.013 m
+27.811 -2.896 27.844 -2.8 27.914 -2.719 c
+27.979 -2.642 28.083 -2.601 28.222 -2.601 c
+28.369 -2.601 28.476 -2.642 28.546 -2.719 c
+28.623 -2.8 28.663 -2.896 28.663 -3.013 c
+28.663 -3.123 28.623 -3.215 28.546 -3.293 c
+28.476 -3.37 28.369 -3.41 28.222 -3.41 c
+28.083 -3.41 27.979 -3.37 27.914 -3.293 c
+27.844 -3.215 27.811 -3.123 27.811 -3.013 c
+33.896 -2.013 m
+33.896 -1.749 33.822 -1.55 33.676 -1.411 c
+33.536 -1.263 33.279 -1.124 32.897 -0.985 c
+32.521 -0.849 32.235 -0.706 32.029 -0.558 c
+31.831 -0.411 31.684 -0.246 31.588 -0.058 c
+31.489 0.136 31.441 0.357 31.441 0.603 c
+31.441 1.022 31.581 1.371 31.868 1.646 c
+32.151 1.918 32.519 2.058 32.97 2.058 c
+33.282 2.058 33.562 1.985 33.808 1.837 c
+34.05 1.698 34.238 1.503 34.366 1.249 c
+34.503 1.004 34.572 0.736 34.572 0.441 c
+33.896 0.441 l
+33.896 0.772 33.815 1.029 33.661 1.206 c
+33.503 1.389 33.271 1.484 32.97 1.484 c
+32.706 1.484 32.492 1.404 32.338 1.249 c
+32.191 1.103 32.118 0.89 32.118 0.618 c
+32.118 0.389 32.195 0.199 32.353 0.044 c
+32.519 -0.103 32.772 -0.243 33.117 -0.367 c
+33.635 -0.536 34.007 -0.746 34.234 -0.999 c
+34.47 -1.257 34.587 -1.587 34.587 -1.999 c
+34.587 -2.439 34.443 -2.792 34.161 -3.057 c
+33.874 -3.314 33.492 -3.439 33.014 -3.439 c
+32.698 -3.439 32.411 -3.37 32.147 -3.233 c
+31.883 -3.098 31.669 -2.907 31.515 -2.66 c
+31.368 -2.418 31.295 -2.131 31.295 -1.808 c
+31.971 -1.808 l
+31.971 -2.142 32.062 -2.403 32.249 -2.587 c
+32.434 -2.774 32.691 -2.866 33.014 -2.866 c
+33.308 -2.866 33.529 -2.792 33.676 -2.645 c
+33.822 -2.491 33.896 -2.278 33.896 -2.013 c
+36.791 -3.439 m
+36.292 -3.439 35.91 -3.293 35.646 -2.998 c
+35.38 -2.705 35.249 -2.271 35.249 -1.691 c
+35.249 -1.22 l
+35.249 -0.625 35.374 -0.158 35.631 0.177 c
+35.895 0.518 36.255 0.691 36.718 0.691 c
+37.178 0.691 37.52 0.537 37.747 0.235 c
+37.982 -0.058 38.104 -0.521 38.115 -1.146 c
+38.115 -1.573 l
+35.895 -1.573 l
+35.895 -1.66 l
+35.895 -2.094 35.972 -2.406 36.13 -2.601 c
+36.296 -2.789 36.527 -2.881 36.821 -2.881 c
+37.016 -2.881 37.188 -2.848 37.336 -2.778 c
+37.483 -2.701 37.618 -2.583 37.747 -2.425 c
+38.086 -2.836 l
+37.799 -3.241 37.369 -3.439 36.791 -3.439 c
+36.718 0.133 m
+36.442 0.133 36.241 0.037 36.116 -0.147 c
+35.987 -0.334 35.914 -0.625 35.895 -1.014 c
+37.468 -1.014 l
+37.468 -0.926 l
+37.446 -0.544 37.38 -0.276 37.262 -0.118 c
+37.145 0.048 36.961 0.133 36.718 0.133 c
+39.746 1.573 m
+39.746 0.618 l
+40.349 0.618 l
+40.349 0.088 l
+39.746 0.088 l
+39.746 -2.381 l
+39.746 -2.539 39.769 -2.657 39.82 -2.734 c
+39.879 -2.815 39.967 -2.851 40.084 -2.851 c
+40.172 -2.851 40.261 -2.836 40.349 -2.807 c
+40.349 -3.366 l
+40.202 -3.414 40.047 -3.439 39.893 -3.439 c
+39.636 -3.439 39.441 -3.347 39.305 -3.16 c
+39.166 -2.976 39.1 -2.715 39.1 -2.381 c
+39.1 0.088 l
+38.497 0.088 l
+38.497 0.618 l
+39.1 0.618 l
+39.1 1.573 l
+h
+43.538 -3.366 -0.646 3.984 re
+43.583 1.661 m
+43.583 1.551 43.553 1.459 43.495 1.382 c
+43.436 1.312 43.34 1.279 43.216 1.279 c
+43.098 1.279 43.002 1.312 42.936 1.382 c
+42.877 1.459 42.848 1.551 42.848 1.661 c
+42.848 1.779 42.877 1.871 42.936 1.941 c
+43.002 2.018 43.098 2.058 43.216 2.058 c
+43.34 2.058 43.436 2.018 43.495 1.941 c
+43.553 1.86 43.583 1.768 43.583 1.661 c
+45.406 1.573 m
+45.406 0.618 l
+46.008 0.618 l
+46.008 0.088 l
+45.406 0.088 l
+45.406 -2.381 l
+45.406 -2.539 45.427 -2.657 45.479 -2.734 c
+45.537 -2.815 45.626 -2.851 45.743 -2.851 c
+45.832 -2.851 45.92 -2.836 46.008 -2.807 c
+46.008 -3.366 l
+45.861 -3.414 45.707 -3.439 45.552 -3.439 c
+45.296 -3.439 45.101 -3.347 44.965 -3.16 c
+44.825 -2.976 44.758 -2.715 44.758 -2.381 c
+44.758 0.088 l
+44.156 0.088 l
+44.156 0.618 l
+44.758 0.618 l
+44.758 1.573 l
+h
+48.712 -2.352 m
+48.712 -2.204 48.658 -2.084 48.551 -1.984 c
+48.441 -1.889 48.235 -1.771 47.934 -1.631 c
+47.588 -1.484 47.346 -1.363 47.199 -1.263 c
+47.052 -1.157 46.942 -1.04 46.875 -0.911 c
+46.806 -0.786 46.773 -0.628 46.773 -0.44 c
+46.773 -0.118 46.89 0.151 47.125 0.368 c
+47.361 0.58 47.662 0.691 48.037 0.691 c
+48.419 0.691 48.727 0.578 48.963 0.353 c
+49.198 0.125 49.315 -0.162 49.315 -0.515 c
+48.669 -0.515 l
+48.669 -0.338 48.61 -0.187 48.492 -0.058 c
+48.375 0.067 48.22 0.133 48.037 0.133 c
+47.838 0.133 47.688 0.077 47.581 -0.029 c
+47.471 -0.128 47.419 -0.261 47.419 -0.426 c
+47.419 -0.555 47.456 -0.661 47.536 -0.75 c
+47.614 -0.831 47.806 -0.933 48.11 -1.058 c
+48.588 -1.246 48.918 -1.433 49.095 -1.616 c
+49.271 -1.793 49.36 -2.021 49.36 -2.293 c
+49.36 -2.645 49.235 -2.925 48.992 -3.131 c
+48.757 -3.337 48.441 -3.439 48.051 -3.439 c
+47.629 -3.439 47.291 -3.322 47.037 -3.087 c
+46.78 -2.844 46.655 -2.539 46.655 -2.175 c
+47.301 -2.175 l
+47.309 -2.403 47.378 -2.579 47.507 -2.705 c
+47.632 -2.822 47.816 -2.881 48.051 -2.881 c
+48.265 -2.881 48.426 -2.833 48.536 -2.734 c
+48.654 -2.638 48.712 -2.51 48.712 -2.352 c
+53.299 -2.881 m
+53.512 -2.881 53.685 -2.818 53.813 -2.69 c
+53.95 -2.554 54.023 -2.362 54.034 -2.117 c
+54.651 -2.117 l
+54.629 -2.499 54.493 -2.818 54.239 -3.072 c
+53.982 -3.318 53.67 -3.439 53.299 -3.439 c
+52.807 -3.439 52.432 -3.289 52.167 -2.984 c
+51.91 -2.672 51.785 -2.204 51.785 -1.587 c
+51.785 -1.146 l
+51.785 -0.551 51.91 -0.095 52.167 0.221 c
+52.432 0.533 52.807 0.691 53.299 0.691 c
+53.699 0.691 54.019 0.559 54.254 0.294 c
+54.497 0.037 54.629 -0.309 54.651 -0.75 c
+54.034 -0.75 l
+54.012 -0.455 53.938 -0.235 53.813 -0.087 c
+53.696 0.059 53.523 0.133 53.299 0.133 c
+53.005 0.133 52.788 0.033 52.652 -0.162 c
+52.512 -0.349 52.439 -0.658 52.432 -1.087 c
+52.432 -1.602 l
+52.432 -2.072 52.498 -2.406 52.637 -2.601 c
+52.784 -2.789 53.005 -2.881 53.299 -2.881 c
+55.268 -1.19 m
+55.268 -0.613 55.405 -0.158 55.68 0.177 c
+55.963 0.518 56.334 0.691 56.797 0.691 c
+57.256 0.691 57.624 0.522 57.9 0.191 c
+58.183 -0.132 58.33 -0.58 58.341 -1.146 c
+58.341 -1.573 l
+58.341 -2.142 58.197 -2.597 57.915 -2.94 c
+57.639 -3.274 57.271 -3.439 56.812 -3.439 c
+56.349 -3.439 55.978 -3.278 55.695 -2.954 c
+55.419 -2.624 55.276 -2.183 55.268 -1.631 c
+h
+55.916 -1.573 m
+55.916 -1.976 55.993 -2.293 56.151 -2.528 c
+56.315 -2.763 56.537 -2.881 56.812 -2.881 c
+57.378 -2.881 57.672 -2.469 57.694 -1.646 c
+57.694 -1.19 l
+57.694 -0.79 57.609 -0.47 57.444 -0.235 c
+57.286 0.008 57.069 0.133 56.797 0.133 c
+56.533 0.133 56.315 0.008 56.151 -0.235 c
+55.993 -0.47 55.916 -0.79 55.916 -1.19 c
+h
+62.06 -1.573 m
+62.06 -2.201 61.942 -2.672 61.707 -2.984 c
+61.479 -3.289 61.163 -3.439 60.751 -3.439 c
+60.347 -3.439 60.038 -3.289 59.825 -2.984 c
+59.825 -4.895 l
+59.178 -4.895 l
+59.178 0.618 l
+59.766 0.618 l
+59.81 0.177 l
+60.024 0.518 60.332 0.691 60.737 0.691 c
+61.177 0.691 61.505 0.537 61.721 0.235 c
+61.935 -0.07 62.048 -0.525 62.06 -1.132 c
+h
+61.412 -1.19 m
+61.412 -0.75 61.343 -0.426 61.207 -0.22 c
+61.067 -0.008 60.847 0.103 60.545 0.103 c
+60.23 0.103 59.991 -0.051 59.825 -0.353 c
+59.825 -2.425 l
+59.991 -2.73 60.23 -2.881 60.545 -2.881 c
+60.839 -2.881 61.053 -2.778 61.192 -2.572 c
+61.329 -2.359 61.402 -2.028 61.412 -1.587 c
+h
+63.941 -2.278 m
+64.662 0.618 l
+65.352 0.618 l
+64.059 -3.925 l
+63.959 -4.266 63.816 -4.527 63.633 -4.704 c
+63.456 -4.88 63.253 -4.968 63.03 -4.968 c
+62.941 -4.968 62.827 -4.946 62.692 -4.909 c
+62.692 -4.365 l
+62.839 -4.38 l
+63.022 -4.38 63.17 -4.336 63.28 -4.247 c
+63.386 -4.16 63.475 -4.002 63.544 -3.777 c
+63.662 -3.337 l
+62.501 0.618 l
+63.206 0.618 l
+h
+69.747 -3.366 m
+69.707 -3.278 69.681 -3.131 69.674 -2.925 c
+69.439 -3.27 69.144 -3.439 68.792 -3.439 c
+68.427 -3.439 68.145 -3.343 67.939 -3.145 c
+67.741 -2.94 67.645 -2.653 67.645 -2.278 c
+67.645 -1.878 67.781 -1.558 68.057 -1.323 c
+68.329 -1.08 68.703 -0.955 69.173 -0.955 c
+69.659 -0.955 l
+69.659 -0.529 l
+69.659 -0.294 69.603 -0.128 69.497 -0.029 c
+69.387 0.077 69.225 0.133 69.012 0.133 c
+68.814 0.133 68.652 0.073 68.527 -0.044 c
+68.41 -0.162 68.35 -0.309 68.35 -0.484 c
+67.704 -0.484 l
+67.704 -0.29 67.762 -0.099 67.88 0.088 c
+68.005 0.272 68.167 0.42 68.365 0.53 c
+68.571 0.636 68.799 0.691 69.056 0.691 c
+69.457 0.691 69.761 0.588 69.967 0.383 c
+70.181 0.177 70.295 -0.118 70.306 -0.5 c
+70.306 -2.514 l
+70.306 -2.818 70.343 -3.083 70.423 -3.307 c
+70.423 -3.366 l
+h
+68.88 -2.851 m
+69.046 -2.851 69.196 -2.807 69.335 -2.719 c
+69.482 -2.631 69.589 -2.52 69.659 -2.381 c
+69.659 -1.44 l
+69.291 -1.44 l
+68.975 -1.44 68.733 -1.51 68.556 -1.646 c
+68.38 -1.774 68.292 -1.962 68.292 -2.204 c
+68.292 -2.433 68.336 -2.597 68.425 -2.705 c
+68.512 -2.803 68.663 -2.851 68.88 -2.851 c
+73.245 -2.352 m
+73.245 -2.204 73.19 -2.084 73.084 -1.984 c
+72.973 -1.889 72.768 -1.771 72.466 -1.631 c
+72.121 -1.484 71.878 -1.363 71.731 -1.263 c
+71.585 -1.157 71.475 -1.04 71.408 -0.911 c
+71.338 -0.786 71.305 -0.628 71.305 -0.44 c
+71.305 -0.118 71.423 0.151 71.658 0.368 c
+71.893 0.58 72.194 0.691 72.57 0.691 c
+72.952 0.691 73.26 0.578 73.495 0.353 c
+73.73 0.125 73.848 -0.162 73.848 -0.515 c
+73.202 -0.515 l
+73.202 -0.338 73.142 -0.187 73.025 -0.058 c
+72.907 0.067 72.753 0.133 72.57 0.133 c
+72.371 0.133 72.221 0.077 72.113 -0.029 c
+72.003 -0.128 71.952 -0.261 71.952 -0.426 c
+71.952 -0.555 71.989 -0.661 72.069 -0.75 c
+72.147 -0.831 72.338 -0.933 72.643 -1.058 c
+73.121 -1.246 73.451 -1.433 73.628 -1.616 c
+73.804 -1.793 73.892 -2.021 73.892 -2.293 c
+73.892 -2.645 73.767 -2.925 73.524 -3.131 c
+73.289 -3.337 72.973 -3.439 72.584 -3.439 c
+72.161 -3.439 71.824 -3.322 71.57 -3.087 c
+71.313 -2.844 71.188 -2.539 71.188 -2.175 c
+71.834 -2.175 l
+71.841 -2.403 71.912 -2.579 72.04 -2.705 c
+72.165 -2.822 72.348 -2.881 72.584 -2.881 c
+72.797 -2.881 72.959 -2.833 73.069 -2.734 c
+73.187 -2.638 73.245 -2.51 73.245 -2.352 c
+78.493 -3.366 m
+78.453 -3.278 78.427 -3.131 78.419 -2.925 c
+78.184 -3.27 77.89 -3.439 77.538 -3.439 c
+77.174 -3.439 76.891 -3.343 76.685 -3.145 c
+76.487 -2.94 76.391 -2.653 76.391 -2.278 c
+76.391 -1.878 76.527 -1.558 76.803 -1.323 c
+77.075 -1.08 77.449 -0.955 77.92 -0.955 c
+78.405 -0.955 l
+78.405 -0.529 l
+78.405 -0.294 78.349 -0.128 78.243 -0.029 c
+78.133 0.077 77.971 0.133 77.758 0.133 c
+77.559 0.133 77.398 0.073 77.273 -0.044 c
+77.156 -0.162 77.096 -0.309 77.096 -0.484 c
+76.45 -0.484 l
+76.45 -0.29 76.508 -0.099 76.626 0.088 c
+76.751 0.272 76.913 0.42 77.111 0.53 c
+77.317 0.636 77.545 0.691 77.802 0.691 c
+78.203 0.691 78.508 0.588 78.714 0.383 c
+78.927 0.177 79.041 -0.118 79.051 -0.5 c
+79.051 -2.514 l
+79.051 -2.818 79.088 -3.083 79.169 -3.307 c
+79.169 -3.366 l
+h
+77.626 -2.851 m
+77.792 -2.851 77.942 -2.807 78.081 -2.719 c
+78.228 -2.631 78.335 -2.52 78.405 -2.381 c
+78.405 -1.44 l
+78.037 -1.44 l
+77.721 -1.44 77.478 -1.51 77.302 -1.646 c
+77.127 -1.774 77.038 -1.962 77.038 -2.204 c
+77.038 -2.433 77.082 -2.597 77.17 -2.705 c
+77.258 -2.803 77.409 -2.851 77.626 -2.851 c
+80.668 0.618 m
+80.683 0.177 l
+80.937 0.518 81.26 0.691 81.653 0.691 c
+82.359 0.691 82.715 0.221 82.727 -0.72 c
+82.727 -3.366 l
+82.08 -3.366 l
+82.08 -0.75 l
+82.08 -0.437 82.025 -0.216 81.918 -0.087 c
+81.808 0.037 81.653 0.103 81.447 0.103 c
+81.289 0.103 81.143 0.048 81.006 -0.058 c
+80.878 -0.168 80.775 -0.305 80.698 -0.47 c
+80.698 -3.366 l
+80.051 -3.366 l
+80.051 0.618 l
+h
+87.445 -3.013 m
+87.228 -3.3 86.916 -3.439 86.504 -3.439 c
+86.141 -3.439 85.865 -3.318 85.681 -3.072 c
+85.505 -2.818 85.409 -2.454 85.401 -1.984 c
+85.401 0.618 l
+86.048 0.618 l
+86.048 -1.926 l
+86.048 -2.554 86.232 -2.866 86.607 -2.866 c
+87.007 -2.866 87.283 -2.69 87.43 -2.337 c
+87.43 0.618 l
+88.077 0.618 l
+88.077 -3.366 l
+87.46 -3.366 l
+h
+91.943 -1.573 m
+91.943 -2.201 91.825 -2.672 91.589 -2.984 c
+91.362 -3.289 91.046 -3.439 90.635 -3.439 c
+90.23 -3.439 89.922 -3.289 89.708 -2.984 c
+89.708 -4.895 l
+89.062 -4.895 l
+89.062 0.618 l
+89.65 0.618 l
+89.694 0.177 l
+89.906 0.518 90.216 0.691 90.62 0.691 c
+91.061 0.691 91.388 0.537 91.604 0.235 c
+91.818 -0.07 91.932 -0.525 91.943 -1.132 c
+h
+91.296 -1.19 m
+91.296 -0.75 91.226 -0.426 91.09 -0.22 c
+90.951 -0.008 90.73 0.103 90.429 0.103 c
+90.112 0.103 89.874 -0.051 89.708 -0.353 c
+89.708 -2.425 l
+89.874 -2.73 90.112 -2.881 90.429 -2.881 c
+90.723 -2.881 90.936 -2.778 91.076 -2.572 c
+91.211 -2.359 91.285 -2.028 91.296 -1.587 c
+h
+94.721 -2.352 m
+94.721 -2.204 94.666 -2.084 94.559 -1.984 c
+94.449 -1.889 94.243 -1.771 93.941 -1.631 c
+93.596 -1.484 93.354 -1.363 93.207 -1.263 c
+93.06 -1.157 92.95 -1.04 92.884 -0.911 c
+92.813 -0.786 92.78 -0.628 92.78 -0.44 c
+92.78 -0.118 92.898 0.151 93.133 0.368 c
+93.368 0.58 93.669 0.691 94.045 0.691 c
+94.427 0.691 94.735 0.578 94.97 0.353 c
+95.206 0.125 95.323 -0.162 95.323 -0.515 c
+94.677 -0.515 l
+94.677 -0.338 94.618 -0.187 94.5 -0.058 c
+94.383 0.067 94.228 0.133 94.045 0.133 c
+93.846 0.133 93.696 0.077 93.589 -0.029 c
+93.478 -0.128 93.428 -0.261 93.428 -0.426 c
+93.428 -0.555 93.464 -0.661 93.545 -0.75 c
+93.622 -0.831 93.813 -0.933 94.118 -1.058 c
+94.596 -1.246 94.926 -1.433 95.103 -1.616 c
+95.279 -1.793 95.367 -2.021 95.367 -2.293 c
+95.367 -2.645 95.242 -2.925 95.001 -3.131 c
+94.765 -3.337 94.449 -3.439 94.06 -3.439 c
+93.637 -3.439 93.299 -3.322 93.045 -3.087 c
+92.788 -2.844 92.663 -2.539 92.663 -2.175 c
+93.31 -2.175 l
+93.317 -2.403 93.387 -2.579 93.515 -2.705 c
+93.64 -2.822 93.825 -2.881 94.06 -2.881 c
+94.272 -2.881 94.434 -2.833 94.544 -2.734 c
+94.662 -2.638 94.721 -2.51 94.721 -2.352 c
+97.058 1.573 m
+97.058 0.618 l
+97.661 0.618 l
+97.661 0.088 l
+97.058 0.088 l
+97.058 -2.381 l
+97.058 -2.539 97.08 -2.657 97.131 -2.734 c
+97.191 -2.815 97.278 -2.851 97.396 -2.851 c
+97.484 -2.851 97.573 -2.836 97.661 -2.807 c
+97.661 -3.366 l
+97.513 -3.414 97.359 -3.439 97.205 -3.439 c
+96.948 -3.439 96.753 -3.347 96.617 -3.16 c
+96.478 -2.976 96.412 -2.715 96.412 -2.381 c
+96.412 0.088 l
+95.809 0.088 l
+95.809 0.618 l
+96.412 0.618 l
+96.412 1.573 l
+h
+100.071 0 m
+99.983 0.019 99.884 0.03 99.778 0.03 c
+99.443 0.03 99.208 -0.154 99.072 -0.515 c
+99.072 -3.366 l
+98.425 -3.366 l
+98.425 0.618 l
+99.057 0.618 l
+99.072 0.206 l
+99.248 0.53 99.491 0.691 99.807 0.691 c
+99.913 0.691 100.002 0.669 100.071 0.632 c
+h
+102.07 -3.439 m
+101.571 -3.439 101.189 -3.293 100.923 -2.998 c
+100.659 -2.705 100.526 -2.271 100.526 -1.691 c
+100.526 -1.22 l
+100.526 -0.625 100.652 -0.158 100.909 0.177 c
+101.174 0.518 101.534 0.691 101.997 0.691 c
+102.456 0.691 102.798 0.537 103.026 0.235 c
+103.261 -0.058 103.383 -0.521 103.393 -1.146 c
+103.393 -1.573 l
+101.174 -1.573 l
+101.174 -1.66 l
+101.174 -2.094 101.251 -2.406 101.409 -2.601 c
+101.574 -2.789 101.806 -2.881 102.099 -2.881 c
+102.294 -2.881 102.467 -2.848 102.614 -2.778 c
+102.762 -2.701 102.897 -2.583 103.026 -2.425 c
+103.364 -2.836 l
+103.077 -3.241 102.647 -3.439 102.07 -3.439 c
+101.997 0.133 m
+101.721 0.133 101.519 0.037 101.394 -0.147 c
+101.266 -0.334 101.193 -0.625 101.174 -1.014 c
+102.747 -1.014 l
+102.747 -0.926 l
+102.724 -0.544 102.658 -0.276 102.541 -0.118 c
+102.423 0.048 102.24 0.133 101.997 0.133 c
+106.215 -3.366 m
+106.175 -3.278 106.149 -3.131 106.142 -2.925 c
+105.907 -3.27 105.613 -3.439 105.26 -3.439 c
+104.896 -3.439 104.613 -3.343 104.408 -3.145 c
+104.209 -2.94 104.114 -2.653 104.114 -2.278 c
+104.114 -1.878 104.25 -1.558 104.525 -1.323 c
+104.797 -1.08 105.172 -0.955 105.642 -0.955 c
+106.128 -0.955 l
+106.128 -0.529 l
+106.128 -0.294 106.072 -0.128 105.966 -0.029 c
+105.856 0.077 105.694 0.133 105.48 0.133 c
+105.282 0.133 105.12 0.073 104.995 -0.044 c
+104.878 -0.162 104.819 -0.309 104.819 -0.484 c
+104.173 -0.484 l
+104.173 -0.29 104.231 -0.099 104.349 0.088 c
+104.474 0.272 104.636 0.42 104.834 0.53 c
+105.039 0.636 105.268 0.691 105.525 0.691 c
+105.925 0.691 106.23 0.588 106.436 0.383 c
+106.649 0.177 106.763 -0.118 106.774 -0.5 c
+106.774 -2.514 l
+106.774 -2.818 106.811 -3.083 106.892 -3.307 c
+106.892 -3.366 l
+h
+105.349 -2.851 m
+105.513 -2.851 105.664 -2.807 105.804 -2.719 c
+105.951 -2.631 106.057 -2.52 106.128 -2.381 c
+106.128 -1.44 l
+105.76 -1.44 l
+105.444 -1.44 105.201 -1.51 105.025 -1.646 c
+104.848 -1.774 104.76 -1.962 104.76 -2.204 c
+104.76 -2.433 104.804 -2.597 104.892 -2.705 c
+104.981 -2.803 105.131 -2.851 105.349 -2.851 c
+108.391 0.618 m
+108.406 0.25 l
+108.648 0.544 108.968 0.691 109.361 0.691 c
+109.802 0.691 110.111 0.493 110.288 0.103 c
+110.541 0.493 110.89 0.691 111.331 0.691 c
+112.066 0.691 112.441 0.228 112.463 -0.69 c
+112.463 -3.366 l
+111.815 -3.366 l
+111.815 -0.75 l
+111.815 -0.455 111.761 -0.243 111.654 -0.103 c
+111.555 0.033 111.383 0.103 111.14 0.103 c
+110.941 0.103 110.78 0.023 110.654 -0.132 c
+110.537 -0.279 110.467 -0.47 110.448 -0.706 c
+110.448 -3.366 l
+109.787 -3.366 l
+109.787 -0.72 l
+109.787 -0.172 109.567 0.103 109.126 0.103 c
+108.792 0.103 108.557 -0.058 108.42 -0.382 c
+108.42 -3.366 l
+107.774 -3.366 l
+107.774 0.618 l
+h
+113.477 -3.013 m
+113.477 -2.896 113.51 -2.8 113.58 -2.719 c
+113.646 -2.642 113.749 -2.601 113.889 -2.601 c
+114.035 -2.601 114.142 -2.642 114.211 -2.719 c
+114.289 -2.8 114.329 -2.896 114.329 -3.013 c
+114.329 -3.123 114.289 -3.215 114.211 -3.293 c
+114.142 -3.37 114.035 -3.41 113.889 -3.41 c
+113.749 -3.41 113.646 -3.37 113.58 -3.293 c
+113.51 -3.215 113.477 -3.123 113.477 -3.013 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+535.667 501.669 238.665 -21.46 re
+f
+0 0 0 0 k
+q 1 0 0 1 597.5209 489.2955 cm
+0 0 m
+-0.052 -1.069 -0.353 -1.878 -0.912 -2.425 c
+-1.463 -2.977 -2.234 -3.248 -3.234 -3.248 c
+-4.303 -3.248 -5.123 -2.903 -5.689 -2.204 c
+-6.247 -1.51 -6.527 -0.515 -6.527 0.779 c
+-6.527 2.352 l
+-6.527 3.645 -6.24 4.638 -5.659 5.336 c
+-5.071 6.03 -4.26 6.38 -3.219 6.38 c
+-2.201 6.38 -1.426 6.089 -0.896 5.513 c
+-0.368 4.943 -0.067 4.123 0.014 3.057 c
+-1.881 3.057 l
+-1.904 3.723 -2.007 4.179 -2.19 4.424 c
+-2.378 4.678 -2.72 4.807 -3.219 4.807 c
+-3.719 4.807 -4.079 4.63 -4.293 4.278 c
+-4.499 3.925 -4.612 3.341 -4.63 2.529 c
+-4.63 0.765 l
+-4.63 -0.168 -4.528 -0.808 -4.322 -1.161 c
+-4.108 -1.506 -3.745 -1.675 -3.234 -1.675 c
+-2.745 -1.675 -2.407 -1.558 -2.22 -1.323 c
+-2.025 -1.08 -1.918 -0.639 -1.896 0 c
+h
+1.433 -2.19 m
+1.433 -1.896 1.529 -1.657 1.727 -1.469 c
+1.922 -1.286 2.175 -1.19 2.491 -1.19 c
+2.792 -1.19 3.042 -1.286 3.241 -1.469 c
+3.447 -1.657 3.549 -1.896 3.549 -2.19 c
+3.549 -2.495 3.447 -2.741 3.241 -2.925 c
+3.042 -3.102 2.792 -3.189 2.491 -3.189 c
+2.186 -3.189 1.932 -3.098 1.727 -2.91 c
+1.529 -2.726 1.433 -2.484 1.433 -2.19 c
+14.115 4.675 m
+11.792 4.675 l
+11.792 -3.116 l
+9.896 -3.116 l
+9.896 4.675 l
+7.617 4.675 l
+7.617 6.247 l
+14.115 6.247 l
+h
+21.967 -3.116 m
+20.086 -3.116 l
+20.086 0.897 l
+17.294 0.897 l
+17.294 -3.116 l
+15.397 -3.116 l
+15.397 6.247 l
+17.294 6.247 l
+17.294 2.455 l
+20.086 2.455 l
+20.086 6.247 l
+21.967 6.247 l
+h
+28.542 0.941 m
+25.602 0.941 l
+25.602 -1.543 l
+29.086 -1.543 l
+29.086 -3.116 l
+23.706 -3.116 l
+23.706 6.247 l
+29.071 6.247 l
+29.071 4.675 l
+25.602 4.675 l
+25.602 2.455 l
+28.542 2.455 l
+h
+35.44 -1.543 m
+39.29 -1.543 l
+39.29 -3.116 l
+33.219 -3.116 l
+33.219 -1.984 l
+37.042 4.675 l
+33.19 4.675 l
+33.19 6.247 l
+39.217 6.247 l
+39.217 5.13 l
+h
+47.107 0.721 m
+47.107 -0.536 46.806 -1.51 46.21 -2.204 c
+45.611 -2.903 44.788 -3.248 43.741 -3.248 c
+42.69 -3.248 41.863 -2.907 41.256 -2.219 c
+40.657 -1.525 40.352 -0.558 40.345 0.676 c
+40.345 2.279 l
+40.345 3.561 40.643 4.564 41.242 5.292 c
+41.837 6.016 42.667 6.38 43.726 6.38 c
+44.762 6.38 45.582 6.02 46.181 5.307 c
+46.787 4.601 47.095 3.605 47.107 2.323 c
+h
+45.21 2.294 m
+45.21 3.135 45.086 3.763 44.843 4.175 c
+44.608 4.586 44.233 4.792 43.726 4.792 c
+43.226 4.792 42.852 4.59 42.609 4.189 c
+42.374 3.796 42.249 3.198 42.241 2.396 c
+42.241 0.721 l
+42.241 -0.095 42.362 -0.698 42.609 -1.087 c
+42.852 -1.481 43.23 -1.675 43.741 -1.675 c
+44.229 -1.675 44.593 -1.484 44.828 -1.103 c
+45.071 -0.72 45.2 -0.132 45.21 0.661 c
+h
+55.283 0.721 m
+55.283 -0.536 54.982 -1.51 54.386 -2.204 c
+53.788 -2.903 52.965 -3.248 51.917 -3.248 c
+50.866 -3.248 50.039 -2.907 49.433 -2.219 c
+48.834 -1.525 48.529 -0.558 48.521 0.676 c
+48.521 2.279 l
+48.521 3.561 48.819 4.564 49.418 5.292 c
+50.013 6.016 50.844 6.38 51.902 6.38 c
+52.938 6.38 53.758 6.02 54.357 5.307 c
+54.964 4.601 55.272 3.605 55.283 2.323 c
+h
+53.387 2.294 m
+53.387 3.135 53.262 3.763 53.019 4.175 c
+52.784 4.586 52.41 4.792 51.902 4.792 c
+51.402 4.792 51.028 4.59 50.785 4.189 c
+50.55 3.796 50.425 3.198 50.418 2.396 c
+50.418 0.721 l
+50.418 -0.095 50.538 -0.698 50.785 -1.087 c
+51.028 -1.481 51.406 -1.675 51.917 -1.675 c
+52.406 -1.675 52.77 -1.484 53.005 -1.103 c
+53.247 -0.72 53.376 -0.132 53.387 0.661 c
+h
+66.579 0.721 m
+66.579 -0.536 66.278 -1.51 65.682 -2.204 c
+65.083 -2.903 64.26 -3.248 63.213 -3.248 c
+62.162 -3.248 61.335 -2.907 60.729 -2.219 c
+60.13 -1.525 59.825 -0.558 59.818 0.676 c
+59.818 2.279 l
+59.818 3.561 60.115 4.564 60.714 5.292 c
+61.31 6.016 62.14 6.38 63.198 6.38 c
+64.235 6.38 65.054 6.02 65.653 5.307 c
+66.259 4.601 66.568 3.605 66.579 2.323 c
+h
+64.683 2.294 m
+64.683 3.135 64.558 3.763 64.316 4.175 c
+64.08 4.586 63.705 4.792 63.198 4.792 c
+62.698 4.792 62.324 4.59 62.081 4.189 c
+61.846 3.796 61.721 3.198 61.714 2.396 c
+61.714 0.721 l
+61.714 -0.095 61.835 -0.698 62.081 -1.087 c
+62.324 -1.481 62.702 -1.675 63.213 -1.675 c
+63.702 -1.675 64.065 -1.484 64.301 -1.103 c
+64.543 -0.72 64.672 -0.132 64.683 0.661 c
+h
+72.992 0.706 m
+70.052 0.706 l
+70.052 -3.116 l
+68.156 -3.116 l
+68.156 6.247 l
+73.345 6.247 l
+73.345 4.675 l
+70.052 4.675 l
+70.052 2.279 l
+72.992 2.279 l
+h
+83.817 0.368 m
+84.7 6.247 l
+86.581 6.247 l
+84.906 -3.116 l
+83.009 -3.116 l
+81.922 2.396 l
+80.848 -3.116 l
+78.938 -3.116 l
+77.262 6.247 l
+79.143 6.247 l
+80.025 0.368 l
+81.128 6.247 l
+82.716 6.247 l
+h
+94.493 0.721 m
+94.493 -0.536 94.192 -1.51 93.596 -2.204 c
+92.997 -2.903 92.174 -3.248 91.127 -3.248 c
+90.076 -3.248 89.249 -2.907 88.642 -2.219 c
+88.044 -1.525 87.738 -0.558 87.732 0.676 c
+87.732 2.279 l
+87.732 3.561 88.029 4.564 88.628 5.292 c
+89.224 6.016 90.053 6.38 91.112 6.38 c
+92.148 6.38 92.968 6.02 93.567 5.307 c
+94.173 4.601 94.481 3.605 94.493 2.323 c
+h
+92.596 2.294 m
+92.596 3.135 92.472 3.763 92.229 4.175 c
+91.994 4.586 91.619 4.792 91.112 4.792 c
+90.612 4.792 90.238 4.59 89.995 4.189 c
+89.76 3.796 89.635 3.198 89.627 2.396 c
+89.627 0.721 l
+89.627 -0.095 89.748 -0.698 89.995 -1.087 c
+90.238 -1.481 90.616 -1.675 91.127 -1.675 c
+91.615 -1.675 91.979 -1.484 92.214 -1.103 c
+92.457 -0.72 92.586 -0.132 92.596 0.661 c
+h
+98.906 0.309 m
+97.965 0.309 l
+97.965 -3.116 l
+96.083 -3.116 l
+96.083 6.247 l
+99.098 6.247 l
+100.045 6.247 100.777 6.001 101.288 5.513 c
+101.805 5.02 102.067 4.326 102.067 3.425 c
+102.067 2.18 101.614 1.309 100.714 0.809 c
+102.346 -3.027 l
+102.346 -3.116 l
+100.317 -3.116 l
+h
+97.965 1.881 m
+99.038 1.881 l
+99.42 1.881 99.703 2.003 99.891 2.249 c
+100.075 2.502 100.17 2.841 100.17 3.263 c
+100.17 4.204 99.807 4.675 99.083 4.675 c
+97.965 4.675 l
+h
+106.23 0.5 m
+105.48 -0.44 l
+105.48 -3.116 l
+103.584 -3.116 l
+103.584 6.247 l
+105.48 6.247 l
+105.48 2.161 l
+106.083 3.175 l
+107.817 6.247 l
+110.14 6.247 l
+107.449 2.132 l
+110.184 -3.116 l
+107.935 -3.116 l
+h
+113.054 -3.116 -1.896 9.363 re
+121.304 -3.116 m
+119.407 -3.116 l
+116.644 3.028 l
+116.644 -3.116 l
+114.748 -3.116 l
+114.748 6.247 l
+116.644 6.247 l
+119.407 0.103 l
+119.407 6.247 l
+121.304 6.247 l
+h
+129.421 -2.057 m
+129.057 -2.451 128.613 -2.749 128.084 -2.954 c
+127.555 -3.149 126.974 -3.248 126.349 -3.248 c
+125.269 -3.248 124.431 -2.917 123.835 -2.248 c
+123.237 -1.583 122.932 -0.613 122.925 0.661 c
+122.925 2.352 l
+122.925 3.645 123.204 4.638 123.762 5.336 c
+124.328 6.03 125.151 6.38 126.231 6.38 c
+127.249 6.38 128.014 6.122 128.525 5.615 c
+129.043 5.116 129.34 4.329 129.421 3.263 c
+127.584 3.263 l
+127.532 3.859 127.411 4.266 127.216 4.484 c
+127.018 4.696 126.709 4.807 126.291 4.807 c
+125.78 4.807 125.408 4.619 125.173 4.248 c
+124.945 3.873 124.828 3.282 124.82 2.469 c
+124.82 0.765 l
+124.82 -0.087 124.945 -0.713 125.203 -1.103 c
+125.456 -1.484 125.872 -1.675 126.452 -1.675 c
+126.823 -1.675 127.128 -1.602 127.363 -1.455 c
+127.525 -1.338 l
+127.525 0.383 l
+126.202 0.383 l
+126.202 1.808 l
+129.421 1.808 l
+h
+138.586 -1.205 m
+136.014 -1.205 l
+135.515 -3.116 l
+133.515 -3.116 l
+136.44 6.247 l
+138.16 6.247 l
+141.115 -3.116 l
+139.086 -3.116 l
+h
+136.425 0.383 m
+138.175 0.383 l
+137.292 3.719 l
+h
+145.05 0.309 m
+144.109 0.309 l
+144.109 -3.116 l
+142.228 -3.116 l
+142.228 6.247 l
+145.241 6.247 l
+146.189 6.247 146.921 6.001 147.431 5.513 c
+147.949 5.02 148.211 4.326 148.211 3.425 c
+148.211 2.18 147.758 1.309 146.858 0.809 c
+148.49 -3.027 l
+148.49 -3.116 l
+146.461 -3.116 l
+h
+144.109 1.881 m
+145.182 1.881 l
+145.564 1.881 145.848 2.003 146.035 2.249 c
+146.218 2.502 146.314 2.841 146.314 3.263 c
+146.314 4.204 145.95 4.675 145.227 4.675 c
+144.109 4.675 l
+h
+154.564 0.941 m
+151.625 0.941 l
+151.625 -1.543 l
+155.108 -1.543 l
+155.108 -3.116 l
+149.728 -3.116 l
+149.728 6.247 l
+155.093 6.247 l
+155.093 4.675 l
+151.625 4.675 l
+151.625 2.455 l
+154.564 2.455 l
+h
+160.836 -1.205 m
+158.264 -1.205 l
+157.765 -3.116 l
+155.766 -3.116 l
+158.691 6.247 l
+160.41 6.247 l
+163.365 -3.116 l
+161.337 -3.116 l
+h
+158.676 0.383 m
+160.425 0.383 l
+159.544 3.719 l
+h
+168.418 -0.661 m
+168.418 -0.279 168.319 0.008 168.124 0.206 c
+167.926 0.401 167.573 0.603 167.066 0.809 c
+166.125 1.168 165.449 1.588 165.037 2.058 c
+164.626 2.536 164.42 3.105 164.42 3.763 c
+164.42 4.546 164.699 5.178 165.258 5.66 c
+165.816 6.137 166.525 6.38 167.389 6.38 c
+167.966 6.38 168.481 6.255 168.932 6.012 c
+169.381 5.766 169.726 5.424 169.962 4.983 c
+170.204 4.542 170.328 4.042 170.328 3.484 c
+168.447 3.484 l
+168.447 3.925 168.352 4.256 168.168 4.484 c
+167.98 4.707 167.712 4.821 167.359 4.821 c
+167.025 4.821 166.764 4.723 166.581 4.528 c
+166.404 4.341 166.316 4.079 166.316 3.749 c
+166.316 3.491 166.419 3.256 166.625 3.043 c
+166.831 2.837 167.19 2.62 167.712 2.396 c
+168.624 2.072 169.285 1.669 169.696 1.191 c
+170.116 0.709 170.328 0.096 170.328 -0.646 c
+170.328 -1.462 170.068 -2.098 169.549 -2.557 c
+169.028 -3.021 168.323 -3.248 167.433 -3.248 c
+166.823 -3.248 166.272 -3.123 165.772 -2.881 c
+165.279 -2.627 164.894 -2.271 164.611 -1.808 c
+164.325 -1.338 164.184 -0.79 164.184 -0.162 c
+166.081 -0.162 l
+166.081 -0.702 166.183 -1.095 166.39 -1.338 c
+166.602 -1.583 166.951 -1.705 167.433 -1.705 c
+168.088 -1.705 168.418 -1.359 168.418 -0.661 c
+f
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+/GS2 gs
+0 TL/Fm1 Do
+Q
+q 1 0 0 1 597.8069 284.3244 cm
+0 0 m
+0 0.107 -0.055 0.206 -0.161 0.294 c
+-0.272 0.39 -0.507 0.518 -0.866 0.676 c
+-1.407 0.89 -1.774 1.118 -1.969 1.353 c
+-2.167 1.588 -2.263 1.875 -2.263 2.22 c
+-2.263 2.661 -2.109 3.018 -1.793 3.293 c
+-1.481 3.576 -1.069 3.72 -0.558 3.72 c
+-0.01 3.72 0.427 3.576 0.75 3.293 c
+1.081 3.018 1.25 2.639 1.25 2.161 c
+-0.058 2.161 l
+-0.058 2.573 -0.228 2.779 -0.558 2.779 c
+-0.698 2.779 -0.808 2.735 -0.896 2.646 c
+-0.984 2.558 -1.028 2.44 -1.028 2.294 c
+-1.028 2.176 -0.981 2.073 -0.881 1.985 c
+-0.786 1.904 -0.554 1.786 -0.191 1.632 c
+0.339 1.434 0.709 1.214 0.927 0.971 c
+1.151 0.736 1.264 0.427 1.264 0.044 c
+1.264 -0.396 1.095 -0.756 0.765 -1.028 c
+0.43 -1.294 -0.01 -1.425 -0.558 -1.425 c
+-0.922 -1.425 -1.246 -1.356 -1.529 -1.219 c
+-1.804 -1.072 -2.021 -0.874 -2.175 -0.617 c
+-2.333 -0.363 -2.41 -0.087 -2.41 0.206 c
+-1.176 0.206 l
+-1.168 -0.022 -1.113 -0.191 -1.014 -0.309 c
+-0.918 -0.426 -0.756 -0.484 -0.529 -0.484 c
+-0.176 -0.484 0 -0.323 0 0 c
+3.421 4.851 m
+3.421 3.631 l
+4.083 3.631 l
+4.083 2.661 l
+3.421 2.661 l
+3.421 0.192 l
+3.421 -0.007 3.444 -0.143 3.495 -0.22 c
+3.554 -0.29 3.66 -0.323 3.818 -0.323 c
+3.936 -0.323 4.039 -0.315 4.127 -0.293 c
+4.113 -1.308 l
+3.884 -1.385 3.645 -1.425 3.392 -1.425 c
+2.558 -1.425 2.135 -0.947 2.128 0.015 c
+2.128 2.661 l
+1.555 2.661 l
+1.555 3.631 l
+2.128 3.631 l
+2.128 4.851 l
+h
+7.041 -1.337 m
+7.001 -1.26 6.961 -1.132 6.924 -0.955 c
+6.696 -1.271 6.384 -1.425 5.983 -1.425 c
+5.561 -1.425 5.212 -1.29 4.939 -1.014 c
+4.675 -0.742 4.543 -0.382 4.543 0.059 c
+4.543 0.578 4.704 0.978 5.027 1.264 c
+5.358 1.548 5.839 1.694 6.468 1.706 c
+6.865 1.706 l
+6.865 2.103 l
+6.865 2.326 6.824 2.484 6.747 2.573 c
+6.666 2.661 6.556 2.705 6.409 2.705 c
+6.086 2.705 5.924 2.517 5.924 2.147 c
+4.63 2.147 l
+4.63 2.595 4.8 2.97 5.145 3.263 c
+5.486 3.565 5.924 3.72 6.453 3.72 c
+6.99 3.72 7.408 3.576 7.703 3.293 c
+8.004 3.018 8.158 2.617 8.158 2.087 c
+8.158 -0.249 l
+8.166 -0.683 8.232 -1.021 8.349 -1.263 c
+8.349 -1.337 l
+h
+6.277 -0.411 m
+6.413 -0.411 6.531 -0.382 6.629 -0.323 c
+6.737 -0.264 6.814 -0.198 6.865 -0.118 c
+6.865 0.912 l
+6.556 0.912 l
+6.328 0.912 6.152 0.842 6.027 0.706 c
+5.898 0.566 5.836 0.383 5.836 0.148 c
+5.836 -0.228 5.983 -0.411 6.277 -0.411 c
+11.131 0 m
+11.131 0.107 11.076 0.206 10.97 0.294 c
+10.859 0.39 10.624 0.518 10.264 0.676 c
+9.724 0.89 9.357 1.118 9.162 1.353 c
+8.963 1.588 8.867 1.875 8.867 2.22 c
+8.867 2.661 9.022 3.018 9.338 3.293 c
+9.65 3.576 10.062 3.72 10.573 3.72 c
+11.12 3.72 11.558 3.576 11.881 3.293 c
+12.212 3.018 12.381 2.639 12.381 2.161 c
+11.073 2.161 l
+11.073 2.573 10.903 2.779 10.573 2.779 c
+10.433 2.779 10.323 2.735 10.234 2.646 c
+10.147 2.558 10.103 2.44 10.103 2.294 c
+10.103 2.176 10.151 2.073 10.249 1.985 c
+10.345 1.904 10.577 1.786 10.94 1.632 c
+11.47 1.434 11.84 1.214 12.057 0.971 c
+12.281 0.736 12.395 0.427 12.395 0.044 c
+12.395 -0.396 12.227 -0.756 11.896 -1.028 c
+11.562 -1.294 11.12 -1.425 10.573 -1.425 c
+10.209 -1.425 9.885 -1.356 9.602 -1.219 c
+9.326 -1.072 9.11 -0.874 8.956 -0.617 c
+8.798 -0.363 8.721 -0.087 8.721 0.206 c
+9.955 0.206 l
+9.962 -0.022 10.018 -0.191 10.117 -0.309 c
+10.213 -0.426 10.375 -0.484 10.602 -0.484 c
+10.955 -0.484 11.131 -0.323 11.131 0 c
+14.299 3.19 m
+14.581 3.543 14.931 3.72 15.342 3.72 c
+15.791 3.72 16.137 3.558 16.372 3.234 c
+16.607 2.918 16.728 2.448 16.739 1.823 c
+16.739 -1.337 l
+15.431 -1.337 l
+15.431 1.808 l
+15.431 2.103 15.387 2.312 15.298 2.44 c
+15.21 2.565 15.063 2.631 14.857 2.631 c
+14.622 2.631 14.435 2.521 14.299 2.309 c
+14.299 -1.337 l
+13.006 -1.337 l
+13.006 5.719 l
+14.299 5.719 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 708.0578 323.0349 cm
+0 0 m
+47.933 0 l
+50.538 0 52.637 -2.099 52.637 -4.704 c
+52.637 -19.264 l
+52.637 -21.868 50.538 -23.963 47.933 -23.963 c
+0 -23.963 l
+-2.606 -23.963 -4.7 -21.868 -4.7 -19.264 c
+-4.7 -4.704 l
+-4.7 -2.099 -2.606 0 0 0 c
+f
+Q
+0 0 0 0 k
+723.657 314.105 -1.309 4.968 re
+722.29 320.367 m
+722.29 320.562 722.352 320.723 722.481 320.852 c
+722.606 320.988 722.779 321.057 722.996 321.057 c
+723.208 321.057 723.381 320.988 723.51 320.852 c
+723.635 320.723 723.701 320.562 723.701 320.367 c
+723.701 320.161 723.635 319.989 723.51 319.852 c
+723.393 319.723 723.22 319.661 722.996 319.661 c
+722.779 319.661 722.606 319.723 722.481 319.852 c
+722.352 319.989 722.29 320.161 722.29 320.367 c
+725.759 319.073 m
+725.803 318.588 l
+726.097 318.971 726.479 319.162 726.95 319.162 c
+727.802 319.162 728.243 318.563 728.272 317.368 c
+728.272 314.105 l
+726.964 314.105 l
+726.964 317.28 l
+726.964 317.552 726.921 317.754 726.832 317.882 c
+726.751 318.008 726.604 318.073 726.391 318.073 c
+726.156 318.073 725.972 317.956 725.847 317.721 c
+725.847 314.105 l
+724.539 314.105 l
+724.539 319.073 l
+h
+728.835 316.737 m
+728.835 317.56 728.97 318.166 729.246 318.559 c
+729.529 318.96 729.93 319.162 730.451 319.162 c
+730.834 319.162 731.15 319 731.407 318.676 c
+731.407 321.161 l
+732.716 321.161 l
+732.716 314.105 l
+731.54 314.105 l
+731.48 314.605 l
+731.216 314.212 730.871 314.017 730.451 314.017 c
+729.93 314.017 729.533 314.212 729.261 314.605 c
+728.985 315.006 728.842 315.594 728.835 316.369 c
+h
+730.143 316.413 m
+730.143 315.92 730.191 315.579 730.29 315.384 c
+730.397 315.197 730.576 315.104 730.834 315.104 c
+731.087 315.104 731.278 315.214 731.407 315.443 c
+731.407 317.707 l
+731.278 317.949 731.087 318.073 730.834 318.073 c
+730.599 318.073 730.422 317.975 730.304 317.78 c
+730.194 317.593 730.143 317.254 730.143 316.766 c
+h
+735.505 314.017 m
+734.836 314.017 734.314 314.212 733.932 314.605 c
+733.557 315.006 733.373 315.579 733.373 316.325 c
+733.373 316.722 l
+733.373 317.504 733.542 318.107 733.888 318.53 c
+734.229 318.948 734.725 319.162 735.372 319.162 c
+735.989 319.162 736.452 318.96 736.768 318.559 c
+737.092 318.166 737.254 317.578 737.254 316.795 c
+737.254 316.149 l
+734.682 316.149 l
+734.688 315.785 734.769 315.516 734.917 315.34 c
+735.064 315.171 735.284 315.09 735.578 315.09 c
+736.018 315.09 736.379 315.241 736.666 315.546 c
+737.18 314.752 l
+737.022 314.535 736.791 314.358 736.489 314.223 c
+736.184 314.087 735.858 314.017 735.505 314.017 c
+734.682 317.059 m
+735.989 317.059 l
+735.989 317.177 l
+735.978 317.479 735.923 317.707 735.827 317.853 c
+735.74 318.008 735.582 318.088 735.357 318.088 c
+735.129 318.088 734.964 318.004 734.858 317.838 c
+734.759 317.681 734.7 317.42 734.682 317.059 c
+739.473 317.603 m
+740.061 319.073 l
+741.428 319.073 l
+740.296 316.648 l
+741.472 314.105 l
+740.091 314.105 l
+739.488 315.663 l
+738.871 314.105 l
+737.489 314.105 l
+738.665 316.648 l
+737.533 319.073 l
+738.929 319.073 l
+h
+f
+q 1 0 0 1 706.8743 306.8918 cm
+0 0 m
+0 0.683 0.077 1.341 0.235 1.97 c
+0.389 2.605 0.632 3.167 0.956 3.659 c
+1.279 4.16 1.621 4.505 1.984 4.704 c
+2.219 3.983 l
+1.874 3.659 1.602 3.16 1.396 2.484 c
+1.198 1.815 1.095 1.043 1.088 0.162 c
+1.088 -0.118 l
+1.088 -1.04 1.183 -1.849 1.382 -2.543 c
+1.587 -3.238 1.866 -3.755 2.219 -4.102 c
+1.984 -4.807 l
+1.621 -4.619 1.279 -4.281 0.956 -3.792 c
+0.64 -3.3 0.401 -2.749 0.235 -2.132 c
+0.077 -1.515 0 -0.867 0 -0.191 c
+h
+5.045 -1.382 m
+5.045 -1.276 4.991 -1.176 4.883 -1.088 c
+4.773 -0.992 4.538 -0.864 4.178 -0.706 c
+3.638 -0.493 3.27 -0.264 3.075 -0.029 c
+2.878 0.206 2.782 0.492 2.782 0.837 c
+2.782 1.278 2.936 1.635 3.252 1.911 c
+3.564 2.194 3.976 2.337 4.486 2.337 c
+5.035 2.337 5.471 2.194 5.795 1.911 c
+6.126 1.635 6.294 1.257 6.294 0.779 c
+4.987 0.779 l
+4.987 1.19 4.818 1.396 4.486 1.396 c
+4.347 1.396 4.237 1.352 4.149 1.264 c
+4.06 1.176 4.016 1.058 4.016 0.912 c
+4.016 0.794 4.064 0.69 4.164 0.602 c
+4.259 0.521 4.49 0.404 4.854 0.249 c
+5.384 0.051 5.755 -0.169 5.972 -0.412 c
+6.196 -0.647 6.31 -0.956 6.31 -1.338 c
+6.31 -1.779 6.14 -2.139 5.81 -2.411 c
+5.475 -2.675 5.035 -2.808 4.486 -2.808 c
+4.123 -2.808 3.8 -2.738 3.516 -2.602 c
+3.241 -2.455 3.024 -2.257 2.87 -1.999 c
+2.712 -1.746 2.635 -1.47 2.635 -1.176 c
+3.869 -1.176 l
+3.877 -1.404 3.932 -1.573 4.031 -1.691 c
+4.127 -1.808 4.289 -1.867 4.517 -1.867 c
+4.869 -1.867 5.045 -1.706 5.045 -1.382 c
+8.463 3.468 m
+8.463 2.248 l
+9.124 2.248 l
+9.124 1.278 l
+8.463 1.278 l
+8.463 -1.191 l
+8.463 -1.389 8.484 -1.525 8.536 -1.602 c
+8.596 -1.673 8.702 -1.706 8.86 -1.706 c
+8.977 -1.706 9.08 -1.698 9.168 -1.675 c
+9.153 -2.691 l
+8.926 -2.768 8.687 -2.808 8.434 -2.808 c
+7.599 -2.808 7.177 -2.33 7.169 -1.367 c
+7.169 1.278 l
+6.596 1.278 l
+6.596 2.248 l
+7.169 2.248 l
+7.169 3.468 l
+h
+12.087 -2.72 m
+12.046 -2.643 12.006 -2.514 11.969 -2.338 c
+11.74 -2.654 11.428 -2.808 11.028 -2.808 c
+10.605 -2.808 10.256 -2.672 9.984 -2.396 c
+9.72 -2.124 9.587 -1.764 9.587 -1.323 c
+9.587 -0.805 9.749 -0.405 10.073 -0.118 c
+10.404 0.166 10.884 0.312 11.513 0.324 c
+11.91 0.324 l
+11.91 0.72 l
+11.91 0.944 11.869 1.103 11.792 1.19 c
+11.711 1.278 11.601 1.323 11.454 1.323 c
+11.131 1.323 10.969 1.135 10.969 0.764 c
+9.675 0.764 l
+9.675 1.213 9.845 1.587 10.19 1.881 c
+10.532 2.182 10.969 2.337 11.499 2.337 c
+12.035 2.337 12.453 2.194 12.748 1.911 c
+13.049 1.635 13.203 1.234 13.203 0.706 c
+13.203 -1.632 l
+13.211 -2.066 13.277 -2.404 13.394 -2.646 c
+13.394 -2.72 l
+h
+11.322 -1.793 m
+11.458 -1.793 11.576 -1.764 11.675 -1.706 c
+11.781 -1.646 11.858 -1.58 11.91 -1.5 c
+11.91 -0.47 l
+11.601 -0.47 l
+11.374 -0.47 11.197 -0.54 11.072 -0.676 c
+10.944 -0.816 10.881 -1 10.881 -1.235 c
+10.881 -1.61 11.028 -1.793 11.322 -1.793 c
+13.824 -0.088 m
+13.824 0.735 13.972 1.341 14.265 1.735 c
+14.559 2.135 14.971 2.337 15.5 2.337 c
+15.948 2.337 16.297 2.161 16.544 1.808 c
+16.588 2.248 l
+17.764 2.248 l
+17.764 -2.72 l
+17.764 -3.356 17.58 -3.84 17.22 -4.175 c
+16.867 -4.505 16.357 -4.675 15.692 -4.675 c
+15.426 -4.675 15.14 -4.619 14.838 -4.513 c
+14.533 -4.403 14.31 -4.266 14.163 -4.102 c
+14.603 -3.204 l
+14.728 -3.329 14.89 -3.433 15.089 -3.514 c
+15.283 -3.591 15.463 -3.631 15.632 -3.631 c
+15.927 -3.631 16.136 -3.561 16.264 -3.425 c
+16.39 -3.285 16.455 -3.061 16.455 -2.749 c
+16.455 -2.323 l
+16.209 -2.646 15.886 -2.808 15.486 -2.808 c
+14.956 -2.808 14.545 -2.602 14.25 -2.19 c
+13.964 -1.779 13.824 -1.202 13.824 -0.456 c
+h
+15.118 -0.412 m
+15.118 -0.875 15.177 -1.205 15.295 -1.411 c
+15.412 -1.617 15.603 -1.72 15.867 -1.72 c
+16.132 -1.72 16.327 -1.628 16.455 -1.44 c
+16.455 0.941 l
+16.327 1.147 16.136 1.249 15.883 1.249 c
+15.618 1.249 15.42 1.139 15.295 0.926 c
+15.177 0.72 15.118 0.382 15.118 -0.088 c
+h
+19.888 -2.72 -1.309 4.968 re
+18.52 3.542 m
+18.52 3.737 18.583 3.898 18.712 4.027 c
+18.836 4.164 19.01 4.233 19.226 4.233 c
+19.439 4.233 19.613 4.164 19.74 4.027 c
+19.866 3.898 19.931 3.737 19.931 3.542 c
+19.931 3.337 19.866 3.164 19.74 3.028 c
+19.623 2.899 19.451 2.836 19.226 2.836 c
+19.01 2.836 18.836 2.899 18.712 3.028 c
+18.583 3.164 18.52 3.337 18.52 3.542 c
+21.986 2.248 m
+22.03 1.764 l
+22.324 2.146 22.707 2.337 23.177 2.337 c
+24.029 2.337 24.471 1.738 24.5 0.544 c
+24.5 -2.72 l
+23.191 -2.72 l
+23.191 0.455 l
+23.191 0.727 23.147 0.929 23.059 1.058 c
+22.979 1.183 22.831 1.249 22.618 1.249 c
+22.383 1.249 22.2 1.132 22.074 0.897 c
+22.074 -2.72 l
+20.766 -2.72 l
+20.766 2.248 l
+h
+25.095 -0.088 m
+25.095 0.735 25.242 1.341 25.535 1.735 c
+25.83 2.135 26.241 2.337 26.771 2.337 c
+27.219 2.337 27.568 2.161 27.814 1.808 c
+27.858 2.248 l
+29.034 2.248 l
+29.034 -2.72 l
+29.034 -3.356 28.851 -3.84 28.49 -4.175 c
+28.138 -4.505 27.627 -4.675 26.962 -4.675 c
+26.697 -4.675 26.41 -4.619 26.109 -4.513 c
+25.805 -4.403 25.58 -4.266 25.433 -4.102 c
+25.874 -3.204 l
+25.999 -3.329 26.161 -3.433 26.359 -3.514 c
+26.553 -3.591 26.734 -3.631 26.903 -3.631 c
+27.197 -3.631 27.407 -3.561 27.534 -3.425 c
+27.66 -3.285 27.726 -3.061 27.726 -2.749 c
+27.726 -2.323 l
+27.48 -2.646 27.156 -2.808 26.756 -2.808 c
+26.227 -2.808 25.815 -2.602 25.521 -2.19 c
+25.234 -1.779 25.095 -1.202 25.095 -0.456 c
+h
+26.389 -0.412 m
+26.389 -0.875 26.447 -1.205 26.565 -1.411 c
+26.682 -1.617 26.873 -1.72 27.138 -1.72 c
+27.403 -1.72 27.598 -1.628 27.726 -1.44 c
+27.726 0.941 l
+27.598 1.147 27.407 1.249 27.153 1.249 c
+26.888 1.249 26.69 1.139 26.565 0.926 c
+26.447 0.72 26.389 0.382 26.389 -0.088 c
+h
+34.241 -2.72 m
+34.201 -2.643 34.16 -2.514 34.123 -2.338 c
+33.896 -2.654 33.583 -2.808 33.183 -2.808 c
+32.76 -2.808 32.411 -2.672 32.139 -2.396 c
+31.875 -2.124 31.742 -1.764 31.742 -1.323 c
+31.742 -0.805 31.904 -0.405 32.228 -0.118 c
+32.558 0.166 33.04 0.312 33.668 0.324 c
+34.065 0.324 l
+34.065 0.72 l
+34.065 0.944 34.025 1.103 33.948 1.19 c
+33.867 1.278 33.757 1.323 33.609 1.323 c
+33.286 1.323 33.124 1.135 33.124 0.764 c
+31.831 0.764 l
+31.831 1.213 32 1.587 32.345 1.881 c
+32.687 2.182 33.124 2.337 33.653 2.337 c
+34.19 2.337 34.609 2.194 34.903 1.911 c
+35.204 1.635 35.359 1.234 35.359 0.706 c
+35.359 -1.632 l
+35.366 -2.066 35.432 -2.404 35.55 -2.646 c
+35.55 -2.72 l
+h
+33.477 -1.793 m
+33.613 -1.793 33.73 -1.764 33.83 -1.706 c
+33.936 -1.646 34.013 -1.58 34.065 -1.5 c
+34.065 -0.47 l
+33.757 -0.47 l
+33.529 -0.47 33.352 -0.54 33.227 -0.676 c
+33.099 -0.816 33.036 -1 33.036 -1.235 c
+33.036 -1.61 33.183 -1.793 33.477 -1.793 c
+38.582 0.999 m
+38.155 1.029 l
+37.791 1.029 37.552 0.871 37.435 0.559 c
+37.435 -2.72 l
+36.126 -2.72 l
+36.126 2.248 l
+37.346 2.248 l
+37.391 1.72 l
+37.597 2.131 37.88 2.337 38.243 2.337 c
+38.391 2.337 38.508 2.315 38.596 2.278 c
+h
+41.051 -2.808 m
+40.382 -2.808 39.86 -2.613 39.478 -2.22 c
+39.103 -1.819 38.919 -1.246 38.919 -0.5 c
+38.919 -0.104 l
+38.919 0.679 39.089 1.282 39.434 1.705 c
+39.775 2.124 40.272 2.337 40.918 2.337 c
+41.536 2.337 41.998 2.135 42.314 1.735 c
+42.638 1.341 42.8 0.754 42.8 -0.029 c
+42.8 -0.676 l
+40.228 -0.676 l
+40.234 -1.04 40.315 -1.309 40.463 -1.484 c
+40.61 -1.654 40.83 -1.735 41.124 -1.735 c
+41.566 -1.735 41.925 -1.584 42.212 -1.279 c
+42.727 -2.072 l
+42.568 -2.29 42.337 -2.466 42.036 -2.602 c
+41.73 -2.738 41.404 -2.808 41.051 -2.808 c
+40.228 0.235 m
+41.536 0.235 l
+41.536 0.353 l
+41.525 0.654 41.47 0.881 41.374 1.029 c
+41.286 1.183 41.128 1.264 40.903 1.264 c
+40.676 1.264 40.51 1.18 40.404 1.014 c
+40.305 0.856 40.246 0.595 40.228 0.235 c
+45.725 -2.72 m
+45.684 -2.643 45.644 -2.514 45.607 -2.338 c
+45.379 -2.654 45.067 -2.808 44.666 -2.808 c
+44.244 -2.808 43.895 -2.672 43.623 -2.396 c
+43.359 -2.124 43.226 -1.764 43.226 -1.323 c
+43.226 -0.805 43.388 -0.405 43.711 -0.118 c
+44.042 0.166 44.523 0.312 45.152 0.324 c
+45.549 0.324 l
+45.549 0.72 l
+45.549 0.944 45.508 1.103 45.431 1.19 c
+45.35 1.278 45.24 1.323 45.093 1.323 c
+44.77 1.323 44.608 1.135 44.608 0.764 c
+43.315 0.764 l
+43.315 1.213 43.484 1.587 43.829 1.881 c
+44.171 2.182 44.608 2.337 45.137 2.337 c
+45.674 2.337 46.092 2.194 46.387 1.911 c
+46.688 1.635 46.842 1.234 46.842 0.706 c
+46.842 -1.632 l
+46.85 -2.066 46.916 -2.404 47.033 -2.646 c
+47.033 -2.72 l
+h
+44.961 -1.793 m
+45.096 -1.793 45.214 -1.764 45.314 -1.706 c
+45.42 -1.646 45.497 -1.58 45.549 -1.5 c
+45.549 -0.47 l
+45.24 -0.47 l
+45.013 -0.47 44.836 -0.54 44.711 -0.676 c
+44.583 -0.816 44.52 -1 44.52 -1.235 c
+44.52 -1.61 44.666 -1.793 44.961 -1.793 c
+49.694 -0.104 m
+49.694 -0.819 49.599 -1.496 49.414 -2.132 c
+49.238 -2.768 48.988 -3.326 48.664 -3.807 c
+48.342 -4.285 47.996 -4.619 47.636 -4.807 c
+47.401 -4.102 l
+47.743 -3.767 48.011 -3.256 48.209 -2.573 c
+48.415 -1.889 48.521 -1.11 48.533 -0.235 c
+48.533 0.014 l
+48.533 0.904 48.429 1.697 48.224 2.396 c
+48.026 3.102 47.754 3.634 47.401 3.998 c
+47.636 4.704 l
+47.871 4.586 48.11 4.384 48.356 4.101 c
+48.599 3.825 48.819 3.484 49.017 3.071 c
+49.223 2.66 49.385 2.194 49.503 1.675 c
+49.628 1.165 49.694 0.573 49.694 -0.104 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 646.1816 351.8337 cm
+0 0 m
+38.148 0 l
+40.754 0 42.852 -2.098 42.852 -4.704 c
+42.852 -10.231 l
+42.852 -12.835 40.754 -14.934 38.148 -14.934 c
+0 -14.934 l
+-2.605 -14.934 -4.704 -12.835 -4.704 -10.231 c
+-4.704 -4.704 l
+-4.704 -2.098 -2.605 0 0 0 c
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 649.541 345.8732 cm
+0 0 m
+-0.426 0.03 l
+-0.79 0.03 -1.029 -0.128 -1.147 -0.44 c
+-1.147 -3.719 l
+-2.455 -3.719 l
+-2.455 1.249 l
+-1.235 1.249 l
+-1.191 0.721 l
+-0.985 1.132 -0.702 1.338 -0.339 1.338 c
+-0.191 1.338 -0.074 1.316 0.014 1.279 c
+h
+2.469 -3.807 m
+1.801 -3.807 1.279 -3.612 0.897 -3.219 c
+0.521 -2.818 0.338 -2.245 0.338 -1.499 c
+0.338 -1.103 l
+0.338 -0.32 0.507 0.283 0.852 0.706 c
+1.194 1.125 1.69 1.338 2.337 1.338 c
+2.954 1.338 3.417 1.135 3.733 0.736 c
+4.056 0.342 4.218 -0.246 4.218 -1.028 c
+4.218 -1.675 l
+1.646 -1.675 l
+1.653 -2.04 1.734 -2.308 1.881 -2.484 c
+2.028 -2.653 2.248 -2.734 2.543 -2.734 c
+2.983 -2.734 3.343 -2.583 3.63 -2.278 c
+4.145 -3.072 l
+3.987 -3.289 3.755 -3.465 3.453 -3.601 c
+3.149 -3.737 2.822 -3.807 2.469 -3.807 c
+1.646 -0.764 m
+2.954 -0.764 l
+2.954 -0.646 l
+2.944 -0.345 2.888 -0.118 2.792 0.03 c
+2.705 0.184 2.547 0.265 2.322 0.265 c
+2.094 0.265 1.929 0.181 1.822 0.015 c
+1.723 -0.143 1.664 -0.404 1.646 -0.764 c
+8.658 -1.396 m
+8.658 -2.171 8.517 -2.77 8.246 -3.189 c
+7.981 -3.601 7.584 -3.807 7.056 -3.807 c
+6.651 -3.807 6.327 -3.645 6.085 -3.322 c
+6.085 -5.629 l
+4.777 -5.629 l
+4.777 1.249 l
+5.982 1.249 l
+6.026 0.794 l
+6.279 1.154 6.618 1.338 7.041 1.338 c
+7.57 1.338 7.966 1.147 8.232 0.765 c
+8.503 0.383 8.646 -0.213 8.658 -1.014 c
+h
+7.364 -1.058 m
+7.364 -0.58 7.309 -0.243 7.202 -0.044 c
+7.092 0.151 6.912 0.25 6.659 0.25 c
+6.394 0.25 6.202 0.14 6.085 -0.073 c
+6.085 -2.41 l
+6.202 -2.627 6.397 -2.734 6.673 -2.734 c
+6.927 -2.734 7.103 -2.627 7.202 -2.41 c
+7.309 -2.186 7.364 -1.849 7.364 -1.396 c
+h
+9.109 -1.072 m
+9.109 -0.32 9.286 0.268 9.639 0.691 c
+9.992 1.121 10.48 1.338 11.108 1.338 c
+11.744 1.338 12.24 1.121 12.593 0.691 c
+12.953 0.268 13.136 -0.323 13.136 -1.087 c
+13.136 -1.396 l
+13.136 -2.153 12.961 -2.745 12.608 -3.175 c
+12.255 -3.597 11.759 -3.807 11.123 -3.807 c
+10.484 -3.807 9.992 -3.597 9.639 -3.175 c
+9.286 -2.745 9.109 -2.153 9.109 -1.396 c
+h
+10.418 -1.396 m
+10.418 -2.289 10.653 -2.734 11.123 -2.734 c
+11.565 -2.734 11.8 -2.362 11.829 -1.616 c
+11.843 -1.072 l
+11.843 -0.625 11.777 -0.29 11.652 -0.073 c
+11.524 0.151 11.343 0.265 11.108 0.265 c
+10.892 0.265 10.719 0.151 10.594 -0.073 c
+10.476 -0.29 10.418 -0.625 10.418 -1.072 c
+h
+15.959 -2.381 m
+15.959 -2.275 15.904 -2.175 15.798 -2.087 c
+15.687 -1.992 15.452 -1.863 15.092 -1.705 c
+14.551 -1.492 14.184 -1.263 13.99 -1.028 c
+13.791 -0.793 13.695 -0.507 13.695 -0.162 c
+13.695 0.279 13.85 0.636 14.166 0.912 c
+14.478 1.195 14.89 1.338 15.401 1.338 c
+15.948 1.338 16.386 1.195 16.708 0.912 c
+17.04 0.636 17.209 0.258 17.209 -0.22 c
+15.9 -0.22 l
+15.9 0.191 15.731 0.397 15.401 0.397 c
+15.261 0.397 15.151 0.353 15.062 0.265 c
+14.975 0.177 14.931 0.059 14.931 -0.087 c
+14.931 -0.205 14.978 -0.309 15.077 -0.397 c
+15.173 -0.478 15.405 -0.595 15.768 -0.75 c
+16.297 -0.948 16.668 -1.168 16.885 -1.411 c
+17.109 -1.646 17.223 -1.955 17.223 -2.337 c
+17.223 -2.778 17.055 -3.138 16.724 -3.41 c
+16.389 -3.674 15.948 -3.807 15.401 -3.807 c
+15.037 -3.807 14.713 -3.737 14.43 -3.601 c
+14.155 -3.454 13.938 -3.256 13.784 -2.998 c
+13.626 -2.745 13.549 -2.469 13.549 -2.175 c
+14.783 -2.175 l
+14.79 -2.403 14.846 -2.572 14.945 -2.69 c
+15.041 -2.807 15.202 -2.866 15.43 -2.866 c
+15.783 -2.866 15.959 -2.705 15.959 -2.381 c
+19.23 -3.719 -1.309 4.968 re
+17.863 2.543 m
+17.863 2.738 17.925 2.899 18.054 3.028 c
+18.179 3.165 18.351 3.234 18.568 3.234 c
+18.781 3.234 18.954 3.165 19.083 3.028 c
+19.208 2.899 19.274 2.738 19.274 2.543 c
+19.274 2.338 19.208 2.165 19.083 2.029 c
+18.965 1.9 18.792 1.837 18.568 1.837 c
+18.351 1.837 18.179 1.9 18.054 2.029 c
+17.925 2.165 17.863 2.338 17.863 2.543 c
+21.655 2.469 m
+21.655 1.249 l
+22.316 1.249 l
+22.316 0.279 l
+21.655 0.279 l
+21.655 -2.19 l
+21.655 -2.389 21.677 -2.524 21.728 -2.601 c
+21.788 -2.672 21.894 -2.705 22.052 -2.705 c
+22.169 -2.705 22.272 -2.697 22.36 -2.674 c
+22.346 -3.69 l
+22.118 -3.767 21.879 -3.807 21.626 -3.807 c
+20.791 -3.807 20.369 -3.329 20.361 -2.366 c
+20.361 0.279 l
+19.789 0.279 l
+19.789 1.249 l
+20.361 1.249 l
+20.361 2.469 l
+h
+22.64 -1.072 m
+22.64 -0.32 22.817 0.268 23.169 0.691 c
+23.522 1.121 24.01 1.338 24.639 1.338 c
+25.275 1.338 25.771 1.121 26.123 0.691 c
+26.484 0.268 26.667 -0.323 26.667 -1.087 c
+26.667 -1.396 l
+26.667 -2.153 26.491 -2.745 26.138 -3.175 c
+25.786 -3.597 25.289 -3.807 24.654 -3.807 c
+24.014 -3.807 23.522 -3.597 23.169 -3.175 c
+22.817 -2.745 22.64 -2.153 22.64 -1.396 c
+h
+23.948 -1.396 m
+23.948 -2.289 24.184 -2.734 24.654 -2.734 c
+25.094 -2.734 25.329 -2.362 25.36 -1.616 c
+25.374 -1.072 l
+25.374 -0.625 25.308 -0.29 25.183 -0.073 c
+25.054 0.151 24.874 0.265 24.639 0.265 c
+24.423 0.265 24.25 0.151 24.124 -0.073 c
+24.007 -0.29 23.948 -0.625 23.948 -1.072 c
+h
+29.74 0 m
+29.313 0.03 l
+28.949 0.03 28.71 -0.128 28.593 -0.44 c
+28.593 -3.719 l
+27.285 -3.719 l
+27.285 1.249 l
+28.504 1.249 l
+28.549 0.721 l
+28.755 1.132 29.038 1.338 29.402 1.338 c
+29.549 1.338 29.666 1.316 29.755 1.279 c
+h
+31.974 -1.558 m
+32.635 1.249 l
+34.017 1.249 l
+32.385 -4.469 l
+32.139 -5.31 31.679 -5.732 31.004 -5.732 c
+30.846 -5.732 30.665 -5.703 30.46 -5.644 c
+30.46 -4.63 l
+30.621 -4.63 l
+30.816 -4.63 30.964 -4.59 31.062 -4.513 c
+31.169 -4.432 31.253 -4.295 31.313 -4.101 c
+31.415 -3.763 l
+29.975 1.249 l
+31.371 1.249 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 653.8919 273.5134 cm
+0 0 m
+32.606 0 l
+35.211 0 37.306 -2.098 37.306 -4.704 c
+37.306 -19.829 l
+37.306 -22.434 35.211 -24.529 32.606 -24.529 c
+0 -24.529 l
+-2.606 -24.529 -4.704 -22.434 -4.704 -19.829 c
+-4.704 -4.704 l
+-4.704 -2.098 -2.606 0 0 0 c
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 659.4808 265.2527 cm
+0 0 m
+0.455 2.793 l
+1.691 2.793 l
+0.661 -2.175 l
+-0.411 -2.175 l
+-1.117 0.706 l
+-1.822 -2.175 l
+-2.896 -2.175 l
+-3.925 2.793 l
+-2.675 2.793 l
+-2.234 0 l
+-1.573 2.793 l
+-0.661 2.793 l
+h
+1.951 0.47 m
+1.951 1.224 2.128 1.812 2.481 2.234 c
+2.834 2.664 3.322 2.882 3.95 2.882 c
+4.586 2.882 5.082 2.664 5.435 2.234 c
+5.795 1.812 5.978 1.22 5.978 0.455 c
+5.978 0.147 l
+5.978 -0.61 5.803 -1.201 5.45 -1.631 c
+5.097 -2.055 4.601 -2.263 3.965 -2.263 c
+3.326 -2.263 2.834 -2.055 2.481 -1.631 c
+2.128 -1.201 1.951 -0.61 1.951 0.147 c
+h
+3.26 0.147 m
+3.26 -0.746 3.495 -1.191 3.965 -1.191 c
+4.406 -1.191 4.642 -0.819 4.671 -0.073 c
+4.686 0.47 l
+4.686 0.919 4.619 1.253 4.494 1.47 c
+4.366 1.694 4.185 1.808 3.95 1.808 c
+3.734 1.808 3.561 1.694 3.436 1.47 c
+3.318 1.253 3.26 0.919 3.26 0.47 c
+h
+9.051 1.544 m
+8.625 1.573 l
+8.261 1.573 8.022 1.415 7.904 1.103 c
+7.904 -2.175 l
+6.596 -2.175 l
+6.596 2.793 l
+7.817 2.793 l
+7.86 2.263 l
+8.066 2.675 8.349 2.882 8.713 2.882 c
+8.86 2.882 8.978 2.859 9.066 2.822 c
+h
+11.241 -0.264 m
+10.903 -0.646 l
+10.903 -2.175 l
+9.595 -2.175 l
+9.595 4.881 l
+10.903 4.881 l
+10.903 1.073 l
+11.065 1.309 l
+11.962 2.793 l
+13.504 2.793 l
+12.064 0.75 l
+13.652 -2.175 l
+12.153 -2.175 l
+h
+15.283 -2.175 -1.309 4.968 re
+13.916 4.087 m
+13.916 4.281 13.978 4.443 14.107 4.571 c
+14.232 4.707 14.406 4.777 14.622 4.777 c
+14.836 4.777 15.008 4.707 15.137 4.571 c
+15.262 4.443 15.328 4.281 15.328 4.087 c
+15.328 3.881 15.262 3.707 15.137 3.572 c
+15.019 3.443 14.846 3.381 14.622 3.381 c
+14.406 3.381 14.232 3.443 14.107 3.572 c
+13.978 3.707 13.916 3.881 13.916 4.087 c
+17.382 2.793 m
+17.425 2.308 l
+17.72 2.69 18.102 2.882 18.572 2.882 c
+19.424 2.882 19.866 2.282 19.895 1.088 c
+19.895 -2.175 l
+18.587 -2.175 l
+18.587 1 l
+18.587 1.272 18.543 1.473 18.455 1.602 c
+18.374 1.727 18.227 1.793 18.013 1.793 c
+17.778 1.793 17.595 1.675 17.47 1.44 c
+17.47 -2.175 l
+16.162 -2.175 l
+16.162 2.793 l
+h
+20.49 0.455 m
+20.49 1.278 20.638 1.885 20.931 2.278 c
+21.226 2.679 21.637 2.882 22.167 2.882 c
+22.614 2.882 22.964 2.705 23.21 2.352 c
+23.254 2.793 l
+24.43 2.793 l
+24.43 -2.175 l
+24.43 -2.811 24.246 -3.296 23.886 -3.63 c
+23.534 -3.961 23.023 -4.131 22.358 -4.131 c
+22.092 -4.131 21.806 -4.075 21.504 -3.969 c
+21.2 -3.859 20.976 -3.723 20.829 -3.557 c
+21.269 -2.66 l
+21.394 -2.786 21.556 -2.888 21.755 -2.969 c
+21.949 -3.046 22.129 -3.087 22.298 -3.087 c
+22.593 -3.087 22.802 -3.017 22.931 -2.881 c
+23.056 -2.741 23.122 -2.517 23.122 -2.205 c
+23.122 -1.779 l
+22.875 -2.102 22.552 -2.263 22.152 -2.263 c
+21.622 -2.263 21.211 -2.057 20.916 -1.646 c
+20.63 -1.234 20.49 -0.658 20.49 0.088 c
+h
+21.784 0.133 m
+21.784 -0.331 21.843 -0.661 21.961 -0.867 c
+22.078 -1.073 22.269 -1.176 22.534 -1.176 c
+22.798 -1.176 22.993 -1.084 23.122 -0.897 c
+23.122 1.484 l
+22.993 1.691 22.802 1.793 22.549 1.793 c
+22.284 1.793 22.086 1.683 21.961 1.47 c
+21.843 1.264 21.784 0.926 21.784 0.455 c
+h
+f
+Q
+q 1 0 0 1 653.8806 255.7758 cm
+0 0 m
+0 0.823 0.135 1.429 0.411 1.822 c
+0.694 2.223 1.095 2.425 1.617 2.425 c
+1.999 2.425 2.315 2.263 2.572 1.94 c
+2.572 4.424 l
+3.881 4.424 l
+3.881 -2.631 l
+2.705 -2.631 l
+2.645 -2.132 l
+2.381 -2.525 2.036 -2.72 1.617 -2.72 c
+1.095 -2.72 0.698 -2.525 0.426 -2.132 c
+0.151 -1.731 0.008 -1.143 0 -0.368 c
+h
+1.309 -0.324 m
+1.309 -0.816 1.356 -1.158 1.455 -1.353 c
+1.562 -1.54 1.741 -1.632 1.999 -1.632 c
+2.252 -1.632 2.444 -1.521 2.572 -1.294 c
+2.572 0.97 l
+2.444 1.213 2.252 1.338 1.999 1.338 c
+1.764 1.338 1.587 1.238 1.469 1.043 c
+1.359 0.856 1.309 0.518 1.309 0.029 c
+h
+6.023 -2.631 -1.308 4.968 re
+4.656 3.63 m
+4.656 3.825 4.719 3.987 4.847 4.116 c
+4.972 4.251 5.145 4.322 5.361 4.322 c
+5.575 4.322 5.747 4.251 5.876 4.116 c
+6.001 3.987 6.067 3.825 6.067 3.63 c
+6.067 3.424 6.001 3.252 5.876 3.116 c
+5.758 2.988 5.585 2.925 5.361 2.925 c
+5.145 2.925 4.972 2.988 4.847 3.116 c
+4.719 3.252 4.656 3.424 4.656 3.63 c
+9.385 1.087 m
+8.959 1.117 l
+8.596 1.117 8.357 0.959 8.239 0.646 c
+8.239 -2.631 l
+6.93 -2.631 l
+6.93 2.337 l
+8.151 2.337 l
+8.195 1.808 l
+8.401 2.219 8.683 2.425 9.047 2.425 c
+9.194 2.425 9.311 2.404 9.4 2.366 c
+h
+11.854 -2.72 m
+11.186 -2.72 10.664 -2.525 10.282 -2.132 c
+9.907 -1.731 9.724 -1.158 9.724 -0.412 c
+9.724 -0.015 l
+9.724 0.768 9.893 1.371 10.238 1.793 c
+10.58 2.212 11.075 2.425 11.723 2.425 c
+12.34 2.425 12.802 2.223 13.119 1.822 c
+13.442 1.429 13.604 0.841 13.604 0.058 c
+13.604 -0.588 l
+11.031 -0.588 l
+11.039 -0.952 11.12 -1.22 11.266 -1.397 c
+11.414 -1.565 11.634 -1.646 11.929 -1.646 c
+12.369 -1.646 12.729 -1.496 13.016 -1.191 c
+13.531 -1.985 l
+13.373 -2.201 13.141 -2.378 12.839 -2.514 c
+12.534 -2.65 12.207 -2.72 11.854 -2.72 c
+11.031 0.324 m
+12.34 0.324 l
+12.34 0.441 l
+12.328 0.742 12.274 0.97 12.178 1.117 c
+12.089 1.271 11.932 1.352 11.707 1.352 c
+11.48 1.352 11.314 1.267 11.208 1.103 c
+11.108 0.944 11.05 0.683 11.031 0.324 c
+15.956 -1.646 m
+16.338 -1.646 16.529 -1.404 16.529 -0.912 c
+17.764 -0.912 l
+17.753 -1.452 17.58 -1.889 17.249 -2.22 c
+16.926 -2.554 16.503 -2.72 15.985 -2.72 c
+15.345 -2.72 14.857 -2.525 14.516 -2.132 c
+14.181 -1.731 14.015 -1.143 14.015 -0.368 c
+14.015 0.029 l
+14.015 0.812 14.177 1.404 14.501 1.808 c
+14.832 2.219 15.327 2.425 15.985 2.425 c
+16.533 2.425 16.962 2.252 17.279 1.911 c
+17.591 1.577 17.753 1.103 17.764 0.484 c
+16.529 0.484 l
+16.529 0.757 16.485 0.97 16.397 1.117 c
+16.309 1.271 16.162 1.352 15.956 1.352 c
+15.728 1.352 15.566 1.267 15.47 1.103 c
+15.372 0.944 15.316 0.636 15.309 0.176 c
+15.309 -0.324 l
+15.309 -0.735 15.327 -1.022 15.368 -1.176 c
+15.405 -1.334 15.47 -1.452 15.559 -1.529 c
+15.655 -1.61 15.786 -1.646 15.956 -1.646 c
+19.84 3.557 m
+19.84 2.337 l
+20.502 2.337 l
+20.502 1.367 l
+19.84 1.367 l
+19.84 -1.103 l
+19.84 -1.301 19.862 -1.437 19.914 -1.515 c
+19.972 -1.584 20.079 -1.617 20.237 -1.617 c
+20.355 -1.617 20.457 -1.61 20.546 -1.588 c
+20.531 -2.602 l
+20.303 -2.679 20.064 -2.72 19.81 -2.72 c
+18.977 -2.72 18.554 -2.242 18.547 -1.279 c
+18.547 1.367 l
+17.973 1.367 l
+17.973 2.337 l
+18.547 2.337 l
+18.547 3.557 l
+h
+20.825 0.014 m
+20.825 0.768 21.001 1.356 21.354 1.778 c
+21.707 2.208 22.196 2.425 22.824 2.425 c
+23.459 2.425 23.956 2.208 24.309 1.778 c
+24.669 1.356 24.852 0.764 24.852 0 c
+24.852 -0.309 l
+24.852 -1.066 24.676 -1.658 24.323 -2.088 c
+23.97 -2.51 23.474 -2.72 22.838 -2.72 c
+22.2 -2.72 21.707 -2.51 21.354 -2.088 c
+21.001 -1.658 20.825 -1.066 20.825 -0.309 c
+h
+22.133 -0.309 m
+22.133 -1.202 22.368 -1.646 22.838 -1.646 c
+23.28 -1.646 23.515 -1.276 23.544 -0.53 c
+23.559 0.014 l
+23.559 0.463 23.493 0.797 23.368 1.014 c
+23.239 1.238 23.059 1.352 22.824 1.352 c
+22.607 1.352 22.435 1.238 22.31 1.014 c
+22.192 0.797 22.133 0.463 22.133 0.014 c
+h
+27.925 1.087 m
+27.498 1.117 l
+27.135 1.117 26.896 0.959 26.778 0.646 c
+26.778 -2.631 l
+25.47 -2.631 l
+25.47 2.337 l
+26.69 2.337 l
+26.734 1.808 l
+26.94 2.219 27.222 2.425 27.586 2.425 c
+27.733 2.425 27.851 2.404 27.939 2.366 c
+h
+30.158 -0.47 m
+30.82 2.337 l
+32.201 2.337 l
+30.57 -3.381 l
+30.324 -4.222 29.865 -4.645 29.188 -4.645 c
+29.03 -4.645 28.851 -4.615 28.645 -4.557 c
+28.645 -3.543 l
+28.806 -3.543 l
+29.001 -3.543 29.148 -3.502 29.248 -3.425 c
+29.354 -3.344 29.439 -3.208 29.497 -3.013 c
+29.6 -2.675 l
+28.16 2.337 l
+29.556 2.337 l
+h
+f
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+/GS3 gs
+0 TL/Fm2 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+/GS3 gs
+0 TL/Fm3 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 4 M 1 j 1 J []0 d
+q 1 0 0 1 649.192 239.6172 cm
+0 0 m
+3.193 5.056 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 651.2461 242.8702 cm
+0 0 m
+0.33 -1.473 l
+1.421 2.253 l
+-1.474 -0.335 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 651.2462 242.8702 cm
+0 0 m
+0.33 -1.473 l
+1.421 2.253 l
+-1.474 -0.335 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm4 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm5 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm6 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 584.4681 270.0962 cm
+0 0 m
+5.453 5.056 l
+S
+Q
+q 1 0 0 1 588.3553 273.7013 cm
+0 0 m
+-0.058 -1.507 l
+1.955 1.815 l
+-1.507 0.059 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 588.3554 273.7014 cm
+0 0 m
+-0.059 -1.507 l
+1.955 1.815 l
+-1.507 0.059 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 637.7262 286.0224 cm
+0 0 m
+0 0.459 0.081 0.809 0.25 1.044 c
+0.426 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.279 1.691 1.014 c
+1.72 1.353 l
+2.161 1.353 l
+2.161 -1.66 l
+2.161 -2.032 2.061 -2.315 1.866 -2.514 c
+1.679 -2.708 1.419 -2.807 1.088 -2.807 c
+0.941 -2.807 0.771 -2.767 0.588 -2.69 c
+0.401 -2.62 0.264 -2.532 0.177 -2.425 c
+0.368 -2.088 l
+0.573 -2.293 0.798 -2.396 1.043 -2.396 c
+1.444 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.282 -1.691 1 -1.691 c
+0.684 -1.691 0.441 -1.573 0.264 -1.338 c
+0.096 -1.103 0.008 -0.771 0 -0.338 c
+h
+0.485 -0.279 m
+0.485 -0.613 0.532 -0.86 0.632 -1.014 c
+0.727 -1.172 0.889 -1.249 1.118 -1.249 c
+1.359 -1.249 1.544 -1.128 1.661 -0.882 c
+1.661 0.603 l
+1.544 0.846 1.367 0.97 1.132 0.97 c
+0.904 0.97 0.742 0.889 0.647 0.735 c
+0.548 0.577 0.492 0.339 0.485 0.015 c
+h
+3.227 -1.631 -0.501 2.984 re
+3.256 2.146 m
+3.256 2.058 3.231 1.985 3.183 1.926 c
+3.142 1.874 3.073 1.852 2.977 1.852 c
+2.888 1.852 2.818 1.874 2.771 1.926 c
+2.73 1.985 2.712 2.051 2.712 2.132 c
+2.712 2.22 2.73 2.293 2.771 2.352 c
+2.818 2.411 2.888 2.44 2.977 2.44 c
+3.073 2.44 3.142 2.411 3.183 2.352 c
+3.231 2.293 3.256 2.223 3.256 2.146 c
+4.534 2.072 m
+4.534 1.353 l
+4.991 1.353 l
+4.991 0.956 l
+4.534 0.956 l
+4.534 -0.897 l
+4.534 -1.014 4.553 -1.103 4.594 -1.161 c
+4.63 -1.22 4.7 -1.249 4.8 -1.249 c
+4.858 -1.249 4.92 -1.242 4.991 -1.22 c
+4.991 -1.631 l
+4.873 -1.668 4.759 -1.691 4.652 -1.691 c
+4.453 -1.691 4.303 -1.624 4.197 -1.484 c
+4.098 -1.348 4.05 -1.153 4.05 -0.897 c
+4.05 0.956 l
+3.594 0.956 l
+3.594 1.353 l
+4.05 1.353 l
+4.05 2.072 l
+h
+8.099 -0.867 m
+8.099 -0.76 8.058 -0.673 7.981 -0.602 c
+7.9 -0.525 7.75 -0.437 7.526 -0.338 c
+7.262 -0.231 7.074 -0.139 6.967 -0.058 c
+6.857 0.019 6.78 0.106 6.732 0.206 c
+6.681 0.301 6.659 0.419 6.659 0.559 c
+6.659 0.801 6.747 1.004 6.923 1.162 c
+7.1 1.326 7.324 1.411 7.599 1.411 c
+7.894 1.411 8.129 1.323 8.305 1.147 c
+8.482 0.977 8.569 0.765 8.569 0.5 c
+8.085 0.5 l
+8.085 0.636 8.033 0.75 7.938 0.838 c
+7.85 0.933 7.736 0.985 7.599 0.985 c
+7.453 0.985 7.339 0.944 7.262 0.867 c
+7.181 0.798 7.144 0.698 7.144 0.574 c
+7.144 0.474 7.173 0.397 7.232 0.339 c
+7.291 0.279 7.43 0.198 7.659 0.103 c
+8.018 -0.044 8.264 -0.187 8.393 -0.324 c
+8.529 -0.452 8.599 -0.625 8.599 -0.837 c
+8.599 -1.095 8.503 -1.301 8.32 -1.455 c
+8.143 -1.613 7.908 -1.691 7.614 -1.691 c
+7.298 -1.691 7.044 -1.602 6.85 -1.425 c
+6.662 -1.242 6.57 -1.01 6.57 -0.735 c
+7.056 -0.735 l
+7.063 -0.904 7.115 -1.036 7.202 -1.132 c
+7.298 -1.22 7.437 -1.264 7.614 -1.264 c
+7.769 -1.264 7.886 -1.23 7.967 -1.161 c
+8.056 -1.095 8.099 -0.995 8.099 -0.867 c
+9.687 2.072 m
+9.687 1.353 l
+10.142 1.353 l
+10.142 0.956 l
+9.687 0.956 l
+9.687 -0.897 l
+9.687 -1.014 9.705 -1.103 9.745 -1.161 c
+9.782 -1.22 9.852 -1.249 9.951 -1.249 c
+10.01 -1.249 10.073 -1.242 10.142 -1.22 c
+10.142 -1.631 l
+10.025 -1.668 9.911 -1.691 9.804 -1.691 c
+9.606 -1.691 9.455 -1.624 9.349 -1.484 c
+9.249 -1.348 9.201 -1.153 9.201 -0.897 c
+9.201 0.956 l
+8.746 0.956 l
+8.746 1.353 l
+9.201 1.353 l
+9.201 2.072 l
+h
+12.137 -1.631 m
+12.108 -1.565 12.087 -1.455 12.079 -1.308 c
+11.902 -1.565 11.682 -1.691 11.418 -1.691 c
+11.142 -1.691 10.925 -1.617 10.771 -1.469 c
+10.624 -1.315 10.55 -1.099 10.55 -0.823 c
+10.55 -0.522 10.653 -0.279 10.859 -0.103 c
+11.065 0.081 11.348 0.177 11.711 0.177 c
+12.064 0.177 l
+12.064 0.5 l
+12.064 0.676 12.024 0.798 11.946 0.867 c
+11.866 0.944 11.748 0.985 11.594 0.985 c
+11.447 0.985 11.322 0.941 11.227 0.852 c
+11.138 0.765 11.094 0.654 11.094 0.53 c
+10.609 0.53 l
+10.609 0.676 10.653 0.816 10.741 0.956 c
+10.83 1.103 10.947 1.213 11.094 1.294 c
+11.248 1.371 11.422 1.411 11.609 1.411 c
+11.921 1.411 12.156 1.33 12.314 1.176 c
+12.469 1.029 12.549 0.809 12.549 0.515 c
+12.549 -0.985 l
+12.557 -1.22 12.594 -1.422 12.652 -1.587 c
+12.652 -1.631 l
+h
+11.491 -1.249 m
+11.609 -1.249 11.719 -1.216 11.829 -1.147 c
+11.936 -1.08 12.013 -0.995 12.064 -0.897 c
+12.064 -0.191 l
+11.8 -0.191 l
+11.565 -0.191 11.377 -0.243 11.241 -0.338 c
+11.113 -0.437 11.05 -0.58 11.05 -0.764 c
+11.05 -0.933 11.079 -1.055 11.138 -1.132 c
+11.204 -1.213 11.322 -1.249 11.491 -1.249 c
+14.57 -0.867 m
+14.57 -0.76 14.53 -0.673 14.453 -0.602 c
+14.372 -0.525 14.221 -0.437 13.997 -0.338 c
+13.733 -0.231 13.545 -0.139 13.438 -0.058 c
+13.328 0.019 13.251 0.106 13.203 0.206 c
+13.152 0.301 13.13 0.419 13.13 0.559 c
+13.13 0.801 13.218 1.004 13.394 1.162 c
+13.571 1.326 13.795 1.411 14.071 1.411 c
+14.365 1.411 14.6 1.323 14.776 1.147 c
+14.953 0.977 15.041 0.765 15.041 0.5 c
+14.556 0.5 l
+14.556 0.636 14.504 0.75 14.408 0.838 c
+14.321 0.933 14.207 0.985 14.071 0.985 c
+13.924 0.985 13.81 0.944 13.733 0.867 c
+13.652 0.798 13.615 0.698 13.615 0.574 c
+13.615 0.474 13.645 0.397 13.703 0.339 c
+13.762 0.279 13.901 0.198 14.13 0.103 c
+14.489 -0.044 14.736 -0.187 14.865 -0.324 c
+15 -0.452 15.071 -0.625 15.071 -0.837 c
+15.071 -1.095 14.975 -1.301 14.791 -1.455 c
+14.614 -1.613 14.379 -1.691 14.086 -1.691 c
+13.77 -1.691 13.516 -1.602 13.321 -1.425 c
+13.134 -1.242 13.042 -1.01 13.042 -0.735 c
+13.527 -0.735 l
+13.534 -0.904 13.585 -1.036 13.674 -1.132 c
+13.77 -1.22 13.909 -1.264 14.086 -1.264 c
+14.24 -1.264 14.358 -1.23 14.438 -1.161 c
+14.526 -1.095 14.57 -0.995 14.57 -0.867 c
+16.014 1.044 m
+16.199 1.286 16.434 1.411 16.72 1.411 c
+17.249 1.411 17.518 1.058 17.529 0.353 c
+17.529 -1.631 l
+17.043 -1.631 l
+17.043 0.324 l
+17.043 0.559 17.003 0.724 16.926 0.823 c
+16.845 0.919 16.727 0.97 16.573 0.97 c
+16.455 0.97 16.345 0.929 16.249 0.852 c
+16.151 0.771 16.074 0.665 16.014 0.53 c
+16.014 -1.631 l
+15.53 -1.631 l
+15.53 2.602 l
+16.014 2.602 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 653.715 276.3362 cm
+0 0 m
+-10.796 5.008 -20.332 5.81 -29.005 3.726 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 626.7867 280.5622 cm
+0 0 m
+0.787 1.286 l
+-2.594 -0.624 l
+1.286 -0.791 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 626.7867 280.5622 cm
+0 0 m
+0.787 1.286 l
+-2.594 -0.625 l
+1.286 -0.791 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 606.5934 264.4701 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.426 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.278 1.69 1.014 c
+1.72 1.353 l
+2.161 1.353 l
+2.161 -1.661 l
+2.161 -2.032 2.062 -2.315 1.867 -2.514 c
+1.679 -2.708 1.419 -2.807 1.088 -2.807 c
+0.941 -2.807 0.772 -2.767 0.588 -2.69 c
+0.401 -2.62 0.265 -2.532 0.177 -2.425 c
+0.368 -2.087 l
+0.574 -2.293 0.798 -2.396 1.044 -2.396 c
+1.444 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.283 -1.691 1 -1.691 c
+0.684 -1.691 0.441 -1.573 0.265 -1.338 c
+0.096 -1.103 0.008 -0.771 0 -0.338 c
+h
+0.485 -0.279 m
+0.485 -0.613 0.533 -0.86 0.632 -1.014 c
+0.728 -1.172 0.89 -1.249 1.118 -1.249 c
+1.36 -1.249 1.544 -1.128 1.661 -0.881 c
+1.661 0.603 l
+1.544 0.845 1.367 0.97 1.132 0.97 c
+0.904 0.97 0.742 0.889 0.647 0.735 c
+0.548 0.577 0.493 0.338 0.485 0.015 c
+h
+3.223 -1.631 -0.5 2.984 re
+3.252 2.146 m
+3.252 2.058 3.227 1.984 3.179 1.926 c
+3.138 1.874 3.069 1.852 2.973 1.852 c
+2.885 1.852 2.815 1.874 2.768 1.926 c
+2.727 1.984 2.708 2.051 2.708 2.132 c
+2.708 2.219 2.727 2.294 2.768 2.352 c
+2.815 2.411 2.885 2.44 2.973 2.44 c
+3.069 2.44 3.138 2.411 3.179 2.352 c
+3.227 2.294 3.252 2.223 3.252 2.146 c
+4.532 2.072 m
+4.532 1.353 l
+4.987 1.353 l
+4.987 0.956 l
+4.532 0.956 l
+4.532 -0.897 l
+4.532 -1.014 4.549 -1.103 4.59 -1.161 c
+4.627 -1.22 4.696 -1.249 4.796 -1.249 c
+4.854 -1.249 4.917 -1.242 4.987 -1.22 c
+4.987 -1.631 l
+4.869 -1.668 4.755 -1.691 4.649 -1.691 c
+4.451 -1.691 4.3 -1.625 4.193 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.956 l
+3.591 0.956 l
+3.591 1.353 l
+4.046 1.353 l
+4.046 2.072 l
+h
+8.096 -0.867 m
+8.096 -0.761 8.056 -0.673 7.978 -0.603 c
+7.898 -0.526 7.747 -0.437 7.522 -0.338 c
+7.258 -0.231 7.071 -0.139 6.964 -0.058 c
+6.853 0.019 6.776 0.106 6.729 0.206 c
+6.677 0.301 6.655 0.419 6.655 0.559 c
+6.655 0.802 6.743 1.003 6.92 1.161 c
+7.096 1.326 7.321 1.411 7.596 1.411 c
+7.89 1.411 8.125 1.323 8.301 1.147 c
+8.478 0.977 8.566 0.765 8.566 0.5 c
+8.081 0.5 l
+8.081 0.636 8.029 0.75 7.934 0.838 c
+7.846 0.933 7.732 0.985 7.596 0.985 c
+7.449 0.985 7.335 0.944 7.258 0.867 c
+7.177 0.798 7.14 0.698 7.14 0.573 c
+7.14 0.474 7.169 0.397 7.229 0.338 c
+7.287 0.279 7.427 0.198 7.655 0.103 c
+8.015 -0.044 8.262 -0.187 8.39 -0.324 c
+8.526 -0.452 8.596 -0.625 8.596 -0.838 c
+8.596 -1.095 8.5 -1.301 8.316 -1.455 c
+8.14 -1.613 7.905 -1.691 7.611 -1.691 c
+7.294 -1.691 7.041 -1.602 6.847 -1.426 c
+6.659 -1.242 6.567 -1.01 6.567 -0.735 c
+7.052 -0.735 l
+7.059 -0.904 7.111 -1.037 7.199 -1.132 c
+7.294 -1.22 7.435 -1.264 7.611 -1.264 c
+7.765 -1.264 7.882 -1.231 7.963 -1.161 c
+8.052 -1.095 8.096 -0.996 8.096 -0.867 c
+9.687 2.072 m
+9.687 1.353 l
+10.143 1.353 l
+10.143 0.956 l
+9.687 0.956 l
+9.687 -0.897 l
+9.687 -1.014 9.706 -1.103 9.746 -1.161 c
+9.783 -1.22 9.852 -1.249 9.951 -1.249 c
+10.01 -1.249 10.073 -1.242 10.143 -1.22 c
+10.143 -1.631 l
+10.026 -1.668 9.911 -1.691 9.804 -1.691 c
+9.606 -1.691 9.455 -1.625 9.349 -1.484 c
+9.249 -1.349 9.202 -1.154 9.202 -0.897 c
+9.202 0.956 l
+8.746 0.956 l
+8.746 1.353 l
+9.202 1.353 l
+9.202 2.072 l
+h
+12.135 -1.631 m
+12.104 -1.565 12.083 -1.455 12.075 -1.309 c
+11.899 -1.565 11.678 -1.691 11.414 -1.691 c
+11.138 -1.691 10.922 -1.617 10.768 -1.469 c
+10.62 -1.315 10.547 -1.099 10.547 -0.823 c
+10.547 -0.522 10.65 -0.279 10.855 -0.103 c
+11.061 0.081 11.344 0.177 11.708 0.177 c
+12.061 0.177 l
+12.061 0.5 l
+12.061 0.676 12.021 0.798 11.944 0.867 c
+11.863 0.944 11.745 0.985 11.591 0.985 c
+11.443 0.985 11.319 0.941 11.223 0.852 c
+11.135 0.765 11.09 0.654 11.09 0.53 c
+10.606 0.53 l
+10.606 0.676 10.65 0.816 10.738 0.956 c
+10.826 1.103 10.944 1.213 11.09 1.294 c
+11.245 1.371 11.418 1.411 11.605 1.411 c
+11.917 1.411 12.152 1.33 12.31 1.176 c
+12.465 1.029 12.546 0.808 12.546 0.515 c
+12.546 -0.985 l
+12.553 -1.22 12.59 -1.422 12.649 -1.587 c
+12.649 -1.631 l
+h
+11.487 -1.249 m
+11.605 -1.249 11.715 -1.216 11.826 -1.147 c
+11.932 -1.08 12.01 -0.996 12.061 -0.897 c
+12.061 -0.191 l
+11.796 -0.191 l
+11.561 -0.191 11.374 -0.243 11.238 -0.338 c
+11.109 -0.437 11.046 -0.58 11.046 -0.764 c
+11.046 -0.933 11.076 -1.055 11.135 -1.132 c
+11.201 -1.213 11.319 -1.249 11.487 -1.249 c
+14.567 -0.867 m
+14.567 -0.761 14.527 -0.673 14.45 -0.603 c
+14.369 -0.526 14.218 -0.437 13.993 -0.338 c
+13.729 -0.231 13.542 -0.139 13.436 -0.058 c
+13.325 0.019 13.247 0.106 13.201 0.206 c
+13.149 0.301 13.126 0.419 13.126 0.559 c
+13.126 0.802 13.215 1.003 13.391 1.161 c
+13.567 1.326 13.791 1.411 14.067 1.411 c
+14.361 1.411 14.597 1.323 14.772 1.147 c
+14.949 0.977 15.038 0.765 15.038 0.5 c
+14.552 0.5 l
+14.552 0.636 14.501 0.75 14.406 0.838 c
+14.317 0.933 14.203 0.985 14.067 0.985 c
+13.92 0.985 13.806 0.944 13.729 0.867 c
+13.648 0.798 13.612 0.698 13.612 0.573 c
+13.612 0.474 13.641 0.397 13.7 0.338 c
+13.758 0.279 13.898 0.198 14.126 0.103 c
+14.486 -0.044 14.732 -0.187 14.861 -0.324 c
+14.997 -0.452 15.067 -0.625 15.067 -0.838 c
+15.067 -1.095 14.971 -1.301 14.787 -1.455 c
+14.612 -1.613 14.376 -1.691 14.082 -1.691 c
+13.766 -1.691 13.513 -1.602 13.318 -1.426 c
+13.13 -1.242 13.039 -1.01 13.039 -0.735 c
+13.523 -0.735 l
+13.531 -0.904 13.582 -1.037 13.671 -1.132 c
+13.766 -1.22 13.906 -1.264 14.082 -1.264 c
+14.236 -1.264 14.354 -1.231 14.435 -1.161 c
+14.523 -1.095 14.567 -0.996 14.567 -0.867 c
+16.011 1.043 m
+16.195 1.286 16.43 1.411 16.717 1.411 c
+17.246 1.411 17.514 1.058 17.525 0.353 c
+17.525 -1.631 l
+17.041 -1.631 l
+17.041 0.324 l
+17.041 0.559 17 0.724 16.923 0.823 c
+16.842 0.919 16.724 0.97 16.57 0.97 c
+16.453 0.97 16.342 0.929 16.247 0.852 c
+16.147 0.771 16.07 0.665 16.011 0.53 c
+16.011 -1.631 l
+15.526 -1.631 l
+15.526 2.602 l
+16.011 2.602 l
+h
+21.417 -0.279 m
+21.417 -0.75 21.332 -1.103 21.167 -1.338 c
+20.998 -1.573 20.759 -1.691 20.447 -1.691 c
+20.141 -1.691 19.91 -1.58 19.755 -1.352 c
+19.755 -2.778 l
+19.271 -2.778 l
+19.271 1.353 l
+19.711 1.353 l
+19.741 1.014 l
+19.896 1.278 20.127 1.411 20.432 1.411 c
+20.763 1.411 21.009 1.294 21.167 1.058 c
+21.332 0.831 21.417 0.492 21.417 0.044 c
+h
+20.931 0 m
+20.931 0.331 20.877 0.577 20.77 0.735 c
+20.671 0.889 20.509 0.97 20.285 0.97 c
+20.05 0.97 19.873 0.852 19.755 0.617 c
+19.755 -0.926 l
+19.873 -1.154 20.054 -1.264 20.299 -1.264 c
+20.513 -1.264 20.671 -1.187 20.77 -1.029 c
+20.877 -0.875 20.931 -0.632 20.931 -0.309 c
+h
+21.77 0 m
+21.77 0.43 21.872 0.771 22.078 1.029 c
+22.292 1.282 22.57 1.411 22.916 1.411 c
+23.258 1.411 23.534 1.282 23.74 1.029 c
+23.952 0.783 24.066 0.449 24.077 0.029 c
+24.077 -0.279 l
+24.077 -0.713 23.967 -1.055 23.754 -1.309 c
+23.549 -1.565 23.269 -1.691 22.916 -1.691 c
+22.57 -1.691 22.298 -1.569 22.093 -1.323 c
+21.887 -1.08 21.777 -0.746 21.77 -0.324 c
+h
+22.255 -0.279 m
+22.255 -0.595 22.313 -0.838 22.431 -1.014 c
+22.556 -1.183 22.718 -1.264 22.916 -1.264 c
+23.346 -1.264 23.57 -0.956 23.592 -0.338 c
+23.592 0 l
+23.592 0.301 23.526 0.544 23.401 0.721 c
+23.283 0.897 23.121 0.985 22.916 0.985 c
+22.718 0.985 22.556 0.897 22.431 0.721 c
+22.313 0.544 22.255 0.301 22.255 0 c
+h
+26.664 -0.279 m
+26.664 -0.75 26.58 -1.103 26.414 -1.338 c
+26.246 -1.573 26.007 -1.691 25.694 -1.691 c
+25.39 -1.691 25.157 -1.58 25.003 -1.352 c
+25.003 -2.778 l
+24.519 -2.778 l
+24.519 1.353 l
+24.96 1.353 l
+24.989 1.014 l
+25.143 1.278 25.375 1.411 25.679 1.411 c
+26.011 1.411 26.256 1.294 26.414 1.058 c
+26.58 0.831 26.664 0.492 26.664 0.044 c
+h
+26.179 0 m
+26.179 0.331 26.124 0.577 26.018 0.735 c
+25.918 0.889 25.757 0.97 25.533 0.97 c
+25.297 0.97 25.121 0.852 25.003 0.617 c
+25.003 -0.926 l
+25.121 -1.154 25.301 -1.264 25.548 -1.264 c
+25.76 -1.264 25.918 -1.187 26.018 -1.029 c
+26.124 -0.875 26.179 -0.632 26.179 -0.309 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 619.5765 272.9739 cm
+0 0 m
+6.644 -3.018 14.244 -5.796 25.808 -5.322 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 643.2534 267.5639 cm
+0 0 m
+-1.022 -1.11 l
+2.664 0.111 l
+-1.11 1.026 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 643.2535 267.5639 cm
+0 0 m
+-1.022 -1.11 l
+2.664 0.111 l
+-1.11 1.026 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 664.6398 301.7215 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.427 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.278 1.69 1.014 c
+1.721 1.352 l
+2.161 1.352 l
+2.161 -1.661 l
+2.161 -2.032 2.062 -2.315 1.867 -2.514 c
+1.68 -2.708 1.419 -2.808 1.088 -2.808 c
+0.941 -2.808 0.772 -2.768 0.588 -2.691 c
+0.401 -2.62 0.265 -2.533 0.177 -2.425 c
+0.368 -2.087 l
+0.574 -2.294 0.798 -2.396 1.044 -2.396 c
+1.445 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.283 -1.691 1 -1.691 c
+0.684 -1.691 0.441 -1.573 0.265 -1.338 c
+0.096 -1.103 0.008 -0.772 0 -0.339 c
+h
+0.485 -0.279 m
+0.485 -0.614 0.533 -0.86 0.632 -1.014 c
+0.728 -1.172 0.89 -1.249 1.118 -1.249 c
+1.36 -1.249 1.544 -1.129 1.661 -0.882 c
+1.661 0.602 l
+1.544 0.845 1.368 0.97 1.133 0.97 c
+0.904 0.97 0.742 0.889 0.647 0.735 c
+0.548 0.577 0.493 0.338 0.485 0.014 c
+h
+3.227 -1.632 -0.499 2.984 re
+3.256 2.146 m
+3.256 2.057 3.231 1.984 3.182 1.926 c
+3.142 1.874 3.072 1.851 2.977 1.851 c
+2.889 1.851 2.819 1.874 2.771 1.926 c
+2.731 1.984 2.712 2.05 2.712 2.131 c
+2.712 2.219 2.731 2.293 2.771 2.352 c
+2.819 2.41 2.889 2.439 2.977 2.439 c
+3.072 2.439 3.142 2.41 3.182 2.352 c
+3.231 2.293 3.256 2.223 3.256 2.146 c
+4.532 2.072 m
+4.532 1.352 l
+4.987 1.352 l
+4.987 0.955 l
+4.532 0.955 l
+4.532 -0.897 l
+4.532 -1.014 4.549 -1.103 4.59 -1.162 c
+4.627 -1.22 4.697 -1.249 4.796 -1.249 c
+4.855 -1.249 4.917 -1.243 4.987 -1.22 c
+4.987 -1.632 l
+4.869 -1.669 4.755 -1.691 4.649 -1.691 c
+4.451 -1.691 4.3 -1.625 4.193 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.955 l
+3.591 0.955 l
+3.591 1.352 l
+4.046 1.352 l
+4.046 2.072 l
+h
+7.894 0.897 m
+7.824 0.904 7.751 0.911 7.674 0.911 c
+7.416 0.911 7.24 0.771 7.144 0.5 c
+7.144 -1.632 l
+6.66 -1.632 l
+6.66 1.352 l
+7.13 1.352 l
+7.144 1.043 l
+7.269 1.286 7.453 1.411 7.688 1.411 c
+7.765 1.411 7.828 1.396 7.879 1.367 c
+h
+9.272 -1.691 m
+8.897 -1.691 8.614 -1.584 8.42 -1.367 c
+8.221 -1.143 8.125 -0.817 8.125 -0.383 c
+8.125 -0.015 l
+8.125 0.426 8.217 0.771 8.405 1.028 c
+8.599 1.282 8.875 1.411 9.228 1.411 c
+9.569 1.411 9.823 1.297 9.992 1.072 c
+10.168 0.845 10.261 0.5 10.271 0.029 c
+10.271 -0.279 l
+8.611 -0.279 l
+8.611 -0.353 l
+8.611 -0.676 8.669 -0.912 8.786 -1.058 c
+8.904 -1.199 9.073 -1.264 9.301 -1.264 c
+9.448 -1.264 9.573 -1.243 9.683 -1.191 c
+9.79 -1.132 9.893 -1.044 9.992 -0.927 c
+10.242 -1.235 l
+10.036 -1.54 9.713 -1.691 9.272 -1.691 c
+9.228 0.985 m
+9.022 0.985 8.867 0.914 8.772 0.779 c
+8.673 0.639 8.618 0.426 8.611 0.132 c
+9.786 0.132 l
+9.786 0.205 l
+9.764 0.477 9.713 0.675 9.625 0.793 c
+9.536 0.918 9.405 0.985 9.228 0.985 c
+12.123 -0.867 m
+12.123 -0.761 12.083 -0.673 12.006 -0.603 c
+11.925 -0.526 11.774 -0.437 11.55 -0.339 c
+11.286 -0.231 11.098 -0.14 10.992 -0.059 c
+10.882 0.018 10.804 0.106 10.756 0.205 c
+10.705 0.301 10.683 0.419 10.683 0.558 c
+10.683 0.801 10.771 1.003 10.947 1.161 c
+11.124 1.326 11.348 1.411 11.624 1.411 c
+11.917 1.411 12.152 1.323 12.329 1.146 c
+12.505 0.977 12.594 0.764 12.594 0.5 c
+12.108 0.5 l
+12.108 0.635 12.057 0.75 11.961 0.837 c
+11.873 0.933 11.759 0.985 11.624 0.985 c
+11.477 0.985 11.363 0.944 11.286 0.867 c
+11.205 0.797 11.168 0.698 11.168 0.573 c
+11.168 0.474 11.198 0.397 11.256 0.338 c
+11.315 0.279 11.454 0.198 11.682 0.103 c
+12.042 -0.044 12.289 -0.188 12.418 -0.324 c
+12.553 -0.453 12.623 -0.625 12.623 -0.838 c
+12.623 -1.095 12.528 -1.301 12.343 -1.455 c
+12.168 -1.613 11.932 -1.691 11.638 -1.691 c
+11.323 -1.691 11.069 -1.602 10.874 -1.426 c
+10.687 -1.243 10.595 -1.011 10.595 -0.736 c
+11.08 -0.736 l
+11.088 -0.904 11.138 -1.037 11.227 -1.132 c
+11.323 -1.22 11.462 -1.264 11.638 -1.264 c
+11.793 -1.264 11.911 -1.231 11.992 -1.162 c
+12.079 -1.095 12.123 -0.996 12.123 -0.867 c
+14.137 -1.691 m
+13.762 -1.691 13.48 -1.584 13.284 -1.367 c
+13.087 -1.143 12.991 -0.817 12.991 -0.383 c
+12.991 -0.015 l
+12.991 0.426 13.083 0.771 13.27 1.028 c
+13.465 1.282 13.74 1.411 14.093 1.411 c
+14.435 1.411 14.689 1.297 14.857 1.072 c
+15.034 0.845 15.126 0.5 15.137 0.029 c
+15.137 -0.279 l
+13.476 -0.279 l
+13.476 -0.353 l
+13.476 -0.676 13.534 -0.912 13.652 -1.058 c
+13.77 -1.199 13.939 -1.264 14.167 -1.264 c
+14.313 -1.264 14.438 -1.243 14.549 -1.191 c
+14.656 -1.132 14.758 -1.044 14.857 -0.927 c
+15.107 -1.235 l
+14.901 -1.54 14.579 -1.691 14.137 -1.691 c
+14.093 0.985 m
+13.887 0.985 13.733 0.914 13.638 0.779 c
+13.538 0.639 13.483 0.426 13.476 0.132 c
+14.652 0.132 l
+14.652 0.205 l
+14.629 0.477 14.579 0.675 14.49 0.793 c
+14.402 0.918 14.269 0.985 14.093 0.985 c
+16.181 2.072 m
+16.181 1.352 l
+16.636 1.352 l
+16.636 0.955 l
+16.181 0.955 l
+16.181 -0.897 l
+16.181 -1.014 16.199 -1.103 16.239 -1.162 c
+16.276 -1.22 16.345 -1.249 16.445 -1.249 c
+16.503 -1.249 16.566 -1.243 16.636 -1.22 c
+16.636 -1.632 l
+16.518 -1.669 16.405 -1.691 16.298 -1.691 c
+16.1 -1.691 15.949 -1.625 15.842 -1.484 c
+15.743 -1.349 15.695 -1.154 15.695 -0.897 c
+15.695 0.955 l
+15.24 0.955 l
+15.24 1.352 l
+15.695 1.352 l
+15.695 2.072 l
+h
+20.995 -1.632 m
+20.495 -1.632 l
+20.495 0.22 l
+18.878 0.22 l
+18.878 -1.632 l
+18.363 -1.632 l
+18.363 2.381 l
+18.878 2.381 l
+18.878 0.661 l
+20.495 0.661 l
+20.495 2.381 l
+20.995 2.381 l
+h
+23.563 0.22 m
+22.152 0.22 l
+22.152 -1.206 l
+23.798 -1.206 l
+23.798 -1.632 l
+21.637 -1.632 l
+21.637 2.381 l
+23.769 2.381 l
+23.769 1.94 l
+22.152 1.94 l
+22.152 0.661 l
+23.563 0.661 l
+h
+26.132 -0.588 m
+24.779 -0.588 l
+24.456 -1.632 l
+23.942 -1.632 l
+25.235 2.381 l
+25.661 2.381 l
+26.969 -1.632 l
+26.44 -1.632 l
+h
+24.912 -0.148 m
+25.999 -0.148 l
+25.455 1.675 l
+h
+27.285 -1.632 m
+27.285 2.381 l
+28.256 2.381 l
+28.715 2.381 29.072 2.234 29.328 1.94 c
+29.593 1.646 29.725 1.234 29.725 0.706 c
+29.725 0.029 l
+29.725 -0.5 29.593 -0.912 29.328 -1.206 c
+29.072 -1.492 28.696 -1.632 28.197 -1.632 c
+h
+27.8 1.94 m
+27.8 -1.206 l
+28.197 -1.206 l
+28.557 -1.206 28.818 -1.103 28.976 -0.897 c
+29.141 -0.691 29.226 -0.389 29.226 0.014 c
+29.226 0.72 l
+29.226 1.139 29.141 1.448 28.976 1.646 c
+28.818 1.841 28.579 1.94 28.256 1.94 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 700.2778 300.817 cm
+0 0 m
+-10.796 -4.575 -16.874 -12.02 -16.76 -23.684 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 683.4952 279.2684 cm
+0 0 m
+-1.077 1.055 l
+0.026 -2.668 l
+1.059 1.077 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 683.4952 279.2684 cm
+0 0 m
+-1.077 1.055 l
+0.026 -2.668 l
+1.059 1.077 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 702.545 271.8379 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.427 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.278 1.69 1.014 c
+1.72 1.353 l
+2.161 1.353 l
+2.161 -1.661 l
+2.161 -2.032 2.062 -2.315 1.867 -2.514 c
+1.68 -2.708 1.419 -2.807 1.088 -2.807 c
+0.941 -2.807 0.772 -2.767 0.588 -2.69 c
+0.401 -2.62 0.265 -2.532 0.177 -2.425 c
+0.368 -2.087 l
+0.574 -2.293 0.798 -2.396 1.044 -2.396 c
+1.445 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.283 -1.69 1 -1.69 c
+0.684 -1.69 0.441 -1.573 0.265 -1.338 c
+0.096 -1.103 0.008 -0.771 0 -0.338 c
+h
+0.485 -0.279 m
+0.485 -0.613 0.533 -0.86 0.632 -1.014 c
+0.728 -1.172 0.89 -1.249 1.118 -1.249 c
+1.36 -1.249 1.544 -1.128 1.661 -0.881 c
+1.661 0.603 l
+1.544 0.845 1.368 0.97 1.133 0.97 c
+0.904 0.97 0.742 0.889 0.647 0.735 c
+0.547 0.577 0.493 0.338 0.485 0.015 c
+h
+3.223 -1.631 -0.5 2.984 re
+3.252 2.146 m
+3.252 2.058 3.227 1.984 3.179 1.926 c
+3.138 1.874 3.069 1.852 2.974 1.852 c
+2.885 1.852 2.816 1.874 2.768 1.926 c
+2.727 1.984 2.708 2.051 2.708 2.132 c
+2.708 2.219 2.727 2.294 2.768 2.352 c
+2.816 2.411 2.885 2.44 2.974 2.44 c
+3.069 2.44 3.138 2.411 3.179 2.352 c
+3.227 2.294 3.252 2.223 3.252 2.146 c
+4.532 2.072 m
+4.532 1.353 l
+4.987 1.353 l
+4.987 0.956 l
+4.532 0.956 l
+4.532 -0.897 l
+4.532 -1.014 4.549 -1.103 4.59 -1.161 c
+4.627 -1.22 4.697 -1.249 4.796 -1.249 c
+4.855 -1.249 4.917 -1.242 4.987 -1.22 c
+4.987 -1.631 l
+4.869 -1.668 4.755 -1.69 4.649 -1.69 c
+4.451 -1.69 4.3 -1.625 4.193 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.956 l
+3.591 0.956 l
+3.591 1.353 l
+4.046 1.353 l
+4.046 2.072 l
+h
+8.184 -1.631 m
+8.154 -1.565 8.133 -1.455 8.125 -1.309 c
+7.949 -1.565 7.728 -1.69 7.464 -1.69 c
+7.188 -1.69 6.972 -1.617 6.817 -1.469 c
+6.67 -1.315 6.596 -1.099 6.596 -0.823 c
+6.596 -0.522 6.699 -0.279 6.905 -0.103 c
+7.111 0.081 7.394 0.177 7.757 0.177 c
+8.11 0.177 l
+8.11 0.5 l
+8.11 0.676 8.07 0.798 7.992 0.867 c
+7.913 0.945 7.795 0.985 7.64 0.985 c
+7.493 0.985 7.368 0.941 7.273 0.852 c
+7.184 0.765 7.14 0.654 7.14 0.53 c
+6.656 0.53 l
+6.656 0.676 6.699 0.816 6.787 0.956 c
+6.876 1.103 6.993 1.213 7.14 1.294 c
+7.294 1.371 7.468 1.411 7.655 1.411 c
+7.967 1.411 8.202 1.33 8.36 1.176 c
+8.515 1.029 8.596 0.808 8.596 0.515 c
+8.596 -0.985 l
+8.603 -1.22 8.64 -1.422 8.698 -1.587 c
+8.698 -1.631 l
+h
+7.537 -1.249 m
+7.655 -1.249 7.765 -1.216 7.875 -1.147 c
+7.982 -1.08 8.059 -0.996 8.11 -0.897 c
+8.11 -0.191 l
+7.846 -0.191 l
+7.611 -0.191 7.423 -0.243 7.287 -0.338 c
+7.159 -0.437 7.096 -0.58 7.096 -0.764 c
+7.096 -0.933 7.126 -1.055 7.184 -1.132 c
+7.25 -1.213 7.368 -1.249 7.537 -1.249 c
+9.073 0 m
+9.073 0.459 9.154 0.808 9.324 1.043 c
+9.5 1.286 9.75 1.411 10.073 1.411 c
+10.356 1.411 10.577 1.294 10.735 1.058 c
+10.735 2.602 l
+11.219 2.602 l
+11.219 -1.631 l
+10.778 -1.631 l
+10.749 -1.309 l
+10.591 -1.565 10.367 -1.69 10.073 -1.69 c
+9.756 -1.69 9.515 -1.573 9.338 -1.338 c
+9.162 -1.095 9.073 -0.75 9.073 -0.309 c
+h
+9.559 -0.279 m
+9.559 -0.613 9.606 -0.86 9.706 -1.014 c
+9.801 -1.172 9.962 -1.249 10.19 -1.249 c
+10.433 -1.249 10.617 -1.132 10.735 -0.897 c
+10.735 0.617 l
+10.606 0.852 10.425 0.97 10.19 0.97 c
+9.962 0.97 9.801 0.889 9.706 0.735 c
+9.606 0.577 9.559 0.338 9.559 0.015 c
+h
+11.69 0 m
+11.69 0.459 11.771 0.808 11.94 1.043 c
+12.116 1.286 12.366 1.411 12.69 1.411 c
+12.972 1.411 13.193 1.294 13.351 1.058 c
+13.351 2.602 l
+13.835 2.602 l
+13.835 -1.631 l
+13.395 -1.631 l
+13.365 -1.309 l
+13.207 -1.565 12.983 -1.69 12.69 -1.69 c
+12.374 -1.69 12.131 -1.573 11.954 -1.338 c
+11.778 -1.095 11.69 -0.75 11.69 -0.309 c
+h
+12.175 -0.279 m
+12.175 -0.613 12.223 -0.86 12.322 -1.014 c
+12.418 -1.172 12.579 -1.249 12.807 -1.249 c
+13.049 -1.249 13.233 -1.132 13.351 -0.897 c
+13.351 0.617 l
+13.222 0.852 13.042 0.97 12.807 0.97 c
+12.579 0.97 12.418 0.889 12.322 0.735 c
+12.223 0.577 12.175 0.338 12.175 0.015 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 693.4612 270.8827 cm
+0 0 m
+10.797 4.571 16.875 12.016 16.764 23.68 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 710.2439 292.4276 cm
+0 0 m
+1.077 -1.055 l
+-0.025 2.668 l
+-1.055 -1.077 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 710.244 292.4276 cm
+0 0 m
+1.077 -1.055 l
+-0.025 2.668 l
+-1.055 -1.077 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm7 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm8 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm9 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm10 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 745.1474 289.2892 cm
+0 0 m
+-3.205 6.184 l
+S
+Q
+q 1 0 0 1 742.9236 293.5782 cm
+0 0 m
+1.437 -0.456 l
+-1.228 2.37 l
+-0.456 -1.438 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 742.9237 293.5782 cm
+0 0 m
+1.437 -0.456 l
+-1.228 2.37 l
+-0.456 -1.438 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 711.5555 341.2288 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.427 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.278 1.69 1.014 c
+1.721 1.352 l
+2.161 1.352 l
+2.161 -1.661 l
+2.161 -2.032 2.062 -2.315 1.867 -2.514 c
+1.68 -2.708 1.419 -2.808 1.088 -2.808 c
+0.941 -2.808 0.772 -2.768 0.589 -2.691 c
+0.401 -2.62 0.265 -2.533 0.177 -2.425 c
+0.368 -2.087 l
+0.574 -2.294 0.798 -2.396 1.044 -2.396 c
+1.445 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.283 -1.691 1 -1.691 c
+0.684 -1.691 0.441 -1.573 0.265 -1.338 c
+0.096 -1.103 0.008 -0.772 0 -0.339 c
+h
+0.485 -0.279 m
+0.485 -0.614 0.533 -0.86 0.632 -1.014 c
+0.728 -1.172 0.89 -1.249 1.118 -1.249 c
+1.36 -1.249 1.544 -1.128 1.661 -0.882 c
+1.661 0.602 l
+1.544 0.845 1.368 0.97 1.133 0.97 c
+0.904 0.97 0.743 0.889 0.647 0.735 c
+0.548 0.577 0.493 0.338 0.485 0.014 c
+h
+3.223 -1.632 -0.5 2.984 re
+3.253 2.146 m
+3.253 2.057 3.227 1.984 3.179 1.926 c
+3.138 1.874 3.069 1.852 2.974 1.852 c
+2.885 1.852 2.816 1.874 2.768 1.926 c
+2.727 1.984 2.708 2.05 2.708 2.131 c
+2.708 2.219 2.727 2.293 2.768 2.352 c
+2.816 2.41 2.885 2.44 2.974 2.44 c
+3.069 2.44 3.138 2.41 3.179 2.352 c
+3.227 2.293 3.253 2.223 3.253 2.146 c
+4.532 2.072 m
+4.532 1.352 l
+4.987 1.352 l
+4.987 0.955 l
+4.532 0.955 l
+4.532 -0.897 l
+4.532 -1.014 4.549 -1.103 4.59 -1.162 c
+4.627 -1.22 4.697 -1.249 4.796 -1.249 c
+4.855 -1.249 4.917 -1.243 4.987 -1.22 c
+4.987 -1.632 l
+4.869 -1.669 4.755 -1.691 4.649 -1.691 c
+4.451 -1.691 4.3 -1.625 4.194 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.955 l
+3.591 0.955 l
+3.591 1.352 l
+4.046 1.352 l
+4.046 2.072 l
+h
+7.684 -1.264 m
+7.849 -1.264 7.982 -1.216 8.081 -1.118 c
+8.177 -1.022 8.231 -0.879 8.243 -0.691 c
+8.699 -0.691 l
+8.688 -0.977 8.585 -1.216 8.389 -1.411 c
+8.202 -1.598 7.967 -1.691 7.684 -1.691 c
+7.321 -1.691 7.041 -1.573 6.847 -1.338 c
+6.648 -1.103 6.552 -0.757 6.552 -0.294 c
+6.552 0.029 l
+6.552 0.478 6.644 0.823 6.832 1.058 c
+7.026 1.294 7.31 1.411 7.684 1.411 c
+7.986 1.411 8.229 1.311 8.404 1.117 c
+8.588 0.918 8.688 0.654 8.699 0.324 c
+8.243 0.324 l
+8.221 0.548 8.162 0.713 8.067 0.823 c
+7.978 0.929 7.849 0.985 7.684 0.985 c
+7.468 0.985 7.306 0.912 7.199 0.764 c
+7.1 0.625 7.045 0.397 7.038 0.073 c
+7.038 -0.309 l
+7.038 -0.661 7.086 -0.912 7.184 -1.058 c
+7.291 -1.199 7.456 -1.264 7.684 -1.264 c
+8.992 0 m
+8.992 0.43 9.095 0.771 9.301 1.029 c
+9.515 1.282 9.794 1.411 10.139 1.411 c
+10.481 1.411 10.756 1.282 10.962 1.029 c
+11.175 0.783 11.289 0.448 11.3 0.029 c
+11.3 -0.279 l
+11.3 -0.713 11.19 -1.055 10.977 -1.309 c
+10.771 -1.565 10.492 -1.691 10.139 -1.691 c
+9.794 -1.691 9.522 -1.569 9.316 -1.323 c
+9.11 -1.081 9 -0.746 8.992 -0.324 c
+h
+9.478 -0.279 m
+9.478 -0.595 9.536 -0.838 9.654 -1.014 c
+9.779 -1.183 9.941 -1.264 10.139 -1.264 c
+10.569 -1.264 10.793 -0.956 10.816 -0.339 c
+10.816 0 l
+10.816 0.301 10.749 0.544 10.624 0.72 c
+10.506 0.897 10.345 0.985 10.139 0.985 c
+9.941 0.985 9.779 0.897 9.654 0.72 c
+9.536 0.544 9.478 0.301 9.478 0 c
+h
+12.197 1.352 m
+12.212 1.072 l
+12.388 1.297 12.627 1.411 12.932 1.411 c
+13.263 1.411 13.494 1.264 13.623 0.97 c
+13.806 1.264 14.068 1.411 14.402 1.411 c
+14.961 1.411 15.244 1.066 15.254 0.382 c
+15.254 -1.632 l
+14.77 -1.632 l
+14.77 0.338 l
+14.77 0.551 14.729 0.709 14.652 0.808 c
+14.571 0.914 14.438 0.97 14.255 0.97 c
+14.108 0.97 13.991 0.912 13.902 0.794 c
+13.814 0.683 13.759 0.544 13.74 0.367 c
+13.74 -1.632 l
+13.255 -1.632 l
+13.255 0.353 l
+13.245 0.764 13.072 0.97 12.74 0.97 c
+12.495 0.97 12.322 0.845 12.227 0.602 c
+12.227 -1.632 l
+11.741 -1.632 l
+11.741 1.352 l
+h
+16.158 1.352 m
+16.173 1.072 l
+16.349 1.297 16.588 1.411 16.894 1.411 c
+17.224 1.411 17.455 1.264 17.584 0.97 c
+17.768 1.264 18.029 1.411 18.363 1.411 c
+18.922 1.411 19.205 1.066 19.216 0.382 c
+19.216 -1.632 l
+18.731 -1.632 l
+18.731 0.338 l
+18.731 0.551 18.691 0.709 18.613 0.808 c
+18.533 0.914 18.4 0.97 18.216 0.97 c
+18.07 0.97 17.952 0.912 17.864 0.794 c
+17.775 0.683 17.72 0.544 17.702 0.367 c
+17.702 -1.632 l
+17.216 -1.632 l
+17.216 0.353 l
+17.206 0.764 17.033 0.97 16.702 0.97 c
+16.456 0.97 16.283 0.845 16.188 0.602 c
+16.188 -1.632 l
+15.703 -1.632 l
+15.703 1.352 l
+h
+20.193 -1.632 -0.5 2.984 re
+20.223 2.146 m
+20.223 2.057 20.197 1.984 20.149 1.926 c
+20.109 1.874 20.039 1.852 19.944 1.852 c
+19.855 1.852 19.786 1.874 19.738 1.926 c
+19.697 1.984 19.678 2.05 19.678 2.131 c
+19.678 2.219 19.697 2.293 19.738 2.352 c
+19.786 2.41 19.855 2.44 19.944 2.44 c
+20.039 2.44 20.109 2.41 20.149 2.352 c
+20.197 2.293 20.223 2.223 20.223 2.146 c
+21.498 2.072 m
+21.498 1.352 l
+21.953 1.352 l
+21.953 0.955 l
+21.498 0.955 l
+21.498 -0.897 l
+21.498 -1.014 21.517 -1.103 21.557 -1.162 c
+21.594 -1.22 21.663 -1.249 21.762 -1.249 c
+21.821 -1.249 21.883 -1.243 21.953 -1.22 c
+21.953 -1.632 l
+21.836 -1.669 21.722 -1.691 21.615 -1.691 c
+21.417 -1.691 21.266 -1.625 21.16 -1.484 c
+21.06 -1.349 21.012 -1.154 21.012 -0.897 c
+21.012 0.955 l
+20.557 0.955 l
+20.557 1.352 l
+21.012 1.352 l
+21.012 2.072 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 715.6204 326.614 cm
+0 0 m
+-4.572 10.797 -12.017 16.875 -23.68 16.764 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 694.071 343.3966 cm
+0 0 m
+1.059 1.077 l
+-2.664 -0.025 l
+1.077 -1.055 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 694.071 343.3966 cm
+0 0 m
+1.059 1.077 l
+-2.664 -0.025 l
+1.077 -1.055 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm11 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm12 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm13 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm14 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 634.5146 329.9282 cm
+0 0 m
+5.074 5.056 l
+S
+Q
+q 1 0 0 1 638.0789 333.4787 cm
+0 0 m
+-0.004 -1.507 l
+1.889 1.882 l
+-1.506 0.003 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 638.0789 333.4787 cm
+0 0 m
+-0.004 -1.507 l
+1.889 1.882 l
+-1.506 0.003 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS4 gs
+0 TL/Fm15 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS5 gs
+0 TL/Fm16 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS5 gs
+0 TL/Fm17 Do
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 563.3862 425.8473 cm
+0 0 m
+54.018 0 l
+56.624 0 58.722 -2.098 58.722 -4.704 c
+58.722 -21.406 l
+58.722 -24.01 56.624 -26.109 54.018 -26.109 c
+0 -26.109 l
+-2.606 -26.109 -4.701 -24.01 -4.701 -21.406 c
+-4.701 -4.704 l
+-4.701 -2.098 -2.606 0 0 0 c
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 570.5405 419.8831 cm
+0 0 m
+-0.426 0.029 l
+-0.79 0.029 -1.029 -0.129 -1.147 -0.441 c
+-1.147 -3.719 l
+-2.454 -3.719 l
+-2.454 1.249 l
+-1.234 1.249 l
+-1.191 0.721 l
+-0.985 1.132 -0.702 1.338 -0.338 1.338 c
+-0.191 1.338 -0.073 1.316 0.015 1.279 c
+h
+2.469 -3.807 m
+1.801 -3.807 1.278 -3.612 0.896 -3.219 c
+0.522 -2.818 0.338 -2.246 0.338 -1.5 c
+0.338 -1.103 l
+0.338 -0.32 0.507 0.283 0.852 0.706 c
+1.195 1.124 1.69 1.338 2.337 1.338 c
+2.955 1.338 3.418 1.135 3.734 0.735 c
+4.057 0.341 4.218 -0.247 4.218 -1.029 c
+4.218 -1.675 l
+1.646 -1.675 l
+1.654 -2.04 1.735 -2.308 1.881 -2.484 c
+2.028 -2.653 2.249 -2.734 2.543 -2.734 c
+2.984 -2.734 3.344 -2.583 3.63 -2.279 c
+4.145 -3.072 l
+3.987 -3.289 3.755 -3.465 3.454 -3.601 c
+3.15 -3.738 2.822 -3.807 2.469 -3.807 c
+1.646 -0.764 m
+2.955 -0.764 l
+2.955 -0.646 l
+2.944 -0.345 2.888 -0.118 2.793 0.029 c
+2.705 0.183 2.547 0.264 2.323 0.264 c
+2.095 0.264 1.929 0.181 1.823 0.015 c
+1.723 -0.143 1.665 -0.405 1.646 -0.764 c
+5.997 1.249 m
+6.041 0.794 l
+6.335 1.154 6.718 1.338 7.188 1.338 c
+7.688 1.338 8.04 1.118 8.246 0.676 c
+8.529 1.118 8.937 1.338 9.467 1.338 c
+10.326 1.338 10.774 0.738 10.803 -0.455 c
+10.803 -3.719 l
+9.496 -3.719 l
+9.496 -0.544 l
+9.496 -0.261 9.455 -0.058 9.378 0.059 c
+9.297 0.183 9.165 0.25 8.981 0.25 c
+8.735 0.25 8.555 0.103 8.437 -0.191 c
+8.437 -3.719 l
+7.144 -3.719 l
+7.144 -0.559 l
+7.144 -0.276 7.104 -0.07 7.026 0.059 c
+6.945 0.183 6.809 0.25 6.614 0.25 c
+6.387 0.25 6.211 0.133 6.086 -0.103 c
+6.086 -3.719 l
+4.792 -3.719 l
+4.792 1.249 l
+h
+11.333 -1.072 m
+11.333 -0.32 11.509 0.268 11.862 0.691 c
+12.215 1.121 12.704 1.338 13.332 1.338 c
+13.968 1.338 14.464 1.121 14.817 0.691 c
+15.177 0.268 15.36 -0.324 15.36 -1.088 c
+15.36 -1.396 l
+15.36 -2.153 15.184 -2.745 14.832 -3.175 c
+14.479 -3.597 13.982 -3.807 13.347 -3.807 c
+12.707 -3.807 12.215 -3.597 11.862 -3.175 c
+11.509 -2.745 11.333 -2.153 11.333 -1.396 c
+h
+12.642 -1.396 m
+12.642 -2.289 12.877 -2.734 13.347 -2.734 c
+13.787 -2.734 14.023 -2.363 14.053 -1.617 c
+14.067 -1.072 l
+14.067 -0.625 14.001 -0.29 13.876 -0.073 c
+13.747 0.15 13.567 0.264 13.332 0.264 c
+13.115 0.264 12.943 0.15 12.818 -0.073 c
+12.7 -0.29 12.642 -0.625 12.642 -1.072 c
+h
+17.492 2.469 m
+17.492 1.249 l
+18.153 1.249 l
+18.153 0.279 l
+17.492 0.279 l
+17.492 -2.19 l
+17.492 -2.389 17.514 -2.524 17.565 -2.601 c
+17.624 -2.672 17.731 -2.705 17.889 -2.705 c
+18.007 -2.705 18.109 -2.697 18.198 -2.676 c
+18.183 -3.69 l
+17.955 -3.767 17.716 -3.807 17.463 -3.807 c
+16.628 -3.807 16.206 -3.329 16.199 -2.366 c
+16.199 0.279 l
+15.625 0.279 l
+15.625 1.249 l
+16.199 1.249 l
+16.199 2.469 l
+h
+20.762 -3.807 m
+20.093 -3.807 19.572 -3.612 19.189 -3.219 c
+18.815 -2.818 18.631 -2.246 18.631 -1.5 c
+18.631 -1.103 l
+18.631 -0.32 18.8 0.283 19.146 0.706 c
+19.487 1.124 19.983 1.338 20.63 1.338 c
+21.247 1.338 21.71 1.135 22.026 0.735 c
+22.35 0.341 22.512 -0.247 22.512 -1.029 c
+22.512 -1.675 l
+19.939 -1.675 l
+19.946 -2.04 20.027 -2.308 20.174 -2.484 c
+20.322 -2.653 20.542 -2.734 20.835 -2.734 c
+21.277 -2.734 21.637 -2.583 21.924 -2.279 c
+22.438 -3.072 l
+22.28 -3.289 22.049 -3.465 21.747 -3.601 c
+21.442 -3.738 21.115 -3.807 20.762 -3.807 c
+19.939 -0.764 m
+21.247 -0.764 l
+21.247 -0.646 l
+21.236 -0.345 21.182 -0.118 21.086 0.029 c
+20.997 0.183 20.839 0.264 20.615 0.264 c
+20.388 0.264 20.222 0.181 20.116 0.015 c
+20.016 -0.143 19.958 -0.405 19.939 -0.764 c
+27.605 0 m
+27.179 0.029 l
+26.815 0.029 26.576 -0.129 26.458 -0.441 c
+26.458 -3.719 l
+25.15 -3.719 l
+25.15 1.249 l
+26.37 1.249 l
+26.414 0.721 l
+26.62 1.132 26.903 1.338 27.266 1.338 c
+27.414 1.338 27.532 1.316 27.619 1.279 c
+h
+30.074 -3.807 m
+29.406 -3.807 28.883 -3.612 28.502 -3.219 c
+28.126 -2.818 27.943 -2.246 27.943 -1.5 c
+27.943 -1.103 l
+27.943 -0.32 28.112 0.283 28.457 0.706 c
+28.799 1.124 29.296 1.338 29.942 1.338 c
+30.559 1.338 31.023 1.135 31.339 0.735 c
+31.661 0.341 31.823 -0.247 31.823 -1.029 c
+31.823 -1.675 l
+29.251 -1.675 l
+29.259 -2.04 29.34 -2.308 29.487 -2.484 c
+29.633 -2.653 29.853 -2.734 30.148 -2.734 c
+30.589 -2.734 30.948 -2.583 31.235 -2.279 c
+31.75 -3.072 l
+31.592 -3.289 31.36 -3.465 31.059 -3.601 c
+30.754 -3.738 30.427 -3.807 30.074 -3.807 c
+29.251 -0.764 m
+30.559 -0.764 l
+30.559 -0.646 l
+30.549 -0.345 30.493 -0.118 30.398 0.029 c
+30.31 0.183 30.152 0.264 29.928 0.264 c
+29.699 0.264 29.534 0.181 29.427 0.015 c
+29.328 -0.143 29.269 -0.405 29.251 -0.764 c
+36.263 -1.396 m
+36.263 -2.171 36.122 -2.771 35.851 -3.189 c
+35.586 -3.601 35.189 -3.807 34.661 -3.807 c
+34.256 -3.807 33.932 -3.645 33.691 -3.322 c
+33.691 -5.629 l
+32.382 -5.629 l
+32.382 1.249 l
+33.587 1.249 l
+33.631 0.794 l
+33.885 1.154 34.223 1.338 34.646 1.338 c
+35.175 1.338 35.572 1.147 35.836 0.765 c
+36.108 0.382 36.251 -0.213 36.263 -1.014 c
+h
+34.969 -1.058 m
+34.969 -0.58 34.914 -0.243 34.807 -0.044 c
+34.697 0.15 34.517 0.25 34.264 0.25 c
+33.999 0.25 33.808 0.14 33.691 -0.073 c
+33.691 -2.41 l
+33.808 -2.628 34.003 -2.734 34.279 -2.734 c
+34.532 -2.734 34.709 -2.628 34.807 -2.41 c
+34.914 -2.186 34.969 -1.849 34.969 -1.396 c
+h
+36.714 -1.072 m
+36.714 -0.32 36.891 0.268 37.244 0.691 c
+37.597 1.121 38.085 1.338 38.713 1.338 c
+39.349 1.338 39.846 1.121 40.199 0.691 c
+40.558 0.268 40.742 -0.324 40.742 -1.088 c
+40.742 -1.396 l
+40.742 -2.153 40.566 -2.745 40.213 -3.175 c
+39.86 -3.597 39.364 -3.807 38.728 -3.807 c
+38.089 -3.807 37.597 -3.597 37.244 -3.175 c
+36.891 -2.745 36.714 -2.153 36.714 -1.396 c
+h
+38.023 -1.396 m
+38.023 -2.289 38.258 -2.734 38.728 -2.734 c
+39.17 -2.734 39.405 -2.363 39.434 -1.617 c
+39.449 -1.072 l
+39.449 -0.625 39.382 -0.29 39.258 -0.073 c
+39.129 0.15 38.948 0.264 38.713 0.264 c
+38.497 0.264 38.324 0.15 38.2 -0.073 c
+38.082 -0.29 38.023 -0.625 38.023 -1.072 c
+h
+f
+Q
+q 1 0 0 1 564.4878 408.9507 cm
+0 0 m
+0 0.684 0.077 1.341 0.235 1.97 c
+0.39 2.606 0.632 3.167 0.956 3.66 c
+1.279 4.16 1.621 4.505 1.985 4.704 c
+2.22 3.983 l
+1.875 3.66 1.603 3.16 1.397 2.484 c
+1.199 1.816 1.096 1.043 1.088 0.162 c
+1.088 -0.118 l
+1.088 -1.04 1.183 -1.849 1.382 -2.543 c
+1.588 -3.237 1.867 -3.755 2.22 -4.101 c
+1.985 -4.806 l
+1.621 -4.619 1.279 -4.281 0.956 -3.792 c
+0.64 -3.3 0.401 -2.749 0.235 -2.132 c
+0.077 -1.514 0 -0.867 0 -0.191 c
+h
+4.032 2.249 m
+4.075 1.764 l
+4.37 2.146 4.752 2.337 5.222 2.337 c
+6.075 2.337 6.516 1.738 6.546 0.544 c
+6.546 -2.72 l
+5.237 -2.72 l
+5.237 0.455 l
+5.237 0.727 5.193 0.929 5.104 1.058 c
+5.024 1.183 4.877 1.249 4.664 1.249 c
+4.429 1.249 4.245 1.132 4.12 0.897 c
+4.12 -2.72 l
+2.812 -2.72 l
+2.812 2.249 l
+h
+9.65 -2.72 m
+9.61 -2.643 9.569 -2.514 9.532 -2.337 c
+9.305 -2.653 8.992 -2.807 8.592 -2.807 c
+8.169 -2.807 7.82 -2.672 7.549 -2.396 c
+7.284 -2.124 7.151 -1.764 7.151 -1.323 c
+7.151 -0.804 7.313 -0.405 7.637 -0.118 c
+7.967 0.166 8.449 0.312 9.077 0.324 c
+9.474 0.324 l
+9.474 0.721 l
+9.474 0.944 9.434 1.103 9.357 1.191 c
+9.276 1.278 9.166 1.323 9.018 1.323 c
+8.695 1.323 8.533 1.135 8.533 0.765 c
+7.24 0.765 l
+7.24 1.213 7.408 1.588 7.755 1.881 c
+8.096 2.182 8.533 2.337 9.062 2.337 c
+9.599 2.337 10.018 2.194 10.311 1.911 c
+10.613 1.635 10.768 1.235 10.768 0.706 c
+10.768 -1.631 l
+10.775 -2.065 10.841 -2.404 10.959 -2.645 c
+10.959 -2.72 l
+h
+8.886 -1.793 m
+9.022 -1.793 9.139 -1.764 9.239 -1.705 c
+9.345 -1.646 9.422 -1.58 9.474 -1.5 c
+9.474 -0.47 l
+9.166 -0.47 l
+8.937 -0.47 8.761 -0.54 8.636 -0.676 c
+8.507 -0.816 8.445 -0.999 8.445 -1.234 c
+8.445 -1.61 8.592 -1.793 8.886 -1.793 c
+12.755 2.249 m
+12.8 1.793 l
+13.093 2.153 13.476 2.337 13.946 2.337 c
+14.446 2.337 14.799 2.117 15.005 1.675 c
+15.287 2.117 15.695 2.337 16.225 2.337 c
+17.085 2.337 17.533 1.738 17.562 0.544 c
+17.562 -2.72 l
+16.254 -2.72 l
+16.254 0.455 l
+16.254 0.738 16.214 0.941 16.136 1.058 c
+16.056 1.183 15.923 1.249 15.74 1.249 c
+15.493 1.249 15.313 1.103 15.196 0.808 c
+15.196 -2.72 l
+13.902 -2.72 l
+13.902 0.441 l
+13.902 0.724 13.862 0.929 13.785 1.058 c
+13.704 1.183 13.567 1.249 13.373 1.249 c
+13.145 1.249 12.969 1.132 12.844 0.897 c
+12.844 -2.72 l
+11.55 -2.72 l
+11.55 2.249 l
+h
+20.252 -2.807 m
+19.583 -2.807 19.061 -2.612 18.679 -2.219 c
+18.305 -1.819 18.121 -1.246 18.121 -0.5 c
+18.121 -0.103 l
+18.121 0.68 18.29 1.282 18.635 1.706 c
+18.977 2.124 19.473 2.337 20.12 2.337 c
+20.737 2.337 21.201 2.135 21.517 1.735 c
+21.839 1.341 22.001 0.754 22.001 -0.029 c
+22.001 -0.676 l
+19.429 -0.676 l
+19.437 -1.04 19.518 -1.309 19.664 -1.484 c
+19.811 -1.654 20.031 -1.735 20.326 -1.735 c
+20.767 -1.735 21.127 -1.584 21.413 -1.278 c
+21.928 -2.072 l
+21.77 -2.29 21.538 -2.466 21.237 -2.602 c
+20.931 -2.738 20.605 -2.807 20.252 -2.807 c
+19.429 0.235 m
+20.737 0.235 l
+20.737 0.353 l
+20.726 0.654 20.671 0.882 20.576 1.029 c
+20.487 1.183 20.329 1.264 20.105 1.264 c
+19.877 1.264 19.712 1.18 19.605 1.014 c
+19.506 0.856 19.447 0.595 19.429 0.235 c
+22.662 -2.057 m
+22.662 -1.852 22.729 -1.683 22.868 -1.544 c
+23.015 -1.407 23.2 -1.338 23.427 -1.338 c
+23.64 -1.338 23.817 -1.407 23.956 -1.544 c
+24.104 -1.672 24.177 -1.845 24.177 -2.057 c
+24.177 -2.275 24.104 -2.448 23.956 -2.572 c
+23.817 -2.701 23.64 -2.763 23.427 -2.763 c
+23.2 -2.763 23.015 -2.701 22.868 -2.572 c
+22.729 -2.448 22.662 -2.275 22.662 -2.057 c
+22.662 1.706 m
+22.662 1.911 22.729 2.08 22.868 2.219 c
+23.015 2.356 23.2 2.425 23.427 2.425 c
+23.64 2.425 23.817 2.356 23.956 2.219 c
+24.104 2.091 24.177 1.918 24.177 1.706 c
+24.177 1.488 24.104 1.315 23.956 1.191 c
+23.817 1.062 23.64 1 23.427 1 c
+23.2 1 23.015 1.062 22.868 1.191 c
+22.729 1.315 22.662 1.488 22.662 1.706 c
+26.98 -0.073 m
+26.98 0.68 27.157 1.268 27.51 1.69 c
+27.863 2.12 28.351 2.337 28.979 2.337 c
+29.615 2.337 30.111 2.12 30.464 1.69 c
+30.824 1.268 31.008 0.676 31.008 -0.088 c
+31.008 -0.397 l
+31.008 -1.154 30.832 -1.745 30.479 -2.175 c
+30.126 -2.598 29.63 -2.807 28.995 -2.807 c
+28.355 -2.807 27.863 -2.598 27.51 -2.175 c
+27.157 -1.745 26.98 -1.154 26.98 -0.397 c
+h
+28.289 -0.397 m
+28.289 -1.29 28.524 -1.735 28.995 -1.735 c
+29.436 -1.735 29.671 -1.363 29.7 -0.617 c
+29.714 -0.073 l
+29.714 0.374 29.648 0.709 29.523 0.926 c
+29.395 1.151 29.215 1.264 28.979 1.264 c
+28.763 1.264 28.59 1.151 28.465 0.926 c
+28.347 0.709 28.289 0.374 28.289 -0.073 c
+h
+34.08 1 m
+33.654 1.029 l
+33.29 1.029 33.051 0.871 32.933 0.559 c
+32.933 -2.72 l
+31.626 -2.72 l
+31.626 2.249 l
+32.846 2.249 l
+32.889 1.72 l
+33.095 2.132 33.378 2.337 33.742 2.337 c
+33.889 2.337 34.007 2.315 34.095 2.278 c
+h
+35.991 -2.72 -1.308 4.969 re
+34.624 3.543 m
+34.624 3.738 34.687 3.899 34.815 4.027 c
+34.94 4.164 35.113 4.233 35.329 4.233 c
+35.543 4.233 35.715 4.164 35.844 4.027 c
+35.969 3.899 36.035 3.738 36.035 3.543 c
+36.035 3.337 35.969 3.164 35.844 3.028 c
+35.726 2.899 35.553 2.837 35.329 2.837 c
+35.113 2.837 34.94 2.899 34.815 3.028 c
+34.687 3.164 34.624 3.337 34.624 3.543 c
+36.752 -0.088 m
+36.752 0.735 36.899 1.341 37.193 1.735 c
+37.487 2.135 37.899 2.337 38.427 2.337 c
+38.876 2.337 39.225 2.161 39.471 1.808 c
+39.515 2.249 l
+40.691 2.249 l
+40.691 -2.72 l
+40.691 -3.355 40.507 -3.84 40.147 -4.174 c
+39.794 -4.505 39.283 -4.675 38.618 -4.675 c
+38.354 -4.675 38.067 -4.619 37.766 -4.513 c
+37.461 -4.403 37.236 -4.266 37.09 -4.101 c
+37.531 -3.204 l
+37.656 -3.329 37.818 -3.432 38.016 -3.513 c
+38.211 -3.59 38.391 -3.63 38.56 -3.63 c
+38.853 -3.63 39.063 -3.561 39.192 -3.425 c
+39.316 -3.285 39.383 -3.061 39.383 -2.749 c
+39.383 -2.323 l
+39.137 -2.645 38.813 -2.807 38.412 -2.807 c
+37.884 -2.807 37.472 -2.602 37.178 -2.19 c
+36.891 -1.779 36.752 -1.201 36.752 -0.455 c
+h
+38.045 -0.411 m
+38.045 -0.875 38.104 -1.205 38.221 -1.411 c
+38.339 -1.617 38.531 -1.72 38.795 -1.72 c
+39.06 -1.72 39.254 -1.628 39.383 -1.44 c
+39.383 0.941 l
+39.254 1.147 39.063 1.249 38.809 1.249 c
+38.545 1.249 38.346 1.139 38.221 0.926 c
+38.104 0.721 38.045 0.382 38.045 -0.088 c
+h
+42.819 -2.72 -1.309 4.969 re
+41.452 3.543 m
+41.452 3.738 41.514 3.899 41.643 4.027 c
+41.768 4.164 41.94 4.233 42.157 4.233 c
+42.371 4.233 42.543 4.164 42.672 4.027 c
+42.797 3.899 42.863 3.738 42.863 3.543 c
+42.863 3.337 42.797 3.164 42.672 3.028 c
+42.554 2.899 42.381 2.837 42.157 2.837 c
+41.94 2.837 41.768 2.899 41.643 3.028 c
+41.514 3.164 41.452 3.337 41.452 3.543 c
+44.917 2.249 m
+44.961 1.764 l
+45.255 2.146 45.637 2.337 46.107 2.337 c
+46.96 2.337 47.401 1.738 47.43 0.544 c
+47.43 -2.72 l
+46.123 -2.72 l
+46.123 0.455 l
+46.123 0.727 46.078 0.929 45.99 1.058 c
+45.909 1.183 45.762 1.249 45.549 1.249 c
+45.314 1.249 45.13 1.132 45.005 0.897 c
+45.005 -2.72 l
+43.697 -2.72 l
+43.697 2.249 l
+h
+50.26 -0.103 m
+50.26 -0.819 50.165 -1.496 49.981 -2.132 c
+49.805 -2.767 49.554 -3.326 49.231 -3.807 c
+48.908 -4.285 48.563 -4.619 48.203 -4.806 c
+47.967 -4.101 l
+48.309 -3.767 48.577 -3.256 48.775 -2.572 c
+48.981 -1.889 49.088 -1.11 49.099 -0.235 c
+49.099 0.015 l
+49.099 0.904 48.996 1.698 48.79 2.396 c
+48.592 3.102 48.32 3.634 47.967 3.998 c
+48.203 4.704 l
+48.438 4.586 48.677 4.384 48.922 4.101 c
+49.165 3.825 49.386 3.484 49.584 3.072 c
+49.79 2.66 49.951 2.194 50.069 1.675 c
+50.194 1.165 50.26 0.573 50.26 -0.103 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 661.8731 424.5284 cm
+0 0 m
+54.019 0 l
+56.624 0 58.723 -2.099 58.723 -4.704 c
+58.723 -21.409 l
+58.723 -24.015 56.624 -26.109 54.019 -26.109 c
+0 -26.109 l
+-2.606 -26.109 -4.7 -24.015 -4.7 -21.409 c
+-4.7 -4.704 l
+-4.7 -2.099 -2.606 0 0 0 c
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 669.0274 418.5641 cm
+0 0 m
+-0.426 0.029 l
+-0.789 0.029 -1.028 -0.129 -1.146 -0.441 c
+-1.146 -3.719 l
+-2.454 -3.719 l
+-2.454 1.249 l
+-1.234 1.249 l
+-1.19 0.72 l
+-0.984 1.132 -0.702 1.338 -0.338 1.338 c
+-0.191 1.338 -0.073 1.315 0.015 1.278 c
+h
+2.469 -3.807 m
+1.802 -3.807 1.279 -3.612 0.898 -3.219 c
+0.522 -2.818 0.339 -2.246 0.339 -1.5 c
+0.339 -1.103 l
+0.339 -0.32 0.508 0.283 0.853 0.706 c
+1.195 1.124 1.691 1.338 2.338 1.338 c
+2.955 1.338 3.418 1.135 3.734 0.735 c
+4.057 0.341 4.219 -0.246 4.219 -1.029 c
+4.219 -1.675 l
+1.646 -1.675 l
+1.654 -2.04 1.735 -2.308 1.882 -2.484 c
+2.029 -2.654 2.249 -2.734 2.544 -2.734 c
+2.984 -2.734 3.344 -2.583 3.631 -2.278 c
+4.146 -3.072 l
+3.988 -3.289 3.756 -3.466 3.454 -3.601 c
+3.15 -3.738 2.822 -3.807 2.469 -3.807 c
+1.646 -0.765 m
+2.955 -0.765 l
+2.955 -0.647 l
+2.944 -0.345 2.889 -0.118 2.793 0.029 c
+2.705 0.183 2.547 0.264 2.323 0.264 c
+2.095 0.264 1.93 0.18 1.823 0.014 c
+1.724 -0.144 1.665 -0.405 1.646 -0.765 c
+5.997 1.249 m
+6.041 0.794 l
+6.336 1.153 6.718 1.338 7.188 1.338 c
+7.688 1.338 8.041 1.117 8.247 0.676 c
+8.53 1.117 8.937 1.338 9.467 1.338 c
+10.327 1.338 10.775 0.738 10.804 -0.456 c
+10.804 -3.719 l
+9.496 -3.719 l
+9.496 -0.544 l
+9.496 -0.262 9.455 -0.059 9.378 0.058 c
+9.297 0.183 9.166 0.249 8.981 0.249 c
+8.736 0.249 8.555 0.103 8.438 -0.191 c
+8.438 -3.719 l
+7.144 -3.719 l
+7.144 -0.559 l
+7.144 -0.276 7.104 -0.07 7.026 0.058 c
+6.945 0.183 6.81 0.249 6.615 0.249 c
+6.388 0.249 6.211 0.132 6.086 -0.103 c
+6.086 -3.719 l
+4.792 -3.719 l
+4.792 1.249 l
+h
+11.333 -1.073 m
+11.333 -0.32 11.51 0.268 11.863 0.691 c
+12.216 1.12 12.704 1.338 13.332 1.338 c
+13.968 1.338 14.464 1.12 14.817 0.691 c
+15.177 0.268 15.361 -0.324 15.361 -1.087 c
+15.361 -1.397 l
+15.361 -2.153 15.185 -2.745 14.832 -3.175 c
+14.479 -3.597 13.983 -3.807 13.347 -3.807 c
+12.708 -3.807 12.216 -3.597 11.863 -3.175 c
+11.51 -2.745 11.333 -2.153 11.333 -1.397 c
+h
+12.642 -1.397 m
+12.642 -2.29 12.877 -2.734 13.347 -2.734 c
+13.788 -2.734 14.024 -2.363 14.053 -1.617 c
+14.068 -1.073 l
+14.068 -0.625 14.001 -0.291 13.876 -0.073 c
+13.748 0.151 13.567 0.264 13.332 0.264 c
+13.116 0.264 12.943 0.151 12.818 -0.073 c
+12.7 -0.291 12.642 -0.625 12.642 -1.073 c
+h
+17.492 2.469 m
+17.492 1.249 l
+18.153 1.249 l
+18.153 0.279 l
+17.492 0.279 l
+17.492 -2.19 l
+17.492 -2.389 17.515 -2.525 17.565 -2.602 c
+17.625 -2.672 17.731 -2.705 17.889 -2.705 c
+18.007 -2.705 18.109 -2.697 18.198 -2.675 c
+18.184 -3.69 l
+17.955 -3.767 17.717 -3.807 17.463 -3.807 c
+16.629 -3.807 16.206 -3.329 16.199 -2.367 c
+16.199 0.279 l
+15.626 0.279 l
+15.626 1.249 l
+16.199 1.249 l
+16.199 2.469 l
+h
+20.759 -3.807 m
+20.09 -3.807 19.568 -3.612 19.186 -3.219 c
+18.812 -2.818 18.628 -2.246 18.628 -1.5 c
+18.628 -1.103 l
+18.628 -0.32 18.797 0.283 19.142 0.706 c
+19.484 1.124 19.98 1.338 20.627 1.338 c
+21.245 1.338 21.708 1.135 22.024 0.735 c
+22.346 0.341 22.508 -0.246 22.508 -1.029 c
+22.508 -1.675 l
+19.936 -1.675 l
+19.944 -2.04 20.025 -2.308 20.171 -2.484 c
+20.318 -2.654 20.539 -2.734 20.833 -2.734 c
+21.274 -2.734 21.634 -2.583 21.92 -2.278 c
+22.435 -3.072 l
+22.277 -3.289 22.045 -3.466 21.744 -3.601 c
+21.44 -3.738 21.112 -3.807 20.759 -3.807 c
+19.936 -0.765 m
+21.245 -0.765 l
+21.245 -0.647 l
+21.234 -0.345 21.178 -0.118 21.083 0.029 c
+20.995 0.183 20.836 0.264 20.613 0.264 c
+20.384 0.264 20.219 0.18 20.112 0.014 c
+20.013 -0.144 19.954 -0.405 19.936 -0.765 c
+27.605 0 m
+27.179 0.029 l
+26.815 0.029 26.576 -0.129 26.458 -0.441 c
+26.458 -3.719 l
+25.151 -3.719 l
+25.151 1.249 l
+26.371 1.249 l
+26.415 0.72 l
+26.62 1.132 26.903 1.338 27.267 1.338 c
+27.414 1.338 27.532 1.315 27.62 1.278 c
+h
+30.075 -3.807 m
+29.406 -3.807 28.885 -3.612 28.502 -3.219 c
+28.127 -2.818 27.944 -2.246 27.944 -1.5 c
+27.944 -1.103 l
+27.944 -0.32 28.112 0.283 28.457 0.706 c
+28.8 1.124 29.296 1.338 29.943 1.338 c
+30.56 1.338 31.023 1.135 31.339 0.735 c
+31.663 0.341 31.824 -0.246 31.824 -1.029 c
+31.824 -1.675 l
+29.251 -1.675 l
+29.259 -2.04 29.34 -2.308 29.487 -2.484 c
+29.633 -2.654 29.854 -2.734 30.148 -2.734 c
+30.589 -2.734 30.949 -2.583 31.236 -2.278 c
+31.75 -3.072 l
+31.593 -3.289 31.361 -3.466 31.059 -3.601 c
+30.755 -3.738 30.427 -3.807 30.075 -3.807 c
+29.251 -0.765 m
+30.56 -0.765 l
+30.56 -0.647 l
+30.549 -0.345 30.494 -0.118 30.398 0.029 c
+30.31 0.183 30.152 0.264 29.928 0.264 c
+29.7 0.264 29.535 0.18 29.428 0.014 c
+29.329 -0.144 29.27 -0.405 29.251 -0.765 c
+36.263 -1.397 m
+36.263 -2.172 36.124 -2.771 35.852 -3.19 c
+35.587 -3.601 35.19 -3.807 34.661 -3.807 c
+34.257 -3.807 33.933 -3.645 33.691 -3.322 c
+33.691 -5.63 l
+32.382 -5.63 l
+32.382 1.249 l
+33.588 1.249 l
+33.631 0.794 l
+33.885 1.153 34.223 1.338 34.647 1.338 c
+35.175 1.338 35.572 1.147 35.837 0.764 c
+36.108 0.382 36.252 -0.214 36.263 -1.014 c
+h
+34.969 -1.058 m
+34.969 -0.58 34.915 -0.243 34.807 -0.044 c
+34.697 0.151 34.518 0.249 34.264 0.249 c
+33.999 0.249 33.808 0.139 33.691 -0.073 c
+33.691 -2.411 l
+33.808 -2.627 34.003 -2.734 34.279 -2.734 c
+34.532 -2.734 34.709 -2.627 34.807 -2.411 c
+34.915 -2.186 34.969 -1.849 34.969 -1.397 c
+h
+36.715 -1.073 m
+36.715 -0.32 36.891 0.268 37.244 0.691 c
+37.597 1.12 38.086 1.338 38.714 1.338 c
+39.35 1.338 39.846 1.12 40.199 0.691 c
+40.559 0.268 40.742 -0.324 40.742 -1.087 c
+40.742 -1.397 l
+40.742 -2.153 40.567 -2.745 40.214 -3.175 c
+39.861 -3.597 39.364 -3.807 38.728 -3.807 c
+38.09 -3.807 37.597 -3.597 37.244 -3.175 c
+36.891 -2.745 36.715 -2.153 36.715 -1.397 c
+h
+38.023 -1.397 m
+38.023 -2.29 38.258 -2.734 38.728 -2.734 c
+39.17 -2.734 39.405 -2.363 39.434 -1.617 c
+39.449 -1.073 l
+39.449 -0.625 39.383 -0.291 39.258 -0.073 c
+39.129 0.151 38.949 0.264 38.714 0.264 c
+38.497 0.264 38.325 0.151 38.2 -0.073 c
+38.082 -0.291 38.023 -0.625 38.023 -1.073 c
+h
+f
+Q
+q 1 0 0 1 662.4357 407.6318 cm
+0 0 m
+0 0.683 0.077 1.341 0.235 1.969 c
+0.389 2.605 0.632 3.167 0.955 3.659 c
+1.278 4.16 1.62 4.505 1.984 4.704 c
+2.219 3.983 l
+1.874 3.659 1.602 3.16 1.396 2.484 c
+1.198 1.815 1.095 1.043 1.087 0.162 c
+1.087 -0.118 l
+1.087 -1.04 1.182 -1.849 1.381 -2.543 c
+1.587 -3.238 1.866 -3.755 2.219 -4.102 c
+1.984 -4.807 l
+1.62 -4.619 1.278 -4.281 0.955 -3.793 c
+0.639 -3.3 0.4 -2.749 0.235 -2.132 c
+0.077 -1.515 0 -0.867 0 -0.191 c
+h
+4.031 2.248 m
+4.075 1.764 l
+4.369 2.146 4.751 2.337 5.221 2.337 c
+6.074 2.337 6.515 1.738 6.545 0.544 c
+6.545 -2.72 l
+5.236 -2.72 l
+5.236 0.455 l
+5.236 0.727 5.192 0.929 5.103 1.058 c
+5.023 1.183 4.876 1.249 4.663 1.249 c
+4.428 1.249 4.244 1.132 4.119 0.897 c
+4.119 -2.72 l
+2.811 -2.72 l
+2.811 2.248 l
+h
+9.653 -2.72 m
+9.612 -2.643 9.572 -2.514 9.535 -2.338 c
+9.308 -2.654 8.995 -2.808 8.595 -2.808 c
+8.172 -2.808 7.823 -2.672 7.551 -2.396 c
+7.287 -2.124 7.154 -1.764 7.154 -1.324 c
+7.154 -0.805 7.316 -0.405 7.64 -0.118 c
+7.97 0.165 8.452 0.312 9.08 0.323 c
+9.477 0.323 l
+9.477 0.72 l
+9.477 0.945 9.437 1.103 9.359 1.19 c
+9.278 1.278 9.168 1.323 9.022 1.323 c
+8.698 1.323 8.536 1.135 8.536 0.764 c
+7.243 0.764 l
+7.243 1.213 7.412 1.587 7.757 1.882 c
+8.099 2.183 8.536 2.337 9.065 2.337 c
+9.602 2.337 10.021 2.194 10.314 1.911 c
+10.616 1.635 10.77 1.234 10.77 0.706 c
+10.77 -1.632 l
+10.778 -2.066 10.844 -2.404 10.961 -2.646 c
+10.961 -2.72 l
+h
+8.889 -1.794 m
+9.024 -1.794 9.142 -1.764 9.242 -1.706 c
+9.348 -1.646 9.425 -1.58 9.477 -1.5 c
+9.477 -0.47 l
+9.168 -0.47 l
+8.941 -0.47 8.764 -0.541 8.639 -0.676 c
+8.511 -0.816 8.448 -1 8.448 -1.235 c
+8.448 -1.61 8.595 -1.794 8.889 -1.794 c
+12.755 2.248 m
+12.799 1.793 l
+13.093 2.153 13.475 2.337 13.945 2.337 c
+14.445 2.337 14.798 2.117 15.004 1.675 c
+15.287 2.117 15.694 2.337 16.224 2.337 c
+17.084 2.337 17.532 1.738 17.562 0.544 c
+17.562 -2.72 l
+16.253 -2.72 l
+16.253 0.455 l
+16.253 0.738 16.213 0.941 16.135 1.058 c
+16.055 1.183 15.922 1.249 15.739 1.249 c
+15.492 1.249 15.312 1.103 15.195 0.808 c
+15.195 -2.72 l
+13.901 -2.72 l
+13.901 0.44 l
+13.901 0.723 13.861 0.929 13.784 1.058 c
+13.703 1.183 13.567 1.249 13.372 1.249 c
+13.144 1.249 12.968 1.132 12.843 0.897 c
+12.843 -2.72 l
+11.549 -2.72 l
+11.549 2.248 l
+h
+20.251 -2.808 m
+19.582 -2.808 19.06 -2.613 18.678 -2.22 c
+18.304 -1.819 18.12 -1.246 18.12 -0.5 c
+18.12 -0.103 l
+18.12 0.679 18.289 1.282 18.634 1.705 c
+18.977 2.124 19.472 2.337 20.119 2.337 c
+20.737 2.337 21.2 2.135 21.516 1.734 c
+21.838 1.341 22 0.753 22 -0.03 c
+22 -0.676 l
+19.428 -0.676 l
+19.436 -1.04 19.517 -1.309 19.663 -1.484 c
+19.81 -1.654 20.031 -1.735 20.325 -1.735 c
+20.766 -1.735 21.126 -1.584 21.412 -1.279 c
+21.927 -2.072 l
+21.769 -2.29 21.537 -2.466 21.236 -2.602 c
+20.931 -2.738 20.604 -2.808 20.251 -2.808 c
+19.428 0.235 m
+20.737 0.235 l
+20.737 0.353 l
+20.725 0.654 20.67 0.881 20.575 1.028 c
+20.486 1.183 20.328 1.263 20.104 1.263 c
+19.877 1.263 19.711 1.18 19.605 1.014 c
+19.505 0.856 19.447 0.595 19.428 0.235 c
+22.662 -2.058 m
+22.662 -1.852 22.728 -1.683 22.867 -1.544 c
+23.014 -1.407 23.199 -1.338 23.426 -1.338 c
+23.64 -1.338 23.816 -1.407 23.955 -1.544 c
+24.103 -1.673 24.176 -1.845 24.176 -2.058 c
+24.176 -2.275 24.103 -2.448 23.955 -2.573 c
+23.816 -2.701 23.64 -2.764 23.426 -2.764 c
+23.199 -2.764 23.014 -2.701 22.867 -2.573 c
+22.728 -2.448 22.662 -2.275 22.662 -2.058 c
+22.662 1.705 m
+22.662 1.911 22.728 2.08 22.867 2.219 c
+23.014 2.356 23.199 2.425 23.426 2.425 c
+23.64 2.425 23.816 2.356 23.955 2.219 c
+24.103 2.09 24.176 1.918 24.176 1.705 c
+24.176 1.488 24.103 1.315 23.955 1.19 c
+23.816 1.062 23.64 0.999 23.426 0.999 c
+23.199 0.999 23.014 1.062 22.867 1.19 c
+22.728 1.315 22.662 1.488 22.662 1.705 c
+31.01 -0.397 m
+31.01 -1.172 30.871 -1.771 30.599 -2.19 c
+30.335 -2.602 29.938 -2.808 29.408 -2.808 c
+29.005 -2.808 28.681 -2.646 28.439 -2.323 c
+28.439 -4.63 l
+27.131 -4.63 l
+27.131 2.248 l
+28.336 2.248 l
+28.38 1.793 l
+28.633 2.153 28.972 2.337 29.394 2.337 c
+29.923 2.337 30.32 2.146 30.584 1.764 c
+30.856 1.381 31 0.786 31.01 -0.015 c
+h
+29.718 -0.059 m
+29.718 0.419 29.662 0.756 29.556 0.955 c
+29.445 1.15 29.265 1.249 29.012 1.249 c
+28.747 1.249 28.556 1.139 28.439 0.926 c
+28.439 -1.411 l
+28.556 -1.628 28.751 -1.735 29.026 -1.735 c
+29.281 -1.735 29.456 -1.628 29.556 -1.411 c
+29.662 -1.187 29.718 -0.849 29.718 -0.397 c
+h
+34.05 -2.264 m
+33.786 -2.627 33.425 -2.808 32.977 -2.808 c
+32.514 -2.808 32.169 -2.654 31.933 -2.338 c
+31.698 -2.025 31.581 -1.569 31.581 -0.971 c
+31.581 2.248 l
+32.874 2.248 l
+32.874 -1 l
+32.882 -1.482 33.043 -1.72 33.36 -1.72 c
+33.661 -1.72 33.877 -1.595 34.006 -1.338 c
+34.006 2.248 l
+35.314 2.248 l
+35.314 -2.72 l
+34.094 -2.72 l
+h
+39.933 -0.397 m
+39.933 -1.202 39.801 -1.804 39.536 -2.205 c
+39.28 -2.61 38.879 -2.808 38.331 -2.808 c
+37.898 -2.808 37.556 -2.617 37.302 -2.234 c
+37.258 -2.72 l
+36.053 -2.72 l
+36.053 4.336 l
+37.36 4.336 l
+37.36 1.851 l
+37.603 2.175 37.927 2.337 38.331 2.337 c
+38.879 2.337 39.28 2.135 39.536 1.734 c
+39.79 1.341 39.922 0.756 39.933 -0.015 c
+h
+38.64 -0.073 m
+38.64 0.455 38.584 0.808 38.478 0.985 c
+38.379 1.161 38.202 1.249 37.949 1.249 c
+37.674 1.249 37.479 1.124 37.36 0.881 c
+37.36 -1.382 l
+37.479 -1.617 37.677 -1.735 37.964 -1.735 c
+38.206 -1.735 38.379 -1.658 38.478 -1.5 c
+38.574 -1.334 38.629 -1.014 38.64 -0.544 c
+h
+41.903 -2.72 -1.309 7.056 re
+44.178 -2.72 -1.309 4.968 re
+42.81 3.542 m
+42.81 3.737 42.873 3.898 43.002 4.027 c
+43.126 4.163 43.299 4.233 43.516 4.233 c
+43.729 4.233 43.902 4.163 44.03 4.027 c
+44.155 3.898 44.221 3.737 44.221 3.542 c
+44.221 3.337 44.155 3.164 44.03 3.027 c
+43.913 2.899 43.741 2.836 43.516 2.836 c
+43.299 2.836 43.126 2.899 43.002 3.027 c
+42.873 3.164 42.81 3.337 42.81 3.542 c
+46.879 -1.735 m
+47.261 -1.735 47.452 -1.492 47.452 -1 c
+48.687 -1 l
+48.676 -1.54 48.503 -1.977 48.172 -2.308 c
+47.849 -2.643 47.426 -2.808 46.908 -2.808 c
+46.268 -2.808 45.78 -2.613 45.438 -2.22 c
+45.104 -1.819 44.938 -1.231 44.938 -0.456 c
+44.938 -0.059 l
+44.938 0.723 45.1 1.315 45.424 1.72 c
+45.754 2.131 46.25 2.337 46.908 2.337 c
+47.456 2.337 47.885 2.164 48.202 1.822 c
+48.514 1.488 48.676 1.014 48.687 0.397 c
+47.452 0.397 l
+47.452 0.669 47.408 0.881 47.319 1.028 c
+47.232 1.183 47.084 1.263 46.879 1.263 c
+46.651 1.263 46.489 1.18 46.393 1.014 c
+46.295 0.856 46.239 0.548 46.232 0.087 c
+46.232 -0.412 l
+46.232 -0.823 46.25 -1.11 46.291 -1.264 c
+46.328 -1.422 46.393 -1.54 46.482 -1.617 c
+46.577 -1.698 46.71 -1.735 46.879 -1.735 c
+51.336 -0.103 m
+51.336 -0.819 51.24 -1.496 51.057 -2.132 c
+50.881 -2.768 50.631 -3.326 50.307 -3.807 c
+49.983 -4.285 49.638 -4.619 49.278 -4.807 c
+49.043 -4.102 l
+49.385 -3.767 49.653 -3.256 49.852 -2.573 c
+50.058 -1.889 50.164 -1.11 50.175 -0.235 c
+50.175 0.014 l
+50.175 0.904 50.072 1.697 49.866 2.396 c
+49.668 3.102 49.395 3.634 49.043 3.998 c
+49.278 4.704 l
+49.513 4.586 49.752 4.384 49.998 4.101 c
+50.241 3.825 50.461 3.484 50.66 3.072 c
+50.866 2.66 51.028 2.194 51.145 1.675 c
+51.27 1.165 51.336 0.573 51.336 -0.103 c
+f
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm18 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm19 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm20 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm21 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm22 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm23 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm24 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 585.9855 434.2035 cm
+0 0 m
+5.053 -5.074 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 589.5352 430.6393 cm
+0 0 m
+-1.51 0.003 l
+1.882 -1.889 l
+0 1.511 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 589.5352 430.6393 cm
+0 0 m
+-1.51 0.003 l
+1.882 -1.889 l
+0 1.511 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm25 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm26 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm27 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm28 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm29 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm30 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm31 Do
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS3 gs
+0 TL/Fm32 Do
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 710.4792 434.3578 cm
+0 0 m
+-5.075 -5.056 l
+S
+Q
+q 1 0 0 1 706.9185 430.8089 cm
+0 0 m
+0 1.509 l
+-1.893 -1.882 l
+1.506 -0.005 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 706.9186 430.8089 cm
+0 0 m
+0 1.509 l
+-1.893 -1.882 l
+1.506 -0.005 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 695.2289 383.6354 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.426 1.286 0.676 1.411 1 1.411 c
+1.301 1.411 1.532 1.278 1.691 1.014 c
+1.72 1.352 l
+2.161 1.352 l
+2.161 -1.661 l
+2.161 -2.032 2.061 -2.315 1.866 -2.514 c
+1.679 -2.708 1.419 -2.807 1.088 -2.807 c
+0.941 -2.807 0.771 -2.768 0.588 -2.69 c
+0.401 -2.62 0.264 -2.532 0.177 -2.425 c
+0.368 -2.087 l
+0.573 -2.294 0.798 -2.396 1.043 -2.396 c
+1.444 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.282 -1.69 1 -1.69 c
+0.684 -1.69 0.441 -1.573 0.264 -1.338 c
+0.096 -1.103 0.008 -0.771 0 -0.338 c
+h
+0.485 -0.279 m
+0.485 -0.613 0.533 -0.86 0.632 -1.014 c
+0.727 -1.172 0.889 -1.249 1.118 -1.249 c
+1.359 -1.249 1.544 -1.128 1.661 -0.882 c
+1.661 0.603 l
+1.544 0.845 1.367 0.97 1.132 0.97 c
+0.904 0.97 0.742 0.889 0.647 0.735 c
+0.548 0.577 0.492 0.338 0.485 0.015 c
+h
+3.227 -1.631 -0.501 2.983 re
+3.256 2.146 m
+3.256 2.057 3.231 1.984 3.183 1.926 c
+3.142 1.874 3.073 1.852 2.977 1.852 c
+2.888 1.852 2.818 1.874 2.771 1.926 c
+2.73 1.984 2.712 2.051 2.712 2.132 c
+2.712 2.219 2.73 2.293 2.771 2.352 c
+2.818 2.41 2.888 2.44 2.977 2.44 c
+3.073 2.44 3.142 2.41 3.183 2.352 c
+3.231 2.293 3.256 2.223 3.256 2.146 c
+4.531 2.072 m
+4.531 1.352 l
+4.987 1.352 l
+4.987 0.956 l
+4.531 0.956 l
+4.531 -0.897 l
+4.531 -1.014 4.549 -1.103 4.59 -1.161 c
+4.627 -1.22 4.696 -1.249 4.796 -1.249 c
+4.854 -1.249 4.917 -1.242 4.987 -1.22 c
+4.987 -1.631 l
+4.869 -1.669 4.755 -1.69 4.648 -1.69 c
+4.451 -1.69 4.299 -1.625 4.193 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.956 l
+3.59 0.956 l
+3.59 1.352 l
+4.046 1.352 l
+4.046 2.072 l
+h
+8.804 -0.279 m
+8.804 -0.75 8.721 -1.103 8.555 -1.338 c
+8.386 -1.573 8.147 -1.69 7.834 -1.69 c
+7.53 -1.69 7.298 -1.58 7.144 -1.353 c
+7.144 -2.778 l
+6.659 -2.778 l
+6.659 1.352 l
+7.1 1.352 l
+7.129 1.014 l
+7.283 1.278 7.515 1.411 7.82 1.411 c
+8.151 1.411 8.397 1.294 8.555 1.058 c
+8.721 0.831 8.804 0.492 8.804 0.044 c
+h
+8.32 0 m
+8.32 0.33 8.264 0.577 8.158 0.735 c
+8.058 0.889 7.898 0.97 7.673 0.97 c
+7.437 0.97 7.262 0.852 7.144 0.617 c
+7.144 -0.926 l
+7.262 -1.154 7.441 -1.264 7.688 -1.264 c
+7.9 -1.264 8.058 -1.187 8.158 -1.029 c
+8.264 -0.875 8.32 -0.632 8.32 -0.309 c
+h
+10.774 -1.367 m
+10.616 -1.584 10.381 -1.69 10.069 -1.69 c
+9.804 -1.69 9.598 -1.598 9.452 -1.411 c
+9.311 -1.228 9.246 -0.952 9.246 -0.588 c
+9.246 1.352 l
+9.731 1.352 l
+9.731 -0.559 l
+9.731 -1.022 9.87 -1.249 10.157 -1.249 c
+10.451 -1.249 10.649 -1.118 10.76 -0.852 c
+10.76 1.352 l
+11.26 1.352 l
+11.26 -1.631 l
+10.789 -1.631 l
+h
+13.251 -0.867 m
+13.251 -0.761 13.211 -0.673 13.134 -0.603 c
+13.053 -0.526 12.902 -0.437 12.678 -0.338 c
+12.413 -0.231 12.226 -0.14 12.12 -0.059 c
+12.01 0.018 11.932 0.106 11.884 0.206 c
+11.833 0.301 11.811 0.419 11.811 0.559 c
+11.811 0.801 11.898 1.003 12.075 1.161 c
+12.251 1.326 12.476 1.411 12.752 1.411 c
+13.045 1.411 13.28 1.323 13.457 1.147 c
+13.633 0.977 13.722 0.764 13.722 0.5 c
+13.236 0.5 l
+13.236 0.636 13.185 0.75 13.089 0.838 c
+13.001 0.933 12.887 0.985 12.752 0.985 c
+12.604 0.985 12.49 0.945 12.413 0.867 c
+12.332 0.798 12.295 0.698 12.295 0.573 c
+12.295 0.474 12.326 0.397 12.384 0.338 c
+12.443 0.279 12.582 0.198 12.81 0.103 c
+13.17 -0.044 13.417 -0.187 13.545 -0.324 c
+13.681 -0.453 13.751 -0.625 13.751 -0.838 c
+13.751 -1.095 13.656 -1.301 13.471 -1.455 c
+13.296 -1.613 13.06 -1.69 12.766 -1.69 c
+12.45 -1.69 12.197 -1.602 12.002 -1.426 c
+11.815 -1.242 11.723 -1.01 11.723 -0.735 c
+12.208 -0.735 l
+12.215 -0.904 12.266 -1.037 12.355 -1.132 c
+12.45 -1.22 12.59 -1.264 12.766 -1.264 c
+12.92 -1.264 13.038 -1.231 13.119 -1.161 c
+13.207 -1.095 13.251 -0.996 13.251 -0.867 c
+14.695 1.043 m
+14.879 1.286 15.114 1.411 15.401 1.411 c
+15.93 1.411 16.199 1.058 16.21 0.353 c
+16.21 -1.631 l
+15.724 -1.631 l
+15.724 0.324 l
+15.724 0.559 15.684 0.723 15.607 0.823 c
+15.526 0.918 15.408 0.97 15.254 0.97 c
+15.137 0.97 15.026 0.929 14.931 0.852 c
+14.832 0.771 14.755 0.665 14.695 0.529 c
+14.695 -1.631 l
+14.21 -1.631 l
+14.21 2.602 l
+14.695 2.602 l
+h
+20.101 -0.279 m
+20.101 -0.75 20.016 -1.103 19.852 -1.338 c
+19.682 -1.573 19.443 -1.69 19.131 -1.69 c
+18.826 -1.69 18.595 -1.58 18.44 -1.353 c
+18.44 -2.778 l
+17.955 -2.778 l
+17.955 1.352 l
+18.396 1.352 l
+18.425 1.014 l
+18.58 1.278 18.811 1.411 19.116 1.411 c
+19.447 1.411 19.693 1.294 19.852 1.058 c
+20.016 0.831 20.101 0.492 20.101 0.044 c
+h
+19.616 0 m
+19.616 0.33 19.561 0.577 19.455 0.735 c
+19.355 0.889 19.193 0.97 18.969 0.97 c
+18.734 0.97 18.558 0.852 18.44 0.617 c
+18.44 -0.926 l
+18.558 -1.154 18.738 -1.264 18.984 -1.264 c
+19.197 -1.264 19.355 -1.187 19.455 -1.029 c
+19.561 -0.875 19.616 -0.632 19.616 -0.309 c
+h
+22.071 -1.367 m
+21.913 -1.584 21.677 -1.69 21.365 -1.69 c
+21.101 -1.69 20.895 -1.598 20.748 -1.411 c
+20.608 -1.228 20.542 -0.952 20.542 -0.588 c
+20.542 1.352 l
+21.027 1.352 l
+21.027 -0.559 l
+21.027 -1.022 21.167 -1.249 21.454 -1.249 c
+21.747 -1.249 21.946 -1.118 22.056 -0.852 c
+22.056 1.352 l
+22.556 1.352 l
+22.556 -1.631 l
+22.086 -1.631 l
+h
+25.271 -0.279 m
+25.271 -0.75 25.186 -1.103 25.022 -1.338 c
+24.852 -1.573 24.61 -1.69 24.286 -1.69 c
+23.971 -1.69 23.736 -1.554 23.581 -1.278 c
+23.551 -1.631 l
+23.11 -1.631 l
+23.11 2.602 l
+23.596 2.602 l
+23.596 1.029 l
+23.75 1.282 23.981 1.411 24.286 1.411 c
+24.61 1.411 24.852 1.294 25.022 1.058 c
+25.186 0.823 25.271 0.474 25.271 0.015 c
+h
+24.787 0 m
+24.787 0.353 24.735 0.603 24.639 0.75 c
+24.54 0.897 24.378 0.97 24.154 0.97 c
+23.908 0.97 23.721 0.831 23.596 0.559 c
+23.596 -0.852 l
+23.713 -1.118 23.904 -1.249 24.169 -1.249 c
+24.382 -1.249 24.54 -1.176 24.639 -1.029 c
+24.735 -0.875 24.787 -0.632 24.787 -0.309 c
+h
+26.242 -1.631 -0.5 4.233 re
+27.447 -1.631 -0.5 2.983 re
+27.476 2.146 m
+27.476 2.057 27.451 1.984 27.403 1.926 c
+27.362 1.874 27.293 1.852 27.197 1.852 c
+27.108 1.852 27.039 1.874 26.991 1.926 c
+26.95 1.984 26.932 2.051 26.932 2.132 c
+26.932 2.219 26.95 2.293 26.991 2.352 c
+27.039 2.41 27.108 2.44 27.197 2.44 c
+27.293 2.44 27.362 2.41 27.403 2.352 c
+27.451 2.293 27.476 2.223 27.476 2.146 c
+29.148 -1.264 m
+29.313 -1.264 29.446 -1.216 29.545 -1.118 c
+29.641 -1.022 29.695 -0.879 29.707 -0.691 c
+30.163 -0.691 l
+30.152 -0.977 30.048 -1.216 29.853 -1.411 c
+29.666 -1.598 29.431 -1.69 29.148 -1.69 c
+28.785 -1.69 28.505 -1.573 28.311 -1.338 c
+28.112 -1.103 28.016 -0.757 28.016 -0.294 c
+28.016 0.029 l
+28.016 0.478 28.108 0.823 28.296 1.058 c
+28.49 1.294 28.773 1.411 29.148 1.411 c
+29.45 1.411 29.693 1.311 29.868 1.117 c
+30.052 0.918 30.152 0.654 30.163 0.324 c
+29.707 0.324 l
+29.685 0.548 29.626 0.713 29.531 0.823 c
+29.442 0.929 29.313 0.985 29.148 0.985 c
+28.932 0.985 28.77 0.912 28.663 0.764 c
+28.564 0.625 28.509 0.397 28.502 0.073 c
+28.502 -0.309 l
+28.502 -0.661 28.55 -0.912 28.648 -1.058 c
+28.755 -1.199 28.92 -1.264 29.148 -1.264 c
+32.22 1.352 m
+32.235 1.073 l
+32.411 1.297 32.65 1.411 32.955 1.411 c
+33.286 1.411 33.518 1.264 33.647 0.97 c
+33.83 1.264 34.091 1.411 34.425 1.411 c
+34.984 1.411 35.266 1.066 35.278 0.382 c
+35.278 -1.631 l
+34.792 -1.631 l
+34.792 0.338 l
+34.792 0.551 34.752 0.709 34.675 0.808 c
+34.594 0.915 34.462 0.97 34.279 0.97 c
+34.131 0.97 34.013 0.912 33.926 0.794 c
+33.838 0.683 33.782 0.544 33.764 0.368 c
+33.764 -1.631 l
+33.279 -1.631 l
+33.279 0.353 l
+33.267 0.764 33.095 0.97 32.764 0.97 c
+32.518 0.97 32.346 0.845 32.25 0.603 c
+32.25 -1.631 l
+31.765 -1.631 l
+31.765 1.352 l
+h
+37.255 -1.631 m
+37.225 -1.565 37.203 -1.455 37.196 -1.309 c
+37.02 -1.565 36.799 -1.69 36.535 -1.69 c
+36.259 -1.69 36.043 -1.617 35.887 -1.47 c
+35.741 -1.316 35.667 -1.099 35.667 -0.823 c
+35.667 -0.522 35.77 -0.279 35.976 -0.103 c
+36.182 0.081 36.465 0.176 36.828 0.176 c
+37.181 0.176 l
+37.181 0.5 l
+37.181 0.676 37.141 0.798 37.063 0.867 c
+36.983 0.945 36.866 0.985 36.711 0.985 c
+36.564 0.985 36.439 0.941 36.344 0.852 c
+36.255 0.764 36.211 0.654 36.211 0.529 c
+35.727 0.529 l
+35.727 0.676 35.77 0.816 35.858 0.956 c
+35.947 1.103 36.064 1.213 36.211 1.294 c
+36.365 1.371 36.538 1.411 36.726 1.411 c
+37.038 1.411 37.273 1.33 37.431 1.176 c
+37.585 1.029 37.666 0.808 37.666 0.515 c
+37.666 -0.985 l
+37.674 -1.22 37.711 -1.422 37.769 -1.588 c
+37.769 -1.631 l
+h
+36.608 -1.249 m
+36.726 -1.249 36.836 -1.216 36.946 -1.147 c
+37.053 -1.081 37.13 -0.996 37.181 -0.897 c
+37.181 -0.191 l
+36.917 -0.191 l
+36.681 -0.191 36.494 -0.243 36.358 -0.338 c
+36.23 -0.437 36.167 -0.58 36.167 -0.765 c
+36.167 -0.933 36.197 -1.055 36.255 -1.132 c
+36.321 -1.213 36.439 -1.249 36.608 -1.249 c
+39.688 -0.867 m
+39.688 -0.761 39.647 -0.673 39.57 -0.603 c
+39.49 -0.526 39.338 -0.437 39.114 -0.338 c
+38.85 -0.231 38.663 -0.14 38.555 -0.059 c
+38.445 0.018 38.368 0.106 38.32 0.206 c
+38.269 0.301 38.247 0.419 38.247 0.559 c
+38.247 0.801 38.335 1.003 38.512 1.161 c
+38.688 1.326 38.912 1.411 39.187 1.411 c
+39.482 1.411 39.717 1.323 39.893 1.147 c
+40.07 0.977 40.158 0.764 40.158 0.5 c
+39.673 0.5 l
+39.673 0.636 39.621 0.75 39.526 0.838 c
+39.438 0.933 39.324 0.985 39.187 0.985 c
+39.041 0.985 38.927 0.945 38.85 0.867 c
+38.769 0.798 38.732 0.698 38.732 0.573 c
+38.732 0.474 38.761 0.397 38.821 0.338 c
+38.879 0.279 39.019 0.198 39.247 0.103 c
+39.607 -0.044 39.853 -0.187 39.981 -0.324 c
+40.118 -0.453 40.188 -0.625 40.188 -0.838 c
+40.188 -1.095 40.091 -1.301 39.908 -1.455 c
+39.731 -1.613 39.496 -1.69 39.203 -1.69 c
+38.886 -1.69 38.632 -1.602 38.438 -1.426 c
+38.25 -1.242 38.159 -1.01 38.159 -0.735 c
+38.644 -0.735 l
+38.651 -0.904 38.703 -1.037 38.79 -1.132 c
+38.886 -1.22 39.026 -1.264 39.203 -1.264 c
+39.357 -1.264 39.474 -1.231 39.555 -1.161 c
+39.644 -1.095 39.688 -0.996 39.688 -0.867 c
+41.275 2.072 m
+41.275 1.352 l
+41.73 1.352 l
+41.73 0.956 l
+41.275 0.956 l
+41.275 -0.897 l
+41.275 -1.014 41.294 -1.103 41.334 -1.161 c
+41.371 -1.22 41.441 -1.249 41.539 -1.249 c
+41.599 -1.249 41.661 -1.242 41.73 -1.22 c
+41.73 -1.631 l
+41.613 -1.669 41.499 -1.69 41.393 -1.69 c
+41.194 -1.69 41.044 -1.625 40.937 -1.484 c
+40.838 -1.349 40.79 -1.154 40.79 -0.897 c
+40.79 0.956 l
+40.334 0.956 l
+40.334 1.352 l
+40.79 1.352 l
+40.79 2.072 l
+h
+43.256 -1.69 m
+42.881 -1.69 42.598 -1.584 42.403 -1.367 c
+42.204 -1.143 42.109 -0.816 42.109 -0.382 c
+42.109 -0.015 l
+42.109 0.426 42.201 0.771 42.389 1.029 c
+42.584 1.282 42.859 1.411 43.212 1.411 c
+43.553 1.411 43.807 1.297 43.976 1.073 c
+44.153 0.845 44.244 0.5 44.255 0.029 c
+44.255 -0.279 l
+42.594 -0.279 l
+42.594 -0.353 l
+42.594 -0.676 42.653 -0.912 42.771 -1.058 c
+42.888 -1.199 43.058 -1.264 43.285 -1.264 c
+43.432 -1.264 43.557 -1.242 43.667 -1.191 c
+43.774 -1.132 43.877 -1.043 43.976 -0.926 c
+44.226 -1.235 l
+44.02 -1.54 43.696 -1.69 43.256 -1.69 c
+43.212 0.985 m
+43.006 0.985 42.852 0.915 42.756 0.779 c
+42.657 0.64 42.601 0.426 42.594 0.133 c
+43.77 0.133 l
+43.77 0.206 l
+43.748 0.478 43.696 0.676 43.608 0.794 c
+43.521 0.918 43.388 0.985 43.212 0.985 c
+45.902 0.897 m
+45.832 0.904 45.759 0.912 45.681 0.912 c
+45.424 0.912 45.248 0.771 45.152 0.5 c
+45.152 -1.631 l
+44.667 -1.631 l
+44.667 1.352 l
+45.138 1.352 l
+45.152 1.043 l
+45.277 1.286 45.46 1.411 45.695 1.411 c
+45.773 1.411 45.836 1.396 45.886 1.367 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 672.622 356.2839 cm
+0 0 m
+-0.114 20.002 26.63 15.225 20.909 37.795 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 694.0562 392.01 cm
+0 0 m
+1.298 -0.771 l
+-0.654 2.583 l
+-0.772 -1.297 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 694.0562 392.01 cm
+0 0 m
+1.298 -0.771 l
+-0.654 2.584 l
+-0.772 -1.297 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 635.2201 383.5761 cm
+0 0 m
+0 0.46 0.081 0.809 0.25 1.044 c
+0.426 1.287 0.676 1.411 0.999 1.411 c
+1.301 1.411 1.532 1.279 1.691 1.015 c
+1.72 1.353 l
+2.161 1.353 l
+2.161 -1.66 l
+2.161 -2.032 2.061 -2.315 1.866 -2.513 c
+1.679 -2.708 1.419 -2.807 1.087 -2.807 c
+0.941 -2.807 0.771 -2.767 0.588 -2.69 c
+0.401 -2.62 0.264 -2.532 0.176 -2.425 c
+0.368 -2.087 l
+0.573 -2.293 0.798 -2.395 1.043 -2.395 c
+1.444 -2.395 1.65 -2.167 1.661 -1.72 c
+1.661 -1.337 l
+1.503 -1.572 1.282 -1.69 0.999 -1.69 c
+0.684 -1.69 0.441 -1.572 0.264 -1.337 c
+0.096 -1.102 0.008 -0.771 0 -0.338 c
+h
+0.485 -0.278 m
+0.485 -0.613 0.532 -0.86 0.632 -1.014 c
+0.727 -1.172 0.889 -1.249 1.117 -1.249 c
+1.359 -1.249 1.544 -1.128 1.661 -0.881 c
+1.661 0.603 l
+1.544 0.846 1.367 0.971 1.132 0.971 c
+0.904 0.971 0.742 0.89 0.646 0.736 c
+0.547 0.578 0.492 0.339 0.485 0.015 c
+h
+3.223 -1.631 -0.5 2.984 re
+3.252 2.147 m
+3.252 2.058 3.227 1.985 3.179 1.926 c
+3.138 1.875 3.069 1.852 2.973 1.852 c
+2.884 1.852 2.815 1.875 2.767 1.926 c
+2.726 1.985 2.708 2.051 2.708 2.132 c
+2.708 2.22 2.726 2.294 2.767 2.352 c
+2.815 2.411 2.884 2.44 2.973 2.44 c
+3.069 2.44 3.138 2.411 3.179 2.352 c
+3.227 2.294 3.252 2.224 3.252 2.147 c
+4.531 2.073 m
+4.531 1.353 l
+4.987 1.353 l
+4.987 0.956 l
+4.531 0.956 l
+4.531 -0.897 l
+4.531 -1.014 4.549 -1.102 4.59 -1.161 c
+4.627 -1.219 4.696 -1.249 4.796 -1.249 c
+4.854 -1.249 4.917 -1.242 4.987 -1.219 c
+4.987 -1.631 l
+4.869 -1.668 4.755 -1.69 4.648 -1.69 c
+4.45 -1.69 4.299 -1.624 4.193 -1.484 c
+4.094 -1.348 4.046 -1.153 4.046 -0.897 c
+4.046 0.956 l
+3.59 0.956 l
+3.59 1.353 l
+4.046 1.353 l
+4.046 2.073 l
+h
+8.801 -0.278 m
+8.801 -0.749 8.717 -1.102 8.551 -1.337 c
+8.382 -1.572 8.143 -1.69 7.831 -1.69 c
+7.526 -1.69 7.294 -1.579 7.14 -1.352 c
+7.14 -2.778 l
+6.655 -2.778 l
+6.655 1.353 l
+7.096 1.353 l
+7.125 1.015 l
+7.279 1.279 7.511 1.411 7.817 1.411 c
+8.147 1.411 8.393 1.293 8.551 1.058 c
+8.717 0.831 8.801 0.493 8.801 0.044 c
+h
+8.316 0 m
+8.316 0.331 8.261 0.578 8.154 0.736 c
+8.055 0.89 7.894 0.971 7.669 0.971 c
+7.434 0.971 7.258 0.853 7.14 0.618 c
+7.14 -0.926 l
+7.258 -1.153 7.437 -1.263 7.684 -1.263 c
+7.897 -1.263 8.055 -1.186 8.154 -1.028 c
+8.261 -0.874 8.316 -0.631 8.316 -0.309 c
+h
+10.774 -1.367 m
+10.616 -1.583 10.381 -1.69 10.069 -1.69 c
+9.804 -1.69 9.598 -1.598 9.452 -1.411 c
+9.311 -1.227 9.246 -0.951 9.246 -0.588 c
+9.246 1.353 l
+9.731 1.353 l
+9.731 -0.558 l
+9.731 -1.022 9.87 -1.249 10.157 -1.249 c
+10.451 -1.249 10.649 -1.117 10.759 -0.852 c
+10.759 1.353 l
+11.26 1.353 l
+11.26 -1.631 l
+10.789 -1.631 l
+h
+13.251 -0.866 m
+13.251 -0.76 13.211 -0.672 13.134 -0.602 c
+13.053 -0.525 12.902 -0.436 12.678 -0.338 c
+12.413 -0.231 12.226 -0.139 12.12 -0.058 c
+12.01 0.019 11.932 0.107 11.884 0.206 c
+11.833 0.302 11.811 0.42 11.811 0.559 c
+11.811 0.802 11.898 1.004 12.075 1.162 c
+12.251 1.327 12.476 1.411 12.752 1.411 c
+13.045 1.411 13.28 1.324 13.457 1.147 c
+13.633 0.977 13.722 0.765 13.722 0.5 c
+13.236 0.5 l
+13.236 0.636 13.185 0.75 13.089 0.838 c
+13.001 0.934 12.887 0.985 12.752 0.985 c
+12.604 0.985 12.49 0.944 12.413 0.867 c
+12.332 0.798 12.295 0.699 12.295 0.574 c
+12.295 0.474 12.326 0.397 12.384 0.339 c
+12.443 0.279 12.582 0.198 12.81 0.103 c
+13.17 -0.043 13.417 -0.187 13.545 -0.323 c
+13.681 -0.452 13.751 -0.625 13.751 -0.837 c
+13.751 -1.095 13.656 -1.3 13.471 -1.454 c
+13.295 -1.612 13.06 -1.69 12.766 -1.69 c
+12.45 -1.69 12.197 -1.602 12.002 -1.425 c
+11.815 -1.242 11.723 -1.01 11.723 -0.735 c
+12.208 -0.735 l
+12.215 -0.904 12.266 -1.036 12.355 -1.132 c
+12.45 -1.219 12.59 -1.263 12.766 -1.263 c
+12.92 -1.263 13.038 -1.23 13.119 -1.161 c
+13.207 -1.095 13.251 -0.995 13.251 -0.866 c
+14.692 1.044 m
+14.875 1.287 15.11 1.411 15.397 1.411 c
+15.927 1.411 16.195 1.058 16.206 0.353 c
+16.206 -1.631 l
+15.721 -1.631 l
+15.721 0.324 l
+15.721 0.559 15.68 0.724 15.603 0.823 c
+15.522 0.919 15.405 0.971 15.25 0.971 c
+15.133 0.971 15.023 0.93 14.927 0.853 c
+14.828 0.772 14.751 0.665 14.692 0.53 c
+14.692 -1.631 l
+14.207 -1.631 l
+14.207 2.602 l
+14.692 2.602 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 656.8204 356.6593 cm
+0 0 m
+-0.118 20.001 -28.66 16.157 -38.177 39.485 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 619.4479 394.1704 cm
+0 0 m
+1.393 -0.584 l
+-1.007 2.47 l
+-0.584 -1.393 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 619.4479 394.1704 cm
+0 0 m
+1.393 -0.584 l
+-1.007 2.47 l
+-0.584 -1.393 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 588.0693 386.1895 cm
+0 0 m
+0 0.459 0.081 0.808 0.249 1.043 c
+0.426 1.286 0.676 1.411 0.999 1.411 c
+1.301 1.411 1.533 1.278 1.691 1.014 c
+1.72 1.352 l
+2.161 1.352 l
+2.161 -1.661 l
+2.161 -2.032 2.061 -2.315 1.866 -2.514 c
+1.679 -2.708 1.419 -2.808 1.088 -2.808 c
+0.941 -2.808 0.771 -2.768 0.588 -2.691 c
+0.401 -2.62 0.264 -2.532 0.176 -2.425 c
+0.368 -2.087 l
+0.573 -2.294 0.798 -2.396 1.043 -2.396 c
+1.444 -2.396 1.65 -2.168 1.66 -1.72 c
+1.66 -1.338 l
+1.503 -1.573 1.282 -1.69 0.999 -1.69 c
+0.683 -1.69 0.441 -1.573 0.264 -1.338 c
+0.095 -1.103 0.008 -0.772 0 -0.339 c
+h
+0.484 -0.279 m
+0.484 -0.614 0.532 -0.86 0.632 -1.014 c
+0.727 -1.172 0.889 -1.249 1.117 -1.249 c
+1.359 -1.249 1.544 -1.128 1.66 -0.882 c
+1.66 0.602 l
+1.544 0.845 1.367 0.97 1.132 0.97 c
+0.904 0.97 0.742 0.889 0.646 0.735 c
+0.548 0.577 0.492 0.338 0.484 0.014 c
+h
+3.227 -1.632 -0.5 2.984 re
+3.256 2.146 m
+3.256 2.057 3.23 1.984 3.183 1.926 c
+3.142 1.874 3.072 1.851 2.977 1.851 c
+2.888 1.851 2.818 1.874 2.771 1.926 c
+2.73 1.984 2.712 2.05 2.712 2.131 c
+2.712 2.219 2.73 2.293 2.771 2.352 c
+2.818 2.41 2.888 2.439 2.977 2.439 c
+3.072 2.439 3.142 2.41 3.183 2.352 c
+3.23 2.293 3.256 2.223 3.256 2.146 c
+4.534 2.072 m
+4.534 1.352 l
+4.991 1.352 l
+4.991 0.955 l
+4.534 0.955 l
+4.534 -0.897 l
+4.534 -1.014 4.553 -1.103 4.594 -1.162 c
+4.63 -1.22 4.7 -1.249 4.799 -1.249 c
+4.858 -1.249 4.92 -1.243 4.991 -1.22 c
+4.991 -1.632 l
+4.873 -1.669 4.758 -1.69 4.652 -1.69 c
+4.453 -1.69 4.303 -1.625 4.197 -1.484 c
+4.097 -1.349 4.05 -1.154 4.05 -0.897 c
+4.05 0.955 l
+3.594 0.955 l
+3.594 1.352 l
+4.05 1.352 l
+4.05 2.072 l
+h
+6.865 -1.632 m
+6.865 0.955 l
+6.483 0.955 l
+6.483 1.352 l
+6.865 1.352 l
+6.865 1.691 l
+6.872 1.992 6.953 2.227 7.1 2.396 c
+7.247 2.572 7.456 2.66 7.732 2.66 c
+7.827 2.66 7.927 2.645 8.025 2.616 c
+7.996 2.204 l
+7.927 2.212 7.853 2.219 7.775 2.219 c
+7.501 2.219 7.364 2.021 7.364 1.631 c
+7.364 1.352 l
+7.864 1.352 l
+7.864 0.955 l
+7.364 0.955 l
+7.364 -1.632 l
+h
+9.323 -1.69 m
+8.948 -1.69 8.665 -1.584 8.47 -1.367 c
+8.272 -1.143 8.176 -0.816 8.176 -0.383 c
+8.176 -0.015 l
+8.176 0.426 8.268 0.771 8.455 1.028 c
+8.65 1.282 8.926 1.411 9.279 1.411 c
+9.62 1.411 9.874 1.297 10.043 1.072 c
+10.219 0.845 10.311 0.5 10.323 0.029 c
+10.323 -0.279 l
+8.661 -0.279 l
+8.661 -0.353 l
+8.661 -0.676 8.72 -0.912 8.837 -1.058 c
+8.955 -1.199 9.124 -1.264 9.352 -1.264 c
+9.5 -1.264 9.624 -1.243 9.735 -1.191 c
+9.841 -1.132 9.944 -1.044 10.043 -0.927 c
+10.293 -1.235 l
+10.088 -1.54 9.764 -1.69 9.323 -1.69 c
+9.279 0.985 m
+9.073 0.985 8.918 0.914 8.823 0.779 c
+8.724 0.639 8.669 0.426 8.661 0.132 c
+9.837 0.132 l
+9.837 0.205 l
+9.815 0.478 9.764 0.675 9.675 0.793 c
+9.587 0.918 9.455 0.985 9.279 0.985 c
+11.366 2.072 m
+11.366 1.352 l
+11.821 1.352 l
+11.821 0.955 l
+11.366 0.955 l
+11.366 -0.897 l
+11.366 -1.014 11.384 -1.103 11.424 -1.162 c
+11.461 -1.22 11.532 -1.249 11.63 -1.249 c
+11.69 -1.249 11.752 -1.243 11.821 -1.22 c
+11.821 -1.632 l
+11.704 -1.669 11.59 -1.69 11.484 -1.69 c
+11.285 -1.69 11.135 -1.625 11.028 -1.484 c
+10.929 -1.349 10.881 -1.154 10.881 -0.897 c
+10.881 0.955 l
+10.425 0.955 l
+10.425 1.352 l
+10.881 1.352 l
+10.881 2.072 l
+h
+13.317 -1.264 m
+13.483 -1.264 13.615 -1.216 13.714 -1.118 c
+13.81 -1.022 13.865 -0.879 13.876 -0.691 c
+14.331 -0.691 l
+14.321 -0.977 14.217 -1.216 14.023 -1.411 c
+13.836 -1.598 13.6 -1.69 13.317 -1.69 c
+12.953 -1.69 12.675 -1.573 12.479 -1.338 c
+12.281 -1.103 12.185 -0.757 12.185 -0.294 c
+12.185 0.029 l
+12.185 0.478 12.278 0.823 12.465 1.058 c
+12.66 1.294 12.943 1.411 13.317 1.411 c
+13.618 1.411 13.861 1.311 14.038 1.117 c
+14.221 0.918 14.321 0.654 14.331 0.323 c
+13.876 0.323 l
+13.853 0.548 13.795 0.713 13.699 0.823 c
+13.612 0.929 13.483 0.985 13.317 0.985 c
+13.101 0.985 12.939 0.911 12.833 0.764 c
+12.733 0.625 12.677 0.397 12.671 0.073 c
+12.671 -0.309 l
+12.671 -0.661 12.718 -0.912 12.818 -1.058 c
+12.924 -1.199 13.089 -1.264 13.317 -1.264 c
+15.21 1.043 m
+15.393 1.286 15.628 1.411 15.915 1.411 c
+16.444 1.411 16.712 1.058 16.724 0.353 c
+16.724 -1.632 l
+16.239 -1.632 l
+16.239 0.323 l
+16.239 0.558 16.199 0.723 16.122 0.823 c
+16.041 0.918 15.923 0.97 15.769 0.97 c
+15.651 0.97 15.54 0.929 15.445 0.852 c
+15.345 0.771 15.268 0.665 15.21 0.529 c
+15.21 -1.632 l
+14.724 -1.632 l
+14.724 2.601 l
+15.21 2.601 l
+h
+f
+Q
+q 1 0 0 1 594.5256 379.6043 cm
+0 0 m
+0 0.43 0.104 0.771 0.309 1.028 c
+0.522 1.282 0.802 1.411 1.147 1.411 c
+1.488 1.411 1.764 1.282 1.97 1.028 c
+2.182 0.783 2.297 0.448 2.308 0.029 c
+2.308 -0.279 l
+2.308 -0.713 2.198 -1.055 1.985 -1.309 c
+1.779 -1.565 1.5 -1.691 1.147 -1.691 c
+0.802 -1.691 0.53 -1.569 0.324 -1.324 c
+0.118 -1.081 0.008 -0.746 0 -0.324 c
+h
+0.485 -0.279 m
+0.485 -0.595 0.544 -0.838 0.661 -1.014 c
+0.786 -1.183 0.948 -1.264 1.147 -1.264 c
+1.577 -1.264 1.801 -0.956 1.823 -0.339 c
+1.823 0 l
+1.823 0.301 1.756 0.544 1.632 0.72 c
+1.515 0.897 1.353 0.985 1.147 0.985 c
+0.948 0.985 0.786 0.897 0.661 0.72 c
+0.544 0.544 0.485 0.301 0.485 0 c
+h
+3.984 0.897 m
+3.914 0.904 3.84 0.911 3.763 0.911 c
+3.506 0.911 3.329 0.771 3.234 0.5 c
+3.234 -1.632 l
+2.749 -1.632 l
+2.749 1.352 l
+3.219 1.352 l
+3.234 1.043 l
+3.358 1.286 3.543 1.411 3.778 1.411 c
+3.855 1.411 3.917 1.396 3.969 1.367 c
+h
+f
+Q
+q 1 0 0 1 589.5942 373.0192 cm
+0 0 m
+0 0.459 0.081 0.808 0.25 1.043 c
+0.426 1.286 0.676 1.411 0.999 1.411 c
+1.301 1.411 1.532 1.278 1.691 1.014 c
+1.72 1.352 l
+2.161 1.352 l
+2.161 -1.661 l
+2.161 -2.032 2.061 -2.315 1.866 -2.514 c
+1.679 -2.708 1.419 -2.808 1.087 -2.808 c
+0.941 -2.808 0.771 -2.768 0.588 -2.691 c
+0.401 -2.62 0.264 -2.533 0.176 -2.425 c
+0.368 -2.087 l
+0.573 -2.294 0.798 -2.396 1.043 -2.396 c
+1.444 -2.396 1.65 -2.168 1.661 -1.72 c
+1.661 -1.338 l
+1.503 -1.573 1.282 -1.691 0.999 -1.691 c
+0.684 -1.691 0.441 -1.573 0.264 -1.338 c
+0.096 -1.103 0.008 -0.772 0 -0.339 c
+h
+0.485 -0.279 m
+0.485 -0.614 0.532 -0.86 0.632 -1.014 c
+0.727 -1.172 0.889 -1.249 1.117 -1.249 c
+1.359 -1.249 1.544 -1.128 1.661 -0.882 c
+1.661 0.602 l
+1.544 0.845 1.367 0.97 1.132 0.97 c
+0.904 0.97 0.742 0.889 0.646 0.735 c
+0.547 0.577 0.492 0.338 0.485 0.014 c
+h
+3.223 -1.632 -0.5 2.984 re
+3.252 2.146 m
+3.252 2.057 3.227 1.984 3.179 1.926 c
+3.138 1.874 3.069 1.851 2.973 1.851 c
+2.884 1.851 2.815 1.874 2.767 1.926 c
+2.726 1.984 2.708 2.05 2.708 2.131 c
+2.708 2.219 2.726 2.293 2.767 2.352 c
+2.815 2.41 2.884 2.439 2.973 2.439 c
+3.069 2.439 3.138 2.41 3.179 2.352 c
+3.227 2.293 3.252 2.223 3.252 2.146 c
+4.531 2.072 m
+4.531 1.352 l
+4.987 1.352 l
+4.987 0.955 l
+4.531 0.955 l
+4.531 -0.897 l
+4.531 -1.014 4.549 -1.103 4.59 -1.162 c
+4.627 -1.22 4.696 -1.249 4.796 -1.249 c
+4.854 -1.249 4.917 -1.243 4.987 -1.22 c
+4.987 -1.632 l
+4.869 -1.669 4.755 -1.691 4.648 -1.691 c
+4.45 -1.691 4.299 -1.625 4.193 -1.484 c
+4.094 -1.349 4.046 -1.154 4.046 -0.897 c
+4.046 0.955 l
+3.59 0.955 l
+3.59 1.352 l
+4.046 1.352 l
+4.046 2.072 l
+h
+8.801 -0.279 m
+8.801 -0.75 8.717 -1.103 8.551 -1.338 c
+8.382 -1.573 8.143 -1.691 7.831 -1.691 c
+7.526 -1.691 7.294 -1.58 7.14 -1.353 c
+7.14 -2.778 l
+6.655 -2.778 l
+6.655 1.352 l
+7.096 1.352 l
+7.125 1.014 l
+7.279 1.278 7.511 1.411 7.817 1.411 c
+8.147 1.411 8.393 1.294 8.551 1.058 c
+8.717 0.831 8.801 0.492 8.801 0.044 c
+h
+8.316 0 m
+8.316 0.33 8.261 0.577 8.154 0.735 c
+8.055 0.889 7.894 0.97 7.669 0.97 c
+7.434 0.97 7.258 0.852 7.14 0.617 c
+7.14 -0.927 l
+7.258 -1.154 7.437 -1.264 7.684 -1.264 c
+7.897 -1.264 8.055 -1.187 8.154 -1.029 c
+8.261 -0.875 8.316 -0.632 8.316 -0.309 c
+h
+10.774 -1.367 m
+10.616 -1.584 10.381 -1.691 10.069 -1.691 c
+9.804 -1.691 9.598 -1.598 9.452 -1.411 c
+9.311 -1.228 9.246 -0.952 9.246 -0.588 c
+9.246 1.352 l
+9.731 1.352 l
+9.731 -0.559 l
+9.731 -1.022 9.87 -1.249 10.157 -1.249 c
+10.451 -1.249 10.649 -1.118 10.759 -0.853 c
+10.759 1.352 l
+11.26 1.352 l
+11.26 -1.632 l
+10.789 -1.632 l
+h
+12.34 -1.632 -0.5 4.233 re
+13.545 -1.632 -0.5 4.233 re
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 600.5115 395.7545 cm
+0 0 m
+19.682 -14.736 18.124 -46.64 36.296 -49.646 c
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 634.7023 346.454 cm
+0 0 m
+-1.228 -0.878 l
+2.631 -0.433 l
+-0.878 1.227 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 634.7023 346.4541 cm
+0 0 m
+-1.228 -0.878 l
+2.631 -0.433 l
+-0.878 1.227 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+535.667 213.99 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 571.6026 198.5045 cm
+0 0 m
+0 9.363 l
+2.484 9.363 l
+3.572 9.363 4.439 9.014 5.086 8.32 c
+5.74 7.621 6.074 6.674 6.086 5.468 c
+6.086 3.954 l
+6.086 2.72 5.762 1.749 5.115 1.043 c
+4.469 0.345 3.572 0 2.425 0 c
+h
+1.897 7.79 m
+1.897 1.573 l
+2.454 1.573 l
+3.09 1.573 3.535 1.738 3.792 2.072 c
+4.046 2.404 4.178 2.977 4.189 3.792 c
+4.189 5.409 l
+4.189 6.291 4.064 6.901 3.821 7.247 c
+3.586 7.588 3.175 7.769 2.587 7.79 c
+h
+6.913 0.926 m
+6.913 1.22 7.008 1.459 7.206 1.646 c
+7.401 1.83 7.655 1.926 7.971 1.926 c
+8.272 1.926 8.522 1.83 8.72 1.646 c
+8.926 1.459 9.029 1.22 9.029 0.926 c
+9.029 0.621 8.926 0.374 8.72 0.191 c
+8.522 0.015 8.272 -0.073 7.971 -0.073 c
+7.665 -0.073 7.412 0.018 7.206 0.206 c
+7.008 0.389 6.913 0.632 6.913 0.926 c
+20.266 3.116 m
+20.215 2.047 19.914 1.238 19.355 0.691 c
+18.804 0.139 18.032 -0.133 17.032 -0.133 c
+15.963 -0.133 15.144 0.213 14.578 0.912 c
+14.019 1.606 13.74 2.602 13.74 3.896 c
+13.74 5.468 l
+13.74 6.761 14.026 7.754 14.607 8.452 c
+15.195 9.147 16.008 9.496 17.047 9.496 c
+18.065 9.496 18.84 9.205 19.37 8.628 c
+19.898 8.058 20.201 7.239 20.281 6.173 c
+18.385 6.173 l
+18.362 6.838 18.26 7.295 18.076 7.541 c
+17.889 7.794 17.547 7.923 17.047 7.923 c
+16.548 7.923 16.187 7.746 15.974 7.393 c
+15.769 7.041 15.655 6.456 15.636 5.644 c
+15.636 3.881 l
+15.636 2.947 15.739 2.308 15.945 1.955 c
+16.158 1.61 16.521 1.44 17.032 1.44 c
+17.521 1.44 17.859 1.558 18.047 1.793 c
+18.242 2.036 18.348 2.477 18.37 3.116 c
+h
+28.244 3.836 m
+28.244 2.58 27.943 1.606 27.347 0.912 c
+26.749 0.213 25.926 -0.133 24.878 -0.133 c
+23.827 -0.133 23 0.21 22.394 0.897 c
+21.795 1.591 21.49 2.558 21.483 3.792 c
+21.483 5.394 l
+21.483 6.677 21.78 7.68 22.379 8.407 c
+22.975 9.132 23.805 9.496 24.864 9.496 c
+25.899 9.496 26.719 9.136 27.318 8.422 c
+27.925 7.717 28.233 6.721 28.244 5.438 c
+h
+26.348 5.409 m
+26.348 6.25 26.223 6.879 25.98 7.291 c
+25.745 7.702 25.371 7.908 24.864 7.908 c
+24.363 7.908 23.989 7.706 23.746 7.306 c
+23.511 6.913 23.386 6.313 23.379 5.512 c
+23.379 3.836 l
+23.379 3.021 23.5 2.418 23.746 2.028 c
+23.989 1.635 24.367 1.44 24.878 1.44 c
+25.367 1.44 25.731 1.631 25.966 2.014 c
+26.208 2.396 26.337 2.984 26.348 3.778 c
+h
+32.286 9.363 m
+34.065 2.587 l
+35.814 9.363 l
+38.283 9.363 l
+38.283 0 l
+36.388 0 l
+36.388 2.528 l
+36.564 6.438 l
+34.697 0 l
+33.404 0 l
+31.536 6.438 l
+31.713 2.528 l
+31.713 0 l
+29.817 0 l
+29.817 9.363 l
+h
+42.553 9.363 m
+44.332 2.587 l
+46.081 9.363 l
+48.551 9.363 l
+48.551 0 l
+46.655 0 l
+46.655 2.528 l
+46.831 6.438 l
+44.965 0 l
+43.671 0 l
+41.804 6.438 l
+41.981 2.528 l
+41.981 0 l
+40.084 0 l
+40.084 9.363 l
+h
+52.336 0 -1.897 9.363 re
+59.913 7.79 m
+57.591 7.79 l
+57.591 0 l
+55.695 0 l
+55.695 7.79 l
+53.416 7.79 l
+53.416 9.363 l
+59.913 9.363 l
+h
+65.047 2.454 m
+65.047 2.837 64.948 3.123 64.753 3.322 c
+64.554 3.516 64.202 3.719 63.695 3.925 c
+62.754 4.285 62.078 4.704 61.666 5.174 c
+61.254 5.652 61.049 6.221 61.049 6.879 c
+61.049 7.661 61.328 8.294 61.887 8.775 c
+62.445 9.253 63.155 9.496 64.018 9.496 c
+64.595 9.496 65.11 9.371 65.561 9.128 c
+66.01 8.882 66.355 8.54 66.59 8.099 c
+66.833 7.659 66.958 7.158 66.958 6.6 c
+65.077 6.6 l
+65.077 7.041 64.981 7.372 64.797 7.599 c
+64.61 7.823 64.342 7.937 63.988 7.937 c
+63.654 7.937 63.394 7.838 63.209 7.644 c
+63.033 7.456 62.945 7.195 62.945 6.865 c
+62.945 6.607 63.047 6.372 63.253 6.159 c
+63.459 5.953 63.82 5.737 64.342 5.512 c
+65.253 5.189 65.914 4.785 66.326 4.307 c
+66.745 3.825 66.958 3.212 66.958 2.469 c
+66.958 1.654 66.697 1.018 66.179 0.559 c
+65.657 0.095 64.951 -0.133 64.062 -0.133 c
+63.452 -0.133 62.901 -0.008 62.401 0.235 c
+61.909 0.488 61.522 0.845 61.24 1.309 c
+60.953 1.779 60.814 2.326 60.814 2.955 c
+62.71 2.955 l
+62.71 2.414 62.812 2.021 63.018 1.779 c
+63.232 1.532 63.581 1.411 64.062 1.411 c
+64.716 1.411 65.047 1.756 65.047 2.454 c
+68.876 -2.367 m
+67.906 -1.852 l
+68.141 -1.396 l
+68.413 -0.885 68.556 -0.375 68.568 0.133 c
+68.568 1.587 l
+70.155 1.587 l
+70.141 0.294 l
+70.141 -0.166 70.026 -0.636 69.802 -1.118 c
+69.574 -1.606 69.266 -2.022 68.876 -2.367 c
+74.877 0 m
+74.877 9.363 l
+77.773 9.363 l
+78.75 9.363 79.496 9.143 80.007 8.702 c
+80.514 8.268 80.771 7.632 80.771 6.791 c
+80.771 6.321 80.661 5.913 80.448 5.571 c
+80.242 5.226 79.952 4.976 79.581 4.821 c
+80 4.692 80.323 4.446 80.551 4.087 c
+80.786 3.734 80.904 3.285 80.904 2.749 c
+80.904 1.845 80.653 1.161 80.154 0.691 c
+79.654 0.228 78.926 0 77.979 0 c
+h
+76.773 4.072 m
+76.773 1.573 l
+77.979 1.573 l
+78.32 1.573 78.581 1.675 78.758 1.881 c
+78.934 2.094 79.022 2.396 79.022 2.778 c
+79.022 3.62 78.714 4.05 78.096 4.072 c
+h
+76.773 5.453 m
+77.758 5.453 l
+78.492 5.453 78.86 5.835 78.86 6.6 c
+78.86 7.019 78.772 7.324 78.596 7.511 c
+78.427 7.695 78.155 7.79 77.773 7.79 c
+76.773 7.79 l
+h
+85.306 3.425 m
+84.366 3.425 l
+84.366 0 l
+82.484 0 l
+82.484 9.363 l
+85.497 9.363 l
+86.445 9.363 87.176 9.117 87.687 8.628 c
+88.206 8.136 88.466 7.441 88.466 6.541 c
+88.466 5.295 88.015 4.424 87.114 3.925 c
+88.746 0.088 l
+88.746 0 l
+86.717 0 l
+h
+84.366 4.997 m
+85.438 4.997 l
+85.821 4.997 86.103 5.119 86.291 5.365 c
+86.475 5.619 86.57 5.957 86.57 6.379 c
+86.57 7.32 86.207 7.79 85.482 7.79 c
+84.366 7.79 l
+h
+94.452 1.911 m
+91.88 1.911 l
+91.381 0 l
+89.382 0 l
+92.306 9.363 l
+94.026 9.363 l
+96.981 0 l
+94.953 0 l
+h
+92.291 3.499 m
+94.041 3.499 l
+93.159 6.835 l
+h
+104.636 0 m
+102.739 0 l
+99.975 6.144 l
+99.975 0 l
+98.08 0 l
+98.08 9.363 l
+99.975 9.363 l
+102.739 3.219 l
+102.739 9.363 l
+104.636 9.363 l
+h
+112.738 3.116 m
+112.686 2.047 112.385 1.238 111.827 0.691 c
+111.275 0.139 110.504 -0.133 109.504 -0.133 c
+108.435 -0.133 107.616 0.213 107.05 0.912 c
+106.491 1.606 106.211 2.602 106.211 3.896 c
+106.211 5.468 l
+106.211 6.761 106.498 7.754 107.079 8.452 c
+107.667 9.147 108.479 9.496 109.519 9.496 c
+110.537 9.496 111.312 9.205 111.842 8.628 c
+112.37 8.058 112.671 7.239 112.752 6.173 c
+110.857 6.173 l
+110.834 6.838 110.732 7.295 110.548 7.541 c
+110.36 7.794 110.019 7.923 109.519 7.923 c
+109.019 7.923 108.659 7.746 108.446 7.393 c
+108.241 7.041 108.126 6.456 108.108 5.644 c
+108.108 3.881 l
+108.108 2.947 108.21 2.308 108.416 1.955 c
+108.63 1.61 108.993 1.44 109.504 1.44 c
+109.993 1.44 110.331 1.558 110.518 1.793 c
+110.713 2.036 110.82 2.477 110.842 3.116 c
+h
+120.686 0 m
+118.805 0 l
+118.805 4.013 l
+116.012 4.013 l
+116.012 0 l
+114.116 0 l
+114.116 9.363 l
+116.012 9.363 l
+116.012 5.571 l
+118.805 5.571 l
+118.805 9.363 l
+120.686 9.363 l
+h
+127.257 4.056 m
+124.317 4.056 l
+124.317 1.573 l
+127.801 1.573 l
+127.801 0 l
+122.421 0 l
+122.421 9.363 l
+127.786 9.363 l
+127.786 7.79 l
+124.317 7.79 l
+124.317 5.571 l
+127.257 5.571 l
+h
+133.019 2.454 m
+133.019 2.837 132.92 3.123 132.725 3.322 c
+132.527 3.516 132.174 3.719 131.667 3.925 c
+130.726 4.285 130.05 4.704 129.639 5.174 c
+129.227 5.652 129.021 6.221 129.021 6.879 c
+129.021 7.661 129.3 8.294 129.859 8.775 c
+130.418 9.253 131.127 9.496 131.99 9.496 c
+132.567 9.496 133.082 9.371 133.533 9.128 c
+133.982 8.882 134.327 8.54 134.562 8.099 c
+134.805 7.659 134.93 7.158 134.93 6.6 c
+133.049 6.6 l
+133.049 7.041 132.953 7.372 132.769 7.599 c
+132.582 7.823 132.313 7.937 131.96 7.937 c
+131.626 7.937 131.366 7.838 131.181 7.644 c
+131.005 7.456 130.917 7.195 130.917 6.865 c
+130.917 6.607 131.02 6.372 131.226 6.159 c
+131.432 5.953 131.792 5.737 132.313 5.512 c
+133.225 5.189 133.886 4.785 134.298 4.307 c
+134.717 3.825 134.93 3.212 134.93 2.469 c
+134.93 1.654 134.669 1.018 134.151 0.559 c
+133.629 0.095 132.924 -0.133 132.035 -0.133 c
+131.424 -0.133 130.873 -0.008 130.373 0.235 c
+129.88 0.488 129.495 0.845 129.212 1.309 c
+128.926 1.779 128.785 2.326 128.785 2.955 c
+130.682 2.955 l
+130.682 2.414 130.784 2.021 130.99 1.779 c
+131.204 1.532 131.553 1.411 132.035 1.411 c
+132.688 1.411 133.019 1.756 133.019 2.454 c
+143.985 1.911 m
+141.412 1.911 l
+140.912 0 l
+138.913 0 l
+141.838 9.363 l
+143.559 9.363 l
+146.513 0 l
+144.484 0 l
+h
+141.824 3.499 m
+143.573 3.499 l
+142.691 6.835 l
+h
+154.167 0 m
+152.271 0 l
+149.508 6.144 l
+149.508 0 l
+147.611 0 l
+147.611 9.363 l
+149.508 9.363 l
+152.271 3.219 l
+152.271 9.363 l
+154.167 9.363 l
+h
+155.92 0 m
+155.92 9.363 l
+158.405 9.363 l
+159.492 9.363 160.359 9.014 161.006 8.32 c
+161.66 7.621 161.994 6.674 162.006 5.468 c
+162.006 3.954 l
+162.006 2.72 161.682 1.749 161.036 1.043 c
+160.388 0.345 159.492 0 158.345 0 c
+h
+157.817 7.79 m
+157.817 1.573 l
+158.375 1.573 l
+159.01 1.573 159.455 1.738 159.712 2.072 c
+159.966 2.404 160.099 2.977 160.109 3.792 c
+160.109 5.409 l
+160.109 6.291 159.984 6.901 159.742 7.247 c
+159.507 7.588 159.095 7.769 158.507 7.79 c
+h
+172.361 7.79 m
+170.039 7.79 l
+170.039 0 l
+168.142 0 l
+168.142 7.79 l
+165.864 7.79 l
+165.864 9.363 l
+172.361 9.363 l
+h
+177.322 1.911 m
+174.75 1.911 l
+174.25 0 l
+172.251 0 l
+175.176 9.363 l
+176.896 9.363 l
+179.851 0 l
+177.821 0 l
+h
+175.161 3.499 m
+176.911 3.499 l
+176.028 6.835 l
+h
+187.182 1.058 m
+186.818 0.665 186.373 0.368 185.844 0.162 c
+185.314 -0.033 184.734 -0.133 184.109 -0.133 c
+183.029 -0.133 182.191 0.199 181.596 0.867 c
+180.996 1.532 180.692 2.502 180.684 3.778 c
+180.684 5.468 l
+180.684 6.761 180.963 7.754 181.522 8.452 c
+182.089 9.147 182.912 9.496 183.992 9.496 c
+185.01 9.496 185.774 9.238 186.284 8.731 c
+186.803 8.231 187.101 7.445 187.182 6.379 c
+185.344 6.379 l
+185.293 6.975 185.171 7.383 184.977 7.599 c
+184.778 7.813 184.47 7.923 184.051 7.923 c
+183.54 7.923 183.169 7.736 182.933 7.364 c
+182.706 6.99 182.588 6.398 182.581 5.585 c
+182.581 3.881 l
+182.581 3.028 182.706 2.404 182.963 2.014 c
+183.217 1.631 183.631 1.44 184.212 1.44 c
+184.583 1.44 184.888 1.514 185.123 1.661 c
+185.285 1.779 l
+185.285 3.499 l
+183.963 3.499 l
+183.963 4.924 l
+187.182 4.924 l
+h
+192.709 2.454 m
+192.709 2.837 192.609 3.123 192.414 3.322 c
+192.216 3.516 191.863 3.719 191.356 3.925 c
+190.415 4.285 189.739 4.704 189.328 5.174 c
+188.916 5.652 188.71 6.221 188.71 6.879 c
+188.71 7.661 188.99 8.294 189.548 8.775 c
+190.107 9.253 190.816 9.496 191.679 9.496 c
+192.256 9.496 192.771 9.371 193.223 9.128 c
+193.671 8.882 194.016 8.54 194.251 8.099 c
+194.494 7.659 194.619 7.158 194.619 6.6 c
+192.738 6.6 l
+192.738 7.041 192.642 7.372 192.458 7.599 c
+192.271 7.823 192.003 7.937 191.65 7.937 c
+191.315 7.937 191.055 7.838 190.871 7.644 c
+190.694 7.456 190.606 7.195 190.606 6.865 c
+190.606 6.607 190.709 6.372 190.915 6.159 c
+191.121 5.953 191.481 5.737 192.003 5.512 c
+192.914 5.189 193.575 4.785 193.987 4.307 c
+194.406 3.825 194.619 3.212 194.619 2.469 c
+194.619 1.654 194.359 1.018 193.84 0.559 c
+193.318 0.095 192.613 -0.133 191.724 -0.133 c
+191.113 -0.133 190.562 -0.008 190.062 0.235 c
+189.57 0.488 189.185 0.845 188.901 1.309 c
+188.615 1.779 188.475 2.326 188.475 2.955 c
+190.371 2.955 l
+190.371 2.414 190.474 2.021 190.679 1.779 c
+190.893 1.532 191.242 1.411 191.724 1.411 c
+192.377 1.411 192.709 1.756 192.709 2.454 c
+f
+Q
+0.797 0.801 0.141 0.02 K
+0.709 w 1 j 1 J
+q 1 0 0 1 535.6673 213.6594 cm
+0 0 m
+-254.669 0 l
+-254.669 -82.694 l
+-499.999 -82.694 l
+S
+Q
+0.793 0.801 0.129 0.016 k
+288.19 207.39 37.732 -54.746 re
+f
+0 0 0 0 k
+q 1 0 0 1 297.4504 198.7321 cm
+0 0 m
+0.294 0 0.445 0.195 0.455 0.588 c
+1.426 0.588 l
+1.426 0.154 1.294 -0.198 1.029 -0.47 c
+0.765 -0.735 0.426 -0.867 0.015 -0.867 c
+-0.496 -0.867 -0.889 -0.713 -1.161 -0.397 c
+-1.426 -0.073 -1.565 0.397 -1.573 1.014 c
+-1.573 1.338 l
+-1.573 1.962 -1.44 2.44 -1.176 2.764 c
+-0.904 3.094 -0.507 3.263 0.015 3.263 c
+0.445 3.263 0.786 3.123 1.043 2.851 c
+1.297 2.576 1.426 2.194 1.426 1.706 c
+0.455 1.706 l
+0.455 1.918 0.415 2.088 0.338 2.205 c
+0.268 2.33 0.151 2.396 -0.015 2.396 c
+-0.191 2.396 -0.32 2.33 -0.397 2.205 c
+-0.478 2.076 -0.522 1.827 -0.529 1.455 c
+-0.529 1.043 l
+-0.529 0.721 -0.515 0.493 -0.485 0.368 c
+-0.448 0.239 -0.393 0.147 -0.324 0.088 c
+-0.246 0.029 -0.139 0 0 0 c
+1.911 1.323 m
+1.911 1.929 2.051 2.404 2.337 2.749 c
+2.62 3.09 3.013 3.263 3.513 3.263 c
+4.021 3.263 4.417 3.09 4.704 2.749 c
+4.987 2.404 5.13 1.929 5.13 1.323 c
+5.13 1.058 l
+5.13 0.459 4.987 -0.011 4.704 -0.353 c
+4.417 -0.698 4.021 -0.867 3.513 -0.867 c
+3.002 -0.867 2.606 -0.698 2.323 -0.353 c
+2.047 -0.011 1.911 0.463 1.911 1.073 c
+h
+2.955 1.058 m
+2.955 0.353 3.138 0 3.513 0 c
+3.866 0 4.057 0.294 4.087 0.882 c
+4.087 1.323 l
+4.087 1.683 4.035 1.955 3.94 2.132 c
+3.84 2.308 3.697 2.396 3.513 2.396 c
+3.337 2.396 3.198 2.308 3.102 2.132 c
+3.002 1.955 2.955 1.683 2.955 1.323 c
+h
+6.747 3.19 m
+6.776 2.822 l
+7.011 3.117 7.32 3.263 7.703 3.263 c
+8.103 3.263 8.382 3.08 8.54 2.72 c
+8.775 3.08 9.103 3.263 9.525 3.263 c
+10.219 3.263 10.572 2.778 10.583 1.808 c
+10.583 -0.794 l
+9.554 -0.794 l
+9.554 1.749 l
+9.554 1.974 9.517 2.135 9.452 2.234 c
+9.392 2.33 9.282 2.381 9.128 2.381 c
+8.93 2.381 8.79 2.263 8.702 2.028 c
+8.702 -0.794 l
+7.659 -0.794 l
+7.659 1.735 l
+7.659 1.97 7.628 2.135 7.57 2.234 c
+7.511 2.33 7.401 2.381 7.247 2.381 c
+7.071 2.381 6.927 2.286 6.82 2.102 c
+6.82 -0.794 l
+5.777 -0.794 l
+5.777 3.19 l
+h
+12.332 3.19 m
+12.362 2.822 l
+12.597 3.117 12.906 3.263 13.288 3.263 c
+13.689 3.263 13.968 3.08 14.126 2.72 c
+14.361 3.08 14.688 3.263 15.111 3.263 c
+15.805 3.263 16.158 2.778 16.169 1.808 c
+16.169 -0.794 l
+15.14 -0.794 l
+15.14 1.749 l
+15.14 1.974 15.104 2.135 15.037 2.234 c
+14.978 2.33 14.868 2.381 14.714 2.381 c
+14.516 2.381 14.375 2.263 14.288 2.028 c
+14.288 -0.794 l
+13.244 -0.794 l
+13.244 1.735 l
+13.244 1.97 13.215 2.135 13.155 2.234 c
+13.097 2.33 12.987 2.381 12.833 2.381 c
+12.656 2.381 12.513 2.286 12.406 2.102 c
+12.406 -0.794 l
+11.362 -0.794 l
+11.362 3.19 l
+h
+18.036 -0.794 -1.043 3.984 re
+16.948 4.218 m
+16.948 4.374 16.996 4.501 17.095 4.601 c
+17.201 4.707 17.338 4.763 17.506 4.763 c
+17.683 4.763 17.819 4.707 17.918 4.601 c
+18.025 4.501 18.08 4.374 18.08 4.218 c
+18.08 4.05 18.025 3.913 17.918 3.807 c
+17.819 3.708 17.683 3.66 17.506 3.66 c
+17.338 3.66 17.201 3.708 17.095 3.807 c
+16.996 3.913 16.948 4.05 16.948 4.218 c
+20.05 4.16 m
+20.05 3.19 l
+20.579 3.19 l
+20.579 2.396 l
+20.05 2.396 l
+20.05 0.426 l
+20.05 0.268 20.068 0.162 20.108 0.103 c
+20.156 0.044 20.241 0.015 20.359 0.015 c
+20.465 0.015 20.549 0.023 20.608 0.044 c
+20.608 -0.764 l
+20.432 -0.831 20.241 -0.867 20.035 -0.867 c
+19.359 -0.867 19.013 -0.482 19.006 0.294 c
+19.006 2.396 l
+18.55 2.396 l
+18.55 3.19 l
+19.006 3.19 l
+19.006 4.16 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 331.7103 197.9382 cm
+0 0 m
+-0.04 0.088 -0.066 0.235 -0.073 0.441 c
+-0.309 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.023 -1.808 0.221 c
+-2.007 0.426 -2.102 0.713 -2.102 1.088 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.043 2.411 -0.573 2.411 c
+-0.088 2.411 l
+-0.088 2.837 l
+-0.088 3.072 -0.143 3.238 -0.25 3.337 c
+-0.36 3.444 -0.522 3.499 -0.735 3.499 c
+-0.933 3.499 -1.095 3.44 -1.22 3.323 c
+-1.338 3.205 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.076 -1.984 3.267 -1.866 3.454 c
+-1.741 3.639 -1.58 3.786 -1.382 3.896 c
+-1.176 4.002 -0.948 4.057 -0.691 4.057 c
+-0.291 4.057 0.015 3.954 0.22 3.749 c
+0.434 3.543 0.548 3.248 0.559 2.866 c
+0.559 0.853 l
+0.559 0.548 0.595 0.283 0.676 0.059 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.559 -0.411 0.647 c
+-0.264 0.736 -0.158 0.846 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.856 -1.191 1.72 c
+-1.367 1.592 -1.455 1.405 -1.455 1.162 c
+-1.455 0.934 -1.411 0.769 -1.323 0.661 c
+-1.234 0.563 -1.084 0.515 -0.867 0.515 c
+2.176 3.984 m
+2.19 3.543 l
+2.444 3.884 2.767 4.057 3.16 4.057 c
+3.866 4.057 4.222 3.587 4.233 2.646 c
+4.233 0 l
+3.587 0 l
+3.587 2.617 l
+3.587 2.929 3.532 3.15 3.425 3.278 c
+3.314 3.404 3.16 3.469 2.955 3.469 c
+2.797 3.469 2.649 3.414 2.514 3.308 c
+2.385 3.198 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.558 0 l
+1.558 3.984 l
+h
+6.791 2.176 m
+6.791 2.753 6.927 3.209 7.202 3.543 c
+7.485 3.884 7.857 4.057 8.32 4.057 c
+8.779 4.057 9.147 3.888 9.422 3.558 c
+9.705 3.234 9.852 2.786 9.863 2.22 c
+9.863 1.794 l
+9.863 1.224 9.72 0.769 9.437 0.426 c
+9.161 0.092 8.794 -0.073 8.334 -0.073 c
+7.871 -0.073 7.501 0.088 7.217 0.412 c
+6.942 0.742 6.799 1.183 6.791 1.735 c
+h
+7.437 1.794 m
+7.437 1.389 7.515 1.073 7.673 0.838 c
+7.838 0.603 8.058 0.485 8.334 0.485 c
+8.9 0.485 9.194 0.897 9.216 1.72 c
+9.216 2.176 l
+9.216 2.577 9.132 2.896 8.966 3.131 c
+8.808 3.373 8.592 3.499 8.32 3.499 c
+8.056 3.499 7.838 3.373 7.673 3.131 c
+7.515 2.896 7.437 2.577 7.437 2.176 c
+h
+13.582 1.794 m
+13.582 1.176 13.468 0.709 13.244 0.397 c
+13.027 0.081 12.704 -0.073 12.274 -0.073 c
+11.851 -0.073 11.539 0.107 11.333 0.47 c
+11.304 0 l
+10.701 0 l
+10.701 5.644 l
+11.348 5.644 l
+11.348 3.543 l
+11.561 3.884 11.869 4.057 12.274 4.057 c
+12.704 4.057 13.027 3.899 13.244 3.587 c
+13.468 3.282 13.582 2.816 13.582 2.19 c
+h
+12.935 2.176 m
+12.935 2.646 12.866 2.977 12.729 3.175 c
+12.601 3.37 12.391 3.469 12.097 3.469 c
+11.763 3.469 11.513 3.286 11.348 2.926 c
+11.348 1.044 l
+11.513 0.68 11.767 0.5 12.112 0.5 c
+12.406 0.5 12.615 0.603 12.744 0.809 c
+12.869 1.014 12.935 1.33 12.935 1.764 c
+h
+15.081 3.984 m
+15.081 -0.5 l
+15.081 -1.234 14.791 -1.602 14.214 -1.602 c
+14.074 -1.602 13.953 -1.579 13.847 -1.543 c
+13.847 -0.999 l
+13.916 -1.018 14.001 -1.028 14.111 -1.028 c
+14.217 -1.028 14.295 -0.985 14.346 -0.897 c
+14.406 -0.816 14.435 -0.675 14.435 -0.47 c
+14.435 3.984 l
+h
+15.111 5.027 m
+15.111 4.917 15.081 4.825 15.023 4.748 c
+14.963 4.678 14.868 4.645 14.743 4.645 c
+14.626 4.645 14.53 4.678 14.464 4.748 c
+14.406 4.825 14.375 4.917 14.375 5.027 c
+14.375 5.145 14.406 5.237 14.464 5.307 c
+14.53 5.384 14.626 5.424 14.743 5.424 c
+14.868 5.424 14.963 5.384 15.023 5.307 c
+15.081 5.226 15.111 5.134 15.111 5.027 c
+17.536 -0.073 m
+17.036 -0.073 16.654 0.073 16.39 0.368 c
+16.125 0.661 15.993 1.095 15.993 1.676 c
+15.993 2.147 l
+15.993 2.741 16.118 3.209 16.375 3.543 c
+16.64 3.884 16.999 4.057 17.463 4.057 c
+17.922 4.057 18.264 3.903 18.491 3.601 c
+18.726 3.308 18.848 2.845 18.859 2.22 c
+18.859 1.794 l
+16.64 1.794 l
+16.64 1.706 l
+16.64 1.272 16.717 0.96 16.875 0.765 c
+17.04 0.578 17.271 0.485 17.565 0.485 c
+17.76 0.485 17.933 0.518 18.08 0.588 c
+18.227 0.665 18.363 0.783 18.491 0.941 c
+18.83 0.53 l
+18.543 0.125 18.113 -0.073 17.536 -0.073 c
+17.463 3.499 m
+17.187 3.499 16.985 3.404 16.86 3.219 c
+16.731 3.032 16.658 2.741 16.64 2.352 c
+18.212 2.352 l
+18.212 2.44 l
+18.19 2.822 18.124 3.091 18.007 3.248 c
+17.889 3.414 17.705 3.499 17.463 3.499 c
+21.02 0.485 m
+21.232 0.485 21.406 0.548 21.534 0.676 c
+21.67 0.813 21.743 1.004 21.755 1.249 c
+22.372 1.249 l
+22.35 0.867 22.214 0.548 21.961 0.294 c
+21.703 0.048 21.391 -0.073 21.02 -0.073 c
+20.527 -0.073 20.153 0.077 19.888 0.383 c
+19.63 0.695 19.505 1.162 19.505 1.779 c
+19.505 2.22 l
+19.505 2.816 19.63 3.271 19.888 3.587 c
+20.153 3.899 20.527 4.057 21.02 4.057 c
+21.421 4.057 21.74 3.925 21.975 3.66 c
+22.217 3.404 22.35 3.057 22.372 2.617 c
+21.755 2.617 l
+21.733 2.911 21.659 3.131 21.534 3.278 c
+21.417 3.425 21.244 3.499 21.02 3.499 c
+20.725 3.499 20.509 3.4 20.373 3.205 c
+20.233 3.017 20.16 2.708 20.153 2.278 c
+20.153 1.764 l
+20.153 1.294 20.218 0.96 20.359 0.765 c
+20.505 0.578 20.725 0.485 21.02 0.485 c
+23.974 4.939 m
+23.974 3.984 l
+24.577 3.984 l
+24.577 3.454 l
+23.974 3.454 l
+23.974 0.985 l
+23.974 0.827 23.996 0.709 24.048 0.632 c
+24.106 0.551 24.195 0.515 24.312 0.515 c
+24.401 0.515 24.488 0.53 24.577 0.559 c
+24.577 0 l
+24.43 -0.047 24.276 -0.073 24.121 -0.073 c
+23.864 -0.073 23.669 0.019 23.534 0.206 c
+23.393 0.389 23.328 0.651 23.328 0.985 c
+23.328 3.454 l
+22.725 3.454 l
+22.725 3.984 l
+23.328 3.984 l
+23.328 4.939 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 301.3602 186.6493 cm
+0 0 m
+0 -0.646 -0.103 -1.132 -0.309 -1.455 c
+-0.515 -1.778 -0.837 -1.94 -1.278 -1.94 c
+-1.624 -1.94 -1.903 -1.786 -2.117 -1.469 c
+-2.146 -1.866 l
+-3.102 -1.866 l
+-3.102 3.778 l
+-2.057 3.778 l
+-2.057 1.794 l
+-1.863 2.058 -1.61 2.19 -1.294 2.19 c
+-0.852 2.19 -0.529 2.029 -0.323 1.706 c
+-0.118 1.382 -0.01 0.912 0 0.294 c
+h
+-1.043 0.25 m
+-1.043 0.669 -1.084 0.948 -1.161 1.088 c
+-1.242 1.235 -1.381 1.309 -1.587 1.309 c
+-1.804 1.309 -1.962 1.21 -2.057 1.014 c
+-2.057 -0.793 l
+-1.969 -0.981 -1.808 -1.072 -1.573 -1.072 c
+-1.378 -1.072 -1.242 -1.01 -1.161 -0.881 c
+-1.084 -0.756 -1.043 -0.5 -1.043 -0.118 c
+h
+2.587 1.103 m
+2.249 1.132 l
+1.962 1.132 1.771 1.008 1.676 0.765 c
+1.676 -1.866 l
+0.632 -1.866 l
+0.632 2.117 l
+1.602 2.117 l
+1.632 1.676 l
+1.798 2.018 2.029 2.19 2.323 2.19 c
+2.44 2.19 2.532 2.168 2.602 2.132 c
+h
+4.91 -1.866 m
+4.881 -1.808 4.851 -1.705 4.821 -1.558 c
+4.634 -1.815 4.385 -1.94 4.072 -1.94 c
+3.738 -1.94 3.458 -1.834 3.234 -1.616 c
+3.017 -1.392 2.911 -1.103 2.911 -0.75 c
+2.911 -0.338 3.043 -0.022 3.308 0.206 c
+3.572 0.441 3.954 0.559 4.454 0.559 c
+4.777 0.559 l
+4.777 0.882 l
+4.777 1.058 4.74 1.18 4.675 1.249 c
+4.616 1.327 4.528 1.367 4.41 1.367 c
+4.152 1.367 4.028 1.213 4.028 0.912 c
+2.984 0.912 l
+2.984 1.283 3.12 1.588 3.396 1.823 c
+3.668 2.066 4.017 2.19 4.439 2.19 c
+4.881 2.19 5.218 2.072 5.453 1.837 c
+5.696 1.61 5.821 1.287 5.821 0.867 c
+5.821 -0.999 l
+5.821 -1.344 5.869 -1.612 5.968 -1.808 c
+5.968 -1.866 l
+h
+4.307 -1.117 m
+4.414 -1.117 4.505 -1.099 4.586 -1.058 c
+4.675 -1.01 4.737 -0.951 4.777 -0.881 c
+4.777 -0.058 l
+4.528 -0.058 l
+4.351 -0.058 4.208 -0.118 4.102 -0.235 c
+4.002 -0.345 3.954 -0.492 3.954 -0.675 c
+3.954 -0.97 4.072 -1.117 4.307 -1.117 c
+7.526 2.117 m
+7.556 1.72 l
+7.791 2.033 8.092 2.19 8.467 2.19 c
+9.151 2.19 9.503 1.709 9.525 0.75 c
+9.525 -1.866 l
+8.482 -1.866 l
+8.482 0.676 l
+8.482 0.9 8.445 1.062 8.379 1.162 c
+8.309 1.257 8.191 1.309 8.026 1.309 c
+7.838 1.309 7.691 1.213 7.585 1.029 c
+7.585 -1.866 l
+6.541 -1.866 l
+6.541 2.117 l
+h
+11.715 -1.072 m
+12.009 -1.072 12.16 -0.878 12.171 -0.484 c
+13.141 -0.484 l
+13.141 -0.918 13.009 -1.271 12.744 -1.543 c
+12.48 -1.808 12.142 -1.94 11.73 -1.94 c
+11.219 -1.94 10.826 -1.786 10.554 -1.469 c
+10.29 -1.146 10.15 -0.675 10.143 -0.058 c
+10.143 0.265 l
+10.143 0.89 10.275 1.367 10.539 1.691 c
+10.812 2.022 11.208 2.19 11.73 2.19 c
+12.16 2.19 12.501 2.051 12.759 1.779 c
+13.012 1.503 13.141 1.121 13.141 0.632 c
+12.171 0.632 l
+12.171 0.846 12.131 1.014 12.054 1.132 c
+11.984 1.257 11.866 1.324 11.701 1.324 c
+11.524 1.324 11.396 1.257 11.319 1.132 c
+11.238 1.004 11.194 0.754 11.186 0.383 c
+11.186 -0.029 l
+11.186 -0.353 11.201 -0.58 11.231 -0.706 c
+11.267 -0.833 11.322 -0.926 11.392 -0.985 c
+11.469 -1.043 11.576 -1.072 11.715 -1.072 c
+14.758 1.764 m
+14.982 2.047 15.258 2.19 15.581 2.19 c
+15.942 2.19 16.217 2.062 16.405 1.808 c
+16.599 1.551 16.698 1.169 16.698 0.661 c
+16.698 -1.866 l
+15.655 -1.866 l
+15.655 0.647 l
+15.655 0.882 15.614 1.048 15.537 1.147 c
+15.468 1.253 15.354 1.309 15.199 1.309 c
+15.011 1.309 14.865 1.224 14.758 1.058 c
+14.758 -1.866 l
+13.714 -1.866 l
+13.714 3.778 l
+14.758 3.778 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 331.7103 184.7829 cm
+0 0 m
+-0.04 0.088 -0.066 0.235 -0.073 0.441 c
+-0.309 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.713 -2.102 1.087 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.837 l
+-0.088 3.072 -0.143 3.237 -0.25 3.337 c
+-0.36 3.443 -0.522 3.499 -0.735 3.499 c
+-0.933 3.499 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.076 -1.984 3.267 -1.866 3.454 c
+-1.741 3.638 -1.58 3.785 -1.382 3.896 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.015 3.954 0.22 3.748 c
+0.434 3.543 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.559 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.856 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.563 -1.084 0.515 -0.867 0.515 c
+4.924 3.366 m
+4.836 3.385 4.737 3.395 4.63 3.395 c
+4.295 3.395 4.06 3.212 3.925 2.851 c
+3.925 0 l
+3.278 0 l
+3.278 3.983 l
+3.91 3.983 l
+3.925 3.572 l
+4.101 3.896 4.343 4.056 4.659 4.056 c
+4.766 4.056 4.854 4.035 4.924 3.998 c
+h
+6.923 -0.073 m
+6.423 -0.073 6.041 0.073 5.777 0.368 c
+5.512 0.661 5.38 1.095 5.38 1.675 c
+5.38 2.146 l
+5.38 2.741 5.505 3.208 5.762 3.543 c
+6.026 3.884 6.387 4.056 6.85 4.056 c
+7.31 4.056 7.651 3.902 7.879 3.601 c
+8.114 3.308 8.235 2.844 8.247 2.219 c
+8.247 1.793 l
+6.026 1.793 l
+6.026 1.705 l
+6.026 1.272 6.104 0.96 6.262 0.764 c
+6.427 0.577 6.659 0.485 6.953 0.485 c
+7.148 0.485 7.32 0.518 7.468 0.588 c
+7.614 0.665 7.75 0.783 7.879 0.941 c
+8.216 0.529 l
+7.93 0.125 7.501 -0.073 6.923 -0.073 c
+6.85 3.499 m
+6.574 3.499 6.372 3.403 6.247 3.219 c
+6.119 3.032 6.045 2.741 6.026 2.352 c
+7.599 2.352 l
+7.599 2.44 l
+7.578 2.822 7.511 3.09 7.393 3.248 c
+7.276 3.414 7.092 3.499 6.85 3.499 c
+9.319 0 m
+9.319 3.454 l
+8.79 3.454 l
+8.79 3.983 l
+9.319 3.983 l
+9.319 4.439 l
+9.319 4.84 9.415 5.152 9.613 5.38 c
+9.819 5.604 10.098 5.718 10.451 5.718 c
+10.587 5.718 10.72 5.696 10.848 5.66 c
+10.819 5.115 l
+10.72 5.134 10.62 5.145 10.525 5.145 c
+10.15 5.145 9.966 4.88 9.966 4.351 c
+9.966 3.983 l
+10.643 3.983 l
+10.643 3.454 l
+9.966 3.454 l
+9.966 0 l
+h
+12.744 -0.073 m
+12.245 -0.073 11.862 0.073 11.597 0.368 c
+11.333 0.661 11.2 1.095 11.2 1.675 c
+11.2 2.146 l
+11.2 2.741 11.326 3.208 11.583 3.543 c
+11.848 3.884 12.208 4.056 12.671 4.056 c
+13.13 4.056 13.471 3.902 13.7 3.601 c
+13.935 3.308 14.056 2.844 14.067 2.219 c
+14.067 1.793 l
+11.848 1.793 l
+11.848 1.705 l
+11.848 1.272 11.925 0.96 12.083 0.764 c
+12.248 0.577 12.48 0.485 12.773 0.485 c
+12.968 0.485 13.141 0.518 13.288 0.588 c
+13.435 0.665 13.571 0.783 13.7 0.941 c
+14.038 0.529 l
+13.751 0.125 13.321 -0.073 12.744 -0.073 c
+12.671 3.499 m
+12.395 3.499 12.193 3.403 12.068 3.219 c
+11.939 3.032 11.866 2.741 11.848 2.352 c
+13.421 2.352 l
+13.421 2.44 l
+13.398 2.822 13.332 3.09 13.215 3.248 c
+13.097 3.414 12.914 3.499 12.671 3.499 c
+16.492 3.366 m
+16.405 3.385 16.305 3.395 16.199 3.395 c
+15.864 3.395 15.629 3.212 15.493 2.851 c
+15.493 0 l
+14.846 0 l
+14.846 3.983 l
+15.478 3.983 l
+15.493 3.572 l
+15.669 3.896 15.912 4.056 16.228 4.056 c
+16.334 4.056 16.422 4.035 16.492 3.998 c
+h
+18.491 -0.073 m
+17.992 -0.073 17.61 0.073 17.345 0.368 c
+17.08 0.661 16.948 1.095 16.948 1.675 c
+16.948 2.146 l
+16.948 2.741 17.073 3.208 17.33 3.543 c
+17.595 3.884 17.955 4.056 18.418 4.056 c
+18.877 4.056 19.219 3.902 19.447 3.601 c
+19.682 3.308 19.803 2.844 19.815 2.219 c
+19.815 1.793 l
+17.595 1.793 l
+17.595 1.705 l
+17.595 1.272 17.672 0.96 17.83 0.764 c
+17.995 0.577 18.227 0.485 18.521 0.485 c
+18.716 0.485 18.888 0.518 19.035 0.588 c
+19.183 0.665 19.318 0.783 19.447 0.941 c
+19.785 0.529 l
+19.499 0.125 19.069 -0.073 18.491 -0.073 c
+18.418 3.499 m
+18.142 3.499 17.94 3.403 17.816 3.219 c
+17.687 3.032 17.613 2.741 17.595 2.352 c
+19.168 2.352 l
+19.168 2.44 l
+19.146 2.822 19.079 3.09 18.962 3.248 c
+18.844 3.414 18.66 3.499 18.418 3.499 c
+21.211 3.983 m
+21.226 3.543 l
+21.479 3.884 21.803 4.056 22.196 4.056 c
+22.901 4.056 23.258 3.586 23.268 2.645 c
+23.268 0 l
+22.622 0 l
+22.622 2.616 l
+22.622 2.929 22.566 3.15 22.46 3.278 c
+22.35 3.403 22.196 3.469 21.99 3.469 c
+21.832 3.469 21.685 3.414 21.549 3.308 c
+21.421 3.197 21.317 3.061 21.24 2.896 c
+21.24 0 l
+20.594 0 l
+20.594 3.983 l
+h
+25.62 0.485 m
+25.834 0.485 26.007 0.548 26.135 0.676 c
+26.271 0.812 26.344 1.003 26.356 1.249 c
+26.973 1.249 l
+26.951 0.867 26.815 0.548 26.561 0.294 c
+26.304 0.048 25.992 -0.073 25.62 -0.073 c
+25.128 -0.073 24.754 0.077 24.488 0.382 c
+24.232 0.694 24.106 1.161 24.106 1.779 c
+24.106 2.219 l
+24.106 2.815 24.232 3.271 24.488 3.586 c
+24.754 3.899 25.128 4.056 25.62 4.056 c
+26.021 4.056 26.341 3.925 26.576 3.66 c
+26.819 3.403 26.951 3.057 26.973 2.616 c
+26.356 2.616 l
+26.333 2.911 26.26 3.131 26.135 3.278 c
+26.017 3.425 25.845 3.499 25.62 3.499 c
+25.327 3.499 25.109 3.399 24.974 3.204 c
+24.835 3.017 24.76 2.708 24.754 2.278 c
+24.754 1.764 l
+24.754 1.294 24.82 0.96 24.959 0.764 c
+25.106 0.577 25.327 0.485 25.62 0.485 c
+29.148 -0.073 m
+28.648 -0.073 28.266 0.073 28.002 0.368 c
+27.737 0.661 27.605 1.095 27.605 1.675 c
+27.605 2.146 l
+27.605 2.741 27.73 3.208 27.987 3.543 c
+28.251 3.884 28.612 4.056 29.074 4.056 c
+29.534 4.056 29.876 3.902 30.104 3.601 c
+30.339 3.308 30.46 2.844 30.471 2.219 c
+30.471 1.793 l
+28.251 1.793 l
+28.251 1.705 l
+28.251 1.272 28.328 0.96 28.487 0.764 c
+28.652 0.577 28.884 0.485 29.178 0.485 c
+29.373 0.485 29.545 0.518 29.693 0.588 c
+29.839 0.665 29.975 0.783 30.104 0.941 c
+30.441 0.529 l
+30.155 0.125 29.725 -0.073 29.148 -0.073 c
+29.074 3.499 m
+28.799 3.499 28.598 3.403 28.472 3.219 c
+28.344 3.032 28.27 2.741 28.251 2.352 c
+29.824 2.352 l
+29.824 2.44 l
+29.803 2.822 29.736 3.09 29.618 3.248 c
+29.501 3.414 29.317 3.499 29.074 3.499 c
+33.822 4.939 m
+33.822 3.983 l
+34.425 3.983 l
+34.425 3.454 l
+33.822 3.454 l
+33.822 0.985 l
+33.822 0.827 33.845 0.709 33.896 0.632 c
+33.955 0.551 34.043 0.515 34.161 0.515 c
+34.249 0.515 34.337 0.529 34.425 0.559 c
+34.425 0 l
+34.279 -0.048 34.123 -0.073 33.969 -0.073 c
+33.712 -0.073 33.518 0.019 33.381 0.206 c
+33.242 0.389 33.176 0.65 33.176 0.985 c
+33.176 3.454 l
+32.573 3.454 l
+32.573 3.983 l
+33.176 3.983 l
+33.176 4.939 l
+h
+34.984 2.175 m
+34.984 2.753 35.12 3.208 35.395 3.543 c
+35.678 3.884 36.049 4.056 36.513 4.056 c
+36.972 4.056 37.339 3.888 37.615 3.557 c
+37.898 3.233 38.044 2.786 38.056 2.219 c
+38.056 1.793 l
+38.056 1.224 37.913 0.768 37.63 0.426 c
+37.354 0.092 36.986 -0.073 36.527 -0.073 c
+36.064 -0.073 35.693 0.088 35.41 0.411 c
+35.135 0.742 34.991 1.183 34.984 1.735 c
+h
+35.63 1.793 m
+35.63 1.389 35.708 1.073 35.866 0.838 c
+36.031 0.603 36.251 0.485 36.527 0.485 c
+37.093 0.485 37.387 0.897 37.409 1.72 c
+37.409 2.175 l
+37.409 2.576 37.325 2.896 37.159 3.131 c
+37.001 3.373 36.785 3.499 36.513 3.499 c
+36.248 3.499 36.031 3.373 35.866 3.131 c
+35.708 2.896 35.63 2.576 35.63 2.175 c
+h
+42.657 0 m
+42.616 0.088 42.59 0.235 42.583 0.441 c
+42.348 0.096 42.054 -0.073 41.701 -0.073 c
+41.337 -0.073 41.055 0.022 40.849 0.22 c
+40.65 0.426 40.554 0.713 40.554 1.087 c
+40.554 1.488 40.691 1.808 40.966 2.043 c
+41.238 2.286 41.613 2.41 42.083 2.41 c
+42.568 2.41 l
+42.568 2.837 l
+42.568 3.072 42.513 3.237 42.407 3.337 c
+42.297 3.443 42.135 3.499 41.922 3.499 c
+41.724 3.499 41.562 3.439 41.437 3.322 c
+41.319 3.204 41.26 3.057 41.26 2.881 c
+40.614 2.881 l
+40.614 3.076 40.672 3.267 40.79 3.454 c
+40.915 3.638 41.076 3.785 41.275 3.896 c
+41.481 4.002 41.709 4.056 41.965 4.056 c
+42.366 4.056 42.671 3.954 42.877 3.748 c
+43.091 3.543 43.204 3.248 43.216 2.866 c
+43.216 0.852 l
+43.216 0.548 43.252 0.283 43.333 0.058 c
+43.333 0 l
+h
+41.79 0.515 m
+41.955 0.515 42.106 0.559 42.245 0.646 c
+42.393 0.735 42.499 0.845 42.568 0.985 c
+42.568 1.926 l
+42.201 1.926 l
+41.885 1.926 41.643 1.856 41.466 1.72 c
+41.29 1.591 41.202 1.404 41.202 1.161 c
+41.202 0.933 41.246 0.768 41.334 0.661 c
+41.422 0.563 41.572 0.515 41.79 0.515 c
+47.316 0.485 m
+47.529 0.485 47.702 0.548 47.831 0.676 c
+47.966 0.812 48.04 1.003 48.051 1.249 c
+48.668 1.249 l
+48.647 0.867 48.51 0.548 48.257 0.294 c
+47.999 0.048 47.687 -0.073 47.316 -0.073 c
+46.823 -0.073 46.449 0.077 46.185 0.382 c
+45.927 0.694 45.803 1.161 45.803 1.779 c
+45.803 2.219 l
+45.803 2.815 45.927 3.271 46.185 3.586 c
+46.449 3.899 46.823 4.056 47.316 4.056 c
+47.717 4.056 48.037 3.925 48.272 3.66 c
+48.514 3.403 48.647 3.057 48.668 2.616 c
+48.051 2.616 l
+48.029 2.911 47.956 3.131 47.831 3.278 c
+47.713 3.425 47.54 3.499 47.316 3.499 c
+47.022 3.499 46.806 3.399 46.669 3.204 c
+46.53 3.017 46.457 2.708 46.449 2.278 c
+46.449 1.764 l
+46.449 1.294 46.515 0.96 46.655 0.764 c
+46.802 0.577 47.022 0.485 47.316 0.485 c
+49.286 2.175 m
+49.286 2.753 49.422 3.208 49.697 3.543 c
+49.981 3.884 50.351 4.056 50.815 4.056 c
+51.274 4.056 51.642 3.888 51.918 3.557 c
+52.2 3.233 52.347 2.786 52.358 2.219 c
+52.358 1.793 l
+52.358 1.224 52.215 0.768 51.932 0.426 c
+51.656 0.092 51.289 -0.073 50.829 -0.073 c
+50.366 -0.073 49.996 0.088 49.712 0.411 c
+49.437 0.742 49.294 1.183 49.286 1.735 c
+h
+49.933 1.793 m
+49.933 1.389 50.01 1.073 50.168 0.838 c
+50.333 0.603 50.553 0.485 50.829 0.485 c
+51.395 0.485 51.689 0.897 51.711 1.72 c
+51.711 2.175 l
+51.711 2.576 51.627 2.896 51.461 3.131 c
+51.303 3.373 51.087 3.499 50.815 3.499 c
+50.55 3.499 50.333 3.373 50.168 3.131 c
+50.01 2.896 49.933 2.576 49.933 2.175 c
+h
+53.813 3.983 m
+53.828 3.616 l
+54.071 3.91 54.39 4.056 54.783 4.056 c
+55.224 4.056 55.533 3.859 55.71 3.469 c
+55.963 3.859 56.312 4.056 56.753 4.056 c
+57.488 4.056 57.863 3.594 57.885 2.675 c
+57.885 0 l
+57.238 0 l
+57.238 2.616 l
+57.238 2.911 57.183 3.123 57.077 3.263 c
+56.977 3.399 56.805 3.469 56.562 3.469 c
+56.363 3.469 56.202 3.389 56.077 3.233 c
+55.959 3.087 55.889 2.896 55.871 2.66 c
+55.871 0 l
+55.21 0 l
+55.21 2.645 l
+55.21 3.194 54.989 3.469 54.548 3.469 c
+54.214 3.469 53.979 3.308 53.842 2.984 c
+53.842 0 l
+53.196 0 l
+53.196 3.983 l
+h
+59.473 3.983 m
+59.487 3.616 l
+59.729 3.91 60.049 4.056 60.443 4.056 c
+60.884 4.056 61.192 3.859 61.368 3.469 c
+61.622 3.859 61.971 4.056 62.412 4.056 c
+63.147 4.056 63.522 3.594 63.544 2.675 c
+63.544 0 l
+62.897 0 l
+62.897 2.616 l
+62.897 2.911 62.842 3.123 62.736 3.263 c
+62.636 3.399 62.464 3.469 62.221 3.469 c
+62.023 3.469 61.861 3.389 61.736 3.233 c
+61.618 3.087 61.549 2.896 61.53 2.66 c
+61.53 0 l
+60.869 0 l
+60.869 2.645 l
+60.869 3.194 60.649 3.469 60.207 3.469 c
+59.873 3.469 59.638 3.308 59.502 2.984 c
+59.502 0 l
+58.855 0 l
+58.855 3.983 l
+h
+65.22 0 -0.646 3.983 re
+65.264 5.027 m
+65.264 4.917 65.235 4.825 65.175 4.748 c
+65.117 4.678 65.021 4.644 64.896 4.644 c
+64.778 4.644 64.683 4.678 64.617 4.748 c
+64.558 4.825 64.529 4.917 64.529 5.027 c
+64.529 5.145 64.558 5.236 64.617 5.307 c
+64.683 5.384 64.778 5.424 64.896 5.424 c
+65.021 5.424 65.117 5.384 65.175 5.307 c
+65.235 5.226 65.264 5.134 65.264 5.027 c
+67.087 4.939 m
+67.087 3.983 l
+67.689 3.983 l
+67.689 3.454 l
+67.087 3.454 l
+67.087 0.985 l
+67.087 0.827 67.109 0.709 67.16 0.632 c
+67.219 0.551 67.307 0.515 67.425 0.515 c
+67.513 0.515 67.601 0.529 67.689 0.559 c
+67.689 0 l
+67.542 -0.048 67.388 -0.073 67.234 -0.073 c
+66.976 -0.073 66.781 0.019 66.646 0.206 c
+66.506 0.389 66.44 0.65 66.44 0.985 c
+66.44 3.454 l
+65.837 3.454 l
+65.837 3.983 l
+66.44 3.983 l
+66.44 4.939 l
+h
+68.498 3.175 m
+68.498 3.293 68.531 3.389 68.601 3.469 c
+68.666 3.547 68.77 3.586 68.909 3.586 c
+69.056 3.586 69.163 3.547 69.233 3.469 c
+69.31 3.389 69.35 3.293 69.35 3.175 c
+69.35 3.065 69.31 2.973 69.233 2.896 c
+69.163 2.815 69.056 2.778 68.909 2.778 c
+68.77 2.778 68.666 2.815 68.601 2.896 c
+68.531 2.973 68.498 3.065 68.498 3.175 c
+68.468 -1.073 m
+68.071 -0.808 l
+68.306 -0.485 68.427 -0.151 68.439 0.191 c
+68.439 0.808 l
+69.1 0.808 l
+69.1 0.279 l
+69.1 0.022 69.034 -0.224 68.909 -0.47 c
+68.792 -0.713 68.645 -0.915 68.468 -1.073 c
+73.084 0.485 m
+73.297 0.485 73.47 0.548 73.598 0.676 c
+73.734 0.812 73.808 1.003 73.819 1.249 c
+74.436 1.249 l
+74.414 0.867 74.278 0.548 74.025 0.294 c
+73.767 0.048 73.455 -0.073 73.084 -0.073 c
+72.591 -0.073 72.217 0.077 71.952 0.382 c
+71.695 0.694 71.57 1.161 71.57 1.779 c
+71.57 2.219 l
+71.57 2.815 71.695 3.271 71.952 3.586 c
+72.217 3.899 72.591 4.056 73.084 4.056 c
+73.484 4.056 73.804 3.925 74.039 3.66 c
+74.282 3.403 74.414 3.057 74.436 2.616 c
+73.819 2.616 l
+73.796 2.911 73.723 3.131 73.598 3.278 c
+73.48 3.425 73.308 3.499 73.084 3.499 c
+72.79 3.499 72.573 3.399 72.437 3.204 c
+72.298 3.017 72.223 2.708 72.217 2.278 c
+72.217 1.764 l
+72.217 1.294 72.283 0.96 72.422 0.764 c
+72.57 0.577 72.79 0.485 73.084 0.485 c
+77.229 0 m
+77.189 0.088 77.162 0.235 77.156 0.441 c
+76.92 0.096 76.626 -0.073 76.273 -0.073 c
+75.909 -0.073 75.627 0.022 75.421 0.22 c
+75.222 0.426 75.127 0.713 75.127 1.087 c
+75.127 1.488 75.263 1.808 75.539 2.043 c
+75.81 2.286 76.185 2.41 76.655 2.41 c
+77.141 2.41 l
+77.141 2.837 l
+77.141 3.072 77.085 3.237 76.979 3.337 c
+76.869 3.443 76.707 3.499 76.494 3.499 c
+76.296 3.499 76.134 3.439 76.009 3.322 c
+75.891 3.204 75.832 3.057 75.832 2.881 c
+75.186 2.881 l
+75.186 3.076 75.244 3.267 75.362 3.454 c
+75.487 3.638 75.649 3.785 75.847 3.896 c
+76.053 4.002 76.281 4.056 76.538 4.056 c
+76.938 4.056 77.243 3.954 77.449 3.748 c
+77.663 3.543 77.777 3.248 77.788 2.866 c
+77.788 0.852 l
+77.788 0.548 77.825 0.283 77.905 0.058 c
+77.905 0 l
+h
+76.362 0.515 m
+76.527 0.515 76.678 0.559 76.817 0.646 c
+76.965 0.735 77.071 0.845 77.141 0.985 c
+77.141 1.926 l
+76.773 1.926 l
+76.457 1.926 76.215 1.856 76.038 1.72 c
+75.862 1.591 75.774 1.404 75.774 1.161 c
+75.774 0.933 75.818 0.768 75.906 0.661 c
+75.994 0.563 76.144 0.515 76.362 0.515 c
+79.404 3.983 m
+79.419 3.543 l
+79.672 3.884 79.996 4.056 80.389 4.056 c
+81.095 4.056 81.451 3.586 81.462 2.645 c
+81.462 0 l
+80.815 0 l
+80.815 2.616 l
+80.815 2.929 80.761 3.15 80.653 3.278 c
+80.543 3.403 80.389 3.469 80.183 3.469 c
+80.025 3.469 79.878 3.414 79.743 3.308 c
+79.614 3.197 79.511 3.061 79.434 2.896 c
+79.434 0 l
+78.787 0 l
+78.787 3.983 l
+h
+84.799 3.572 m
+85.052 3.896 85.372 4.056 85.754 4.056 c
+86.46 4.056 86.816 3.586 86.827 2.645 c
+86.827 0 l
+86.18 0 l
+86.18 2.616 l
+86.18 2.929 86.126 3.15 86.019 3.278 c
+85.908 3.403 85.754 3.469 85.549 3.469 c
+85.391 3.469 85.243 3.414 85.108 3.308 c
+84.979 3.197 84.876 3.061 84.799 2.896 c
+84.799 0 l
+84.152 0 l
+84.152 5.644 l
+84.799 5.644 l
+h
+89.826 0 m
+89.785 0.088 89.76 0.235 89.752 0.441 c
+89.517 0.096 89.223 -0.073 88.871 -0.073 c
+88.507 -0.073 88.223 0.022 88.018 0.22 c
+87.82 0.426 87.724 0.713 87.724 1.087 c
+87.724 1.488 87.86 1.808 88.136 2.043 c
+88.408 2.286 88.782 2.41 89.253 2.41 c
+89.738 2.41 l
+89.738 2.837 l
+89.738 3.072 89.683 3.237 89.576 3.337 c
+89.466 3.443 89.304 3.499 89.091 3.499 c
+88.892 3.499 88.731 3.439 88.606 3.322 c
+88.489 3.204 88.43 3.057 88.43 2.881 c
+87.783 2.881 l
+87.783 3.076 87.842 3.267 87.959 3.454 c
+88.084 3.638 88.246 3.785 88.445 3.896 c
+88.65 4.002 88.878 4.056 89.135 4.056 c
+89.536 4.056 89.841 3.954 90.047 3.748 c
+90.259 3.543 90.373 3.248 90.384 2.866 c
+90.384 0.852 l
+90.384 0.548 90.421 0.283 90.502 0.058 c
+90.502 0 l
+h
+88.959 0.515 m
+89.124 0.515 89.275 0.559 89.414 0.646 c
+89.561 0.735 89.668 0.845 89.738 0.985 c
+89.738 1.926 l
+89.37 1.926 l
+89.054 1.926 88.811 1.856 88.636 1.72 c
+88.459 1.591 88.371 1.404 88.371 1.161 c
+88.371 0.933 88.414 0.768 88.503 0.661 c
+88.591 0.563 88.742 0.515 88.959 0.515 c
+92.457 0.985 m
+93.207 3.983 l
+93.868 3.983 l
+92.692 0 l
+92.207 0 l
+91.017 3.983 l
+91.678 3.983 l
+h
+95.926 -0.073 m
+95.427 -0.073 95.044 0.073 94.779 0.368 c
+94.515 0.661 94.383 1.095 94.383 1.675 c
+94.383 2.146 l
+94.383 2.741 94.508 3.208 94.764 3.543 c
+95.03 3.884 95.39 4.056 95.853 4.056 c
+96.312 4.056 96.653 3.902 96.881 3.601 c
+97.116 3.308 97.238 2.844 97.249 2.219 c
+97.249 1.793 l
+95.03 1.793 l
+95.03 1.705 l
+95.03 1.272 95.107 0.96 95.265 0.764 c
+95.43 0.577 95.662 0.485 95.955 0.485 c
+96.15 0.485 96.323 0.518 96.47 0.588 c
+96.617 0.665 96.753 0.783 96.881 0.941 c
+97.22 0.529 l
+96.933 0.125 96.503 -0.073 95.926 -0.073 c
+95.853 3.499 m
+95.577 3.499 95.375 3.403 95.25 3.219 c
+95.121 3.032 95.048 2.741 95.03 2.352 c
+96.603 2.352 l
+96.603 2.44 l
+96.58 2.822 96.514 3.09 96.397 3.248 c
+96.279 3.414 96.096 3.499 95.853 3.499 c
+101.791 0 m
+101.75 0.088 101.725 0.235 101.717 0.441 c
+101.482 0.096 101.189 -0.073 100.836 -0.073 c
+100.472 -0.073 100.189 0.022 99.983 0.22 c
+99.784 0.426 99.689 0.713 99.689 1.087 c
+99.689 1.488 99.825 1.808 100.1 2.043 c
+100.372 2.286 100.748 2.41 101.218 2.41 c
+101.702 2.41 l
+101.702 2.837 l
+101.702 3.072 101.648 3.237 101.542 3.337 c
+101.431 3.443 101.27 3.499 101.056 3.499 c
+100.858 3.499 100.696 3.439 100.571 3.322 c
+100.453 3.204 100.395 3.057 100.395 2.881 c
+99.748 2.881 l
+99.748 3.076 99.807 3.267 99.924 3.454 c
+100.049 3.638 100.21 3.785 100.409 3.896 c
+100.615 4.002 100.843 4.056 101.1 4.056 c
+101.501 4.056 101.806 3.954 102.012 3.748 c
+102.224 3.543 102.338 3.248 102.35 2.866 c
+102.35 0.852 l
+102.35 0.548 102.386 0.283 102.467 0.058 c
+102.467 0 l
+h
+100.923 0.515 m
+101.089 0.515 101.24 0.559 101.38 0.646 c
+101.526 0.735 101.633 0.845 101.702 0.985 c
+101.702 1.926 l
+101.336 1.926 l
+101.019 1.926 100.777 1.856 100.601 1.72 c
+100.424 1.591 100.336 1.404 100.336 1.161 c
+100.336 0.933 100.38 0.768 100.468 0.661 c
+100.557 0.563 100.707 0.515 100.923 0.515 c
+f
+Q
+q 1 0 0 1 437.8812 189.7368 cm
+0 0 m
+0 -0.971 l
+0.53 -0.971 l
+0.53 -1.764 l
+0 -1.764 l
+0 -3.734 l
+0 -3.892 0.019 -3.998 0.059 -4.057 c
+0.107 -4.116 0.192 -4.146 0.31 -4.146 c
+0.416 -4.146 0.5 -4.138 0.559 -4.116 c
+0.559 -4.925 l
+0.383 -4.991 0.192 -5.027 -0.014 -5.027 c
+-0.69 -5.027 -1.036 -4.642 -1.043 -3.866 c
+-1.043 -1.764 l
+-1.499 -1.764 l
+-1.499 -0.971 l
+-1.043 -0.971 l
+-1.043 0 l
+h
+3.057 -1.985 m
+2.72 -1.956 l
+2.433 -1.956 2.242 -2.08 2.147 -2.323 c
+2.147 -4.954 l
+1.103 -4.954 l
+1.103 -0.971 l
+2.073 -0.971 l
+2.103 -1.411 l
+2.268 -1.07 2.5 -0.897 2.793 -0.897 c
+2.911 -0.897 3.003 -0.919 3.072 -0.956 c
+h
+5.38 -4.954 m
+5.351 -4.896 5.322 -4.792 5.292 -4.645 c
+5.104 -4.902 4.855 -5.027 4.543 -5.027 c
+4.208 -5.027 3.929 -4.921 3.705 -4.704 c
+3.487 -4.48 3.381 -4.19 3.381 -3.837 c
+3.381 -3.425 3.514 -3.109 3.778 -2.881 c
+4.042 -2.646 4.425 -2.529 4.925 -2.529 c
+5.248 -2.529 l
+5.248 -2.205 l
+5.248 -2.029 5.212 -1.908 5.145 -1.838 c
+5.087 -1.76 4.998 -1.721 4.881 -1.721 c
+4.623 -1.721 4.499 -1.875 4.499 -2.176 c
+3.454 -2.176 l
+3.454 -1.804 3.591 -1.5 3.866 -1.264 c
+4.138 -1.022 4.487 -0.897 4.91 -0.897 c
+5.351 -0.897 5.689 -1.015 5.924 -1.25 c
+6.167 -1.478 6.292 -1.801 6.292 -2.22 c
+6.292 -4.087 l
+6.292 -4.432 6.34 -4.7 6.438 -4.896 c
+6.438 -4.954 l
+h
+4.778 -4.204 m
+4.884 -4.204 4.977 -4.186 5.056 -4.146 c
+5.145 -4.098 5.208 -4.039 5.248 -3.969 c
+5.248 -3.146 l
+4.998 -3.146 l
+4.821 -3.146 4.678 -3.205 4.572 -3.323 c
+4.472 -3.433 4.425 -3.58 4.425 -3.763 c
+4.425 -4.057 4.543 -4.204 4.778 -4.204 c
+8.482 -4.16 m
+8.776 -4.16 8.927 -3.965 8.937 -3.572 c
+9.908 -3.572 l
+9.908 -4.006 9.775 -4.358 9.511 -4.63 c
+9.247 -4.896 8.908 -5.027 8.497 -5.027 c
+7.986 -5.027 7.593 -4.873 7.321 -4.557 c
+7.056 -4.233 6.916 -3.763 6.909 -3.146 c
+6.909 -2.822 l
+6.909 -2.198 7.041 -1.721 7.306 -1.397 c
+7.578 -1.066 7.975 -0.897 8.497 -0.897 c
+8.927 -0.897 9.268 -1.037 9.525 -1.309 c
+9.779 -1.584 9.908 -1.966 9.908 -2.455 c
+8.937 -2.455 l
+8.937 -2.242 8.897 -2.073 8.819 -1.956 c
+8.75 -1.831 8.632 -1.764 8.467 -1.764 c
+8.291 -1.764 8.162 -1.831 8.085 -1.956 c
+8.004 -2.084 7.96 -2.334 7.953 -2.705 c
+7.953 -3.117 l
+7.953 -3.44 7.967 -3.668 7.996 -3.793 c
+8.034 -3.921 8.088 -4.013 8.158 -4.072 c
+8.235 -4.131 8.342 -4.16 8.482 -4.16 c
+11.834 -3.425 m
+11.554 -3.734 l
+11.554 -4.954 l
+10.51 -4.954 l
+10.51 0.691 l
+11.554 0.691 l
+11.554 -2.352 l
+11.672 -2.161 l
+12.391 -0.971 l
+13.641 -0.971 l
+12.48 -2.617 l
+13.744 -4.954 l
+12.553 -4.954 l
+h
+15.64 -5.027 m
+15.111 -5.027 14.692 -4.873 14.391 -4.557 c
+14.097 -4.233 13.95 -3.774 13.95 -3.175 c
+13.95 -2.866 l
+13.95 -2.242 14.086 -1.757 14.361 -1.411 c
+14.633 -1.07 15.026 -0.897 15.537 -0.897 c
+16.037 -0.897 16.408 -1.058 16.655 -1.382 c
+16.908 -1.706 17.041 -2.183 17.051 -2.808 c
+17.051 -3.308 l
+14.978 -3.308 l
+14.997 -3.602 15.059 -3.818 15.169 -3.955 c
+15.287 -4.094 15.468 -4.16 15.714 -4.16 c
+16.056 -4.16 16.345 -4.042 16.581 -3.807 c
+16.993 -4.439 l
+16.864 -4.616 16.676 -4.759 16.434 -4.865 c
+16.187 -4.973 15.923 -5.027 15.64 -5.027 c
+14.993 -2.587 m
+16.023 -2.587 l
+16.023 -2.484 l
+16.023 -2.249 15.982 -2.073 15.905 -1.956 c
+15.835 -1.831 15.707 -1.764 15.522 -1.764 c
+15.346 -1.764 15.214 -1.834 15.126 -1.97 c
+15.045 -2.099 15.001 -2.305 14.993 -2.587 c
+17.492 -2.837 m
+17.492 -2.191 17.598 -1.706 17.816 -1.382 c
+18.04 -1.058 18.363 -0.897 18.786 -0.897 c
+19.098 -0.897 19.352 -1.029 19.55 -1.294 c
+19.55 0.691 l
+20.609 0.691 l
+20.609 -4.954 l
+19.653 -4.954 l
+19.609 -4.543 l
+19.392 -4.865 19.117 -5.027 18.786 -5.027 c
+18.375 -5.027 18.055 -4.873 17.831 -4.557 c
+17.613 -4.233 17.5 -3.763 17.492 -3.146 c
+h
+18.536 -3.102 m
+18.536 -3.495 18.573 -3.77 18.654 -3.925 c
+18.741 -4.083 18.889 -4.16 19.094 -4.16 c
+19.3 -4.16 19.451 -4.069 19.55 -3.881 c
+19.55 -2.073 l
+19.451 -1.878 19.3 -1.779 19.094 -1.779 c
+18.896 -1.779 18.756 -1.86 18.668 -2.014 c
+18.58 -2.161 18.536 -2.433 18.536 -2.822 c
+h
+25.062 -4.586 m
+24.846 -4.881 24.555 -5.027 24.195 -5.027 c
+23.831 -5.027 23.552 -4.906 23.358 -4.66 c
+23.169 -4.406 23.078 -4.039 23.078 -3.558 c
+23.078 -0.971 l
+24.121 -0.971 l
+24.121 -3.572 l
+24.121 -3.965 24.247 -4.16 24.503 -4.16 c
+24.739 -4.16 24.908 -4.057 25.018 -3.851 c
+25.018 -0.971 l
+26.062 -0.971 l
+26.062 -4.954 l
+25.091 -4.954 l
+h
+29.913 -3.087 m
+29.913 -3.716 29.803 -4.197 29.59 -4.528 c
+29.373 -4.862 29.053 -5.027 28.634 -5.027 c
+28.311 -5.027 28.05 -4.896 27.855 -4.63 c
+27.855 -6.483 l
+26.811 -6.483 l
+26.811 -0.971 l
+27.767 -0.971 l
+27.811 -1.338 l
+28.006 -1.044 28.274 -0.897 28.619 -0.897 c
+29.039 -0.897 29.358 -1.055 29.575 -1.368 c
+29.788 -1.673 29.902 -2.143 29.913 -2.779 c
+h
+28.869 -2.822 m
+28.869 -2.44 28.825 -2.172 28.737 -2.014 c
+28.656 -1.86 28.517 -1.779 28.311 -1.779 c
+28.105 -1.779 27.95 -1.867 27.855 -2.043 c
+27.855 -3.911 l
+27.944 -4.079 28.098 -4.16 28.326 -4.16 c
+28.532 -4.16 28.671 -4.079 28.752 -3.911 c
+28.829 -3.734 28.869 -3.462 28.869 -3.087 c
+h
+32.309 -3.881 m
+32.309 -3.793 32.265 -3.716 32.177 -3.645 c
+32.089 -3.568 31.901 -3.466 31.618 -3.337 c
+31.185 -3.161 30.886 -2.98 30.722 -2.793 c
+30.564 -2.61 30.487 -2.378 30.487 -2.103 c
+30.487 -1.76 30.608 -1.478 30.853 -1.25 c
+31.107 -1.015 31.445 -0.897 31.868 -0.897 c
+32.297 -0.897 32.647 -1.011 32.912 -1.235 c
+33.176 -1.463 33.309 -1.764 33.309 -2.147 c
+32.265 -2.147 l
+32.265 -1.823 32.125 -1.661 31.853 -1.661 c
+31.743 -1.661 31.655 -1.698 31.589 -1.764 c
+31.519 -1.834 31.486 -1.933 31.486 -2.058 c
+31.486 -2.147 31.522 -2.228 31.603 -2.294 c
+31.68 -2.352 31.861 -2.448 32.147 -2.573 c
+32.577 -2.731 32.875 -2.907 33.043 -3.102 c
+33.22 -3.289 33.309 -3.539 33.309 -3.851 c
+33.309 -4.204 33.176 -4.491 32.912 -4.704 c
+32.647 -4.921 32.297 -5.027 31.868 -5.027 c
+31.574 -5.027 31.313 -4.973 31.089 -4.865 c
+30.861 -4.748 30.685 -4.586 30.56 -4.381 c
+30.442 -4.175 30.383 -3.955 30.383 -3.72 c
+31.368 -3.72 l
+31.368 -3.907 31.405 -4.042 31.486 -4.131 c
+31.574 -4.219 31.707 -4.263 31.883 -4.263 c
+32.166 -4.263 32.309 -4.138 32.309 -3.881 c
+35.175 0 m
+35.175 -0.971 l
+35.705 -0.971 l
+35.705 -1.764 l
+35.175 -1.764 l
+35.175 -3.734 l
+35.175 -3.892 35.194 -3.998 35.234 -4.057 c
+35.281 -4.116 35.366 -4.146 35.484 -4.146 c
+35.59 -4.146 35.675 -4.138 35.734 -4.116 c
+35.734 -4.925 l
+35.557 -4.991 35.366 -5.027 35.16 -5.027 c
+34.485 -5.027 34.139 -4.642 34.132 -3.866 c
+34.132 -1.764 l
+33.676 -1.764 l
+33.676 -0.971 l
+34.132 -0.971 l
+34.132 0 l
+h
+38.233 -1.985 m
+37.895 -1.956 l
+37.608 -1.956 37.417 -2.08 37.321 -2.323 c
+37.321 -4.954 l
+36.278 -4.954 l
+36.278 -0.971 l
+37.248 -0.971 l
+37.277 -1.411 l
+37.442 -1.07 37.674 -0.897 37.968 -0.897 c
+38.086 -0.897 38.177 -0.919 38.248 -0.956 c
+h
+40.305 -5.027 m
+39.776 -5.027 39.357 -4.873 39.056 -4.557 c
+38.762 -4.233 38.615 -3.774 38.615 -3.175 c
+38.615 -2.866 l
+38.615 -2.242 38.751 -1.757 39.027 -1.411 c
+39.298 -1.07 39.692 -0.897 40.202 -0.897 c
+40.702 -0.897 41.074 -1.058 41.319 -1.382 c
+41.573 -1.706 41.705 -2.183 41.716 -2.808 c
+41.716 -3.308 l
+39.644 -3.308 l
+39.663 -3.602 39.725 -3.818 39.835 -3.955 c
+39.952 -4.094 40.133 -4.16 40.378 -4.16 c
+40.721 -4.16 41.011 -4.042 41.246 -3.807 c
+41.658 -4.439 l
+41.529 -4.616 41.342 -4.759 41.099 -4.865 c
+40.853 -4.973 40.588 -5.027 40.305 -5.027 c
+39.659 -2.587 m
+40.687 -2.587 l
+40.687 -2.484 l
+40.687 -2.249 40.647 -2.073 40.569 -1.956 c
+40.5 -1.831 40.371 -1.764 40.187 -1.764 c
+40.012 -1.764 39.879 -1.834 39.79 -1.97 c
+39.71 -2.099 39.665 -2.305 39.659 -2.587 c
+44.186 -4.954 m
+44.156 -4.896 44.127 -4.792 44.097 -4.645 c
+43.91 -4.902 43.661 -5.027 43.348 -5.027 c
+43.013 -5.027 42.734 -4.921 42.51 -4.704 c
+42.293 -4.48 42.187 -4.19 42.187 -3.837 c
+42.187 -3.425 42.319 -3.109 42.584 -2.881 c
+42.848 -2.646 43.231 -2.529 43.73 -2.529 c
+44.054 -2.529 l
+44.054 -2.205 l
+44.054 -2.029 44.017 -1.908 43.95 -1.838 c
+43.892 -1.76 43.804 -1.721 43.686 -1.721 c
+43.428 -1.721 43.304 -1.875 43.304 -2.176 c
+42.26 -2.176 l
+42.26 -1.804 42.396 -1.5 42.672 -1.264 c
+42.944 -1.022 43.293 -0.897 43.715 -0.897 c
+44.156 -0.897 44.494 -1.015 44.729 -1.25 c
+44.972 -1.478 45.097 -1.801 45.097 -2.22 c
+45.097 -4.087 l
+45.097 -4.432 45.145 -4.7 45.244 -4.896 c
+45.244 -4.954 l
+h
+43.583 -4.204 m
+43.69 -4.204 43.782 -4.186 43.862 -4.146 c
+43.95 -4.098 44.013 -4.039 44.054 -3.969 c
+44.054 -3.146 l
+43.804 -3.146 l
+43.627 -3.146 43.484 -3.205 43.378 -3.323 c
+43.278 -3.433 43.231 -3.58 43.231 -3.763 c
+43.231 -4.057 43.348 -4.204 43.583 -4.204 c
+46.817 -0.971 m
+46.846 -1.338 l
+47.081 -1.044 47.39 -0.897 47.773 -0.897 c
+48.172 -0.897 48.452 -1.081 48.61 -1.441 c
+48.845 -1.081 49.172 -0.897 49.595 -0.897 c
+50.289 -0.897 50.642 -1.382 50.653 -2.352 c
+50.653 -4.954 l
+49.624 -4.954 l
+49.624 -2.411 l
+49.624 -2.187 49.587 -2.025 49.521 -1.926 c
+49.463 -1.831 49.352 -1.779 49.198 -1.779 c
+48.999 -1.779 48.86 -1.897 48.772 -2.132 c
+48.772 -4.954 l
+47.728 -4.954 l
+47.728 -2.426 l
+47.728 -2.191 47.699 -2.025 47.64 -1.926 c
+47.582 -1.831 47.471 -1.779 47.316 -1.779 c
+47.14 -1.779 46.997 -1.875 46.89 -2.058 c
+46.89 -4.954 l
+45.847 -4.954 l
+45.847 -0.971 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 310.3894 176.5843 cm
+0 0 m
+0 -0.97 l
+0.53 -0.97 l
+0.53 -1.764 l
+0 -1.764 l
+0 -3.734 l
+0 -3.892 0.019 -3.998 0.059 -4.056 c
+0.106 -4.116 0.191 -4.145 0.309 -4.145 c
+0.415 -4.145 0.5 -4.137 0.559 -4.116 c
+0.559 -4.924 l
+0.382 -4.991 0.191 -5.027 -0.015 -5.027 c
+-0.691 -5.027 -1.037 -4.641 -1.043 -3.865 c
+-1.043 -1.764 l
+-1.5 -1.764 l
+-1.5 -0.97 l
+-1.043 -0.97 l
+-1.043 0 l
+h
+2.984 -4.953 m
+2.955 -4.895 2.925 -4.792 2.896 -4.644 c
+2.708 -4.902 2.458 -5.027 2.146 -5.027 c
+1.812 -5.027 1.532 -4.92 1.309 -4.704 c
+1.091 -4.48 0.985 -4.189 0.985 -3.836 c
+0.985 -3.424 1.117 -3.109 1.382 -2.881 c
+1.646 -2.645 2.028 -2.528 2.528 -2.528 c
+2.851 -2.528 l
+2.851 -2.205 l
+2.851 -2.028 2.815 -1.907 2.749 -1.837 c
+2.69 -1.76 2.602 -1.72 2.484 -1.72 c
+2.227 -1.72 2.102 -1.874 2.102 -2.175 c
+1.058 -2.175 l
+1.058 -1.804 1.195 -1.5 1.47 -1.264 c
+1.742 -1.022 2.091 -0.897 2.514 -0.897 c
+2.955 -0.897 3.293 -1.014 3.528 -1.249 c
+3.77 -1.477 3.896 -1.801 3.896 -2.219 c
+3.896 -4.087 l
+3.896 -4.432 3.943 -4.7 4.042 -4.895 c
+4.042 -4.953 l
+h
+2.381 -4.204 m
+2.488 -4.204 2.579 -4.185 2.66 -4.145 c
+2.749 -4.097 2.811 -4.039 2.851 -3.969 c
+2.851 -3.146 l
+2.602 -3.146 l
+2.425 -3.146 2.282 -3.204 2.176 -3.322 c
+2.076 -3.432 2.028 -3.579 2.028 -3.763 c
+2.028 -4.056 2.146 -4.204 2.381 -4.204 c
+4.513 -2.836 m
+4.513 -2.19 4.63 -1.705 4.866 -1.382 c
+5.101 -1.058 5.431 -0.897 5.865 -0.897 c
+6.217 -0.897 6.489 -1.04 6.688 -1.323 c
+6.732 -0.97 l
+7.673 -0.97 l
+7.673 -4.953 l
+7.673 -5.461 7.53 -5.85 7.247 -6.115 c
+6.96 -6.387 6.556 -6.526 6.026 -6.526 c
+5.799 -6.526 5.564 -6.482 5.321 -6.394 c
+5.086 -6.306 4.91 -6.192 4.792 -6.056 c
+5.145 -5.336 l
+5.24 -5.442 5.369 -5.527 5.527 -5.585 c
+5.681 -5.652 5.828 -5.689 5.968 -5.689 c
+6.203 -5.689 6.369 -5.629 6.468 -5.512 c
+6.574 -5.402 6.629 -5.226 6.629 -4.983 c
+6.629 -4.63 l
+6.431 -4.895 6.174 -5.027 5.85 -5.027 c
+5.428 -5.027 5.101 -4.865 4.866 -4.542 c
+4.638 -4.211 4.52 -3.74 4.513 -3.131 c
+h
+5.556 -3.102 m
+5.556 -3.476 5.604 -3.744 5.704 -3.91 c
+5.799 -4.079 5.953 -4.16 6.159 -4.16 c
+6.372 -4.16 6.53 -4.083 6.629 -3.925 c
+6.629 -2.028 l
+6.519 -1.863 6.365 -1.778 6.159 -1.778 c
+5.953 -1.778 5.799 -1.863 5.704 -2.028 c
+5.604 -2.198 5.556 -2.466 5.556 -2.836 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 331.7103 171.6313 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.603 -0.074 -0.956 -0.074 c
+-1.319 -0.074 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.712 -2.102 1.088 c
+-2.102 1.488 -1.966 1.807 -1.691 2.042 c
+-1.419 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.25 3.336 c
+-0.36 3.443 -0.522 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.266 -1.866 3.453 c
+-1.741 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.001 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.015 3.954 0.22 3.748 c
+0.434 3.542 0.548 3.248 0.559 2.865 c
+0.559 0.852 l
+0.559 0.548 0.595 0.282 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.514 m
+-0.702 0.514 -0.551 0.558 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.984 c
+-0.088 1.925 l
+-0.455 1.925 l
+-0.771 1.925 -1.014 1.855 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.562 -1.084 0.514 -0.867 0.514 c
+4.924 3.366 m
+4.836 3.384 4.737 3.395 4.63 3.395 c
+4.295 3.395 4.06 3.212 3.925 2.851 c
+3.925 0 l
+3.278 0 l
+3.278 3.983 l
+3.91 3.983 l
+3.925 3.571 l
+4.101 3.895 4.343 4.056 4.659 4.056 c
+4.766 4.056 4.854 4.035 4.924 3.998 c
+h
+6.923 -0.074 m
+6.423 -0.074 6.041 0.073 5.777 0.367 c
+5.512 0.661 5.38 1.095 5.38 1.675 c
+5.38 2.146 l
+5.38 2.741 5.505 3.208 5.762 3.542 c
+6.026 3.883 6.387 4.056 6.85 4.056 c
+7.31 4.056 7.651 3.902 7.879 3.601 c
+8.114 3.307 8.235 2.844 8.247 2.219 c
+8.247 1.793 l
+6.026 1.793 l
+6.026 1.705 l
+6.026 1.271 6.104 0.959 6.262 0.764 c
+6.427 0.577 6.659 0.484 6.953 0.484 c
+7.148 0.484 7.32 0.517 7.468 0.588 c
+7.614 0.665 7.75 0.783 7.879 0.941 c
+8.216 0.529 l
+7.93 0.124 7.501 -0.074 6.923 -0.074 c
+6.85 3.498 m
+6.574 3.498 6.372 3.403 6.247 3.218 c
+6.119 3.031 6.045 2.741 6.026 2.352 c
+7.599 2.352 l
+7.599 2.439 l
+7.578 2.822 7.511 3.09 7.393 3.248 c
+7.276 3.413 7.092 3.498 6.85 3.498 c
+9.319 0 m
+9.319 3.453 l
+8.79 3.453 l
+8.79 3.983 l
+9.319 3.983 l
+9.319 4.438 l
+9.319 4.839 9.415 5.151 9.613 5.379 c
+9.819 5.604 10.098 5.718 10.451 5.718 c
+10.587 5.718 10.72 5.695 10.848 5.659 c
+10.819 5.115 l
+10.72 5.134 10.62 5.144 10.525 5.144 c
+10.15 5.144 9.966 4.88 9.966 4.351 c
+9.966 3.983 l
+10.643 3.983 l
+10.643 3.453 l
+9.966 3.453 l
+9.966 0 l
+h
+12.744 -0.074 m
+12.245 -0.074 11.862 0.073 11.597 0.367 c
+11.333 0.661 11.2 1.095 11.2 1.675 c
+11.2 2.146 l
+11.2 2.741 11.326 3.208 11.583 3.542 c
+11.848 3.883 12.208 4.056 12.671 4.056 c
+13.13 4.056 13.471 3.902 13.7 3.601 c
+13.935 3.307 14.056 2.844 14.067 2.219 c
+14.067 1.793 l
+11.848 1.793 l
+11.848 1.705 l
+11.848 1.271 11.925 0.959 12.083 0.764 c
+12.248 0.577 12.48 0.484 12.773 0.484 c
+12.968 0.484 13.141 0.517 13.288 0.588 c
+13.435 0.665 13.571 0.783 13.7 0.941 c
+14.038 0.529 l
+13.751 0.124 13.321 -0.074 12.744 -0.074 c
+12.671 3.498 m
+12.395 3.498 12.193 3.403 12.068 3.218 c
+11.939 3.031 11.866 2.741 11.848 2.352 c
+13.421 2.352 l
+13.421 2.439 l
+13.398 2.822 13.332 3.09 13.215 3.248 c
+13.097 3.413 12.914 3.498 12.671 3.498 c
+16.492 3.366 m
+16.405 3.384 16.305 3.395 16.199 3.395 c
+15.864 3.395 15.629 3.212 15.493 2.851 c
+15.493 0 l
+14.846 0 l
+14.846 3.983 l
+15.478 3.983 l
+15.493 3.571 l
+15.669 3.895 15.912 4.056 16.228 4.056 c
+16.334 4.056 16.422 4.035 16.492 3.998 c
+h
+18.491 -0.074 m
+17.992 -0.074 17.61 0.073 17.345 0.367 c
+17.08 0.661 16.948 1.095 16.948 1.675 c
+16.948 2.146 l
+16.948 2.741 17.073 3.208 17.33 3.542 c
+17.595 3.883 17.955 4.056 18.418 4.056 c
+18.877 4.056 19.219 3.902 19.447 3.601 c
+19.682 3.307 19.803 2.844 19.815 2.219 c
+19.815 1.793 l
+17.595 1.793 l
+17.595 1.705 l
+17.595 1.271 17.672 0.959 17.83 0.764 c
+17.995 0.577 18.227 0.484 18.521 0.484 c
+18.716 0.484 18.888 0.517 19.035 0.588 c
+19.183 0.665 19.318 0.783 19.447 0.941 c
+19.785 0.529 l
+19.499 0.124 19.069 -0.074 18.491 -0.074 c
+18.418 3.498 m
+18.142 3.498 17.94 3.403 17.816 3.218 c
+17.687 3.031 17.613 2.741 17.595 2.352 c
+19.168 2.352 l
+19.168 2.439 l
+19.146 2.822 19.079 3.09 18.962 3.248 c
+18.844 3.413 18.66 3.498 18.418 3.498 c
+21.211 3.983 m
+21.226 3.542 l
+21.479 3.883 21.803 4.056 22.196 4.056 c
+22.901 4.056 23.258 3.586 23.268 2.645 c
+23.268 0 l
+22.622 0 l
+22.622 2.616 l
+22.622 2.929 22.566 3.149 22.46 3.278 c
+22.35 3.403 22.196 3.469 21.99 3.469 c
+21.832 3.469 21.685 3.413 21.549 3.307 c
+21.421 3.197 21.317 3.06 21.24 2.896 c
+21.24 0 l
+20.594 0 l
+20.594 3.983 l
+h
+25.62 0.484 m
+25.834 0.484 26.007 0.548 26.135 0.675 c
+26.271 0.812 26.344 1.003 26.356 1.249 c
+26.973 1.249 l
+26.951 0.866 26.815 0.548 26.561 0.294 c
+26.304 0.047 25.992 -0.074 25.62 -0.074 c
+25.128 -0.074 24.754 0.077 24.488 0.382 c
+24.232 0.694 24.106 1.161 24.106 1.778 c
+24.106 2.219 l
+24.106 2.815 24.232 3.27 24.488 3.586 c
+24.754 3.898 25.128 4.056 25.62 4.056 c
+26.021 4.056 26.341 3.924 26.576 3.659 c
+26.819 3.403 26.951 3.057 26.973 2.616 c
+26.356 2.616 l
+26.333 2.91 26.26 3.131 26.135 3.278 c
+26.017 3.424 25.845 3.498 25.62 3.498 c
+25.327 3.498 25.109 3.399 24.974 3.204 c
+24.835 3.017 24.76 2.707 24.754 2.278 c
+24.754 1.764 l
+24.754 1.294 24.82 0.959 24.959 0.764 c
+25.106 0.577 25.327 0.484 25.62 0.484 c
+29.148 -0.074 m
+28.648 -0.074 28.266 0.073 28.002 0.367 c
+27.737 0.661 27.605 1.095 27.605 1.675 c
+27.605 2.146 l
+27.605 2.741 27.73 3.208 27.987 3.542 c
+28.251 3.883 28.612 4.056 29.074 4.056 c
+29.534 4.056 29.876 3.902 30.104 3.601 c
+30.339 3.307 30.46 2.844 30.471 2.219 c
+30.471 1.793 l
+28.251 1.793 l
+28.251 1.705 l
+28.251 1.271 28.328 0.959 28.487 0.764 c
+28.652 0.577 28.884 0.484 29.178 0.484 c
+29.373 0.484 29.545 0.517 29.693 0.588 c
+29.839 0.665 29.975 0.783 30.104 0.941 c
+30.441 0.529 l
+30.155 0.124 29.725 -0.074 29.148 -0.074 c
+29.074 3.498 m
+28.799 3.498 28.598 3.403 28.472 3.218 c
+28.344 3.031 28.27 2.741 28.251 2.352 c
+29.824 2.352 l
+29.824 2.439 l
+29.803 2.822 29.736 3.09 29.618 3.248 c
+29.501 3.413 29.317 3.498 29.074 3.498 c
+32.955 2.175 m
+32.955 2.811 33.043 3.413 33.22 3.983 c
+33.396 4.548 33.639 5.045 33.955 5.468 c
+34.15 5.732 34.337 5.923 34.514 6.04 c
+34.646 5.585 l
+34.352 5.31 34.109 4.887 33.926 4.321 c
+33.738 3.752 33.635 3.119 33.616 2.425 c
+33.616 2.131 l
+33.616 1.267 33.734 0.503 33.969 -0.162 c
+34.154 -0.662 34.381 -1.044 34.646 -1.309 c
+34.514 -1.735 l
+34.285 -1.577 34.061 -1.327 33.837 -0.985 c
+33.249 -0.103 32.955 0.947 32.955 2.175 c
+37.277 1.014 m
+37.277 1.161 37.221 1.282 37.115 1.381 c
+37.005 1.477 36.799 1.595 36.498 1.734 c
+36.153 1.881 35.91 2.002 35.763 2.102 c
+35.615 2.208 35.505 2.326 35.44 2.454 c
+35.37 2.58 35.337 2.738 35.337 2.925 c
+35.337 3.248 35.455 3.516 35.69 3.733 c
+35.925 3.946 36.226 4.056 36.6 4.056 c
+36.983 4.056 37.292 3.943 37.527 3.719 c
+37.762 3.49 37.88 3.204 37.88 2.851 c
+37.233 2.851 l
+37.233 3.027 37.174 3.178 37.057 3.307 c
+36.939 3.432 36.785 3.498 36.6 3.498 c
+36.402 3.498 36.251 3.443 36.145 3.336 c
+36.035 3.237 35.983 3.104 35.983 2.94 c
+35.983 2.811 36.02 2.705 36.101 2.616 c
+36.178 2.535 36.369 2.432 36.674 2.308 c
+37.152 2.119 37.483 1.932 37.659 1.749 c
+37.836 1.572 37.924 1.344 37.924 1.072 c
+37.924 0.72 37.799 0.44 37.556 0.235 c
+37.321 0.029 37.005 -0.074 36.615 -0.074 c
+36.193 -0.074 35.854 0.043 35.601 0.278 c
+35.344 0.521 35.219 0.826 35.219 1.19 c
+35.866 1.19 l
+35.873 0.962 35.943 0.786 36.072 0.661 c
+36.197 0.544 36.38 0.484 36.615 0.484 c
+36.829 0.484 36.99 0.532 37.101 0.631 c
+37.218 0.727 37.277 0.856 37.277 1.014 c
+39.614 4.939 m
+39.614 3.983 l
+40.217 3.983 l
+40.217 3.453 l
+39.614 3.453 l
+39.614 0.984 l
+39.614 0.826 39.636 0.708 39.688 0.631 c
+39.746 0.55 39.835 0.514 39.952 0.514 c
+40.041 0.514 40.128 0.529 40.217 0.558 c
+40.217 0 l
+40.07 -0.048 39.916 -0.074 39.761 -0.074 c
+39.504 -0.074 39.309 0.018 39.173 0.205 c
+39.033 0.389 38.967 0.65 38.967 0.984 c
+38.967 3.453 l
+38.364 3.453 l
+38.364 3.983 l
+38.967 3.983 l
+38.967 4.939 l
+h
+43.024 0 m
+42.983 0.087 42.958 0.235 42.95 0.44 c
+42.715 0.095 42.422 -0.074 42.069 -0.074 c
+41.705 -0.074 41.422 0.022 41.217 0.22 c
+41.018 0.426 40.922 0.712 40.922 1.088 c
+40.922 1.488 41.059 1.807 41.334 2.042 c
+41.606 2.285 41.98 2.41 42.451 2.41 c
+42.936 2.41 l
+42.936 2.836 l
+42.936 3.072 42.881 3.237 42.774 3.336 c
+42.664 3.443 42.503 3.498 42.289 3.498 c
+42.091 3.498 41.929 3.439 41.805 3.322 c
+41.687 3.204 41.628 3.057 41.628 2.881 c
+40.981 2.881 l
+40.981 3.075 41.04 3.266 41.157 3.453 c
+41.282 3.638 41.444 3.785 41.643 3.895 c
+41.848 4.001 42.076 4.056 42.333 4.056 c
+42.734 4.056 43.039 3.954 43.245 3.748 c
+43.457 3.542 43.571 3.248 43.583 2.865 c
+43.583 0.852 l
+43.583 0.548 43.619 0.282 43.7 0.058 c
+43.7 0 l
+h
+42.157 0.514 m
+42.322 0.514 42.473 0.558 42.613 0.646 c
+42.759 0.735 42.866 0.845 42.936 0.984 c
+42.936 1.925 l
+42.568 1.925 l
+42.252 1.925 42.01 1.855 41.834 1.72 c
+41.657 1.591 41.569 1.404 41.569 1.161 c
+41.569 0.933 41.613 0.768 41.701 0.661 c
+41.79 0.562 41.94 0.514 42.157 0.514 c
+45.2 3.983 m
+45.215 3.542 l
+45.468 3.883 45.791 4.056 46.185 4.056 c
+46.89 4.056 47.247 3.586 47.257 2.645 c
+47.257 0 l
+46.611 0 l
+46.611 2.616 l
+46.611 2.929 46.555 3.149 46.449 3.278 c
+46.339 3.403 46.185 3.469 45.979 3.469 c
+45.821 3.469 45.674 3.413 45.537 3.307 c
+45.409 3.197 45.306 3.06 45.229 2.896 c
+45.229 0 l
+44.583 0 l
+44.583 3.983 l
+h
+48.095 2.175 m
+48.095 2.782 48.205 3.248 48.433 3.571 c
+48.668 3.895 48.996 4.056 49.418 4.056 c
+49.801 4.056 50.098 3.898 50.315 3.586 c
+50.315 5.644 l
+50.962 5.644 l
+50.962 0 l
+50.374 0 l
+50.33 0.426 l
+50.124 0.091 49.819 -0.074 49.418 -0.074 c
+49.007 -0.074 48.683 0.08 48.448 0.396 c
+48.213 0.72 48.095 1.176 48.095 1.764 c
+h
+48.743 1.793 m
+48.743 1.352 48.805 1.021 48.934 0.808 c
+49.069 0.602 49.29 0.5 49.595 0.5 c
+49.918 0.5 50.156 0.661 50.315 0.984 c
+50.315 2.998 l
+50.146 3.31 49.907 3.469 49.595 3.469 c
+49.29 3.469 49.069 3.366 48.934 3.16 c
+48.805 2.954 48.743 2.63 48.743 2.19 c
+h
+54.004 0 m
+53.964 0.087 53.938 0.235 53.931 0.44 c
+53.696 0.095 53.402 -0.074 53.049 -0.074 c
+52.685 -0.074 52.402 0.022 52.196 0.22 c
+51.997 0.426 51.902 0.712 51.902 1.088 c
+51.902 1.488 52.038 1.807 52.314 2.042 c
+52.586 2.285 52.961 2.41 53.431 2.41 c
+53.917 2.41 l
+53.917 2.836 l
+53.917 3.072 53.861 3.237 53.755 3.336 c
+53.644 3.443 53.483 3.498 53.269 3.498 c
+53.071 3.498 52.909 3.439 52.784 3.322 c
+52.666 3.204 52.608 3.057 52.608 2.881 c
+51.961 2.881 l
+51.961 3.075 52.02 3.266 52.138 3.453 c
+52.263 3.638 52.425 3.785 52.623 3.895 c
+52.828 4.001 53.057 4.056 53.314 4.056 c
+53.714 4.056 54.019 3.954 54.225 3.748 c
+54.438 3.542 54.552 3.248 54.563 2.865 c
+54.563 0.852 l
+54.563 0.548 54.6 0.282 54.68 0.058 c
+54.68 0 l
+h
+53.137 0.514 m
+53.302 0.514 53.453 0.558 53.593 0.646 c
+53.74 0.735 53.846 0.845 53.917 0.984 c
+53.917 1.925 l
+53.549 1.925 l
+53.233 1.925 52.99 1.855 52.814 1.72 c
+52.637 1.591 52.549 1.404 52.549 1.161 c
+52.549 0.933 52.593 0.768 52.681 0.661 c
+52.77 0.562 52.92 0.514 53.137 0.514 c
+57.209 3.366 m
+57.121 3.384 57.021 3.395 56.915 3.395 c
+56.581 3.395 56.346 3.212 56.209 2.851 c
+56.209 0 l
+55.563 0 l
+55.563 3.983 l
+56.194 3.983 l
+56.209 3.571 l
+56.386 3.895 56.628 4.056 56.944 4.056 c
+57.051 4.056 57.139 4.035 57.209 3.998 c
+h
+57.649 2.175 m
+57.649 2.782 57.76 3.248 57.988 3.571 c
+58.223 3.895 58.55 4.056 58.973 4.056 c
+59.355 4.056 59.652 3.898 59.87 3.586 c
+59.87 5.644 l
+60.516 5.644 l
+60.516 0 l
+59.928 0 l
+59.884 0.426 l
+59.679 0.091 59.373 -0.074 58.973 -0.074 c
+58.561 -0.074 58.237 0.08 58.002 0.396 c
+57.767 0.72 57.649 1.176 57.649 1.764 c
+h
+58.297 1.793 m
+58.297 1.352 58.359 1.021 58.488 0.808 c
+58.623 0.602 58.844 0.5 59.149 0.5 c
+59.473 0.5 59.712 0.661 59.87 0.984 c
+59.87 2.998 l
+59.7 3.31 59.461 3.469 59.149 3.469 c
+58.844 3.469 58.623 3.366 58.488 3.16 c
+58.359 2.954 58.297 2.63 58.297 2.19 c
+h
+62.912 2.131 m
+62.912 1.043 62.665 0.077 62.177 -0.765 c
+61.913 -1.214 61.637 -1.536 61.354 -1.735 c
+61.236 -1.309 l
+61.538 -1.015 61.784 -0.563 61.971 0.043 c
+62.166 0.65 62.266 1.315 62.266 2.042 c
+62.266 2.175 l
+62.266 3.104 62.11 3.939 61.809 4.674 c
+61.64 5.074 61.449 5.394 61.236 5.629 c
+61.354 6.04 l
+61.626 5.853 61.89 5.556 62.148 5.144 c
+62.655 4.292 62.912 3.285 62.912 2.131 c
+65.499 2.175 m
+65.499 2.752 65.635 3.208 65.911 3.542 c
+66.193 3.883 66.565 4.056 67.028 4.056 c
+67.487 4.056 67.855 3.887 68.13 3.557 c
+68.413 3.233 68.56 2.785 68.571 2.219 c
+68.571 1.793 l
+68.571 1.223 68.427 0.768 68.145 0.426 c
+67.87 0.091 67.502 -0.074 67.043 -0.074 c
+66.579 -0.074 66.208 0.087 65.925 0.411 c
+65.65 0.742 65.507 1.183 65.499 1.734 c
+h
+66.146 1.793 m
+66.146 1.389 66.223 1.072 66.381 0.837 c
+66.546 0.602 66.767 0.484 67.043 0.484 c
+67.608 0.484 67.903 0.897 67.924 1.72 c
+67.924 2.175 l
+67.924 2.576 67.84 2.896 67.675 3.131 c
+67.517 3.373 67.3 3.498 67.028 3.498 c
+66.763 3.498 66.546 3.373 66.381 3.131 c
+66.223 2.896 66.146 2.576 66.146 2.175 c
+h
+71.055 3.366 m
+70.967 3.384 70.868 3.395 70.761 3.395 c
+70.427 3.395 70.191 3.212 70.056 2.851 c
+70.056 0 l
+69.409 0 l
+69.409 3.983 l
+70.041 3.983 l
+70.056 3.571 l
+70.232 3.895 70.475 4.056 70.791 4.056 c
+70.897 4.056 70.985 4.035 71.055 3.998 c
+h
+75.465 0 m
+75.425 0.087 75.399 0.235 75.392 0.44 c
+75.157 0.095 74.862 -0.074 74.509 -0.074 c
+74.145 -0.074 73.863 0.022 73.657 0.22 c
+73.459 0.426 73.363 0.712 73.363 1.088 c
+73.363 1.488 73.499 1.807 73.775 2.042 c
+74.047 2.285 74.421 2.41 74.891 2.41 c
+75.377 2.41 l
+75.377 2.836 l
+75.377 3.072 75.321 3.237 75.215 3.336 c
+75.105 3.443 74.943 3.498 74.73 3.498 c
+74.532 3.498 74.37 3.439 74.245 3.322 c
+74.127 3.204 74.068 3.057 74.068 2.881 c
+73.422 2.881 l
+73.422 3.075 73.48 3.266 73.598 3.453 c
+73.723 3.638 73.885 3.785 74.083 3.895 c
+74.289 4.001 74.517 4.056 74.774 4.056 c
+75.174 4.056 75.479 3.954 75.685 3.748 c
+75.899 3.542 76.013 3.248 76.024 2.865 c
+76.024 0.852 l
+76.024 0.548 76.061 0.282 76.142 0.058 c
+76.142 0 l
+h
+74.598 0.514 m
+74.763 0.514 74.914 0.558 75.053 0.646 c
+75.201 0.735 75.307 0.845 75.377 0.984 c
+75.377 1.925 l
+75.009 1.925 l
+74.694 1.925 74.451 1.855 74.274 1.72 c
+74.098 1.591 74.01 1.404 74.01 1.161 c
+74.01 0.933 74.054 0.768 74.142 0.661 c
+74.23 0.562 74.38 0.514 74.598 0.514 c
+77.64 3.983 m
+77.655 3.542 l
+77.908 3.883 78.232 4.056 78.625 4.056 c
+79.331 4.056 79.687 3.586 79.698 2.645 c
+79.698 0 l
+79.051 0 l
+79.051 2.616 l
+79.051 2.929 78.997 3.149 78.889 3.278 c
+78.779 3.403 78.625 3.469 78.419 3.469 c
+78.261 3.469 78.114 3.413 77.979 3.307 c
+77.85 3.197 77.747 3.06 77.67 2.896 c
+77.67 0 l
+77.023 0 l
+77.023 3.983 l
+h
+82.256 2.175 m
+82.256 2.752 82.392 3.208 82.667 3.542 c
+82.951 3.883 83.321 4.056 83.785 4.056 c
+84.244 4.056 84.611 3.887 84.887 3.557 c
+85.17 3.233 85.317 2.785 85.328 2.219 c
+85.328 1.793 l
+85.328 1.223 85.185 0.768 84.902 0.426 c
+84.626 0.091 84.258 -0.074 83.799 -0.074 c
+83.336 -0.074 82.965 0.087 82.683 0.411 c
+82.407 0.742 82.263 1.183 82.256 1.734 c
+h
+82.903 1.793 m
+82.903 1.389 82.98 1.072 83.138 0.837 c
+83.303 0.602 83.524 0.484 83.799 0.484 c
+84.366 0.484 84.659 0.897 84.682 1.72 c
+84.682 2.175 l
+84.682 2.576 84.597 2.896 84.431 3.131 c
+84.273 3.373 84.057 3.498 83.785 3.498 c
+83.52 3.498 83.303 3.373 83.138 3.131 c
+82.98 2.896 82.903 2.576 82.903 2.175 c
+h
+89.047 1.793 m
+89.047 1.176 88.933 0.708 88.709 0.396 c
+88.492 0.08 88.169 -0.074 87.739 -0.074 c
+87.316 -0.074 87.003 0.106 86.798 0.47 c
+86.768 0 l
+86.166 0 l
+86.166 5.644 l
+86.812 5.644 l
+86.812 3.542 l
+87.026 3.883 87.334 4.056 87.739 4.056 c
+88.169 4.056 88.492 3.898 88.709 3.586 c
+88.933 3.281 89.047 2.815 89.047 2.19 c
+h
+88.4 2.175 m
+88.4 2.645 88.331 2.977 88.194 3.175 c
+88.065 3.37 87.857 3.469 87.562 3.469 c
+87.228 3.469 86.978 3.285 86.812 2.925 c
+86.812 1.043 l
+86.978 0.679 87.232 0.5 87.577 0.5 c
+87.871 0.5 88.08 0.602 88.209 0.808 c
+88.334 1.014 88.4 1.33 88.4 1.764 c
+h
+90.546 3.983 m
+90.546 -0.5 l
+90.546 -1.235 90.255 -1.603 89.679 -1.603 c
+89.54 -1.603 89.418 -1.58 89.312 -1.544 c
+89.312 -1 l
+89.382 -1.019 89.466 -1.029 89.576 -1.029 c
+89.683 -1.029 89.76 -0.985 89.811 -0.897 c
+89.87 -0.817 89.9 -0.676 89.9 -0.47 c
+89.9 3.983 l
+h
+90.575 5.026 m
+90.575 4.916 90.546 4.824 90.488 4.747 c
+90.429 4.677 90.333 4.644 90.208 4.644 c
+90.091 4.644 89.995 4.677 89.929 4.747 c
+89.87 4.824 89.841 4.916 89.841 5.026 c
+89.841 5.144 89.87 5.236 89.929 5.306 c
+89.995 5.383 90.091 5.423 90.208 5.423 c
+90.333 5.423 90.429 5.383 90.488 5.306 c
+90.546 5.225 90.575 5.134 90.575 5.026 c
+93.001 -0.074 m
+92.501 -0.074 92.119 0.073 91.855 0.367 c
+91.589 0.661 91.458 1.095 91.458 1.675 c
+91.458 2.146 l
+91.458 2.741 91.583 3.208 91.84 3.542 c
+92.104 3.883 92.464 4.056 92.927 4.056 c
+93.387 4.056 93.729 3.902 93.956 3.601 c
+94.192 3.307 94.313 2.844 94.324 2.219 c
+94.324 1.793 l
+92.104 1.793 l
+92.104 1.705 l
+92.104 1.271 92.181 0.959 92.339 0.764 c
+92.505 0.577 92.736 0.484 93.031 0.484 c
+93.225 0.484 93.398 0.517 93.545 0.588 c
+93.692 0.665 93.827 0.783 93.956 0.941 c
+94.294 0.529 l
+94.008 0.124 93.578 -0.074 93.001 -0.074 c
+92.927 3.498 m
+92.652 3.498 92.449 3.403 92.325 3.218 c
+92.196 3.031 92.123 2.741 92.104 2.352 c
+93.677 2.352 l
+93.677 2.439 l
+93.655 2.822 93.589 3.09 93.471 3.248 c
+93.353 3.413 93.17 3.498 92.927 3.498 c
+96.485 0.484 m
+96.698 0.484 96.871 0.548 96.999 0.675 c
+97.135 0.812 97.208 1.003 97.22 1.249 c
+97.837 1.249 l
+97.815 0.866 97.679 0.548 97.426 0.294 c
+97.168 0.047 96.856 -0.074 96.485 -0.074 c
+95.992 -0.074 95.618 0.077 95.352 0.382 c
+95.096 0.694 94.97 1.161 94.97 1.778 c
+94.97 2.219 l
+94.97 2.815 95.096 3.27 95.352 3.586 c
+95.618 3.898 95.992 4.056 96.485 4.056 c
+96.885 4.056 97.205 3.924 97.44 3.659 c
+97.683 3.403 97.815 3.057 97.837 2.616 c
+97.22 2.616 l
+97.197 2.91 97.124 3.131 96.999 3.278 c
+96.881 3.424 96.709 3.498 96.485 3.498 c
+96.191 3.498 95.974 3.399 95.838 3.204 c
+95.699 3.017 95.625 2.707 95.618 2.278 c
+95.618 1.764 l
+95.618 1.294 95.684 0.959 95.823 0.764 c
+95.97 0.577 96.191 0.484 96.485 0.484 c
+99.439 4.939 m
+99.439 3.983 l
+100.042 3.983 l
+100.042 3.453 l
+99.439 3.453 l
+99.439 0.984 l
+99.439 0.826 99.462 0.708 99.512 0.631 c
+99.572 0.55 99.66 0.514 99.778 0.514 c
+99.865 0.514 99.954 0.529 100.042 0.558 c
+100.042 0 l
+99.895 -0.048 99.74 -0.074 99.586 -0.074 c
+99.329 -0.074 99.134 0.018 98.998 0.205 c
+98.859 0.389 98.793 0.65 98.793 0.984 c
+98.793 3.453 l
+98.19 3.453 l
+98.19 3.983 l
+98.793 3.983 l
+98.793 4.939 l
+h
+102.511 2.175 m
+102.511 2.811 102.6 3.413 102.776 3.983 c
+102.953 4.548 103.194 5.045 103.51 5.468 c
+103.705 5.732 103.893 5.923 104.069 6.04 c
+104.202 5.585 l
+103.907 5.31 103.665 4.887 103.481 4.321 c
+103.294 3.752 103.191 3.119 103.173 2.425 c
+103.173 2.131 l
+103.173 1.267 103.29 0.503 103.526 -0.162 c
+103.709 -0.662 103.937 -1.044 104.202 -1.309 c
+104.069 -1.735 l
+103.842 -1.577 103.618 -1.327 103.393 -0.985 c
+102.805 -0.103 102.511 0.947 102.511 2.175 c
+106.936 0 m
+106.895 0.087 106.87 0.235 106.862 0.44 c
+106.627 0.095 106.333 -0.074 105.98 -0.074 c
+105.617 -0.074 105.334 0.022 105.128 0.22 c
+104.929 0.426 104.834 0.712 104.834 1.088 c
+104.834 1.488 104.97 1.807 105.245 2.042 c
+105.517 2.285 105.892 2.41 106.363 2.41 c
+106.847 2.41 l
+106.847 2.836 l
+106.847 3.072 106.793 3.237 106.685 3.336 c
+106.575 3.443 106.414 3.498 106.201 3.498 c
+106.003 3.498 105.841 3.439 105.716 3.322 c
+105.598 3.204 105.54 3.057 105.54 2.881 c
+104.892 2.881 l
+104.892 3.075 104.952 3.266 105.069 3.453 c
+105.193 3.638 105.355 3.785 105.554 3.895 c
+105.76 4.001 105.987 4.056 106.245 4.056 c
+106.645 4.056 106.951 3.954 107.156 3.748 c
+107.369 3.542 107.483 3.248 107.495 2.865 c
+107.495 0.852 l
+107.495 0.548 107.531 0.282 107.612 0.058 c
+107.612 0 l
+h
+106.068 0.514 m
+106.234 0.514 106.384 0.558 106.524 0.646 c
+106.671 0.735 106.778 0.845 106.847 0.984 c
+106.847 1.925 l
+106.48 1.925 l
+106.164 1.925 105.922 1.855 105.745 1.72 c
+105.569 1.591 105.48 1.404 105.48 1.161 c
+105.48 0.933 105.525 0.768 105.613 0.661 c
+105.701 0.562 105.852 0.514 106.068 0.514 c
+109.111 3.983 m
+109.126 3.542 l
+109.38 3.883 109.702 4.056 110.096 4.056 c
+110.801 4.056 111.158 3.586 111.169 2.645 c
+111.169 0 l
+110.522 0 l
+110.522 2.616 l
+110.522 2.929 110.467 3.149 110.361 3.278 c
+110.25 3.403 110.096 3.469 109.891 3.469 c
+109.733 3.469 109.585 3.413 109.449 3.307 c
+109.32 3.197 109.218 3.06 109.141 2.896 c
+109.141 0 l
+108.494 0 l
+108.494 3.983 l
+h
+112.756 3.983 m
+112.771 3.542 l
+113.025 3.883 113.348 4.056 113.741 4.056 c
+114.447 4.056 114.803 3.586 114.814 2.645 c
+114.814 0 l
+114.167 0 l
+114.167 2.616 l
+114.167 2.929 114.113 3.149 114.006 3.278 c
+113.895 3.403 113.741 3.469 113.536 3.469 c
+113.378 3.469 113.23 3.413 113.095 3.307 c
+112.966 3.197 112.863 3.06 112.786 2.896 c
+112.786 0 l
+112.139 0 l
+112.139 3.983 l
+h
+115.653 2.175 m
+115.653 2.752 115.788 3.208 116.064 3.542 c
+116.347 3.883 116.718 4.056 117.181 4.056 c
+117.64 4.056 118.007 3.887 118.283 3.557 c
+118.566 3.233 118.713 2.785 118.724 2.219 c
+118.724 1.793 l
+118.724 1.223 118.581 0.768 118.298 0.426 c
+118.022 0.091 117.655 -0.074 117.195 -0.074 c
+116.733 -0.074 116.361 0.087 116.079 0.411 c
+115.803 0.742 115.659 1.183 115.653 1.734 c
+h
+116.299 1.793 m
+116.299 1.389 116.376 1.072 116.534 0.837 c
+116.7 0.602 116.92 0.484 117.195 0.484 c
+117.762 0.484 118.055 0.897 118.078 1.72 c
+118.078 2.175 l
+118.078 2.576 117.993 2.896 117.828 3.131 c
+117.67 3.373 117.453 3.498 117.181 3.498 c
+116.916 3.498 116.7 3.373 116.534 3.131 c
+116.376 2.896 116.299 2.576 116.299 2.175 c
+h
+120.415 4.939 m
+120.415 3.983 l
+121.018 3.983 l
+121.018 3.453 l
+120.415 3.453 l
+120.415 0.984 l
+120.415 0.826 120.436 0.708 120.488 0.631 c
+120.547 0.55 120.635 0.514 120.752 0.514 c
+120.841 0.514 120.929 0.529 121.018 0.558 c
+121.018 0 l
+120.87 -0.048 120.716 -0.074 120.561 -0.074 c
+120.305 -0.074 120.11 0.018 119.973 0.205 c
+119.834 0.389 119.768 0.65 119.768 0.984 c
+119.768 3.453 l
+119.165 3.453 l
+119.165 3.983 l
+119.768 3.983 l
+119.768 4.939 l
+h
+123.825 0 m
+123.784 0.087 123.759 0.235 123.751 0.44 c
+123.516 0.095 123.222 -0.074 122.869 -0.074 c
+122.506 -0.074 122.223 0.022 122.017 0.22 c
+121.818 0.426 121.723 0.712 121.723 1.088 c
+121.723 1.488 121.859 1.807 122.134 2.042 c
+122.406 2.285 122.782 2.41 123.252 2.41 c
+123.736 2.41 l
+123.736 2.836 l
+123.736 3.072 123.682 3.237 123.575 3.336 c
+123.465 3.443 123.303 3.498 123.09 3.498 c
+122.892 3.498 122.73 3.439 122.605 3.322 c
+122.487 3.204 122.429 3.057 122.429 2.881 c
+121.782 2.881 l
+121.782 3.075 121.841 3.266 121.958 3.453 c
+122.083 3.638 122.244 3.785 122.443 3.895 c
+122.649 4.001 122.877 4.056 123.134 4.056 c
+123.534 4.056 123.84 3.954 124.045 3.748 c
+124.258 3.542 124.372 3.248 124.384 2.865 c
+124.384 0.852 l
+124.384 0.548 124.42 0.282 124.501 0.058 c
+124.501 0 l
+h
+122.957 0.514 m
+123.123 0.514 123.274 0.558 123.414 0.646 c
+123.56 0.735 123.667 0.845 123.736 0.984 c
+123.736 1.925 l
+123.369 1.925 l
+123.053 1.925 122.811 1.855 122.634 1.72 c
+122.458 1.591 122.37 1.404 122.37 1.161 c
+122.37 0.933 122.414 0.768 122.502 0.661 c
+122.591 0.562 122.741 0.514 122.957 0.514 c
+126.236 4.939 m
+126.236 3.983 l
+126.838 3.983 l
+126.838 3.453 l
+126.236 3.453 l
+126.236 0.984 l
+126.236 0.826 126.258 0.708 126.309 0.631 c
+126.368 0.55 126.456 0.514 126.574 0.514 c
+126.662 0.514 126.75 0.529 126.838 0.558 c
+126.838 0 l
+126.691 -0.048 126.537 -0.074 126.383 -0.074 c
+126.125 -0.074 125.93 0.018 125.795 0.205 c
+125.655 0.389 125.589 0.65 125.589 0.984 c
+125.589 3.453 l
+124.986 3.453 l
+124.986 3.983 l
+125.589 3.983 l
+125.589 4.939 l
+h
+129.028 -0.074 m
+128.529 -0.074 128.147 0.073 127.882 0.367 c
+127.617 0.661 127.485 1.095 127.485 1.675 c
+127.485 2.146 l
+127.485 2.741 127.61 3.208 127.867 3.542 c
+128.132 3.883 128.492 4.056 128.955 4.056 c
+129.414 4.056 129.756 3.902 129.984 3.601 c
+130.219 3.307 130.34 2.844 130.352 2.219 c
+130.352 1.793 l
+128.132 1.793 l
+128.132 1.705 l
+128.132 1.271 128.209 0.959 128.367 0.764 c
+128.532 0.577 128.764 0.484 129.058 0.484 c
+129.253 0.484 129.425 0.517 129.572 0.588 c
+129.719 0.665 129.855 0.783 129.984 0.941 c
+130.322 0.529 l
+130.036 0.124 129.606 -0.074 129.028 -0.074 c
+128.955 3.498 m
+128.679 3.498 128.477 3.403 128.353 3.218 c
+128.224 3.031 128.15 2.741 128.132 2.352 c
+129.704 2.352 l
+129.704 2.439 l
+129.683 2.822 129.616 3.09 129.498 3.248 c
+129.381 3.413 129.197 3.498 128.955 3.498 c
+130.998 2.175 m
+130.998 2.782 131.108 3.248 131.336 3.571 c
+131.571 3.895 131.898 4.056 132.321 4.056 c
+132.703 4.056 133.001 3.898 133.217 3.586 c
+133.217 5.644 l
+133.864 5.644 l
+133.864 0 l
+133.276 0 l
+133.232 0.426 l
+133.026 0.091 132.721 -0.074 132.321 -0.074 c
+131.91 -0.074 131.586 0.08 131.351 0.396 c
+131.116 0.72 130.998 1.176 130.998 1.764 c
+h
+131.645 1.793 m
+131.645 1.352 131.707 1.021 131.836 0.808 c
+131.972 0.602 132.193 0.5 132.497 0.5 c
+132.821 0.5 133.059 0.661 133.217 0.984 c
+133.217 2.998 l
+133.049 3.31 132.81 3.469 132.497 3.469 c
+132.193 3.469 131.972 3.366 131.836 3.16 c
+131.707 2.954 131.645 2.63 131.645 2.19 c
+h
+136.26 2.131 m
+136.26 1.043 136.014 0.077 135.526 -0.765 c
+135.26 -1.214 134.985 -1.536 134.703 -1.735 c
+134.585 -1.309 l
+134.886 -1.015 135.133 -0.563 135.32 0.043 c
+135.514 0.65 135.613 1.315 135.613 2.042 c
+135.613 2.175 l
+135.613 3.104 135.459 3.939 135.158 4.674 c
+134.989 5.074 134.798 5.394 134.585 5.629 c
+134.703 6.04 l
+134.974 5.853 135.239 5.556 135.496 5.144 c
+136.003 4.292 136.26 3.285 136.26 2.131 c
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 305.5389 158.4271 cm
+0 0 m
+-1.088 0 l
+-1.088 2.294 l
+-2.675 2.294 l
+-2.675 0 l
+-3.763 0 l
+-3.763 5.351 l
+-2.675 5.351 l
+-2.675 3.19 l
+-1.088 3.19 l
+-1.088 5.351 l
+0 5.351 l
+h
+3.615 2.323 m
+1.94 2.323 l
+1.94 0.897 l
+3.925 0.897 l
+3.925 0 l
+0.852 0 l
+0.852 5.351 l
+3.925 5.351 l
+3.925 4.454 l
+1.94 4.454 l
+1.94 3.19 l
+3.615 3.19 l
+h
+7.1 1.103 m
+5.629 1.103 l
+5.336 0 l
+4.204 0 l
+5.865 5.351 l
+6.865 5.351 l
+8.54 0 l
+7.393 0 l
+h
+5.865 1.999 m
+6.865 1.999 l
+6.364 3.911 l
+h
+9.04 0 m
+9.04 5.351 l
+10.466 5.351 l
+11.083 5.351 11.575 5.149 11.95 4.748 c
+12.321 4.355 12.513 3.815 12.523 3.131 c
+12.523 2.264 l
+12.523 1.559 12.336 1.004 11.965 0.603 c
+11.59 0.198 11.083 0 10.436 0 c
+h
+10.127 4.454 m
+10.127 0.897 l
+10.451 0.897 l
+10.811 0.897 11.068 0.989 11.215 1.176 c
+11.362 1.371 11.436 1.698 11.436 2.161 c
+11.436 3.102 l
+11.436 3.601 11.366 3.947 11.23 4.146 c
+11.09 4.341 10.855 4.443 10.524 4.454 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 331.7103 158.4271 cm
+0 0 m
+-0.04 0.088 -0.066 0.235 -0.073 0.441 c
+-0.309 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.023 -1.808 0.221 c
+-2.007 0.426 -2.102 0.713 -2.102 1.088 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.043 2.411 -0.573 2.411 c
+-0.088 2.411 l
+-0.088 2.837 l
+-0.088 3.072 -0.143 3.238 -0.25 3.337 c
+-0.36 3.444 -0.522 3.499 -0.735 3.499 c
+-0.933 3.499 -1.095 3.44 -1.22 3.323 c
+-1.338 3.205 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.076 -1.984 3.267 -1.866 3.454 c
+-1.741 3.639 -1.58 3.786 -1.382 3.896 c
+-1.176 4.002 -0.948 4.057 -0.691 4.057 c
+-0.291 4.057 0.015 3.954 0.22 3.749 c
+0.434 3.543 0.548 3.248 0.559 2.866 c
+0.559 0.853 l
+0.559 0.548 0.595 0.283 0.676 0.059 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.559 -0.411 0.647 c
+-0.264 0.736 -0.158 0.846 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.856 -1.191 1.72 c
+-1.367 1.592 -1.455 1.405 -1.455 1.162 c
+-1.455 0.934 -1.411 0.769 -1.323 0.661 c
+-1.234 0.563 -1.084 0.515 -0.867 0.515 c
+6.159 1.794 m
+6.159 1.166 6.041 0.695 5.806 0.383 c
+5.579 0.077 5.262 -0.073 4.85 -0.073 c
+4.447 -0.073 4.138 0.077 3.925 0.383 c
+3.925 -1.529 l
+3.278 -1.529 l
+3.278 3.984 l
+3.866 3.984 l
+3.91 3.543 l
+4.123 3.884 4.432 4.057 4.836 4.057 c
+5.277 4.057 5.604 3.903 5.821 3.601 c
+6.034 3.296 6.148 2.841 6.159 2.234 c
+h
+5.512 2.176 m
+5.512 2.617 5.442 2.94 5.307 3.146 c
+5.167 3.359 4.946 3.469 4.645 3.469 c
+4.329 3.469 4.09 3.315 3.925 3.013 c
+3.925 0.941 l
+4.09 0.636 4.329 0.485 4.645 0.485 c
+4.939 0.485 5.152 0.588 5.292 0.794 c
+5.428 1.008 5.501 1.338 5.512 1.779 c
+h
+7.703 0 -0.647 5.644 re
+10.76 0 m
+10.72 0.088 10.693 0.235 10.686 0.441 c
+10.451 0.096 10.157 -0.073 9.804 -0.073 c
+9.44 -0.073 9.157 0.023 8.952 0.221 c
+8.754 0.426 8.658 0.713 8.658 1.088 c
+8.658 1.488 8.794 1.808 9.07 2.043 c
+9.342 2.286 9.716 2.411 10.186 2.411 c
+10.672 2.411 l
+10.672 2.837 l
+10.672 3.072 10.616 3.238 10.51 3.337 c
+10.4 3.444 10.238 3.499 10.025 3.499 c
+9.826 3.499 9.664 3.44 9.54 3.323 c
+9.422 3.205 9.363 3.057 9.363 2.881 c
+8.717 2.881 l
+8.717 3.076 8.775 3.267 8.893 3.454 c
+9.018 3.639 9.18 3.786 9.378 3.896 c
+9.584 4.002 9.812 4.057 10.069 4.057 c
+10.469 4.057 10.774 3.954 10.98 3.749 c
+11.194 3.543 11.308 3.248 11.318 2.866 c
+11.318 0.853 l
+11.318 0.548 11.355 0.283 11.436 0.059 c
+11.436 0 l
+h
+9.893 0.515 m
+10.057 0.515 10.209 0.559 10.348 0.647 c
+10.495 0.736 10.602 0.846 10.672 0.985 c
+10.672 1.926 l
+10.304 1.926 l
+9.988 1.926 9.745 1.856 9.569 1.72 c
+9.392 1.592 9.305 1.405 9.305 1.162 c
+9.305 0.934 9.349 0.769 9.437 0.661 c
+9.525 0.563 9.676 0.515 9.893 0.515 c
+13.7 0.485 m
+13.913 0.485 14.086 0.548 14.214 0.676 c
+14.35 0.813 14.423 1.004 14.435 1.249 c
+15.052 1.249 l
+15.03 0.867 14.894 0.548 14.641 0.294 c
+14.383 0.048 14.071 -0.073 13.7 -0.073 c
+13.207 -0.073 12.833 0.077 12.567 0.383 c
+12.311 0.695 12.185 1.162 12.185 1.779 c
+12.185 2.22 l
+12.185 2.816 12.311 3.271 12.567 3.587 c
+12.833 3.899 13.207 4.057 13.7 4.057 c
+14.1 4.057 14.42 3.925 14.655 3.66 c
+14.898 3.404 15.03 3.057 15.052 2.617 c
+14.435 2.617 l
+14.412 2.911 14.339 3.131 14.214 3.278 c
+14.096 3.425 13.924 3.499 13.7 3.499 c
+13.406 3.499 13.189 3.4 13.053 3.205 c
+12.914 3.017 12.84 2.708 12.833 2.278 c
+12.833 1.764 l
+12.833 1.294 12.898 0.96 13.038 0.765 c
+13.185 0.578 13.406 0.485 13.7 0.485 c
+17.228 -0.073 m
+16.727 -0.073 16.345 0.073 16.081 0.368 c
+15.817 0.661 15.684 1.095 15.684 1.676 c
+15.684 2.147 l
+15.684 2.741 15.809 3.209 16.066 3.543 c
+16.33 3.884 16.691 4.057 17.153 4.057 c
+17.613 4.057 17.955 3.903 18.183 3.601 c
+18.418 3.308 18.539 2.845 18.55 2.22 c
+18.55 1.794 l
+16.33 1.794 l
+16.33 1.706 l
+16.33 1.272 16.407 0.96 16.565 0.765 c
+16.731 0.578 16.962 0.485 17.257 0.485 c
+17.452 0.485 17.624 0.518 17.771 0.588 c
+17.918 0.665 18.054 0.783 18.183 0.941 c
+18.521 0.53 l
+18.234 0.125 17.804 -0.073 17.228 -0.073 c
+17.153 3.499 m
+16.878 3.499 16.676 3.404 16.551 3.219 c
+16.422 3.032 16.349 2.741 16.33 2.352 c
+17.903 2.352 l
+17.903 2.44 l
+17.882 2.822 17.816 3.091 17.698 3.248 c
+17.581 3.414 17.396 3.499 17.153 3.499 c
+24.018 1.147 m
+24.621 3.984 l
+25.267 3.984 l
+24.283 0 l
+23.769 0 l
+22.99 2.852 l
+22.24 0 l
+21.71 0 l
+20.756 3.984 l
+21.387 3.984 l
+22.005 1.22 l
+22.74 3.984 l
+23.254 3.984 l
+h
+26.591 3.572 m
+26.844 3.896 27.164 4.057 27.546 4.057 c
+28.251 4.057 28.608 3.587 28.619 2.646 c
+28.619 0 l
+27.972 0 l
+27.972 2.617 l
+27.972 2.929 27.917 3.15 27.811 3.278 c
+27.7 3.404 27.546 3.469 27.341 3.469 c
+27.183 3.469 27.035 3.414 26.9 3.308 c
+26.771 3.198 26.668 3.061 26.591 2.896 c
+26.591 0 l
+25.944 0 l
+25.944 5.644 l
+26.591 5.644 l
+h
+31 -0.073 m
+30.501 -0.073 30.119 0.073 29.853 0.368 c
+29.589 0.661 29.457 1.095 29.457 1.676 c
+29.457 2.147 l
+29.457 2.741 29.582 3.209 29.839 3.543 c
+30.104 3.884 30.464 4.057 30.927 4.057 c
+31.386 4.057 31.728 3.903 31.956 3.601 c
+32.191 3.308 32.313 2.845 32.323 2.22 c
+32.323 1.794 l
+30.104 1.794 l
+30.104 1.706 l
+30.104 1.272 30.181 0.96 30.339 0.765 c
+30.504 0.578 30.736 0.485 31.029 0.485 c
+31.224 0.485 31.397 0.518 31.544 0.588 c
+31.692 0.665 31.827 0.783 31.956 0.941 c
+32.294 0.53 l
+32.007 0.125 31.577 -0.073 31 -0.073 c
+30.927 3.499 m
+30.651 3.499 30.449 3.404 30.324 3.219 c
+30.196 3.032 30.122 2.741 30.104 2.352 c
+31.677 2.352 l
+31.677 2.44 l
+31.655 2.822 31.588 3.091 31.471 3.248 c
+31.353 3.414 31.17 3.499 30.927 3.499 c
+34.749 3.366 m
+34.661 3.385 34.561 3.396 34.455 3.396 c
+34.121 3.396 33.885 3.212 33.749 2.852 c
+33.749 0 l
+33.103 0 l
+33.103 3.984 l
+33.734 3.984 l
+33.749 3.572 l
+33.926 3.896 34.168 4.057 34.484 4.057 c
+34.591 4.057 34.678 4.035 34.749 3.998 c
+h
+36.748 -0.073 m
+36.248 -0.073 35.866 0.073 35.601 0.368 c
+35.337 0.661 35.204 1.095 35.204 1.676 c
+35.204 2.147 l
+35.204 2.741 35.329 3.209 35.586 3.543 c
+35.851 3.884 36.211 4.057 36.674 4.057 c
+37.134 4.057 37.475 3.903 37.703 3.601 c
+37.938 3.308 38.059 2.845 38.071 2.22 c
+38.071 1.794 l
+35.851 1.794 l
+35.851 1.706 l
+35.851 1.272 35.928 0.96 36.086 0.765 c
+36.251 0.578 36.483 0.485 36.777 0.485 c
+36.972 0.485 37.144 0.518 37.292 0.588 c
+37.439 0.665 37.574 0.783 37.703 0.941 c
+38.042 0.53 l
+37.755 0.125 37.325 -0.073 36.748 -0.073 c
+36.674 3.499 m
+36.398 3.499 36.197 3.404 36.072 3.219 c
+35.943 3.032 35.869 2.741 35.851 2.352 c
+37.424 2.352 l
+37.424 2.44 l
+37.402 2.822 37.336 3.091 37.218 3.248 c
+37.101 3.414 36.917 3.499 36.674 3.499 c
+41.657 1.088 m
+42.377 3.984 l
+43.068 3.984 l
+41.774 -0.558 l
+41.676 -0.9 41.533 -1.161 41.348 -1.338 c
+41.172 -1.514 40.97 -1.602 40.746 -1.602 c
+40.658 -1.602 40.544 -1.579 40.408 -1.543 c
+40.408 -0.999 l
+40.554 -1.014 l
+40.739 -1.014 40.885 -0.97 40.996 -0.881 c
+41.102 -0.793 41.19 -0.635 41.26 -0.411 c
+41.377 0.03 l
+40.217 3.984 l
+40.922 3.984 l
+h
+43.509 2.176 m
+43.509 2.753 43.646 3.209 43.921 3.543 c
+44.203 3.884 44.575 4.057 45.038 4.057 c
+45.497 4.057 45.865 3.888 46.14 3.558 c
+46.424 3.234 46.57 2.786 46.582 2.22 c
+46.582 1.794 l
+46.582 1.224 46.438 0.769 46.155 0.426 c
+45.88 0.092 45.512 -0.073 45.053 -0.073 c
+44.59 -0.073 44.219 0.088 43.935 0.412 c
+43.66 0.742 43.517 1.183 43.509 1.735 c
+h
+44.156 1.794 m
+44.156 1.389 44.234 1.073 44.392 0.838 c
+44.556 0.603 44.777 0.485 45.053 0.485 c
+45.618 0.485 45.913 0.897 45.934 1.72 c
+45.934 2.176 l
+45.934 2.577 45.85 2.896 45.685 3.131 c
+45.527 3.373 45.31 3.499 45.038 3.499 c
+44.774 3.499 44.556 3.373 44.392 3.131 c
+44.234 2.896 44.156 2.577 44.156 2.176 c
+h
+49.448 0.353 m
+49.231 0.067 48.918 -0.073 48.507 -0.073 c
+48.143 -0.073 47.868 0.048 47.684 0.294 c
+47.507 0.548 47.412 0.912 47.405 1.382 c
+47.405 3.984 l
+48.051 3.984 l
+48.051 1.441 l
+48.051 0.813 48.235 0.5 48.61 0.5 c
+49.011 0.5 49.286 0.676 49.433 1.029 c
+49.433 3.984 l
+50.079 3.984 l
+50.079 0 l
+49.462 0 l
+h
+52.711 3.366 m
+52.623 3.385 52.523 3.396 52.417 3.396 c
+52.082 3.396 51.847 3.212 51.711 2.852 c
+51.711 0 l
+51.064 0 l
+51.064 3.984 l
+51.696 3.984 l
+51.711 3.572 l
+51.887 3.896 52.13 4.057 52.446 4.057 c
+52.553 4.057 52.641 4.035 52.711 3.998 c
+h
+f
+Q
+q 1 0 0 1 389.5808 160.1769 cm
+0 0 m
+0.353 2.234 l
+1.352 2.234 l
+0.529 -1.75 l
+-0.339 -1.75 l
+-0.897 0.558 l
+-1.455 -1.75 l
+-2.323 -1.75 l
+-3.146 2.234 l
+-2.147 2.234 l
+-1.794 0 l
+-1.264 2.234 l
+-0.53 2.234 l
+h
+1.749 0.367 m
+1.749 0.974 1.888 1.448 2.175 1.793 c
+2.458 2.135 2.851 2.308 3.351 2.308 c
+3.858 2.308 4.255 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.367 c
+4.968 0.103 l
+4.968 -0.497 4.825 -0.967 4.542 -1.309 c
+4.255 -1.654 3.858 -1.823 3.351 -1.823 c
+2.84 -1.823 2.443 -1.654 2.161 -1.309 c
+1.885 -0.967 1.749 -0.493 1.749 0.118 c
+h
+2.792 0.103 m
+2.792 -0.603 2.977 -0.956 3.351 -0.956 c
+3.704 -0.956 3.895 -0.661 3.925 -0.073 c
+3.925 0.367 l
+3.925 0.727 3.873 0.999 3.777 1.176 c
+3.678 1.352 3.534 1.44 3.351 1.44 c
+3.175 1.44 3.035 1.352 2.94 1.176 c
+2.84 0.999 2.792 0.727 2.792 0.367 c
+h
+7.57 1.22 m
+7.231 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.881 c
+6.659 -1.75 l
+5.614 -1.75 l
+5.614 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.305 2.308 c
+7.422 2.308 7.515 2.285 7.584 2.248 c
+h
+9.437 -0.221 m
+9.157 -0.53 l
+9.157 -1.75 l
+8.114 -1.75 l
+8.114 3.895 l
+9.157 3.895 l
+9.157 0.852 l
+9.275 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.083 0.588 l
+11.347 -1.75 l
+10.157 -1.75 l
+h
+12.803 -1.75 -1.043 3.984 re
+11.715 3.262 m
+11.715 3.418 11.763 3.546 11.862 3.645 c
+11.968 3.752 12.104 3.807 12.274 3.807 c
+12.45 3.807 12.586 3.752 12.685 3.645 c
+12.791 3.546 12.847 3.418 12.847 3.262 c
+12.847 3.094 12.791 2.958 12.685 2.851 c
+12.586 2.753 12.45 2.705 12.274 2.705 c
+12.104 2.705 11.968 2.753 11.862 2.851 c
+11.763 2.958 11.715 3.094 11.715 3.262 c
+14.566 2.234 m
+14.596 1.837 l
+14.831 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.826 16.565 0.867 c
+16.565 -1.75 l
+15.522 -1.75 l
+15.522 0.793 l
+15.522 1.018 15.486 1.18 15.419 1.278 c
+15.349 1.374 15.232 1.425 15.066 1.425 c
+14.879 1.425 14.732 1.33 14.626 1.146 c
+14.626 -1.75 l
+13.581 -1.75 l
+13.581 2.234 l
+h
+17.183 0.367 m
+17.183 1.014 17.3 1.499 17.535 1.822 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.165 19.359 1.881 c
+19.403 2.234 l
+20.343 2.234 l
+20.343 -1.75 l
+20.343 -2.257 20.2 -2.646 19.917 -2.911 c
+19.63 -3.183 19.226 -3.323 18.697 -3.323 c
+18.47 -3.323 18.234 -3.278 17.992 -3.19 c
+17.756 -3.102 17.58 -2.988 17.462 -2.852 c
+17.815 -2.132 l
+17.911 -2.238 18.039 -2.323 18.197 -2.382 c
+18.351 -2.448 18.499 -2.484 18.638 -2.484 c
+18.873 -2.484 19.039 -2.425 19.137 -2.308 c
+19.245 -2.198 19.299 -2.022 19.299 -1.779 c
+19.299 -1.426 l
+19.101 -1.691 18.844 -1.823 18.52 -1.823 c
+18.098 -1.823 17.771 -1.661 17.535 -1.338 c
+17.308 -1.008 17.19 -0.537 17.183 0.073 c
+h
+18.227 0.103 m
+18.227 -0.272 18.274 -0.54 18.374 -0.706 c
+18.47 -0.875 18.624 -0.956 18.829 -0.956 c
+19.042 -0.956 19.201 -0.879 19.299 -0.721 c
+19.299 1.176 l
+19.189 1.341 19.035 1.425 18.829 1.425 c
+18.624 1.425 18.47 1.341 18.374 1.176 c
+18.274 1.007 18.227 0.738 18.227 0.367 c
+h
+22.695 0.367 m
+22.695 1.014 22.802 1.499 23.018 1.822 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.554 2.175 24.753 1.911 c
+24.753 3.895 l
+25.811 3.895 l
+25.811 -1.75 l
+24.856 -1.75 l
+24.812 -1.338 l
+24.595 -1.661 24.319 -1.823 23.989 -1.823 c
+23.577 -1.823 23.257 -1.669 23.033 -1.353 c
+22.817 -1.029 22.703 -0.559 22.695 0.058 c
+h
+23.739 0.103 m
+23.739 -0.291 23.775 -0.566 23.856 -0.721 c
+23.945 -0.879 24.091 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.753 -0.676 c
+24.753 1.132 l
+24.654 1.326 24.503 1.425 24.297 1.425 c
+24.099 1.425 23.959 1.344 23.871 1.19 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.75 -1.043 3.984 re
+26.576 3.262 m
+26.576 3.418 26.623 3.546 26.723 3.645 c
+26.829 3.752 26.965 3.807 27.134 3.807 c
+27.311 3.807 27.446 3.752 27.546 3.645 c
+27.652 3.546 27.708 3.418 27.708 3.262 c
+27.708 3.094 27.652 2.958 27.546 2.851 c
+27.446 2.753 27.311 2.705 27.134 2.705 c
+26.965 2.705 26.829 2.753 26.723 2.851 c
+26.623 2.958 26.576 3.094 26.576 3.262 c
+30.426 1.22 m
+30.089 1.249 l
+29.802 1.249 29.611 1.124 29.516 0.881 c
+29.516 -1.75 l
+28.471 -1.75 l
+28.471 2.234 l
+29.442 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.162 2.308 c
+30.28 2.308 30.372 2.285 30.441 2.248 c
+h
+32.5 -1.823 m
+31.97 -1.823 31.551 -1.669 31.249 -1.353 c
+30.956 -1.029 30.809 -0.57 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.945 1.448 31.22 1.793 c
+31.492 2.135 31.885 2.308 32.396 2.308 c
+32.896 2.308 33.267 2.146 33.514 1.822 c
+33.767 1.499 33.9 1.022 33.911 0.397 c
+33.911 -0.103 l
+31.837 -0.103 l
+31.856 -0.397 31.918 -0.614 32.029 -0.75 c
+32.147 -0.89 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.723 -1.411 33.535 -1.555 33.293 -1.661 c
+33.047 -1.768 32.782 -1.823 32.5 -1.823 c
+31.853 0.617 m
+32.882 0.617 l
+32.882 0.72 l
+32.882 0.955 32.841 1.132 32.764 1.249 c
+32.694 1.374 32.566 1.44 32.382 1.44 c
+32.205 1.44 32.073 1.371 31.985 1.234 c
+31.904 1.106 31.86 0.9 31.853 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.383 -0.761 36.394 -0.368 c
+37.364 -0.368 l
+37.364 -0.802 37.233 -1.154 36.968 -1.426 c
+36.703 -1.691 36.365 -1.823 35.953 -1.823 c
+35.442 -1.823 35.049 -1.669 34.777 -1.353 c
+34.513 -1.029 34.374 -0.559 34.366 0.058 c
+34.366 0.382 l
+34.366 1.007 34.499 1.484 34.763 1.808 c
+35.035 2.138 35.432 2.308 35.953 2.308 c
+36.383 2.308 36.726 2.167 36.982 1.896 c
+37.236 1.62 37.364 1.238 37.364 0.75 c
+36.394 0.75 l
+36.394 0.962 36.354 1.132 36.277 1.249 c
+36.207 1.374 36.09 1.44 35.924 1.44 c
+35.748 1.44 35.619 1.374 35.542 1.249 c
+35.461 1.12 35.417 0.871 35.409 0.5 c
+35.409 0.087 l
+35.409 -0.235 35.424 -0.463 35.454 -0.588 c
+35.49 -0.717 35.546 -0.809 35.615 -0.867 c
+35.693 -0.927 35.799 -0.956 35.939 -0.956 c
+39.172 3.204 m
+39.172 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.172 1.44 l
+39.172 -0.53 l
+39.172 -0.688 39.191 -0.794 39.232 -0.853 c
+39.28 -0.912 39.363 -0.941 39.481 -0.941 c
+39.588 -0.941 39.673 -0.933 39.731 -0.912 c
+39.731 -1.72 l
+39.555 -1.786 39.363 -1.823 39.158 -1.823 c
+38.482 -1.823 38.137 -1.437 38.129 -0.661 c
+38.129 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.367 m
+40.055 0.974 40.194 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.848 1.793 c
+43.13 1.448 43.274 0.974 43.274 0.367 c
+43.274 0.103 l
+43.274 -0.497 43.13 -0.967 42.848 -1.309 c
+42.561 -1.654 42.164 -1.823 41.657 -1.823 c
+41.146 -1.823 40.749 -1.654 40.466 -1.309 c
+40.19 -0.967 40.055 -0.493 40.055 0.118 c
+h
+41.098 0.103 m
+41.098 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.201 -0.661 42.23 -0.073 c
+42.23 0.367 l
+42.23 0.727 42.179 0.999 42.083 1.176 c
+41.984 1.352 41.84 1.44 41.657 1.44 c
+41.48 1.44 41.341 1.352 41.245 1.176 c
+41.146 0.999 41.098 0.727 41.098 0.367 c
+h
+45.875 1.22 m
+45.537 1.249 l
+45.251 1.249 45.06 1.124 44.965 0.881 c
+44.965 -1.75 l
+43.92 -1.75 l
+43.92 2.234 l
+44.89 2.234 l
+44.92 1.793 l
+45.085 2.135 45.317 2.308 45.611 2.308 c
+45.728 2.308 45.821 2.285 45.89 2.248 c
+h
+47.772 -0.015 m
+48.3 2.234 l
+49.403 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.529 -3.352 46.993 -3.352 c
+46.864 -3.352 46.721 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.484 l
+46.849 -2.484 46.97 -2.448 47.051 -2.382 c
+47.128 -2.323 47.191 -2.213 47.242 -2.058 c
+47.316 -1.794 l
+46.17 2.234 l
+47.286 2.234 l
+h
+f
+Q
+441.968 158.427 -0.646 3.984 re
+442.012 163.454 m
+442.012 163.344 441.983 163.252 441.924 163.175 c
+441.865 163.105 441.769 163.072 441.644 163.072 c
+441.527 163.072 441.432 163.105 441.366 163.175 c
+441.306 163.252 441.277 163.344 441.277 163.454 c
+441.277 163.572 441.306 163.664 441.366 163.734 c
+441.432 163.811 441.527 163.851 441.644 163.851 c
+441.769 163.851 441.865 163.811 441.924 163.734 c
+441.983 163.653 442.012 163.561 442.012 163.454 c
+444.923 159.441 m
+444.923 159.589 444.867 159.71 444.761 159.809 c
+444.651 159.905 444.445 160.023 444.144 160.162 c
+443.798 160.309 443.556 160.43 443.408 160.53 c
+443.261 160.636 443.151 160.754 443.085 160.882 c
+443.015 161.008 442.982 161.166 442.982 161.353 c
+442.982 161.675 443.099 161.945 443.335 162.161 c
+443.57 162.374 443.872 162.485 444.246 162.485 c
+444.628 162.485 444.937 162.371 445.172 162.146 c
+445.407 161.918 445.525 161.632 445.525 161.279 c
+444.878 161.279 l
+444.878 161.455 444.819 161.606 444.702 161.735 c
+444.584 161.86 444.43 161.926 444.246 161.926 c
+444.048 161.926 443.897 161.871 443.791 161.764 c
+443.68 161.665 443.629 161.532 443.629 161.367 c
+443.629 161.239 443.666 161.132 443.747 161.044 c
+443.824 160.963 444.015 160.86 444.32 160.735 c
+444.798 160.548 445.129 160.36 445.305 160.177 c
+445.481 160 445.569 159.772 445.569 159.5 c
+445.569 159.148 445.445 158.868 445.202 158.662 c
+444.967 158.457 444.651 158.354 444.261 158.354 c
+443.838 158.354 443.5 158.471 443.247 158.706 c
+442.989 158.949 442.864 159.254 442.864 159.618 c
+443.512 159.618 l
+443.519 159.39 443.589 159.214 443.718 159.088 c
+443.842 158.971 444.026 158.913 444.261 158.913 c
+444.474 158.913 444.636 158.961 444.746 159.059 c
+444.863 159.155 444.923 159.284 444.923 159.441 c
+448.744 162.411 m
+448.759 161.97 l
+449.012 162.311 449.336 162.485 449.729 162.485 c
+450.434 162.485 450.791 162.014 450.802 161.073 c
+450.802 158.427 l
+450.155 158.427 l
+450.155 161.044 l
+450.155 161.357 450.1 161.577 449.993 161.706 c
+449.883 161.831 449.729 161.897 449.523 161.897 c
+449.365 161.897 449.218 161.841 449.083 161.735 c
+448.954 161.625 448.851 161.488 448.774 161.323 c
+448.774 158.427 l
+448.127 158.427 l
+448.127 162.411 l
+h
+451.64 160.603 m
+451.64 161.18 451.776 161.636 452.052 161.97 c
+452.335 162.311 452.705 162.485 453.168 162.485 c
+453.628 162.485 453.995 162.315 454.271 161.985 c
+454.554 161.661 454.701 161.213 454.712 160.647 c
+454.712 160.221 l
+454.712 159.651 454.569 159.196 454.286 158.853 c
+454.01 158.519 453.642 158.354 453.183 158.354 c
+452.72 158.354 452.349 158.516 452.067 158.839 c
+451.791 159.169 451.647 159.611 451.64 160.162 c
+h
+452.287 160.221 m
+452.287 159.817 452.364 159.5 452.522 159.265 c
+452.687 159.03 452.908 158.913 453.183 158.913 c
+453.75 158.913 454.043 159.324 454.066 160.147 c
+454.066 160.603 l
+454.066 161.004 453.981 161.323 453.815 161.558 c
+453.657 161.801 453.441 161.926 453.168 161.926 c
+452.904 161.926 452.687 161.801 452.522 161.558 c
+452.364 161.323 452.287 161.004 452.287 160.603 c
+h
+458.519 159.574 m
+459.122 162.411 l
+459.768 162.411 l
+458.783 158.427 l
+458.269 158.427 l
+457.49 161.279 l
+456.74 158.427 l
+456.211 158.427 l
+455.256 162.411 l
+455.888 162.411 l
+456.505 159.647 l
+457.241 162.411 l
+457.754 162.411 l
+h
+f
+0.69 w
+288.095 207.441 207.848 -54.945 re
+S
+0.793 0.801 0.129 0.016 K
+0.799 w
+q 1 0 0 1 563.3749 119.0558 cm
+0 0 m
+26.08 -0.095 26.08 27.113 48.253 27.098 c
+133.768 27.098 l
+155.865 27.113 155.865 -0.095 181.335 0 c
+S
+Q
+q 1 0 0 1 312.2897 119.0558 cm
+0 0 m
+458.551 0 l
+S
+Q
+0 0 0 0 k
+q 1 0 0 1 541.4877 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+f
+Q
+0.797 0.801 0.129 0.016 K
+0.709 w
+q 1 0 0 1 541.4877 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 567.4135 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 567.4135 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 593.3356 119.0558 cm
+0 0 m
+0 -2.076 -1.684 -3.755 -3.756 -3.755 c
+-5.833 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.833 3.755 -3.756 3.755 c
+-1.684 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 593.3356 119.0558 cm
+0 0 m
+0 -2.076 -1.684 -3.755 -3.756 -3.755 c
+-5.833 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.833 3.755 -3.756 3.755 c
+-1.684 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 619.2567 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.832 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 619.2567 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.832 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 645.1788 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 645.1788 119.0558 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 671.1036 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 671.1036 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 697.0258 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 697.0258 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 722.9478 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 722.9478 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 774.7947 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 774.7947 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.076 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 748.8699 119.0558 cm
+0 0 m
+0 -2.076 -1.68 -3.755 -3.756 -3.755 c
+-5.829 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.829 3.755 -3.756 3.755 c
+-1.68 3.755 0 2.076 0 0 c
+f
+Q
+q 1 0 0 1 748.8699 119.0558 cm
+0 0 m
+0 -2.076 -1.68 -3.755 -3.756 -3.755 c
+-5.829 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.829 3.755 -3.756 3.755 c
+-1.68 3.755 0 2.076 0 0 c
+h
+S
+Q
+q 1 0 0 1 619.2567 146.1501 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.072 -5.832 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.072 0 0 c
+f
+Q
+q 1 0 0 1 619.2567 146.1501 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.072 -5.832 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.072 0 0 c
+h
+S
+Q
+q 1 0 0 1 645.1788 146.1501 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.072 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.072 0 0 c
+f
+Q
+q 1 0 0 1 645.1788 146.1501 cm
+0 0 m
+0 -2.076 -1.679 -3.755 -3.755 -3.755 c
+-5.828 -3.755 -7.511 -2.076 -7.511 0 c
+-7.511 2.072 -5.828 3.755 -3.755 3.755 c
+-1.679 3.755 0 2.072 0 0 c
+h
+S
+Q
+q 1 0 0 1 671.1036 146.1501 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.072 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.072 0 0 c
+f
+Q
+q 1 0 0 1 671.1036 146.1501 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.759 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.072 -5.832 3.755 -3.759 3.755 c
+-1.683 3.755 0 2.072 0 0 c
+h
+S
+Q
+q 1 0 0 1 697.0258 146.1501 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.072 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.072 0 0 c
+f
+Q
+q 1 0 0 1 697.0258 146.1501 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.515 -2.076 -7.515 0 c
+-7.515 2.072 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.072 0 0 c
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 689.9702 155.2305 cm
+0 0 m
+-0.008 12.072 l
+6.46 12.072 l
+6.468 0 l
+3.227 -3.561 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 691.3192 165.4168 cm
+0 0 m
+2.396 0 l
+2.396 0.368 l
+2.984 0.368 l
+2.984 0 l
+3.116 0 l
+3.487 0 3.777 -0.096 3.983 -0.294 c
+4.189 -0.5 4.292 -0.794 4.292 -1.176 c
+4.292 -1.382 4.237 -1.639 4.13 -1.955 c
+3.468 -1.852 l
+3.546 -1.625 3.586 -1.415 3.586 -1.22 c
+3.586 -0.933 3.428 -0.786 3.116 -0.779 c
+2.984 -0.779 l
+2.984 -1.249 l
+2.396 -1.249 l
+2.396 -0.779 l
+0 -0.779 l
+h
+0 -1.529 2.984 -0.794 re
+0 -2.323 m
+2.102 -3.719 m
+2.984 -4.072 l
+2.984 -4.895 l
+1.529 -4.218 l
+0 -4.924 l
+0 -4.087 l
+0.941 -3.719 l
+0 -3.366 l
+0 -2.528 l
+1.529 -3.233 l
+2.984 -2.558 l
+2.984 -3.395 l
+h
+-0.339 -5.398 m
+-0.339 -4.825 l
+4.012 -6.03 l
+4.012 -6.603 l
+h
+0 -8.279 m
+0.048 -8.249 0.125 -8.224 0.235 -8.206 c
+0.037 -8.066 -0.059 -7.882 -0.059 -7.647 c
+-0.059 -7.39 0.022 -7.181 0.191 -7.015 c
+0.357 -6.857 0.573 -6.78 0.837 -6.78 c
+1.15 -6.78 1.388 -6.876 1.558 -7.073 c
+1.735 -7.269 1.822 -7.551 1.822 -7.927 c
+1.822 -8.176 l
+2.057 -8.176 l
+2.194 -8.176 2.285 -8.151 2.337 -8.103 c
+2.396 -8.052 2.425 -7.985 2.425 -7.897 c
+2.425 -7.699 2.311 -7.603 2.088 -7.603 c
+2.088 -6.824 l
+2.359 -6.824 2.587 -6.927 2.763 -7.133 c
+2.947 -7.339 3.042 -7.603 3.042 -7.927 c
+3.042 -8.249 2.954 -8.5 2.778 -8.676 c
+2.609 -8.86 2.37 -8.955 2.057 -8.955 c
+0.646 -8.955 l
+0.389 -8.955 0.191 -8.989 0.044 -9.058 c
+0 -9.058 l
+h
+0.559 -7.809 m
+0.559 -7.897 0.573 -7.971 0.602 -8.029 c
+0.639 -8.095 0.683 -8.147 0.735 -8.176 c
+1.352 -8.176 l
+1.352 -7.985 l
+1.352 -7.846 1.308 -7.739 1.22 -7.661 c
+1.139 -7.592 1.029 -7.559 0.881 -7.559 c
+0.665 -7.559 0.559 -7.64 0.559 -7.809 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 612.076 155.9689 cm
+0 0 m
+-0.007 25.419 l
+6.465 25.419 l
+6.468 0 l
+3.227 -3.561 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 615.2952 179.954 cm
+0 0 m
+0.449 0 0.802 -0.106 1.058 -0.324 c
+1.324 -0.536 1.455 -0.831 1.455 -1.205 c
+1.455 -1.587 1.324 -1.881 1.058 -2.087 c
+0.802 -2.3 0.449 -2.41 0 -2.41 c
+-0.191 -2.41 l
+-0.654 -2.41 -1.01 -2.3 -1.263 -2.087 c
+-1.521 -1.881 -1.646 -1.587 -1.646 -1.205 c
+-1.646 -0.823 -1.521 -0.522 -1.263 -0.309 c
+-0.999 -0.103 -0.643 0 -0.191 0 c
+h
+-0.191 -0.779 m
+-0.731 -0.779 -0.999 -0.918 -0.999 -1.205 c
+-0.999 -1.469 -0.775 -1.61 -0.323 -1.631 c
+0 -1.646 l
+0.272 -1.646 0.474 -1.606 0.603 -1.529 c
+0.739 -1.448 0.809 -1.341 0.809 -1.205 c
+0.809 -1.076 0.739 -0.974 0.603 -0.897 c
+0.474 -0.816 0.272 -0.779 0 -0.779 c
+h
+0.647 -4.182 m
+0.661 -3.932 l
+0.661 -3.715 0.566 -3.568 0.383 -3.491 c
+-1.587 -3.491 l
+-1.587 -2.712 l
+1.397 -2.712 l
+1.397 -3.447 l
+1.073 -3.476 l
+1.326 -3.594 1.455 -3.759 1.455 -3.976 c
+1.455 -4.064 1.441 -4.137 1.411 -4.197 c
+h
+-1.587 -4.505 2.984 -0.779 re
+-1.587 -5.284 m
+2.161 -4.461 m
+2.286 -4.461 2.389 -4.498 2.469 -4.579 c
+2.547 -4.656 2.587 -4.758 2.587 -4.887 c
+2.587 -5.012 2.547 -5.115 2.469 -5.196 c
+2.389 -5.273 2.286 -5.313 2.161 -5.313 c
+2.043 -5.313 1.945 -5.273 1.867 -5.196 c
+1.786 -5.126 1.75 -5.024 1.75 -4.887 c
+1.75 -4.758 1.786 -4.656 1.867 -4.579 c
+1.945 -4.498 2.043 -4.461 2.161 -4.461 c
+0 -5.699 m
+0.489 -5.699 0.853 -5.787 1.088 -5.964 c
+1.33 -6.14 1.455 -6.383 1.455 -6.699 c
+1.455 -6.971 1.345 -7.184 1.132 -7.331 c
+1.397 -7.36 l
+1.397 -8.066 l
+-1.587 -8.066 l
+-1.969 -8.066 -2.256 -7.956 -2.454 -7.742 c
+-2.66 -7.526 -2.763 -7.221 -2.763 -6.832 c
+-2.763 -6.662 -2.726 -6.485 -2.66 -6.302 c
+-2.601 -6.126 -2.517 -5.993 -2.41 -5.905 c
+-1.881 -6.169 l
+-1.947 -6.247 -2.007 -6.346 -2.057 -6.464 c
+-2.105 -6.581 -2.131 -6.688 -2.131 -6.787 c
+-2.131 -6.963 -2.087 -7.088 -1.999 -7.169 c
+-1.918 -7.247 -1.785 -7.287 -1.602 -7.287 c
+-1.352 -7.287 l
+-1.55 -7.14 -1.646 -6.942 -1.646 -6.699 c
+-1.646 -6.383 -1.525 -6.14 -1.278 -5.964 c
+-1.025 -5.787 -0.673 -5.699 -0.22 -5.699 c
+h
+-0.205 -6.479 m
+-0.481 -6.479 -0.683 -6.512 -0.808 -6.581 c
+-0.926 -6.659 -0.985 -6.776 -0.985 -6.934 c
+-0.985 -7.088 -0.933 -7.206 -0.823 -7.287 c
+0.603 -7.287 l
+0.728 -7.206 0.794 -7.088 0.794 -6.934 c
+0.794 -6.776 0.728 -6.659 0.603 -6.581 c
+0.474 -6.512 0.272 -6.479 0 -6.479 c
+h
+-1.587 -8.488 2.984 -0.779 re
+-1.587 -9.267 m
+2.161 -8.444 m
+2.286 -8.444 2.389 -8.481 2.469 -8.562 c
+2.547 -8.639 2.587 -8.742 2.587 -8.871 c
+2.587 -8.995 2.547 -9.099 2.469 -9.18 c
+2.389 -9.257 2.286 -9.297 2.161 -9.297 c
+2.043 -9.297 1.945 -9.257 1.867 -9.18 c
+1.786 -9.109 1.75 -9.007 1.75 -8.871 c
+1.75 -8.742 1.786 -8.639 1.867 -8.562 c
+1.945 -8.481 2.043 -8.444 2.161 -8.444 c
+1.397 -10.491 m
+1.103 -10.506 l
+1.338 -10.682 1.455 -10.91 1.455 -11.197 c
+1.455 -11.715 1.091 -11.979 0.368 -11.991 c
+-1.587 -11.991 l
+-1.587 -11.212 l
+0.309 -11.212 l
+0.485 -11.212 0.607 -11.185 0.676 -11.138 c
+0.754 -11.087 0.794 -10.998 0.794 -10.873 c
+0.794 -10.726 0.721 -10.612 0.574 -10.535 c
+-1.587 -10.535 l
+-1.587 -9.756 l
+1.397 -9.756 l
+h
+-1.926 -12.66 m
+-1.926 -12.086 l
+2.425 -13.292 l
+2.425 -13.865 l
+h
+-1.587 -14.277 m
+0.809 -14.277 l
+0.809 -13.909 l
+1.397 -13.909 l
+1.397 -14.277 l
+1.529 -14.277 l
+1.9 -14.277 2.19 -14.372 2.396 -14.57 c
+2.602 -14.776 2.705 -15.07 2.705 -15.453 c
+2.705 -15.658 2.65 -15.915 2.543 -16.232 c
+1.881 -16.128 l
+1.959 -15.9 1.999 -15.692 1.999 -15.496 c
+1.999 -15.21 1.841 -15.063 1.529 -15.056 c
+1.397 -15.056 l
+1.397 -15.526 l
+0.809 -15.526 l
+0.809 -15.056 l
+-1.587 -15.056 l
+h
+-1.587 -15.805 2.984 -0.793 re
+-1.587 -16.598 m
+0.515 -17.995 m
+1.397 -18.348 l
+1.397 -19.171 l
+-0.058 -18.495 l
+-1.587 -19.201 l
+-1.587 -18.362 l
+-0.646 -17.995 l
+-1.587 -17.643 l
+-1.587 -16.804 l
+-0.058 -17.51 l
+1.397 -16.834 l
+1.397 -17.672 l
+h
+-1.926 -19.675 m
+-1.926 -19.102 l
+2.425 -20.307 l
+2.425 -20.88 l
+h
+-1.587 -22.555 m
+-1.539 -22.526 -1.462 -22.501 -1.352 -22.482 c
+-1.55 -22.343 -1.646 -22.159 -1.646 -21.924 c
+-1.646 -21.666 -1.565 -21.456 -1.396 -21.292 c
+-1.23 -21.134 -1.014 -21.057 -0.75 -21.057 c
+-0.437 -21.057 -0.198 -21.152 -0.029 -21.35 c
+0.148 -21.545 0.235 -21.828 0.235 -22.202 c
+0.235 -22.453 l
+0.47 -22.453 l
+0.607 -22.453 0.698 -22.427 0.75 -22.379 c
+0.809 -22.327 0.838 -22.262 0.838 -22.173 c
+0.838 -21.975 0.724 -21.88 0.5 -21.88 c
+0.5 -21.101 l
+0.772 -21.101 1 -21.203 1.176 -21.409 c
+1.36 -21.614 1.455 -21.88 1.455 -22.202 c
+1.455 -22.526 1.367 -22.776 1.191 -22.952 c
+1.022 -23.137 0.783 -23.232 0.47 -23.232 c
+-0.941 -23.232 l
+-1.198 -23.232 -1.396 -23.264 -1.543 -23.335 c
+-1.587 -23.335 l
+h
+-1.028 -22.085 m
+-1.028 -22.173 -1.014 -22.247 -0.985 -22.306 c
+-0.948 -22.372 -0.904 -22.423 -0.852 -22.453 c
+-0.235 -22.453 l
+-0.235 -22.262 l
+-0.235 -22.121 -0.279 -22.015 -0.367 -21.938 c
+-0.448 -21.868 -0.558 -21.835 -0.706 -21.835 c
+-0.922 -21.835 -1.028 -21.916 -1.028 -22.085 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 548.514 156.6265 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.441 l
+0 0.441 l
+h
+0.823 -0.897 m
+1.007 -0.654 1.242 -0.529 1.529 -0.529 c
+2.058 -0.529 2.326 -0.881 2.337 -1.587 c
+2.337 -3.572 l
+1.852 -3.572 l
+1.852 -1.616 l
+1.852 -1.381 1.812 -1.216 1.735 -1.117 c
+1.654 -1.022 1.536 -0.97 1.382 -0.97 c
+1.264 -0.97 1.154 -1.01 1.058 -1.087 c
+0.96 -1.168 0.882 -1.275 0.823 -1.411 c
+0.823 -3.572 l
+0.338 -3.572 l
+0.338 0.661 l
+0.823 0.661 l
+h
+3.406 -3.572 -0.499 2.984 re
+3.436 0.206 m
+3.436 0.118 3.41 0.044 3.362 -0.014 c
+3.322 -0.066 3.252 -0.087 3.156 -0.087 c
+3.069 -0.087 2.999 -0.066 2.951 -0.014 c
+2.911 0.044 2.892 0.11 2.892 0.191 c
+2.892 0.279 2.911 0.353 2.951 0.412 c
+2.999 0.47 3.069 0.5 3.156 0.5 c
+3.252 0.5 3.322 0.47 3.362 0.412 c
+3.41 0.353 3.436 0.283 3.436 0.206 c
+5.523 -2.807 m
+5.523 -2.701 5.483 -2.612 5.405 -2.543 c
+5.325 -2.466 5.174 -2.377 4.95 -2.278 c
+4.685 -2.171 4.498 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.833 4.156 -1.734 c
+4.104 -1.639 4.083 -1.521 4.083 -1.381 c
+4.083 -1.139 4.171 -0.937 4.347 -0.779 c
+4.524 -0.613 4.748 -0.529 5.024 -0.529 c
+5.317 -0.529 5.552 -0.617 5.729 -0.793 c
+5.905 -0.962 5.993 -1.176 5.993 -1.44 c
+5.508 -1.44 l
+5.508 -1.304 5.457 -1.19 5.361 -1.103 c
+5.273 -1.007 5.159 -0.955 5.024 -0.955 c
+4.877 -0.955 4.762 -0.995 4.685 -1.072 c
+4.605 -1.143 4.567 -1.242 4.567 -1.367 c
+4.567 -1.466 4.597 -1.543 4.656 -1.602 c
+4.715 -1.66 4.854 -1.741 5.082 -1.837 c
+5.442 -1.984 5.689 -2.127 5.818 -2.263 c
+5.953 -2.392 6.023 -2.564 6.023 -2.778 c
+6.023 -3.035 5.928 -3.241 5.743 -3.395 c
+5.567 -3.553 5.332 -3.63 5.038 -3.63 c
+4.723 -3.63 4.469 -3.542 4.274 -3.366 c
+4.087 -3.183 3.994 -2.95 3.994 -2.675 c
+4.48 -2.675 l
+4.487 -2.844 4.538 -2.977 4.627 -3.072 c
+4.723 -3.16 4.862 -3.204 5.038 -3.204 c
+5.193 -3.204 5.31 -3.171 5.39 -3.102 c
+5.479 -3.035 5.523 -2.936 5.523 -2.807 c
+8.213 -3.572 -0.5 2.984 re
+8.243 0.206 m
+8.243 0.118 8.216 0.044 8.169 -0.014 c
+8.129 -0.066 8.058 -0.087 7.963 -0.087 c
+7.875 -0.087 7.805 -0.066 7.757 -0.014 c
+7.717 0.044 7.699 0.11 7.699 0.191 c
+7.699 0.279 7.717 0.353 7.757 0.412 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.058 0.5 8.129 0.47 8.169 0.412 c
+8.216 0.353 8.243 0.283 8.243 0.206 c
+10.329 -2.807 m
+10.329 -2.701 10.29 -2.612 10.212 -2.543 c
+10.132 -2.466 9.98 -2.377 9.756 -2.278 c
+9.492 -2.171 9.305 -2.08 9.198 -1.999 c
+9.088 -1.922 9.01 -1.833 8.962 -1.734 c
+8.912 -1.639 8.889 -1.521 8.889 -1.381 c
+8.889 -1.139 8.977 -0.937 9.153 -0.779 c
+9.33 -0.613 9.554 -0.529 9.83 -0.529 c
+10.124 -0.529 10.359 -0.617 10.535 -0.793 c
+10.712 -0.962 10.8 -1.176 10.8 -1.44 c
+10.315 -1.44 l
+10.315 -1.304 10.263 -1.19 10.168 -1.103 c
+10.08 -1.007 9.966 -0.955 9.83 -0.955 c
+9.683 -0.955 9.569 -0.995 9.492 -1.072 c
+9.411 -1.143 9.375 -1.242 9.375 -1.367 c
+9.375 -1.466 9.404 -1.543 9.463 -1.602 c
+9.521 -1.66 9.661 -1.741 9.889 -1.837 c
+10.249 -1.984 10.495 -2.127 10.624 -2.263 c
+10.76 -2.392 10.83 -2.564 10.83 -2.778 c
+10.83 -3.035 10.734 -3.241 10.55 -3.395 c
+10.373 -3.553 10.138 -3.63 9.845 -3.63 c
+9.529 -3.63 9.275 -3.542 9.08 -3.366 c
+8.893 -3.183 8.801 -2.95 8.801 -2.675 c
+9.286 -2.675 l
+9.294 -2.844 9.345 -2.977 9.433 -3.072 c
+9.529 -3.16 9.668 -3.204 9.845 -3.204 c
+9.999 -3.204 10.117 -3.171 10.198 -3.102 c
+10.286 -3.035 10.329 -2.936 10.329 -2.807 c
+14.019 -3.572 m
+13.99 -3.505 13.968 -3.395 13.961 -3.248 c
+13.784 -3.505 13.564 -3.63 13.299 -3.63 c
+13.024 -3.63 12.806 -3.557 12.652 -3.41 c
+12.505 -3.256 12.432 -3.039 12.432 -2.763 c
+12.432 -2.462 12.534 -2.219 12.74 -2.043 c
+12.946 -1.859 13.229 -1.764 13.593 -1.764 c
+13.945 -1.764 l
+13.945 -1.44 l
+13.945 -1.263 13.905 -1.143 13.828 -1.072 c
+13.747 -0.995 13.629 -0.955 13.475 -0.955 c
+13.328 -0.955 13.203 -0.999 13.108 -1.087 c
+13.02 -1.176 12.976 -1.286 12.976 -1.411 c
+12.49 -1.411 l
+12.49 -1.263 12.534 -1.124 12.623 -0.985 c
+12.711 -0.837 12.829 -0.727 12.976 -0.646 c
+13.13 -0.569 13.303 -0.529 13.49 -0.529 c
+13.802 -0.529 14.038 -0.61 14.196 -0.764 c
+14.35 -0.911 14.431 -1.132 14.431 -1.425 c
+14.431 -2.925 l
+14.438 -3.16 14.475 -3.362 14.533 -3.528 c
+14.533 -3.572 l
+h
+13.373 -3.189 m
+13.49 -3.189 13.6 -3.156 13.71 -3.087 c
+13.818 -3.021 13.895 -2.936 13.945 -2.836 c
+13.945 -2.131 l
+13.681 -2.131 l
+13.446 -2.131 13.259 -2.183 13.122 -2.278 c
+12.993 -2.377 12.931 -2.52 12.931 -2.705 c
+12.931 -2.873 12.961 -2.994 13.02 -3.072 c
+13.086 -3.152 13.203 -3.189 13.373 -3.189 c
+15.467 -0.588 m
+15.482 -0.911 l
+15.665 -0.658 15.908 -0.529 16.202 -0.529 c
+16.731 -0.529 16.999 -0.881 17.01 -1.587 c
+17.01 -3.572 l
+16.525 -3.572 l
+16.525 -1.616 l
+16.525 -1.381 16.485 -1.216 16.407 -1.117 c
+16.326 -1.022 16.209 -0.97 16.055 -0.97 c
+15.937 -0.97 15.827 -1.01 15.732 -1.087 c
+15.632 -1.168 15.555 -1.275 15.497 -1.411 c
+15.497 -3.572 l
+15.011 -3.572 l
+15.011 -0.588 l
+h
+20.281 -3.307 m
+20.123 -3.524 19.888 -3.63 19.576 -3.63 c
+19.311 -3.63 19.105 -3.538 18.958 -3.351 c
+18.819 -3.167 18.753 -2.892 18.753 -2.528 c
+18.753 -0.588 l
+19.237 -0.588 l
+19.237 -2.499 l
+19.237 -2.961 19.377 -3.189 19.663 -3.189 c
+19.958 -3.189 20.156 -3.057 20.266 -2.792 c
+20.266 -0.588 l
+20.766 -0.588 l
+20.766 -3.572 l
+20.295 -3.572 l
+h
+23.463 -2.219 m
+23.463 -2.69 23.379 -3.042 23.214 -3.278 c
+23.044 -3.513 22.805 -3.63 22.493 -3.63 c
+22.188 -3.63 21.957 -3.52 21.803 -3.293 c
+21.803 -4.718 l
+21.317 -4.718 l
+21.317 -0.588 l
+21.758 -0.588 l
+21.787 -0.926 l
+21.942 -0.661 22.173 -0.529 22.479 -0.529 c
+22.809 -0.529 23.056 -0.646 23.214 -0.881 c
+23.379 -1.109 23.463 -1.448 23.463 -1.896 c
+h
+22.979 -1.94 m
+22.979 -1.61 22.923 -1.363 22.817 -1.205 c
+22.717 -1.051 22.556 -0.97 22.331 -0.97 c
+22.096 -0.97 21.92 -1.087 21.803 -1.323 c
+21.803 -2.866 l
+21.92 -3.094 22.1 -3.204 22.346 -3.204 c
+22.559 -3.204 22.717 -3.127 22.817 -2.969 c
+22.923 -2.815 22.979 -2.572 22.979 -2.248 c
+h
+25.359 -2.807 m
+25.359 -2.701 25.319 -2.612 25.242 -2.543 c
+25.161 -2.466 25.01 -2.377 24.787 -2.278 c
+24.521 -2.171 24.334 -2.08 24.228 -1.999 c
+24.118 -1.922 24.041 -1.833 23.993 -1.734 c
+23.941 -1.639 23.919 -1.521 23.919 -1.381 c
+23.919 -1.139 24.008 -0.937 24.184 -0.779 c
+24.36 -0.613 24.584 -0.529 24.86 -0.529 c
+25.153 -0.529 25.389 -0.617 25.566 -0.793 c
+25.741 -0.962 25.83 -1.176 25.83 -1.44 c
+25.344 -1.44 l
+25.344 -1.304 25.294 -1.19 25.198 -1.103 c
+25.109 -1.007 24.995 -0.955 24.86 -0.955 c
+24.713 -0.955 24.598 -0.995 24.521 -1.072 c
+24.44 -1.143 24.404 -1.242 24.404 -1.367 c
+24.404 -1.466 24.434 -1.543 24.492 -1.602 c
+24.551 -1.66 24.691 -1.741 24.918 -1.837 c
+25.279 -1.984 25.525 -2.127 25.654 -2.263 c
+25.789 -2.392 25.859 -2.564 25.859 -2.778 c
+25.859 -3.035 25.764 -3.241 25.58 -3.395 c
+25.404 -3.553 25.169 -3.63 24.874 -3.63 c
+24.558 -3.63 24.305 -3.542 24.11 -3.366 c
+23.923 -3.183 23.831 -2.95 23.831 -2.675 c
+24.316 -2.675 l
+24.323 -2.844 24.375 -2.977 24.463 -3.072 c
+24.558 -3.16 24.698 -3.204 24.874 -3.204 c
+25.028 -3.204 25.146 -3.171 25.227 -3.102 c
+25.315 -3.035 25.359 -2.936 25.359 -2.807 c
+26.95 0.133 m
+26.95 -0.588 l
+27.407 -0.588 l
+27.407 -0.985 l
+26.95 -0.985 l
+26.95 -2.836 l
+26.95 -2.954 26.969 -3.042 27.01 -3.102 c
+27.046 -3.16 27.116 -3.189 27.216 -3.189 c
+27.274 -3.189 27.337 -3.183 27.407 -3.16 c
+27.407 -3.572 l
+27.289 -3.609 27.175 -3.63 27.068 -3.63 c
+26.869 -3.63 26.719 -3.564 26.613 -3.424 c
+26.514 -3.289 26.466 -3.094 26.466 -2.836 c
+26.466 -0.985 l
+26.01 -0.985 l
+26.01 -0.588 l
+26.466 -0.588 l
+26.466 0.133 l
+h
+29.107 -1.043 m
+29.038 -1.036 28.964 -1.028 28.887 -1.028 c
+28.63 -1.028 28.454 -1.168 28.359 -1.44 c
+28.359 -3.572 l
+27.873 -3.572 l
+27.873 -0.588 l
+28.344 -0.588 l
+28.359 -0.897 l
+28.483 -0.654 28.667 -0.529 28.902 -0.529 c
+28.979 -0.529 29.042 -0.544 29.093 -0.573 c
+h
+30.482 -3.63 m
+30.107 -3.63 29.824 -3.524 29.63 -3.307 c
+29.431 -3.083 29.336 -2.755 29.336 -2.322 c
+29.336 -1.955 l
+29.336 -1.514 29.427 -1.168 29.614 -0.911 c
+29.81 -0.658 30.085 -0.529 30.438 -0.529 c
+30.78 -0.529 31.033 -0.643 31.202 -0.867 c
+31.378 -1.095 31.471 -1.44 31.482 -1.911 c
+31.482 -2.219 l
+29.82 -2.219 l
+29.82 -2.293 l
+29.82 -2.616 29.88 -2.851 29.997 -2.998 c
+30.115 -3.138 30.283 -3.204 30.512 -3.204 c
+30.659 -3.204 30.784 -3.183 30.894 -3.131 c
+31 -3.072 31.103 -2.984 31.202 -2.866 c
+31.453 -3.175 l
+31.247 -3.48 30.923 -3.63 30.482 -3.63 c
+30.438 -0.955 m
+30.233 -0.955 30.078 -1.025 29.982 -1.161 c
+29.883 -1.301 29.828 -1.514 29.82 -1.808 c
+30.996 -1.808 l
+30.996 -1.734 l
+30.975 -1.462 30.923 -1.263 30.835 -1.146 c
+30.747 -1.022 30.615 -0.955 30.438 -0.955 c
+33.422 -3.572 m
+33.392 -3.505 33.371 -3.395 33.363 -3.248 c
+33.186 -3.505 32.966 -3.63 32.702 -3.63 c
+32.426 -3.63 32.209 -3.557 32.055 -3.41 c
+31.908 -3.256 31.835 -3.039 31.835 -2.763 c
+31.835 -2.462 31.937 -2.219 32.143 -2.043 c
+32.349 -1.859 32.632 -1.764 32.995 -1.764 c
+33.348 -1.764 l
+33.348 -1.44 l
+33.348 -1.263 33.308 -1.143 33.231 -1.072 c
+33.15 -0.995 33.032 -0.955 32.878 -0.955 c
+32.731 -0.955 32.606 -0.999 32.511 -1.087 c
+32.423 -1.176 32.378 -1.286 32.378 -1.411 c
+31.893 -1.411 l
+31.893 -1.263 31.937 -1.124 32.026 -0.985 c
+32.114 -0.837 32.232 -0.727 32.378 -0.646 c
+32.533 -0.569 32.706 -0.529 32.893 -0.529 c
+33.205 -0.529 33.44 -0.61 33.599 -0.764 c
+33.753 -0.911 33.834 -1.132 33.834 -1.425 c
+33.834 -2.925 l
+33.841 -3.16 33.878 -3.362 33.936 -3.528 c
+33.936 -3.572 l
+h
+32.775 -3.189 m
+32.893 -3.189 33.003 -3.156 33.113 -3.087 c
+33.219 -3.021 33.297 -2.936 33.348 -2.836 c
+33.348 -2.131 l
+33.084 -2.131 l
+32.849 -2.131 32.661 -2.183 32.525 -2.278 c
+32.397 -2.377 32.334 -2.52 32.334 -2.705 c
+32.334 -2.873 32.363 -2.994 32.423 -3.072 c
+32.488 -3.152 32.606 -3.189 32.775 -3.189 c
+34.869 -0.588 m
+34.884 -0.867 l
+35.061 -0.643 35.299 -0.529 35.605 -0.529 c
+35.935 -0.529 36.167 -0.675 36.296 -0.97 c
+36.479 -0.675 36.741 -0.529 37.075 -0.529 c
+37.633 -0.529 37.917 -0.874 37.927 -1.558 c
+37.927 -3.572 l
+37.442 -3.572 l
+37.442 -1.602 l
+37.442 -1.389 37.402 -1.23 37.325 -1.132 c
+37.244 -1.025 37.111 -0.97 36.928 -0.97 c
+36.781 -0.97 36.663 -1.028 36.575 -1.146 c
+36.487 -1.257 36.432 -1.396 36.413 -1.573 c
+36.413 -3.572 l
+35.928 -3.572 l
+35.928 -1.587 l
+35.917 -1.176 35.744 -0.97 35.414 -0.97 c
+35.168 -0.97 34.995 -1.095 34.9 -1.338 c
+34.9 -3.572 l
+34.414 -3.572 l
+34.414 -0.588 l
+h
+41.742 -2.219 m
+41.742 -2.69 41.657 -3.042 41.491 -3.278 c
+41.323 -3.513 41.08 -3.63 40.757 -3.63 c
+40.44 -3.63 40.205 -3.495 40.051 -3.219 c
+40.022 -3.572 l
+39.581 -3.572 l
+39.581 0.661 l
+40.066 0.661 l
+40.066 -0.911 l
+40.22 -0.658 40.452 -0.529 40.757 -0.529 c
+41.08 -0.529 41.323 -0.646 41.491 -0.881 c
+41.657 -1.117 41.742 -1.466 41.742 -1.926 c
+h
+41.256 -1.94 m
+41.256 -1.587 41.205 -1.338 41.109 -1.19 c
+41.011 -1.043 40.849 -0.97 40.625 -0.97 c
+40.378 -0.97 40.191 -1.109 40.066 -1.381 c
+40.066 -2.792 l
+40.184 -3.057 40.375 -3.189 40.639 -3.189 c
+40.853 -3.189 41.011 -3.116 41.109 -2.969 c
+41.205 -2.815 41.256 -2.572 41.256 -2.248 c
+h
+43.417 -1.043 m
+43.347 -1.036 43.274 -1.028 43.197 -1.028 c
+42.94 -1.028 42.763 -1.168 42.667 -1.44 c
+42.667 -3.572 l
+42.183 -3.572 l
+42.183 -0.588 l
+42.653 -0.588 l
+42.667 -0.897 l
+42.792 -0.654 42.977 -0.529 43.212 -0.529 c
+43.289 -0.529 43.351 -0.544 43.403 -0.573 c
+h
+45.214 -3.572 m
+45.185 -3.505 45.163 -3.395 45.155 -3.248 c
+44.979 -3.505 44.758 -3.63 44.494 -3.63 c
+44.219 -3.63 44.001 -3.557 43.847 -3.41 c
+43.7 -3.256 43.627 -3.039 43.627 -2.763 c
+43.627 -2.462 43.729 -2.219 43.935 -2.043 c
+44.141 -1.859 44.425 -1.764 44.788 -1.764 c
+45.14 -1.764 l
+45.14 -1.44 l
+45.14 -1.263 45.1 -1.143 45.023 -1.072 c
+44.942 -0.995 44.824 -0.955 44.67 -0.955 c
+44.523 -0.955 44.398 -0.999 44.303 -1.087 c
+44.215 -1.176 44.171 -1.286 44.171 -1.411 c
+43.686 -1.411 l
+43.686 -1.263 43.729 -1.124 43.818 -0.985 c
+43.906 -0.837 44.024 -0.727 44.171 -0.646 c
+44.325 -0.569 44.498 -0.529 44.685 -0.529 c
+44.997 -0.529 45.233 -0.61 45.391 -0.764 c
+45.545 -0.911 45.626 -1.132 45.626 -1.425 c
+45.626 -2.925 l
+45.633 -3.16 45.67 -3.362 45.728 -3.528 c
+45.728 -3.572 l
+h
+44.568 -3.189 m
+44.685 -3.189 44.795 -3.156 44.905 -3.087 c
+45.013 -3.021 45.09 -2.936 45.14 -2.836 c
+45.14 -2.131 l
+44.876 -2.131 l
+44.641 -2.131 44.454 -2.183 44.317 -2.278 c
+44.189 -2.377 44.126 -2.52 44.126 -2.705 c
+44.126 -2.873 44.156 -2.994 44.215 -3.072 c
+44.281 -3.152 44.398 -3.189 44.568 -3.189 c
+46.663 -0.588 m
+46.677 -0.911 l
+46.86 -0.658 47.103 -0.529 47.397 -0.529 c
+47.926 -0.529 48.194 -0.881 48.205 -1.587 c
+48.205 -3.572 l
+47.721 -3.572 l
+47.721 -1.616 l
+47.721 -1.381 47.68 -1.216 47.603 -1.117 c
+47.522 -1.022 47.405 -0.97 47.25 -0.97 c
+47.133 -0.97 47.022 -1.01 46.927 -1.087 c
+46.827 -1.168 46.75 -1.275 46.692 -1.411 c
+46.692 -3.572 l
+46.206 -3.572 l
+46.206 -0.588 l
+h
+49.79 -3.204 m
+49.955 -3.204 50.087 -3.156 50.187 -3.057 c
+50.282 -2.961 50.337 -2.818 50.348 -2.631 c
+50.804 -2.631 l
+50.792 -2.917 50.69 -3.156 50.495 -3.351 c
+50.308 -3.538 50.073 -3.63 49.79 -3.63 c
+49.425 -3.63 49.146 -3.513 48.951 -3.278 c
+48.753 -3.042 48.658 -2.697 48.658 -2.234 c
+48.658 -1.911 l
+48.658 -1.462 48.749 -1.117 48.937 -0.881 c
+49.132 -0.646 49.414 -0.529 49.79 -0.529 c
+50.091 -0.529 50.333 -0.628 50.509 -0.823 c
+50.694 -1.022 50.792 -1.286 50.804 -1.616 c
+50.348 -1.616 l
+50.326 -1.392 50.267 -1.227 50.171 -1.117 c
+50.083 -1.01 49.955 -0.955 49.79 -0.955 c
+49.572 -0.955 49.41 -1.028 49.304 -1.176 c
+49.205 -1.315 49.15 -1.543 49.142 -1.866 c
+49.142 -2.248 l
+49.142 -2.601 49.19 -2.851 49.29 -2.998 c
+49.396 -3.138 49.562 -3.204 49.79 -3.204 c
+51.682 -0.897 m
+51.866 -0.654 52.101 -0.529 52.388 -0.529 c
+52.917 -0.529 53.185 -0.881 53.196 -1.587 c
+53.196 -3.572 l
+52.711 -3.572 l
+52.711 -1.616 l
+52.711 -1.381 52.67 -1.216 52.593 -1.117 c
+52.512 -1.022 52.394 -0.97 52.24 -0.97 c
+52.123 -0.97 52.013 -1.01 51.917 -1.087 c
+51.818 -1.168 51.741 -1.275 51.682 -1.411 c
+51.682 -3.572 l
+51.197 -3.572 l
+51.197 0.661 l
+51.682 0.661 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w
+q 1 0 0 1 602.8229 154.5574 cm
+0 0 m
+5.862 3.679 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 606.8806 157.1041 cm
+0 0 m
+-0.338 -1.47 l
+2.257 1.419 l
+-1.474 0.335 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 606.8807 157.1041 cm
+0 0 m
+-0.338 -1.47 l
+2.257 1.419 l
+-1.474 0.335 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 634.8231 174.5965 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.441 l
+0 0.441 l
+h
+0.823 -0.897 m
+1.007 -0.654 1.242 -0.53 1.529 -0.53 c
+2.058 -0.53 2.326 -0.882 2.337 -1.588 c
+2.337 -3.572 l
+1.852 -3.572 l
+1.852 -1.617 l
+1.852 -1.382 1.812 -1.216 1.735 -1.118 c
+1.654 -1.022 1.536 -0.97 1.382 -0.97 c
+1.264 -0.97 1.154 -1.01 1.058 -1.088 c
+0.96 -1.168 0.882 -1.276 0.823 -1.411 c
+0.823 -3.572 l
+0.338 -3.572 l
+0.338 0.661 l
+0.823 0.661 l
+h
+3.406 -3.572 -0.5 2.984 re
+3.436 0.206 m
+3.436 0.118 3.41 0.044 3.362 -0.015 c
+3.322 -0.066 3.252 -0.088 3.157 -0.088 c
+3.069 -0.088 2.999 -0.066 2.951 -0.015 c
+2.911 0.044 2.892 0.11 2.892 0.191 c
+2.892 0.279 2.911 0.353 2.951 0.411 c
+2.999 0.47 3.069 0.5 3.157 0.5 c
+3.252 0.5 3.322 0.47 3.362 0.411 c
+3.41 0.353 3.436 0.283 3.436 0.206 c
+5.523 -2.808 m
+5.523 -2.701 5.483 -2.612 5.406 -2.543 c
+5.325 -2.466 5.174 -2.377 4.95 -2.278 c
+4.686 -2.172 4.498 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.735 c
+4.104 -1.639 4.083 -1.521 4.083 -1.382 c
+4.083 -1.139 4.171 -0.937 4.347 -0.779 c
+4.524 -0.613 4.748 -0.53 5.024 -0.53 c
+5.317 -0.53 5.552 -0.617 5.729 -0.794 c
+5.905 -0.963 5.993 -1.176 5.993 -1.44 c
+5.509 -1.44 l
+5.509 -1.305 5.457 -1.191 5.361 -1.103 c
+5.274 -1.007 5.159 -0.956 5.024 -0.956 c
+4.877 -0.956 4.763 -0.996 4.686 -1.073 c
+4.605 -1.143 4.568 -1.242 4.568 -1.367 c
+4.568 -1.467 4.597 -1.544 4.656 -1.602 c
+4.715 -1.661 4.854 -1.742 5.082 -1.837 c
+5.442 -1.985 5.689 -2.128 5.818 -2.263 c
+5.953 -2.392 6.023 -2.565 6.023 -2.778 c
+6.023 -3.036 5.928 -3.241 5.744 -3.396 c
+5.567 -3.553 5.332 -3.631 5.039 -3.631 c
+4.723 -3.631 4.469 -3.543 4.274 -3.366 c
+4.087 -3.183 3.994 -2.951 3.994 -2.675 c
+4.48 -2.675 l
+4.487 -2.845 4.538 -2.977 4.627 -3.072 c
+4.723 -3.161 4.862 -3.204 5.039 -3.204 c
+5.193 -3.204 5.31 -3.171 5.391 -3.102 c
+5.479 -3.036 5.523 -2.936 5.523 -2.808 c
+8.214 -3.572 -0.5 2.984 re
+8.243 0.206 m
+8.243 0.118 8.216 0.044 8.169 -0.015 c
+8.129 -0.066 8.058 -0.088 7.963 -0.088 c
+7.875 -0.088 7.805 -0.066 7.757 -0.015 c
+7.717 0.044 7.699 0.11 7.699 0.191 c
+7.699 0.279 7.717 0.353 7.757 0.411 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.058 0.5 8.129 0.47 8.169 0.411 c
+8.216 0.353 8.243 0.283 8.243 0.206 c
+10.327 -2.808 m
+10.327 -2.701 10.286 -2.612 10.209 -2.543 c
+10.128 -2.466 9.978 -2.377 9.753 -2.278 c
+9.488 -2.172 9.301 -2.08 9.195 -1.999 c
+9.084 -1.922 9.007 -1.834 8.96 -1.735 c
+8.908 -1.639 8.885 -1.521 8.885 -1.382 c
+8.885 -1.139 8.974 -0.937 9.151 -0.779 c
+9.327 -0.613 9.55 -0.53 9.826 -0.53 c
+10.121 -0.53 10.356 -0.617 10.532 -0.794 c
+10.708 -0.963 10.797 -1.176 10.797 -1.44 c
+10.311 -1.44 l
+10.311 -1.305 10.26 -1.191 10.165 -1.103 c
+10.076 -1.007 9.962 -0.956 9.826 -0.956 c
+9.679 -0.956 9.565 -0.996 9.488 -1.073 c
+9.407 -1.143 9.371 -1.242 9.371 -1.367 c
+9.371 -1.467 9.4 -1.544 9.459 -1.602 c
+9.517 -1.661 9.658 -1.742 9.885 -1.837 c
+10.246 -1.985 10.491 -2.128 10.62 -2.263 c
+10.756 -2.392 10.826 -2.565 10.826 -2.778 c
+10.826 -3.036 10.73 -3.241 10.547 -3.396 c
+10.371 -3.553 10.136 -3.631 9.841 -3.631 c
+9.525 -3.631 9.272 -3.543 9.077 -3.366 c
+8.889 -3.183 8.798 -2.951 8.798 -2.675 c
+9.282 -2.675 l
+9.29 -2.845 9.342 -2.977 9.43 -3.072 c
+9.525 -3.161 9.665 -3.204 9.841 -3.204 c
+9.995 -3.204 10.113 -3.171 10.194 -3.102 c
+10.282 -3.036 10.327 -2.936 10.327 -2.808 c
+14.016 -3.572 m
+13.986 -3.506 13.964 -3.396 13.957 -3.248 c
+13.781 -3.506 13.56 -3.631 13.296 -3.631 c
+13.02 -3.631 12.803 -3.557 12.648 -3.41 c
+12.502 -3.256 12.428 -3.04 12.428 -2.764 c
+12.428 -2.462 12.531 -2.22 12.737 -2.043 c
+12.943 -1.86 13.226 -1.764 13.589 -1.764 c
+13.942 -1.764 l
+13.942 -1.44 l
+13.942 -1.264 13.901 -1.143 13.824 -1.073 c
+13.743 -0.996 13.626 -0.956 13.471 -0.956 c
+13.325 -0.956 13.2 -1 13.105 -1.088 c
+13.016 -1.176 12.972 -1.286 12.972 -1.411 c
+12.487 -1.411 l
+12.487 -1.264 12.531 -1.124 12.619 -0.985 c
+12.708 -0.838 12.825 -0.728 12.972 -0.647 c
+13.126 -0.57 13.299 -0.53 13.486 -0.53 c
+13.799 -0.53 14.034 -0.611 14.192 -0.765 c
+14.346 -0.912 14.427 -1.132 14.427 -1.426 c
+14.427 -2.926 l
+14.435 -3.161 14.471 -3.362 14.53 -3.528 c
+14.53 -3.572 l
+h
+13.369 -3.19 m
+13.486 -3.19 13.596 -3.157 13.707 -3.087 c
+13.814 -3.021 13.891 -2.936 13.942 -2.837 c
+13.942 -2.132 l
+13.677 -2.132 l
+13.442 -2.132 13.255 -2.183 13.119 -2.278 c
+12.991 -2.377 12.928 -2.521 12.928 -2.705 c
+12.928 -2.874 12.958 -2.995 13.016 -3.072 c
+13.082 -3.153 13.2 -3.19 13.369 -3.19 c
+16.742 -3.572 -0.5 4.233 re
+17.315 -1.941 m
+17.315 -1.511 17.419 -1.168 17.624 -0.912 c
+17.837 -0.658 18.117 -0.53 18.462 -0.53 c
+18.804 -0.53 19.079 -0.658 19.285 -0.912 c
+19.499 -1.158 19.613 -1.492 19.623 -1.911 c
+19.623 -2.22 l
+19.623 -2.653 19.513 -2.995 19.3 -3.248 c
+19.094 -3.506 18.815 -3.631 18.462 -3.631 c
+18.117 -3.631 17.845 -3.51 17.639 -3.263 c
+17.433 -3.021 17.323 -2.687 17.315 -2.263 c
+h
+17.801 -2.22 m
+17.801 -2.535 17.859 -2.778 17.977 -2.955 c
+18.102 -3.123 18.264 -3.204 18.462 -3.204 c
+18.892 -3.204 19.116 -2.896 19.138 -2.278 c
+19.138 -1.941 l
+19.138 -1.639 19.073 -1.397 18.948 -1.22 c
+18.83 -1.044 18.668 -0.956 18.462 -0.956 c
+18.264 -0.956 18.102 -1.044 17.977 -1.22 c
+17.859 -1.397 17.801 -1.639 17.801 -1.941 c
+h
+21.09 -3.204 m
+21.255 -3.204 21.387 -3.157 21.487 -3.057 c
+21.582 -2.962 21.637 -2.818 21.648 -2.631 c
+22.104 -2.631 l
+22.092 -2.918 21.99 -3.157 21.795 -3.352 c
+21.608 -3.539 21.373 -3.631 21.09 -3.631 c
+20.725 -3.631 20.446 -3.514 20.251 -3.278 c
+20.053 -3.043 19.958 -2.697 19.958 -2.234 c
+19.958 -1.911 l
+19.958 -1.463 20.05 -1.118 20.237 -0.882 c
+20.432 -0.647 20.715 -0.53 21.09 -0.53 c
+21.391 -0.53 21.633 -0.628 21.81 -0.823 c
+21.994 -1.022 22.092 -1.286 22.104 -1.617 c
+21.648 -1.617 l
+21.626 -1.393 21.567 -1.228 21.471 -1.118 c
+21.384 -1.01 21.255 -0.956 21.09 -0.956 c
+20.873 -0.956 20.711 -1.029 20.604 -1.176 c
+20.505 -1.316 20.45 -1.544 20.443 -1.867 c
+20.443 -2.249 l
+20.443 -2.602 20.49 -2.851 20.59 -2.999 c
+20.696 -3.138 20.862 -3.204 21.09 -3.204 c
+24.029 -3.572 m
+24 -3.506 23.978 -3.396 23.971 -3.248 c
+23.794 -3.506 23.574 -3.631 23.309 -3.631 c
+23.033 -3.631 22.817 -3.557 22.662 -3.41 c
+22.516 -3.256 22.442 -3.04 22.442 -2.764 c
+22.442 -2.462 22.545 -2.22 22.751 -2.043 c
+22.956 -1.86 23.239 -1.764 23.603 -1.764 c
+23.956 -1.764 l
+23.956 -1.44 l
+23.956 -1.264 23.916 -1.143 23.838 -1.073 c
+23.757 -0.996 23.64 -0.956 23.486 -0.956 c
+23.339 -0.956 23.214 -1 23.118 -1.088 c
+23.03 -1.176 22.986 -1.286 22.986 -1.411 c
+22.501 -1.411 l
+22.501 -1.264 22.545 -1.124 22.633 -0.985 c
+22.721 -0.838 22.838 -0.728 22.986 -0.647 c
+23.14 -0.57 23.312 -0.53 23.501 -0.53 c
+23.813 -0.53 24.048 -0.611 24.206 -0.765 c
+24.36 -0.912 24.441 -1.132 24.441 -1.426 c
+24.441 -2.926 l
+24.448 -3.161 24.485 -3.362 24.544 -3.528 c
+24.544 -3.572 l
+h
+23.383 -3.19 m
+23.501 -3.19 23.611 -3.157 23.721 -3.087 c
+23.827 -3.021 23.904 -2.936 23.956 -2.837 c
+23.956 -2.132 l
+23.692 -2.132 l
+23.456 -2.132 23.268 -2.183 23.133 -2.278 c
+23.004 -2.377 22.942 -2.521 22.942 -2.705 c
+22.942 -2.874 22.971 -2.995 23.03 -3.072 c
+23.096 -3.153 23.214 -3.19 23.383 -3.19 c
+25.551 -3.572 -0.5 4.233 re
+29.589 -2.22 m
+29.589 -2.691 29.504 -3.043 29.34 -3.278 c
+29.171 -3.514 28.928 -3.631 28.604 -3.631 c
+28.288 -3.631 28.053 -3.495 27.899 -3.219 c
+27.869 -3.572 l
+27.428 -3.572 l
+27.428 0.661 l
+27.914 0.661 l
+27.914 -0.912 l
+28.068 -0.658 28.299 -0.53 28.604 -0.53 c
+28.928 -0.53 29.171 -0.647 29.34 -0.882 c
+29.504 -1.118 29.589 -1.467 29.589 -1.926 c
+h
+29.105 -1.941 m
+29.105 -1.588 29.053 -1.338 28.957 -1.191 c
+28.858 -1.044 28.696 -0.97 28.472 -0.97 c
+28.226 -0.97 28.039 -1.11 27.914 -1.382 c
+27.914 -2.793 l
+28.031 -3.057 28.222 -3.19 28.487 -3.19 c
+28.7 -3.19 28.858 -3.117 28.957 -2.969 c
+29.053 -2.815 29.105 -2.573 29.105 -2.249 c
+h
+31.265 -1.044 m
+31.195 -1.037 31.122 -1.029 31.044 -1.029 c
+30.788 -1.029 30.611 -1.168 30.516 -1.44 c
+30.516 -3.572 l
+30.03 -3.572 l
+30.03 -0.588 l
+30.501 -0.588 l
+30.516 -0.897 l
+30.64 -0.654 30.824 -0.53 31.06 -0.53 c
+31.137 -0.53 31.199 -0.544 31.25 -0.574 c
+h
+33.062 -3.572 m
+33.032 -3.506 33.011 -3.396 33.003 -3.248 c
+32.827 -3.506 32.606 -3.631 32.342 -3.631 c
+32.066 -3.631 31.85 -3.557 31.695 -3.41 c
+31.548 -3.256 31.474 -3.04 31.474 -2.764 c
+31.474 -2.462 31.577 -2.22 31.783 -2.043 c
+31.989 -1.86 32.272 -1.764 32.636 -1.764 c
+32.988 -1.764 l
+32.988 -1.44 l
+32.988 -1.264 32.949 -1.143 32.871 -1.073 c
+32.79 -0.996 32.673 -0.956 32.518 -0.956 c
+32.371 -0.956 32.246 -1 32.151 -1.088 c
+32.062 -1.176 32.018 -1.286 32.018 -1.411 c
+31.534 -1.411 l
+31.534 -1.264 31.577 -1.124 31.665 -0.985 c
+31.754 -0.838 31.871 -0.728 32.018 -0.647 c
+32.172 -0.57 32.346 -0.53 32.533 -0.53 c
+32.845 -0.53 33.08 -0.611 33.238 -0.765 c
+33.393 -0.912 33.473 -1.132 33.473 -1.426 c
+33.473 -2.926 l
+33.481 -3.161 33.518 -3.362 33.577 -3.528 c
+33.577 -3.572 l
+h
+32.415 -3.19 m
+32.533 -3.19 32.643 -3.157 32.753 -3.087 c
+32.86 -3.021 32.937 -2.936 32.988 -2.837 c
+32.988 -2.132 l
+32.724 -2.132 l
+32.488 -2.132 32.301 -2.183 32.166 -2.278 c
+32.037 -2.377 31.974 -2.521 31.974 -2.705 c
+31.974 -2.874 32.004 -2.995 32.062 -3.072 c
+32.128 -3.153 32.246 -3.19 32.415 -3.19 c
+34.51 -0.588 m
+34.524 -0.912 l
+34.709 -0.658 34.95 -0.53 35.245 -0.53 c
+35.774 -0.53 36.043 -0.882 36.053 -1.588 c
+36.053 -3.572 l
+35.568 -3.572 l
+35.568 -1.617 l
+35.568 -1.382 35.528 -1.216 35.451 -1.118 c
+35.37 -1.022 35.252 -0.97 35.098 -0.97 c
+34.98 -0.97 34.87 -1.01 34.774 -1.088 c
+34.675 -1.168 34.598 -1.276 34.539 -1.411 c
+34.539 -3.572 l
+34.054 -3.572 l
+34.054 -0.588 l
+h
+37.637 -3.204 m
+37.803 -3.204 37.934 -3.157 38.034 -3.057 c
+38.129 -2.962 38.185 -2.818 38.196 -2.631 c
+38.651 -2.631 l
+38.64 -2.918 38.537 -3.157 38.343 -3.352 c
+38.155 -3.539 37.92 -3.631 37.637 -3.631 c
+37.273 -3.631 36.994 -3.514 36.799 -3.278 c
+36.6 -3.043 36.505 -2.697 36.505 -2.234 c
+36.505 -1.911 l
+36.505 -1.463 36.597 -1.118 36.785 -0.882 c
+36.98 -0.647 37.262 -0.53 37.637 -0.53 c
+37.938 -0.53 38.181 -0.628 38.358 -0.823 c
+38.541 -1.022 38.64 -1.286 38.651 -1.617 c
+38.196 -1.617 l
+38.173 -1.393 38.115 -1.228 38.019 -1.118 c
+37.931 -1.01 37.803 -0.956 37.637 -0.956 c
+37.42 -0.956 37.259 -1.029 37.152 -1.176 c
+37.053 -1.316 36.997 -1.544 36.99 -1.867 c
+36.99 -2.249 l
+36.99 -2.602 37.038 -2.851 37.138 -2.999 c
+37.244 -3.138 37.409 -3.204 37.637 -3.204 c
+39.53 -0.897 m
+39.713 -0.654 39.949 -0.53 40.235 -0.53 c
+40.764 -0.53 41.032 -0.882 41.044 -1.588 c
+41.044 -3.572 l
+40.558 -3.572 l
+40.558 -1.617 l
+40.558 -1.382 40.518 -1.216 40.441 -1.118 c
+40.36 -1.022 40.242 -0.97 40.088 -0.97 c
+39.97 -0.97 39.86 -1.01 39.765 -1.088 c
+39.665 -1.168 39.588 -1.276 39.53 -1.411 c
+39.53 -3.572 l
+39.044 -3.572 l
+39.044 0.661 l
+39.53 0.661 l
+h
+41.616 -3.308 m
+41.616 -3.219 41.639 -3.146 41.69 -3.087 c
+41.749 -3.028 41.826 -2.999 41.925 -2.999 c
+42.032 -2.999 42.109 -3.028 42.16 -3.087 c
+42.219 -3.146 42.249 -3.219 42.249 -3.308 c
+42.249 -3.389 42.219 -3.454 42.16 -3.514 c
+42.109 -3.572 42.032 -3.601 41.925 -3.601 c
+41.826 -3.601 41.749 -3.572 41.69 -3.514 c
+41.639 -3.454 41.616 -3.389 41.616 -3.308 c
+f
+Q
+633.001 164.439 -0.501 4.013 re
+634.36 168.143 m
+634.36 167.423 l
+634.816 167.423 l
+634.816 167.026 l
+634.36 167.026 l
+634.36 165.174 l
+634.36 165.056 634.378 164.968 634.419 164.91 c
+634.455 164.85 634.526 164.821 634.625 164.821 c
+634.684 164.821 634.746 164.829 634.816 164.85 c
+634.816 164.439 l
+634.698 164.403 634.584 164.38 634.478 164.38 c
+634.279 164.38 634.129 164.447 634.023 164.586 c
+633.923 164.723 633.875 164.917 633.875 165.174 c
+633.875 167.026 l
+633.42 167.026 l
+633.42 167.423 l
+633.875 167.423 l
+633.875 168.143 l
+h
+637.017 164.439 -0.5 2.984 re
+637.046 168.217 m
+637.046 168.129 637.021 168.056 636.973 167.996 c
+636.932 167.945 636.863 167.923 636.767 167.923 c
+636.679 167.923 636.61 167.945 636.562 167.996 c
+636.521 168.056 636.502 168.121 636.502 168.202 c
+636.502 168.291 636.521 168.364 636.562 168.422 c
+636.61 168.482 636.679 168.511 636.767 168.511 c
+636.863 168.511 636.932 168.482 636.973 168.422 c
+637.021 168.364 637.046 168.295 637.046 168.217 c
+639.13 165.203 m
+639.13 165.311 639.089 165.399 639.012 165.469 c
+638.931 165.546 638.781 165.634 638.557 165.733 c
+638.293 165.839 638.104 165.931 637.998 166.012 c
+637.888 166.089 637.811 166.178 637.763 166.277 c
+637.711 166.373 637.69 166.49 637.69 166.629 c
+637.69 166.872 637.778 167.074 637.954 167.232 c
+638.131 167.398 638.355 167.482 638.63 167.482 c
+638.924 167.482 639.159 167.394 639.336 167.217 c
+639.512 167.048 639.6 166.835 639.6 166.571 c
+639.116 166.571 l
+639.116 166.707 639.064 166.82 638.968 166.909 c
+638.881 167.005 638.767 167.056 638.63 167.056 c
+638.484 167.056 638.37 167.015 638.293 166.938 c
+638.212 166.868 638.175 166.77 638.175 166.644 c
+638.175 166.545 638.204 166.468 638.262 166.409 c
+638.322 166.35 638.461 166.269 638.689 166.174 c
+639.049 166.026 639.295 165.883 639.424 165.748 c
+639.56 165.619 639.629 165.446 639.629 165.233 c
+639.629 164.976 639.534 164.771 639.351 164.615 c
+639.174 164.458 638.939 164.38 638.645 164.38 c
+638.329 164.38 638.075 164.469 637.88 164.645 c
+637.693 164.829 637.601 165.06 637.601 165.336 c
+638.087 165.336 l
+638.094 165.167 638.145 165.035 638.233 164.939 c
+638.329 164.85 638.468 164.807 638.645 164.807 c
+638.8 164.807 638.917 164.84 638.998 164.91 c
+639.086 164.976 639.13 165.075 639.13 165.203 c
+641.864 166.689 m
+642.187 166.689 l
+642.382 166.689 642.532 166.751 642.643 166.88 c
+642.75 167.005 642.804 167.173 642.804 167.379 c
+642.804 167.85 642.621 168.085 642.261 168.085 c
+642.085 168.085 641.944 168.019 641.849 167.894 c
+641.75 167.765 641.703 167.599 641.703 167.394 c
+641.217 167.394 l
+641.217 167.717 641.313 167.982 641.511 168.187 c
+641.706 168.401 641.956 168.511 642.261 168.511 c
+642.573 168.511 642.823 168.408 643.01 168.202 c
+643.195 168.004 643.29 167.732 643.29 167.379 c
+643.29 167.192 643.238 167.015 643.143 166.85 c
+643.043 166.692 642.922 166.575 642.775 166.497 c
+643.147 166.358 643.334 166.045 643.334 165.556 c
+643.334 165.203 643.235 164.917 643.039 164.704 c
+642.842 164.487 642.584 164.38 642.261 164.38 c
+641.938 164.38 641.676 164.476 641.482 164.675 c
+641.283 164.881 641.188 165.152 641.188 165.498 c
+641.688 165.498 l
+641.688 165.281 641.736 165.108 641.834 164.983 c
+641.941 164.866 642.085 164.807 642.261 164.807 c
+642.437 164.807 642.577 164.866 642.687 164.983 c
+642.794 165.108 642.849 165.295 642.849 165.542 c
+642.849 166.03 642.617 166.277 642.158 166.277 c
+641.864 166.277 l
+h
+646.127 164.807 m
+646.293 164.807 646.424 164.854 646.524 164.954 c
+646.619 165.049 646.675 165.193 646.685 165.38 c
+647.141 165.38 l
+647.13 165.093 647.027 164.854 646.833 164.66 c
+646.644 164.472 646.409 164.38 646.127 164.38 c
+645.763 164.38 645.484 164.498 645.289 164.733 c
+645.09 164.968 644.995 165.314 644.995 165.777 c
+644.995 166.101 l
+644.995 166.549 645.087 166.894 645.274 167.129 c
+645.469 167.364 645.752 167.482 646.127 167.482 c
+646.428 167.482 646.671 167.383 646.847 167.188 c
+647.031 166.99 647.13 166.725 647.141 166.394 c
+646.685 166.394 l
+646.663 166.618 646.605 166.784 646.509 166.894 c
+646.421 167.001 646.293 167.056 646.127 167.056 c
+645.91 167.056 645.748 166.982 645.642 166.835 c
+645.543 166.695 645.487 166.468 645.48 166.144 c
+645.48 165.762 l
+645.48 165.409 645.528 165.16 645.627 165.012 c
+645.734 164.873 645.899 164.807 646.127 164.807 c
+647.435 166.071 m
+647.435 166.501 647.538 166.843 647.743 167.1 c
+647.957 167.354 648.236 167.482 648.581 167.482 c
+648.923 167.482 649.199 167.354 649.405 167.1 c
+649.618 166.853 649.732 166.519 649.742 166.101 c
+649.742 165.791 l
+649.742 165.358 649.632 165.016 649.42 164.763 c
+649.214 164.505 648.934 164.38 648.581 164.38 c
+648.236 164.38 647.964 164.501 647.758 164.748 c
+647.552 164.991 647.442 165.325 647.435 165.748 c
+h
+647.92 165.791 m
+647.92 165.476 647.978 165.233 648.096 165.056 c
+648.221 164.888 648.383 164.807 648.581 164.807 c
+649.011 164.807 649.235 165.116 649.258 165.733 c
+649.258 166.071 l
+649.258 166.373 649.192 166.614 649.067 166.791 c
+648.949 166.967 648.787 167.056 648.581 167.056 c
+648.383 167.056 648.221 166.967 648.096 166.791 c
+647.978 166.614 647.92 166.373 647.92 166.071 c
+h
+650.64 167.423 m
+650.654 167.144 l
+650.831 167.368 651.07 167.482 651.375 167.482 c
+651.705 167.482 651.937 167.335 652.065 167.041 c
+652.249 167.335 652.51 167.482 652.844 167.482 c
+653.403 167.482 653.686 167.136 653.697 166.453 c
+653.697 164.439 l
+653.212 164.439 l
+653.212 166.409 l
+653.212 166.622 653.171 166.78 653.094 166.88 c
+653.013 166.986 652.881 167.041 652.697 167.041 c
+652.55 167.041 652.433 166.982 652.344 166.865 c
+652.256 166.755 652.201 166.614 652.183 166.438 c
+652.183 164.439 l
+651.698 164.439 l
+651.698 166.423 l
+651.687 166.835 651.514 167.041 651.184 167.041 c
+650.937 167.041 650.764 166.916 650.669 166.674 c
+650.669 164.439 l
+650.183 164.439 l
+650.183 167.423 l
+h
+654.601 167.423 m
+654.615 167.144 l
+654.792 167.368 655.031 167.482 655.336 167.482 c
+655.666 167.482 655.898 167.335 656.026 167.041 c
+656.21 167.335 656.471 167.482 656.805 167.482 c
+657.364 167.482 657.647 167.136 657.659 166.453 c
+657.659 164.439 l
+657.173 164.439 l
+657.173 166.409 l
+657.173 166.622 657.133 166.78 657.056 166.88 c
+656.975 166.986 656.842 167.041 656.659 167.041 c
+656.512 167.041 656.394 166.982 656.306 166.865 c
+656.217 166.755 656.163 166.614 656.144 166.438 c
+656.144 164.439 l
+655.66 164.439 l
+655.66 166.423 l
+655.648 166.835 655.475 167.041 655.145 167.041 c
+654.898 167.041 654.725 166.916 654.63 166.674 c
+654.63 164.439 l
+654.145 164.439 l
+654.145 167.423 l
+h
+658.636 164.439 -0.5 2.984 re
+658.665 168.217 m
+658.665 168.129 658.639 168.056 658.592 167.996 c
+658.551 167.945 658.482 167.923 658.386 167.923 c
+658.297 167.923 658.228 167.945 658.18 167.996 c
+658.139 168.056 658.121 168.121 658.121 168.202 c
+658.121 168.291 658.139 168.364 658.18 168.422 c
+658.228 168.482 658.297 168.511 658.386 168.511 c
+658.482 168.511 658.551 168.482 658.592 168.422 c
+658.639 168.364 658.665 168.295 658.665 168.217 c
+659.94 168.143 m
+659.94 167.423 l
+660.396 167.423 l
+660.396 167.026 l
+659.94 167.026 l
+659.94 165.174 l
+659.94 165.056 659.959 164.968 659.999 164.91 c
+660.036 164.85 660.105 164.821 660.205 164.821 c
+660.263 164.821 660.326 164.829 660.396 164.85 c
+660.396 164.439 l
+660.279 164.403 660.165 164.38 660.057 164.38 c
+659.859 164.38 659.708 164.447 659.602 164.586 c
+659.502 164.723 659.455 164.917 659.455 165.174 c
+659.455 167.026 l
+658.999 167.026 l
+658.999 167.423 l
+659.455 167.423 l
+659.455 168.143 l
+h
+662.303 165.203 m
+662.303 165.311 662.263 165.399 662.185 165.469 c
+662.104 165.546 661.954 165.634 661.73 165.733 c
+661.465 165.839 661.278 165.931 661.171 166.012 c
+661.061 166.089 660.984 166.178 660.936 166.277 c
+660.884 166.373 660.863 166.49 660.863 166.629 c
+660.863 166.872 660.951 167.074 661.127 167.232 c
+661.304 167.398 661.528 167.482 661.804 167.482 c
+662.097 167.482 662.332 167.394 662.509 167.217 c
+662.685 167.048 662.773 166.835 662.773 166.571 c
+662.288 166.571 l
+662.288 166.707 662.237 166.82 662.141 166.909 c
+662.053 167.005 661.939 167.056 661.804 167.056 c
+661.657 167.056 661.542 167.015 661.465 166.938 c
+661.384 166.868 661.347 166.77 661.347 166.644 c
+661.347 166.545 661.377 166.468 661.436 166.409 c
+661.495 166.35 661.634 166.269 661.862 166.174 c
+662.222 166.026 662.469 165.883 662.598 165.748 c
+662.733 165.619 662.803 165.446 662.803 165.233 c
+662.803 164.976 662.708 164.771 662.523 164.615 c
+662.347 164.458 662.112 164.38 661.818 164.38 c
+661.502 164.38 661.248 164.469 661.054 164.645 c
+660.867 164.829 660.774 165.06 660.774 165.336 c
+661.26 165.336 l
+661.266 165.167 661.318 165.035 661.407 164.939 c
+661.502 164.85 661.642 164.807 661.818 164.807 c
+661.972 164.807 662.089 164.84 662.17 164.91 c
+662.259 164.976 662.303 165.075 662.303 165.203 c
+665.993 164.439 m
+665.964 164.505 665.941 164.615 665.933 164.763 c
+665.757 164.505 665.537 164.38 665.272 164.38 c
+664.996 164.38 664.78 164.454 664.626 164.601 c
+664.479 164.755 664.405 164.972 664.405 165.247 c
+664.405 165.549 664.508 165.791 664.714 165.968 c
+664.919 166.152 665.202 166.247 665.566 166.247 c
+665.919 166.247 l
+665.919 166.571 l
+665.919 166.747 665.879 166.868 665.802 166.938 c
+665.721 167.015 665.603 167.056 665.449 167.056 c
+665.302 167.056 665.177 167.011 665.081 166.924 c
+664.993 166.835 664.949 166.725 664.949 166.6 c
+664.464 166.6 l
+664.464 166.747 664.508 166.887 664.597 167.026 c
+664.684 167.173 664.802 167.283 664.949 167.364 c
+665.104 167.441 665.276 167.482 665.463 167.482 c
+665.775 167.482 666.01 167.401 666.169 167.247 c
+666.323 167.1 666.404 166.88 666.404 166.585 c
+666.404 165.086 l
+666.411 164.85 666.448 164.649 666.507 164.484 c
+666.507 164.439 l
+h
+665.345 164.821 m
+665.463 164.821 665.574 164.854 665.684 164.925 c
+665.79 164.991 665.867 165.075 665.919 165.174 c
+665.919 165.88 l
+665.655 165.88 l
+665.42 165.88 665.232 165.829 665.096 165.733 c
+664.967 165.634 664.905 165.49 664.905 165.307 c
+664.905 165.137 664.934 165.016 664.993 164.939 c
+665.059 164.858 665.177 164.821 665.345 164.821 c
+667.47 167.115 m
+667.654 167.358 667.889 167.482 668.175 167.482 c
+668.705 167.482 668.973 167.129 668.984 166.423 c
+668.984 164.439 l
+668.499 164.439 l
+668.499 166.394 l
+668.499 166.629 668.458 166.795 668.381 166.894 c
+668.3 166.99 668.183 167.041 668.028 167.041 c
+667.911 167.041 667.801 167.001 667.705 166.924 c
+667.606 166.843 667.529 166.736 667.47 166.6 c
+667.47 164.439 l
+666.985 164.439 l
+666.985 168.673 l
+667.47 168.673 l
+h
+670.586 164.38 m
+670.211 164.38 669.928 164.487 669.733 164.704 c
+669.535 164.929 669.44 165.255 669.44 165.689 c
+669.44 166.057 l
+669.44 166.497 669.532 166.843 669.719 167.1 c
+669.914 167.354 670.189 167.482 670.542 167.482 c
+670.884 167.482 671.138 167.368 671.306 167.144 c
+671.483 166.916 671.574 166.571 671.585 166.101 c
+671.585 165.791 l
+669.925 165.791 l
+669.925 165.718 l
+669.925 165.395 669.983 165.16 670.101 165.012 c
+670.218 164.873 670.388 164.807 670.615 164.807 c
+670.762 164.807 670.887 164.829 670.997 164.881 c
+671.104 164.939 671.207 165.027 671.306 165.145 c
+671.556 164.836 l
+671.35 164.532 671.026 164.38 670.586 164.38 c
+670.542 167.056 m
+670.336 167.056 670.182 166.986 670.086 166.85 c
+669.987 166.71 669.931 166.497 669.925 166.203 c
+671.101 166.203 l
+671.101 166.277 l
+671.078 166.549 671.026 166.747 670.939 166.865 c
+670.851 166.99 670.718 167.056 670.542 167.056 c
+673.526 164.439 m
+673.496 164.505 673.474 164.615 673.467 164.763 c
+673.291 164.505 673.07 164.38 672.805 164.38 c
+672.53 164.38 672.313 164.454 672.159 164.601 c
+672.011 164.755 671.938 164.972 671.938 165.247 c
+671.938 165.549 672.042 165.791 672.247 165.968 c
+672.453 166.152 672.736 166.247 673.1 166.247 c
+673.453 166.247 l
+673.453 166.571 l
+673.453 166.747 673.412 166.868 673.335 166.938 c
+673.254 167.015 673.137 167.056 672.982 167.056 c
+672.835 167.056 672.71 167.011 672.615 166.924 c
+672.526 166.835 672.482 166.725 672.482 166.6 c
+671.997 166.6 l
+671.997 166.747 672.042 166.887 672.129 167.026 c
+672.217 167.173 672.335 167.283 672.482 167.364 c
+672.636 167.441 672.809 167.482 672.996 167.482 c
+673.309 167.482 673.544 167.401 673.702 167.247 c
+673.856 167.1 673.937 166.88 673.937 166.585 c
+673.937 165.086 l
+673.945 164.85 673.981 164.649 674.041 164.484 c
+674.041 164.439 l
+h
+672.879 164.821 m
+672.996 164.821 673.106 164.854 673.218 164.925 c
+673.324 164.991 673.401 165.075 673.453 165.174 c
+673.453 165.88 l
+673.187 165.88 l
+672.952 165.88 672.765 165.829 672.63 165.733 c
+672.501 165.634 672.438 165.49 672.438 165.307 c
+672.438 165.137 672.468 165.016 672.526 164.939 c
+672.593 164.858 672.71 164.821 672.879 164.821 c
+674.415 166.071 m
+674.415 166.531 674.496 166.88 674.665 167.115 c
+674.841 167.358 675.091 167.482 675.415 167.482 c
+675.697 167.482 675.918 167.364 676.076 167.129 c
+676.076 168.673 l
+676.561 168.673 l
+676.561 164.439 l
+676.121 164.439 l
+676.091 164.763 l
+675.932 164.505 675.709 164.38 675.415 164.38 c
+675.099 164.38 674.856 164.498 674.679 164.733 c
+674.504 164.976 674.415 165.321 674.415 165.762 c
+h
+674.901 165.791 m
+674.901 165.457 674.948 165.211 675.047 165.056 c
+675.142 164.898 675.304 164.821 675.533 164.821 c
+675.774 164.821 675.959 164.939 676.076 165.174 c
+676.076 166.689 l
+675.948 166.924 675.768 167.041 675.533 167.041 c
+675.304 167.041 675.142 166.961 675.047 166.806 c
+674.948 166.648 674.901 166.409 674.901 166.086 c
+h
+677.131 163.645 m
+676.837 163.836 l
+677.013 164.083 677.105 164.333 677.116 164.586 c
+677.116 165.042 l
+677.615 165.042 l
+677.615 164.645 l
+677.615 164.458 677.565 164.274 677.469 164.087 c
+677.38 163.903 677.266 163.755 677.131 163.645 c
+f
+q 1 0 0 1 633.2211 158.6623 cm
+0 0 m
+0.544 2.176 l
+1.058 2.176 l
+0.088 -1.234 l
+0.018 -1.488 -0.085 -1.679 -0.22 -1.808 c
+-0.36 -1.944 -0.511 -2.013 -0.676 -2.013 c
+-0.746 -2.013 -0.831 -1.999 -0.926 -1.969 c
+-0.926 -1.558 l
+-0.823 -1.573 l
+-0.688 -1.573 -0.58 -1.535 -0.5 -1.469 c
+-0.412 -1.4 -0.345 -1.282 -0.294 -1.117 c
+-0.206 -0.779 l
+-1.073 2.176 l
+-0.544 2.176 l
+h
+1.238 0.823 m
+1.238 1.253 1.341 1.595 1.547 1.852 c
+1.76 2.106 2.039 2.234 2.385 2.234 c
+2.726 2.234 3.002 2.106 3.208 1.852 c
+3.421 1.606 3.535 1.272 3.546 0.853 c
+3.546 0.544 l
+3.546 0.111 3.436 -0.231 3.223 -0.484 c
+3.017 -0.742 2.737 -0.867 2.385 -0.867 c
+2.039 -0.867 1.768 -0.746 1.562 -0.5 c
+1.356 -0.257 1.245 0.077 1.238 0.5 c
+h
+1.723 0.544 m
+1.723 0.229 1.783 -0.014 1.899 -0.191 c
+2.024 -0.359 2.186 -0.44 2.385 -0.44 c
+2.815 -0.44 3.039 -0.132 3.061 0.485 c
+3.061 0.823 l
+3.061 1.125 2.995 1.367 2.87 1.544 c
+2.753 1.72 2.591 1.808 2.385 1.808 c
+2.186 1.808 2.024 1.72 1.899 1.544 c
+1.783 1.367 1.723 1.125 1.723 0.823 c
+h
+5.501 -0.544 m
+5.343 -0.76 5.108 -0.867 4.796 -0.867 c
+4.531 -0.867 4.325 -0.775 4.178 -0.588 c
+4.039 -0.404 3.973 -0.128 3.973 0.235 c
+3.973 2.176 l
+4.457 2.176 l
+4.457 0.265 l
+4.457 -0.199 4.597 -0.426 4.883 -0.426 c
+5.178 -0.426 5.376 -0.294 5.486 -0.029 c
+5.486 2.176 l
+5.986 2.176 l
+5.986 -0.808 l
+5.516 -0.808 l
+h
+9.183 -0.044 m
+9.183 0.063 9.143 0.151 9.066 0.221 c
+8.985 0.298 8.834 0.387 8.61 0.485 c
+8.345 0.592 8.158 0.684 8.052 0.765 c
+7.941 0.842 7.864 0.93 7.817 1.029 c
+7.765 1.125 7.742 1.243 7.742 1.382 c
+7.742 1.625 7.831 1.827 8.008 1.985 c
+8.183 2.151 8.407 2.234 8.683 2.234 c
+8.977 2.234 9.213 2.147 9.389 1.97 c
+9.565 1.801 9.654 1.588 9.654 1.324 c
+9.168 1.324 l
+9.168 1.459 9.117 1.573 9.022 1.661 c
+8.933 1.757 8.819 1.808 8.683 1.808 c
+8.536 1.808 8.422 1.768 8.345 1.691 c
+8.264 1.621 8.228 1.522 8.228 1.397 c
+8.228 1.297 8.257 1.22 8.316 1.162 c
+8.374 1.103 8.515 1.022 8.742 0.927 c
+9.103 0.779 9.348 0.636 9.477 0.5 c
+9.613 0.372 9.683 0.198 9.683 -0.014 c
+9.683 -0.272 9.587 -0.477 9.404 -0.632 c
+9.228 -0.789 8.992 -0.867 8.698 -0.867 c
+8.382 -0.867 8.129 -0.779 7.934 -0.602 c
+7.746 -0.419 7.655 -0.187 7.655 0.088 c
+8.139 0.088 l
+8.147 -0.081 8.198 -0.213 8.287 -0.309 c
+8.382 -0.397 8.522 -0.44 8.698 -0.44 c
+8.852 -0.44 8.97 -0.407 9.051 -0.338 c
+9.139 -0.272 9.183 -0.172 9.183 -0.044 c
+11.197 -0.867 m
+10.822 -0.867 10.539 -0.76 10.344 -0.544 c
+10.146 -0.319 10.051 0.008 10.051 0.441 c
+10.051 0.809 l
+10.051 1.249 10.142 1.595 10.329 1.852 c
+10.524 2.106 10.8 2.234 11.152 2.234 c
+11.495 2.234 11.748 2.12 11.917 1.897 c
+12.093 1.669 12.185 1.324 12.197 0.853 c
+12.197 0.544 l
+10.535 0.544 l
+10.535 0.47 l
+10.535 0.148 10.595 -0.087 10.712 -0.235 c
+10.83 -0.374 10.998 -0.44 11.227 -0.44 c
+11.373 -0.44 11.499 -0.419 11.609 -0.367 c
+11.715 -0.309 11.818 -0.22 11.917 -0.103 c
+12.167 -0.411 l
+11.961 -0.716 11.638 -0.867 11.197 -0.867 c
+11.152 1.808 m
+10.947 1.808 10.793 1.738 10.697 1.602 c
+10.598 1.463 10.543 1.249 10.535 0.956 c
+11.711 0.956 l
+11.711 1.029 l
+11.69 1.301 11.638 1.5 11.549 1.617 c
+11.462 1.742 11.329 1.808 11.152 1.808 c
+13.666 -0.867 m
+13.292 -0.867 13.008 -0.76 12.814 -0.544 c
+12.615 -0.319 12.52 0.008 12.52 0.441 c
+12.52 0.809 l
+12.52 1.249 12.612 1.595 12.799 1.852 c
+12.993 2.106 13.269 2.234 13.622 2.234 c
+13.964 2.234 14.217 2.12 14.387 1.897 c
+14.563 1.669 14.655 1.324 14.666 0.853 c
+14.666 0.544 l
+13.005 0.544 l
+13.005 0.47 l
+13.005 0.148 13.064 -0.087 13.182 -0.235 c
+13.299 -0.374 13.468 -0.44 13.696 -0.44 c
+13.843 -0.44 13.968 -0.419 14.078 -0.367 c
+14.184 -0.309 14.287 -0.22 14.387 -0.103 c
+14.637 -0.411 l
+14.431 -0.716 14.107 -0.867 13.666 -0.867 c
+13.622 1.808 m
+13.417 1.808 13.263 1.738 13.167 1.602 c
+13.068 1.463 13.012 1.249 13.005 0.956 c
+14.181 0.956 l
+14.181 1.029 l
+14.159 1.301 14.107 1.5 14.019 1.617 c
+13.931 1.742 13.799 1.808 13.622 1.808 c
+16.812 -0.808 -0.5 2.984 re
+16.841 2.97 m
+16.841 2.881 16.816 2.808 16.768 2.749 c
+16.727 2.698 16.658 2.675 16.562 2.675 c
+16.474 2.675 16.404 2.698 16.357 2.749 c
+16.316 2.808 16.297 2.874 16.297 2.955 c
+16.297 3.043 16.316 3.117 16.357 3.175 c
+16.404 3.234 16.474 3.263 16.562 3.263 c
+16.658 3.263 16.727 3.234 16.768 3.175 c
+16.816 3.117 16.841 3.047 16.841 2.97 c
+18.117 2.896 m
+18.117 2.176 l
+18.572 2.176 l
+18.572 1.779 l
+18.117 1.779 l
+18.117 -0.073 l
+18.117 -0.191 18.135 -0.279 18.175 -0.338 c
+18.212 -0.397 18.282 -0.426 18.381 -0.426 c
+18.44 -0.426 18.502 -0.419 18.572 -0.397 c
+18.572 -0.808 l
+18.454 -0.845 18.341 -0.867 18.234 -0.867 c
+18.036 -0.867 17.885 -0.801 17.778 -0.661 c
+17.679 -0.525 17.631 -0.33 17.631 -0.073 c
+17.631 1.779 l
+17.176 1.779 l
+17.176 2.176 l
+17.631 2.176 l
+17.631 2.896 l
+h
+19.039 -1.602 m
+18.745 -1.411 l
+18.921 -1.165 19.013 -0.914 19.025 -0.661 c
+19.025 -0.205 l
+19.524 -0.205 l
+19.524 -0.602 l
+19.524 -0.789 19.472 -0.974 19.377 -1.161 c
+19.289 -1.344 19.175 -1.492 19.039 -1.602 c
+22.518 1.72 m
+22.449 1.727 22.375 1.735 22.298 1.735 c
+22.042 1.735 21.865 1.595 21.77 1.324 c
+21.77 -0.808 l
+21.284 -0.808 l
+21.284 2.176 l
+21.755 2.176 l
+21.77 1.867 l
+21.894 2.11 22.078 2.234 22.313 2.234 c
+22.391 2.234 22.453 2.22 22.504 2.19 c
+h
+23.416 -0.808 -0.5 2.984 re
+23.445 2.97 m
+23.445 2.881 23.42 2.808 23.372 2.749 c
+23.331 2.698 23.262 2.675 23.166 2.675 c
+23.077 2.675 23.008 2.698 22.96 2.749 c
+22.919 2.808 22.901 2.874 22.901 2.955 c
+22.901 3.043 22.919 3.117 22.96 3.175 c
+23.008 3.234 23.077 3.263 23.166 3.263 c
+23.262 3.263 23.331 3.234 23.372 3.175 c
+23.42 3.117 23.445 3.047 23.445 2.97 c
+23.989 0.823 m
+23.989 1.283 24.07 1.632 24.239 1.867 c
+24.415 2.11 24.665 2.234 24.988 2.234 c
+25.29 2.234 25.521 2.103 25.679 1.837 c
+25.708 2.176 l
+26.15 2.176 l
+26.15 -0.837 l
+26.15 -1.209 26.05 -1.492 25.855 -1.691 c
+25.668 -1.885 25.407 -1.984 25.076 -1.984 c
+24.93 -1.984 24.76 -1.944 24.577 -1.866 c
+24.39 -1.797 24.253 -1.708 24.165 -1.602 c
+24.357 -1.263 l
+24.562 -1.469 24.787 -1.573 25.032 -1.573 c
+25.433 -1.573 25.639 -1.344 25.65 -0.897 c
+25.65 -0.515 l
+25.492 -0.75 25.271 -0.867 24.988 -0.867 c
+24.673 -0.867 24.43 -0.75 24.253 -0.515 c
+24.085 -0.279 23.996 0.052 23.989 0.485 c
+h
+24.474 0.544 m
+24.474 0.21 24.521 -0.037 24.621 -0.191 c
+24.716 -0.349 24.878 -0.426 25.105 -0.426 c
+25.348 -0.426 25.533 -0.305 25.65 -0.058 c
+25.65 1.426 l
+25.533 1.669 25.356 1.794 25.12 1.794 c
+24.893 1.794 24.731 1.713 24.635 1.559 c
+24.536 1.401 24.481 1.162 24.474 0.838 c
+h
+27.171 1.867 m
+27.355 2.11 27.59 2.234 27.877 2.234 c
+28.406 2.234 28.674 1.881 28.685 1.176 c
+28.685 -0.808 l
+28.201 -0.808 l
+28.201 1.147 l
+28.201 1.382 28.16 1.548 28.083 1.646 c
+28.002 1.742 27.884 1.794 27.73 1.794 c
+27.613 1.794 27.502 1.754 27.407 1.676 c
+27.307 1.595 27.23 1.488 27.171 1.353 c
+27.171 -0.808 l
+26.686 -0.808 l
+26.686 3.425 l
+27.171 3.425 l
+h
+29.857 2.896 m
+29.857 2.176 l
+30.313 2.176 l
+30.313 1.779 l
+29.857 1.779 l
+29.857 -0.073 l
+29.857 -0.191 29.876 -0.279 29.916 -0.338 c
+29.953 -0.397 30.023 -0.426 30.122 -0.426 c
+30.181 -0.426 30.243 -0.419 30.313 -0.397 c
+30.313 -0.808 l
+30.196 -0.845 30.082 -0.867 29.975 -0.867 c
+29.776 -0.867 29.626 -0.801 29.519 -0.661 c
+29.42 -0.525 29.373 -0.33 29.373 -0.073 c
+29.373 1.779 l
+28.916 1.779 l
+28.916 2.176 l
+29.373 2.176 l
+29.373 2.896 l
+h
+31.28 0.324 m
+31.28 0.537 31.297 0.713 31.338 0.853 c
+31.386 1 31.5 1.176 31.677 1.382 c
+31.883 1.632 l
+32.007 1.816 32.074 2.003 32.074 2.19 c
+32.074 2.386 32.029 2.536 31.941 2.646 c
+31.86 2.753 31.75 2.808 31.603 2.808 c
+31.463 2.808 31.345 2.756 31.25 2.66 c
+31.162 2.562 31.118 2.429 31.118 2.264 c
+30.632 2.264 l
+30.632 2.565 30.721 2.808 30.898 2.984 c
+31.081 3.168 31.316 3.263 31.603 3.263 c
+31.897 3.263 32.124 3.168 32.294 2.984 c
+32.471 2.797 32.558 2.543 32.558 2.22 c
+32.558 1.904 32.43 1.592 32.176 1.279 c
+31.926 0.971 l
+31.816 0.823 31.765 0.607 31.765 0.324 c
+h
+31.544 -0.264 m
+31.632 -0.264 31.698 -0.294 31.75 -0.353 c
+31.798 -0.404 31.823 -0.47 31.823 -0.558 c
+31.823 -0.639 31.798 -0.706 31.75 -0.764 c
+31.698 -0.812 31.632 -0.837 31.544 -0.837 c
+31.445 -0.837 31.372 -0.812 31.324 -0.764 c
+31.283 -0.706 31.264 -0.639 31.264 -0.558 c
+31.264 -0.47 31.283 -0.404 31.324 -0.353 c
+31.372 -0.294 31.445 -0.264 31.544 -0.264 c
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 678.972 167.5189 cm
+0 0 m
+7.555 -2.874 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 684.5352 165.4025 cm
+0 0 m
+-1.377 -0.618 l
+2.492 -0.949 l
+-0.618 1.377 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 684.5352 165.4025 cm
+0 0 m
+-1.377 -0.618 l
+2.492 -0.949 l
+-0.618 1.377 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 501.1054 110.5303 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.441 l
+0 0.441 l
+h
+0.823 -0.897 m
+1.008 -0.654 1.243 -0.529 1.529 -0.529 c
+2.058 -0.529 2.326 -0.881 2.338 -1.587 c
+2.338 -3.572 l
+1.852 -3.572 l
+1.852 -1.616 l
+1.852 -1.381 1.812 -1.216 1.735 -1.117 c
+1.654 -1.022 1.536 -0.97 1.382 -0.97 c
+1.264 -0.97 1.154 -1.01 1.058 -1.087 c
+0.96 -1.168 0.882 -1.275 0.823 -1.411 c
+0.823 -3.572 l
+0.339 -3.572 l
+0.339 0.661 l
+0.823 0.661 l
+h
+3.407 -3.572 -0.5 2.984 re
+3.437 0.206 m
+3.437 0.118 3.41 0.044 3.363 -0.014 c
+3.323 -0.066 3.252 -0.087 3.157 -0.087 c
+3.069 -0.087 2.999 -0.066 2.951 -0.014 c
+2.911 0.044 2.893 0.11 2.893 0.191 c
+2.893 0.279 2.911 0.353 2.951 0.412 c
+2.999 0.47 3.069 0.5 3.157 0.5 c
+3.252 0.5 3.323 0.47 3.363 0.412 c
+3.41 0.353 3.437 0.283 3.437 0.206 c
+5.524 -2.807 m
+5.524 -2.701 5.484 -2.612 5.406 -2.543 c
+5.326 -2.466 5.174 -2.377 4.95 -2.278 c
+4.686 -2.171 4.499 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.734 c
+4.105 -1.639 4.083 -1.521 4.083 -1.381 c
+4.083 -1.139 4.171 -0.937 4.348 -0.779 c
+4.524 -0.613 4.748 -0.529 5.024 -0.529 c
+5.318 -0.529 5.553 -0.617 5.729 -0.793 c
+5.906 -0.962 5.994 -1.176 5.994 -1.44 c
+5.509 -1.44 l
+5.509 -1.304 5.457 -1.19 5.362 -1.103 c
+5.274 -1.007 5.16 -0.955 5.024 -0.955 c
+4.877 -0.955 4.763 -0.995 4.686 -1.072 c
+4.605 -1.143 4.568 -1.242 4.568 -1.367 c
+4.568 -1.466 4.597 -1.543 4.657 -1.602 c
+4.715 -1.66 4.855 -1.741 5.083 -1.837 c
+5.443 -1.984 5.689 -2.127 5.818 -2.263 c
+5.954 -2.392 6.024 -2.564 6.024 -2.778 c
+6.024 -3.035 5.928 -3.241 5.744 -3.395 c
+5.567 -3.553 5.332 -3.63 5.039 -3.63 c
+4.723 -3.63 4.469 -3.542 4.274 -3.366 c
+4.087 -3.183 3.995 -2.95 3.995 -2.675 c
+4.48 -2.675 l
+4.487 -2.844 4.539 -2.977 4.627 -3.072 c
+4.723 -3.16 4.862 -3.204 5.039 -3.204 c
+5.193 -3.204 5.311 -3.171 5.391 -3.102 c
+5.48 -3.035 5.524 -2.936 5.524 -2.807 c
+8.214 -3.572 -0.5 2.984 re
+8.243 0.206 m
+8.243 0.118 8.217 0.044 8.169 -0.014 c
+8.129 -0.066 8.059 -0.087 7.963 -0.087 c
+7.876 -0.087 7.805 -0.066 7.758 -0.014 c
+7.718 0.044 7.699 0.11 7.699 0.191 c
+7.699 0.279 7.718 0.353 7.758 0.412 c
+7.805 0.47 7.876 0.5 7.963 0.5 c
+8.059 0.5 8.129 0.47 8.169 0.412 c
+8.217 0.353 8.243 0.283 8.243 0.206 c
+10.33 -2.807 m
+10.33 -2.701 10.29 -2.612 10.213 -2.543 c
+10.132 -2.466 9.981 -2.377 9.757 -2.278 c
+9.492 -2.171 9.305 -2.08 9.199 -1.999 c
+9.089 -1.922 9.011 -1.834 8.963 -1.734 c
+8.912 -1.639 8.89 -1.521 8.89 -1.381 c
+8.89 -1.139 8.978 -0.937 9.154 -0.779 c
+9.33 -0.613 9.555 -0.529 9.831 -0.529 c
+10.124 -0.529 10.359 -0.617 10.536 -0.793 c
+10.712 -0.962 10.801 -1.176 10.801 -1.44 c
+10.315 -1.44 l
+10.315 -1.304 10.264 -1.19 10.168 -1.103 c
+10.08 -1.007 9.966 -0.955 9.831 -0.955 c
+9.683 -0.955 9.569 -0.995 9.492 -1.072 c
+9.411 -1.143 9.375 -1.242 9.375 -1.367 c
+9.375 -1.466 9.405 -1.543 9.463 -1.602 c
+9.522 -1.66 9.661 -1.741 9.889 -1.837 c
+10.249 -1.984 10.496 -2.127 10.624 -2.263 c
+10.76 -2.392 10.83 -2.564 10.83 -2.778 c
+10.83 -3.035 10.735 -3.241 10.55 -3.395 c
+10.375 -3.553 10.139 -3.63 9.845 -3.63 c
+9.529 -3.63 9.276 -3.542 9.081 -3.366 c
+8.894 -3.183 8.802 -2.95 8.802 -2.675 c
+9.287 -2.675 l
+9.294 -2.844 9.345 -2.977 9.434 -3.072 c
+9.529 -3.16 9.669 -3.204 9.845 -3.204 c
+9.999 -3.204 10.117 -3.171 10.198 -3.102 c
+10.286 -3.035 10.33 -2.936 10.33 -2.807 c
+14.02 -3.572 m
+13.991 -3.505 13.968 -3.395 13.961 -3.248 c
+13.785 -3.505 13.564 -3.63 13.299 -3.63 c
+13.024 -3.63 12.807 -3.557 12.653 -3.41 c
+12.505 -3.256 12.432 -3.039 12.432 -2.763 c
+12.432 -2.462 12.535 -2.219 12.74 -2.043 c
+12.947 -1.859 13.23 -1.764 13.594 -1.764 c
+13.947 -1.764 l
+13.947 -1.44 l
+13.947 -1.263 13.906 -1.143 13.829 -1.072 c
+13.748 -0.995 13.63 -0.955 13.476 -0.955 c
+13.328 -0.955 13.204 -0.999 13.108 -1.087 c
+13.02 -1.176 12.976 -1.286 12.976 -1.411 c
+12.491 -1.411 l
+12.491 -1.263 12.535 -1.124 12.623 -0.985 c
+12.711 -0.837 12.829 -0.727 12.976 -0.646 c
+13.13 -0.569 13.303 -0.529 13.49 -0.529 c
+13.803 -0.529 14.038 -0.61 14.196 -0.764 c
+14.35 -0.911 14.431 -1.132 14.431 -1.425 c
+14.431 -2.925 l
+14.439 -3.16 14.475 -3.362 14.534 -3.528 c
+14.534 -3.572 l
+h
+13.373 -3.189 m
+13.49 -3.189 13.6 -3.156 13.711 -3.087 c
+13.818 -3.021 13.895 -2.936 13.947 -2.836 c
+13.947 -2.131 l
+13.681 -2.131 l
+13.446 -2.131 13.259 -2.183 13.123 -2.278 c
+12.994 -2.377 12.932 -2.52 12.932 -2.705 c
+12.932 -2.873 12.962 -2.994 13.02 -3.072 c
+13.087 -3.152 13.204 -3.189 13.373 -3.189 c
+16.669 -0.588 m
+16.684 -0.911 l
+16.867 -0.658 17.11 -0.529 17.404 -0.529 c
+17.933 -0.529 18.201 -0.881 18.213 -1.587 c
+18.213 -3.572 l
+17.727 -3.572 l
+17.727 -1.616 l
+17.727 -1.381 17.687 -1.216 17.61 -1.117 c
+17.529 -1.022 17.411 -0.97 17.257 -0.97 c
+17.139 -0.97 17.029 -1.01 16.933 -1.087 c
+16.835 -1.168 16.757 -1.275 16.698 -1.411 c
+16.698 -3.572 l
+16.214 -3.572 l
+16.214 -0.588 l
+h
+18.664 -1.94 m
+18.664 -1.51 18.768 -1.168 18.973 -0.911 c
+19.186 -0.658 19.466 -0.529 19.811 -0.529 c
+20.153 -0.529 20.428 -0.658 20.634 -0.911 c
+20.848 -1.157 20.962 -1.492 20.972 -1.911 c
+20.972 -2.219 l
+20.972 -2.653 20.862 -2.994 20.649 -3.248 c
+20.443 -3.505 20.164 -3.63 19.811 -3.63 c
+19.466 -3.63 19.194 -3.509 18.988 -3.262 c
+18.782 -3.021 18.672 -2.686 18.664 -2.263 c
+h
+19.15 -2.219 m
+19.15 -2.535 19.208 -2.778 19.326 -2.954 c
+19.451 -3.123 19.613 -3.204 19.811 -3.204 c
+20.241 -3.204 20.465 -2.896 20.487 -2.278 c
+20.487 -1.94 l
+20.487 -1.639 20.421 -1.396 20.296 -1.22 c
+20.179 -1.043 20.017 -0.955 19.811 -0.955 c
+19.613 -0.955 19.451 -1.043 19.326 -1.22 c
+19.208 -1.396 19.15 -1.639 19.15 -1.94 c
+h
+22.645 -1.043 m
+22.575 -1.036 22.501 -1.028 22.423 -1.028 c
+22.167 -1.028 21.99 -1.168 21.895 -1.44 c
+21.895 -3.572 l
+21.409 -3.572 l
+21.409 -0.588 l
+21.88 -0.588 l
+21.895 -0.897 l
+22.02 -0.654 22.203 -0.529 22.439 -0.529 c
+22.516 -0.529 22.578 -0.544 22.629 -0.573 c
+h
+23.471 -0.588 m
+23.486 -0.867 l
+23.662 -0.643 23.901 -0.529 24.206 -0.529 c
+24.537 -0.529 24.769 -0.675 24.897 -0.97 c
+25.081 -0.675 25.342 -0.529 25.676 -0.529 c
+26.234 -0.529 26.518 -0.874 26.529 -1.558 c
+26.529 -3.572 l
+26.043 -3.572 l
+26.043 -1.602 l
+26.043 -1.389 26.003 -1.23 25.926 -1.132 c
+25.845 -1.025 25.713 -0.97 25.529 -0.97 c
+25.382 -0.97 25.264 -1.028 25.176 -1.146 c
+25.088 -1.257 25.033 -1.396 25.014 -1.573 c
+25.014 -3.572 l
+24.53 -3.572 l
+24.53 -1.587 l
+24.519 -1.176 24.345 -0.97 24.015 -0.97 c
+23.769 -0.97 23.597 -1.095 23.501 -1.338 c
+23.501 -3.572 l
+23.015 -3.572 l
+23.015 -0.588 l
+h
+28.505 -3.572 m
+28.476 -3.505 28.455 -3.395 28.447 -3.248 c
+28.27 -3.505 28.05 -3.63 27.786 -3.63 c
+27.51 -3.63 27.293 -3.557 27.138 -3.41 c
+26.992 -3.256 26.918 -3.039 26.918 -2.763 c
+26.918 -2.462 27.021 -2.219 27.227 -2.043 c
+27.433 -1.859 27.715 -1.764 28.079 -1.764 c
+28.432 -1.764 l
+28.432 -1.44 l
+28.432 -1.263 28.392 -1.143 28.314 -1.072 c
+28.233 -0.995 28.116 -0.955 27.962 -0.955 c
+27.815 -0.955 27.69 -0.999 27.595 -1.087 c
+27.506 -1.176 27.462 -1.286 27.462 -1.411 c
+26.977 -1.411 l
+26.977 -1.263 27.021 -1.124 27.109 -0.985 c
+27.198 -0.837 27.315 -0.727 27.462 -0.646 c
+27.616 -0.569 27.789 -0.529 27.977 -0.529 c
+28.289 -0.529 28.524 -0.61 28.682 -0.764 c
+28.837 -0.911 28.917 -1.132 28.917 -1.425 c
+28.917 -2.925 l
+28.925 -3.16 28.962 -3.362 29.02 -3.528 c
+29.02 -3.572 l
+h
+27.859 -3.189 m
+27.977 -3.189 28.087 -3.156 28.197 -3.087 c
+28.303 -3.021 28.38 -2.936 28.432 -2.836 c
+28.432 -2.131 l
+28.168 -2.131 l
+27.932 -2.131 27.745 -2.183 27.609 -2.278 c
+27.48 -2.377 27.418 -2.52 27.418 -2.705 c
+27.418 -2.873 27.447 -2.994 27.506 -3.072 c
+27.572 -3.152 27.69 -3.189 27.859 -3.189 c
+30.027 -3.572 -0.5 4.233 re
+32.933 -3.204 m
+33.099 -3.204 33.232 -3.156 33.33 -3.057 c
+33.426 -2.961 33.481 -2.818 33.492 -2.631 c
+33.948 -2.631 l
+33.937 -2.917 33.834 -3.156 33.639 -3.351 c
+33.452 -3.538 33.217 -3.63 32.933 -3.63 c
+32.57 -3.63 32.291 -3.513 32.096 -3.278 c
+31.898 -3.042 31.802 -2.697 31.802 -2.234 c
+31.802 -1.911 l
+31.802 -1.462 31.894 -1.117 32.081 -0.881 c
+32.276 -0.646 32.559 -0.529 32.933 -0.529 c
+33.235 -0.529 33.477 -0.628 33.654 -0.823 c
+33.837 -1.022 33.937 -1.286 33.948 -1.616 c
+33.492 -1.616 l
+33.471 -1.392 33.411 -1.227 33.316 -1.117 c
+33.228 -1.01 33.099 -0.955 32.933 -0.955 c
+32.717 -0.955 32.555 -1.028 32.449 -1.176 c
+32.349 -1.315 32.295 -1.543 32.287 -1.866 c
+32.287 -2.248 l
+32.287 -2.601 32.335 -2.851 32.434 -2.998 c
+32.54 -3.138 32.706 -3.204 32.933 -3.204 c
+34.242 -1.94 m
+34.242 -1.51 34.345 -1.168 34.551 -0.911 c
+34.764 -0.658 35.043 -0.529 35.389 -0.529 c
+35.73 -0.529 36.006 -0.658 36.212 -0.911 c
+36.424 -1.157 36.538 -1.492 36.55 -1.911 c
+36.55 -2.219 l
+36.55 -2.653 36.44 -2.994 36.226 -3.248 c
+36.021 -3.505 35.742 -3.63 35.389 -3.63 c
+35.043 -3.63 34.771 -3.509 34.566 -3.262 c
+34.36 -3.021 34.25 -2.686 34.242 -2.263 c
+h
+34.727 -2.219 m
+34.727 -2.535 34.786 -2.778 34.903 -2.954 c
+35.028 -3.123 35.19 -3.204 35.389 -3.204 c
+35.819 -3.204 36.043 -2.896 36.064 -2.278 c
+36.064 -1.94 l
+36.064 -1.639 35.998 -1.396 35.873 -1.22 c
+35.756 -1.043 35.594 -0.955 35.389 -0.955 c
+35.19 -0.955 35.028 -1.043 34.903 -1.22 c
+34.786 -1.396 34.727 -1.639 34.727 -1.94 c
+h
+37.442 -0.588 m
+37.457 -0.867 l
+37.633 -0.643 37.872 -0.529 38.178 -0.529 c
+38.508 -0.529 38.74 -0.675 38.869 -0.97 c
+39.052 -0.675 39.314 -0.529 39.647 -0.529 c
+40.206 -0.529 40.489 -0.874 40.5 -1.558 c
+40.5 -3.572 l
+40.015 -3.572 l
+40.015 -1.602 l
+40.015 -1.389 39.975 -1.23 39.898 -1.132 c
+39.817 -1.025 39.684 -0.97 39.501 -0.97 c
+39.354 -0.97 39.235 -1.028 39.148 -1.146 c
+39.06 -1.257 39.004 -1.396 38.986 -1.573 c
+38.986 -3.572 l
+38.501 -3.572 l
+38.501 -1.587 l
+38.49 -1.176 38.317 -0.97 37.986 -0.97 c
+37.741 -0.97 37.568 -1.095 37.473 -1.338 c
+37.473 -3.572 l
+36.987 -3.572 l
+36.987 -0.588 l
+h
+41.404 -0.588 m
+41.419 -0.867 l
+41.595 -0.643 41.834 -0.529 42.139 -0.529 c
+42.47 -0.529 42.701 -0.675 42.83 -0.97 c
+43.013 -0.675 43.274 -0.529 43.609 -0.529 c
+44.168 -0.529 44.45 -0.874 44.461 -1.558 c
+44.461 -3.572 l
+43.977 -3.572 l
+43.977 -1.602 l
+43.977 -1.389 43.936 -1.23 43.859 -1.132 c
+43.778 -1.025 43.646 -0.97 43.462 -0.97 c
+43.314 -0.97 43.197 -1.028 43.109 -1.146 c
+43.021 -1.257 42.965 -1.396 42.948 -1.573 c
+42.948 -3.572 l
+42.462 -3.572 l
+42.462 -1.587 l
+42.451 -1.176 42.279 -0.97 41.948 -0.97 c
+41.702 -0.97 41.529 -1.095 41.433 -1.338 c
+41.433 -3.572 l
+40.949 -3.572 l
+40.949 -0.588 l
+h
+45.439 -3.572 -0.5 2.984 re
+45.469 0.206 m
+45.469 0.118 45.442 0.044 45.395 -0.014 c
+45.354 -0.066 45.284 -0.087 45.189 -0.087 c
+45.101 -0.087 45.031 -0.066 44.983 -0.014 c
+44.943 0.044 44.924 0.11 44.924 0.191 c
+44.924 0.279 44.943 0.353 44.983 0.412 c
+45.031 0.47 45.101 0.5 45.189 0.5 c
+45.284 0.5 45.354 0.47 45.395 0.412 c
+45.442 0.353 45.469 0.283 45.469 0.206 c
+46.747 0.133 m
+46.747 -0.588 l
+47.203 -0.588 l
+47.203 -0.985 l
+46.747 -0.985 l
+46.747 -2.836 l
+46.747 -2.954 46.765 -3.042 46.806 -3.102 c
+46.842 -3.16 46.913 -3.189 47.012 -3.189 c
+47.071 -3.189 47.133 -3.183 47.203 -3.16 c
+47.203 -3.572 l
+47.085 -3.609 46.971 -3.63 46.865 -3.63 c
+46.666 -3.63 46.516 -3.564 46.41 -3.424 c
+46.31 -3.289 46.262 -3.094 46.262 -2.836 c
+46.262 -0.985 l
+45.806 -0.985 l
+45.806 -0.588 l
+46.262 -0.588 l
+46.262 0.133 l
+h
+47.669 -4.365 m
+47.376 -4.174 l
+47.552 -3.928 47.644 -3.678 47.655 -3.424 c
+47.655 -2.969 l
+48.155 -2.969 l
+48.155 -3.366 l
+48.155 -3.553 48.103 -3.737 48.008 -3.925 c
+47.919 -4.108 47.806 -4.255 47.669 -4.365 c
+f
+Q
+515.596 100.373 -0.5 2.984 re
+515.625 104.151 m
+515.625 104.063 515.599 103.989 515.551 103.931 c
+515.511 103.879 515.441 103.858 515.345 103.858 c
+515.257 103.858 515.187 103.879 515.139 103.931 c
+515.099 103.989 515.081 104.055 515.081 104.136 c
+515.081 104.225 515.099 104.298 515.139 104.357 c
+515.187 104.415 515.257 104.446 515.345 104.446 c
+515.441 104.446 515.511 104.415 515.551 104.357 c
+515.599 104.298 515.625 104.228 515.625 104.151 c
+516.903 104.078 m
+516.903 103.357 l
+517.36 103.357 l
+517.36 102.96 l
+516.903 102.96 l
+516.903 101.109 l
+516.903 100.991 516.922 100.903 516.963 100.844 c
+516.999 100.785 517.069 100.756 517.169 100.756 c
+517.227 100.756 517.29 100.763 517.36 100.785 c
+517.36 100.373 l
+517.242 100.336 517.128 100.315 517.021 100.315 c
+516.822 100.315 516.672 100.381 516.566 100.521 c
+516.467 100.656 516.419 100.851 516.419 101.109 c
+516.419 102.96 l
+515.963 102.96 l
+515.963 103.357 l
+516.419 103.357 l
+516.419 104.078 l
+h
+519.513 103.049 m
+519.696 103.291 519.932 103.416 520.218 103.416 c
+520.747 103.416 521.016 103.064 521.027 102.358 c
+521.027 100.373 l
+520.542 100.373 l
+520.542 102.329 l
+520.542 102.564 520.502 102.729 520.424 102.828 c
+520.344 102.923 520.226 102.975 520.072 102.975 c
+519.954 102.975 519.843 102.935 519.748 102.858 c
+519.648 102.777 519.571 102.67 519.513 102.534 c
+519.513 100.373 l
+519.028 100.373 l
+519.028 104.606 l
+519.513 104.606 l
+h
+523.099 100.373 m
+523.07 100.44 523.048 100.55 523.041 100.697 c
+522.864 100.44 522.644 100.315 522.379 100.315 c
+522.104 100.315 521.886 100.388 521.732 100.535 c
+521.585 100.689 521.512 100.907 521.512 101.182 c
+521.512 101.483 521.615 101.726 521.821 101.902 c
+522.027 102.086 522.31 102.181 522.673 102.181 c
+523.026 102.181 l
+523.026 102.505 l
+523.026 102.682 522.985 102.802 522.908 102.873 c
+522.827 102.95 522.71 102.99 522.555 102.99 c
+522.409 102.99 522.283 102.946 522.188 102.858 c
+522.1 102.769 522.056 102.659 522.056 102.534 c
+521.57 102.534 l
+521.57 102.682 521.615 102.821 521.703 102.96 c
+521.791 103.108 521.909 103.218 522.056 103.299 c
+522.21 103.376 522.383 103.416 522.57 103.416 c
+522.883 103.416 523.118 103.336 523.276 103.181 c
+523.43 103.034 523.511 102.813 523.511 102.52 c
+523.511 101.02 l
+523.519 100.785 523.555 100.583 523.614 100.417 c
+523.614 100.373 l
+h
+522.453 100.756 m
+522.57 100.756 522.68 100.789 522.79 100.859 c
+522.898 100.924 522.975 101.009 523.026 101.109 c
+523.026 101.814 l
+522.761 101.814 l
+522.526 101.814 522.339 101.763 522.203 101.667 c
+522.075 101.568 522.012 101.425 522.012 101.241 c
+522.012 101.072 522.041 100.951 522.1 100.874 c
+522.166 100.793 522.283 100.756 522.453 100.756 c
+525.532 101.138 m
+525.532 101.244 525.491 101.333 525.414 101.402 c
+525.333 101.479 525.183 101.568 524.959 101.667 c
+524.695 101.774 524.506 101.865 524.4 101.946 c
+524.29 102.023 524.213 102.112 524.165 102.211 c
+524.113 102.306 524.091 102.424 524.091 102.564 c
+524.091 102.806 524.18 103.008 524.356 103.166 c
+524.533 103.332 524.757 103.416 525.032 103.416 c
+525.327 103.416 525.562 103.328 525.738 103.152 c
+525.915 102.983 526.002 102.769 526.002 102.505 c
+525.518 102.505 l
+525.518 102.641 525.466 102.755 525.37 102.843 c
+525.282 102.939 525.169 102.99 525.032 102.99 c
+524.885 102.99 524.772 102.95 524.695 102.873 c
+524.614 102.802 524.577 102.703 524.577 102.578 c
+524.577 102.479 524.606 102.402 524.664 102.343 c
+524.724 102.285 524.863 102.204 525.091 102.108 c
+525.451 101.961 525.697 101.818 525.826 101.682 c
+525.962 101.553 526.032 101.381 526.032 101.167 c
+526.032 100.91 525.936 100.704 525.753 100.55 c
+525.576 100.392 525.341 100.315 525.047 100.315 c
+524.731 100.315 524.477 100.403 524.282 100.579 c
+524.095 100.763 524.003 100.995 524.003 101.271 c
+524.488 101.271 l
+524.496 101.101 524.547 100.969 524.635 100.874 c
+524.731 100.785 524.87 100.741 525.047 100.741 c
+525.202 100.741 525.319 100.774 525.4 100.844 c
+525.488 100.91 525.532 101.009 525.532 101.138 c
+527.59 102.005 m
+527.59 102.435 527.693 102.777 527.899 103.034 c
+528.111 103.288 528.391 103.416 528.737 103.416 c
+529.078 103.416 529.354 103.288 529.56 103.034 c
+529.773 102.788 529.886 102.453 529.898 102.034 c
+529.898 101.726 l
+529.898 101.292 529.788 100.951 529.574 100.697 c
+529.368 100.44 529.09 100.315 528.737 100.315 c
+528.391 100.315 528.119 100.436 527.914 100.683 c
+527.708 100.924 527.598 101.259 527.59 101.682 c
+h
+528.075 101.726 m
+528.075 101.41 528.134 101.167 528.251 100.991 c
+528.377 100.822 528.538 100.741 528.737 100.741 c
+529.167 100.741 529.391 101.05 529.412 101.667 c
+529.412 102.005 l
+529.412 102.306 529.346 102.549 529.221 102.725 c
+529.104 102.902 528.942 102.99 528.737 102.99 c
+528.538 102.99 528.377 102.902 528.251 102.725 c
+528.134 102.549 528.075 102.306 528.075 102.005 c
+h
+530.79 103.357 m
+530.806 103.034 l
+530.989 103.288 531.232 103.416 531.525 103.416 c
+532.055 103.416 532.323 103.064 532.334 102.358 c
+532.334 100.373 l
+531.849 100.373 l
+531.849 102.329 l
+531.849 102.564 531.808 102.729 531.731 102.828 c
+531.65 102.923 531.533 102.975 531.378 102.975 c
+531.261 102.975 531.151 102.935 531.055 102.858 c
+530.956 102.777 530.879 102.67 530.82 102.534 c
+530.82 100.373 l
+530.335 100.373 l
+530.335 103.357 l
+h
+533.948 100.315 m
+533.572 100.315 533.289 100.421 533.094 100.638 c
+532.896 100.862 532.801 101.19 532.801 101.623 c
+532.801 101.99 l
+532.801 102.431 532.893 102.777 533.08 103.034 c
+533.275 103.288 533.551 103.416 533.903 103.416 c
+534.245 103.416 534.499 103.303 534.667 103.078 c
+534.844 102.85 534.935 102.505 534.947 102.034 c
+534.947 101.726 l
+533.285 101.726 l
+533.285 101.653 l
+533.285 101.329 533.345 101.094 533.462 100.947 c
+533.58 100.807 533.749 100.741 533.977 100.741 c
+534.124 100.741 534.249 100.763 534.359 100.814 c
+534.465 100.874 534.569 100.961 534.667 101.079 c
+534.918 100.77 l
+534.711 100.465 534.388 100.315 533.948 100.315 c
+533.903 102.99 m
+533.697 102.99 533.543 102.92 533.447 102.784 c
+533.348 102.644 533.293 102.431 533.285 102.137 c
+534.461 102.137 l
+534.461 102.211 l
+534.44 102.483 534.388 102.682 534.3 102.799 c
+534.212 102.923 534.079 102.99 533.903 102.99 c
+538.706 101.726 m
+538.706 101.256 538.621 100.903 538.457 100.668 c
+538.287 100.432 538.048 100.315 537.736 100.315 c
+537.431 100.315 537.2 100.425 537.045 100.653 c
+537.045 99.227 l
+536.56 99.227 l
+536.56 103.357 l
+537.001 103.357 l
+537.03 103.019 l
+537.185 103.284 537.416 103.416 537.721 103.416 c
+538.052 103.416 538.299 103.299 538.457 103.064 c
+538.621 102.836 538.706 102.497 538.706 102.05 c
+h
+538.221 102.005 m
+538.221 102.336 538.166 102.582 538.06 102.74 c
+537.96 102.894 537.798 102.975 537.574 102.975 c
+537.339 102.975 537.163 102.858 537.045 102.622 c
+537.045 101.079 l
+537.163 100.851 537.343 100.741 537.589 100.741 c
+537.802 100.741 537.96 100.818 538.06 100.976 c
+538.166 101.13 538.221 101.373 538.221 101.697 c
+h
+540.695 100.373 m
+540.664 100.44 540.643 100.55 540.635 100.697 c
+540.459 100.44 540.238 100.315 539.974 100.315 c
+539.698 100.315 539.481 100.388 539.327 100.535 c
+539.18 100.689 539.107 100.907 539.107 101.182 c
+539.107 101.483 539.209 101.726 539.415 101.902 c
+539.621 102.086 539.904 102.181 540.268 102.181 c
+540.62 102.181 l
+540.62 102.505 l
+540.62 102.682 540.58 102.802 540.503 102.873 c
+540.422 102.95 540.304 102.99 540.15 102.99 c
+540.003 102.99 539.878 102.946 539.783 102.858 c
+539.695 102.769 539.65 102.659 539.65 102.534 c
+539.165 102.534 l
+539.165 102.682 539.209 102.821 539.298 102.96 c
+539.386 103.108 539.504 103.218 539.65 103.299 c
+539.805 103.376 539.978 103.416 540.165 103.416 c
+540.477 103.416 540.712 103.336 540.871 103.181 c
+541.025 103.034 541.106 102.813 541.106 102.52 c
+541.106 101.02 l
+541.113 100.785 541.15 100.583 541.208 100.417 c
+541.208 100.373 l
+h
+540.047 100.756 m
+540.165 100.756 540.275 100.789 540.385 100.859 c
+540.492 100.924 540.569 101.009 540.62 101.109 c
+540.62 101.814 l
+540.356 101.814 l
+540.121 101.814 539.934 101.763 539.797 101.667 c
+539.669 101.568 539.606 101.425 539.606 101.241 c
+539.606 101.072 539.635 100.951 539.695 100.874 c
+539.76 100.793 539.878 100.756 540.047 100.756 c
+542.921 102.902 m
+542.851 102.909 542.777 102.917 542.7 102.917 c
+542.443 102.917 542.267 102.777 542.172 102.505 c
+542.172 100.373 l
+541.686 100.373 l
+541.686 103.357 l
+542.156 103.357 l
+542.172 103.049 l
+542.297 103.291 542.48 103.416 542.715 103.416 c
+542.792 103.416 542.855 103.401 542.906 103.372 c
+h
+544.296 100.315 m
+543.92 100.315 543.637 100.421 543.443 100.638 c
+543.244 100.862 543.149 101.19 543.149 101.623 c
+543.149 101.99 l
+543.149 102.431 543.241 102.777 543.428 103.034 c
+543.623 103.288 543.899 103.416 544.252 103.416 c
+544.593 103.416 544.847 103.303 545.015 103.078 c
+545.192 102.85 545.284 102.505 545.295 102.034 c
+545.295 101.726 l
+543.633 101.726 l
+543.633 101.653 l
+543.633 101.329 543.693 101.094 543.81 100.947 c
+543.928 100.807 544.097 100.741 544.325 100.741 c
+544.472 100.741 544.597 100.763 544.707 100.814 c
+544.813 100.874 544.917 100.961 545.015 101.079 c
+545.266 100.77 l
+545.06 100.465 544.736 100.315 544.296 100.315 c
+544.252 102.99 m
+544.046 102.99 543.891 102.92 543.795 102.784 c
+543.697 102.644 543.641 102.431 543.633 102.137 c
+544.809 102.137 l
+544.809 102.211 l
+544.788 102.483 544.736 102.682 544.648 102.799 c
+544.56 102.923 544.427 102.99 544.252 102.99 c
+546.162 103.357 m
+546.177 103.034 l
+546.361 103.288 546.603 103.416 546.897 103.416 c
+547.427 103.416 547.695 103.064 547.706 102.358 c
+547.706 100.373 l
+547.221 100.373 l
+547.221 102.329 l
+547.221 102.564 547.18 102.729 547.103 102.828 c
+547.022 102.923 546.904 102.975 546.75 102.975 c
+546.633 102.975 546.522 102.935 546.427 102.858 c
+546.328 102.777 546.251 102.67 546.191 102.534 c
+546.191 100.373 l
+545.707 100.373 l
+545.707 103.357 l
+h
+548.892 104.078 m
+548.892 103.357 l
+549.349 103.357 l
+549.349 102.96 l
+548.892 102.96 l
+548.892 101.109 l
+548.892 100.991 548.911 100.903 548.951 100.844 c
+548.988 100.785 549.058 100.756 549.158 100.756 c
+549.216 100.756 549.278 100.763 549.349 100.785 c
+549.349 100.373 l
+549.231 100.336 549.117 100.315 549.01 100.315 c
+548.811 100.315 548.661 100.381 548.555 100.521 c
+548.456 100.656 548.408 100.851 548.408 101.109 c
+548.408 102.96 l
+547.951 102.96 l
+547.951 103.357 l
+548.408 103.357 l
+548.408 104.078 l
+h
+f
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 550.895 108.4612 cm
+0 0 m
+5.56 4.844 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 554.8461 111.9046 cm
+0 0 m
+-0.104 -1.507 l
+2.009 1.75 l
+-1.504 0.103 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 554.8461 111.9047 cm
+0 0 m
+-0.104 -1.507 l
+2.009 1.75 l
+-1.504 0.103 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 684.3624 112.9743 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.441 l
+0 0.441 l
+h
+0.823 -0.897 m
+1.008 -0.654 1.243 -0.53 1.529 -0.53 c
+2.058 -0.53 2.326 -0.882 2.338 -1.588 c
+2.338 -3.572 l
+1.852 -3.572 l
+1.852 -1.617 l
+1.852 -1.382 1.812 -1.216 1.735 -1.118 c
+1.654 -1.022 1.536 -0.97 1.382 -0.97 c
+1.264 -0.97 1.154 -1.01 1.058 -1.088 c
+0.96 -1.168 0.882 -1.276 0.823 -1.411 c
+0.823 -3.572 l
+0.339 -3.572 l
+0.339 0.661 l
+0.823 0.661 l
+h
+3.406 -3.572 -0.5 2.984 re
+3.437 0.206 m
+3.437 0.118 3.41 0.044 3.362 -0.015 c
+3.323 -0.066 3.252 -0.088 3.157 -0.088 c
+3.069 -0.088 2.999 -0.066 2.951 -0.015 c
+2.911 0.044 2.892 0.11 2.892 0.191 c
+2.892 0.279 2.911 0.353 2.951 0.411 c
+2.999 0.47 3.069 0.5 3.157 0.5 c
+3.252 0.5 3.323 0.47 3.362 0.411 c
+3.41 0.353 3.437 0.283 3.437 0.206 c
+5.523 -2.807 m
+5.523 -2.701 5.483 -2.612 5.405 -2.543 c
+5.325 -2.466 5.174 -2.377 4.95 -2.278 c
+4.686 -2.172 4.499 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.735 c
+4.105 -1.639 4.083 -1.521 4.083 -1.382 c
+4.083 -1.139 4.171 -0.937 4.347 -0.779 c
+4.524 -0.613 4.748 -0.53 5.024 -0.53 c
+5.318 -0.53 5.553 -0.617 5.729 -0.794 c
+5.906 -0.962 5.993 -1.176 5.993 -1.44 c
+5.509 -1.44 l
+5.509 -1.305 5.457 -1.191 5.361 -1.103 c
+5.274 -1.007 5.16 -0.956 5.024 -0.956 c
+4.877 -0.956 4.763 -0.996 4.686 -1.073 c
+4.605 -1.143 4.568 -1.242 4.568 -1.367 c
+4.568 -1.467 4.597 -1.544 4.656 -1.602 c
+4.715 -1.661 4.854 -1.742 5.083 -1.837 c
+5.442 -1.984 5.689 -2.128 5.818 -2.263 c
+5.953 -2.392 6.024 -2.565 6.024 -2.778 c
+6.024 -3.036 5.928 -3.241 5.744 -3.395 c
+5.567 -3.553 5.332 -3.63 5.039 -3.63 c
+4.723 -3.63 4.469 -3.543 4.274 -3.366 c
+4.087 -3.183 3.994 -2.951 3.994 -2.675 c
+4.48 -2.675 l
+4.487 -2.844 4.538 -2.977 4.627 -3.072 c
+4.723 -3.16 4.862 -3.204 5.039 -3.204 c
+5.193 -3.204 5.31 -3.171 5.391 -3.102 c
+5.479 -3.036 5.523 -2.936 5.523 -2.807 c
+8.214 -3.572 -0.5 2.984 re
+8.243 0.206 m
+8.243 0.118 8.217 0.044 8.169 -0.015 c
+8.129 -0.066 8.059 -0.088 7.963 -0.088 c
+7.875 -0.088 7.805 -0.066 7.757 -0.015 c
+7.717 0.044 7.699 0.11 7.699 0.191 c
+7.699 0.279 7.717 0.353 7.757 0.411 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.059 0.5 8.129 0.47 8.169 0.411 c
+8.217 0.353 8.243 0.283 8.243 0.206 c
+10.326 -2.807 m
+10.326 -2.701 10.286 -2.612 10.209 -2.543 c
+10.128 -2.466 9.978 -2.377 9.753 -2.278 c
+9.488 -2.172 9.301 -2.08 9.195 -1.999 c
+9.084 -1.922 9.007 -1.834 8.96 -1.735 c
+8.908 -1.639 8.886 -1.521 8.886 -1.382 c
+8.886 -1.139 8.974 -0.937 9.151 -0.779 c
+9.327 -0.613 9.551 -0.53 9.827 -0.53 c
+10.12 -0.53 10.356 -0.617 10.533 -0.794 c
+10.708 -0.962 10.797 -1.176 10.797 -1.44 c
+10.311 -1.44 l
+10.311 -1.305 10.26 -1.191 10.165 -1.103 c
+10.076 -1.007 9.962 -0.956 9.827 -0.956 c
+9.679 -0.956 9.565 -0.996 9.488 -1.073 c
+9.407 -1.143 9.371 -1.242 9.371 -1.367 c
+9.371 -1.467 9.4 -1.544 9.459 -1.602 c
+9.517 -1.661 9.658 -1.742 9.885 -1.837 c
+10.246 -1.984 10.492 -2.128 10.62 -2.263 c
+10.756 -2.392 10.826 -2.565 10.826 -2.778 c
+10.826 -3.036 10.73 -3.241 10.547 -3.395 c
+10.371 -3.553 10.136 -3.63 9.841 -3.63 c
+9.525 -3.63 9.272 -3.543 9.077 -3.366 c
+8.889 -3.183 8.798 -2.951 8.798 -2.675 c
+9.282 -2.675 l
+9.29 -2.844 9.342 -2.977 9.43 -3.072 c
+9.525 -3.16 9.665 -3.204 9.841 -3.204 c
+9.995 -3.204 10.113 -3.171 10.194 -3.102 c
+10.282 -3.036 10.326 -2.936 10.326 -2.807 c
+14.016 -3.572 m
+13.986 -3.506 13.964 -3.395 13.957 -3.248 c
+13.781 -3.506 13.56 -3.63 13.295 -3.63 c
+13.02 -3.63 12.803 -3.557 12.649 -3.41 c
+12.502 -3.256 12.428 -3.04 12.428 -2.764 c
+12.428 -2.462 12.532 -2.219 12.737 -2.043 c
+12.943 -1.86 13.226 -1.764 13.59 -1.764 c
+13.943 -1.764 l
+13.943 -1.44 l
+13.943 -1.264 13.902 -1.143 13.825 -1.073 c
+13.744 -0.996 13.627 -0.956 13.472 -0.956 c
+13.325 -0.956 13.2 -1 13.104 -1.088 c
+13.016 -1.176 12.972 -1.286 12.972 -1.411 c
+12.487 -1.411 l
+12.487 -1.264 12.532 -1.124 12.619 -0.985 c
+12.708 -0.838 12.825 -0.727 12.972 -0.647 c
+13.126 -0.57 13.299 -0.53 13.486 -0.53 c
+13.799 -0.53 14.034 -0.61 14.192 -0.765 c
+14.346 -0.912 14.427 -1.132 14.427 -1.426 c
+14.427 -2.925 l
+14.435 -3.16 14.471 -3.362 14.531 -3.528 c
+14.531 -3.572 l
+h
+13.369 -3.19 m
+13.486 -3.19 13.596 -3.157 13.708 -3.087 c
+13.814 -3.021 13.891 -2.936 13.943 -2.837 c
+13.943 -2.132 l
+13.677 -2.132 l
+13.442 -2.132 13.255 -2.183 13.12 -2.278 c
+12.991 -2.377 12.928 -2.521 12.928 -2.705 c
+12.928 -2.874 12.958 -2.995 13.016 -3.072 c
+13.082 -3.153 13.2 -3.19 13.369 -3.19 c
+16.669 -0.588 m
+16.684 -0.867 l
+16.86 -0.643 17.099 -0.53 17.404 -0.53 c
+17.735 -0.53 17.966 -0.676 18.095 -0.97 c
+18.279 -0.676 18.539 -0.53 18.874 -0.53 c
+19.432 -0.53 19.715 -0.875 19.726 -1.558 c
+19.726 -3.572 l
+19.241 -3.572 l
+19.241 -1.602 l
+19.241 -1.389 19.201 -1.231 19.123 -1.132 c
+19.042 -1.025 18.911 -0.97 18.726 -0.97 c
+18.58 -0.97 18.462 -1.029 18.375 -1.147 c
+18.286 -1.257 18.231 -1.396 18.213 -1.573 c
+18.213 -3.572 l
+17.727 -3.572 l
+17.727 -1.588 l
+17.716 -1.176 17.544 -0.97 17.213 -0.97 c
+16.966 -0.97 16.794 -1.095 16.698 -1.338 c
+16.698 -3.572 l
+16.214 -3.572 l
+16.214 -0.588 l
+h
+21.233 -3.63 m
+20.858 -3.63 20.575 -3.524 20.38 -3.308 c
+20.182 -3.083 20.087 -2.756 20.087 -2.323 c
+20.087 -1.955 l
+20.087 -1.514 20.178 -1.168 20.366 -0.912 c
+20.561 -0.658 20.836 -0.53 21.189 -0.53 c
+21.531 -0.53 21.784 -0.643 21.953 -0.867 c
+22.13 -1.095 22.221 -1.44 22.232 -1.911 c
+22.232 -2.219 l
+20.571 -2.219 l
+20.571 -2.294 l
+20.571 -2.616 20.63 -2.851 20.748 -2.999 c
+20.866 -3.138 21.035 -3.204 21.263 -3.204 c
+21.409 -3.204 21.534 -3.183 21.645 -3.131 c
+21.751 -3.072 21.854 -2.984 21.953 -2.866 c
+22.203 -3.175 l
+21.997 -3.48 21.674 -3.63 21.233 -3.63 c
+21.189 -0.956 m
+20.983 -0.956 20.829 -1.025 20.733 -1.161 c
+20.634 -1.301 20.579 -1.514 20.571 -1.808 c
+21.747 -1.808 l
+21.747 -1.735 l
+21.725 -1.463 21.674 -1.264 21.586 -1.147 c
+21.498 -1.022 21.365 -0.956 21.189 -0.956 c
+23.879 -1.043 m
+23.809 -1.037 23.736 -1.029 23.659 -1.029 c
+23.401 -1.029 23.225 -1.168 23.129 -1.44 c
+23.129 -3.572 l
+22.645 -3.572 l
+22.645 -0.588 l
+23.115 -0.588 l
+23.129 -0.897 l
+23.254 -0.654 23.438 -0.53 23.673 -0.53 c
+23.75 -0.53 23.813 -0.544 23.864 -0.573 c
+h
+24.096 -1.941 m
+24.096 -1.481 24.176 -1.132 24.345 -0.897 c
+24.522 -0.654 24.772 -0.53 25.095 -0.53 c
+25.396 -0.53 25.628 -0.661 25.786 -0.926 c
+25.816 -0.588 l
+26.256 -0.588 l
+26.256 -3.601 l
+26.256 -3.973 26.157 -4.255 25.963 -4.453 c
+25.775 -4.648 25.514 -4.748 25.184 -4.748 c
+25.037 -4.748 24.868 -4.707 24.684 -4.63 c
+24.496 -4.561 24.36 -4.472 24.272 -4.366 c
+24.463 -4.027 l
+24.669 -4.233 24.893 -4.336 25.139 -4.336 c
+25.54 -4.336 25.745 -4.108 25.756 -3.66 c
+25.756 -3.278 l
+25.598 -3.513 25.378 -3.63 25.095 -3.63 c
+24.779 -3.63 24.536 -3.513 24.36 -3.278 c
+24.191 -3.042 24.103 -2.712 24.096 -2.278 c
+h
+24.581 -2.219 m
+24.581 -2.554 24.629 -2.801 24.727 -2.955 c
+24.823 -3.113 24.985 -3.19 25.213 -3.19 c
+25.456 -3.19 25.639 -3.069 25.756 -2.822 c
+25.756 -1.338 l
+25.639 -1.095 25.463 -0.97 25.228 -0.97 c
+24.999 -0.97 24.838 -1.051 24.742 -1.205 c
+24.644 -1.363 24.588 -1.602 24.581 -1.926 c
+h
+27.848 -3.63 m
+27.472 -3.63 27.19 -3.524 26.995 -3.308 c
+26.797 -3.083 26.701 -2.756 26.701 -2.323 c
+26.701 -1.955 l
+26.701 -1.514 26.793 -1.168 26.98 -0.912 c
+27.175 -0.658 27.451 -0.53 27.804 -0.53 c
+28.145 -0.53 28.399 -0.643 28.567 -0.867 c
+28.744 -1.095 28.836 -1.44 28.847 -1.911 c
+28.847 -2.219 l
+27.186 -2.219 l
+27.186 -2.294 l
+27.186 -2.616 27.245 -2.851 27.362 -2.999 c
+27.48 -3.138 27.649 -3.204 27.877 -3.204 c
+28.024 -3.204 28.149 -3.183 28.259 -3.131 c
+28.366 -3.072 28.469 -2.984 28.567 -2.866 c
+28.818 -3.175 l
+28.612 -3.48 28.289 -3.63 27.848 -3.63 c
+27.804 -0.956 m
+27.598 -0.956 27.443 -1.025 27.348 -1.161 c
+27.248 -1.301 27.193 -1.514 27.186 -1.808 c
+28.362 -1.808 l
+28.362 -1.735 l
+28.34 -1.463 28.289 -1.264 28.201 -1.147 c
+28.112 -1.022 27.979 -0.956 27.804 -0.956 c
+31.493 -3.204 m
+31.659 -3.204 31.79 -3.157 31.89 -3.057 c
+31.985 -2.961 32.041 -2.818 32.052 -2.631 c
+32.507 -2.631 l
+32.496 -2.918 32.393 -3.157 32.199 -3.352 c
+32.012 -3.539 31.776 -3.63 31.493 -3.63 c
+31.129 -3.63 30.85 -3.513 30.655 -3.278 c
+30.456 -3.042 30.361 -2.697 30.361 -2.234 c
+30.361 -1.911 l
+30.361 -1.463 30.453 -1.118 30.641 -0.882 c
+30.836 -0.647 31.118 -0.53 31.493 -0.53 c
+31.794 -0.53 32.037 -0.628 32.213 -0.823 c
+32.397 -1.022 32.496 -1.286 32.507 -1.617 c
+32.052 -1.617 l
+32.029 -1.393 31.971 -1.228 31.875 -1.118 c
+31.787 -1.01 31.659 -0.956 31.493 -0.956 c
+31.276 -0.956 31.114 -1.029 31.008 -1.176 c
+30.909 -1.315 30.853 -1.544 30.846 -1.866 c
+30.846 -2.249 l
+30.846 -2.602 30.894 -2.851 30.994 -2.999 c
+31.1 -3.138 31.266 -3.204 31.493 -3.204 c
+32.801 -1.941 m
+32.801 -1.511 32.904 -1.168 33.11 -0.912 c
+33.323 -0.658 33.602 -0.53 33.948 -0.53 c
+34.289 -0.53 34.565 -0.658 34.771 -0.912 c
+34.984 -1.158 35.098 -1.492 35.109 -1.911 c
+35.109 -2.219 l
+35.109 -2.653 34.998 -2.995 34.786 -3.248 c
+34.58 -3.506 34.3 -3.63 33.948 -3.63 c
+33.602 -3.63 33.33 -3.51 33.124 -3.263 c
+32.918 -3.021 32.808 -2.687 32.801 -2.263 c
+h
+33.286 -2.219 m
+33.286 -2.535 33.345 -2.778 33.463 -2.955 c
+33.587 -3.123 33.749 -3.204 33.948 -3.204 c
+34.377 -3.204 34.602 -2.896 34.624 -2.278 c
+34.624 -1.941 l
+34.624 -1.639 34.558 -1.396 34.433 -1.22 c
+34.315 -1.043 34.154 -0.956 33.948 -0.956 c
+33.749 -0.956 33.587 -1.043 33.463 -1.22 c
+33.345 -1.396 33.286 -1.639 33.286 -1.941 c
+h
+36.002 -0.588 m
+36.016 -0.867 l
+36.193 -0.643 36.432 -0.53 36.737 -0.53 c
+37.068 -0.53 37.299 -0.676 37.427 -0.97 c
+37.612 -0.676 37.872 -0.53 38.207 -0.53 c
+38.765 -0.53 39.048 -0.875 39.06 -1.558 c
+39.06 -3.572 l
+38.574 -3.572 l
+38.574 -1.602 l
+38.574 -1.389 38.534 -1.231 38.456 -1.132 c
+38.376 -1.025 38.244 -0.97 38.06 -0.97 c
+37.913 -0.97 37.795 -1.029 37.707 -1.147 c
+37.619 -1.257 37.564 -1.396 37.545 -1.573 c
+37.545 -3.572 l
+37.06 -3.572 l
+37.06 -1.588 l
+37.049 -1.176 36.876 -0.97 36.546 -0.97 c
+36.299 -0.97 36.127 -1.095 36.031 -1.338 c
+36.031 -3.572 l
+35.546 -3.572 l
+35.546 -0.588 l
+h
+39.964 -0.588 m
+39.978 -0.867 l
+40.155 -0.643 40.393 -0.53 40.698 -0.53 c
+41.029 -0.53 41.261 -0.676 41.389 -0.97 c
+41.573 -0.676 41.834 -0.53 42.168 -0.53 c
+42.727 -0.53 43.01 -0.875 43.021 -1.558 c
+43.021 -3.572 l
+42.536 -3.572 l
+42.536 -1.602 l
+42.536 -1.389 42.495 -1.231 42.418 -1.132 c
+42.337 -1.025 42.205 -0.97 42.021 -0.97 c
+41.874 -0.97 41.757 -1.029 41.668 -1.147 c
+41.58 -1.257 41.525 -1.396 41.506 -1.573 c
+41.506 -3.572 l
+41.022 -3.572 l
+41.022 -1.588 l
+41.011 -1.176 40.837 -0.97 40.507 -0.97 c
+40.261 -0.97 40.089 -1.095 39.993 -1.338 c
+39.993 -3.572 l
+39.507 -3.572 l
+39.507 -0.588 l
+h
+43.998 -3.572 -0.5 2.984 re
+44.028 0.206 m
+44.028 0.118 44.002 0.044 43.954 -0.015 c
+43.914 -0.066 43.844 -0.088 43.748 -0.088 c
+43.66 -0.088 43.59 -0.066 43.542 -0.015 c
+43.502 0.044 43.484 0.11 43.484 0.191 c
+43.484 0.279 43.502 0.353 43.542 0.411 c
+43.59 0.47 43.66 0.5 43.748 0.5 c
+43.844 0.5 43.914 0.47 43.954 0.411 c
+44.002 0.353 44.028 0.283 44.028 0.206 c
+45.306 0.133 m
+45.306 -0.588 l
+45.762 -0.588 l
+45.762 -0.985 l
+45.306 -0.985 l
+45.306 -2.837 l
+45.306 -2.955 45.325 -3.042 45.365 -3.102 c
+45.402 -3.16 45.472 -3.19 45.571 -3.19 c
+45.63 -3.19 45.693 -3.183 45.762 -3.16 c
+45.762 -3.572 l
+45.645 -3.609 45.531 -3.63 45.424 -3.63 c
+45.225 -3.63 45.075 -3.564 44.968 -3.425 c
+44.87 -3.289 44.822 -3.094 44.822 -2.837 c
+44.822 -0.985 l
+44.365 -0.985 l
+44.365 -0.588 l
+44.822 -0.588 l
+44.822 0.133 l
+h
+46.229 -4.366 m
+45.934 -4.175 l
+46.111 -3.929 46.203 -3.678 46.214 -3.425 c
+46.214 -2.969 l
+46.713 -2.969 l
+46.713 -3.366 l
+46.713 -3.553 46.663 -3.738 46.567 -3.925 c
+46.478 -4.108 46.364 -4.255 46.229 -4.366 c
+f
+Q
+693.76 102.817 -0.501 2.984 re
+693.789 106.595 m
+693.789 106.507 693.762 106.433 693.715 106.374 c
+693.675 106.323 693.604 106.301 693.509 106.301 c
+693.421 106.301 693.351 106.323 693.303 106.374 c
+693.263 106.433 693.245 106.499 693.245 106.58 c
+693.245 106.669 693.263 106.742 693.303 106.8 c
+693.351 106.86 693.421 106.889 693.509 106.889 c
+693.604 106.889 693.675 106.86 693.715 106.8 c
+693.762 106.742 693.789 106.672 693.789 106.595 c
+695.063 106.522 m
+695.063 105.801 l
+695.52 105.801 l
+695.52 105.404 l
+695.063 105.404 l
+695.063 103.552 l
+695.063 103.434 695.082 103.347 695.123 103.288 c
+695.159 103.229 695.229 103.199 695.328 103.199 c
+695.387 103.199 695.449 103.207 695.52 103.229 c
+695.52 102.817 l
+695.402 102.78 695.288 102.759 695.181 102.759 c
+694.982 102.759 694.832 102.825 694.726 102.964 c
+694.626 103.1 694.579 103.295 694.579 103.552 c
+694.579 105.404 l
+694.123 105.404 l
+694.123 105.801 l
+694.579 105.801 l
+694.579 106.522 l
+h
+697.677 105.493 m
+697.86 105.735 698.095 105.86 698.382 105.86 c
+698.911 105.86 699.179 105.507 699.19 104.801 c
+699.19 102.817 l
+698.705 102.817 l
+698.705 104.772 l
+698.705 105.007 698.664 105.173 698.587 105.272 c
+698.506 105.368 698.389 105.419 698.235 105.419 c
+698.117 105.419 698.007 105.379 697.912 105.302 c
+697.812 105.221 697.735 105.114 697.677 104.978 c
+697.677 102.817 l
+697.191 102.817 l
+697.191 107.051 l
+697.677 107.051 l
+h
+701.259 102.817 m
+701.23 102.883 701.207 102.994 701.201 103.141 c
+701.024 102.883 700.804 102.759 700.539 102.759 c
+700.264 102.759 700.046 102.832 699.892 102.979 c
+699.745 103.133 699.672 103.35 699.672 103.625 c
+699.672 103.927 699.775 104.17 699.981 104.346 c
+700.187 104.529 700.469 104.625 700.833 104.625 c
+701.186 104.625 l
+701.186 104.949 l
+701.186 105.125 701.145 105.246 701.068 105.316 c
+700.987 105.393 700.87 105.433 700.715 105.433 c
+700.569 105.433 700.443 105.389 700.347 105.302 c
+700.26 105.213 700.216 105.103 700.216 104.978 c
+699.73 104.978 l
+699.73 105.125 699.775 105.265 699.863 105.404 c
+699.951 105.551 700.069 105.662 700.216 105.742 c
+700.37 105.819 700.542 105.86 700.73 105.86 c
+701.043 105.86 701.278 105.78 701.436 105.624 c
+701.59 105.478 701.671 105.257 701.671 104.963 c
+701.671 103.464 l
+701.678 103.229 701.715 103.027 701.774 102.861 c
+701.774 102.817 l
+h
+700.613 103.199 m
+700.73 103.199 700.84 103.232 700.951 103.303 c
+701.057 103.368 701.134 103.453 701.186 103.552 c
+701.186 104.257 l
+700.921 104.257 l
+700.686 104.257 700.499 104.207 700.363 104.111 c
+700.234 104.012 700.172 103.868 700.172 103.685 c
+700.172 103.515 700.201 103.394 700.26 103.317 c
+700.326 103.236 700.443 103.199 700.613 103.199 c
+703.692 103.582 m
+703.692 103.688 703.651 103.777 703.574 103.846 c
+703.493 103.923 703.343 104.012 703.119 104.111 c
+702.854 104.217 702.666 104.309 702.56 104.39 c
+702.45 104.467 702.373 104.556 702.325 104.654 c
+702.273 104.75 702.252 104.868 702.252 105.007 c
+702.252 105.25 702.34 105.452 702.516 105.61 c
+702.693 105.776 702.917 105.86 703.192 105.86 c
+703.486 105.86 703.721 105.772 703.898 105.595 c
+704.074 105.427 704.162 105.213 704.162 104.949 c
+703.678 104.949 l
+703.678 105.084 703.626 105.198 703.53 105.287 c
+703.443 105.383 703.328 105.433 703.192 105.433 c
+703.046 105.433 702.932 105.393 702.854 105.316 c
+702.774 105.246 702.737 105.147 702.737 105.022 c
+702.737 104.923 702.766 104.845 702.824 104.787 c
+702.884 104.728 703.023 104.647 703.251 104.552 c
+703.611 104.405 703.857 104.261 703.986 104.126 c
+704.122 103.997 704.191 103.824 704.191 103.611 c
+704.191 103.353 704.096 103.148 703.913 102.994 c
+703.736 102.836 703.501 102.759 703.207 102.759 c
+702.891 102.759 702.637 102.846 702.443 103.023 c
+702.255 103.207 702.163 103.438 702.163 103.714 c
+702.648 103.714 l
+702.656 103.545 702.707 103.413 702.795 103.317 c
+702.891 103.229 703.03 103.185 703.207 103.185 c
+703.362 103.185 703.479 103.218 703.559 103.288 c
+703.648 103.353 703.692 103.453 703.692 103.582 c
+706.485 106.522 m
+706.485 105.801 l
+706.94 105.801 l
+706.94 105.404 l
+706.485 105.404 l
+706.485 103.552 l
+706.485 103.434 706.503 103.347 706.543 103.288 c
+706.58 103.229 706.65 103.199 706.749 103.199 c
+706.808 103.199 706.871 103.207 706.94 103.229 c
+706.94 102.817 l
+706.823 102.78 706.709 102.759 706.602 102.759 c
+706.404 102.759 706.253 102.825 706.146 102.964 c
+706.047 103.1 705.999 103.295 705.999 103.552 c
+705.999 105.404 l
+705.544 105.404 l
+705.544 105.801 l
+705.999 105.801 l
+705.999 106.522 l
+h
+709.627 103.669 m
+710.082 105.801 l
+710.568 105.801 l
+709.832 102.817 l
+709.45 102.817 l
+708.862 104.949 l
+708.289 102.817 l
+707.907 102.817 l
+707.172 105.801 l
+707.657 105.801 l
+708.127 103.729 l
+708.671 105.801 l
+709.053 105.801 l
+h
+710.733 104.448 m
+710.733 104.878 710.836 105.221 711.042 105.478 c
+711.254 105.732 711.534 105.86 711.879 105.86 c
+712.221 105.86 712.496 105.732 712.702 105.478 c
+712.916 105.231 713.03 104.897 713.041 104.479 c
+713.041 104.17 l
+713.041 103.736 712.93 103.394 712.717 103.141 c
+712.511 102.883 712.232 102.759 711.879 102.759 c
+711.534 102.759 711.262 102.879 711.056 103.126 c
+710.85 103.368 710.74 103.702 710.733 104.126 c
+h
+711.218 104.17 m
+711.218 103.854 711.277 103.611 711.395 103.434 c
+711.519 103.266 711.681 103.185 711.879 103.185 c
+712.309 103.185 712.534 103.494 712.555 104.111 c
+712.555 104.448 l
+712.555 104.75 712.49 104.993 712.365 105.169 c
+712.247 105.346 712.085 105.433 711.879 105.433 c
+711.681 105.433 711.519 105.346 711.395 105.169 c
+711.277 104.993 711.218 104.75 711.218 104.448 c
+h
+716.829 104.17 m
+716.829 103.7 716.745 103.347 716.579 103.112 c
+716.411 102.876 716.172 102.759 715.859 102.759 c
+715.554 102.759 715.322 102.869 715.168 103.097 c
+715.168 101.67 l
+714.683 101.67 l
+714.683 105.801 l
+715.124 105.801 l
+715.154 105.463 l
+715.308 105.728 715.539 105.86 715.844 105.86 c
+716.175 105.86 716.421 105.742 716.579 105.507 c
+716.745 105.279 716.829 104.941 716.829 104.493 c
+h
+716.344 104.448 m
+716.344 104.78 716.289 105.026 716.182 105.184 c
+716.083 105.338 715.921 105.419 715.698 105.419 c
+715.462 105.419 715.285 105.302 715.168 105.066 c
+715.168 103.523 l
+715.285 103.295 715.466 103.185 715.712 103.185 c
+715.925 103.185 716.083 103.262 716.182 103.42 c
+716.289 103.574 716.344 103.817 716.344 104.14 c
+h
+718.813 102.817 m
+718.784 102.883 718.762 102.994 718.755 103.141 c
+718.578 102.883 718.358 102.759 718.094 102.759 c
+717.818 102.759 717.601 102.832 717.446 102.979 c
+717.3 103.133 717.226 103.35 717.226 103.625 c
+717.226 103.927 717.329 104.17 717.535 104.346 c
+717.741 104.529 718.024 104.625 718.387 104.625 c
+718.74 104.625 l
+718.74 104.949 l
+718.74 105.125 718.699 105.246 718.622 105.316 c
+718.541 105.393 718.424 105.433 718.269 105.433 c
+718.123 105.433 717.998 105.389 717.903 105.302 c
+717.814 105.213 717.77 105.103 717.77 104.978 c
+717.285 104.978 l
+717.285 105.125 717.329 105.265 717.417 105.404 c
+717.506 105.551 717.623 105.662 717.77 105.742 c
+717.924 105.819 718.097 105.86 718.285 105.86 c
+718.597 105.86 718.832 105.78 718.99 105.624 c
+719.144 105.478 719.225 105.257 719.225 104.963 c
+719.225 103.464 l
+719.233 103.229 719.27 103.027 719.328 102.861 c
+719.328 102.817 l
+h
+718.167 103.199 m
+718.285 103.199 718.395 103.232 718.505 103.303 c
+718.611 103.368 718.689 103.453 718.74 103.552 c
+718.74 104.257 l
+718.476 104.257 l
+718.24 104.257 718.053 104.207 717.917 104.111 c
+717.789 104.012 717.726 103.868 717.726 103.685 c
+717.726 103.515 717.755 103.394 717.814 103.317 c
+717.88 103.236 717.998 103.199 718.167 103.199 c
+721.041 105.346 m
+720.97 105.352 720.897 105.36 720.82 105.36 c
+720.563 105.36 720.386 105.221 720.291 104.949 c
+720.291 102.817 l
+719.806 102.817 l
+719.806 105.801 l
+720.276 105.801 l
+720.291 105.493 l
+720.415 105.735 720.6 105.86 720.835 105.86 c
+720.912 105.86 720.974 105.845 721.026 105.816 c
+h
+722.418 102.759 m
+722.044 102.759 721.761 102.865 721.566 103.082 c
+721.367 103.306 721.272 103.633 721.272 104.066 c
+721.272 104.434 l
+721.272 104.876 721.364 105.221 721.552 105.478 c
+721.747 105.732 722.022 105.86 722.374 105.86 c
+722.716 105.86 722.969 105.746 723.139 105.522 c
+723.315 105.294 723.407 104.949 723.418 104.479 c
+723.418 104.17 l
+721.757 104.17 l
+721.757 104.096 l
+721.757 103.773 721.816 103.538 721.934 103.39 c
+722.051 103.251 722.22 103.185 722.448 103.185 c
+722.595 103.185 722.72 103.207 722.83 103.258 c
+722.936 103.317 723.04 103.405 723.139 103.523 c
+723.389 103.214 l
+723.183 102.909 722.859 102.759 722.418 102.759 c
+722.374 105.433 m
+722.169 105.433 722.015 105.364 721.919 105.228 c
+721.82 105.088 721.764 104.876 721.757 104.581 c
+722.933 104.581 l
+722.933 104.654 l
+722.911 104.926 722.859 105.125 722.771 105.242 c
+722.683 105.368 722.551 105.433 722.374 105.433 c
+724.286 105.801 m
+724.3 105.478 l
+724.484 105.732 724.726 105.86 725.02 105.86 c
+725.55 105.86 725.818 105.507 725.828 104.801 c
+725.828 102.817 l
+725.344 102.817 l
+725.344 104.772 l
+725.344 105.007 725.303 105.173 725.226 105.272 c
+725.145 105.368 725.028 105.419 724.873 105.419 c
+724.756 105.419 724.646 105.379 724.55 105.302 c
+724.451 105.221 724.374 105.114 724.315 104.978 c
+724.315 102.817 l
+723.829 102.817 l
+723.829 105.801 l
+h
+727.012 106.522 m
+727.012 105.801 l
+727.468 105.801 l
+727.468 105.404 l
+727.012 105.404 l
+727.012 103.552 l
+727.012 103.434 727.031 103.347 727.071 103.288 c
+727.108 103.229 727.177 103.199 727.276 103.199 c
+727.335 103.199 727.397 103.207 727.468 103.229 c
+727.468 102.817 l
+727.35 102.78 727.236 102.759 727.129 102.759 c
+726.931 102.759 726.78 102.825 726.674 102.964 c
+726.574 103.1 726.527 103.295 726.527 103.552 c
+726.527 105.404 l
+726.071 105.404 l
+726.071 105.801 l
+726.527 105.801 l
+726.527 106.522 l
+h
+729.375 103.582 m
+729.375 103.688 729.334 103.777 729.257 103.846 c
+729.176 103.923 729.026 104.012 728.802 104.111 c
+728.537 104.217 728.35 104.309 728.243 104.39 c
+728.133 104.467 728.056 104.556 728.008 104.654 c
+727.956 104.75 727.935 104.868 727.935 105.007 c
+727.935 105.25 728.022 105.452 728.199 105.61 c
+728.375 105.776 728.6 105.86 728.875 105.86 c
+729.169 105.86 729.404 105.772 729.581 105.595 c
+729.757 105.427 729.845 105.213 729.845 104.949 c
+729.36 104.949 l
+729.36 105.084 729.309 105.198 729.213 105.287 c
+729.125 105.383 729.011 105.433 728.875 105.433 c
+728.728 105.433 728.614 105.393 728.537 105.316 c
+728.456 105.246 728.419 105.147 728.419 105.022 c
+728.419 104.923 728.449 104.845 728.508 104.787 c
+728.567 104.728 728.706 104.647 728.934 104.552 c
+729.294 104.405 729.541 104.261 729.668 104.126 c
+729.805 103.997 729.874 103.824 729.874 103.611 c
+729.874 103.353 729.779 103.148 729.595 102.994 c
+729.419 102.836 729.184 102.759 728.889 102.759 c
+728.573 102.759 728.32 102.846 728.126 103.023 c
+727.938 103.207 727.846 103.438 727.846 103.714 c
+728.332 103.714 l
+728.338 103.545 728.39 103.413 728.478 103.317 c
+728.573 103.229 728.714 103.185 728.889 103.185 c
+729.044 103.185 729.161 103.218 729.242 103.288 c
+729.331 103.353 729.375 103.453 729.375 103.582 c
+730.878 103.949 m
+730.437 103.949 l
+730.408 106.83 l
+730.922 106.83 l
+h
+730.672 103.361 m
+730.767 103.361 730.838 103.332 730.878 103.272 c
+730.925 103.222 730.952 103.155 730.952 103.067 c
+730.952 102.987 730.925 102.92 730.878 102.861 c
+730.838 102.813 730.767 102.788 730.672 102.788 c
+730.584 102.788 730.514 102.813 730.466 102.861 c
+730.414 102.92 730.393 102.987 730.393 103.067 c
+730.393 103.155 730.414 103.222 730.466 103.272 c
+730.514 103.332 730.584 103.361 730.672 103.361 c
+f
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 734.152 110.909 cm
+0 0 m
+5.56 4.843 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 738.1018 114.3481 cm
+0 0 m
+-0.103 -1.502 l
+2.01 1.753 l
+-1.507 0.107 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 738.1018 114.3482 cm
+0 0 m
+-0.103 -1.502 l
+2.01 1.753 l
+-1.506 0.107 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 767.8644 128.2905 cm
+0 0 m
+-0.008 16.393 l
+6.46 16.393 l
+6.468 0 l
+3.227 -3.564 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 772.5238 142.4204 cm
+0 0 m
+-0.279 -0.03 l
+-0.055 -0.206 0.059 -0.434 0.059 -0.721 c
+0.059 -1.014 -0.081 -1.224 -0.353 -1.353 c
+-0.081 -1.518 0.059 -1.756 0.059 -2.072 c
+0.059 -2.602 -0.305 -2.87 -1.029 -2.881 c
+-2.984 -2.881 l
+-2.984 -2.103 l
+-1.073 -2.103 l
+-0.908 -2.103 -0.79 -2.076 -0.721 -2.029 c
+-0.643 -1.977 -0.603 -1.9 -0.603 -1.794 c
+-0.603 -1.646 -0.69 -1.532 -0.867 -1.455 c
+-0.956 -1.47 l
+-2.984 -1.47 l
+-2.984 -0.691 l
+-1.087 -0.691 l
+-0.912 -0.691 -0.79 -0.665 -0.721 -0.618 c
+-0.643 -0.566 -0.603 -0.485 -0.603 -0.368 c
+-0.603 -0.239 -0.676 -0.136 -0.823 -0.059 c
+-2.984 -0.059 l
+-2.984 0.72 l
+0 0.72 l
+h
+-2.984 -4.601 m
+-2.936 -4.572 -2.859 -4.546 -2.749 -4.528 c
+-2.947 -4.388 -3.042 -4.204 -3.042 -3.969 c
+-3.042 -3.712 -2.961 -3.502 -2.793 -3.337 c
+-2.627 -3.179 -2.41 -3.102 -2.146 -3.102 c
+-1.833 -3.102 -1.594 -3.198 -1.426 -3.396 c
+-1.249 -3.591 -1.161 -3.873 -1.161 -4.248 c
+-1.161 -4.499 l
+-0.926 -4.499 l
+-0.79 -4.499 -0.698 -4.472 -0.646 -4.424 c
+-0.588 -4.374 -0.559 -4.307 -0.559 -4.219 c
+-0.559 -4.021 -0.673 -3.925 -0.896 -3.925 c
+-0.896 -3.146 l
+-0.625 -3.146 -0.397 -3.248 -0.22 -3.454 c
+-0.037 -3.66 0.059 -3.925 0.059 -4.248 c
+0.059 -4.572 -0.029 -4.821 -0.206 -4.998 c
+-0.374 -5.182 -0.613 -5.278 -0.926 -5.278 c
+-2.337 -5.278 l
+-2.595 -5.278 -2.793 -5.31 -2.94 -5.38 c
+-2.984 -5.38 l
+h
+-2.425 -4.131 m
+-2.425 -4.219 -2.41 -4.293 -2.381 -4.351 c
+-2.344 -4.418 -2.3 -4.469 -2.249 -4.499 c
+-1.631 -4.499 l
+-1.631 -4.307 l
+-1.631 -4.167 -1.675 -4.061 -1.764 -3.984 c
+-1.845 -3.913 -1.955 -3.881 -2.102 -3.881 c
+-2.319 -3.881 -2.425 -3.961 -2.425 -4.131 c
+-2.19 -6.978 m
+-2.124 -6.978 -2.057 -6.942 -1.999 -6.876 c
+-1.94 -6.817 -1.866 -6.677 -1.779 -6.464 c
+-1.643 -6.141 -1.506 -5.92 -1.367 -5.802 c
+-1.231 -5.685 -1.058 -5.627 -0.852 -5.627 c
+-0.588 -5.627 -0.374 -5.718 -0.206 -5.906 c
+-0.029 -6.089 0.059 -6.34 0.059 -6.655 c
+0.059 -6.978 -0.029 -7.236 -0.206 -7.435 c
+-0.374 -7.629 -0.599 -7.728 -0.881 -7.728 c
+-0.881 -6.949 l
+-0.64 -6.949 -0.515 -6.847 -0.515 -6.641 c
+-0.515 -6.56 -0.544 -6.494 -0.603 -6.435 c
+-0.654 -6.383 -0.721 -6.361 -0.808 -6.361 c
+-0.878 -6.361 -0.937 -6.39 -0.985 -6.45 c
+-1.036 -6.508 -1.11 -6.644 -1.205 -6.861 c
+-1.323 -7.184 -1.455 -7.408 -1.602 -7.537 c
+-1.741 -7.674 -1.926 -7.743 -2.161 -7.743 c
+-2.425 -7.743 -2.643 -7.64 -2.807 -7.435 c
+-2.965 -7.236 -3.042 -6.978 -3.042 -6.655 c
+-3.042 -6.427 -2.998 -6.232 -2.911 -6.067 c
+-2.822 -5.898 -2.705 -5.766 -2.558 -5.671 c
+-2.404 -5.582 -2.234 -5.538 -2.057 -5.538 c
+-2.057 -6.273 l
+-2.198 -6.28 -2.3 -6.317 -2.367 -6.376 c
+-2.436 -6.435 -2.469 -6.531 -2.469 -6.67 c
+-2.469 -6.876 -2.377 -6.978 -2.19 -6.978 c
+0.735 -8.967 m
+0 -8.967 l
+0 -9.363 l
+-0.588 -9.363 l
+-0.588 -8.967 l
+-2.072 -8.967 l
+-2.19 -8.967 -2.275 -8.981 -2.323 -9.01 c
+-2.363 -9.047 -2.381 -9.114 -2.381 -9.202 c
+-2.381 -9.279 -2.373 -9.342 -2.352 -9.393 c
+-2.969 -9.378 l
+-3.017 -9.249 -3.042 -9.106 -3.042 -8.952 c
+-3.042 -8.453 -2.756 -8.195 -2.175 -8.187 c
+-0.588 -8.187 l
+-0.588 -7.85 l
+0 -7.85 l
+0 -8.187 l
+0.735 -8.187 l
+h
+-3.042 -10.874 m
+-3.042 -10.469 -2.925 -10.157 -2.69 -9.933 c
+-2.447 -9.716 -2.102 -9.61 -1.661 -9.61 c
+-1.411 -9.61 l
+-0.941 -9.61 -0.58 -9.712 -0.324 -9.918 c
+-0.07 -10.124 0.059 -10.418 0.059 -10.801 c
+0.059 -11.171 -0.066 -11.451 -0.309 -11.638 c
+-0.544 -11.833 -0.896 -11.932 -1.367 -11.932 c
+-1.749 -11.932 l
+-1.749 -10.389 l
+-1.976 -10.396 -2.142 -10.44 -2.249 -10.521 c
+-2.348 -10.61 -2.396 -10.745 -2.396 -10.932 c
+-2.396 -11.186 -2.304 -11.403 -2.117 -11.58 c
+-2.602 -11.888 l
+-2.73 -11.789 -2.837 -11.645 -2.925 -11.462 c
+-3.002 -11.285 -3.042 -11.087 -3.042 -10.874 c
+-1.205 -10.389 m
+-1.205 -11.168 l
+-1.132 -11.168 l
+-0.956 -11.168 -0.823 -11.138 -0.735 -11.08 c
+-0.64 -11.021 -0.588 -10.922 -0.588 -10.786 c
+-0.588 -10.657 -0.64 -10.558 -0.735 -10.492 c
+-0.834 -10.433 -0.992 -10.396 -1.205 -10.389 c
+-0.75 -13.66 m
+-0.735 -13.409 l
+-0.735 -13.193 -0.831 -13.045 -1.014 -12.968 c
+-2.984 -12.968 l
+-2.984 -12.189 l
+0 -12.189 l
+0 -12.925 l
+-0.324 -12.954 l
+-0.07 -13.072 0.059 -13.237 0.059 -13.454 c
+0.059 -13.542 0.044 -13.615 0.015 -13.674 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 774.5925 108.726 cm
+0 0 m
+0.008 -14.188 l
+-6.464 -14.188 l
+-6.471 0 l
+-3.23 3.564 l
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 769.4918 104.7137 cm
+0 0 m
+0 0.808 l
+1.721 0.808 l
+1.721 1.999 l
+0 1.999 l
+0 2.807 l
+4.013 2.807 l
+4.013 1.999 l
+2.396 1.999 l
+2.396 0.808 l
+4.013 0.808 l
+4.013 0 l
+h
+1.735 -2.496 m
+1.735 -1.231 l
+0.676 -1.231 l
+0.676 -2.731 l
+0 -2.731 l
+0 -0.423 l
+4.013 -0.423 l
+4.013 -2.716 l
+3.337 -2.716 l
+3.337 -1.231 l
+2.396 -1.231 l
+2.396 -2.496 l
+h
+0.823 -4.917 m
+0.823 -3.815 l
+0 -3.595 l
+0 -2.741 l
+4.013 -3.991 l
+4.013 -4.74 l
+0 -6.005 l
+0 -5.137 l
+h
+1.5 -3.991 m
+1.5 -4.74 l
+2.926 -4.373 l
+h
+0 -6.155 m
+4.013 -6.155 l
+4.013 -7.214 l
+4.013 -7.684 3.859 -8.056 3.558 -8.331 c
+3.263 -8.614 2.856 -8.757 2.338 -8.757 c
+1.69 -8.757 l
+1.162 -8.757 0.743 -8.617 0.441 -8.345 c
+0.148 -8.07 0 -7.688 0 -7.199 c
+h
+3.337 -6.964 m
+0.676 -6.964 l
+0.676 -7.214 l
+0.676 -7.479 0.743 -7.662 0.882 -7.772 c
+1.029 -7.89 1.272 -7.949 1.617 -7.949 c
+2.323 -7.949 l
+2.694 -7.949 2.955 -7.894 3.102 -7.787 c
+3.249 -7.688 3.326 -7.512 3.337 -7.258 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 733.9356 155.8438 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.559 -3.572 l
+-1.559 0 l
+-2.617 0 l
+-2.617 0.441 l
+0 0.441 l
+h
+0.823 -0.897 m
+1.007 -0.654 1.242 -0.529 1.529 -0.529 c
+2.057 -0.529 2.326 -0.881 2.337 -1.587 c
+2.337 -3.572 l
+1.851 -3.572 l
+1.851 -1.616 l
+1.851 -1.381 1.811 -1.216 1.734 -1.117 c
+1.653 -1.022 1.535 -0.97 1.381 -0.97 c
+1.263 -0.97 1.153 -1.01 1.058 -1.087 c
+0.959 -1.168 0.882 -1.275 0.823 -1.411 c
+0.823 -3.572 l
+0.338 -3.572 l
+0.338 0.661 l
+0.823 0.661 l
+h
+3.41 -3.572 -0.5 2.984 re
+3.439 0.206 m
+3.439 0.118 3.413 0.044 3.366 -0.014 c
+3.326 -0.066 3.255 -0.087 3.16 -0.087 c
+3.072 -0.087 3.002 -0.066 2.954 -0.014 c
+2.913 0.044 2.896 0.11 2.896 0.191 c
+2.896 0.279 2.913 0.353 2.954 0.412 c
+3.002 0.47 3.072 0.5 3.16 0.5 c
+3.255 0.5 3.326 0.47 3.366 0.412 c
+3.413 0.353 3.439 0.283 3.439 0.206 c
+5.523 -2.807 m
+5.523 -2.701 5.483 -2.612 5.406 -2.543 c
+5.325 -2.466 5.174 -2.377 4.949 -2.278 c
+4.685 -2.171 4.498 -2.08 4.391 -1.999 c
+4.28 -1.922 4.203 -1.833 4.156 -1.734 c
+4.104 -1.639 4.082 -1.521 4.082 -1.381 c
+4.082 -1.139 4.17 -0.937 4.347 -0.779 c
+4.523 -0.613 4.747 -0.529 5.023 -0.529 c
+5.317 -0.529 5.552 -0.617 5.728 -0.793 c
+5.905 -0.962 5.994 -1.176 5.994 -1.44 c
+5.508 -1.44 l
+5.508 -1.304 5.456 -1.19 5.361 -1.103 c
+5.273 -1.007 5.159 -0.955 5.023 -0.955 c
+4.876 -0.955 4.762 -0.995 4.685 -1.072 c
+4.604 -1.143 4.567 -1.242 4.567 -1.367 c
+4.567 -1.466 4.596 -1.543 4.656 -1.602 c
+4.714 -1.66 4.854 -1.741 5.082 -1.837 c
+5.442 -1.984 5.688 -2.127 5.817 -2.263 c
+5.953 -2.392 6.023 -2.564 6.023 -2.778 c
+6.023 -3.035 5.927 -3.241 5.743 -3.395 c
+5.567 -3.553 5.332 -3.63 5.038 -3.63 c
+4.722 -3.63 4.469 -3.542 4.274 -3.366 c
+4.086 -3.183 3.994 -2.95 3.994 -2.675 c
+4.479 -2.675 l
+4.486 -2.844 4.538 -2.977 4.627 -3.072 c
+4.722 -3.16 4.862 -3.204 5.038 -3.204 c
+5.192 -3.204 5.31 -3.171 5.39 -3.102 c
+5.479 -3.035 5.523 -2.936 5.523 -2.807 c
+8.213 -3.572 -0.499 2.984 re
+8.242 0.206 m
+8.242 0.118 8.216 0.044 8.168 -0.014 c
+8.128 -0.066 8.058 -0.087 7.962 -0.087 c
+7.875 -0.087 7.804 -0.066 7.757 -0.014 c
+7.717 0.044 7.698 0.11 7.698 0.191 c
+7.698 0.279 7.717 0.353 7.757 0.412 c
+7.804 0.47 7.875 0.5 7.962 0.5 c
+8.058 0.5 8.128 0.47 8.168 0.412 c
+8.216 0.353 8.242 0.283 8.242 0.206 c
+10.329 -2.807 m
+10.329 -2.701 10.289 -2.612 10.212 -2.543 c
+10.131 -2.466 9.98 -2.377 9.756 -2.278 c
+9.491 -2.171 9.304 -2.08 9.198 -1.999 c
+9.088 -1.922 9.01 -1.833 8.962 -1.734 c
+8.911 -1.639 8.889 -1.521 8.889 -1.381 c
+8.889 -1.139 8.978 -0.937 9.153 -0.779 c
+9.33 -0.613 9.554 -0.529 9.83 -0.529 c
+10.123 -0.529 10.359 -0.617 10.535 -0.793 c
+10.711 -0.962 10.8 -1.176 10.8 -1.44 c
+10.314 -1.44 l
+10.314 -1.304 10.264 -1.19 10.168 -1.103 c
+10.079 -1.007 9.965 -0.955 9.83 -0.955 c
+9.683 -0.955 9.568 -0.995 9.491 -1.072 c
+9.41 -1.143 9.374 -1.242 9.374 -1.367 c
+9.374 -1.466 9.404 -1.543 9.462 -1.602 c
+9.521 -1.66 9.66 -1.741 9.888 -1.837 c
+10.248 -1.984 10.495 -2.127 10.624 -2.263 c
+10.759 -2.392 10.829 -2.564 10.829 -2.778 c
+10.829 -3.035 10.734 -3.241 10.549 -3.395 c
+10.374 -3.553 10.138 -3.63 9.844 -3.63 c
+9.528 -3.63 9.275 -3.542 9.08 -3.366 c
+8.893 -3.183 8.801 -2.95 8.801 -2.675 c
+9.286 -2.675 l
+9.293 -2.844 9.344 -2.977 9.433 -3.072 c
+9.528 -3.16 9.668 -3.204 9.844 -3.204 c
+9.998 -3.204 10.116 -3.171 10.197 -3.102 c
+10.285 -3.035 10.329 -2.936 10.329 -2.807 c
+14.019 -3.572 m
+13.99 -3.505 13.967 -3.395 13.96 -3.248 c
+13.784 -3.505 13.564 -3.63 13.298 -3.63 c
+13.023 -3.63 12.806 -3.557 12.652 -3.41 c
+12.505 -3.256 12.431 -3.039 12.431 -2.763 c
+12.431 -2.462 12.534 -2.219 12.74 -2.043 c
+12.945 -1.859 13.229 -1.764 13.593 -1.764 c
+13.946 -1.764 l
+13.946 -1.44 l
+13.946 -1.263 13.905 -1.143 13.828 -1.072 c
+13.747 -0.995 13.63 -0.955 13.475 -0.955 c
+13.328 -0.955 13.203 -0.999 13.107 -1.087 c
+13.019 -1.176 12.976 -1.286 12.976 -1.411 c
+12.49 -1.411 l
+12.49 -1.263 12.534 -1.124 12.623 -0.985 c
+12.71 -0.837 12.828 -0.727 12.976 -0.646 c
+13.13 -0.569 13.302 -0.529 13.489 -0.529 c
+13.802 -0.529 14.037 -0.61 14.195 -0.764 c
+14.349 -0.911 14.43 -1.132 14.43 -1.425 c
+14.43 -2.925 l
+14.438 -3.16 14.474 -3.362 14.534 -3.528 c
+14.534 -3.572 l
+h
+13.372 -3.189 m
+13.489 -3.189 13.6 -3.156 13.71 -3.087 c
+13.817 -3.021 13.894 -2.936 13.946 -2.836 c
+13.946 -2.131 l
+13.681 -2.131 l
+13.446 -2.131 13.258 -2.183 13.122 -2.278 c
+12.994 -2.377 12.931 -2.52 12.931 -2.705 c
+12.931 -2.873 12.961 -2.994 13.019 -3.072 c
+13.086 -3.152 13.203 -3.189 13.372 -3.189 c
+15.54 -3.572 -0.5 4.233 re
+17.653 -2.807 m
+17.653 -2.701 17.613 -2.612 17.535 -2.543 c
+17.455 -2.466 17.304 -2.377 17.08 -2.278 c
+16.816 -2.171 16.628 -2.08 16.521 -1.999 c
+16.411 -1.922 16.334 -1.833 16.286 -1.734 c
+16.234 -1.639 16.213 -1.521 16.213 -1.381 c
+16.213 -1.139 16.301 -0.937 16.477 -0.779 c
+16.654 -0.613 16.878 -0.529 17.153 -0.529 c
+17.447 -0.529 17.682 -0.617 17.859 -0.793 c
+18.035 -0.962 18.123 -1.176 18.123 -1.44 c
+17.639 -1.44 l
+17.639 -1.304 17.587 -1.19 17.491 -1.103 c
+17.404 -1.007 17.289 -0.955 17.153 -0.955 c
+17.007 -0.955 16.893 -0.995 16.816 -1.072 c
+16.735 -1.143 16.698 -1.242 16.698 -1.367 c
+16.698 -1.466 16.727 -1.543 16.786 -1.602 c
+16.845 -1.66 16.984 -1.741 17.212 -1.837 c
+17.572 -1.984 17.819 -2.127 17.947 -2.263 c
+18.083 -2.392 18.153 -2.564 18.153 -2.778 c
+18.153 -3.035 18.057 -3.241 17.874 -3.395 c
+17.697 -3.553 17.462 -3.63 17.169 -3.63 c
+16.852 -3.63 16.598 -3.542 16.404 -3.366 c
+16.216 -3.183 16.124 -2.95 16.124 -2.675 c
+16.61 -2.675 l
+16.617 -2.844 16.668 -2.977 16.756 -3.072 c
+16.852 -3.16 16.992 -3.204 17.169 -3.204 c
+17.323 -3.204 17.44 -3.171 17.521 -3.102 c
+17.609 -3.035 17.653 -2.936 17.653 -2.807 c
+18.509 -1.94 m
+18.509 -1.51 18.613 -1.168 18.818 -0.911 c
+19.031 -0.658 19.311 -0.529 19.656 -0.529 c
+19.997 -0.529 20.273 -0.658 20.479 -0.911 c
+20.693 -1.157 20.806 -1.492 20.817 -1.911 c
+20.817 -2.219 l
+20.817 -2.653 20.707 -2.994 20.494 -3.248 c
+20.288 -3.505 20.009 -3.63 19.656 -3.63 c
+19.311 -3.63 19.039 -3.509 18.833 -3.262 c
+18.627 -3.021 18.517 -2.686 18.509 -2.263 c
+h
+18.995 -2.219 m
+18.995 -2.535 19.053 -2.778 19.17 -2.954 c
+19.296 -3.123 19.457 -3.204 19.656 -3.204 c
+20.086 -3.204 20.31 -2.896 20.332 -2.278 c
+20.332 -1.94 l
+20.332 -1.639 20.266 -1.396 20.141 -1.22 c
+20.024 -1.043 19.862 -0.955 19.656 -0.955 c
+19.457 -0.955 19.296 -1.043 19.17 -1.22 c
+19.053 -1.396 18.995 -1.639 18.995 -1.94 c
+h
+f
+Q
+q 1 0 0 1 727.6223 145.6867 cm
+0 0 m
+-0.03 0.067 -0.052 0.177 -0.059 0.324 c
+-0.235 0.067 -0.456 -0.058 -0.721 -0.058 c
+-0.996 -0.058 -1.213 0.015 -1.367 0.162 c
+-1.515 0.316 -1.588 0.533 -1.588 0.809 c
+-1.588 1.11 -1.485 1.353 -1.279 1.529 c
+-1.073 1.713 -0.79 1.808 -0.426 1.808 c
+-0.074 1.808 l
+-0.074 2.132 l
+-0.074 2.309 -0.114 2.429 -0.191 2.5 c
+-0.272 2.577 -0.389 2.617 -0.545 2.617 c
+-0.691 2.617 -0.817 2.573 -0.912 2.484 c
+-1 2.396 -1.044 2.286 -1.044 2.161 c
+-1.529 2.161 l
+-1.529 2.309 -1.485 2.448 -1.397 2.587 c
+-1.309 2.735 -1.191 2.845 -1.044 2.926 c
+-0.89 3.003 -0.717 3.043 -0.53 3.043 c
+-0.217 3.043 0.018 2.962 0.176 2.808 c
+0.33 2.661 0.411 2.44 0.411 2.147 c
+0.411 0.647 l
+0.419 0.412 0.455 0.21 0.515 0.044 c
+0.515 0 l
+h
+-0.647 0.383 m
+-0.53 0.383 -0.42 0.416 -0.309 0.485 c
+-0.202 0.551 -0.125 0.636 -0.074 0.736 c
+-0.074 1.441 l
+-0.339 1.441 l
+-0.574 1.441 -0.761 1.389 -0.896 1.294 c
+-1.025 1.195 -1.088 1.052 -1.088 0.867 c
+-1.088 0.699 -1.058 0.578 -1 0.5 c
+-0.934 0.42 -0.817 0.383 -0.647 0.383 c
+2.726 0 -0.5 4.233 re
+3.296 1.632 m
+3.296 2.062 3.399 2.404 3.605 2.661 c
+3.818 2.914 4.097 3.043 4.442 3.043 c
+4.785 3.043 5.06 2.914 5.265 2.661 c
+5.479 2.415 5.593 2.08 5.604 1.661 c
+5.604 1.353 l
+5.604 0.919 5.493 0.578 5.28 0.324 c
+5.074 0.067 4.795 -0.058 4.442 -0.058 c
+4.097 -0.058 3.825 0.063 3.619 0.31 c
+3.414 0.551 3.303 0.886 3.296 1.309 c
+h
+3.781 1.353 m
+3.781 1.037 3.84 0.794 3.958 0.618 c
+4.082 0.449 4.244 0.368 4.442 0.368 c
+4.872 0.368 5.097 0.676 5.119 1.294 c
+5.119 1.632 l
+5.119 1.933 5.053 2.176 4.928 2.352 c
+4.81 2.529 4.648 2.617 4.442 2.617 c
+4.244 2.617 4.082 2.529 3.958 2.352 c
+3.84 2.176 3.781 1.933 3.781 1.632 c
+h
+7.073 0.368 m
+7.239 0.368 7.372 0.416 7.47 0.515 c
+7.566 0.611 7.621 0.754 7.632 0.941 c
+8.088 0.941 l
+8.077 0.655 7.974 0.416 7.779 0.221 c
+7.592 0.034 7.357 -0.058 7.073 -0.058 c
+6.709 -0.058 6.431 0.059 6.236 0.294 c
+6.038 0.53 5.942 0.875 5.942 1.338 c
+5.942 1.661 l
+5.942 2.11 6.034 2.455 6.221 2.691 c
+6.416 2.926 6.699 3.043 7.073 3.043 c
+7.374 3.043 7.617 2.944 7.794 2.749 c
+7.977 2.55 8.077 2.286 8.088 1.956 c
+7.632 1.956 l
+7.61 2.18 7.551 2.345 7.455 2.455 c
+7.368 2.562 7.239 2.617 7.073 2.617 c
+6.857 2.617 6.695 2.544 6.589 2.396 c
+6.489 2.257 6.434 2.029 6.427 1.706 c
+6.427 1.324 l
+6.427 0.971 6.474 0.721 6.574 0.574 c
+6.68 0.434 6.846 0.368 7.073 0.368 c
+10.01 0 m
+9.98 0.067 9.959 0.177 9.951 0.324 c
+9.774 0.067 9.554 -0.058 9.29 -0.058 c
+9.014 -0.058 8.797 0.015 8.643 0.162 c
+8.496 0.316 8.422 0.533 8.422 0.809 c
+8.422 1.11 8.525 1.353 8.731 1.529 c
+8.937 1.713 9.219 1.808 9.583 1.808 c
+9.936 1.808 l
+9.936 2.132 l
+9.936 2.309 9.896 2.429 9.819 2.5 c
+9.738 2.577 9.62 2.617 9.466 2.617 c
+9.319 2.617 9.194 2.573 9.098 2.484 c
+9.01 2.396 8.966 2.286 8.966 2.161 c
+8.481 2.161 l
+8.481 2.309 8.525 2.448 8.613 2.587 c
+8.702 2.735 8.819 2.845 8.966 2.926 c
+9.12 3.003 9.294 3.043 9.481 3.043 c
+9.793 3.043 10.028 2.962 10.186 2.808 c
+10.341 2.661 10.422 2.44 10.422 2.147 c
+10.422 0.647 l
+10.429 0.412 10.466 0.21 10.524 0.044 c
+10.524 0 l
+h
+9.363 0.383 m
+9.481 0.383 9.591 0.416 9.701 0.485 c
+9.807 0.551 9.884 0.636 9.936 0.736 c
+9.936 1.441 l
+9.672 1.441 l
+9.437 1.441 9.249 1.389 9.113 1.294 c
+8.984 1.195 8.922 1.052 8.922 0.867 c
+8.922 0.699 8.951 0.578 9.01 0.5 c
+9.076 0.42 9.194 0.383 9.363 0.383 c
+11.531 0 -0.5 4.233 re
+15.573 1.353 m
+15.573 0.882 15.488 0.53 15.324 0.294 c
+15.154 0.059 14.912 -0.058 14.588 -0.058 c
+14.272 -0.058 14.037 0.077 13.883 0.353 c
+13.853 0 l
+13.412 0 l
+13.412 4.233 l
+13.898 4.233 l
+13.898 2.661 l
+14.052 2.914 14.283 3.043 14.588 3.043 c
+14.912 3.043 15.154 2.926 15.324 2.691 c
+15.488 2.455 15.573 2.106 15.573 1.646 c
+h
+15.089 1.632 m
+15.089 1.985 15.037 2.234 14.941 2.382 c
+14.842 2.529 14.68 2.602 14.456 2.602 c
+14.21 2.602 14.023 2.463 13.898 2.191 c
+13.898 0.78 l
+14.015 0.515 14.206 0.383 14.47 0.383 c
+14.684 0.383 14.842 0.456 14.941 0.603 c
+15.037 0.757 15.089 1 15.089 1.324 c
+h
+17.249 2.529 m
+17.179 2.536 17.105 2.544 17.028 2.544 c
+16.772 2.544 16.595 2.404 16.5 2.132 c
+16.5 0 l
+16.014 0 l
+16.014 2.984 l
+16.485 2.984 l
+16.5 2.675 l
+16.624 2.918 16.808 3.043 17.043 3.043 c
+17.121 3.043 17.183 3.028 17.234 2.999 c
+h
+19.046 0 m
+19.016 0.067 18.994 0.177 18.987 0.324 c
+18.811 0.067 18.59 -0.058 18.326 -0.058 c
+18.05 -0.058 17.834 0.015 17.679 0.162 c
+17.532 0.316 17.458 0.533 17.458 0.809 c
+17.458 1.11 17.562 1.353 17.767 1.529 c
+17.973 1.713 18.256 1.808 18.62 1.808 c
+18.973 1.808 l
+18.973 2.132 l
+18.973 2.309 18.932 2.429 18.855 2.5 c
+18.774 2.577 18.657 2.617 18.503 2.617 c
+18.355 2.617 18.231 2.573 18.135 2.484 c
+18.046 2.396 18.002 2.286 18.002 2.161 c
+17.518 2.161 l
+17.518 2.309 17.562 2.448 17.649 2.587 c
+17.738 2.735 17.855 2.845 18.002 2.926 c
+18.156 3.003 18.329 3.043 18.517 3.043 c
+18.829 3.043 19.064 2.962 19.222 2.808 c
+19.376 2.661 19.457 2.44 19.457 2.147 c
+19.457 0.647 l
+19.465 0.412 19.502 0.21 19.561 0.044 c
+19.561 0 l
+h
+18.399 0.383 m
+18.517 0.383 18.627 0.416 18.738 0.485 c
+18.844 0.551 18.921 0.636 18.973 0.736 c
+18.973 1.441 l
+18.708 1.441 l
+18.472 1.441 18.285 1.389 18.15 1.294 c
+18.021 1.195 17.958 1.052 17.958 0.867 c
+17.958 0.699 17.988 0.578 18.046 0.5 c
+18.113 0.42 18.231 0.383 18.399 0.383 c
+20.494 2.984 m
+20.508 2.661 l
+20.693 2.914 20.935 3.043 21.229 3.043 c
+21.758 3.043 22.026 2.691 22.037 1.985 c
+22.037 0 l
+21.552 0 l
+21.552 1.956 l
+21.552 2.191 21.512 2.356 21.435 2.455 c
+21.354 2.55 21.236 2.602 21.082 2.602 c
+20.964 2.602 20.854 2.562 20.758 2.484 c
+20.66 2.404 20.582 2.297 20.523 2.161 c
+20.523 0 l
+20.038 0 l
+20.038 2.984 l
+h
+23.617 0.368 m
+23.783 0.368 23.915 0.416 24.014 0.515 c
+24.11 0.611 24.165 0.754 24.176 0.941 c
+24.631 0.941 l
+24.62 0.655 24.518 0.416 24.323 0.221 c
+24.136 0.034 23.9 -0.058 23.617 -0.058 c
+23.253 -0.058 22.974 0.059 22.779 0.294 c
+22.582 0.53 22.486 0.875 22.486 1.338 c
+22.486 1.661 l
+22.486 2.11 22.578 2.455 22.765 2.691 c
+22.96 2.926 23.243 3.043 23.617 3.043 c
+23.918 3.043 24.161 2.944 24.338 2.749 c
+24.521 2.55 24.62 2.286 24.631 1.956 c
+24.176 1.956 l
+24.154 2.18 24.095 2.345 23.999 2.455 c
+23.912 2.562 23.783 2.617 23.617 2.617 c
+23.401 2.617 23.239 2.544 23.132 2.396 c
+23.033 2.257 22.978 2.029 22.971 1.706 c
+22.971 1.324 l
+22.971 0.971 23.018 0.721 23.118 0.574 c
+23.224 0.434 23.39 0.368 23.617 0.368 c
+25.514 2.675 m
+25.697 2.918 25.932 3.043 26.219 3.043 c
+26.748 3.043 27.016 2.691 27.027 1.985 c
+27.027 0 l
+26.542 0 l
+26.542 1.956 l
+26.542 2.191 26.502 2.356 26.424 2.455 c
+26.344 2.55 26.227 2.602 26.072 2.602 c
+25.954 2.602 25.844 2.562 25.749 2.484 c
+25.649 2.404 25.572 2.297 25.514 2.161 c
+25.514 0 l
+25.028 0 l
+25.028 4.233 l
+25.514 4.233 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 757.5933 146.8594 cm
+0 0 m
+7.559 -2.874 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 763.1567 144.7467 cm
+0 0 m
+-1.378 -0.622 l
+2.492 -0.949 l
+-0.617 1.374 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 763.1568 144.7467 cm
+0 0 m
+-1.378 -0.622 l
+2.492 -0.949 l
+-0.617 1.374 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 710.7031 92.4728 cm
+0 0 m
+0.809 2.014 l
+1.382 2.014 l
+0.25 -0.5 l
+0.25 -1.999 l
+-0.264 -1.999 l
+-0.264 -0.5 l
+-1.396 2.014 l
+-0.823 2.014 l
+h
+1.382 -0.368 m
+1.382 0.062 1.484 0.405 1.691 0.661 c
+1.904 0.915 2.183 1.043 2.529 1.043 c
+2.87 1.043 3.146 0.915 3.352 0.661 c
+3.564 0.415 3.678 0.081 3.69 -0.338 c
+3.69 -0.647 l
+3.69 -1.08 3.58 -1.422 3.366 -1.675 c
+3.161 -1.933 2.881 -2.058 2.529 -2.058 c
+2.183 -2.058 1.912 -1.937 1.706 -1.691 c
+1.5 -1.448 1.389 -1.114 1.382 -0.691 c
+h
+1.867 -0.647 m
+1.867 -0.962 1.926 -1.205 2.043 -1.382 c
+2.168 -1.55 2.33 -1.631 2.529 -1.631 c
+2.959 -1.631 3.183 -1.323 3.204 -0.706 c
+3.204 -0.368 l
+3.204 -0.066 3.138 0.176 3.013 0.353 c
+2.896 0.529 2.734 0.617 2.529 0.617 c
+2.33 0.617 2.168 0.529 2.043 0.353 c
+1.926 0.176 1.867 -0.066 1.867 -0.368 c
+h
+5.644 -1.735 m
+5.486 -1.951 5.251 -2.058 4.939 -2.058 c
+4.675 -2.058 4.469 -1.966 4.322 -1.779 c
+4.183 -1.595 4.116 -1.319 4.116 -0.956 c
+4.116 0.985 l
+4.601 0.985 l
+4.601 -0.926 l
+4.601 -1.389 4.74 -1.617 5.027 -1.617 c
+5.321 -1.617 5.519 -1.484 5.63 -1.22 c
+5.63 0.985 l
+6.13 0.985 l
+6.13 -1.999 l
+5.659 -1.999 l
+h
+7.915 0.529 m
+7.846 0.536 7.772 0.544 7.695 0.544 c
+7.437 0.544 7.262 0.405 7.166 0.133 c
+7.166 -1.999 l
+6.681 -1.999 l
+6.681 0.985 l
+7.151 0.985 l
+7.166 0.676 l
+7.291 0.919 7.475 1.043 7.71 1.043 c
+7.787 1.043 7.85 1.029 7.901 0.999 c
+h
+f
+Q
+q 1 0 0 1 722.2789 91.7823 cm
+0 0 m
+0.264 1.675 l
+1.014 1.675 l
+0.397 -1.309 l
+-0.25 -1.309 l
+-0.676 0.411 l
+-1.088 -1.309 l
+-1.749 -1.309 l
+-2.367 1.675 l
+-1.617 1.675 l
+-1.353 0 l
+-0.956 1.675 l
+-0.397 1.675 l
+h
+1.073 0.278 m
+1.073 0.727 1.18 1.08 1.396 1.337 c
+1.61 1.602 1.903 1.734 2.279 1.734 c
+2.66 1.734 2.955 1.602 3.16 1.337 c
+3.373 1.08 3.484 0.727 3.484 0.278 c
+3.484 0.087 l
+3.484 -0.375 3.373 -0.732 3.16 -0.985 c
+2.955 -1.243 2.66 -1.368 2.279 -1.368 c
+1.897 -1.368 1.595 -1.243 1.382 -0.985 c
+1.176 -0.721 1.073 -0.364 1.073 0.087 c
+h
+1.852 0.087 m
+1.852 -0.452 1.992 -0.721 2.279 -0.721 c
+2.543 -0.721 2.682 -0.497 2.705 -0.044 c
+2.72 0.278 l
+2.72 0.551 2.679 0.753 2.602 0.881 c
+2.521 1.018 2.414 1.087 2.279 1.087 c
+2.15 1.087 2.047 1.018 1.97 0.881 c
+1.889 0.753 1.852 0.551 1.852 0.278 c
+h
+5.255 0.926 m
+5.005 0.941 l
+4.788 0.941 4.642 0.845 4.564 0.661 c
+4.564 -1.309 l
+3.785 -1.309 l
+3.785 1.675 l
+4.52 1.675 l
+4.549 1.352 l
+4.667 1.606 4.833 1.734 5.049 1.734 c
+5.137 1.734 5.211 1.72 5.269 1.69 c
+h
+6.533 -0.162 m
+6.313 -0.397 l
+6.313 -1.309 l
+5.534 -1.309 l
+5.534 2.925 l
+6.313 2.925 l
+6.313 0.631 l
+6.416 0.779 l
+6.96 1.675 l
+7.886 1.675 l
+7.019 0.44 l
+7.975 -1.309 l
+7.077 -1.309 l
+h
+8.878 -1.309 -0.779 2.984 re
+8.055 2.439 m
+8.055 2.564 8.091 2.668 8.172 2.748 c
+8.249 2.826 8.353 2.865 8.482 2.865 c
+8.606 2.865 8.709 2.826 8.79 2.748 c
+8.867 2.668 8.908 2.564 8.908 2.439 c
+8.908 2.322 8.867 2.223 8.79 2.146 c
+8.72 2.065 8.617 2.028 8.482 2.028 c
+8.353 2.028 8.249 2.065 8.172 2.146 c
+8.091 2.223 8.055 2.322 8.055 2.439 c
+10.102 1.675 m
+10.117 1.381 l
+10.293 1.616 10.521 1.734 10.807 1.734 c
+11.326 1.734 11.59 1.371 11.601 0.646 c
+11.601 -1.309 l
+10.822 -1.309 l
+10.822 0.588 l
+10.822 0.764 10.797 0.885 10.749 0.955 c
+10.697 1.032 10.609 1.072 10.484 1.072 c
+10.337 1.072 10.223 0.999 10.146 0.852 c
+10.146 -1.309 l
+9.367 -1.309 l
+9.367 1.675 l
+h
+11.884 0.278 m
+11.884 0.768 11.973 1.132 12.149 1.367 c
+12.325 1.61 12.567 1.734 12.883 1.734 c
+13.155 1.734 13.369 1.624 13.516 1.411 c
+13.545 1.675 l
+14.25 1.675 l
+14.25 -1.309 l
+14.25 -1.691 14.14 -1.977 13.928 -2.176 c
+13.71 -2.382 13.406 -2.484 13.016 -2.484 c
+12.847 -2.484 12.671 -2.448 12.486 -2.382 c
+12.311 -2.323 12.178 -2.238 12.089 -2.132 c
+12.355 -1.603 l
+12.432 -1.669 12.531 -1.727 12.648 -1.779 c
+12.766 -1.827 12.873 -1.852 12.972 -1.852 c
+13.149 -1.852 13.273 -1.808 13.354 -1.721 c
+13.431 -1.64 13.471 -1.507 13.471 -1.324 c
+13.471 -1.073 l
+13.325 -1.272 13.126 -1.368 12.883 -1.368 c
+12.567 -1.368 12.325 -1.246 12.149 -1 c
+11.973 -0.746 11.884 -0.393 11.884 0.058 c
+h
+12.663 0.073 m
+12.663 -0.202 12.696 -0.405 12.766 -0.53 c
+12.843 -0.647 12.961 -0.706 13.119 -0.706 c
+13.273 -0.706 13.391 -0.655 13.471 -0.545 c
+13.471 0.881 l
+13.391 1.007 13.273 1.072 13.119 1.072 c
+12.961 1.072 12.843 1.007 12.766 0.881 c
+12.696 0.753 12.663 0.551 12.663 0.278 c
+h
+15.739 0.278 m
+15.739 0.768 15.819 1.132 15.989 1.367 c
+16.154 1.61 16.393 1.734 16.709 1.734 c
+16.945 1.734 17.136 1.631 17.282 1.425 c
+17.282 2.925 l
+18.076 2.925 l
+18.076 -1.309 l
+17.356 -1.309 l
+17.327 -1 l
+17.169 -1.246 16.962 -1.368 16.709 -1.368 c
+16.393 -1.368 16.154 -1.25 15.989 -1.015 c
+15.831 -0.772 15.746 -0.42 15.739 0.043 c
+h
+16.518 0.073 m
+16.518 -0.221 16.548 -0.427 16.606 -0.545 c
+16.673 -0.655 16.783 -0.706 16.93 -0.706 c
+17.084 -0.706 17.201 -0.64 17.282 -0.5 c
+17.282 0.852 l
+17.201 0.999 17.091 1.072 16.945 1.072 c
+16.797 1.072 16.687 1.014 16.621 0.897 c
+16.551 0.786 16.518 0.58 16.518 0.278 c
+h
+19.278 -1.309 -0.779 2.984 re
+18.454 2.439 m
+18.454 2.564 18.491 2.668 18.572 2.748 c
+18.649 2.826 18.753 2.865 18.881 2.865 c
+19.006 2.865 19.108 2.826 19.189 2.748 c
+19.266 2.668 19.307 2.564 19.307 2.439 c
+19.307 2.322 19.266 2.223 19.189 2.146 c
+19.12 2.065 19.017 2.028 18.881 2.028 c
+18.753 2.028 18.649 2.065 18.572 2.146 c
+18.491 2.223 18.454 2.322 18.454 2.439 c
+21.255 0.926 m
+21.005 0.941 l
+20.789 0.941 20.641 0.845 20.564 0.661 c
+20.564 -1.309 l
+19.785 -1.309 l
+19.785 1.675 l
+20.519 1.675 l
+20.549 1.352 l
+20.667 1.606 20.832 1.734 21.049 1.734 c
+21.137 1.734 21.211 1.72 21.269 1.69 c
+h
+22.688 -1.368 m
+22.283 -1.368 21.971 -1.25 21.747 -1.015 c
+21.531 -0.772 21.423 -0.427 21.423 0.014 c
+21.423 0.264 l
+21.423 0.735 21.527 1.095 21.732 1.352 c
+21.938 1.606 22.232 1.734 22.614 1.734 c
+22.986 1.734 23.264 1.61 23.453 1.367 c
+23.647 1.132 23.746 0.779 23.746 0.309 c
+23.746 -0.074 l
+22.202 -0.074 l
+22.21 -0.302 22.254 -0.467 22.335 -0.574 c
+22.423 -0.673 22.559 -0.721 22.747 -0.721 c
+23 -0.721 23.217 -0.628 23.393 -0.441 c
+23.702 -0.927 l
+23.603 -1.055 23.459 -1.162 23.276 -1.25 c
+23.1 -1.327 22.901 -1.368 22.688 -1.368 c
+22.202 0.47 m
+22.982 0.47 l
+22.982 0.544 l
+22.982 0.72 22.952 0.852 22.894 0.941 c
+22.835 1.036 22.736 1.087 22.599 1.087 c
+22.471 1.087 22.372 1.036 22.306 0.941 c
+22.247 0.841 22.21 0.683 22.202 0.47 c
+25.091 -0.721 m
+25.315 -0.721 25.429 -0.574 25.429 -0.279 c
+26.164 -0.279 l
+26.164 -0.603 26.061 -0.867 25.855 -1.073 c
+25.657 -1.272 25.407 -1.368 25.106 -1.368 c
+24.724 -1.368 24.43 -1.25 24.224 -1.015 c
+24.018 -0.772 23.915 -0.42 23.915 0.043 c
+23.915 0.294 l
+23.915 0.753 24.01 1.105 24.209 1.352 c
+24.415 1.606 24.709 1.734 25.091 1.734 c
+25.422 1.734 25.683 1.631 25.87 1.425 c
+26.065 1.219 26.164 0.929 26.164 0.558 c
+25.429 0.558 l
+25.429 0.723 25.4 0.852 25.341 0.941 c
+25.29 1.036 25.201 1.087 25.076 1.087 c
+24.947 1.087 24.856 1.036 24.797 0.941 c
+24.739 0.841 24.702 0.654 24.694 0.382 c
+24.694 0.073 l
+24.694 -0.173 24.702 -0.346 24.724 -0.441 c
+24.753 -0.53 24.789 -0.599 24.841 -0.647 c
+24.9 -0.699 24.981 -0.721 25.091 -0.721 c
+27.34 2.41 m
+27.34 1.675 l
+27.737 1.675 l
+27.737 1.087 l
+27.34 1.087 l
+27.34 -0.397 l
+27.34 -0.515 27.355 -0.599 27.384 -0.647 c
+27.421 -0.688 27.487 -0.706 27.575 -0.706 c
+27.652 -0.706 27.715 -0.699 27.767 -0.676 c
+27.752 -1.294 l
+27.623 -1.341 27.48 -1.368 27.326 -1.368 c
+26.826 -1.368 26.568 -1.081 26.561 -0.5 c
+26.561 1.087 l
+26.223 1.087 l
+26.223 1.675 l
+26.561 1.675 l
+26.561 2.41 l
+h
+27.884 0.278 m
+27.884 0.727 27.991 1.08 28.207 1.337 c
+28.421 1.602 28.714 1.734 29.09 1.734 c
+29.471 1.734 29.766 1.602 29.971 1.337 c
+30.185 1.08 30.295 0.727 30.295 0.278 c
+30.295 0.087 l
+30.295 -0.375 30.185 -0.732 29.971 -0.985 c
+29.766 -1.243 29.471 -1.368 29.09 -1.368 c
+28.708 -1.368 28.406 -1.243 28.193 -0.985 c
+27.987 -0.721 27.884 -0.364 27.884 0.087 c
+h
+28.663 0.087 m
+28.663 -0.452 28.803 -0.721 29.09 -0.721 c
+29.354 -0.721 29.493 -0.497 29.516 -0.044 c
+29.531 0.278 l
+29.531 0.551 29.49 0.753 29.413 0.881 c
+29.332 1.018 29.225 1.087 29.09 1.087 c
+28.961 1.087 28.858 1.018 28.781 0.881 c
+28.7 0.753 28.663 0.551 28.663 0.278 c
+h
+32.066 0.926 m
+31.816 0.941 l
+31.599 0.941 31.453 0.845 31.375 0.661 c
+31.375 -1.309 l
+30.596 -1.309 l
+30.596 1.675 l
+31.331 1.675 l
+31.36 1.352 l
+31.478 1.606 31.644 1.734 31.86 1.734 c
+31.948 1.734 32.022 1.72 32.08 1.69 c
+h
+33.352 -0.015 m
+33.749 1.675 l
+34.587 1.675 l
+33.602 -1.75 l
+33.455 -2.257 33.179 -2.514 32.779 -2.514 c
+32.679 -2.514 32.573 -2.492 32.456 -2.455 c
+32.456 -1.852 l
+32.544 -1.852 l
+32.669 -1.852 32.764 -1.827 32.823 -1.779 c
+32.882 -1.738 32.926 -1.661 32.955 -1.544 c
+33.028 -1.338 l
+32.161 1.675 l
+32.999 1.675 l
+h
+f
+Q
+743.813 83.889 -0.5 2.984 re
+743.843 87.667 m
+743.843 87.578 743.816 87.505 743.769 87.445 c
+743.729 87.395 743.659 87.372 743.563 87.372 c
+743.475 87.372 743.405 87.395 743.357 87.445 c
+743.317 87.505 743.299 87.571 743.299 87.652 c
+743.299 87.74 743.317 87.813 743.357 87.872 c
+743.405 87.931 743.475 87.96 743.563 87.96 c
+743.659 87.96 743.729 87.931 743.769 87.872 c
+743.816 87.813 743.843 87.744 743.843 87.667 c
+745.926 84.652 m
+745.926 84.76 745.886 84.848 745.809 84.918 c
+745.728 84.995 745.577 85.083 745.352 85.182 c
+745.088 85.288 744.901 85.381 744.795 85.461 c
+744.684 85.539 744.606 85.627 744.559 85.726 c
+744.508 85.822 744.485 85.939 744.485 86.079 c
+744.485 86.321 744.573 86.524 744.75 86.682 c
+744.926 86.847 745.15 86.931 745.426 86.931 c
+745.72 86.931 745.956 86.843 746.131 86.667 c
+746.308 86.497 746.397 86.285 746.397 86.02 c
+745.911 86.02 l
+745.911 86.156 745.859 86.27 745.765 86.358 c
+745.676 86.454 745.562 86.505 745.426 86.505 c
+745.279 86.505 745.165 86.464 745.088 86.387 c
+745.007 86.318 744.97 86.219 744.97 86.094 c
+744.97 85.994 745 85.917 745.059 85.858 c
+745.117 85.799 745.257 85.718 745.485 85.623 c
+745.845 85.476 746.091 85.333 746.22 85.197 c
+746.356 85.068 746.426 84.895 746.426 84.683 c
+746.426 84.425 746.33 84.22 746.146 84.064 c
+745.971 83.907 745.735 83.829 745.441 83.829 c
+745.125 83.829 744.872 83.918 744.677 84.095 c
+744.489 84.278 744.398 84.509 744.398 84.785 c
+744.882 84.785 l
+744.89 84.616 744.941 84.484 745.03 84.388 c
+745.125 84.3 745.265 84.256 745.441 84.256 c
+745.595 84.256 745.713 84.289 745.794 84.359 c
+745.882 84.425 745.926 84.525 745.926 84.652 c
+748.572 86.564 m
+748.755 86.807 748.99 86.931 749.277 86.931 c
+749.807 86.931 750.075 86.578 750.086 85.873 c
+750.086 83.889 l
+749.601 83.889 l
+749.601 85.843 l
+749.601 86.079 749.56 86.244 749.483 86.343 c
+749.402 86.439 749.285 86.491 749.13 86.491 c
+749.013 86.491 748.903 86.45 748.807 86.373 c
+748.708 86.292 748.631 86.185 748.572 86.049 c
+748.572 83.889 l
+748.087 83.889 l
+748.087 88.122 l
+748.572 88.122 l
+h
+751.688 83.829 m
+751.313 83.829 751.03 83.937 750.835 84.153 c
+750.637 84.378 750.542 84.704 750.542 85.138 c
+750.542 85.506 l
+750.542 85.946 750.634 86.292 750.821 86.549 c
+751.016 86.803 751.291 86.931 751.644 86.931 c
+751.986 86.931 752.24 86.817 752.408 86.593 c
+752.585 86.366 752.676 86.02 752.687 85.55 c
+752.687 85.24 l
+751.027 85.24 l
+751.027 85.167 l
+751.027 84.844 751.085 84.609 751.203 84.461 c
+751.32 84.322 751.49 84.256 751.718 84.256 c
+751.864 84.256 751.989 84.278 752.099 84.33 c
+752.206 84.388 752.309 84.477 752.408 84.594 c
+752.658 84.286 l
+752.452 83.981 752.129 83.829 751.688 83.829 c
+751.644 86.505 m
+751.438 86.505 751.284 86.435 751.188 86.299 c
+751.089 86.16 751.034 85.946 751.027 85.652 c
+752.203 85.652 l
+752.203 85.726 l
+752.18 85.998 752.129 86.196 752.041 86.314 c
+751.953 86.439 751.82 86.505 751.644 86.505 c
+754.334 86.416 m
+754.264 86.424 754.191 86.431 754.114 86.431 c
+753.856 86.431 753.68 86.292 753.584 86.02 c
+753.584 83.889 l
+753.099 83.889 l
+753.099 86.873 l
+753.57 86.873 l
+753.584 86.564 l
+753.709 86.807 753.892 86.931 754.128 86.931 c
+754.205 86.931 754.268 86.917 754.32 86.887 c
+h
+755.712 83.829 m
+755.337 83.829 755.054 83.937 754.86 84.153 c
+754.661 84.378 754.565 84.704 754.565 85.138 c
+754.565 85.506 l
+754.565 85.946 754.657 86.292 754.845 86.549 c
+755.039 86.803 755.315 86.931 755.668 86.931 c
+756.009 86.931 756.263 86.817 756.432 86.593 c
+756.608 86.366 756.701 86.02 756.711 85.55 c
+756.711 85.24 l
+755.051 85.24 l
+755.051 85.167 l
+755.051 84.844 755.109 84.609 755.226 84.461 c
+755.344 84.322 755.513 84.256 755.741 84.256 c
+755.889 84.256 756.013 84.278 756.124 84.33 c
+756.23 84.388 756.333 84.477 756.432 84.594 c
+756.682 84.286 l
+756.476 83.981 756.153 83.829 755.712 83.829 c
+755.668 86.505 m
+755.462 86.505 755.307 86.435 755.212 86.299 c
+755.113 86.16 755.058 85.946 755.051 85.652 c
+756.226 85.652 l
+756.226 85.726 l
+756.204 85.998 756.153 86.196 756.065 86.314 c
+755.976 86.439 755.844 86.505 755.668 86.505 c
+f
+0.793 0.801 0.129 0.016 K
+0.567 w 1 j 1 J
+q 1 0 0 1 757.869 91.9766 cm
+0 0 m
+6.53 2.899 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 762.4514 94.0083 cm
+0 0 m
+-0.543 -1.407 l
+2.436 1.081 l
+-1.408 0.544 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 762.4514 94.0083 cm
+0 0 m
+-0.543 -1.407 l
+2.436 1.081 l
+-1.408 0.544 l
+0 0 l
+h
+S
+Q
+0 0 0 0 k
+q 1 0 0 1 317.2173 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+f
+Q
+0.797 0.801 0.129 0.016 K
+0.709 w 1 j 1 J
+q 1 0 0 1 317.2173 119.0558 cm
+0 0 m
+0 -2.076 -1.683 -3.755 -3.755 -3.755 c
+-5.832 -3.755 -7.512 -2.076 -7.512 0 c
+-7.512 2.076 -5.832 3.755 -3.755 3.755 c
+-1.683 3.755 0 2.076 0 0 c
+h
+S
+Q
+q
+320.12 122.007 211.589 -5.589 re
+W n
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS6 gs
+0 TL/Fm33 Do
+Q
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 325.9445 111.6592 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.44 l
+0 0.44 l
+h
+0.819 -0.897 m
+1.004 -0.655 1.239 -0.53 1.525 -0.53 c
+2.055 -0.53 2.323 -0.882 2.334 -1.588 c
+2.334 -3.572 l
+1.849 -3.572 l
+1.849 -1.617 l
+1.849 -1.382 1.808 -1.216 1.731 -1.118 c
+1.65 -1.022 1.532 -0.971 1.378 -0.971 c
+1.261 -0.971 1.151 -1.011 1.055 -1.088 c
+0.956 -1.169 0.879 -1.276 0.819 -1.411 c
+0.819 -3.572 l
+0.335 -3.572 l
+0.335 0.661 l
+0.819 0.661 l
+h
+3.406 -3.572 -0.5 2.984 re
+3.436 0.205 m
+3.436 0.118 3.41 0.043 3.362 -0.015 c
+3.322 -0.067 3.252 -0.088 3.157 -0.088 c
+3.069 -0.088 2.999 -0.067 2.951 -0.015 c
+2.911 0.043 2.892 0.11 2.892 0.191 c
+2.892 0.278 2.911 0.353 2.951 0.411 c
+2.999 0.47 3.069 0.5 3.157 0.5 c
+3.252 0.5 3.322 0.47 3.362 0.411 c
+3.41 0.353 3.436 0.282 3.436 0.205 c
+5.523 -2.808 m
+5.523 -2.702 5.483 -2.613 5.405 -2.544 c
+5.325 -2.467 5.174 -2.378 4.95 -2.278 c
+4.686 -2.172 4.498 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.735 c
+4.104 -1.64 4.083 -1.522 4.083 -1.382 c
+4.083 -1.139 4.171 -0.938 4.347 -0.78 c
+4.524 -0.614 4.748 -0.53 5.024 -0.53 c
+5.317 -0.53 5.552 -0.618 5.729 -0.794 c
+5.906 -0.963 5.993 -1.176 5.993 -1.441 c
+5.509 -1.441 l
+5.509 -1.305 5.457 -1.191 5.361 -1.103 c
+5.274 -1.008 5.16 -0.956 5.024 -0.956 c
+4.877 -0.956 4.763 -0.996 4.686 -1.073 c
+4.605 -1.143 4.568 -1.243 4.568 -1.368 c
+4.568 -1.467 4.597 -1.544 4.656 -1.603 c
+4.715 -1.661 4.854 -1.742 5.082 -1.838 c
+5.442 -1.985 5.689 -2.128 5.818 -2.264 c
+5.953 -2.392 6.023 -2.565 6.023 -2.779 c
+6.023 -3.036 5.928 -3.242 5.744 -3.396 c
+5.567 -3.554 5.332 -3.631 5.039 -3.631 c
+4.722 -3.631 4.469 -3.543 4.274 -3.367 c
+4.087 -3.183 3.994 -2.951 3.994 -2.675 c
+4.48 -2.675 l
+4.487 -2.845 4.538 -2.977 4.627 -3.072 c
+4.722 -3.161 4.862 -3.205 5.039 -3.205 c
+5.193 -3.205 5.31 -3.172 5.391 -3.102 c
+5.479 -3.036 5.523 -2.937 5.523 -2.808 c
+8.214 -3.572 -0.5 2.984 re
+8.243 0.205 m
+8.243 0.118 8.217 0.043 8.169 -0.015 c
+8.129 -0.067 8.059 -0.088 7.963 -0.088 c
+7.875 -0.088 7.805 -0.067 7.757 -0.015 c
+7.717 0.043 7.699 0.11 7.699 0.191 c
+7.699 0.278 7.717 0.353 7.757 0.411 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.059 0.5 8.129 0.47 8.169 0.411 c
+8.217 0.353 8.243 0.282 8.243 0.205 c
+10.326 -2.808 m
+10.326 -2.702 10.286 -2.613 10.209 -2.544 c
+10.128 -2.467 9.977 -2.378 9.753 -2.278 c
+9.488 -2.172 9.301 -2.08 9.195 -1.999 c
+9.084 -1.922 9.007 -1.834 8.96 -1.735 c
+8.908 -1.64 8.885 -1.522 8.885 -1.382 c
+8.885 -1.139 8.974 -0.938 9.151 -0.78 c
+9.326 -0.614 9.55 -0.53 9.826 -0.53 c
+10.12 -0.53 10.356 -0.618 10.532 -0.794 c
+10.708 -0.963 10.797 -1.176 10.797 -1.441 c
+10.311 -1.441 l
+10.311 -1.305 10.26 -1.191 10.165 -1.103 c
+10.076 -1.008 9.962 -0.956 9.826 -0.956 c
+9.679 -0.956 9.565 -0.996 9.488 -1.073 c
+9.407 -1.143 9.371 -1.243 9.371 -1.368 c
+9.371 -1.467 9.4 -1.544 9.459 -1.603 c
+9.517 -1.661 9.658 -1.742 9.885 -1.838 c
+10.246 -1.985 10.491 -2.128 10.62 -2.264 c
+10.756 -2.392 10.826 -2.565 10.826 -2.779 c
+10.826 -3.036 10.73 -3.242 10.547 -3.396 c
+10.371 -3.554 10.135 -3.631 9.841 -3.631 c
+9.525 -3.631 9.272 -3.543 9.077 -3.367 c
+8.889 -3.183 8.798 -2.951 8.798 -2.675 c
+9.282 -2.675 l
+9.29 -2.845 9.342 -2.977 9.43 -3.072 c
+9.525 -3.161 9.665 -3.205 9.841 -3.205 c
+9.995 -3.205 10.113 -3.172 10.194 -3.102 c
+10.282 -3.036 10.326 -2.937 10.326 -2.808 c
+14.016 -3.572 m
+13.986 -3.506 13.964 -3.396 13.957 -3.249 c
+13.781 -3.506 13.56 -3.631 13.295 -3.631 c
+13.02 -3.631 12.803 -3.558 12.648 -3.41 c
+12.501 -3.256 12.428 -3.04 12.428 -2.764 c
+12.428 -2.463 12.531 -2.22 12.737 -2.043 c
+12.943 -1.86 13.226 -1.764 13.589 -1.764 c
+13.942 -1.764 l
+13.942 -1.441 l
+13.942 -1.264 13.902 -1.143 13.824 -1.073 c
+13.744 -0.996 13.627 -0.956 13.471 -0.956 c
+13.325 -0.956 13.199 -1 13.104 -1.088 c
+13.016 -1.176 12.972 -1.287 12.972 -1.411 c
+12.487 -1.411 l
+12.487 -1.264 12.531 -1.125 12.619 -0.985 c
+12.707 -0.838 12.825 -0.728 12.972 -0.647 c
+13.126 -0.57 13.299 -0.53 13.486 -0.53 c
+13.799 -0.53 14.034 -0.611 14.192 -0.765 c
+14.346 -0.912 14.427 -1.133 14.427 -1.426 c
+14.427 -2.926 l
+14.435 -3.161 14.471 -3.363 14.53 -3.528 c
+14.53 -3.572 l
+h
+13.369 -3.19 m
+13.486 -3.19 13.596 -3.157 13.707 -3.088 c
+13.814 -3.021 13.891 -2.937 13.942 -2.837 c
+13.942 -2.132 l
+13.677 -2.132 l
+13.442 -2.132 13.255 -2.183 13.119 -2.278 c
+12.991 -2.378 12.928 -2.521 12.928 -2.705 c
+12.928 -2.874 12.958 -2.995 13.016 -3.072 c
+13.082 -3.153 13.199 -3.19 13.369 -3.19 c
+15.464 -0.588 m
+15.478 -0.912 l
+15.662 -0.659 15.904 -0.53 16.199 -0.53 c
+16.727 -0.53 16.996 -0.882 17.007 -1.588 c
+17.007 -3.572 l
+16.522 -3.572 l
+16.522 -1.617 l
+16.522 -1.382 16.482 -1.216 16.405 -1.118 c
+16.324 -1.022 16.206 -0.971 16.052 -0.971 c
+15.934 -0.971 15.823 -1.011 15.728 -1.088 c
+15.629 -1.169 15.551 -1.276 15.493 -1.411 c
+15.493 -3.572 l
+15.008 -3.572 l
+15.008 -0.588 l
+h
+19.293 -3.572 -0.5 2.984 re
+19.322 0.205 m
+19.322 0.118 19.296 0.043 19.248 -0.015 c
+19.208 -0.067 19.138 -0.088 19.042 -0.088 c
+18.955 -0.088 18.884 -0.067 18.837 -0.015 c
+18.797 0.043 18.778 0.11 18.778 0.191 c
+18.778 0.278 18.797 0.353 18.837 0.411 c
+18.884 0.47 18.955 0.5 19.042 0.5 c
+19.138 0.5 19.208 0.47 19.248 0.411 c
+19.296 0.353 19.322 0.282 19.322 0.205 c
+20.424 -0.588 m
+20.439 -0.912 l
+20.623 -0.659 20.866 -0.53 21.159 -0.53 c
+21.689 -0.53 21.957 -0.882 21.968 -1.588 c
+21.968 -3.572 l
+21.483 -3.572 l
+21.483 -1.617 l
+21.483 -1.382 21.442 -1.216 21.365 -1.118 c
+21.284 -1.022 21.167 -0.971 21.012 -0.971 c
+20.895 -0.971 20.785 -1.011 20.689 -1.088 c
+20.59 -1.169 20.513 -1.276 20.454 -1.411 c
+20.454 -3.572 l
+19.969 -3.572 l
+19.969 -0.588 l
+h
+23.048 -3.572 -0.5 2.984 re
+23.077 0.205 m
+23.077 0.118 23.052 0.043 23.004 -0.015 c
+22.963 -0.067 22.894 -0.088 22.799 -0.088 c
+22.71 -0.088 22.641 -0.067 22.593 -0.015 c
+22.552 0.043 22.534 0.11 22.534 0.191 c
+22.534 0.278 22.552 0.353 22.593 0.411 c
+22.641 0.47 22.71 0.5 22.799 0.5 c
+22.894 0.5 22.963 0.47 23.004 0.411 c
+23.052 0.353 23.077 0.282 23.077 0.205 c
+24.357 0.132 m
+24.357 -0.588 l
+24.812 -0.588 l
+24.812 -0.985 l
+24.357 -0.985 l
+24.357 -2.837 l
+24.357 -2.955 24.375 -3.043 24.415 -3.102 c
+24.452 -3.161 24.522 -3.19 24.621 -3.19 c
+24.68 -3.19 24.742 -3.183 24.812 -3.161 c
+24.812 -3.572 l
+24.694 -3.609 24.581 -3.631 24.474 -3.631 c
+24.276 -3.631 24.125 -3.565 24.018 -3.425 c
+23.919 -3.29 23.871 -3.095 23.871 -2.837 c
+23.871 -0.985 l
+23.416 -0.985 l
+23.416 -0.588 l
+23.871 -0.588 l
+23.871 0.132 l
+h
+25.808 -3.572 -0.5 2.984 re
+25.837 0.205 m
+25.837 0.118 25.812 0.043 25.764 -0.015 c
+25.724 -0.067 25.654 -0.088 25.558 -0.088 c
+25.47 -0.088 25.4 -0.067 25.352 -0.015 c
+25.312 0.043 25.294 0.11 25.294 0.191 c
+25.294 0.278 25.312 0.353 25.352 0.411 c
+25.4 0.47 25.47 0.5 25.558 0.5 c
+25.654 0.5 25.724 0.47 25.764 0.411 c
+25.812 0.353 25.837 0.282 25.837 0.205 c
+28.01 -3.572 m
+27.979 -3.506 27.958 -3.396 27.95 -3.249 c
+27.774 -3.506 27.553 -3.631 27.289 -3.631 c
+27.013 -3.631 26.797 -3.558 26.642 -3.41 c
+26.495 -3.256 26.422 -3.04 26.422 -2.764 c
+26.422 -2.463 26.524 -2.22 26.73 -2.043 c
+26.936 -1.86 27.219 -1.764 27.582 -1.764 c
+27.935 -1.764 l
+27.935 -1.441 l
+27.935 -1.264 27.895 -1.143 27.818 -1.073 c
+27.738 -0.996 27.62 -0.956 27.465 -0.956 c
+27.318 -0.956 27.193 -1 27.098 -1.088 c
+27.01 -1.176 26.965 -1.287 26.965 -1.411 c
+26.481 -1.411 l
+26.481 -1.264 26.524 -1.125 26.613 -0.985 c
+26.701 -0.838 26.819 -0.728 26.965 -0.647 c
+27.12 -0.57 27.293 -0.53 27.48 -0.53 c
+27.792 -0.53 28.027 -0.611 28.185 -0.765 c
+28.34 -0.912 28.421 -1.133 28.421 -1.426 c
+28.421 -2.926 l
+28.428 -3.161 28.465 -3.363 28.523 -3.528 c
+28.523 -3.572 l
+h
+27.362 -3.19 m
+27.48 -3.19 27.59 -3.157 27.7 -3.088 c
+27.807 -3.021 27.884 -2.937 27.935 -2.837 c
+27.935 -2.132 l
+27.671 -2.132 l
+27.436 -2.132 27.249 -2.183 27.112 -2.278 c
+26.984 -2.378 26.921 -2.521 26.921 -2.705 c
+26.921 -2.874 26.951 -2.995 27.01 -3.072 c
+27.075 -3.153 27.193 -3.19 27.362 -3.19 c
+29.531 -3.572 -0.5 4.233 re
+32.438 -3.205 m
+32.602 -3.205 32.735 -3.157 32.834 -3.057 c
+32.93 -2.962 32.985 -2.819 32.995 -2.631 c
+33.452 -2.631 l
+33.44 -2.918 33.338 -3.157 33.143 -3.352 c
+32.955 -3.539 32.72 -3.631 32.438 -3.631 c
+32.074 -3.631 31.794 -3.514 31.599 -3.278 c
+31.401 -3.043 31.306 -2.698 31.306 -2.234 c
+31.306 -1.912 l
+31.306 -1.463 31.397 -1.118 31.584 -0.882 c
+31.779 -0.647 32.062 -0.53 32.438 -0.53 c
+32.739 -0.53 32.981 -0.628 33.157 -0.823 c
+33.342 -1.022 33.44 -1.287 33.452 -1.617 c
+32.995 -1.617 l
+32.974 -1.393 32.915 -1.228 32.82 -1.118 c
+32.731 -1.011 32.602 -0.956 32.438 -0.956 c
+32.22 -0.956 32.059 -1.029 31.952 -1.176 c
+31.853 -1.316 31.798 -1.544 31.79 -1.867 c
+31.79 -2.249 l
+31.79 -2.602 31.838 -2.852 31.937 -2.999 c
+32.044 -3.138 32.209 -3.205 32.438 -3.205 c
+33.745 -1.941 m
+33.745 -1.511 33.849 -1.169 34.054 -0.912 c
+34.267 -0.659 34.547 -0.53 34.892 -0.53 c
+35.233 -0.53 35.509 -0.659 35.715 -0.912 c
+35.929 -1.158 36.043 -1.492 36.053 -1.912 c
+36.053 -2.22 l
+36.053 -2.654 35.943 -2.995 35.73 -3.249 c
+35.524 -3.506 35.245 -3.631 34.892 -3.631 c
+34.547 -3.631 34.275 -3.51 34.069 -3.263 c
+33.863 -3.021 33.753 -2.687 33.745 -2.264 c
+h
+34.231 -2.22 m
+34.231 -2.536 34.289 -2.779 34.407 -2.955 c
+34.532 -3.124 34.694 -3.205 34.892 -3.205 c
+35.322 -3.205 35.546 -2.897 35.568 -2.278 c
+35.568 -1.941 l
+35.568 -1.64 35.502 -1.397 35.377 -1.22 c
+35.26 -1.044 35.098 -0.956 34.892 -0.956 c
+34.694 -0.956 34.532 -1.044 34.407 -1.22 c
+34.289 -1.397 34.231 -1.64 34.231 -1.941 c
+h
+36.95 -0.588 m
+36.964 -0.867 l
+37.141 -0.643 37.38 -0.53 37.685 -0.53 c
+38.015 -0.53 38.247 -0.676 38.376 -0.971 c
+38.559 -0.676 38.821 -0.53 39.155 -0.53 c
+39.713 -0.53 39.996 -0.875 40.008 -1.559 c
+40.008 -3.572 l
+39.522 -3.572 l
+39.522 -1.603 l
+39.522 -1.389 39.482 -1.231 39.405 -1.133 c
+39.324 -1.025 39.191 -0.971 39.008 -0.971 c
+38.861 -0.971 38.743 -1.029 38.655 -1.147 c
+38.567 -1.257 38.512 -1.397 38.493 -1.573 c
+38.493 -3.572 l
+38.008 -3.572 l
+38.008 -1.588 l
+37.997 -1.176 37.824 -0.971 37.494 -0.971 c
+37.248 -0.971 37.075 -1.096 36.979 -1.338 c
+36.979 -3.572 l
+36.494 -3.572 l
+36.494 -0.588 l
+h
+40.911 -0.588 m
+40.926 -0.867 l
+41.103 -0.643 41.341 -0.53 41.647 -0.53 c
+41.977 -0.53 42.208 -0.676 42.337 -0.971 c
+42.52 -0.676 42.782 -0.53 43.116 -0.53 c
+43.675 -0.53 43.958 -0.875 43.968 -1.559 c
+43.968 -3.572 l
+43.484 -3.572 l
+43.484 -1.603 l
+43.484 -1.389 43.443 -1.231 43.366 -1.133 c
+43.285 -1.025 43.153 -0.971 42.969 -0.971 c
+42.822 -0.971 42.705 -1.029 42.616 -1.147 c
+42.528 -1.257 42.473 -1.397 42.455 -1.573 c
+42.455 -3.572 l
+41.969 -3.572 l
+41.969 -1.588 l
+41.959 -1.176 41.786 -0.971 41.456 -0.971 c
+41.209 -0.971 41.036 -1.096 40.941 -1.338 c
+40.941 -3.572 l
+40.456 -3.572 l
+40.456 -0.588 l
+h
+44.947 -3.572 -0.5 2.984 re
+44.976 0.205 m
+44.976 0.118 44.949 0.043 44.902 -0.015 c
+44.862 -0.067 44.791 -0.088 44.696 -0.088 c
+44.608 -0.088 44.538 -0.067 44.49 -0.015 c
+44.45 0.043 44.432 0.11 44.432 0.191 c
+44.432 0.278 44.45 0.353 44.49 0.411 c
+44.538 0.47 44.608 0.5 44.696 0.5 c
+44.791 0.5 44.862 0.47 44.902 0.411 c
+44.949 0.353 44.976 0.282 44.976 0.205 c
+46.25 0.132 m
+46.25 -0.588 l
+46.707 -0.588 l
+46.707 -0.985 l
+46.25 -0.985 l
+46.25 -2.837 l
+46.25 -2.955 46.269 -3.043 46.31 -3.102 c
+46.346 -3.161 46.416 -3.19 46.515 -3.19 c
+46.574 -3.19 46.636 -3.183 46.707 -3.161 c
+46.707 -3.572 l
+46.589 -3.609 46.474 -3.631 46.368 -3.631 c
+46.17 -3.631 46.019 -3.565 45.913 -3.425 c
+45.813 -3.29 45.766 -3.095 45.766 -2.837 c
+45.766 -0.985 l
+45.31 -0.985 l
+45.31 -0.588 l
+45.766 -0.588 l
+45.766 0.132 l
+h
+47.173 -4.366 m
+46.879 -4.175 l
+47.056 -3.929 47.147 -3.679 47.158 -3.425 c
+47.158 -2.97 l
+47.658 -2.97 l
+47.658 -3.367 l
+47.658 -3.554 47.607 -3.738 47.511 -3.925 c
+47.423 -4.109 47.309 -4.256 47.173 -4.366 c
+f
+Q
+324.063 101.502 -0.5 2.984 re
+324.092 105.279 m
+324.092 105.192 324.067 105.117 324.019 105.059 c
+323.978 105.007 323.909 104.986 323.814 104.986 c
+323.725 104.986 323.656 105.007 323.608 105.059 c
+323.567 105.117 323.548 105.184 323.548 105.265 c
+323.548 105.352 323.567 105.427 323.608 105.485 c
+323.656 105.544 323.725 105.574 323.814 105.574 c
+323.909 105.574 323.978 105.544 324.019 105.485 c
+324.067 105.427 324.092 105.356 324.092 105.279 c
+325.368 105.206 m
+325.368 104.486 l
+325.823 104.486 l
+325.823 104.089 l
+325.368 104.089 l
+325.368 102.237 l
+325.368 102.119 325.386 102.031 325.426 101.972 c
+325.463 101.913 325.533 101.884 325.632 101.884 c
+325.691 101.884 325.754 101.891 325.823 101.913 c
+325.823 101.502 l
+325.706 101.465 325.592 101.443 325.485 101.443 c
+325.287 101.443 325.136 101.509 325.03 101.649 c
+324.93 101.784 324.882 101.979 324.882 102.237 c
+324.882 104.089 l
+324.427 104.089 l
+324.427 104.486 l
+324.882 104.486 l
+324.882 105.206 l
+h
+327.98 104.177 m
+328.165 104.419 328.4 104.544 328.686 104.544 c
+329.215 104.544 329.484 104.192 329.495 103.486 c
+329.495 101.502 l
+329.009 101.502 l
+329.009 103.457 l
+329.009 103.692 328.969 103.858 328.892 103.956 c
+328.811 104.052 328.693 104.103 328.539 104.103 c
+328.421 104.103 328.311 104.063 328.215 103.986 c
+328.117 103.905 328.04 103.798 327.98 103.663 c
+327.98 101.502 l
+327.496 101.502 l
+327.496 105.735 l
+327.98 105.735 l
+h
+331.564 101.502 m
+331.534 101.568 331.512 101.678 331.504 101.825 c
+331.328 101.568 331.107 101.443 330.843 101.443 c
+330.567 101.443 330.351 101.516 330.197 101.664 c
+330.049 101.818 329.976 102.034 329.976 102.31 c
+329.976 102.611 330.079 102.854 330.284 103.031 c
+330.49 103.214 330.773 103.31 331.137 103.31 c
+331.49 103.31 l
+331.49 103.633 l
+331.49 103.81 331.45 103.931 331.373 104.001 c
+331.292 104.078 331.174 104.118 331.02 104.118 c
+330.872 104.118 330.748 104.074 330.652 103.986 c
+330.564 103.898 330.519 103.787 330.519 103.663 c
+330.035 103.663 l
+330.035 103.81 330.079 103.949 330.167 104.089 c
+330.255 104.236 330.373 104.346 330.519 104.427 c
+330.675 104.504 330.847 104.544 331.034 104.544 c
+331.346 104.544 331.581 104.463 331.739 104.309 c
+331.894 104.162 331.975 103.941 331.975 103.648 c
+331.975 102.148 l
+331.982 101.913 332.019 101.711 332.078 101.546 c
+332.078 101.502 l
+h
+330.916 101.884 m
+331.034 101.884 331.145 101.917 331.255 101.987 c
+331.361 102.053 331.438 102.137 331.49 102.237 c
+331.49 102.942 l
+331.225 102.942 l
+330.99 102.942 330.802 102.891 330.667 102.796 c
+330.538 102.696 330.476 102.553 330.476 102.369 c
+330.476 102.2 330.505 102.079 330.564 102.002 c
+330.63 101.921 330.748 101.884 330.916 101.884 c
+333.996 102.266 m
+333.996 102.372 333.956 102.461 333.879 102.53 c
+333.798 102.607 333.647 102.696 333.422 102.796 c
+333.158 102.902 332.971 102.994 332.865 103.075 c
+332.754 103.152 332.676 103.24 332.629 103.339 c
+332.578 103.434 332.556 103.552 332.556 103.692 c
+332.556 103.935 332.644 104.136 332.82 104.294 c
+332.996 104.46 333.221 104.544 333.497 104.544 c
+333.79 104.544 334.025 104.456 334.202 104.28 c
+334.378 104.111 334.467 103.898 334.467 103.633 c
+333.981 103.633 l
+333.981 103.769 333.93 103.883 333.834 103.971 c
+333.746 104.066 333.632 104.118 333.497 104.118 c
+333.349 104.118 333.235 104.078 333.158 104.001 c
+333.077 103.931 333.04 103.831 333.04 103.706 c
+333.04 103.607 333.07 103.53 333.129 103.471 c
+333.187 103.413 333.327 103.332 333.555 103.236 c
+333.915 103.089 334.162 102.946 334.29 102.81 c
+334.426 102.682 334.496 102.509 334.496 102.295 c
+334.496 102.038 334.4 101.832 334.216 101.678 c
+334.04 101.52 333.805 101.443 333.511 101.443 c
+333.195 101.443 332.942 101.531 332.747 101.707 c
+332.559 101.891 332.468 102.123 332.468 102.399 c
+332.952 102.399 l
+332.96 102.229 333.011 102.097 333.1 102.002 c
+333.195 101.913 333.335 101.869 333.511 101.869 c
+333.665 101.869 333.783 101.902 333.864 101.972 c
+333.952 102.038 333.996 102.137 333.996 102.266 c
+336.612 104.486 m
+336.628 104.162 l
+336.811 104.415 337.054 104.544 337.347 104.544 c
+337.877 104.544 338.145 104.192 338.156 103.486 c
+338.156 101.502 l
+337.671 101.502 l
+337.671 103.457 l
+337.671 103.692 337.63 103.858 337.553 103.956 c
+337.472 104.052 337.355 104.103 337.2 104.103 c
+337.083 104.103 336.973 104.063 336.877 103.986 c
+336.778 103.905 336.701 103.798 336.642 103.663 c
+336.642 101.502 l
+336.157 101.502 l
+336.157 104.486 l
+h
+338.608 103.133 m
+338.608 103.563 338.71 103.905 338.916 104.162 c
+339.13 104.415 339.409 104.544 339.755 104.544 c
+340.096 104.544 340.372 104.415 340.578 104.162 c
+340.79 103.916 340.904 103.582 340.915 103.162 c
+340.915 102.854 l
+340.915 102.42 340.805 102.079 340.592 101.825 c
+340.387 101.568 340.107 101.443 339.755 101.443 c
+339.409 101.443 339.137 101.564 338.931 101.811 c
+338.725 102.053 338.615 102.387 338.608 102.81 c
+h
+339.093 102.854 m
+339.093 102.538 339.152 102.295 339.269 102.119 c
+339.394 101.95 339.556 101.869 339.755 101.869 c
+340.184 101.869 340.408 102.177 340.431 102.796 c
+340.431 103.133 l
+340.431 103.434 340.364 103.677 340.239 103.854 c
+340.121 104.03 339.961 104.118 339.755 104.118 c
+339.556 104.118 339.394 104.03 339.269 103.854 c
+339.152 103.677 339.093 103.434 339.093 103.133 c
+h
+344.705 102.854 m
+344.705 102.383 344.62 102.031 344.454 101.796 c
+344.285 101.56 344.046 101.443 343.734 101.443 c
+343.429 101.443 343.198 101.553 343.043 101.781 c
+343.043 100.355 l
+342.558 100.355 l
+342.558 104.486 l
+342.999 104.486 l
+343.028 104.147 l
+343.183 104.412 343.414 104.544 343.72 104.544 c
+344.05 104.544 344.296 104.427 344.454 104.192 c
+344.62 103.964 344.705 103.625 344.705 103.177 c
+h
+344.219 103.133 m
+344.219 103.464 344.164 103.71 344.057 103.868 c
+343.959 104.022 343.797 104.103 343.572 104.103 c
+343.337 104.103 343.161 103.986 343.043 103.75 c
+343.043 102.208 l
+343.161 101.979 343.341 101.869 343.587 101.869 c
+343.801 101.869 343.959 101.946 344.057 102.104 c
+344.164 102.258 344.219 102.501 344.219 102.825 c
+h
+346.689 101.502 m
+346.66 101.568 346.637 101.678 346.629 101.825 c
+346.454 101.568 346.233 101.443 345.968 101.443 c
+345.693 101.443 345.476 101.516 345.322 101.664 c
+345.175 101.818 345.101 102.034 345.101 102.31 c
+345.101 102.611 345.204 102.854 345.41 103.031 c
+345.615 103.214 345.899 103.31 346.263 103.31 c
+346.615 103.31 l
+346.615 103.633 l
+346.615 103.81 346.575 103.931 346.498 104.001 c
+346.417 104.078 346.299 104.118 346.145 104.118 c
+345.998 104.118 345.873 104.074 345.777 103.986 c
+345.689 103.898 345.645 103.787 345.645 103.663 c
+345.16 103.663 l
+345.16 103.81 345.204 103.949 345.293 104.089 c
+345.38 104.236 345.498 104.346 345.645 104.427 c
+345.8 104.504 345.972 104.544 346.159 104.544 c
+346.471 104.544 346.707 104.463 346.865 104.309 c
+347.019 104.162 347.1 103.941 347.1 103.648 c
+347.1 102.148 l
+347.107 101.913 347.144 101.711 347.203 101.546 c
+347.203 101.502 l
+h
+346.042 101.884 m
+346.159 101.884 346.27 101.917 346.38 101.987 c
+346.486 102.053 346.564 102.137 346.615 102.237 c
+346.615 102.942 l
+346.351 102.942 l
+346.116 102.942 345.928 102.891 345.792 102.796 c
+345.663 102.696 345.601 102.553 345.601 102.369 c
+345.601 102.2 345.63 102.079 345.689 102.002 c
+345.756 101.921 345.873 101.884 346.042 101.884 c
+348.915 104.03 m
+348.846 104.037 348.772 104.045 348.695 104.045 c
+348.438 104.045 348.262 103.905 348.166 103.633 c
+348.166 101.502 l
+347.681 101.502 l
+347.681 104.486 l
+348.152 104.486 l
+348.166 104.177 l
+348.291 104.419 348.474 104.544 348.709 104.544 c
+348.787 104.544 348.85 104.529 348.9 104.5 c
+h
+350.294 101.443 m
+349.919 101.443 349.636 101.549 349.441 101.766 c
+349.243 101.99 349.147 102.318 349.147 102.751 c
+349.147 103.118 l
+349.147 103.559 349.239 103.905 349.426 104.162 c
+349.621 104.415 349.897 104.544 350.249 104.544 c
+350.591 104.544 350.845 104.431 351.014 104.207 c
+351.19 103.978 351.282 103.633 351.293 103.162 c
+351.293 102.854 l
+349.632 102.854 l
+349.632 102.78 l
+349.632 102.457 349.691 102.222 349.808 102.075 c
+349.926 101.936 350.095 101.869 350.323 101.869 c
+350.47 101.869 350.595 101.891 350.705 101.942 c
+350.812 102.002 350.915 102.09 351.014 102.208 c
+351.264 101.899 l
+351.058 101.593 350.735 101.443 350.294 101.443 c
+350.249 104.118 m
+350.043 104.118 349.889 104.049 349.794 103.912 c
+349.694 103.773 349.64 103.559 349.632 103.266 c
+350.808 103.266 l
+350.808 103.339 l
+350.786 103.611 350.735 103.81 350.646 103.927 c
+350.558 104.052 350.426 104.118 350.249 104.118 c
+352.16 104.486 m
+352.175 104.162 l
+352.359 104.415 352.601 104.544 352.896 104.544 c
+353.424 104.544 353.693 104.192 353.704 103.486 c
+353.704 101.502 l
+353.218 101.502 l
+353.218 103.457 l
+353.218 103.692 353.178 103.858 353.101 103.956 c
+353.02 104.052 352.902 104.103 352.748 104.103 c
+352.63 104.103 352.52 104.063 352.425 103.986 c
+352.326 103.905 352.249 103.798 352.19 103.663 c
+352.19 101.502 l
+351.705 101.502 l
+351.705 104.486 l
+h
+354.891 105.206 m
+354.891 104.486 l
+355.346 104.486 l
+355.346 104.089 l
+354.891 104.089 l
+354.891 102.237 l
+354.891 102.119 354.909 102.031 354.949 101.972 c
+354.986 101.913 355.056 101.884 355.155 101.884 c
+355.214 101.884 355.277 101.891 355.346 101.913 c
+355.346 101.502 l
+355.229 101.465 355.115 101.443 355.009 101.443 c
+354.81 101.443 354.66 101.509 354.552 101.649 c
+354.454 101.784 354.406 101.979 354.406 102.237 c
+354.406 104.089 l
+353.95 104.089 l
+353.95 104.486 l
+354.406 104.486 l
+354.406 105.206 l
+h
+357.25 102.266 m
+357.25 102.372 357.21 102.461 357.132 102.53 c
+357.052 102.607 356.9 102.696 356.677 102.796 c
+356.412 102.902 356.225 102.994 356.118 103.075 c
+356.008 103.152 355.931 103.24 355.883 103.339 c
+355.832 103.434 355.809 103.552 355.809 103.692 c
+355.809 103.935 355.898 104.136 356.074 104.294 c
+356.25 104.46 356.474 104.544 356.75 104.544 c
+357.044 104.544 357.28 104.456 357.456 104.28 c
+357.632 104.111 357.721 103.898 357.721 103.633 c
+357.235 103.633 l
+357.235 103.769 357.184 103.883 357.089 103.971 c
+357 104.066 356.886 104.118 356.75 104.118 c
+356.603 104.118 356.489 104.078 356.412 104.001 c
+356.331 103.931 356.295 103.831 356.295 103.706 c
+356.295 103.607 356.324 103.53 356.383 103.471 c
+356.441 103.413 356.582 103.332 356.809 103.236 c
+357.17 103.089 357.415 102.946 357.544 102.81 c
+357.68 102.682 357.75 102.509 357.75 102.295 c
+357.75 102.038 357.654 101.832 357.471 101.678 c
+357.294 101.52 357.059 101.443 356.765 101.443 c
+356.449 101.443 356.195 101.531 356 101.707 c
+355.813 101.891 355.721 102.123 355.721 102.399 c
+356.206 102.399 l
+356.214 102.229 356.265 102.097 356.353 102.002 c
+356.449 101.913 356.588 101.869 356.765 101.869 c
+356.919 101.869 357.037 101.902 357.118 101.972 c
+357.206 102.038 357.25 102.137 357.25 102.266 c
+f
+0.793 0.801 0.129 0.016 K
+0.567 w
+q 1 0 0 1 321.7337 107.7302 cm
+0 0 m
+-4.686 4.844 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 318.5327 111.0419 cm
+0 0 m
+1.507 -0.026 l
+-1.856 1.914 l
+-0.026 -1.511 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 318.5327 111.042 cm
+0 0 m
+1.507 -0.026 l
+-1.856 1.914 l
+-0.026 -1.511 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 K
+0.8 w
+q 1 0 0 1 644.4808 108.7265 cm
+0 0 m
+0.008 -15.25 l
+-6.464 -15.25 l
+-6.468 0 l
+-3.227 3.564 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 640.4863 106.5801 cm
+0 0 m
+1.881 -0.382 l
+1.881 -1.191 l
+-1.103 -0.368 l
+-1.103 0.368 l
+1.881 1.191 l
+1.881 0.382 l
+h
+-1.103 -3.087 m
+-1.103 -2.293 l
+1.969 -2.293 l
+1.66 -1.529 l
+2.322 -1.529 l
+2.91 -2.998 l
+2.91 -3.087 l
+h
+-0.706 -4.12 m
+-0.581 -4.12 -0.478 -4.156 -0.397 -4.237 c
+-0.32 -4.326 -0.279 -4.432 -0.279 -4.561 c
+-0.279 -4.696 -0.32 -4.802 -0.397 -4.883 c
+-0.478 -4.972 -0.581 -5.016 -0.706 -5.016 c
+-0.834 -5.016 -0.937 -4.972 -1.014 -4.883 c
+-1.095 -4.802 -1.133 -4.696 -1.133 -4.561 c
+-1.133 -4.432 -1.095 -4.326 -1.014 -4.237 c
+-0.937 -4.156 -0.834 -4.12 -0.706 -4.12 c
+0.558 -7.886 m
+0 -7.886 -0.427 -7.783 -0.721 -7.578 c
+-1.014 -7.379 -1.162 -7.096 -1.162 -6.724 c
+-1.162 -6.361 -1.022 -6.078 -0.736 -5.872 c
+-0.441 -5.674 -0.03 -5.571 0.5 -5.564 c
+1.263 -5.564 l
+1.811 -5.564 2.234 -5.659 2.528 -5.857 c
+2.822 -6.063 2.969 -6.35 2.969 -6.724 c
+2.969 -7.096 2.822 -7.379 2.528 -7.578 c
+2.241 -7.783 1.83 -7.886 1.294 -7.886 c
+h
+1.367 -7.107 m
+1.679 -7.107 1.914 -7.071 2.072 -7.004 c
+2.238 -6.945 2.322 -6.85 2.322 -6.724 c
+2.322 -6.479 2.032 -6.35 1.454 -6.342 c
+0.455 -6.342 l
+0.132 -6.342 -0.114 -6.372 -0.279 -6.431 c
+-0.437 -6.497 -0.515 -6.596 -0.515 -6.724 c
+-0.515 -6.85 -0.441 -6.945 -0.294 -7.004 c
+-0.14 -7.071 0.091 -7.107 0.397 -7.107 c
+h
+-0.706 -8.32 m
+-0.581 -8.32 -0.478 -8.357 -0.397 -8.437 c
+-0.32 -8.525 -0.279 -8.632 -0.279 -8.76 c
+-0.279 -8.897 -0.32 -9.003 -0.397 -9.084 c
+-0.478 -9.172 -0.581 -9.216 -0.706 -9.216 c
+-0.834 -9.216 -0.937 -9.172 -1.014 -9.084 c
+-1.095 -9.003 -1.133 -8.897 -1.133 -8.76 c
+-1.133 -8.632 -1.095 -8.525 -1.014 -8.437 c
+-0.937 -8.357 -0.834 -8.32 -0.706 -8.32 c
+-1.103 -11.484 m
+-1.103 -10.69 l
+1.969 -10.69 l
+1.66 -9.926 l
+2.322 -9.926 l
+2.91 -11.395 l
+2.91 -11.484 l
+h
+f
+Q
+q 1 0 0 1 573.4436 98.4888 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.44 l
+0 0.44 l
+h
+0.823 -0.897 m
+1.007 -0.655 1.242 -0.53 1.529 -0.53 c
+2.058 -0.53 2.326 -0.882 2.337 -1.588 c
+2.337 -3.572 l
+1.852 -3.572 l
+1.852 -1.617 l
+1.852 -1.382 1.812 -1.216 1.735 -1.118 c
+1.654 -1.022 1.536 -0.971 1.382 -0.971 c
+1.264 -0.971 1.154 -1.011 1.058 -1.088 c
+0.96 -1.169 0.882 -1.276 0.823 -1.411 c
+0.823 -3.572 l
+0.338 -3.572 l
+0.338 0.661 l
+0.823 0.661 l
+h
+3.406 -3.572 -0.5 2.984 re
+3.436 0.205 m
+3.436 0.118 3.41 0.043 3.362 -0.015 c
+3.322 -0.067 3.252 -0.088 3.156 -0.088 c
+3.069 -0.088 2.999 -0.067 2.951 -0.015 c
+2.911 0.043 2.892 0.11 2.892 0.191 c
+2.892 0.278 2.911 0.353 2.951 0.411 c
+2.999 0.47 3.069 0.5 3.156 0.5 c
+3.252 0.5 3.322 0.47 3.362 0.411 c
+3.41 0.353 3.436 0.282 3.436 0.205 c
+5.523 -2.808 m
+5.523 -2.702 5.483 -2.613 5.405 -2.544 c
+5.325 -2.467 5.174 -2.378 4.95 -2.278 c
+4.685 -2.172 4.498 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.735 c
+4.104 -1.64 4.083 -1.522 4.083 -1.382 c
+4.083 -1.139 4.171 -0.938 4.347 -0.78 c
+4.524 -0.614 4.748 -0.53 5.024 -0.53 c
+5.317 -0.53 5.552 -0.618 5.729 -0.794 c
+5.905 -0.963 5.993 -1.176 5.993 -1.441 c
+5.508 -1.441 l
+5.508 -1.305 5.457 -1.191 5.361 -1.103 c
+5.273 -1.008 5.159 -0.956 5.024 -0.956 c
+4.877 -0.956 4.762 -0.996 4.685 -1.073 c
+4.605 -1.143 4.567 -1.243 4.567 -1.368 c
+4.567 -1.467 4.597 -1.544 4.656 -1.603 c
+4.715 -1.661 4.854 -1.742 5.082 -1.838 c
+5.442 -1.985 5.689 -2.128 5.818 -2.264 c
+5.953 -2.392 6.023 -2.565 6.023 -2.779 c
+6.023 -3.036 5.928 -3.242 5.743 -3.396 c
+5.567 -3.554 5.332 -3.631 5.038 -3.631 c
+4.723 -3.631 4.469 -3.543 4.274 -3.367 c
+4.087 -3.183 3.994 -2.951 3.994 -2.675 c
+4.48 -2.675 l
+4.487 -2.845 4.538 -2.977 4.627 -3.072 c
+4.723 -3.161 4.862 -3.205 5.038 -3.205 c
+5.193 -3.205 5.31 -3.172 5.39 -3.102 c
+5.479 -3.036 5.523 -2.937 5.523 -2.808 c
+8.213 -3.572 -0.5 2.984 re
+8.243 0.205 m
+8.243 0.118 8.216 0.043 8.169 -0.015 c
+8.129 -0.067 8.058 -0.088 7.963 -0.088 c
+7.875 -0.088 7.805 -0.067 7.757 -0.015 c
+7.717 0.043 7.699 0.11 7.699 0.191 c
+7.699 0.278 7.717 0.353 7.757 0.411 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.058 0.5 8.129 0.47 8.169 0.411 c
+8.216 0.353 8.243 0.282 8.243 0.205 c
+10.326 -2.808 m
+10.326 -2.702 10.286 -2.613 10.209 -2.544 c
+10.128 -2.467 9.977 -2.378 9.753 -2.278 c
+9.488 -2.172 9.301 -2.08 9.194 -1.999 c
+9.084 -1.922 9.007 -1.834 8.959 -1.735 c
+8.908 -1.64 8.885 -1.522 8.885 -1.382 c
+8.885 -1.139 8.974 -0.938 9.151 -0.78 c
+9.327 -0.614 9.55 -0.53 9.826 -0.53 c
+10.12 -0.53 10.356 -0.618 10.532 -0.794 c
+10.708 -0.963 10.797 -1.176 10.797 -1.441 c
+10.311 -1.441 l
+10.311 -1.305 10.26 -1.191 10.165 -1.103 c
+10.076 -1.008 9.962 -0.956 9.826 -0.956 c
+9.679 -0.956 9.565 -0.996 9.488 -1.073 c
+9.407 -1.143 9.371 -1.243 9.371 -1.368 c
+9.371 -1.467 9.4 -1.544 9.459 -1.603 c
+9.517 -1.661 9.658 -1.742 9.885 -1.838 c
+10.246 -1.985 10.491 -2.128 10.62 -2.264 c
+10.756 -2.392 10.826 -2.565 10.826 -2.779 c
+10.826 -3.036 10.73 -3.242 10.547 -3.396 c
+10.37 -3.554 10.135 -3.631 9.841 -3.631 c
+9.525 -3.631 9.271 -3.543 9.076 -3.367 c
+8.889 -3.183 8.798 -2.951 8.798 -2.675 c
+9.282 -2.675 l
+9.29 -2.845 9.342 -2.977 9.429 -3.072 c
+9.525 -3.161 9.664 -3.205 9.841 -3.205 c
+9.995 -3.205 10.113 -3.172 10.194 -3.102 c
+10.282 -3.036 10.326 -2.937 10.326 -2.808 c
+14.015 -3.572 m
+13.986 -3.506 13.964 -3.396 13.957 -3.249 c
+13.78 -3.506 13.56 -3.631 13.295 -3.631 c
+13.02 -3.631 12.803 -3.558 12.648 -3.41 c
+12.502 -3.256 12.428 -3.04 12.428 -2.764 c
+12.428 -2.463 12.531 -2.22 12.737 -2.043 c
+12.943 -1.86 13.226 -1.764 13.589 -1.764 c
+13.942 -1.764 l
+13.942 -1.441 l
+13.942 -1.264 13.901 -1.143 13.824 -1.073 c
+13.743 -0.996 13.626 -0.956 13.471 -0.956 c
+13.325 -0.956 13.2 -1 13.104 -1.088 c
+13.016 -1.176 12.972 -1.287 12.972 -1.411 c
+12.486 -1.411 l
+12.486 -1.264 12.531 -1.125 12.619 -0.985 c
+12.708 -0.838 12.825 -0.728 12.972 -0.647 c
+13.126 -0.57 13.299 -0.53 13.486 -0.53 c
+13.799 -0.53 14.034 -0.611 14.192 -0.765 c
+14.346 -0.912 14.427 -1.133 14.427 -1.426 c
+14.427 -2.926 l
+14.435 -3.161 14.471 -3.363 14.53 -3.528 c
+14.53 -3.572 l
+h
+13.369 -3.19 m
+13.486 -3.19 13.596 -3.157 13.707 -3.087 c
+13.814 -3.021 13.891 -2.937 13.942 -2.837 c
+13.942 -2.132 l
+13.677 -2.132 l
+13.442 -2.132 13.255 -2.183 13.119 -2.278 c
+12.991 -2.378 12.928 -2.521 12.928 -2.705 c
+12.928 -2.874 12.957 -2.995 13.016 -3.072 c
+13.082 -3.153 13.2 -3.19 13.369 -3.19 c
+16.845 0.132 m
+16.845 -0.588 l
+17.301 -0.588 l
+17.301 -0.985 l
+16.845 -0.985 l
+16.845 -2.837 l
+16.845 -2.955 16.864 -3.043 16.904 -3.102 c
+16.941 -3.161 17.01 -3.19 17.11 -3.19 c
+17.169 -3.19 17.231 -3.183 17.301 -3.161 c
+17.301 -3.572 l
+17.184 -3.609 17.07 -3.631 16.963 -3.631 c
+16.764 -3.631 16.613 -3.565 16.507 -3.425 c
+16.407 -3.29 16.36 -3.095 16.36 -2.837 c
+16.36 -0.985 l
+15.904 -0.985 l
+15.904 -0.588 l
+16.36 -0.588 l
+16.36 0.132 l
+h
+19.297 -3.572 m
+19.266 -3.506 19.245 -3.396 19.237 -3.249 c
+19.061 -3.506 18.84 -3.631 18.576 -3.631 c
+18.3 -3.631 18.084 -3.558 17.93 -3.41 c
+17.782 -3.256 17.708 -3.04 17.708 -2.764 c
+17.708 -2.463 17.812 -2.22 18.017 -2.043 c
+18.223 -1.86 18.506 -1.764 18.87 -1.764 c
+19.223 -1.764 l
+19.223 -1.441 l
+19.223 -1.264 19.183 -1.143 19.106 -1.073 c
+19.025 -0.996 18.907 -0.956 18.753 -0.956 c
+18.605 -0.956 18.481 -1 18.385 -1.088 c
+18.296 -1.176 18.252 -1.287 18.252 -1.411 c
+17.768 -1.411 l
+17.768 -1.264 17.812 -1.125 17.899 -0.985 c
+17.988 -0.838 18.105 -0.728 18.252 -0.647 c
+18.406 -0.57 18.58 -0.53 18.767 -0.53 c
+19.079 -0.53 19.314 -0.611 19.472 -0.765 c
+19.627 -0.912 19.708 -1.133 19.708 -1.426 c
+19.708 -2.926 l
+19.715 -3.161 19.752 -3.363 19.811 -3.528 c
+19.811 -3.572 l
+h
+18.649 -3.19 m
+18.767 -3.19 18.877 -3.157 18.988 -3.087 c
+19.094 -3.021 19.171 -2.937 19.223 -2.837 c
+19.223 -2.132 l
+18.958 -2.132 l
+18.723 -2.132 18.535 -2.183 18.4 -2.278 c
+18.271 -2.378 18.208 -2.521 18.208 -2.705 c
+18.208 -2.874 18.238 -2.995 18.296 -3.072 c
+18.363 -3.153 18.481 -3.19 18.649 -3.19 c
+20.185 -1.941 m
+20.185 -1.482 20.266 -1.133 20.436 -0.897 c
+20.612 -0.655 20.862 -0.53 21.185 -0.53 c
+21.487 -0.53 21.718 -0.662 21.876 -0.927 c
+21.905 -0.588 l
+22.346 -0.588 l
+22.346 -3.602 l
+22.346 -3.973 22.247 -4.256 22.052 -4.454 c
+21.865 -4.649 21.604 -4.748 21.273 -4.748 c
+21.126 -4.748 20.957 -4.707 20.773 -4.63 c
+20.586 -4.561 20.45 -4.472 20.362 -4.366 c
+20.553 -4.028 l
+20.758 -4.233 20.983 -4.337 21.229 -4.337 c
+21.63 -4.337 21.836 -4.109 21.847 -3.66 c
+21.847 -3.278 l
+21.689 -3.514 21.468 -3.631 21.185 -3.631 c
+20.869 -3.631 20.627 -3.514 20.45 -3.278 c
+20.281 -3.043 20.193 -2.712 20.185 -2.278 c
+h
+20.671 -2.22 m
+20.671 -2.554 20.718 -2.801 20.818 -2.955 c
+20.913 -3.113 21.074 -3.19 21.303 -3.19 c
+21.545 -3.19 21.729 -3.069 21.847 -2.822 c
+21.847 -1.338 l
+21.729 -1.096 21.552 -0.971 21.317 -0.971 c
+21.09 -0.971 20.928 -1.052 20.833 -1.206 c
+20.733 -1.364 20.677 -1.603 20.671 -1.926 c
+h
+22.909 -3.308 m
+22.909 -3.219 22.931 -3.146 22.982 -3.087 c
+23.041 -3.028 23.118 -2.999 23.217 -2.999 c
+23.324 -2.999 23.401 -3.028 23.453 -3.087 c
+23.511 -3.146 23.54 -3.219 23.54 -3.308 c
+23.54 -3.389 23.511 -3.454 23.453 -3.514 c
+23.401 -3.572 23.324 -3.602 23.217 -3.602 c
+23.118 -3.602 23.041 -3.572 22.982 -3.514 c
+22.931 -3.454 22.909 -3.389 22.909 -3.308 c
+26.061 -3.572 -0.5 4.012 re
+27.421 0.132 m
+27.421 -0.588 l
+27.877 -0.588 l
+27.877 -0.985 l
+27.421 -0.985 l
+27.421 -2.837 l
+27.421 -2.955 27.44 -3.043 27.48 -3.102 c
+27.517 -3.161 27.586 -3.19 27.686 -3.19 c
+27.744 -3.19 27.807 -3.183 27.877 -3.161 c
+27.877 -3.572 l
+27.759 -3.609 27.646 -3.631 27.538 -3.631 c
+27.34 -3.631 27.189 -3.565 27.083 -3.425 c
+26.984 -3.29 26.936 -3.095 26.936 -2.837 c
+26.936 -0.985 l
+26.48 -0.985 l
+26.48 -0.588 l
+26.936 -0.588 l
+26.936 0.132 l
+h
+30.078 -3.572 -0.501 4.233 re
+30.647 -1.941 m
+30.647 -1.511 30.751 -1.169 30.956 -0.912 c
+31.17 -0.659 31.449 -0.53 31.794 -0.53 c
+32.136 -0.53 32.411 -0.659 32.617 -0.912 c
+32.83 -1.158 32.945 -1.492 32.955 -1.912 c
+32.955 -2.22 l
+32.955 -2.654 32.845 -2.995 32.632 -3.249 c
+32.426 -3.506 32.147 -3.631 31.794 -3.631 c
+31.449 -3.631 31.177 -3.51 30.971 -3.263 c
+30.765 -3.021 30.655 -2.687 30.647 -2.264 c
+h
+31.133 -2.22 m
+31.133 -2.536 31.191 -2.779 31.309 -2.955 c
+31.434 -3.124 31.596 -3.205 31.794 -3.205 c
+32.224 -3.205 32.448 -2.897 32.471 -2.278 c
+32.471 -1.941 l
+32.471 -1.64 32.404 -1.397 32.279 -1.22 c
+32.162 -1.044 32 -0.956 31.794 -0.956 c
+31.596 -0.956 31.434 -1.044 31.309 -1.22 c
+31.191 -1.397 31.133 -1.64 31.133 -1.941 c
+h
+33.294 -1.941 m
+33.294 -1.511 33.396 -1.169 33.602 -0.912 c
+33.815 -0.659 34.094 -0.53 34.44 -0.53 c
+34.782 -0.53 35.058 -0.659 35.263 -0.912 c
+35.476 -1.158 35.59 -1.492 35.601 -1.912 c
+35.601 -2.22 l
+35.601 -2.654 35.491 -2.995 35.278 -3.249 c
+35.072 -3.506 34.792 -3.631 34.44 -3.631 c
+34.094 -3.631 33.822 -3.51 33.616 -3.263 c
+33.411 -3.021 33.3 -2.687 33.294 -2.264 c
+h
+33.778 -2.22 m
+33.778 -2.536 33.837 -2.779 33.955 -2.955 c
+34.08 -3.124 34.241 -3.205 34.44 -3.205 c
+34.869 -3.205 35.094 -2.897 35.116 -2.278 c
+35.116 -1.941 l
+35.116 -1.64 35.05 -1.397 34.925 -1.22 c
+34.807 -1.044 34.646 -0.956 34.44 -0.956 c
+34.241 -0.956 34.08 -1.044 33.955 -1.22 c
+33.837 -1.397 33.778 -1.64 33.778 -1.941 c
+h
+36.791 -2.205 m
+36.527 -2.5 l
+36.527 -3.572 l
+36.042 -3.572 l
+36.042 0.661 l
+36.527 0.661 l
+36.527 -1.867 l
+37.453 -0.588 l
+38.042 -0.588 l
+37.101 -1.838 l
+38.173 -3.572 l
+37.6 -3.572 l
+h
+39.856 -2.808 m
+39.856 -2.702 39.816 -2.613 39.739 -2.544 c
+39.658 -2.467 39.507 -2.378 39.283 -2.278 c
+39.019 -2.172 38.831 -2.08 38.725 -1.999 c
+38.615 -1.922 38.537 -1.834 38.489 -1.735 c
+38.438 -1.64 38.416 -1.522 38.416 -1.382 c
+38.416 -1.139 38.504 -0.938 38.68 -0.78 c
+38.857 -0.614 39.081 -0.53 39.357 -0.53 c
+39.65 -0.53 39.885 -0.618 40.062 -0.794 c
+40.238 -0.963 40.327 -1.176 40.327 -1.441 c
+39.842 -1.441 l
+39.842 -1.305 39.79 -1.191 39.695 -1.103 c
+39.607 -1.008 39.492 -0.956 39.357 -0.956 c
+39.21 -0.956 39.096 -0.996 39.019 -1.073 c
+38.938 -1.143 38.901 -1.243 38.901 -1.368 c
+38.901 -1.467 38.931 -1.544 38.989 -1.603 c
+39.048 -1.661 39.187 -1.742 39.415 -1.838 c
+39.775 -1.985 40.022 -2.128 40.151 -2.264 c
+40.286 -2.392 40.356 -2.565 40.356 -2.779 c
+40.356 -3.036 40.261 -3.242 40.077 -3.396 c
+39.901 -3.554 39.665 -3.631 39.372 -3.631 c
+39.056 -3.631 38.802 -3.543 38.607 -3.367 c
+38.42 -3.183 38.328 -2.951 38.328 -2.675 c
+38.813 -2.675 l
+38.821 -2.845 38.871 -2.977 38.96 -3.072 c
+39.056 -3.161 39.195 -3.205 39.372 -3.205 c
+39.526 -3.205 39.644 -3.172 39.725 -3.102 c
+39.812 -3.036 39.856 -2.937 39.856 -2.808 c
+42.547 -3.572 -0.5 4.233 re
+43.752 -3.572 -0.5 2.984 re
+43.781 0.205 m
+43.781 0.118 43.756 0.043 43.708 -0.015 c
+43.667 -0.067 43.598 -0.088 43.502 -0.088 c
+43.413 -0.088 43.344 -0.067 43.296 -0.015 c
+43.255 0.043 43.237 0.11 43.237 0.191 c
+43.237 0.278 43.255 0.353 43.296 0.411 c
+43.344 0.47 43.413 0.5 43.502 0.5 c
+43.598 0.5 43.667 0.47 43.708 0.411 c
+43.756 0.353 43.781 0.282 43.781 0.205 c
+45.177 -2.205 m
+44.913 -2.5 l
+44.913 -3.572 l
+44.428 -3.572 l
+44.428 0.661 l
+44.913 0.661 l
+44.913 -1.867 l
+45.839 -0.588 l
+46.427 -0.588 l
+45.487 -1.838 l
+46.559 -3.572 l
+45.986 -3.572 l
+h
+47.808 -3.631 m
+47.434 -3.631 47.151 -3.525 46.956 -3.308 c
+46.758 -3.084 46.663 -2.756 46.663 -2.323 c
+46.663 -1.956 l
+46.663 -1.515 46.754 -1.169 46.941 -0.912 c
+47.136 -0.659 47.411 -0.53 47.764 -0.53 c
+48.107 -0.53 48.36 -0.643 48.529 -0.867 c
+48.705 -1.096 48.797 -1.441 48.808 -1.912 c
+48.808 -2.22 l
+47.147 -2.22 l
+47.147 -2.294 l
+47.147 -2.617 47.206 -2.852 47.324 -2.999 c
+47.441 -3.138 47.61 -3.205 47.839 -3.205 c
+47.985 -3.205 48.11 -3.183 48.22 -3.132 c
+48.327 -3.072 48.429 -2.984 48.529 -2.866 c
+48.779 -3.175 l
+48.573 -3.481 48.25 -3.631 47.808 -3.631 c
+47.764 -0.956 m
+47.559 -0.956 47.405 -1.025 47.309 -1.162 c
+47.21 -1.301 47.155 -1.515 47.147 -1.808 c
+48.323 -1.808 l
+48.323 -1.735 l
+48.301 -1.463 48.25 -1.264 48.161 -1.147 c
+48.074 -1.022 47.941 -0.956 47.764 -0.956 c
+51.954 -3.572 m
+51.924 -3.506 51.902 -3.396 51.895 -3.249 c
+51.719 -3.506 51.498 -3.631 51.234 -3.631 c
+50.958 -3.631 50.742 -3.558 50.586 -3.41 c
+50.44 -3.256 50.366 -3.04 50.366 -2.764 c
+50.366 -2.463 50.469 -2.22 50.675 -2.043 c
+50.881 -1.86 51.164 -1.764 51.527 -1.764 c
+51.88 -1.764 l
+51.88 -1.441 l
+51.88 -1.264 51.839 -1.143 51.762 -1.073 c
+51.682 -0.996 51.564 -0.956 51.41 -0.956 c
+51.263 -0.956 51.138 -1 51.043 -1.088 c
+50.954 -1.176 50.91 -1.287 50.91 -1.411 c
+50.426 -1.411 l
+50.426 -1.264 50.469 -1.125 50.557 -0.985 c
+50.646 -0.838 50.763 -0.728 50.91 -0.647 c
+51.064 -0.57 51.237 -0.53 51.425 -0.53 c
+51.737 -0.53 51.972 -0.611 52.13 -0.765 c
+52.284 -0.912 52.365 -1.133 52.365 -1.426 c
+52.365 -2.926 l
+52.373 -3.161 52.41 -3.363 52.468 -3.528 c
+52.468 -3.572 l
+h
+51.307 -3.19 m
+51.425 -3.19 51.535 -3.157 51.645 -3.087 c
+51.752 -3.021 51.829 -2.937 51.88 -2.837 c
+51.88 -2.132 l
+51.616 -2.132 l
+51.38 -2.132 51.193 -2.183 51.057 -2.278 c
+50.929 -2.378 50.866 -2.521 50.866 -2.705 c
+50.866 -2.874 50.896 -2.995 50.954 -3.072 c
+51.02 -3.153 51.138 -3.19 51.307 -3.19 c
+f
+Q
+q 1 0 0 1 559.3175 89.0664 cm
+0 0 m
+0.574 2.249 l
+1.073 2.249 l
+0.177 -0.735 l
+-0.176 -0.735 l
+-1.072 2.249 l
+-0.588 2.249 l
+h
+2.444 -0.794 m
+2.07 -0.794 1.786 -0.688 1.592 -0.47 c
+1.393 -0.246 1.297 0.081 1.297 0.515 c
+1.297 0.881 l
+1.297 1.323 1.389 1.668 1.577 1.926 c
+1.771 2.179 2.047 2.308 2.4 2.308 c
+2.741 2.308 2.995 2.194 3.165 1.97 c
+3.341 1.741 3.433 1.396 3.444 0.926 c
+3.444 0.617 l
+1.783 0.617 l
+1.783 0.544 l
+1.783 0.22 1.841 -0.015 1.959 -0.162 c
+2.076 -0.301 2.245 -0.368 2.473 -0.368 c
+2.621 -0.368 2.745 -0.345 2.856 -0.294 c
+2.962 -0.235 3.065 -0.147 3.165 -0.029 c
+3.414 -0.338 l
+3.209 -0.643 2.885 -0.794 2.444 -0.794 c
+2.4 1.881 m
+2.194 1.881 2.039 1.812 1.945 1.675 c
+1.845 1.536 1.79 1.323 1.783 1.029 c
+2.959 1.029 l
+2.959 1.103 l
+2.936 1.374 2.885 1.573 2.797 1.691 c
+2.708 1.816 2.577 1.881 2.4 1.881 c
+5.09 1.793 m
+5.02 1.801 4.946 1.808 4.869 1.808 c
+4.612 1.808 4.436 1.668 4.341 1.396 c
+4.341 -0.735 l
+3.855 -0.735 l
+3.855 2.249 l
+4.325 2.249 l
+4.341 1.94 l
+4.465 2.183 4.649 2.308 4.884 2.308 c
+4.961 2.308 5.023 2.293 5.075 2.263 c
+h
+6.901 0.029 m
+6.901 0.135 6.861 0.224 6.784 0.294 c
+6.703 0.371 6.552 0.459 6.328 0.559 c
+6.064 0.665 5.876 0.757 5.77 0.838 c
+5.659 0.915 5.582 1.003 5.534 1.103 c
+5.483 1.198 5.461 1.315 5.461 1.455 c
+5.461 1.698 5.549 1.899 5.725 2.057 c
+5.902 2.223 6.126 2.308 6.402 2.308 c
+6.696 2.308 6.931 2.219 7.107 2.043 c
+7.284 1.874 7.372 1.661 7.372 1.396 c
+6.887 1.396 l
+6.887 1.532 6.835 1.646 6.739 1.735 c
+6.652 1.83 6.538 1.881 6.402 1.881 c
+6.255 1.881 6.141 1.841 6.064 1.764 c
+5.983 1.694 5.946 1.595 5.946 1.469 c
+5.946 1.371 5.976 1.294 6.034 1.234 c
+6.093 1.176 6.232 1.095 6.461 0.999 c
+6.82 0.852 7.067 0.709 7.196 0.573 c
+7.331 0.445 7.402 0.272 7.402 0.058 c
+7.402 -0.199 7.306 -0.405 7.122 -0.559 c
+6.945 -0.717 6.71 -0.794 6.417 -0.794 c
+6.101 -0.794 5.847 -0.706 5.652 -0.53 c
+5.465 -0.345 5.373 -0.114 5.373 0.162 c
+5.858 0.162 l
+5.865 -0.008 5.916 -0.14 6.005 -0.235 c
+6.101 -0.324 6.24 -0.368 6.417 -0.368 c
+6.571 -0.368 6.689 -0.335 6.77 -0.264 c
+6.857 -0.199 6.901 -0.1 6.901 0.029 c
+8.386 -0.735 -0.5 2.984 re
+8.416 3.042 m
+8.416 2.955 8.389 2.881 8.342 2.822 c
+8.302 2.77 8.231 2.749 8.136 2.749 c
+8.048 2.749 7.978 2.77 7.93 2.822 c
+7.89 2.881 7.872 2.947 7.872 3.028 c
+7.872 3.116 7.89 3.19 7.93 3.248 c
+7.978 3.308 8.048 3.337 8.136 3.337 c
+8.231 3.337 8.302 3.308 8.342 3.248 c
+8.389 3.19 8.416 3.119 8.416 3.042 c
+8.96 0.897 m
+8.96 1.326 9.062 1.668 9.268 1.926 c
+9.481 2.179 9.76 2.308 10.106 2.308 c
+10.448 2.308 10.723 2.179 10.93 1.926 c
+11.142 1.679 11.256 1.345 11.267 0.926 c
+11.267 0.617 l
+11.267 0.183 11.157 -0.158 10.944 -0.412 c
+10.738 -0.669 10.459 -0.794 10.106 -0.794 c
+9.76 -0.794 9.488 -0.673 9.283 -0.426 c
+9.077 -0.183 8.967 0.151 8.96 0.573 c
+h
+9.444 0.617 m
+9.444 0.301 9.503 0.058 9.621 -0.118 c
+9.746 -0.287 9.908 -0.368 10.106 -0.368 c
+10.536 -0.368 10.76 -0.059 10.782 0.559 c
+10.782 0.897 l
+10.782 1.198 10.716 1.44 10.591 1.617 c
+10.473 1.793 10.311 1.881 10.106 1.881 c
+9.908 1.881 9.746 1.793 9.621 1.617 c
+9.503 1.44 9.444 1.198 9.444 0.897 c
+h
+12.16 2.249 m
+12.175 1.926 l
+12.358 2.179 12.601 2.308 12.895 2.308 c
+13.424 2.308 13.692 1.955 13.704 1.249 c
+13.704 -0.735 l
+13.218 -0.735 l
+13.218 1.22 l
+13.218 1.455 13.178 1.621 13.101 1.72 c
+13.02 1.816 12.902 1.866 12.748 1.866 c
+12.63 1.866 12.52 1.826 12.424 1.749 c
+12.326 1.668 12.248 1.562 12.189 1.426 c
+12.189 -0.735 l
+11.705 -0.735 l
+11.705 2.249 l
+h
+16.9 0.029 m
+16.9 0.135 16.86 0.224 16.783 0.294 c
+16.702 0.371 16.551 0.459 16.327 0.559 c
+16.063 0.665 15.875 0.757 15.769 0.838 c
+15.659 0.915 15.581 1.003 15.533 1.103 c
+15.482 1.198 15.46 1.315 15.46 1.455 c
+15.46 1.698 15.549 1.899 15.724 2.057 c
+15.901 2.223 16.125 2.308 16.401 2.308 c
+16.694 2.308 16.93 2.219 17.106 2.043 c
+17.282 1.874 17.371 1.661 17.371 1.396 c
+16.886 1.396 l
+16.886 1.532 16.835 1.646 16.739 1.735 c
+16.651 1.83 16.536 1.881 16.401 1.881 c
+16.254 1.881 16.14 1.841 16.063 1.764 c
+15.982 1.694 15.946 1.595 15.946 1.469 c
+15.946 1.371 15.975 1.294 16.033 1.234 c
+16.092 1.176 16.231 1.095 16.459 0.999 c
+16.819 0.852 17.066 0.709 17.195 0.573 c
+17.33 0.445 17.4 0.272 17.4 0.058 c
+17.4 -0.199 17.305 -0.405 17.121 -0.559 c
+16.945 -0.717 16.709 -0.794 16.416 -0.794 c
+16.1 -0.794 15.846 -0.706 15.651 -0.53 c
+15.464 -0.345 15.372 -0.114 15.372 0.162 c
+15.857 0.162 l
+15.865 -0.008 15.915 -0.14 16.004 -0.235 c
+16.1 -0.324 16.239 -0.368 16.416 -0.368 c
+16.57 -0.368 16.688 -0.335 16.769 -0.264 c
+16.856 -0.199 16.9 -0.1 16.9 0.029 c
+17.756 0.897 m
+17.756 1.326 17.86 1.668 18.066 1.926 c
+18.279 2.179 18.558 2.308 18.903 2.308 c
+19.245 2.308 19.52 2.179 19.726 1.926 c
+19.94 1.679 20.054 1.345 20.064 0.926 c
+20.064 0.617 l
+20.064 0.183 19.954 -0.158 19.741 -0.412 c
+19.535 -0.669 19.256 -0.794 18.903 -0.794 c
+18.558 -0.794 18.286 -0.673 18.08 -0.426 c
+17.874 -0.183 17.764 0.151 17.756 0.573 c
+h
+18.242 0.617 m
+18.242 0.301 18.301 0.058 18.418 -0.118 c
+18.543 -0.287 18.705 -0.368 18.903 -0.368 c
+19.333 -0.368 19.557 -0.059 19.58 0.559 c
+19.58 0.897 l
+19.58 1.198 19.514 1.44 19.389 1.617 c
+19.271 1.793 19.109 1.881 18.903 1.881 c
+18.705 1.881 18.543 1.793 18.418 1.617 c
+18.301 1.44 18.242 1.198 18.242 0.897 c
+h
+22.236 -0.735 -0.5 2.984 re
+22.265 3.042 m
+22.265 2.955 22.24 2.881 22.192 2.822 c
+22.152 2.77 22.082 2.749 21.986 2.749 c
+21.898 2.749 21.829 2.77 21.781 2.822 c
+21.74 2.881 21.722 2.947 21.722 3.028 c
+21.722 3.116 21.74 3.19 21.781 3.248 c
+21.829 3.308 21.898 3.337 21.986 3.337 c
+22.082 3.337 22.152 3.308 22.192 3.248 c
+22.24 3.19 22.265 3.119 22.265 3.042 c
+23.541 2.969 m
+23.541 2.249 l
+23.996 2.249 l
+23.996 1.852 l
+23.541 1.852 l
+23.541 0 l
+23.541 -0.118 23.559 -0.206 23.599 -0.264 c
+23.636 -0.324 23.707 -0.353 23.805 -0.353 c
+23.865 -0.353 23.927 -0.345 23.996 -0.324 c
+23.996 -0.735 l
+23.879 -0.771 23.765 -0.794 23.659 -0.794 c
+23.46 -0.794 23.31 -0.728 23.202 -0.588 c
+23.104 -0.452 23.056 -0.258 23.056 0 c
+23.056 1.852 l
+22.6 1.852 l
+22.6 2.249 l
+23.056 2.249 l
+23.056 2.969 l
+h
+24.787 3.19 m
+24.742 2.175 l
+24.375 2.175 l
+24.39 3.499 l
+24.787 3.499 l
+h
+26.613 0.029 m
+26.613 0.135 26.572 0.224 26.495 0.294 c
+26.414 0.371 26.263 0.459 26.04 0.559 c
+25.775 0.665 25.588 0.757 25.481 0.838 c
+25.371 0.915 25.294 1.003 25.246 1.103 c
+25.195 1.198 25.172 1.315 25.172 1.455 c
+25.172 1.698 25.261 1.899 25.437 2.057 c
+25.613 2.223 25.837 2.308 26.113 2.308 c
+26.407 2.308 26.643 2.219 26.819 2.043 c
+26.995 1.874 27.083 1.661 27.083 1.396 c
+26.598 1.396 l
+26.598 1.532 26.547 1.646 26.452 1.735 c
+26.363 1.83 26.249 1.881 26.113 1.881 c
+25.966 1.881 25.852 1.841 25.775 1.764 c
+25.694 1.694 25.658 1.595 25.658 1.469 c
+25.658 1.371 25.687 1.294 25.746 1.234 c
+25.804 1.176 25.944 1.095 26.172 0.999 c
+26.533 0.852 26.778 0.709 26.907 0.573 c
+27.042 0.445 27.113 0.272 27.113 0.058 c
+27.113 -0.199 27.017 -0.405 26.834 -0.559 c
+26.657 -0.717 26.422 -0.794 26.128 -0.794 c
+25.812 -0.794 25.558 -0.706 25.363 -0.53 c
+25.176 -0.345 25.084 -0.114 25.084 0.162 c
+25.569 0.162 l
+25.577 -0.008 25.629 -0.14 25.716 -0.235 c
+25.812 -0.324 25.951 -0.368 26.128 -0.368 c
+26.282 -0.368 26.4 -0.335 26.481 -0.264 c
+26.569 -0.199 26.613 -0.1 26.613 0.029 c
+30.92 0.617 m
+30.92 0.147 30.836 -0.206 30.67 -0.441 c
+30.501 -0.676 30.262 -0.794 29.949 -0.794 c
+29.645 -0.794 29.413 -0.684 29.259 -0.455 c
+29.259 -1.881 l
+28.773 -1.881 l
+28.773 2.249 l
+29.215 2.249 l
+29.244 1.911 l
+29.398 2.175 29.629 2.308 29.935 2.308 c
+30.265 2.308 30.512 2.19 30.67 1.955 c
+30.836 1.727 30.92 1.389 30.92 0.941 c
+h
+30.435 0.897 m
+30.435 1.228 30.379 1.473 30.273 1.631 c
+30.174 1.786 30.012 1.866 29.788 1.866 c
+29.552 1.866 29.376 1.749 29.259 1.514 c
+29.259 -0.029 l
+29.376 -0.258 29.556 -0.368 29.803 -0.368 c
+30.016 -0.368 30.174 -0.291 30.273 -0.133 c
+30.379 0.022 30.435 0.264 30.435 0.588 c
+h
+32.614 1.793 m
+32.544 1.801 32.471 1.808 32.393 1.808 c
+32.137 1.808 31.96 1.668 31.864 1.396 c
+31.864 -0.735 l
+31.379 -0.735 l
+31.379 2.249 l
+31.85 2.249 l
+31.864 1.94 l
+31.989 2.183 32.173 2.308 32.408 2.308 c
+32.486 2.308 32.548 2.293 32.599 2.263 c
+h
+32.831 0.897 m
+32.831 1.326 32.933 1.668 33.139 1.926 c
+33.353 2.179 33.631 2.308 33.978 2.308 c
+34.319 2.308 34.595 2.179 34.801 1.926 c
+35.013 1.679 35.127 1.345 35.138 0.926 c
+35.138 0.617 l
+35.138 0.183 35.028 -0.158 34.815 -0.412 c
+34.609 -0.669 34.33 -0.794 33.978 -0.794 c
+33.631 -0.794 33.36 -0.673 33.154 -0.426 c
+32.948 -0.183 32.838 0.151 32.831 0.573 c
+h
+33.315 0.617 m
+33.315 0.301 33.375 0.058 33.492 -0.118 c
+33.617 -0.287 33.779 -0.368 33.978 -0.368 c
+34.408 -0.368 34.631 -0.059 34.653 0.559 c
+34.653 0.897 l
+34.653 1.198 34.587 1.44 34.462 1.617 c
+34.344 1.793 34.183 1.881 33.978 1.881 c
+33.779 1.881 33.617 1.793 33.492 1.617 c
+33.375 1.44 33.315 1.198 33.315 0.897 c
+h
+37.737 0.617 m
+37.737 0.147 37.652 -0.206 37.487 -0.441 c
+37.317 -0.676 37.076 -0.794 36.752 -0.794 c
+36.436 -0.794 36.201 -0.658 36.046 -0.382 c
+36.017 -0.735 l
+35.576 -0.735 l
+35.576 3.499 l
+36.06 3.499 l
+36.06 1.926 l
+36.215 2.179 36.447 2.308 36.752 2.308 c
+37.076 2.308 37.317 2.19 37.487 1.955 c
+37.652 1.72 37.737 1.371 37.737 0.912 c
+h
+37.251 0.897 m
+37.251 1.249 37.2 1.5 37.105 1.646 c
+37.005 1.793 36.843 1.866 36.619 1.866 c
+36.373 1.866 36.185 1.727 36.06 1.455 c
+36.06 0.044 l
+36.178 -0.22 36.37 -0.353 36.634 -0.353 c
+36.847 -0.353 37.005 -0.279 37.105 -0.133 c
+37.2 0.022 37.251 0.264 37.251 0.588 c
+h
+39.71 -0.735 m
+39.68 -0.669 39.659 -0.559 39.651 -0.412 c
+39.474 -0.669 39.254 -0.794 38.99 -0.794 c
+38.714 -0.794 38.497 -0.721 38.343 -0.573 c
+38.196 -0.419 38.122 -0.202 38.122 0.073 c
+38.122 0.374 38.225 0.617 38.431 0.794 c
+38.637 0.977 38.919 1.073 39.283 1.073 c
+39.636 1.073 l
+39.636 1.396 l
+39.636 1.573 39.596 1.694 39.519 1.764 c
+39.438 1.841 39.32 1.881 39.166 1.881 c
+39.019 1.881 38.894 1.837 38.799 1.749 c
+38.71 1.661 38.666 1.55 38.666 1.426 c
+38.181 1.426 l
+38.181 1.573 38.225 1.712 38.313 1.852 c
+38.402 1.999 38.519 2.109 38.666 2.19 c
+38.82 2.267 38.994 2.308 39.181 2.308 c
+39.493 2.308 39.728 2.227 39.886 2.072 c
+40.041 1.926 40.122 1.705 40.122 1.411 c
+40.122 -0.088 l
+40.129 -0.324 40.166 -0.526 40.224 -0.691 c
+40.224 -0.735 l
+h
+39.063 -0.353 m
+39.181 -0.353 39.291 -0.32 39.401 -0.25 c
+39.507 -0.183 39.584 -0.1 39.636 0 c
+39.636 0.706 l
+39.372 0.706 l
+39.137 0.706 38.949 0.654 38.813 0.559 c
+38.684 0.459 38.622 0.316 38.622 0.133 c
+38.622 -0.037 38.651 -0.158 38.71 -0.235 c
+38.776 -0.316 38.894 -0.353 39.063 -0.353 c
+42.863 0.617 m
+42.863 0.147 42.778 -0.206 42.613 -0.441 c
+42.444 -0.676 42.202 -0.794 41.878 -0.794 c
+41.562 -0.794 41.327 -0.658 41.172 -0.382 c
+41.143 -0.735 l
+40.702 -0.735 l
+40.702 3.499 l
+41.187 3.499 l
+41.187 1.926 l
+41.342 2.179 41.573 2.308 41.878 2.308 c
+42.202 2.308 42.444 2.19 42.613 1.955 c
+42.778 1.72 42.863 1.371 42.863 0.912 c
+h
+42.377 0.897 m
+42.377 1.249 42.327 1.5 42.231 1.646 c
+42.132 1.793 41.97 1.866 41.745 1.866 c
+41.5 1.866 41.312 1.727 41.187 1.455 c
+41.187 0.044 l
+41.305 -0.22 41.496 -0.353 41.76 -0.353 c
+41.974 -0.353 42.132 -0.279 42.231 -0.133 c
+42.327 0.022 42.377 0.264 42.377 0.588 c
+h
+43.833 -0.735 -0.5 4.233 re
+45.317 0.073 m
+45.861 2.249 l
+46.376 2.249 l
+45.406 -1.161 l
+45.336 -1.415 45.233 -1.606 45.097 -1.735 c
+44.957 -1.87 44.806 -1.941 44.642 -1.941 c
+44.571 -1.941 44.487 -1.926 44.392 -1.897 c
+44.392 -1.484 l
+44.494 -1.5 l
+44.631 -1.5 44.737 -1.463 44.818 -1.396 c
+44.906 -1.326 44.972 -1.209 45.024 -1.043 c
+45.112 -0.706 l
+44.245 2.249 l
+44.773 2.249 l
+h
+49.433 -0.735 m
+49.404 -0.669 49.382 -0.559 49.375 -0.412 c
+49.198 -0.669 48.978 -0.794 48.713 -0.794 c
+48.438 -0.794 48.22 -0.721 48.066 -0.573 c
+47.919 -0.419 47.846 -0.202 47.846 0.073 c
+47.846 0.374 47.949 0.617 48.155 0.794 c
+48.361 0.977 48.643 1.073 49.007 1.073 c
+49.36 1.073 l
+49.36 1.396 l
+49.36 1.573 49.319 1.694 49.242 1.764 c
+49.161 1.841 49.044 1.881 48.889 1.881 c
+48.742 1.881 48.617 1.837 48.521 1.749 c
+48.434 1.661 48.39 1.55 48.39 1.426 c
+47.904 1.426 l
+47.904 1.573 47.949 1.712 48.037 1.852 c
+48.125 1.999 48.243 2.109 48.39 2.19 c
+48.544 2.267 48.717 2.308 48.904 2.308 c
+49.217 2.308 49.452 2.227 49.61 2.072 c
+49.764 1.926 49.845 1.705 49.845 1.411 c
+49.845 -0.088 l
+49.853 -0.324 49.889 -0.526 49.948 -0.691 c
+49.948 -0.735 l
+h
+48.787 -0.353 m
+48.904 -0.353 49.014 -0.32 49.124 -0.25 c
+49.231 -0.183 49.308 -0.1 49.36 0 c
+49.36 0.706 l
+49.095 0.706 l
+48.86 0.706 48.673 0.654 48.536 0.559 c
+48.408 0.459 48.346 0.316 48.346 0.133 c
+48.346 -0.037 48.375 -0.158 48.434 -0.235 c
+48.5 -0.316 48.617 -0.353 48.787 -0.353 c
+50.881 2.249 m
+50.896 1.926 l
+51.079 2.179 51.322 2.308 51.616 2.308 c
+52.145 2.308 52.413 1.955 52.425 1.249 c
+52.425 -0.735 l
+51.939 -0.735 l
+51.939 1.22 l
+51.939 1.455 51.899 1.621 51.822 1.72 c
+51.741 1.816 51.623 1.866 51.469 1.866 c
+51.351 1.866 51.241 1.826 51.146 1.749 c
+51.046 1.668 50.969 1.562 50.911 1.426 c
+50.911 -0.735 l
+50.425 -0.735 l
+50.425 2.249 l
+h
+54.078 0.897 m
+54.078 1.326 54.181 1.668 54.387 1.926 c
+54.6 2.179 54.879 2.308 55.225 2.308 c
+55.567 2.308 55.842 2.179 56.047 1.926 c
+56.261 1.679 56.375 1.345 56.386 0.926 c
+56.386 0.617 l
+56.386 0.183 56.276 -0.158 56.062 -0.412 c
+55.856 -0.669 55.577 -0.794 55.225 -0.794 c
+54.879 -0.794 54.607 -0.673 54.401 -0.426 c
+54.196 -0.183 54.086 0.151 54.078 0.573 c
+h
+54.563 0.617 m
+54.563 0.301 54.622 0.058 54.74 -0.118 c
+54.865 -0.287 55.027 -0.368 55.225 -0.368 c
+55.655 -0.368 55.879 -0.059 55.901 0.559 c
+55.901 0.897 l
+55.901 1.198 55.835 1.44 55.71 1.617 c
+55.592 1.793 55.43 1.881 55.225 1.881 c
+55.027 1.881 54.865 1.793 54.74 1.617 c
+54.622 1.44 54.563 1.198 54.563 0.897 c
+h
+58.984 0.617 m
+58.984 0.147 58.9 -0.206 58.734 -0.441 c
+58.565 -0.676 58.322 -0.794 57.999 -0.794 c
+57.683 -0.794 57.448 -0.658 57.294 -0.382 c
+57.264 -0.735 l
+56.823 -0.735 l
+56.823 3.499 l
+57.308 3.499 l
+57.308 1.926 l
+57.462 2.179 57.694 2.308 57.999 2.308 c
+58.322 2.308 58.565 2.19 58.734 1.955 c
+58.9 1.72 58.984 1.371 58.984 0.912 c
+h
+58.499 0.897 m
+58.499 1.249 58.447 1.5 58.352 1.646 c
+58.252 1.793 58.091 1.866 57.867 1.866 c
+57.62 1.866 57.433 1.727 57.308 1.455 c
+57.308 0.044 l
+57.425 -0.22 57.616 -0.353 57.882 -0.353 c
+58.094 -0.353 58.252 -0.279 58.352 -0.133 c
+58.447 0.022 58.499 0.264 58.499 0.588 c
+h
+59.929 2.249 m
+59.929 -1.118 l
+59.918 -1.665 59.696 -1.941 59.267 -1.941 c
+59.168 -1.941 59.079 -1.926 59.002 -1.897 c
+59.002 -1.484 l
+59.054 -1.492 59.112 -1.5 59.193 -1.5 c
+59.27 -1.5 59.33 -1.47 59.37 -1.411 c
+59.418 -1.353 59.443 -1.242 59.443 -1.087 c
+59.443 2.249 l
+h
+59.943 3.042 m
+59.943 2.955 59.918 2.881 59.87 2.822 c
+59.829 2.77 59.76 2.749 59.664 2.749 c
+59.575 2.749 59.505 2.77 59.458 2.822 c
+59.418 2.881 59.399 2.947 59.399 3.028 c
+59.399 3.116 59.418 3.19 59.458 3.248 c
+59.505 3.308 59.575 3.337 59.664 3.337 c
+59.76 3.337 59.829 3.308 59.87 3.248 c
+59.918 3.19 59.943 3.119 59.943 3.042 c
+61.67 -0.794 m
+61.296 -0.794 61.013 -0.688 60.818 -0.47 c
+60.619 -0.246 60.523 0.081 60.523 0.515 c
+60.523 0.881 l
+60.523 1.323 60.616 1.668 60.803 1.926 c
+60.997 2.179 61.273 2.308 61.626 2.308 c
+61.967 2.308 62.221 2.194 62.391 1.97 c
+62.567 1.741 62.659 1.396 62.67 0.926 c
+62.67 0.617 l
+61.009 0.617 l
+61.009 0.544 l
+61.009 0.22 61.067 -0.015 61.185 -0.162 c
+61.302 -0.301 61.472 -0.368 61.699 -0.368 c
+61.847 -0.368 61.971 -0.345 62.082 -0.294 c
+62.189 -0.235 62.291 -0.147 62.391 -0.029 c
+62.64 -0.338 l
+62.435 -0.643 62.111 -0.794 61.67 -0.794 c
+61.626 1.881 m
+61.42 1.881 61.266 1.812 61.171 1.675 c
+61.071 1.536 61.016 1.323 61.009 1.029 c
+62.185 1.029 l
+62.185 1.103 l
+62.162 1.374 62.111 1.573 62.023 1.691 c
+61.935 1.816 61.803 1.881 61.626 1.881 c
+64.11 -0.368 m
+64.276 -0.368 64.408 -0.32 64.507 -0.22 c
+64.602 -0.125 64.658 0.018 64.669 0.206 c
+65.125 0.206 l
+65.113 -0.081 65.011 -0.32 64.816 -0.515 c
+64.629 -0.702 64.394 -0.794 64.11 -0.794 c
+63.746 -0.794 63.467 -0.676 63.272 -0.441 c
+63.074 -0.206 62.979 0.139 62.979 0.603 c
+62.979 0.926 l
+62.979 1.374 63.07 1.72 63.258 1.955 c
+63.453 2.19 63.735 2.308 64.11 2.308 c
+64.411 2.308 64.654 2.209 64.83 2.014 c
+65.014 1.816 65.113 1.55 65.125 1.22 c
+64.669 1.22 l
+64.647 1.444 64.588 1.61 64.492 1.72 c
+64.404 1.826 64.276 1.881 64.11 1.881 c
+63.893 1.881 63.731 1.808 63.625 1.661 c
+63.526 1.521 63.471 1.294 63.463 0.97 c
+63.463 0.588 l
+63.463 0.235 63.511 -0.015 63.611 -0.162 c
+63.717 -0.301 63.883 -0.368 64.11 -0.368 c
+66.15 2.969 m
+66.15 2.249 l
+66.605 2.249 l
+66.605 1.852 l
+66.15 1.852 l
+66.15 0 l
+66.15 -0.118 66.168 -0.206 66.208 -0.264 c
+66.245 -0.324 66.315 -0.353 66.414 -0.353 c
+66.474 -0.353 66.536 -0.345 66.605 -0.324 c
+66.605 -0.735 l
+66.488 -0.771 66.374 -0.794 66.268 -0.794 c
+66.069 -0.794 65.919 -0.728 65.811 -0.588 c
+65.713 -0.452 65.664 -0.258 65.664 0 c
+65.664 1.852 l
+65.209 1.852 l
+65.209 2.249 l
+65.664 2.249 l
+65.664 2.969 l
+h
+f
+Q
+q 1 0 0 1 594.1917 83.3777 cm
+0 0 m
+0 0.478 0.062 0.929 0.191 1.353 c
+0.326 1.783 0.515 2.153 0.75 2.469 c
+0.896 2.664 1.036 2.807 1.176 2.896 c
+1.263 2.558 l
+1.047 2.352 0.867 2.032 0.72 1.602 c
+0.58 1.18 0.507 0.709 0.5 0.191 c
+0.484 -0.029 l
+0.484 -0.676 0.577 -1.249 0.764 -1.749 c
+0.9 -2.12 1.066 -2.41 1.263 -2.616 c
+1.176 -2.925 l
+0.999 -2.815 0.827 -2.631 0.661 -2.367 c
+0.22 -1.708 0 -0.922 0 0 c
+3.197 -1.631 m
+3.167 -1.565 3.145 -1.455 3.138 -1.309 c
+2.961 -1.565 2.741 -1.691 2.477 -1.691 c
+2.201 -1.691 1.984 -1.617 1.83 -1.469 c
+1.683 -1.315 1.61 -1.099 1.61 -0.823 c
+1.61 -0.522 1.712 -0.279 1.918 -0.103 c
+2.123 0.081 2.406 0.177 2.77 0.177 c
+3.123 0.177 l
+3.123 0.5 l
+3.123 0.676 3.083 0.798 3.006 0.867 c
+2.925 0.945 2.807 0.985 2.653 0.985 c
+2.506 0.985 2.381 0.941 2.285 0.852 c
+2.198 0.765 2.153 0.654 2.153 0.53 c
+1.668 0.53 l
+1.668 0.676 1.712 0.816 1.801 0.956 c
+1.888 1.103 2.007 1.213 2.153 1.294 c
+2.308 1.371 2.48 1.411 2.668 1.411 c
+2.98 1.411 3.215 1.33 3.373 1.176 c
+3.528 1.029 3.609 0.808 3.609 0.515 c
+3.609 -0.985 l
+3.615 -1.22 3.653 -1.422 3.711 -1.587 c
+3.711 -1.631 l
+h
+2.55 -1.249 m
+2.668 -1.249 2.778 -1.216 2.888 -1.147 c
+2.994 -1.08 3.071 -0.996 3.123 -0.897 c
+3.123 -0.191 l
+2.859 -0.191 l
+2.624 -0.191 2.437 -0.243 2.3 -0.338 c
+2.171 -0.437 2.109 -0.58 2.109 -0.764 c
+2.109 -0.933 2.138 -1.055 2.198 -1.132 c
+2.263 -1.213 2.381 -1.249 2.55 -1.249 c
+4.644 1.353 m
+4.659 1.029 l
+4.843 1.282 5.086 1.411 5.379 1.411 c
+5.909 1.411 6.177 1.058 6.188 0.353 c
+6.188 -1.631 l
+5.703 -1.631 l
+5.703 0.324 l
+5.703 0.559 5.662 0.724 5.585 0.823 c
+5.504 0.919 5.387 0.97 5.232 0.97 c
+5.115 0.97 5.005 0.929 4.909 0.852 c
+4.81 0.771 4.733 0.665 4.674 0.53 c
+4.674 -1.631 l
+4.189 -1.631 l
+4.189 1.353 l
+h
+7.198 1.353 m
+7.214 1.029 l
+7.397 1.282 7.64 1.411 7.933 1.411 c
+8.463 1.411 8.731 1.058 8.742 0.353 c
+8.742 -1.631 l
+8.257 -1.631 l
+8.257 0.324 l
+8.257 0.559 8.216 0.724 8.139 0.823 c
+8.058 0.919 7.941 0.97 7.786 0.97 c
+7.669 0.97 7.559 0.929 7.463 0.852 c
+7.364 0.771 7.287 0.665 7.228 0.53 c
+7.228 -1.631 l
+6.743 -1.631 l
+6.743 1.353 l
+h
+9.19 0 m
+9.19 0.43 9.294 0.771 9.499 1.029 c
+9.712 1.282 9.992 1.411 10.337 1.411 c
+10.678 1.411 10.954 1.282 11.16 1.029 c
+11.374 0.783 11.487 0.449 11.498 0.029 c
+11.498 -0.279 l
+11.498 -0.713 11.388 -1.055 11.175 -1.309 c
+10.969 -1.565 10.69 -1.691 10.337 -1.691 c
+9.992 -1.691 9.72 -1.569 9.514 -1.323 c
+9.308 -1.08 9.198 -0.746 9.19 -0.324 c
+h
+9.676 -0.279 m
+9.676 -0.595 9.734 -0.838 9.851 -1.014 c
+9.977 -1.183 10.138 -1.264 10.337 -1.264 c
+10.767 -1.264 10.991 -0.956 11.013 -0.338 c
+11.013 0 l
+11.013 0.301 10.946 0.544 10.822 0.721 c
+10.705 0.897 10.543 0.985 10.337 0.985 c
+10.138 0.985 9.977 0.897 9.851 0.721 c
+9.734 0.544 9.676 0.301 9.676 0 c
+h
+12.571 2.072 m
+12.571 1.353 l
+13.026 1.353 l
+13.026 0.956 l
+12.571 0.956 l
+12.571 -0.897 l
+12.571 -1.014 12.59 -1.103 12.629 -1.161 c
+12.667 -1.22 12.737 -1.249 12.835 -1.249 c
+12.895 -1.249 12.957 -1.242 13.026 -1.22 c
+13.026 -1.631 l
+12.909 -1.668 12.795 -1.691 12.689 -1.691 c
+12.49 -1.691 12.34 -1.625 12.233 -1.484 c
+12.134 -1.349 12.086 -1.154 12.086 -0.897 c
+12.086 0.956 l
+11.63 0.956 l
+11.63 1.353 l
+12.086 1.353 l
+12.086 2.072 l
+h
+15.022 -1.631 m
+14.993 -1.565 14.971 -1.455 14.963 -1.309 c
+14.786 -1.565 14.566 -1.691 14.302 -1.691 c
+14.026 -1.691 13.809 -1.617 13.655 -1.469 c
+13.508 -1.315 13.435 -1.099 13.435 -0.823 c
+13.435 -0.522 13.537 -0.279 13.743 -0.103 c
+13.949 0.081 14.232 0.177 14.596 0.177 c
+14.948 0.177 l
+14.948 0.5 l
+14.948 0.676 14.908 0.798 14.831 0.867 c
+14.75 0.945 14.632 0.985 14.478 0.985 c
+14.331 0.985 14.206 0.941 14.111 0.852 c
+14.023 0.765 13.978 0.654 13.978 0.53 c
+13.493 0.53 l
+13.493 0.676 13.537 0.816 13.626 0.956 c
+13.714 1.103 13.832 1.213 13.978 1.294 c
+14.133 1.371 14.306 1.411 14.493 1.411 c
+14.805 1.411 15.041 1.33 15.199 1.176 c
+15.353 1.029 15.434 0.808 15.434 0.515 c
+15.434 -0.985 l
+15.441 -1.22 15.478 -1.422 15.536 -1.587 c
+15.536 -1.631 l
+h
+14.375 -1.249 m
+14.493 -1.249 14.603 -1.216 14.713 -1.147 c
+14.82 -1.08 14.898 -0.996 14.948 -0.897 c
+14.948 -0.191 l
+14.684 -0.191 l
+14.449 -0.191 14.262 -0.243 14.125 -0.338 c
+13.997 -0.437 13.934 -0.58 13.934 -0.764 c
+13.934 -0.933 13.963 -1.055 14.023 -1.132 c
+14.089 -1.213 14.206 -1.249 14.375 -1.249 c
+16.646 2.072 m
+16.646 1.353 l
+17.102 1.353 l
+17.102 0.956 l
+16.646 0.956 l
+16.646 -0.897 l
+16.646 -1.014 16.665 -1.103 16.705 -1.161 c
+16.742 -1.22 16.812 -1.249 16.911 -1.249 c
+16.97 -1.249 17.032 -1.242 17.102 -1.22 c
+17.102 -1.631 l
+16.984 -1.668 16.87 -1.691 16.764 -1.691 c
+16.565 -1.691 16.415 -1.625 16.309 -1.484 c
+16.209 -1.349 16.161 -1.154 16.161 -0.897 c
+16.161 0.956 l
+15.706 0.956 l
+15.706 1.353 l
+16.161 1.353 l
+16.161 2.072 l
+h
+18.624 -1.691 m
+18.248 -1.691 17.965 -1.584 17.771 -1.367 c
+17.572 -1.143 17.477 -0.816 17.477 -0.382 c
+17.477 -0.015 l
+17.477 0.426 17.568 0.771 17.756 1.029 c
+17.951 1.282 18.227 1.411 18.58 1.411 c
+18.921 1.411 19.175 1.297 19.343 1.073 c
+19.52 0.845 19.612 0.5 19.623 0.029 c
+19.623 -0.279 l
+17.962 -0.279 l
+17.962 -0.353 l
+17.962 -0.676 18.021 -0.912 18.138 -1.058 c
+18.256 -1.198 18.425 -1.264 18.653 -1.264 c
+18.8 -1.264 18.925 -1.242 19.035 -1.191 c
+19.141 -1.132 19.245 -1.043 19.343 -0.926 c
+19.594 -1.234 l
+19.388 -1.54 19.064 -1.691 18.624 -1.691 c
+18.58 0.985 m
+18.374 0.985 18.219 0.915 18.123 0.779 c
+18.025 0.64 17.969 0.426 17.962 0.133 c
+19.137 0.133 l
+19.137 0.206 l
+19.116 0.478 19.064 0.676 18.977 0.794 c
+18.888 0.919 18.755 0.985 18.58 0.985 c
+19.931 0 m
+19.931 0.459 20.012 0.808 20.182 1.043 c
+20.358 1.286 20.608 1.411 20.931 1.411 c
+21.214 1.411 21.435 1.294 21.593 1.058 c
+21.593 2.602 l
+22.077 2.602 l
+22.077 -1.631 l
+21.637 -1.631 l
+21.607 -1.309 l
+21.449 -1.565 21.225 -1.691 20.931 -1.691 c
+20.615 -1.691 20.373 -1.573 20.196 -1.338 c
+20.02 -1.095 19.931 -0.75 19.931 -0.309 c
+h
+20.417 -0.279 m
+20.417 -0.613 20.465 -0.86 20.564 -1.014 c
+20.66 -1.172 20.821 -1.249 21.049 -1.249 c
+21.292 -1.249 21.475 -1.132 21.593 -0.897 c
+21.593 0.617 l
+21.464 0.852 21.284 0.97 21.049 0.97 c
+20.821 0.97 20.66 0.889 20.564 0.735 c
+20.465 0.577 20.417 0.338 20.417 0.015 c
+h
+24.485 2.072 m
+24.485 1.353 l
+24.94 1.353 l
+24.94 0.956 l
+24.485 0.956 l
+24.485 -0.897 l
+24.485 -1.014 24.503 -1.103 24.544 -1.161 c
+24.581 -1.22 24.65 -1.249 24.749 -1.249 c
+24.808 -1.249 24.87 -1.242 24.94 -1.22 c
+24.94 -1.631 l
+24.822 -1.668 24.708 -1.691 24.602 -1.691 c
+24.404 -1.691 24.253 -1.625 24.147 -1.484 c
+24.047 -1.349 23.999 -1.154 23.999 -0.897 c
+23.999 0.956 l
+23.544 0.956 l
+23.544 1.353 l
+23.999 1.353 l
+23.999 2.072 l
+h
+26.936 -1.631 m
+26.906 -1.565 26.884 -1.455 26.877 -1.309 c
+26.701 -1.565 26.48 -1.691 26.216 -1.691 c
+25.94 -1.691 25.723 -1.617 25.568 -1.469 c
+25.422 -1.315 25.348 -1.099 25.348 -0.823 c
+25.348 -0.522 25.451 -0.279 25.657 -0.103 c
+25.863 0.081 26.146 0.177 26.509 0.177 c
+26.862 0.177 l
+26.862 0.5 l
+26.862 0.676 26.821 0.798 26.744 0.867 c
+26.663 0.945 26.546 0.985 26.391 0.985 c
+26.245 0.985 26.12 0.941 26.025 0.852 c
+25.936 0.765 25.892 0.654 25.892 0.53 c
+25.407 0.53 l
+25.407 0.676 25.451 0.816 25.539 0.956 c
+25.628 1.103 25.745 1.213 25.892 1.294 c
+26.046 1.371 26.219 1.411 26.407 1.411 c
+26.719 1.411 26.954 1.33 27.112 1.176 c
+27.266 1.029 27.347 0.808 27.347 0.515 c
+27.347 -0.985 l
+27.355 -1.22 27.391 -1.422 27.45 -1.587 c
+27.45 -1.631 l
+h
+26.289 -1.249 m
+26.407 -1.249 26.517 -1.216 26.627 -1.147 c
+26.734 -1.08 26.811 -0.996 26.862 -0.897 c
+26.862 -0.191 l
+26.598 -0.191 l
+26.362 -0.191 26.175 -0.243 26.039 -0.338 c
+25.911 -0.437 25.848 -0.58 25.848 -0.764 c
+25.848 -0.933 25.877 -1.055 25.936 -1.132 c
+26.002 -1.213 26.12 -1.249 26.289 -1.249 c
+27.825 0 m
+27.825 0.459 27.906 0.808 28.074 1.043 c
+28.251 1.286 28.502 1.411 28.824 1.411 c
+29.126 1.411 29.358 1.278 29.516 1.014 c
+29.545 1.353 l
+29.986 1.353 l
+29.986 -1.661 l
+29.986 -2.032 29.886 -2.315 29.692 -2.514 c
+29.504 -2.708 29.244 -2.807 28.913 -2.807 c
+28.766 -2.807 28.597 -2.767 28.413 -2.69 c
+28.226 -2.62 28.09 -2.532 28.001 -2.425 c
+28.192 -2.088 l
+28.398 -2.293 28.622 -2.396 28.868 -2.396 c
+29.269 -2.396 29.475 -2.168 29.486 -1.72 c
+29.486 -1.338 l
+29.328 -1.573 29.107 -1.691 28.824 -1.691 c
+28.508 -1.691 28.266 -1.573 28.09 -1.338 c
+27.92 -1.103 27.833 -0.771 27.825 -0.338 c
+h
+28.31 -0.279 m
+28.31 -0.613 28.358 -0.86 28.457 -1.014 c
+28.552 -1.172 28.714 -1.249 28.942 -1.249 c
+29.185 -1.249 29.368 -1.128 29.486 -0.881 c
+29.486 0.603 l
+29.368 0.845 29.192 0.97 28.957 0.97 c
+28.729 0.97 28.567 0.889 28.471 0.735 c
+28.373 0.577 28.317 0.338 28.31 0.015 c
+h
+31.566 -0.029 m
+31.566 -0.852 31.382 -1.58 31.022 -2.205 c
+30.816 -2.547 30.611 -2.786 30.405 -2.925 c
+30.302 -2.616 l
+30.537 -2.389 30.721 -2.051 30.86 -1.602 c
+31.008 -1.143 31.081 -0.643 31.081 -0.103 c
+31.081 0 l
+31.081 0.694 30.967 1.323 30.742 1.881 c
+30.615 2.176 30.467 2.411 30.302 2.587 c
+30.405 2.896 l
+30.599 2.756 30.794 2.535 30.993 2.234 c
+31.375 1.588 31.566 0.831 31.566 -0.029 c
+f
+Q
+0.567 w 1 j 1 J
+q 1 0 0 1 627.4703 96.4198 cm
+0 0 m
+5.747 3.34 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 631.3726 98.6865 cm
+0 0 m
+-0.386 -1.458 l
+2.308 1.341 l
+-1.455 0.387 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 631.3727 98.6865 cm
+0 0 m
+-0.386 -1.458 l
+2.308 1.341 l
+-1.455 0.387 l
+0 0 l
+h
+S
+Q
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+0 G
+/GS2 gs
+0 TL/Fm34 Do
+Q
+0 0 0 0 k
+q 1 0 0 1 121.1352 111.1992 cm
+0 0 m
+-1.323 0 l
+-1.808 -1.043 l
+-2.323 -1.043 l
+-0.382 2.969 l
+0.044 2.969 l
+0.603 -1.043 l
+0.118 -1.043 l
+h
+-1.117 0.441 m
+-0.058 0.441 l
+-0.264 2.263 l
+h
+2.903 1.941 m
+2.845 1.617 l
+3.057 1.871 3.304 1.999 3.58 1.999 c
+3.763 1.989 3.91 1.918 4.021 1.793 c
+4.138 1.675 4.2 1.503 4.212 1.279 c
+4.219 1.151 4.219 1.029 4.212 0.912 c
+3.888 -1.043 l
+3.403 -1.043 l
+3.741 0.927 l
+3.755 1.132 l
+3.755 1.415 3.638 1.562 3.403 1.573 c
+3.215 1.573 3.04 1.463 2.874 1.249 c
+2.786 1.132 l
+2.419 -1.043 l
+1.933 -1.043 l
+2.462 1.941 l
+h
+6.81 1.985 m
+7.082 1.985 7.287 1.871 7.427 1.646 c
+7.721 3.19 l
+8.191 3.19 l
+7.456 -1.043 l
+7.03 -1.043 l
+7.074 -0.72 l
+6.876 -0.985 6.641 -1.109 6.369 -1.103 c
+6.122 -1.091 5.931 -0.995 5.795 -0.808 c
+5.656 -0.625 5.59 -0.353 5.59 0 c
+5.59 0.166 5.608 0.382 5.648 0.647 c
+5.696 0.919 5.766 1.151 5.854 1.338 c
+6.06 1.786 6.376 2.003 6.81 1.985 c
+6.06 -0.118 m
+6.067 -0.481 6.221 -0.669 6.516 -0.676 c
+6.622 -0.676 6.725 -0.654 6.824 -0.602 c
+6.92 -0.544 7.015 -0.448 7.104 -0.309 c
+7.368 1.205 l
+7.28 1.43 7.125 1.548 6.913 1.558 c
+6.471 1.588 6.207 1.268 6.119 0.603 c
+6.078 0.279 6.06 0.037 6.06 -0.118 c
+12.48 2.66 m
+12.347 1.941 l
+12.788 1.941 l
+12.715 1.544 l
+12.274 1.544 l
+11.965 -0.309 l
+11.965 -0.426 l
+11.954 -0.584 12.009 -0.661 12.127 -0.661 c
+12.175 -0.661 12.245 -0.654 12.333 -0.632 c
+12.289 -1.043 l
+12.179 -1.08 12.075 -1.095 11.98 -1.087 c
+11.811 -1.087 11.686 -1.022 11.597 -0.881 c
+11.51 -0.746 11.48 -0.555 11.51 -0.309 c
+11.803 1.544 l
+11.362 1.544 l
+11.436 1.941 l
+11.877 1.941 l
+11.994 2.66 l
+h
+14.637 1.632 m
+14.85 1.874 15.092 1.992 15.357 1.985 c
+15.551 1.985 15.703 1.918 15.813 1.793 c
+15.919 1.675 15.978 1.503 15.989 1.279 c
+15.996 1.151 15.996 1.029 15.989 0.912 c
+15.666 -1.043 l
+15.181 -1.043 l
+15.518 0.927 l
+15.533 1.132 l
+15.533 1.415 15.416 1.562 15.181 1.573 c
+14.993 1.573 14.817 1.463 14.651 1.249 c
+14.564 1.132 l
+14.196 -1.043 l
+13.71 -1.043 l
+14.446 3.19 l
+14.93 3.19 l
+h
+17.742 -1.043 m
+17.272 -1.043 l
+17.786 1.941 l
+18.271 1.941 l
+h
+17.903 2.734 m
+17.903 2.812 17.926 2.881 17.978 2.94 c
+18.025 2.999 18.088 3.028 18.168 3.028 c
+18.246 3.028 18.308 2.999 18.359 2.94 c
+18.418 2.889 18.44 2.822 18.433 2.734 c
+18.433 2.654 18.407 2.587 18.359 2.529 c
+18.308 2.469 18.246 2.44 18.168 2.44 c
+18.08 2.429 18.01 2.455 17.962 2.514 c
+17.911 2.573 17.893 2.646 17.903 2.734 c
+20.939 -0.264 m
+20.968 -0.088 20.869 0.059 20.645 0.177 c
+20.278 0.368 l
+20.09 0.474 19.958 0.588 19.881 0.706 c
+19.8 0.823 19.767 0.963 19.778 1.132 c
+19.785 1.374 19.884 1.58 20.072 1.75 c
+20.266 1.914 20.505 1.999 20.792 1.999 c
+21.057 1.989 21.263 1.9 21.409 1.735 c
+21.564 1.565 21.633 1.353 21.615 1.087 c
+21.145 1.087 l
+21.153 1.235 21.119 1.353 21.042 1.44 c
+20.972 1.529 20.881 1.573 20.763 1.573 c
+20.615 1.573 20.498 1.532 20.41 1.455 c
+20.322 1.374 20.266 1.272 20.248 1.147 c
+20.218 1 20.285 0.875 20.454 0.779 c
+20.924 0.544 l
+21.266 0.345 21.428 0.092 21.409 -0.22 c
+21.388 -0.496 21.28 -0.716 21.086 -0.881 c
+20.887 -1.04 20.648 -1.109 20.366 -1.103 c
+20.09 -1.091 19.866 -1.007 19.69 -0.837 c
+19.52 -0.661 19.443 -0.434 19.454 -0.147 c
+19.94 -0.147 l
+19.929 -0.324 19.962 -0.455 20.042 -0.544 c
+20.131 -0.632 20.241 -0.676 20.38 -0.676 c
+20.534 -0.676 20.663 -0.639 20.763 -0.559 c
+20.858 -0.481 20.917 -0.382 20.939 -0.264 c
+25.423 -1.043 m
+24.952 -1.043 l
+25.467 1.941 l
+25.951 1.941 l
+h
+25.584 2.734 m
+25.584 2.812 25.606 2.881 25.658 2.94 c
+25.705 2.999 25.768 3.028 25.849 3.028 c
+25.926 3.028 25.988 2.999 26.04 2.94 c
+26.098 2.889 26.121 2.822 26.113 2.734 c
+26.113 2.654 26.088 2.587 26.04 2.529 c
+25.988 2.469 25.926 2.44 25.849 2.44 c
+25.76 2.429 25.691 2.455 25.643 2.514 c
+25.591 2.573 25.573 2.646 25.584 2.734 c
+28.619 -0.264 m
+28.648 -0.088 28.55 0.059 28.326 0.177 c
+27.958 0.368 l
+27.771 0.474 27.638 0.588 27.561 0.706 c
+27.48 0.823 27.447 0.963 27.458 1.132 c
+27.466 1.374 27.565 1.58 27.752 1.75 c
+27.947 1.914 28.186 1.999 28.472 1.999 c
+28.737 1.989 28.943 1.9 29.09 1.735 c
+29.244 1.565 29.313 1.353 29.296 1.087 c
+28.825 1.087 l
+28.833 1.235 28.799 1.353 28.722 1.44 c
+28.652 1.529 28.561 1.573 28.443 1.573 c
+28.296 1.573 28.178 1.532 28.09 1.455 c
+28.002 1.374 27.947 1.272 27.929 1.147 c
+27.899 1 27.965 0.875 28.134 0.779 c
+28.604 0.544 l
+28.947 0.345 29.108 0.092 29.09 -0.22 c
+29.068 -0.496 28.961 -0.716 28.766 -0.881 c
+28.567 -1.04 28.328 -1.109 28.046 -1.103 c
+27.771 -1.091 27.546 -1.007 27.37 -0.837 c
+27.201 -0.661 27.123 -0.434 27.135 -0.147 c
+27.62 -0.147 l
+27.609 -0.324 27.642 -0.455 27.723 -0.544 c
+27.811 -0.632 27.921 -0.676 28.06 -0.676 c
+28.215 -0.676 28.344 -0.639 28.443 -0.559 c
+28.538 -0.481 28.598 -0.382 28.619 -0.264 c
+33.87 2.66 m
+33.738 1.941 l
+34.179 1.941 l
+34.106 1.544 l
+33.664 1.544 l
+33.356 -0.309 l
+33.356 -0.426 l
+33.345 -0.584 33.4 -0.661 33.518 -0.661 c
+33.566 -0.661 33.635 -0.654 33.724 -0.632 c
+33.679 -1.043 l
+33.569 -1.08 33.466 -1.095 33.371 -1.087 c
+33.202 -1.087 33.076 -1.022 32.989 -0.881 c
+32.9 -0.746 32.871 -0.555 32.9 -0.309 c
+33.194 1.544 l
+32.754 1.544 l
+32.827 1.941 l
+33.267 1.941 l
+33.386 2.66 l
+h
+36.027 1.632 m
+36.241 1.874 36.483 1.992 36.748 1.985 c
+36.943 1.985 37.093 1.918 37.203 1.793 c
+37.31 1.675 37.369 1.503 37.38 1.279 c
+37.387 1.151 37.387 1.029 37.38 0.912 c
+37.057 -1.043 l
+36.571 -1.043 l
+36.91 0.927 l
+36.924 1.132 l
+36.924 1.415 36.806 1.562 36.571 1.573 c
+36.384 1.573 36.208 1.463 36.043 1.249 c
+35.954 1.132 l
+35.586 -1.043 l
+35.102 -1.043 l
+35.837 3.19 l
+36.322 3.19 l
+h
+39.732 -1.103 m
+39.397 -1.091 39.147 -0.97 38.982 -0.735 c
+38.813 -0.5 38.755 -0.176 38.805 0.235 c
+38.835 0.53 l
+38.894 0.989 39.033 1.353 39.262 1.617 c
+39.486 1.881 39.769 2.007 40.114 1.999 c
+40.397 1.989 40.606 1.889 40.746 1.706 c
+40.893 1.518 40.966 1.253 40.966 0.912 c
+40.937 0.588 l
+40.893 0.309 l
+39.291 0.309 l
+39.268 0.14 39.262 0.008 39.262 -0.088 c
+39.262 -0.276 39.305 -0.422 39.393 -0.529 c
+39.482 -0.628 39.607 -0.676 39.775 -0.676 c
+39.893 -0.687 40.011 -0.669 40.128 -0.617 c
+40.246 -0.559 40.363 -0.47 40.481 -0.353 c
+40.716 -0.661 l
+40.599 -0.808 40.452 -0.922 40.276 -0.999 c
+40.099 -1.066 39.916 -1.103 39.732 -1.103 c
+40.085 1.573 m
+39.761 1.592 39.534 1.397 39.409 0.985 c
+39.335 0.721 l
+40.481 0.721 l
+40.481 0.794 l
+40.5 0.871 40.511 0.96 40.511 1.058 c
+40.5 1.389 40.357 1.562 40.085 1.573 c
+45.398 -1.103 m
+45.111 -1.091 44.899 -0.977 44.752 -0.75 c
+44.487 -2.19 l
+44.016 -2.19 l
+44.737 1.941 l
+45.163 1.941 l
+45.105 1.602 l
+45.31 1.867 45.549 1.999 45.824 1.999 c
+46.089 1.989 46.283 1.885 46.412 1.691 c
+46.549 1.503 46.611 1.239 46.603 0.897 c
+46.593 0.738 46.567 0.53 46.53 0.264 c
+46.501 0.008 46.449 -0.206 46.383 -0.382 c
+46.177 -0.874 45.847 -1.109 45.398 -1.103 c
+46.133 1.014 m
+46.104 1.374 45.946 1.558 45.663 1.558 c
+45.446 1.565 45.251 1.455 45.075 1.22 c
+44.81 -0.338 l
+44.899 -0.555 45.049 -0.673 45.266 -0.691 c
+45.479 -0.702 45.655 -0.628 45.795 -0.47 c
+45.931 -0.305 46.019 -0.051 46.06 0.294 c
+46.108 0.636 46.133 0.875 46.133 1.014 c
+49.315 -1.043 m
+49.304 -0.985 49.3 -0.933 49.3 -0.881 c
+49.315 -0.72 l
+49.109 -0.977 48.882 -1.103 48.639 -1.103 c
+48.394 -1.103 48.203 -1.025 48.066 -0.867 c
+47.937 -0.713 47.883 -0.507 47.904 -0.249 c
+47.923 0.052 48.051 0.298 48.286 0.485 c
+48.521 0.669 48.823 0.765 49.198 0.765 c
+49.536 0.765 l
+49.58 1.087 l
+49.61 1.411 49.485 1.573 49.213 1.573 c
+49.065 1.573 48.941 1.529 48.845 1.44 c
+48.746 1.36 48.687 1.253 48.669 1.118 c
+48.199 1.118 l
+48.217 1.36 48.33 1.565 48.536 1.735 c
+48.743 1.911 48.981 1.999 49.257 1.999 c
+49.521 1.989 49.727 1.904 49.874 1.75 c
+50.021 1.592 50.08 1.367 50.05 1.073 c
+49.815 -0.397 l
+49.793 -0.496 49.786 -0.595 49.786 -0.691 c
+49.801 -0.999 l
+49.801 -1.043 l
+h
+48.727 -0.661 m
+48.97 -0.661 49.176 -0.544 49.345 -0.309 c
+49.477 0.397 l
+49.257 0.412 l
+49.069 0.412 48.904 0.375 48.757 0.309 c
+48.61 0.239 48.507 0.14 48.448 0.015 c
+48.39 -0.103 48.367 -0.235 48.39 -0.382 c
+48.408 -0.569 48.521 -0.661 48.727 -0.661 c
+52.847 -0.264 m
+52.876 -0.088 52.777 0.059 52.553 0.177 c
+52.186 0.368 l
+51.998 0.474 51.866 0.588 51.789 0.706 c
+51.708 0.823 51.675 0.963 51.686 1.132 c
+51.693 1.374 51.792 1.58 51.98 1.75 c
+52.174 1.914 52.413 1.999 52.7 1.999 c
+52.965 1.989 53.171 1.9 53.317 1.735 c
+53.472 1.565 53.541 1.353 53.523 1.087 c
+53.053 1.087 l
+53.061 1.235 53.027 1.353 52.95 1.44 c
+52.88 1.529 52.788 1.573 52.671 1.573 c
+52.523 1.573 52.406 1.532 52.317 1.455 c
+52.23 1.374 52.174 1.272 52.156 1.147 c
+52.126 1 52.193 0.875 52.362 0.779 c
+52.832 0.544 l
+53.174 0.345 53.336 0.092 53.317 -0.22 c
+53.296 -0.496 53.188 -0.716 52.994 -0.881 c
+52.795 -1.04 52.556 -1.109 52.274 -1.103 c
+51.998 -1.091 51.774 -1.007 51.598 -0.837 c
+51.428 -0.661 51.351 -0.434 51.362 -0.147 c
+51.847 -0.147 l
+51.837 -0.324 51.87 -0.455 51.95 -0.544 c
+52.039 -0.632 52.149 -0.676 52.288 -0.676 c
+52.442 -0.676 52.571 -0.639 52.671 -0.559 c
+52.766 -0.481 52.825 -0.382 52.847 -0.264 c
+55.941 2.66 m
+55.808 1.941 l
+56.25 1.941 l
+56.176 1.544 l
+55.735 1.544 l
+55.426 -0.309 l
+55.426 -0.426 l
+55.415 -0.584 55.471 -0.661 55.588 -0.661 c
+55.636 -0.661 55.706 -0.654 55.794 -0.632 c
+55.75 -1.043 l
+55.64 -1.08 55.537 -1.095 55.442 -1.087 c
+55.272 -1.087 55.147 -1.022 55.06 -0.881 c
+54.971 -0.746 54.942 -0.555 54.971 -0.309 c
+55.265 1.544 l
+54.824 1.544 l
+54.898 1.941 l
+55.338 1.941 l
+55.456 2.66 l
+h
+57.569 -0.47 m
+57.657 -0.463 57.73 -0.484 57.79 -0.544 c
+57.848 -0.602 57.878 -0.676 57.878 -0.764 c
+57.878 -0.852 57.848 -0.926 57.79 -0.985 c
+57.73 -1.043 57.657 -1.072 57.569 -1.072 c
+57.481 -1.08 57.408 -1.062 57.348 -1.014 c
+57.29 -0.955 57.26 -0.881 57.26 -0.794 c
+57.26 -0.698 57.29 -0.617 57.348 -0.559 c
+57.408 -0.5 57.481 -0.47 57.569 -0.47 c
+64.283 -1.043 m
+63.798 -1.043 l
+64.121 0.809 l
+62.563 0.809 l
+62.239 -1.043 l
+61.74 -1.043 l
+62.43 2.969 l
+62.931 2.969 l
+62.622 1.249 l
+64.195 1.249 l
+64.489 2.969 l
+64.988 2.969 l
+h
+67.043 -1.103 m
+66.708 -1.091 66.459 -0.97 66.293 -0.735 c
+66.124 -0.5 66.065 -0.176 66.116 0.235 c
+66.146 0.53 l
+66.205 0.989 66.345 1.353 66.572 1.617 c
+66.796 1.881 67.079 2.007 67.425 1.999 c
+67.708 1.989 67.918 1.889 68.057 1.706 c
+68.204 1.518 68.277 1.253 68.277 0.912 c
+68.248 0.588 l
+68.204 0.309 l
+66.602 0.309 l
+66.58 0.14 66.572 0.008 66.572 -0.088 c
+66.572 -0.276 66.617 -0.422 66.704 -0.529 c
+66.792 -0.628 66.918 -0.676 67.087 -0.676 c
+67.205 -0.687 67.322 -0.669 67.44 -0.617 c
+67.557 -0.559 67.675 -0.47 67.792 -0.353 c
+68.028 -0.661 l
+67.91 -0.808 67.762 -0.922 67.586 -0.999 c
+67.41 -1.066 67.226 -1.103 67.043 -1.103 c
+67.396 1.573 m
+67.072 1.592 66.844 1.397 66.719 0.985 c
+66.646 0.721 l
+67.792 0.721 l
+67.792 0.794 l
+67.81 0.871 67.822 0.96 67.822 1.058 c
+67.81 1.389 67.667 1.562 67.396 1.573 c
+71.022 1.484 m
+70.941 1.503 70.868 1.515 70.802 1.515 c
+70.567 1.515 70.368 1.371 70.214 1.087 c
+69.846 -1.043 l
+69.362 -1.043 l
+69.89 1.941 l
+70.347 1.941 l
+70.272 1.632 l
+70.449 1.885 70.648 2.007 70.875 1.999 c
+70.912 1.999 70.978 1.985 71.066 1.955 c
+h
+72.988 -1.103 m
+72.654 -1.091 72.404 -0.97 72.238 -0.735 c
+72.07 -0.5 72.011 -0.176 72.063 0.235 c
+72.092 0.53 l
+72.151 0.989 72.29 1.353 72.518 1.617 c
+72.742 1.881 73.025 2.007 73.37 1.999 c
+73.653 1.989 73.863 1.889 74.002 1.706 c
+74.15 1.518 74.223 1.253 74.223 0.912 c
+74.193 0.588 l
+74.15 0.309 l
+72.547 0.309 l
+72.525 0.14 72.518 0.008 72.518 -0.088 c
+72.518 -0.276 72.562 -0.422 72.65 -0.529 c
+72.739 -0.628 72.863 -0.676 73.032 -0.676 c
+73.15 -0.687 73.268 -0.669 73.385 -0.617 c
+73.503 -0.559 73.62 -0.47 73.738 -0.353 c
+73.973 -0.661 l
+73.856 -0.808 73.709 -0.922 73.532 -0.999 c
+73.356 -1.066 73.172 -1.103 72.988 -1.103 c
+73.341 1.573 m
+73.017 1.592 72.79 1.397 72.665 0.985 c
+72.591 0.721 l
+73.738 0.721 l
+73.738 0.794 l
+73.757 0.871 73.767 0.96 73.767 1.058 c
+73.757 1.389 73.613 1.562 73.341 1.573 c
+79.772 -0.176 m
+80.58 1.941 l
+81.065 1.941 l
+79.831 -1.043 l
+79.463 -1.043 l
+79.272 1.087 l
+78.346 -1.043 l
+77.964 -1.043 l
+77.773 1.941 l
+78.228 1.941 l
+78.317 -0.118 l
+79.213 1.941 l
+79.596 1.941 l
+h
+83.402 -1.043 m
+83.392 -0.985 83.388 -0.933 83.388 -0.881 c
+83.402 -0.72 l
+83.197 -0.977 82.969 -1.103 82.727 -1.103 c
+82.48 -1.103 82.289 -1.025 82.153 -0.867 c
+82.025 -0.713 81.969 -0.507 81.991 -0.249 c
+82.01 0.052 82.139 0.298 82.374 0.485 c
+82.609 0.669 82.91 0.765 83.285 0.765 c
+83.623 0.765 l
+83.667 1.087 l
+83.697 1.411 83.572 1.573 83.3 1.573 c
+83.153 1.573 83.028 1.529 82.932 1.44 c
+82.833 1.36 82.775 1.253 82.756 1.118 c
+82.286 1.118 l
+82.304 1.36 82.418 1.565 82.623 1.735 c
+82.829 1.911 83.068 1.999 83.344 1.999 c
+83.608 1.989 83.814 1.904 83.961 1.75 c
+84.108 1.592 84.167 1.367 84.138 1.073 c
+83.903 -0.397 l
+83.88 -0.496 83.873 -0.595 83.873 -0.691 c
+83.888 -0.999 l
+83.888 -1.043 l
+h
+82.814 -0.661 m
+83.057 -0.661 83.263 -0.544 83.432 -0.309 c
+83.564 0.397 l
+83.344 0.412 l
+83.157 0.412 82.991 0.375 82.844 0.309 c
+82.697 0.239 82.594 0.14 82.536 0.015 c
+82.477 -0.103 82.455 -0.235 82.477 -0.382 c
+82.495 -0.569 82.609 -0.661 82.814 -0.661 c
+86.938 -0.264 m
+86.968 -0.088 86.868 0.059 86.644 0.177 c
+86.276 0.368 l
+86.089 0.474 85.956 0.588 85.879 0.706 c
+85.798 0.823 85.765 0.963 85.777 1.132 c
+85.784 1.374 85.883 1.58 86.07 1.75 c
+86.265 1.914 86.504 1.999 86.791 1.999 c
+87.055 1.989 87.261 1.9 87.408 1.735 c
+87.562 1.565 87.633 1.353 87.614 1.087 c
+87.144 1.087 l
+87.151 1.235 87.118 1.353 87.041 1.44 c
+86.97 1.529 86.879 1.573 86.762 1.573 c
+86.615 1.573 86.497 1.532 86.409 1.455 c
+86.32 1.374 86.265 1.272 86.247 1.147 c
+86.218 1 86.284 0.875 86.453 0.779 c
+86.923 0.544 l
+87.265 0.345 87.427 0.092 87.408 -0.22 c
+87.386 -0.496 87.28 -0.716 87.085 -0.881 c
+86.887 -1.04 86.648 -1.109 86.365 -1.103 c
+86.089 -1.091 85.865 -1.007 85.688 -0.837 c
+85.519 -0.661 85.442 -0.434 85.453 -0.147 c
+85.938 -0.147 l
+85.927 -0.324 85.96 -0.455 86.041 -0.544 c
+86.129 -0.632 86.239 -0.676 86.38 -0.676 c
+86.534 -0.676 86.662 -0.639 86.762 -0.559 c
+86.857 -0.481 86.916 -0.382 86.938 -0.264 c
+91.994 -0.691 m
+92.148 -0.691 92.277 -0.643 92.377 -0.544 c
+92.483 -0.437 92.56 -0.29 92.612 -0.103 c
+93.052 -0.103 l
+93.012 -0.397 92.89 -0.643 92.685 -0.837 c
+92.479 -1.025 92.237 -1.109 91.965 -1.103 c
+91.7 -1.091 91.487 -1.014 91.333 -0.867 c
+91.175 -0.713 91.083 -0.496 91.053 -0.22 c
+91.032 -0.055 91.032 0.11 91.053 0.279 c
+91.097 0.574 l
+91.157 1.044 91.292 1.401 91.509 1.646 c
+91.733 1.889 92.027 2.007 92.391 1.999 c
+92.663 1.989 92.876 1.885 93.023 1.691 c
+93.177 1.492 93.251 1.235 93.243 0.912 c
+92.788 0.912 l
+92.795 1.341 92.655 1.562 92.362 1.573 c
+91.928 1.592 91.671 1.286 91.583 0.661 c
+91.524 0.268 91.498 0 91.509 -0.147 c
+91.527 -0.5 91.689 -0.683 91.994 -0.691 c
+95.24 1.632 m
+95.452 1.874 95.695 1.992 95.959 1.985 c
+96.154 1.985 96.304 1.918 96.415 1.793 c
+96.522 1.675 96.58 1.503 96.591 1.279 c
+96.599 1.151 96.599 1.029 96.591 0.912 c
+96.268 -1.043 l
+95.783 -1.043 l
+96.121 0.927 l
+96.136 1.132 l
+96.136 1.415 96.018 1.562 95.783 1.573 c
+95.595 1.573 95.419 1.463 95.254 1.249 c
+95.165 1.132 l
+94.798 -1.043 l
+94.313 -1.043 l
+95.048 3.19 l
+95.533 3.19 l
+h
+99.354 -1.043 m
+99.344 -0.985 99.34 -0.933 99.34 -0.881 c
+99.354 -0.72 l
+99.149 -0.977 98.922 -1.103 98.679 -1.103 c
+98.432 -1.103 98.241 -1.025 98.105 -0.867 c
+97.977 -0.713 97.922 -0.507 97.943 -0.249 c
+97.962 0.052 98.091 0.298 98.326 0.485 c
+98.561 0.669 98.862 0.765 99.238 0.765 c
+99.575 0.765 l
+99.62 1.087 l
+99.649 1.411 99.524 1.573 99.252 1.573 c
+99.105 1.573 98.98 1.529 98.884 1.44 c
+98.785 1.36 98.727 1.253 98.708 1.118 c
+98.238 1.118 l
+98.256 1.36 98.37 1.565 98.575 1.735 c
+98.781 1.911 99.02 1.999 99.296 1.999 c
+99.56 1.989 99.766 1.904 99.913 1.75 c
+100.06 1.592 100.119 1.367 100.09 1.073 c
+99.855 -0.397 l
+99.832 -0.496 99.825 -0.595 99.825 -0.691 c
+99.84 -0.999 l
+99.84 -1.043 l
+h
+98.767 -0.661 m
+99.009 -0.661 99.215 -0.544 99.384 -0.309 c
+99.516 0.397 l
+99.296 0.412 l
+99.109 0.412 98.943 0.375 98.796 0.309 c
+98.649 0.239 98.546 0.14 98.488 0.015 c
+98.429 -0.103 98.407 -0.235 98.429 -0.382 c
+98.447 -0.569 98.561 -0.661 98.767 -0.661 c
+101.534 0.574 m
+101.592 1.004 101.732 1.353 101.96 1.617 c
+102.195 1.881 102.49 2.007 102.843 1.999 c
+103.066 1.989 103.254 1.918 103.4 1.793 c
+103.548 1.675 103.651 1.507 103.709 1.294 c
+103.776 1.077 103.797 0.842 103.768 0.588 c
+103.739 0.309 l
+103.669 -0.125 103.518 -0.47 103.283 -0.735 c
+103.055 -0.992 102.768 -1.109 102.415 -1.103 c
+102.188 -1.091 102.004 -1.029 101.858 -0.912 c
+101.71 -0.786 101.6 -0.617 101.534 -0.411 c
+101.475 -0.199 101.461 0.044 101.49 0.309 c
+h
+101.96 0.103 m
+101.949 -0.143 101.982 -0.334 102.063 -0.47 c
+102.151 -0.61 102.276 -0.683 102.446 -0.691 c
+102.651 -0.702 102.82 -0.628 102.96 -0.47 c
+103.107 -0.305 103.202 -0.058 103.254 0.264 c
+103.298 0.588 l
+103.313 0.794 l
+103.313 1.037 103.269 1.228 103.18 1.367 c
+103.099 1.503 102.978 1.573 102.812 1.573 c
+102.596 1.58 102.415 1.492 102.269 1.309 c
+102.129 1.121 102.041 0.86 102.004 0.53 c
+101.96 0.25 l
+h
+106.51 -0.264 m
+106.539 -0.088 106.44 0.059 106.215 0.177 c
+105.848 0.368 l
+105.661 0.474 105.528 0.588 105.451 0.706 c
+105.37 0.823 105.337 0.963 105.349 1.132 c
+105.355 1.374 105.455 1.58 105.642 1.75 c
+105.837 1.914 106.076 1.999 106.363 1.999 c
+106.627 1.989 106.833 1.9 106.98 1.735 c
+107.134 1.565 107.204 1.353 107.186 1.087 c
+106.716 1.087 l
+106.723 1.235 106.689 1.353 106.612 1.44 c
+106.542 1.529 106.45 1.573 106.333 1.573 c
+106.186 1.573 106.068 1.532 105.98 1.455 c
+105.892 1.374 105.837 1.272 105.819 1.147 c
+105.789 1 105.856 0.875 106.024 0.779 c
+106.495 0.544 l
+106.837 0.345 106.999 0.092 106.98 -0.22 c
+106.958 -0.496 106.851 -0.716 106.656 -0.881 c
+106.458 -1.04 106.219 -1.109 105.937 -1.103 c
+105.661 -1.091 105.436 -1.007 105.26 -0.837 c
+105.091 -0.661 105.014 -0.434 105.025 -0.147 c
+105.51 -0.147 l
+105.499 -0.324 105.532 -0.455 105.613 -0.544 c
+105.701 -0.632 105.812 -0.676 105.951 -0.676 c
+106.105 -0.676 106.234 -0.639 106.333 -0.559 c
+106.429 -0.481 106.488 -0.382 106.51 -0.264 c
+108.237 -1.852 m
+107.957 -1.646 l
+108.175 -1.382 108.303 -1.117 108.354 -0.852 c
+108.428 -0.441 l
+108.913 -0.441 l
+108.854 -0.808 l
+108.784 -1.227 108.578 -1.577 108.237 -1.852 c
+f
+Q
+q 1 0 0 1 170.9031 102.5161 cm
+0 0 m
+0.808 2.117 l
+1.294 2.117 l
+0.058 -0.867 l
+-0.31 -0.867 l
+-0.5 1.264 l
+-1.426 -0.867 l
+-1.808 -0.867 l
+-1.999 2.117 l
+-1.544 2.117 l
+-1.455 0.058 l
+-0.559 2.117 l
+-0.177 2.117 l
+h
+3.027 1.808 m
+3.241 2.05 3.484 2.167 3.748 2.161 c
+3.943 2.161 4.093 2.094 4.203 1.97 c
+4.31 1.852 4.369 1.679 4.38 1.455 c
+4.388 1.326 4.388 1.205 4.38 1.087 c
+4.056 -0.867 l
+3.571 -0.867 l
+3.91 1.103 l
+3.924 1.308 l
+3.924 1.591 3.806 1.738 3.571 1.749 c
+3.384 1.749 3.208 1.639 3.042 1.425 c
+2.954 1.308 l
+2.587 -0.867 l
+2.102 -0.867 l
+2.836 3.366 l
+3.322 3.366 l
+h
+6.732 -0.927 m
+6.397 -0.915 6.148 -0.794 5.982 -0.559 c
+5.813 -0.324 5.754 0 5.805 0.411 c
+5.835 0.706 l
+5.894 1.165 6.034 1.529 6.262 1.793 c
+6.485 2.057 6.769 2.183 7.114 2.175 c
+7.397 2.165 7.607 2.065 7.746 1.881 c
+7.893 1.694 7.966 1.429 7.966 1.087 c
+7.937 0.764 l
+7.893 0.484 l
+6.291 0.484 l
+6.269 0.316 6.262 0.183 6.262 0.088 c
+6.262 -0.1 6.306 -0.246 6.393 -0.353 c
+6.482 -0.452 6.607 -0.5 6.776 -0.5 c
+6.894 -0.511 7.011 -0.493 7.129 -0.441 c
+7.247 -0.382 7.364 -0.294 7.482 -0.177 c
+7.717 -0.485 l
+7.599 -0.632 7.452 -0.746 7.276 -0.823 c
+7.099 -0.89 6.915 -0.927 6.732 -0.927 c
+7.085 1.749 m
+6.761 1.768 6.533 1.573 6.408 1.161 c
+6.335 0.897 l
+7.482 0.897 l
+7.482 0.97 l
+7.5 1.047 7.511 1.135 7.511 1.234 c
+7.5 1.565 7.357 1.738 7.085 1.749 c
+10.715 1.66 m
+10.634 1.679 10.561 1.691 10.495 1.691 c
+10.26 1.691 10.061 1.547 9.907 1.264 c
+9.539 -0.867 l
+9.055 -0.867 l
+9.583 2.117 l
+10.039 2.117 l
+9.965 1.808 l
+10.142 2.061 10.341 2.183 10.568 2.175 c
+10.605 2.175 10.671 2.161 10.759 2.131 c
+h
+12.681 -0.927 m
+12.347 -0.915 12.097 -0.794 11.931 -0.559 c
+11.762 -0.324 11.704 0 11.755 0.411 c
+11.785 0.706 l
+11.843 1.165 11.983 1.529 12.211 1.793 c
+12.435 2.057 12.718 2.183 13.063 2.175 c
+13.346 2.165 13.556 2.065 13.695 1.881 c
+13.842 1.694 13.916 1.429 13.916 1.087 c
+13.886 0.764 l
+13.842 0.484 l
+12.24 0.484 l
+12.218 0.316 12.211 0.183 12.211 0.088 c
+12.211 -0.1 12.255 -0.246 12.343 -0.353 c
+12.431 -0.452 12.556 -0.5 12.725 -0.5 c
+12.843 -0.511 12.961 -0.493 13.078 -0.441 c
+13.196 -0.382 13.313 -0.294 13.431 -0.177 c
+13.666 -0.485 l
+13.549 -0.632 13.402 -0.746 13.225 -0.823 c
+13.049 -0.89 12.865 -0.927 12.681 -0.927 c
+13.034 1.749 m
+12.71 1.768 12.483 1.573 12.358 1.161 c
+12.284 0.897 l
+13.431 0.897 l
+13.431 0.97 l
+13.449 1.047 13.46 1.135 13.46 1.234 c
+13.449 1.565 13.306 1.738 13.034 1.749 c
+18.127 2.117 m
+18.069 1.793 l
+18.281 2.047 18.528 2.175 18.803 2.175 c
+18.987 2.165 19.134 2.094 19.245 1.97 c
+19.362 1.852 19.424 1.679 19.436 1.455 c
+19.443 1.326 19.443 1.205 19.436 1.087 c
+19.112 -0.867 l
+18.627 -0.867 l
+18.965 1.103 l
+18.979 1.308 l
+18.979 1.591 18.862 1.738 18.627 1.749 c
+18.439 1.749 18.264 1.639 18.098 1.425 c
+18.01 1.308 l
+17.642 -0.867 l
+17.157 -0.867 l
+17.686 2.117 l
+h
+20.887 0.75 m
+20.946 1.18 21.086 1.529 21.313 1.793 c
+21.549 2.057 21.842 2.183 22.195 2.175 c
+22.42 2.165 22.607 2.094 22.754 1.97 c
+22.9 1.852 23.004 1.683 23.062 1.469 c
+23.129 1.253 23.151 1.018 23.121 0.764 c
+23.091 0.484 l
+23.022 0.051 22.871 -0.294 22.636 -0.559 c
+22.408 -0.816 22.121 -0.933 21.769 -0.927 c
+21.541 -0.915 21.358 -0.852 21.21 -0.735 c
+21.063 -0.611 20.953 -0.441 20.887 -0.235 c
+20.828 -0.023 20.814 0.22 20.843 0.484 c
+h
+21.313 0.279 m
+21.302 0.033 21.335 -0.158 21.416 -0.294 c
+21.504 -0.434 21.629 -0.507 21.798 -0.515 c
+22.004 -0.526 22.173 -0.452 22.312 -0.294 c
+22.46 -0.129 22.555 0.118 22.607 0.441 c
+22.651 0.764 l
+22.665 0.97 l
+22.665 1.213 22.621 1.404 22.534 1.543 c
+22.453 1.679 22.331 1.749 22.166 1.749 c
+21.949 1.756 21.769 1.668 21.622 1.484 c
+21.483 1.297 21.394 1.036 21.358 0.706 c
+21.313 0.426 l
+h
+f
+Q
+q 1 0 0 1 198.4339 102.7654 cm
+0 0 m
+0.661 1.867 l
+1.47 1.867 l
+0.206 -1.117 l
+-0.515 -1.117 l
+-0.852 1.867 l
+-0.073 1.867 l
+h
+3.396 -1.176 m
+3.15 -1.176 2.944 -1.117 2.778 -0.999 c
+2.61 -0.881 2.488 -0.72 2.411 -0.514 c
+2.341 -0.301 2.323 -0.058 2.352 0.206 c
+2.367 0.412 l
+2.433 0.9 2.587 1.279 2.822 1.544 c
+3.057 1.808 3.359 1.933 3.734 1.926 c
+4.006 1.915 4.222 1.827 4.38 1.661 c
+4.535 1.503 4.623 1.279 4.645 0.985 c
+4.663 0.809 4.663 0.636 4.645 0.47 c
+4.586 0.118 l
+3.102 0.118 l
+3.09 0.037 3.087 -0.04 3.087 -0.118 c
+3.105 -0.382 3.238 -0.514 3.484 -0.514 c
+3.708 -0.525 3.929 -0.44 4.145 -0.264 c
+4.41 -0.735 l
+4.3 -0.874 4.152 -0.981 3.969 -1.058 c
+3.792 -1.135 3.601 -1.176 3.396 -1.176 c
+3.66 1.279 m
+3.443 1.287 3.293 1.147 3.204 0.853 c
+3.146 0.662 l
+3.91 0.662 l
+3.929 0.757 3.94 0.842 3.94 0.912 c
+3.946 1.147 3.855 1.268 3.66 1.279 c
+7.493 1.118 m
+7.258 1.147 l
+7.052 1.147 6.883 1.048 6.758 0.853 c
+6.42 -1.117 l
+5.656 -1.117 l
+6.17 1.867 l
+6.89 1.867 l
+6.832 1.544 l
+6.92 1.68 7.001 1.779 7.082 1.838 c
+7.169 1.897 7.265 1.926 7.375 1.926 c
+7.435 1.926 7.508 1.912 7.596 1.881 c
+h
+9.801 -0.294 m
+9.819 -0.168 9.716 -0.055 9.492 0.044 c
+9.276 0.14 9.114 0.235 9.007 0.324 c
+8.897 0.42 8.816 0.522 8.757 0.632 c
+8.706 0.739 8.688 0.86 8.698 1 c
+8.706 1.264 8.816 1.485 9.022 1.661 c
+9.235 1.838 9.496 1.926 9.801 1.926 c
+10.095 1.915 10.323 1.823 10.492 1.646 c
+10.668 1.478 10.756 1.257 10.756 0.985 c
+9.992 0.985 l
+9.992 1.11 9.97 1.199 9.933 1.25 c
+9.893 1.309 9.834 1.338 9.756 1.338 c
+9.669 1.338 9.588 1.309 9.521 1.25 c
+9.463 1.191 9.426 1.118 9.419 1.029 c
+9.39 0.912 9.477 0.802 9.683 0.706 c
+9.897 0.618 10.051 0.545 10.139 0.485 c
+10.411 0.298 10.539 0.048 10.521 -0.264 c
+10.51 -0.452 10.452 -0.613 10.344 -0.749 c
+10.246 -0.889 10.109 -0.995 9.933 -1.072 c
+9.764 -1.139 9.58 -1.176 9.374 -1.176 c
+9.081 -1.165 8.838 -1.072 8.654 -0.897 c
+8.478 -0.712 8.39 -0.477 8.39 -0.191 c
+9.124 -0.191 l
+9.114 -0.338 9.132 -0.448 9.183 -0.514 c
+9.242 -0.573 9.323 -0.602 9.434 -0.602 c
+9.521 -0.602 9.598 -0.58 9.669 -0.529 c
+9.735 -0.47 9.779 -0.393 9.801 -0.294 c
+12.517 -1.117 m
+11.767 -1.117 l
+12.281 1.867 l
+13.045 1.867 l
+h
+12.384 2.617 m
+12.384 2.741 12.421 2.845 12.501 2.926 c
+12.579 3.014 12.678 3.057 12.796 3.057 c
+12.902 3.057 12.994 3.017 13.075 2.94 c
+13.163 2.859 13.207 2.764 13.207 2.646 c
+13.207 2.517 13.163 2.415 13.075 2.338 c
+12.994 2.257 12.898 2.22 12.781 2.22 c
+12.663 2.22 12.565 2.253 12.487 2.323 c
+12.417 2.4 12.384 2.5 12.384 2.617 c
+15.578 1.926 m
+15.879 1.915 16.114 1.812 16.283 1.617 c
+16.449 1.419 16.54 1.154 16.563 0.823 c
+16.563 0.632 l
+16.533 0.052 16.39 -0.396 16.137 -0.72 c
+15.89 -1.036 15.563 -1.183 15.152 -1.176 c
+14.916 -1.165 14.718 -1.102 14.564 -0.984 c
+14.416 -0.86 14.306 -0.687 14.24 -0.47 c
+14.17 -0.257 14.152 -0.007 14.181 0.279 c
+14.196 0.427 l
+14.255 0.897 14.406 1.264 14.651 1.529 c
+14.894 1.801 15.202 1.933 15.578 1.926 c
+14.93 -0.029 m
+14.93 -0.353 15.026 -0.521 15.225 -0.529 c
+15.489 -0.551 15.659 -0.349 15.74 0.074 c
+15.769 0.279 l
+15.798 0.545 15.813 0.709 15.813 0.78 c
+15.813 1.103 15.709 1.268 15.504 1.279 c
+15.357 1.287 15.232 1.22 15.136 1.073 c
+15.048 0.934 14.99 0.728 14.961 0.456 c
+14.938 0.192 14.93 0.03 14.93 -0.029 c
+18.811 1.867 m
+18.767 1.573 l
+18.973 1.816 19.2 1.933 19.458 1.926 c
+19.664 1.915 19.819 1.831 19.929 1.676 c
+20.046 1.529 20.105 1.312 20.105 1.029 c
+20.075 0.78 l
+19.767 -1.117 l
+19.002 -1.117 l
+19.311 0.78 l
+19.326 0.941 l
+19.333 1.154 19.256 1.264 19.09 1.264 c
+19.01 1.264 18.944 1.243 18.884 1.206 c
+18.826 1.166 18.774 1.118 18.738 1.058 c
+18.356 -1.117 l
+17.591 -1.117 l
+18.105 1.867 l
+h
+24.515 -0.529 m
+24.721 -0.54 24.845 -0.393 24.897 -0.087 c
+25.617 -0.087 l
+25.577 -0.411 25.448 -0.675 25.234 -0.881 c
+25.029 -1.087 24.772 -1.183 24.471 -1.176 c
+24.184 -1.165 23.96 -1.084 23.794 -0.926 c
+23.636 -0.771 23.545 -0.551 23.515 -0.264 c
+23.486 -0.029 23.493 0.25 23.545 0.574 c
+23.603 0.904 23.706 1.18 23.853 1.397 c
+24.089 1.757 24.43 1.933 24.882 1.926 c
+25.176 1.915 25.4 1.801 25.558 1.588 c
+25.724 1.382 25.797 1.103 25.779 0.75 c
+25.058 0.75 l
+25.058 0.927 l
+25.058 1.151 24.97 1.268 24.794 1.279 c
+24.529 1.287 24.368 1.077 24.309 0.647 c
+24.264 0.148 l
+24.235 0 24.224 -0.124 24.235 -0.22 c
+24.253 -0.419 24.345 -0.521 24.515 -0.529 c
+28.307 1.926 m
+28.608 1.915 28.843 1.812 29.012 1.617 c
+29.178 1.419 29.269 1.154 29.292 0.823 c
+29.292 0.632 l
+29.263 0.052 29.119 -0.396 28.866 -0.72 c
+28.619 -1.036 28.292 -1.183 27.881 -1.176 c
+27.646 -1.165 27.447 -1.102 27.293 -0.984 c
+27.146 -0.86 27.035 -0.687 26.969 -0.47 c
+26.899 -0.257 26.881 -0.007 26.911 0.279 c
+26.925 0.427 l
+26.984 0.897 27.135 1.264 27.381 1.529 c
+27.623 1.801 27.932 1.933 28.307 1.926 c
+27.661 -0.029 m
+27.661 -0.353 27.756 -0.521 27.954 -0.529 c
+28.218 -0.551 28.388 -0.349 28.469 0.074 c
+28.498 0.279 l
+28.527 0.545 28.542 0.709 28.542 0.78 c
+28.542 1.103 28.439 1.268 28.233 1.279 c
+28.087 1.287 27.962 1.22 27.866 1.073 c
+27.778 0.934 27.719 0.728 27.69 0.456 c
+27.667 0.192 27.661 0.03 27.661 -0.029 c
+31.541 1.867 m
+31.497 1.573 l
+31.702 1.816 31.931 1.933 32.187 1.926 c
+32.393 1.915 32.548 1.831 32.658 1.676 c
+32.775 1.529 32.835 1.312 32.835 1.029 c
+32.805 0.78 l
+32.496 -1.117 l
+31.732 -1.117 l
+32.041 0.78 l
+32.055 0.941 l
+32.062 1.154 31.985 1.264 31.82 1.264 c
+31.739 1.264 31.673 1.243 31.614 1.206 c
+31.555 1.166 31.503 1.118 31.467 1.058 c
+31.085 -1.117 l
+30.321 -1.117 l
+30.836 1.867 l
+h
+35.432 2.602 m
+35.314 1.867 l
+35.696 1.867 l
+35.594 1.279 l
+35.212 1.279 l
+34.948 -0.22 l
+34.948 -0.309 l
+34.936 -0.437 34.984 -0.5 35.094 -0.5 c
+35.123 -0.5 35.186 -0.496 35.285 -0.484 c
+35.212 -1.102 l
+35.102 -1.15 34.969 -1.176 34.815 -1.176 c
+34.599 -1.165 34.433 -1.084 34.315 -0.926 c
+34.205 -0.771 34.161 -0.558 34.183 -0.294 c
+34.447 1.279 l
+34.109 1.279 l
+34.212 1.867 l
+34.551 1.867 l
+34.668 2.602 l
+h
+38.317 1.118 m
+38.082 1.147 l
+37.876 1.147 37.707 1.048 37.582 0.853 c
+37.244 -1.117 l
+36.48 -1.117 l
+36.994 1.867 l
+37.714 1.867 l
+37.656 1.544 l
+37.743 1.68 37.824 1.779 37.905 1.838 c
+37.994 1.897 38.089 1.926 38.2 1.926 c
+38.258 1.926 38.331 1.912 38.42 1.881 c
+h
+40.658 1.926 m
+40.959 1.915 41.194 1.812 41.363 1.617 c
+41.529 1.419 41.62 1.154 41.643 0.823 c
+41.643 0.632 l
+41.614 0.052 41.47 -0.396 41.217 -0.72 c
+40.97 -1.036 40.643 -1.183 40.232 -1.176 c
+39.996 -1.165 39.798 -1.102 39.644 -0.984 c
+39.497 -0.86 39.386 -0.687 39.32 -0.47 c
+39.25 -0.257 39.232 -0.007 39.262 0.279 c
+39.276 0.427 l
+39.335 0.897 39.486 1.264 39.732 1.529 c
+39.974 1.801 40.283 1.933 40.658 1.926 c
+40.011 -0.029 m
+40.011 -0.353 40.107 -0.521 40.305 -0.529 c
+40.569 -0.551 40.739 -0.349 40.82 0.074 c
+40.849 0.279 l
+40.878 0.545 40.893 0.709 40.893 0.78 c
+40.893 1.103 40.79 1.268 40.584 1.279 c
+40.438 1.287 40.313 1.22 40.217 1.073 c
+40.128 0.934 40.07 0.728 40.041 0.456 c
+40.018 0.192 40.011 0.03 40.011 -0.029 c
+43.48 -1.117 m
+42.73 -1.117 l
+43.451 3.117 l
+44.23 3.117 l
+h
+f
+Q
+q 1 0 0 1 247.9403 102.5161 cm
+0 0 m
+0.809 2.117 l
+1.294 2.117 l
+0.059 -0.867 l
+-0.309 -0.867 l
+-0.5 1.264 l
+-1.425 -0.867 l
+-1.808 -0.867 l
+-1.999 2.117 l
+-1.543 2.117 l
+-1.455 0.058 l
+-0.559 2.117 l
+-0.176 2.117 l
+h
+3.631 -0.867 m
+3.62 -0.809 3.616 -0.757 3.616 -0.706 c
+3.631 -0.544 l
+3.425 -0.802 3.198 -0.927 2.955 -0.927 c
+2.708 -0.927 2.517 -0.849 2.381 -0.691 c
+2.253 -0.537 2.198 -0.331 2.22 -0.073 c
+2.238 0.228 2.367 0.474 2.602 0.661 c
+2.837 0.845 3.138 0.941 3.514 0.941 c
+3.851 0.941 l
+3.896 1.264 l
+3.925 1.587 3.8 1.749 3.528 1.749 c
+3.381 1.749 3.256 1.705 3.161 1.617 c
+3.061 1.536 3.003 1.429 2.984 1.294 c
+2.514 1.294 l
+2.532 1.536 2.646 1.741 2.851 1.911 c
+3.057 2.087 3.296 2.175 3.572 2.175 c
+3.836 2.165 4.042 2.08 4.189 1.926 c
+4.337 1.768 4.395 1.543 4.366 1.249 c
+4.131 -0.221 l
+4.108 -0.32 4.102 -0.42 4.102 -0.515 c
+4.116 -0.823 l
+4.116 -0.867 l
+h
+3.043 -0.485 m
+3.285 -0.485 3.491 -0.368 3.66 -0.133 c
+3.792 0.573 l
+3.572 0.588 l
+3.385 0.588 3.219 0.551 3.072 0.484 c
+2.926 0.415 2.822 0.316 2.764 0.191 c
+2.705 0.073 2.683 -0.059 2.705 -0.206 c
+2.723 -0.393 2.837 -0.485 3.043 -0.485 c
+7.162 -0.088 m
+7.192 0.088 7.092 0.235 6.868 0.353 c
+6.501 0.544 l
+6.313 0.65 6.181 0.764 6.104 0.881 c
+6.024 0.999 5.99 1.139 6.001 1.308 c
+6.008 1.55 6.107 1.756 6.295 1.926 c
+6.49 2.09 6.729 2.175 7.015 2.175 c
+7.279 2.165 7.485 2.076 7.632 1.911 c
+7.787 1.741 7.857 1.529 7.838 1.264 c
+7.368 1.264 l
+7.375 1.411 7.342 1.529 7.265 1.617 c
+7.196 1.705 7.104 1.749 6.986 1.749 c
+6.839 1.749 6.722 1.708 6.633 1.631 c
+6.545 1.55 6.49 1.448 6.471 1.323 c
+6.442 1.176 6.508 1.051 6.677 0.955 c
+7.148 0.72 l
+7.489 0.521 7.651 0.268 7.632 -0.044 c
+7.611 -0.32 7.504 -0.54 7.31 -0.706 c
+7.111 -0.864 6.872 -0.933 6.589 -0.927 c
+6.313 -0.915 6.089 -0.831 5.913 -0.661 c
+5.744 -0.485 5.667 -0.258 5.677 0.029 c
+6.163 0.029 l
+6.152 -0.147 6.184 -0.279 6.265 -0.368 c
+6.354 -0.456 6.464 -0.5 6.604 -0.5 c
+6.758 -0.5 6.886 -0.463 6.986 -0.382 c
+7.082 -0.305 7.14 -0.206 7.162 -0.088 c
+12.689 -0.603 m
+12.491 -0.831 12.252 -0.933 11.969 -0.927 c
+11.752 -0.927 11.587 -0.852 11.469 -0.706 c
+11.358 -0.551 11.308 -0.335 11.308 -0.059 c
+11.322 0.191 l
+11.645 2.117 l
+12.116 2.117 l
+11.807 0.176 l
+11.792 -0.015 l
+11.782 -0.154 11.8 -0.264 11.851 -0.353 c
+11.899 -0.441 11.977 -0.485 12.087 -0.485 c
+12.351 -0.507 12.565 -0.375 12.733 -0.088 c
+13.116 2.117 l
+13.6 2.117 l
+13.086 -0.867 l
+12.63 -0.867 l
+h
+16.214 -0.088 m
+16.243 0.088 16.143 0.235 15.919 0.353 c
+15.551 0.544 l
+15.364 0.65 15.232 0.764 15.155 0.881 c
+15.074 0.999 15.041 1.139 15.052 1.308 c
+15.059 1.55 15.158 1.756 15.346 1.926 c
+15.541 2.09 15.78 2.175 16.066 2.175 c
+16.331 2.165 16.536 2.076 16.684 1.911 c
+16.838 1.741 16.908 1.529 16.889 1.264 c
+16.419 1.264 l
+16.426 1.411 16.393 1.529 16.316 1.617 c
+16.247 1.705 16.154 1.749 16.037 1.749 c
+15.89 1.749 15.772 1.708 15.684 1.631 c
+15.596 1.55 15.541 1.448 15.522 1.323 c
+15.493 1.176 15.559 1.051 15.728 0.955 c
+16.199 0.72 l
+16.54 0.521 16.702 0.268 16.684 -0.044 c
+16.661 -0.32 16.555 -0.54 16.36 -0.706 c
+16.162 -0.864 15.923 -0.933 15.64 -0.927 c
+15.364 -0.915 15.14 -0.831 14.963 -0.661 c
+14.795 -0.485 14.718 -0.258 14.728 0.029 c
+15.214 0.029 l
+15.202 -0.147 15.236 -0.279 15.316 -0.368 c
+15.405 -0.456 15.515 -0.5 15.655 -0.5 c
+15.809 -0.5 15.938 -0.463 16.037 -0.382 c
+16.133 -0.305 16.191 -0.206 16.214 -0.088 c
+19.146 -0.927 m
+18.811 -0.915 18.562 -0.794 18.396 -0.559 c
+18.227 -0.324 18.168 0 18.219 0.411 c
+18.249 0.706 l
+18.308 1.165 18.448 1.529 18.676 1.793 c
+18.899 2.057 19.183 2.183 19.528 2.175 c
+19.811 2.165 20.02 2.065 20.16 1.881 c
+20.307 1.694 20.38 1.429 20.38 1.087 c
+20.351 0.764 l
+20.307 0.484 l
+18.705 0.484 l
+18.683 0.316 18.676 0.183 18.676 0.088 c
+18.676 -0.1 18.72 -0.246 18.807 -0.353 c
+18.896 -0.452 19.021 -0.5 19.19 -0.5 c
+19.308 -0.511 19.425 -0.493 19.543 -0.441 c
+19.66 -0.382 19.778 -0.294 19.896 -0.177 c
+20.131 -0.485 l
+20.013 -0.632 19.866 -0.746 19.69 -0.823 c
+19.513 -0.89 19.329 -0.927 19.146 -0.927 c
+19.499 1.749 m
+19.175 1.768 18.947 1.573 18.822 1.161 c
+18.749 0.897 l
+19.896 0.897 l
+19.896 0.97 l
+19.914 1.047 19.925 1.135 19.925 1.234 c
+19.914 1.565 19.771 1.738 19.499 1.749 c
+22.82 2.161 m
+23.092 2.161 23.298 2.047 23.438 1.822 c
+23.732 3.366 l
+24.202 3.366 l
+23.468 -0.867 l
+23.041 -0.867 l
+23.085 -0.544 l
+22.886 -0.809 22.651 -0.933 22.379 -0.927 c
+22.134 -0.915 21.942 -0.819 21.806 -0.632 c
+21.666 -0.449 21.6 -0.177 21.6 0.176 c
+21.6 0.341 21.619 0.559 21.66 0.823 c
+21.707 1.095 21.777 1.326 21.865 1.514 c
+22.071 1.962 22.387 2.179 22.82 2.161 c
+22.071 0.058 m
+22.078 -0.305 22.232 -0.493 22.527 -0.5 c
+22.633 -0.5 22.736 -0.478 22.836 -0.426 c
+22.931 -0.368 23.026 -0.272 23.114 -0.133 c
+23.379 1.382 l
+23.291 1.606 23.137 1.723 22.923 1.735 c
+22.483 1.764 22.217 1.444 22.13 0.779 c
+22.089 0.455 22.071 0.213 22.071 0.058 c
+25.455 -0.294 m
+25.544 -0.287 25.617 -0.309 25.676 -0.368 c
+25.735 -0.426 25.764 -0.5 25.764 -0.588 c
+25.764 -0.676 25.735 -0.75 25.676 -0.809 c
+25.617 -0.867 25.544 -0.897 25.455 -0.897 c
+25.367 -0.904 25.294 -0.886 25.234 -0.838 c
+25.176 -0.779 25.147 -0.706 25.147 -0.617 c
+25.147 -0.522 25.176 -0.441 25.234 -0.382 c
+25.294 -0.324 25.367 -0.294 25.455 -0.294 c
+f
+Q
+q 1 0 0 1 138.5097 93.1379 cm
+0 0 m
+0.691 4.013 l
+1.587 4.013 l
+2.017 4.002 2.337 3.844 2.543 3.543 c
+2.749 3.237 2.822 2.837 2.763 2.337 c
+2.675 1.706 l
+2.587 1.147 2.389 0.721 2.087 0.426 c
+1.782 0.139 1.396 0 0.926 0 c
+h
+1.117 3.572 m
+0.573 0.426 l
+0.926 0.426 l
+1.268 0.426 1.547 0.53 1.764 0.735 c
+1.977 0.941 2.117 1.253 2.175 1.675 c
+2.278 2.352 l
+2.296 2.499 2.308 2.646 2.308 2.793 c
+2.296 3.036 2.227 3.223 2.102 3.352 c
+1.984 3.487 1.808 3.561 1.573 3.572 c
+h
+4.119 1.617 m
+4.178 2.047 4.318 2.396 4.546 2.66 c
+4.781 2.925 5.074 3.05 5.428 3.042 c
+5.652 3.032 5.839 2.961 5.986 2.837 c
+6.134 2.72 6.236 2.55 6.294 2.337 c
+6.361 2.12 6.383 1.885 6.354 1.631 c
+6.325 1.353 l
+6.254 0.919 6.104 0.573 5.868 0.309 c
+5.641 0.052 5.354 -0.066 5.001 -0.058 c
+4.773 -0.048 4.59 0.015 4.443 0.133 c
+4.295 0.257 4.185 0.426 4.119 0.632 c
+4.06 0.845 4.046 1.087 4.075 1.353 c
+h
+4.546 1.147 m
+4.534 0.9 4.567 0.709 4.648 0.573 c
+4.737 0.434 4.862 0.36 5.031 0.353 c
+5.236 0.341 5.405 0.415 5.545 0.573 c
+5.692 0.738 5.787 0.985 5.839 1.309 c
+5.883 1.631 l
+5.898 1.837 l
+5.898 2.08 5.854 2.271 5.766 2.411 c
+5.685 2.547 5.564 2.616 5.398 2.616 c
+5.182 2.624 5.001 2.535 4.854 2.352 c
+4.715 2.165 4.627 1.903 4.59 1.573 c
+4.546 1.294 l
+h
+8.507 2.984 m
+8.448 2.66 l
+8.661 2.914 8.908 3.042 9.183 3.042 c
+9.367 3.032 9.514 2.961 9.624 2.837 c
+9.741 2.72 9.804 2.547 9.816 2.323 c
+9.822 2.194 9.822 2.072 9.816 1.955 c
+9.492 0 l
+9.007 0 l
+9.345 1.97 l
+9.359 2.176 l
+9.359 2.458 9.242 2.606 9.007 2.616 c
+8.819 2.616 8.643 2.506 8.478 2.294 c
+8.39 2.176 l
+8.022 0 l
+7.537 0 l
+8.066 2.984 l
+h
+11.752 3.91 m
+11.546 2.911 l
+11.193 2.911 l
+11.399 4.233 l
+11.811 4.233 l
+h
+13.924 3.705 m
+13.791 2.984 l
+14.232 2.984 l
+14.159 2.587 l
+13.718 2.587 l
+13.409 0.735 l
+13.409 0.617 l
+13.398 0.459 13.454 0.382 13.571 0.382 c
+13.619 0.382 13.689 0.389 13.776 0.412 c
+13.733 0 l
+13.622 -0.037 13.519 -0.052 13.424 -0.044 c
+13.255 -0.044 13.13 0.022 13.041 0.162 c
+12.954 0.297 12.924 0.489 12.954 0.735 c
+13.247 2.587 l
+12.806 2.587 l
+12.88 2.984 l
+13.321 2.984 l
+13.438 3.705 l
+h
+17.822 0 m
+17.352 0 l
+18.088 4.233 l
+18.558 4.233 l
+h
+19.976 0 m
+19.505 0 l
+20.02 2.984 l
+20.505 2.984 l
+h
+20.137 3.778 m
+20.137 3.855 20.16 3.925 20.211 3.983 c
+20.259 4.042 20.322 4.072 20.402 4.072 c
+20.48 4.072 20.542 4.042 20.594 3.983 c
+20.652 3.932 20.675 3.865 20.667 3.778 c
+20.667 3.697 20.641 3.63 20.594 3.572 c
+20.542 3.513 20.48 3.484 20.402 3.484 c
+20.314 3.472 20.245 3.499 20.197 3.557 c
+20.145 3.616 20.126 3.69 20.137 3.778 c
+22.585 0.75 m
+23.482 2.984 l
+23.981 2.984 l
+22.659 0 l
+22.291 0 l
+21.894 2.984 l
+22.364 2.984 l
+h
+25.926 -0.058 m
+25.591 -0.048 25.341 0.073 25.176 0.309 c
+25.007 0.544 24.948 0.867 24.999 1.278 c
+25.028 1.573 l
+25.088 2.032 25.227 2.396 25.455 2.66 c
+25.679 2.925 25.963 3.05 26.308 3.042 c
+26.591 3.032 26.8 2.932 26.94 2.749 c
+27.087 2.562 27.16 2.296 27.16 1.955 c
+27.131 1.631 l
+27.087 1.353 l
+25.485 1.353 l
+25.462 1.183 25.455 1.051 25.455 0.956 c
+25.455 0.768 25.499 0.621 25.587 0.515 c
+25.676 0.415 25.801 0.368 25.969 0.368 c
+26.087 0.357 26.204 0.374 26.322 0.426 c
+26.439 0.485 26.557 0.573 26.675 0.691 c
+26.91 0.382 l
+26.792 0.235 26.646 0.121 26.47 0.044 c
+26.293 -0.022 26.109 -0.058 25.926 -0.058 c
+26.279 2.616 m
+25.955 2.635 25.727 2.44 25.602 2.028 c
+25.529 1.764 l
+26.675 1.764 l
+26.675 1.837 l
+26.693 1.914 26.705 2.003 26.705 2.102 c
+26.693 2.433 26.55 2.606 26.279 2.616 c
+30.916 0 m
+30.445 0 l
+30.96 2.984 l
+31.445 2.984 l
+h
+31.077 3.778 m
+31.077 3.855 31.1 3.925 31.151 3.983 c
+31.199 4.042 31.261 4.072 31.342 4.072 c
+31.419 4.072 31.482 4.042 31.534 3.983 c
+31.592 3.932 31.614 3.865 31.607 3.778 c
+31.607 3.697 31.581 3.63 31.534 3.572 c
+31.482 3.513 31.419 3.484 31.342 3.484 c
+31.254 3.472 31.184 3.499 31.137 3.557 c
+31.085 3.616 31.066 3.69 31.077 3.778 c
+33.525 2.984 m
+33.466 2.66 l
+33.679 2.914 33.925 3.042 34.201 3.042 c
+34.385 3.032 34.532 2.961 34.642 2.837 c
+34.759 2.72 34.822 2.547 34.833 2.323 c
+34.84 2.194 34.84 2.072 34.833 1.955 c
+34.51 0 l
+34.025 0 l
+34.362 1.97 l
+34.377 2.176 l
+34.377 2.458 34.26 2.606 34.025 2.616 c
+33.837 2.616 33.661 2.506 33.495 2.294 c
+33.408 2.176 l
+33.04 0 l
+32.554 0 l
+33.084 2.984 l
+h
+39.32 0.353 m
+39.474 0.353 39.603 0.401 39.702 0.5 c
+39.808 0.607 39.885 0.754 39.937 0.941 c
+40.378 0.941 l
+40.338 0.647 40.217 0.401 40.011 0.206 c
+39.805 0.019 39.563 -0.066 39.291 -0.058 c
+39.026 -0.048 38.813 0.029 38.659 0.177 c
+38.501 0.331 38.409 0.548 38.379 0.823 c
+38.357 0.989 38.357 1.154 38.379 1.323 c
+38.424 1.617 l
+38.482 2.087 38.618 2.444 38.835 2.69 c
+39.06 2.932 39.353 3.05 39.717 3.042 c
+39.989 3.032 40.202 2.929 40.349 2.734 c
+40.504 2.535 40.577 2.278 40.569 1.955 c
+40.114 1.955 l
+40.121 2.385 39.981 2.606 39.687 2.616 c
+39.254 2.635 38.996 2.33 38.908 1.706 c
+38.85 1.312 38.824 1.043 38.835 0.897 c
+38.853 0.544 39.015 0.36 39.32 0.353 c
+42.565 2.675 m
+42.778 2.918 43.02 3.036 43.285 3.028 c
+43.48 3.028 43.631 2.961 43.741 2.837 c
+43.847 2.72 43.906 2.547 43.917 2.323 c
+43.924 2.194 43.924 2.072 43.917 1.955 c
+43.594 0 l
+43.108 0 l
+43.447 1.97 l
+43.461 2.176 l
+43.461 2.458 43.344 2.606 43.108 2.616 c
+42.921 2.616 42.744 2.506 42.58 2.294 c
+42.491 2.176 l
+42.123 0 l
+41.639 0 l
+42.374 4.233 l
+42.859 4.233 l
+h
+46.68 0 m
+46.669 0.059 46.665 0.11 46.665 0.162 c
+46.68 0.324 l
+46.474 0.066 46.247 -0.058 46.004 -0.058 c
+45.759 -0.058 45.567 0.019 45.431 0.177 c
+45.302 0.331 45.248 0.536 45.269 0.794 c
+45.288 1.095 45.416 1.341 45.651 1.529 c
+45.886 1.712 46.188 1.808 46.563 1.808 c
+46.901 1.808 l
+46.945 2.132 l
+46.975 2.454 46.85 2.616 46.578 2.616 c
+46.43 2.616 46.306 2.572 46.21 2.484 c
+46.111 2.404 46.052 2.296 46.034 2.161 c
+45.564 2.161 l
+45.582 2.404 45.695 2.609 45.902 2.778 c
+46.108 2.955 46.346 3.042 46.622 3.042 c
+46.886 3.032 47.092 2.947 47.239 2.793 c
+47.386 2.635 47.445 2.411 47.415 2.117 c
+47.18 0.647 l
+47.158 0.548 47.151 0.449 47.151 0.353 c
+47.166 0.044 l
+47.166 0 l
+h
+46.092 0.382 m
+46.335 0.382 46.541 0.5 46.71 0.735 c
+46.842 1.44 l
+46.622 1.455 l
+46.434 1.455 46.269 1.419 46.122 1.353 c
+45.975 1.282 45.872 1.183 45.813 1.058 c
+45.755 0.941 45.732 0.808 45.755 0.661 c
+45.773 0.474 45.886 0.382 46.092 0.382 c
+48.863 1.617 m
+48.922 2.047 49.061 2.396 49.289 2.66 c
+49.524 2.925 49.819 3.05 50.172 3.042 c
+50.395 3.032 50.584 2.961 50.73 2.837 c
+50.877 2.72 50.98 2.55 51.039 2.337 c
+51.105 2.12 51.127 1.885 51.097 1.631 c
+51.068 1.353 l
+50.998 0.919 50.848 0.573 50.613 0.309 c
+50.385 0.052 50.098 -0.066 49.745 -0.058 c
+49.518 -0.048 49.333 0.015 49.187 0.133 c
+49.04 0.257 48.93 0.426 48.863 0.632 c
+48.805 0.845 48.79 1.087 48.819 1.353 c
+h
+49.289 1.147 m
+49.279 0.9 49.312 0.709 49.393 0.573 c
+49.481 0.434 49.605 0.36 49.775 0.353 c
+49.981 0.341 50.15 0.415 50.289 0.573 c
+50.436 0.738 50.532 0.985 50.584 1.309 c
+50.627 1.631 l
+50.642 1.837 l
+50.642 2.08 50.598 2.271 50.509 2.411 c
+50.428 2.547 50.308 2.616 50.142 2.616 c
+49.925 2.624 49.745 2.535 49.599 2.352 c
+49.458 2.165 49.37 1.903 49.333 1.573 c
+49.289 1.294 l
+h
+53.836 0.779 m
+53.865 0.956 53.765 1.103 53.541 1.22 c
+53.173 1.411 l
+52.986 1.517 52.855 1.631 52.777 1.749 c
+52.696 1.866 52.663 2.007 52.674 2.176 c
+52.681 2.418 52.78 2.624 52.968 2.793 c
+53.163 2.959 53.402 3.042 53.688 3.042 c
+53.953 3.032 54.158 2.944 54.306 2.778 c
+54.46 2.609 54.53 2.396 54.511 2.132 c
+54.041 2.132 l
+54.048 2.278 54.015 2.396 53.938 2.484 c
+53.869 2.572 53.776 2.616 53.659 2.616 c
+53.512 2.616 53.394 2.576 53.306 2.499 c
+53.218 2.418 53.163 2.315 53.144 2.19 c
+53.115 2.043 53.181 1.918 53.35 1.823 c
+53.821 1.588 l
+54.162 1.389 54.324 1.135 54.306 0.823 c
+54.283 0.548 54.177 0.327 53.982 0.162 c
+53.784 0.004 53.545 -0.066 53.262 -0.058 c
+52.986 -0.048 52.762 0.037 52.585 0.206 c
+52.417 0.382 52.34 0.61 52.35 0.897 c
+52.836 0.897 l
+52.824 0.721 52.857 0.588 52.938 0.5 c
+53.027 0.412 53.137 0.368 53.277 0.368 c
+53.431 0.368 53.56 0.405 53.659 0.485 c
+53.755 0.563 53.813 0.661 53.836 0.779 c
+56.4 1.132 m
+55.974 1.132 l
+56.429 4.013 l
+56.93 4.013 l
+h
+55.768 0.25 m
+55.768 0.327 55.791 0.397 55.841 0.455 c
+55.889 0.515 55.959 0.548 56.047 0.559 c
+56.125 0.559 56.188 0.53 56.238 0.47 c
+56.286 0.412 56.312 0.341 56.312 0.264 c
+56.312 0.183 56.286 0.118 56.238 0.059 c
+56.188 0 56.121 -0.029 56.032 -0.029 c
+55.952 -0.037 55.889 -0.019 55.841 0.029 c
+55.791 0.088 55.768 0.162 55.768 0.25 c
+f
+Q
+q 1 0 0 1 206.7387 88.644 cm
+0 0 m
+-0.47 -2.749 l
+-0.529 -3.171 -0.687 -3.499 -0.941 -3.734 c
+-1.186 -3.969 -1.514 -4.079 -1.926 -4.072 c
+-2.319 -4.061 -2.612 -3.94 -2.807 -3.705 c
+-3.006 -3.469 -3.083 -3.153 -3.042 -2.749 c
+-2.572 0 l
+-1.778 0 l
+-2.234 -2.764 l
+-2.248 -2.999 l
+-2.248 -3.256 -2.123 -3.389 -1.866 -3.396 c
+-1.691 -3.406 -1.554 -3.363 -1.455 -3.263 c
+-1.359 -3.157 -1.29 -2.992 -1.249 -2.764 c
+-0.793 0 l
+h
+2.124 -3.19 m
+2.143 -3.065 2.04 -2.951 1.816 -2.852 c
+1.599 -2.756 1.437 -2.66 1.33 -2.573 c
+1.22 -2.477 1.139 -2.374 1.081 -2.264 c
+1.029 -2.157 1.011 -2.036 1.022 -1.897 c
+1.029 -1.632 1.139 -1.411 1.345 -1.235 c
+1.559 -1.058 1.819 -0.971 2.124 -0.971 c
+2.419 -0.981 2.646 -1.073 2.816 -1.249 c
+2.992 -1.419 3.08 -1.64 3.08 -1.912 c
+2.315 -1.912 l
+2.315 -1.786 2.294 -1.698 2.257 -1.646 c
+2.216 -1.588 2.157 -1.559 2.08 -1.559 c
+1.992 -1.559 1.912 -1.588 1.845 -1.646 c
+1.786 -1.706 1.75 -1.779 1.742 -1.867 c
+1.713 -1.985 1.801 -2.095 2.007 -2.19 c
+2.22 -2.278 2.374 -2.352 2.462 -2.411 c
+2.735 -2.598 2.863 -2.849 2.845 -3.161 c
+2.833 -3.348 2.775 -3.51 2.668 -3.645 c
+2.569 -3.786 2.433 -3.892 2.257 -3.969 c
+2.087 -4.035 1.904 -4.072 1.698 -4.072 c
+1.405 -4.061 1.162 -3.969 0.977 -3.793 c
+0.801 -3.609 0.713 -3.373 0.713 -3.088 c
+1.448 -3.088 l
+1.437 -3.234 1.455 -3.344 1.507 -3.41 c
+1.565 -3.469 1.646 -3.499 1.756 -3.499 c
+1.845 -3.499 1.922 -3.477 1.992 -3.425 c
+2.058 -3.366 2.103 -3.289 2.124 -3.19 c
+5.281 -4.072 m
+5.035 -4.072 4.829 -4.013 4.663 -3.896 c
+4.495 -3.778 4.373 -3.616 4.296 -3.41 c
+4.227 -3.198 4.208 -2.955 4.237 -2.691 c
+4.252 -2.484 l
+4.318 -1.995 4.472 -1.617 4.707 -1.353 c
+4.943 -1.088 5.245 -0.963 5.619 -0.971 c
+5.891 -0.981 6.108 -1.07 6.265 -1.235 c
+6.421 -1.393 6.508 -1.617 6.531 -1.912 c
+6.548 -2.087 6.548 -2.261 6.531 -2.425 c
+6.471 -2.778 l
+4.987 -2.778 l
+4.976 -2.859 4.972 -2.936 4.972 -3.013 c
+4.991 -3.278 5.123 -3.41 5.369 -3.41 c
+5.594 -3.421 5.814 -3.337 6.03 -3.161 c
+6.295 -3.631 l
+6.185 -3.77 6.038 -3.877 5.854 -3.954 c
+5.677 -4.031 5.486 -4.072 5.281 -4.072 c
+5.546 -1.617 m
+5.328 -1.61 5.178 -1.75 5.089 -2.043 c
+5.031 -2.234 l
+5.795 -2.234 l
+5.814 -2.139 5.825 -2.055 5.825 -1.985 c
+5.833 -1.75 5.74 -1.628 5.546 -1.617 c
+12.495 -3.558 m
+12.347 -3.726 12.149 -3.851 11.907 -3.94 c
+11.672 -4.028 11.422 -4.072 11.157 -4.072 c
+10.911 -4.072 10.701 -4.017 10.525 -3.911 c
+10.348 -3.803 10.209 -3.653 10.113 -3.454 c
+10.014 -3.26 9.966 -3.036 9.966 -2.778 c
+9.955 -2.643 9.959 -2.5 9.981 -2.352 c
+10.084 -1.691 l
+10.161 -1.132 10.338 -0.702 10.613 -0.397 c
+10.896 -0.085 11.263 0.066 11.715 0.058 c
+12.098 0.047 12.384 -0.071 12.582 -0.294 c
+12.777 -0.522 12.877 -0.849 12.877 -1.279 c
+12.112 -1.279 l
+12.098 -1.058 l
+12.075 -0.776 11.936 -0.628 11.672 -0.618 c
+11.296 -0.599 11.047 -0.849 10.922 -1.367 c
+10.892 -1.573 l
+10.774 -2.352 l
+10.753 -2.529 10.745 -2.675 10.745 -2.793 c
+10.753 -2.999 10.797 -3.153 10.878 -3.248 c
+10.966 -3.337 11.087 -3.389 11.245 -3.396 c
+11.381 -3.396 11.539 -3.348 11.715 -3.248 c
+11.863 -2.514 l
+11.304 -2.514 l
+11.422 -1.897 l
+12.759 -1.897 l
+h
+14.56 -4.013 m
+13.81 -4.013 l
+14.325 -1.029 l
+15.089 -1.029 l
+h
+14.427 -0.279 m
+14.427 -0.154 14.464 -0.052 14.545 0.029 c
+14.622 0.118 14.722 0.162 14.839 0.162 c
+14.946 0.162 15.038 0.121 15.119 0.044 c
+15.206 -0.037 15.25 -0.133 15.25 -0.25 c
+15.25 -0.379 15.206 -0.482 15.119 -0.559 c
+15.038 -0.64 14.942 -0.676 14.824 -0.676 c
+14.707 -0.676 14.608 -0.643 14.531 -0.574 c
+14.46 -0.497 14.427 -0.397 14.427 -0.279 c
+17.581 -0.294 m
+17.463 -1.029 l
+17.845 -1.029 l
+17.742 -1.617 l
+17.359 -1.617 l
+17.095 -3.117 l
+17.095 -3.205 l
+17.084 -3.333 17.132 -3.396 17.242 -3.396 c
+17.272 -3.396 17.334 -3.392 17.434 -3.381 c
+17.359 -3.998 l
+17.249 -4.046 17.118 -4.072 16.963 -4.072 c
+16.746 -4.061 16.581 -3.98 16.463 -3.822 c
+16.353 -3.668 16.309 -3.454 16.331 -3.19 c
+16.596 -1.617 l
+16.258 -1.617 l
+16.36 -1.029 l
+16.698 -1.029 l
+16.816 -0.294 l
+h
+19.624 -2.778 m
+18.992 -2.778 l
+19.374 0 l
+20.182 0 l
+h
+18.741 -3.645 m
+18.741 -3.521 18.778 -3.418 18.859 -3.337 c
+18.936 -3.248 19.036 -3.205 19.153 -3.205 c
+19.271 -3.205 19.366 -3.246 19.447 -3.323 c
+19.524 -3.404 19.565 -3.499 19.565 -3.616 c
+19.565 -3.745 19.524 -3.851 19.447 -3.94 c
+19.366 -4.017 19.271 -4.057 19.153 -4.057 c
+19.025 -4.057 18.922 -4.017 18.845 -3.94 c
+18.774 -3.863 18.741 -3.763 18.741 -3.645 c
+f
+Q
+0.793 0.801 0.129 0.016 K
+0.8 w
+q 1 0 0 1 534.418 129.4519 cm
+0 0 m
+-0.008 35.572 l
+6.464 35.572 l
+6.471 0 l
+3.23 -3.564 l
+0 0 l
+h
+S
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 537.5488 161.6247 cm
+0 0 m
+1.675 -0.264 l
+1.675 -1.014 l
+-1.309 -0.397 l
+-1.309 0.249 l
+0.411 0.676 l
+-1.309 1.087 l
+-1.309 1.749 l
+1.675 2.366 l
+1.675 1.617 l
+0 1.352 l
+1.675 0.955 l
+1.675 0.397 l
+h
+0.279 -1.07 m
+0.727 -1.07 1.08 -1.176 1.338 -1.393 c
+1.602 -1.606 1.735 -1.9 1.735 -2.275 c
+1.735 -2.657 1.602 -2.951 1.338 -3.157 c
+1.08 -3.37 0.727 -3.48 0.279 -3.48 c
+0.088 -3.48 l
+-0.375 -3.48 -0.732 -3.37 -0.985 -3.157 c
+-1.243 -2.951 -1.367 -2.657 -1.367 -2.275 c
+-1.367 -1.893 -1.243 -1.592 -0.985 -1.378 c
+-0.721 -1.172 -0.364 -1.07 0.088 -1.07 c
+h
+0.088 -1.849 m
+-0.453 -1.849 -0.721 -1.988 -0.721 -2.275 c
+-0.721 -2.539 -0.497 -2.679 -0.044 -2.701 c
+0.279 -2.716 l
+0.551 -2.716 0.754 -2.675 0.881 -2.598 c
+1.018 -2.517 1.088 -2.411 1.088 -2.275 c
+1.088 -2.146 1.018 -2.043 0.881 -1.966 c
+0.754 -1.885 0.551 -1.849 0.279 -1.849 c
+h
+0.926 -5.251 m
+0.941 -5.002 l
+0.941 -4.785 0.845 -4.638 0.661 -4.561 c
+-1.309 -4.561 l
+-1.309 -3.782 l
+1.675 -3.782 l
+1.675 -4.516 l
+1.352 -4.546 l
+1.606 -4.663 1.735 -4.829 1.735 -5.045 c
+1.735 -5.134 1.72 -5.207 1.69 -5.266 c
+h
+-0.162 -6.531 m
+-0.397 -6.31 l
+-1.309 -6.31 l
+-1.309 -5.531 l
+2.925 -5.531 l
+2.925 -6.31 l
+0.632 -6.31 l
+0.779 -6.413 l
+1.675 -6.957 l
+1.675 -7.882 l
+0.44 -7.015 l
+-1.309 -7.971 l
+-1.309 -7.074 l
+h
+-1.309 -8.096 2.984 -0.779 re
+-1.309 -8.875 m
+2.44 -8.052 m
+2.564 -8.052 2.668 -8.088 2.749 -8.169 c
+2.826 -8.247 2.866 -8.349 2.866 -8.478 c
+2.866 -8.603 2.826 -8.706 2.749 -8.787 c
+2.668 -8.864 2.564 -8.904 2.44 -8.904 c
+2.322 -8.904 2.223 -8.864 2.146 -8.787 c
+2.065 -8.717 2.028 -8.613 2.028 -8.478 c
+2.028 -8.349 2.065 -8.247 2.146 -8.169 c
+2.223 -8.088 2.322 -8.052 2.44 -8.052 c
+1.675 -10.099 m
+1.381 -10.113 l
+1.616 -10.29 1.735 -10.517 1.735 -10.804 c
+1.735 -11.322 1.371 -11.587 0.646 -11.597 c
+-1.309 -11.597 l
+-1.309 -10.819 l
+0.588 -10.819 l
+0.764 -10.819 0.885 -10.793 0.955 -10.745 c
+1.032 -10.693 1.072 -10.606 1.072 -10.481 c
+1.072 -10.334 0.999 -10.219 0.852 -10.142 c
+-1.309 -10.142 l
+-1.309 -9.363 l
+1.675 -9.363 l
+h
+0.279 -11.884 m
+0.768 -11.884 1.132 -11.973 1.367 -12.149 c
+1.61 -12.326 1.735 -12.568 1.735 -12.884 c
+1.735 -13.156 1.624 -13.369 1.411 -13.516 c
+1.675 -13.546 l
+1.675 -14.251 l
+-1.309 -14.251 l
+-1.69 -14.251 -1.977 -14.14 -2.176 -13.928 c
+-2.382 -13.71 -2.484 -13.406 -2.484 -13.016 c
+-2.484 -12.847 -2.448 -12.671 -2.382 -12.487 c
+-2.323 -12.311 -2.238 -12.179 -2.132 -12.09 c
+-1.602 -12.355 l
+-1.669 -12.432 -1.727 -12.532 -1.779 -12.649 c
+-1.827 -12.767 -1.852 -12.873 -1.852 -12.972 c
+-1.852 -13.149 -1.808 -13.274 -1.72 -13.355 c
+-1.639 -13.432 -1.507 -13.472 -1.323 -13.472 c
+-1.073 -13.472 l
+-1.272 -13.325 -1.367 -13.126 -1.367 -12.884 c
+-1.367 -12.568 -1.246 -12.326 -1 -12.149 c
+-0.746 -11.973 -0.393 -11.884 0.058 -11.884 c
+h
+0.073 -12.663 m
+-0.202 -12.663 -0.405 -12.696 -0.53 -12.767 c
+-0.647 -12.844 -0.706 -12.962 -0.706 -13.12 c
+-0.706 -13.274 -0.655 -13.391 -0.544 -13.472 c
+0.881 -13.472 l
+1.007 -13.391 1.072 -13.274 1.072 -13.12 c
+1.072 -12.962 1.007 -12.844 0.881 -12.767 c
+0.754 -12.696 0.551 -12.663 0.279 -12.663 c
+h
+0.088 -14.685 0.646 -1.352 re
+0.088 -16.037 m
+-0.206 -17.525 m
+1.675 -17.907 l
+1.675 -18.716 l
+-1.309 -17.893 l
+-1.309 -17.157 l
+1.675 -16.334 l
+1.675 -17.143 l
+h
+-1.367 -20.083 m
+-1.367 -19.678 -1.249 -19.366 -1.014 -19.142 c
+-0.772 -18.925 -0.426 -18.819 0.014 -18.819 c
+0.264 -18.819 l
+0.735 -18.819 1.095 -18.921 1.352 -19.127 c
+1.606 -19.333 1.735 -19.627 1.735 -20.01 c
+1.735 -20.38 1.61 -20.66 1.367 -20.847 c
+1.132 -21.042 0.779 -21.141 0.309 -21.141 c
+-0.073 -21.141 l
+-0.073 -19.597 l
+-0.302 -19.605 -0.467 -19.649 -0.574 -19.73 c
+-0.673 -19.819 -0.721 -19.954 -0.721 -20.141 c
+-0.721 -20.395 -0.628 -20.612 -0.441 -20.788 c
+-0.927 -21.097 l
+-1.055 -20.998 -1.162 -20.854 -1.249 -20.671 c
+-1.326 -20.494 -1.367 -20.296 -1.367 -20.083 c
+0.47 -19.597 m
+0.47 -20.376 l
+0.544 -20.376 l
+0.72 -20.376 0.852 -20.347 0.941 -20.289 c
+1.036 -20.23 1.088 -20.131 1.088 -19.994 c
+1.088 -19.866 1.036 -19.767 0.941 -19.701 c
+0.841 -19.642 0.683 -19.605 0.47 -19.597 c
+0.926 -22.868 m
+0.941 -22.618 l
+0.941 -22.402 0.845 -22.254 0.661 -22.177 c
+-1.309 -22.177 l
+-1.309 -21.398 l
+1.675 -21.398 l
+1.675 -22.134 l
+1.352 -22.163 l
+1.606 -22.28 1.735 -22.446 1.735 -22.662 c
+1.735 -22.751 1.72 -22.824 1.69 -22.883 c
+h
+-0.515 -24.471 m
+-0.449 -24.471 -0.382 -24.434 -0.324 -24.368 c
+-0.265 -24.309 -0.191 -24.169 -0.103 -23.956 c
+0.033 -23.632 0.168 -23.412 0.309 -23.295 c
+0.444 -23.177 0.617 -23.118 0.823 -23.118 c
+1.088 -23.118 1.301 -23.21 1.469 -23.397 c
+1.646 -23.582 1.735 -23.831 1.735 -24.147 c
+1.735 -24.471 1.646 -24.727 1.469 -24.926 c
+1.301 -25.121 1.076 -25.22 0.794 -25.22 c
+0.794 -24.441 l
+1.036 -24.441 1.161 -24.338 1.161 -24.133 c
+1.161 -24.052 1.132 -23.985 1.072 -23.927 c
+1.022 -23.875 0.955 -23.853 0.867 -23.853 c
+0.797 -23.853 0.739 -23.883 0.69 -23.941 c
+0.639 -24 0.565 -24.136 0.47 -24.353 c
+0.353 -24.677 0.22 -24.9 0.073 -25.029 c
+-0.067 -25.165 -0.25 -25.234 -0.485 -25.234 c
+-0.75 -25.234 -0.967 -25.132 -1.132 -24.926 c
+-1.29 -24.727 -1.367 -24.471 -1.367 -24.147 c
+-1.367 -23.919 -1.323 -23.725 -1.235 -23.559 c
+-1.147 -23.39 -1.029 -23.258 -0.882 -23.162 c
+-0.728 -23.074 -0.559 -23.03 -0.382 -23.03 c
+-0.382 -23.765 l
+-0.522 -23.772 -0.625 -23.809 -0.691 -23.868 c
+-0.761 -23.927 -0.794 -24.022 -0.794 -24.162 c
+-0.794 -24.368 -0.702 -24.471 -0.515 -24.471 c
+-1.309 -25.587 2.984 -0.78 re
+-1.309 -26.367 m
+2.44 -25.544 m
+2.564 -25.544 2.668 -25.581 2.749 -25.661 c
+2.826 -25.739 2.866 -25.841 2.866 -25.97 c
+2.866 -26.094 2.826 -26.198 2.749 -26.279 c
+2.668 -26.356 2.564 -26.396 2.44 -26.396 c
+2.322 -26.396 2.223 -26.356 2.146 -26.279 c
+2.065 -26.209 2.028 -26.106 2.028 -25.97 c
+2.028 -25.841 2.065 -25.739 2.146 -25.661 c
+2.223 -25.581 2.322 -25.544 2.44 -25.544 c
+0.279 -26.782 m
+0.727 -26.782 1.08 -26.888 1.338 -27.106 c
+1.602 -27.318 1.735 -27.613 1.735 -27.987 c
+1.735 -28.369 1.602 -28.663 1.338 -28.869 c
+1.08 -29.082 0.727 -29.192 0.279 -29.192 c
+0.088 -29.192 l
+-0.375 -29.192 -0.732 -29.082 -0.985 -28.869 c
+-1.243 -28.663 -1.367 -28.369 -1.367 -27.987 c
+-1.367 -27.605 -1.243 -27.304 -0.985 -27.09 c
+-0.721 -26.884 -0.364 -26.782 0.088 -26.782 c
+h
+0.088 -27.561 m
+-0.453 -27.561 -0.721 -27.701 -0.721 -27.987 c
+-0.721 -28.251 -0.497 -28.392 -0.044 -28.413 c
+0.279 -28.428 l
+0.551 -28.428 0.754 -28.388 0.881 -28.311 c
+1.018 -28.23 1.088 -28.123 1.088 -27.987 c
+1.088 -27.858 1.018 -27.756 0.881 -27.678 c
+0.754 -27.598 0.551 -27.561 0.279 -27.561 c
+h
+1.675 -30.214 m
+1.381 -30.229 l
+1.616 -30.406 1.735 -30.633 1.735 -30.919 c
+1.735 -31.438 1.371 -31.702 0.646 -31.713 c
+-1.309 -31.713 l
+-1.309 -30.934 l
+0.588 -30.934 l
+0.764 -30.934 0.885 -30.909 0.955 -30.861 c
+1.032 -30.809 1.072 -30.721 1.072 -30.597 c
+1.072 -30.449 0.999 -30.335 0.852 -30.258 c
+-1.309 -30.258 l
+-1.309 -29.479 l
+1.675 -29.479 l
+h
+f
+Q
+q 1 0 0 1 442.9198 145.1834 cm
+0 0 m
+-1.058 0 l
+-1.058 -3.572 l
+-1.558 -3.572 l
+-1.558 0 l
+-2.616 0 l
+-2.616 0.441 l
+0 0.441 l
+h
+0.819 -0.897 m
+1.003 -0.654 1.238 -0.529 1.525 -0.529 c
+2.055 -0.529 2.323 -0.881 2.333 -1.587 c
+2.333 -3.572 l
+1.849 -3.572 l
+1.849 -1.617 l
+1.849 -1.382 1.808 -1.216 1.731 -1.117 c
+1.65 -1.022 1.532 -0.97 1.378 -0.97 c
+1.261 -0.97 1.151 -1.01 1.055 -1.087 c
+0.956 -1.168 0.879 -1.275 0.819 -1.411 c
+0.819 -3.572 l
+0.334 -3.572 l
+0.334 0.661 l
+0.819 0.661 l
+h
+3.406 -3.572 -0.5 2.984 re
+3.436 0.206 m
+3.436 0.118 3.41 0.044 3.362 -0.014 c
+3.322 -0.066 3.252 -0.088 3.156 -0.088 c
+3.069 -0.088 2.998 -0.066 2.951 -0.014 c
+2.911 0.044 2.892 0.11 2.892 0.191 c
+2.892 0.279 2.911 0.353 2.951 0.412 c
+2.998 0.47 3.069 0.5 3.156 0.5 c
+3.252 0.5 3.322 0.47 3.362 0.412 c
+3.41 0.353 3.436 0.283 3.436 0.206 c
+5.523 -2.807 m
+5.523 -2.701 5.483 -2.612 5.405 -2.543 c
+5.325 -2.466 5.174 -2.377 4.95 -2.278 c
+4.685 -2.171 4.498 -2.08 4.391 -1.999 c
+4.281 -1.922 4.204 -1.834 4.156 -1.735 c
+4.104 -1.639 4.083 -1.521 4.083 -1.382 c
+4.083 -1.139 4.171 -0.937 4.347 -0.779 c
+4.523 -0.613 4.748 -0.529 5.024 -0.529 c
+5.317 -0.529 5.552 -0.617 5.729 -0.794 c
+5.905 -0.962 5.993 -1.176 5.993 -1.44 c
+5.508 -1.44 l
+5.508 -1.304 5.457 -1.19 5.361 -1.103 c
+5.273 -1.007 5.159 -0.955 5.024 -0.955 c
+4.877 -0.955 4.762 -0.995 4.685 -1.072 c
+4.604 -1.143 4.567 -1.242 4.567 -1.367 c
+4.567 -1.466 4.597 -1.543 4.656 -1.602 c
+4.715 -1.66 4.854 -1.741 5.082 -1.837 c
+5.442 -1.984 5.689 -2.127 5.818 -2.263 c
+5.953 -2.392 6.023 -2.564 6.023 -2.778 c
+6.023 -3.035 5.928 -3.241 5.743 -3.395 c
+5.567 -3.553 5.332 -3.63 5.038 -3.63 c
+4.722 -3.63 4.469 -3.542 4.274 -3.366 c
+4.087 -3.183 3.994 -2.95 3.994 -2.675 c
+4.48 -2.675 l
+4.486 -2.844 4.538 -2.977 4.627 -3.072 c
+4.722 -3.16 4.862 -3.204 5.038 -3.204 c
+5.192 -3.204 5.31 -3.171 5.39 -3.102 c
+5.479 -3.035 5.523 -2.936 5.523 -2.807 c
+8.213 -3.572 -0.5 2.984 re
+8.243 0.206 m
+8.243 0.118 8.216 0.044 8.169 -0.014 c
+8.129 -0.066 8.058 -0.088 7.963 -0.088 c
+7.875 -0.088 7.805 -0.066 7.757 -0.014 c
+7.717 0.044 7.699 0.11 7.699 0.191 c
+7.699 0.279 7.717 0.353 7.757 0.412 c
+7.805 0.47 7.875 0.5 7.963 0.5 c
+8.058 0.5 8.129 0.47 8.169 0.412 c
+8.216 0.353 8.243 0.283 8.243 0.206 c
+10.326 -2.807 m
+10.326 -2.701 10.286 -2.612 10.208 -2.543 c
+10.128 -2.466 9.977 -2.377 9.753 -2.278 c
+9.488 -2.171 9.301 -2.08 9.194 -1.999 c
+9.084 -1.922 9.007 -1.834 8.959 -1.735 c
+8.908 -1.639 8.885 -1.521 8.885 -1.382 c
+8.885 -1.139 8.974 -0.937 9.15 -0.779 c
+9.326 -0.613 9.55 -0.529 9.826 -0.529 c
+10.12 -0.529 10.356 -0.617 10.532 -0.794 c
+10.708 -0.962 10.796 -1.176 10.796 -1.44 c
+10.311 -1.44 l
+10.311 -1.304 10.26 -1.19 10.165 -1.103 c
+10.076 -1.007 9.962 -0.955 9.826 -0.955 c
+9.679 -0.955 9.565 -0.995 9.488 -1.072 c
+9.407 -1.143 9.371 -1.242 9.371 -1.367 c
+9.371 -1.466 9.4 -1.543 9.459 -1.602 c
+9.517 -1.66 9.658 -1.741 9.885 -1.837 c
+10.246 -1.984 10.491 -2.127 10.62 -2.263 c
+10.756 -2.392 10.826 -2.564 10.826 -2.778 c
+10.826 -3.035 10.73 -3.241 10.547 -3.395 c
+10.37 -3.553 10.135 -3.63 9.841 -3.63 c
+9.525 -3.63 9.271 -3.542 9.076 -3.366 c
+8.889 -3.183 8.797 -2.95 8.797 -2.675 c
+9.282 -2.675 l
+9.29 -2.844 9.342 -2.977 9.429 -3.072 c
+9.525 -3.16 9.664 -3.204 9.841 -3.204 c
+9.995 -3.204 10.113 -3.171 10.194 -3.102 c
+10.282 -3.035 10.326 -2.936 10.326 -2.807 c
+14.015 -3.572 m
+13.986 -3.505 13.964 -3.395 13.957 -3.248 c
+13.78 -3.505 13.56 -3.63 13.295 -3.63 c
+13.02 -3.63 12.803 -3.557 12.648 -3.41 c
+12.501 -3.256 12.428 -3.039 12.428 -2.763 c
+12.428 -2.462 12.531 -2.219 12.737 -2.043 c
+12.943 -1.859 13.225 -1.764 13.589 -1.764 c
+13.942 -1.764 l
+13.942 -1.44 l
+13.942 -1.264 13.901 -1.143 13.824 -1.072 c
+13.743 -0.995 13.626 -0.955 13.471 -0.955 c
+13.325 -0.955 13.2 -0.999 13.104 -1.087 c
+13.016 -1.176 12.972 -1.286 12.972 -1.411 c
+12.486 -1.411 l
+12.486 -1.264 12.531 -1.124 12.619 -0.985 c
+12.707 -0.837 12.825 -0.727 12.972 -0.646 c
+13.126 -0.569 13.299 -0.529 13.486 -0.529 c
+13.799 -0.529 14.034 -0.61 14.192 -0.764 c
+14.346 -0.912 14.427 -1.132 14.427 -1.425 c
+14.427 -2.925 l
+14.435 -3.16 14.471 -3.362 14.53 -3.528 c
+14.53 -3.572 l
+h
+13.369 -3.189 m
+13.486 -3.189 13.596 -3.156 13.707 -3.087 c
+13.814 -3.021 13.891 -2.936 13.942 -2.836 c
+13.942 -2.131 l
+13.677 -2.131 l
+13.442 -2.131 13.255 -2.183 13.119 -2.278 c
+12.99 -2.377 12.928 -2.52 12.928 -2.705 c
+12.928 -2.873 12.957 -2.994 13.016 -3.072 c
+13.082 -3.152 13.2 -3.189 13.369 -3.189 c
+16.845 0.133 m
+16.845 -0.588 l
+17.301 -0.588 l
+17.301 -0.985 l
+16.845 -0.985 l
+16.845 -2.836 l
+16.845 -2.954 16.864 -3.042 16.904 -3.102 c
+16.941 -3.16 17.01 -3.189 17.109 -3.189 c
+17.168 -3.189 17.231 -3.183 17.301 -3.16 c
+17.301 -3.572 l
+17.184 -3.609 17.069 -3.63 16.962 -3.63 c
+16.764 -3.63 16.613 -3.564 16.507 -3.424 c
+16.407 -3.289 16.36 -3.094 16.36 -2.836 c
+16.36 -0.985 l
+15.904 -0.985 l
+15.904 -0.588 l
+16.36 -0.588 l
+16.36 0.133 l
+h
+19.296 -3.572 m
+19.266 -3.505 19.245 -3.395 19.237 -3.248 c
+19.061 -3.505 18.84 -3.63 18.576 -3.63 c
+18.3 -3.63 18.084 -3.557 17.929 -3.41 c
+17.782 -3.256 17.708 -3.039 17.708 -2.763 c
+17.708 -2.462 17.812 -2.219 18.017 -2.043 c
+18.223 -1.859 18.506 -1.764 18.869 -1.764 c
+19.223 -1.764 l
+19.223 -1.44 l
+19.223 -1.264 19.183 -1.143 19.105 -1.072 c
+19.025 -0.995 18.907 -0.955 18.753 -0.955 c
+18.605 -0.955 18.48 -0.999 18.385 -1.087 c
+18.296 -1.176 18.252 -1.286 18.252 -1.411 c
+17.768 -1.411 l
+17.768 -1.264 17.812 -1.124 17.899 -0.985 c
+17.988 -0.837 18.105 -0.727 18.252 -0.646 c
+18.407 -0.569 18.58 -0.529 18.767 -0.529 c
+19.079 -0.529 19.314 -0.61 19.472 -0.764 c
+19.627 -0.912 19.708 -1.132 19.708 -1.425 c
+19.708 -2.925 l
+19.715 -3.16 19.752 -3.362 19.81 -3.528 c
+19.81 -3.572 l
+h
+18.649 -3.189 m
+18.767 -3.189 18.877 -3.156 18.988 -3.087 c
+19.094 -3.021 19.171 -2.936 19.223 -2.836 c
+19.223 -2.131 l
+18.958 -2.131 l
+18.723 -2.131 18.535 -2.183 18.399 -2.278 c
+18.271 -2.377 18.208 -2.52 18.208 -2.705 c
+18.208 -2.873 18.238 -2.994 18.296 -3.072 c
+18.362 -3.152 18.48 -3.189 18.649 -3.189 c
+20.185 -1.94 m
+20.185 -1.481 20.266 -1.132 20.436 -0.897 c
+20.612 -0.654 20.862 -0.529 21.185 -0.529 c
+21.486 -0.529 21.718 -0.661 21.876 -0.926 c
+21.905 -0.588 l
+22.346 -0.588 l
+22.346 -3.601 l
+22.346 -3.972 22.247 -4.255 22.052 -4.453 c
+21.865 -4.648 21.604 -4.748 21.273 -4.748 c
+21.126 -4.748 20.957 -4.707 20.773 -4.63 c
+20.586 -4.56 20.45 -4.472 20.361 -4.365 c
+20.553 -4.027 l
+20.758 -4.233 20.983 -4.336 21.229 -4.336 c
+21.629 -4.336 21.836 -4.108 21.847 -3.659 c
+21.847 -3.278 l
+21.689 -3.513 21.468 -3.63 21.185 -3.63 c
+20.869 -3.63 20.627 -3.513 20.45 -3.278 c
+20.28 -3.042 20.193 -2.712 20.185 -2.278 c
+h
+20.671 -2.219 m
+20.671 -2.554 20.718 -2.8 20.818 -2.954 c
+20.913 -3.112 21.074 -3.189 21.302 -3.189 c
+21.545 -3.189 21.729 -3.068 21.847 -2.822 c
+21.847 -1.338 l
+21.729 -1.095 21.552 -0.97 21.317 -0.97 c
+21.089 -0.97 20.928 -1.051 20.832 -1.205 c
+20.733 -1.363 20.677 -1.602 20.671 -1.926 c
+h
+22.908 -3.307 m
+22.908 -3.219 22.931 -3.146 22.982 -3.087 c
+23.041 -3.028 23.118 -2.998 23.217 -2.998 c
+23.324 -2.998 23.401 -3.028 23.453 -3.087 c
+23.511 -3.146 23.54 -3.219 23.54 -3.307 c
+23.54 -3.388 23.511 -3.454 23.453 -3.513 c
+23.401 -3.572 23.324 -3.601 23.217 -3.601 c
+23.118 -3.601 23.041 -3.572 22.982 -3.513 c
+22.931 -3.454 22.908 -3.388 22.908 -3.307 c
+26.061 -3.572 -0.5 4.013 re
+27.421 0.133 m
+27.421 -0.588 l
+27.877 -0.588 l
+27.877 -0.985 l
+27.421 -0.985 l
+27.421 -2.836 l
+27.421 -2.954 27.439 -3.042 27.48 -3.102 c
+27.517 -3.16 27.586 -3.189 27.686 -3.189 c
+27.744 -3.189 27.806 -3.183 27.877 -3.16 c
+27.877 -3.572 l
+27.759 -3.609 27.646 -3.63 27.538 -3.63 c
+27.34 -3.63 27.189 -3.564 27.083 -3.424 c
+26.984 -3.289 26.936 -3.094 26.936 -2.836 c
+26.936 -0.985 l
+26.48 -0.985 l
+26.48 -0.588 l
+26.936 -0.588 l
+26.936 0.133 l
+h
+30.078 -3.572 -0.5 4.233 re
+30.647 -1.94 m
+30.647 -1.51 30.75 -1.168 30.956 -0.912 c
+31.169 -0.658 31.449 -0.529 31.794 -0.529 c
+32.136 -0.529 32.411 -0.658 32.617 -0.912 c
+32.83 -1.157 32.944 -1.492 32.955 -1.911 c
+32.955 -2.219 l
+32.955 -2.653 32.845 -2.994 32.631 -3.248 c
+32.426 -3.505 32.147 -3.63 31.794 -3.63 c
+31.449 -3.63 31.177 -3.509 30.971 -3.263 c
+30.765 -3.021 30.655 -2.686 30.647 -2.263 c
+h
+31.133 -2.219 m
+31.133 -2.535 31.191 -2.778 31.309 -2.954 c
+31.434 -3.123 31.596 -3.204 31.794 -3.204 c
+32.224 -3.204 32.448 -2.896 32.471 -2.278 c
+32.471 -1.94 l
+32.471 -1.639 32.404 -1.396 32.279 -1.22 c
+32.161 -1.043 32 -0.955 31.794 -0.955 c
+31.596 -0.955 31.434 -1.043 31.309 -1.22 c
+31.191 -1.396 31.133 -1.639 31.133 -1.94 c
+h
+33.294 -1.94 m
+33.294 -1.51 33.396 -1.168 33.602 -0.912 c
+33.815 -0.658 34.094 -0.529 34.44 -0.529 c
+34.782 -0.529 35.058 -0.658 35.263 -0.912 c
+35.476 -1.157 35.59 -1.492 35.601 -1.911 c
+35.601 -2.219 l
+35.601 -2.653 35.49 -2.994 35.278 -3.248 c
+35.072 -3.505 34.792 -3.63 34.44 -3.63 c
+34.094 -3.63 33.822 -3.509 33.616 -3.263 c
+33.411 -3.021 33.3 -2.686 33.294 -2.263 c
+h
+33.778 -2.219 m
+33.778 -2.535 33.837 -2.778 33.955 -2.954 c
+34.079 -3.123 34.241 -3.204 34.44 -3.204 c
+34.869 -3.204 35.094 -2.896 35.116 -2.278 c
+35.116 -1.94 l
+35.116 -1.639 35.05 -1.396 34.925 -1.22 c
+34.807 -1.043 34.646 -0.955 34.44 -0.955 c
+34.241 -0.955 34.079 -1.043 33.955 -1.22 c
+33.837 -1.396 33.778 -1.639 33.778 -1.94 c
+h
+36.788 -2.205 m
+36.523 -2.499 l
+36.523 -3.572 l
+36.038 -3.572 l
+36.038 0.661 l
+36.523 0.661 l
+36.523 -1.866 l
+37.449 -0.588 l
+38.038 -0.588 l
+37.097 -1.837 l
+38.17 -3.572 l
+37.597 -3.572 l
+h
+39.856 -2.807 m
+39.856 -2.701 39.816 -2.612 39.739 -2.543 c
+39.658 -2.466 39.507 -2.377 39.283 -2.278 c
+39.018 -2.171 38.831 -2.08 38.725 -1.999 c
+38.615 -1.922 38.537 -1.834 38.489 -1.735 c
+38.438 -1.639 38.416 -1.521 38.416 -1.382 c
+38.416 -1.139 38.504 -0.937 38.68 -0.779 c
+38.857 -0.613 39.081 -0.529 39.357 -0.529 c
+39.65 -0.529 39.885 -0.617 40.062 -0.794 c
+40.238 -0.962 40.327 -1.176 40.327 -1.44 c
+39.841 -1.44 l
+39.841 -1.304 39.79 -1.19 39.694 -1.103 c
+39.606 -1.007 39.492 -0.955 39.357 -0.955 c
+39.21 -0.955 39.095 -0.995 39.018 -1.072 c
+38.938 -1.143 38.901 -1.242 38.901 -1.367 c
+38.901 -1.466 38.931 -1.543 38.989 -1.602 c
+39.048 -1.66 39.187 -1.741 39.415 -1.837 c
+39.775 -1.984 40.022 -2.127 40.151 -2.263 c
+40.286 -2.392 40.356 -2.564 40.356 -2.778 c
+40.356 -3.035 40.261 -3.241 40.076 -3.395 c
+39.901 -3.553 39.665 -3.63 39.371 -3.63 c
+39.056 -3.63 38.802 -3.542 38.607 -3.366 c
+38.42 -3.183 38.328 -2.95 38.328 -2.675 c
+38.813 -2.675 l
+38.821 -2.844 38.871 -2.977 38.96 -3.072 c
+39.056 -3.16 39.195 -3.204 39.371 -3.204 c
+39.526 -3.204 39.644 -3.171 39.724 -3.102 c
+39.812 -3.035 39.856 -2.936 39.856 -2.807 c
+42.546 -3.572 -0.5 4.233 re
+43.752 -3.572 -0.5 2.984 re
+43.781 0.206 m
+43.781 0.118 43.756 0.044 43.708 -0.014 c
+43.667 -0.066 43.598 -0.088 43.502 -0.088 c
+43.413 -0.088 43.344 -0.066 43.296 -0.014 c
+43.255 0.044 43.237 0.11 43.237 0.191 c
+43.237 0.279 43.255 0.353 43.296 0.412 c
+43.344 0.47 43.413 0.5 43.502 0.5 c
+43.598 0.5 43.667 0.47 43.708 0.412 c
+43.756 0.353 43.781 0.283 43.781 0.206 c
+45.173 -2.205 m
+44.909 -2.499 l
+44.909 -3.572 l
+44.425 -3.572 l
+44.425 0.661 l
+44.909 0.661 l
+44.909 -1.866 l
+45.836 -0.588 l
+46.424 -0.588 l
+45.483 -1.837 l
+46.555 -3.572 l
+45.982 -3.572 l
+h
+47.808 -3.63 m
+47.434 -3.63 47.151 -3.524 46.956 -3.307 c
+46.758 -3.083 46.662 -2.755 46.662 -2.323 c
+46.662 -1.955 l
+46.662 -1.514 46.754 -1.168 46.941 -0.912 c
+47.136 -0.658 47.411 -0.529 47.764 -0.529 c
+48.107 -0.529 48.36 -0.643 48.529 -0.867 c
+48.705 -1.095 48.797 -1.44 48.808 -1.911 c
+48.808 -2.219 l
+47.147 -2.219 l
+47.147 -2.293 l
+47.147 -2.616 47.206 -2.851 47.324 -2.998 c
+47.441 -3.138 47.61 -3.204 47.838 -3.204 c
+47.985 -3.204 48.11 -3.183 48.22 -3.131 c
+48.327 -3.072 48.429 -2.984 48.529 -2.866 c
+48.778 -3.175 l
+48.573 -3.48 48.25 -3.63 47.808 -3.63 c
+47.764 -0.955 m
+47.559 -0.955 47.405 -1.025 47.309 -1.161 c
+47.21 -1.301 47.155 -1.514 47.147 -1.808 c
+48.323 -1.808 l
+48.323 -1.735 l
+48.301 -1.462 48.25 -1.264 48.161 -1.147 c
+48.073 -1.022 47.941 -0.955 47.764 -0.955 c
+51.953 -3.572 m
+51.924 -3.505 51.902 -3.395 51.895 -3.248 c
+51.718 -3.505 51.498 -3.63 51.234 -3.63 c
+50.958 -3.63 50.741 -3.557 50.586 -3.41 c
+50.44 -3.256 50.366 -3.039 50.366 -2.763 c
+50.366 -2.462 50.469 -2.219 50.675 -2.043 c
+50.881 -1.859 51.164 -1.764 51.527 -1.764 c
+51.88 -1.764 l
+51.88 -1.44 l
+51.88 -1.264 51.839 -1.143 51.762 -1.072 c
+51.681 -0.995 51.564 -0.955 51.41 -0.955 c
+51.263 -0.955 51.138 -0.999 51.043 -1.087 c
+50.954 -1.176 50.91 -1.286 50.91 -1.411 c
+50.425 -1.411 l
+50.425 -1.264 50.469 -1.124 50.557 -0.985 c
+50.646 -0.837 50.763 -0.727 50.91 -0.646 c
+51.064 -0.569 51.237 -0.529 51.425 -0.529 c
+51.737 -0.529 51.972 -0.61 52.13 -0.764 c
+52.284 -0.912 52.365 -1.132 52.365 -1.425 c
+52.365 -2.925 l
+52.373 -3.16 52.41 -3.362 52.468 -3.528 c
+52.468 -3.572 l
+h
+51.307 -3.189 m
+51.425 -3.189 51.535 -3.156 51.645 -3.087 c
+51.752 -3.021 51.829 -2.936 51.88 -2.836 c
+51.88 -2.131 l
+51.616 -2.131 l
+51.38 -2.131 51.193 -2.183 51.057 -2.278 c
+50.929 -2.377 50.866 -2.52 50.866 -2.705 c
+50.866 -2.873 50.895 -2.994 50.954 -3.072 c
+51.02 -3.152 51.138 -3.189 51.307 -3.189 c
+54.045 -1.94 m
+54.045 -1.481 54.125 -1.132 54.295 -0.897 c
+54.471 -0.654 54.721 -0.529 55.045 -0.529 c
+55.327 -0.529 55.548 -0.646 55.706 -0.881 c
+55.706 0.661 l
+56.19 0.661 l
+56.19 -3.572 l
+55.75 -3.572 l
+55.72 -3.248 l
+55.562 -3.505 55.338 -3.63 55.045 -3.63 c
+54.728 -3.63 54.486 -3.513 54.309 -3.278 c
+54.133 -3.035 54.045 -2.69 54.045 -2.248 c
+h
+54.53 -2.219 m
+54.53 -2.554 54.578 -2.8 54.677 -2.954 c
+54.773 -3.112 54.934 -3.189 55.162 -3.189 c
+55.404 -3.189 55.588 -3.072 55.706 -2.836 c
+55.706 -1.323 l
+55.577 -1.087 55.397 -0.97 55.162 -0.97 c
+54.934 -0.97 54.773 -1.051 54.677 -1.205 c
+54.578 -1.363 54.53 -1.602 54.53 -1.926 c
+h
+57.823 -3.63 m
+57.447 -3.63 57.165 -3.524 56.969 -3.307 c
+56.772 -3.083 56.676 -2.755 56.676 -2.323 c
+56.676 -1.955 l
+56.676 -1.514 56.768 -1.168 56.955 -0.912 c
+57.15 -0.658 57.426 -0.529 57.778 -0.529 c
+58.12 -0.529 58.374 -0.643 58.542 -0.867 c
+58.719 -1.095 58.811 -1.44 58.822 -1.911 c
+58.822 -2.219 l
+57.161 -2.219 l
+57.161 -2.293 l
+57.161 -2.616 57.22 -2.851 57.337 -2.998 c
+57.455 -3.138 57.624 -3.204 57.852 -3.204 c
+57.998 -3.204 58.124 -3.183 58.234 -3.131 c
+58.341 -3.072 58.443 -2.984 58.542 -2.866 c
+58.792 -3.175 l
+58.586 -3.48 58.264 -3.63 57.823 -3.63 c
+57.778 -0.955 m
+57.572 -0.955 57.418 -1.025 57.323 -1.161 c
+57.223 -1.301 57.168 -1.514 57.161 -1.808 c
+58.337 -1.808 l
+58.337 -1.735 l
+58.315 -1.462 58.264 -1.264 58.175 -1.147 c
+58.087 -1.022 57.954 -0.955 57.778 -0.955 c
+60.038 -2.836 m
+60.612 -0.588 l
+61.111 -0.588 l
+60.215 -3.572 l
+59.862 -3.572 l
+58.966 -0.588 l
+59.45 -0.588 l
+h
+62.482 -3.63 m
+62.107 -3.63 61.824 -3.524 61.63 -3.307 c
+61.431 -3.083 61.335 -2.755 61.335 -2.323 c
+61.335 -1.955 l
+61.335 -1.514 61.427 -1.168 61.615 -0.912 c
+61.809 -0.658 62.085 -0.529 62.438 -0.529 c
+62.779 -0.529 63.033 -0.643 63.203 -0.867 c
+63.379 -1.095 63.471 -1.44 63.481 -1.911 c
+63.481 -2.219 l
+61.821 -2.219 l
+61.821 -2.293 l
+61.821 -2.616 61.879 -2.851 61.997 -2.998 c
+62.114 -3.138 62.284 -3.204 62.511 -3.204 c
+62.658 -3.204 62.783 -3.183 62.893 -3.131 c
+63 -3.072 63.103 -2.984 63.203 -2.866 c
+63.452 -3.175 l
+63.246 -3.48 62.923 -3.63 62.482 -3.63 c
+62.438 -0.955 m
+62.232 -0.955 62.078 -1.025 61.982 -1.161 c
+61.883 -1.301 61.828 -1.514 61.821 -1.808 c
+62.997 -1.808 l
+62.997 -1.735 l
+62.974 -1.462 62.923 -1.264 62.835 -1.147 c
+62.746 -1.022 62.614 -0.955 62.438 -0.955 c
+64.422 -3.572 -0.5 4.233 re
+64.996 -1.94 m
+64.996 -1.51 65.098 -1.168 65.304 -0.912 c
+65.517 -0.658 65.796 -0.529 66.142 -0.529 c
+66.484 -0.529 66.76 -0.658 66.966 -0.912 c
+67.178 -1.157 67.292 -1.492 67.303 -1.911 c
+67.303 -2.219 l
+67.303 -2.653 67.193 -2.994 66.98 -3.248 c
+66.774 -3.505 66.495 -3.63 66.142 -3.63 c
+65.796 -3.63 65.524 -3.509 65.319 -3.263 c
+65.113 -3.021 65.003 -2.686 64.996 -2.263 c
+h
+65.48 -2.219 m
+65.48 -2.535 65.539 -2.778 65.657 -2.954 c
+65.782 -3.123 65.944 -3.204 66.142 -3.204 c
+66.572 -3.204 66.796 -2.896 66.818 -2.278 c
+66.818 -1.94 l
+66.818 -1.639 66.752 -1.396 66.627 -1.22 c
+66.509 -1.043 66.348 -0.955 66.142 -0.955 c
+65.944 -0.955 65.782 -1.043 65.657 -1.22 c
+65.539 -1.396 65.48 -1.639 65.48 -1.94 c
+h
+69.887 -2.219 m
+69.887 -2.69 69.802 -3.042 69.636 -3.278 c
+69.468 -3.513 69.229 -3.63 68.917 -3.63 c
+68.612 -3.63 68.379 -3.52 68.225 -3.293 c
+68.225 -4.718 l
+67.741 -4.718 l
+67.741 -0.588 l
+68.181 -0.588 l
+68.211 -0.926 l
+68.365 -0.661 68.597 -0.529 68.902 -0.529 c
+69.233 -0.529 69.478 -0.646 69.636 -0.881 c
+69.802 -1.109 69.887 -1.448 69.887 -1.896 c
+h
+69.401 -1.94 m
+69.401 -1.61 69.347 -1.363 69.239 -1.205 c
+69.141 -1.051 68.979 -0.97 68.755 -0.97 c
+68.52 -0.97 68.343 -1.087 68.225 -1.323 c
+68.225 -2.866 l
+68.343 -3.094 68.523 -3.204 68.769 -3.204 c
+68.983 -3.204 69.141 -3.127 69.239 -2.969 c
+69.347 -2.815 69.401 -2.572 69.401 -2.248 c
+h
+71.404 -3.63 m
+71.03 -3.63 70.746 -3.524 70.552 -3.307 c
+70.353 -3.083 70.258 -2.755 70.258 -2.323 c
+70.258 -1.955 l
+70.258 -1.514 70.349 -1.168 70.537 -0.912 c
+70.731 -0.658 71.007 -0.529 71.36 -0.529 c
+71.702 -0.529 71.955 -0.643 72.125 -0.867 c
+72.301 -1.095 72.393 -1.44 72.404 -1.911 c
+72.404 -2.219 l
+70.743 -2.219 l
+70.743 -2.293 l
+70.743 -2.616 70.802 -2.851 70.919 -2.998 c
+71.037 -3.138 71.206 -3.204 71.434 -3.204 c
+71.581 -3.204 71.706 -3.183 71.816 -3.131 c
+71.922 -3.072 72.025 -2.984 72.125 -2.866 c
+72.375 -3.175 l
+72.169 -3.48 71.845 -3.63 71.404 -3.63 c
+71.36 -0.955 m
+71.155 -0.955 71 -1.025 70.904 -1.161 c
+70.806 -1.301 70.75 -1.514 70.743 -1.808 c
+71.919 -1.808 l
+71.919 -1.735 l
+71.897 -1.462 71.845 -1.264 71.757 -1.147 c
+71.669 -1.022 71.537 -0.955 71.36 -0.955 c
+74.05 -1.043 m
+73.981 -1.036 73.906 -1.029 73.829 -1.029 c
+73.572 -1.029 73.396 -1.168 73.301 -1.44 c
+73.301 -3.572 l
+72.815 -3.572 l
+72.815 -0.588 l
+73.285 -0.588 l
+73.301 -0.897 l
+73.426 -0.654 73.609 -0.529 73.844 -0.529 c
+73.921 -0.529 73.984 -0.544 74.035 -0.573 c
+h
+74.785 0.353 m
+74.741 -0.661 l
+74.373 -0.661 l
+74.388 0.661 l
+74.785 0.661 l
+h
+76.611 -2.807 m
+76.611 -2.701 76.571 -2.612 76.493 -2.543 c
+76.412 -2.466 76.262 -2.377 76.038 -2.278 c
+75.774 -2.171 75.586 -2.08 75.479 -1.999 c
+75.369 -1.922 75.292 -1.834 75.244 -1.735 c
+75.193 -1.639 75.171 -1.521 75.171 -1.382 c
+75.171 -1.139 75.259 -0.937 75.435 -0.779 c
+75.612 -0.613 75.836 -0.529 76.111 -0.529 c
+76.406 -0.529 76.641 -0.617 76.817 -0.794 c
+76.994 -0.962 77.081 -1.176 77.081 -1.44 c
+76.597 -1.44 l
+76.597 -1.304 76.545 -1.19 76.45 -1.103 c
+76.362 -1.007 76.248 -0.955 76.111 -0.955 c
+75.965 -0.955 75.851 -0.995 75.774 -1.072 c
+75.693 -1.143 75.656 -1.242 75.656 -1.367 c
+75.656 -1.466 75.685 -1.543 75.745 -1.602 c
+75.803 -1.66 75.942 -1.741 76.171 -1.837 c
+76.53 -1.984 76.777 -2.127 76.905 -2.263 c
+77.041 -2.392 77.112 -2.564 77.112 -2.778 c
+77.112 -3.035 77.016 -3.241 76.832 -3.395 c
+76.655 -3.553 76.42 -3.63 76.127 -3.63 c
+75.81 -3.63 75.556 -3.542 75.362 -3.366 c
+75.174 -3.183 75.082 -2.95 75.082 -2.675 c
+75.568 -2.675 l
+75.575 -2.844 75.627 -2.977 75.714 -3.072 c
+75.81 -3.16 75.95 -3.204 76.127 -3.204 c
+76.281 -3.204 76.398 -3.171 76.479 -3.102 c
+76.568 -3.035 76.611 -2.936 76.611 -2.807 c
+f
+Q
+q 1 0 0 1 453.7345 138.0102 cm
+0 0 m
+0.015 -0.324 l
+0.199 -0.07 0.441 0.059 0.735 0.059 c
+1.264 0.059 1.532 -0.294 1.544 -0.999 c
+1.544 -2.984 l
+1.058 -2.984 l
+1.058 -1.029 l
+1.058 -0.794 1.018 -0.628 0.941 -0.529 c
+0.86 -0.434 0.742 -0.382 0.588 -0.382 c
+0.47 -0.382 0.36 -0.422 0.264 -0.5 c
+0.166 -0.58 0.088 -0.687 0.029 -0.823 c
+0.029 -2.984 l
+-0.455 -2.984 l
+-0.455 0 l
+h
+1.992 -1.352 m
+1.992 -0.922 2.095 -0.58 2.3 -0.324 c
+2.514 -0.07 2.793 0.059 3.138 0.059 c
+3.48 0.059 3.755 -0.07 3.961 -0.324 c
+4.175 -0.569 4.289 -0.904 4.299 -1.323 c
+4.299 -1.631 l
+4.299 -2.065 4.189 -2.406 3.977 -2.66 c
+3.77 -2.917 3.491 -3.042 3.138 -3.042 c
+2.793 -3.042 2.521 -2.921 2.315 -2.675 c
+2.109 -2.433 1.999 -2.098 1.992 -1.675 c
+h
+2.477 -1.631 m
+2.477 -1.947 2.535 -2.19 2.653 -2.366 c
+2.778 -2.535 2.94 -2.616 3.138 -2.616 c
+3.568 -2.616 3.792 -2.308 3.815 -1.691 c
+3.815 -1.352 l
+3.815 -1.051 3.748 -0.808 3.624 -0.632 c
+3.506 -0.455 3.344 -0.367 3.138 -0.367 c
+2.94 -0.367 2.778 -0.455 2.653 -0.632 c
+2.535 -0.808 2.477 -1.051 2.477 -1.352 c
+h
+5.373 0.721 m
+5.373 0 l
+5.828 0 l
+5.828 -0.397 l
+5.373 -0.397 l
+5.373 -2.248 l
+5.373 -2.366 5.39 -2.454 5.431 -2.514 c
+5.468 -2.572 5.538 -2.601 5.637 -2.601 c
+5.696 -2.601 5.758 -2.595 5.828 -2.572 c
+5.828 -2.984 l
+5.71 -3.021 5.596 -3.042 5.49 -3.042 c
+5.292 -3.042 5.141 -2.977 5.035 -2.836 c
+4.935 -2.701 4.887 -2.506 4.887 -2.248 c
+4.887 -0.397 l
+4.432 -0.397 l
+4.432 0 l
+4.887 0 l
+4.887 0.721 l
+h
+7.349 -3.042 m
+6.975 -3.042 6.691 -2.936 6.497 -2.719 c
+6.298 -2.495 6.203 -2.167 6.203 -1.735 c
+6.203 -1.367 l
+6.203 -0.926 6.294 -0.58 6.483 -0.324 c
+6.677 -0.07 6.953 0.059 7.306 0.059 c
+7.647 0.059 7.9 -0.055 8.07 -0.279 c
+8.247 -0.507 8.338 -0.852 8.349 -1.323 c
+8.349 -1.631 l
+6.688 -1.631 l
+6.688 -1.705 l
+6.688 -2.028 6.747 -2.263 6.865 -2.41 c
+6.982 -2.55 7.151 -2.616 7.379 -2.616 c
+7.526 -2.616 7.651 -2.595 7.761 -2.543 c
+7.867 -2.484 7.971 -2.396 8.07 -2.278 c
+8.32 -2.587 l
+8.114 -2.892 7.79 -3.042 7.349 -3.042 c
+7.306 -0.367 m
+7.1 -0.367 6.945 -0.437 6.85 -0.573 c
+6.751 -0.713 6.695 -0.926 6.688 -1.22 c
+7.864 -1.22 l
+7.864 -1.147 l
+7.842 -0.874 7.79 -0.676 7.703 -0.559 c
+7.614 -0.434 7.482 -0.367 7.306 -0.367 c
+11.406 -2.219 m
+11.406 -2.113 11.366 -2.024 11.289 -1.955 c
+11.208 -1.878 11.057 -1.789 10.834 -1.691 c
+10.568 -1.583 10.381 -1.492 10.275 -1.411 c
+10.165 -1.334 10.088 -1.246 10.04 -1.147 c
+9.988 -1.051 9.966 -0.933 9.966 -0.794 c
+9.966 -0.551 10.055 -0.349 10.231 -0.191 c
+10.406 -0.025 10.631 0.059 10.907 0.059 c
+11.2 0.059 11.436 -0.029 11.612 -0.206 c
+11.788 -0.374 11.877 -0.588 11.877 -0.852 c
+11.391 -0.852 l
+11.391 -0.716 11.341 -0.602 11.245 -0.515 c
+11.156 -0.419 11.042 -0.367 10.907 -0.367 c
+10.76 -0.367 10.645 -0.407 10.568 -0.484 c
+10.487 -0.555 10.451 -0.654 10.451 -0.779 c
+10.451 -0.878 10.481 -0.955 10.539 -1.014 c
+10.598 -1.072 10.738 -1.153 10.965 -1.249 c
+11.326 -1.396 11.572 -1.539 11.701 -1.675 c
+11.836 -1.804 11.906 -1.977 11.906 -2.19 c
+11.906 -2.447 11.811 -2.653 11.627 -2.807 c
+11.451 -2.965 11.216 -3.042 10.921 -3.042 c
+10.605 -3.042 10.352 -2.954 10.157 -2.778 c
+9.97 -2.595 9.878 -2.362 9.878 -2.088 c
+10.363 -2.088 l
+10.37 -2.256 10.422 -2.389 10.51 -2.484 c
+10.605 -2.572 10.745 -2.616 10.921 -2.616 c
+11.075 -2.616 11.193 -2.583 11.274 -2.514 c
+11.362 -2.447 11.406 -2.348 11.406 -2.219 c
+12.259 -1.352 m
+12.259 -0.922 12.362 -0.58 12.567 -0.324 c
+12.781 -0.07 13.06 0.059 13.406 0.059 c
+13.747 0.059 14.023 -0.07 14.229 -0.324 c
+14.442 -0.569 14.556 -0.904 14.566 -1.323 c
+14.566 -1.631 l
+14.566 -2.065 14.456 -2.406 14.244 -2.66 c
+14.038 -2.917 13.758 -3.042 13.406 -3.042 c
+13.06 -3.042 12.788 -2.921 12.582 -2.675 c
+12.376 -2.433 12.266 -2.098 12.259 -1.675 c
+h
+12.744 -1.631 m
+12.744 -1.947 12.803 -2.19 12.92 -2.366 c
+13.045 -2.535 13.207 -2.616 13.406 -2.616 c
+13.835 -2.616 14.059 -2.308 14.082 -1.691 c
+14.082 -1.352 l
+14.082 -1.051 14.015 -0.808 13.891 -0.632 c
+13.773 -0.455 13.612 -0.367 13.406 -0.367 c
+13.207 -0.367 13.045 -0.455 12.92 -0.632 c
+12.803 -0.808 12.744 -1.051 12.744 -1.352 c
+h
+16.742 -2.984 -0.5 2.984 re
+16.772 0.794 m
+16.772 0.706 16.746 0.632 16.698 0.574 c
+16.658 0.522 16.588 0.5 16.492 0.5 c
+16.405 0.5 16.334 0.522 16.286 0.574 c
+16.247 0.632 16.228 0.698 16.228 0.779 c
+16.228 0.867 16.247 0.941 16.286 1 c
+16.334 1.058 16.405 1.087 16.492 1.087 c
+16.588 1.087 16.658 1.058 16.698 1 c
+16.746 0.941 16.772 0.871 16.772 0.794 c
+18.047 0.721 m
+18.047 0 l
+18.502 0 l
+18.502 -0.397 l
+18.047 -0.397 l
+18.047 -2.248 l
+18.047 -2.366 18.065 -2.454 18.105 -2.514 c
+18.142 -2.572 18.212 -2.601 18.311 -2.601 c
+18.37 -2.601 18.433 -2.595 18.502 -2.572 c
+18.502 -2.984 l
+18.385 -3.021 18.271 -3.042 18.165 -3.042 c
+17.966 -3.042 17.816 -2.977 17.708 -2.836 c
+17.61 -2.701 17.562 -2.506 17.562 -2.248 c
+17.562 -0.397 l
+17.106 -0.397 l
+17.106 0 l
+17.562 0 l
+17.562 0.721 l
+h
+19.293 0.941 m
+19.248 -0.073 l
+18.881 -0.073 l
+18.896 1.249 l
+19.293 1.249 l
+h
+21.119 -2.219 m
+21.119 -2.113 21.078 -2.024 21.001 -1.955 c
+20.92 -1.878 20.77 -1.789 20.546 -1.691 c
+20.281 -1.583 20.093 -1.492 19.987 -1.411 c
+19.877 -1.334 19.8 -1.246 19.752 -1.147 c
+19.7 -1.051 19.678 -0.933 19.678 -0.794 c
+19.678 -0.551 19.767 -0.349 19.943 -0.191 c
+20.12 -0.025 20.344 0.059 20.619 0.059 c
+20.913 0.059 21.148 -0.029 21.325 -0.206 c
+21.501 -0.374 21.589 -0.588 21.589 -0.852 c
+21.105 -0.852 l
+21.105 -0.716 21.053 -0.602 20.957 -0.515 c
+20.869 -0.419 20.755 -0.367 20.619 -0.367 c
+20.472 -0.367 20.359 -0.407 20.281 -0.484 c
+20.201 -0.555 20.164 -0.654 20.164 -0.779 c
+20.164 -0.878 20.193 -0.955 20.251 -1.014 c
+20.311 -1.072 20.45 -1.153 20.677 -1.249 c
+21.038 -1.396 21.284 -1.539 21.413 -1.675 c
+21.549 -1.804 21.618 -1.977 21.618 -2.19 c
+21.618 -2.447 21.523 -2.653 21.34 -2.807 c
+21.163 -2.965 20.928 -3.042 20.634 -3.042 c
+20.318 -3.042 20.064 -2.954 19.869 -2.778 c
+19.682 -2.595 19.59 -2.362 19.59 -2.088 c
+20.075 -2.088 l
+20.083 -2.256 20.134 -2.389 20.222 -2.484 c
+20.318 -2.572 20.457 -2.616 20.634 -2.616 c
+20.788 -2.616 20.906 -2.583 20.987 -2.514 c
+21.074 -2.447 21.119 -2.348 21.119 -2.219 c
+25.425 -1.631 m
+25.425 -2.102 25.342 -2.454 25.176 -2.69 c
+25.007 -2.925 24.768 -3.042 24.455 -3.042 c
+24.151 -3.042 23.919 -2.932 23.765 -2.705 c
+23.765 -4.13 l
+23.28 -4.13 l
+23.28 0 l
+23.721 0 l
+23.75 -0.338 l
+23.904 -0.073 24.136 0.059 24.44 0.059 c
+24.772 0.059 25.018 -0.058 25.176 -0.294 c
+25.342 -0.521 25.425 -0.86 25.425 -1.308 c
+h
+24.941 -1.352 m
+24.941 -1.022 24.885 -0.775 24.779 -0.617 c
+24.679 -0.463 24.518 -0.382 24.294 -0.382 c
+24.058 -0.382 23.883 -0.5 23.765 -0.735 c
+23.765 -2.278 l
+23.883 -2.506 24.062 -2.616 24.309 -2.616 c
+24.521 -2.616 24.679 -2.539 24.779 -2.381 c
+24.885 -2.227 24.941 -1.984 24.941 -1.66 c
+h
+27.12 -0.455 m
+27.05 -0.448 26.977 -0.441 26.9 -0.441 c
+26.642 -0.441 26.466 -0.58 26.37 -0.852 c
+26.37 -2.984 l
+25.885 -2.984 l
+25.885 0 l
+26.356 0 l
+26.37 -0.309 l
+26.495 -0.066 26.678 0.059 26.914 0.059 c
+26.991 0.059 27.054 0.044 27.105 0.015 c
+h
+27.333 -1.352 m
+27.333 -0.922 27.436 -0.58 27.642 -0.324 c
+27.854 -0.07 28.134 0.059 28.479 0.059 c
+28.821 0.059 29.097 -0.07 29.302 -0.324 c
+29.516 -0.569 29.63 -0.904 29.641 -1.323 c
+29.641 -1.631 l
+29.641 -2.065 29.531 -2.406 29.317 -2.66 c
+29.111 -2.917 28.832 -3.042 28.479 -3.042 c
+28.134 -3.042 27.862 -2.921 27.656 -2.675 c
+27.451 -2.433 27.34 -2.098 27.333 -1.675 c
+h
+27.818 -1.631 m
+27.818 -1.947 27.877 -2.19 27.995 -2.366 c
+28.12 -2.535 28.281 -2.616 28.479 -2.616 c
+28.909 -2.616 29.134 -2.308 29.155 -1.691 c
+29.155 -1.352 l
+29.155 -1.051 29.09 -0.808 28.964 -0.632 c
+28.847 -0.455 28.685 -0.367 28.479 -0.367 c
+28.281 -0.367 28.12 -0.455 27.995 -0.632 c
+27.877 -0.808 27.818 -1.051 27.818 -1.352 c
+h
+32.242 -1.631 m
+32.242 -2.102 32.158 -2.454 31.993 -2.69 c
+31.823 -2.925 31.581 -3.042 31.258 -3.042 c
+30.942 -3.042 30.707 -2.907 30.552 -2.631 c
+30.522 -2.984 l
+30.082 -2.984 l
+30.082 1.249 l
+30.567 1.249 l
+30.567 -0.324 l
+30.721 -0.07 30.952 0.059 31.258 0.059 c
+31.581 0.059 31.823 -0.058 31.993 -0.294 c
+32.158 -0.529 32.242 -0.878 32.242 -1.338 c
+h
+31.757 -1.352 m
+31.757 -0.999 31.706 -0.75 31.611 -0.602 c
+31.511 -0.455 31.349 -0.382 31.125 -0.382 c
+30.879 -0.382 30.692 -0.521 30.567 -0.794 c
+30.567 -2.205 l
+30.684 -2.469 30.875 -2.601 31.14 -2.601 c
+31.353 -2.601 31.511 -2.528 31.611 -2.381 c
+31.706 -2.227 31.757 -1.984 31.757 -1.66 c
+h
+34.212 -2.984 m
+34.183 -2.917 34.16 -2.807 34.154 -2.66 c
+33.977 -2.917 33.757 -3.042 33.492 -3.042 c
+33.217 -3.042 32.999 -2.969 32.845 -2.822 c
+32.698 -2.668 32.625 -2.451 32.625 -2.175 c
+32.625 -1.874 32.727 -1.631 32.933 -1.455 c
+33.139 -1.271 33.422 -1.176 33.786 -1.176 c
+34.138 -1.176 l
+34.138 -0.852 l
+34.138 -0.676 34.098 -0.555 34.021 -0.484 c
+33.94 -0.407 33.822 -0.367 33.668 -0.367 c
+33.521 -0.367 33.396 -0.411 33.3 -0.5 c
+33.213 -0.588 33.169 -0.698 33.169 -0.823 c
+32.683 -0.823 l
+32.683 -0.676 32.727 -0.536 32.816 -0.397 c
+32.904 -0.249 33.022 -0.139 33.169 -0.058 c
+33.323 0.019 33.495 0.059 33.683 0.059 c
+33.996 0.059 34.231 -0.022 34.389 -0.176 c
+34.543 -0.324 34.624 -0.544 34.624 -0.837 c
+34.624 -2.337 l
+34.631 -2.572 34.668 -2.774 34.726 -2.94 c
+34.726 -2.984 l
+h
+33.566 -2.601 m
+33.683 -2.601 33.793 -2.568 33.903 -2.499 c
+34.01 -2.433 34.087 -2.348 34.138 -2.248 c
+34.138 -1.543 l
+33.874 -1.543 l
+33.639 -1.543 33.452 -1.595 33.315 -1.691 c
+33.186 -1.789 33.124 -1.932 33.124 -2.117 c
+33.124 -2.285 33.154 -2.406 33.213 -2.484 c
+33.279 -2.564 33.396 -2.601 33.566 -2.601 c
+37.365 -1.631 m
+37.365 -2.102 37.281 -2.454 37.115 -2.69 c
+36.946 -2.925 36.704 -3.042 36.38 -3.042 c
+36.064 -3.042 35.829 -2.907 35.675 -2.631 c
+35.646 -2.984 l
+35.204 -2.984 l
+35.204 1.249 l
+35.69 1.249 l
+35.69 -0.324 l
+35.844 -0.07 36.075 0.059 36.38 0.059 c
+36.704 0.059 36.946 -0.058 37.115 -0.294 c
+37.281 -0.529 37.365 -0.878 37.365 -1.338 c
+h
+36.88 -1.352 m
+36.88 -0.999 36.828 -0.75 36.733 -0.602 c
+36.633 -0.455 36.472 -0.382 36.248 -0.382 c
+36.002 -0.382 35.814 -0.521 35.69 -0.794 c
+35.69 -2.205 l
+35.806 -2.469 35.998 -2.601 36.263 -2.601 c
+36.475 -2.601 36.633 -2.528 36.733 -2.381 c
+36.828 -2.227 36.88 -1.984 36.88 -1.66 c
+h
+38.339 -2.984 -0.5 4.233 re
+39.82 -2.175 m
+40.363 0 l
+40.878 0 l
+39.908 -3.41 l
+39.838 -3.663 39.735 -3.854 39.599 -3.983 c
+39.459 -4.119 39.309 -4.189 39.143 -4.189 c
+39.074 -4.189 38.989 -4.174 38.894 -4.145 c
+38.894 -3.734 l
+38.996 -3.748 l
+39.133 -3.748 39.239 -3.711 39.32 -3.645 c
+39.409 -3.576 39.474 -3.458 39.526 -3.293 c
+39.614 -2.954 l
+38.747 0 l
+39.276 0 l
+h
+43.935 -2.984 m
+43.906 -2.917 43.884 -2.807 43.877 -2.66 c
+43.7 -2.917 43.48 -3.042 43.216 -3.042 c
+42.94 -3.042 42.723 -2.969 42.568 -2.822 c
+42.422 -2.668 42.348 -2.451 42.348 -2.175 c
+42.348 -1.874 42.451 -1.631 42.657 -1.455 c
+42.862 -1.271 43.145 -1.176 43.509 -1.176 c
+43.862 -1.176 l
+43.862 -0.852 l
+43.862 -0.676 43.822 -0.555 43.744 -0.484 c
+43.663 -0.407 43.546 -0.367 43.392 -0.367 c
+43.245 -0.367 43.12 -0.411 43.024 -0.5 c
+42.936 -0.588 42.892 -0.698 42.892 -0.823 c
+42.407 -0.823 l
+42.407 -0.676 42.451 -0.536 42.539 -0.397 c
+42.627 -0.249 42.745 -0.139 42.892 -0.058 c
+43.046 0.019 43.219 0.059 43.407 0.059 c
+43.719 0.059 43.954 -0.022 44.112 -0.176 c
+44.266 -0.324 44.347 -0.544 44.347 -0.837 c
+44.347 -2.337 l
+44.354 -2.572 44.392 -2.774 44.45 -2.94 c
+44.45 -2.984 l
+h
+43.289 -2.601 m
+43.407 -2.601 43.517 -2.568 43.627 -2.499 c
+43.733 -2.433 43.81 -2.348 43.862 -2.248 c
+43.862 -1.543 l
+43.598 -1.543 l
+43.362 -1.543 43.175 -1.595 43.039 -1.691 c
+42.91 -1.789 42.848 -1.932 42.848 -2.117 c
+42.848 -2.285 42.877 -2.406 42.936 -2.484 c
+43.002 -2.564 43.12 -2.601 43.289 -2.601 c
+47.368 -0.455 m
+47.298 -0.448 47.224 -0.441 47.147 -0.441 c
+46.89 -0.441 46.713 -0.58 46.618 -0.852 c
+46.618 -2.984 l
+46.133 -2.984 l
+46.133 0 l
+46.603 0 l
+46.618 -0.309 l
+46.743 -0.066 46.927 0.059 47.162 0.059 c
+47.239 0.059 47.301 0.044 47.353 0.015 c
+h
+48.745 -3.042 m
+48.371 -3.042 48.088 -2.936 47.893 -2.719 c
+47.695 -2.495 47.6 -2.167 47.6 -1.735 c
+47.6 -1.367 l
+47.6 -0.926 47.691 -0.58 47.879 -0.324 c
+48.074 -0.07 48.349 0.059 48.702 0.059 c
+49.044 0.059 49.297 -0.055 49.466 -0.279 c
+49.643 -0.507 49.734 -0.852 49.745 -1.323 c
+49.745 -1.631 l
+48.084 -1.631 l
+48.084 -1.705 l
+48.084 -2.028 48.143 -2.263 48.261 -2.41 c
+48.379 -2.55 48.547 -2.616 48.775 -2.616 c
+48.922 -2.616 49.047 -2.595 49.157 -2.543 c
+49.264 -2.484 49.367 -2.396 49.466 -2.278 c
+49.716 -2.587 l
+49.51 -2.892 49.187 -3.042 48.745 -3.042 c
+48.702 -0.367 m
+48.496 -0.367 48.342 -0.437 48.246 -0.573 c
+48.147 -0.713 48.092 -0.926 48.084 -1.22 c
+49.26 -1.22 l
+49.26 -1.147 l
+49.238 -0.874 49.187 -0.676 49.098 -0.559 c
+49.011 -0.434 48.878 -0.367 48.702 -0.367 c
+50.362 -2.984 m
+50.362 -0.397 l
+49.981 -0.397 l
+49.981 0 l
+50.362 0 l
+50.362 0.339 l
+50.37 0.64 50.451 0.875 50.598 1.044 c
+50.744 1.22 50.954 1.309 51.23 1.309 c
+51.326 1.309 51.425 1.294 51.524 1.264 c
+51.494 0.852 l
+51.425 0.86 51.351 0.867 51.274 0.867 c
+50.998 0.867 50.862 0.669 50.862 0.279 c
+50.862 0 l
+51.363 0 l
+51.363 -0.397 l
+50.862 -0.397 l
+50.862 -2.984 l
+h
+52.821 -3.042 m
+52.446 -3.042 52.163 -2.936 51.968 -2.719 c
+51.77 -2.495 51.675 -2.167 51.675 -1.735 c
+51.675 -1.367 l
+51.675 -0.926 51.766 -0.58 51.954 -0.324 c
+52.149 -0.07 52.425 0.059 52.777 0.059 c
+53.119 0.059 53.372 -0.055 53.541 -0.279 c
+53.718 -0.507 53.809 -0.852 53.821 -1.323 c
+53.821 -1.631 l
+52.159 -1.631 l
+52.159 -1.705 l
+52.159 -2.028 52.219 -2.263 52.336 -2.41 c
+52.454 -2.55 52.623 -2.616 52.851 -2.616 c
+52.997 -2.616 53.123 -2.595 53.233 -2.543 c
+53.339 -2.484 53.443 -2.396 53.541 -2.278 c
+53.791 -2.587 l
+53.585 -2.892 53.262 -3.042 52.821 -3.042 c
+52.777 -0.367 m
+52.571 -0.367 52.417 -0.437 52.321 -0.573 c
+52.222 -0.713 52.167 -0.926 52.159 -1.22 c
+53.335 -1.22 l
+53.335 -1.147 l
+53.314 -0.874 53.262 -0.676 53.173 -0.559 c
+53.086 -0.434 52.953 -0.367 52.777 -0.367 c
+55.467 -0.455 m
+55.397 -0.448 55.324 -0.441 55.247 -0.441 c
+54.989 -0.441 54.813 -0.58 54.717 -0.852 c
+54.717 -2.984 l
+54.232 -2.984 l
+54.232 0 l
+54.702 0 l
+54.717 -0.309 l
+54.842 -0.066 55.026 0.059 55.261 0.059 c
+55.338 0.059 55.401 0.044 55.452 0.015 c
+h
+56.841 -3.042 m
+56.466 -3.042 56.184 -2.936 55.989 -2.719 c
+55.791 -2.495 55.695 -2.167 55.695 -1.735 c
+55.695 -1.367 l
+55.695 -0.926 55.787 -0.58 55.974 -0.324 c
+56.169 -0.07 56.444 0.059 56.797 0.059 c
+57.139 0.059 57.393 -0.055 57.562 -0.279 c
+57.738 -0.507 57.83 -0.852 57.84 -1.323 c
+57.84 -1.631 l
+56.18 -1.631 l
+56.18 -1.705 l
+56.18 -2.028 56.238 -2.263 56.356 -2.41 c
+56.474 -2.55 56.643 -2.616 56.871 -2.616 c
+57.017 -2.616 57.142 -2.595 57.252 -2.543 c
+57.36 -2.484 57.462 -2.396 57.562 -2.278 c
+57.811 -2.587 l
+57.605 -2.892 57.283 -3.042 56.841 -3.042 c
+56.797 -0.367 m
+56.591 -0.367 56.437 -0.437 56.342 -0.573 c
+56.242 -0.713 56.188 -0.926 56.18 -1.22 c
+57.356 -1.22 l
+57.356 -1.147 l
+57.333 -0.874 57.283 -0.676 57.194 -0.559 c
+57.106 -0.434 56.973 -0.367 56.797 -0.367 c
+58.708 0 m
+58.723 -0.324 l
+58.906 -0.07 59.149 0.059 59.443 0.059 c
+59.972 0.059 60.24 -0.294 60.252 -0.999 c
+60.252 -2.984 l
+59.766 -2.984 l
+59.766 -1.029 l
+59.766 -0.794 59.726 -0.628 59.649 -0.529 c
+59.568 -0.434 59.45 -0.382 59.296 -0.382 c
+59.178 -0.382 59.068 -0.422 58.973 -0.5 c
+58.873 -0.58 58.796 -0.687 58.738 -0.823 c
+58.738 -2.984 l
+58.252 -2.984 l
+58.252 0 l
+h
+61.835 -2.616 m
+62 -2.616 62.133 -2.568 62.232 -2.469 c
+62.328 -2.373 62.382 -2.23 62.394 -2.043 c
+62.85 -2.043 l
+62.839 -2.329 62.736 -2.568 62.54 -2.763 c
+62.353 -2.95 62.118 -3.042 61.835 -3.042 c
+61.472 -3.042 61.192 -2.925 60.998 -2.69 c
+60.799 -2.454 60.703 -2.109 60.703 -1.646 c
+60.703 -1.323 l
+60.703 -0.874 60.795 -0.529 60.982 -0.294 c
+61.177 -0.058 61.46 0.059 61.835 0.059 c
+62.137 0.059 62.379 -0.04 62.555 -0.235 c
+62.739 -0.434 62.839 -0.698 62.85 -1.029 c
+62.394 -1.029 l
+62.372 -0.804 62.313 -0.639 62.218 -0.529 c
+62.129 -0.422 62 -0.367 61.835 -0.367 c
+61.618 -0.367 61.457 -0.441 61.35 -0.588 c
+61.251 -0.727 61.196 -0.955 61.189 -1.278 c
+61.189 -1.66 l
+61.189 -2.013 61.236 -2.263 61.335 -2.41 c
+61.442 -2.55 61.607 -2.616 61.835 -2.616 c
+64.301 -3.042 m
+63.926 -3.042 63.643 -2.936 63.448 -2.719 c
+63.25 -2.495 63.155 -2.167 63.155 -1.735 c
+63.155 -1.367 l
+63.155 -0.926 63.246 -0.58 63.434 -0.324 c
+63.629 -0.07 63.904 0.059 64.257 0.059 c
+64.599 0.059 64.853 -0.055 65.021 -0.279 c
+65.198 -0.507 65.289 -0.852 65.301 -1.323 c
+65.301 -1.631 l
+63.639 -1.631 l
+63.639 -1.705 l
+63.639 -2.028 63.698 -2.263 63.816 -2.41 c
+63.934 -2.55 64.103 -2.616 64.331 -2.616 c
+64.477 -2.616 64.602 -2.595 64.713 -2.543 c
+64.819 -2.484 64.922 -2.396 65.021 -2.278 c
+65.271 -2.587 l
+65.065 -2.892 64.742 -3.042 64.301 -3.042 c
+64.257 -0.367 m
+64.051 -0.367 63.897 -0.437 63.801 -0.573 c
+63.702 -0.713 63.647 -0.926 63.639 -1.22 c
+64.815 -1.22 l
+64.815 -1.147 l
+64.793 -0.874 64.742 -0.676 64.654 -0.559 c
+64.566 -0.434 64.433 -0.367 64.257 -0.367 c
+65.713 -3.777 m
+65.418 -3.586 l
+65.595 -3.341 65.686 -3.09 65.697 -2.836 c
+65.697 -2.381 l
+66.197 -2.381 l
+66.197 -2.778 l
+66.197 -2.965 66.145 -3.149 66.05 -3.337 c
+65.962 -3.52 65.848 -3.667 65.713 -3.777 c
+f
+Q
+q 1 0 0 1 492.43 131.4251 cm
+0 0 m
+0.014 -0.324 l
+0.198 -0.07 0.441 0.059 0.735 0.059 c
+1.264 0.059 1.533 -0.294 1.543 -0.999 c
+1.543 -2.984 l
+1.058 -2.984 l
+1.058 -1.029 l
+1.058 -0.794 1.018 -0.628 0.941 -0.529 c
+0.86 -0.434 0.742 -0.382 0.588 -0.382 c
+0.47 -0.382 0.36 -0.422 0.264 -0.5 c
+0.166 -0.58 0.088 -0.687 0.029 -0.823 c
+0.029 -2.984 l
+-0.456 -2.984 l
+-0.456 0 l
+h
+1.995 -1.352 m
+1.995 -0.922 2.098 -0.58 2.304 -0.324 c
+2.517 -0.07 2.796 0.059 3.142 0.059 c
+3.484 0.059 3.759 -0.07 3.965 -0.324 c
+4.178 -0.569 4.292 -0.904 4.303 -1.323 c
+4.303 -1.631 l
+4.303 -2.065 4.193 -2.406 3.979 -2.66 c
+3.774 -2.917 3.495 -3.042 3.142 -3.042 c
+2.796 -3.042 2.524 -2.921 2.319 -2.675 c
+2.113 -2.433 2.003 -2.098 1.995 -1.675 c
+h
+2.481 -1.631 m
+2.481 -1.947 2.539 -2.19 2.657 -2.366 c
+2.782 -2.535 2.944 -2.616 3.142 -2.616 c
+3.572 -2.616 3.796 -2.308 3.818 -1.691 c
+3.818 -1.352 l
+3.818 -1.051 3.752 -0.808 3.627 -0.632 c
+3.509 -0.455 3.347 -0.367 3.142 -0.367 c
+2.944 -0.367 2.782 -0.455 2.657 -0.632 c
+2.539 -0.808 2.481 -1.051 2.481 -1.352 c
+h
+5.373 0.721 m
+5.373 0 l
+5.828 0 l
+5.828 -0.397 l
+5.373 -0.397 l
+5.373 -2.248 l
+5.373 -2.366 5.39 -2.454 5.431 -2.514 c
+5.468 -2.572 5.538 -2.601 5.637 -2.601 c
+5.696 -2.601 5.758 -2.595 5.828 -2.572 c
+5.828 -2.984 l
+5.71 -3.021 5.596 -3.042 5.49 -3.042 c
+5.292 -3.042 5.141 -2.977 5.034 -2.836 c
+4.935 -2.701 4.887 -2.506 4.887 -2.248 c
+4.887 -0.397 l
+4.432 -0.397 l
+4.432 0 l
+4.887 0 l
+4.887 0.721 l
+h
+9.028 -2.984 m
+8.999 -2.917 8.978 -2.807 8.97 -2.66 c
+8.793 -2.917 8.573 -3.042 8.309 -3.042 c
+8.033 -3.042 7.816 -2.969 7.661 -2.822 c
+7.515 -2.668 7.441 -2.451 7.441 -2.175 c
+7.441 -1.874 7.544 -1.631 7.75 -1.455 c
+7.956 -1.271 8.239 -1.176 8.602 -1.176 c
+8.955 -1.176 l
+8.955 -0.852 l
+8.955 -0.676 8.914 -0.555 8.837 -0.484 c
+8.756 -0.407 8.639 -0.367 8.485 -0.367 c
+8.338 -0.367 8.213 -0.411 8.118 -0.5 c
+8.029 -0.588 7.985 -0.698 7.985 -0.823 c
+7.5 -0.823 l
+7.5 -0.676 7.544 -0.536 7.632 -0.397 c
+7.721 -0.249 7.838 -0.139 7.985 -0.058 c
+8.139 0.019 8.312 0.059 8.5 0.059 c
+8.812 0.059 9.047 -0.022 9.205 -0.176 c
+9.359 -0.324 9.44 -0.544 9.44 -0.837 c
+9.44 -2.337 l
+9.448 -2.572 9.485 -2.774 9.543 -2.94 c
+9.543 -2.984 l
+h
+8.382 -2.601 m
+8.5 -2.601 8.61 -2.568 8.72 -2.499 c
+8.827 -2.433 8.904 -2.348 8.955 -2.248 c
+8.955 -1.543 l
+8.691 -1.543 l
+8.455 -1.543 8.268 -1.595 8.132 -1.691 c
+8.004 -1.789 7.941 -1.932 7.941 -2.117 c
+7.941 -2.285 7.97 -2.406 8.029 -2.484 c
+8.095 -2.564 8.213 -2.601 8.382 -2.601 c
+10.477 0 m
+10.491 -0.324 l
+10.675 -0.07 10.917 0.059 11.212 0.059 c
+11.74 0.059 12.009 -0.294 12.02 -0.999 c
+12.02 -2.984 l
+11.535 -2.984 l
+11.535 -1.029 l
+11.535 -0.794 11.495 -0.628 11.418 -0.529 c
+11.337 -0.434 11.219 -0.382 11.065 -0.382 c
+10.947 -0.382 10.836 -0.422 10.741 -0.5 c
+10.642 -0.58 10.564 -0.687 10.506 -0.823 c
+10.506 -2.984 l
+10.021 -2.984 l
+10.021 0 l
+h
+13.674 -1.352 m
+13.674 -0.922 13.776 -0.58 13.982 -0.324 c
+14.196 -0.07 14.475 0.059 14.82 0.059 c
+15.162 0.059 15.438 -0.07 15.644 -0.324 c
+15.856 -0.569 15.97 -0.904 15.981 -1.323 c
+15.981 -1.631 l
+15.981 -2.065 15.871 -2.406 15.658 -2.66 c
+15.453 -2.917 15.173 -3.042 14.82 -3.042 c
+14.475 -3.042 14.202 -2.921 13.997 -2.675 c
+13.791 -2.433 13.681 -2.098 13.674 -1.675 c
+h
+14.159 -1.631 m
+14.159 -1.947 14.217 -2.19 14.335 -2.366 c
+14.46 -2.535 14.622 -2.616 14.82 -2.616 c
+15.25 -2.616 15.474 -2.308 15.496 -1.691 c
+15.496 -1.352 l
+15.496 -1.051 15.43 -0.808 15.305 -0.632 c
+15.187 -0.455 15.025 -0.367 14.82 -0.367 c
+14.622 -0.367 14.46 -0.455 14.335 -0.632 c
+14.217 -0.808 14.159 -1.051 14.159 -1.352 c
+h
+18.58 -1.631 m
+18.58 -2.102 18.495 -2.454 18.329 -2.69 c
+18.161 -2.925 17.918 -3.042 17.595 -3.042 c
+17.279 -3.042 17.043 -2.907 16.889 -2.631 c
+16.86 -2.984 l
+16.419 -2.984 l
+16.419 1.249 l
+16.904 1.249 l
+16.904 -0.324 l
+17.058 -0.07 17.29 0.059 17.595 0.059 c
+17.918 0.059 18.161 -0.058 18.329 -0.294 c
+18.495 -0.529 18.58 -0.878 18.58 -1.338 c
+h
+18.094 -1.352 m
+18.094 -0.999 18.042 -0.75 17.947 -0.602 c
+17.848 -0.455 17.687 -0.382 17.462 -0.382 c
+17.216 -0.382 17.028 -0.521 16.904 -0.794 c
+16.904 -2.205 l
+17.022 -2.469 17.213 -2.601 17.477 -2.601 c
+17.691 -2.601 17.848 -2.528 17.947 -2.381 c
+18.042 -2.227 18.094 -1.984 18.094 -1.66 c
+h
+19.524 0 m
+19.524 -3.366 l
+19.513 -3.913 19.293 -4.189 18.863 -4.189 c
+18.763 -4.189 18.675 -4.174 18.597 -4.145 c
+18.597 -3.734 l
+18.649 -3.74 18.708 -3.748 18.788 -3.748 c
+18.867 -3.748 18.925 -3.719 18.965 -3.659 c
+19.013 -3.601 19.039 -3.491 19.039 -3.337 c
+19.039 0 l
+h
+19.538 0.794 m
+19.538 0.706 19.513 0.632 19.465 0.574 c
+19.424 0.522 19.355 0.5 19.259 0.5 c
+19.171 0.5 19.102 0.522 19.054 0.574 c
+19.013 0.632 18.994 0.698 18.994 0.779 c
+18.994 0.867 19.013 0.941 19.054 1 c
+19.102 1.058 19.171 1.087 19.259 1.087 c
+19.355 1.087 19.424 1.058 19.465 1 c
+19.513 0.941 19.538 0.871 19.538 0.794 c
+21.265 -3.042 m
+20.891 -3.042 20.608 -2.936 20.413 -2.719 c
+20.215 -2.495 20.12 -2.167 20.12 -1.735 c
+20.12 -1.367 l
+20.12 -0.926 20.211 -0.58 20.398 -0.324 c
+20.593 -0.07 20.868 0.059 21.221 0.059 c
+21.564 0.059 21.817 -0.055 21.986 -0.279 c
+22.162 -0.507 22.254 -0.852 22.265 -1.323 c
+22.265 -1.631 l
+20.604 -1.631 l
+20.604 -1.705 l
+20.604 -2.028 20.663 -2.263 20.781 -2.41 c
+20.899 -2.55 21.067 -2.616 21.296 -2.616 c
+21.442 -2.616 21.567 -2.595 21.677 -2.543 c
+21.784 -2.484 21.886 -2.396 21.986 -2.278 c
+22.236 -2.587 l
+22.03 -2.892 21.707 -3.042 21.265 -3.042 c
+21.221 -0.367 m
+21.016 -0.367 20.862 -0.437 20.766 -0.573 c
+20.667 -0.713 20.612 -0.926 20.604 -1.22 c
+21.78 -1.22 l
+21.78 -1.147 l
+21.758 -0.874 21.707 -0.676 21.618 -0.559 c
+21.531 -0.434 21.398 -0.367 21.221 -0.367 c
+23.706 -2.616 m
+23.871 -2.616 24.003 -2.568 24.103 -2.469 c
+24.198 -2.373 24.253 -2.23 24.264 -2.043 c
+24.72 -2.043 l
+24.709 -2.329 24.606 -2.568 24.411 -2.763 c
+24.224 -2.95 23.989 -3.042 23.706 -3.042 c
+23.342 -3.042 23.062 -2.925 22.867 -2.69 c
+22.669 -2.454 22.574 -2.109 22.574 -1.646 c
+22.574 -1.323 l
+22.574 -0.874 22.666 -0.529 22.853 -0.294 c
+23.048 -0.058 23.331 0.059 23.706 0.059 c
+24.007 0.059 24.249 -0.04 24.426 -0.235 c
+24.61 -0.434 24.709 -0.698 24.72 -1.029 c
+24.264 -1.029 l
+24.242 -0.804 24.184 -0.639 24.088 -0.529 c
+24 -0.422 23.871 -0.367 23.706 -0.367 c
+23.489 -0.367 23.327 -0.441 23.22 -0.588 c
+23.121 -0.727 23.066 -0.955 23.059 -1.278 c
+23.059 -1.66 l
+23.059 -2.013 23.106 -2.263 23.206 -2.41 c
+23.312 -2.55 23.478 -2.616 23.706 -2.616 c
+25.745 0.721 m
+25.745 0 l
+26.201 0 l
+26.201 -0.397 l
+25.745 -0.397 l
+25.745 -2.248 l
+25.745 -2.366 25.764 -2.454 25.804 -2.514 c
+25.841 -2.572 25.911 -2.601 26.01 -2.601 c
+26.069 -2.601 26.131 -2.595 26.201 -2.572 c
+26.201 -2.984 l
+26.083 -3.021 25.969 -3.042 25.863 -3.042 c
+25.664 -3.042 25.514 -2.977 25.408 -2.836 c
+25.308 -2.701 25.26 -2.506 25.26 -2.248 c
+25.26 -0.397 l
+24.804 -0.397 l
+24.804 0 l
+25.26 0 l
+25.26 0.721 l
+h
+26.697 -2.719 m
+26.697 -2.631 26.719 -2.558 26.771 -2.499 c
+26.829 -2.44 26.906 -2.41 27.006 -2.41 c
+27.112 -2.41 27.189 -2.44 27.241 -2.499 c
+27.299 -2.558 27.329 -2.631 27.329 -2.719 c
+27.329 -2.8 27.299 -2.866 27.241 -2.925 c
+27.189 -2.984 27.112 -3.013 27.006 -3.013 c
+26.906 -3.013 26.829 -2.984 26.771 -2.925 c
+26.719 -2.866 26.697 -2.8 26.697 -2.719 c
+f
+Q
+0.567 w 1 j 1 J
+q 1 0 0 1 522.4669 140.1895 cm
+0 0 m
+6.928 0.754 l
+S
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 527.2745 140.7116 cm
+0 0 m
+-0.949 -1.176 l
+2.649 0.291 l
+-1.177 0.948 l
+h
+f*
+Q
+0.906 0.785 0.617 0.969 K
+0.283 w 0 j 0 J
+q 1 0 0 1 527.2745 140.7116 cm
+0 0 m
+-0.949 -1.176 l
+2.649 0.291 l
+-1.177 0.948 l
+0 0 l
+h
+S
+Q
+ endstream endobj 21 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 28 0 obj <</BBox[198.027 568.502 444.988 526.485]/Group 63 0 R/Length 127/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>/Shading<</Sh0 64 0 R>>>>/Subtype/Form>>stream
+q
+198.027 568.502 246.962 -42.017 re
+W n
+q
+0 g
+/GS0 gs
+246.9619598 0 0 246.9619598 198.026535 547.4932861 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 29 0 obj <</BBox[589.44 293.423 621.568 278.07]/Group 65 0 R/Length 293/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 592.6808 293.4232 cm
+0 0 m
+25.646 0 l
+27.443 0 28.887 -1.448 28.887 -3.241 c
+28.887 -12.112 l
+28.887 -13.909 27.443 -15.353 25.646 -15.353 c
+0 -15.353 l
+-1.793 -15.353 -3.241 -13.909 -3.241 -12.112 c
+-3.241 -3.241 l
+-3.241 -1.448 -1.793 0 0 0 c
+f
+Q
+ endstream endobj 30 0 obj <</BBox[738.029 266.921 763.227 262.629]/Group 66 0 R/Length 5754/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 740.4832 263.5406 cm
+0 0 m
+0.456 2.131 l
+0.941 2.131 l
+0.206 -0.853 l
+-0.176 -0.853 l
+-0.764 1.278 l
+-1.337 -0.853 l
+-1.72 -0.853 l
+-2.454 2.131 l
+-1.969 2.131 l
+-1.499 0.058 l
+-0.955 2.131 l
+-0.573 2.131 l
+h
+1.69 1.822 m
+1.875 2.065 2.11 2.19 2.396 2.19 c
+2.926 2.19 3.194 1.837 3.205 1.132 c
+3.205 -0.853 l
+2.72 -0.853 l
+2.72 1.103 l
+2.72 1.338 2.679 1.502 2.602 1.602 c
+2.521 1.697 2.404 1.749 2.249 1.749 c
+2.132 1.749 2.022 1.708 1.926 1.631 c
+1.827 1.55 1.75 1.444 1.69 1.308 c
+1.69 -0.853 l
+1.206 -0.853 l
+1.206 3.38 l
+1.69 3.38 l
+h
+5.278 -0.853 m
+5.248 -0.786 5.226 -0.676 5.218 -0.53 c
+5.042 -0.786 4.822 -0.912 4.557 -0.912 c
+4.281 -0.912 4.065 -0.838 3.911 -0.691 c
+3.763 -0.537 3.69 -0.32 3.69 -0.044 c
+3.69 0.257 3.793 0.5 3.998 0.675 c
+4.204 0.86 4.487 0.955 4.851 0.955 c
+5.204 0.955 l
+5.204 1.278 l
+5.204 1.455 5.164 1.577 5.087 1.646 c
+5.006 1.723 4.888 1.764 4.734 1.764 c
+4.587 1.764 4.462 1.72 4.366 1.631 c
+4.278 1.543 4.233 1.433 4.233 1.308 c
+3.749 1.308 l
+3.749 1.455 3.793 1.595 3.881 1.734 c
+3.969 1.881 4.087 1.992 4.233 2.072 c
+4.388 2.15 4.561 2.19 4.748 2.19 c
+5.06 2.19 5.295 2.109 5.453 1.955 c
+5.608 1.808 5.689 1.587 5.689 1.294 c
+5.689 -0.206 l
+5.696 -0.441 5.733 -0.643 5.792 -0.809 c
+5.792 -0.853 l
+h
+4.63 -0.47 m
+4.748 -0.47 4.859 -0.437 4.969 -0.368 c
+5.075 -0.302 5.152 -0.217 5.204 -0.118 c
+5.204 0.588 l
+4.939 0.588 l
+4.704 0.588 4.516 0.536 4.381 0.44 c
+4.252 0.341 4.19 0.198 4.19 0.014 c
+4.19 -0.154 4.219 -0.276 4.278 -0.353 c
+4.344 -0.434 4.462 -0.47 4.63 -0.47 c
+6.901 2.851 m
+6.901 2.131 l
+7.357 2.131 l
+7.357 1.734 l
+6.901 1.734 l
+6.901 -0.118 l
+6.901 -0.235 6.92 -0.324 6.961 -0.383 c
+6.997 -0.441 7.067 -0.47 7.167 -0.47 c
+7.225 -0.47 7.288 -0.463 7.357 -0.441 c
+7.357 -0.853 l
+7.24 -0.89 7.126 -0.912 7.019 -0.912 c
+6.82 -0.912 6.67 -0.846 6.564 -0.706 c
+6.465 -0.57 6.417 -0.375 6.417 -0.118 c
+6.417 1.734 l
+5.961 1.734 l
+5.961 2.131 l
+6.417 2.131 l
+6.417 2.851 l
+h
+9.658 2.851 m
+9.658 2.131 l
+10.113 2.131 l
+10.113 1.734 l
+9.658 1.734 l
+9.658 -0.118 l
+9.658 -0.235 9.676 -0.324 9.717 -0.383 c
+9.754 -0.441 9.823 -0.47 9.922 -0.47 c
+9.981 -0.47 10.043 -0.463 10.113 -0.441 c
+10.113 -0.853 l
+9.996 -0.89 9.881 -0.912 9.775 -0.912 c
+9.577 -0.912 9.426 -0.846 9.32 -0.706 c
+9.22 -0.57 9.172 -0.375 9.172 -0.118 c
+9.172 1.734 l
+8.717 1.734 l
+8.717 2.131 l
+9.172 2.131 l
+9.172 2.851 l
+h
+10.426 0.779 m
+10.426 1.209 10.529 1.55 10.735 1.808 c
+10.947 2.061 11.227 2.19 11.572 2.19 c
+11.914 2.19 12.19 2.061 12.395 1.808 c
+12.609 1.562 12.723 1.227 12.734 0.808 c
+12.734 0.5 l
+12.734 0.066 12.623 -0.276 12.41 -0.53 c
+12.204 -0.786 11.925 -0.912 11.572 -0.912 c
+11.227 -0.912 10.955 -0.79 10.749 -0.544 c
+10.544 -0.302 10.433 0.033 10.426 0.455 c
+h
+10.911 0.5 m
+10.911 0.183 10.97 -0.059 11.088 -0.235 c
+11.212 -0.405 11.373 -0.485 11.572 -0.485 c
+12.002 -0.485 12.227 -0.177 12.248 0.44 c
+12.248 0.779 l
+12.248 1.08 12.183 1.323 12.057 1.499 c
+11.94 1.675 11.778 1.764 11.572 1.764 c
+11.373 1.764 11.212 1.675 11.088 1.499 c
+10.97 1.323 10.911 1.08 10.911 0.779 c
+h
+15.905 -0.853 m
+15.876 -0.786 15.853 -0.676 15.846 -0.53 c
+15.67 -0.786 15.449 -0.912 15.184 -0.912 c
+14.909 -0.912 14.692 -0.838 14.538 -0.691 c
+14.39 -0.537 14.317 -0.32 14.317 -0.044 c
+14.317 0.257 14.421 0.5 14.626 0.675 c
+14.832 0.86 15.115 0.955 15.479 0.955 c
+15.832 0.955 l
+15.832 1.278 l
+15.832 1.455 15.791 1.577 15.714 1.646 c
+15.633 1.723 15.516 1.764 15.361 1.764 c
+15.214 1.764 15.089 1.72 14.993 1.631 c
+14.905 1.543 14.861 1.433 14.861 1.308 c
+14.376 1.308 l
+14.376 1.455 14.421 1.595 14.508 1.734 c
+14.596 1.881 14.714 1.992 14.861 2.072 c
+15.015 2.15 15.188 2.19 15.375 2.19 c
+15.688 2.19 15.923 2.109 16.081 1.955 c
+16.235 1.808 16.316 1.587 16.316 1.294 c
+16.316 -0.206 l
+16.324 -0.441 16.36 -0.643 16.42 -0.809 c
+16.42 -0.853 l
+h
+15.258 -0.47 m
+15.375 -0.47 15.485 -0.437 15.596 -0.368 c
+15.703 -0.302 15.78 -0.217 15.832 -0.118 c
+15.832 0.588 l
+15.566 0.588 l
+15.331 0.588 15.144 0.536 15.009 0.44 c
+14.88 0.341 14.817 0.198 14.817 0.014 c
+14.817 -0.154 14.847 -0.276 14.905 -0.353 c
+14.972 -0.434 15.089 -0.47 15.258 -0.47 c
+16.794 0.779 m
+16.794 1.238 16.875 1.587 17.044 1.822 c
+17.22 2.065 17.47 2.19 17.794 2.19 c
+18.076 2.19 18.297 2.072 18.455 1.837 c
+18.455 3.38 l
+18.94 3.38 l
+18.94 -0.853 l
+18.5 -0.853 l
+18.47 -0.53 l
+18.311 -0.786 18.088 -0.912 17.794 -0.912 c
+17.478 -0.912 17.235 -0.794 17.058 -0.559 c
+16.882 -0.316 16.794 0.029 16.794 0.47 c
+h
+17.279 0.5 m
+17.279 0.166 17.326 -0.081 17.426 -0.235 c
+17.522 -0.393 17.683 -0.47 17.912 -0.47 c
+18.153 -0.47 18.338 -0.353 18.455 -0.118 c
+18.455 1.396 l
+18.327 1.631 18.147 1.749 17.912 1.749 c
+17.683 1.749 17.522 1.668 17.426 1.514 c
+17.326 1.356 17.279 1.117 17.279 0.793 c
+h
+19.41 0.779 m
+19.41 1.238 19.491 1.587 19.66 1.822 c
+19.836 2.065 20.087 2.19 20.41 2.19 c
+20.693 2.19 20.914 2.072 21.072 1.837 c
+21.072 3.38 l
+21.557 3.38 l
+21.557 -0.853 l
+21.116 -0.853 l
+21.087 -0.53 l
+20.929 -0.786 20.704 -0.912 20.41 -0.912 c
+20.094 -0.912 19.851 -0.794 19.676 -0.559 c
+19.499 -0.316 19.41 0.029 19.41 0.47 c
+h
+19.896 0.5 m
+19.896 0.166 19.944 -0.081 20.042 -0.235 c
+20.138 -0.393 20.3 -0.47 20.528 -0.47 c
+20.771 -0.47 20.954 -0.353 21.072 -0.118 c
+21.072 1.396 l
+20.943 1.631 20.763 1.749 20.528 1.749 c
+20.3 1.749 20.138 1.668 20.042 1.514 c
+19.944 1.356 19.896 1.117 19.896 0.793 c
+h
+22.67 0.279 m
+22.229 0.279 l
+22.2 3.16 l
+22.714 3.16 l
+h
+22.464 -0.309 m
+22.56 -0.309 22.629 -0.339 22.67 -0.397 c
+22.718 -0.449 22.743 -0.515 22.743 -0.603 c
+22.743 -0.684 22.718 -0.75 22.67 -0.809 c
+22.629 -0.856 22.56 -0.882 22.464 -0.882 c
+22.376 -0.882 22.306 -0.856 22.259 -0.809 c
+22.207 -0.75 22.185 -0.684 22.185 -0.603 c
+22.185 -0.515 22.207 -0.449 22.259 -0.397 c
+22.306 -0.339 22.376 -0.309 22.464 -0.309 c
+f
+Q
+ endstream endobj 31 0 obj <</BBox[580.256 333.713 630.219 328.304]/Group 67 0 R/Length 12062/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 582.8727 330.7593 cm
+0 0 m
+-0.029 -0.434 -0.154 -0.765 -0.367 -1 c
+-0.584 -1.228 -0.893 -1.338 -1.294 -1.338 c
+-1.697 -1.338 -2.021 -1.187 -2.263 -0.882 c
+-2.499 -0.57 -2.616 -0.154 -2.616 0.367 c
+-2.616 1.103 l
+-2.616 1.621 -2.495 2.032 -2.248 2.337 c
+-2.006 2.639 -1.672 2.793 -1.249 2.793 c
+-0.866 2.793 -0.569 2.675 -0.353 2.44 c
+-0.139 2.205 -0.022 1.87 0 1.44 c
+-0.514 1.44 l
+-0.536 1.771 -0.602 2.007 -0.72 2.146 c
+-0.837 2.282 -1.014 2.352 -1.249 2.352 c
+-1.525 2.352 -1.734 2.242 -1.881 2.028 c
+-2.028 1.812 -2.102 1.5 -2.102 1.087 c
+-2.102 0.353 l
+-2.102 -0.052 -2.036 -0.36 -1.896 -0.574 c
+-1.76 -0.79 -1.558 -0.897 -1.294 -0.897 c
+-1.028 -0.897 -0.845 -0.834 -0.735 -0.706 c
+-0.617 -0.58 -0.544 -0.345 -0.514 0 c
+h
+0.882 1.396 m
+1.066 1.639 1.301 1.764 1.588 1.764 c
+2.117 1.764 2.386 1.411 2.396 0.706 c
+2.396 -1.279 l
+1.912 -1.279 l
+1.912 0.676 l
+1.912 0.912 1.871 1.076 1.794 1.176 c
+1.713 1.271 1.595 1.323 1.441 1.323 c
+1.324 1.323 1.213 1.282 1.118 1.205 c
+1.018 1.124 0.941 1.018 0.882 0.881 c
+0.882 -1.279 l
+0.397 -1.279 l
+0.397 2.954 l
+0.882 2.954 l
+h
+4.466 -1.279 m
+4.436 -1.213 4.414 -1.103 4.406 -0.956 c
+4.23 -1.213 4.009 -1.338 3.745 -1.338 c
+3.469 -1.338 3.252 -1.264 3.098 -1.118 c
+2.951 -0.963 2.878 -0.746 2.878 -0.47 c
+2.878 -0.169 2.98 0.073 3.186 0.249 c
+3.392 0.434 3.675 0.529 4.039 0.529 c
+4.391 0.529 l
+4.391 0.852 l
+4.391 1.029 4.351 1.151 4.274 1.22 c
+4.193 1.297 4.075 1.338 3.921 1.338 c
+3.774 1.338 3.649 1.294 3.554 1.205 c
+3.466 1.117 3.421 1.007 3.421 0.881 c
+2.937 0.881 l
+2.937 1.029 2.98 1.168 3.069 1.308 c
+3.157 1.455 3.275 1.565 3.421 1.646 c
+3.576 1.723 3.749 1.764 3.936 1.764 c
+4.248 1.764 4.484 1.683 4.642 1.529 c
+4.796 1.382 4.877 1.161 4.877 0.867 c
+4.877 -0.632 l
+4.884 -0.867 4.921 -1.07 4.979 -1.235 c
+4.979 -1.279 l
+h
+3.818 -0.897 m
+3.936 -0.897 4.046 -0.864 4.156 -0.794 c
+4.263 -0.728 4.341 -0.643 4.391 -0.544 c
+4.391 0.162 l
+4.127 0.162 l
+3.892 0.162 3.705 0.11 3.568 0.014 c
+3.44 -0.085 3.377 -0.228 3.377 -0.412 c
+3.377 -0.58 3.407 -0.702 3.466 -0.779 c
+3.531 -0.86 3.649 -0.897 3.818 -0.897 c
+5.913 1.705 m
+5.928 1.382 l
+6.112 1.635 6.354 1.764 6.648 1.764 c
+7.177 1.764 7.446 1.411 7.456 0.706 c
+7.456 -1.279 l
+6.972 -1.279 l
+6.972 0.676 l
+6.972 0.912 6.931 1.076 6.854 1.176 c
+6.773 1.271 6.656 1.323 6.501 1.323 c
+6.384 1.323 6.273 1.282 6.178 1.205 c
+6.078 1.124 6.001 1.018 5.943 0.881 c
+5.943 -1.279 l
+5.457 -1.279 l
+5.457 1.705 l
+h
+7.909 0.353 m
+7.909 0.812 7.99 1.161 8.158 1.396 c
+8.335 1.639 8.584 1.764 8.908 1.764 c
+9.209 1.764 9.441 1.631 9.599 1.367 c
+9.628 1.705 l
+10.07 1.705 l
+10.07 -1.309 l
+10.07 -1.679 9.97 -1.962 9.775 -2.161 c
+9.588 -2.356 9.327 -2.455 8.996 -2.455 c
+8.849 -2.455 8.68 -2.415 8.497 -2.338 c
+8.309 -2.267 8.173 -2.18 8.085 -2.072 c
+8.276 -1.735 l
+8.482 -1.941 8.706 -2.043 8.952 -2.043 c
+9.353 -2.043 9.559 -1.816 9.569 -1.367 c
+9.569 -0.985 l
+9.411 -1.22 9.191 -1.338 8.908 -1.338 c
+8.592 -1.338 8.349 -1.22 8.173 -0.985 c
+8.004 -0.75 7.916 -0.419 7.909 0.014 c
+h
+8.393 0.073 m
+8.393 -0.261 8.441 -0.507 8.541 -0.661 c
+8.636 -0.819 8.798 -0.897 9.025 -0.897 c
+9.268 -0.897 9.452 -0.775 9.569 -0.53 c
+9.569 0.955 l
+9.452 1.198 9.276 1.323 9.04 1.323 c
+8.813 1.323 8.651 1.242 8.555 1.087 c
+8.456 0.929 8.401 0.69 8.393 0.367 c
+h
+11.66 -1.338 m
+11.286 -1.338 11.003 -1.231 10.808 -1.014 c
+10.61 -0.79 10.514 -0.463 10.514 -0.029 c
+10.514 0.338 l
+10.514 0.779 10.606 1.124 10.793 1.382 c
+10.988 1.635 11.263 1.764 11.616 1.764 c
+11.958 1.764 12.212 1.65 12.381 1.425 c
+12.557 1.198 12.649 0.852 12.659 0.382 c
+12.659 0.073 l
+10.999 0.073 l
+10.999 0 l
+10.999 -0.324 11.057 -0.559 11.175 -0.706 c
+11.293 -0.846 11.462 -0.912 11.69 -0.912 c
+11.836 -0.912 11.961 -0.889 12.072 -0.838 c
+12.179 -0.779 12.281 -0.691 12.381 -0.574 c
+12.63 -0.882 l
+12.424 -1.187 12.102 -1.338 11.66 -1.338 c
+11.616 1.338 m
+11.41 1.338 11.256 1.268 11.161 1.132 c
+11.061 0.992 11.007 0.779 10.999 0.484 c
+12.175 0.484 l
+12.175 0.559 l
+12.152 0.831 12.102 1.029 12.013 1.147 c
+11.925 1.271 11.793 1.338 11.616 1.338 c
+14.512 -0.515 m
+14.512 -0.408 14.471 -0.32 14.394 -0.25 c
+14.313 -0.173 14.163 -0.085 13.939 0.014 c
+13.675 0.121 13.486 0.213 13.38 0.293 c
+13.27 0.371 13.193 0.459 13.145 0.559 c
+13.093 0.654 13.072 0.771 13.072 0.912 c
+13.072 1.153 13.16 1.356 13.336 1.514 c
+13.513 1.679 13.737 1.764 14.012 1.764 c
+14.306 1.764 14.541 1.675 14.718 1.5 c
+14.894 1.33 14.982 1.117 14.982 0.852 c
+14.498 0.852 l
+14.498 0.989 14.446 1.103 14.35 1.19 c
+14.263 1.286 14.148 1.338 14.012 1.338 c
+13.866 1.338 13.752 1.297 13.675 1.22 c
+13.594 1.151 13.557 1.051 13.557 0.926 c
+13.557 0.827 13.586 0.75 13.644 0.69 c
+13.704 0.632 13.843 0.551 14.071 0.455 c
+14.431 0.309 14.677 0.166 14.806 0.029 c
+14.942 -0.1 15.011 -0.272 15.011 -0.485 c
+15.011 -0.742 14.916 -0.948 14.733 -1.103 c
+14.556 -1.261 14.321 -1.338 14.027 -1.338 c
+13.711 -1.338 13.457 -1.249 13.263 -1.073 c
+13.075 -0.889 12.983 -0.658 12.983 -0.382 c
+13.469 -0.382 l
+13.476 -0.551 13.527 -0.684 13.615 -0.779 c
+13.711 -0.867 13.85 -0.912 14.027 -0.912 c
+14.182 -0.912 14.299 -0.879 14.38 -0.809 c
+14.468 -0.742 14.512 -0.643 14.512 -0.515 c
+17.702 -0.912 m
+17.867 -0.912 17.999 -0.864 18.099 -0.765 c
+18.194 -0.669 18.249 -0.526 18.261 -0.339 c
+18.716 -0.339 l
+18.705 -0.625 18.602 -0.864 18.407 -1.058 c
+18.22 -1.246 17.985 -1.338 17.702 -1.338 c
+17.338 -1.338 17.058 -1.22 16.864 -0.985 c
+16.665 -0.75 16.57 -0.405 16.57 0.058 c
+16.57 0.382 l
+16.57 0.831 16.661 1.176 16.85 1.411 c
+17.044 1.646 17.326 1.764 17.702 1.764 c
+18.003 1.764 18.246 1.664 18.422 1.469 c
+18.606 1.271 18.705 1.007 18.716 0.676 c
+18.261 0.676 l
+18.238 0.9 18.18 1.066 18.084 1.176 c
+17.995 1.282 17.867 1.338 17.702 1.338 c
+17.485 1.338 17.324 1.264 17.216 1.117 c
+17.118 0.977 17.062 0.75 17.055 0.426 c
+17.055 0.044 l
+17.055 -0.309 17.103 -0.559 17.202 -0.706 c
+17.309 -0.846 17.474 -0.912 17.702 -0.912 c
+19.009 0.353 m
+19.009 0.783 19.113 1.124 19.319 1.382 c
+19.532 1.635 19.811 1.764 20.156 1.764 c
+20.498 1.764 20.773 1.635 20.979 1.382 c
+21.193 1.135 21.307 0.801 21.318 0.382 c
+21.318 0.073 l
+21.318 -0.36 21.207 -0.702 20.995 -0.956 c
+20.788 -1.213 20.509 -1.338 20.156 -1.338 c
+19.811 -1.338 19.539 -1.216 19.333 -0.97 c
+19.127 -0.728 19.017 -0.393 19.009 0.029 c
+h
+19.495 0.073 m
+19.495 -0.243 19.554 -0.485 19.672 -0.661 c
+19.796 -0.831 19.958 -0.912 20.156 -0.912 c
+20.586 -0.912 20.811 -0.603 20.833 0.014 c
+20.833 0.353 l
+20.833 0.654 20.767 0.897 20.642 1.072 c
+20.524 1.249 20.362 1.338 20.156 1.338 c
+19.958 1.338 19.796 1.249 19.672 1.072 c
+19.554 0.897 19.495 0.654 19.495 0.353 c
+h
+22.215 1.705 m
+22.229 1.425 l
+22.406 1.65 22.645 1.764 22.949 1.764 c
+23.28 1.764 23.512 1.617 23.64 1.323 c
+23.824 1.617 24.085 1.764 24.419 1.764 c
+24.978 1.764 25.261 1.419 25.272 0.735 c
+25.272 -1.279 l
+24.787 -1.279 l
+24.787 0.69 l
+24.787 0.904 24.746 1.062 24.669 1.161 c
+24.588 1.268 24.456 1.323 24.272 1.323 c
+24.125 1.323 24.008 1.264 23.919 1.147 c
+23.831 1.036 23.776 0.897 23.757 0.72 c
+23.757 -1.279 l
+23.273 -1.279 l
+23.273 0.706 l
+23.262 1.117 23.089 1.323 22.758 1.323 c
+22.512 1.323 22.34 1.198 22.244 0.955 c
+22.244 -1.279 l
+21.758 -1.279 l
+21.758 1.705 l
+h
+26.176 1.705 m
+26.19 1.425 l
+26.367 1.65 26.606 1.764 26.911 1.764 c
+27.241 1.764 27.473 1.617 27.601 1.323 c
+27.786 1.617 28.046 1.764 28.38 1.764 c
+28.939 1.764 29.222 1.419 29.233 0.735 c
+29.233 -1.279 l
+28.748 -1.279 l
+28.748 0.69 l
+28.748 0.904 28.708 1.062 28.63 1.161 c
+28.549 1.268 28.417 1.323 28.233 1.323 c
+28.087 1.323 27.969 1.264 27.881 1.147 c
+27.792 1.036 27.738 0.897 27.719 0.72 c
+27.719 -1.279 l
+27.234 -1.279 l
+27.234 0.706 l
+27.223 1.117 27.05 1.323 26.72 1.323 c
+26.473 1.323 26.3 1.198 26.205 0.955 c
+26.205 -1.279 l
+25.72 -1.279 l
+25.72 1.705 l
+h
+30.211 -1.279 -0.5 2.984 re
+30.24 2.499 m
+30.24 2.41 30.215 2.337 30.167 2.278 c
+30.126 2.227 30.057 2.205 29.961 2.205 c
+29.872 2.205 29.803 2.227 29.755 2.278 c
+29.714 2.337 29.696 2.404 29.696 2.484 c
+29.696 2.572 29.714 2.645 29.755 2.705 c
+29.803 2.763 29.872 2.793 29.961 2.793 c
+30.057 2.793 30.126 2.763 30.167 2.705 c
+30.215 2.645 30.24 2.576 30.24 2.499 c
+31.515 2.425 m
+31.515 1.705 l
+31.971 1.705 l
+31.971 1.308 l
+31.515 1.308 l
+31.515 -0.544 l
+31.515 -0.661 31.534 -0.75 31.574 -0.809 c
+31.611 -0.867 31.68 -0.897 31.78 -0.897 c
+31.838 -0.897 31.901 -0.889 31.971 -0.867 c
+31.971 -1.279 l
+31.853 -1.316 31.74 -1.338 31.632 -1.338 c
+31.435 -1.338 31.283 -1.272 31.177 -1.132 c
+31.078 -0.996 31.03 -0.802 31.03 -0.544 c
+31.03 1.308 l
+30.574 1.308 l
+30.574 1.705 l
+31.03 1.705 l
+31.03 2.425 l
+h
+33.496 -1.338 m
+33.121 -1.338 32.838 -1.231 32.644 -1.014 c
+32.445 -0.79 32.349 -0.463 32.349 -0.029 c
+32.349 0.338 l
+32.349 0.779 32.441 1.124 32.629 1.382 c
+32.823 1.635 33.099 1.764 33.452 1.764 c
+33.793 1.764 34.047 1.65 34.217 1.425 c
+34.392 1.198 34.485 0.852 34.495 0.382 c
+34.495 0.073 l
+32.835 0.073 l
+32.835 0 l
+32.835 -0.324 32.893 -0.559 33.01 -0.706 c
+33.128 -0.846 33.297 -0.912 33.525 -0.912 c
+33.672 -0.912 33.797 -0.889 33.907 -0.838 c
+34.014 -0.779 34.117 -0.691 34.217 -0.574 c
+34.466 -0.882 l
+34.26 -1.187 33.937 -1.338 33.496 -1.338 c
+33.452 1.338 m
+33.246 1.338 33.091 1.268 32.996 1.132 c
+32.897 0.992 32.842 0.779 32.835 0.484 c
+34.011 0.484 l
+34.011 0.559 l
+33.988 0.831 33.937 1.029 33.849 1.147 c
+33.76 1.271 33.629 1.338 33.452 1.338 c
+34.805 0.353 m
+34.805 0.812 34.884 1.161 35.054 1.396 c
+35.231 1.639 35.48 1.764 35.804 1.764 c
+36.087 1.764 36.307 1.646 36.465 1.411 c
+36.465 2.954 l
+36.95 2.954 l
+36.95 -1.279 l
+36.509 -1.279 l
+36.48 -0.956 l
+36.322 -1.213 36.098 -1.338 35.804 -1.338 c
+35.487 -1.338 35.245 -1.22 35.069 -0.985 c
+34.892 -0.742 34.805 -0.397 34.805 0.044 c
+h
+35.289 0.073 m
+35.289 -0.261 35.337 -0.507 35.436 -0.661 c
+35.532 -0.819 35.694 -0.897 35.921 -0.897 c
+36.164 -0.897 36.347 -0.779 36.465 -0.544 c
+36.465 0.97 l
+36.336 1.205 36.156 1.323 35.921 1.323 c
+35.694 1.323 35.532 1.242 35.436 1.087 c
+35.337 0.929 35.289 0.69 35.289 0.367 c
+h
+39.21 1.396 m
+39.393 1.639 39.629 1.764 39.916 1.764 c
+40.445 1.764 40.713 1.411 40.724 0.706 c
+40.724 -1.279 l
+40.239 -1.279 l
+40.239 0.676 l
+40.239 0.912 40.199 1.076 40.122 1.176 c
+40.041 1.271 39.923 1.323 39.769 1.323 c
+39.651 1.323 39.541 1.282 39.445 1.205 c
+39.346 1.124 39.269 1.018 39.21 0.881 c
+39.21 -1.279 l
+38.726 -1.279 l
+38.726 2.954 l
+39.21 2.954 l
+h
+42.323 -1.338 m
+41.948 -1.338 41.664 -1.231 41.47 -1.014 c
+41.272 -0.79 41.176 -0.463 41.176 -0.029 c
+41.176 0.338 l
+41.176 0.779 41.268 1.124 41.456 1.382 c
+41.65 1.635 41.926 1.764 42.279 1.764 c
+42.62 1.764 42.874 1.65 43.043 1.425 c
+43.219 1.198 43.311 0.852 43.322 0.382 c
+43.322 0.073 l
+41.662 0.073 l
+41.662 0 l
+41.662 -0.324 41.72 -0.559 41.837 -0.706 c
+41.955 -0.846 42.124 -0.912 42.352 -0.912 c
+42.499 -0.912 42.624 -0.889 42.734 -0.838 c
+42.84 -0.779 42.944 -0.691 43.043 -0.574 c
+43.293 -0.882 l
+43.087 -1.187 42.763 -1.338 42.323 -1.338 c
+42.279 1.338 m
+42.073 1.338 41.918 1.268 41.822 1.132 c
+41.724 0.992 41.668 0.779 41.662 0.484 c
+42.838 0.484 l
+42.838 0.559 l
+42.815 0.831 42.763 1.029 42.676 1.147 c
+42.587 1.271 42.455 1.338 42.279 1.338 c
+44.968 1.249 m
+44.899 1.257 44.825 1.264 44.748 1.264 c
+44.49 1.264 44.314 1.124 44.218 0.852 c
+44.218 -1.279 l
+43.734 -1.279 l
+43.734 1.705 l
+44.204 1.705 l
+44.218 1.396 l
+44.344 1.639 44.527 1.764 44.762 1.764 c
+44.84 1.764 44.902 1.749 44.954 1.72 c
+h
+46.346 -1.338 m
+45.972 -1.338 45.689 -1.231 45.494 -1.014 c
+45.296 -0.79 45.2 -0.463 45.2 -0.029 c
+45.2 0.338 l
+45.2 0.779 45.292 1.124 45.479 1.382 c
+45.674 1.635 45.949 1.764 46.302 1.764 c
+46.644 1.764 46.898 1.65 47.067 1.425 c
+47.243 1.198 47.335 0.852 47.346 0.382 c
+47.346 0.073 l
+45.685 0.073 l
+45.685 0 l
+45.685 -0.324 45.743 -0.559 45.861 -0.706 c
+45.979 -0.846 46.148 -0.912 46.376 -0.912 c
+46.523 -0.912 46.647 -0.889 46.758 -0.838 c
+46.865 -0.779 46.967 -0.691 47.067 -0.574 c
+47.316 -0.882 l
+47.111 -1.187 46.788 -1.338 46.346 -1.338 c
+46.302 1.338 m
+46.096 1.338 45.942 1.268 45.847 1.132 c
+45.747 0.992 45.693 0.779 45.685 0.484 c
+46.861 0.484 l
+46.861 0.559 l
+46.838 0.831 46.788 1.029 46.699 1.147 c
+46.611 1.271 46.479 1.338 46.302 1.338 c
+f
+Q
+ endstream endobj 32 0 obj <</BBox[592.773 327.187 617.18 322.836]/Group 68 0 R/Length 5562/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 595.2274 323.7479 cm
+0 0 m
+0.456 2.131 l
+0.941 2.131 l
+0.206 -0.853 l
+-0.176 -0.853 l
+-0.764 1.278 l
+-1.338 -0.853 l
+-1.72 -0.853 l
+-2.454 2.131 l
+-1.97 2.131 l
+-1.5 0.058 l
+-0.955 2.131 l
+-0.573 2.131 l
+h
+1.735 -0.853 -0.5 2.984 re
+1.764 2.925 m
+1.764 2.836 1.738 2.763 1.69 2.705 c
+1.65 2.653 1.58 2.631 1.484 2.631 c
+1.397 2.631 1.326 2.653 1.279 2.705 c
+1.239 2.763 1.22 2.83 1.22 2.91 c
+1.22 2.998 1.239 3.072 1.279 3.131 c
+1.326 3.189 1.397 3.219 1.484 3.219 c
+1.58 3.219 1.65 3.189 1.69 3.131 c
+1.738 3.072 1.764 3.002 1.764 2.925 c
+2.94 -0.853 -0.5 4.233 re
+4.145 -0.853 -0.5 4.233 re
+8.183 0.5 m
+8.183 0.029 8.1 -0.324 7.934 -0.559 c
+7.765 -0.794 7.522 -0.912 7.199 -0.912 c
+6.883 -0.912 6.648 -0.775 6.494 -0.5 c
+6.464 -0.853 l
+6.024 -0.853 l
+6.024 3.38 l
+6.508 3.38 l
+6.508 1.808 l
+6.662 2.061 6.894 2.19 7.199 2.19 c
+7.522 2.19 7.765 2.072 7.934 1.837 c
+8.1 1.602 8.183 1.253 8.183 0.793 c
+h
+7.699 0.779 m
+7.699 1.132 7.647 1.381 7.552 1.529 c
+7.453 1.675 7.291 1.749 7.067 1.749 c
+6.82 1.749 6.633 1.61 6.508 1.338 c
+6.508 -0.073 l
+6.626 -0.339 6.817 -0.47 7.082 -0.47 c
+7.294 -0.47 7.453 -0.397 7.552 -0.25 c
+7.647 -0.096 7.699 0.147 7.699 0.47 c
+h
+9.683 -0.912 m
+9.309 -0.912 9.025 -0.805 8.831 -0.588 c
+8.632 -0.364 8.536 -0.037 8.536 0.397 c
+8.536 0.764 l
+8.536 1.205 8.628 1.55 8.816 1.808 c
+9.01 2.061 9.286 2.19 9.639 2.19 c
+9.981 2.19 10.234 2.076 10.404 1.851 c
+10.58 1.624 10.672 1.278 10.683 0.808 c
+10.683 0.5 l
+9.022 0.5 l
+9.022 0.426 l
+9.022 0.103 9.081 -0.133 9.199 -0.279 c
+9.316 -0.42 9.484 -0.485 9.712 -0.485 c
+9.86 -0.485 9.985 -0.463 10.095 -0.412 c
+10.201 -0.353 10.304 -0.265 10.404 -0.148 c
+10.653 -0.456 l
+10.448 -0.761 10.124 -0.912 9.683 -0.912 c
+9.639 1.764 m
+9.434 1.764 9.279 1.694 9.183 1.558 c
+9.084 1.419 9.029 1.205 9.022 0.911 c
+10.198 0.911 l
+10.198 0.985 l
+10.176 1.257 10.124 1.455 10.036 1.573 c
+9.947 1.697 9.816 1.764 9.639 1.764 c
+13.74 -0.088 m
+13.74 0.018 13.7 0.106 13.623 0.176 c
+13.542 0.253 13.391 0.342 13.167 0.44 c
+12.902 0.548 12.715 0.639 12.609 0.72 c
+12.498 0.797 12.421 0.885 12.374 0.985 c
+12.322 1.08 12.299 1.198 12.299 1.338 c
+12.299 1.579 12.388 1.782 12.565 1.94 c
+12.74 2.105 12.965 2.19 13.24 2.19 c
+13.534 2.19 13.77 2.102 13.945 1.926 c
+14.122 1.756 14.211 1.543 14.211 1.278 c
+13.725 1.278 l
+13.725 1.415 13.674 1.529 13.579 1.616 c
+13.49 1.712 13.376 1.764 13.24 1.764 c
+13.093 1.764 12.979 1.723 12.902 1.646 c
+12.821 1.577 12.785 1.477 12.785 1.352 c
+12.785 1.253 12.814 1.176 12.873 1.117 c
+12.931 1.058 13.072 0.977 13.299 0.881 c
+13.66 0.735 13.906 0.592 14.034 0.455 c
+14.17 0.326 14.24 0.154 14.24 -0.059 c
+14.24 -0.316 14.144 -0.522 13.961 -0.676 c
+13.785 -0.834 13.549 -0.912 13.255 -0.912 c
+12.939 -0.912 12.686 -0.823 12.491 -0.647 c
+12.303 -0.463 12.212 -0.231 12.212 0.044 c
+12.696 0.044 l
+12.704 -0.125 12.755 -0.258 12.844 -0.353 c
+12.939 -0.441 13.079 -0.485 13.255 -0.485 c
+13.409 -0.485 13.527 -0.452 13.608 -0.383 c
+13.696 -0.316 13.74 -0.217 13.74 -0.088 c
+16.224 -0.853 m
+16.195 -0.786 16.173 -0.676 16.166 -0.53 c
+15.989 -0.786 15.769 -0.912 15.504 -0.912 c
+15.229 -0.912 15.011 -0.838 14.857 -0.691 c
+14.71 -0.537 14.637 -0.32 14.637 -0.044 c
+14.637 0.257 14.739 0.5 14.945 0.675 c
+15.152 0.86 15.434 0.955 15.798 0.955 c
+16.151 0.955 l
+16.151 1.278 l
+16.151 1.455 16.11 1.577 16.033 1.646 c
+15.952 1.723 15.834 1.764 15.68 1.764 c
+15.534 1.764 15.408 1.72 15.313 1.631 c
+15.225 1.543 15.181 1.433 15.181 1.308 c
+14.695 1.308 l
+14.695 1.455 14.739 1.595 14.828 1.734 c
+14.916 1.882 15.034 1.992 15.181 2.072 c
+15.335 2.15 15.508 2.19 15.695 2.19 c
+16.008 2.19 16.243 2.109 16.401 1.955 c
+16.555 1.808 16.636 1.587 16.636 1.294 c
+16.636 -0.206 l
+16.644 -0.441 16.68 -0.643 16.739 -0.809 c
+16.739 -0.853 l
+h
+15.578 -0.47 m
+15.695 -0.47 15.805 -0.437 15.915 -0.368 c
+16.023 -0.302 16.1 -0.217 16.151 -0.118 c
+16.151 0.588 l
+15.886 0.588 l
+15.651 0.588 15.464 0.536 15.327 0.44 c
+15.199 0.342 15.136 0.199 15.136 0.014 c
+15.136 -0.154 15.166 -0.276 15.225 -0.353 c
+15.291 -0.434 15.408 -0.47 15.578 -0.47 c
+17.422 -0.853 m
+17.422 1.734 l
+17.041 1.734 l
+17.041 2.131 l
+17.422 2.131 l
+17.422 2.469 l
+17.43 2.771 17.511 3.006 17.658 3.175 c
+17.804 3.351 18.014 3.439 18.29 3.439 c
+18.385 3.439 18.485 3.424 18.583 3.395 c
+18.554 2.984 l
+18.485 2.991 18.411 2.998 18.334 2.998 c
+18.058 2.998 17.922 2.8 17.922 2.41 c
+17.922 2.131 l
+18.422 2.131 l
+18.422 1.734 l
+17.922 1.734 l
+17.922 -0.853 l
+h
+19.881 -0.912 m
+19.506 -0.912 19.223 -0.805 19.028 -0.588 c
+18.83 -0.364 18.734 -0.037 18.734 0.397 c
+18.734 0.764 l
+18.734 1.205 18.826 1.55 19.013 1.808 c
+19.208 2.061 19.484 2.19 19.836 2.19 c
+20.178 2.19 20.432 2.076 20.601 1.851 c
+20.777 1.624 20.869 1.278 20.881 0.808 c
+20.881 0.5 l
+19.219 0.5 l
+19.219 0.426 l
+19.219 0.103 19.278 -0.133 19.395 -0.279 c
+19.513 -0.42 19.682 -0.485 19.91 -0.485 c
+20.057 -0.485 20.182 -0.463 20.293 -0.412 c
+20.399 -0.353 20.501 -0.265 20.601 -0.148 c
+20.851 -0.456 l
+20.645 -0.761 20.322 -0.912 19.881 -0.912 c
+19.836 1.764 m
+19.63 1.764 19.476 1.694 19.381 1.558 c
+19.281 1.419 19.227 1.205 19.219 0.911 c
+20.395 0.911 l
+20.395 0.985 l
+20.373 1.257 20.322 1.455 20.233 1.573 c
+20.145 1.697 20.013 1.764 19.836 1.764 c
+21.321 -0.588 m
+21.321 -0.5 21.343 -0.426 21.394 -0.368 c
+21.454 -0.309 21.531 -0.279 21.629 -0.279 c
+21.737 -0.279 21.814 -0.309 21.865 -0.368 c
+21.924 -0.426 21.953 -0.5 21.953 -0.588 c
+21.953 -0.669 21.924 -0.736 21.865 -0.794 c
+21.814 -0.853 21.737 -0.882 21.629 -0.882 c
+21.531 -0.882 21.454 -0.853 21.394 -0.794 c
+21.343 -0.736 21.321 -0.669 21.321 -0.588 c
+f
+Q
+ endstream endobj 33 0 obj <</BBox[579.503 320.602 630.821 315.104]/Group 69 0 R/Length 14034/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+580.003 316.31 -0.5 4.013 re
+580.94 316.31 m
+580.94 318.897 l
+580.557 318.897 l
+580.557 319.294 l
+580.94 319.294 l
+580.94 319.632 l
+580.948 319.933 581.028 320.168 581.176 320.338 c
+581.322 320.514 581.532 320.602 581.808 320.602 c
+581.903 320.602 582.003 320.587 582.101 320.558 c
+582.072 320.147 l
+582.003 320.153 581.929 320.161 581.852 320.161 c
+581.576 320.161 581.44 319.962 581.44 319.573 c
+581.44 319.294 l
+581.939 319.294 l
+581.939 318.897 l
+581.44 318.897 l
+581.44 316.31 l
+h
+584.413 317.119 m
+584.956 319.294 l
+585.471 319.294 l
+584.501 315.883 l
+584.431 315.63 584.328 315.439 584.193 315.31 c
+584.052 315.174 583.902 315.104 583.736 315.104 c
+583.667 315.104 583.582 315.119 583.487 315.149 c
+583.487 315.561 l
+583.589 315.546 l
+583.726 315.546 583.832 315.582 583.913 315.648 c
+584.002 315.719 584.067 315.836 584.119 316.001 c
+584.207 316.34 l
+583.34 319.294 l
+583.869 319.294 l
+h
+585.652 317.942 m
+585.652 318.372 585.754 318.713 585.96 318.971 c
+586.173 319.224 586.452 319.353 586.797 319.353 c
+587.14 319.353 587.415 319.224 587.621 318.971 c
+587.834 318.724 587.948 318.389 587.959 317.971 c
+587.959 317.662 l
+587.959 317.229 587.848 316.887 587.636 316.633 c
+587.43 316.376 587.15 316.251 586.797 316.251 c
+586.452 316.251 586.18 316.373 585.974 316.619 c
+585.769 316.861 585.658 317.196 585.652 317.618 c
+h
+586.136 317.662 m
+586.136 317.346 586.195 317.103 586.313 316.928 c
+586.437 316.758 586.599 316.677 586.797 316.677 c
+587.227 316.677 587.452 316.986 587.474 317.603 c
+587.474 317.942 l
+587.474 318.243 587.408 318.485 587.283 318.661 c
+587.165 318.838 587.003 318.927 586.797 318.927 c
+586.599 318.927 586.437 318.838 586.313 318.661 c
+586.195 318.485 586.136 318.243 586.136 317.942 c
+h
+589.914 316.575 m
+589.756 316.357 589.521 316.251 589.209 316.251 c
+588.944 316.251 588.738 316.343 588.591 316.531 c
+588.451 316.714 588.385 316.99 588.385 317.354 c
+588.385 319.294 l
+588.87 319.294 l
+588.87 317.383 l
+588.87 316.92 589.01 316.692 589.297 316.692 c
+589.59 316.692 589.789 316.824 589.899 317.089 c
+589.899 319.294 l
+590.399 319.294 l
+590.399 316.31 l
+589.928 316.31 l
+h
+593.685 316.31 m
+593.654 316.376 593.633 316.486 593.625 316.633 c
+593.449 316.376 593.228 316.251 592.964 316.251 c
+592.688 316.251 592.472 316.325 592.317 316.471 c
+592.17 316.626 592.097 316.843 592.097 317.119 c
+592.097 317.42 592.2 317.662 592.405 317.838 c
+592.611 318.023 592.894 318.118 593.258 318.118 c
+593.611 318.118 l
+593.611 318.441 l
+593.611 318.618 593.571 318.739 593.493 318.809 c
+593.413 318.886 593.295 318.927 593.141 318.927 c
+592.993 318.927 592.868 318.882 592.773 318.794 c
+592.685 318.706 592.64 318.596 592.64 318.47 c
+592.156 318.47 l
+592.156 318.618 592.2 318.757 592.288 318.897 c
+592.376 319.044 592.494 319.154 592.64 319.235 c
+592.795 319.312 592.968 319.353 593.155 319.353 c
+593.467 319.353 593.702 319.272 593.86 319.118 c
+594.015 318.971 594.096 318.75 594.096 318.456 c
+594.096 316.957 l
+594.103 316.722 594.14 316.519 594.198 316.354 c
+594.198 316.31 l
+h
+593.037 316.692 m
+593.155 316.692 593.265 316.725 593.376 316.795 c
+593.482 316.861 593.559 316.945 593.611 317.045 c
+593.611 317.751 l
+593.346 317.751 l
+593.111 317.751 592.923 317.699 592.787 317.603 c
+592.659 317.504 592.596 317.361 592.596 317.177 c
+592.596 317.008 592.626 316.887 592.685 316.81 c
+592.75 316.729 592.868 316.692 593.037 316.692 c
+595.911 318.838 m
+595.842 318.846 595.767 318.853 595.69 318.853 c
+595.433 318.853 595.257 318.713 595.161 318.441 c
+595.161 316.31 l
+594.676 316.31 l
+594.676 319.294 l
+595.146 319.294 l
+595.161 318.985 l
+595.287 319.228 595.47 319.353 595.705 319.353 c
+595.782 319.353 595.845 319.338 595.896 319.309 c
+h
+597.286 316.251 m
+596.91 316.251 596.628 316.357 596.433 316.575 c
+596.235 316.799 596.139 317.126 596.139 317.56 c
+596.139 317.927 l
+596.139 318.368 596.231 318.713 596.418 318.971 c
+596.613 319.224 596.889 319.353 597.242 319.353 c
+597.583 319.353 597.837 319.239 598.005 319.014 c
+598.182 318.786 598.274 318.441 598.285 317.971 c
+598.285 317.662 l
+596.624 317.662 l
+596.624 317.589 l
+596.624 317.265 596.683 317.03 596.8 316.883 c
+596.918 316.743 597.087 316.677 597.315 316.677 c
+597.462 316.677 597.587 316.7 597.697 316.751 c
+597.804 316.81 597.907 316.897 598.005 317.015 c
+598.256 316.706 l
+598.05 316.402 597.726 316.251 597.286 316.251 c
+597.242 318.927 m
+597.035 318.927 596.881 318.857 596.785 318.721 c
+596.686 318.581 596.631 318.368 596.624 318.073 c
+597.8 318.073 l
+597.8 318.148 l
+597.778 318.42 597.726 318.618 597.638 318.736 c
+597.55 318.86 597.417 318.927 597.242 318.927 c
+599.799 317.942 m
+599.799 318.401 599.88 318.75 600.049 318.985 c
+600.226 319.228 600.475 319.353 600.798 319.353 c
+601.082 319.353 601.302 319.235 601.46 319 c
+601.46 320.543 l
+601.945 320.543 l
+601.945 316.31 l
+601.504 316.31 l
+601.475 316.633 l
+601.317 316.376 601.093 316.251 600.798 316.251 c
+600.482 316.251 600.24 316.369 600.064 316.604 c
+599.887 316.847 599.799 317.192 599.799 317.633 c
+h
+600.284 317.662 m
+600.284 317.328 600.332 317.082 600.432 316.928 c
+600.527 316.77 600.688 316.692 600.916 316.692 c
+601.159 316.692 601.342 316.81 601.46 317.045 c
+601.46 318.559 l
+601.332 318.794 601.151 318.912 600.916 318.912 c
+600.688 318.912 600.527 318.831 600.432 318.676 c
+600.332 318.518 600.284 318.279 600.284 317.956 c
+h
+602.412 317.942 m
+602.412 318.372 602.514 318.713 602.72 318.971 c
+602.934 319.224 603.213 319.353 603.559 319.353 c
+603.9 319.353 604.176 319.224 604.382 318.971 c
+604.594 318.724 604.708 318.389 604.719 317.971 c
+604.719 317.662 l
+604.719 317.229 604.609 316.887 604.396 316.633 c
+604.191 316.376 603.911 316.251 603.559 316.251 c
+603.213 316.251 602.94 316.373 602.735 316.619 c
+602.529 316.861 602.419 317.196 602.412 317.618 c
+h
+602.897 317.662 m
+602.897 317.346 602.956 317.103 603.073 316.928 c
+603.198 316.758 603.36 316.677 603.559 316.677 c
+603.988 316.677 604.212 316.986 604.234 317.603 c
+604.234 317.942 l
+604.234 318.243 604.168 318.485 604.043 318.661 c
+603.925 318.838 603.764 318.927 603.559 318.927 c
+603.36 318.927 603.198 318.838 603.073 318.661 c
+602.956 318.485 602.897 318.243 602.897 317.942 c
+h
+605.689 316.31 -0.5 2.984 re
+605.719 320.088 m
+605.719 319.999 605.693 319.926 605.645 319.867 c
+605.606 319.816 605.535 319.794 605.44 319.794 c
+605.352 319.794 605.282 319.816 605.234 319.867 c
+605.194 319.926 605.175 319.992 605.175 320.072 c
+605.175 320.161 605.194 320.234 605.234 320.294 c
+605.282 320.352 605.352 320.382 605.44 320.382 c
+605.535 320.382 605.606 320.352 605.645 320.294 c
+605.693 320.234 605.719 320.165 605.719 320.088 c
+606.818 319.294 m
+606.832 318.971 l
+607.017 319.224 607.258 319.353 607.553 319.353 c
+608.082 319.353 608.35 319 608.361 318.294 c
+608.361 316.31 l
+607.877 316.31 l
+607.877 318.265 l
+607.877 318.5 607.836 318.665 607.759 318.765 c
+607.678 318.86 607.56 318.912 607.406 318.912 c
+607.289 318.912 607.178 318.871 607.083 318.794 c
+606.983 318.713 606.906 318.607 606.847 318.47 c
+606.847 316.31 l
+606.362 316.31 l
+606.362 319.294 l
+h
+608.814 317.942 m
+608.814 318.401 608.894 318.75 609.063 318.985 c
+609.24 319.228 609.489 319.353 609.813 319.353 c
+610.114 319.353 610.346 319.22 610.504 318.956 c
+610.533 319.294 l
+610.974 319.294 l
+610.974 316.28 l
+610.974 315.91 610.875 315.627 610.68 315.428 c
+610.493 315.233 610.231 315.134 609.901 315.134 c
+609.754 315.134 609.585 315.174 609.402 315.251 c
+609.213 315.322 609.078 315.409 608.989 315.516 c
+609.18 315.854 l
+609.386 315.648 609.61 315.546 609.857 315.546 c
+610.258 315.546 610.464 315.773 610.474 316.222 c
+610.474 316.604 l
+610.316 316.369 610.096 316.251 609.813 316.251 c
+609.497 316.251 609.254 316.369 609.078 316.604 c
+608.909 316.839 608.82 317.17 608.814 317.603 c
+h
+609.298 317.662 m
+609.298 317.328 609.346 317.082 609.446 316.928 c
+609.541 316.77 609.703 316.692 609.93 316.692 c
+610.173 316.692 610.356 316.814 610.474 317.059 c
+610.474 318.544 l
+610.356 318.786 610.18 318.912 609.945 318.912 c
+609.718 318.912 609.556 318.831 609.46 318.676 c
+609.361 318.518 609.306 318.279 609.298 317.956 c
+h
+614.873 317.662 m
+614.873 317.192 614.788 316.839 614.623 316.604 c
+614.454 316.369 614.211 316.251 613.888 316.251 c
+613.572 316.251 613.337 316.388 613.182 316.662 c
+613.153 316.31 l
+612.712 316.31 l
+612.712 320.543 l
+613.197 320.543 l
+613.197 318.971 l
+613.352 319.224 613.583 319.353 613.888 319.353 c
+614.211 319.353 614.454 319.235 614.623 319 c
+614.788 318.765 614.873 318.416 614.873 317.956 c
+h
+614.387 317.942 m
+614.387 318.294 614.337 318.544 614.241 318.691 c
+614.142 318.838 613.98 318.912 613.756 318.912 c
+613.51 318.912 613.323 318.772 613.197 318.5 c
+613.197 317.089 l
+613.315 316.824 613.506 316.692 613.77 316.692 c
+613.984 316.692 614.142 316.766 614.241 316.913 c
+614.337 317.067 614.387 317.31 614.387 317.633 c
+h
+616.843 316.31 m
+616.814 316.376 616.791 316.486 616.784 316.633 c
+616.608 316.376 616.386 316.251 616.122 316.251 c
+615.846 316.251 615.63 316.325 615.476 316.471 c
+615.328 316.626 615.255 316.843 615.255 317.119 c
+615.255 317.42 615.358 317.662 615.563 317.838 c
+615.769 318.023 616.053 318.118 616.417 318.118 c
+616.769 318.118 l
+616.769 318.441 l
+616.769 318.618 616.729 318.739 616.652 318.809 c
+616.571 318.886 616.453 318.927 616.299 318.927 c
+616.151 318.927 616.027 318.882 615.931 318.794 c
+615.843 318.706 615.799 318.596 615.799 318.47 c
+615.314 318.47 l
+615.314 318.618 615.358 318.757 615.446 318.897 c
+615.534 319.044 615.652 319.154 615.799 319.235 c
+615.954 319.312 616.126 319.353 616.313 319.353 c
+616.625 319.353 616.861 319.272 617.019 319.118 c
+617.173 318.971 617.254 318.75 617.254 318.456 c
+617.254 316.957 l
+617.261 316.722 617.298 316.519 617.357 316.354 c
+617.357 316.31 l
+h
+616.196 316.692 m
+616.313 316.692 616.424 316.725 616.534 316.795 c
+616.641 316.861 616.718 316.945 616.769 317.045 c
+616.769 317.751 l
+616.504 317.751 l
+616.269 317.751 616.082 317.699 615.946 317.603 c
+615.817 317.504 615.755 317.361 615.755 317.177 c
+615.755 317.008 615.784 316.887 615.843 316.81 c
+615.91 316.729 616.027 316.692 616.196 316.692 c
+618.863 316.677 m
+619.029 316.677 619.162 316.725 619.26 316.824 c
+619.356 316.92 619.411 317.063 619.422 317.25 c
+619.878 317.25 l
+619.867 316.964 619.764 316.725 619.569 316.531 c
+619.382 316.343 619.147 316.251 618.863 316.251 c
+618.5 316.251 618.221 316.369 618.026 316.604 c
+617.828 316.839 617.732 317.184 617.732 317.647 c
+617.732 317.971 l
+617.732 318.42 617.824 318.765 618.011 319 c
+618.206 319.235 618.489 319.353 618.863 319.353 c
+619.165 319.353 619.407 319.253 619.584 319.058 c
+619.768 318.86 619.867 318.596 619.878 318.265 c
+619.422 318.265 l
+619.401 318.489 619.341 318.655 619.246 318.765 c
+619.158 318.871 619.029 318.927 618.863 318.927 c
+618.647 318.927 618.485 318.853 618.379 318.706 c
+618.279 318.566 618.225 318.339 618.217 318.015 c
+618.217 317.633 l
+618.217 317.28 618.265 317.03 618.364 316.883 c
+618.47 316.743 618.636 316.677 618.863 316.677 c
+621.024 317.677 m
+620.76 317.383 l
+620.76 316.31 l
+620.275 316.31 l
+620.275 320.543 l
+620.76 320.543 l
+620.76 318.015 l
+621.686 319.294 l
+622.274 319.294 l
+621.333 318.044 l
+622.406 316.31 l
+621.833 316.31 l
+h
+624.166 316.575 m
+624.008 316.357 623.773 316.251 623.461 316.251 c
+623.197 316.251 622.991 316.343 622.844 316.531 c
+622.704 316.714 622.638 316.99 622.638 317.354 c
+622.638 319.294 l
+623.123 319.294 l
+623.123 317.383 l
+623.123 316.92 623.262 316.692 623.549 316.692 c
+623.843 316.692 624.041 316.824 624.151 317.089 c
+624.151 319.294 l
+624.652 319.294 l
+624.652 316.31 l
+624.181 316.31 l
+h
+627.349 317.662 m
+627.349 317.192 627.264 316.839 627.099 316.604 c
+626.929 316.369 626.691 316.251 626.379 316.251 c
+626.073 316.251 625.842 316.361 625.688 316.589 c
+625.688 315.164 l
+625.203 315.164 l
+625.203 319.294 l
+625.643 319.294 l
+625.673 318.956 l
+625.828 319.22 626.059 319.353 626.364 319.353 c
+626.694 319.353 626.941 319.235 627.099 319 c
+627.264 318.772 627.349 318.434 627.349 317.986 c
+h
+626.863 317.942 m
+626.863 318.272 626.809 318.518 626.702 318.676 c
+626.603 318.831 626.441 318.912 626.217 318.912 c
+625.982 318.912 625.805 318.794 625.688 318.559 c
+625.688 317.015 l
+625.805 316.787 625.986 316.677 626.231 316.677 c
+626.445 316.677 626.603 316.754 626.702 316.913 c
+626.809 317.067 626.863 317.31 626.863 317.633 c
+h
+629.248 317.074 m
+629.248 317.181 629.208 317.269 629.131 317.339 c
+629.05 317.416 628.899 317.504 628.675 317.603 c
+628.411 317.71 628.223 317.802 628.117 317.882 c
+628.007 317.96 627.929 318.048 627.881 318.148 c
+627.83 318.243 627.808 318.36 627.808 318.5 c
+627.808 318.742 627.896 318.945 628.072 319.103 c
+628.249 319.268 628.473 319.353 628.749 319.353 c
+629.043 319.353 629.278 319.264 629.454 319.088 c
+629.631 318.919 629.719 318.706 629.719 318.441 c
+629.234 318.441 l
+629.234 318.578 629.182 318.691 629.086 318.779 c
+628.999 318.875 628.885 318.927 628.749 318.927 c
+628.602 318.927 628.488 318.886 628.411 318.809 c
+628.33 318.739 628.293 318.64 628.293 318.515 c
+628.293 318.416 628.323 318.339 628.381 318.279 c
+628.44 318.221 628.579 318.14 628.808 318.044 c
+629.167 317.897 629.414 317.754 629.543 317.618 c
+629.678 317.489 629.749 317.317 629.749 317.103 c
+629.749 316.847 629.653 316.641 629.469 316.486 c
+629.292 316.328 629.057 316.251 628.764 316.251 c
+628.448 316.251 628.194 316.34 627.999 316.516 c
+627.812 316.7 627.72 316.931 627.72 317.207 c
+628.205 317.207 l
+628.213 317.038 628.263 316.905 628.352 316.81 c
+628.448 316.722 628.587 316.677 628.764 316.677 c
+628.918 316.677 629.036 316.71 629.117 316.78 c
+629.204 316.847 629.248 316.945 629.248 317.074 c
+630.748 317.442 m
+630.307 317.442 l
+630.277 320.323 l
+630.792 320.323 l
+h
+630.542 316.854 m
+630.638 316.854 630.707 316.824 630.748 316.766 c
+630.796 316.714 630.821 316.648 630.821 316.56 c
+630.821 316.479 630.796 316.413 630.748 316.354 c
+630.707 316.307 630.638 316.28 630.542 316.28 c
+630.454 316.28 630.384 316.307 630.337 316.354 c
+630.285 316.413 630.262 316.479 630.262 316.56 c
+630.262 316.648 630.285 316.714 630.337 316.766 c
+630.384 316.824 630.454 316.854 630.542 316.854 c
+f
+ endstream endobj 34 0 obj <</BBox[581.388 313.958 628.804 308.548]/Group 70 0 R/Length 10862/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 582.7852 311.7234 cm
+0 0 m
+0.808 2.014 l
+1.381 2.014 l
+0.249 -0.5 l
+0.249 -1.999 l
+-0.265 -1.999 l
+-0.265 -0.5 l
+-1.397 2.014 l
+-0.823 2.014 l
+h
+1.385 -0.367 m
+1.385 0.063 1.488 0.405 1.693 0.662 c
+1.907 0.915 2.186 1.044 2.531 1.044 c
+2.873 1.044 3.149 0.915 3.355 0.662 c
+3.568 0.416 3.682 0.081 3.692 -0.338 c
+3.692 -0.646 l
+3.692 -1.08 3.582 -1.421 3.37 -1.675 c
+3.164 -1.932 2.884 -2.057 2.531 -2.057 c
+2.186 -2.057 1.914 -1.936 1.708 -1.69 c
+1.502 -1.448 1.392 -1.113 1.385 -0.69 c
+h
+1.87 -0.646 m
+1.87 -0.962 1.929 -1.205 2.046 -1.381 c
+2.171 -1.55 2.333 -1.631 2.531 -1.631 c
+2.961 -1.631 3.185 -1.323 3.208 -0.706 c
+3.208 -0.367 l
+3.208 -0.066 3.142 0.177 3.017 0.353 c
+2.899 0.53 2.738 0.618 2.531 0.618 c
+2.333 0.618 2.171 0.53 2.046 0.353 c
+1.929 0.177 1.87 -0.066 1.87 -0.367 c
+h
+5.644 -1.734 m
+5.486 -1.951 5.251 -2.057 4.939 -2.057 c
+4.674 -2.057 4.469 -1.965 4.321 -1.778 c
+4.182 -1.595 4.116 -1.319 4.116 -0.955 c
+4.116 0.985 l
+4.6 0.985 l
+4.6 -0.926 l
+4.6 -1.389 4.74 -1.616 5.026 -1.616 c
+5.321 -1.616 5.519 -1.484 5.629 -1.219 c
+5.629 0.985 l
+6.129 0.985 l
+6.129 -1.999 l
+5.659 -1.999 l
+h
+9.415 -1.999 m
+9.385 -1.932 9.363 -1.822 9.356 -1.675 c
+9.18 -1.932 8.959 -2.057 8.694 -2.057 c
+8.419 -2.057 8.201 -1.984 8.047 -1.837 c
+7.9 -1.683 7.827 -1.466 7.827 -1.19 c
+7.827 -0.889 7.93 -0.646 8.135 -0.47 c
+8.342 -0.286 8.625 -0.191 8.988 -0.191 c
+9.341 -0.191 l
+9.341 0.133 l
+9.341 0.31 9.3 0.431 9.223 0.5 c
+9.142 0.578 9.025 0.618 8.87 0.618 c
+8.724 0.618 8.598 0.574 8.503 0.485 c
+8.415 0.397 8.371 0.287 8.371 0.162 c
+7.885 0.162 l
+7.885 0.31 7.93 0.449 8.018 0.588 c
+8.106 0.736 8.224 0.846 8.371 0.927 c
+8.525 1.004 8.698 1.044 8.885 1.044 c
+9.198 1.044 9.433 0.963 9.591 0.809 c
+9.745 0.662 9.826 0.441 9.826 0.148 c
+9.826 -1.352 l
+9.834 -1.587 9.87 -1.789 9.929 -1.955 c
+9.929 -1.999 l
+h
+8.768 -1.616 m
+8.885 -1.616 8.995 -1.583 9.105 -1.514 c
+9.213 -1.448 9.29 -1.363 9.341 -1.263 c
+9.341 -0.558 l
+9.076 -0.558 l
+8.841 -0.558 8.654 -0.61 8.517 -0.706 c
+8.39 -0.804 8.326 -0.947 8.326 -1.132 c
+8.326 -1.3 8.356 -1.421 8.415 -1.499 c
+8.481 -1.579 8.598 -1.616 8.768 -1.616 c
+11.642 0.53 m
+11.571 0.537 11.498 0.545 11.421 0.545 c
+11.164 0.545 10.987 0.405 10.892 0.133 c
+10.892 -1.999 l
+10.406 -1.999 l
+10.406 0.985 l
+10.877 0.985 l
+10.892 0.676 l
+11.017 0.919 11.2 1.044 11.436 1.044 c
+11.513 1.044 11.575 1.029 11.627 1 c
+h
+13.02 -2.057 m
+12.644 -2.057 12.361 -1.951 12.167 -1.734 c
+11.968 -1.51 11.873 -1.182 11.873 -0.749 c
+11.873 -0.382 l
+11.873 0.059 11.964 0.405 12.153 0.662 c
+12.347 0.915 12.623 1.044 12.976 1.044 c
+13.317 1.044 13.57 0.93 13.74 0.706 c
+13.916 0.478 14.008 0.133 14.019 -0.338 c
+14.019 -0.646 l
+12.358 -0.646 l
+12.358 -0.72 l
+12.358 -1.043 12.417 -1.278 12.534 -1.425 c
+12.652 -1.565 12.821 -1.631 13.049 -1.631 c
+13.196 -1.631 13.321 -1.609 13.431 -1.558 c
+13.537 -1.499 13.641 -1.411 13.74 -1.294 c
+13.99 -1.602 l
+13.784 -1.907 13.46 -2.057 13.02 -2.057 c
+12.976 0.618 m
+12.77 0.618 12.615 0.548 12.519 0.412 c
+12.421 0.273 12.365 0.059 12.358 -0.235 c
+13.533 -0.235 l
+13.533 -0.161 l
+13.512 0.111 13.46 0.31 13.373 0.427 c
+13.284 0.551 13.151 0.618 12.976 0.618 c
+15.533 -0.367 m
+15.533 0.092 15.613 0.441 15.783 0.676 c
+15.96 0.919 16.209 1.044 16.533 1.044 c
+16.816 1.044 17.036 0.927 17.194 0.691 c
+17.194 2.234 l
+17.679 2.234 l
+17.679 -1.999 l
+17.238 -1.999 l
+17.209 -1.675 l
+17.051 -1.932 16.826 -2.057 16.533 -2.057 c
+16.216 -2.057 15.974 -1.94 15.798 -1.705 c
+15.621 -1.462 15.533 -1.117 15.533 -0.675 c
+h
+16.018 -0.646 m
+16.018 -0.98 16.066 -1.227 16.165 -1.381 c
+16.261 -1.539 16.423 -1.616 16.65 -1.616 c
+16.893 -1.616 17.076 -1.499 17.194 -1.263 c
+17.194 0.25 l
+17.065 0.485 16.885 0.603 16.65 0.603 c
+16.423 0.603 16.261 0.522 16.165 0.368 c
+16.066 0.21 16.018 -0.029 16.018 -0.353 c
+h
+18.146 -0.367 m
+18.146 0.063 18.248 0.405 18.454 0.662 c
+18.667 0.915 18.947 1.044 19.293 1.044 c
+19.634 1.044 19.91 0.915 20.115 0.662 c
+20.328 0.416 20.442 0.081 20.454 -0.338 c
+20.454 -0.646 l
+20.454 -1.08 20.344 -1.421 20.13 -1.675 c
+19.924 -1.932 19.645 -2.057 19.293 -2.057 c
+18.947 -2.057 18.675 -1.936 18.469 -1.69 c
+18.263 -1.448 18.153 -1.113 18.146 -0.69 c
+h
+18.63 -0.646 m
+18.63 -0.962 18.69 -1.205 18.807 -1.381 c
+18.932 -1.55 19.094 -1.631 19.293 -1.631 c
+19.723 -1.631 19.946 -1.323 19.968 -0.706 c
+19.968 -0.367 l
+19.968 -0.066 19.902 0.177 19.777 0.353 c
+19.66 0.53 19.498 0.618 19.293 0.618 c
+19.094 0.618 18.932 0.53 18.807 0.353 c
+18.69 0.177 18.63 -0.066 18.63 -0.367 c
+h
+21.423 -1.999 -0.5 2.984 re
+21.453 1.779 m
+21.453 1.691 21.427 1.617 21.379 1.559 c
+21.339 1.507 21.269 1.485 21.174 1.485 c
+21.086 1.485 21.016 1.507 20.968 1.559 c
+20.928 1.617 20.909 1.684 20.909 1.764 c
+20.909 1.852 20.928 1.926 20.968 1.985 c
+21.016 2.043 21.086 2.073 21.174 2.073 c
+21.269 2.073 21.339 2.043 21.379 1.985 c
+21.427 1.926 21.453 1.856 21.453 1.779 c
+22.551 0.985 m
+22.566 0.662 l
+22.75 0.915 22.993 1.044 23.287 1.044 c
+23.816 1.044 24.084 0.691 24.095 -0.014 c
+24.095 -1.999 l
+23.61 -1.999 l
+23.61 -0.043 l
+23.61 0.192 23.569 0.357 23.492 0.456 c
+23.411 0.551 23.294 0.603 23.139 0.603 c
+23.022 0.603 22.912 0.563 22.817 0.485 c
+22.717 0.405 22.64 0.298 22.582 0.162 c
+22.582 -1.999 l
+22.096 -1.999 l
+22.096 0.985 l
+h
+24.547 -0.367 m
+24.547 0.092 24.628 0.441 24.797 0.676 c
+24.974 0.919 25.223 1.044 25.547 1.044 c
+25.848 1.044 26.079 0.912 26.237 0.647 c
+26.267 0.985 l
+26.708 0.985 l
+26.708 -2.028 l
+26.708 -2.399 26.609 -2.682 26.414 -2.881 c
+26.227 -3.075 25.965 -3.175 25.635 -3.175 c
+25.487 -3.175 25.319 -3.135 25.135 -3.057 c
+24.947 -2.987 24.812 -2.899 24.724 -2.792 c
+24.915 -2.454 l
+25.121 -2.66 25.344 -2.763 25.591 -2.763 c
+25.992 -2.763 26.197 -2.535 26.208 -2.087 c
+26.208 -1.705 l
+26.05 -1.94 25.83 -2.057 25.547 -2.057 c
+25.231 -2.057 24.988 -1.94 24.812 -1.705 c
+24.643 -1.469 24.554 -1.138 24.547 -0.706 c
+h
+25.032 -0.646 m
+25.032 -0.98 25.08 -1.227 25.179 -1.381 c
+25.275 -1.539 25.437 -1.616 25.664 -1.616 c
+25.907 -1.616 26.09 -1.495 26.208 -1.249 c
+26.208 0.235 l
+26.09 0.478 25.915 0.603 25.679 0.603 c
+25.451 0.603 25.289 0.522 25.194 0.368 c
+25.094 0.21 25.04 -0.029 25.032 -0.353 c
+h
+28.975 -1.999 -0.5 2.984 re
+29.005 1.779 m
+29.005 1.691 28.979 1.617 28.932 1.559 c
+28.891 1.507 28.82 1.485 28.726 1.485 c
+28.637 1.485 28.567 1.507 28.519 1.559 c
+28.479 1.617 28.461 1.684 28.461 1.764 c
+28.461 1.852 28.479 1.926 28.519 1.985 c
+28.567 2.043 28.637 2.073 28.726 2.073 c
+28.82 2.073 28.891 2.043 28.932 1.985 c
+28.979 1.926 29.005 1.856 29.005 1.779 c
+30.28 1.706 m
+30.28 0.985 l
+30.736 0.985 l
+30.736 0.588 l
+30.28 0.588 l
+30.28 -1.263 l
+30.28 -1.381 30.298 -1.469 30.339 -1.529 c
+30.376 -1.587 30.445 -1.616 30.544 -1.616 c
+30.603 -1.616 30.665 -1.609 30.736 -1.587 c
+30.736 -1.999 l
+30.618 -2.036 30.503 -2.057 30.397 -2.057 c
+30.199 -2.057 30.048 -1.992 29.942 -1.851 c
+29.842 -1.716 29.795 -1.521 29.795 -1.263 c
+29.795 0.588 l
+29.339 0.588 l
+29.339 0.985 l
+29.795 0.985 l
+29.795 1.706 l
+h
+31.202 -2.792 m
+30.908 -2.601 l
+31.085 -2.355 31.176 -2.105 31.187 -1.851 c
+31.187 -1.396 l
+31.687 -1.396 l
+31.687 -1.793 l
+31.687 -1.98 31.636 -2.164 31.54 -2.352 c
+31.452 -2.535 31.338 -2.682 31.202 -2.792 c
+34.682 0.53 m
+34.613 0.537 34.539 0.545 34.461 0.545 c
+34.204 0.545 34.028 0.405 33.932 0.133 c
+33.932 -1.999 l
+33.447 -1.999 l
+33.447 0.985 l
+33.917 0.985 l
+33.932 0.676 l
+34.058 0.919 34.241 1.044 34.476 1.044 c
+34.553 1.044 34.616 1.029 34.667 1 c
+h
+35.579 -1.999 -0.5 2.984 re
+35.608 1.779 m
+35.608 1.691 35.583 1.617 35.535 1.559 c
+35.494 1.507 35.424 1.485 35.329 1.485 c
+35.241 1.485 35.17 1.507 35.123 1.559 c
+35.083 1.617 35.064 1.684 35.064 1.764 c
+35.064 1.852 35.083 1.926 35.123 1.985 c
+35.17 2.043 35.241 2.073 35.329 2.073 c
+35.424 2.073 35.494 2.043 35.535 1.985 c
+35.583 1.926 35.608 1.856 35.608 1.779 c
+36.152 -0.367 m
+36.152 0.092 36.233 0.441 36.402 0.676 c
+36.578 0.919 36.828 1.044 37.152 1.044 c
+37.453 1.044 37.684 0.912 37.842 0.647 c
+37.872 0.985 l
+38.313 0.985 l
+38.313 -2.028 l
+38.313 -2.399 38.214 -2.682 38.019 -2.881 c
+37.832 -3.075 37.57 -3.175 37.24 -3.175 c
+37.092 -3.175 36.924 -3.135 36.74 -3.057 c
+36.552 -2.987 36.417 -2.899 36.329 -2.792 c
+36.52 -2.454 l
+36.726 -2.66 36.949 -2.763 37.196 -2.763 c
+37.597 -2.763 37.802 -2.535 37.813 -2.087 c
+37.813 -1.705 l
+37.655 -1.94 37.435 -2.057 37.152 -2.057 c
+36.836 -2.057 36.593 -1.94 36.417 -1.705 c
+36.248 -1.469 36.159 -1.138 36.152 -0.706 c
+h
+36.637 -0.646 m
+36.637 -0.98 36.685 -1.227 36.784 -1.381 c
+36.88 -1.539 37.042 -1.616 37.269 -1.616 c
+37.512 -1.616 37.695 -1.495 37.813 -1.249 c
+37.813 0.235 l
+37.695 0.478 37.519 0.603 37.283 0.603 c
+37.056 0.603 36.894 0.522 36.799 0.368 c
+36.699 0.21 36.645 -0.029 36.637 -0.353 c
+h
+39.334 0.676 m
+39.519 0.919 39.754 1.044 40.04 1.044 c
+40.569 1.044 40.838 0.691 40.849 -0.014 c
+40.849 -1.999 l
+40.363 -1.999 l
+40.363 -0.043 l
+40.363 0.192 40.323 0.357 40.246 0.456 c
+40.165 0.551 40.047 0.603 39.893 0.603 c
+39.775 0.603 39.665 0.563 39.569 0.485 c
+39.471 0.405 39.393 0.298 39.334 0.162 c
+39.334 -1.999 l
+38.85 -1.999 l
+38.85 2.234 l
+39.334 2.234 l
+h
+42.021 1.706 m
+42.021 0.985 l
+42.476 0.985 l
+42.476 0.588 l
+42.021 0.588 l
+42.021 -1.263 l
+42.021 -1.381 42.039 -1.469 42.079 -1.529 c
+42.116 -1.587 42.186 -1.616 42.285 -1.616 c
+42.344 -1.616 42.407 -1.609 42.476 -1.587 c
+42.476 -1.999 l
+42.359 -2.036 42.245 -2.057 42.139 -2.057 c
+41.94 -2.057 41.79 -1.992 41.682 -1.851 c
+41.583 -1.716 41.536 -1.521 41.536 -1.263 c
+41.536 0.588 l
+41.08 0.588 l
+41.08 0.985 l
+41.536 0.985 l
+41.536 1.706 l
+h
+43.487 -0.866 m
+43.046 -0.866 l
+43.016 2.014 l
+43.531 2.014 l
+h
+43.282 -1.454 m
+43.377 -1.454 43.446 -1.484 43.487 -1.543 c
+43.535 -1.595 43.56 -1.66 43.56 -1.749 c
+43.56 -1.83 43.535 -1.896 43.487 -1.955 c
+43.446 -2.002 43.377 -2.028 43.282 -2.028 c
+43.193 -2.028 43.124 -2.002 43.076 -1.955 c
+43.024 -1.896 43.002 -1.83 43.002 -1.749 c
+43.002 -1.66 43.024 -1.595 43.076 -1.543 c
+43.124 -1.484 43.193 -1.454 43.282 -1.454 c
+44.74 -0.866 m
+44.74 -0.654 44.758 -0.477 44.799 -0.338 c
+44.847 -0.191 44.961 -0.014 45.137 0.192 c
+45.343 0.441 l
+45.468 0.626 45.534 0.813 45.534 1 c
+45.534 1.195 45.489 1.345 45.401 1.455 c
+45.32 1.563 45.21 1.617 45.063 1.617 c
+44.924 1.617 44.807 1.566 44.711 1.47 c
+44.622 1.372 44.578 1.239 44.578 1.073 c
+44.093 1.073 l
+44.093 1.374 44.182 1.617 44.358 1.794 c
+44.541 1.977 44.776 2.073 45.063 2.073 c
+45.358 2.073 45.585 1.977 45.754 1.794 c
+45.931 1.607 46.019 1.353 46.019 1.029 c
+46.019 0.713 45.89 0.401 45.636 0.088 c
+45.387 -0.22 l
+45.277 -0.367 45.225 -0.584 45.225 -0.866 c
+h
+45.005 -1.454 m
+45.092 -1.454 45.159 -1.484 45.21 -1.543 c
+45.258 -1.595 45.283 -1.66 45.283 -1.749 c
+45.283 -1.83 45.258 -1.896 45.21 -1.955 c
+45.159 -2.002 45.092 -2.028 45.005 -2.028 c
+44.905 -2.028 44.832 -2.002 44.784 -1.955 c
+44.743 -1.896 44.726 -1.83 44.726 -1.749 c
+44.726 -1.66 44.743 -1.595 44.784 -1.543 c
+44.832 -1.484 44.905 -1.454 45.005 -1.454 c
+f
+Q
+ endstream endobj 35 0 obj <</BBox[535.367 366.838 774.632 366.237]/Group 71 0 R/Length 124/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 K
+0.601 w 4 M 1 j 1 J [4.808 4.808]0 d
+/GS0 gs
+q 1 0 0 1 535.6673 366.537 cm
+0 0 m
+238.665 0 l
+S
+Q
+ endstream endobj 36 0 obj <</BBox[741.792 364.828 774.49 359.389]/Group 72 0 R/Length 8999/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+742.571 360.595 -0.779 4.233 re
+742.99 362.182 m
+742.99 362.631 743.097 362.983 743.313 363.24 c
+743.526 363.505 743.82 363.637 744.195 363.637 c
+744.577 363.637 744.872 363.505 745.077 363.24 c
+745.29 362.983 745.4 362.631 745.4 362.182 c
+745.4 361.991 l
+745.4 361.528 745.29 361.172 745.077 360.917 c
+744.872 360.661 744.577 360.536 744.195 360.536 c
+743.813 360.536 743.511 360.661 743.299 360.917 c
+743.093 361.183 742.99 361.539 742.99 361.991 c
+h
+743.769 361.991 m
+743.769 361.451 743.908 361.183 744.195 361.183 c
+744.46 361.183 744.6 361.407 744.622 361.858 c
+744.637 362.182 l
+744.637 362.454 744.596 362.656 744.519 362.785 c
+744.438 362.92 744.331 362.991 744.195 362.991 c
+744.066 362.991 743.964 362.92 743.887 362.785 c
+743.806 362.656 743.769 362.454 743.769 362.182 c
+h
+746.79 361.183 m
+747.014 361.183 747.128 361.33 747.128 361.623 c
+747.862 361.623 l
+747.862 361.3 747.76 361.035 747.554 360.83 c
+747.355 360.632 747.106 360.536 746.804 360.536 c
+746.422 360.536 746.128 360.653 745.923 360.888 c
+745.716 361.131 745.614 361.484 745.614 361.947 c
+745.614 362.197 l
+745.614 362.656 745.709 363.009 745.907 363.255 c
+746.114 363.508 746.407 363.637 746.79 363.637 c
+747.12 363.637 747.382 363.535 747.569 363.329 c
+747.764 363.123 747.862 362.833 747.862 362.461 c
+747.128 362.461 l
+747.128 362.627 747.098 362.756 747.039 362.843 c
+746.988 362.939 746.9 362.991 746.775 362.991 c
+746.646 362.991 746.555 362.939 746.495 362.843 c
+746.437 362.744 746.4 362.557 746.393 362.285 c
+746.393 361.976 l
+746.393 361.73 746.4 361.557 746.422 361.462 c
+746.451 361.374 746.488 361.304 746.54 361.256 c
+746.598 361.204 746.679 361.183 746.79 361.183 c
+749.553 360.595 m
+749.524 360.642 749.498 360.72 749.479 360.83 c
+749.34 360.632 749.156 360.536 748.921 360.536 c
+748.664 360.536 748.454 360.616 748.289 360.786 c
+748.13 360.951 748.053 361.168 748.053 361.432 c
+748.053 361.744 748.149 361.983 748.348 362.153 c
+748.543 362.329 748.826 362.417 749.2 362.417 c
+749.45 362.417 l
+749.45 362.652 l
+749.45 362.789 749.424 362.88 749.377 362.932 c
+749.325 362.991 749.259 363.02 749.171 363.02 c
+748.972 363.02 748.876 362.906 748.876 362.681 c
+748.098 362.681 l
+748.098 362.954 748.201 363.182 748.406 363.358 c
+748.612 363.542 748.876 363.637 749.2 363.637 c
+749.524 363.637 749.774 363.549 749.95 363.373 c
+750.133 363.203 750.229 362.965 750.229 362.652 c
+750.229 361.241 l
+750.229 360.984 750.262 360.786 750.332 360.639 c
+750.332 360.595 l
+h
+749.082 361.153 m
+749.171 361.153 749.244 361.168 749.304 361.197 c
+749.369 361.234 749.42 361.278 749.45 361.33 c
+749.45 361.947 l
+749.259 361.947 l
+749.119 361.947 749.013 361.902 748.936 361.815 c
+748.866 361.734 748.833 361.623 748.833 361.476 c
+748.833 361.26 748.913 361.153 749.082 361.153 c
+751.431 360.595 -0.779 4.233 re
+754.621 362.829 m
+754.37 362.843 l
+754.154 362.843 754.007 362.748 753.929 362.564 c
+753.929 360.595 l
+753.15 360.595 l
+753.15 363.579 l
+753.886 363.579 l
+753.915 363.255 l
+754.033 363.508 754.198 363.637 754.415 363.637 c
+754.503 363.637 754.576 363.622 754.635 363.593 c
+h
+756.053 360.536 m
+755.65 360.536 755.337 360.653 755.113 360.888 c
+754.896 361.131 754.79 361.476 754.79 361.918 c
+754.79 362.168 l
+754.79 362.638 754.893 362.997 755.099 363.255 c
+755.304 363.508 755.598 363.637 755.98 363.637 c
+756.352 363.637 756.631 363.512 756.818 363.269 c
+757.013 363.034 757.112 362.681 757.112 362.211 c
+757.112 361.829 l
+755.569 361.829 l
+755.575 361.601 755.62 361.436 755.701 361.33 c
+755.789 361.23 755.925 361.183 756.113 361.183 c
+756.366 361.183 756.583 361.274 756.759 361.462 c
+757.067 360.977 l
+756.969 360.848 756.826 360.742 756.641 360.653 c
+756.465 360.576 756.267 360.536 756.053 360.536 c
+755.569 362.373 m
+756.348 362.373 l
+756.348 362.446 l
+756.348 362.623 756.319 362.756 756.259 362.843 c
+756.201 362.939 756.101 362.991 755.966 362.991 c
+755.837 362.991 755.737 362.939 755.671 362.843 c
+755.613 362.744 755.575 362.586 755.569 362.373 c
+759.691 361.991 m
+759.691 361.521 759.611 361.156 759.456 360.903 c
+759.298 360.657 759.06 360.536 758.736 360.536 c
+758.49 360.536 758.295 360.632 758.148 360.83 c
+758.148 359.448 l
+757.37 359.448 l
+757.37 363.579 l
+758.089 363.579 l
+758.119 363.299 l
+758.273 363.523 758.479 363.637 758.736 363.637 c
+759.049 363.637 759.284 363.52 759.442 363.284 c
+759.607 363.049 759.691 362.696 759.691 362.226 c
+h
+758.927 362.182 m
+758.927 362.476 758.891 362.681 758.825 362.799 c
+758.766 362.917 758.655 362.976 758.501 362.976 c
+758.343 362.976 758.226 362.91 758.148 362.785 c
+758.148 361.374 l
+758.226 361.245 758.347 361.183 758.515 361.183 c
+758.663 361.183 758.766 361.245 758.825 361.374 c
+758.891 361.509 758.927 361.715 758.927 361.991 c
+h
+759.893 362.182 m
+759.893 362.631 760.001 362.983 760.217 363.24 c
+760.431 363.505 760.724 363.637 761.099 363.637 c
+761.481 363.637 761.775 363.505 761.981 363.24 c
+762.195 362.983 762.305 362.631 762.305 362.182 c
+762.305 361.991 l
+762.305 361.528 762.195 361.172 761.981 360.917 c
+761.775 360.661 761.481 360.536 761.099 360.536 c
+760.717 360.536 760.416 360.661 760.202 360.917 c
+759.997 361.183 759.893 361.539 759.893 361.991 c
+h
+760.672 361.991 m
+760.672 361.451 760.813 361.183 761.099 361.183 c
+761.364 361.183 761.503 361.407 761.526 361.858 c
+761.54 362.182 l
+761.54 362.454 761.499 362.656 761.422 362.785 c
+761.341 362.92 761.235 362.991 761.099 362.991 c
+760.971 362.991 760.867 362.92 760.79 362.785 c
+760.709 362.656 760.672 362.454 760.672 362.182 c
+h
+763.928 361.388 m
+763.928 361.455 763.892 361.521 763.826 361.58 c
+763.766 361.638 763.627 361.711 763.415 361.8 c
+763.091 361.935 762.87 362.072 762.752 362.211 c
+762.635 362.347 762.576 362.521 762.576 362.726 c
+762.576 362.991 762.669 363.203 762.856 363.373 c
+763.039 363.549 763.29 363.637 763.606 363.637 c
+763.928 363.637 764.186 363.549 764.385 363.373 c
+764.579 363.203 764.678 362.98 764.678 362.696 c
+763.899 362.696 l
+763.899 362.939 763.797 363.064 763.591 363.064 c
+763.51 363.064 763.444 363.034 763.385 362.976 c
+763.334 362.924 763.311 362.858 763.311 362.77 c
+763.311 362.7 763.34 362.641 763.4 362.594 c
+763.458 362.542 763.594 362.469 763.811 362.373 c
+764.134 362.255 764.358 362.124 764.487 361.976 c
+764.624 361.837 764.693 361.653 764.693 361.418 c
+764.693 361.153 764.591 360.936 764.385 360.771 c
+764.186 360.613 763.928 360.536 763.606 360.536 c
+763.377 360.536 763.182 360.58 763.018 360.668 c
+762.848 360.757 762.716 360.874 762.621 361.021 c
+762.532 361.175 762.488 361.345 762.488 361.521 c
+763.223 361.521 l
+763.23 361.381 763.267 361.278 763.326 361.212 c
+763.385 361.142 763.48 361.109 763.62 361.109 c
+763.826 361.109 763.928 361.201 763.928 361.388 c
+765.825 360.595 -0.779 2.984 re
+765.002 364.343 m
+765.002 364.468 765.038 364.57 765.119 364.651 c
+765.196 364.728 765.299 364.769 765.428 364.769 c
+765.553 364.769 765.656 364.728 765.736 364.651 c
+765.814 364.57 765.854 364.468 765.854 364.343 c
+765.854 364.225 765.814 364.126 765.736 364.049 c
+765.667 363.968 765.564 363.932 765.428 363.932 c
+765.299 363.932 765.196 363.968 765.119 364.049 c
+765.038 364.126 765.002 364.225 765.002 364.343 c
+767.243 364.314 m
+767.243 363.579 l
+767.64 363.579 l
+767.64 362.991 l
+767.243 362.991 l
+767.243 361.505 l
+767.243 361.388 767.258 361.304 767.288 361.256 c
+767.324 361.216 767.39 361.197 767.479 361.197 c
+767.556 361.197 767.618 361.204 767.67 361.227 c
+767.655 360.609 l
+767.527 360.562 767.383 360.536 767.228 360.536 c
+766.729 360.536 766.472 360.822 766.465 361.403 c
+766.465 362.991 l
+766.126 362.991 l
+766.126 363.579 l
+766.465 363.579 l
+766.465 364.314 l
+h
+767.787 362.182 m
+767.787 362.631 767.893 362.983 768.111 363.24 c
+768.323 363.505 768.618 363.637 768.992 363.637 c
+769.374 363.637 769.669 363.505 769.875 363.24 c
+770.087 362.983 770.197 362.631 770.197 362.182 c
+770.197 361.991 l
+770.197 361.528 770.087 361.172 769.875 360.917 c
+769.669 360.661 769.374 360.536 768.992 360.536 c
+768.61 360.536 768.309 360.661 768.096 360.917 c
+767.89 361.183 767.787 361.539 767.787 361.991 c
+h
+768.566 361.991 m
+768.566 361.451 768.705 361.183 768.992 361.183 c
+769.257 361.183 769.397 361.407 769.418 361.858 c
+769.433 362.182 l
+769.433 362.454 769.393 362.656 769.316 362.785 c
+769.235 362.92 769.129 362.991 768.992 362.991 c
+768.863 362.991 768.761 362.92 768.684 362.785 c
+768.603 362.656 768.566 362.454 768.566 362.182 c
+h
+771.969 362.829 m
+771.719 362.843 l
+771.502 362.843 771.355 362.748 771.278 362.564 c
+771.278 360.595 l
+770.499 360.595 l
+770.499 363.579 l
+771.234 363.579 l
+771.263 363.255 l
+771.381 363.508 771.546 363.637 771.763 363.637 c
+771.851 363.637 771.925 363.622 771.984 363.593 c
+h
+773.255 361.888 m
+773.652 363.579 l
+774.49 363.579 l
+773.505 360.154 l
+773.358 359.647 773.083 359.389 772.682 359.389 c
+772.583 359.389 772.476 359.411 772.358 359.448 c
+772.358 360.051 l
+772.447 360.051 l
+772.572 360.051 772.667 360.076 772.726 360.124 c
+772.784 360.165 772.829 360.242 772.859 360.36 c
+772.932 360.565 l
+772.065 363.579 l
+772.902 363.579 l
+h
+f
+ endstream endobj 37 0 obj <</BBox[733.362 374.614 774.497 369.293]/Group 73 0 R/Length 10421/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 734.8322 372.6739 cm
+0 0 m
+-0.25 0.014 l
+-0.467 0.014 -0.614 -0.081 -0.691 -0.265 c
+-0.691 -2.234 l
+-1.47 -2.234 l
+-1.47 0.749 l
+-0.736 0.749 l
+-0.706 0.426 l
+-0.588 0.679 -0.423 0.808 -0.206 0.808 c
+-0.118 0.808 -0.044 0.793 0.014 0.764 c
+h
+1.433 -2.294 m
+1.028 -2.294 0.716 -2.176 0.492 -1.941 c
+0.276 -1.698 0.168 -1.353 0.168 -0.912 c
+0.168 -0.662 l
+0.168 -0.192 0.272 0.168 0.477 0.426 c
+0.683 0.679 0.977 0.808 1.359 0.808 c
+1.731 0.808 2.009 0.683 2.198 0.44 c
+2.392 0.205 2.491 -0.148 2.491 -0.618 c
+2.491 -1 l
+0.947 -1 l
+0.955 -1.228 0.999 -1.393 1.08 -1.5 c
+1.168 -1.599 1.304 -1.646 1.492 -1.646 c
+1.745 -1.646 1.962 -1.555 2.138 -1.368 c
+2.447 -1.852 l
+2.348 -1.981 2.204 -2.087 2.021 -2.176 c
+1.845 -2.253 1.646 -2.294 1.433 -2.294 c
+0.947 -0.456 m
+1.727 -0.456 l
+1.727 -0.383 l
+1.727 -0.206 1.697 -0.074 1.639 0.014 c
+1.58 0.11 1.481 0.161 1.344 0.161 c
+1.216 0.161 1.117 0.11 1.051 0.014 c
+0.992 -0.085 0.955 -0.243 0.947 -0.456 c
+3.484 0.749 m
+3.513 0.47 l
+3.69 0.694 3.917 0.808 4.203 0.808 c
+4.498 0.808 4.708 0.668 4.835 0.396 c
+5.001 0.668 5.24 0.808 5.556 0.808 c
+6.085 0.808 6.354 0.444 6.364 -0.279 c
+6.364 -2.234 l
+5.585 -2.234 l
+5.585 -0.324 l
+5.585 -0.158 5.56 -0.04 5.512 0.029 c
+5.46 0.106 5.383 0.147 5.277 0.147 c
+5.13 0.147 5.016 0.058 4.939 -0.118 c
+4.953 -0.206 l
+4.953 -2.234 l
+4.174 -2.234 l
+4.174 -0.339 l
+4.174 -0.162 4.149 -0.04 4.101 0.029 c
+4.049 0.106 3.968 0.147 3.85 0.147 c
+3.723 0.147 3.619 0.073 3.542 -0.074 c
+3.542 -2.234 l
+2.763 -2.234 l
+2.763 0.749 l
+h
+6.57 -0.647 m
+6.57 -0.199 6.676 0.154 6.894 0.411 c
+7.106 0.675 7.401 0.808 7.775 0.808 c
+8.158 0.808 8.452 0.675 8.658 0.411 c
+8.87 0.154 8.981 -0.199 8.981 -0.647 c
+8.981 -0.838 l
+8.981 -1.301 8.87 -1.658 8.658 -1.912 c
+8.452 -2.168 8.158 -2.294 7.775 -2.294 c
+7.393 -2.294 7.092 -2.168 6.879 -1.912 c
+6.673 -1.646 6.57 -1.291 6.57 -0.838 c
+h
+7.349 -0.838 m
+7.349 -1.378 7.489 -1.646 7.775 -1.646 c
+8.041 -1.646 8.18 -1.422 8.201 -0.971 c
+8.216 -0.647 l
+8.216 -0.375 8.176 -0.173 8.099 -0.044 c
+8.018 0.091 7.912 0.161 7.775 0.161 c
+7.647 0.161 7.544 0.091 7.467 -0.044 c
+7.386 -0.173 7.349 -0.375 7.349 -0.647 c
+h
+10.194 1.484 m
+10.194 0.749 l
+10.59 0.749 l
+10.59 0.161 l
+10.194 0.161 l
+10.194 -1.324 l
+10.194 -1.441 10.208 -1.526 10.238 -1.573 c
+10.275 -1.613 10.341 -1.632 10.429 -1.632 c
+10.506 -1.632 10.568 -1.625 10.62 -1.603 c
+10.605 -2.22 l
+10.476 -2.268 10.333 -2.294 10.179 -2.294 c
+9.679 -2.294 9.422 -2.007 9.414 -1.426 c
+9.414 0.161 l
+9.076 0.161 l
+9.076 0.749 l
+9.414 0.749 l
+9.414 1.484 l
+h
+12.104 -2.294 m
+11.7 -2.294 11.388 -2.176 11.164 -1.941 c
+10.946 -1.698 10.84 -1.353 10.84 -0.912 c
+10.84 -0.662 l
+10.84 -0.192 10.944 0.168 11.149 0.426 c
+11.355 0.679 11.649 0.808 12.031 0.808 c
+12.402 0.808 12.681 0.683 12.868 0.44 c
+13.063 0.205 13.163 -0.148 13.163 -0.618 c
+13.163 -1 l
+11.619 -1 l
+11.627 -1.228 11.671 -1.393 11.752 -1.5 c
+11.84 -1.599 11.976 -1.646 12.163 -1.646 c
+12.417 -1.646 12.633 -1.555 12.81 -1.368 c
+13.119 -1.852 l
+13.02 -1.981 12.876 -2.087 12.692 -2.176 c
+12.516 -2.253 12.317 -2.294 12.104 -2.294 c
+11.619 -0.456 m
+12.398 -0.456 l
+12.398 -0.383 l
+12.398 -0.206 12.369 -0.074 12.311 0.014 c
+12.251 0.11 12.153 0.161 12.016 0.161 c
+11.887 0.161 11.788 0.11 11.723 0.014 c
+11.663 -0.085 11.627 -0.243 11.619 -0.456 c
+16.103 0 m
+15.852 0.014 l
+15.636 0.014 15.489 -0.081 15.412 -0.265 c
+15.412 -2.234 l
+14.632 -2.234 l
+14.632 0.749 l
+15.368 0.749 l
+15.397 0.426 l
+15.515 0.679 15.68 0.808 15.897 0.808 c
+15.985 0.808 16.058 0.793 16.118 0.764 c
+h
+17.535 -2.294 m
+17.132 -2.294 16.82 -2.176 16.595 -1.941 c
+16.378 -1.698 16.272 -1.353 16.272 -0.912 c
+16.272 -0.662 l
+16.272 -0.192 16.375 0.168 16.581 0.426 c
+16.786 0.679 17.08 0.808 17.462 0.808 c
+17.834 0.808 18.113 0.683 18.3 0.44 c
+18.495 0.205 18.594 -0.148 18.594 -0.618 c
+18.594 -1 l
+17.051 -1 l
+17.058 -1.228 17.102 -1.393 17.183 -1.5 c
+17.271 -1.599 17.407 -1.646 17.595 -1.646 c
+17.848 -1.646 18.065 -1.555 18.241 -1.368 c
+18.549 -1.852 l
+18.451 -1.981 18.308 -2.087 18.123 -2.176 c
+17.947 -2.253 17.749 -2.294 17.535 -2.294 c
+17.051 -0.456 m
+17.83 -0.456 l
+17.83 -0.383 l
+17.83 -0.206 17.801 -0.074 17.741 0.014 c
+17.683 0.11 17.583 0.161 17.448 0.161 c
+17.319 0.161 17.219 0.11 17.153 0.014 c
+17.095 -0.085 17.058 -0.243 17.051 -0.456 c
+21.173 -0.838 m
+21.173 -1.309 21.093 -1.673 20.938 -1.926 c
+20.781 -2.172 20.542 -2.294 20.218 -2.294 c
+19.972 -2.294 19.777 -2.198 19.63 -1.999 c
+19.63 -3.381 l
+18.852 -3.381 l
+18.852 0.749 l
+19.571 0.749 l
+19.601 0.47 l
+19.756 0.694 19.961 0.808 20.218 0.808 c
+20.531 0.808 20.766 0.69 20.924 0.455 c
+21.09 0.22 21.173 -0.133 21.173 -0.603 c
+h
+20.409 -0.647 m
+20.409 -0.353 20.373 -0.148 20.307 -0.03 c
+20.248 0.087 20.137 0.147 19.983 0.147 c
+19.825 0.147 19.708 0.08 19.63 -0.044 c
+19.63 -1.455 l
+19.708 -1.584 19.829 -1.646 19.997 -1.646 c
+20.145 -1.646 20.248 -1.584 20.307 -1.455 c
+20.373 -1.32 20.409 -1.114 20.409 -0.838 c
+h
+21.375 -0.647 m
+21.375 -0.199 21.483 0.154 21.699 0.411 c
+21.913 0.675 22.206 0.808 22.582 0.808 c
+22.964 0.808 23.257 0.675 23.463 0.411 c
+23.677 0.154 23.787 -0.199 23.787 -0.647 c
+23.787 -0.838 l
+23.787 -1.301 23.677 -1.658 23.463 -1.912 c
+23.257 -2.168 22.964 -2.294 22.582 -2.294 c
+22.199 -2.294 21.898 -2.168 21.684 -1.912 c
+21.479 -1.646 21.375 -1.291 21.375 -0.838 c
+h
+22.154 -0.838 m
+22.154 -1.378 22.295 -1.646 22.582 -1.646 c
+22.846 -1.646 22.985 -1.422 23.008 -0.971 c
+23.022 -0.647 l
+23.022 -0.375 22.981 -0.173 22.904 -0.044 c
+22.823 0.091 22.717 0.161 22.582 0.161 c
+22.453 0.161 22.349 0.091 22.272 -0.044 c
+22.192 -0.173 22.154 -0.375 22.154 -0.647 c
+h
+25.41 -1.441 m
+25.41 -1.374 25.374 -1.309 25.308 -1.25 c
+25.249 -1.191 25.109 -1.118 24.897 -1.029 c
+24.573 -0.894 24.352 -0.757 24.234 -0.618 c
+24.117 -0.482 24.059 -0.31 24.059 -0.103 c
+24.059 0.161 24.151 0.374 24.338 0.544 c
+24.521 0.72 24.772 0.808 25.088 0.808 c
+25.41 0.808 25.668 0.72 25.867 0.544 c
+26.061 0.374 26.16 0.151 26.16 -0.133 c
+25.381 -0.133 l
+25.381 0.11 25.279 0.235 25.073 0.235 c
+24.992 0.235 24.926 0.205 24.867 0.147 c
+24.816 0.095 24.793 0.029 24.793 -0.059 c
+24.793 -0.129 24.822 -0.188 24.882 -0.235 c
+24.94 -0.287 25.076 -0.36 25.293 -0.456 c
+25.616 -0.574 25.84 -0.706 25.969 -0.853 c
+26.106 -0.992 26.175 -1.176 26.175 -1.411 c
+26.175 -1.676 26.073 -1.893 25.867 -2.058 c
+25.668 -2.216 25.41 -2.294 25.088 -2.294 c
+24.859 -2.294 24.664 -2.249 24.5 -2.161 c
+24.33 -2.073 24.198 -1.956 24.103 -1.808 c
+24.014 -1.654 23.97 -1.485 23.97 -1.309 c
+24.705 -1.309 l
+24.712 -1.449 24.749 -1.551 24.808 -1.617 c
+24.867 -1.687 24.963 -1.721 25.102 -1.721 c
+25.308 -1.721 25.41 -1.628 25.41 -1.441 c
+27.311 -2.234 -0.779 2.983 re
+26.487 1.514 m
+26.487 1.639 26.524 1.741 26.605 1.822 c
+26.682 1.899 26.785 1.94 26.914 1.94 c
+27.039 1.94 27.141 1.899 27.222 1.822 c
+27.299 1.741 27.34 1.639 27.34 1.514 c
+27.34 1.396 27.299 1.296 27.222 1.219 c
+27.153 1.138 27.05 1.102 26.914 1.102 c
+26.785 1.102 26.682 1.138 26.605 1.219 c
+26.524 1.296 26.487 1.396 26.487 1.514 c
+28.726 1.484 m
+28.726 0.749 l
+29.122 0.749 l
+29.122 0.161 l
+28.726 0.161 l
+28.726 -1.324 l
+28.726 -1.441 28.74 -1.526 28.77 -1.573 c
+28.806 -1.613 28.872 -1.632 28.961 -1.632 c
+29.038 -1.632 29.1 -1.625 29.152 -1.603 c
+29.137 -2.22 l
+29.009 -2.268 28.865 -2.294 28.71 -2.294 c
+28.211 -2.294 27.954 -2.007 27.947 -1.426 c
+27.947 0.161 l
+27.608 0.161 l
+27.608 0.749 l
+27.947 0.749 l
+27.947 1.484 l
+h
+29.269 -0.647 m
+29.269 -0.199 29.376 0.154 29.593 0.411 c
+29.805 0.675 30.1 0.808 30.474 0.808 c
+30.856 0.808 31.151 0.675 31.357 0.411 c
+31.569 0.154 31.679 -0.199 31.679 -0.647 c
+31.679 -0.838 l
+31.679 -1.301 31.569 -1.658 31.357 -1.912 c
+31.151 -2.168 30.856 -2.294 30.474 -2.294 c
+30.092 -2.294 29.791 -2.168 29.578 -1.912 c
+29.372 -1.646 29.269 -1.291 29.269 -0.838 c
+h
+30.048 -0.838 m
+30.048 -1.378 30.188 -1.646 30.474 -1.646 c
+30.739 -1.646 30.879 -1.422 30.9 -0.971 c
+30.916 -0.647 l
+30.916 -0.375 30.875 -0.173 30.798 -0.044 c
+30.717 0.091 30.611 0.161 30.474 0.161 c
+30.345 0.161 30.243 0.091 30.166 -0.044 c
+30.085 -0.173 30.048 -0.375 30.048 -0.647 c
+h
+33.451 0 m
+33.202 0.014 l
+32.984 0.014 32.837 -0.081 32.76 -0.265 c
+32.76 -2.234 l
+31.981 -2.234 l
+31.981 0.749 l
+32.716 0.749 l
+32.745 0.426 l
+32.863 0.679 33.028 0.808 33.246 0.808 c
+33.333 0.808 33.407 0.793 33.466 0.764 c
+h
+34.553 -2.234 -0.779 2.983 re
+33.73 1.514 m
+33.73 1.639 33.767 1.741 33.848 1.822 c
+33.925 1.899 34.028 1.94 34.156 1.94 c
+34.281 1.94 34.384 1.899 34.465 1.822 c
+34.542 1.741 34.583 1.639 34.583 1.514 c
+34.583 1.396 34.542 1.296 34.465 1.219 c
+34.395 1.138 34.293 1.102 34.156 1.102 c
+34.028 1.102 33.925 1.138 33.848 1.219 c
+33.767 1.296 33.73 1.396 33.73 1.514 c
+36.263 -2.294 m
+35.858 -2.294 35.546 -2.176 35.322 -1.941 c
+35.105 -1.698 34.998 -1.353 34.998 -0.912 c
+34.998 -0.662 l
+34.998 -0.192 35.101 0.168 35.307 0.426 c
+35.513 0.679 35.806 0.808 36.188 0.808 c
+36.56 0.808 36.839 0.683 37.027 0.44 c
+37.221 0.205 37.321 -0.148 37.321 -0.618 c
+37.321 -1 l
+35.777 -1 l
+35.785 -1.228 35.829 -1.393 35.91 -1.5 c
+35.997 -1.599 36.134 -1.646 36.321 -1.646 c
+36.575 -1.646 36.791 -1.555 36.968 -1.368 c
+37.277 -1.852 l
+37.177 -1.981 37.034 -2.087 36.851 -2.176 c
+36.674 -2.253 36.475 -2.294 36.263 -2.294 c
+35.777 -0.456 m
+36.556 -0.456 l
+36.556 -0.383 l
+36.556 -0.206 36.527 -0.074 36.468 0.014 c
+36.409 0.11 36.31 0.161 36.174 0.161 c
+36.045 0.161 35.947 0.11 35.88 0.014 c
+35.821 -0.085 35.785 -0.243 35.777 -0.456 c
+38.901 -1.441 m
+38.901 -1.374 38.864 -1.309 38.798 -1.25 c
+38.739 -1.191 38.599 -1.118 38.386 -1.029 c
+38.063 -0.894 37.842 -0.757 37.725 -0.618 c
+37.607 -0.482 37.549 -0.31 37.549 -0.103 c
+37.549 0.161 37.64 0.374 37.828 0.544 c
+38.012 0.72 38.262 0.808 38.577 0.808 c
+38.901 0.808 39.158 0.72 39.357 0.544 c
+39.552 0.374 39.65 0.151 39.65 -0.133 c
+38.871 -0.133 l
+38.871 0.11 38.769 0.235 38.563 0.235 c
+38.482 0.235 38.416 0.205 38.357 0.147 c
+38.305 0.095 38.283 0.029 38.283 -0.059 c
+38.283 -0.129 38.313 -0.188 38.372 -0.235 c
+38.43 -0.287 38.567 -0.36 38.783 -0.456 c
+39.107 -0.574 39.33 -0.706 39.459 -0.853 c
+39.596 -0.992 39.665 -1.176 39.665 -1.411 c
+39.665 -1.676 39.562 -1.893 39.357 -2.058 c
+39.158 -2.216 38.901 -2.294 38.577 -2.294 c
+38.349 -2.294 38.154 -2.249 37.99 -2.161 c
+37.821 -2.073 37.688 -1.956 37.593 -1.808 c
+37.504 -1.654 37.46 -1.485 37.46 -1.309 c
+38.195 -1.309 l
+38.203 -1.449 38.239 -1.551 38.298 -1.617 c
+38.357 -1.687 38.453 -1.721 38.592 -1.721 c
+38.798 -1.721 38.901 -1.628 38.901 -1.441 c
+f
+Q
+ endstream endobj 38 0 obj <</BBox[543.633 459.986 581.22 454.709]/Group 74 0 R/Length 9136/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 544.8536 457.5314 cm
+0 0 m
+-0.706 0 l
+-0.706 -1.617 l
+-1.22 -1.617 l
+-1.22 2.396 l
+-0.088 2.396 l
+0.302 2.396 0.595 2.293 0.794 2.087 c
+1 1.881 1.103 1.579 1.103 1.19 c
+1.103 0.944 1.048 0.727 0.941 0.544 c
+0.831 0.357 0.68 0.213 0.485 0.118 c
+1.25 -1.588 l
+1.25 -1.617 l
+0.721 -1.617 l
+h
+-0.706 0.44 m
+-0.088 0.44 l
+0.118 0.44 0.283 0.507 0.412 0.646 c
+0.537 0.783 0.603 0.962 0.603 1.19 c
+0.603 1.697 0.368 1.955 -0.103 1.955 c
+-0.706 1.955 l
+h
+2.58 -1.676 m
+2.205 -1.676 1.922 -1.569 1.727 -1.353 c
+1.529 -1.129 1.434 -0.802 1.434 -0.368 c
+1.434 0 l
+1.434 0.44 1.525 0.786 1.713 1.043 c
+1.908 1.297 2.183 1.425 2.536 1.425 c
+2.878 1.425 3.132 1.311 3.3 1.087 c
+3.477 0.86 3.568 0.515 3.579 0.044 c
+3.579 -0.265 l
+1.918 -0.265 l
+1.918 -0.339 l
+1.918 -0.661 1.977 -0.897 2.095 -1.044 c
+2.213 -1.183 2.382 -1.249 2.61 -1.249 c
+2.756 -1.249 2.881 -1.228 2.992 -1.176 c
+3.098 -1.118 3.201 -1.029 3.3 -0.912 c
+3.55 -1.22 l
+3.344 -1.525 3.021 -1.676 2.58 -1.676 c
+2.536 0.999 m
+2.33 0.999 2.176 0.929 2.08 0.793 c
+1.981 0.654 1.926 0.44 1.918 0.147 c
+3.094 0.147 l
+3.094 0.22 l
+3.072 0.492 3.021 0.69 2.933 0.808 c
+2.845 0.933 2.712 0.999 2.536 0.999 c
+4.447 1.367 m
+4.462 1.087 l
+4.638 1.311 4.877 1.425 5.182 1.425 c
+5.513 1.425 5.744 1.278 5.873 0.985 c
+6.056 1.278 6.317 1.425 6.652 1.425 c
+7.21 1.425 7.493 1.08 7.504 0.397 c
+7.504 -1.617 l
+7.019 -1.617 l
+7.019 0.353 l
+7.019 0.565 6.978 0.723 6.901 0.823 c
+6.82 0.929 6.689 0.985 6.504 0.985 c
+6.357 0.985 6.24 0.926 6.151 0.808 c
+6.064 0.698 6.008 0.558 5.991 0.382 c
+5.991 -1.617 l
+5.505 -1.617 l
+5.505 0.367 l
+5.494 0.779 5.322 0.985 4.991 0.985 c
+4.744 0.985 4.572 0.86 4.476 0.617 c
+4.476 -1.617 l
+3.992 -1.617 l
+3.992 1.367 l
+h
+7.849 0.014 m
+7.849 0.444 7.952 0.786 8.158 1.043 c
+8.372 1.297 8.651 1.425 8.996 1.425 c
+9.338 1.425 9.613 1.297 9.819 1.043 c
+10.032 0.797 10.147 0.463 10.157 0.044 c
+10.157 -0.265 l
+10.157 -0.699 10.047 -1.04 9.834 -1.294 c
+9.628 -1.551 9.349 -1.676 8.996 -1.676 c
+8.651 -1.676 8.379 -1.555 8.173 -1.309 c
+7.967 -1.066 7.857 -0.732 7.849 -0.309 c
+h
+8.335 -0.265 m
+8.335 -0.581 8.393 -0.823 8.511 -1 c
+8.636 -1.169 8.798 -1.249 8.996 -1.249 c
+9.426 -1.249 9.65 -0.941 9.673 -0.324 c
+9.673 0.014 l
+9.673 0.316 9.606 0.558 9.482 0.735 c
+9.363 0.911 9.202 0.999 8.996 0.999 c
+8.798 0.999 8.636 0.911 8.511 0.735 c
+8.393 0.558 8.335 0.316 8.335 0.014 c
+h
+11.231 2.087 m
+11.231 1.367 l
+11.686 1.367 l
+11.686 0.97 l
+11.231 0.97 l
+11.231 -0.882 l
+11.231 -1 11.248 -1.088 11.289 -1.147 c
+11.326 -1.206 11.396 -1.235 11.495 -1.235 c
+11.554 -1.235 11.616 -1.228 11.686 -1.206 c
+11.686 -1.617 l
+11.568 -1.654 11.454 -1.676 11.348 -1.676 c
+11.15 -1.676 10.999 -1.61 10.893 -1.47 c
+10.793 -1.334 10.745 -1.139 10.745 -0.882 c
+10.745 0.97 l
+10.29 0.97 l
+10.29 1.367 l
+10.745 1.367 l
+10.745 2.087 l
+h
+13.207 -1.676 m
+12.833 -1.676 12.549 -1.569 12.355 -1.353 c
+12.156 -1.129 12.061 -0.802 12.061 -0.368 c
+12.061 0 l
+12.061 0.44 12.152 0.786 12.341 1.043 c
+12.535 1.297 12.811 1.425 13.164 1.425 c
+13.505 1.425 13.758 1.311 13.928 1.087 c
+14.104 0.86 14.196 0.515 14.207 0.044 c
+14.207 -0.265 l
+12.546 -0.265 l
+12.546 -0.339 l
+12.546 -0.661 12.605 -0.897 12.723 -1.044 c
+12.84 -1.183 13.009 -1.249 13.237 -1.249 c
+13.384 -1.249 13.509 -1.228 13.619 -1.176 c
+13.725 -1.118 13.829 -1.029 13.928 -0.912 c
+14.178 -1.22 l
+13.972 -1.525 13.648 -1.676 13.207 -1.676 c
+13.164 0.999 m
+12.958 0.999 12.803 0.929 12.707 0.793 c
+12.609 0.654 12.553 0.44 12.546 0.147 c
+13.722 0.147 l
+13.722 0.22 l
+13.7 0.492 13.648 0.69 13.56 0.808 c
+13.472 0.933 13.34 0.999 13.164 0.999 c
+17.058 0.911 m
+16.989 0.918 16.915 0.926 16.838 0.926 c
+16.581 0.926 16.405 0.786 16.309 0.515 c
+16.309 -1.617 l
+15.824 -1.617 l
+15.824 1.367 l
+16.294 1.367 l
+16.309 1.058 l
+16.434 1.3 16.617 1.425 16.852 1.425 c
+16.93 1.425 16.993 1.411 17.044 1.381 c
+h
+18.437 -1.676 m
+18.062 -1.676 17.779 -1.569 17.584 -1.353 c
+17.386 -1.129 17.29 -0.802 17.29 -0.368 c
+17.29 0 l
+17.29 0.44 17.382 0.786 17.569 1.043 c
+17.764 1.297 18.04 1.425 18.392 1.425 c
+18.734 1.425 18.988 1.311 19.157 1.087 c
+19.333 0.86 19.425 0.515 19.437 0.044 c
+19.437 -0.265 l
+17.775 -0.265 l
+17.775 -0.339 l
+17.775 -0.661 17.834 -0.897 17.951 -1.044 c
+18.069 -1.183 18.238 -1.249 18.466 -1.249 c
+18.613 -1.249 18.738 -1.228 18.849 -1.176 c
+18.955 -1.118 19.057 -1.029 19.157 -0.912 c
+19.406 -1.22 l
+19.201 -1.525 18.878 -1.676 18.437 -1.676 c
+18.392 0.999 m
+18.186 0.999 18.032 0.929 17.937 0.793 c
+17.837 0.654 17.783 0.44 17.775 0.147 c
+18.951 0.147 l
+18.951 0.22 l
+18.929 0.492 18.878 0.69 18.789 0.808 c
+18.701 0.933 18.569 0.999 18.392 0.999 c
+21.993 -0.265 m
+21.993 -0.736 21.909 -1.088 21.744 -1.324 c
+21.575 -1.559 21.336 -1.676 21.024 -1.676 c
+20.719 -1.676 20.487 -1.565 20.333 -1.338 c
+20.333 -2.764 l
+19.848 -2.764 l
+19.848 1.367 l
+20.289 1.367 l
+20.318 1.028 l
+20.472 1.294 20.704 1.425 21.009 1.425 c
+21.34 1.425 21.586 1.308 21.744 1.072 c
+21.909 0.845 21.993 0.507 21.993 0.058 c
+h
+21.509 0.014 m
+21.509 0.345 21.454 0.592 21.347 0.75 c
+21.247 0.904 21.086 0.985 20.862 0.985 c
+20.627 0.985 20.451 0.867 20.333 0.632 c
+20.333 -0.912 l
+20.451 -1.139 20.63 -1.249 20.877 -1.249 c
+21.089 -1.249 21.247 -1.172 21.347 -1.014 c
+21.454 -0.86 21.509 -0.618 21.509 -0.294 c
+h
+22.346 0.014 m
+22.346 0.444 22.45 0.786 22.655 1.043 c
+22.868 1.297 23.148 1.425 23.493 1.425 c
+23.835 1.425 24.11 1.297 24.316 1.043 c
+24.53 0.797 24.644 0.463 24.654 0.044 c
+24.654 -0.265 l
+24.654 -0.699 24.544 -1.04 24.331 -1.294 c
+24.125 -1.551 23.846 -1.676 23.493 -1.676 c
+23.148 -1.676 22.876 -1.555 22.67 -1.309 c
+22.464 -1.066 22.354 -0.732 22.346 -0.309 c
+h
+22.832 -0.265 m
+22.832 -0.581 22.89 -0.823 23.008 -1 c
+23.133 -1.169 23.295 -1.249 23.493 -1.249 c
+23.923 -1.249 24.147 -0.941 24.169 -0.324 c
+24.169 0.014 l
+24.169 0.316 24.103 0.558 23.979 0.735 c
+23.861 0.911 23.699 0.999 23.493 0.999 c
+23.295 0.999 23.133 0.911 23.008 0.735 c
+22.89 0.558 22.832 0.316 22.832 0.014 c
+h
+26.535 -0.853 m
+26.535 -0.746 26.495 -0.659 26.418 -0.588 c
+26.337 -0.511 26.186 -0.423 25.962 -0.324 c
+25.698 -0.217 25.511 -0.125 25.404 -0.044 c
+25.294 0.033 25.216 0.121 25.169 0.22 c
+25.118 0.316 25.095 0.434 25.095 0.573 c
+25.095 0.816 25.184 1.018 25.359 1.176 c
+25.536 1.341 25.76 1.425 26.036 1.425 c
+26.33 1.425 26.566 1.338 26.741 1.161 c
+26.918 0.992 27.006 0.779 27.006 0.515 c
+26.521 0.515 l
+26.521 0.65 26.47 0.764 26.375 0.852 c
+26.286 0.947 26.172 0.999 26.036 0.999 c
+25.889 0.999 25.775 0.959 25.698 0.881 c
+25.617 0.812 25.581 0.712 25.581 0.588 c
+25.581 0.488 25.61 0.411 25.669 0.353 c
+25.727 0.294 25.867 0.213 26.095 0.118 c
+26.454 -0.03 26.701 -0.173 26.83 -0.309 c
+26.965 -0.437 27.036 -0.611 27.036 -0.823 c
+27.036 -1.081 26.94 -1.287 26.757 -1.441 c
+26.58 -1.599 26.344 -1.676 26.051 -1.676 c
+25.735 -1.676 25.481 -1.588 25.286 -1.411 c
+25.099 -1.228 25.007 -0.996 25.007 -0.721 c
+25.492 -0.721 l
+25.5 -0.89 25.551 -1.022 25.639 -1.118 c
+25.735 -1.206 25.874 -1.249 26.051 -1.249 c
+26.205 -1.249 26.323 -1.216 26.404 -1.147 c
+26.492 -1.081 26.535 -0.981 26.535 -0.853 c
+28.021 -1.617 -0.501 2.984 re
+28.05 2.161 m
+28.05 2.072 28.024 1.999 27.977 1.94 c
+27.936 1.888 27.866 1.866 27.771 1.866 c
+27.682 1.866 27.613 1.888 27.565 1.94 c
+27.524 1.999 27.506 2.065 27.506 2.146 c
+27.506 2.234 27.524 2.308 27.565 2.366 c
+27.613 2.425 27.682 2.454 27.771 2.454 c
+27.866 2.454 27.936 2.425 27.977 2.366 c
+28.024 2.308 28.05 2.238 28.05 2.161 c
+29.328 2.087 m
+29.328 1.367 l
+29.785 1.367 l
+29.785 0.97 l
+29.328 0.97 l
+29.328 -0.882 l
+29.328 -1 29.347 -1.088 29.388 -1.147 c
+29.424 -1.206 29.494 -1.235 29.593 -1.235 c
+29.652 -1.235 29.714 -1.228 29.785 -1.206 c
+29.785 -1.617 l
+29.667 -1.654 29.552 -1.676 29.446 -1.676 c
+29.248 -1.676 29.097 -1.61 28.991 -1.47 c
+28.891 -1.334 28.844 -1.139 28.844 -0.882 c
+28.844 0.97 l
+28.388 0.97 l
+28.388 1.367 l
+28.844 1.367 l
+28.844 2.087 l
+h
+30.097 0.014 m
+30.097 0.444 30.2 0.786 30.406 1.043 c
+30.618 1.297 30.898 1.425 31.243 1.425 c
+31.585 1.425 31.861 1.297 32.066 1.043 c
+32.28 0.797 32.393 0.463 32.405 0.044 c
+32.405 -0.265 l
+32.405 -0.699 32.295 -1.04 32.081 -1.294 c
+31.875 -1.551 31.596 -1.676 31.243 -1.676 c
+30.898 -1.676 30.626 -1.555 30.42 -1.309 c
+30.215 -1.066 30.104 -0.732 30.097 -0.309 c
+h
+30.582 -0.265 m
+30.582 -0.581 30.641 -0.823 30.758 -1 c
+30.883 -1.169 31.044 -1.249 31.243 -1.249 c
+31.673 -1.249 31.898 -0.941 31.919 -0.324 c
+31.919 0.014 l
+31.919 0.316 31.853 0.558 31.728 0.735 c
+31.611 0.911 31.449 0.999 31.243 0.999 c
+31.044 0.999 30.883 0.911 30.758 0.735 c
+30.641 0.558 30.582 0.316 30.582 0.014 c
+h
+34.076 0.911 m
+34.007 0.918 33.933 0.926 33.856 0.926 c
+33.598 0.926 33.423 0.786 33.327 0.515 c
+33.327 -1.617 l
+32.842 -1.617 l
+32.842 1.367 l
+33.313 1.367 l
+33.327 1.058 l
+33.452 1.3 33.635 1.425 33.87 1.425 c
+33.948 1.425 34.011 1.411 34.061 1.381 c
+h
+35.308 -0.809 m
+35.852 1.367 l
+36.366 1.367 l
+35.395 -2.043 l
+35.326 -2.297 35.223 -2.488 35.087 -2.617 c
+34.948 -2.753 34.797 -2.822 34.631 -2.822 c
+34.562 -2.822 34.477 -2.808 34.381 -2.778 c
+34.381 -2.367 l
+34.485 -2.382 l
+34.62 -2.382 34.726 -2.345 34.807 -2.278 c
+34.896 -2.209 34.962 -2.091 35.013 -1.926 c
+35.102 -1.588 l
+34.234 1.367 l
+34.763 1.367 l
+h
+f
+Q
+ endstream endobj 39 0 obj <</BBox[547.65 453.562 561.199 449.27]/Group 75 0 R/Length 3370/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 548.1057 452.3131 cm
+0 0 m
+0.015 -0.324 l
+0.198 -0.07 0.441 0.058 0.736 0.058 c
+1.264 0.058 1.533 -0.294 1.544 -1 c
+1.544 -2.984 l
+1.058 -2.984 l
+1.058 -1.029 l
+1.058 -0.794 1.018 -0.628 0.941 -0.53 c
+0.86 -0.434 0.742 -0.382 0.588 -0.382 c
+0.47 -0.382 0.36 -0.422 0.265 -0.5 c
+0.166 -0.58 0.088 -0.688 0.03 -0.823 c
+0.03 -2.984 l
+-0.455 -2.984 l
+-0.455 0 l
+h
+3.628 -2.984 m
+3.598 -2.918 3.576 -2.808 3.568 -2.66 c
+3.392 -2.918 3.172 -3.043 2.907 -3.043 c
+2.631 -3.043 2.415 -2.969 2.261 -2.822 c
+2.113 -2.668 2.04 -2.452 2.04 -2.176 c
+2.04 -1.874 2.143 -1.632 2.348 -1.455 c
+2.554 -1.272 2.837 -1.176 3.201 -1.176 c
+3.554 -1.176 l
+3.554 -0.852 l
+3.554 -0.676 3.514 -0.555 3.437 -0.485 c
+3.356 -0.408 3.238 -0.368 3.084 -0.368 c
+2.937 -0.368 2.812 -0.412 2.716 -0.5 c
+2.628 -0.588 2.583 -0.698 2.583 -0.823 c
+2.099 -0.823 l
+2.099 -0.676 2.143 -0.537 2.231 -0.397 c
+2.319 -0.25 2.437 -0.14 2.583 -0.059 c
+2.739 0.018 2.911 0.058 3.098 0.058 c
+3.41 0.058 3.645 -0.023 3.803 -0.177 c
+3.958 -0.324 4.039 -0.544 4.039 -0.838 c
+4.039 -2.338 l
+4.046 -2.573 4.083 -2.774 4.142 -2.94 c
+4.142 -2.984 l
+h
+2.98 -2.602 m
+3.098 -2.602 3.209 -2.569 3.319 -2.499 c
+3.425 -2.433 3.502 -2.348 3.554 -2.249 c
+3.554 -1.544 l
+3.289 -1.544 l
+3.054 -1.544 2.866 -1.595 2.731 -1.69 c
+2.602 -1.79 2.54 -1.933 2.54 -2.117 c
+2.54 -2.286 2.569 -2.407 2.628 -2.484 c
+2.694 -2.565 2.812 -2.602 2.98 -2.602 c
+5.075 0 m
+5.09 -0.279 l
+5.266 -0.056 5.505 0.058 5.81 0.058 c
+6.141 0.058 6.373 -0.088 6.501 -0.382 c
+6.685 -0.088 6.945 0.058 7.28 0.058 c
+7.838 0.058 8.121 -0.287 8.133 -0.97 c
+8.133 -2.984 l
+7.647 -2.984 l
+7.647 -1.014 l
+7.647 -0.802 7.607 -0.643 7.53 -0.544 c
+7.449 -0.437 7.317 -0.382 7.133 -0.382 c
+6.986 -0.382 6.868 -0.441 6.78 -0.559 c
+6.692 -0.669 6.637 -0.809 6.619 -0.985 c
+6.619 -2.984 l
+6.134 -2.984 l
+6.134 -1 l
+6.122 -0.588 5.95 -0.382 5.619 -0.382 c
+5.373 -0.382 5.2 -0.507 5.104 -0.75 c
+5.104 -2.984 l
+4.62 -2.984 l
+4.62 0 l
+h
+9.639 -3.043 m
+9.264 -3.043 8.981 -2.936 8.787 -2.72 c
+8.588 -2.496 8.493 -2.168 8.493 -1.735 c
+8.493 -1.367 l
+8.493 -0.927 8.584 -0.58 8.772 -0.324 c
+8.967 -0.07 9.243 0.058 9.596 0.058 c
+9.937 0.058 10.19 -0.056 10.359 -0.279 c
+10.536 -0.507 10.628 -0.852 10.639 -1.323 c
+10.639 -1.632 l
+8.978 -1.632 l
+8.978 -1.706 l
+8.978 -2.028 9.037 -2.263 9.154 -2.411 c
+9.272 -2.55 9.441 -2.616 9.669 -2.616 c
+9.816 -2.616 9.941 -2.595 10.051 -2.543 c
+10.157 -2.484 10.261 -2.396 10.359 -2.278 c
+10.61 -2.587 l
+10.404 -2.892 10.08 -3.043 9.639 -3.043 c
+9.596 -0.368 m
+9.39 -0.368 9.235 -0.437 9.139 -0.574 c
+9.041 -0.713 8.985 -0.927 8.978 -1.22 c
+10.153 -1.22 l
+10.153 -1.147 l
+10.132 -0.875 10.08 -0.676 9.993 -0.559 c
+9.904 -0.434 9.771 -0.368 9.596 -0.368 c
+10.947 -1.353 m
+10.947 -0.893 11.028 -0.544 11.198 -0.309 c
+11.374 -0.067 11.624 0.058 11.947 0.058 c
+12.23 0.058 12.451 -0.059 12.609 -0.294 c
+12.609 1.249 l
+13.093 1.249 l
+13.093 -2.984 l
+12.653 -2.984 l
+12.623 -2.66 l
+12.465 -2.918 12.241 -3.043 11.947 -3.043 c
+11.631 -3.043 11.389 -2.926 11.212 -2.691 c
+11.036 -2.448 10.947 -2.103 10.947 -1.661 c
+h
+11.433 -1.632 m
+11.433 -1.966 11.481 -2.213 11.58 -2.367 c
+11.676 -2.525 11.836 -2.602 12.065 -2.602 c
+12.307 -2.602 12.491 -2.484 12.609 -2.249 c
+12.609 -0.735 l
+12.48 -0.5 12.3 -0.382 12.065 -0.382 c
+11.836 -0.382 11.676 -0.463 11.58 -0.617 c
+11.481 -0.775 11.433 -1.014 11.433 -1.338 c
+h
+f
+Q
+ endstream endobj 40 0 obj <</BBox[628.727 237.005 656.757 232.713]/Group 76 0 R/Length 5146/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 630.1232 234.7709 cm
+0 0 m
+0.808 2.013 l
+1.382 2.013 l
+0.25 -0.5 l
+0.25 -1.999 l
+-0.264 -1.999 l
+-0.264 -0.5 l
+-1.396 2.013 l
+-0.823 2.013 l
+h
+1.386 -0.368 m
+1.386 0.062 1.488 0.404 1.694 0.661 c
+1.907 0.914 2.186 1.043 2.531 1.043 c
+2.874 1.043 3.15 0.914 3.355 0.661 c
+3.568 0.415 3.682 0.081 3.693 -0.339 c
+3.693 -0.647 l
+3.693 -1.081 3.583 -1.422 3.37 -1.676 c
+3.164 -1.933 2.884 -2.058 2.531 -2.058 c
+2.186 -2.058 1.914 -1.937 1.708 -1.691 c
+1.503 -1.448 1.392 -1.114 1.386 -0.691 c
+h
+1.87 -0.647 m
+1.87 -0.963 1.93 -1.206 2.047 -1.382 c
+2.172 -1.551 2.333 -1.632 2.531 -1.632 c
+2.961 -1.632 3.186 -1.324 3.208 -0.706 c
+3.208 -0.368 l
+3.208 -0.067 3.142 0.176 3.017 0.353 c
+2.899 0.529 2.738 0.617 2.531 0.617 c
+2.333 0.617 2.172 0.529 2.047 0.353 c
+1.93 0.176 1.87 -0.067 1.87 -0.368 c
+h
+5.644 -1.735 m
+5.486 -1.952 5.251 -2.058 4.939 -2.058 c
+4.674 -2.058 4.469 -1.966 4.322 -1.779 c
+4.182 -1.595 4.116 -1.32 4.116 -0.956 c
+4.116 0.985 l
+4.601 0.985 l
+4.601 -0.927 l
+4.601 -1.389 4.74 -1.617 5.027 -1.617 c
+5.321 -1.617 5.519 -1.484 5.629 -1.22 c
+5.629 0.985 l
+6.13 0.985 l
+6.13 -1.999 l
+5.659 -1.999 l
+h
+7.783 -0.368 m
+7.783 0.091 7.864 0.44 8.033 0.675 c
+8.21 0.918 8.459 1.043 8.783 1.043 c
+9.066 1.043 9.286 0.926 9.444 0.691 c
+9.444 2.234 l
+9.93 2.234 l
+9.93 -1.999 l
+9.488 -1.999 l
+9.459 -1.676 l
+9.301 -1.933 9.076 -2.058 8.783 -2.058 c
+8.467 -2.058 8.224 -1.941 8.048 -1.706 c
+7.871 -1.463 7.783 -1.118 7.783 -0.676 c
+h
+8.268 -0.647 m
+8.268 -0.981 8.316 -1.228 8.415 -1.382 c
+8.511 -1.54 8.673 -1.617 8.9 -1.617 c
+9.143 -1.617 9.326 -1.5 9.444 -1.264 c
+9.444 0.249 l
+9.315 0.484 9.135 0.602 8.9 0.602 c
+8.673 0.602 8.511 0.521 8.415 0.367 c
+8.316 0.209 8.268 -0.03 8.268 -0.353 c
+h
+10.396 -0.368 m
+10.396 0.062 10.499 0.404 10.705 0.661 c
+10.917 0.914 11.197 1.043 11.543 1.043 c
+11.884 1.043 12.16 0.914 12.366 0.661 c
+12.579 0.415 12.692 0.081 12.704 -0.339 c
+12.704 -0.647 l
+12.704 -1.081 12.594 -1.422 12.38 -1.676 c
+12.174 -1.933 11.896 -2.058 11.543 -2.058 c
+11.197 -2.058 10.925 -1.937 10.72 -1.691 c
+10.514 -1.448 10.404 -1.114 10.396 -0.691 c
+h
+10.881 -0.647 m
+10.881 -0.963 10.94 -1.206 11.057 -1.382 c
+11.183 -1.551 11.344 -1.632 11.543 -1.632 c
+11.973 -1.632 12.197 -1.324 12.218 -0.706 c
+12.218 -0.368 l
+12.218 -0.067 12.153 0.176 12.027 0.353 c
+11.91 0.529 11.748 0.617 11.543 0.617 c
+11.344 0.617 11.183 0.529 11.057 0.353 c
+10.94 0.176 10.881 -0.067 10.881 -0.368 c
+h
+15.879 -1.999 m
+15.85 -1.933 15.827 -1.823 15.819 -1.676 c
+15.644 -1.933 15.423 -2.058 15.158 -2.058 c
+14.883 -2.058 14.666 -1.985 14.512 -1.837 c
+14.365 -1.683 14.291 -1.467 14.291 -1.191 c
+14.291 -0.89 14.394 -0.647 14.6 -0.47 c
+14.805 -0.287 15.089 -0.191 15.453 -0.191 c
+15.805 -0.191 l
+15.805 0.132 l
+15.805 0.309 15.765 0.43 15.688 0.5 c
+15.607 0.577 15.489 0.617 15.335 0.617 c
+15.188 0.617 15.063 0.573 14.967 0.484 c
+14.879 0.397 14.835 0.286 14.835 0.162 c
+14.35 0.162 l
+14.35 0.309 14.394 0.448 14.483 0.588 c
+14.57 0.735 14.688 0.845 14.835 0.926 c
+14.99 1.003 15.162 1.043 15.349 1.043 c
+15.661 1.043 15.897 0.962 16.055 0.808 c
+16.209 0.661 16.29 0.44 16.29 0.147 c
+16.29 -1.353 l
+16.297 -1.588 16.334 -1.79 16.393 -1.955 c
+16.393 -1.999 l
+h
+15.232 -1.617 m
+15.349 -1.617 15.46 -1.584 15.57 -1.515 c
+15.676 -1.448 15.754 -1.364 15.805 -1.264 c
+15.805 -0.559 l
+15.541 -0.559 l
+15.306 -0.559 15.118 -0.611 14.982 -0.706 c
+14.853 -0.805 14.791 -0.948 14.791 -1.132 c
+14.791 -1.301 14.82 -1.422 14.879 -1.5 c
+14.946 -1.58 15.063 -1.617 15.232 -1.617 c
+17.4 -1.999 -0.5 4.233 re
+18.601 -1.999 -0.5 4.233 re
+21.111 1.705 m
+21.111 0.985 l
+21.567 0.985 l
+21.567 0.588 l
+21.111 0.588 l
+21.111 -1.264 l
+21.111 -1.382 21.13 -1.47 21.17 -1.529 c
+21.207 -1.588 21.277 -1.617 21.376 -1.617 c
+21.435 -1.617 21.498 -1.61 21.567 -1.588 c
+21.567 -1.999 l
+21.45 -2.036 21.336 -2.058 21.229 -2.058 c
+21.03 -2.058 20.88 -1.992 20.773 -1.852 c
+20.675 -1.717 20.627 -1.521 20.627 -1.264 c
+20.627 0.588 l
+20.17 0.588 l
+20.17 0.985 l
+20.627 0.985 l
+20.627 1.705 l
+h
+22.519 0.675 m
+22.703 0.918 22.938 1.043 23.225 1.043 c
+23.754 1.043 24.022 0.691 24.033 -0.015 c
+24.033 -1.999 l
+23.548 -1.999 l
+23.548 -0.044 l
+23.548 0.191 23.507 0.357 23.43 0.455 c
+23.349 0.551 23.232 0.602 23.077 0.602 c
+22.96 0.602 22.85 0.562 22.755 0.484 c
+22.655 0.404 22.578 0.297 22.519 0.162 c
+22.519 -1.999 l
+22.034 -1.999 l
+22.034 2.234 l
+22.519 2.234 l
+h
+25.635 -2.058 m
+25.261 -2.058 24.978 -1.952 24.783 -1.735 c
+24.584 -1.511 24.488 -1.183 24.488 -0.75 c
+24.488 -0.383 l
+24.488 0.058 24.581 0.404 24.768 0.661 c
+24.962 0.914 25.238 1.043 25.591 1.043 c
+25.932 1.043 26.186 0.929 26.356 0.706 c
+26.532 0.478 26.624 0.132 26.634 -0.339 c
+26.634 -0.647 l
+24.974 -0.647 l
+24.974 -0.721 l
+24.974 -1.044 25.032 -1.279 25.15 -1.426 c
+25.267 -1.565 25.437 -1.632 25.664 -1.632 c
+25.812 -1.632 25.936 -1.61 26.047 -1.559 c
+26.154 -1.5 26.256 -1.411 26.356 -1.294 c
+26.605 -1.602 l
+26.399 -1.908 26.076 -2.058 25.635 -2.058 c
+25.591 0.617 m
+25.385 0.617 25.231 0.548 25.136 0.411 c
+25.036 0.272 24.981 0.058 24.974 -0.235 c
+26.15 -0.235 l
+26.15 -0.162 l
+26.127 0.11 26.076 0.309 25.988 0.426 c
+25.899 0.551 25.768 0.617 25.591 0.617 c
+f
+Q
+ endstream endobj 41 0 obj <</BBox[562.794 453.503 574.785 448.153]/Group 77 0 R/Length 2760/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 562.7944 450.9161 cm
+0 0 m
+0 0.449 0.106 0.802 0.323 1.058 c
+0.536 1.324 0.83 1.455 1.205 1.455 c
+1.587 1.455 1.881 1.324 2.087 1.058 c
+2.3 0.802 2.41 0.449 2.41 0 c
+2.41 -0.191 l
+2.41 -0.654 2.3 -1.01 2.087 -1.263 c
+1.881 -1.521 1.587 -1.646 1.205 -1.646 c
+0.823 -1.646 0.521 -1.521 0.309 -1.263 c
+0.103 -0.999 0 -0.643 0 -0.191 c
+h
+0.779 -0.191 m
+0.779 -0.731 0.918 -0.999 1.205 -0.999 c
+1.469 -0.999 1.61 -0.775 1.631 -0.323 c
+1.646 0 l
+1.646 0.272 1.606 0.474 1.529 0.603 c
+1.448 0.739 1.341 0.809 1.205 0.809 c
+1.076 0.809 0.974 0.739 0.897 0.603 c
+0.816 0.474 0.779 0.272 0.779 0 c
+h
+4.182 0.647 m
+3.931 0.662 l
+3.715 0.662 3.568 0.566 3.491 0.383 c
+3.491 -1.587 l
+2.711 -1.587 l
+2.711 1.397 l
+3.447 1.397 l
+3.476 1.073 l
+3.594 1.327 3.759 1.455 3.976 1.455 c
+4.064 1.455 4.137 1.441 4.197 1.411 c
+h
+5.284 -1.587 -0.779 2.984 re
+4.461 2.161 m
+4.461 2.286 4.498 2.389 4.579 2.469 c
+4.656 2.547 4.758 2.587 4.887 2.587 c
+5.012 2.587 5.115 2.547 5.196 2.469 c
+5.273 2.389 5.313 2.286 5.313 2.161 c
+5.313 2.043 5.273 1.945 5.196 1.867 c
+5.126 1.786 5.024 1.75 4.887 1.75 c
+4.758 1.75 4.656 1.786 4.579 1.867 c
+4.498 1.945 4.461 2.043 4.461 2.161 c
+5.703 0 m
+5.703 0.489 5.791 0.853 5.967 1.088 c
+6.144 1.33 6.387 1.455 6.703 1.455 c
+6.975 1.455 7.187 1.345 7.335 1.133 c
+7.364 1.397 l
+8.07 1.397 l
+8.07 -1.587 l
+8.07 -1.969 7.96 -2.256 7.746 -2.454 c
+7.53 -2.66 7.224 -2.763 6.834 -2.763 c
+6.666 -2.763 6.489 -2.726 6.306 -2.66 c
+6.129 -2.601 5.997 -2.516 5.909 -2.41 c
+6.173 -1.881 l
+6.25 -1.947 6.35 -2.006 6.468 -2.057 c
+6.585 -2.105 6.692 -2.131 6.79 -2.131 c
+6.967 -2.131 7.092 -2.087 7.173 -1.999 c
+7.25 -1.918 7.291 -1.786 7.291 -1.602 c
+7.291 -1.352 l
+7.143 -1.55 6.945 -1.646 6.703 -1.646 c
+6.387 -1.646 6.144 -1.525 5.967 -1.278 c
+5.791 -1.024 5.703 -0.672 5.703 -0.22 c
+h
+6.482 -0.205 m
+6.482 -0.481 6.515 -0.683 6.585 -0.808 c
+6.662 -0.926 6.78 -0.984 6.938 -0.984 c
+7.092 -0.984 7.21 -0.933 7.291 -0.823 c
+7.291 0.603 l
+7.21 0.728 7.092 0.794 6.938 0.794 c
+6.78 0.794 6.662 0.728 6.585 0.603 c
+6.515 0.474 6.482 0.272 6.482 0 c
+h
+9.267 -1.587 -0.779 2.984 re
+8.444 2.161 m
+8.444 2.286 8.481 2.389 8.562 2.469 c
+8.639 2.547 8.742 2.587 8.87 2.587 c
+8.995 2.587 9.099 2.547 9.18 2.469 c
+9.257 2.389 9.296 2.286 9.296 2.161 c
+9.296 2.043 9.257 1.945 9.18 1.867 c
+9.109 1.786 9.007 1.75 8.87 1.75 c
+8.742 1.75 8.639 1.786 8.562 1.867 c
+8.481 1.945 8.444 2.043 8.444 2.161 c
+10.491 1.397 m
+10.506 1.103 l
+10.682 1.338 10.91 1.455 11.197 1.455 c
+11.715 1.455 11.979 1.092 11.991 0.368 c
+11.991 -1.587 l
+11.212 -1.587 l
+11.212 0.31 l
+11.212 0.485 11.185 0.607 11.138 0.676 c
+11.087 0.754 10.998 0.794 10.873 0.794 c
+10.726 0.794 10.612 0.721 10.535 0.574 c
+10.535 -1.587 l
+9.756 -1.587 l
+9.756 1.397 l
+h
+f
+Q
+ endstream endobj 42 0 obj <</BBox[575.101 453.401 577.027 449.3]/Group 78 0 R/Length 944/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 575.7475 450.4608 cm
+0 0 m
+0 0.214 0.019 0.389 0.059 0.53 c
+0.106 0.676 0.221 0.852 0.397 1.058 c
+0.603 1.309 l
+0.728 1.492 0.794 1.679 0.794 1.866 c
+0.794 2.061 0.75 2.213 0.661 2.323 c
+0.58 2.429 0.47 2.484 0.324 2.484 c
+0.184 2.484 0.067 2.433 -0.029 2.337 c
+-0.118 2.238 -0.162 2.105 -0.162 1.941 c
+-0.646 1.941 l
+-0.646 2.242 -0.559 2.484 -0.382 2.66 c
+-0.199 2.844 0.037 2.94 0.324 2.94 c
+0.617 2.94 0.846 2.844 1.014 2.66 c
+1.191 2.473 1.279 2.219 1.279 1.897 c
+1.279 1.58 1.151 1.268 0.896 0.956 c
+0.647 0.647 l
+0.537 0.5 0.485 0.283 0.485 0 c
+h
+0.264 -0.588 m
+0.353 -0.588 0.42 -0.617 0.47 -0.676 c
+0.518 -0.727 0.544 -0.794 0.544 -0.882 c
+0.544 -0.962 0.518 -1.029 0.47 -1.088 c
+0.42 -1.135 0.353 -1.161 0.264 -1.161 c
+0.166 -1.161 0.092 -1.135 0.044 -1.088 c
+0.004 -1.029 -0.014 -0.962 -0.014 -0.882 c
+-0.014 -0.794 0.004 -0.727 0.044 -0.676 c
+0.092 -0.617 0.166 -0.588 0.264 -0.588 c
+f
+Q
+ endstream endobj 43 0 obj <</BBox[539.629 446.977 584.802 441.539]/Group 79 0 R/Length 9416/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 541.0248 444.743 cm
+0 0 m
+0.808 2.014 l
+1.382 2.014 l
+0.25 -0.5 l
+0.25 -1.999 l
+-0.264 -1.999 l
+-0.264 -0.5 l
+-1.396 2.014 l
+-0.823 2.014 l
+h
+1.386 -0.368 m
+1.386 0.062 1.488 0.405 1.694 0.661 c
+1.907 0.915 2.186 1.043 2.532 1.043 c
+2.874 1.043 3.15 0.915 3.355 0.661 c
+3.568 0.415 3.682 0.081 3.693 -0.338 c
+3.693 -0.647 l
+3.693 -1.081 3.583 -1.422 3.37 -1.675 c
+3.164 -1.933 2.884 -2.058 2.532 -2.058 c
+2.186 -2.058 1.914 -1.937 1.708 -1.69 c
+1.503 -1.448 1.393 -1.114 1.386 -0.69 c
+h
+1.87 -0.647 m
+1.87 -0.963 1.93 -1.205 2.047 -1.382 c
+2.172 -1.551 2.334 -1.631 2.532 -1.631 c
+2.962 -1.631 3.186 -1.323 3.208 -0.706 c
+3.208 -0.368 l
+3.208 -0.066 3.142 0.176 3.017 0.353 c
+2.899 0.529 2.738 0.617 2.532 0.617 c
+2.334 0.617 2.172 0.529 2.047 0.353 c
+1.93 0.176 1.87 -0.066 1.87 -0.368 c
+h
+5.644 -1.735 m
+5.486 -1.951 5.251 -2.058 4.939 -2.058 c
+4.675 -2.058 4.469 -1.966 4.322 -1.779 c
+4.182 -1.595 4.116 -1.319 4.116 -0.956 c
+4.116 0.985 l
+4.601 0.985 l
+4.601 -0.926 l
+4.601 -1.389 4.74 -1.617 5.027 -1.617 c
+5.321 -1.617 5.519 -1.484 5.629 -1.22 c
+5.629 0.985 l
+6.13 0.985 l
+6.13 -1.999 l
+5.659 -1.999 l
+h
+7.008 1.926 m
+6.963 0.912 l
+6.596 0.912 l
+6.611 2.234 l
+7.008 2.234 l
+h
+8.438 -1.264 m
+9.01 0.985 l
+9.51 0.985 l
+8.613 -1.999 l
+8.261 -1.999 l
+7.364 0.985 l
+7.85 0.985 l
+h
+10.881 -2.058 m
+10.506 -2.058 10.223 -1.951 10.028 -1.735 c
+9.83 -1.511 9.735 -1.183 9.735 -0.75 c
+9.735 -0.382 l
+9.735 0.058 9.826 0.405 10.014 0.661 c
+10.209 0.915 10.485 1.043 10.837 1.043 c
+11.179 1.043 11.432 0.929 11.601 0.706 c
+11.778 0.478 11.869 0.133 11.881 -0.338 c
+11.881 -0.647 l
+10.219 -0.647 l
+10.219 -0.721 l
+10.219 -1.043 10.279 -1.278 10.396 -1.426 c
+10.514 -1.565 10.683 -1.631 10.911 -1.631 c
+11.057 -1.631 11.183 -1.61 11.293 -1.558 c
+11.399 -1.5 11.502 -1.411 11.601 -1.294 c
+11.852 -1.602 l
+11.645 -1.907 11.322 -2.058 10.881 -2.058 c
+10.837 0.617 m
+10.631 0.617 10.477 0.548 10.381 0.411 c
+10.282 0.272 10.227 0.058 10.219 -0.235 c
+11.395 -0.235 l
+11.395 -0.162 l
+11.374 0.11 11.322 0.309 11.233 0.426 c
+11.146 0.551 11.013 0.617 10.837 0.617 c
+15.64 -0.647 m
+15.64 -1.118 15.555 -1.47 15.39 -1.706 c
+15.221 -1.941 14.982 -2.058 14.67 -2.058 c
+14.365 -2.058 14.133 -1.947 13.978 -1.72 c
+13.978 -3.146 l
+13.494 -3.146 l
+13.494 0.985 l
+13.935 0.985 l
+13.964 0.646 l
+14.119 0.912 14.35 1.043 14.655 1.043 c
+14.986 1.043 15.232 0.926 15.39 0.69 c
+15.555 0.463 15.64 0.125 15.64 -0.324 c
+h
+15.154 -0.368 m
+15.154 -0.037 15.1 0.21 14.994 0.368 c
+14.894 0.522 14.732 0.603 14.508 0.603 c
+14.273 0.603 14.096 0.485 13.978 0.25 c
+13.978 -1.294 l
+14.096 -1.521 14.277 -1.631 14.523 -1.631 c
+14.736 -1.631 14.894 -1.554 14.994 -1.396 c
+15.1 -1.242 15.154 -1 15.154 -0.676 c
+h
+17.334 0.529 m
+17.264 0.536 17.19 0.544 17.113 0.544 c
+16.856 0.544 16.68 0.405 16.584 0.133 c
+16.584 -1.999 l
+16.099 -1.999 l
+16.099 0.985 l
+16.569 0.985 l
+16.584 0.676 l
+16.709 0.918 16.893 1.043 17.128 1.043 c
+17.205 1.043 17.268 1.029 17.319 0.999 c
+h
+17.547 -0.368 m
+17.547 0.062 17.65 0.405 17.856 0.661 c
+18.069 0.915 18.348 1.043 18.693 1.043 c
+19.035 1.043 19.311 0.915 19.517 0.661 c
+19.73 0.415 19.844 0.081 19.855 -0.338 c
+19.855 -0.647 l
+19.855 -1.081 19.744 -1.422 19.532 -1.675 c
+19.326 -1.933 19.046 -2.058 18.693 -2.058 c
+18.348 -2.058 18.076 -1.937 17.87 -1.69 c
+17.664 -1.448 17.554 -1.114 17.547 -0.69 c
+h
+18.032 -0.647 m
+18.032 -0.963 18.091 -1.205 18.209 -1.382 c
+18.333 -1.551 18.495 -1.631 18.693 -1.631 c
+19.123 -1.631 19.347 -1.323 19.37 -0.706 c
+19.37 -0.368 l
+19.37 -0.066 19.304 0.176 19.179 0.353 c
+19.061 0.529 18.899 0.617 18.693 0.617 c
+18.495 0.617 18.333 0.529 18.209 0.353 c
+18.091 0.176 18.032 -0.066 18.032 -0.368 c
+h
+22.456 -0.647 m
+22.456 -1.118 22.372 -1.47 22.207 -1.706 c
+22.038 -1.941 21.795 -2.058 21.471 -2.058 c
+21.155 -2.058 20.92 -1.922 20.766 -1.646 c
+20.737 -1.999 l
+20.296 -1.999 l
+20.296 2.234 l
+20.781 2.234 l
+20.781 0.661 l
+20.935 0.915 21.167 1.043 21.471 1.043 c
+21.795 1.043 22.038 0.926 22.207 0.69 c
+22.372 0.455 22.456 0.106 22.456 -0.353 c
+h
+21.972 -0.368 m
+21.972 -0.015 21.92 0.235 21.824 0.382 c
+21.725 0.529 21.564 0.603 21.34 0.603 c
+21.093 0.603 20.906 0.463 20.781 0.191 c
+20.781 -1.22 l
+20.899 -1.484 21.089 -1.617 21.354 -1.617 c
+21.567 -1.617 21.725 -1.544 21.824 -1.396 c
+21.92 -1.242 21.972 -1 21.972 -0.676 c
+h
+24.426 -1.999 m
+24.397 -1.933 24.375 -1.823 24.367 -1.675 c
+24.191 -1.933 23.971 -2.058 23.706 -2.058 c
+23.43 -2.058 23.214 -1.984 23.059 -1.837 c
+22.913 -1.683 22.838 -1.467 22.838 -1.191 c
+22.838 -0.889 22.942 -0.647 23.148 -0.47 c
+23.353 -0.287 23.636 -0.191 24 -0.191 c
+24.353 -0.191 l
+24.353 0.133 l
+24.353 0.309 24.312 0.43 24.235 0.5 c
+24.154 0.577 24.037 0.617 23.883 0.617 c
+23.736 0.617 23.611 0.573 23.515 0.485 c
+23.426 0.397 23.383 0.287 23.383 0.162 c
+22.898 0.162 l
+22.898 0.309 22.942 0.448 23.03 0.588 c
+23.118 0.735 23.235 0.845 23.383 0.926 c
+23.537 1.003 23.709 1.043 23.897 1.043 c
+24.209 1.043 24.444 0.962 24.602 0.808 c
+24.757 0.661 24.837 0.441 24.837 0.147 c
+24.837 -1.353 l
+24.845 -1.588 24.882 -1.789 24.941 -1.955 c
+24.941 -1.999 l
+h
+23.779 -1.617 m
+23.897 -1.617 24.008 -1.584 24.118 -1.514 c
+24.224 -1.448 24.301 -1.363 24.353 -1.264 c
+24.353 -0.559 l
+24.089 -0.559 l
+23.853 -0.559 23.665 -0.611 23.53 -0.706 c
+23.401 -0.805 23.339 -0.948 23.339 -1.132 c
+23.339 -1.301 23.368 -1.422 23.426 -1.5 c
+23.493 -1.58 23.611 -1.617 23.779 -1.617 c
+27.579 -0.647 m
+27.579 -1.118 27.495 -1.47 27.329 -1.706 c
+27.16 -1.941 26.917 -2.058 26.595 -2.058 c
+26.279 -2.058 26.043 -1.922 25.889 -1.646 c
+25.859 -1.999 l
+25.419 -1.999 l
+25.419 2.234 l
+25.903 2.234 l
+25.903 0.661 l
+26.058 0.915 26.289 1.043 26.595 1.043 c
+26.917 1.043 27.16 0.926 27.329 0.69 c
+27.495 0.455 27.579 0.106 27.579 -0.353 c
+h
+27.094 -0.368 m
+27.094 -0.015 27.042 0.235 26.948 0.382 c
+26.848 0.529 26.686 0.603 26.462 0.603 c
+26.216 0.603 26.028 0.463 25.903 0.191 c
+25.903 -1.22 l
+26.021 -1.484 26.212 -1.617 26.477 -1.617 c
+26.69 -1.617 26.848 -1.544 26.948 -1.396 c
+27.042 -1.242 27.094 -1 27.094 -0.676 c
+h
+28.553 -1.999 -0.5 4.233 re
+30.034 -1.191 m
+30.578 0.985 l
+31.092 0.985 l
+30.122 -2.425 l
+30.052 -2.679 29.949 -2.87 29.813 -2.999 c
+29.674 -3.135 29.523 -3.204 29.358 -3.204 c
+29.288 -3.204 29.203 -3.19 29.107 -3.16 c
+29.107 -2.749 l
+29.211 -2.764 l
+29.346 -2.764 29.454 -2.727 29.535 -2.66 c
+29.622 -2.591 29.689 -2.473 29.74 -2.308 c
+29.828 -1.97 l
+28.961 0.985 l
+29.49 0.985 l
+h
+33.076 0.985 m
+33.091 0.706 l
+33.267 0.929 33.506 1.043 33.811 1.043 c
+34.142 1.043 34.374 0.897 34.503 0.603 c
+34.686 0.897 34.948 1.043 35.282 1.043 c
+35.84 1.043 36.123 0.698 36.134 0.015 c
+36.134 -1.999 l
+35.649 -1.999 l
+35.649 -0.029 l
+35.649 0.183 35.609 0.341 35.532 0.441 c
+35.451 0.548 35.318 0.603 35.135 0.603 c
+34.987 0.603 34.869 0.544 34.782 0.426 c
+34.694 0.316 34.638 0.176 34.62 0 c
+34.62 -1.999 l
+34.135 -1.999 l
+34.135 -0.015 l
+34.123 0.397 33.951 0.603 33.62 0.603 c
+33.375 0.603 33.202 0.478 33.106 0.235 c
+33.106 -1.999 l
+32.621 -1.999 l
+32.621 0.985 l
+h
+38.111 -1.999 m
+38.082 -1.933 38.06 -1.823 38.052 -1.675 c
+37.876 -1.933 37.655 -2.058 37.391 -2.058 c
+37.115 -2.058 36.899 -1.984 36.744 -1.837 c
+36.597 -1.683 36.523 -1.467 36.523 -1.191 c
+36.523 -0.889 36.627 -0.647 36.832 -0.47 c
+37.038 -0.287 37.321 -0.191 37.685 -0.191 c
+38.038 -0.191 l
+38.038 0.133 l
+38.038 0.309 37.997 0.43 37.92 0.5 c
+37.839 0.577 37.722 0.617 37.568 0.617 c
+37.42 0.617 37.296 0.573 37.2 0.485 c
+37.111 0.397 37.067 0.287 37.067 0.162 c
+36.583 0.162 l
+36.583 0.309 36.627 0.448 36.714 0.588 c
+36.803 0.735 36.92 0.845 37.067 0.926 c
+37.221 1.003 37.394 1.043 37.582 1.043 c
+37.894 1.043 38.129 0.962 38.287 0.808 c
+38.441 0.661 38.522 0.441 38.522 0.147 c
+38.522 -1.353 l
+38.53 -1.588 38.567 -1.789 38.626 -1.955 c
+38.626 -1.999 l
+h
+37.464 -1.617 m
+37.582 -1.617 37.692 -1.584 37.803 -1.514 c
+37.909 -1.448 37.986 -1.363 38.038 -1.264 c
+38.038 -0.559 l
+37.773 -0.559 l
+37.537 -0.559 37.35 -0.611 37.215 -0.706 c
+37.086 -0.805 37.024 -0.948 37.024 -1.132 c
+37.024 -1.301 37.053 -1.422 37.111 -1.5 c
+37.178 -1.58 37.296 -1.617 37.464 -1.617 c
+39 -0.368 m
+39 0.092 39.081 0.441 39.25 0.676 c
+39.426 0.918 39.677 1.043 40 1.043 c
+40.282 1.043 40.504 0.926 40.662 0.69 c
+40.662 2.234 l
+41.146 2.234 l
+41.146 -1.999 l
+40.706 -1.999 l
+40.676 -1.675 l
+40.518 -1.933 40.294 -2.058 40 -2.058 c
+39.684 -2.058 39.441 -1.941 39.265 -1.706 c
+39.089 -1.463 39 -1.118 39 -0.676 c
+h
+39.486 -0.647 m
+39.486 -0.981 39.533 -1.228 39.632 -1.382 c
+39.728 -1.54 39.889 -1.617 40.118 -1.617 c
+40.36 -1.617 40.544 -1.5 40.662 -1.264 c
+40.662 0.25 l
+40.533 0.485 40.353 0.603 40.118 0.603 c
+39.889 0.603 39.728 0.522 39.632 0.368 c
+39.533 0.21 39.486 -0.029 39.486 -0.353 c
+h
+42.778 -2.058 m
+42.403 -2.058 42.12 -1.951 41.925 -1.735 c
+41.727 -1.511 41.632 -1.183 41.632 -0.75 c
+41.632 -0.382 l
+41.632 0.058 41.724 0.405 41.911 0.661 c
+42.106 0.915 42.381 1.043 42.734 1.043 c
+43.076 1.043 43.33 0.929 43.498 0.706 c
+43.675 0.478 43.766 0.133 43.777 -0.338 c
+43.777 -0.647 l
+42.117 -0.647 l
+42.117 -0.721 l
+42.117 -1.043 42.175 -1.278 42.293 -1.426 c
+42.41 -1.565 42.58 -1.631 42.807 -1.631 c
+42.954 -1.631 43.079 -1.61 43.189 -1.558 c
+43.296 -1.5 43.399 -1.411 43.498 -1.294 c
+43.748 -1.602 l
+43.542 -1.907 43.219 -2.058 42.778 -2.058 c
+42.734 0.617 m
+42.528 0.617 42.374 0.548 42.278 0.411 c
+42.179 0.272 42.123 0.058 42.117 -0.235 c
+43.293 -0.235 l
+43.293 -0.162 l
+43.27 0.11 43.219 0.309 43.131 0.426 c
+43.043 0.551 42.91 0.617 42.734 0.617 c
+f
+Q
+ endstream endobj 44 0 obj <</BBox[541.904 440.392 560.038 434.983]/Group 80 0 R/Length 4112/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 541.9035 437.7458 cm
+0 0 m
+0 0.489 0.087 0.853 0.264 1.088 c
+0.44 1.33 0.683 1.455 0.999 1.455 c
+1.271 1.455 1.484 1.345 1.631 1.133 c
+1.66 1.397 l
+2.366 1.397 l
+2.366 -1.587 l
+2.366 -1.969 2.256 -2.256 2.043 -2.454 c
+1.826 -2.66 1.521 -2.763 1.132 -2.763 c
+0.962 -2.763 0.786 -2.726 0.602 -2.66 c
+0.426 -2.601 0.293 -2.516 0.205 -2.41 c
+0.47 -1.882 l
+0.547 -1.947 0.646 -2.006 0.764 -2.057 c
+0.881 -2.105 0.988 -2.131 1.087 -2.131 c
+1.263 -2.131 1.388 -2.087 1.469 -1.999 c
+1.547 -1.918 1.587 -1.786 1.587 -1.602 c
+1.587 -1.352 l
+1.44 -1.55 1.242 -1.646 0.999 -1.646 c
+0.683 -1.646 0.44 -1.525 0.264 -1.278 c
+0.087 -1.024 0 -0.672 0 -0.22 c
+h
+0.779 -0.205 m
+0.779 -0.481 0.812 -0.683 0.881 -0.808 c
+0.959 -0.926 1.076 -0.984 1.234 -0.984 c
+1.388 -0.984 1.506 -0.933 1.587 -0.823 c
+1.587 0.603 l
+1.506 0.728 1.388 0.794 1.234 0.794 c
+1.076 0.794 0.959 0.728 0.881 0.603 c
+0.812 0.474 0.779 0.272 0.779 0 c
+h
+3.564 -1.587 -0.779 2.984 re
+2.741 2.161 m
+2.741 2.286 2.778 2.389 2.859 2.469 c
+2.936 2.547 3.039 2.587 3.167 2.587 c
+3.293 2.587 3.395 2.547 3.476 2.469 c
+3.553 2.389 3.594 2.286 3.594 2.161 c
+3.594 2.043 3.553 1.945 3.476 1.867 c
+3.406 1.786 3.303 1.75 3.167 1.75 c
+3.039 1.75 2.936 1.786 2.859 1.867 c
+2.778 1.945 2.741 2.043 2.741 2.161 c
+4.983 2.132 m
+4.983 1.397 l
+5.379 1.397 l
+5.379 0.809 l
+4.983 0.809 l
+4.983 -0.675 l
+4.983 -0.793 4.997 -0.878 5.026 -0.926 c
+5.063 -0.966 5.13 -0.984 5.218 -0.984 c
+5.295 -0.984 5.357 -0.977 5.409 -0.955 c
+5.394 -1.572 l
+5.265 -1.62 5.122 -1.646 4.968 -1.646 c
+4.469 -1.646 4.211 -1.359 4.203 -0.779 c
+4.203 0.809 l
+3.865 0.809 l
+3.865 1.397 l
+4.203 1.397 l
+4.203 2.132 l
+h
+7.989 -0.999 m
+8.213 -0.999 8.326 -0.852 8.326 -0.558 c
+9.061 -0.558 l
+9.061 -0.881 8.959 -1.146 8.753 -1.352 c
+8.554 -1.55 8.305 -1.646 8.003 -1.646 c
+7.621 -1.646 7.327 -1.529 7.121 -1.294 c
+6.915 -1.051 6.813 -0.698 6.813 -0.235 c
+6.813 0.015 l
+6.813 0.474 6.908 0.827 7.106 1.073 c
+7.312 1.327 7.607 1.455 7.989 1.455 c
+8.319 1.455 8.58 1.353 8.768 1.147 c
+8.962 0.941 9.061 0.651 9.061 0.279 c
+8.326 0.279 l
+8.326 0.445 8.297 0.574 8.238 0.662 c
+8.187 0.757 8.099 0.809 7.974 0.809 c
+7.845 0.809 7.754 0.757 7.694 0.662 c
+7.636 0.563 7.599 0.375 7.592 0.103 c
+7.592 -0.205 l
+7.592 -0.452 7.599 -0.625 7.621 -0.72 c
+7.65 -0.808 7.688 -0.878 7.738 -0.926 c
+7.798 -0.977 7.879 -0.999 7.989 -0.999 c
+10.15 -1.587 -0.779 4.233 re
+10.568 0 m
+10.568 0.449 10.674 0.802 10.892 1.058 c
+11.104 1.324 11.399 1.455 11.773 1.455 c
+12.156 1.455 12.45 1.324 12.656 1.058 c
+12.868 0.802 12.979 0.449 12.979 0 c
+12.979 -0.191 l
+12.979 -0.654 12.868 -1.01 12.656 -1.263 c
+12.45 -1.521 12.156 -1.646 11.773 -1.646 c
+11.391 -1.646 11.09 -1.521 10.877 -1.263 c
+10.671 -0.999 10.568 -0.643 10.568 -0.191 c
+h
+11.347 -0.191 m
+11.347 -0.731 11.487 -0.999 11.773 -0.999 c
+12.039 -0.999 12.178 -0.775 12.199 -0.323 c
+12.214 0 l
+12.214 0.272 12.174 0.474 12.097 0.603 c
+12.016 0.739 11.91 0.809 11.773 0.809 c
+11.645 0.809 11.542 0.739 11.465 0.603 c
+11.384 0.474 11.347 0.272 11.347 0 c
+h
+14 1.397 m
+14.015 1.103 l
+14.192 1.338 14.42 1.455 14.706 1.455 c
+15.224 1.455 15.489 1.092 15.5 0.368 c
+15.5 -1.587 l
+14.721 -1.587 l
+14.721 0.31 l
+14.721 0.485 14.695 0.607 14.647 0.676 c
+14.596 0.754 14.508 0.794 14.383 0.794 c
+14.235 0.794 14.121 0.721 14.044 0.574 c
+14.044 -1.587 l
+13.265 -1.587 l
+13.265 1.397 l
+h
+17.076 -1.646 m
+16.672 -1.646 16.359 -1.529 16.135 -1.294 c
+15.919 -1.051 15.812 -0.706 15.812 -0.264 c
+15.812 -0.014 l
+15.812 0.456 15.915 0.817 16.12 1.073 c
+16.326 1.327 16.621 1.455 17.003 1.455 c
+17.373 1.455 17.653 1.33 17.841 1.088 c
+18.036 0.853 18.135 0.5 18.135 0.03 c
+18.135 -0.353 l
+16.591 -0.353 l
+16.598 -0.58 16.643 -0.746 16.723 -0.852 c
+16.812 -0.951 16.947 -0.999 17.135 -0.999 c
+17.389 -0.999 17.606 -0.907 17.782 -0.72 c
+18.09 -1.205 l
+17.992 -1.334 17.848 -1.44 17.664 -1.529 c
+17.487 -1.606 17.29 -1.646 17.076 -1.646 c
+16.591 0.192 m
+17.371 0.192 l
+17.371 0.265 l
+17.371 0.441 17.341 0.574 17.282 0.662 c
+17.223 0.757 17.124 0.809 16.988 0.809 c
+16.86 0.809 16.76 0.757 16.694 0.662 c
+16.635 0.563 16.598 0.405 16.591 0.192 c
+f
+Q
+ endstream endobj 45 0 obj <</BBox[561.412 440.45 582.315 436.099]/Group 81 0 R/Length 4153/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 561.7944 436.1588 cm
+0 0 m
+0 2.587 l
+-0.382 2.587 l
+-0.382 2.984 l
+0 2.984 l
+0 3.322 l
+0.008 3.623 0.088 3.858 0.235 4.027 c
+0.382 4.204 0.592 4.292 0.867 4.292 c
+0.963 4.292 1.062 4.278 1.162 4.248 c
+1.132 3.836 l
+1.062 3.844 0.989 3.851 0.912 3.851 c
+0.636 3.851 0.5 3.653 0.5 3.263 c
+0.5 2.984 l
+1 2.984 l
+1 2.587 l
+0.5 2.587 l
+0.5 0 l
+h
+2.693 2.528 m
+2.624 2.535 2.55 2.543 2.473 2.543 c
+2.216 2.543 2.039 2.404 1.945 2.132 c
+1.945 0 l
+1.459 0 l
+1.459 2.984 l
+1.93 2.984 l
+1.945 2.675 l
+2.069 2.917 2.253 3.042 2.488 3.042 c
+2.565 3.042 2.628 3.028 2.679 2.998 c
+h
+2.911 1.631 m
+2.911 2.061 3.013 2.404 3.219 2.66 c
+3.433 2.914 3.711 3.042 4.057 3.042 c
+4.399 3.042 4.675 2.914 4.881 2.66 c
+5.093 2.414 5.207 2.08 5.218 1.661 c
+5.218 1.352 l
+5.218 0.918 5.108 0.577 4.895 0.324 c
+4.69 0.066 4.41 -0.059 4.057 -0.059 c
+3.711 -0.059 3.439 0.062 3.234 0.309 c
+3.028 0.551 2.918 0.885 2.911 1.309 c
+h
+3.396 1.352 m
+3.396 1.036 3.454 0.794 3.572 0.617 c
+3.697 0.448 3.859 0.368 4.057 0.368 c
+4.487 0.368 4.711 0.676 4.733 1.294 c
+4.733 1.631 l
+4.733 1.933 4.667 2.175 4.542 2.352 c
+4.424 2.528 4.263 2.616 4.057 2.616 c
+3.859 2.616 3.697 2.528 3.572 2.352 c
+3.454 2.175 3.396 1.933 3.396 1.631 c
+h
+6.115 2.984 m
+6.13 2.705 l
+6.306 2.928 6.545 3.042 6.85 3.042 c
+7.181 3.042 7.412 2.896 7.541 2.602 c
+7.724 2.896 7.985 3.042 8.32 3.042 c
+8.879 3.042 9.161 2.697 9.172 2.014 c
+9.172 0 l
+8.688 0 l
+8.688 1.97 l
+8.688 2.182 8.647 2.341 8.57 2.44 c
+8.489 2.547 8.357 2.602 8.173 2.602 c
+8.025 2.602 7.908 2.543 7.82 2.425 c
+7.732 2.315 7.676 2.175 7.659 1.999 c
+7.659 0 l
+7.173 0 l
+7.173 1.984 l
+7.162 2.396 6.99 2.602 6.659 2.602 c
+6.413 2.602 6.24 2.477 6.144 2.234 c
+6.144 0 l
+5.659 0 l
+5.659 2.984 l
+h
+11.308 2.675 m
+11.491 2.917 11.726 3.042 12.013 3.042 c
+12.542 3.042 12.81 2.69 12.821 1.984 c
+12.821 0 l
+12.336 0 l
+12.336 1.955 l
+12.336 2.19 12.296 2.356 12.218 2.454 c
+12.138 2.55 12.021 2.602 11.866 2.602 c
+11.748 2.602 11.638 2.562 11.543 2.484 c
+11.443 2.404 11.366 2.296 11.308 2.161 c
+11.308 0 l
+10.822 0 l
+10.822 4.233 l
+11.308 4.233 l
+h
+14.423 -0.059 m
+14.049 -0.059 13.766 0.048 13.571 0.264 c
+13.373 0.488 13.277 0.816 13.277 1.249 c
+13.277 1.617 l
+13.277 2.057 13.369 2.404 13.556 2.66 c
+13.751 2.914 14.026 3.042 14.379 3.042 c
+14.722 3.042 14.975 2.928 15.144 2.705 c
+15.32 2.477 15.412 2.132 15.423 1.661 c
+15.423 1.352 l
+13.762 1.352 l
+13.762 1.278 l
+13.762 0.956 13.821 0.721 13.939 0.573 c
+14.057 0.434 14.225 0.368 14.453 0.368 c
+14.6 0.368 14.725 0.389 14.836 0.441 c
+14.942 0.5 15.044 0.588 15.144 0.706 c
+15.393 0.397 l
+15.188 0.092 14.865 -0.059 14.423 -0.059 c
+14.379 2.616 m
+14.174 2.616 14.02 2.547 13.924 2.41 c
+13.824 2.271 13.77 2.057 13.762 1.764 c
+14.938 1.764 l
+14.938 1.837 l
+14.916 2.109 14.865 2.308 14.776 2.425 c
+14.688 2.55 14.556 2.616 14.379 2.616 c
+17.07 2.528 m
+17 2.535 16.926 2.543 16.849 2.543 c
+16.592 2.543 16.415 2.404 16.32 2.132 c
+16.32 0 l
+15.835 0 l
+15.835 2.984 l
+16.305 2.984 l
+16.32 2.675 l
+16.445 2.917 16.629 3.042 16.864 3.042 c
+16.941 3.042 17.003 3.028 17.055 2.998 c
+h
+18.448 -0.059 m
+18.073 -0.059 17.789 0.048 17.595 0.264 c
+17.396 0.488 17.301 0.816 17.301 1.249 c
+17.301 1.617 l
+17.301 2.057 17.392 2.404 17.581 2.66 c
+17.775 2.914 18.051 3.042 18.404 3.042 c
+18.745 3.042 18.998 2.928 19.168 2.705 c
+19.344 2.477 19.436 2.132 19.447 1.661 c
+19.447 1.352 l
+17.786 1.352 l
+17.786 1.278 l
+17.786 0.956 17.845 0.721 17.962 0.573 c
+18.08 0.434 18.249 0.368 18.477 0.368 c
+18.624 0.368 18.749 0.389 18.859 0.441 c
+18.965 0.5 19.069 0.588 19.168 0.706 c
+19.418 0.397 l
+19.212 0.092 18.888 -0.059 18.448 -0.059 c
+18.404 2.616 m
+18.198 2.616 18.043 2.547 17.947 2.41 c
+17.849 2.271 17.793 2.057 17.786 1.764 c
+18.962 1.764 l
+18.962 1.837 l
+18.94 2.109 18.888 2.308 18.801 2.425 c
+18.712 2.55 18.58 2.616 18.404 2.616 c
+19.888 0.264 m
+19.888 0.353 19.91 0.426 19.962 0.485 c
+20.02 0.544 20.097 0.573 20.197 0.573 c
+20.303 0.573 20.38 0.544 20.432 0.485 c
+20.49 0.426 20.52 0.353 20.52 0.264 c
+20.52 0.183 20.49 0.118 20.432 0.058 c
+20.38 0 20.303 -0.029 20.197 -0.029 c
+20.097 -0.029 20.02 0 19.962 0.058 c
+19.91 0.118 19.888 0.183 19.888 0.264 c
+f
+Q
+ endstream endobj 46 0 obj <</BBox[705.559 469.842 760.518 464.403]/Group 82 0 R/Length 12288/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 707.7492 466.6519 cm
+0 0 m
+-1.353 0 l
+-1.676 -1.043 l
+-2.19 -1.043 l
+-0.897 2.969 l
+-0.47 2.969 l
+0.837 -1.043 l
+0.309 -1.043 l
+h
+-1.22 0.441 m
+-0.133 0.441 l
+-0.676 2.263 l
+h
+1.55 1.94 m
+1.565 1.617 l
+1.749 1.87 1.992 1.999 2.285 1.999 c
+2.815 1.999 3.083 1.646 3.094 0.941 c
+3.094 -1.043 l
+2.609 -1.043 l
+2.609 0.912 l
+2.609 1.147 2.568 1.312 2.491 1.411 c
+2.41 1.507 2.293 1.558 2.138 1.558 c
+2.021 1.558 1.911 1.517 1.815 1.44 c
+1.716 1.359 1.639 1.253 1.58 1.117 c
+1.58 -1.043 l
+1.095 -1.043 l
+1.095 1.94 l
+h
+3.542 0.588 m
+3.542 1.018 3.645 1.359 3.85 1.617 c
+4.064 1.87 4.343 1.999 4.689 1.999 c
+5.03 1.999 5.306 1.87 5.512 1.617 c
+5.725 1.371 5.839 1.037 5.85 0.617 c
+5.85 0.309 l
+5.85 -0.125 5.739 -0.467 5.527 -0.721 c
+5.321 -0.977 5.041 -1.103 4.689 -1.103 c
+4.343 -1.103 4.072 -0.981 3.866 -0.735 c
+3.659 -0.492 3.549 -0.158 3.542 0.264 c
+h
+4.027 0.309 m
+4.027 -0.008 4.086 -0.25 4.203 -0.426 c
+4.328 -0.595 4.49 -0.676 4.689 -0.676 c
+5.119 -0.676 5.342 -0.368 5.365 0.25 c
+5.365 0.588 l
+5.365 0.889 5.298 1.132 5.174 1.309 c
+5.056 1.484 4.895 1.573 4.689 1.573 c
+4.49 1.573 4.328 1.484 4.203 1.309 c
+4.086 1.132 4.027 0.889 4.027 0.588 c
+h
+6.923 2.66 m
+6.923 1.94 l
+7.378 1.94 l
+7.378 1.544 l
+6.923 1.544 l
+6.923 -0.309 l
+6.923 -0.426 6.942 -0.515 6.982 -0.573 c
+7.019 -0.632 7.089 -0.661 7.187 -0.661 c
+7.247 -0.661 7.309 -0.654 7.378 -0.632 c
+7.378 -1.043 l
+7.261 -1.08 7.147 -1.103 7.041 -1.103 c
+6.842 -1.103 6.692 -1.037 6.585 -0.897 c
+6.485 -0.761 6.437 -0.566 6.437 -0.309 c
+6.437 1.544 l
+5.982 1.544 l
+5.982 1.94 l
+6.437 1.94 l
+6.437 2.66 l
+h
+8.326 1.631 m
+8.51 1.874 8.745 1.999 9.032 1.999 c
+9.562 1.999 9.83 1.646 9.841 0.941 c
+9.841 -1.043 l
+9.356 -1.043 l
+9.356 0.912 l
+9.356 1.147 9.315 1.312 9.238 1.411 c
+9.157 1.507 9.04 1.558 8.885 1.558 c
+8.768 1.558 8.658 1.517 8.562 1.44 c
+8.463 1.359 8.386 1.253 8.326 1.117 c
+8.326 -1.043 l
+7.842 -1.043 l
+7.842 3.19 l
+8.326 3.19 l
+h
+11.443 -1.103 m
+11.068 -1.103 10.785 -0.996 10.59 -0.779 c
+10.391 -0.555 10.296 -0.228 10.296 0.206 c
+10.296 0.573 l
+10.296 1.014 10.389 1.359 10.576 1.617 c
+10.771 1.87 11.046 1.999 11.399 1.999 c
+11.74 1.999 11.994 1.885 12.163 1.661 c
+12.34 1.433 12.431 1.087 12.442 0.617 c
+12.442 0.309 l
+10.782 0.309 l
+10.782 0.235 l
+10.782 -0.088 10.84 -0.324 10.958 -0.47 c
+11.075 -0.61 11.245 -0.676 11.472 -0.676 c
+11.619 -0.676 11.744 -0.654 11.854 -0.603 c
+11.961 -0.544 12.064 -0.455 12.163 -0.338 c
+12.413 -0.647 l
+12.207 -0.952 11.883 -1.103 11.443 -1.103 c
+11.399 1.573 m
+11.193 1.573 11.039 1.503 10.943 1.367 c
+10.844 1.228 10.788 1.014 10.782 0.721 c
+11.958 0.721 l
+11.958 0.794 l
+11.935 1.066 11.883 1.264 11.796 1.382 c
+11.708 1.507 11.575 1.573 11.399 1.573 c
+14.089 1.484 m
+14.019 1.492 13.946 1.5 13.868 1.5 c
+13.611 1.5 13.435 1.359 13.339 1.087 c
+13.339 -1.043 l
+12.854 -1.043 l
+12.854 1.94 l
+13.325 1.94 l
+13.339 1.631 l
+13.464 1.874 13.647 1.999 13.883 1.999 c
+13.96 1.999 14.023 1.984 14.074 1.955 c
+h
+16.897 1.484 m
+16.826 1.492 16.753 1.5 16.676 1.5 c
+16.419 1.5 16.242 1.359 16.147 1.087 c
+16.147 -1.043 l
+15.661 -1.043 l
+15.661 1.94 l
+16.132 1.94 l
+16.147 1.631 l
+16.271 1.874 16.455 1.999 16.691 1.999 c
+16.768 1.999 16.83 1.984 16.882 1.955 c
+h
+18.274 -1.103 m
+17.899 -1.103 17.616 -0.996 17.422 -0.779 c
+17.223 -0.555 17.128 -0.228 17.128 0.206 c
+17.128 0.573 l
+17.128 1.014 17.219 1.359 17.407 1.617 c
+17.602 1.87 17.878 1.999 18.231 1.999 c
+18.572 1.999 18.825 1.885 18.994 1.661 c
+19.171 1.433 19.263 1.087 19.274 0.617 c
+19.274 0.309 l
+17.612 0.309 l
+17.612 0.235 l
+17.612 -0.088 17.672 -0.324 17.789 -0.47 c
+17.907 -0.61 18.075 -0.676 18.304 -0.676 c
+18.451 -0.676 18.576 -0.654 18.686 -0.603 c
+18.792 -0.544 18.896 -0.455 18.994 -0.338 c
+19.245 -0.647 l
+19.039 -0.952 18.715 -1.103 18.274 -1.103 c
+18.231 1.573 m
+18.025 1.573 17.87 1.503 17.774 1.367 c
+17.676 1.228 17.62 1.014 17.612 0.721 c
+18.788 0.721 l
+18.788 0.794 l
+18.767 1.066 18.715 1.264 18.627 1.382 c
+18.539 1.507 18.406 1.573 18.231 1.573 c
+20.141 1.94 m
+20.155 1.661 l
+20.332 1.885 20.571 1.999 20.876 1.999 c
+21.207 1.999 21.439 1.852 21.566 1.558 c
+21.751 1.852 22.011 1.999 22.346 1.999 c
+22.904 1.999 23.187 1.654 23.199 0.97 c
+23.199 -1.043 l
+22.713 -1.043 l
+22.713 0.926 l
+22.713 1.139 22.673 1.297 22.596 1.396 c
+22.515 1.503 22.383 1.558 22.199 1.558 c
+22.052 1.558 21.934 1.5 21.846 1.382 c
+21.758 1.272 21.703 1.132 21.684 0.956 c
+21.684 -1.043 l
+21.2 -1.043 l
+21.2 0.941 l
+21.188 1.352 21.015 1.558 20.685 1.558 c
+20.439 1.558 20.266 1.433 20.17 1.191 c
+20.17 -1.043 l
+19.685 -1.043 l
+19.685 1.94 l
+h
+23.544 0.588 m
+23.544 1.018 23.646 1.359 23.852 1.617 c
+24.066 1.87 24.345 1.999 24.691 1.999 c
+25.032 1.999 25.308 1.87 25.514 1.617 c
+25.726 1.371 25.84 1.037 25.852 0.617 c
+25.852 0.309 l
+25.852 -0.125 25.742 -0.467 25.528 -0.721 c
+25.323 -0.977 25.043 -1.103 24.691 -1.103 c
+24.345 -1.103 24.073 -0.981 23.868 -0.735 c
+23.661 -0.492 23.551 -0.158 23.544 0.264 c
+h
+24.029 0.309 m
+24.029 -0.008 24.088 -0.25 24.205 -0.426 c
+24.33 -0.595 24.492 -0.676 24.691 -0.676 c
+25.121 -0.676 25.344 -0.368 25.366 0.25 c
+25.366 0.588 l
+25.366 0.889 25.3 1.132 25.175 1.309 c
+25.057 1.484 24.896 1.573 24.691 1.573 c
+24.492 1.573 24.33 1.484 24.205 1.309 c
+24.088 1.132 24.029 0.889 24.029 0.588 c
+h
+26.925 2.66 m
+26.925 1.94 l
+27.38 1.94 l
+27.38 1.544 l
+26.925 1.544 l
+26.925 -0.309 l
+26.925 -0.426 26.943 -0.515 26.983 -0.573 c
+27.02 -0.632 27.09 -0.661 27.189 -0.661 c
+27.248 -0.661 27.311 -0.654 27.38 -0.632 c
+27.38 -1.043 l
+27.263 -1.08 27.149 -1.103 27.043 -1.103 c
+26.844 -1.103 26.693 -1.037 26.586 -0.897 c
+26.487 -0.761 26.439 -0.566 26.439 -0.309 c
+26.439 1.544 l
+25.984 1.544 l
+25.984 1.94 l
+26.439 1.94 l
+26.439 2.66 l
+h
+28.905 -1.103 m
+28.531 -1.103 28.248 -0.996 28.053 -0.779 c
+27.854 -0.555 27.758 -0.228 27.758 0.206 c
+27.758 0.573 l
+27.758 1.014 27.851 1.359 28.038 1.617 c
+28.233 1.87 28.508 1.999 28.861 1.999 c
+29.203 1.999 29.456 1.885 29.626 1.661 c
+29.802 1.433 29.894 1.087 29.905 0.617 c
+29.905 0.309 l
+28.244 0.309 l
+28.244 0.235 l
+28.244 -0.088 28.303 -0.324 28.421 -0.47 c
+28.538 -0.61 28.707 -0.676 28.934 -0.676 c
+29.082 -0.676 29.206 -0.654 29.317 -0.603 c
+29.424 -0.544 29.526 -0.455 29.626 -0.338 c
+29.875 -0.647 l
+29.67 -0.952 29.346 -1.103 28.905 -1.103 c
+28.861 1.573 m
+28.656 1.573 28.501 1.503 28.406 1.367 c
+28.306 1.228 28.251 1.014 28.244 0.721 c
+29.42 0.721 l
+29.42 0.794 l
+29.398 1.066 29.346 1.264 29.258 1.382 c
+29.17 1.507 29.038 1.573 28.861 1.573 c
+32.753 1.484 m
+32.683 1.492 32.61 1.5 32.533 1.5 c
+32.275 1.5 32.099 1.359 32.003 1.087 c
+32.003 -1.043 l
+31.519 -1.043 l
+31.519 1.94 l
+31.989 1.94 l
+32.003 1.631 l
+32.128 1.874 32.312 1.999 32.547 1.999 c
+32.624 1.999 32.687 1.984 32.738 1.955 c
+h
+34.131 -1.103 m
+33.756 -1.103 33.473 -0.996 33.279 -0.779 c
+33.08 -0.555 32.984 -0.228 32.984 0.206 c
+32.984 0.573 l
+32.984 1.014 33.076 1.359 33.264 1.617 c
+33.458 1.87 33.734 1.999 34.087 1.999 c
+34.428 1.999 34.682 1.885 34.851 1.661 c
+35.028 1.433 35.12 1.087 35.13 0.617 c
+35.13 0.309 l
+33.47 0.309 l
+33.47 0.235 l
+33.47 -0.088 33.528 -0.324 33.646 -0.47 c
+33.763 -0.61 33.932 -0.676 34.16 -0.676 c
+34.307 -0.676 34.432 -0.654 34.542 -0.603 c
+34.649 -0.544 34.752 -0.455 34.851 -0.338 c
+35.101 -0.647 l
+34.895 -0.952 34.572 -1.103 34.131 -1.103 c
+34.087 1.573 m
+33.881 1.573 33.726 1.503 33.631 1.367 c
+33.532 1.228 33.477 1.014 33.47 0.721 c
+34.646 0.721 l
+34.646 0.794 l
+34.623 1.066 34.572 1.264 34.484 1.382 c
+34.395 1.507 34.264 1.573 34.087 1.573 c
+37.688 0.309 m
+37.688 -0.162 37.603 -0.515 37.438 -0.75 c
+37.269 -0.985 37.03 -1.103 36.718 -1.103 c
+36.413 -1.103 36.182 -0.992 36.027 -0.765 c
+36.027 -2.19 l
+35.542 -2.19 l
+35.542 1.94 l
+35.983 1.94 l
+36.012 1.602 l
+36.167 1.866 36.398 1.999 36.703 1.999 c
+37.034 1.999 37.281 1.882 37.438 1.646 c
+37.603 1.419 37.688 1.08 37.688 0.632 c
+h
+37.203 0.588 m
+37.203 0.919 37.148 1.165 37.042 1.323 c
+36.942 1.477 36.78 1.558 36.556 1.558 c
+36.321 1.558 36.145 1.44 36.027 1.205 c
+36.027 -0.338 l
+36.145 -0.566 36.325 -0.676 36.571 -0.676 c
+36.784 -0.676 36.942 -0.599 37.042 -0.441 c
+37.148 -0.287 37.203 -0.044 37.203 0.279 c
+h
+38.041 0.588 m
+38.041 1.018 38.143 1.359 38.349 1.617 c
+38.563 1.87 38.842 1.999 39.187 1.999 c
+39.529 1.999 39.805 1.87 40.011 1.617 c
+40.223 1.371 40.338 1.037 40.348 0.617 c
+40.348 0.309 l
+40.348 -0.125 40.238 -0.467 40.025 -0.721 c
+39.82 -0.977 39.54 -1.103 39.187 -1.103 c
+38.842 -1.103 38.57 -0.981 38.364 -0.735 c
+38.158 -0.492 38.048 -0.158 38.041 0.264 c
+h
+38.526 0.309 m
+38.526 -0.008 38.584 -0.25 38.702 -0.426 c
+38.827 -0.595 38.989 -0.676 39.187 -0.676 c
+39.617 -0.676 39.841 -0.368 39.864 0.25 c
+39.864 0.588 l
+39.864 0.889 39.797 1.132 39.673 1.309 c
+39.554 1.484 39.393 1.573 39.187 1.573 c
+38.989 1.573 38.827 1.484 38.702 1.309 c
+38.584 1.132 38.526 0.889 38.526 0.588 c
+h
+42.23 -0.279 m
+42.23 -0.173 42.189 -0.085 42.112 -0.015 c
+42.031 0.062 41.881 0.151 41.657 0.25 c
+41.393 0.357 41.204 0.449 41.098 0.529 c
+40.988 0.607 40.911 0.694 40.863 0.794 c
+40.811 0.889 40.79 1.007 40.79 1.147 c
+40.79 1.389 40.878 1.591 41.054 1.749 c
+41.231 1.914 41.455 1.999 41.73 1.999 c
+42.025 1.999 42.26 1.911 42.436 1.735 c
+42.612 1.565 42.7 1.352 42.7 1.087 c
+42.216 1.087 l
+42.216 1.224 42.164 1.338 42.068 1.426 c
+41.98 1.521 41.867 1.573 41.73 1.573 c
+41.583 1.573 41.47 1.532 41.393 1.455 c
+41.312 1.386 41.275 1.286 41.275 1.161 c
+41.275 1.062 41.304 0.985 41.362 0.926 c
+41.422 0.867 41.561 0.786 41.79 0.69 c
+42.149 0.544 42.395 0.401 42.524 0.264 c
+42.66 0.136 42.73 -0.037 42.73 -0.25 c
+42.73 -0.507 42.634 -0.713 42.451 -0.867 c
+42.274 -1.025 42.039 -1.103 41.745 -1.103 c
+41.429 -1.103 41.175 -1.014 40.981 -0.838 c
+40.793 -0.654 40.701 -0.422 40.701 -0.147 c
+41.187 -0.147 l
+41.194 -0.316 41.245 -0.449 41.333 -0.544 c
+41.429 -0.632 41.568 -0.676 41.745 -0.676 c
+41.9 -0.676 42.017 -0.643 42.098 -0.573 c
+42.186 -0.507 42.23 -0.408 42.23 -0.279 c
+43.714 -1.043 -0.5 2.983 re
+43.744 2.734 m
+43.744 2.645 43.718 2.572 43.671 2.514 c
+43.631 2.462 43.56 2.44 43.465 2.44 c
+43.377 2.44 43.307 2.462 43.259 2.514 c
+43.219 2.572 43.201 2.639 43.201 2.72 c
+43.201 2.807 43.219 2.881 43.259 2.94 c
+43.307 2.998 43.377 3.028 43.465 3.028 c
+43.56 3.028 43.631 2.998 43.671 2.94 c
+43.718 2.881 43.744 2.811 43.744 2.734 c
+45.023 2.66 m
+45.023 1.94 l
+45.478 1.94 l
+45.478 1.544 l
+45.023 1.544 l
+45.023 -0.309 l
+45.023 -0.426 45.042 -0.515 45.082 -0.573 c
+45.119 -0.632 45.188 -0.661 45.287 -0.661 c
+45.346 -0.661 45.409 -0.654 45.478 -0.632 c
+45.478 -1.043 l
+45.361 -1.08 45.247 -1.103 45.14 -1.103 c
+44.942 -1.103 44.791 -1.037 44.685 -0.897 c
+44.585 -0.761 44.537 -0.566 44.537 -0.309 c
+44.537 1.544 l
+44.082 1.544 l
+44.082 1.94 l
+44.537 1.94 l
+44.537 2.66 l
+h
+45.79 0.588 m
+45.79 1.018 45.894 1.359 46.1 1.617 c
+46.313 1.87 46.592 1.999 46.937 1.999 c
+47.279 1.999 47.554 1.87 47.76 1.617 c
+47.974 1.371 48.088 1.037 48.099 0.617 c
+48.099 0.309 l
+48.099 -0.125 47.988 -0.467 47.776 -0.721 c
+47.569 -0.977 47.29 -1.103 46.937 -1.103 c
+46.592 -1.103 46.32 -0.981 46.114 -0.735 c
+45.908 -0.492 45.798 -0.158 45.79 0.264 c
+h
+46.276 0.309 m
+46.276 -0.008 46.335 -0.25 46.453 -0.426 c
+46.577 -0.595 46.739 -0.676 46.937 -0.676 c
+47.367 -0.676 47.591 -0.368 47.614 0.25 c
+47.614 0.588 l
+47.614 0.889 47.548 1.132 47.423 1.309 c
+47.305 1.484 47.143 1.573 46.937 1.573 c
+46.739 1.573 46.577 1.484 46.453 1.309 c
+46.335 1.132 46.276 0.889 46.276 0.588 c
+h
+49.771 1.484 m
+49.701 1.492 49.628 1.5 49.551 1.5 c
+49.293 1.5 49.117 1.359 49.021 1.087 c
+49.021 -1.043 l
+48.536 -1.043 l
+48.536 1.94 l
+49.006 1.94 l
+49.021 1.631 l
+49.146 1.874 49.33 1.999 49.565 1.999 c
+49.642 1.999 49.705 1.984 49.756 1.955 c
+h
+51.001 -0.235 m
+51.546 1.94 l
+52.06 1.94 l
+51.09 -1.47 l
+51.02 -1.723 50.918 -1.914 50.781 -2.043 c
+50.642 -2.179 50.491 -2.249 50.326 -2.249 c
+50.256 -2.249 50.172 -2.234 50.076 -2.205 c
+50.076 -1.793 l
+50.178 -1.808 l
+50.315 -1.808 50.421 -1.771 50.502 -1.706 c
+50.59 -1.635 50.656 -1.517 50.708 -1.353 c
+50.796 -1.014 l
+49.929 1.94 l
+50.457 1.94 l
+h
+52.138 -0.779 m
+52.138 -0.69 52.159 -0.617 52.211 -0.559 c
+52.269 -0.5 52.346 -0.47 52.446 -0.47 c
+52.553 -0.47 52.63 -0.5 52.681 -0.559 c
+52.74 -0.617 52.769 -0.69 52.769 -0.779 c
+52.769 -0.86 52.74 -0.926 52.681 -0.985 c
+52.63 -1.043 52.553 -1.073 52.446 -1.073 c
+52.346 -1.073 52.269 -1.043 52.211 -0.985 c
+52.159 -0.926 52.138 -0.86 52.138 -0.779 c
+f
+Q
+ endstream endobj 47 0 obj <</BBox[698.93 463.095 712.887 458.964]/Group 83 0 R/Length 3851/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 701.5309 459.523 cm
+0 0 m
+-0.088 -0.118 l
+-0.345 -0.412 -0.713 -0.559 -1.19 -0.559 c
+-1.631 -0.559 -1.977 -0.419 -2.219 -0.133 c
+-2.466 0.162 -2.595 0.573 -2.601 1.103 c
+-2.601 1.881 l
+-2.601 2.447 -2.491 2.87 -2.263 3.146 c
+-2.04 3.428 -1.701 3.572 -1.249 3.572 c
+-0.867 3.572 -0.569 3.462 -0.353 3.248 c
+-0.139 3.032 -0.022 2.726 0 2.337 c
+-0.5 2.337 l
+-0.521 2.579 -0.588 2.77 -0.706 2.911 c
+-0.823 3.057 -1.007 3.131 -1.249 3.131 c
+-1.536 3.131 -1.745 3.035 -1.881 2.851 c
+-2.021 2.664 -2.087 2.366 -2.087 1.955 c
+-2.087 1.132 l
+-2.087 0.727 -2.013 0.419 -1.866 0.206 c
+-1.712 -0.011 -1.484 -0.118 -1.19 -0.118 c
+-0.926 -0.118 -0.72 -0.056 -0.573 0.073 c
+-0.5 0.147 l
+-0.5 1.072 l
+-1.234 1.072 l
+-1.234 1.5 l
+0 1.5 l
+h
+1.077 -0.5 -0.5 2.983 re
+1.106 3.277 m
+1.106 3.189 1.081 3.116 1.033 3.057 c
+0.992 3.006 0.923 2.984 0.827 2.984 c
+0.738 2.984 0.669 3.006 0.621 3.057 c
+0.58 3.116 0.563 3.183 0.563 3.263 c
+0.563 3.351 0.58 3.424 0.621 3.484 c
+0.669 3.542 0.738 3.572 0.827 3.572 c
+0.923 3.572 0.992 3.542 1.033 3.484 c
+1.081 3.424 1.106 3.355 1.106 3.277 c
+2.382 3.204 m
+2.382 2.484 l
+2.837 2.484 l
+2.837 2.087 l
+2.382 2.087 l
+2.382 0.235 l
+2.382 0.118 2.4 0.029 2.44 -0.029 c
+2.477 -0.088 2.547 -0.118 2.646 -0.118 c
+2.705 -0.118 2.768 -0.11 2.837 -0.088 c
+2.837 -0.5 l
+2.72 -0.536 2.606 -0.559 2.499 -0.559 c
+2.301 -0.559 2.15 -0.493 2.043 -0.353 c
+1.945 -0.217 1.896 -0.023 1.896 0.235 c
+1.896 2.087 l
+1.441 2.087 l
+1.441 2.484 l
+1.896 2.484 l
+1.896 3.204 l
+h
+5.039 -0.5 -0.501 2.983 re
+5.068 3.277 m
+5.068 3.189 5.042 3.116 4.994 3.057 c
+4.954 3.006 4.884 2.984 4.788 2.984 c
+4.7 2.984 4.63 3.006 4.582 3.057 c
+4.542 3.116 4.524 3.183 4.524 3.263 c
+4.524 3.351 4.542 3.424 4.582 3.484 c
+4.63 3.542 4.7 3.572 4.788 3.572 c
+4.884 3.572 4.954 3.542 4.994 3.484 c
+5.042 3.424 5.068 3.355 5.068 3.277 c
+7.151 0.264 m
+7.151 0.371 7.111 0.459 7.034 0.529 c
+6.953 0.606 6.802 0.694 6.578 0.794 c
+6.313 0.9 6.126 0.992 6.02 1.072 c
+5.91 1.151 5.832 1.238 5.785 1.338 c
+5.733 1.433 5.711 1.55 5.711 1.69 c
+5.711 1.933 5.799 2.135 5.976 2.293 c
+6.151 2.458 6.376 2.543 6.652 2.543 c
+6.945 2.543 7.181 2.454 7.357 2.278 c
+7.533 2.109 7.622 1.896 7.622 1.631 c
+7.136 1.631 l
+7.136 1.768 7.086 1.881 6.99 1.97 c
+6.901 2.065 6.787 2.117 6.652 2.117 c
+6.504 2.117 6.39 2.076 6.313 1.999 c
+6.232 1.929 6.196 1.83 6.196 1.705 c
+6.196 1.606 6.225 1.529 6.284 1.469 c
+6.342 1.411 6.483 1.33 6.71 1.234 c
+7.071 1.087 7.317 0.944 7.445 0.808 c
+7.581 0.68 7.651 0.507 7.651 0.293 c
+7.651 0.037 7.556 -0.169 7.372 -0.324 c
+7.196 -0.482 6.961 -0.559 6.666 -0.559 c
+6.35 -0.559 6.097 -0.47 5.902 -0.294 c
+5.714 -0.11 5.623 0.121 5.623 0.397 c
+6.107 0.397 l
+6.115 0.228 6.167 0.095 6.255 0 c
+6.35 -0.088 6.49 -0.133 6.666 -0.133 c
+6.82 -0.133 6.938 -0.1 7.019 -0.029 c
+7.107 0.037 7.151 0.135 7.151 0.264 c
+10.841 -0.5 m
+10.811 -0.434 10.789 -0.324 10.782 -0.177 c
+10.606 -0.434 10.385 -0.559 10.12 -0.559 c
+9.845 -0.559 9.628 -0.485 9.474 -0.339 c
+9.326 -0.183 9.253 0.033 9.253 0.309 c
+9.253 0.61 9.357 0.852 9.562 1.029 c
+9.768 1.213 10.051 1.308 10.415 1.308 c
+10.768 1.308 l
+10.768 1.631 l
+10.768 1.808 10.727 1.929 10.65 1.999 c
+10.569 2.076 10.452 2.117 10.297 2.117 c
+10.15 2.117 10.025 2.072 9.93 1.984 c
+9.841 1.896 9.797 1.785 9.797 1.66 c
+9.312 1.66 l
+9.312 1.808 9.357 1.947 9.444 2.087 c
+9.532 2.234 9.65 2.344 9.797 2.425 c
+9.951 2.502 10.124 2.543 10.311 2.543 c
+10.624 2.543 10.859 2.462 11.017 2.308 c
+11.171 2.161 11.252 1.94 11.252 1.646 c
+11.252 0.147 l
+11.26 -0.088 11.296 -0.291 11.356 -0.456 c
+11.356 -0.5 l
+h
+10.194 -0.118 m
+10.311 -0.118 10.422 -0.085 10.532 -0.015 c
+10.639 0.052 10.716 0.135 10.768 0.235 c
+10.768 0.941 l
+10.502 0.941 l
+10.267 0.941 10.08 0.889 9.945 0.794 c
+9.816 0.694 9.753 0.551 9.753 0.367 c
+9.753 0.198 9.783 0.077 9.841 0 c
+9.908 -0.081 10.025 -0.118 10.194 -0.118 c
+f
+Q
+ endstream endobj 48 0 obj <</BBox[714.378 463.257 737.088 458.964]/Group 84 0 R/Length 5616/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 714.3777 460.6105 cm
+0 0 m
+0 0.489 0.081 0.852 0.25 1.087 c
+0.416 1.33 0.655 1.455 0.971 1.455 c
+1.206 1.455 1.397 1.353 1.544 1.147 c
+1.544 2.646 l
+2.338 2.646 l
+2.338 -1.587 l
+1.617 -1.587 l
+1.588 -1.278 l
+1.43 -1.525 1.224 -1.646 0.971 -1.646 c
+0.655 -1.646 0.416 -1.529 0.25 -1.294 c
+0.092 -1.051 0.008 -0.698 0 -0.235 c
+h
+0.78 -0.206 m
+0.78 -0.5 0.809 -0.706 0.867 -0.823 c
+0.934 -0.933 1.044 -0.985 1.191 -0.985 c
+1.345 -0.985 1.463 -0.918 1.544 -0.779 c
+1.544 0.573 l
+1.463 0.721 1.353 0.794 1.206 0.794 c
+1.059 0.794 0.948 0.735 0.882 0.617 c
+0.813 0.507 0.78 0.301 0.78 0 c
+h
+3.539 -1.587 -0.779 2.983 re
+2.716 2.161 m
+2.716 2.286 2.753 2.389 2.833 2.469 c
+2.911 2.547 3.014 2.587 3.142 2.587 c
+3.267 2.587 3.371 2.547 3.451 2.469 c
+3.528 2.389 3.568 2.286 3.568 2.161 c
+3.568 2.043 3.528 1.944 3.451 1.866 c
+3.381 1.786 3.278 1.749 3.142 1.749 c
+3.014 1.749 2.911 1.786 2.833 1.866 c
+2.753 1.944 2.716 2.043 2.716 2.161 c
+5.366 -0.794 m
+5.366 -0.727 5.329 -0.661 5.263 -0.603 c
+5.204 -0.544 5.064 -0.47 4.851 -0.382 c
+4.528 -0.246 4.308 -0.11 4.19 0.029 c
+4.072 0.166 4.013 0.338 4.013 0.544 c
+4.013 0.808 4.105 1.022 4.293 1.191 c
+4.476 1.367 4.726 1.455 5.042 1.455 c
+5.366 1.455 5.623 1.367 5.821 1.191 c
+6.016 1.022 6.115 0.798 6.115 0.515 c
+5.336 0.515 l
+5.336 0.757 5.233 0.882 5.027 0.882 c
+4.946 0.882 4.881 0.852 4.822 0.794 c
+4.77 0.742 4.748 0.676 4.748 0.588 c
+4.748 0.518 4.778 0.459 4.836 0.412 c
+4.896 0.36 5.031 0.287 5.248 0.191 c
+5.571 0.073 5.796 -0.058 5.924 -0.206 c
+6.06 -0.345 6.13 -0.529 6.13 -0.764 c
+6.13 -1.029 6.027 -1.246 5.821 -1.411 c
+5.623 -1.569 5.366 -1.646 5.042 -1.646 c
+4.815 -1.646 4.62 -1.602 4.454 -1.514 c
+4.285 -1.426 4.153 -1.309 4.057 -1.161 c
+3.969 -1.007 3.925 -0.838 3.925 -0.661 c
+4.66 -0.661 l
+4.667 -0.801 4.704 -0.904 4.763 -0.97 c
+4.822 -1.04 4.917 -1.073 5.057 -1.073 c
+5.263 -1.073 5.366 -0.981 5.366 -0.794 c
+7.354 2.132 m
+7.354 1.396 l
+7.751 1.396 l
+7.751 0.808 l
+7.354 0.808 l
+7.354 -0.676 l
+7.354 -0.794 7.369 -0.878 7.398 -0.926 c
+7.435 -0.966 7.5 -0.985 7.589 -0.985 c
+7.666 -0.985 7.728 -0.977 7.78 -0.956 c
+7.765 -1.573 l
+7.637 -1.621 7.493 -1.646 7.339 -1.646 c
+6.839 -1.646 6.582 -1.359 6.575 -0.779 c
+6.575 0.808 l
+6.236 0.808 l
+6.236 1.396 l
+6.575 1.396 l
+6.575 2.132 l
+h
+9.526 0.647 m
+9.276 0.661 l
+9.058 0.661 8.912 0.566 8.834 0.382 c
+8.834 -1.587 l
+8.056 -1.587 l
+8.056 1.396 l
+8.79 1.396 l
+8.82 1.073 l
+8.937 1.326 9.103 1.455 9.32 1.455 c
+9.407 1.455 9.482 1.44 9.54 1.411 c
+h
+10.628 -1.587 -0.779 2.983 re
+9.804 2.161 m
+9.804 2.286 9.841 2.389 9.922 2.469 c
+9.999 2.547 10.103 2.587 10.231 2.587 c
+10.356 2.587 10.459 2.547 10.54 2.469 c
+10.617 2.389 10.658 2.286 10.658 2.161 c
+10.658 2.043 10.617 1.944 10.54 1.866 c
+10.469 1.786 10.367 1.749 10.231 1.749 c
+10.103 1.749 9.999 1.786 9.922 1.866 c
+9.841 1.944 9.804 2.043 9.804 2.161 c
+13.469 -0.191 m
+13.469 -0.673 13.388 -1.036 13.233 -1.278 c
+13.075 -1.525 12.829 -1.646 12.499 -1.646 c
+12.241 -1.646 12.035 -1.529 11.881 -1.294 c
+11.851 -1.587 l
+11.132 -1.587 l
+11.132 2.646 l
+11.911 2.646 l
+11.911 1.147 l
+12.057 1.353 12.252 1.455 12.499 1.455 c
+12.829 1.455 13.072 1.33 13.218 1.087 c
+13.373 0.852 13.457 0.5 13.469 0.029 c
+h
+12.69 0 m
+12.69 0.312 12.653 0.522 12.586 0.632 c
+12.528 0.738 12.425 0.794 12.278 0.794 c
+12.109 0.794 11.988 0.721 11.911 0.573 c
+11.911 -0.779 l
+11.988 -0.926 12.109 -0.999 12.278 -0.999 c
+12.425 -0.999 12.528 -0.952 12.586 -0.852 c
+12.645 -0.757 12.678 -0.565 12.69 -0.279 c
+h
+15.217 -1.309 m
+15.059 -1.536 14.843 -1.646 14.571 -1.646 c
+14.295 -1.646 14.086 -1.554 13.939 -1.367 c
+13.799 -1.172 13.733 -0.897 13.733 -0.544 c
+13.733 1.396 l
+14.512 1.396 l
+14.512 -0.559 l
+14.512 -0.845 14.608 -0.985 14.806 -0.985 c
+14.982 -0.985 15.107 -0.912 15.188 -0.764 c
+15.188 1.396 l
+15.967 1.396 l
+15.967 -1.587 l
+15.247 -1.587 l
+h
+17.249 2.132 m
+17.249 1.396 l
+17.646 1.396 l
+17.646 0.808 l
+17.249 0.808 l
+17.249 -0.676 l
+17.249 -0.794 17.264 -0.878 17.294 -0.926 c
+17.33 -0.966 17.397 -0.985 17.485 -0.985 c
+17.562 -0.985 17.625 -0.977 17.676 -0.956 c
+17.661 -1.573 l
+17.533 -1.621 17.39 -1.646 17.235 -1.646 c
+16.736 -1.646 16.478 -1.359 16.47 -0.779 c
+16.47 0.808 l
+16.133 0.808 l
+16.133 1.396 l
+16.47 1.396 l
+16.47 2.132 l
+h
+19.161 -1.646 m
+18.756 -1.646 18.444 -1.529 18.22 -1.294 c
+18.003 -1.051 17.897 -0.706 17.897 -0.264 c
+17.897 -0.015 l
+17.897 0.455 17.999 0.816 18.205 1.073 c
+18.411 1.326 18.705 1.455 19.088 1.455 c
+19.458 1.455 19.738 1.33 19.925 1.087 c
+20.12 0.852 20.219 0.5 20.219 0.029 c
+20.219 -0.353 l
+18.676 -0.353 l
+18.683 -0.58 18.727 -0.746 18.808 -0.852 c
+18.896 -0.952 19.032 -0.999 19.219 -0.999 c
+19.473 -0.999 19.69 -0.908 19.867 -0.721 c
+20.175 -1.205 l
+20.075 -1.334 19.932 -1.44 19.749 -1.529 c
+19.572 -1.606 19.374 -1.646 19.161 -1.646 c
+18.676 0.191 m
+19.454 0.191 l
+19.454 0.264 l
+19.454 0.441 19.425 0.573 19.366 0.661 c
+19.308 0.757 19.208 0.808 19.073 0.808 c
+18.944 0.808 18.845 0.757 18.778 0.661 c
+18.72 0.563 18.683 0.405 18.676 0.191 c
+20.374 0 m
+20.374 0.489 20.454 0.852 20.623 1.087 c
+20.788 1.33 21.027 1.455 21.344 1.455 c
+21.579 1.455 21.77 1.353 21.916 1.147 c
+21.916 2.646 l
+22.71 2.646 l
+22.71 -1.587 l
+21.991 -1.587 l
+21.961 -1.278 l
+21.803 -1.525 21.597 -1.646 21.344 -1.646 c
+21.027 -1.646 20.788 -1.529 20.623 -1.294 c
+20.465 -1.051 20.381 -0.698 20.374 -0.235 c
+h
+21.153 -0.206 m
+21.153 -0.5 21.182 -0.706 21.241 -0.823 c
+21.307 -0.933 21.417 -0.985 21.564 -0.985 c
+21.718 -0.985 21.836 -0.918 21.916 -0.779 c
+21.916 0.573 l
+21.836 0.721 21.725 0.794 21.579 0.794 c
+21.432 0.794 21.322 0.735 21.255 0.617 c
+21.185 0.507 21.153 0.301 21.153 0 c
+h
+f
+Q
+ endstream endobj 49 0 obj <</BBox[738.525 463.257 767.419 458.964]/Group 85 0 R/Length 6236/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 739.5979 459.7581 cm
+0 0 m
+0.573 2.248 l
+1.073 2.248 l
+0.177 -0.735 l
+-0.176 -0.735 l
+-1.073 2.248 l
+-0.588 2.248 l
+h
+2.44 -0.794 m
+2.065 -0.794 1.783 -0.688 1.588 -0.47 c
+1.39 -0.246 1.294 0.081 1.294 0.515 c
+1.294 0.881 l
+1.294 1.323 1.386 1.668 1.573 1.926 c
+1.768 2.179 2.043 2.308 2.396 2.308 c
+2.738 2.308 2.992 2.194 3.16 1.97 c
+3.337 1.741 3.429 1.396 3.439 0.926 c
+3.439 0.617 l
+1.779 0.617 l
+1.779 0.544 l
+1.779 0.22 1.837 -0.015 1.955 -0.162 c
+2.072 -0.301 2.242 -0.368 2.469 -0.368 c
+2.616 -0.368 2.741 -0.345 2.851 -0.294 c
+2.959 -0.235 3.061 -0.147 3.16 -0.029 c
+3.41 -0.339 l
+3.204 -0.643 2.882 -0.794 2.44 -0.794 c
+2.396 1.882 m
+2.19 1.882 2.036 1.812 1.941 1.675 c
+1.841 1.536 1.787 1.323 1.779 1.029 c
+2.955 1.029 l
+2.955 1.103 l
+2.932 1.374 2.882 1.573 2.793 1.691 c
+2.705 1.816 2.572 1.882 2.396 1.882 c
+5.086 1.793 m
+5.016 1.801 4.943 1.808 4.866 1.808 c
+4.609 1.808 4.432 1.668 4.336 1.396 c
+4.336 -0.735 l
+3.851 -0.735 l
+3.851 2.248 l
+4.322 2.248 l
+4.336 1.94 l
+4.461 2.183 4.645 2.308 4.881 2.308 c
+4.958 2.308 5.02 2.293 5.072 2.263 c
+h
+6.898 0.029 m
+6.898 0.135 6.857 0.224 6.78 0.294 c
+6.699 0.371 6.549 0.459 6.325 0.559 c
+6.059 0.665 5.872 0.757 5.766 0.837 c
+5.656 0.915 5.579 1.003 5.531 1.103 c
+5.479 1.198 5.457 1.315 5.457 1.455 c
+5.457 1.698 5.546 1.899 5.722 2.057 c
+5.898 2.223 6.122 2.308 6.398 2.308 c
+6.692 2.308 6.927 2.219 7.104 2.043 c
+7.279 1.874 7.368 1.66 7.368 1.396 c
+6.883 1.396 l
+6.883 1.532 6.832 1.646 6.736 1.735 c
+6.648 1.83 6.533 1.882 6.398 1.882 c
+6.251 1.882 6.137 1.841 6.059 1.764 c
+5.979 1.694 5.943 1.595 5.943 1.469 c
+5.943 1.371 5.972 1.294 6.03 1.234 c
+6.089 1.176 6.229 1.095 6.456 0.999 c
+6.817 0.852 7.063 0.709 7.192 0.573 c
+7.327 0.445 7.397 0.272 7.397 0.058 c
+7.397 -0.198 7.302 -0.405 7.119 -0.559 c
+6.942 -0.717 6.707 -0.794 6.413 -0.794 c
+6.097 -0.794 5.843 -0.706 5.648 -0.53 c
+5.461 -0.345 5.369 -0.114 5.369 0.162 c
+5.854 0.162 l
+5.862 -0.008 5.913 -0.14 6.001 -0.235 c
+6.097 -0.324 6.236 -0.368 6.413 -0.368 c
+6.567 -0.368 6.685 -0.335 6.765 -0.264 c
+6.853 -0.198 6.898 -0.1 6.898 0.029 c
+8.386 -0.735 -0.5 2.983 re
+8.415 3.042 m
+8.415 2.954 8.39 2.881 8.342 2.822 c
+8.301 2.771 8.232 2.749 8.137 2.749 c
+8.048 2.749 7.978 2.771 7.93 2.822 c
+7.89 2.881 7.871 2.947 7.871 3.028 c
+7.871 3.116 7.89 3.189 7.93 3.248 c
+7.978 3.307 8.048 3.337 8.137 3.337 c
+8.232 3.337 8.301 3.307 8.342 3.248 c
+8.39 3.189 8.415 3.119 8.415 3.042 c
+8.956 0.897 m
+8.956 1.326 9.058 1.668 9.264 1.926 c
+9.477 2.179 9.756 2.308 10.102 2.308 c
+10.444 2.308 10.72 2.179 10.925 1.926 c
+11.138 1.679 11.252 1.345 11.263 0.926 c
+11.263 0.617 l
+11.263 0.183 11.153 -0.158 10.94 -0.412 c
+10.734 -0.669 10.454 -0.794 10.102 -0.794 c
+9.756 -0.794 9.485 -0.673 9.279 -0.426 c
+9.073 -0.183 8.962 0.151 8.956 0.573 c
+h
+9.44 0.617 m
+9.44 0.301 9.5 0.058 9.617 -0.118 c
+9.742 -0.287 9.903 -0.368 10.102 -0.368 c
+10.532 -0.368 10.756 -0.059 10.778 0.559 c
+10.778 0.897 l
+10.778 1.198 10.712 1.44 10.587 1.617 c
+10.47 1.793 10.308 1.882 10.102 1.882 c
+9.903 1.882 9.742 1.793 9.617 1.617 c
+9.5 1.44 9.44 1.198 9.44 0.897 c
+h
+12.16 2.248 m
+12.174 1.926 l
+12.359 2.179 12.601 2.308 12.895 2.308 c
+13.424 2.308 13.693 1.955 13.704 1.249 c
+13.704 -0.735 l
+13.218 -0.735 l
+13.218 1.22 l
+13.218 1.455 13.178 1.621 13.101 1.72 c
+13.02 1.816 12.902 1.866 12.748 1.866 c
+12.63 1.866 12.52 1.826 12.424 1.749 c
+12.326 1.668 12.248 1.562 12.189 1.425 c
+12.189 -0.735 l
+11.704 -0.735 l
+11.704 2.248 l
+h
+16.488 -0.368 m
+16.654 -0.368 16.787 -0.32 16.885 -0.221 c
+16.981 -0.125 17.036 0.018 17.047 0.206 c
+17.503 0.206 l
+17.492 -0.081 17.389 -0.32 17.194 -0.515 c
+17.007 -0.702 16.772 -0.794 16.488 -0.794 c
+16.125 -0.794 15.846 -0.676 15.651 -0.441 c
+15.453 -0.206 15.357 0.139 15.357 0.602 c
+15.357 0.926 l
+15.357 1.374 15.449 1.72 15.636 1.955 c
+15.831 2.19 16.114 2.308 16.488 2.308 c
+16.79 2.308 17.033 2.209 17.209 2.013 c
+17.392 1.816 17.492 1.55 17.503 1.22 c
+17.047 1.22 l
+17.026 1.444 16.966 1.61 16.871 1.72 c
+16.783 1.826 16.654 1.882 16.488 1.882 c
+16.272 1.882 16.11 1.808 16.004 1.66 c
+15.904 1.521 15.85 1.294 15.842 0.97 c
+15.842 0.588 l
+15.842 0.235 15.89 -0.015 15.989 -0.162 c
+16.095 -0.301 16.261 -0.368 16.488 -0.368 c
+17.793 0.897 m
+17.793 1.326 17.897 1.668 18.102 1.926 c
+18.315 2.179 18.595 2.308 18.94 2.308 c
+19.281 2.308 19.557 2.179 19.763 1.926 c
+19.976 1.679 20.09 1.345 20.101 0.926 c
+20.101 0.617 l
+20.101 0.183 19.991 -0.158 19.778 -0.412 c
+19.572 -0.669 19.293 -0.794 18.94 -0.794 c
+18.595 -0.794 18.323 -0.673 18.117 -0.426 c
+17.911 -0.183 17.801 0.151 17.793 0.573 c
+h
+18.279 0.617 m
+18.279 0.301 18.337 0.058 18.455 -0.118 c
+18.58 -0.287 18.742 -0.368 18.94 -0.368 c
+19.37 -0.368 19.594 -0.059 19.616 0.559 c
+19.616 0.897 l
+19.616 1.198 19.55 1.44 19.425 1.617 c
+19.308 1.793 19.146 1.882 18.94 1.882 c
+18.742 1.882 18.58 1.793 18.455 1.617 c
+18.337 1.44 18.279 1.198 18.279 0.897 c
+h
+20.997 2.248 m
+21.012 1.926 l
+21.196 2.179 21.439 2.308 21.733 2.308 c
+22.262 2.308 22.53 1.955 22.541 1.249 c
+22.541 -0.735 l
+22.056 -0.735 l
+22.056 1.22 l
+22.056 1.455 22.015 1.621 21.938 1.72 c
+21.857 1.816 21.74 1.866 21.585 1.866 c
+21.468 1.866 21.358 1.826 21.263 1.749 c
+21.163 1.668 21.086 1.562 21.027 1.425 c
+21.027 -0.735 l
+20.542 -0.735 l
+20.542 2.248 l
+h
+24.327 1.793 m
+24.257 1.801 24.184 1.808 24.106 1.808 c
+23.85 1.808 23.673 1.668 23.578 1.396 c
+23.578 -0.735 l
+23.092 -0.735 l
+23.092 2.248 l
+23.563 2.248 l
+23.578 1.94 l
+23.702 2.183 23.886 2.308 24.122 2.308 c
+24.199 2.308 24.261 2.293 24.313 2.263 c
+h
+24.544 0.897 m
+24.544 1.326 24.646 1.668 24.852 1.926 c
+25.066 2.179 25.345 2.308 25.691 2.308 c
+26.032 2.308 26.308 2.179 26.514 1.926 c
+26.726 1.679 26.84 1.345 26.852 0.926 c
+26.852 0.617 l
+26.852 0.183 26.742 -0.158 26.528 -0.412 c
+26.323 -0.669 26.043 -0.794 25.691 -0.794 c
+25.345 -0.794 25.073 -0.673 24.868 -0.426 c
+24.662 -0.183 24.551 0.151 24.544 0.573 c
+h
+25.029 0.617 m
+25.029 0.301 25.088 0.058 25.205 -0.118 c
+25.33 -0.287 25.492 -0.368 25.691 -0.368 c
+26.121 -0.368 26.345 -0.059 26.366 0.559 c
+26.366 0.897 l
+26.366 1.198 26.3 1.44 26.175 1.617 c
+26.058 1.793 25.896 1.882 25.691 1.882 c
+25.492 1.882 25.33 1.793 25.205 1.617 c
+25.088 1.44 25.029 1.198 25.029 0.897 c
+h
+27.821 -0.735 -0.5 4.233 re
+f
+Q
+ endstream endobj 50 0 obj <</BBox[701.664 456.672 764.976 451.232]/Group 86 0 R/Length 14524/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 703.1923 453.2021 cm
+0 0 m
+0 0.106 -0.04 0.195 -0.118 0.264 c
+-0.198 0.341 -0.349 0.43 -0.574 0.53 c
+-0.838 0.636 -1.025 0.728 -1.132 0.808 c
+-1.242 0.886 -1.319 0.974 -1.367 1.073 c
+-1.419 1.168 -1.44 1.286 -1.44 1.426 c
+-1.44 1.669 -1.353 1.87 -1.176 2.028 c
+-1 2.194 -0.775 2.278 -0.5 2.278 c
+-0.206 2.278 0.029 2.19 0.206 2.014 c
+0.382 1.845 0.47 1.631 0.47 1.367 c
+-0.015 1.367 l
+-0.015 1.503 -0.066 1.617 -0.162 1.706 c
+-0.25 1.801 -0.364 1.852 -0.5 1.852 c
+-0.647 1.852 -0.761 1.812 -0.838 1.735 c
+-0.919 1.665 -0.956 1.565 -0.956 1.44 c
+-0.956 1.341 -0.926 1.264 -0.867 1.205 c
+-0.809 1.147 -0.669 1.066 -0.441 0.97 c
+-0.081 0.823 0.166 0.68 0.294 0.544 c
+0.43 0.416 0.5 0.243 0.5 0.029 c
+0.5 -0.228 0.405 -0.434 0.22 -0.588 c
+0.044 -0.746 -0.191 -0.823 -0.485 -0.823 c
+-0.802 -0.823 -1.055 -0.735 -1.249 -0.559 c
+-1.436 -0.374 -1.529 -0.143 -1.529 0.133 c
+-1.044 0.133 l
+-1.037 -0.037 -0.985 -0.169 -0.896 -0.264 c
+-0.802 -0.353 -0.661 -0.397 -0.485 -0.397 c
+-0.331 -0.397 -0.214 -0.364 -0.133 -0.294 c
+-0.044 -0.228 0 -0.129 0 0 c
+1.768 0.044 m
+2.311 2.219 l
+2.826 2.219 l
+1.856 -1.191 l
+1.786 -1.444 1.683 -1.635 1.547 -1.764 c
+1.407 -1.899 1.257 -1.97 1.091 -1.97 c
+1.022 -1.97 0.937 -1.955 0.841 -1.926 c
+0.841 -1.514 l
+0.945 -1.529 l
+1.08 -1.529 1.187 -1.492 1.268 -1.426 c
+1.356 -1.356 1.422 -1.238 1.473 -1.073 c
+1.562 -0.735 l
+0.694 2.219 l
+1.224 2.219 l
+h
+4.59 0 m
+4.59 0.106 4.549 0.195 4.472 0.264 c
+4.391 0.341 4.241 0.43 4.016 0.53 c
+3.752 0.636 3.564 0.728 3.458 0.808 c
+3.347 0.886 3.27 0.974 3.223 1.073 c
+3.171 1.168 3.15 1.286 3.15 1.426 c
+3.15 1.669 3.237 1.87 3.414 2.028 c
+3.59 2.194 3.815 2.278 4.09 2.278 c
+4.384 2.278 4.619 2.19 4.796 2.014 c
+4.972 1.845 5.06 1.631 5.06 1.367 c
+4.575 1.367 l
+4.575 1.503 4.523 1.617 4.428 1.706 c
+4.34 1.801 4.226 1.852 4.09 1.852 c
+3.943 1.852 3.829 1.812 3.752 1.735 c
+3.671 1.665 3.634 1.565 3.634 1.44 c
+3.634 1.341 3.663 1.264 3.723 1.205 c
+3.781 1.147 3.921 1.066 4.149 0.97 c
+4.509 0.823 4.755 0.68 4.883 0.544 c
+5.02 0.416 5.089 0.243 5.089 0.029 c
+5.089 -0.228 4.993 -0.434 4.81 -0.588 c
+4.634 -0.746 4.399 -0.823 4.104 -0.823 c
+3.788 -0.823 3.535 -0.735 3.341 -0.559 c
+3.152 -0.374 3.061 -0.143 3.061 0.133 c
+3.546 0.133 l
+3.553 -0.037 3.605 -0.169 3.693 -0.264 c
+3.788 -0.353 3.929 -0.397 4.104 -0.397 c
+4.259 -0.397 4.376 -0.364 4.457 -0.294 c
+4.546 -0.228 4.59 -0.129 4.59 0 c
+6.181 2.94 m
+6.181 2.219 l
+6.637 2.219 l
+6.637 1.823 l
+6.181 1.823 l
+6.181 -0.029 l
+6.181 -0.147 6.2 -0.235 6.24 -0.294 c
+6.277 -0.353 6.346 -0.382 6.445 -0.382 c
+6.504 -0.382 6.566 -0.374 6.637 -0.353 c
+6.637 -0.764 l
+6.519 -0.801 6.405 -0.823 6.298 -0.823 c
+6.1 -0.823 5.949 -0.757 5.843 -0.617 c
+5.743 -0.482 5.696 -0.287 5.696 -0.029 c
+5.696 1.823 l
+5.24 1.823 l
+5.24 2.219 l
+5.696 2.219 l
+5.696 2.94 l
+h
+8.158 -0.823 m
+7.783 -0.823 7.501 -0.717 7.306 -0.5 c
+7.107 -0.276 7.011 0.052 7.011 0.485 c
+7.011 0.852 l
+7.011 1.294 7.104 1.639 7.291 1.897 c
+7.486 2.15 7.761 2.278 8.114 2.278 c
+8.455 2.278 8.709 2.165 8.878 1.941 c
+9.055 1.712 9.147 1.367 9.157 0.897 c
+9.157 0.588 l
+7.497 0.588 l
+7.497 0.515 l
+7.497 0.191 7.555 -0.044 7.673 -0.191 c
+7.79 -0.33 7.96 -0.397 8.187 -0.397 c
+8.334 -0.397 8.459 -0.374 8.569 -0.324 c
+8.676 -0.264 8.779 -0.176 8.878 -0.058 c
+9.128 -0.368 l
+8.922 -0.673 8.598 -0.823 8.158 -0.823 c
+8.114 1.852 m
+7.908 1.852 7.754 1.783 7.658 1.646 c
+7.559 1.507 7.503 1.294 7.497 1 c
+8.673 1 l
+8.673 1.073 l
+8.65 1.345 8.598 1.544 8.511 1.661 c
+8.422 1.786 8.29 1.852 8.114 1.852 c
+10.025 2.219 m
+10.04 1.941 l
+10.216 2.165 10.454 2.278 10.759 2.278 c
+11.09 2.278 11.322 2.132 11.451 1.837 c
+11.634 2.132 11.895 2.278 12.23 2.278 c
+12.788 2.278 13.071 1.933 13.082 1.249 c
+13.082 -0.764 l
+12.597 -0.764 l
+12.597 1.205 l
+12.597 1.419 12.557 1.577 12.48 1.675 c
+12.399 1.783 12.266 1.837 12.083 1.837 c
+11.935 1.837 11.818 1.779 11.73 1.661 c
+11.642 1.551 11.586 1.411 11.568 1.235 c
+11.568 -0.764 l
+11.083 -0.764 l
+11.083 1.22 l
+11.072 1.631 10.899 1.837 10.568 1.837 c
+10.323 1.837 10.15 1.712 10.054 1.47 c
+10.054 -0.764 l
+9.569 -0.764 l
+9.569 2.219 l
+h
+13.56 -0.5 m
+13.56 -0.411 13.581 -0.338 13.633 -0.279 c
+13.692 -0.22 13.77 -0.191 13.868 -0.191 c
+13.975 -0.191 14.052 -0.22 14.104 -0.279 c
+14.163 -0.338 14.192 -0.411 14.192 -0.5 c
+14.192 -0.58 14.163 -0.646 14.104 -0.706 c
+14.052 -0.764 13.975 -0.794 13.868 -0.794 c
+13.77 -0.794 13.692 -0.764 13.633 -0.706 c
+13.581 -0.646 13.56 -0.58 13.56 -0.5 c
+17.242 1.235 m
+18.05 3.248 l
+18.624 3.248 l
+17.492 0.735 l
+17.492 -0.764 l
+16.978 -0.764 l
+16.978 0.735 l
+15.846 3.248 l
+16.419 3.248 l
+h
+18.624 0.867 m
+18.624 1.297 18.726 1.639 18.932 1.897 c
+19.145 2.15 19.424 2.278 19.771 2.278 c
+20.112 2.278 20.388 2.15 20.593 1.897 c
+20.806 1.65 20.92 1.316 20.931 0.897 c
+20.931 0.588 l
+20.931 0.154 20.821 -0.187 20.608 -0.441 c
+20.402 -0.698 20.122 -0.823 19.771 -0.823 c
+19.424 -0.823 19.153 -0.702 18.947 -0.455 c
+18.741 -0.213 18.631 0.121 18.624 0.544 c
+h
+19.108 0.588 m
+19.108 0.272 19.168 0.029 19.285 -0.147 c
+19.41 -0.316 19.572 -0.397 19.771 -0.397 c
+20.201 -0.397 20.424 -0.088 20.446 0.53 c
+20.446 0.867 l
+20.446 1.168 20.38 1.411 20.255 1.588 c
+20.138 1.764 19.976 1.852 19.771 1.852 c
+19.572 1.852 19.41 1.764 19.285 1.588 c
+19.168 1.411 19.108 1.168 19.108 0.867 c
+h
+22.886 -0.5 m
+22.728 -0.717 22.493 -0.823 22.181 -0.823 c
+21.916 -0.823 21.71 -0.731 21.564 -0.544 c
+21.423 -0.36 21.358 -0.085 21.358 0.279 c
+21.358 2.219 l
+21.843 2.219 l
+21.843 0.309 l
+21.843 -0.154 21.982 -0.382 22.269 -0.382 c
+22.563 -0.382 22.761 -0.25 22.871 0.015 c
+22.871 2.219 l
+23.372 2.219 l
+23.372 -0.764 l
+22.901 -0.764 l
+h
+26.157 -0.397 m
+26.322 -0.397 26.455 -0.349 26.553 -0.25 c
+26.649 -0.154 26.705 -0.011 26.715 0.177 c
+27.171 0.177 l
+27.16 -0.11 27.058 -0.349 26.863 -0.544 c
+26.675 -0.731 26.439 -0.823 26.157 -0.823 c
+25.793 -0.823 25.514 -0.706 25.319 -0.47 c
+25.121 -0.235 25.025 0.11 25.025 0.573 c
+25.025 0.897 l
+25.025 1.345 25.117 1.691 25.304 1.926 c
+25.499 2.161 25.782 2.278 26.157 2.278 c
+26.458 2.278 26.701 2.18 26.877 1.984 c
+27.061 1.786 27.16 1.521 27.171 1.191 c
+26.715 1.191 l
+26.693 1.415 26.634 1.58 26.539 1.691 c
+26.451 1.797 26.322 1.852 26.157 1.852 c
+25.94 1.852 25.778 1.779 25.672 1.631 c
+25.572 1.492 25.518 1.264 25.51 0.941 c
+25.51 0.559 l
+25.51 0.206 25.558 -0.044 25.657 -0.191 c
+25.764 -0.33 25.929 -0.397 26.157 -0.397 c
+29.097 -0.764 m
+29.067 -0.698 29.045 -0.588 29.038 -0.441 c
+28.862 -0.698 28.641 -0.823 28.376 -0.823 c
+28.101 -0.823 27.884 -0.75 27.729 -0.603 c
+27.583 -0.448 27.509 -0.231 27.509 0.044 c
+27.509 0.345 27.612 0.588 27.818 0.765 c
+28.024 0.948 28.307 1.043 28.67 1.043 c
+29.023 1.043 l
+29.023 1.367 l
+29.023 1.544 28.982 1.665 28.905 1.735 c
+28.824 1.812 28.708 1.852 28.552 1.852 c
+28.406 1.852 28.281 1.808 28.185 1.72 c
+28.097 1.631 28.053 1.521 28.053 1.396 c
+27.568 1.396 l
+27.568 1.544 27.612 1.683 27.7 1.823 c
+27.789 1.97 27.906 2.08 28.053 2.161 c
+28.207 2.238 28.38 2.278 28.567 2.278 c
+28.88 2.278 29.115 2.198 29.273 2.043 c
+29.427 1.897 29.508 1.675 29.508 1.382 c
+29.508 -0.118 l
+29.516 -0.353 29.552 -0.555 29.611 -0.721 c
+29.611 -0.764 l
+h
+28.45 -0.382 m
+28.567 -0.382 28.677 -0.349 28.788 -0.279 c
+28.895 -0.213 28.972 -0.129 29.023 -0.029 c
+29.023 0.676 l
+28.758 0.676 l
+28.523 0.676 28.336 0.625 28.2 0.53 c
+28.072 0.43 28.009 0.287 28.009 0.103 c
+28.009 -0.066 28.039 -0.187 28.097 -0.264 c
+28.163 -0.345 28.281 -0.382 28.45 -0.382 c
+30.545 2.219 m
+30.559 1.897 l
+30.743 2.15 30.985 2.278 31.28 2.278 c
+31.808 2.278 32.077 1.926 32.088 1.22 c
+32.088 -0.764 l
+31.603 -0.764 l
+31.603 1.191 l
+31.603 1.426 31.563 1.592 31.486 1.691 c
+31.405 1.786 31.287 1.837 31.133 1.837 c
+31.015 1.837 30.904 1.797 30.809 1.72 c
+30.709 1.639 30.632 1.532 30.574 1.396 c
+30.574 -0.764 l
+30.089 -0.764 l
+30.089 2.219 l
+h
+34.329 1.911 m
+34.513 2.153 34.748 2.278 35.035 2.278 c
+35.565 2.278 35.833 1.926 35.843 1.22 c
+35.843 -0.764 l
+35.359 -0.764 l
+35.359 1.191 l
+35.359 1.426 35.318 1.592 35.241 1.691 c
+35.16 1.786 35.043 1.837 34.888 1.837 c
+34.771 1.837 34.661 1.797 34.565 1.72 c
+34.466 1.639 34.389 1.532 34.329 1.396 c
+34.329 -0.764 l
+33.844 -0.764 l
+33.844 3.469 l
+34.329 3.469 l
+h
+37.913 -0.764 m
+37.883 -0.698 37.861 -0.588 37.853 -0.441 c
+37.678 -0.698 37.456 -0.823 37.192 -0.823 c
+36.917 -0.823 36.7 -0.75 36.546 -0.603 c
+36.398 -0.448 36.325 -0.231 36.325 0.044 c
+36.325 0.345 36.428 0.588 36.633 0.765 c
+36.839 0.948 37.123 1.043 37.487 1.043 c
+37.839 1.043 l
+37.839 1.367 l
+37.839 1.544 37.799 1.665 37.722 1.735 c
+37.641 1.812 37.523 1.852 37.369 1.852 c
+37.221 1.852 37.096 1.808 37.001 1.72 c
+36.913 1.631 36.869 1.521 36.869 1.396 c
+36.384 1.396 l
+36.384 1.544 36.428 1.683 36.516 1.823 c
+36.604 1.97 36.722 2.08 36.869 2.161 c
+37.023 2.238 37.196 2.278 37.383 2.278 c
+37.695 2.278 37.931 2.198 38.089 2.043 c
+38.243 1.897 38.324 1.675 38.324 1.382 c
+38.324 -0.118 l
+38.331 -0.353 38.368 -0.555 38.427 -0.721 c
+38.427 -0.764 l
+h
+37.266 -0.382 m
+37.383 -0.382 37.493 -0.349 37.604 -0.279 c
+37.711 -0.213 37.788 -0.129 37.839 -0.029 c
+37.839 0.676 l
+37.574 0.676 l
+37.339 0.676 37.152 0.625 37.016 0.53 c
+36.887 0.43 36.824 0.287 36.824 0.103 c
+36.824 -0.066 36.854 -0.187 36.913 -0.264 c
+36.979 -0.345 37.096 -0.382 37.266 -0.382 c
+39.702 -0.029 m
+40.275 2.219 l
+40.775 2.219 l
+39.878 -0.764 l
+39.526 -0.764 l
+38.629 2.219 l
+39.114 2.219 l
+h
+42.146 -0.823 m
+41.771 -0.823 41.488 -0.717 41.293 -0.5 c
+41.094 -0.276 40.999 0.052 40.999 0.485 c
+40.999 0.852 l
+40.999 1.294 41.091 1.639 41.279 1.897 c
+41.473 2.15 41.749 2.278 42.102 2.278 c
+42.443 2.278 42.697 2.165 42.866 1.941 c
+43.043 1.712 43.134 1.367 43.145 0.897 c
+43.145 0.588 l
+41.485 0.588 l
+41.485 0.515 l
+41.485 0.191 41.543 -0.044 41.661 -0.191 c
+41.778 -0.33 41.948 -0.397 42.175 -0.397 c
+42.322 -0.397 42.447 -0.374 42.557 -0.324 c
+42.664 -0.264 42.767 -0.176 42.866 -0.058 c
+43.116 -0.368 l
+42.91 -0.673 42.586 -0.823 42.146 -0.823 c
+42.102 1.852 m
+41.896 1.852 41.742 1.783 41.646 1.646 c
+41.547 1.507 41.491 1.294 41.485 1 c
+42.661 1 l
+42.661 1.073 l
+42.638 1.345 42.586 1.544 42.499 1.661 c
+42.41 1.786 42.278 1.852 42.102 1.852 c
+46.287 -0.764 m
+46.258 -0.698 46.235 -0.588 46.228 -0.441 c
+46.052 -0.698 45.832 -0.823 45.567 -0.823 c
+45.291 -0.823 45.075 -0.75 44.92 -0.603 c
+44.774 -0.448 44.7 -0.231 44.7 0.044 c
+44.7 0.345 44.803 0.588 45.009 0.765 c
+45.214 0.948 45.497 1.043 45.861 1.043 c
+46.214 1.043 l
+46.214 1.367 l
+46.214 1.544 46.173 1.665 46.096 1.735 c
+46.015 1.812 45.898 1.852 45.743 1.852 c
+45.597 1.852 45.472 1.808 45.376 1.72 c
+45.287 1.631 45.244 1.521 45.244 1.396 c
+44.758 1.396 l
+44.758 1.544 44.803 1.683 44.891 1.823 c
+44.979 1.97 45.096 2.08 45.244 2.161 c
+45.398 2.238 45.57 2.278 45.758 2.278 c
+46.071 2.278 46.306 2.198 46.463 2.043 c
+46.618 1.897 46.698 1.675 46.698 1.382 c
+46.698 -0.118 l
+46.706 -0.353 46.743 -0.555 46.802 -0.721 c
+46.802 -0.764 l
+h
+45.641 -0.382 m
+45.758 -0.382 45.869 -0.349 45.979 -0.279 c
+46.085 -0.213 46.162 -0.129 46.214 -0.029 c
+46.214 0.676 l
+45.949 0.676 l
+45.714 0.676 45.526 0.625 45.391 0.53 c
+45.262 0.43 45.2 0.287 45.2 0.103 c
+45.2 -0.066 45.229 -0.187 45.287 -0.264 c
+45.354 -0.345 45.472 -0.382 45.641 -0.382 c
+48.72 0 m
+48.72 0.106 48.68 0.195 48.602 0.264 c
+48.521 0.341 48.371 0.43 48.147 0.53 c
+47.882 0.636 47.695 0.728 47.588 0.808 c
+47.478 0.886 47.401 0.974 47.353 1.073 c
+47.301 1.168 47.28 1.286 47.28 1.426 c
+47.28 1.669 47.367 1.87 47.544 2.028 c
+47.72 2.194 47.945 2.278 48.22 2.278 c
+48.514 2.278 48.749 2.19 48.926 2.014 c
+49.102 1.845 49.19 1.631 49.19 1.367 c
+48.705 1.367 l
+48.705 1.503 48.654 1.617 48.558 1.706 c
+48.47 1.801 48.356 1.852 48.22 1.852 c
+48.073 1.852 47.959 1.812 47.882 1.735 c
+47.801 1.665 47.764 1.565 47.764 1.44 c
+47.764 1.341 47.794 1.264 47.853 1.205 c
+47.912 1.147 48.051 1.066 48.279 0.97 c
+48.639 0.823 48.886 0.68 49.013 0.544 c
+49.15 0.416 49.219 0.243 49.219 0.029 c
+49.219 -0.228 49.124 -0.434 48.94 -0.588 c
+48.764 -0.746 48.529 -0.823 48.235 -0.823 c
+47.918 -0.823 47.665 -0.735 47.471 -0.559 c
+47.284 -0.374 47.191 -0.143 47.191 0.133 c
+47.677 0.133 l
+47.683 -0.037 47.735 -0.169 47.823 -0.264 c
+47.918 -0.353 48.059 -0.397 48.235 -0.397 c
+48.389 -0.397 48.506 -0.364 48.587 -0.294 c
+48.676 -0.228 48.72 -0.129 48.72 0 c
+51.336 2.219 m
+51.351 1.941 l
+51.527 2.165 51.766 2.278 52.071 2.278 c
+52.402 2.278 52.633 2.132 52.762 1.837 c
+52.946 2.132 53.206 2.278 53.541 2.278 c
+54.1 2.278 54.382 1.933 54.394 1.249 c
+54.394 -0.764 l
+53.909 -0.764 l
+53.909 1.205 l
+53.909 1.419 53.869 1.577 53.792 1.675 c
+53.711 1.783 53.578 1.837 53.394 1.837 c
+53.247 1.837 53.129 1.779 53.042 1.661 c
+52.953 1.551 52.898 1.411 52.88 1.235 c
+52.88 -0.764 l
+52.394 -0.764 l
+52.394 1.22 l
+52.383 1.631 52.211 1.837 51.88 1.837 c
+51.634 1.837 51.461 1.712 51.365 1.47 c
+51.365 -0.764 l
+50.881 -0.764 l
+50.881 2.219 l
+h
+56.371 -0.764 m
+56.341 -0.698 56.319 -0.588 56.312 -0.441 c
+56.136 -0.698 55.915 -0.823 55.65 -0.823 c
+55.375 -0.823 55.158 -0.75 55.004 -0.603 c
+54.856 -0.448 54.783 -0.231 54.783 0.044 c
+54.783 0.345 54.887 0.588 55.092 0.765 c
+55.298 0.948 55.581 1.043 55.945 1.043 c
+56.298 1.043 l
+56.298 1.367 l
+56.298 1.544 56.257 1.665 56.18 1.735 c
+56.099 1.812 55.982 1.852 55.827 1.852 c
+55.68 1.852 55.555 1.808 55.459 1.72 c
+55.371 1.631 55.327 1.521 55.327 1.396 c
+54.842 1.396 l
+54.842 1.544 54.887 1.683 54.974 1.823 c
+55.062 1.97 55.18 2.08 55.327 2.161 c
+55.481 2.238 55.654 2.278 55.841 2.278 c
+56.154 2.278 56.389 2.198 56.547 2.043 c
+56.701 1.897 56.782 1.675 56.782 1.382 c
+56.782 -0.118 l
+56.79 -0.353 56.826 -0.555 56.886 -0.721 c
+56.886 -0.764 l
+h
+55.724 -0.382 m
+55.841 -0.382 55.951 -0.349 56.062 -0.279 c
+56.169 -0.213 56.246 -0.129 56.298 -0.029 c
+56.298 0.676 l
+56.032 0.676 l
+55.797 0.676 55.61 0.625 55.474 0.53 c
+55.346 0.43 55.284 0.287 55.284 0.103 c
+55.284 -0.066 55.313 -0.187 55.371 -0.264 c
+55.438 -0.345 55.555 -0.382 55.724 -0.382 c
+57.819 2.219 m
+57.833 1.897 l
+58.017 2.15 58.26 2.278 58.554 2.278 c
+59.083 2.278 59.351 1.926 59.362 1.22 c
+59.362 -0.764 l
+58.877 -0.764 l
+58.877 1.191 l
+58.877 1.426 58.837 1.592 58.76 1.691 c
+58.679 1.786 58.561 1.837 58.407 1.837 c
+58.289 1.837 58.179 1.797 58.083 1.72 c
+57.984 1.639 57.907 1.532 57.848 1.396 c
+57.848 -0.764 l
+57.363 -0.764 l
+57.363 2.219 l
+h
+60.726 0.044 m
+61.269 2.219 l
+61.784 2.219 l
+60.813 -1.191 l
+60.744 -1.444 60.641 -1.635 60.505 -1.764 c
+60.365 -1.899 60.215 -1.97 60.049 -1.97 c
+59.98 -1.97 59.895 -1.955 59.799 -1.926 c
+59.799 -1.514 l
+59.903 -1.529 l
+60.038 -1.529 60.144 -1.492 60.225 -1.426 c
+60.314 -1.356 60.379 -1.238 60.431 -1.073 c
+60.52 -0.735 l
+59.652 2.219 l
+60.182 2.219 l
+h
+f
+Q
+ endstream endobj 51 0 obj <</BBox[623.858 230.42 661.638 225.011]/Group 87 0 R/Length 8912/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 624.3423 228.8612 cm
+0 0 m
+0.184 0.243 0.42 0.368 0.706 0.368 c
+1.235 0.368 1.503 0.015 1.515 -0.691 c
+1.515 -2.675 l
+1.029 -2.675 l
+1.029 -0.72 l
+1.029 -0.484 0.989 -0.319 0.912 -0.22 c
+0.831 -0.124 0.713 -0.073 0.559 -0.073 c
+0.441 -0.073 0.331 -0.114 0.235 -0.191 c
+0.136 -0.272 0.059 -0.378 0 -0.514 c
+0 -2.675 l
+-0.484 -2.675 l
+-0.484 1.559 l
+0 1.559 l
+h
+3.583 -2.675 m
+3.554 -2.609 3.532 -2.499 3.525 -2.352 c
+3.348 -2.609 3.128 -2.734 2.863 -2.734 c
+2.587 -2.734 2.371 -2.66 2.216 -2.513 c
+2.07 -2.358 1.996 -2.142 1.996 -1.866 c
+1.996 -1.565 2.099 -1.323 2.305 -1.146 c
+2.51 -0.962 2.793 -0.866 3.157 -0.866 c
+3.51 -0.866 l
+3.51 -0.544 l
+3.51 -0.367 3.47 -0.246 3.392 -0.176 c
+3.311 -0.099 3.194 -0.058 3.04 -0.058 c
+2.893 -0.058 2.768 -0.103 2.672 -0.191 c
+2.584 -0.278 2.54 -0.389 2.54 -0.514 c
+2.055 -0.514 l
+2.055 -0.367 2.099 -0.228 2.187 -0.087 c
+2.275 0.059 2.392 0.169 2.54 0.25 c
+2.694 0.327 2.866 0.368 3.055 0.368 c
+3.367 0.368 3.602 0.287 3.76 0.133 c
+3.914 -0.014 3.995 -0.235 3.995 -0.529 c
+3.995 -2.028 l
+4.002 -2.263 4.039 -2.466 4.098 -2.63 c
+4.098 -2.675 l
+h
+2.937 -2.293 m
+3.055 -2.293 3.165 -2.26 3.275 -2.19 c
+3.381 -2.123 3.458 -2.04 3.51 -1.94 c
+3.51 -1.234 l
+3.246 -1.234 l
+3.01 -1.234 2.822 -1.286 2.687 -1.381 c
+2.558 -1.481 2.496 -1.624 2.496 -1.807 c
+2.496 -1.977 2.525 -2.098 2.584 -2.175 c
+2.65 -2.256 2.768 -2.293 2.937 -2.293 c
+5.604 -2.308 m
+5.77 -2.308 5.902 -2.26 6.001 -2.16 c
+6.097 -2.065 6.152 -1.922 6.163 -1.734 c
+6.619 -1.734 l
+6.608 -2.021 6.505 -2.26 6.31 -2.454 c
+6.122 -2.642 5.887 -2.734 5.604 -2.734 c
+5.241 -2.734 4.962 -2.616 4.767 -2.381 c
+4.568 -2.146 4.472 -1.801 4.472 -1.337 c
+4.472 -1.014 l
+4.472 -0.565 4.564 -0.22 4.752 0.015 c
+4.946 0.25 5.23 0.368 5.604 0.368 c
+5.906 0.368 6.149 0.269 6.325 0.074 c
+6.508 -0.124 6.608 -0.389 6.619 -0.72 c
+6.163 -0.72 l
+6.141 -0.496 6.082 -0.33 5.987 -0.22 c
+5.898 -0.114 5.77 -0.058 5.604 -0.058 c
+5.388 -0.058 5.226 -0.132 5.12 -0.278 c
+5.02 -0.419 4.965 -0.646 4.958 -0.97 c
+4.958 -1.352 l
+4.958 -1.705 5.006 -1.955 5.104 -2.102 c
+5.212 -2.241 5.376 -2.308 5.604 -2.308 c
+7.765 -1.308 m
+7.501 -1.602 l
+7.501 -2.675 l
+7.015 -2.675 l
+7.015 1.559 l
+7.501 1.559 l
+7.501 -0.97 l
+8.426 0.309 l
+9.015 0.309 l
+8.074 -0.941 l
+9.147 -2.675 l
+8.574 -2.675 l
+h
+9.922 -2.675 -0.5 2.984 re
+9.952 1.103 m
+9.952 1.015 9.926 0.941 9.878 0.882 c
+9.837 0.831 9.768 0.809 9.673 0.809 c
+9.584 0.809 9.515 0.831 9.467 0.882 c
+9.426 0.941 9.407 1.008 9.407 1.088 c
+9.407 1.176 9.426 1.25 9.467 1.309 c
+9.515 1.368 9.584 1.397 9.673 1.397 c
+9.768 1.397 9.837 1.368 9.878 1.309 c
+9.926 1.25 9.952 1.18 9.952 1.103 c
+11.051 0.309 m
+11.065 -0.014 l
+11.248 0.239 11.491 0.368 11.786 0.368 c
+12.314 0.368 12.582 0.015 12.594 -0.691 c
+12.594 -2.675 l
+12.109 -2.675 l
+12.109 -0.72 l
+12.109 -0.484 12.069 -0.319 11.992 -0.22 c
+11.911 -0.124 11.793 -0.073 11.639 -0.073 c
+11.521 -0.073 11.41 -0.114 11.315 -0.191 c
+11.216 -0.272 11.138 -0.378 11.08 -0.514 c
+11.08 -2.675 l
+10.595 -2.675 l
+10.595 0.309 l
+h
+13.046 -1.043 m
+13.046 -0.584 13.127 -0.235 13.295 0 c
+13.472 0.243 13.722 0.368 14.045 0.368 c
+14.346 0.368 14.579 0.235 14.737 -0.029 c
+14.766 0.309 l
+15.207 0.309 l
+15.207 -2.705 l
+15.207 -3.075 15.107 -3.358 14.913 -3.557 c
+14.725 -3.752 14.464 -3.85 14.134 -3.85 c
+13.987 -3.85 13.818 -3.81 13.634 -3.733 c
+13.446 -3.663 13.311 -3.575 13.222 -3.469 c
+13.413 -3.131 l
+13.619 -3.336 13.843 -3.439 14.089 -3.439 c
+14.49 -3.439 14.696 -3.212 14.707 -2.763 c
+14.707 -2.381 l
+14.549 -2.616 14.328 -2.734 14.045 -2.734 c
+13.729 -2.734 13.486 -2.616 13.311 -2.381 c
+13.141 -2.146 13.053 -1.815 13.046 -1.381 c
+h
+13.531 -1.323 m
+13.531 -1.657 13.579 -1.903 13.678 -2.057 c
+13.773 -2.215 13.935 -2.293 14.163 -2.293 c
+14.406 -2.293 14.589 -2.171 14.707 -1.925 c
+14.707 -0.44 l
+14.589 -0.198 14.413 -0.073 14.178 -0.073 c
+13.95 -0.073 13.788 -0.154 13.693 -0.309 c
+13.594 -0.467 13.538 -0.706 13.531 -1.028 c
+h
+18.18 -0.147 m
+18.109 -0.139 18.036 -0.132 17.959 -0.132 c
+17.702 -0.132 17.525 -0.272 17.43 -0.544 c
+17.43 -2.675 l
+16.945 -2.675 l
+16.945 0.309 l
+17.415 0.309 l
+17.43 0 l
+17.555 0.243 17.739 0.368 17.974 0.368 c
+18.051 0.368 18.113 0.353 18.165 0.324 c
+h
+19.08 -2.675 -0.5 2.984 re
+19.109 1.103 m
+19.109 1.015 19.084 0.941 19.036 0.882 c
+18.995 0.831 18.926 0.809 18.83 0.809 c
+18.741 0.809 18.672 0.831 18.624 0.882 c
+18.583 0.941 18.566 1.008 18.566 1.088 c
+18.566 1.176 18.583 1.25 18.624 1.309 c
+18.672 1.368 18.741 1.397 18.83 1.397 c
+18.926 1.397 18.995 1.368 19.036 1.309 c
+19.084 1.25 19.109 1.18 19.109 1.103 c
+19.649 -1.043 m
+19.649 -0.584 19.73 -0.235 19.899 0 c
+20.075 0.243 20.326 0.368 20.649 0.368 c
+20.95 0.368 21.182 0.235 21.34 -0.029 c
+21.369 0.309 l
+21.81 0.309 l
+21.81 -2.705 l
+21.81 -3.075 21.711 -3.358 21.517 -3.557 c
+21.328 -3.752 21.068 -3.85 20.737 -3.85 c
+20.59 -3.85 20.421 -3.81 20.237 -3.733 c
+20.05 -3.663 19.914 -3.575 19.826 -3.469 c
+20.017 -3.131 l
+20.223 -3.336 20.447 -3.439 20.693 -3.439 c
+21.093 -3.439 21.299 -3.212 21.311 -2.763 c
+21.311 -2.381 l
+21.153 -2.616 20.931 -2.734 20.649 -2.734 c
+20.333 -2.734 20.09 -2.616 19.914 -2.381 c
+19.745 -2.146 19.657 -1.815 19.649 -1.381 c
+h
+20.135 -1.323 m
+20.135 -1.657 20.183 -1.903 20.281 -2.057 c
+20.377 -2.215 20.539 -2.293 20.767 -2.293 c
+21.01 -2.293 21.193 -2.171 21.311 -1.925 c
+21.311 -0.44 l
+21.193 -0.198 21.016 -0.073 20.781 -0.073 c
+20.553 -0.073 20.392 -0.154 20.297 -0.309 c
+20.197 -0.467 20.142 -0.706 20.135 -1.028 c
+h
+22.832 0 m
+23.015 0.243 23.25 0.368 23.537 0.368 c
+24.067 0.368 24.335 0.015 24.345 -0.691 c
+24.345 -2.675 l
+23.861 -2.675 l
+23.861 -0.72 l
+23.861 -0.484 23.82 -0.319 23.743 -0.22 c
+23.662 -0.124 23.545 -0.073 23.391 -0.073 c
+23.273 -0.073 23.163 -0.114 23.067 -0.191 c
+22.968 -0.272 22.891 -0.378 22.832 -0.514 c
+22.832 -2.675 l
+22.346 -2.675 l
+22.346 1.559 l
+22.832 1.559 l
+h
+25.521 1.029 m
+25.521 0.309 l
+25.978 0.309 l
+25.978 -0.087 l
+25.521 -0.087 l
+25.521 -1.94 l
+25.521 -2.057 25.54 -2.146 25.581 -2.204 c
+25.617 -2.263 25.687 -2.293 25.787 -2.293 c
+25.845 -2.293 25.908 -2.285 25.978 -2.263 c
+25.978 -2.675 l
+25.86 -2.711 25.746 -2.734 25.639 -2.734 c
+25.44 -2.734 25.29 -2.667 25.184 -2.528 c
+25.085 -2.392 25.037 -2.197 25.037 -1.94 c
+25.037 -0.087 l
+24.581 -0.087 l
+24.581 0.309 l
+25.037 0.309 l
+25.037 1.029 l
+h
+28.131 0 m
+28.314 0.243 28.55 0.368 28.837 0.368 c
+29.365 0.368 29.633 0.015 29.645 -0.691 c
+29.645 -2.675 l
+29.16 -2.675 l
+29.16 -0.72 l
+29.16 -0.484 29.12 -0.319 29.043 -0.22 c
+28.962 -0.124 28.844 -0.073 28.69 -0.073 c
+28.572 -0.073 28.461 -0.114 28.366 -0.191 c
+28.266 -0.272 28.189 -0.378 28.131 -0.514 c
+28.131 -2.675 l
+27.646 -2.675 l
+27.646 1.559 l
+28.131 1.559 l
+h
+31.247 -2.734 m
+30.872 -2.734 30.589 -2.627 30.394 -2.41 c
+30.196 -2.186 30.101 -1.859 30.101 -1.425 c
+30.101 -1.058 l
+30.101 -0.617 30.192 -0.272 30.379 -0.014 c
+30.574 0.239 30.85 0.368 31.203 0.368 c
+31.545 0.368 31.798 0.254 31.967 0.03 c
+32.143 -0.198 32.235 -0.544 32.247 -1.014 c
+32.247 -1.323 l
+30.585 -1.323 l
+30.585 -1.396 l
+30.585 -1.72 30.645 -1.955 30.762 -2.102 c
+30.88 -2.241 31.048 -2.308 31.277 -2.308 c
+31.424 -2.308 31.549 -2.285 31.659 -2.234 c
+31.765 -2.175 31.868 -2.087 31.967 -1.969 c
+32.218 -2.278 l
+32.012 -2.583 31.688 -2.734 31.247 -2.734 c
+31.203 -0.058 m
+30.997 -0.058 30.843 -0.128 30.747 -0.264 c
+30.648 -0.404 30.593 -0.617 30.585 -0.911 c
+31.761 -0.911 l
+31.761 -0.837 l
+31.74 -0.565 31.688 -0.367 31.599 -0.249 c
+31.512 -0.124 31.379 -0.058 31.203 -0.058 c
+33.893 -0.147 m
+33.823 -0.139 33.749 -0.132 33.672 -0.132 c
+33.415 -0.132 33.239 -0.272 33.143 -0.544 c
+33.143 -2.675 l
+32.658 -2.675 l
+32.658 0.309 l
+33.128 0.309 l
+33.143 0 l
+33.268 0.243 33.452 0.368 33.687 0.368 c
+33.764 0.368 33.826 0.353 33.878 0.324 c
+h
+35.267 -2.734 m
+34.892 -2.734 34.61 -2.627 34.415 -2.41 c
+34.217 -2.186 34.121 -1.859 34.121 -1.425 c
+34.121 -1.058 l
+34.121 -0.617 34.213 -0.272 34.4 -0.014 c
+34.595 0.239 34.87 0.368 35.223 0.368 c
+35.565 0.368 35.819 0.254 35.987 0.03 c
+36.164 -0.198 36.256 -0.544 36.266 -1.014 c
+36.266 -1.323 l
+34.606 -1.323 l
+34.606 -1.396 l
+34.606 -1.72 34.664 -1.955 34.782 -2.102 c
+34.9 -2.241 35.069 -2.308 35.297 -2.308 c
+35.443 -2.308 35.568 -2.285 35.679 -2.234 c
+35.786 -2.175 35.888 -2.087 35.987 -1.969 c
+36.237 -2.278 l
+36.031 -2.583 35.708 -2.734 35.267 -2.734 c
+35.223 -0.058 m
+35.017 -0.058 34.863 -0.128 34.767 -0.264 c
+34.668 -0.404 34.613 -0.617 34.606 -0.911 c
+35.782 -0.911 l
+35.782 -0.837 l
+35.759 -0.565 35.708 -0.367 35.62 -0.249 c
+35.532 -0.124 35.399 -0.058 35.223 -0.058 c
+37.222 -1.543 m
+36.781 -1.543 l
+36.752 1.338 l
+37.266 1.338 l
+h
+37.016 -2.131 m
+37.112 -2.131 37.182 -2.16 37.222 -2.219 c
+37.27 -2.271 37.296 -2.337 37.296 -2.425 c
+37.296 -2.506 37.27 -2.572 37.222 -2.63 c
+37.182 -2.678 37.112 -2.705 37.016 -2.705 c
+36.928 -2.705 36.858 -2.678 36.81 -2.63 c
+36.759 -2.572 36.737 -2.506 36.737 -2.425 c
+36.737 -2.337 36.759 -2.271 36.81 -2.219 c
+36.858 -2.16 36.928 -2.131 37.016 -2.131 c
+f
+Q
+ endstream endobj 52 0 obj <</BBox[699.591 449.925 766.733 444.647]/Group 88 0 R/Length 17061/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 700.8254 448.3809 cm
+0 0 m
+-0.07 0.008 -0.143 0.015 -0.22 0.015 c
+-0.478 0.015 -0.654 -0.125 -0.75 -0.397 c
+-0.75 -2.528 l
+-1.234 -2.528 l
+-1.234 0.455 l
+-0.764 0.455 l
+-0.75 0.147 l
+-0.625 0.389 -0.44 0.515 -0.205 0.515 c
+-0.128 0.515 -0.066 0.5 -0.014 0.47 c
+h
+1.378 -2.587 m
+1.004 -2.587 0.721 -2.481 0.526 -2.263 c
+0.327 -2.04 0.231 -1.712 0.231 -1.278 c
+0.231 -0.912 l
+0.231 -0.47 0.324 -0.125 0.511 0.133 c
+0.706 0.386 0.981 0.515 1.334 0.515 c
+1.676 0.515 1.929 0.401 2.099 0.177 c
+2.275 -0.052 2.367 -0.397 2.378 -0.867 c
+2.378 -1.176 l
+0.717 -1.176 l
+0.717 -1.249 l
+0.717 -1.573 0.775 -1.808 0.893 -1.955 c
+1.01 -2.094 1.18 -2.161 1.407 -2.161 c
+1.555 -2.161 1.679 -2.138 1.79 -2.088 c
+1.897 -2.028 1.999 -1.94 2.099 -1.822 c
+2.348 -2.132 l
+2.143 -2.437 1.819 -2.587 1.378 -2.587 c
+1.334 0.088 m
+1.128 0.088 0.974 0.019 0.879 -0.118 c
+0.779 -0.257 0.724 -0.47 0.717 -0.764 c
+1.893 -0.764 l
+1.893 -0.691 l
+1.871 -0.419 1.819 -0.22 1.731 -0.103 c
+1.643 0.023 1.511 0.088 1.334 0.088 c
+3.245 0.455 m
+3.26 0.177 l
+3.437 0.401 3.675 0.515 3.98 0.515 c
+4.31 0.515 4.542 0.368 4.671 0.073 c
+4.854 0.368 5.116 0.515 5.45 0.515 c
+6.009 0.515 6.292 0.169 6.302 -0.515 c
+6.302 -2.528 l
+5.818 -2.528 l
+5.818 -0.559 l
+5.818 -0.345 5.777 -0.187 5.7 -0.088 c
+5.619 0.019 5.486 0.073 5.303 0.073 c
+5.156 0.073 5.039 0.015 4.95 -0.103 c
+4.862 -0.213 4.807 -0.353 4.788 -0.529 c
+4.788 -2.528 l
+4.303 -2.528 l
+4.303 -0.544 l
+4.293 -0.133 4.119 0.073 3.789 0.073 c
+3.543 0.073 3.37 -0.052 3.275 -0.294 c
+3.275 -2.528 l
+2.789 -2.528 l
+2.789 0.455 l
+h
+6.648 -0.897 m
+6.648 -0.467 6.751 -0.125 6.957 0.133 c
+7.169 0.386 7.449 0.515 7.794 0.515 c
+8.136 0.515 8.412 0.386 8.617 0.133 c
+8.831 -0.114 8.945 -0.448 8.956 -0.867 c
+8.956 -1.176 l
+8.956 -1.61 8.846 -1.951 8.632 -2.205 c
+8.426 -2.462 8.147 -2.587 7.794 -2.587 c
+7.449 -2.587 7.177 -2.466 6.971 -2.219 c
+6.766 -1.977 6.655 -1.643 6.648 -1.22 c
+h
+7.133 -1.176 m
+7.133 -1.492 7.192 -1.735 7.31 -1.911 c
+7.435 -2.08 7.596 -2.161 7.794 -2.161 c
+8.224 -2.161 8.449 -1.852 8.47 -1.234 c
+8.47 -0.897 l
+8.47 -0.596 8.405 -0.353 8.279 -0.176 c
+8.162 0 8 0.088 7.794 0.088 c
+7.596 0.088 7.435 0 7.31 -0.176 c
+7.192 -0.353 7.133 -0.596 7.133 -0.897 c
+h
+10.028 1.176 m
+10.028 0.455 l
+10.485 0.455 l
+10.485 0.059 l
+10.028 0.059 l
+10.028 -1.793 l
+10.028 -1.911 10.047 -1.999 10.088 -2.057 c
+10.124 -2.117 10.194 -2.146 10.294 -2.146 c
+10.352 -2.146 10.415 -2.138 10.485 -2.117 c
+10.485 -2.528 l
+10.367 -2.564 10.253 -2.587 10.146 -2.587 c
+9.947 -2.587 9.797 -2.521 9.691 -2.381 c
+9.592 -2.246 9.544 -2.051 9.544 -1.793 c
+9.544 0.059 l
+9.088 0.059 l
+9.088 0.455 l
+9.544 0.455 l
+9.544 1.176 l
+h
+12.009 -2.587 m
+11.634 -2.587 11.352 -2.481 11.157 -2.263 c
+10.959 -2.04 10.863 -1.712 10.863 -1.278 c
+10.863 -0.912 l
+10.863 -0.47 10.955 -0.125 11.142 0.133 c
+11.337 0.386 11.612 0.515 11.965 0.515 c
+12.307 0.515 12.561 0.401 12.73 0.177 c
+12.906 -0.052 12.998 -0.397 13.009 -0.867 c
+13.009 -1.176 l
+11.348 -1.176 l
+11.348 -1.249 l
+11.348 -1.573 11.406 -1.808 11.524 -1.955 c
+11.642 -2.094 11.811 -2.161 12.039 -2.161 c
+12.185 -2.161 12.311 -2.138 12.421 -2.088 c
+12.528 -2.028 12.63 -1.94 12.73 -1.822 c
+12.979 -2.132 l
+12.773 -2.437 12.451 -2.587 12.009 -2.587 c
+11.965 0.088 m
+11.759 0.088 11.605 0.019 11.51 -0.118 c
+11.41 -0.257 11.356 -0.47 11.348 -0.764 c
+12.524 -0.764 l
+12.524 -0.691 l
+12.501 -0.419 12.451 -0.22 12.362 -0.103 c
+12.274 0.023 12.141 0.088 11.965 0.088 c
+15.857 0 m
+15.787 0.008 15.713 0.015 15.636 0.015 c
+15.379 0.015 15.202 -0.125 15.107 -0.397 c
+15.107 -2.528 l
+14.622 -2.528 l
+14.622 0.455 l
+15.092 0.455 l
+15.107 0.147 l
+15.232 0.389 15.416 0.515 15.651 0.515 c
+15.728 0.515 15.79 0.5 15.842 0.47 c
+h
+17.235 -2.587 m
+16.86 -2.587 16.577 -2.481 16.382 -2.263 c
+16.184 -2.04 16.089 -1.712 16.089 -1.278 c
+16.089 -0.912 l
+16.089 -0.47 16.18 -0.125 16.368 0.133 c
+16.563 0.386 16.838 0.515 17.191 0.515 c
+17.533 0.515 17.786 0.401 17.955 0.177 c
+18.132 -0.052 18.223 -0.397 18.234 -0.867 c
+18.234 -1.176 l
+16.573 -1.176 l
+16.573 -1.249 l
+16.573 -1.573 16.632 -1.808 16.75 -1.955 c
+16.867 -2.094 17.037 -2.161 17.264 -2.161 c
+17.411 -2.161 17.536 -2.138 17.646 -2.088 c
+17.753 -2.028 17.856 -1.94 17.955 -1.822 c
+18.205 -2.132 l
+17.999 -2.437 17.676 -2.587 17.235 -2.587 c
+17.191 0.088 m
+16.985 0.088 16.831 0.019 16.735 -0.118 c
+16.636 -0.257 16.581 -0.47 16.573 -0.764 c
+17.749 -0.764 l
+17.749 -0.691 l
+17.727 -0.419 17.676 -0.22 17.588 -0.103 c
+17.5 0.023 17.367 0.088 17.191 0.088 c
+20.792 -1.176 m
+20.792 -1.646 20.708 -1.999 20.542 -2.234 c
+20.373 -2.469 20.135 -2.587 19.822 -2.587 c
+19.517 -2.587 19.285 -2.477 19.131 -2.249 c
+19.131 -3.675 l
+18.646 -3.675 l
+18.646 0.455 l
+19.087 0.455 l
+19.117 0.118 l
+19.271 0.382 19.503 0.515 19.807 0.515 c
+20.137 0.515 20.384 0.397 20.542 0.162 c
+20.708 -0.066 20.792 -0.405 20.792 -0.852 c
+h
+20.307 -0.897 m
+20.307 -0.565 20.252 -0.32 20.145 -0.162 c
+20.046 -0.008 19.884 0.073 19.661 0.073 c
+19.425 0.073 19.248 -0.044 19.131 -0.279 c
+19.131 -1.822 l
+19.248 -2.051 19.429 -2.161 19.675 -2.161 c
+19.888 -2.161 20.046 -2.084 20.145 -1.926 c
+20.252 -1.771 20.307 -1.529 20.307 -1.205 c
+h
+21.145 -0.897 m
+21.145 -0.467 21.248 -0.125 21.454 0.133 c
+21.667 0.386 21.946 0.515 22.292 0.515 c
+22.633 0.515 22.909 0.386 23.115 0.133 c
+23.328 -0.114 23.441 -0.448 23.453 -0.867 c
+23.453 -1.176 l
+23.453 -1.61 23.343 -1.951 23.129 -2.205 c
+22.923 -2.462 22.645 -2.587 22.292 -2.587 c
+21.946 -2.587 21.674 -2.466 21.469 -2.219 c
+21.263 -1.977 21.153 -1.643 21.145 -1.22 c
+h
+21.63 -1.176 m
+21.63 -1.492 21.689 -1.735 21.806 -1.911 c
+21.931 -2.08 22.093 -2.161 22.292 -2.161 c
+22.722 -2.161 22.946 -1.852 22.967 -1.234 c
+22.967 -0.897 l
+22.967 -0.596 22.901 -0.353 22.776 -0.176 c
+22.659 0 22.497 0.088 22.292 0.088 c
+22.093 0.088 21.931 0 21.806 -0.176 c
+21.689 -0.353 21.63 -0.596 21.63 -0.897 c
+h
+25.334 -1.764 m
+25.334 -1.658 25.294 -1.569 25.216 -1.5 c
+25.136 -1.422 24.985 -1.334 24.761 -1.234 c
+24.496 -1.128 24.309 -1.036 24.202 -0.956 c
+24.092 -0.878 24.015 -0.79 23.967 -0.691 c
+23.915 -0.596 23.894 -0.478 23.894 -0.338 c
+23.894 -0.095 23.981 0.106 24.158 0.264 c
+24.334 0.43 24.559 0.515 24.835 0.515 c
+25.128 0.515 25.363 0.426 25.54 0.25 c
+25.716 0.081 25.805 -0.133 25.805 -0.397 c
+25.319 -0.397 l
+25.319 -0.261 25.268 -0.147 25.172 -0.058 c
+25.084 0.037 24.97 0.088 24.835 0.088 c
+24.687 0.088 24.573 0.048 24.496 -0.029 c
+24.415 -0.099 24.378 -0.198 24.378 -0.324 c
+24.378 -0.422 24.408 -0.5 24.467 -0.559 c
+24.526 -0.617 24.665 -0.698 24.893 -0.794 c
+25.253 -0.941 25.5 -1.084 25.628 -1.22 c
+25.764 -1.348 25.834 -1.521 25.834 -1.735 c
+25.834 -1.992 25.739 -2.198 25.554 -2.352 c
+25.378 -2.51 25.143 -2.587 24.849 -2.587 c
+24.533 -2.587 24.28 -2.499 24.085 -2.323 c
+23.898 -2.138 23.805 -1.907 23.805 -1.631 c
+24.291 -1.631 l
+24.297 -1.801 24.349 -1.933 24.438 -2.028 c
+24.533 -2.117 24.673 -2.161 24.849 -2.161 c
+25.003 -2.161 25.121 -2.128 25.201 -2.057 c
+25.29 -1.992 25.334 -1.893 25.334 -1.764 c
+26.819 -2.528 -0.5 2.983 re
+26.848 1.249 m
+26.848 1.161 26.822 1.087 26.774 1.029 c
+26.734 0.977 26.664 0.956 26.568 0.956 c
+26.481 0.956 26.41 0.977 26.363 1.029 c
+26.323 1.087 26.304 1.154 26.304 1.235 c
+26.304 1.323 26.323 1.396 26.363 1.455 c
+26.41 1.514 26.481 1.544 26.568 1.544 c
+26.664 1.544 26.734 1.514 26.774 1.455 c
+26.822 1.396 26.848 1.326 26.848 1.249 c
+28.127 1.176 m
+28.127 0.455 l
+28.582 0.455 l
+28.582 0.059 l
+28.127 0.059 l
+28.127 -1.793 l
+28.127 -1.911 28.145 -1.999 28.185 -2.057 c
+28.222 -2.117 28.292 -2.146 28.392 -2.146 c
+28.45 -2.146 28.513 -2.138 28.582 -2.117 c
+28.582 -2.528 l
+28.465 -2.564 28.351 -2.587 28.245 -2.587 c
+28.046 -2.587 27.896 -2.521 27.789 -2.381 c
+27.69 -2.246 27.642 -2.051 27.642 -1.793 c
+27.642 0.059 l
+27.186 0.059 l
+27.186 0.455 l
+27.642 0.455 l
+27.642 1.176 l
+h
+28.895 -0.897 m
+28.895 -0.467 28.997 -0.125 29.203 0.133 c
+29.417 0.386 29.696 0.515 30.042 0.515 c
+30.383 0.515 30.659 0.386 30.865 0.133 c
+31.077 -0.114 31.191 -0.448 31.202 -0.867 c
+31.202 -1.176 l
+31.202 -1.61 31.092 -1.951 30.879 -2.205 c
+30.674 -2.462 30.394 -2.587 30.042 -2.587 c
+29.696 -2.587 29.424 -2.466 29.218 -2.219 c
+29.012 -1.977 28.902 -1.643 28.895 -1.22 c
+h
+29.38 -1.176 m
+29.38 -1.492 29.439 -1.735 29.556 -1.911 c
+29.681 -2.08 29.843 -2.161 30.042 -2.161 c
+30.471 -2.161 30.695 -1.852 30.718 -1.234 c
+30.718 -0.897 l
+30.718 -0.596 30.651 -0.353 30.526 -0.176 c
+30.408 0 30.248 0.088 30.042 0.088 c
+29.843 0.088 29.681 0 29.556 -0.176 c
+29.439 -0.353 29.38 -0.596 29.38 -0.897 c
+h
+32.875 0 m
+32.805 0.008 32.731 0.015 32.654 0.015 c
+32.397 0.015 32.22 -0.125 32.125 -0.397 c
+32.125 -2.528 l
+31.64 -2.528 l
+31.64 0.455 l
+32.11 0.455 l
+32.125 0.147 l
+32.25 0.389 32.434 0.515 32.669 0.515 c
+32.746 0.515 32.808 0.5 32.86 0.47 c
+h
+33.775 -2.528 -0.501 2.983 re
+33.805 1.249 m
+33.805 1.161 33.778 1.087 33.731 1.029 c
+33.691 0.977 33.621 0.956 33.525 0.956 c
+33.437 0.956 33.367 0.977 33.319 1.029 c
+33.279 1.087 33.261 1.154 33.261 1.235 c
+33.261 1.323 33.279 1.396 33.319 1.455 c
+33.367 1.514 33.437 1.544 33.525 1.544 c
+33.621 1.544 33.691 1.514 33.731 1.455 c
+33.778 1.396 33.805 1.326 33.805 1.249 c
+35.509 -2.587 m
+35.135 -2.587 34.852 -2.481 34.657 -2.263 c
+34.458 -2.04 34.363 -1.712 34.363 -1.278 c
+34.363 -0.912 l
+34.363 -0.47 34.455 -0.125 34.642 0.133 c
+34.837 0.386 35.112 0.515 35.465 0.515 c
+35.807 0.515 36.06 0.401 36.23 0.177 c
+36.406 -0.052 36.498 -0.397 36.509 -0.867 c
+36.509 -1.176 l
+34.848 -1.176 l
+34.848 -1.249 l
+34.848 -1.573 34.907 -1.808 35.025 -1.955 c
+35.142 -2.094 35.311 -2.161 35.539 -2.161 c
+35.686 -2.161 35.811 -2.138 35.921 -2.088 c
+36.028 -2.028 36.13 -1.94 36.23 -1.822 c
+36.48 -2.132 l
+36.274 -2.437 35.95 -2.587 35.509 -2.587 c
+35.465 0.088 m
+35.26 0.088 35.106 0.019 35.01 -0.118 c
+34.911 -0.257 34.855 -0.47 34.848 -0.764 c
+36.024 -0.764 l
+36.024 -0.691 l
+36.002 -0.419 35.95 -0.22 35.862 -0.103 c
+35.774 0.023 35.642 0.088 35.465 0.088 c
+38.362 -1.764 m
+38.362 -1.658 38.321 -1.569 38.244 -1.5 c
+38.163 -1.422 38.012 -1.334 37.788 -1.234 c
+37.523 -1.128 37.336 -1.036 37.229 -0.956 c
+37.119 -0.878 37.042 -0.79 36.994 -0.691 c
+36.943 -0.596 36.92 -0.478 36.92 -0.338 c
+36.92 -0.095 37.009 0.106 37.186 0.264 c
+37.361 0.43 37.585 0.515 37.861 0.515 c
+38.155 0.515 38.391 0.426 38.567 0.25 c
+38.743 0.081 38.832 -0.133 38.832 -0.397 c
+38.346 -0.397 l
+38.346 -0.261 38.295 -0.147 38.2 -0.058 c
+38.111 0.037 37.997 0.088 37.861 0.088 c
+37.714 0.088 37.6 0.048 37.523 -0.029 c
+37.442 -0.099 37.406 -0.198 37.406 -0.324 c
+37.406 -0.422 37.435 -0.5 37.494 -0.559 c
+37.552 -0.617 37.693 -0.698 37.92 -0.794 c
+38.281 -0.941 38.526 -1.084 38.655 -1.22 c
+38.791 -1.348 38.861 -1.521 38.861 -1.735 c
+38.861 -1.992 38.765 -2.198 38.582 -2.352 c
+38.405 -2.51 38.17 -2.587 37.876 -2.587 c
+37.56 -2.587 37.306 -2.499 37.111 -2.323 c
+36.924 -2.138 36.833 -1.907 36.833 -1.631 c
+37.317 -1.631 l
+37.325 -1.801 37.377 -1.933 37.464 -2.028 c
+37.56 -2.117 37.699 -2.161 37.876 -2.161 c
+38.03 -2.161 38.148 -2.128 38.229 -2.057 c
+38.317 -1.992 38.362 -1.893 38.362 -1.764 c
+42.05 -2.528 m
+42.021 -2.462 41.999 -2.352 41.992 -2.205 c
+41.815 -2.462 41.595 -2.587 41.33 -2.587 c
+41.055 -2.587 40.837 -2.514 40.683 -2.367 c
+40.536 -2.212 40.463 -1.995 40.463 -1.72 c
+40.463 -1.419 40.566 -1.176 40.772 -0.999 c
+40.978 -0.816 41.261 -0.721 41.624 -0.721 c
+41.977 -0.721 l
+41.977 -0.397 l
+41.977 -0.22 41.936 -0.099 41.859 -0.029 c
+41.778 0.048 41.661 0.088 41.506 0.088 c
+41.36 0.088 41.234 0.044 41.139 -0.044 c
+41.051 -0.133 41.007 -0.243 41.007 -0.368 c
+40.521 -0.368 l
+40.521 -0.22 40.566 -0.081 40.654 0.059 c
+40.742 0.206 40.86 0.316 41.007 0.397 c
+41.161 0.474 41.334 0.515 41.521 0.515 c
+41.834 0.515 42.069 0.434 42.227 0.279 c
+42.381 0.133 42.462 -0.088 42.462 -0.382 c
+42.462 -1.881 l
+42.47 -2.117 42.506 -2.319 42.565 -2.484 c
+42.565 -2.528 l
+h
+41.404 -2.146 m
+41.521 -2.146 41.631 -2.113 41.742 -2.043 c
+41.849 -1.977 41.926 -1.893 41.977 -1.793 c
+41.977 -1.087 l
+41.712 -1.087 l
+41.477 -1.087 41.29 -1.139 41.154 -1.234 c
+41.026 -1.334 40.963 -1.477 40.963 -1.661 c
+40.963 -1.83 40.992 -1.951 41.051 -2.028 c
+41.117 -2.109 41.234 -2.146 41.404 -2.146 c
+44.483 -1.764 m
+44.483 -1.658 44.442 -1.569 44.365 -1.5 c
+44.284 -1.422 44.134 -1.334 43.91 -1.234 c
+43.646 -1.128 43.458 -1.036 43.351 -0.956 c
+43.241 -0.878 43.164 -0.79 43.116 -0.691 c
+43.065 -0.596 43.043 -0.478 43.043 -0.338 c
+43.043 -0.095 43.131 0.106 43.307 0.264 c
+43.484 0.43 43.708 0.515 43.983 0.515 c
+44.278 0.515 44.513 0.426 44.689 0.25 c
+44.866 0.081 44.953 -0.133 44.953 -0.397 c
+44.469 -0.397 l
+44.469 -0.261 44.417 -0.147 44.322 -0.058 c
+44.234 0.037 44.12 0.088 43.983 0.088 c
+43.837 0.088 43.723 0.048 43.646 -0.029 c
+43.565 -0.099 43.528 -0.198 43.528 -0.324 c
+43.528 -0.422 43.557 -0.5 43.616 -0.559 c
+43.675 -0.617 43.814 -0.698 44.043 -0.794 c
+44.402 -0.941 44.648 -1.084 44.777 -1.22 c
+44.913 -1.348 44.983 -1.521 44.983 -1.735 c
+44.983 -1.992 44.887 -2.198 44.704 -2.352 c
+44.527 -2.51 44.292 -2.587 43.998 -2.587 c
+43.682 -2.587 43.428 -2.499 43.234 -2.323 c
+43.046 -2.138 42.954 -1.907 42.954 -1.631 c
+43.44 -1.631 l
+43.447 -1.801 43.499 -1.933 43.586 -2.028 c
+43.682 -2.117 43.821 -2.161 43.998 -2.161 c
+44.153 -2.161 44.27 -2.128 44.351 -2.057 c
+44.44 -1.992 44.483 -1.893 44.483 -1.764 c
+47.453 -1.72 m
+47.997 0.455 l
+48.511 0.455 l
+47.54 -2.955 l
+47.471 -3.208 47.368 -3.399 47.232 -3.528 c
+47.092 -3.663 46.942 -3.734 46.776 -3.734 c
+46.707 -3.734 46.622 -3.719 46.526 -3.69 c
+46.526 -3.278 l
+46.63 -3.293 l
+46.765 -3.293 46.871 -3.256 46.952 -3.19 c
+47.041 -3.12 47.107 -3.002 47.158 -2.837 c
+47.247 -2.499 l
+46.379 0.455 l
+46.909 0.455 l
+h
+48.691 -0.897 m
+48.691 -0.467 48.793 -0.125 48.999 0.133 c
+49.213 0.386 49.492 0.515 49.838 0.515 c
+50.179 0.515 50.455 0.386 50.661 0.133 c
+50.873 -0.114 50.987 -0.448 50.998 -0.867 c
+50.998 -1.176 l
+50.998 -1.61 50.888 -1.951 50.675 -2.205 c
+50.47 -2.462 50.19 -2.587 49.838 -2.587 c
+49.492 -2.587 49.22 -2.466 49.014 -2.219 c
+48.808 -1.977 48.698 -1.643 48.691 -1.22 c
+h
+49.176 -1.176 m
+49.176 -1.492 49.235 -1.735 49.352 -1.911 c
+49.477 -2.08 49.639 -2.161 49.838 -2.161 c
+50.268 -2.161 50.491 -1.852 50.514 -1.234 c
+50.514 -0.897 l
+50.514 -0.596 50.447 -0.353 50.322 -0.176 c
+50.204 0 50.044 0.088 49.838 0.088 c
+49.639 0.088 49.477 0 49.352 -0.176 c
+49.235 -0.353 49.176 -0.596 49.176 -0.897 c
+h
+52.953 -2.263 m
+52.795 -2.481 52.56 -2.587 52.248 -2.587 c
+51.983 -2.587 51.777 -2.495 51.631 -2.308 c
+51.491 -2.124 51.425 -1.849 51.425 -1.484 c
+51.425 0.455 l
+51.91 0.455 l
+51.91 -1.455 l
+51.91 -1.918 52.049 -2.146 52.336 -2.146 c
+52.631 -2.146 52.828 -2.014 52.939 -1.749 c
+52.939 0.455 l
+53.439 0.455 l
+53.439 -2.528 l
+52.968 -2.528 l
+h
+57.415 -1.675 m
+57.871 0.455 l
+58.356 0.455 l
+57.62 -2.528 l
+57.238 -2.528 l
+56.65 -0.397 l
+56.077 -2.528 l
+55.695 -2.528 l
+54.96 0.455 l
+55.445 0.455 l
+55.916 -1.617 l
+56.459 0.455 l
+56.841 0.455 l
+h
+60.149 -2.528 m
+60.119 -2.462 60.097 -2.352 60.09 -2.205 c
+59.914 -2.462 59.693 -2.587 59.428 -2.587 c
+59.153 -2.587 58.936 -2.514 58.782 -2.367 c
+58.634 -2.212 58.561 -1.995 58.561 -1.72 c
+58.561 -1.419 58.664 -1.176 58.87 -0.999 c
+59.076 -0.816 59.359 -0.721 59.723 -0.721 c
+60.076 -0.721 l
+60.076 -0.397 l
+60.076 -0.22 60.035 -0.099 59.958 -0.029 c
+59.877 0.048 59.76 0.088 59.605 0.088 c
+59.458 0.088 59.333 0.044 59.237 -0.044 c
+59.149 -0.133 59.105 -0.243 59.105 -0.368 c
+58.62 -0.368 l
+58.62 -0.22 58.664 -0.081 58.752 0.059 c
+58.84 0.206 58.958 0.316 59.105 0.397 c
+59.259 0.474 59.432 0.515 59.619 0.515 c
+59.932 0.515 60.167 0.434 60.325 0.279 c
+60.479 0.133 60.56 -0.088 60.56 -0.382 c
+60.56 -1.881 l
+60.568 -2.117 60.604 -2.319 60.664 -2.484 c
+60.664 -2.528 l
+h
+59.502 -2.146 m
+59.619 -2.146 59.729 -2.113 59.84 -2.043 c
+59.947 -1.977 60.024 -1.893 60.076 -1.793 c
+60.076 -1.087 l
+59.81 -1.087 l
+59.575 -1.087 59.388 -1.139 59.252 -1.234 c
+59.124 -1.334 59.061 -1.477 59.061 -1.661 c
+59.061 -1.83 59.091 -1.951 59.149 -2.028 c
+59.216 -2.109 59.333 -2.146 59.502 -2.146 c
+61.597 0.455 m
+61.611 0.133 l
+61.795 0.386 62.038 0.515 62.331 0.515 c
+62.861 0.515 63.129 0.162 63.14 -0.544 c
+63.14 -2.528 l
+62.655 -2.528 l
+62.655 -0.573 l
+62.655 -0.338 62.615 -0.172 62.538 -0.073 c
+62.457 0.023 62.339 0.073 62.185 0.073 c
+62.067 0.073 61.957 0.033 61.861 -0.044 c
+61.762 -0.125 61.685 -0.231 61.626 -0.368 c
+61.626 -2.528 l
+61.141 -2.528 l
+61.141 0.455 l
+h
+64.323 1.176 m
+64.323 0.455 l
+64.779 0.455 l
+64.779 0.059 l
+64.323 0.059 l
+64.323 -1.793 l
+64.323 -1.911 64.342 -1.999 64.382 -2.057 c
+64.419 -2.117 64.489 -2.146 64.587 -2.146 c
+64.647 -2.146 64.709 -2.138 64.779 -2.117 c
+64.779 -2.528 l
+64.662 -2.564 64.548 -2.587 64.441 -2.587 c
+64.242 -2.587 64.092 -2.521 63.985 -2.381 c
+63.886 -2.246 63.839 -2.051 63.839 -1.793 c
+63.839 0.059 l
+63.382 0.059 l
+63.382 0.455 l
+63.839 0.455 l
+63.839 1.176 l
+h
+65.275 -2.263 m
+65.275 -2.175 65.297 -2.102 65.348 -2.043 c
+65.408 -1.984 65.485 -1.955 65.584 -1.955 c
+65.69 -1.955 65.767 -1.984 65.819 -2.043 c
+65.878 -2.102 65.907 -2.175 65.907 -2.263 c
+65.907 -2.344 65.878 -2.41 65.819 -2.469 c
+65.767 -2.528 65.69 -2.558 65.584 -2.558 c
+65.485 -2.558 65.408 -2.528 65.348 -2.469 c
+65.297 -2.41 65.275 -2.344 65.275 -2.263 c
+f
+Q
+ endstream endobj 53 0 obj <</BBox[703.328 443.501 763.072 438.121]/Group 89 0 R/Length 13734/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 704.9891 443.2802 cm
+0 0 m
+0.5 0 l
+0.5 -2.836 l
+0.5 -3.219 0.401 -3.524 0.206 -3.748 c
+0.008 -3.965 -0.257 -4.072 -0.588 -4.072 c
+-0.922 -4.072 -1.187 -3.969 -1.382 -3.763 c
+-1.569 -3.557 -1.661 -3.274 -1.661 -2.911 c
+-1.161 -2.911 l
+-1.161 -3.138 -1.114 -3.314 -1.014 -3.439 c
+-0.908 -3.568 -0.764 -3.63 -0.588 -3.63 c
+-0.411 -3.63 -0.272 -3.564 -0.162 -3.424 c
+-0.055 -3.289 0 -3.094 0 -2.836 c
+h
+2.609 -3.748 m
+2.452 -3.965 2.216 -4.072 1.903 -4.072 c
+1.639 -4.072 1.433 -3.979 1.286 -3.792 c
+1.147 -3.609 1.08 -3.333 1.08 -2.969 c
+1.08 -1.029 l
+1.565 -1.029 l
+1.565 -2.94 l
+1.565 -3.403 1.706 -3.63 1.992 -3.63 c
+2.286 -3.63 2.485 -3.499 2.595 -3.233 c
+2.595 -1.029 l
+3.094 -1.029 l
+3.094 -4.012 l
+2.624 -4.012 l
+h
+5.089 -3.248 m
+5.089 -3.142 5.049 -3.054 4.972 -2.984 c
+4.891 -2.907 4.74 -2.818 4.516 -2.719 c
+4.252 -2.612 4.064 -2.52 3.958 -2.44 c
+3.848 -2.362 3.771 -2.275 3.723 -2.175 c
+3.671 -2.08 3.649 -1.962 3.649 -1.822 c
+3.649 -1.579 3.738 -1.378 3.914 -1.22 c
+4.09 -1.055 4.314 -0.97 4.59 -0.97 c
+4.883 -0.97 5.119 -1.058 5.295 -1.234 c
+5.471 -1.404 5.56 -1.617 5.56 -1.881 c
+5.075 -1.881 l
+5.075 -1.745 5.024 -1.631 4.928 -1.543 c
+4.84 -1.448 4.725 -1.396 4.59 -1.396 c
+4.443 -1.396 4.329 -1.436 4.252 -1.514 c
+4.171 -1.583 4.135 -1.683 4.135 -1.808 c
+4.135 -1.907 4.164 -1.984 4.222 -2.043 c
+4.281 -2.102 4.421 -2.182 4.648 -2.278 c
+5.009 -2.425 5.255 -2.568 5.384 -2.705 c
+5.519 -2.833 5.589 -3.006 5.589 -3.219 c
+5.589 -3.476 5.494 -3.682 5.31 -3.836 c
+5.134 -3.994 4.898 -4.072 4.605 -4.072 c
+4.289 -4.072 4.035 -3.983 3.84 -3.807 c
+3.653 -3.623 3.561 -3.391 3.561 -3.116 c
+4.046 -3.116 l
+4.054 -3.285 4.104 -3.418 4.193 -3.513 c
+4.289 -3.601 4.428 -3.645 4.605 -3.645 c
+4.759 -3.645 4.877 -3.612 4.958 -3.542 c
+5.045 -3.476 5.089 -3.377 5.089 -3.248 c
+6.677 -0.309 m
+6.677 -1.029 l
+7.133 -1.029 l
+7.133 -1.425 l
+6.677 -1.425 l
+6.677 -3.278 l
+6.677 -3.395 6.695 -3.484 6.736 -3.542 c
+6.772 -3.601 6.842 -3.63 6.942 -3.63 c
+7 -3.63 7.063 -3.623 7.133 -3.601 c
+7.133 -4.012 l
+7.015 -4.049 6.901 -4.072 6.795 -4.072 c
+6.596 -4.072 6.446 -4.006 6.339 -3.865 c
+6.24 -3.73 6.192 -3.535 6.192 -3.278 c
+6.192 -1.425 l
+5.737 -1.425 l
+5.737 -1.029 l
+6.192 -1.029 l
+6.192 -0.309 l
+h
+10.036 -1.484 m
+9.966 -1.477 9.893 -1.469 9.816 -1.469 c
+9.558 -1.469 9.382 -1.61 9.286 -1.881 c
+9.286 -4.012 l
+8.802 -4.012 l
+8.802 -1.029 l
+9.272 -1.029 l
+9.286 -1.338 l
+9.411 -1.095 9.595 -0.97 9.83 -0.97 c
+9.907 -0.97 9.97 -0.985 10.021 -1.014 c
+h
+11.414 -4.072 m
+11.039 -4.072 10.756 -3.965 10.562 -3.748 c
+10.363 -3.524 10.267 -3.197 10.267 -2.763 c
+10.267 -2.396 l
+10.267 -1.955 10.359 -1.61 10.547 -1.352 c
+10.741 -1.099 11.017 -0.97 11.37 -0.97 c
+11.711 -0.97 11.965 -1.084 12.134 -1.308 c
+12.311 -1.536 12.403 -1.881 12.413 -2.352 c
+12.413 -2.66 l
+10.753 -2.66 l
+10.753 -2.734 l
+10.753 -3.057 10.811 -3.293 10.929 -3.439 c
+11.046 -3.579 11.216 -3.645 11.443 -3.645 c
+11.59 -3.645 11.715 -3.623 11.825 -3.572 c
+11.932 -3.513 12.035 -3.424 12.134 -3.307 c
+12.384 -3.616 l
+12.178 -3.921 11.855 -4.072 11.414 -4.072 c
+11.37 -1.396 m
+11.164 -1.396 11.009 -1.466 10.914 -1.602 c
+10.815 -1.741 10.76 -1.955 10.753 -2.248 c
+11.929 -2.248 l
+11.929 -2.175 l
+11.906 -1.903 11.855 -1.705 11.767 -1.587 c
+11.678 -1.462 11.546 -1.396 11.37 -1.396 c
+13.28 -1.029 m
+13.296 -1.308 l
+13.471 -1.084 13.71 -0.97 14.015 -0.97 c
+14.346 -0.97 14.578 -1.117 14.707 -1.411 c
+14.89 -1.117 15.152 -0.97 15.486 -0.97 c
+16.044 -0.97 16.327 -1.315 16.338 -1.999 c
+16.338 -4.012 l
+15.853 -4.012 l
+15.853 -2.043 l
+15.853 -1.83 15.813 -1.672 15.736 -1.573 c
+15.655 -1.466 15.522 -1.411 15.339 -1.411 c
+15.191 -1.411 15.073 -1.469 14.986 -1.587 c
+14.898 -1.697 14.842 -1.837 14.824 -2.013 c
+14.824 -4.012 l
+14.339 -4.012 l
+14.339 -2.028 l
+14.328 -1.617 14.155 -1.411 13.824 -1.411 c
+13.579 -1.411 13.406 -1.536 13.31 -1.778 c
+13.31 -4.012 l
+12.825 -4.012 l
+12.825 -1.029 l
+h
+17.845 -4.072 m
+17.47 -4.072 17.187 -3.965 16.993 -3.748 c
+16.794 -3.524 16.698 -3.197 16.698 -2.763 c
+16.698 -2.396 l
+16.698 -1.955 16.79 -1.61 16.978 -1.352 c
+17.172 -1.099 17.448 -0.97 17.801 -0.97 c
+18.142 -0.97 18.396 -1.084 18.565 -1.308 c
+18.741 -1.536 18.834 -1.881 18.844 -2.352 c
+18.844 -2.66 l
+17.184 -2.66 l
+17.184 -2.734 l
+17.184 -3.057 17.242 -3.293 17.359 -3.439 c
+17.477 -3.579 17.646 -3.645 17.874 -3.645 c
+18.021 -3.645 18.146 -3.623 18.256 -3.572 c
+18.363 -3.513 18.466 -3.424 18.565 -3.307 c
+18.815 -3.616 l
+18.609 -3.921 18.286 -4.072 17.845 -4.072 c
+17.801 -1.396 m
+17.595 -1.396 17.44 -1.466 17.345 -1.602 c
+17.246 -1.741 17.19 -1.955 17.184 -2.248 c
+18.359 -2.248 l
+18.359 -2.175 l
+18.337 -1.903 18.286 -1.705 18.198 -1.587 c
+18.109 -1.462 17.977 -1.396 17.801 -1.396 c
+21.417 -2.66 m
+21.417 -3.131 21.332 -3.484 21.167 -3.719 c
+20.997 -3.954 20.756 -4.072 20.432 -4.072 c
+20.116 -4.072 19.881 -3.935 19.726 -3.659 c
+19.697 -4.012 l
+19.256 -4.012 l
+19.256 0.221 l
+19.74 0.221 l
+19.74 -1.352 l
+19.895 -1.099 20.127 -0.97 20.432 -0.97 c
+20.756 -0.97 20.997 -1.087 21.167 -1.323 c
+21.332 -1.558 21.417 -1.907 21.417 -2.366 c
+h
+20.931 -2.381 m
+20.931 -2.028 20.88 -1.778 20.785 -1.631 c
+20.685 -1.484 20.523 -1.411 20.299 -1.411 c
+20.053 -1.411 19.866 -1.55 19.74 -1.822 c
+19.74 -3.233 l
+19.858 -3.499 20.05 -3.63 20.314 -3.63 c
+20.527 -3.63 20.685 -3.557 20.785 -3.41 c
+20.88 -3.256 20.931 -3.013 20.931 -2.69 c
+h
+22.919 -4.072 m
+22.545 -4.072 22.262 -3.965 22.067 -3.748 c
+21.868 -3.524 21.773 -3.197 21.773 -2.763 c
+21.773 -2.396 l
+21.773 -1.955 21.865 -1.61 22.052 -1.352 c
+22.247 -1.099 22.522 -0.97 22.875 -0.97 c
+23.217 -0.97 23.471 -1.084 23.64 -1.308 c
+23.816 -1.536 23.908 -1.881 23.919 -2.352 c
+23.919 -2.66 l
+22.258 -2.66 l
+22.258 -2.734 l
+22.258 -3.057 22.317 -3.293 22.435 -3.439 c
+22.552 -3.579 22.721 -3.645 22.949 -3.645 c
+23.096 -3.645 23.221 -3.623 23.331 -3.572 c
+23.438 -3.513 23.54 -3.424 23.64 -3.307 c
+23.89 -3.616 l
+23.684 -3.921 23.36 -4.072 22.919 -4.072 c
+22.875 -1.396 m
+22.67 -1.396 22.516 -1.466 22.42 -1.602 c
+22.321 -1.741 22.265 -1.955 22.258 -2.248 c
+23.434 -2.248 l
+23.434 -2.175 l
+23.412 -1.903 23.36 -1.705 23.272 -1.587 c
+23.185 -1.462 23.052 -1.396 22.875 -1.396 c
+25.566 -1.484 m
+25.496 -1.477 25.422 -1.469 25.344 -1.469 c
+25.088 -1.469 24.911 -1.61 24.816 -1.881 c
+24.816 -4.012 l
+24.33 -4.012 l
+24.33 -1.029 l
+24.801 -1.029 l
+24.816 -1.338 l
+24.941 -1.095 25.124 -0.97 25.359 -0.97 c
+25.437 -0.97 25.5 -0.985 25.55 -1.014 c
+h
+27.771 -0.309 m
+27.771 -1.029 l
+28.226 -1.029 l
+28.226 -1.425 l
+27.771 -1.425 l
+27.771 -3.278 l
+27.771 -3.395 27.789 -3.484 27.829 -3.542 c
+27.866 -3.601 27.935 -3.63 28.035 -3.63 c
+28.093 -3.63 28.156 -3.623 28.226 -3.601 c
+28.226 -4.012 l
+28.108 -4.049 27.995 -4.072 27.888 -4.072 c
+27.69 -4.072 27.538 -4.006 27.432 -3.865 c
+27.333 -3.73 27.285 -3.535 27.285 -3.278 c
+27.285 -1.425 l
+26.83 -1.425 l
+26.83 -1.029 l
+27.285 -1.029 l
+27.285 -0.309 l
+h
+28.538 -2.381 m
+28.538 -1.951 28.641 -1.61 28.847 -1.352 c
+29.06 -1.099 29.34 -0.97 29.685 -0.97 c
+30.027 -0.97 30.302 -1.099 30.508 -1.352 c
+30.721 -1.598 30.835 -1.932 30.846 -2.352 c
+30.846 -2.66 l
+30.846 -3.094 30.736 -3.436 30.522 -3.69 c
+30.317 -3.946 30.038 -4.072 29.685 -4.072 c
+29.34 -4.072 29.067 -3.95 28.862 -3.704 c
+28.656 -3.461 28.546 -3.127 28.538 -2.705 c
+h
+29.024 -2.66 m
+29.024 -2.976 29.082 -3.219 29.2 -3.395 c
+29.325 -3.564 29.487 -3.645 29.685 -3.645 c
+30.115 -3.645 30.339 -3.337 30.36 -2.719 c
+30.36 -2.381 l
+30.36 -2.08 30.295 -1.837 30.169 -1.66 c
+30.052 -1.484 29.89 -1.396 29.685 -1.396 c
+29.487 -1.396 29.325 -1.484 29.2 -1.66 c
+29.082 -1.837 29.024 -2.08 29.024 -2.381 c
+h
+34.003 -3.748 m
+33.845 -3.965 33.61 -4.072 33.297 -4.072 c
+33.032 -4.072 32.827 -3.979 32.679 -3.792 c
+32.54 -3.609 32.474 -3.333 32.474 -2.969 c
+32.474 -1.029 l
+32.959 -1.029 l
+32.959 -2.94 l
+32.959 -3.403 33.099 -3.63 33.385 -3.63 c
+33.679 -3.63 33.878 -3.499 33.988 -3.233 c
+33.988 -1.029 l
+34.488 -1.029 l
+34.488 -4.012 l
+34.017 -4.012 l
+h
+37.185 -2.66 m
+37.185 -3.131 37.101 -3.484 36.935 -3.719 c
+36.766 -3.954 36.527 -4.072 36.215 -4.072 c
+35.91 -4.072 35.678 -3.961 35.524 -3.734 c
+35.524 -5.159 l
+35.039 -5.159 l
+35.039 -1.029 l
+35.48 -1.029 l
+35.509 -1.367 l
+35.663 -1.103 35.895 -0.97 36.2 -0.97 c
+36.531 -0.97 36.777 -1.087 36.935 -1.323 c
+37.101 -1.55 37.185 -1.889 37.185 -2.337 c
+h
+36.7 -2.381 m
+36.7 -2.05 36.645 -1.804 36.538 -1.646 c
+36.439 -1.492 36.278 -1.411 36.053 -1.411 c
+35.818 -1.411 35.642 -1.529 35.524 -1.764 c
+35.524 -3.307 l
+35.642 -3.535 35.821 -3.645 36.068 -3.645 c
+36.281 -3.645 36.439 -3.568 36.538 -3.41 c
+36.645 -3.256 36.7 -3.013 36.7 -2.69 c
+h
+37.541 -2.381 m
+37.541 -1.922 37.622 -1.573 37.791 -1.338 c
+37.967 -1.095 38.218 -0.97 38.541 -0.97 c
+38.824 -0.97 39.044 -1.087 39.203 -1.323 c
+39.203 0.221 l
+39.688 0.221 l
+39.688 -4.012 l
+39.247 -4.012 l
+39.218 -3.69 l
+39.06 -3.946 38.835 -4.072 38.541 -4.072 c
+38.225 -4.072 37.982 -3.954 37.806 -3.719 c
+37.63 -3.476 37.541 -3.131 37.541 -2.69 c
+h
+38.027 -2.66 m
+38.027 -2.994 38.075 -3.241 38.173 -3.395 c
+38.269 -3.553 38.431 -3.63 38.659 -3.63 c
+38.901 -3.63 39.085 -3.513 39.203 -3.278 c
+39.203 -1.764 l
+39.074 -1.529 38.894 -1.411 38.659 -1.411 c
+38.431 -1.411 38.269 -1.492 38.173 -1.646 c
+38.075 -1.804 38.027 -2.043 38.027 -2.366 c
+h
+41.786 -4.012 m
+41.757 -3.946 41.734 -3.836 41.727 -3.69 c
+41.551 -3.946 41.33 -4.072 41.065 -4.072 c
+40.789 -4.072 40.573 -3.998 40.419 -3.851 c
+40.272 -3.696 40.198 -3.48 40.198 -3.204 c
+40.198 -2.903 40.301 -2.66 40.507 -2.484 c
+40.712 -2.3 40.996 -2.205 41.36 -2.205 c
+41.712 -2.205 l
+41.712 -1.881 l
+41.712 -1.705 41.672 -1.583 41.595 -1.514 c
+41.514 -1.436 41.396 -1.396 41.242 -1.396 c
+41.095 -1.396 40.97 -1.44 40.874 -1.529 c
+40.787 -1.617 40.742 -1.727 40.742 -1.852 c
+40.257 -1.852 l
+40.257 -1.705 40.301 -1.565 40.39 -1.425 c
+40.477 -1.278 40.595 -1.168 40.742 -1.087 c
+40.897 -1.01 41.069 -0.97 41.257 -0.97 c
+41.569 -0.97 41.805 -1.051 41.963 -1.205 c
+42.117 -1.352 42.198 -1.573 42.198 -1.866 c
+42.198 -3.366 l
+42.204 -3.601 42.241 -3.803 42.3 -3.969 c
+42.3 -4.012 l
+h
+41.139 -3.63 m
+41.257 -3.63 41.367 -3.597 41.477 -3.528 c
+41.583 -3.461 41.661 -3.377 41.712 -3.278 c
+41.712 -2.572 l
+41.448 -2.572 l
+41.213 -2.572 41.025 -2.624 40.889 -2.719 c
+40.76 -2.818 40.698 -2.961 40.698 -3.146 c
+40.698 -3.314 40.727 -3.436 40.787 -3.513 c
+40.853 -3.594 40.97 -3.63 41.139 -3.63 c
+43.41 -0.309 m
+43.41 -1.029 l
+43.866 -1.029 l
+43.866 -1.425 l
+43.41 -1.425 l
+43.41 -3.278 l
+43.41 -3.395 43.428 -3.484 43.469 -3.542 c
+43.505 -3.601 43.575 -3.63 43.675 -3.63 c
+43.733 -3.63 43.796 -3.623 43.866 -3.601 c
+43.866 -4.012 l
+43.748 -4.049 43.634 -4.072 43.528 -4.072 c
+43.33 -4.072 43.178 -4.006 43.072 -3.865 c
+42.973 -3.73 42.925 -3.535 42.925 -3.278 c
+42.925 -1.425 l
+42.47 -1.425 l
+42.47 -1.029 l
+42.925 -1.029 l
+42.925 -0.309 l
+h
+45.391 -4.072 m
+45.016 -4.072 44.733 -3.965 44.538 -3.748 c
+44.34 -3.524 44.244 -3.197 44.244 -2.763 c
+44.244 -2.396 l
+44.244 -1.955 44.336 -1.61 44.523 -1.352 c
+44.718 -1.099 44.994 -0.97 45.346 -0.97 c
+45.688 -0.97 45.942 -1.084 46.111 -1.308 c
+46.287 -1.536 46.379 -1.881 46.391 -2.352 c
+46.391 -2.66 l
+44.729 -2.66 l
+44.729 -2.734 l
+44.729 -3.057 44.788 -3.293 44.905 -3.439 c
+45.023 -3.579 45.192 -3.645 45.42 -3.645 c
+45.568 -3.645 45.692 -3.623 45.803 -3.572 c
+45.909 -3.513 46.012 -3.424 46.111 -3.307 c
+46.361 -3.616 l
+46.156 -3.921 45.832 -4.072 45.391 -4.072 c
+45.346 -1.396 m
+45.14 -1.396 44.986 -1.466 44.891 -1.602 c
+44.791 -1.741 44.737 -1.955 44.729 -2.248 c
+45.905 -2.248 l
+45.905 -2.175 l
+45.883 -1.903 45.832 -1.705 45.743 -1.587 c
+45.655 -1.462 45.523 -1.396 45.346 -1.396 c
+48.635 -0.309 m
+48.635 -1.029 l
+49.092 -1.029 l
+49.092 -1.425 l
+48.635 -1.425 l
+48.635 -3.278 l
+48.635 -3.395 48.654 -3.484 48.695 -3.542 c
+48.731 -3.601 48.801 -3.63 48.9 -3.63 c
+48.959 -3.63 49.021 -3.623 49.092 -3.601 c
+49.092 -4.012 l
+48.974 -4.049 48.86 -4.072 48.753 -4.072 c
+48.554 -4.072 48.404 -4.006 48.298 -3.865 c
+48.198 -3.73 48.151 -3.535 48.151 -3.278 c
+48.151 -1.425 l
+47.695 -1.425 l
+47.695 -1.029 l
+48.151 -1.029 l
+48.151 -0.309 l
+h
+50.043 -1.338 m
+50.227 -1.095 50.462 -0.97 50.748 -0.97 c
+51.278 -0.97 51.546 -1.323 51.557 -2.028 c
+51.557 -4.012 l
+51.072 -4.012 l
+51.072 -2.057 l
+51.072 -1.822 51.031 -1.657 50.954 -1.558 c
+50.873 -1.462 50.756 -1.411 50.601 -1.411 c
+50.484 -1.411 50.374 -1.452 50.278 -1.529 c
+50.179 -1.61 50.102 -1.716 50.043 -1.852 c
+50.043 -4.012 l
+49.558 -4.012 l
+49.558 0.221 l
+50.043 0.221 l
+h
+53.159 -4.072 m
+52.784 -4.072 52.502 -3.965 52.307 -3.748 c
+52.109 -3.524 52.013 -3.197 52.013 -2.763 c
+52.013 -2.396 l
+52.013 -1.955 52.105 -1.61 52.292 -1.352 c
+52.487 -1.099 52.762 -0.97 53.115 -0.97 c
+53.457 -0.97 53.711 -1.084 53.879 -1.308 c
+54.056 -1.536 54.148 -1.881 54.158 -2.352 c
+54.158 -2.66 l
+52.498 -2.66 l
+52.498 -2.734 l
+52.498 -3.057 52.556 -3.293 52.674 -3.439 c
+52.791 -3.579 52.961 -3.645 53.188 -3.645 c
+53.335 -3.645 53.46 -3.623 53.57 -3.572 c
+53.678 -3.513 53.78 -3.424 53.879 -3.307 c
+54.129 -3.616 l
+53.923 -3.921 53.601 -4.072 53.159 -4.072 c
+53.115 -1.396 m
+52.909 -1.396 52.755 -1.466 52.66 -1.602 c
+52.56 -1.741 52.505 -1.955 52.498 -2.248 c
+53.674 -2.248 l
+53.674 -2.175 l
+53.651 -1.903 53.601 -1.705 53.512 -1.587 c
+53.424 -1.462 53.291 -1.396 53.115 -1.396 c
+55.026 -1.029 m
+55.041 -1.308 l
+55.217 -1.084 55.456 -0.97 55.76 -0.97 c
+56.092 -0.97 56.323 -1.117 56.452 -1.411 c
+56.635 -1.117 56.896 -0.97 57.231 -0.97 c
+57.79 -0.97 58.072 -1.315 58.083 -1.999 c
+58.083 -4.012 l
+57.599 -4.012 l
+57.599 -2.043 l
+57.599 -1.83 57.558 -1.672 57.481 -1.573 c
+57.4 -1.466 57.268 -1.411 57.084 -1.411 c
+56.936 -1.411 56.819 -1.469 56.731 -1.587 c
+56.643 -1.697 56.587 -1.837 56.57 -2.013 c
+56.57 -4.012 l
+56.084 -4.012 l
+56.084 -2.028 l
+56.074 -1.617 55.901 -1.411 55.569 -1.411 c
+55.324 -1.411 55.151 -1.536 55.055 -1.778 c
+55.055 -4.012 l
+54.57 -4.012 l
+54.57 -1.029 l
+h
+f
+Q
+ endstream endobj 54 0 obj <</BBox[720.868 437.21 745.375 431.389]/Group 90 0 R/Length 5115/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 721.2498 432.6827 cm
+0 0 m
+0 2.587 l
+-0.382 2.587 l
+-0.382 2.983 l
+0 2.983 l
+0 3.322 l
+0.008 3.623 0.088 3.858 0.235 4.027 c
+0.382 4.203 0.592 4.292 0.867 4.292 c
+0.963 4.292 1.062 4.277 1.162 4.247 c
+1.132 3.836 l
+1.062 3.844 0.989 3.85 0.912 3.85 c
+0.636 3.85 0.5 3.652 0.5 3.262 c
+0.5 2.983 l
+1 2.983 l
+1 2.587 l
+0.5 2.587 l
+0.5 0 l
+h
+2.697 2.528 m
+2.628 2.535 2.554 2.543 2.477 2.543 c
+2.22 2.543 2.043 2.403 1.948 2.131 c
+1.948 0 l
+1.463 0 l
+1.463 2.983 l
+1.933 2.983 l
+1.948 2.674 l
+2.072 2.917 2.257 3.042 2.492 3.042 c
+2.569 3.042 2.631 3.027 2.683 2.998 c
+h
+4.075 -0.059 m
+3.701 -0.059 3.418 0.047 3.223 0.264 c
+3.024 0.488 2.929 0.816 2.929 1.249 c
+2.929 1.616 l
+2.929 2.057 3.021 2.403 3.208 2.66 c
+3.403 2.913 3.678 3.042 4.031 3.042 c
+4.373 3.042 4.627 2.929 4.796 2.705 c
+4.972 2.476 5.064 2.131 5.075 1.66 c
+5.075 1.352 l
+3.414 1.352 l
+3.414 1.278 l
+3.414 0.955 3.473 0.72 3.591 0.573 c
+3.708 0.434 3.877 0.367 4.104 0.367 c
+4.252 0.367 4.377 0.389 4.487 0.44 c
+4.594 0.5 4.696 0.588 4.796 0.706 c
+5.045 0.396 l
+4.84 0.091 4.517 -0.059 4.075 -0.059 c
+4.031 2.616 m
+3.826 2.616 3.672 2.547 3.576 2.41 c
+3.476 2.271 3.422 2.057 3.414 1.764 c
+4.59 1.764 l
+4.59 1.837 l
+4.568 2.109 4.517 2.308 4.428 2.425 c
+4.34 2.55 4.208 2.616 4.031 2.616 c
+5.384 1.631 m
+5.384 2.09 5.465 2.439 5.633 2.674 c
+5.799 2.917 6.049 3.042 6.383 3.042 c
+6.677 3.042 6.901 2.925 7.059 2.69 c
+7.088 2.983 l
+7.53 2.983 l
+7.53 -1.147 l
+7.044 -1.147 l
+7.044 0.264 l
+6.887 0.047 6.666 -0.059 6.383 -0.059 c
+6.06 -0.059 5.81 0.058 5.633 0.294 c
+5.465 0.529 5.384 0.87 5.384 1.323 c
+h
+5.868 1.352 m
+5.868 1.018 5.916 0.768 6.016 0.602 c
+6.122 0.444 6.288 0.367 6.516 0.367 c
+6.74 0.367 6.916 0.474 7.044 0.69 c
+7.044 2.293 l
+6.905 2.506 6.729 2.616 6.516 2.616 c
+6.288 2.616 6.122 2.532 6.016 2.366 c
+5.916 2.208 5.868 1.969 5.868 1.646 c
+h
+9.635 0.264 m
+9.477 0.047 9.242 -0.059 8.93 -0.059 c
+8.665 -0.059 8.459 0.033 8.312 0.22 c
+8.173 0.404 8.106 0.679 8.106 1.043 c
+8.106 2.983 l
+8.592 2.983 l
+8.592 1.072 l
+8.592 0.61 8.731 0.382 9.018 0.382 c
+9.312 0.382 9.511 0.514 9.621 0.779 c
+9.621 2.983 l
+10.12 2.983 l
+10.12 0 l
+9.65 0 l
+h
+11.73 -0.059 m
+11.356 -0.059 11.073 0.047 10.878 0.264 c
+10.679 0.488 10.583 0.816 10.583 1.249 c
+10.583 1.616 l
+10.583 2.057 10.676 2.403 10.863 2.66 c
+11.057 2.913 11.333 3.042 11.686 3.042 c
+12.027 3.042 12.281 2.929 12.451 2.705 c
+12.627 2.476 12.719 2.131 12.729 1.66 c
+12.729 1.352 l
+11.069 1.352 l
+11.069 1.278 l
+11.069 0.955 11.127 0.72 11.245 0.573 c
+11.362 0.434 11.532 0.367 11.759 0.367 c
+11.906 0.367 12.031 0.389 12.141 0.44 c
+12.248 0.5 12.351 0.588 12.451 0.706 c
+12.7 0.396 l
+12.494 0.091 12.171 -0.059 11.73 -0.059 c
+11.686 2.616 m
+11.48 2.616 11.326 2.547 11.231 2.41 c
+11.131 2.271 11.076 2.057 11.069 1.764 c
+12.245 1.764 l
+12.245 1.837 l
+12.222 2.109 12.171 2.308 12.083 2.425 c
+11.994 2.55 11.863 2.616 11.686 2.616 c
+13.596 2.983 m
+13.612 2.66 l
+13.795 2.913 14.038 3.042 14.332 3.042 c
+14.861 3.042 15.129 2.69 15.14 1.984 c
+15.14 0 l
+14.655 0 l
+14.655 1.955 l
+14.655 2.19 14.614 2.356 14.537 2.454 c
+14.456 2.55 14.339 2.601 14.185 2.601 c
+14.067 2.601 13.957 2.561 13.862 2.484 c
+13.762 2.403 13.685 2.296 13.627 2.16 c
+13.627 0 l
+13.141 0 l
+13.141 2.983 l
+h
+16.324 3.704 m
+16.324 2.983 l
+16.779 2.983 l
+16.779 2.587 l
+16.324 2.587 l
+16.324 0.735 l
+16.324 0.617 16.342 0.529 16.382 0.47 c
+16.419 0.411 16.489 0.382 16.588 0.382 c
+16.646 0.382 16.709 0.389 16.779 0.411 c
+16.779 0 l
+16.661 -0.037 16.548 -0.059 16.441 -0.059 c
+16.243 -0.059 16.092 0.007 15.985 0.147 c
+15.886 0.282 15.838 0.477 15.838 0.735 c
+15.838 2.587 l
+15.383 2.587 l
+15.383 2.983 l
+15.838 2.983 l
+15.838 3.704 l
+h
+17.775 0 -0.501 4.233 re
+19.26 0.808 m
+19.804 2.983 l
+20.318 2.983 l
+19.348 -0.427 l
+19.278 -0.68 19.175 -0.871 19.039 -1 c
+18.899 -1.135 18.749 -1.206 18.583 -1.206 c
+18.514 -1.206 18.429 -1.191 18.333 -1.162 c
+18.333 -0.75 l
+18.437 -0.765 l
+18.572 -0.765 18.679 -0.728 18.76 -0.662 c
+18.848 -0.592 18.915 -0.474 18.965 -0.31 c
+19.054 0.029 l
+18.186 2.983 l
+18.716 2.983 l
+h
+21.876 0.264 m
+21.876 0.353 21.899 0.426 21.949 0.484 c
+22.009 0.544 22.086 0.573 22.185 0.573 c
+22.291 0.573 22.369 0.544 22.42 0.484 c
+22.479 0.426 22.508 0.353 22.508 0.264 c
+22.508 0.183 22.479 0.118 22.42 0.058 c
+22.369 0 22.291 -0.03 22.185 -0.03 c
+22.086 -0.03 22.009 0 21.949 0.058 c
+21.899 0.118 21.876 0.183 21.876 0.264 c
+21.876 3.087 m
+21.876 3.175 21.899 3.248 21.949 3.307 c
+22.009 3.366 22.086 3.395 22.185 3.395 c
+22.291 3.395 22.369 3.366 22.42 3.307 c
+22.479 3.248 22.508 3.175 22.508 3.087 c
+22.508 3.006 22.479 2.94 22.42 2.881 c
+22.369 2.822 22.291 2.792 22.185 2.792 c
+22.086 2.792 22.009 2.822 21.949 2.881 c
+21.899 2.94 21.876 3.006 21.876 3.087 c
+24.125 1.602 m
+24.125 0.779 23.941 0.051 23.582 -0.574 c
+23.376 -0.915 23.169 -1.154 22.963 -1.294 c
+22.861 -0.985 l
+23.096 -0.757 23.28 -0.42 23.42 0.029 c
+23.567 0.488 23.64 0.988 23.64 1.529 c
+23.64 1.631 l
+23.64 2.326 23.526 2.954 23.302 3.513 c
+23.173 3.806 23.026 4.041 22.861 4.218 c
+22.963 4.527 l
+23.158 4.388 23.353 4.167 23.551 3.866 c
+23.934 3.218 24.125 2.462 24.125 1.602 c
+f
+Q
+ endstream endobj 55 0 obj <</BBox[320.12 122.007 531.709 116.418]/Group 91 0 R/Length 125/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 92 0 R>>/ExtGState<</GS0 12 0 R>>/Shading<</Sh0 93 0 R>>>>/Subtype/Form>>stream
+q
+320.12 122.007 211.589 -5.589 re
+W n
+q
+0 g
+/GS0 gs
+212.3990173 0 0 139.9599457 319.716156 119.2128296 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 56 0 obj <</BBox[80.2243 128.522 302.099 76.7775]/Group 94 0 R/Length 1745/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 217.0464 128.5219 cm
+0 0 m
+-12.446 0 -23.272 -2.697 -28.986 -6.673 c
+-31.187 -6.214 -33.551 -5.953 -35.983 -5.953 c
+-41.337 -5.953 -46.243 -7.162 -50.141 -9.161 c
+-52.585 -7.919 -55.856 -7.136 -59.461 -7.136 c
+-64.727 -7.136 -69.287 -8.764 -71.573 -11.135 c
+-74.947 -10.329 -79.352 -9.834 -84.196 -9.834 c
+-91.013 -9.834 -96.981 -10.815 -100.372 -12.274 c
+-103.823 -11.439 -107.74 -10.95 -111.904 -10.95 c
+-125.666 -10.95 -136.822 -16.11 -136.822 -22.478 c
+-136.822 -27.097 -130.935 -31.077 -122.458 -32.915 c
+-124.924 -33.932 -126.408 -35.215 -126.408 -36.612 c
+-126.408 -39.901 -118.25 -42.565 -108.185 -42.565 c
+-103.875 -42.565 -99.913 -42.079 -96.793 -41.26 c
+-95.863 -41.863 -94.805 -42.189 -93.681 -42.189 c
+-92.133 -42.189 -90.722 -41.547 -89.587 -40.47 c
+-86.603 -41.984 -82.384 -42.935 -77.688 -42.935 c
+-74.98 -42.935 -72.426 -42.605 -70.176 -42.05 c
+-69.544 -44.417 -63.745 -46.283 -56.672 -46.283 c
+-50.112 -46.283 -44.641 -44.681 -43.377 -42.565 c
+-40.415 -43.832 -36.454 -44.608 -32.103 -44.608 c
+-31.268 -44.608 -30.463 -44.571 -29.662 -44.516 c
+-24.992 -48.768 -14.14 -51.744 -1.488 -51.744 c
+11.198 -51.744 22.082 -48.76 26.73 -44.494 c
+27.987 -44.575 29.307 -44.608 30.637 -44.608 c
+41.639 -44.608 50.558 -41.69 50.558 -38.077 c
+50.558 -37.512 50.315 -36.971 49.907 -36.45 c
+53.178 -36.138 55.463 -35.413 55.463 -34.568 c
+55.463 -34.322 55.258 -34.087 54.905 -33.87 c
+55.633 -33.892 56.349 -33.914 57.092 -33.914 c
+72.525 -33.914 85.052 -28.696 85.052 -22.295 c
+85.052 -15.889 72.525 -10.715 57.092 -10.715 c
+53.362 -10.715 49.812 -11.027 46.56 -11.575 c
+43.962 -10.697 39.783 -10.113 35.076 -10.113 c
+34.183 -10.113 33.323 -10.142 32.474 -10.183 c
+29.101 -4.358 15.842 0 0 0 c
+f
+Q
+ endstream endobj 57 0 obj <</BBox[549.22 269.428 582.876 265.077]/Group 95 0 R/Length 6396/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 551.4096 266.1785 cm
+0 0 m
+-1.352 0 l
+-1.675 -1.043 l
+-2.19 -1.043 l
+-0.896 2.97 l
+-0.47 2.97 l
+0.838 -1.043 l
+0.309 -1.043 l
+h
+-1.22 0.441 m
+-0.132 0.441 l
+-0.676 2.264 l
+h
+3.05 0.324 m
+2.786 0.03 l
+2.786 -1.043 l
+2.3 -1.043 l
+2.3 3.19 l
+2.786 3.19 l
+2.786 0.662 l
+3.711 1.941 l
+4.299 1.941 l
+3.358 0.691 l
+4.432 -1.043 l
+3.859 -1.043 l
+h
+5.203 -1.043 -0.5 2.984 re
+5.233 2.735 m
+5.233 2.646 5.207 2.573 5.159 2.514 c
+5.12 2.463 5.049 2.44 4.954 2.44 c
+4.866 2.44 4.796 2.463 4.748 2.514 c
+4.707 2.573 4.689 2.639 4.689 2.72 c
+4.689 2.808 4.707 2.881 4.748 2.94 c
+4.796 2.999 4.866 3.028 4.954 3.028 c
+5.049 3.028 5.12 2.999 5.159 2.94 c
+5.207 2.881 5.233 2.812 5.233 2.735 c
+6.335 1.941 m
+6.35 1.617 l
+6.533 1.871 6.776 1.999 7.071 1.999 c
+7.599 1.999 7.867 1.646 7.879 0.941 c
+7.879 -1.043 l
+7.394 -1.043 l
+7.394 0.912 l
+7.394 1.147 7.354 1.312 7.276 1.411 c
+7.196 1.507 7.078 1.559 6.924 1.559 c
+6.805 1.559 6.695 1.518 6.6 1.441 c
+6.5 1.36 6.423 1.253 6.365 1.118 c
+6.365 -1.043 l
+5.88 -1.043 l
+5.88 1.941 l
+h
+8.327 0.588 m
+8.327 1.048 8.408 1.397 8.577 1.632 c
+8.754 1.875 9.003 1.999 9.327 1.999 c
+9.61 1.999 9.83 1.881 9.988 1.646 c
+9.988 3.19 l
+10.473 3.19 l
+10.473 -1.043 l
+10.032 -1.043 l
+10.003 -0.72 l
+9.845 -0.977 9.621 -1.102 9.327 -1.102 c
+9.01 -1.102 8.768 -0.984 8.592 -0.749 c
+8.415 -0.507 8.327 -0.161 8.327 0.279 c
+h
+8.812 0.309 m
+8.812 -0.025 8.86 -0.272 8.96 -0.426 c
+9.055 -0.584 9.216 -0.661 9.444 -0.661 c
+9.687 -0.661 9.87 -0.544 9.988 -0.309 c
+9.988 1.206 l
+9.86 1.441 9.679 1.559 9.444 1.559 c
+9.216 1.559 9.055 1.478 8.96 1.324 c
+8.86 1.166 8.812 0.927 8.812 0.603 c
+h
+12.145 0.588 m
+12.145 1.018 12.248 1.36 12.453 1.617 c
+12.667 1.871 12.946 1.999 13.292 1.999 c
+13.633 1.999 13.909 1.871 14.115 1.617 c
+14.328 1.371 14.442 1.037 14.453 0.618 c
+14.453 0.309 l
+14.453 -0.124 14.343 -0.467 14.13 -0.72 c
+13.924 -0.977 13.644 -1.102 13.292 -1.102 c
+12.946 -1.102 12.675 -0.981 12.469 -0.735 c
+12.263 -0.492 12.152 -0.158 12.145 0.265 c
+h
+12.63 0.309 m
+12.63 -0.007 12.689 -0.249 12.806 -0.426 c
+12.931 -0.595 13.093 -0.675 13.292 -0.675 c
+13.722 -0.675 13.945 -0.367 13.968 0.25 c
+13.968 0.588 l
+13.968 0.89 13.901 1.133 13.777 1.309 c
+13.66 1.485 13.498 1.573 13.292 1.573 c
+13.093 1.573 12.931 1.485 12.806 1.309 c
+12.689 1.133 12.63 0.89 12.63 0.588 c
+h
+15.1 -1.043 m
+15.1 1.544 l
+14.718 1.544 l
+14.718 1.941 l
+15.1 1.941 l
+15.1 2.278 l
+15.107 2.58 15.188 2.816 15.335 2.984 c
+15.482 3.161 15.692 3.249 15.967 3.249 c
+16.062 3.249 16.162 3.234 16.261 3.205 c
+16.232 2.793 l
+16.162 2.801 16.089 2.808 16.011 2.808 c
+15.736 2.808 15.599 2.61 15.599 2.22 c
+15.599 1.941 l
+16.099 1.941 l
+16.099 1.544 l
+15.599 1.544 l
+15.599 -1.043 l
+h
+19.293 -1.043 m
+19.264 -0.977 19.241 -0.866 19.233 -0.72 c
+19.057 -0.977 18.837 -1.102 18.572 -1.102 c
+18.296 -1.102 18.08 -1.028 17.926 -0.882 c
+17.779 -0.727 17.705 -0.511 17.705 -0.235 c
+17.705 0.067 17.808 0.309 18.014 0.485 c
+18.219 0.669 18.502 0.765 18.867 0.765 c
+19.219 0.765 l
+19.219 1.088 l
+19.219 1.264 19.179 1.386 19.102 1.455 c
+19.021 1.532 18.903 1.573 18.749 1.573 c
+18.602 1.573 18.477 1.529 18.381 1.441 c
+18.293 1.353 18.249 1.243 18.249 1.118 c
+17.764 1.118 l
+17.764 1.264 17.808 1.405 17.897 1.544 c
+17.984 1.69 18.102 1.801 18.249 1.881 c
+18.404 1.959 18.576 1.999 18.763 1.999 c
+19.075 1.999 19.311 1.918 19.469 1.764 c
+19.624 1.617 19.704 1.397 19.704 1.103 c
+19.704 -0.396 l
+19.711 -0.631 19.748 -0.833 19.807 -0.999 c
+19.807 -1.043 l
+h
+18.646 -0.661 m
+18.763 -0.661 18.874 -0.628 18.984 -0.558 c
+19.09 -0.492 19.168 -0.407 19.219 -0.309 c
+19.219 0.397 l
+18.955 0.397 l
+18.72 0.397 18.532 0.346 18.396 0.25 c
+18.267 0.151 18.205 0.008 18.205 -0.176 c
+18.205 -0.345 18.234 -0.467 18.293 -0.544 c
+18.359 -0.625 18.477 -0.661 18.646 -0.661 c
+22.931 -0.278 m
+22.931 -0.172 22.89 -0.084 22.813 -0.014 c
+22.732 0.063 22.581 0.151 22.358 0.25 c
+22.092 0.357 21.905 0.449 21.799 0.53 c
+21.689 0.607 21.612 0.695 21.564 0.794 c
+21.512 0.89 21.49 1.008 21.49 1.147 c
+21.49 1.389 21.579 1.592 21.755 1.75 c
+21.931 1.915 22.155 1.999 22.431 1.999 c
+22.725 1.999 22.96 1.912 23.137 1.735 c
+23.312 1.565 23.401 1.353 23.401 1.088 c
+22.916 1.088 l
+22.916 1.224 22.865 1.338 22.769 1.426 c
+22.681 1.522 22.566 1.573 22.431 1.573 c
+22.284 1.573 22.17 1.532 22.092 1.455 c
+22.012 1.386 21.976 1.287 21.976 1.162 c
+21.976 1.062 22.005 0.985 22.063 0.927 c
+22.122 0.867 22.262 0.786 22.489 0.691 c
+22.85 0.545 23.096 0.401 23.225 0.265 c
+23.36 0.136 23.43 -0.037 23.43 -0.249 c
+23.43 -0.507 23.335 -0.712 23.152 -0.866 c
+22.975 -1.024 22.74 -1.102 22.446 -1.102 c
+22.13 -1.102 21.876 -1.014 21.681 -0.837 c
+21.494 -0.654 21.402 -0.422 21.402 -0.147 c
+21.887 -0.147 l
+21.895 -0.316 21.946 -0.448 22.034 -0.544 c
+22.13 -0.631 22.269 -0.675 22.446 -0.675 c
+22.6 -0.675 22.718 -0.643 22.798 -0.573 c
+22.886 -0.507 22.931 -0.407 22.931 -0.278 c
+24.371 1.632 m
+24.555 1.875 24.79 1.999 25.076 1.999 c
+25.606 1.999 25.874 1.646 25.885 0.941 c
+25.885 -1.043 l
+25.4 -1.043 l
+25.4 0.912 l
+25.4 1.147 25.359 1.312 25.282 1.411 c
+25.201 1.507 25.084 1.559 24.93 1.559 c
+24.812 1.559 24.702 1.518 24.606 1.441 c
+24.507 1.36 24.43 1.253 24.371 1.118 c
+24.371 -1.043 l
+23.886 -1.043 l
+23.886 3.19 l
+24.371 3.19 l
+h
+27.487 -1.102 m
+27.112 -1.102 26.83 -0.995 26.635 -0.779 c
+26.437 -0.554 26.341 -0.228 26.341 0.206 c
+26.341 0.574 l
+26.341 1.015 26.433 1.36 26.62 1.617 c
+26.815 1.871 27.091 1.999 27.443 1.999 c
+27.785 1.999 28.039 1.885 28.207 1.661 c
+28.384 1.434 28.476 1.088 28.487 0.618 c
+28.487 0.309 l
+26.826 0.309 l
+26.826 0.235 l
+26.826 -0.087 26.884 -0.323 27.002 -0.47 c
+27.12 -0.61 27.289 -0.675 27.517 -0.675 c
+27.663 -0.675 27.789 -0.654 27.899 -0.602 c
+28.006 -0.544 28.108 -0.455 28.207 -0.338 c
+28.457 -0.646 l
+28.251 -0.951 27.929 -1.102 27.487 -1.102 c
+27.443 1.573 m
+27.237 1.573 27.083 1.503 26.988 1.368 c
+26.888 1.228 26.834 1.015 26.826 0.721 c
+28.002 0.721 l
+28.002 0.794 l
+27.979 1.066 27.929 1.264 27.84 1.382 c
+27.752 1.507 27.62 1.573 27.443 1.573 c
+29.427 -1.043 -0.5 4.233 re
+30.306 -1.043 m
+30.306 1.544 l
+29.924 1.544 l
+29.924 1.941 l
+30.306 1.941 l
+30.306 2.278 l
+30.313 2.58 30.394 2.816 30.541 2.984 c
+30.688 3.161 30.898 3.249 31.173 3.249 c
+31.268 3.249 31.368 3.234 31.467 3.205 c
+31.438 2.793 l
+31.368 2.801 31.295 2.808 31.218 2.808 c
+30.942 2.808 30.805 2.61 30.805 2.22 c
+30.805 1.941 l
+31.305 1.941 l
+31.305 1.544 l
+30.805 1.544 l
+30.805 -1.043 l
+h
+f
+Q
+ endstream endobj 58 0 obj <</BBox[553.089 262.843 578.922 258.492]/Group 96 0 R/Length 6110/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 553.4717 258.55 cm
+0 0 m
+0 2.587 l
+-0.383 2.587 l
+-0.383 2.984 l
+0 2.984 l
+0 3.322 l
+0.007 3.624 0.087 3.859 0.235 4.027 c
+0.382 4.204 0.591 4.293 0.866 4.293 c
+0.962 4.293 1.061 4.278 1.161 4.248 c
+1.132 3.836 l
+1.061 3.844 0.988 3.851 0.911 3.851 c
+0.635 3.851 0.5 3.653 0.5 3.263 c
+0.5 2.984 l
+0.999 2.984 l
+0.999 2.587 l
+0.5 2.587 l
+0.5 0 l
+h
+1.359 1.631 m
+1.359 2.061 1.462 2.404 1.668 2.66 c
+1.881 2.914 2.16 3.042 2.506 3.042 c
+2.848 3.042 3.123 2.914 3.329 2.66 c
+3.542 2.414 3.656 2.08 3.667 1.661 c
+3.667 1.353 l
+3.667 0.919 3.557 0.577 3.343 0.324 c
+3.137 0.066 2.859 -0.058 2.506 -0.058 c
+2.16 -0.058 1.888 0.062 1.683 0.309 c
+1.477 0.551 1.367 0.885 1.359 1.309 c
+h
+1.844 1.353 m
+1.844 1.037 1.903 0.794 2.021 0.617 c
+2.146 0.449 2.308 0.368 2.506 0.368 c
+2.936 0.368 3.16 0.676 3.182 1.294 c
+3.182 1.631 l
+3.182 1.933 3.116 2.176 2.991 2.352 c
+2.873 2.529 2.711 2.616 2.506 2.616 c
+2.308 2.616 2.146 2.529 2.021 2.352 c
+1.903 2.176 1.844 1.933 1.844 1.631 c
+h
+5.339 2.529 m
+5.269 2.535 5.196 2.543 5.119 2.543 c
+4.862 2.543 4.685 2.404 4.589 2.132 c
+4.589 0 l
+4.104 0 l
+4.104 2.984 l
+4.575 2.984 l
+4.589 2.675 l
+4.714 2.918 4.898 3.042 5.134 3.042 c
+5.211 3.042 5.273 3.028 5.325 2.999 c
+h
+7.548 3.705 m
+7.548 2.984 l
+8.003 2.984 l
+8.003 2.587 l
+7.548 2.587 l
+7.548 0.735 l
+7.548 0.617 7.565 0.53 7.606 0.47 c
+7.643 0.412 7.713 0.382 7.812 0.382 c
+7.871 0.382 7.933 0.389 8.003 0.412 c
+8.003 0 l
+7.885 -0.037 7.771 -0.058 7.665 -0.058 c
+7.467 -0.058 7.316 0.008 7.21 0.147 c
+7.11 0.283 7.062 0.478 7.062 0.735 c
+7.062 2.587 l
+6.607 2.587 l
+6.607 2.984 l
+7.062 2.984 l
+7.062 3.705 l
+h
+8.955 2.675 m
+9.138 2.918 9.374 3.042 9.66 3.042 c
+10.19 3.042 10.458 2.69 10.469 1.984 c
+10.469 0 l
+9.984 0 l
+9.984 1.955 l
+9.984 2.19 9.944 2.356 9.866 2.454 c
+9.786 2.55 9.668 2.602 9.514 2.602 c
+9.396 2.602 9.286 2.562 9.19 2.484 c
+9.091 2.404 9.014 2.296 8.955 2.161 c
+8.955 0 l
+8.469 0 l
+8.469 4.233 l
+8.955 4.233 l
+h
+12.068 -0.058 m
+11.692 -0.058 11.409 0.048 11.215 0.264 c
+11.016 0.489 10.921 0.816 10.921 1.249 c
+10.921 1.617 l
+10.921 2.058 11.013 2.404 11.2 2.66 c
+11.395 2.914 11.671 3.042 12.024 3.042 c
+12.365 3.042 12.619 2.929 12.787 2.705 c
+12.964 2.477 13.056 2.132 13.067 1.661 c
+13.067 1.353 l
+11.406 1.353 l
+11.406 1.278 l
+11.406 0.956 11.465 0.721 11.582 0.573 c
+11.7 0.434 11.869 0.368 12.097 0.368 c
+12.244 0.368 12.369 0.389 12.479 0.441 c
+12.585 0.5 12.689 0.588 12.787 0.706 c
+13.038 0.397 l
+12.832 0.092 12.508 -0.058 12.068 -0.058 c
+12.024 2.616 m
+11.818 2.616 11.663 2.547 11.567 2.411 c
+11.469 2.271 11.413 2.058 11.406 1.764 c
+12.582 1.764 l
+12.582 1.837 l
+12.56 2.109 12.508 2.308 12.421 2.425 c
+12.332 2.55 12.199 2.616 12.024 2.616 c
+15.139 2.984 m
+15.154 2.705 l
+15.33 2.929 15.569 3.042 15.875 3.042 c
+16.205 3.042 16.437 2.896 16.565 2.602 c
+16.749 2.896 17.01 3.042 17.344 3.042 c
+17.903 3.042 18.186 2.697 18.197 2.014 c
+18.197 0 l
+17.712 0 l
+17.712 1.97 l
+17.712 2.183 17.672 2.341 17.595 2.44 c
+17.514 2.547 17.381 2.602 17.198 2.602 c
+17.051 2.602 16.933 2.543 16.845 2.425 c
+16.756 2.315 16.701 2.176 16.683 1.999 c
+16.683 0 l
+16.198 0 l
+16.198 1.984 l
+16.187 2.396 16.014 2.602 15.683 2.602 c
+15.438 2.602 15.264 2.477 15.169 2.234 c
+15.169 0 l
+14.684 0 l
+14.684 2.984 l
+h
+19.704 -0.058 m
+19.328 -0.058 19.046 0.048 18.852 0.264 c
+18.653 0.489 18.557 0.816 18.557 1.249 c
+18.557 1.617 l
+18.557 2.058 18.649 2.404 18.836 2.66 c
+19.031 2.914 19.307 3.042 19.66 3.042 c
+20.001 3.042 20.255 2.929 20.423 2.705 c
+20.6 2.477 20.693 2.132 20.703 1.661 c
+20.703 1.353 l
+19.042 1.353 l
+19.042 1.278 l
+19.042 0.956 19.101 0.721 19.218 0.573 c
+19.336 0.434 19.505 0.368 19.733 0.368 c
+19.88 0.368 20.005 0.389 20.115 0.441 c
+20.222 0.5 20.325 0.588 20.423 0.706 c
+20.674 0.397 l
+20.468 0.092 20.145 -0.058 19.704 -0.058 c
+19.66 2.616 m
+19.453 2.616 19.299 2.547 19.204 2.411 c
+19.104 2.271 19.05 2.058 19.042 1.764 c
+20.218 1.764 l
+20.218 1.837 l
+20.196 2.109 20.145 2.308 20.057 2.425 c
+19.968 2.55 19.835 2.616 19.66 2.616 c
+22.555 0.765 m
+22.555 0.871 22.515 0.96 22.438 1.029 c
+22.357 1.106 22.206 1.195 21.982 1.294 c
+21.717 1.4 21.53 1.492 21.423 1.573 c
+21.313 1.65 21.236 1.738 21.188 1.837 c
+21.136 1.933 21.115 2.051 21.115 2.19 c
+21.115 2.433 21.203 2.635 21.379 2.793 c
+21.556 2.959 21.78 3.042 22.056 3.042 c
+22.349 3.042 22.584 2.955 22.761 2.778 c
+22.937 2.609 23.026 2.396 23.026 2.132 c
+22.54 2.132 l
+22.54 2.267 22.489 2.381 22.393 2.469 c
+22.305 2.565 22.191 2.616 22.056 2.616 c
+21.909 2.616 21.795 2.576 21.717 2.499 c
+21.637 2.429 21.599 2.33 21.599 2.205 c
+21.599 2.105 21.629 2.028 21.688 1.97 c
+21.747 1.911 21.886 1.83 22.114 1.735 c
+22.474 1.588 22.721 1.444 22.85 1.309 c
+22.985 1.18 23.055 1.007 23.055 0.794 c
+23.055 0.536 22.96 0.331 22.775 0.177 c
+22.599 0.019 22.364 -0.058 22.07 -0.058 c
+21.755 -0.058 21.501 0.029 21.306 0.206 c
+21.119 0.389 21.026 0.621 21.026 0.897 c
+21.512 0.897 l
+21.519 0.727 21.57 0.595 21.659 0.5 c
+21.755 0.412 21.894 0.368 22.07 0.368 c
+22.225 0.368 22.343 0.401 22.422 0.47 c
+22.511 0.536 22.555 0.636 22.555 0.765 c
+24.951 0.765 m
+24.951 0.871 24.911 0.96 24.834 1.029 c
+24.753 1.106 24.602 1.195 24.378 1.294 c
+24.113 1.4 23.926 1.492 23.82 1.573 c
+23.709 1.65 23.632 1.738 23.584 1.837 c
+23.533 1.933 23.511 2.051 23.511 2.19 c
+23.511 2.433 23.598 2.635 23.775 2.793 c
+23.951 2.959 24.176 3.042 24.452 3.042 c
+24.745 3.042 24.98 2.955 25.157 2.778 c
+25.333 2.609 25.422 2.396 25.422 2.132 c
+24.936 2.132 l
+24.936 2.267 24.885 2.381 24.789 2.469 c
+24.701 2.565 24.587 2.616 24.452 2.616 c
+24.304 2.616 24.19 2.576 24.113 2.499 c
+24.032 2.429 23.995 2.33 23.995 2.205 c
+23.995 2.105 24.026 2.028 24.084 1.97 c
+24.143 1.911 24.282 1.83 24.51 1.735 c
+24.87 1.588 25.117 1.444 25.245 1.309 c
+25.381 1.18 25.451 1.007 25.451 0.794 c
+25.451 0.536 25.356 0.331 25.171 0.177 c
+24.995 0.019 24.76 -0.058 24.466 -0.058 c
+24.15 -0.058 23.897 0.029 23.702 0.206 c
+23.515 0.389 23.423 0.621 23.423 0.897 c
+23.908 0.897 l
+23.914 0.727 23.966 0.595 24.055 0.5 c
+24.15 0.412 24.29 0.368 24.466 0.368 c
+24.62 0.368 24.738 0.401 24.819 0.47 c
+24.907 0.536 24.951 0.636 24.951 0.765 c
+f
+Q
+ endstream endobj 59 0 obj <</BBox[539.662 256.198 591.994 250.76]/Group 97 0 R/Length 10262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 540.7341 252.7729 cm
+0 0 m
+0.545 2.176 l
+1.058 2.176 l
+0.088 -1.234 l
+0.019 -1.488 -0.084 -1.679 -0.22 -1.807 c
+-0.359 -1.944 -0.51 -2.013 -0.675 -2.013 c
+-0.745 -2.013 -0.83 -1.999 -0.926 -1.969 c
+-0.926 -1.558 l
+-0.823 -1.572 l
+-0.687 -1.572 -0.58 -1.535 -0.5 -1.469 c
+-0.411 -1.4 -0.345 -1.282 -0.293 -1.117 c
+-0.205 -0.779 l
+-1.072 2.176 l
+-0.544 2.176 l
+h
+1.239 0.823 m
+1.239 1.253 1.342 1.595 1.548 1.852 c
+1.761 2.106 2.04 2.234 2.386 2.234 c
+2.727 2.234 3.003 2.106 3.209 1.852 c
+3.422 1.606 3.535 1.272 3.547 0.853 c
+3.547 0.545 l
+3.547 0.111 3.437 -0.231 3.223 -0.484 c
+3.018 -0.742 2.739 -0.866 2.386 -0.866 c
+2.04 -0.866 1.768 -0.746 1.563 -0.5 c
+1.357 -0.257 1.247 0.077 1.239 0.5 c
+h
+1.724 0.545 m
+1.724 0.229 1.783 -0.014 1.9 -0.191 c
+2.025 -0.359 2.187 -0.44 2.386 -0.44 c
+2.816 -0.44 3.04 -0.132 3.061 0.485 c
+3.061 0.823 l
+3.061 1.125 2.995 1.368 2.87 1.544 c
+2.753 1.721 2.591 1.808 2.386 1.808 c
+2.187 1.808 2.025 1.721 1.9 1.544 c
+1.783 1.368 1.724 1.125 1.724 0.823 c
+h
+5.501 -0.544 m
+5.343 -0.76 5.108 -0.866 4.796 -0.866 c
+4.532 -0.866 4.326 -0.775 4.179 -0.588 c
+4.039 -0.404 3.973 -0.128 3.973 0.235 c
+3.973 2.176 l
+4.458 2.176 l
+4.458 0.265 l
+4.458 -0.199 4.597 -0.426 4.884 -0.426 c
+5.178 -0.426 5.376 -0.294 5.486 -0.029 c
+5.486 2.176 l
+5.987 2.176 l
+5.987 -0.808 l
+5.517 -0.808 l
+h
+7.641 0.823 m
+7.641 1.283 7.722 1.632 7.89 1.867 c
+8.067 2.11 8.316 2.234 8.64 2.234 c
+8.923 2.234 9.143 2.117 9.301 1.881 c
+9.301 3.425 l
+9.787 3.425 l
+9.787 -0.808 l
+9.345 -0.808 l
+9.316 -0.484 l
+9.158 -0.742 8.934 -0.866 8.64 -0.866 c
+8.324 -0.866 8.081 -0.749 7.905 -0.514 c
+7.728 -0.272 7.641 0.074 7.641 0.515 c
+h
+8.125 0.545 m
+8.125 0.21 8.173 -0.037 8.272 -0.191 c
+8.368 -0.349 8.53 -0.426 8.757 -0.426 c
+9 -0.426 9.184 -0.309 9.301 -0.073 c
+9.301 1.441 l
+9.172 1.676 8.993 1.794 8.757 1.794 c
+8.53 1.794 8.368 1.713 8.272 1.559 c
+8.173 1.401 8.125 1.162 8.125 0.838 c
+h
+10.253 0.823 m
+10.253 1.253 10.356 1.595 10.562 1.852 c
+10.775 2.106 11.054 2.234 11.4 2.234 c
+11.741 2.234 12.017 2.106 12.223 1.852 c
+12.436 1.606 12.549 1.272 12.561 0.853 c
+12.561 0.545 l
+12.561 0.111 12.451 -0.231 12.237 -0.484 c
+12.032 -0.742 11.753 -0.866 11.4 -0.866 c
+11.054 -0.866 10.782 -0.746 10.577 -0.5 c
+10.371 -0.257 10.261 0.077 10.253 0.5 c
+h
+10.739 0.545 m
+10.739 0.229 10.797 -0.014 10.914 -0.191 c
+11.04 -0.359 11.201 -0.44 11.4 -0.44 c
+11.83 -0.44 12.054 -0.132 12.075 0.485 c
+12.075 0.823 l
+12.075 1.125 12.01 1.368 11.884 1.544 c
+11.767 1.721 11.605 1.808 11.4 1.808 c
+11.201 1.808 11.04 1.721 10.914 1.544 c
+10.797 1.368 10.739 1.125 10.739 0.823 c
+h
+13.457 2.176 m
+13.472 1.852 l
+13.656 2.106 13.899 2.234 14.192 2.234 c
+14.722 2.234 14.99 1.881 15.001 1.176 c
+15.001 -0.808 l
+14.516 -0.808 l
+14.516 1.147 l
+14.516 1.382 14.475 1.548 14.398 1.646 c
+14.317 1.742 14.2 1.794 14.045 1.794 c
+13.928 1.794 13.818 1.754 13.722 1.676 c
+13.623 1.595 13.546 1.488 13.486 1.353 c
+13.486 -0.808 l
+13.002 -0.808 l
+13.002 2.176 l
+h
+15.607 3.117 m
+15.563 2.103 l
+15.196 2.103 l
+15.21 3.425 l
+15.607 3.425 l
+h
+16.831 2.897 m
+16.831 2.176 l
+17.286 2.176 l
+17.286 1.779 l
+16.831 1.779 l
+16.831 -0.073 l
+16.831 -0.191 16.85 -0.278 16.89 -0.338 c
+16.927 -0.396 16.996 -0.426 17.095 -0.426 c
+17.154 -0.426 17.216 -0.419 17.286 -0.396 c
+17.286 -0.808 l
+17.169 -0.845 17.055 -0.866 16.948 -0.866 c
+16.75 -0.866 16.599 -0.801 16.493 -0.661 c
+16.393 -0.525 16.345 -0.33 16.345 -0.073 c
+16.345 1.779 l
+15.89 1.779 l
+15.89 2.176 l
+16.345 2.176 l
+16.345 2.897 l
+h
+21.178 0.044 m
+21.634 2.176 l
+22.119 2.176 l
+21.384 -0.808 l
+21.002 -0.808 l
+20.414 1.324 l
+19.84 -0.808 l
+19.458 -0.808 l
+18.724 2.176 l
+19.208 2.176 l
+19.678 0.103 l
+20.223 2.176 l
+20.605 2.176 l
+h
+23.912 -0.808 m
+23.883 -0.742 23.861 -0.631 23.853 -0.484 c
+23.677 -0.742 23.456 -0.866 23.192 -0.866 c
+22.917 -0.866 22.699 -0.793 22.545 -0.646 c
+22.398 -0.492 22.325 -0.276 22.325 0 c
+22.325 0.302 22.427 0.545 22.633 0.721 c
+22.839 0.904 23.122 1 23.486 1 c
+23.838 1 l
+23.838 1.324 l
+23.838 1.5 23.798 1.621 23.721 1.691 c
+23.64 1.768 23.522 1.808 23.368 1.808 c
+23.221 1.808 23.096 1.764 23.001 1.676 c
+22.913 1.588 22.868 1.478 22.868 1.353 c
+22.383 1.353 l
+22.383 1.5 22.427 1.64 22.516 1.779 c
+22.604 1.926 22.722 2.036 22.868 2.117 c
+23.023 2.194 23.196 2.234 23.383 2.234 c
+23.695 2.234 23.931 2.153 24.089 1.999 c
+24.243 1.852 24.324 1.632 24.324 1.338 c
+24.324 -0.161 l
+24.331 -0.396 24.368 -0.598 24.426 -0.764 c
+24.426 -0.808 l
+h
+23.265 -0.426 m
+23.383 -0.426 23.493 -0.393 23.603 -0.323 c
+23.71 -0.257 23.788 -0.172 23.838 -0.073 c
+23.838 0.632 l
+23.574 0.632 l
+23.339 0.632 23.152 0.581 23.015 0.485 c
+22.887 0.387 22.824 0.243 22.824 0.059 c
+22.824 -0.11 22.853 -0.231 22.913 -0.309 c
+22.979 -0.389 23.096 -0.426 23.265 -0.426 c
+25.36 2.176 m
+25.375 1.852 l
+25.558 2.106 25.801 2.234 26.095 2.234 c
+26.624 2.234 26.892 1.881 26.903 1.176 c
+26.903 -0.808 l
+26.418 -0.808 l
+26.418 1.147 l
+26.418 1.382 26.378 1.548 26.301 1.646 c
+26.22 1.742 26.103 1.794 25.948 1.794 c
+25.831 1.794 25.72 1.754 25.625 1.676 c
+25.525 1.595 25.448 1.488 25.39 1.353 c
+25.39 -0.808 l
+24.904 -0.808 l
+24.904 2.176 l
+h
+28.091 2.897 m
+28.091 2.176 l
+28.546 2.176 l
+28.546 1.779 l
+28.091 1.779 l
+28.091 -0.073 l
+28.091 -0.191 28.108 -0.278 28.149 -0.338 c
+28.185 -0.396 28.256 -0.426 28.355 -0.426 c
+28.414 -0.426 28.476 -0.419 28.546 -0.396 c
+28.546 -0.808 l
+28.428 -0.845 28.314 -0.866 28.208 -0.866 c
+28.01 -0.866 27.859 -0.801 27.752 -0.661 c
+27.653 -0.525 27.605 -0.33 27.605 -0.073 c
+27.605 1.779 l
+27.15 1.779 l
+27.15 2.176 l
+27.605 2.176 l
+27.605 2.897 l
+h
+30.847 2.897 m
+30.847 2.176 l
+31.302 2.176 l
+31.302 1.779 l
+30.847 1.779 l
+30.847 -0.073 l
+30.847 -0.191 30.865 -0.278 30.905 -0.338 c
+30.942 -0.396 31.012 -0.426 31.111 -0.426 c
+31.17 -0.426 31.233 -0.419 31.302 -0.396 c
+31.302 -0.808 l
+31.185 -0.845 31.071 -0.866 30.964 -0.866 c
+30.766 -0.866 30.615 -0.801 30.508 -0.661 c
+30.409 -0.525 30.362 -0.33 30.362 -0.073 c
+30.362 1.779 l
+29.906 1.779 l
+29.906 2.176 l
+30.362 2.176 l
+30.362 2.897 l
+h
+31.615 0.823 m
+31.615 1.253 31.717 1.595 31.923 1.852 c
+32.137 2.106 32.416 2.234 32.761 2.234 c
+33.103 2.234 33.378 2.106 33.584 1.852 c
+33.797 1.606 33.911 1.272 33.922 0.853 c
+33.922 0.545 l
+33.922 0.111 33.812 -0.231 33.599 -0.484 c
+33.393 -0.742 33.114 -0.866 32.761 -0.866 c
+32.416 -0.866 32.143 -0.746 31.938 -0.5 c
+31.732 -0.257 31.622 0.077 31.615 0.5 c
+h
+32.1 0.545 m
+32.1 0.229 32.158 -0.014 32.276 -0.191 c
+32.401 -0.359 32.563 -0.44 32.761 -0.44 c
+33.191 -0.44 33.415 -0.132 33.437 0.485 c
+33.437 0.823 l
+33.437 1.125 33.371 1.368 33.246 1.544 c
+33.128 1.721 32.966 1.808 32.761 1.808 c
+32.563 1.808 32.401 1.721 32.276 1.544 c
+32.158 1.368 32.1 1.125 32.1 0.823 c
+h
+36.094 -0.808 -0.501 2.984 re
+36.124 2.97 m
+36.124 2.881 36.098 2.808 36.05 2.749 c
+36.01 2.698 35.94 2.675 35.844 2.675 c
+35.756 2.675 35.686 2.698 35.638 2.749 c
+35.598 2.808 35.58 2.874 35.58 2.955 c
+35.58 3.043 35.598 3.117 35.638 3.175 c
+35.686 3.234 35.756 3.263 35.844 3.263 c
+35.94 3.263 36.01 3.234 36.05 3.175 c
+36.098 3.117 36.124 3.047 36.124 2.97 c
+37.226 2.176 m
+37.24 1.852 l
+37.425 2.106 37.667 2.234 37.961 2.234 c
+38.49 2.234 38.758 1.881 38.769 1.176 c
+38.769 -0.808 l
+38.284 -0.808 l
+38.284 1.147 l
+38.284 1.382 38.244 1.548 38.167 1.646 c
+38.086 1.742 37.968 1.794 37.814 1.794 c
+37.696 1.794 37.586 1.754 37.49 1.676 c
+37.392 1.595 37.315 1.488 37.255 1.353 c
+37.255 -0.808 l
+36.77 -0.808 l
+36.77 2.176 l
+h
+40.349 -0.44 m
+40.515 -0.44 40.648 -0.393 40.746 -0.294 c
+40.842 -0.199 40.897 -0.055 40.908 0.133 c
+41.363 0.133 l
+41.353 -0.154 41.25 -0.393 41.055 -0.588 c
+40.868 -0.775 40.632 -0.866 40.349 -0.866 c
+39.985 -0.866 39.707 -0.749 39.511 -0.514 c
+39.314 -0.278 39.218 0.067 39.218 0.53 c
+39.218 0.853 l
+39.218 1.301 39.31 1.646 39.497 1.881 c
+39.692 2.117 39.975 2.234 40.349 2.234 c
+40.65 2.234 40.893 2.135 41.07 1.941 c
+41.253 1.742 41.353 1.478 41.363 1.147 c
+40.908 1.147 l
+40.885 1.371 40.827 1.536 40.731 1.646 c
+40.644 1.754 40.515 1.808 40.349 1.808 c
+40.133 1.808 39.971 1.735 39.864 1.588 c
+39.765 1.448 39.71 1.22 39.703 0.897 c
+39.703 0.515 l
+39.703 0.162 39.75 -0.087 39.85 -0.235 c
+39.956 -0.374 40.122 -0.44 40.349 -0.44 c
+42.29 -0.808 -0.5 4.233 re
+44.476 -0.544 m
+44.318 -0.76 44.083 -0.866 43.771 -0.866 c
+43.506 -0.866 43.3 -0.775 43.154 -0.588 c
+43.013 -0.404 42.948 -0.128 42.948 0.235 c
+42.948 2.176 l
+43.432 2.176 l
+43.432 0.265 l
+43.432 -0.199 43.572 -0.426 43.859 -0.426 c
+44.153 -0.426 44.351 -0.294 44.461 -0.029 c
+44.461 2.176 l
+44.961 2.176 l
+44.961 -0.808 l
+44.49 -0.808 l
+h
+45.413 0.823 m
+45.413 1.283 45.494 1.632 45.664 1.867 c
+45.839 2.11 46.09 2.234 46.412 2.234 c
+46.696 2.234 46.917 2.117 47.075 1.881 c
+47.075 3.425 l
+47.559 3.425 l
+47.559 -0.808 l
+47.118 -0.808 l
+47.089 -0.484 l
+46.931 -0.742 46.707 -0.866 46.412 -0.866 c
+46.096 -0.866 45.855 -0.749 45.678 -0.514 c
+45.502 -0.272 45.413 0.074 45.413 0.515 c
+h
+45.899 0.545 m
+45.899 0.21 45.946 -0.037 46.045 -0.191 c
+46.14 -0.349 46.302 -0.426 46.53 -0.426 c
+46.773 -0.426 46.957 -0.309 47.075 -0.073 c
+47.075 1.441 l
+46.946 1.676 46.765 1.794 46.53 1.794 c
+46.302 1.794 46.14 1.713 46.045 1.559 c
+45.946 1.401 45.899 1.162 45.899 0.838 c
+h
+49.188 -0.866 m
+48.812 -0.866 48.529 -0.76 48.334 -0.544 c
+48.136 -0.319 48.041 0.008 48.041 0.441 c
+48.041 0.809 l
+48.041 1.25 48.133 1.595 48.32 1.852 c
+48.515 2.106 48.791 2.234 49.143 2.234 c
+49.485 2.234 49.739 2.12 49.907 1.897 c
+50.084 1.669 50.175 1.324 50.187 0.853 c
+50.187 0.545 l
+48.525 0.545 l
+48.525 0.47 l
+48.525 0.148 48.585 -0.087 48.702 -0.235 c
+48.82 -0.374 48.989 -0.44 49.217 -0.44 c
+49.363 -0.44 49.489 -0.419 49.599 -0.367 c
+49.705 -0.309 49.808 -0.22 49.907 -0.103 c
+50.157 -0.411 l
+49.951 -0.716 49.628 -0.866 49.188 -0.866 c
+49.143 1.808 m
+48.937 1.808 48.783 1.738 48.687 1.603 c
+48.588 1.463 48.533 1.25 48.525 0.956 c
+49.701 0.956 l
+49.701 1.029 l
+49.68 1.301 49.628 1.5 49.54 1.617 c
+49.452 1.742 49.319 1.808 49.143 1.808 c
+50.628 -0.544 m
+50.628 -0.455 50.649 -0.382 50.701 -0.323 c
+50.76 -0.264 50.838 -0.235 50.936 -0.235 c
+51.043 -0.235 51.12 -0.264 51.172 -0.323 c
+51.231 -0.382 51.26 -0.455 51.26 -0.544 c
+51.26 -0.625 51.231 -0.691 51.172 -0.749 c
+51.12 -0.808 51.043 -0.837 50.936 -0.837 c
+50.838 -0.837 50.76 -0.808 50.701 -0.749 c
+50.649 -0.691 50.628 -0.625 50.628 -0.544 c
+f
+Q
+ endstream endobj 60 0 obj <</BBox[733.061 286.676 768.669 281.238]/Group 98 0 R/Length 5722/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 735.7654 284.1042 cm
+0 0 m
+0 -0.551 -0.118 -0.977 -0.353 -1.278 c
+-0.588 -1.573 -0.919 -1.72 -1.338 -1.72 c
+-1.76 -1.72 -2.095 -1.58 -2.338 -1.294 c
+-2.573 -0.999 -2.697 -0.588 -2.705 -0.058 c
+-2.705 0.69 l
+-2.705 1.228 -2.587 1.65 -2.352 1.955 c
+-2.109 2.257 -1.775 2.411 -1.353 2.411 c
+-0.933 2.411 -0.603 2.263 -0.368 1.97 c
+-0.133 1.675 -0.011 1.257 0 0.721 c
+h
+-0.5 0.69 m
+-0.5 1.121 -0.573 1.44 -0.721 1.646 c
+-0.86 1.852 -1.07 1.955 -1.353 1.955 c
+-1.628 1.955 -1.837 1.845 -1.984 1.631 c
+-2.124 1.426 -2.19 1.118 -2.19 0.706 c
+-2.19 0 l
+-2.19 -0.411 -2.124 -0.727 -1.984 -0.941 c
+-1.837 -1.157 -1.628 -1.264 -1.353 -1.264 c
+-1.07 -1.264 -0.86 -1.168 -0.721 -0.97 c
+-0.584 -0.775 -0.511 -0.47 -0.5 -0.058 c
+h
+0.948 1.323 m
+0.962 1 l
+1.147 1.253 1.389 1.382 1.683 1.382 c
+2.212 1.382 2.481 1.029 2.491 0.324 c
+2.491 -1.661 l
+2.007 -1.661 l
+2.007 0.294 l
+2.007 0.53 1.966 0.694 1.889 0.794 c
+1.808 0.889 1.69 0.941 1.536 0.941 c
+1.419 0.941 1.309 0.9 1.213 0.823 c
+1.113 0.742 1.036 0.636 0.977 0.5 c
+0.977 -1.661 l
+0.492 -1.661 l
+0.492 1.323 l
+h
+3.572 -1.661 -0.5 4.233 re
+5.056 -0.852 m
+5.6 1.323 l
+6.115 1.323 l
+5.145 -2.088 l
+5.074 -2.341 4.972 -2.532 4.836 -2.66 c
+4.696 -2.797 4.546 -2.866 4.38 -2.866 c
+4.31 -2.866 4.226 -2.851 4.131 -2.822 c
+4.131 -2.41 l
+4.233 -2.425 l
+4.369 -2.425 4.476 -2.389 4.557 -2.323 c
+4.644 -2.252 4.711 -2.135 4.762 -1.97 c
+4.85 -1.631 l
+3.983 1.323 l
+4.513 1.323 l
+h
+8.172 -1.661 -0.5 2.984 re
+8.202 2.117 m
+8.202 2.028 8.176 1.955 8.129 1.897 c
+8.089 1.845 8.018 1.823 7.923 1.823 c
+7.834 1.823 7.765 1.845 7.717 1.897 c
+7.676 1.955 7.659 2.022 7.659 2.102 c
+7.659 2.19 7.676 2.263 7.717 2.323 c
+7.765 2.381 7.834 2.411 7.923 2.411 c
+8.018 2.411 8.089 2.381 8.129 2.323 c
+8.176 2.263 8.202 2.194 8.202 2.117 c
+9.305 1.323 m
+9.319 1 l
+9.502 1.253 9.745 1.382 10.04 1.382 c
+10.568 1.382 10.836 1.029 10.848 0.324 c
+10.848 -1.661 l
+10.362 -1.661 l
+10.362 0.294 l
+10.362 0.53 10.323 0.694 10.246 0.794 c
+10.165 0.889 10.047 0.941 9.892 0.941 c
+9.775 0.941 9.664 0.9 9.569 0.823 c
+9.469 0.742 9.392 0.636 9.334 0.5 c
+9.334 -1.661 l
+8.849 -1.661 l
+8.849 1.323 l
+h
+11.296 -0.029 m
+11.296 0.43 11.377 0.779 11.546 1.014 c
+11.723 1.257 11.972 1.382 12.295 1.382 c
+12.579 1.382 12.799 1.264 12.957 1.029 c
+12.957 2.572 l
+13.442 2.572 l
+13.442 -1.661 l
+13.001 -1.661 l
+12.972 -1.338 l
+12.814 -1.595 12.59 -1.72 12.295 -1.72 c
+11.979 -1.72 11.737 -1.602 11.561 -1.367 c
+11.384 -1.124 11.296 -0.779 11.296 -0.338 c
+h
+11.781 -0.309 m
+11.781 -0.643 11.829 -0.889 11.929 -1.043 c
+12.024 -1.201 12.185 -1.278 12.413 -1.278 c
+12.656 -1.278 12.839 -1.161 12.957 -0.926 c
+12.957 0.588 l
+12.829 0.823 12.648 0.941 12.413 0.941 c
+12.185 0.941 12.024 0.86 11.929 0.706 c
+11.829 0.548 11.781 0.309 11.781 -0.015 c
+h
+15.07 -1.72 m
+14.695 -1.72 14.412 -1.613 14.217 -1.396 c
+14.019 -1.172 13.924 -0.845 13.924 -0.411 c
+13.924 -0.044 l
+13.924 0.397 14.015 0.742 14.203 1 c
+14.398 1.253 14.674 1.382 15.026 1.382 c
+15.368 1.382 15.621 1.268 15.79 1.043 c
+15.967 0.816 16.058 0.47 16.07 0 c
+16.07 -0.309 l
+14.408 -0.309 l
+14.408 -0.382 l
+14.408 -0.706 14.468 -0.941 14.585 -1.087 c
+14.703 -1.228 14.871 -1.294 15.1 -1.294 c
+15.247 -1.294 15.372 -1.271 15.482 -1.22 c
+15.588 -1.161 15.692 -1.073 15.79 -0.956 c
+16.041 -1.264 l
+15.835 -1.569 15.511 -1.72 15.07 -1.72 c
+15.026 0.956 m
+14.82 0.956 14.666 0.886 14.57 0.75 c
+14.471 0.611 14.416 0.397 14.408 0.103 c
+15.584 0.103 l
+15.584 0.177 l
+15.563 0.449 15.511 0.647 15.422 0.765 c
+15.335 0.889 15.202 0.956 15.026 0.956 c
+17.334 0.235 m
+17.849 1.323 l
+18.422 1.323 l
+17.598 -0.147 l
+18.437 -1.661 l
+17.878 -1.661 l
+17.348 -0.544 l
+16.82 -1.661 l
+16.261 -1.661 l
+17.084 -0.147 l
+16.276 1.323 l
+16.834 1.323 l
+h
+22.221 -0.808 m
+22.677 1.323 l
+23.162 1.323 l
+22.427 -1.661 l
+22.044 -1.661 l
+21.456 0.47 l
+20.883 -1.661 l
+20.502 -1.661 l
+19.767 1.323 l
+20.251 1.323 l
+20.722 -0.75 l
+21.265 1.323 l
+21.648 1.323 l
+h
+23.956 -1.661 -0.5 2.984 re
+23.985 2.117 m
+23.985 2.028 23.96 1.955 23.912 1.897 c
+23.871 1.845 23.802 1.823 23.706 1.823 c
+23.617 1.823 23.548 1.845 23.5 1.897 c
+23.459 1.955 23.441 2.022 23.441 2.102 c
+23.441 2.19 23.459 2.263 23.5 2.323 c
+23.548 2.381 23.617 2.411 23.706 2.411 c
+23.802 2.411 23.871 2.381 23.912 2.323 c
+23.96 2.263 23.985 2.194 23.985 2.117 c
+25.161 -1.661 -0.5 4.233 re
+26.362 -1.661 -0.5 4.233 re
+30.405 -0.309 m
+30.405 -0.779 30.32 -1.132 30.155 -1.367 c
+29.986 -1.602 29.743 -1.72 29.42 -1.72 c
+29.104 -1.72 28.868 -1.583 28.714 -1.309 c
+28.685 -1.661 l
+28.244 -1.661 l
+28.244 2.572 l
+28.729 2.572 l
+28.729 1 l
+28.884 1.253 29.115 1.382 29.42 1.382 c
+29.743 1.382 29.986 1.264 30.155 1.029 c
+30.32 0.794 30.405 0.445 30.405 -0.015 c
+h
+29.92 -0.029 m
+29.92 0.324 29.868 0.573 29.773 0.721 c
+29.674 0.867 29.512 0.941 29.288 0.941 c
+29.042 0.941 28.854 0.802 28.729 0.53 c
+28.729 -0.881 l
+28.847 -1.147 29.038 -1.278 29.302 -1.278 c
+29.516 -1.278 29.674 -1.205 29.773 -1.058 c
+29.868 -0.904 29.92 -0.661 29.92 -0.338 c
+h
+31.904 -1.72 m
+31.529 -1.72 31.247 -1.613 31.052 -1.396 c
+30.853 -1.172 30.757 -0.845 30.757 -0.411 c
+30.757 -0.044 l
+30.757 0.397 30.85 0.742 31.037 1 c
+31.232 1.253 31.507 1.382 31.86 1.382 c
+32.201 1.382 32.456 1.268 32.625 1.043 c
+32.801 0.816 32.893 0.47 32.903 0 c
+32.903 -0.309 l
+31.243 -0.309 l
+31.243 -0.382 l
+31.243 -0.706 31.301 -0.941 31.419 -1.087 c
+31.536 -1.228 31.706 -1.294 31.933 -1.294 c
+32.08 -1.294 32.205 -1.271 32.315 -1.22 c
+32.423 -1.161 32.525 -1.073 32.625 -0.956 c
+32.874 -1.264 l
+32.668 -1.569 32.345 -1.72 31.904 -1.72 c
+31.86 0.956 m
+31.654 0.956 31.5 0.886 31.405 0.75 c
+31.305 0.611 31.25 0.397 31.243 0.103 c
+32.419 0.103 l
+32.419 0.177 l
+32.396 0.449 32.345 0.647 32.257 0.765 c
+32.169 0.889 32.037 0.956 31.86 0.956 c
+f
+Q
+ endstream endobj 61 0 obj <</BBox[739.087 280.091 762.253 275.799]/Group 99 0 R/Length 5385/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 740.2189 276.2256 cm
+0 0 m
+0.166 0 0.298 0.048 0.397 0.147 c
+0.493 0.243 0.547 0.386 0.559 0.573 c
+1.014 0.573 l
+1.004 0.287 0.9 0.048 0.706 -0.147 c
+0.518 -0.334 0.283 -0.426 0 -0.426 c
+-0.363 -0.426 -0.643 -0.309 -0.837 -0.073 c
+-1.036 0.162 -1.132 0.507 -1.132 0.97 c
+-1.132 1.294 l
+-1.132 1.742 -1.04 2.087 -0.852 2.323 c
+-0.658 2.558 -0.374 2.675 0 2.675 c
+0.302 2.675 0.544 2.576 0.721 2.381 c
+0.904 2.182 1.004 1.918 1.014 1.588 c
+0.559 1.588 l
+0.537 1.812 0.478 1.977 0.383 2.087 c
+0.294 2.194 0.166 2.249 0 2.249 c
+-0.216 2.249 -0.378 2.176 -0.484 2.028 c
+-0.584 1.889 -0.639 1.661 -0.646 1.338 c
+-0.646 0.956 l
+-0.646 0.603 -0.598 0.353 -0.5 0.206 c
+-0.393 0.066 -0.228 0 0 0 c
+1.309 1.264 m
+1.309 1.694 1.411 2.036 1.617 2.294 c
+1.831 2.547 2.109 2.675 2.455 2.675 c
+2.797 2.675 3.072 2.547 3.278 2.294 c
+3.491 2.047 3.605 1.712 3.616 1.294 c
+3.616 0.985 l
+3.616 0.551 3.506 0.21 3.293 -0.044 c
+3.087 -0.301 2.808 -0.426 2.455 -0.426 c
+2.109 -0.426 1.837 -0.305 1.632 -0.058 c
+1.426 0.183 1.316 0.518 1.309 0.941 c
+h
+1.794 0.985 m
+1.794 0.669 1.852 0.426 1.97 0.25 c
+2.095 0.081 2.257 0 2.455 0 c
+2.885 0 3.109 0.309 3.131 0.926 c
+3.131 1.264 l
+3.131 1.565 3.065 1.808 2.94 1.984 c
+2.822 2.161 2.66 2.249 2.455 2.249 c
+2.257 2.249 2.095 2.161 1.97 1.984 c
+1.852 1.808 1.794 1.565 1.794 1.264 c
+h
+4.509 2.616 m
+4.524 2.337 l
+4.7 2.562 4.939 2.675 5.244 2.675 c
+5.575 2.675 5.806 2.529 5.935 2.234 c
+6.119 2.529 6.379 2.675 6.714 2.675 c
+7.273 2.675 7.555 2.33 7.566 1.646 c
+7.566 -0.368 l
+7.082 -0.368 l
+7.082 1.602 l
+7.082 1.816 7.041 1.974 6.964 2.072 c
+6.883 2.18 6.751 2.234 6.567 2.234 c
+6.42 2.234 6.302 2.176 6.215 2.058 c
+6.126 1.947 6.071 1.808 6.053 1.631 c
+6.053 -0.368 l
+5.567 -0.368 l
+5.567 1.617 l
+5.557 2.028 5.384 2.234 5.053 2.234 c
+4.807 2.234 4.634 2.109 4.538 1.866 c
+4.538 -0.368 l
+4.054 -0.368 l
+4.054 2.616 l
+h
+8.47 2.616 m
+8.485 2.337 l
+8.661 2.562 8.9 2.675 9.205 2.675 c
+9.536 2.675 9.768 2.529 9.897 2.234 c
+10.08 2.529 10.341 2.675 10.675 2.675 c
+11.234 2.675 11.516 2.33 11.528 1.646 c
+11.528 -0.368 l
+11.043 -0.368 l
+11.043 1.602 l
+11.043 1.816 11.003 1.974 10.926 2.072 c
+10.845 2.18 10.712 2.234 10.529 2.234 c
+10.381 2.234 10.263 2.176 10.176 2.058 c
+10.088 1.947 10.032 1.808 10.014 1.631 c
+10.014 -0.368 l
+9.529 -0.368 l
+9.529 1.617 l
+9.517 2.028 9.345 2.234 9.014 2.234 c
+8.769 2.234 8.596 2.109 8.5 1.866 c
+8.5 -0.368 l
+8.015 -0.368 l
+8.015 2.616 l
+h
+12.505 -0.368 -0.499 2.984 re
+12.534 3.41 m
+12.534 3.322 12.509 3.248 12.461 3.19 c
+12.421 3.138 12.351 3.117 12.256 3.117 c
+12.168 3.117 12.098 3.138 12.05 3.19 c
+12.009 3.248 11.991 3.315 11.991 3.395 c
+11.991 3.484 12.009 3.557 12.05 3.616 c
+12.098 3.674 12.168 3.705 12.256 3.705 c
+12.351 3.705 12.421 3.674 12.461 3.616 c
+12.509 3.557 12.534 3.487 12.534 3.41 c
+13.814 3.337 m
+13.814 2.616 l
+14.269 2.616 l
+14.269 2.219 l
+13.814 2.219 l
+13.814 0.368 l
+13.814 0.25 13.832 0.162 13.872 0.103 c
+13.909 0.044 13.979 0.015 14.078 0.015 c
+14.137 0.015 14.199 0.023 14.269 0.044 c
+14.269 -0.368 l
+14.151 -0.405 14.038 -0.426 13.931 -0.426 c
+13.733 -0.426 13.582 -0.36 13.475 -0.22 c
+13.376 -0.085 13.328 0.11 13.328 0.368 c
+13.328 2.219 l
+12.873 2.219 l
+12.873 2.616 l
+13.328 2.616 l
+13.328 3.337 l
+h
+15.368 3.337 m
+15.368 2.616 l
+15.824 2.616 l
+15.824 2.219 l
+15.368 2.219 l
+15.368 0.368 l
+15.368 0.25 15.387 0.162 15.427 0.103 c
+15.464 0.044 15.534 0.015 15.632 0.015 c
+15.691 0.015 15.754 0.023 15.824 0.044 c
+15.824 -0.368 l
+15.707 -0.405 15.592 -0.426 15.485 -0.426 c
+15.287 -0.426 15.136 -0.36 15.03 -0.22 c
+14.93 -0.085 14.883 0.11 14.883 0.368 c
+14.883 2.219 l
+14.427 2.219 l
+14.427 2.616 l
+14.883 2.616 l
+14.883 3.337 l
+h
+17.345 -0.426 m
+16.97 -0.426 16.688 -0.32 16.492 -0.103 c
+16.294 0.121 16.199 0.449 16.199 0.882 c
+16.199 1.249 l
+16.199 1.691 16.291 2.036 16.478 2.294 c
+16.673 2.547 16.948 2.675 17.301 2.675 c
+17.643 2.675 17.897 2.562 18.065 2.337 c
+18.242 2.109 18.334 1.764 18.344 1.294 c
+18.344 0.985 l
+16.684 0.985 l
+16.684 0.912 l
+16.684 0.588 16.742 0.353 16.86 0.206 c
+16.977 0.066 17.147 0 17.374 0 c
+17.521 0 17.646 0.023 17.756 0.073 c
+17.864 0.133 17.966 0.22 18.065 0.338 c
+18.315 0.029 l
+18.109 -0.276 17.786 -0.426 17.345 -0.426 c
+17.301 2.249 m
+17.095 2.249 16.941 2.18 16.846 2.043 c
+16.746 1.904 16.691 1.691 16.684 1.396 c
+17.86 1.396 l
+17.86 1.47 l
+17.837 1.742 17.786 1.941 17.698 2.058 c
+17.61 2.182 17.477 2.249 17.301 2.249 c
+18.653 1.264 m
+18.653 1.723 18.734 2.072 18.903 2.308 c
+19.079 2.55 19.329 2.675 19.653 2.675 c
+19.936 2.675 20.156 2.558 20.314 2.323 c
+20.314 3.865 l
+20.8 3.865 l
+20.8 -0.368 l
+20.359 -0.368 l
+20.329 -0.044 l
+20.171 -0.301 19.946 -0.426 19.653 -0.426 c
+19.337 -0.426 19.094 -0.309 18.918 -0.073 c
+18.741 0.169 18.653 0.515 18.653 0.956 c
+h
+19.138 0.985 m
+19.138 0.651 19.186 0.405 19.285 0.25 c
+19.381 0.092 19.543 0.015 19.771 0.015 c
+20.013 0.015 20.197 0.133 20.314 0.368 c
+20.314 1.881 l
+20.185 2.117 20.006 2.234 19.771 2.234 c
+19.543 2.234 19.381 2.153 19.285 1.999 c
+19.186 1.841 19.138 1.602 19.138 1.278 c
+h
+21.402 -0.103 m
+21.402 -0.015 21.424 0.059 21.475 0.118 c
+21.534 0.177 21.612 0.206 21.71 0.206 c
+21.818 0.206 21.895 0.177 21.946 0.118 c
+22.005 0.059 22.034 -0.015 22.034 -0.103 c
+22.034 -0.183 22.005 -0.25 21.946 -0.309 c
+21.895 -0.368 21.818 -0.397 21.71 -0.397 c
+21.612 -0.397 21.534 -0.368 21.475 -0.309 c
+21.424 -0.25 21.402 -0.183 21.402 -0.103 c
+f
+Q
+ endstream endobj 62 0 obj <</BBox[736.166 273.506 765.648 268.067]/Group 100 0 R/Length 6993/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+q 1 0 0 1 738.7823 270.5519 cm
+0 0 m
+-0.029 -0.434 -0.154 -0.765 -0.368 -1 c
+-0.584 -1.228 -0.893 -1.338 -1.294 -1.338 c
+-1.698 -1.338 -2.022 -1.187 -2.263 -0.882 c
+-2.499 -0.57 -2.616 -0.154 -2.616 0.367 c
+-2.616 1.103 l
+-2.616 1.621 -2.495 2.032 -2.249 2.337 c
+-2.007 2.639 -1.672 2.793 -1.249 2.793 c
+-0.867 2.793 -0.57 2.675 -0.353 2.44 c
+-0.14 2.205 -0.023 1.87 0 1.44 c
+-0.515 1.44 l
+-0.536 1.771 -0.603 2.007 -0.721 2.146 c
+-0.838 2.282 -1.014 2.352 -1.249 2.352 c
+-1.525 2.352 -1.735 2.242 -1.881 2.028 c
+-2.028 1.812 -2.102 1.5 -2.102 1.087 c
+-2.102 0.353 l
+-2.102 -0.052 -2.036 -0.36 -1.897 -0.574 c
+-1.76 -0.79 -1.558 -0.897 -1.294 -0.897 c
+-1.029 -0.897 -0.846 -0.834 -0.735 -0.706 c
+-0.617 -0.58 -0.544 -0.345 -0.515 0 c
+h
+0.881 1.396 m
+1.066 1.639 1.301 1.764 1.587 1.764 c
+2.117 1.764 2.385 1.411 2.396 0.706 c
+2.396 -1.279 l
+1.911 -1.279 l
+1.911 0.676 l
+1.911 0.912 1.87 1.076 1.793 1.176 c
+1.712 1.271 1.594 1.323 1.44 1.323 c
+1.323 1.323 1.213 1.282 1.117 1.205 c
+1.018 1.124 0.941 1.018 0.881 0.881 c
+0.881 -1.279 l
+0.397 -1.279 l
+0.397 2.954 l
+0.881 2.954 l
+h
+2.837 0.353 m
+2.837 0.783 2.94 1.124 3.146 1.382 c
+3.358 1.635 3.638 1.764 3.983 1.764 c
+4.326 1.764 4.601 1.635 4.806 1.382 c
+5.02 1.135 5.134 0.801 5.145 0.382 c
+5.145 0.073 l
+5.145 -0.36 5.034 -0.702 4.821 -0.956 c
+4.615 -1.213 4.336 -1.338 3.983 -1.338 c
+3.638 -1.338 3.366 -1.216 3.16 -0.97 c
+2.955 -0.728 2.844 -0.393 2.837 0.029 c
+h
+3.322 0.073 m
+3.322 -0.243 3.381 -0.485 3.499 -0.661 c
+3.623 -0.831 3.785 -0.912 3.983 -0.912 c
+4.413 -0.912 4.638 -0.603 4.659 0.014 c
+4.659 0.353 l
+4.659 0.654 4.594 0.897 4.469 1.072 c
+4.351 1.249 4.189 1.338 3.983 1.338 c
+3.785 1.338 3.623 1.249 3.499 1.072 c
+3.381 0.897 3.322 0.654 3.322 0.353 c
+h
+5.479 0.353 m
+5.479 0.783 5.582 1.124 5.787 1.382 c
+6.001 1.635 6.28 1.764 6.626 1.764 c
+6.967 1.764 7.243 1.635 7.449 1.382 c
+7.661 1.135 7.776 0.801 7.786 0.382 c
+7.786 0.073 l
+7.786 -0.36 7.676 -0.702 7.464 -0.956 c
+7.258 -1.213 6.978 -1.338 6.626 -1.338 c
+6.28 -1.338 6.008 -1.216 5.802 -0.97 c
+5.596 -0.728 5.486 -0.393 5.479 0.029 c
+h
+5.964 0.073 m
+5.964 -0.243 6.023 -0.485 6.14 -0.661 c
+6.265 -0.831 6.427 -0.912 6.626 -0.912 c
+7.056 -0.912 7.279 -0.603 7.302 0.014 c
+7.302 0.353 l
+7.302 0.654 7.235 0.897 7.11 1.072 c
+6.993 1.249 6.832 1.338 6.626 1.338 c
+6.427 1.338 6.265 1.249 6.14 1.072 c
+6.023 0.897 5.964 0.654 5.964 0.353 c
+h
+9.668 -0.515 m
+9.668 -0.408 9.628 -0.32 9.55 -0.25 c
+9.469 -0.173 9.319 -0.085 9.095 0.014 c
+8.831 0.121 8.643 0.213 8.536 0.294 c
+8.426 0.371 8.349 0.459 8.301 0.559 c
+8.249 0.654 8.228 0.771 8.228 0.912 c
+8.228 1.153 8.316 1.356 8.492 1.514 c
+8.669 1.679 8.893 1.764 9.168 1.764 c
+9.462 1.764 9.697 1.675 9.874 1.5 c
+10.051 1.33 10.138 1.117 10.138 0.852 c
+9.654 0.852 l
+9.654 0.989 9.602 1.103 9.506 1.19 c
+9.419 1.286 9.305 1.338 9.168 1.338 c
+9.022 1.338 8.908 1.297 8.831 1.22 c
+8.75 1.151 8.713 1.051 8.713 0.926 c
+8.713 0.827 8.742 0.75 8.801 0.691 c
+8.86 0.632 8.999 0.551 9.227 0.455 c
+9.587 0.309 9.833 0.166 9.962 0.029 c
+10.098 -0.1 10.167 -0.272 10.167 -0.485 c
+10.167 -0.742 10.072 -0.948 9.889 -1.103 c
+9.712 -1.261 9.477 -1.338 9.183 -1.338 c
+8.867 -1.338 8.613 -1.249 8.419 -1.073 c
+8.232 -0.889 8.139 -0.658 8.139 -0.382 c
+8.625 -0.382 l
+8.632 -0.551 8.683 -0.684 8.771 -0.779 c
+8.867 -0.867 9.007 -0.912 9.183 -0.912 c
+9.338 -0.912 9.455 -0.879 9.536 -0.809 c
+9.624 -0.742 9.668 -0.643 9.668 -0.515 c
+11.682 -1.338 m
+11.307 -1.338 11.025 -1.231 10.83 -1.014 c
+10.631 -0.79 10.535 -0.463 10.535 -0.029 c
+10.535 0.338 l
+10.535 0.779 10.628 1.124 10.815 1.382 c
+11.009 1.635 11.285 1.764 11.638 1.764 c
+11.979 1.764 12.233 1.65 12.403 1.425 c
+12.579 1.198 12.671 0.852 12.681 0.382 c
+12.681 0.073 l
+11.021 0.073 l
+11.021 0 l
+11.021 -0.324 11.079 -0.559 11.197 -0.706 c
+11.314 -0.846 11.484 -0.912 11.711 -0.912 c
+11.858 -0.912 11.983 -0.889 12.093 -0.838 c
+12.2 -0.779 12.303 -0.691 12.403 -0.574 c
+12.652 -0.882 l
+12.446 -1.187 12.123 -1.338 11.682 -1.338 c
+11.638 1.338 m
+11.432 1.338 11.278 1.268 11.183 1.132 c
+11.083 0.992 11.028 0.779 11.021 0.484 c
+12.197 0.484 l
+12.197 0.559 l
+12.174 0.831 12.123 1.029 12.035 1.147 c
+11.946 1.271 11.814 1.338 11.638 1.338 c
+16.518 -0.426 m
+16.974 1.705 l
+17.458 1.705 l
+16.724 -1.279 l
+16.342 -1.279 l
+15.754 0.852 l
+15.181 -1.279 l
+14.798 -1.279 l
+14.063 1.705 l
+14.549 1.705 l
+15.019 -0.368 l
+15.563 1.705 l
+15.945 1.705 l
+h
+18.252 -1.279 -0.5 2.984 re
+18.282 2.499 m
+18.282 2.41 18.256 2.337 18.208 2.278 c
+18.168 2.227 18.098 2.205 18.003 2.205 c
+17.914 2.205 17.845 2.227 17.797 2.278 c
+17.756 2.337 17.738 2.404 17.738 2.484 c
+17.738 2.572 17.756 2.645 17.797 2.705 c
+17.845 2.763 17.914 2.793 18.003 2.793 c
+18.098 2.793 18.168 2.763 18.208 2.705 c
+18.256 2.645 18.282 2.576 18.282 2.499 c
+20.369 -0.515 m
+20.369 -0.408 20.328 -0.32 20.251 -0.25 c
+20.17 -0.173 20.02 -0.085 19.796 0.014 c
+19.532 0.121 19.343 0.213 19.237 0.294 c
+19.127 0.371 19.05 0.459 19.002 0.559 c
+18.95 0.654 18.929 0.771 18.929 0.912 c
+18.929 1.153 19.017 1.356 19.193 1.514 c
+19.37 1.679 19.594 1.764 19.869 1.764 c
+20.164 1.764 20.399 1.675 20.575 1.5 c
+20.751 1.33 20.839 1.117 20.839 0.852 c
+20.355 0.852 l
+20.355 0.989 20.303 1.103 20.207 1.19 c
+20.12 1.286 20.006 1.338 19.869 1.338 c
+19.723 1.338 19.609 1.297 19.532 1.22 c
+19.451 1.151 19.414 1.051 19.414 0.926 c
+19.414 0.827 19.443 0.75 19.502 0.691 c
+19.561 0.632 19.7 0.551 19.929 0.455 c
+20.288 0.309 20.534 0.166 20.663 0.029 c
+20.799 -0.1 20.869 -0.272 20.869 -0.485 c
+20.869 -0.742 20.773 -0.948 20.59 -1.103 c
+20.413 -1.261 20.178 -1.338 19.884 -1.338 c
+19.568 -1.338 19.314 -1.249 19.12 -1.073 c
+18.932 -0.889 18.84 -0.658 18.84 -0.382 c
+19.326 -0.382 l
+19.333 -0.551 19.384 -0.684 19.472 -0.779 c
+19.568 -0.867 19.708 -0.912 19.884 -0.912 c
+20.039 -0.912 20.156 -0.879 20.237 -0.809 c
+20.325 -0.742 20.369 -0.643 20.369 -0.515 c
+22.383 -1.338 m
+22.008 -1.338 21.725 -1.231 21.531 -1.014 c
+21.332 -0.79 21.236 -0.463 21.236 -0.029 c
+21.236 0.338 l
+21.236 0.779 21.328 1.124 21.516 1.382 c
+21.71 1.635 21.986 1.764 22.339 1.764 c
+22.68 1.764 22.934 1.65 23.103 1.425 c
+23.28 1.198 23.372 0.852 23.382 0.382 c
+23.382 0.073 l
+21.722 0.073 l
+21.722 0 l
+21.722 -0.324 21.78 -0.559 21.898 -0.706 c
+22.015 -0.846 22.185 -0.912 22.412 -0.912 c
+22.559 -0.912 22.684 -0.889 22.794 -0.838 c
+22.901 -0.779 23.004 -0.691 23.103 -0.574 c
+23.353 -0.882 l
+23.147 -1.187 22.824 -1.338 22.383 -1.338 c
+22.339 1.338 m
+22.133 1.338 21.978 1.268 21.883 1.132 c
+21.784 0.992 21.729 0.779 21.722 0.484 c
+22.898 0.484 l
+22.898 0.559 l
+22.875 0.831 22.824 1.029 22.736 1.147 c
+22.647 1.271 22.516 1.338 22.339 1.338 c
+24.323 -1.279 -0.5 4.233 re
+25.808 -0.47 m
+26.352 1.705 l
+26.866 1.705 l
+25.896 -1.706 l
+25.826 -1.959 25.724 -2.15 25.587 -2.278 c
+25.448 -2.415 25.297 -2.484 25.132 -2.484 c
+25.062 -2.484 24.978 -2.469 24.882 -2.44 c
+24.882 -2.028 l
+24.984 -2.043 l
+25.121 -2.043 25.227 -2.007 25.308 -1.941 c
+25.396 -1.87 25.462 -1.753 25.514 -1.588 c
+25.602 -1.249 l
+24.735 1.705 l
+25.264 1.705 l
+h
+f
+Q
+ endstream endobj 100 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 12 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 99 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 98 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 97 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 96 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 95 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 94 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 91 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 93 0 obj <</AntiAlias false/ColorSpace 92 0 R/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 101 0 R/ShadingType 2>> endobj 92 0 obj [/Separation/Black/DeviceCMYK<</C0[0.0 0.0 0.0 0.0]/C1[0.0 0.0 0.0 1.0]/Domain[0 1]/FunctionType 2/N 1.0/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>] endobj 101 0 obj <</Bounds[0.25 0.75]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[102 0 R 102 0 R 102 0 R]>> endobj 102 0 obj <</C0[0.0]/C1[0.0]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 90 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 89 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 88 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 87 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 86 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 85 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 84 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 83 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 82 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 81 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 80 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 79 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 78 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 77 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 76 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 75 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 74 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 73 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 72 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 71 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 70 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 69 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 68 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 67 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 66 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 65 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 63 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 64 0 obj <</AntiAlias false/ColorSpace/DeviceCMYK/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 103 0 R/ShadingType 2>> endobj 103 0 obj <</Bounds[0.5]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[104 0 R 105 0 R]>> endobj 104 0 obj <</C0[0.792969 0.800781 0.128906 0.015625]/C1[0.652344 0.660156 0.0 0.0]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 105 0 obj <</C0[0.652344 0.660156 0.0 0.0]/C1[0.0 0.0 0.0 0.0]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 22 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 106 0 R/Type/ExtGState/ca 1.0/op false>> endobj 23 0 obj <</AIS false/BM/Normal/CA 0.75/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.75/op false>> endobj 24 0 obj <</AIS false/BM/Normal/CA 0.899994/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.899994/op false>> endobj 25 0 obj <</AIS false/BM/Normal/CA 0.666672/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.666672/op false>> endobj 26 0 obj <</AIS false/BM/Normal/CA 0.669998/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.669998/op false>> endobj 27 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 107 0 R/Type/ExtGState/ca 1.0/op false>> endobj 107 0 obj <</BC 108 0 R/G 109 0 R/S/Luminosity/Type/Mask>> endobj 108 0 obj [0.0] endobj 109 0 obj <</BBox[320.12 122.007 531.709 116.418]/Group 110 0 R/Length 117/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>/XObject<</Fm0 111 0 R>>>>/Subtype/Form>>stream
+0 g
+/GS0 gs
+320.12 122.007 211.589 -5.589 re
+f
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0.709 w 4 M 1 j 1 J []0 d
+0 TL/Fm0 Do
+Q
+ endstream endobj 110 0 obj <</CS/DeviceGray/I false/K false/S/Transparency/Type/Group>> endobj 111 0 obj <</BBox[320.12 122.007 531.709 116.418]/Group 112 0 R/Length 126/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 113 0 R>>/ExtGState<</GS0 12 0 R>>/Shading<</Sh0 114 0 R>>>>/Subtype/Form>>stream
+q
+320.12 122.007 211.589 -5.589 re
+W n
+q
+0 g
+/GS0 gs
+212.3990173 0 0 139.9599457 319.7158203 119.2128906 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 112 0 obj <</CS/DeviceCMYK/I true/K false/S/Transparency/Type/Group>> endobj 114 0 obj <</AntiAlias false/ColorSpace 113 0 R/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 115 0 R/ShadingType 2>> endobj 113 0 obj [/DeviceN[/Black]/DeviceCMYK 116 0 R 117 0 R] endobj 115 0 obj <</Bounds[0.25 0.75]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[118 0 R 119 0 R 120 0 R]>> endobj 118 0 obj <</C0[1.0]/C1[0.05]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 119 0 obj <</C0[0.05]/C1[0.05]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 120 0 obj <</C0[0.05]/C1[1.0]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 116 0 obj <</Domain[0.0 1.0]/FunctionType 4/Length 267/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>stream
+{1.000000 2 1 roll 1.000000 2 1 roll 1.000000 2 1 roll 0 index 1.000000
+cvr exch sub 2 1 roll 5 -1 roll 1.000000 cvr exch sub 5 1
+roll 4 -1 roll 1.000000 cvr exch sub 4 1 roll 3 -1 roll 1.000000
+cvr exch sub 3 1 roll 2 -1 roll 1.000000 cvr exch sub 2 1
+roll pop } endstream endobj 117 0 obj <</Process 121 0 R/Subtype/NChannel>> endobj 121 0 obj <</ColorSpace/DeviceCMYK/Components[/Cyan/Magenta/Yellow/Black]>> endobj 106 0 obj <</BC 122 0 R/G 123 0 R/S/Luminosity/Type/Mask>> endobj 122 0 obj [0.0] endobj 123 0 obj <</BBox[198.027 568.502 444.988 526.485]/Group 124 0 R/Length 92/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>/XObject<</Fm0 125 0 R>>>>/Subtype/Form>>stream
+0 g
+/GS0 gs
+198.026 568.502 246.962 -42.017 re
+f
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 TL/Fm0 Do
+Q
+ endstream endobj 124 0 obj <</CS/DeviceGray/I false/K false/S/Transparency/Type/Group>> endobj 125 0 obj <</BBox[198.026 568.502 444.988 526.485]/Group 126 0 R/Length 128/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 113 0 R>>/ExtGState<</GS0 12 0 R>>/Shading<</Sh0 127 0 R>>>>/Subtype/Form>>stream
+q
+198.026 568.502 246.962 -42.017 re
+W n
+q
+0 g
+/GS0 gs
+246.9619904 0 0 246.9619904 198.0263672 547.4936523 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 126 0 obj <</CS/DeviceCMYK/I true/K false/S/Transparency/Type/Group>> endobj 127 0 obj <</AntiAlias false/ColorSpace 113 0 R/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 128 0 R/ShadingType 2>> endobj 128 0 obj <</Bounds[0.5]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[129 0 R 130 0 R]>> endobj 129 0 obj <</C0[0.0]/C1[0.643137]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 130 0 obj <</C0[0.643137]/C1[0.682759]/Domain[0.0 1.0]/FunctionType 2/N 1.0>> endobj 5 0 obj <</Intent 131 0 R/Name(Layer 1)/Type/OCG/Usage 132 0 R>> endobj 131 0 obj [/View/Design] endobj 132 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 20.1)/Subtype/Artwork>>>> endobj 11 0 obj <</LastModified(D:20161031172420Z)/Private 133 0 R>> endobj 133 0 obj <</AIMetaData 134 0 R/AIPDFPrivateData1 135 0 R/AIPDFPrivateData10 136 0 R/AIPDFPrivateData100 137 0 R/AIPDFPrivateData101 138 0 R/AIPDFPrivateData102 139 0 R/AIPDFPrivateData103 140 0 R/AIPDFPrivateData104 141 0 R/AIPDFPrivateData105 142 0 R/AIPDFPrivateData106 143 0 R/AIPDFPrivateData107 144 0 R/AIPDFPrivateData108 145 0 R/AIPDFPrivateData109 146 0 R/AIPDFPrivateData11 147 0 R/AIPDFPrivateData110 148 0 R/AIPDFPrivateData111 149 0 R/AIPDFPrivateData112 150 0 R/AIPDFPrivateData113 151 0 R/AIPDFPrivateData114 152 0 R/AIPDFPrivateData115 153 0 R/AIPDFPrivateData116 154 0 R/AIPDFPrivateData117 155 0 R/AIPDFPrivateData118 156 0 R/AIPDFPrivateData119 157 0 R/AIPDFPrivateData12 158 0 R/AIPDFPrivateData120 159 0 R/AIPDFPrivateData121 160 0 R/AIPDFPrivateData122 161 0 R/AIPDFPrivateData123 162 0 R/AIPDFPrivateData124 163 0 R/AIPDFPrivateData125 164 0 R/AIPDFPrivateData126 165 0 R/AIPDFPrivateData127 166 0 R/AIPDFPrivateData128 167 0 R/AIPDFPrivateData129 168 0 R/AIPDFPrivateData13 169 0 R/AIPDFPrivateData130 170 0 R/AIPDFPrivateData131 171 0 R/AIPDFPrivateData132 172 0 R/AIPDFPrivateData133 173 0 R/AIPDFPrivateData134 174 0 R/AIPDFPrivateData135 175 0 R/AIPDFPrivateData136 176 0 R/AIPDFPrivateData137 177 0 R/AIPDFPrivateData138 178 0 R/AIPDFPrivateData139 179 0 R/AIPDFPrivateData14 180 0 R/AIPDFPrivateData140 181 0 R/AIPDFPrivateData141 182 0 R/AIPDFPrivateData142 183 0 R/AIPDFPrivateData143 184 0 R/AIPDFPrivateData144 185 0 R/AIPDFPrivateData145 186 0 R/AIPDFPrivateData146 187 0 R/AIPDFPrivateData147 188 0 R/AIPDFPrivateData148 189 0 R/AIPDFPrivateData149 190 0 R/AIPDFPrivateData15 191 0 R/AIPDFPrivateData150 192 0 R/AIPDFPrivateData151 193 0 R/AIPDFPrivateData152 194 0 R/AIPDFPrivateData153 195 0 R/AIPDFPrivateData154 196 0 R/AIPDFPrivateData155 197 0 R/AIPDFPrivateData156 198 0 R/AIPDFPrivateData157 199 0 R/AIPDFPrivateData158 200 0 R/AIPDFPrivateData159 201 0 R/AIPDFPrivateData16 202 0 R/AIPDFPrivateData160 203 0 R/AIPDFPrivateData17 204 0 R/AIPDFPrivateData18 205 0 R/AIPDFPrivateData19 206 0 R/AIPDFPrivateData2 207 0 R/AIPDFPrivateData20 208 0 R/AIPDFPrivateData21 209 0 R/AIPDFPrivateData22 210 0 R/AIPDFPrivateData23 211 0 R/AIPDFPrivateData24 212 0 R/AIPDFPrivateData25 213 0 R/AIPDFPrivateData26 214 0 R/AIPDFPrivateData27 215 0 R/AIPDFPrivateData28 216 0 R/AIPDFPrivateData29 217 0 R/AIPDFPrivateData3 218 0 R/AIPDFPrivateData30 219 0 R/AIPDFPrivateData31 220 0 R/AIPDFPrivateData32 221 0 R/AIPDFPrivateData33 222 0 R/AIPDFPrivateData34 223 0 R/AIPDFPrivateData35 224 0 R/AIPDFPrivateData36 225 0 R/AIPDFPrivateData37 226 0 R/AIPDFPrivateData38 227 0 R/AIPDFPrivateData39 228 0 R/AIPDFPrivateData4 229 0 R/AIPDFPrivateData40 230 0 R/AIPDFPrivateData41 231 0 R/AIPDFPrivateData42 232 0 R/AIPDFPrivateData43 233 0 R/AIPDFPrivateData44 234 0 R/AIPDFPrivateData45 235 0 R/AIPDFPrivateData46 236 0 R/AIPDFPrivateData47 237 0 R/AIPDFPrivateData48 238 0 R/AIPDFPrivateData49 239 0 R/AIPDFPrivateData5 240 0 R/AIPDFPrivateData50 241 0 R/AIPDFPrivateData51 242 0 R/AIPDFPrivateData52 243 0 R/AIPDFPrivateData53 244 0 R/AIPDFPrivateData54 245 0 R/AIPDFPrivateData55 246 0 R/AIPDFPrivateData56 247 0 R/AIPDFPrivateData57 248 0 R/AIPDFPrivateData58 249 0 R/AIPDFPrivateData59 250 0 R/AIPDFPrivateData6 251 0 R/AIPDFPrivateData60 252 0 R/AIPDFPrivateData61 253 0 R/AIPDFPrivateData62 254 0 R/AIPDFPrivateData63 255 0 R/AIPDFPrivateData64 256 0 R/AIPDFPrivateData65 257 0 R/AIPDFPrivateData66 258 0 R/AIPDFPrivateData67 259 0 R/AIPDFPrivateData68 260 0 R/AIPDFPrivateData69 261 0 R/AIPDFPrivateData7 262 0 R/AIPDFPrivateData70 263 0 R/AIPDFPrivateData71 264 0 R/AIPDFPrivateData72 265 0 R/AIPDFPrivateData73 266 0 R/AIPDFPrivateData74 267 0 R/AIPDFPrivateData75 268 0 R/AIPDFPrivateData76 269 0 R/AIPDFPrivateData77 270 0 R/AIPDFPrivateData78 271 0 R/AIPDFPrivateData79 272 0 R/AIPDFPrivateData8 273 0 R/AIPDFPrivateData80 274 0 R/AIPDFPrivateData81 275 0 R/AIPDFPrivateData82 276 0 R/AIPDFPrivateData83 277 0 R/AIPDFPrivateData84 278 0 R/AIPDFPrivateData85 279 0 R/AIPDFPrivateData86 280 0 R/AIPDFPrivateData87 281 0 R/AIPDFPrivateData88 282 0 R/AIPDFPrivateData89 283 0 R/AIPDFPrivateData9 284 0 R/AIPDFPrivateData90 285 0 R/AIPDFPrivateData91 286 0 R/AIPDFPrivateData92 287 0 R/AIPDFPrivateData93 288 0 R/AIPDFPrivateData94 289 0 R/AIPDFPrivateData95 290 0 R/AIPDFPrivateData96 291 0 R/AIPDFPrivateData97 292 0 R/AIPDFPrivateData98 293 0 R/AIPDFPrivateData99 294 0 R/ContainerVersion 11/CreatorVersion 20/NumBlock 160/RoundtripVersion 20>> endobj 134 0 obj <</Length 1246>>stream
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 20.1.0 %%For: (David Fran\615a) () %%Title: (Untitled-2) %%CreationDate: 31/10/2016 17:24 %%Canvassize: 16383 %%BoundingBox: -9 -621 1763 9 %%HiResBoundingBox: -9 -621 1762.47226464325 9 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 174 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: 0 -612 792 0 %AI3_TemplateBox: 396.5 -306.5 396.5 -306.5 %AI3_TileBox: 0 -612 792 0 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -280.375731213439 535.367481625915 0.6667 2125 1336 18 0 0 93 55 0 0 0 1 1 0 1 1 0 0 %AI17_Alternate_Content %AI9_OpenToView: -280.375731213439 535.367481625915 0.6667 2125 1336 18 0 0 93 55 0 0 0 1 1 0 1 1 0 0 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 135 0 obj <</Length 12281>>stream
+%%BoundingBox: -9 -621 1763 9 %%HiResBoundingBox: -9 -621 1762.47226464325 9 %AI7_Thumbnail: 128 48 8 %%BeginData: 12140 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45534D534D534D534D534D534D534D534D534D534D534D534D534D53 %4D534D534D534D534D534D534D534D534D534D534D534D534D534D534D53 %287EFD0AFF7D4D4D534D534D534D534D534D534D534D534D534D534D534D %534D534D534D534D534D534D534D534D534D534D534D534D534D534D534D %534D534D2853284D2853284D2853284D2853284D2853284D2853284D2853 %284D2853284D2853284D2853284D2853284D2853284D2853284D2853284D %284D77FD0AFF7E284D2853284D2853284D2853284D2853284D2853284D28 %53284D2853284D2853284D2853284D2853284D2853284D2853284D285328 %4D2853284D5328534D5328534D5328534D5328534D5328534D5328534D53 %28534D5328534D5328534D5328534D5328534D5328534D5328534D532853 %4D53287EFD0AFF77534D5328534D5328534D5328534D5328534D5328534D %5328534D5328534D5328534D5328534D5328534D5328534D5328534D5328 %534D5328534D284D284D284D2853284D2853284D2853284D2853284D2853 %284D2853284D2853284D2853284D2853284D2853284D2853284D2853284D %2853282953FD0AFF7E2853284D2853284D2853284D2853284D2853284D28 %53284D2853284D2853284D2853284D284D284D2853284D284D284D284D28 %4D284D284D2853534D534C5329774C534D534D534D534D534D534D534D53 %4D534D534D534D534D534C534D534D534D534D534D534D534D534D534D53 %4D534D53287EFD0AFF77534D5329534C5328534D534D534D534D534D534D %534D534D534D534D534D534D534D534D534D534D534D5328534D534D534D %534D5353534D534D284D28994C296F9A284D2853284D284D284D2853284D %2853284D2853284D2853284D2853284D2853284D2853284D2853284D2853 %284D2853284D77FD0AFF7E285393766F9A29534D534D4D2853284D285328 %53285328532853284D2853284D2853284D287E7D7E537E7D7E7D7E7D7D53 %A253A277A27E532853532977939A709A93537E7E777E537E53534D532853 %4D5328534D5328534D5328534D5328534D534C534D534D534D5328534D53 %28534D532853287EFD0AFF7D4D4CC299BB997EA87E7EA84D5328534D5328 %534D534D534D5328534D534D534D5328534D537EA87D5377A27EA27EA853 %53A27EA87E7E7E535328282976C193B599C14CA97E7E7D7EA8A84C4D284D %2853284D2853284D2853284D2853284D2853284D2853284D2853284D2853 %284D2853284D284D77FD0AFF7E28294CBB995228534C53284D284D284D28 %4D284D284D284D284D2853284D2853284D284D285328532853284D4D5328 %53285328534D53284D284D534D539AC1BBC1765353774D7E537753534D53 %28534D5328534D5328534D534C534D534D534D534D534D534C534D532853 %4D534D534D534D53287EFD0AFF7E77537E7D7E537E777E537E777E777E77 %7E777E777E777E777E777E777E777E777E777E777E537E777E777E777E53 %7E777E537E777E537E777E532853284D76C25229285328532853284D2853 %28532853284D28534D532853284D285328532853284D28534C5328534D53 %4C534D534C534D4D284D77FD0DFF7EA87EA87EA87EA87EA9A8A8A8A9A8A9 %A2FFA8A87EA87EA8A8A9A8A8A8A9A8A8A8A9A8FFA8A87EA8A2A9A8A8A2A9 %A8A9A8A9A8A8A2FFFFFF53285329534C534D537D7E7E77537E7E7E777E77 %777E7E7D7E777E535328534D5328534D5328534D534C534D534C534D5328 %534D534D534D53287EFD0DFF532853284D284D537E7EA97EA27EA2A87E7E %7E284D285377A8A2A97EA8A2A87EA97EA2A853284D297E7DA27E7E7DA2A8 %A97EA2A87E7EFFFF284D284D284D284D28A27D7E4D7D77A87E7E7D7753A8 %7D7E7D7E5353284D284D284D284D284D284D284D284D284D284D284D284D %284D284D282953FD0DFF7D7E7DA27D7E7EA8A2A87EA87EA87EA87ECB7E7E %7DA27EA87EA87EA87EA87EA8A2A87EFFA8A87EA87EA87EA8A2A87EA8A2A8 %7EA87EA9FFFF534D534D534D534D5353775353537753775377FD0753774D %534D534D534D534D534D534D534D534D534D534D534D534D534D534D5328 %7EFD0DFFFD057D52FFCFFFA8FFA8FFA8FFA8FFFFA87D7DCFFD0BFFA8FFFF %FFA9FD0AFFA87DA87EA9FFFFFFA8A9A8A9A8A9A8A9A8A8A2A9A8A87EA8A2 %A87EA9A8A8A8A9A8A8A8A9A8A8A2A9A8A8A2A9A2A8A8A9A8A9A8A9A8A9A8 %A9A8A8A2A9A8A8A2A9A8A9A8FD0DFFA852527D527D537D7D7D527D52527D %7D7DFD0FFF7D5253FFA87753A8FD08FF5377537777FD05FFA84C5353534D %5353777DA27EA87EA87EA27EA953534D5353534D777DA27EA27E7E7EA8A2 %A94D5353534D53537777A27EA87E7E7EA27DFD10FFA27DA27D7D7DA853A8 %7D7DA8FFFFFFCFFFFFA87DA8FD057DA8FD09FFCB7EA27EFD08FFA87D7E7D %CBFD05FF7E534D5353534D5353A27DA87EA27E7E7EA2A25353534D534D53 %537E7E7E7DA27D7E7EA87E534D5353534D53537E7DA27EA27DA27E7EA8FD %0FFFA87D527D527DFD05527D777D537D7DFFA852527D527D527D527D527D %5253527752FFFFCB7EA87DA8A2FFA87E7EA877A8A8FD07FFA87DA87DA87D %A8A2A87EA87D7EA8FFCBFFA9FF7DA87DFD07FFA9FFCBFFA8FFFFA8527D52 %7D5253537D525253524C7D537752FD10FFA8537D7DFD04A8CBA8A8A2A8A8 %A8A2CBFFFFFD06A852522752275252522752FFFFA87E7EA97EA2FFFF77A8 %7EA87EFD08FFFD04A87D52527D5252527D52FD047DA8FFA8525277A8FD06 %7D52FD047DFF7DFD042752275227522728272727522752A8FD0FFF7D7D52 %5353A87DA87DA87DA87DA87DA87DFF7D7D7DA8FD067DAEFFFFFFAEFD05FF %7EA27E7E7EFFA8A9A87E7EA9FD09FFFD04A8527D537D527D527D52527DA8 %A8FFA87D525252A87DA87DA87D7D7DA87DA8A8A8525252FD07FFA9FD18FF %A8A8A87DA852522752272827522752A8FFA8FFA8FFA852527D527D527D53 %7D527DFD05FFA8A8FFA2A9FFFFA2A27EA9FD07FFA8A853527753527D527D %FD05527D7DFFA8A27DA87D527DA87DA87DA87DA87DA87DA8A8FD087DFFFF %FFA8FFFFFFA8FD11FF7D7D7DA8A8FFCFFD0AA8FF7D7D7DA87D7D7DA87DA8 %7DA87DA87DA87DFFFFFFA8FF7EA9A8FFA8FFA8FFA9FFA8A27EA9FD06FF7D %527D5277527D52777DA87DA87D7DA8FFA8FFA8A8527D527D7DA87D7D7DA8 %7D7DA8A87D7D7DA87D7D527D7D7E7DA2FD047DA8FD11FFA8FD047DA87DA8 %7DA87DA87DA87DA8FFFFA8FFA8FFA8FFFFFF7DA87DA87DA87DA8FD09FFA9 %A8A9FD04FFA8A9A9FD04FFA8FD067DA87D7D7DFD06A8FFA8FD07527DA87D %A8A2A87DA87DFF7D27274C2752272727FD087DFD11FFA8A8527DA8A87DA8 %7DA87DA87DA87DA87DFFA8FFA9FFA8FFA8CBA87D7D7D777D7D7D77FD07FF %A87D7D7E77A2A8A8A8FD10FF7DA87D7D527D7D7DA8FF527D527D7D7D52A2 %FD087DA8FF7DFD07A8FD19FFA87D5352FD08A8CFFD04A8FF772853284D28 %53537E7EA27E7E7EA27E7EA8FFFFFFA8A87EA97EFFA9FFA9FFA8FFCBFD06 %FFA87E777E7D7E777E7EA87EA97EA87EA8A2A8A8A87D5252A85253FD09A8 %FF7D5227FD04527752522752275227522752A8FD11FF777D527D5253527D %527D527D525352FF7E77537E5377537E7EA87EA87EA27EA87EA9FFFFFFA8 %53777DFD05FF777EA2537EFD05FFA228534D532853537E7EA27E7E77A27E %7E53FFFFA8527D527D527D527D777D777D5253A8A8275252532752287D52 %7D5252527D525252FD10FF534D5377A27EA27EA27EA27EA87EA27EA2A8A8 %7DA87DA87DA87DA87D7D7DFD09FFA9CBA8CBFFFFA8A9A8A87EA877A9FD05 %FFA87E7DA87DA87EFD04A8A9A8A8A8A9A8A9A87D527D52A2AEFFA8FFA8FF %A8FFA8FFA8FFA87E7DA27EA27DA2A8FFA8FFCBFFA8FFA9FD11FF537E77A2 %7EA9A2A87EA9A2A87EA87EA87ECB7DFD0B527D7D527D7DFD05FFA2A9A8CB %A8FFA8CBA8FFA87DA8FD05FFCBFD047D777D52FFFFFFA8FFA8FFA8FD04FF %A87D7752525277527DFD06527DA94D534DFD04537E7E7E7D7E7E7E7DA277 %FD10FFA87D7DA2A87DFD0DFF7D5227FD055227524C5252522752FD04FFA8 %7EA8A2FD05A8A9FFFF7DA2FD05FFA87E2752274C2752FD052728272727A8 %FFA8A8A85227FD075277525252A8A87753775377537E7EA87EA87EA97EA8 %7E7EA8FD0FFFA8A87D5252527DA27D7D777D527D527D7DFFFD047D777D52 %7DA8FFA8FFA8FFA8FFA8FFFF7E53A8A8A97EA87DA27D7EA8FFA87E7EFD05 %FFA827522752525227525252275228522752A8FF7D7D7DA87DFFA8FD0BFF %A8A87DA8A8FD1CFFA8A8A8FD047D537D7DA8A8A87DA87EA8FFFFA852527D %5253527D527D7D7D527D77A8FFFF7EA2A2FD04FFA87EA8A8FD0AFFFD05A8 %A9A8A8A8FFA8A8A8A9A85227A8FD04FFA8FF7D52527D5252527D527D527D %A877525352FD077D77FD047DA8FD10FF7DA8527D7D7D52527DA87DA8A8A8 %A2A8A8FFFFFF7DA87DA87DA87D5227522752522752FD07FFA8A97DFD0DFF %A8FD047D527D7DFD05FFCFFD05FF7D7D52A8FFFFA8FFA8FFA8FFFFFFA8FF %FFFF527D5277527D7DA27DA87DA87DA87DA8A8FD11FFA87D537D7DA87DA8 %7D7D7DA87DA87DA8FD1AFF7EA8FD0DFFA8FF7D525277525352525253527D %525352FFFF7D4CFD09524C52272827A2A8A87DA87D7DFD04A87DA87DA87D %A87DA8FD10FF777D527D527DFD0BA8FFA8A8A2A9A8A9A8CBA8A9A8CBA8A9 %A8FFA8FF5377537E7DA27E7E7D7E7D7E7D7E7D7E77A8FD04FFA853785377 %53775353537E7EA27EA27D7E7EFF7DA87D7DA8FD07FFA8A87DA8A8FFA8FF %A8FFFFFF52FD067DA87D7DA2FD10FFA8527D527D5252527D527D527D527D %527DA97853787EA2A8FFCBFFA9FFA9FFA8FFA9FFFF7729777DA8A8A87DA8 %A8A8A2A87E7E7EA27EFD04FF7E4D28534D532853285353A27EA2FD047EA8 %A87D5227FD097D7E7D7DA8A87D5252527D527D7DA8A8FFA8A8A8FFA8FD11 %FF7D7D527DFD04527DFFA8A8A8FFA8A8A8FF537D53A27EA27EA87EA87EA8 %7EA2A2FFFFFFA8FFA9FFA8CBA8FFA8FFA9FFA8FFA8FFA8FD05FFA87DA852 %7DA8FFA8FFA8CBA8CBA8A9A8CBA8FFA8A8527D527D527D527D7D7D527D52 %537DFFFD057DA27D7D525228524C5252527DFD11FFA8FFFF7D527D52FD04 %7DA8537D777DA953537E7EA87EA27EA87E7E7EA2A8FFA9FD07FFA8FF7E7E %7DA8FD0BFF7D28527D52A8A8FFA8FFA8FFA8FFA8FFA8FFA87D7DA8FD06FF %A8A9FD05A8CBA8A8A2A87DA87DA8FFFF7D7D7DA87D7D7DA8FD10FF7D7D52 %A87D7D527D52A8A8FFA8FFA8FFA8A94D7E537E7EA87EA87DA87EA8A8FD05 %FF7DA87EA87E7EA8A8777E7D7EFFFF7EA2FD06FFA8277D7DA8FFFFA8FFCA %FFA8FFCAFFA8FFFFFFA8FFA8FFCBFFFFFFA8FD077DA8FF775328FD0452A8 %7DA87DA87DFD04A8FD11FFA87D537D527D7D7D52FD047DA87DA8A9FFA9FF %A9FFFFFFCBFFFFFFFD057EA87E7EFD04FFA8FFA9FFA8FFA8FFFFA9A2A8A8 %FD04FFA87DA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA87D7D7D527DFD0CA8 %FFA87D7D537D7D7D527D527D527D2827007DFD10FFA9FFFD06A8A2A87DA8 %7D7D7DA8A8FD0DFF7E7E7D7753A87EFFFFFFA9FD0BFFA8A8FD05FF527D7D %7D777D777D7DA87D7D52FD047DFFFFFF52525253FD07527D52537DFF7DA8 %7DCBA8A8FD08FFA8A8A8FD13FFA8A9A8A9A8A9A8A27D7E77787EA9A8CBA8 %A8A8CBA8FFFFFFA9FD05FFA8CBA8CBA2A9A8FFA9FFA8FFA8A97EA9A8A2A8 %FFA8FD04FF7DFD10277DA87D527D53A8A8FFA8FFA8FFA8FFA8FFA8FFA852 %275252522777527D527D777D7DA27DA8FD13FF7E4C53537D537E7EA27DA2 %7D7E535353A8A27E77A2A8FD09FF7D7753A8A8FFA8FFA87EA8FFCBA87D7E %7EFFA8A9FD04FFA827527DA87DA87DA87DA8A8A87DA87D7DA8FD06FFFD05 %7D527D7D7D527DA8FFFD08A8A1A8A8A8FD0452A8FD14FFA2777E7EA87EA8 %7EA27E7E77A8A8FD11FFA9FFFFA97EA27DA2A8FD05FFA8CB7EA8FFFFFFA2 %A9A8A87DCBA8CBA8FFA9FFA8FFA8FFA8FFA8A9A2A9A8A8A2A9A8A9A8A9A2 %A8A2A9A8A8A8A9A8A9A8A9A8A9A8A9A8A9A8A9A8A87DA27DA8A8A9A8FD0B %FFA2A8A8CBA8A97EA8A2A87EA27E7E537E77A27ECBA8A8A8A9A8A8A2A9A8 %A8A2A9A8A8A2A9A8A9A8A97EA87D7E7DA9A8A9A8A8A8A9A87E7EA9A8A84D %287EA87E7EA27D7E7DA877777EA27EA27EA2774D2853284D2853284D2853 %284D2853284D2853284D2853284D2853284D2853295328537753287EFD0A %FF774D28A2777E7E7E777E7EA853A27EA27DA87E7E4D4D284D2853284D28 %53284D2853284D2853284D28534D532853284D2853284D28534D4D285328 %284D2853284D2853284D285328532853284D2853284D2853284D2853284D %2853284D2853284D2853284D2853284D2853284D2853284D2853282953FD %0AFF7E2853284D2853284D2853284D285328532853284D2853284D285328 %4D2853284D2853284D2853284D2853284D2853284D2853284D2853284D28 %53534D534D534D534D534D534D5328534D534D534D534D534D534D534D53 %4D534D534D534D534D534D534D534D534D534D534D534D534D534D53287E %FD0AFF77534D534D534D534D534D534D534D5328534D534D534D534D534D %534D534D534D534D534D534D534D534D534D534D534D534D534D534D534D %534D284D2853284D2853284D2853284D2853284D2853284D2853284D2853 %284D2853284D2853284D2853284D2853284D2853284D2853284D2853284D %77FD0AFF7E2853284D2853284D2853284D2853284D2853284D2853284D28 %53284D2853284D2853284D2853284D2853284D2853284D2853284D285328 %4D285353284D2853284D2853284D2853284D2853284D2853284D2853284D %2853284D2853284D2853284D2853284D2853284D2853284D2853284D2853 %287EFD0AFF7729284D284D284D284D284D284D284D284D284D284D284D28 %4D284D284D284D284D284D284D284D284D284D284D284D284D284D284D28 %4D284D28537E777E537E777E537E777E537E777E537E777E537E777E537E %777E537E777E537E777E537E777E537E777E537E777E537E777E537E777E %537E7EFD0AFFA87D7E7DA27E7E7DA27E7E7DA27E7E7DA27E7E7DA27E7E7D %A27E7E7DA27E7E7DA27E7E7DA27E7E7DA27E7E7DA27E7E7DA27E7E7DA27E %7E7DA27E7E %%EndData endstream endobj 136 0 obj <</Filter[/FlateDecode]/Length 29427>>stream
+HKf W=I$둌x Y@Z
+b
+5]DŽZ}.xㄊo$"1#
+@z1Utr:Ģ'guD|cTv߸MҍJڛp ^^o8YLPa1xyh75+@̾.HC'׏㏿yO_)ݿ|_oÇ_>~/ϟ@?gwrMyƾhj0Ǟ*a9kQ9I/ c ijE
+Ր04q؟o9yꐨ=$V
+Hɺ
+mz"[cի/-T.83u+EB0xח=Pe9,+znQv%yH{ ,H[/ tm!25 GɅ\ K6ۯsoǙ2>d%Lb6"ԓj "E˄P?B@C(+dl
+@ޖ
+1 ) K"ė-{BCkQ
+2%wƔ1{/Ԕ(<d i"CAOL1g}* BGC|BddSH(?_Ns2e'KT&A=d`L ;A%"-3JP2W6^avtEhb=mjQ"iKW6vtLf^οbtpK>{њHn}0D SC UA. Bd TjL԰_DP !?)1d4w!B](/-c۩'UՕ=
+QTq1J\sݞ$i&ջإ!V!h-cB[@܌e԰
+DsG !.hIT1Md2f ) lJTLzXwLOjeeSCB7?OrX(.BC]geT v1o|QtWtjS#κvS<2|U0Ҫ'֪(sG`&Fu!WW !iz8%z8T,<͂WrbSYTe 6>%[b2 ݿt rcIB!y](6(! A^HKbB/
+F/ A+J )#&P=Tߕۊle"_C=3%k*"ԉΓ&y?B7_PȮVGR)+st
+C3wk^DrT0=5+Xx[ w&%'d]O9̚LM)&CH+zx-ST9-/EH`*>Ba\Ĝą
+{RWɲB uTY#>/lyr4b}QFqB1b& DZ?]F8=;Iv_!%z|py)DB
+"DҁKwXr@*}v.;"U k0]|Hfyn}2 -,#QZ2@叵(!x(&b#i( T(RNug(+W.͖Rh|B~w5!`HK{)zuc1DVyKi,cqS٨ Gp\uS@ X5\Lx%ZȫفtA:VrEc.y-!66*m:& R``o),֚fF0 (QF䶭SֲQR=āp*\cZuc8C4<҄8bC=N.+!(~~2seuD@,L
+vj8F8s>Ü+pMTm% Y.w5P;_3\a8mOZ(7)v}}'8}WDL LuKS>-`Px`Г"@3Bq2NGyO};Ԙg7"/[
+Z\Mgp;_5 aګj.pDvjvg
+V?J<z754"ɪR\*uiCadx>8NZLFfLBm9$Y}CYZ@:òoqNJzUȨ&˖NgDL*f8K|?cBCѝBTkW4E9%3qI W{8$Q?y vٶɪ Z8C~!+z@N.2`NRK2\P>7!tE:( c=s`Xv7eFKcrXcɑĒqʥ]!*4 Ҟ篬|A$
+
+L<K4^6b PDl:3Po]aXz44é(؇vlq3ٳ)><qj" `p:ƕ#|A(SGxXG.gLz^.?4,3RGEbQG1:ˈqz}Ġa N(Q ^7LچADY"z#gL#RG6^#Q[AX( ('oYpR%8 5C"#N:/aHKd^hY'(5x׈R0$o(uG*AS o0ux<զ-G [`(eR|Fqs9?Ť+A=8ɞi<_zP?hzc'R8g}Qt+vNMCǡ2tkO/Ӝ
+*7WayX܈yxc }a48X=xi tD xKvlS[lHXdǗWRxTNnUFMU .6KJrejDjqFNX&noqnqL|EB?/$٤iv):11efԎo~ V E|)2X2Da)35y:#U~JZ"bʼ;5*u}wK!-HZǢVQmƝB Za)VD 枅bW5ޝ#52i} Hw]bL4+Ρ0kQeR`.qTnZP;RLWJ2nft]迎8I8!\̌!ˌ89J9c-jw0ˡzG'{xQ UuBU>P3bw5ddr-Exdi9!;&*>ubN6t#zTt-O3`ZכL @)A>Q7GYQDYmku71NY5 7 w8 * !߈䚈{֥c&BguV;6ZC0PI۶bݮRn
+A-0R~=]t9MeE~۔(t
+
+:vNj_,sMDH͇Ҩ ömIU#l;),u]^@i|CLfBWq|WxB@4#~3%3@Xvgޮ[ #SGPTC Sb"t f_(aٴi pChI%vm@ -u`P=b Wbb^gK1r
+uLqMbb6YfZ#t  &=X!|Pm]?.Ltw; ,o2T9>%q9OM{;b|cNNDNփx}ً eJ\ݣs|(㈉9 N#vp-睏gbUXAG|hNSC q/x>T{>[AMA8T|5%a̍K;
+.3/߼ͻ÷~>=M ݵ˿|x>>7oG~F Ǜo_waG) =ndCߘ͠z)y.S#wy0vX"|g,P?<(6H0ߎVѪqN_m[ic'|̂ռ@qMEqPLw"F NU~iQ-]rH>na-+٤g1_X+˺tV-z"o]Dy
+:-L1 ⇖\}3=&[af4ζwҲ8/q1"[=S, m;u2pW8lHs{'BriPֹNmbzgm̴~:)ʌ򑩮8ٲ ([FKg}™:avg2.D !UiRlqSnι7'P+8Y7
+S=lmֺÝ2 N2k mu-K@+Qs/bƓ֠gVxrJ"IH5 wz AN$?hN
+/Tӫ}Bp[77\g|bh՝qD[%{c9kCy81u:|=`J4w 9Nނ ,d$Q4Vm(
+"4>"lh5k v"mAr3]Sgd{_3hC[5UmAK77@5J1tj&oh秞3_nChcgAWjiәGڄ<oŤw.Yjެ
+r}|Vʷ9 VT&FtawgSǫ1X=Cjk:~9 3A ,/aI(@Z';Tc7W<-SJ{ap^u (ԡ75k-l{"gLn_saj9*~N6H]K* DӾ6?Gl Ǻ
+1h2dqBIn#C/;zԲ.92ͯ@`(&f A yANd&wPD> )I˯1=(Vf,v\5%C'Ԏ*G/s Anq̺a\(
+ 2ݹ9NƇZ&?4=m y, pڽT0Nmz{BW(8XGZyB&{QT|N"%ɓ *X3O ",!
+K<(vqn"D-%;u6
+j42ai_{
+Ӱ%iH+abFcs/ ' O2P4}!:3^
+P]6lw=Vt]H=K{GPjhxF5],tϐ18:
+³pcAј U1B[z|k~":]7ΕgЕi-R5^~YoC1<"8H.p ~m4TCOK +P̟; $?Kq~8r7rl9/q
+Yh5'RF e5EqwwYOf3ڄZjb4=V7Y߈
+6qe
+ˤG<
+%n"Lq,C IJ ~2Z b$m0^N<q`pqFA䍠ޭ,9I:om{BFyBb$f@(Nyh8ɃGg!PAR0Ks8qYv¿ ;nJs'/Aѭ0DV/d9moe\`; k8A^c=:q?_֑'(Z;gy ,#7
+ESEpS{Xޡى
+?NH._2w9YG)#0-TZl97_˥Ǯ~#  JaFe;Ȃ-}m'}/3>UUVA:ўړL ~&J~b<if 8r܄
+reBiX@AP-l6;(;f%kgc=4e6ƺ
+ims݀cᐾ%VP$r
+R
+=1\[:q$8P+iݛe{l=0?`\*_Ltmֽ0{ a.L`Hpf tpq:C-d<՗G_\W} ̏ &E%-i- 7Яzڝ<"*OeC>AMg5Ii D_!(bs c
+Z ueP󾤞/@ +^F>NB
+&1`,|T@TDJ;PB+4Y猥pƨ!jzQ[|3whr^|eOXd~ESc
+X R9Jɮ1^%0]& 12Ԛ:x3{Ax<<]͓YrXǾ<i{̡Km>Z(JYFK-+,X&C<B}1LfggZdg늣7c3rf=#˾H# 8Ė
+ICbhDxmx
+Q@FeۂMjeX
+(ApmӺH8؋K5 jv \f 1z嗊TOf\5!g3 8kNJCЙUY('Y8p@NÝ<M:WxG +u!<!Q76[m<. 5ӶCBVg^{EHm;RN"ўX pq@=FDfHy,HΈ y/\E@,He3em@VrҀrSjZW;X|Ҕ<`.e&eQAuQh7$R]Ɨ@4 ˜ ߈UA)tiNg{@Ox$=.8&4N2T>j[[{?lEn5@xj+W6OQ) ̌m iCH*
+?
+U$xf DFڜHD?G }f pg`
+
+;Ȝov.nN! ֤)#n{u 1
+u{fE/hSDbUu2@1E҉'|;ׇ?]yP*qY,Exxdy
+ta<|gMԸ!+Uƌ Ƞ CiΣi1dj:igĹma8MҶOUaTx4* H m"wg 5D`uK?>\E m/<φ(\w%hФ*Ҡ'~'>a[7Ft~fDEqkCmIwa
+h=-
+KJ"Ή{`. :)"`vS-}ddWw\MjM<:(T%*:}k}á^+ &xN
+,je_3#lzTCCP
+lۀ BqH)^g@2
+'bv'!V;=@k$k\Ɇ1[xsvPGc[TK
+T椢jeCeͫ;5> )F.-c| UVMc>Md s" [{'4
+lhoۄuG"28ETwY##~p "2*R'j|1zLoAe>뱱C
+]Ax`Z#F\g 66Jꃒd)[N@ygDHT`C21'3*x1VF2^q%˕ar_1b~
+iJ5E_8yy*D%QF1z_"h8TN@)&'
+5յ{BxG),M F9Li5?gaM'k,d5:B)ǞV+7U
+hNqt>ԜZ]Քu
+@T%]g,."AGDg.~l6RA09rzsW :NJ8u e+==iC 䒀-!vL Qq
+Xd`QFZ3:rNNF#T>r{(I:4!OAe &jqQwJD^hTBi]rXn̺XApV g7}CZ9f r+GiypF
+<yHLZd!+n
+/uRf`(gy"soQoLYBh8
+
+f6ed6O#P"i==2A BZ٫S{uD (!CT@ <8;G 9vOCg B]:E$E.6TȂe]"cB6D
+,}7RP\Hh]L'j䱝<N>bQn DDeQ3"O1S֠#RIF_;CD}]}bγ j-4LYP:⾳ה
+4(6<KJXa`oZdxvz:iqh^o|(ߣ(cl+w&c-pn㰆7\0+a]8PXeQY;5W!g]Fn Ѱ(o(~utnHc L]Js @ E.
+Z ~xF<X%vzDqṫ.-$
+fPEa~tM\DoA HZ.Pu$HȊ#<;kxQHzœT:01ȁ3M@P7!yA$jRb^lF$DZU=44G>]i@"ѝ,*_9Y`r *ws$]9g6jEEW=#05gdm7m[h~y2'+@\蚀~p%8N!x=ٰe($Mu'mkӘX|a|AJs2W-u7;_} rRwC)mI@/ۨxa}:"j.K=Yb9"6M5@8[o8fʎb{F $ihSi I;9fO%hw&=Fb [iDPg2gDj/Qf>*Q"Q! s FKTTr/ zf.&,|ȠG.!Hq@9tU P6~9#PUO@LӲQ6zdsB/Ҷ
+ލGOI=< h4q3
+9Fz|
+)nWO4‘O;eCFP7JCھ<]5i'6
+4ebd3(Vaaio,A!+dY{Yόs "ڒ"ԌqOۋf]R5(bSyF5N9vT7}jY'ÿ:r>xI;`X^[p:J
+6 T:b 6dd/w×~o2WU /?ӗ⿐?^Tpi4/of3R2V@"tuJP^y2湳-4"@/
+Oua 
+KѺ78F_p>@,859i"I:32
+owEG?9#?c9ZX]TENy= R>_/PB5YIV`"FP5H؆D"Q6QeTbK[t hQ9a5 x*'
+!dd:2&fLgP n#`vu[6
+e!R&k64t~p}jw@njt~fgѽVO@X\$ylN=,H2޼ۼ}iO8CYq
+ DXax9q@5ߕ
+ucl8AQth
+#*'Ɏ^cu@2ork` 7]Tg2jBw!sU@  -n Xӡ}reL#srz&+c ͏D9lJ|d|*6YlqkAJ9+{X>Zg9
+\=0APTAP؀x_08TumrdяmK; 5x+:s8[" 835﯒u@+}Hd|}~o7EO6*Mj[
+W4~;e ͞
+~1\L@M
+ HT:P
+BO3@Ҟ
+`bcef.as5*yHqXzpo$(hvK:ыŬdMOoN[{P"#]hR1gd7:{IJx=H-T1g >˱ϽwK)K rx!rF,wy
+ ;}巖k7fȊg)b99ZLk𬴓d,uLA5%xw
+lЍ-z8]Y8Jz0S@:x40l^sZLaJ/ދ6"K nx(V {js91iUT4'YykH/N 0r4i+&j+zS¦,V싮k"}Г|)9!U= v
+">HFɯB-ù`O.DZn7X$˱]p/^ѵ
+[-]a"y&j 4|ѫb' wu*0mUȗ6|ѭ4C>#7|0ޗ;8.G /;.PD NX3s;ʡ3@ 9܃N= ĮĿz*p3=8d=[Xϵ\aЌhԊr@w^z(SKOс* 'H͈s34ӥH}/=q RYkUP{ JѤLh`P`
+Y*i2^g\UNpWpJӯٲ R@]QDpƴOa@w=^<@heA.ߢe**/#k3bԌDq
+MDIv
+D1ḧ́@BE3`d4 ꃚHx(-V*J(PMmDz(5'Fl֡c Sb)Fh;#-
+ǛfR ,R\â"4u| Ȉy`̿yP 1x4i3'\ T=£@IL- z_ePwYT9.,pJ֍+*|Rȱ9"!B=1FA؜"e4
+D}Qj<R|j[P"%2&yr˼͗J5OW9֑aU-Q?@xE<>q
+c_~ȜֻbCzE\ޝe[GBC ԗc=Bai-RQA'K#FjDaz20!A
+Qe3#Ē՝s46NRAl#ۤm$ 4S4{ qipTIǜmD(HJż䴅zE=c˨-}:b8YԈF=b+HݓV#A9eFhwD.v3w'"v"ԭA1c7O-@JgDZy'A#ȓ;EcS o:AmEE!Ҟ1˘*B2v4gZw~xnb:wlU4b)6ħEā_1&C`"Hl8Iȓ}`M9o Ev7GKw<[m
+s{ I5ȞOc)b"BVQ1!4@V~;M̃j}l76o(ڻkϧHPDFgv&nEhi3Xaam 'CF
+5ap?TSP4u$BB5F
+QՠÓjX*)b%[*#]OF'*9\eQYEn9dTIr!Tb"0CD&]2?5f 9M42)VF ifCܑu#"SVto\4:4(U
+s:=qQS {z Gdzc՝ޏcUK$ b^fh_Z!()u<R&fT@
+kR>A$ҧgJRI4IS7m7uTz'U(Li@,vڡ5LLV ό幅5~CMu
+ j_UySZhQl4⪞42(li-mt՘KAU
+W4p׮9Vc$"|9XMF &i/ PS
+ő 线8+cK#D"uEcdRa<\].AҦ,TN9%ih Eg rlKNCF% 3nn+#or
+T)9O)d[(c
+1)=WZ6D" s/ Y,-1K$GGǹ^N_$_4tnz=2(nĠcH
+@[J8Ja<L#2XR%TzjWK^\ _Ssp+%Wuú5BX90t$[!2_k4"reF;69wUXi(9="G[46NcW^w)\I!WTaD4:qASQV@P9e%h6PL=EZWW:靈R
+HA\7DO; \Kb"j$~Mꗧ$WeH$1f>njV>=l6;Y\6Ds7?Q>Rh=x/&_5˽5ȼ}G)\ܺ)u ηcQUQ
+U=WFX><+Q9W)Ł4ӛrt6h_
+d Ji:KZEmeg*Th _C9x4brK&xfWt@Ry4}wލt0sG<c+G.&/4)\laj7ZHC֚([]p đng 16yDX޹" ?پruj![OFi
+do$ro}*T#{g@&0'(lEKN}y DOv351J@MbCڹ$ހ$t7 -%M͔r*m3Hh`.BN锍9x}J )m/oj1WcBA47
+#ƃŏw琅 zBNsس&dp4)s$HWn:?Sv)m] S@cX= >/ s[qG15cT]s~}Kw3o]p?Ƞ@@ l(Q$AV!T=Lb:P[M[AVOرN3Ʋ$|FE9eQn^yFZ;= n *WRs꧖wx%4[%0VrF5MSg)Lt\6%j_{^ v)W}ϑvrZoϡsg[RyWOuN#(KUBCA]V}aN?H
+>b}JL+wAE hrba.jKgp5Av…Ep"AdUpBIj;Jp^ p КXԋуnrPw9u+aRf4;6*Ń WXBW# ؃{V|:
+3+I\B8\h~ !SḶTUFCv3=bDZs0*=a$^lbM#TSۖcnA(g<Gӄp_1م-e͞Q!JL訋N~B P7<H8<O/^^B!iw+ir_GĹ L!_
+#p%tO&pd3E
+ĴImHԦ!4U(ddiܮ )~V2J@aJ`SI zS49ʞ$8K\,jO܋h oɪKV' \Dn?赳$ٚuB1-AHba{4KEr]AHdzWS-Iۤg\T8
+Kdj3n e3r,(.W/7<ԥ#aWKMj.885/7W9~N4`A\g3!xWH9=s2[KBa2v셭cW<8 j|Wx+_vW
+.VlUnܢcˤNpt(_ᱦe!Dg+LTN'}* ]Ql+ J" ;7+\ ,Fl"^@[\z piش+!AzV2
+Ԡ^1>u0O$
+Yy;@!=6[t9t
+@m>]^Ł ~`P%HN:>*ɩtW䈱nP
+|ԓto%^uIDe.II_TwIWoVx߲.lQ/+0P~YW+J@aWރt)* ><IR t]&YgZwbz\[c?u)i5RTˋ߳?=cukҽ܂N&0)ނ.%bc:.@W38ZY]V}.p`WҒt{uA ?BK"./)xQF~E2Idq5= Ҩ+N3ږnGݠif%=D]` MfuAvF{+\!mU?\sUًf[s#GϦHu̜sr8s-|4B]b.s"SPC<k.)PKdBsei"s|S̅5|fsYA%R>(=^ܘ]b.H*Dԏ8r5 7!wtNpM0iDz_<8e@`cc탸YGq]$yJwJ~X˰'Y l+Uنgi`߇UTW$2,9H) ٛڇ wGT@?@'aSWȟd1U8BH8ζR0w&hRHYef+^Z6`"EUȹRą>fI&̝d=Me8Nir*pu
+
+}̽N 7i&{gRnhSҹb;;q*?zNj #_I@=%Xm$(9&]Elذ@S#Oͪ%$",1khVF
+.I (m^SϽUy~|
+G%^
+$1a6 S` C_-RޣfCF_?/DDBOuaʇ < q8|A0Qr
+- h|@³"wO
+N#}H!FHj-S`7Ey0 szӼXaG{8O#P]G
+g
+^?}| $
+@N]Ҙ29ApS'oMRnHXqBp :d
+o0kS $<,u}x
+U,3Y=e~^z TJdX mwV䍜roBUfE@st3 ll)u3E< )Z%%t;nY*j&\hQu8}7ؚ=E_*qkdy.jDZn%b*Sw˃r@kh
+]p^VT/f6QHX%ثW_.c
+5xk͘Jor%`aٹɒ7 %ދ0kPrWs\
+Jzc8v =R2X3(9Ca./|XNz= i
+J {x:
+tɔٴ={ (z8^ HY\ᆱkX|CpF} rJ'fX W`I:q ~8xKޏz"L1d
+8lBv6o"l&!w:divjDWDyxHrmrxY~)a
+, [+(2
+Wqk:EV$PJ4*u4
+ZaL`><D "iÃ{eYa~=AViFCL"kΗ YĊg|
+v+`}t\ž> ďBY󓏾M+ޞE^_.7QҮ/<S,7bNթY~
+O(faJH9
+LtP },[a5C}"WwJ2@^]"dQI2\;g5^@NnyϚ#yp ؗ.j
+@?T'B˷/s)@UV~D;}ɝCp9?pAV(V/*9>îRcU㟶*$$ȉ\aRuEX
+םLk%3!F)5:
+&̦Ut;Lj&8ۉ#:`;
+g%<4î1N3 ߣ
+4tcGNm.D<SXrCQ'omfov& ,.@<^ʖc8
+}Bbʒ֍ޞ7wj`z̬b@D>CWG}U5' y0nL>c)s)L
+(6\ P5G#WA10z%>_N;.'maJա1KdQ'B)`lȟLrΌt<6&XXO%jlj'ω%Ȧ>c(-\ɲO[%Eru{&^뉹>U2b&8S+` ia[{)6f;8Prd{χ"dLbCQqMOBWUDٙq3.:Pw[7 a.QV&ƄJ&qo9CA!zP'1no %=}q6
+A$;o{Rz8 r-,H:(>W*K(* ՝U.FJ0߇eOQp҄lfn 5p8֍yEnR&k
+jŲ4l>Y"w`4?j M n淁"
+1a:H7{5/3Bߑ x~p̘V*Qg d<ƒ2EмA% :m19lp4M´Jg]rQAxz{@:ގ<u@6v@}+*^dbNT|*~`;)p+JMդvUŎ4lV#;pmZFQk ?Xb4BnO*w"/77jv0QԊ}MgQr>((BTXUu6Z71<F\R״( k /+yX[VƉ"*]Ewz( 6YP=*Iʛ4)*6%gڤ ^@WQ&ֹRS"*wXeG|an|mI*l5T$D[.% ~G:@#kӾ(psђ/ f~165X1ZfA@>y7X׾^m#&hI$, : :TMRvՕ30L ؝zГg +,0Tt#(8mXtZB}MF'v L* Y& -rT@ CߵcH#gayYO8T)Y
+̹[Cܟ硢(Ax;AIT04qOR)BcbX6h`>Z&l@pu#lR(2W9KV߁#5]#=bUcd}o)$eS(Ӄ5O-$±F>GA02$" V
+ K] ,ђJblpy 9LͳSD[6[Քf%JghSl;  Hqo^}0ÛST"f[P+}SNfLu~쒰&f߉(_Z%p0)y\"QH-S[q(my8*ӰOc^f JOjJ7Q2t$ We+i-<^8_%+k3b:^8rCK&OO*;䵬!?T-AܶIq,+r`s Grh62_Mk
+';P
+Sv? Nwf)uHzzdX (Hq93rƐ=?"`J.j}O~Mjo>1EŢ|d"+3?ST
+j I1j<
+\@dcZbJ M `:|)쭿-ɰWta[/Ǟ\*
+AƮuWHHꥺ
+e!jsJ Ģ( 6KBhƙlu2q![pN :|(90_Zz$tyWGyp=s7<9H.f3~c3F3ޘ*-0y߱zA7ZBAو=c8Lg9Ԫ}z0IH'[gx%9%(]( ?}'҅4᜗k>ДŤ Jr۫(!yZ$y\>l{g -"r[dtc>ݖ0hKm#SbM [@ 0LJX>+-GkvF5 f-.9F?GYiCd'v+8`|> vޢCP4o(рǖt o5Kŝko>d 1Qj7oT&ɧ\RQВUn03hMt4Z*}N75snH {
+/,K]2ʆfwoWtq<gQؑ8|C\G:@\aۀ_Wxm\죮0],6]
+v%DX&h}8_%:= Kheh05O-wn8uSk
+&AZ֥-+B I\+pHC+5t+2dsh˜ة$i,$*љƃ(1Yj."2Z}!`kAR@@{0r@?5mE
+ES7L
+f3dX`s |
+Mqi C#UdCn> 7Ӓ!+@O =4Sҵ44)9# 'ƖTP=Zͽ^vUAA4H`ӿZ
+(XtBk;'f[X:IR"6`p|o=S'y55O,@ A8u6#e >J^tP͐#vVbWhr wMڔxӑɳ ꬈UF(d0)nl5U6¸_TAd{? 2Lp*h4pM Chu:i+܄GNB1klsܭ{FeH
+P.U{]->Ң,(B4:5{bٳ<Yr{9ԑM@qu}rدm\G8Y:_ju1ڥ>.Qd%׷9H5B
+J4P3+jE
+)dBLi [:).iЉS!FAƒ"/8riS;#lл([PA7Hk[g޼aue:`uo`2@Й3G*W~Fo ka=Uطp_J
+4y]
+Aq+齶g]V,EA<n:U@܌<r0w
+"M*t=Y8tyAQ zx2vSz!v
+ )AvhDCdp0x\i+0̓wTbj ٦$ix L S< V8EVV] PQL*q V<I5"Kc)tAa)!52NS[u#VJHu*rHR%sANN*\ g+ ÃZ .yMc j5g9jңqG<ۖٚ~>0TmYx(ҵIV* e Ho)Oq~+2"Ia0"45 CM\#ڨFLjaDܐi;4J#"W8ʍM)rsl3# wk2
+(1r9,
+HDx&1QN_q؊k)کv) oq:s8)Za/! ,c'zy 56xtQpnD{)Y|F6EI6܃˵Mޟ$8z/j+"+ST1.a~!(A#OeNTeJ*{94#2\`͋c!4Im#^ezs~4 =d
+o;A b&*-):[bPOHGYȴnʒA8AH^sc|^A%VJM`G<DԲ3hBYm(>+<É둙i}
+E%i1]Z,o5%zP!}aPLG(.\E8m\&n}:ۈ;D;a2&[C#B>"l8.i*{2*|o󤼚hJq' aբI
+s9^j1P]WImt,E? #BjѺMBJT*Vridiv %a 35>h#HR@0ďsԐ|T˛} >0gdcYU1& PL )4&k:O2C' M 56m !iۺ9B<α4s qR š׊`! Ƭ鑪7c$Àne!EGn Ν#J57=MeY5$]JhonBJ;\5hl6OeQRy<6*褎3]Ep/8o]4_]DQD%pEK> !x2!n[ao)M2"B{t2IցUea--u-(e&úۤM*HЍdYfư<X\KIMՅaO%t`-ktO@7y|(&pFQPlO9/!`
+{ANɩF,(jPKXQL:7*T̲{Y+@hP}Y鶀&sqhgH̢nQ
+|OiUxtnmkh{ kF8-V53xM9]Unu"2}k] G|f^
+d/AWTm !!XDR6RwU=X?-y;OצKEz{GNzxӵwڿ/3ޝ`X[HAb.> a^R-F\T%Ĥ+-wFZ
+(,1P L^gG dԀ}pwOS&#Vz ].c(FЛ9Hj~g%z3"/
+A-_ewbLre_ A Y,^l#gX*Ɇçxyl zZg>k#AǬ2oB@3'g~w¸3r#^+~y0Yd%"!0
+Ep`>)7M(.$ڮ:QZ[q7*n2
+<W1_
+gL=/W;xqfۺ%2
+ba@{y.:Y$F.&ēxZ;t`ˤnvSJgY|%5<W}e[L]|{Vc6tiK&C!:Mf3_21ϩ9Nrd3 x2CI(lnf3P%_%e}'q<d)Nv`l#Qq
+ o }0f
+ ?'s{DQ2xKN<p|Ch`Ҭ;.r󎤜A终NI+Φch;#<&)"
+jATz:Hܑ'"c#[nAArǝKrtpI)d?%"PӢU
+ Ї#j$y78 \h9Sb}GC$ehps#/!J95M
+d)
+6]ӇBhkV F3?M{ { !+;nM[շӡ(c
+@&%լ-lݒ~@88M=sq'} a/%*a{Ւ; 
+axJЕ%VRކz)7QCOE_6ON !28ؑ
+=Զ IUtpg*J!A#0LG)hdPd+/9n8&Ô.%vyt yGSowA*eJ|16)ߙpV|J0
+է[JJmm:F&)J#eFBs%Yȸb(:MAVZr
+HKr$6DO;$o￝$ aR $ǿrK>[+%Ҳ?ÒK)x}\A 9l$o`ɟ3>քϞoL-j/1w07ĕ_nwG"=mQ.r+4juǠ[LzO%@Yz=9YŻfbjC{2%J%S2z*;BYY24<f6-<aFm#u#\6NDsֻ[*sfuiX}LO 㙪>]HB"dfs
+_4\pbN'<F(j/ "(c(<kh$6O6\nf1t}דP1kՊJ90Nik]ժ_0 s/hv⁵
+rZk*i)h҉ ўdJ*~&)aN<, Ц͉óW&yZhttx1Cih-nci96̽1T"LGH$
+Qʳ藷C 4Fq[mДF'4+ e"(p!nI3
+0PjablEwIA$FPc Pz
+}\dx*դ'Ó?_}\Ȑ ̻S+gnڱhI6xo
+%Jϕ_Ը>Zc%wċBJd)CYEvæaRv b쵏x0Tኚv aYt5웦c9?[ԴBCB#_v:ǹdh)E HhJ\Uesx^z9VnlCo[r,W, QcJqwB)9W64$BBr, 24
+FB)L}RNc%>NrCxZԓc9tiݲMصB)?3!xKXs)njO;@B)h aFk=e ݁Fxܿ9g wzK^^ȭ~QRCe,j91"!R8 bѱ,+4ò DަqZ`܇N
+Qa2hx6CWildT>eg cafkKVBL\!7̈Yf'?oy]G/u2y`DBI9)P@9mULFh4s(=˔7Ŕ!ohݲKH% Q'تlWgvG*-QcÙHehIh($DH/ms]'bGzo0=:i ́s)w4Ъ8|e+FA/TPxxfoHH-dbGhgT&hi2PdPc%sLeUnɾʙliHS* e[ ɨY7v55A0ɖ'&EDұ #vr17%uh2V֖s\tI_=2><Q3vޱ\ػf!u񲡹CA>
+{f-
+E"X_@ w
+N(,X$<Q_NYu!&@QsS!L# xqJ0IߴlγSGP@)mȜ^~*6Rج8Y]گίC*Z9dM3HIn*bjҒb?
+sz_,vsG /n{$ =9Pe6x>DG L-_~d-qtt)M@j K`OyZE%&LIh -<UH-< Q wfIf@1.$9FQ W ALtk=YH  %;hY<XCtc^@> fYΆh(}uޡԸ(ѿ Tި܎U ^e9!_I1?L`t؇2Wqjb. h)a;Y!
+$,/lv G$t֮QzT}E떥b pr\ m9DTC7 5jNe^ 8 (ȆQ;f)ڋ>6 :Ō^5oXXʅGz ( ɁԻWnQ@$*7Jَ|<z$~Nd-$3ѐ2se(a Z>2WE$ DN+bk1"U!۲s]; ,1E^)ɷ]؁,v4T>9Q^=q6CS+;6*Hw,:4&) X6^!Gm 8@v ~4]nWxA6l5ąwt- \lw!0ɹ8c69?S
+Ȓg(tȴ3!e>& g#nS҆e
+6ޜ%狙<>k+#u !ZmL|| u*/奴Ǘh9ʈ42NX
+ij>V0s8Yg@J
+$aSqղTJ/^xh
+YD&
+Q`:)1Q
+SOs p9i/m
+a( !fPT*UO֐ٱ,mu%o7jmSg;} a!M\pЭF|ȂhYNfo~S5F@z !xf6r$yH ( ňLѪ6_pyaqʫp |jj>Gt=W _@S^@#<u0dxs#
+\H3ɎeI]"Y|7P-K?CG@  ΰ8
+ HEtYo,BR6$}i
+ϥ}ݿ[ɇIBaF%Fd<8gUmc'w@9T z SϠ,LH+^a?84UOҔ峞0$}~Lah
+Q56eUa~ÏxS?Tx W,{_DRcN6M=P?b+Fܞ}wi*!ƪW>Jv{'3
+/Q\gg%%6:5~pMf)2XN^uE#1nV;Leo
+BjЌg AdKA Pgb<W TCEy( bء&Oץֳz8)xQd}#;uXN.`{eKϖ 8aV {2ۧc*5WtBD"^O_[
+d1[Ϥd A0c|~QL1V 5BW9U}hH72XsUc//&9s´Qg|bNhDk&zJﷆ2* ڧqvRz#MLtj3$HÖO ez-ĜEf?./fW}pu}Ps6oMW Ԯ?sMl8ܑ?_@;rȌǿz7\KRn51PI[;05A Snj`ja( 3zeVAe7OD̸[0
+z__,v~ y(6ZLV!t22 YJt)ۿS@3@rAu>L1N`w2f3O3OqΒ.QNk-6gި8ƇqDܭ-{] ~\+ԧrY9v 2ɒƁ t<A<:{[6um#@p=nEH:`p>T'}v$-
+C6CQױ6=S5)I}p>$ӑd!X!mjX RqNd 0rJxIwm%~Uz!b_s|=>nķYhÂmxдR<ϱ:?CYMcKs,N~az"w ܕ?<Kaw%Rz5AA4z )04䕳,7!'7p8Fft)b1c4.d_D/J{Rh"6}`|oE&u,/dP5ċ fqt_V=Ӣz}8
+VDDcPͪ-CJ]ZX0K6739 \ֻ~ 6|RM>gc2``Jeg0a6Бl-%AG/yH -v%KDqߤɲ-f[[MxHIui?.L<ݮQ2+m(*r
+>FiJdIt1wWfv
+AUh?
+
+ 2HOeaό֢rXS+*f/e7eGG!: ~z~`-o%2BaGK"45fJE7("
+Y%L m_5&RZ
+PdV}<`FqX}PS"fi҃" 8\z͜CPzX,_al(*
+PƎ0,8a_X~uҹ# H#-f.L
+lA/yXndp20HD+ߊrUxYR31Tf gQ K9R: MjXl2k)[Dū1A4}w#൓NZPz[:ö/`Q;'vr JCjQz/%4R e~2𥨹W=B0zW!')qpq&
+?(
+ )i8KXH\J0r;kw݄V @Yb>z
+rxD&rOZhњ?^N9J@ Vyg
+~e.i7i8tC6S~gYNhfޡ>8 ND>]ZX^| ]̇//Ms u[yGAWR&KϳnC,+_tLGݜ7c6ΣgD+˯8wSjP %M2;V ۻ>gscnS>ױ=SK/7'8@e)_cjM\2٬ZD)_>>$ؘ@y@yI:%DP")8ޜF㺅L| 9e~(
+(-OӚ3,Գ^SK6zuC&үN׋EC/:r{(9TO`ٺŒxx-C,Hgk} eW
+SA {f"_twF?Vى.F]%̒&A%nܣISÂ A5[ ܘ=f5
+Y1v}(1Z #PhE,}wGja!|L"I!P˵;ǒ.eVQF+&!У,,! ѶǓOh.Ix"w^,5C]~ o2-tp+
+θ2Xr C>,-!U)`zX74^
+A%EQ459o#QLR^%u`FF6b[pQ"@s;
+AA2?^ǠV 9o~A
+&(jG`_Eܑ2OƘf#y  9t:[mR*~P;bp~b*-zy1
+EP #˺Um#=Y\Hu?M&"7HXkcmߛGpvFL}4}: -Ũ͢%(N x޼ǮW]<@H|;y+__uD|#A-xOvo 3$Lw<_aȣI Z{5{ K ܠ^bFxk KsRYA1`Ѩ b0LQRq gz%\&VĽ%otdZc% pw1"m+݇;א-L*P4Kp4ia_`O$K k^Xzr0˚Nq
+SG?l~+pZ"#8ӠƇa!M x2&8ϫB2єy,F&6gW6
+mLpC t'h}`&@U)ɑN'o_P#Ü 99x<dk^~JF B8Y,)-u2KH] ,
+eGl=lxi
+9o @&E> H9K&9<3awBdrt!+Ky#$P^Ĉ98uBH:%bz:Z/Ѷs"MZ~(z3q|Y]h{vj>îCR2l7QvM^r*>
+aKɤNcE霨 qEXpW Zoio18 D2J?L\E'#ϑ=EW
+ yd|<CE@b*NGRcǁF'KAbBɱQ"H$
+}`OQBւ ;b3~P>DIVP4K{ⷴ+
+U AƐe3͠"A9 ؉90*?^ү)Ju͆ԭODt@<ۘV7dVᨵ_"?tGf56pf6һs rx>G_[L)/䀗x!N 8"/Xo3聗D9Njz V&GG-iS"di`f: J=4&-QwaP} ֊s05aZ,-3>ܗ㭉&pEr(N7 `ПcHdNA݊`Y<%01+ mIs\7=pD4ٵI|0@2M#gπVÉXmcPDNޏE2ct͛nEx2l]X*i}d
+^ } `7b=xZ4HXmWN{GN%jZCCs Vɘb\\ X<uyveqW'#w%ݼ""5D *ЀXE w>[1jAD("ƾ_q8eh|'G|_ TB,93qQ~LFaЕJ'K3"kgN-~8U ="p:&mnAxHW@Q\
+pr|wqs+
+:V[91q1%xi> N]yIr[IDO;5<3%oAe GNCmh̘loď#h9>ޑ§"`VOSz`. /OcLƷ[1ObU hG *IdQ\)7!/d
+C{o9tYU%{{)7+ ?~'ďq]I}fD})/Y˫hlpW&6VeeuK=bs67^!G|t'VUrdqC(%^^IS
+$}bg|.o檓qJ8^'jA~wJJ\S{%DPy#x- -ZAڣ(5'glLc;bhA8i ]Ta[(wh{X+VoIltU= gph,>E69^A{{)-+1t,IY: T心|4rl"RD+AE4)Ň@p||ޛ,sW[g RY23u&/v:"M+8A3ʏ
+dV\>pÈ\?x`m`].񙋬ǜ tx|] +CƜ c?W<t$2J7gMMVMsӡe4[%CJ.8,h^;%DWUV48&ZU@,sCvӁK0q'4PS}edQ^O&9cZ@ hXE`f Zl^;U48`y]vшY!KƖÓ:i'Yr~lIabF<A 킠hDkO&ySd?pP?7DJ2HLifP2dGR>b76j[%3pA*Ķ*Q7-n7C@A`4j . 4(tg^HAI;D:< M4/+UĘo O%02=n@$J4v+m̈!hv_Q%~gϮX7f'2`l|kڵ0{9w(9ZtȰɣ2P"-w>.^&FvOuQ7u*UOLrlA0_ׄq]YdeN!|±{NXV>h1M-"$[gXS8Y
+
+\و=q=$ǤR譔#;p}uZ<A6:Ȁ j>"HϘ;Sj/z
+/fqBTAh7hDgz"tvo^ԔR+Qv.BfH4c?®L1.׌"C{+<:Nr{+bkm{BMbL3
+[w_ Sjt!u2D'  )xY`v[\<x> TIm՛ܾJ3rxJD :ڄŻuB KbR_0|E%<NT"ᲛY%f
+h^6E+K,J<u/{X>"f[^9vDRIJ]=hT~Ni\Q_& E6(#ZkB# LsZL{4 !$aCp)  2 yV.!7~9 1 Ƨj@`b]вpeQ"]@}FP 9C˓K-bTv3=FYGjB Oz%yt$5)
+Bm1Y
+YʲAΌ\{ 䨋zQ CL.@!Wqb! 𷸀! ]Q
+wG.B!Dpgjic6!1'w(Օ)EĪ+-"-WdT@p緮 o
+UwZ6m5xNG˷VsYkLkW,v Xhw`Q;jѳVpgǬ)%K6 o3"q@
+[^0nF VJ^uA6J+!=n@+h8j~ǡrBmgq8H
+B!2{VPf^$0ro
+0feEfLa0E\Eؗ9I1\#sL,U3yۀh\ɭwᩴOu
+{Y 05$l$١uLԴ8 <LfGuُ@!"+s0jcv Պ% v!;H} rUkʦ!Zw|at$OWM52Bj@PV'ԦNMlWPY)B%b ɻ
+  M3]e³.a'vN@'f!]&5wNx6 5*2BUr 5M WIMo c,( q O=E‡1{rEj#ZHQL䉼:AGk Lȅyb7:HIȳCXleuEz"D~Q0O,D!wa"/H_1n=)Ϥ ;W+*"r@\YdU04xA`N<|O+D8Ÿ!ʱ? HZ*|Jp^Ȝ1^1M+닎@fC|٥JSW+\|$%X ꇸ'G,2 AFh ~du$?QHmj5
+*F v䤷<] 1yQ{R}aeĄrK(n1; L ~bEƸc3BYRhK_sc;oչVbo꟟ +bshy_.{,VSlE8X+fA"'0$r9O' )}B앛5uVS ^Rt .<a3OD7"j_Z \5CC3%,FL=f!NkcO4_I:B9P|ďb: po t~VJܱn2o D
+|traM;€H@<7y>> ,6͂ Z2Y "@`F 6ø#D۫C*+8uƈCs{K)Zeտd
+tWKq%8-aխ5!Ҹx4Q}CVL~SgPv.Ǥe|mbts[#@P>uKOB]㴖Z&̘`Ar
+f̾S>ơp|)HFjxc?i{1W|cTaCD#i,[ vUH]F\hJS1#8irUo$]U<pf0s7~Ȃ?]ЎQB"8͞
+K"-e‡
+zY{SjOhZ&_2]WUgSz'/9sU
+
+ث=pgb`֬ ==AlW]Aj8?ΡJ=ɛMSr^D\KJtV$y&KAa ~2uч֟I 'v= cQ=aBFތ]oLP1β A(6+̢)S޹ϥdV;<TiĞz?D$uq@|n:Ȧ@3z'ȤnpR+uY]"fAھd~H{<TIXԃ2bHH}79rrfJF!kc@PRO;L/eّ)r_ıuN
+:v}"b#I<2Ȱz4##PHeYQC^ 1,5]e,~\EȰ8e2 iS&=|f
+zU>B3Ȱ&cY$y4 aBf}:Fs\Y+_[6l8ojf~1(T̈W:f0RIn0;FԣӰ@B\P^{C*?n3tm2t J`u9H' ?D`gc%Z*nj@8 ?L+EX^fh? %nDZNf uo؃7pT,LGXCܪ};2ק;Ӿx$@b65o( B&a݌$E@Чc'p>_y~zƘڥT6P?>=_KWB_L^G+)-?oߕ0L
+sNS,@h6٪["GP uYĨZȺIbV ZE$o
+6H\,ρtGI"9&K=BG|(jU^i"J}4@aR8j29 辢ábJm(p}ܛ:Z %A@\o{sQ]{S"3r̡Ir.)r@.9,Ŏ\_邤R=l1AD(M@H=b0yx|`^ xFOaO7 `c@vYھ0 d*Rd %)|87IQ1ucBm)fK5M{4i_(z8rp9xOhny
+2dJu3T0P"D1}A{VDH Cc8O1szT7Hfެ>D'l |Pp$792t1ˈybBIt =țAo:<DQN}p\5Yo=o"mXbM6e8\_r 6: 6ڄsĄ!xeP,9nC&jh<|Ēe_?hRЉyųbHVV0:ܦ2*#* #, ]PIJf1RL_ TS3A'0fl6f ֑P$T+EH|F^K}"Z8JesXI
+OÃfqQsUYqj>IK{r
+*)Re ?3 F.Ϣ
+uʨT\LK) Da1 ?{,4aOmr*o[B 7oQI)U"d9 iA@:
+\$bz7ž]bQ$Qzv}9\= dM/=)oD,'s^ NJ^qy5{
+j&e0Ha
+ϱgY?ZQP 
+1W;F\8qH޲H.+$m{MBRAe\1E
+ˑ[!1MuSxn.JIKg k}C񣅲<WDpE 9X];&Ae GJ^1C1Z)w{58GduXЏ[[$4.{>S?^LOۨ@oڌkVҽutNM;c,;٠ >*}hezY+儡ƄHAM դzKl/R7E:#$g/,rRO뜀oNRLhW 7Pb}<<='vs*Q)D7D!}:#GiR"qg(;mSFATL3y<)p@l߬鼀5ɨ|.-ϕu-ƁBɑq 9&
+xj 9t]`7㖧2ݥ-Yхж81:PW$/}
+. E^@m)n~c)XƳizزo'g[bz $ )3jII\Sk{61 SCӊt@7v 9@L]+~z*|LKsD4(Sh Ɏ!=Њ'#ɨIm:&VsP1L=AfL. Vtuev
+1P ' Gg3~b5,Ks'0tT8/܆}bO(eڂ $LyOm'7AdkǷ@#Zg'"{VAU?2Dy;YF~1\r.e
+)hZc"b
+<BN9H>FC3 )+ãw4{ "ǸḏQ1ȅ
+t- c!@
+#;ö!0EH 0G(DO}+}|ӡ1=弼)V#8`N:PpY,>v*?oMHg2Gav>rȘѶだŲ=)#y*th_H>]s\_؎z8lWϚENK[xl=h5|E
+HMr\7 O;2E
+Cn'G./dsZSRE.Qk]&.V'z^Reߠ'x<kUFE<l\hrUH!|S 6|յN:I54ZRTy
+@fR5BXoK4V ϏhM tظGW+nZ[Q넌46]V*6 ^Oϟ a [q=DmA*/edBQ\5i&Wkd](C4+#~oc4I2)4%5c}t).:=Edϩ s] =BD2F-ΞB'H;B | bxJƜx5)QhWA"La_񖤣8s3`>T9q1ԝQm}{TC! ɟ$<L;T6jЅYh.LdTZgӑ4xo;4t?Q HҴ2b<QTEPFQD7RU# uը<Ou fJ\Ur@'h7L# j3 SʐVU%u@zS4}P.%?8&G[&*' k*y%]1gG1Uo[raF/#[5HĄMN Up7rFw+:#@t<UaTXRѪNYj^c
+&gRx,=vp%ig(/\3=[:!!E*}妺 #%04wKx/^>,^@:Ȝb=f鸷@pj40JbXwayy;YBBhdxlvr2kBp\x>ZKR@i׾7ҹcdCZ8֛
+i˰tPL:oH)4745e$Cޡ%DarHņ0{X!%
+Y q=lQgx K^Ob<HXX*gX +V<! [A$(RLJ,!I~`I"̙`!d'83V+hBJϭ Mū1mxMgjh 뺁YZTmba| 3]:RWxIǤJgi?22aS4jlZM ّWKJ%p
+9A0c67ut7rZzϙiAJNI0}He_zK*;_XTcǙ
+Q~x.PB8@ =[w;~DKv%[i"6vGI0k;}ĜrOxL䚅@Xum3ͯsb255~o10e+
+܆Z,A)őjW᱈CCH R[g7H9j`DیmaI1DŽ:Ч
+9Gk\aIwi]^oџO暒ɧlsKb#]b*wP.Dsk-2gbʟ"Z覮M[,H ߧp`lO
+ `EcvH7
+IQ޺S ?]m*ėq*Ajs- +B˷ho{9Mpbuwy7&+0a&nZYF [Q* :J;Df2PipٖfTt^!> DHbصAH vkewndB uI],]a aw!$vClO &
+t1/% knP-xM
+Ɂ԰aNvYYѺs!X[Vu< u0l
+p@+CaM`T
+~1$_QC*!|”CC9MS_6]I>0^1>}x߽8!Yoy {2ZU/ŰLL5<# ־?Jp $ ϔ`]Dt⪶"?$q2T@+OVI} X
+(%Hv%ѓgvYSH'st[ 8BR݄й8,Ϧ"@Z0 }>IzAD$#WCb2}P
+v#_Аv):+Wz\c3!Qm3c?C2l !V l=0oζdH{0v@) u)CY<""<M^C{‹as>NP{o 8k]MTMRs(GA~"C(Ce : rC i(񣝰<\]-AQcVʹ _I:)FLۧ ~F\G˘4@$K1򚎯`2NдW y5(?
+hDp  &0@C>suK (b608`!XZ%>Chz2*<hW)Vg$aXMRWِqj
+B6mal S ,IʟSޜZEܜBލ3`Uk eC*71a:T qO,>q=}% DW<J5a3٣9#U]őL8"Jh]薈 CДgyMSu?EuvD>ĸad ne״! N|#k7sŦ`(/5-ӊE
+ Vx&, pd)JdbPՁFN1 <S'IOORenm@Ԕ;o:7]A|zZ8_0ޣ)/ʟ[m  V.p
+Jk<)\ۃN="nANaqe\_yǔė5GJxU
+ :0a4r)rɖ_:%kGaKl~J*n>>?]Z$ݚ]+e0)IX 7֏~iAFDixuec}؍s$ 0?*tsg|0wmӼ{F YbD%!)M
+F 0|-[N@ bJ|93"E[J?=qӕU:ƻ3ҞX=K,‡-aG&ee͆bO)H+ΗǶmHva9H.bE8Dd2ǃqSK&Xa"'ǔSuy/>c̠PC˚yy,zgV KTd&nǽA`S!Q.fM͹V\tAvV80i3҅_qUat@UE0MCن9^|=Ti6sD`m\V_ ϹϛͩLٌ1f
+)Sk Z^i׍1@xPc 8:i
+P`zfs½؅"+>P6-ۅ.sĄԖN(k")&V@4p05rԦ`%ЮAQ6$h"D)οIw#yAz}j՟[MU!ïcfg;l:xLgAR&ٖ>πO4C< #
+jKXPFys@05SB gž+z  QCOWBqS&uRQaL8b(z߁'`<ntD*،h?l149m/pF
+ =Pgۇ̜FsśM:%U3@GJ7 Ca^˄ A)QU~1Yp(#(l:̓+Ri%&O ċۘJ!IeʭNœVQ_6BRGQP1BT8]R&XK %@ǣOuŖ9R)?b\NhhN
+IΠ1evjrJ A瀞.f3SR^3;F
+f8Ͱ"Γ[hO:a+. YD:|AȼB2XNqzhFM˾ǩ5'6L$-*|E HIQkR%R~- )MC H
+d |ӓ+"`JɀN |͕
+*?̎@j"G !sTv
+#(w4irbypGPx[]2mГ(r%1#ڙ) ֨4q.$휻 a$Rl:p%X 8a n8ײIcSra.=ygz2!狩D ĬjoOb
+[9`kk0ҕQ+.Msi0j8 { )Pg+8{Iwz&)!J2:TA$I7}6xڅ1pE}
+,
+2lrLhBT4(hW/}l
+`XURqt5a1?BjNQb̳uD]A`c
+'vvsGR?#&QS3iQ¤ }F얬Gq2 z9]>PQX
+`|0KV0/
+BV9֕vֽT*
+4Jԭv`j0BHeZNcs"=.bQCt! 5E0!mRƕy?00vB <]s 5,D.kRA]y;佲WX3@K/
+z9)"C@#IBM
+{nptLo%u. ( њ[c.(hI]. euP=D}YZZbɶ蟃 0nv^KhIl.F Q(n-B| </go
+IGPH<+U "oo{B v]|RR:C۝@-95eNώ1g$
+U( cͮA}ZX܌
+$6=d4gJƤCvAcu؄K:9!p!2tPR{$ mK#0ޝWعfNbHc`DcXW9fTz08$Ksnn{}rG#G
+1 7'ʝ(jҜϹ@IR?KBJ|eh4_aW~Z8en /}
+AN>En)[(.r1we_ki
+1:%Wф;rY[2F&:BYc>fppocԕQ']G9&c
+hNJy b͑Y&D!0#;<EZʼ1͋zIWHe~ ͮC$/ݜCK(鷑cR[!#qGs'>Eǒzl{‘>f l1h<?0b <s)PUIq*&hyy kNѴh v0gԡ''8cPz8c7Dxh""@"(Oʯ8
+i\GX3Fͽ35FJ!R!P皲VIc%ߒ$YϡC$[džAɍ5Jf]\JBI* α!nf̥G[]*iq<>EaqHMYEzgUg̸ eM_qb- a\Qa9ev!bϮMCީ~s(?~` 3ZI~2[ #cFh
+JXLz@E3b?K_W-
+/W%H<5n%x
+P+Wwxh`mìI;]cyb?^a_y Z8q?b4߷7HIڪN!O:Pп9~5!fp-
+{ ÷.1M#X֣(FUiƒ B;9
+~&?)$
+[-Jc 9R!M@Oq_Zӛ RtH–9Qrļm
+ǜ~ c$O)QY,>]; ęB58Y\zQoIfH=>5(M!`mZmt$L9,I;cJ?jf%Hh5*a4/!ށIbw Z0R0A<Oy$GrPC@yX>W~TYh9ö0>I]+ATÁs,y`q.zt
+'S#x+PDTP o1a鯐3W!.rD>PpGf]<QR_cU0Agmg z(5l%[JG6 a+#r p߅_!ي )~d|v)]2,FmWXfK~X
+j²L~wCll% .᧰"% ]rD(9*}E".p~}΢I>xsBzw+)@0wIT
+nPU<N#DѭCAңuLAn
+0%)L}^&?=u:򠗏=!|J&\ϫT %`\=2%̇`
+x
+)GSP߷*pD} ~7=|CDESFY " ǛsPpR$|U|lE?Wa~`onXaMӰ"ZّdIBr>K2 *$K=1dܻOz7o!r1W|d1E<ylRA@_DYlQL6lX,o5{F R֔.$T _$u72hstD Vf L|_ߺ%,BrHAگo;iKyuY
+zDv/)-0˹K > k͂_*L"bǒ΁XHpPљ~S?RTH+S1vkpr s1'Oú_u2aDRLY%Q
+,{,@1)q.TwvUSaEa7+<L2侺wwd[4\`w v,<O%䜸0ث&7](T+"׉A@|P\6Wf> w\VT>D:?FS$:Ӡ$.C4A(X!l*덛k|F
+ad>e0ھK 8RTYJ܂WC ,-ⳁrCL Muc ǐWhAɐxG64MDGb
+Qfp#6(u71B&.[pu` qLƩP< u+7
+]Vw<\7;aaّ6yr&$U97# "cD?LY8kڔJG8p{ 9 &qLKfWDyMH*N>M=l`BvA0{!W4!'7'/kΐx cڊ#B9y9HdlW1> 2vd5Hj75 ݬn 0ry">yy%bΝuN"(/Eq|6I釡DuH3C/ND,M{뇢7Ev9VQ[i(z('qu_\i_GxlC?.a]KO:{*Kprdɞ\kN̲ r*bq&Jx;1?,n\^F=:YVP LF:%Z* [ "L>Bbfc/&;`L_04n1shXhUZ.ٌf=%T&Y:\r)P>%窬شQfr^xUJdmG@+|`$Ag(ᙅQa%"]v%e%vwv| 6ˬDff}W$>uc?#
+>Q5<ʚ֒&ڸa@ZVKbC!:`er%׭Q -AbZ)SZo BF"C1,@;2])iΐ]HciNg;Պh}>Ǵ?k(BOE}d, IN1^`h8`}U[sK^E, n^ M'{q;@C/
+>t
+wտ7oB\FXyU t̂Y>WE * Ǹ7\mQ?!x-X 'meŨHo agq('3H22P 6hȞN]SsfFDУ TA`Tdk2lU͇̒S E-dRӖ$#s>r}; `pV\*ʪY2 S*ATyx"RhX'(<㥔:鿀>D} U{yG;pk+c\~0앒Ҥ^>˹;稕u^
+C єb g46U-I`[Y:I:90q,
+l͘Dsh7 X$=½&ɭϠ/X3s"af.\;aC,kYPRgwY @s|8:U} [T!4v4Tl 1kPq:gbw4#,֛2Q9VsV2+SSqNOb7BU#o`\V?6<ӵ&B<Y4h>@@fspE< ]4cH o 0&
+<%T|9YĪMېηM&kჼ8D H
+L:T3y܍1D)JYʰeȓ{ѡm$#„X fS0c _;β;wEzݬӟ U&dѬ 
+in Y!A5PW
+ <T1.H#'H^rCs8ʆbi&
+cP1[5BXUVa9hh9d'DZa.4YNw)k$Wl0Դӄj,4pJ<p^5""t8,ՀA(6~ B?eыd)4|V?YׯDxd&g&i^&<
+ÇTO@%6)!l67 &h( R ȵ0NU[M
+}6! SB)V9;f9EֹWkRG8 aKgOSxzz 9}sWw|A|~W=>~ 3ά˘4U Mʳ;<<eY?Q'(&o*@Tа vp2ܔ}+@CE(h78Bs0t w$h'/Qmɭ^.Hm2D:#gX"ZNc-MмF!s-3JxIpmA0Yf D.NuP,:)<_W#ZحdV
+.9JTb^ϵN&]P|;L9M'?Zi>}+$[QI^O*tZGN3bKB6 B3V[azY
+Ro((qrXQճL5Fu[͢bJn@[Xc AN{ <\:%m;rQ =mЌ1zc
+qz@Ib׊jc7*׃=u C:J?*%o= `e`Oz8-ysqب5geʼAǛ ^yǘ#HGXՅs|PR}΅^DQUJ_JtYZB'q1iU2ra@@
+wŒu8*
+Cև%ZQMI|{wMH6:8zHVUuAA*4$8pfSq3O5z1߅e:/6 褹RA9ģpUvHH`V*؟Nx2ث_ĵa PFݍPX;g\a;]%m#~]eV4IUՍ@#.V"v,ui/Cx6,6'K9=)HSA Ӆ NX 8 X> HY7cf2#9 a)ڠаEK
+Sgڳ:Ҥ1W^8%VAgDRX9 A(b"WU>@Q]8Vx`KRKbP#]dm[! %$?27 6%>2h|
+ٶw>rգXp(H鵠v{èN]x^N\}C&Aĸ6/ՑYR}Xa]F@G*P$0?}6(/nk@pB%ެC%P;9ʨezy+R+8/W0~`Wz $Z+D gm>gc㉲_=2t5vȪiKxБa}
+ ^IVM$u+Lao"Aɮ@^zT˗
+eIPTE]@
+9<"V-:e1 hc
+v׆KL4cJ_ˬJ<2Ձ] $ۍ8 p(08+F%Inn$1\ȡJP^s)A0*zs3[P6ʳ툅{7PٸuPFbX k-&~q3zcuܞ$}`lVUcCN=aȆ)pIJʮܾ`P>Bx[ Dh]$2P+0*)|3tyb{9sxS2%tZIP1 ,fnԝwHP1(L`Ab9! ˙0a7ފ&(0 hWE jҵHJ;^l!1
+'b@-`L^g֓gKWq!o0=n
+Q '^y"J!}8)]k^pS7A0 OT U']8\1$/.8w{B+oWd,9QD|l!B0% Y%q`̒dU0Axբ}3>;,Nj.JbjGz}4E"&
+>JYBbJqd|).c
+iV/bD\a:(b%
+QLjJyS>u(b|%*opK/"%F :AWh6ٙbCm
+5
+MW
+TF
+M' [')c{^0?1jh4I@Tw HANTX1F>P3E^D{g#*.WWg7H1Qrl/ E7lj4}\ŷwϼO+l=VP6\OaJn_6 (oXP؎ç.1Ɏd*-Cci(z%
+ao"]잶P /(^ 1T<`&pb!Y\*8Re.Zgg7mIJ4Efr&%kGj⎞[CP廖5}!ABq + aq D/acf 8*"ҕT<>,!mkf~&_oǟ-J$0Zq <BC^"kJEV yIHƆ"\mp$uakh]/h.oA
+dhO)K|%SމKQ6+,cl6`
+HAnO;!R")3"[GI1_@
+ ^jV)dphũflz-!;wju|&'I1hyc*ZbV>|~#
+/sLqc 2mD%&SAa'(ǂ̲Èq^'MCjP&R-[<D7Z>)d@eRbpS):,k~~q̩aFJ3R
+'QB6grfkPE.9,I{Rj bz4Uwq~d}K)K(sPr݆I mh:̬oGЀHDV1H$՘)zC>֤Q:)*Z3fr@t>tl} SPPZj௬${8蝣#(BQB '4ސJJ_ii]q
+mQ} Nn)byQV/͉[qný}GH\s&8y8|RWU UTA?6w*>1\t֌n?߹ҌIng~`nʈ2o@:w
+Ι 
+)G۩+lq
+n,=R>zA`79e HƞK=b Ͼ@L"E't!\vcu%ttT1Emz}L0#i ZTtl9ק\IP~22OD
+.;Obh[Q"MRuni75^׻DQ<^*R˃Og@ D[ૻsx`.&
+fYFT?=1/Bm4_(k!Mj>p>%qdž /D w*b;
+t)k/aQB/]>/43VA!£ ̧Rwr2BУa
+*
+@n)9;TK nOj7iq呼yH\*Y~i[ .1ͻ{5~$LSʲ#SvQ6~L!%gG@
+63foz@*7i U%uArŪ(čhf[!twJa2<]BIrEW=h X]xJ-$
+YvE'Q@6W7_/P[p.i
+:BմDdxԌ7VH/c\Fm`<D\5KҎ3F{%\&>]DlyM¸<`1*HPx@+њd<FĎqVˬ<[/7Hko^P
+ p^.kBwigc 3䵴j2pC
+p2O:h76X}R"2_͎"-k#;DGȪ;ԭ/ W7W}>aKl[hUKH.6a~餖a w22ۦ(kJQwhj\lKaV'pvڗ@_yZ&dmHw $ΟMsD.Ⱥ15[X
+Qv"%/ߨ5w_S<pBZA̢ɛS]h^܂.cĠp*h%`Sh1GN"_!lXLe
+\9wy
+ BX` o54SQC]Ue`1wkP y"A*kLkvL,Xʀ߮:`fʚw&L,ĘD/:Mզ3Ng?y>N;P͜82HĢtqfLsz
+'d"YXNb =.2a
+û2% yT̷TFOKF՘YO+o5ht
+Rǃjdx4lӆ$4M&Y04a=*h1!5- ̚Y>D72U'v+*1·O (5A-vv+z<h6
+W}WWŎdR'!?T<\eQue4<l>/g!Pه$v
+U/\!,QZ!0dtS( PqO=dIKO/f~\8@gn&bqmy !@Mk{>/YAȃFi6o%oS|g-/Ĥհ} V_>VԵ\-A&~fRm.D4-GþCAv ?]x\iRYx6)b%ؓ>:AV"waCܽCդ boE);j#=,>]6(pN1J3hIB:cǬ55W&y[z!_!tiZ|!']
+ԗpT3Ck%j4na Q0큯ר)
+pRugUrCZ^
+~^hIG9H7ufz CW'UO~NC2y+;s+kYkq w' DJZ1︠myYw, (.SÃ͸+vM@"wV'H Dm.)r7WqB[ڝսϠueL4ZRuY]OgnՕq!/P]f`$6 @-d1s.*tMX]=J=kiW51
+rtYݛ:_,a*J{48^#vV*^}"$ 4;$BMZ_ ѴHqLMn^Ĭ=&C@$BxhFj`|< hT|+ 2i!&з_A?yb:> jAZbz;!ti[`4afXXvzN7pDa+  qtZgQ֢ؽ]h|FKǼQ Y11k\ wY٦}
+=gq>lYdR̛ZļQ:{a,Dx9E'Z! DԲ h*YᏠ9R~7ꐰo Чiڵ3v7P)eܘ^sƈ NF{^읍A:@ {ܘg.sAO!Eno^ m|Vy:ŠA
+ k'\j²\fm>Jځ9H\!@"ؽHĻ2d[ *&n}TW3$^t /+Cv
++n3U$yp߰}CHΞ:) vHQK7C~nI7\V㦸7z"4%%WIJbAgB-0
+ȟLCZxkܔcr=75>A8z|x%1R5мv*Z%8|V
+mB>QUT)?&Xa1]miq?+Қ*(D:SwBx@Ipoxr!
+dS<e(rrhְlEZ 8˿y yV,*qH:*=Ġ-wO b?YN_,Xxdut0HQz-LPJ:v6*6/Wo9C!SA::D0zzEXeؑUT^V
+u(i>Jφcau$ )ۅaM8ly!ɫj}4k|hL|C;2,;!にu|Ash4}"kJz;<6Dg_QE%r䯴Y ,5:}e$I{W]/xi"<pnJ[XIaX:Z|*}r3կ( w<B8燒5ynE@pv%nJk ̓ ލ :DNp;>[ق|gXzC J' nƖXHHTO?>u-gdt(^<"ᤊ-"I%9J&
+*0˾g=
+dŻܞE*AMG}ͧ
+pYcaF+55xX\I<}In!"VrYNl$m[5;H_@e^d!03E
+&0j7gÊs.'FNVRrܜ Qsc_PBE-H
+BRV2!yp "*Kѱ?e=`k:}-ן|A<Mi6tȤchʛs OX%D=!ǹĭ|%ȆK\&&KR:
+ɧيF2b>VI ᴱ [3VʆJ.ܧ
+C2/+WDȊ:aXg'+z$UTSUhNwo}Z*l ߪNY%X(K;\R_,{A}[䳪agFb،\9XnEn| !li{"yҲifv#/܅43ccS eO3AZa {?p"L.ta$cJQd0#wq_x%(pj*
+,޴gtu6E`?N:^Wv,:J$%n'r,<0j ,(݀8ܩ5$im|#$C2\<SRVCcϰhCwPòZ v`T%=6ʩhIȧ7m(AGJ'BP$JPBU\3;|(uPkMb/;s Pãe_ttmbNK`?GUҴ&&eTGŏ8Qw_{sXkQw*-NX<[j7kEW3SOPJ:h9ER"/4g0 T^{_=_2h/fW8;"'P`ۣZbB.pˋ 5gv^& '2Z^_/!țL')/GSHS8BTorkݪ =`e$׭Chf,kJ\L)aP|$y/|)Y}̛sdyL<U2$ny" /2 tbx!KU`B0PX2
+b6-{A_ŸzWlAG9Wgir7"TR=9U b9A[Jx#T5$K14K?w
+&N%fIRc7LF uFwY>Mˊ~v*::|ӰOkN|죢7B8#KWMd岹Oe5 Rl~*`4D–W]J R%*8i`L&s[1X Mv™<ʪ*b(ƕn(QYD%! {nl5j5DEXKׄ~|Xk&
+w4tv?B)ڼLI])8 Z h\77 鏁$ը-iΨЃ2S,͂<DEZS19.p]sp+rVH =3?φM-ɶ9ZZ%d4$e`rEv*"n+]
+Nˤ2\Y7rlSx?AZKxBO? };C^ 7etM FЍ0XqF>bSp_VdSu0zIS=BSx"%'DɄ(${n'?q"Hd"WIlӻ,6IR-JJ@PAaUX 'Rds(?]%
+M۲ѯr6^f& QWB
+D'{C ,'xݷa_yW[b͚c5EFIKM2ߜ "b5}eXuر v7C@[b% {ys4?&azF.~7hf6hx|R8tYZCMGqt Bˆ]!
+a
+h#26w-0Q'xaRۊ
+YޟOP
+SJ&jk@45ZBusVʭcX%A~nNEpCƁn=c)Zn^P ] ö3vHOw|*o h k аǰp 5ҖbڟaCtذ(2UyJfa7%/K۩ֈ9OkN|죢7J8c襂($SfP,a9ne( d3mJ= /aQ2Đ][$l!U-oP I `i)! bsQ V]+C܋ą|sJ''s"1Cy&ճRmko ӻ_J^基`btNͫC?%[+=x1vE!Qt7J"A
+Z_#'-FJ 8FS7
+8#a0=~2ڥt!u? [3fb$e'n\7mZFrɧ #O
+>WY"1$B/]G1QA+J R=j" R3^}w$Uh Y?fCcWz |T0d3Qd<ŲvL.1.
+7O 0/1< l
+T_聈,0>8ůFsH隬+rV 8H3=zʼ<hBƄWU6+%<NqpNyz$Vue˄fX9A >3?2G^2ՂԬ_ Ţ,,J".h1F_
+Xo؃ Kbd6Du%ՓzBU aKq||QOEvYz Y]wˆ#H}h AY"ԓƋּvT򎚓W2"dpS7l,]
+Bj'Krevx PLw}'15W!vor^_g韟L+
+pbOQl(?{i4J[dhrC(CBC=dV-L,OeVnBԵ^j`)@w8Ti.Xg &R-CwWbZx-̈́pb BB%fDh(6 :UGS_>[?\$d+פ5x(Ʉu K3LHahb<OAHYFqh7vDVp.J9L= voF2fnjc:o"p#t8CUM &='[F@a4:ʛ?xR ៟L^2ADE|bb:(2{LN%@IDE,Kn%i va_{|TVBWb112X=`5p@{/{W5#qSC+N/S RЇM
+nwnku ~
+=2\^]qUfT~Ua95Ň%g(󞔊93Vv0Ӆ`z9I|7pAeMtgyW&_ 3i-i߳"$$Fmp|N׏D $Lw>u=GCSAcGE
+Ѣi3Ӯ(Ꙏ`%PTY5<O[| h[*n#OQPy Fmㄱ$7:%8jAy<]$Cb[kPb@,E,f&ؔ1"tཙP :pJ%ӄ,$g1 o:M dF(JOYUJ\LDQe8A\脆N#Vƻ7U@xa& 
+_3
+d!|`Qm`@KU2ه^ vf)*0 Z2M
+߁%MTMK Q
+e?̹j zخю1~@ЋG'`Joט/.zjzrO4t߰<-3T gf-EKo ԇhO2)p6vԺctN1Bmx$vwN[MXN9ح8U4gWا`ḠgR.xnZ[]. Z<+
+t9ۻR.yx:Eɓ\K2k a{Q4rK^@!I)&tft>%<GIE0@w1Mjp?IW/ANHk7c|쭠Ig%hiK/mTD*z"
+m١%ڇRM0X\vA[a0Kd2Y{nKWӂ!F\v܈%&RZ-R5U-QS{qB`bf;Ҫو\
+bXx
+!-`;!Hw #,HF&cO9S
+a6yX!~jae]wvjjCԸY f'9}6DE F}Қbq BL9bEsϮ'wδMCo
+L;$w,4bB Jy>p2LaJ願 CƏ5hKqBl+fф>軛S^m]K_ S31p*Ao7#Vj3{e#F@#I !J*`t;ԡ=n^ʂ;~ٌ}8M&i3~/ cYcez#$G,7Y;YIu兙GQYv Qni†7 HmXhJv6Tt;AOrsKJXL,̶07k-#8c"K/I2:!b<+yshHťV^ᇶk?L5sZ:lyJઐN
+,S[}I
+z4XҐ s2ȰG`M&
+.BwH"3#j,ņ;7Dx)U'oh5}F\ ޒB7Fh:AOFaAX /ʝ
+``<]?xer]ւ4fׂ̡GBkoL6 pΉ*Xj"Ui! ܴhmJTL Ӱ?6qHqeЫ*p㗠/ 0-1oeK¶ROi%-ieM2ޠ^ %
+` UN>Dr^wb1;S*a<
+&/BX ĿI8sACCpS@v
+31, a1`-R8vAu|ْΡW4,V?T\No2 '?%<+<oԃSXypq$mE]7wfw&oB0gLUj膌|Y7; D@_ЙUkХו9D/S kG
+3/K*,(K=ϦǴ2 e:W7q<̐ȾM^Ã_.dӞ>׬Ú<쭪eurSt{B
+jBRlz0Zo^T<gI7.O\̎rq䫢(<{
+T!\o
+բĆqD`<XX_k2 !(3‰buÍ[-+bj"
+-m0C`-"ctX<GU0_:$py9DULIbI4.2);T<d~ 7nߜSP*/SEޙڂQ)mKAK3Gm$]ᮄQ*F
+~ɮGV׳mZG88 yɹQ~R56!ӏE"'lSbxLTxT^ݼ? %
+pK?ҌM^OESI#J #m%U *SLJ&>ǵ&lE{52S M6&*r'LP%р02%0ʚ{{ FUf"Y<PV/ #@JB
+Al$NSh7f_^]1-Hp~hҕYHT? ꥟ܛ ˯`#6fΨA1Uɿ fܵѽd@4d3EC˹y&sA0W 
+HMr\9O; {[tĬo ʡz&p,
+] Ğz7dlv܀F+p'd/+y4ME*N }|5΀*]6[sG~a|N#ִϙIZ(|CpȤ/1dZݟOmDXk{mP1Z%BቶRj>hΤBG] Tfqn.sRr RߩvPIiU Dj<muٔ͋ ȟͥJl
+U@e`Ҋ0)y>R]όy[ZcϘހGš51 ~ vPFk /؎ 5@U99H4۴ H-KѢ?i:ڶIF
+O|s
+ի~ Zt#
+I?xO N D>7ou:WkAׄc\Dftm.t
+Sb*aV/IN\
+z m^_sCkTWpC[at򍡖RadAi0v7{yɛR3*,~F=<MbrJ/.ϟh?\kfawO=Eî_Ax<Jc[Zȿ]|(&MWV.a#0K )O7LN{B0 -%pȘnq[@jcј<#[DŽ{BZ"&ԶJ\Dā |}*QȂYm-]s?b+VysbXu-[jl(4mDWq߸d2 2V0)
+8 IŌ5|
+VEv1- UD~eyKv~'bȨX51\JS2NYm0plC4IT[q]=4*&wTD#ᑺ쥚1* 97^`0Rm'/:k2, :ț]BYA4+Nkբ!`[K*3q,t, ꏻd XhŖq,(f2%Մ\/b`t5ac AHO KFi64msV7guΠ-xKRv`G a>GX=.
+=7EA,'Cь<\[WWp a P,dl>+8T/ a}f)S61:/&eotv-:$&f;U*^ϲp־`]K;j zMG*BȤڍpr(. ZfTb!"!O."IJ!suxGrRv2JH{݃vBw,9W+a!0;@(Lcb1a"Yx| _8FCɌ ]CǼ܄b<T[-aYF(*sly 3l5ҊG}gȹIEMB=q^(s1:m'TG~tfad3<92;*9^/ȋP,!n+ǯ4N!_h\LGvD@CP؈װPLsXbf/,bip5=" ;zzw@/;  B+
+[N|60ȿ cc _pkmb`+FV[_B$yb  M=@50qH%@ R<ajg!sR* L0-}@FF7%h)ӗ}3 B[9s1}c$CH
+RV@>m"U;X8XPu _$+#?j:ƚ;޹0"ņ}l<a>  tlH,`€hpq{VyIx^`;DD}d;?o2*vw(1M5I'|AJ:VWƒx0A NIcPEfQ
+?;bLdN2pQ>9zu1lX@3(SK7EV2O?-Wv2a|X;|b07ʪ-.rQR,KC%4Hi֖Z ,N^~P[ زt,1ql;ʼy) -wXO[41gq]". 1;{=-CR6 bR& -~<IKe־mZגd,wȡ ?A.(x
+^0shAm^s2p9Bwnm'1Wdp&+WveK@#?y
+@X1%R ?PJN@WI3d0M"d&xc2Q(\-[H[!݄PzOdW J^ O]GZmd+2M2AbR^rMK ~ҥ\zu\1$x^hQlt$?%FiH$]z睜/Qi֊a5xP_@[exDMA5Jz80JԯwP(d& Q^&+1Jy*mTRNJ
+;XZL JʌX7Ƹvl>,aN l*7I}>H(h3c} ONta߱#a?*ف幙U?mXC=+_&,7%B
+\nHZ9vWSQ(F҅a5H+T:
+1vqqG!w.͑e{բ^@V8K䱏99Wx
+ 8'؊yKLeun˩B48Ȧ\
+hbrJ"a%o@qW&/*ۀce^>7|sF+S٠S~L(*:arY™SR֫ $@paʼnWNڢfHhiĞ>ޕˑ0ɖc˻M9@UX27W [YӖpWԩ|=?♶kr] D G .^G9Tp'jz"Ҝ?eb !jlxA0#ϳoxY b*M ֵ,AWA"^Q@l@s(rM t&RR!wh0>Nr&ր:Ŷ+thI[.agRx*]+s vTTaC.~{"͈XVR 1&-1L]Sx$U5:x
+@d%",b t:nX#<Q1?\S/;/n4(r6\>;2A6eAkoSY>sG*Af4 'E2#ɰk#F!' !' QkA.CZ0Neo6!d̴|,˳/<d0PlO+tNomY@7%̘*FL@Pt@h9mzi2d{uiD2 ^=망XI@w8h⨳c߹CH|7#hARS':+rJmB^ޱ2I# t@-IUTˎAI& ut
+
+@;`Ȣ1h| 0'E&m6.u.tG)蘼tVE
+\n[t6?ZuGעEGQڝa5Z|`)?z5?Qݝ]N[ۯT!ý?Ub?$ǥۉR>nuqS`*^DqkVih,&fmp~VtqF8WTMG",CpZVWUUm+I(dٸ9
+7 {üD TSc>EOu,BeyX%0yw
+61 +m&ݮ5
+8]!i_jN$BXZ.O [ Zs< lXL[]FRsk/E vKaOd]j5 㒵`}UrٳJ& L&1 +$QDX ^PNz/Y f6J*DO=EJ
+r޸`H盒'~H(@p ].U fJd сA"+"j,Aܹ
+gC(_
+&XwSS%̹RDjYE
+#(],d{cf"!^*ҍZv,b''tɵ!
+>\w0D?Ī*Mtz=ˊ@Θ"r9n-%2CC11FMZR"2+w71\XV1x<h2"W~SRvdz*b@6UҶ6_H!޻xݛ?R-^T- )'^98y
+lq^S`I؇aSd1Y)u-xB i0{Q3@o q^
+~ A KWEf7%h!6\PX
+)9 Vv;ɱbQ_|JWve4{0$bˈNnx18%k FIIYz*)@sx8\.sP<grxÍ0t2$O!]Ya!X<_!'.|HTK "st21c_ZMXLW~
+):(fRFp $bO^r/xd(+Oz0fZ'c/1m<+0)'.SPoa[lWuko 0&Nތ/qapqSq-'~NԲsp8ϒUX95fp2aQs׮AMp)Iu?iyxg !\iwD_{ܴub97q6nz̍:1TLcL{)%ik1.NPć*՛5a Ợ/~vN ]ɓS\EW1E<τ?)X
+ZW gq[G !EzȞ>C]1bH4 rI丁 ւQ1Zr82%fWk
+)*U$񝎷@[[ 2kb}E9hJ&6ٞRtf+VR=Tzme _G@)!m۰U{fDž<
+%UB@Pcmwf9C@~?s#27u#qŸd,.'QvxY_:9xbaM1MG~
+uH,HgV6ۘ#hZQ7Pfwx h!V+ ΀8$vq+όjgbIVtBh1;ņn
+$ %K yU0VDßդT/N_}Q*=ȁ06}).)n6>U*u= # )F'Ɛg z}A?K-~r}@8G\ۖ 9DGwnn%/J@ၳ;`ԀL 4) ęI4
+wH
+11\mY#X,غsFAjKtuR͒)s^KʇUI9ډ#4 JS:U-Q/ l & w>V^u Aӄ:hb:AY -Aْ٘.&cBqƿv&KfB
+% vcQӽ
+*0f"$=ԃ9'p+E9ͺ߆J,ANupB45CA뜯&"՝{J0l&k@Vh"FE!z0SU7V/Lr$|;>gnz›
+b㎸y`\Yl/vuL\6}w lƿkd6gr
+ԫ'`OyZlWrRI+_+ZJйQ+3mT\ݴ/GHfV4L +qqXlxUWh#&n Ô
+i֙05rD&-3F2(Ŋa'rcN.#g5q
+ytgS Wr1dzTקl9.10ǦAV!
+# -&Q0~UH=kMt-yX멍2m֡L?鏪jt$_/"yR@4vhR}c(Rqy&iFޮ~*ҕ{QPKIhN6ar,QvUNA%<ps-kEf٭dqI3緪|O8w {fMׯE=R=Ho,Q >y5_E-kk|e/&zKdZʯHAC\|GrE~e &V]8bcP_V_V*B bjmbVP2J"Ҩ PrKv> ѵ<41<
+6(cUJw{95
+O *6ASK2ŸN)
+}F$^Of=2>Hs /ǧK3M=SFye^WJwH]*03k(?yQtF7iH4FNGl$LF+kb!~Q^~ ΐhHFC1'Uܔ "!q0p''|U}kܓɼ?.L,mֲ䄎D*L`BV04y FdhG-9LLqS3Nܖ0x|d=ꤓƹ$2?Q͒g}IdHf])7T3n 6Nf /G&>
+夌,ݠOmQLc%߬,lI\,;f?\@2\c H2$lRCd6 UɘPv*o!S5Ž)IJ0uA~! *| kSl,;
+f9)ܪCq B% q_N}yA[bh 5~dYPhΧr0ĩ/, ,|YX=v'
+H#* @XxY%3%{~n)U0 >osӻrTږ~7YmD!0 Aʱ:|.ꈦ?mXgLV֭9bEQY`.C[aЩhe5&y!JNj_0I
+n;ѷrY1l;bY0V ZZ*kxpY ND"'Awם|'ݓ0߅酩Fp k*ګ*Lg!wH5]k5ugҩmd1=%gArQV Q$`^n2A`^aT_ԅ./ 3uA'U>=ЮIA kp⥩2il?n/e
+V
+jDY*9_=[Lfeo DPQh\ ر""2n<o~'-4}zNz|3~19INHGB?RxWw9,UeUxK'IMJJ5Q~9(<s8mZ
+"&G&+20 }ڏb*p®_ "h"/13 v}|Nx10q;jfv,%_1nR+ts]z/1ܚ7jn$6m+ytEMH߂¢آV2 bt*E +J& f)VJ\S@y*s ׍N@P]8,O-\H[ ɱd~I nZGm\^4-)U06%@~T|,oI28ke0 ^ޤwCi
+l*1cnB%%F=@QKlτ٦11sҏW8LjTߴiLq~`moY
+!_ӯ )7"E|d{yJ/D*<vz Tf9(_]!|?_!j)X@
+DK\ZԂ-VS92OkiYx)b
+ wTb^-!Y r Kri7l!kV̿ݟ1a]#UŁpŜ/zqA_ȐWQtAXq,/T;O1HԢJ3TFhb+b#~JI,@B=gUڙ^Ρ.| sĨ8foVI Zʹ䑹xfwL=fi!r˟gpRl(`u-viQrL1g^@bV*޸}"p!"RW$=à<ߡ8W ,x iz:R<i||
+1+*l#PL`0
+diHٮƋkNRy4kRj12CNnK]b,p `[>j6O OMK\j4@j>C~dKt
+N[;fP f),G쩹;X
+B({X tȎe=#<9w)t% <G Ѣ
+^Ő⤽
+={iT`VU:qkS"4rhd.͈˳VHUg
+)')C MG9cE-܋b*h?N*׿~h4!ovPڷd;ʏCY a2Jwz1Cmsv_݁51}n̦h?B?Aq_X Z=#
+e:+˾͑a^:[@h %- ~S K\bz7Tb¤b[L$=UB:R0asFC`FΕI9@CA@e"1!RWKAS2_^`@Zt9d9nJj
+P%gS!j8K9T"7;C3>Gt3Mϗ+HAAz[ۢ`ƈIns$}[ſUJd%FܘQƚ-,1,D[>+j
+`>4ېCq~-\JJ_>7%<؛ tEB0ƭi^ʿH i|un1[);MC)t/(
+n"dģ`vs##@za4 ?#`3ceZC@1L!2mK0?JB3@/(q HPŰ-yC%VsR
+H_(dUmo"}MI-G"cy
+"n[;43!+jMz39x%r$8HGiDKhy`b8V="?' K +k" &c|T{/_%U+b/{MSzmPE7>ŲDrÿw %x;*˼|X/vH;E8P/ߙS0K`C$FO?ǣfXh<ek~e=
+>yWw{cKc}/<踻wPV%
+i߼BkK=y{G
+"&y䙻F#Mx EjlcF :7dWTH8 @r$sEir$;$4 be wvȀKe<%ְ\'NBRljC4X0MfϹ~(\#?kȫ/o5apvRnrY,8aqv2螘d&L n 2]Y.$:/%~Ԕ3 ;ˈQK `G/D|W+\Y-UInG h0[e-`O_Hcg$ԴPwd4Ɔ@pd1e@G~M!9<A =?0N>PSԔp”#c\DBof:B9>k
+&5*0j<T
+ 'Ai#:=C7A`٥4iZ[Bڨ6@_5F(JWͤkO¥?H!ܹ.j`18#j&xN}OV9NbVm:`^%r( ҅hNfQE@`:r
+Z8D6.UӌDh-Cq:(]vO~?#B9ba0
+$ExɄ`HۭpěW3*h>|A㵰%/7)R|Vkm!l2,v
+Q^Xա 6yD y(y ̀俙&`k|t}N..GPP/%_0k Αb=_0F
+ԧk ER"Nحg(0G :0lC) Y[,\3%ߠ4$RZpun E0da"v]Wo)d_Å"`J ;9͋WCȊia2
+z$|굙Q\u[m¹WQR)H ʁ;r< *K^xϯSQߊ`%6DO5,0%Y8`lmc|,M}(AG6Kڊ+e%쮁 pC=!4N4pҕ=jEm%2΢;VL
+Xkw ,κjnoy *3d¼?CD鸌.6dXC/21.qN[ h#ч.Ŏ:l> FWD*@'zaG}GF,}c4|L!B%Ε<]]OV"f߁a6,)!)G |ojm53&q >V L?_7nCEl;%"(Y,2$WFPG1)6S4<$Dq|R#@zL$őwH&^qTo
+D'(`GcaSQIq49猹ogXZx뀪>Cv TA萃1NOe %KrzlP\[1vإF46xavoˀf$g8蚥IuU/ed *8[8«oR"WC|!7[U,\k?QD r*X%P}oD-n= U (5Y( Ȥ`2SgTm5)7BH">(LY8QSQ=l#N gQ"Wǐat >R499;t^k0
+Ի 뼵ehďP(މOIGؘqmV@i'̑UnTepNm\9
+!SV))B$~\B$tP"\.TRC'H҈n%ߠPHˀ=Ia^5!է$CRb(x}:N^z7g^!$2y$]t!q7BV(LbdS#)n^ ּM%c{A8 #t! B\HR/QSl ~i(
+*RčK<v&D1hIV9UF'P.Ty.qP5Q:j^|[!Q(
+HKrdDW=\ лpGO%X[pRADc<ޞs[ׇua:dnڻӣ9[7}ނSuٛI|τڳ:ߔ"E(o@E4]KqA|Gtp jSemHS"x>ޑ\F[ǰA̺>?
+V:˹PUP 1'ژ"N67S*))3hkdB'D\
+KErء
+oTSzS*D2]FL:FՂ?sb9ĆdI R#PB<d̀͆hƚ}#{5C]h7XP_A -=hI;p!ېHRLm㙹3Wx^9{QpbIBYo R 4]xwΜ]xB] *KĩN2LTr֧w-»z9
+҇J)X'7
+ޑu7բNmGOԪuTBte5Aܤ=8d1
+nM_Sũ$M|sU`kk?PTem~!<нa2r -ZrC+'rȳF'DdqAfL勃:4S7zTNѩM;,gd :kt1>M(F J ڪ˴U6k. ZP# KQ_Go9Zv&/ n>3tC vq=:7z3.x;Ǩd0 $xm ~m|URU<Paph*e/'7-e)ڏm$s͓jۧd4sz^ ^X7#:
+'99Ge6-'ODۺGt&a>}գ%ڊV<!ŤK?Ҁ^
+ԙIWs\$7 w4YoC9s+cH
+s<Bb:ϴW~0۞2݋7C~2y筇Ҍ~0EtKh] b&auklS !R5ޠR㏳^feLQRw |m3= qR͏0>P9/ɱ0ѳ1qB}tiЏS%gfvr @i b_BN
+@gva3P')%_1VU0k0`
+_HM$0_x-~ULwrHDq;Bׂ %*'yJVGRM_fnIFBogYm9L-~ 43EB5&n37'4kF{_
+t̶|ȃv&D0SƋwgn**+oA8QA5ƿZ
+#47z'!
+\9YM5n!1^/
+bD3X^Qq 0N4cYN.^Z)CX&a=х`1 js}ސ7N&EcbnCm9rE;ӰZ8ZbX
+YLLE^t BIGOG' L-:z%J{8,`eE#pb@~}??mQhQ!풦<=~1#w9k|B^b^e$ i
+p{=?A#5:dOKZ6l7if}<7 =MW0279Ⓣ"ϡ\LtE
+! 373 5_k0mT ゠6/>:Rdžg1QQjbFQCntBCmr Nb $NYl`;;\9풦wyՓzsHP:>{n{rMf4|!||^ͯz\.AS:4
+^b׮
+"z&sJ ָZ#tO!66H9W)RŽ evٸz.
+잫H]P6Uŕ,e6.4p)RR8ӫڼ_Yа ~L+Dw<sٕI=GkLtX R !>!CC&ohXS]]BRFyOfT*;h
+@mq1,Als5l$HwH2DBK\S\ZҴ ?qG'2)* )<Mz9O {7`̋ IOǁ&HD=oL4հh"LK#MzPWUG`q2S M2ԻY/D|Ft3i2l')SMgҴ^&Ȅyv)ɱ:+LH!,%"Nt7!ю V0Z=șNY@5"jnOlE8D|݇[0scUUK1H]7mcr"se'0Gч4}B2
+b<vڐ
+! e K>/i9ǐH}1>p+ =]4h".W҇#^
+z?IAgԱ9h@ɉO%ĢHҚy
+ie=Z9-DXD@!RxĞ"%_rL$+˚'JhCAuj_P^i$֎z&v9.%K`~9e;Pܧ~Tn&Ɛ<&\ suQQ
+҈Mxqfnp #-i22HsYK" 1gAxABe9da^O(-,`. :!
+BEu99&\<ytJpkEJEXfpQzB)(և4R.Ƿ~>~O}c&)bH^#} c)`CAq 9z\YȂ!Q+裵 pPHYUBٰiBp$>
+2`nB|O2g
+t ܺ4/N6%74y6yۅNi :'#m"{nJ+" L!l]>Nq>Ia'b
+=Sܢ4ШPD?AtqLCHCX)> as}!^K~ 9!F.8o S"g5cI
+/uFY6>Dd6׸D3Ӥ 
+5WD6Ԁe BE! 0TOMPgɇLBcfdUSftMJ `fvҹ->$-D3H5MZ'Usj֡Юv'T31UDB}Qks "X3 jPLb:>,^T  9 :Ihv+VxC3F*GZG Wkyxb '& zqZ΂`ae= (o
+>ЖR;`eH}üRa\=8ևN~
+E|*'lqQER_<G5r3Lx/V?͋aE9g؈0>4!LuFͽJB̻C:۫V<i=\ad5vۄD5t78;fݠ$T$}?w!z -`Z>iɴ}}ziC)@AP%x ;yidױr 8kSZo*ȼMK!g~|/lJ7#M ZS8f~NMؼL7owH/]d(ie56VW}/5vBI2<W|Q,8_Ew+SFnL= !(;f)-E6Qa]qҧ"wsfP$Cr dGYɵ7!vRւ
+AM?`ctr.1A$^0?:j6qËD嘓[Fc @*蒦v<z/Y\7]TR5g;qz}@NF`ĖmR;AeJF03IX
+ӎDcer,"! f^-nE[fk:ר`
++Nl t/,fN!-ɗ`z%mzKMZCު?97iE|PMǛT>w{8B+5M br&Zg,Ͷ+)0)vɒ^*ӊQMp#'[ܕ$7 XT
+cqFY݆Ѳ 6e5Ui mdjޔ˛2ޙ漑teԈqM;Kce.>t7L~l%b@:^-W]CK?2Q{?b@}~1CG2&=3_56
+z^5d/!  b܉kx?4]9xt;`P(쉨 ֌j/qC!;<RQj{F0vЧ
+pҷ+|ʾZsI|D8Jv̑딲,t~(q WUM(.kƗc(TN+Iz7ӱ^5G9g@ǧ_;>ooO0 ,]<}? Dc+N09!$W ^L9G} ~H9 x6p-w mBH&e5RJ@{P⭤:R,kwU[o[^@^ǒ IR@RWG"ɫ+Y53g
+%D#PRj($@jMuXPDa Ʌ]JXf,ZF@YK\Oo
+&oP;R?΅*8~<WrmrM،C,%9ͤ|^$ _DLx-
+yv|O ʒ}tu}(qkqދhk!3g5׻0&<DG_n<<MO])8:'2יpS
+P-&ږ-D<XGd8z0֔1̺E~т'Oe++ʄ} v2Cg&&jkrm w8El+@ Zw!!Mi6O=| %'NR*P=؛'DғB}ÇWjD-h!3dQ:XjBW1Fl9Qk]= c^FѾ: 1a.~JSF⯨{9#"Jv}P
+_DPAdteDI0\JƐv.[_J|58s\1zcuL#+N!@"Ns4jI}sά7TXv+9%EW{(FTf\CM__L$IFxPffc2Ii^0
+W}sfr8@9
+SV Q-<LWF_"r:BL:>@Xyҷ-b54"nnz
+!?J<ďy١^^ɘc՛Twhv2KWi{Zu#;'i*dsJð5_Š|S{*tr²3
+>Y#?)}A=ߵ"CҴ
+wC
+2Im
+rٹ>1u]SS1./gw@ɉOJcNbh &Ol$g'[t69ւ(S}ڌF+ ^^#ޔ߶ihOt7<4o +";B1Yg
+_]1P |O$$v #m[iҜa} %3I; W~?66U)f;"oWh3JQHh,=cS{
+#ROf)N e_{OəLTp,8$EM.@Wӵ ~`N;O 8GsHlC// h\@Gz0 &+o2Nq-H՘u}]K708ߕ a,1`Ke? 83w
+NS:۠)QG:|?Wb9{iq I1qiW=5J>aҋs
+4 DuajM8KXߎ*!B<Xjˇ91Z Abn dcAWH|CJ`E439l8Fv{ZҙyW]rMd˂@cF2Xf^((U_(E1-띌Ղ
+S}T5&d^
+
++z=zČ~g&
+@&>m0Ӽ;nXY~9qf;\fw\9.J#.H!CO _*h&MCl*U1KcWӍE&z1 w7s妊(1L@L2
+L8@Q׈
+H J
+٦_EDwqб݉{YXOU5M.#LV(V<
+`d
+e0{(vVo1ʸ;.^Vx!e Bqrq1@֯e(*Sf@igY 5W
+VSmh A+ $*(!(b>q/i務:XO=Z#yֶ ?$j@FZl=\}R%KG緯B현QQ6"E,a
+ DCo>4􉚎q?[A(hVn$Pވ ADa>=EŒ.#븿~Dć
+. XQQ
+țA7r=DE߾= ؠ* q$|;Л &v4B%$ʈ[{/<@ߤ_k[:6OJǤi\y1<Z!i11lPwKH.4HxVÓ6XY]>a|GU )@(/m;Y.N~2l"I8
+5bi2>DLB?;ہL_x()Bv4#r!.w $Kv죘'(6\ꦫ^(j{
+U@Bl anvE2u>
+o u෗. {Gj'8
+ԷJIi̧g1YMoxv \;[jUfnuQMF&Yz .Ƃ!Mg蓎CX:k|&
+hZUQ F]&@#J8-
+XD|DuZKb`e٢0WⳄS0 Bw=>7p*Ry qquAO¸pO|TDj-> B6YGx|F-ezzMs否XE,q,J ^)qŕOJ8 6\1Ō5x @rќ:Ù}nZq*O=89L$jV̇n-4)z0$
+w<+1K[qRe |&eIs7D@18ĀӨ&!r a_A69˫L/a(^\(SJSciJbX&>F.DKx!lVzEz [Uϸ<#h-?!
+DAwXX#$Rm>ozezIU% m] .aC`L=O c0FK,JB]< gvwzt3()Se o+ \Ѱې.T#NA;C|>W=<iU?4%ǬyC9Dl搭pWkn )APf6+,yWy;$wdȓ?|9(~e$ɍCu6ZۺzumO
+wz+M)#~p
+"W.!\˗ ffXm䆇C焌gPI9LͤsOѬ=F No](L2oVm{)G Т7V`pmtÈ|HE[]@e qݏChhuaeU|4dNPq
+OfUQ)fr 5+Ydb]v#a;(:>HnB14P 2GJ|ĠBZ^bee!@$pƭ@Pl/WBMvsv6p5w/XRp*F@@'Fa4Խ1u0kI3$ƎwbG(C&
+ےƒ0f1;Imj]>Ȋrݚy<<dAhWe,7`}/M_ˆ5{3Ţk}<$
+HBEW`  =OF KLУFT/y=ek5'`zbN"Y&3%ar\6FRSfV
+u=R>,t0 ɭ1Hn'ϩ8m'rapM*\ԻAe6\|f%W,Mt
+Q6 ki`ʫh"ESN$w'[uníH\/[sKn )ȍnDor m5Xtbu
+ؔ#`V3-o9dq9NTQB,2*n)k6>) gV4l1ѩXH+dXrVr+CDR
+)N%]^!~ʠ 4:)h
+U>
+=EV qP쩌udhT
+g%7Ф7 ֡X9B=AP&:Z> ,'gn$;2^[:N0v"֑!q= -~b
+;fd:җ2]O֙=#ÜK. 42( L#["N<;u)ܛ1I 6{^`0؉a
+֑&Jdطzqպ0VK;9RD
+FykD|C2l( 4|ʈZeչ˴3+d%H!h0.GDLxpNTx2:JZ.ӅH^ě;rW`m(wUN 3]4DT\)պB+rj^j~7F%<9gSo+ʽ)
+/gȷXI#
+; õs ԎýNKp$# *oe0Z cVQxƈ2Ԩ4)1$E f"hlT%vމrz;OxT)v9J_?NE'Gˁ112E(GIBAWYN"@ĨK$=om#Œb2.Y@[-QDx
+3xlhIg{qA+ǪRDr[ &=!tcճ|<}jV}4N_#2˸ש1r@l!WLҧۊ~KGG# x
+Rm)hWrTR[٥H5Q1:)Fx.2~?'St3Ds~F5ԑ*FO{Qep)$)y&7M
+P @-9%~+468_r+U%0y,kO;xh+*+eT\TtUP%̖ ]٧f9OW1O\OQ,=hxqm<{/ĦGGSZ'xV4ЎhRq~Qt\b84RZU'-ۥUePW*V=ZNI"2!\,C r9
+ ޣYFe4#Ƞ]ES ݐN2
+ފ]a%:c+G^X!"Y*\70
+㧊*&JK y}I>E}ɰ۷I7>
+o*ŚKp9R»!Fxrq^_2EgNٌ@_o٩ZIivցq0]nlCÔ~jږf'D=OYir%g7fЦg /BeR706DA1JrjCqSx+~A:'A`cZiW[qEܔL^H|x& uˀ_=u~#NngMSku ڽ+*_L͌4D.! (B_U=>t>]F+o*2KtDD9b18щ|-/Ay?{?CM LFӫ-XdA!jo^h 6{8`&MN}dOm1А
+届3 `q~bN$9}H켊(R[q j;B맑k)ˮmX#ѣ;73>Y1'@ݢ2αC cFW"E(>kݵ2# N!رj* OXf)ي"[v|FP܅ g+BJ <k AM._?t O+ivѦ5.EE-?~nfi##p6dr]Ҝ6g/&e C@Wy?Kc }8(ʿ%=#U^##ojKTgCR{UcB|l9}+LC)˿GERfn~Q@P{N1#$'ܲu.Wtn32C
+n4Xa13Q**0O}7IJ@nBTW #FۏcXK^ĝ!-w &&{SBPE WJKƨeDŧ#(
+葆{9\AB|I,6W{I |._Eg@@졂hc^&L{Ent'ШP'Nd&SZv2QR
+ ic/IIN+I}PJ<u eL7fw δRx~4;HymuAwQf/a
+~ ,Yew BNP
+DhFkY|+|*L.x(a:$?
+HAd9
+DOPw Luofʾv_(l*Eeq/CLwW9g!sE}ͯ{iZP}.km7hiyZ:gt |m5̧ =.˂kHXNJjebv)R"+2rAn]5}6[~tj`,O*1ZH,wy &բC~uhAb(q EL**hKTkڨsz}jnyom^U1 S9*Ia>'&D6vOnɑ5x@PS =3VYR2v<Z5ؐIV^51f'jCBg}up>g M˧6&wrHKAƗz܁~6KrR,#oC |uUgϷ'5
+=0: <&_/1XsXU/|MqqnL(uӕ B+G h[;}fT4[}mʝzgAZpJ!~B!|R oT]6O}`
+ l$K} 9<Kh)'+O @J Ӂ&q^ ϛxmj!-`׹yPB-FHrAFq|06A<@IԌt>u| !&uB=_mByL'c`f_S<"ArҿJPJJCˋ$CK79 OM6sRҡ0e)94 SR&F>@B?nr%t+Rep~Jtp
+ iMEafN-]*ZKüU
+n&|tBy^m%6MJH 2oCWiRs}&)6yB'y !EPZ<&5F%U$M4(ӫ )
+nCbxw|zr{exy@V㰬GmyߒTI?
+
+u8p d^p,Tb󙼜# g M>l1jE9hU 2ޤr}W\K:=f %wݧ)kG2%>O v p=tV_8svN+'IMԫv%6̦8[Hl)1.pBQNF*Sa imVv>t9x37EbHSqR'8Da[`)Å)I%tA(bD%9T."4%P8T4F"옱ID+ QZ~i!h1ӿSz1tx-dR2>f9d7-PBO$$NA$,&'Rnlī$3299+06ȊCr|[<T~A[8>@#ōD+tv؁3s2zxKz"Y[*T_8\um\ue:)( fQm$.d
+<݆!Ч^y-euNteœя j'T`&%6MPv r;zyLQۖ4+'$Lb[x
+)qde,!pRYN0ಘg au Qf?L}i C".~1$HY2 +)IcE;-
+ujٷЫo>ip2`ꐤͩEs
+~<A|n~DYO hkӯhQېa//uCFܐ!xLQգ<v02V=Q>2Q$EF= Y24?2/)w%6tx'1S*)@{:Gi:q$lX5?OSՙ̋$;aIqJ^,ʼnQC0=͊*ZЯÏҴB͂sb m,* }0i-$\X $-&<
+>vU?BAu _ƀ(U55}VsՕnН^0DZvtC iAFZbc7BA<N4)@B][Ǡ!0p^KS@QdI:ae:eZg 9Gamu#HqpX(I
+^!x.vZgh"A-}[e \M:o&AB9G>AW?%<@npB<fs[t%$(՝db# XAX1VL$LôV::I >$ &C¤
+J?|ZQ1JP@j 6zAJ93 o`d*TZR!#Z}m5lJiq;r)j/bNE
+Ze@d$
+ cɍ2A /
+h =-<dA+p3%e(03Y/ ӆU&l!yN0 AO "ITY€ Rr\ oTT ~):A#2T?ONŠ&ߊ Ueq#e h&"]'F(DX΄ Kt+ClL4Ԏ.
+"q4Yk
+NJWI'e'aAh6
+rZG^S݊+xJ`|o`8|wgpY66-l{0:§uE^
+b:,Ҡ[#}t[D?A}u'VNVv8+2ȘĒ|dp%: 'x YG&U
+YcKU%#67EL4<8Alڡ@Q>5 . hNQHc[onq.k3J\ \$'cP1OyѲЧ^
+
+7^vr̂3vxu^JWcƛe iL7#ao12!D0`9iUk>2mE2~"e
+aMJ+@M 'kBR^&rA=<RL+[gFTW6aO)9:u0 X(|;*A4t6x8+3ELa aב%|36u{{$ |'vbrWgMu"}`pB!m&c?:T€ {@u17o9q542 zl)NAs)kTA`uϤ
+7N17l ̓k5a*Q5'])0jl5L*]%ѥhtqȐУ/hki+[ɷ/?įh.!n$,_">z,hMh?}|q4zRPJܪN2X h!P-'1Liߴ~ҳ"mt/sxhv*a,
+ Z< M7<5!,%57-@bl !\*g[-5|<Zzg[=ڜS͌v^*$\!ɋS߉zͥv# K4
+.@cKaM]wꤤWd0-m-Ȁ#wY'Y_uApoTe&&Ve]C(jD(Gsk՛HSDL^-_@9侥)r
+5 PJR,ۋAWAKx$Ȥ-Xr\)i[uĎ1F] .OnE=x$)A"`6FANƥunVBQ_ޟ׸}gXRVZUa%@q[+1ô} `cB`v@3%! >س/(K:EV=QbJڛs-6:SDK?t<;pt
+(8`f1D֚Q9%"ҿe%JdEnC=Ӧ%k{^!X>]0ӺFZPմ.5
+Gz$TX{3!ٶ)co0jM(-jvy oU8~ ,]K
+ZJWCAHdV<~ ܫ=%7UZ﷬>h_΅xOhK&2*|= Q(323 +*1fϯ[JW.@[VaEe} C2 4$
+UAILȇw{`JZ^0?4
+;)wQ
+ it-u7
+z7 գU߁vdrqzIz[P=y1oΖ<Q!lnz()"/A/Or䯔-zM|
+u,U[!A{2w؅ѣ*43p~[=6A  v6X* z;OW}D m-蟇AaqQІdʋV'HU;Ry |ϲ|Phzg٠)9&dPAs"<FOuDIӑԠ4Ë=iBJѬ
+Zde,*O;0g*a&IIj0?*X1RT T,t"2qȳ&bt Z<$NCԵha 3 PD Ue; k#a1nx:hRBRctMFK}gZ$k[Gu U/S&uBf(? Nʓ7MՐe*e#HWɒc A1^(r]Nt
+
+& ބ>Cإ~I vᗙ$'Iw K x#S@9 Ep$Z!mVf xu =*L
++B݃9``86^sJ<Jc9)v|,xww IZ k؀YQd0P^|T(Q&"K)^@oP%+m}0IȀuErb*]b;d 5I/|Q5m;/cP e^HCțGTGQ2hd8|X]Τ k =3r*_3‚[Ikgס;&CI:q  L% ^$gKuWLe ~ty*Z3su) gg*h!ܖZ^,<e-d!]5ݸHXzX 'G`ȱ!`;c9bD{e-u[c,
+/s'UhS<;,?
+@?]Ny6z៵
+Ac#%qkfimx 5).Xպ[u<+ɚw)Kko>CO+[2:a) H֋1s)|FQ@NVv Ġճ!(nGKB?\dUJMQ(Fk+1~OS,+=t))qke΅(p | #bId]GE^gYS8'J 6eFz<EN._s UC!Z73 Z
+I1t=ݓ4h/WG-H`M rX21tigUyUQW坅CQVZJUC`\,DWF~&-E9% )"A!o=:Yo/Y%tg \fmut
+ Sph`Bbӌ`A$&*UsZ-Ƒ9gf$` iD˜fkʟ$J(Qf3Ro,]i-_
+eCVȐ Y]GuH
+Gqq9F3\c\r*0HD~ z
+"%CwUIS]U+]͊ϻTX"yڱ )kxdR'̨[sq7A "qO|ވH~Jmml*!:`v˵A_b\4p9 `:.Ơ.0Qv Ċ"vX(`uz?ً&D|PsoJ<6(!!GpS?E; &7Af K ʼ'nC,wFſO¼Xe<~D-LrvB>x®
+_%kpl"~x LD{:qYTHfنAAlXB쇓%o)" J?I-Kg3.f_q`>,߲Ƌ1RłCZU"MbC g
+⇒c1('",+vZ *.C;ll3F*HYZhV~;?=rqG#$/!";6!F>`;+VLDeV`
+KCcP{c#][$Wy08] ބ֔]Up])aiDտ"Q!F@])`8bVS[:o%h1^Y.a2x,_lb
+ՊVT*[A1gLldۑjr`f*7+0insRhSXꊳkl>R ?
+Q2*S}G@Iy5/YJÝ15<7i.C0:RsGJzäZ":䵺9.^jsh6Pqga%0";b1fWdy"ad`cimx8۔f@㍧AjK@<MهU *"0r(qx.w"9+7bqyɲ$%75FR<8$@ZÎY ;$&_iRЃ5WBDAYn[f25|fn- 3C1#K'FYD5n#I sֆ_T"D*FJɖr˩SS$ͨ_ZsRmV#({SPfQdItߗO?yK|;sр!
+peJ
+]
+.KYH -Q1vte\(ddcVo`$Y\r`Jr9rf|Sf:0%>R$We q 4X0p7/5S VJA?4O  XJtՉ(5^8DoVD6]32E% ^/.hZIUme.`wHՋf<7)E'+ݡn+{!{ [gZAYQ gIaP0¾z=(Opf1+ ̟4l6J04iI<0r~Jv <n&}gHz!\|[^7 ȈgX.j%a"Sxb
+8_dHcjP[Q\F3r39Sx"\ϽZ,1q(Mn#Bn'@}pux[@":][! Җ} s"MPUO{peÁ5Qpƙ
+%;bh`/v Ҵ}xnf~, zwN9/"F2Ch4e*jPhðqbmyM2e9K @/|6
+ Y1fqz,G >74y6oSPYx3籷g;W藈;7K\37].h D7LSsMsm~D\J~
+~9"3GK+^ o7
+ɚMTSYHz;()i5G'$D>bx)3 _%Lĥ搌Խ6cJq9/!4J˻(HhE%^˟ޝcD Qł!$JN`6U¤OnM-}q ֍ sꝋS0-GHT&{Qo. K8IxQr_?v3p4$l|m 
+ƺ9HdY|yǔs؈Kr C_g;'.sA̮%ګB46y?mup1iŻ7rHݜݡ{d
+ ay{;Bw]
+g@D"r
+2> +1Ǭ9 > ɂjeErLTeto]V?Q2~5[D{ D.*c;SlqψBu tEn*0XXQZPB# A.b;'+]Kf W7 L4/@t% $̊;#Ȧ"`A~>UXwd^xzA``)K$UmAU 8C_>~Ah8~
+LWd6?"^.8Xth&[\
+1C !5{i{aDCpoJ]HDmF^E3gؗér'&zzF.9|&RkgFV0"+cs
+!ۻ$K7: OZW6C~/[/f2,L"mgaqIFQN^dIȎ l0D7"-Gm , Xo W
+0H"Er (!i׹%GCґo,xnaShZ!B+Sn7b)sZ!rg팡EU2ϝhs]]ȱ$vJJ`_M}&O-&jb^e)9ISm͠,QCk݅d,jpݲA8 Ƀ>]Ev#zs
+ISʳ\&R3aveR2<h4X8XQ:g43 C1&>#\=bB)=ל19ݰ!!(?X c8:>% yhFkQo-dyǟi|;WMdtK軍{X%z{;|2`7v!O6141vCTǰ6O=o{g }g"ipgҏ {QW;CdZ[1$>太͇v߸Ck碵Ma~ub 6N;GyqˁU<jk(Q<g]LMbn Vc"~<iB(J)JK9&?{"S(cljS@!ES$C p̓*'[IQ\JlK8D7'RE\4ވNDeI#I1{ZM"0hרA?0SAZ+|r׬{A>^W0{+W:撿p.
+Cd7"hH<s2]+;|( jQӤFqN,s*G|qA2_Q*3zx)髛E
+ լX8$d9̜@Mѕ M@t)z!Mkm@X!;g R"RK2R
+ orO
+ p͕U,'ڨ
+ECGte9D~.]KqiUG)b&>h/#m~ԓL{DZ0k&? 0Yj(_!^3Ѩ<|>YuC9I{tɼCv|N} I*&З"׊ J"a)⒊E j$Ku|ccb=OE"W)7b%C1^XM1Ub|+@S[)Rl YGaPKZyweZlss!KBdzr"O:8pq=~&KvSl#ԍm ȹLuAXxNְ`
+y$6[T,xLMD5ҼG8~\svh8}q̀/qmH1R#0{b=d #]E>C_G"[W4AP~h hFfP8J:4eiO X|Tpx
+Ɯia*<QVEUd%Y=ƻ'#7_l Ib4)[TmErIz]K6RK"Mgy= Dc)"xѳ`4)tJʫB`Cɒ$b tI5$U=0HsXQle͐pn[ Z_ W
+BrtF4Ra>Yw
+@D1Kj[:x6FC
+1u )2Ylm}-ɑe ?0Ee'ȁ S\9-߱. ɸ0!LIe@քڄt\Z= y6}ǺD{!W%ױ3 ˒p?g9A:ž6_mg55A?{ 0Ӱ&-_JQFg<D`[)7Wx
+M
+ͤFdma`wvRC(g3?cp5z GOrbG hT RJčI0;Y{,eޔ{KLrU<;D/{ 5<=k).LQ*H1Î` %E!h5ź$ZeiR 0bVjXqqg3t]{sBi3I1<-yX.a_&ȄW"ޜ=x\C
+Vd.A^DayP9<BU<$́|ۼ_|R+0dzP5c G'1.=s}yH(њʀ
+oR?̀ƍ_yQf8qT@`略0"?^V0Ym^ב}V iUaQJPfq=A.d~C A8 ^(Z
+b[9E2z;L*UX+#!jm*nXЄ]ia'!`܋>HwtxT
+:Q2/%_$daH&TܜmBo}?Qņ=9wh~lfJMP, ܶE_&,tnS<aǤ;|gao{ơVOlNR[A@.~*Ȩp)W
+HA\9DO;&!R)=KߢY￝/q} D a2ԾK$dS79nݛ 瘽@=LFs}\6ml=Z3ߐ6}pW \|Z>'7ۈ q!֤:eaP}mt:o"s}.D숐W>9z4I^c[=GW宖C$Y z#Pbb_ @?|;ZFa$WTјs};.EgH{!S:.s]\
+nyO.}e-P+Zhd Rz6$5W>@ Zf u~tu
+^H!]+Pv1׈tzqGa\"QܸIl0 6 9w<ۦ|JJڹv僜R9\~ 킬m*tdet=6EdjoFY2Uz"m)L1w*M9HJ+ qCs1ȷ!(i
+K&\tL9@n{!}(a64yW!*Ț;kVTHT;)S{tf,ch5q S0׈]ŤxwV߿=A!r~Pvt9w01LgPGa#2 1zI&`@WujCuV1rH4 k N)OqAQͥaXen! cݐ,h:.IBCL@9JXǓx%c.er@[P^:E2 J9]Sx##o@)tt܈ F
+,N5V|kB s~rkF$A JTxΡ)v
+
+Y-147 "F'_LSw V҅/##Ȯnڋaʟ^/v1tJvu
+fJaK42xh}(QdsXdP$ݲzeJM"_HtB\T#_6tjG?}Sw=@cd#-46Nd֗!-T}+/ON=5Xx֮-q]yC'I0E,=^ 6i .`x[L0eXŌ@?w
+) }k$%uK!{ˆNo7< Mms1a%E2GhiZ=אn C 1{>Q |9:5 4H~O^NΎmH
+h{W1qճ0PSgI2
+H$x+BWB!PuxV%Sp/<eanG%xd< o*%yxh9[yV69!J=َ41qȇ䰑(zC2؁4'4&9C^}d%VH2B U1 [Ky Q67q'p,y('fǧS45f&pp8nJx),R${IV,ɂ>VOEL$$^ `\,8 2&(0ǘ'<4s?3=hG`fA": f)(WCKE\& z)X@aTR(ډo SyHȈ ]xS}rTqxEo|:r#z⑑4(^RBrR@6ttցz$Ib0f]8%;aH"DG3P<`&lJjQ\|^ M {zCx@#~V{x
+', D0` @?wO\ Kٌ%\ѤowOETI}3.M7Ʀ\!my .u$bp²h^<=g_?O\~^T,R;P"7R ~;𴱑کYȂ!+-!b#M*e26=&IJlb)H ptlm>XL%U.E__0ra6r
+bx&Rg$..π0$$R[%)af/{TjF<p4<_o)V Uub$`ֽa<f(M
+k:#u6rpT"ޭ;2rT83tl{XT*%N /ab fz|?%2Q۷+>Vf;U@vuDI|&òKh 5,WI' W+
+0 XP@ Y>Y^Ŗ\QBrQ)ME$ka!3OEVϊ5~0j#񢨁XFA\ӗg7[Y@7F
+S
+҉<3% C@gHX ^4f<|)ٽh`װ}E,3>C %@hkҥoCŲPTE ~fK k 0Ԕ=;w
+:cL<
+VT¨Jбc-fJyPX&^Ջ}dFAiX:5ǡU +,6Ïʼ[Q f@Ms\J~ s٦:9uaFs3[Xe8BCt}ð ^X5x9 2J~t2 3~R^TB 6Tqp/o+b{14c)W}<5^ +CKLJ|e]ǰtdȲdg)0w-BC A>^IYifHF`E< z8?,@Fr72e
+8\<&ohܢ %]]A_ +(Qԉb'`[ 9esŸgAbb 0oApK0{PrAdX^#2XXN07ckÕ <m  ,e&4rTۜl=ʙE?nسx2})uh3] ik COG<*M"!D]ݯQDdO)1DUy
+S1,Y5l\wt~S.`Q4Ԏ` Ҍtz%_sUeE[? ⠂~zŠQ@9L`O1V:%lMu9ǣC>,L7߉&ZPo0f?V*ԾCv5bCZ 9mQ2 !{XxnV]E)XQ\Nyh;vcѼ#0m{DU-KjjwN oYAᛠ1~Vʈh2/hl^D^9}Mj9ҠlSI@!Ѥ럋IJc"q2XH)1ˠ!-,2)0r)7:-Zqލ@>%N@BaC)g6!$#%~a>^pwlc~hS↰Nn5{`pbѿ>u+]-KtRa{دF|F
+/𧩘*fY~p@,:_,AEG:_Ƚv
++1
+AT:=]</!rf&Щ" =g\y>W|6!" 9
+ro<
+rWGq߿{!?2__B{
+I 瀘x|QncBr(]maCg8gE$0FO5˘ڙ^%"$M©9
+zc9sZn)b
+z갼7[4n`]1,;A
+AQQ%$v97 fre,
+
+Uß@d ifS,/~?Nz㑕^>qac=3@ `eCp*'A "\Q|b?:@QD)HUnQZ~b<$3Txz{1S!&
+苏.nqy=缵ӞK;}=^AܵOڃEA T֌ysyßo[M1ؓpSe]%tk0; 1 T=H*%]{n OVҋps&ȗ>ǭsC j st<ir2f d,U5_{*c@6@9ʌf L=hP
+nמVܵYi~iB ]Pq'_CCcBc@DG@뤁sM$M< =2b>);0O?Ulެe@R|^#ڕjFvx`Jⵁv!zdeFJLA61{
+咹Ւ6`fuuHJ2ҹ
+ fD7n\M_k,µZ3Ԑ׼)[H똭@ZdKh@ J 8?|PPlG&ܑ_ ѨeĹ\Zڄ$l}5<jm9M..>ui~v Sd1qx-4kǽYD83<&dy=<Ѣȸվ2Ĩ|]F#m\3((m`=ͬaYB3kY'v+fUdz2gIz d<b)'6>"wx$Yr0tZ ?zCUj25Z) lEclwA>
+p@{s+| >ȏF2;IyT=`̒"ǂ$\
+kX_;⟍\! F+M(|s|x[▒{eD*DMԥ@ؚ091b~΍58컿a1T!xpD䟝<mXb>6$Y<4ѿ\͸~zNEF?%{g}P QG&FWg
+ŰOT͛nYcgKfq8O 0zEju!#t#G' 
+_ҽ>}UpQyUCSKyG:[%Of+z(j?!4=eYnב=#)ƀ
+>5<-ǽE~á`G?'y\R{%JZ$a<g֕GT`<G>|'XS>?ri\;} 0l9:D.iR?(Ub儽`̋e{$ۓy1y"%l/$*Oнk
+V9*x 8+T(HDH3ا23(*SVur-Ζ&e1mNS>wܰFT{1QȈb;E9볔?!?Ƙ\GE3^u-~CCSK;
+6)Sy}lI$:^mm Ԩ*}; ͚czJ*חuR*7O{V(̂U>>BOVF9~w +h2FK P/lNM%%$_xSx܃x>sJ]4݁ITq~|W~ @Qf~d9fB<NʘFV< QiA0<O>'7k RX@AV ILTϩH $fmȐOrQB)@2aCumݒ\1˓ݭ<b†u ѭ!" L%bkԴ[w?Q
+{q 7/ZYö)S,(x0t6Z@r Ir%EW=h웱<.<}%A_&oW "mJR:J nX;WQft'M,} A7
+GyH<. :23| 3-<ť99 άQXt[Ot-*U AI
+h2p'G^\ N#YNZ B߈rΆYC#v㲀,4;api};up
+ `_{1C9>mi2ðl)p0:<& A<=`8C8k0 a a5do
+`vX
+;`7{aRyueX&@.p=KԽnkjP &E"=k${  Xhl (±C0ENˊ
+vM
+3ڞ5|)"n}``c}u}zz;#d͠u`œu0”.xE@i韃 "ز fiiQs8
+kރ~o
+}{mW=1W0Q"R"@([!g;\b EZ!Ȏŗ/1_Hq5L<EA5aZqyi؂bIٛv"֏vu]Tlyg%$6bEIes0Jnjy?
+uq 5)h
+zAËoK@ JJg1,}pGiT[ U0< .o(`>}&
+1
+g
+Ki-̄xw#{ĢSX>G9'<&$)ų^EގhzSsd1
+:gC9"{9yBQRL-|kR`&DmI_:L{OZ˕K0=*#g?a=?hc,B_fGoX>B{˩L܁wqoCX ^d2mQ۱jX[[糕\<T{RjT߇ZV(*OvסD*uf<a^uX;Γ{Sy6BޠY%&~QW
+Qfwr@IP@ȳcb0<;ź!(<!:jv-[Xn,+ɝ]su3Rc[|zCهx"oh9s(fSҸ|7,/$An!
+"D  Q΂GdY73]7/Z'6&tK"0ZڵNfV\ɲHEЏCtoU8#Y|TeXWwu !!eԻ[ VAi_aj_!UŽ ޙ4JǨ f&6J9 i"S\sVCNtEU:Yi~
+1Lr E@p^۾va  t9ƛf?}U㯘G KAD'h Ym:Q5cC"Bk:\z^i[B@FmG1h_$+RN2#tY+X-"/9
+Tf!udjOOA:PjCӆ%3ϹܧwķJFW ے0Ĝ;<9_Ap
+]fegr7Wq+Cv@lKu.m~.mmoOCWb]€Z-GeŦV^وv@.i\>r&^ My~(#Aqt70 Gxcs*'?<ɱD:N"{
+LlpWElInH:QbOto#Yi_d|1oDzZGiMAgi nO&G/Ք:bdg2T( `e90ɬR;kDg̍O1 ven/. z2V)ާ74w(UC?/Y}9l{އ¡4&Ś B2Փ(QꪪC%;eAnU,vmՓu1:*Nua/*?eGnD\yX:襶>;j{@UV
+-=}?~A~#ؚ|'Gn;u[V#vb)piNn2ΔzVd@x:F-nv1~P׏6U d0W4a6h"޿"ֆwkjyWkw
+)y^1>7gt-jX[|x)Qu9H*ǀ_9,Ot8a@
+uϙﴆ@qO@湇HN@[ט>C9׉$J*EWS¥ܢ!2<
+6܎샯i>mw39E}4g A =r9-N%hE=vB{#UW9,9,/H%$,T{}hWV.` J\. "iizIE+R <"p+ˋ'sG
+f/2+ <]&ޥ0diwU3ʚ>qBW1^ȇ~@ UFF 'wTiB!i} z2;qJ
+_GN_.C4䈦e4g-
+72ڇ0!&Pn2De؊fja|4C1#vuwb'g@__,6X ToXhS?jҤ f6.{8h*16\
+ O5r>'Q'vS8 "kE݇9QHH'@4:9/-wnsUtMW56Vt퀶`±!u,'M*b%@KR)-:A|r8kh͑5և?nS?`S߼ޱ2 CA?|ˡN,qMY曍*Ko\;֗ kl
+\
+dC nt4*-o{K?]<yaRs@.f؋<DtA14ݬ3
+!M sR8ELCnWpA_%`~M$F&<O~i);FO]A|!cpפ0Gr3Qe_iޛWa C+&۩ :px (g/q6Z?mԇTxGѤx,oSdє*֥9MzX:!$Vy,1鼋T37dI-}gAc }Ek@Jbњ
+S!3eH%A =/]IV}~> dfg~?S<i39AюB! Dh[?[^IѤ"vJLx!J
+HMrd7O;XkEGJ}| *--H$Hqj0mE4Jr5[ƻy޽>!mH3q3!ka!]j C^ZFk˲@Kf]FWڔt~[
+%D.' UytwE_WZmEL;i 8$jyԝҺU+P\FbHxxsSoފ*&E~o˼\E4~ɣ[u2}ATD:' 5,fRHW{}@cAyvқ7
+*$Zx4jGNmo1z_Pg,]p8.ϧ#ZmVF}_|FG !-`iBjQ4
+["檑:At-(@߮c˨5l; <xCG["^
+)Ek5I!0Hc#PZi{VG7
+dj0%H
+f2GHgۏC <sĽD$)E9\@z? lmPfS 3,T}_eO $ɊNA%ڎCaspg"*`>vMWIz-=餻NuXj#>~=&R@hJu$3Sr8m {Q<u
+& Fgl*lr2d\#+
+Z:JNNk`nbح ^nP%g;w8+Hb@Ov,2_:=Z-7)?rs&[O 6:s dx~ftߗ8ѧݫвnl1+`ťߌ6|m>P׺̅ƂQI~> vy_H-1N/VY9nTB}е=1]Í1};D||V
+c*_䔜%E`zM[9limمq 3C)&-ƀN6si k] 9^c+l|t$E[3_Q8#h \p! {m7?H= dtx/h F̝26}1܍Ū=&r9<XUQQR"+fCo_|ߖC0ItZg4SPZ?)|ю>a7ʽ6ض2zͽg4xnz?YgLLدS̚>'{#U*KRlAMxRURA
+gMz } GA Sk0HBNNKdbVSLLe߷az*i?c+'xaSc~Kg3O"`ކ{dZyjI=4T]T˕0i& İEW6T>!
+m~I#n 9TTRcR=zBSm%o[i| G_֛!IAhT5a"ên/ŒN7,ƲYφGe
+qM7`O K{3o5(ԹyQH-A&
+a/<]e>EUf">*$Yc~]BfveH'df-?:'<M?VA7_"Iᎀ )>aBY\La>V;IS{
+2 ?|Lgc7?q($B*ybEQ<
+<N%-.—uTy~xs0S^ȃ,jA
+5
+0]}/pw(~EQ`+8ra
+9|uᅓWكI`HN[E8w\}Ȅ\Jm ZI l]fP3#u*پFLh)送Pz^NR[| K#{Td-=w ߢA<y)9L/Dz"`;QNF <e0ccW3%죀2/֝YS^^DINa_K w~9$NE+砿ᬋIb{GbZL!\jT+"zX h>3 $,p4}AM2(?1ǼzjǹK0rO dT!`j"Kw*}:0
+zeoLmGŪOҕ\"E<|<a}% }yq2O<JO2k5k |d1q0 U7OF}[.V6~9ja-S K%XV
+d l,FYǼsὨt j H3m1KEcy`:
+<61 ֻğ ch:,κ~7 0)FެKMf0M41ua Sc.n;
+͊!a l'@̆`_aqxIӷ*=b0!
+ SlcnuFT.YI5>p]xG87OYGrIV
+Q?ƚj@evm>;!E
+KLtZKKQ5׌2`x艎k&2jw~Isͯ{M6v—{5)ݞRQ:! qW ۑEs*nN¨_Qҡ&B&е'k
++ns-]\ =6E$A0b~_W@5F3{<AČ9?(H,33I{B9N#@9X,G
+_=AW^5^/D}Bg"wrw.̀0Cԋ? ox|QFHagh* ~A=9DI6k`Ü1;<ɣɊ
+%Qȹn ^@ FeQ2kŮ4CA@BA3^ 7BޱzB| u ,qp42ڥכsEXF硏c4@]s 4 u2Ψ@ -!`^ވx3bsB߁(4,}?G)]=f;jroXOr;*)v:+kRB' nlM7]Л'V
+1 2h5oA<.2&EĄMqw/%RVhZ/y3d&[e&xcNh$%ko|_o6"5v9ӾK2OVތ.uGՁ
+Lw-u"=ZLC񮻁,e@܍ >ql V%2ISӥ4܇ibK>i=H~
+qE^%{C*W5Hmޫ܍$G}cFR:&'J$O`(yv +}B;F$7Dp*iޔ|П?.E^ψ!&K(zv(zRh=>PlZ"eI։'05dXj<IY]?C% Hlz{+<4D* LL{,`G BbG
+KF䧺N(Φ oRdhseI1wc˼1_ݶ$q7G;ؙV2{40W*IߋDAE{*~fc٨iP{2muPު'WcNXoRœu?[=}&Գh4b(@n
+̲KU)ѣ`4PE*|ko!Qٯ
+_N! w n(7 }5ג{$DtR͚xs-"n"s\=.{cDJ\A%f;8jU//$zz"߭hhh>[a;pIWͿB"=9]thK9[,IO&H22BҴTܰh{|S-`{< r9"P e
+P
+6!-JMir} TĤ`=bC7׎t 1Q<\Dzhi(/k @zŌB"NL!֑5WIagә x5
+q}%f1|%CdT۠uvܼD.Ca=6/El4x!5h>xG
+jscE
+zhsD[ 8" | n% 
+ Ir}ͅ*Y(HX<;RK@W.J0:pb„&aʝ?Pio룷l#=)zLNV?dX",tK-^:˥+9$% %N&ە2~ w{x
+$Îw+ +rg(x$ɕAC .-uޒ9%~YZLz1MtnHW?&C&d}J*DJa oA(M~S`pRSA V0[NO}l6u2 7[0S` d1;Gaʫ&2J c6s0t@֧v[Cc>Uq'QM
+{"@MZѨ桭Xi7cA{< z94vEC KRE44Lu+R_6K 8$
+sdi#g a{iirˬ* 2s"Oјk%K\ wT?G5=h+ODJ!π/aKag9r*Na;ZP#Go%.^GjuЪ1mDXtVjئYQ?o!b /
+ T:ڻ}^^ NoFp< ]*a^ˤO-*
+_VPDŽ~2@欓:د[cg|:A_+2sdOn
+/eJx_~AG\a\
+Tb4q\0 qv B<)xI>%&d-9ΦH(E>~ zp]p>F49}fʚ &_ur8و870jDs9V:72C, ]:-X`lY5~ s9X`"ޠ GU{if%[<.= ;cqbG 쳂'ƬN>&!ȠShl҅B`Pw{ d@ъIM&)ۦA-m=d蔝B6-; C;'Ph#kz&IV,JW:b|e!XS'ƐWk8L
+b@OFؒ&Dv\~BB𚦹4 1̨(#xS`p|,y_b.=Wy$9ԑ 6481Ӆ| 'O@eV8JS s  BQl=Oo+]%6<ɗy6}t搘/($)L^VlsM$;<ĀvǒKʞ|vܸ99 4sαQcѫ~3. ݑ8s/!RWT* S4}($p } ;)ٴ-VOۢ}SfxAQw ;@|VG "x 4m}3%I-06H"Nnn9$!i :r
+5:m
+Ǐth d.'GQ}Xn[k*0@ H/ގY:QJ
+%.
+s %">4+W4^B
+  S̜-8KkF<*GN{F3ـ6/cae * ɦfh)>Ak; q{"֓1SW2K7MA5FjT%p
+%n2y`[m+hi)g8z} Cdpu*W
+pI:PwJ2> K0Ce9 1õx'r6AKG'f Z4Ӳp:,cQ[J!=0&y\՗DB([B7*r[(:~vP v̒?q{7s@ة$(*@+&LJ
+(/)0d X*h^BlK}DT1`Y =`؇GpiꝙݶvZECWS^c&#~+5pך?%[+x{
+n {J$ }PjÃREHd&+VJ`䜋z@zޮ|={nF܌O^E &n'nQHXO]{(f!Ǘヽ.\;]:0w{͝g u=u9H
+kaͮTsUb,,Uj5pbhmJ,Fs h:w \]$4nVa<w'zʕtLY3q]%D!ӵ[#\<c֢LDž*A02hkޏ>r_8CcL[կ Q3NTE*o;0M<>Pv2%9 #3tdgqSO-98qn蝾B4ΔnDxlB 0 3<% @䌧mH.Q[Gq$~=53?}f$^Uq E+ fZ%F.}lc0fZCrUB0hf@H+wʋGZBRmX8F)zq jE钢{;ڒ.i8+2Ƅ@ zH4"l.4 Vd:2z"R{I56؄@y*@\QgX:;t՟ϟiVA^\& Qy Ze c3+7dlLp 9 BX 6r.ΒZ$؃JAYi?dh
+(F"@ߺ!Cg(~ԥpҸVnSd(VPq~[ P:~DA
+o#bd't\.ӈ. E*hNxH$( ;ǮN TЎ*\!}Rb * @_8h)"Clk@\/aBMOlQ!FB@PӃ.8X{<_gMs[m0ݦ梎ik{
+ׁ3'C֯ b
+
+Ш.nPC6jU wmA6R1ǵKnDcbfMy╇QHPl4`
+o2T* p)'f?v="C:6kКb
+
+BM/d^"-6aސߠlL+-xƆ&"Ǹ S!ntDV\i.vܝu~B-×be';'|z6]R0IF 9 D3qj1}!b XGDڇÿOߘ^RkE{0nW0 Pԭ6{̥cCTJp췟TH+Ay47RJbxyKu /r<|;Xq*%*-o )MJˁ@DYq߲AIH>h [N>pD;p!g6~a r)=$bRn'65RlØIƓ}Z6^# XYi:G};[BZI$#Bڊ c4B"K yETDY]A:-xTU8$cw ,!mkFi'Ӟ6Dƀ,(ި Q(&D-(!S9s VRBDmZ V>la` DVB@a7Вg!xyɕ@ԂLg^iޗ._
+ɜW\nq0舆l Q[NҵG qh6G$g8b#g=q8.bжC 0Yd^RpaLBr/zNvb=?drUXa@t8F^qwh/V0vƠ'E/ ?LI/ hmntgaO>* nـ8
+`[4N ELc
+5NGkc,ѪOۇ495B9v/oR qx\~rgH!+“"IKBGy.0i-"nY;FG@@35̎P'󊟇#vR"E ,3e >+z
+%2DZWUvI
+M4OkuϺ 3ng[XP#@mâ-ƒ;ܳɦr)y\K,`ɑ
+kKw>3-8ߡjܧNBظ<tsa'C?z
+LLI8dњ yC@}~-wx<y񽝗I6ibUUDeKk`x<`N٥
+M5)fp1܋ 5[BNh燒?]Oyٓ(2<;Mfh/*˼!Wdw#e o7LJy)(Wֈ,ay'ZCqJZ5$ ?%sm p1'@~*" #ӯEFN,1Gp.%BLI=4e2Eё.[Uaӄ7F\JoR@g:5F?O(yf/YtrsP!͑0Y񑽴O;'}t 蒢
+7wl09]iL@ƽR<E00H6upWJ X޴
+OS)b`M͖غ|'Ԭ J4bjNRrv` G"6
+ZCtLB6&-1[0_ J
+NYV@W*eʿo~-O8t[4sÕR`ߚ)Ɔl23(to@
+xT7J
+ʛ!ug+0|P_kiXTRa7 Q:Ɗ"o3qb딂=Cfh0j rY$RSVkZG|4t[E{Ts:B?* 2me!@F;)(㴲0DlVCul(ey?)7XPwzDnE2]~h.yrv!؉8uSG@6nRĠ &tHYxJՅ
++ybc7@?]V@y{/vi78[5yUk\'å&~w kV3CEvc먟( &M,FIF꒑=F@~%Ls! L_$LH{Gy?pjoSTeK$p/]Rgx 
+U] DEbBX-@!w#\DrKnAJ䃥N 5XOfKUa,v_^<( … #1 IO6=>n@  ɶVi_{GX=1nu;BV2_$3iA;cr9vEhg)@z/Oh<*@L"x@(VQb,&SXW/b&#sJbk߬6}N
+gH}J1Car+ðbPP3]kC!dn#ybצ83D Us|cҏ me)T9ꟑΏjbӎJ~Y%8(o'sIS9%8z1T llTv^N?wHj"J֯@;Mhx~RPzCO@4mAӤ'hC9خڎ~Y(Ղ ՆPa辶p>/<)u aYR3<h 4o,
+^R@FkH,D7F3!iJPlvqrOSxS;riCCv!x?N:2Pa{C(5WCכ$)G.y5WƄ7I/|ݘRBq!02eh JAtG]i{`>Y-wʉ
+iO9opL?vyH/[v܍ 2
+5 ,v~ݐl,d}'}e'_qɅzaʉ
+> m *J?
+
+LQQ,Qo!/6`QK #E3IUBTT#Af#vNfL+A L%EݵX^)jIF2Rav抌3<ÐƐXڏxI* !(4X7e؋ϰ[" \
+di`V( A*9F{mI/Ckuo^\ɀ󐙐|-BG*TU;J$EfaE@dn6+ ^@;뼂W 6Kk nɨma]_O $]k`_ނqbq?4 zJ<::$~ I@xQ`U
+i^5>7:Ҝ58a% ڵ>lJM3aY'ѯDs7q̟=N]D刷g?;Z]
+A$7fJQʰ_-d+(C!]zԓ
+;Dx|rEX宙e`@ZKұlA^ Z6KVctUbJ˚+(kQ,U-m
++G|vRŁ&pu"Ƨ5BpHbOCd*|9nyI__E ZWXMZ$,C\!ɞv5xe?N
+Bʽ9S/g̐c87Ǽ1޿Qс( *;*h%BBu/ 'ob
+.bp2cK 157kp ;y5&, D}Hè 8ɵVs=@QME
+&bf_g=f4f}1ixGd
+a30eaz߰{YE4 O2)vCX7l&
+U TlPJ R
+͜v6Ǻ?|
+4raʔ>$S]m"*Xt߂ܛÛ2dMvIϬ!\gdBz'I
++a$V5o h߿K_ޑD%Q!ǂX&F]:Նg @!TiCDzXϪ'[g|a4$GD@HQ㌾bK,B4}R [Z=ڋٸ Nb05#LNM&4[\tD ✌p4J <cjjnfZL;隷CD=;mUdC0ȶ`i3CAԌt;*fG>:jQ)$yTI1 M M^~L^Pu
+ _*HMK$d[%>GOǎP1"px $G )0ubM1>(~rO{o*^ObпOAЛ/^
+?-ʣ0" -D<^DT9%vOhGMu+RA$ ¶*t@;.]SRB~.A_ tXy.g8#DCc_ fY!P<Ґ-j/?Xρ坵@mVk(^^+$>4u@sp(w*s$!GĊ'
+HK7 O;Qx\{[*|DgH-ģ?D5\zӾL_|bC5wK gF>6d-F_:/x:cZݦvvk᭯~ƫ5Աbsι eklCO"޽z<wХ0%16թs5b*^Ӗh\x Gv 1P 4W7C秺KL[ S|J"d%ٴ h3$wp[^3a2 uchKݸS#V7ׂ,z`tW.k_U(M8Iʯ/2l:$Ȍ}q 쪕2)ؐ`g w)˙6=52RyUlF&49Rc s܂@3pfVƴ1NиjAq \d}Խ q%JǔQO#}LVb1n^#ڽ!*M3t6|JSNw `ZOaI=Wx&+)푩c0QtZsB{Qh#UH"3(&301<}֝:{j pcO94%8\,rMALbN]E %qK.®n+kAURc DiW5RưW_zGtT*׊޳!btH{bx=e[9B1
+ĎkaQ:RW)Y< [ᏭB?$ZP6\XxHHR-H90)ZRٰ鶚aXL1! 2(yL&E딾z3$Ro^u!t̠n ռM[1mKV6wb?1V@tx<zk  nb~N4R+B]K ̯,&c*d  e(d2ZFE 5QC}Hk=Bd~d*e\=}fr <&տJcuWvͰZ|4@[ 8$&`P3;3'lDMQ
+z +&~: $rY+F[1OfI a3sQJFRo=_NpJssaV,E
+gCK^Y"?GEYZ>i~0۷y{VӨ4NbRZeվd'@=U)zpAֲLl3Uu6V?4k2f'%KuMH?og/gZ'X#\Ko) [(Êc*<3f\S:菔OP,f#9-5p::ʸAaDJxL8BKlxMF 2#nslztCMJ8{$l<b?>Y@眀+{ R~<"GӦR|硛>ۗ?x`
+W-Q>DK3|ͤ}INqB MAy_.b\$<kG@ ΃mC0o/!c9AOx;FY-OŜB؈D&gyw>|B4G'1
++4'jg86R
+`᭭ 1ֱ!0iO(%6q<%tc4 0 ͂\Z)zARN>H<)-S& ;! Zg*e.<C,f7HEJk
+Hً_aln7mo=}әj<%2IF`K2Jv:_嬠o_A*0A  S,[Sh\!?N|#7 ڨ)e,V90GO)PbC駂 КzOٓe۪.ఐGDBf21>tٹs O!=|wr~x"ލM@5bx&
+mJyz@)Y/H-wgT('s
+SO rR]?݊  qW YRmȿg4<m5/EԾ|j_)jrisAp-xaSŰ i$C-fs [:ڪ\tc;6ClTmxӁ8>Jpy "yr >nV\6"|tV xb'oϞU9P%ر1֐ /O̯Z
+p+lTkCGIvʾa? .g<8k,om(5!NSDԓtbR2ɭ#W
+@`ߌj$Z&#$Wc_hnSvO>qMO+9 b(_T
+^1d@ Dx{Gy9Z/+5moKd'i éU+z/٧G[n1
+8jJsLE
+,V-wLzl\pq0)T0u^Dϐ(;E\j@JHIľT
+7E֬|$jXBVP z`mKIkDG5wcxV)2ظ.ID:<SaO4u1f
+p^HVWuMS?K(.WE}D*AVcl_,ehw$sEd;I>bG%RΙR!f4l%J֨sN3.#z;o{Wx~ Aw|{]U ?]LPHiQ_hyZ|dఱ 8rO5  Y6P`=}Gp>TtH #[0,qI (n}7g"+M{ 9O1ӚA"}Z~ hfCZ?ڀS!a5Yb?5f242D0+ƚcր6)+^iYdOKsZf=Bh7;K\|y#"4F9+^rpodžG9m!5%I^"s\л?F9<Ų-h;m')D8 4?Fa'blm۝o Ka' Fup*0VcgJ`XY] AJRn KQO/9*VrdR  /Zsk&*MYVڪ+ ctiSeXR9Zchۍ͊UMAT*nEϭxQse-kިCH 6N%ɅP)y~wD3Wjc6J\._D ?Q̋e^n@6 D8A
+ LdpWq5)摏x9t|sjT!/Y{׆Ǔu_E_}W&j%!hfl quwHn_Y\x:&O} ,mӈi3|M伤\AC+`Poĩ)1Ϛ6y~
+R^&r:9(-6
+2Fb KZА$0!e:'DD
+AacE#T(OFPäzr}q2%Li#:8u(f'Ġý ,A;2XN}
+E.|׵{ F=ɷs,! PFyܯRN==)3DKBi{3:
+bKZ}P2ЯR,;c SIqW*kLf O
+<gbSsM}\@}S ̟LX\hG}gC.:3_3+LC0P7`'m[HE01]Ǜn:p ^埸m
+@[OzjcbPͷ8r<5k3>q@_DLb)h|ѸB*{c@*QkaT-^>`˜z
+Z#?;;PG()9S}T3?BپV_ҏǓnsHpx(g2BVͶJ̥JɾѹCucv[_?kJ/Id bp8\ƿ ڹLܸ?Pb.Qy)|}"AQXX;[f>mo<2-8JmG`3P]LSAؙO&D0؟NM@**%N5YHM.dʘG
++;YܑQɏi(Cy!qSP*T#G#><>M151|Z~n1;DRY+A)%QEk=MG"Fj ~F n>9
+dCdgl
+OaO[VM:gP[uj)FЗ(ސ0qЄpMVy7:C\cLq zA'<u^o$pk@h[j*d?~hMbJDt}#D͚̜$] o6
+؝xsȵGZ<egsXBby HSaE tIv)T
+,AA0!s+3{i;u ɴ R'7U/)=а|O&R!׈q3N
+ `/:y)J7{ue8%f*jIr@H 9ȁ@*:51Z0Uޒj}Or@hwnC#14K{0%9 $ ff\@DT)3Y2G?BFn_scG# 0؛FsގJ8,]]:st^ߏ/AWBU)ȞJ!0<4gȂ-,co~X>Ψ ܣO{źEEEjCVV0 ++07)j Ȇ J^ f[3ԡ;3G̩݊Ig Y[ݲTpvR6׆p,7~yCp.*}+.$m2m К]W϶NؽZBb][} D;2)?[j 7"R@ T"WFj~X- VYl$͓_8&6XG; $tN5rTw~]C/iUyZZX9V -
+l|<A_4ADEV:"҅%wXuh"V!@\E
+=rXC &D6R"L|#Ng:fa~0.٨qN⼶O9MNm(mȸ&YTI 
+hTi{
+k6F`pMpYK
+uD{g)~0vvf2pz_#݃1z^S4tzuLCLd<R)x7__@m>-Ӭ3V# d#U;”"N+\pWg xYhs4̓_ &L~wGc)Ev;lpP%VxG6gCHZDLAXmwRX>2 {Rvى鵜y-ssT'QNT(:YŃag0qNo ٗQ:ώQċ̀D`Lľ[ݼc]"E{)K>Ȃ后F-؄-@<y! 2F^ޠ oZ01y&|(kerASD!%~]1$;:j"b,}Cbr4 cCj!ʹa^e^ b-^G5ixY)N{8ܸ?
+- gC\mOj8rYSi#pk * E>
+Mm10e?{'K yM+ȳf@
+JqXg gHA` v^x!^UR΃IIB~lZ);+!X
+nJImEDٞE]SO̘"&a{ʇXe[HZ*::lgʭsfTX5W<PƫxzVBK ;449ssrB~J\H"S,;iIɊrِr!Tlgl% )VpK0v<=2
+㹮/m%a>aD-Xy1jϭА“)Q|<WRCi:2D_vW'0fӤ<80wp 5D$ ' =n#sVrU z<@l+&MZܰeVv[)|Qk9ض—UrfAhG^G^Mnz^hN*"4aƨ2PvBr(0,N&;DTT ӄ|kbIXE M/
+{~]Bo5/]ab x%݆Z3Xh-JO uUǙ+~@VS` Z1z|OGHp`G=i@w kpÒ·萄7 #K :lЮ "!Egbq֞J!T ?)P^p}Tpq
+TEZvYvfH J/v
+Rmq 4B܂ݦoUeR֜60v`uWANe dPĐR^;}5t)C̻hP`8S//9Kt'z=֓ ,!f>+5.j7Cc'>?i*3 v%.{Xo>PK!ux?5:2$ ^gn
+@P͚a1TVSO4H0j#
+Vl sF' WRZk.TY󩄀z@{}*8 RԾhj[(s U.=%&{5FItkzGdM F" w/ e b5Ҁ{$EDXCjw^p<u;Ăs\"A fuB T{4
+I2Oz]g2gHLߊuKiYi#= KUHֵ(=.ƥ" h<W^o
+pbB;!XZ/ Ix
+ܚw F{*~# uO-RjGHn%ޡ}~掙G.jH-N1Jl"d w""ůfoa 24C2x-Y;ua,h="`7+l*^Sv?'z(2kchpVO^Fͥd*gd*1FPԴtܙ>97ja0[b@CRl/7<_qZ \β>[*PT(0U){Q<MCW@ Eyn7 #p<`
+˝Po- 0D;f6)Ä~|nAie aMc:ݖ=?9FMX
+ 2n#ؤPWROٵ-ARZ6cRz#K9N%4SuCQ%r%v*`uFy ߑ*8^ yz`]o3Ѐb<⫺& ݕ}{X:r|Jޝy^tVj
+FcBua0bF_L謃WlOEYn6;`U
+L47V7ie94}\Q$!Vz%\*
+ !0&:_h
+}$qFJ=Pi% Ng{xĂ7`bCG&Ht*1PHz]PhW~ 6Dm(ϟ|%zǬV5`#𲰿% X whTqFgu5
+b@ׅd3Iw"ƞStPيqfÅ Ğ`XBqAn^SQŞAÂpbE4s%M`^£qŰwP6EA4OIBBG6;däᔅ!tLhz[KpdD[K-UY*
+\@84ӊߪ
+ DDcdžthl:!ZGM@3+4)%C&4یR]rGf/#q+6
+ւ8"kMiNBPH$`Ap9NH ۦϱaZ[lcK-PKvag#Di;h©U J:@$Gqڌ<@tMy8쏭'=9}&ZVm9A b۟6Nۆ=j;wh䚷f:r!C )0wE|Z60l/$  vӥ%\\Ԙex!']T.xPP6]lx@`\#X&DP
+R1+ a^b|! x04x8h RӋZt=,#fv5~ @$QZTbHGDo.RuZ|4=-uVa:#ď?s+z*2[=z :S T*=B_m_pO?8)in0f%]!adS V$W<ٱ;` = hKrdZ<TԑkT16vmŔ6wt <j%L&0+0/^S
+p_ ɀX/7(,5&T#h1$1һaO6Ԣ1p ND:|< B^F]Ɓ, qIKEYY,JvKiOS5K&c;>t.a%@&Qݕw ]8٘BB
+wu&J0:z=,\Cď^6xfC`$#r]$IVj۱(?</)l/hxZ&N/ABaC{*BO 
+h:ϵ1E4j\g[x2*1. v"gD(VC"ttVW\lLL%И%t:!tƤێUi+) \hc&}Z!:u}\3y!u^*ĒKL12du{5/ 9J[`WfPm7qĖ"! ,o}N I.&S%;(Xz VA! ϰK;, bn\HSs߉}IxW2:C0+豴{xC9Kɚ
+
+yEFY+$\! -RU{(A1#h\3/)lehYzW2^
+,͡PI6 t`?kz[8+[Xq2_~{#m5Q2bMe݅1\Jղ~}-a)COe@2My^. hq*c`t$HI`x5$lLR g-
+:o>.IQr~2'#Dx=
+xR$=3-d2Z,jkMQen<R4h 6'( P>"s\f9y 5B 3F JZuCFn<a'ia_ErQf'4,!B0^YePx|IIPz`+_"-(I'm‹/8bA߄(k7bP0u$_0 &c _3c.zYP%D3~j"0қ.>R"!"*|:ixii> \ <zg!
+=te TXCQTrHfn*pQ  jwp3R@ɳ_ QhaN5
+k6}/!`* Q*vP/>e|
+`>Q70
+ÁMPļ  i2V2< ?N"h86_Zw>D-׀0`xLCLazD(
+16:G2Td^_Jj۫ix~+0] jeMy{0pЪp^Qfd
+x>Dq;}߽ˎIlrPx#ܫ9!AXZwbӪ9/MmWuҗ^e_0JlFQxZ"qB[Qy T@iuȨ笔C[}["1BșwpCw9[92'?$;La,n"CjpMESKثa>|לڊ7l͖o&"ߞ6@7" to@ƮԡڹtXH wmU wكهeO9^<:8Pa5](RW(E?]хPt
+HdR\5cg~Q?N[JIDʈaګ"2>IfSpǣ
+ ;%"#g VLy ISA@ $mbB:
+F7@)ABjsN'Vnt&`$ %,C1#~ 3]bU܂_GZeCeCMK[y:,Lm'~m4$bID-OkHyx'8GXW)8nLK:wO!s\rG$.h|kř#qdUN Ab;W2z FT=(<&J}Pket
+{[=ɩ5;<xII u:\{t;i񏜊d^IrDbRzlFc!]u zF\D`SS;Xo[QAcH/|zƤ`!( gDsD>dl!RV3O#/ݫ0}IU^PFt-DYdl.FxrK@RxPA:k?T/iͰ AD X?{ اڮ(oR18&Qچxc D[`aD'ƈT!7۞%:]co rA$
+!Q6f 2D|P' $|T$Bt}l (pSWg'N|3OwᱫvY{U'm)P&V@ȳyAǯB 喸_ II7<N!HEZ# ԃڻB!όxp}SqIxVpƐ:W 9b$zv^8D"LGy%Y~Ia#<!ʂ\t琥/w9IaR8X K69 ȑ $*S$َ:?D~}LvZZφ%1D?_D&["nQo=[Ӕ/ZaNѯz[Dq
+PWFM<De!J
+7c /,.
+V猻*|3HD&rDq;`gR
+iKgKEpKc37)շ]I6ZR,>$e}Z+{? ΍R)1b͢5L;qC;Fބa{SζWq<a0֫/p95TWCoJ- Xc( W5vݔR&у/{okj@2w=ZA{0ts2(|ʋ$'#R׿!%%Jgy G*=ɩ.$9n^E' ~smGe(C$ H䧢}4Yf"V=6*8ӡup'
+<z1JZmȔ =Kc.%f#EՏaoǴ\+[ !T4E4s--5]xa5X `ԱkTIX} ֑-ǃ./"Zu YuN@K`,'*Bk?6yԶ<DgU`3# L!{ah
+FQFq@.9c/@q[[4@=ᔋ@j僃8*h"K/ni
+ikS WaKgHb&nIIz5D%Ok(".*5_ȍ
+
+;6:kWpyrnIRP3TgA5׽5]",<S`Lfyd@}  H~ERzfl?MOŦ{$N{ j: >HT|9M[Ǥs
+Ԣ tz:6
+8%H϶j~ID|r AW
+HlQd EW=O
+lNvǃNy7dN\;'6 -@juy +¡V(c/[2; w"J00 K2(Cn
+fjGTـB>3ĻEEg
+$ᕤ.
+_R;m !OmeC^a;a.d_b֙ð]8% JK2%rEHd~"&ԶTiE#QɘE][CO]mY֠imQ1 v1o$Iq+au )4Ժ[?4ٙVQ-4ٺj{7Ƽ]KFRccH:UMDO A6K5!z9М]l4.뤆Hgp2 1 q7ա$hq{zQ+t]M6B() BwF G%!ᮤP?R΋GA"*d54 X>mZ&
+,8d"d
+Uc[!Xl\4 NZB15K8X;mۙt:S1HfγwʎƴfqF"fmZ'ɠ4| (Wj ZXaJTSJARGaO
+
+\=4t3?adi1$]vx剘;[Z ƮS0V/!wt5H pd!v0ST_/<z]ѱ:`ʋFC9,GTZըMP@UlPTfiI >]Z7a@y8 AZA{þH6w@5 +[Az8c
+i2vHsho4-4T.Z#b6RE[Ni{i1\MtU
+xɠ=P36%"5K#4@,= NmFZ},MѦ/LQ09hbuF/N
+}W%:Pbt[i bmNɪCcWi#Wцz<@ꣴ6O@iQcmT%Dau$$D-Q&L0hhyN{|vn\:u!g;I“ Iֆa2m+n{Lf'h"-)%XA
+}uIt-v*7}B#RI"a n% V^Xح2)ʟZ}[IZCֶƯi[F8ak0ޑ, ;Gl2F"x
+@+LzvP eYX1jE{\…B. f:q!IBo )I
+<̃:
+C/ 33 r`#WeOX!B hV1T,*@$잩m2y} ٣b}C0BQGDO'irVX%5hgF
+}a}@Y7dTFڌۢyU~cpp/kT -E3(:΀Y^
+$)(Y!p'lN4pb2)>J`S{/b M *X<1j%L854t(y<ᇣij,8/H̚ѭD rGS&MU<zj>t`3qX 4HpdeSpb Gp{J! ov~I0?8;$\c{FIn/. "=c
+n
+U )D8>Ο2`A~ɑQi;0)т$^o:.݇qgfyx3Aq>1jS09̍ f!+ "6 NDY@.zPJ*D4c#*?>,ImSە(Y%H ~Rc#3Ku:PDcY8Z7[r;F+TL`Xth3;V1Xߚ\z5Zf!qc 2W(/GV`yQMt謢,DJ3Uԗ%7ܬ-q,Z,-YJRFQQi4zd0we.e͑`BVzQW@`U&(hQbE[] ~ @ߧv*
+nc_[$4rԤsI;
+Բj% 9д`NkE#GR\ĒE]-Lnp5Ӏ
+B') <bI6
+mbLDU=H%хaf#很68wGV3*X-w#՗I݌&uwkf+'νAU
+k"grxZ5oй6ƊnYW+οeiW s1J5Z][
+ De[}r[v\W$˕K<fU{nt C*.imQ[p²{+9Ҙ%.C5J%,w+`MU"Yd*@iC<8ZEϲ=?|$.+ <~?,ڜ|g8Ow H N)d~x m&Ym.?EQC
+է)ޛ3_˴KӐ%bm^ X?:J޼H%nPMd^.QW,~
+opTbvVgn={n<ً2"
+Nn^%2,6++֊ŢqZ5V@mWU~ 02Ӽu&p.̀Uhpcw}{_@ih*,1N[@wz23`%3oFxⲌgGsس+篼r:UGd%J|M%:ȡ` nׄG"P8+]ܸfpE,H]tTSg5d:5cRe>noF5dfGݐc n8e t#@ JJ9$é >ivvSڥ̂Sd.lR~=/
+#5 R$[7cd(ro1@`VʼnAx&m2O8X
+J"n<7#z1)NX§thos/ibjkt+0GWTY+m=OJH/hM}wLx =YX*+z6XT!Bp ^w}(-/C0/lޕ
+ rD0ܞi uV:NW\|k)@k [
+ .?g\&lA\|/X:_=
+H^vX=1~ik;N415- FmӘdZ9^<8$4IKo n$~;.2X;
+r^tXE 'MN;R^ǨЪd9YY
+`?YA]ptYl2n{e;u>D[}5Ia=kihEia
+
+0^ɸ?YGOUS^Cr`Z2
+KQˀdݟu~AX
+&x[:D=n^ M kth=gnARL؂Jٚ@VTx% p'4!x΋OxZIX\a:l'Hgw
+0"*
+hs{ήT*KgKX{\V%XݵѯR8jX'}8
+IN5ȩH54LBJ$VQd='aC(
+t/ATut09b݃Rɨst p*r
+K ecשּׂ82mʢ]HؔiGߪzNqXMy~}+-XbW6v ˈ<tNU
+@\\~jr<$ dӞriz.Pf4G ޅYp{OtauCr}
+ Oaˑg1_[dp*{IEp/?6b8ztAB
+0D_{}/7ᶺv5P֭E>R06 zZy}TV'Ii!ck1J_޾
+I\1^c;SLqFTEjm6Zo{[C ;Jv{u<_Ip9چ~<: 68;EFUi8j՞/Wˬ^Ro7_ܽt.~E
+pN
+:w8-s[*
+ SɲZvFB?w~M:lfɸVw5&p/hzHC23sߌ;WE* hi-zfg
+)</I~>E3iF
+tL q9g\0,y/ {3L]XGMv%)>Ax%IYR&vcޯ?ouO-Gz7tI@dRbOg_7-pEՌ,&t,8N޹'(
+Pi 1IQߦx_¨ **3 QձJ+"b
+h4Ygo
+Qқ.e!V.6w=YK/<ޯp
+VFf+tHFQH B⚖A :YA%" J5BUp%ڶUn4G(!g-j]UQd%O$R1!oh7Cqmy͕(ʨ嚨\4ʤ4} %4Ry}lQm6P!7&-:ĄGvM)AXM0~@QLqaLT˞X
+= L%3,g-xqGP}VNςU<V:V lYD9Ǚ䝂Bk*[ylF(0/_ = H/ s:l*=KN@j~&亲Cd rg-3>-\^ƪXyZl: 1hL
+‹dX5F x0Q{J;@1ʛTp
+̆1V6nwvR^q
+vP;5
+7^ :jERxE!N+%|H5e%h(3T!$gT͉1Qam, "FBe(T,jy*<bbm͔Kr/0O"Oĺ~mtŬ
+zF2͖wq-_mn4AyM)g8 EtIGa:~vDJx@u,[RS[ߊBX/T,@aZZɑEs ̫ØԼbs'C\{oάΟ^.k/./X^5m
+!S׀MZe
+`؅a\25%80;@-JCsPU-o` G
+i"3n+T׍TҩS7qz\ -2V]PU_ RUeUWNYr9:a&o~XxkˌG4#6:8J2nK)jYP4,/WQ|k^qbcg&!l. hsI¡
+࿕ѳ&!o㗉161ըSlz {LyE@u\9V[. : (#h=P U+ $ PGG^ ^# d<L4mjE^O>`TZUk?RxLϱԿ?Z tWjpXX\ڛ|qWM人u.lz767j&P,z+z!U4Qed zMT]FA^#G-wIĥ,lhos4P z5SYb10uMztRKFT<
+Xr.ұ[b>;Hk.Ej̧`x]ti$S.= 87s?|">߳߳9ޮ?ǥ.YXM&M<3
+,>WK.B*dN-a1]/~W$_1Nr~HR\ӱ.?_$NOn6ks?
+y:55XUMj:*UBwٴ]z`>?>c0SBa*,@ r[$f- ?]:,8U[3<];ƥ~\?X_*VwAc P\UOM jk/-[Jqd4cM [P۳}><^D U4 T jwQz
+x
+M FfQ70}I#A÷dI!1ui_tGiE;ˮ>' "Ҋ; s^ϛ)>2CA>+ RWGN[F`xltơ{r
+4 ˉ>3𞑁 $$P
+N4Q-b.m`6SհQXn'kC^ոaḌd.>?qhˇS[D:tJť4=YfJUGmȫU6ݮ7X$b"6q30E+ p]\f<`捖b. D_Nj;wF{]ol󦎭ٙ¢<1B9Yl"H#~+ ytU@2}jNәN_q2M&uI0Әp #s :VBB|qL\ )$JZ sku]I/}o|y>$_]naYƀV=i"ܢ*Ƨ[.l5}Ӳ
+ts2mʺumGHT
+Tfz%)<twJv}k?H/OdGYyUƣn%1ؔd%rAaM7]&~ͅ3CJtAacv4Մ4"F='ѼxV {u<+,;xo(뾒ݗ'T^++7on_e|Xf]DR|8Z꿶=;nVڧ퀜eW>g6K!2< m`~&d~m0
+ATYp)xo|㧐 hmgFurNX^8۰Z@+YrƧ&Y)Ь_ţw(Ȭu62B 7QC19(NyIYQSUlDGx
+*S
+^>$1%okz~ZqXX\i|WgNRMH!|DGsQC:rg66Oft(bšEm:&N ++ƔwX+er>ve zg̞\"WӖo/.NKt)*ٙGr&fijYK@֦W_upATx.,ɺMa34>yC;XC(n*f7b..Yt[%e}jQT/'UMk3cH_oY*UjYMjiZ֯-k;g$7N#QɒX(˸ox}qU.$&xz!7ĴtDVGaɁgp :Ak#9\Vxy&Y?=R^mzq5!Sa9iI^Smv[Wv7ީ"-tlSIa] wWIr vER\ "-Q!=zm vg 2Ӕ_D-䚮:=*pa~es7PCa5q15Ee6gO|ld9d6Lf
+nVA@f}jR[d@Kze5TfJI!ѧqa*&#܆bvd`6Ps6 (2>xqxLfLa=,6@[Pt]4=g:ɿN;~*LUscVG
+|U|<g0}+x)OOΛ?L} ~^z9V5Al#.b|T$|Ąk09?ĤuY*/zY6Q!TVz-QIys`W >#_-YZ/f,}9mbV\N e5Ģxv[+kHy5U96#?/]kˢEau"ځbT+0BڣJbIVM,Jo:ôK{`ϽbIZ$I+Dz~]z, ^)#)l~s_eB 9ȇ ʒ{N{2tP6d&r1axɬd@v
+h0
+ wSYLţq~v0e Eljec6i`G#(9!>Fǟ1x^>><g~LXpaDUKO>V
+#}?hj|Gۚ]Q&<<^$ m]xyO5w_Ȯ[.ZScG΋SKYw?۝|=ȵ]|i`qz#9]lJUE8Ct8+ pbiZ{QQB#MA?z&;sDq˾|
+=P->Cփ\ƞrxۯ:OoHNDZμO <IO]G-#5{s}ŒmH]{1
+sR6d!* WY
+-yVޫ뤽vEB&WO鶓,!l h)b-cK[1u[8_&KbKAm6i fsKZq&1YmpCh;]HeM)4 EzؓJbJzoUR:m8Cu9bH x ?M&C^ IJ_Ug9zWGWd9iPqOj;9;n; ҆yK8 HԵb gI9\CnĤl!بygg Sc?Wi]/'.v\UH\rbbuT_efƮ}P Od!ؙW]ޘ15e]&.>1WbVC18
+<%:lnWܥN3v2!;OyegYY;\ef}rchWR΁".`6_ȪfUq# k#v3 ACmvz;-?A;GE/ɮPg3i~Ƴ?﹥'ye5ú7gm UYQ)ݞn)w9zYw]l;)OˉB%zU- nᖝޚLB9$lTQJ83 G`}\ddpsgHi ]
+3
+qyFi{ι-<hgcv+uUS 9̥L5N4n:9|n-Mb8$)`C`26$=Y-3Q
+(dGNjUג[+EУ
+`L"g6r11)JÙo\SBb{:\A^
+v53ֲ8 eأ~V޾5erj4CjU]7Co-o3i 9UkӠ(1y)~Yg-l)R\!`Z >N_-#J )I l)+^JK^Ư
+! LT]GUĄ'X&HH֋K apiK)n}]
+\BB`]xY-+b0R,8nVb,k}?I-+GOy3?.F5~;Z
+AIK֙ljiF6(1h˫O1LvJ:/};eU/,Jp zΫ<t*;סUqSiY9)! >d]s=uǓʪa,Ch2.-=&P.<+=t"eQc-mgusnubguD~xsK[]܋{s?Ɵ9\+bʇd*.6(O~G;nvfmFOfhw%HUk /lߤg۾MUq"4"3QC'jQ7mp~츺οؖsC/, 䢒]Io|YjN2S#O MÝWpZb( ;x3tt͸5Œ[,2KzNA-j4AO}tPS bSֿBDFP{3YȣY*ueʥ꥽j~!,*GT"8sD,O(}<\rAV OըsKo%m;_}7x>թEau]o$C(뗳)NL8 GFDÅV[2 ,rs9.&;Lgi: i!N(!!c,߇VZiu[b0k
+0pB}ّmʾϡ3C疸0-
+ϜvQe)i8ZnKN}y_?{6yO;6KwSL&< Ck@5ZK/]/4t 6X8jL,.T]"=BOw{M. V<f[xS}fgq
+9`csL娦K˶<ϐvM549hakJ6LQW|ɻDeP-M8-<̚g <eRN3K,,޶U쮢v,tR3J9F#^%n=sw<j2!E%&$dU?J7Ē.qtP$}؟y\#]h<Tg)\\6X\B,t!teM7ea]/wk1j[ נIțvZ7 ={kWO>w?f5Q]Mݞ¤PHZI M6p$_=Wr lawC'_~㝬Dt}LTw
+&LQ5>tY,apu Z 뇡Gj*PO{<:[eb4IE <&}>#B^tHh8\C;.=){1U̸Km*pa$aU@_: K2iݭvmtZ)S@冐Ony[l8: ߜ^Hyy\f7Bn5) *(GMj[.̶K.f0y
+I>9
+/GՈM!WY"Qt0d:ܺ GI
+s`xfzNX?ebxu튘M2~R=qZ!ELk %gBJ>U9X vCY3ol7y/^Mpr5rމ}ƪk@l8 't𓟫^/֌21k,f̟9POۆ!N[UEm6qv&N&1sm!J*Rz><HX>]_{8x1\L*,0JyϨ
+>l0њkz^eMdLg Z輾IRͬc@d=b*B,܏#P#'~Lߝg):v{'%}.@7j-6ЌR\l׏֦εr8oFe[6z|U,IR+Yҷە6足׶HF ipLe'K+ :m`/U F'R0*s>\JZ~ۀsK<X"iL4ijƍ n!)"P 8L/u>Kt["qG$_<^<*GM?# rȡ^abBz1<.ƞ =V~LӞ)傒
+2BW RK1ޣrm£Z=Q}ٳbf9|m9wl,<Q/{d1PJu``jO|vztGza4D`7M/uD>R~l#Nu@.G6gZW
+;ߍL^u&>;9K-ߨIGIak zn.;/u`Q5pe+۹
+ _iqY%[+GW) y+o# =շb fhN*E3@7
+:;6f>to7AN y;E_6zW: @ |hVpE2++"0)X<M}#W
+~Knd<Ĥ,[9Izt'1 UΗZ>2"L!|=a> g/!!B3 t⼺7/U!m<映y.c_6sQ/BoÜ$p#cl8"q8diygSX{3c>_ٯyʥh]B<Q̴٩aT|7?{e u[;@s*Ew[G+xL9;L\b[Fh$ԩts&ňE}<\~!\(b3ԆN.iL! _iG96Ss9e
+<tcx94>Z%s˪n7z,rxbKrY Z ~
+ LX7P<1n [MYaB kD aRg2`}CtĄFBlG.9K-U,>7՝%B҄n[&/^zQOk#B З O|)xR֎ZL\ 0aL(d-񌠣.6>=QjMis.h1QܛC'g^rTgfWEfS>6LĬ{I
+L-ǤY|#{qovqnc;XBӓTgu{p%CLSp63*7eU_8x7/ʪWMKցԓp,.+kvV.azaAic\ :kTJtLjݦ&8YWP0Y%P֦leU*גnE]:U䷂?p(ii2n魔c*D;.uɚ跨Π ?v?cSNJIouil,G9QrmGؾv_<|c6GF˧q5U H*x0'\A`. /[zm)šG٘)k N2 Lˀ3IƄU):A ~]oE;zhڲ> +mQ
+z ^`",|3Ȓ|¨,& - `=i`OncΪ<xHoN9_/&~.҅C'e6qtVmEp 2gڼ_Vޯ2^z&g_>,a !\2ң{<xqŏo.lj6bӄE_᧐^UC^ZSTEEw_.к7×2k[^pNQS?no|ƦR^ Jr):uGHr35u.#5; M595 B?|f2wK'z'Q4^d =\Tߎ>dYP/ښsJndӫiλ5Ue0
+k.a.jC^C|m9'>zqIn:LOK*.=V>E#@ۘ\RL@}]7"=bآgFq1TQ mfx,<C>`+F'':3>C?P֝ؤߑni ҥiՍ3ab|Zt(F;R:YɅzxI~-xMݘuh60f16՟ײNE1 . 3py1|J3sg_&dh)1M]J"
+&1UM EAEEņ{%ezf9<g%x%zjOM.w^찈78$e4yȥB֡Iۜut mwW .p6ɶ,
+IIJGٚT |sc-[Qk/QюB#% xH.i{ /ʎjY搶pwwſxm}@Ǚ^IMbJiYEW<vX:[<sF% -"TܡPCu bYB-pNJ=bb{%H˽ZDk<ڙ ch25Mt)nkV읡&.gӲ>n # BRx8˨Kc wRfHէ`NZÃyd0~5ۖX?Ek}sQHJt3sMQs^9>'Hv{)k=Lu~.ͷYe\
+iF
+hF
+uOj;Ĝl@]#ЧmHΥjBҧjCʝb1}DNWyFШpSկyiˠpJΤpKĘa-V{OzQVcBvR!—g>ѧvXˣnI—_*‘[#RU[)NӤs\ȥsk<ơqNӰȡrQV nCmF a=k>
+sM |ToD g= ~JfA|P.ͣtQi2SOOwKoE|TmL^?ǞqHyXmH
+QȖ^,yIi8Ej?i;’qFЧx[̡g9ǘ_+Z!]%USh6v_#`#řh7×f2̞qIh3c1_3{<P ̟yXǙrIe,ȝqEȟl?Ȟf6śa.ę^+U#JNp:m8śl=c.\!\$X~WfDoGśgAǟnDZSwMOPPɡa6~FqBШycɠtQ\!PUYvDs>{S/yK!׫qUƘ^.ĖY(ǚ].W)șR(ŘF>ŢdEϰq\ΨnLˣqKc(Óg2`'c2a.TǞe8ȟd:]1ƜmBb*Z^%lBɤtRe2K
+HMd Ow"\AR[aFK_>ew+[ ME@"k-[Zس.JQ3Ow>jx|
+Wf
+\vs 2QӅ0fgj'k|*pYZ"ۚ v`ݦ@u̵O@¢ۆ]<\R G- >W"݌& a699S]O
+j"U⎣E2pK̰L-`.!TRy3W`ĝFDq7aK/`}39DH!~5.9ofuT!X{DZKЩiҏNk(]֮C8CYJyg((uon:]q۞"5419k0> hCd1_@5"d5.~N0. 't>ϙ3(
+>S(n&ATq oAa@r,>9A-iRsIOjP%u;L)icyMo HX6D`G-ֶQF>:cлƘ hU
+};nGbKka `TIL̨ (Mt;5;W &7WSq)]^:ŋ,{.@ 5o0F|EΗ@mTT,}X"*$ZSX$)
+F^i24dL %ٹ-a1C0ʯ@>~6 $Ӏ#iqŌ?nKBsS$0^T/Z(蚹+!]S
+k:S nd%Rص .~/'&!8xtxVp8.Οg}@nt:a:.x<T{Պ*a 54SROz8iA(5^n j$ 64VZJ$$of#im,G|PF.9O]bdӌr ӿA9E޼'կjbYF-jS݁+yCgu9ƭumFġs #!b[gixu P'ڎ~v
+C3ޞՔV^'DJ
+5Db ϑ!o"`QX
+ ឵M6| "dZ~m.Pש* _Q}oXstBO*V8聣>MS^dAŦ5:{BXx#0pm*
+vg0T)B@ R;f i^ A()M-ךr]%'Eu9t<ڵ5"kA+6juuV1=tvfwOG$d)a%E-Z*Of Q<5{wdB
+,N9 gҫ1]A096yks=ni Hܢ?ޠ/c<lo@+\ÞFU8 XY¦Qӱ~O@xb8?Wi*wAL-t8gfq(. Y%KԵ*s "['c.^Ȳcy׿/n w 5oUhf;,GJ50R'%F=Ɏn`^
+=T52BfZ9
+T$FEp|>ܻ1cp3A`ElsD+)NxlX4]p7ep妄NNPR75vsWJNt&qfrz L_-mIϘӈG_p ,T0RGЂ$#t U%{ 1AVQ_V\+ (~YvNVX["NIvTR0Rk5xDѰ>,<\
+nn9&EYlEsTFRop|0?! 8#Y]DeWmIEd`"Z[uN@1fz CqԐJKA3kƤwx~E'="r H8H|-C1
+m|SPs=>'9B^^NCu^Ұ $xiX6 _ݬgyznA
+rL܎&J8mgcNRZoW1F`r<e4=I
+jXrHT#kW{Vrhlw9aePK?sD79]i:Jm& kQӦqo%lV%i9CU)*=t[T4'ǡRc|@lfs4$kGȗSd=)* zu%<d62"0xjtt9 vtlHηW_ha6#,0Z\ߕ.02T&ÅHj+SW"}Da9B 2~kI@yy-.tB/0)@`]u#2F~UMP]>kѸv
+)@7/ %@ Re"H0:c=0Q7S(~GѠ}{ڶHؗZfnb8Ü@1BZ
+/Vz "gՕW)p6oj{`p 1j^oO#  OgT[ 2\G'e*F5B /v`
+n ̱ i$|GScS?zFdO !2m9n&6*Y{k/SaeN$ܩh8SVHljcx3>1{kB]!a5<YMO%VNi6׏ &_-ݚ1M< y;U`Lh!(x7@q(yli W<hߔ8߹R(-kYl'Z m q}YAi[-K
+w SZrvZIr މ-ps^S#\{/;7;IH -Me퉁nUJpsH >(OS^;CHFs0
+p@r{/rzW9> M&y}ʏE=vKrsY.֒(I-Wyhd!`<=/"i{tn/3'q(ӱ^f4Kכ~<(!ECˠscA
+ 5V<A
+`xqoGAcLa(zݡOPyX~Rv[$?m`dƌA%hfuʖb3s%,* d lbdyErBJ+N]_EVb Orn?O2_4׫g
+*4i'N*07u0)tcZm ^ UMfh[QVv5JHO;+& &m
+!P;E?o͸"
+Pu0qhp:A
+3_%{xJCT)
+F6[ne6Foaf_ %Ii " 2H· ߔ1/.ܑ7a`p36ᾕ`*&LsnJ @'okc2Bk"&Žh("/$-N.\;Ď"U!|x2t?*X7)5,[˜Iע3t^2#4E}6ιtLfR{ᴗ
+P6-SIi{߹wo0W/AÃAg]*9 eD_xbt<RTh9[OVkbDð͒N.A!^Ă9wITNԱzшND4$+)OiYێ!9alE ECV1c?>x fX~mMt_ǘWBP5+D~/}/>k2pAgWȌ:VIW!D<AM|@ ;j_E\-:e]7]kϯPtfƁ6yf)əS-R'@ϡ#KѴz.!F
+j'Aԯma-,G}dbCWZ6}؅2GU^bn5YwXYKV>~GShYF%1pmz3ol{4X6LsRʲ ^^pu[jhpF8oJl=Lϣ?r*Y1"T?7Em`
+QҸZoo*2 (~11ϵ!Jz 3**F{>'v$D7-*RCY59%gߧ{l;ZBcVsF߀mPÐGI`b\f
+üE:O֞)id&;RZWyBW$_
+m]sdy^00kI!"y;D`h\5(p'}£+|f<[`$-;%(|-@صCt&Jh/u $7EWN}S$g1Ebbj,rp.xz%JCct~Tv݅LpŠ4agDKź:$Uz34;י;:ݹnceV/eT:CĀܗ G>THuN{~EKrHvB2Pk}t^ܴS;%OޡV-EV3&'J,*TnxUKأBզ1 *Zs`P*#Ep7jlCHe'z&U_}S|NDz%3VYta2݀RM%A!ήknm-+!K5}ia+͛\v E)~,K ذmZr`jSRoZp| #X4B+uGlZ$[#.)L-`
+/,]"[Dsc]d%y>BǼ11 E<F"ШHPwbG!7?P:)zvc̿n\0U%bfAgƶ K2+,Ax߻ݘ4zgc д* $9\'; 8kmuJsL)3-֒AAppN/>R'g0XobF
+b،O^g)Bpi||4+J:YW_b
+dQ|+7E]ht$a"_<x@3][1}Kv
+,poᑡ5ypޒA;2`&
+*>5aJ)NwLSf0B>E9b0WD >FvF|e4;i߸U;RBM'9"qQW8% &cvmJYgX 
+A) +d$d0!*gCS߲ !R=,2TuU^X9*Jrg]w ¹fdIVNг.\4P 0T6fPMǃ䱛b@߬
+un :I %q*ŊRFHk3W԰.V/fJb
+OgXL(_;4j ʁ}J]̄ӏZ2rk#QȋwKEwr)f^ +ҋkn[j>=)X,.#irCWc,QRfTi:XGN!!e 2+W>pX a(7%ʚD}ԥhd7ıOFD۾>]IN$K佢LGUXA>7WrHs:5P"-?
+l - %wT~S lRD2)
+eX'R%-[RuOu-r![ @oxKbD©Y1sRʬr;I=ϣTn+KLu'1VVɂ_uE7Pcnev2[HحD?PWF[T/
+|e
+V쇢.u .Z/i/F(0*+GbhROgQwQ<Cx M&z 4*qw/32vƚALPÍ񻬉wQ)oNǬ&h8|90s+rVk0<N[3m9
+0Z+ $}
+j7_rovIa
+4#8 8(.Rla+I޸"Zc޺qE;Xu0'*9X+G8'brwO8䌄@qMݨڵnPRI<k뙜x0ˆ9m_=q^j8eI`2+^?JURc1MLD
+iN'@eHt j QJ(1yJ0]Q^z 76;gĻ޻p0Iʜi~Ďu)۾
+;cC*GG*1j_
+"|edfq~zJQم.ܺ@`
+he8Cu%xźdD/r_Ʉ(Va-Up LZZ/M_\٨vI( ~mv(/9j4eK-$q71t*sƮ8KDju!$B)Ty h57Hʧwo9y^؆J LpZ|:Je4/0qF'PD0<SB]W*!OJ,?_[c RiʮUe@&D8Le<̰յ(Ɉ#MRRWqRT'x#GG֦<
+J( \з8RTSWM J<*+n|NU n'>+$)tevp5 ?Ȑ'
+Vcra` `&L =3-Ii=$S5UӔKX/w$_mH,HE`R#b{Y/v "j1y<) B evFH`^6Z*+4&i|TGmYwp] 9cQ6YN%:a-28ce8+R+#j;,rI]Eg@ߨS)+>6g~)R~K׌nj1HUil+f 6-ǧ3ATV"ޒZߝ@b\l2?nѐvϢ^ZgaS`xo$uk@$ ;KWwa)F'~弞t #QEN5;a7rZ{Cy5#!݃BgeQ]rbQ鯉Sr4z3zɄK8D'ΓO@<Yu%74d) `j{=o1$Ae9HjUA<r[Cxep?/~cI?66a
+UUp~cp8^BQX+LvBfsm8"eԎR\+0u,<·b3cHĸ; (鏂iq='b!B R$wtq+`@<%T>9hh"`J1Bn]H 9lnΪ{d?K(6;f4.i!?Uf 虌26RW;Fpxe&3z_-VԨ'2@A3O52"]_frD-g1hfwCb75/{XYAhTۙ; NVd:Gu
+&S
+g q8yoi >gj'XaÈ[.(S$Bj@q1+C9WhV"=j{gDs(*Hr քt,4iO-sCnzy
+
+# zHoa`0x|z4Y'!{l?
+uI,W8o+7Iƃ\])t]Mk1ΎC]h:0ɜ$gaYFLMN[TOC"TA]¿DiY
+$Ӑ;Bߨ&"v%f2sPKrTlOE?ʠ҄ !gktx&EU,AҰVJ"8X?8:F'WӣE,K[4m%ިjQ*ZU.:3Ut*:ÍNNS! 0q>'I"~8_¬A\= ex ^nN{dQU26~Bc! f6Q "=D/%V% CGUO6MZُ§fq?k]Y#A e!Z7O//L@AK/B! }4 cS#3B.i%e&O =t)?x] sҤY3_}K-ZvUig d >jZBGqem^wxFi$3JUB\8]wzf&%SQVaR1T2^uZX
+}PGRFh{+? 4/Sw&HL?Z~9}brʉbw/1DŅ0}TK$9rl,A$5H/<X/>kJ!j^tԢMEDaw2n^U1= aSA.SUMfm?oEqLKdFEYL5G=SR@oս#:rajE|̵LdiIR+`){ !XQmа 0(QMnUTOnhW2 2.Yuƞf (GH=ر ;L0m|z>6^EcCA[ub+)a[xۗ_o﷈KP68,W#e}C; )-Otɂ⁔US1s(N]1mHV1aoF#1p@"G> :ZV1$df&1rJ̠E5yh.X'> ̑bّ^
+U4LK<_Țe;
++|n+F|"-ܲ$G,E
+ a5B{LtOz&A
+E<*f$
+UG)1o64%l V]h 㣿4WLC&(mp;r)%H"`4@0 %j%d
+Etfu. <Wi<*2-\%&_L_H}kXKTR`y3KlBLTaՋqQMe%`R29ٴכcVqd${s@2Cߍ qEy8Yʘ#Zz΍%it}lm{]0h0=ϔ?=Ǟi1$fv38S+IFI%ՁG^޿3p-KvLE iw{30 e0^ϣ2IcKn(sGcx5%uֆ`/IpXFc@$6EzWdZk
+=!LPg9ΣXRJ{Ֆj^tt ]i ڋmq
+-1XBܣiHa,>,
+R{ok YYĭ?а J "cNb)vֶ
+Y"~Nb,؅} tX8\\Gq<Yw\.!*m>9Һ$W&)%-1rK(Yx $OJ(cOb$7ON'f-hOEEf m`)܎I\8k([s vr44Ϳ .(LG {5X,;Q0%@nȰ(ۛrڨTEyu
+RrQY(sQ p؄
+
+rېlQk@W^xv
+&`ۀDr.nTxr 0KJ-Ը/==Y`7վ+*xLTe2הX) +SF7ʦ#P4mC_;$h>>pӮ#Ӗ~'<>>Q1{Z!
+Zǡ2/V))a3vqcQq D0G %Η겡0#" &Mu!8$+3B|•e8-=x€hHbPBi2}whOE*+3
+X0
+A~LCRӏ1>΢.0B2=h|ULdb^3]ᇓa!O Tِcv1©Fk+êD t;;GI+
+( _}D
+&kzЄ&)^AS`l\ѥԽRnz7@>v-93O@uM;Aˎ3ёK3-x휯t)*2pl=,a\+U;F<'tICle1*2}" #z`5vD$k 8,BVA\jѫHuC
+tY?/)s69{P`8!vyS
+@%W3Cc?H68y)
+]!!ȪNWg Vk@(Z` @ [2MdB E9ݻ VDP5>{lP sKlƗ:߻tbP~i݅mC&i@}&4x!~[i83dnFwpou3_6{G93|-aph{ruEێCwtcn@gl| q0 xwK J[ ؕJ2V厄ܙo VOaXl
+۶!,D,,dH{}##%Jc[]kЭ3zSX#
+%`e'l1Vtwd"YMi*|8'c j-Ɉe 2ؤMNn;IgR{09c1E,/~I#F$jTp{>}h(b>m
+rC5@;{|NAh^ H(8\qd>V鬦96W:/Z?3\EF P Ȣɳp
+g)Av6TzV* 6I$21$Jә6{]A!@^=*{e?hC {ln:n S&W*>j&_y2j#u׫M]E+}Qd:)ή1 " >`֫Đ=_?е_ ݐi_d"0mȡӉg.0TpmiQBIX̩|ҤVSq] 7rc9' ;\9vlJkۙ4ryUe~jr_ :-+{V3%n_i|<Wv4T*2 Hş *>ǘ\=)'FV؞b E$ #=O32, axǾ. i2 PѬ:dF6Hǘ$@(u~1
+8 "3ȷ#
+HLXY,T U@dy(Q
+0TV4D9)zIգsR(ZiJ\#>g+v>||oY3c[pW[+=HTV9plL%7фJ9 &#0σ`ԧI(Gt| C?ˢ@tEGizey9YDTͦ^A_ȑjO]QA؆&:B;!ߣ`9
+1p86Fk|蓪[dwxc'<]Rh9 @-8_w f&1SC깪oBXxh0x0R*4!Fá 
+3פFqhHd
+]Da;;WƴW3n$KW-cEx
+<P,#bv
+ڔL4hl`mDvonuZ)b]B.r'O̜Y@ݮN^]0fE_x@V%`LOn<%fqkR* 0/M"? _ϊ,XMo}r+ f<?'29r#a,X=BW_ P""P
+ "F٦
+'uJng/ 2 ecW1LXfsC\8L
+\8LռDFHRL} Xpr!:@Pq`lnq3=09mg"СRMu˻>K5GcGlK5'=,?"K&.ؕj>^\+j`_^'N B *Jק:σۘlǪѹQ4s3EqNC)(M`#/n//i;tl#<(qx$6I;2l6[`"E?GyIb9]Pg`;2lS
+*ԸxZ''3M/ 8IPwYQ*"b^oŽhrAS%pn.s ZByL
+1#lΏg?t#($nByz3jƂY:`vtM0&cMN>⧟
+HA OPwzH2,g42T/s|ly@,Qh.^?ƽ7›~~>`F"$ܛjZL^E~-hj7ZZ Xi 2ԛʵ@긷QLM ^9)^[+.^ͬKN:F-C{؏j=Wbc]g<MLJRp{~mB|*r.G1B^,qP0WR
+z0ҤnB7Qٻ/Γ;WAJe F62å5mEȐWe5βACɟH,>j>X͐_pdžw޵&#zq?WrGhMb 52{=D"b@W-AgƃFJ}
+lE,a\~z6_HS_=S_JR@[8J٥"s_7[rӻmy|c@JCM#r;
+7*J|W%9pjo}Ywy_w Yo/T'uNzjrBY@9]]ڐA aՎ|*Y'ż8õe;T>2ҽ&W/$p~14=E^l 5eE3R;G\i/ bCV94dUgLCHZsBavmc ~CIn+#ul=ʋ-cz?{cxֵ
+%ZSE8?dwh]=gkVnPtTu5V%99k:H!/ٍy6u/}az>Cx -X((7J?Nߓbௌh:Rm82G.:,c.Ts$Lhp:J44$Bv\1
+k
+$M"8@Ulv%%~MJsmj4Jڸv g"U51fw<bҬtzS-ruP6b>G CH$P>HF~w4u!0DFȖ:ͮa&/NFoRDV"W|19><[~2].a"j6Xt8 ΙV\hvolRiDY"mVL@_V)M&{j-"4n{A,&vҲSrn#xUs [A8~E\Kb:U stwؒ;Z G'Wvj`c[KEgOb;
+/f#c{E^E/z̠(@u^ Y1y7sRֈxlT;dۜsJP@rp-N.lk#½۠yMq'{š=mBO0)17 (Ujԋs*g_
+D]o<.FG
+3?!SZP`h(EpЩa ?mty~]'G;1-|?މ̗׏L//r FK͟kC+)=GCbA
+nuoxH);(3ۃvw1F6/ĴAN<;+/!lظYϐ((:wE
+hHņ DӬ%9*aNXG&la)B a#رH'[uC4`ڨq݄W6#v:-LHg%vbFz;z^T&D M#k* JrՅ%ҲYԀlzbzhpA0gZ,yd!JX7_'pؗaWJsC,sȗ&:rӶ^'ckk 6f5`:g^C+A/5;xi wx*XiLʀ YOt̷-ʳ2mIDO; h5u^Q9$M<|2+`O. M D{zCh{iB/ב퀬DxqLN+RMwZm=$p0!-V5Ts@T4*%>߿!ل9oNaЮ 쾓r
+?xjSZPbb ΦNn¾.0 筝d*q>B21! gD%e兲 J=p
+Lh`&ߜ31 HT̞p>C7 >P.+}VuES!\']@li 5YWGV e 1YuIš뽎A:MKЄjnlU8/Kfu+ BeP
+, b(%ei-H~BڲC}|3KjJ&D*h9iCDD%5ADH vK<vЕ>by(*f._{rXi8#;2'Aq$8c|+ֺA!7&PE M
+A(8<Z加lS#]
+*ujQTG#-ڢ%߬9g mJ[볊CZx0~иN N;獠C[`mCiôs+uZ 8
+\*|DY?I\!eeCߟ=i0mQT#!HmIi^H.IA~VS$VP[G\b2
+Qa1Q wEnߞ[J1oU{8rF,A-uC/̚-P>I Skg'tU. !OꐝfS n>|՘\9M5PU
+gaRevsJj:c \Mh.oo
+eH~)p@
+C+sA?ALnB'f !Y.p@ ;9eלǜs4cBc`ӫ7/
+/tT7D_”jcFߊ_#|2B41G3
+\~[)Jgda郒5xx
+]X(Gu$"H :d<v aމ_է*)ӑ!"Pf"-i, 2hAVšPzohĮ,ǰJj+08Ջ)ӣ!d`wgєhg\W餶u045qRysҢ{* q%Į*H*ۘ9Yć AG1^9ÈYj)o0RƢ$ AU5
+{}uf-
+ Sm`'G_Fn"2uXY iDd%yu1lȾ؈PS?JQ,97jr'lC5R"08z +u4̔9bbd 5$BXP ~tIEfͫ}.
+WyVi6rLV{6m @6 g?yZJOJf4uKFc%ž*x0BTLn +>S%
+Dð 7uhM2
+0tq3z* [O wTG~!:m>q{xl(LPVKX<>=1fRCBy[ <U"8L
+HXfJyeYL;@ayv>,,(v,BuOׯuY|uiuưgg Arjg=@i5G&ru|Qϙ~=f;5ێY(U{Q
+2ۦN:G3Sv1z+Bo
+,a§sޏҖ몬tl-U38*}NT戔w2vUg]@6U*% bAbPrf|HXbdDV}0kAM,fba5"m rqyqς@ZR,",1Q9C('s/jNᬖ~ '[:B.v57h) 3L:e \99wJ~P'xSh2ƇsK$ eBt5sdK; UT| $q~'{{vaAB<O;ú0qd⣕FѢ)Qa/ NGI"6v
+9G+9xM.\dA",Iu6eׇ3 LXn֨%#m/Ir2Xg;?p-IWd'rKL3&9 @f^`r.%
+X!0v8<Us_Eag*oy[?yCpd]_tPtPѥb0THy}T%2N^C`CaѹxHyo1}XղMٹ{}*cB^|mĪȜ҇Yƶ~cRk!?G 9 Ε-Ql ʲY kCKEM#cY'8e??ΪOZ̬ G
+@oFwCHM+qn1I1 cDԁpQX02ĕck\bqѭd6iUQFD?@> ~$ӵ]%;H]` A!t n
+B̔^&d[ <Қ7_2LVVL@0BiXPX&6tuNln3QHU:N@!)2gS0yOMeczUWނ`O-_tD炤o'O1$ ں @;RkEhĊxN-C2W/IWȓa(E̼ۉ (J#F_~p׎W<>1ω}) ʕOtA(kv fCs>lw@y)pX!J4;j`W >KIBj]c?FqHT@0PctyDsK<j稧* |6)k0 _ZL T "9Ș^@ <|ޅ ĜBD0>SY!Sq g )PJF'~)1^&@=[J}_%,6ЖS$+321 JR8?"k|h-=}SˊH(v^ 
+\u4r
+AKSȀ+40/,#{ tŪd9Ňc*!=2*MUFR <SZk<K%QQ)>^E7y=C\@b(Gǫ"se?<xU >ZX>~hb*!C,^YEHPĚrؚ%.D)_ʋAp"
+d7U)M9Ӽƹ׸S ?BaX)#\hn O6oED&]j5n}ɛӗ"0ɟ2)PDraKT˦̙AmQ*s0@<!
+}f?vŌS+
+и)жjฅrkwhIcEVYSv!-T`|#e KwBoC8mҊRe#Sм^@4%xg'bN8S|?2h."f>FAgHY4{˧}+ng3RLA
+G|+= u҃ډ3#'-! -0@b%ɔ r={IvSD$c"Fq}7P/#ԽyE< rս7R/v=W߃9&Q"<b@^iD3Bj0ET%x\&()aGǒ[wb>옸)1S%GE)ƛܰ4Pm:~kFQlg`c$S *fp+ֽROz >o"e&PTfbbf
+7J: |9r"X؆Ipx>B0t *~9G 26Zؾ7aAyQ8.8q֛-@J
+vgD+a&X gJ@J=_,26dw pj
+4ك=<bf̬\&*^.![. lBqu!~bi7>j x
+O)lmS{MQ$fkSVb/md[K0o|HCBv,K:yH|XyVDR5zL(#$m)0,a@D؀-AMþij> qn :jOC#pG1*^^w(ì
+<ZBz#.B¶pTP:mZ
+BͦHM"Rʹ&n1h&$P :3.\4EYHrIgL&ɏOM}O"?,ݻ+.:PLN9}JxO_-2jIo 1Zn[#W}d#\Nn!]$cSmQ/Ҷ9η;A~L,e}q $ J}qLd Hf؆4'1r$  izN@_ÆyoIqhb\BY"-7g#Nĭf:r;d It!ua*:iNA)
+`"2FH&%ˁcj,?ѼǺ̵]C2`ֆF~/ԯ/UZ?xRQ<.tUA65VR<*]T؞LE") CEr5ae8‘]$iaR-. 0 ZSh7*U:Ho3^ :r?8egM-KPK6t2@-<A_ ] 11^ذda
+,A?_hؑAKakx bS@Ch=$LTxo_@ĔPo=p8AY`g cr\F
+A"%9`dcuXc* X %?U˨'9QP{os{N_~Ky%%ʩ ȪTheGZ=<eϽ#Ȳ1̹b^17`="i]5m(G5U&wIC&mOQr!!<,񡻪UKr;wچ72 49B?Qd!GHDM: ,_G}Z}Ket ϱz~jZnBrΖ3?1)ihvc*aw+#ʟk8%&ZlP7SೡI!KO6ؓ%r0(ayw;2z 0ZsaLe$qVq}ȝud
+ZE=r?Ho׽*A\Iy(9rzm{
+b.xJ4M-K))ҽŶW2zSxN;Iy:9Hb~L4GEɋ_<`3~exM1X^=*8wE.GWa+g V_=.C]ӖpJ*RGmt`߾c2IqԜ>a[--rcl}
+2h/ķ*@:2DqgdNQ|GTxP{*kd
+y++5؍R;…~ט6A@Xyfi<q`Q nzo
+ႍn5m:Ajvc6ѦHR\h4.]S*`3d@
+ SbjzpZ[ڔ/a Sڻ+71ܢH ?
+ ɮF .kX$BMwN @_Wֱvk<#YƯӧіދVKi</0kַ%dMQoEx;RJ/EY@hޝ"VHϸ)PɢGދJ*m?Mk~]=4 C{%%@Y*䫱QNk.vF>XVL޻mp'u*x_Hk<?E?޿z;=XӎIhgF,.Հ(7msp
+)Jh[h'ݱTH'sT9!SQ2#skT"l\qK׎S\4ߗ^A
+vp׼>
+?q{7?'('KW+oI(5Sd1wOJ;
+v=A8̷ZWX+Iatt9l5nXqW}fޝ/B&HţerI]&7ҭ< 3X/\-U|Լjm1.ק`Up|<Wف
+{;f-w|b}0,Oīѿ BME+
+>GlPrR\3FI=?B>{԰+I^&G 6yY:o 홛[S1\{gX"9u8#]=,*HNM6˵5T)yIW%$Hd#XdJ!`F/B{1}06<~??1LZ*{Zqlm;}F |hYy.cAwn(J틇 1h(y"rpq tSB$gv&3iHkug8**];0Q (d%}*yv\@7x闒!X@Em^4e_|(*ϒ8]5wJ>T[T#FCPF)Ծ߯$vr̘/Җ=eaB`$6%Y C Iukr%aKD571*<W1LIqj ? d`kyk"qx%v*vKn/ 9{Eߋㅮ$$ܑϻ1{maZk>*"LY2k).J
+J4y>TEP 8dv!M4gڙlژ60)D!)nTRKi¹~sp]},
+D ?T,>QoE(FO[$ d\!1;K؀͠3 k:PB6\,  .IYa>N$bKVy`@rq/w@(A=aQfL)Ezx+wU⦶+>șD G1.^W
+irGMGp쇆1[I_m$=!J ü/
+jb Z"S^88u
+[g%sPDu=uS.6^ :E&'P0–XƼeZ qO7*!~}|!
+PC&Gd*!΋c[T]N4"|ΩҦ.>)A"/4q|
+ xEZ9^x븜S2Bx{}_΂ѤP ܣi 4D4}
+ >Xr8`@L=&wDJT9*2KdX4 )}9H
+̰ ݘs/٫vDb@ePsYg}A*CL>]Z\k#a0Hl ?3ff8CG03J vŢ -Ln `;([HCdǾ)>deM\suN H֜)R{rA'yq._!Blp,aUWEQx$w;i$]d UMiV:Ed^Ci7,R`4sx#KUOXL35Z(2ӃL-#
+sGk DVX[xu5 Z:Wo!.陹 ˠ389HD2}B&Lr}ϨՆ]e&;6LC)K!~1ԀagX{i&^-*J]e٬7u;-:=1i02Vz,"2άy px\\}%QY'C␉xru@bBe[%0HppQa #wHǿ>}<}AX ,tiy:ڤ2XaAZ "LAHzH3Q! MQ@2orXa<33 u&7i7Q: 珑t KqʻGEyӹ8Qj.B؟|-rmվ
+m\'*>_ck@NْG!}kq43T C5$BI:uAx^}:uf_:{]g^ö\
+B#vcmqX^kxRrt?!6_eqېxsiZeIx C\DYВnXc|c d%b+AFv8Uh@]t":d I@cO,l3
+E#+]NiN4T5h&B086,X
+B!>N'r a 4R,WksE/حt
+:Zq
+Ivx05T^T¤X3F,Hs'}F,fPuAs
+qd~Cy~@q799Pwh&I
+v, y C3Ʃzߜִ8$TKB($b U:}&
+,1`:OV*
+55+0=9R$RBWiyq5<F#nwuvR=4(7>tG_đ=dax6Զkj!>*oJ1Ԝ)n'<(%b6_U9zaB
+
+<ltOQnrM_Waf^9o@G((h'1ІzUuttdt 0by<2|:&n1%+|6_zHWK!%b( !IW@t>=ج }~u
+z3){mO/J,R:5Wu(G:ChdO(NG~J"!ӷ`aX4u[AvV9e~sMdJn#?o
+3B+>~
+HMd9
+OPw Lun1fʾv>PVwċ8hSfe!cXӖ+Eg9-dC7i>#
+L-!)qzu97?C>:!-ND:d6qA<:O6o켵kClчu!*X+t@\I1ZX>Gä 8ŽLi1wfr]e32(9<{cyfh|([dKdl_f>͗珻$GbW2ӟ eZź;&ѥzڪ`
+((۲1n̘bN)mU7IgPU7tANC8W}$}ۤ'P$GGFe& f1|\|[Wmыѳ/H+ h#L
+P#6FlQ|zCrEhENn EzYJc!a}0t~~-Mh$E>D#֢3~u$ž@Im{5<J/N>]l&ī19继Fl9q\ u>:Lciո?fɳD@^M0԰-h~4\p*a<Z\)![f݊4FgRʼn*h:7}[=1(zBQ*蓦P tAPCmA2uG #B)G_:V3JIR4^uhcuL/NiRmH0}OVuqvbظ:!!V1/c~l3wML*@S'g0$BuNC7}WpX_2= 8ƸhNUѲhF.bA4Le;Uނ%R )аu^
+%\w8 H]mP xD7An@[VZSw_@7d:85pqr3gO=.'R"MDxҿ"Td_94ʾR7^'3 } 12$.'8:'
+=DEgA@M WD^9~ di|O ,UpĘKʘ0qXA"C, Y#
+؞Ԡ)kW]qo6i6;HzPsf
+ x߁-O bNw^{&;:k ȉ#i@˫ӝxeTx81JqUhL&]hRbNˉ708]U4XfJgx
+lfn|2iraMAN1ʺ. 6),BDөsyJv0h
+ۮst0s.{)[T8
+Y
+bL*^1 0T ըs ]7k>R<lZZ
+t#Sr}JFٍ0]NİDs f s(ek 3̞.Ve*EH`)<A=xʍGN.t'/d[ǢV͙Ql)ji
+g΋U#OcQYr{
+rSc%!c &3%
+!_[G;|uYGmPa!e+ⴭNlRHz&Ny tTy5./kHh(B:c'vY;0Z_!=Ńˡv- tFĆ@"l7!҄ޟ\& fzIJp,o(%W,F%FMѕ_ FQJZ_Ǩܤ!,!ao )E63yg$u<{?n@o@w|e+Cm@x4ۀfфIœ߿VL\r]xjɮ aexB+X7*!<_ (]uQ%u.&E#M>Sm1dbT-Nٮ=J͐)LC 4ѾsyYnyH0NINvС# OH:Qd'śP:!잛77 PR@8hf`K{ HC,
+Wx)r&zY<_wJ"P!1ܵrt2WNhV3Lh`O^fyu' _0ucHf\C"'ƹ oIrfCzH
++kqЧi')Ȋ.&Vsң)q/^`|GR%FȓvezyE1;𺟗A\hu7ol ,;96p!L0Mlh+֭}%1~dmL`>eaN>cx}Xᗢw/bSV\T4DzJV>VԯGRØtY61tt N[wt]A>!͜-0
+pFs艟VVX@=_dp|_>B8ImD
+~)D§s
+&
+I)r,S`3`Q;Fw%sI%^OcjK)P eUOp
+'ҋJ b=)ONZ-xb8IYjqs'fRϵH#A9]ERrlў$9m?y8pc$ v@/۹Dk!SѦYBG5TD m
+
+; [RHcS PTlw1{D'1__%>PB~cC9t- A`RԼk0
+`YfAY(#b*?{$S{Դ!rどq͞6 _E^U[seAVtp#S
+<TԇiÏw D
+uǔ$# \AJx+KJ NR:gѿ;"luLh "vdNiP܇dK/bA@m7Ax17't*Р
+]XSb 2R5,O\Aq
+$[~Nd"ĨTy"Ek2vj98nI
+a VIEdX*Ӣ:rvG*AoοsVa[RY0pQ{3L4+
+] *=?@d#Xl8Xݫ8]ZX=| aPy}蕘߿ޓg( vD="UF2"m'ȧ8t!os]nY8(
+9uYꇰQk&ه9k9Wj:i0g-x"-%C<+V!]J.6 GoEDe V+h
+FHX
+"STN{ZMR /J4,o+p &-vV䳶o+3r"U^>`tBA[8gB+tj0<!e+FI,i3E e}%"[ RP`@AۑNL)/a"a"i1|p{F/F &u儹[%FQd]EPDRZakr4V:~1AXuIaW ST'Rf{~vuduܨȃ
+@q▶+ -)y9Ґ%_<~*A9DXu
+s2o{e(y>P]
+<_FHϿ\64(`GsM!O"jHJ˩Q\bj Mt-/WO笞Q2,cDIVfۺ0JP~mGzC
+p6~OBrg2p:aARMC7Qg F>qYz!:g.UVeTH?<{/6!i"l\gO̗%cX̅}ǀ@'+1LVB &avdk& uDNfAg-8@4qwvFP͚q~Z E iӯ:7@Qmi
+1E ^JSD3GC!8ٵJ!L2 {8}Cm /@=;Bl_WTM: mF%MXg <U@'S7080䲮lufAC䅌65*j"? QWجMG!De)d>@VLYW]@H53>k̜+'6QTwd}B`249ᱽ\MΟQ8vg}f[ VaE m<@
+Nk7m@)}9@yty<AX<R_\5i؜8$Y0;WqX3Ǥ`waRWcBf zLNP9 .2gnz!ۍ E{I95˛#oQ9 11 B^T'*aERQ* $&up|{%|19E۾j_lv(
+Iw&*fr@rBPcrJԔ)UPS츶FmCP
+- {q0es~5 s1}R IF6 D[ .1i9۠h<^>@ YfF(ԡL-,)#RL!;Gpr4X6;FǶ
+FbM;e$vrH7Љ3A5|64]D<[NO.Vm 4@ i-D]Vmǧd|am۲'b\e)0 ~wK~aC:"9ߺ{}?çC[c Sqkc"x$qAN@5o(ip8lK@*+?Ĉ$&+<.2`$WIˌˀi Q8&vpJ)LgG9m p(IF"rS2<rt[GC%xHxeT79+>F~jE]m'X{Poshd"LHhRe/tG/p }9[E-
+B>$qlf '<d;qӗc_樵t*J"4 "ePps+NG!4JfjRgw}eՔ]l'8!XyO✜ +=$:!\⫤&ʡįRmw,Z[H_#L0}gd6
+:= b%IՃUj0?
+90 @̇Mhu㗔q DɌѯcN|h
+^YH,k*q_ A>AW#kqV `U2T|86]0
+ %T;`,Ͱ,NQkhCRAthY,#t2%9^œ7A-%or8|r4>H:,^JB5_8%Ѧ8Fy,: :>yq4t;9 1}DfDÜ "<o ,kg=@+oÍdl ˨m nU!տcsCk2˞*GzʪJ~N}޶w[lF Z }M{ #`A*ZSC1յQf>/\\py #!z
+ 9q%2S`zˁ@Y-&+A0+"buM]I+385P] Af
+/% }Z'9eK4}M">+xŃBJn\
+$7`!PINvʕ-(펅UC:5""ffg8wyOPӱԉnn  %>ҁN/;8 2D>)idؼl0J KxlfֱUs7Iu$eii'%x|?oG( bHfRrkJ ,}IX6CfAԀqv3_ܜ٥Ato)W^%W,<c.MУyPu%s;A\|3W,4)0nHNǼ1؜uߵ7_;|X/xz?JC
+@0cd6AMJL;Z
+HiݘSїlZ B׳а$kѶ1fO]֝ W̠n/<Gyfۆ̚zK|-MKGV|b1BS (RJBPZEI6Hz(˔tJܑdzMp~NDZDB}xJhZ4 Zц_
+JX9x"΍1yPO%mFPt %Yw2 av0M#G
+H ")
+;UQʉ3(Ix
+Ll* 2(^Α0&|'4%쮂7zPӴ!M:EGdžezO;4eh#~/DSœN.Oqbu$.qipn .ʒ\R_6_
+Z>ILΩq &iah9E/'6ٿ=L/US.q`@f%M0oen B8 נP΅#g<:k& (d:. ޾.6?ظ9:-1z7nNZ%d8t F(dW,jo5@[=|9GN>-?-:ooZ+.>VRLGvR.O\3(4 <Zu6rJCH~VsxhmSfTt@|Syj^*g6o{Ʋ6&#&TCMF nCvJSD*"
+zb`2Yք-/'>9<SEG[=@k;;G2@<3S+Gߟv^ͷ6LcLNK % mm6pȰgc*" !qtPsuÀ*M'@K*aYq-)uff<E0#e$YDJF(#DX_97_a/H6ʛ1+Z,ĘLSͻ,I_^{K߂F* u*qkʢ%q8 !J? 5Իu)!`4l ؀{:HŒV<{  M`$(NIz
+gx d ]ILt-9Rb(h7pE,Z2=Μd<4MnKw erQ׃){dW=}iқT
+yZlG4HU/W%RЪP * C5;V_@DhBSy#7H*(R#N~¨8[eYuVL@P@Ԭ)꺷~}@5Ѩ@‹Cv739Ǐ/i*dCȑ<50RA!bi"fIa*ab&QvU(LgGGК9(!G&#/Cg`g2ma^,vȲoMyn.["pȀr>am;J龭t| Qӫ*/5HpoA4/;!ci!Π|*iVm;
+BW8AY҈ƭ
+;Ovs'cC#%cL. BBo.R6Q ;@NCcR^Sa:#(/ ErLr;IcWk'VmloCUlBn */ &^cnW4e?p\& I4N$#_쐦ʗz]I=:cU!f!X ڂO2H8ގDD:<Ux-PP$}oVBf1Ňb8ˎpjet LQ`m=FϦ_kqaILZ Gd:ڭ\;@P(u\7b筅ҘWI1p2c'~'A^
+-Dޫ9D1<ZLfz곗y=,+vBHpsH_:P%ƥ8Ze u^bǴ"nNO$^\.UDxgmTT8hj1~EFPhIc# Lϴ(eM)Bd`Aĩ]b&= KdMیm"^sb{^h+[E9֥ٙ]D|t GW)yBHJh-$BVbsAwS77z.&Ҕ]\pE2<mX2^b;I9DmC1-8A4\
+QhG/qh
+*vPFFjYݫ=+S8Ȇ~E]`bbqvmUy.Jj= B Z*(pVM┸a952-5aEz AvVc*j*BmwPfHRxl5ѫ01A_qq+[F%&o ƴ~dd8;G.ц@K!l;vkAc_AY:(!T!GLOv^Nǔ,Ĕ6ؒcR|l]" iW,'iϏ7'$ 7Fu@@MY[Qp8 Y}7]VJQyCg䔝J.%0j;cl_[^OBc w쭸)䅷ԭ:t-#ţ0l8hPsPU${Mߋd[h{ Wp%-ɫ}_sJ׊gN33#"pL " / cN(xi`Nhq:2 ًFq"fѯ/ 9᫻BJj1ZvA].Ja~hQho3$zURq^YG1(XM\at2)Pip_)^i+u!``Mǔh$2jM`7L]fk#n5X/O;xyxߘ3贒0V]Iݶ;n#b<+=?3΋|hEr]U׎Qm" X"nx(\c^:USHHAmOcmPbaLs sP,Y>,|?kha&#YzApK$3
+~s/4x< ?GB”Lө&n
+=Eq)7Ml3`_3a.ddޭv9(rH{LpAq֩00yEpA^ͷ^, {[]wZi3 v_Y-@%u uBrJ@
+a0(<]83ɡ#1|\yeCg4D\3)
+A4&
+dz:F^MH2v1 zpU*Q עhvuV|(sTŢbqץx|\WG
+ 5Y&
+X]c!DW& ( =y>hls'N#No #|ƭ'Y먡P}MkdȄɯsbHx 6s֎mC`M g ƶqh 4ġlzD"Y]jE[j%ҷBITI.%G^{ew'B+Keؠ'ye/z-
+lrCl!V+ *cb
+ev f֑[e!2_>Ѳd,uNba>o轣ʼ`Uޙsf;?gR)9@C2no1XCVy|ɷ ouОuyZ2 u)7MLpM,L.߂LƞxÓ vRbTwYB66OiB"-@?B<3}% d7%XjrITx\{B#W0rsUAΘsXs${ r*Uf 3I1Ka0Q;ț@2mqiB+x1W#)=Zt(={յ_@ڙZ激)PG׀Ś̀ỳ̀)vr)].v;_L\İkvQ6 ~x_wO*mP֨sWGIO5_@p_tfjv2p'cgK0^4:uOF0{; [G3ieϛ14)]ؿѯlVwH&Рe
+?^ k,
+۠-;4~z-ą8wyr#1ˎ`"S”J\ۨ.GmHET&ըu˓K2G p2/\@!K寪0 ^2PeRP'_D[!#ʰy_n>Z
+`wN%˗Hm rrN6ח4|[b+?b[[.\Oc퇰 }̬ܗIxZ!oN益G3+go=l~r* uLd?^J[kӶE x:~;gP}ѥ8W<=o5]xA]"
+j:;.\hl ݠ
+bp?Eiӌho0 vqLRȎI[}d&AA =;lq%׸y2(?/I I`DBlþ*Ċn ܻ,\vkM{inRmȫI+&h"1|T.^ &sˆ 4Xrl4y90o`Ȟo}kiq`EO&op1_Vpn@" JJep -m:dٙR=@"Y]c?n'7~ Icc+ ៲݅@ tޥJ%KH& wLZ vɊ:U"蠪t@/Ј/j}1bKfZ =tǫ#%v$/`0
+]]QM ;F+qR,eAVD_@ns rSf)G3OD,_16&HA҉;y
+"B=LUpqt
+J2߽n$
+Ql%T( ug G| a|w]фtw⩕IP#m dަk3f[}
+en/2y4΋@,MFХ͙zLC i0l#6 u)EI5x ݅ )&e->bquU*ct
+tH?0T4Hu9#2LJ~NR9LML^,=`m(ƚ;Db+
+T\Q|@A0%^ !u#?"Džty4%Eadls}3iU& NITy\ Si]7#&Ԅ D p;h_/ɉqλ
++yps5 ,|ʘ' 2I[M) 5u2|o7O *]w=k+/Eg+Jѫ/ bp`sdV/xUM8P:͝)`zJyDj;cRͱ SQg\0xI+Z$v+vsߦL˞)%,Ÿ2 &5AJJѪV?E]Dq:dM(FAzxKXVϫ{t-jՖ!-X?syF N^):='zh:9pʹ* 1FU&mFKIú+`uYU9cw&oh/QlQy6F}E2` &pCfب
+1S-ER~n=me
+f0wb$ѭx7cI!o|.]dqc\
+"Tq@Ca7>n>g󺅅62t 93ZIIW2PVmD l\3|%G.5Fgt
+ZnE߷"-7KͤQ~_*
+)<B[ jrBF6?{0,z #m-SSeHGG2o۶5vD MB#{8%],Ǻ"6)jHD;UB^L/7CבaXJ_1)oмU“Nk!+>}ΣH@1e'x)@do7~8FEk|
+LQnm8 % 4"3m@]M@I9ʏDDBOy!݋&0qQͣ 2Ag]K6\x~ŒCY\]ߍ iU!OfJ;ޘRxۗiIл Fsx ͡l۠r6(W3b~.N7FL iڄeG
+HMr\9O;]A =˾EGJ}|xۥWr- X6blT*\cy3O m6KAKdr6Ͽ>.Ų`-d5oיL i4}CtD~Ĕ{u]mf\j=‚Rs8\{?
+qYZS.Kݐ&a7:xt>ي%$T$"6XSd!{ɚ2B՗J{uC\1zg&M7hɒǠ2_٤nwi\ņ}{Zh2>Lq}D^~_o@]Tf\y lӯ?2/XR[(wƈ֟v[ki,p9AA>6dᰶYNrv5PzXSN7 vnջB  ݫHvf2>SgDтrWsXu`-]17QEֹ p݃>!h s
+Be(ΜwԆJ%^.!!5AS=oʳ!Uk6|EAסcAR_>sn߁U7ń4f{2E:1CG'5nLeNw$1٩0cőpVfR@?bѐDpJg!@n63prbi1_GEL13 YPa4VrT+u57Q4 ct!]zL5'I{3y>8,YUAb?ksS4:VL?"VOejLBY^M—^;^&jp6in4 6NVPq 3tRڊHn~ Ʈ| ޜOnAK'; ^a"O
+^пҟIx2HoL0~7&Ip`
+D2F-bLh3ajQv1ׁd8'cNƖd +I![! 
+Gک=i ↹FfAѹDW*IݹFõ#P}d ;
+p0XdlWr[fL` Y^oVgk+$qV $/5jF..g
+azRFe'ap8<kZg) 'u=6yᩧ H R/㓸eXl_
+}\$!,O$#=jlCC}LNf>7H\D7g{(ߠ9oL8=ر1THOXEsVpf]I)x)H}!;)Yںf3ZJ
+Oa *D qIGI$WN^)ri\)eLrM.ֈwCV<V ,PQHQ.3.i2)e `"
+̅&+r^|@SJΡ0wAn4R5-I7$I+}L@qe~
+z^06ޘ6hkؐY
+ǯϞ's$aXϙ% |[yX 빞svwHl)"
+a//IcQzBtp#` .hmCyx2҆\t9ɹRWHz3ÐT!v,gKq$Q
+IP 38
+9u)ʛHQӆgS2cl搘%7ApE,o
+ۥ{A!^ ǤY\kJ(5ɯ^ykΉ̜T*%NQ&49@\`"MZt &.)XHP 06y.[%@fro3ÎstF)| ܴQyq 1)9g-wd8x(+\vFc۩OAL񺢲S-˵B_5oj|҇_6v7}A~C$7v+vQL<xV:[֕I~Yc?A !aZ3=68n%2Exy!Ȭ z>*Ęr~8,bHe/!GG1h\;⪊Y7vΡ饩xB4g'Pbb`fra$6bpH29PF3,'%H_XRW>J;S`m8;X[gET뜃Ga_\5 aٿJr/ttbLA ҳPe
+ܕ5<|#~g uP|J&)M_Ձq=GY4rll8%ZWAAKEX&'=, @f0OG\VR 5RBMy_94иZ(
+b3gJɿ.[ӼZ?
+lz8 p &z4
+Xl^$QodldVOnZ4iDMy: :G(Fe *W$g` 8zi8=Y2BhjM{(Km{ .ƪ4@(ݯX47sAဢ)$Z9}{APL(
+i▩?i ã1Es
+OF4w!5Hu>id|<!D|*T6sFpqf6>oLR6
+V;XNJi@Ɓ uZ% c%f t ^k:u$`-*
+8@٭H$$uJ!xlU6:_џ"|aSMtE~i y:# ?E˧3 jm$RVhxGrŘaptQjKNNh|((9t+k,Zڤ6E h)$7!܍b[s8oMlL՝%hfZj.tm C?\Ҝ{s@/b@=TQ̞tB0`@ꮦ:y$ *= ]n&nnN8-iX,NNigL7v±1
+\m* bRiH~Gj/]7]&~ޘŘ"zX.H#XD#i/i4s׉` ]m/~SC
+2ǚDžHC g@ Xejq&ʂ2oWQ#ѾJ$,ɞLJyM6HMY(IAB^\B )= @D#G :CN%ūC0w5ioKSYf+=# zs tlMc.فdnVWbHr\ H~LiʇDh}a<!Sf.
+
+Tבڎn?@} pMa˩n:R"/|mx=_8i%\Pk3Zg] ,!C/
+{c{{ 83?]cz=uii!'D)IL<ճ'wp cV>6fh,61v9v+&47G3\C;7ݍ)$ńk AL5dQR=Đ 0`)Ë8<ULn'wL(6>b {2 oET{
+l֋;hna ~c,@NP)ٳ&yޡГ(o1[7P"pJ1Q]ŁܭF5IU9wwPd5W4P&ʛ^˕Ed
+G}]DJ1nLF+!ױB<{dR#Vfd;
+,*ܵarE"/Y~s~$Hdi_>+<+7ȡT^=!ϝJ]<֕X 4&9[
+9#O釛&9lڐ%0LfӬm!3_r1kY
+f ]P 8N <dָ@!hD)8A YPI4R_JU o!=Ye:tz:nXVue4 :& S . .:ƳOt[s6?D j+) J0y>f{Ld[am0j.$;aKɥ242<DnS)\qPWōNI'&5t:P{j  F NȘr!ڦULl6|Drft *SsBj J;L\uktF[S
+%aGw?΄ ޻óKeDwZ&j5%/w=Y[/̟ISLWk6NW}õT?J#="#NX+-sgntO8qA|sPWЁQ~k nR69ҟOM<4}F `4-F|]sUNB Kpͷ
+ZкtwD HSǾ%n &y`n||Bjs͕V(mx@ȹlpo6gn} Ue3Z גgw(K =ǧr’JaIuS8,:lMjOMa5sQZՔcQrŋbM<2IS*jV6;O!I':P\- E=fO[VSK
+e>|5y[ֱ.}cbxL T.j(:qoE97&^Gv( jQ5DNAdH%e RB8Ÿ)
+\ޅZrJ`&`m(B1/E' Ae1䭟/:@vt05B4:CoAmiBN > m~?@: зSfgِ$w*UCl+X0S)WD&˘;1xr@m8&.7q4)d^3x P^h
+ǧh*$.r<y kpx2 B*ĶՃТUVo"@7*i >xSu]UŹ:u<*=_U)s" Un؅lb[K$ܦrWR,RViyq"O^EB dXJ =KH$,dJpˎ%QUw QŤyŷ7H Γi6 * 40LuA:"fLNG-.0
+JJ+n(bb?ٝ\AXuHI>2!iHa*O*cu (b:=V%-Z?43X+=,5}
+I q~SK |R]8-2p7<`.gZS͙O@:r'.ퟂNJ~GH2= $I܀0|k4m1FiCFha:*P6
+E̡+~ 
+7sA
+|ja{2,^CMTeW[ux5"3j9HJ"V)Arr9Pdwq0qޘk+&u׌܀ O$ɘ 6na/=
+g٦w3뉎A)tk-Xov?*1Gi& @8:.j#1hgҽi44[R S
+r]=ܕOa۝"Nb[w' 4̿wV5ݥ$_,OAb̤aɨQst17i 2`Bz^A ysѸDj~0j-*`Iס#m̑(p#yVH=IϺ䈶0ͷF=CwQa,X*0mWl}UãXt'VO:u.e#e8qCAyLm0#DqLdxK r3eiN0㋪&,1q+>{ 󵥩7%:c9*CR
+yI2SPj e7$[ϩ@S+ ̦*t|+ѻ :l,b!L*= "ÄqS(ʀB59 #i0 DB B@L+{͈Ӹi@ktF0! ٟK]d)MZ4?<'C֘ ANj \0[ N%BP :0Z@90)/$9w@w i-/}Kbœ.8Ă DЮTàYW`We5lh)!CL}>%E>Ù<`$3d 5E&tKWM苫&1aPqGGVDX/iwL皗 ;4S'PB`%vR߉$3UV |94àOl[ 7K1?alz<q,#5&jx\;vpF! !ęJ(gʹ`LQD05畺%s{H1 S7|42mW_Ţ; [
+ `,$坬@E_zb5ˠ|SL$^yMçu<% M)&JQ!b+ȳu9Ly#L$J+(hyQv~1XZ3G?uMֵ=URBsbiW@xȠcT~K.tq&.$wm^|$)B"C"8E:[#ڒVEbBn75{U43#3#ږ72gK/ )KHI&n2!~N@o_O iYgjPn|^Lԇ(fVԁBP+"=$|qqq* P؍gL5\Zoeg I;]7Z;*y$DaQR[Uu6?cܒiLK Os]F
+r(@-Jn9 Kb+4))
+5={^zGlp<rQBK(+[(p$㮗:#Ar_֩zFtSCϗ{)!϶b\њ޾"?ž
+IBHIa))]D <ԫPS@ [eQ$)/3ծVN(A0A9 !^#P iAx=!sێTSt|8U~P{ +Q(ki_SRq):1l!
+K2cp3( U"bYw#73Z<ĒVt`[)N!DPut&x#]Τ|3*e5cA+,ҚyR[v[)s!S:/7'~d
+n$4nC&AjpĎgTVݰ~+ E#>qh bn{0U8Y,AFssXتHajð:pHN~+M?jϟECE@ {|[Gb5V@T rTUheiyePڱs+GyJ@g[R[&JRF1psb|Hv)޹l!V#i$í&j'dO2W,a!Uꅙ>Rf{XOEX
+mu_n4nw<2jYsL^KlN1eXщ#bp\b![q$I+G` '
+r~qb=oK@}ꑩKZZ+n(Bt!P9ѨY^plN8w0K\t<qr3yxg@fB1nDumar?̦2HxMb2 _1@%Z vW;&"@첐i}0
+>
+13#q*<'JBc#`ohrz+G?%[R[^ŇW_mTDz%չ 5bD[BG*Ddz)*Z)~ p!*Eba;9(pCF1>,TNj0)
+Z`E]@&x*>C , yǯ(hِ͒M`5Mev;R$xR~NeNm=@keI&RgV'(8ah,)$u7 ;AyzoL$VRlنdvhpٻc
+,>rz'm#OW]nCz)z?)dᰱϖY+u v89A _2T]LM%qM[~OA_
+*y1g ",T3/>J1ct32#?2Zu0T!c8O<g;]@*p9&nLbHc]";hz~_!|ӂi TR&R"1=3$fNwC
+k KiR Cݞ b;IY>! " ePcЦtB(YN+"ވZЪ HhC,aZk,A3"m(’:xT5wʈR<m:?獔_Oi#
+"\Ud 4Dh!;d!];OɵP_aNxĈbgH,2
+)+,Qvde+{3sHUdƵC@Wx^ԩ$9pyl3/<6 p"HUx z[1U$ʓERJwuR ;ITjBg%QYsʅa ך܌L0weA|Y5Hrm7.G:~%{m/ mۂj]$_"QG@(nV͋ HDꯣ6׿A#<0 )D&wCnX5
+` mĠA V(3B?
+6QR:+g 1pN,-]3+8R8k_4H_#`v !3Z0O%)T` ?a4\<Q\̦Qp`(Jy75'NE>=}S(&1p\
+ɢO${PSTZr=,ߊFeDL> 7xנ nfo Ȅ6ѻD8 Bdz
+6'vp,V!?}"]* |R2 {6PNP夣h
+mAP '&RSlS?ݠYQhcE2-QbcË&>͖f\,
+@F lUSM|9?:27܇>lu -<g=I_vvKR@x55lR7e$Q&X!1FI3:QQ%y7)P1v1hF?1!2+(ȸ0/BaLI)j6W1n떩$ڭuZW޿Y|B(n9&p +N!&vs&:i A.ސyx#񑌂V.-G5P0єbN~m,c:#} +<[@\8‡dBq:JfDu6l 3p _uL
++,$f ŞUD/Y]V_˜s'#>L˺ק6bQ 5F[0 krɮ$
+z>$9^GO}-)qK
+1zyU \3}^J'OD"ܩ
+Sgѣr1yw`k*>ǯvhOZ4` 4 0`tCQ5Jx)z
+GNXOɨSpBUu)N,}R$݂\ځXc 0PVǃqn(@99{̻(
+B;L eEᯂ/߰Ɛė+,I:]qƁuDL8 +D@>0C>Z?gEu?pWH1uK)YSS 1'$I)+sC-Gk: 9#lD glܒ/_,穳zE5e8X
+̀UQH|䝭-u`?)OLǸh+bJJ[-! m[^vK<{SZ|WVaa`z`G餶n~-Yx1d~U{lA, `~S?0sq; zM1~( [۳^`K@ZMfLE ;1~c5tc,%e`MT$ػIe2=0h
+Ey}&V)'OajʧLd>e9'PԲߓ'C[bW,rKاuD ,=]UE}P81 8I^| -c۟sTBۧOhM2fohuZ]'`lO(3p/%[Ô{-Iэ&9?$%K9ip^!pXʮ!tpW`1(*YH3lk
+zxwOWz$1uXdzJBCɖ1 P>!~E<^A[nxӢPH Ng[ZO-Xx-\*ZHu1肉KgӤ,<apءPFdH3&:Mx"=ׇ@pOt/aq Zg]*ܟSciX.F0OqyX2YlvAEe#Zy/̷A=N
+113L (+>F
+naO5X<-s9MS"nBs?T`5\|:nu:#a&gCbx'Shf8ìKJW B9%!xOgM3C__]CDAxPމ=.;L?(;
+Y`]i8M${KAs)D emW<C+p-HG[,BN:[gl&e$٫ʴ;K2ۚNi*]PJ8Yz]6fy>(!c"ѦGV2xo*'+ .p4b 6a&센#1HZ|ʇ
+0ȞR
+e+EQ"7ԗxU<?ފƶcsr
+HMrd7Ow 
+5GCDln(GϘs9+Zuem ݢ EsZ!Eok#P%ݚnroM)D\.<B٘ w1.Ȝjȇ/aCe:g02<q4oSR7xbeYS4B׊^T2}\!'3S zM9z;u㜢EЕ DX# fז3diUZlo)[:C;%OsP?XyAv!:48(ѥSf_!HšOߟRPׂpQkȆ)j?tg=))Jڹw\Pǘ54);5} '#w1ޢ׏?1.a~}t
+_ Rc?;~EmyM۠pӚZ%7#)]De܁&
+r`z`vqX{*Q *L{Ia@h}ycrJT󐂠\f -:*j@*\J#_9!Ȕh\u 9~s
+̓H]ɚw:Y1]6aEEr&vvS?n @! ]@ޮbZ00e_o?"%UpM@u^9̈́@)rl2_*ZTOzVĂ@둒:Oŋs2Uq(F )G
+z %̰!DfA*tGa<;iO\Ź8t(cChzCmR'n g>99'IB_QI/ߣv'd 3N ͋aIA/C\ndž,x&N ecᇑMXYLJ'ylF2);ZBc q5b1iXƵ.CQ_6U8fXM2Uّ<"1nG7!}zydYYr݈3WPiT=z  sak9&$d, 9$#3eA&Si;|\qN8Lo-hٯ֌u-ѸAO>sYzt]HMЯ[Ӑ]J݅{~߷@wf$]\[y}/ey}|'WYPaI!ݖ-rK6IItx}QPxL4b$V7m}qQ
+qFl=j} cDm`];vqBadkH"<̒A\X0m
+oP Ìi@r5L+Co>Ba9r[H"M>~UT+|8rHbGu\2ڞP/y7%j,;}NOeCܪG)$+~),{G-VV,V'CNԫ󙒋T
+> :8/0#[^$7ryo
+llR6ǡO:F3d])3%!84 o= IWXi4[Y~nF7_@>qOmΎGuig o>6&@ 1X]M砭٥{$e^೥]x>cƴSA-]7]Hkr*.:RjeYT`R4tI \o6U06/~CeC4gCRdUma)(dox߄ a%hЩZևGyӱLd'Zаb=2x7I
+tKo^C0Ac+7iQV`HCObftJ f}
+( $] OvEq9Pm5#?r䞙"65=] ͠ա&Yd^iI;pZܣՓzw tuەP*U Ot(%啽kbo>TD:}+!.G&ifCf-g@oآzbmC R Fb.]k
+NFyqRzyJ@T
+2iA8te5-&q8>c`8yr_@~Ɵz}ܙ3ÅyKV$40-ꝳR1 tƎБZmfF-%>ML\yE_ B=93PgaVdU;G@`)dvQ8Y1C^bܑJb(CctcN;+  )E@@IHFoSV81Cgs, 0Ք_rU_5%/(H.N!2b#$ߘwKEv F,IBKĩG4!.%4YV!U55ᆈe3VYBJы]`$4pDB
+>褠 2 `q5!^]Ү$1YvٶrB3*~ѷиµNPE(݊=7LJ(>#nD2XU2 !
+: :f;j7aA0d+,ٛ )lxˑ <
+=I
+75yBBB;Kc
+ua |J1\llB=[` Jf5[%cJ7)V׿+R/W0Pl@ dq
+Bt]<!;1ta
+pd: 3n DXؓ܏*-yH;n!RɋX$ՂTCLtl14S]ynRWlRloCO_ALW:y TTtGnE7N3 uIQa</X@ /%Ֆ ƅdUTKA*Iۖ\E5Ft]eJE v7Ϥ^Q'}:AO)CD
+FĐD[h&u8Y#.AЌh IO,թ =t v5JNa9`<+H;0e̽\"OM\b+N1Vi}%q>Ţ Bhwz CCse v\Xؾ?3B
+R`C:
+8S( 8i?3rG5>S] džj<r6%*
+% GR$$hQEgi@[ae펃EEs!o|wX_(Z@kvff)ʻ.O*gT
+e;N9ŏ ڗNJiM/;W:t K@sx 1ކq Hw;A&!w+K>Gz|€}o]57-eӅ ,klMAvm({ Z!䉶0nC \!֞Mq̈1z ES0hƺ ]͡чWiiq牽g9y s:JԫcH<Yt"(Öº՚b)203jgboFU`0?Q(۰[Ivڝ΂iXS8%Q
+
+9LS?-<뛦wJQUVx_;5ǤerנRj(
+~tAUhN/ڲA\YFӆUBې AM<zAR*ٵ2aF#ֆԬ\^#䦐:(
+e1
+&\ A{-aEX!+ZSEjH.2d˹~Re`i?\F>6D̲!FdÅ Ŧ$>gH x>\Y@"+!|tvٵ=6qb\f$Yf.Li&5he"*DgD\log'!!Ƶ- d/<ܷKXٶ4'x}M hj΂,i%+#cƛQ B{աj6eײyԹHJ溣`t
+@El*na#>ĵi놔MӆX*Z8+ Z3;0$N06Hv6z<Z+1L\ NMэ́X^)(.aQ0e0ʠ`TL1c $LaEr*Ŧ#ġF6BQRR~BBQ:HhjMK.0%GBœ]I%dEpH`࣪Wo'vpr*2{%cg)̓
+OBdѫs#ZbOQTs
+l3TQABG31[!ORƦ2pH2Hk+ĎS!['}%=۟N&r 6WeV6$͉orѪ=0$;0MEPT=h!6gF|e'!o6
+‰eb@p
+mô=yPwrmW
+1X~tu$ ކV颸 { .LELzܭ4mMEt񷨯c I/WMs*hDsL_6U7a3l1Z*1ƒO~eej+&qwmxĜ?Gf0M<+UQ1zMdg\LT Щa<dA ,cwQr!:5 /Ԣp^+WYym M
+yi$5X:ޮ?"/x3̖:x`j-$ftV~i0r
+ͥ`-u9g@W7<Pa4hhBh'e%DopѴU\z;̏,
+%QU+dOBa4@.I
+F{Dr!qW<:(|*tB=zB%9F{w7]5G"Q) ZJ\GZL|HYfPyeݑ"޵&zSAOԟd9#,<d-` hj:W̗a8έH}}ѵ2^^!y2/kOb_a^>H1j8&WQɼSOri2
+;0U۰JX)
+>kG
+IΠt
+OkY0J6@
+R^o<p@WSMQ߹j0T0SӉ~d1ȝmy:˂ SˁT3Ք}S$㇢|S cRO:PovMˣ }__e?,6q;AMJؽ~u r. Ap!H8==2} DagX#[t U:¤ZWƝi<:c PT A1U2  vA~h_@ P,v!~Q6YV-ǣ't'h锃NpX]0vmAmqqv $Z}ۏH}Y
+28ii:~d<W~0ȃ^\y?O+졟R f6٫44לlsVSM׈م~F,_GPa)jVaz84iE]0"lxc5)4nQiB9}Dd"N5ED!`2γ2 :p2R
+ۖT\36z`4ps [F7%M]퓃Elp'7DJԆdV2*@ :2!2vK0N[ 4E^mE^L
+cDЃH\4Js@&vQwqw+eϹ/v\Q"gU8U67x"Ӯj*ɟ#VUNY
+DMm:sGI l\԰NI{hPnz Fw 4o$~6Q9U2!-xj ;_2ufBd9Dfgv-kg[AfLdel1sYl8tZzp/9!'g' <QHSJ N#(┃!*8kطi4r|"MfSwce#d1e%P`GW۲<ܞԐ7(>CU8oPUĞ< R01T1K[|ڞ(}Xf, 2v eIPbV61A@ZwyԼ?];<uC_X\@S΄p,PmC
+^_;Id](dfΉc Vbdٕ!HaS?iev%Kl7 f/ xû.sMiJa_\ŻGpJ֭8d,7olUh^
+?sMz[IM83^UqZGn2J1$Z9))ÛG
+49
+c6cn"b|r$#k>Ob?26b#}uf?da>_pL\9/=Zck33ÞO&k}AiGoBu je]B>z1vAR#" ^G_X
+O n-s ))) wxUPA-vePc!Ll/ӎ *2$޻3i:7qGCjHUH]vAw}ӈI1I`ņ_^\,&zJA%e;>6,GGmBflVY~,BɓB8x۴ u M;V8@;Vz@9B"l)#Y%FW]:$)u'3-c+v*n̞@S0Eg!g:+<w9:&!;!!UL)coǹ J|#;n;hZ$Q6?x o'
+Ԃkxx?R׷I׃Ցo,NN/4 P i.oN,)/k? 5éDHnhUԆ،^
+!T8?4oMJr@L(4ȪxȺF[y~yv䓧e QQj? T`*cdgÁr20;B NE<vSw7L-'b&sQﰗ7Ɲ
+=_.,hƃ9%4Ⱦt?91Ќvķ#݅tѶ"aqH
+ƫ`!+,ؑ]!tfH1tK.6j &8Rz1Hץ&? q䒤<3W=orE/NYq@Y%Uu7LdObe+zPX!@]! ΁ACR3W=.ȀQJ](pJ )Oao=L'F013Cq@߿Yamb Xch218]
+]$^ݸ~V"S:#{ZxIWCXOG`dWl򐳜7c#)H SXlYs@j28lfS!'QT#xY
+v򄁩0Hj=lOm_bIЌKE%_Ai> Qf[m  @Y [JBm-O%%\Nd "u+$O`ԨrkYn&37l~Al5KFd1)>FL5clt虂UJtO)w PgXd#_{@`"p.QUDIٛ{;7PKl^^ D1fpSibC8XJ5i&EbZeبx>I_k) >jcf`)1=z&N3QenPK 6%?`<=[!KV`"=qe13 M'dzF@8 mUQ RbFyESZ'3Vse2X\b+ b"m>Wsl A! 1X[ JLW$Ծ"_q(sXq>5v 0a*WVQoس­_BxaM[_S&~͒[pFjqrˑiMQ<#*g"c@zsf՚3_mtv{}e!2Z`ifY
+Me URS-2fYgJή[V՞e
+
+R;w>K%/tS8Lȿv@S73G${1]:ghgᇬ.6pQoc58VFixeɫW.eUˤlQNuT &93Ʈ"K{_|7>/8T{9R% "ԻFn,: !^N0⪲ p4_(;+j"c7c+h r4ٮV cڿ}Y*D4r`5_%|5D€
+ՋZiQ.S%!"&vIq^i?
+:p(%kռd6tVPu Uf"ɶcbG4T)p
+i k+CeOscœ8CI8e0p.tv2ҫ]gx-]zdH56ܖ'4 w ’dmdE¦G 0 >x wP$`g! Ueע(#f/OXs8&39`;v˧&ۛ:s 5vr•l#rCn9ii:(۶8Px;!ǽfOGߝ`<f\Q9dԵ%$ /@nN1 ᘝaYlIryEf`8N"@]3p5I<)Jc"A=MfiΣOu{y.r(Q
+gQUzmG&dYvJC
+/K"gfHJ_TqW ȹMAxGe^܇OCg4EO]0C᷊YJY7E EaㅨA qIB]L%E>w6M
+ ʌRD1PHǢ.YăT%w
+X!©#hJSl93D ی8QQr)+a2rBca&]Fj;mlєnp#v2` -]h;&es_H09"4޿qop9YO[O
+y NOh|}]
+$m[~^ܷaLiQ,5
+L#]\v*iRjlSKJskыaӑp/7yCjXvg C,Dvd+o[EG2+?Qy4ͨ7c֍ ݙK:SO*őy}F2^&q@=t`J%RQqj| ?V۪/5A !HVsZ,Xp.)w$nDZAUnкK
+A^ExD|B3X$©` ElyV v!\/a$eA D-i-MّosfY86'c qJf?Ȍ1N
+!,v
+W1&V$|wSVڏ1c1Dok o.f[ܾI{T%2,?T406H^bj9eP"gI[kc3]r⬵(U`[f GEw_z%_
+טۆ?reZjc%morSK1݋lWu>˘G4tkGP,ڶc_nc9Z5,"%S|-{XDw<,
+({2γ5 N\y꼬Ekb؏^~Y7~ߨbZk< Q;\Eo@GV+
+TmOVt_#E
+_ J@C<LB}νd. {rqɢyqsgsVsgs)v s<0ߥp:Hw$ErF-Y(>WyNx
+x鴩
+9d /TmN3h.h9&`0! ɴ.0,u?Tthj6=M¹D7E:9.ח;F>͠:9䛖VsŐ>6JYJxi*! !lRМ
+OVG$yB"i87BnA|#2슊٭ 'Z:t3߈JYƵL3=tngpLuOZI)"+pkGƵR.W
+>Sr^wThbla
+;Caah,N<4S`9
+`dAs wIT#tr>:dP.XCq|[A9[13{D
+scvc!aAgV;cQ]X-&tasˆZwMWCC
+m;4.MZOcPLPJ>[M JKl&[U}mPs1[R-L⟌Ev-[W28A
+Dc36eIas3kK(k4Z J$2HlVc4)mM.V+A`ǦkfP.)tw~pND$-5M5AR2\o{kBdTMVt 7HOsUdž&]kXWR߈~еvr6])l5!Q
+]0؛3;sᚐXاZ5i]5A%S[1ZդX6uhõ6g@ _
+k.[%@:aJ/[mTڒv0FwRz/ .a=f_C2St0A^[Jyoc 2
+% 릁KQ'B;3İpVΠR[Ec8^-hv1qE/6Du0E8lD߻AajCpxJϷZ {ٸ$$+~q>gʳ Ez8*: g.N Acj~ўv<±Rxqq+{8B+&PU0a)Z^IFũ8S֑tqqTIOd\Ђo9.N=
+(y‘x964[0] %&o俟ֽ q9M1Y*} ⚕x{QSrU.e*G+7;N,
+-e
+4iu6-Tgf-=-qd~:UZWϳi
+Hn ğ`!RDqyAr?#v ]?dUdex6E/?[{L-L@pQsCzk:Fhs",/?+sz!!Se.ݠaæ9V@L֑9y[]{z_=!n{'Nx׏mWk0YӚ6HF |Co G,ZtAFp6s LGsCB_^~0z%~8hGX-jӹpv&E ҇5t[1lt| 1 6De o"+wa8.fe8@U[`Wu7,ƽ_
+6ĥe73[7.=lڧs7ל.!`= b3zI@6}Am7PԀ6zGOM1;
+_NeabLGtj*N4#7GF:zM/ P?+0;eCN; Mck( mCVe
+_!1UۘBd- Uj>h"]N.&&cf~Ҩ6^>QԜ!d$&ygdh_)91k!W^k>2`f"/IWdآ(JoHN' u8pyPNt`î1*ŧvybOW*+8{AI Dr;L43VAAkeG+:P3<`tw0ezfgL
+fGZz
+s)/Ԅ,X ;BGAJ%$k ‡?<CdrAl6;A x
+ʊ7U L &=E@\juV$KAO<fg@Ȼm/8 7sbTrwSIblXv7 avGZa.c9
+] Io#u]*kBHE
+D6b*ɘg3RJ$ShtԘ@ X)tV_@PQ|#s%APloh`qZC11!@:NmnXcR'Tp0LgOAr/_/@lP(F ZKy3s<= ް9 +zԵ 2F0e&rd,m蕟VZ0(esQ/hVd\7ԨRfl1|dܧad2Los+\w+f .F 靅x7eW$
+C-;/n0dE}7}JpEt?k`رsU
+a^^0&^yaJ}E  !0MB:);ѽ2:3z y_#ۤ,&@ }<_)ߓG[/f` h!$)lHK@50A$HXJ|9I
+aM$E4+w6A&F>0{*av#`M5%f=rhfQkdz8,'|) b Bj\|zFZRYcJwc ]0g#idӈEyDe3y`PҼ7l]XP7) mtbXd iZ;)_ICMQY6"D<MVQ? %bKKJЕ0 Y0! 
+pQyoi3GߔR4/:N
+l)>E4,?,d )Ĕsةj]x:,ڐ
+rSM6#cdja*/nPHw8km-eU2nLȞe A8&99rdċms:yrmt̢#)۽H*91Yi
+WIV:t[p;Z'6a=G@;1$QD$`<$7I}dR^s|8CW! T^Jh+C*!-48rix 5 qf~h˂߻nxQ]8Q*F O&=ґGE r҉ FQK)LXi.v]QЄȘIҪrc HFXH|2}CH ʷ
+"+]:~
+hoBq(֨8~zܟ1.Nr䒦(DHEKÏVP5򣨺k#d2CKlx{+"|)[2«i 3z rp60NpqHZ0y:gHPL &'ٵ-N"Y)I:]ZbVcJ~"7IƩx{tp*xjf<?߁,'|,:s /䓪K"]2H*zy/\D"[y( Io _ͼrHӕt).I:5Dngü L}yV
+oP
+`vS)IY?f`~-- j93qwiߤQvƯuȨ3M̨٘H7"^5""G !UA v+[EL" g!GMA4()mm|*^.aJdi_-PڒރW xѶC`[4F
+ҧF{-A7C ;
+h+| |IXKtjDFlAEبG ^O5w(˥ "':hC[4KIK$z71b$N*FpAũƉZDԶK4 s3u_caQGS1pZFQ((A"t˘0:<Zla}IZG Z:k#
+<<Ϣ7 qtiuUcq (4Yޕ*ĹRC}8;|l$.Z,Raq;*<H1a+8q
+RZ?r,CW_^DC37GCTb%A*y1F~Kw\?ߊF!@vt,{uJSN\FڸG]$nrK_/W
+U2&%[AwZNdx].!' tiq-%u?E )ag92]qzt_qɅb00m7@1p&fzk$ A|=)ۧe̪ feڠX+-Y]\Pca3 1Vܞ"_Nఞ"6pg|dx)<Q%)gSmA9 )~YaF  T<NYf*^oU
+Q4k6 TۉBH|iiFnzHK8d<WT[-{n>nzItNRGK=}&Y9 CC|Ox~- ܭ=
+}H 5QSK͆({o62OlH3y1~XWF>Ѯ!tyTT%b8X8t!LÛp3u HI'"/ڂHy&Ei;(<[RV==0q
+x'l30]asT-Cgn[b.{/?P4qtc"c ni?W@,% n3|C+hWvEw݆N⽟#GY;6 SNghFV7_n[<clZ""[LHzT!ȍ2 fne} mÝ4rN.'%7
+.}9yTΥg H/RZ
+DvӍN Nm7
+<)(Id0:;& g4_N@~N}*֜D Ypi9H0o,0@07U:d+&h.~ ]D7s
+MP))`Ez<opɸ֫ll_w,E9d5vyse7@*WgKߧHL4C,2UE5.e7c{6MJML=ƝeonzL"P|SX[ti{RjQ
+ C{Bfl2Z'$"
+CtX
+sџZ^C+Յȷ%vԌ v?m$r'ZL2a]RRm>Cbh3weF)P⍘
+,$tkHr$rm1peKJxʅKUD 'TP]NE37!PZtm'R?w:NlU$'$)I/u˔?
+O=@Qbp*F~4@48);Fp/jHџi`%:;_S?%~]o1Fmg0`;IU @!*P}X;^0>{ ^;t<$> 05lIR .25VPHyH~vQ{ͺ331f 7({ c.p'Rtm{\8LSOIMLwy1vr ] ;_5IlzT&`bK"4S^/SĻd]<$ÎHP՞K[Md :Y|ML:Mf1"}lΨIʭ<f4|gXTaΟLÄ⑞a/ /K
+{n7 t}5M$U6d L yBshw0<@dk~vf@Rfr3Z||b #̉i?Vf a{|3ˀQ+T[bk5Z8=?3M>?j(BCERe1nH;*f.)g 5&R3 o8[Faj+0ѣuoe5#W5.B ؞wM1 83 Ò!Bp Y"r.m# pӳHs8 ? b/qBP 0!)G6i΢=@
+S
+XAaǓ Wi@R: P&&'rI,<Ytv'/HR^oȧ]@WMHE0(Dʲۛ 80.CR׻ 1~)u` cGa?=TĺpYc-2%LY&/!ƮǪF^7WlJLjP˪ⷓvɏ[:Lώ
+O%0V?biQ@f:
+NV/(ˣGb;ip,1
+L٪dp+Мw9z1ľ]& 8Vo_ԯ GitA9dn28 KЀ*z1E=61b@,onWȋ21=0S&ɭJx^ vE״&XJi}-T`<\"q)S 0.eY
+dZ';[@㼁X'58ygHix+*pd>!bP[JO)a^g<Ave\q(A+P cлz>
+GX*Ep=N |x;!H3?w;1ёĦ\ɱR*xA ;ʌHG,aMOljpZ\!rXO(l @Tؕ%Q)1^Jr~L%LؒS^R'Vi1$xMzH(:V~7sj(Q=@#wUDi|? 3#-tyRʼ7NmT u^J4SQG!]&_4ezrTO#",ZPNby48"HDoxЁM̹re nmŻT~d" )U3)ƃyjDn& Uv-i@<
+̊k#e)*0!/~* 6(38J) oI%;v@72܏r8!
+}p
+T VÊɒ3x~Xּ@*J`,,5u0 h$[]E(mzׇĪ4IfA'>'2#=ֈZ{adRT"JnWSV ,
+{°1$ƀ
+݈&B.%]>́^u/;Tۦ<˪p;qS5ٜ1U(2WCxJG<Y
+K94GƸ~;؃Gnqg|K'Zdy.0/ڗ52M$ξˢUx5TZJ
+[by"h6fķWscZn+mxP|`!;fފ^S%K)$BFxgEd%(gc[j%jAX}w2h48mW,qieb're@rf/2Ҽ$%-<ʧ
+7)
+.YJ6\.Ig~T
+(ň1|;jH-Lc`\ 2R $PFdE\DA@sJeMA̒š4$(3G"+g+ʂ0ɜI[ځE M0,0.z1a쿆jIۙjs; 8jkКWJv<ח5Ozq*-Av`+ؠH5Y[QO6Ϩ2~'i #0B4?$]ZwA"IR~C@H&Z݆f 谒29QhQ5kM\sU QSۨ
+ˈ$Ϣ> ľ8gMI @q]tK# v.̨loR:%DcmIOp$ p DAT `5K&7־AOZ7) J~N#K:_Cf p\?neMTu%Ƨ@gaC ;%kg h192"li/{+ &R#4au'q
+WQ)-gv?G0{ھ%@bHG7;封M.k'C>c&7D 䗸CD,f"U% i!ge&nifG9Iq.p/bpvӺ ? I U'PSQ(!|Cs4',eqCCR!%LF"!Igqg4k~A ʼ=-| /IJt-(T]&o;R5:.|-(_,DqۻjetlgCBh
+jƛ;a6 ρUX
+& Q .sk7k7FGStW(rHgM0T0|U&JݘEyI$?^"paL
+- z$Wo:ڂdV˶o=Ί[a%>?" ş2eOzPn!͕:> 5 4͋xNDS!GEQHʚ֟dq|P~UDzwɪ*EZem֠XoQ(nE(
+n #90
+IorŤM6sI=vBQOl|p !|%CP:t5iPaBl!1ϨP@ T]!CkEc|.e[;{[wptyA5P񃕃;K|N*NUSBfmy7K>1WJtZpdje9k>(
+N*qSPkv ;[<hѬ0
+Q
+3=~(B䂠C HEYS3*aa3<w:Ԧ-20lq cUV4ŷS74X
+2,<S10S =@tW8#@\,ʜ̪>Ą$,ZhO!l'
+|l]%^PE⊡cCR~?T{ L)6Kvg2hu0eTkō Y"C 2O7cwoo cܩLú3۔:Kr@6iHe<'1SŦ؄$w>~#,J!n=Y|س"dRܾI?yuH֭Ȅva}}C2[NHG詯#GUHW,c޼dhqN`Mk^K>kO8>vH.|+RVs.tt#zdGdZ |aH_!QEU
+4ejt+A *dy톂W1#;B"
+:5-܋h(jC=9{(CQ_3.r!t18N<efQ
+{z 5Z ]BO
+̱VMmE{ሮj$*ML]*JXN$7"v ]\m6YE@zU!; AȜAg)a?;#CEs<<6nAЯ ʣ1^Hr@=ﰶ ?.]!oez*LhCvs@UVf^<aFC(6r=dTFY9@T)Gp%ԋ&bϠF4T
+\q#͔ cSbšm )ChĹxCnzi"@l{ WB zI("˾X#gAq jO%2Ya
+~caAsݎGlE>c-ZX6'㚳h}0<"=lΡRU š[_SҶA'~HL ;ƈ ELnX$S Dt%Q Ů8C>J+1y TTё F@opvLPlsv&*nA̿b H06X-A"âY9zK WDTPU+Nbd*
+Y;Hm"@a> (#Aʇ9 i*A\B>ddzZ,-8Id@j}x~ ' :p۫_\6=X'&'.=𨄶`(\^A38<6/wAZ!%'/Mk(%OQtFVé`!j X|҈:]( 5XN3E!LRvL /F$]U^w3 6DP~FD.~ _kIr8ܳ7Lm7lܟR8$b0KH( <8kYa!XgY* @l*\?
+}AVjB_%+ܡWc)O}qx;JPa־qF0)g/2V('# @]Kao
+Dhh$-pOКܖsFh@$R:K3.w-2n)e4jLl{\#Jz]$UcR+v9vs>Sem@U~u  /&2d>;9pj6 4=y6ϒ0hӎ- eUXB4uI?%
+3 v!^ـo( t)}I k+
+-@nǢ\Yy{k ]<J:[&ŇM'ꠌ)D_w F3|7'mk'3A<%1$8@wk7 ?\%bc@lgIRgq.DŽϸ}î|aұVDuǜNfSA0@KkW}xb%A'/=cIQA2´CZ+,h&tb9ywT驴m.hUuN%>@j2٭|/CXb?{ӗewM^KŏsGaH(M@S_Ϲz N:ix-rb@2 1ȴ;Fe:Be;#ցa;?\ Pn3ʄoOhi!Sph"U!`*3a[U UZSslgX< ]-nV`%JMye2+{<* ,HQĸ?xu,9YMSA:8Ƃb9ѷ6bըY$T<6}X4"P ;brDR?A>\֟_z(b<|흺1O@<tۻ#'\=<+O*<[qDVlsO<7RUILy7k
+ f7S*Xp^w럢.L3 $믢4 >kr8=,-Z8;he :a-/y no(](~M51$"cX #dp`PՑKĊRR<}<AA45$$[TlakT2y2+8w!b7I$3c"l_/%\Ҍ yp)Ĝ 47KVsE-yoŏ!k
+G9⩊NɣS ^ 5E :֩ihH0
+\<:`bFkn7K2|҂H(!:uri$!uN$."mH,:N=Hɭ1s8"攸TiU \$AFaa=o2UĂasW!b:|$h JWmIO.pR*w*H֍9ᩓgQ%R0Ț!";oJn
+
+F^sUW/m_^I2Q98 B|3aOz*8kt%;a.H~(UA(u d 1˜d6j_PGvKŸ$G$4j>7;^kr>\N}n;-/nen{=j2( .yMoЮHhS,YߞK#'CH;uVuۗ*; HЏ_eSN s<8`qNmj3Q:xx{(bW h%ӊD"lQ(RW~2;p-^ke%CRWDeTH 0Ynklu$-yP Qyɾ؂sN]闢^AIwsv2DM-  ˌ W|zFYW`es?ywJ#AeZUϏ.|lEXLH=Hwk~t
+Gt iT R\d`_ * ]د&,-iA(s#%%$x.CmEEq;{rr.s ild*UGI%d[\T_@HJPLȘvP
+{IVow> j6-,76Mx$~>
+z܀yEͻXڣӖQ/!`|!<%kW`x:mHĆ֝A HS fF" N5d6#`QE %N2`~2$*ħu>J VDQNST~z;3<1~U$#\d%SZ@~e6@/
+Aܶ5FPkXGjiXM,Y~"2.*+.$F+y2gŭB|a˴[G/*kܾw|؊z<DdFH06baI\'Zkv7-'qދoĬJ"ny$c鬄Űn_
+V #{(K䍭Zo2|ټ"`AoX^}|r% m?-,֙IMsIfx e~?dIW@ R4bc22X3V2 eNIVƒf%=<Yh J0FY % hENb {N$cӊ6Dx:%cao8 U% u|ph`lq^aIk)/yȀ哋N߉,"ݮʈQ?e%uh>ƈP4KȃQWGaf8%8=lfw-]
+ }EU<q7qԒCHlb=*AV0PM>jxR#\Z ."ӛCe>3oW 9HsS"NO+d5eHL &^Jdh$/< +׋gXpLW)yd.R8JH3 xD ^ϩ(#zp~cla9Kч!h_Dҡh)쁢ᛁҗ9瘎APM2O8"(/_*:#;ﴸ
+ILK0 u*-A#C_J%zRů_ e=VF*Ҹ_0r[߷j()$ٟrzh,W!D-w}>.ia+-(#}
+/NZerxEy۶ ՐwE g!34{L)ovՏ'gуl[xRmE@9]<)!bqﭟ7n4gLNu9{^iW`{c]j=iU$BnE
+Q]@cequʱbi[,)_SW+a\N4ȶmixdd%[?rqH弾HѝA
+;e7 0m¢;fհ&]kq0`@l m(kD!􉞁+
+sƘ J;'<x쎅)R%j).W1,
+
+=EA8/1;lE
+=q*]iZJr& ];
+0Kdtaa)/cg}oUHcۊ+C>֗8!sp \6YPW `xYR%ƐMMOaYd}Ȯ00"/
+wW+v
+ endstream endobj 154 0 obj <</Filter[/FlateDecode]/Length 22162>>stream
+HArDO;\kD}(Qk!GXng$H$ym/mT齅k*?k7/n?{VܼiQK+M{FjR[)%9Hպ"hiXcy4D(/h\MZmj7^Rw,E Ҹ>g^"h:O
+y޸ kٵ〸{Qz+Gya1^J *f"v^]2i}tTeʒu=F=zBDo1m GN=Q؟y8᫇ nFJѕ2w^UڕZ{|~@Y-K+AQ
+N嚒d&x{kasEP
+0o(+ nKf6#>dDJHP+MA\Bce}|Q QJ/6ox_}7o:CϺƲjWW(LU_4.g$xl!:Tm#VjoNy&/Ի_c~ ۩}0&tsҏhZi+^l@?XF{|FK+Ɂ[I&&j[ w7L01NƐ?ғ$6湩<^^ho׍[u G]Ӣ;ncNyT_RH
+'bQ|NfF@1qU,n”gcbaѻGnbc:ds{,&()HW1. Đ[Jջ MbZ6qA~oLq&Hp}B:
+JZ 1!2L3-6Y.JWt%amdWcyBӫ Ġ!WM۳?d$g:0v 17MAR:b2_o2Rbe>QQrڝ>9HxjΞExADˍ&M{Qu*OS XcdPzRK\Jj):(Kۂ0\ɦ&%7I.؁vIoֆ ډ{'B21nT>A<BF1qb**FNH/wnљ_XzZs-҃^ ]avw|îOW(v QgZ<N*bulA\2^ 6㫿.:X;`j;븥 @)4ԭΓDf;))C^F؉QVTbQ~G X2))ky\t>Y_y"[OH9,:ӑU6Uddȅ ((BdBُS .-A#FO79r$GEO;@
+&*6Kpt#Ն J9N ~R<[rAPq1] pۮDpmԗ[Äݕִ=gPʥEeuBl2uiW t'F
+f2ˍ!i cC' 8Iٰqc֋fHv`6}})\6A%#*s<i)N(GP&@_>bؼA"\cY7csap~S.{VO>X+BNb\9eI,863Lo/bۛMsD^5nlrN<@ wc|fn[lxrN+ >6h%HR:'L@wCƹFLK|_V#
+&؆jkѮ?bGА6^.mXV,k#"a+ Ϸ_oxÇ@;F4RW(ZÜqT;PZ+*2^Bp˾)A+ 2! ;)Tț{  :oJS3aP
+9EJuD=rC[ ė-dF]+ ?| ^Zteւ
+`P
+cs4C2|٧8
+Câ|
+#~}a Ä\A0Š/sr$@{]`vME{t{}C#ĨK< ;ySoZWiSH
+bj_d,ekXU 6" ]DzA4s
+BA`,HD)FrgJQ"FF`Bٖg<o@3SqNcEE4Ri:Mǖi t+! 2RM .ýV@@u %F ;9Içڐx8IZYhn
+cpl!Xb3:zr?@9h:'yз-P`1u?urh~Pxfˮ8)<g0SkaQL
+=qjBO;}pchо)uR-(n"ۊnqsuUlV3RmOU^P/!|!aɢkAv2W+BKoU_NxzPp8ݷ
+y>`xe J Z@$) " DfN}A DBĤrr_xK0>:df4n4Zӂ\r}o(.9^*=@\ tbXӮ*p _p'HX|=VS}J2Bh =o;fb/w&p9P>,fF<`ppyC/w#1ũǗ<=Dg
+v^
+d7~x~&6Y-{%qB?c\RBįJlҗ~qVgE&)T0nPh0ԃRAAx!7
+F^lx^0L.N ȒcX{64 ;É@ȤDZc3T>(8FV똌)^Hۋ&9*eL&
+vCW)ۄDt<lU A9[@y^N|f @Z< KޭOIN"tr0Ʋ$[bP1%EF2 &: RjIh#:(+YnZ--?<C۸GaءqK ڽV p3fL iָ*]vF E
+kA$Hҝ Zi;>.5ؾ&+OF7]d$p/-5wg9l:H9jJUa!DcлpTڲ~-b|%m{"F)F7LXF^qzE1(11aC-Fb4W]I ˯zO`+n +x%T+(a5 ,v3rvZ9:A"A dPA*gh^*@W $7CΔ¦Al)XA@\3O>`P0z޽
+ u(C('4NvkTmܝ# DfX)LKN2êGj` %ڑu#eU ;
+i,;0dSpDj&N|ǫe,h P1LnoLkv
+C@S,Ә `dg6MU 1Ac
+X#9BBQWGL%eae-m9 >x<b~(vПrdF a}{XX@c 0$KŨJ'hWԔ  `+0i4#IaH{4B삂l'? =aӏǠ$%dMTd?+Mɿ
+֛{+,B mK )3l\ݶebA^V"7
+Fr,VXv .*~LO'#dTǖkc(E[{uT@Aphi|
+m!r? A4 --;:4
+)70qgϲ)iE /Ah?wp+rco6A Ԙl {א2W,(;?pńZU ғv
+H9e@F[G l#-~dL*yZ}4"c?ٵt3.%`oa ~7$T2IʒG0 .A3D*c){"*궕
+f}T _)J3pz[tu3Hhp-H E,ZÏE бҞ1_+&*BL% 2V$\@ b$5 c#]3a֋sry‚c
+Ӿ<uT
+A/ѐ㤪*:b=lC-MP YF02ge/Gȳ@m>
+&ct51&엥 )FP(sBp%HJ*r7S؅Ya<𛽮~̭'{\H {
+u<Dn)ߧ/.чxz °Qf{uj8MvRj^ڳ3
+^hSvu|z _ @Me*_|xAʵu 3֋P
+ݚ#AdEvo{5K#fB5 pZfaOaD̮a#aɡ*
+4:ھ c1nbA\(sl~XpwBjxb~?]%FB_9݂&h:-jw0jCr{DhH^chɘk\P~pvTydi||
+
+%}O^gw X11L[H m49!Β9azȁЅU%H}mxW0LE/!?T٬9a"iDI\%ȈZKloC.m Dѯh0*8 l_* tWQ WI"NhReR <Poǐym ⥧vLuϯ!`J[N
+Q^B~{璤'Xo;Mkr} B]Ǥ+c+q-߼鷞_B =q
+7LfP%KrL=]!N0ݳB`!LVqM\dwK*S !ĪH6;0LFoEl? _8)DT(p_<hh:J5C z2ZŲ #XM2T>
+,MO !8u;!Nþ[*$U"x$Ǚ@}a[[%*[YHxWyC-\d:e%
+JwUL%֢
+Z= _q5pۘiCPa?f{-zq%GEƥH TJu(rۂ6.nV 7WZ:+mCU]1pXyleYvz:
+mK1u }mm@`M^w~z)q`%s~ yl C@{V\5X`] =[3A~/XAO XAy=1$&Un_wA47*6`s͖ Xlj!p41#~YjD* /k3}--htZɘb@xJL],r-]
+CJ.?&* ;i5ߚs_.*R|ǣ4{EіbL/E>G ث<zG|gc
+$Z;r.4oC3%D%ĺs%,?.,)c3قGfQi(֜
+g[jLTf8,lCS1"E]QMhSB; F 8l~(Y sN%w+BÊN})xUץLLC$mV'8e%}B LwqK[ևb1_ptsΓ;I8qu)@|MjyO椃iVC 7+AILǼ>Sӕ%W pbHEBl2W[c*EFC##U9vs
+~?g<Ea[-3;St9 'Xce@<nќ4ľXl,u8zF9Nr.6cdI0/+ʓ`|S"`Si}@}e@^H?a8/a/B1A?SMI/ 1%3uj\CK[YYЋ
+wz71I6+jI;28o*
+Ocd*QR
+"vҰVh8hDs1%#c(`"jV*@201Z̅K4n)lؙaeyBґZ8۠
+7)+3
+e%j|]5%pWuS[?ǜ>d[NvED~)dN,
+RW%.m[ K/֧X H]<qZ\0Pcs`iZ3xF
+@^+[
+ ozk*
+
+2t3\;I$צ$?D)cn,Η-/
+,51ᕖ\qO9<"m%123L?!K$P%ŜZhٌ^jJ(&l's.XKZK2P{L
+7gpf<O
+h+`
+eȦa耝}%M1`fe9,60q Kn L{ I-+
+P8 lA%
+^)?z̗k
+- mv+bR;~']p>?' CCasŹ_Jˬteb=<j\ \]0cp`B `63gecD1
+F[-u_ƚ8*9C(jscX\4J*rÆԃRf6a
+?G_f3s
+ązcŎ"< /|WÌLbE>0d'lT.OS,Jʡ?Ea0twNXۈ`qSp ļXS ,c=R$5bq`,A[ Cg~;CǹG@Ԇ:3)`E=$lkEJi~7t!
+kN1b}I<M0LFgt{g4$MN)yS 3AC?zwF{m1J6e#K:#
+d 4EsܮRZos-B˨ ?j}:Jb]y[`! P 3&5Uע
+, wՃVXIbs8=r>COOA{>I(6cT !iqnOY7IEy-$H01CRŲbdHR%1K| <6o2d2IcǡV웱k]TiKi+OVㇿ 1I6˰%IhT(\%CRFه<2$EPJCŒy ?24*x\ǏD|J:j>鸍ch
+6D.5:WV"t42)sq6gkNF@*Z|"%'!PH $ad{ΔӐIATèDCjQjG")tͬ
+NJٝ8r8=VWҒ\ʓ(tJYsD85MݐPt?':~IuihGoR)V)l_U
+;qHAT{-~/&OEՐ*iEOwpNvRLw] A#u ;]_wZWWU P.B?pn/VXK|Y4JXͭ1D+ RbHjAELmC07~"Fo5w*K: U
+ ޡ 'w9YΟOTW4E$4p(h&D96JHlQ7ڳ|5^
+Dt)(K"wza%L([ Q9.iH
+t?&ٗ樎\X\ZFiܪ&CdWa?>r؎@BXTBቊ8۸("JYm(͓kҽN~+%FRցědʗLp;"[/avpaLQZ,JҗcQF嬧ҡKy= ݡ5Ltg[ڇaC F ȅȽl DpFxؙg[*NZoaB~9 \9m'**Xأ-,98 UE*
+LbW>R8jd0E1ȫOJDu_#}3M||K+nEx‚>煜GH7֐aœ׈^vܼbD@]ճoqKPv{-aKP2=Nа^yIA𴊠v`-Ӕh`\zZsťcz-h
+J
+MoJF1-ҷ
+v9n>3 n?b][ڨʯ / 7cStE^ǣHr|St"Wlƈ}R%ץ;;/wf͸ayQu zO@IH  nqƒ
+HW!&/;bo²Wr%Š.ǽ*ʁ5"A*VBCɲTꁳm-9uEnaq(XX*9dN_FncC/JXӁ0pRglH4h'vof̟D$Rs&>6)02 Q0jʻS`$2I#vVf8a,$T%~T敏 Y#U.hEE8'5c? @Ed T
+ET?4?Q;hk4Y.$l0pV.0^RGj/A I%&f A]L)9'w 2 1EJ &~螠N:=m.!掣 2ni'bƦEIkx,Ǡ$6(M
+yςQ`Q%w(9X^PC9_Eo4qTQ"5TQ!(l|SU D%F6iCxO2 se^dXdT9SGe*CKhbd5e>I¡;4&Gt0K&IiwW!j
+`!Az-$ejG!)PyBU`UI=w{CrbYkGw4g: E=@2L+^7`"һ$
+L 0
+Hn `ޡ !E\1/%,Χfţˊg9 6,\Vkml搦@I_<1ާ053mhþ,][?e˞P2U^E:Zk =%-l1xlHMɇUn+-ZC@2x@ L
+9@z:u\fBḦB'nlTIu Yf1mW-$)Vǘj')AKA߮+(Y'ϥm?~e4UD ҧIk1y}
+WB wR8x̼6-qD0$ Ë"<f@sN{:R6ij (RIbRw'O,m kx)뀸jMr߀޾9?O:[nDuӇ
+4KJY-(TJ)Daңp9Jޖg4+PBhCx.7:2W>G
+?@eµ/ Zb-VSDs
+֠D,$Q
+F/cD^j,),+xk00qA&_Eh|L.R&f `/@}o *u]
+Ӊ03Zv ʺ6c v] Ȧƨ|ez׼-GD7)9NDʕEMv2בo4_=7b~f)U4j=Yo?}d9y{ ;oǏr4M@3ը}{=/<L C!ROflr+&F#O^AoySCؓPϜ՞1:D*Z%,9,JN\cb~z1]T m뻠iOri^A†TVs[ns̞ob^,e㏄S:,ok0{^ir@Vz_jQ36. a`7+0$#!Gbϱn8
+t뜒?X뢤ࣤ@bY!){J@lS(Fgvp69sh@'fKu;\J(!)sJU*OasPAq
+lM9AAXHY7B\c0iS"3`ZŽgXG@(=VA$"EyWz?"QA9`KV~idD'7LG-Pw+t~gPLoS`Fߛ
+-EQaL CXnqz02$nID󂰀-R1[|]7e9YEYO&iBg]Cȧ_?̅?=s(=Ջ̩Dh]Ҳn@׆M>)sP2ݮ]9Urfm<(
+Bep&v8ܘl- .9Xl"|.K湛:G$4F(铑 d$- *}; Bi#=J9|aux$q+AN
+Z[+j$:ވLr2`L{Pg/Vc+ I i†~ΔH4  &o Oڞ,M[̘\ph<Js3;̈́,=ц22
+)\"3~Iasz:jp<qY*)V5ZaӲ_T vD |[R@T/Rci. I8K o1ajkNy.,MeDJlJ((V]gdG{}%qRBiXvS G4]G0f7K`^m&i%;fޠ!J!2(a\" ̧cwd%Lw;qn%l6K 1
+Ց}a11h]0% [^B1N,-1/tD0uI*ޣ-c'I7Ɣт&eJ(ծ]Cgt>~gl-LK2[o Qy-s0<)vP~HDŚ7x$!#Z<%"7An Aܸz|OWbVv~!VxI5k@.iJ
+Foi^c>zy :i`PE 񃿀9is*/7&q{B2?sbǭ&_ղ(c#!r"j
+y< xB+XHޑh@Pi h a$bB}^5
+Z"$춞ib2vMOV5 ^-^bE7[kʠ|*|K†U
+~t2O?
+
+{N Wå3Zc2͵HnܿF)'Nm<SYIkd=Eh.oq^[b')#1G/Tv,"+}B!6YK(a08NFü6R
+(
+G9f2KE9Mf_y1'1.q8XeP2 7ޖ?\r_Tku?(2|򕚜hw^w[cak> 0Y&EcuR B{
+s2/m7vߥ^'F} 턽#4i| ;U~z SyS2\D&WA@K*]kAZt_A[2 0yF sP<B1
+G1/CYJ $=(qA~P0$(h@k}B.E{"_z\+Lr2Tt?L$^a
+̞%%%P:%2\LpUT)("'`@o5ƍLc>1?jPRRsNǨRfI< B=`dZ( 躚Gm֣8s\% n'̧da'>zg}EYе3#!}ecx@ZVꂷ7֗2LoX~z+X,$TvyA:BY%>qR^ W}
+٥w)ru{u֎Jz/Vf?oAzo9 X̕/18t/eŰea9:}@@XyDlY1bv>9}:_u
+I*3Kr>F?x88̎aK}yv8Gm5F}4*W)lvQXTcdŠs+J_Dc.0l vm2`Tٷ
+e7z+?Otd'f6i=6 #K쟃B(J0NQ^ğ)"&-2F-oȦvRMNP4se\ :V/?"L%F 9-h"xf: |0Iϑj)2F/pYyCD0^ ѳnx겶i߭W>Pr|
+`~gB h-t
+Cxȴ#~A;[d+/x(>ԙUVF?C\$-`'Zw UaGe$iJ5<&"lчpNF/IR[&zՊ_l8zWK[C9#)KS3a cb1Ec~:΀4i8PWVJ~Ud )16yrT9<=BAĈ mC!Cg=2\B
+USp]}v4tHC4mk%G2eufDDc/ZmB{7D@n'Ɂ*Rj
+Rsoa yRUF' x
+bBqG 50ra[)I)yIKWyR/s4$ /͟b/AOBZa#%S4LcR]\ɱb6di N)+xUUZ364S6WNJ鶼xFXJMyxbyi<aőP(oF lu&r6l"'
+ׄb$' Xm)V!Eb&qFnێ,VM1읝C 䇍J!. 捃h4L29pկtWV40_+GG*1kZrla Z0e|F,'ox}*ʰ6ĥ
+Nwi,o_ÓY /Z?d[*A,Ɂ$+!rQS vl!7,c1F`2nclz^ Y@H! slM+ jI,F/}L)O^EH]QIS1 8b`ZJ,$&ػ%$0yJtѾjڊ'Aa%J80DG|E_$܉/.T|* ~.
+#6mMlA)Ц vu Gh8\
+%e(8c"4YlX{$&$U1ܪ>/s\~mCAPu~bWB D0|p~FT",pA ! 'Ⱥ
+xq>'*~D# ~ B Bka^ExJfc buG16ͰK{yy~o$9cJk~f-M؂0ap 
+$כ`-Fšc7m!^0<0=Ktm(U{1w%^z`!n?cQUXjh Oq^ 27xWASCqL
+nY@blE9W}: v
+XVomyvhjDr ROح &iDe7|]W}vO5SÿP)H3R锉0HNL}LwO f7v9ФzsG'mJEoYk(?鉂a"Bbt"POkL(ڭ;g*FȾ2s!fT=ER 6YYG ?+eDdB!0L_L nRZo4-Z0JqGU H1
+ 7I#XOVlE+9ڡ1:r
+Un$i3F.woltlqvSť -ݪuʌ#fc<F4׵}S+)Lɕq1ͨϑgn:AEv5UL 7>5N4eoAsY :tX}1#N-|xIKu44 aYE<@:C:C>9x
+=l !3 Ap\RxYF=GfAҜN/@NM나2Py@d:o& %>@}ʲKndQGOyx<@D
+-'>!zkx}fR\iikGF7*M,Ӻ,q NQ0+5x{ڪ2L53eɠƑ$.@hTr/1_C*iWWmMJXL5,PgHBKF8nȯY$3y'gQGx;앏=C;&ldĂHמHOY"# M#!GO$NYC9_ثXz,HqlBB1Ռ'G01獣xe買Ҝ* '9GW rkF?nMab~Ib#-)ekU[U7(.ˆy*>5ɄՆy8o 'cÌ)3ONؐ,[M}B℈1gϪ1B`T|~Rt2Fj:ܑcXac}p{@EԥP" ׆ЅJlf`Le8
+>I!)S<
+@6|GB+ܜgLjvLqt9Ot랛)HXjGA8]uQ\f5f+[@Uw^$ ?! 0lyo 4s\ ] ozF߿rPVE)ß H1,)
+s4m7D XQz4HMdPVcB˨9sզõZfDwCB*BhL#NRwZ9n.Ə/ү&[?t83@0];B!s%e*8 R B b[%0ΪMSDup %[LOV,XJW,…#d
+o<Ko7N([u: ]%}h|'; {@X&v+
+j Ą#_
+}b[Ta&iIqU&V+
+ڳ |<[<4R[5 P{ӧ \ɆIoAo7?f2'=R<:\3VZ?*DCc}`0F5u-&D!CXa+ePp9ݔĎx!e-jF$`l!C ּ1rhwc,Qw@ˈ80HaCNi_!~13ɧDJ8
+wv:S&yD|c/4 ˅{雼 3Ad)}8vI 0go @j0<!:3i5"Y5ciEIMiW{oܢL1<ZprCI 5w m/JdN34 m%g`״1k
+Xb2w|ʃIAOqovz''N
+Z5h>,r(<ٷzXG 'Nݺ^~a*}5J]rD#Kq,f[!{qp˩ ݼZp{_!fF+FydP?7 :gFгߔ@1"փ٠$sBO"DE[5gdՔ ase39ּנF039t4C#!YZL%AԌw, 5*iao<ud=ּ DJ3$1\U/A3`GNpM8-5΃6ܘT|$㉾akf~B +Y`:&pTN6~Z"HY*dIYAЊnٻ=mEk!(X;lUԍ`NXJcڃGw|3kd]>C;9gEY4*.*9۳24q"qϴ$DR%:R43.*;ux̂
+L'3(~a[6H<ފNzQ/,n@{aߌaBӬO}
+rܯ[Q7wl6ؾ̓ӟ+i@ iʭDuo+l
+ 9[ aBʀsoK⠚hZR 7-m~828TRE^B`Dsa*3@GY;P#_2D8|YKp! D<˿_ա&g0M3DD^L_LX#p^]J&-x s+)68Yfq@Җ(n9r$FRc&S2
+DL1X9u)z Vpi͐pTӑsdU1_4)Ņ 1pJ*m#S|U'`*_u酕d!<z)pq$qS"%>I|Bf
++‚쑾5pWrR
+)h{<L `jT|:뛪Pv\vʺԝ!"5&N gc5 X{Ez "evJd/+:|;WnS6i,OE
+mŭ(xkTjIUf@yqv +]Ymq)975NEoi0/DS'KѼU)=78pr-/OsZ -wVRO^R َr\t˓'"Bi-3 큕-AfL;_%G<*4,
+4=+fb`=g؀=SB58T_b  7 4Km-/iSs̀`/E>ݱj:diwwzSJ._k* 'C S}ySvd1X }l 6obs C Xe&DJЋ;`"#~~Ӛ2O8_v~)q%ljyz-}&e%z "_e\ԙ.>K4%HSSF%X7q7A_'t T =NAoJeE|o[IS| ,6 -)e;4&V.-$ 'C#Gsr$ʉ:JƵ$%ܙh[MUj6& @f2tȀt^C Bk/93dz?D;qMx
+@0.06J94YZsybKNMoIb˾})\ls)[2q˰DKXc#4[cW-ٱR&'1@KȀ=ťA<oq@9NK ?@g@g
+[A0țƴW!ba/q-ch]N(Wc
+TlnsIŲʮr/|6mly1^*Uf^cL*ih2y`
+D
+*#y0ޓZ((=. Pcz9xT[5Gΐ|?0AGx+M!{qp=|؂5'|I"!(=u[Dpf6K@hlHӻ0N
+/Y >ED(D3U*bՎWߚ27]dDX
+u98+1S{MIO@ȡ
+$IL 7<DHQ+5u9Xeu/BDT
+;O#Sp[a%ioMdE:׽ǔ |㳷2`_߼#Cȑ#* 4Ɓg<3<&(́R
+̤d<^W0|TW/<` +vQP 1tO#bΞ*,ͭN/
+;mpζNK<%u~FC(",Ew 0G}'N)dy)A;ju(
+)[ K$GɄy;b[*m؊&
+Mrʡ3+Yߖ'w#
+טAcqP! ,u0Y
+yWEѺZZEK+ƣjZg䔵=i~<D6y dݸ5Wl[M*2H*UGA @SayaR"DoEBr.Bcg܋Iv./E qq܁@|xyJJ&7)JQy;M+ѕ4sE
+|J6LYةcdA+ȍUB؅48W_tyg?2!v)"r -A}3
+
+\S,w`MzKڍh*>=ӛ9], % =s4:=hs dk,ڼ~1v/} <Yd"?;YiXޫRRTUOyпwx9>~>ʂ`/&Ư j:$:pL`Vj"OsHR3Acz/!nn!+qQc:Ke+%"5SsOnw1S'EF,,_4/Ɋ$IǪM\AZ)ƽ d^D|1f(mt{l
+5=Z)B
+t˺t[;X*𔁇HDa `6tn85q&N5HQj!CT@M>QQCQSBrZ3î`q{#* dF #TkJdgv,Fqg \֋qmw]$դx ;CpV"<.1qDPlCGr'Pg3e,H`")XUiӝ"1B,U&huƵl@BR·t "iZ$8ֽ9ZVOUDw4b&
+~t]
+"Z[R
+MB,Uc9 <^C:[w ZѯTh@&4`
+kNr.n RL%홧}VOb
+
+4'jq”m>Q\
+)x׏H$1?J2mK$7ڭመ$3A{7UsBQЧFվ+]f cu&e$1*!؉ʈA%1s! %+I\C֣ģmGtTL1 Х
+U0hgDhϽ6ifgFL؁uS anhжρ&.9-$SlBK.eicxVƲԤ=̙ nisWJ"DŽr;@@ :TOF4i̍Z٬8A>}Ym;o& v
+A5uWD!y*nT{|ʱG=,Io{j~[IhIl}n#%$Qݽ
+y`WQK
+$Anif8 zU2"A9e%RVTvH3YSPS
+CL$XvHN!
+Gt3(RsC
+wZepwcfJ1]jAbcGB~K+T#N4U;Ϙt_ fl5oV
+hH VaFH%$c92j8TX2CL4qB(/yHgQШ! _qET> !IZ4Qv-Ҍ |gh\ܨ
+5']̇]>3aA$Q>d357Dp"t\B87xc݇ ݕ Ab$>!'\΀ 4'@`Ay0˓40Eohm%63^&g*Ln73@E{q.i]BJs
+W^
+
+BCR3޿O<QkЀ jOhpp=an-&q
+ajdrHM汖ᐬiK-
+R:DO³Ƃ^/ٖ8$K"Y>ah%jgۺ=)NvDoC$ٯ^I3ժrWW Td 8M'ٽZwD$a;#cg7A}FkF_.V }4d˳(8A(, f2;dh҄⽮C[vWԛCXG&dݪ{]Ub5*ބ֥E^-zڀ\$v3Kx'7*Gbv%t2Z>j/rjBYRH6 rFe9Wp@<ˈ7 N*ffK-_ A4>Fq $
+oc "i0m`}0|
+)Alsd5wRQ!R1B>: s (my|t-xZ_g(_GN1rXiQcl~0a{NP10eY8l=As"K+8 ( ]/k.mr{xdwE
+ 
+ʌ9|]P(+2M 2 !೴ Glz5DoP~>-lk]^~S|#W-U Q`1-07ifV[q_ :<ZESB zi틹EbK.qC 6i5cB'?A֊ ~'t$jx,l
+r
+HM9O;AH\YU;SjWr\hhI CuԮ!oiC^dқۯ}Ei5ZmmPyRjo rVH߄WW35bQ˪jQB>d!_k */T)cn]@߉i^_Ua`2ژo DG鸏HVuWXV CF.M}7^8VOP)1l ӡ-&&dtb'U d]54V"OǸl9`v)*3ke@hv[뻁ѥ+zuZmBWɐar%d/5)URG%c-]iӺo.zw΅0XnхfZ?I?縕¹ViA؂v%6
+j([ }%G.?`z@JYFz+L'´D B*L/qhR{;.P]mn`}Xs>!"S @~2H>>S8$W„]t!>i5]}Ez>Q9ШJZ \fuVyBH?!=e9:@6 .BDŽ & ժp^\4X6aFѵSiYG#>A$;̆/n!A]-·M627g@I CJ2~K~-!ջczD3IC! 0*1!c [ )ti rBu *2
+W|Z\7}v9?(_P^GLL8J:)uv;W%Ob|B[N7 6Ip⭯Rym Qf땾:6kʡ@"_Pd9mѷs:|d Q|$qFcPŨ~A-=Lj`j_lTn4 l?Kb Ò^ɱ۬bx3SyIX7@U5uQU}:{0Wr^+6ƬT9UA3Mq9c ?9ҳ7n Ac, e_l i#kn7Կg[nA?
+STW/։Ȯ;fγ"S؞݌R1,E7[YBǩLa0#<i ,C-%,d%fā)jUaΐ^~؃} R\NW^hA"iV7`iJg>5/fŦ},I9٫ß]?9%#)9qv<X0򅼑 | TH8AER{LgB qLL~嵈(Azoan,tz LfG|L4>}9k!x4o1!qbðhF214F[%byz6sb#VlnԢ)ޱ֣2 Ԅ6|H< !%7h)9
+f9?$9d'; h1knu moEf")̚ETLpO(;Nv1C`aLRHUOD*FSTz6CZ.:]˯,+7K{ڋxӼ}cTvb^ޑo-K/ͽr(*7Q@
+I[nMkȭ(dΚ4Cv@?(G$JvOE a6*ghՉ'.I.C
+]6PPM{sgf(JԘwux"
+hi_ҕIoM%d~@? 6ڱvQO`z,w\hӵ|y?!E
+,Ҋ_ VGss
+{$xt9cU9j`6Z4l@ADE<St#>e22v5.nEd#}O4%9TgJ
+(|nEܶ;FWZX8?(|LI]Rw(AWu|&r7f Ʃv(OZi3lї^ٹv1GA0G6V0j<7vaˌLÊ7}C+U=
+:s
+^y!y}sVk跒̢;L]<T4SVV+1sd;ք 59GDwlw WYCn 8!hwC":)n譈WD<ZQBmգ+_P{R=5"7:LZ0KaBNP;:!ԛ9%4`Pg\_9ĢL3[ ed&L_$}%%1a/oC1aRaEe*.MX&Oa /γTMNqՄCLzxָl@G{W59n;/%eYS:m
+wN+z=@Ļ; 0K7Tՠt߭%Jp`h+h-rX{mxZ ~wTnؚf[, j@>ؤXS8޿s8.w,wlǙ~X+OITh&)A3\0(G_Z'!3{Az[UY.Pd F$g`掫„<l~qRKW=|ԝ{:ҧj0
+CĄK2H/xi]g|-URN'`ʞݬ=s#lx:@%U9|T9M*]%\JhO\pڵ{" EjvڌXAć1cTcI!LxrRhsעJfy QGBvVV–_id
+(Cl9fq s\O{~) ,RН~o@#l "j Y/D(M~7z10am[OG})u9J/5矠O2bnB.r)\5McO
+4lQbHeʿj?DZW;ʷYȅp$CaRIe}*XmPO4}u@z=AU.>t!\\Kp'/o:cNmqEau/ :}(>*K%/UETThaUEC
+',
+/^huP|ssI RY<PafpA
+FD<`,wPhd:9&W7VI}߆!@ RzH~\ !`9eLs}( ךOuBGnn4Qax#2l;îI8_l<׷:_„! xC=0⎵qN9 cY;0AE {"3K3 ޔZsH$!T @ww2je}ΔZNbL cm3;̟$CMAq]t822+`jd-&q84g`sh1ݰd/cL3RGQ@&L.πH[]:ޜ$蔌\W2QM9{ -G|8)QEN
+I)ʷ
+dx#\D@Y,=gIiIGђ|XC*^4!s ?Ad']jxؼ)٬L+2l91$RiP
+πbqR2iĀ( Bo^f"@V`܁870gX@iiC,#cpwP[Sa0@}y5apA+/!zi`AZC HʅCranF,}FՎN4+dl̵wlp!.IT#^EO~v3=§9ń$!93y g3ίo6h򜓾%|4.~3~G4 *ee#'M]+S~vЕ[up~Y#Lj}g_IqG6u/c6dsVϧF&:-=c`oWƫ*(LVt
+/#muLM'8vb^EȊ[iv<kQbzGlOr엗(  6QMCC)Hn̅с ,-ya1Jáe;R&cc9&^!1QX%9:Oi~݃Ҡ$_tGX$;,)_"{!ǖ4.%CBq."d*E@
+F ih|aOѠ 1CwWӾZYWV<m%JWGW~ dxV>)00
+YWY L|_|m5@y`\4Ư떜
+:h `˜K;>,qlDŽچ.}M<k[4xޜw0W$<x{18t7]AXL ]h?:lj Z2j{"6PEj&x_Ep*srĖ+e]Tt&t*2=x(8C67 r%06(3YO`+Ä;&mpZ;G<B4Ŗ@$^KPFZݝLޕ£:پm[r0oĵ"v$ _9glq+/%EA|'ݪwH
+oc noXt47{pBł;9}Q[OI\g>?LőNM?^Z&Zf>&X(]U A#$PqnMֶA6Dá"|
+|gFY(;ُhG`/]|".0f9DﲋA@J@
+2!"OD7m=r_5ۛbhxrXgzC =_ W9V<=}XOu߆qEdJ c?>TqҤߕRxHӴVqx)B( "Dc.ʁÜ,Nθ`_/VRIG1%ԓ6xXcC^!FϦj}_?n 5C q[Q h
+ YgJJ4sˁs8 dr,@
+}
+%._nDܒ@x&i\| 2b;+ `&K~#%J=r]nK
+²BD* 7i + ֤Nђ,C M.xW^N]uh/=^57P]6dI4Aoi_^[:
+!eߵ(5֦uc
+\
+G}Ec႒ϵ,@!k!*:M8#N ӷ(#;&h8}ǟM6HFWH
+.0gqE~"c!~dn'O%t| )Sl9A;+L Ѓ**8I&uouZgWuR/hSrSKp/q2KF07(~NŸRiIW-0f~_3WI4-ZSAǽ
+*\ex}LhR
+O '7% # Yobr(]Fk$|*e0M9Zʇ@`j9 C܎l!U7#:%D LlE\pٰRiU
+BqAp`Cq'#I'` d/昨ia=)u1I$XF $` zu+էYp?*RT*ԸXIA;RloF108d0$`Q0_MfHVT/['upԅws[p0U.<R8+
+H e9[d c2?TDIgu @+ gNGOiYч$PPQu&([>=!$%:(aPЋ}&Avh 6!-Br0)x igx\d_q)%v}-8i["h
+)[n2ˬuCh
+E+9l(&t۟E+R!%pQ<5=W ztG>ΌW1Q"B:6;<?})x(J)3eC"E>fhxoݼ<LX*c%&L,b$fh,cABPfF' L*._8,.j);1&Ct#RBsXAĄ<?%P/KU@?c28`TEPK P!~^ޑȕEE
+t /:Fše_vd!m [JA>
+CN]3C&SJj*\L*dXd=Ed;ѴQH ,("kGWV^AP,/~4RH t=SlKRؽ͆bxk&˙ 3O&[".DKO ["C jlK\j
+yapۏP"waj>2V
+6.9n,!֋xҏэa%2WNK|8jBx9k,_QTXU@4`$&F^D3񙁲9SI[K6ށ(y+0Ҏ uuYQ?LpUJ`.A#cczDKR4K/C.ʭeSdƌ(]ts5k〳d\ݵPɯJ ?v) c[YۘQl$zV;/F[6T7;Kc{KF
+ިKƲ
+}z q0]0^bܽ 4XYlŇ>3 ]AX "!lpμ<1/E"T P9L$B H䱸 ȌZp7c~E*$[^`%ϣ`vbo ^|)A I̠͞#QgC$~{Y,7%%)ڴ:kcrUakIa=241ڽ8]*7~ľdZ}>(zarZ
+h~9~ Z匨|*WX&VϫȔZWPYh}}G{<!Cx̖KAyV,7^KZ/)x;P>p`HA,x5d!hC7|v> b+!H`%9IMM͏݊䄊M
+^$6max>/Rf-3crA\k/'!S` (ƚSETi1Jep}ϝ4zibu*d4+zPFG fLq z ZJsL"ү.Y$p0 #!DRɏ^%?ҡ)uSLoH UyC,n@ Oaܣ.ybJ)A*% ,-Z%`qяL0M.!&1"gH`ɵ*w/Cފm
+1HFsuY̹rr
+>mY(*\7/>$9Q-
+dz/4s,9^ޓe.M._Z_ nu#DIiJI,% Hp< 6 ۼK?{]ŎLLcjs{\*+YÔ".792&70蒞zḏ ZRnӉRAge=R?O*dlAybDuR)~v`حH]ż|ya(9]ȫ )-^? =[QYTI?u,3
+dJp. VxS/x%{1bVI/ow~Jh_"`d
+qܢ q+rȨGIn@PP@J%K0&(C}>1XhC•
+ql \TKLXAd]WsAΙrXqdCd
+2b|)tĺ"LzN + 'k0v. _dUJv0L
+<NQt]6o Z9Tx [PJ°ᘤ DKغ [&Kobh V
+@:S$O>ip1\Q xq%R> eV4"=rxb.SAdq7\45®@]5M{
+$sc}7s@.MF7O0-k".<onK9JW@KͺhXnt21 ;l
+9C/$A\;Kj?JkȄ&4[eq1x
+vI7CWu)%S$
+-x ҳS,Mrkriq(J87 @qSX]B :m#3AuL*hsJMMR ޴SǤU"PPrS<U )F)43o~-!#i&{A6)7\I!ґ
+t
+@GAd,v6 8SȎQBcsQT&F}S-ruRĩB>Cd-+RLL洗7J -۷݊.˛B ଳrRco׎?v>1x&>;EYbl?%hhd|3u|Q> #2Dںϑj^l W1ͫ^dhC4܊]Vх(o(M0`(քX_EZ!CP.C+.]ing}O T~swI9N 1 vkjfi lCh ZQ=ׇ_a̷qɠ*gKOd_k#%=$]d M'Ӝ˨ɜIL̦Ks`D8 S5=SegJƬm$f'N蜫fM=K/n.bؽ8N*a J+J8
+xVw2xY٫DWr, /s iE$߰_fǘ4^nL]¤XJYKrK
+_]k"d}y]~&$V9ld6iE<~4DUBPJ j [A<[$ⱐ7x"'*VZm&7"?erW` Y/9s\Y/#꾐"^n
+#L! $-˝_ICBxÝ)XiCHJdF}tNs)u(XUG;4,P900ҍ)aҋGJC|aoE*lt@
+E26]wL&y⦇Ᾰfo¤#U[s
+ AjD#!z?jcA
+B(+Cq+VU8uDRWT6²Y)<
+SD)솋[u8@F@
+521JQlA)I8 `N Y&(Io-*LOyqTClE2`ݔYdƹ &u]o'09$}Wؑȸ3 G<i<&,=ZU@4^j%NGX-w/0ќ}> {ХYB~!JEv\NI5&N !WD PEْ<[ECV@]2@te%/1P<OMS3, hSbC!]2%8g@Uڂ(6'Fnud6%A Z+S;M!Zˆ3 2 XZ
+Y,hq!ymGb&ɐN6'6!O4&$v5*IQ jӘCA%8Z^aUsd:7 c#¼N'F.gJ(
+oippS6 o[=A%3L]1Ng07V ?H}xlȂrU1RѳޏE <ObP1A*:.$Wq"B[~]G{ܿթcX&Ȓc3MԒ'vg{C$oyV! lJ54Rȭ//d 1<lpPC|.qlS);ΰɬpAJ72bӒ,&q#Qbηu˚8x5O W
+Џ<xUАB^re{2 :DT^))G,hȁXyθGD/1. QcV/DCld 2&(˓ !D9zWD2zҧ1|ih90R0PvFċf :61! ̸D~͵hõ\5ۀJ]׬DXiR_2 'e(-uRS ۪:y$Э$%)u47 9Ad\GdmZ&d'(ȑb*ڴ$
+fZ?.ŬJ#iw1E} :5" %Dz (ƠU)+!!ۍ"8kx^Y umLR#؊L=wIxF ju<3h/rƧq b``a@=&skx (,:nzܘ<Qc Ujrls/3h.բՁ]ЇC9?1xh6Ʃ],}p}_Cx@!#})H`o*L"
+_3MCje꜄O\.2%oyEerl!E C0Ik ؊ X5`h@ r_F֝du˼ mQ>uAd]|m 0 anyMb^pqk:x|6$e]=zahA:ϒ V[4F(s+^tn;|AVAex[Q4OX:x>Γ V/,;+hu0ߍ~ 23׹v[$H&ss҄aoh"Q2Ԯ2Hba ܕ8%U0=[5˥] ,3\cb]nC$;5aٍ)\7C+aRrS%adFႨf9to 2"e CSV>r P<4PS7YzHihڐn2͖jf:e<S'{yY7HGE}
+HA[7 DO;QI
+ul36oe LI|OmW;҈Ƞa B=1tIn5+ PFz?64AIvC.;Р1pVF]Ϗ˓z+LM8
+U ?2wR[:Fbwfy!~x~?La 6$ !(8N[܊8!x$
+
+
+R;NTV})O[K|
+j})X1ZS&A^ژJhkR#In2 !lUm;+&s Dge!kPG+3QGDRdOd<_U\DjBS+LP2b"vJ^ο&I2#ߝYz8YRTOɩ5W#V8Ӟ^7 + FY31f HGke}85H7TбO?A/4׺YΙ\x4[VCNaeBjN kZSjڝJZ;E5N\&f.%
+9;;CHu+IA}+DϡW3#^*5]i,[,9qK$ =/cX3^WNHّA=Dw!h80/x.gdS Phl  #)t\Ƚfl2uKs ֵd A#`
+
+AwpIee}-Z}|"2Mґr.A0?9?"t0Wؐ
+%"ȾI3ㄙ$oR0MLyv#ϱtp:ob@PNl(>zDY9]he \ƚͰrZ^nn+ z ؿT~B0W)~Al(k=4!Lxmk|h :yfP%|,Z PWa$zߒG!S9 V(cH 8Ҍ`*3/uMs@\,}(XVon@ 4WT,JFw# -F^qon2uBdJ9Q
+ض.h*NS@4,IB5^@3l
+(ԈcQg- +ʿ2AۜMB,ñL3ވ:9O
+bhD'MyvȠxCtv($2|5pP—<@.8fX2rμ))gdjQBTj RE"[Ӛ/"q=M(2w9{\ "^(e_΁X$'ѮMvχc'P@)cc& )!?_ Gul$2ł"X; {/GP. \>o@Q I]Ri[5{$
+!.i@8Ul_ |sP?v¶vQ0"0Sta)VJ@SW*A$v/iXkQ60n'ˉ"DcRjfoĎp4Ĺ C5ÿ7sp|};Ok.E ~pGƵtX?VD<{8cI#c$!ģێZw0MɢnvbӲd
+h$O_8$vg˻* m 3 "Nk
+CR[2a`)"%
+7 l[JmliΌ*~{f425LB(&-x!LgL3HBelK]c rC?Y.BE8n)|Pеx>ZPl.QЃtvî>v%bQӾaArgJ0\Ns0>9C0H:@EsRtJ܃v@4
+D9,W
+v Q.+smX
+6e|8(]N0 fTwE(0{qQ40OUcH'MpGZ={&iN&nY7 ߣ$Dz㣜cgcfs*\2'O9$dm{J觛 !}ե QX`0%}rAv4hSԌG?%h{CJS9TmF(W
+FF=l*#c^OxmZGȧL!d0/hڍ]/I28!wHX;NRXDKsi{(}krH^}i5GhejU}"v4'c>2e7<tK5OZ#æ"HИi D$`'٘ozхTa_GYhD
+F̝\2y {Qt9
+)"EoA ^^v]Ҭ_z$4SmVc{(^HzSC@sy|g?b|}
+Sj~
+|PcTnS-,6r72Ƨ{ Nx%~7aK. `#;f#طTf^ӆEmD"Hl9R(L9xVx͖
+ԳO*fP
++
+_U.ux *+VtQ:Bve{QGȮEBQݴJo"Ot{YuVR
+ jtPHq&TJoY# l9=r9O;8_ fB{pO<˯Vr2#I@AUl|)d|Lˀ)q
+ :YL&BYE5'V8)+gckn?RuE>:jSngP
+4-!K= ENy~KVīٿw^
+]"$]!`X[D<yU|:3M e2.ɢV[U[)(>:L9:,lmx[E Cs`O)l?$UgR.LALv!Oe3ji
+%'1OQV<!)Iy3w*oHe ۵afQ1`5t [WYEa\9+ o8Aq+$Gu꧃Bm_)vmhɊ"^@ WyGx6
+V1}C)(wGĦ$γd
+MQҷ өvB! T 6r{""mS>SoƎ)Ofs n8q:MԪFs ? L t0dˍ 2 =`1Y
+k|@'RKanHHҡ1iGtMtua]QU~I{ ZWé;TZ!t5R9dWoUOߥK^vS$E]3:k1ꉸG)
+S&8"2dƜ"{D* pRW@Ye=feGsCy0W֮xp^SoUs
+ Qg2=ͼecWyuR?sէDNP[;[3$Ms+N-k;z{[] P=> 1:)!~Hfd`E8ZX0>2arB9e(rC;,G{HVL\q8!|jDF-jpBRqbS.G+i#m%4MPHR P #c)NS{kB%) HT'KOS$`* xY7H'YE8=]bmύN006_m*Ys,+
+AlӲirWQ,>"`ndհJbj`k#Ωс[!)<F
+@[F4|3%>OY(TKr7 O;.kg[d+ 5ñWR@ѭ *
+~CVyyp[#։: ϸTt!zv
+,݊lv蒗"
+v<[ ]d ،\&8QjRu7>q9nC%P5EE>G4䶩JirJKTeuDjSG!EwNG0 b.p_x~tP \Zk*2AO7HERp"2/QNIv4h7eqƅ,HuOU9MGݤC1,3ޓthG
+ +; ~:1p~sa]8VWۧ8y뇁 az`Bt]@LcI
+$ w
+59|Q=}#d3W~":^8H]jxܵuW}bH-4 ʃ(5u*U3p$ BbDeiQ_ZNE~HflyRCC)! q#80^@:cI0HڪFͤYYMhFT<3=cn/ d ,& ĄwX ˽804gTW\`Z0<dQB5 @0<׾Ө\!']w
+?ikN׉H} k#<'eLԎ;boї%kz>} t![ou/"A0P1DMɉ,Ɯگ^ ]l  |BiZv lQ"]ܻX(u`^kK-ԁF('.aRXO2Iz'nDib/i_uĆ.ӔZIs4Qd6F3WuIl9/.`gg~AΕ_> 1値7$KheUq۳KA"FOY\`l#x&Y2WO*w̦!;$P]!l m>6At^vwHxeHH&ia_
+][M S"wD=_?;5ߑH~)w04{ ܁4j>nGΪA=Z3>?,{%D4Ipr]0ַy(@9
+2GpOF",gD
++7-d'KR9܆_͇HpIjE-g菊hsvC/)#'jOAz"T[9l'LK7EW=hAaGM=
+=>_e"rU(& \\:g*731F 5݂<d3""/?2h]0-N=wxfg5hXh[``dfߍ.
+cr&K|pBPR0i[feWuV{=>$M
+=Yks4C"߽ zoge0YLS} 5ѵf/bEpZbBn@՛GqG]Wz7 x"SMX,8}.<DrBnMШbg|{f 鼂_SbBl|W>tlWрJ.aǏ{e"O#<BhDX;)=Hk3CX.oD\<x6}DM4`NUk.>6!^4ua
+}mHK؄D$1l_ ۋ=!l/.$ "6E97,E߇%UH0C߇ܭްxWuCQQ/y`d?!6]
+'Eڗ\&xB[C,1^eu,_]6
+%Gl/ x
+n@
+3~AIW>0J1X
+Yp(OhF٘\鷝*x
+AzSrٴB;Pm߫)=,F8}*uE'4*bX9ldmRd)/ftK@/ p8%M;A&|?ػt@?B.`$ۘ06(P{l
+
+Q(}]DÜ"+ *2 ˝ץ)־QGItX8k@l ‰4 w)A3G
+#ܓsS=N[~|EƯ CY'U~=%V9X"@sd+Y'ڍtjB !ͱۂ x`TƜi7+;IBԑsAIGJſ`%JDkbMl?N[>yA|Ҳx߽<aL++ f
+LXz2n;-jN &PCւP7""jXJHˀ!OTmB4 N[TQl J9)IK^CHqfr=vebjL7Uwl29=?jRL~nǛhg yU=oBYrvAi-D;dB!pb cQi{ϯB.@Ib_z{λjۼ}UNrdzs<.zZֱzs_da6;z7xiUtWw0Z-)20h7cAs:
+AZLp5 8oٞ^(UAnkɓ(\WFYz-2C2žZ* d=Rζa[g27 
+9y~&*h0q}lC Gɉq!5ystYRo~l˽q
+j}$
+d@1SJcf
+٣>N[yZTF#sǥBisC6]A .2^B*- gOJXj#Rbr;0Xp*@b;>bR9_{ بŀaQ $iDSP}Lʸ׵sVL
+7, tr Stm6I,SB9y"BN2
+fSe
+rRhGyJ9ر-+R=J$ 4ȝ,8~0ǐIN47F.Y
+ 
+NFkp[!TL&V,(kJSc[ ;+H,X$q\J:LU/.t&33pl9{Ajk@JPĐ!E7̩ "Ԛ0`?NN [py?-@,n<ѻ*67O@..7.!l=ȚЖ0}r#`,@y20y9D.Q+;C
+l
+jAmɺtէW]
+\8W`˹KQ/ h{\6@[%9
+HJL fZ@M;(kuU\^C=?~9ۼ3w&>4W
+,g+Y.+= tXNӝ\6`4J¦9]DN&Rj 5 (k:IȻ2}uˏẖxҩ
+/8]ԩHu;7osU7ߋs{z\B ^2Ǔep0>|]
+\1) jcj2
+Z!}A.(JEjGS'S`6]N%Q1 WP[H;4GL,: E3@5HGUi!:(?c|:)\#N["8`H˔
+H[yi|^ϞFMSh,"$U*%Cj[N-GxPൺ(v1.4xdו@t+^f\5.j*Z7@NA2HhR _`k͖`dPb _ޙ/(1nIlg0ȏ qKv,kaYL\,LgZ[ š3_f<B dP;[BA^8N
+q|Fy &|K;55kIiұX_סnGq0E3Jrd
+RcaH*-Fwb~|z͒bWL N5
+^l QFmտ3\F`}7Yo<M\HyJ%~иԂ ao({/9MdQž%1>H E/ !B8Vq@Tȭ|xRb`Ln7ÎgE0ڸǞt n<u
+qŠ%ncy ʘYnE
+_J ВuJ#-.u1fQq4VjݪH7qlL{CƔYF/ê|8!/`tsWK
+Iaoa St2D
+?.NF<pm)P ߇!jgvk^g<T>9Jeid[#gTD PV
+ld7meN1/RtJ`͞]"o͵YɐfΨ|kKa#)>X 3|+[ wϪHp)`
+WFq!$|v¬jo?} aBD xXRJIX,/k{M ٧}hL&nOs(.Ğ)(SeNbsSNR9[b|0]<yRȑs^j>o5."C υ@pUݾ>跏#ЬB._ƁPl~C9~
+m6jvM` jQ8PUt/e8jj;kr>#/^=ky~i/$9R `'h# alK9DLILZ ?t!WYMN card q?e*?ąXV=3!t>z.!t~LH#ӕ(n Jbȣo@ss&l7$ s;v's3I巍AP'Re9qIp\V`•)FtMB<se;EhBD0f?@ QwE 8,:nA\A>9h4nqQü%c`
+kiR(]m*?i]zEF J*I02n$ 5IaOA`䂢.; [ %4z*x X?1JЄ3J,$"STY\e%ی-Z ".OEm2FI<8drw{8kqk:VZ,ATpõ0 +QS`B:~z%HI+0T4z\i.^+l42 jҾeLP74E*ף
+=)^fI{>8LtT:=)#1bvfݤő>²89kluUVcp䔋M>Rd^JDZ&~;l+a'@IVw-jH_VZ4~3F>p;h/| "D1.[#pE^70A_@,1Cys(
+f v]&;IE>$Q܈߇В XH/4-9JdO[G)2e V{\t 08%U1-?7Ӌ
+s9J"]Yf@Rn(9O
+H ;v昱3y17c))*(Q:[’y#Dl;{~G~?|0J<
+\&<^
+5LLJ\Ul V9xO2O3SDTiOP{1liom[`۠^|bgRפ}ۢ?BT!|]o:
+cB/K<u"eCcaP t,Ձ~lryViy=둞41QlI\`b=UѷnʝlbER}4Ye5Jꐚda}u1;@[Řp
+д_\c Uǣ8V{zYZ $D|=@N!J|QfᶳY.|ޏЁnb]yNfؠmgGT8EF VI}ں*D@t">pB˽~06d @ @&ەSx{ݾHJ2OWGMS"RZg׮*HƁ? SOL v#$b:/0W:/5}^$vV?@rR3,rrww`x_m[s>C'q],`wQ
+:ݖek-hGEkn;j "
+6E|
+瞏Lt} ٶ9BֻkK]ЛE>ܫ!S_Ǫʮk"3O/ZVCF+E<WILMȻ};O%cY6N|/dD lmhȯ> Kj?=XZWU@ӏ .:Ԙ,H\+#~Rް`g%jnm"ܷL }a#zv۱^7Av6JY\,2RVS˜ LGYXOWUStYQ".j }X*856ܜ}8mce>aGJ hl6$j7Z&ڷnt}e}'?p*e= 5Q2aO}R
+uMRX40);$2ݛ&f
+rW}Nkm|3\},ڒ=-]lyu$,wOR?:l!}
+^n?.ih$ \ĉj:/I;Ϩ 9ͧzzPĦT#5l5`| 埪n5&uEr\Bu$4`wwf0OfZx $: [ͮ)r^^aA_mԁUa97{qU3Ȍ)xc@:Y5ҨG#g-Áfߚ0K[2ڬ[Wl dy}k.qW{Ԡrw|e<l99M 'zIXvoo0,r
+bU4%?'v}_oS?R})#\^~wI.eOsA\=hOKCOs
+t)-]c>W<PBӴՏty4 1|膄/(ON$ |8hrNeTٵ4gpԆX:v}~(mx!]8(,Q|M* 5HYsh7 ^yfZipS.83OU>_tD4vO^@u{3kϵSy%M{#Qmkhl |6Ji!;0
+
+@IȰI9Ef7>c%<
+]Iud1<-+cl Z=&}g]_ Յ]nHyR< }t?^
+!|x]}ߡĀпY9tR8I_j$y*BĄK1 ak-w!|pR|eB__m*Ѓ* [ B,6JȲS2@+$HA JsfƥW!lp^qUBNҕ!DR"GAHۻRf{Z<֊|Ԇ
+lW,ևVXpGM>Q"ʛk~Cn3/=wzKh5T`oֿAE(u)"~ARc&L"ޮQ6n ӲK|S;ZHB DV.A,E-]"-BhVo/Zz^[[UE[t}y\:癙gOz|{?Id 9)\!MّD(_NϷۇ{U]z7eY=ѕ`'fE0o. khh|CF[" |:Cz
+2EU)Ƿ۪η{w#?^}ZP}߶~ vnwW$~<TltԜk1I>+o)H."qr S%"|³mGΈ@}˛5u{mQnwe͘4~UgB4+!u1$+G2=-:
+p$c@r)QRH%']g{ƃ;ӎN5h(#تJp9阌`4(G:>R¸ R1@$Af993V]/۽v4ٜ'vurjt0iiP<} 29ͦX
+W, Me4L< 2!K "P^@A<6~R?^>JS̗׳Û k#йfK[C4q2S2^y">4S) Q B7pn圄:l>qǞ?ZN6:K,Zeu 2ݔt+14*p C)%Atooa!+<;i{wwc튭ѵE{#{l)Q &rLv
+%w$r8-mƷzhꮮÛ4"lP#Qgq![3T[7G.ζŞmԜ׮4Xmښ;q%i|%%O)KM 22"# .,恘0 W&d؎t{^qإڻeIr%ָ[}ZΔda4TRBC0ttN?:Tq6 A|h(UMǿ/2^͕z⨾ŧ"^!@(3
+Pqh;2#ܞnY]6!-dlq)ܚIm|93B[_PmrQ&cv1t.E.=3jjpoa['@Ղ!qmD:_R)2{~iAgO'צ)YUD؈ѼTFP"ZBտt <­aVL`FӪ[ 0sR0T4-A a߂)=|D] ,*&NW$Cx6˃z<27 9O-j+Hok~T(/UYj1J둜%L53^k׸ N<B_=[N<æG;amX<eU`W
+wuQU+.b`N=B~r2ėep(JN&vJ h0/]Z. қ g]+sαq[&6.lя]zTOL& )RѶ.8'l$[ɾ~JlIiVr
+s->>_73r$Zzwi|~"b g,gLu!`ݟMoFBRj|qw2fd ~H
+cѾ^%L.L]ijNdJ^RϨj1c:ܓ66eZzS0^hs酌mj6e;y > ZґS
+qޡ@6/kb6߆W_&˻Ƥ0
+F
+Pڦfϓ;q|31t53>nb[̀cKWA
+rsI/ uq@酽ޘwQp@-\\~=M~ %_\$?HxȣWC
+i/CBIz|ttIȧPU["g#d,̶O}ֺ\≖
+.^$GbDT ĝ
+4Sr.93Np vKeP$*}eceF>"0 )a :M)[#>'~ G摺r@"Jh:'.ot;=p7E-y}an6&mE:ʣ{713MY<}?v@>&x8(Q#u=+A܅ԢK2
+!wP .Jk4 +@}\Oouq+5a6)w+1uJ9e(كEhl]졬]<dփ&y`eBU)st Qi]jp$*5 "zpme:[Hm[%2~#dc!t"0?x3հYDH/!kr8q,xqJՍeb+\}<lۭM7+[#w=%}.M)#iLvwi'tu$V}bHmii r;sfjWxȦ ^u[9=%VGV/dD?^GL5FwfZ5zur[ԟb6>)nWN_ "5j`4TvcJ+":c[.NJ=dV&a簖X0qPyꋔYɻ՚O zАRȕ᪛Ur_ɯ| ZIu2}Jr>tiv=imSZ͂ @PhҨQ\pC^VA)޿ai_3i elK<)b~X`P م`q^5Ll΂˥q^%hXa֨5MUYx/ODk>Pዷ_.5'?b+,}Իԇ҉&h 3ߗ[fOEDؒ+RA~*&C&r(2sXCY0nDͬދSYvW"D
+jUQ %mT%fCZ/>yCk&O][e&1坮pLpMO{{jzEOGsYЇQG.
+xP.)噆EDQ. )k\LȔ4ATug"`{W[{Ym UFOg^lY-ο}>2iV;H 
+ șiRn1nOP隤($ZS⳾蘘Zѯ6ׄBhU-_D=t Nn9m!&iYrs6wo;KԴFQy6}YQzAñ jD%.p&4M9AJG{x稠aHGM9ç&+W3z ,gSsT➫yU38I-s[ڕU1O G6DNB{HyN.ks pq}zsxϧT@t
+؝2AK:o3 D׎/TU>gS ;'199=}Mf^E~[rb}{#mkc$액,\RWG,h5׷F= w{2Kƿ؀=^תڠs{US`Sk'35[hOՁnxe )؇KT0)]VnPc'u3,+N3=?(tmj-5e^6>;[04|I_4K7][c..:D?.{}+Bj=fcU̪8_=Ș J~ uILVMN]oj&~3>E'O#٤q'4m
+NS,:R5 Z12'q_ )m2T=au8KS קz 3[vriuz -׳\fVK,{ %:hi?2
+;\+
+
+1G*8\%C
+\45nK8V,s_ùP<Raw\R&>I4nZAһJAf0 65&ٔܚ ;<ƯNLbI0TU}q6elkZH8H~@Np[ʺefJy໋²]/f+#b2M{qJmlq PeFUf2a26CɱI_ ߌͽ>u=_~_feI9VDugly? ² #wWc TH+? {\f!u7бei9
+y왡3]/tE<֙QUFWUVxZ;xW_MMqC|<ʱ;TY?_Z`w,X 0&9ł:Dx45+%Z KΪ. GJPB,2G^~6Z@ŮYx!D0GEˈqB a#]Se4=ڴ&NoVm=C,8V [\09N(t`MwL@cwF@ɊؠL ]a<̟Ҽ8>{oiL6ibkbRcƘ1"ȦȾ(.h\u
+P@6AQTbG3g9~9 KskGA ~jpX%w$P5 ;J^[*3'ElR^I`_y'PI;CEEHSQ`"dGG6fζ ~ˑh%^Ĭ ZA
+(y)ƧUG9OY( !6KHHyrBp'bxܞ8rKƀd &<sdd4 ',"҇ šcLip)Ou~mFșl+o"$|}MG+bjUmGu);fK:3
+06!ϥ4~%̯D:$ =7wBξepO\l%y})T9!>}5~!g:EķbwŔiz&B.F*W 36ä~@P ns #g)7C_ٸ#`@<=
+ZCk-;WlSǶix}x tfz6%ȠQaSׇk/9_kMtrGzTuʞ!=tk?,rR@3C%nLTP%.h>5³@iUj᳽rF %::bO_=P%Qx֧ XP'4RRC8'TRVF} 3q`/(V=^'Wg
+@0σ 7e*~)Z1{Wv)]&$ܑ0ƥI|ڕڄ=y.,sn
+JGJZ({ #9̿V.`g :xz&ZU7hf,%6-̳qtxkXIoaQsk#C3Z>'UwWqr1\ 2I66bS\Ik+86.)".ȁ'&aS΂&<q˨!.@ܖ _ sL"3& 92Plؚ{2 g2Rvs_Co2T,̉Y}.|6#{ wԼpsom1-q>U  ssa4(KԔk_z$ Y
+ GWrPhK?3*O EvQ@VxhOZl:SSЉ|ftONNƸ$/?i;r[籅K(y\c4є^{3GuE)yԒm.:R~:T
+\
+J46 !sWBxkRƔ=>=c\`gdJk[
+ޭ?fjJs ״q"I{dVX`M}1kekNv ;<,5
+|ps
+6UӠ2f[Ά۹aWF_gji#$i@/qpUԌqHLCw7qIO􎌏42,76#%-}Uoerf}!ầƮ[)x`y'GHtЄ-8ԓʷgpYŤcC+%yc :xO{>=O#:J-K[62H HI$@"$ d/z|q_=YRD
+@Ei-`Q՘4oK:l+!Y"g""ӕ{N| G6
+<Ȁz
+>优Tx>궋˔s9CLĦ'lfԿ@mylݠbTkڞu=C?qMWv$r{|<:UɪNqy98Jk /ӑq3˻ʻֱK q9;bhcm8ȧሁwLj7, c:#EfjRy.8MaB
+'v⡲.Be=]-
+P-S:Zj|wKw/+;/XF*/OLٙ@XL|܎\%6G&4f#<NT }q}<8,>6qy1#P)  N3y2I*?R%R%PSuQsoݳ@.M!_&)ygwfP9>bCLo`/g!=~4:C,vɉ5A5 o & >cOdSqC_T"Ըj--k[
+h75 =7ɵ -d_tdR=ٕ4^<:3Dgg!F?5M4r̶>*0E oO s?^ 7Rk^D<Jri
+հ
+x8^4xXϢ$-,ޑU07 %c` @Egj#"*RMDIkڟdo_2T_`YnuSwyeCjP f tJjk*jxՒ6'cVOMu+Tx2BedݒU*l"$0m,u/t.Jg9N\K~UQeZJOK@ <*6jONkXkdֶ= Yls>g lR?:Ryn{сq𿺑 閌'rtG;л(I(J^S!񭔘S!)|W͡F?h:2vǷS_ڃ<B28% gWljsȰ\z7ZF>56cS}^,:qGn]Yϯ3
+Kn=boTSBrS`ҞqSTdo4%
+ t0z|8ݑ9su]~36v*E-U|Z@ׅJ1]+.dƬ>_x9iZY$c1hYDe<1G cs)+F>W^s!穥)|8J;mx*˄=3&Ϗjh߶778?YHஈpߤ3s\Ā}B?0Ұ-Red~1`f&m= l[ĕ|A!xĠGjP/0; ` dU$&ss8v8̪޹UyNLc<RqBs2Z~$׸|Cn_Wkj|[,:ބu,׾ȭ3͒ nv3"ff_4t݄4BZΧt.u:pշ4hQ"FX4emrϽF.B=OKC>G t!dJ<Zf Ŏ5bZvHIEMQNoWA0KO )mz6ѐ/Z_Zs[ۄ6-GL2yWTG!GrjZTs KsN"^
+›VUPGsd9nV-i:k]-ܫ܀\~Kɘ$siYSPAn`yl},4F
+Vkj" }>XG Ps:@_|dC"}(p/1`j.+'1ѦڞKj~ͩn荼! %G˘ c9/'26ԏ=ef@u
+$13g_$v.Ҁ&֜mSu|856VH5_$҃I-l}N\:ra*tNfgO%חClP@&F4pB :JeO<̘hRT 9z,v?KN, @?f(qc
+[ *U-t:9o8"DtT艢!%<݀
+N-]ն|V 0KɈ6.u6($u?/s;Es^u/ݣ=&◡ =ȷgz4åZjg}31sOs\ң4nJ~6<?IB$hf A@`&FqY>]s Ƃ~3 χ)!%8t۹tNehբZ5"DV j_J"l$dA6!.y~<y_\xq=3ƿTG^xI*tЊAkF9l6iA7TI.9佇+-d
+4҅}KA+ހ^j<^灪1Sqoٙm.rՏ;
+e~\?1 vU
+ݲuir4|XC
+Z//>
+<`ɺf}qu]O>ԅ[ ]ČQګSP/s g<8~n[vSյS45GCS{PT\dDPm3DEKPPA%߂ZeR[V6^4ԑZlAyL2e _ht~#ff
+rKETC g{o!/L%.%>w_O)ad8ؚj@jňC=ϮL"3 l0)(:p-08^++`.d
+PTm;d]%*>hC-9K4 cna|藷 yٞ:voc_?}:j| EKYDb_Ɂ:n}5hokS#`oiV~j-W:$U&Ȩgoԥ:&HadHMm"_XDYX>[=W2ץyJnP~]~![=] ))M
+P~@/+nscټ{ Mͬ=~`O VLJ\rGX9Ϻ7\|o6ޥB|>{OE Bw̠r^ƽ^Xsyb>9q'Fa,(`xd xijwgDIVu3YUC nA\B?n
+wfsbᶎkdz*Ee/8U6|9_垙y
+\*}dmd~MBIZ`oa W{*V' 7枴>`ke侒UrpH馬w,MMc=+E/v2\Z
+d y7H-viX8qHQTP\Ϲ-_y
+|";
+kp};\3FLٗR
+Z m5\܇MpP{;=G+?\ ׵VlRIAѺLy4@ɀQ ֤yi۱E;rL#V-i+Ogy9pGBQJ?cD\7Ԑr풚7gzA^bk^L
+>ɯN952.8_d㰐!jLʥEp!_pdb~)9g[OZ|1XjshOBs+\@nJPi/eQvh@]mu;CHS2D𭎡 fgnГ
+ e]1\{,\P9>,t- vU="AԺ(z̲uIm$%zY }Q2@N P2S"- X:
+@b֧hxл@+>DҙВnݐT=򒂔qU/?
+<w_Gp
+o*a
+wIɎQ4)Kޛo,s kC@V_ 齾!y~$F؇iDGs@Oǩo?6rrf<vWK*;61s¡Ʌ{b7֥B]
+*=M+S-s(k[(%%flMm 1~k9 |y6LH96z7{iMg5m5*puV_Ⓙ웉N84SM|G:2VH)Ѿ?1rVLPM T"m־u)E <OM-;
+N<ξpƾn*皥:g9U[rzGE|wtLy# &9rN<$e| v2z2ւ0tY.4tmdcyQ/KQtxcJOyY\{}l J)%dYVƒeA"=T_Q"I_3rUn!gZ+Dp)m c)R\ыM
+k
+/%޿K{rq+nDcYxW֔| 0hů>ym) _Jˉ4h#=S4EΡGjVMk<֫`)иڢat2!!$ElcS5-9aח̼.rw2 W1@7D,׀Z&) 0(2ٯo!$2"@5'F+fϭGِ`{)!`M5Ȩ)(&5KdxDx +zUM)e:䌀:f{M
+81N`F NBfY/]c-dGE
+G[> f&5Dtc ҂-tO.|Vz0Iʠm][C|\&h2+wԏ!|MR@޹ƲzfiŌ#]j~R @NbC)ZbN7a!t|^MwvS *LG?U*!rV#~~M>:BNߜbg$vҁpG/>32j0c.ʥB6VmLϵȒ]5;[1TZpoS dܶu-Jv1:?vl?}2,!&q}51&įօ.wi1? J?x<" ֪ - =TND
+nD cI'Yy 'F.H#ocMoop)1fE?֤ץK;@z4쥮Q
+laUΒs{R5bW tiF 2^X- grtyŎx ?7Q&cyiNMńlil6ւtu6G3"!贈^u#|NBv
+onĆSM: 4GMr~5jŽȼ\7tѲ%,K@E89ve &gDCE78T @Ԩrh|t5
+ȏfzSJٕ@==-Xe޵9RxsC3.HN_ցCvwh N}&LP~;x>}MjxEv<RO
+xcXHɘ9yPȅQi`(a9HFĢ〔JEzq;o kceƟT
+,SʑڂMFK tl]s"gU{:>*Q
+.xz;a%sŒEn04 Kpq/
+qɝ"2¸:C/z݅
+RO$;I+<i-
+JaI&Im 0:1@^t6v23@#?NXy 40fS)S [fnΐ``jaz\qpE`Կk0z.Jp_3F#2}%o砓+|Ji+dbn[D͹E;)8-Y#A>ј}fx%FsfP!l\b %"bVȏB
+U9(d"lUv0PN}BƑG0Z(w&i<jw^f:cZ\m4PyU?(:lxib?{ovO
+Vx#$ };1V A-߱3{vxr3{CE{QQaY)?HXń;7#Q0^pf`cڄw|/F|C)cXьߏp4FyL-'wuՉjV"B
+pF gxgW]J(|<3#O*ND ;\զ_p3"Y13id5LD+p'nV\CY+9v)!٥IA:`îE+,M^bK_O7bk<IunW,SU+{䬏~R k6k ;wx,yث DD`Z' z˜Ln I: sI {D\q>9<RI2B$mҦh";M6׏B'x{+޺wiYq7c5|r =sw5J"_I|Ps 'eCV:w΍*֩<b{s6䠛x揊2lT:I\,vUIߔR8U:k3]#Ft&V=>CcAb?kV ꄕ'4LKt8n rR0*p?+ݧeyY Z 8!-k,cn eK;~J*y1)b/p8hEqQMe^Fm. -32b&eBqS[ ގ#а ҏRxo2Z3"&ԤJ{g"S#RG,7F‰r`fЯ8!tw&%R}3*8LX9/sP zT.dа)DðT܋K9/yI@*>Rf~ebTnHmlUJ uDJ?Ѭ'mFCyfk|j9n&ω[E=dxJ_gf̓({f[h^
++TC[ ? #GOeK~BPaX/JnuNyt1^wĹNZI7Jx?co"J PAz]qu{7y7E!|\xP'*5|̈́*KgWuu}Bi c"LM^A^ d7n.ܥˀ`YϊN`.j fQ+MZ[AL:p}5u(
+N {b|Xc>q=q9Z$:]-
+3ˍQ)%jGICszFRľuI޲Љ=qH6F #a/}?$S
+kmcvC^QOqXҵ1D7XzY>* o|RF5/š!5kCD&JsU=Tbb=m;]}Y9u.6!/2'1+2CA4v죴|]%}^#w<lmAְeRZ{]BGhQnxW0"\(סFx.l
+`}MnH7Vb:$0 OFD>xͬ73.h]qîU<@m#hЎ?1 ViVݔK#s*%nŠpAz?d *ȅ[غ[?6z0#""XVQ"^Rߝ0Ducnx]Ypdؚ@<=8%}<{;uYRv}f4){KRIPztQ/"r8\Lܮ\07(N1QơO3fFzwGi9付ڑk$lR5l ./2| BO[ɚʴk&ailjS`'b, >=6\!ahR WsA8}40lLA4?`jI*JGaڑ w
+ǁiL,,o'\Mo; 1;DAl{'Y 7cvwzy2DNn imV%L|VK#PQN;;2Ȁ1 > C-88ջ]^$m~Ϩ? "Ini|iNin$'\G5yO Rl<].P|{cAY8C69jⲗJfi,]={P%M>̹Ǒ *(#rk9\^
+2
+,Dۣ0DuśI*+%^xaX۬=%=!^PPTMHPydO\cs2C.Y5k&ZͲI;Tx {sX(9j锦v|?Q~ZD3ڀ$BU'i/3Sjjg Uּ
+wvT^Ǣf}\~/`uS3L´-2~8E^U?v_J]s;b~3#TÒ4{,t1~.vtqpJ>p' с Jbsr.bQ tl YPEN bY]S*%g
+Ě̓
+:p#|JOwJ3A jǸ%QL,؍
+*ذ!"."hhX}س?އ;sdLlP6+<\ڣ^T V [{ԉ[!'MG!AXqHz
+&f% x*
+QG$*{=Mw9hR@0ܢi putUdД<*:~sj/3ee2Beٵ&2GbghY҆ z7
+*@ _<Hi'C]+Ի>Z;~3=Vh ,5l9"8.%{5ܮk[0n&罆$$V
+4Wd{ڊܯo?> Iގ9m_cF= 4WYf+j\0AM,?مcg'3w)$#4oBcxˮ>֏Y0>k_#?__=#b~q[6QjBe6y4V@R֫虈}M|G;}a>Cؤ z[AP4ED+CœH
+IG`jBv/6a⛱Ğ{[-N)tM^E9wT,I֮jB%.zb%hamAJf7$-@^.d5o{q.vשXsZ ƾDQȫ6[|ZCt\n^i֔fSu410NpnH$` մ>Ms@зy~Щմt*ɠ0ZF`xA0;b,FƽꅪO> Wqϼ=L23lb2&.VTTDQJo" UAz]@ kgfsϹȺy¬OIcM f&=<ϸ<_#֯-Ya e.ʲ~x0Au
+w8ǵ>,
+fV%GAԁ Ї(ǹrR͇VۆH#e
+H 1td[P F?B\߮>l-<YE)mQAsV{bzL$DuQR8ӈ'JѰzJS5 ^5NZ%Z}m0Ox3R%)55! }LƱO}~bULi4 uTi'W$!bznteҞ/-2pClKă͸ߴcdbeԦڕppq0,hS+SGv9ӥL-a*`{6e?z@v\ov SVX.n q jZcۧ^]H&μ|Hڞc pwTʛeu _I.]i۔f3f2]
+7yƱ -wJf;rRDYeA<fl Ee=S6FJ !jX'g7TGtdZ,|SAO?tb6"lߙ Zæ=[bd"jwIz.ױ9e 7]
+SFlG2 Rv)bF8eN&bιY'/w<Riǥ \O#dDw
+jWÐu2
+&hDo2,u6Ji4Jش[
+,N9dj^9iS p'jب=#VjCGy<ṕU>Ķ¿ 7[4 :1y\옖ժ#vOIͿ s/ԅn/НA<'2N؁=1:}#J5ϵɛ 5JD(.L
+n[PckW)1b3c7~5(arL)tURCLnO?G/8PɍnIE\6PtYD
+{Sb<L IZw9<$gۿ?vo.Rܵ/1:LEV_sWn:\dVŒ 9ubN>!XtK#E4?~hgLmؑmԋ,1?Zݷq[v<#BG(j$Î]mdbPRoE ^G&t`ٷ>\Fɨ)2m
+
+eT#5y=̍}>MPq ;!wߤELCZ26oo^JDw_9 ng
+3v<Ui+)ÖD7a4a@ 8AH Œ ˹'J1WA5p
+ݐUϾM* /le VrLx~E^Z/v-<Ԯ0_èo9y##cKWLlJ
+PO6z_Yz^ڦHY Va ;ㄴ]"u>x]Tq1Vb\sk{&?;]Ϗ.%6A) i%Z͡?0¯eVEVyc7,3 L_j! w}db4v3^IuQж"xt4}/FxsʎwKjJwGK >+@և">QX`_l #;ػ 9}w[l DJ )z'^1ž =3eWR@Etϐ;&w;y"$H/ޕsF27PN^ډ)lm]\u;
+he)9Iz/rZC_Iu
+|Dga#N,hH]1mQ'Jwu
+^]J)w̶@yzKBHLSҖ936\t-5 \2\
+- XpUӈ{*t}b|Oí/0 VUI:IpI1B]g1idkD/Uq,R`%Ps\Һt $x"EBlKZҝh ]3PÍM1{#gz@Fr?E ("ޣ$6wzd余bDۆïhŠfUļ:TlG}S=+AeZ7;†rd^n:&F?ev]iؑ`S6Xx{󳮀^@Oo~)q9e ,0fg;^8=
+2?ldgPP4 k9ua0l$dOM]Puiu%uoZPd[In$gm t} [YT8b4iZ鉖ZyfH04-0.@+F8p*Л;LbWnLTͮ(6M/u_EN֘a1)kk~WUcԇ^)#.&=ޕN))iI|DhLHJ,Hq~a1꿛Tp5 S s4(5?\+=Y{Ss:a1ti.WUq6旆 +BwQr;è{ 29IuH9S0ggcz2o},1J|*^F cS?4sxEu@U3mdk~>@%,=/<Ab|6H1,>N -P; 1lmq#Dmf1.}Kt8«n)27٘Rֹ8[k٧}5xXG)Wݴ}.GVtB5 3z3,_?9J{d8 )'-De\(KWu_uKk\[I3.a$8׼oAfl߭ޠr_ZYj|_t:VC XRSt=Xkp))2{w"Z']6
+5'&).5
+_g6ˤʠKMsāT4DDpsN EDYl}u'9><Y^k=-
+\|vPah`_1 s6B,+>N?26%`Li8?,v~Fw̵܍>fq9tG‚1f aHiMYc6\;]%DSmiFƩ-.
+:VqReqGJJMLKJSM O<i h{lQCEQ_2PĈsҠv5gSUZ\S:H[sz}. %K[s5^C+ԇ͈{5qtmϏj ?[jmcjvX>Meʊ"N#[ o{(v##Cy%m7#`_fx^ JA_NQg^L1؛#*sǺgR=:No wf: &jQV7d:jlUa
+n;ǡs[΀nLacM_(0raUH $}_[Ntnv0w$*ߪ3w^Ϸ_TNT0M vOvV%vTDIbJɻZoiW"(w%/|"sKړ@/GXdEГ)FX1sYs3.pii04@|*Nj
+A>G3]kǏW@ߗbגceh= 1TSm0[5nbb 1a+ck}#Afbv罸3ۆZ.m$1ck(ys 96wTr{ 9
+龿aw֥%;I]KڕU&nIˠ)3xtm|o?ۙkpkYRV܁,| hjЅs;R=GI;TAW{Am1s ނ7Pa`yRGAYy``s:njkPW?Su=%C 醔FcOҷ6|!@Rȑ<V'ǪRMMH
+b\LVŤW/e@<?hyOuo[W<XZ:D ghA(пtjsqB g-G+ly+ Sd@ʋ#vxq ezo_{Vf4_vbW>z.ue-}BZn]S7s7^ҋǁi ]xlC.f3Yɺn<"cJ"m@0 e eUd7Q~-ue59rg#kp>^"NVfsCkM'֧S@fpPgaEt`
+=אP쮮-i`U[Y^IH
+0zs-$$+3{W}cV96 -zr4
+HccV_}uot"
+h;WUcoMLldISERLX+?M
+H}9RGM[`lDSF83 BMLYy}PnP3չ}U~cDȾ^oiXmb))Oo};ii)+OlmKZ!;$ ڛzc !$i`H
+PGep~صw*I.%>2"':rc9N y~n0n01|&g*`,2Cw,Ve]982%ef@".d+!f#f/d#uS~g,txO/䍤lyqh t}oS>{s#8ʯ
+t}ާi{%n<^; U_ "oT͔}A]t8ۆ35ӴX$.b'y$"#R][r8}u8CL<UGs+-{˭trk*]ڔ~Py p酺Tl7!*Z
+,"z摌nY \UtUP1 'C< PVzd"DX,ą%kG1+=pI'6`}GэX
+i/
+ܛ0OFN˒w&P aC$?-R2\XO's8*jw8).<V=IK6ZwI)/}38'<_U7&\ځD<;( pͮgK۞x{23)/;lh" wfs(a u(6򈑆يF{/CHM?],QlWeĜ+ʒ40.8CȺRC.5&vgd:Q|V=bM願 T$'a5ϦXvI9fykRg8GE"ASO3ں}h{ 8.WY<l gCqov.4]ߵ$C 2)rnWgl
+cD;t6RJNq [#0o\?(%-`1be" ȹy t`A|8]mo>l q>) PDZ8Oȧ3tSddžh;2rˢP4A8Ŭ٪L()z~ALzL2ն?+4 ßw$lt͚hQ$j4h`AĨ5ŘXbEDJAAEX29s?uQb(gVvb:zubӈ9tF`
+ޓuBF&i%VoAd)c~by c[LLNXA<ZĬy&6-_<a*t N,RHEsOf*xOr}Y1e?9ˎTZX'#-J#
+;7"E)3o3Tط/<s zFT#h;9_
+ϝ,TX+4&LBj`./*˝1$=3dh_ W\OX)Mq3 v3)䈎 GV0H,RXc_oܞ![7>6< =6p~ZWwC; ih4ssu"绚;gVZ:h-7LX@K΢<
+ХilpG@,lsjځ tuE]m|[Ƀݥ$%WW?HLk|qmO)tV$$BO:𛷧Yy|2:.N\#ޗJCκ]";c^_Np~D:4\ۗuԺ`k4 _yљ1\^X ۓ=[v>@ExrԖb
+au'4(fx%<P ACGZ'6?۝kʉpS]Pp |rٰ-i+\/ao*TO"Gۅ U1+ ]{g
+0!+4/u|tDKޕ
+6>3[tv{Lm2 m6|J,hW H-+Uڤ
+c@?MU<3E\{3Z?c^ )Ma9,"|vЅD饽 Qwa6ףYSOmthTGpOǁۿ(%DujJeky-q}pw%muGj p`AltbBZFmm9K\`r
+FZoo@ўmMh F15",È[Qt2< ր.0Ӟ4ʘ=awM@3S[7/kIwF
+i1ĤAU/bܙ)Xʎ)-!Am)SB)pq#P,t|N6LZxq_@jɮq(ns\f&T$O +KBJZy#\詿~ I;6v6883''q9Qk齃c`(
+%<mwR AC/{[k6ll-tvbO+s\_Iyi=gfMMiꖚunf*.;);"*h%Q }_ ɖ{ΜC}~>|kۧ R5_w},6w[ӭa=6$|* ]!<͑˔R`
+jSEg"-}<בO=]uw[T~l2)z~y@I8Jb #!CR]*Q&%i% k ?u\ p_ume2".!Ed
+жИP?=5ry_mqL[Bhm"›& W\$4m6ݷƢ,_7Tmdt0|%mV>i@/NB\wP4 |NXe3iDvbwp¦gm_ݝƀbZ ,J\Ϣ,RL
+FOm<$Q진4&p#@:zcЍ
+Jr1=9ojn+n8f0
+rczss'g<z~+l W.{ eY`VM7^gᕝ[}_zV7{PTcL ,+i`Hq:O-q='EF/Lٛ Y£9fOKJlqI#U my.-4?-5?7s͜9g:Lӱl3cY[a ""#m)QLQP@E\@EPeQ05k9{~z~yX_v;@* UE.CLP.[*}JDVd5>li{ }ׯD3g "־
+v.$›'㍷b`v ]
+L w{q;pr9z]
+,"n&<jDz<u<!w`r+b4
+KmvrĬΟ<ð|#a?T
+T60
+î/_S BrP/k`cfB"KqOnzw 4$mk{K/+<#{!^ڛ|{QbNHǃGLb]f^y2ތk{V6<j@v wtKÌ|!܊6)7cVmMzbi|C.]k١ֳ|xDFjZ{[o%.95JۙBc60E}kjiHgUŐv=nU욥|-?]UPk`<eՁT4dGf>e?H醮LS*aa59s\
+oVҾS@ٝ#UL=G+Qb1)6>kŏNH L0rUm sFuECֺJXYC6Bu3Z6۲
+"']sp4e
+t= I
+hH + 8Ș
+lB- 4HyUyoSKZnt^tg%MD6eEkO#cOП{9 l{倪ᮑP3O/m녍I+f!3ON4݌1|jK/oJ:rI_9^b6Ǧx~IKϮ7?
+ZeGr zያ]L~:]"<Y}cSY{)p]=.%J-+?+V~q%1ts11sksxV851j[,\SGk樹6 P1+ /n~:'j
+W3 Pk~5
+^&&m*y6 :2ԝYL= lN>pD%틢$L̊So[&/.YF]`q@y=VlX9J@};)zT猡izN3)5at⮴sb<aHzc̦XpKAIsao0x`G
+|J
+V)1geV8-bToUvz6:vCIJg{"]9^ $b<p}S&A0WJH92nSf\'u6g,\_{qx| CoI(y
+{aW!LZ:'R.bi y[5$YডrixXgp>'~29:BFفKHY@/=j}I uV}xs% 8k
+"f0%a~TZy?]cszvD'ovxuwi
+ҟ(^ *Ɂq=Ǻ|M:{N<r1:?-<*Q(UR6cN4
+F).@XIοDq/S IT
+*WI/
+[>]"F=V!2 GGTPWhnqB)aFJo=o=0#C+J\lAؖwZ7QY~ۨNؒ1eߘvwwksZH(i
+$%ck\/ Ⱦ .S̗x/}8riJ9;V@%ʊ%>O=kUpϣ+{Isst0bP?eЛv13V&"i"VaۡW)|$}R^r1@G6,I?m&NS"92 +NدoR.r31U¬$}#qՈYw?lMj-snyOɺQ#%yä g:>Zh~pzŧJXE&6n^s*hݘa܌U%BFf_7g(ײvNKԖjN){Vq{Ux_1[61Ǟaf୘gP]SNBI@@(:OB08/k׬ syq /b5;]ג&jsxMޥ]"R6p?aLj=Q &iyAiH70!hXĽE5gd@ݛgߜ.ẍQF |{P!uiE; N:"u]à鎍ߩy.}2:< [ ?o#10oeh~ <EBS21yׇ gok"bzIq;j+>]\2o0w?uTAS|]l$t$Uq)tgl
+nQOjq|TqMLkNw%UrAɨu%zo-UW§Y[:fC~IMh%vkqEJIYĄA8H󏷟ݙt᠏\IC8XebO7`fƤl2b"@N!,Xui mw EPXR'ڄgQRbsb$ʿB ufw]qg}Q|쮎(Mܪ
+QZ&a=_?Һ~//˙)=9fs]3Žg|ctE/mǪhCdpBx_a{n_Fi u~gOD9 ~a_ #'E.J[RnAWeUUp2pf20qeqwFߝUdT?l[lݒ2Z?CE@c]0
+%-if7;;9ͥ%i/վY^E <("r QA#[s 2bj-6kd[532aZT '6_d\ڜ"_geU=eu$OA'φsCB& %[ Qcte3$K9{oqgl0Ӌrv5'Ž؛NQgsVPZRcskI•Tp6jSH.SKò{d(?M=m FqGBǬy[?g<
+AВhUYسwEnuH3/їE[T{dԆg%&@@\ttDk "7ț4˿{k=<v`D)"Gf(uis2.:gVQփjP=TY?eD_-]]Ygt=Yd$\r;鐄KtvVQ0I:$@N:ݹfGۅ/b)LuI(\wh?_RҔM \0; 5aeW~Ow(eX1K3$bQpDϧ姿a>(ˆY\i8?+}SWgᷤ{{!߈(ȬSA
+x/cm?yGj}h)A$C3nW
+} *Eodו^?'gAVp0"aN!.)k%<i֝VQȿKj>X{H e ""C$͸YdKNK$ =`%Rr%DCL )I-׋syaUQb 3niƣr3%#&
+:G>*ɉ9y fQMA鼊ٻd@ GNQ*#,?<zؓɤK͍ˢvE r&7:~S
+@<tlyej:ٞG&&ܡ=W"t>աnKC*i]VXU a{ZPeM_ŜlLR.}kg׭d @)2T~*煹3 VGcVf}Ҫڮ_LҮ&:o&-".˺437}j(P)n2ŎWi7BAf Cڔv+ڳH T1*Cz 4̮dŭ輼! lM
+noݙdN$$pjnQ e]R§d|jJ 8©[㦺ɦ8`,f<OG| 0@̀'Aƙg$j= u5׏eGC-w&xw][79ԥD$`YVq9i.Ikcngv-(xGpO!aWS @WnA3:G-I-0+IjΊq;<~Ϲm64 ?>OXr^~^@H:[sjԪ,}W>;9Rs9 L%"Ԩ!g{_`Y.$GeUI mHm?jQQ- J,o T,2 f Eq55?ֺ0 KvYFC j[* eA`^ױ`5?4]X%O
+ )ϤԠ
+:N>pQ
+]4{CŝGg*I>8iW2&:NsjO?'&q*)3Hi}α}#a?YMmha9IXB ^v8̭+{ JMh\n6ZCq{lq-uJ`yXxlw  n~2SځX}Dы!3CE=-_ꙑ 8W6rX)TzI& ZCF, Sgn*FVi/~6/wҶ9ĒӜ}z<cEՄWNWh = rZKn Sp.#Q
+};/Y8]ڂx +=j`t))s̮=xO Ubfa[KApSoBKA
+]c%OHH_fcN*NU`ޒߒnynVi+&y9|u_(`J:&%GYw"k:^9R~&W68 \JYa#.lI
+(Ugzzciwrd1SUN䂬ۗvp{.)#V0#N1ϵWW?<y>jd6V̹cY$^9R`f!9d8eൕ\¯.9-QVaw29rA m^oy[L-౒{~!e n,ΚT؃9W$-sYDF9+ nrKnT*I|4fV`O⠞^jLxMa#fii3%"0#nPnD \kpol :{%Ԅ<mc~X
+(gׅ=bp#tuxx"DC:}ĥn9_VSrGu|J`Z;ltۈ
+#pck9ۺ aZ\D1E
+mcKˊ& Ys6HMSkȸ%Kvp#*^K 9z+ w Q3>rݓ8DeЭ#旹t+e!vE@+lۘ{eaƭhw*~47ܐF@ xdS}v%;%o@0{'-Ql
+s:e)杠
+Hne D
+9#o|_L) /x!oTG}4J Cbx 2hfF^| !!>
+kNIԙ,6iY+UA M)!Y@U)T̋I=wrqwf%@hD&%? 6`[ύ$0˦8tuP(W*5?-^Fh,3!!EkdϻR1כ^D!)R;2L[;N ^1Oltȴ}92Ó2tކ$X/mޘbЄE7)m̙E9:7g@=w,xPkuKw"]F2 [n PoZ(>
+jUkK!%8IPE]}Ԅ&07nv4t˥ne#osIcTh׼9$ kDr7ʘMZL I~$quXU3Se;4WUi.{xЬ<&SOA_ڇK =BG PåOf,MJGtZZ A1PʾM@A&`p0Z0L 2!7( w9i$L);JLڲ>#nBt5AcɁzs#<pdYDpF"5ZCvcT6fܥ*f78RS7#QȤ2v ;-Hv8_t L#8^{
+zԧ^A߹Ӻ20 ;IDwr6!U ZhA GbmM4l]fP_9[ Ɛ%\- cbUy`qK5V8ѿ82I/[$~h ?*
+NTٲ+TPՋ 0ve?{|}f/Z4 d =ZO6ɥ,°"
+k ?^mfF86:N1atG@euhšo>>C_Eզ
+ 1&aYhɚt.&r`'iqAEx$ :
+Qrm8RrEr}^&Hhքej
+NrB
+Z^et$)
+ pP+
+k*? -^K|qB;ڟ|1`o.YEcM7˪&K`ޘ!pAw3!>'%U^.E*US}&0Ƀ&EE[U?Xn{IIXHjEqgyhec1 $x, WBDe[[v`5Tn%d`Utΐg߰#ehefGͶ"-0|GdJ36)>RT@8%w+ EetLGM ;N [^_ZEjҲ頱$3]c`uSd}|B
++H4eaק$oʶ$\ۊr i\s0.jH(^ |{>
+1?GoA2Q BsdX: DS&8Qwΰʌ+~xw9ٷ9
+V NT##g,YX ^t8HGoJ<'^4B)=rH2/Bld}&_[ۑa E6X
+ɏX)1BUvsUV7; nq\YncR]~CiX8A6v*X3D,},k7JGE*
+u)L&Y Z}sqF 8tlヸ!g:~X! ĽG\t}oB)]ǡN4쪣ILYӟ BbkI]Nu4 GR,z ^e7Z៧"(%E
+7:EI[W8 AYX$"_%}'8 $#:t^EzCpJtZ.*281J'VLGe ~=(ZIJӛk0Z=.&̟9q
+ieE9Qi(!r0'-QF^0*gUk8='%'"t[w|$yJv$IXFNa̗˲<>s.Af; Gsl
+Jp+U2tEs3fk2ۡX6"=4?lآ4t1w,[Oh46[Ĉ7qc'Rc[QE%!Ȉra˔3բsC7 [RFz.<yVt˥URdC^\4*U|2EVR|DZE^?c%MAzS[$nm Jrodv;P7E<B~R{Irs+%qg0f?wb1[`%M$믒phvֺurUI{c QI6<WPs“z5^ p-
+e(:r*v= 0^]+]OA9JDa3
+U/3O^D1v !Y.1 'ÁXϱ尳UN^8X9ʹQn* I (<Vϋ+9]Wf]ZpxAm@NX{4eꬬG?^] eʏLad=k>vxi~hK"a|ˢ1 >3}י|es/fWw s8
+8m>%$賈Ä./'
+lB]$@%ejy7=-#Å1dUT}A?E~t{]y\VbPxk1#cŽ1Y CC˻Pb+STv ^s]=K33!,:
+)b|ۂ B
+bZ_TBCZAnN"(ۅ R 
+/ٗӖmI
+B,vrڒj*+)7PxEh_ŧh1ʻ!Ln}l“0$F^_U~t{]R7Pxk1XӘn4g/F1cԚPR%4~Ĩv\X-MU%cn;#k >^ẉ#yc>t 燸@J4.9_©ƪcC2)ܙ x]͗e^T2X\;p^3W9$X3Lx8 s
+$n-ze<Fs @xJkM\rGI_ -CY<c!^>-p4phso^ʜp
+xfF9 A_{{$D*|]!O0:n5`9nL|mxn,=dWI
+b5 bJ{!veu̅6/EU@@`pPvfa]&C4aI0c0un6_ziO#9u'akR'D/`Y(Ech g%pV>9+:YL_ Q#^AOh]L
+>7 Jnoho$[crFM >ږp!ꝵxp5I 1Ic~Q 3.#Ld@zO^; <,6om
+OY4WW3J] ǍbGu咤-'◢LՁd;{.()IetUB]sz15a7,ΡS; è (NS9kJYm8sGTbg ;a@tH#H MWSfQ-m⿿I}'hZA=cll}ā'~{:bLiUoj^!!ŻJ ?`Uf{!h\
+3GpBT^`Y;R+́N [qղ-J*(fg (ɲUzңi_J7g\wC8,E[Q&Q
+IO8f2Σ?"\?3ˊM)Җ`rQ%N'ɼ(ߑͣ+)FH-$l7fOD v@ *_J~pRnQCw+8dz^E^ٞLWr 衭fpx؃is_)ƛ[5L
+j[(![
+ۓsDZMx0qNt<( hnY7tK"gHKSl-xȾ Yb]Ht0G(;Ilӓf^pJVG2l t3:C^:pe-Op5Gdw{K
+CQ"|c5pJs%THOp=|/|G¯
+Odl͡bL5Y󗢟aQ!8c{߆O,_h/8v:ɇ)3
+Vެ؁r#b'j^J|Il) (@Ll/nmj+ְX|áĶiPUi kޞeԼ+P.Wg ș /JpX}n>c;S2Rg4bBG ۉٙrl[ 7u-k"Pwfw;C \aRUY4a.uy<
+:DvziUuYKA.3xpL/%>"EテK\v/#Nj[?ǣL^za@/Mh$p}] D ?<O:WZ\R'Ms=%#
+<zc(°]+(39^T)N)!נd*</,UVcE@)$ uʟIYɨ:߁%:,QɗQQ/Ex/ǢIu[X$p;SNH"P;0:t^@zg5vA⨰Q+W8.Eozٛ2<;WKx:;dvNLTxt(5ILYE~cZ mR.YhpOxW>=pA2<P7%F*LJgQn \y1E{;`s*ċ-t˿ڋg
+cM$ϓt,^R0DkGYD(_ .@ܬ7|;sUb1s$pPz׸ф5~-@h6#
+je=%g% #N))Kh *RwhyOIYe1#:vJpo0&[q\Kx!*SBt
+Ϗ;
+`N ^iQB~ԣ"@N@9GݙxcY#Ǧ7P)N~mfS.0^n9# N-agl BYŸ(Zep
+|BRr )sHk-Pz* YLF5S͈u +MɗYI~0Q]%.؊?$n;SM|'i%Dg8B淠mo@c񎌀ע߹o[W?C^ ?~hi1ˍRVT"rQd\ɂr7ZP0WCyƑP*>cҷ|mdLC-C]pȰx@`m-P%Hr+1s n)xQ4.ߩi'%O74C`.5"!F`,.UC($ԑv3(g V-
+Ғ0hCl7⇇ȟ2s[n,sLLUa;`etd;x9&,Vh3llj:?y>RK:zıc<T!
+H]#t"NvImi&s3UH5Rvvdn#>k%LvלhQH_>1
+je`?1r1tNQuH冰SM}/5!3i[xS.xF@aea̭ymQ&4ϘOEa#&w5\ Yqu>.za7KF?btp 6c8D·HBtfG@!*< v{`,QBQ2$%Q H̺jـp}l"NіB ?yw ĕ'/wO&-MYLF/;`~9(3C)n0?1'3a@@,'U*xS&\d'.3&!w}BO f@:V!
+D:@x<o?WR &ZC&n
+m/8d,"SҲ :(ᨱE]93N<8t5&5AF6chP|^`|8!<!ȌB-me6# {嘫D{m֞AzlθJ |9pl q"P\ֲhS#_'bgRt F9΃M/>8 T\OC
+p ˎ2 hfU`()0H%zk{ӚlZ^<Yq8 BuaVj%*g+i>DO
+FKaqQAN*;:o.yJ8_L]PCNYiM6\vzK1:>4Yr;AU/xHlC01,͌e14?@wޯQ/~ʆGPR7SӷkzȢtX
+t
+ugN8[;<ɕhl~eOa?8;Z#\|e g<;zKt7lې61&pP&<tBP@v>P|-ջ%}k
+cgN/Q)Í0 I&|{'Fٕ,S X``b"xG:A&'r\EVhÿn5<n Ϋ'S{. z1J|K ^+;ZΆ0͘'xT:eJLo&1ЛLq3<R̅qz# Żv5´=tZ?|m< 9LxÐo6Il05@ t\ C&9 *UOqcLZL1K-B[|T,w)1
+컗-RįJlEWF[ -<`_?UDQf˷P{Rϥ Gqy`)=R2y}3y*z *J\<̘̈&kF-07C3Jm+{O%Mx(Bgn~<sq"\R'{;Y{݊FV(9_^ )>5^rz$1D~oQ$uCQ@N:<( r# P `n8[BGsYdp=Y9Q(*X9^NH /%*r[)
+5W
+<
+::”RM/@\1Cҩ-²4n WZ F)Z8.p-U_}`j[IRgS9 raA.jD$47vbvh,m.1/jMRj"\zR7sn6d-G^H˸3>Ľc4:noTFC.Opnc{gpF~$wf,ڜkoL 8PݸPj:~(J. PCWGqp 2$-ԯ2Цd3n-Z@ : s25_!4oUԎ ˟@g+`EfUVjFAk]b0phѣ:UauwMxS/ЅnǹѲwc TK=xNj5α]')NWӸf0
+4mL>LhX(A=9*wE<tiKt5.CB'1TP}LКU|+SF.(ӄ61J0^*oFw+vS|;=Jch88
+hٔL-QĨ)xIpek$Y[?1 NS&8
+qS9Q1='8&C1&L#QĨTL\+
+^h}tx='1
+IĀm _[UPG6ʰ|d PvMJ`J[UbC@[}&FC6Sɠ3t__#$-+tN:hVQ eͭHWg?Y򔣄LV|wqF_+2\&Ɛ̓BĽ‡k5T
+Oel5 L.[&U[!c@bĹA=W wPy<H͘!lymuŗ{HMwYYc ]>/%B:[d;QGaRcQu4aF)Jfl7"j}LC9QPorb@n[MsN 0bWKz9CzrGrHw4rC;4p%FMr{ÛZ@pav^:ZXx]||akdؔr%0mx[kC:X?y9q4ݹr/v>0c2dwU(-yL-qWx1xų},9ў"ۘzBov *^}3Sɻ%+BϥYo ܩ.L9BrhF%EJf2-&fW|V?m6᱿p@4͉_E$[ս|AZ IeQP_LF*1 ܏S+ 4\4]<RdD+DP͖`hO&h|@/8*jZze8 3c1 a)Yw 
+p]C[b
+.١ːsk}X27B,–]"@e 0#n8fUN}')<r`CRN bv h/E!^y&O1G1ʎF˜w s ύ"YrAzE~Q%L@c:m9&rx/[Xxg>ԫ|$<VKՍ$y,-= :aG {=J>F @
+bZ݃M|r6lNu S3h.K~u:Se+v&;Q<-I4Ab?
+lX ++<~0"D*;L_ӟx$* ɐmJAw[."VAq3날v$V<fuXIL)Ht{S<8][͔e{r=l4qOsQLHkg 86zӤ׫;dR)%FgnB)wS_ԛ~oDh)(lK
+Cb*k|4?U@DFK(2gse,m]1gR<@̍Ǧ<:fetq䀢B>Ŷjg'ksg7ź#P<>"=|hA`b I`Qb4cmwe/J3yźDJӑ@$:N'k9B4(OzmKg=e\҆ٱevR
+NB :uH3jͳZmףPۗD^NTh*, 3bGaw! x!6Q7%k/2f"oWR
+:haAh;M̰o eCP0ݦ P嚲lL?0! 3ԒM)6
+sT B aԁubGVeUN3?Cs!xsIA>Z yNYЏ`ϰ;!TJ2)N7x@9]ƁPYcJe?A3).YT#ԉ(C&מcyRAPİj{p>c/5"-+MlŠmg E`}DZb;/<oMQ=uiSt6qt1Py4] %X9$Up|mq[*Ћ9bSSzF(1yt).f6
+]&8+:t_vD_c3).q
+U~N#g2dnC6ҧrcW're%b3)p+Մ r^%!]<mW2-F{[ebۏd |e2a2ןoΔ^<׍hD0q+DV|3! <gj,wr1cpl CL?}^;fvjfon E"L,ɬ}羷˒6#R*>ퟠ_HAAC?<dYWƖ *_:1t"GlU{ }
+bږt|s6o8QʨLm.ÖL)̇s1T1|?0>8hįQ[Grz;q`XӏB:Yb iB
+hzûl_SCص9'C6$.w4 ~T\ oRK^Cʕ;eW +H}Z(Nͦ شgQ+W^P$8ο/ƛ{P 6(MbG`7euFwj$dd;)aY<:YĎ-;6j$WeZ-^@d<id#=j/e >a,}|E
+<D~qo&Mm EG(c JAd`J0F}~UU,S/E| [zI4{<,ryK"m\)bq+xSgZPt@9jWm"0g*A$ԅRKG6Wbbh,{zm
+
+0 k5[?;] l
+zXw s5| ~+W], =gT+ᯜcoHRȓ>:
+iĵB<-4Ml:f T׽SfHoV)^"jv)Z
+Ztb+4 2i،*j! ,AUs!hR}mAlHVb:`P gU;<C3`ff
+~Ǹ-?+0ZM|'ɢbhP$x?3@WՀI&@/R =:!v9CG2c6Ir 꼈 ѧ6
+
+{=_K(\0̢;Kf/sEJR9lp.n98( 3㛍MX
+*K[S_Iy7MrdNtj!GL:D${c:b$`Z A'|-U!od`EiIb4]uW t+РU#kФ G݋h[}d[6u&':n%`M]N !5|7bBʡڢ}5O5ak dfC;ɿ$Ebp9t`:x{H4.׷}4jEbVhv:hD*A ;֤Iw9@T;-؎3si'Xu<~e׶ȿ&5~>yUfW!ǐTZtl2v+
+`cظ3ɉkđoڊP %ےiE1e;G<DW92+!_$p4HLcע JI̽t?nQ
+AFhf Vxܞa!0kue0 ZAw,ߑ?Gْ,Cz#l!1(ͭu#5+¦34aym'Q24m?E6bv:2.\nE-\@hmEZ[ '`5ޔ *Fh&:* !r
+HA[9 DO;Ɛ(R֙en`V=ΣD9@eQ"b?|,S>j)fZh!R&!CmۆL)2T>~X)Uy-Ca}3h(dhoc
+Eެy̪8mv#)H_nc>ASO]#"J2 Bv̏oA큔-++@J ſ΍ף.hԦhp З[ yJ]{y޷@/[&T\9=FWM>dyPp]g}. VN.GL4
+,MΜ?uMS= t-(0 i¹A"A! ¢.'Rd;{i^Pc1f [>aYfePrCQTQD<)
+ 5eThue@!{̟,)bK1*҂7E(
+9ްy 1 ĮC)3WPP
+ҷBf7HRaooΉ (*W!+rowW1~2δ؈r#58*S_хlK|Gpr
+ DARq_/$׏;պ ; 
+퀌>響-H*b&/R7`B./*kS W3J.ؠ _-hF8F/227i؅Ll +cՒ JCzСi~d0gEc[x?z RhڗNϬ6Q>'"7uCdz-Li
+#Ry
+pw%_e!X:CP޷<WCp=XɂsވJ 1+8Pc
+G3X)g wI%
+j@*`I1c_YOf|m
+Uiy
+n˄%r
+OTK-JU,8*F,g|g3VA}8ܟ\cXILZ$:
+FRu~s1@aQ[ȍul1r`~6qo޾
+y%% $Z1`4s0R8[*Nw¨dw(w-W"c(2rf"O(qd 3
+~P @JlfQjV7j,n\%{B3܄q {)}j d)}( ՞v@SX󹂄O
+RԖ <DԔ3 0f":~GvAOFUcx>߁aNaM !pI-  xS3poL1
+&@x )\C86Rr)|,,MJ
+,<_D#'˝y7 &g#JAدr $&=/q\q[>ϤHH}o TR\ zZXqґj1DY !(
+F\DM#$དF.l)!|ta5&)G9Se~WhOA2)oJ&݄z/9a!.0m߷%`أTN30̯}+eIA!0rޅds [肽jJ|&OML]vM?e ÀjOEO.0*@5@,x2gS|32ټ"{bԬi̤@VT!MO"<rhLc}`L(6rZ˟{D;HnřiB9~9{\;!e0W] d\f6j MQ;D>
+BQWU}+z ٥r^ fшaZo$;jQ@ Ra&
+3Hd*H_r 9#Uffç(28+&dr
+}Ca84&V9GQqt—mfap).[IQdzd ůVK`<8C !?~؝I(^sbۭw 'C G)mR6TvBkL WjR׀ >l _d)pp ]p0j#r R)İ׸LWQ
+{Қ@TE'qN8n
+z\[4& KX k; 8*UUF.աJI4$3UFX=UUjvS FVkfث->{.3sUX=&؀-ǪKf_EkUQF\DDM/
+?by"Bݳ/dgVBM"}@𴸜oolף<QrUQ1B Kt={A(T^fN_N0b @|@gHR>^,s&VJdQ _ӇCTQ yЖ XfشYD~$-)MEfg\}nVpS|T#mx8bmU&l&mjtE!g{pIND --Ah'50P^Sb^-ËCX;` oh g>?>~GC3+@xfyB D!ȗK޳pv J<KdK mpJA:s,Lx *11l&p:
+_E.vTO3ubG7}%i[P}(<f S8:T% hlK\|:q &{PJq; cv5{yC(,ze-'G0ʢaEUD4Wv"Nވ cFZuDy3sxqbd:p\@4s򾿀^'SEZ]\
+TB)[A;wB}O@ܘ~lj-R0_-e@<)g~[!1aM
++~K)!~r#^DGXz] Ʈl=שv6S*v@;4;hL"VtY k>Y P34,nap<[Ξ_fU!PNM'xj*gONq#ۣQq (܊L!?ٸ/ Ń0sNIr$7EO;4úz[pKDu$UO ?tVP/wDClۊ# <q=9g27$NTfz>*~VWg'H<_%x/
+m z؝2WY8MZ[Tqr%Kq49]^V#cѵX&)ddasR22B1rT՜k&yVSmpM{(Q Rb ;B6 ?dz
+WkrY[S@oFYfyZ-]C2K9 [
+ф{.Aq?GTIE@bm]DHt=WTKC#YhۉćAQS6q0LFv$6ehB*(u D܅/CDd H[4Ll"g?T1y@|Y i3)20sH)6qz .E /.=i!HCk)/+8ZIyՏkҨ/21 *add —<t&"Muoc#P[Q^o]o4<lx #a2'ȯ.]UN8V껠 ^{tx]A1@9jqLи`x9fZS%oELےRyTQ{VO
+Th>}^-LԒ KFϒ8a`F/ulNr0|{>֩8@!f)Pж;Dڢ1σY5 t;|*u(7,@+dcAϵ4L) Hq!Q Yʓv 1xxtlDui%i
+k?Z ]o0s_TJzk{Z'!=bظ&s1#nΨP$ՂRwPcQ\h3['R > #T9$S}PCO8Ḿz X<,wBd8×Q= )v_rƂ JlAD en7oC} ]td]^,AۧbB'y_Oc;(-e(a6EUMzƐ6Ǥfԭ*Q41Th Zq2#rE)H)s5~ q~jr`?"n4 f%:d*^n"?guqۣ@џHT?ׯiAo@k/77/{!;;IFu0 }uډrN2ܹ$IL09]րܺ^4zwFFl*ec 3M< /7+tfX}8  VcDjv޾漠︿94(OE=V:r:tTj4(e!ǣJ!ĸ!@i%_z<V]ȏ ;tQq˓/&YF?gЯ>P|<M' +Ä́+
+o<D".Lg3N<%pe|+2f>u"[S[-t<Co,f}Nw(A`"˄ ÌJL*,1wA<ΘS
+"1@QY<A}RtX۫h:<zju@t-W)j;T _@$J Jif#H!i;h
+[3jc<DaԝuI!|ΨTVrнA$
+ɰAJtod.<R]{D3h40-݂f7Tj80~҇(8:AqYvu=#+_Is<? "p
+oɏ`L]*ibv+hEi6)-sdMj O4u; \CQ_[]A)`A߱u r[*ƛ%ajxŪ5Q7۝$C+u4EzS:zCAScb2 RmD~-cd5gu"t qGSꅔ~$[ᣅKG)R
+ǬlfoPt4%6g& 13"GE_g$<eTeMH<eüfntvOh#vX;b0s6v"1 iЮS44rqaxdy@xكV7ȱPT~EXv4s$ цo2$D >[=T宻=v P_dU ̏A.WW&G0EIغsSo"m2o#m&$ҏ7a󁣁%(R"ֶ?('deG3*X/Z%$TgKI ¶TB|sƏ:&cZrC-J }Ӄ-X^D!-UA:Gْ^QADs"hץ#pLt5Z[g<ƱbukXFM)B--3CtD<[2SHAt%i٫sd)QN U
++
+B̬;f[TE-bELo(kPHEv
+̄X paP7i\
+dKE-> EACw/2fTWy9 *yWI[H<%Ga]<N!{
+(]_J˸$m9LϪ *@(.`/H_)%_sZ* Q禿C6:ag5Tqn" kHadoKL/|~G'Y4Χ3}ʁ X6lh(Df0馨DW5|- ԗqs^0U7;Ot냏[izC"a-DNTBR[$BKlu>5@͓f/]ޚS{nWOW}y j@Et3&ƪqa,a:5]H6AT0tD1s]/NaUDRSX|IsV,g0_;z@(ʼhbr<+ti&eZK*E%T(@\qA(
+
+ A^/_5By5z8}|[lUO@%\p!:Oy.gUd~*)O3)'t?Zh$:b۝'Vw]B@Y%eȵ] K0^IL^4)f"_#SDpLnw2xtdJ s}1d
+n  Q"g09;@GlSQ@ƻgX}BO$͛x)n+I֦%:m"(7
+(./1/'e51 )
+kəi(]q1H&^Uv`FW<<78TL|
+(3HG~̐{n)e[:7W9Sjn3Gbh/}E_Wkev4.?/VZфLjeK.cdh`.׉' ]'"ng395dYđs
+Oq&rS]*yo.مg2ұ{SQ Rؗ!#)REes.Km< R^8eZr"X*p3ɼ@12/61z~Q!>&RD0`aY
+BD%vDySLƏMN4
+uTuJ.|q+%@y{"~Z-t
+م e2/!s򾊯GXtGaK/U\T `9
+avwjP
+̷,)읍ʈ[՚QB`\puPKs[ɏ6RH&!E54w=ߏO&Xu}=6'(,tDs=dp+}YQ;ץE.^ F Fᶔr Y8 *1<0%L,\Q
+{=
+,^
+dz $+ sm0/w;#~alz?L2 y׉ NW6.vٜ̈T44P<UE>&9KN|_X 4pUW֛H O
+=W1rw,x2{i5 X wΑ!ř6? O85NXQ TxAY+Lx%)!4zG-'u[ENnQR%dm%e$4/QgBX(y\)ABR 8.|@|H/?EI "ăؗ%):-7KR"3ү%wY]zoBl4}Q F[џw"\$d3}ExuD k&gpQG ld.j&cDݤe7HŞOZ `^O"*0,pvjcG?VDe^q+fUne[ֻ.aACh@3tP#Q|/5CHl|p
+}"K䝤)`h{va;UP&v&1Qt;Ss%\83VSYD ^ Hҿ4e:Ep1D}QY#G _>XVYQn&v쿛'CJg_~34VU(
+)>HMJX|qND=9D9$E9P]U2p"|yŁ]iSt'e&IuqD1$q'-hz]8D!5{?OPb=Qrj+.(k(fk};(Swx֠L#Пa(Yy&"ְƳ-@\ACG4gu!G`^NzPoYZ\\ʒo)*߀2%H#UG[ ezc?B@*:)9gi~:z/UdT{6?\RV"la)SaCIIϩge7V0 ,2>2E(Dܕ2%'>Y.-%-{E-E-|qt|\^Džz.`PyJghkhz)D*
+Z 7Z>eNg
+9+E +0E"ƥ0{!zJ
+3"{5{y (D
+3 ~UjƢ/S;a[Gэ lo
+C\j/klCjsel +}W;/2+_ǐ*!bDQW{E!VvJ] mF^bn+뜫&bSr܋J95oZRxV|ҟ?o@9w &u/ _*
+ZTsH)Q+~[\'Rgm<Xf} XN1#tmP a!d*hKkQ"j2Мc":.
+0)Њ[WyHK0Dd["3APo %W}!V[џw:.Pǿ1? Rcڝcg&ÿ'd>)bQ!j?VIBWilID[W _ æ*`͂c1*F"+d`ꏞٛ&|:%Wr֘:i2!aD U†˰!3X׫`>l^:<6Z+ЁMejaIoEv ">)DTBL,5E'EPQ1)wF
+751 $ʯFU3c0:~f6Y^9rd7EW=-#`v-WPC%JPy.dYcJi) *d9r2q <Sq(pk|G@;VV>|P)sZTd…q96
+`bx8s&_GU=mNx̛BƤ(f!QVI@cy4~} ns@Z'',H]$?h?
+)ia)5;1hEQX4XGw@_1iqD-OA6SlK^/97<Q V`
+Y'GG\]d! =#yfgVzsh,,c&-< <؋T bBc|o6K.er[<FZ.*L?}V85$uwz%Ԍ\SfA hNFӵ^iwj,r<C+$;@+
+s>H ,%}VM!Z 2ܯaqx
+LM!<k]1}}V q>'^~Ig';a [4_))F`\q :OHrAR\?=eQydg),.8>^
+B1
+`d? 34zpcQtxq "e~2~M,)xFvo#"_o@8R]cGɚ]M`VBrpjNj ]i7fg
+|F^&rx kxsYʻ7q0&R_]{4?OgbsiWNi\V KdHUi10Wo3 B]C=^b9@Ht93;sN~ umΙY|_hؘݯNʆ3\!^}~p?Ҭl'oߺ!;aY6ݗihdE~ru!qoE~#^%D[s4]PQ{ i͊/Px( {v+Brs_ǜe *DVjϧKX\4_2,ǜ/V(f#`a $0X eXDW1MՃ5OB?巉7v<҆Tf`hbŽ骆XxsLߗ)d>R
+g{)PdܔMEU e6Cۙ~@9/fB1kkb)žF4G6(nCF@ALQϠZ"qI[I20&[pڰa=Lc¨/%
+.i)O$r'臭6!˥Te Rff#`'x%q$OyƏ Y,IP68IV:HvipۑiOc,X 9A{NZ<G=j]0<<(GP1AV+olAyBɌC{D2T@z ͎b6 S9gA*|xAp2J;0j.g9O׉_>ҋ*`V3SSٟ _|H9"a a_<.A: =Ԯ> J&M_%*ِ΀CYt Ad?YBVLr@wg9tp:.}tw&s4TțǺpr 'qh(PBєS@Ld5eJY %uCvX2񒂜Oqd~E,U+&oA7ftIaaw$1m8GŻ͸QJLVS
+m[$d~ >fA֢a
+(Gc 
+MP-O A/wB[XqcRPRhLL_F
+ߦ\x)ʁ=7Qқn el/EKHoc'}/Jdp( 0|(f ں
+8#K.t$-B'Ĝ :`Q&
+>rpSKcA꡹<t_K%vmS>+E$l N[9f}-풘`-& SÇ:ti?Ef߄m"e?4XFq"7g Ql[ 48ۗ"h8;E9
+1äN/}A&0ʁ) $uJ
+j2=з$f>3V;$Nn C3^TH`lAmȰQ4wSsXضa49o?~?t`b]_ ]ڦdX>N#.3U]#T. ՊNZ-:EH6[i#`piݎzfմdmTDWr 7!1
+lj[SbwZ
+-](^T3]Z tr~X &KdgVL94JOǗAňg[}OAԁJؓ: \av8#HYL*\(䧰l{!pt2hBW.fW9Y׸I֚w`
+bסYI9o\:U%HC7-eQ.Ndj-$” y1f=N
+II!eg%^I&! W^<B{,^3bc%@qc׳\ܯ QҮ\+95olͲ]B4ZT
+I
+?e
+F|x҄y
+J_G Ʉ&iLXL=dC\ S2 AKM8W嘃NWRh(Y@ll&20"#ir<#D`? W(m',O7-(##b_tFE$\;޲Gu
+4<1FQUwG aK p3"LW]5`c\ΚiUx%i)E A?;;t(RlΣ;ɢNDjE؉x5BfKzq 6!O/7UK
+'&#uat/@9w&v{kٰ bSӔ/nr؟rEŋ5hv[s(3$?ʦ@"gý+jA6(EmA]ɕb"(9Lrh,9I~]c\̸ގ`aTC7P(jWqQaa+( ąN&{;RTMDm>: o6v_
+䁐Cn%ІP?rR0NIG arCƩsb0y%2^.q0=A Gq+dՉZ-b,aȹcXwd/J>L$S.jyקlˮ}h c19O'"A,w`x{
+}fSSd}p#/h \7KN(1;$-j%ng#XA)at=7䎛^>Ed@ M
+%~G=0Yhl6T@c
+82KY\؜~Tp*
+Tc̵RD੘cK Rf sWe?ӱ
+| 8#
+8W|wr8pA(Q9
+/k+T~ |!.7L?1B _ Aژmu!ql14mݱ=G9[Exh=_VѻK ~[q$*fchF;$z>9︨3Q|`
+HArO;2E
+X JÏ% C 'A ԉ `_ɮAGIOZbx_H}Q]p~>`Ysx2Ǿ -Ic5㾛>`zqi kf9h#H?ѧk;Ha'/<u*<|!g4d!y`8r# BeɩYA/PHWi@6PZc& xנv9)߶-K$QZÃF VȃnRsvؗ/_=JR1ӣLM*͢5[Zɂ0؆\(*eX S%;ڒtt](|4t7!bVw7]98;`G!)r8 (E@3@=o5tR'"_U㲇62!\ 8PJfsKM.j~+eM}iv9Bf=!" /a>$)k91U5uAx"closbfZ:꿅}y`:d ;6Sv/<ZTzOxi%򡰧.pKѐ3]aCz%{(U?tA!`_d-@2 NIN_3Jhb@HqoyX2x1$孓r&A!Qݮ 3σ=8"4:pkb hÌ:&-Cvh!U8_1{(`Qv3e۾dOtG&+~s6YH./.ʎX@8aN5'%(Oෘݍal"Ph_ߐN4*]|?cZo_l^ݏ !/ H t$arw%%b?Q4!Q e cj4^ǀ~S)aIMmack[R||+u;(%֡c<ηa *( ЃWnSZI8g8[ͭCAQxs͍Wx,S08w2\EVe$wFHYA5vQ7~wΘʵ+KZ0,
+zZ{
+/UJDYzl%kkaXUbh: ƴ
+֠c
+|tg  J"8_qa/"h:[zDᙶӡ c0bQN@ҕF]P4jҚ^VB`@mIދL}sCM}_Df}Pe0'kx1%~6U<kI黑X\* (/O6n~A avfRB:IudYcwL|c S~ V_?ٽ"W!o*+CPZ+Z wR#oVI "'ǯAhi"M8ܽ#~EQ)/D;!u<T (Et
+WϬm"F}V]K,Kmfq8? 03d%j 2#TY$!dJ9f#!I0_
+)(3H>3igj8e|ԓ龬g&CїP!w >L!:y-]K܊Xvf
+coߚ ~@)!7(99~"jaTu Bx';gt4WOd;a*Ǻ(~јU3܄k֌TaP-:ݹȋe)а) X 
+LMaC-?qdw3Cfr "em]Gu
+riͱazίӯ'%Yxł{blz'mL}Z~Sסۃ'{I 6}݄hfق^3QT
+MMgx%)=dXW#eS\/dB+ϙ"k
+rkMß|?Z|jvT}'Ŝ|) 5{_|?_yt4s*#%f
+m\K'/)ZvCdy: dKtI4͕JMQFL-%uvػYP=@hs_u-7{(˧0|ld>5mF¨ xFOBbDM'iBk #ob͕@9yҦ<5r D$>oqp^l.(A@._%$V=o&c{#ɞo4d999oe䜫etSqf ohM!@ֈ,l˼\!t6
+ARG[._}|b(/S0]8tRᩀO&*mQ'I-v]@PWB>Qy?-\>JāaG
+A}1Bb`h^YÊ"p1
+
+|4±/1B{
+lHmoFV2lkipo׾X/ֹ<ϗd*̙b=  3L>65[?ś(`ow
+vۼAgP\V * u[@C(D(( F#s>%PNKHWGGKI ^H7yɖKΙ\dgHP!Rm&$3/DKiQVi|Nek7bT
+ژ/P,q3_w nD̎Ǟ{Q;+dU޼mwdtY`6ܫ_JˀFO#YtWNh%,;OU9٩KC22APd1Wl |4Ys}QIgCQm -!٭[8ez&0q` g>Z~TN"3 IXs8ap
+Cu KyWnE.|Wd&s:R˥|KDH*LZrPp>"&meD3lcu$F4$PlIj&₨/wj.L˴>4&,
+(vls1h-1d:aemW5JUcuȹY ba)N}Y #>]K~ QZ#{df{CJ\Bۯ0x1"zM_iI෾laONTn \k-<S?Hj$:^`RA%-=bxBjqSV3|DݠZʇ0-Л+!5ed)|k!k
+EXTn
+k
+gqE.b"o oA!W{< wˍ>τǰڙ0o⯸p>ĸck۞XM׌ZYdmGB`[G2=6d2Q֩RE'[wtF!j9*vu׊da<,X"̦ qJ`(-+*1^ Vus܌*B{gdYiyd?3?qh zo+q*l;pH Fݞ&Q.޽RL5Xmn`ߊ<q7'i"1T&f `*<Q дu̺"0˕QeJ2S `j[!\% ɡɫ\+bRjc@g\z~(o^ Uʷ\u׊.׵wCc`G}/JH*bv&D-`JR
+`D˺Ӂ0e0cPE^ A
+ f'"&AAhv
+}FM6@]X^цDaX͙0,ͻaw `af.F+
+ͮ5o ]͡@]H#
+b kǗ7.hn_t!(U.Dd|L+ i:*PfŁ zɫW~xbl= vUVBlv<'"ڼ4ӊ:re)2_H?' $pCZJ̕9hu4M)ISǻR h* t[nEN><2zi/]֜ԹCQC#;MJܡI%-IIA a5bkB<M$N̯ϋ2iz^#i) ;+Z%XAqmbd=+C,JՙV49jLp{\#V&Xϵ7貦ꮸ?޼$\^-+sj0vFw O9]a&y\ev]rCQW2("Kۜ<TEC*ˣ$ 3k![:,:82Dd+D$N3 ;ۊ+4׉0N.i,}j Ytw)*/Ѻ<jFv/47eRmvBeHIJj->)/GbѬXgKssbXV›lLnaX
+ 0Gp7&dFCHbG2I
+GJ[c8pY}2Kn*c2<|3='.
+CI7A AU@:pme)bMF͚
+m8o|ݣ|UyaP>clXB|@\=""1t$Uz;5Zm2W`0 RYm>ʃN 1>ԁdw;er,"
+MZw͖DLh"Q.i.I}sedK`O}+l |{+$c~֝u0|c˴aD8|&\F+DJ)$L;U<?IP)aؽ X Y%)5E 1D
+\[~((l 2St/![`o-y αJyI uL%US-A
+;\ζpԹ>ù蕇Wi #M7B:-/ȈCgbΞ~klX@īKL[!s<k{d
+V(RSpna
+ g Fr%i+hO+"
+g9 X JmU߬C1B8V!+5']̒*tA^TSƿĶ%x֙+ ީ̺O.tC "4Y *mz#ğ2U^l S7nw"@ ꡆ&6_"Suӛl7/Ȉ'Rb~!YlpDNȤBW 7zIdwB>Ɣ&iבˮh J94UbAe`1#P?.S0$0NJZe4+<^KJe6/;i#rMmWd5:^XVº.Yӈtv酋:l
+Л2B},&֍<V`Ah;d̲ȷsRוX3&RviAaNyC\!6/"@:㘅%UI4Enc'
+Lg6M9'ي3cd&wRH#Ff~o c]ɏaAֲe\"Of[3Y/#M@G^6C*O'G 5)
+<އ&nUWutΰ$BP)s!rټWEL 1:#ʐ9?ɘa-"
+y
+QS|x'CYɂioav.?mdkXx"c 9=&﹞Ҋx2`Aipθ,JV>
+F5(|UAHeG=e{? |PJe!!l\#-©-#|xz^)+O%=lE`ǝ2 |zy!kf%,ً~.Ѧd0K㵋E~,Cע'!z+:
+$[3%C2O^[\! ȴU,
+fSqUDF3,e(}Lgh4Gn໸c6%BC 7U0p聻HYBJ $՚%M9n7889րa~7R5YIWՐ%A{7.
+d]Yac[ װ:]ۇp+ܿ-) >ePij>|<#إdTH&!>p41e
+iłsX3(dB91^J3wu6
+i723 \1~?-8pa"#QL=N2w{;Lm@dnF"+rC3姒7))-]?<0婨u${5@%"_< '/
+MqvP:(h/!X>B!5sEϝ+1_e?h#=F\a*rUo&ӿ)*sC9}im]5S/U ;xƍwac% { /y Ϗ[ɨQ۟-idՏgHhp%r*gJ3ʈ*vi`L).+acp*h~Aly${" 1eTPiZ\\sA AiVdXw+komHFOywϭF@K7qh">HX,lSj
+S$Cp. oЅUW;/ h Wab6Hc]*֛#S8g^k
+&?T`1%J
+E·` r.Ί@Iu aʻpc V\l<pIVӡ9Jn۟Jx̫_d@( qȈ%/Ō ˧|mk4\u E1<
+dmO?N3A()bC0&ؿpY9'HaC3KVlCxI&iJ)įRI Da.
+r*쒑uq|S㋰@,.bˬ,
+yKvl1x1{@3 gL ' 3T!EВ7QLM_hUF6cз?2a0ql
+! F} ȑ F0(#O]"L&K7RCU l#8U% 8Hv;GW8t!;lg\YEnBz%oS]FSr;}$7U |hZ(* p߷ܦEXs[$_1ӲVUtmW^! eqQrm&?=7P^hgޢ.@ɤJH~εU|F x eC~ jAn|6_DP3^QJa@_HG};I 0
+1E L'O/ZgQZtXĚQCЅpV\ |Gv<פ!sUj8&Z榰AT~&I &%<98@
+% Hw77'Kta2io%Arv(ګ2.9JҚx$GvPtZ=qy]TSKQ)CJ!ـ]C_0`xuCĞd.h݅jIihi~)B#~SdY<We&ڊ!S{uFc*u*R¤bRH8SNi8V7LT9EN*|[:j4
+Cr`$Ȧ` 鼟03P0sp(د<-:$zI%).5Əi@K( %s!+#?Zw
+˺a[qf"qr0z [ip6̈́)"9d+% d-ka9
+U8+ʓؘQXcINIǽRW*L9L5(0 d}2k‚Mތ+]+
+'iVBF]d&QkU/IpOSQ@=~ZLf rZKϤS("J'\4܈&yw8 5X㞖%
+HFWx!d 㷤.
+=Eh]ƣKQ?Р蘧BkE5PЅX/& :Ud381W_linuoa/:_|zܛu1]RT{0a TU,?%'E8'hyrշbr#1❓oG&h6J
+̊y6 g
+X] AadlЅ+x~܊(|s,[:e#J3o;M̻]"[9
+
+%U*w^@PgCKDFEaH;^SPuh 'vw _]O
+Bg^x]PRb'ISKxDoS1mɟ`y &seךO7
+FǶzSŸpE/E`Tp 8 
+p̀ŅV!9Rr/L**I\ ,E-W7$E`]fkOA4Wū~+\q$؟a@]
+TUE#EF_8@q5:}uHܘȬsZl-$!|h%j\{Nޣ{JCȰk
+ YF
+E(9O;LYt@s:)]VH.u%kv}uvY׏{/ZN7iWdӘ7EUq+piQ"<S"% .>*)AsC_W
+.]!m'2+UqۭG < 7r)a|kGWɪV ꒫N&"> f1I*  eo_1;2y 1)`Q*,(axؒ<RPT#Enksm bn1OŠAgyY$$n̙((}}0=F} :Əǖggɂ*aq olި08BL>H?i u戝rr)r [Rb&{TCj I 9zt-iK[.!@e}r1{]]1DF\< H:.Ԃp[ʤx eH2tB;v+2F<|\Ruɋ*W莮PV?&٠}NL!È`?Mhg,_gMQh0t9x?%V(:mžDu`B[!*3ķL52,q0@Iz_7!@^~Gē%ZCnap4qetfeq{Go$Ja2MG ?p#<}Qy%.qi` 0ld/N_Y<@vCHKZb(i>Ih /
+*~!c+@T& ꧄Z-)2-hB SS Z@"! RWe(F`hvH,@N[>7R p07 *&u}CJ^@ _|}/<ϦTw?0u:C?#<}}z P55LgMKAk~H yJu;gʿA|Q)3Xeʉ `9PY@V)GIGJ_瞫m+?ٗD)+GI5v~Em_G`l4~ $Hh9d
+
+SJgOޕyRRGİrxJ}lC
+7W_
+fH ^?ZnzӒC!
+7㵗l8`D|y)h?-H
+!V>[e Y| kHJe-x "A1Dzb;\4(7C2ˬVȃY6aAz>O[e_|Q|ċ9Qߪs %eS sӡ+^\#^G, <4TΑ3ExP&$V
+hdH$:BH) 2iePE#݃ } CNok5+b["7thg& K
+.zŻ 4#DF V˘ ]?%n[
+Rƞf:4JTzUg!)>FǴuL'yJER2J*
+lH!t>JA*=]_xDY*^?AU2%V0hF %5KH٘IE$ܤwd%^v_rmƋ} 6$ؑ1y*AN|ђ75f+UJ֥MƞS'r{m,Rч0?Y6 @Js C)є ŕyk*CV=+;xvy
+A;DI#4#eM>K]säRu.tLU/^_棤ehն OVLw޸hrd(kIhC<$Hd{BSDϑ]Kћ0 OfkʄҘ.X<Z,s$1%2.Tp'J
+CJs[]Q"[aAևm? v> 8/fijp\ J ƶ}%+'v|kkvX75VEb
+э(o=Kn%|EA hjPlKS=!hd9eXCElp2"ui׊&H
+_s" k/ɀGpƻ5ˍ3+1ر@K /4ԅo0z1~{tíaG:2%t.:['G ֎9P J+PeܣW<3HSxX.Z-?Bo/L# q$@^-"T .h8NU9%+,]Ιg91ܭgS;QQ?}+?CǟʩLl4:QQJCoPdYL NsNtCDPT$t-㟥p{ɜP8"4KVE-JRvqMHJv*j?d5 
+R*I= P[J NYzJw,Ә@< q
+{2E3NqH}j;֡z+G6a陒0
+0
+HAn7O AI$%,}sm>:8բDfk2coҖLѷk?6h]ڠ.kF9aTzAS މF=f>{3:w}
+55/i~lHl \ZyiADvH=ͥfP6tCurC&J>Q-̾DM]qGT|r]"$rkr6M3C)ˢ\#i_=I_ys=ܦ(V+Hbѿ2{$U𶜎p"q<}I_3 נkd-N$Yj.0-{9 &œ̴":7)'.צƏACt>y #>%s Y}("JŜ֊ QaҠHS o!S 4*}ċs8 οrRU՟uE*@b:Yi#@$B+gbp}FJȫG}/GP˘[%hêv\wkJKf .!jP>.Guk@LW,
+9L12)`.c;ū>E[jNg@|z-^JŗK+¼v1n2Dε5 cA ([猶r0__@`by13<}L
+!knYp+]F%&9jXC1+c 1?XU(.97 E=~$}p0IN6P薧Dr
+e] G.!HǏm} #SG #ȟ:mqA_Dqԕa]ӓbCӔRF)f-+CXv# s*̺ V-!2M:?k8;w`E`nӝ)nc4'YC=}tl"Rh]:P%6H,jC1!3lj;kCfaFTtcb&w$
+-Ma eKh]N"Ų8GQy!Ĝ&alO)d31oyf#rjaӟG_dH @1( LMX3Ag}8p|zp0U+SwEwrFgҘWF{MVK\Αpw{2AbrХ:q
+EΤ>cTK[K  5?n_UNdp([K/J=
+C?rtl.,.g Hfǯ;Rkײfi
+G.h
+mh~Pxbq,W 66i+ K} hdssd)jDm
+Oߐ{郙a OM;52$8$hrx[&dh97dxϧgk3TQMUS2x8x`g6D+ P5f CQ'ֻĸ1* ; }q%?x7ѿvbYv{OOR*9C/ DxO#
+3 ',y ?{a4#-Xe')B0tAV$ӠEAfx!QEe\<#vYf:@K@z]{! OYfQ0hN?@hɾvR0چ (#͛%BJqjb-d3[!=B6 ~ 2{sFq}
+hmw #i#UZl2%2@Is/.|n:
+Un;1|(71
+|oW3cU`t`mh(QaDjP<q.+G+[VĐZYɏM1TFy.V-|t
+SM&&ݸ=`H̾fFyHkH,RL)^R3džhcP%6<0vRߖ<ǘ4`FV[LQCA!{S2´cK*Qs^JY/;ɹh5+bdn1yy2!|ѓwg$)j;KaBMqv (SJ#J;>*
+j"q.R I0+5Ǭ'YUS
+m0!|
+Ah<2ߒI~z3Ho+p"\G1&>'֝Kze " ~\޴4ޏD`$& Խ dbQٿ)W) 0e#
+x(JI 4ggQ#cUxQpY+f /+bᾲKdL?Ȗ()"{BHWdm6A]HDŽpfL*|+p
+\/^'qVkU+adWdhNx2*ea&xYi6R&m.evKU;7R}[%'ұ-}O+B2(pD8Kk 62hDmjܳYHurM&jҘ[
+fznep֥
+Fw0ݳ#\
+%`l"GA(Pโu+Ab(>(K%k+T`vKVx,qDQXPց\ nq/UĶɳʼIxlJE
+ZOVs4rl~69L%:.U? eSeO}c`;=kAKbӀn4A/(%27WuC 9$xa˜w+1*l_QQ}s-z
+^Fo߰)ٴ~ J-|/%A:`~:c|XG֚Rsw@HO(gy9!ZyEC+f$/k%*L"`q
+yL=7i歇:SU4[4 &? ݨmuaG&rcrـ*N??kK"b\Fst_ԉd4o[]9x7TZ@ڲ%xO%dQ
+CіpLy͐&vJYEwb+>su
+8<a0AeGБQTOCt xVA5RxteҙkZeVzH_B⏼XRz
+E֋sii.gEb9 %O+Q=l /s=F ~k L M*(G^|5<Za7 oMk^+>JxYl;XI4c+В.\<# Xqd"(`>xsB2Z0QYzbhabǭ-UؑAWVodK_  UggH9L%pGW VyMvLp{ks.޹2bU *|9_ID
+yIf (֫jKb:픈Q@jܰ
+qp.YKoT0aghN9ǼYEkPWǏc7"e^y6NE=ka3M 9 \sVsL'F0G8E@*zy%9M.vw$}qQ"(#tzM0(GVQh_X*˰XKTN ͭ5c"R3YiIʲ|l%AWӼMg_7Lk*bN~zL29JAYWm*(!^h5? ۚ,׶WhӶƊ(AҰu$YjX]
+
+L!wѐaF%)U W H@cS.z܌\5,@ !(]+C7묀K͜dqޤn’SCgcέF$uyIL#ځ͉pZFo dbO̫l2 )c :+J$YtS]jYf~4
+Q3LZU}ʬ">bBR wsRD2c̛U],D?bz)-͇/ >Kh2¡ta=ŢhN5T.0ʣ'U [T05RAB%xJq Qs[Dȅ9Ww'uKGl%=üXΞҡX.-:~82D`OaNF*HtP5jxŖQ}'f)`Ie+ #_Jnc@0? $
+`Ň[vgxLKyxm֝>_
+ȼy?|yxx'`"dh&NqR]ˀ@\J ZS"F
+M<BoYQo_ +6;C9
+X0~WL!2[qUq:'ς[DAKhۚHx9>55 QHtDKHVg6DZ ~M27Ar}mxsؽ]btX׷u%&2!Q@&q(fu
+\B:BJR
+TQȆ)O#c9 13Yd jOggK CmDjMU#$4my)R ZQ=3S2J;Pb ܉MlbK&` eٟB1Ʋ+=OA3 6oWNȱ~hʽ@nHdjϼVB&[dfC;KESW,Dִd >Q
+WX
+hu(CS{fgPf5dxR$kÿD>B-"
+)d`؋&u*a4??>??p^Y*BH=C\@hSxY MHS`zpY$Чa18UASEJd(4 Oh߆:y '
+dU\ox j P-n)nPS?"Ř5?j5
+q7oquhj2Bn}@62:)Vebq!Vmtd(h
+{2vtOZ9+p
+ː;_<Ļ);U`C 1q*FJZC9_KaGNaѢ=uQ._MgYEc.bE' F\_0U48a%Z(2dWMF
+2v"b%rO9c RV‚ༀ!swTI]>=&6PRr|SĐ@NOpG&](usWgsNL$,D'9^TUp2-7YJv"1(mBޜ@aVgbUgpVp.pAٝ'C_D_௉.Y6gw,/:soT+8cݷʂ@ RcV{5Yh*yCHI=e2sL|@'
+,·ӭ~yQRUz *J,R,貂;tg 򩕦 !)m?PW.c>ŊI5ɯ{uídA_J:N
+k [?@.F'\0tz o ȿ!= 0QFMi;`1OAtkY{m -NJ$}/Y=7iN]KdDgGk *C,l-(Bqρ&"d,(%Ɋ Hj[e[ѕ݋9h*DFv%*" ~qQV̪:XB~HPQPM8Wkd0}#|-Lc.S&8s{Kj|>7fh7İ\_pM<+aU-Щ,*l[E"#> 4ge)'W΀z?^pE; HWk!)&sPF")**b>K6"q<r&Ԝ^tC߽3_{(y_,v+݊Cvzt8ױ
+PZה;ޙT
+Y7EI5R;Q[
+ lB{Y
+$f˷bzVNQT+P +N) k]]` 3rAUy )&HuC$no9E R6 n`.d>2,{; .- o-^o{ _D\)LıڋpWj%rPݕQ7I#mA eìKZ8scJ1t#"ű%LJи `HWÌe#Cd lHf0Xi8<B.G3]ACbleH/\x 6jţ(*E M'wEM%:/{sc^Z,^'!t8(>ܖ:*"NA? Y֒n⿱
+h,u7
+ͱ!a%xnjܐB"Rq>EUuRH1+vs
+5D`<%q2ʍjcN*:kME*b ch.pRZ;$=h,|bTxXr7Ѿ0/a4&^eZ ? aȅC%v~QH}PXxL7AX8Fharh@P ):%MUh6.;uC<˓5#1YH MKBܕaERhшw#X4l3 }`
+vmH`_w&4qfG0wB 1_bйvAK,bu!WpK5t0> ӻu ,hAdZs&9Ђ9>.7Җy%
+N'?U!x#L}wޔ4Yo8u/cxcQy 7]PyQ`{9$j*U tՇae_``;A =lm*(F,~qx3M`I㞌 Rcѧ(ʹ Qfx1FSÇG;Pb[G9ˌ¨,HźQ!6pzsאQc :Hsv 6Y4Rs8uOcqO_K 2(2lM+MZm;FC,q+:AlD-C\]M}ILidǿL3L$JF0NɥT}:Q 
+ɲSpM7 V |X7ncӊUĪ!T@ݹn<8w*׶
+[YCutA"ieFă ĥNs 1Uڦ-E+ű,GX:ɖ@ 6dPjHI/7:e.`
+<< ȏ*9p*XewzHMT*ER0a "T,(u*miOhTA9˧TxTM>{:##u3@uh
+^Iґ&Dm6si$3PM ~nTkB<Lo;$4hDB $dž$V{ed->(K-^QM97fB1_<wCp/ffͨ#,ۏ^Kjm,0x Y/0d]i4]S?GS?aq"Sϻ˜'oKh~nAhNIk4+.&PjAX&ϦU<TYPۓXю &S0n"cH@ږVQ';]_Zgi i F$YN7"հsRg;;Q;Hz(͡UG,,{ ke%) QbY
+zyiĦX1
+E~ngB9>JI`p >@ק!7skYAW}
+rWs
+Џ7 E V~5{Dy~@5(Kƈ)X3x
+-ᆤܜ:=cm7Pti6Q~$agLʁ x'(<r pm{hRTuY%=93ʹOB1g`W?RERԆxj~\4JhЇsI(UiF&̷!|if;y"T"
+fy}PpV:IZ#s,_/e 
+#V\ Z8F$%6`[m> =s@T`*Z`\)2ρPRY\
+z8>&"hUiupGҗS$d{Ob8&aZtj]" 19<q!Ye.sfOY39<nI); C!N'Զy)*nKy唣k>qn2DxUDĹ'xk}/4|+1yKۺ"}mɬ*MD}+-1W -TbXmª,qn`<9٠P IӞ/<HLI"mޛ缊wnsa}Os8)qbu H0xz#>D1М3/-4=?[-.d[Cg }A%0n)R?L)v9A}4Gk
+ K"ht 6Mr7hD$'dB#ARH>y-)tF>]paSr"h'GT݃)K>ԗ<i} kUNN8Qf׍T~?Tr$$F4N#!DnADF$ID ݐ!UMdD
+DFKs )Jp:䁌zyҸp!Q'25<LW9nE( Ssce1Q
+
+
+r.n"~&!aU#8ΫNL*#3ES@.F a1_ɸr3tzbWMΩ(ik(
+V&ʫ)ҫc&0@]Q+[:gd4*q6$WVB #ZUq\=AgMZ7Od~03f( zWA`_ xS)|MTK,2I`fWpɱ!՜9IMBÒ"/)RpZv80g-M ė]{_$0T[X ܜMG<Bt3xVJ0:X>#BxZ`:.뻌)tzK0RH3' L'VmMu$Ob]Lrlh]$$ݫi@Ė8._-Ҝh}/W6LU:="afT@Cg(ӫEype=ݱ1 gL# zOPyXSKޢo((벯oR ڬnF3)˱
+%{3ad$θݭ p`+)0)ish_V<W|<DhC(r4>8UYd3-bt(Ћ@u1~W@#T$m0cf EVh)a)Iѫ}PDw,j"~ -awSͨfN T VCy <B
+Mك?$s#iM>+ <\AP7 ;:A> D{)5 )/eC:LقQfx %fƋG~:<? P c_;9+5v2 S2P_'ȭ>6=A&k\֍;1ˌXIa^+?as>@CkI٩cGZ]dXqvA%rhNhuq!AvaR9@~\Po+Nwԉw5 vRj)߯s\s&+ <DH;AgT<?6dm2nSKZF
+P,نC|F6Mo5)O.ge' EU2U.8e9о0nF']:.T1/dB(Y:I+ 0ĕS0A?#%B! + IUhmTQL`(c.$/]7a"l<
+.85pxJz"yQX..yD:(9^2;k>R}DKNm )`9gBdߗ!1n($09$9bâLF5`V8%|v!ތ(uemAT<.V.BLѭ_511^|"G !%UB^w2tR<.fc "%!܄.8SJ-N*U1 %Hڇ21|4V [d^UA^4Ycf;F14%t& ؠK# 2 v?63?nblI=Aj,*KzavC3ja*9xPzkr> |٧FW?p(&ojf`OR+!(4I#8dQQbLSҕ]5ETiˤ5N0#V KGʡ<7Q7D;Q0Ւ0 pe4[-{ѿ
+WOeWGoNXS^:%y"#
+zےWw&(PeӌeV+f=ue,ہH;L(}p]MOe IL"7xj^8@Y,촗bvCNjȄ6U^ij,1]҇w+5Մ^붗4\5PέStOF
+}@1Kcy.!AnӚ ~T ^(FΛT˾pnd -p#{Z/6xsgAZ
+ D)=Oc& R=EUM 1ZЭ }_dme;O_sszL0jO־l;YGk)m I\9!M2S4e.W]bm *_Z
+S3_,2Cx- ƆD7y&
+ ((wAOϨMrViw^4叏1W 8rm
+<lwyaOq85E='ݗۣ;as+ķ?F2t EfRN:DWVџp/z*WfOyuwDiQ#)3
+ʌH`X0^킐{ZIBWC8JT0|Hש0hN7dNJO8E׷fPԵ tf[;w$d0R6u=_e6Җ&N~T+@̈́`ON#)|6.N̅r9Q4`dܕsB;1`0"nJZ}i lW);x/ܺa  w r_(ߦZl<qMawA*w[FpoC2{ș9t.گ(2+7.̗4е, 2x%e:-C@Xb">DIR /P۪s eë1H>VPU7Ѹ_Gd 3ĉAX"8TPHIwm'{x"rp!ڎ*b/*:̧$j1r[;W`9j8*dh{3u|ixn̒ <9h0VȾ$I:A#b,ɮhY"~!kPE#8TۧŚe}?gXDӪ37"9#ْ4>ɯbe`}^42JdLlLVˌH3#F
+m@# ߮ }^ԍSȧ3^ SЕ`E$dœ<^D񀏬qfƋHdk.0=͆k}߳_Q'f^vƭwh5${Τ`IHΤF2#b3"jUZ)5thA,6dE2hup+2"d
+HA9O˒lyM/D
+Oe\𺃎~l)3j2j/R<^J)Ƃx4#DŽ"o*=~4^ W6ڰhqADnuLt&t-6!CZT+/;"sV.)Ὡ VKfװTB ȏ_ +&U.nbRR(]ioXOfn1wjEիp,\\{Y%iUbhuB :\
+MqG^>W p[W;n?÷ i}JGW&7N/pޏ#yp-ͼ7nU% XJM!ծ)b# ջ7
+EmxQV(Yz;dsUݎ$r ߷A{j6LDA(*UPB}i6ߋteq+0V*>l#U5cuJGZ?*'ңx-糆-`K17tSu?\Ce_z+˛Ԗ vE[&>ov)j:A4n;uMSM̫mދFM7=4]f]RXhmkʔtc.bTܠRMt&=7e1xkڶ:tY2zM2/+XOW&WhH6"u,t@ǯa ~ճ,(zxj}0{~Q/s7Rcʾ'8LТc/ӨȓU^,jʔnBs9 /[FˁvF;x9 A>%ë V/S.V(!,a.'HډT1!چ,{+u$٣" Պѭ+zhDxE5(962Mg w`3(γR !zy<G*tN@^BaX*Lb@#>V|1.w͠4yqFU/H m?Y_fڶtF]ZÇ=׫5#iAxdz d^WˤMzˡ/'Щ69~tO]grxӗêcbH#GS59r3Ti^mBjmZzmG[&SַkJb> <9UgGXfL7Hd6D1&oogH4G \-mT걝AANIrA]Ɂch=9y7يtu2Y.)WѩeNN :+_W|πE q.]A \*ptu}ω,grcBcVmoA9aA[EzY@l>O*e0JUBAą^}x\8aWPt'!7&o;/xayܸ|Z ~ 3s";j֬RX>!(SJxŨ)GdnʫQȑ-.f" >d>-'zvO 5BUCyx_M^2}SVd^e/I~<ԈXPtz̶K-}92.eP
+Zf> lo<lg,(к$:wVYWHBԓHXeLR8cӭIHbvHɸ4/ssvw;-<ON(~-"'M. j& ŏ!?-SNJe;vq|[?.+.5$7EvZ9_pb{3Ɏ$M5CRS1'tH=^ tO=sI%{
+y.'QY8PEK}a^v-z YHRm > AƆ+ (?ܢPYj}\{NNgJ+[ͫ8PUQ=2ilpimUdDi;R7Wn`JG"%
+\ w1TAD_>}i9Yt
+RxK.ioerų1c:I1W螝2zh<ɥDChxA%SN #({A"Lx
+'*?)^2@6_KBׂ̅gY2<. $!3Fpa
+,F,QW0{*H)^I][ NݠƼ}\)rp0@@THmK&o*Γa%ıԚ8 ]䆻4</'CׇeS:\=6_.E*&l j;
+d3qp3"Ewk C 8r*2}cEX -/ӍQل vNdJހ` V6"hZXSұ18x\½z4{!ҧ)
+/unE[d:X+6{ حaqJjd1E~Vfӭ쉦كʑ$,|6ϛ˥Dg K\n&εɱA|K7+ee3u\mn26K`Veu,8FI%])(5 \58s{ aX&{|>%1OP"$vj޼v
+)JW ,*!C Fasd"i1D UK: B Ccw:̂1lUs%
+J&sN [,\X
+>z{oE
+˜S/EA wyCny7ӄsN|-` ! cNx2ui
+&"iۓ!V>7ŵ䊴"e1RJ iMpΧJx\`s+aL(J:saYPZ+Tǜ,3&P=CKuޞ]ÅB}8E?㏿X?yM .b)qt9 |ڻ'Eu2іqw;ET3FץIڜIQ9Ycd/*AwTB]JL;{]}HJB۳s5j (J$}7NOEƙB ԒU3?"tȺxzƝ$Qo}3AT.!YVk B|c_knERf*7>'q0[n sD"aG /=q2cR1W} 
+4=^O`AÇDZX]'E :IL /K,8!&#ZRЅ"1@eRl *+)2IȜ=ܲ;AVI?#ےZ[)q8+J7yLT6}:0[L-XV&FnWL3qlkQ+IcjQ:0IԳrж%1VTbÑغk0e:1< \19%gl?M{:1QՌ}CXt:Z`GipV@2x=B1$54-.8i4=JQ~f5Jij'#U@+X)hS:*`!ʍgɕ9p_P!;+H3۳R4 NMl1C-е=қAySTeyZm@|,
+
+EEٻLqpeXюb_ \<̠jǤ\**|K2M)/A};Z"3YЃ19~}
+A`F?vM d Y=Y@pL}Ե뚊d6w"T"toyR8c:;F^7HV Ic.7Qm\Qh}_5à%=B.!w!vrM\*Bo<jhB&Pd=XAyxyaiWG:xh< u,*hQ?4Anf|L> :OMY#
+EW a8pX&{,weaWU+64 Y5b䏄RabWLXsw(!aV+O|,
+!> ѿ4X.Eg#Iuq0pH9cQ4C6Zf%d稒pJ#<_ѕܴD6גKn+S8 tA"R0AH-:6њG>RБ䘆v?V@`;M#V~`?Һ=9G]8+:ȒP+s :xRӅ*hYz& f€@X<m0Ϯ@r9s|qf^ـ EҤΏ<_Ao[zh{gp6۴'ű$FXېB߅
+N HUaGTgw )ZHǧs*m`7\ي! Б8J||jYJmT$ƿ e3UZ9#^TnVaʗCzhQ^] KϽs.:ޣns|/m%V-Oq XoFY8+յ|M"J)OmaRGXdxK_BJ%N@Hu0$.]-ܐߠT)eӆ@=d%/cx;!$Ā6B \EN
+3vS/RXh:>2.ќ \c!؄qm{L e !Noɡ*:N6p7%`lCkF26)  LEFȜʳ*pV1̩SHIMUj᯺AL<>TQ59Zεc6;/6d*iwJhӭ>cM3!4FЕķ4̻jyf>Y,؏ *ڠjRoV[O f9Mf?4!a:Ս\9ϠDC1 !FI< !C۲YFFAnZcǮޯ)~l $%/W
+BHZ :HҸznCɳnrpۿ܁Eұ!H:hbLg6O=aw "2JҌzW9)R13:yb;ʗȲ`(BLU+|Oq2wAj5cxw * P(R[ DVa}A+DzR=C ĺd9n;iEeCh 8
+T$:F ]B 3+(4Hm9HAE0zE C)ejdpʥ{m
+LJ/?VɈsi0.],^B [AO׬˲(oaċ}6lh0+ yHVyC RsMIc|.qK
+e!tU2kEK˳M6P%'L;
+p/Ok|(,> ɌG\kNл}{E:8ZBeW
+P)V ZE$.`FSB@djHnL~R$Y
+Rn0\DV$O%2a;ρ
+mP i-yx0;LHz|+yԵ./˒9۔+F|xSOHiwMjD2\ðe'u)O]&~:7 NPP=?Mx:>K,#7]>s'v¦2$RGW?1rU$q@B"@0YT-)VRch͖=
+I>%V@oъ@1֔0%?&2sSYe!˓g-AV^%EY9ɰKnFo2 KnӚPZ
+knZ#..02ND-KY{>WZj%'~[EGH2iB5<#7h;2UDeiN]71ҵHGPMj wmǗFM#K-ƽxfsXvM ![Y!ejT|ӪP\Ymwj%!FܿJC#cj,k\ὺRx@N$c&P=: Tpj`oFs>`ۡ<{k:ƙB %35;,V"kWpbSew9*bef
+ ݜ`f=y
+wbDov.i[k/J4%
+>k-CB/P_XV RНp0+G!zR&b
+qzLiGF3}$X;;&t[P,90`C.,KW/SjGI*V΀Ew ,䲫X +,%/C;m
+-2/?ﱈ~~|9oޡ@mw(.Η
+9' R<ؑ|˽_g~ QP)UJ۷x`{Ͻ9 $:;!,=_,+Y.SL?I슆k
+n䔓=X<2.ņ)c_c\n sÓbYQm$QFU+qVK`3oSX+
+$Y^",S\ X
+MKƞ1n>qal:jQm-WNYTAZR95(1GU^tVCx.X0 zcLU!ЈlGrh3KZVIF!ꔰwƺ|i
+!-V1f\0=zM{|W+ 90'va\ &oj= /jH xBz^lȊLDيi_zN/ҤT4-KZmPîDߊTqOw+ݽ^@D)}.:vUyA4)$mlud!4VLos7lAмT=$OoHe2is3wa2Lnkh ȱW"P1m"W:ts4Mb<ף1F sřdЖ$%;/Zx ' O8Ֆf8ťy\fC5`c_5T{eD7]i/ۂ@Лx_aeFAf,ɗt.2PwmymDMyd5D٩$] 8d:]Qw=51Cx)O|fW74_]Ch&a ir?i2%sw>=Abws&"
+鈪D*~T^9UNyU.C:p;y-yY>SLE<TxdU|/3R4|%~3?F!$y{6!h*vRӉRΚ HCnA  +'_%k"6~x^_7]ýż=΢gZ
+T=PĘH1b3m7f_ #tv(mR z*WL5rX!0Rnَae}$AƵp'J
+a*%An'40!ƸyMW70DdkU&;e4c20B~bV_gr^HXC`ya
+|0 M3 ?[ #3yM`7B7t`!d60I%Ԛ@P6('Q)tv<>߀+iA;q U;ׂ$ xA$E~s5XW2zhr
+#z}+$ +C˷t]!-?o^t߉ކ} d]^1{
+G+=7Gƒ6A}iw&ӡrwc>@'2aU!f/ ;:a Bފ|;<{:A@ -ul $TU! 2݉ )Riz<{0<v8"oHB!;d"Eac19p;nCYov|"M` EFGjşd!Ix!p㳭. ZN'V<^IݔW-.Uymy^6LS`jipUliW󝎮s9|<M.|rl6$2]Qy +)#]<WZf9C%j%[]!3GȘDjTA 1P:[6\+e'9RYq_ DQQ}W,bhs2Pm)!pd:ʀ4m
+s-ٻjרti;:P[0?Ia> i|pPBYYQJF^b (c=^܈[)n=sv
+) !$LTaT$W\|BElyߪ-V8T[ђgT
+n+hJRN4:[Zc +%; G!!>)?%D6 FY+T?..mL;ug<3]5
+%nQgΪw2b-;3vh!Xi/UEg=_ 
+\(y1b 9_J䬓Ȗlȧ?lŘ=i8/r
+><.vN.N0fTМӫwb҉yp,ᨄ$9؉Ѫɡ.ȡ9wvBCbTۉY833K LʝY[HY1Jp+eDPI{hإlGlmS gi
+_r^Ūaە/hډ0ǀ)c~FP!g6
+ޔ
+㲊Zk€=/j2|30W|1Po$0R, X[E&(r)́L>me3nF% Lk<83xzEw:.%ߠ6G
+P-<txQ4cVIl\[D#jJ(Pi7ފhmBFA &zo_o1
+۔>)5yuT\z]8ė9 mgLa׻k;8g>hb -d‹v>)(3Ow3 ϻEDĉdy5XUbfBZ?;Nَr(0d#`2 Hw$:M@y^1QӣI&k,#b
+(`yM-?L~8 zqꀽ~o,4(z;%GY.9s6]3⣆#΋To阱2};RϼD\Lњ)j0na˯uR]ET -40gMͫ=*
+{RA0.H;&~HOV2 ޜQrn;跒sIJ+Ge5;Sd"uY#
+
+r֛e')СݐlNo
+}W6DVts#-iJ 5Km63h`{x 嫒4(D$TU(yՏsql0rx@{{K%Qyr|ߐ1n9{+VgaBe; ˎS?Mh&N9jm#e3%^oE
+Dtۉf Rm5nj?:%5T+ ]\ιm$Wlciq/#AqxP"Ҫ4 tj *aGǏNI2:|C|@Hva_)F;tv"s6~ M}*"',"k$Sܒ+ Tm|"/9E@hC%5cXo!“Vq%Q+(00Lq?[g/Sq0ce?Q_15}2f#Q"/S<لN 3vVi-6Ǎb$o}*Q,fșh=
+,;y)a<X6.x*\cNEvR:W
+k">!u3d4gR 5W0(JL놩1eCC^ ^g?Mtj:q3 +(s&w8GfeB+Nx)ae0GUqx)1kǯ]rى脕˿ZJ{SXn5^ޯԕKg
+,)ep3:hJe
+ŹWeeb
++ҙHkSz%:E{*=J^hF:&7yJ;P9a4})O2ͅc/ՌGkOv( cL븁 zA'`
+q(/aQ<>[,_2
+ oZJ8F\X7G (}"u ^E2uv`*$gl{ȴhֺu+ տ_*
+km;#fĀoknȀ%$oѳuE0J
+v`QH֝#)J Yy|͒3͏ڮH#9zH|RKJbE 4ƾJcP,"k~װ'f! ݽā%#UBuNï 5s.FΔ [b+Y^ @F &ߚ%`$"(7 iy+bdn?%(,
+ dC
+BKY+# ))G& ϳ*Ч+ S5IҐ}ÇFo*3'WzR>6c0L"3(-%06R 1=~H /h~+ʛY̥u
+B!ʩ{H3~Ac`8A3h۠CWQ`5AINŽ18X1D71&5zy* t}@&17Ț :ܠ1F6Ԙ[1O[Wc@C f>h6ɮdy n(qL M5uC" Jve "ϏBnf"j!X\ ,fV\'% ҂\L҂0
+o\WὈ\Hg2񦢦5[6W! atȠ?t6*M@[<ԪJ3+et
+yY砇OHN)UW\8!cmH:oG6)kgWX$k1$Z*l?*3VJϳB^4dQYǿ`(^W(f\"mXھ)Jb|^c
+|X22ٱ=@A/9
+2WuVo4Q?A= %)˂/v??Hu_ /8@  8|Dh8nj"_al4< Qt"/+Io8SZB)J
+y:#(:i1X>^xs6<p[pLg^ C *߄@PgK9_FkIJK% :7i2?؈OD*8`z2L ߋc1"G
+-HYafP[LIk( X0dŨz߳7$V:IZɩMɸv`,b+௘k7ò:'c< rdyho?'ЋĜMp?0lJYjtA8p,%b6̥lXվ;J@}UfYC5:1+y,^5_Uů6_rD:^n? z75}'\a|9TN_@`$,u^HgCaxAPOv["7;}8: \Gͼ3wΦ饈6d>d'~g
+BzB2.\S炴DiӸiϐ#ƲxW$B&IHd054 !$cxdQQIy]IDW+ 0~
+ zqW $A9낐1mX}Du- +Z'gͧ/C 356pGfHP_+#=@w*3h{a%>5Q䢡=nQoΏ$j*GKݦdƶT3Z*ji x_kGl5țB
+'
+)9&Ua_8@
+Axa/y1BB%rp"1d2:I~nh/TP}]\ 1hdcч;L'N! ShQcSgRYV!vXO<aCʬiW:ncwZn-"busVc){l&IcP
+; endstream endobj 164 0 obj <</Filter[/FlateDecode]/Length 22487>>stream
+HK7O0w LA
+k v"睕Oa`ЃHgcKh\vg*B]v[b%@sFS`  LЅ8qȕM}ApycRʒQsmJ
+sD!N^ڀN*ʌ2'rZIDv* bTߛqgbԨ*&Lx9"LP4\DTN-05d~MyG~%٩F=_AS&06FniTf_ g/{uvR')1I;A \a{[<Tװ&n 2%vvgU/"),9mJ6IIۆ(`Ԡo|0Y,sa|p`WL"!yL?8OR<9;<M2TpV"1M!쓉5lqomيMq%YI
+c-~Y
+Lm{Sd7={O" v0p͹CPo1P(˹.INgϠm`
+KAG Iܾ%`4\cŁԲBȀ,HOҵ۹8˄s7\(dC@ґ[3ρ'<S}A2/wCsܒdxKtv'ʌ͒ {#oh>
+.!pk(@: dj*%}8S * ~b-=۹Y /'U2zMAFM;!BiFZ4w Mcv7rOQo;͗1&^w?)/ ՆmN &ߪpieO׺3~NOY
+$r.X 2:GUTT&yAf nɪ.ޙ@ueP/O
+YN.1g[ :+L>>B(Ed{Ąsx`fv" i0>ػ %Q!ۦS钷MYܘ ,{*5: &Kܤ0fX4= RklJ t>ctYVM iCql4EwEdZ\0z&;C6-h⤿dr=Mȝ]‹\ޡ4/@œt'{cg#
+
+K=qhۤ(m:t%Ӗkv7͔ sN/|x7𢡊F
+%Bԥ)!\x^ٽN@cT*!8L4#bҩ(hȹγeI=P_?+ӫA?:~Ò`ե$O8(;?th~wMۓgdhEĸH V
+CevNs5#~.A0~+
+$Nra>q$4Vf ٥3vdv,vT2vM~VBpC>@ެ ,c0wP>
+߉yRuyzݲ`jM}`C ء}/w$;
+`01T!eBRV@AdBw$5soAǚC8.Eyx1N> "`.I:ܲݶV#M@aOI\ G
+JzvUd k\J~WdO /3q.͗.ri0Es]CsEo8Ⱥ%nj(ѝd կtϨD5Rɓ
+`d"P+sugL.$PE
+!;ꬹawBԦ@>*<}U?5/R* H2@E BTRh
+B\Bm8 ja|1=$4͐%R
+VϷ ^>D5 CazQiJHKក$ ̍;X=A<N9^GڪQ5
++Ӿ*
+l[R*eu;Pk|e"aՄ; M-?c@{*V\y!!$%EWUf`en9R 3%-9J9е*(zLjd/ dt]!t*ərTEO}IH/al9v)BkE&HZߡUDf=BW=R tQ!Y͆B
+j !-{@Id:J ^9vL" !wp14ޅT~T$DÄ0@!Slld*yO2E[؜% ȣnY<VpBYyJd=*(VנGm⬤5;`_qoEIVh&ɨK.;x~k*LDrGMJzh`}|
+94"YA@uLG8l<~o5kƉ{yI+05CRJ[9pd
+,gʎ+q,o#7hh%= Ş#<?OGOp9ECqK2: ѡ@id9DžAb6%m EWcGhl^/(iЕ֥Մ$r~\_HV-~֖F,Sb &^Yģm"DMME|\_Cbdi..]9{N
+x©r|*ʅ=OB
+B
+F1Ý,CUЄ0<YGo SWW*$%xtlqţ%
+ ɢDzgD[ǾS2Bظ"悪%Pι w3X)qWuZFa[eS2<.EVh?:~0*/QBP
+bkAɗ3TAm$w\Ki6$:L?afBH]2 }fK
+>J8XC5O@QQ"O
+ѸԠG5'N05c $=*O!\B̊"@ɼl)mX.y= JBIQ~yg/*OI]_+|?͜`kWWn@]NB$ R)!}9u +9 T (-P;}p#nThy=JѲЧoEc7Kի/ maRMl
+s3W6*\B JE`33ONl46sRY
+41&/iJ5v&&u-I[4Ox YL Ү.pH ` PK0 Vⱸ (^:v|ΛIFU"Nq2ҤNӑfr̹}ztڞ%H֧Sea%=}:k>h 'EEveV<%`&gPD(j!m K0^&q@=00ky[pKX:rX'
+TV^4O̗uYuƻ]a(fkVuȵymAjW * "}A <ޖ[HrV,V[ nW= gsصJA +>;B0NFefd6 P$;YѭWapE ^J[&&$h[HݸL@[Pa|UK9@+Gw7n?1ߝkUqVܤh5 4)Ľ0&4Nɽ5x+)[`WR8sP= e*q 63mx4 S}UPe
+:I.(Y#uo!0_cEbO lcT<5Ne
+] 4,w|l𖬀[pEW̹At|rv^JXp٭DֶS832Ɓ?l
+h}
+@ tܿA"'6Jp
+s8*
+λXUƿ#f~p94J%s7Ue/iT9
+yO pa$ĻUOxU;'X]|R(
+mJ8 ʦ̯w@X\!.u'ixӍrhab*!O~n\B
+mAD$,_.? @e(
+~ V̺A $-X<uwk-UŲ$`3h dP 8w2+q+ۉi G4$U&G@ WBYhf+w ݩ@;AX1zJC~+K,[0^R¢`x^j)D.$IUsP,
+:UL" +J˟pt^6cǡT
+NQ Ru cY 2B.e/B-᱔.P>vʬO[- uãv BPrFu $L7Z;@֗AJFΙgfvZ8&=0XhTIئ(`6v ݀
+qhl{Fx2Fz8Hh;r3Ur:]uK6-cc$wVd; rx6]6puCqS|aпu㕕vۮJ& |7y_'(~1WcUce!y0 $c_I6b'Դ4Xk^tH`s'Ϣ!ˢ ww
+uZЙE #,2C|g8xn*to!2+Ns8PMEfyVc##b-gE֚=x ^typ,Kc`|N\Ew<"n虺 Bfg2;1co1#@,
+w? cFE!`lbS2(З 8Xvulh[]/k :&BY݈( څ9):9Q@'F@bNCLDeAYwW$i= .-5.W)
+
+PCgRt$6熸@
+l\Yr@DYpC=R&Yjg!]fA=6Y
+S"!P(e#&⑙qq/PXڙ6Z d
+]<=Ƴtno)Qh
+._\[#Q.E/&  /ta([EKpkC+m$b$O#Jy?j_?ޒH;=!%9I..|Ɋå(ߍ^dnaH d\ I&/wv]B!
+A|?%Id]?"%Qȧ+kw\jA\OWlB<^M*Έ鿂z*%4 %\I9WvbBFҋ^<;T4d(]9\lچ2Jg1?KHE3 ەv)S62"?V%Sz
++ E&hA'-J/S_JqŠ/*(yϝ~
+S*Œw20
+ˡ]6> @
+'Qp@q{h^
+6 Cf)ԯ : Kmr2,?>[?lF!j⼹ [}ފ76dSmst)aLH7KPpM?φOVl
+U3nw 4`WO&S+C $r5
+B@g^6(!px8y@?qXSH0>RADcW[ܴ Χ\$*04.EC JnS4\0گM/k<`
+zuxY~:(MJ2Q"Ώҏ;S@48"٥$P?0s8>5q~Cģ`nK:@L6A0C3
+[#c_W 1[< wPa0 @G,9 qpp5|Ӱ6wnl]*@Y
+M߻gA%'}xFfkP*K.avaW]J7e6db4DK=4еR#}DR0ќ-p@
+fG?IzdVPx)sŰ,s7E8# /)pqjQGk:ְ[I|,Fdu2"s,
+WAcK 6!) Wb>2A0Sӳ8γd1)S.7OS6-ҴQd#6Dm# +A[pk2INNA'iArQuS96)x&ړҍP'bWd䤪2q8AAJPx+lkyC]24`OĒe܄
+l1~R;+X
+l&L0VB'^$DF6z=
+ҵq
+To=ҋ
+!ڃH<k֝IMԵ{W'^q90Y]39@ېn~42PHƕXCHJ#y[m<$ 4Q1V#(6ڐMNߌMsN*e Q fi7A9ci "z$mi42fASg2vIU}~k8J똵?@.L0S3[H+AD9]]gլ+ mGlCFX=0\-iO/oժ\ܐy6̕ʼn~yaBNH?Zwњv
+ cz
+B$`Ӆ#ĥĞ˰̤9䉁se0r$@Ob>12pY;0|G6ؗ<KguP4LoZUIerXY rLHET>n˹g~j#CN*8 CcJPxʡRafX] E7b$
+_;nT!hc AҠr LDE
+B*-nq?x8QDT{cq/Ro {ο2|0YL@b{<'K
+eS4|5\+D]>ݓʄdȉ_Ee3de/`#d+XHGN:陟bLI
+[QbqjZ(4˾%9Y< vQ1H򹬬t;DUQ9SaY"8ku\,TJsb\X
+c].<Y4sU'ľ@TCPtNHY!XֈNq
+m_^@h)FYHg3WQ(Lg
+?@!~N/Q,^)%l?'#{9UqAijBr[!N)9€z0$96J`潮cxTɫug <0B:zb!ο9g/ ?尓,w?*A395O'&* : b{*ֿ!/-+-cC#42Y[7FC1WSp ]|/-} (MirQr zdq)9x_%,D ;c@PɔG
+"M!~ա@VKjݻq]Ղ9*})ӑ44F@ ǴZlܺ׺WbS̳8ީ^Ůٍ"`!Y&J8* nTO1mwt
+k\oFUF9U7Q@frV} eam2gqiPp׼s۠
+["Qj!Rp$ʷN!$nlNEJ)O
+E0S.= *u|9[
+PIL0j]")v\^Аd9k* #c
+qP= ޒɐfi9]VUQ I1v-I,6—T:>LT
+b`Os:gm86S- ]($~iIij^G U&8qaApl<OoOϧ82͸do>9
+rv(U =y@(Sdkg+7flqP
+\g}XH06›vZvcq1VdԵKId؎3&>WH}n?+y|;@a810Y ædYaUЃ&}z_{#>-t滕;-cLඦ@͔8)Hpg9d6f QA-A#h g!lKkD31 $ MC2}iD
+-s">1%^dY q:ienlۄ%pD^a+8[NկW\͍pi^=6k: Ⱦj=K!+ޱKl4U39~T>sΌ+L\69H-O6իbv犤0"HN%5~<a #dﺿ\=] $EKy|_B;X u}#{"LO 7=YR6ӢѠ~5 Fy,8WEz˗gJr>,tO귁wݱb^)1+M0k8z%gERb O7cAY8qݯAd2xUx=*LqR=$hH6b#C6Ln·FŸ}>_+%z%NY㞮JoMW&`i,{ҊAZWa2|EJq7 $٨M"Ȅ
+.1X82卫<{g8a{]QHuY#HmjǮag#41Y)FyUxBeCRdG&>Tb
+Q(<1)ʢ2 <i듹@i,V6qWAz' ~ E)8ŝ<خܕc^uej‰Sw Xj͈g a![}$quN9 صE/hB(Jn.k-5 Y :?VWA
+{N)wLРi+ɚ)4a=A>/@ n}[THթ"(x+h"D#$Y0$vAlJw6Vь?HW~F~x vMSE@cU 7!8pxT"^Pt99[C)pn؛RJ쎔* AH
+,ㅞ6F"mD}oTcSX"׵哨)%0CTIMchUIh<ZY#L%]IDq =A0zԄ#x1R$Xe 2'bɬ,D =` hpx&5!4W?h L+27f,rt+\Bm) "-0,ؿ#?$iq@em~=.~hu
+~wP2ZMEoJ`YRqn<
+F+g
+T#-87<q4
+zϟpV~
+2͡yDf05
+A` yL&Zr~!Tr+7VF6qv'jPm7[kqh{GsoyKŭ59ˢiH#@5d xїCpԋSqjeqV6cʲ'7}U:3g)ֱr
+dfg q ԊVfr[FMsKf2J@禛[ DBXT.mcY^(JL^ R،j%K0FJBPANL$KN]!@Nl|L^;"5 .ƫ; I目T]dC|0ejDI_H`քhMp\33N88骷3ܛ,O56Gb,0IvF@om^g~S4@n)i8E6Z.o KuV^2s@AP\'%5P-ˉڰiԫ^E֡T'*z(vc
+8w(yL8>Gb
+踥a ]~btk}eqA$7MԶV^@ Bj6 v/*V/}u7Z]*YIJ(l[gbz9+{&rzM _;;NL,Nݫ%L=0|),?1rKQ!D5I&q:{.Y?`q>]i(8 1l;9LD, ~T `0;@w_C<I!z-͟f@K=^T!u2L*"O܏ˆ 6b^KgŻg8
+68sR<bJH[U[qa޿Cc3⼐.YV{*
+]qg уGe>ySPgqrQu Ax|OnvB*F9 5(b=HߞRdž qWQ9!;N .~x7X+u!sJ.fvư ^|*Aww1`?[]XLlAG
+5cc^ 6 D8a*X~{Vցp}@&sͬpn m<+oYTw!*Lܭxu@t+o4vYiNTۯ[׈¾b}|s6ðp89,>,Gmx ^E{06jqZ~|GGKly@A?7VU`T'z1cNEeuK0q"!׶,2N%ȴ4yc`+|(<<V^GRh
+%HU\mAyW
+ΖQc `$>\њjÑP <\|0omtQmiب"8Go$TL
+~Id,9`*tw-H".fW2nacZ.؁1,q[IEa)-z,Ʉ[)0D S)eHBH'%'n6%KMi!o&6@bMl:3+EoL+8e0l8iy
+HKr\DW=p(cM ExDN]f7:L;
+rӞo)}CF:ZEMSsTm4[?.Hhͭ}Y=EģZqqlFίޝCDͧ쪚&3
+ݦq=c>M5bU1nj/}ӽMdDwotA gK{c#wBI
+g#$4PIbWSok5)(}!NVN"8CZrء)S?cz}ЕA3wA>ކҘJ-1ΦwfgXBnP:IݍS,׈@<Tq K:*>\4O_ˠ"8k]kd2̺:GWS}ERAb
+!FbWns]/ydrXT1^໥zxf6ފonLH@('JuAbP9ff NIX_
+Rzlɘ2B|A&SgP+C!SVE׾TiZIjSl7×>!*62&H)_s?$S4M6Fni-ۻs"w4p̙ݭɆX GM:gѠa1/]$+9ƚ՘PDMEPqC
+q*N;]@OEAb]
+8C)=@n|՜EWY$Wgt˅ i\U+zyIhw[F2LW
+?\WxKBLe*V,H4:9%Gnr⺅l_v!K2iRwC4ӡ
+:)έaIR51χ C"\IL!.HG(_I\GKQ N4tԭ_y-S /"Uf_^y }RT>* u~fhvHI^fDKLۂ
+c^X^i3yt* =b V=J /h3DyAX^Ć&JΎ'*A&JawIj=>xЂ%xEV3jqCbwJ8 wr eg cN&\Qa/|8Sw19"<Qc hا]aMOSAĉS$`&>΂ *qsq5+C~6-@6\f@T^=! R(W)as5dJi%޺S)OU K4 Gr#&ZHO'8
+,h|')遤4bF!r=.%Ouy"0jtInoۗ>vw*c_"dkzp]]R)& 3 ZQ\%
+8ˆtY S DpٙB||)HD$U羑χFr"V:D0$ȅ|ߑX6K)%:C@$qj+b>c,CsubJdn{W:"<ZLo*;gS J6ZJ01 Mj\%oВփ0$:8drکR/ /$5/U=f6%1 ,$'L:8
+!7f49sƏ@/slklH6 gH\WJ-:Wۑ'Hxdtr :]A?@8/EdD/ W3]V3b&yRe'Ҥˁś8P4 )sT:f_d5*{{
+>Dߚ_|Z|$/覞CW,0ش ĝ9걉AD)Ҟ{G TK`C@؍!`>}",)MVUj:l gNPU X`{&k (>IxR75$s5MMI3D \p O%u\}Cz{ tr;J%:hS@A*' <FmWLTa^_٨i@ BPDØx
+FQ^)bCc
+s( LֵՅηJ"t91L)a» @m!s`?ą*^\㩑,ͬ1 bJ سgD>إˇ*!5hGTDt:ISxr} ѩTR:Dƙ5^AnYv6{XdP]6& >i\
+ͼaI!HGl"()zC"ɫ@֧KRw뼮qB@+9AU Z"NEP&m7:R/cʘˆ-X(/8@w bn-um?@2T7}5FF
+l>2Q2J%տAg*WSީqh ՈsB;*|°^3BZ~@Kkq4 C"=<69HXF-!JrZz UB$㍧ܝ}ӭ Y@ZKhd*.
+Q<wIe9gp,BUbLBBI
+
+x-AI+/}NE3e9<fWl{Ŷ'sp7*Ͱ |eoҟD9Q+uלc S6A#-b@A /q)NEd8qw<q<X頵B"ÖAƝ UM W,Xͅg<2  boERZmEJLgO(sYolmv,kIX CNE!m`sJGQW%i*K)XKz)6K~OAC|fkw(ˇ{|ƄIv^p+F ԏk3a\EH1K9ΰu{cd[#
+ؿ!q6M(ZQ)oMp1.Zp{旲0+ ՚KHsW+
+ݚ(C恠Lp}UV(ͺsʿq^n3{Ֆ`,\@k>4֚d-j/ %] *u;3e֥C@cqYs䛖^a_nQ$rN<&ь>!lGWKzVCL1U7s&o41!M ɏ-3 헚A.EK;bLy)()Ji5&ձ cԧ{1?rpKxb%;^#k,5T<3]"M{jNbqv;(C[3@[a` 3|t&m8_Wf(}AEpd,=Õ<gӅo
+@BzR~As 1*PfpKyClQ:5/+I("a q7jN%ؽIto5< ppU = ͼQk
+4!z*f)Cg"uD(qXIlc(:> +N*Z
+M0-{uFpV0yJl)p
+XK A…#9'!O,$G8 E$ńî2ЂiS繼^d۰ɨHџDB{Rvf6Jl,Sz`<G0]nb|ea |A'}J/= ưIP nG?N,
+VZ_S@^P@Z UMѫEq,cjG";l2T< 6C5fb<.x7
+Ia@$*\i$tX*W[h[~ mE~04]_1ϱSF̯`Yj9L\L&B+WP%U dTǷ_t^np;g"BgsxT;?hҷdBe4I GQȪve`W`>%d{+b ZZJF٪_nMi3ǯ5
+@9 =6*$D#b }#pT;"%bB~BylP_~}3j0
+{4<`QA>1űz]%Be{e:ܪVťߺ1k&i n`̈EF(ncuEQhzBߚ%RZ;v=dSD3P_.h/ы1/_N*O:ݽ;Lk Gh9n UO<(HN6_j. >DjsrOvuE@e4{ϾسFbSXs1NʈݛlFgJ@%YĄh
+%}slƹv?]~X.ACBhvfnI
+8e긦$"`MnSw:;0i,`~7=_1~[тp 1FOKT"_\ӍRDT[?c\VBdDFbT`<0?ݠܘz'pn}H:+ENȞ5sGNQwI}q_oF :QIj!XT'z={"0}1>mOeI;C
+Y.A
+q#gz <1b\oY=+,ӛ40&.V#D)6ĺLSe%Naa"ͤɓ
+)vȿ!J'J{:(XNɅq5 p+.XeR3 PPZJ?kX5 gd1Ң]B$$ %1dZRsXHՂ,A:5`!+*$g+)dzAx-b\6}ܔJe O"\䇮]QIaCA߅R >y-nx.wnA9cEBo
+ayrnj#JX1a78?f*qG't(+ 9dJ(u
+k}I,!Eƛʸ;`*A
+$'
+k![_D'*y9g,~,ht]H tAKoE?>M*JD)𩅊)
+~ M5 0 `y(D 938|IdS
+X>c1nOi*!nUp(nJPq.DKJDYnt|nV+et*J$3Sw9w ^2풪m'y>biO}9:V6^ТD7;I}RE "?YEмEOP0 ͸&YEQOwBE%4G:8Q9nGO;0V@S>Ht{]#y
+k>Q“C &  c.)=ekMSIwâ@r3
+-),N;>/c1L͉’_i^ťSQBUL]Ch?5AUJ`
+KAGHciJb#Ĩ6徴lro/o`$/
+lkHlVҁQc`,Tmq Űe v0nE`JTS,ke.
+:@)Py Cs-9|PeB
+g?2- 4#LM u>1ya NB+4l=e~%t8ZXV]68BVM):#cv!n%Vz٤.f,w1((eS&(1_y2"!
+k%cnv*e P/B[vE됎!#K$<q8?:Yδdx#PjG!7 qW3{6)@ނ8>R.S$IP܁`>ȧu[op)h+K链0q<t&'C~@U蔤50Ro%J¥NK+ s %_QΩ[)>Ջ_J臧0!~4W4}K-!@-rmtn"/>Mԟ̘|,1:3˓9.ϖQrxS<}?Q^El30"~"صA/!G
+kF9iK`ݫ&7HDIGECM:|\GvGF"v!4@+ɫ3J'lkr83~O'K@'ˎ^,(O<`8XLG.1 Ƒ*J
+uTr@E&^-1/>o_c*?T|ŸZrPTd8.!>.aߙR$Ƭ'1M{W{<2Jz*{þc۳]`]ϕ#>030$[Iذj~F$B
+G+shj
+md07!CwǸ."U0h<4dPrroB]:/<ac)1K.M D#s~M\Qq~]J|F%d>tS)hFGPYT-2e>CO5x#|_gN
+w3b+FL{FAd{N+dmuruWNI &ϲ3}`L]2|*n<pm?/(CG|utd 6Y_W>ST:HP WOR vNK᭣<JlegɢOS;ܲ[J4)Ǟ &̏Q d ,O8"]\"%=
+NeSu,¾+
+??8zVfBpNs*!E)GJH\:)fmJ SJ
+x9JmBzj$QÂl:`yH{Ls[5p+"f|
+yyü?n1 [M}a2 6(abi<B}H;aTӗl.޶DיڪO+ iȽsNmsGU*eƲ9$pecBA`YggpHo
+-s<,Nx\ rALBLC^
++O?o&21+g|UgA)QE@,P97Ձt <sʗfQhD6q%X1NcZaYv'JWV< 7C'+2D8*K`PĈi0|ԵR; )J`Άcy!c:'֎@%!X{Mce^@@
+U,umH q&Q$Nia
+j7{DuMZ
++<
+9rAB`%ΈA j|HgkGYᶦay
+d#cd2, 8Ŭ%hՃAÈυ
+ O d7Ĉ7
+T'}@|
+ʒ?Dޣ=4kY&r& i>CLo~m;+m1༙#KN, 6\0iH=sE
+̀m\WIbQʔV{<JKpRs c 4%$c8zbWղ"+ ]@ď(DEL2Z!`b\ l#N쾟u.Fz8}ρ&mQdߐO8!Da~3
+CO;.1KDs $K{t–hOI9쇽nj\T4>xc&o_C ȏ<;d.1 %l&iB'ƽA^wzX/_G l\U3j5+WF.l$&E_=AzcD0g˻Q,-y1Sє`VHue*ki^͑-9gwZ}WHL!χxeO?6*L4آa>T".!%t?/Y=JlJS&jތЭ|>
+G|5 l?Q5xNh"Ys_-gOl%5bO؛'~_?ЩcGx_*0u|~Q7H[b.%쇠u 1?|*u, ?qY"-+Ԇ͉,#@a!g ]guh?'\b Ŋ?E_y_Չ[@%<uFS;YDfU8#;M*p'*cռC#-Yo<oŌJ-ѳ̯T4O n)M^DT #eZʷ̶oJ_){~ A3[.Y$:-olm]wo(;\Z= \jJ;!n"=k|r /l#v^}$AQfYzݔ%ǔF3msr<52bXtև]bј#F/b,'Qp)ǟ
+$/Ey]eԔɓ N3kg:ApI:t(OfMEp S1TX`NReW[`@˫Ǒ?ƴutZ(/f)>B7)oJ)tYr$! Do
+'{(G %]5ϒ* $M `h>55C'!|7$'#SP }AaW kGM+52Hl~ fp&D LBC7QhDZIm)XpPQef|vH|Q3QDDT3e΂V!y8Q10PzNj(G.B5?Gw*wScFP$)_W` 1^G Y]ޗɫ$%ӆLOztdqbLT;l99 :!]BҐAcΓDIv
+
+N!%<G؊G2pky{xdr>%uq8K(,
+t0k4gv|ю&A6
+|[}>Wy0fR&p`
+E
+Gؖz" Z=[g2V`tPI$VRڀFNjahLa砖L7͡t9e[O竦(&5d.n`5:O ţ(B ӸOJkCOfEZ [~WqW:$o_O
+Ht]W=xאDGϙ 0O_i#LbE,{G3^2C\WWo6mh>nL髯h77]n=|#41{m.3Xi Q[IMMd0 1F ]B+|~{YFLĢ StU+֗Ou }%
+d)G 7-ti'B J1!LhmVڗqޡPpAz<ZXrZׅcS,!<KHp{T(CzF6܅7"!Ô7M9Rh9w00뮂IkTa6*ҩu]!e:@6nkΉ5Ǵ1iѸF$.pخHJ}UMXBZ,Ѡ\
+i"RljzUi-s{̤UC7H3WCM;Ԣ%̏?O=O> S*6=zכG{ HClV6BYVuqHoPٵ*gP a#[dFIzjnEWL$Wy :ָMje UI+R,|(1 B@P}=k#HESV~O"{~
+11i@bp|$""EFh{qN鈀"
+Qt8,rzP6v#iRF#WNT2H!׳(1/t1̡$.J=-ӡ T'TUI 2Gssd*rœ3"GƁp9FPۙAPPҝbȔ<"1{*-I]9tQh\հ:1%G BȨ7Mcg4(P4<zA!s!tBA Uv
+vZ9L3BNrN<\4 *uh"բ4$:GuqfǛe(@xf-GG]Yakb*Z*c>
+]׵嗷 Gɸc:1%䣞4K_煬ZܑJ0,aT]k=F[%
+S/. !B"2 W1E:4()0GpdK$ _hyW>`X10ding
+zu
+bg{ 8v,EgV OlexO
+ʘk }Y., 
+}r ev$]#=&󜝄`-{xTP,\Y~
+3kl]7HhGNYB:G(%Of9u?_d<Rж
+6=7,/|$ CJ<>1ŹХW BMsJ<Og ܡ{9W12?mK(BZ47,r~BEJ_>o"HȢx^tE'wG " 9j[n^&Ut*L&]0z`hYr&5 X JZ{pZp+3o̭H-Xy-q UBo=Q=mf
+UaVKIn\IDO;DúEbS*\ FPB1Ɔr ciCBTyŚA?,7rbb]ȝϻXF*%&<.$A17B1 s*q)( >=ҺQBx,m 鬁Lʱ&=aRAZF1]D"RGO<8
+,_BѶ3_& '~Qhreh\Ddg2]CSwE%Y| uNlIۯ:ëq_fj¡4g |Ex+È?eM@ p+;"Y5qqzC
+4Q o݃JP2^A(}B8zLt$QTdWɼL¾@_cj0[Z յWlsb.~y~܂qk+C{0~!v]G$u tKm AD ٘;[eW!sͽC-ő"*֡v׫t~4JF7◐ Ѯ&LGMld| WYxwh:TI-n:?V:Pl˅GqFkg2e8aNbx(<CYYbY\Z<@9?>]HT,fW$w4x %^(-dK>&ϑ`hQ41+-REID0<w:D Yxe1XTBq7 ຄMZi@l;G,U5#<|-i\* %χ'gmVmtN.oVz
+180԰x!5Q%(!bb8C,Z"Ha!% eHrZKfvgل# 6oIx;>f (-7E#PIRYfLP1gv R$GbSfh[_?em~t8"
+h} u "
+-,ۂ..[b(4ު_"|,'_Ʒnmyx#薁ă|,gA-DE{H?-M3Y;<'m5]SCg ZʰqA PBi
+%-7=A1ïF&4FHĽBnd9Z'7,
+Y@ bKx6Eu\b7\ˇ3qӿ/c`GY<K /Ap:*g þ^'ד\?N~<'=
+pvr6Y2 =kHȋ"+e8o Mȯ~?$@9YpV FA!‹<cI, K<5[ ,YI#Au7rb#y"&><<SHzYS }J3fEһH&<@AA[%,(4% } p6Ktb܏ ,QdIxr4{N 邀/Q} N %ݧ{-2҇ĺ,$=iuH,s{jD/5n4LʨT9)<ՊdxB'
+0aH\5s gA P9}?(`U7!\MEa2CqA_LǃTTgnnA0-{+bş\]B
+7˪΁`zJ7GPq\˚HqFX]fWjy_\'N; [M&ӳK7oMLscLญ(z݁'``J ky[8+[dnTX
+m,
+zc:;L2gA
+=وW,K?v|'יco v[b{sUBV+|!oǁnI CtP(W!x3\:-4Gby 0 0?jY$ɸ@@('W8I GZ(4*#IvHElc^4=ّ҇)ې
+9xos~(GO3|GlH?6Sc)_WQN|q0IF|C2Ϙڽ~, 0Cp.k@#l U~ i1@=bV=~aiB*QXU-b|_"awp * |G*߼Ҳ>L|_QGg`Impu.YE>+H>d Z:^8PXTTf Y2^ 6 H-YFkLcKҤӽ:[mUڷJ˸!#ƒʶdYxW;F|EĸriU샤)a Ź nݏZ8V"BSV[^eڷ`>iWU LM{u0[׸xԪao>М=Ǎ[45
+c~rڌ̠8FُR+1vPnk,8" JtP|aX=&صtX٠4x}wilpy.9  ~% slIRzjb@‹XJ.(~ 1A@K`SC؟[p4q'i)Ml/Ncg&WYPOЂUŬAq]Crsv3\!IZ7Ɵض
+_+r@k Gr Za79jƫ-Up#,ZÅ(gGBh7nЁYvz
+*۹M}+ʲlV;Rv~aHv۫'Z$IxK@)N&1#
+Fx2
+l}%qhuxUG"ALͳE|x\z<" 4~ŔGĕ^CP~+u`XᤝIGR/ pqհ&
+CD~̈́@c=c0 JJԢ1(iR"t5OF7Ba!x'|6Nl,dKKkLN}XFM;ڰҙqU2UXf
+O`VcFХuÉ q[UN= TV{ȘY  'w N@\ %zh_
+M]H3̉*A{Di#ZH8v b\xS_#\_ e4|B//_ᛸg?;kz1HRUS Hʯ,9p`]8>w3QIWԐ j* aFДh"JS Tiv\Z8Vcj1_yxw&=G0@?%uQBJ?x\"^aRxؔInWvéiAD& ,ZaVR?ԔoAPLvc
+B(d`|!# ?KHM0M+$g vAv OHg"$!%M >(:T}Ca)k4)2Rt~"+ƆWkI!J#\ɇSn*J@2n KD/=a aLk Y.z!֜Vyy"w2/#!EOP%Z@)G8o&w|MEz`VLvϨC[){0? h,r
+ )ro,;!~[[F䈳Py0JeV
+q O .59SA7'DA}utзwP
+r6iY Ĉ֮NcbhYfI łpi6;$0W6dkړ\0 /9Jq6'{vځK-_}Pc]vJ 40Vnq'6šE{pW&HDOdg9?6u^ViZ2l*8(&7Kok9M!,!Sr#a*Ff8[vFQؐYR!emRut ~`ڴ+K  "#zBaFKn]:=H}㘚TMxqa X !")3Y71h(zI9K2mC%: nsPfVȔ|
+#VWnɑÅ/P<)3eRYr,mCP38Wk!Sq3Vxd ȽZ2=$c::g:ɻL7;*YyOm$ d<bǖ*
+v
+IIKY mټN)$Uz59ut4jd#QZ1 "3AZMEn+Q1oOB\JGͬ\y }iބdbQi!3Y]XByyR7H |a c cP܁-ʸ!}DӍ/[OL,*俣p%p2+*Oa`K"j* l|a;"UL!ݝ]VLsO ވӃ|La˜CJp 8ńĩ&mZD]5_V6&oGC*B/aP브?{ZTui
+:PsAT1M u L@5PΐtBi3@8stG|v*O>dr{4CؐwRᡸ=_46h FZ0Iq&C?MY?xztu,!m
+yt3-v=LA 6S4fe">-eQ1vX< ]&0
+uJfhoe<8d /
+P"` $J΀'|m#pZc,<$CR=CdXF}3-kCᡴZsBQfK%KՌ+&O$ ݎjqY}O|rIIΚ-Dnj$2SE
+ԓpj9q8ds\ҩ0LkCfRZA Dn3q0I[ia@6(BWZ!OE~tO_fʱz YɘN0iemsX^s-ܪj4HE:7Ԍlj8AIr tiw!)H vc7ĞP+Z7}?_AsRH]ʢR~ +siNGz)$z @5ZqìKPL:I9
+;~X =΅OI w#$wpI;K4FwJl|3>FKY9\}x'3p ӈ9f
+]C۸4=Nmsv.Zx}܋^;H8r
+z/Woh~Db(a |X{}(yϣEsXǰh9Ĉ9B'8T!Bt[|a/4p/Em{IGSqx&s-(O%mvULbxy& lDDgq,ȏ-0pu^+N%m
+<hx,CA$--
+WދO.2o1h9h׮e(C5QČ0q4Q27S2*LՋu{Z]'ƞ5,cUWX ;n A ^mM]!U^X7k^"GqXiƏmo=^xlI0~blgPB㞘e2'}lQGud*0-E'>=y*+br$M?)^5{qR}N5hEuϢ
+?6)oZ/:3{;8\Z</
+ߊ~*Z;yQ]ǗT?
+5~8GfqJgĻݛl[
+Ex퉁`DlP;J*8wx7E 1cxƮCq#| D\Rb݈y4WV mi(""GÀnM% LT4=[ lĬAM1S=vh
+A@uz
+k팲xݹDxhq°0(Ai8YKi]< 3:v9 c&]%qY {J[g:_$%VijO;fލlt9EK쭯Ct u"]ײFRyF'y+
+gC׸ک/)
+i$ؘo՘v'8fR~ >MCw=eǑFd
+уP jFMjcڽ+[s2GX #S}iE4RDޟ3"Lj,L{Lbktʩ{7YaY ^ nGYʤlL!obsyx)pf7 QNn=^h ,yfL)EWc{+
+)چ[!ɐr`D/(".ǯ J"{@w1p-tٯr=6lHCf
+ N .W=:C  WD!%˟q؀.s[Zˉ=+2<C00[ՠbP81އ)4M4
+.]`=TO /XFp Gro94eRRͅF[s1i6#̨:Y+.3x[dq+uw(|%@d+,3n_U cfAi>zo?~-4 K* t
+5*!L*rsPCaYcQ+/!_Xfwat a!k6P[P0@'d+ "H RIcQ)c\RK\{Zq.AgiPby_tRN8JɦA:S%5~rA8@v c"
+ :2kU&7&tөlJjr76!_j1 >(5G 04SRkYIG8L1DeK=4Ł L]WJS ס263!iԷ]* tiuHc5
+QUu1\oO hQ=vn5/(kCJpT d"|rz^G& CO*$AԔS$٭
+G#kJ?A鄴R<}
+>Wel1ƧA,GVAE&5] Fi te„+n<+S
+ w w*ELB:/6xBsi϶']э;dU12]98&BN-
+nY3%q%[AURUlA\Q0z>5 AEŷ))-#GƋF ǥ'$>.(:w_g(Z!n/PCP:H<!pTBYv$Dc3VU+4˄1B7PJKf| +ZJz훺%F4Jӷ- `[
+*>D v1_o6̅#ltT58>H#v*@h^QYOo^!M]{asF+ i\nU@#V}$O&(f􌿧rL 2/5@c6~Q=_{@D%{ t+sB/@ɲFRU1Х<Uڰ Dg L5Ю#04rR W,q\)=Qb< cб_ixĢ:7q(6|+C of_ƶWj=A.vœZ= atTAmB Ѻx0XS
+TpR夳f2?e*IfJ-ne l<S.C2{Z6@4)l?Z 6dkܬhiauv$1Is
+׹yB,cڏle[:ZSOnkZnLʲKjdf!R\5RnB(i( a,id@6X;wcƌ@1& `1$$[*Q*b.E
+< 5J!M[)#@(s~'xIk*s[95b-Ob~mW0w}Ͷ0-Ͷ `eA%SgG!;-r,BuFX 'kN^YmF(G;A,f9h{:Q+D.α?l<=y"`Aaa5]6^ԂۧS3l _fKS8d$re|
+:Q$+}ȫ"*8XO
+ML^atV1؟˒@HR/nT[,!|^gsOt=HLv@:9o:(b_f$h=7A[`pt~ G5bvfέXas|*ڠD&EL? NJ0b%
+'km"lȝ8!(z. X毇%p-6 "v&6+B2InÈ r vyٌ(
+ CѽB$EbbT z+j!|\:0g?|燿cY Bo "V
+N&p!OZ^uyB=džT`~0XG<?P7hzyN{xJ@[beB&y
+N՚1ULoc.,0~q]0=RZvj|hW5pF70^2v7&M Y=}8%ϱD>g8ovǑ&hKчuvS" &HW7̞8ujk'~u&RNe
+e7C33GwyT:f9?VpPJ{B4#"
+$Ľ8L=ńcEi0@ 1|~?L/Q}-yjW"W9R<#_SPI'j`Q!тGVdxVY)?wx[5 ,sCb-RYӖ3& ;o *s=%2Sbd%pg|.H*opSSo?Kua#0V1 S Y<U.Fxş)e;4حmIJW9ɅtRTp>f7ƴFxRH8_Ѵa*Q.?OZ)aȭ낃H%( Vx)b'`$@ë($%>:!a92C-1OOO{D@#6\Ϧ mo3J)}BYx((a2N2cxr~! L*D}SJ)NJ@bt$?P=ynш!X(+bu<>`q)RP;
+C&8l9B$W-,X
+x  %S2>3ۊp!}37&T'JXt&8?ҫk`")be \:H{+Ր/ z0*O!ōN4_ MIt3э2> Tva%ч^?,>3NM>IɴO%ٝq:*.<9z0]|D Vr|@ȩz@ScFkHuo 3/(6f)`vP^I_D.t< Sf
+bed!To.+< })ZKhU9:9``a.
+`p/Q
+cKQ2"FX5;6DҴ 4Ff~16)(bџ>[5d4P=pJŽ'l~r#^Rw@3i_a:Ic(.U~kŪk&. DOۊҀdAaꆭV%JRqeȓ145l`3AE2qhnkrSAr\B`KrpLG3GK.Y vV"[7 D1GWFkYk%(M/m>踴9^*?z?\6uk?r$*RKnq( +(yLĚ!?HfWgP#͹뱾(F+DşlAڐ}m#6/RS5@1/騋5ʈT.\zƍO K ֆە nG. >5W葹(2]OǾu)ⱎ!1K H۵ďtg"Ax0%a ŰϪJTY=qV4Q"V *xE"a^
+(1jNQ:]m)P@ fDZx'[基JG2ʆߘxcuφ0 aj(ůu&q ƴ!ɿMo,yA޴mċ ף:sh @ 3$~t1~C=i DZ?ܻLaƫv*=&ƪ.ӘW*@MQ"Y2N9oH"hqZ
+֭WY"YADeRѻ&)BZ?|h)IS./$Xf)^[g6yp[58_xu$<N
+x&lݶlP ʰ-Fs@!T<]x?aKcʕF!sh|
+ X0?jzFROԥ%̏@No1[~¦hHP!6&Sfp1_YT'_vL.2s<5$]pxgLp Z *2H8/7NfѰ Z>!7,XM\T!ԏi`<^B/,3`۬e/) "ѱz[ YevRjr.O'e4Č}y\_^~ Kg\À438M한Bc
+2aȍnd܄=m
+! A( ic%wG/p(
+Q+T0P`ރW/{%~JWt! / 4:>* P[o煇B\f FLÆX!nr۷{E# ZwZLmώvgzɠ!"BqTepNG$T*"ϼ1[sgX5+ύaո=.U[3|/͂bfI
+ Jb }! @dg1veQ ~|ӡF[|
+lwL{?\ReQ^|_9cSQcrLXdH P90~+˚p| 1QB(9+Ҝ~yHuC&Tl(O';fBܵƢRì+Y @_<%%A9%
+A>Vb*O+ (2"{Q >1MZmf'u;-0@^K7^J>;{Ȣ!*y 
+Zg|-n+%rS2
+Rf[Zq7M1I{~맴]L1N- kn&ϷAgP+4>"ӕ>\~L?i֗1|:.- urMڷY#k_0ra ,ֆ`) GO?}n
+ZQv"X9نzYNL2BX^!|JhJ;nXha'8U! 0
+HMc7Ow
+ [@aSǐԡq
+  Xu(u ڬO1B4~ls感nmPM$DҰolDCg(.uN TcF ]ͥQA6R9*;(%;qjF"?=OF
+<`}S@t{{
+K<Kס|-QlIAl2Ҍ~18zݢ
+S|Xn [2 ݢdрz$ㆿ}one9_' QHfĿB榤z/S߲mh ehw
+B䰏GłP9TgiIⓘY99.;t5q:)T5:jGZ(ϱ/}@ w=SG$: ?Г.W?*>)٣%0D
+9oo%@ǚDBPz e*bT<ӜuMy
+;n' ?wTFBY$pZI3wnjJ‹}Qեfr6]El53#r25voՏS&]+rjދᨇʵVwJce$d0b}D8 Oe7;M=P;6sM5j?-1eD^ǀx*y}ǘ!Y~p[׻^0=W[@xCֳ8jFna~բ8IHqң)v, J3Rzqw~]:Bi,?3s='Wб8
+Fb/0o:@ASVKG5A xg-p}Yo+N޴ 8U e+1Iƽ 0Q0k3>'_@fSke6NT'QDYţtFND
+:I<<Fi-)!fT!ޤc
+ Vw)˧
+ְ1^HV]AmSQ4
+:M_UWgP@-C݀ f7>/+7!?%fS$H uN;31AbnXr^V<]%h3#l oB8(Cc Q}|gvEC_)'*qDBgoL"2`ŖaK , }og}wl,\5k5i0*z!'BtLrk\K&qK2wt2rP LLzo;_ߝS04Bm$c`)yޔԣ4m큿pP 5lD8M/UȳX߷odj;jƁrk T%9YUy+Ip/r'ܧtķ)~C{.L[?& q*чhԱ$Yr\Yܷ$kU?%a!3L:p 4q?<vR=?Ø-3h.!q3H?ݴvmV,6i$'P8/}CSA=8c2ߦ nvVVfi.K;O%}֢^0^u2vam0nd!(^}5+4 ,˜Ԅ}] & gHYH\
+uB{ש#j]0xcD丯iHrs8"qe;&~z:PΗ@myi .\!alHT~?m40-i{1۩q\)l
+ 9B]dN`K$v XhA=>'6 z7.!SWӇ;O XbS5h7W+77Dd:VY!Sa7u{uYUr>yHe`Ch\%Sr˚+K5X gspհ!(fPE B1ǓHuXn7F}H4Nҡv.Iә_3Ϗ 7o-}ȱK,'`_|!Ev-uAsڂpgS|%ꂠyVKuX)5L(3ܨT/! Qxrf
+kqS j{`3s1V*㤙aSg2~5r+uE9 Mv̞9{8|goRokiLT qoe?o+zRڵaVB i߭p g⡖;MAIv miS/_%dQݐL
+øurJѤFZJA 42r @lkȂ~s IBMӹ dF?) Q(T$94Պņ ;\gZl! ٩cW;BbuqC ·s
+$WVH!z[S f$(;~* r4۝dPOJ4ֳۤê !#fEͽt:DqȁWX8|a/ oDE/EUϽzR؟@\.#dԌ}7!.Eĸ-ʜ ( R}g62?.<+GQ)Mňi܆`R=]$@4܍?`{<!F!he !"q_T,J~<*rSyybw]S,@XcݾI9E)m"1A lݛ\"S,~m.uڨ_ #1&u98sĹ{c -Zs@X1 F8" [;YJi)*QzTPMworb7znnk#`<ʯڨ7 n3Hxd +^^
+.K3" ^W|Vb]0ɿU0Ҹ{c 8\E8aGw!C`$HO\K5!Zkq=N#Ƥ,Y *vX1jXMb7&M,jD;Zoor*C$XC%y1ׯE$f]faPi=Nb
+9eݦȇG eDPݫ@dI"TLbTp]ysֱ;c]?d,F v,_ĥL_Uf ;y"1q}V!MSwÑ!m
+RXqp_@,8O |sFHk*FaFAF%RߩFT.ӝ>,Da o:H\N~s
+MaHI3"6'Evz kB3C\L
+z=s+;# W"4hNB/qRkѮy ,Hmo ;I˶?lRӃw^~gu13H;Ra#^k2M)J=7>`戉&tPw¢U"}K52G iL`_LŸru}dB4!rP@.Oq"uG VI{+%
+!Iws="ZyCJmfmA5
+T`+(5-,% Az/Wf"#4!(R @ʂ\͎V唦kL75^Ŋ(D@!dvjTl,Mv.IX!].fPZj_ $Q_4Fe@GGdI 2XT@!r91uc[t,ɢz/ʊy
+fz5rm@#/u_x;jхr0 l'( J%hΤC_/+FRJ#!sp{
+Gv mV]N;Ť%Y\, 7׹6j,Fה]$_CeUY$`K?}@LUД_!B)-QR H:&]B"fzq zϛVԕYbϫ A-},ՁJ0سd] ,fxƻsxW^>6,|=*m9JČEw2[Q,g;4gʠYhzP҅z^<5dIRRyDyj&36$RFrp؝Z.21&ؗRv
+tBwc{45]Z=#ƅr` 9;reqJ=Re#y%/#1]eO $m:3jh@#l4~@&j![6Rn>tتA<S59Rf2C_A`ml#10MP$`UW
+YET fm$2۸0 }?%E4ӂ3C8:>zÈ ^N7d)ɯ&fz
+Q![pT1Ȫc' ٟz zDIS6kLXn!4i
+<6ܴ7dFqB֊ 'V0̌`B"ѵѷ:uoN&Z,%t%N
+&~cpwOKD ,s<4gʗWn*VQ&I]Bǫ3;HghAsh ^5lX9/Ӱd^ʤ˓ji_^AWO69AN1PEW
+ )~$~FN-]Fm!?ra3넕R?G#Y[Xz|1&hZ&pU2[(OxOM 76gcB5xm$Jm/>9o&R-͙7'h:5hL*c99g !uUT
+?'JIphofcHC)D䂔3J7ŕm·ObH?عh{^I#f{ڀEa!4/XN>Srn' \g*֋.>TU6 9JC2>tkz?=fQ-s3gh>ϔ1Vj3`7$#ߏA&~2@n.ttČo\.opxHߔdAa艩fQfߑoYg HR^dܷ?0EfqLӥ)|Tji*2h<~DeΦ,
+(5n Fzuʳݓ|vTSK h#ZgA/y
+SgBDr,+`VQJZ}U31bU?+|Q֏-H晙MO<xb1 {F?CTIۤwƂ&G:Q -vJ
+@] j!
+۰^,s*O0<ܦ #mLDr}#o]TC0^C7Y^FK B.b{
+b y[-mE!yQՅ%;`OB~r bwz
+Z]j~=9\:K0 L̿jUɕ 
+gB3^HrH=܁ebsQ#Ɍ@4K13aq6G;%>
+).P{# 5
+O;
+1~b݊W04M
+c8Cڜ!a8bȯ|V\-:X2h, rv2_ڰjkC6t b!%c-ϙdh[
+Snm_ Ivn557PP VMKrxۂDB7͈#LOb|5x57^_R=5yc1>Gd?^d Y :@x\'#vRiKZ AGThՁX*^oQp_b.[D$c\d`[5,:[2~zK$pq=ٞ:H]G
+O>/:0xmJ1m9^i=BMQcjŭ|٣@B%3ꎈY/s$crV!bT_'(SIGf)/qW<b<) )o-R UT+~.DL;˾0\8 ,B3 P+!-@+Qg4fEgJZb7.(QF`d Q"/4rƯqi?_*(-9Iqz{:xWANc"fyb >òFLu)&֣1t<Z_yPH(lWQ7GuGQX} .Z|YQAtFwEQ0*6ZgY+DuV7 Z"~d^UFdBz)nSղ@1'q!N 0OtSX gƸ>@g \7%9ˡV.IAߓw;W*lB>.s 9 UH 'O41=a"jRus#!cn,Sċy
+PWR!/:|K1ml^` Lz!78On*׃^Ab0)a}3R M0?VIkyeC!~ $YgfTZ-*[ԩlw)׆GQ{[6HGd8uvaĕ1hԍgK"t9HB؏Ka'1.j,6Zovk+}$͝:y2K+-D09X mڜqQkbV
+ H`lAb:e; Cuq2.MgoKCmz]
+a.:%9ټW
+P0C Ku~u@u8QnrCnޱ'8H\ߡl=8++n-ދh] دL1XĂbz^ o fMbݓ%JmxY|R <,{n9ÚE Xh5w=pq=2%*Zfx< "!?h@̴K3]g{yiZKv 4Qyg,C籈ndﯰieg.%]k*I:_JX8>0(fԀH7?|+qHHzR!~#:+<)}VI)T"`)k?m܅" ְX370S<cuarl]$2tq
+M80w>He²͒H "ȄNYnQuTޱ<M㏝0[ī-4hh,{"1#!Ej7%K(oZ4[x1J%5ӋePاKK74|5=,QE8ι.
+|"P*nB[]Ơ,L蝜 S[p Mt$lo';ENlѳbvmȇ-\ȅBPE=B3S5hdVQ77 BXK C?6&2a(ksp7ud RW9e _
+00gz PwX[e[\Ľ$iB/>M* Tta|s_%%NuSf~5uS$GGGNKzPIhssm e7 ?k;d
+Ѣhd! qӈ呃zc
+Jd+/w7#M\]6/_jȆ c2j*OoOT^C,!*PtаX mQ@|)(lOR"=&EjB/Eי:Y}ԥQ<a4?Ӣ}5үUu_(0|wEWNBQ4D 3\=~ٞtieirzU<)*o</%'8*Q&сH ܛE1'0$H>Jzmb?0W_IJ9KT7K9
+#*!v&3SJ
+a FٴHf ѽ)yD}K#CMfuRż.<f/efEaq%vɻMŒ@.J<#(&,wWQu
+Z
+' J<7 ږ%yw퓚 ku-2jIP@4MdX1(bD|OVZZ).(!c)YCh}d 2d)H`&4{2mqyVĕ'l+gjʞN=
+*qVe1AjCn& @e)P{Kp"dPdhz4;W8 OJ$eD>)g]1QSkWsX9iY0c%-Vn?xބS#8:Ӗ0f؟յqd}c~mX\܉GߋXAB
+ʼnUH;^J\Ka4
+HknImb)ZId8eui7egu".H(
+^DɅcue3TcC]Xh-RvXСϰLBpK
+CRyz>.5K-1;E(vؓun1zĿOBAvQ*-_J'Y_
+Rswnn
+dGmz2v'(AU >1&ˣ1FaVԩ"T捤M"y^J*":B$kg}dbئ
+W<߈3*T.mqi?Be jQ㤱17% o#+J}x-b$Ԏ'W# WWl-9kUoS{g.䰤R*
+{`TR⎆f+A@ G<@ٸv? U/)֭!`ńt[,8'2JF";b:% H"PEfYQg;(¢HV1F!eb 7 χsArx8KO5iQ%N3P`J[)Cπ%92lì%@7c` <
+yJ O<DovS!
+40"ylV|b15JXFZxxEJjts82DOk(PW& #\Ղ/yh,/WМ_Q
+Du2ƳŪsQ@kፄH]}EN\ׁ~:EOgǯUZtyX ^^ 'sj^*!(Iqpl%mK,l3JNp,HS>G
+p$W zDEK9%모r=d\,ѥU!ʈv4$7]0=H2W7DnERqWysiq/1Q:$lW,ԾB9]6`%ȵ]B@_.$BTٞ}U#|ZJ>#Qʇm
+d1}ZCK
+Z .GˆaFVD (o CZ\'l)1\<{,VS"^!8aNoN-Ѕu]؍Ƌj8)Ћ=sMX=%kQ6G.z&
+.蚂wdƗ]  Ⱦ5;@t, !z
+~cADpQ[}HAk, f
+Di2N^ cRD2="Ր 6;V"ja1(x^5$ įU'WA&"p
+z<I>f G jj> 3wawZ5xlKԻsøTQ>!,>B5Ks(-(HloߩI4 od0hK#C#2rr {nZD=۰s8C1J"yw<8 Ƀ4сoKG0RFgp!F_q&3t#ᾛI_½O,FRmSaʚAo}U*=6+ɼA=01"R )֋H@خыQ?^,6̔ٽQ4BgnF`y*PWЕ NߌrӞܽ V{WHbicDM]~uBmm@@
+_ ]Į^v
+AJ `S7PQC#shwʙ1/mEu:71i) |f+}.], Ъ!bkc(ء( M1UWgn @f:!y [+; JP/AqUU&m z(yw-ɩoЪ =%%͎/^kL+>J4*4NQA*3Ѐe `:wU"wAmo'
+WͫL=AI:헱:m@9d?mcN|'
+[iJ(&ZX`\!-
+g1pϰR,fΐm-u4[ّdS1le{pYI^DVEw#S2 =>ν[AZw$%@:CA" Gރ>fK2}%FaN[vG賀)(kKҏ-t_H2aJڐ]o{l(6>X,3ЩOg+S0'3!&1Jgt
+L:ģvx0z~>'g͝:
+ V(y{ko49^rj
+jBsPCu#@Qr'I.5Wl-R8k{}c ;΢c:29xwk;H1cf cO@*J  P'6Ӏsx! H qfik1ZǶq#и puW,4b/V4n]
+'}_DS˻)
+'v?HPgHi3i;BB||'LAm0j0̇¹aV
+/,G+OV08ANa9A57HREw Ok{жMԴ[&2+1A#dKakn|B\~<x. qL kf%.*ţʒ 1/ Qc*(kc]&Gv@@>Ly^6a95@*+d'o&[=f+Β{y%
+
+1C'*~Hi*E>n1. a  U@URi#TY)OyHC:I4s$>5#3,*@x1Ou]xuqQ/[p[i6%4Όza/MH_ud5=)[ @4}^+JYX6\oOHKnR`PYR,l]]lr(!ɠʼ݁1g!Dس(;O9|_z(&T~%H˶VkVcE'Gϑ葬*K6,nc,>"3j1̂HcbP
+3H+HmeTJ.g)0>oY*+v9sDtI廰Ja()RUSN#+GuC(BHñB_*)kBBQh_yyG1T. ?/&(Vd̅
+wE2KǾ)a0Y|ӡup\ W/.=K1SXv'IXnhtSVUIϤU_0gp_A)wV.UdTR֙SBlJc,Pl>Y;
+*-AI?v&cXOxrqtdqGs?Eo⇹ʕA0mF\f4OU*̑
+^.@훞E4qa`x"XC'I{כR4fa>faX{t'/XXrRL!Qj"3?V*2K؅*o3,̢e>`7̤p$b5li<f#S )MYܱJd`JEzQC][1PSZ%z)SL~uO~61m)L1oWА<j~pN`BA:`;x\9rB@ ~#5Nt!+vZ $uv
+>9Z5l3
+pd)O0t>$2Aι yiiPC<iJzD
+z*Z%$E{}h[4Hd{.\]n4 ϕ5ZSâBANIj= jĢS
+ SɃu*ʗP~1:<;鏕8^F JxUV/x__ x]˳ScXꩀ8!vԌDшXǠD S#PQFDmv
+7> W
+HA7O;Q
+ؾ2O>o01:d qC|,Neu`}}Π|1TB
+E5bo 1Q^,7(1w8&jL?13KCdCmkPuElIdu <B7=WN$ulgdL4 v?S@Uu zR@=bꆌ*oʻyg6{roAVTDk %>1/HK_jJ)|o aZ&cl NSM?vؼ!mb11BBn@?
+Zc_5 -K`cCfI?ZK!P&Ro:?;aZP<M{ab̽]q2}Jh6N!0%@8mՖs_.CJœ/ÜU
+14|~z52{e~Z
+: [D'qXp#d0 9T&z3 U{i=B0( ^iz6x=Kx]W!e䌱~'H@uH
+ɇXRI'1)^ҁdG= HBqxRiDF ?oA4
+B >c{ LB# :',,lxb(D|n ZFDX-QӜ+v&[-ym!;W)Xy[, @rP)PyhFctuF$Mt]3B._-p8 q4_,Ηⅼ{ߐ ulN<9@R#\ SM3r_?Sd7<&)N%"11}D<PLt u^+m[^DR)C
+A O xmX)d!6y5z)^6Ϣ1,ȈNbN'9HADLQ;W -)ErDq\+WquǺ?!\.!! Ǖ:6X`j}nxKx_K pX~u,1 za}5wʎr0;wpj #}YvOG:x;3m@}b xDS*mWz| Cw¥i,p_?^{YyJ}Q4cԎ-?@hwm1͓'Pjc0Xv\ύ;H >[)NrrL$?2^S|(xϤlog@cIf =CK5rhٮ>X\*C /Vi>\[ BIc)zD"a7@:GR﮴W7FxiƧue`&5 $fdE@Л~BhXV3n7pr
+--VGMBZBbb9n)˓Fv@4+Tc>?|0<y3"XJ9$\$X[GR[z(GOR(_I<BjZP8/?CE4uޮ->g<^DZL0qM7ACQ4|&g vcLxayy 
+Fs`DO2L+zmWL(P$0@WdAJlI^grp`4޾¶^zo&g4NHZIm4ci(ݛ%ZcŖ*'쥺pbZ?<M%Z)$I9\mO z/G㪐򸴖A;2*
+g.,O@y3ꃾu r8
+&ΩYv*|1uȷ."š:r;=4DOCbVPT^;#P;,#
+"m0Ut/Ab_,g=aPʔXPܰ)Ω)݀zǥЋ0z{SӶ2hiT
+|\Eo(12[(]L hfo
+Nv1{eM1OSFOx:uw@5
+aAی*!3_$qM-*Cڅcpy4R^sRT+T% d3ȈO5εQ^Tf-,JQgcpN ]*RiޜQq\x\JSyeUj(4Xx
+cq"%x7/O&4L蓹 mʃIΧb'֬ˏN7тg(YC4n]_/8unwzU66` O۩15 Ơ;fxzF,V>]ox !$%Rd*.ƷTF0n v+&dE3o,O-\Z`; O$$hJŮ-u* fʇ|c\,PaŶ"F飷Og+"v, jB mE"B80V2
+* !"at[v17HsUgR~ ʰFF딍ͤ7{9Q 6摡CE6?陶f70Hx@2[,U/FAjz wAh57͊}^ll+.QR"4tBgdTYAղE}>(57cX*;a͡F)iTC"> x?7 یM0srXD%uIUbf90F@KրQOb|S(qq(m oh~2rXfFt!L6/ʌf<TVo1dV33;(;/">U:Ǝ/nj0Ռ~WD:4C IsY{&T#
+ojeX n 3"=7ƾm\6/<;O񞲺` 34+G%i0`؂`Գ2 s
+ѕ #'Kpim'9|@1!)ڠ]֠4e12!Rƽ_@tŝf͊/6I, k[)\`F,[Zo"|zݯNZ]ٮW&&ټlh4}oC@[)T&3V<Q;1vC>ʗyf5jȯ az$zqHAz6)3e}=6jvp}V tƅwHo&r\ǎpd Y]>؃Ah<yf̤4pӓ6Fbe8,Grb!6>9)C=scS)Zd'׊\,A?oH&rAx'% (J R١ev`lvQ2AIʟw" o$'|yO
+
+ ¤TVYՄrʆL_O9<tTXA{=ސV 9`4<!VD ړ 5.Ƞ<iL:ҠTSLL" >6$`d*8_ ղi>͉ P%b
+Lak{H\(3 _*Hv!T i\$rQb0Ǫ eTf7k4V @:8O?1D3' y@`7[y@
+6v790ٮ3~gr!"#41ax!oy1dIE>nDnQ6!^`F(Y9 -ds֭uE')
+23
+I[su(:dg} j6b ;=0
+kh<W /Xp|}{g4]}g{QvD`w9& `yw<)YNi4$%|2v2 bJZ~/QrqtL;F¿buw oËjA=]i 41*ոX =&юI
+Ld͒?E*ie}A˗"K&͔X({ɿFԌd%m
+cng'+~d &x36+W5Eʾr6AC~, ajY7{qCz٦Z-Cű#/%8E $_zA7H1&E9pS#ݞJ78zO
+o9# 
+ TVB;v30 Uhd&j߉"EErDYKI;̟W*b0]qXbHoj@E^&+1L/U;%v}Cɥl ΞΓJ4`_Es$؉ =cxf_sb~<' !Y~{ ҮDaHE 'ۺ
+|t[:MɨMx+cB¬J|}Jc--9YUv,v=():,~Uj 20nk6"(/;J[@
+ TٷoQVthHaAХl=ͺ,s@>/P  hWÐ,:MTE\'Ql*݋96NB0Gkc@s~(1PTM !:1_'-'u&M{!P3&JIQ?&w9kd&qfc{u9
+N*HfEԎ}N@cY ,k"Rq<j>O;ɷ^Rۘ9+b4@
+%=L
+\BTPh<<Bgi$'z q!ą[;gI`+$pqϜéBKǬ`J*olӨ2gC<s;!B9ԉO6,!)+nzV}H_`(zT`oF*.cU 8w&ƈ|+%4NԤ;K2JTJ $x/Jz<Emxx{1OU) tۿBb(+/aC'[ MSS3}E{;ex,ƒ,d>M9% SvzbK<}LE/E2)4xh#sd38;h Bvse2Z%HG/!9$pVyJYv^7კÏ4tj>n;%EPY8C\p
+1ZWFofq^+㢠z>&)as6EVLA1wp,"qNMYZ_H0b=}?eYb ۇ;jqJBWHDyp3\ ,guno?ȍY&_^传/{0[NK"!7277v*OV&)3^&qJ=ЀVЖ$
+*D$b"wi8|d_I5N4׷+l#lRR/ɷ Rkȥu VH7, ZzMc'  {m`Ԩɬm:"/P #<ɐ1Or8 xLb`5;>GIv bFO], y8ZnՐ|5_d`5Yf,W8nHtEs . EPd Ph2b.!7epEeܽƙ3@%wo(ʦ#o2/r@ڢ+v UGIwn] W|S) [yKbyv2cj Gco;
+FI\+A۷~v(D
+>v*Bւ);0A.0I po<į%򜀜< Q'ZаzԐuaH4I
+zN
+TllW@eS4 C+5?'q,RJJ U$+`#\;.5z)Nem=qǛ#؄B~-Zqq }&6ډ(rj|oT.V ϟ&L`9(#ɫz^cUB0hFVipY0_
+7 ӆ=4i6KTܚe)ǺX#QT=J吓m$TzubtG9* OCʽ^_x<^>pO1l'dm3FlpQVbQcH],;h'~J{VTw !ZڵQԵG~n/"NdʼCiҴ*V]gdQ/`6W S5G 72#<{|L
+[~PF=9$]=sF~rK Sib8mo4U/2h2 WLT<0$4xTM
+GQ4}PYFo|uoJNV9g1m{3;#HdޕF'PTBNHW왇)+ 9&\islxqqcxSށ@Ad3 ŠXM1>Rvh
+.ϯCv
+pRbM~=-dIyA㡖Sd "?"~F8B vFx`j "!).3(MzЋC*Y701u1n&^E,1L"]W%KnY>b$l?ݦxCchZ9>ؐxe@xA0tGIwO?Kx<5
+sܿ6]IBT8xyCd`o?Cx94žA*U&UjHXtZbGo1s%X.KS.-2OzܙZWة
+[p1{y'_4鄩2 DDWkv2 -o F92酤@a[ώ%0Ђ`s 5` T'髎0¨a0
+RL٢!ASsY0]WTھ
+aCA/F "tmʽvIHyp³ E7(|Xj7
+S@C% aY A<@6Y\~pwM:bUp ${s^$6)z"bWDtK#q?CZT0MJ"*$ID"1;d
+J4JЙTjT&{=_{\&b$AVdʇO |[x,).F҅_?^U +n]P.J=o4f'^Ҡ8E!i|O.褩I%-]Apg:73eGyM"=C"(=oQV.{ZJu3yO/
+|w$woz
+r@PoD6
+⤐Ǯ)s$zG9rEAN*{
+D~y+F'M!n(*W<X kA(^PjY51BC'Qq^㇟!' Y2<9j=+hസmTqʔ) ifd jaNxtSɟ]XEoɷ"0
+D<D =ӆ<g/+UoCsf3PNI[: A!ۘ@uzC a嚸ejωVMmeʾQVA˳/GcB{F@]^
+>†1ܨ,Xﲘ]E<ko4-okyq6
+)Q>JBVӀQy;D9liB]|sqLVoNj9sg u48Pj"bLʼnTĀ,J~n|/p
+6|nj
+0QJsLYOw>v)/1h>Jn'y?19I8c.ǀՐ8]dںpԱ;`؊
+gOK4PC(>s`06[ϻd'MBd/Rث.h6r~ Z
+>t
+S6}Al@ah8@Ȩd _+{}?*R,d]$/M6B<Auiczx(Y .YމQ:.(ʕѾd(]?%^nC:R"$")u&^1UU }Dֵ&k]{%SY7ĤpH]G<oh&=?~{(R,,h )A߁on1E-<| PI0=jq֊Wkp _}q7}jyN=.HKż2N IXv6PETyRMD:\Sq2ET(VN܂>RZ[/ρ`VaRf=VGt?הߎ TM 8TE1),SR~Z$^_OYm*=LP#B7oz|0I5@.j<$c@%P_^bBq@㢖&Fzk'"& NhUKɟ~_9{
+a6JmNwxѸ40ܿ"$TkP~|Q(gPGK
+ ~vL ͠U3qT!*e-D(tZ`*Cxs2UB9Ju+J0cQD?+56ɯV{Gn7YlpN{U@{Pll@=.fdy(s}&e_@feV*\{E5 _H,C 4ٟ!*OjIU
+' OFkØdV@TSFUȎN(h8(h,G^d^NEqDE',`!}I">/
+G]7;SA'HLCh˚5iOܗGuu}M4MHot"I_oB^O WrrЉM\
+d=x9GYZ7F#e+ Km#Nx虪Rpt)]jBtai]ȨXliߩ.AxI9=I5m-l@~/XԊN2,?0y%J *A yX
+`KpaP۞e3v˳La2JE D ='x*
+ASz
+C!;]v䷳9.{&1nrl eБG?<HW`ӇzQKV>\ ~NZ!s+kw ;?XipWP}WMF0 a|U7`Q6̃6䶡?Dxn
+bC_!lI5D)279``"6>NɢDIOŀr T{6L?RayRcswe5T/[.{NYC%&% iӱЙ75%\8`/vPhrPߎvniٔmr:C6@LY)9
+Ë3Z]h&fٗC/ζ盐'f> >e{bhVsutɷ!"֡ d
+PP
+
+P^$QaMv- 
+#6<Hskc]AЂS
+@6ُέi6;1lPW826-M"+H{ 3 ǒ;3\`L&
+<M0j8? 7m I6g{IUATƺŘCc D{z7p7E ^#]\)f+,U]4'7_zymAy_ǘ|͠!4C$daL?y7U*^bҳ(0hggLȥ&(o&b a@x0s }
+ӊ@YtaB sJi3QuPzq),-'ڢO@cȝ sfn:5XF CMFeme%*&y|
+Ccb>xkCFBG13}(~61h:M%qY%}/8_z{Xم҆
+pSik̓v,M !O3^"
+g
+BJ7"Pk jrhᏐ>(@I!D_N_!`!|B3|EIIh
+fΖJ
+mY3&*( z'
+ni.IA(cO$ FuwCȪM\! ȅ)R2&7
+ܡ,LDeƲ/hhQ0fP>Tc+41}A/|Fi: `P1)v5퓴J
+,/|tд#(5cDM|r3TBk՚clK=)=C:㌌6Π#HGA0n\m.V 7ݩ>x ]!`M уhT
+@-!<:_~$-ĨWTꕷI.e$DzkP+^ՔetfnҸ>WY(;zߑ^<j娧 ͙DVmJLMʐcRt؈(dG#Jh=o~ϫ{ @vќϗLyD|z"Xc/ G^.5Џ/&@O8Ο|
+VzV/h*O7^FɂsV du:5Ϳe`a[ lZIqQTZqNfV v#Ԥ~Pl:PYq\C.T{ j}P*OLjÛP]-ԯUV66avAIPsU
+y6/LػՆbI7+ZCNܜؽxOɳ3YZbeuPUwQ@W1c+ |ZσЂݰnd2SdGUL에hie?91C!Me0wgKU(H2^HՆ?u1QYIX[ܜfFjiB/#;½lڼ{36_Ǜg4H<=@6xAE:3:0OW?5_@’6{kهf0_<g9}]M9[,;Y6E=A~?=B
+v
+aYiQ[9|6~h`я!ɛsՔٹ@\`Z<APDݺ!5d|%e|wARz } Afbʈѳ޴ʂu!@v! .R&bLF,_8WpsO}K]=iB~^5U@@5hP/1dr L 
+ж  ^=~@g~,y8L jF/9@y# 0O,bDrU:((h3 T
+d LGzY*t݈h[Q {UG#SLDtI M442l٭jP3vWz!(Ġ.&|!/;+ ާE ͬ$(A*dgd͖ Z(C ~ MC5y;X k8AJ7cSJ;e;[,J@Ѩ;
+k{NEQK ^˞rz;
+.@%#ڲ<Tk@m:H|V
+4jCg[$^)&W!Qdk[f\CR=S EE ڳh!: 5$yfC{7Cv  8*Da,(>jZ脂
+@f %gDqQE-GةRBiRFAyGȭХ=G)iwO#%Ȅ@tmOֿ+1a5|XT+EH F^}xOQb_ |]NKIƄWa$ퟥ L``c=#%6Q
+#l)>RXfo܈}V pֱ,
+s
+ xÛQ1RyU>vu$&)3r$i*v宣*6 U¤f)
+
+0z.;"C=te*PK w;l<D*uMP)K4_|?>_(ޣ,QAp {:57:"̰GeiP|o#
+OZ8PJv2|
+w?1yh "gc&[ֹ6`|1æblmp] vhgE5O MriQ5vUuG+!/ ]2ĕ[˩[iYl$3ml45FɁە\ЉwLsk8u;nHڿW%8F#vv5e^@)ȶvz[|6&N2#X*u ].eC(J~7DτPA23&HSk9"Z
+cy_GP&"߂vPxtV?aC 41[֪UIӉ9+82xc0y?ıL!ύ5>7=aMZPhF;ݒGD|d<oy
+f7Mwm
+ܑ+E 4K 3ڔED0-#RDhR(P ՙh
+|@=<~{}~gG}"W} k-D|eg<Z>dN
+C^l Em5wc ڴEKh
+41Vl]%{Jl튛bDsT-Ѥv`%J zBGޞcۿ~2"~! yǗ? ^e,Yn^u1lQֺpOKChKdzwa!hȗjQ֧ ;qYRHHNN":ɞ%sr%jGJ:*1wqSTV;[3񑡟{dZ9tB 1(>y}`B⛻OMɲ޵>QюEXi_ŃJE) ;s
+UdGO4 ɛpxAw j* /h&919jh! ZK0IM&qDv@p<S3GƞJ,-*O g]H ߬_*SnA@Q(O!=PlbJd`
+Ho [-EmIFbɒCݤxryd;&u$@GE's)ʲx.?ҡܤi
+eG,||OC $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6x?Z ':>/[T\)NEE#kpN& d5`ՠ\E|NAX.ԠKWNaoSSxoUήA/m`Ug=j5_%bǽO`5
+QXkFP.VZ`C%0lerS+UVj7}laǫyP~XEiak)EկrS1׋׉2ZK_m-ؤPт*/PYYZ ae% +~ev,xw/XUyYYeO?@mʴ&K8g߭K5}8IzگH!:jzu; si|lТ6uc}@үKEc߳Yuۓ/;䒴.,2Nſ̲̄T{5lڟSsZXZYT7N=~l~mCqb{|)nF=iSu1B%ZʯII#A%r_ٰAꇨEƬL-붦KgW5ߪJMM7m]<LqxYof'뵈٠Etf'۟rփ7jʤKӞr8c"ŝvޢqp^7LLR!57Od! t܊=piZ>]Rum, ):&ً՘ɳ%sF*8F!Q4;I#6fP6,L$u)7?OMTxu]vը1%$^Kx LPDm/bfM6JhR;!uÇ~EK*B*aI<b1a=LĨ\Lɮ/Vͺl:=Z;kD,,E 蕛VoNFl,ibTvSEsRnM'4ɘbbV<n5m'.Ȅm4)J$Mniޢǎ}Qݡ gEW Lr>F x%_b՚Ox5s+ im͊N,:ȑИ
+[R=3D ÓpF*l@TuLxLaIyM$W><7+?\W3.eskMk'<΢
+GG>伾7r0ˆr:bUakʆm&lQsn%|f|i3rHn&`AW:W{xkG6yv<g_Z-z-sw2ϑ6<Ȼ_m=h2^I]5YҦ#&I&l!&G[^l8nb&1A.hw뎛Lg'vRNmW."n>ꮌKe6TtR)'O\E%-*6:f`cMx)ߘۉ̬4ԊYł</*^8xzB~!xCvc̞t|p͍UlXNE9&J>׬4I)pn&̯*1Uo/i[] #ΧW<`V _[ξWTCM7ή]7ȏ6ncWLѱ&y:,oMɰߘ]5(A Źc2ueV. x~g&9pi*7Ӥc<9ܦ6w,wzwC>W}KxWD[qn{ATI|_\Tp1.a52+l({g~3ZY*jvU ad?XCyC.hǟG''!uG]ؙ}C QɐI3/1
+hՖmӈ,$d!@l{s3an{})bCt¿lţߢ[5^.g09*?x3񻏳ڂ0q.]>\Fw{8x'J1oU`>m/ucA1䎜mW;@m8`h }b/n}yxu0oe܃9ّ̬ͣ_4g_{nGW]_$^^%FE({%4pKZ) 2 iHo 4Ƙ\I DP7dԢcδC>§gf?!$"ĄwPSf} ]F8aϺw+rԠ8IZ̿N1
+ XA/[djSc*nqӚr<2E&y?+lt$_5F&U.yҋG=dXBg](8rx**9-l(X|:a%z\fRoXd^DDFEF: dGDXHr䖴4}VS&㯻j)TQW+8y ؋OģV3d^#iCr.v|{/񵨑>[=W23mzIt8t@MUd
+xdSGÍ9@u#j@6^@Y}^/ewKg{.熮N5;~«EEӧwܜu n#)EMUiseDeݙ?p!:XvJrBnhtȬ"V֒d 1?!r(),n&B5-$h
+-^u/00IC~E}z4Ȅ@&FDD+(@ I*)4jKk:>j+tyH +I=$u*fSb?疶Щ
+^
+QNl'B2M֣d:"8>JGLR E!W #}hH;Xٱ=L&
+zR6 n<$*'a'ڞ_]5б:ٴX*5)@)(oz.,
+k^lڟG}M_`/3:'d&5=,O<й=[ܐ[WS~Yd9#=NIqMf7,R̭F]÷+{+μ(,n$0
+uN"v{),xGZnGv`AR{0r3Y7MGiW-UA>}w7ܿf5ߥ31Z:λ_5u{ y=W޾ˬ jrkC׊9??<c}UU7]7_<Cן5;qIoSOG+~̠C#ptf]G[K#FXglaaM'5RT3L Sa%ӷD ɠfʺOS 99|pQvs<96OS2.빜sTeנz]
+kt̄бQ3v<&ωcNP_ށETR/Fw1TjlYGOʖQˤz: ]ZŽGTs*d¤&zK"an2/ 2"h0ODW\, ʺ%UjnYk)jTЉ/ʛg̶Qٱ[)sm2Dt|]sdﬧ$&p~ n:V%n,F!GJq\fIi{<g==vtl6IՐ%!T&lĞD 1 Z j2oE{gDe-C#f<iP)U2 }N64鍉6^6ڄ^vuEξy¼\Zڀ,$>`9anOvQ%/VCӆ??#TԦߞT-7x;SO_`woWŜ⌽37
+>T|V}5?\P_ʫDP[Ĭ|@+؝ޛ^(;>iUvV^'CO?$I
+ 55K9Kى#ё%B
+${@EF##
+&42w|ͥy
+7]BF1`eg`]~E%O7 Z_v]~@;S] &ƜEzz/h]~Nwc Uu΄~a۞Fjwu%tlˑj^Ugȁg%`}EqiÁݪdiw':!rO[O%'1S'6Qηc?<gN#5T_{٨
+U]/2Kv-pp6z֛S^ʹ}A$'
+@V>9D@%$5lwT~\t;S
+3E-3NׇeU jo.zrs|n f.8Z&崗^j`q",&0#7ː нrb.J֓rR^Q7UF]3졎KzJ<TYޗKT򺜲f!gydQl]J|MRf0HؔA?f%0wN'Ƨhp&9N@HFt ŰYJcl@qa/?ѻݨEB1K3;p&w..- ߓ+N7q$fG(`r-=0\^dV.尔"Y5%_Mxk?ć/;ɦoq1;;ha>8qL8ll햵;[Z53nzR (pHL w;tc@Qg@BΝ
+h=gb&S%G4 l`4Q[uEO̓̽H;5Z>YOLUS&{^;/k m:5><|ٙPql8_ۤվV k11J>MZ-{2F;rQz]Dq`ȬK|0'Y ʦ5 &̜!UT둬b9$kiYp1\E JrDy-8kY8P[%V KA%o#++1ۿؚR޼Bs}̳ίs.Y Wj
+.|?TbO0h-ɀυNsBXINvLD/8F 0:)WuF7%>˳735 +J3`V+auw2{Ď[tH-@LdF:8CSA1J ~h؄F&բzZADC%9A:lh}4JL c?c\B-. e%Kizl?ǞO_&_Iϗ&u51VZEVK^GO/* w$R{bRH lb+h/6l`&K=e`h=0 Y%6\$ 0٪˖Gմ T[&,4sR}\~;.ǬuKw=A[zqS]CwYŅE`A&)0&=cTXU(yr*l#bzO
+$ .)޽y[ɏ
+|؝3{K?q 8ʐP3\3K؅Q:b2šB@U:v-}?H._tzvh{JԼ$`NˡΓsO?m3[j4A8,ZK =WYMrC=Wÿ#L\-
+^Y[}
+xzh-$LR9
+!zmVp ~ *נKA\ hYAİ8?P$*Nv~s xP'KTTzMn\yiq<M^Kf}}Qgݢ7ڋ(VBRQ8.&3 _67S\*UI%ja
+iF^Je
+iF<V ^bA0tB/6_9fj|t1h&Q>+ǵo6&NPxn eԮ(y ',3nBF_V },CnU?y/߮L\kSX|awc/K/5̢fY驶^FǙUD7΢He[Zc_lq-c>20t:ل\q{X/8*s<<g&jB'LpEU@eצO]Y.=t!M80V Hϊv3`O1X$ܱ?(ΒA!lrĦ,G:2j7 J:>yqi_[fe3=s\(cCh'jiOY;d<+tڟZ~sh|͜s |brPs&Eƥԣ h36[’ ^H6 } A0H|v#H^Da[|1bJR1V<dC&̪
+TVfiu
+γ͸f^Ϙƞ7ϵƂwq9
+(9Zjpo‹Մ%5xMK:ɨ#BBsޟ8t}ewN'eSV׏Pڍ2t]Y&(L\e͆׶VkyɸMZZ{AeW~m3Y*9QN$4P3$t4ZEkCqn;?zp_?PhJP?|{D~t1[G!<KXaV
+h%gX`ъ_WECO-ݽVkV- 쨯cgw;Ȁ
+˯QBᚡJ-来P
+[Hwk=$:pI1bXx,1=E86k<aWNC)p &2f  .T_;REUgnM7&[^cT6szi#fo?~^ܒ٨(b*Z|N-% y&rX i،fՂ#)I_T 6Z$S&Et,Κɦ[ <gKc6-CbNǠY֎f ꨸Tr!\&܂eMZ.e
+H.|Xbf0t!eVv!`q|ڕ FA>b>&aP$sʯW~w9wC[O$VFFC$ٺW9jc‹l\3TK̂:ȐIP\/-S-({riG)ije쏬
+
+!#C m)xMոILGdHu[-cKh\EAU E/#5\j~y}lN%~{%SAcV0oTd[<t=yn7wlfZ' yO*G3*.(
+j3)dQ 75W0Qe/G i:isЙr¬8H $
+PIOzoY  fqe/unM_r8Or5mQou[tb؍q/k( @H-vŻ5VX%qUڒHQ\^>yWD<<#c V+/eЪR:59Xafkp@i54bl1(0 CMlUJ`6dUևĜk{CB5hI@%/m}B$d;
+YȚo릫\ܭ-bCq*>#3&` ^8 NrHl* cKbmUUEX3ܭ>Ƨ]Z6ah- vnWH4>
+S2 %}RCC<VK.BSriCK.aihlN-[} \:!9Xf"?Jis溽.vH^‹@lf&_pwi2oҨ"t{j4l
+2)X6SPrEM`D[bxXO+[។2nˠfhxѦ~>cSIy#tcO#Ƌͤc)+y ǜl֮n1:mQJGB0Ȏ'Bw;K8aH8]]Rp6"rG%4УFyک>}iOcƮ%xR$ﮐ'ZL{voA`~HSzcx]wꄸJI3 pxu+@FB?ms}š >tݨڊuڟ]olnӞ>XԜiC_Ќ5ͨI!k|9܂!Du㳿Sriv꫶>>a( ɾVSO[vDZ{՞i&l}lxM/) nx>뗎ӟ5W1{gA*1TS[o4'+FB,b/tpn0|\,!"0Fx;F|vSՄ~
+>鯧Pc5jo ]xJx]A3MA.hݑKe'IKK;5l192
+s(lig ӆ+qV~q0lE mof-+ڛ[O{=8D
+IZ"O%&:7l=fqYW.T g<S~YusYIc>GyA rj$0-ށLa ՠ)G<qL"c|W
+gOQQOTC1M-Xg#f>bi ]HN$)d17&MbO|ҍ#fnuۋ.NyÒjfۆ>*@JutâGԣx tTHR>FCvDٞ_(RWq>:eĦ\òt!V6;ŜBS> 949/}d$1WM7OM">.{ăV\?h>o#[.6!9p Y@IOΰVZLpiwV?guΜy3g33N,=ݖE- !@rBC"˱q MXrBz9o^7-]{=nG% 
+ʼn%Y%n'^b|.0S<v@-7
+=*j?ٲ٤m`kPA>fjE 8u%D8szHP`~1EL٩Fvۘ2_h/.qc\
+sQ]C:wE \B{N
+}煐yĦ C9vuX'ro659%ж1l*UIM/3iKRg'gkga [
+gDugn7rނI98sG%rڕ]8)[VR ܃3jGہʦo xJW)ƤCR~9&Ձ@HUX<X|^ :lSR_e i8~a2+,p]xޭz <'==|<yz1 4-(t0<~h%㷾oqkAB7%C!˪1{<+\%cT(`AMɆu9gU~^+\bְ.wj:j8bnb\{e`x8aq 4MF6?zlpIB$F2X{9AŤs2< #]\¡_G;޽Fyem_6\ʺ0bur3l0|r?,xy%42^{}<:&ڪR' bNЕ
+ƅv!f89Ϳ`̚G4Bc+Vn_ e
+I<])B)]R(З :bF2Ǧ^#M`m6.d0M%fҐwGϯoY.@#j-IlCͽx#SoMbC2y7x0pUv;>Jn>Bօƥ43)m\Ltg3|(8i&vǧ}Y7#Q&)p9
+u-~rⳝ-ϴ"תV-q;}'r&'>!n?U.bmM9TW̺G%6!spa| yd<9YUVˆK;v,vgذ"6\¹F-m{sGmݟ F.@5Q[֞+ukzC? 1qlpWeYvO]N5vbNZj
+(}qI9I$N]YDd+bsIOCΩs9Uu~[FAdW9ݕp|KNaO*;ԣ |헧Ea{Qٔq?g{Wt4F2G'n;x8xUʈ8wpCz{dYDJe'#'?=8{YUN+jC橅s32 3[ÊAC1v+qVy\1Gjvk|u{gJ&a!4T5rR8E|ZmL'lr"f<pq#5 n̿wtiovH(2իմi i - w|vst94keԔ@18 PymIZĀCpM@E)ɫ$zg:/M]75>nFZZnu¬$,
+Jڮb&YOlQFkyy^U_OC)X݄;Sʬ)'yc@t6$J:XMD>8$N9 1lFKHskt!P/?""ҒI_tS22oEH[ x5py-bB26qϗu)wp@kE ζr:񪜋/zq35aFZHψ6F9)lP%rn:2bvɆ/ Ir 3 )> &,˙AfCA#-+ ={S+ngeLCBI
+6v{9/^}ޒRkhNm1'=Pŭ{Ƒ !a)G_|
+t8OʨN:8A#ygS1Gkr{gK,Ex(j},wM#!O \T-+:ygjk
+|Z 3 YQ1#pY䞆K|*,mu,h!-26E yZ_ٓ rr/Z?sJ13ѓ]P(YNN9L !7HڷQ齰7FwH 8ӏR9!jF3bJfMƌY%=Ǡߞnn +
+my^_9?~_|Ў:(I4C$XU!yUdHK4u$:Ӛq̥4\.Is89)\DC-w#*gwf@#@]3Ёw7F,_Z/Iؑ<g٩&vj[[/5$(fvN{I8Mׅ `%,܅z CN@[XU1p
+O]-br$$ӂi`UQЎvM5E+Yf/=M>4z 6I?y%
+;ȎN7t}e/gٰ5dAbCsf;S%H] -dSu]"r|ƺ asL赺6Á~ sE?%`^
+w25ug,XۥrT;M4 j&;p冏OVh7Ia6\}#ig0O#?HW.գ*ɏ gӟ0XGB.
+lu$(Ddx\aF( 12do
+# TC'rVf'1hߛ3!GB ^%FЂlc."xAv{'0eu{,Hwl{IʂUr=Wzg bPy#dK3AUeqcSifO:U_&9z&Ix$C M#)z䧶fr:F}{4DXw
+d ncL z̉G1d
+SV20Y5qf`g<Ro7Mp87%:ĿT1f95jo
+l<w KTȅ!tӓ[Jޜ f;HR~&ş)*
+Ō7s #V[7o}S?[3dlc'87U-~reUrkD_puYZ5J9lzK
+NՖt9Мd)"L;ؘloe`yVعjry$5q0ך 0|F7d%&Bӂ 면*Q!y _w uSV]S
+TKʞ:yuRC.DN|혧F,C7{J@Z$(=wwz0;[$嘸Ul_אtrzeewv:Ąi|¡>W-m{
+qo֢Ѧ b>/gҶR-pe{*Ȼ׺kL0U2tҿos\4 ;gpRCa&wZ|WI)Y1!)+S(]gUU$n̫ y唬s%!=Am?i+Mk}YʣVzQc1vܖ!NXWn,Xe]]d]}F= ojz ޅO_ ;[ab7-?;ǖђG>)<IVzhH_@t!&mH<]$\.YFiw{c/L5ix?nUSV`zk; ١5fW91`*J˅EHo‚k\`i@;9>Mգ 97_l2uzw _Rg!}ٷk?6ih>íĦgw#971o}oNttByHݒ/ n_4̪Kck]Vw,'9;[ݽn=&sKpcH+bBg:F:HriX6 y,#ėP~ܔdDC7K1O6%SZn\[ɩiQއ-v\7GMsm[U
+dozޭ$vF!_UaS_f(Z%~J'J:$~7_tOC=A?ݟ.~7qnu ҧVc9#W;?R݁$%dg40w.&yЮ.W@BPϬ=Y$M-`2>dP5f IvI[
+:؏94p!kپ1̯^n~\-#O~X)ro:3>y{EzbrN^ť`VXDxxV~ 94:f聦3KEVAgٝ! |Omr*S㹚n qsC!!%fȠ?׼2o)2W|_vbC0u ao aTEGڦC?M)? axTbEc7üzjѩȥ@,J3[/6GOzCGUAJF+|%46!L#z8{?Yu4Whw(rsɏ]~喠wGe4vy3-X3 OZ{Q**)/;|ԁHii-g <u^(&kAwue.ɻĪh95)
+lQX}4zČ|URp3m=uQ)
+
+6zoXbޣX(# jędfn{\z:Arm FHQa>R܏9)X_V17aỽ<B56'CLSfyrʨSRvCLmhNw-7<;r
+ h? vA ]z}8!D̋jmZX 򎹘`wzp4Y+DjIˍ'ڲ俖E~w}:UWu< :02oI€Q8*93l "\r
+5AFn0W&Iv#sr4},\}H%az$򑦾(wE'۽k){I)&/Dd*;0Ԕzl];,)XkQsw׋z3hM */t:q̟+iԄW?Vr<Uòjd%Lz ;l]gn.*od}Ĝ{K2&lUq$|ags[#+m$2Og=0\/h}k&6"\R0` :Anku_Y&_$h,E.5@-+<ߟpΦlN=d,<MAҌ'6ifhGZ;k-OMq*8W6_hUʎ?n6{pM^14c~_mna0;]8aE0u1.@ F "8>-H+<<a_/Lu2椠:GΈJWRٔ:Hn/}u6L$%- ٮJv尺R+gY{BEG)U}Er\#?Os .ds}jv8Qe,~ކ^oӒqIYz)^rN~2 m0"8ZdQY?HK:%.%3)3'cUQ.n ]]iN35zcngX]J#D $_7T{SoEB|<n_04x]Csc[)rҟjٕIxYi~-~ik>(K\mM|;pd7 >jѧZNH7VxG^51Z)=$w8zxp:wn
+yCrZ\ xTHH2#ö*Ƅ8s3ɈW;%i
+6MVS+ao
+>~r$8Ҍ(311' $@x?|@H;p]~&k2͝<SK݆Y~
+Y/, rub^<s{{^h F{saΌ< h>*j8%ztcH=&*{2Y2R蜘4 #ڑ s żBCa7LY>t^@ZFuk7&*Zi *nV{;ZUMGy 㢂c?8q
+O |qXJVKjA|')6 *p%DBAza@~[
+DI Dx9qawFR Yztá/Lyl ޛ f2 ][V\ )d`AM ' >>s54Lsu>`RшǗ=W-;ʨ%[+s\YE4T&/THaH0~x<ь`J
+&S T}Zi_NɢI|x;No[PG' 8CR|P.HgҐ{- 8 4dMJO|;t~>}9q<{2uH6Z穒`8>b\|Cs B 15UDGǍ7wۅgjm+N#waI\u,8sZ#n-a֔[r|4e:i:U|ڌXz?, Y2'L~ ѡb:ZƌnWg`dujTJ03j֪.٢P'|qל]/O*GUeDWG.GÕkWûvM/YN5>% $@`$^7V42ϧG|X7]nj?mj,4)bm%i3c5t
+%XA$~ B&/MVS&+i+BU㹞/{c ]`dѸCȧ}#WԌdKjJLă8!bcC„,VA7uE%ym"<2_mMO^ ^OWO߭*^?KV&z4l]-j}~)\&䧢w)@(*Dlgy+}8Xфj~erdzǩ_{6Rw}kт+dPB%u޸AW<Rb!/12ݤ<89#2+ۘO?8-lu_n.VռW}gΞYY%IM<T7 /~X0$j%uԒBuojl# 4 L:8vtf$i;wnbN lcc&Z@htVtB !jE
+EJ!b "P-yG.(|M;!R"<ltG2ޘz5GEа*miy|` $5;|BVa9,)ؖNM&1*",c˂*<ZV z6@dee+ڷp!@"oyD.)!r䐂e70UbBΡٱ88}a:;Fځho .jd;^GT:
+>Ue}n4n2s&ƫC-(l3C3ݳX4l*juq^OD%xۥb7EeñMFy#ŠP*r9M֧Xf5-3/b&RM5m@'g_|$?Uy:k5O9O|kGɹ{`TAWKARP|vnM:}V/6CK%O'q-Q/v5ԃ@?3/l]!8?!{<QCÝl6O @_*=ELhcȄfϺG.T%yAZ7*i\u '>˸*X
+0ƳZ_ RY8n_ڙZTV5>9mTHo觛t|BtiNʀĬ_U6
+! u6& <jDyqj|&>!(vZOUb陓;Vt͵t5x6Svj&8$nF]a2 n Xr̡NU}ᔝ홃5\r);`(iplV sW間5ujK¤䝠'%%g P|,gU]VJz>$] J=Ѭ5pjm-d="nɟ*zҌ]e2AGFRsB}ڦg
+tD}Rޟ} :9u o?Il( W83H-\^{#fꏙ$ċ
+ꃸS=k>:.amL4<mWA:*,w`
+.1>ϙ2YMk^,Ї2)Oq=5avqjFrjh)u<9u!+ٗH0 dOHg!;t"!A @l$@Y;[g#dګꋯy~h|/PI;#wޤޔ
+^2rqYm_:/YݿHk3]یG[ }I88Y _EO :ٸZE]ૂ]c`ɯXA%y<Bl Rv9ăuvqnbYHT8
+ւC,)MWBaE)%'{0I')U,  d 3(De=GӲW,䤑y*fvC95A{\r*-8mVWTl-EO"D dt!ʄ2St{v11E":nHk36FI]XZG`9+YNns됖"?Oc&jKDmNZ y't5ISv =XSW7`P_f,bҳN}
+V]򩴝 "_Hd9FڳFVfҝ  FDTG<6:Jm%BvP5 ɩ:JQ5Ah8sW%0s\Cz%tq$Uj&Q3#0fAplˡdޥt[ o0mPka` )
+i2? c}~:R1;P6EmL`ӥ5p'| > eyC1WNo3;}ݗ=`#y
+66Nt˪$TJz@NjɨiOB+H˾x7ꏢkN!yUWE+?uK%;ŠjcP,y"ķ/҈GW1U[&ܾ[~\c=?eF~詩g۶ѶУ(Ȩd5K %
+
+>+%̐c
+n+ksn`(,D6P&Q2P}
+sI5 ɽ%Xu'Wqұ 7 #WIV nɥW_a)q/nQㆁuzyy,lYX}E~ y zjVSK?Y4 y=bNi3+7$A
+u\s 7R;ʠBv,5bQpR+]b2It>zcy(7ct.cQG`w0&\xDE:^D;CŠ^hT^k5j8qq=1?V|v2;q63ٝI1:1͖hbbƮذ"("U {cHPDEł4(ɳɞ\wwyo<j|]V B5)7`o8&)gW
+\
+LR=ᐼӣo+b㇒;"v%J:IQ]-7dmtR~qq~ pI8ojwMR`~@R 3q. ia.$iJɩØC(Zȁ2UV!᝹CM} {VUBRP-A>okRG],)Ŀ:;A{ꛬlQn@8#,``.1ꉹ;느y*ziqgKĂ
+
+W]3ks2\lTXdQvfYmnZ7
+s-19m@EĶ浾=yaaߙzKG/WDTndu6=66 Me -@^o6M)7 m"˵a)>Db(.hz)9δ hΜ.Tԙ?#őnv%6Gߕw?``3̂V4vn%`3"үKF6ͫ4=5;A̳~D[ߗ^ b(Aً`P+QqrGLȰfJwVk_jWz w7Ǧz܁MQn3qczws-)>1}d :f2\~yix7M)T&D<ٖ؜oVoM#%,uT$j}j+EGˣ;d GŮq+_yO1TpVFK}0"0CyGfG Bŧ%}FЭɚԹBзT)'GtV[Ĕ,sܿң?]as}K_n7GS*%gn=oy/:^|Y4}pxF&έ{7&HoL|n@ϩ $ leaO}5!"&lុ벼Jbh)"f[vV`n*^-! ,?Nk1هLi偮W
+~- PI/qu#I܋+@ A0Njq;ۺ7Έ\;k}JVc۫d#RA#u7qݰŘK;Rt}
+Em+:A-usm-gcN~ oͱGjv˱EeCQ/^eeƮT]L&,ڻIg'i.RU [ 񬴢Du摒b^q1N׈5ƶr <4Rp<Z[:2wWD9FG|lk\RX@TUҮ7E>>d~A?\|lɜglj* .ħa4Vh| dS{~-JwUpMG&lOkߒė[jBё0 Lֆ!Ӏ/=
+c.ApΐxI ʻBh! |aB'n6zdmqLe-A9%"#Z~1ݒaM
+h>yV힒 jݞ',
+(eQH'y8sfz\[YpYb\|em暻 5TJ.nkuSxg0ۦԵ޲k1xy45 dS{%Dn-<V̥ &2:Qs{%ooW@͡,/9Q)Kجib.QdrdO # p*JlMnxW+yzT@[+f8_6P)JFgA@5xhp0Eů࠽HE¢+R+!%嗽 W>ǀCw[Ψyn}H@ Ȕ- KIۛijUpo8Kȵܪ;**#eVc@nݔ"ߕeעF5ltJљSpmYc{G 觡 41,dSֲ1^YkuV%Ed|ut 'E觾վQG@D8$m 995:*d`gy)wGN+G%_[?h,wN`Sm։\S:ZԜ)+UAg(M=SL&:v f@/>4vT{T~
+=ʮߞXq?QѲ/l72J^xޙN4c&M41MXmnIl5;.,싲+Hp,]Ţ*KSOy#L-P W.`x=|`$&-ĺRاb`cV^ U1= /ۄ"@##a6d&Z䨞PP6ʖg!:"Unk6z$"Qs vQ[F >?3M {H;󄗾%xvt P4:0ō6jg{%ZȘ7*Ǝzi_X]5pw%lcU!R~QUsX]ݞƾ._w+Y3TŦA5lG=f
+U@CwpO=~`r6>/FpU][;KC?6Tr64s=nc'Џ
+j;[bf:.޻LFDb1#1́o&0:ڔՏ/zZG7=i|-+4J*r#fٛSw\{gw>l+[2h*ЃKyܘG䤑86p8O4ܱޚ?Β!meŌᘱ7 Zz1VF#TFԘBп8McSk$(OH+S_nM!'VAE&PVDt$hq 3©]2ulpOl|VԖ}~Cgy|cVrkECήuUg9UwecR+!47UrݑWuSCR_~P
+ܠ\@*2 o0ZBIHkjCK82snV͋9#[>_Z##{~_b_te[+he(
+.i7ƩqR\;+o{ó:M
++M:E#3u`eӎ]l[8rJvQ+A=o2gr!v; *afpKiD_lZUf
+16V aS
+{j~l2k0X2 > %<ܞe|vf@݅=vHtBʆ*in;o)';{ٖ 2⋠yRO~bRraw|d2:Ĵґo&
+_RVA=5 ~tN?ZUbA.e}˯/oF;;O(}K)
+%q#>rdS,!8c;TSZSvֽng]4^m|zFQctIMaAt 9\}u{DeQ: Z& hTǂ5_AuZayBSIh} *qd 4;訿7hLܡ_e~A8XKBk}um{4^$i;x1ݭItՅ*JmPoLuMK95lD&-C+!n{Q6v"&6aJnzS
+˴qXEZxUrLiZv9{2hIS
+*o/(sL2RX
+y섥w+z@n J1ʼn/jd"
+-jWg9dƬ4DN4ın,Q0*ҥJSD)"{APDA" grf){|Ϧ1E5Q˜܃%[
+,!HG
+JƬԾvZOZɣ%ue;
+ػB,u3wFOŒ+*s~}\-.mFznfXGzbj,B4WZ3Xx]!%2'KF6!xS/1AJR;AR
+* KFX&RJMM+:~{0rn:mvGێ;R{Xa֭bˮN
+oXwUew {s8͏.ese$D78--6+`uYRʣfІpĹl=X߆w[!5#)iO۝WGW!C2`?)ž} U` Nq SPad|4&ewᾭ6^ӑA 9­q7h P?IKM?vBx@?(!jU
+3 \Yת;`➘Ⱙ2M̳MӀ&VP!|}2*2;Zɫ7hg|:(n%-NJϹimH55>.Xz`T Q,EHSZ
+F9VQZz i ֱkʈł{c *ySʿ2O "|WEⷫw7ܚDnuZu
+z |{XRQjzOek"](Z|έa@|,Q X%jqn-k[`AL-I}}WCk!Ra\wϋnqS'PIp
+HA;
+O;B @b-^Ĭ/g^_v8, A$-in->e#`jox!-s]5o9M[6=>ހ\sLs:Z )eA¼S-9Xy*>5w/>m+vϜsfT}A}
+ d_$B,F猜C#iIǂn}& '"Rm]Tz4/"!7\z}HY2YBhtn!sWsyr<OBB/ZPb6]܀~y٩|0)T;o@R[7|AHAG7dB=>)!p‡yULz'} p)*~{
+$D
+s/7 6%E$/Ǖ1ɯW9m cfϖ0o@'Xh*^ cPmѧCV: >q˒
+˛#E DƹX:Y̖U09Qչ!a$9nnf&[S +9%cgb<u'u61"1{[BxO>+gPNT16
+Ib Lc8-qt.3![H<~豻>S$$,C[8зzf5#aHS10Q43SV8ἀ1Y?3~/oZYRx<,褤/gaK)៭ۏdy\#QO݃LCmA "7UXV(*ޟÊ&i$/ ׫P<RP)D'/ot
+t,9{L 7-I:[ctLn> xA76=(yVM
+UDrDxN)+"Qox)6K} F
+XsO"̞2Tޯ,ɍf^ ri۸kӒ1\廼+ʄ[ 4?[k _͗W*oW'7x/ߩi 7` 7Gfir l3_s `&#[[f I4\; sK@ 0-DʫϫgDZ[J 9{!rĺvPjWX鉾]A@~߁>ȭQ&dy[n6ү>BjR@RYc<x2>ښBFVۣaVwcTM1Dϝf+*@\hRΠ@qz&c^X`:dQCqAzuZAMm|)new>wVXpMg&T+wZ{cXj=<'HM̮ ,iA
+G\+RA<'\B?L1 bH1#y;``73*݆N9U)ٹYua7۳^}IsU/$xXqOPXOȤ;@!G3^@HS^kscCoZt5
+0dݡ0^&m0݊WþEu (%}I"A$5-ph)&
+l2Elt^5<<}جs;Fղ i<73e, D2"H$Vi;歛]:냨Ps[Û a4F6L8b
+ިq]!Ҭ缽|"+Լ缩Kiҟ/*(쑌 B1rFyyriI$Ѓl朄`@6|INxޚАxV{_!lk_q@p}Fدê_D"Pث{ȋJ> +%(^{DraT |.29u@~|9 
+q Rʰ
+႓vЖ`Y(0ޜ# n`*U6&\F"<֠K K`tOe] }Y;_j3xY෠m 4$>dZM ;]v@.ln#&kNud$9 ǔݰ '
+gthUn%2[{#H"dV T@3;ꂇtPR>k
+a *r4:Jο
+WE!~aҺCP>He74:\XU$md-6ɸlAȑ-cY.D $dFOСwАjWvǘ_Տ,C v&0-} qdBy1DA!QayS'Il<&ET `櫊!"YA#|_$XYω<r?/|tkIVʨoD* (S0? eG@KPpQX-(.-p٣eđY5`bg-a{ފKҴcZqU`uo7 P&ź7N_sLMɻ:Q,a6
+CBW>p{<e3) - &o̖1dg ٗmɖ
+ >̶!Ah!I< # LwM ^e[YT:6j" .'iM1p7yג-6
+LPFE&A^ D}7 rѦ
+ e->/zb[
+Z]W푝;RșބD'EF7
+&&}BP
+IjޑhBk#JC.B S
+,U!<=K]"+&m92mȑ;r!Y8Z|bMM͗.7?=n
+ 9u:j
+JU7S걙/65O`eq+;(mD΃`t{<_( |1A!5f2͞æ
+ZR$;՝Y7eC+N
+"/Ɂ|`J{o4dtYĎy!\K h܆GƛEa˗ANsn%4~e{Vd|g 0L V֢w財ZAgS|b(NFana;%M<0afŠly_aZQN9U^KRKiv>u۩-\r pj A `Z~>'6]h̖ UXn<Z)N) ٱ$cp{~e04CfkT`ُ r;b&9= hUDѫԧ;O YQ,H3O\8$Ѯ IKg{(+ibl4_P JE"!S4wP,po]);,G2V"3u5^@$ V[SOح1"wY.]`l{ m6
+i(Sze4g[ TbcZCfnMd2PA93a&W̓Nk ;,&x 4,zx {G>)gk@(-M̩u s~k nJn@v(0MX(噜Ӝ6]v(Ñ1n ,
+dtb֖E0/fUˬRU)]1lwj{bі "I,=YK9GjذQn,0)\ @O0cM0II5.\sʰ1)e>$oBi5ű b"~Fc:;dEZ0 T+vfL ץ.|`l|JDd U\Z/0]EQ-0v
+Q:sԊ&6Cjyer,ketl`G#x$ <Ǹk$䡨Se6q UNWxC\!<S
+'T>yÎz)I7ŇQ &7WSƆ){^} ť95`Z{7R[D݃Lԏ rUWP`|$I^-h\z^{ȓDeQVBlRA u?c
+wnL5 {d!6<Д˞͟3a`19OßuNrY/:/{"15J`s' s ƛ@ E; o+
+iOqf/oi&Df6(zt=$~G~ RkՁb2s
+בעӸ a8K1{؋.[Ty] Hk
+C Ѩ(#Xk(r: ti ]ib5Gf|oh=P]e)G{K
+M
+{mȅ`̮=GChS T4?}48s@˱impJLR{{@^-Џj+s}ou6+ޟkĶ!G4\r (RKZ<]\ ֊ωX0H_͌Rp-z9QQz)Q$41υ\Ub/厛 DhS|?@)fF:_^[򈗜9sG1H|pHqjaߥJ?l6
+<PX'܏(z>mD(G%䊻9dS7˜CTAupe\ߡPe
+k693!t\4D2 DHZCѻqVZ.}EզP,w
+69T$BwEA
+CM?H|􆴑XLk%I3q\hJeK@|N[跁X(j%biv%JH4I(U}}$|
+<w|c4l
+
+#mfND l3P@(JS$Nͻۀ1Ҙk;j!k |
+'?uWk[QwOI\UV
+3ڗPxt BU D%myykf2O
+_' V9Ucz]JdYY:y(Jr".墶0n؊aPT"aG 84O;s𗳕D.)Y)x{O0+!Z28j$kw?|U'RcUm$aCPL1ZzCsǭ#)
+p<IfJ(
+
+}ܱmYRl^NE ָs'V~
+uio4k@ oCY,XĉPJx2ۍ
+\d$Yt(bcQXl$9PjDAB5%T:Ok7)Q"Cʞ}sSɻu`VI^9zdnf$0RU+vB Rh~hv ם,>~Pit)8 eǬa `SSZUI5d"Y U !HKLR$vxRh襶WIvkNfXlt(|Yko^-Y̍Ќ>`k>Dr#1Q}=!@UCڨ<A<xї^B ]Hu9ќmPJepܔ8.(o! >Ɍ9 flC@w
+cC'n+:D/CRcΘj[~-"?#32yq #Y%9
+9G9p4.7c-P&)QAao!q Vb9!0s)RTYHC
+.{? 0&Hd%lVeX4gOp:C=
+
+Dp5p}i2:lG `*vDG&vșIx As!lcJ -1h`G]|m}⩈@*7|#XaVќaG'8NHQ_=.4@e;Vyz&$x;b`l_yۼgY@?~7`We|%qQFw%EHVU- [Z$OT{5o TVy#Ro&V2I9^J~CNW:D1s8so(TdKʂRB#!Øk'^xoa)($$ɍ#'9ky[hۺ'%aM
+ #ׁ3JxpEDtmJV+`!
+l5]-zg -(av0 - 7Hv
+3jOB`E4]Uj'œw>lR3/(dUV4Afz):=sĐrۋKKz{Uࠗ]uS:3z@銳!+M̩`ǝ3W{cS3*@:9]G= Ej"="G4żtSF<[M|LK!< ğ+c,+q08#.:d <%[(UXUI%xRZZ `X|[mJ#_N`8-r.E' ^{z)r
+5&B1 ntI81bkĈB*s&AfpĞ17~XCӭ 50Z ?,S/X{DINx $Y%a d0-XdC`|Sn~|XR2צ63 %/}N*;o
+S.a;D= KtFƾR^?]%"Sh?9i{d>Xa5O<z7%WǑV#ߊn@֐m3y, (D?2& Vf<$ȸ4qJ_ 嘌vu@J|'(!7^I`w!y=ibq5`9׽Җ ?<<|"GSyqrMhcu2؈cJo.9P}^90EƜ< 6g"n%_|R!K2pOIj&1=VvI=wfPH=rhho?WbR;
+ mOɫqˆ&3;
+Kð}qtLau.y[_󩘿C$Y7GKJze[ؠi,Yn~bY 50nXZ0\| %ާý_G^/H-D;AЉ#; g'@o 68r#1"C%~ɱe}+ئK &
+;h<Ou"\yCtlL -
+^nr7HXeE2!#ϣ3tCFcХ e80xTL򯂤bD$i.r㼏%0E$LzHIC\>:t5aq* B(4h "0D*vlT
+(2%d0| ߥT]4dKᬚ 5l
+ER.a~&'KPzl[ѓ/PWE^pl,)#w ⯛"{nWƨmq UY 0=4γo!f,\T 7xqs2'96J,[
+mJYft5&_?Ruaz-K`“}}B>xFd!HO=$LC@#޵98oDziz(/_E
+lYLZ˙dsVfEeX >㹖 ᄝB-+&}O#7Idia`NۡHUbZ[dq1욎=MP2`RBj GRX!XqY ]!D?>'Xz][Sc9 a׻q&.{ N<;N@[km\E/f/M/289ؼ
+*qxL Of<TM ʾ,}0>獧W3Uc6GTA#j7̓
+Ruq򺳝Boњ(5iKsmķKA|W vd Gs
+|)=
+Kޝ%16@K{,MJ2V,L<`ȌQ.z黴wCgLKi)׭n~2/"en@bu]&C8/3Z $-9/ѱJ !/
+SWhŐ .#& f2 Kɡ-)F{#?\H`}:eP>HD1M
+&8,`BQLqM!18YOAܜH,m9 |t͘i5}cjÌ#->WƤ5ATt9WdǟGG\UD}|8`)Vq;e{CF]Y ?7=ʣQ{ȵ^RHc(ma6 ivp-,]]]XefJ>Na-3EK+rGJrsŊ~B}[%A@]Y{
+&S s /
+"-jF,im|<v_F˷[&sNzG:2^JxZeWX6|YK"lmoD LJD݋Hb]7K%v8Ցzh∑N/цaZ7DW<=(V<1:"IN J
+<H=S
+*W<RުtE4ry}zjG*Q_QY ED
+ᠿELw8aE',o0jFQik.~3{$0yZ<P5(
+;ah<I@o(htK>7ϔ_ ;}_AQg94E].HXqd5&rʂR%
+EIfEL'!]+O1q:5ܓ`
+T$u]E¾yHBp4%B ~0y-> O
+.y^ q&1eFX1~Z!)}^#A1zHo;#H*hY*+L]ffcj®MOr9\`1q e<
+LrzIj8"z4qZP% )rtq -[
+ }[gK썬8&!#`֫
+0~JsLPFΪ{ FβvZeE.KH;.Ao@Pq|^~b;ݐw sɰ|7Pj*EC߮ .6uMwwq|z. xŧ
+j54/ɐ@
+wA{ # %NďÒ<+.Foa4IǹzMȘ944SݼIO
+T呸F0\vM(dD袲4&A! dѤ]DL?u2 G8 0iVT4AɨuJҷ*t4ȗ͑ȅ]NWoFC%3­ y )ͷzz'زދ,c4a%Q37wFJsW$<Y
+Z才EŞf>~oVQBdGf]2.}f+
+NޥuP'X? I
+usoLJ2аJoX@kN9d 
+ⷒ=`31ijqqyQP__k u&xI؉]0W `KY <ezlCVRyUi8 I[ux]aֺN |@ZpA
+Bʂ.QáNG2<JCCo45@C<u&ȔGd\`G6q˃]_>_AQ nUp=eW3T>6g!T 鰦=zž|W]DJ{S6" .SN
+)'Ωsp<v59slHPtq[}xZW ᔫ8(!`|2LPD4edR v 0sBLX U+ LI君LWHVyaؐe&q6J`EJyN-,$o'
+<mIm
+C`yתk)a>}M3*{IGDQz}QRpcf?\`}zީyugj3 E`$!Ch S
+
+ )xȑ0sڳ-fvSʁRe7`լ((/rȄI%C*+P"Ĕ%r^LrF%W\Dh!:qT{ eE#I_eKUțptxg3m"/\`P24ep"s6;F[11戡hе#զiD282@xi6.t?M2A
+;NޭC6'07۫H\w^ 2QrK+ ~}jmM0? LI77L)jQ )ѣ :W^̃1q\5j >
+'Jp>c~p~@ŶZ/sL;_x D !j9}K RQYqqlم
+E갏Pj#ANktnK͟OO.,7;
+!G8´GcQ2b;]r !2䢁-Ic:Cb\ѻmh@4,.9 =2$9̝
+.ы/i)Y
+9!X+ѢL]+zAeU
+dT[I2-iG%"Ҕ#nMnx /(XHͮ"*qH#ٷ bz1Ii-HbNѶCHWȦC$[Ux'F01Ωm]9#u#x 8H zgF0jdfȣ?jhp@y44G I]N!I,4&TS4 XG݇SXZ ,<5P$[AlfUz]ig[
+}3b!
+HM\9Ow LB({} r;%=ea.dEJ ]wk׮b~^>g.cfFdS1~h|eAIi!/ڜ"_ [JHcadxoi_1==~~
+7Ɇ(AoW%!-B!B&T@$m:xv=uԱ J4KN]9@?A\z0W|imAƤAa5@Jp$"C1J?E[)h=2 rg]xH1txBE4?t*or2&*5O+}oO-Ke*Ӵ>Af?pZdH"ACQPڔ^X d2S"2-(flȃZu3p#lǕ
+YX@K7Iܕ2WC>k4v ܥeL!cwЂ/8u WkTq/5Xpۧ8im` rgǪ@Mч<4*WylrTLFg'=0#,; 4Wj;A/pKe'yNw鰿v#6fzfgtv>vߛT6IJVCjO}n؆Tȏ}X=#ppԐ"O6^EcX_r .c4$ju4=&?GmÐk7A`;b]FK`w|RLhg8 E#ڧC0-~]L"/B0~).rFԯVz;t 4
+6.AsA?)8" p@@z8|_#&1C}+ u~*#- <gS1~8jvjPJAouMzJ*
+: >s{e0d7|\rD}:5<~E:UKV0XyԬ81';(b-|IO*&"]eK#3ȭp
+?jl'] s5Kc2sy|]1M4,UPS.N:Z;tdۆ>򹷢ϟ #Z@DE33sh+YnkJikUJIpCNPl]#ɾE]phƒ!f0uNo^B|cro% Lxp,_*_JH&IUR#$R[#2M`W54IXD|}Ic4RCu_Enʪb/[#'ȩUL-Gw{<Of5T Eװ~ n60n8Q"lSc3h*i
+^Ul,QN0%]m_%=1sUpV%#z 0n*~Ŭx3*PkgQ4D`,X
+"lY~+oJF`oo/"ݾӰ~PUeV"BK*A/
+ul%[6^Df9$ظOK)?-iܝCLxN[f#p/ȟ:s: RH$˱GP,8*Q>V<cS tyf\*r'ؙLm-TNr>l"<(Bj~Rd8LLn+L/WN75t0fGEfk'*$=+qVgcBH<6`}JriLwl†#crA5}ab U :K8W O`iTox'CVƞ`S#VAE挓
+]-A5";34P8֨\+9'Yd9 :EK!
+ QN;?*X aؙZ+n:dSaJlfy+a=f8
+%mMO7%ؓ:9RWICѧ"SZ)SB~aVhO\>wEDHUrwpe[ZX2|&Lx õ04͗9TL=P@i6C4}0 5" ʽ'#)蹖
+Eb0k`ur7%/FuZǿzѯx7gakH=fKG| \\Z(N4Ek4]buNpV,pv#y"( z:`iXvt2\[aA/J׺p2&y,BaH4ٕe]5kWrV_ (j67
+ち_M&2}b?mkXT\Jl`J~D5D+-39hR x) %Z~"='ҚbHDe"^y,Rr(c`9M[,ر5EwA,
+O#_MЛ́YsbWW(S9;wfgrʓ),VI| Jhh@ˌ&i,ܟ%?CH9'Ѭ%ߘ^XuNLQ%È ]]vH!6_M_n#qDv_B* "1feV`Na29ť+b!U|kz^1TִXXЦXVI`)4V#FE2_On`?*TBC[>|KJ|08]/za42i{4n!o,bH=p[=7XYFNB9 S &ح+H?:7JnD1[?ױ-T@?fIZ6
+U*+ۖp@{>`_JN- wK !LPT.cw<g,bnFN\#{`X,?4jetT$E$mI*s RCbA 483h^W? D"9@SDj槔<]\3#ִ($dEWC69)0𫵬sQ:^qW\t1
+~LSzx+Q$FISW@p4v;R#`SX]
+q! )BM΅-ye9"
+5n2T0/)8 S72<3Ə6 Kȳ&/>|lpIҮ%,fc5x#u$AC2#wq  (F ï, ЋWn˕tmnW"4E5of^t,փԈw&.QE)` CSew!bY5c)$Mu7c7DLsRkSS-s01Gt[cd'cY=+fr˴dV|cPfFx +
+俎_:ݮ
+|nݔ |auewj;PЯgpQx!"`p|%Tv&GzR Dygǫh]*DlY$UQ>st ]c 2oIΉA/a}rc> b紜w8jaepͼn ?NS0z%B-zz<L׷?ǿk@(-\졩Ǯpye<qc7Y==FB1$j]LAuV
+\[<aCRBr]BiZP̏2 #k#"O$YT .M3=RV$>cغfC/1@4#/0!*9/b/rq;ߪ>LEAǬ YP)򮏶 v^ }GoEû]huKzrlH?SWb;I*I,Auz&M"!jR*Sc
+(MAD+m8@b+iN7Pxl?zaW7ٷ$8RC++&8cry ;1J@ BQOiЈ0,fWd+2_fY˛CT+)qH
+ʢk؊>A2X,̓S /b-1DZX!H'QA*QbPt09##|D7Z!vE<J9vWrHtL2c'%ɸq줙(N7Pa:zA}47Jh4km KUBj jx
+i9haV` *1o>*IGۖ~'#IdbޗNMKٰҘ97H8:B]&(yqywVvΜ~ OJtH69ocX#K1I<zRmx`xY܀雪NIeK,D`kiYɆ r  EgDP''v m #V%O>JEk,w'P Y_h7e="h6'wғrtU\S:){'ϙwj98+!R79QGkb֑zӛG2h(0[z/% I6AAϯT5p
+ӤYL'"3~b1WA'!0
+[L׸60ʀ c.T<ÖKzq+2ɇ;nX&K@2f7+5kh<ZbX p~[*K2aBy~X\-Q%"IdĻ@GiLdw;tVw [KІ,
+H9R'`}>=d|c֤w$dW@O AQU]
+ODJ'$xX>'vY=YM7&́z)a ,%\L]g'`7M28ߍ_/urK{3Mz,W}7r!vd!&C[2kN:eHGg xQYo_ F<Rm6W
+$[I+{^(PtYYt2Oi}c^p[WhkT1]: ?d|. Q||SI
+$q
+"Ę'1 Eչ&3lOg86)^AFKWGY~h2'q w`h8! CR fMKbh0/y)BHa^3YM-UuQR4A(}7N/%_8M(?P:%ALaӏ*EDNgr0AViyTib!@˳9wR^ /ܻVV_BXc $a8@S$?eO'uDϲPcH裹\$-W֪jR1$q)&.I}V3:ظz<Y@[vmZ&M6"Fu (?}}~ _Eo_WG69:!|??+W £S|դ|gLk9 w{@I~Ec)DA6 vu/QH܋GCQ] e3
+o/,*
+K+gi`*yNPXg~
+)B|2><#AIG1tcWc IMR`JiiN
+*N6'!Uh\^\J4;@1I:<YZQ@۱ ,I 8S:1.eߙD|gB X>D>=.O7?u!"P/K]WFPPI?^ӧа7'Jm <I'qqu &ϻ>\3YDZoAަV؁&Qb|߰ !n۷ɒiX3R`h٤.LXοȈL\vKSePJRW{E4b1\`>0pDri4
+%&JQxƱ
+~Vn0{}?_fp:\Em3ɼJ9o'?Τ,p 6󣦙9K2,*ݩ}Wgì=/Ж ̃w0|ZNaL:E4t]-FG
+&ݶ%
+U[yV)AK^5IY6M"w}reCf oB;lc;-t%-2L)TϦX}I |hn=Vy"e8<M s~9;L4L;Ddjo:
+ h-zi`NO:Ay˽0 Uam#6(!\m :l2W1&ax,6 +869ttq[ /a³Ss_.>Cpd$kAvg,Zum265dAnǑll :lLe)&Owl򽀧K]б" s-ݔ0cTS*x@V$H<I7\,Ys둏<푣1Edy dw5]b\f%G i(i#C /ݞM?=2 |I1xcv-r 8(qf4ʃE1臝99 dirG`g&?x9<Kl|
+,Y p0f#te۞lxdMLjqX
+G>H\D>SI5\/I]M󔾺X&$B#Ut19 ބOvAdF^SF]ÔQ
+<lsޔ80(݇*EU6Ub 9o8*lSt(lRuxGO)} 5`SB{v VA ZE\@l:QDbi7bfөVyZ~~kq(({8,Z|Z[ARڛh,]uc. GUcPhv0WGϾjɝa5.3";\ߎUS`)sYw5#!2S]}?7EOm\UAU>l1j:@ D쾆htC(1S`?jSfA5h/Xڼk6 F7->KQ<~btbA`
+j0gCE4!ch'łR \])!N<2IJ':TJ 7u~Hwsֳ{
+g+R_"2Weh'GO˲Yb ^-S O̩ż[N Ag8$jƳ (WEN>xť)_Sș,CS5|/#mE/XA3a
+6yؘ)64ҮK<#Ìԫ9tPINHXvR>׋9ո|SIV/%!coԉH8aDiqSKZ-5ci
+AuEslJ[udRrGmZ#&YW1ԣ@&寧9dˠeWS*lZi֬ջFUjJc$$_W?`>NCCuF7_:hGY^!^{-+!V[-.̵!W+]`Xi*Yħ\y`e۪Rm10A*8d3*ԹqN5im>_jq͐zRS+KKtyÜ*^ƃmBm}G) kBDW1~(⯪jX"@橛Hc1H`<a#QN+'(ak>&ezO 3B
+ ?Ϲ`ALN߯cTvzv:vrQ}Υ,lcG0@Ȼx<6&adB$gN H$أwacA6<O{0Q 3{~̥˃1Ҏ
+
+J%5N vHu1RN.5s^Hxs?'KMg9!FC-u zyyi_2oƋ(!wnFN D~Sq.ZU@;
+%,ˋ=j&0$cGty5@: 5})s7Bl2$|mrD;J\{Z!atATXf!:=ǚ=1NIUѭ6dͱ)*NsS7R$i(
+q*ʈ/#X`see\ @T r} t) tor~A?O! NOM{ u"~8µcJoL5ư5 U^Q2]?><J69 (̘g ]HF:Ϣ "&97>B)
+&ОC8\\0)$C~w97 ,$׀$۬
+XP#N"lvI 25Qjѿ>?5<z'Єp,yU\(lF!0ޱu:ۤ}3`r[q+k1C_;d,myxxN<À^-ad#O!0:dҰE0os]b@GZʋbDW Ă >Vw>/ uwaQ\6c^g (6rÂPG(4!,zȥ[CGL@P!т/+xV!Q+f!`NQ^Noo( H3q}$zNNlicT?\a(IXB'ray5d>y' 㙮!q1qsHM1yM.&@Y1kN!6.SOBg}s}XC+CCZ|Ixƴ^E)qw [&}u{/߆&Uv|2[/䋧%S
+/Nlwޅ"3f"Y$5lWɏb-3&g*\ UO?2i}G'[~ý^?MmaPCZ^]? jU򔊉CqB6 =Sgn-fd*CqFVvʢôJ ∦aDјf.ƺt<k-HR SZ1D?zHʁOZ{_}h+8(X.R=`>#W[ރ%mmLC0Jӂ$-ܐrk1̍c|cmE8@|<A}xG 䛫SҋQOre`MSz/eGDƌbXֶO=
+2@W>Y\Ui,S<DA&! BdI3T={vE:+z0Do Oݼ=S& Xax-z&e\0;GcTx}xq;@ft҂U> OiMӻ T~y*a0B=EipQ!kv; f\hP?t8il9i(pia6f6%ģbX7n:DRқW3&6) br'Ă_W7R >(( {td{BQ5 uTRP%D]!124É$R|sf0W( 6չLmCt_+)+ఆb\'/c7
+pW]M8d/Z,
+&k5r\o~
+.O|T;LX^^=V"?s=~ԕ7deeeYh
+B`aD=f L@(ƦzO{+ 99 Cߣ֎+U_hr8ky@xp?fy I @e3B)s
+
+)ߺ2&Z!W8|ep5" Ydܔ}i2N0cnpҦ<͗ႼEqy5@LEɘwEpJT!LOIJQ}m|pqP$t Xzxhvp@p>E>"UrWpkĀ6l#Fs4^#<s"O} uM{CEa7IPQ#ao@H}A$҃! "Me=^,;ocbE9膩 (d< 9~@+Ҵ!SAhA,XHc_abyk$FbrS*HI,6C[0*i?տo`qxCϓX/OԘ`9 #톞[f!tnHc+!o%>e< tډly/ x&Iw)vx
+ .֧̈́d *bmBZLtuƴd/2\--OA]a'*9 ,,q.y©J@B` 6OEO3XcNqc8\|`n{Kz{ߟ.Ja6 FGR$U3 =8VjOM#)N]v
+Ϣ"t\z鲧ʋCՎAE1hu|`. H$YdIL5#hynܯ1>k$@ZD2NMWŁ
+fk?΋@wI]W{wAP"tП %Okqd'ƚZ1NsM9).WF4PhRh7Co ڽ+ 1RۍuZÏ#ڋ LMu|J_kxKtC,d$ T.. KD=kFA_#Q}e6B1S^rX^`  r Gd mhGxܘ/~⋊c$EB)U4X&FG>l&.nѷu{x -c_]ڰRx1J%L J/{RR).HD*ajW,  @M;ѐa؂*Kab."Sb ?UVu?pa%dm
+@t^A%WR֍I߭ eT0!,[g~9քP DR>onT5#A5=υ
+| z< }s$;9,6&N7+R[Mni\HЇ:fNd)PheFeALs5ʝZ[$[3)6H@ w*Gܱ+aJj9j2G+G
+e<,Sn=׹%/JT@w xO>+;ϋ?AX kϞ_=b'ي݃$!tlfIWkrSeҖz2{ZfY J+elN!.r'`<>d'i5 &"v5W}x+43PmȪϺTk/djdHtTkRw)4 1?)-H~. re||3A.pAx
+ba dU>xַv*,DɼDXUs/CyP INɏ4:t΅F9hAm!\JgM8WNORڭ|8$B&c׹r<44y<C㧅DЭVҖcĴ0o yEg!lR]N ?
+5{.~ W< Z!ٓަhVVz;Ü #@˺aq{teZāŃs)X
+-3r o5>9_BS۬yoqx/M=}#Ĥ2bh<AL*ZUĞ|T&qbdBR0t6UU
+zF< *?ԫ +fhH ؖs| *`4@WkSBŔ$'zZ:RĦ'XxX?wO]&j ##+ N40|: .զ… ^fCVHFul(a$,ұk3TGaz G:wd(sZ>ta'ĉ~b0I)ӡ ;D9ʃ)/nHQN@Ft8*q쎯XY^+!Z4-'gm
+_`JD`DIўT<to4jK4wy2j<ul3a&|*0Чďw.SsmNM:]zգ0]?ǾQIPOk|w'_"1Q@L%GE:eMׂ0>i,Hoy;H?L3
+3
+T%%e
+Ο)1ۭ}(̸ fv?VO@2_fɄa;#5q 7*0&$ߍ3m MtR8`G\_& L&.t{;s3C?$+%B;ا} IͳτDž׃n7^ bt^Q(Y - ^bdBbN),+hA1On4I`,7p`ppcYpX(KH$
+cuA)lU߁Z[ÓCX&t6&V67oZ6N]=W@D5l#]g:a#
+#TCW 9f"1b2aFDb-XYn0C_ZD`T-=2K<I#9QYS0: y6/ bAWxW鮏 QE0nC |ӹU2LQmt'N9P.\uu64$U!vs箔I1Og;EL}:C@%?B4'Ђ$qDteIB3ץ QQh`T_O—Q$3-HaιjTG]@Tr}Q⳼0eJwJWT|%暖SJۿkxb*et_cwS۾l7T2.O@\PSᶶ)],K*U3
+[iP[<~<iqL:y
+CɾȪ/,F!bz#ӄ&ǒN.,J |2M'}kRbD&ҫBCћ B"gx~*~rI,RJro dbum%A'; o C2H!2^.IR0DɶYloyY;n7L@T~@h/{A'az&lɛ~]&3  9%#_6Fm H %7ېHژq~\
+ 0£8_;׬C]b0q)GK˹KʯS.Mʪ` ] ]^w%,Y;OPS̋K+v7pjޥ^w R
+t(>Ϟ':nq<1/m┐D< +:i"qT] @^ HߏKVώAOg죜
+AAR]&uyo$Xmf4$",dI,΁ (y% eNlQUEwR
+HAd9
+DOPw 7!urnfv_5S,XT$qeta-Ƈ+͆YF\) #F1FA%n7Ĭf õK}:śޭڂkO9BO9']}٣?7HEtK|H37.z b"! 4 lc6y (GO5R+?C>ӃjvxU3&CeiU{Y)"TB I^Ʊ}.IlMEyλ{Enj 4tpmj
+Ws/ּmݗ72aw^1z #]׻Ew8|縑 (lP6vj)MnS"R<֒:uߵ|^/ŏjsu'
+
+7q^>`Ƌm5 .HY%+I1⍏PUС w1o.LKX"+|i9(dd!W+$k*=oH\q $6<sĸgzZ[F}UT&%mdŬb_Ts؝oNbSz*VBJJQSh%LE_03<=B*ydz1$aRQ?~U)CT}4Vv BGh/8{:+d_{ΙkpՁ_s脯9c5^֒1C^yOh9h+uxU.=\ 3'㰋~e WڲTGʙ.X^1TvAVzXsTҨ_`FVߞY XwOo MUq܈ɎGoQFق)TFHb%,LUI4Qp4;zl8KY4Nr۪1=0
+"CᇩzIPrU_HQ|ljYzZ֨!__ߡq1-Ɨ>y”ġ7[DFT5Ƃ<J'Z_x_ּAu֎$x=OY(7hcmH8&i0cJ
+hz߄̜m&|坆a41`t1k#a Zt|[dt0Di#=^ S86-U6I=ZI eK
+ R AQ)ρP˂,i R.=j2*eQh0Fl#lI
+sAG ƽQv>QlnobICldԜ^W5,4nnA,,.l(7$dEYLr:!i'ɳ6{="]ZNde?7JX66!HxʋdFy.Z2P)WaXhͲaT8h8Bh:cX6`|&h?ͽCBD~M5-Qj27A@7*qB>tB#7rt*!9lR$AֱO&ۋqumz8IגJ*v^"q($vL9jnaq忾1Ͽ2^&9rI=PkyX
+rG蕒˾f^AC?}07zyS6|D_.@CJ͔ך>`Q1Z܌p]i}Ai]'pt ;Aud%f !LL:TP9}+:C>dHhvu$Lܮ@ou)ĀK?=Aƶˠj@s ѢuY"JSw:1fðYw?)xfZz E0쎪PGILց5N
+0l\*mâ2XƠⴁ$(B>N "1`SQ5:Fs37?HJ5~D'8M>
+#;GБ ?ȆԊC-{/4G
+Zk-[<E}> }v~& 2
+ J׷r2ޒ9afR"wr}]첍KG2:QQc/uumyJ/֩#tmVAiM7
+7DdϭxȁacFnRu2AI!(Rѧ+Gƽ ĮD/7}Iþً^70ڄUf"ňePGnYȡtR`㦾Q'$̶ 1,4 5= <~6Ʀ-R:כ4Bd)Ch_ (dPRGYj4^{ؗ{3%Va-^ESWrsb
+
+#&'n 0>(M-(chA/ w$>]9զMMn{Ks!=Dv/nEJ`2xR>ʍCPwoKОAH;RϮ.~c9L9īF]?7;;ncɀdg0
+.ˇdcL6p>н5E
+KA\<U"9$6`eixW}.ak#7Ȋ;BA$Y
+<I{Ès }d 3y6p]xxنcUa(6^5&2Bgc5dyA?z}AAW=,r.8.<^s#;++^dXtB)ݸK4eAf;)okLlӵfӣiߋ^h' j.)i)X==F^a(#``N TLu1 d7@CDpWy=*&`nwAL`>Qn"EiyM 4^ &&ćĸ9s*O0{.wi@oȟ D'7ޠL,
+ɟY{:`Tň)><7-}Bb0!nK IÀPdcV8.&mצ;
+j2Tye.٧LBfDi.Y4 zNN^+ɼ?9U/@7 ؊K,eI};G3^P6ޝeU?zXCy)?Ɏag&
+h^BYZfk3O 7o#sO#+o~|qZy.΄P
+Vb&9b  bfdmLT7Tx$Zpr_YUKy UNx(ۙ/;C7/tWy?BFg
+J9|v ,?U'f:%l?u,L[, S*Y|/[U6_Eaо\v(Hʇ0?nWǐ-MLm!'%:* j#:04 v_ԺH'\ %sڴI8$lT5'Q+դ`ZHVOR3I>%:[Y<@L<bק6%$+VᮓfI)Af{jOwhX1A#X0wHzx~g$NXQX|M0-Z.ZK@IDU~xMNjܘϟ(uNd4^Nml/0IZd%2
+uh
+K<d{'d@Q$sR_mRh
+j3*VWtKD % 7_?Yhf$pܮ1F:)]G;`MM(_\LNţ4-_}0dp8B]*n mOMIٴnoŪ0u><E 
+_|@53=Àns
+s j8jpB!B26b@D|;8
+;kXm1`dgZ0SxI[#Pay+]wd"qɻ:y?1InR KP-JSi
+DrkgӠS*$rqsˤRMPOM ~tMqIpd?̶$eW'-_!=q=;Ocz!Ohx7`?nfPDB
+tB JRFNE4P7܈q#*io`{4W Q67eTSL3]FhH"bR7+!]{lSrWpa\vۡ2cfLct{#TGPh𑜏?&Q:@vp񽙿e?~߽hWGdga'&YpQq@ØJ9d%a4v+fN62
+'"a wa,Fe1J.ho_VIkJt4Bo
+wSĂ|<Sz(CHyOU̮&06t̊ ^2R~] 5nSp q ?o2"ݪE*uQ=I?Cؠ> a(dr"i
+oF͗=yi}K= :\mXSum`qQ.Ƀ{f Wwץw0u5c (v"CD{Bf2qu6^#S1k<9Aݹ
+tZd ׸
+>G)1(|qL8Y;bq%Ǝ?qz-qrm4#q}]fފ }p?.;BfGBə$Z$YHO1 BW֢cPwQl1p QES?}@ S96`
+Du"-8Bp,"h׸>k¤1?
+fT$X4H[1C?tlH{Np|us?ue>?hCh& 6F%)GmAҍ:tLY=ŷNXP|thob#h1b8ζSeJdA4w_mP@2[
+@vgPt:a"ON;%iv"8O p-SyvddH]Y('~oo .ceL<ṾO}>,N\zMoo* Z
+3~x#WQte00e
+XsjOx@;,KN?29/}W(>sمnch4|u_)/^k.؍3~w# \hDL*..UF~yZ,G+Zڭek}$ d)OUv:DLo!4h"lxJ N!݋>N8%i2HCd
+O]DBAJo!tv0(V yZ!y
+-^P;H&3'`% ))o*M1J@]flDWңRZs5 F /lf-VZF4FZ+Eyʒ?^A3["KBiu$Q+:c)l@+!f/9
+rC絨QlOPԽh
+LNwmF6r(s@^l+bus!T
+%Vh0ԿE /d|zmh7g-n%%$vO&^lHatjGf
+ȧr4"i3P@(!ǰ.3 gW|)ZXRjh:osgsm9[|ٺo|g5"ňރb9cbmCyr-py b$2V&#3J7gQEVm[]M'3qˆmWPpZ
+
+t""Lښ)5%zl+<6,$Vsu<xڛX=qi QGP|h)J )kC)~yZz,7!!HR#M%ȫasdyԜo32>֍SY*3|>E/mYv
+&<su=$q,zT6%` ¥]
+70`Ɗ@z)è^i$RqZgX95I+U0}
+E$}mPA'L,vNda%,2oRd]l})iΊ"\msa 268eЕ(Xi:[|Q}dHPf弟"^8KXG,qB^ZIp7I`?Áxp9  lȝtw ,!%J,{ޅƋl< QdR7%PT_#Q0)<eq/6k>` bJ7Eʛ pr8rD<Y|adB7Se7D|`6=%>L<]H'[xʗ]ndݏ9u^@M'ҏޜ};i)5C/־.%JO/y-x<T߭"iQ]򱷊`VL⭨&~,g VIZƠMbw^|dXl\u[>3%ކSVЅ^ $VR'##ʺ})OAN8&t6 Ta>'3t9Mѕ D^ս$ቢ9QpFaSa簌i7UR{
+qwY;(_iNx"VcHh:Ǽo\$5<[<-sQ%6"<n,\GDJ58>V˚R+. S!ܣ)E nO% x6cB}ywžݬ\*d̬*; 52AQ/<?4:/!TJɼ
+U_[}/xX1t/;z'Ӱ FG>ȤZ1|
+*“Vi݊8$-; }dv[:BAfs xZ] ^KO\:tKnu_͕<`@yeSMme@'6mw}|Lg
+)6l&77 \0I5)O a4фAU{nMP8@
+.i)F 逧Ev]Pϔn9rG0Ar1zߧxO`.`eR_4L$ق8E7R`G0KTKqڬ`\* f+U5R<^0 x^*P_V-NY.jb Ž@;dzbvi.o@7N%'C;2Gv_b%VqI^@YtQ!:8fW;%ԡk/'8Yf쒬`cfd PzPh/˽9bmj >ͮU昔^|0zI٨,8*|t`@X@ibȸ"f99'qGӴd^c>_jzZJ ouC-I <۝^eDK4EY\Vgo+a85}ewt41?@*9GŹ!JI?r8 O3-y 5cV2B&VҼظ
+;"aw>l=&h}=? .f
+f5gg;m@ /J=ceSD Vc1?w[)=ꋊhYAҚFi[vs
+ )/ ( ޭNa\\8;z}P9*C^Ad<0CV1+]046"
+>844p<'=?,$h[ qPO=q"AX Qf(|l u0a>u Go &-yC_ȭg? {}f<K8@6P^&zYek3P5
+?KSrhvكc €Y P4`wGAaBbx;~ť]`[TWR22#!F |
+W~b#:q' !bxinχhWzUB0N
+h0P,|Joښ=
+>!kDI
+3#gpkbA(_,15Y^%蛱yZN!&t[M̠C
+A* *u_ #O|]<xdW+Qt́x.&kHkE.R(Spsh ZqIۯо[>E΋mcE0Qޕr`'>ԡX&霢 |dL};nD nb W`7 jj/DiQW{TK
+
+ݐb9s-%4&br"gLBWD_:.Ȯ$`ʆ':UR*+
+,kԏ՜b:IZ"%0)@Q,w,m.v%֕x!h,*?8X& R_S"xc~'V[3VqJ9G|g0"ȉb39cGtY
+U
+GEq3ΨQ8NnS"%FY HoGXOT!3 =;c?A,[HT-r_?*U~ eJ>_ Uq S5q hUGޒ& fx6;XAmA]PC`z3ƿD `93d5'qCuaOAZ#Nĺ {?F",ko@a[]q~82
+=N$
+ZdJns=x 8ά_K|j՟9탘> ;rp2H! C2`)0&֮SylZN|wLZKQU=O%?\M̳<=5JG U 0J,u6!4b$uڤfc|ѓoc)vtlJ1d|t2ICWCSvKF~ 6\X@-ⱈqNiDZ C4_7A(~1r눉 eI}Xp
+7M* |pcTV d/AۥsWB Zk(K*c$z|"H=ɼkgFsPz r"DA N]ճ1s5PA'aQ My8λD^["{ޛe=T&,堃 'fAsO/%ι4Bm(D" `YI @9͟ mrDև%O6(CY-D(QOɄ;/ xTv Jm;E$s6z;C o @6|‰;avNL@\ Z3t-y8.1Z]Z}z҄Lx!+ʆ0yon0<$gȞ̓6F<ez(#
+qDž3n𸇶'9 GwƟlP0#z <|' 5dCcaCPTf;y ,9܈ꇨ^,3M9Ⲝc[[(z\?_6c6rPHF^d-.L~:'4$#"ܖQ="_P
+dA}Utɇ°thIqò&Uw(^ݭ?p`8 b!e~zd)ɛoä691 p)L|Wa8]8W`*=pW Ÿ@-Yg -|
+xDWi֔b'b4~έln68~-U4JRjkJ15;6* AP.QgO+) !Yӫ+'S~oBRSmwcF9B>dy?JʍI+G:MUPLK^B ?N骉KfԼOw ?A|T
+6@*}(Q+2!"Dw<BlHOO~XUzaEIF(HPMAaV)jף1($PٚWBta'2RȒ&ZOSY YE% -qYfVV,$?2J}71RA?$/wܪ {p'DN̄S3x/~ bLwuuʆ{j6X4dJ+D ,$TYUR|}.e'fWVGK*@)U𗟨_O/:89g'VK3 41 m!<2 <-K
+wQ
+g6
+tx@6dP:~(ue16X<04,sSeOB<_ .kuˤg2mS*I-hD~`F@jɳ&Z]rJ@ &nV[LE+Q-e|uNfW\n| cU Q~3yY]\83 M}>%?@-d"ˬLAT@VN#VߛGA\b]ؿb(\1:e-d ϜGR"`jve^m#`}Yl{
+HMn\9 O;)"מen`Vodԓ6ıCVKRVGtV$>^jUχGT[ )-(NHsk^R *")U}4)6J(>*fu!̵G k?NpUKԆV
+Mٮ aRհB
+$s;"pBТJ64Cu tAɛx_PQG/]& 1k{qTi>(耚)4eLP@oEjA35
+R#؅Mo5)3lL: 5w
+i^У|<6Py0& zElKdgNƄdM"e[[T_*mA]gW@ҽgDGw l:qdteϘ 1Q:fCmRptHK+ԷֶM*ŀ #8:;ܻ~0$T$#7qoOx6pݪ\<*U:]O匵VF
+:w͞ 8- (
+=nf*f2%؂n78h
+˶ޖzcؤqj,pYE ïEѥdnFӚڣ50C&1B*a
+`(ژ~ڪ6۫u!>dC0n%xd٩yH9kǑzRKљt0/YH`>J8ukm#xQ&8 ؠ@ΟS9ߑH[[(!A_"E0alJ}Doz@z[ RJVE87
+%⏿iDPU2 fCbSz]xlDմrGW1!Kɱ53r`׃۰LHgP148p?1Ofj* W :!d1$}qjL@Mǐ"̦6K/f \ǼW2aVY;\=:yRNuuu㵪-Q2OluB߉X'kGP;cqF;;N}EWo̟ȹ<|`dM-?q9i_63Fdz|.Aش],,չ14g:7` ʴ LLs=hq܉&WBٞFUlbw#iӌKu^ Γ2! EQ tA!nj $s"R[W2P<I:+/s$IKm.llжsjyEG&]G}BZl6!1Jbܰb֑ɯu-Ԙ:7|]"X6&-FI+3G:<bheE5(\eDN2g5: {}8ZJgE9cVazs<MRbmY%g+ʶ[.$I%g!X00v@n6mz } Qi;>Z ) mVS-_ 11oE@LTY5d|\^eHIg1NYfЂcT7?Q1]$3չK`z׻hnqrso,-~ʷ$pVeˍx
+f2{}C&Pxmr!mu_/J~:'g6{@pPrŤ-j+ !G52nGd4k tyZcCKMSB
+cbE>V|;rx+:OA=r _/Un+%I%mG kS8uإ!}?TGJw³2G2)b^!|2ҫ>|)_Y%#F:/ _!EPXbބQ\v@c":}lCr^CE smMdqS[q%
+R: D։/q#b{o: ^Ěy@{9A2̣ih}S>A@ ,Z_/*SD+qG\ׇSwX_f9;Ӌ3H7X〉`۴ Bc?FQĪ%W
+38HkO|Bn\^g?3:UVodmqNՑ\C̉Ę[ . xP`J>[
+ajUk5.i|
+-@ (Čs`1T1|Ţԉ_ׇk{Ƈ,wpYZ1HB>|GoԗEM>j&rG7s?4B[ל.DW`)F?&$r:-H ); xo#䘜 xP oO: ^1kμJm<'9xtL!%~[ wU& xXK])fn Cʔ
+& {`Z "(-_כne=T.v=r _? cxZ!yCL'uZObձ.>]Iv[A&৻N~7J
+n H)2
+ c!H,ӂ827^_nrlW_NYmӬGTR T trk) )O/>3и
+O>C{p^Gr7kHv: ns(D, y_K $˔HOrFbKrOb -8LVZ Dny[=ǏE2K&! įk需on-$?U^b?,Q9,#gʆt3K l >7ě
+yVD997P/ЁS]8h>L"c;ֶGփI/cy?%Jxœ-j~һusھsag:;W]VÒX@dDY|
+RoBXҋjk'Є["$m`.PP"H Ru;BE*B܆S̷@zh1`HqZpIMU>Chɘ6Q&)3
+q"B,欥lI}c->S?|]lr(/wv&\djC*3PƧy5aμ:ϒZퟢ̷ji،"/B@F K:D%vU³~<lOMZBGSb!=+x?ˎ@k/d =A
+d8?q)@0|vTpVlge9Y8cos%H7+sG`w^erjRYb+O%lvθ }̑ Yq(z{PaW*&fula,َ{u;.eMS)
+ti@WMT,2_gq`4?& ? zF\u';|0bɱ€sբqy$0_'j;d#mbb7CPȐ/>a<،|@,|HdC@|T-Mɇ%냒Z9#
+1~Ky}{F_eQK)
+~(Mq#үq_swrb>"qR5Z1vjޞOmOw!Va*XLCB}_GPjƻ>R̖ q0@WgXzvcdsBEoW{[EuS3qAE`?!ak&c &L}
+"aQ+pdqXJ v31FkD Eޠ3DS"p3gANGG-`.%\ ,)/8rXJQ o(DG*
+N%N ;(E:H>lIzPCs$HrSEwF/&'E{/Q\&{?vWKBtJd`ȉ ;_9*EH:8ǽR<UB~|d/}͵Av!v+S~wP"YQvz*fb2c$OFU0)3}냢 ̚&߼
+IQ2捔x!Z-d3fj_%NIo]FY ;5h#vIbYĴna V=AB``#`@>[9Ԕy!ܺ*Gcy968>(W }\J̐$XIA @cT%t2\T hE});X11r$3l-J4|ĦͶ]b;DuQRLRm[^hl;`ǹߕlkNE~ʐq~$6
+w୑#P]{ Q:@o&Ҿd~FLL}&[yw%J*K
+X~%" @ :(wk2*I _E:z$)gi=)!tҜ*8n0%̛~b{ xA A;CJ-ɾ(>N%\0Mغr,EwDO%-zqSQUFPM-aMX|N1Daz^Q5
+ 2`K*qsZ>|]
+qʖkJLj~T藁Ճ>ITX"*F? # A0oM 4@IS0.<Zֲ**$c$@7"hqdBm'AclY[ z7/ y% R;8|?ek`C* J_Ȉ*}%HsQGVƌ s_E7U֮<l<'[CBI}6
+Vmu du:ƶkӰg ,:ˆ1JX </Z'K
+I +JHOk!
+$?=fx
+XekMJ_m$Кg+R;dp20ZI m7!t.r0hpT㼢7Yqt"\p<lD~;Z:I\IH% dRֻ{RIO[4JbaZ,Y<GK" oʐ{$RE_^e9[
+at췧7:Ifl7Beg'yI,C,QfL?,@1a!OSDŽu`@ z"Q䶬AwYڭ.d v'q»,,ߊDFv f@^Cїl`h0?y ;
+@z 05ijЖ_ee1=
+k?~dYoKGerj)PNhɎ}@Xuw2j.E.b0uK7w۬T :,_="I3>(j lC|CyT'0*ڜJױWEPMUͩ%,$a0ԓWC ܴ5"v|mkЀM X@;;Vd)՜HC)Ul?*VG@(+adI"[T
+
+{:
+.1F`[аkw02Ԍ\#%
+/iLL ~w[wU!ذzÛ=&1᙮Dde%8mI現~m܀sx~0|ooOFnLcQ"EhϺlC1*`,w}97o p,շ;}'X}:F`e.wiM7u 6ZYsy[*
+u@3%)1 s
+ rEosz(+WVXIݹ)
+82Jtdc%be  IrK]GʼJFT<"X|+ٜ1 9j0NęvG-9@yĔءq%
+G(@&j鷵"9wI <ICz8cd,I"Q׫D^
+.˓~D
+Ri'{%gXR4qϑcQp}.R+og/!(BQga Pz8NCr
+džG~53yThmѣNv[3}M5kJm|D7&H!b01˖ЕTLR [2||b6]dHQlAmB)L2JlAclE0ߊuР{ ̖39*U莡dOGf+mi>L+&v%AGmCDܤ!ŻM\еČGE
+oYIex!/8#CʅKyzHGy6^*wp~ 7-t2{) oе1%zwcF#%ib4T‹3}U>O}n CGi5dhk^"D_0|!sXZyb^$-'q0ڱԇЎQ,`|AG)M~FVnzֆLYJ0#bN}of
+(咒)aB-ZCJKwhxUmg:ا]&%8_i,,QJ*g"jsާ}(T L.ĩ '[IO mE(7e@-M(8[!=9j(8 ^E
+wHev~
+pe譔w]g W
+LB'4g0J,ЙE<IXYE)<ZI
+(`l'=E$t'ڨ֗첔Z貨#C{aR҉~X [ҫF򄘋
+it#HKUqL /Z*r՗q>fOzEݭ_jO< dGвϟ;P8 mr-=l 2mB
+^!EB|R>G=E"4!];XXx̏SQ3faEOP'a-G0Oe e1 M.tKK9c.őhRCv#T)v1]5pl4n[X[bı3Ø!ibզeV c"а×P
+Q5꾚+Ϩ D;E*@@)8!{9#6l܉S8ɽP"A"EI-~eĎ"wJg1I"pa\pJ)WI oBSER4 f8+ zJd,
+ JgXrYV ވdeS8E²˲2.vZ/<eo<d->v̘n$,
+uݛeɛeѓeqTYAK7&2BeY=15>2J'{d]XҢxdO$F`<,%)ME|aYD,E9h'ŸY֓`VɈv{YOYIHf2|Y5/?rY0\UM
+Ϣdqlޏ%_Ys*>2 6=@-#/|O.6 N*3#y3-USWiQ)(.3 -Ss~ㅴ^Hڎsz|!!)wʱcgz JdPUO]|H~^`_/J313?{[C͑AEG$& Lq@!
+:7<D
+Д3kCaD.
+rɵoDUc̉C@ [:!ACtg+woU<|
+Y}BTx=ϰm9gJ5g'=&~~J@h"͘c۟'w6B Ѽ u2o% Y<
+z)I%X'݂d`Ŭ!X!qVϋW뱝`[Tst[ޅCjH>zJR!B'$u #nv=2ٛn750n1̞Y>c8p|KVHՈIL0x4C)x0 3w7EQ3)Ȕ1oE W lN̳Љ,pMP<`T`وآ.emUx&h5]ƟjgQ^HH=Aߡe
+iXHkTcUs
+ krߵz#i!lREl^]$6ERp:ʧ6t`km&~(cֈuL˜ 4H4+x11}ܢԚ[꯺L#k
+%! ?mq4_%ݚR ضf#0{DT~z=wɘ4! >o?{fV
+q9}.&eRL j֙UDV@⤝Ĕv.S?n@5n)>5b@"#hǠ_Jm6vNS"n4)ʍ(* xЈB~3HW@p{4!6!(hOX.@!U,S9\Tq_簃Rz˂ཻ]]]
+t`7, \0Y+~: .RMݩ&`s/FjF <pB9p;f%Y3D6=ү H ˶Gڭwg4-8'IX>wf- Ts#ozDX: o R7dyK̺ȍ #e7j[QK蒚9)o_LF1tLV ~dW
+JqmZ|Yd..
+2(!cN1ܰSNlkp [W&<)l(Wa [bM~Dž)d [;Dp;-@m(^C6dEd;. &xaKduX}9l+CjV7l:Q3a2^Ҁt19K[:F-e+_i+:i+䁵:ڝ
+;IL3˾3%1Xyd[L Rɢ\ l^: ˂@2iC嚇g@W ĝ1"Adݼcc`fG>ePʊsGłG
+6C䇳E{]`jeVP^'
+@f
+0C32g`aZYCn7ʪIGl{~Htyl9 H*;CCf'́`fC)71#Lv8tں{.0)A=`Ƚ`.6
+K(N6 z$~YF~Pza~؉ckd}_?!l7R%)A̹D$t]xR]Poz&
+%]<y-0eK> <Ta)slv
+Q~xv!t]@1
+
+$QS"t NuB(*SkO宏$7 "C)DFk$sbi vn~b)md}
+")14ٕN%⣦9D
+7鵸0sW8aN_ b! gAPZ64\Y!q*Hfň:Hsd=e&P9
+YuBI-[02-xttBeS>Qu@p>5贬o,,mܶҡ 9!\K bnhfNv$Xf8@J`!DŽi|M6+ݲrαeQxt E+ Ѱ<)cG'Mɩj-@z}=,~Z!_cҫ3w 6BƝtmݼj{WD%}Vw*uy532Vn^
+LׄTwvA(.uj &HgB(9s<NүaL# z݁'aRVρ@Io71@QL> 1":v 2~u=FcJ . PTcQ ,`ߐގAGkJ lHg>y:EIdǑSgm_HֹO]x,A>jMi+S9|`펱,$+ls=Xu|CЧx`p"Dh?p p>G>CΘ"m%ۇ;-.D&Sx8 jgzٝYDʀl "^zh\ɮТ0A߱$ȧ=}F,$%pң 0sw䑅5(<S6 k/*d#Zݲp1
+<Ē>
+}ߌ+ELvlh+[C]a_zm=b2g4.eh<0eb,FW֒W<f#?MvģkF7Z; B4Bc~078DV
+9mR|@xkX$ol Wia LePg0℈y
+0;ԘUڤlOfXQm)ݤ s 7"NSL& te[.2
+'L`*}b;>F(x(QMhE4Ŏ `3@pC#b< 0>tUq"dQ}{ntȯ-TQ(h*hF6xX$.\H|wYbd|D4Eh 4ÞȚr +*̲ t[F0: k\2ɝvdaoq/1mʥϸ-a;&H[%ESH%7sf$!ϽakS,$'up(.$&B=/ 2'{nPYьnQ]
+ NkcnxEkrj/
+7N);/U8C`DDҪ; ES鿼`‘, ӻ^8 {9j>W޺0.{V, 6wKv/Nz!|GF5( h
+i "2N] 6{\5_:6DHH{xZWgtbn@]nsƏ_HoA-aBJ0p@6.@oI@[LK.82MϢCR\cQ&}E8g$ " O-qZ*k.U`}hZȝM`%ȜA@Ld]s@T^cޗU0i[ه!XvhAJM'TEm`>zy<W3jSԠ6P qoU߫섆{s.=mvWf^g5v Ohް>xZ+8]PĎ JbE0AS?_D}+'Y]!H GQ/zǩkʂw#JCѤ_K_D2*G<}N#O,bc!
+ +9tN_6iEX6t5PbS
+5zzKRā8S+3SΊ5el:NYQ,\9G8O
+HMr\9O;SA
+8?~|߄7CR+Mp֕pԅ!_*SkV{۠`_
+s<m/^ aZm?Dv.Kz@\7Nº!6}ۇho^D.խ g#n@M 3l9Ru-+J5
+i 95~Td<N6{h<V7"yhFl?Zy!@Z9`" r(Yh*c/=Δ"/ ٙ cEh4HE8LAէsZ;6TE8qsBY%RxE H r+}
+)>:\IN)j=PJy!OR^yq3
+W[#ok@}i 7sda$p<n5bo7'oiH/(. t>Ab3ob@fރEGOHɘZ__̮ZQ|w VlCfOedRw%Fiyc*ț:}VNs^`eB`[}9!:X' ŋa66u_x!&'CLW$>dUWkmA^X-ˠ #z _ġz6 w*6jY'B^:ύ|{ h5,!$Vf2i17r#:&3k m@+/L4GtAXA~9)pPi B VH({ɞz*&NyNR5мP| B3MYZU71ݵ,5Mm d9 >!:;b媘/
+"1K  $>9Of/;
+A4?Ws@}m~oVD0TC t* Ѹhβ(E#W#ǜnyX5tb.c_7[ ȚM8\e/`Ѣ rXy\p l5rեB0i$?F@}U9U6|φ
+\7'R:
+6G^*uCfv5SU
+s tœ)XrqmrBܮSvp,U"9t\B䬖_8g%'Ab`j`Es t>!bb(fFd'b;L(ma\{&jAK@H4$ ڶmp0T=.fsM-Si Pп#gx_>% C_:[(0@7YjXO $N?'(Rߺ^*I@0Pq:)+ vw5K[%mw>S\:H~+0Y`Ӈ)XC&ˠ(J6V˯[Wzj:pAZ֍ϯvտ\˟ 渲QY] tRy1h6_Ú<̉\u6G^]Nɼё4__VIEF4}V;~xnDouIG ~2+ `gOTb墶 @=Tۅu♒ˤr,0TeK!9';L/:2^^v:\;Z`U]0I|tݻz°iY(I=
+}bj1l7o'̡K>F>|h<W7dBn%cTH[[哟D_DZ}HgrMN˦Fpc Fq h)pğ 9[ßs(ރ Xi䎂y|=dt؃7+2lDXS=Jaab a*'$==Eḙ)_Ξ@X}f8<I;p<"4Z= DEų**9vҖl=e1_ԛnWpmkeA`5lp5!gu<(+t$0 Àr‰C;c5U*$V+Y`H<)#')~Z;
+ڂJJO8ؒA|E3۬XqAS>0!0M|,xg_PaFvI[GB\صțx[1kɊ=~
+ UYZ!l dqȌ if߁`9 9I)Y q3MlϨs3E;؍/FBp% uTYT[1lڤ QvwG'{ך"g mٜ`#m}
+Il##c@CX!B0^NgDZeX 9Ôfx8h?A0n.Q?|8~lSnN_?/ZpVȫbV{"hKoxcKZ?c_9*%^=7 DG- [{j ʔ͠Tޭߦ8ȍ!*>Ak>,EPD(2"6ehPa; a)x}/Ea*e7M:Q&TW{8άY`BjNe43C se o.Ɔ,q+ՈJP6Æ<sd%ʨA5>|<wohUۄ:h-|8`wbptx/SLjح3uek)LD /岈5 !KB =HmF9׺J:p8řAюrIY8%먄h, [|'2t>MFBY@k%Xagy/582~EP>QW7* ag-{@;c2QHmv.#,\Nz@(AK-
+ |y-RvA5 W|n0}skc uI)0NDv 5QOSvUQxT=c0.n`1Jh>niD&@Zw1.3+sws7hUwsnޱ zmq! v'T*u-`%]j)$ ws*B6Ll%0" 1j;. m nP{9%(&Ri<By<66t4+QlX/)FSޞE
+hIg8T J)$1-@?|qC; `,V|B0={
+{-EG6rr"?E
+rЇ*]QY(niypl% 3;I*XYYNt ?*;}EF3r-95o-BF~ ti@8FXzZ_F}| _?ߣ,;Xky;!4#% r+(~t]N|BgXT%R?9/:Ko@q|7Jzr?^c=^Y8QS H-K
+1pǁ4
+Q@Do
+6N!*T ʢ'`Nrȓ#>]a Ôy٫Ꮘ)ă;c6 -]
+썁X%KQE<.)Db4nה!~ D\N% gT*%ı:_7(x&V WT+U FG
+w+&&tL.ЌS DMz rX\i%Zmq_}&NLM25OL?.P?$#'xFZ^(~YWۤÊ ~26]
+׆ :R/CQZc:ڕNTk"]£NKJj;v+ƕT-;1āK0Ձ Bs\\%2z[â$ԲvQ,mkEncl+1QaSXI7v۪%Aklˈ"+1{7%^3RP9lJś _ŌWjgYƶTky|{j3ځy-aƺo%IĄ3=KqJfR"VRA| 
+6rN')Qj%(MOlBOI!]{2Ԙ Ę{+Tʌl΅8H!I @',rC (]Op懚 Ib![,c'#@J2!Ty]82
+3p͙7R@OαwbMz}XH[}R&tt>c
+/ΚgEs4U,{;E[O[e7WiNzlvj&BCRF0Z{:Eww?ƊW/q45Z\~ՇT5Tlm&{/aNX'M2ӡLOEoPCK/
+)^n(¼pdߖhs
+ܝJc7ә9b pG',I*O8CiXir3Ob§мr{vS+ݚjL~x*ahbU_a)-6mʹ|k|;j;}KF>R*0_2s?Xv
+#QE^&h*N7ZFǧ䔷5ԅ4ozdbCI{̭f9./Y
+ [oġkvqE{[YcU%ԇ"u f>.H0+f?*ϯIB%L  \ƜJ
+r9{XEyg=w?|0sɛ
+ ;+}/1-V #:L۔1Ι: i'1pȁqڽ̀S99:(
+Z
+yW 9(Y"C{J:>
+ 3=m</|ì#Y8yAĎ@o*sőoxL.3)iS՝#ωe;D|7W#W)1 WoAޭ:|q-3Kսڌvb<*/-'#K5~L9`0O٦h`'Lq|BZqx޳?
+. M^J%@Ÿ0&VEW"wdBݪkk2ə7N2\3+f2-B
+XKH8H@"D*aijnp+n>- _݆?!8I9r]w䫘
+$Qq8>e"C 6ePJJkb7qnρ[
+ ڰW2dqB]'fƦ811 ۈPsa)@F (gH,Nq >MP)'ɣ<.ݟ6CMy_=RxZWks{V<9 ϳp9~oU`H-s圂؉lT=;]oi&5 ,bǶC
+6]ld JswaA0<t ]vPm?2uXw ]蓨jETdu"{biZZd$h-:M/O.=ƙmqR1H3dPb
+'S ľ )nc Xɏ =Kݶ+uSzzp~>Ug8CH:ţ9`Y a[`<J_ a_ 9|5dK̸? ^ab/
+Jb`o<{4c.e : H I;_Z;|ݟ+j+ɜ@qx]_Uhhi~dnuo;2*◅o _YߜBQG-N<6J/Ȥo.)۟|q­mr&#F,3O7q#wEM!k18U
+zab:h /ϼn=q1-wJ7</NO;[ҩ9Z ѽiw*` pD'!
+ѺB͓/īRAvDJ/4^ a\q
+_~@P ) -Wefnʯ} Ӈd2,
+r Qelc]N]A3\--N
+304PgpA|EŚۀ<k0DBjD!H˴JkY.)=ZO:z=C$eȚ
+цM~I؅uH6\ETgp2!š!?DWҘ[&2K1p["v.CA0̲4im |KA :ܡh]| Ehb'2:W&04evzI^j> %߄X]w}`G6Z6 S)[|U"xWH8irYt>\99|n)<A qCT
+:CI^3`i<ElbӁ=wީ9uvɚ=Pv=
+w
+Br8+U(nh"Hvd/ s, `>`cv6:j'ֶ]=pgI˳y ӉhNi>ӥk|vz;s6'^uB6 yj+3%ǢخT&;%L9@b}
+ F2*SEm+á2JJ|-MQ8ҸBON}*J,^%Num(aX/k?,rR#]W&kr
+깞
+ RT}W 9?sđ΁:NlS#+?$ UEg. /r+MzsYI3bLweju*]תGQ)
+kQ
+ le)`Mu3yX粳Ɖ\AP[EN䢈C%?װH5|vKOFqcV僀DvUBݘhjs`eXveFcSrƲ۬Kw
+
+-d]hLb D ĮfNNVϴMp'WĆy7bVQ?ie1"뭅=}];(aRCN'R:{M);hںzH
+6ǖJQƱ#F11YzY,)/jOpBgu'o;<-Jbw vTB.g7LBE⋲Q:0s9N!"
+t7Q䍼
+iʌi\~!7`y\%&6"~>d`<Uԑx\ #JvNCq +UWIQfP˃? b"
+yS*҃UԂ]ݩ( 0%6c7c䊩U,KּAX-o@HLqKnc::C<٧I̽AZŅWHR<PШ@\۟w
+ș-+k@Š%
+v+U^?xso qg͗[UƔɊ{}: ceYh*ATg*4U0֒!~6 '5l"b pbufQb&rˆ9
+zKf
+\ChNї]%>Fߊ)Li+
+^Z|(Iu2JGݟi|@66쥼J-ɹs)`7xIIJmhW d>,Rr1x!C/RWQQː5 =:c%+F5Vm O_
+ p:!Htk^IfC(/݋BIQ*SOdHab7%![+ DEm ,+*.Wѳ1OE$VDLErH@d
+uİ8% 2G_ɴl_!@.
+p1)"?H+,:P*Wхn3zdJ;]q!\ٗ:s%Q6[wX FűFfY0E
+S=Ε%KBmC& 嚣È{hs4Gz
+82$ʀiα9v %;%Oapyn7%g#C+/PgCjz7n롈u
+X%I
+RCѹQtnE/]xrّ6?Zߏ^IcAoJ> V22 -f$#n, )b. ) X#1 V0 >, 3@{UQ%iYYyɋF Q`?J4?=HDȤf64g!N`aG.Sγ3jW<*TdoMoF< m@4u ,0n8DnV#$>vIj}䥘8K
+{\jXJcQ2aĎj+n9hM"6,V5*DQ }eI>.q05EAӺ0G`&;e]\ w=%vԎċB:
+7)s
+}W`X
+ngy(ԫPz3ZZqGTDPTUl'62ֶ{N}vW
+EOO] { /
+
+C2>%M2?ܚBhiS1pߌQC*.$Oit(*aR~M,g07~XϒR/E=( CBs
+ 0_)5p u~%&m?RT{,]fi p<J9
+w99homClX8{١p{k)m x<ޤ\6JZQOa nHP7_vi3QIY-G!W2^ؕHAA#65>+$W] IQ !Ep%H*XWKC]}* "BIW:=uPSHPk#/ Z}ieahzZp
+Qj4@
+j
+Y$tPnO(*P&2s;8CA{T/ry#K`g8d4$֐X yAߧ 6ثTz2[QAǔM4'=DV"S+/ey yvĦ5lld>Xi"~t
+AGߩl`42͜wH&gP7(/m ,L" 8{Gdz&3 mgkSJPɳsh#[@Uy_'^#кTRB&\0VyxvWۨlSy՝_9z(d;t$ݐӸݎz3F5__@BɆ_= %u\%bTx: ^=QVu"jOZjBkadFhW
+BzIbihxD``_nihNÄz~VYm1DDx1}!NHќ[EEFtxHAY3+;kD>`m Rkxd62 z]حP ?5$R?f;kϻ*E/ L>LWTGb޽dǺ0ad);;ޙB1J
+tQ#sRetvxoAF$u6
+"XٹbES^"1Ll_đBQ~l{ 0DVwz[,IaL ?~E)T.j&GlrC/IjHåL~$n7k'ֶ>Ybʧq`f;+' I['4n oZ9$diw-hy +
+bƜݷ
+dR;zxaH徛s%! ?Lin\ eK)Z)C)x G>!IvU͘CdmlťʝF
+(IE4Q|5i+8/r9OfU򆞺2Qi"N~׿DDb<N`/% ܆Mt"DcĚ YDDu&J1+AȕYPN
+(>ޡQ$F
+D=
+A3X'QFˠ+No 1')dmuWn zg9j"tiZb$QpOTGu`aA}JgH24 RzJjS^@[J Y+3R(XN*AlZ BVf .PE ?P+)लb; i̷蜜HrLh KmJϬ/ۂFw~?n(;PYM6[&]/Z˭BB~՗O/zuy&E.Jiw.i.Zw!$"i/$hsL%ryG
+%pR Bc~Csq KGey(%&̫Im(EIe5O."oc+d:ʥ[ $;3 _90eϟ^> Ԛ'D l^.«,k)[9jM=Ǚrٓ`{52(`%0O8SPFh$sSEKkU
+yA F;_\!HzE'ekIq~u9;3LWM
+l5Vdup9WYSG6!lgSy l̒7=m#7fd c$zW2~ރ|lzƬ0
+O|1^hRf׬΂hƧj
+ <&%B@f{X ȗW5Ёvt6m^֟2 E`B}f4DzT HMu$3 ܈#Շ~ C
+:'BXZ
+sX#4yF<HYH"n>}DVH>繽!*-m$D_h ჎KdX8j9C*V\>Ag3
+ KDGq,
+Hė͎\ ߡ RH-g5
+ xc.jUA!<HXMsìUnqS$9h[NQTj2J̻ـ`mp.,YB˺bf94hd.+uPd^RQڼ?>42 4 h9iWBDsFgoaIZxEǢNqi>!J0D?]Ez}&'Iz,!mZ< Dl'/ʁ0H*DBZI&xiuBj")zAz@PO1:YŎ0XC|B㔊$1[ORV $=RJx{uLOeF t|B"gnXd 4ٻ(5-/rhp'V2 $wZOOIVKyјۇe&38 δ!3mʄM-2aY?PC7o9S7hB S&w$hiI&pFchYR4>1Jtn)H013f0!&WJ*, ~hԲV2?PDG1b:r}rߙw< 7&ܙ"6UbPSa!AFk&Q8io`:^apM"&,
+n@CCdO If=:JYY|ì+?%
+*iB"GCr0&F'DK $+;%ωW3 ЗU-߁oXE$%ips# i;GE7Mޜe1<p:\Hc `t 7}ՓdAucЮ2ٍ,r 4U e]2 eJ_WVw4DSD\jVb^3).tU>W}Iu~!hiZJoǫh!~DújhA@.ŦjQcAHy)QbRN20&JN`y^>ۏ(3.mY*
+,̈́4Xf)^b_X'+rN"9pսާ| B{}R/:`JK
+>aJv /O2̢J>gugχ&% PI .4ͼ^L5k|Ğ hMjڀRw-ƧP<z,qO.RS2bץȹD`?|3tݤ9.֢ gˆ>mC\Dj8 nb9|^[9Y|t+ 1 b1D^hS(k~KOZ̫rG[Nt,y2V4Zdé+;R[B~\h&2A[+;BX_2aF~0d9lyfv "7qw%-ѣ7-%bFqT ._c f6&;ݔ;lrRMql raq#Hvل!lh@RS彸&g=(1bV:24 5u9gm{Z2&ᒬe?@( ؋PSb]Į a(޷=: ՚hCRхyb2U&Ɉ%;!$_ Ǽ
+:Gw[| xҊ{IMbWi%#lhhIZ <6JJnRצVd [K"j %a>V*:
+PB+݅!ܵ> & s?E\3꩸B2ͥd @fZӿO6xI)lg2DV5C:Il@ޑkX a39 a`R6: dJ bjbdP\ԑ9~Y*i=@
+3b\=`ǮNi-.拗 ۈ
+
+^'"`5"<&Hk: r955ujsrN@z$HriH-9*o=%UG'3g!3>кq?.@6Xopn[tyBXHvcTOwֱ
+깗cѓpѤ$)>݁ .$3"]rW'*DHy rzTHU&5o}:]rX`}i^ND { b~5Nb9Cx)H9m! Z|ͼbRmqkI!Uj@E{8}0_5 .iH
+-Iƣ) ӬzP5
+_VQ7$ }<z@fࡩeޒ]Vy@)2HraJ1YFsBu"1`_O-}`t{Z#gmOwB9V_ePb*g_`Fk&Ğ?,2C+#XhȊ2m [T6=0paj&IVXs7<s"PQ^P9)OK
+ RtY
+
+u0\ d:[F Qݼ_ˎThh)8EBηkNmqʮYluX%7bC>z%ybl*pbm] }<CR_|{"Xt#t/:/~?Ado.NYǬy1VNĿQOi(6j#JR<!0P%nXat"x{V<S_@9B❂e\S=pƈ(ŅۈDJ/.qj{0A͍ߐ< O0W=U'>ɜib (C~}MU!2Z_|
+``u :ʀ^=F2 1Xq.TII8WCIk f
+rPqF6ű_A(uGKsQm@M\DYѤp
+d96$H`궓
+y!S4A =h yKUwT s Ԏ"^hmCr v(Skz.,c~:g5 )Qcuy5%KWգ=3|-moG~
+YXHvLS2
+^d V@{`Ոk< X8 Ar.)b4z/e%Zl&o>hjr@!X
+@v;bo > үX 7*nA6̒u
+]s^AvM%fepl3(L J*L_Kār&f(:!
+&m3mӖr0 (fDA4qEP]6 ۾n0x^ˁ2ahhism{j棏WݓyhsLap-=/ݭ,h>O6EIÐ\jX82t',F!)ݵ
+r7НD1`@ (1T PMTӘ=LPl}ٞFXa/?t1awB*nf: ΉwfŇFה"ҙ,." jDCڬQ%L7 B6C]l9ީc%O/%ι4lo݆hh\z+s<b)] `xG#&$@75Gb<4 T!ދ! g"ع }[5
+"Uw!fyS?6i_ ES Go#w?_c dj) 2
+j#n2*RJ>zq 9<u$P=$"J'i/hػTcƸ@A6+Dpw!>~
+=E I?P09rV6ǝ!R1&'WgQbF)J21KRu-hQqqAo\&)fv}kP{o!u$( z&-i
+J5|2'R#B6pR5,
+y̗W (ەo"ĉy>@0sX"N! tJȒ?4Z 6&?Jsiz9T0x<߄}pQ lA vStx͟_sߖ >
+= s[q0,~q#J2(Z4,}nGT;<^
+iW!TnEpSaCF N FM/&~\Oy ÆHF%6oJn#qq
+%AfePǶ=%9~bT$$v vRźftbˑo4{v/'< AbHĶ9e-Jjm:]!jϒwԘ>DH=M#ߕcJ΂)AX&D{GꌑpMA,r.|K1*cT^[N?KqWb9M01l᤹c1lXTJǭ:C{8ߞ򾂿Z.f5>pGSt>q slaЏ߸ѾKء$, `8
+J@w ֔{«088[B`1*yJ  㴌Y
+;1w1^^p@
+90BE71tݴ5o~k?)(Ԥ-R~ŀmJOu^v
+5%ѳT`[v"w?+>kogCaC\>R6ŘuI?9>}5E%[~r vc4z-^eR)I)<B!"BӨis!|vRa葂=eh2weg2[9ޕipJ2.D;~z2<RA
+ɇ b-, UF#83dIXD \ l8"l4ť)5Tw""R2ͷ#mDA=س|ЧpA BvXx_|8+32 LܿLL=lZ@3#r)p\nD5`҂xa@jp/(:я$1l9D)@bGc(=Pͳjѧq} %+z6"]\qC礯SǿX)ыLEf1ZVBpAzf\ نrA螥 M>iT}C0BMFS0?0,}Zc
+ƾM' 37-6DbGU5 0+˗߁SP[Oi旇Wipxsk[xTSHCX!%EW! a88 :Uu1~ZжeN.;s;ns@UIsۇ{ޫ#:Afu($",m 5I#P1M"EYv*;ҎzVQ
+a^$e]> `ub( Jx94aUM6%!@( -;X"yQM(H SYLJDG
+-K@r$J ߥAT:Zd4zuMˆ#QuRA;>p6SG표H/Gתu#J^ uN֍G}9o')"ݍ7f(nS\ZB!UK@|53_djieZ?.8}ՀQ
+@!#+AymEx! ;?@30=``|.z!54& sRb#\A* N08%rAeC}j 9:aѸ&2gn ȄV㄰{ܐHЋ
+҆;fZrY,A T Cd? -\5FiMjx1m#g~ T)mXfKjٚqg Gxo,,uI6~ti(9>
+H1~&66!3 jhOs׎m(_hiA֜#}
+yi8A|l%
+K`.NħC%cqa)@+0~SPf|MsVGR;_8>#BEʅFPYQ48!2ӁXh2+\5OatN1Q~S /N c~|Ix3\E1s.?ȋ##( N,m %2얖LFPfA|Fe}W,D0Y$|ɒǵ6$2?]Pz:p@1h<P՚&*ݎ ?ɒ'; ,E E<Zy.QxgeFx{|=` 0ѫ>Ḧ́* LrȹlNФTUN`h|$l.@"$g}cgJs̩8q/[PKXr%qʖ8'YFBUvH )9Oz*6#td}]7KK^NQLƴz1aĬXdض#9>
+d|HLA:\f9ε~eNƕ{yz#ޝ+%M Si|ZA@!)OuO63@U`"ǯWkW'+oUM3iJѩ7Ȣ9k1w$8$hD~;S okOl
+xuZ x0*Bwbӗ$b)
+qzH" l/0r9"S%@3v ]&]E&X={Т>т˜wK ]΀W=!<#Rf4h^Ձ79gLć4૊LXƅМ:4 Ob aB1eH# wRGn@׵]S9u)ŞK~0a4YVS$4ݩ;ŸJ'Dc.aήDUcqg\?Y*;*_zbp:[g}/ϰ+*/P$|T^B$~w)dX,9K"7:j۫.&6dȳbv;=jg`c:ϓ 3m˳ 8;K LYU;]<,f{y ܎pHx2N>-UR dN7@7H'j %gA 2r5<MUln돸{;5O-:/H-^."{KAv
+$+yX㺚S+iZNS% @i¶dF cOR ~ ׂ i<c94(H,umxC
+'特N\K̵!F(2
+yFLjWwĆ{8ADl;]4gǞ3?嵾QZE 9cCv,D ۥwZG4@ a#(p4ƾ]DҚ͗G-{͘dDꮱ;zzK4+|"xYO}ʹl(mK*x8GB7$C\hbqB\FI/J,v/E]q=}^pȫYeim4IJ}m|o5]@ڴXU*+VᴌUYы^v7I+^~i nq*դ-"fSR
+*(mip^YS̎{ѫNy{Ru#O^=ǿϏ?T1Tt{vW B1T6FH}8wű @z'P8:)SEVD};bI/8n%_'yXKy@&JV5I.
+#*oЕ5k4(Y!;| j2VdeF,!ї!~:dYg{t5-c$HeHlG$=TQ}beS}9^ 6DEdl B
+@#['t' wЂ@?l;W 7%di^DN$ƥMꔄ)Q &̾ӵX[*{C$]f I> /uO>غegE VA:Q_vȑ]6v
+$wnD?3nD㏊Sü8CX!0uƮYGLi׹Ӎqipc:nץ6aHÁ=NC혬*#5UoEȻB?#9a~eQn,Fʍ9'D_GOjh)B{kQ*=,nH[l>  BcAaCeLUN6
+M8#+Ln ^~g!,6+w;FK#b?63&sx3P [P>-x}{\2A)Q* *Sy003%>T ;,f0r ~8e{@6&llS&ㅗJm=EmA1uI'mD3F2wL'^tVҴqEjuyY}7+s.e i܎Og<M2pΔbEIZթ !@c``0ՒQ~$z Ɍ1 2yiK8r@XՔPk,h !\CȊJT6p((d?$yD
+2; Ek 6ag~r[uwpLJ l6$- 1K4b[;*jZVjpA$8SyNjSq&Zsc'cu,=3 &AHLp@ԠOlxc}P^C'P$5AT۬,-GW"'- Dd^-g0W-
+ OG.? Df%2rjQt mQz1Bs:R@81}TW?gs?L/!zW5i_ +5($"FOi5D4 ¿ӧf4T|WіXȔelyaI"^T^JI`U:#RgR7T%@Prã+VeC&4x;IHQ!P!ۗBxʁYQ_Źet f\b6z[;oElyDbX"sd%l<Wa
+X0.+tZvHY40x5nl"@(8@bfspRgV
+ VXDvbX"D`{?e)bO"-O7%-.KQ=5TK˳  Ra4{;0A56ЁmA4H ٶ?&2l0eLa(A+}3vE*TAr *AS x>Lp^~tQ;K$S3pc(+U`-B
+HErcK4Ȥ&;ΆYIJKh+MXrZ(,M
+':N4`0kM5_cAŅǫ`L_{m;* |dj@ Wg (qVU
+QY +:
+I~ ˊ I$Tx+r?F:E8~+|&9X%(F [gnND$ eMʆzE<#IpnlHwovMk_;9 LɄ 'D?,vί8UJ` 0ĭ]
+P ߁D5[d|s+nW]woNԿ˜ Wj ֗W~W$
+HA<ELwj}s-HM@pPe^۽ }IX KD6Tw3ǰ6 F %><!IxN,Yh%a܎2)}t@fa%'9gRMlox+6χ"bwًպ !fG`s# D9)̨&WmFihH5Mit"V^wRrxߦ%h\vfKrn: J+Vcږr:$dywM'?LXvdN$˫J n-RIv b7/s&YH b:o5(^Y̻))<xde$9ͧ ܢdbmgWtj&y-r$ ZԗP;w;6;[=']m@7he1k]uequ߽7W ; v`~GWQG^,Ȃ"l)`'bkwawo 5Q$ܶrM #ԇ75ԡ`{g"+_xHJ$Πn-)Z$WcEY6C"y8.
+X:3mXIAҋEY8"AV_3 Gxh04hBa[|; Ƨ&(c('ӈlu^Ϡ%$w1I x߷P<+&TE g#/26*Ea~.a?-* vN?aY 1iP
+9<5qAzJb
+
+Saz!Οvr>!0W4%,^)q @y;Gv
+mD5"(T;/W4]o*4}p"Em`}\qhjx~
+w'116^„kHM $Z[$a%Xb}<FWG"K80"+b'dd|WY E
+HOn/7O;iHkgn`VآՎg ~-,VMTKNC^sd{i_cdudVCHS>Ȅοi}}{فڑZ)y}96r_ǐUGkyGMZ:!=ZEdk=yjk9$+J6= ύ9DnT i' wwx9gcQ3ܸLHQ*/IydԲR2T_%=qQ)\{#a \/J\{hQhr4J
+7Gm]K)C *^j9l]'Dl<J/jjD4jܰgFTŅ Ҩ[&J5')4~OyЭ$pLюT$VG
+LMj߀Zj]h<-C84AK|a~| !3ʍ8'cy׊ "Zr~ NޝʳL60Y&f1FWbw 3~Mm.a>:iѨs1ߏO`)D6C\'Y xwTe&#>Ґ)ď 7O"V[*_OJy4oQ xEbnzÉMSdtYeo9`x/X@;![{;˹Up/];ε;ù1n8] gq$;ХZhzpv
+!\$+PXwn(wO!
+0=G}ֆzʛ9dRjiPS˄pp4=bLi1nz+6-6PG4J% $oj'Hr[.M{5/bĝ|ߓVPkƟ|[t 5ʏCz?&8Ky!WtAKFf/ٳctGS9Km'b>>+rB}*u{+t[|?./b4dp r%iW4_Bh%{-c`aF9W P[ֈ4~WN7Pi#p' :GecG 13
+?.=ӰEP@T (ptb/"j#T-t#"@?
+V] S#\kq"1:
+ OqzA\6?!(„l qTn\f*?}~Urᢹꚾg/E.@, uLDկ4 x'J1?6;IAp9;sD#\Z]`*JszK[Me''<{ȧb-l[Dإé|\tN)!~~#w#\|O'4C@S|2%ś7{cs'/id<-p c@YH$ 7'3uWYec`VfCҰ@KN(< \C$oc r[@}Qa9![g&,5!6Uu9ע`>0{vViۃ4Ta*P)(}KluB|i^)HeDih +i
+i8'2ĬO$*5ЉZ6 t@2J=!3I}јթ/L?[K?P}j ;2uޔ?Gj*֭w.=ݫnWgCk7/'cw.2%
+JtkRhFlfj+ac8\Ŝtobˎ.F`)hc276$$hB6J's0%9fs`X`I)~bGlQnWy)VO8,3:M~ϊnX>c.0Z:#L]A*Պ ܞOVNص+ >z4eX^
+2S3Mw\t%G
+͗&Ba0F'R>0!@w* BhUݠcXe Ut>R,OY 覓zpږiK n!tzWYdq
+7Qf&}1N]{);c 7be+>?ȓ`YԘ~H.kkx.fn{{jo~ńnUj3[yM4բW7~ſ~Ϗw86STsm^É^S
+8QwT`/ {/;'UI9)n/1
+x܈ +D;y0lQ@=9I`7H(4h[DF@ONmnϲ}=OJō_2eǯě}PCܕ=
+'}<OoxS|T~ !_o xpG޷ GqQ"qD-}xΧA͗DL(tA
+?>cM$ 
+ KeBx\
+ΚI?f-jm!+2\ J˘2I3 1H4!i bWLlH1{qNᵏ[( }Kq|]8GY,7,֬5@w@7Hg\(. ˜S쒽K`x3Oh"v*cQ/Na9m@
+ifnf#&m t.btP"uYc|?&IE$2Aф z
+ 9@P9Ch){ߩTSɏlM:19a"p{b>g/oȄ\h뎠gdfakDi;}U eP]Bwc7<jl=ƮFX̨8?;n]
+22ȨBd7?hUPɎu#'={Q$TN*`K.+e~$J58%LwQR<-sMwb˱P iaǥ!VsCDۄGжÍ]jH~u &2aϋ;]KB-3b0NQmJR*ȇ\42(ם8 T eC_}@ UIܟaD46"k%>LH WmZTVTL.D9!Ht/h>i0?Lg_Aے{Ǔ|f9> u$BeoRPd(/:r$@w h5kٷV/ڬ
+"02˂62HO vAb1i^>űM̺`KyV1,&Bt 0h rRoNЛHE.7&=dXˊ2)*ZKpi\*d6Y%" s?Nr]h@A%=
+_4"Dߊ\q6TkN_-h+мJ Ȉ. rшl5Xnz5&A,x~``x%)CC u7W$I;>J7f݈~ Xt^%&yjD+rW{b 5ͫ'XѥyJd?i4agWcs3r/w?'g/4/OoEn{*fA ["ߋ si˰8+!.SeiSS-4x]܉;&]L؈ƺxT䂳>hwԍ88ks *OA057R+ڝ/hR29#>.ή84J0$k%QLI{D<h9E{Cb(%7:H*_邀B#;Ly:f
+8S sS+Fb{'倍m(0DB{l
+ێ.v}E
+lT 4^yzxWDPY`[Nf~8zh /)ƩT+2fL?"])C96ϜireZϨO֮<tfY[6
+x)
+#=3?(r0V#;XUQ\/Kr ƴc@+tXyO gUmy <09h)\(B]o@?эx 9IML&Z -V5BuQ47ل Dp9F?!Sb OPtwE۾s+ލ^ڬ,irWr5Y &L#GJB+UjeJ vmusڧD\7#t$ S&bG
+
+Cb;,7\p{[697\o
+t-x p=CR6n>H-2hD*:9=ݶZbMfaXX&f@z?mpD-̳[D0$
+9QtC·gIRp
+n;&Jڈݑ"qF}Pd,5cA{Ƕï4O''ũȬ?0"?˗ONjGPAp%]~ZӜZuAqb^g >h"J S% ;7xs15s[ܞʓgp߾=/x`xO/y.sӦ
+ `nJh Q9-
+꧂70 [!i\;j[P%!pIQ89Oe'Oxt-2f 19rWJ!!"%Q~LAaCEo՘V׌[Z q{I}OZۡ,inס0Rb%OID?b>%+W.˜
+ĕ!`ƕ̡ɭuS]
+=ɶnˢb{!]xuDS%:uxкisHHR7
+
+
+ ñdUZxDID*It 'Ht zH'
+kX5P͛$)2Uټ%A\l IBL)iVu$-IJi2{1UUu=I"$Rfx: [D2\; 㠿4R8IŞ\2tDͅmַ &p$rX11TM4wyX ihYFUE<!Hݙ4qrN(p H\LI!(eW^Ui-sMD"hmlHXEֱ7  mJxw HIFֺtGw^?Z?[rˏrJP>QukGvq}J Z UK' :1!\%(#ꭩ!ȏo3m/Ge xqǻ Qy*P|ȏH|M{術k5E:EL\JoD<~2֌$*,A&+'N>:2~m=%, VM[ 㝩<0'"6Bi,^-6#o)Iv ܂"}G-? f_+; - N#fɌِ6SD[}IZ+xWLEք%vi+wsZ43ӾfT4F
+8& Z>\bqOa%Qd<#"ky}O0&c$ޭ9 *C#E2G b˔tnr
+W @eJj#*F' P2Æ=cAۖeXo HN.(%x׳u
+=`0,w0zJ͢4gΣFOΘTbf:UcWf_X1y2L[Tez8KH;i4rpx1rKf5mp!#[N{a" |@u\@8z"hE}r }?:,E\LNF!gtoWvmsoi'mLz. Jl\5&gZ^HSN팷,+"8.sBd{,35OdmWįQcoEXIjDӘJxy}6#I#ql9^`IPvgkHxGʂk#51u XGU :DKzk;KՋn;iT =ǯSM^4$UW#I H>F=g
+pJS˝Au TdfSɈrpZ;Kv b_tF9t>.%||~a:ywkCr%!a&{`
+&Ux\.#)mwA)cQ6ƾˆuP1mG
+a4T}jȌKsڇ_~'3s7 &cb$Ij #Ёl3P4D'ϟ=Ϣ(~gW6 56$6Twht\}
+z'iͤ\?OT@^Z ( 12Q^<A}>hڐb],sA*%.mAMЗW$\?ӳiZ-2ZL%5.%
+A[&1 +Rθ(/mhgR ̴#9'Femr꡶: 𹬐iD&JzkN_Eq==U,F:^S& 9PeO `w R[L,bi ou P[
+z2]5iA2<Bʴv(*1+ߌK] DW=
+$=.zZ'IIz+a;e<^HG+PeVbk ݃J̻`~Aڏrl
+-$uv FGyHRswRܫ<a+ %AݸlpŧhH5J%[K
+L'>y 4e+X7
+D}S*q)|("A ]eW#{\q"AQ HH!aW
+Z*naϮ j%UO\DY}m2mL%#)rVOFNv+[
+,I@
+m YA  |S"_;_73+"\{ůfu;ڏkFL+6B?N5By=b {(إzJ@)S/~n;mvř#~ic9b L
+ # p Y (!T2_/!ˑ*Qq=C>CQ|a2ID˝4x@Nw< \P0ՋSA0.WK
+kQmr;ƽ}'nfq"Yv^$MHvF)zǢ +Xk{
+XQV/C{Q` 5zlᅕ3t;(
++@aN> 3yᶉ7j"VI=ΓafEJ\Xrg߈/k{y=װf}Ў\>U9 A箉:]B=&sG%p]
+0}a.K_⟙INN&\8f&I
+^hv^xʷ9ǽO"nPpdi&W
+` zsOPvFD&۷
+<2"cqJ4ƪΣlĆ4HC)\SRsUVu=
+XY@ Y/%S$x h3
+6|9ʊ@yԅoi34 kL$$R:%W}=7 3RF7U2kT:hw)^@QJX.!1FE#6{I-c9̊ŶVWhP[A
+{e M0
+~DNaݫ|4{Tק v Y? / 2" ^vdBXsS,=F??g&i
+{y3f4#J1`r
+;7H|
+;ȣC!6֨rb]E,5uM[?"5sڔzvel[L8gd}Ad17MԱRqyUO[s:#b#Ss t{`V*#OK7v @"*C?!HSaP;1Hp?a7E'@ $:b$wBd9Ω2_lF;l'I 7eZ>~̼$53.Q>']̏ ٞ 41@hѭNW6bV<@ 5'5[h@`ֲGֱܕ
+
+gPyQai@j!K-xq2&:ڶtOQ6WE2o9Ұ'KL!.i
+c/@K.(ۺ2Rer m;g>B]W0N}2RhC Ιwh qL}RK%HL
+Mn zni1C])M^nPs52
+cujyZȤ}ԬGt
+S)t$0&:=i0׾t#ދ¶&5q/KL IHXHᯯ( oh..c}. SCKcO }C@
+2 vƢӶ,IPȦEM|Ie|Ȃ2|M7Q
+O!,OTqQ 'd@J#џ{i
+0aCB&(4Tiҗ^AF %ԥ@xjPb>vO]:~:27\߫sۅ{S?dojЅXZ`^쎼8Pq` ⟪!?LҦ|Q
+h\(?$i' T)3S<jb'(GhIsN3G>~>p^gG1K*DD#aɠ OEx$% 9àU3yyL/O_1Ek2(?<l.MT>ԫ\^A*K}%"J#=Lz4 od-,^J&;OӈoJbi9b>9gem"y4<=N[*z81+9ȣ<ӊ>ȓbV:qTovZA\Ku +n+Ȯ"hI[!ly,8#_T"t zC'bD)!V(2dfssܴo΁ g ׊CRp{V#T{o IiT.qؾK*wD4G)?,V߉ɖls&νm
+cH)ib.y (u>Ck`'v@B l8)ѐ{srR!(Y)&E_y!hK (WAllvs=V@],G?eZ_GRo@v6ʷ܊SD2Da_g 0'O?7h#KP 񃃟Y?֐BXYڲR,dVbm?l *e‡HPޕaPRO%N?&%cbW z1daC:@ÐČv>A΅L;D_f&O}W<l
+::i{=o #·:Rqav)V&qjP.S
+CxLqQ@/͊w> rƞ}GQd忎/c_
+%J5KIIF гnyj]L J07l, k=f,E 1]'
+HMҜ O;ҷpUVyi8\y!AݰC?fb1}Wxa' "s\!615s
+UctxldnX '
+qTCHIƭ~ Los_-M}LoLE
+ݛ(ζB|*j<Wk9 ZiOufp_!I9x c+yFC1;GM$
+-FxBGW:8k19b!ǭkO>tt=Er
+1FC쫚tt~:GefjcZ=
+hywaЫhU>6(3 8LԠVHh8HBWtŹ?6}^C|:Ϣ
+ߗո$QaX!
+4}Tp5] af;L "dGY==@vd&Q)kJ6Q$hOO5Na[faUj k#Wd,A_;UN%W@xx1%BLD@G1 PvRDA-\F2؂uN /,<}Ű=4+DJ+,Qv">PTw1z #ž4
+-T`C
+BYpx
+kefĉ46OaUZ$nivÃՈ~ |OV 8
+q"mrH..PK*9wvxݓ%AcG ג<We()Ro9`}
+BJL++BuAH()󴓃z9Jrxr; 2;t9Q~^b5B㺖
+A
+p/s *EY3?6..{*Jc5_k`W9U>m O [!$/!U6EaqX%H
+hd,jm16uwL~'lap:[wkD B@YO:G1,n]JmSǾXct)d䧝QjWȏAye ^ aׁJIG|F *1iqQ
+ #7qNC'R+!j\"ё:[ID\CgAQr"
+ηilݥD)*@ Oxt Bl2 uĪvz};߆5S{UKt\eZEc#J uc\ZbGm-߿gFã40 4O"}|_G'Mv4E6j젬3i_1?iQ.Eg-Ycĥuq._}~SsH{h0pSY!*pXx_4z, $秈xeIb7yjv^9 S^ZIHen
+Kn y_'10V!vL d}zTalZVQ[mHdv$efv8*:Ot+;Ţjj
+v\T06y'<NBN<Rn$fN* bY!{CdX3[4= îj7,wJ@
+%ڏ&DH cՆ#: 3|dqzXvRrh]a@`'Y)vJqB[ G"Gsҹ݅8A` of(ʄZ!k2aī reغ?ڍ< zoF Qp/IH
+i(+8}T LTA)qa܂ 3 Gfxϝ O߁Ty~&O؍ ?& q tM`W'#LE19]{TMR+)mi.p
+1(ԼC1*q
+oYU0t0͸sxVl(_\ ?b 'PE2ѥH !v0A^Kx
+ߘtT G;\ûe NZ@N;h!" U0D?ū/I1ʚg7Щ8DF@j1( ]q Oύ W|Q,%|b-gk~ꡫG/q
+{
+"8w]djz#-Qi;U ,y%h" 0Qf *Ӌېe^%/$<.AYQm9_MdB]&aвoTbCowL-n KyV(g!A~ǵݧ1PckhH/C֊e-?H"C!}x"fqɕ0i$;~Zl#Լ}A4tG\Ε48b fw}"
+4/|]@-c6myt)Ov4 #u :R.MLNF۾(]&9"lIg6{Wqq&:!_*'`S!EjAiްƹ3~;/M;s8%k A:zqrO!$.ys.e7
+3eYȯ[8K/I([Kч52 :S(#T8]H(Z%I-xP%Ev}g"7Xo.HCc'QXh!]D 4p dC a?Kg$
+ s\0
+RR `phL&g`q
+e":NѾt h) o@Wv,y@*z7 rDѥ*W@5(mq~'YhLn!z 亯%Ibx&3>|Ș?D]]3lRRqsLl @1ttG0dKǙr ynmݸޫU3]3H)3
+ i]k>w㞦@nJ??_^4=>+b@T4O75"fI+S˨Ǥx΂leH
+.0| q`o-+ }ړC,X}pe.m!>/y4{!hG&ft0CaG>G1,+3Ԯ(
+xĜ-$U`hE*¤Y!+PG@Dt
+Ĩ=[”/E&o*$y͞>J@@yM؀۽d䪬F_β Нx+h08:< BGA!2K,D]?znOA&'!La^=U$~v`hI-:y#^ȿYa~x|~w
+U_+mx@Lco獗kq:;cQ(|ߙڜZ;S d9D_-ֆEJhorRǁ7&mw)-[XI$ZaĨ-I&m*t a(|}dNKC6Tyyh?^:Nixk}fFmǃ}MoΈ3R{/As"Y1@
+u[|&CC"m/GpFɬ8VE!aX8PM#r
+:N.F?=tUWGktpyWL=bXcz $UA\%&0pUatQaK\V|{}^ AШܟ{k[Ak˯\s@U _㌌\ʉ7/C9{ ӀP).Ap#hq+nbTZ
+KhOȀ$h̟$+og]4
+_G>fd$od-lX<Я8!릆Ig.;W98]F(3QJA!ԝG7츱?A/n %`Hke|Nb&tvB8UH,<6{aî8 {&ݤƣEb|_ {\p|-Vt=]"L/7(=X@3cK1ʃëc=)ÏñHa1 D}ͦ,bѦkwl@F/<ސfP# |*r@'V7̀ daY/hj
+٫dUf,Qv&_.]ư1]ǔ9M 53lf"ꐥ=6s@RcvKaW\\]t s'Mf2h;:>@pG"d)njKt3Zz1J }AS2k> %k<URToG0>|;m%uMaʆ0Yɰ(ŐAuH
+󀂝HBrY$?R~ԷߚӊMgw_r2 Si/G;G!Uˆ0b>95QWּwff)y& o:+"TƂ
+aWîO&;cQʨ}\\zNQZ:
+Y*]B!2PQ6A&5ٙN*s6ALW(F`QX`nBT=D ;禟gSC֡iMi1_;Bxuلq`5 Z c2\0̉]y?y%1}L am %@VYOq2=۩{`{ {DȭdiA@|JeT"T"-C;FVe(;-$2qScnà"e|z:ߦF?OVh퓺G:̆a[ZG1evN+ s.`2б尵"ٔ/_,]u)G! y".m.b==d ĺ܋SY]܋Q:V6Z\1ts}@gix]yxg[>e3!{Ĩ,f 'WO]t x_l~ɆEuas!1GhpkO Zj9PR@X{qyAaӊS9e BI,zQ9A \@تubG6 DZ>̫V3F_tq,\T&F*Bi0.uLmUJI( E'Įy pYЙr]Ah6>p̴)Y
+A?ql
+aN{z#iqP Pq\0g=A!2\\ݺRG?8wǴ`,e9LnZXJ$ 0,3D =9}3
+Σ ikN0PZ*;lcp ~3_e mejvhP$YmE2k&gY6i*+`B0%1WGQnfH |5&xZ@I%<Y/Xue$MJig3} r6'O/hdJ
+N!.rEIRUy5k O}e6L쪢Siv !x2&d,ÒU EdEɹ=!
+n-N;E 
+Bv(n v`{ѡ/ B˫B
+dV
+2~`r{&>K!CQ?" N z<kfxkw9:;
+) +s# ݦULO0'iB"}}FbXV:
+SQ\(rax&<@*ɗ2`5ʚE>@Ε h'YmyhLABv.FaZhW
+̏8&.2@ȺY1J t%N
+nhpW~T5ԇn
+Z|uXψ1S߁aaY@[($mܯ^pU` mLoYw4m=^SS`6y'pƱ*j6E9MB᭵"_ӈUZRMld% pA:&, _b(]Sd?>PFkxz%hB9Z|?c;18b>|ӸI4uT!bhFo2nFh[mx2C'\,݊lτ[}UlVtIWZ68 S2MxTO8E2ț}b#9EE
+,{vO"ߔ[ĺ|[d"5;R:1; Q~2\|OD*.\y
+y;殱2nFl㓲bʪ1΃~8a0>Xa:ҾMV )wAHvu1C Mpm,> nQ~E(5 ]B9^e>sS ]r~`mpg[cv@v7<k-_)<5ڇ~(d9X ڮ,U#?2l[^2Clq:@U l)fE"/zGŒTggd2k@rxfJˈ0.#s?ՇXIQP^*6pdD1mv`gGǕ@/Ld~tB&] JF l:T)g# (v`BLp|~V0i.1)5kh"o3l3C } _
+vVr0|8/`hMBmD$@
+ }V nA@XUCiYROf,4\d)+f;X]6a迺y0B"N: zgdV!xG.11R(qބ@}Q&d03b"<kS5F vѼnAY8ߨ.;%;J)l ϊK,o {) Bz:Gwq2$>_q9 lkEanq}D5kl\-rI tw}|N%7,+Cs`T^
+}%oHm MgMVM2l x3
+OM$7RR5;FI&]s9] MBK/o5"KXiEg:5Te?X2l:_ٸS
+sg4KO(x0ܱ]'7e<?I4 w44gN*a_JNhN#-_]1h3%.q.ρn՘Q]}uZ
+qro5;ɃQ. n\;GvMsѾeJTbZ Y*$*滴);69^:/:k|WKTn6Ծ&Mgb'$:랟 ~k vopnVo. ު{8=/km"c90OR"f\">C"?Sgd53'UJ1)M2q #b8[a rn(uGm1Aq+SH~<4 B{ biÄ 6j.ˠ{$ Ьy$=\';qo|mA.&S.?o^K1i~uRF'a(I@daq"iu$JS( <fXIc#^R8bi^c2 \[].8I3rei aٳ\ asb<${5QԞ^= bc?ܱjM]Y'`]=
+ts
+jǵ`"qTy]P|:y ncS¢H(@/<Q0/wE!j/2rI l1*jUOyb&"6dQbL]y>$tt}P2FZY|sNy`"=y`*>z6ע}q~PR#ܴnY)BM $fg TSb#| ìTBYh=вaj"ѕ VyQb]ZטrF;ڡ>RvNƔ^̽K{P%0d! $ul jAӭbC;LdEӽ8xHRv Cu)N[;k:_z&aPK
+UUݐ~@r*H`/sũ?ړߔ)#„u*UuΒ A2\
+?u=j?ig-+֪
+6c[qZ#;LYR*\yNRtگLR!g_F
+Ն1Q ʤJ$r#R#^<Y.; dԨ9⠖>hA% i5s&PbMxkBtO<?\WnY,.oQ<kh2K^Wl b;j{)Ԡe5}DcAp`"9c PA*~(v wFޱ آnCo`;y OL
+jvSNkkiʪEݻ|k$۴^"ө53!uc,ċWFㅊ@RpQ[5ꔨ
+"Uӂ=azQ<E1^&Ir0=tpڪ$XDq8$ |AZ9 uDZo=Z)oymh13"l;@9+RUM 2Qc-\7+Yqi.̜SrV5@;sEI !0voڅ3^zecS
+k R9.4.Yt(V&F(.>FC`ubQB8 HViv8JЫ8VfqI.Be2"5:>B*$.D9>%H?~n)A2+Xqk7W"b+ E@U:Z{lSDFsܘl)3g\$Ysf_i<PҬl8H ˬx$RllGC$=G\! Q2CJ3Gs
+6[2X{E0N-SeSB}N""IK_veCx0~`fk9׹~@#䯗4طo!du
+cMIKۘ XPpY%0>@$3)
+nY[{E2KEV 4ǭx=]Βf|+/~( ДjYdϦH;[(!qZb>4<GLؘ
+ϗO dXļI \<`p .Vґ.fku5bz,X6fP;~,‫9
+α V=g@ {bX:˳:5AL]YeVʁٵ qfv
+ QVwjP"PmTKYIA% B&2`g_@j yh''v]Ìt x/po-gi2>͗"1JYpLIi֊OЮonàǫi_NDR)KN!L OX֙jzw?NK` ~"QD%d]qR
+k ~ ٜ(.<b:ܓul}Zk aʎV"rpuP`FGy"C%
+_}3L98ŭ2doN*Bۆp`/XUXOU^S=Q)d< w.̗*KV8cDaN e߅L,R/ $&OPCQ"#:z B)aڞ=;av@٭M V3{L܊ס~_-t,Sl0 .]쳒L' AaL0ESXYa^yk>yϩ
+H `ޡܠDRsr6A
+S&s25xvl v@^,.>Yhz=fm^W* J2+uQjN.9CI2Ჲ:FNs *YT)&u
+ށvİ1!םꊇQlz^dJ!壟PD?Tq2!Fj
+Yaς[b6Do]s4Y~<TG/А[[tF #hI=L-վLD6ʜ-KqS3!Z-EXe!L`n19c5[*C'!+7*
+PhdAՉ}GjYzB4Zcy]-&4sH,ߘ"t 3>aWtT
+e|g^_e*:Z Y[uQ߾#sQp{&NOK6j|mq5v}y
+*x
+;Mݏ 0$%(TrdW* XWmDނ22Q=nXVt< fhfAQh+A=[OCz(
+Q|v)^UY6(atr:+_f=1KX`w*kb,<˺mT4B\Yng9"89h,ߗTA7_ YKRG9!kΫT6tmɉ
+9yɹX1IDr,-fLȕ z݁'(<y"Pʌhmjy!|n_4ڐ`";@*Q/0ޓR~iNsѥߌ2ǴcH{ Sb}2虸؎$rL,
+ex4>okt I2Ӹ{ _
+FBwbt{lQYO!;f=Prf J:
+|9{'?m^o0H*n@-S_e --IVdC]|2ߊ r",A< ґ yG ıS
+&11kR/Q fk{L,%_9"
+>v֓p pq/1c x[hTF(ٚ_DP_/}1J bp[ W#= *R-1i/Q(xea+
+uG zjr HqO'Mĩ9뫜!>WYsRk3\׫~(,(XPy3
+O@737w2`~Cԥ-N/j}BGsI䡚T\ ʁkFxYD窍6Iy9Avosn&iE|S1|#&JcWWNZ9JCrI(
+֖L@,/䁀~hFC*N JZFd_,u ݥ!ZFT?cI*g2+ 5.,_‡<#&" (59zKEڤ
+vBɕ|bխOl?#G<kj}eh.%M:婛a <ǖbވH0ъ"" Q m0~ÚjviV ۫Z/~\SQ^Aye0C2N9el4?rSJU [|~ D}1amɰ Yu/Hy73e]Q3i\VBta9k8$ OG$ԝ:ˢq"hS[eBl:@^TQWcn߳`f ,5[~< j\q#4޳ۛ<f"V5VtcN֩z՗
+<,u:A9[9E7/wշfe.רkFIz+裾v ({I51G]%W+s}idE3)3{;KPٱ̸]fjz!ЬRHӫXy0$anlD}d@0P4(Od!udaX0%A \n-E*G!zK_JHϒ(0OOziQ+\y=#~4p֤'"JdPņgfCJK{:V򒖅hc5~6W+NzL<ҜuG{T
+ K=̈֬qS ]e$6C^޾<8_p(yv ?d{u1Դwza`>]
+ɳ쇿PI歗68NYhr>9'yqRò:aF{aH-޽QoR,ݐea1x1A^zOڠc؁T7kV
+![ q(p.o@i7oaoKѐ~ gPw? )0֤q^K] I8P5I<8@&{!9g#z$GV(esFx1 ,PV8À1faPR>7/ 8YCGP&)9񪒓E|$?k?3^ȕJ]@[ ̃_Cޣ\ Q
+6ZA6
+ȼC)q鐓7BrY5'12[Hxcmb87$es:IhRB~jQ2FHFY̡ר n֯DQ
+bT^+So+$:M Jb2dZ`;, .v 
+^۔ g±»dwqI2E6o$?qt,15Cyg%5&qUj X¶ kOK(< #;4ɮgק Xu)ػ H94W,360l!5 6kN֣iNxU et3zCs;!Rߟӣlre}S
+IV^ 5AOЀTD*ZgND*kFAV^>VAX~Y\
+2Q4 ߢ_aEԾ 8|rleq3 ЉH'a/yNt6l*zymSg܃r4wSf~jTG<Cma1l`Jn2 V>!p
+`T'o.U4,dɩ1,^lqHf$Edק. ~Fyf8!Ofbekc]t%N1xW6H
+*:]Szހvaݚ?f|B<`W9bㆵBrk nMU]Z.s?gۜ%33(B"
+DH}]zѡOj,$y&}MKBAuqchݷŁWm~zހxgW[4!G,y$
+Q-2(GH&E^/ϰqܺrƂ|c$.9 W]0;Z(ͺsQR3ec@bT^N q W }@wIc(HT&3;}SEؕ\f /ZG2U=oFx:B>OD,+)A.>1JJ9b&I?>H(Ɖp$7!7Y )`JR ʨI̦S*F!<x4b%_&\2- O~3>TaD+ _lNRG>squ:t[k ta6%ĦTtt@HWC3YĈV?s b(9r9EO;[.oA;, G12_N|B7).Y(ySS@{NBkrsYq* %1_~2]ja7*s)fiDj(p4S1 ̀,Hx}qG0] $opJ,WLl9_̮dD8otzPXUcVaշ#
++g)s
+
+|nS *`KmjF_l;mKW2g  l9 TP< DҡcP?<a l32Y\ɧ6
+#Yʱ)bhӆt +TA)>2U5a&w;Fuhۘr{bYJ "BW=zUãKCq#;k@`HYo P^AY
+ &@^?/.A~Dx}v Sϐh9ڰ$#
+Q&>I[*Jh-ž]&ظa'?OŽZOGs4
+ް֊MƧUlF:&9NɉQFLw_<'L_9R-z`
+e&e !PH]Ʊu}(*56' c a5LO[Dqǩxw eCJWr!( bGU
+hAIP=mXQ_rL]upyW MW/ݢ#TGK}M5ER6g9eؖ?S5drwNJ1~.;j;q.s;Mm&=nT@Ѷt\8'>=d J``+7wWC$8\$-Q! ս;{RҨYL4cx!\EiAHyWWɈׂ
+}r' iT7<ke剰ԇ*Ր7ފgT,GS)k%J+xv|O X),b4H!6 ߄rz| 
+w'-1]:^ii'T` k"=|cFkf"+|c9a>96.s[(.zey۹F 758;uBUs--Lh!<LlE:8Na'
+JHa9oNdr*v1 Q5P(.S(<{(Fm*xy;V}f?6
+-6܀jBsH Sm#FhDV)pbƼ!S15l:|!Ym{{h|>34Z Ho{("^`9b*Pe6'b'R^5?C&-e؁VE}̇s_iXzލ5]TV? 1k
+^+޺yJrн d7Bɧ6(o_Yo1T}5ft7]0kX!f>?"!%`Wؘ`t!O_Ȋ҂=e*_ܵ.TL%]4HG.DcB=ql-J 5nmk>,W(!5@(2^J\9u댄,Xq < odfq<M(kU U]l'>Ʃr
+m_IZ*Yؗo: ^Cw0]nCmQ塩L#
+n0ӃwZ%<<Wm`4 
+͖*
+P\dA Ο`z_~!;'^s=C5 !GEj Ch8"vjY+r!Geiɢ.^BcF ~
+n} 7dWe%^ 8*AFВU' j38z,X)hG^B߰Jo 6(p PҜ\(5lJe8 bC; Ix'=NYu_g2Hx;ڻ+iDͦt8l$*;3XHͶ`-{;J>\|\rMO7
+6 v;,z .qL
+(k
+6 dFHE
+/w3q"YF='jn5Q>Fp*d !}
+c8~
+R?2t[y۫쪷` EDp>8<@CI!5d;o~?.yA1Ft@hp~࡝uPW2%+wpXDwc
+է ky:' F" Rf!B°go蕑rMkČEܠX{ )ÿ$'\8v2VLܟA
++M¸5uGD;>"bD[n3d'@Bi>ɬZBdo`b3F|"X\>Oz4t5_Nw:߽d?=@h8OL9^e7X0L
+!+"9O0&̕حu@PzaUYaV
+;E~oPJ}R+h}1WE1R hVńeIݮJMyͶ(':st+;0٩OM7d
+B}.2ɏob9Ll|?
+zzr9=-tI$@Jr!qy7YV%v䕻SyCS4>y'D!"DA_CHȯNTL,w'f O0c-y 4Tlqa!1`,+[MS~ҧ:c/Tܝ/I5<H*)Ao,)B]^$J0<c3
+7fz#B! Q6-"nAKt
+F XѬc U1a?V]Wmg)b/eZFD[(23W9W#g=1U"rPYAR4HN b SWrwnK
+.gCȑѥ(AXiO:5 o{u5r=6C9Ys- f1<3^ȑY=
+wF-![[`b\L7_cP03֍Lp퍭!+8{lݐ^U~ǒA42q |9ZԬ 11W[#.
+J>C94<klK7ؾ0ޙB)mL8 r mW6;c0P~G?X^jj^ɉPѴd<D9nS8#Bc}JyI0j i'Ȓ0oȚr@8!lv-/͸|%3N7) O;ˀ  g܀@fcؒ='&.IwHr4Ss}~}
+jNHvydE%J
+&x/1c1o@j|}c
+ʳsXiZ֕z-6?T|6+׻4m$cR.-tG'oH.ag6Nĝ+} }.θ7'
+ Sb:ÀU0ٮߝdmt-d
+~ABR! 3Ji`¥,o AzTg 2T[X1jh_ooG*sv7O N1sxO``aTUߜn:-4B]G)wB>ÿEʸ\F9!m
+j n9H-;FIFlmΠ3}1M!p^PiS)-h s6 yb0kXkYG].Dҝt& *w@\88a!uP7q[N3ƮO)鰌l ܄L6-i߿*> ppR,22=x}URRXNgpnUۑAx~=^ O(H=`([ӦD6մy@h UuN"-ZIU`J"zɿW#8!Cp v3
+v)||OETi |V2ݘ,͏
+[4*q@Ყ2sBKV+"`1>ǖDe,'5!䭮ioے`TlS $Qx:٦ln .`=V Ǜ DV9Of. f/EݙfޯE;5K~}=2(_@'5Ew >ʔ^gGZ26Xkkހl3^c\u'8Z=gd';;&AhшaeI69Hrjl>*k֚#~/Fpt3q[†1+Q&鬧4t?@<]~Goɏb6nh:2Adz`>۶QQr/4 4
+'xTWH8?=DrLL ]F@G
+nl4^P0Gtrkqԣs祜Q/:Q~LfktMj[YE6/#Q0Ƹ:D()eB"XmDt{,@][&q>!pSͨӗ_k"UX|yLT1}H[n!D\+q -;R aU}٠Mcj]-icߤD$+uJؙ0;'E'Y+21Bڑ04BA'vlV$ʺe<7]R뮜kS^K+\WM$I\W 8ou mosYDMm%bH-Eh[FȏBVO1ۊ/q\/o\=$$^bgl!gMSY!I߾wȾoBiZpM3@
+}n6.:E ]9r2E=@dZ<1jb}K5/W}"[*lj97*4[%㏡Jcu7FdyLX<,NPxٱ:$e*)qq L&vۂP̝V^PH:ī"\"j5ڃIP015tkd}rgV zch@*F.p L -E#hbU(tUWM=U\
+\ q0QK ߫$gX{nԶ[⥏slnbI+e׽,fWu10 C)uwd(q J"0D4> J6愍I{O /Aw"@Є{_TsI٩<Be4tM螒U&rT) o􄣺jviΐ;Dp8ԫ /fQzb S)yV;#I0iuf-#觗Z̘i[M4ף; pPݐ*g٘#e+X:X3%/`EkT5ظ
+;qI<?zI[*m}=~Ș&= _ ʃ>cX_Hњ >ֿVDEL0&c@2ԯvno|,<Ѩ,yA7X8GSњ9B=9.bCLyxOO #
+xD['<hz\#PfW#Ґ|
+ڰzrPsqac,1ӧIoyJ__]#vx΢LL=9/s铣s<%⟣+)L'\SYG<'=ܘ'w9+H\Z^@Ks0zE=9/tpn P
+>ЩKq"j>Щe4<t"D4 ]#nZ-. 9t*:HG@GH5'ttNJ
+XON
+dw!&''9!zx~bH$e(1N} n<~riF3<I6o]- syi^ : 8F_<ev:!kgu\_lF4 b|ؒx>cٙm0,w $fЋj{:w/jރXphtYy_sSrP0J_O7)BDykb\HیMJM9MU<_IjZ@PWZ@=ɕB*!(<`ZSs=F?
+;B2e 3!P
+kSErEdp@3)Bvs2r.?4Ӱ` 3KƠj&jՕQd,lnj+A1Ŏ|l'57D)Bb' ^kCZwcI H:Q)Oj3=dI(v߀[yβ >8~&nf DI{Mb>*;9GWIㅁ zYgA/#m5iS76^EHˌ;~ /95Bۂȋ >TW @K0a+$%@%}Ch|r?$BЖdN~M =M⚔\l{h^jce
+ҁ< CN2R1:vCΚV"<Ld4
+H͎6`aE >A{rQT{nƆCJ\ѣ57yX&*)f15k5oh}X75e$t<15M{%T_І+D 2{ Ս=hZQu  2C[r|KmH&:jmDeCԻ>ۊ+?\drowP>ל.$A])f9]X3Gӂ,w"eIݜ
+ U"}Fi25!Rvl6
+fmG< F 8le锳S,IL
+b J.gZʌ@
+sVXdF'ہ8XПQF2{: 9F s<#Aa/`uh]5?;4A88E8Vőu0*U}o){Л@
+[(q F`i)Uy(5W>Uwhw
+
+ӐT_+uD|Nh(Z
+];͝ aWve`~ܜT]WPOQX`Rel +XhցP'4C):]/Fd֦ɣ&1 #3φS0ecG}s?pj6yuK[TZ ta}W|Nd"nW@iBGDžmȱ0@J&:lBWtIQ-;-K⬌MjJQ2 9Y9?9 ĤjP/Pb!fCFK[LVhzPrݜ#}'U}i:IGNV@:ғ;'X4|j:4* ԅ@+(g"zO&!6UB^\1􅴒QG|S^$JM?,饩+mv@oFD-D§]
+;?32x⍀
+Vr3/&}O gDx* AF \( ۘ;fP Dr3 F$Mގ4t:%zC8AkRLeI fM?m&Trۂ WZqN,\@A^~-\I~T tDC>86]ς^{,u3u!,_h<&,ABoGnY0E"\GRky5Y8u]z0D-t@I[Va8-}O=PH<wn2Sv1~? ~y?y'1L]159K|Ug7Py?Z[" ??
+I>oEIu0gݣ ԧ:rm 0B\7Teopue؟g5J@~&{-%%`L|dR@q(r_@dCIͧU/@?'`K^OW ,: S  4$rwDaY'J y/&SΓ.Ypbdulޖkp"m$
+D#,J~5AXKCjӴͰ(F#ڌIw"vmW˫{&#\ qrB1~ !PnNAF*6H<9YZBñ?Zxaћ$VIV
+qY+!HJ 9(Gac}!p
+L$ѡA1 >c`xШwx{r`싱<x0Ta8!I) Aȧ]S4LeuCf4
+~o9.4%Az/
+K \fwa)¿0/\{אfUшwv`خG$)!,nggki0'Sw׈ 2 'tJdRb
+LـvJO)9Ǟ%s;%tD@ |۳;f+PtDZ)v d @*o[B' cd*HۣUG+}Q&tvL[JgycR@Sl`?'
+CeBnuJY#IF&Mt[>0ܳk Kcغ~73, Aߞq (Q?+ˀi,H]kEᇜȤ`j KQf7eЕ^n ^[9 Ǭ^H\_Rb0={wNCRa ;+<J(^|oY
+͡d2r[)S'm)z81Gə:vʋϑ\/s{gsexv
+5sLC@+ގ@Nf"|1x%SNs(ͻs zņ+3q]xTlYJ%U=kpRWBH((t4EG(ueZH]Xd
+м0E+i9׫$nRӵPZ&Q]𸋢~
+p7.q9DZ ~o.lv0eR?06k;w7"Vr-XR<D&21
+,ܘ.PPz'CR4Rpi
+ MCq㚼GA v gt@pߦ3y2+){T颣#@Dcyϗ%/E~&0<ǠXf<,'>*n/ T0 ,wзrR±D=iY>h6#:dNv D7YޱjRivOy ˹PE\rY/snnU[;p7fmW6؆4jU2drVM ZێK8P7pW$uS(9Z]1mL{94@%#2K,\8KjP
+5TR~>ZiކϾ&*F*t'33J3 =h3|iViTPjX'5ښ@l ,b(13 ԣ[?hY +䕌AGUt2`S>ޠ+)?Tn&+5B+q
+_bgBAL`emM9g4l>٧@]fySGZLgzֆuaepňF&*Ir\gtWT m{nţ#[:y@ɦfGdy9e 
+۾ap2dsmmNA^>iϴބWY76Y9dڈ
+`&]X\Fω\w1
+jĝZv #&™ȂZs&7$W=m+vݫ
+(Io^%! ؋߲5mpcRIQ~
+JgC&[%=&%=('VDICFZߝlR4o5a S <lCPOpq]5$P]>5`~<k)i
+}͋tv:'哕>Vc ĩ=%j?Nsx琲DoD΅T]xB
+6T0aZ0} H[I4p_.d5 d}ISx9AL.*&/!lws;l<šuś$`ƌT9,2BXC@XqQl} %(& ^%ۣZyxj J~ԏ
+洒>j4jC94-7aAB+=Va;E&X<aP&7IuãȔ H%4),p4%L
+7PߏE5JpjtLjݘfqV/n`+=SD+LҶ+a`40(s iYg+a%3YJ>k y<gvW`ߺ}Տ/JКj~Ɍ iHVU@sA#8g6,VMJ!ќd1tPϔI*@
+y0K5ƨoݚ9N%Cg<vs"
+ҨXѕihaS/&P['^c <;ee "2:)c"b2cO {;KyK8.6K̮ЕD֌. Ww~cΎ5z̿,bB/8n @w܁!1-%Yf#ryq-: mQN]g1b%<$s5isr2wz!ag^n_p &H#1|
+c0q*Fi|6-<3n!D;i@<D'nK]|WU&V5QF{kӛ9I+*ˆ Ѧũ$PI,`fVʞa=k܋r[@K!~W
+09=$\sO-T;E֊)l.cfWSTZ,(aIO~H
+S!$Sg,
+d}̑?svxn\Q:q-
+鴜
+2]9j䑲ӫϱz# ʷiZ7<sc3)Rm|٥#$AF1MQ%RId;buzk"89EC5{P=CLe |cVC 60uMړI҇J<nHI
+!SzNq}ICaDɓOQeL\%?gh6:tTW}N &c˽#&Xth7Lg4,;6a:Ot0D,+5!L/hywCR䧵CtHe. Ɛ4]c:4~M#XmpyȦC΂PVA,f/3r:Hpt exĶPg ͟quBܸ[.0# O;$9tJF邶ZZ|3ә8@_ƢKtNYT  NBU۝K}|zkr}BIu j:3HȘNɉu-SnANʹꍶ­zurڟw?<Q
+z#p@SƛȆg}ݥ:$Ibߑ9ifU] !
+Bʘ@==tTvU"oB'gLqo2B, 7G"|,SS!WU (YtS`W5NSYstW 3C,Wf١dn58'pHNאC ߢ0L' /uhhŘ1H4_.30WZْPk0^y:#1+"ۂL fM%#NiҶ4Zz.Sְ<ls>"i=]vsŒ)x6fZ)ŻsHi:36d\ M>(ho%99§<P>x,m}3 CL[ay:]~hA-w2̋C뾱Xb\8Y.YwJ(!?Hߦ/\}Uz: h~t,dEhqxxJ&í)=|+%eSBMف6_&;H
+ ݷSv]ebS4f=pJo.Z5zsҫ6Gz:3g[ lӦ915 [ZIQ&"Y=&uk2!)f $B*O%l>ӢvQ#dx7C< ̓yû ;E:Vv dAw*쀩~)s7B]
+6j=ܔrA(g"̜'ͣM84MtF}]Ėh!ܣqm>iVP􊯌5y9=,<c$
+.<M_@Nї,RVQz2ԣ#Y RʋwחTj9T:+I9K!^*/O$B}CP.,"[uǎ&L& ebm^FL $d ]Hl!aP7Ze$\/&[r͌a[oaˉr)+3A?%tKZ~wT0a D /v2dCp 6X4.7.DnDjWqvf1#suؠy`G$V-ulLbflSCnLWg0(R-_E,-F;&D?g(fxm&WejҌʔĬVse\&,P҈J<ρ(<<Hs<J(rLbb62L|J$;dz mFmڐ%C ^p|~b2xo@ݵzEq~*]f+x6eO`0knLjf]$> Ԗre? nB !
+y]9rnF cwqvy=(e-^(HFCQ8M^L} m~8xVaDthc(K#I@{W&+`[{hf)DesW<iޗF-E)9.h&2"L(s 4x237"<ȭDhBC'
+ gS7{,ȪC,' :HbtetPmO~ $>w9tH`ѫ X"Lis@:Ki6(vy K XqMVžXp艆Lrp(Xܶ!|TUdtBcYg0} }J\kI^?["*?A"z
+e%Cbr9bHHnuHUh\t5#k 7sC_pɟiB#7678߇00ĈT]; [SdzG!D="x9'ƙX/f?ّO$_~?h$9.Y#0O_(ZZ
+$UʫⲰ<cxHejUҳ$l4 s m`.0îu\Bn7HA*-4`r0A;_)9A)*䕰c0Z"w͊#5ucꀐAhkW&+qSteBc7\RRX&pc[Nu*֎Ph _2z=.:g#\S 4w_mZ6Z!c]Un /Z/u?†k>:=U3H)v so7V$}j.Q%7QD%E~!R2Rp5և*UJM);OEq赉Mf0okYo"*Kcy9LF x2YM/unCu MW}N!<tknk“M_-v">sD/Z|@R{fchm,-7^` RRӊ*&Y>lv lyA~Fĵa0Tod$K40D
+tNeA
+3ӌO BJ
+h ^@E/3c"p&)Zɐ䀻ag*uu֪[ie)UZ2Jm_]eEhU,V
+~^ >:mlF?&&N>pfc n$ NzS<z̤P_W8cz-"FRfmu aK[3{}<A 7⩴uqh:J7r߽܌Cl
+!xm–B,Jt#v}&4 B!?+R;r۵`@tR`hx0FQg͏IQ _mֻ Yn;<tI
+:G!Im¤G9e[Ow|C2V<fINg(D~sMvN[^UK2MYkdua*&:;RĄ!΁25;Hz1>av 2=HmA'8"3]_0P%Q lE < nHO5 ljy:X9*=U3%=j@~Aۈ>]C //}D1_kLNk;Ű˺omqNBbHޚ +!?-טOBK_~<R)><u/_+G#rm(/)y(  0?>S+|*_s
+e{WoLHH@]Aߩi ӝi=at&U'ƈSZAD
+ٌ/W;H!ʌxa즱KdC_"])
+DXsxe?GזnU`p
+j-sr!Y!g]Kƽ:(cve`yCe^8Bz>tA2QT~dotOiNzHF ~+K>
+e6f+wS<Nį<T9C ~]Zq({ver6 ՛awc(2Q,+}nJďyS-Ysd!j>osM:p%͝[iG?>JsԋD3 {煷IeOd)sB{NiՁmLyv:8{[܆CgΒTC% m \tEdQf!_A&6;;^.͂|^1gA@ܓ0b@[TIB3!"7qKZbbw&tN&u6-0[t5uy ›VpuBRF@ Vq)=L
+d?}[ Es!lf$M6 Ghm{9A^%=< c g6ӱ0S EGw#մ)hpYۮSy!'.&gͺ@@e*IyS'*iIx0G$('O1B%4Hg;;?{Wz~LlC ,I #_Dӝ=jpXEoFESTM6nv0R:&85JO笒(M?`63A2ӜqG,%8Ĝ'b:X-VBvfz9D78є:Cx$W@u<,8:u*$aR[wVbÇ`!cWl53e\(&"dU&Nl’7g*sw/fB},iޖ!#3y ;~
+yE$[FgylJ,;
+/yDSutX!| J
+,WO& NޛV^t+˼4z ^'^O^!˄%QˠCn} (%jK+(fś-@I`Dja.&pPo%yG27Eo
+@ޛ`;JZ_{C>dGsmuAѿEx%"23*ߨڰCe*)b:~
++*ɒfJaK`KNse0F@>
+%k?I #1NK iJTtH?剏! $u
+C ʛ^b,U@ L F|
+v/K`A1w8%muزpNW,x\[M0
+F]NLW 81
+\)GfֳQ\%m b1T<
+!=f'ZZVaǜ ?78=;HQq
+11WIf
+؃ʠ[}V" 0*v7pi(ׇ,?.4mHSPD
+ yvVnBD(iϛ\ crBPlT^ L)0Xv
+LAde_Z<pmpbA @iW-ps2>n<EPWS?*zϟ_*45an)yT+f
+id0%X5mqmp WI&" wp Ġsr'9R*^1oV{60 ]#2VCr%Q^V gK3kE,cW<.ys*Qa_"r2eSp!4N8%&#+@8$`;wnEP. C#w/g1dmHuz <!ؿ Xc
+7-OTL87XK,N
+i
+< < NJ(~Ԡ
+P/aR3Q-7U*ډp̶lfvğ]'9l#u:ղV i^I#p`hhŖ>RY1fl{id0v;`A
+CJ 53>WCȼEVK3 dFE]k;t!#ZO|.$
+p.(2:eC9Tqf* BmKx}$:4>RazYc]l۠Dc&b4 Rf}atHP5Nl^h(؟uJM(eAIΩaWkl_CebjẖPG\F#`kk
+d2YI+<?h9/f!2^+7Q>#k͕QY8AoM/VT$ F+1RU:6366
+H l>?E,y}9"e1o+=/=KZsy8#ڐ]d[s`9.˩uɒCeoflhSE籀>?+x/IXh>-aH14f,> oxMu
+_^QX51'_1"W_)Ü~P^0FIP0K\,7
+ K JJqK"ӿ?~Z"n͠#Zk2'KEB+;7.~f~jB : 'Hӱ쪦+)0\ \tS+V@4j %z@&@ K-ZU=3 P2VU RXk\חi fV(uY6,O
+&\+C.ZsD.9q]>A y<g4Kf ek[êѡ 4I B@r+, 2JZ'0%Ft9t
+ /6 DdU=8iȶdYx%rU{;)uہq:ةzuy$IIH00pjb8n ]xxðENf%5Αu!UAQ!tRXԷvۯ@SbH*ӽ]Bfۚ+tM1 @"sBKyچ Yt@oDNrEBP3x^ g@||5DCV 2U2V!2akOW23NR]v+bg: c`a!ᜧ4qL/'1f=Ƃ ڔLi+\^O
+{t8kOy]&ZÐ?
+[׊ t@! dRękԹBM9>CsC꒩NE Be[/^>!!̔$nv`S"6<$͢" u+1tD{4q<\+]C$2Ii][l3s .*$7a [4;tQcct0 \H!Z|ǜ
+0!+U"j1Cv8{C "'R7= ?9iV78.xP(0A(zJĴXZT%:G
+睿`
+bF0K (s_z|TrnkͿ8jRdնfSR4#Q
+Bbq{ hYI(KgT>2kf^лWÄ V zeӈA]chDZr+#d%!{T9RI;GOB.&}"{f8 '$@Avqc(9XV7KyЖRO u`2e6?xwMqaj7: <u"ϭe'8 y|s202Lhw2ɍ+ |,j,sloJH6`7[5ZIJG7do*Zn
+[3ܺ o$h &'B
+Y ƑL{(V#Wa9Pŋ"#cu,6XF\gHbsh)E^AO $^Y!$1b\qSmqN
+)i6cnZd4湹"cQJw=J!3
+r8'<ŭQ*Oݾ冚J7ݟ&
+WVEe}L@#`+QWɘusK2/Ae9)4!%!&|R
+x"sjW aLWA14EEɒGϷh3 ;w?,\`LK CNB쭢l6
+H iWjzdile&MMj431&*N( /("8)'PIDTDQ41iV{W|;><{p@cZusk&HY9h &g¢`^=Rp.%hCJLNNlNM`]`<2ѫ&6աgVVMx}.f3;\7H؜==RG:f嬰4|Gfɰ~2d]IpZ14qS
+Yl:=Xw>Ä;C]TP27՞g
+
+^LTϢ'w:k ;ɅIf@p5v%p.=rdd\jB[M/sfiMBgكBb>Oj7߀kY!gw8Եo7EQ&>[-_mM=>S$ytXTU&p&C͝G`LZwČTCv螴r8M}!:TQrJkOKE,xG15
+|+` Qt71TbP!&C+6H,z⾵kB?ұW¢abꦜͫJډIuecT_FYY7@s_EԮ
+*
+".M23"Zەȧz*<Mۖs:\īc׾'؊bj$AđPrvGp/Wߣm5$X{WkM]虚UE}m(cK]4>ӫWzU@މ,dw(G93Hg(E̷D?1QoX_7x|O z\C n=cK-(W _2#Ή/8ĵNLf:&IbGBy|†lʸ?~92<Z2j. FkJqڟf,5CՉv*D+aR|-8 %;{:tT sG;մYZCHۙaU
+鮙Fdfo]hBE?3BlhSVnD,6t -8soqERi >LK?/g6gb%d67*nwSP*!m $K%+m *4Tߔ^T@-(!n[
+2 }U)^B  VfIinu
+؇F*bK^?/ 5
+z
+bxu, \# o{FQ=-N-Aۿb --v>׫ŧБYe
+W?nO 0X񫵯myY쾉y``M):ܫ$Gj4"Cfٸ]- 4B
+VEUސy4LbWB\+, 65~]"}iuo}_J:zT@7&;Ԕm55Ǯ3ꑱE5m{*y>yoAwEkB( q8oa *nE^K mbYwL]y!+B_uSP= 61:LB=7e%~$Pxɧ!U02?M,VT",6t0-?v}
+̽2&ywLꆂwZΌ[lC=
+By/I!eѿOĸP8)٥Hwޟ.U B΁D[#TĨDz5 C˱ʚYzoOHLu?Na_/vCmW/h#U;Z ۣUڎytZJѱ [陥A>P3*̷ Ql#Ĩ-w j6\j^CiY}7JVN0q*#Ź). /v8 ;3tSlȪ"t`oO
+w&H;4sH뚑G(ק nKʟO
+[jMnQoDcу^|9֯"gb,$WIѓmP K.܋yRҵ Vz䩩**%hoiyQwW :1}i#
+믌w='ݻHO&}Zhs (d|t![_b/gE?HL|v~nt]~bʽ7w1d+`Cgi<X{4ǮESmi N s[*ъ#,rB޺ Ueb|% SM7l2vGjrwU{aҰbol焜,U46(&7D5Hh;T4l̬=32fRaܷ+H3g1ps&r ine[pʭܚ_afn+pElHQz别 ߝ۷v[bjB< l`aC\-iŋQ\[CI<$ pcȩ?sɈq/$6y {p̕zgef{^}llV~dRS Gjjn>_49gK ֧JzO(,9ې"EnY+72|un?UZ%&I o,ٔWG1!9!bGMqORVG \Q
+=J6bOũߝ[9d'hc.@fN `"c5iEqBSs]G^gO5@}#ҭlx{LGo6icJ7*֣e)Uz*pvy:J
+_$]ohk&φHz/zz:Տ^6m`rL
+ecJV|;w{_UR V5=^m(!%czIRVDMuIIo
+wga B,XQG b_>n0rjJN-z|m3H-۞`CbbT!&G(yAlQR)gv4]|`{4k?䮭6`^;E;qI>
+!D;̘!<wVь9Nܟc\"&;<#%~$yw_Ƅ&^QociVwVԴ6ӻqoiyUq'&zKYoyCźjb}MC];"̧WG*:n+[/2΢`A1i! CMfDSY{SE= Agk>n2+R#zege;Q8P, eV˹Њܚd^ʣj/wU<hק b$8C
+7pZ@
+I#.Ys 0@fWZSD^L%T[[󎿪!cO,{*" >֛; p'A6]o.r9ȠKʬJ',k.ۂ:XԲv9E,,{r1擊.ǭNT=j8mΌIKxELK94c2n/QZļ%dl_)!)tqZiDdZP4}Nْ$b. 7DJX Ѥ@G*"
+nW0o(:BjXV>-5#B-̡`(yqZb门ofSR:޾gaR(jXْ Dwei<^Efc~K{Y<:RR;ҒNz`Փt,V9P0 ޮη0cT7$olsbԹeVrem[K~ W}skWS@#yvȠDm!Ԛ\
+vԛ΅{G;|\3}Í'|\աLQI%7μY-ydUQD-.+At_<Y@Ӎ#gfV)9f)5-k!d'%%pS:5pPK"6rK0ҜǺU.=<)'$6Yud-1~{x:=]b[0|/GL?͌[Ì 
+.)< 0Sg%'H!B:Mǚ"|όq~Չy$ֵX^~X\.=2>1 e]Q? )T<88B(.8p
+n4LflȒp}7.7ʠAJ0-+%u"}ձ'⊕^&~αxh n;Rl.&.eT|R*~f@[z4rlhQIîb6"u\ݻS |9eؽ~V9֝ӧ.E6JIk 'gl4rnz/߸pI^711pu Q*^! ˡ6#^vbN7&սRfH M'IbXGQ n\igV*$~s#߼}EH T9hI
+b{c C4_)A]H%PE|¢\
+)X%6>Ѐ?_Y}bv5s.Ldִxl6elRƼCz^s$[EEL`}\cdS?U-
+Yn!ѯ)[O\΍[B~éf'TM$Xl$
+lQT |t
+,?vuY2W,kfm jRΖԉu!h94 ڤ٦@\6=:zp`l6WZ!G4})WS(&ؖ<
+XG^[9Lj$Pr,oEWaɺZ۾mq;WY*,dG-d7P}#ۍ8qQTEw$HVcFx ڔrO}\ho(8ۮqa8i-/"l㥵7^jiOIv?%,ʵIɎ3w۱v%Kw!7<}yIv rYX0gTEav[P]P3Lc5NjyyQöibZʜ ƌء^=BRZTcmB|3%g<yF3n͌&T#'fnvǮfѲ;*Z$P$NYt'pȉs9ː@jU="Z4h2xThCxhhcچ4<Cږ7bYc<ww9ojn!ۣaD.GQAtlkcь\JMY@6~-YȰjU%jN63DUr1a)s&Wp|3AxPjsIѭL$VN<ޥoJ |>ް?FTڣHwhqerJpДfr$2-KCI3RdzD+keDFn 6sTsD~xM5wّ qvg55$=5Ъn #QT(
+@} 䍇3F.7]^|PNgGwɒ=82s>FYql);Vm!,HJb"rhh"E >iEKPgm 0fmAܾ=,rBSQ1 AJdf_[AD j=Z|+ EeY&ʏEOs?>
+.
+˻:4d]"٫I1G2gr5FjPnMܩ_WA@s?
+檌Ni#Kr^=JwY!uPL Hxn),AA[zhšnU9;K-850!wp#oxG퇕M󡘢!PZ B+  ~f=NliYU6
+Ck蕫 2|f.ؕd2 ԑYO>!Mb ^"DZ>ĥ[%CdW*BP vW rMنzLMɄLȉ ̑XQ8nPv7}!eUq'܌ƀ6;Ǔ渻mU64C߂йdQlՈ4Twtn{^B{=B&b&
+
+.C<|TN 0y iR6F"KhBf)^z|]E
+7Pcl<NU}lBde[v <I&6-e-׽ˈc6u#4N|Mi:W#3C`bwAI};3?I" ,${AbF(bgp\ad#Ѥݡ'aN9,J@
+PeO{o󗍀+j]$w{eL _d`ɓ+[ge etH1Y먐RH^%-+MA5}:Q: (4zd!RN5(u)H 3O;pk07eDjZVYZN3:h}B];0Qc2n˜DmsZ~7/o!q7}7ŗj[+hn^Z/=㍓CvxogDM#Lzo.ׄڲ*RT@nwk:$g/*x z.t^T٥/_6scFYCZX'1aD2avAݬc8vʎSRcQ0a\]|C|k1$yG 泙Z[PN2at}3* (&y@1,86[_*P+g<wz!/F֣1H٣Jw p<?tG1b;SrV
+d=T%
+ցDPܚ λV"
+K'3ͥ}tyhoE5M> 
+Dޱ4>/\8=737|
+yS;[ -z>(./΢7{4ƘKLOO܍Z$i$)c^;]%#56l~Hz譐De5kN]j(b>D&YCj%{4-ky8dqz/l ,ljK WƟ֞yhO{2dI:c,ĸK\ (hDMbDEdY(";(:gN|~7;a$U%C*Uu5Si \Ssk-+{&ٮr;en2 \/[3++eiެZ!Bͫ9-#G__щHf0JquA{an>!7ŀ;UnR:&-,mOvm[rz;z*eAo
+\Cp(rWTOo2V
+(}aGkڇUܣQ^lDPDwe7 j ]\|Myࠊj_I|r죀b(y5qRҲ:R֏ǖyɩJ񕮛9dO5Ž؛x*/\Bщ~X~ESV,n,=GfF7m!&eM.8CE']zXgu瞅;''B n6W u}YJTSA_訢?F?>>ī0nY׍VwC6mLR.ȥ}~ y2N4GKv}7K R_͝Li04蛨aF"kAma9Ա?Ғ8ޔH7u]zoo]٣镬;H'W!4m +;o4Oد{xW m1xq_^ /X3O;1z== t⑭$vv6amE7pcɲ8t&C.ָ]FOne<p@뾓`j -Y#3&5&&N5'zr& w='gڮI `ġ?+OYdkA"jr?2L4g޼:Tw& jڏZㄞza4x|6[*d]piõƌW zd =%j=RT}pEۑNBKZ/txr婞
+v:Ļ:4;)O"#-iȓ \6`E'dwĜ}J14 >y1RSMfn 8j,I}2iۤHlK.`3fR_zh
+
+x#lAMy;n.}䱳gMX}p 4΃ cJH4 Y7s?FNp7kϜ3ӹV[umokVQ Wk YdMKnT-)Y$!"$l%B,5ν3x{|?Hߛc<}w=ƪ-YM܎acXTmjx,y|}s4ъ|چAbَ iSwܥ⋵>J_N0~حeޙk-˿dyt-$bFEeZ40ݕR7k"4!6`F}`ڤOXGW-˩"<fZ({*:*!
+r~OD_kr.:;O KiWL©г+}:69w϶1tm˅ŊݳiVvTؒb7D؈=E#֣Tf蹇:vs#`u/eiަ
+وSrX01Qp|mGW_ ]#59D:c@dz\ aRo%*u*612=]9lU>=16sbsj0`p{4)9.tM
+qiPcfM t]}<EG@'Y(8tᖘ)["BgaÜ#@r\CIMZG:wiI'34ӱٺ}=BO+0 JMEOGi.!T7V6Ӓv=0)z1.A/}2C].p#)1\.iCя6 -yMXBx`٤] @rrd*֥[(߮H gK|*yb {l$6YTL>3*?]q ̸9ߞ!ĝLӳ,GxsΖ k_rv5 tk 15 gUP֦B0U| 5?&ٛg`ݺͯ<WH?ԓa5[Ya`٣C5*G<I `[ŕq6wd
+ @k ?o}}]`{[Y8t<fedδ2|ƎEa,My^K W>f|<Z۟f^ 31~b:33KesM%!;`p}Ӭ́G>=p]df {ʪh;ܴv);orc/wЕ\U
+p:&FoQCNU}Aǟ{\.h ib}[.#Co_..\ښߴo*YѷvC5{,^ӿNuƞc\2d bgw%(.$5?ܩƛFmXZZ.n"nₖႢ((!.(n̝4w{~?1t
+c"1P;./yOZkuQW: ~kw(fʛkmJSJ:V6E.2ݔ
+܊{K~j
+?QbeUT䈽7PFyp2sɎn'Ɩ,ӑ2{Rbbc%X7MUĝW3(jNbؕ]'Mߝrp1_ 0й&m13~]It x ǚ$^vT6G93TWÞ(")=dFل[Gw_-`]s& Y=[Ip&ri ;0Nߘ
+S_ΔħǣB0h,'P,Lu[b^숩`y.~>dHsŜh #X;bA*tDu\3hC{ܔooŸͷyx 6z[wF7n$ց~b`7ͩ"2bLrqaf`N!pw'3h:I 5_z(7Njct zr.Z}tqJwl"ZoF $@5
+u.!Y%)U\e;
+fc:vIq [S=ֻ]1X(p},760V\O
+zdLaO''J:`
+*qi>jc~n+
+TabSsu 2\e +񎳟Cn/5'nc֑Bk!ʉ]lž?7tOOUɋFJ?8ȇddad+9t#_̕Q7rDZ~(LJCYlxqWY}nI535ho};>l
+'`23@EoI6ϵܬk}x:}-˲S ?RW]xF eE7)+h%!w׺|Dw476Y( x,MǓzl}y)83񢤩TW@^Y^qRrc야Xǡ"tCSˌ8VU'Jv򡪌`g
+
+(`CE `7&=(? )f(:fi%Ezp"!g{[W&꘡$ȄXp8J#Ȑ0S9X.$mѲ:
+x>OV&ئ.yMŊ
+^!('KeRРY\#%m ?1^Mm}&wwMTWf湚f&ޮ5Utl[1u˘0:Q"d\#Q
+JGq/wzڳwE6<
+n,0zLx,[IN;_d29K皰vu IZfu.F_wH'J;$ z$FY,c4<'.|mľZ
+>ngZP3J~EHkka>NSm_bժvmDUSh+fدqL""mБ7ŤAj!p&{DJ;DEXE%a+t,o tn VQg:eur7 ؞j ^4yf2.uu3]=k T"jMY_C.(>_Bjswё
+6ҽX MaVqQw>/b4و:u:e6fP*ra*K!{Łs^dFq ((
+"p/x6vC^k7.h/5BbnKbO84kF݉GZل
+ti{9A-4%쩘o!3*pBĖqΘ]`EHwMşۥ8TW$dp7>զ19S澲QgQ,&-bo]
+Q;G~!;|_.^R婭Wr k8Q?A.ϷōVQ9mCõvkVf~ +%o,0>/{e֌MH<T  \}f@IxF>r‹I+,:&doޗGXuA%dsٛcBuRXY#>!/MyYFَVI8Q'; /2j"Z!?+E89Bt}I㇫3adaDOxPtZX#ꀜR^YB"rLҡ7E+bD\!\w|mǍ=Ctdlo8spAtU!61ݳx=H-9԰Q6!%f4Ȱ O.+ŏS}3튄#?^P61oW*smĿ=8呋 Ȓ%Uіvf.:h~dx#Dvh F,
+ޟM\.-}OS45#{QZJq)Um 9ј%"'Gw-wTWWҺuoC@)^>ɻ[ `}Ae $>HsOa@8C5KxR:cSExս[>9Puvg0<H h[N~Z$% 3 !S7>j=^9\`T׶3s'vFv{*ew
+ǃ\c)8Ն~mcRX%GTbTD)F&iECmsϩ/Rcb&11Iw4]<g]H;]abzrk9cysxV&l$@' B[g>P{◐VdRfj$cB&>:${\@GEfݙ]* jv\ >ʈ t[nRm85Ihaa5M|[Z?$}ov ,Wq-2eŽn_5)JJ?d;CM:ܵ| j)!%oVAKHpMݓ#Z2lE;~sTW3!?$k<bD (_L]xǶϯc"u8FU?Yq V|rd^d8޺[0PD/"?Y呿my^%ls[W5<_3kT`Nو7ظݸ1y1Ҝ JaG6N2ZRebU@Knz
+~e+˦9j ܝYAB 4@wu7pN
+Р7O^Nc^bL/+;1V鎼zWy`(65J3S.ifY5_1WY)cKYZᆆ=Nn*XmG֚?E~枠G WF6&u8?A.}֜鱁x( sA-`AM5])KҲ'[ ZlKАJ 2v$W˳oN5tbka`d).0}Y%z
+. lT3+Z1+WW_M{:3'iL,g8&*Mnc7M@wDTp51&P@%ʪ( dW$&3!˼{?_
+xQ/v*t6d/zl N]X r+VF-""zG+
+-I-vcqis¦iYFdtsOψhyl<K/S["[A}*4쬸 G_;&IkK]^Nb@qH\ZbKq)q=dо92t*
+([{ҟv$uiQ AzQ~ ڕzdR{j2l_~..;6
+jgEgVOG<>7 ɐ>)&]WC͗s^E.dОVp~7(ǖfqš%3"l}x2p2x/+cxl@~:+tT4EEK5ٞG[|F|Öz!wkF~(UŽ2Q-zWF(15w+ y.
+_36OvAWjK$z_Pkj
+8- 1-.+ h^Њ,ۀoC |^XXV'e=oɔ+.4?]C=G66+ÁLz?%f`x%%~3am71<QU[np-|<,#D*KuJbcyKNgȃ  '5,"0T{y^o6X\JfOoؓr]@A9㟺AK!&;<sYRy n@ޠ2|3r5$Gwh禩w߀om2`>̊*^ev=tBs}|/o:22Q꘧=jë]D}fzsXM.?clu * j@^s%\_1 >fG<cU7v”j;YTV#a޲z%!52H6gY2d);7C/xkw
+fwa=pvLç$|jAi(uٖ=-vH08`~-X魸 x
+ NXdҨ#ݍ[gat#7b9$'CGS|F"
+$fhGnp`r-i]EWP#.fG+( 63g’6<
+OAhڝC[2##_m6)ibN<މII
+.Ƭ8t ME =KI:zFT}ԭuC \dl"%I D
+ke9\ŗq2iE8kƞjȌ֔2
+eQ¬;r@YTWEE9^ą#kg)*vվ]8+џV@oL
+hߔր,BL
+
+xIظRrаUt2ᴬ>Ϊ?ծF/{޴Hؘ-r`wzfkJaW#cnt5^"ѷ\WsI;=1 h;\cVt=y{3ܘt|Sw-]Cw.nKVZd#/}t痍zOnj҈ ܝ>qZǽ{4f$GgǬ|\"ćTPALzEJ^ָ⣖^Za<G_ޝ =aᡏVTQ0,4ADG({/=fHՖ   ۗwcbZ;+C'fsݧ>}F';: J7loygneەUg`UgATM~thd"2j1fTĴu A0 VZ5l#8O1b<tHoM8eqL7tl<}3TTYCfmj:]%1]Gof@HYXC='yU/Yq|AC`}{+q])frŦPjcH}F:^PM B~Ʀz57n#>~M,~Cs>mp.%j`CF^)Bf95Q?Qv Nl k)%E!eRIL<Ev ~j"b@-
+;/}O(Zd!s)4εsH=S^`*.VWHWPbY)׶gH5e7Pe;+Dj븼7.')eb5'M9[~
+J><`Ə2󂎲oSJ^fMdC4{Kw++lt#
+}|o6%ʜG*x`Q@(xشr/k6|wJ@Q@)1A|rM4;fFs|~vkQbfNkJyE' >2>^pRᶍpZxQLN{4?G^dG!B_knҺF[Y+{vpU4r)^,lr^hw)#,o=Ox׋89)+
+vN{lɘ )S@iԗB"xQq!>yacץޔ6
+{6).e'LKnC0n$ 7R˴KƩSY5}0;/H@c?zG0]zC DZE3>;Atfcsfy^GL;̺歸ל(e߸vguKGBBB"‚7AWdҪYҮ/+H9V AG7϶#ۖ: AlIVhjMimw
+v`:ґc
+òºv,(x!b3GOwO?epe]@ܷ &mBWU
+ 8ceX]97wQsQ{~oq}zs6\-bWDGL.VuSyzO3nHa<bs'ʌ2 =bޯFKnX]G~4$֖|J.@#V /aЌ,
+r,~1f^ℙ*p
+(R6%;k{*Od}}l0|5gM]\G=j{T1r6c5F(77'qpUBV]_`O$
+Z`J. {O/6$a\7{تS2U@]rq% =2'JY+>i}s\^Omgdov&$8k\( E2M.~tTA`u^lA$DHD1q^|~&MIznPuI^]I Y-ݞ^"]C]bƎV !e)xy+ ]hrnE`mW?j>59>@ 1ɶ{u߬"އ#`vdUy_H*zm9…}Yʑ철+ic(]{^ 0V^l" +/rahI&9e$bT1(AgXìܚg e!sD: NF.Zh1/b`ՇEU; Q 1KҮFشH.M|qbc|
+<%nSRm3#oK*6pîM ii%u}F U>14KmUA.vtnuQpK5s6NδAXj5M)tQ+Խk 0JQ;o(]}vv RB{1Sn{T#yU)҂OHDii:y3˻ZFC*e<#ŀj4řOF1L嬕w?lϳjRF# .heGo ['&l| [}{s 3>e5r h_m2fR<,ec +ce2aN3g{{ED[Y \1(Ã{{#:Љ1}ϯ
+Vhmm<ŝUjrX7pfsW@:>~_ "Ծ:'n<MF;xwܼ^şɷP;` 7Lͺ^]7ˣG^~O#
+~`GC)cԧmn)ae݃
+c?Y2nvx4m_ʾTc[qq~7F# +e˙ʔ+EU_S+GHMX}LY@@\,b
+ȒYzllywk1jӸ
+IINZFY 
+؇n0vfWZSb1A)L\G9G6蟃Ԛj,펼zeyq㔟29DH[,tkoV&|RxRym3`5xѪQpOa158pR*S/k/}oVk '岜SЕY2F^[W_&̵7C9[ZbO7SLZpJzӶ
+zd]
+,taaQJjVmBͬ~f<s9{sʑst<+Zt݋h(wúQΌYǠ B:zX7S윲GY},iy;wUňn5-2FH/sk=YeI=TdV^՞.bb6?__N; FcDxֱ1ߖXU0g5qwH]暬Vtn"ZD,D/ Oaގj3. K(Ȟ C E۟؏sҐr3(j"fFO;?8ܴGκE3Q!WLԚK<^/Ns5v~OΧz*7[MJ|K~$9yiIxdޅlEa +5R!'!]}5$%̔C6vj;nGd
+
+CȾ7 ALutbI dA a YȞ
+Y•9Y-]v) `+,.^uFT`Z?ɍ,2[<Q`W}Y\?z&O? (] <HyY'GP;ËCWvTӌk13L%ZBSB&1%m-*Wq=9n/c$uƸ@l}9݄[{vB|;oϗ3//%OFvT0?t4Scߓ3^wN657I7oI5wq/ofu%
+n1ZUZVw Q-6HI up#i.eZy]<qYy3;cw%r)l9+Gj7^?3"ڑބ7"x |&]B/XCi H'^ TrĢSH18m_=I}
+x#]G>FFΩ鴎ߟֳ;zP^'!VFo~E^۾NE7,{'yTz_"<p9o);!l%0:N{Ԥ%eFcTnMsBP\@ _w
+VpP_S*xukCUՎvWEdS[J0䓈KkpM\&H jT!l!Cɾl4O9t GNvq5QrVU,
+鍴|
+O@OWNG4<&p<ژ1c'gꄑ{` Lޜsr6hx)*c=eky<
+<~zXӱ1d&Fiί(w>nʞϓ&d9蜕Iۊ]%>ndu oqA-
+;
+iza*z?\HQt</tU)ױOshjt|ۗ/
+rN vnOlƘY{8E? /cc;5[JF[ YH9qzyز jҊX,J#{=s/MSP2s@=AXkb!p_fOMei
+!Ccp{qVbYFoa`e,( :umwk98Wy˃̵FѮK~QO=\p [* ܙ_o ;Fpq7-uOK)*w>1 @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D`FBW))E"V!C 5]!d5 *H)iϔ"&灦Ԍ,rZ !$|IAJ@c-!d"gAJ'S釯&5 EMdSr(,2EKHϥRshTZf;DLͤR3r2(,AdPa[. D=EɤRhYwA Gj$Hդ\SF`&I~$W}-`7LJ+d+L2rSZw2?Y%3sR9d:9#B$3y=S׏4rv8,ro:)%p+ LȠJ~^íZahFO|O%[Fqs*n{ ]\Cv=;&I$7LPT\UtFjnъB3JFhVv-`6,;&\~)Z
+CxE_406?hu'`]_{oJ^?a;sXS2|Z$/ T-Royqc#gm%-8)iΥlw-ᐱNMO,WFawI =Mޘ]E-y4Ұ]؜*\ilq.L+;dTvjy#6p]
+˴+_NԎmgtjuj ""H !!dd7qZj)" ;d77;@%&8?H/ΜgyN3=]EM[ѹ ]P`{^X^QulUa̬ .{kV{C#8p\+y'Ix ^Y{%LBnʹ Ĝj/ܟ2+Jb]J yެƱvpʝWM'>qSrI G,rD,
+1I0@bQ5[M0Z!e֭aW5݄O׏KUgB^HXº]\nO+Mq_a{AqXGur{mESmpI5$jQ8lQPtSa !9t~
+(z頢B]uMooQN%nQP!dŠUW ;0ĢJ ܜ
+ȰZD̠BFYp,f]z͹D폊[#q0i(}NE,b@)"v/V:*"ꔗ[CG:519yJ;P71^QCb{ JE9"B:Q l <}5c:}Z8
+>-톌O.,$<VMȳg ܼUZֳg3Ԍ_4&zG&[yY{u*6ɾJ<`JjWGVϯ!Q
+P@b H1pV6NmFYKDkC+'e
+HKv\9DW=h{]#1j\HG2ITt1?o7:| W'V<LrBaacBG>!mI_u!M򣚠x5װ~Aj^UR2Ǘ>!$)i=i< 2UMH!Xc>Ko'P%[Vj\ mio졢5+U}R!_
+i""^ŤZ'nJ.GF9"Ž(dIW9~rգW}g((Ru*Wnp=(W^Uu>OQ5yjAF Jw<=!/P/;+{PgƃZ'af։b`<Bڸs!<(MzA P>f 1b-V)j(!dļ7PaAkNPג05q,6DaDiW#}6oT'y -(OP}kYZZ0
+.Ӯ`
+$ A6,_/g|{tMޮى}䷓}s##v]wzS0PҕAS']?ir{ɀ3VK|);5<M[[>!Щ&ViŨƍ9<!)btS6)v"W&\z6(r?NT;t5YtF`VǷA'qjK/@OU<7cPS hL~TYMd&9_2U
+}8
+IGHn q|cQ*8G *3q`_9*ol Yn5 ^VQQ=[^9GmJ .azv[b\IH{Q/+s~
+8EM>IisRɇf"_G mD\l@0!q0'8@wjUz52YB=L^U@<F*1D1,,
+
+rwȃ>9TFVmTdyK7ub^"|2J:-ϾQ'=T+x
+m+xr
+rU!㍁'/hDf[u$NF]u :/Q:23l”KSMKk_\OJ?@ܩBb}Dmq
+ӼO〖C9j4!5
+t[-bxK%(>AKHr^R2WZ@;>92tR囻]-yN|H |g}=1E$scC>MN0|_ߒoPpؕ쿌=dO;Цk*WG7k(_-[#<*+3록1z]nF7Oct&l.Pr TVxQf ֘wTV{*\ͼ[%bI2 :$ydА +RI8)MWY«n (޴J! FZ/C5WvFF+6FO;j[m:|jU[O@-;E˂d|P<`pS/wLE;ϬN] ww1 T,E=թ:;-@kh1$*l<5gP=h+`(R_j@T▨Z:uҴCj ANڂh^gbOv< v&^I/Ju tk [lLtQOPGg D#\Zxvee+IZr p,l٠@]t!7>4CbTDYjh;+vj„d>f &xjIx H:n@Ѓ1TkW;<)R2ڙXEeĶBvyMl ҅iߍ}i+`*+N^.l!89(Mj=& #BNl$E*ʠpC&U^ZoLH>k{,ٗdj)&``ō#j8Hm?Dԍ F.ukG!8kʟ3ńav5̉4c9=mBZ@(H: FM q{N]]AN8;+84bLoV貫5#\$Vȶ}fAϭ C 7niN $H_=6D9#ƂYX!DC1ICBDԸ^ q)7M(WAđʸXWbC*.R۰BB5Lu9PNWϬW$?o/S~b>GeW $[١ 7(?8L^$ܘJ:hT܆6c@|D]NbZu(9N H M $P!ɅTuSνjg@؟tJUC A̱C(i8A~[q}ү_fڈqoyK?=y/#='
+_A Ǡ)^U%#. vZ/ ]JS"rKI)K*#rՖb4:8HZz>7r"瘖@DWTXFTqB
+5U>d7UzG_BKĘa' ZRT`]PTϳEQZ! ]`#.3ecRه'u 5_K1GВ&80344'Gc,D9&Cdsj\"/HTpFQ0zAR(ŧYS%%*楾@$:1uNxMk3} _e a] ?EsЗ:M" .NDER )Luc5ř $YxS b˯kAc-4ΜŐXi/B646s^U0xNDQg;9A1WyDZ>Jf;"fZ'C7Pш[ eDSnXm] "1 Jѳ_Nu*έ}lʓ-Bgs >ɀIy-&Ir H$O\ DM
+is~u,Hui)F췉HΚSo݆}& z2s7:"T`]АVM)
+"ÄƷMj.R!W CYH˿5e 2&2StcRJ*[ t"˻֍M@ 3
+9 Q GПOeYy=nwW%_C"]'weVQm܄ui, BX/#݈oi U65Pp~KY maK)A[\F5% ǧV*_yq4Jpiq)vQ6L̜|hyAխ!𡏌l-i{`_CfOh1Y(V-GcH&ܨDα6H! !IB>eSDL>Swye\ILi7e>Pr]6+6Im#f-!JؚK 2cl'?ĈR. -]Z zه3}Deb8*ZV@=qFChmB]hIB9PF1
+mC*s("GӼP[If+ʃ͢-Nž:Q/tt]o@YՑmuI7D!<%$;$v΅Bdg a@h9oɎ' Ж"@*O
+r^L60@~a)A*Nwξ 1 ;*f5C5崢E5h V̠gk= QK0)ɪ7 SKw@/O&+Y,t@
+5\!e?5b:% .HuRxi@Ѓ} 'RV"C
+xE313\867r)DYg/!I%߳iQ ]=ILtx'Ӧ'j٠a5!D[1N~0DAdYY0˻DzzI8Ko0F+hJq Pj9k`iK#2 4 !К.okJ}
+6^9H:Q&e&R[P1eǨ{s
+UݩaEdKL,`Z^
+V1^9`F##3jdᢲ )@4їͨ+m=Ad#Y*S1fJ${9o :X;T4nVb23c< A_c
+KsaN`77D4t
+s]|P*Pk
+T0,bؐ-ؼPC;EYA;hD& ZVkzN`U1c<@N'$)y=GˠHUf/:F|
+D䄺2DڍLҖfiax$SZeV ,dž
+rIo=+͛_ݲ'>,@
+}M^ C!zLM</;܅]e%/oqW*^!ޅX}$}u.jefgԼnL&Eݿ9`ǎ;eP
++h兞C Nma c]Qf+彘]Y7L܁glug6٤wթ]G ؍n{v]ȱ8o˾ܙt-4x'P DpʏS炠0u `)Z=8ƀܮaJ`5v)$(hD >a>Ov/vX֤I@sQr| ST`@)R:[3d.S0\Mxoua
+!_=L>?"r58%#\f{~ y94D%(>je9%8aOk1|<Zm6%|r=Xpw-!v `Ոax+a'M'3' Yo9 XD8,CD]YoVZ a&Ͷ + ֏W-fcqeP-kCK$iXΞòPSA%"""FKE`=p%:͂9AE%cH@hDg\>m<'26o'Z"PLrrNvi,b ˦]$ǷV?ggXHnɺ&6"jh <KLH!)Xi!m9˞}#@{ĭŴw]UcA0c1) y5@
+rT}:"EKz :fN-5g;Q(LP~=g#LF[*AfoP:\pSSu+쯝h`JR_
+ni=ĵ  B+z $ZVlm_:3?$%X㧫0BՒ;=Yo”ZVC[ԓd3bAm < îO 
+E&f? b>cږ6gkt!{W؀
+?΢l78!%GlY&g= 4Lcq/o>Ca=,WB3d*O]x&txs[$UXYyA
+8
+tzBev~sgxA8$!9pM@'$9\3-qNd:d~ eS1!=
+Vhg=> 
+&Qo OpjI?T':c1
+<GQƞ>G]Ӭ( =Kʻ(UO?J/TwBx!I #ƐF~c$]/S.k_reE]
+sIz<Y)ڱ6ȋp('Uƕx*JH2ahƇdU0x|ehؓn$ZB47 kBZACcdR2 J]q5?Q=q#NSM^Q[ȅCH֝~>5TRKɣ[eEQ~朂HS`3T;qR %"BQ2^EKR K$'@XV[)J{k:@"3-}GY!aJ8`pHFt"mu7,P`iB6֨85%1H\#Kt8lɁL2x
+HhQ(?]viv>3~xmBPleL`# 5 bH׎?~ЍoaPE||.yEgT\ eg+l?$JhO8/Rn\6+1<tc/`#d*"Bd`XpSqF6,ŭq[ǟ?A'q4$쨓UY޵A]#(0+ltY`RxXˑPXf6O58]sq
+crIY4 6Ժ̺0Vpvj\hi/n:,۷D̚g:љW5:9/Kgq_ Ԩl(9čaUt69\l  YP1
+%0bX]5RGĩ,ԦkѴB.d8G6%l~ SL)G#F$6K׿'pS^A(LJGq$(R?&^1l^c6Җϒ陲$ y#ݫߥQn\@m
+Qb+nG
+rS^lJ
+$,4U-!*u1d0D姁0gnWC \˿L=@ Y *zD{X~1L`YթLOdǭxZA 9څW$ ^X"e@"?!3_6R>2NdG0$HA(y9Ai"Q ,O\ǹ78e
+LD}݀ JUIli(@cls`yY|"7WSpߌ}/Tf,HtrH|haI4fc1w7̢'-;)Kbdd
+_^#ӝ4221*} z>E ^ig/iWQ0^Ua J$5xrX3RIӀ&jC1հiR֌MM`S[Es:d^Η0^*JG 莍9c64e7P(Y$ #Va {!BR!)gދ\H֠P( s̲_;:́uv-
+r67%^pS>-3]a(ؐS%qPc="C
+΁8 K20R
+ @
+veX1Dͬ{ +P+mqI fEj~}3T0(`'֒-QϚE"lϙF<ֱIqڡߩ(Aa0'enpwTO : JSAIc̚?"LYyXB1~V?Zf[%h+nh@}{PµTt
+7~7q/
+y)rء$yžoՋ'嵊p'y)%8.g9Y<8OU.-{QC$X/Q;DFV%7_9U"Gxf ltmrO{;/5n+o' v*N j|~UZv~ A
+x̀m?e?g4HL9rn,9GʏhX?;>Eпc0E^~M~Nt`527yc q|"Db0ǰHBmHǤlD-tBjP]roFq;>J h>mj`Iܟ
+EeEW<?cNî]ah6X%Yh~u`|(h`EvWõcq`2.K5be1zy P)=j` 4+(| @Y@V0c|S|^m94ޏJ*I:,?vebK٨>+Uzk9#{H^Ix49 c9#SmfhQ ,lmjr &#sOIn
+?vu 0Q8REH@TR72c N;X[Mş ueg17|
+| QQ7X$81B|N+r$>)MX ]ԺQ C@ƐA.윗B20p:QETw7H|EO7FI2:f/B~:S. kķBX(t^xp!/t6v J7hY8mCOFQ 5J@  4ݦ1 aw=
+bE(;plz liU!2E6ݘ?}+昰^\/a1C`ل<jQ3^,0ia]S/*p\)v1w!Bs/aC1hCBk|BBdc h&"xIB1c".rby<%,!09@31XO*}iZD$vi>C YPFo^jnu +6% lF/N7I $"\nD`u0 2!J|{O`B5s<]tߙ_3|ԟ7&Ň.cqgx:M06ⱷQm},;oHB^Ur* ػgOQń"3ljz5rDT1vs89_u2̗yae 91d2;A_ +2Bد } ɠNc1Q̹ d5+L f0AW[-`>ZLV88#0@ .
+֡bmG^sst:gR+2PW)Y#eaЪq/)ڠud<zG$j
+"}a-)D`z<E78-CNȟ)uv@swp f_.1 'mT2
+CG$'rt
+eDC\6 h Q74yi<#C`
+i}({;ȑ{}DG;OPԾQEiObӌ֌\6mV4Ft~U2+OjE 棯zJ#a0F׀cRtp?|h4{ <5/R
+\o } 0.^!>¼i+E6iD,Սd<b4 ;myg؃":`߅02g ${}&fFyI{t~ѷCWWg"H 7Q
+[VaO7B:lBVv G+4\Zu-kW eG
+G8W4Zv|'D$;a)q
+ zQ|,=]wg7ܫAعNy
+>owK, `[*aֱ;} x(N]_xᧂ!(T<U!q 3OMF^ȟ)4b{UUH4mv!;
+ќD܃ o&y}QLR64S*qzwbN`@Ϛ6/lZ=\:Dꨮ(Ty7:TixV~RTG]!+
+[2-Ī5Fl?]Zvo2\=a@Ԃ#sp'3YgaQ#'sjB}3<L~7O7fl#BY`jIAV
+16(Vp(1!A/"R[
+s{q<pN$B4 PM01e{<)/CaWJo< 3. r#:
+Xx`޶6u_$s7-fz20Zd=mus B䚩 r
+ӊ2ؕmDl{IMݸ1ö)Bݘ_l9ج+Dz6PSj1 @dC渏[o'yV!T' #'=O 1䂳o;K)j׿ۤ .&iَ0)ZQVtA jEP `%3(n7֯8ӗY@B<(&X)s$A)`F(Vl@IĎB˶;wc6ܿ*HymT IP6lsc7zqdV&IPW'_-RT~xz&eI=
+6H|_tuH!v rf-AӚ
+Wfu PQ}G:B@ݸ2*;G݃9r҈s9wCy`U
+J6,a!B:k*)f\S-Sdu`N -ZE`YsJ9A([KNĈTLCq:B+';P!=Hvp1<"/AX cDY,.ǠvC$:1bP.&qKЉpk9  nEj @5!ډ]
+%! vKWTk\;]jV= nZ=ߚ!K d)śzq`{%ruZ)Tsy0nYBC&oЊq>/!5΁U($ /7\A`3f,~{n=49~
+6{8Jii^G
+w tFTr}JԒ>gAd1(w='ѬsP.%3YbjpR~m-@Q3HpvAލ2̍ bp$
+/w
+ɕV΢rZ3h
+'0 ԧ`GYe,)B<"cUEh-Yl%,21# Qc&;IS31ǿ|KGeS\ld 3@C&Шn@DžY#R` eosg$ِ_&
+hwGZ>En%߶6XΈXՁX,v+_]Z
+k<yLaICX?b#^d4 81fou"Z_9z[C<#G0>0P]1-!A4oC/77}b?0nH™N2hܔNFeΪ
+h ,V@հ~4D!.ݷh8i({ 3T:'1GeogGxfzrc
+HMn%9O;x$$efm1ZcJz/SiTD2 MH+-??v;ע9'WnPj?@|ѥd瀴jUhK͵hku@jvm&EGr^T?M([mU3Z-qZRw=R\$ԻJV2o<Z*rDm=U-^J>OjS{uk?>v 92RK29L<˃POX _;R[.D4/PBR"
+&%.Ē7,Kk&D
+A ^1} |ףҔ6ax[|>Lͺx (*8֋48r*5yMB^ڀDGJ9OF*])B>``פ 2?R8B/fMטAx@%081U4+ U԰6h)vk5$u
+~?FknEu=;f(@ZAc҄</,6Syo@'ba[W__QO"Иm&Dzz Pb)3H> 礘I;]<&S
+P\bQITVY1_O(|F4q' 쌸V0hGY̠
+5=]`#k\<p39U>d"R_S/mfW̧IRD\e3G)bjX< S5(-<;Q뎮ggFcKx!X砛8=oJ̧[Q(
+i6xqߜ\Q+@˾_(kähg:VkFZ{,DpO >29|WTJW yl8Z}:r]NxyAk2e?o,ƭVkUebc {2m[D
+.3:YNla pB8 2eo EzX쯏VȘP-Vl@*g y [CpR YP0V5oցDִfЈ>1DZ@97~j̫8~
+?'c/ʄqS[4E'V3tٺ!X4LJE&M%iw!`mA=5L)1os}_Xw"u Ʈ qU+wa7zPlj~_2t6Ϭ2ʔbpN0HZ֔fTlBՔh9ːؚNLuN" dIíÂä4i;5} PN_!x
++셁8c\\MeJ$F 
+YODc4rHWSJy]m9?:TZqbss0]B5e
+7RƓu̓
+.kT6qs@H]ĸuwcQ)˅cE,[x
+ &4]?nj
+є0d[4ːnj19m?pZu$ 8'sW L0y q|ve6Щjc1қwln:. o}ގîYC; Jޢr_1o cG+?AWgK>1TOf zD!/osܳX?O{;KH"{'eq)G"H&gǫ^kXƨ?o#`sQ"ү`$]!;>B0|K-L532MRY@6 C]="\DtbZ"(e91$z7c$ߞ{Dԗm\NUK<ǣ9EW1%ګzx+͇VB%ag l<X7k%⽷F\к^s:иnF7hyXW@Z> :,ҷ ¾$I49IJqT6`$
+ӝ$qJ3q*#
+łzb{'wBFyBتe'7I2C\g#-=A݃o?4|bF vĆ=L̏HcBC UҽAx L
+ :# YFE
+~&"YPNw2iom\OirC*[Xs1G X)g0{鶐u)tEAn2 {Ir}Skdick3N[-|> _ 'Հn AZ#X"@|uY!W4J#}[7W Zj1$TQxm DLTaˬOPnBW :wsm}3㹥;!}wrzf9&l*&vIpT41tw Q OPb\#/n! EO-V{p(=57x߂RQqs64[-iЦdha(g꭬*OR[x%RP!zOAL[ɵl,š.?0 Q>!sZf(3IH96KJBdl R&b%\҃,1 cP`msCŹջ&o,kPW9=5+2O֌!aH nW#NrJrlt$ ԃy Sf7`O4k2'"y]CCSNHF?BX#~onxzt
+w?6ZHo9
+B:(t%0pp-U 3kmefSKy|m<uځޞa(0IT%emYH
+,OɆV직
+{;|7 ´}&@FzX_#Y̔޶+ 1
+co!^[s:Q[xO![~+hF8K&d?vaB %+T Eʆ\92'U5oyL[S2u.wf>#6Nc:1t{"w0?H>1_q妿T!5I*
+ղFз:#'e@:ҋu=7T և 245j4O=Xd:h՞j7_[ HʫRW:GUWvן""ҩCзm<CacɋA9k4U!89JN@
+˲ &wR1`d͝}pqNBs_IOAAWӰbL:yO<{.ɣB!IdCp⁃Ңys,bG,> iy|h: Po!8? *!KzMHM(6"
+RBK"Ru&lCo;N=p9 |ӴzLJJCB MBR%Le1`%*ߖ
+,0*05.ltBU:#fӴ ݚ5{z$"nP7 5U@7Tt0<D&{(G| %"B1?t:c5{KL#6+q%7 ֺJ
+tp>}zO`vwU03hI E ɟ3 B殀P]ιdnO@aYc.b{BѰcw{D3! 9  >+ PI{I \Hi6l$ )^44o\Os%]ѐE
+z>͎_9JO[!N4pNZιU|9:pν>E|+Կ10raVRbOuz*\Cg\Ң
+P8k^c.NCc00
+滗7o+y:7
+)ǂfY[Z7/g. 0?] 1 O! V/0ϟ[(`F"ROb,UFzb}խPsY K ~_ʵObG*+L%zW_èړkS=Ii9lTKy$GrAy r敿+<4Bْ4hKp;OxSY%ƆqyZnJڍZ0!z(!P;i~</"6|S`,4Q%Ƒ֮£ ,YDɄ T`E7_^)\A=(B9e-ѐdev%W1Cf}(:ҥL1Ye|U%~^h[`d5c2zhs$4X_ x"Y֔91y2iQRϦ|pusTA y8~0$Tac meZ`6(OMS2 fnDju A WZyD5)w0z7{ R˒p۠(*`ƒq{-T^;+<9aNv~KI#vê>f(i]h?SB4*eg|S^Y=7#cWE
+V:e8tTD4S,:K_"~A1鴡BYM
+܄]p:{IܠIn}c as}g.JXSP17P. oPjm/KʓH$t
+o&o۴t~:/*EE(kw߅ dueu:k.;$V("9>5qj
+>̡;d9!sْr2[JpfӖ{qzwt\?_
+ ]qΑn,>؈$T]*Ѓưo"Lp$:"-YL1 eJ׻Mѽq1q4`g^.VR%[>6Cw7@C #tݨΨM#n?Txœ-ŁZ(L2?ql5PW:ZLSs :7(qj:Z8:!W=/(U^S :ͬɎTUmg ZHaJr{NlxG6J Ηy-|$a| AT""F*hoQM"U2
+ 7EPfR1@a#S4 ۨӅm5`7*%jKo&%5i*vj;;hQ,|(vC~W3Gh^MM &
+X&W|#(j-EJ?^$"fSԳ~/{nW:wS3Ge%ߐ4XsJ(":2[iko$
+%:P|Dl83O.&`wExղ1>nD؋恄%Vc%.hK~պRF [/rG:6J$~6$RmCQ1A%n PQX
+`ZjDCд$SC}K*K/o x< Pxں5}IJ$dzZ:laoH<-p"Y'Kϻ\kzQzgh>lH3P9}1Edl~HL@8ͬ ;LZ{Evgh^&b㽑sG2IdfkŞ0k/y2L5'eAeGP _/s{Z9Szػ_"RStHϵ7u&es{SLmUgH •kP)lX9͏ =OZmX2UWЭ!۰[`CtuUȕ+[D/e6Ber.<vW\IߎİCޟ1&mlD ?J߱%hsXnۣѥ !C+.oy_ae)a]1N  dl f9XRU.o|=&0>:
+C2alFx0(=*1f7D%FRFaU:lm/I9z.Yfdfraũar <Y+x?wF'@ ռ$  T(llLAXjtdD)VK:!!8HUܖ9xK!fogP m*p LkRa
+w$1B4ޗHst" , zC,n4.Z]0[Sٹ8槄bU*Vy1Sq2iEO~Ƹ?^DQpnʨSD'DC"rN{cƌѶ1cͲF:E#0
+J>hMQG8mA0,@.M#'tCfkL50x#<]jۦpb4#]%"eJ01KF6
+$r=TK
+e$GD-}J:'V~
+HAa
+Bi,.JEBCݲ?t Y@/'{/{Y-x@((<Au9`8
+&d³D.|TٯíY&/ <( ]H2,CX !Db™ћ-BF0m>3O$5.px1y~?QǕ@R QDxI49pQѱsX
+X'-Ä>.
+)-.EkW\(2)$ϘҭW~+)5ԋ߬"AΪv}u,^ b\՞P*?J~I5)Όs!8+i;3S0ru>\d"R:s
+.~HIYD| qQ-)}9a5e+q*$ZL|!;|j|y
+/5yU]qHNX݊,*@LǻE .Wͱ}QLVr@;Vi( $vQUcL w]n^fڧhid"|P[Y\/ vĉANa_:_Îl)<bWP=xΥT d-Na'<
+ގ;Gsnl;AijS}^s M\> w(Ű\rk,{ÎpNa=
+Sf<, x;8y;{ԹXIgP[N bER0`WR8-S1FS*XB>pyHo͠w
+I7/)I68C/-Igàt@!j;%ڵt6n+9:yCvsb4 %ZAX4
+lWĬ.!ldwcE"k d[Ep,/A7}# # V0X U,2 EsF/HySER:p7JT`J
+b{&Ax eG k^dbq/I\#0ld\SBzBKu% Fv 5 =)~;@᧧Hg0gt/QZT;"(~)Zbn(/hs8`˂vY \(aAJhJ7bC^4Xmܣtnux?" ipJ߬ 'gsžqEoX^[(W+VX-7P$ Rt?>I8
+C%Bgq|{6}V-=qûՑ]X;Mñ<hQbd*9ۃRWgK\t}bl>/a g1oV8)7}Uh{*2VP64N4 $?De30 7\y4EW)+mooyQOU{5V2yumܑc9%/hX/}="7㼟TdJF!Jj4 \ʲ\;yj>e(ss`]ulo}@MTs@3 KNOy#2!ȩ}>M=BZd
+gxBmwS%E<$#Cqj[m쟇"z ݗ0^
+ΠP6+пgWeRp7v~c^+ >"p@BtdMf˱Ao ْRO&U'lhJoMz Qw0o$)-9 :AP.m$efU z3\Esִ~Ra9jhV/U
+䎫'r,<>+"14]W"n[ǹ`}|t%BFvŒ-4Ɇe4K)rm1gZ e/ãy125)yT"
+)cf%Ћf!QdJJWA-"Hk"Cfϵq%+ƹ7 jy>%]t[7]9+Fq`H
+~uvCksebƕ4bK
+3l{7Vr^hrc8XQ!%5G @PW m9u< !K3CY>Ic3^6Qt&ϟl:rb>i:i~E\xv2maE8݅Lµ%w4YbZd7Ce֠׊.=ě8K"fC^O?0P]nEjq!
+VѨC󇆩8<aKr$h*CocM ]?c\ t1U#\Zn[B`S>u \6 jjk: Bo7~8%Ĉ,y{
+$hMYt߇I`,ULKSȝ$24Z}?'6<cr,Fk9\PV?ә.,eV:p+&4zp \ʣɉi)NU~i^u YE~ ʹB)o -ڡvH=sb
+Ai5 dP/)vQ(B3(09&D Lu>XuynW|!cܟjGpc.S~p /#b\+f+@Lԫ"b@gTcjD
+2ê5+ƨ~2
+0>1gC~*xٻRV&n{$!c'J+H~ ~L.\Ax:9V]4tN>C ByLUPw{8؛7* -14djHҦĖ
+{95#pѓ2ʓ3]}d1Xz -?h=rEq{PA#J@i9ڶF6̕}H]%3 ֭d 1ǜ_uJ{ubXqX2lE50x {Hj/9I#]{Z>B,P3`"?1@D2IAq.SVd]&7ZG %$BH# ߤItٽ!@#2Zgj 7HXR 5"0.XΡۑ\SF팰4[Y?|a1BlcP}w3 4JTfLPLK#1-S{2faPG0DůZ"xO&|6hI'dP{ Z+TixDzL*ՇS` :K/wJ9 ]N *qLPU}0r&0iMLdh闯3|<BAYW(F'X滀,җ:G> gBװgp oLe`DHe_y6JbǿJQ
+im="a
+ylw
+U!Xݪ.6ChTULaq!4kH$Dn'a ;Daar) cpU$Q^V:jX8CQVM$d?Հ*&D} Msq3 kc- )aGT0ug̑8(zlSAtu<~WVΆԖ?
+'KpY)T-SlWXR`(n>p$PGw td?v1.gHn
+(}FG$|YP/ĻWrJ0Dv Ek5`5 Ryr*J#RixMhhz 2+F9G(GNd6ElVkÿn=BP~'Tp2_)Ѹ9*k޸%R`)LGaM'F\˷a}J0j)/
+atY3uRye<\(>67$W0NɏQ+:J0,p='6,
+>HT[T\
+ZE8Rh텞мћTʌyS%
+@W{3uYH[4yIr}B?^Y5PA9)YU<=_.zRvGҢ883L
+p{A* у(Ƕ+ P7
+ Ic嶮\b0a\ч9E\\{Ӭ.林c@3S!fh7-/曢(4HpNn,YX[n(PAiU5&gc@ޭ2_ FGWѩY4*DA}Ƃs}-¾ c[<!$="H|xHۑIn_867:ADN~*edc T ۀ2n<3XmL-AA0h,{6E$WeNsòwjwv>^_69lܟ7ENV*!LbLl6V0pr 3r]e =2pZG6s޷e_fUI,2%5T؊E>y؄{`ci zȣsh:, xXo?f2j8/W u>7/̸8JRv‚ | (ȃ8૪\P}@V_CYa><TCcV!j&3"8R&eKPnU`#e-/l 㰚TGsGjч6$}=}SP<a[aɗy-QM<ͯq更#q z](>󁱝)OՎg"1|[EA|IEݡ+I獃\ @ٔ&1v#׍箺<bxil9hlG2` B]kU@$@2;dbh29eۤɇ(lenlϽד]o:@< B?%-q+D VɌnJ9\%/e(̓&k-J!!ymPLY%$VBa& y3HWcaY*E.,]Uӣw"6Ɓ
+Hn `!JH\djĿvDbOZLjQɰpIo> RZ1>tAdxAzmRKqƔVvnfV}3:z}.HQiqRǏn]fJxF61mAo;"Yv
+EZ᝺\\ H\)ւP!2l 3MsFayĜ28X1!39A 0GQGſ :ua>wP|}CW| /p}1XYzhƂ%Dm57dh!}U 4mqPk*+ēw`y]gM-^(\
+/ ) % 
+ޒDOc&X~{= RІz@HjO[м% sbΫZ{ 1b:CNzGhX,s041MȾ 6y8aM_ws*
+[{Me 5dZ^?;";SL L1]=@<~T
+Y]zBU… hA .+w]0Z3[Z3P~H`4aJuy:u F߾ Dnc}[p{u^q,ɝFKJ@ 
+Lۗt#$tH0ٹ#<ظswWEO
+`<
+ZjWx™̂E 5"Ť˄$O$nBy̓j3dpz+!m ck(jhD Q[eþ\UJo2~XI`z1͏H;(<1mc|̺ o]2.y&Zˠ0uwm}w:"19٫St0{$[+Qmy;~Jta{&H]/!\3pP(0gBpl t4z~Yefd92YOUQ b{|
+?}>$T97#[$ҘtBB6ɞuUHuzI.YO l@T
+2S<ķf,X~'HR撾scl\z/ l 4:F%ȔKXhuJDiz wb}A؆8d"rA妺
+'Rpl0to-kx:Ʃf o-!PMa>l<l3v$aQpαjdDc4@K|
+PLj
+ A@=vp,Bt9
+HpWirKY[`E$חP17ܠJ9aš3!@6b Gt̀1[峜S$k#1#
+Bc!31c[JyHt/埘4p ՖZ;0=(7Er%̘gΜ˚(5cAk*bl#e
+|*
+W8Xt4b"=;f"v6o@ FnCFoF&iAc,[5b`$ClqRNq̸qOAįxǚ¦˄OMT`]ajj7 =u "}[+҈?BHcgDt
+&PKyNN܄? S2y^9f/:r{۱Jl^e"]:ո$&J"b.U51(d63>/BQp$Nؒarᐝօ;SMzטHf~i1ג=I缍۽;j7]ƁN۠d_^2 1!/H2;ϊu*៊ %t0XY2^&ܢ|"rd$Qߘ3NO!d|$#0Cn]HD]hӛ:&{VV7!{'H6#&쒄gnJ$Lߊ!Ce怆Ȍ
+я,:c%L?‰mCF p!^'[:E|>{0]篠pO:d
+3^)`CdiSͩ*
+Գ9W؈4`+v:Q9a)#7L3(1{f[
+sN$ZX}(NT$״?
+.J'UZѝsl4w=; 7Z m\v4kT2e* +h?Pag EI<!n'G=
+`W K.ޜ%ZʮAdرq*Y#Mu; C)
+G<@d+4}NM.(*8P
+c6z%HS<s)J:ݦ<Dޤƨa$/-%?V ;Luͮcrι۹4ޓs: ^k] gKDc!/݊8 # {T珨OAϣV!\WS\-6ߟκ?SZL'6cr=A|#|FIwVϜ{>W&AjOCq|Ərb.R5Ս*|vŅsNiK \(S 5'=%4#iPд3m64knBvsA S1Z5#OL6l6}XiB{暉1Pj!*bEX Gʾ.QF'{ sF'š)a:EP~% 7\!43s/B=&d=V1ig( Kۛ Z 7 8-bsNxt "o$U2Z
+thMM.[+5|;0QbWx* +ĉY:Eo$1 tSyDM)'~
+A(HT'F퇏@Ij!0ޤQp^]>ndH`Pr䟣m1ͮGe6B&>R:IdZ܄t94hvuзWN2ƌ/]gC` WſW2d{1b !\!N^3|4 c7r8CISj/;p;&F:4qV Md f/g@8KrQp功ھ $#QOIb[dliinފg.6E-B-M @~Rwo! iۅ,@<#@
+-3yOM%dne/~"b'A|7+b讑D20>40돴g:)/s18JFQ {ﰂQBLS$ipedjE[\eRZ%<ס1N r,(da(R@L[+g<( |hTj 0UB9:%0Zl:VWf+ϡ'S'CIeO1NױkՍh*RʟD>m$v.Yr7)rn>0FE?-Otzw!-՜t׌L`P_4%8ٸyD8Kw ^lx`eDv*LF""Yں 258' '.)1_=a{PG5l1UA~.N* TZ5OLʟ^[^|(B׽>R@pFjVv +VK:> y7siq<3%$c7K
+uP9q;{}Nk^6??XU8kIT" 6*|?p\q9z{n1m\'U{ݷ{ "nJ+,u$.Q^e,#3&Õ]2]9VS5ļc
+SvL+'ؙIP/ZjBX~Jzs_)^\pf -4@#HGq.a^uze ©
+}>(1ԓDEs6[Χs
+Q*v)N@Q7t &?k6ga8Wm ("1Sv!ma}+ȸe5%^a;Қ#)6&"%2c^iޅXج+wYn=J$L`%ass?FѶ`~'V21
+YlBø`h! |N|H8Ghk`[1JU C:"1d z
+WOA + @$͝@ p gh+Vi蓩-i>QEpܒv~5JbapXYEY&.k)6v-e
+TDVHQ9ź}+77;${zF}pYس!r >RٯaiʅK]5 )zyljh(/X3ą!C|g/ӿצjJ5Fa qRS+7*o.YcfۭI#~a;2^?ON BgZDOL S$stM6/B1 8&V~X$
+-7e~4'%V9eDY*)ni}[nn_1]<ڒ{ ,jڿlۘ' )@C3s0oӃWY+[ Gcȇ\\Pv
+Wf8eDq-Y="Eǫ4ˆȂDCS[k LKfQ$$^=͟ep}[H˾1D7Y_JI^9@|_ӧF~tض^dmX6-dFI_6e>ӛz<0ު~˞;LJai~OG/+ݮS?D5c1 j: -iК.Cpip%=v# w 4p,Wy" DfO뤹^1h?kCfu3Jjhmn'73c=f < Jh`Ux/`QLYA {ȁ>A֧*WJNA4(jxeA^n\!QcxE,OX[GQ>P1xfe$(1 O@rOt N+.dx  ˚wuް&ڟi 3̻J4еӧ@vR E ͊\ i@(!=HiyWiSb8^Y ֛@n?gvZ
+Kv /
+S,kCP\dͼY#+btZ fܝiOR|ʜ L0^ͅ^#~\WFyk+8ٌa#oHGS2z|:S;2|LcևN@=:0N$5LǏ(`B6k2T9 اbwиa!LB]P"lTȭO!V$36%l1?0vM*[oT5l+j-HuB_ETM9\<M'^1^*f I+q̙fi<0$5T> Q3M4V
+ECH-rBׯɁZ X|vVy>w͆C:OM)B^ޝ<䉁㖶o%%ˬT@{;FЛ愁>F3w{/%50x@-Ce/^,< 2j֩>ֹ1pY*_`_^2&f? 4awlr&_)
+M5А c`eR~}N>& 3%9D;,F=D_R3\ݸ2/J3E%CFyն:|EB`K
+a)Zx+<QLZUN\˅PVXjG]HJ2;ga
+׿E~f}`"ؗ ˋ EgI+FPl7QWhHwX珰|}mļXa
+||K}u2xz*Jr$J^%pICwՒ)xlHEr bUc7ņJ+FT/M
+\y#R$ Dy3ZLfғ"Y ⚲],[0%"¤wؒK }~L߯/݋D>'>|pob1'lr?MY쳟M5UNu73U2>
+
+NED?:Fɀf6 boF<8,k{ 2.h
+bo%$ OΘGmG>5AL$U2t
+\bWX%-}8 ul
+ͿA aW#6!\ppjU ]s,C`1F :c]8\ѥ*
+irSNڗ= 58rH{*ʊu/<EgDSlhHZrODyJbJ!|ASA]8] $'v?߉T V܀II9/6Ea,>&\(Aq dr' E=;n6aV4+OGt+tC{:]|.2@}I~-9JCغYL i9,{@kCu/ ̕UME ;3ҷ4f\ 5md\AwCx#-HUAjC~:HF=0^o.91Mۺ~>8@v:s[^! ƂXWA؂)23]N!剸N "~܅hN O: q19Ҹ7+GUf⁈(%99m{~(m4Q?_ŐyduV0Nwe@ 2іǑ^;v>Tkn?eŃcz|Q.~tTёGWrLfr
+>Xl~E*th 4!X/Q]C G@0Se13祗X(%ҧ@Y呺zŘ .NsVnr ֽ@zEɽܔ`b(Bn~
+D5,?ArW'ahJ`wVY|节wkp9@'mOjNh2U 6Wx;Q3peAhR0dz0R0C1z3E*(@<^k7o΍,_9{ | ҈\1eT٢R$, B(@IǗ+@4IJ
+Q0}XS"]d7ziY,D,l 
+o{VE<1.a+"t j !@_uS_x:T^! R=M%_By7Jdy+^f"Wp: O${82ӄME #3zl!` \k|;)FТUN!#tJ1,A SqU(v:$%i sp"!Rb0 
+Ki/ 7!5nvlI; $>pt>}F&(&//#"ef!ZA,of &#)F(J]~;o@(`v1PA.O6Y227ā/_ Th|ka70abh,jeĬ~ E؎d -H+$HlrvA-Rl~8Y~]^qqxZx(˺oָ-< g ^+َ
+mÝ~2mﰕO-Ǎx5q\`^y㻪v\n+Q<H |x~!,ZE6:N/Ǡ~sE2xy%2=$ۑ| 4oH
+=?M_7#;Qa|ūh$yOĉKtH*`nlLA!)ae[PY,{:Xt*rɰd_@d 6 {| "l;8zƝ[!"VVH
+Y3lӆ+3!W.x(  Iw 8$*]`!Aq´NtP2堫U;1Tm(Mћ!m- gv>@B7;@2*.q%ߡ[sj$b6WGπBQ&-?x$ɑ@NeBs '7*?ɥ_%K Np_@-)O]s [? fQ=F~a7Ci 7#M4==&\xw<^E Hծ,юj~y?ex~b&#_,8^)t>Hxp
+ZYU|ߒT!N5Gr(]p"//hb 9N{u+5MbXN5Iar_S_?a˛(luYqY߫V,DVwXןƗĦϿYz$?r4 =(.d&հODl
+$'S7Ҡy~8G;Յ欴fCi#e9bJ1S-X&, ˑyWOvTc*^@ݲ{?o;|+\("X"mh6'0F@j%NH3ezҊ 3NǓirzKF?8a'V巵šp,o nq W$#mA=+*)%ʀ7W@(@o; b
+~L&xS $X (؇S Kί , |;h6_
+KQUږ}sM4AbsY YO#u<.Acim֢&B>4"Ru‘6s.Ly9"$n<<ćYDa묁a0SiN/(|\D%h+J}AX֮$8˔_ }90r9jPD?j4&s_?"?%Ѹqa>l--H^'3mT(y ц%9HC
+^v!agD@dސ*G ĹkXM'0}\.HE%}[cT.cQ>{@dm2%Xu.Brb_ݡǍq?bV4ɂh [EI|J%Ȳk܈*@\}|+Jl7pMQ#5M
+^JTA7+n
+RgOXJ,BEI>!M T r֋s:ؾP_ef"\gMؚ(ZVVךeM}.i6>?.'=̦:\6Ma
++NJh)%9ycܱDcklW|h3$†X$I֊5 5xު}}HaG#
+4aFJ$hW(س&8P؈EF$u<Op!kΪį^Q]+1^Q~
+O7%R`0@ ű) 
+pϰQӞz K2#Tb7G&5Ͼ_P6>Xvz3wy&PLcXt4vQMܫr
+mX ?ɴYNkq
+RvC:%Ks"5w1n\˝%,E֠
+7kbvQ< ޢW@BuJZ *QCڱ2}MᏡ
+ >n_*?iJJK%:vHLۼ-} 4P"I&-`W=,6e:Fхw3L,#X )jH5f:b ~4.kw`Qru9qMцOv zFEFC!M:i,*"`AefXwnUYrroy;FQzoaGJ)T$.V=QLvH"@"QW;_AbcAJBAB| bd,(wK䱾D  Y-S!B?U$D!%?$/]h›rllF*'d'seh
+YΧ}A%%ZL2e ӇP)!M)mSQs\F^Rw U<L_ʭ:Lpj"Ϙ&,E157/e8ECQRh.
+/^6\=sAtS7Ϸ!`wsz:neJ@pXGKy%պW.k 5ZIÊVc%CIy4~Z$r$D`ç`)o+l av_d8t"lT&X/J\8͎Y♄E*mp<5)lK*@hQ҇Z!S,$
+Y}1mBIP KO=?H
+MeQqS#I|
+R 3i<lB9yO3T{=v0z̕s)vLi2h+}^أx`,YK b@S1C7&&.nKh#6EU_RX|yjf4H;!> 話`w&Bz9kǸ%ʉOm2=d?Yؗ((,E
+~p,73%뭵K߽,)!&8,OWƧ^,:J
+(f\N=T:EPIIFp)x E?J^4+?TҿYeJ=TVhNhz BCR;E˸g7UVmAv{NM R[$ӺpSWrKm*aҼTw_])TR@2Jz? T7sOP4A/7"g˚*!(ۋ!TJ^APY1ޣvl5T:%PY@ͪ*U~g?TRPY#t@RP )m=wI, ǵ
+oR]{@orCRgCuXKWX?~RPOHR UH6E֡]2K1l|TBc"#,*TIˬI .ilIRM|&`Q}Bd7VLV>U>_Иdws1-6ǒ
+x J䐜 6ٔMsz$j{+ H<]Z:qr2plID*.h-*^s3I2?Mi9b&mB@!
+{98XLH
+HAr%7DO;$@X{}y([vÖE@"f_mZo5jҥB@Z2p>?~lP?n@ /_}E]t@1sEA:EF!MP09zc, MD޴GסC e=@}yd}au{5 7gfhDҪӖZ[U)?XƓ)֣^iD賢Z$Cc/i><x5Ѧ7я_jsXW o2?%
+ӵU/|.FAp5HKlzkƛxA:,H. ~qB9X0Ղ4x@X ɞЮ*p2B樫+ "W/9 -Ι0IG;$9xsbF;AŐRQ55cjja# )O:)-N)5 kPsmZښ~xR/l1)Klu+ 5 Xє/z6~dm;FL>m4O"5:gգn:J›9C;㍦U(+ԐHaNcsiF&b+!G燊J=UnTe%Ol*pgыv>@C:j
+ǯj^΃0i8
+?
+Y$];݆d괳nx/  2ϽX3t>'.I/xW
+Gu J_Z4V;{zщ)~yԲ,FG9qOU#o#7 #. !9z`[y E
+8ә]?xM'*.t{g|ׯպs5Eu5;7tȗZar@_ t- ی. a%5zrS@FdD83Ix:]5(z0qlw q ݥOQ,%>ٗ)$k2ҽ{:$Yz, rS܎VAb¨~49KScԼ/ܗ[P٥)vqTj9i[#C[Mr?'À5$}˥wŠ9-gٔEY0(8ѵ TfChb|W#O_HK{&gp2-Mrv
+5gP_*2Z9Xy7Zʄɣ<wOHAIP: t> I@Ua̿Wb}Q2a2r3׶n =sbF"@7x+ǖpsӑaF`W
+e;ޘH.GEEo@v,]"0<W)}kT2h."(# bM}1ϡ]Q{XUŰ!u
+0+IЯqpt&L\crEI A*;+D&$wI[G Xi(2R!ebhvvT
+\h@I%$64;)!ZHjXZecJbObA2Ma :zs<.t39ar8 "=Ô!sXdmSuO^+> °{p2:cs ynQ\RL˟HOA&bU8Y(3a!k^q2 Aw. (#R2MacG2q%-:`f㝽
+{U P9F[p^_Iw|Ux$qA^B,{(`_D]Յ'[viBC6#H1G?RqUi/ M+:*!IĝO M
+b
+?1Xy-9IEƈSŷu†(v\{Tw 4&
+L#B6oQue^Àz.e*Գ'7+Ci Ηq4օ\cwKF2C-Y:~ܑQD"u Ӏ{0
+xחOܚKv^&U L@!r
+rD2p0s64feCѧA8%9
+KGh%4zxq}f~6\MbQh$aw,ǮJe6 ܘ_ۗc|)%A
+|4.01E>l`Q ?k>_jt6FHo _ )B_Ο@}tW#X(fBQ$j=!._5.4Pg0r`)MbdVXk%<Zm '
+W0o *d8*CZ90n<J4$<N@-} sk0M :Bǒ7gW[}<%i0ƌ7L k!;8@'eHgДq=f#?/5ۦQ"6a$ȿ
+q1dOh 4.p^ZpuW>AC;ܩ@D`?0 Q;U}_9H]"7xVK%6%:靹i¹:X%7*\7ǹc%x>[U RM! ߞ46l@+`)KX>b6{a “ RJdJ6el◫hG=ˣ>Fu@r,]^\EWzdR lytH;U:zJfbLpo6"ڇ`t
+
+\ lKtm3.Tq3h8Ⱑ㟠l2}`FZ ӑ* jLl>A78})\`#.br]:TlL%NK%ARsapwW )^R
+Gk =ġӊRjl7 (S;6lVa(N*wKp\F,冟QctJ?T1o%7 J`:Y%ÚVQL;
+ʬ{n=V?=xq5G PV?HFEkйєPjY*:hL%=ꊢk{FL@JxJ4%n@
+Vz,Q`?9`WPO}Q[N7fE(y1ZW "[^ 3j2O*>}dg?\.ą'ʁ@ zk8u;
+'*`
+1|ҽ-9s A95ƁW
+v5F<~bhCAx$Ǒ@OP_%3)U&RƖ$P1 5
+Lɐ@:@.ri3Xau]G]YnDDTrF)$f3؈()2
+?fy8r. Uy^ y/ӄ%@“upʃ9
+ `>&0OG)]
+4`2#8ܩs}a BcրCJ6" s,wr0|}g2 9mC ʠD1.uh:
+Sj,?.zvD3}>;s<
+>-):Eomr
+b@-k3|䧾dPL̼D]#blRy)V1
+0Vc3 q2恲C9z1i z'ފc3%1DcxtdQI=S35 .B|iUNg
+'Vbaf
+$?JHix7bRÖN%*<*cyRhfi4BةK)d$ gg#%k N($!L vI۠@۱O
+=N,=nP̏93'ِ,*0{`hp<t!PH4ѬithV14KϹJr/£Cu"Pyf;Æ
+bƿq8V
++)"$)Gyτ9i2:!R 1X8Wfj^[C4
+瓤}Mzn3 ('b*AyJ'"
+M
+PYezzQyw9ojXb"FUϕ"h\!J<*>K&)>.UmaX;&̏䨓dd0-a+~5|7< $tDl)Np$R<ӗ&M6Ŵ1".r^e=q~' i@Q61@- rHĆ*%Ofi9ܿO/Y{
+FnU}zFF>rlbMeIyDa0wp,i,+vH!ggSuI2Vh-HØ ܵe&m-BS!Zhq
+Ii wT`i`ќ> *:!TY<Eۙ$ŇGY>*D=l8"MRKh=do9?'c9(g=갆UrUZ`y
+zgp^-r[)ZL%Ő)FL# )d Gr߭1ޅeu5;##梄! n>Žΰڀwĭ ys= ܩr;kIaQigd(CLH1҆Qp1Ր(=?jdjSMhu-U["~6_ 1F"@д""/OKtB[/$:fFWCH)W##*( rI }m']f
+i.!Z6a2J8+P=I၄9 /^W
+Ba{47+(yh/9|Ց}_2Ŧ]HUnwB=75Ms"=l,EBL
+*5҆10.F-C
+8h!ř*(:~z]Bmh,Uׇ#˷U[s9zzуgvvW{saG.}<VA-lo} ½PQZ 01x>RZZ=w_z8Ępp*bĽ/=A 40A
+mW`i׶٣` ie3iFSk)#Fh7QN4lw"x.f Uz\P.#m`tp#z\FsXdK +Fh/*]\ {yks!ˡ2 i0vP~9&7~.֝ ~恓$T Q՟aE YJRǏ+_1ffF.uab+c
+y54M)Ko0٣[hi)Y@"h*~Rb է79*=YyEI7aykEOgSat7Exo(,Vle&e(n
+>y!5 bp4I$-Χ>FО#P0o Xj%άPbw¬3lY]R&J WAx!phBÐ.':[޺LCY(|[EX0R^*!evMû'hQQ{u
+X(
+-<s hg3gVQ2 ѩ I
+qj&E14gmxWavqW$'*n*S;*c`*^+$5K<D}
+m4]E i"6v˕T)e,8)r"J"}i07(d/=cXQqQ{=g9y]:t%@/GB:89m.
+2ɜ>  r* e_ė%!zSq}>h dnAvK,0Wa.Z\v?(tTfZ`DLj,"+?VL$*Uw8IAfb!vhI pǗ7f?= p"[o3VynM_ji"C+2Bӻ?EOm:j$J"QBֵi!3{QD+>
+zRx65|t\yPRt/yw>]k▕BvPl{OUB0*ceFU4\.<973X\o8PP>tXc"Ϩu,<0m
+ Nֲ |#]p'Q? qv,hKhg5"IO,[jcύKcf,EM k]Vr<+d1]LDF4WLG֟蔗L1߲ωJ}
+SIYV0bOxt)A.HC;g<8}2-n ~'y~H}*ǍM~|` JU 5<b< 8~ ek-ΟV$ɉ})KiZ3M8
+F!2ũ ӣ| ]/3<ƣqc6`U>GeWGC\7OuZABiRρ0PyTD?R n {2\X,>u+&~RxASv*Apl<;̀}Ef0!j,߀&uj0nܢQ^NעECQAk%)i DSaR]D. D n_jPoK
+e,b`-NV bȺIɡD>ĦɢOP M~VTY lO~-7,xЖ.`qH ,J }5EKf|؍Eq^wi
+l1)ǴfIvP,[6*Hay薡ߗS4DI?i >J~ka[܅n-CV{`
+GUR9?L W]fu8#olIZx{=<Q#fd;7&!T/DZXTY#uE
+-#wMӦ5_=׹]c7wZM0ۨܙCQFqϴ|\:vb<e% )=,ď3?AטIe@ b[[C[n}+ 4Z&Sx"ʐ_!zw7Apnϲ0Zk9)6KpLSݖr>
+m<y.cN^LV"YKcX"ӫhf2(}ʇK&Do'n7Ȑ`3Y $vR.37<7
+DRHhǩyխL k6WEHDkD>F_y.8?pvc&z?L!֋L TY (Z?h來&z q齬aMY~iU:Oi*!dʼnؽ,NB ID" "Lz(VZa
+!
+ir;U@+TrG_p_!Jf9EE,/rJ2IkW֨F+o #WSTwSas_yc"I^
+7)
+J" b"N %sN]4va1O~|b6-N$uC3"y L3zVR,gTKDk,Þ1{z"A4U4@ bU<&cɤe-Cdiq]IW
+aMp.
+
+o@$=5\2Q~f; ;ik~aZ!'lH̡y?ԫ.3v]4yA TW!׉]۵h`cPm:~fnEce(htarb|}% E8ʧŐ&=Xվ;EW)ψ8}=z31} Q+~ >hEb ¬3jjxYG!50CvN
+GY:!QST8_*N?,3V׵LKʽAxk P؆06|ۙL[q;~>:A=e1!@1EpDP>Ahs\ ~R-ü+5fGE*ydFd-UT,3pAUDN>n,5AoT-z FkGMe_C{ZqUqR/
+jX$60 avi=<2Iev"@n/Nl8iZu(׮n$!r'HnR-LKVw0u=-3cKϐrkgrᄥH)LQ)'NjC0{"R+:Hœ.Odx1CEA*/v+1ݫK$^5 @;Ox, E-ۈ2dNP/XJCYcƏ龉 NЉ!& YłH_҉8 Y?cKxF *8i^9Kh
+GU @}¾+}RDTt'I)v-]$=<UVOAf/ QG8X[~_jGM&D}i t$(Ϲ Bh<-L0px
+arFڏ@H a2U@ܪAIL_hO(qta[4Y[-UuM>pF0"+HV`b>@p1)ӮLQY&/`zwľ8A.,k\k0ɳ6}
+3⡖J5nW`vh ڝ!lL:AXZ'}l> \Ut1Ďݨy 1iw݊=V.A,edtzq=g
+
+ ިgW laɋc6>C䗛%!xʉh-n6%v7s
+
+5|.6,Sإ҂2{i^p4
+HA\9DOPw LB)\{Yy/*{(4ІQ>nKls|x4fk
+lEhzK>+^["m4 ۖN[1:]P^G)L,oy/:
+*&>zuX7M1Ef5]~Q}s׍ъ:cZ[ЫʚNf
+ɦx]Wmuo6]:.h9%1Ku|2< >?'F1G̵V|wl⌝݀.²t"krTJFfb
+yL%=`Cg>y}FL]p=
+ڸȱ+gq iGwݥR&
+69n@T)&[z^0l$3m{7!4_JKXXX9A/ð5l+rNrr zAIGLuOٟie;ai (I! i<I,KԎFTu?sDʟ7]2͐~ʋO {2%'G3COGlC~柇]{Nў@:^g˘&4mC6$ T?'e'o*#uYSypwIyUL+3"hJP'R _G]w$`ϡ"˜$_Of;n3ۑR.ܩҔK/`qVNCc@cq?<q6,S ٲc/~1 tGhoR ZK?Ǩ?g^x,2q3W/^Aw
+b}0oׇcǸ:z9o~P鈬~Y>eصFӸ'mrI;H3s]{NVӍPeh";jx"$K<o;n*(ޣ%D|Ԛ}e\AGPueN452~!3ڌ.!>N&铙ڪLeG]8aX{kFt*'t&aɟG' OVY'ί1:唙4E qשA*g&Q8Ye6)B|V"Aڂo a5lb!8c+erY!b<^6:oJ70x:sEϱnTWM-䅟?>n@L$ 6n\Mp;XR 15ϐ抆3n䆳41o@<pt {F2n&cC0!M$26WIl҇\ I7N0D^.k~#=# tV&9/TyF>#$pPnH4>!0tyN̹
+i9fs`F9CRo^y>Y+C II(eH6!ǞUgLl mCziP !57{O)y+h;Yn $c:[JP>ÜȲKfVc-N[U̮(0'I>zbfWjVa7)ȝ$k1!"#gSX-usrӳ <ЭP D8do _s/<I7 UK#$~Gkmk }l9`$=L9Gr;Ԑ̨RoxbA@VRkܟ>l>bRVWQIRci'cQV
+uqK`vybOim HsA
+qxHf'reƇ~)\CEa6؂  ?URS<F V58ViH$ /N0d"ϜG\2 8f,xi塰tq"[%Xk6eMJZ] 7Cˆ~nФ
+j̰c*[C [cOLy/@p7 Wom/㫱Cbf@(`=>2Y3 쯣ΑthՁ3&ⴽy<ڛG<
+5cf)'!#3Ѧ}P_i$g}_(-",񏚨lk@&|+FXҚV6}Cl.rV'wYr3vMxOBa
+EŚ .LInH;kq/;!xJPS:
+konS^AqkٿDey; J f͠8+\E5{ ƋnΝt
+:0}1 섯A\Ś pFܓ#\A'C} i6'wvDzcE $AQ%W
+\Zu
+rP4  |, Uɘ$)zY#6G ~_"C E"`w|0i 49jBُ|կW?/ A <75+x}U.I
+LC`G)ge`J(4O"1Qem "]"’m{hʩ
+D`=d{C:)Ɖ@~[HYv[0iV$a?ɤر: /p}k:@|IP;D*:ηik#}W!y#<TqjC/ڟTt |v#"(hǥKq
+oVX>)1ڹݹ/ ہd<_p+!cx@Ju˱yf~یu{mnr ryGՒ6 b
+(<Ny5wx+xȅPʱUyN\~^u{u+sʗ/}Gҁ-_Tb`|3)Onz'z<a2 r~ <bdF4\El.Wr 1& 3ۙ4M ltqf iNzřlu&3K"qF iT"4]I^Pp
+jA|iAP(us}kcQ`􆱹o"$>dS_%]GtOY=O ) ;lzCl;~%طtN6~ԗ_[, 0[Zp3!8 Ek1v#
+>*Kѿl`[1S_g~_vH;Ɛ_,=`3l@`-& B<K7
+RͰE袦!PX1f%^˾*\I[Hy.{w˕@k:*C/$>QjNц7*3 f\DIie CPibx8!FR$c@mrusDg)cl_wUsLg+c5<ܡwd:75KY晇j Q6DV6T3VdvYxB6ѷc<{;X? u6^0 UARn~gB<芼S/iD'; +%ľ5Wy{Yݮ?r \EĹHaqyԩ!l:GLuxh&%=Lh9֖WH7Mb FrNNERIt
+ Ķ*rlufo1 Sp,(Kk+m,'tѯz|<z,zek=5a-z> !4{)(K$~(eH4*hC;G׉nh4<i'
+LO2*hfhlTGWu8ذ>/0!r<M3_$lyPI廕[6sƁP.Ɗ;O >4~
+NQ֪9p:NtK& 3)Ę'E`[p7H)ⴂ]!0#KMč<7 9Dк0XLd
+A H˪yȐGq)"clQ#od=D&
+ms_ >!VkRfuĽx1[7Yp$ND
+Cd&pDNu<xHl2ց /IU}BpԡȅY U`S%eY$1AHvwڽSmy:C@dj G鲻9J,@† ANi5L\Z!VnD:?*_v2AI;vL7.͛tƝ opVhɴ\`Rp= w)
+y+*I-!]J4قLvʮPdDýT!&/Zڪ+4}lNCah0w.~8VKZKfD)*0fI9a)
+jlH!EaLye3ˮ6VbD8Kf4wg`Y嫝_fE8tJMfZrZilAFEhЩڊbxDfƥlBCZŹYqEpSv a
+ɶާR`^Okw;Lƕ/95d.&L̓U` J%)I:ѿe9{ȡ* Yd=eeĔ~yځh9~/ uWàvri*pL7m2ޘ~x=d]& zthC:T95u3INXex8um:52vX} b-=#!bRkPC3^v- / [! B7 їQb5҄0x:!O_'DA=a $=APyu402h͌dqLgEX@V}d- I0)jqmpH
+:7=82@7Ba&|N&rCA࿜^,qJʢ "gcffzzER, sJXu
+?o"Rn.=BCMu5,T؋TWd-YٞKy-ޗ:T
+Ju/CVwp[}+a<eǷd'o =Y!2s7 +IFQ V5,1x rI#ǡ
+@ACS}n|^2ꨈj " cQژ(T*u֕u_X $cI`=,aCOEOq^sg"83l&г3
+UI@v>'k5Z AOњv}Sc'bh]y$
+@=LTԳ A.V ! D[̂ot>@2 |q1f: }# !9ᡊ>U2X?>K.
+`e/0~5$x6#)-DId@=*|:clO7ܳ̈Pfa
+OBM q$JźGc^gͱxǼ.ƽqxHԋ*FZt?nÏK+OEFӠW ;S; NM+%삑eee5N`R@p#2=ZdgaSVZ?K*>:[Gi1x,ts,U
+buG$LKykH]J~yN3y1d20J74|fPM쏗}F,3߀a 4mrOק/(v*:,ŭ较Vcq 8* &EpcRcEݰyIϠS9 i#]H Шs\Z)a(<~8`6R7m٨8X)Ix^&
+ar]_(_
+QXK%!O@g]fe,UZ];HEQfmat/5d$G:^7ш_,^'c>s6hC`3o+.YV1k~qtB9+ W~>f)`kRQ!Э&˫*8:UoK jY#7;PCP۴x>jQ%䀄qZ I5
+ρE9Xp2|b~̭qp`MErX2'd0넚@TL:T_78xZv.PȀm(HCI$m&ދDrKerB\M)8j.+ؑ)&L쩽ECp3V1'+{QR5hJY=(EEp_qեpxc[Kǹx4'31JH;c@9jx
+阿O,"d+`mF,F.(܎%&q" ,?꽨\J=>ay T% 4.ࡿ
+ѽRJH)5,]gwƨ^I[꧒*X ?{:։ _ Fs.F6d ;;@YG˹",%(l4_[t5 KKNU+b븨q׶Ch)-wɟQ{T52314ýqo%:A9c*<l>eЬ^ =mb2QQ򒗿[O9хBl#TPLa]EgU;&Y}ھ*X)~nUܺ_>"*U1<SqAJϧd Mi)܊D6EM~E mXSUِTLE9%"ҞL ;ŦتVTNC3
+J[c#db *6 qn+
+hi\`/%n/Js_V$'Ѻ
+
+h09oq(!baG&m+= fc' 2
+5ZN__j~k'yC:ObUt)=1(
+Cޔ Y0/悑`"ZEpZ@.LYTFS`8IJlWH-HxH>6%s`s]@ sVB(#
+rݩ{I2 OoxHn5CԾ'O2)8*\&, s“JVnrԬ\ĠS WQ<+(."Ƥ,Rz+bhň뫕OW+;xdUcC.GMŰvo?Яyi٪v.^ TmWf~OwDÔK/ug4 A/IPƖf+ss0+hfI(+FIC>&
+f 9~Gyƙ+A}yX[,d )ş̌\2^&(#±߱[
+o^s1(I Fl]70mC)ⶈ/JIp7@!.DY2V[:\}&M_evU*`>:'yo%  -סhx>0vb+*
+L#ʴ% ,6 rbG?{E$W$% :ϫɀ+f$<BW_0?PחKcQ/H9":+A>鹜ѭQ)]F o}`_g~̐4q[U7HχDeM`  k%aω뜤$v0|+1BNE)%$+9%#f 5xvR0 T]FqT+By3zaN<)
+^"8r[=l^T71ODr~ ty*(2.ßӰZ,`L$-I
+
+dN¾: 4]ߴC5=Zw^}va$XGJl锛~<C'7ۘV%Ff_C%۽":q1 ^soEߟi\* XZk!MC Fu7Kز$!Nnȭ|zƛ"Èw 50
+V͏dxyI N d 1ŅKHLD+s1rۆsN.XUD.JH)[* [Sc^ꏅqzʬ^pT[+kCuaJVsA z)ǁiZ`QקހisoV /ucLu(x"??A@PPuyœ:sd)
+K?wZgKJ-$IXzCzb>͚ۍǞ UDۊ}TTf,|kIg݋o,x`}on)nSٰ cxa-4QZ!Fݎ%U=cJԿTLW8I1,1kf1 QKbPq iJ\jq3/&<>1DV2+R"`|0J5kyR]ٸ ^٠92t4SkTioeo5L"l
+\FD/ 8IG3qxi9`Xi4 X ϷzcOcu;yBO.c Cֱ-^֧}ahᑚ=|b7qλm "G"f b5JX&ȧFSu*xzE|DFVD7:=J HM%I3N,B]VtZ},b絡o< pg8
+(7SRS"QYԚ׋
+>J~NhXDnTjL9̒1u%^))Ĕ@W50w
+tcXb
+|\tHފ?T[hT"AEp.Ep(Rtq >UŲ6K)>޶Ln9sEF%f8iyN0dS]H,d$EOI?^ ΁'I N
+RSCeӬj0J* h$^_l( 8+"ҩT󘂛]uVhGۭĸu@/əV`"~ +
+Ḫ J1ap~D%.<P
+B"{sR0MOyn3&7^j)k!N}ݒwxm*nJB)uNdհJ1n:>>V'`B"ev#n
+
+Fnn=$ n>Ҭ4Bd^OEMaBfI4*2xft̒
+Vl1ϥ<`n0E0[t`qp'kf0 yx+er䓭${$c
+e=ELJCR&jm ~ٔcb%„v {wF
+%NCzi1%rѿSJlӓ9gw
+*:%>kr[:;8;rRFk XD Zss-*`F`j͊fOjyؑ
+:]õ1˔a-G(ޫ5Yf6%kTJ7(Q1qVI( [s¡:0
+#PpPչA
+y]b Ԫ~`%!ؘ! BRwɑ+qMVx̛x*@ hTiSb C@n/N["cdgP`ou
+3n> )Ȏ4Xn#[UᱽzC)EYB*Xanm5xߥw)O"_Zf;?0A+_~1}x|Q
+l>{olpX>&@w,<+HCW%ݰyIE2Iv5XC1c7>@(LhR\b^~su*?~x8湋w㯏/cWwb6I: -lFNE !2G+9
+25퉖%Rh:2^7EC ^TWxRn#Xڛ71(T.fo5D/Ǜ.MGf
+Kko/
+WC@^Mػ4UxE<E:Ajߠp AK+= wȎk i9og5AEĴ/M0 !qBe{
+V gpP9U(,N#PFyb}3%&,!g0 \֞HVmZ Q ^2gW1AUuGAWmk'l"OiqAh#W~'%_Vy٠)Fs)ne Zb8-RW)psg%S&ACs
+ʵ_YN)÷WLh s^17fe*G,LV/Aw0IyT O7Ҙ-
+ypU܅/&ճv~U'BvwK^W
++#⣐\A7"X{m<a+?d& ɖA&vX
+l/}j # .T2>E^ȚA̔*׊8.MttdRVϒ2=ⵄv[񋰈X5eEP6<l#PJ@i6{;+iZ+{95=Ms,O<Ce &ϴ2i@UeǾb MsX1Y}m0\l[zFG91S`
+O@)VZBӕ͚3+>YHz(ɱP65ڲA8i.]fSŠ9pdJV/ SH,%cNA
+ύiC0d?bװMJkd0j1xO
+0A&"Cnj̇G,%`XF: 09L;;xɒCHp ?AQf GQH񗰢"Z<cAW_3} $C? C+3qOՂ)泜6r4a^>'M{gP evp"+Cf;iD]Nw׆-R8)I2Y_D VBZN;. +ϖɘU{2\\C2JΜyiXLJdJUV-
+̇bW9ufQ_G! BU}L&nN:Щ<Na=x[ +u+|@/,J Ѥ84r'*Ugz|! Bn V#lUIJXS=h6jr6#F1ʖ;|[WAXյs
+߄ 5( )J  C(G%&5!F*Gֲec@70<ƴG ǯ.}T<@a9ܪ
+yj%өڄ<L1V` 3YqDԔ1CH5aO;~v*L::a=M{ q7<{3HRnq>>Zt,Y?2V?]Yuh8zxR7"f٠([JIeLx߁:;{P 4~vRUБ6 YGl X2ŎguWPm=8񱃝VffE%F&hG 6ᴁ]߼,ھ A~[;Ӕu kH<2!kP_$!!{Vh 'F^@J4g 4tq՟wux 1(6)V_ ք@P
+GPX_Ep9r=Ym!b Sлtv:H k
+O3Q,̙V(Ha7?BDCJ:+|6ЇK׼:0
+/8JƼ'y{02c@}RI'P\6}:Fj A*A,[Ց0Xsj,.a? 7=uten飞Z.PI"jetSc8=;:f*xu/k\{}+" }vE&p[wJZ>$y C"=>T0H ,~TcJe@cǍf1"[sK\`C9${2>|,;C\dgLᯗa[snTAD`y?BDf!!#"sjgmz;3]U]ݡ_ɐ pzϙ(m2p.9
+"SS4[TaO,k;v`:#>j.૘!+oP7T;7J
+HM\ Ow ?
+c OYFYkMs[#n i!'Y ]cG9LvtSH ]Ǯߴ $V^?9htv#t؂tåNχ3*1ϛ&^r0#xVմ>a E=?t(E[ a#l0xΥd>~k 4wp[\#l TR
+Oe{^ t>2*-_-> JCrj s(uqAV.oϮ4j~݆ t7@Tq$$[Đbp},ypP w
+.8ue8?")yc"Fj A!byI #x[ ߛB;cy
+m;7;HW0ɎHQm~h<hDCR
+a7ADm65Y8X"_KHh
+>` V86BW 0:ٓڈٯt_$y\s}9$da]ѫ1y0h ‹*y6,@ߟBE8v6NjS n6(xϏuY$M
+a4M$4Yr6Zp Ze[!$V,mH؎V_Ӱ@3ӐamɊ; [32^HH]AmHaNLJT-EHM&˛Wy;VY}ZI,$=~= 7RQQ)vK{Y
+)b'VQ:t : xVT3ynL]b><c๨9ʸQбHHE*3%!w}[""end2Ikv[Qr44CT8
+}w*bX
+9ֵ7{c"8:lCCv^'HwbZP悋[9 47m?t&y<8q+ؘ Vl=K7*ƅ`(}b bIZS T6ZͶ"S. *!)2X%ƀЙz(\[Nd:|*$NҌ#] 2SD>r%=Gk;Lʍk '3FOiKL6)z=vM֝t{r J*E*@ Aئhgj L@r9x/dP>|d[g
+W7l&"
+$vi
+َDW N,PKfOmX4PxS륨$btNQ ƞ uLn}0ޞ%+BԢk:q0Q"?_ɈxSuN/^sT.d7&HՐ ^0<fCDnudf'*y:C'Y!1𧻓t%~u f0#u4 eJ<sl.jVt>o8KI ['[c)0L$C_e@Ci#RGWN\@ b˰9Ҧ|*
+gzBd:J
+[w5MVK;^Ŵb
+B̟Cn؝;DW`Õ7'fw$UGyyA ChMa_,$~}Q_M!PDזP1{=,A
+R ױ{ؔ:2KrEu}M]힝ԥo'Щ߫5!\64>zx=cAGё1}JQ59@3e9㲶|VؑX6BG& !( Ígrd^Y@p)I͌3a먐 `umA"ک'8r^ܵBkHY
+He%fӶ EePX(霾8|5r(= ǫ$hݲU;&+E."!_KT^ HWxGg GOyf1kcJ7@U k91$:^bH!~Aܮ14Y|*+P* 18*ox*zX9$^#;YWi(!?O|4 b!qOifT1xu$1Bm*(@PRhzwߊvG)gz\ș)Z=
+E*cWAd{1\36Գ3߸FCxcxpw{ Ofdȃr*0e0P?.n8<ڹ|/%IBOi(YBk<|'yWz f<['ޚY{'t:}'>TwRz4]"ЁoA< }Ĥ \߬~+|ԩL̿og6HqJ˻SЗtںFVX '߂xQ;ƫ|@~Aj3,5A %CT+ b#v߀| -rt߿r!1c`KÅ`<˔u޻W\J@_,Td `!Z(dZ@}ݞU^~'2 yА)h^/>S?z
+@9*a fy\EOs 94GĎLH^W g  NaDH5A~!ς$d޸‚Li.3Jkq\1kv%R%o8>E;:!6p( %$~b,5]Az|[TI.AA n eu! A QT4VG#C}BcG;-nBғ ) R16I \i01 PBhlǺa?\HDɧ 䌭$xZGYpfL~ș̅)e*1}.:"ESĦq#rzpH#G0sA: Bp7Oi!.~R^Rw (Ȗib XdQ 7i+v2Sm(d<znз0H7lbԪA"tWl.H⎙aңÈ KB`<h,G(H7xK%Tu4t1Q0|0o51)U4/'w=:@,H{y*JCfG"SO jf.9{ hh|۴uiTJAc1jD wB E.f ʚYBs8ij s<8y,g[0 Q``6B!Қ 0L3cGѝ eypЧ{,7)[8USff('*<fEWuߒ3)?.;3V?= D׶i  1vշ6
+a!ʵ-<tQ<Y> vK ^}X z4C>QQA= ۡRГ3iI*G'Hb=M#ex{HD!H[2bEԺ2)rBLi \1g"f怠e>T$ZFY~d&'зHh!J-NYV%vM7u`R{*N$S2]M"kSeB _v/rI 3"H[eC|p3- i&KD/f\:N3Y(x#hhp$-Tqnަx9^N0L5B^
+睌A+B/q .ChyGQ
+Ґe04IPމ Q<R! JD"b[o9['H6(DY!Aop :H50H+@t%/Lb3v@| r0?Rl:]te]7GK](g0^&ɑ8=A!O no}4EMe-AN>ARHț AE䌣aM*|1v
+51 %o]o5҅8 7yتgDZ/BzyqD3P48.WFnXYA F%6 Sx#췿A#O8=bi0 Ąt)8/G8ˎv=bEs0?3\Q Hԇ̈́C-Y܎䌅z\*XϞq]'=.TH uMD
+cF„SO"J`ȪX[.&mKG=4_@_+WdibvXpCs%.$@\#xt~Zt
+z9Z\ dc dN%5}G8+(OG(4#%yv-L;.KM?OEAT!;'8 Zf
+PdMZ{xt-T[ -N4J i>H00
++ :]'
+ɶˢq{k9f#!S>)㮨~XqsZ ZPxO{z %}niќz; e]BTtFhHE&EX+]C L' OE!|or_X¥NxtY1$
+K<<Դh W@*KE PEe&y{,tZITBbr, +ңB
+.U.
+[CB)2-UKNL4rMVڥ=OO
+(%Hf_:)$$RLpk1W[\NOp|1! EiypOE jǢ! dv.dz t\-%S UJ`+&((XG t/UT`&!*S_ (y{aR$[6b?f} "4:0.Y0h"Ӹf֓gE׸J8)gJ
+tUA
+.႟EWUޑC9E9NFmƇI=H"2G0!oi;ú|웊Ogsc$ۤ!] +e20EwcNVUW% K9zQ UcoHDFRUv>d\'nwH
+1J y?E,ZeEr)v^75K'61IVf$N(J"~eHLN Q+5,~S[< F
+]DzY;?S5ݑq[+ xLJecrTP
+FJl?rA[r-H*tn:s"B0 h攆Q+ YH3!yuY01ՖM@ 1McFx(`0 Ҡ,4zsK_KxqGOm`C |~SP%1V^@ Oe}\
+,Rb0hIor6Ÿw)
+]@0E@=,Z/ 2ٹ4䬘AIRgyɢ'L uvWQ:ٸf~Ho~Z}}(30ZQyE_UYQ3E4ފ #($t Q/})!xDƆQbLYI ~4q& @<B蓟\N.Cr)
+h"L&qE\/>|Zǝ.o=uFF_-3 F!!e/AD[ c&1P;=Lu$Z}<aJS~[ѱb%愇 "e2i#w^Q
+(SieEf7AW꘶> (UzOVqΨ LD
+u1i٨FF>Baҳ4,Ϡ+?M=KIa+S'F K
+ݹ ݩLx:_xңbZ"[v`
+USգ52A@l)
+9ҸF`,{;|BЀ.EA"Ӯ1z̈ bh1?66S b=[%}[!R`${Mo4
+dxVTC60v9j<"jT!s񣷿n t")#QLiG-7ߝ#"% Hk[?6؛۳֚m(PXJY`z=TOIf\us0cR:DU _7m\?!NAYnn$LX%c k$Wl*ZxC4H|D!
+2_,DuM-IU9 A"ZeEٶ(`-S
+~Q/Kc*[.HULgLHGQ´$7DcnxlNǖ|gOTg8+3,=/b)K> 'X+~tN]<mm-cx w(.H?XYJr_ 0c"}E
+3,4d{'5oZPr ]Mr/ȅ,j<.GҚr~-eiX=Nvk8fcuet,.E6_@>嚷ږkye K"
+tjULCP{rKfHf~ #LA>z nH2v4?:0(kaqW+z웆T2HsO66?O-KgsTL:mعFq5)T?O𷺢 6^B0\DTbOO:vNMIhCׄo뒾ҫsyY,T=[&#إډ(`"W!$*mLOiYSʓݜV;fjHf S=V^FcUMM]6u7%0*3Ac,vrcF͊*!lc2; Q)OF"2x%J?IBQu@ZC{qh0pT
+c
+(;7pD RAvr~؃,E-PcĔbZ&
+-Ngp"#<i<<t.#c%߃WbN`% L*T>-\ϲ Pv(reX%A<L
+ra* .Ce\
+8ˤ:V," !1q]=Ь3l:)8tGp: ;Wֱz8Z1,*M(֒2fU(~a[#kOpchا]$b`MF:b<@rk(ǰEb=/<<so|f@Cc c!KL' tWJ<235?$Oh%
+R܆gqP4R)#l/%zGcPr; UN'F$^)wT⫤r"[J,-:j7 GXQ<WžqB
+iDѣh@cIF'}[!`K:_Ƃl̋{xNw71ґTʊ\BDLX#ɊmHq,CMYD`¯2S_FvHk`OoZRjGI&%a#`/!>Kv*vH܃a(y>=U<1). u7)(j8ǘM%{ (^(mU! jM@kWv@1RGMPSsE*ZrtiVd!XMa=K 2"VmCЧq=c=1Õ/Qy8)Y؊yPô$#|V W<MOghe-ja- p
+\B|^Mg^n;itҮ@c3SEpL6 VLZtnOz9s%}
+2p1U:KŰE?BNnh!N!yAF)V1&$\dT]RGA7 ݿi[6Efn{ Q"c(,R*Y!RE /QVUpw4%#5ӈf
+6- \QۺFD\yAC0J׼L__ s| 2xy uEp3 ; DFK /Qj^AFlFBXKf!wf 5 C3
+X<hp6<vکD6x=Ok#}7V!s1bҏ4Y
+oI)qh`헷ȍNUSjѧB-
+AS"Bb5~M]^Y oנ+tʒgU?FϷ@bPZIIiC7kks(Vw
+pqiCMn]<Ҋ\ʋI򯷟o|M(Y~N f9L18IGZ
+or?n)3b *$46 e!SB耏QH=d d#͖XA ;*AIMh@~CbV
+I@"k_¡
+0iITr2 yh8PB**wr!b$jˀ$Siv@ATbCB0L~!:?9/D*_!p)]td*؞4>N44[^&~s1 \^n"@瘐[v_c+MKe"d1v~ EKԥ9xP{Ս8rwƎVXf49mE6Y>c7l-k9?=+]A?V
+B{c:.iJCNp^Kl!+f}(R
+5!=:c6{i@@fo~Y"?C-xc2Fj&¢,9B%zp}EXe=2NK2%#O')T&@EDjZ {MSN|.<&ri,Cz)Y,JpSWN=Z /ҮK3(jQUHOF?a⪐Dʔ9f8bC*
+/r%"Q1A^XXw"0lJ HFO %~oWC1)Z"~Y
+ SP&6
+d8Z>@Nԭqk#&-N^ lρZ|b߆g"\\)O]
+XEEHmj$tOsm'9bdI&DDlb}'tV 4 u#M"\V`$t0@u\=zV[r@.("L+U"u : Madu߇t֠#eTCTǮaxS##lKüK3G<e.9Fy ! qa{%e,f !FyyٻéMZH"!ٲPYۭ%ʂ$*OܦtYB פ>HZVUVV9
+Q?_ί28FEh`iT5^=iaƴ  wf7GQ|]Sc8!j=c4{|aa_7Ő8:9`P`1=oD/"iQA2ftN'd)ʓRG|A3 סG?@)Kk'yE @7$P 6%$Z2A21f1:Vm_f\BXqhiwL)Ω>RQ|STXF (K];]$K ޽F)a>Ii}Fƨm0'qa{ 8f]e@xw)<"#[ؖ
+_7-H!d3Qv !W؏ ZMnZ^\4
+vKl/|s@.ӫ89`]A3HT6"nE%c) InJM*Ԗ!. %+h(uCcN+d>f$>S6k63!Dv.ȸcfBG]/ò%!ؠMس
+0Y!RMq`drfyK1 EWzaRrn0@H-Jb_fy.<-j,X0/A)Q )q[^%A HѠ 9yRVGI>&,i nVKnPri-2՝u8$(+Fo8ܘѴ8ӃS{\p iZDww#GQ)@-G5 Ʈ;[I]̡/a^7iYꄽ5~}yQnm"ƚ."n//wO{nI򒠗 H
+Mx̬-aJi[-I TD:B & }?}2A˸3
+x >f bq}/*;@ (t34̜t*
+,q"w+oY]
+v
+ommUP} F"ȫb2 I#ʖuJɳcq<̣$`wߡD^ϗ0ݣSνvѦtmR"CFp<8#FЕ D:dI1UOB> Ar>J~炚?n[
+HArO;"H֙en￝?AM,QoTR"Ah谛T{-Z}4oTf&F@.@FR<͵v_VzvؽMv>e~/sZk}>O:Mz}1
+!_RgkH>9gw9=̫}V[ xɑm7bpih]:fȬ<JM|A(oެ:@;Qӝ⯘g ly^qUr71|
+Q̈́v|AiEͩw@Ɲhf`aEq+NO53ᤠʲQx2,nA:;}2{!n;_ Uztf|r9o% sZg -6Yåq4cUT}J?eU2@d"6r!;hy̥,弊b}D8"V(1M]pTb4*$SŹ(cD B}Tz4#"n'n }!!|U@Б+eW/Ƥשy>7_@qLApXq Bp)̂)I
+Wv$BEGG\zi:ƃ=Ne(-TmPUԋ|"2~{ ^ X
+% ga~
+,+IB?C1!YE=Lf@rIrj<S yn$|%d.v;kHS\7ҀRW0)]  fwӨriL%BA%b5ݫZ39xCN4<R;Xu JRg &n#肴.oU0ׄ`Tp_@OKL Crsn@E0ItFfd3C1LXwF8z͕@S#Z8t92ǥr&F$obN=s5g¿ܼ%ė:N1ʵ?(X3q1VTR#)M o2EB|elгR t }lk$*  ,=+h
+VfWE| GT[v؁֝tpw:G
+#ѱ
+ퟅ>V`dI˖֣K@zt~|C(~n=4Nn6;"mGRa xQʓcʞVţ!hy(%F<xR>ɡY5bQ0
+ rBoj,>$![IhkBrIZYQ
+?O2%okl
+zyDHO9kW)㳅yغ`h&;G[g ݀P]?'Щr(wAZ'0e/M}P Ck?t{\Ƶ.پ !
+V)buEv}A ;4_x!\bL5A.CLp Yy{2^9q-fw@~Jh-Nv,zGkPk3#TB:
+WUVQ:m9%?V@|^\:5ωz=8#`o=l"Aɾ*H]{qd=W^?1;3A0spY k@5MRco&#x{s9, _O5߱٪9x(5&\yu<j۹!0& A 82{048w(2] P'n\[cG\e(ET:
+|o'7 %~G`2 .gl@Ofރ/3R P=]8PE:8e_oh8Va
+g` S/]Fg!Tl05q=L:@TfjʴmOH^EĮPPwLږ7@3GIcJD Ecǐ ԝ,CYIS2xAgp! o. J^q9>N< G“Qn٣6,Uk60?wsW
+k:Ȥˑ~Rʬf"=߅aޒ\1DX0KH Try# `З
+[2'--(KM&
+]ô y;a;繃>K+:,OT}|J]˒-ZL. 49Q` .d(Cmէ"0|˻KD\uրXC>'MoEi` @s+XIw1c2u:/2d0R^HG4g)gӋx4D2S[{ !E,'D*d/G|A5NDFY60"IIM .Ɛn
+S׉='Cpݻ&G
+^b?-C 
+諲'DZ:
+e+\dM¤4xrzt
+8/t>O]`*:x;͊R*}#H*Đ&`^x\,<Qr`h\:g%ʌ2nҏ EM?2-PF[F"EW[ׅp:+\{=|fgo%?1gUPrZoEAsZ 8dĠ5+>2`oGl]soT jn4DBU $ۀSgBͲN 3G.[ՇFccDoԅ8HO`E_g(Tv03L)T7=8H!:N|0H?Xϖb0I_M]#3 gHgp6SW@j.,hn'p1"X!"ň0wp$[?  c#sigHxEx8$FKUs BMqq%;Aϙ(H[".!MKMa_>몳WFx!R{H!#p?C&M\h :SbYxŜFe8jL'A%{1;}
+~<-gP"}+Yy(U t*EGp+ó@B;sh.¸<.xvhU 21u˴.Udd>F*>D3!YU^ ()RTS%wVQiL#@84+ j ts"a&,9c௸m~htR54d֋C=ԅ;! hwvTUn to5S%m>k_7>^ ) yb5EnQ1YkM%n
+q!^\8%zL5݊_CKʇg: C!-MC('[-tAO_ 6u!H[>Ƕ=]m'.W@΅v) )o%'H دUl7\oa6S y):(h<9BE"*j0bpo sY13D1
+)x$g]C8Dkͪ0ţ
+Ě!`I\B$<$ݰ˻JOV_801f~/FV #1-|܊ q= 9{-zŢLU`2 R"K(az `<al 8]R{+i0ޮs`!6fuxN rK28 REL+).%Ƶ-B{PS+"L*X 5jk__EUA KO*H6AN@vA
+&HAF$D;+ݍ-)/<KI9\Cڻu 4X zT؊fK=pR;[9<r9͹u
+摿uxf~^}%H&2xAf4񀟻(cxQM_0q̔i-"~KE}?qjw/2H1r.:fҜgh풪:>,:VޔO:UT'.6]<vwA=((;Oǽ :̍]Jleh Pkͪ.d@ִK7u
+&®{#j#*N^g2hzI:YӀ-(~\׮B+YsRDOn[&2مUM%o=r 0#Iq~ ʞ#Jx
+rmWfH[rJA^*H/E<JgӐKll%*WRO!i& %xfǬw+1ǃb|}} ]< f825[ g
+(qEK?C>ryŮ [DP$b5h KɁ,&wv0x]L{J2K1%,1啡78@urVVt> &X[e
+k |7%T7$K>xΆ^&q\ I2Ǻ$Pܕfʿ315| Q8Ea򡌒`2,LaD;7<ܙכ"<v饆Q-Ek՗A2{ [p12ɰlYV
+: ^Whi]P%/ 'l<nA/E! \E)ܛ!2Ъ]LH쒏9Bf0q^jwDxڇ$(-WdV)e/[svJxQH'7O&guXs[&0iš[T J"HZPe"?D*bt,IN/
+2К!fޒb}Due15,rk4Y ]ˆ K `r+Z%83dמx;%l#ha
+{G"N_lgg08RؚQ^&uH >AA'xa^(O2.%.w %h %DF'aljqX7bCa$ t=-;Q/@]o t;zdDmy+Sb5144=Al8mvœ:>IS '(l<lT^N1h}<̻
+,AĢԚNLNyy=C,!<)kӊf ?vRz`y d'%R1'W2v$zcqj,KiSv"Co ' !5aY߈_'$ޯLrK, N\g{%
+dSiT|:~S,nG!1TV Lz&'~jφ%jMqg"Y\;
+3p{URr4]G9hmk_$ګT
+kyE[ϐ8\#tӈ\ =@YJ!hꠈ1ˤ\)-WAe2n7դY`YU&
+G(0A{A (vj6N)rDmi <rtl?6ICdoz4Hb~"*:
+'E]C8?MUݴn$ҫSQҊ<TK0t` -:~J4$FU8UW ,P2g(jUX4s]smݮDyP.$K .7f ֺ だ iBWs"sO,W$v D GEqE",v}ug⪙B RX``)\JA k<v-}¯a~6!toE <[Y`PrA1G,ŷg
+9:H..ubsJ8mVӚ2>Og>[˚?sr eXҹeP{]bawLTVl䎁_[n+I/$vp~tH|c+ҡ^o bv2+NqƏlCfa^%hok}ֳny8˜ f c9yHE8"M IQkDƪy=#l(:ayB-inD
+~8=Ϟd<)t1u(VWN Yw yӲ>㹷uB'Ԕ(NAʎ":9|buǻU|B3QK͉JMlJMͬ;
+9ʻ1Kl2E#A`hmZf$U -D "U[ Q,+kIB_;1t@k-}8m"G 0;pӛųL 'H,erVx̌U?uwߛ,Z{ IPWo .]0#DAo͹7A !4  b@
+,
+.#bM@Tiu SIHtt[}KgKݗtl ۧ8]fMQ|Er_?s~y5t.prY?3. '=@^@"bDH:i4 @IA%Ɏ\+=x7{ػisd:VJ$r&@bCjAQL2Φ%bIl$H R|$#\&b<B_̶@L'fx@d8ZA#dv~}zT#|
+ӈ%FfY`kS!ɬV
+Q~p>MؘXˠ<Qp%uZp@BHoumV[$/y3PDm8dˆe+3/"D;T SaVRNR#zALSRz7!w@O~HKA ů61uuNJJHUhΖ "LcSŠws;| xAdC>@݌dkC![\^%N OU+ʴ igYsf"%r!"@^}x)Qq/</ di9PRe*!<+JYVdуiY,#D9r0
+4>}=#"Q}/wRz[Uz5%DϗX(5ݨ䟓PY_i|tHF6Zyd <axf)Fup4S؟t^]`ꏶ^^Yw5y2>!'\2̌wEF:.%߷5]>W qҋC놫l h+=1 $Wsņn@"{S'[UF2ZƘɏʭ[KNu "5Q]BBՇTGp)jAMWbaT
++ &TV]Zz" )mHG=袵 $ @x(E$ƍOɜr2NoT̋ @Y %ζ@w1Du<BB}XR
+Oaꔘ-Թ֨k? |JRW7Q:}g1F9a19)K=I^KAN2DS"1a aZ?mlcjm4Mλ<=@<`bj7F4<u
+ v!M
+uD+uјc: &\2zR;ccP"f]5Ez}{BlPPwbgh\
+.'_F"4:.|m#,uc{D\+,֕ /]הLTȊG!iG𰒤fKDx6)X\zk^&=* ԌU֛]犟w\G
+E:Y1S!ɒۉ,X lgK7 82)1"4
++(Bwk%p,?bnXN*aJ0'de_xҮ>}U'lǦ@rq(jrs~2GD1 ǔ\!X$A}MdeQ_"&2OgEe 8CjX/tKdQk9[ #%yŮF)8GUGN›IIF=Q"keO32L|x(+uM/
+MTZowc;%X Vuf"G?0| ώ{d > UK^X^CCѰs94"PNiA2ť;wL5)qp`I*%)RfJB&
+r\M#=֣;x^cx6"DP+dK L2(7sޅn#:(JߛUMh .P+hX4[fD
+1:?e]Gh^fj$Jz,_q!& "lqgI~ s 'd#YnBỉw7DXo8&A!{SKB8Uɒ2vA Bmv 懿~bŸ $jBi%#aAd,z D 8Mk{PD4-il茸葄8<z)vсTUyA/@hoN﵉iohL4 `ɕo>HFv]0EzѶǷ˘G.un `횝Μ P8A5`+bP{O{[62FlDžԧyH~{y+.ŹRb;|ap_b2rPWWU^,N
+~`+ g,gfǸ;4l=T߳S! ̳?ۣ"Oy+^&hkAR"BK0$qa!F#XIh7l(o_7 1VSdLbȏoE j00C Nj+
+lBx{щxEꆎ桨4xP0%$@\l[q˄n4y;)ZeVdMU1_fd?.H, :C \'?o>H'~ Q{@-0j6Î"| }ihLӜRі]wf:"X _)`݅霍
+Q銰"f)5"(s[`n.
+V`p*s#^zD
+#LӁ+QPN y@qt4چ+Z "V)W?3.U%zIB40ebt+@/Zۃdm('}mOH{eޔ=Z'ʝa7!Xy?Ǡ%8Ko<k؂H! oy
+b]cQ0* WF)\/2SJ5zh#ShB<z9')Wɭ8H{'L.1Tލ[l\Mλa 2_!\.ܞPJ,v~ϯtsƉBͳ>3޹|b>G;}AbdžOz$؛6B}K,D( ^;0}N"#-°@%y^(=i H)#vnA rԓG;~*̪USf[h\J9;gV0|*>
+ݧȑ\Af=
+M+rFxw#M.p{ -X?ӺCųZDj*TZhڤJsb>2PG޺E튾N0uLM\3AѼ$[i*`䙜zv#.)mx,gbwMsWM
+[m>=TAѠt#mSh^30ȲtW6 @1Qpg9x>3ZDn
+I#SZȬϐHjk
+e$5"gV#ͅ~FD}L+4Inp{ʴ!%d*NtU
+h$0ܬ7N2'qdگI+hL(c!m"Aۜ6]їP:Ї9z@H?R=Y9 V7[࿦/=7nNglA\4eNG=<GrY6k &ᏹsec;*7%C
+[[ 6(Ťuj#DdžN=軜[rJ"*sf@2>{ˇ^fG(E~^Kr ҝ 2G:k"dɆ#ӏ\%' 'EXR~) W)9
+LTlt|dݭkK
+B@OӇMհ/-,D2G#7 xct`_L
+y} 3,d-ϗ-IV'"%U;@ƙDǯy!~AlmPNaN>}HofR
+e!ʄt~n a\kS, { '|d 3ǫqbG
+t_?’tKz_H|2Ix.:l ]iĭu]Mq((9H4k+F5ɿITϤ5^N4c2Mkrk"lM><8P+/x.5]mw_~ &cBO#W@eF&3K) A[%S7<ЗV&Ls,'M4=*}[i(%z`DM$b=lcfzFX.{uQ
+ bMظ$i*u]ld/YKdO8h才.܋ظ$Pၗw%'|:y`D SMڅ0I´RO'6J
+PtX\76JT.\l)'U=\l߉,%,SAQ^WGFOd[s! ޘj=B)2#䌎ܓg+n֟#ഖks%FbϩY}`
+?"g/..J,ð{c#I EO\tE?7\-#ɦ,o)BkhQ3E;Gytx,B'̍2IaG%aA0Oɓ]^ Up]Oqlk...gȤǂ_Ѕxv+º[ܺ7T$)v/nrrhL@#x)O"L!_D'x_'+g-HLGeJ u
+XX+"o˽D!Y,r !D]F&0
+'7 de%b\0(2 K÷jζ!nYM6^?DKqhvXR;/h:jD`jJHT&dv&# }{ue8,VVl#
+GMn; ! $eTLwf~UIWM 9LQ 3xXFrR㿰w1VgT?Lai̋3Q͓"1L|&2׌4@繩2b<s8'Ѫ<}VNw<!I4zZZͰ%!7I
+5ZR*ph&:0FBK)'{:xȄ~cG2A I_$Q9 sCT(]+^b+4CVuZ1e\sKVP>We@[6+z`hSRIohFD/LSHyQ"bb^|&G?Iwq<U7Eulk95l]V,䔈M;8 Ѹݞn~+3-)Ifw$v0޷5khe*Oaq| Y=6>KH Ö.6N.ŘUp{{dr9tȦYgV;f]q* f̅<i=̿,f
+&n/*5*QZk
+{ApeJegBw7Bo D8"R)ݚ{_\W&k=*etDyu#aqׅ#brT77Y|BQӬ+2R%gxjg#A/*O2 frvTg
+JF!>)uK((*{zH,vd{zIX׽?%7r'4D},ym_H5[dklK,gҋ{"ؓob
+ a~Ou),ɩy!6K1?8:l|٫-V qS4>/ "ŵ#""a*fCРY*r0
+HAO;Eҷx[M_ jI$ŢX!歷!C!n#Fu
+F[|`2tǚ3~҇p0.sG׋ݺnl?kvc2O<NR8փ."Ɨ>Z </,tXj<85btk5ݺ92-z4Ӥ St oT\WmCDZX!bacU* kd c
+I׷99פ1\LU@BԬ*8d)Zɱ77ݟ9+ȴwMӎ2>i/GcV6ڷ.yC[(\Q;`Թ!bn~H2AF H13)u}HIuȸ!24fFW@i8d7+l7"F;.ivt~nv4bר׍R̜nr&ܡۄtQkuHND8 \h]ӥ^D2<`OcAJ.H
+TN~_:`k*[#\(l3gobM_TSx[B5Gm!v h"N̐KH1$Tr/[2)ƛ6("BڴW!<ts`z "i9vϠԊW-'5%g*=숻U#u]s"B,-JM9Մs>GRxMS{lB* L=(4KLڍL2F9Z'9L!Nxk̗2-}|Q62L1J
+-1W3i~C'SR/}N҂|A;\]r
+v )k.Z.(O Ag2ʚ29v뼂^ {`f$;~S(jA\%@:ZAA1+GCM-Q;)&fPwNrxA6ea7 &'똝@WnTvԬ8c#WIQE`UfЯM4l"~\dM^0D[ow y>A_ Яu $B3#hgCJid o9C}(6 ASAlr#I[nl` `]1UY{L!!<ӭx8@49p!F$NF?@")|xLCטK
+5W7ssK
+5BY0v*>c̩8`e3lu!ÃZKvd5Nbsua)=$^5t8rl[2Ln) 04Gͬu%r!>s([ m \WFG
+9s:7~ԅC1X]:Cpb(_p]8.L)l\Ly$02;sab KdsVhgܪ0_@o@4eg亝BO=[Ԩ'c^({e94 ehڐFu/^ҡFZcƣw~bn *.6
+bB*ߑAo Lu 9~r0F+6o9=
+Bj0i@͋V,R\Vh0B ПEǢR<[!xJ IT;eHrDn%mk$l q.gWC(ՇsK4k@ l e:+WEThŒHZO:F.Fǩ=q,|iűHE36#"e(3lNcqW"^'uP"3psI巕}LIZovTdW.w)V"_agqd)K1ﳩk<^V2X ~v$\ m*ZQ^:SIK.<
+[Mk
+BhHWW [,M\U@!L pI-H5v3,AiTqg=ῆ B&/|#R"k1&rY;ƬD/U1QzD 0p,/G:Z[[[$Յ1UE|fZ1ʹF8,H(׍o!mC }'9NGpJc(g7sϡI`;Z}4PȖ@u m&Vgnuq\Ü\Xjv^+5D8k3MxӍׇbk0sޱ{*0d|ycBr9 fF!wICΠuLR温ClQPP?TxlL%q3YU16vHiERТ$9ihpaPgMUXLh*A7uz.4YE`iy~Q/hy.Ru̐L!" {n_( b՞0bNx!d;Uk>5u~hBР惔x \vAZY ۭ%l b|4BC
+MFE?*x_ eKԹy0
+- !|[m:{W`dF
+&[NYe30(ZSJ@n%.(XRmD!=0"E.'Tks) ENs'6JV)y\E#Zשׂ ~F˛{(Yb>l2yx+i۔!z6Awar:E?؞_ x`{"MQ^p6OV򔮑 5"p6"WT4a" \cUpRRJoR̈́P*!
+Ny /vs|+={EFձ`Hɠq:_|˹]^чOAA
+Wo/,$OV ~d2]l!Ȟe!(-ѐɶYU D5l;0VF M`NI|z;lyӍHMr
+^Y&jpfV;|ncQ=SĀ0/ę1MIOMg Z6
+xl+[x{IÂdwx4Xk{ۛ0D/Enhl):E2ZUuH#ӫ$U9|
+#,^d崤pZ܏ ɴF
+{R`#r>"HfK΂V "w3M&''_`XX~1%T 6GlgI#=o`X&mw,3Hρ m<YTaF%\)yĢ]
+b.!`EWI^v`exS'hcQ8[Z>'"<ˁ6iefe% G+8p}\#Ip #aa#
+'_z5dѼ Ɏ0 l=ߋ9,fs@䞁5r3,(3
+?vIܪǾι
+-U8ވZT4pAyrH?ƹ(K Ɇ2th(F 5r
+X}-Z%_J-O(vI<ΫeV϶O/'{E{ E˰jr] gS羿85O&ka.;:Ev@HOE$HȽ[I[gk
+T #G<5*ڃRv
+rMŷå1 g VA0ƿhs؉tY󑇦2mQDaA+)ӆY$Hc +.¡R1ـۢNypU4Rʸ{ ^3|ʰM!:ƅΤ4oQ$u ɢ~Ķ
+ B 0^HY>Aݡb_D UNІD!r>*3a #c $5VK%fs?ƨ[ߩA+D;i{GDɼr`($%#ٝB3o}F@2E@zq8cslK*3CB n׫UrH $i`C}&WJ;=U
+Ma^Ka$6GuwܦSUjt:j6:Y]pIxyA?VQҗsVCP))ߴZ,<ͦX[A\:!DuT䍰ҟ_Ü SQ8e+m2/d,#Ka1TN\ zx4f:} Ʉ>T?İSw[gos*G534nPC^%.S|A2ߖAby^"c31?Z/t"OO; t;' b 鎎d*1 ID6-!  I'Ꞟu4(oHG`3{+'<<RiKLizC!i}⊎
+fLӾTxƩ2="fXIްut ?Cŧ0 `tLO
+gv+ut`B~*N G42_w UBǙ,s&*
+;'4qt]v0%G@";ib+!i0?Y!B?Db\/T&^(ATj*l@IMA&,)d}jr ׁպf!af!2b$ Ͷ}*> (n0q#}H0Kkm!X)3㉦A(l MO~%_nT /]QϮ
+\ ˀZLN
+JѳZy"k>Wj>@4zYiGqIy-jD7l(gIҟKK 1P<ڇ h6D XmnLd7N>l!2;Z,k:p!
+´xe> GU:O"Nx=7?+S
+ :1!R7d*r `їAlۃ
+]+Ah("+M2Vds ]T3ID/q$Zzx'X+LD&dPZ%l3nr:B ^.٭M` E
+ٍZWmlJUSNi!F5ͥh
+uP3}*x;e h}溁 Zl?Q9ƾJm9Œ+?Ā.ȼ .2S {
+YJ]
+:i_nAvKʮh4uh`?$R
+6dޠAM~Q f1 RX. x纬CnhV)O \Wv*X8N𨰢0a\QyL41#$&<8!2:q֋Ϙ 6-7ЧhQDĹi~Qʦw`̹hދ'
+f*(2ϵh@+əf, \.0u0
+.Bzep"p⽓ڃ;#qݘa._̜|w֯e|k<FԷؐ̃s{0ҨU"`mUi9E~"5=3/rP
+hu07`2`'j44cnG m'<o,%
+ <KYxIT"b7;V _
+-{h܋JGLLo5Ӻ*Ԡ,ciT3!C܂!gu ӚsJ
+l3I)
+!JSbʂ{nHcyj`v.F
+D6lK`{ag%=j+I+.(>U9y+kPQ|?қBz
+){-2ʂӁԧJ*+,"MR E#㸵< v"5n6vPk^J`SAw\a IPt
+Az$Oi%2L\@B y X6΅%er\
+*"' a(uOnJdxgQX5}`nE+?FY
+On{q{Qr˽i*is`NR fA&g_9~W@A(ܽD:E=Bs!cH.cg`(Ra5`arJ4X "SLiiv/g|d Iˀ/LJXBC݄ȠnDv3fPhs`c,p)9ҥC EIɶLhW+څVft8nTJك-KE E6 4dWD\fgd`BR)%ma7P%@mP_dhv u>v1nǕ˾ {s+
+2
+#l;Ҙ~z\V`5$ ~(),;4ZA15x}>*j&J~b-G`DJsr^_ɍ/WSFF )ܢa|wџ v<#BO $NNSohZ*Q۔:%rH+3.6+JN_sPt Ori$ќ~ᶴgy4JW9W߈Tjs@Clj3b{I#Q2q2[l#E'H+Jib1tgg
+l7mՄ0os/F?`һ<rـEwK^rɼr_3JY0vVe^kcDsfgSU^f(&=d^ڷxGΩd%Oy$בPt웱ޅ\|2eՠQ$>CT ~ȫ3قWbrtdXI'?͇S"i#oyEq .y+ U+o$`>FN\nE=ϲ<+(#o_⏼Z$A a Vl&O@%a54Dep#Y&(9ځ5T NêE|=nTP򺡌
+zVe G*$p"cq]!%y kTz<ԵD"bRIv+•ɨZ-,֗6_$#z~cyMCw'n~Qb,CSKP:Gٻ
+l
+D֘6"cn_7Gޜ:|X/[A؂`u-<$wylJ,$}s.\ٮBe<nRb -;!Lv%;gт:CbۀX܇osQ
+bsL3!$zM( imFk&R`8bd$Ph+бQ|+2c$%y)Lj*a}; QMr(Vw M/[8vZbE4Dy4Læ@2&GEAփ .s<bXƮMVד_FI g/5s;6J5S6L~9rl6<A2ȕӽԿ#s d Ǟ(l]"z*L{s z*@<aF%)SM[s>3VgAxh3.
+neH]B%K"\>>B7vmX'1iEnUqX b@JV<CP3f7;lHHQ@M¿*5@%C/ CDb:tP;zA@9[xHZRDN08*fvW4b(hdv C_D?Ӵ9ѫ淋.@ǙpV.'g Nj'gƅgg;ԕU$f"j9KcJ!SoEy)L֜P|Cviz9,a1Gd0!vaW5A8"|BqFa|NF;Mi|DqFv!'2R(/8q1Ϋ4MO@&^ ٯwfew^0L!EKn,IV*CfC*>yD֦v+Q:8iΣ|EdnC!(f4T };G lZs;RbضYQs<^I6[
+ ɶ[DA\R$ޱvY˄_*<֗(Y'"X-@Ŵ?~q$!7cJ:zUZ$y!!v 9^zA+Y٭7ˆtֆe ]O@ls|
+ @"?!zEF%,Y%5%LeL1B#nVIxb{*1 D#YDS:AFpv;Ih"'N+)rX6Gz1$ݴ7vgs\\ .i[6I2.^QJt)PDtdt(Jڵ.F^:)sA;5?ѶwC4Z ȀKlSlONVMKJy@T41hDyՔ] ! 
+"ȃ`mC*zP FP&kZd-TޙϢ"%Y(1td8˅I@D\@7}7ͻ=*j/ uu€9a2owFDWMD
+V7E
+4 `}l2Ѓc8<K`c0dPR~xVҖbpXbε_R*a:F!LiJv/I].+(Af5C$ B7\kBr>,`Zݙ?1*:a4U#.r/SZ?5Gp (.΃=b{KEt^n c`S+9X&“RmiZdVf&zIV#xIk5}%񄈢>&º[ 8V3Nhp>b%Bg32lE1YoQlE".v(Ha
+c%Y34+WF0,z( aG;t(~y}0%KАԝ
+7#0
+pPև/{+:y6 9ݡ$K'z-m$XDʽK|A5pc|(iCF@?Y@iYo.N!,j"T^FhD"gB#\ER)t5Ht}9Xȳi]5QW AGUA6D81:s@qi+C*-ȸ|x8.ٺim!G}=g3]Y\$/vNX 3^1&BnCܑ2U$!4=Y'g644/M׆IZ>sI͊
+cIyqFkc Қ2HaAV1ABmFޕ訇與*<.
+lw<-deʌ@l<6} VH|6PDfm |ƛ7Q'Y.@ۋaJV N1Y^$MA!!l")d>RQ1ڧ@!Pŝ%KDP`d徏=
+5kAFfc\Q]^rlxm!q.j:^LD-DTlKBF )9 Ɩݐ@Hڭ2܍2һ{reoGK邴<(t&yP#SdCg&.E
+(s{%4uznf0Z+'`tʍOs
+Sal< S = wOA8}l4aϨv:]6ݍ,Y7pw1/g^6կ~P
+Q]7x{hL.0aC4ƣaXN-)J xp5~fg.ac`B`%emم:E9(RrB*3C e;˚ 06V3|S4#|F3WI
+ ;,-p6J:AjPS󹃘r݇k[f!#XG<G#GÇJ=27S)vhNVIE} /4)`f#&o!j挍b(;Ku %0i3fX4s
+!'NTIspSN
+a
+VdHk>xjVnA0mh8!}ؕ}^cdOTY{-IJ Xh9SCƠŇ
+
+Em-e@@g|b@v,'& "ns.-s
+?G`k dmiȋըYGT)N[!.!VK=ܺt4 yDU]- ܲtT@zfޟ:KeEWu!|&a/iK |e˙A/,gQg09tĴͼ(T%HT&QA!=6]ytB֧|n
+T7ؕ_v:/$'Xr_?ܘ7Ebv 9ޚPGi|o8\S]
+Q^}S٥37,3AS&b3٤Գsչ!/¼X1G|:Rmn}ܚb
+wZ@=݃U W$J^jd>dmܼ2j@~IRFr.JHժCVz骺QtcϡIFЦy F13g1|02Av6<Ɩ1|`n#);
+A+t2k09C h &wgY8!k64'cy9 $3>YL,[wӊz! Jy8D'/pQ MyOrWLJ'Qav<ID+ᮖ`A8cG70qק<"1gy;?;KY i?I BZ@u/d--a2^&u:]87cM OO\{ɴDE%I6?|'+ipedXbDvN~|HNEHGXdrU&
+12`^>X,DްiAd?4ků![ R96+AȵM/v*:\6]R~~eM7Qv:$;?mES%!(a#>=)DdIO𒞰V[VlP(;}G쥈bs+A}A(<Ёɽ y(Dӊ"QE5:EWP Zp,fQ!.䦃weG!l9.2l!(
+#42ALg
+>~ >!}X[`A)u/9[χ"g2&MJ8Aa`&K63 Om1oх-CV՜r e=Bd-Bt(Qtwe/˧lPAjscq4x=sg$VЍ5<!kΥȵݑbrP(%Hs,<}6u`DzEE< AK`1ǀʕ^[%ִ1d[,$Ĵ7kZFC[Cc t;d+QԷ$t$&i/\Mxt? ɤ Xt
+ Ed-
+vvoeǢ*Kkã$+Q|^z7R8%ҙ/5ED%J]FE
+A:@b?]7¹Nqt,&5^ٮe-hyNK Nkdh_n㧁Q,ݺgM6VC
+KxZ @<\ݽjL\Y1ְSSr]bFgUD_!곰vnhoV2T*qjb _A7VId8ЋUD l45<j7-{ ZMGlGqf,5f>h@ge*8z` x&{g*%%HjO%7HM> %e,5V>Mז2R
+>{8*Qq]q,jXE,8
+žö#ƴz,ܵ~(}&y"xYhMجb|_uM[
+BWbq=JrsEeK/`((w
+;{z vx.,#G%!N=lYI㷈}0;دO46mrO>º^YE102q(YGebw;Ȕ VIYj((rKbz/j+L
+0aCC
+?2rv{X M2+nÌxg\ WP0U59iNl[B.,&B+Q•+Jֵc\az\ťgm26ى5N #H
+cN"%CWFk)ŋh'Ёy ^{o<fDQhsp+l&o@_S *Vѩ@~ kb> XrXvQ)bzw{*.(rލ7eg+-e3hALkA3z
+/qnj,>0Zi @'?DY8Q}`,6Y5neQe9yxT@ C,qʆfdpQ3bT{3 +aX/ڹY11s>{jx<{5gr `ӕiɤx4ߧH >z=
+Q_uQMVD;sq i0M=B]lhEXyMC hckXg*Ӏ
+V(WuPӤۛ4] L*zA ) ܍ĮJ
+#a%Te"ӕ,LmRZiB!QTB//^Iqm~\IVھ^X(0I172(_hrDZ{6wt īzn$M&,bz6` [bq _ğn)8OKȂ],=DGYnC>U4&C~;
+(mΛ3l+>X^AoΑb|K82I&Dl<e=+}F;:hI 0R>cDQ0uRvk'rDK 7y(6x"$)v?[0 p˸9tMT@k?W>Mk(S8E?ODaa "AkY:67J6J~Cw'SgG!tQ32}PZ !)51Ⱥ|HF`)+PEgZ2}yB Bqm%` gƾ,9|f``c%OAʷι5ߜ)iP,=iְK;}('>##F[
+HM\ O;-U[xU,E{313H5.|w :>~Z6/hMSǟ#H:KS~܈6l6u.D҄+Y-c{)= iZumIνͪn]}Ty&ҭ.H+ KћKrGkrx~Ub>6Rǜs ҧb,_b]V{C|иGu^j6h^yi"h5FJ'/5k:jS}.P[+c}è svz،El1AU܍73`ܖ YU}lqUQTFO)lvg$wy6;bQ*Zy 4ξ'0@Ӛ4/ >HނIWj tgdEN
+ OO*r@Q,viS##K4R1jokv^@'2 R(-_-q%!X?:*:Z]@笏Ja__chBȤfGH~FU><Sju5iSx)Zy):~Z84dn-ӹ|Q
+5ч-HI V=,(Nhr0 p>*>cЊiHtMDǤ%tiTOVG^@䴉P]|׺d[&~}.S:b Aʋ0|'i Ǐcf{4**fg":3a"7#ืdBdJ ?>Bd2=z\2$ܓ9*EPDBP`,- }GsLfГJkYs! y!i<l"}L/Nr7/ǜ,xAzPb`t`UW *C~î)@ݡ; .9\舲S
+j-I`&?veRxcj[)bӊG.1^<< ER" 6/TO;#veh`,mTaJ 6w,8WFPGS%-2?"9^.lK91_כþzo@^ SqC@+#M,\j#ug'v=!S꺨"tpGx*
+
+̈vhb=Z|7搧Y_*G<7]L@𕑙q{5;=MD^<nU}z:"c ы^,I9 1.r7OaK(GIDksv+8  .Ї
+Nmuϙ4 jl=W>"s( ]cR=ħB9LnFkx.,]"[H 83&S6WUL:]D_`zS=
+q*JzV ֭BCC.H9'_L*ġ*U2Gl`-rQ'{̂6H1 6"qk>Psy8 c-^5DuHVXi.kg,v^)d%^2Hza
+0dMsy[=#ѥ}ðW{0[S 3ºdϾ
+Vx790Kǜ<ɷ+VGbB'F4˨0~7i_Ή2fB))
+hZ %;8\P~.`EÑDQlapW.S9-G*xqjV=[VC[IҢz
+ΰGnB䇆
+l-/ǒXbC7ueVF.AIY`p~YNJ`{4BP
+#KaT&u
+P\*Y&P)Qp;=&f!%bH |CGSM:+VYXJRC<<7 d\ ;rIX<%GqEN
+gM="痽I89_T͓ƪA=wop=D ,UMzC*,&lU8a!K"&v=M*OąL8j2䔏%P4OjvfPDW::r Xc'ȷą_^Vv<`WQފyX И7_BFսSO^f;?GN7lTǟScXJ}~+CdwªG1G=z*0;?溰k׼i/ ςG75)lKQ屉fh|Fѳ1\֠xXQnYO\hn"ڔ2L;]A7}i@yXSdf3k!Q0 uȺ70C%:d(HC VGW>gU\|,
+%(xFkS'=PI,PȞ;Q2 ~c_bqh<Yg3Ƃ. zL9 7P^G=I6
+!?&*m|ecsiN<IiݽH<Ί]R,vVof.!!2GMRoo`?u 3̛5 !4Hv>rbΌ >')$b^.#pǴPY%8q`
+||%܍՚ƥal_^shZȺg."cIOvC u7t81D!
+ՠ\g<b*~S6Rq߄<$px9?q2fK*Dst8H?sїO ɉ#ˀ]W:$MM\86~I2
+7
+m86*9
+L?eTĔQdK=4(ɷ+e-_0
+jp U~xeiN>B?-k@#uO8
+yl1SSWjnjy[l}=4l$S{( GgF` è]b
+"Jx93\) úp0 G*ْ$;Hrg 3JuCO1
+ G/NҬ[V8;agtohGmd]Mř'l*i E QA꺀&,砛2#g9m8?i:GR1,CBHf$O+2$<LEoT `{;kj
+b ODD>h Ev'Լ4.na{!%ZĄک/h
+o$T͖&x֎3 ˂݆!d>w84mkйOZ=BKq>u5"$#Ҷ֑TnPhj`K"xՏIɔůUp+'B3)BԌ<aڅ,Jw냨`"r&G4PlX΄bXm:!8(6Dlʺq1pAh$ʃ F}v8X?ZrG\YifsT͑Oz9ĞaZ*Iu&hUǢcӿvnkbz̴cpڷCD9"?H2n)!ϪeT;}E]Eńkي&-2**O6[Y*k-*
+5OQ'x+"
+wX ]މ0 Re"l{߹?la6˫' Li&^g ͠Yw$m?LP|s\
+Wїig2{j{b$K/9~d ?7y5|Y}@US[1;vU=a<":_w3KU%L s!Ჸ!VuI8NږLAƒãM<hp1$ڽB`r^`g']v1qLrKτ?hU|fH8 [)M[^ǡ莶ErVBuz\ mn
+ٍ~8PPPCHf^XU&M2O͸b);(3(@kW1:ПNL-H B3 }XSeh4y;4wkh0St߯̏F-ڨ)P{jUD$b
+
+WЇE[1Hؒ,@e;|-LRή ,P
+$RRLc)6>EI9cp(YU鸂Fcq
+I>6
+:vkC[n%x t:ږwK;IXR?鯘)C_eh }Bfc00&cPNhpn " |}t+2 rfhvӌp3x @Qv4! BZQg$%;#,yFK V92sCHAGʰŌ&KNcuGHc LV,3fhhWii2j Pɍ; %: Cppx(c#~^ h>(,gJagDt]eLO趇Sb.ɔU,CgJ&.Պ
+ =n=S"b>ϊ6  (Y]*vC?:y9$*dAB8ԔC BP+ J0/D́sS.kp_B4JfgAczc;#teq`ë Q)Evys_aqJ"m f;7Fm4 =# ߸_1RL4?==rZvv}[<~N#DB
+o5@* E a-DW30 E_Vsڈql-.W
+^#ra8mzD+"i7G:) Y#||Z9CՆ.R~Iŗ _Y.%Ͼ/+0@Egc^D8l$_6% ! W"mrH+,7l^ 0^G?w'kw-uI`P(zy֏"ƴ/X=Mk57V濕>@7Hg?Utw)vr{DcǛ?]f(^kUo/SMW$z~;,!>i33_+[نL[m|ä, }{q~;Ǒ,aQzYLz<&ԾPKa&)*zfQ8) XnA^z"%E}d^^PV =w8A lD(A~
+Mr&ŧhrpr= U3@
+ Y;X-nӪo:¼A^tFєeT ED~nM%f $`RҢE[K֔z9>@"d? SwA@;,``I(iL#=ibD4S]p%Lr51cJmc}{NT<h4n \G} FkN!&9J -QG0%L6zmbE67:(y|,F@\W&BsC.R=yOR^fn)%S,T6\,'KG@lY֔u wb2`+AZچd
+d0Q!~!"Jo 7a&@h,A d#_!7ID4kzPRQM߀b¦I&SyWN9HX{U!,~7W}e 7D I>@;=
+F~bg>GBI02Χ8Dm[D<aXQ"6 7#|tF+;8uZ9|?՗ =up~97I~|n^D(In8k9Ȏ,d
+NJTqQ- n"e%<mA(3; 4B:Z< ~I&3(hR_RŶ}=J싍*og=m !0TmX*tb#zase5dnjn8 B^ vHVQq}dN0̌qmoO9HYsPRأG JQpe@>3'| &۞N/B3{"~3/
+ Յс{d(s=ŨX85!L^|'/
+w@<E t@d,#bTyQ _fE! /VcG\"uo/w5jIr7DO; [[[
+_rHLrx0
+r߆7#fR{07g0^ArÓAmoQ=(n5&EQsN.\K) cllǃaBoLxaR&k3F50zGenQ D gU&s|5kT(kL.2=G'>F@F0]t7T8Szt5"AMvd>FF}-O_\# E!KFsq\7֍OQ'%7G5]y]㟘\fp"eS{U8TѢq.-JZ$t*I'! 8Pȶ!oZ Ǎf \T~
+ jl+>ځE(DQepjءV |kv<yk#d7vC rLe\ÁwD<'5 I{>+|l ͛c;"7Y܈
+LcA1V -Ψ3X
+r;!c; 24r '<5?ÿ
+aٜelE4~m{x ]h=O2>~Q<@"Q ~bI@Ion̔(cW§6A B-JT sϣe%?5qALE)~p+|T%P3",&ezsmI ?rx
+ޒNIp8w@6?)=zjGBv @@ܦW,D_||[7Wfzyʁ ;6ʢ 7Oly3ͷ@u[pTB;Jƞ\O7uqǸqcyD7PJwL<
+HBԣa6^TDȹ5LP+.R-;xt)Eֻʭ_a6_E^/YnRP y6/‚Z\M>`8LB+`뫝<P~кaCh"5aW=lLW1%*@E+YT #YIZv9!:+ø[M˹*xt{g;Pq]v%N.$Ǧ5AL1X3H8:ۗ0X.jiz‚df|p3AEH
+C=+U.荑=вLN/\YD'ڗKeE/R+L)INnw#k(1J^<lh>/fPeI H`CD߭}[Veơo-7\5v/{}۾E79M9f&(sbZIn|(|1ʯ0%<z1i’d{!NOC2"M03X%i yR'Uo/[jUءӎadxL'}كP5sUaB|"n;;R(M x~3. gSk|˪AF=ror˿ORަhюBX $:΂ԓZ`I&
+ޠ&RmH
+m˪K2h <bO@>@S-r@݄(OoCd
+6
+dT YBF^O%/q f v+GDŷByllmQю$@1R@VGވH^[EJKSn(Q훸(!ZP!AGs3zs"T)!.ֶyhtiIkn#z? *۲R`HY$H4{dف<1#4C
+j(W@W>WP!'p9~ jݲW>9L;d7n"nlf&
+nVMl׹y5m#H.UfӚ"} c.Wuw7/6\E1j2z&Y,)'P]sLq[t~ٙ)2Mwe*ub)FA~bP 4{܎!"JpW)u
+9|M's;an+‹_26CϓʲNwrrFA33YUYۋ (UuK
+U:m( S;NZ)N ֳ2iD%ۓ6-HVpնh@h*lU'hk%})V3엗x@gsb%e DMhPKq$-,ΐTXK RO`y R<kd 8&0ƾBĩ+
+>EO X3U!NJ?Riy:(ʎaF(k6"=h_
+]]?^`9ԯ#߷q&H "hgߊ=ty <#u H}kQ[_mL9l\RS*IHR) 5r>u]!?%
+"#hD6, Eq1 RCX#lDF8<>n;JMn_`A
+^ t"jwȫs' IVACoI nRw1(,k״tGhh{W,ʡYfVc7v 3՚…ɬ?N2X6xOWioȺ7FSNs
+.. KUҹM?u\x
+?C;v}χʢ ?̧75[JdysI9 éaG|pauo##!WiEXչjL8g6z=n^O7G#VK/X6n1N5#_@W;x՜-_<^DU1,F୎ED6I ATqAaAFgR:|]kԞ`Y
+CSMcxX+v<=CnɎHAeO12Xr|zE\('[`BW# 
+^њ\v\Ijn19s/~iyAiㆮhe1S?"z'ߥHiщI4y1x lvoE?"N1iS!ZY^p-o0^V
+6oG@_!{%,DQyy
+dYv_Bh99ęέ6M
+pTks&bؼC*[(`@aه_ lHΑ]yS M©ЕPcH ^O{)ώ1u\YЬt>H N{m*
+ٞKnAлC "?LB^/Ysu [n %ՍA=fhhF*QrɸeSRQ~\hlU$AoEF8$c Xڡh`0A@J*q%5c0G:f]lo"5ُ,- / Ebؔ DMD_;Yljis&Ė.C6) ءule.+f) fHN/K6
+a-M/!\O>Gt-ω/< vPEbҥN0t'Yz 8iCw wh\~k |6ׁ^_ x@.ItAVp{*_+,k'G}Q ۣ q՟a@TOb3ӧރ7Kl1'F3b%EW#` P tyD 0w 5:cM_,
+˯cQFqzya(:F('٣&0@ń'zftM+l%c+69BTDcfǔ.% Ӄi0ʮ%g.<ÄRz8ԕFR~ߨl4w ,LrP,D1Cjx(?$Pc.4wVU 'cbd<9QEg8,.ğ$VDz DSj%2AN~+G`OGpJNt)ˁ'W?JG0O}*٫Z]X9(*Zel??(c:K!Ҍʯ8DM^"fl,Z;9,{V6mYѐ0ܥ x#\>Rdz/pG
+
+B$ r$t
+ -:Ve
+ӡ&K;F.!<
+HMrd O;z" $h/gt+iV_[ TY$  jMV{I[.V.MI\r
+L6HOf5BTmc//R0Ҡ!X77)эR@Zݽ YWT+xuFq8ݫhrNΡS||)rt}]_LS8"tVvout} WJ2eSG[iIAVykFnQH5赞u'Ss& џzI[b~1zYάO:ns Hsb&ϐ2x;8NnCȡ<NS\dL1tӿfrޖ/u
+9BI逈D(򊥅jK;C{b~AʥU8EǧqNaL9A@zyڐ01/ (]zEߩkĎTvz\"uTAG_Aϡ<.9$1 ^SvF"F@S"K'Ρ
+0SERoK:c,|+Ry"AH*.jű*4 ̽R+CWV."0elx@v,&'Q?&PwaKuR:ŗpU!\>N՘ y2I=S!jBLJr|r^c 8%Ss܀<!:|)ph}@ٳ:B_: )"#9b@bd'u;ɑ$T'<p|v:S_h0Rv>^l\XBm ')#`$q)[=ۼ* i2%l>q&qn(1NB!\̄M@_
+~!d(5 ڶAR|ŮLV2҅7J "ːA$; dRdkRlGW`<crgkI"n Jiuܩk)ZTJx;7%UK$f,nTA["((;vI@OcLj´t:?[-q^Ҿ}H%m2} +k0Y)AA}~vbI)#DCMD'K2ԅhĴxx1rx"FR.(
+$5(6Tv,
+y =_ ?!E(Ro)H0=oбⱠHIwAnsnAm )e[bcQ+XsO {P fRwBBDX`rˬ~<!9oB%>AR\PR3/<j-W _Om4(ʋ$^W—WSAI@B0OV4h;2+:0Rt jZb@H.fOUp@C.2!9ȩLG+"E Lu^-[Ubm.LHx=*grAYEٖ=xY z!SD wIp?ߞH HQ/.S= qhȓ<.ڑ~TȎheB*VV z
+Q&*#cNNY@-VpͯraAGF}q~c؆0[i
+CN+(+dtCaYqCaS{`eEi~+Æt(˞#xW)q32BIP yRÕZlBCMT>Iu 2En 54{.g$fsXUH{x-/I?Cu(y4~yu?VU4Iz.si.;=Eੑ%c|g_qH7́͞i(gȻxS(u?|UsѡLyjãAty=wGA ;Ep _ Qg3bKDPmL5I{KpaP9
+<U?[İ=ì$Ÿ '}hgRULs@D]s<-)G [)P{NbYђ&:`]7L<dqƳ_Z Yc<fL0EG{b70SO TmhچF0po|&yb(N_ tQY>[Ny$bA ݬqL5~ jqcgq)k:ǜ g9o$W|QIO2n~bwBX|9_5f.gcNtəX`HN8sbD*U-jQyH\zg3;m]\ ޹S+Q҂Ӷ}01bSg HfҁK'j.hVDZQ29Ӧq7:ą׽D&d=a7Lr^t.U2c9NHrRI-쯪ܭATʌztcFUR5Ӂ51N-64ԖzC!nq/Rb3;x7VjaBr Ͳ[/.^Wnk5|R|`C4c|ryW?i鱡k at[:zhO\~|o?l]p8MnxCXK.W5bAdlkI渂D %I6[g _~$/o$8FDӝbemp27lJ:F]WtY`
+"|JF!KV 7lr0( އld 蜅 2
+nB~\0
+
+8^ *fV|e':g8a>C^ T ImVab_ qd*5]
+$**cgbbe#cL`<$(
+
+(^
+f|!'8fe8a>C^D9}ӆmC<9g#lWI-,[i֩G=a̼RqY9li !AWPMP5+;9 Q4jjjǒnvaBKZ97La5ڒ't,_
+^DX(e5jwoE)[nHPŴOn7 tJvcԨRfmOf4m
+q5pc%l޺%Uϻ _
+k &5@r{cG
+8~},bjiS
+hŢlȟ`*VkG?
+o}7LB:j,<&9t>Qfv@&C $VsmY[!~; $)%貟Wf+2MR9r D{']&fWOc* .VZf6K7FKilIziT=/?78u"!q@23<`'jߘr!E/v(I[G!O-3}h/\{ ^/q QJYEP>3g̑8 z2o/(B hezĹ<ψl_4Hόݣ%= T&FFdAb3Ƣx-t%W+B
+k
+C:V6S(Oo@=|L Ð=| X:8!}ؤhqj猘HL6=
+>Ri ~$ElHcb@FP'~#Ù{>y(˔]!OK )7Z
+*)a+ڙ|DN(jm[E҄<`O 5to+ ?6O\1'`G6y
+63nFsJ nCWJ^k
+@ҫ3A*aִ)SIt r2Dq-@iu51yCJgr=HpLA/|-UHReQ]Az>q9stSvu̢nY ń栤 TxPft$םO«3iN#ׇc蚇 (JTM<$$0GФT*"i+̯kٝ; ^
+I,MF=-vk!ev4?'hP8^3/^'7
+4]B> %[a_(iLL2RwZ2Sfw-υ*kUUĤz=@`U IwP
+O2C\ZGu֑%מ~k ܩm %P`|t6yoo-
+;YMsL
+!bFR1"'0aA|/Fb ιѰ/V}wXG8eeԝ"b^IFLXxxaeyRd6 SᲦc,zC.
+`ll?q&d*? !*6:b"V(aVm_uAvase>ĈBрM hSq߄a[Nt2OC=2(z3
+39r @sPKfǴ=Y7;97;CohچxTQ'}(A'fX$q+
+( EQ/62A-ΈYɲav \ໜ4AYaRܮX4n4>oHb9B(i$%UWPLQ?e+mZai4rk %Ԁ̌a
+4U]Q0H=@N=<˽,A{g:@39#Q@k
+pz9-%1`L43f
+H; HOw[}E‚@/M|ȧyW<T?C!pŹHT#_n(ctX۵#L]"H~( r<ui+Ywn(H|0j7"5EiW̹m'Р4}!T$W=N|0Dj*%c0.D*iHtzpļjlm"x5xH@\ ؚTaZPwڌTpxI N? $1׽ӁP#h8e괖i?w^ ..֝4A>+\u?
+0 Z̃Pfov
+q bs?u)9CRXfw0٪Z7қFVϻzBۋBd Wh@pU^&*P bֆ橰!)B~\n5=GeXZS/\Sii!: rq3jՈ:nŋ6Dv64\OD ކn-?R׸5xk{rHE8`@ FZJ8jdT=)Ty\2">5(ZY0 3fVf()oJH1/ф05.Pur4S{oE lpG7Wz
+ I qsZ08/:lcnx5R.8: ɔY/L|˭\)<Ѷ hMot^Yz2U:zʀp;=dde@ CZat\KA<SCw%7e;]לp Banp{;R xRڛ .UɭkM!![PMN|R̀:G9s%Nw*s,PVפZ+b:^>6ksu]kvB"ox!LI
+} tlgX_)ʲӣ"qmŢ4KJJ=\;Ü 4$*:"uF4CIv KCUZdqd"<,]o b c/^x<pZdHfXU(hD~zIlF-e`t<d%b]kԸ$
+]Xt&4R?' fj)Rq15Ur|4,ໜ3˚ X[~貀 7: w][>qXFb9$TSr*T,y
+ A q0Uy2gY- ;EC%@i";OD¹ڱu~U017 v~G> 
+K4
+wJʣՅz,ePR6 k+[2Lzo:~\}h\:- #A]SWZ +[ѺaSi[0bmUCPMq2Rh}A2qco Gg-y\=B$t/4F3fQHv0EqrBa@$
+:<G|Q'U/x ?MW?:Gy,<w]fɲK< D]y9)@Qvp&gnV*œ |đ )1|.f_8V6TUnA0v^It'@đ 8<eTD'DzOA%s
+ĥp@k
+Ḧ́Y :i
+<oD>G&{k5`P弹.6lБUdىG)}^S;qD,ڒu%}>d;a"2N:㕒ޥ.G'OKķ8ƒF\#&5}c iԭŞ1
+Ӧ'F\4u@tpcA=,A5(F"9!56՜
+j>M pJFPd!*Iݜ76åLAʙ ﱏum bF+(ɃQ*JX]G9jMvc
+2•Bu.3oniZt4
+!`ƤKѻw'@ʦ(1u|ǐ,A
+dJ]PJDdjVC訡w%yJr_=V麰JhN;A۠w29.௹ʋ6.N' B喓Z#7|:]m]%b~߲!?JAޜYB3]aB1gjm5pt
+ڞ8v9DO$޺zFY I&X|x Z:sZ5<W1Wd[*E9"fw-1,E0Dc<^TQG<ρG{'z8^6
+A5U+dR]L Br7uX@kc#0KF2!ۦįB:}Z1 a*A1Vֳ_1a
+6.p+;L2V]Cu7)bs6/3QWo2Y q3L?EgB,&dû MB=̽
+K.-m߇M}yy9]r4!K1n[%J
+*~xkv4z-ͧ% a
+:7cT].leSW!<CalC/ [NjV+~ND.O(.1<06nň}A_xI<&}S/
+e#0r,M8vp+6.nt17ۺUleԾe#
+sxbR,
++ByD|EL<w7d& ۍXs@D$(%'
+mVIwi^UӁ ܺ.AwiyAaѽ!50 M3&<AD`͒1p[mn0,AKr^u-V ɶ2ǒ:bTC=%Xi Vd]T.tfT-XIOι#g 9S`~8>0%o#>xi2K$ƆiyE⣤<{ni+vmȝ3q+1;8
+
+CLd^S Ɂ[,MUpqű*җS?l2QVUG4+
+fQ'1?qTx8ADfU8-&L2a JNϸ
+ojobc3mն`K#29-O*Q$IJ/& ؝~ h2E<YX.-[
+ uYA 􏄪nL[5c>H+΅ vym^2
+J C:27r}x;c)E!hMV:@tkrvu% U0x^<F8HDʐr)4 } 2~Ϸ" XWgjʕ#V IUq`0_,;CGv9}\fq՚6b'J8[ ~a CZlTtr(J*]C .WYfqڽK%A
+j%ɞ" rn3/RV?_`|(;>vV,lCZF>Rf*.+e׉BnnOtUebn1R0Ie"D9f[;J8C2<b+ƤsQ7H;54(PF ڋFH
+:v%7UC@7 (8O+<k[W*Ųh/nn<^AT z$VZ)41Ԃ #n\aoMPpgvUg(v=y)^DZQaꜬڸ]•[9 /"RЪeAX
+)2a<eV~ˠ4c {lu+b/[!\,J
+ ި0n.# nA
++$ ˘5,ǍnK0Å IL\&7%OhÊgf&SioE }A-R1wLUNΈN;j?@%ɨ0:xFFF=BnY]B[aߊ=x!#{^p+n.%i2 ꝫ/qZknnE\R݃stdx<␛M<h*o]"$Ȁc75åAĔUb7T
+de1-<Y _q(|cTߛ8،8qP<a]REYEIAyo^5m݌gg!H[JF;IU3(Ip/2ixDCD)•UGs)F
+C*0D:k%#56G! b*6+xj0 ?Yڊ7Pt@?bSaveNl ^Z7;jdb^%L;>_D6ai{ŞV"aʩ"q.U=^]"eƣPGĢ/gi-8, =J[gT +p`J@#Ԙ h3T7kBRf,l
+ )?Xvp)_e?_܄ע$숭UaŁR $ŭ$fd$h[x~Hv8Y-t9lNBI{䎛{``'qXDQSͩ=F66}ZӦ!&h]uvGUAQ6
+1zErƃoiCMS8ii,'JYָt ;$!b0ְ0%YBYE踤,6Q
+
+uChp m'89v D f.(zS5#<~ П [&j@%%/l 0
+HwSd2|7r\&ql1TeVa!ٱ70EIhZ5$4}%^HoS>OR[YtT∢ 8 G7oN[&
+uXpmw^TzV60p0c|7-=SYXca
+Lc^2>fc.m9l$6! $D, jڗϙ$֗#4
+tAY ݨ"cN6鶖bMuJn,h!]#@%DcxO?|31\؛.yuጲhNRpx#;-}1&\d8eXK)4&]&&ґ1Zi3b1y+ח",
+ti A pؓӵ+9IˡgiѺsGo߿5͝[S'W]꿺>A>M b.|*K[]~24R$Vb$=jM6PIPL%r<RUR;N*tWv5>C*fo
++Kkx>沂z^9ja*@b*
+MV
+8?U.lGT3fyf*:ea䴦c~"NAb2(eWu[Cqx:^
+h4+,Ζ#f1EƦ s m25LPMGi1Fc^<e3YYuL{H{di`Gm3vfΦ*2b1g+u])NS<
+1hĮ%vu51quJ,jP^Q]a]!n#[1jN:г+9_tkf ZsرEI'ϏZnղٛ_W<X9DBF~)TeHs Ccozt
++61&N!MoǞ8tC YDdam14ҰO3/w8v[SħKA}76e w洭_oL񿨤m``]RcQYK1<|fyZ^ a|)d^ sݟ|&K(bw[tuW9y#:/m,mh@ݚ;!y[y術v
+O*e*?ey"mv&3i3u2nci|\KHH JIQgM @`\ iv>;Vһ<龼9#Kf#$]TBrT qVLT"2-4 9'ґ0 `R֧u@ꎡWX !_+}p;ilKzҸMX;rU1~Lz
+I8";Mh[AR '1q.m
+7H?Pwsݏ֟~xs%bއm") uh}Σ;~5IIʆ[nm-ܞ<q.~J$UEolh<+o9TCHtG5Axٟ;hcQǻ ' iX-}g@un .j)
+Z59q6YRNTB3A%A[騶IdԂ2q''Lr.> CtU~c6CF.e)l껊n5F ifys~>QVb%#V
+Fޯoz?</nmmCgg֝fѩGtQ
+ O2L8Q#8AګyR8QU`[V*1TD,&,jJ˫8N>huKU(GPQ1W#ak\]rƇ=gA "eqޫSQA"ڙݤ}U5r }ySc."|8$i`0RK+QTr\c/qUkL..=jy98<Y
+i5j
+XbhxdQi,0+ wRZ3|ALT0M)T`^=
+a%bFGQR〬a,+!v%+ G\?/}3TSvZ*=&GNղT:Pix%hGɏF .`j2iYɒv罬!} gSh
+zNxtBϵWұ;nP! &/tWVĻ޺ݏ܋CbpW_ڏCnk3vJXi𘍗72yՋ(s}7_l▍) Z٭ D!o,ݞ:nJwgxz
+f58Z#]\j
+ؓ~V5eHrh4Cjun2X_{h=ts[ѕPØS
+h3j.r\!dZ >MrVڧ"J *r^%RV
+"&ƧNJA jTg<ZWոȄœWX&rpփKa\^3>.ǭoJ5XC>G4\o83i4] J
+zޯs>\9p=ZqLX2v/ 7TRʧ݊3O֕X9C1 U^5'UGq\]G02wc.KZr.w)rݟw fl+CצM ۋ3NGFi?A|JnTteHOK;no_Gi;ز7q7qgM塦u
+_sΡܲVrneә_Gw_}*t*6}84
+aB
+> q[R+ovYيW>p&"2",r
+.Hݗ~d8ZehiÏE fp~qٵ\ɺDw滿? ˪ތ3IojCxiNƎq:XDGQb(F}-0'BXؚ^d*/x~[/FSq%%9(v
+.bl8ns~ahU9QR4a׃伈ZcuLC$Rdiڍɓ75
+rS+7GjY+cmuI΋;hfH\ 4ݜET.jȸ,Ny{ޅpo/oV"|Itɻ7]y۹v٧S^ Av4jrVMϿhKŐάm~c#]<֜W.4jHc)[);tUr*FE v} EZ$3s\Mw:t3i&@&R%$V{%Y01ql1kwu -i7Io< 8,x懀; v"TЩl+D5`
+;M#o=)llDH9{VjTy
+Zd,a3W"6U%0P1 ^ 8~lU&*g d%T#H? ޼fn)C.U7=[g\R?^ j{i[|Z3Ștt te |?,\i8]n&FY+/0 n/ڏh(;߼^8<L\ֻ۝n4Ia@]\`4L.A.køs퍬Y>@߼w3v {W EC3VcnzV.HC6}/Fk07eTL\Yɸn2Y=6ed\kC 4Sh+7 !+qu:
+
+][Zd{~ iTCuBrFǻ: aC)L$H։n zpW@O{~uw-M_9 nm/v8 0^vGGO"kiA6gis1UW;p5 wC1HG#ըIzXc>!e_3q%.6<h:
+6 +LupEQPq8LmWVv[9TH|3uH0I2IԽ\¢hYF(h\= =R˧VIݫ&nqt*y7n
+k9M0.#@sn`s2@(kVN5vUpqQTz E M%4clL5F 􅡃T9R4+I`3E/fKi綐s1aMjG9\5@E]{|^bV@u<g_ 'V>!{5@͂k16cm. kI*Z($@+59$
+&A .ȡBP ~,xy,Ђ:.Cײ Bfג<|U2z>[E ƵC|nm
+8 S݇ޏJjA`7)ظz9q`'R)?I'we6a&! !>0`Y%YaK> `HB P</IֹeٴƇcI}y2-~|)n!vqSF>T4]4W ;;nw vInȜe3 B_]GImm'fFhf&pN,RJMHBʋL^,/)I¦TF>9|}#,D3NNJD'$-C"cn@EOHO><*PjjdcZ#S)\9ڧ(6Ielli_?u~4Qm5m6C+uע(>v8XI䳳ODwʎ'̳/{g*8í횐F '-^hYs\pLE ݋{q_)՝󓷡j"E>2vtםC1JY7˘;[4}ço7 6CObT<8yL-9Ow$H`m ,5%K{ћK/F] Ɓ&$ƥ=tJ)M9l9je]9OQո_ 
+`6bB̥95B5_35k  |:ьSz̋I710ADw`t?n1rlxm*lLѝm3Ɓ.'MI kR5ڄݐ#y_?)17rnRJf?
+z2bWݥjD)!iFI;y1~qmw~űFaeӣ-Pe`"r<l矨L=f2Щ'bbÇo~2FX2:85bƥOA'4fD6!^̺ѣR5(tvt7`Vԝv)nT#e׸A-[E!SoYGQH PߚHY:NQ(v{w'qxF+p` ̋l`FM^f+ 4T gk f~#VanEݝ^lsmbk[pw>-Bd֩kl}06:*Zޗ02Au ޛz|ݺby[A Tbݸ)ũGJ1K-rgp0D򠔠v%qOaj?ryoqAV1p~y¥0Aڹv60frʃIB5"l#B2Ј/q?'~:jF*x3PsCդcgM(ixjpf,34Q- x11ߠW!ZYP#:+͏MXnHi/PAU&@x&ܳ$
+#gIG>=5RdzlF탇)Dr[uQ%dpޛ7 {
+xfvQhY!q yf#G\
+dY!v4|Y l6!#b^{#֢ȶA,1Q{R.9G"궛!vLZXЫPu CMп/gˋ4|SJz\fcm ?ҌcN0[7mZ[^>Xh&}TWi̷9szh;3=(4( ZR$daSDa]Z=ڮ,,R!1BI*O*zq =L,2y9shO)m.WKMeh)1d.]C< bllRHەf e#Pȫܐ1CTL*+,v^*j8RƄԝlփBWg0Ē6mLc)
+3V\Sny=-`FF*랙MOUZőC3GMI[oWH&/Ŝ@GD]E3^g"55%=azSSzwlILI઻pqi<LJ:=%=< J0_$M=YOP n}pz~_wO%;DŽCȣ o;$)T.fH`헠Op %!*s M}=3E*c UzI}>k`,3oFl%ab<hz@: AffdM*:4)A İQ.l.}v&dZL ,mɭ[~Co^}cfѩ^{|,O<3vVbx%1t00sά6U%v}Nm! mKES33ACaª3,^7^:ŸYƆ좪Yܐ;`
+([Z@j[F8 b@xG僽gبA
+xQ^֦@"<YK'jfK\eQU\)X!w49b8mh!M%Ka ٸFL-"Jf>UY(mO-ox~p JQ5&bhHcW)jϺ5,9:#
+N112)Ȕ Y,,|UE
+싐#eIݏ\pY`J%wŔU#,Ok6 BҿF&4>D=c{KH+w<ijWMI(}X"'cU[ԕU#GhE152ͥFqƞH|WB|bɌWQ-*t|b?P ַTu 5#;Xy2~!?[PyѶ=߬NiIW][
+j(-wl`z]bҢs$!%k1KM.EYQ=81}'9f$:N̉ <뒓RQ6%hI~p돖x ,]mgҶCs]h#IEGKsu<y&jb;D$T.>mzhn'YFa؈8PK A/ kC:^ɂz?szGI* ]Xx:銄ηzØ<x,:2'xNҡIBED)U~fiCs!z0 (aĖz2?F̼eA7E513W1GB|GvF,|lrN
+R\o%_&
+^M.X_>j52R-=R[ W+A'f!.3v7A!R:GG)ҫ:) %0)q8@cmE1կbgx!- |?8ML]- <ֻ?FDϮrLnzT&# :̝ O)Ѷ7lPnYZw([ns$u0Kz^Ɋ|*fDSo7z-Rr;b
+?dp}UVS܊1fW%CN_y9 Z %1 gEՂGXD )9^_yN1
+]kLXx9<W=[D=༘蔳 o(W-/ʿmmL*aQNV`v᛭k^װJNV%ȉ[^ZQ]
+:9pN93wkksMSBH~pli]x7#!27Y3H>SK܋;.r_FjM7(n V5ӋK1#əb'gSí{[n~~7.OQHLъ:^bH]@Ÿ&v Tkʻ~Z0׺Ɖv]ѽsbd&K3v؍PH -R$ۄAv e )hEl{}u{ߟ fM~=#@!jUʌ nID
+'Gc?)⫼*BmegDY'(N˖ l'*WQSUjIR=B/,}Ly^RjׅF9QsS
+ymM|AT"0/%ZvONJ }_xI햑p +'ҲorɲcI D՚&c\KO.mMEO7>քzՂ繪O":d$M[n?Hgj#XdEs̸\`(NJVRT]v=4<ƙs2]!utZky 2LI:+KVY1Rй@>"=Ͽɫ񶅖jHyuMfľ\`};W0@w,Ox(.dڐ`?:
+B"5oUqE~W+U h`ia
+c'GI !_Y7 O,sЯ*.r8K3=ůÔp`_<msAbBu2E_^K%)'򏹷ޚ,-=S=Ɓb#V>bYʁk ^Ƒhǀv;<i-\X)f6y`w~ ZWm&f1'uGtU @5N5K Ӹ2/_]<\gOv4\ A_K^،^n*,3R[b
+O;KeCRFRJx
+k"OG#IZy`lujap)/( nyu c; #ݪ$4!N{#3w;0>]]DK'vQH=`nDE1,gV"}5ٱ{6zsSӨmAy͋о ^~
+l<w oK
+t0oJ><N8,?і0c9|f>=NU!:z*7yK1v
+|TضX~r_ʵWpa{Г 9CCV`_gĘ`kY Gϖuzd\YkE 9?̋vV+)S s]+~ݷM%wZ>rm:JN;WR(>:QNq1)ًMeB< q1OL6B/Q>W|8=aw}9G<0.lrGn;L)EkugyBT-aCFKoT>$+`aIEnla2 !ʪZqG40-枂R
+r.\ZC欓\>r<9ͩs>]\uYD?[YWKSyE}')ӷ=1n55%^ rioYsJV굊k*{w%\So4֞޻'I@;NuSPF2LTfw+rwl
+NUN7E[X=с{]HmT);"Fxk(u1>BOU 2FiW|f~a{ɐRRo9I
+f]J-bcSsj΢}0ѢRziSYTWut,ulMǘEclDM5
+(%" ( * &LM_7Oթι&GHS((5TP3+]+K@YM7'Tm!k@klÇ sw
+mT _wA~q`2CNKN-XXEBҰ@;R oӢZ-j]!#: RR 4"dV|4Gz%-[l}巵܂d)˽ȌAݑss;~]Noʻb?]#蔭o,K 9 䃨:gUѡ݄S=t۰6Xh$-)}SŽ\dkD!k'#d}[ՔV4=;Y A_R]ʸGskvFL4eD7lȥ  d#~tSam U&R$յM0 `_1`Y
+<l F
+j>yg1ޒ=D%̶]ȅȀFP>ܔ_vG9.pM{lI@h(77Kz5)jϮ vi%}uP,d@)ڛBߝ,}֯v|@Z6+RH-Mֲ oqӿkxWQ@SA ָe[b0OK-EQk'jp=j޻I5Fxy<zHEDu4{k~Sҡa=k%Ҥa|O.iY@ۻ!3R
+k}#p4X{[)k/Հ9S~kQX|5ڣB`m2ͭdU5!կlO<sRPg#m@)<D1t/uHtM\1'b3K۟@=9i8E?
+ɰ5..
+%|c'Av.{ON ߶;:zkx[֜Q %zىV7PKN
+<HmcᡞwiY]9}a{?t7K7kbAםuh_(5J `v%g@״{u"V{bdlGLbQ5w :~BSfEVjժ(IXّE$2 F4*iŨ<88ory|뾯dR롇AVuGr^|քl.ggOYNӈڄAA~/9T?A:>A}n^lTRhmvԁ])H)כ؁8J͆<l gtjߤUkU+H%-SwRwzXquSܩU]xMyjJߐ!g!;j"1'= WM'}Yc<^+ŝp'cE J;qn\㵟JԒ']~h,8
+Ia
+:1;qBHyi]ItZG#?gꈺAvnm}g,ȹ!.ŽQX ƣJ„)pI
+N^(wG9G”$̳Ce]OkEp4'%oq7 -|\ii ыGe(6L-q"`0#%@t3͎2/r_DCww3k(g[ʠVA+]kN>˝I/V5)5쫈 T%EyQQ9)V|v3.W< mTH7%wyiMt}PUM%Ex8/;+Ũ&=N|D>S
+n4W+"-?XA_iM1BS]/E~lC֛`12 II2&ңWg& X 55iKa0͸H8+rA%G~|Irf/%h3{͕UL?hVYT$Gzvak Ӓ?ҮeW+ H~КW[}-o<SCdk
+}'V I*N?+^l%nuIM'w
+yEc0t@ lH@#xfi L?\
+gO/y嶭xs: ^z>^
+)y
+CP*5,QҲMDdns*wU>ٺ/_{ź]z]ɮ}v'NsMy\,wV͈i냢6 E[XHDc!#(hw/
+@Cc!%"a qy$SGY(h>*y3.f7=)ތq9;*b^}=O b,GB8;HgF .h HhɦQoYS޲)-㥱'uB%Yu~m-š(Z< Y xzC t?cᄟ֤ 6uoQJW3y <(?:#!%4JHdh8`=0GTg}wDHX0NDylλ^~ȄLc3=h9wRx%nn?H
+%-/<FtLSԑ?C[jK>Y(Y`X Fn3;ӹ*)HqHdz! XwCA>@$C}f
+YBz0e .[gխ-uw-QMɜ; >W_;RӐ!} IPUįhRvyzpauwk#omJ^4
+{"nQ3:k{**1鮩QGI{tjBK[ -]Y65+lE|:/yFޝ)>Z2uKM&~U!$rʽOUE@LJCRxs] WZ\YSLGI4\^ĄRLlKYgQWi!bC~mh7JeAk^ŁFFv><̧;Jq1*F!;Ԧ伟q.~m)o/kO|F.0'K3iS1eNÉh
+=sbSn=[
+R5]nTo~g*ޗ%ۺVqU99KF烜ܿT1TzfN[؟{WUk$_Wz]}d1^L̟[NVvtpxR`Ҽ19xkvZcet^gJcL,&i[[k}YkjiZ~46ULL0=gt>L;$c3Yk"Be ;( .;
+L)}9Ϲ뺯߃`B^}ጝc:ѸC#*߂˪b*q9U~RjnC,zjٚ%ԜɁ쉴w:}H%0VLpz-;J3Z=d\ZRn,-"M-ֵzے#;s#KA) yMާܨd+X&rODh-N}m[>-0;ǚ\+^xs?y.E ^wT#rP,Cv9(RT|V5vG N/E3(%GZO'E:VϾѺ qVʾA/ <:@"ĕ|
+"f!
+\/uZeV5}S1]x϶ućM̏^1̽T/۪j#fB9=RM^U+Wv(={VCYCe7] NT ηdԦf@GIJɀt}{҄X~DPvCeMfGj>
+"^;{^ߗ Jvu>6kJn`"g;N6O(&:] tO?6
+
+؟rXpQB)"A;~f>D
+20%5Fmҙ3# Ǫ>hNᨕKXyU? beCKؒq]n- Qky;Uɗ6q/tm ɸGߌhv!DwU ɟO3VPEWeXل;qM_7A?'V[><3
+ăI H\2 ûVAayuRV˴h뙍%.YkODʈzWYsq/4􎢏K
+NL@y#w;_x%b4_ng~J(6)# B!f3ȧ]0ۃF4)_:wՙxG*̲<c:fF
+k{}5?Wxxr^ܪPDd m`~z##f-0/7ZҺ׼TDʀoJ^}_Yv)
+y7W8w3}"YaG6
+9xE0*ZKLkMZY=j%T|:$z-&>+XE^7OSȍOO[RQ,l@=!--fba6 o`Ҋa5Sʘ _ԢaPjY ? mJ8 lDGԘ҃7N:nŬf,׽u|",RZ퍚Y"f$եlvs)v'BaM*yu;v&TQ 1\E!9Yy>1k
+;b!&*<ieLT5:sTTy';d"#􎠖֜X{Y`4h$f6V !r{ j+uFsv{x*f]Ys``Fh8Mi}]wYoBZJcH IMa3!j%f\LTvg%b,a&v#d<❇_]EVcHZŴZm@9c3<<<)qweGC'lE@xԔћMԙw7e~<wdc1$%̌μ;xN:]Ko hܙotx(H:XȄ͸%Q Y}lay @<4pc 8slsJ~YpB
++U{iY(t!G\m\6ng{E IuA=6n#7@6J[Hz_!tE/r_)-]%NHb&= (n̷+<Y/<؁ T YwM@n@W7tԺc `-!X
+9y%m̾TUeUI3vum߽I@M:^.\[Huy+ 21q9aÛg5bsb}fMT㟜* ٠m,T¼[/b:SwOƣ Z{hM%62foDOiMX5!
+_A#VRlRk3" zntYHxCa=1IlX=yؗ㻑⮈?fsflvwd3I$5c\#lAWD {Q&ޤ 3p?s}:TWՓyᑣ
+r
+beXIko*Z݂;V WD 48\&6]֡s7Ch !6ᔓg2jKf7O³- 輓g5LE@Ik9^Eئ]S13eJjv̦} G@ODW'Cq yCw<#N$JZ8 /'S67P;\RtBSx(5p tD;&0:|rJeHhJhx'BIPJOXs,<<s[P/ ec`ɶ͠\>[}3.Y5\
+.0hտ̳- 5fX:_&hyq˽Hu ִ]NM 5 kJ~G.,\G@9dn9hῖ;5dVTgR7 Dؚ" a_(I/*q2M^%uˏj`z1d)Zp|D>W C3o&nvyddy-ޙvZqajYXWtLG611+O
+XBW]q)_}P'k&+-p|.ǚU0Y&h"
+lSu?P ϧb#/i}vXfڗ
+=k@mKm*pd9/NxXʦ%>ek
+E1-:pԷޓ
+n{|fT|wCjpJЯN82`C$Gc
+Wf_e?,ugۦ{VЯ\K`nqWn`ܰ261|et>03)E;[IA0
+
+lTc_aLW'̲#?_JZ<83Nש&⾉_wS_w1!i3cSƂ;Ve5<fBJJ}D-jG'XJ9WV dD0ѻZ*$Zw}19W}
+d[hy EI/Q"Fǧ`4wȔK2 Km>)2p
+&?ut|f8S;3My)kKڤ+n*,kfj&"(*VsGw~<|$^6aWj_#0`_ƊIYدDܛ;c E/1qeyQ)%KaᆎH乩ۆcv7KUeU'Q/sL졆GTwVxE6q{5V!T"yUL tG-sIzѯ2"蚂Qo+·7;Pmct‘}s4ؚqԞˎ}̦<i6m!#cVۋoh2kJwV, e'ܽ$B$=":Q}A
+nM{ībF]N_,v-
+8K4:e.<H >Æ9bYm1@v5 >qog/oe/6AXbO>YFi_sܗWW P6÷(. oPO4g
+:`ioh0zwPё*+lsuច;6`/] 9kmX+ۓ; Pt2P@0s
+zڍ,[r'KUzX&@iCO&ꋌ}I)j>)' # %)j ~0'(uIXUrjo# "@VBZw}m
+xA<3$ 4|r2K0!Q"`p]CʨtH8$9-!n[*úVG@jZ,y5J:35 \Sͪ%H89˥Be <W;
+Eg6)1O(>ԧIݝ-vܱ7{OD%`=!-o,r*y;`M侘吒2c2Je^n)Yſſa#뒦CyQэYNaz? pn`li (|/<_t8\#m itҙX=ģaFQ4.u}dekyxm1Ny;LeSծm˻*(;%#ܫ`7>u3&`[M&Z#44kGI 9n%z:@~_29E@O> 2BWE)k6] 0 &)`W:jFHYS@-8p9Cl%Lӡ@H[@.v!bCPdU{
+j_ΰƩ8W=5ef:ik 5ZA=[ЎMk'5躡!{Ji ~_r,ϐ=1*ū"Cgg0ϗayl:h<$,]?eVGfՓmz,Ӛ=;MɨkD(Ⱦ$-7. uR3nխzU;sqtHdSHGo0Z`–Q5)a3C(i(`ٚB?kw pq+@ȸ|`/e>ӭ@gĖYGّEu&ȄΒrLm3oQb\ZTt^m)Yu3Lxt1nLA um ;jhk$oko.j"zj͡E
+_T}Nj/򾂔@cw߱Ka_zُ/xǨoZ."WT-Y{WצڳGW1eu>FIM)cT&\<Υ-̂r+G?ݐc_j(zz,`qOM*;->4WR ݹCܟ o,(;&,ýſyg]6
+ucc~&pkzvfc&k =0p0vQuQO؆Bn/}vԔ]l?:;a{F9
+J͙
+N-dرW韁>] %ΒDc՝غ&A9\f!":toᎪ¾=cWw@'ƭ 'аdMs$U
+9jFYhZ|ٛ࿴5ޜInT=2xgsTm`k?{g W ^űGqϜBp9v0K.kKl͐LG?*|(>
+WEه/|.W.AnNiF̃%&ӭ71!^ ~WED$@
+lnlXXd7Eu ["f;^*kcrǫg=ՔMÀzY@y"Wzl⏇+tp5S",h췍c_k%#Oz_2ģ EWظύYڐq =KOQ*f(2Ws5P}Wa85O/)U`y`jlM(EC+a>uΜ9%NᡍM7KfZ]Ȁ'vXm%TϮJkHcwzfΥƟ*fyY2Ȭ9֖{;{y F zH;`/#foA}=I/k .]L*glI:ݣ kׇ )+i~7 i-Ӭryc=):ڒ0ͥަ $[WmrhFO*GΨ׊iOEp(FY؀CH>v.b$Vd*k`>lMs<
+ZUJݛiC. k(%>{}6f\ؐ6'n:=&m(ӈhEk#WgˏAmƍFPrS\_iz=M{nsmhFks5Ƹ 7QF6((. . . ! C`O4i}~ _xfUɌ,*b&)+!^6OT4$N%w^u{܅vj70 zgo"
+wXOGh]Grwǚk)O﷦W/F%)>3s;=AekᾸ*]/NtԔ5ķJ
+,W'h_<Ҏ71v%ꉶ*?0 3ʯːg|)e~ZؗX}O oG' ou=ϴRf{XGW#+AgSlLX@|֥M7IQO4AhܟD?ұj@Ovf]fק}EBXטU|_WC[Sg0avxˆ90i^2rae:6@8^2F ~KB+lwc>((N o/fYG ۿ+K (Q":,_3T|]=X|eBhPo^Tu􃕄CDݡNi(?rT7$88˫\qoٕWϒ4SE^ .AfO^|N-) 7zl,tWj)9Ʒ0-#
+޲0кcD|O
+)^t5,W?ڐjl^&C%ɺ
+9'L 
+[SʏYGc)ӯDFl"n{طfw*b[O +w$= H1-Ѱ1A#z?axմ /HEhXj=OMU)ơTX4}~y\V\_B %ֱ;ǫbmrIn%50q`!d 5Cw 2%$ǵEMvG+3 7E_>W0j곿"v2ҒTU6Ł޲X}6C+O9õPxuSƶx tޜԠk>1FЂJQe糸?v9sΞ;dL11$SMK*ދ`l"U X
+n"ߝeۣϘ_5هsFP{ wu檜{K/(iM͑s\DTwSc@χ4Tph>sr fO* n]8!EвTnN,vdj`{!N3m='<8p} 4.aY\ՉV酼KX@ic Џ,
+..7XM[mOboJoۇ!6{  !WQ3.1fᰣV&3%@{R3|Lx6X Q~Q2Jl{rVk^ocSۈ>l,z>\/
+DX?  !%sD.̢S]Sǎƻ*AJaMDgC2n{E ӧD<I`\αBQsn7ȭAW5> ;So%8fi@Twxm|
+n9ZrKNXFw]V)LΩnGubM<w$ .ʼ@/_5TZGu"8pLYy4؄ۢil*+/GȝI685'9j3"@)]A-I9<LE4$oAXEH'5tQs[(f3*F"t6f] G̦b{Vdz΂ƫxD<H1ʐ 41 yኁyٝ%oY95j!>pqf(bю7ŞUD꩚\ T&]MmܓyP{\N]9IʶDq
+V5@WMi0Ew,iJ]Pʭw9yH{y`մ+i/[`f̙1P5ķޞ)EsSwYS h-:RP)(E~g!H剪>P{_9ϨLU(
+b4i{{Ory?]Gy]Lۣ =:|Sfpk#t=Y5xΩ$k(Yv$-OOf8LJι 8rlpb{ S.!Zӂ;S`X:z4",}f}G&Ǽsbjɫ%qn 1!>xĎ _^b*Fo
+ Zn>=vU݄ai_/Bv9nٖʰNRN-ܥ"%chZ%O -SS= >ťe4\Yraޘ:aa6XđO\j+)9#ȧ' 39ϻDEƯwjg.ٱΡ-DDvBY?fiβר+b؋oFih  p?rPN]=aMNQ4ϠS?[ .(:b x1VT {6kUnU^y8skN okȉ11qg ԙN}@@Rrz=/`^,迯 /9x/}0쑡5'cgU0; 6Z;,J[qO<څx`m|ڛ)r,PAuIPY
+
+8@:UC=zl`?[$S1Y[JҥAxLD!8DNk$
+%I\xbX"]JVtmb*|*RGFI]o§7wU;q\$>1˫tΉjF`eRSKB$Hø yݩ */v!^|. Aڛb اsbDM>v #حqlNEϻ3 _G
+~=|x~06@uR疊gGP=.ڔv%3s{٩[sMJ2 в AwtI uYk:koGq"d h |ޮD \0X}:C}Q'M~#Ħ{&>ЋB͞سm%eѲrDh9
+{0TRy0E/k#]:G/@$io{VR*{WKv|Eqa-2+Xσ]5G )t<Rp?^_W;TwJz?&ngF/W]kdf)ϫe2@jrv& qj,3 WN foIV>cO.e綆d,M=L3K݀\n+\D|dU?&l
+j% ;\
+3"/RouT/uduYΉd'Ҧye䈰)EY3I$9(<[硝c<#7
+cV3m!jŞ߇9!Km%4Qk|&vBiJ߫'Ci蓅:E@TbB~[<v%LMuK} ч^Z9',57m
+]>0sU!Tڰhj;%W  maԷ9N_5B&(BkCk'&9{.ު> [zކVPꞔdRQL^ׂsݝ;3r[+uci~yw^-V\  b;f9[gCIᑁJRJNBBŝpq
+߹'PGp;ZJ[ǯi 뙭{K9_4l,-{O<Z$Сd"'\0-6Bh姆}m9G;~nA
+qNxkrO/77X;f[EZE
+lq*@&޵vG[K@#Bo96$$m!7I-D:dV {ފ}[ɋz䳤7OѷW$/LocǼ̨w2^>Tp~0?W;QWƎcfK
+<t})҃}?9.٭dL3růԼ.;S4@/sV04dSJؒawb>\ pe.vR\#)><PʼnޛrP֤AKs 43EC<130?-3snIR&hgrbGpǘ`&@0l5 ]
+ޥjaml2v]N,|eϊAz.өYj<:uwuLvpb) hhs_>ߚ|{<ڥ~^S9Ir]j }3k`OWq ԭf؋MqR-b,ԷȮqi>SlI(81344(eq˿zjy'koB??e 4ݬd}1rc$1}5 _ľ7J!ok"a΁nm UFzKCCIRk<~c?2'\Z>Σz3Z:d]PZn馜E@ v"媖_[(}yhhGN mH3ݩoVǂVAJv Z+,}fl8)գA;pS/#AZ:@SOo+ vc߬GiOQ^d'_B$eGD?nze:<2 q٘G. $gADq2v)&X<r*XziU)Օ\ˋ%aۙQT02#(kg/:/aJ;{`,p*|`vZ;K}UQݘ+JZV8=%5k{r0IH؛@%*1;JCixAG1cnɘSX]X*%ףL&?ӡOV}@ƛAr%/5xV_ `ؖ`@iksCUj!MܔZԮV2ݸQ*
+`d|CݎG翰RR`au _azfіz(ik ulp.aN2uV˫)F).罹-_wvWx.6+ *JP! BzPzz FBIH,S;{yϣQbO<jђ++“~
+۾#^.).C= 6J\GS}G4mUd/qó$%oE eys)3@шaTYZr4(- )9{zVc(El >k(kȡC$= [zl6~MkJ aCVǩENIXsi]7B6?6IK7YMu
+|*!7t?bM఺%o&a;M($@2
+^3DȌhUBP1 No}\ZqNX|{.Ubl"Al5jģ|,NSko]TӨ1Wӭ;ܾOP ;6&*$d?6o!oziӑF|76"lj^clK-j
+fWN1 J.ib憂_tE1^Ҡ8(.v3
+LlRl)IEӸ\RZ Z!1dP22=Lkr &8{j.{GS%ưg ؟y|^-fl.!v↽y=؜:Bu'57&rmVkbnDū㵷Ol˭ra2AJ\ <Ux!L3Ays, Oϒ e;Q[@?RCj2;8&␈rLaSՙIv4>aw}W xsGwnhy*Oq;K/>СA #;/'?X9-T/jnm3*?XK!,)8C\bA *1nXbBVSCAc{ׂLbC;; ")~;8UwkjuW3́]j9܅JY=s#nyރ]##VF1{"l鰰 kn9aX*jCzBg=GʟV}в뷕l31
+0Ldv)?sE';i7p᜸2%qQN,kNGbSa_<xd[@ZQ_0 8Af !yjį\+iu
+b{]5MG<^C̨Yt Jѳ7Axţ"(jD&0|*
+v%+yJ}RvnJX=\4 jӧV=L
+~*h5[Gl6ò3T:d9fO]*z@Ӎ}_|Oٽ%:*ķkvFϵ(8yLĮ㋯O|FCxG>H_K/9~v}DP.oD*&1fP0|NF Pjk
+(4
+Q$U
+ >@=+|i*nM/+[9ؕv[j` Gh/> /s{aX
+y[F%*7u/Z^
+ʇAF/o~əKʻLn$bFg)KRI3*f Y?Zq7qqG43fbI3v4qƍ/0D` d1!Vc]IZ[]@ @cIgR_}YtwzQ
+%`-qՔz&k(||=OKjqV.8+17^@uc\Ww(DqZy/8S{!Y a kw%cqv2[QݚɄEP_<-NnR،ㄧ| Ixn1d"Xdiqv
+ZSƦq\sN˰S1u$.zyg7Lklx%JJOYpX1|)]OHrW^VX 6Z 5jކx03{\Rދx{kA
+ [vX -}UIV]nU SM^`Vg= ^N.1< ̕C/$aIJTl+[y@}2:S`IH'0Njٗ `D̂`yCQ,Jΰ%%6gpgy.~.VoB*d1M]wE\]Ydڪq62jwBGU}e9̤4+{>FB|_Jn!髢.cu_@~AJٲG* 3aDJkuQ\ ܛ;vhQB.{$ qVW}ZC5]K&7KQ! <P .lb;$-bBƒi.a3a#0$` +$Ma=H*{isI++bz]0-fz
+SGt堆W4K8WI;el?_{p)hjB*QY*
+QyjX y C6\[2qn`Zq ]wE^;_:$G̪n$7y%HG.z6O&Gox+㴕&n/~a\C6@4;R@*6Jbsn$l4Яy.E[L%:/NߝUϝd?wqԾpHt3v3Q: &]GύL{`ڊ.BVC>BC&]rTY]ŸM:8X_W<3̡y YKyq[54;]s(L)VBUYB(_33"KI=:_/Q lFTlZ </v\n|)2/1"#$09hznJU$m ҙ}` 6x9AC=oOow #'~K#
+{C ?tq) /o  Ӈ~љl? Blf{cr3+RtE')G=Wc3|_ׯ^?9HʼM[+]<K߷8mm,/[J{Vݦ;ѳsd%]CC:V*C&F:bM|űh:Vu4?/w'7KlJy8n4=i]eY4VXUzuYi^ܞrpAum-#|'-2sz4KNaBVKpJ0NRODJkW;Vewh'¥ ӊߍSb9gCxx4Et-הfsb6(I@9O{4= áF{!p,sM6wډ$BH-0r=d!!:,d@ .
+Bf\TOPk\8֩Vxe̻C)g:OZTzn$o! E?r%Q(NmÖ8Q ˇf|rh t۪۫)evf>֬:<u1tAYȅs<O>{h lct4*F2R>z0)Lr(Q!_WF<.Ŵ1,i}ds6o/Qd6#(BȆ4‚ȸZCwf
+d_qc쭤 G2g0{Aꢋ:pa؊r"2/j(Xwj)\gIoK{dB5x~eC _~
+29 E7hKy -$!$ bArceTV(g?jko ve3GY@%
+$G%tiB UHU2 %dC?ak吰8< %#CrXa kDܻ*/܋U]8jQƿ{g~"'NN;DVR.akU ȫJ*[@N3WF/eo~ҜzEN I ϲGl,*V8Aȡ8߇qHVӣ ؁v<RӸkZ׺n˦\59N؈h f D'!o3z@"$"z
+û- ,c])λ \5i-IߖY58;0 1wr<>
+I/`jU$ы^mL5z0;,RK7ND
+{B{7J׋=`s\i˹{Zs@ɃGݪTL 泄~WT)ʤpgu\Ef-+Xc+.r:Sy9Wnr<ۜS`4YcJ}T„AmlE8XDC-A bo@оo%VaƐk}!/B-˕③
+R顪͉es/X Jc
+K&e@Lr94G+emBsZЈQw.5u
+/R R>*HGf lYi+>v˚ޒ2~C#e[$JhG!<WLROyL=T GϜGgÂ` B.2hZ2SlP˅iޕL>|1I^Gl| {xm_PRG8W]c6BϫjSA
+A|5f(I Iuظ*O j\k<u<؄fl@^R<b'>ֲà1ZB~[Gt:eXhIaS"WkQk۔*$*Ce'(*X3qOOd#!KKqoTӼ0^)K*Lp7FN^l=ךsl$a (KzDHb5v 2_n=9e74p-V_o v5ا]
+Js&<yG^["CnĀlX;(g߶HX
+z^Wo7jjA"XÛ^A 8dasWKP둩vdr$#wgw2J\K8Ue?kQh-P+WT 8^刦@7WJ"XCH
+݋%yc=.J}b{m:c%[N,&̔\mVj<N!qe:Bzk~Q*
+mh9'J (mwb]K)`WjìB0.0Rk٩xT_/s
+$7mB̞X.O:S.IG@ϭE4ʰϧr8x`jS֑I)%mBMM1YoI25Йw]ޙ7@7>16PRfܼ尜pҰV]rȆ{ԣWBVEKc[=ꍀFSR޿Q\7
+:{i{h7&oO31_3
+EP%4k1=r4RvX) 2=hU& %)yBzis9^>s9,؇ɧgR꺟v9Dܣb`o'i)$L9 Q!z/{rmL߳_ ̪b%d€l% W()CZLMs̗VjX>&
+Ł h-~%|bbNeh[c _x6*m@V"͂l;zwfKybZoT%S]dW15 13RW[nZB[vg{f5'>s+!mj"cɰaku0Ŀ)@tبvvŶjoJXsdlxpTvXpR6686!~w.ܜɴC~NѠ{`3;c,<u)W채Sg[h)KaŇҔϢ.sO͂8lȅoz5UzlOB
+~KSR3`z!'
+}2DGu]#C zs]:\-g{S GRB΅ӽEPtpg1_;>bg悀y9e7 Vwθ3(F%jOɀ.>..Q0t!266٘sn]_JZ}^U{h{LAIi!):(#{-VZ=Oc%is`rjvmO37gm/_)=QEǯզqUäPpHD3:pU'y'MjR{Y)u\ JŞeԃC4C"dB!%ƻmQ9gG|OHA3^]?\GT%OD}S낫<'֦uĚ8Pt\9&6.d#ڜTi3Ͼ6T7#}9:mn>ta+3kC'9yJ7 "8.I)*|EXIa5u1v R:tiLkȈXQ1Dhؘa /\
+o2,
+COS}vrq)7ŴxpDfRӉ_Qc*rDхsݡf֔Q&&*@i79} l ??R+[|BE
+ r
+g/iXbu _C SrNw,
+2qIU^:D4{xutӭ:sMaitj"ɐg<Nǧӏ,tx$ jq(nW|s)'7d,WU:v>q#J<(*ł7Ŏz?uǔw,
+|SN(IrTw $V&€p@=)AGW?
+7YT3:P~j#2TIL.ˇ܆+gW_Bṅܷy_~#c=9Hl:PzJGTCiJΡ2oKzO5siڬѦUdT%/
+(
+(,
+[Xin,J 2B(ₘμ<U.ɻ%9zƉxSm "wM}%d:0HE%.ay"_8}1u
+#-s}kvmtlu0?P0v &2Rp}iĥm+// 'ZFYm]cDGC[eᮩڼη3 err>5)IzX݀CY[cT9Tv*=?R1[LyO;jm ̩[EYj"PB}T>?]cTk<_r첚D@Q{
+]s)~#7w>|U@.ܖc!h6hiW
+!'[ۢD =p`WN9W εS ).$mN9VCT ueoIz2,6ԂX'/7F[b΍# !1zޛzwv!I}~+E-)'Ab`6dHqWDiWW#l QON6豀 :[Rk;u ~О{!>Q@a զaTf]kͼ&Me} 8!KٖR]$s)8сv K?Z{2L˱`?L|Qa[q~HQZS`P^[>مcH}G@+?
+ʞ~k縘/bd-{⒖FMP.Mrn(@Ӏ/VguJ <pzkz"JVxT#M]]xl̹/ "]^{fT7N9%$
+fUTi˻^aS^%wjOj, M7<`u{뺮<ԙ7v+h8%攀q``m9};AJxV<wlD9XPCGL_/P!oK{<W=^/ " &}[io=]j^Mwƅ[SU/w?v}KINaK̴KIIX) e .߁9O!W"_v\EK-m7vXu0=d4ӒqCٜq.Jڟ4C<Y>d-N)*Ĥ{BxȡhS{ew{G;Dȶ?GJߚMdh/ rg2ZaAG؀=P47ᚪj:8&se
+sY"7&LV#
+IfD qڨ觓d6
+ԹvRe/gޣfEh_ ՍX~ݝTӎy2)@h?@ D r:S<ەUhLY,9pt9i0ۗ2S2`j'q6Ay:ͅuoA"(-IC]^
+쇆Y&JbכOSc/y>St&/ԋsG2pƳ򜣉CYEm c%0ik(vSz&?x toCt]hnlJPh+3Ia>
+Kz'{bEa#ud;ʇG
+#$D#BNHeUڻ,O5-)."= >᧩cSqW5c?)؛nſ:"!Ϗwe{︶J%gs񭮭FY6
+T7xY&h1ܼ|$
+"s9JP2SX`WY=y~+Go|.^tX `+soTS%/닼Su8.b9Ɏ$?Ї.8X_`_qvAxHs[kq8XF| h(FS|مyҔopu,}W&߸}ֻ0S?+x G,bfKo񵶖?ΌVe&F166JQ#-3 X+ l'E ^)jS^g"@Φ QmrH?j؇R D2lY-Ǻ(}{s.}Ay$o@y+XօfE%~.5Vթ ,'enT1(
+&Q¨Sv0b|U󩷺w厅
+y_յT<rF^:h'LpSrALiN5|KL 8(Wc,ʲxC/d
+1__x(+dzx!vEEhZh6"Uhw%?RpOWD9Sݏ*!n^iSgj !n`;urg'd tn"i^L 7Ivi6Cng~[kiαS%p\H>яX
+MyC+ _(Y,RnLx0UV[Z
+fy*dXuq8 ff ЁL&5" }bYuCcD8(0.hG
+HM[9Ow XDʾv><4юrLʘcr5oe/1!¬GF{S{Lw }CX}| De7/;ѽ/Y7mn6l~ ]zѣ߀icXfغ 3lj| :eZT{+oçfR[P .\y.-"V֥W!=zaݑ f>8Fς[?7hΥ1L[ WUg|=!M&q63{>!|M׆L` 68%V6gv71s_(tDp%:AG[Nu6}m(Zo679ՅK>w7#ݚ+s&A{[m c_ :pYʾmbBH"<hMs(DO-q$b>F|ǵ
+BNiAI8N62h"ϛ9z:g>r3Et4r M:㱢pFTc4(A;bF45a~1lƀsv ^qjC hg;B;tHԭU2'1[ȧ$^1bH\37>lF/P'f.zم 'ey Rwd z휸y˃®ֺdž0m3"&jo{yd9u؉p_l M-Hѥ33Z2ڼVCrh}ZM1 )i5V(i3bcl`8"T:8_5VY?nFZl* {?/|^}a%HWSL0bUcC:~vN$Q
+$*υ+cj|?\Q4>8p&Us RuqӺLx>9ulN]veȻ"VҢ 熌"]g<չPSZTDlա/dhZ0&
+CGe
+_"3Ȋ;u1bֽl<
+Z
+\D?C#N"O^\ĕ;BnNӇ}NBȏ}2s+U#F-rMx}Y 49t U}!_3$S<^Fh]>n[QE# :πKkH?LF@*łLwJ*8%`S/
+AbKRICb%4;Vk}Cr,ۨW $I~LY7V)x
+>DMzܟAӑt+@<F)VP80W} f*blu5EG30ޟer&&N`*<xR@,2!_wHc?{>6(Jʅ4ף\ww: -S ~6OrHӛe98H@ }le7Яr#(Vz+?D>srxO`a
+.S
+ze2ÓIl1mP&<#!$:0fI'@GٟCV2<%rS19i{ϑv:X9Qm BҠBrv9yW/LgpJy{H |$mW:)1g'؈C?62#xHvA jEԆ
+D$:p]/o^n7Qi,$[sʑC ܀Vt&-Jm$x:"%hBi'*o
+̺ɨ{+u0"#\Z3j>c_xar@tU(\]I$;biX!Fp'7˒\Z 4cݺV)H 3SBшhsGv"ĥ!3'"AA zBq/0(IGD|)0M(e6G@Q䋐Ǽ{
+FF
+hG)B;a<<>aIs"9N |j{,.P޺&i?]]b(QvD-գlNhők>XLJI!q1ٺ*N9ry'2gyɺa]:t{sadvFo+]'jyw+ n~[s='C>g a[V< j5(e僚0(W;[ />t!{ مD'iΪ( `,'#e
+(2
+сp .vlb|M1YTbV~QIʶn/c`lA.1M.\+Qٺ~Dh1=lB
+Od;Jj+<S~&;Пo<ix<nMtf̢4xm<rvS(:Eyv8U3(3ra6@k3/ u%'uf具BXE
+Tm|݆fc@qUh_U
+07U
+\'o?׆kJhXSاuePsSlch驇!l%XAvBhQCjB,G[8<.y ֈiGe'B`tng h}z&ĮH]ss *nfAǔ<,n]>&VN1=yAh@u>ٙݘE0;U$Ό.|6bW=7|{ill+ˡ?@԰
+%S
+*m1mV0FH@aO
+M&. &žNPOB;a rt/5F!' ?BRC~o !rP΁+X*@14)!<D=Cpz\hnIG0H^@ߜ5gk?(k`)@%g(Nub7%9@@T I>"}Ű[Uir뼩0Zr!W
+J?'%0AeX\Uw
+
+CGaóC1i-`B^JKEl |t 9k#ΑrZvgI൉`f9eȸhJ
+'{NVna9j`ӞN VC5﷽<Tj΁M >u!VMb>ДN]W14NY-˪T5,K9t-#snkOd-_*NA
+Dm4*as ],#5е=aGre( :E[[L^ʾf@]}w?Mʞ#`>\dF:Nz%  In9D\>tm %KVET
+%
+6Y1!!u|n\|'SiP2'nIL/(iugG|fٓN(Ҽ=t@5U=umplFz7 LY
+Y$*ȐᎆY/8FueV _l|{1b"]z=EU5*9c`YL<]:4*ya
+!O5O-tn;ܬ^BǂČcS:<!n@#Mvz
+cF u?|;9qGHmx"S،ثAbA}I]u 6RS>|6 PN]F0'fqLS:`.\ut;ÑDL_1,
+cCjPhȣbhmoTRp0vn1cXMvd
+,YLACaxX .jzDНadK&Q}E-K9J79l-VR#4edL?<AK's4Σ*GqZtD"Ǘs04{r}ar]i\ޛ/cxg[Ja2dSC͓=s9I09f5*6%pu$!?eɭ< 󰦖}ޖs PdeFMD1X!׎$JddUJ@w)h3ѪTA2pu։]XevL0S]y:݇9T޺+tv^hޝ#3#<9 4nRAYCdq0{ [e0BJ,;hd-h21WG5+yKÂ ;i )DcS/GK
+s1ϏQ8uʝm !ό k~U5jϯ `WCuӞ@% {.K0WL ℬO5nUL_iR**ς8XL ,l2wb"9u;Ac-ur[E F`g䳊PLd|\
+WY9dqOkP,mx[bO1nιܻͥqW{_|x￘kؓU>vPs
+;f73!۳%sqZO˯}zr
+CC?|Zx*BpJ65f*p~vF8 _.Aӯo
+}
+VML.ۦiCb dB1:uE1B q FO#܏vᢩ#ˋx "wSPIm7FWJ&Mou
+Ǐ^9[@s"q&ndzXAded<}F07ZD
+p2/'&`y5 I ]}tR5a_Rhs;$ ̴GG悫)
+^(ouq}T{7B)
+u܂ < .%.aʙ>v6uN7-ڐ,Wt]Ҁ7d-/#daE{paa<AE \8-5Jޱdݘ&$b*[ ԓ 167-.#w 6Ai&6\
+D`
+#lrb`\Oa=s̾apxڪ2Xeui52TQ+(vPԩHҥ}
+9" cy,UUcOqJ-Wa1&c[WV,o-U<<ۏUŏNr݀0,݋6T݊^M6j[APcA\e]]I4 >H:EH0 TȇiՏp|lP]Lb
+O]@qPQγ]BHJa@)>9cRV0=F@^p_PBE}n
+ט(BUMO:?uwgTqJâ4\U|!i9MyN XG4nu<!. ✃zzĶ:nCNsN]|*y^I ?G{D^Kj_wJqKwCnw
+=rV[҆4JR5I0BNן=udl)yd !ءT$ Uβ\mWP5h=AȠYk"o0_
+JZO+*$䳙W )!|ߛn&voʰRU[&PGn)Y׌0y)F6GP1hMTn߀>/Rq6K㑺z 8Q1WjRͽ۟ޘ(16a,"tDO 
+\Ui7 N{OF: vq"L ڠ
+9*SB"y ۈ.Jihs[pqr-4oyt
+*22׵,s˭:D\1"Af4ee sf <!IVϣca2F:RYvqrX q) w% 2PZ~T\εI9ez!Žb\
+;#AJh$fn[;ᅲ't2MFd$"e[@+1b؎'t=~Q(dviË2!UuF
+@ҽ1朦|a`ѯka3ULJv#":dCi F0 p'H΍ wg`H!=ΝNlqP<4&~o75AbA GL\Xㄔa 35dё>ŵGtRWi*/
+5/dr%X)$:teu[y2D<$q)PxGOW3QP)FuxGޕC1i ^|Lޤ{,x!*Y5VGPwIq[' f8ijS2{Cu$ƾn{sWԦY)ruW芹]ߺuH% IYKTN3SNl,ApqHmCvqwOkV=gOv3^vAaH-"T/Yy*r26ݬ:;<4,h M8I~4/$WQ<[h[3vڊp-t2rI+m% K6O]]f;t*}HֻAx<Fl/d Q}KFq9bÆ$(9]9 ޳L.A`SKC⊀'[- *R.FA
+EKl! $bUSBa;qGeJ!͚kK1c-Ql|mC8%Vv6FiP XGYґHi]G#Z1Z"c @ .T2 HR'J@7H(ܘح;9]fkIs,:FL$MQmofRfn1lH`h`ujMV <1y!WԑC#p =G)SX[U'K|ϽbqQqAZ#/.8f ^s!djQ3窈z0{Ԇe֌I} APDa(b>mw Hқ5Ci(
+&l0V}C{UR; P΁gŞ~㋟CyL/Tl}(? QR 3Ã[`k(蓊gι"(ց6w ٗpqA
+\t<vٔذ'40up#W0*p`|] aBz75yMH ؑc
+ y-H6릧;ij6ϔ:TADk2DvF lZr !9ARPV`&]J'Kv%%7xBt8V&dbxk;^(!Yh(8(PX{fp~\IFF3j.E,鷫BbJ'<)M8
+OB01 崴|'TfXQWfqMU gTN!3fY:v-[Vԍi<nҔI
+2Ti_q77E8oh„ )3gT{#W8zP1P:c=45VIp(=l_ND(hSD!Йb. L&.dAvsρTY&+Tbd /ECK}V#ž4k8%t9)";e-|3g
+\5 pMDL
+!7^XWH0Āb9:&eo@L';&^{ fVneqgJmp /qΔ$Nwj/UkxK"(= ֑:"uJh)=L~e])t$9d/iW_pH
+Jk ~rv_aNCic؊7Z? 8x#1EְkA܌cĂ3S?R vEG NJz*Gw0;*)P=nu)?52@P
+0;iW(`%$N[$t+V 艴) ,I(L2Na@6oCEv[wg6e|B;pkN'
+nadY$ȁȤP"&dt=*[zLg'%*,(2Z䅛FZ>aZo--]_Iž=+ Hq eT[Nhn@N s<%fR8hPvoOvXYI<~3}A3yL&L'}!:̀J z19%ihy(iR{17=rc-u\_fT(cփK?xى]BI Hs6'՜IX7%0JS.RI;n%`u"ކ`2sYBi}M878٫Lm=*aV~Jbo8ՏmhfqcʒY  vl'NtBhV#N5/)QTUB!l))bTǢ'Jh N\7\NIGrv>3D8QAEJ@3}`4̶K
+hߜw 6^kk&8 ۊc-;3Q"Z|p:[yEBV7.֥&FV LbSC8
+!Zu磴vpm+l)PK@t ZAֵ:l!3bHFb7/éX_
+I 1(dz|LkEQDhd6Z /E"w :#|e<6Dd( =B}mUR@t_f<d/ ڝePc0B
+{g_^%|7Fς]^/"ǥyD]"In?|몁Wl#hQ$JN􄋊~D<1ظ"_^d@'.6}//LR0fyJ8\yV\ۧd%SP?4OKW%4mDOPߞ~>/I, %vF";i]:</^$?* /ۨzJ닶B.Xr&zLu`V‹xZwIYܤ黤HHB]1%V #z@|d} H`6#} 2ɎWX4S>!ݱwL@/`ۣX|
+
+
+y;~("(#>*I IKi%*)XipGLǯMĴd-"GVl8sHX/vѵmkYx
+OK8pQVo`"+1¤f?טw%p~BgFߊ.POĭs!oq}F%H[y12a< ZO3NLrD"b/cvBNw~ (n
+$~bS_y\h,`p6铐Xp guA"3#h"pwyhzA; USҷSCExԁNs$҉0F|ɞ$c
+|ooa03'[SB";r—"NF,?zL ={
+UFJ^9LbT\oȭO  Nsɫty5*ǁI* t
+S]~".rq
+iłF, ϸmfʮkE-'kEJ Ű 0l-0@:Iǧ8$>5
+HAr O;UEE@._ymNJV2bOYh֛bf=D5UF[ZUG'{bt [i 9* 1.fCJݐR gIuALkRz uU+jF1d]k}/*mAԭm DtQěv]73G<n^k`ܚ״((nX(gJg!iZ6&kIVX.R[k]J][ @.uL%H
+V B 󌩒ɯ*ckEuZ߇@!m\<aA(fG"yY̌aP.>pXF[]7*8dSOUWh&&ROHDR;2ל3ĮF1Իt!W=y/!cotNIA`?Uơ H6 .NOvw/iC}JCKW SRO3c5 eJ6j3MAA6wY/<r>PK4h & :I'xFӾhJA%Wrx#uV~{\:dBZ4MGM^@( hx Be@wshx;ІqAhU[Q1ZPҺAOzPY=TCKGoЦ!RV!藸M^FXQĸ #h-ϢB1d>tvO)v*FkRqߓJ;BClU\ Wܵ=/Jq\.9co_]^<-W(KQfVvw eA)ρ4%  DZ[QM﯈͉Λ`cx
+co#Gx1MC_M{aJ6c
+^]FRR&@2C)&n T<%Dls:Q5MTI1aX}G|ÝρUQ!οCI(A`9mjd-:hϩUTdFd!ݝã[ώ`#iP;EY`eNG<|1t;`31 [K7ovt}V5^e`Ph3R
+5)-1($rچjF/!O=AAFֶ0٬tAA{T#I`Da2Ǯ#W
+`ޅ\q$oUeP9PC(%%lٷ&\0* ĤWE]B99CO"m1-#>Y)v(,[K1&W(Sj
+Z3-m9hb7Ț6X 4@*(HÜƊ"E[&\5JMM+s˧]f"[; /w\ klQ@y`NOdI
+x[vUgsJ%KsC JEw ?w<"7es
+t%dA f oC!hq?<ey_qon[1n0!جAߚ*2Hkqht!cIi7tB@hyqA-S?:=فU$6a>q?8Xu ଂMF
+3oHM0'!@L70oЊ4<]˫ , hpBs xuՠ(YDmk~:2{OAYO_Fe7 vcSe=}AVt:fyC+yTDT$"*X]k#-Ewp {(/.r34ק8w"gq6A==@~ۨ'"E+is(万uЯ8c;; !' q(+ B/WgxO/Mt"R'LH}S݁w~~ϧcgB UIy\ndK 흼c|v
+tֿ6Jlu)yZ5 ) XbᕹnZRsT^[ f[$f )ːn6&9Wy
+mX ӡz ܘȻ&T|DuV&CŬNZs ZjAd6DX-BeTL쎩
+*9]xW }Ӄw@YVp΂;Ut
++y:H 
+c%^<ƯceRT'^At0gT9}#$J^?lL%@g-BnkCn5jBˍ b
+a SȌa A܃'1||-f8—4~N )s6\᚛Xg%(>T>Nׂ@_ܮbWoZ|ϏH+0Nl%i
+N@$%v! dcAGi͟1
+m#̲2X(d4i/@cTN
+;d&A AS6<h.v|aY`؁;r8olGsއ9CH^yP`@M)_?II;!Ԩ1s 叡L=!$iyq f7puBqف#Y,n+e00CH0X"Rp>I^saXmЁGe%vqhTv&ėc̸8-B!t(MT V"sS4t;1/5IA*̰ almnJ2}-)@ Q
+8NG?? }#폒(
+ްJp(KJ=a&BEj~BB{N({-Olj#4tdҙVB7M&h
+Y}NFnYz+30\pIeE
+.,geVu**Bb:MW0Ŧj)8+1hs|+hW-hWfBxZbWfZ% 23)F6nge±6]^$PnMBؘxm9gđ1 rf|fQ/376lI(ܵF *N: Z)4ڼ ̨6ހ4uetSP˜{I8P캍.Ɗ˼D Sn3yfe>Y>h1/ |9e2B/lUp!B1& RS*`Dm7 V"E(O3/]eъO`/`pRnQvs8Ĵ,D8aOΤS3Kq~S[91)†36;*hnɃ4C%=N}=bVWyEԨwzހ'WL{ELºIxeIrLczA8B&_-O$$OB|:g~Z!n!eĦ.)6*40h mf
+SyNx ƜZ jo琛fJ!1(\rkCN? :4Mb>L&䮰R*ˢwzyѻ9
+y塡_B*91VI[W؅roT
+ íԅRFuqrZk
+XGrXSFsR~"Y [ ep%?7ՋE gTҐB
+W5exH.8qWfDʺIAE5WEF!*"hu0ym0UH<HQ:8R~X Z4=}
+#"Bď߂4"6
+q-ۅJtC4lC7zl# GcedKPٵ8lAvcv2 a|VPtOoߙ_ @X;AԖv $4 ttC1OV
+ۈչ
+Ek[Զ7ox.%p6Y1apxY z~ xk@?s .cML@UF2êsWNAՏF6CKajӕ2Uf$`ʦ~^/^=z49Tm T{}o~= :Wmܫs@ć/;S s(fp޿A$yR&nvɔTΫ0L'(kuq"dxC8%zcYN/! f9~<qCCϻW Vf5B>,OID2X$siոUYXSW"OsHƷn4έK5/} bxmeC@/S~z:_ySkafHy} |HwWTav7v`
+qAjLCb<c1 ~$j3XlEdtiق`v τ3Įb嶮~zcq@;bbyux
+-ζGdJX^b>л .j Zv0 ![(`-\c0AW`+ XtQlH`n(e#Bgb&aA aޘ^%7L-g3>?/xyh7tv2KC/F={ 'Np Bd>h^\P֝Kl*GN 3_"QWf;9GZZPL'_N1X{ 9 xrvsR `h/ ^^#oWqд~eV^(`T
+"RHZ=CB<sם4sr bsQz8EaoVOa '+1Y]_[>@B{m `\CpHUB&a|
+%aՖ2jg$y3tN*7ۆ́6GD>JBYnM !a!3Mn
+goM8|uG|B(5]=; ?gܗ7-+X! ސVw&}7b?l %ZdL<gZI7$NF<6?C8/;+xZh9<l<H-cʳMdf!^$ tuc RA.iw)C..n/CQLX-8P0ǸԪ29tNTX24hM'_KJ,xxo;9[zm721E# @fdŒ4mTl6`b&26I;f8u榄f2E1bA_ZQ,s5^h}ڈkTsCf4e[K%ƺ2cѷ|\jdҏ <<eB ьgge6u-ׁ||Hˌ:!-<9#PvLL
+=617V1QW? 07ðRGJz6dVLؿPY: 5G|B <?$Y,2L^: HnjYn1K>S }A]Zn`+9n_\g>'Ӄl^U#Ns(rp3iyT6y4yEO;== x;T/hwʉ/qczuS3kS#V\5Ҕ|+?u40L^y4#^4ӛdnڤ $
+{:d/ 8}sAec|di}.~aHRFO3:RgY.}z:ߋ"õ;Em1/Metϡ.Z ?bPKȩ̋W!-АLS:En9RWj^"ٴPWC?\PL</ٗQe"&F"㲞73?X<,k® f)O Ôr^nA 5?6w#W(a֦%SOܩ!ψ^ڠ3|K>6I~ "7Z6..NgC{rlw^.>i|۠mwMNs֔dNW&ӆ79S\U&
+_6ɒ#Y CFYqnf
+Ȏ֍}<Q1as0 ƣdC(xgUlq<Fb$(9M\0RH4a'7qS9~ot*IVGHht;-" Xf Q UE֮:X-1%?1TdPWz80I׺te#q@$ZkhJ$xkBlPm&>W/!tPT`(D.z.$Dg9ӣ̊|hd
+׋95O't V?}_X^$=8m1F`EBT0'[/OQv,9O 8j * 0b\4mB y*ʄej'jJ=Gl# ,fLj.)ռ\+D[MNX$gc<Ya/O xW@tˇBת0xUd29 #&[OgVg맨3^Gi&e-' L
+QLG+;-o}>I v}G(LoTQA8k=ϡ`;䢒_/ )!+znK>%q{1PPzxs2L# Ac2XsSp#_S{a&]D .US
+a:چ-]a4}5
+jڤJ$K!D%"F= 18p.3}!<:fLy,d}9YIbFG/Y(E+D}fAQTrQ AhpQݶ`E'bgɠĜkҶ}Vlն ;Q;:l~7f\1[cC|
+wH/!@9aE=P֊9U"&*)aݤ8)]y"?GpIlzp
+c*Z ʍGKB{ŠAs*t1%زV5 tv+yg[ ~Jt4&;P|/8ϲC'oTz@1ڟ΁J/FNjq(OwU8=u<kV-h($Zk>_GPf
+҉-UfJ!,+GHvt
+SU AR:fI 
++skl@QXlΔ/S1˖bTB%16
+ׄ"w&x{:Sq
+"cC/gxA*6֕SM{0^w|8F<8`? -(+1λsKCNf—2U~6~8ᴁ *ܱIwtHaESysưPO61)@v/= &o?xԡ3yC tuYñҭGx9",uEs6ڧ寻IJyl[GQK*MGS&1{ PgH
+%©]OϬ—"S9qԝz 7.,↨锔WAN!l>OA<@rANka^|Ddž$)3A/<=4-z̽MoqSӷAmklUo#ѲZ<$b!(ᜭ*$ξ0y
+FxZ.4loxV5T:B
+s?uA,J]c\3q |>kmު￝/I쿊ǣpCEHN~"-Q<
+J\Sgۙ죐P)@R%q˒jܪ6m]g[VؼGħBҽ3^mQviwG!51#|.|p0u +C/`׫BClHV>:<De֖ XO;P[ 8"@:Z|/wʺʹwA˸J+:еF^`836o Jr}%<>䍡>~0a ]?/E(*-~B1+`BoNGLbY B
+u ef<tºH!x] -֠]PjYg<hCsRDI'q
+DN6; Ẻ5dwJ l6ZvD/GIz.N
+MÕ/奈\L>a2嬍E 9C$\J u\պ,4dc
+HdR":3MҳO׈! X,=y0YON8hH֟0;=ߖsR2Ix3OJ+ߥbeSq
++s&m\HIWFp-f}D+˲R28c({@E3䠴bD Jf]8&"'5@G$nWhn3,%RyƺgY񏔖.OH()X9?2\K{R>SĪ5.LW
+ŶQ,۝IqPzY%a$m(e[ȸl`"1nD!epm{*&|)1$
+UZY(
+Rs}1蛘7GC(
+A)QҠ:tq tMtṷ~Umo1=_6#9 Q]ޖ0/X?賵*QJ{t/>|'Xcty,
+n d6)"q摶_%%4aS+04Ƒt!tQTVѲW3h)@X1=1C3MAۣC0;qb Da5%Џ'1R i٨?Cp1H E
+&/^rdď%NQ;THu
+]MfJLn^wDxXKiLIqdZ~"3{h~&A%dq Œ>ê13w;H7 \(K#k G'Ulnm8^;C߽A PٱAb0n"߼q+My("Ys2հc\fZͽ ^ya9j'=j>M"v<;4(-o6AWGg&G IC't9yJtLz8$Э;;x1~ uS+9/Eg@@AMtiL=LQiz,AWwyD&6yXm׋|mgҏaЀq`WK $s i
+r>%V@*BLZo?u0YH_\۟VKQHt\|2IF
+=`It
+֐Z3j׹@_#D^x0n5.
+M;ΐh"{tЦ׃w TӶCHGryE\ ۫5=R]\Ľrn^
+d ܌dYPc/^mcr<Uf"sk4MigNX%n`3n#0m+E}Q|D9lr[緵Ϥ#z
+wF%Ao ĚѴ0\lr6TrHkY}!o!D
+Ǫ")HUBzݧQOΚz[: NK !tL yY1i; IO?)f|\
+nwx;YU {$g,$g;LCp\Zֻv
+.r};f8PAV @D[',2?ȬSJfߨR,U'I}& ~ d;$N<uͷ;DbpduaatF`3ؕC5*{{0.3H 2E"OdQwRLH}< 5mg.8K[̧e<N$.i X =y8CB
+j5!(b ԽqV,]G=aBpD2o;ԢZ+mUd>O/H![0087l#TUDSlF"UqLx,(*HC2wd  f#g|ELDu[pMď#hBuSۑ"4w¶`Ѩ0A25y K{'I@Mb
+@># P9dvӒ5Bz
+MYciDlz Sݐ CT#<Yk^
+{kMx#]8#fxڭr=AMvG.\Y6~ʂ``P*ʻMmۊ@ }NQ"=@CL"eY+Fg'X ׃5 (+!8tݩҳΙ[BdJokߨAN'ę.'QzW ECd 2EHz2`r(1. @)'2b-06I;CrUZ|v#_d*EnIC> <{[K(0qm@&wrx&':q),a2'k3oҧ[!WiIwW
+FK 6Rs
+ʨhTZK!j[ : Cd}VW͔H6Ɩ͍.ql96 2N`n*d&_=cc/MrDp+0="cSP˸4\--
+Yj|S(N
+0
+HK9DO;&@\fUv`JQ?AhiV1k[Ye/h<jRF2l|\JQiiZyXo2|[ڰ~tzݤN+e)Cz@n>@/#}(kiYWi3!Rl:!RHԮj^9=ݫRl=%!;邌.sb%׫j)?7  Z$ۼ8#Ծ}g6ym;ꦺ dg~']>Ld 3ǴuN㎩<j{տC BTm)D
+WJ
+:V͋E'".
+oi@2L"‹$/nD}<ʢ4BgzY)KSlI*4> ӂ2f
+GaaOO 4)=$9@p,xh )B1yyJbsS@F;(8& u߂:xP쐜LG@Y|NKAZ@Wȁj}$(<(t";A&[,W B%6s+= ץ&]c؅p5ܖ71cc$ G'= su/JK;:&Ȇt0B_`i` 4Jߦg`c)̫4
+#r $p4g7?CaIY5"b`\_l&,'Fn%<b@ܣBF4|}ʳԎ(V91̍E[ 7'Wsh
+ kC毐<@S:3F1qnG(~'-fKգ1'(yNpwN"cYaGE)5ŋĢ_D6a)CSYz60nX`
+4RcCZ:yZKJf|Ṵ<"GL&GUMF磜FL<JKRRK&F}brWە
+0<nq`wMa >*챯GL9F!9ˈQ|yy,Fpc2811%W e'̛bv qըEGs4 L) WI 0^**Wp<˒k]D ߔ;[t&'AZ!*XFb6ݘ2+Ef ao_T1 riS dgB$ BZCտA5km%Eb#WCW<po=QQBTAgncS
+&GhX<e+@4 $¨ 8?eG_k-|&ɥ1;i2 xoxc]'fI-ǣb2AfB#zz`Ҡ8Obh~Lyn"v$nh6+)=VPKzHhr
+LS (_l@ׯiWҒj? HB2B
+%J H#jPҶ
+` }J+CQKa~&8o+Kzjuvaoh$Ɗdvqj0P۹)#Ŋ+y sYpMj9Ę}[(j[y)-rXw򙢰lt2e78)(p Yr[&-1f -BYS뢋;ԕ#л<v8]l(a
+jZ\m&IAW+ǷHeszHKxڷKD$\"NsGcDzs",$eBjUhe. Jڨq']ǖԺϹN.<Bi$&t o+2=$* Ӱ63 vƷ6/sX9n {i:>/@e2*Pfs@@``^VlahՎNG*nsB~[LwJ/cJ-p"I;gD4W?!BT'f~*'l1f-]@_[Q?渰Q o@_k0KuSp:Pb׵iC QH>"o!hK=ـrc\?.F*caILn
+|}'EV^15°\UCHr;ѹ9@2 FҤŴ˕[;& Z3y$z֤V6Xh :ur'Nه rҭ= H<楖lfh L}&ٺo="$&0$/h<v|S4ㇿכ{Б֍{ʏɸ~th?t/~Xj.>t(]z
+äF^5 r)kJq1$JeP*yBQo@;TʸWS<&4VܱJmBNlN'K?rm" Uׁɰ?vvN %7
+ңy?S$nWpOgss({bȭi
+lK xݾ??^P-juC;6e ےIz5I%}[, qe[#4(9{юH==DwE ٨O@96C8L+^k^HᛳQsғl tl)?/ =lٸ>^>Eb K~|C" 4"E1[#VL:ϊ}ۂ*s:d}vY"Q ExԺȵ:WeK~7tIU0ٝD'  pGu넌8'rX%meǀ` NzY鵬yB̓( ve-u ys[QW4E V2rUR7TyV,wXn2} aG-Vż%RZmd%1J`)=xgLs9Џ״7`\ h7/ǽ:ivΠϡ/9Q{3%Ε!עlNwW„7ae 74ă4^VdԼ tY@oQNTGa'%׈Z0߁(hQj&];aԣ"3D4'1+,R^3 gv6Z^JI&az7t,yhr@y0`ۇ:AỈ4b _;s-;iO{(}#Xsu#k;Sl|NEC)
+1"Eݷ VYJLo5@"ɲzsiec,Ӕ1^&ّ:]P+þ OU$^9GhPzwIa3n)X)xN^%k~RQA4c$D3PK1T‰ Llm/n
+aGMR*ak*\C: +sYǩtK)k.(pHQKw\#|9a@
+eOnQ'V^s1+ۉN#~:הd(rF9ݑ$ܯ~=*>Z<)#u$`MyE^ɥO 9s2LQ%YQem &X R_xxSgHЈpl:Q9tE{>6B؛
+P(?dt(C?9MmƑ4-X?X>-!Gϥ"~!PC7'E>IOdU{,範ae(W4zㅞ GQ^Ebv Qo*xyT})@Z`bUDsFyg 2 "杢'חX{φ=YEQSCƒOgܟ2OO@\4X 7=jY%—'ǗW9)"Tn+XZh!O ;g"wX3a\Yr<E8pݔw9>"Lt9ID$)e
+I'u\ăaAMNAޅ5nwҺsb"J3p!l / paHMDGQ2B,lY[Ke óKl=Іg#
+kg1z8]2" \!a>ޘu$`
+@2,!B=yI %`g$3 k><pHޣpI8(At 2-p!wڧdYtUmdq)N
+9E_VƅԧjׁKaS v3jJ{iKxF]Knsy9ӦA6 0!E{#[ףּ/^*iрx M]q6q)%H$i_b_xcT:2›;za_8EOaХp?|I'H(9f5.qL3wx<ր_1¸JaRjw5c:]R/ Сы5汙fו&AMNII14iI8\g_ɕ
+Z #sy]ZxPۙ|tjID@Q
+,Y`Rጚۨ~=? QEjZ'IYv̋fk d)8%.VIX)4Ɇadܦٙ/֟[>›?ǣD,h@Nɒ FdzH c iSbSL\#:T$~F-50L|g5ٍl@ڂ\|u` d(pRϩhmx9wbmWchP=Ђˆ&>Ga]I?@Lv:5gfjTSO]CY1[>K,Ţ,B%8lXܸ.E!W,[)/Hpv;59+A*fn$0G>Ht)9w3@ċIk
+L96
+;W2>H. `f{o9/F0R&+{wh/cHtJɲH90Xw&c@6ϮnI 0oKUAE3dLf%QkCwr{ډԯ?&e/,IN @W8㺷} mS8 UmE6 /Ե?~5k0Y1 ؁-md^N9뎎7LaJ|*}MUHFNmIlZDƒ24PtKmGF/
+}Q~\Z|8xM k=`
+1⪁BlBJږTZpmk,9TG'ν A>#Tei辋TF‹!ZTF W^͠WdN?0k2<MĹ"hif bV Z;/mGj9FQ/ I,9xpߦQ]RնtD͵ |B
+,mzSXxm D7-( ΍KfYSq
+ǰOOEP'&A~9EһmaLZSN/su7b
+q x1>:,}j Nӯ q|}YvSlcGs!&4Hz(e ҵɍedLMۻ/ьഄYh'n?ߟY4LA3tحaAlv;jiMG)_GePO k? F/bE,(Hce *_DNk9\Y46
+J&,iHT3fn$5CX-];jMK9 ƆsV0 W@؝
+HQp\KhtPNFS v`!܇5E u+Z?`Q<k#D!WJK{! O(Y<IXk#5}~?]@F٫ՐlT\!&[Q_: xRcLo!xy ء]!ns0(o8Ĵom
+KB+Gz[]% (LI6F H
+]nu)ʌ``K^ySh.if#ƣ,/-/e\z0'Cf7[.Elufv+ug=㋼1ں46EMkl6K߲YS;oF,@/<*<Pvl-2|SKL~QL {
+b낾aՉ57)85bvLԂ1on "RA4Eiv=$gI8 f؅(Ն;`duH@aKd_4*rD36H Η/& 1D1WaBxq
+c$Q. n' e1m\@^|]ثmUK&Q%DE.4F XAQe(A]36p?RvHgtI5ŧsKX&4E?, C~) v+xlb&NDA3Y$඾tЧVG
+X rF(ഈ.aTtB",ockj},f#⼷sZzO#ŧsz58KmL@=7EtpQn<Y|1KeMr %ܗf2ɹ?)ȋY5=m~ǫ$:$Y
+V
+18OBA1xr3p%"mص>yI KgmMe qĸ #qn^_ex@%,H1 k[*an:.9HL z^5⯭+#*'k2BD_M.O"Ѳ`sl]勹a =BA>lA~(SRkPaƼJ$]JS'!\W3rAGJ^V4Q|2+:1-J|@$_ A@ F?i$]ޟ%8Md!RÎVD'dp..ƫ]dIXxfӉcL_|谘y݇sD)vckWjLہ)a%DP^FaQQrtx@IBUėq(>` [v,Axd;hOOő6vI5PNkEKB$m%ᡛtmC ЉQ&}\fɌ9ASDHA<x#kPr)h$QV"Ml^RN {pUק6sDQ,Wb_@{S
+q%M ϵCZ3uQl
+}fdd BGr+Kul q1 q(C dTo^zϴҘeDQz5Hō`
+$̿۔ؐ6l'9_~
+l%ZNG@/F$OCghX6՛
+.-ba 8}|ΈpzP'b'SlS
+ЙBk\ԩho6=0z{iNNXVs==:. dH : \pJ&H Mx;M"nDP %+=EEOODSS=zjnXI} Fg@V(y"xO~tYcN`pr(g*Z2m&G~qh˷|R c iQǨ aȚJchBیB
+n6e{T2@lh& <3 7Y6/+_ O#n!Xi=s.%V,0o#P! e<%eJH$(WH]t"+&U[vS}b(9?יK1y]N+s^/p ۄ7Lh3NZ g~#cBчb~V\>se&7[-ǹR
+ޒPɎ<E\
+-;c+F,q0rdUbcr:7!я4]MSW)3Z4U&M]) %xz\0e3E#bcXGp?FžXd U"-ܟg7DadAx $%Bp9q^zOK
+ JJԏ)5@U~(\QAdі&nJ8(wL<9˕voVp2D4aу9Rx(9rL+Lg|Z+4^PI sT?B0HǓJėN~M^s%H>&#3Tgo+׾p鰠 Hn%L+v
+B+t{JE8ʌ[XPGR|C(0n>f%`4K(<`#lT98A 4Zcʽ*.ɱZV'e<O²%ġ{
+pG+{\'f}i{n[yfH}} ~ߩG6NyPlDD9|? hyQ9d݈ j@QdZu; G{_@!6 C}nRI)1}^ @.II9EOw HZۺY$ReY*2 M~Z'(*Hr6E[-("#C8-%jF0R_
+)"U#
+
+<ƭ?hwqHj]p;3rH֡NP9,$*Ƶ=\SlTD&'|+7с&5}<[?EZױ>m&C<,F0GDu\3ਾNգ\:A^՞*j֫JX ٝGiP gG:O
+
+ :νO{3
+i [&iק3Z+b()rFbU Ia$#@ᛲݯÐ\]D0`V̦D:.4Q\d%s#_T4K)iAf a»ST3VDc]
+InҤu4w}Ҫ
+2F*a@"'&Z$>~qP#eX[=+g~qsݒJNE{?Sdhd t1u/:)HK."ބ(e׽Fe.=RTsb
+PoE`24FU4"5‹
+\ Y%QO17=# :f.? b{>ج~|y&1 X99ģxQ93J~n3r^lM_͑qhgn9}?p0ֽR\x2U!եfmwJKPџ;›[ѝQ
+gr}JHf~
+x.|`\ JfI`HKrF""X%</[Yƛ"V-4i8N*1^ṔVcu󩂦qtصG [!BX+At0Oyr"Z{)_1HN!?!Wgve` ʓO y+)}NB_DNXj3]"rۧ)
+56[%,yBk
+1Dj@@?KO'oH>]^u%H,^+Э縮P0^HC\O֦wQqWv͕qgBC@C7J|+`ğXj8\ :Ӫ|%x&n$FH@7y8ܐ(Qir{d@9.%T`7F?xv
+AcދjQY=B-pD%Z ^x Wix9vg_-:OIO?'_qW] 5ib&;mM>Ҏo0B#SN01%P
+ts/6m AB.˯: tUo>b(0#
+޻( Nn2ǃ b"1[xL!@gd43!6“vcinCFf&VUK& ?ImCT=>3*Sm5W?f0VPV2!S f_ol@K8Pq3q_E3Qa *ۣ_eQ
+(cF·Wi׎U>B2Ω?~7זrB{{?XȤ$JCK;U$l6/`붯 wh]_F$޶`
+H\ EH%RZՌ
+K/a>xV\ml@_0ɰEvk 6u,fV^Z~([R2!ôn Mz"c; ᯵c\aZԅTQϧMGau&:K> [!:CXv\bH̲7NBuDՂr̡<9*Ǫ
+5lպg8(ԺhB=eC)>+:je1zA@0dAi<U<6H8|%0AղHH/.J@Yu& FNj<6UXF]AvmMu׏tlzkJ*G:
+#g3?ZvGpv2 ^:H?)/=\Pj @Q3 ;P4FGBD%DuN Aȝ"K5;)-M5ۊ9F„w c huYW}v xW0u*qm6c#ÉZBHb ?׳\ %*EbƄvޓ@k®E0c]M{1'@~]%%5*n?<By4אzeY8=chw$hb|h׃}
+Ezߝ!}(?hCl
+wb0&>)Tb׋5Zj=5.bvy@D?E_^C$R# qˇ_Gn\dQpow$u T3
+ڀ'I}QT1+Cq!Gn8#!ĠA%!ƨQJrD<wEi1x^%B[Nont`/=L9bp^>n(iUxu)2k;d)0 ֫3ܓ+[
+<M;S_^>
+{J
+b
+j\
+~N#L DT| |w 2څ%dUqH?_~/?_I5* >XfrbHn<]oïhy}bdѡ<xㄜ[i@*lY@c5 i)R"mF:1jOU؀>oA794fQ!\šDԆO016H{\OԨuejZȷ7\f~-W!cEiBU"ėL)c`O]ӎObSmUĞY?NŸKT"05l?_q#cP(\ =9
+D.j)?i[ӨH@(
+ϝgdAf5Mdk<H)Etb8Z56~3XJ9 THN b3SQܕ"!`LA
+2{&$҈G2yЋ,:`K2 GIBGZ,8fO tIַ-!:fAW[p1R[ @[7Tʄ^IFQ, ,Y,Us2Azx J@]NrKN0ta䔣CvMC>_r͐b@?"EV iOf_E%>spҿ>{
+F;%S ~|e׶vl }{ř般WZ@ V dZkW2ȄB!( oQ.֟WB(Yxii)exJhR#43Y B 2
+ iswI$,Ir: {JH&P~=?Eh]/–vD?mI⹖8V|" >qdX/0|(M{8W+4{j0SBq3))%#wډ0һX}ocB
+bp_lM۱b14)i'c{bk"1*ZaQh.*ꎢ"(=Q#2 =u#ŽO{0坏B:T u.9 &NfZrJ;ǨywAK/ꙡ dbpe&V;B.9SfK.ܨUG04SZQ?٬XsYO8Lxc@ͺ<3lQ\:Cq e429gSD1)ef*4!%O
+4'SSR\eB(ylp
+B9 rƚvXӜ²'(6yC^Q\(A~tn6_A*J$\ǡQ3(~Qn㘦g|DwIH1x)MN@~
+N3Xܕ-
++,{c:Ɖ|e,Ń`yztw*= aIF@ژrV (m+. +Q!N|{(X|-uk`qx>$ 9<e¤Aci^\a7 4Ii<Y>&۬D'۳MTJ́Xx6WawxbRFr@Pe7_A.U:/ڗ4dUGȇ<>uݹO dbāPfWU.z!
+{IvթR6옋H+b7>@o?2'ˆlA1 FM (UdPbf<}
+}
+0n=wwD9 jO G|0jQhs>: 9`̘0
+ +Y5P(mUEjT IS2[ ],dcN깁 c
+cEI]zg0ԓIZB^9G{:8ިi}l & i@\)L=eUt9M^ÜrZYW~ScuL*Χz.d@W]6 o* xBX];GcrQѓ@$kYB9+WGO +sm>s ׷b
+iI8lV7@YO.AE2Jh9~rS6c,qatL1/P6%,p0qhL:4Ճ:b@6^3L<H#S:aWfh1Yn}^ϸe)b!c TBYg
+Yc)bVxZ6ܢ:zz)(!鷃G1%R
+MZŷ>ݮk
+ì u8& ԽLf,"eC
+:]wWAܮ*Җ7B"\1k㥌Cf=+L#D\B6R/IϰCz,LOlA C)VJ:GBeQX0y'!*:O]R|Nԁ|ᘅEc=<#
+b.ʤ!$[l(
+b<DMT/%+XRJ^
+2NHi! uNwB]m]ƪTBH"^%&x[~e)
+qC[ \ S14$X[PCW%GX@
+i7F=
+[Ho13LDNT j<C*]a Kt/&hBi?p
+'$v֛̀a IzaA9&G˃ ׈
+@#ӟ'c8Af,yɜ2j)~*@/fWo0<HHI}M顡!~tลs+Z<DbI!}HE2-)S7tgׇ}(M*< 4<
+;d
+Zq \"*}+3AsP`rV5ד#QIw@}ULDCaǾDa?:7]1Ug毂|4־͋eٚ#)(bYֲښ1mycy&?UA{L߭>h4_.{0b
+A#EZ~BM۞Š_Y87 d-'dTN!gxts[STK>Z
+vkzrR LClt?s NN4Lpo)
+u/%iM5 Tt^>U%t oJ:>x -$!ðN!B4;u(V¯짋Wez))Zv5M!m=ˉ@Ėtj"O`W'
+pm @=";y)-0DMLr"!<xd> ?rMXG}K&otCŚ5FL鼻vZCuC:^tʱUA"lN@wf*Vuuiz]krDV
+)YZ`X rzYhF0 i|b;1~5C`ƧSP\ a2GX p`/" *T` |^3]e_cx<G+?E"mړdH5:}i w,vQGH
+f7^#O]-,&ag Ђ<f ˊ]O8t3̩QNIt``bo\HaiZC,ܰezASH\MU;xXM E_tO(Iu <j=5rfWD4eG2ve1n]Zf*&6]L=0#Q񶣆tz[1S@bG
+p|-;Q_j'd!t0';B<ɘ͹PiOnBGKDs'5!BNз Jw{oAAUtr2EkWNxAtg<Fr d!n
+90$w*u!pKsP*xwG9jv™xNqCN|4o/ 
+wT^*RQ
+V)`/ ‹"]Q-#Vܮ{n"ܔ2=$vcqm3K )V
+Bu
+8!R]jC2P0E7B^
+Nsj6_ujc/;@܄< Cĥ<v`ٹ5&' m.w
+~N_^*6G]~n ٍ(
+n `cIh;%kȟ]:ɁksDx芁
+%þ1V zVj'3zE1.ҦC⁊Bh -V(pʮ]@0م* r
+JzOs% -:8H@_htGӳ"ZّZ2շ.]C"di~#$AAZ9ګ@2dD0`@2Ʈȶ 33KHy,/“rW_C^Ҵrxkzi?|$igH,!eFb*Enzu]V-?06t$ԷJB$4Bt~h}"f9JS7ЇtU_-V6
+f69yoBnuY($6 MMj4t4ij\L%"gG1Ɍ }Ս+8eA%KR!jobr1 򣢶Sp6uy_tʋ(Bp
+RYm@g'"ЁB7VwU+P;MgR>t.@#3
+0qf
+2!>Dl'"$ms!=)!'bth`}V'ۂF.*Ŧ?v:]Z`JIJs؉;6<):Vf m#>jY}{-ST!x&s:@␶6tÕJZc0(\sHxi\↜Pu"X0OΌ+B\G@MܸFqGr^v'! TY= KA@FAG;"2JWMKWpGbEwXK cʄ ,51L- PM ӽ !܆G{nszW9񚝋b`:Q{9wS:p7vx܄< c%dqm 8A_n~ǝ_׺Ng'l(
+ݘc;7e`П`rb n|
+Uxsȯ# .:񿃍*MÄ !B ثB2<rk͋Y:Mʨ_eAU73
+5r)Z]@<`% <"(i
+l/~3{Ne/rh?r_h1dP`YAk0E~aV.J$kw0(o|3|Ck0+g`_qWPISW) ޢwk3 (`fw)bTmZ'H^F,yD(,g V>@V!+"gR/Jn$@w0eB[$3Mm&5D1oK/<fC*FD0k|+6DQʣkI< NM})'Qp
+tDUTN3Z{Z:/%(/c6 J{X `L`? yC̢SC/wC3V s%}:sp_a!I`揂hii/1uwvbx>j0 ޫ'
+ws
+ç)N4ə֬ %r[JM{E]
+aGnsCM:^ sCMzۣ征Nq
+_dzoTG&!n#AUҊh0&oǷ5jMuD%g<13Ęڙjy8߾iF(ΕW3(CfHr}27ЩAYǠ %].MtF1N#S-0,2`r=D-'ݢ 0!T'rv^ Ť2\(*Ğ7pL7ҿqC]n2X; 6</?x`ղBɺ4#% ._@A)ϴ_@ BXoV;Gp
+IP]páCuB@*: V& UO3(KKnj{.{@Q9_<*[DJ!, vamC]ā HmԳ竫s92s;Ȩ 8cFZ'7hCF(ls:9XRd&$)v4Lóa29ՎbP1lLv)C Ωunn(*]yTJ D Tf*/SI+%6" IBHx"bQtq~l0^14$40pR3GY a.'
+J>{V)7mEbq# :>ES9Yh'}ȲL92%1&&255>@bHFj>#֔bCqt@k7oΫH#II-C&ZVԔ+pe^I#T=#YF$mLE)zB};鸑ѹ_ּ8%AL04Zs˓Eq'*8YI+W iȮ@0f'64jAݛgF!qJB BEFsF4VBƢQQ<>r`kAcn(9 ߚXb[I4Y*Q6] ڔ1r~ƾDQՌlyb$n4ļ Ug eg&~QË>CVW9 Lt枮BzAZu?'=ćsOk&_0mo0_oHJ_6u=AJt$X8% fނofJAHyf'<ρQ9ޜH"0E?%)Rc)V4x[ ccO%2
+OQ~KBUEI̴ XxTYV-k`?|A tr8{ۆ@>%MN@|ωR;AS :; wH"m)fk7n .*E(1Rz39!ڱvAX:wP =w}ӻ:dO TA
+l(loިKƯtE
+cۄ
++|]6G5Tݻ f Bևx(t[+Nzpk`\ ixTZ]2"ou^~W"ˆ5He&O}Z" 9g+ݥ7/xjNtjsO!\#7ϭ|#DE4\SVaCK
+QZ!Њ,YyJ0jpёknv
+dj( bo ) .B!a_c{822d1LN7$I:?-N 6b{ydEHkWMY1">'/R8{&<Hm+ק i|꼪T֞a<O)RNH(x?GTIHH-i3fٯO^1
+KQ&IAbe0>,ы0W kU
++ʴg5i/0>RL=U^bYg' ]D !Þa~v*)̾L2uJE"|d:-(oHe:܋A+D ';}y
+8SXi
+P'9i0'(Kom3Uz̫KxUu(_٫_lܟC2^0 #Tq51
+VJbDV4BdQ_S[\BWhHMƹAʣh
+J`Dip9Sebp5<AVE:AQ\U(XE6¤cjw<EV ^THY|uxɥ "]{P6n?i#57uF%[79{y\7
+ƭ)h;Ls5{wqΥ{G~v] k:M-7^p
+ {:D*X˷.1i? b-` >Kn>1ۥ
+B z1\eTUTd5K
+y#1+|#ݐZ^3 .Zʞt/ܑoxeDs{A >
+C<;%6[a_- D~J?ȡidb}
+@;Jb>pl,P.U tR6z Hg"DtcG~٦Bk0/ 4NE'k0O $SxEQ 1 q&atgi81cN%F!z!y+۟af}fx} "eA[56cs;BpE3qB WNo`>UT&<g
+毊 %c~:!ˆ\/f%+M oAĕclP?Z4 o[C R"enw|eI#&Vf!b1aʵIuH+/zp,U, _~Ζ{⺊2ж\9"C߾ӆH1oòHNU}4rnP Okgs(D`Ed7qe'ɾʹ;PCl,* tz̙>ƽp3SX${c: j|Rm¤ 0yA4?=՚
+HVG+mA,!Wpu@xH@!2@vݽD{FC.%0@o>cف^]'܅Ớ5x$1uҡ4: Y
+ \[A*2LC<31wԪ][F8 =t%mg<\&j[w PYNbZ@8M#O adB0:
+1)\es'kvTO86(Ҁ厐J1
+ t۹&5)X1<.4Ȉ5V xY^׋YI`\h
+-2!EV [9NV ̓=8(j-~3LOT6C-40}*
+&|"RtOFiD܃(F$6BhBLTBbdA#Kc; TNeu9 Ɛ bZ"l._FH&4S]9q.'}
+˦w4ۗpAB#Q1<~+_~rL
+_uE2pJfhǀ[hx <<@N9F :ߴ3yF2#<,YPԥO$%`?^ǂ9H!tP ᲋74Iezبo=v A]dr$p/@_/?{Gyk24O2L^QnPd&HcFMybOg ‹˟˄t%l +x\qoru,xW%. 1ppHV>*weFe_oƦlς84Ig`]fc;*{#CGPxTiMPK9x#gr#Ask0~ؔ)wO@_ƲZCЈDUYYqVk $
+[Vb혌! sD$)ɕ,ק mPYOOYXc&ZOiWC0بV\ޡ ,N1
+(9˿Dܷ@ǜӁ֍ ,'2VJ/.D-:7 c!tvck<ݜ AjL}H.8We}cfRZ8h"vr
+wb
+L::'[vӴ + ʤ~hPjUC{#DGb^|X?7=w\{qn4؁j+3-N! fv~
+ea$hLPQwr
+B\#I)9ĨVLBqQ1wت:\8-<X&Z~9bg7gF2{,bu
+F
+OAxZl&eOަSbcӫʻ|֑TEJm;_.z
+0<3g:5|` S_M!?Mh$`qL9& %tc_ʆ/$olDt/<6#6^y#qK˔|`ּcTZ@ 9
+5QYr,Mul:[ si "V*3SY._H )-z->ent&-Í#Yt~
+
+HMr9DO; ?\} Gʾv,٪bee @&I 1j0b/í{蘐&MFmZ^JG46G%ΫD]cATx jt}4@U66>CZW7^_1
+D
+ՃcϪt7q S.1Ap+ \M_kyF`Sw/Ճ)y]gE숋4{oB
+9 I8Lljrc^^zc4/C:ö,^&kŔla۪H @V.ٝAtdiңj|[10@#B\QgBN⻠We B 򷉑(}a#ȏ))߮1Sؠ_ג1b\!9J#F-);2RH׉b96Pv*ں)w^ڊ 2/=A1*#O@>2+U6=ԙĊ, $YsyͰDmB974r0#O eX޸9jh_c)cf
+`nż<j]u!4ɺB-Ǭ.]xܴKў` hliE{`GjOťIԃDzgEV{`ۄȌ0A{
+%ir@HˀOu/02҇+g4ME=i/Ԧ gd[@<crBaP1^0`:nfU̬Ӳl:}lknmgnSr{Y{w}u?vUKecNApDt%cLP6^Ka 4Eٌ {¿ԷCaSZ%ԣVɾx? _:Y\1uD_f]9?Q iցh9rFܳcq/$eAe\ʋWn7ɘiHwAX0oO qDDkmLNpZAjAH2<
+L{'B
+KMSE)W(MlۀJ"1Q4̖v\5s4@*ӪrdɉnOtovAXMqO܌"g~h,=x#ɕ@1* \s$s_`it;,>Hd&^6_7 İt")13+ywoRfm'A909s حneG>V 
+NPKwIoJeݣΔˤsq.캖
+ +~CEM9K4ia$R,ݫ`;dF/##V|n /|
+)(N_,PDY;Y|`oB}H tR G.
+cm)lIUJ3sl ;#J;Z"1e[ hKÜ&AyuCD%WEN;`8}`௿Q_[%c$2\Y5)
+\7~ @Dʆ4ά&Ӗ1܏G6PY%Dž"ch\VV0֌gAؔx tSQ4?P/')ؕUO07hڟI*w<ʂF)& bhaA0b[A9tD$ULG:'K
+ܬϚcs>2*}ѴiPx
+9pMHCPsqBvs
+ob?*hx{R?J:@o횢 6VG7j'Y
+07m
+hOfhbOԯ k['c99Gؘ[AݯJqaڐ
+Ւw
+{.8/HF$L@\GKj >.4E.1t pC0ZY Y4h3vN(<= C^AW
+5ߚH̿-zV/
+'[4z=bȘzJ+f
+FGac!ޝ1䋀 SCi`f[5ە?@¹Op_smۼ.1jx4!M)F>YD{
+a e;G
+hL뻭ꚹ!9w"%?hroϭ=? ъqS_uJCi];GMD{crt5Bv̏ARγJK %5?^@@T`.>r垭# AQ;>5[6rX)ޝS[N9>*@,dս]4Us|ڒJk/ <Gח$$Ek||~#&,? gyH;H/ȐM؈4p$qZv7&݈AzDP 1,L0sQ5SdFq &.x'.C6L,B2'N>ZL|B̭;K+J!psCFu^Qo9!dhu|nFI>ϐ_eqpETDj""A?@KޔrJwԾwR p=(笠+MQb{>^{xw5 -t6GS+]9bС`am高Dc:Q@?{ʈtmgG7pK҂ (XQEfBnX$JBW0MCo g䋨
+I%J>mT"v1Nd
+1v.QJ6%& e:!>sHc՘_֒T4ܣT!?eqD'wc'A.DdD`A@P"0ZE;%w^9MVSNҗ QG:*S%m),ɓw
+2K+qetX}w,s!hj,6X*i1(17S2Bjй j&rB游 2iu? s]1Wf
+f a1|j cd~
+72 gҬh;{T^laGoW.p8# rXB=mew:0.gڥH&,+]됄zQxn?_"GGGϞ}q[هlǛOR_~qvz=^~ w#g4~4CİGI6=Tk@YL*jv =,29^̻Uj5݋w}خ6&!'+ie׮9vTO4,>xo9#0+v8?w,.ON'aihG5 =KaF֚ޣs\쐤'Bξ+]ظ=<ۛsX:c׳Wgۗgw`z?4۫??ysqE>%o>n/NCm(DZd~_KC[>O7=y<a"/~/REmm:8K_rP^)>ňL+Q0VaQc{m=6U~,EПMu=$ooW׫?Fy5l+}Ud#֙Xm])#EGVW d [@_pZ ӪlR8FD/冈ha1pZ<xYQTHX+y~p0$ʛ-T͖ŘB %Q1Y2KKLm.ȟSLr&&d'b?cdCᗋ9Dcy@=eDK6H|,2G]jM TaHJ| H5_'tW@UB)^ π*4~$F) ِ*ı@B#
+hpt]RzLL[<7azvfu_9EQXC skI=ʬ0$Zm'5L[8[q{*$A=XKqoVJ@=JKI4r
+I^SUiG : @9Ix*sxoJR#whY <^0=B?\q | BMG2-v
+B !E>hFpC#ufw *7.rQ9l`ڱ.:
+)xq@NPߏf[xsA9J7Ԏf@ "@JHʦYn!+Ğa 2uH`a*cH`"lF[ Y.s4
+KUȬSF9]VÊ}@<7ka-sԜ$v"C|*uî2rDCF0$ A7.ۣu9c]_JWjwm^!R=?;r~
+ς[\d+|}ulX>4,W $eY,690$f }f^W1o#'Ψ)ѝz҂j"y)ZAT
+HqWQxA@?HqmȆA@`֔+X1`Oṡ!3zm_n&̠Z 8tNķ:&
+rI;"LV#/S+A/%/H'a]Q4O1r^ ,+PPpPܩ岮{*zP'?E}19֧}GgKړ@^}ʺ4
+re;_:?6%VM}8 (8zi
+OnX&[_uC`]Թ iMG
+;[o͊P&:K٨:G[8cR/f#25"0́/eB:?354?u{drV/f,+"끷6Jņ{v1#TTjnCѩ>JGU vƇT%(1^\涏A:sxOFS#[}Ucn_M7ksc:OFFt)=iyuA3{!ZF #"9mH
+Ut$
+;S
+1$RQvv-2M#x|0-I-@6g{WD֢7keP$rL#;t>y}HrD6YL6}: S^*/^0FG[_EyIıe3|SP$Kt^u |(QS.v&j}ݘf7 +۵y9L]IԤJ ]9j'L!#/ ಊ \jc6lG>P#ω5ZSZU\Ue~{RVrAFΧ:Yd^΄򼶑VC:1N\O$\N0r$|lSe1&L<r?~jL^An`1<lzjaҫWvʒ1d8䭚)J))MW"csR"?Rm\pFUD3r8SpʂBYRL AGϷOz^uU.Ǐk6LiҲib=bC\ğ.%>Nbh0r
+esUOOm@JJkI&
+{om{- tB (3ж0('ͫbw@_V?@/ n2Ф:~U}鑈/:Yc~T!l3ԘA(ހ1H6O
+ p=SC
+~"3ȩ:oWWZxl &2)BH{d"ʣjG CmtK("%*s0K e rY*Gf. 5PdK,DE=h_%$K]5̚`x';ͰM¯IQ }d8MCY][*|JMn &#kC>'`~v./IeOk.w/ "\[4u@w %uHo{ j f{miC4(]n$0}GslM+嗴׺>i`ܞ#I?eytb:M 4,$743 Rxs{M- x*@m3W:@pDc/h*}@D̾dxt1Y=-+~e\M@x/5x6c ::[H<N F[ǟ<x|̓W=x3 JlS V]T}}:)(].>mwUQb/ thZ]E^J69>6My[: oﺟ>w?L#kV@4e{5ldd]
+)'r~OAd_TDb)8{*.RM@H^[*/V@eiuugS*aM]βO1ϧ0}Zj脶t:@Y9.g*qTn>Gm9QgxtK%{x?n<{*n"’8n |8C@nܯsswotT`) LLrk `}+?QKHa $/t4fuaXQEtA2:+ot2(0\їþy^
+ĀJT*%T֍-0ӄ.Td{;O4+AぼC dS3Ϩr!|OB-a> #сY Ao 4~
+Ri*7kg܂@$UG)Ɛ1JYr()nj珂&R9g5]]Ї;o;FTnN}iNsn^scU7{Ź§;P_c1omg$wc\MEMq6@"xˋO9ͿKѤpA+Np9?Ͱ-ĸ/HIf+$?0j$̢c6gw0w/iIϿ %?_^ANOPZ|.u*͟'ͿRBa|/8ݞlѰoh=P97 Jωw 1ziAnBAA#ɯHb ^V7q0G^vrKHzѰ)vv1JͶ p-,);RŚ{jv"$ n3s$V$dqѮAs45K"
+25/VDf|&HS&A.˵ L! HтN0&hSAa*-Fۼ1uR(XMQٹϾX, iPho+-(@1£N4Z0F쎼R ,'Ȃq} Dgob:$߶8;H#|6 sdW:ctNJ0a?F QiMe8DijGe7bSLgU֚m7@/|%>VFě^ 2nf\1nBL{064/HV`mʌޜ2.bt\s(*K96QK b^1Ydi
+a;,ur@ ε#Dd񠌋!
+#o+zѼyLY m=3Fjvp`4):
+EcPw ֊ hkSn[x>5pNeEy)<Ledт3!;KE†Ԗ̠)g@aO@v>w1te`W`hvqK\](J
+hL6b 5dT/W!@&"W*Ow5H$+j[*ƍp( RɐsPzBT1Cw =';7ؽ"st.i:υ搨ҳq
+"C;j֓i).WQeﲤv4Vn@ʊ
+/8@>}T`P9Y.{<`_ۯjgh& Dܜȶ02 ڠXzj֊j]\b!Ëpܑ,`ĪUd
+
+YS_$d2:(_6b YT{U&dfDG4Z4mL}p9nvFU䯔Fspǣ^&ܔ7΁8DuS(`Yw" x|>%4<A\L1HIEY檝C#w$h JZXRΉ13UUl>H!A%k(kե6A)'ein5]bD.d_[njVHO_ 22G eL`_LŸtu<>QW=AcFnF\W\h5amqͶJEvRfcoc)'T @#Wve=»,$3y;.Z;aA/ܼꧡ(2q[V6h;`Dë5Vq*!H.e`e_xI.;*?-7~s ŀRVƑ2
+זH()8o3e4`>r**#uKQAmYJʗ^
+*>e5 PhjT ;c_a34/tU
+! fx#
+n6_zt"
+^wf1hƒ׉*YJblՔ^a2@4IԽ7pw5;>ݨyT^"vPPgyM;}4וF!4KZ}ҚHD F_IH;ByՄ<+#9K3Hd S1<huիy25jbHn=q&0wj.LUŸr:F<$BѨ!xP֛%t cSS  7׉dRnpMے$YIDL!E!CPAC8jq2kՁ\ۘ3螌y![%~9*xDu
+m?(+T{wb$ഞ<2>fqjNY!(|B$ꞯT<kb
+'9\@XW(VAB8qAq˲m%7KEQ4Z16qr[^2tfHLAd>mvKyl5m6򈌢 vU93
+woD.# W7DC1w;R1_t
+8!KЁdB_p:"^Dp"CgQQ߇ c13'8<M91̢dܻKo븬˗ެ+c:+7!
+B3VO;(:nCE WQPJRO{`Z~*`,!C+= L.Ox->jt
+?SKunsnsc%P
+BHNmNV@Al]3$R
+M^纖|$ 3S\nC't!=\ DžY C}Z̬"i2#20SuQL+UbAxUBenP*~>KxLy̗˄+I"~8D#c?ĸ8J;CB J .s
+(Q9 Tn*bv ]<3B]p> pSR($PF*[2'@q+KYp{Un4--/LBaxiV5 n 4C
+
+>bgA1#T\Sh8'4D'sgft.B2
+k!-dcv!C:XX)pv1@l2(@({3
+V
+7&<< *2z@To(~b"Oi [;s I,H'<WBT~Ag2To4c"N<Fkq3 qB?i1ӊnǼ2y^1oJl?1n{f\х͊e_Y1?a7ʻM.LlHMF /ڻHCai·3:66ƮJ1J=^ Rƒ5J\L7,P8dBw EOh~ؽh@'!:)~v-']+/|D[),P#/db2J0I.̶@n1BV05}eō<sqtŋsD}&.S ӰxS}d=WtT:? TYVN &_YR^Ob0Г=b]<\;H$-\ (>$WBEI,+#
+xG@5]Mk<.64Kj>d n g ]#'sxI-`Ê8ۡWd ևx(;9ȆPQuA()} ~[0}3 u^Ff[hrћ}
+iVbQ,5\"7PG& m9g}1nGsLŶI4 jaPt,^X/-a*Tc =DNV(' c5;I^,#1XŐkX;`|bbVwlG-qxPy7@:(٦6؁0kpQ#Y m:xTv$ ka㱿žI}Ĝp[q̫ɆI{2ӑWQ[pt6v! ˂,:Dnڎ%$*s8;mTͶN}R%^ˋ2Cԛc%z3Τp 8zXݏN H`&ڏAu)ao@k؜#(^84 ]sH\ &ĵH
+{Kter)ݝ|
+CXi A1+l"óvP+Ō тk=M@tOЄp_DEND50E IٟiA v=̛D@!s[OFnjB($!&3UHN*A)%G,PF+6q
+J;>o@|tTqRF,PwY$E`QSQ'Gm~ͬ=`@v Ѧ%ezXڟćZ2Bzie<\`5Z爚| g//<6}.Rۛ*h9.@N>E% rM4Ng7,VDZ0&
+HA\9DO;&!RE˾E*;_Tڮc6\LI$AKFM}Mt˦t4^n6jWDmK5~Vl~x2^[1+L2tT+dT^Ux~\j˴ףKKk1壏}Zp9޼^WHCi
+bҫr]_Hm2"6|rkzwQ+SSZרuAm;iy8OhTjQoc? FgXsV˔99km+Ȼ|\?>Wt5rK[[ "V[;Ԣ} "}:gX`
+Ψ@#'@u ֤2!'WB
+]E7pʚCyuJ=*_sC(lryVR[B𮌋i+d4px
+pjT׬[P<n9"!*Ӝ B_o+B՜ pG\))O:QJe_Sf
+NpN,kn}pSY=
+j# ;*iq9ɦ1Zr/4mVJM0nCҾΩ*4iB L1%ULSd-K?cbwjbdd@
+9!$K
+v;Iol4=LrF]G1<y*7\ paL|;'ާ>!@eV/]UpiAA̠1
+:^
+8M]Wx^P#̏ ss.F v<q@TG~ WiʋTK.~u?=]zAݣu%x ]C5SkmY
+7?篠ykA U}=ZOeBv
+%O޶ ERK~bNqe+
+u8I
+J@?jguz" = =c1ܶ!/M
+fV(蜝chn$۳bzxO!?!KkP0#ḿ꼎Y0mW:ݚ,mPg:)GF¬ʰ[S3+$ >jy6#GzY_jݔ
+t;[0bXcp19xȃ Nyfo5"q#d8O6pݳQyiTK@9uQ^ (ܬ%y+EN㯸B(~mLK ˁM%~BBvd+ z. Fp9+ʶ
+™ٷhpcY8w(EZ
+|Ϟ^[ˆdVCxcC`8eG{r*8} <ŠT|g! &@x?JJtF^)$ Tu9 }skvF61XNj&EA.KO#LH2z<%vq O
+fa܈&؉Ñ#M,m NȋI:X5[*G-G (`#K&4M_֘b1P!|Y-9C
+֥"Y2 ')E;g@Ò@Gz
+S
+5e!!^SԯT( G~]'ۣ%S/"81l4 %0ߜ)Ej3@snε2\S;EzLdQ'Hq$C:'iD<_a0ۃ<''H
+Yo 97 d xr2jkc4>z,vtJ c9^ Kʼ@iAb9Uz >ѵH^WcB_DhA]]"с&$ mZv>E08ìŧjP>;[9YjvN6'1ha$Π%zf3DJD..]ƞQrH{3lfuDJ3>tzomhR3nޘmWU;RHwwb/iV5Y}x&Qzsް}57,"=mdV97oG #-~ч G㘓W=EAIp|WB]6:#uRٯTvPZ?k5(OީۿS-bǭqNzdfg-5ܥGYWaH0-T;:Nc-%re2v
+<BʼnD6oKx =|30-.7ϸf}5`Z7W2>ׯs߿tuw?ߠZ+w)~pWTtb
+j|n"QB|,
+%}) ?o?o-ȫv`0g P: [ỿ\d
+w/J`qk,H% cWۄXg']]Q6X}5#Ns
+C nQ6ĻneBA?Z",
+ƫ [1`jG;@0S2gk+co#]Sc>Z/԰T'kĐ>4. {+`sX)6!˷A>kCi+bCX2g>;l#R*Ak(Y] ǦrTyw~x I!0Oǣ$C
+[ ` ɹxRD6͔<[5lmfTHfkg3 b/ o񡰏9ϯ,3mdtI:}d/A*/У—<.6 3$CzN ۢ|B:7G-L/b;SA3 ~kMbrA3osĿ uۛ
+D5bjL7D0SLbzSg fTs&SVgKht+Koc]Sk1>5Z/է{+ * *J, x,
+cpHN6B|gܑ̑ |݁ < !@eKМG!++;)x[sE
+: c}~zQU~N(>]4. R  s9qf~݂fl2(JsCkJߘ_Ӛz7ىaɓ00RbD )5XwFQ-*j?'V̼.^cStZ\};#t>1Qrg+.S^ ^
+K:̨DD!_6O| Ȥ4{l"m!R*Ҙȇ] ,`Z+rK8n rj'^P<@ЊkDӀM)Cђ^7&YK#'7 6oxZ~,Q>pF~e߿#
+
+熰4L&tPDdG /›T=]
+:K&N:%͠t`LIKz1jdx k,Z9&p%VUmcP
+aq!.g(ɣG"0~hu 4㶵~~-șc
+ȿГ=qVo:sWYRW fL 7ootDw%e 朧S̐B_т芬lk:hx0lQ12TKBV3}'Ȗ$x:"k#ip3%*s *(^עxV=d A~bX}4(!9gRcv4Ȅ\lfy$~,B l+{p0" '鶏"W7 ARxS<
+bM =l羀1<n,^@?AGڷAA5*SgJ}
+h uE`LYB }7uC|!]"O [F lX8Q$h]Um#HPTmA, Nk.Bx̞A8:nj_k{+hǘL*fd0*cȄg(*sVLy:4\W4 N`+Щ2J9"; l%t+Y[{׷iN1 \]zOC%ou0xK=A6)^_΅7\wՅ\zQ̪tvy꩟3$[?j k
+:uwѡpR9jqR JwG:}3ѱ-飒`Zmo@=F&u_ Kn9R mZ, q𹈣
+bYN@QQdۥuJiPX]n'v[bFVP1fޤ`̯0wkhԁ.H5Yò II!XK,_;,e
+!U62 ٲ-0D x— #m"o+R]n֙ᅣ[#x7GiudT0T[ c>5w-2ZާC\Ƃ4w[cY۷'Ȩ ȃzFjP'`AJdIlޭ_()}^Aƃ-@4V'e+)%&ӝܷ ˆ۝N}{y_?kǁPWx8Þ JL)x\rݛܐ!s\Qe|+sի796 9PA 83xSF:p QC
+޲TuWLA;|&eK#^3(&hm dx&WRZF,vᮐ
+^oCSrn!AdڎBtd޼ ClZYB:
+,{ bEY/tyܷZ/DS*i^nsd8nBl]YD4I1O-7ȝvC7FwŕGeU'#K]YxE.YĔL"pJ_gxU!Ź2 t˿חp61,j]#%$OۂXhq /)h_v?'
+QP&FXh<l.CI&])H椣?"\t6M!6%bZG݈D(`IN
+-n+ Xht.)dbזS!S!KP*d%@q~Bv ]M|WHJH8W]eGKA xE 513]TЂM9=ddiF'M_xb'%DT̊H5z׵{y<GswpG;{@a[3r̉xxűAD& (X7I8Z+Gy_Ӝ(A<Q7̸..v_ G@;lû6R2ӜStQ%(`Oޥѩ99QeҢ%]B_Rf61uQㆉ7ԛ.j?4 ry\+K.WEp9"tsb/TUv7]<K! ;v=q"*"BG095HxLnnE߹]<2ĈIeKeGI'׭ #^QPTiB.:>
+$)cW7JIq@6+'c& ڇ7LhK4[1UHς6{
+0R-x(@KcS)O:h ?U B=6ۅ㺁Ț(i3V)|};`D8}L*2_J~%vM!/޺Ka
+(&c?ݢm$]Z0fH OkzVIbY7{}wW~og q0pKM a4 Xq M[DViO4oٕ0z\%T| @S&㒞(3!"IB>~x9A'#_2Kb_,`*y+{:/dsDA
+XW&Ј2xH1Z`-C5yݷ*ծ>J6r K+O\ !_ ]Q_ $Cedp 2mYRkݠ? DE9F.CQ!Bbɹe0TxdUdLhOAOŽGJfz?c\уٶ8MmK]Zbaè%^"|kVq=-enZ08mu%|"XV3ȲT~@y`03$vc Ɵ?ק(˫H~&*Lp5K.3#i6;!}+(bʊS6T f;gu}U9LS; JCj
+ޫ]Ŧɗcb
+4w.$:)ѫ$Nd`Ô<5p~~9d~~?٩ץK 8mA$ Ʋc\ M-Z_vVـk DOK Ai= p{'&GVj2sCH7ŵW (/U)YbC8>ރkAp"NZșOS*N?K#K^&\D_Ėd^16]lLA
+*Jj5B+ AJK2s<edJHL3"Z n?hROޢ9>|X땫
+ٌĞݬK0ێϬK#H"f]J.wwJ9$;uxt Yz&]*$"OLƨHJ4t#zEIWd7UKU ]<8꬯g']JT@'骈ЇГS!Go7D*:_vbJ_1g!S=deN+ N)ȳt)?J$]
+\(I}"vdY+9Yt]ݦh5{nޥq|䤗+^سݼ+rؼȄ)v gi/y!#5NujHCLln
++WJ%ˆ].;>RXmJc/iWH0rlT;AGnha݃+P.LLv#
+Veq^s؏F
+(ʥy6^3.ݰ+(D'~TV|:®#j8T3f݋uS>3Ә8IW8fpH+Z8e
+]Ϥ~D-/g ?*et+PSr&ݣKAݶuµzhL I7J"Ĵ-G_w%t(DԷVx9hA4Y"
+F/KIs6Īy춱'G#ozʻe6Lk0CeJxmiU܅ihLLcܓKڦᡋNɇ=id,MqSѲQU? ^,vuo5$sɊ {`݈Hضc$jlygQd<6COKug ͤ%5[<p,D@C5P Mɽ"Q$Nost(n3fT!T Y nЁ'(F?+*x*چjhlܻG;aV2׉p$a(uL`fHհ49d=҆*sS#c/O{8226+=-#n7n8*EC&F1T+b%
+Ut|QOzf:sj!믫֨
+[MHhàJ Ŋ˘%݌knS;Q0X_عa
+KFtIr ?AG';Bq9bsFkYb'QHwު򗓴/2V av`..2z˶&QMp s%Q( ' gV! 'Q᎝2XRbU|b3 la gwR%xݴ/1XKG@(<lG$kŸ vfv>-10Gq4D~eY'p!(q_"S
+lAxj+iES֘
+#~3ax|1 'F?_D^Kw*)
+s@V'C{tǴ!vR\X+bNx롛? >8p
+:D4MCbq)t8;c'Cn^1dSD]cS07A3v#{ӝ"ǴUuZ󃪆Q)3;|67% rsZAlQ[KS<0y`Tl!HHQn.yp]$Q!6!U%eGIL"J ŵ%H6H_Ll)ҥ"}apJ] KYs@rй2awV=WASy<OV@D#\vq&DSzo?ARSa-K꟝CM_[N=+ 1~A-> )c(l:grήV^ ‹03h3K#J;˳afX5KtxyS7bkȗT1!J3y@x&aLiQ,QK6nHDoM-a9OL<?5"н |3B,$Yp_ϕ™J'/<!S% }!NxK@ϣP,|os y76y%:Cq;0}WZ*$% >#~,ԟKA9x찼||0du<~F_Àk1JjB4hrInL1,L
+lA("@
+|Q%
+_R4%nj7B8@ Ydz̺A 5 ХuePۻ Ƙ UqȘH=,]g9 jVx"6Ca!Ķ /+V5 <c9d0<<t9^~
+:߁ܴ\@$*lԍ` j dK
+t!KFuS Zt;3,!IJL -a"aԇtIb,>N/K7%jkO+fkE! h!9pKg;IعOoO
+6t/2`֩w/2"rްC;Ze5ȳ;mo|U΁1#g%["(2q;ɠ5ՈaY/N^ 2: 0pGQ o(t|Nk)DLč΄uan7f 00D
+ķ1a% p.:ԼSmlNzp+'PIʋhi+XhoC}Heے¼ƺp)+.vaLɴ<^x>SyY hV}i 0k(0WL$#*M!QCQݶ'{הɒ@w!/v^!>9U)wdwpQ(C
+`0Vр(>hɽ#.=jҪ!HR\ 3|VGj [ hq
+\|Ka
+"\HOh=x CFqk/sl'A!:d67 m-r<kTunMiaJ Eg&!ȗ&w2Ni]'GExoCpp
+{9ol$f*ϵIލk5{Wܰp/ فx.H Yb^κeX1jn Cb=\VP3^0HbURPxIrk@Ѳ]R]mYU2e(@#5hԅ i#ĸsҚp[aSvo
+ i&QKوsBb63mbJT/+-54e'
+""R(9y;M$ bu桨g,h/M8fC
+a0㹸o|)n~o}[ƻ οOSZ҃,@)ږR2!!t2[S̚# بzNN96
+Ex޸tKd+I0d-C]|Pݲ\a N>.B>;%H'E˲&,fOf}"Nx8<HZ 1C(1mbnǤwf9K#Q_|pᄸNx& H>޳HL|%JM74.N!Cv<DzK)zGN\3q+c-CR+?.+i~D[[%wc3xe cKٳc ^V )`h"r֋ģ<d iBhVNm ehStF38V&82~vٯA"*/B`.3qm)t
+c}BH`S9 0` ߟFT K#7 hi> J 
+e&ǩyb4%z;oJZimQ=|Sa#M0td6^/WRVӥC3r,S_[FLG`ʊXYu!x"Sͪ9^ Ԏp0ra,E7)ugSbXi<s! Ƙx9GpX,17F`A|VD;LJnA@ҙЊSPtihT
+88}|ċݚnٷWFX*^^ OmJ8cwIpI[4NT0 AD&ĕ
+ek
+12v8"ik9 E*Fؑ/s1gYAD@پ
+HAv[;DW 8f9G}H*v&vI
+7=@
+l;+ooBCk>o3RdL%^U> ҡVhRU`R} ( <kR_1.؄)d]I㪷HZhވInV=5/ھ`R MBY(9MBf5#=b+r s -)o61+TY{ȝ¥Dw
+؃l=uMNnRzH.<#q;Ȳ\V\|8 Za ][F7MͩmayqG{֠Ui|1D͟h#=)ZYno@
+f8?`:Q RC
+56ñԽWPw:xA'չ`lR&Ӭ2xF JXn֣*D\r5{wM01[m M*Q~O"99 K&G_ U*xvVI✰s9>߀|az'.8ջC9ewfr{&
+[RȯIlY^FhB#޺kwߴ./ZmcRKMtvhwrtz3V9(Жx҃|Y&O)FUiK5^
+7nP#-(
+Oa0K>AbqMk<!t]'q#1#dD\3Ґ3;|m'W/{
+!Vuyd7΢$Z0)#aT&/ &0#cɥki@hE+1DK] Bqa _Gbs;Vd؄4tȺJ '^8ozq) vV C,т u<ܬ</ țϻڲT.C3\nq1lEZFw^!+r
+lܩkҼbv2s@ƋHk8R[d=#rF6ČVPFO_
+y0|7 Ðj>a`X嬘~:&W]5 cr?&.O(NAݝ>< nG7 A~2ö|dhtJ^k$ۓ l!*
+ G|(+lؚ%\sWLEãRj=S8߭亪 .T?QpDl]-:B@S4Ɔ[a'9~W#HwPx1\ q5b ]{UL,Tn.ϸkˋо8uxzZ9^s#);^rh{~|_~o !)q8c.,ـ {UF
+kR%ʖHQY U?**+)S rR8J?33b z#VTX?8[Z<Ж?,(~*Bf60 ]%
+sT+x]NxqU_^/AHId4D,DƐ '[i4 ռħ4!=<) S|>p[E'_},`9c/V6E#)fx4jo/#jiI&!C1ůq7A*L O7p!ЛB[I
+Y>ZC@bCp
+IuY XSy>'#MV3Tw #`Wv1'A T$0=QhAMQM)ۛ$fFxǽ$7KA4 aOۭqD
++s. h)3=CQ)w<-rlu`5AZ1hK)椖h~;x?Jx(1Lk"W&F}]BX@1VZ$RpʄĐ" 6fպC$ynJbWiPs;[K֡Ы&x]viDg&%Hi&Ρ{]tJ ,z1`7IS%,mXaj|:օ5
+;F)""^?ЊJ 8sYd 0 ,S ~c.ہ҇bR(( ۧU
+ƣDΡIb
++ēՀ*wyMڎr81G*E8~LEeÕdlFbkʮ9B%/"U^I Re2`meT 7nOXO%+6|0S; C m_jm䤣~Q2jXx
+sDXUOd 5~&9?vFI5 ZJsPIAh,NwնAsTn{zH!ٜ̓ne׋K
+*3dzRkz1KَQFV:"W=߰[T"N%ۋbMZwf-ߓ'&鑅[kd,(<N[-,ŎVM:aGJ|
+0a2u۞ #٢z0Neܭ *}q2'u
+!~RPZ^p*sdo@Ӵ/LXpA,{<Oqo;E)ky]|DHݳ'0.M1>h.y*ŤWK&OVN{Px11AVKq V/"o#U*^inPs\U^ ڲNClh
+&\E$:R;QhKt X,h x
+4P}wAwQ$g~eSv@o2 8^F".Ƌ4^vq4B8Q)i,s/I
+ZLɗ%df|s9wa,`"gicmB?:f#; _5ݯ] u2|),\_L ʜo|9QzBMÑ"Se""gq=GfQ-Bcj)bsČB!Rv2V RJ7hϡW:5;&Y <8`>[L&[]B!$,ЧNA<9s#SRHQ8ȶڮnő~պm9߀Ecn!vխsnszm
+z݃>o+C0a5&.6>0Ea8X$(`*WArPoh9$@ S;LRҙMzRfپ9R(Lr"WAnV]*_砀 j={ 4^
+Y綟{)Jܸ@JZһGnأ+I%ؘE2Q+S7Qac QRM*BVι5zLkQfc\a- p=}sAHlo+X@ۥ< pwVr!AW^
+DTȃ]}2`,
+U%wh=g H$QR:l_D߃c*"QQE{B@AUCz+G`bXaMA1^&q@=00'~HTPԝ![*HHYJ2FoFȒ]'Ov"Wdabܙ
+TJ=1j=*7pҜR #YbP2 ^0L&A{_{˨%y[&bT&gJ7e/jwQMuD1sN;D0P{I&uk\
+Ď$G 2>Ljljxx*(5E T
+1ƲJ޸'^KգI~u*6ۍ`pt","fO"Llq(zIC?F\*3e3v\qS׈)nYo(de#s
+R?K|hrOd 7@@&PU«mz65IPU :څȜ T")zZ׶HQM;*2y"P[3!EhE$*5LTysg?C,;[`޳@>Dכ0ʊ)'VC&qBLlbgF A^piaZiz_'}T;26:k yUcVQ?: ruϖ"9^TYA>U{st1@Ct' ,ac 7։xf+y}as w{??!8ؠhL<vXX0+t8L $KE2]Xb]mN"l[MgIg|0ڞ4+X;y_i0CqtNay$IT0+7~ӆKNJ%)Ĺ}[=1EeJW1e;Ո=ь"طy^o?VApAF$$="ܺ}8h}.yqƇ07 G8(=wìшlN`}?1 C`U~1*@({1p܈wUV UÝM!$h:P4#cHQ;~~ XHNȐ50W}h"8_'sfĽ2iHEpJEXiC
+KӨ$NvyEEp
+G~m^beoNӹ@xlmeC13vہP':H-] 䄉%VL=2z(N/wه)euG:ǐBI<9 _N?TɋrW7-:ǥQۦF\i
+y-лs@?`J@{Lf.k ?
+6!q%8ɡE0#[%S8}+ZWu?K W=q.$= COF?] r/o%6D! LWkLRlU[]\L-DkSL,Ӷ%t͘Nc*^Sÿ "vg^Ǘ~.2˔%q7=JH@n%}!H;H{DcN U0i0OL]LIAD9I̒ .X 4<k94y7i(".hVGE'ʉE`U6fK* $A:s4XMi-,9]%d`UR-Նt/T(:y)eG)M8(J˙9A6ԗ&@#[r[ w7$ÊL1 eVa06Ńg<\8 Lzl8.;t_wII
+k-~c$t#z/Wײku8÷rfQN&;2f!sVdkk@ٍ
+
+;y}G ѤlbJbh /8r a+(ƙ' vc b& GzHs?+`Xk)|"8r؂Lr`~ Tk
+cF5HUp ".4Źu9]`λAj"tatQ .Ѽw̃4Ԁ$/-
+ 6Jj*<'n^pŗ
+:?]lӼ j0lK<.*貊wυqbss8+I8wl/1w/ʀbpd.y>8V6&\:OO@C]z; Ao=3%
+Pd[/X؄ϩI<A@KKOM
+q-fbqQ8GOE V;Q1Ђ2q [^(;SrgNtDbIM^>Б֘U2Y 㱟<LJDcXPQd=YIc]^NiyTPd,M`'Q[SA'rJ1o[ewҕJo6,|;!*֑
+eq~i/TݒA"^[Ճ,Q 64M&(N7J y(`9g܇ 4K7/ TR^DȧuOY-vn\m)_W@5 G^0΄~(eڜ׏1V^;?\@
+Ҽ72s0O7޼ӱXߝ
+˟kܥqH;is!s4ˣr8LXU1߇cK٫
++A:x`D1
+gDSG5}\x7E i
+mE2T/%1Q~?M-nSz"+M<yހ
+[|/IwQaStv2v>RDǬ
+Oe<Oz6ʧ:&%% y#Vb,0Zq 
+k[BAG:UF
+H;ѡR4>ށ.wFeSZ-cRhsD)H^2tL76`S(FW+KNt, ̀Κt1eAFZw?\(T19:Qd^dD <d'4d%)SyN f4Щ|Gௐ)~+c_:~0}M B
+.C7`F3WTڕ$7TzkdJ,/eBͯ|) * ;Q6MXh"m9L+q zC@yXktm?'RRYfo
+Z%?<5=V -uh ><,^3PAiO'@VPM'ʼnE!Z mK6A},;U;W(a)ƘCn!+vs(^PzVh+ruLؼ-V2>Bei,*F
+A 񸸸d
+%;B$=L&+_o{/ _ 1ڗT~b 0FsJӉ?'1͢%(21ihy[NU̶
+P@g >
+]yb+ޯ>Cҭ{y#KY较u?(^1+ 4wOXI)I&ɀa9ǮBՀ]U75ZZ1%2ȳIvq 8]Y[߰_5_*! 42^?
+Mq:kGE;N@ENbk: _/|`0>",T(:<m5I4\Y0An@@I/A:
+r\K66Ʀ@%"jb+OwТ{Nő񳢎#tq)Bx+ӡA4c"KcІIckH3L;
+1]MdۦĦ.]2|4 oÿA@B'-X>R=VԷ!Zo]:5NiQP$WsN/jqpQ QQ(9⁘y
+'GiKu
+ZE2ZHqL"@(?uant1]yR<zUm2U>Wt˓shMG 7
+*o3dwp5>Sd"miRX4h݆/WTEe
+Vfjci;ϱty 柡iCr!<25'0=:?$eNJ}|H3<5eIC8^O(M:׹Az7^1*;aq3͡@WwN;-~,4CDv*HX%$s t=|+|߸%TvHa+zK9-WLĎNFubeHܸvf9Sp" 묝T2G]6 nT7S̪3ܩ;XR&zcp2R2Y1\
+'}MFsk X}f6"9i3W_ړn7,p6q?
+'AJzQ~>pv83i|z7YH $VNLC*6N 2G=<=c@^t2mNm+CpZMPnμջ[w߷f{5wuq֫?6*YAn֓a}azmfЅͳTI Ò(6c'~\,le'BOY$ӺqXX7$z¦fwN3ߦ*<Q3
+<Ԇj4Bc˽ŲS
+&pH^FHԃA^Yce20qCHt~g˩R`ڌ@&.]v8@A
+PemԶ+4{Jʸ  Yq\̂1t|#2w/\cD1ԘդdйAP
+6bG,*iẘœ4e!Q4cI ^!9L`⥭*OT:c>KjZxĆ j#F\M֓wXS>BQcrAOL-IL
+I7xAz"rZm-X|`[ HFBg2xl @ζ8ANNQ39aǃ\3VTv mӣja"diIsCOim|WRDs 'SIƯ/2}*T/ /eS cwX] Kͪ"4le D5,O(!:4) f
+apa-r)[
+|N‰l]<kA؟BG'3쨬H)pύu@Í=
+,e. B$e>"D,v&/׍CT J<bC
+I
+Q2jw¼@4UØ>G>@a}IQμQuaM$05' H j?sM&ZJ7S9.臁jY
+gbeh @R
+b
+-r0Eq}PFj'uI3 v; ]>7-y&љ82Cm=ػ'm(ύ˼n0n׸U AdHyXy
+X=t Iƙa? SD?1[/sF֒@w x=i4t )iá##‘-VPfrߑ2K,%~JO2l;)lurY}ZG'=]:)4n'.mCbBqͭT;gNf4Hјlbaά#[UPcfBUj?raKS=r)/H;P=BhLY]>$]2fɭIT9 =wD+}8=566@{ܲKLKMB7BrN3bD16UP/xU&@Dt:jYϫu!"Yr=F<&; :A DR{_V2y$[=ilHbv|#pRjg8I %XcҰ>0^-!4bD'wsէ[} -
+jטL5 !)-:ޞ|&ݢG!1I[D}˷0_$V4[ꅖ ?DJha4!ʚ/rLQ_i*QО=.Ě`!K>Y
+4 %Qۀ`GhQ **T>M::wA~p9mھv]-:{f+ fKeqTP+o udd{dZK= uz}pZίY̋jP]a=!u#{^f<|g=fm@$4Zы%H=Zw\- L4#pm\1->!uNpKK%9L:Yܥu)KB䇵ܭ{vmwD~am^S^\z+vPrL[X ғ֦W?tӠ dӎ<&lҝy<95$8"+x@B]%(X(@$̪~VQk3%nMj sy'![]{\~L.mǺMA5 8k"kުvJi7,9ųydcc=kԷkĭtER\hhҌ66-QiݏGTEEl'<JQxV݇q1&;Y`A'hXCfpog3۵vzb^HM̒?Ϗn.ɯ+*\|JhQ<Q-7ڮ=ޕ<rڳ2L""C}ῌKr$7 DLZ^-fkP/vh$-f-*sXRq}5o X`PmT$w1԰r
+Xnxۀba%Uw򕜣 ZDŽmE%x0lZ|pQ+mR8K%F~e#d[X鄠ucjt_52P{ ᙓ<#y
+Sn%4;_P3G0
+%!$PD$G:T`eiDo,ӘRyi#wKi=oeى~|WJs )G W-QQ!
+:ÒZmGmW%6R|Uu$9Ai5 8y֐(J'|_y
+ G31,|5 Ʋ
+
+yˆT9o)UP3`gz`ˊGv"3jOP+$"8K
+X1~BK$)ĨhDHjBP!/9IGlTu-BXA`m7%?"A1Ȁ!.(_20з;~#;OLJTG$:FT%߂`Z]"kHm_;jO3Nۃ
+HdڇFUa>&#at7xr)R\;d+AY y ུU`1[]!XNNt&i0ҡ$(Ǫ˚VĆ"r=o%&U!I"\퍓ϊ=Yw'W+72˜IN%j~Brovt캯*XnkXr%ûZ!$y2$kh'>%8b[n|G2t1ra`pXfTڄcuC|dOwݠB
+HMrc7 O;Q rn1UY9#S*3^*O]{{&]a}Y+x|۟F Mev_Ϧ;=3mشWh">;[1#vbBRm}q}ղ>Vwoc(Ys8ҨllV{f2z|WH] *Di"U(gwt]!th.$lk9Z3Mcq2"C>dnւZ\Im_&xV4:9-9e3hN̤mRqeG'Xv&f0{&JB[y0 rf9 B'vo6AA8 晃ȅ07Tuje.p .()3>rnh욾EE;JɞEZvFgch7Agۋi\IM R&}Fso. 4WCH8ےn[ju6?uO~=i BG}aKY2eu}TP.ڸe={
+
+h<7)콮Rֺ\&^ds4<a/1[Bw]uDkdJ+O Z>;\ϡ/ C!F'ZdrkatOӯF|D Pb;6$R<HMp=f%iQW9ch] l e[dO!W}BOשS(3IvB;9RLxab;d\?M5JrG 4o{;Bu|Z9ax;ɀf@0 SSp9Źha.
+tbhBý8Yy Rht. 靥HL{9z )֒'(aMRz !9`C"a[ΈYEYS7l"rጓp]
+:'󻠏ľe) O>SJg=8ɢc4+|TS 5_ vgPzR @7U=56rVhX2"iFq1YGiFRKO> } cCWHBp|D]JTC.`49X*kh
+'E3sri`(2<{r.0J-ZD -:^b: znin} [ +vN x2'oD80
+\*/
+u ÌB8oݱ'K1;'|ፉ=t7xY4<1܀Md1 y c;OyEȒ1%T
+m)OA.|^FaA&<+#idݿ:Y~޷4
+a:*.8G3
+f H.kSQAZY[=m?[ݑ=R) 1goy}:U<r](
+#^iL5JOȧS§J˃@))dUOl%
+F!@tZ$qV$, bAPw(~.hVP.֟iq,M'&L|lX6Vo!Y}kF'6~Pd+e$g\(v6{!Bxҩ U؇ċS:s* =ÐkF
+I !پ hQH-B{O e}U3 _fϠ<̶'R; %;*kч~+A!
+ZgCz#:LpK )Njۀܺ YA}c JjIk着] (E/N8O:P!߄:|iA~|JHV!|eýyzjva&My$Wr@*uZZ[ޢziej̘
+
+fV NRT©Aq_j]\Ʋ* S#gO# P͂KN i5TGޟabz0fo$_?x?\H
+T>:W> Y酻ߟcrSdSDB@L`J ^~(bX5v %ΚK5_V%G˴!y ,cS|(ѹhO[)} \NIf&S]!\ɲ9l&;AO2DwJeJR-Q
+A&jW/vIL.o
+3F>y&CeK]Q6"E%$rFzP781'M(̲l22ˑe3ȉIOHFΨ3RcbS
+\Y$ed%' [ I =3Ɇ7%(Kajy@ٰFj<lVb(K#nӿrCوC(9Q-W8,AG'8Pge-IFje9ԔҝeOOStfY~gw9alFAvnq־wQ H $K!P]kEd7vZSQ7m?-W )<*w9e$*h9Qp+B`QQ5Z.J6#XWB5{ԖӧirCO^s?0-'8]ZD{Iuh=5%4b#9֬A\['ﱦyɺIfXpB`tm˞TQ2ҵ3
+}f:XNpB<rnޞ|ü$$Jl?6E%/Iҧm C_0+7 ?]HQIɅ)| I\޹U7EZZmx*+]7C9rz⋭PmqM+=&2<fY }c`yIsrK c҇H. '6Q0V\@y":ř0d-ݏXDHV%ƥQ*nSI$wUA){pW2Pl
+]RDYmq^JUw|PU_R9NNU&kJ& ɝJA+糸>9Dݗ15UpTo$i\gӮPqBMJmE|a2
+%#mOpmkNb"ζ* vM"5="~n>M2_J'b]:U6Զb907i7YUH3d/õꥡWGN-Vb7u =#B37-©6,\@xeY53]AwUK4k)qK,'NMK
+
+V")lHC6U"[RQ.f[Ot
+l>E4w6U!+udjceZ.~'4
+߅A%5mm489}ySt 4ige Ve|Pipt4ˑ. R^.r6݊V ~aBSiS$۪z,AKX
+<KN]UPvЙhcN J Gq)O?;Z`\,K|1E쐯&i"{ PHTdv H* J QOĕ5_ Nf-F/*'ãhcjaE)h Ye}=we/?:6Z;`j'[)#Eɷ)J!~\{Nd=/FHŁ ksOrݕ|Oa7"^W
+pw1p͸ wb.rVpG59lI@r,bR6)Q:
+S^paJksPGPѼH'o@?0-dU4s/y>GE[ }c@Qp:cT:q/80#~!qX󉲤0$uJޠ7Oܾ@a(BQ`O=`a `1J\ vJY'Xt$S%QxHiZEh 7,|#X-VfO3_p<mF^JYlT0ni:|)q{^6Onn6/`
+{YZI7#6v`~<E<゙"5eҠ?Ul9Q
+(e躛M \|Icdw)j LJXkY-2К)}&.Ï$}(GսP@fh:,B<%2H\uOB0ǧjhP*L?F ߦ!ky*{؝bE٫h@jJ^0SL{~)%)vѧ>'f(|JI4[)@[$}Ē^<h6xc~,̕4*ZV?s2$'+抢6v!fLD$F⋬hO"If*+L5?kq"ya& ,G<
+1ե2ô0$d=Vt3߽KXexMW4S`5q k2`c b/Ɋ(]CĂW҈'aԴePB4<]xI¤[M+"/X2R:"h-><„톔{oy9G%C B~7N#O\]Bm!\;DLf:@-Հ,Yc Hg %7?E{V\kKnD@~kr' =اZ8Po{y \t&U|K=3
+b1 T@h7Ck.Sr {=H'"⺿W4R9~2L89,3^\EdCc6.<F
+M09,1Ĝ.ap\圡ɳi÷EwwsC) ?<݇G83[ӄP|( ԋ XGZ#KCw%`L`UgVAJ<fi8| ?}|@YbBޡu46M<Z17,_ȇ5]ߔ&6@7R8#pY/x
+.2t&=[v!mi3Va+uyaCu†s$x^٭mBqpJVErLĪP^yBHNP㠅CdMu2R*s<)u jYC]*?|Sc чE0hq߷˯*y$AP$ay$&ڐ
+~}
+% kM{OɄ›c b9ϸlXl)7$9F5MUb4quy!(4[?д@(;O^)DH%A
+OAˆ% 4  8"W<>?YXoַ7YN@K)B B:^@aq8n
+70={[no>,Z{ qM~6\XuƧmQYU<qN U'V\)op, @A/Y@@rۃ7f1e"a &zο%-$25]$ o¢):r]ģi$a6oT+YD4"ur9 Nqh,h
+#`I4 \&
+ ӥxȫl%% JXKD̠Xy(ٟ"q.Y~:-ˬ<K3n ZLFT+CJ.ؽ9vtvnlz z:O݋CP~c׀AY%Zۀۛڪӣq^EW>c#\n@{QJp,t:ƥsTDu 8DGf\pf/p˿A\t˳0*Eib^3ŴF?lյ|r0@3P:~'!MSѯ}R72Hi6 sꊱ>k~Bֽ-X!Cՠ!O!M%ȩ\)_"<7CPd%CSHS^ab{HS !ʷvNiV3#N7h4Udŋ|HiV.B8~NiV4M tǔf [~3Yc,`3uoǫIXÐ;e4d֊&T ;4 dQ/84<a1ME
+]ǂNTd%Xz
+9&YP짢/SaW f%lN?gc=4 ºSJJ$#^<T^l'6Vxi*(L`9 3ͬI6{N7m{N"D5O9J .ןr
+<4VJ.E|iCӞKsi3GL@~ ΁t9'ihҖ<TNf-Rgy#SS)͈T8*'GJS /tn)MEJ!ϔ
+\kE!*Gҏ!Č wk#YI֑q
+iKB{!zGA2剎!M5GHM?BKa|:jMr HdҌJLx< x<aҞviN<jN`1}4\N!NjD,hRigHNj`yi ZL)(ÎΩ(ZƠXvV_a
+?3PD^ϙRe¿RQ TZZ()" !{-B
+K{h{D$"|8GǛNћgD{t:E4&>8D9Q)ιE(~gDбָԽ;F ͋CCV/cO;o}8k:L@VB~ hgEuz񍰓m٭)B˰
+DSMT@DS!71˯bXJP;-L9Ό5J141i>^EVB,LFc@O(aA%N[OIJFJb^%u`
+ۜ`նK'O~Y$)ԱM:h}KS%(A8ISrjQ|1:Ny+jrNq*OW Rh<Ο"*DRFCN=q- VE)o|^AV@99v/;`+(׾J)
+ACAm,~e7+on&qŅ!)7+oLXZ(TD5w?lCqvL.&jNEw2G
+X%L32}.l'
+T@;
+m
+rOO XI#/oj] ZXU
+vH
+Q*ֻuAeyFϡ!垎zYh;YQS H $P=\ihOa!RǤ؎9Χ
+1ST.Yse,QsH7 ܮ&:/xz'&PP18˱s_j!oy߿ "L`(.߶!s/=j_rXfE~/(I$ t_vol þG̱CѺ,doKdے 4}FߒY BxQp?4OEB{5ݟf)7aMR?׷_j<PH,ZD j*F~UE7RO0X+
+^O䎟1yyo{NDC^Q5%{II`;`rE,ņ l,DLȘrj S/c~t
+0l؇e"('?rQj/U)sA|Xc)spZ@Ŭ#%(3eʐ@mx FNŇK!R Mzde.DX%2 ;6:;AKcV L҃ B +cQBnFyח57bثf968#y9F&EL5ujA׉J +5ʾ~4%˵}P2
+Dwg d!_D:Oafu 'i'i(%Oಋd -2Uf-\jĤ!iӜF=k 8h =^DӻMSbU@x`=JH0g&atP¿'6RL
+^l%-D)o }r\Hp@ YΕVxrR >4MzfA)pÊNW,S/xT&"U-pq? A<@fR6 BBtNβJh`j
+CkL'Veڿ|)2 eRDz&ȂYM7`Cx`NFL'`LIe:y$͑^g?RHosIZwGa
+U#rl X8>g)fcv->ͲWTڠ?^E2pre4<F iwE#r3(m&O>9H02eX._FvĝUQq}d@qa}4C ,*mfE8w;@êxw,
+-U~º_a&Y4~jӇay,vQ?YhT2kb8o^ t+WISN"$kn"nx@[֠{*_E]E lf/6AU0 ʠ #ێ)aQ[%jz|:``yfˈjh
+$M1쿵TkP.y;EIRa&Wg'bxo (:
+#*v8FU}ET-pXSվUhuHXetݔ<ɘ6x ũƑARC4urI6
+5SMg͡@. DSԳжJ%"aGQ55;kEȲ̄ p ^fA0S!sL( bЄr˵ȟQJ/f,x/ נ: ΃i_;9,;]nhv+?A$Gf@<jvX`6[򘄞!a ҍVKi-J`j#>'3v@D 1]vI,ǐ#9m9uyaǴ#FT#g&Y9W%tm`Na[A-+E(
+mlkW:Y"ǪXfi
+䉕7kyLGZ4eJio[|3CהK?4#zD>Sk¡?vg}ʪAM#]#f+:a*Bں7w\"kxݐw$DAwc;sqa8|GmГ2xhfħ^s8.}_' I} t}GM)&FC:U'KC9ngxL="h)6WP$RO \}T 'VE[ RQi~qgMj.Bω0H*ADs>v~%4lXuG$qp?J)oh))JA[-E1KL<C`xv`|KKmR {;m^h㇜ L6a8h%Oy%+>s ZWk(OSKv?H|KޑT*1.GUkw兰2p)]"mX: mTivD<oH>@ qDZ)N"8!m$Nii-̚e;;Ҳ_W6i9uvCZ܀ ˱3 룳i itoEXELAc8IZS` Ydimb~ŸeY5G%-2%ֵ`Mq0QI?U2b{)>cnΕ<N/1)Y^%W#Ua7BcNubSQ\2[-0T7 lS8E"z+bZA}0 7k*ᨗ@$}y< m-2674ա/ߊf .T\V^C6%KSj˩ r^sƏі qjb?"T̻H&7roE._`> 6}i#*ڳFQ舠"ͩz7K0M>q8h}(~(8`a6R$$nɜ/vU)2!!^/R6q٩|.d˄{<tǿ6_~b;}H#zH@$/UE̓?㥱MͿT L1$mmP/Be tQg6vԪ2^BND4g-̡%ڋ#3xT4j*B;$%+7bXӦU}(xc:OjhZ/"jT/4\RRX*BN"<4`M
+ƃݫOg@oe8chଊ
+ OoX7qse!܋ˆ ĄCꙏ_0 ~M"o:շt$x4h:#Ú3$Jߑ%R<e+c|Iʼng/<tP_ߩ6zSm-RA xC㉴9qaYg/O/1W 1D#uZ 5 hh.$?DE #^Ĭ˭Vח5ԩTmǩ5~a,"FUkQ.n غWdNJG%C'$QŬ@s 
+u?LNM \a3x&K:8h|-%cӶ<SW 3e,KtBO3+Y a:S\">ycE@\)yLp쇄xٗt?xͬټ+TՄ9Є2zޤ
+2 \7ok4|15byx@&`8fs}c;f p(%-h8܏08j{Z*Vޜ6*7>AQ"Vga;i׼E ! fV,@`snNs QtB]"KѬ*v4Sq
+H5 .į6t[ A̡r1_tRP}VW/$-`ifd`!~^kyVͬUz~ *wxQңm
+cEk!X6D1CWעZtTx**lx 9uFbON]`3dQĖ9gQ_Js z rziD:ac`S]-`|ܳ)m߶U~!Ng H_H斸U4W4FqJ\*+MӮT*A˥ cY%s,Mxy'nq <D#]^u3\6I(h:*ȹUj
+vkrIee#c"RN|_-O]
+,(>Hr;{ RBS2Tj@شr>˺5dL,ij_FYp3f:IC
+Xao*uPFV2 w=pvc|5$%-zv-XP}[ZL`zu]I/CL&a
+FO6
+)'H>$cP3D 04QĴqfjbYM|o)yH8Ck
+Hn5ReX]FV1,z=LzT0
+,Ũ!?r^XJRDmW.5MM?o75? b
+?*!APT
+Dp((
+%黄K?;%rR*%4֙{wIWnK:qf$-A9J;$?n&]Q7w:XECPE+K8 P8}
+яExCE{ L0dp1tNxi3ȅ>V|ػ A|(WgĄGi.5gWSl~R*|ϊU<ΰM QGh4+.C*s:=uhFX$>~ TBcVnrS89ʟ
+ BR9e۲l2k]T6U25| 8$Cف>KvnIt'MYcOz2qIR$EfEoנ9~&a'a. ug}  0 Sn/%8a @5$L$ԃEѱAOoo7kr_W$HIr ^_6Q^EE\իU!Jf%+GeGteذ!g$6;ebFH*AtPdbچ Cz;~q[(;6ۢ%MSWH=]CqPO了۹P3r,6pH1Lpat"̒²|"
+
+C VPbG !hyL~jA9*JFyv@hTg+"8L3͢&˼=[Z{䦤W`""7n3X" K= 2$M0l*Z.pXpf
+KG<Q0wQؤmxĜŃqͦ=&Cr+Q0&il&j
+v NoJ
+ԜYF0ٝ6ol+neF2x)͡:蔻:)HKINe@W?`((>MϏ´>z*D閅>dyt6˻QG*
+ 9ZhW^NA<[5 ÈDZ
+JS"zc:P:~p
+-;IR1 cɯ\ͷw RM4e3 =wo;!J30`R4unET>lEA%0EYQ|֍/&o[s÷IM R\Q6`E
+δQNwU8P5@cgXwCo0(a^©X\/Cc~:<#N딏 R5f8:s[aGh6/M%(]??k&@ALWdLd >"v7C|B9Ff$("&FQOEөC+x%tE0437Wp5kfp8 ("P[ǀ\ Dc($}K4'9V%EU~Rށ{
+HA\7DOw#I
+C*>o9w%f9ϫhu<'-BB8n"T+^3oz2EM{MמCm䳶A,+w{N}BX:yN1zΛQjDbt网=e 4T&^WP)y||{)hm̳{?:ÈO~˚&-z3kl3AL! }KФɰ=!^+mݭq7+-mq'(o Y"~0r7F9UN0?Gu
+ 0eOq4\6zUvܲE/tEFz hς >lJEs׈I&3y"mWb?\ ƭ EOD B)9roߋ&t*lRp{؊p$# 7WK6N‹52l{r{Gۭ~s3& lp+#kA*]rVtCȏ=n^^ݣϓH
+^W=!w)Re7Kr ÷ S D
+M <HEs7,mȷa@B~@HaՒ;.Z#&n ?Bqwp=GgmX]{<Go6 6.mOxÎx@ ?Ԇ䜚+ݜn*0)<2txFn[ Z=D^C`¸5)?J
+foXܗ}T!^ +EtE.aͼ,$H\`*/5mBf_5kY;SdzFP<X:;uE^wc!FJ}¼ uLp67ʐ.PKWeX)#+\DAا20K$F-)['.~b\ALR#>#4 uxb3(Ԅ ~_Jf(!k1ZD7z>L+^Ғw
+_!,/;%/qr:ɡVVhg%BQ#cLY,\pD3v$GBLQ*zRk%k\xv~ѯ\\@ .<ϻzvrT)sL!reJ5VB<@Tyâ6P'mΘq3qHg_Ai:t ²+_VTހnB6F)DQ~DÜ"y5Q"j|XkdJ%JOuQșk{-4' =I
+%q(6G+b(RHki1w^'ᡗd Sz[NH0ʾ}2,dtiN>BMqDr|o^PX(;9\:,C"ǡ= ps}ZjÃFVHhVtD=@ roĊ*r1t AW:ocC$>@9Axj/=0 ľN01ka:Ap[UY\flRB"t-wخxH)@l5|v(3p
+N1~P
+H :Ɋ
+ۘa@=*-~كEߙE9r:=(Z
+*E1jA{Mcc(\i `,+8 J9s r=+fcs8*p֡_ҎqL({/! !IKt_?uaᩂ8@
+6~c@U]ZNW8Ԩ3ւe!;)i;=N=831 0O946sަ#P1.qL ERoqLGq;0mwxczԐYͻ1a F 
+(/r:M'j1@x6UlTe1 /qLW\YKǖ, B8BRKS=)"TVqLk%u((&Z`1
+QrFNyc`4&=^Ff108Yž0z(J; ӛ(<ayE6>/ E7$ ]\B + f8n-b!VY*0?:2կtGaaŐ6e؆R0SnIKOqC/6O" 92޴.V?ȶzHlvAAj'2ԊʇxxQdN$R zTAf~.aspeY⧁ć41M>H!ZH2Ĵ=C^}LtbQFrU~enϜVzf/K79!aR("cmC)4 {:ՒYBFBcTthgj`m}:Y!y
+A|Y$>Z70UU!}8 S!J'c64vmdŋ6x<e lӌ ^ɲb E.qNжq8}e&RIE0<ޜ; ژ;ZZ&>Yf삳L؝qsyG}FFP'ge!HI~ߏ
+F(=qwbsxM9fn|I"Nb:._R=J
+Vd2T>E^ӾCl"h%s 65u$qK2|I=R?}EK\h'9_ / N؋:Ln D?nJ%e ̿@ 0t&iM)KA?~N1Q !DZ<"2Is-f,KW۵8<<$OliC)OI1.?`f0M6GVixKV~C!уbdJ,Md`Y7eA{CA!b eI#Ze&Mao1Llڈ7Jk6P,Ā$_QnZrq`$kҙ˴ x
+9'. $M43yC83kWư˄ưId2IㆁUtZ^%-f@"&#Vڱ;
+b|<Q?Zl(/hF+v)
+Qջhx9,n-f0D'|/̎
+&w^W|AgPg;CɎßxrԵAȩ5rh:ӴBEP('Yabh!'DB`9  -v9YQEw0@M"6T-dmROX;K2jqwJ+MLU|M&K`&Y*CDI<}韼qVm>x
+KdvQ<9׬Ѝ?[ Ф՟]̰H- ~q65g&Kd)
+I%$6dN܀ܶ
+#* H !&: -& IeH_Ug(ei.hǝ1$#&9z]v4s~nث)wԅ) x<Jfݬf
+kNJ
+~ϲE^ 'g~ևLw 5tv@X!!#<'3AG6 jxz^kN2ϲ9-DK4KK Տw'k/"C ϧ 9Zgw^ ,g2gIqm1 )!veB^R~mi`َEmM>kYOIDž)ꌱ/%_KEn5N_tfvrUk]"%4<#-lug8`C%4K
+BrT"]o2l0!GK]?Ւ`n唬b*r)wh>nkzʇ~4ate?;B/j( j%x3皟gםH< JBTX<j%.EŃ#R
+|!K>4W*2EW,a2d,x_l%6%ޜfdVꗚ^?h8%`KnTxp,c
+,G,3j%,Pĕs_hO|mhԋR95 JBVfkaM bS5t'(cMl|3eFJhN0g ^!8UƘa7'U>Sۏ}_7O4B m]0 ~k ŵlr<$>zOƜ_g I D:~@ +
+~qbORm4aA4lr;ѵWRNǚLrKVӨ ӥus*"! iAThcVV_b!\+iԕ_#abr>h6)MV4+z$Nx*mynQȈ=Y+" ڞEDϊ4ۑkGkðR4u<6ƗFA UN?ck(ܹpئ[!SÚwsȘ亓+jALEHc?eyPhv%ceVYcVh
+dDo&ʬU{Mv6~d Tվ"^yXPa@X ƒA,3ǝ l$(ϡ3!!1!1iT'U^kx*u=<F6C܃Vզ? n:ȿƄ&#8[‡vŃ0pU?!b!$N冘 *:_SW0Y m#yu3*l)f~fvM/*`7*2)uoA<^-%MI%dŖY@d!\g-"QɽTgS Eԕ*#+Qgc71&1rMFF#YG%r@$
+ZT(B{B$@6rD/b=FOGe^u=/AsKL— }PiKV$e8`)
+g g5Յ  ͔ܘXiq• ̈פuH|0hw3"[#;4b tIHe
+|py#A2a6(V/h9"g!?|7rJa/w^
+/4;" YcPH-PrBAL_X'aXo{7[t󥟸cdIpvNxsv|te#]3VA(H63\a2i$;@hK -="sh1J~p @+֊y_IN⋷Vշ9mޜJ(G!Zq/ǐ
+OFcN_xCKL%*0IUR޿۫/j1j'ͳlף퓤`zl䄏?,""h ZR\5 qb
+c Qm16tkӇ}NLHTM%9t+vZc"=(4rzuv9<buw{/vz
+F-`J<)V3]BWA'q/z,o!-8dmC%WQؗ"4j$ɄS5O/$8_.UJSDVL5G+Yϕ#Qn<]2 ӊcd1ac_N
+2&tG"ri˓D.JnL2q̨=eQ>4
+nGa XQ_4UuhǼNQ_J~|? ?,A#*fUXFF^#[%i%㔠MKJULjr!t.=t2)&Pd f*`'X
+Y:E cBk\"-z `K<(l7g@Z""LZ+)B皆5CBz8ηUք`ظq}%pF6_zjҖ!4wS_4l똞JS&viI_݆gql/_%wE^_׍'Hom0(7BэV5' RR_uw]}yD>]EIUY~Hf;fz);aJ 1Ӝ5{GڲcG .*lM(vyB+&w+t;rEp6#%~aq^(uEd<`-C h_J VCAEXTBKĤTγjW3ElNگAMVžAL{ħ6a 2;FA^yh[@'seDqKw#m&JS^lt%QWoDRztS"vo\ bdV"9N_N;>Շ`_X6 Ϲ6;c:pDvFdW4y?-G SHE'bmqh!!ilP@m2;1`Hr;!q2p)7'lz _y]3oM@&ѐA4·#; 7Vs
+& 7Z[n#psԵd+a `47C ś}P?GUTmp!)pҰ2CqbS3 j+kX/?¤(9o&Iĝo4;{XR־ze8)LT/Eׇ3N],n{d>Ls>6'@,ei# %/đѻ*ۓÜHpSЮyݛt=nϲJ7?\h ]q\r$(CghfnA
+s $0Vk~ykQ\6VHaEe&xw +$`9O=C_@h TB"(*!-O 9k%R`u0aY^h,w~A;x,h>TxTgMR$A% GѥE"Ꮾ:s`h]SGRtk,C [JnCQaب],.q~saL
+2,G!W_Ŀ
+bY"YzinJ \t^wk|
+HeȾ@% CpISneRŅ<VԤn}kt,g(˵(iv'S/uXŒ4:`%ݬfeT,qF2O+^aj`Ds‚<% <%&R`U52k.A9/?$IE@򘬚oF)Zq)Ue.䄍L+a%EPmB-)+}鏜B媄Ξ=H7L=1Ü> VJZKoˍ9SQжmJ3 5>)mZd++y**~#<4mPl)WBI:U9i-$:[ː*%k(JKclݿ&3"U}:Yuq·&B
+J_f;;-\Uq"H3>VÄKD,2#{F"uJ,Y^CаRhJA8^RHBZ>-
+5ipuB bIxֵ8-~tk6=guf񓯼tOScեJ M|7^V 3SЃa&a?sSʩMglj]'*c5J䱽m,qҿTʂ06"Z8 PdJUm!eE m֊;ҟGG돬H#CIUdh%\h7%oM>%Ao
+o_oCk<󣤺o'FkY;ޛK>K/$9nw &'s mo[* H _A@6oE]BI(&Nh\> x1//I4%+BRv`D\&QlA %@_Nl sy"uqr:ގ*I),h;[s0btCLa"P#LY++')y"(@tc*>hgűޏI.gp*sHcP4~nT㥧7d|+:8Hx1$Y6wvsj-"'vc#0YN^-P4K͈ؽDJNi`p~a%} / .:z4g3U_3TP2KךƷˀc~Q5A2_􆰗Q`*"W_u)/a9:p6=*OB"y1gR?x9eCaFגo.m9|M?*30"Os(bZv#>o7nBQBh`[/+-P(.%bH,L
+WŅfdKM`-D5e:⩗!`
+pc`%ՐWIgD82>.3Wc&dR;&J MA2xt}^RZLKk!_lUVԓ;!%Cٺ$*`) 7n|<Q
+1Cq˕v%19'9C+`^&`nػ_ЈPW(![,d޿tM3鍘ȝ?2LMcw?(eh>+( h*Ic6zv(Z8q A,+3WJ@|j.g#Z)5SfB,~t}F/ )`هL 5 >^ Xsa$Tl|9,0^kS
+8p6/d9Y
+Dց*I*dp1nI( fbz yf1$\ݱRˁΌU8QXʑaƩ?8qYE27-7Dn7\c熻Jnu*iE&p\2@~-I׺0gB3:UI𼩫;k]_YS
+W9V
+5)`]0͉CcD
+c,6굍U'
+
+7kOy(欚|m=wi}*YKhgCO
+c*ܓ.[ŔV
+iH(d߱#E^y5ߪi1ͫHld,*#}97\cWBe탅8v ګ"m8I
+Se#?e
+1MVҡŷ*$9~]S7-)B4Oȃ➠UMI,W%9,7_Ǎg!_\D?_PeBw.-%S3ˬ35RU
+ ǥG(/KΓ
+6$7` 3Dbё+1m+^Sƍ4c*r߅Yw
+EAZ/l4keR356 j Cl)HdQuA pK D)* +_,+5A~&}D
+teB
+^'(4)Uh:RPqm@v"1d<mԋ x]! KI;řj9+ݕ* b["i
+ˬ_sCtqAHRiAx_.i ~O?';eRJ; h5B
+6-],ah@9KHD d ZWHzXlb"9d(%t
+?٩ Iлkb"XJLĬ*z1et+}U1bFXLs)(M ̵ "n@R&6TQ+"ظfl ,Aecǐ+Y-_3:ŦeQ%&w{bv~0;V)=tc@`PPb2 ʣ˥r0{T@0*8e><![ ``߬(Pv׬7 *P-3J]R&q$af`Tͅy+ y[$F#eWG"OXr0\
+HAr\9DO;S=Kb"fv>ɲqtDZO@"h}?Z119zW6l@cFk.cAN XLB炘h@ݦF>GSS2<:'K5hr  Mx9o^ޤv?7lX/#+(yL~12uι 9LL[mDçڌu<F4~ShX~,!r}4uEHs_[xntF;d'ׯc{& ě czi1Z3ϫ~cgbo<f.p1IAb83өHM9|Eԉ84ROF_}RNQsˈy`TRܐN;A Qu2ھ*Zezu>!wTIu\a Sv%z7[x,Տ+JV?߀>߀R+hѺZ 3;>eRe/ZI--]$"=1O5_NQs?7[B} 0/'CVxB!(f(W@R! ųfM %u&L58W}!:em)GhQ*2Kw$-->O$jĚXd_ HDG(B[~֡RkdtCb# Fs-Wc&B$aCx981h90$J
+69PSIT'G 72y1^z/cJDNb҈~ITUgC̨$\%{=?惨Q2eHΤ!ņT[p?],UCbDkt1~ڰ! )JքZ)6è1r
+ yoϿy+#^OL)X
+W|?9-uAB9s"P<cC(sN4 Uܠ "PK֢4 H,܆rders2 VAJѫ0Di4&mPPoe'jKB>\X7=Lޙ)[r][_}k=L<Vֳqz
+ 2!q׬(@ dCp6gM֏?rk]|1b, R?H]|nb$R JkjjRKzxk(̬5,@v)EsxePy$Q
+:Ԡv[25S\Y_amY|P+/θk@`(<\W?~ /JÎ00EhX㴄5.8,SaC595GC<53 ɵ2à}SK5 d_$jT$zCUlAT9n?\b3>FXе g
+v]`nW/yMd>%Q8MQM=[56V\>()&
+R߄E.i/
+&`# Jq3CQ9]Iw90|)2`_>[@?siqXӼ'>b<m26')O"<Sy.s3S%*?"meKɐL|TDq9u&u8r9,D|UNj݆%,2d'uɣ?juޮ1UC l3QDzfp7nU krhBznp Yy?}0iWX
+4h`u6H jmgw'x8ρb6L?d%ŵȷק7yid.Pvl}n1E
+`;5@$ ¡nE??q/ U; a(%ȯ
+ l
+I+h(ZExݢkG4pްU^\T~յ̝ WE
+n_mɰkY.^SǯP9[M 0Hk[Bɓ55K^ĉ(Ʃ.ӕ ٜhÚA`~.6sXRѪ?Ly~*[ : K_Өl,qM6fI-l]xey}k>Mr7-u_W d&W#?*thf$:$eQ;Ew re 0 鲞{wSPJ1} Ѩzs?TYk;%D Dp$ b%2RN:$W).*Tj?Vk֮NDƱ(nwVV.ڃ*5w7jepEZ-
+E
+.efyt"{ւ` OJ6Ea+.7Ph-6%@uڍė$Af/50"/2lG`oLYMV乀O
+v6'gÐF8n%Gs Zq\U*X1>DA2 j `0iVkGw Wc{( h1z?z˂Yw <ւGS݅jGKa*b%Qyr"A(s5(206q@QPe@)n<4U«3 gQ80fԕ(&(`{ {\.
+pnO*)V E7x7JeW\K\e嘩\8Y|[f*‘c/%OC `I@CQ nC`7YSf? K&P"t-A/e:(u#Yf9~c(+uW)&b xTSgŚC-4NхheW UG2{a5PRs*J$k&nJ[)́KZV3^&q@=t`ҷ
+D?PtuaP7gVj=gX\waE>=6|ufax|Ϳ.${#a_ ~tʻ398n8O{p"Qn0ݠhcu6H(gk5wק` A<d#Ȳ
+7"jVJdXtw2YV\v~Y{/;R׬Tjg]^]^>o43v98cuW<avd1cV < /a,YۮQ(!d`KV/I yzϊp] ń$Т􀆞}(#I<6{qF1 x
+6:
+ ̉c* `_ZxR3]ͧ3F8Ici&95+6
+R92K`nSZr4%D/74wK.QJxT+F[ѻClj5>!F|,\lE)j]Y+A9sE͒Fn.0]vڵ< .P4}Z;m$pޢa ,"W{+1\ R[+,v.\TpQXsTgIi/ RD_v`!O>&;0'-`xua-+{eԔH$885X$0z5~ѩ2žc Imbe:yy 0K8.5ΤV
+Sd{HT;ۺ2fQI>?<j
+׬$
+@%"]PeR`c>^D4@\K0v}MKbsj;H
+El}A"cms`D.s XhvLD@}h_ku/YS8zX /eX,DhJ|B'm!NB
+ye kXrK_l{ xz|v<}=4tuQ = 5VɞiIQrdE
+QP 
+${!}•"TraV
+u,LK T-пL#..i 8pKֲ!?mxs 0|I1*z("Qjq J?2uy@3CaV/@3<=~lxn7| C<ǒmo%
+t6b"<Ta%
+ݛ٧?J@Q v
+'"B
+(D…D3KqFa3^l^u h%y)/Jr%
+81SvS\ nnM|9!uAdy͸F!fIJ8 7Y'8]LeΦ$^?4N$*2ug_*P-t"\ P;8xGTIAo=XF'NVϔBWUA\)wR_sV'PTI5 ۬l߯ {k6 >B&_t ^4ϛU(+sJg/zf"'BYyVϡ0M(1~]EC Xݣ G 񬓔pI"䒎2
+1X˜*{.E&ua,i=Y&SLMnZeR2zӓLj
+AџLnؿ#lu ƞY&@b[I+D,2p8L,Rdoyd
+\=0VeߣG܄ܽ(X1p~?}Nv
+A?C6.#}6/w˾g î=!uq}ȑ7QA;5Й0RLx%6 ˻-\
+N݃5oGe-;?CƥayvvҡĎBmYq3ۈ W3lNqw-^+&5Zj!HU(5*9>=IؘX{ϭYuj0\!B?j)t~W-0>ug[?/՛vFU05d8滙bCrʔ:W q-;rp I \/*@$6.YKWeN3;5LAӏ_\S'ԙ<48*4[u*w)^w'>D?;*])wEުn](!$6`%a }@Yd\%lƆ*UN'{?ͱ|`F#5I溰[](=_;Ga)hϯ
+a<DϛHY4<\`Fō8 ptX(irZt_9$U<oq4ܾ4_Ɓcj
+9]pq!R
+{hwqb–- \,  @Fspn8n[v V|[%F)2Ky3%<XQwl܀B]ؙ| "2Η'P}8% @C7Pj sB|޵4
+[-,8}걙R<
+׻)8i%Y"m(gi(_q`+itϓTlse0RyD=K̮݀G}Y+A"rH$r'O~P R(-(,8JPL^;I HW!=XWIA'LKK\sLmYT)MzSbp\
+mwpg<seQ<ݵſlw~Ng9<Љy#Uퟩr 23x1@kϦGfɵ`~m mQ(oDsm
+CId
+Jn%`S+YlXp@tUbC>4Zjbvѭ{05<&Y{bF 2IwoCX}Ę軲~F~/7yHhrs0]!A?Tz+bf4 \}aqEO~s/qSTTj.Qaf|[(a]? 8G|=rL/(r!!c6!SUxueA]Aȇm?T_ fv4oapu|Zy]:rf$=lhI <--/H0L[*LБ,.)#/U|]} IT0 lA9L,/I$m<—p?Asv .3n4=g*zyPFUsF f݊~n`(]jF{:y w|G TV*hw)"\$yW%M7R/}=>tWɒB,IH5KoG(ˋ&^dƌnJ׫%^0FK*WEXg;&^f
+KCdq3/%qUheg^EUw 5'
+u03BĂq`dN;E1M:X^ %iV*%A[W0کx$,H# qe>G܆wg+rnǑ++dؠTV惄䶡Wx|(0yW&>۹>.yo]pftgbyd꧄k9SXsSZj2Y,
+ۛj<c6}=-2g'L #WsbH
+<-ɝˬv8lE~nCaE,Y o_y1 X]~Lx*t_DSIeQr&mwը$}Ec
+_l{y:Q ! [LDZ}"@^M. K,ǥ`Sɺ[^L<q>K
+njr
+4b4}+uǏ9vQ®CpIߒD;ԗ8rty]u/Jʵbr8K|c fUp!^I\OԫMS|࿱Ig`r %h^ڙSb/n+_I9>b0Uè(5WD#4G}t͵u4
+A7f,.C:FI) KҶqhz#0񆸢*')`OnVi:EVoly#
+iM3
+C&]Bh,a7agI|sVD$ P$nuvi7I.InbyxHDL(Io%$=g_
+i^\/C
+Y_^ĢUmX?\/w'Y׸2>1<?=Qw?{؃*2{1m~.
+f|jN_ v%( ث)k$lcd!yJɯr",>N>ìW"NMs# $4+!%tW&/nE/E$
+.ؒefY,fKfZįDb
+׬}=4m JF
+P1,՗* E$H_2Db j}BDaQamtx"/k4/2Uns5J5@ 0ֹI&:h+=RQlyjk*X4э6ӡQEL s@40# ck͋B)e6s
+U
+V,ڶXAT9y;
+mE*3z
+M."ɞޣ6]md)3ݒ״t1Vه{װ>=3y͞^}_ۦti;^2|ޣ.C|-e
+"[;,#{D*X 10fO t@s/ryVߙXyb6A¶ Q95;([9 s_I+ֲ)pn_>O@s+a.٢ 8Z='J"0Mv{|%E|! 4(U._$Uh^n';o=/+Dncw\b} ~dO/x|R%
+ooahGćk-GYR͂1⃊9m"j:[ #X ]"PG()U9}f}QRa'x㟿|LVc^'/ru?I
+sr͇R[r[ゼaTRm^ЄbezTMv`AR'딊` <-H<Rca!3n)Ë<iu0F</6
+ I,V)<Xs+`0l2Iu)+xP-Bߡ O5Y–nHeʙv?)JCn߇ՂZha>T*2hFE,{t"b0@)x"rYdW#/bEF6 z _ %hNۺwNCEZ>"h*cZS`^➣c ,:f!+DT&\ ; [M=E脉B?uS`M;h]c4H l E<
+#mً_d%WtS3Aoa}MA!$?CY?RaQ@2h1!7+x]\䌆x[X e4voGxإ,8j=Ζu9W܇T/%Dy8վSDA4n;F|mF#RQGd{ӓKt.J" +UMDm{js"04l4lC6(&
+8:jކ5eYtyJP62s<:E[ﮍ&ҍQyPzիQ+;cnD4,dbefEYN$5|
+Vڗ<C
+厞@bSfrpCH՘lz0H8+?qb!Tic|n)l~8b
+f9V 8m+8B-؆1<UotV4լ%E)nNNBmPƕwp5T(;1]r-<9A?y( Kmmօl܂)DzN콝, I{Hzc|f=!jM_^뜐"c:aա9s<eøjBm{"YLgڜ%̤PQ}ɊAyt_ƃ,`bf=Ylwr \'&ymc^!fߋGØT '7o6xFTL;H6ib#ε{c7MՇx#QLtܵGG.8yLU3W֡DF+lʁ(~'ُ_jPqPᒣ" pA(3NQ{<H"Р(eHT~$mՏ ΢[ }>t+{>kuCF_.iCUՕ%<-t%+4nL8O ZӘ5
+X%d<JE3,2>
+` s%$G~ӑ{Ty b#hJ
+d\mS>mp~HƢסդH蠟9/=:Kr
+r=&^·7lJ
+FPHc w HD{6?O;fjJFC6>= 9ooI&A0qCE{#H:Os$H$?_OmE樃 e> r1ݖ!]wB "E.# @e;!6H$}&@h
+$k薽ũ`ہ"z-P
+H
+W5/ D*!NW4 e33iA9&?D_S$\gC4$2qZ:/O]9Pm^Aʭb~NY 3pn7ώ"+9T`NExjS/ wxR(ISz1+
+jJ|?shߏ4Xtkd..`79
+z!oנ'LqGBJzT-\~HZk0)nnHv$w:4;y#=);xq$eq;4ut=uhYoxE  x&
+XsNWX%y;v#5rc51DrdGa LZ+C:P?'ր7jD}F_$=F騧] CfMu=uD u500vh
+ڋ6KO˼6XZVaZrLlxux-_ *1-9ɇC3t=7h(N~:902#Syͣm ז e$RlL*Yh=17[ϳ.u]@O!q?Rvdnl؊h2/C&Uk(B`k@.JBfQI]
+0Vcl^^4t^u@wk9E
+0cM IlF@J 9 J ;=MYkem\;x&bNM8QL;M8%M^54%<N
+H gW ̉јmG$0"#{h4Q4vł
+"("=dg?Xs}Z[xKwU;{'Ox3Gk霜܅Jd]Ǭ bMBbk+床
+o%Ӑ9AJ2'tcsx(y3ZywCU3J  &uR^3{2qGVvfUv}L
+J86uV\iĮW^Yl}j7n̩Vn'^=p0/cRz7B.|D^2DNY=.$1ӌ>Hkj3J~t }"hؽIv鑕Z|hqVT| &A#( q;zNGKu%WU퀁
+9YsNf8pT
+ë#Wl!tgVPCY®P<$$Gg[m2j%UZ_fyBgK
+ Q8l"]jn,.lGE cwOcYb
+S28%7}x4+#{']ӁE Ls+v kܥwN|E %(+/dcFE*V;>⋿䲿2ɩO*BW/Ƥ4
+E57_#GߖU?H+n|btFF<[lV]cgɅ[#>d4u
+uU4 ."bgI+{ I4.*zlgU ULX$`VFtk.SC9ڮNZ9BͰw]P\Ue֊kx*`<*zg0{3; u*, u
+[4Qlg:3d []5+,9'mN1%-l!i|P//0 !)Y{ lg+bSNbFxPÌnZֶ9sI[YHl#;ʨmoQZ7HA=5/d/饡v3FJ_鬈 B|+]i0.p^NT_nS̝qLoCSǫ]0
+*"!?L&yCױW>a-Ejx*&x5ZWsRpiKopI[}}jg3@xtRԼ)2sgYY0J7; mJ́lSc̈ efEm-[z_P2ϽvyQݶ T3 S
+j@oOBS ,e}הO[ -ӝ_ҭ3 7|+%᳞zͥr%li%]#yZЎ@.ehDƁGW/?7wNN+N̷gt,d˯-"$ƖٳKؐit±W02:f۩ :۲v'.臊 )5'5'-39:"Ou)} LYP~~A܄֔qaf| v.&QەSD8Q q ܛTu"5"@^!<۽|p%#mC8⒕ r>)>1-ܶp%fE[o}Tyn_W{]oԪk??5rq|barlW0,,#<u(QP1=Qgtg3JP91d{|2M9kB
+r}B܇i3̳1[*}ۃs扆%ݠSq'<yzm1!5/tْ^Õ5䱖OlstGv
+L@ϴnuxp:20h| ьn
+iiI+ɉAc<ǡ%b\h
+pPG51b&,j<gEkfT
+͊+J\YTݏKU!59uDpP~]v́x;Ge<tL5KO"
+ا Tz$|"6H \0r Ur}gize\6ֻU|v)]A-O;TZnx®%l}_jmמj:4|Gu ^qWNH$!TG5tWF8%*аڼB `Y&]UVR) ;^
+Ku|Ϻ\2 v t88bkq꼑WwQ?\v:YP+Ou<G7 UG"(*rrRE@iN_!nbʀ7<J`Bc}o%9!7asNP]~sp'jKWb8uEMԎ^<?jھG6H"0U<XQL9S+s;I>ȥI ܹNHZG'R*=S˫0ޘ5RPbodʡbWfQy10#X丑EYĘ<(@v\#<ezv8:at ZFVfcC_c_}ǯ%78)Ǜ#!5ofjOrwK-,e
+e5&-slNe<CD)8A-]򯄪6uJF1fAE,-^W(˸HYÿK'q5C+P@ƫ/Ae?%-,bЏ
+0ynaTdXޑ swʯ Az>&"~ZAD*Xg[ _,0W^͵f|!ێ:bs%<f
+Lۚ@^(
+Yė%̭3%v$ ,
+,W;H_7p~;C::bGyJZzCmFZ&
+ԧ vL;u$ה pCIZXN&@K k1yR%n|CH
+2#|rI+309ܝ@}5l,iy4cU
+ ڍ#KGzLA#ʱ"RԵ,4kU?⼿xr/]^g&Ȼ-T6šD מ_{^y7
+沨m)#~ƋG{1'ºnG9APc@_WXTKڝ'-qBOױA7SLB_ͬHQYeby|W9'.:ZeYu1`<2^"Tyv6)h<.!߱OQ.b.ί鹄ZcsݻbP͊ki{zaGD/(=\ۑPGUJSHTq-c5xGQO L7)M;*a`5;f9+W8o}} s')mRVHć<η=ϛ=)b)&.ޯ,tZ-8Wnwa4L0ˎɻ~]7V4_sN 2ݳ # toOFЙ
+zӋ{G`|l
+<e-7=ӏ Tоx/"7,]HxWm-qaa5:aC]3{2޽M% m-O
+c/# "l}YS? mE!-%u\4S\_iiiϞ9rN6lj&nj,Q UR^x_h)'}
+J/A@z[ܙc_9羯~;bwmW5cBӏC*rÑbN0zlH 06vPAd޸\5ք8k55Ժ
+N%ҝfɕM/\"A&ós͑F\/ )HgZ.2oq}JXN;޳I,
+ڑV@|AZ&4y8v^W呚Žd=&Z9Y5?GiMM&X܎Niq=Zy#-6%Tqp1!6mqNjE+dI>T0ۊ7jZ@}5ϧi ?fRzglߙtUR(Rr-][яM&JH-0gʒf:n+elyDzD 'œ'~K^oI]߇oMW]#tV'Ǚ[<[H:sK:XԌ]yZvϔfKvʙooz'u/蒤%|TG
+=7xb*$tLıUD;+I5!d׈J't7M`+1&:ҶIi&ODY PkʠWԌ<9-=cf#ϷAx*<PRF6:gYˋJu5nwBz8ZBW}~lsΜ90^D&,đ0;{oJZ{Jk!;`¡z !@yLG7'9.((-Rs\JB`#:^LOE 2(azNohXVk
+g;2!Do||,La˱Mw|a0,lD0^5Ȥay}*5%fĢS-8! !ux&U:ߐ@ #qLMqrBKδC:ېIw`'pEtip}sM-}8@urk]ABGT"fLsqgʉ
+B5gkF:JI3)a=ȧxnXEC
+;m gw:¨ ]!7 42<LO#U_Ju?hE5~F^O
+ldB눯k ؛OR"g\EbZKHp3m7B%a92E5ƈR29gRg.ߢCw`zs>;d/
+v[aOIMJۅ ;BHV7舼 !"?Xx9'_ا_ rm`P'[-c+QeO]g q kDԣMEL(lsULOɪO;:>aW \_F2%[Ȥ~~wVVmXWQ0'n$e26%gl0%. 1i^tI_dlbntk'["V
+HzS](b'ile*{ߑ2["vB/V;
+9
+`̀kkN$\yN9V/S+-+KNZ-9!e\
+<ּwr}TYR9p)fMÍy+ԕA#痜(euiR=3`FKČBuy!l`piU9
+RvF~Jpz٥R=
+qUamLRB3^Dm;BA@ {J"c?n~[~<f},|'nvg{- 旤о_&=V<e^5k[qp}Q+Aϐ0vgTn:xʚ]2/X}hDt%1NiwI<X >zTJUr+m<=ǹ0Z<M
+1<5"m&Nco[|?T%7:@]L tjV¤L=)=>m[A7]yUT I;BLG9i󣑸ANygЅ4VkrU)#)kFzsWQ)3QaDkϳ&(9e<
+Lφ Ui=9 p%x@i@M`QQ*5X\QO9s(̫E!7to"sݧwӽ]krq.}Jilf\7t=8I>zK¹"^,g^[KΥՖ1n@ݞcܜ^ͻPX'!M 6VV(KR, Co;)bŧ|.,>"С'q?s';@oI:2Q\%
+vC2eeE_:(ԅ)e}AY+O}p{#:굈jyDtI&+r44ˮOYGSu$G- Vk)HDahG@'^kbZ-Z1#6gN=Bj+,I
+{':? N)^NXvC(oϋBcҲ2;K<TqJi ٘;-8ļ[<sg#:5Drάq5ҏ'zN N%`!mڽoySg_ &޽0v
+|xhO ZF!!iaVTʰoB!-)fF܆Vsq{3FA'ZFΦhvێ儞׳m9
+Q/DuPK&jUeM0i-?7?l x?Yהo546ŵ
+kDSwis\fNt-Qv2eѦ\5
+7pjQi!5i3!g哲S\OMyVmmlT10医.53 rH 7 ぢ !ATH9:Itc_TWy~1j5谹WIKńl`n185_ȩy'5k.Q.$B;-~@'zbh u^fi?0Q/xD,8}p R0#3n2Gϼz;Oo޿~CL{3hfKaHz/U:ۿ}024ͶVQ6%aCP<[RO$5˻̼GWNV ©Vu) [z#i.o)%0j&ೝq=%&hs.z}jل1ې$ka$Ƹ#lL CA:6KqEzCA##[ԃ)w`ղ:yǜjdӧ33%9aU]nﮨHUN>г~4xkvL=́{EO"1qpNWE(<RxYe7&YO3>lRv*DŽS3 V% ̜7H;4H:s616ohU94 ^}'s՘33VZ@mLϩO9&Ugj,f`Eu~^5פ
+æR~gWxC-3Z<⟽T5N._GWrN/ >u$Mzj\L\Ĩ/*??^$xު< &).SFVt..iwecb"jF_rJ[bH3ۀĨKD:xx.¼JF12+ngC#꣠ZbfliXA⠷d\b2Uqs>(꿽"×C3uqW~WFy d_]3Ww x
+e]rv -7L!%d2R*w$9 0Tڮ$m?*&A[٧d@&\c҂W ܓב'>myd]EҊڠ!"%fdfϗw7p ;%CCj!Ps^V[4pټON?
+zQAKs[N}>G8U\Koza[ZϨM'>ꜝbˌ6~Un+
+z>tƥmCB>æQztEIwEE׻φ-b/̚|
+M#3-5h ̯d
+!Sp1б/eLw *6cT}9Rۖvoe#O5[Wbҭ6kmaH5ʘ%= #
+Gmgw ^,o2:ӎgݜfm:;pЪ5D ;K_yLL<Tm㐂.Q֌
+F.l$_Ȭ."f P3ja90"<Rbμ;d}iqL*)jW= [Y/QP>w 䵿|R2P26@$I:~CNQI:k0੥ b% S|P6Ot}sqM;?avu}|z-̨3q&36%esbGe8ɇs@tu1se\
+₲$F@}_2o?S}?uQ2>!> ~_hRodm\|15e1
+/ Gu"|.̳G2Q=[؞/nKO#%kr$
+ 17"{Q} uAI#t8RjBjV[
+cVfwDM~e7!%*edvDbJ`}䙣8geEr{Au\0w. p{Tֲn࠴)*"Z)%n|60 5%W*>)ecanǑ^h
+LEO[-Y16
+Atu{F":*JlmHKj (Mm׌SN98KJV1予ؘshmyC #gv0!ky<oOM4r5a\" % \T
+ĊC
+juWE˿7jRg4 9]R"dy3{Ԇ;q6sCְNBQ=f]8.d'5쮤v5{.i$wѿ:K@+mɲV.`U|DSDi,9SHIyQ=VOq~5q_Z933NX)cDeL!,$d!N
+3vj_J(u3%E*_V 2}WN*,R@cf6]Q3۲!vZd3vus5ʋ~(
+zOE!lVnI)n){Ր^}2rWnyA-*?gT
+NS@0:\ 'E|]$أ_ev'\HI-C}Er4:`ݡ] i+x`cBZF[PHfk1 E,HhBK]yӤ[[3PO)&:g##ݟ%V,l<8k O| ZJqbJ}$`ɿ' CE,rBڻ--ؘF]ޜsD'M1˿ۧHR *P\^V>TSQ#苰A(u%
+"f2C<fbnܕ*z>)jcyeS0|h@^Һ~Yx䝮9L,t?h{e6g&7}1_7yf]~Pt\8`A\}jqU՘~v
+$<Qޕao-09e7#?y:V:pv/(qUκj:B\%(?մ= {coLY!ah+5cniO>΁wguў2jFliL)6?]38&`>A.\_y<&Uub9~Q,辴H5^9ا#@v#KJoKoO_ Tg KNiP=E.ldRfBWteKZ}\~,<oPx8jSґ68efK(OC6-m9t'4M$fq1}?HYؠJr+O 531_z
+"B[Eč9}q=}W?fzZ}ik/E3z+bv,<ڭ9\aH#$MP7P7'.d,Ć*Ե;G^ 8I@v a- p?9c
+h8蘑KȬxI= u;2jupF崺k1;/,,\)Nq ] ap<O;$Àv=9FT'bM;:"!Q){t'v4AѼRj(?m}2
+
+EbL$
+"Qa@(41H/Db[1F䂄s%|XX ᪂BQ}vɉ)yxZ^;~\|
+M[bR̠$ڣ2[[Zg10 '@.Cb]<˷ǪLٰ>Vut\|c.a.cQ劊EGo 5_w|u,㲊K.+
+l9nUKm՘֞9lo0:,Px(X&
+"ESp*6Fg -d@זW>MC4v1a~kh11:7P7};,hLmqcŌm곏/&YeyrNYxU T%w>F9[OJcS%S3j= OU)+_؞oNM0ђt+.ы&6dKS=ӵ$牚<QH.b<zɫGZEZ.0HlgF]1]Xqa94y4>TL v31[  ^K|&켡%+]|G~k:l~Yױ'R-:GW7^c6E&4leîјwuwfO (ȧj%Yʢ Z))1?PX0ytEC 4ec 46ˈÚ ; x&[mO [ ջneEԈX̚ݚ
+ٔ۞2>{^>j|-[tĬ`~n$Oـ񫯾Z a)нM5 鈩&-eUg,i$V% r*`I/{_.
+`uؕ^q]Y;sGSC1kҍ3˷d£!)MYUfҵa,b7ļ Tҍ߲1<Xc#FyT^e(eS2_?ؙQy~P{{ύWl}ߝ".!P˕!fR-/Zc^]洪<AYNJbvHp@Ͳ|žGQ]t>4(C-7S\K
+Wi1;r^l7tؙ
+gexmIcrұ:O(޽TMƯH4t`H9I%*oЋ e(cw6~f!3!}kj͙Y;1ސ_G}T<.]xg{c֓[QFϫ*DԻe?ZYsf,PNctFZo<U4xפ) SE 5b溕4thP zA]]u`C`?- v2Ac{&d:I6<& p@#RH+Y$8ʮC.2v&&M,r؜^q64@wNv?.̮㞎ǭ g]>~/Bn$
+9P̺6ȶg_L_;=vzQU:VzԱr\fOMiri[A
+V.Kw03p>Ϣ[?=b.M;3oJt8hMeyι[6~~zdȪ)̊w.憮S6^##N<gA- tkij pOZYs
+0ءH;=Cj}KF"eV}\\yLgF}V͸)𞖌hz~A QxZ6.]ʊ`b=JjȘ
+qvEeW>nOp}֧Y
+A\"t;mLrddCCd$`KFLըU^deg5)n'4Ȏhmg]~~Ɇq-C~,bSaa š2eMSrf"rxHčrh!m2w-cVc1N$.L̬6uJBB@yҀ~cPXdDâf
+ TAZv!0j".:nUb%Hp4"ږaQ1[Wf*i;eO5 IauNQ[NT.<~̺9}PIyƉ䣷Tmrbܒ
+MOgOr G
+AйjV1 k), (XPߑO~c\U zQzvqwZ\w.ٍԫ;$AɈEZ\ VemE/>qDåv> k-Ug 3{E߼״s0CR^TwD {ۓl/h:t/:s0 ^)8ߖVW«(l@I1葠;j)^nYT_X^) Sz[?<cSYu˫ڞY7_n>Sϟ$[ӢQf*n`A#Nptis.3˙Otb
+*@$!LwnwzpU  3Lf& /}1sL}OsƧ03>ZԅҚcp>THTtmLLbEbc o6SdF+s:xXrn)98F9kMX-tyLzeqo_)oBjY&&!)7~9G; Lwç6ϲR#9\i&‹[6d朣;T~yY_z߁/ځV~<3v(̲EU/o7_oNϐchvg䗳^w}aԝcw6}vefZ%\"wʧ#jүj`#fUg%ŰꌧKT^Tz~}sӣ0GY^
+w+s'S;y๬܇6nן6?x#Br:+!+
++'j&670Q\/B5΁_F@{.K^6lQKV*]VC@!1
+/d22ɑ|tx@C6ìuIe\܈T
+)dدژAZTّ耕0+I
+tEIb:
+*n: }[d e+ōJ.{:*^L- ҳ(9щiiȤ[ݜӌߌ0]K-|"La⧔qb66~ײ\p`,.dRrk bwT 5[鐢%1Q%(r[J_ ?(F|VZGRR|n=T|/ڏC~x[
+S CX3ᢕn.$^%dDT:4v0Z(%e#*q b^LUq, |Dմ5#Bn.pZ
+煬  ACm|hnmR|jo&O(G:z
+අEi"f<ܼ|uw5|^]hT뙍 ?9Xg%9Yϼk9C/hn腮Y@<8En|yS[H
+K0i<`-K%&P%6KA.b+\͐ psA&sIUX";66f7蠮`Ɉ~dU [̅ 0v58>ZB0eҚYi Z3ݬX6t'eRG~R61#9`V΄_v|j--SڣA^Iսa)7VNq[_rnD;)E,Um: o {n3*FplU|pueo=}K d*M? bq컬ڽ(6l,ܛ_Ϊo|6Ƥ:; s { {3gI85QwlvP7~zn" iOm?^ձS8Ow}n^Z%C9V_nE՗wښSrE3/iֹ>ydEyUo)%>ǡo)\ol>^l~˜38
+1ŝ4A:h5̅ VLH 2s:G~¶Ϣ-
+gA*ue?}&-7*Q^(mz!넄ANMiow˄^F&Ӊ2Ar*C;C 3k66h9φmr8Xr`E>ށIhWXv<o8`2('c&dmjDodllh@2T0 %8r00 |[xp®s=buήtp^4 sŠҊ!}K1c7[j֦U?c$[^ALyP㊼m_ThGw|{Jtg$ޝsuwyz}Vr}J88Dl| YagN]z+9=o>Pud{BVs#*aN SM>V_xzu<u=uE{3gW^[o.6zܑhhp[Uv|_ɪ!8R@- 'ؘ<i۳ [%?* t5{n:st<U:0= \;*58\y4^g:qWr^孵+jYȌE=LhdB|;4]%ݘz ,ÕqA6DDwdypOqƃ>ȫ>>8c%|Tݒ+k]
+~+w刲ݠ*p/UoBSaد8BZ꯭S:u<3YJ##g?^*klLqꗼ t# n]__9 ~Уh*.pR@Ku4~8zү-\&MZ:%EQ@tecÞJԨ#iaM\ LYr4ٕӌ*fqd-ow{WlsYSK`\o{gv}^%-|F9z^q3>3!:a9\~u<y#:bφ7u+PɫO#_~߰9Y]
+OԳZJTOk& `Z=bBkLr): l,F0cE
+%N*yΓAѷT@v'tb*+i
+7I!" {NenaWKA0]&GL(Î6⋐<B<)p &
+TK!LLx-eWTv3tۄ]n6A%zǿy~Kg`b ޏL/stb,D@.*{:nBfp$y-SkG>ș*w_Y9wQ!\saѧle櫍kq0i*+\ȊmzKO݃wWz5WqTtO\F#5?$ײM>gw .TTv'tj6UI\ msi8N,.$Cq&bAE & o [EUč C^LB
+!j՛MKu7ȱix
+ՋV\A8"G<80OEk4h_Z?hjS~y~`~n|,^>c#.& `p(qi]]e7+M8ݐuVq!u_ K`*'Lt[:,FT}0'3 Nj%zA~]I2tlL'}dX=HE1}#H^
+8LR?q-8Oqы:L7وQ`1I(21I=*ngfuJQRda%VG!2baިc{<t=efk= YG9&?e֜FzFῑT**5v9{ƕ-+ǒ,K#!
+CM,e^A ]A!<[F6 f |'Cǥl®^Li,`+mb_ז3Յo5ӀF[*[U)‡E}3o1) _)ҫ?sѠ&fʛc~} pLѣ̚p*fq˿%fo1#Uߌc}M{0o܀~tr㦜̺mfm&-l=vt6U)&;E,CƆpKh->X\3cdl gٍZ.Ֆ !1KXuq`8/%Vv;لe<Btq|Rȸ\<S!tJnW @ga~W %0<bd2Z)a.ykPs>'ϛ2}*; LLuroB=ʐu:6^YTƤ^҇BlfgwҶ7ҤUwgP0Efa֫\EoR6ѤMb>LA1w{/܎RijNzYFĂѨY>"P ytMTo5f1~UKJ)\*E^
+E2(0'YZ?РLJ9x_̓~ P,xez't>,ФKv#"qE{1OQT{iɐ@aƮ[D:[[b q홽E_E+̆
+ԉY%\9ꣵeK t57)}
+Zc6 $a64 szr/Gnl=_jO5.e%礴C}0 >q3/k !]8&׋S[J&xa8vC4a]B!0F.8&D
+|rSՄ~
+>9HZv (^\eփTW
+=Jg 87sۛff~_K`ڃ$;)t:0%;5"JpC&yxϧniM/#qE)Ji&0xWr>Tn(t .SQ.a`^1>k&fU[5l0s1XIfdkK''QCuгl:] 5v=Q)-bT6|*1.fHLʚuͷեcJk8R$!R*|OxQ-Ge\wV$~'!FX߈j1I^ʥM9?,[/amRъۮ1[WL=>ruh/
+'B.X*Ao@#΂Wf9s3g&4t4iH.f6eye˶lBhLLP ,,/1P(`,KjBOyw#g}<49.f\LW1O9r7d=$px^ޒ3d$2 *Ή=7h$f8jbH/:+/>CڅKizQ/Í
+=:guJ)hx<aI9 ұjk-&Ez敔|^۞\mk#)cӟ!O3|HO-pi^ȩ;ޫg]4>X^;Ntzu5ڢbH[ |gy抒22N;Vӏ|,S.+ YP˓3rMB|@ E.2 )
+gu Y;DftO9Ao1JisoۭJ:R(m'gaFodW\^>F1{X JS T&LIBYz|K.WE1뛭@=ףK{MC'䷑R7 \
+ mǽ.)i ݺhlgnK9HhI{'1n̍\
+ˆ ͕]iڦJ/RB,!+!c[ɭ?~uTHhd!NX+@_ĝ&%M`~`u-G *)ad!i;]zB&轫+
+e@f6Y(s߭{f s W/xБwRzr| ,$L5l)'F=
+)KejGQ!̱h׈6M`rviZ;6ط,\iFJBs#06hf^Lj-%?L~ech@; b  \Zn}Er [RQIZh^Vݝ훯p M*B:<0jt
+ )]HWqud'ב;Wq௻/}GrT(̝B-A`\(Dv9fS׭̦KE!qm9Z_ca;uUݕÕYw75؀K&Q.ګǍg/C cm|4WAuij:zm!EBD(/k]Z|.FM^:핰]}f4Rv{q?+hv۸r}ȧYÇ-%ning2!wF`.8Y{cٖ\Z$/%ʍ0D
+b@-E,])ŝU-&y M'}X[{(,[Y,'\S\fOiey闙dIm- qbB\\-d*i
+ Qp
+v.L!sx.u=~?_BٔV!3`ܖ
+vʡ`Ŭ}
+dZv&>+q5'k]e8fpW(BQp̮qϒM_06W ;:nuWx{
+|\$z_֝0:.i݋-RK/NQ*ےvJ2<j[Vv3f;«p_;'߅WxYf\QzzUmOYwKkROI,-\JYu'auvS5ڤIANMAe517}b\531;si9=#Hק!(ebaV)aDvH]1ׅᶄީ-ruLm<M"fRSv@l60,pg^SCUaKbΨiZw' zM@M+Y8,=w==2%bGב4-! Tug@Zk1+R69HIA-hx+a`B.%
+R@'hOX8͡Uڍ\1K5AsSI5ځո1KP5"xVPQSP- jߺ~&^+9eޭ4Y_tX,➐[t^]*Y -j:q-?_Ggނ< }];QuJ5jd7#48BwEA fg \"=ېQ*ہFVeU= ˃=Ne<%)3nx ({/INJL 1v8w']<\?pTCqS,s|̄e춌Hs杣CYfSB9?l+HZ5,JZ~xu3t&C !a.K҃>P<PEB+kH 2!aT:)|'-r*
+{0Xa{ૃ_i遫)rQ@Jz*:!];@%ۯȗ?$cVaW$ ` zaWGLrjfhnwX̀ t[(`ţߊ@EAM٤ 3 D_Vc [b#
+>ʏH^ݟ/XFB dGX`Nn݂ZOԌ7]ܟ6Lֱm9r?@|D{!-|4C"!iA2ވQ۲Hv^q<(8ͨUY$D]Q>;e3G-vN<fy7'3iY$*;~{gIz -BW$L _tΐFX9qoI/o<s[I ' <۾f9w ^a<DEn"v q'c=gqӣA5҂jyM k%O
+*]놱zgq6,xEzUHQY[NU+a~GsڣH$G{CxS7]2f3]wN;k}oQLU(4$.Dj $&$5BA"2<s͐@"v5`?jW5`7} !8+ 6 (OcNg8WU糕p31E#}DMMco
+1>]oQ^vYɟQi?S1rkK~lUn4D>d_-ɩϵۍ
+}? ;X~GV{(-JLBroӣtBrBCC97@+!-V$-Fۅv{bjdyr=2b
+~>[H9 #X> cE1^USJ{c&oou  }G.h<kiIT
+Yei
+Z.
+AJ3NKo|t0 >BALJe;񙜉 }5´=9nj$.l==8R
+j%<K/4
+2Zf
+Z
+BIu.`(*?jG{I7Mkuk\>'ڦ^Y&(A|dmn˕IJa8RMXB{(>S +f.=7?be˘K5IBD_rceHQ.h%e휳<9?y<^bnBꮤ*N+J]+ДHr0)!.R
+ԑ 3g2
+.ԕ wnV~:^f1Մ$,"&vz!ЁS@B gbZċS%~<YF W/y:Ɍ D׋5HI :r_ˆ?`[WrfbvYV p,c`)ajܟkըQ\=L3d/eB!_a1:PZѶ9'yȗstǍlWSf:ZOr#lRlUAzu⮁zr&p{]C -ZRw yyr>ψ]l- \NƩ
+z`in?)`3D-qĝA"<DWNE14Bԋs
+xvw k/g
+UG
+\iF>{Y%p ȋ}MG26PGGQC
+܌]{f8螲6'آ`#Aro*v;9n 5RYA co!WG׀|,1R>RӜY
+v3SM><ҕ
+o]-GZd,肐<jooYHR7k"BG=7@B=Zթԍ0 vGJc.هLxy
+x<-yeRGЁ\6mD9 Ӽaߖ#\1Tcv+|,! @}y  <\-!w$h CG6g8'Z`L=V;2
+9?96| /QnYGo=Lej<nµu1K>WG鮇JRJ]^jipSg [Qjռx䡏deYrж2*lVĹYiN
+Mb&hhkVʱbc'+wUAV {`+2,)c@(9 =%Aaze!&# )%!]#`
+( Ar7]CvYE\BUVj}}=yj`7^cuWUCdBڐ 9[:fя<2\*O Isd]ޡRJ t W؋UܫnP.ۧq+%!KW:n
+g_]DBB+,2A#~`А7&*^q5ML˸d
+@Yjt.*h,`><B=f5-yBS-BZ
+[ ?mZn"<H-;1yt @L!R嬶1Ze=1>=
+reb]GsAV?2{Å֩Ѳ?ދ-A؏˴ށjO{#@G*=^hsǩ[fNd"Z}圥CrfY#uQv S=/rP-YKl@/wɩnT
+.`z6>C+pk-fsԋNڛj) ,Ŀz:OУ݉I!r,&eo o+ۊԱ+,QQ"ؙ.B0mvPx)DY|,v(k4ƳV ԣ}攭
+ASQEѺΊ1qjea44w2M$4jjQc{*h4nU@T65₀7PM%`3s̜|ߛd9*˫oJ?P#^z xH` s[N;.L< idGDnap\^썱
+C=aݥiNs ^g`Wȶ\tMlԙQ.͝+K'ɿuM6S_t&0Uf!g^Tϧ%-JJw^t icwϐ K,Dh\–,IuqqV]_9A/ڻNyG:jc*ډv/%ߚb%X>@vK8L'<_.m=HdM9ޮ>ꞝ[!+o7ƾl|PR -4~B"vũ%sM2z;Dj%n((:MTPxPܽ[7bo}J{|7܆û¨[!.2ȉ B|xNlCx%(9^5jo
+S?Fcj.qڎ21F-tR]j(tQBKVCD=-}Q\puaE jQWQ?=e}5;b颌} [ٛ
+HKr9DO;& oYm6+y
+oo|2 KR=ljiĕ604+5KtX@\h|*5z%U&3Gʙ2%4{ZL5 <nνj@hr:!Y$ :gNGLL-2@]<27ʭH}=՞<7Wgڅ d^0H+>siټdVZK^V7^5Yv+=?@JNL}6f][Xst멤TBW[k-0o\PUbP&RT,sN..Y42!fG0Eg!@(bfa@r]/EJ:X8iZCSN>i4siYIp
+~۔} DĂܤ'ަűSp' ΪL1%2q}787Tq\3gZ[V59vjYl1ѫx)rשwtGj!Ql0pMUҁPE, BHZ7}*V*s6*].g3V: k 2Hy,!<Tb4\01hoڦN2t^aD cP D3Ԕ3/5Ѱ>Y׮:7HUݜdf;21+i\<Xr :%ԅNW$óZE2:L8Af"}|m(_a߂SYv‡i#;+tjKOrrn*$.sKnڍC=lAEV)} ljH'`XV܎< &EzFԈMOV3&2?XM!59r8*;PSZ;Rus rhG3ݚ|y7A
+niƄΝ,髀2XV bMD1!Ó&}<.1*B:t"2|48YmzRULb@D#%$ir/iA
++Ai}AF{@E=xB>a <#((q9 (Xx5RYpU<@-koBhFokx\&h*#.B:ޗT\@0&p3A.|,!é @-k3u6Ox9HfCż rVmlqO|,lޔ ;z
+45 $0vSYLnTih;.aX035`25$rx/%%{FB?!H*22)N-ѩoaxM9TB
+`'>76˨DD 397Klwq\Gxo.^c7w_"^-!u.}
+݇@3J]ң9ZeO1VNc\a7#̆E 
+6r:Ju8#L$~]3SJAY;F = ~<x@71
+?7#AMH!:DJ,1 X&zIj)[vu$O[wO[v\;ͅ7[]w/Άo _ZwE%nn RNC.k>G ;FվgL9i#v|Rup۵[V oi*D.dOx]ˊ0 Cf*"+HiVmn"c-BUxݮFhw3Z<!^ kV9]"A4c qsMd4nl*^uB;EHːp#hNmzgL븕(+PoCSj.x/¶e61a9b"4& ͥ&LcB|3nm.ﰱ C_<2%mİI.=ALz`p0HfR2QL! :>Qr&r.lԀӻGé6bx1<,f;嶇Z?|!2bmR`8=Ⱥvڋe}"Fѧ
+J`r~x0!6AD@c4jQ(r?N4_t<UdHc{9p'AR'4i(͛!ҬqC(KZ0 ee"7E?>ec!Դ|I
+͘{-С: ,9t`G jvB#g
+ioF0ra4)Z/G UlȔo;(g@ d3l4
+1/@Ҥ2䗟X:Vœ5&~ʢa7AyaWF'$ҋL.l {'/9?V<}i q}ki{[;Q4#14O̅ Ζ(y2q ;tqY6C:s>EِkhNVMkA7DJ 2&]zG≰[`QBFVjҝq*/J\Lm|倝wz5}gFh՞= ~&ݘJ= |'=ɚA7PSMoq:}g@Km `cBdb`ͶNh(zr x,ڃATUy`gk r2;oir2w:`j )J{FZ稟7k{)<4znL*ăn0(mcʽ"ti [Jix1uk@<&l JKRK3^fzпA>F6΁Lͺ
+ gpjr.];7tzG#]rr_0.D~b[_8;fMA(_v}Y<NQ+Ecvv1 ЗRwOSɋ)6yXiv`BPg!؍;g={q<()?)06pƆP~~K~OfAg",p8Ce{Hu"y-R ,:zn34G}RؔpBM30݁ Gw 5:9 3(r.4O4nCSV[]R)ċUլnA&ET̴ DmݘʑX Q Z}ᐆ`7չAXkT~HwE)֮E Kpa%UR!bNo"QI-$3T(Y.+Tb6 8 LIma(^bUP{` 2c! pK
+c_\& ɝ5yNJ ק F+5q.ÛQ ɯI"
+i( R2Ňzpm=E'Ѿ^L-Aކy2Q3 0囜J٦ȡcF:p"n ׻ogZ]@-|^bfR^!\ehsJJs5@4
+jp<;$+$7S# XY[#j1!}\ H)7t v._I&;2*`}v^D
+E9/FČsQf6k S9(5@K\28߭8_JAw6FrqA2Kq%L@j[4;'>S !2p(a.>4"hud31RLVꄭb`fp̲r_ gƘl~g3Lǽ "lkD2ɪG1YXx4oVc=MW _i(.lY[\:A@{Enʠ8a8ڈp*0gܑ+ 2
+Whӌ吞$D &ƈ14// WgarLs Ž_yHW\\]H.(t2m2Ooq$"&1B@\b(sJcYK
+Vj25XYn(/Sa۰DZ[f^R,)T/KtaW~RA<Y("p+ g$1|b+1HDcMwa 8cG#XuӖ4Gypȶpn_5yF$i~ jD;Z}tI?8[%5'sҁoD`mq <.uMq +"4ܔ(b<I]9?%^kojԺTߕjF&" U/+l){Y8!ob
+gTt'ɯI^$0ך'cB"C =DBၩcS.E%렴-i m}4g6 sðp[
+eM MS\า`$ @HZ^]l\!E!da"`Rsc6|y&dc SlP.q:jk$qq&ba0[k 1Kd Y(9|hac*{1ph_/?9z@t&X.zKضxAYy@6x2\Ʒ"it"maM
+f0f^|UYĒ|PtX"tLѼv+6wOEUet$?D^ sT"Gs#/ % J-Z0=ygrXNW5J{QaG"%6
+^f'Z8oS};I?n0LL a&2U+kʌ%<e.P_ ->IQ^ҝQ0cNHb `(0Z29א`y,_SkhNZ0:ey8Y%l١(!?(keX:D)U"эÇA&G^e&җ"KxuOFM~*񫞆u=2\sz3
+G!ʃD[rd`gkeY8
+"8f^A\m𷋞;[e/tϿhʗa10ɘf!ؼ̽> ^M'%ޑ**+&VſIvDW=p<hXr)$P lq/KX0 qX(CcymDhp"lfi~~Fn:Y~'ak>(רJY& rkaO7h
+J4}]db9/ǧlp/LAڮ{e(h=ǧSnr},ٿO+c*h Z+R4BP 22&tE ,oG -͸Zq@4jǂQZ= )YX_И{^;=F6;X̎Oj`2^s4+E?I!82N(A]ZD;njp{"d<PrC#qub)lc
+yr m;=A2HqH>XjTE*ch{qP %t6QVպo m!dRLT_K/%?E&uZ_DmS!e
+Lnà`0 s7?B.Lp\+hrѣHTb{.$hB ^S
+v^!Nhs06ȵnCJ{B\]fMU>LդJZ8 Z-K}-
+ˡ<#`#9yFpdR{^[; <HLXi'КJJ9X}ol>R>akr_M\0DYlH.\6u&{W3g޻yDZBn@ܧC}~˟D7G9S0#@Nةj0ٛ*p6wnN>hrُCKO-.׈]^\bl=1E#!
+IiPA!AIҰlrZ7؜u7N'>T{M땻(8S.$8-(h˂PļVy>`dҙS6AnrϥYj#äKt>TՀTϪ#{]K*N`҇w&
+nc΁)9FhYCW)-i‡ Z#xl¬7
+'}Y=lYV @遑B䧖 4>]+dJ) c:Iͷߓ%;n3f\9-~pr>f@X T_%+̔q`%R*:9->^W80-ƔT\uֺ߈oAl`@xBÃN *CA2L) uU2*g^\Q ~DNrցyJ:@|*`6tNYg i*ݙPShD`"Z⛵(ei"
+
+\OF!95t(NŁO1noL!ه?q鏕z Rk}*Ut dDz{[ Tʪ!YB!"\
+\ aIW퀴Tz*AU_BxOak`*b1ǷtvU
+vA!F U5Ś󂘶>,󄠀d2 6^G˂g(IL ,*d u)x `N׿Ga _%Ŀrp!ϊ9-dp繒762ƇKyմ([tG@në[/,K~eڈE5`]386sZ{: tqlgSd*61ߦBtY_Vڝw~~eT- :5?@p
+/X_ y:mC^Kl~im
+Kw@+0oٚZW
+W|ewsLˮHL:W8HJ8Pڧ`gpsSW!9-1~h TVGgkt
+5h6k Xf(Cܝ4$
+yLKQa?U߁DpJ0>p9mZ4ٵuIoX2X ǚO`#p 3Y˴E'?n
+4ñcdDrl %GNag* i@eL<h2Ǜ[)tU[ liqJ$~
+K|udJWrWp1ӴCKM6t
+Y&2.lVR@6&݊$R? Pv)ՙ̻&]8vTvsk!U`]& f/KﮢFY|L3E?/7فz``O (Wv$ V1d E%CaW?{`UpE<z "(xCQ,1 |V \!ݴ)^% Șoް\qK+Ro#7HT2y~GگD[ʴ4觀&D؅Q$;%f[GQ4}+[b'H
+wD?2Z'']S#oƫw'8]/+.zxU /%Iǯ6aAv eCR}@0qQ)6w<BvG[c
+{Y".W:.d}`/lz^.K+.pV1)eO) 0\
+j d̶Q[}ngV/r>s2x ڜ -vJ>gF~5|ڝ}kl
+}?{2
+E˘!+fMoIo[@Nxxc„Et~q:׹~r8;X&t%CGMFd=(vTEkB7 VM6lb +C/i7El?b0Ѡrx@
+k+#2aL~a. (1AA=BUe*/~A KKh°&LysAM.m!)
+H; Od$D} ĮBVRB!z{V/ڪEZmu}\zuz3bͼ8o|Ϗ=U{KZ[֐N3Ox:V1bD}VWg^2,OĽ0oXMg[6+Gfem9_V/nXRw zbW[au6ImLHA@'CFHGOa&}8dy:莮|W}kcal-ܩi7<~uYt.1#qD]LMA5%':rD0ݫ8̍YH>_;**:ttn9j_ݬMxٝEcڝ6?rVf:E
+S+>>1nѐWCz?}Tq8WsC)uosP“ {ۧe[ͻ,gs,R)}:90\`==3hp?' .`ԪֺjL]n6dEE@(2 7D JFДU?w,5g֦{ԽES{#]kFXUbr3P<rDXH 傐 `  0ԦFkr}W[BF as'3.N_]*=Jb!q@ T'E&@, z)hWy4j؜,XqD0X뙓z ZqSRFI":ԱѠ8 84xXZۜF鳿m {׫9ֆsQs5CoWy!-'&K]V
+d a!7=1L#@ ,ϯ7yze=Lf{SrBskj eRVT%H ?R
+ix8
+E"
+ōڙ ytP% b^A 4"٠NȋbFj 'k=Ŏ Ӧ~#ﶭԓjYx($
+Dl1XFxC _T//H 
+PqE{I勵;~rg}+W1]3>3SH$L!Yy~@!?2wx
+$9!7^\|_ i>$N:R!O_%#;nڻ0 ljʘɤ[
+e@!+/d$g&73 T"H<䮕:20&w߿
+EL:=kb![T;>|wl[k"hu'eA!r0[fY:vl
+bY s?^ɍxF'~p,JOrt2>6=:GG8)+ӄٔ"_ѼVɭ!iU~k8AY/j>hyI_5 4BbSRHoip9 cD WfKciExe1.N$%(e}^8J_|u$5f9 ;owGf5̢@*Fct 1g  L/kyq\r5gӨږl'p+懝|~ v 6))u
+`q[g.5`DWƸ: .f+ѻylQe<_BIDډk:ԋM}wɺ!
+|Gĉ;eO];{df ;٘M G=j$F&Jkmc?k+ЌmlNsɕQͣXqMXK/U葛>4؞ L=|W=G^8brRޮi]/bͮKc@upXZW$<j]IlɖCo0a#1(VEuLQlG6RXⶄLb̎;Q\慏&Wmn,wHOmO?|zᣢְb#"C)tTXB,elY8ZNAY@<qQ>&qஹzס6VG2T6Gq}5y93v;C{qFlnJ+bHJnM  CزfIn\N=|~[ |{%<i"h!F]Ui=xF)Ԕ줦H]8DGw=%T ]Тzӵ5ᅶۯ[DOD{N5NcŬ<z&y7nI_բh:m&tN,gvjfr9(C> ̛#?lH,~RkHW(eO0Zy'+kDuw1?!C~-g{uiN6kf ! &ewz1x41=)i5 Ew`[+.9PI @L3^,^ƶYhrϮJ^h1wܽ&)cCzZ'H* b1; /nF׉[fɥtw
+Z:2ۄ
+ٹO&.E**i6
+U?g(}\*g+ad ɧ@^_W<RlE_ YDy~${
+=+77a^pc`dg#p 70fxїab[C=p^ 淅ؼOJKUs3$>1WduM6`yB %B$sp@rN ٱ)#a@zkS*˼+3̿=$K9mF&VS5*E=nʎ.!l/$2O]uOQ1ې<j kHOT)rBɝ"2e#2t
+ȼo.ef_{첆ow$_9$U.A85d|6]sPl(c>f6psu|*t~&`x.An)PtE ғEdl{NT/G |-xDoY2~-g ApLL`^fE\yЫRf:i~kQs 6˿A|zsTèTGhX ڤCĂ춀V9萆]TQ_.l06S?nOƝمQSssOUR͕mPLΠ[&ff#x=5e Xx $ltČ-vyV;}*lqPM)4:,nfܣD" IoȽ?Kv.w%3S|Z&(ף*N| ]w{<r߷]0q-Wa nBfbk~ޥ;F+L^5uǀۧ]҉cDD̸'
+}{QP"ޥYK vqh +u+>nͫa/2^nꂺQ>2l*zyXŭOĤ %IhQN'3Y)d@mC߳:d ݫ mkun{0 .M:x5he5?uWAAV[
+f?8+ lt-a껑M*𞘅Ph*2߱H oO6݋i {0Őد,"JX+""!d̽y5e0^f}H}7K'Sgo~ .gyd\Z]1#P+ MVzwY|qPa{#hX`_xu&T_<X -;A[܋hd_@KXOYYD}`[<LGo v8ے7|/@^ͦұv/joPCF_W`!-8n$/w\m;}SE\s
+9+<Z.
+S~"f.同\:uJ:2K$aS5iysFWhekا'eG Ju'd|X5ӑJo
+;b~5:` WBF"<!Mq{o24jSԡl.˧ $ԽH(9UtBz69͵Oyz2!sV!%fdօgG32-_Ϡ:p3l4QdWёs̿N8>g4ԩ{gZlkҪe{nh(. n[)""((".&(Vӹ|sy^w[}l_ljy'ƶZDj}
+k::==e7Km#o @c
+l,>>QԜyS~jbQ>7jI7>5112=*LVsG uⱎ< '廔1t‘ GƮ>`Mtowy*ا=@/6uz %)#1t:wܫw1gW#2RJ KoYŬ$Rw^zdM
+ݳB )G&> qz:=MV 696asZ;0u
+VY`},`d-C?7wӒΙkyjhGۓr+=3
+Z⡾k ֗ zfjw<:!EX`c4:u,jVX|7,~~ plI;$81T!z-5}D%ݟ:% r]+4wBچqۓLHI⭟ wGc}Shi)뒩%?ID*yGEO/߮d0RdzKUM} ou#NP
+2jS𣏕 :eo
+.|H#ǮVC5zk:^/]ps.}z.G~JyC𔐑C=r}bC?35oz1G2k@L&O 7"ı7G(.!k˧CýĨ.j܀_;gIdXhK_b] -)K!|gsʨo-1 bt
+i/fY؟ƦW|W9x<‰$~U6Y1I<rIr;C6=%"+ĤZX Yde_PҲMӋd|$+Tɨ9ݕ[U<rߺp8/K?2TgzaQʸ=524%.e|5|37 (SpK6K1FɮoEFچi9.ſ#ہL?/$cd"ZQf됆Um,х~r>OQc4r
+t
+_* Sŧ][_\*jq@!~]o-)Gj@YWlN?4#dDRud\bo듑lÄFXlgU bhʡJ$<Pq啶TgS=!՜څ2^n=91Uc ꇆ)zU/u׹ZǪqs4H/n~J3[fIfcIbjL֘1ɵ,HGzQ,Xk
+P E (ĝw?r;sf9<ifkn鱎Cs~Ϳ阂ا`A#63R_Q?/_\^tks۩eJpfaQ}Zb2PO,uf.@P_?TtM6z}5Hk}/k|OI,X(EzB<z
+"9})l? lG˨
+<)ׯWy]L*5'` =:~NͿ/Q]D]rnd;Z0E٧%ztu;2\1IA#Z-0[G
+LFƒgzXm➜\0K#
+9QP^C?uґNjm|_rsgr9 ]);ݘcƾ9A<j&|jģX >q
+7Ut,4>yңof++C])_9}JrQ\6{
+d|"DU~fN,5b ᗄ[zfIn8S736£/4G{O-/k.6ac L!qf$V,9L}YJsԵ&r%if/vI_}Yk[lr ֎c+WS˽s .i158[ޞ{4mԘ j>Zk.c,H.%R[}o{ q+ v)1sGJ|g8doԄ%N=0L''N[ZCn9
+1#f6@oi[eTѾX ~T ;kAy1:g$:&k/|/8xt7ΣGxJ o [alslq{<j[c$?p3G,rIZKfR@3{ЈKt8Å.oR.JiCNS^S
+RWݚgS.1=M.K\R\ek_E(H]zK<8 pHO{Plģ7X& y^xX&W[F!.sΨ:G1~4 Wh96z6d G5-a -g>,q>-
+{76 R_?i.\UizQ/< yd?uE\|\]]$䶼:1 }萡xq3^yԘב\2] BJ8$Gn)VvX/ { G^ax8PPĈj*,+or}Ucom]
+BP)jbcg?agv}E HxHE؞`,j?ڸ,&*cdN<YCbnrZ҅-pr>dmH3IJSc %tcrgNRB*NTaO fJ[';Q;*TQ`R#KFR;70mzW~3HrlYR\ dQ)L5IK%pڟD<:ʜƼ,TJvoY6MLQ f24n7GM@4P1p4&^NڇbVx*>1בahooA#
+nb})vEP]5O.IāSӭs60"t(31pP84oKxQ|o0l`vD&\ZrT dXÀeYƴyTo֖Ux}]6NLLOCo'a E#Hpꁄu^$<BZvKNܗq]=j$Z̓a/R#Z2:>Qtt-@ZOqʘ
+ ::1?u0ۥeKc~Iϋب4jZگaT(p/]u:Я-#շL4$pE|E5f%lI%0gXF<pLJº>W:3r d!lZz1Ů5\ZXu+$AS-֟'4=fSJkom9-BUp[ƕ{iP^{YE$PNT kui@͋r-x$#ł|Ox鋃w ɛE <ӣĔYF Odtw! @ /C|7Д&lK?^Ocr~r0I({sʟ4B\;tOJkD>-W*CZ.a62̀(w&%+g{C!y]^iyR!ZlqU8*KӉyK&HClj?*Hz__=Yf tj1wz9|DGGpIZ)N,2}+ڹK(〖O5Z\C*2'&
+V{uūD$, l'=q;ŵyW(2aӞm>S=Qjf`U {^6cmsQE*D .')z0Mݍ5<ݙٶ{[ޢj~in{6
+AIDqu;~|>y6m$ S}T^ڴ1ëQraw:/S4 HU72nK^sbi$<dܞyl«fP0/5d!?hnIzz<V
+za[P;#~gP*<ˍc3=K2kt
+ N<هttbcy573c.
+S8J-*Dĸxi  -ANx˿Y0|ơŰk,=1Yn٨Mf5
+r#N3ȇji}K7L'daFLL̑}8Ap)gBp7+cT%x޳U:%OٟR$gF)x G?2(-1υ\Ⲭ6q"䎥pYsy8is!f;UM[Y[Gq w&ّ5|jf#f
+oSYWE[#
+8>Zw]ۆIk=cx
+@î=e5˩У3b78Gps*<
+Sf_ʵ)hWPQvSӭ
+g`*zkт&6ʫ!4,W*)n7̭gzҷ.3A;
+6&*:6&gQmv$}f.ΡuĢm)<D:~ngvc~QE9_ 2$\9Tp6ܗ9zHM+;JF03s |![ons%^SVjF<Gg^!7 /:^kK̓,륨ٕn[GZ>|̫&f;Fj~] [v ^$NN'W**;6С7D뮷:>yy6|">РQ꟧Z1W^J㌢|"k^Rmdk$QMke?=$+hXbjFI
+LJ{;5-&kBM\9NKo4EVQd{ $#NSW;/탄XVD%?M
+8NEUSe9uȮqRwA
+l2LJi,@r؈  `)`qkXZrJهL:7 k.pO Ԃ&6OˑXZN>s*= !,)|2%ʾONus
+ϗKtV?H=α8PƹsmȗsMP
+z}CCg>Ukxg&&j
+xn dFDn+Î
+2n\X><l)z |*\T9L^Ie. pk:nKNӊJ_ Ԁf%/'YfZUa>\׊ASK=Ox[ASfEX6xfԒ'QAlkY@ܥ=uZMLlwK|8'HQP_VƇXZYx0<d6*nsiy:sbA(:4s ,WX P0Yhob3enO7T뗒(SKaMU%7SL3Jd[}Z`fV~-
+4pX..
+%į=4aS*)*1J>Z`fIdoCE`MmK0Z+BɼڏcZv҉ҋy~S
+X:"~}CGQ.q[|M8l @ui܃Uݾ Q%Kٛo*s ! [JcNѐ2AX#AaxoZ קۏM&Y;ϮKLk;ryR n))-枦:H-}j -dS%flN׭ 1~K9#/b&x䜲} =&ѳsM(
+:\Uo L'[ɇf>{G#i]+,z}]\tkMRp_ 䞘i#2T3G+u)H{zROrHk_Y['6gLt~Dcqmk]즜Qa7:L<֑?e+_έS 7 N#׭t]n멌YG/ z!*z [j+>[lX:jcUIwj?3}c)c,".
+{yl J.%@lŽoBymܞxCHphl ̫d9GH[w!}%!d|>EK"{1Ac qU/sk<@HiGxtq~$Y GVqu^ۉ{E.H f忾$Gqs{~u\
+\CeլDW(&kè !hbs^1sE5uWNp *ׁ_:$%H[Hf x{ 0P͉ FǟY(sQ6`:f{M
+seY:luϐgE?7ȧf6ѥo+Bժ姕ǺXzZ{qȓoT=>%tSӌ 1C E syrg]C.*]k*0@;ҍ!df?k7u 0s_͛ed­"<~ȧ+[d&
+ܥf뙰-5%owJoues
+SOL-i!ꭱ>5B061[ϦPY{,YOX'Z毘3<B쉭6[$g>*zaҒ"B(vk
+)85wW)s⢗cc:f/CEva
+vȹ.*֑ppSA?S|QwN[,(<@uoNo`VeZ@eJO2x>p2uq;,w}Q;JJnwv\[i9Bg
+=-L]M؇P09>++hY9M?֑w8:p2tԍRҊlٕNbF 7hA>
+<ժ 訓ei:޻ Ͱtb|JZM0@NY#-RTק}3n SQƀ<ri6)ݛezf\
+WpʓtBUn(6aDmlc
+?rռ \O/ڡo|ڭ
+z!~]hw-On[ ݁D2[ZzcZ?ޝ3yB mҝwA"cC?kKMdBAø"7}nURcB +"#wkKM^&TqPcm-w'{Iߔu
+Y/ n
+NGvwQ{O5\_()Z~GdԷ-B]*V 2n% 3„q^1-#㞜e[! Ra1;2t(BaCTXeR͛؝e'Za# <MX%kRyZM;@R'ĕ ZܙD:`]tI}8>&=UHC.X%blG<c!"_(#o`IZc=pNr =O#$=$gvأm9ȼ^g+UۓqM b٫LGvp`_k,%F٭e _G|[v i%YFtpW _DVz|L6M;dj"г619'eьl|?cky!U<|ZQLEL,<, '1aTa#=[D;JU2q鷓;6iS\oj\]bT#"?5.\xyzh_>!bI
+vYUJsR@bgeM]<iR=Hs{?ǧ\XPCHٕ<jGCTvNM& blؑԋ1
+^MrV0?tp_yxyKjNeEZi9T`U^ 9AB,$Ti:Am!?Vmw[ռJLt '[w/ldt#7aA2`.u7i}!ػZGx!s)Ќՠ W)6`dWEz3^˷?]nźX/_z~#ّ3ZSx~rDW^ބ7⢭w"a
+v;n2xlY<NBewYI?-T#Z:U?ul~\g*|Q+OVx5^^! %j L1/:Q,lβq.|= UVSJW= sL,%M"o}剛55JJ >}3>&ԩh>|Lʖ?5p4 Z:)l1V% (zx s3kT3Ni@'efRr-\AcoY]~g]aOC0wb=ژ{!(F_Ghu?{2J`0s)ҍNt"z&ӘBUJnʀAA_5#ND"DTw$O8Ri nhV
+da3:d/t eNdߔR0UB:[3v#FhaXHXj9: 030)qP9eWFGEc3+'e7E=ҲѱZjnEϻ~Z,yq*"/An#)S1w֊ė <J-=Tn # PX1
+|RKÕAIr$N@ ҏҰxnPKF5!Q*ϮQbQ%&"zP8QVabԢiD6 _aFoIy{0N?o8vh{QPv SOt
+ԏmS!ǒ;J M֑IAV'$r*OVb͔_&&,K=h\߶ OkY-{Z#7 D <}T΅Jm&u&A)5{̍KD*!R=PEclڝQ-*'WN! =hܫ
+UF(.PQAF B#"fY  Ur|p{©0?ݴeu&f;*!3i:]r:ǫ U V¨ *1q7!v/x"?A=?ZTDJ=ƈ#-0ddPXh`Q7I !qBU.˸#KVyCN~ݐ?q؇s{+JZTNy43> H_h^tc1yfQo-B i)^Q0+6baDLԺ?/U菴 s] g[ y,oM_6x)>k'Rt!n'%;-p?sx{M "W~Z'ͨ{I>,_q~,'oVeԈ!
+OpZATʐI#%[6wbFj f;i\2 * C2;>*׼cNQO0虋=c.n}3>%UyaH7y& }h%V@qޟg-%a 7Hâph5S'oJ j5=e ʭ(6Z/IBǧeRO9r ȩw9UdǶzgF〙xJ$j U?*c0G-Jk=bsp]jmYڦ9 _⍀AlUM~L cK)c0} gAq0WO7-¡!8Saʣ6U
+fRy;@pϚgׅu\ABhUtڛyb1Qȫ">X=r^қqS^x=&I)
+a Wh Ůٙ&qd g@_;гg飬B-K< 通 cF7>rfѝb4jIwKxJzU:;B=zcvtU?r ٙ7;ds-B)!3Qb]
+~/i;bMs\ׄ5L,/Z@FASSZsV*`o i<5ukZƤۣ-q
+8"5qo`؜79 GϜ~>?O]/~XCFi4KhL9AzlxnZdߴ2$_TZy2y̍\%}]vYTdQ)S3P]E;>2*
+!-TNDKl+BC[+ AM953o&<0Nօ#lZ I:5\0 ZzAһc%%٨Insdmp>+h*Y?8*1_S~fgI\Oz͚* d80H_yZE=Qr79ԫ.V/Y7{OY5ܬ>
+:l@ey/ا /g/A
+#v?)W~]7_3no1GwkZ;S05+$L;)-NcEtCܷ5s (<IH;QΤ S@/KBl?}F7oN\/B*@ ~f͙KJ&nS Gdj!HCJ3AaPSMuKb[D#TaCAD:R"5%9݇={3}Om,cpf?[V'o -+aU le44W: d척{Cu'h6|jѵ_>[6nݴѻ>i}Lhn ~RFzW
+ hA=ZC;iyQ{@ l:N+CW>{3,bI;KE=y, !+@z8=r::P$a H\!,o;HČ35Kupe{[#:Ev]P9Eᙳ~f2, W0 i\$"ڗ#G.Z{:* e:Lxi8YR]/Ji sAuB8q/&-U ƅz0H&diK(gvV۱m=dݴZ"ODnfA6MBQ
+=NNq40>mO{+{\ ȫ0#`BfPRCKq
+$
+./ ʾ+ok=Q˶ɰMe|%z^G7IxY30A5#ST+yf)VK!YԂ'm2nG:(qǧUO9ow%J9[e ݕ,S.K`-0}^~jG W4bYjqmꇂuҡKC*Dݬ+/h=rך{ƭA^[<_I'ސTݶKz%~|6,~CG`XC4v:ꙵguc5>ZOheܧ\[kj{(=~C_WӻqASdZ0 $߹y RLL$06Wp|:r;ۮ-!:'xb_5}ޑMs$& -~5BX.5 ?DcTi` 4 ;r/zFm`3) WkмlixD!^2)KY-^wnoCqΏhn.{嫇vWM+tf6f^S|%W}ѐMgh,:S_" Z \36Z55m`ܗ.7}o% }Ӹݔ8\JV+h󩋾Qj Q(G 1^DC0XYjM`t's{ٱMLy!ұ_'B=ż iQ29KpBvӸ0!(fbpD2ɔrUh bX~[qASfp׃*ZNܪ\/Q;Z8ʃZ>ARYƏYM@N<+i rM+
+l׵nrg@0|sl$3lb2LcqbEAEE&(R*. E,`kgf?Yw~<*iN"^6)d
+k,2bjI2e Uz%d,yΦG9O Z'L2H.[?L&hYa# /{<yV6 ^G~cUz!O{a؉Jd$\*R rۉGX]Âo?v)bsI1焰\ z&L*BEрF4K&|nJW>
+ԭZ&R$ =#/Xx m2÷đJ<
+1i?[sHMV!m5ZäbEڢq=ZN_$ WZ&rhX`. gAT寮AR2tφo [8XFhi7r )aA0uOÙ(@<rx]^t*jwoq!ȿ檄ش0;z6f<.렏
+{!0\D8]5^nUy NLs>?i̕7˺VXI%_iO95GavlDe|n#/5&O>wkTh܃պW8xC36&屟ik FOL{ S 4%F1T)"4h8䄷V k޸no'h$v(^ urrOY 3 #n9'3O\2P,T9Lāԟus[~<QK1&`Oyр :<_s{i4年$6ȯ;>H֜
+/>ͪ4̋Q`9s(^0nǴ8z6mcƧfԴx͇Q`VdTF'Mz m M6`c/cܶ[1I~[F7iQa߽xюym#ZZ}|\\Ƅ :
+y]Ԁ~,AKvxá ۚ3یY)vz1'^Ly
+:N^E~u flK];|S+tbǶƂn׌IbgO ۶%zyjCw\0}AT׾r |'?Lzl[Qv=tB! w-3^L7X "K`]A3~G#Mьn&/Bx4|54tL{
+O5hӁ>O p%qgνxۭԔeii!" ;ȢbZY,nln@
+—}?2ߟys~O5׶c]@#*<g7AvgU3JHLPjF~pg?)$f¢|6GYzTԼ e~%Wƚ ݶqy^.+@ j9 2pjÆvBD h{Eޅ4BMշ,jMѲ
+r^Pit(OŘV
+,
+hZ6z^X_&H{N$
+rj2(sG<]5Ӌ?q&Y?WnS@R
+l㔒ZUSG&2ʣ&u
+sjufDH@uuZg9tYJv澁?mˋ>ÿt,*0p^@sixh*hy94X%MIbtSy6&4Wi|wYjzO|U]X`WVo #}'6?Bn꙾b\SKإn9k^9Pw䧎q}q/4G,Ћ͡zP'|⁁;0
+ lm]\y;IԬ␮Pݓ4`p$$ b#<
+.nWrk2J.fL3绤T81!kRӣlMVt\e:n++tʑQzkA-pԧ"ƷN:\|ZNYp`dbL!LK&
+ܳS 3HjDܝ~h}!je~*D
+2OMej)*ƦDL#^X&}M5roWRW鮳M;5 w#;d`^MrkaN# o_w(rF@]sFwVО,/(yv_ ;
+a^P^\͖:,rB;O\CwgR:Notf;z1jV
+7d+2rdU!rn;ϡwSƀnNa(Rê`KmI ֙>]$ekKqWVReߟo'_ͷ]T((] uKuVզvdTDIbRɿ\o mW/l"{KF]|/# ң,CE)FX1cYs& D ؟o#;) !" KQV5 2׌p܃ iZP~1|Vch[2}y Muv )~o)/rWJ8Q$})Lw;IH!DR64t'*ۃ۝OoͶ".WK݄yLMze}:U7=u "oFĭ}v*)3-XFLs;vl{%îa b6J8лOC%sԜyx;8OC
+|F;,D
+qnFxrGV-a'Zcye wS܅*y4H'${~q&Y:G9^ XzZfivujSLnnӍ.ԣA?;|=QD
+;gδxN֦rp#nGZmALf@],#e1Ao*@>IۣtQBd2Л6O?]2[ K})΢*Xr>U5䶶5i`Ulʭr,lؠn\2?z}zogZ&~UiW킫? o.K3
+) fޗw):A^s0zs kBD|DSa6j[p0MQ lZօok=g my`s?`
+t '& 2:F%Lو:ѓ&%'c {s~Yy| PL:dMsme걸<DFL\g~;ϵ# !񳺦}kA,cNdؽh#BSѵ2.c@UW6rc ֐Yhg,̫xi*{"&@X= Ζ
+lrHu r.5]<AgJKw=Uaw{&}{o&措)!2)k*^jK9 i%x0&h}ʧڀsiqe'1Rc/4+ku5NVw/RRDMSA `2s 1tC>6x]2"KV{PD>U")A?ugvGr ֩S!.j3]˭ǧ)ڊ_wl0{k <۝@nGJ/|[-0%l`Im&7eÛ61)쎲mq៥sIQ=oT.18K(9%*LJu*(P 'Љj
+C >|1$&:GLߟ)ORъnWī&MDJZzZX3LK]l=N9xYmTẂzm=-^]h4 #eg
+zΗ˵V"9/
+p"ʧ&8ٗZ6DR3OD@"/kȱBզ\ڪz2_<
+XKXH<JT1|U3%AN v!%Y7l_4P6a5ر܌?Rw<6pJCpQӔdB=LH5 9犚3y]U@?LЍ`^j/vF Q76򁨱`k:ę-p,52\l, t*_iʎ汯Ĥsygq.wXi'W4_-wΚ ykBMںDugj/JhY
+julsmzWWMsa1EKr4A<w0/zԭV<CKuOKъ7WŮ"d=1Z]U`Zu$xG獳MG/VL9ZMqay?@[&K&QJK]Wc ___B ā1!U~>L\ QWm?޺Gc%Agˌ|pawR&R"
+[%
+陚@!3DZ_~Ȁ싪S'3LY%fqo0
+i|6UJ:lia٤ؿT]`ǢlP㓷y!#\F؅uY.% yXf1EJcs%Ju[c0_|xiKPlv'֙x !
+Z)5@Y#ipv*BXߏ
+9ѡNe]љq$bB>|ZS.1Ob_ ?e3皙NMvm,=Si(A.//Tfh*"l.әy1 s}?kȥ%Q_F wRBJ΋mY=~/iУf.*g>b:p˲8 Ezf>gԜ9c3uo7Lߛdhyl99A/ ,YBXwoL3~8sլZ0ÞZ1{x^͋yC
+ti=I}lH.V1Q.!7\]Y;pΘU߁MHAwwi/(U@A]Ä{^}mʾn5ϯ7ɉİYL+U!yk#<؝EeY]K
+zYXéuIrQx.nJt+{5)~ic%W &7/8]53im~96`2:C5Bdm)H˩+)eI ,:&l{ڑ>.
+Z1ǣev3FOqE >y[ꎵ0Z-94nrFv_;+,i
+(Dȵ "h}
+ޤGٙ0j2t(2ݯ`<w)Dm2aݕFcB"#))%G,06-k.=6ߠ$WhHW]1x_#&:O8tg)/Nbo|ZcPn; )1~KV(
+,"U>PE*9KGV5aS;jds{k o 5Qi"f䢦NBdIh9.;q%[a3moEP
+@Vm3ޯva#l|YՑ`ԅ+\J! sa7$ r!cä.zVy?<Ү.=`@vuTҾ" C#@F$# 6Lߜz.d<=s$O֒|_yag_ 7r.@wՇj`!%$L83SkgjOAy2v1F#WL GfI%qmA;!l呭咽 i=3\OƁ. oz*qSD%n(HdtuN}raw}7f\ `wVӓ+=S1/7#<⡆
+IZm %?XliXhzCHKnB?K_,XDǬI-
+RoQ~@ɬ;[ jv\$>ܕ 3I(u|eycc(fZf^f
+k#vxh䞦@Nl]|[_֜3ِevTp۪IYlW(R?013Hۖ5eDdؙM;~}TP3a61a$A"h-$eCÍo_kLuA df.)&rTAD^V+–nˆ^D###:ż]>ϋY{^A kfU 󤉍Ŗ Qls 3
+aՏ-9Tt󽠖I88{c6)V@.q%q9;-5u[ZֵRႹ("
+Zuiq+\ET6RpAd0$[9so|y_ Tq1ay c7Hqr]Zd<ZBw`KXp@JY{L/Y\uwr
+/;88Gq3)fb4yٞE4
+Рsb++-1Ճ(U! .ϻᘩoS pa_ՋޙHhU>M'ģ=Ϡo oeC
+sb5JJAXf(<ozḮR<utGf.i-iIP}8Prfwr9|0 3݉v$둶`ʂ+f&!5 ?U| pPM%i9¥@e|ИRl_qWUug`n%0 M'8Ju]yMk$|;2Q{qoGr7}Ё^z
+ENeWYjwhܫbZYQ]O٦Q g947
+ii㭁~
+<zDEFWp9ݗ5g@E`p VX{+%ǴW6\
+[AK-rzrbQXۃZCeY)3 ^nmCi?ld^3렮ql"UiAL H0J @I %%BB (3Ǿ^s9w]xbR""܊ƫ11[1#nc ā]Kَʳgt"!6EF+=JDVd3<d;S#3 "־
+v6}d›g㍷b`v ]@@طK_Ⱥ]!l]%Ԣ[25a1
+h)l|S26ߖp1%aaȀF
+ԧ&Ͱa|s55Bm_V6&CM61a璢s䪨M\bfKˉϳQG_ $;;_\WaoZ&<&^<6+,35 j؏mxG@eat{jAH %4x}QhLX~sr)mCϓsKC: ɫ#@~-*q2¨U` s:<lST2K?
+͸QQ#3Mѵ5-1tVHD۵J~]sZDO*ϵvt Ȇ配!-Fp4|[.9#gմp1
+ Wo B3v!3veh~.}ovJY 3
+Ok[ZjPC<+1DŽ"FpNV-1xff/!oC/U]#7WkG g^ꅍ%Yg !#fS܌1}vy:>-=˞)CwrsSl{GP
+ulcƯio۩!
+ fXb!+!+nrBDGtt\؄@a !dYu=7{|ϳ2:C 3
+(awnԯO^?mJGM3sR`)=ak;^ bKyu[RV #c& >U
+*yƖH:rm4z*aėym9
+nHqtcOV )i'@3nQ? QIwv2#}U+I/D:}gEXY"ȹ@7ۤԘ{h)t⋕^n"ޡO/bkNnWܫV:fy44Ū /}r(h *`Q+̼v0K4ViA@Mȷ
+NjstgvE=tk!kO~s@3Ik;}y=~s)#FF[pИrD_ K*T)E ޻v-$7KKf"%X3u<i{
+nNFa!aY}r.2ϽJ;zYOD+|4D稕97#=>| V^Vj-Rh42/j>j=Sr e'=eoO^7b# zx\UKHYd㴧 ;ZDgp_Ŵ"'L즸وEG{ ,(O": ZwxX'h)me| DTy[*9G
+AX'rp|!aUB.mMSY~3^gHX:r'b6lqN'an9
+վ|2iN9t%e,\z-CA_8^w?qXA jIʊiL[Ÿ
+~"%'1oN k&"2GFmrځ6)),OYTܴm|/Zwg]wIۙ {=rds[XQ]y72T#P+g'mGY~4
+.O~{yo<?fj2>nW}?c*ձڳ.Q.)vge})ieR~͌(;EK<T z=֔|=f.,$2b4&Z'FRV9)t~?>6 2=r'/O6GU3Е1b1f¤JؔՔ6zixȊM8[*',#eR7:*c4nBRF~;bMൔݜ@=%V[U2aXm -&-01ey
+&3P1#9ann ҚS](3W %xjG uz;:8I-
+SS TU^}srr. Vyݟ3{F)⅙U6} 燐T7pySTy/'#}6[r^0t#UL=ݛ$S2լ* #RH3 v0Jm9Ŕꚜ4+FfKXMoȭ
+0 31w%l-ĤIJkmro\ŲqccO,|y9݂>5K)##a5%po
+ВUNIM vbzVsqUtu0evlF..pC0sBdQl ia#˨3!d tdl%}FiK %"VhS}g@k9C] S7K ˳1?<TC癄Vt*UB6{zQwҩgݏ%I+~O{pFM AY=kQA{J舃YR,Zpz+kU%3j ]ܝ_YhMy+1c&7t
+1:&:5t,dJ'슫0tg[;ZQE=,|]{,MӘYQy~Dm r8!vjGROiŸJ%{n).&jnZ匣;3U㬢 6
+JD،Y0.Rrn6g\2j&~D$%93a4']RJlQH֐r Pdvh9.q$
+'aM/N8EL
+g-)B{P_ ps_z/
+%܏_`=*č;yw}DŽ{?2IiNhUfqD'][<p*e s"sOZ/6H[90Q5=Y[3Ro%,B.Ϻ43ᒵ}*(10jq{|'mfb EIC!iIY
+fStÃ{amaX!2*}ϛ.JE Ja!jC)AExtڽZǺ)=4aՄOƊ&U㋂_}P{2}(:ZmPSCw?u٥ᤳoph)Qz孼i<!9 ѮWnryĒkcf&n]RjtvgekpIp)ľv3 Ч{} Z!}?
+
+:sPpF]uRj*!lzd|ecNI)n<
+Ga* sRnaCLkW6/ke, *7~Nx5j-J?O2?2Js^Q,лƋy5fmJH೼,bMeǓkoIe%'0P4JצZ&Ful`wv;:U1C/Z5\ԡ:8̳VGۮmK`;'<Qikyw,y9Ԍfq;Oq0uadi343qԭ]۵`
+;B81+ܻHSդ֐s ֳUQGMs'u1q^Q}qH,ͺ$
+bAVyP?r'?PôK-ǀ7L&ò(j>ȭ
+jui YyMo=!Q˒nq1B=F,ƌW!(LK{lvE,. YiXm74Q̓q4lT\L͟;N*'P%(siމ阅\)%U:J7}]wfPKC\
+U)ɹ]1a=+{bf>Lr}eۮkk<OF O
+r !f M:"͹'FvcUzEu`VaS0~4cLY;K WO%zAf\2RΫ䥝Jfƭf
+=\6
+B4>\4l 4GGRŭ8:دQt
+B|}X><B<Y">ZuB<Of6+EA~aV+a>]9[EL4ؽU{nDָ G՘EO8AA+Cz4w7ө~S^ڝ{<{ j,l9YV $氞\_~3,ivf `R26QGpˑrTǮJ'r%®^oA?0#F~;qpͼ<[9{%%R)
+9۔AZze;`ґQ\fVmUG"jKԃ`'Rvߑo_oI &۰j#뻶n.hۇe ˄ZJqDX6f֨!^WH-=3 ã㨜9ana[5P6^g8w̐K
+;f$:r*w_\o;> y= JԡcSYTe} >5w*Y~^K6M)-ET(Im KՌޛGY{ofAk֋
+4*jIw|ozoyD{TM15!'1POLϨjL5!9jzӮQ8(Œ$ԛa1D}FftD!ŽO7ZbyhmXE Ojv
+D,*fF{KʺoVGV7ٔJoκRjtlǕ7r5|Cp+#'fk^̺O p>p<^ȮIh5aCuձTc~^U2r@KI䔃;3P+~ rx,l6Tm¬Nlow^~176{?ܪ Ǯ*He|)hYEԙN&g{"ffFu *<
+f«d6T iQbAg~G
+(e[K6,|᪎^X53ڪ}JVmD!&Ho}L0r nHw /nd-(kYF)8L*HY߭\NĦy"fD#^RV.%h;٨Q(@9;!#f6@[δwH]o91X
+jɖDTLo^]w+i:.ؕG-mYA)LP+
+{bVCD"<$#jxU`zјԳOx5afiw:GYäsa_PKCS愁rcBo-!.WySOi۩Wwݒ3MON"jymعDh\5CJ| Y 6u= [;' W#3N@?Inv%.x3N0`g?W\z"[V_|)6 f45=jj:8kCӴjdWy,xCa re
+sfQr>2/Fx{BS[w~- g^ۇa=T"'G W'H֗y;MO/o_jxNA({AB]7MP
+}czVqE>˺cQ# ĨE(m3NJh;akC*
+HSw~kfvNI sKž``n%ZnvMIf8}V+v1` c/ ۝.ɇNǭg]>{}'X0 Vi"La`E+4X0 Vi"La`E+4X0 Vi"La`E+4X0 Vi"La`E+4X0 Vi9"o-7SEE: ,ሮqjANSIaN+ljVIqYBLr>Kq[!BovJ%4z>8%RnOd*2~EE +J<A_+/jk {ϫ*NF <A ?s (978ZN;G}4Wtq ?ʕ˝ԯAʪw1QtU΅:Y%]p'<~+:A*
+ [ZRu\@pA?
+:RIܓ7pNR<j.  I.^]o6<$٠=@x̦?v5`Yׂ#dئCmgdp:hM%s9m/3.*a#HDL{=bLk/N͏2+䖴M:L O;\8tK/-vf.d&2vg+X@IDQ뱠;^{q
+1r~ iݘC`P=3T_>\еA&뵈uLZR ϔlwJγ9$noSalvg=E;_ j|Q绩I5N`ڣkxx"Gf"H I_2$ dtbghEԤ%1Is~]gƫnz6`&"vٙQubQͅ9yvohc0u>uS­O5&0i3GݶU<heB7lo]53Ha9ԪQ *|"jC@u{qRPaP}=Ҵq(h) V1bP1Oո70
+ZцER!+Òd8? u^Wo}_0IFF5
+F9]#bn3Wׁ-*b֟*lحG[I"IsGوЫ_Rx^ ;ta-Xv)16Q1|8JΜ_HWk\۠_ױ3/ˠfԲ=3`X*=4d!829ypU'HdDp.Դ)?<lEÁ3eI5~H6ώ_9Yz-Jy`ecs!B`1xCK9CG 62
+ -@`i/b"Baտ=Vr<.]r75p-o? b^^ۍW`Iu@%`~;/%:kHԡǣE1ICGm6]wqZtɻ -"J砾;w`n}g>:Q!mgcQa;0RX@^@̲Pm qR~8p +aaV EZ'3CMԓ1gaѷ7V*
+ Q؆eL#Cŗ vZdC."v]'T4/IvGĪI
+/~Y _m vmԆ 8ڼyZ;?|pZ,d@s1 Pk&<wM1֡aY
+"9L
+MLc,ü>'*GB)
+G=D[?~F>V/F$0}|a,ȬhGs 9Q=.j9|*ιO=_zv}ˊKܺٗ3C7(\#v܏@K#X%j6V11 1i*gZ[P*#kP/> KQ:2ҒYf]DWge;rD';Iw,tTZ>7Pԯb>72ۨCjkNŌj"|XCG<*;O) ?I;}uoZMũ]
+"~%zɐ
+ !yˡ}rn]ؔ
+vH) %j=v?AVmMwb, g^5TCgΣ^Tl91nKh@ܝ<gKA3yvhȷe5:n:#
+uиXT()T=K)_=譍se%gU9=6@MOw
+jxyhk%VZ(*[Es.qLUȀo4_/+R/g^n#Ton93q 6(J!8_1ApuN pQe 6Mn<(*'~+^^]4щlL-@) =o{/,며V\ٲ=%cJ1 zM%&`/2k+D J:e}Y˹RF%lʭR>It9 !QqNZ&1RtNލ*xUٙWͱ&INPt–[ |GkPv$lg-̹%wEo/iYe3sUik~[;<슬rMw)`d w.l|\ί\E}*>X_?vVcJ:.>rsd ҦEYܔw.qjv^uΏ]>,pkE5M=mdm3<4f\R<ry<˖JLūJXxD:f]=~Mmv 4SU:.e:x7Өxqo樂& 7rV)QBG-F<dHD&a LP}OځECTB+z;N r*jWfVMՕ^K'@T
+?xJ-*)Nj$MNBtJhQ<
+L{8Jblg7cBV^9E]4(ccdR|j4kZcįQǤɚv?쫉4×s5=Kx8N{{ltlqW蠲Jؒ@HI}aq:
+:a &*{
+!|3Tܬ*1W_Wɐ۴DP+ڙޝ^(}Ҋ쬼2x_G>$)l%¯B̪.=|Zaz¯5'w_[.?yW}ש;!+
+l jvy<}鰱73-Fn)BγkϯXz$TIw[wZ-
+ ,nl/`pfk 2PaSؽ߾}Y38y 9F]I)df1^aZT]乕-d8010(=sSp[5(нbbpLC6ìu2Z.eA8g.>/mR6
+nSLibfOi 3o&~b6=Q1fX1@41DUr!zACgQSw>eld&]Z+ WZr8Y)H6q\f%@? ,Z Q>jgCr/9ˌ<W3q>Fw
+bySG.
+zM ^_0y5 _N9S!9" ?xsZ{ӊ,Zvtf}gI y;ƤK
+tyܜ"~ɘT9lܞTAWosWMikb:&ho>D< F44p̮\BuUv|C 纕{ LTPr+pE
+?f%4wo$Ǧp6N@(Ju,ep=T\ \l}7fUoskLܮ3c a!O\h_4*X'](܁ 0Z;TZ,9l|i-F:
+i?I$C&o4& +YŨ\؏8'eR2}j"O_o|[SU3;㺎֮x," Gr's'ꨌ(&Nw'KɾxC*~~?Pġ`[.kt
++0&%J:]4>J~'L4n J\D%?һ(m+ޖW{l{Vr` 'fg[h*<uX)hZ6|YFc)+]cgAڒywfJh{#ӂޘe sZmu
+M}Y˟)Po=gh72`;ZZ9TǷO%玤&zĆ_R@<,4a)7αZP=tB>
+˹}>a68ib:@,Pa
+ slrdIاؤy%l\]w# a3H7.l4nKa\M[QFş>~G4T YI6 ^.0E֯erX-Š=݇$Ad&f`3:.=&am0A惪vnMVK&]=Ų.A[ͥd-lOvOɈe<eLDz%o<H8"o&WL2% # m,Yz]I% SpqQ]InѱE_ž<~?2~c]kyVcnG#?vtoSm-\;
+wqi,سk p! l(2
+0teB.a6תA(<v Һ%o>.Š_eX!q[Y3Gi*dRUSO,&d1<WW&/N|kfˢjefo3 O,ibID=cia習LgݸfnG&Zů/ǝ:`9_+ε8\7V i/3$f1#8se|K /"=Tq8$&HRۍ"{QmeҳI*;MQ3-yvJZU\/: +#24v˺ZtWku eaQ'nGcȅUx6eTL˓1tOgN&^Y]6qi/mNԀ:Ltƍ4n
+C4 bVI)_W*mi:wO'0e%`Fumr5d96 z8S@zJY ?XLmp]ZqRj{֤8`j@7Pl6CM/ 탁V
+FaA+iF
+X,q ߳ŧ,~s5v_;ܲ$qwry+ =X%t~̑/M>NRQ7tDqI MR^F9k1!ޮ ߹Cfn
+*mVҤ][\͝c nױn1?4=b}xnR6=Pqz[*Ɯ̒7ېzάf-4H |j vfz{}C(xͅF텎ȹfYGf>ipDșŽ^*ffpaԭaqd|wKbPE
+f#]fR II燵_>c R90Y"$Vד <5 m5w^;ԎfP7V0U7޿W/lH- IPU'ݺ
+\X8 E#6]bfփz O繄j=i7ԳW'uRa6S-G(*׍8jng!3*ۢ$4Jj Ʃ2*,A0~~PGjJn5qg#M(p p0otҍr)m<OwZ;vg+HE_|ʩF1U¤UnNRL Z8o.ec~4JLdEy)6oPəK|R3ʥ|>%䜳 v#TTT޵5y6k;&مM6}//=yI.維3}d:C36viKlG(o
+(9%H Rn/w=w^@JwGʑ4qjEs:A`%.hgun׺Ӡk V`Q`  ,FV۳{T)?mmM!:,>t-%g=D2XnV7O.GIihߵXZBF̮u7b-̌-fzGeO۳_jꓒ45ݐS^.,|^0]9[No^Hs:{t79*[n7T^:^_՜NC4nߛ܍OUCo3f?WW_W\#gMu87 H}6P]5^biu;;y0oUurN1KZl|mtUuEl3>X\RgZ 3N ³\,blعʼw[l,}~S,&(w#)rK`l),|z4jãdHo3 s"zʡS+*sR*Y!E47T{->^^_FP|b?6S`u{ ]. $8@ғ;y sB
+5
+9g1x(e) x,q|wTP
+z[Eͩc[EhB'?$IpѝoLkGud<DtK V[q K\HO~ߒ&3KՈ  5>('ꃘio_8N­bΦ'q<w/hN7P}mE7?ЌN?WRںsG*ß Iº{~;aơRN|WKJl$.w2AQjBwAʹ7V A+\*xU (8QOXxƩSuX-!0Ha摭ylh澿FB؝ș~lbflTϒZ`RvkD5C >Nc-c2\9/4rcׄ,7S LjnN7a\k)#yIC[BfpO0[3mW+"D'ƺEMW>,.$J@@Dփl\> 5طq93Y-b&ZoWb id
+]
+=LIƕ/(_'c 2&{%x!1qY<hmoC%v*:0xWly+PRq)A"t >!>fG bShG5J*+-A,ո]Sz 3g$$j(/-.AF]OT.}uY!F)!i@}MEyqTO %FMG*p7$E2?*
+z HG-G"c\`{f$4:|4nv䷿OELoD%=ʆ[WO/R$/Yamr
+Jۮ1[W;oM/>rq4Y4hlRjBL>lGdyKq%SBlJe9,y|M7
+bӸS&9 9^=''祂wZFΉc)òWMo$}$7`_|C
+,2^Y~?LVl`ϒ>iPyx<Iy5/L0A8s̛9=3)te q$˖ek6B@YrBC I,qHXlm1⾑l<YwWDf}n;P7bழa7|s! αPoD\8|aod!tcǜSO =eK-{ :n_z Jeڍsj?/=~>ȁiX0.L qbOB4C7a~!B c^
+=;j?\6ve9(K |5U#u%8ujq[Ln3S F1E6
+gHu}/btO9O@oA,xâ{ >n9p%@yewKQ
+pFb`pOtj$nm<;औ}
+x@u`ZKȌ?@ҁi^3 ܮBmQ޿켢 lX9ϛs9 [cSXyX|4:x?[MVho෢(熵 Q!㝒 G uiU؈AA=J$i40OOOЦd:xu_WJ,5!fʮ[()-!v__4nd`XB@orb=pf߸ JԳq,<'b1] ˆ.>n쭣o_߾{am[6b llXZ6~>BziHR,\:hF=J7~q&4t!]Z;0fzQ26GkQ}+f727) WS1wTc2mji/%CȐՈ'2=Q})2xZ"/T.H` ?(.)qqIHۆ[}^躐6>vf/<~Z12K dF#皾&:9;Ks{3}s
+HH1);%mƦe6]URn<[*a7xTOW
+k
+.4
+
+t5Ȁ䤰̱(uX9 iLSOº"c
+ 2PMi/W%fgcDЖRz,Nr lH`f1ܯ%>5?yGNc>R8x׸B4r28T>mon5$4rOZD髥}Y¤Q')p:
+u-o~|w?QYETVM,+ַѿ{:z>69 1|@͗Ma]SYŻu{lBkCpWs,缲fR^5/-N{oxh=ŅِBu%bi]֟I<h;<K2Qb!)!a:XB(t:>zsK_qkaPs.G5XѮG{v_OkCz0mRɸ?E,)~}Qai䂷eS\~"|c&9۸FzRix^=$sx&
+0
+VԆ-PE*Z1jdӛgG%VyG[o'X"\Q2#PM(&ծ)R(kd﵈CziȩO;`cQg`iwP;E̢n$&k6޽0`#8QMnWG-u 1;Z4H{1cQRv^B%a=(f֤O9x$ $%z<lוU f[f7pk@˭IEANI[ZxW՟Ӑ #&>`7cN=t?gx9(:]%,&"}R٦lFapKkt[y"E!&>ddVEp[M/j%e~{Ą4gl7Ư4,fvo?tȓ59[af^[ 7P
+xi- GrbؠOT*%t0ޯebv馄- I|3 )1(&ș!jC@í+} {RdLCBN 6v{^s<~e[K#=';(-Ŝ ؛#bT蚀qB3%r 2qQtpZF~<Rc&A'zpƟˡ o/l5#n> ZVNcpVԓ b!D}OM
+Yj8UsIZ_xgE 3#zC~Oɩ:J`{_͹Y]A3G+>Vp! RTjz~?3awVgYͬ>hs%jL@Mƀai([w4,v@>K[Eݧ+2jHˬ /"NxZWzg~pn˶z ΝRfid(|(
+:nRxø;lz 6G.SrwkeN1쓔t̚Y1cVI g[#gòr74V
+ ?' uy^4V@+h[CBznmHes½1ϓ<T =(MA
+Fti
+pX+d<{ lɂ5.TL:8=4J
+Ҷ ]8whq䊈CKKS#wkb,;u(@[M[ۅhсlfq^p);l 'oP$ȉ h &9YG?V9|h5#9'ulBLCkf(~c(Q1t⿷xڲx$>p Ŷ8 t"Fz!W
+zB6N
+:h*bM|=fJ ;bebT^pK:[=SV#̣qZ.B$d:dU n1# O0܇:FD/6|_ni8w r;pNk.pu
+j%!qrUF5MH1DNO'Xp窉JMJ|m
+sٗy]U\C>a?) 5|Ea-
+<mx҄#7٦lǼ弿7]P)݉T`7JE=uI_2įu>Jͅʯ5Pc^r7 +0t1*F`ojxv4;D{A!r%RDx6J2t9J'k"8q;6m;TTe+y9POg2S_m@@.
+a~.rGdE
+ ? 6:&Jzj.N/՜3if #U0H
+u(h[AL] `NL^A[{Oxo.,N p$rVpV[7C1\YsB,wJXo BT7\(9Y.lBGEy-c8.lS+jg^`|j)^Q!4Jh<DD ^h,+Y`Q S  EɆar CX 3-N)BV#x1WM D%dkEiEY ]sR%`f-
+wrDNn71لwDm:+ZUO5HoT{*A=5?偲2QLo%x??(r|*OUwH[M
+f* GWv
+h>SJ1Q;|$:LYX6Dn3\&\Iy޷K[+n",", .⒊
+ ➠kZS33Gx~Ϲ8sݗP^3J~rQ~xřNVBy d#l
+~es*
+倭[Z|=iNr烕um)= aAj:?C  I
+!%V?eorc\uEFZdOW
+erYV'+.["]oQšw,a:ZɺA׻q_*Ütc% m} 9BGؘK %XF E{oZiG^;Bϕ|(1lr9C
+G*yi*,eWrS6 <7K
+gE C[Ǣ`58y:|gIl-Ym{nhødȫj
+O5~Z03֦ |csP .WAk[
+uz(e%Lpm[,ԑLST]{IJ{FW[|9_Yl(?X>LQ Aba6Tv44ob,RRMQr3OEXp162]`X+TӭVfR3M#-tbHKIQ))J}33iۢVS\&\D} \
+K
+t=_y}=yϺ_wsWAB@*39IE|ⷝ[iSQp"NZ'Io\TD ht/А>)>:\pum
+T1+!SRgK t
+ݠ.^ws`Nsc긽. 1mw&pr$e!+{ϽOAHoTgUuWRVkA*,]Ze19һs8CK):k1!I|ʏNu^6o먨/W럃Ap.O4AƚRQBBPAem:^8" Νօa
+oy *>+ŧxr"HQޟY
+h!g[b^Qsc5)rJn |w
+ҧ`w]w
+v6kh BF۹p4 MO&1ϿȐa#9r,<*Vi
+'?7:VOŮt|"@vKY'v9qhkD-*';Tȳ^Rr?`zh;=j
+4P|l,1#h2~[ ?$|%:k^xd <}z!yeʿhU@7}\j&>MHFnAet\3˧&/7ЊNE-Цye)t5z5xju69@BM WvJfiӛkgYF]zh`:xdQHѓ{ž]V%=aSwۙA@<9d?qa["D8=9Ày嬢Q@<5`)\*.&օWd2گglT
+=a'n솪 (%1F7k}];@-t+g.mS^0>jxq^,PB|rluuks
+<̮"9.%@).46!b5X$Q^&l Q,`łEAņ5L237sqZg=k?Dl}SiF؊ WRmK[?!iAq4εdkTb$:Q0zg^؏E'xwfPMY*Lj>ra/g~LFՂdՖ,SuY_+t?9i9y`g;i wDpgS?h
+J&kJJNal^ډLkm] Ȃ{0F]9?758JID=Q5.8
+z0Y|8E;2V-bk%Q/k QaF)LOi _o9ҥt'bz`!bs<p sdnVKi{h.n, riZaoͧffl5뻘;Wi*q|KeZ5lyg:
+cö MVkCށ Bu^Pю}kF{baQ
+r:rn]yqtJ<i[
+. E1}{[h ,sҋZv>/3wJߜR aI{E>|5hRKfeYe^wWuYn,jE,PWk,S⏛(?vg* HQQ(yWӍQiv;5갗tj2Ԕ,ˊ-cUsEn\E4DM~i= mtޚi{`! b]
+Xnrt+ZN=Fxd.ri|!rD-A&J-A^
+txG* x;%+ 늆ņjҋ>R e^?H½PV?A8abC
+>
+]RtnyDrc<xG r뢀t dV xO5|Cw lAv[i _QB
+3P!AlXOYzy綏z
+|LP524"颔cV HC7*d{S7NrZZՁuTZq|3$|n<<CG0vk\T Fb]$#6rլ p1F,%b9T\iY4#JK_
+R :HIOǫ]f9/̿K6'(n(XR|!ηG'o΀#1 ܁@H{yӒ4ݦe"t~:\>%1ZH"L6iM{Zu>@ } Kk7z{ j9RLZn{yXG| lO$H# %PKb/JJDH]$No)v(mUQi;/r̋<3ykj kͲ1P%L̨(` -4
+,HeRX
+|!@)ΓO)7>?*~^7^~7J>c6Y((.eKNRQ( >%N82 8D@
+ =tALhP)q]yy}5sm5x"y`q{5kքN4]sH2bM23!
+L2H8(T6ſ޵|uwdob9hPNh;WbbaL@AvT,ҘF  ŤQvСυކ2:|zΣη%]lZNמl/mO4mRl.Q,e0c?*(ADeBIJW 7" 93lXVL=9åW=z1ZąK MI
+piPKB^y|@C0D€Ì|oSU TWɽ?{<Z^roԕb\~R $1 &K @ B "h0XZ5).%gLҦr0acӞuhT˰.zW#)$b<VཁA|80= uDJܛ;g ̃+. oiF 8s N@SV_/j
+UzetنK=gk_џs{dkܰ<X6gLZ6SaTƬqdf$YiS`wtڔ){ݩSr7wm}kη+g)՘V7?t;"٤vH
+< %Y9 *RDxKM $|63Zw[qz1fxL32  Q[ڜ?q/z]R)bF$|A.?KU[X%P\wqcۖC}t {ngzV2ib @bd"P4*V4`K_.6ge'C'CWǔOwG$+=)ӽ˕je/ y<.~AMn[=_l;.6q|?YqͳrW]{%'s'{HvH_BPT Ҳ|2P,̀\//NjkTriKgH#MlxpK[~ս97T2~Lo8GsE\+DGBjL"QD( ԗK9iD]t{3ᆐ请c?GS[N;d̴iv:$mvC@76l گ]@BHhZ. Ђо!Lw9=o'y8"aX?zN~vW{- {ߺ_=d
+sC7)+W
+EJ!b "p-G.(A|K;!R!\d*9j؏|KӃ%aMr::Ijv[C*x,87.,)ؖϜM%1*";b+5xĵlY#MZtlWP"%'C/$U}G:fgxiq|&#Doi'U/*M*5
+zmS)2+oVyĢG]B <| 'MGZ#̤schR^オ!iEeǥb7oFb[s3aBQ?5Yb\>>H6EJy>hY,quRj._r{hTAJA/7Vd.yt0 m^4l*cڐ EN:Z>ӱ*/DݣuZĢ~@\QCÝnŶO `*=EM2xs؄f/G:~ZzeY=h^o
+F.e|&)j. *
+֟vD,
+_.,%wG11;氎]UBG_"e.1g*m
+CW!TvK%<:LGIIߜ;X#%2;/"%N,<B*a"v429zN~xAmMSĶ%ӟ̼KZIޅz_-5H
+KZG?Fr5^v+>XOSfV[
+4K]p& RrJi;ZPb:393o*;2q,Jl`Ŵv26)6ƈg__i%#q43$MC D4}7F˾x}Kے
+I5z!1ccBޛֺBVF?ڼub[Zdߟ426
+I+pOȹcXTa;7Ϫk^O+oBھRۤcf`>F"<[iXĜ/ع*:a03ϫϐQ+(؜ݒ0 D=LԟōWK!yI7ԽK|qˤ[zCP*y%bķ҈G1U<[z\a?<R9{默[?eF~詩&3]t'$ډH4( 
+﫢@ĸo!*"( QDEwԤjy/{(i,%e\#ޘob 3
+Գmzw#VgHKvI#4 r;s~Zvɧn!;ƸRzZOM.q 'kJ4¾4yx/U lTׂu
+t$ݭOUtu
+hMx5\KD
+J2ECqL|O$9ЫJt c+kt4HbNw@C@ĤipTײihEWV*b\ݏ
+L\V1)2Z=rBKy5 r&֘{`peWE"no@K5q\
+*LNu+m0um4as'zWqhG`vi8ǭTd@o{5O/)ퟏLղģ${#1vձh:ac#lɉm%#j-âMMxljDp˰s<*z
+2%h'IL؈SB
+NCR7@<@*
+~:әY̲"2K_I:5l&-g!=>oSM,q+j ד%\Ъ/
+>hH-i벾YAowUr,2lZgK22zbzޯ ǁC[L{WߧvlrdW[溲+ĮzGj me|pc 0`ed4nZosw?J bܴ݅Md$u,t=@ Z3tŋ=d2Ȼ82ӂ"O؂T9[~X= n]!7fD
+~p?G<{)>zxkgpS ny
+Zy;]~`h=R>1Go?y{XhxրPQYHR&:;Mv˯'3زtˉE ]*}2zkQvLùE'Ӥ\(ቒ
+zj[~T2 lms먧>YK3(Oݿl^yݎEXm|/>%lRXav: ð*Fܫ̘q@|Fw,X7 _[F?\r¹L-2A RQ 䓕M 
+9褅ё0zz}**1^{5[;M(h ^%6)e
+rkR\=5KgPϷ/~2 h) /nMA}?.ŤmÒY,:Svo_miU ȇG͐Q_W۲W7&a/8ԫCL@j1aң18p S\I{gNL3i1m/r+-˲IsEqYeAV}DEDQT\EQ'~w]7qvu
+>;ۆHj aԳ Aq>\knp0꘠d}&!'@gx]RSt˂cB<"%' bVBZ Bk!HxfW[뺖ܫEuMfXr/SI`"qJmRm!>8mg̣2Fw}Ў@Y;触Bʋs'V- Umr&RD@#"ʨ+CDE'1x~ur(9s}K^}襱36|>@OL2{TV%oHb6E)&fO!MpzR˧Y2}>TbSO<
+nU3h1L,mUWiIvWS;W,'K oPdoJ aYZe$8FyUq;2qFqJү1j 3r-19ej_i趴굮5熊vqHlþ5v>D,F,wEmWYjR"zΩ﫩ۣC{,X]-lȩm
+œc#&T`3u|z6$hv@kjZ
+7T%BuS]b2Kn(|^)~A쮂u+H5?ῳrb=*:ATQD0. Ug1e!ƒԴh#Y )JGV!>cOfF4b\0.b @ #š#ppixtR
+fIe¯?Tĝғꛦ!NM#̹R
+ɡ!f1%el.wN\<f7+ܓ`κTf(ks\5rq9}K`_Ͱ [>#qj|Z.5Bڥ8`q*b_,qњtM#EFn@N
+W匼 9ȭav\Ң^)^ &pIX;{0%:v|M}`ڥUt|D~ ܣPHz'Ɯ6^oXb |p 11l+ջJj"6Z5ۖq:?16w ۓ>UF;t&kG:UALƮUmv )icyUJ03'yI o%34 )r<Xz<zZuy>ҁ> pp:8zi
+=YOx-vW6a#M1p9:CAqhAм%-&ߵKC5 tl٥̟L0^$]7ĉĘQjI4#TTDDNČA"Q11
+r(7jPMjvk᭮ꪮ<ϓjf4zgiW?5VUXҍ}-i
+%jȿo
+%1 hi5e򫠖^h3ĢCd?~>\0ێ7%vbbė%밖
+(گo+ۙk%+jbY`qZ6
+0hGmC$ʖt}hٙdd}k5A;Bu},/ZVw\ҁE^@=%N:aqbfJ}@V|-蝋8+fvqGZ*h_EEnm/kTt*{gHG~jH& dịyB'_BybħPGn
+!X=dži8'VqMq_x2~u Jrў
+j6h:YM؎uwӿ]E]+
+{VP{1s4fg&RWᙁ ZF
+b]G!Dc֜Z'qf#Z&2'w)_.
+asכc; jE|ck$!7NRy=RJZfv d@-m7 niu_o>`{*~T ܞxp9b4¦!e/?OmSFQ3l^RK.=C#dI曫˛=ӸB&:B{w#V~1՚1U6@=X@~ Զ3O)>X&`»/(IQH/j'Fwk6<,0y:ʵ^XTK/tnijuW f04SO5TS(<_
+9枥EXc 0Л}˄Rk
+Z+Uc
+YO0_޿5^"^<L9^CzHd}*\}9Mjg|G lc^`g5JW1< "q3GW!-^ZJ.\(."r rRZ\o
+9'| _%t+~;k}u{c=}ʹ?LPrKSeY^m5TcB evSPiے# UoH˯ElZ)tY[ΩDP͝馬/Cf ӥOQKWOD2}u.9"s2}(AzG5 e :6.`pC&*l`vfIi ^9JT_],xv:PaD8ZRS>Z֞ZS s(50lK"cSw&f :E J(94vViI+LDͮ@~{qgOA/3Nҋ3.;?rS\Oik߹wnfd[61ujLibk; rJW`bE)EzA4O'Oy}>ϑ 遚VgO <ԭ`a*{X@eD b W`fHY<0 E&+&G, VkViI!O`^0&%R%J-Bpo%WEK
+2+nKzZg=a͆舑\f7ɯeLցXpqΓʀ
+?(
+ˉEtg#ߛŽp-utLy:`{g[{ˍ|J< #`<Uפ{7y'#0Z[WEJO=qdpf7Yn.LQv|;}y,=!,xx{B6P?ƧjA_h8*: "o::KYMf{ 3X{Exd55f
+>yAiIkij>sZrÁ ;poy6.^w]"r.'bRsI|ڣ6
+o
+":.5(@F#Vm)g r]㛆Ty_r9Rdr=WܝFAOMLҙ:iH(3`fD73x:isN<f,}]Wq|Qu *1Ҳ+ J[G։%&K$Yï@퉾OP*RG} \(]"-GF86ǁ&h@Z
+ĵ.seĢe.0}Z[N{7舰Cjm
+FOj5bw L/5˄ s\
+6J&R ? M-ym dC< UC C5O
+\'wgPnUvVlJ#&̘ΗR +{wOY`ti]gaVԧ]OG'"->t7J
+85tbxtb[bmK;H#Hes_aiNؽQ£Mnŏ
+&oxUif#s҃€8ԅQOL|A*Ķ#Qp>94cvqfe<rڃvNk} OI;*~ i1\jF-ClSL"d@q@F5LdP (r=k(FE-(^j:2h^W^яC@eaڦbo3[L^:>hS$lXDQtaepc_!uZTvYWֺ *5>=]8 l*>%BǷM&b}Ԉ(B L\7%@^NXoFc}p"4|!!V 8׃+jmOQr.X^ܑ dX_q|^EGunAGћmMĪMYu1/9.; &8PS (~:>zi +Wt"Zaa#_pN 쎐M/蝸E 7EUW]X'ōSS(aawV%v)U|J.3<Mˣ"r{HK(s0v2#kn|O; _R>_|B[
+sL(>kYf&6f&1'fXcEQ0J}iP4{/() 8̜Ss޼޿}
+.c=^PP1?o%HeW] l\cS`.o=U]i-j%cougR^ܫ.u{\+L`3x/)JomF0P*~ҰK
+WhK{g@IH찞@ϴI~#1Xnok Ʈ#B()q|aJS҆ݙ@\j)LީzqM0[pÝrrG%<3b5tx ^@=jf}dg>`|;8;x6ͫ
+6 Ԣ*K}ȸ<zwYF}Sזuh1`ec iD^m+- OM6(ޢ2 wUtr& !P'k݉qdd#Jye{ M PqЖ)rꁘZu-el3u\r
+?6UVQ'] ?Tr0N9[Bߟd,dXuAˠo, o {|:.
+/rBޅ|
+DACGeeM.=Y̝W+ܪGf]pW1~ٍqI
+B.YÿZ_Qs֚vIcmp8\
+qK1*,lwRb$['H)@Qe\": I;zȻ!y@>YT1G/l3Dϳ-RNoM5cD0%7*H+&+d%ٗ٥5~ h7O d[#@.9'ATsqyF޾<Q !S[o<#[N㷰n=\G0o/[KJ
+9¿21"lbc(dz_giώHYJ~ EkepmTM[Nh8UNՐ62ϹcwU6GR Jfk1hc$=]aPrc&^]vPMM/bdC .}{2q;ؤZU21f 8lV&!Kk`S >mNڛBuHp{^R 1%:zEY9W@Y ~{qsԋ݅fg69zaG L"xH{U=Y_z<!3bNTBHǜYqXx:!ϹR[ԱAuXRdxl\2OLSʦ؅Ѫnh(k.<
+j:0=j~oW4"F/5yHܕ KZTh)ޜFXpC/FܲPVm%)9ELgp)
+ o}QˣX𸫦YfPR DH+ E.c ?6}
+ )(Ջsa<g]_|چ"P-kA6FoOAkk&L.KqG&ӂ~J
+2X$͞Ue~piܣR:R 3PɟBU|[OX/V̭ NV'EwԍYWeؤk[!L"Z)a1/NA]ɮYl
+n9XH[Vq"4X]OK+s}A7/.ZKZIṱ~ !fI8cױøshȵ0mcC?P 81yk&ob`g)+#W'jolh!{fJ'{閨E>3jgQ.'ӷk^:@y懒 $fa)n^fqw!tvtn9'l{
+?HE>;1%cS]S1 S"s;꡹6Z%z,C_V\j.~u~|S
+(e;&^w/E ֽiZ:Vv2ȑ9Qq
+3n.v!GəGV!c=*k83|d$:֥/
+ a5<hb* ȡ$S>MLw>b jNRwe<xN}֏Ng&$$42t7?ԟ.l ?'ډˬHN;~Z^ġ]Bֻ+BG:>FZ JR߾Q6"Iwnnʹ pbvu:O`׈ѿW$M?D 6LojfQfH 0C^k:\Zȸk1QZ92qMkEr$L:fMYq8_":)|$y'y[c4k3):)L- #k{ {ؐp )5*oB%c?]dW_]WEy&kOsnXo8[ڐ|&WD li,:q$Gx^%7RK|&vq2лYK`N0L~҇+ J42DȾgVOsoXy97G==GYõ /͍a/EF"tA"?[j~kGx|(eXem}񖊚VR?8
+7MS@w|^G<'<(;e^˃G(m=xc6qm짤$eχ2š{:6gUZ_ [:ƴo=yoOYcTJfZKm@~(9.eUҧGf Ya`'>Tq`eaРQZuIa6D# 
+0q.+Ol?<A NRΗdm>y"=;_Kff6ңfdg/J5+ {GzqySyueuXkkqpo]5!,ꢚzϫƤIY.5큥[`gCK
+hV$;[ll>IqFA^jT?c^EsGɜ3s*\[Em8>!ȱo,
+jt{+!qu*tHB{iؾs(IAxujeS~~kmIV*lrbvMB[˫P/]-ENݮ¿uTx׀QA$H%JnuP5bg 4$D3\hw\\g7ku9f;9ښ9Fn"IEEV*fF%֍H*($r3lz_dzm
+wI!S'qѻk'? &_ҒщJ\b/Ev&ᇃEfe5e~"%"㩥eؼkFF- fk-hvaJԢ (KBF5g%DTʋYaS쀦6{ʨ?9fػfc
+RQ?09c9}gQŸ>#HE!3%/h 4<ŇMctt8xd@~a۟QJg
+[ILhxUF.: E@_sZwfim=xCY33PE> ؘcG& G&6,='^3\HE'Uu Įwg>-%wo jmz 3P|mLwH'
+܎U?fxu[fI@τ}v}[p"ѹg|U!̈ML<`op~vd`Y~=\ts 5y_ ;;F^鯊z^[xM 7DșJGmoٙm-, g0$9UA3B8P%85㿛rJ nEN_
+Oqu%ʉ1l G~RW'AC 'KW
+1kMY.8[
+Nl|ڑK6C(<_K8%:bbT5`\-`u`h}g%6UYӋM%6ik=MP uQCs}bemOUnp PM_O5g9$|d LMY@XcGЩw٭ص~}$dbx$bd+}u9M<̃6҇(oYxдM
+HU7~zWmpv*QJk Q!C"CLjŖX$F!FSww7dߦ'jƸ
+_oppG-ӓjN93wp;;S;ۚp_Bɾ >wEq > #d
+O67n/+n1&2 e9>2[]iɊ@|ba ]#aaIhMF)K0i&~TgTFU2f펶=˨U2V}olJk/np,RTr&>ߔ#!2vtAQiQ.
+& F8yn|"+fRF}ne}[ o0|ja뚺$fK&)qesQ_ihvǦxM_Eze=2wUGgJ`YWd؂p{4&gIwcCvdkUPpKK<
+giy~N>47R{A}凋In \2u&%LD0 -̶33HnM!GqobQy>JlN:ͨH92Z>fckD _]fWƄLR2oG4`/~exۚxmmkb_}gJI[VJ]wk
+`-)(0jY9~ΣE2Pp_՘"hnuY#3u߈j^a\l!><J9sjO]=nwINMۨ]6)SyMiIlx!~ tG׎Еrv@+@Yj(<]P~9)mJRq =Ohzbf"N,
+yhgYv3=sNO4vpԔ꠪⫉ٟÖur{1M?PWuԼk
+MmiSjACPn2M+s-u8Gh n0,pe&lQה"4_n ~|_mrX21w#4Fo0Ӎ /צ@6I[s6F.
+u&&l]+VϜ<ѱk2SE7W3j_=#F'iu;j]w^|+i'4$z ׋ j^n]xGq=u_q}Idz2i&MM8fL28`l.dH Іt%]]-WX,vb$/jmh@_y={6fo\?4 ORػE~NzUx{hze|B 5FgÛ*>@!-Ysf&\ugg>{A9gF>ysAor1rzvh7nn>3{yI@5ʹ5+˒ԣû۳q2s.ƒqIbOz?DCs#VzoU0 G[♢ * ތk*)Onj_E-Q#M'asڙ)A\ռ 4$|2P9!!2&Q\`eD(.y;c`wu`_"$Ƶ=rG [÷/pe'C7RܭDO<#c.ϲֱ{zH;4 ^OxkyXa@zd);iu?{"(`%6)?ԧe;#֒ZSv&Nw+e˜KEE04$ֽ<աXtPG
+&l9+37Ruл?UJK5tFwY78Ow}Bq{yݤq4iYB 6xrgY@; XE;+}pC71%O,# ~@31 fFW`s6V_8~Iڄ[.; 3Np,k)6._ .0:[Kim"q!>HY'Z+jO行ovqRe\b]/zkUTO; ) &eҎʒ&=LkL􆶡W5;5?MY
+fhehŧ'Cn۱?5OLᑀj~FX9%`¿{9+<OE֫
+n+[` rVƥ}
+I#w&6[_ {YT{ vY댎?TLѪ]J/Z8Q@MD"Bre%(dlU7V)g>!Pf.Ma[MΣ5BpSHi+#<|`m%L|\CWGV:~tq04PˁcFvx9ï1yTݔUdI 57=\!~5Оb诺X3*Xf(%'8~rX (鵀b@wși/ޛY:Q.7':\K{}1Jnͼ.:yCv*&n{g[*.<i`ΔIDNԢc"jv5is5l\Wb"&kb 4
+ꔱzWa_{ä,rg|>8<StQ̋.%k*iQr
+/ fP *x1So3Lj*Ԗ6@
+bKJ7kU*ez.拄hNO4ukFdzcܩ=ul͚ċ xQaYӓV糢<rjbV9-9} m<Eѻ^EѠEE
+swyu +鯈ݔH0 % R '՟@r5p}#\ }m~ypM*t1&nf=*հz"<LBaK`F ֍+Q35~E*QViF!fy5q&ԼɌ^RfpD;L #bB\dMQ-s"._y^p-Refmz$Wͯ弊O|sjVja4 (%*<9*i=l:ˮsl}2 ]}E.wu=׏p XnuΚx ]41deK7~Eߍi kE;c*G *_e<3̲vۍɤuT'ٓMuR!Qi۸t7.Y 6o_ 2V+"o>[un$##&ݭbJAjr姬w}05As~[tB"b3\c9DfJn`8E0F18q=VfVߋ  nLmfQ^f!e3! mXDl:>+c"ȏjg$Qx+1g"z̺[t(T9
+ Jro;#CI`/n+# ^<F'~0?Hqq5Vr>ykü6a(c16Q lW
+ٟYYkQ ڋ,+@Ha@j !~-Hj])[̖>k:P}qjS<pF5|cJ훺 y?E!<eh$_ )Ly)T}벋9xݍA6!cRK Yutިy$*&4#0=.3"Ev_ʟWHS'K9J}իOJ^7!܍
+L' e`ݠy^x(S+y?^ .9e/h<YiT<\&_m }*bvï-Q\*_#dg \+͘rgÞG9 %\
+5Fdf3ؿg}/<dr_\\RuvcC05Bjy2v,B%\yՏsWi[n¦I;`׺GMMAM <U"#kVɎe@=a$5O?"7O?,֌@W`r\&iP.|L?Զ{>.c|rճ<P0DU+ː`3 0@eI:R~j]U */^5ѓcu? O[Ώ6-RiUl}KXz^hs4
+* Žs0+yz)>vɆ]7wk\ʹBN7*=m˛S1KU$u<R3isjtn(UJy
+,>^S]yMVשV葍&۸BWHD %lo!?%t.jð3aI% iQx[3gIJ0S͜-\nxW'>nǶ:ڮ[1*C&tgC1)n~1NhьRQ:k/FVnS8\y?GKNO!>{j$[@NCpV(k,vc$rqgy
+:Z[ [Jӹ@L4G 1>]\ҡ[vFʛYCțrDk=pb.ѩ: UypY;%osWyz**sİ+Iq!FOin]MتkUE$PQŃ2>%-,,oN,w}kx5_ķio:QMxm8"
+Gn7ktaeDRZ)f"r+nDAq5p%0bfY5ݸJOڧt?߱4`=(G3CR[я
+AJʦ@x8 r53)USˈ3 K_N ;
+HB+8 ~b=Jă1"x3AWașuоO#XD: G-CoQ&յb6=<Dz> ĥ gQ[%AdWBRgsгFjNו $-fV2#9rf涊(ݤvcD6w UDV7ȯu*^X F_nD倸v;9۴IW˰sH6kx 2Gw gb'nB;]^^T! (eL <~ RQdAbk9yC!IRfϏe_xCNA "~M?H-d\O͟@k!uЬBjCdU8j.aDV@%cz6~SC>Ʋfۮlj/ ,?*<ɦ0Px%
+qPIk{ZUuDpן᩻y#wn u?aU9&صZ*b
+iY dc{Z}R4O ]5-s oᗮJFy!ktS08Q6n_:6|U(`inuEiHwby(c\kč^rkdƸ#GnH9EN]>7RFeGKH.7 ~7AO P|, 4E߷m
+xytaR+2[@k3[Us2|HP =0.%}Oi_ 똀?.yv8B#
+VlU?(T嵢;d~ ~,VI:g*h:kAvAѽ}njrM! Ed~ g]jE8xkZF=JS=vE]a
+&RcGl"0, /
+rNj$w{Hta%dFX)񈁱m֢*y':jDd-H7WnP0nWxR:mQC^Shl=ů&cY3džR=#|2:᳤X-%OyEGA#،6@'oyD@OJMvRO
+oM;R?3]kar`5(,(>^^TArV@)ƧO2JӼ͜>tIdM&1cVQb%nDP}A(I &(Y"*;*ts~.j,.@<5?jqTtPX
+nyНFlbO"&Hr{ŘZчbG+8x]V\lN  4TM|PHcHk_k]XZi޵̪m%mo2gJ@^ 
+4bvn/J=VmI%yq5>d`'l̾Usd9N'\<FĄ9XCIP*.>t1cVPP{D>ڷ3B6 (S紫tNOڥ] GOX٦N;H0wXo;3Kq;®ٕn<X[6SrVmΪp[譩q! kF|+}O;f;<1%Ш[^, Qslԭ™O*|я7*OI Vʈ}vb!F6-Fd򻏁.9-9ԑH]%v11%\|ZC3 4h*zX&5eU<e9
+l[tj@}-~]Iȳ~|E#5JN̘ZefN#[>O q?dw$"Pܛ]#;c8?i#T^\9D$ ;Epg=ɲ8p!C?H*􇌞R誁Y`tk MY#=&5&&*Q͜o
+F6k䶽uMbǙ["tm"}_ȿWLۮdy'Yt)~`h
+:ԧ?ĕGѕȣX7;'.Jo-oMqrip~ցhW@O覂2t.]KLU_vz3dʀXHY 4d%@g DƐS`V9w"o' cXPʄS+9eD?Ihw*& \<h)o;3f[hͧ]l\7^wf[l0 РݔT;N<>1Szsv@ю{9@G]zCgdK]G͡Nl&G# 3)WcZNhэ1.cxG։*h).<a:[כխ[NLMMMwsCYEVDp,A@QqaStDdSqq=#9yzڄife:X ,0p+BᙙMڟfz&%å2-:e!;oŷZÏM\B@uMYo~4UoIkw$8$frp?Txg2PT,pJOJ3!B0QRv|s7r⁺z{twbb{5{Яi%T4(2!?;!BC]>}s>r'|\DtcmvIc
+k lX`RAZ{J6Bx#GC`M
+PCU
+9|ᚬI Y]b20bx{R|^4=Jj(.=NWO#m#f{t@2+%fy[ .E .F$x1=+C'Fa󡡙rH/ Y.5l_f 6bGM<Ycq-o[z>ٮ N҃km>œZ;ֿjotkv|_;hhu[M[*3,jC-$ WcF,ulIIJ~ٞ5O4c, TPRpѺĝ!jP҂fB}GI+<RKXȉڮo bO|{:2S0:ߚq54PsZ16Y+u<A^,7 M̊C19tb,>B}.d}?v 9mWNr!N)ڋ|S7XSq$RvscY`뚦eM*aw]9sӧ:At-
+xuy4܈_DDXWs¼bJ!s40թpoW(UU0c;foѽQp6Ab֏utӒ*7[Cz\ʷDj>{EEޘB
+95f&*h`tU(WYz+gf+dKs҇A-7*N3^p{8cg)veUG~aT="be;&>H7я+l#UO]9L%Wg Br@ͫ*vWM(q J4:.E͵
+*4<6~{6!M/~Lm.  g^g?SU 6 !IV|{r> ^He :iBT+]3M7 U=͈w ^5 0ق)8^KFLiɸ6]Zs9$^'}]-uQɛS}w[nE$婖Vt4Gp#W{Gqqܛʹa6fɡ'ͩRRJ
+9ĜOSFDaE!J,9'l]ǮK~OgO^S3^X`N\ 8m܎U t}B16Dю8OXϛ2֎t
+k!(` `K]nҮ 㪮 uߚks*Gf+mRSB>RRqrÔ4^mȣ/ral=1>؆vĸZdPSG+e eÏrbQN5k.'اr澏^^χ,}2<M@֢.w%!0h@?5wQ< 纺.r.>uT_(Z%|w(bLmUgYvRL)RϳƺT!vSh*g3S4UY$]jhߵl{я5!n^HXwVmrPQEʆ~hu5USq^n&F4{RvV);t&6B
+|
+V|1x(؝,~9@xЙ+'8 cdXqleC%`R]]}ZwZ&cOgTkZ:wȱ@ZS<V.-9q&qu,762W}XK
+@Ov`7r"4D]lhIE8g,kI^dKh+"j3n/@Ё(xam@X^׀-%?n"rnJe$?BZH.H~5̉!;`׆8ț
+n͹Q\ɊHq:g^
+< >Ws3 p'*f? *a4>
+Q+
+~)Ÿ>Ŵc b^D7V6JŦT0/$;$ƒ @8K6VcȡZ([T c[q45q/L]aGSٻ%G-e@)PuOsC<9+1ehgzۤ
+"5g35};!l=~.}7pWć_(ya7_* ^,#HEU۶7U[`(ϼ\Ot=%8_,$ԴcYY.5a#7c2#hߐ&xiyW£)n"Б3mimu_Ղ4Q[YU1ҟ*DNW7|h.r;wIDrߖ'Kpֱ<
+|bAToW{ɺۣX 1:Yq#ot|Œ`W{-Ӥx8!t2=M '}=*JCZN9 f/ >?@>^
+ثz`̸IY5EA˝He{stZz%Ã6?ۏmJ/2' ƃFv8.B P;qbLuB#կk
+9U/P3$d82)~L9[Vq\KmUօlUČts$VʙYVIui4M}<)6Xbҧ{6϶˰o5m`PpJ֗=&6zLOG<5|.
+)t^5uX&)q.9](iyb,iUזإ5"6Y
+̓(ݙW{ZD@
+T7 "
+*j6Cod֞lS+§[ (yJ*luMlUW|x=jz_2JAC`4F5
+`* 4旚C&9}l)ƛ bR(&y[+j!jo''zfͽ%I+\T
+bk= 퇽=nx;^U!HҦC*1'gUeԢ+'gԂcS:X>cl
+V0aT቞X:NGać*1HRw4b <+D:Zŀ/fR:N4.oIw?H}O=R N,mciGZ~{]kγ#ƒ-e~RK&,¦^rm#Md \tpg24,c6RJ<=K H'Э.U}$9
+089ϷĪ#i;]zr_[Zy<ykԼoc& gnj\rhR!s‹ͅ!%4duV+BB "95lS(%cY[Pͪ>R}0"lGCÍQ#~tav95=1zU9B+)@/sRV?I{:lܟᖜ
+hMg5tOR;%[#Dr_"VLbkmʲ}d\ʱYAec-*塼J.5ϭ<PwSZ!ڻ5:J%;&!5! Kf^
+zua~#l oOhۉ1[?k末9sjiN5VJႚ
+(첋
+.ظde.)@ ɪ"Y:Y|~<MvZ*9"8k|zzs|1ɶQH]yXߝ$(dp;
+o;rܽڳ{B7<?%S`jbsk&
+ea,w`⟎ΞU6*aVT]Y<!} ?m. zb[(Ƥcu_CrIIDe7*mȸΉB4;I~[~><W'ifYx tiQZ
+>|!˶= Tgu jKT 1;(C+~9.}{~إ
+E )E)Bq
+}/N@ooWj%fTVFG0j|џ6:˹
+6FvU'atgM99'*b&Lk
+กp΂6.Iߏ_zOCDERa\ǨtO6SG[B۷[Rnӯј]k)vu9찞
+ĝ U6N?Xy F
+tn=2.d".,tr@3<|*9Iy>ԩ6UB0[~^BVTpt%9_AXGClF4V5pN9 aH9k\pW~a{i!ox{?mrZf&YԤ610G*]jus(!Y
+fBD-Ф]!'-J@  ubj%34wwG]<Pb2lǩo͒0[;CS=4*(y;JJ :C7_7J:\瓃˝wB;(.ӧ&,{UDmUE¦š,섬o[U0,d% %-dϛ`@zz~zUw;ǚ3br̽? 8yt"n[A^"ܳ,[p}zXTV?-pIҽIJ_o ĴN@Eg|2bfT^0qzzy@A~P<[7i9|Vnň[zy^uGD͝|{%ח+3!m7٧lQ6؝i g;dIFN`,CD"(nA%Ŀٻb}^x/o3^l}m/c J&*e'MZMQyv]HA ;J[4k3\`'u\lln6\wȨb+#;De4!yv#ݜC:!+ X1jڼ<ܒ$kb˽.Pj7
+ &ǫy fWӅ٘!]ow wS6Θ80&j[T]Ȋm nLSզ%V8Dp]S2
+LI}?N`G0zb5 m<#!kb{Y~:2e%
+&"bUػ~u=5+`y%YcAS'Z-a
+-s#rej]@ hYUqt]
+.6'|rVڃ3^c΍]؟Zsv>.c H5g?nEuPcڤ`y)RjS& q glZ2B;xm)|9Ѷ3_]n55/kwy5c#?"ǻ.nW-q"$ڜ1
+sEy׈8mQ vg$IQPOC_NÊgQ5儩 6nS&@
+. V<juym9Е4U3yD1;P ў eqRh~Aga8x+sR~"؜&noډf<I99Nwcr. ; -BץU
+ $efw3N/e2sqoquv3|5jf4\"|-'G{gjZ]*<|\ٝ%5iSeT]Vg ᩮo&fSiNG>9tSɦZ[Jh
+rj8x5cM\k"2MJ937:ǮMRonM/+ܖU
+u){+<Lt}?iRg!y}\5Ez p=r>IЁZ% 0a31s`Ϗs)H!U6&Tpc]+wQ
+ ^zG
+$u*Ŭw=·ܹ{(bU@k/7#J~D=?Z -k>!A 9}X)'݋%;EGuE qxìSt4(Z
+.ZKpwp|$늛8 ;:qW 3Ҧ;֥pn]4nV{PMjdyfe("juUEf遖]^S>Ċ] X dĒR{~d N)+:FmpVxmQ=b w 51v!!* +Tәwr&3=19'tfz`pLrJ/8YQ-UɿnLui:D`8_Ap"|:)!4ϯ}Ka^HhMK@A-{j|2; 6nkm!7Ua׎
+T^5'o*'Et|\,׆mcVPk«
+5V Τ嬐
+j;K)h?f`SQw,Qk՘:b$ٗu ɠGZ. #C49+ ;G61#esԴYL˹F >Xlf=g: fgR/enoQh
+X ?6mwDҰ։Sp:VWm 0jcjV/DJ[H1]GQDv:tC˃,ARrT˨ )  k@(5j_\xIe;Elp^7fdT^jJRK/3#zQNFXuExDuW|S6gzw%= vO5GWZ&FR!np3Q!c |2qP/h1Br bF#D{xƕƃR1BJ~c gFƴۜҪf%3Y*Ϙ<wi-*bVFJERO J+iD2tq5:7Gi0tku!8)ǰ,H'S!QHMt=|n6y(0'hj䤨ZP01 ^%{KJx3wPWQRfzcDܦiHezYa]>ʥiX8DlN9M;L'
+'>W*9HQDX,k@ )nr^1o_)e"&-n.b2R;YrRNfwx,6_~J>2Vyy5a7822+no<C\"FH5Mz:ph[ (*;Z\b4xɚ94dy `Zy"!B`r;܍0^ᚘ?>]sN6ʪKhM9+WIȪ
+:f b`"9td6oM9
+_G,."&3q@QyʊkE#yX1qHfqȲaOmgY
+ry#dv *]xT
+}B΁"elG۳:ZIP9Z l<
+#TzM=ZJn Iw7.s')sԕݥq  eJS?g
+9>
+ =u3%]ɭS~Lq {Jai6{>r-zDGbVfA@?>͹eO{dܔMڗ0;zNsD˨IXh uP*-L\\N5P" UT?v293%_['co =e`8{YX{&^=#aDO!])I+`35ou9VuN[ fP3ǧ} |}%q;G5
+di[ ⾑ 8Wص`ğ +":J[/d\ S\&\Mgssz<gΙ۱ъQPAvIB&$@vCGQq; BXB쁱їo<ºBBC9jgULg-!!|0 q'rq^ +1[o.ϑV3j7\-fdbJn]2̗41["k-7)O%ԣUHWw?`/l2j&&%-&Bi \w p2#y~*NES Ӥ}q@I><W⮆WWHɋkQ3LMۥFJ>TCP2zUG1=) n/m't􆘖DGތyǸ_^u,#}!k?/K 7ۚ黔]1nm_׃aS#08|#ئb&)mvF|5;[B*µeA?$>#ыH1FفC2r>}g{gGnn/먝[v!jrm=GB\H5|=DMjY979(FNqgdR)pz0i#&LHk ^RZ;?V @. TgjͺĬǯsn TV- +ͺXo
+>fg'h95 RzN;fu(~WwI-FX%"kwո*_Ɩ/g-%'/$ccͰ2!čP9.̯˅Y;B9s;clK̷ʝHg| :ڹrXhdžVAԢ@P|W u
+="]0cZ~?`RNuAܙ `B,$'Eum }0)b$-HlٝKDo3!Y"fL<2Ȫ$l&ja#&~pf?ȉO;y[㵧
+QxlFZ?<X}R\Lg֥*;)z!zg{)qr_Iw*d<u 8mg9 jo͙sbz^'ꐂ]w.Dt춸әqHyēr@2Y`7oP uiwʴSoP_?6v 1ϼsoRf6l'<̚ES/ۧ4[ltj;i;$PW
+v^0Ґ=t!o"?P_)ﴙ?S%}8RtJaBA'۩;|&څ@; 2+y:+|uC]n~}R~I=0?tּV`}AP]^bh*t8צ[޲3m4+UŞ*G
+rWE"WgT _SnUrA7}Ӡ7o5)+^|h2'#v|yP/_` A>cƮ39 .?7SoJ1"^
+$H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6l @"D` $H6lGXۨڤy\r$*)]U9`%$בFdhub 4N ¢W#1eE=X M)&ä+_ǝXZSȕ2F~1FS
+BXy8HSh{R|ҀkJVQ+U ,VJՠNTsogKh1ރϗ{ -8K΃?%(XIz9
+@ #AzmV˂$j#(IpIGH<9`
+HWnܺ~#@s2 Znf12N -Gq@q>}?R=N[x,,$ٟΧ'T gϒ,; hxV׫e߹o_TO33[ /e6!#ꙹ~7<̻x>E%޽O؋͜0=B/PNpEsS,1ۮy\ߧI(FxmOMfL %8^<m/Weӟwe\&mv0^4
+"Pu-uq5 ,.r]US ?P-0y 5Fec/youȚ|[^U8X[u}u"eXHEyV O8qkYl5OySNmSN~: .wMϢ yY#`y]{A֫އ
+v6I-lΚ͒W!WSNkKW$\4 jm=!n]8k1zo]Z5P_VM3QX+>eZxk_~7qKj<|_p6\ /[Vqs8nshǵ3SF榬 hn܀S w`Ȉm>GF#&*/h'e3_nmU cKb mZ~ /ڶ>3y<"b/]JvfNq7p&wgZ τ5A9߯?uhe_S3=I[`ZM~9"trapX~֠ |ԑNNfԯ~yVuS\_B Ch<c VEcӘDyEiD6{MA*8:7MfRkbcQFaa\g:Չ:Z+@fjrT%ʪXE( d#Ĺb*"sT&XFRK%DLRID.2DXH & <Oy-yK*e,e ,f3L3,&gX4)M1PA@d$% > !l_kMu`@˵Dg3IDIt',mfSXkcYcUVZaevgq8%Ib`;=}p`b{D>dtqP .oC2ED2$JmI3r& ⺠ e&"^gV*&]im#jtFҀ >^fS_ָUGoo[9ޚ+|ïL\'H!<18_ᯢ.9;~}ḊV`>%tEsU9Pu [9H#uѫ&b Yf󄠺1T9jP _:&Y$)Ky*RT&8iih2d"t6>HOq
+Fb#t
+ D_ENѷ󈠇3ts#tyn1`@@4 # 98}bgbk'z3s~iCg y
+
+@bRr,fD+12x.s"$QƒJM1e(P̄OL>,7R|
+JeN}hkjʾ/a._eq܈~
+T/{葉 5@xiw+E.SC3]APP^BhTP:k ʖx~3,Apa=ť!5@+ OJFfI.à\^yS#L߳P.L S
+Sɽ3ۜC/9L02$z9̦}5ټh%g&V0p?r]+y>QjUr6üt&w:ѸDޤwII'uI'zޤSuIz$FӅ,GU&7xAu2?Ao)5E:S{
+D^WE2^Û x bo`vŮ؝O&عLɌvx2*-OGWԯFԳE]{w2}QsG@2hdˆ5E ݔU)1ɭ##3O V `ڄƁy `b#3ف:aq`# fw`
+}
+EʣIRH&J(RZ ZB. DŽe3epM&| u»,BЀBFc$%z4D&Z+ qdeonʲk'M4|zh :5?`Il1T_NpmJN'ϻT|Lk:&Qĸ!WhhN`#5O|4qoc Lf$dyda]5 nl.΍_1?ԃt'v;8yg4?gpYx,]{J<~Wµ cp_~ !*QS)բbdFK=d@G%iF E%P^"%FDFjRq:@LT Kt $ERNF.F<Ow;#3< 2ݑ"iC)ڕ<=gZ/}m}Y]^^^i8G(W_v#ٟ9bƇSʇ,a5_ sxs.4{p#
+ Sj|TGu9 '.`%}oKۏ?]?~o_OW1"-+4dVlц#Bh-7*tZ.a+:(tSN2Q:/+'#n\x5c,z-Ƣd(Vma&W)%RT3IJXd$5inj-ӓ'IPl0+) TJb  +"guZ=̥H_ LQxA(SĂzA*h6 nG&yfӺq1!0o@P˻ `}R);eZ$) "J74<)`u^'N>ƭ7lop;8s;7ƆఎlLѮTZ[bY dKJۦ5wm29ĭ9kE69K`ѹh]OQO-§ҧ93*⢃dMyHCyTiEtmPwfC;4=̯?$̕s̺k)yq^0)J>,|O,FsC}qq^uMIOu?|cMttyf)43f<hc:SMkɦ6fotf68e9G@N;j-ҞԗԄYOoPXRa{@{? D%6b$%&RU}HA }Y{iIQ/5|6|a,{l?OJ==X,8L7KR_tLw0=]FU&k+ÁE#:ߪl*DUJTkUQIh:I )\1S4%_7L4`beGgY;pPܤe{T{|LngJ/T 5ΊMn;Hkuu rՅXzz we^TՇuCA_ /ԟW⟌)~&{| g@^ X-'_ M 9ko$
+`qyZ0fpO!=R8OTZf̛-SVK!ӌ͉Յ5y水&a]y6<v8ar|l=}~ߵG~oy:rgo8\)0LVԮʦMêT20U
+ 5`d"D;Ȧ
+Li2ͦE5
+s:Ԙ)`|6^=A4>/]pJ!q
+ n+].̅elĪM Kok]S(1n r[œ:x!9ptj(PnB]]kIrJx4d_kBmC`{<[r5gڭݹk=8;ޝ~{ݹ2~^= m#zSy(5ͻ?ӣ?q;{= ?*Ζꭉ]>>_2`Á&=q|ƞ1ɛzH7-rCx0ş_/_~k՟_/_~_Gw[<_ <4^LeX#=?9U(r?ΔN՞V'{o{ G{ƫoB8G{qvO; \5vW-Eޮz'UbXݱ8d2,ʫR(`29?LE:՘"А①\ "#Eհ*aXƀ bdGH@HOʕ05wJ l08؄Bi$8j+L0pᙘ>0!1cXC'.&jKHaw ̯ 0SlY^14Gg]0S 5<'c2Mi@P83iD~rw88jgCۺnlޓlzԮdx3K9S;/h^^s~jlxNSFR4qX3E/;@!\mlRzRT7 ,`HE/f%xi
+HInDu,j-*'$bHu*3W/Y@A\%JX(A<AϫZS 7%U%ɭo*h^5wڻOsܝÞj79_Hq]]œgZ $7'*vȺXݰ+ĂY-k1WUxř*s$ّ͎Eɼ1/'R/^vVt48# t$$uHWR_-͝ZLr!ЧԩDZ YS|KK+ѿHhebf3 mұ2 N,."3d0xx"-,p2F)sBI@BP"$*!׊am!܎whڃPR 'jmu ۗ/\ym Պ̣QBU @R,DP]RejNjod-Rxg5,bnY }hFR8R %Jk244f[‚331S;VVWPY^z[(Ϊ'I.I91VeCg8]4!-8NO[iAp|&oUvtcёcN&?o27(ִz;4W"~8G uVq;%bۃ3Gp<. ֠#O%}zh|^0H=LAH,@$T[Ʈ= j 荄*ع>paQ-_JA8!W3tUBHBdcUݼcdYj޷Ei;y<3kk}M_/TdjSsLB 9R˲L#IX #-`j^1"($tU[cD옭"#ĩ1jbx8pzL5
+>[
+7$
+)SS+5J{N`OIoY)k=@hŪ2`9U,&aS9m+l_:sO+1J)Zo۶YD o)"mڶVmz
+K,K.}[1gj%τF:fo e3wl-W>iH'yC6\,z+
+0fHiٙrkʽ)7ܝTL].REܪfE5j- WYԢ~haFvWnO4=mb
+8xN%*tU\3rDgww_ gP5xQ!E8G6Z.%S#* F;@
+y!iLQ]"NI*I'5ImR;' I:Q;n\ۙ2d2' <cwm3535EmL̜YNܤf#ho5IYTEnrs 2d爯pt1PNJJ]K]$T:"'׹1O,ruƷp]kfo|F"uŗqMmR]$/Eowg//w՗9*ah?QuPsF 7Gowk.U:5 tiw]]ts5J49??SamXK=}-w>V]nWS<4V凜? U;f|zo=><}/tKOOo>}MGMn4_xE-%7YH%IMa=dxE u68a\R^bŸKc,QMs$,tvG^}Z5ܦ0l~Zl!F |D5Z;{(Ge֢nVj uI<4bZr<BTL<?YN=͎Jv'g"fDP&]LX锥9I[ZN(=tYJ#Clgi@Q@ZE1V45.J@I v n(fԊnXGn _jiA$oJHV͎Fv#G ڕ(JO_{ˌVY\@%?J0XY93]<I{`cmX ;y]>R.ڂ5eV,,wSl`J1bv6.BvYvAЇu~FhEC$ܭ&efv
+*cy(0Tij q&2U,*,d䒃ɞ;n>/CGssvf6af1BAVvIejR@?VH /Ln_ډ;)e+0</U׺Vtȫx 3-BobO/'r/'9XgZ-q,rfO㖭ML* %Ӊf.KD"M&hF
+G Zd6  %(T4IXq2 )c+Uɘ_*@Q&o6%Iݤ~@MQc!?k vYlpʅԎÜ֍nѹ'jD:jxC 0jv' j^~ >,w9#,찤r8,_ϋ6+s /s(/ˡoxmvlԔ9W/tuԻ;(*[|֫mg۶Է4股5`]M$l|v8w
+[ gTZ(_=[YN_yXc:PzhPtYɮJQz~_y)Et'GOBC?V&<)%Ԩfq ^-y>;ykF#ㄸHڨ=Tt9~t1GT˃_Wno_ֹ84<OD[ G,JuJXp`0 $Bvx
+\?6:,y8mװ
+6?{DAlȊ١$5rBΌ",AH)U96”{$[HIpdzk :a<< :$ķFKĹPxo
+v^wU
+ӃB~OEa?=[oWUſ~t_f$^$1A
+lԨߚ}E}Bg\֬Y?HI*S gb>ܾ*Կ:1/_k7<~rWϜON//߆>N$g/޾>{)|IY2_P[ ],FHoId:&C6s +hu q2YHh\cۗ]ʘAvw\%DN >펭 K:p-cOL0OD8ZO<͔ JO߇NBՑ|F&RZ%2BƵ@蓕ޔ +-ybHuxM''ʹor+#X$֦iZ#F</9m-Bnm5&m؆v&;_imI16
+t)]D<DWLԓiC25km,PvOWO I\<Bh]rj 88oFnqd%$EZ{^&xך,&cH Ks`i
+G?AMXЦzI'UO
+^&t$CHZeZYv hQA XQ;hSN.X
+֠/B!<H4+.LjE
+xإtrf2IcfyZ%5j@ ѽ$$վ|I+ - ғXTNg^3XS2tPX!;B
+r$.Td~YJ(CS>pHNAd lxL*'FcG$0S
+ l Xx8 L(3/JQ89:%15* !P4zDFM)[,@)z38Lb'H
+nDi~OQ#D៑4 '?";IgB0sGȎ"{~{kd9(A8yۯ^^_]ǥ˫w.?>{tȷ!_KZ?@q磅ËKO~D 
+tNChCB&BV%748uQE1PY0 !A-g+L4
+T`
+ PvifH
+l.݃sw\b]>`LFOvj2)K84t>@44bY %
+Yn >?/GFYj ~쒰?7QZ.BZh3u2b144ÑJt :{543!(5Kapq>RtwiQs΅d@ h`kcv Ⴅ0_ӎ4
+l3QN
+\c do{˪dl7&81`-ڣLT9h/Hl#ݧ{XI*G kɸ+ds Y"pWY~ا<LtF빟~BN*&ǣ7Mt"igp`E:$ fgJCc
+EZ-v3+
+B&Q^4ik_z'z=Hl,ɮ'lCťH!WB(pwjhxtVnV.dݤ~&f&
+~ݵ"i~T\L,M/Хjd0fPPs/5>ruO4ŦR2U5v"'U(lAY[<à˚0v:
+X%Tpr$MrrZ}FLk Yg5Q CIV}B-$F節 Brj{qP6*b"ƈZv3$$š^v}Iئ(
+ E!SWfJdY_Mu&X_Z\ `"#ryKҔLΗ7v-)DAWڂZz Lõ"R@W3_=@w$!± ~\A7'qMqP"7ܥw(Lؒc:^IF !w|}rU?v%翥ARO pNƺaߎ3'Pbb8Q?Pv6II
+ k9Zcwo~$/Z@Ɨzt'ՕKo:c prR6rҶu
+cDi:moadkMq<`קyY\qruї|珧Qxin;j>[E598<H1z^Bj6eǣ&I0V/V^LSGl(%T|"#bw˸ m~Њzn3v.b?s8́&Ձo}1]G`|魹3]$(,{K7q>~<9e%lWuf(IN^$͢`Ws^tjPN)%EB>y+ "~`
+ja W|hQ-Q 9e o-A:t̂5fâS˃Up&!{{̺0c.fg=q/jMMc6),4laPN({sӌ]L <= asW[.H!LB׹"9*H;g.FKPe0-*s4 KǗt./
+[ʂH
+< 7
+\|~x|H5mE*ODǠ3AS<$S -/+ 0/V >qm?b!l3RE %n?:a,˪EoGsb@qN}#D5͈?nt!- onleHIܿmאj)kmb%cPF;N~u._6]it}
+!Nn:]=㗐CL*͈I[fCgq@L懆dəe߷4%f`$,T듄~䍩W儸5O:(HP0YwSw b9c}]ӁcCvmuw+»kQ"P9|rU<GBneS9*Q8gHB %Uݎ'0k1H|
+VjϜ]_
+ b26*ơH]A<>DYQ@ F (BA(N& >|$x7ba؏pJ kw /D6K\Im9=1zrN=24H@2 -2J{Щ>@5ƱUFȇn2f&fE$L3<Hі:.K%:v.%#G3SQ+A+mE(X䑱B%4Ǥ(OI"! Ihz9~)[R lA<x C"{KYhp4īyq܌F&5X~H"Þ%ܣ򫵦E6qoO)i fn҄@B ƈpqđj G;<S$(: }m0r%5K qRbQLiqY~yBBJ-D,dQ6LH NvrF5ݍЩ#[Sz E>cpP^Z1g#oz>Hd7|g<.vE We E+KSS4qgoG0đ\v!e<]`ڽ>.d?EECowZ2U'xV,Ce TcI S*ՕȧRhE,&׼6y*>[_q][K{h[=e] |cS↳xwP_kHaC5 /cX? "cxLA*{=ι1D Azl
+ن0-s {3c
+1@/<' m\|0}`[rpl*L&yC'վB>r{F@xr7qosx',˰|~4mV&ou.`}չGEH<
+_֎{sWq_:3;YF9|Q.f}&2Lٻ,)ai3 ]jm"s^
+b`(F<"XEsXNw &:Ů3ɍ6BLYGҙPp?40ݽV NWM1K&6vе6} nR#
+U|;M|
+!P}@uXֹD]Nbo.#1vٕNޅk#6gbSHxk/4m$ *{hΘB*p
+ q(u!*8slEPtsqcjTc
+YQ:JGj!5tdذ/lGK5hOi*@JR2=)/:ꌮN/]D˸V{A;Gl=!0I}8|I i!Qa>qII\?G.n؆bCD4''AmaO#~jhKQ@Ah#؇yiG$5+0iҲ]@
+͇&qU "fّ9ICMlny}}.mz8k7)R wLP2OL\Td"ēS!fS/XN(hq%=ygna@8K<>[ 0ι"iLW
+ endstream endobj 208 0 obj <</Filter[/FlateDecode]/Length 3675>>stream
+Hn۸@x{Q`uOqYl)RKݧ_Yc9Fô(W (Ό͏3*jļzsz&H oZo_ ZS`fR_jufU{eVo[hHsK# 1(߱j
+V@*^a
+2[79aꞳyQɥ>b1Jy8F”F$~%Mޘ
+οpH5x!;.){GgN{Iз`-PbY&,qU(r+:~9Aۊk;co:lIwزIdh^d Ω(
+<>P=HNxHdȴtQkW+XVQ+\A.92I+DJ$('Su|[̦"KarSRT? +sj뛬Hd[j'㝣30#[W#v;= tNխOG&3wtJJ>T
+H*@,j&Yẙ7b[ɔ_I >Kw<ȩ,l Rы7_^̹Y$\rh6;5MC5blF#O\fݓx4Q]J& S@߼?*B5גfqFFeIfՏ1kR},0M E`>0#)WA}s@!ia)<ҙ>53<KfӝщF uӔ\(1=@Uβ4X<9&Y^EDS@Th!/B>uXpB!'$_OIVSڕ:WcK?GB{C8&&$~%T|({TCx,Yb}-:
+[ Q9*6Ê/=_G>rN xѐA4[X=88GR(5D[\~OV%3쁚jtco *;L
+
+9%rRȧKN( $I1jyJR~K?GB{C8&&$~%T|({TCx,Yb}-:
+<&6es✍{BT-nk+M8GN'+hsnB"J29[kiuNϾwZAdhaQ',3hm!rLHj*pɓg|V~ /9܌A2ܪO^32 11iʈ
+V\η' (%~\;8X$bEz`Q'2enLpHvӅ6&_xMݏh||`\xs<yM$JQ jK-w:uRtmʭ.ZKLE!2!=9=AjO?%l "\f/?ݲ%[NVw%=P~
+
+p P=FنriTm_YA,%pp5Nxqg"NZ zd^9RTx} y9̮! YY& )\p \ܯWЩMݚ()}c3D \p:A+Ƞqij`nGli:3/;v%"Xl!qτq|(
+<ѶWH F`d} 4ҡs/dUoͽfʷ5dAcbҔ1,eQФp%E6|=s?5U4pЁsp.|#J.c7Z
+E.N~Kx[ֵ,и|
+b@_D8G_yl dMŬM~Ypg%gw9kv<Sr4d0ҹMHĆ[,.'Ԣihƾ@%t;p:T4 ֺ`0W
+rۆ ^{JE
+8uHYl(QH'Kv-84`rr]`;36 і-``ZnZ&KfGHtglƷ
+s2%&&zwሱ9UKJ^8p_<gc3a>r2 B׭]|_?\i؄w̎?G)ef[:u]zs ЁE"+Ve;8zx Q-Sv-:wy
+HWn:}hZַW]4u6bE>ri>\!H"jgeϘxsH|\F8bGʇOT~1:a ^H"PWFb{:_%wߣ(˿~ X<R`~أ@"ԅh~3; EF_.>˫gƈ~śn{yvD&Q]6ktv">Ph?z=l7.bOi·)}"ZSpvlj:mp*\CcˑHVfӌy$JB|^3$
+$'H:kT;E->,wƴ eiJP<-XBm14,>&xΊvRAb.+a]wrӄiPPVhx}f %!яf}ȧ* 3(ǃfvMN>ιЧd^bM4W)b_6%e0VpǦK#\QtIIZRB Zofqy7ػXAJ=WbѤvdjC-P؃B/j9' (|5*DpǦw> q
+ /=UQa%"3 F,˺E*/s@/j*9B8 'e\l
+µo[$4 q
+֭A4c>UӝHoO2iwcp2pFynآL״w,y >y(.k1|v[\\,g<t{|JM#X#UԷE8K.8V`+X#i Wrh+H*
+ťOO`OO
+.)I9sus Z?c`81N?>1ԿcNY 8e
+`ug1;*R{CwѨvp(+iݛp`ʛ
+3:+dȧHytДppmqA
+qQ ϷjO<0ui=TA!,M-܅\|?—fJ6cp
+9gf{z@ۻL#.
+X
+j4%(XWQCp`ȷ֞kCzoBľjNsWAb;ii{ʕEB`.tHlT
+OǮtloOWuqyŚjYt96U][~t'D&n4.OYbESuaXm %Kbyw~{ D\ iuR r{4ǶL%&J午XLW,]DI,Xd[
+釴GU7lXv\T%'Dζ7Z^ؖWe9}Ӂ
+Wt")i"ԟ~.qb熅V0Yrkwc?,ñaLq t« jYjd(#Xu/'R 9J-НS9svgB톫*,&կp^<쏅ٯh8ƌpK7Ku3]ݏ_¤,<Mpω]<]Aw7n_ژgcΩ%r*
+u(yQ@WdZl
+,q r vs_|i(ÍfT4@^]p_p{-\MNu,Xd`=7ɢ(T`7? _v 6_
+׸i7J4R9^C*p?Y (>7szrQ K$;g&>a ۂy`XXLO3r6aQ =^M;eؒAu=-nS)*'¯I2@rJY?r~ 4eZ'.Xσ䈫"0.d&845 w en72AX3[t)U€R7-YEɰ?h:g"[~aV,-҇$`^ 
+%ʂ_צ p.B/'qyoDں*[S-l9j:UXg;
+[!Xb5(Oz5sЅ&]}68qr4{t>HQ-¾dAe T܊mxQvJ]">m!]7n~rh2(#g7A
+}kMpPD9'P)Ƹ}\buP(lI<v֥iN]ɏ_tՑԷ=\ɨ,D[%TMzIDː*R&4G36%dvP! =nyv<+_54
+|DZiu~ Ф.N  U_45WW<o $֌4_*dVpIV¢E_gD4oRUUTYe+{;M RrVAPC6Y]PjVJkTx{uzvO
+siܘ:ݫVYeYb*׭1o,_?WZwQx) {(NT-pyW6گe(TolTA/a=NQFi= 2a(!U'O]!/"
+:eg0]+-CBfG:%f_E).moW֘j"#E͑֜@*ѰfN jN3P/^mgm9&g€XѼgcZ0L{Ɯ˚. oUD6 ϯA_Ҵo=8ܐ=^ne7Vxz>EJFcLqvfkMͯqxk}Gŭ;ū`
+0)M,+F-FRj>H[u 
+ Y}!xjeo5R9K8c$ؿ ?&{/6g)O-kZ瀤/Wɸi#je FE>b-ij
+yͫ}D'jۢvvlƑ:LMcVRyEr5탑K⊗UWH1p|ԙH^DžcCP5$>NPPSm;)FRR]y^FSf=~d8/ƋEkuXB пK.#|1[.} np$
+N;5Y
+N'Ow_N#7l_L\W˵4}0렏s6]6+T-n\o}96r
+V3d1-_|Ox{~5\VpbBU,Q03g-ΓSUHQPI> Jr6ݐk|ʘQ*} 9TYb_N@[<'ٹ߲#0ЮXi&Sj{dPAL)x=4J
+$Z-#@W<nj cnMzs,!֌DJ(K8ay]Tq;,]?혹VmU|$%[^U)¶ s1ɾB9\DB;2֑?\h 8rHN(@
+Y9U>l;pQr6 bo:¤ kʙr{g"KudKr Fb !CPݹWfbEO\{13T`kڛpߛƓBqp1T)Ey OaO稐Um ķ'd'-,}p+se";hj(j^Bz47GIR+
+0 l1P֭34xzK[h"[^/J h2 E"2HWɍG-HžlްO [\ZDɛ<FCsWaʕϦBxX/9J`Kt#lvh}3vaV oLfFvrNP-
+p0<n)"i\&~s+rؼ9ܤ@5¸=0.Z`ӼIϜ"Ϛq2vQ{tm"#Qeka+SBwtSy,G,@klM@S~PCD8'Hfl)q%z?^wz?5[l)3*
+ Ḭ6N)EYR>(7FnS](3k*[6Mdp P X8) n܂8 J{|6ن>Y1h;(ksHsma
+}4GV>Z'g$`oV=lIM1D,edzp}U1pJ \oJQ R7w,hjސ,C_b'<Qa-n Ɍ,MRPSox1E؀'ÿ0iQ}cS}Nx+}=<_vS,NbMTDfH;Dt2dtm$s>tS2OnUGޓWWm'TVEz \-'͝fQ$
+d14i"V"lW*c,icBAi5Z˱STUބj2 Z*|rGГ;16Zy$%4yL.++KUrnJ:dew4UK%xqG\C00'ׅM %[Dm%G'
+Bt X
+?xiwM(%wKdVv@C[x
+|@~TOPh6sOҊXvk5+0F閤q*+%}к:E<x,nxﯫ@17iu2V+Y(}Q=N,K )Aݷ=f`bq+n|[
+Gm4Tsb }ޗ=8B*8=ԦX{x?Mpvrfd4̾Vg5k{dckY'u/Z4\ΌQՔt-C+dauK|^̩w06pRFn>s~1fI7]_9mi[m&Up#ez(LNۂn!mڴu-[_8
+HWmo
+sX)jL9iHDl3SEt_c2&p>FNcۘ<1&vͧL]w-9W}
+j k#iJV$zYk9[cH
+TkwiU}bαj7Xy,HKIGw]w#)=-zbnd'4LAǠ\J$δ?# Y(](r3EtOW֯( |A)QVYcD> I+CCT/:S,b}zVo'OfSWsR,o_}ZYݧz2{(?.7mR9^*/cyP}~_‡_ Z_?SշYV|P^ѸE=R!=$!{INJWO,웗ڼΪb@O0f8Z.oۇۻr][}%F9Jmj[M(:3t*?>x݆h׋=Y(8Y?z21PX{?ּ )D.%6v'RPk[pApc#1qBD$Q9Of~h>9¦Ą"6'yDs3'4s9Cs)I|6=ɰgcFӾ)y0JiȵGRsu] !3U<uI*"8AIa QVF5HG-,[Ftepz2c_v'(L̋J*!ڐʳIȾV}_T럭DwvQ5_6͘fϐfց'շֳj
+ױO~oeg$$kQ rˮaz8șV"mab$|CA mJ@O6+&r=#.&JPD#RP(Pd9 MqOm
+E[aRT
+V`I`&G-u}C9YX]kq!a$  P#d 0E-X4Jiz!Y-ܢz (W([B-ad#aDY|/!xX9u( .C), cd@k(§1Xa<J׭<`2 lo N]Fy )d3);7>Yn>}|r?_e6
+_FI h`b0#
+L%3E\U
+7 vO@B j{:/_"U!;'CZP+
+R!d!}9?R9\_ݝ9sAa9Bۍ2bzQNF(JBps-V{ 6ri:YcΘDG hdz8M-"C5P=LUqS[2thr};XalÄR m~gUCbkGbyY)j(ȨIoЮ@xT
+ 0^8dfLQc (fvd%0^P8+ؕ~νMX9#K5@m{jW
+
+zQuym`d\
+$ B$}3ͪ=E]$[a 
+POlHcBl&W#2$t* n
+@LV T]oGEt\9UIak.58ph%p lifQɷ<ےZ&IFb% v}ei֘bjZ64FgVa<؋]}Pڂ )nƕp"DzgvL:.B,.4vbҡr`^
+᧛ R4sـp.)ydiCZgJWm`p1L3(3 J/ÍEnbFIDrQkھ QQ%CZ4W Nș[OI㌆I-B]F^e4 Φ1I[Cytc/Hbɜ,k6 B斘Gs .q(%1Q0px5j2z[\U
+1
+2<
+ MEP :DdkL̘s$tOh<1lѱ@T9͐Α9^kVB) GrS*Y‰^lM}F6/-G
+ S4M
+8=I;U1?ca1 6-+*(JM[ bWzIˣ~Q627Pp^^t{~lc$w'}1qk)ߌt&qyM)ӮgTԇÔAP$urSx3!5C.T ߕ2Q胞dȬMFY5Lj? #vaPT
+eƯiS.*@t33eZ,qUwE2" ݟ@Ss L?sxѼk+{<J=(9e5NGv4|. ţHUٕe~33p[c̷R
+4JP&M? Ap1Ayd G+=N d\pa-喃)M۔6=f2&Mk1qڔJ.ETƒ<e
+0 +
+۠MJ
+ўub W7*92+نgfl" y!|@(u **YF`1[h$|JmgC2Sv%{Npmz2>47|Y7}t0Kkpg,Lkr$JHtס<ZwT(\7~x= 8
+] n+)N{֧AW ߎ0LW9d\,OW+h:܂r{1ɀ/LR]
+ifF/n&U.m3XA_pd4Lug1ɢ"4o&!?tsCn0.KZ٣ |IØCpl>{}/'ds_EZÚt^ Z JM!~z~~LiHhuҀP a0:g@zVA,qqA$˜XpYo<+WTlMpu>DPttX]O(4c$鲘sz5'qbio!7JF@ts >T)|^Л`4>0 S.X/tgǴrQH*zLMh򤸤є Sr@8޷U'l~nlҖ=$iy&Hz޷Y}r<'VVzTL*E)z%'JbgMu
+l1\4suP_X:w}4ɣBK@ ṴlVZ'D#<rly#ԫwZٲyYN2Xi\"n9Umq[GPZK'&0Q{064pbXy.vhW]
+ug|!Z5pyh,X.
+0;g'0wpuXE|A BHux@qs-9zwpc,{VhZG|ϝxNuf<Ŕ9^F^:q6#)Ŧ={o6wwf,
+K<bSvb-z'2{BYl# .kb%r؂Iu]r}׳ŖB==(aֹod57ecdnkQuV{R[cWGӻ?M+]3;'a; A}ȫ)Gz]1zR|8ޫ3TJzN
+U!_UU_Pj
+0TQ QPv
+Δ68]Qqg,/!eUKvvJgm ˜ǁd[QQv>ǎyCzBj\\]LP6v*ͧrģVhv扂$3HXxak~dCwU"14;
+)0Jˎ/?c%sIX?}'Mtۇ?}.ۏ^#:=W%F%E  *]Wê;MAA6Yֳ6T Y1.m,y;HUTOs"[ ,wfAYzV綍m*J!֚.. T vK>+%4Q#^K5c y\5uOFvN`AAR jIIlu+RbM,24Xϭup]7ZdnW ՇhB#&9r 2[ j)ε PnMZV, fjFՂ]ӗ
+y\U9\.K)r5e;H ]yr &LpڍJ`@LK`u㶰ϒj*r:e\^G$+F׶ML4,?dau)^>_v-;b{ɰ!W/'ƹ%Df&`sr}Od|fy5ca/N~y%Gi}G+#f HBh@:چ<E IQ3(T'fWXkAIQ6Ѷ6cP4QtA#hӷ
+ |)ZţQ1Ĕ_+% k)>PYİӰk|,~G֟LN{vvpX6/y^U:|$0sps!f"h\}^S~7{1~'J4=>ojVE]qỂRY>wyoBAZa2*lQS &(U;(tMƃeA3-r+}V=)"ǪƢ*qP\Zh7T_`Ns 9FPruY<VvkQW*˗tvXSop2fk 0uVΖ^ZIci 55ـmm
+*n=˝@9czwsPretT__-7 ?3^8MB oiCңTIN]^%ʣi*kLBPSE֪ǯS+Vn,mDX /3g.i0*kr&O<Ρ/\a& h}[g
+ $R*S&4l2;+fG]gDd^qPX/ Z.zWH/)suHvטqF.GaK}[P\^`o=:h0QO*oX2hKf<S13,Ն!x6O|ĨXt(⢥ijTM:As2۶NU:Vm6!*dʫ@oUA}tUK*$&TY/${J@ىC֪X+; Ii P\uyKfOm^6d!~S0 t ?#@9Fj }T\EZ+A0n{t2݌î@H}@QNcAȾtBHEK!E۩VccIX$¢-CRG>IUZެV
+JCA[Ґ9wY<H(غdUuIieHWVS2uՆ*6@)UyyR*1S "oJAэ% TMLOQE=xAoD
+o^7w~|^O(S,gaMTCP20e%=2z'HH%"850ջgX6wǑ~ק6;CQ祑Nh8LT'lv}?T6Ym)U]־!tӖ[c{SO s^8Pټ0R
+ncKZ ?28LM-[1W̢4I_fCB33V ,TUOb)4m5+hz `%y곆7F%fdoqfL
+s_NT2 pzGu{BPAh:G5!P!T{HItA>Yߊ8B W^ Sds
+'[THs]ݤtMYJ,6kft$K)c:Uxͅ"B(LYGI[1
+YԚfyDͮVY!1ւG 3xL ^cXCLX뉹G}[f[ JαP0t Շ+[ކXG $uVs[(,^\E!T܌n(Mh_KqZЄ>tDxbrsnDN@mD=&^XˬoPSjMܮdi>iZO(W"Hguy 5PUF̾7Ƙ|'1H0ÁE%b
+UǑfдB;#7'l/p?U$_Eyno$%׻U̟&rh~+뙫lr.#N jN&+|SqoxeNcw)#¶KZn_h~3qG,9'~+A?t[7gw\XßgE=#.-ʱEVlWD]f>7vǛiF;{ Rs68q`D`6p ߞ3ȨYeA>7vGi/{'l?>J%D;1r!"<ڈ Bi2]IVV9Ax&IrFrg`AXd(9 anKnR}oRcǕ}022u8CDqlL1ѻa;y^Ӗ*e{m@}Rn zg9ijOW&*q&}"^uJ[$3Րƻu[d|OXp5s 褛7}D` ܻ1Ge㈢_pL HAQ?_HI  &e0,}֮>|[@ dy]Uv~o㷾ͯ||2ɡ7Ϟ_\~qz"W0W˓_pq~7o~:<]~8ڊ$QB$4eJRhP
+˳og__^~dǫӓë8}t߿?WWÿWq;9fӷUg7'O}ӿ$|<+X)}aaﶰO抏??1-x
+N׽$mX,1t(
+Ŧ5-j
+Z$^v j"iSI4fR+v7ڪ!0qG)fA/mFbiz>KK[2TK&O;H 2l"thq?Z*n(+!.KI~ZdjZGYUn*-V]jY2X
+_}ȎzЅ3 HB:Ls.oYPw-Mz-|"Է'Ԅ3]jXPQ&1e(IrIZW6⻪6&K
+'RV=2By8MJt!q(GM"+xm3edj$ *t4
+2F)ݜpe8E@]qK+8ʋ38<D:YzVDB]y-`E`O{67U>LOC5:cOgB#yj>HIiG$*хCni^b֓a4ceh#ޟLNL\zl'Aʁ2B%A"[rr:k9dD'2SӨ;]}؟i,L>13$> HwtՌ*6`JJ"28r7w,ԐcX%֍*N5l=F#P#;4W si: [[&?*?
+(x2AĹ
+"}qAL#}7%ה<4xIf;OE7%վ&ķɺ*0!\vWi#n ;i=4 I@#/&g"TkLb^%陒Tk4HF R]굛7}Siwv|C~ I5.U,)αNV2(7,&oeh3On!K1+&hIp\AIllh݇G;툂,v2_Kr/CYSBdzdU,oBˈE9!B$,O:g LgQ8U%*9%@RFK#DxY8뙫GۚS_Jur1m
+ކ_et˷ƬPrOet/vH2YZ9P`\ƒAeE4LK!Kl%d jBXm M 0 m4Ok\YuR[̏EE QshS9 `v o,Ss8ш}rXWE^YG2בʢ?< Zy
+ tly[3
+2Ps1~Mvuj2\OVVuak\fjJa69YJvo0-:z#cl2\ut׌`Dci,@Q]qǩWY7O#{'77o?&I.ln#slCcI%KUN9Q紺qF6)=|{m
++R)\nڽ92d;((ʠWaq@5&58yP
+63+ݸ\#uӼ^"|eK2v<e;L*`Sp(N<E]S=p&ք)٬PLen۩f*S@2 \˫,\םENLL x̝@VD5ȨR <fmknF:1~@SEpz-Rѩ5:#9+!PTI})E<,ժN؋bx`+EU€;TWՍe@U/p,S7
+!%*ĺYYw83W(9Ӣ`iYqj$o~)Pȩ
+;jS
+ DT6n4EPa)VN h(ـ!﷎*P6#+P>T#IӨt1Z X3Ũ; >P
+%&*UZl.ђzK7Wbu\U.OV3PEVv`iUSCH|O Mke,T
+ K*AAIňءm01Ư{晕4@+
+%1Q%PL%߷9ыgŖia`KxʉT5]}
+,q A\d ~dI0 qAi-^Jֱ tmY*h[s.ƩڲWu<"oر\pvp#X\#f9O
+ ri\ѕ|/ꁤWe"- bJW*>ڱJRؗ݀;W;C@/FW9 n*fG$ ȲR.7uaR:r&pUᤪq 6tǠEj:/Ywj;>.\ʩF`
+-w5сѹFJݺR8-6N)Ttsv&ͧ:f XWoܪOwŧ}>tu_Ĉ#FB$%^1݈;86V؁o~Hzm9%%vC]K+w68\DQGs/G L؅NYD7f~gANhT Y!T<|hTkMa&}a?N)Jީ03S0_9z&nKG^3U=qfAxkz\l$è; (zFz^Cnt8uB0&8] 6]zCv"Q/ȴp#+F|;VQ'*#9Q{WK*;Ťϭ r0b4D a2*L(؎OcP)+VG+/j<ldH)JRÚj}LL?tCc؃RE+źKu!J.a+n|R0$muСYL"b=fs(]R ^eX&k`q?xgV V>Iȼ2F(t@4t?a@dԱf]vWJaUT斕_ 
+^7Sj7IVRrۻVA2'ɰv]MIjK _
+hP$[WXP=c\e {^;O|K֖Y8ڀYFw4"=Z$- D-HvO&#KPdh:O,6Z//ҁ$ZsEN~΃^Ptxjвտ ʀvO9D4@3ѠgY)<05O VȧZȧŅd(1xc6*2l=<z
+HWkSۺ A_Νd8~)v!=\Jcgd
+nI~)&-.SHn_x7 zhx~L(zhᐠAL-!S̻t'QL83P'/Eԙqd(:n 6hbnNg4{(=j9%p>Jm ӇA乤Ŷ>a &Es߹_-V{="s=| >4Fw0q>Q tY2FP#se|@C"и"=.zI67VJU:aP(PXX|p6-N;uYK5Brߒuų--1 uo; ]4 Ft`b7܇#:䈵enXSS_cX~OgF{+%>6GAx;C `Vb(Uil۷YaZ>0Iz7 ċWYb4f9K◈yP.)qI-\6]:rDJMJlQoNj[}[7uSmgGn<n #TmV*4UיD w;v)V4:=:quEĉ,yPCāXC4gh.qEjp(n 8is
+)`1V dJ kS[4Gf15xs!3J{[r<l9VMh*0GP(
+@d<a!u,~I8n:C8&9Wde$ V+1Hqa ,߇P:EKOU/%Nk6Ҕfz_JD5Ug{"ME?*gBfg7K)Xr̡yDS,9 V)F-k.%Żٓ6dWWͳYCQR {H^Q6ΨL`<%, ;^ ?iC՛2Sdbc-&+OZ^m<}JdD|,~AA|;nЕh%͏ԹMF"W^3Tbw-,@c]u51*0U8Y=F2XYK70mz.^[՛zԛL
+Y]+@Y-H*Wd%%-c%R
+ t*{$͔gEe8 9g2A{ SVٍ h0
+IJwF|,]i}o; @Z#>傱6J9IN)7/j"(
+>*p:EA,阫bӢbax1XU,{D " \mdZJ/oѱ屾ϑ5 @fPZ-e=}^PF~)&򙟈a~-<Fn TjޯRE.;c\*.'髖GTلKDsg.1_?몱h[ga$!4( SșB1X 9k"]zqئcY!5##ͅ(_Ou:BzJ8=
+CKqɦb ( $7U0sSw0Eϧ:9`w5At+GVaR1}4<-2rl%k`h
+ H
+lj9nAo1ı:~3~RZqD}ӱ gM Ю<]jٚKC6?4|PZA~pR)-Ya:sh,e+8
+ "aN2 :e4E]t}>>Pģ|Te@`:,;
+Ý - []'pۢ3nUl8\Y* U#Rו\R0?]Kf)4lY:pF԰<1Y -{.\^d^]`0KqzN@Dg"Ma+GF6 }hT-@ _{3/Pـ+&>VˈT }OFQV̀m-'1 >Eq\.6*fS)0^]l;zs>/ut>Mg;MrlIyV\zU~9[*O
+-Q6y֚7Gs֏MVgo
+϶G/tf7&u4ɋj+ۙ<0V{&uj]7923{/N%m^5;W϶ZhM:/} dQux־XnrڻٖWXIڸ1S/q)_[^?~sY3_[qP 6 χHsmU'jns*}9:V{_͝&v|yy1=RU4ɸ;,C$[dk|>֫kt߹ԏΦg[b;G "ˇl\T,#jbQmKHb^d-|^Q(*[Xb^vQ@cf9s~?<^{wu9KS``&m[)]m5ž_=ƕf[^"2v
+ "q%EdZo|[-br90H'A(yʧ
+OpsycUSBNydgJP#^S@tG؛#pdŎSE O#kC"7{cE`.:7ӼO^0Z%K!͊T
+#T
+IƒepTs/=47ӭ˜\[*d5'2t+gi놃(_)R(蓩"5x·odOD>G݃
+IxD ?a'AwݳL$"TJ"RA 3P)+7$bfIA,!(}W)mt' ϑ JD(ɚ AiJ\'/|eFf H!O̔}Ԗ߻LX' P _LPy
+:
+Rb$W?C&V.M]@VFnǑp{qvR*H
+*KF\5,mB: whpX{3W;4ka
+^ 7fIbNALp/I]_<MTVI?ca( |6%N\tɱF(xw,eaWr2V#]@ԔN̴; }Z~}<$gZ/Cy'%';FpWP@F(t̏y)'_V[u)J/n"Uf `Lfy`0?Pat'!S dq
+,taV?}Iz)5!R60_R%z1]+؋I>^x]~0Dg?HXk
+=FvU2?,TL>jL\3,{>_6|c׼ \+ajnBVNԵ}Y謏Ģw"d@b1l3"lk8J kU0#6~p0h Ǝ%j)WxzݽxAweգ32JSD&[D6/ݙ;2ed{IV4`F(:x?
+dE)t#)u Ou a/ٞ3)G hbF&d(M 78X;1%BG]D/Wv`kRW SނiŠ[KA&BӎmК$KKa5W
+-
+>+ ۢ%J #VJ{rk|)΃ayh*7h~[੸>f
+T#z& p3򐼹RA(ekh*};‰M/Qc0L72
+aL
+YՇ͢ܚ,aw
+9Vq[!Db<{,l\_k%"B—"T7D*Mp5OLܬvA0[ΰʃ靖V"(+"l)MW eV=d oGC*HJ@Hy]0wJ9Dys+{.WqR̃
+HU1h۟QI5 4=.{I79ŔSNHK#Q7il?"/|C蚒!@hJa5^w%?@trt;n}HY6X"BˋGV摮o+i%t(8e!Fq6Rކwө<"+򇠩eSc]̓;dAsz,[B6DDV?ntWDU$/9An
+Jb`
+TEQa6)]O+רB?Z2Ţ J
+=,(l~4dۜQÞVԱsYx"٧@م?퀗D+K!Ӷ,( 5O6%†守@_ Y:.椨r+(6QǑ
+v -y"؝JbPf/gԶt̏6+c~}+[ŗY!Ff\扣qq6gWӰc٩_wBk*m^߬%/*E$!CWs-W0+ɐc,DcX8\IpPF*p%`yZw9'.]Þ_ A1~6u1Ph5g/yF6ow
+ }r?0KVTm!< `
+FvŔh5ADI1!xxcb(W.OP(:ǒ'bG.(>lp@}#a[y9
+FUT
+X ?[Vf 0kw1*;ُ$M9+0dƬ+MD]C =JUԵGj2Z-AY<;cT*P9$N'c"*M<<2 &Pƫ/b129YcWf_Nx=|aeF0+tp@0bE)Kpl5(s܀QF!9ogVTrxʭ_D5Zcy6R~as*9o˃jI%ʮbrޖm r\D%\h?xi(Wjlc׼چV*T觶D ,[_!B]tY"eiCn@;jDPmaWD5K
+tjDyQW2LjڏE]Hɵi%sHR,S3{.odLѰ^(V`9,qw/T¹9n PHBpM 47̓L]~fK1V BUWREoA|} I'Ҵ3IY2ךE3wXhMI_1&}M.*4I4Ӿ4'SW}pxn^EW17/
+ьorB |$m4!6Ը8\9}<9
+m2Q iB(6YI_|> i2&Y\n!NtVZqMMо)2}4i(~miMRR
+hhDֳdI="uxtZNGJ M >Ɵ5M"~KKDAdW?#v:SHR
+ҦEk?44uޭ3iYT1#Iw8I9\(_t??bIb:<~4ȷ'1&m=|M*>PPڷy%cLjhNa>MH󮥒*ׯQr]ǐN2p4iK?g3q )dQi  |`HL7"c6m4yz.˥ tP%|E6
+i$,
+-d%ʥSbB4(:°^dKUjET_!iU¦+bODW4qw*,:[%RI*3Q$rz)zQKx]:C5_3!zκ% ^(?ޚbk*u+e.neߺ(r5C uK|Lj]˔wZ!D͝iD,uZ-ՙuZ־Xc8\.<ʮ\-w['\¾nK~XLEzq[ ԻKbT1ϊ_ڸ^ۚևrg`TGLP@cM6ɇB9翳XC(j4o,H/*}TuYx8*<IOE
+3Yݰ`;[:&bɆ;vjM[_f]),oo}If^:Ӄ s.NSX"NDKuJV/w2LtdY)UR^L!^yGE)USA_N!!K)
+$ꬰw99RAܜN~5y'N=WH=%zu6_x
+ӥsDf ?5s@גa&G0i$WOy"OKLūiQmţ# $\ЭJgz,oE*d*EyIhW=iSeL\(I?06T1IUݫ~0._Byv.* q+xxc] S1< lT.6V7}DtJ*ح:/!6 :ô{|2NeeՑF5\6" 2U/PbX@+ !vo89H{do<kOT(BHZvf2Ȗd.z-@3$
+PoH
+JY Nx6B1-H˨>H'kir;*`1G9wv#[,"lGfrxUptUѽ%D4 ;ۄ
+ ܶ8I#N<>/u S ÌC/
+HWy_L,a KO
+]*(n(X
+Ug&LLLQ8w=(oԯYS.> BE_֔ڇ^W_bZVgRb⩢v5IVϾSY'^ʬ,h!:_WyJݖ\
+џsq$sͨ4d7t;B͞rJ#end>|S/ vB4=6C_P [MB> cV(s-vAc.Ϳ0eF9|_lŷX?;{bX+`,z?jxn1`ȶIMc'_ʑ2f22=э'Lz3W=˟M2-^E1?~׮0/Xr2GsG&\ loviX#T4ZR3~Do#eTEvi4'[Ѝ@'nǙFb <dquK/Q}woXcs|ma)&k _{}J9Ӿ,Z-{H߁P̙禺0ٔ@
+ `֔8Uk\l+`[0N"@.ԯ% IP5mtg9U"O?SD='a'v |ϓ%~髛I20;E<9.rߩz<&P`,ִMrPdȬiBmMP} I/I]jbb5hޏB,eƃl?#ԯY072~h-6X(r;Q'wPJ`^In {ejS 01ӭiu4@s)vDq|L~n:z+Yg)|Ys3fsL_Fݖ\Az,]y:LgzC~;$ʉ6Sv] (&0D)\YdUwcx$n%5 ђR% /^өR_J"r.Pioro]d֯P]d
+nmy@3`:1;kOՖ-e `/s46PD;(c:M'غ&@4 =v/;&I@,t{^ 
+EC:ۑS@*X;iwcU^6E~]i%;1{
+( @yw2m#bPTIuIJ5r:T" ɮv ^wC2
+Ae@tϔ$ Nګ8 z d$J->c' IC /|0q/pGCRn<
+"!vh8
+BC'kd
+28 IC9Ƥd-JCw/RypOŠ^ Prb[GF<+?W17O4Rԉ.mCMN#cIF9a|:%9<y\l6 9@[
+8@dQe@q@.z IGLTթS+A-SNw%A`#;}?aCBaz{^°:0Q4v& q*
+Z޵Z*Zw[+ݾ@ilb,dRS ]2AYnI˫6|›^5i>?eNٕ\P𱆯+̚;
+e
+Tl(mGVb7
+2cc]^{> oJp hbS. ! TP2
+c\Iq'$z><
+ ($DŽBK5!N)D E^[;D^ SySmLȋ4E .8`Gxܕ݅n*&<.u&ڸLrMb0JK=Jc- HbcH947s[@AͿ{>Xl;QFL䕉^ X"3$4 D ϝ8 G2LP-<sPW܋(){% 'JrzEnvE7ܦw[jhbzV?\Pq%^aw
+Z3>]]b (s4DN/eYa.WNV5oOn΁jw?s^Ij:b1
+M)K)1>zc5v-ཱིJ2/hga4J2<uؒ#9$fTLS&HYo3kK'դ^eC`̷h~#Z2w;̺ōOʧ_=
+) speO݃(9Jl7_IljoD% ƺ=Re}%A]NV]/hMޕ,;2^({]9nVl;7N%~k S=dE|,RC!(Dj x1]^i =9<Cu8;h1R1{v|!kA;!BBg'Zekʼ+-c[
+|r8?\NU^3 O:/Wx)MV]~g̾{/(.U&A΃<-:_ d|yMHO@=A޼4LU*Ng* u1hNk^א`'󃪭Ȑ$ʏ׍a Bi]w Bjo!L&*'j 0DP@+ݮ>A<䷀~;w D) Ob *Zg#u7c^A'9#@-z?}
+%y9qavуGL@"ʀٷ KpR]<f'Pb%"MT!>4{9a̩%B%8VNى IN%NIӶ~eηܯrJvڃ,\4H}wLW,_T`ZzSOK Jʤ@*e֠_ ChUi&4:4lCefwg( /|bTU r^IlrEPU½ۢ.v90H20gxt =dغf@h{ndR8NGb5<#RHHzz&aZ<4XcۦB1!*e8P梀7f{vCkϼT *pиht ī^`{cN[B4_tk]M1\gr'Y'L CR ռ,V]e5V[5]M k
+CUÞnY-¼\$|)H6XcQ]q]QyP-
+ X[q9l'+Q]boM0-א7 6htM7YJW؆M"Pi>jBI) G[rE:kC`644ƮoCq[/
+Y{
+VʋqXtC3g&|& 0Vbj?R:P,&r$?\pDؙ1ŝ)QH3p`̑Gn31Ȥ2as~yA.Lz9 }d<<[ij\
+88|%<C%9rc7zɾ5]P
+BR532 prrX,N_3L
+ w=raqWNz }}g塒 N'%?
+jk{VC}0Ka?zX>h6'= ;9LJӠB4@ @ Mx(0{pr)Ҽf+\"OeR!jUz[#Gs@+7cy <y i)?*Gs/+?*յ煽Օ L(c慆{ /H^xeޔGaa=VG}D#
+l
+T=e
+H<ޗM؇#OZikEIw`E^m6BeE٬v9j-ViBb~ᐗۍy?'F rLJ1 xc9~ި1 ;dҫt+q _`%dYd & Qw_U8:rIUu-O=5Ѭ,DD  "1@(l׸Pynw"]:2Hqwu\]y]3RZ6E!ud_Q״w/.mS6ۡ bfo͚sy.t'U}\0Y7DˢX (tӿ
+|`CYz( Uw*`fupӆ:ڦVy.#!?Wd/[Mg <coj:%SwDC|ғ YI.Hy\W~>AKd̒8@X
+ꂌr7Ɍ]P'$ h8
+o81-?1'~cnOzYw%^-M]]WhpE| ?@zhpN4D.Z}=<k8b`ş6|#3}P7}Cv^І>B˯zwgВB^~ڇI^j]6~l5O<WQ!s,rՒ @4giĈ7$0KA:Wga|vhOýoyG]. iDG`
+ʹlL
+}Z6[ޜO\y2y G7h=s锛
+zAj)ƶ}p%LQ}4G@$q \"Ksy9%A>ƸshɝS9r+b޽Y);8h(A)8y RAqaJ2$VsU蝺BXx&OQ3f$@G-*$L- F%/jǫ|4Aef%Ca 23U'bWlx[̋~tqy
+YM&XK;Vaƥ7Ԭ|j\Nȧ#S+7nĕj2apRP*ĕfBB }*q418}rR\֌ܥ05V1Y2]e՗ Ƹa&!w<֘ɾ˜l Y.
+D׮uZl_(#hXj^X<JIeEi͖z>om{?.r9ϧɊ
+M;JlP7.I^o[lJdzWt˕W0!8W]S*b'
+{syB@<}]nk"sʀl.
+@Ml}#"g?jj٩}i:U3n 7/%?3?c/eM(uLvi ҃8~
+"KDí*F(g]3 5>34! f uctcR
+
+i3^~]9']FW^t92zIO;Lm y3Rgפ ߫-u/\I=Y4OKݚs]QY[uG4,hEi#$
+7%grH!\#SulATzYojqؘĘwbd xwi=<g"S)ɕT4HϚ 18~RDXAF@Xśe%SJpq@TE 4aNd 򐘢4l#lrdg"sx93JQ Y!xKc20wir%yQ)N&4
+h /& (]R6P(}`rG`;&Sz]u
+-AvQ
+e* Jjò3uMIA62m]-Å};Ϸ4̑h>vF!THZ(' +ӍLKA`6\kL%m-H%if2ML%l0ĦVhVԒMdFt'lihN&[^ɕ =' {3ΣT/l̔<M  @e#U4dWO
+ahBV=!2:65_Q,ץw66 [j(  Fܾ:އ_2{J>xIZG{ӟu`( 4N6Y:ۘ 7#EuS35 5]s4&L}%X^%cz^z`Y;>S(  Q6m 9_،hğձڲƟ
+qȄ :φ,\],^,]?n4l#Ƃr#yZ'nGą3Iby? ֹWb\3i!j3qW|L8&Rcv2Ezloec$9Tt$tG9w O΅v֢uCrR7||7=/5>'haK5xȠi>?/ DG8ׄ\F/.ʘSfx$'a~Hn$!-{V+s{E+>[x\cEwHx"Hyc'g\_0 OO^ZwrGn^z7.딜9E ;͸`
+HM\ OwD
+dF}܁) ZǏ7 x_Dˈg'q CȄ$sAFz“.Fz^Rs7FGuӝ3[n.c'Dž& N@U%}9%5sR.CPYNp%UIkz'R=
+CFf4nKNuz>+O-rM)hoLqv1_~Qq>ߏy:OY%;3 ] ԇte?.m5Af!]_ ;G$(TՊƦWtUyw,NUT(n4Qm7b9).i]5K䈓b~.bGr9H2Re':&LQ~3Rѷ>7l't$Wӑ>}C19O)+R̺ʋ7ξ fgВ:=춄pLAx,bB^YP'o窿gQ9kR%uX}8f|9e-U71>$3ȣx^jIk L׳ ) C洓v_5myA4
+L
+6C.:*fF")(}ѧ7ꗧTi?8߄Ak
++'1m8ൃ8 vkDP5=mT^6;45. by d*hdҘy r&2AblM^R䫛0,INyN#cQO1ƚ۸},+VMdds!G{@!{ЋuN <IRGAF+)X"eeEFTjbuGg+ByO8–0 I_sΛ'uc0,ﯫ4@?~%9??~'F38d(eך/o@9*&~SI'[Wζ@5cmU^A?~M]eI<kȤAbhrfcvVe u<9.]K-@xu[$ʠg_L- ZHa
+ \}8:¦oJ%=MǕƗR,G"4]^J
+R
+Au'`-D-Pz{hP\Ւ |zUTly:iInw$\ZG |Uv\T R$0`QӇ_xmK:-AȷP$򀃠5ICX"MgW 䤋̥"Ky
+߁^܈ڄ\'GKjfX$BP
+ɠ)ZS
+=8B Ͻ=]g(+`W?rVwӲ_?֍/ۉvLK>:h7 SjP2k Oa@7;u-zkwkOC*ozZxzZ|%2Zt _͹G%
+X͂N?UaN*$9:^5Ҟnp׎mR~ʻ8 &κ2wܩW~9[UJu[;!*(baťu
+*),C)gd.C` L8;3 U牺H1"(F2Yc=ci"%uD
+#b,"Kmǿ3`%_V 3{ 3Q&)`y' ,.t_y
+ۧF\*XfHL~,BKD2P椈;]g}m)s]WL'??
+o٨ 7"?vG@L2;\-UKedr]&,$0X<b *͑LLiv͔/m+IE^x_2^\sUݘޑRҘ^a[u[PB ^a>2DXF
+i%~ u#|H9 !l_?^ӽcW8:\!E=."0U.SI Z0lyH$-gY
+#N,%dŁo!b'NJ-==}eM]to"iXCmZ`v
+ |vI88\03`8&Jay)2.> UU2ޒ-2\rYkÙrz0|~ $]=c!A}Ib%k'7dVf,WR%G1<HQ5jp"7L's?NLWVUaԍ*6}Olv
+tWE>"zSrMVKŲH!A/H|)cJښ=mݢ%((軉?D}O9>eU"-mWPBપPˏ2bUҽ<iDP4j!/n {x+Ps OOs7T 4cP:uLBBd T84% KƆ@Jgߍ Ef?Aĉž :@֞H5>9z-dl
+MEnYU
+8* >d]PKJƾȶ~DAIEf$"GLŶaTsr8LGs[FxA| 7<Xe̻g1Li$Դr0E@3k
+s7ōp d@gZ^_1L٫S/Q"If0{޸,t ^_^wHf|(3ڌ$xi]
+@Fc*0KpXy@ .kk̞MHEd{a9Ve QVo?m=gQ- |zQ)rSEC/SX*l ηZbAtx\mMa(72;=]gCLcl(UA^eĹ&k_Y>΀RfH`f0=ˌ׬b!߆qi]bvӌȡ_5}m>piNrEve上-aсK=|sC
+u2
+ l5Q XŁUi79)Сnܗ
+J R+q!
+ r3!΍(pl+j
+/fBUl8U(B
+!E '⍽]J^
+FDC"G'3_(,.$xɊ`Xi &G8%n^ҐY׹iC1SaT̎.XīѶq򦁂o$C ٯ,ӜX:,O
+%>A% $S[^Bf(ZL@VSA_JjY}Kž)
+>߹{ 2*}(Wx4R8CEݓ'P< e19qhX)e~\V/X"54p,J*(eʼ"kinww‘}Yp%Y;dMШ$^1UTkGcxѺYm3
+?EC ` R/Ε"F q
+5R˵`2L
+e邶yɛTR R@,Xp~]F0Q7*˅fF>rۺ*Щ"(Pk7,ʡZ? ܭ<
+MH
+xIbɼY!"΄o*< gFWK(
+
+~~2aO|?06MF5ox1ϡ@)#4V@ƎlJڙ2ڭ^>1D,F,,& k3VR.絈jzn A'd՘#C%Y<
+9a㈀:05 r)˦PYv Y ͚C[R2I+\|-|z!ߕy%M;Z8麬 yV}ѡAD ح`VdGV$藗OS\CȲҞWO*]t|K
+w8# cE(E\̽?'F(yS(ˆfu1ȷq^~xyf}sw{>zu_kU]dyfm{ Jb89t榶6
+qEqz.Z;7El`VpdmB&2tz/DG}|{Q l95UkL(ZpX
+O1'W7/ŐcseJn'$˃N1Mz!:W~O|lLB̙7(HaiR`\W6{퓸SV|g[t99Ge ~3IA# oZ}W|)"܍<Evմ]pt#k /F Ju#&M qݦ0aQE>0dbR9+M_LmhOS2ư^IBǫ1QȦ2})[f&%F:I7芝8oڤ])+aNEֹq%['\${9~9}a-&9ځyOj:eߜcSElp6̏aZq˿`]<
+:
+xb
+ZQvs<
+
+\e,f4\CVL.ݣnֹ`LWb4`b&hMUW_@nt,W<`{|*Fa}ҍٿue5X4ė`e,MF_%B ?ooA_J UJ0|2 j…S8e3 wF[n ݪ5Cc8s evtd;]qoӧ)nܤXֿOv#G
+zݳ/:ES5nD3fXe_ YGZ==wt=ɏxuY~x4pvӛe.sZu~f)9} Әe
+U倫S4%|QeaL%/,䶗)|Ea(ڧTQJZGsC0Ė0_#_hJRG-%hitB]f@t;d-[}&ͣi8r8 g)?NK5@0ݰIގ˶6˹]^.O j=a
+ZJI)uo/%c'Jdas1)|>Dsޮ*:{Կ4Y&԰czJ~ԀhS|-OܢE&סw8=2TCeٌ+L
+E .;k\]%]vhJ[ Z^\OU^@u \5>ѕ74pԏ:Ǻ((DgKy}!D´&84r.'\k ӏ:\x6wఴ'iA!ƗʾMsێ-ƟyUB**L}Jc=a;Dls1Kr]7 DW=x*IviNb?کD2K~_ 5-|7±SKܸ1/^tW$x(`6'%X=NqV)'d ? ` )! Xg
+Ҡ`|/5FnR'Ytægx8aZ*PxtyI5T
+OlcϠ63I0l
+Nv3P&E=[ Wmqs~T,pKC?v{m.SHFT?K$͵t.k2H
+LIs5*ih4Mb2m+Ml &~J)e?ܙ
+<aOB#Q6`<<#[Y쟌9،*U1K9l]
+$
+FFOJ5*ap <,<.pB[@Je0r8H:IC\rm&H
+HZe-/%kƾ#* .` TsLG yJX mrǸJ}/( HH_. _??H@[(Ъ~J
+c\j'~rƪ`t?7Y.P KFMH=>}aF /?DXpwYzF)p* n))\z2ԒbkR[ED=}e{^FSNʏE2f -w'oG @de..OVcѐ#l^E^a]N>bҡN=P5&AOz,;B ($Z@ YnMcI7WjP5f/0FV
+9f7kK NRh'\fm)as. vԀZ}f%;k*SYk+ A&D:'*]Z{Q.+w"1u"kJe
+4,h%"Wަ*e5@9%`U’OdeXc
+DxIMQWĢD/rԕ]D(󘣌Kt@i*B³8×(g<+P̗j !@ٵ-/
+ilణ@oY󷎱1+7Xf{# Zf OsҺ,FɖV@E:̾æx<@@c I;F,;r+jO~ƞz=U$gK#U$@D_3c7SuCO\gbh8{xόUP5l
+DFλ@ަBxG%ڳ3l1+ʊx>&(QUV#akڏB
+ڐK§{+p3,2c)p%~sB3Aq\[_Br#ϵ 3w=,`u?G] bd`%`5jۯk&.^(iu`: |*??QYW 4M$m
+>S<89]݄d[5}"s)1!nZa5 B,yᢥX>ubր hd#$Nq.-,$cjll{'A:icľ`oO ) UG3Mj⪸,>֚pޑȘi䯘j\jȹ$`e<6Qgl
+'$S{Y >s8`pf>ǰrp^>Bbz!^)
+d^4ki
+ermntECR+2"
+,׺W&&MP8Wx_ `YcGJǖv-d/Uo),@ z h­Pc m#%˵"Hem~ w!U61_1cۭл =Fdz=Vad_`DUg`T(x*kX}謹Vc,J:q 8P"TcY{Sw+!vF8tef15B jx Wy?Sr:G}cy'B!uԄPԙ:9 0gM7/9) J-,eb$ `+\s{35Bh%%faJ[8809bW89FF5אycQHKOr=mȹQEzgX
+\nmz-G`O[N5 G =ic,3FHkD{Yrbj6BJijs8-#bA]yTڣUx{kPQZ*6AJf2`4\F7"!GGҽbJed6ȻuQe&<7gXr똢xlt5 F(gBxvdoHjJϗ?:
+[ڇsb-oFEq&+~XWoNHqLa[s/ֈF ,YGS+KnO/A;⼬QC&xNCc rh=ctBk+:ZACckinG}FtXŠYJ实<WBƳGgpS!a?LT^BWMF "`}7jwQ@&!e`4NcLcz6H赜ΰS^me8`k^>WkV{>b,狏)C%$PLba,S͇ebLDZ55.Q4< X*B%MNJepH۴ (óV0;!̃,
+B~svRB]<f !V(g厜 ChvJB6@Mj ]
+7%yΛAfE$gg8*G!]QUn`}w5oKƪe S"
+1#6PTXgy;Q؟_+Y}[V|-٥b"a%% M
+TӮ QЖxT K3iZN&"靔/i䢧)5@9#/װk(p#I+-xk6V@*
+ 8-M @TALS| P>O&[!<f>~cXY|,a}^~9O({a
+bG=8ͳOepDf's$i
+z\(% mz˫A͓9$1<+s/P?g w%[:Wy?׷Gx~+ L[YD4EM3TpҼ2h>P̂Kެ?ibZ'…pvX%SƳǨ=K {*gq)?;
+F<m@f?Eiqti(EIUx`5Z8LSX,Y#!<ByW9*:2<|5O D݂cG3D AR,"v{?b
+-Xo)|oyhpj7h~iJЄ_Q+&a%[
+:Z4"7%'čHKfX̯p'+w
+1elU..o+иL_5JCHy:iS$2V1i ꩗o!$309^NRf&[zfqT"@h%o!1Dh/ASMPlc< dIW´DWjJ 1!*ˍr
+|||CY A &SFFO!9@%9@``lyf
+np|xw;=֩EqYT^B
+$0-j{
+0~=7`ZG XN BMqӏf.F&@@DPۋC7Э,<͒<QR8ti@dSTOYL_!dN_X0l<'jQ *̏<֔(yhSI"8cg̱|xP{=F 5(.rVb,Q:I+W/M+1U %W #إe<$V-
+aj?j1qtˍXv)5"2%ty?vP p}cgWz mp{-Ҍ5'tp
+{]
+!4|kAiBkYs7zй.QV "Tu%BtG:~,i
++`KH3eL;r, s
+YВŘ.ҳ.CV1g;
+DPD]tq2KdZܧ!hٟSǓ1͏ ^FjF1+;:UgM<#lCn-w-~$l!GARUCd5:$5e{02圬
+J\ nk5KF*5-qДI"Wagb]ue=Y!& EO<GJZZmfJxY#WKT!3eWgŕWhyQ3=Vɕwz{u `Ɩ/? {jYExC#^645դ'OHZ+Š
+'-">
+ߣKyt3n$yC)kȲM ;&ń+BR-4MkJ9O'wg.<@Y|Y`_Zśc ͖4adc$<rD\IeVe%d"~5? 찯Z8Yr=.?tLa ڌ0C.帧1E1Ŭ8Ε\⒢pZzuS;|E rγ 97QMlt!%
++N]M[ ·~X[{dPS$_7%2',ؕr0@ V_\q
+{T:FM\޹>K.
+۵,>L^D =
+'gykK vt }ƮLPBmͬ=*5*z<e;?;nI5"'}-“Dv~(AnFPxbi-oL>ewdn[\;Ez,){$˨]1));Ć-VQIkZC?`K6c^ &/:
+vX> ]B*]kɿ@oE5qTzhg?~ӈ{o4.L{Da8}2ŏa8?1Z<k[kO iAR.(i߁\,7R"fW<tJBx~x0,QsִPabl1M;|//'_XxV?u Wh;!#?f%w ^<MWUVЄ,k^m0Pb- ǚוtegfce%c>5y-Eh3dy)D"eUa6rC
+0#A*h RF {5~ʇ5֯Z}!.otm
+
+
+JҪ NΓ
+(CA#VԎMTa+~K1@{ +U"Fp &X<;<ukqM8N|")"-P2nSg'om"!v~:%΀ΠUyx1ק;Y4<Swˋ++m?,A?#֨?48IR4M7K%xF>a -u?lx|0趒;ٿ( ('@(Թ_ef%#``ߏ,}k7ѕ<"=
+~凢#Z->n1MޔD*ODZk
+ˆy@osu
+G Ǣ'+Nhio)jqHŴvEsʚwF3 ߀㦝2J~'J֜Qt_>E\%qKoe5ib(EҮD/х :gIžMge2gOT+u_>ƖF=h6m;C <uK< 2Ug|WJp173KH s*…X0/ssg~F؏g@I(9JF5U
+d1uL.{ TJI?[\I*gR ܄ 4
+_bA7ޯE .`= kHn#)r<ŒVnjt"K7Q^O$m݆FUKzz2ZHQljK=(C1(G!ÂGhW @jSsq 
+${}-73},
+ɗ ݫ架N? $jPk((Ad?r02iZ0
+ o%@a~]%$!dLhuIȭ}IXmL)6DkZǫ(@>a \F%*G
+k$z8~h<Np샷l1E[vAF =c/5Rá)h`
+HArDO; X/+yby!#4^& HDvG?˪^?>|}U-kFϷѺ Z0Y8( wezUZeuZ6>5>3q
+2<^-qM}!賖B8IomLZM&-se5,̵e$M$jSr6ZS]'F>m$TĚB 1y cn}LT&N#W T-V[euA|LAqD FsH
+WZTRDseIQ+iJ]~o>(JEso:KЙlJ5xZ V?wKiqŖՉ5%Мs4_zAI@zQ/ <Yf{L=V<ޭ qrI]L>< kU3.4]D OO=:%0|ӣcuܖlF1 Q 3g[͇ib(|
+`Ҭ0=( ҥ"NU^@&ByatI+#(b@Rk%ʣ<y01\LsPt"5\:g-!3SJQQ8[ƻbUZ^Kl³ J4q7UԈ{;m a@} di{
+C)<гϵ*YZ\Yء ]5տ?t2Z;VDH0Z@£]LOn`V‰婌Õ#sicЗQܦ%f?̙ [x
+Z+NMb'8OHYT 0R_BIx E
+ j(j!f ~T=
+vqˡSdfb#ҶTseز n?v݄Eʌ_뜒"7Gsd䦱H5C޿ ^jkPF Aa;&n0Oш`A
+Bp2}l>Ʃܐuh #MP$ L\юS8^WD%vMd%p&z^78tx,6Iqx{*3qݦ쫓#ggR'c=q~M[, ERWY,GBDє_<(c0WAGyMQ΄d,h|4&61[2a .OTx$b!ϏR)r{
+mpQ06*$V.ŷ*\EY(Re9:?˵Σ¿KГ_@| 9T
+DN0=}̼N3 Vi}gr:A 1vXJE9z؃թH!u`5%Hx[
+ȿSf5{KӃGGQ$({4Dĵu% J; uL ԂfH[We()pIxU0Fk%œ V 0vAs+P<R>|']s`h%b8#6;ٵ"# {8:ذgM =6
+~ A&?NFރ8Ԣk<P
+z1˳?sU&
+:KM S[qɅ6%Loʃsp41Ԟ>](B>
+VzQ/AMd-Ym3Qqsd
+?)-^g="`ϜKM %;~Z:u@*ɚe9<[1oA "0 `䤁A7хD+$}zw>tH[
+6"(`J?1^/nH@W  zRWa Pa;S@f"~&O
+)πZA} FnA!<s gt#P9( Iq+f AEPgB@:P%i_B051eDu*nd+B!H,Mjsç"Ucj`ъ]͌
+l#c@qO!6``B~VVh @-cگIԬSyw:PP/x
+hxc@mKkd t*&}Scq%D&+~-fM1֋lb)vpӚ{r Ή"\]upxIC_mq١Le!
+U%w6e|Zj]$+EWʾ(ݭq0!rhqL)A{P2pŋ L$Hn7QuK:$ƪr!jV #Q?%i=GOU`GcwuRr#:BNF쌇xŶ-*eT#BS<5;EpƵe;$?߯&F"g1I?1].+=~~g;Bpt8 +&CK$AX"kfރ>REz}౦CZ`g~M99
+$l }%d lS1Ѻ2g#+2:C:MЀ]K|.n sY=)e;y ѱЀYȏhg|5yL6E04bErt4Ȋ xi3Tf$HH+bֱ18/OG*,6zΩՉԿ^$c|Լ\BS靖(q`W [L: xX+4xNʼn7 1\%^BHӆ]eyM;k1%"r݃*4|,2B9TP$NfAvv!j{Q[SٞtĖՈr#Tgd *6U5abb͢Z I 
+yHI[J^S%Kq 6M؏
+j-er̋׽si4a{)%i].Pe#l1'L"x%伕Ȥp5‰ɞ TL#2bvr9zYڢiٓ]'ѫX TB\"8}iO)1Hc %jm_Y’й3AyD'F+fջG7vObG Dq!oh7WFqii+j Bc `WA1mĿ|52 5_[mȿ Ww
+?UwgJbV׷Z n˜$p#|Ux#yÞe]+GoR᪓4
+Uq
+;ƤYXėNR kl'=SҖbDӔAF#bon #!'.Yh}qGlSVHTKCΌM+ی fPweʘ'iz8%ŴM#֓Vm.`^n!R(Һ"<'X˻-jPsiw<f՞uY-hyY,b8[`< ԧ+c-3s%~΀#xz ܁ZZgqFمߖ?$ ԩB9 \LA@Ps]kAW޳=?x5'c=FAWOk=%ymmyh06gI+~Q S7A\&mw|,]oav9uEu{LA(#8, 4xxʤ,T(arF הW<U%7bqGjmwLڀ6Iy,[IJ뙞#r(V5qO3֘~=k7ۇ;1V=QuNiWC6W0K\,6ȻBhisO `yʽKi4X'<&,ѕۈ #IgϳZGᑸ;xz7N;, ,V
+K{3ҋG }j|๗9Z!;qWH;0[zɌ
+5Qp&6|s!d3¤ehT
+陒t^厹oDB.l˯(9F2o3H,l/Wx77*`@y6W@@X'iL#ML1qC g*gTQt$8dM (Pj_?ZaHj-%})cza p%eS qO8Ga'е|:aݮ=mh0E;Dz΁R3^^}ը*եUfGr9%C7GhɃz9ݎma0 psa <,$W%tLy`N#uGŐzL[2z\c!VGI\S؛H
+=>!kI<H>µѕ31}Z(i.:ɷ*m(GMuڍ0ȞA)(?Jf92
+Mgcԏ>/ #U7jvn9lp4
++jl^!I԰lE"ޜI1jSs lSOT^h!&
+7 ƓR2VNdZW׊A
+$SӞ#e
+Y=!T'D
+GKڶ" #RS1T>xA?y"a&Co/d*VP!TݵS 51^,XTu8!;c <TX$vMWEnCbo K|*`\;6{2nyDRԂœ[<3"R:NYz/ ƻR`pLLpB W̮,i-ޣ,^O*0Hbr]ARɷLD?Qkyw$Ӈ-ˁw-4eO-0{+>0H_z""M1H yxVOvZdud*3r]W7je~$O.dݐGtȺU},_6v1>˴e3^%+ bN2EK!CV=/SxHT(ODeiF{|l°ISX% b<Aj=DCz,`_RV&@YCesT"Y4L "Q*Dz8Gusݕ kA?rT^5/(.Sī.]v=nl ynO M)w5Ȼ:Ha:)lk+C!wM6hz; sifoӓ|J|"z
+xQZLǤǃcRGCANF}J@D5~A.N]TS? **#OWmN.G('2rR1KHKm%/!頂$/Jy!C+{BeZr0y!JG֚S@0!U vPu d["ϵDd>ȸ#!a{%
+dMgdxóUCKÄ'퓹:bBfžI&\" }ص!9cکAgvK q\ :@V}m! ? =vЅ+X1!wQ6(d@? Rvw-WK'( ݥ.©·؆+7A[Q'rHRGE7e;[sxgwq!WQ>D
+XDNN<q$9 j/\2oHf'k=ARdņ9v`,.e..Y.:!{9> *![(]2&. 8ed"s$8:?!BGx=ƀ?tQg\J@n1 zcdbG㪒EY|S!"ByTֹf5^e$H*81`㛦#6%@ 2Œ/#š3J/dWm=W:sja`&v4Z恓H |퓥+ș7Sa!cղ=|%l?OĤҋ$CHcTzȰRl<f5 Tϙ%kJ++<u7Dzl9"r]Ix:flh10 ?$S9Zm}s$;:G>z.¨}1#o^J@0CfIj|ct$j<wgaU1&rWe~BjbjvB`16E1Sʌ;gi]
+ÃI|Ȼp~@M̨ohV\ZtA)
+ɂOPXnKF ח(G
+gȩEuXU?V
+PpdݾL6YӄѺr4F! 9`@'P
+"E-ީHZONĀ`Br_tho d(i
+׵b!@\aRz6jn.کBP\;F9sfpX_QD%ĽYbmZR>׳ȶmE'SwB_a+{o|,I~x$҈ͭp빾^+ylj}m$Fvs+pۡj>Mx=3-ÕW&,
+9&r;"02ŵ|14Fdٲ[BO
+~5-#
+s$HW`wCG!!Ӛ% C]/&.ɤ$M(k5[q AfsX./my= "#aXqm=wZz1RCJd<Y,ЯdnjQ*̔r [}/i\XPh4֚KY#}CN!ogҗ @[%ʉ c mxu{beL=!d%-/`,Yed=HkJj Vww}Yj_PPxkx
+ӏ;Bc9ǚaycY4"qpGTpgj6.%
+x"pVa־- Cs14Q0W Ti7L3j3q75 &Q4Nָ>?{{qBcZe@؍`LXh&qӯ̒ugtZ Nϭ`![ʥ2$sL0R[AX'BZjp& 5LriTYx%_"vmP13%38拇lݒ@d͛Nm;0a$`[[˔VS;ܒj|~?c|Q>~g_= Bkm[t
+\~@[ &cr4Bv+&5^(E=i-^"XID9r{?OǢ7|//i WϹ$I<Gae^x"VH^:Iu#z>,ZܣhI%HpiIQYǸjzdٕ ojim&NR#c!~:B4 E#%e2䋭\:Y2kNstɡ]FjHBs^}d<uBki 9;YO 9 |,~XJxӪqN8m -6I6w%WL K|M#|kR}hG&DڪW]{{ɗ9 urSLM2mkN3ʘnƚ NE>IFҘ2*{t4ޡk3"(00K4oHJoado敶S7 N8@fqd-\2̒)4VZ_;y#F 2*L>^ e;{Cp*ԗώ ğ`aAhi^g#ϯu67 C͑(XӓjԶ
+B*]99s4^ai=ԋÖ}"7=DW0;+   nd;,ƒY;>S˃K_Vg. /aЌAT*Ru歿Ǡ̤pV( 3')lnIY|]J4|7à8P 4ZX2@gnJ{MT'HAb2k{vNIX!d.2lԻEd.?r ŝ5Z\)r򫶠$).Eـ$~
+_~u&QhȔmm jf9?1s R+?˾rS
+G&u/R@@/\yԿ='ArJei%E!rdN1UٕaJ`OLi#s($|J*iz{%(4a 61R-V:f'`KJR("kxpv"4BHBB I2,Dc_$X MG=a@%Fr C鼆@Ņs+ZXtNeɣp.L:`yɯڂ ( -S@lJG8\M cEqҒľϡ.ڻdoҝ\ @H
+D9S@D,ꓝ=C$4%!X%n>
+ǠcL8wk[_%٪%2Ml!HpCJ&*Ȃx΂{x0\Vo&QBEk ]~k[u΂k#5q
+(LF~k΍bdT$8]4%i͒9e+
+5vMb$`GaZUz I(3^ڃ>sQXlKCp`OU,b}hLjbmH#jR;ŒoJ # 9KVaMEmA088|G{|^_9/^I׼86KW?NGqV7G鞌t+b|{p͗1ґ&VyBlv
+%~4G/ZyF;쟳!؏؏*tx;"Qq_.LsaxILHz5+ThSF6"}DA]<}+ᒌРam`l %e
+"+kR>Ž|87ʕפQ[!h# `:݃]e:wZb:h/g8h^AW9opXgkv: `9NZ7a܂$ J"߁_WָfG|?
+
+z_w%ALpޔ?\YOV"#.i5@԰pRP;q,{ѹQFw;(劰j~Ysja3j\RT֎3ş'> ! g`Bh!F-CɧUe7y>)8dT\I62L$:Ԁc2Mx!0[M鲪#xjtT[Wx,|ҤE`"lD5|M"E<7Oɤ~B_fMUg&Q]!N/T2qACPEO(ϫ^k `)12[<}ODhEN]Cq׸0UTQٱemꙠw^Ҥ)!"ʹ| DW-0b5"|,RQJ˅t A;boɀQ&FVd㽬|`Z`^3
+|
+'dޭ
+S•}q(:-~Q%7F-{pR)V[Za`0k# BT$rWMUD"3sT)<]E2œNJk<x2\t쭒 +ϐaV6;KWx9<_eU.tgy<hZI̙_EoH *i1L*Dc:r_R- )('CFJ9{A^phxz ",9=Oi&0f.S$nL* t ʯ%,
+ʚٙ؄c#Lpx\&3+ޔɗxHPy\"QKf[jr{TdB c
+լD>u &FU Demo'g[chLuf)iU> zشW฼}kk.a 0dݰ<dwR/)<oX`VUgzw@
+4{r/{$K&5kJIo+Pہvw6ˋ-2sҨ@ o{:O֛Kso[G5^pZ)
+#,nÿdys@=H{ 񨃲Cyt[߱KKZp>7쓟?Tą`Ag*SAf̢5sFE f7sHAcf>N7K!) `{}PNTҲn a󳈛<a6)sZaԤ.(MٟEH\IYg<"Cq~XǛF',ۦuOtA#|nI2`C̘-fީϢ_Q6gkR;Yhx8y(hBH]iu :$6Yhs^pbG+םx3;@|Fgm\zע끘ll6!]v1, ]gw:7j4]'d-TS2 C l
+E$7rCQ C2L'E(xR2ɰ-w&ϘIb.߫`13q3pѕUnU> +wϏLX8\Mo^(zaO1)%0 *`0,zmFTB_PkHn8 [D-P2
+^:pik [򏴊͡7!&4M+3a'1o?Kvp/k,O_?#=Cˁxs91%iM"ک\t0|p_FCZeʌZlț g&,]m'bb=xɅ9ד.>^^)k:=:<j,{F=M!'aN pX%3O4(j:+G*8;d5[$KF "hr
+Zp1+7$U-'[52xjCC* _N .aQA;j
+
+G}& n%PRx/**ιX0D![Q :
+!ֶf2mJPv%1Bw/8!,˱;pT38:;<0ʈg}YI> Ƃ]S 5LG-S2]BIV挛8d:FQo%_@U, fuD خ[KvXQ I&);6G7eLK)+\'IK:A+K欷9T<sw&.ih$Lf 7b/Ld9-u!3<вXݵI˘$_>i8F-KpT Ji)h3` ,^Bkh8AjK*xԤÿA톃8kAh@+wE6í܃pF-NG>idj7!pd[BnsmS7dC磣v:i mG h,E |m!YTFh{ E(:԰x$_a`1,,Q"!6f[T OK1<w GWΏY1`"7~ECۇ 1 Ž+fy9Ā
+@ lzܥuNziz뿏y
+tttbɻ[$uDiB;4'Tw.aRo-.a>0#(Z B]}^a;QRXU&^i1H@֢Sx(n%|G )Ҵ3|Ch"򵦻3^'Ǎ@@Sq*&:EĔ쓤jDw3!xk'2,XoND)v`_BWaU}Fl
+-۸2:GJwwh,#
+HMrc7 O;yEדoo󁤼ʪȣ 6FMKW Ftb>phj :5La>QB@4.%1ᗉDut|s[V200.BGB"nV[hڍ[?`2.J~u#x)D{EF^za*TYQ~M{;cUކV^Eh
+q)m^uqn׈Qyqnw@%{Ym^<<^{+D:on~`U
+*T;W@')rbtTB<u<ZV)|tO˝[RieLcX]3&pyTѓ%푈@yW];LJ AVRdt?RHQ{6!aBw TV^|.˞54"0P ^5=B0֙Bdl<p9 Ym^OROfd!lMʗU T
+F _yO.MI,c`#$Y̋ | ΀i*T> 60(
+AJhy
+*t2%tXxbe*f]ekEyb<{a)clJAD&T$bO!-Wѷ~zHf+xH%0e0G9ôxL'9t!)bh̐q>ǎJ KN8lj4~\!joYZ9R[FCMĠ%1b-{ljJDc=RuJUꄞ<*"}ϒcxcsR96xrϚ`j̕p
+Rcqq|s ^YpB(VPk BPuf
++
+Ugis2Y@ȱmkn4h!n1L
+wYvLk'Bf&97¸}c\ ZxJg,L^I#uMK&x۩bƩn~ nBcng{rFԬ ꟴyQI
+ЧۖTu֧F@ ΠI<StReV#pЍnsze7?$Ǖ Ưzu
+DwM J})9
+dBʢuV$wv
+ '#_rg5&#6}eżW6Tis;Wɲ* ʦ-2!딚n;{/*R5(9 #͕b8nϥ%02`7}d;3|@;& )%mY_ms6J9s[t22ۼ:UgzMPI P3ezno;ރ-af !P,hҳd;á.ɲ̗fYL11ӂ_5;)cw,iЩyx󄤈a͸uܗh>|n1btf3X\7ʮjٻ-_g^xp;)M ޝW૥֞K݋6nxg쭔0+1ϡ($msg1úJ' 8@r t CVy b+My\gob蔒+ʖ
+#m3T]ۯq<xTf!o^$fe3+`?SaE`痢H+u09U%Gz]V uv,J./bsq·ٖ99 jS@k
+A[zk1Y#o{SCI
+SÛ{P3lj . Ve0׀w^c_k̇" _aJmLfF(*2#y_|3ŐM4`Wa%ǝڡ3MR?Ǘq}a[(\ơ_b
+Ia,'gEFMp).Rs/ޭv/c6YB%iA>*M*2 <]hY7剖#JMI~pov(Q,KB/IZ0/\eiF()T9DM4Pg OE N44c)C{1T]`R;R2|;9:̚qs]`6<sPE'?QF+!* 9sc')9#Jꐿ'0?!J0 wG(OK!桛͊Zb c.N\MAo>%: [ `KĶE L>U)pCɄ|pzN;E`1ҨFG(6sD$K"Q\XB~Dp5*Xp*"7L󼽄l?4DG!B4\"x a\J=">f#g q4 M|IX(GA ĩɕq?k~v$DXq,N`F
+4(<F%lek3;N: (]'6ŨK`+Dd ֘boZj@fHtikH/" (KEM=euz-]}& /VVf'ƙܮ
+qV/:~f 0ح:+(a2OY}
++dن40W5aZ֦KAC(& bGR ÀHe׭hV)yL(T1G['|VX!<w/OJ/*:,> Tw%x˿WmpwlFcy[ >$OUP\[ڄEXQ)\:^DtH(ԲLbKAeRwP*/y:<LBDyS;jEc oW*"RHNK^ָA ᙜZe<2L(Ȍ%{2Ɲ.f/#2@K;|yh><?ȼg :SC~4 H:~@4M"#|b@Ƅz!*.W[& a5Wl$9P0G.kw~ć4N_'MT+|a@c$'g/!xj6Ex9YboxޚyĞLGքWE}g0|]ɠEmmlLMΩ~G> 9aU@d;`>0c8e-H1fEfKuET7ad*Yƿc2*MT& , -8"M_y&sPK*6iF{Y6rP᢫`Le",yQAm}*98f^ ߏ5şd&-x,$: ~m*HiW'{I.
+ -CPoI ';4#TyD 46G.z8vB#۴|rA3 d!a+.b >1765ENe1AXHcNՏO-b~ Oj6Kއ*]Pwmlhqj9..'~JBX|>zg#x3w?vɋl7,9<x9R2I@Fؐg;)~型(@VV3~ХxJ&ɉ7sx<vWe 3'JVam fb]SvEe*ma9 $kРclkkjRY8(ld:8tME[Ň7mOLJ}d~CӸ !'=bC,)b ˫8U^38 l
+!^J l{
+
+yae68'0#@xZRF y\vdrBV9xݮ"5A{.Jׯeͺ9TɂKT4Gwлe!U^WŚrmvL(|r p5>hG@U,ǡaom+;g. ?gid5Ų G{ 1{iC,&yۭybZ 5+ä=h¾F2lr<T@? UH*Q!0">}8GN9"Y|Yh1Οv@S1GxBgC[jYy{Dz".C9:/' \ rJ4܋K(oͱ3%,V_iFipw9trF@Xpت}"5M$%Oj,kkLW1)E)5,cMxMc0 %GTQtS3_@
+TBay" ƛw3Keko3L >V!R`=D-=mF޶t
+4W6?zz}CM#cx02c+c#IdDP * ْ@Z XTZ|31L bP|O~:/[uLjXHw)ӼvbĿp@tՄe[=2qR洯n_LRP.ZB`XEy,w&Se! 24C' KOԘ_5m =v9үTTf 'z3gsݹȷf,!+4QPc&7 _ba#8eKn@.hCvq;qD(-*^+BlB>we |Ah җUΛ#`y \BxqW#V:bmHm3˲5R0eMQ񔃃,5RʋRWqims!71JP>Y|D?rp٤ QH Ah(39-!#l>= 4QB}nL,؂G]sno vwG7dP>DXfcqb2[|rчZPS vϲlls}S"#-ҕ>@ LnSWĔ$br
+O(hT MO2CRHG/,0,ͷ쩵0 "I â!YQ,
+"2O(T$Gme]AU~d( '˛DB>zY]E)DW1 9U| / -u\3
+;p.xy!)Oͣ(E(ΰ@[S4É;CÈ5y~is(k|,iC53T
+}.O@eA`hmoJUy#ʚfZĄhO^LauAz4&㞡Pڛ,y+Yn4 $PtUTt,0
+943PvS7/IքS߄OS+i+!e MTY}ѝ鴀LStޓ܆om$rJ=?>ɰoFJ: -8A6G RT'7_B@"?@U Pv
+ r|NMqT!W^dE fNqSCʷL<ΖiB~JMmvF+0X:dDOPw̻x{@tׅp 3% 7eݐ6ojX1Q(4IVW{2bq&TDa# *#b@kAaeÂ@ f93PR+\ψ.b4@D[_gQP#iap acjLʼnBAdS\s]$E
+ {8Ry]9L!oH*;Z(TH&xR-PWlm}WynΐY.DRjBh}<f%B]NuX1A,mhyC<}n`hun8 C')AxՂ0&!!Ԑc7eNȾGl'N} ikI2!f\pb_}QS4$Gwf5n裀h%7VuPfҾ] k)aE&KZ$ jp
+ *@./)<+~̓WEDU'[K',MX|{Cȼҍ'M ϿFJ4's3tA(~e V%P,^B CUMt!Շ=45xGVGo0rRYՏ5,B+AEY4i9{BL );@(]g<D PTI@] ԃrDRǥR.7mvU!&9UsT'2fs1;z4I3{h)ͻ-
+ɂռQ (lr>E6%zAoT07*'cGV$pLo8Brle
+.-7flT 18#q/U$g4MgsN:*nsQkvoӏCz|nJE+78oJ]X:`H@I/G-(8TT}cpF%zH4{qHUZX9 Ҡ!8d=yr̊@0!"wRG.
+
+_a?;TBÈ(P /gŴi6NGFgQ;MG4Dup 7ٔ2sA)&{[/gsg& 5c<gvb:[]V~>-R,^ab0?XSz t j{
+k>ճAN f,iV*L<@4/1`epa SdQA& Ka$EJR:Gvݹ<By)Ձ \ϓu9OX|e j̐g2ŵ AdoDcm\P6αRn!wh8sQK3q/"!G$H#4;hf"-Kb}2md7|C
+yvDbc;RAE>I7_?4˙W><@s*fL28AaɌX%P>\9ڌ
+:RW!Tۇ*Ѩɠ$ĦA%3Խ 2{'1TIWfS i&q
+ᆲlm"(v!fogTC;g()U~+aer*]uسfpm- {TI If:Tː5^I(lX5a,YzZ.Bq A_>nR~ULPSs!wj Ew)uHQEFW*
+\φռ?t/0x u0)§xIngbэDd{>'G"Vѻ{
+Jy̧AܐٖV-N$SO 4[.<Psa7|[h`$Y 6^ Bә>:CN(/4-SL?qk8
+)0ƜM8w.$RSa[aļ+?6%?H~\R
+ P qӀ&mݽ]E
+
+ =Bk.;!BPFpJK݁Lq3=]#rOtw(/势{pD=υ%fwD^
+&[ h!v5I>u &sk8sdGmj2`*[+|9 ;@hx_6(U Qn%BE*U7r T Υ hv\lBފ:1e^H)NDZG1NRHA ?|v96ZSByHS I mdkf&>ѵdЊx@7mw32qG Sd%UM&!pmy=E%[J:
+FtlW.5];S'>ONz&62UVjH<jWZ cqŝҍȯɜ Qׅrrqܴ]6d!AOM]ɠw:,F)\~`{=".O KEKz^'p}f y|()h%2jdzp T* aw;$NLZng)kC/0sw- (K[$@AEZaIFM|_T<X_OD#bfw8 sƊ?P<D8թI/e:b<jfꏕl_K٨ȣմaq (0X7TU$֩lYI/9>=T:KP(N[BK@&W܋
+71=aqWWr{BڸP(O3wir@+WtA ĥRURe'$q^IRҢ򘄦s&Ra`}@y@n]LdH^ 㺄'yG$B#nq[r%y )nOn'ɫy5NXz(OIqQTLD憃TPZk
+gfܽGyy.Ȇ^(L@G 'sBz15 a_~sQ>yeElULOw]PRRb.K9(OŖ<=um~sQ!BHxO^jw0 ETpЛiϊ' 2I솁 :ot_dUQ @"˥8Q" h̠l&~i c"^|"pVՑl"Fi Ɣ@<_.B[iFdnچO0]qqB1ho)-p
+6iwe!![&YƘ/+|iVa(p
+.K<%;5w֗k/l8%,ZLd͂8FŔhYyVĢW3aχpAbx3$)'mo)ϋWM—N>ehFHǦp-4k
+<R fAM8n/[s0^ 5fYLp/qR(F4Y';dD]XJXfXU@q#FNN@}M8jeQoKDPȔ FwJ>FMy#  Y%e heQQ6Xnd7כm_NVI K~iL?:y9f0Q>.=\yh'ᤡ"f_M]Sѫ5WcLR\l%flŗ[ΊR{Ө7+|%`ui1
+vA5vMH"贝~ر <AI&ofD"Ԡόa3갊ie,8`/5yhE Z|լC
+$/Wί,ݪ˹<1=-z_ư
+ltm.
+@LfSϘ@ŝba<w# 7P$*nֳXQ``?d9E8w# N\`1^@Lh$!KV}s6GxAE:
+p=m5"]QC1,ƤEה
+"SaE|. "m[ĕ6 htJ \Qu< =!tyLN>AeqC?^ӞC 5F0
+ޑoalfvXsF-0L!ts6 cInsʥظ1}JLs=1\Ab:,|%<@-|/7_#
+Vk#gVM.FR.!FJpD ▻EUO&5`!D{ŢyAlEf'( oY4[dSI LFu'~]FWon_ۤ>^ؙ.`_)wK9-,KTR{Ibc:BCr>%8F=Qd'Q`cM~_P#a6|^'`l'ׅE/\`Säٗ2I~grl)~Cs&r,/TR`KbA
+/VaCtkP{ A̾%L)'KqYlLKd{ƿFj=6y֚t\~&J
+%K
+[3i!.rizW~"'Nޟs[98I`뛞5 8iI&PCF!a<E!U" <ڎ_$#'taͭu_dfj6`t+`i+|ԏ"ᵤu@8ulͮuIc)6@E~yO]$Ob Xbvs))p)ʊ!LlJ-jO*={[NY!\ $Q]?T%Ҭ]97\YoC(4/3RV$ |*AZϑ9B$kD1VUolߣl9VsdCK-vC+8`ոZ5OEQU+\O FH4fle
+B_2-QAHi\nn_DW1׼25y
+:%wü0XK!cKkh$ cFej̦tb=drGlQek) yYM EsJWDbK4k3HV݈ VģdIJŌ60!g~tw7/-_@M!mwz@:UYKf4jzRE*J9M "
+ĸE!
+4JB"juԡL|3[(613[h);. q10@!AC]HQ|$P
+H!`txȧ[(1oH)> >2}ԇya!8:|dE璅KU(%NeQ?k
+?/ZYuv鸧.wISF[śl
+JY|nXDL8^}wEIcFB WmX+s܋[d2,ݦ{:BWa lȞ1J-ip2\A7)?[a<-oI48O xmcVbVᱨ1(/irJ&)k [
+h&x\Z,!5+btW8 Pr5OE׀Wf2&Qe!D
+Qq ȉtOTi[pð3 w=3Ģ6[C
+">f;.!J {0
+Pёl>+t;96^e3<^<
+u¯dRkOqtٿAp\wc:ΑxrL6hvr9`ftPG--7!ߩ"]kW BS>ahAaDQRbqPf0 +v6AvCcCT ҕ9mįJ_ l<S0#\kƣ]*NCec[wķFMwMc)PA:=
+ $Z`㪷
+A/~e4u
+{cC,PhkvBe|ܗ&[-4K;3C}?+qB'µͿ8~u~7<UD
+V= /B)9a`iQsidH:t)zTez rdnIP#AP »2[[b|࣑Q$<JĠ!Õ
+<9Y|g;J`N
+| 1~dtvJ[.ŁZHrGgG Ӕ7 LnX9ES`S|۰\`5 cq6s0wkն"+\~O_k$K1Ql֮Ub'1n7P/|á
+qFH,J@(Ң
+R5L8kXcn27Ur,#@RMV
+>HiZ|q$E88XpÂȅtw$t0!Q A|-bgQg1,cHMvu9(<ED9g778=ːQ>$@qX|pF#*)&Y do6A_z9R
+W7Xy|]Bik%K)bO onO_g f`Via(3Hu!|Ri)h+䙖/0a*b2ճI xV,%B.K_853x'><&<Ǹ-%Z.cgeLNEC$E S q9 0> g[^Γ L6URHDEB~Ya$}9i(cu;MmN?h(ˊR.gV0$y|,eK8c2X5U4v:?Ɗ t
+Sʡ2i*$AQ
+obFwAºyb''y"h![J_1B8ܽ}E5$XbmUКv3d*/ yľwb}j7D_`2f1lʪ}JBK9<0KN;wYۄ)*Oa[aW4T0f"!m1vJ urj"3x
+dGE3iܫ aQ`vȊL*"e;ߍpV!_>(+A~1"lR$rQ>s011e
+Qx1d$ҰцN
+=F=3Cr& B f\sZ,./ǼnǦشd&!emoTiE詺S&RR2u9[1SBtl7;``zydQxaVPAևЯ%%s'UDiؙV`6_7EK Ge.;TwJ}ck۠G fvۼ1@E|UCc4uMP \Ok00X%P*2)A
+HA[7 DO0w
+V'Ei@-O_gÀ̹/N>z1r]%pSآ~;17K0a@LA/-o tYB>^E%}LR= |laYL4[W/NF(P;0+WR-DՁ0kڄ%|x)9UkYeG$0-H2I;ƁF C[] KA?vS({\jRdgn'녂 ZMrm3>[+c\x(Hw|X2=?\ @ν-22 ,pp6~B7b1aHyXyeN+C l}7&3!4)~1&D5Hu,"fb8N_ݏ)nvNGE I?RW8QR;_ҿ`Uڈ$ߍ}Sr
+Y",o. t:rxs'uSrN6Տ{/Ya3tdzWЋ=FK3U:?ynSH~ ?>/ް5FmN!PBk=s_7gSn sr yTnZo'tfq=<D.6 ady5d0,y9~| ZSQx6HEcС`g.81hkO Pp6c_Q#Z+1d
+a@; Y /A: ʄʁM+δ5dAZŽUJṋ' \De2Xh1uKݠp{lf6Cw8XiZg{L@XZZ, 3Z
+V z1](VwA0)8T2옳>]lB/4f|C;,aImEqJPCrc8ƱяA䉈Vq S%>\G|vk?tJ2o mjy D!i#ae$RVOABhYGۘk
+eE&,_Tj/ $MޗaA Kմ;O%C3=J\.vrkiН#l:]ij
+T` t&VJ`Luh[ :F;l88i8Ao"R@Zx{:q# x(9Vsa'c(o, Ѱ8?'9q-?hѢVF{}b'?1?Hvy c QoJ<lDK7*]KTI0
+moq
+Weas(&QO:'݊Z? S6E b
+?i&m=|K^~ѣ5~kN z[tJ9BV x|ze2:_abh/qoE߹/RE+e+3!
+6) mUv8ZW4:,6oskO{,0@|n*K&"Z`xSR{
+<d$( WGZ@OIajĞMeI!6*^\EPrHa4^0+Rb-^D./PӀ[$#He/!!Ni 5dkC
+1,j\V)1
+FyX]Dl9BD掸~Ǘ~/AN ! 6vfmT"4Pj!
+ghv h V2`<G^OY$&<<Vz
+`<k)~|~йvGZ~/*
+f OoqxCDI@ғO`,%MghkD ?jau3Ws;$ -S9,U
+ދ8.dX
+6HvMHաvQny
+ZX<
+; 9N1X
+%"},1uh5`e&qaA\~R3tCA/^/҉ h* ,]l@m5,^[CՀJr+X
+W.v-֡R1D%| kdN t%-Ǵ]ȻR:(QA?Wlw,/= ԮQ- ^UĚvhS8G&uNY?cQ`q1uzkExED)7g)>qBS>" J|+PL&;֤eM/zTo͉/A`"r |ſ} {'O H9gdrUM< ߂& aB]z(.d2 3"iUcw{w^ VD#ZRq 5U?B*mlάAj(kC@v6zc8Ù_;>\
+Y,%w"BR;ӂB^O 53g3 B]pzrG؁
+2nc*r y$
+=x 'Y]$2
+#<GJ
+Jҵŏ:OJZ
+u2&{Is#ħFx @|+GW\ J#kHo[I !#U:DG
+@
+L.vS[ (=SFD-E/?A\BmM )JҨmm6Q=ZP
+EZgpk_d-jy0 cUb,gk,oAY8%8V}A*ȣ ]VAJK:Fn͌@zjIJrʐa^<=6Z7&F}WXW9잘Sa5&Hī*j:"a 46JDӈ<;>DAcY63VTOgiiR`4lBCqtx'ߐM;ī8+BAk  UL#@FxfU$YBeF
+D<@Q<`հO28\LpЇAFa73cm~qڐ&%<{ȭ08o L$Zrgb4cl; AwLMˇy _A5OZ26i\vR:hʹ\(uj_=Րa>DŰ*A%<g9ʌڳnP#[s=3H33ic$
+?!kLaB _vڱp'lw t@ "{ṡ%>bucAAYtD!b|
+ah%wZThKwȢ(/Fa ĎrIK׏PQH%
+n,T~6q'Oex
+"MklؙT܆kgN_,4\] yHƼ^9CF
+vLj qu uiҀ
+fSA &hq-r$AOʔjHEcJ
+o jY[bPEYs8B1Z]j- Tģ)-R\^3\zlݧI(-ާwm^dn;)NNC~\c$PEN}q:]܌f(<\Sݖcc)vNl$&
+OvGZ6[
+ч|<'^0+ E6M͵vG?#k|i".8PZ>R4)ᝠz%Q6C"m*[ڻiIP9\bt9 $#,%1"A/Iu=2F^Y}J!HB^4T'rɑ+ǡ
+z^/%=]xZiK%@ЕŐ#FC5F
+ܭ*x2WSJL>sTjR{6X.eQ&X_|Dw+U@f]St &%ęN`|HQ͎'< Ze{ ҽS/% Ǣ5ΑAnGe ᵂ:0+]Bf?'k1-9QíA=~̈́YB6*r
+~ 2xt"z>m| ?;C1zR V.DQ
+&S;_iĊ٘/,YZBpsi]@nP i pڇBK] 'x #sPn<߄NZ>}:+`({ 2(^We2Z f Fĭ*'ȧ
+uK-_._!ߵUi鷢INvDkJi܊p0Hf49JU*81
+.,y͝asauL@`b X J0> $-z/VIcau{dӬWU 肎
+RT
+q1~%X. ttVG^za6$%h#pDSR窷? 2<5/69SCt,cQe .RHFwb;
+*CQg y=G9
+
+֟$En|,俟 Q8\IBrv*!t ɇ<gJ<bWj@,\;ht <W!L>3ض*Xe
+g;E4}#"kb[O%x!L'z-84HEXg"q-Qic<ANcs*Oә^̊Ax$y@N<u oK߾/ABڎe5ğ945B^Af 8aR s O#$*VLUx9Y&
+-48XfC
+KXOx8txQg ́<H{\
+ρΠڥ
+<FNJ@ N'Z!%dŷuT0W2,vt,.~~i
+ndqCg}J`ƦS>6<c7 Gn1l(0KAMnxemV' ӌ'>EIe"4U@$Þ2%[fKgGn| R$%7azorҒbYQ$ncc Z栣b]f؅]rqU?P뮐9~
+`>FZVy,زK*% U˅I|Jpj/!#c@_҂5#72CԪoX告<~ 
+;^BZ7aH@^Ӆ(
++ug޿ Ỵ@aܼ`8G7WdadTB-#ܗwa'Esa<ɥm(:%vPR凅^\Se a|TY9~|iH=\e*NO;bזh0|iY [sPO5LB~9h
+Gy62X1j>O.NR/Jp(
+ak|zECPyZ8CxɘWt`ЎeVMb%. j7l.Wݯ)Wt h ,1?
+~,}`W
+!QPdUWA|ڬ.B܎UH8
+4Ѡ
+jd)IH {VYSC*V:rW^4R3ǣsq4˫~635]Z*
+wKh&āQ"Gds4i>7GPQfôߑ톥MI@*\6BD[ 8JJY[
+T+1mH=B's~ɣJo$ma]uّ%YR<#K'qqHnM:l
+7$!fu]CrHX
+H?3=?bb=ŋL)A{a1hDc*a>2MVidӕe;4-z`sݾ?bՙU*_r-Vs;?4Y隕 5vvzYtk+l'榆 -ӳ8$mv5'7á lQϣ3W`Z,B1d概JY<)R.Oʐ{gup+è+:`{W:>*mho |="~Wתcs/l2~r@B"ͷ.Of-yqL%(v '&_ZW._6q2vCp
+
+9e! M49W *Z!Ev壛-HY"h&V =t[G$\[5us,>_GO ;G~ƀسȬu7 P
+,b]B \`K#u#
+RMFaY%)ߺp:\Ñg68*nGPs{q: g[E&M8_1 k]e. n1fcQ\<P yzЁ̊ÞP^ޟjxZ6"XmJ\LI㎆`f&6OݢP0heftQOGTs{x !9z>FlZCm!&'h;+aݨH%OG+]¾`a=|~,BߧДDueW"y\FL΂͍L/!DC
+b皛9.̈́1ֽt%ʌ=KVN
+*MIi~կQѓO̓57)(j*E<0@CHy癎byhjVŸ.bMy\6s1-&)o|5=P T3P$AR~;\2-Gc7% ^wxG٪8A_!OeFIr|w刬,$jwY•iɳH>hew,wT㜕/f{Rw`7PDڀ!rP}TsVb-q*-P, O`7SDKd4Tv+ɑs 4ݺ^B774!vH""--*PQvl}`Ê
+&eS5iM x/M `&$q Dɲˡ@1󴫻SPVlwP 1(wH}[ _iJK R?* Q r~wjB䞕q1zizpHch?z힬%mE oQUI t
+|`aU!PJn3z<qE&6})oXp=m)*!)HOG"pQi!N\Jy4 PFҳ")<QRMYVEpW\41Х@qHָw&(9K%.o L^Xu
+HcTw<VJ)
+QËYsf6s`[(TyQ6[ J)މu a3<'_VJ5M5DXz~(ڮ2J*\#6GBf.'ۮex?k2w|Tr0~ޛ_)7AW*>Nbco`ˠ1D_dX*02O=5ѾJzE$ ;B پȫϢG>ojb08XL@?߰G @R0J%tKqδUޑ!&S-¤ʄKS${=D@2:J
+EGM!*sc2
+=[/M]㥍dBマe6*nq߭pY rsˢFWJ$=ji$ٕ솑@&5[njn%cVbʤG;<9TT Eh)d*9=_ͣ{p@&!?Ė36~#חk~)p0n\8Nb_d!>*ɍKƙN2cy3J) <M[ vMK8ϙ0m'"`
+"F+<NK4[%FIJQTMi7#yJ},>x IC  # w᤾'O#
+UdH,' S M3[/\<BCBӳW5tĎսȐVZr'w}P
+
+ٳ;d o #`
+ χMTN=D 1F<a3Ay|kqGLGF<MJ36B#UG|&pgDgNŷdبm_
+X
+:_5CRU_jĻg'f*f(|:sBۯQXFF]"DUt&p(`=8ώU7V~^_|c+!pv j捛TI-z7
+6{P_Ѱ
+\o# q9*2NE5<(ŲCRs=QK Iz>1~9D]0XEX
+H Kх+ jΣi> "/C9(gbrZL;=4JS>59IJC&Bx&*|m-Z1.+Jcv>E  92 J<s UEM<QC So 8#N0*Էybf) 
+>͏ A%QaWT6 q YqsFm
+$fzTgѥbC3r"Y& V/T6W^L{PO 6@NR1bC.jxM|E0AnBkkQop0>Knc/=rYeXY;D2Ԉ͑E:_Vf@ݺ )AIUYK1JJ0
+J
+=o6O=56];G{oGjq< gcɣlޯ<D#F{ag)lct'E e?ءcf6"b,5،-{L&M*ЎOɒ+*+Z[IPe
+=Vu)QTTlO(ġTEP Ej")B?Ï ,;J}
+!w?eKCbL[2 eJˢT~oWȢ}$\*7»b*$4(ލHKIS+ҡl@aW;IoE)j3NE5)!UGw3d||J͍: +H[BϹR6_7lY ADr8t޹!%U?$`7ąmy߅[eE eN8$;Yw.!}&c
+{˾@A UE2zbtj<(92  ~LZF&wFRW]V=W]4r10<k˞~o-5.aNLb |DaHpO zi☘뛤r(gG11dzފ` 3 H3qsYB於N)IݠTk
+zXK(HYZ_$-t,~ |ϣRE74LPjSWRkRʺD5ۻg
+1ڪ1<J<lL~w77arm7#C ^71Z%@<*گ?7Uv@"Λ%15vTi{1nVeTKStJbj+=`=j
+"B;7^j"DkiU
+4ikaKi;rNeejjibCw D Z(!2 JÞXZ\bQ-_fAbMvN4P!9QNsDví=05bA"G45e=<( Bq 2sjLJiq2^,߿IwȓzDOfc&A_^io!JARx fсvC TGʊClIa@\^α"cI|(
+HK7O;$ךnYIbeUe+3acSuZtS?i.f!Y!j7o&]?=Zﺐ3h޼MGt j)ǂ.c#D1b,In'aL|_>yNs[9Ml֝׈F si3e?~MS 9#?'56zl!F9d?QGnnj-g1+t sg?u&iD~#BƹT¬:y-U"]SªsA
+TN>tC^$vL+A?\PuVܜ0
+QɠdC=漞C[P*eƁ '@KIqR2/<nb^QJvz4as:0Y
+e Om(N9 DlҴzđhn%KaA=(NrC&u2O=6Fyd]2iVSK$#rx1Z4+M(83b|,mx78I ih%429AYbS/_Ov@I]7 cC0."
+n8"7$Mxh*6a{p
+_79ᡴF~I᪾X9备1BM
+"e3+8[!,IOdA쑺R h8#vuDWf͐D5sN`hH`8" Dל4cNMȲЏ7 ?7X&$g/ 2˻Zi-GB G\j[1D2myQ9,K)\/VRV(ZVEe\<n ubࠫ,W(uFnBF||5AXtNv\k_,#Y9qLk+yi;Vv5姅aY.XU7 %B']@XS(e;p_ 4ś׎Fi)}θ}Z"]- jdʙ?zq~Vܕt6мc`#V˴w(&Ǚq vY~@f3!(x@k]g-0
+621#߿@ %t 樭iZx/|HbgKn"/vwc$V 0iBNy=F>2Uwr"yX+Y۽UgdWA+5T}s0!g<]!t<&9fÏUARӌk|rTsST]ynՠBӲXX]{?ةmio؎C1{N2όv
+<|.g.>uVߚw `F\^ -jk%l ,:4+DZJgI k*o̫hA^ț: i=l1
+kȡf\ '3G+y !cUݥDqQ]e)~IFMkQMȌنJxFr@N / &T°J202PR]PC9 15"%wRS|SL [9u ;=<U?8%b.4H7<@f29Y~ FՕ3S$lg[["CHcZPM pkQC؄-FqЬgiUSsNA
+BVP G0$-Z|
+rWey)s(3sILGc>=, iYZ9,pQ'h+&;ǐE_ KQD#z䄪HqW6`QյN {<i'W=iN4 8Tʺϕ$l:ㆿ&1K"f!kà qbI(BMYհo8VRhn-$L4Yu{y]Wla S*٣h҄jsG5~(@⯠jdv
+:dњDWpPk8Gp-su
+gK̊b;ܧy8<cg9ˉ"XQm'v
+LEMd$?b3
+L0P]udwN0\#>3MZɟʍYE"{?M+ĕۢHHQ" ӢU',sޜo'CyiC#Q&9AB#i\lM v'˧+' QB)/!ÝӼQg&˜氇4(%k.
+ݕ 3f`
+@^T3ӊtUMDk+=8 -jYLptJ{{@9gFi5*-4h-ɕJ-j5 e'&Z*
+f{8 pSL V uozdt,c'B\Q VOtMqEv+k}1K'<C4 .| rH1u;GfP~͓G=YM40
+8S I3=3
+fD5v".Dy s!M:
+eT+Wݨ+&sVX:ynpdC1J9(S3ۧ-IL{a89x2u;99'guX <|wHG!Ecj.Tѯ" 6+"c Q\4_Zb!ܶJdŦzchܡyGh\CAɶ):;=`OWFr"5& ޣd$Qq҄YuY=fb_Z~M _`Ix3&ȹE&l1jQBe9]%HG)03905Y" o4Ņξ GVO
+_GODcGr8%#Ӈ|~4[X`.#|>cesu8%#+AtVffi7hk;ĚysZ7x,,RUƬ4,"{`$^¬(KMkxiU|b.ԡ8A ql%אEK1;.b;h/i((< ^(%9@;AGd[ʓިvWaXO 9 wzt5/ Drve)4-L{ n{ˮ``^0
+E%+]4)B!@>ҹac =ՒT0I#6{
+Hm+\Q+X!oX^L*tzK"~}%< c(YYy
+jx1R9DHXJjPEˀ-*XÊ`Mh5=ĐÁ>WM)M}
+c`Ӄ
+<н4
+^-"=8+|;`_}=/joG2</lflvAcVY
+`?b$Vg-lmpj1ɔ<oTCRwa!1̓7`fI<OF<a.D¯h
+lW<p*,;& fw?8
+ w
+|E
+"|+X> Ls!s+Rl;~żjqü9T+JA`,8O+"|A_.n$.5,%JG>+Aix"\+(a^C/1pIe.6]r h?^4v)?GjEnC9)FSEyj]F\6 ]vFvёgF08g3ʦQ9
+$h#%(P;[bu.Px9f YG]Y \Mp#:+&$G:`NFh)Y$GY_:z$ASQ6 
+lbNqOSG6eV2sPL'QU<lZ'8By&LxDJy3WEB_kektN}ESVASBaRCμ2j̉)?;KmefWTt'$E| rR6y9#5T`̏,6O^Fż"Hb\|mca7) Ra%P7g-H.ڲ%Ƭ +*
+ڃM7 ۟=O[$+kHV+tڂa#(`K
+rU,[<H-h͙}a)s0IDE}&|;6.WvE*k+JH돀|?[ɑC4ϰF\2RCUFw+Ma1I$֟^,㝉ArAݨt#jtҍ$l<H [ QhPf }X4/*S؀,(6~9sYt֣W kon̵_^nmh"*Qh\V1-
+֬PՌ P4B,!i)t̓\.SǫqCy
+Ek)bdF7u+(iA9U?ZG4WǯK3J)d9#*X(ڟ=",>\4]Ģ8Wt6UbOe s{1]LG'6PǿGžraE@n
+Ʃc'.u=>h)V܃Tb=s؜JI(Z#$Z˙f5̓&1* )yK}EIƎ\ϧj$5;额*h_(>OD^4
+UrWpc'xVےVA yUޛ̳݊V!J,y4T֠2TL y>!"KرXGiκj_u ܡ%Q'f>?Bl*H@3zR<E`kb~z%TjXךv31q1'~ZV>4'X.+4%zV_R6MBz2r&fC/x~
+8l++ZIG`iYʷ5.6$e{gZ3Uu?l`0lKtN%`A 9+/R
+ A,^N!D^i0G!zn&tz'N P1 1%L%UO_̭3/Y!4UF <&_iUbT)REPuIF9#@P÷ .) :89̻l9\15/* lFTH"i^]K΃
+ ÆHGXQ2#_ϣn
+'Q3*Zl] Dyk^W Ⱦn\5*24T$Xs'[8fYMKS>U!:7i7P B464iJfEldsg0:L,!&pE?AMεM]E@t(4IPs|$K<<d@'-}/ x6( 
+Rk8ϗ@HR{s4
+qEt),4ڊ@e $\@#'%%9ESR/qG.e݃!e.,}"iJ`D`ht$v]DڈmZZÖs9G`` Jj{x6 B]&uei^@J]j'mq-{Wly?հ;h,)) VRDԁHs ȇ,XO./;1H3>åU+)J̣"?"NO
+ue0n 5H LQP)L1~
+4w朼i2ce ٕ$(OOD^@g2E?
+ޭt(2I<v+R _(&<ß{>žO:fzCD"
+Cd-6+ĈvJXRIhV
+&pEM[P5'}Nr)._t+o0˗LŸ9Ϛ{B`K_ҥv9NZ)YЮtk@GRdytI8ɩ9(]j$|tI,I%tYte#-JRh Nf].mYt!|-]Ru=VK@i(+teXpYu-
+R-[j
+
+lI%QFqb:vxζby([Rf 8dĠZGtkWy͖XjwaJRd6'%gj^*H_[bHd)vbȣ'KF~}5Y
+NXra yRL1ja4g$Ċ(X&8KbRR%GF2,G˰5[[Wk2ʖү1"t<˖z:4}FR=y#W iТ-%MZ;NP%ba- ,~AL
+aJYӰXsERϖXKhÀ=
+MU0\
+U,SfTrs430|åAʲ uFQgR&mtF2(yK]y^qT4i>
+ﻼ$K_YQdh8k3JJp(|FK̸ i
+#)wC|-]咩-[w }M
+Ϗx䈑Q^^-/}d
+Hh@*b1ǿN򺚲"9vBzD.KK!BIJ!o:B@.|ٝ ^]UYʀVAT46^mX.%@ЦFSrd/wZŗ!d8x2|Vqݝ0 <ꆐ/]_zP>Ƨk</ӑiSm/Ob˺bP_Wa
+ѭ7%)@˳;@9Ļ TK)lV6u DOOJg,Hgli~lGrSƅo#ʛaAR?
+԰HɌ_+ GII[ hؕ7JcC3Iu2/wrvuM*MY\`,D-r;ͅ&JkWIG Ld$rzV0*Y&/rrZf#ޖ/ŹQڜcPTQQS_Q !krwVo8c搉I>_@0} 1 qM? C7kilɎCx)EXܙ|9%qlu"/Z<D
+v!~N|iP,eZ> ]XXJEeem\ZSjqRE<{
+1Ʒ ,|F^SBn#v mA,o`X̋M-U::,OUV#X}KIQ=V6 _[uu۵l+Ӯ7y8 z{8&$Omx?l
+B֗M2!$}g hv5
+>AKu}$Iش1Q<5BUR߈+#Sa]gPfrcVT^*!R1qB;lO̥:G"^`%X%#%#S5"p-{΂1
+|\fr)B(/-xeM F2$H #K\jU.ވjJTRv9Z Pq>OCj? MR dZ´5ITm2k`MXD>#o 3({!^0Hɚ瘱4Vˀ 2*۲ê&̹x2^HvH]@[FS1iTW >ɐؼsm i$^1/ֆ40_|Xhyl>iрi&e1D( V I/O خsImPc ʽOKPjCOPZeO#t< Nihw^OL(4pSY4협־ѹYZOqXVoo020 ̙e)ao Ͷފs̤>Q</gF ;V]M'<_E?4y?d`0)h[E%T{ViM]t~,EQDvivuwgzjЏ  O5ܔ ?">׷hl+kY)[¾}uʒ ӛ4⫮*H+@Nxn'ծx*bP
+(b.z| /cJ' ~֡(
+aPJ-avQ,؆a0wu%E\ݠ́hqY^'UY@V˾@E~ގ}|%JʞkxNvp9f:u۔5JaL"~\'+t55sF:Zrs>)8G
+yǸt0%_06q-Z
+P#ȧ_׌_Y ODOE_7&wb_/:Z9f4$B!Bjli8Dt8n'yC 6"usA$|bjb@1'A~StPbV6]P1w|Y|>ח2?V]N2.FJy.})>a>{Ԯ"_
+0_Df0_5Hᷝ?CW]dVm[-͌!R# :bi 5隕¤zMczQvh>e0,f^в",/YaSIGaQtfMt]tؿ:;$LZ~[itCZww>E@FzY% vV^prsYDA"6^BH
+cFv?՘{4\If`纄,y
+T&xKHy#Juѻ><(ϒG:>4A3ُDA=qCDrV~_&:rtB< ?`$jܝmd
+ܶh;ߖgߠ57f"誌Nfk.ϡj.B*̑:Ğ6kyvz!OqPxK—qܰb<30w
+pVY[mʇ.]O'ڋWi_:0EkDmo-BBMֆdC N|ѠNH$IuDź6ݽ%sD:eR$ MIq'IU-aH yiA8**%*5eճ0S ~X^ s-H2J —108˚l 8KC^JE"|UĄ2Ѱ]P
+DM9G!|z )Ec
+
+
+oj,$C1N;DUW[ e
+,MyͲʩD3X :Ga2%qBh,(xJ2]91 7M;chZ bڊWem:UY
+E6޲ื@Zd6%!'O%:{^}#` G*L`a/m'QAJހgldhuž{Ma,}*AMC1s>QY>s lR> #A2Ku? WqbHbDZέ%րs: [t^ɥKvbxZ; Sڃ vmH#wnugO}%61J~aԿWq4%eF=<ݨgڇՇ9 @Z܏{'HjiHU1(CVR!P
+(uosCf̉4!
+#Gz0%mAw"cs`"&5!&^b넆rrZZ[MmAh%wxG%*6 ?e Skďm7%BF@h@j
+~[+7D/@J[3nc: E TԌW$A|z@MYBeYL3#u~Nvm[%ӁPHyY)i cwZ[nf-,TXL@RF @=產ZI,KejIΛ؛`UEZgš0ywqbG!ivCB ^g*sMmt 1pUCӥchm0?G/tt6XX2=hAO3狽tNa+ .j4C,XU+<[Ϟ1q ]6M܆VOšm@n z?y%0;@Kާm:z_sz=y9B3>@
+5|5^zFndx0A wwˁUsOev?1DaT嗁3k ȾR_#GqeƱL$a{9A*&Fqﲐ@89 BxJ:d~ل1f^wA5kV\D fTf+u]&vt*IJaL>Ҭ!A¡{A,- F_ Q+<u24? I፸0✖/s8@u SI27;a}X CՠefUK/ m'?/-Oқ WFpCV!o ;;qB(m #D9L+
+` @S! /Š78["1 VIѱx%"z! 9XzRtW\
+%tas(g j}bozMAIWb
+aQY9/SeL,a+wdnt_HFYOCǢ $ٝlTnYُInΫp *Q+/8]<@a$h}FV;d. ]PWi0U!.l}F1 R5 B <>F.V<Yސ7b+g6Τs9S@0 |vh"șyxEe=m[I]YW !RyzHqO3AWB UK RPY.EDvmMQohH$<lp "ɦh0n 8?,E
+͒SEvSnvZԾgNUtJU:S4]"m[3s_Zzv'(\`{@r
+<f5TOB{0e]WO<l4=~fXy6o%>ڧCE
+7=0;TQ?@'N(drJ,fI
+%@mjV*2^: [=j[h~)1F[l*"Z>z?9@EpQŸnV۲Wo9"naPg--PgzJ*~] =cs-O{NiWtUC%&XcOP@4)g5oQ=\?/{sl2k9yAW'y,ĪI7#MI/%>? B =B1A)a86"қPҟaceHx@JQFC3<~aTn
+5jԜs ~Ibq 5V_ZunCD(w;ҍsO3sa˼Ϗb `w3 v[rڟo9tr3g:d}P 먓+%=:劏ע6mT"oqQ5̵@_fx;f YArCN:lK.1i=Ѻ=&45FM ,]^JU0yZzNZˆ~LYOG(d뫜Rnؙ_(l؄䃮xQ|I2~IߔX0GPP ٭Zz>ꗢh*p{O?zTyFE|4-#&et~N
+Hn]Iw7H nrB<!"1|{s0$S]?V*ŠuѢXjlދKfq_^iM5F_VZkR*žQK\%1Eu_w4n$M[ 1e|'FY2>'-%85\sݣy_JM!bx,T$)ѥsMQU|}wƹoH[o|Pr%H.m[e5cUyESh,>d9YO}()_>.\jn\f;V!"R[VOcihy,UpH{ɱN"$LC陕]MJ}.G_V5T^-pj-:Cp*sVya0vh ]U^
+FӤ_OL{|j;{mL[8etB /.Pxj;/@ u",/5dJQ,AТU )>
+@le([.yܠ$ #P@֚MbԚ+^v}TG4dl>V:6EH n%ش,$'ɬ8D4|ڙ
+#s{3ZlI(, ݠ<ܬM#k6
+BmDI+<͗9vJ6ѩcHpqm55_I`ɦ:GNd34 @~|#M|ͬtoM nۤ`
+b.>D!?.Lv]ᄐbI
+ im.C=mmI& pM[ɶIMp(g@=%Z1& נ̢Y`0b9}{}Ӟ)fHU8o(^n=~'`n/xaysyQO׏/Wy1؞~˦!ˣyQ3zV|w>hE2^&WL!?Y-E]o>-{ }x^D=*  $Q739>kwij Q& 8$C6UP@Y nJ,X\>廈bn/3
+sN2IVyc9m%ze"G(~`
+ "[4LQ Rs`jsVc^Îja!H5;
+ƢPi,G:F>[5<v&ݮ똗2YG3Bˤ2&Ѹ`i [ePj`Y`M9!?c&Gʒ44oPΜuVv/rhow:2L/ˉ%ãHie ci{~ afWkވU2YrZQ%΋2>m/1b#zR%#q/u}՜ecZ83fS
+[뉦@r(Tpm<E~}ؾ
+Zu<'SĂQuD0)\ɵ'" zĔݔ]D&æhqa6=rT'D`}rbe^_Gn
+VeN4eLkҫM+OAh.Kjw2NB1Q1
+ .ϲ Uoť@͜W8 U鳶#h5cATR?s?;'TL`OlF"pJÒ9^9L7<~-֡JHYdn|7˭I
+ax9)V1SN
+=A1%¢sǿ840 7Q"ȣ2]*T9Qs%#ހ -y`0wZ<pY (s栂h"LC"AXw(96h#rM7Dy_!7
+!^ 'ͦ| .+I#QK%)ﬨJ h$yV5
+*Clt(qF"8pe%
+yTp>=I-Nv66z҃ry0UBhUAIļY{DMpǛ=)oZCl$Q(
+_rɷ3!,
+U.2wf>В::D{OH| iQivNۋn7 lKڟL!owm>q-Cv?X
+!50J
+98a+ɳ[#h Vd 9n.*%*9ZԆЩ+k
+QԔ@tOӓ=ew|^O189[xPf˾HDw)
+m)qAð4#{W.L[mUy ^{Ra
+e+z6=:11^bYeп(}iu+unLWg=*LJM?rQ
+[81/!C>BLD&ށZSh׏
++
+/NrP*3o[
+
+v66)>Lj>b.!!4/=h=rB|9ͤ)u}YgiLf!bJ[B/ פfj K6f%{g߂FCjA>\ j+Uzn@e[^zRcx K~
+֡O=P;9Vm3`Xg؍qLCD9`O!@&Qg47zcr :ꌪ"P~'\ ITچ»Q=wngm?X4=M'0Pv4jd<0'Ya&Q$̣5K/Kf!,5k] cÁ
+lU61ti>v;j
+Sp܇9ƴ2I#!UUNFR߶47ͬiȂP@9L%.˚)
+7pu/I3HaD{|@>
+Sm%@joFēՍ9YRd&G؍Hw dd?Ɖ$ avKY>6"}ݜZ\)nw᩾|{n$<Co[ݶZU:O'(T\h9f'0.}0ÅK*?Sy fk>PbX[P]>
+mu(lbPVZ mϪh׮ъ@1µCi0z (:qW?j!Be
+vE9\"3i&jƾr+&Wwe "G zX{t@ 5P0o~5
+eEfEY9xյRR"u)N|b7|
+]Q n< ~0>+<C $8bl@AFxȽLԧ,p_{rj88v2'-V6ni|H,9"[jsCz1BkvEm(_7myO\.O<|ؾĵ9pp53xL/ԑ[F}mF_]I/9Έ3^eSE2n̿qo/m0
+ 9FH CbOkXlkr8_9Rg'=$qZ\+BD1` {fְe\z%KjM~68:{R:q/ہkƻ-a7f9Y1J(7!M¼z_tV"%X(G@', JҊDx.ZA%4(FL\ۢR^5%ϖU‚(8yV8oDЏ=|^
+ Ԣ\ 0"+ L:HU>=* \]&InEIӮU/xdC#o]qJI+#t1 3#VY$L~|F)b?XNO[VYTTZ _Sp\ ;zbJLx27?N@z쬡ȉ&sAz Ś` <-=krGI9L0o CF[oo܋ ȭ}j@":/0K1q m
+NI?9ΩD7i6 0Ut
+i#ӃعVu1U Hj@+
+ ݥ ՐMF0gr}MM09xP 8ڭXY!hzK>oxAILWt23$gÙk5y.J'`)eŗGc8,-kVwL'N&nHB|+WٽÊ]*ȅ xӹmEoE I0 09Ru5MR8p%/S(M/:
+Ӌ|r
+>Iu6(y|Fem,cT\BsмzFzZi+[{{컑Z 45X0+'ؑC n-X3]yӞ t:rӳׁ22dM1H〱A^ty
+A܇& hc ;z1dγ.X^nx{i7ChC4RHQ DNMZ7?ѩַz 9Yi^QUzs77w?>}~z}_?><۫~57_|,^^}ݟ}ۻ޾koO|9~x~[_-?MSOZVǿ(KeRHt 0>b  >xܕRVdycOdhnlD
+r9X^CP1'Ŏ 8Dh᳝|8HUr|;ׁT=@Nf p1eJYbF-bb<:<2W/z㗉0֦Kڧ"!Nqhrjk\ˊc6'PpjH;&D)pѪUqÚfb ŠFډ%nڵx̾IP>FCFn'u`imN6vNQ6p֑&n
+{EY OOǯ㿏O;)ȏ7ៃ׀A/j17$
+ MSY%6O
+aph;[ NBbH B#Nwuz!xГtn'ֲ"(<2;TL Uwrg|?YZntu+d(~#Ebvv xV"+PaHYW ^7^ h-g ?-{d{|.^gcODƅeE|c BGl >Eve|gs;|׭=֯1-zb$wNSqSmpE6]¹vheSa-pk 1Y3*e(.p)D&ԓo_U,$ǓaB̯$)O B efuM9VH6`>{zehVG_d\gd]cmBlYmg/A޶e=iZ0?}nyV@`{=ĉ D.Fۦyo^k,q^.W@Fx,n\iFTܾ>m "9&~>92z1M!=jÛi.Ov}hJ-o/8@,̤>N8VbdKLHeV8mL;V/r#UdT3}j,qd)uܴC-p$KDi c$5U  $҉ៅ?{ʮ?)*Qr9H0csKtrf@=g'եj'޸% iMNJ3c_2X諾2osbyFw4td[v',Wm
+
+^OPa8v~Ta+@6oUk5YU}{sY[9QQ,^9EҼhn(=/k)2q:\suGdND) At/>G aa|?cE
+V'|g1 sڊ%ShZ6*(Ya,ov;P
+%?)F{d4[޿6٭)>l]cq۱*dSJs3yic]#GMF FeR5+˞:,[P(q)ꈭ_uz\g(B"\tiu$_R"91#חhLl^Tp){[Xv|)z
+|Бv0#~xa!{gf1@?OK7mmvA#EYȨEb(>[`RVVt
+(²l(O/ճel@@2eiJK}HA/(ko&9POӆW떻=)RlOu`dl]1/HTR43HR
+S0[_Z`
+Bϰiyr=+l^p\2;i1GJٳ̈P>$:6w}<#٢">Qe񉭘gCquIuEjm,=ZRå *y^)\uR:zkX\oxBzw-xM-BǵeQLAa5Wˉضl|]/> L-6t/'xZ/edvad TkHw^~ƴ\ M(/'ޥzciBJR$6"fn5V}}n:.+оiW c
+3)%@y0rUĝa֏xWӟ)L1U)^1FBﶎ ع&Tˣ<^wZ#oeeHUd wk6ͮr7+m=0E߈o.Ah5h(TeF1C։\'o犷xzFX-kG&UAn]hn$aLԦn~a}}
+BGႼXTQ2H`<P8 %Z2t J\h y̥5+Bʈf!ZC=m^ <er`I4QϳȰa*Du|ꉙQ%?|-9gfӺ^" rD( Ii_~rNq`vaR3dhko5PR{>"by^ͱo
++ oԕ NӃsO`n<(_\Ҧiс
+:m' CJgeF>&~
+n)Z|^.kIsBm 51F jDo&{cFt`CSCh۽k@ 'i"3)U6\BlFH؋@%)Mh4a'EKz14$}-43)d-/C 'N:lwn {n)\1CVZa.<5rׂAYns{.t;䮏c)Ss17eTN%oy&l˞dzܣKC)t4M
+]|JEW^)J/1n&,73lU6u\&s4nEIy){Wz'KRmb,=pυkSܢ1X*UQeoo!/OEP<W~8'k-Oӆ\SZTO?`8Dpu;lR tS.[<s Fqh0ܞQ Pm(<0
+Ӽ3*o2 1/ɯJ3u7~7E+Wp0$+ pwh_".B#~Se$N4̨He)
+FQmYdOcb;㻴%':8)&9 Yab*.ƓpK78јS54\/]Orh/Lu^Z}f'Nb{]I1* PgܨLSRvYJƿNGՈhUy䙠V͂t g;Vu's;PIET 싷W xGgQs
+*]a2}Ij}uޠN m{᯦
+޲YO"^{ULkLV,yW2 YQ);>\ҔyYCBI a4!@CPgA?^FڄUV SR+[hF _H4jKIKB˪ih`
+]Yq$^n3ĿIg˃nJS>
+y;Ąk41n4@4;j`%#-/`E&-6
+]Ն 'XЯ|lҶ~%؜X]P&mv)Xk9'ǔǗ'n
+2+}rݔ:o#Ufz몱0We&6sՀ4.A*$D)yI풂ZH h"ʹcaTciHE !
+IKYvG? #S|N#p UJu%yd>اzԞ=GěI[@0QI>p4G@N7.(h5>t4إAT$bxi
+rDb/f]M-Oʞ"P]o\JlRɘ*Nf@K
+<H>NQ=<i}4ń ̂f48,,
++`ҍ薀 afKUnGL'3C~ ݔd":a|Pp041S3"=VцË0"0L g=AO[y{KuG
+gϣk9
+޲ XM8 |< !RpWp;MCx.+ 4r+ț&A08bNrмrVȻ(wQ*m/fJ`7*ֈ N#cCfJ뢯$} _bi78'Zs2m
+2w h+bhW$x
+
+R;X7[w;8ֈMdqqgj | &\R]UTR͔=ik-H\+]c?`![ gVqh`Db:7*{azX6ۍ+M jELq#ڼd|PHKձ{ ܭW!@,:l\9;+P
+S
+7#/$sv+Zw.([~WΓ۫rZdյKn16ԯU9;#V }BM8 -),kM(=3.@&ǒLJi9Y!׉O3{u SF21-^zçV3Qq6)e E7@ɺN^IN\M/ +_gKͥtt<"wbzz)c#̡~|_S.`ogdQl VEAQ8Y҉[@m3aq |$X+
+}q
+(Č#Y,$v
+|$y{?-M ط6bv'j-3N.F>ҳ D8_ee!g";wցegoV4 Y\0Y@M`ŹHNed/p;/&f/~{ǏWw7W7n?>n{|ݗx/j9
+  P,SsUby 8TXYs cY䨂l~-GБ#UidɈ@I ,ף؀N7^f̯ StL3(yR >'܄
+9E /ϙ
+fރ&/=4$%K/w}L'
+?)aXPrU2:HiP.MMJqEcVf"'W3h8:'rW$"CsesƐ킂
+)kl YF]LĴjg(^
+$,:!B~,W"=""BA)> "d5㞂Kzo,!U Z?CvaQD&$&  8Yx\ǬI0\fIJ
+R,rZj.Z 1N:a-kې
+ZY qʸ|
+F<vɛ3"2zC~SOteUkIqG8Cus="mؒ@k z|$nֳ}gts#"_ lP ,گ2&X
+넭T)a0VId쓦
+v@5 g UF Jiof
+Sg
+8Fރ3înS?mO@_o!Pkh
+3)Ǹ<u] 4"2\[By$ZRʜӮqAD(DžSVT3QkNwG]1VƨhN>y?i2]#L3bvo=w6{6`E{~0m9`N6VZW" ^`\
+hL.?j9΄)?80RVwsDĴ}M#UA&Fx!?7IB1m{WhAΌxt7 d>>xb y3L"!MEְat8UKy&: ${w,O#'#D B1L6$Ǚur+2]IIKQ hK^@DTjW _nnd97h4:Ď6h6 Q$5$Cߘ١
+6Nzb cz芍u?--XT,}AE}u 6:l):q ]hcutcJXsTY]/ 3-30 CL% |;ޢVK.VTTew8c1Xк>X8* .EcedjbczղθJFe @j%_Z\Ι̠GALr:L˄[nUݩs8j}i =`N{YqI DW u $uxIׄk$riR2OВ+w
+HK\;DW=B_~~C@?CJhUHI$`^ZXK]& 2UQuR3UV.̘nq_c{_n*.5!ݴW 7e>jŧ8SլKiSu搑^}
+q)΋*@V;G^'ȮRtSZc̡mA5%l3RUz]^ 4۠4Ƈ@:[E\VRԽ4!?QmW1D|D@jU}A6 | 4Fon<~OcQ 66JEkoͪTMtP@S8\J75fjBOeΝeU$*4P}ӈu7U"Rm| ʬ= E\:#`A֩H0TAkupUrqG ]Fc]yށ;p.<^h+6͞Ih
+שoi\#jYsE>p(btbF:Hvz\hڸCSM-::j E.Dg
+h-E,$~qժ88 Pa{=r1>:uS(BWke/Ά.Rۑ i ?zK-"_-: 5Zm)S? SlbZE=Ӡo~M+9$K:}-@F՗o=GzNݘoZ&Hd<J*AˆN~z`cskiwRvG1HsfUEECj2Y 6is9{̢h7ɜi|0^꾉y ݄- PAHP%D"Wѕ(<B/b@/LR >4& 
+ <f
+DIi>#dE \
+qB-iB6,CX䉟;9Q'P@ vԡ/nP mR4
+IH-_a'sU
+65Gp8I_(:@W ݆aWI-6ƷZ# 챖Xз$гp ͚U;͚a]jW{d7G&! J3яOzZ3˘PcZ잀-~@2•B5iQq8W4>oN1=L̓ŏw:&dsxzX;i]~̨Wq;b@X>&3u&w0o[6RV
+u`Q_vT&iUjiklf-¾HK忑?I.a
+^Ko!L^Q;Fos+41RFCqqjLY&c",Iv6=O<*nO(y%80/~M$bOzzevz2-ޒMڱ%b Ѝ00ӗ$\=326~
+AtJ}տt4|^DgB%V$ ̠k~WPpG [tÑ
+]<;  1^a(V\ b<^O0ƗaQf? ,TY @Qa軜,t46Z/]Ĝ%a|9aA&z"SQ8105SsY<\~M>bЛ.l}!.C9<6^viFjy=*q ~層A/ܲ"+SuC&&uWJ˜XPP)
+:Q
+$ `!1rf1Zce$*NEx咧#0;QNweZ4Ǻ`Ocӄ6.V>D.QsDGfH"{!wqKPH$ވFн!I,, ᨘgNjJSTM7Z2Gw 7@-5c߹-3y6?BEu!45tA k2xgZ"&ǁ?3kyNKܦ4|e!(*oT罟q$# `(5'i8'H 80d(LO7XB~k. 9U 6q1 ET;hiҖ4q~ daT
+yº)"Ѥ~^F]Ƈ~xe8Cxbκoۦ6e%h$P(ɋhékaExaӑ,~β3 Y @ΐNk@x23%[,?'BFGqj47qKڝ
+紺{л\s8g0 C&8 -XD2L\΁!?4ܓ᫰ ֵMuLe5_x<ȓ(Gg0A2LXW0|k]/Hh_Bak@XQsMH$MG@bi!ٷUTCkt (շx AG0YOJv0W Ų0I>,Al! {;0c:e(O] cz^̷c[xKi#s$͎SU[\eoPXf_ Y 8\x;J~NIR_WCB?ҨXBM o'A 2 8/c+%LpUL עFJ6/ 8U}
+LJ!;WT&@
+aIYt4COSP ]Zf{Ē}JN &.B1n%v9,97ό#fbI&w|=nĵXu7(~G>E4.9Pm2(<@ (,-}_Nj8y@6"yŶll0 FIMAѠ)D}5G浈Lþ:(ӻ2hx<=T{$VgPl,oy<2WrN. ,P8Ka oS
+cPtCp@gт H!R=w%gx8%1Wmǰd6 4P94?J@r9rq'rC : 
+FY V(0<9$f.$@1ՈUY^Bki(5o_h/-/r&[\o]fV {ټPL+ÚN&WN~̥!H
+ M-_`>ymVeOBC(fò"邊pr"9
+hiES?`rIGަq,Gq[K:wLur2'ߜ3e,
+H3oe*xy,i/~N ͺ;*B&i2d#~R
+]%(d_qcTXPtZUҝ9{m?QOacL,8[* MNU8Jf9ސ zs C<l86[F/S:}):qв`
+T
+ ,ӻ%5L8Yɶ)gLJ4< |iE}
+2լ9Vx|'>i /Ήu J+v8?Y}$ZzLW-9YUrd03[I pwdP8 wdׇ}чكO=<r!Y)Ar<;/,Mwme/=Uo
++׬[3w<+p[ x2^:t}i02a!'r(IP[0Џ*B GC}9(y&9l6 (> 2$>6}fLBJ8vR9Wa5k ^->\>g)0H 7>p+2#Ԭ
+$QV
+v8K2J+tlꉈƠ0%K4rViZ%jSJ !GmfƓ,2=6py!]5eTh5K&W:#B7 Sc"vzZhu6 *yBFkmW8FFLuZ| 6KGR@тoS" .ZWn
+:ub!"h&n+X$GvE
+góV{Si񑯗t)YD:-Sv2<bwÉV2z y'vg isd0b+z Lvk|n*ݰ`psܭ_<ډW
+\S[7A6}ۛd* Yں7ݰ`x˺mtʫ:É.Q!= jqݥI
+ɫz
+UX#os:!քy+Z4 )Z2d&qI*
+P|<Z~
+zğ4e7l2q4A]6k5^ZQ((Sv^5fZǒedĶjQ=֠K'\0k0sKByqa6itF1XGtf?ܑwv,"'c#Dӂ/fap7 ?)LyW
+ .ecZ RE<F磄i~V
+}埒p/넨8_,ERs@#eH'Cݺ p9Pv2ے\P|9 KA&E۟Jcmͣ[[ #/+*gb#j8@ 0ʘ^@l%>XC89zl(6[osM>OVFە|k`y@)Jki!k*-T
+N`U$IAc9lہ?ʥ|A8ߝfxpй0*\_,?{ 5? `GXCy(qJș`_!EpbeB`oaC,ɋ){
+J,
+/E?sh$M
+~'Md}+C8]ͷ3"iCu> 95\}$aIJd9`L;}b%l]Y&ɔVU <"*%8̩~z+/f9=dx
++=.,=
+Nchywr=|3_mh)Hu|x?9Vw܍X}b<Z
+~G7BV
+tӸa[1I
+Q B~`k% \u%,} 5/|h-1^,kPDkX[@r$Rvٰ? IS[,o9oO6.Y࿮y)+b+faAW$;(uOi.Vƒ֋[S#~Q1=RJtwVW>L_90Z5C,r
+m\#MA8u_!#LDO(\!v 6cIxJr@VHk9ҍca%) S #-GK!8iī(gh)S !Z
+ 2D0?
+%S:bBw͚4trcia e2Lckh">(
+D>!W*:cTk?)O:L&bl3dRY)~Md7荿-܉WvTY&g
+vILrq |wfkۺl8%\ ++REƐsZ`uC@~V2HOOB%jۼA<DghTZ('zA[kaOTi+)@32d_ZUd^B _tMfcb1aDW3dz٣ w3lrw]_IJ~C@LSO꣙b}O
+&Bu.%2pG72N;-397#o1I&>\\¢=@~f[d.''A #rofǂ
+ R~J4C42t[Q
+NfӊUSA
+-Jt:/9eV,dr!Iz&m]m$3J04`DA5)4q݆R%$t4J
+˅+
+C[sWڣ`Vm?C!k1,U,eZy3U,R l,<&OeR*\:}l~V\(}X)h9L)/#-g{|'huh:u(_gd%^ &^j)"2NN{4h_09!VNX Lk<\~zȃo%oX@OTu2{:;w֥\3X_@4l!RO4y}u. =0 b2
+P$h4j2si
+[*M.PR[غCStk O2~z#l6tXYSg=>+I''?iHBt(&j OF#ȁ 0 1; kH#P
+A
+[t-!M
+:]|,u=QL.Ǭ%cVW>ՃQ/wy[.yqoD\DWS}t
+`1"6T
+^԰|[;A0| ӟ"4,51]#d8öi \тSAq*u089CVoCdpma <>Ѡ$*égߐI8,yQKL04d'C x_ :D _66i Z
+ >JisK" e"
+@lb
+!L."{'<%I _wth6Obu
+( tFE ))6.;H!2FOWPjje̱a z>A?1rdTItyR "@ /@sl]% {VEi
+Y{J_ĊKׅhΥ*
+M־rz4
+B (=| ix9G%HW1n9B^˨Ug`b}L
+miy,DQ(M┅"1\iŏ握]%*)4dsR(c29r:b4I]f(KEm)`kpL*Am$YId#t$X/r2ߓA[aC #x2Pѷ ]4%Z-bSht9~|́M79|׫xwEX,b!ְx(D*Y2?TRi^Ʌ,Y`A;kXwov"(F"̧c/Ij|:}kgOUQ{ X&MHFAx)Ct$/ʛ6|ˋ
+x{ƐK)BEUFqv ־
+I-59XdVC>9W2!LGLV4ip/ae_UnzY0I,-r%,6@T% rb=Jm]T"t4"@"6*.-mFm:
+pB8@`QPt6(N>a8w="g*qZˀ1·15~QW"bl9XC1-!XyJlX e3Qfi**:PG#1 }fdF
+@~NjsW< c_b
+@kdh :7 HGQ
+hײ2>%ls}Oe;\X l%ɷ c r18匥 } u&x 1ԷWQGLMB]W}?X!.[$0܌J
+-Is$GlѭM\>Kx唕B<1C="vX: :/V%t
+MlAG `jWf8 ia-F gbys-+͇+)}֗=NNX]uD[~[,׊.',:RtV:j#X).򬠿\m$D`JHLkŽIЕQ[%lTCj+H1 ^U14&]s,RMRH&} )x5o u.E
+%@nb yqg{VԲ#Ea\e 5>c-a}3I%kُb-;FH@oljJCT"|55԰2{ćHsRP@ВhǠ].ۻg舕*
+t ~A&m?jrpܐ|m8?I(kQb`pQ͗@^mawv_n9ZZ"l BƱ!O;z N͡(p+*bGƤUx%N-ulAݰ8L(D|a|Ӽ|/ăI<t S>jBF9
+Zn2 .sZa9 0L46sJ(0y2L<<#MX9awYV 2Zy-SN7MˠJ<%Te,4N@}璯5nY0|N% !oX/?/eEJ{xb3@'8@ߡ1I..~ˤ?D9$OGb(
+V D/]juKcuU9}SBѡʘQB&#AU@<\M MH!>hrA à)ۯ:LY'8jr1WSb&lauG DG ,^59Zb <ꛙ8>,,W4/1kFsH*!Icؾj|7erV
+OOhdLaesg(pA"O(#C
+*sQ''QBΘ;\>*dc\u0+8'H=.4?u'V*`6 /tѕ U-{rO៍] /[Z.\_{ʻ-jN{kE7_>]|KɗQLs/wfF,e|SṄ_OL@qrz<ذ_
+s R{hPNjҺ5 <5/s@%}9rv%Q1j5"MB$hT;?*$X?Ǵ`
+c,S)P1D[gnm)8*XlD~]à+6\
+ePD՘C<XF;o` S
+{Y3jbJMZ+WIh?
+jdsʩKآ3B58T%
+i8 K|/Td k H# B
+'-ڮ4IKuE4!dQ=Jg(7IAI};LoHqx-!M F~ZP"y ƞ_Zp:x!5DZ_b/2<AM QJTؼR+2^F <
+1Vv&I @у_89Δ'`@7ꖵ٢Bp1㩨+#]h`w$ҺfEIs=TXBP 5$ G+֨dέCSmٹM!By
+aŏhGGb]> thVČp^-$!)$n!)G0@~ 9-̅bc?}3."ښ?KP|g'v=]
+fJ FH `h 
+b_%G#в@C,l< CSƛfhvE.m"Z{>I=(FMͥxO(!)lLK ZdSJ^BjfeCT*=N_dua(2JOeOgG5*xECɇCǮ <G<4zɇ߆u
+*IS@sCQx\SE^ąy?_ L"/F|<84[-~9F,VX¿:hrwR" Oy_è,Z(9}I6փs-O}bA;u0_=7/! D{tlSЂ2[ "8.=/8*D:qk&J%-+wgRPv4 D)BA&
+=c!PىS{3{m \ )riVťq홝nxp0b#|0]9ʔV8ednOI=vUB2k2^ 1K2`A
+Rى=KD*svZMRz%7bo5t%pFf \sȨ6äC
+YD
+Kr/tu=P(ıt0 A%k=,
+eO"2\UŹP5.B۫PxFd]#J $aZ!D\'|
+b,ss`[Li y:90h&\m9#%;$WB`bŀ1d`*ҴEAmkX$]$s2v};Uc|(qr\tjdYL-IL[MyW(bPdaHzni[$Q07>!k>S/eؙ6%v}RxDpK6y9B$ޝ''7ET뙧1s`4 /5͈.Z 4<Vr 08er( Dq.P9!*ѡNekb5)M6-Dh cvYN vm.c/g2 38!捸$}!x޶/,.0jܱsP-+ug5]H{M?;n\nY(rAOY'@Ht&1#4cLM)f&3?UDs';KXL|QaIO:Z
+hbtasS9{%,=  #DWᔳ,#"<1GdhDۦCp<pCu_Y#ZzG56s{"aOVsw$87P%ӵz8!ȮhM=B(`Mx6_z-q慯<BH䠐 tCŬn
+L{}t_u獎xPm% jdz G:ݮ{}M?&_W™cJ0WuX_)ɕei Jyyc* yaq\ <wx
+F-IДU.@lD5
+lBP9M;|Y *;O$P~* ^/btT#[;Hdʦs_SWY~^T{)"ٜJl^bb+U/cwq
++Bvtk=:UV>ޝ@R2窔,d/ ,+AGq@HfЫb_ V9;:Q$^#bppXMA|#5^v- REFo#H"HȪ0tHrahm|/U;8[[ K0 LaRiE
+2d
+;V'^+~}sm"cvA:9#)I̿el}QҶ.̷9w{~ds@2C!f;A@tR<
+9HѲRKf&}rI놁
+@?q2.2?itJRSTdC
+Δ47~%2G X|㵟KKa*,Ӎ!RYBgyc~)3f~3d@$;JSѶ[ Q|;8&[VJ}ve%%ߔ|UlNG j#LS%e筆!g\(<A:僨tys^A/sgsE-If\um$MpQ/T'oROAY Ha#Y9YǹIӻOͣH Kt:^iAwIXAhEI҇_K\mgf
+Jz<GF0߿nmK7@ Vr)Ikc&GGjO"B ,)BmPɗ"1
+ *|
+T>k/R&/+kʸ1|kPj^R,>+f]yR#d BQË*U.)5*UB*+Di{:S.`tEVOZ"Q,bkC-U IP:_W@Lfi\xNkJgIF+9-Z/k当h~'G[m:O֚S +[>ëݲUhn F+ ʈ9J?`D(d
+t+lh.F아Q:W vtK~YU(MNEh%,]('GS!iڍRk$y2)DǤ4̿4I~.eDnvZ
+/ÚL0-<`ZQg L^b)R*HցĺFh۞~".f$Ŀϒ]&HF^޿)R&j '$eQ"ER
+%fݗA,ӊlFȋH[iyxqs()}4E—T!%˳qd1n%z(^v"x k\Rq+z`<)Zo|^IH3q O5<]-ڎgaf
+輶G"1V
+2RP~ыnk°!|\! n !l-~в:gׂd uKh<9p]^"iǢ:ޚ uR-.I, h&O_DW ABvKUsO̗(QWpY;'gQQѐ3.˸ʴR>ċMHxЯNK"c{?@~eg{NADI:З<Mzq=D
+HAn\=O; J")3bY9GI/v qZb8ڇvTL:?U}^(Mta^sTfmQ.)RZǂZh} GjQ)D"2W=@}j:ǯQ>e֤VrTk̫T-6xoJ 9JN%^zvn7kA4^kSs, *ym}_:i Lѫ[ԶiFEǂf]
+:k2:du^F|4|9Sf1IГc?ZKR3lߠ) uQk2W'vmeD/ũ>)U^!J=/(56ȤM1\ҩ<lB _!v9e6JM qh($>-rv'TN4U4RnE`~-z%F+y>NnEvnlIΑRtD  yv6@Nw;|ў<*.[Ĺh]Z#F`h P-Ww"ZEr
+鴤>O 2VZEY
+\$ j\N{.G'"OϙEF U}VLڙPg8휀E#Fn }:N(
+(Pw# }H̺ Ti.郣<j"1a1=|ȰK
+
+z'po%jFJY˷@Ns~*(LEw(=#5G)LYv`bMzHqKỹ7ً{dG~3k_7̟} =
+;/Zd äX?}-
+И}t]{Vi`-T.O[p߂yŠf3j1[q${f"bߝ׶j~ZzֈƌT]-x2QF^`5l[2Pl d[V*Zۙ)hQ Bb!߻okPĄ`Dm-ސWRcYv!<uo3"e
+JB~ERJqMzx+WN|ͦ<917=\4]<G@*>j Ip hZ$E MCMߏUG
+8VUpٚ+-zԜE릭bSP=]O֐g<ѰݔxX^QnLb#|q,l\v"bD_k4 1L9W}f"j8!0^]OЫxS 1VL*w'pFcjg ^ֹ9xD$YhWMhAva0>Z,z958ў=\HJx/18XZsʳ'5
+ c؉0]Afްb &<'g!iE-=d1\;F6zhPa960[,
+7zsV - )UQXbwTlu!B8)BD z_EoE"נ2DF PH/rGֆ
+h^ݢ0NT:HH 3?Jcfmt ;1cBm7Rbݪm4 ¤ĺ0ں`P兢א+\" DcBpҾ0Jh
+*#=~ n4>7dF`їB c#9!쏰
+FQ|*|FKhz rBcMFRTXc ʙ-F]j1:\ ìyX?s_^ ttkc,Hx"S:* VՌ7($vޅ`}~Z(gx{Z0s7(+q
+-aUq UΣՀLow3`de#)`r)R6lMpsa멋OPRrzOB(3 uL6y]
+{4]Ы*~GH])5]rC,T?
+Ѽ$ȏ!KQEtՄK
+xN51~)dϓ yLyrG=ŏG@27TH ^Vpޯ6p^`DÐo9}/$t|,QI&-n=9֕op;ś cbj6?M EY\
+1ko ܑ vC&os똶Q4λ
+XMOAz) kȈ9 mp0(`dI$%O'T4T`6߳ T-j0#21.ϡ6eA@qm[Pttcfr 
+BgOyt+%/˯vP'l S|;p9!FQ>X=<0.ֵ,0%BSE0 lYTj~y@b:rζ&
+k TZ;Dbۗ^k| %f3x?;|us6ZG{Q ۿ 8f: "rhsQ
+*ss?~D 34gѮC
+0%:R0ҕqD .wB,. 9/=ڇ*UƢuah8a&d;d4-X*CkW =%O"U}w#<6@he߼jzqKX{*f [y:ޣ(ʠL鸏oBϥ"44fϏХW_@}x5o7EilK1K#Ik^Cd;T8B#0oj ~{808~ѡ aB%NkSWZ}
+FXP%ݩ߁Y.8fqAn|dyk=Ό!S8$(`lxL4O
+a6aaSVnPAט 'k^2
+\3rrT
+3 nuBi
+PePMqtȖZX@+EGTD ky4ɰ^r~fY<ڕi{dvD[|_GGCeMs[;zz9L*p OnK+ZYhxS0_jW=YaxcYd{eWt|5~}h@6
+X)Ho2ӬVbD@L6(=+!}mzlD
+ $Uj*0o9*ey pYQR&x&`
+'(0*䉹]zJ|)s>T@N+Zxq{֋"t,[*wb_
+jl 5ۏ-@1Sy 0<Ɛ!<4ٸ xx1cEH=CBniw߇> ɛ+F)Gʤ B$'
+I_R;7uPq Ỹ ؗ4VťJ 'ᅝ*B0T%` .9`h͉A(&mxf)&
+? v7 D UԵST21&<,cf ij&딀JH&Y
+ʲɨ%5&{[G ֞>Og36G/Õ|/9;ވ
+aqY4#%(@iy BXr[Gu2lq}v
+6d\%u\&9S)yPa//[= V+i@`HIonEQUclNe BAOa`Ehk"jɪS1kAǻX0Xo`e+:Mǭ" ߺLíԯkHT@1DZ!*K("vϟI?fg
+CL^;y /Spg<S?X(
+J`(fwH
+~PLUmopVB`g<JR|+0AI(~ۼ^MN)A 'DYXOXr=vj^YC;jAiP٧I{xīM$^qͅ3iıD2ײЦ| >)'"bp4hYAÝs vw{_!.'OO< ceA
+O̝ %:)6ipS)P}_ϬxTRW*)ȇkdK%k;, f#q$與=&%ܔlKsLZׂ'+P!I%d &HYCCtZ mKT24$j
+<@'{q=.㗮24gvjQ,{@D'".Ȝ׋ F0@b!|^ѥZ|vJڋ^'t&zugK#7k=%!?j*v>[q7!~#ߍH_S
+ #L<bB`!PGыËE.9jҮ
+TD
+
+-4(V sb@uUZ+>̀Wمoqm&hZ C _h[+qTV"VQ4I^Xj-`d|gwAe/pKWU8$n͗D{\'- ܚ@NLdaa㹣+W+5;E$x/>r^pyR/lj<wQ*S8#2kJ±{
+rsnUd-e% #yV7>5(Z~aEte=% cOE;YҋBmy pIyAԁ N17Kј1rXOMIZTqvZ#q[e $Qq\9oڦћS`Gc+=-#`
+_A{%S׹ *B BnE#y*W1!"뱒?+*5(J1PNb^Aa!=[>{lm<SmX$UXΝzXϼE(a`7`io`"h/fmծvN(ˁke١5O~ 8ۜxYX"BCP)xEQO^kfOr}|$RK * j}g>p|2+R\qЛ$”,vE AZ"Q23Ro%Rf$8uk:_| ߯NEh0G{jXtDhؘtZBtX4;'fRC!Nvz>0ՙC"pzV%)bK Ǭwr*etI6ȸ BN?ĔSsR\m͌`.C^iJ\5nt*(PI脱!UCf+HdJvYw R)$-LGw3e{vs}Omhʞ&_G22ye.^:\a8[(C<~
+[G+/eK3O`l
+30h )p+k v ~;w}CZ<4B8VHMԗ\<zh[`E5fIav()84biuei
+\ۄZG`Xzql-sxZxژ~ *A`(&G8ƔrP,7m0ٗd,q&ouyQ=AD Is;4ùvS!ѥo%M`8w@32
+G8QL;Ti3DDR lm/+x
+
+HB^t~@)J.W>h>ځ 6c-t7ȹiV$`Ev+R%t3h LٻELJJs+Cn?ZeYC
+x-Г(zᓫւH`U`m?+o+mPPu"@OUW$0
+߂P4_VRʉcS`
+brX^6%$ wx&f(0FDhXf-/F,-,we m͡0y+
+W{E֬,qas/jRۮdTUr/Y(%f08z~[@_~+/e>
+3b `XCIi>C~` TV^BΕFEݥ}ܝHR#B=7jǰ1ʑL0z<Q>
+tT
+w-Г&zIj@ Ԛv2l{B ԻiL"*Ijm #YE)(,A kb&{*bΙ? d*kr@
+AAW MuZ n|7n [`v#}7a<?w`P\cS_0i0jgh)B>,s+
+A1wrD]bV=MԋJ4Mc)Xe%?}+z71-s~ɕ,a+ytJ,D&[kr`D<$-@W_~ 5-6)ȓ`7[=JklkCɆ2C{v:ưKWL,f̃$#Нr"/>CVH; ol95i1HA5!%vȌAJf"r.E[2H ԁl2Mؿq28=|$ X%FY"4 UFu`&' ei Px9m^K~'9r@s4sñ@2KJf^  [_JӁVy=WN%)&$ʑo!sn7]/ $ gG_Y{s)lB1<Lߖ[P+NE
+?v -Rߡw0R)Z↹ h˜+v_)(ǜ"
+?(B%--:佊O%coue|/S"e`[_+Z!hIC 8)٘V[@:4D9EL0,Rc3tAda
+S$xx"/ҕmb' C3\b Rơo{o ^Rq ~U;W$Kj>[|=̴
+d,g4؅Iنŧ8El85V3|Hq‰Ļ`"7km,8@BCr/B
+*[Kjk7y2X8uYT+0wC;lEdFrQ 4lz2O zpäL
+-<.RaAX/)S>^fCp<"E˼BW
+/8nk݊
+[ `蟋Uf㼈ϱp3'ys!_/ba AMU*^7
+_ƥæ/RltJΫ챆Ke؋/Q4,?G_.ưd.)+*ȤzY{%~U9"rxc_wĆN hYc#:O_`OlS lu{bs/l GX1.{&S =4K7wkHL1-A $g\r+ui rJ@e虇9V ς=aEN
+gA:|[̧(7zょ=rNoEK0?V.֨vۓuXX}Ŝit˸o8uȸzPj`g|ZczP_ȡatC
+h,2(*2jCD2|"+2'O9rdp0]uF-~0ᗄ! 6îPXM_IGcK1#J_G,3W-ƐkfȮ,,vLDsX^el]=?U|EBc&`(7}%<Iߘ]ѼlE T$gJeMEPVDfيr$ʡwn:txqAN@Ԕ5o-y_@w`VUIfD:2#Bj5TBuzF^oHqr~#cpٰJVi% XNiހƌ Zc_->Mu=7[[ "^do1ØĚQCnVثCPdy?RLyq$R(AZ#'0uB,z#qY:!j)gunX}zaȢwY|Gr '(bULH'kb^J _3SZW䚂Xg`x6a!KETg
+lX5Ͱpr%.>䞹P)x:´aZ̳Ud.QRȡ[~fLT֖"B "%ng+
+偆SdYhx'"o݈6ADa_rK\zܷXZ_IoP _fDH+O1\FׇM=chIsx,^0q;>EG&dSZ|b0e2 FbeR6F`` ~{qa6DTNa\YWQ<\u`>,B7V
+E c7Tɰr]W
+#4I&y,ƥR$)Z{NU\@sq9=:}CPdJ3zL&Kt|eƶ3t 00F[C\;(&o=Z*%1b C=Oά!9ٴU6)beZi Ɣh}bl> P$H3=C0jHO (tb"Y7 XL9ưb
+OP$>$̱'p0  gb?s(KmE=V֗w
+jOG^Gիy&Z%z-ShT"cbU3߯dqҾJĔĕO} ˿m[1OA,:.
+vAݯ{PZФ>J¨16¯*rڄ €)@a˱j8sgYk$W'
+;tWշyyR8
+~>ӵP?{$!6EkY(X>KxlHD&sMҰCB6i*P)c X}8Pf'0XD)&ʺX
+7[ -?;$i a]0JTsHSKcme /N tӐY IH,Q&ފ?JKRovЯY/>Fơ鮈 3 r4.[DJaS]1]ݎw|8y&r
+[UשH
+.䄀*G+}9-q5aO;nH3j[q`1{ܯf9WQIL*Kv@@\p܏EKƣp mgu6̋j"i3rxX5ȪΙ5lxu@⤸6V<eČB70p]`Atɜ4
+ԝAzXS1~Ӆ16 ִ5)?!m >IuY8JhojIrӌ d텦-sR[!Pe瀑w˦JzrU5`,H,Wh(RM::$ +Aw{4ԎaQ E)̈́p;%LY芗;(N
+eۃa }[e1 Xa^ /ُg‰rA逮SH =/vn;1pB:Q/ѳ  fr+9 @$wXBM:Ӂ
+%~QjN dp;5+UZ逜'Btw?*HcI3)6m{*! D
+#VFTb}R
+bxˌ ,ǵTƖu xR(1"`3; ytsh[3ka.fbRe߁/CL=М2-Tڅ`Lo_``Ymfw\}혛shd/+Aʭh7%|RdKo QsDB1i4JY5[A8h3.7Wn2)v"IE6ewz@] \U 1ǖL(f@|4e^.=BDj۽sE^am@8{´0ՁCDG8A
+Chr2Բ rΌ0T˶܀;d(,2Tw2x~ҀB9ז^s#x-}o /di#aA*A|6/=Bc:DW/
+&l.~X^(Gxu]eYn< 3Qo<
+Sb` %)F V"۟Ex`WM( NjN,>2$aMȫZaտJU"uȖܞ<1<Rݖ7\`1f$ryHKv1E?FL*G00,:]E i6C[fT
+E3Ac3T1zKƘ.g4 8T<
+A„%- u,d&W
+
+ӌ2+1wmD 7) (-3QY!!7Bޏ0;@쮲WFR=rL>]Ae0ϓ+Cʦ# n[Ab6ɨ`<Ic`=Kb2Q-]if+<$Cjz8=A#Eh? u&\MഗAV<~%У;}qW^>D]^Inqn솋)pa=+,O$KNHExznNU{kӞazꜘ bfdke!r .5s$zEV6$;"8u^d9ցبDTZ
+r:ȍE =ÑE9T:  h&_P^F;?綅j<;u}q?b4ơиGA"O ^e,Fiȋiyc9<GN3M
+Q O[|AuRAbIkÐ%q@M#f&9:|Ö#WSr*Sn{CvL Cz/Aa&* vZu4 ]yy
+U1NNr)Ż "
+xDޭ:F RF$9$Y5E?#AcClEP*o
+#2ɸ|6Di Kjpxw*xLS ۪_u
+HC?g
+稟ȂɮHm~ ^D<yopw̫<dքLƺI5Ԡ~?c%oBd&l9x,RYmk%bA :f8ݍLg|`R C2v9L!{u"îc(,۴,{!H'5;֎A#+H. J_yrEa;,bs^=؟2>?qHqivG]]vGDEuL\idV^4J:X%JҬNOv]&[2I -x cܔF#'Zov(rOb~˱b9;[`:ϼ qiHi 
+ xQtQ ĭ[gs#gh@9Oǘ V4A
+"%PWA| jE|1v}4,H2xH"i_P. g1v
+10
+F`x^e(
+"UHf›9At 䏬2)?} AEӑ| AB(T+P8SRx:ikl~$g#6܏B,l ѳjn@$ $/OΡ =t|oþb~ |^7 h.w'P]L9\6$0Xfq) `p蛻LZZ[ԗIjnR~L%#3M gj:׾Vl!Inzh/MnH3Jf\:%Bt
+)k5H
+}hb$~UkVQ"Dœ Xq ŰbŌ&8\+AQ(Ǐ\L,eFd,3..l9r Њr{
+k`
+u45/3Ȁ>S *Qk
+RȚ? l"v[Ч@ƁhyArI$s{xʹՔg4~?EdZP</H=,Zf~ KQ= ~Ӥx5 u^x ^jFmM2G 5יEI#+PQh?k5A *hq[`*OR@/s.q-5;!u:P
+OFF!ت,FL޻Q:S[ J5Z5 1+ZE1y!P=<{]-(+|[םͽì
+0F%SM8/fn1j6roc-zә;e
+HA[9DOwFA ˾#fUv^(+սp
+Lns18DsExL?ϭtrMǔ,WVyT[7kJ!T`FeT+$͞198H,f3<WPk6[`c)N牭V GBVRrOdw^[Pu=fj젒
+݈PnN+D^ҒCH>\P9~r8G)`QGvfI8"ƈc YO;Nv%MĨtb ϻc~k@dHg ZdhePf6F:Yf~rS~oXB<x6iչJG{'c)Q*J f&Co,5xoVH@<f7sds (# @^ w1>n~ WA"=ۇsIftD伦ʛ`v\AHEz$R,lXYQ9re~Yq1ނxͰY7}7c+ -X! BQ
+!WVJ-,H(k 48
+@"suMF$K3∤I kǗ(WW++ ^
+Q[r:m *Hò;thC H/W3]1H37=%7^B,Ȑs4D:>נ <%<\!;zsL"q 4Fbyh)f큆7
+@VnJm<$ԇ:3)o{0Zn| :9j";9gR2R*
+Fh=!^&_%B
+
+EV Vf3fm|TF }+ȻUyϳ˔ [WĚHhX @ô@B kX
+Jt/[ҏ Q)s&ˉys^iܞ׎97Y#80~+]ȷFΈ^Ћv_A2xāwYhu.#g0h;"`<ĸE=ZMh!紲-ʐy6o}_BY7J;j Z2~,eoR0>Q,GI.G&|±k؇S9P-МM
+{.7TT.!ޝpr'XD^<C+%C &3}(%Ne:˩v/wB_Z#@ˊf>tqf7||= ]q7N}Yen ca
+Aor!qX1%?U ,QvgrAk)fc+d)L5X:\SC(x7A_;('elB,lA;O敇 9]_o,W/u;yw.#H1}C,8w^x'#~HljoMg^KI_H~-7Plf2Ȋ"q:nnېXly"q_AG1 폻',9,({MeݩTe]m>]>Q;A ;~? B]AؙWLJfcKo)c\rHr z!Og]--;ϜTJ!U[F3#d7[WR4hJ:GѠar!fu]3m}*h+ɓ+*~}86!_E!5rз^9rU^/Gd{y~?`\ uhLZauv҈mȓL_I^0]i9ۋY, Y{X[JҒU TR3>\rW4 Z X7 b^j'Tݏ'㺰۞=qD[v=*d^&'FW.(Ed1Zhx4ί
+ꤞ\Mr^-ZO?qq(*hIۆct~0>be'u*Z!I=qˤ+&lr0th4;d32-K]Wݵ0:d25=Ў#=95C;
+i.JIDT>R^@x"}5++S5]l1\#֗8Hv.iTQ5L%°lEVZOY|ʉ IKf١ b,oCh!rŲ,HJYC4Uל* ޸;OpԤ Ȟ2Ǡ`
+f1n>]&)/H!`AsSD4qgV ;)XtQʲ̵?I *Z4@p:/E!?eGq'['O2@I3x "G@,FeUg|
+CjHwH*=8K=ݕ|fI#]ƾQ7ߋs{=S_ԚJEyLedAj܏{}rL٣f6sPX
+XʶZ{ׁUhd) ^Q wE2s{9gE)|9O&cFlO= Z
+eXr*)k<@Xyp#/vnu. Hz͒1<]JEb[g3TaU:nvӄXfەabAL89}qR$ܣar ڱ(
+^T$ev@X(ym|TWe#=w;i쑭A}֬*LD9LCDՙlf("1("-*LS+*!s."WZ3SX\-wSB-Ĩl+YJJF0SM%:=׾RՈX/Պ!jA$*_c9>p L$jr HЧт0N?11zy6nܴB\<epr[zUkN+'1%􊅢48%P@ {P;*GBn}j
+ʇAN{44kyi/GA
+˱z o]W#$" 3ZŏB7r)WPNA9x(]P.#~$m>݇~'9d҂GT/\@CEjr3\0e ltr.R<`>!b#q揓3[/$@x|'brĞ!84B9Z3;?ʆb,ŝQެh㨏h#?AMҳ E/!x=B@K5&Q]ڸ}<8^K%RQ(i FѮs),:{VEV| d·A6/V%]cƏj"9'*̖q|+4ɺjڲc )6MԻutj&V}zOUCьR*gj֙is9fDFps==\~ýr%O`yZTjTwU^SOFg1󬤍uԾ&A*FÌGy2U-`~eV\zZ!%bLTr6N9.%* thZj񝵝f'ьYqh]&e@ΎT=, ڒ<i7GFrjpYew6j('hhAMzYS#QX˜5i*ҕюftFMꀇhC!+U1@b|*H 9;#3U٩
+LHe,0<pz,JgmNRD#-0'lWW_\.j,afty$ V)71
+`ofOMz% ۶5.Q<z
+@0b/0J+~^̀Ǻڭ7> fa, Hf*2^.H]AAcSM{g#2#ذbqJ2
+ϙ D7JuJCڰLAZ2Le' JC.Ģ)dr}-+wޠ : ~ r~{A=pi) ~kAw "p*l=>5"HXV+)"ߢAD"q>AWR(xN⾼w"$rř}r !RL,&ǘ[JBDR= Dps "1*0KV=*"8)[x
+BN?_AHhxx
+eOvy!`$j_Ao`0ܾ@ \g8^!WcCݦSt;ⷹʰѾ71'( ˎR';gPe{I,8>×5) àHIYPUqũ1u`;ágȬTj~ Y#)U*9Clax.74נm Cٟ,>ԕ9=XZ0$ג*#1RMF6U6@MCY(Fj|ݧ%NB"C1 hNvsWnj8U϶(x^2^yDG?rQJ 1#fwx #HFPr-RNӐ|;Ls&! idPCh$5%U)H^o#z?d<dϠ ڸ^zx'1;K~JSf
+B2U g2gVsb3(4eT?\vw$ɇOsI\;ؘO%| *4;PH ǗdS\$cw8gM؝DiB
+A`r!A VGvg+QfU<cN=ùMB
+Ճ410$;h bHCۍѵ%;7^OV_pvZ920jg`_Ӊ]Y`? bF
+n #A!ii9-`"Jq-<hJ@F@2;oqiTNh<_4'gxA33C '1SҌ 7 &'ߧó(3aj ,e`M*B IE-L=.Y:@$tX163rd|rYMG{/NLZ:)#f^LZ"1eN4%6忿 rh-<
+GBJ:HA44\1eN L2e\?RʦeLb ،6CߨVKegaVy/-2WAZSٶܕw*ib l-fB%Rߡ^t&GpAkp.JP
+S4 I%e aQD4%#խdϹ!~Wݐ|N4JG
+/y-4ЁyҀmaA>DG 0*b<s'aϐ>
+ ~u.50vaw">8*mV_@0011Fw@dEo*X .#İYc=sm!rsX1@m <jH9%u5 SpLB<ă?lQb%դ% ʇYo8(*Euԛ&7pMXe&5ͼe0*ua6R$t[`pOѐ9A$SX9: 
+uӢtrɕ2kS=g ZP  $~ t\@A*85zŮ.M&u3XG~
+<~PElfT:.bKٲo"KD74/r
+R5AD2ȆU%g))}:EqA(PBk%VNepi$SaTGQT4G)[W\)C!JmO B} :d* deoJSb{+kiE
+"
+BeWy
+PI =ߒzq!X~~7QGd-Lp6Zߊ.䫪p"v^q <nJv9}ڜ$>A>韯LG)dK^nrA,= "^)| šS
+d3mS$cGǔWm"Y4+ F
+Ŷw2;?EVӈtcf^khIeYyH)/ V(NJTf^:A|
+Ɔ
+b!qqZeL&*8}JYK)J(Xŀ(*F:2pS#Pjy|9 ~ݏKHAJtd)%~ҺO``.O̘켮3 Á*`o{#XE$JGtEŃp"vuG.$j ŠKo۾"VVRpҡgE1=>3ٮ%L 8!f"ǂt|Tƾz LA2G)0,lb+ܜd4}vB C\PXGITm/SќlG4m02"@$AcwiC%Б&$b^PvTjn pq֒B? 1w*)%wk^9(dMGDf0DɯY <ƓP1[ YX#.қ 7׿21ɜ5C-~ لcfr!B]p@zaRbL\)7-!|Y' ")!yNV撦P44Mr) Jec~<:\>1W0NL
+YzV6,b6$3I'=N !P,8$A. {JPh<A/Z3N.wGd|}ŝшɀ Mr_M~#0 )֤hh1UB%%tiZGnT'E< O!Li)uB_e
+#.1/mAAiHK.z? #o Gҗv[w% Oji%}L)\ 'SWmcdz*.+[Z )| ; ns\~ UoVNC4Xj\0۬ )53G
+`\}#$RM%l
+/R1ʹFк<%Jesh{xL/VE_JTg|G6Xr)@<X #-Awd@&Q a<G1AZ IYBU#Ǒ W?Cv0A3c<@i5w?!et~ F()\MO{Ƕ5
+h`\+d %góx~0`K>/ Vyc <Aۚ< SؼF lv^\L^/v6.^iw"hC*U'Wv'8i/3fdqYhx7c]?>'0}PIb@iV<B6j0\ܭ
+yb`yx~ܛw!kz0mkv// =R;;c7CpM#E
+tߨdsɣ &VK+T BdgWqI~a%PT: KZX,uy:]+2gSEdWjS_f<믓S.7a/IO(&)
+&ZMζ
+w lLҶw
+@w18+&HaU@;@^09i,sQz?m f4JEd{3Ɂj#%5
+aks>4P| DuP^|*UWn/0ܙ+%F$ʮ[3:E$+oy6\{k6 hu˿ө[gd,<=d3a7c &]? `TN0"@׎ aErsts0fiop:mE & U_MMfI ӎ1U):Q!r0;9yxC$$˴>0PͿizsxc5NMHITE <wvOsqc|p֩?o+JDd:F>xRDTc͑ĩ.'i r'\ly;ϣY:3
+U^3EuCvL{͌;L{慘=f/ڽ7 'c/y'(- Bַy MgJ̺)e<{ 1ai?w+( B(F@N8V!h{up(2q LJ["lSm\d_cp.)%!+$'^bl@g'6ONs]wA0y;؋٦Wܞ00PMOmA 'A0
+\Ns47iRXb˭4CE-4t`%ef[7AAɆTC0Y616$Cک> B!_>
+_Er8i") q@lQttzÄ'
+[UW>{q:Q8v%o!NWhQUBK8P+\33+9qB{rq<ʠA{ tq?/_c\ [ "9Wr׺<V1 MScDuqf?BCۉb{\~
+gX1e^y@a{{lX1֫6
+`-slD&U+odX5\&Ʒ&\F0)qkoV
+oʷ07S;+@Dl:g+$L=
+AHkbwt5 AJ4 aX%-5p遹AaB9 `x:ƗU.U7*3,LёW<!$6A\`1/.h7&6<$/0xu @N?1gq$'L^Q*nmR!$(b[.n&36ʩ h4нej6iY߾yځcI!Jϑ2k CSJd:Uw jfFu:}c_۵-MR.
++Auju5`q#MjH
+ %
+4VK:|W`,`W:;ZA7E&6"0^Du
+*<
+wݐGw ?D9%ܲDe^Ei‘uS̅u<I^.1ZGlPT{0"w
+9kO(uxc[x6H$0MfU񇯡7;&Pt]oep
+k߯iYpcf.}^u19f&݂+jU!jŀu9K>BWB!\ޕ
+E"
+Uqh/+j*2o7:QAɲs2 Zdo[ gT|6#ٔ ss+wG6Ƅ=Si˵C
+?%1LPq}4cϢ IwT;jPӊ H-N$z1}NUPY<& W0\]ղfuqlɭ*rqe"qZszb0[<r_r KEElz0>PڅdUx
+Fh|?U9cjss2"o$<JL?LxlĘCĀ*VJim +eH$­@ܓ Wv .O_>~Lq siJVyJMc
+"H3ا&Ϊg^}t1-FxIw\QzG/uaL: 0dMJjnjC(e2E g0\;[!%,QM׿aMuf
+ah~A
+bC8ŸYD7%-3ܠ !e[G ѫ6/SBSL ABRQ-_,Yχ?@ة BõZ!` 3s7M~7 W$y&[=&zFf#lOOhUs:nk9/ysLrc\ʼn;e
+.*) PyM֧>!ښa
+9?sRQE_M(
+/@wX7vb) œx6J(&eSƽ}ql1x0uu /O)HwJ ^ieōfGRA! Ad}fXr}bi$Wۂyϧ$ZC9APʄԓ|nz"OS s*'sDqK\ TeD BֵLoi2(')S+' 5sBgD$G
+HKe DW=XjOe+VH@yf5gHi/9jwП?mQ[˧EQJ!ȌV飔(mAXw9kkD ڪ_w۠Ye֙kZ32lq VK0m92.
+Xp.zw(_ۋޠ _!vߠ'B,تӝ~ͬAc#HP^mg' Mx߻#h >;97Jʘ'x*c`~dR쎌cޣiGӤz]!яo  "G@8z:h<H[.Ŝى:$2-۰vDK#l>}G0];hPP䲭uBrƯ
+Pc_,bdvfXqE|T@LiiY;l؞tI38w"423N. Lc//5AWb4Y΄./uvygidm^cڡg@{=%+~XDKbUV{{Hjy5_ lt\rwзoGDnz\s<.ʀ3QH-ǣci(c=Ʀ%!ǫ<9 v ~kĜ_xCDd/G=+5@v <d=oIຌ֓O~I$}K fԯI^(8Dܒ<,
+ih&:}@XD nHdOG" RE
+I&*tœ#|,8|~CvA,H)\#>CpKTsJCeAg
+hLڗ~ZJ|-ikةfޔZ(%`>KPu| OڔkqQVz>/Z11A捗N^H{E Yc1/+ax`yƜ_G?G-%K
+%4 -2i'|1}O94Rnd
+<T~̜Yql=K@DG\wA`()6~bcׇH9 h_%F$eOJ,]Mb7GRea_~uؐl2yij # ן'ܱiF~I?\+K2^.ٙ6J@odػz|Ň%DZO[%^(TfRAi}ZTJ}<  l4~AeA)pLkuA8IvXT;nJ-(Hڎ@l6&iNS>E`2Gg=-+eB2̽ [)Y"ȫΣ$jsa{VO GЏ4wF!!]%_z&__ƒ3L+">A b )5,RpzsL*5sQovs#wqDLۯ6&ll#y=@?o]a?S]=ͫ7Ďt*DFD xrrxo{1HB~b Zs/ixSfB@r]"` ~JZd$Cl_>``ȧl;ϟtN 4ԔrA2Dz1|=0lԅL#H&_Gq B0sFAI˼Ƭ۟%.<CU8o✌Ag0^ߴ(,h@"REA9R|>2_Z*J!\Na*`b$Ϟy .B諐$Lf*-b#j5D+Y PJ$>b.J^7&yi!js-M9{xs7MQ9|׃Edm IrD̓ats+̤N+o,)|bN+b"~NJ#,mT2BUh,+VPz ]@6B?ҺudѽQlR=[ ㈵cݛRf;o !ͣ o?tA(llXɱ.d*CۍE
+ѳZAěQ61Q(rbrPniI]iG@AB:T=#d]tk (2QFnb@$}t-PFI?Vc<T aj={-Je4aG@`@W?1(!}P)ґigI@IG8#bju7Σn=ks*yeB%%$_ W/ %ɫC8pZ!ՍS=gs~;(qE"hvRdf}BЇCjyg= F `f yA?ޘ.>#N5t`m(EؘgM\{ttGqB* aB)Sg"(yE"oqɳ9.+G眊gD]h eƁbxԁAo@~t㰟X7ϏFa&"t3?C1d/նbw
+;eN*.u6D<~ ɝ_N~SP (W=UvBeQ lyN
+iZ jO
+螙q}k6(>USrI*
+QjX\οѻz# p;:W_SԺF:1.Ā+,s#עJ &"xI Er]Orض&:jE.tHʘï$ˤRU ֽ dCbܛ(w5p@߀I*J$Qwg)5[RzERR_ Y'>H
+ۆOduY% rkO(Hf'(74뛦4P
+<lvj2DʢBɑJNO0IN;GFy{e:$BTLnę_:o$ce!pNNmQIl=1qcfJ)zi y@(慙Z;O?R;C LAo:0ZF!{F4>qQ
+AS uM۱ed 4!|G 2%=ZيsO@Qʼn 0d)E tAls*º5y* !b22kKk3Gء j]ȝ̅"w4ΐb;# ZE7Bv Kc֭$NSO<!0 ]eċPlm#I$ki0ueG<Aa-o-um?
+Ha{D;HmWjXGeI/a-%Lu鎌 BhsJglZ{hCd@rzKL/Fm8@6.ȭUO9}kP(Q pTA2o-7]ks }UX vYv9:7\y}oRJ$*fI}V.b`rƋ[ ;f0AA&M
+8_!'CZ!850S/#V1$O8Y/1+q
+GJOg9ʳFk{o\_٬X)؛n R+Chx Y=O,#uasoi2
+;QΦaTkѲHԮҜ"vsnAqX~7설{B*ԌbK,w!B$=@qo =-P
+‹xߋBraz0B ,xLJ-`1Z CH],8 p6,E çoT𾝃B\5
+Y œNNKǪ2 +kɰkd֛H._rWq1J:w }/agsUP%88I#I6X6\!ecMTr_ȩGg!d_Ur؎~K:wغ Y1iԵhіIaِ]t.h q׈ \#Yd-д{Uc aH,N PhT]ڝ#2HPֹ;>D VMEz}[}`ܩlr ġM h ꈮ6Y/!Ud
+u3 |oē *mQ$(e
+Ahs S2I<:r!:0!B\AR;_sIe0>q@oL]GFz3I 鶘hzF;*asg,.2xK-#fRuD֘e\t7`܊p
+$ĪSKly8Щ2xUǼe3aa`/$-d$9{AN P`"
+w>AuB@RGbS3(AHzP\6@31뛝C5|/QDOD"Uvj!8E=o~\p,(nEG/aӉ0}*_Ƹ|=O֍zBUY ebBd)2b1 S@q!t*ƨDGQJhX$A.9oeبvbz5&`8ݑY֎g^抬*:
+@R`Q妽,}Ur8/N|(P'#H>957,=&9P3=D?Tj;6/*?!)0֡2 xb0%
+2ikvGgK  i,C3?KޡAQM?LV)b`+!=゜:cqywARX>c=/ek4f)@lvN`TLΞ-S\JB!Mhӎsd5P<h4ARIȺ
+;HZ1(jY H
+SzPZqa/H(@-zE}ٟ(d5x]"Zn@<Y)C-/
+!ˡkU+#Iȉd{D8wG $.kاna'^0t2a$sh*"=
+E
+_K]2НAi466fh (<㙃0УLEb,qd߆s/JVBB\)>_I);
+E%PoR;\$]!+щnς;)Ғ61+,W-T,|u LUvܪ9`9נ!ս}CPf;*p)
+XvZ! @B:J~^ [ff0Tj+8^ iSZeZVLa}ֶ.VST+&lQ-KlKKv%:vJ
+yuQINI~Q  * { , D`*
+g u@UK*J
+2L!~.A"1\Yw; .?a
+8CV+x1YX5 kidUNю8U
+w
+=E%`
+|!6
+'p=|ȫ-c~4jIJbWK]d6\1|5Ǭ^.1
+E>B" уE0kˠW,8r,Q[0HE
+9Nw+Zlah2YP=)t NlDB6P,sq)qP(
+dw'EIOx ބɶD5&85φwq+ƽQH ;Ėc!DZf ukE-D |
+wʟVpL\ĶV`?yK"M斠~n=hFZ6L$^˗O+w:y)R*d( "EBj LAhd޹%x4Q*)Y@$~ @N1;MOz. ֨0\O#.7q⁉M9eeld7dp̅-kB!4(2|4HKd*C򣊒*ؼ}י?}uyU(;>N\
+"bFV2W]F
+x+.Qƕ|1ld( ir~p턔Dľqn,( ˀ9q!R<D),
+Sk/JB8_/~ڒs.Qu%Q{r̀OobXڦT
+3Z1J:4{.s
+̃עXWdqd ǔY]b(8$ójQRYcJxSUtɎ~Ʊ`%<$s$<m߾vtgڂ"4f%pa+8`Ԁ 2 \ME80{`" ")Gcs s ;f:,W(KqJ;+x}M݋XM]*rm-Ҙ<v ɤ(FhF܈AծI.!*
+'-ԉMbYǙ /K+ |XiUVp@IЌ*`%X?S 
+?.`$>J?R2$GbZʑetO^njVi ZU*V6!h^~S 4N[ ER0 q0j'-觚+XWtΥנY[;/;< W[䍑;׷غf7s`ڃ3 ZlI߇os||F%O/)G
+7L8A,cÆrQgS#o@`zh@XgEwE^ZFPOaHpoEְZ !L10yX1%8!.CYaAQcgY".$ݳ!>+p*hN٘Q+ 3!嬿}9r}#×BFd蘃PwI-4{XD6Rב?nN'_QɷI&[*9=87Ex
+(,ï3
+> V/a95UZn= 04C f,JE
+dyy¾nh%TdM .Nҽ.dd b
+sFG((6itRrY97%̀5
+9)7H oR062ɍ$ɡ :`V/ڪiD;.:@(@5 6b6~As kB^~]oP:"ɥ4oE*a83K`
+.7 7e1NckZ }ي;2.,8YI^C;]۸L@&^*Q案-%~d8;ݾ%@ _CamѺGa9SPRS"`b1!sSl>sJ*_u(!!Dݔ'F^pO4q/4fDZ d̆G [e!11{i C`*^fYwLJBDrE( WiɇJµ, /8t/$<
+@<)s픐+9՞=AҤJB!tSBMtp V`(tɣM6SJhDDLآ؈Pٺ,}I8i4=Up%"(^nn`1}XU}07DӿΈk ~"KpGMS2%aL?(hX%n UYQ,`cTu|j I%R$ij^@ZFV4P!phA0Iȩi8iH4 $ @!]N1bJ`R9vhd&KΰûA%kPU-a (!/^+vpf#<DZI [M'@Mss+Jps
+_aޑ_(6`38yș
+yH2
+7bnזxyYƥxP)-)eڮR @L8>!|8di~e?)6.yִ.5o1do=kPTeFչi2} ]oVP`F:q=RDJE
+yYU-(E0BkŒ+H I)(f 9I`3$ܟM$ A«dh$')Jib(JI'q˱y2qQɁ N#NV/Ț9er*~pʔcBaz*{+cn7U ˟# ` DKK5\=\!P1K1vv笌l7
+I.{bmw|'x+ R;p}=Px bؗ 58d"˯0(9d,lZL4
+GA88/'VTh@@WM<>VP
+y[E7>wVsEDbACA-ϢRB}]4y[EDE7QZlh!Ea{O}A0%^!0\HEA%P+V~[sr"PP)zlL 9a(J񁭯 }p3ë$qzԾCADz$S?a_|ܤWDΐaκ l༰:F0 ^1zy<^qPͯf]wjn+k\
+&2^56(J:4PDEP¯$+le
+*M AG2d$Et'*zJ}ad!?"Fx8UtnwVY]$:4'"S
+1k//81^= ygF=gI[v吜<yR3eFg|7c 8gGԼɀL,]| · /OeqL4XdZ cJK*x"
+]N)rC@ȲoJt=E/,E0Z tp7vr4p ˧Lԯ C:,2\<Y2&<rr%8AۧԊf)+$g<5`(6 d}5E{}}QF,5 M93v҉i@H$-ĕkBfiK4 lxJfyxr8˔kGxY _wJ -h`TސޔW#V;
+9O
+E'mO3>֦&yl%E
+*!䪿)X.gEJ0I;M9TLH5P!An!,z:sefÝ:0A %fV0c{͠Ze8WBܴQh=m&&}bޘ&(|6`1B8OT<K4roɖY\ '\q)3#8=p/s2X&gիHmBż<qATM>4n}sSHoOzfjZnӼ8JUEJ=PfLp_lHa+p8WG@jysU@:4c+$J$-g+ AQ^<[AhO&GHE0Vǚ21%XQ ;arvt@[RoۭVjn5
+%Q*)%@-hsX%t!쿭-)GVyNn
+jYWkSrō>n7M~W;ň˯o=!1t_,XCMZU2b]<&
+8n'5L^]s"n=qĭ_ L4Q wܖUMiERE[|)guxoF D\m֭=&ߘz]Tpx.wg`YvIٿcaҰPJ-^$No2a!A;c3@,r2eI1R
+ƩGzYFN: BWܬ0 d
+QVk>e ̛hV_o (K_c
+ l{ $mSeI(66|
+c+".Xy~#W! TIBoH+H O,rVxh֜wCGU{oh:(:7.IOJzmH?
+l 0uR3|`[χ"!A2d;yEO?:"K$\姝S l o-yM 2v`R8>˾lk$X(l%^ЊR@)U6LNFr,r3-8K W*Ds(\V¸147
+;XI(DJL0 o#e#bRC BJeEB؁NC={;UW])҄Nêh4PPn]yK[_(QQrKT`M+tOGIL\:x bG DNZd fA;%1g5@0"hY13 }UhW$QiL|F3Z018ۤ:W(M|c`n }@ݏ{)|^CP GOxVTJX2p S"8Ex ˧~o|hgSҏl"K~!^V%w4B
+qH~ $F?~;$+:`6cTe%Y}% m_\C&
+KSTq(,TɲhEbЂ{)zff].dDSJyh⺦1eI#}*`XH#ӜhXUƒn%ي,JFĎ>E: "еJ2!XQϊ2=ɻOeZ5}*%Lp0X>v5!qX^/Bw58EKY3;wFRJ:> Hi.a(t(R ~1-2u Dg #$&Tɲ&M钷$]Ő>`s#Ɓ*8@]+[ӢRv!W.uU)C~*A@yp1g uuLjU<4Ms+XgTD07
+P=Z
+%YI BIw$}`XBtl zFl'<%E3*"t~9lRJJJ:+R3;ҭ Stx_JJޤG4A()݌ՕByG yBhuQ](5*Ofb9ȏۜq^uB BBּ %oI(ϢC(%l\ci}OBI`+9BI +]`9?"\"]h.|UJJq^qQ5|DJ$%LMSJhC}p-+StWJ] 9ү9=ԻG'IƃR)B)M
+]}„0-d1m݅?
+HKr&7O;
+EkҷpĬoCǴ˽p?R,L$"^]-g9|t^6ԇyDfQ E=/и٬{ msA\cC?[;SU fLn?7Ph&1lTt+
+$6XA:8Rrh>%gx7֩ao3Ɯ==R4:h6WR48dD'Р|>oчN8Gt"D'4"a=ZdUNAn"sWoÎ ݯwiO_'j
+(Ig * {t{x\o7
+.a>ƈTRY_hv&ڂ 7zC$l4~D1:۾~ [zۜ/ _)'n|Cg=A]}wN,AmEy
+#}TiiM)_aTAaP O󣷤\j0/y$2\Dd:(Gd yVޘv{oR*Ս(xAo@=Z=<6 dݧARҩBܷQ 睱 *P_Q{)S(n#
+H:=a<ӸI7XNlU:_3-r #/,5y@:4jTj<Aŏy}qDR -\"Ph*<@?ӺzJ>TEWRh";@b
+\N0n
+簾#zq0TOt+ ;#dxJZ| .G= gj34ӄBkXx
+05EQLZQDN9Az@0>l
+k
+EWRfv
+F.v~[FIPm31Dlа6 8*Q@MRZ32 qn7(Mv(Ne[Fm&5 )=3y͠o +!j77<#4K#ӿ^åPtlsm+-!4<H
+VT,qA?u~eT60CUZU@x^
+bMm"SC VZU N$:(wBaU&[O'/'r![V898yˌ_fra-
+ðϑfP=deH.
+ϲjgWl*Vqz\R^S$d.>8[h%S+s,h_kcY {[q0dPY t5r@i4y)n.F\[{':}bH}0?`1r;v:
+(isq-g&Vo[pv
+0yL?&?NKJxD+0ȷA/yύq/D5dmW'_VjWHO.lv$Y
+s! kleF|vXý CeiY 22*Q
+ˇ%sx9A%A!j(L""͇w=lXK>bs6\G "rœdXr\`_ѕ_lt( µq}ةk 1E0
+{]ElC>-IM!ZTΐ[֠l"aI>W0xWE@@]ن0i}FITb# :ilr:͢ƊC4H&* HzÒ'N,ĸÀMF7{{Cސ ~Bʃ (Ǔp@~
+ChLovi(!º1HP@'9R$әu;\u!@
+Wp#"jiP˓-K=6\B UI3SQUuGiZeڮZ<תf)Y8q.@YwW(U<
+C4H-܆K/ BXƒcXScj9 K$.C/a`-cFǨMlW[/|eC}s{߰X
+t75&?@AEss
+T>(]{ FJOAc>';@C
+"T(5fQ<wQ顨
+6ԑAxJs:_j- Ubxڋ* Hi3lf'TMl3:f4QJE7/TImG]d C*{%k_dybHˇb1Ԫ(@'0<|UmNO_qdg7f277<qbeW[Jx-$z}`,F g¦ygh4u1|b#LRעA[粫R% k S:]
+T1!DG:IY`|- #ī:ƒYԲh
+Z v`3^?`2a$`1݈aZRy z7x9QԔjb ԆǿpX33Ϲ^9/ ہhXoE!un,WnZ?Ȍ+=d|'ޖhn&8 MJ$ 9I]VOXp[?"M)NC2E')!w4cTͯ,[7s`QgO_6c#e)!;Q&
+y֬\mhLA>YDͳNCe.C/IK0LtgۇfAl*F3l,ﲹIZ Re3l KZY>ZPkJ
+~Arr=l|. 6Lr_lHBke.jZ/`vzr]¸ǯw\Ec~Nbs%DsڗXɇɍI7~Xivb^ק9Y\wZ#V!$hAO@EhaPt~fَBX[' yq\E
+y+'izso}$#mVv{v,5 ߦ-.J7"q6p&11d24[?wQ~54E?N~uQgE s+cW (뇫V.רɯ.}}>dzS/B\Ou)9U%8(4]Bf$º"Jzɥִ[sG懚VR^UN+K08;ܷDGa&y>% oc-u^G; (A+&+"8x,u'=/CjX+|a}0ڒc͡\+j\%Fu+qTG|m
+ۂI祴/>ik1=_*R %yN6Fw!`^S<TbR2}$%%ps-~5 Dv+)!dC&DPE/9"cG3_lb1q4PR:~\G݊߇ ;QXqh5/{;3Z' $9v:ܦ253("|RĉK H]2 u+9Ct[TWX8YprQѼJ- .YHS/B
+ W=&T&C@JZ4sPbLq ^61u/&%??’\_oh׷S1w vܥ X2p'{, en_o`i}:ÒrJ}{0o%ȏ
+efJ
+:jnݬ-NWWq]v2VbnB֛xb8ra K!1d(/K7%t] 8h˰`tHuG& Laʋ"םxa
+Cip"
+ BlT0m*թ_M;ٞ6/0pK2|vgbY.t61n/wX@fbEi g8L'7dڜhohs<yr( 
+^6KHb4 *D#kNnDtJPN
+v̪BE:4FLh,IPV DV{'BvOQ*UFPC,&sMf%MCYty]3߁rI"č8*$ODD]#F従jOtx
+'~ sRr446!AM:9c|yB>C[juǽ3lO(+eB.09u%1ť:uQC2^|GVb6R{xLIfdj\3E mEF
+1\rxHdzc'jGDsf(3 KS.,IL؈:H uA<,dWZIօ Rz(.b}P\32(ltv#
+\m|U͢-w-w}ڃ\ YO0=9+јbЏ~ܖb$-vׄ[\Ք恄 8VeWBZ?SBJ4 ]z6S8 kօq^5wAVþoW:!L/B̝+?" ɷǠ¦6%P/\ C 4m 5 APb";Jg Y"K}&hM|%E1kHVwfɁ|s'ߑ:T
+`=줃;+R <HTԻ;]@2NJ|ᴼ2Œ1 c}m Keƛā¬?2.ڹJ߿TI\fZx]5H-x*У)MR'$17Gϣ:6ijz X /T'XݖK F#t0].J,/0dU:#&ۓ 3;!#7؃|j:bT4뚼ӋWؼV2^,3vXqm+]śۓc¥dW(# _*6"lGV>BȉQP$04IzxD=%n_.p~<$(/X,ȓIS<L`!LCfB: ῁
+?-aTƈ+{p@J9 t9ǃ{>uI`赦rt@^>qL8W&2w}#p❬80,Џ'V[ۿwNזc NdX@RKC0p]tA" 8lg!Aoǵ)D!!͙ߑlf *wɬLwGԏ/Q>B$PIpToUTåQжфP%)5bSuYޙ\l di VGa1 aETS#G* Z: ?~
+ڐ̒3!tP~ !-) c{7&߉JhCv u(ʿ~W!W{,$ OӧOr-foCBXL €1oKfl(2^IƻftV慂Pz[,/4݇h"V8ݫ;gd4\z5/e5^YS*D<G" h+\ 2/כ dA,A=Qq#`>N*7S 'S< C4}q ~VgVFcJr N\Ͳ+3Hy"t*:i%+@oJcw])WqH\D
+**6o7B
+u@ H[d/FҮu[*gdk
+p3gs!ӊyzz 8^| (Qt93#?&ELۅ5$0\٢ưqY
+ YAOE
+J|hsѳ$Էs"QB?}l!['7(Av
+
+/t{e2"U¥ƻ4<Wj-^relyt4u}J6--UEˎh8a VZA=2g`h\ Ɔ7T8_1^+*Z9RN`;mW t<utC!HGoL`3 P˱F<C>˪Vj¾Y\=Qty&xV)I[EX MWv'*ǽ[g?Fk9#nJ@\
+V$ H hX|hc8gaq3n NŤ5Znt€@,k׸ f=iBe3y-]eb_ŋhmlt["Vz#ao
+<3kejv@@Xд^|FH?z ND*c@ҷ :F|a".龜" 6lZRGs8z"0JKW@JMNÌ"QΐyvCvX~*qH;1+._0W >c;Oes5\m(7 =]ʣxS
+s^"rA a_%|8,]o>&iDG-E+͐h+C\*+Vb*d?F6L!_VF?a;Q&'hs譆4[]cXѾn6 ;@k$]^Za@D
+XFQ,u _
+%]1%
+%<RTĒ-G&;}N 0WX.jzss^J(MهJz/LNc6h0|n>3 *,qd7PwM'1"䳤 Sx!Ormc@{RF'ĈԆe7U:H?QGp:⓻'@ ɹp˜Y\I qn^,
+WJh(8T[:ixs֖@؃uݛOG `Y(szYQ kx?)"1&.RKQk
+`8ՌTƧ`v$ZICo_i:?,i% MB_.} L3ܛҚt oDM?$.QW
+_fϢ7cb߳W˘f,«Ў;lܝW>D<2,8(2qjEWVxMՊT'6Xѡu)ա5J]5z"Up=ӫP`
+y7X]U"ˣ wֱHSź*B) s4ηң6y@sT}[|
+5X-
+)a0@Dq@ZJ(2aؒ,i'U*Ӿ \Dܥ,G> Ep ME_
+Zcyuڗ
+؉ih&"7e8-F]ۋ܊L5+1?v ab8~ ),QY!>
+Rx$_%fnX~Gf?Y2_oQLu/Ϩ R98 eA˶u0υP:dS? gY+ŻQ@#^R%>l xhQ%SӪ/T$#ѓI>C+NuM%}2#{|TQE]^^gxW#Uܘ+E&.tFż zL9D'ЉJp/
+FmIJ`gAo2Vծ'|Lv+e2{e-G"JDoXsraҬy\g]Ӿc 犽{$lXaL(i
+84BYjc -<G;^* ei(">A (/8o @w |6ɵ- d$X9jd?R5I"g=PondymhE1h#*XIEziښ(kXwo]]))U FJ.f<2Lma(qcppa@0|l9HaeWNF &B+ySLz4Te&ķ塠SN)n12 }[=38(.PkWsF!ZPJ/e<lG2~Dr@4x1
+2<ޓj0PhQ]Qg呑GVi7k OֈAXosbD( !UcF<5Ƒ"Iyv{G&/Ý7@au(}~M*L'<"
+M2^Y.%)Γ"Qtoc\wAlS}]ٔ `k' @T1"eB>?NK#yWSvor5um(2ͪk ¡؞1 Wp`ޡb4S~Gʎ-͓p7jn;;j249=7.b9@xg0s0!(d9\>z q)r-@h4s
+X\@Ru2AZF[dcۑLIHQ) ?t٢v(Q_7r&'k
+5~͈eõK \֚DMBѠ da4^k˃fޠWCr6ۮB))P16zd Q9ԨM;fIJwE{7:`q<[)ģh/M.3-<w+k[y(F"+N$գzB@
+1Vkq\HMv\^ VFڜܴh  Y{VSd5N\}}Fףx^5Kh:b~1WZK RQ#-MBG8`IF$(I!/w(~L*o'^[l3
+ 4d?&(2Z9}OYƺ J F;b1tMjGD1gK O`h9Tx*5|NUVd:0 :Z'>C1U[sU1£{9qEṘ8!,9 +V1 9MA4JِF
+żTy8@VXü]G*֬ k e'(''FPIQR'.ZK&Dd]=E'9vD ޠk{~[.b݅!Q!Ir@ ʯ"[#ꯂ<gٷB#ByY`<ƬBƚ$\$׿\Oݝpb8];4y!3XR1}so\Hk8p UiZ!%r"3PN Aye짂<6Y[1(@te UtC3uT8{c0mA(ܮ!=هfd_<ʗiC+2
+Y-9ĘCAY[q&CqԜk+;4.c:)*8B
+9w D LPw W(>W|/ ﳚ#/tҺ mL[c:-z@f-y4 )^)®P7THZ<劸rH`ӄT=hZd@A΍Fz+`m,!fV~3sgO؟0ƜDO!〙6|*cV><B͹L@>J9Rb097LkDh'{34I&$׫ {Wk })usz闥ۤ +DB3%R`[XY  h׋+R
+Y-9JN6!oD4<Po -a
+]rI"U
+2-˜V1YGR VuG1aTE .og;aLdF0 $)(OHL,.AStʮ@PKN<F
+]CǖsP&A\m
+{H{9H
+6*0z1R|Ugxc *v+8?_5tiApqrVRhؑ4>OWGkn5"9x'-b-Tr^Ve/i\*Lų$WH#Hh? JgkĖ^1/
+k9Q'3/]o0sXɒSQE
+&cot܃ bț"|#>s7/%mNLz|=z^ng:JL u$,ە^ж*U$" b5\
+}*O#ݫr|(a1m7$FKK+X s\!#JxaE^dؚm\3MT"%O-R
+p V1r
+q)Hp`{yG<) IeHFdlз^)'_.)~ϩ^]"Vׇ~t \^ΩKP׫PM
+"GCS97{  g'Vo9-M ;/HwV!(G2WWV)Vm*0u_l9 mzuUa2m@#A@h[@n'.qP9,--fԉFXPD9XI]Bn}(ߏMnWy`
+r,H~g!1ÅρI4[K(q)OGԋz,y!g\fYs?*b
+p÷rfayFf˯Ózϯ"
+8eEP]HbmK(`'HiGl'#H޽΢TT#2$9 Y:6ρC;uDh ?.] K~Sa`}
+I60$GW|F[C! n%
+b_iCt=7lE4'6>,Ӵ*2F. Dܰ?(AFh%Wh
+HO\7O;!RHoa`V׃:pI%_UqhOա>§X ϾZVG}
+d 5nc.{|?lX_@N\u 0 9֐C'h{JLk{UZ.͗P&b>G\9Hux.eW13Eȧ %Lk.SdCe3c;bU;Uc{VFQd']ȳ|B8ڒ@üKvߨclԝ}vhø[yxg˓0Uޮ'o>(
+.eHc *>h~
+&{Zx#!r@qJ( S`
+v9"uUR"2ի-!ye>',>y|֦ M|]w;Be)AR6![98`g"سta8 rGydybC9%gXyFlUt:Ra[Oة9> EgBze@N‘3 ɾY!JiVs&~wFU()EuN*tlU dΘk\ɺ&Q$F[YXjߩZ헨@[
+8?ܖUTJ[`$U<p6.1wm=Ef}@&EW!.N,<jӱd1-}ݽKPPdMb=)qaZsH0F >ykWB,vF1 [&yqU,Yobd"4k#<[wȜ%";' ru@p3
+\CL!g}Rj^!6VAHʭĒk>UOd?<Jxܯj-k k#5(<xƕbL!  8a%)H9)gXw_=S_Ɓ!Ѱq|cks:G!J! RGRj&9is {A ِ\Wr'^ Aur]N_Ӝ@UEh"@,:XA꼍j77$HMXhKh8CF6w΢4it $BF.%z-p@ǰ;\|Aq&J 1o"C\I=⋔ؑNHO٭$,j܆ZJ ]7&!4{qjP9DnVK|;pdBvڶ!ӏ<ɻ rJCm '3ͫhMڈZuM *+$+X\Cf`@y ģg~9㛫;Vt~L|;r\\BUyVri:^L_<g`!LBL^xriZPO!mT=R2t2ma,&oXC0;$/hHެ8BFz,I2L!K/oB|S7̯{ |+Z~E_ooLyy2.?$I#'xYÚZm+[=)VfnL8|8*
+$E| ]8$KhA{"PI"4`aRJUm[s?5ݳ<|oI_K֋胟#tP*̺]UQr_6 t{C0m7%TE:em#X :6ca!?|ǘVR`"%_,O Keg+!͙rN"a={F^ny")a'R^TB5da(Nj_D*[Uv1o(%QEd
+CIMNM }
+p0XW0?+/Y!~mxqR;~#,G`)
+Y/%w?^n`7
+LqFJm
+͔؆ДR, $b ePJtC( o%oۭɢ6@TC `X>5&\e,Ih%,E8$!': }_uTNb8#P$Wf$Eӯ,ZPq !k"00l0C"9cS$#f$WRL O..-c?dhЇo%~T!̚Bwp`e
+?g2V4_݌vK.j|M
+yafzRU4gaqI~#(:o_oadu1e@{;0@i `A
+h !ED%`$OJj_.ёJ:DߠXH)@`^h"Aj1y)0m2LSEI3i71<[>]6!v{򓲎ژɌLyiSIVJ(G\>(.D}7
+ikT(AK<XQjOQ``86r:ҤHɉV|
+<-;I<qnCYl!Ws&<n~S%d2O
+ĆacRo5^(R(V02VF륡 !+K?ݶKI%\YwD'vJH;;-WQ[o( guS@8)[\Y^e l(!R^
+>j\в|J.
+ ߊV}NToNm[ i7ѣ)3ܱqBW3^&u@=dr^k[x_pʂ"9p~d9R0T ?K|ԞrUYI4+@2NV,c)#$TNbSk&9N
+nG
+K&dm MΆ?c@N5-&UD{h#Vݯ!0S*5:z@Xh6sjkgsq#
+wrD)`Xi^Od $:Q'm
+^O0ʰ)]=s n/x\2Y]Ǜtϵ ȇK@P% 1FF Ed}ˉ"D[*{0Eɔ9ҕT–6C 6isž 3:qQBO(_W! k"mH*DLmEޕM >̳m2 ָLzRRDx8#跞6Ox_
+D!%MՐ?h>809teTgPIy 5h1CZUvϻȀ? /K`hHX!]؆"r~ !yG;T"$!9}΅zXXۋk.)ƞX.ymoT
+7S[ q
+O
+.xތ}+ ??v#sEn_ Nq*7n
+ZHcȬ6eG@Qi73[E98]Vw-VB Y2AYřxA*
+]\U9tZɶZz8͐S>FOdǛȫWWxk[ߣ]4 _P
+M ]ȿ&U\"2ooӚMoA[?~ld+ntASm6׎2]
+vG='a7abj/DʰnsPb,?ɋQ]5|iU`{*Eg]'A".)K= <&qW?w(ڔt1X_7hQ=2Qfd7Ӕ:*lG!'e3A0AlWHn=Lygq ,;CpAu/wJtIcףG@$?3y7^n3@]ͻ DNJH0?HrqU||σ\B@'i:R $/oOhyd .vJCZLs `D=-~ ~IBXV?ʈmgHǁ.MI9ޅw Z8l5
+Сts'<cG}-Llv2EqTµ.jÅs<ЄgWA,[`iS
+&7b1sT(o F4YB M
+/'DiBYn(Pe!\_?ʞvd˄@U &4c}e?#6Q1#sE
+!-1O)_[AQGuQe)]5F-M/ &߂*ߢtţ9T9uF0 g*t&
+fBMTTȌzLC.s*X1
+]m=Fڑ.] 3G/aG
+Gvp\ht+9 #ga`bJ8H'],qSb]l7\ E 4pu1&*\>)!6;^kAUw^UȆɺG}+b㈡T"Lz7e
+QTf!cqFqx!xv7$,
+]?WYU1w 6ׯER}WhDՏP=c"`:A>qG V
+XMe .ɉhl\6JDBI%W8>Fv ވS>  f7]1e
+j.OUm((cJ0Kh[NW,yА"So..sQ0x5<DF9ئf0rAqLu¾!6dS h@;an#y7ƜALɨ5\c@.ȹ:NYJ4HZ.,(*ϲMRĻHbAEkjIY­]<xɱS~*F=޽530@|Фʫ.'U0yvxI/8Y>_%  ]P,5#u»"R7.-4 NP"=A "pz 9E`# x%KqH&^!>oJƛC5%:2RO&?GbUhI`jW1KP_@?gcBއ]ڧdzo0Ԃy)h|%r$.^C2k?q;SpD'CW{TAMdI,M9'@\>Kua!,"-&
+Y[7er^y>\(d<HG Ga \&%\pdzkuOt  y y !U&]t'5 _%Q4q=]C.KleB
+G
+!F{i>)KZ&"= h5`/`U<^ =A(AX8IXqzM4<ZT%Q0JckR'sMȗgeW>JA׫ tl_OYD.Q<
+TXHJ<R}7v$u,5"%{,_^m
+qmhLl6ɶr+'YRh%D Z6\կEDbAjC
+(mbq*ZkYfCᇪx_O_
+P6`:w1Pb}^[<4|dxO̸|1y{f\N1't!"YЋ"/gt|5GcT$/}|C*pJqY2tdۊle %q#g-pùg&PHyX?Jz9:U=jgdX+h5M- .
+ {A^XAzqbߡ >JQR\
+Z9Yd
+B"ä;-DЬ kjd
+y `H<G7QKc| i[M\ht#rX2- P\J{$U, a@]2\>^ئl%oI arz{!op $zK,ɮy 캡!-)v*+Fee a$'Ώl3k27Ag?<9C pIl Dml:I2hX*kkP>hcEG].9<kmjd`Y>Y{h~}p
+NKJ.{z#Oo/i- jET r J`ʥd{ZL~tVdKDaAԋ%Ir&<(BOi $t/͙Z!Lm3o}krP7L, z:.R7@!(QV_1= 5*E Z`4Ltڜº9d|c;",}i0[R,zV ȶY1p~U?7/#Л7~P4>!cT5B'T>CĞBoc"^ѱf=52]XW
+Zd~y_U܃0 931}@
+D^uKf}YT JD2EH! ]BQ n $I cOVU$\k(1wt),zR`YmX{ jyQ Ood,xwVB :HpLhĽKP'
+h(BX}sPaLcM~[2VhUTz"B]_xlCVBvj {p.I,Z6A0[X+C TSH#9 h f;R}  AIM 6*]xWyOEd5ى UÍV
+>"gh=6Zjy3 b@L4\\.ZDLk PViA_/pGCK@0 uNB茺a@
+UPi/U#'+aqb&+RMd s4&
+qᔻ$_^8PsbPrNY\0$x巣gX\Zy <65C1?( {R@ָ\j74 a uxp#^;e<ڱ
+-J DXc}_nY>`L[wlT砯wj-,e!i^)Pp*j A Y%+ru{!̤;r`ZI!BrZe;J6t9ƈbY(UH)$C3dNB$L<2BtSGPv>텉+7a&p }1%D(Mg@sA9ynG%$5^(זXN!K\*L#S$9+R !Iy8ȹ$ـ)p/-1M4P
+Ð |; **0,dUFQCX OGj yP(o'ᴿ{1͵b OɆ؎˔&!$XW ]jQ.â8|ᩚ@KqF\aua>8{5FxV;yՐ?#9;#ˮ81,1i__&`y]J&
+ u xi <a-r;MJG>*U
+ϪtPO1ߟh!_=tsJ6b'H+'g@R#fW5_w9)u{PvڝpBKY9|aG)} 
+rC. $`POA
+ᗕX[&MD1_=F&M`R`
+Y 2C(-WHf|=AЀ%ƯCƸΓxρj,>(Br?l,u_u:?H?qIIQvEn,s 솵 #='ReWVPHVHu_[ I^i_aУX7BE c!Kݽhb@g; c?91i-BY|60wzIp`V˿) ̐bI\@u% ȭ<,ϜyZb/h\u鵤-!4deS*e$@cMJyVlN(AlC^0.Z}/5ʋBIbIxBMPBAj
+I3@5`W`ST9]^*<NRk;#YX  )t3'!K&-/!0>
+_X2G280FeT82IC K1dFP.|+ntǒky?'3Y 5AU0u:Gk4qU ,bgďLCbX*5bH8=H4q
+
+#1vuR;81E .[%qY8+ef;:8w9fV?ނ M,`FW"(' eX3R1 1#ФDs&82T}Zm]PK,ԁ &DH=!+X[ r
+V(*##<nJ̓Ĵ"Trv !1WD!ak10bX֕dD.WwP{ɚW`]+}ˉUQѓ5{:K{cG
+h0ta_ZX r (+`<FփUA+^ܰ&{])*&GdZ7
+Hy]@?}PoƵ a
+0 Pn[r>R=t`<ĦXE'Y_ԓ+_+4Ff̉!(s 8B YBJIqFV aO%s~UX.-4=فk0
+M*¶߂]*x`HAm
+Ӝ(Tڣ %)*1[J-f|Ԟ"'\PN 14ʎ|=PPՁW
+^?0C|)YREX~)H6kYrʠ;4ӌ#*RWѓUǸz-9lf fz -sE2|$?srҗ8DJX9l$?gw!*Etht<)V"?}5(\M
+}'\BwjAtDJ$( }
+"x[?Iy+Eq=&WvH.64^:nx%%SOXa kl gC˕tv&eF <jE[CL!Z;[il> 9b;܇Jm:"y?iYd@ )rTל%畽/^*)\~r|ΣfEg[G]=];Ӓcn.ߔ825|<
+6Vr{_]cO4ykGʩ؟8fg׏“|Dyy:#JNٯY~s,6wٍqs8Π/pgGrDW#SŠ$& Fr󤫑 u\2ԝSm^_1QvqTEŭ43
+н|$F+Vw>bLA
+Ңix~me'MՖc~;=6{Zr`b$ɤݚ%
+I 3{_E!ҼQWAr@ivo>\~oC볷zq/5?G)vSOh )"-W^Dxn0="}_ݸUrdSr\ZaDlyTwY=$~K/( KZf5OnVv+-WQu+wA9 Fr 7"B]m_`sWP4O*u5%cӼ0P-;tq6Xx:Ol>F_%3Fm<ܵnhҽnB,;()^k:(N+nȃ*
+g؊$u
+V-jy0elEHԡD-8
+Ԩ}2]J 1oLeɒWݼ fҡ|EX=Jzu 1(e[`Ey_nfp軟)o>{lե6*E>j{H;-굨Dα^JDXFVhܮ\yF sB`k5rrTl>M\-ߑ3|w&
+j+._ɛ}g$`ܖ=m[;мB?UTpgh/3;:w7kJ5[`H/jZ_>GEƞLG@đ@,zW8ؕ0ҳ 渽.NN[Y^(j)-Ly[ z-RΔEZ
+#ƦH9ghF4=\FXGG+!>K}/&.DM:D^/ӎ1c1\i{,ڏ*)Dq>q.܇
+T.vKAeygw(ˌQ?t) !qWI~t~[,/kZ4/pтY؄!#I)w?
+gvŸ􉇜;YcAZño%~d5Cq~T f|(9m/`8EAR\뇒@K21IQ_C<KB+z8#-.z˻@Q퀗w}[ k }fAyqRҎ2%a%?zr^FIIo]T[ ǨŎU,5n=8kRʯيŤ?*](=M(')1%x4x#.^Zұ:%uÃ9!sjBW!Q9n\vW`qmzlrn!㹹$7פ([!\ydpI߿z2F(t5 l8 54"XhƼNMqQRұ23F*e\L[NIח-ًp[NkT-.g[]+ats=@_xx0ze;1d#iT)2w3A+wm(SNh{mk6KjE_oE|jPeO
+G \R4Q+h(u^YG{k4dPu+J(a^EFOlq1 ґ @5>պ([P X:sS]rω{.w;j|J&g'F M=%@GMh"Oc CI pTNuu'y5[$=%)ڏ~{Md$W HYJ?tÞy5ZQFdp4xُl3SaackFXxz R*,>7Sd`WU.y7Q\LK{UhsxL܌_7݇3|ExNgwn9zPGu⠕yҽ^SU YG-1v<s"f<y#pe]KԊ0<:`o le:DD_t SqHV>iݻxy,^oď]Uk0ױUVMH/q}MU>dX<u]i y< a{Dn(}9wdW/ oaȭk6zFk/+oe(v8QO¿z3RnS!$(]
+؈kVҵ>a$Mcwt+3S΀Ɋ uQhrA<x\䆷Z,8;{J,7U-/e,ۘC@v]yy?4KY՚賊+a(c](9:CQ6X0&QR0?2ղ5͔vIK5z"uT^Hb"i}>#wQA]9
+ú(W.d
+O
+HK7DO0w @&?\od R7j/dȭ(2nޮSaWm4RQj |~xj.Ts+}Z}lPjU*#EެO)%=6!QJ1넰+ZV㟏#&I$kz>ܰψ=f3]Kj}Dԕ+BQ,%Mj-!Z ,Yu[
+#a-+Z XZaM Rk'RF4Ёo)(fhǿBH m(cx^9n0P$ѡxM{$*v$֑yL@hjyw+qDYW2䎾MN,(eA_N XSaM29ӯ!ೡ7y5m,2K`O1g xVdgCh5i#wZ&W7((pY+2)XM8fV0D,ɞWU'E`:sJ+^736ayN#
+71|M3q[ue(T`>m. {f?dV4,OYC8d0J=/-WA{fS0&3P590.ԻnRq6줞Hm j$ W[Qs)!{¸U5M?0ʼnzf
+.Ra]| `Zd duu=LupпJXd^U#4MR\Hj&գbKY>!bLj6"G33g<DSPv֭'I X!!$ /as#2T>y F$L>8ȨGs<U.$/>a~l_5?U~| h#r|C̥˟>A8JG*>b=C|gK^n}+I
+ynJj*q>kC1G9Ax?_ :pj5Lm{̫szE9Is,`Fm"naxBB[
+@'X=7ԡøsO MJN[ Vbo:kd;)5Mrf q@ˁs7]E c/A"Ifzj@&d* ~@)*DylP=$DP$Jc]F<',@05VDD#WO
+eH1INw<RǞR1+ ѢC1JZr 4ϙm'v'+/ޡB X i>`)cO=P}q
+elS+Ċ HA_UH<oAXփ.  f=&4exNQ|Љm.v"g>Wy҇ȥ#ﴹvtx
+/*h ,ԃ
+}d aEs:9=C^_p+ ^"MJېg*\a
+"+b`o2=˱ZS$6nN n%
+ꗊreڞ"`<f[8CY" m)yKhfXc1,yBcwcT^+
+.Z':2MEe]RҒ95] oJkzį\YLߊ5Βi^TZueEc Nd!wrngF U` l}GPWE]4~`2ҿ,6,I+' Pet3iu)뱆HD9B\'Y_L۳z ^4 IHh
+ǬJ ;%$Q\pr#Nx+T2f<' !au7Ƣ<omvn0>#GrewXE }=ͨn^ZbC*{{Ql!!w67.FK)qp,P~=slYlJ':}:Bxlsi [\}Afb+ք8[yr
+|^eCgjo 88W1,+/)R :[۟kV:0fKB+( _oتў$" Tn]bAܙ췔Dbaug#~SO|>kpI<=젉.@ +si%s(!-Z: qmUNEu/;fMXX9d:r=tdVmĸm?"ю9alZxB) L {qK{)G}ګ1]Nタ*ug
+`w_pQmEA^!3m)7+1 p|ϣ(,lS/|ec| ~ƈY]9FQN vy1+Nd{(C2F~KCzRG<fx:6J`zFv-C0
+?gB|;W!NK[/JA)焞Cj_룒H1{? Kx8_p jc>maW ;u#Raȿ$4os4MLm;Z{qj8J:=ty-
+G-$x@G9mWN&<C4c>bxmpךlԋg3˫]~Q6$ɣ+oEp,Tj+^0kaJD 915 0Nb4,"o7i :ބ-%.Ęג`nyU kj-Z+%Qr/j͞6(unfncu[H_)F8r-uMN1?_v(ѩEa7x)" h>"-%qϒ0< ݋15Wݳx" gY:|"_kjDKrݜQJIn+S*)j|GrJ,v[Mcn=q pN3\uLi<?1~ꎭq"GWO"*?Rt1lpO
+:6pD{nK51,"+%M3x3+pƔXd~~1*//Rޟqd 3%Gu=…%G't?ךoa`VE6j
+@6vv+^OB3r"7P6tՙOѧe222e0kTݘF;t*H͠69ǎtKH5S5ny>ŻHnEQo)m.R:N ]uk2 0h8L -W(YwK~~kʔ
+}A\k׻K%(m`0~YJ6ދL}6"|;,TPݣ)BJqrđ!6쫜$ʫVDB1uxi9[qwkq\z+H$taz.4@|.S
+XsA'VɬLUsnn)]/xxFZRbW
+g4aĜL@|:cS#v\ o'E9%8H;H*۾[ a&nL wV.ȆZj&^믫u-Q
+LTcar:"GBJ)ɳAv_ԁm VjFN ߰;<9oȍmd$$BRU
+F/! O½z|Sb>98޶7rx G|_޺^&s{!`w<>4
+e<HVv `uUZbkcu0@
+F
+| fΥ޴F8 .6R:́ZF42L\G(G`3\_H_)OJ~;r^,džru
+na:Cu˦&w ω{ʾ_p(\
+;OW߯j 54И!C$<+\ik8 CZB)Gc2dV*F~!뮲~= 7+x?H;o|N:oBY{f!MeHZbR9*Ɗ
+#'e>'v{!
+@𙥮w rPk0۬ƒ̉QۣQ˜(ϣvaI&Q|Gc \{5ӭQAJq4cɕGI!q]AFM1QdW )eMGͲtO_D<`^lu:G:d< 0xW\%̢}(
+'{= j>]BH5<>bM==>| V sT}E2ʚyy9/W\넺u{Sw&a{wJ:0nZ7"8If.ͩ#AfNp<Dim(QUd}b
+9()ko脏8a<Yfч㞳k'Z+J$cm>=>JSkKjbJ݈2(0qj龔LQxPn9 }纻$K=CD%':u[[+Lwv(tugǏָDMoyYGkMK&>`j lthpJȗ4Ckiw۳TǏyFQ#Uw=;fXn*i MVɖBso-sD=7!
+u_d(%>(%o{(>&%4;`yu_ &%% :j'f,YZâxÅaX4(AtHM~'ԉsiZØ9.hP^o45fAoq"g$M&L?ѣe*ֻO1,#žƣ9L"n]繝X6ȝ>fO^<Ta?L ǵ7%ɳ&,m1ǿ,_/ ?4mfzV<g(Ī;jPlhHD
+wagg :w6 (ވy^WG<_Um6i$U]X{)FŽ"lV@K:9c01pZ0r_(bIOK QF/{rכzYkJr`(9i25D*GJ%r?QfBE|V2RQ"#*5^#z6
+6bF?Vs0/ku9{R$>O|JכE
+GB6p Hb^*{]T|uWkiK@0璗:,>,mjv*J[3kMΥtW۔rQ5|īNdqBϙ"$.ˬY@ï
+g(d?M%[2(!Y<BяͣL{hSZ+սǙS؝ sI%&!4}Z]dVCbT) ezC Xe%`K\6^L4]}(KG7XHą%V6NėyH:\Z1-%Jrv_ŲM ȸev[LL4v4D
+s; 8d~"e'Yu~HRѱNv]jч Vr<|KǶ4Tw=b8~CX4$N%w&r?~ !75& Q2
+_6#.3L9  "a^Ĺmo8,JG DLj}^AHd5z,:o#%)Wº`MLw
+E{=FQ,?/\S] 'ܔm cŦ~?F$%ÔJ-l$ؑbJT^ SWl/dΡ%jD~6}GҔ$
+|#${ۼ|RyZG厇t?i҅O6G2M=۰*KcIJ}u4F=@?/zuZ#9;Dbl<P_^@?Ѿ8PfOj'?oU}"!Mޱ,?
+qcv!C]L٬|Vap1]XQ&- &ba*w8w@ jCr QbmU B'5~_&q+{ͽRbV ,q;Eu6 netHcI;4lQ`#C,rS@ wr+܈n
+(y.#7)IX˫/l2). Sjo>If2'sDaQ|$d<@AHRu ђ]Sã0LTo!x-+D1I"zQۏA=# |lb7m,xn8i_}-4/ws-0}on^ſ_\} JQ8[ 7.?*_| B\6HU}اTA5pn1㒦J2p)Մ l,`Zf61p6Ȼfu"r+uC` h熩 ޹_Ok^@</Qn l1K:OÚgM&uxƀ IÇa1r@nAqȭ˿ÕyF .ʪv;İ|
+qb;sr\֞RLX$1pϛ'! vJw_WLC8, 5&a%͈dJg||;L0o3]aܒ?ZQ $et)j5/}R"Q~.`2,ZܦV9'M-PϺ
+3-j#Y&ov6+8yB:e-Fyқ6m`A% 3]jox̢9b=~xD:)^TL!NyZ /@אZ !":L$cC:GcQwY]Ml+n^MZ_}m@`ؑ]Hv@3m dJru,:sCȀ␎j2hgǹ2~?ͮ94";ppilDS:bc-,'#"D2CM|f^!<Pj<%
++K9~b޻h$CK#?7>5Dz챑?Q#H{N%*qeGA(v tߡFVNc
+ be2I?#J^,{PY8, a+q}$OX~}Q'qcKϟ̭|d *ʥҹ )!t@@`Nf̡t7`ƔՂ2r$R\zM
+g8&D]
+Xb3;Vu|S ۏ‰aPq-eIY" q,eR
+I`r6ķJwR 6`aX96_Æ'XJa#`vVX7 z *h|}M%*RҘ=qqE֨I}8niX6UkH ^ z`z~ڮ;oV #0׻`hˆ:f!Sn3J2_,tsC'm',itmpUӠjA~%,#؂:pd4&\CRX$ B--}YW:I#!7eW>Aao|m?p?J(9HOŔǤom 24Kn0PN-yZ!FtX |&K}&Al1Q%zˎ {!R ۼ#X?si]E ؗhAvr,)."Z\Lހj80_s=3&1as;ko<11P~l1]
+r#eB/#vŲʐ4&jc5-{yee[vs<nK6*Z4hq?&?u J!8I~b&_MyaXX`DOɉ7#(=+`@-Х&]!Z<U/ 6ډpG/8/-zI6“+p;_B&/JyC5\$ /;4d<B=Jﷳjʰr1 JV)a&
+F֣WT}/m*O{߶g`[t$%A šjƦrcccnH d+MUl #pB(s{{X&!!^Q4' z#do8h
+: {4oб,c
+BY"Z=&2l6{6 ǍΩ4 ꊻ
+C9:aQmF#3Q VH!s`jT i 4+Bq3pcH do9` 2a{Gp/Z}1 Pk2!HR T Yb&9%2p~ds"8 gP⣪FZHX`t`Z1s:ќf ,aN!f6ZQY,g:׸a޴jB%B߶kBް]
+oYlx+4nx/rJWnZWwI= b~64A"cƛa9&F̲΍Jcv['RN26H_j9 n V䮡 1 <CenMcx֐( ЖIئ1Vcዳyqanhp~s, ~ L@n8g3GVLVLGT@d] c$7ރm"Q4A}FcdY2M+E$7rR!o)}HߵǍ)I8 AϱYN 5qa@XP_LYBAHb5
+Khqr6UAZ[D(Z<+3-.߁TM$%G!!t{1Iam!2'gֆΈ^ڢ*MDRosMq!>H}-Q9IJz5\loh_rX!>sS;rwZN\R~(~ĭT=n.6*
+@yN1/Xخ%Ϧ9OQQL\o}z~G[ hhrӺ
+Eoc7Ag*l7L`P d^u8l5gQMK$PB}#/N[nk͜;'[@=>'Ȱ uƂex+L!ڬ
+0*AJD>ؒ[m2c#Jx}GPedhm'%V vR)ҨYv|_ǢbZX/FI2O vdzc [FrH|tLlGiA a*%@Br`uD6P!sJtFX1Bj4%09qLZ&!+kI})W;(yUBbmA&diU!k40mt|qaX*luwr0·[
+-cxgn(Tٹa+Iv@LJJY|u> URE:&"Dj?
+]۫CTEm1xuoT`N"JIRRW0)A$#x$X HHYAvu{qw \wYW&ø%.<1zˉa0 kOar^R_
+bV$=
++1i
+b˕VzM͉ڠ_sqvT7fg_,Y}=[ֻdW'jW'8}̩ 'G2U!c@!la\wx743IJe<) )e}
+=a(rt|O.$2)Ω&\Mt),o)<ީj=0(.2{Ad'bD<s1'rtQd*4D7ԙ*)S91^7ɑFO;
+Ip=^-f=51B=,gKqhՔ887%[IhkwKn ϪQNFlOEÉfpR˞n}
+31FӛK&m݇+<l_O£;t=֝"%61\s}3:)u O.MB@l~@ T`
+@L^诼j<ݶ'/F@ {}hVvjO9XՑSVzm7l\lp¼ w= k}fh&4I苊Nhc1t&y?ڤ8)KeP&Z<F󵣚z9@++lC<fV#;19)^Y8^yuG8[>ab_N;%hmFuM7<3s6)z%ۚiS ^/*s ܄ea85rBce85`dƼh,¥lٸ;9]B?4fᴒZ
+㷢gD|?ሾoO^UԊ>V?!Ll?S d
+s(E< vEoOO$6@2rI<3I%bcY5]qifۯx,߷_(1ú;EDdg+RT><=fk"Ҋ=%k&mO='?':m`}M &˓>÷n j?zˍlٚM$a7}n)>Oqʹg74f/%}/G/<īz9%#j]5c$5wUa,l4óDt{=f,xd֙#}! ZB%
+\W9VvqQej÷u{iOIa5j[/Y|w<Ubͷ eMU5{WΝp4%v!V(9ЗEvnz<MQvѳoE둈@C%@wkJwi /ڤ^z:a?.ߙN2w;_VC\51v(_ qq9B[{
+X @C U{@!a{w\E'~I N9UF2O-7PQР6hR6R/E72&j
+]3LGtR>w
+xB\5 ͙k` n~Rv;s85k,9Rn/8a]LI:͞|JZ|>Tx 3Qik&CTԙZ7Cg
+Yyh*-JtcLQkh{
+L~*Qc/Ujfm
+}ZǸT(1`V0!>pMT3} CWhkyJ*ԣ4
+{%1b~kfJ둰E $VHlѕz}Eר!_mۮQtFnX&|<ؑ' Dyh&?~Zlͭ0Nf 尹u{vnŽr ʎ?)sDnXuFra0Q9@>1s=
+Lc.Q/}93˼8_A' 0Ӊ]0 IJ,/*KrܺxZ$
+\gB! |!TTmj;l[N| ]{FSd(_vZ.QjqvܙuwvʴpG]1$Ntayi 8^a/N}_ZSZkOLBiܯ!fGic>@H*,w]
+OkW<Sc?
+A0<T-CpK ( yoWonP2.oJ'_%&~{>m2-6icEe0ªnx.Tz=>F5ze-=me*s=G'j/*2m}c+G/\Q-?ݐG|1S;^[)Ӿ*Km0ab"rnS zv1oMjK4-foq[7NN2 w`APn5,[o8eDYVC <h :}S8K<,湳n#&Mx ȌR"9lQڕL*h lʮ<ͳMLH~?қ27ׁ3RKX1r0OsN]cmz`o-%#Rw)w8zɩ(.Z$d3?'N 56فlEn릝f]r⪞tЄu72 ,1Ǎ$i^d[ٜ[,:VWC2Z㥻`N=[n:N(cnYZivBяSזěGηM}+`%<)esI]s.1n* 3Dyt|ЖltrS;EfV
+(nu/ ktݫk[=ACzWk,o)_pw^r9sg zt&14me:l:hH18xhcǪ:#7yя}_v?׉[ޠ( G
+~TWN8B3${T,sR\o--{fm;|Iˁ'!R7d}
+||>ط
+HAd7DOPwȵ'$Qg[1^煾pU* :$`#[9J9>=GyfӣR[ϒ u2ju\>%#QYkƘ1c :c =FY\4Ghz+V~!У[k󂄇u#uјԉԼ_>gOqnV8#{9k7+3ѫ0<yZ+uݛU̕{bo{vh$tNQm$QmhsyVچDs*VfBCko]X/qAHsWQH7ag]H˹Z0v 29)4Rɏs1V˶7ӬeݢD#_0=๧ϖ1(dAႦȚpƼvNS5TI ZَSPV%beCgfQAqso^(a A v8یsxG Ĝ!l\%n'=pt֣<one19=k{Я[FFNjb~,YnT  UI ץ玪icLYPоC3[ZɼpC& @b\HGTš[J~ PB; "(b<;=ٺNȅoz束P{ i~c~vW jzgP
+#n 0&s!/M[$]<b_jI1L@<A
+6tf9&%o۫Aʘc- Ӱ1U꼭ac
+
+FC]w-*,N
+Ln$CǰyϏF0#q
+M>}c]oRۂt ncЎPx*޲34OeT|8)'x%L<bu 2Xgzu`.-ux"MAL|֢lV_AhbӘAɷK9}Jdo{Jc5yH$ɀ * O[k|ay aX‰i}(o51e6m0z,%]JW`0c0P:5|S0g 9'bLƘ5#u چ@<Z%T[$mFPi֮iUH<aR?IvSr%[f+6b3yd1+VS\0cWU̢0ee^>ϸSZQv^˝}e)Tb1~/NH+ٷr
+eD2!Ɖ`[*E,`
+
+:cY:'(0,<tӯt9\o#/J(}Yv>mˆH 짐n!ɑ9p6 ̅Ys()4xO?-·YBWQDB%Qn.N]~ Mp+\m%|if$UZX黠;6muaЄ i@stk$B~W4z
+
+儘0ƺU.2Y* g
+kbFsȿ۸_9Bd% U58©J4~\ASʱaaqsj]~`ckT[L(b<nߧ% 9U7k,!zütL.Q}Hs9򝗰ueuX̢Xhɣ nO-9A6v >u!K5[
+J
+p]ËQUW}/9ԭx%Ly"dm. 3m AkKwWllTU$>Ъ\T{dMr/$ڛ+A9?Ҁ3d\& ۩/iO)BviT=cTh̡MF?Η~)U?>m\}7"`tpqD~xSE?9_~%\녵"?ϡ#.}yA b\cY~0t\/ǁ_TE/D܏?+zwQ.T@/ʰr}xx7P@oPnyoL=  Gnb=y|q^j#2˰NZn PxaoT<\ܯ@+YRu{qo6mLYe8*hX-i%Kn> Xĝ5ca >i1>܉ < }g Cz`
+:b%|IUND"<%3=!簣m6z"mG :'Sku(2.
+1\ON|.J
+P|s3B)l"1P)@gCgXL.."M`50jH`5sY,(}Բ_(b4 Y3 X? qp]rkf^ne%A"
+
+"j#I8`a\Y0E P <VsYOvt2
+<- 8BUٹ9#1sxYtym67<L`˛o)NJ-ߡ KMAb՚xhkeNSL"vnjK-a˜
+r΀CA\߽9MZ4MJ*Iq$DΧt&&hPڸQ¯a
+7 g#ęV oj\.& n?.4ؖQ#H롈O
+DvKmRMRJp QZ^Z%Zf!bf8hrd мu$G@i;٩0jA;wҥ$̩N8\TMa3˷q!Jrc\c7<VLK{OR>$`ְ,ʏL{@!Xt-Q󰝩-kA`l"E*FA,۵~Ž'puNR` $3HmKd+wߑ`}A|wECyC CFZH
+ lB^e6.Dv_s笊`.{Ȅ=tcR< ;)f> Sp'#<y@"'Vcie ed⌜ ++i^JQ|F^~J{\  eMEB+AC4QAȸQ7B{&,v<dPKqq@ɰWe#W` ԇKq֗[TB[asosFu@Y,v,<$@BbU4azspTjDU*d!׼/Ke7Ioz@^a ƇZ䄱*Hx+$; B{uR#:i=葹k8K0.9`+9ZNc2(~{h^ՇYO'?4J<={rˊ
+^&VsW;b(zv5NTm6ۛ?v
+K##̴ `<hw(% V>v%پ5T;$@VxFź tUu>#B/Ay$*$ώSyI(1<RMNk'nw᧲mI`#뤺qLX0*K2%Ž${HA+( m"pt3^I2LQy_ь@ D>>yIݧ82 o~} \gaq ETDSN5n&1s(1$z ҂٢8,0jȡ7u8˭ah =GE7E(ע"]"X\/
+Q J"M!//F3ݝYJG=K%U.1 1
+jVL-E1PqGL`vQB0W65OHP
+4Q2\wilȒ$7{+HѶ&<L~ehp`+RF=Ī%h9 )vGhNT6̘PBdT<wSQ?z˟QS</κ-%NlU:T1!#c6xrG6ay)̳ í#R{:CMeǢ7 &&<!ك7Gt,c))n y4ɟ|;ZI9P<<@S91Dm2tS@|1Hv6>zbzgggA3`H9PX іIII.{4m^YFoEQwyDN5 kVNꭚ%f4,d
+5V׌ԏE!2lUdBE$e$5,kX <̦#Ƈav֐PMު3QCMk~(f{&] p+L0〗6"Gx "p0.o-\F? y!cVZެpwq
+5F"mQF-8Ҙ'v$1q.#7Vdq SxDTV!rD"1|zCo97Va[j̛#o<^LvuZk @Д29$cN̹tk
+M'c1ҫs Rmߩx:!~46e$?;~CwcF`n+V߃Yԉ9oŗ:Zw@'ԌӾS  yQ"҈C^ 2'QUL;ch5
+!*1 aL0)#Pه? f6i"6C)nNуBd=atj Hv
+-;p4*p2eB$'% Ai &aH#y!S<Tl)mc?yݮ,q:%lvQ$V^HAmK\rA=|Q!E[
+ᬙۘyBy<a9oރ(rq?=AVϘC,DR$,K֐v6,motI<ȹZے4eGb.GP)'ۦI~ʹ^SN{)]$H]i2֬2Qkvl3u'8[ C`M
+6|e
+y![,d;T _3ZV@hq"`M7>SU;.^E}|ͤGYn
+~X+\N<4m]!Ƣ.'Ať׆1ٲ,3,p/eJl#ʼn62plrjg%ywpYم^.<) 'nNaZ\E,|se^)H"~/qy7 `ӦJ_8s;[ar,j7zZ*&ж'ٴr_M(c)p;'5}" m^RfU<P
+dlOLT2FAbo([K)(ßN_&VCMZK3DFӺ0
+cg
+~EwA߉#aLi]Rg P-3E}Db Mop BsAWa`t~M
+U z> zt5g TcWSd7Z)([|- d:ƁL
+ER#T?`c%gz"ˉAlX<3R $A]'[oD&s̳'1ޫD{/0Hnn[K*A_QdvV̔vƛ|@,lL "ޱ
+G`X˸am\"FB(|M!"#e[F苾 @,0܈YF5_Z@ B*)r5C$!` ӀH약iat5``OkplcAQ*
+,BE6,UEmA"
+DΎ3y Yɂ %DF\Ҫ?!q>b |8;
+ UІٶ#*7wLR&*zpJ X
+yq}h{14`Uh=F}(R+v~
+be99fνOWp{
+N ;CD4k `<}"N[ю5_|R.X%]=Tl'ë|R ԇahZ
+[dVZ?/3 E 23!s8vTzgS>5;
+v=`|#HRkC$e)uyElE^J0[#"leȕ$NB.}8ZE+42YA~
+}K}; W/y2$7H5 vKn$9 DO;
+Rڳ-zk;/iLenOXJEKP8nda@k=:!%q 'X"pӞ ]&$i%e $_Vr鉥pe3bRv8! DTdϠ89s"`ɜ5" t^5*1TE>#ea(E4+Qހq8h_ E WEO—E缟&I0 ov$~0r]
+œX;aDЙr
+\SŇ 4H@2 qgE@Iy-R9xjK -a$n ~oҔxBٟwJ'ϩb
+yDpvB D
+َTi:Ҍ*Ak9MaE`kLeļvj (dxV2twKRq[MOT]0WG
+h 9t͏vZ&$3$55s=YiWaspY쀀P$Acn:v~8Y=+Ie"ƕɥ*
+acV[S$F9謃]c5L5}ehEh6&/ebXm d/:JrAJbR꼊HJÌRZ[f[ޣwaԄX9~ 8XcC>
+mlD%]-: 9f ;ג“{hzR,USbjx&7<2 ui2"dKJV3?H][uY
+WOJp3V.n~K8(͆g@38ê@ȑ6PvljhQZFt W@EDp.*@S1\qko=h MRp6l.܁U~IiMؒ~N;I+j$9*qhSݙYWde?|9Uʻ0G_HC`61G4G]]yPjՇ1amM|*Jaj"Q@RoK~儠&moDR͆TXϓ# (Ap^ )G93!mUA Bt ȹR9EV`b<EGG2$MfyeGd$
+8xΡ&eӁ0H4](2(JuU AJmc|\by
+d ֛bs >
+{#mc,2Q>k=6$ΔEcƦB8L)&'R.6eog/x'"
+ >jAD^A@jP"3>uA/P i.(v 30J}Ũo)LAr HcGڒ)q8D&77UozN*/Zuk:ٰץ\j!7L.ުdDI8'+95v!OZW]@=2L
+:Ek (¬
+$%}յ:J
+w9C<gs#Dz`3hXs>2cБb8,ڲ2!fCXCIKEHNUgQ#A:Tbe, 9N!_1DQ$W(]dqAa $X= W@&:w# "x[44%ih(,SteS18+"#C`-uonkk8 c 1_ yzcA XJiݒLDZ
+*8j3.Ќr*rGㆁ |lKR@L
+}MbT.% !F?^Ʃh͊,]=NUޚCP x?ʝXOu}JI/[kC2<X$)
+B1EOEq&dyVR貲Kt
+g2+yRcpp6 E Y
+/K/ o$ ) +T`j)zcyJP\Kg%"b2o|΃m l"!e4%1?#,SC241$˸;!_K[ 0U㇡ȿBvܯtٹN~ϰ"L {F >i. CO,YK"ﭓ W\ϘasӰQASCP-Ő fJTUQҳu0>-.X۔w115@zUyթuQw(IOF&QÒ:z,lEŷW^jBu]Gw m(dWF.VaV3)\SE xT cV~~{G)-:M-$]T ;^DOSY
+lHpdqrx\]Ζ@3JQP=^Fh½s\9!^x* y>5d=uJ$
+ID~̋hB6Լ@vв1xP% S9#;(۶AўWZ6 8,uk6|ZP:/hg\"1bZu`BjL7*eN|`
+1LSW5UWh2X[> ?&WXvf2SlŚTlCZvH斔?ƘZL\ԃs KaK]ҋ\U@%
+ƑS3G"#
+
+Q.qO*
+LʹD5)O)<5҆,aQ. 5Pفk85 \oHb4=L=
+(zy88`ƚ:R2Re2Oۡ;(س$' ]Cio
+P,J }}a{n/@ !E;J0&|\jIcASq?SPŵNB<٠vAΤ뜮^
+gcRt(VkJ俿(H lchiLrNm]с,FBi,B(ΔYٴ/X^e: VrHYHHݭWaHl&Z1Jf2Vv~6l4r6
+C;]^M_miJgi\L6K*{=C<:2bv3D\NQDpTט=J ΁lYA#Mg|NIfק`Y%,EJA&2_i8^-K !ʵ@$K ϙqH8V ٢>?_lx.> :CE{.iS?T(ˬf*])D/d+,$N^$^3'cKS.o*Ԅ2'0׮W*$˫"Im@Wy/~ӳA'C,fʃ/^ב"K@?iV4ȹd."h mS$bMskM2 fQVDwq>Nj m8Hĉa?l鷢Z}O=dNj_ 1+=gxm֩2uF?aMB-b LfECtєrȜhJ# ቁS/篆ɫ TCp])^Iv[<ࣴ"*'\
+7QD-"ViHbEjPV,[%n5W rGpS0 Ks|GrJP Dd>,JYU9H]TibtSć .4si^;ӻ0Xɮi%%E˓eH?|\y:65m sUCvP%?=6ږ1A${ y#S(E
+ӖT9 l^yF̋~Mִ&>t6z '@? odIU OeF1H D;|!v.TlU`]ZWOc34β̟ jN]l!e1Q,X[|84y@MHo"n
+Ȕ3o v{$qTJC"$rK_ߏjS `Ll0n(ߵj)b~Q.׫Uv$r`<"{;ҽ54! 2B_FslC{]FK85 @#Qc; dZxS6Hr-5KRpQgw>[ b
+\݁˪q
+!`D:ƀnm2O;Xn\z0:ɱ+f\>)4(FvCN)`䫎ptVeaiq({Ufƪm(Rkk(g}S}FD1+ں;*ЧE(,D?PX|DZ!ҏ*-I2/hƨ<ޗo,C"lO%7 hq$C@sT%R cЁ̞muޟJ` -3U> kJ+Z$$?Ֆd5bH%?c9~oKQbMGĂYXd=~biQ<㝳#fK H`CD-p^RdXSqYF{iCc +1zLJns'x%G<>X=͙Xc(O>FّW,1+Ϯ#+L$vsA2,|NQǠo74ʎq7=c7V&xN_(Lʆ2fw htrLckf褭mO'Eq?y*Ϸń}WX [dv+W{dGWD^%2^}VD~5*>&\ҾsWj^^7,;]:|J蓟,0Xm\_Ø,H4䒒ҩ~m%e3vD~SBU8Y
+雐rBrn|<L+HYc&xߔؒi3O$+2՚U}+5O+XozZs,\')7E x gJD8ei9*z{FDo1gߛr~EaPD*ጺnbI!_R)\c&=!no5;沮3^Θد=V T<Gߗ&ːXOPٛl^M 8H6='3rtU??n@T3#"S
+V7%ZDo0c$umB"כjA0071C1LƤ9W6_] 1e1Jr]u]QQ87-;9B+{v̏\g^LΡżAu6Hn))mCMKҦ<ZB[K]59lb3)AXAȑH5Q^n4]L>~=7Ms('{-
+HKndEW{q~ #!5
+<}.'T&U}EO<snW1uϹJWyD)fu>"ł=%>rW=eaKQ=1xg+ȩ-H1J⭥R+ȯ}xћo`*ΝbQS,]c4k\rjcUEk51m9i7˃Ks/U/ՇU{MJ]-_`*1ެ<zxf{\午jd+:._4
+eYwNs>/^Xo^o.WJ,:qy鹔γH߷4J<6,8a=yu"s<p$vfc]PȲר;[pʈr FsVEG]|L~MڹrЅs> FW w SϫF>ˣ[8H eMrj%8<Kt<&WV.VN}b&HeB SL2kTE9 :x @I>_NekAHkmU @F`w%Gn "Ihpkhw"jo蟂^O${*{Y%kfHُb+FSL҆5ُ@~JZ̔#hdRu=zd ^^Ah1< lHw:zh:@0"sCXj`Ai!2A
+ i4ucdm[0ro֙"
+KZ]&}`i%)-Hae> TzNDEwM7Hɀ$l˭:kyz=OVy!nM9ARszզ|F%ƝĄg%6k&:l!hFReA$Ԩ4$wP,k'gr8lj $bzpo
+]I^}L7"3#7!M MO$h ,(lbm>`tDj5lYqz;gA4DE^xzc
+?\ɃB"'s!
+-b!Xγ
+ؗ(k"l* d.8l&普:
+@PWAxv;mZ-HB--`XzP]PCNN iu̎Kl-#0$jG4t |ڤons,d6Y(nrI$LKxPG7CNC1QkP
+9dI|ExԤ6땿Tv+OAkexш35fo##ӝt<`ewe <NiaP@U>#CTi@嶁0aWy|T|")I6~zdc{ VW|1Y;I44Zv\)Y}u$ts&pAW&y'QR^h`,y <9hoGKXT<O5[~Z>F[MO9?4T]1kۣRʭ *h_.Aƥ*-uqxŔY!V )m5%rL9k63lkL3]30gL .8l%!rHɒ2wDvp3'R,`܈ n_,Qù;)h26Hw[I $s/Rgq9(W dNe`]"H{E=d-p:Uw^żAw|~Z7: >'#2~tZ$;"Ve􎱷mN0 LoNv31(ˎVM(r2=*|6m
+n7!')[xhALq +{*AKn!vABrS˱nWA usy%xݙ}r)H>?)2$'W3f"F._fiu"5 a%gsTs(c.zĺEj$3vLoXLb"F2%Wkbt5:uI[GCO;} oo_MEH"
+YZ'P.;3pv9(LRAdA'g/H|>D FG?!^LvN
+F9"A80BUv.bf=+9k~ه 1
+T8V};qÿ<FMUz>3gDcXU.Dvkrti-ͽ4ј&3Ayv  _Rg?@60-`CHxId@j (qDhɀV\ -y٩6:r6-W(
+<p0 ҙ0ଁ!uW:hc$Rpn]L^81V Y</J`ǜzPF(W5}73p`q{@ Qg*[&4^ OM| BfD&P9XA
+] t-Sk]6.ton`.D;q\;J7:r ?i=`1VvIw NGLvtLmc^bP#$BC9( B=IEUQgR _ ׌YK"Ή8?2]^uoH,I4
+_rc QHN
+oS;> )i~ C6ʑNW) 3FX`->:#vܪ"%Ey S՝4QD0uT[PJ>4cfˤ:Is.
+ dO׆^d *,H(!UCnצ˅:*vTHc$[A$/jө4CBcamUH=-טU$KL P,|FΞB_*%D_(Hfp+eļ +3$װ.ŋZ
+yS%P}f"cU.bie%* NNX% t[s:cb)$,ZB4]0%7C:]h 7^<4{g]VJ 7,R2BFw,U j 2
+fj 4iwz&fr\ +*k?HQӱh*& DPETzw ݄-Rί
+i(h/ayE9~Wdڭ&+})ɡC4Dw=?AW IWP6 rOuRxMs cV!c#;;TQvsMbCD:z 5RIjqx}CB RL 6p`ǰՇuh/MP4
+3U,U۶-0$
+ν b7QCFY<Z)O3'B"].`V ;D%⪏vB NGWkh
+@U4sηf+Mz1 hGOG*Ϋ(cAjopQ6 = !tZG1?Q2[P!޶'mSn;Ӌ0W2?P
+:tdJO}gQɦy[wݖj@Z{7Kh-&d'TT"#ܾHj+Z5?A0n#^ a]qd[ [3@ZZk7f˜W@qQ;eJ+E,a\3q|OГ֞eݢo3O;.X) YQbXu%
+r <*`n3Ss:J@ st;APnė\aeL` n&ߑiYn/@xJcsZBW PŗBDA
+H
+D{azY#yqkPrltnP9h4C$mUwԳ>;тgO)ܙE0u%J[ktU%#^p}9S?@3DnKK|W Jl "^$&UO\1>d#HD99\gĤ[fi>9DXVTΡ=Aj%sBөǸ~yʬ]Q+=A¨ hP@#r)Ϋ޵~νo EtG/sX EYpybe6yww)/X~<$AԜ3Zƥeϥ\ky W gv+l:<A THas$ ]+VSc_gMh1IWۦ0ϟ,`w g&ѰY7gO#>rhGˡHI"ԯڥ1_7וzb'r1^)2-[w2Th:D,+l9JX\#[8VDOt$Y/x$po.%\o}Shv_WboV@LNal0K H0~:~<KvF:_T1ERç`H41]uCJ[1Kcj(
+m0 "1o(N`yG,(~-x!O|f!X _N~EjTvyٌq#bfdl #W
+'@#8ڗX&!֡>Mv_dZ (!(H:5%)ƫvMJXA9@Oa.v<+b'ppjdJ#Եh!P*C :4M)ݙJwb$bDK ƘvX0X_m͎NUOh8c\I@,͌;À}ǧBCg^]X.&%ۂFٛYjxG 7loY$oVZpƗ%] W
+sUm lzWk:",iԲӉgkC
+Q O>@چ:"*$/'|A_}
+YnijLOe>}M+뺶2daalG
+jM>s ;&pwpF9۔;B ,'rN|[\x;]?ꐥUO'- rsWe{p^>8@Q^3qڸ" CG3G"V2M$q޽ GNA h!oYG+1wƨGJ(`;msxo B,0dF3n8n,oH4*(V
+3kVT:ߣ¶8~H^>*<1N4 cM9fR.,J Ƈ$甓JQVL|9柪%`!r!R?_W?HD.F8Lsif2y2.&X%口qHSZh0G"Cqh$<C 2 ]{k/C[?|ް>߰)8,.n֩uYr;╺كYj8cV|R!_x0CnُQ~IW9<g<+}`7t1m0(Ll<`~1T>ϱFPpKq,wTG΁|/$Uzu.EeX@2Ȇ.+
+
+n-. JQ2\%
+z03ĕL̊"Y.ەyyCleym:,iw$u%s(@c y=❫@wp$sZp2y5/l2Y' x_Rԕn
+"tAPJR"%a]R._Jlh{A7;IRW8Yi_ADT'A=J
+Ef3
+NHiQhAƼvlTBŋpܮe,5U,芭5S\SK] Z؟R54!G'5kp<^"atlD=KA G.JpZ" ~ *<O46]!\C꣈ӐJ J!u* ]ho!2R fo~P\M(M=4M + Nrᔇ}G.sr U,!0tT 6^/,Kp&'(BY/X$>)?Q$l˵)}d= 
+(|؁NWomb8U2$˳BaV4
+U%,!6aSȊW@hi
+3惾 " k
+@-xۭ%Mv`؉ E]!_j3H*AHg4qJةK<Q }#QV4"B"XVaBP`XzŸRsu/Z BwP/RM3HCyxSR0a'af4ۈ[nCⒺ ?+lBIcGyi<X()gnQ@˼o A$[Qa'E GjV@b}F@[F7
+6͕l1W\$H%}EXDdَgm(zȅޭ~t SM4xS.ӬNb ~-~(B""B zm/% RꂱL9^L
+(;'$ [sΙSW* _ܧehxheȍDet`_̉IW'GHpP"F?Vk F[a"g8ѣB'\vOAbG݁NN|)և^H1!!ucMdy(z(9͖Q&-z}*' ɤ:_ a<Tfah FOeh*- J֒C\ll\\7*Lqx8@f)RK=p"!|<.-#QJE Q{- $a-Z 8J9~d]p`ijX vW9E%'i3騨yTI9]_H6`Չi9I^[b5REAcO%jmV(Z{=//-bG(9篺vDFC{=(
+ʻO!Z
+`.u~ W|i.=r%$w:O0aGQ9oE7oVŪM=yD @+*?01 lWOpP6vZHA#2EU}\AsoFcY2
+ҾY!*%vE3/)e mVW'SfV͕;5P/J.W)E%!l:B;Js*t)x <h
+QK5\7
+LvXO9<}ăZAkbK=@]4~l;~ɤ"T1+ͦaA"I6U<ơPpE҈>v-z΍8@۷{#xcG .~/8miݾvyƍֽkV<3\/~/BuR+)HTwkoEWҲKQTbUJ"MZwdA,V|RċdVݿOaaPZH/~G%H jʾji24 0CA5݇cRM~<eAJ$.Z3~[SCOP¼6/jp ,DS9p{V‰d{ah7ۈ0J6MM}p8Fl˨OOL2qvX/@iP(+DI1e0:T7LehLsܰ
+D6k[c^IR$0 NgG,oɁUٰ3|9M
+<M#h8Ϟ!q&!h!KjsS6!&
+tpŚJ.97?nOzdi=d!;Ň
+k洞5?WP[3{^XG  dL]lah%"S'{ mvNFC#S/E)(Z( XR"*[Lغ5BV_;s7`6OVG}7MCyU򿨤΁a_'aH_M'3֏_κn}ج?vWͧűY&SƳ:!m6 ^J*nZL_J' ׊7@ Yɞ7r֏iD 2}C{`A<}22dh68.& ך^+ VC)`eX9mUacg' lh0cς - 1 >-QYjS7Y0<2Q[!S%֡T܎-U2k͎"Y%"*IN]L1VE QeO-NᇔȘ6Q3"y;CZ%zڌK˱MϠ 'BdA1_$+
+|7cg]d*@۪b9 ! <v:{m46S&絈ȓ?Fxpd?Źy?1@blD>4hydabȀ[<n̙{u}$L 6ֳX&
+;'x_F#".PM5dKh赹ȊCk*n{|8 ̘{z+Rh
+݈3`0q+Db/f[o@<I"YITA.>*=˒:fCu$:|nW<T\~G@dX
+[)WIg$4 vg!$9ωc0@>+,c-(ْ}(ѧD"MhQy8
+֫ӫ(irTYX?uE5b+-s=VIx Oc۬% Ϲ!~+
+=*2v3~ZQn-YSDYRL* 4J̭Jȣ6ٙIܱkS0g(YBc)6V†SnjxA@'T PVwU—&W،uʧSA&A,dT*5- ԝ879dֻXS=ZYrtևqޝu>Rus`ZlV&Z [R L;r8@,ch&,_
+0[ 
+~ :$"Ic(TĶ0CWx2TH$Ao>>yYEuKZ>ڣ} 84%CiD;9(M<
+J!7Fa\$}+nDDjwPy UdDeEٻ
+
+>D] ļ In1_xwrfP11Q8dN.=q_+jFE´0Ðs+e%
+ CtTfM>Iz@
+F6F ƗӶTC#Sx<\菊-WPT/cJ`ZUjvKG2"xO&pœ"kUrB3uT_a2QeJxԠ=yuDbr"6GyUtFUMBJH )N
+8Mhq[%XZ9]0+SBSA{Ss(># *AFiReM `WSf-~aFJHS]nW OM|WYbj#F⃼TbTuY=TŤ26>1E_ْ
+DxӚ(G&FClwqn3,1#*wS=¹U:x(8E],@~֡8G Ԡ:J+%oL74{, iİ.RYa@S@EcӼ Uʐ<kxq=ȯDxe( i/ {\{'de,KK;iͽ "!nhzncbډ
+-N1)* , ba]b\ ~;!
+mҶTA Ʊ1똇_E"I3S۴F*Ej%ID$
++6ŃE>T8Wx+gr@ "T*lLifdv!t"?&9)kZߵ[`4e'LplO͆*P
+$0x-k@*u! E2j.* -"K9둃!R]?"PԌ_e 3(BT<@ܛ{$ϧ_$CK)[0a:΍7j1cƨ
+L\"sLreK33њr-ͺ`t3_XDjыr^A;% 4k[x~b.Y߷_i !~r::Z*E,R?)-Xѐ`ݘ~aXex*!]4)d8ěljB~ v^ g;,R7%>M+ܭ|jBiE*ksgd+D>s@MwՎc0n=W
+T" ,X%yc(J*jlPj^IS f!/&0Paع[1s0=@z \#TR;
+n#lf) :{3vҩV9(y,H ;py"ENŚ/~1e=ft
+/9xLP|Pr9%l'u)> )!gʐ3dĪU'd
+J_cⶉXvg_(`G20|Wtp_X P-5
+TMF tLy!3{ȩ󁷂+Կoeњ
+u+4ٽCmlg'"e0/a9@;Si
+$Ϣ14&?e0 KC{݌*~[_N8R(!մCr9ܟ#hZ!EmFVvo%34( a J~HPj{>>V!8{rd)ҧW$J@ZΫ.ivo[ pNj] ќӄ%[M_Ϡ
+g| X<j E?Ywb$:1Bfof*L7`nqzh"r|>UEu6! ; 5#9ָtIțO5')IxydҫӋDeN숍 Z@hKg(/t%&ř.P˞3,qwiizZTUsŸ~?(Ǐ|^x{d9Dmh(qհ |ac\zMaT\&͑ZEgK'njL@
+V-kɇvg3x]z&g|bbEawt֞-&t'b
+)aړ(bg;[ar`~i=Yq&Ҳ(FFEv7_LZ6쯸=fJTB'P):Vs]QB(ȏ2q2YCQ0v{1Wϒ8m 7c؄~pqGs)`ʞ)%"HjZ({aQ kCZyV8Dۈ.a:JHMeX(<k5> l
+HAr\9DO;
+` ŋa2![ *?'Eq<S,_|
+s+yuo&E}gC
+u8{^UL9ր7Det<V48 `=h=kOeO>hYF3S̡dWT^LSΠ{D < <?۠Tm4* i > !|i0,u1[UO.nih'oOR)$R$_@. ZN>Ӗ_D]$z1X߀RLH?ϵkRSI51B^@;fQH_m4"w!sS"'$DG4GIć8("x'ۭ0
+IA0
+|bBIdkZȈla7> yԹY$06ѮiĄD\^_`ۀ*1+Kސ2ug1ytR5Wz:VIwvUÌz0ҊRqЏKlgQ_OBcX`%vOM;T94 .X _L$3K? vL\%ZfL:9L"ʊz99f]^:;d,?+Fi&ol9O;t mG,ik/_0OQNc.:Ts7Ay,Pfag+_NZ]% O" 8{* 8}zsNt=96(2w
+kXga;q>WNXV͟S$f2kwF3>]TgBk\[bYX9+ü@ :$R(PXʰ)ҏO'M)3HBt\hhnkFkG[Y&5ZiVyT@mjMIQĥT$]eO-)톖}
+/ SǴGў#;ԇߴFZcO
+\J5aI˙{0P'q-L|2B|N6X CҨ{d
+Fuk^\ꡜ78
+C5
+״Gwε`%x0$)sQP~Rm8(}K7=orW"l;w;Z) RcGP x:;F*sqCͿR+&Mũ \TݐwFE2D&R(
+N2ڒ/ f+^dun̓$
+"=
+=$W
+@={ObTCLPÂQ)3Mk;/}_Mt, 3_MM3Z1xz. /f
+] ,6!I@ph l'J,M04l)aEz Ԁmok>e?(mDY.zsFQ
+(rl%Lۊ&6G%|Q#ne26`ƛG! :z6K5edA'A' &X4KD.O
+0)sDDAߕ=g0rn8=̆Q1M>k|~7nMnNعm3,JขLc %UPza=0"@{Ƴz<&ͦ.-QB1$|gjA)+YId8 Px0ehc@h_e71;PA* ~5\CE|Z|$CL!wCY>N׭p?Nn#|@`U|ѣ_*vw_{81 #պ|>
+*4ū
+>ٗB聋HPj9xRot+B!p0^^5~ M
+EYѦFƭmO@0NQG+MXнϿY"Kɡ7ً *_Mxj/CޟONo
+~ȞVFIe
+ xo$V Ot%N$X
+/i)
+JO9t6)*E$bnWpHjjפ
+`^@J6tG$L12*
+CoHgz$9%??o]Ǭk8 -Dz@=T ob&l85e#)fIO$JwE m5x
+uXf(*V,%4ѝâ "a9|Ϣl.EK$#w#XRxC)cE _RBF\:O S`rٮ$fKyX*RRwGP
+FzVEW,٪V;fWn_:k;򢨷<*zI1a|X 7yQijD4M}WQZh2:/aAhx,Cx%I<saB 37Rӫke0JZp<EYA,g]?
+QWemnb)ulZu\yL4B~&klx}#J.D>/b 5MAb"Գ+w sO&'r<'w<E~WL~rߗ}5t})oN :lS58(.bqv v+3/(!~J@ صKnHKx ̣<vVY=sw)(wk?C"\_r#H3{B7:L*NJVyK֩">@0@ *(;䉘{=efF$mC[]_E ʅ#>?㯱w®UXd "&.%ɝe%\TkC]ej
+owiH[H+'R
+~$@4
+2ڗ5F.ϲS&%ui (r|
+ ?½:Hf{qEBOAN`[/&;ޒLjuiR
+
+
+$D@Qws7=;<,F &wRusw.<ry b\-Z {d1IUɿyMn١w9$WB;.8=޸dާMĨh7$^~!ڟ>F&;OE*BٮSx@ ŝu>M:n%w fY;E,Р5XpToG6ߋf|ZÖOym#K֋Xm.0,lGy/tt6|E<$/d&Fts? |A!;K# ) LaFlm?//"eU0K!`[QyG%9tc@L:c{*5Ow㰡 eaO<~4igkS*m15^!|`Lpi[!S[S-= S4cRj6
+On7hA?Ogg`{qވGWtʖe )ܙm)
+llļw$M΄}qH<sZIfeo~fd̆P?yE%i5DQ##w:*)P
+d}b5g49"ЌMj5: AFJ2.CvkP) u}[\}wC2?Ӳ\JNN2q$?7Jr_n K<i D.#'<4-eW)#RѺ,\ e",v$A@g&K|ro.w]y=j/{J( ڊt+1G#KaH7J{$: H& _TSkun€JD; iׇhe.w,|^lcqy~<k!4I8(K%Vq 4ť
+1ҹ^OnMnC!Vdk
+'nje`AKz*ʘp3aQ`J6!:"c8N=Yt6r%3#JI\uJFAĻGϙ4p ۜ2_(!K-"_"ջup
+0zNtxӚU) +)s<,g!;5Cl0E]1;+)z@ֹh +C PF}|_l?;fHQsEc>dA55~NJ$-piaXzJ(N0,vbld `Ʊ)iö|g9tւ
+aӨYxzX/!)JʭtB~>a/+*E"SH%p~dt|p+ZFCJd
+" ޲UC`k8鶃:!6P-[oqW IÚl{A3=U
+3*Ք׫
+j:DWcψ~,A!5 䔃 ^gA1\F0sA{Etm^x`Y! ;g<@-}Q#7c٢Jc23*@I/~Y=# 񫌋;l?C<n6JIR5yy1¹`QHw8OA.%5?>`@0k([/}Ăq׆T<V ީAHf'|FItP)W3n5æaYVQr -[ö90b` d2* 'Iïj fpK;泵P!1lϪ$mTR-xCb%Cf@&v,fJ?Oǹ4IԑXu"v
+9A
+x'"iAef<0&RiLCHgU2];˅f9B|IJH-LވcJq/ԏPgٝfmpX~$nku!nSA<F ؽv)r+`@#w|T2s.ᶳ8+ (?px+ DkIyn0Z3 O˅%euJ ʬuwbp3~ea/?Qe;6D%A_ ?S6M_=YqΑy=Ct+b ՜y8^@'k2,B. GRv*MɊf 
+{~93+=GQ}T9_z[uJN|wSlvPwe<:s¥d~Ö+C&%<n1DhƯdo6E#ȤXԑ@Z|[߹PXW1Ρ|]V_s+yfu.D|/#9c5%;&΃EkG_6]M2B737LħLSq5E:_E:o6׆'&U,|J6,C!2b1հn%o:Ñ7ǬV$xmBnP.VÝ
+1%-Ԍ!vnb9x+WDFtQ?Z=X*_K+ H
+n¾yS]ҡQRBǬI j_w'7aˈA;T6r-fmboROlMML0֏ai#1e<$^#"` D/CC5|sk10FݬDjj
+o _F9hz_~z'n``[t;)c>f1Յ8D8&^s h.#dVþc3;j rBX!"cȵ@G(t?5Kҍ1X@q
+ɳa[|66#XL}24ؚ2<7p
+GpFE7My7u󹦙7V]Pț I)N;0xɺeSS2Xa-1U;0J8QSzIHr/4!I^c:^A_<ʆ…XعN5 ސ9C"A=ӷډ\u›E4at5`nv%/:7ؼy=39T!ݵb@v23c 9K0cګu
+c2^X\iu' §eS$.JB) Ռu ;̣
+Zѩ"Ph||ö"v˰k@l:<. 9Piwk89aX~k:$\pkz&pjvl@,$H{Q#BloՅֲAu{. %zY<QI =$Ѓ#)nz"~ E9hK
+؄\tu)9{JӮQc׉ І*`.];m5%d/B)4R]X 0B-
+ҤW!Y*mX:"RG0&+,m{TKx݃{E}1HO (O7NRq2چGץ2]0I4
+C'
+N#p#ҽ>QطGPGہLqdMbyw
+so;_"L[[\;[n &\6ф$%윮Vpg& (
+H
+%νG6Fp
+ދCHQ"|d"{!;o: ۢɀ1 oq o95bHͫ/m4U$F97|7yCfaؙn~!/g? ާwPo9&>N:1wt.}񙡂+z edlf^Ҍ2@0s!.k"X!4ـZWJpbPڂI8AÑQE%([PtBtUC!g90%ds:HT\f4)u֤X.ExcaO);fꐖSؑyZl~XH(4ٗUknܛpGfUיMKL3X*\`&fצ=7k <NEwPmAQjg`W!MǶE Bwr2Θq<R7 Gc3zj;Bٗ+L5r!Ua#-[w=H~wAyc
+$eBh~Q`rj~ L[):67F5oݐ|oC:),U2p/ y 
+ I;b**JM#fnVeEJi~o-0EY52^d=`*
+K71!)ri|K&6^
+-C*mobqK\{Y<2ýLJ2 ZǑ-L
+,F]!MXv4UNk׽*Q N̟h!W*k))%[#^$`܄!}i4n錒H9$FC>YHu-W`'"ODR\H(I^Rf e.Ae9݄Ɏ_! }&7G
+Sc0uʠ ZNu ~)g*3ɜ2.E6w 5q #6ڂD_ +"~RaD @eS7
+<J b\/ts(^5sfR99&]ǁ"T!!yΜqtUd#+=WcXQ$:10;KDt'liA
+q9QA:_&AmfR" G}x`l;ؔR/Q),$U=L[
+ }R,?g֋oZvq [2vu˳%[#GoSb
+rvKĄtru"| dT $2R uow d;ͤvG5|(&Z_m;<H6T C؇[=ҫ\$ Tۺ=q@W'?]-36*[4^7§*M1<;l("QdIv]t~}N]ӱɼY3͵Z
+F^($C&>xOP'}y4c-@T֐([3f17oW@X,ZϜ157I^ւi'ӊ{ &u9
+sH3E[+e8x .3[vTl\Lt BL@Ae.kܯCIda,pfz NPcQY~b?,#sO3Ls3M*E+U`<C
+|BƓ&6 [SWeg܃d5fO!gA݀SHO睟?&3F&bf?YCEdi^>|MSMN4dt z(GJ$X#ܺw)Rt󘓿b=u7Z0=3U$cKep,.9˔r)
+=17Ɣ?U{ޓ(/6L*1ɛ ")w@-f2}/gK cB1U
+K_+⾴Ge eKT)M҆J<kYErn "0\I|v F:a3t]4[f6/GU@ jvXeEIWw@̎"|
+P,_P";#ΓsR-#ܘs'j׵/Z<nmqx(.+e޸K E5g-'};UJ#;6U"4+^AVٝ?G|@i1iɊ :x/ƫ;%<SW`8hkqc4f_ z@JxO,w#{aN/y]oj;fBK YF,str*x4>?СG 'V,Z+JI+ > q":
+ }lz9N&jiyC?qĨy2:0k cqby!BLB by2{K>c#婷sB]⼵5 m5hc85' `[μ3_dd+ySpArhg}wLpY_Z]=̣u 䱦nbejCc.3H'$.|ԙy pmÇN"$I. 羲" qעC7"A׺+/%==!Q\2@T[LQ3Z+( N_xvH!
+00ƅ\ޅtq=z8^<p6RzFfHƆ?!\.] >n߿̟w 'xe` ymu:4P1
+%T%S?%™J/6%q@75:`52IOlD ؃OKDEN]EtOBMv]j#%=_'0_T^n404jߪ\9=PoϚ%!%'d,P D\s*3e4 1Fi>}O@0/ªyr/-/aD3ɕaѺ
+H@iuG`93;r{̂5.%tzQ@8$!M\JjI<<k~(*"|$Di XF,/dМeF5
+>DF2
+p(rl p18\`Zb4QKחJON`·,!TLe,W)9h@>h8[MaXօ-ˍA)=L:udM ls0!K\u&0u §/A\*u{f}Wq-T;i_9K#rO;*;G{'i@P!kh|Ҝ"ԳQZ?8Ex*4qkϢxY*Or@yVq琑Ɋe whqVs
+NV:G5| J1W_ h8]09L \t46i )0f !k< D6*"Gg`S\5T:?R fp!sAi%X4ˁkק@;rf$0A` ΁Geag;.%J!'ֳU x{nC:0ۂQe-bC"ò A Jzt+TަxJzR% z'[%2t8VUher]bBQ!aEHtSbD
+ (䂠_44')v]3x
+eWQZ,X}ʱ|$e BjiA 3̳0oa@"F<=[[[yTR4vH "".}{ jn~,'
+j?VwE­
+Ǡ
+S^)I$UphmWYOIԳY]CT"hvQs4?^`\&~$1gME{B-FZNS&D
+
+?~TS 5
+C@N[m=nr#AB
+@cJZܕ&Z!x nIyD!>:{lXZQHrz2<
+`!U0(+lƪRhDck "֐L`Km#>k$3De᪌x
+I:Wld60F.F(j!<,- e-Dp\H!tPw̚B9bU5tmbz.(m
+|J> w $O ,+% ͂)c.^`9lVp;u0P*R>B7w;j9Eds,_b` (-ʧtNf_<HZd<°s Y@! ~?¤`n|S¦fc`eoHh
+{&A83"x Hk>w5vS=_ '.928{y M+֣usG\!Y'
+H͎ ЛHȋda'Y! cb@B)<'1(b|_:u*b̹ZRl-Hoz>m2=:Xne5SŢO>3r/k/Fʯ{ղh=(xzfZ.34\jUK;6"Y,5xgC k7keĄVhE/(HvkѪ<}LI^Qbj?S߿a;v=82+Qz:KnLjH17,X j=s 2)*DɃ:3Ģҋͦ-+P3YǑY8
+L+Xʼn%St>Q3*72f)]#[3&(&^=mEɃ-ZV-y{cGmXԨZ?e3i]Jy<A(B/i85
+.oJ)e`U]s!P?pJ:s&C@| n09dY
++8b,`%z+QNzO$+x<W1_*;$;J74 \bd%-?pśwo޿{;}?z^n,u?<N>oϯnSOz'_>vǰ" }
+Gm=ۉe-loyQpQ's+xcb],;\3vx摍o V̊I6=ϖ^>K2~ Q!fm+1vWB1-4FZ JJk`cIHLԨiEiaIk,MӨ&2BqvDZ"~NksQ{MR- <Qʼ6"9y+ 4女2Ds2D>c>R1M.=@=z]g\('ZIqicJK5B]ZuKPRQ7Fhl\JUBbivnQ{Rp~վ'߂F  &O4S2|P Xؾ.LO#(q6$o۲F6k">l(4OG+y<)hU8Z uJ"2Cq@8))(O>rc$ N?r[?6m?y
+\lJTu}uNE v.smA=Qzr'=#BZ5plC8)ud-UZYFzه,z]4#7
+@1-9#; xr}ii
+GT!b%Ĕu
+zSJ~j#eh"tKu)=!:~A9&}µ~(,4RA&ǩ##WؼtE#ړ^NPv?ぶ櫓NcL@{4K@ɱTs3"{G%)TLս(۱Y&i[qX[_J7`l"1<l_ؒݨ2'1)lqYmP" VM@ja
+0
+x4"UjdtjӼJeOk̤Iݒ^WS2 LQLW%BtNt4@.33b`g%}n籫
+n{ЖdÍN7N<fe-rQ0~=;a
+]a2w O<q "ª3ȋ*ɋl釄/:0LNbqp?
+ひtAX/}t;nMeg|eaN:~=PFZ
+ *&p!MCLVz7UˉDF@Y^_ :)/άC1$yAł}A7CS@GH%k"$+zި/i!( * ;)?ra1H.m&| ) oi/Y*lYe3 U|OW@:0`2eilg|JPR#H
+QpK>QHBbJDE/k!I}NFYOFg@o
+
+
+X68Dh
+ PHmP=&4^{㿈}%۞Q.p<O6B]ToXbhoܱޡX{.yjx
+O
+dq6#ΐzj`]/ np D+1Zf09s]"꺖Dė~KVMQ 'ybwh
+}H;
+) xn
+
+y,2(κӇe8p.KI)E3y3n,R4\ bL ?wQ
+ <cY#i*Q
+@8g̴qL?z~Ta"
+J.aԱHm
+fJ;z'VXX0r/^
+ 9sA'}9 @ow~`G@N03ը'ᣣ/oY+>B6G+NٱMS#b>5ӄѨ,EjTSwxbwMMp I="`zI8i
+v Խ0$ [~ah2kCe!9oqxWx?V{@C\kyiQz:n/ "=](HM$`CL (@De=O\-:i*7u  S3/Gy=Π!u' $T3!
+FwaeXT4r3 qrjJrpj
+?DfXl70ȝ,@#܇!-4.hPhQaPQjqQ=F@()g՛FAaf,E^];Pń2R*VH{EP37Nl-RZBuHj'/O,0?z'te V$'2<B]d`,ᔂ [;jo)~ި}e><z8pk| ܊(Â7|qt7お$ޘ:QiuGئ*V3XB?U`v
+W C>i(qp=/a()Mau4 \}9L
+r'fVXeBbB"0:nqph@ ԇ)|OGKx*
+?϶@=S?
+X1c?~;
+P5>{ߣCsu<0 @W2M&ክ ~{Y#?J `:l.6(fL'F(eqԚ`D^phXD%=yk]縨-3}1g ?z#gY[>Xy hTMd;NuI@h}4_
+ae7
+N+H&|nAS5 T6w"A`ggЄhw+,/Yt SG[ V q(r  ?CD$̧oAȢ=`k?GLjÈlۗCZqORXLrNKŨ5Ynrd i#"e ُimI<)Qyqh9
+J<5`FE44 |,buW?xyջ}I}oۻn!?ZVnp={򛯷W?g/o~}@۷Nעa
+}UuAuϞ7K+%K;wr0;[4k `[AIyU):V ]0Gcsl,YcbwA
++鞠e"(sB z
+7(
+3}a2blȈQW2-$$)RU;P8,
+V< ^B7l钄5?e1W]ӞX0xP3F<BmeﱩP
+e<RK'53Ylx+\U+"&g%M)>w9c@Kރ{w]
+QZ)7^e,I/ "H$1BCm3#omAҷaoذH%ihU2*F)<Nyz
+PDȎvEF(E6&2V̘OrdńʎayHlf{ìn:QTO)lRW;fsl:Cd1%䂔oDb-"@;<-S&`))8Lg(Ng
+l!p+2Gdi&[2:H}4T~2n{ X5%GZKU֩u 'mp| mTۆS
+UPm)v/rq<o4@XTinFEDAx|
+NIJxB3!cW~ _rKƔ"I"$ܒ5]WgmsSyN~P8 ј/f `-x
+In4ga5 ĕdi.<!rJmKhXEx*Hw8~v|oA9,=}7[سpQ"4P."ڊtH3!
+%*|y2)@v]X
+ʝ)w^J~\v,9(+wh:wd mB ̄:YMZX[n"#c)r'z~ ֋:FJX`p@W TӅ9hMRtEe_km1oCėE)(:ge<T9J'mzoHJz
+qUo1t/Շ7>h&S
+ NFVƛIx&)u"9@`"]"V7_:~fX)lN|G/yԝ ~{ZQT™cv.s^QY⨰M5qCw<1$C:`q ]hsa$zc0fVJ+tߺc\x6A~:0X $ X
+0,u3•:w
+vy6DQ(~oN}p"UaL
+|ע*]K:*R`&5+W/L3k&~0
+akKs[e0F|&+L?RPJ2<_iCLs$ >+S λP .b~a^Q0|zb%&SwhF.l'Ibm3d$ߡ6<ћ/K=Wə*Y/kʳd7b{ѹuߚ}n2Ux\{ѯܤG 5[w~S~ݟXa~?|믞)#?3]ZDJYl{}==ܴ
+Pm!v=Jh9ւrfղP4ɫ(QywK@iH'4a(Z?i. !h"er9Pyzn =^)h
+Qݤks?TQܛ ->s'gI d069ꜹ:#`3 `8swE `iH:j+V.].|s9 kShruǪ,YkUZ4ѲC"+@`
+p `1(21~ bH4'
+>hsEBxs;4ťkCҢ:|?kf#6?a6:kj0*-MK/d0!2Mu'7950um G31N"Ap ' pwq^18h.3ʼn=q:MRPNH-}DʧGp`iAnƗÎ0&T;3_S>T̖3KH$㒹I3Vv+^bwMTqJ\xוnE i
+ied)R Jw9f}VTYK`8xJjVL g k]>|B{b%g}%$~%z}Xb9&7"IvJ*1:9CVH˵ydR`g5S@m&ꊜS} 74lfgvF0㔐+(8S9l<s3y(ǙeVьNHⴾA .lԲ_iK - K'ԃbfn穢TW>kJj\A+
+?}(Ryp(NnŧW6RWl,ȋ DAq]^ǖDg` BSwMxI#QT ؉H1ѡdTUgXܿ^d5: jq틘=VT239FA]}U6۸jV@=V<Z}kի6گ=;Yߪs(+sο"No\щMS%|ʬK#[1(kK%^Tk<u`i+O+8d@2vlF5]\Ҫ$Z ܲ!m}5Bz 3R{.C5%̈́P=E; t0*CZ]c=#əvA[VߢōGK]s$1o(=mQu1Ìvkv#HOcfj;Wtic!}:06ֿ/ǩ?Pɤ\7|&3A@ˈF%V%]ڃLÙ{%)]&6Ս!wn.+DP+e {Ƙa;V@8АpuNu?H?s ok6LV1Eh8MaCF6 n&{FI`f ;`i_4SA:t;&P CA *= n^\x@`()#o)SofAP`aRwUv:17[T_?Y.`6JKS.;f(̃2]ڎqw,'SP,KHyOƩiz=ZoP&vH Br"U23)`9\th4M&&pڟOgeIY¨qvRUR^v qރPbY$G mYi-g
+Wo˃%޸~d@<p2u \='C )B
+Sգw',~ vTO֨0#l8%51
+O9H@Ɗ+̖H 8gӋK{i`dݜΡ Qm߾u ?*63u҇3VzuzNx`!<,w $֒( 8A6n]"Hc2#psJ # -|'CA]2a;4NM(Rg^/Yc7gࠤ|Ye?];*_ИK?Kϴ9~T"aƢ՟>x%EG(NBqLKۂ?Z 0 ه@@XX~.ܠ" VRk.-8֬VK$l;M,S(J;1g "l>|:Z<>H*:VK5g(0Ƹ95 yPŀ ֥z,Fla9}s}Ziy!A8/p@ō趨DrX$so3
+
+h_¢q5^V<%;(LT_DNx#c.3x'TA<ˁ,8 Ͷ|2CZգ-P
+=yGMVz%m`llw,^DƉ~"=y3$ 0?cMM'>ü1:]4K`&Ŋ6B`"/2p'^$,狌0D a
+Mdl^LGԽ㾖zvo ظV|@XP
+G
+ȍw~S(V:T찖~a$t:fcul =^]tMp';z.NPL
+t y23bwla 
+@\޹bs1
+xu}k*+I H*ӹLnL
+q"jYȶWlǎAu>yo༪hH(a-[Qj Ɛ4Dar}R *5{K"HsF
+S;3y?3KH ¸xD^fJ
+r<IZqWﲇG;>w=D 0AD_6(>-zDzZlGtt]hiETpL=ga#l> $Pbc=tʔ)gr{ K>aa'Hy!F(㸡]"^ߪ(;YΔ]"V=fZ(M?I3v1+bd>b`Xy,dҳ!%n=c#0~
+++>eïgK^>=#鑤hإU(h,":JT+0&>q{S y܄uڮPF`$ * dU>g4ˠcWv"bqc  lƀ!1LS@|6JN>%K"2Fc]c\%DzU1$^~rLUAÑ ,)D{SmpU":'_VU4C1¢A֢L)"ijkPEI=,f?GuVx>Qyq8.@AyU
+<qˎ`B3̕3=Qa^asΡBN[x~Ŋ|bv㘚~hU=V\W)mջ\t;
+c4`V"=6_d;qr\@w3oWn++=-bJI
+^-R(.U?P -N?; =
+X)y3:!Ccta,h}K5[^يL@[P#CјLٱ %D!{nNSSH۾W%sA%&#hbV8EGz0P+T @'
+7Vh0Ҥ&lPÐdQ7aJ%=Q G2 թb*=$\AVK+n=
+Ceh Yb}ma8wݱ?]?
+,);͈2h>-ZpɎ+w-okuA44-a]Y)x3X$p?ZK%*[
+RN4-"%Zt:h!CZH-0G[H`6m7_NteH%ybph!c~ CRja!bvA8JP9F꠨(ɱĤZӈৱz8HjJXK-T"I5Y Q*`tuPtb&-ffHr]BbʸLj4݈\oAE$lmtRJ4f_p\C; 90)1Y<p+٘}^X %
+vDQ
+-`<;qtMšީ1jˈ>riۚ~ipn E۴>\i`nsr#Ų0˞Y P6<R u-5Y"YH0"@Ed?0"튐;`Fm-,|
+E1X#p2
+6bswES>х,ͷbVb%z#gޓ2v3EDzYj쩿qE,U],V4yȳ`\ B{%.8VᖱFiYU
+X[gE+-VpbSOKsKDzvn#b#ϱF:yBDO#s 6"k9RyX)8% ˒ cE 6
+F EE'$
+q㠮v#]e!05M!qiXyݏ<@}u9]Xx&fP= tMq0v3cJv:eF$;+ˣ>AϽ{->NPs"1.%]K6v
+'q`u0:%h߰z}y<8v
+ w}J<e9Z^JS֥xaAv!IkWAO
+A'}d3A¥dݮkE?5X4*/5F DZx][4#߯Dp9X: qHd72ձV -VA'U}b|^/%qm}ws"i7bNZ!]:g(t$]g5ťY[ 5J{\uƷpekI
+GF|`M6k<]߶^GڃtG
+Fr "0^gWKeS樆$:_nbW! KRo .1
+HMr%7O;SA亽[tĬ5^Qnv/$D"1R./jkyx1aZDʐRDxTqbM]%J"%vqyE׍ec 1 k*:j7 [UuhRrN1Z$ ,OCpw3Ya:|+Br8>HH{ˀ}WQň۪CW^=(lAú61!<Ry FQKk-J)}rByw(W !ZnMMHSbTr좷T=. Xѹ_t_e¨(]]}N)fw)j8uIsu4rzoT:ShIE{k2c}X< ANI^|Y4" T)\T!voHL yQ1ݐń;B~ˌV+{cjţ{b*_ RL^#wS֜&J
+`rd}=ziP>nog?x8 <yVYl]Mx?Qo/HlJOp#&zalGZ@o6چp/R5E>J ѪᩳHѶI^Mj,h,iȼ):> V85ePAg_{@>-&G \x n%ۙ(v1~֐o>ֳLLj3C-!nCs􃼙ncfʂx:7`ozi#grT\NkAZ[FˆB ݽ
+Z8ʫpr/h&*W>' T<nQKH?bGA*7$Xos5$6! o(]`i eWh&3} #kt=7FiU^0+t+'ħsMtWH]BizYΛLXPgZBrƂTIfKXZ{~FC&r݃z:EgH%oĠH~(j5 $Q?m"Ӵ;{ֆ]ҼQY~F<ҌzA4&ZHlJp-)+izvk@J"Z}c?JDZxSiy AI]hhR݊+[^"V$87ϑ;X.a^QOx/12[ RU>憤,~U6_]G`nr>NIH%-YˈkdЫHN(9싃T箕J1|c@Br ϵ !HM(i N!AUL+"SX%dc4W 4 e!(@zD0w OL_9Tu䨚"ylZװ1(қH!ozMN&3^3<n ϝ/zA,Jk^r 3#?e U-i9Ad[.}˘`a~1/EK01^8F>ܡ5~0Ys\` oE_RBDȈȦ(3/n5.~K(7w@De<־_qmT=MfJv+]
+ $ҝbW^*#΂40iɏ0_z\2v\*n4ᙃm^4I_w遄#p"A#KW>4 zks5
+9s۟?<Z`֚Uali6["TQZ.HA2 [>z/)!N; RBv%ꀬ!=-@\E\ ٞ~6L($' g*OK;hM=;TƤ&Dهn1rL僣j+N
+1RAȆ'UHs-i]גfWڑ)+1B)õAМ4SB'.,XExɍ>yhI.,'pJ R9
+< P
+ƞ? FsAj>Zf 1rlFxdse _O]>f܄_谖=5tX;iGl#Fϐy5/RmG 8c􋣄 _؅ʎr@?d,o=ސ4I.)"?0ӧv#`~!,%eoNr:~Ûe84FFLJ"-{ rd Y-ly
+Z*!=y-LA}"S7nX(dF jL?7=( 摅m'&8; rh^C _zCQjjw;f_Xg=T:tdXq5E;>ٶ6Xh'a2ҳxJbŻ}sV6XZmWJ<F m,6Tv-(%Tb́X{mAJ/`bF$+pL]SO"%(U̲VoL\Hb(Y<)=YaUsL*ˈAGDi\l)b2ň>/-o
+AG7
++{
+Q$gt?ߡ(#M#F
+Od+_iD17] 0A "3$g\mIs8ך;sJ5#D滷Тw+jqH
+ݭS"li ^񛒭%ݙ 3,eFB7&\sa8/˿vkZ-]B meR3]i_SdZ>
+b2e[ύт%1x9/N1l&q1hg3[-R2>eo<b 77T՜ {ȚD zZU0{Pm6qwX"n D}8+CcpE_oBlʝEON[z^敿;4Cֽ&䳓Y|FeliY$SNfZ҂_'q{M͠-E 218u2W'/r 绥-r(rN,i>=nf9 ʤ+ {M<X8VN|e]}9ƅ6]QqĴ7+FpbܑlN6S= >qᶅS6( \U|5'59%pu_>ky5nCy
+;~=j ^_vp<%{DN( NC3~?_uhaW:\wlYe^T"b}qJ9m,SwG7 Mݘ[O`<ȳČW{9
+wcc< lm "ˊ}Lp2(zF {΁n" mx%!*M= T-[JPTE![R3`@j5pZU>\
+h=3񱮉g BFާwX藅(]jR"_:Z" &Ǿ4&щ>X84b#LR"m<5ӰP{Z;uIEV.%% 96n(%|pܷ_>~S7hFc0<|xVcA$Dv57ZIH>ƈmPAzX,\dC)?5̎Gh2ځ7 xb66+; ء\ŌxFIwđLe9dD,Ÿ>`tѶ'pD9ߨ{1U4Q1
+:E6X[P^BH \}߾|NZ]KNZ=Kx8EOnVbN+CKcrLwٟq$U'MǴF%ei>gZMp
+~'z"uh
+^)eʗYeá R+Yf4+2SCI>:kLDk$8
+owD>J(Etqhosv&RḦIfRD/Ha{\>[lucV\9'V㋮ߐo>3-2UҿCn<0ɼ 6qJAh(ͲHwe'/7Q
+Z-ؓD0P]]>'NYs7n C#KCԸg>*Kya
+whZ-i@=;c%%~|&`̿*T[e9.>~St%zWʼnq
+ 9TΨhM4Ahխ c_7zIP2dJnyE DvKbLeE G1߳a=5M%ù
+Ú4d y\._]%#MUZ
+j\~clG3%ћ
+H˻x7&es$D_VQYw,! zC8Ȝ z
+46i,2c_
+
+ERS2>vL
+\OҊO{
+d0#x \O.29 D@K!{J$~_\.}}<?bY"Yp_O(4ߊ88a
+nkH:J2d>xm,2"p$uJr Ρ$R1FOVA8,npxٝJ6$"~zC&F"tagy2xw9ކLoEy|ߩV8vV=tq<ӕr,y
+ SxRQ:m]f-͢?…,<d n%-CяS|v$amݷ}r=4Zh8 /%(͹J}G)╠*!8y $u$;E. LUFYk4 ŷ\sX4,JtU|}&?`$8߿2uPIQa2B&5@+`+l
+MEw (%O!c>!
+Kd%\q(›WZڨk8UFCse$\B oU7%-G=5㙩9mI:
+Y0h%DKRv z?p4gi֕iaj:CՔYs^+s<^5 5 dNPreng<q"V5N9w4I_vx^A$僵/x0I"]!38ba~D O,ʆظC{__.C䈹Y^EgZVmN{* ;.B\9 { p(N<_䋱+oݽ3N[5&_ө8zBXg Zz~&]pZ=?%ƫ~5%n=qk`.*R qe5up?M&ީ0&r2PXtrbk^^,`l)b'+)۬jL<PCfgCC>a,Bi<sBv()|H.<%߷JlbFŧ湡/F:NtA`[R">yVfzUJ K|E.KԽz#΅E_g܃#{\bDy9Hݟ\K;7xHá$I,c
+IyQۅOX(뀋Sps "OYG>ݙ J1iŚà?nZэ{>^'c~k1{Er>y5a!V1jFM5t靘Jii+3<:㑤D{&aahjp\kpd&SaɠltIfR5 
+hs R?}
+~W %
+Q45\J*rQ~!?JkA 3$.N@U—)򶊀єq§1SwzE%LIyo$բh.}CƴECm:x
+%_E Daơ"v*""A朊jGh1L.aLS*!D9aZi, :g^Fd׈DI$Ly=R.dN
+%Qd-yJsI@1@c]&ŪѢkyfD$c߷g=4iΗ3\ɦ94{,0kpޏ~S &U|tp??xH rB轼`t&d>i9}eun ܪ,\(
+P=,25bc9Q;x%|L{V/般(AW"7쳁 5,̚D%4#dlNs'lȂ~Olm_
+Wxq&^Rט w+0_ُfe`z߿}*ygv7
+-|H/n/ڵ
+}EjH-W]1Q .B.Wwtf6ϡwzsFVyrt14Xj7ђNڙ3=Sd, _L~zs|8 vdbvw9Y*H)bM>?)aRʊhndA$.v槛OJWvtKz \pg-5/:x 8nṡv.WwˑXVB@
+,ŅWm",s(n#ET{$(a[\6ĹDLM59crU!.Hko;/G?'dQS,a֍k:"Mhػ˒5^z
+QGvzkţY RUI$Cu[{ٳ߸=;I]j7BlRWu1Nlo[5X w׃Yy^wRWW"Z-XVk %e1HqYl
+g+B²/D>N](,
+pL:^̠ݻRB(+UZZ)TnW}\uv޺\QkC- vDdbŊNNd|wˢ3AGTR IlٴY uβ>_AW1=f+bfLdO'\X|b'5..8B~%-9%o7^S,A+7'yoꙀtf/ӛ
+$;یG&DWGv1QxO ŶvՎNT;tf>56
+~&sאX#`9r`IRtFD LIFI)ɫzl˖k|ϲY[Fwk]k)qƷY;pZ<CIsNՄSV yյ.D(X,#K=ǼhsQC9
+[C PԺL[bx|"|r!-PNn[u"țW ‚,O5Nd';
+נoOJ,4~e>L9(|YԖXAlK5}#O bk3^/vfq)QҰHQ:[{s#>^G$˺="{
+|cCp-4e5kz'zmw|jRa-obj] sG~:_Rnۿ?Dygγ[ɣ$;GȵY6SAB"eZ ޯ#FL;4 TsdӺ;Xvt߄VdQȱƶ(ڪZvv,DK[.3rCtudA4MK V}<rIG"4iũEcuRe䅥Ǫ-~nH?ql Ѐ.PcgR
+wMZ9B>Ahřqbץ,ύcvl虴}8E uJ;Wt ˁ1 XA)8[_$ ]{&T/Lَd 聩@\Ѧ z,LcھR7$1ֺtJپ3SGL\sfm!$xuE?\.f=,U=civ' qJt1{qC߮_bL6F7 h6mG8?,dzú }2fb-zjd1HGW6Βe3(vS]
+*
+&n4vٶUDYb2ɇڸ1hPLtzw(Kj[Fqo\p5oQ/qhRJG2xne\&78h'VZbYw[5Dj{FԘҦ/01)П@v<L
+Ni`~du|x?M/Hud&)9vz
+|H=Œ]tVp̵[l|.yw48~ Ɛ`Y|] '#|V--+h! =%zrEMQ%%^. gcrvٴ5a3-R|ydz#ڣ̵H,߻vhk YMy.=Jz2oOL/39L={#}.L`lAF˶O6$,<Us.Y&g:
+(x nz\WW2At
+1CvAt?%Vx2qSB2L#X8
+B^p6>{
+Hzq7%7+ʹ(*ju?D]=Ňz&'slݏk3f.gH\"(/F {'2!S*52غn,Ûw^D<fE[Ar kdH8$@>ruQr8ҮA%6\e%+)L>@sKN)oUx.'!t::ih>UL3
+jiX^=Rk4jkH4,*ZU
+er*M/?g6ʰ8*I#>: w!' FDZ肓|-qpڞ夦HP7BDW ,ТLؤ"@퇋(DZ<T>1 >bs$1aJG+W%Us`YѰ&f!#YP^:<K 9*᭗S&lIIA:IIQ@JS[C=a
+Z[&`*'`tr>Ml,Baҷ҇|W,t
+ D.@μIWLp})(S1'(')Id(M4J6g}Ml+E',;۔O{!
+xXKq
+GL/a`ܒ5F
+^PD~ZtbCP>c
+WKCLQ^d8¹$S}v. `y|~7Gy1܄{ hWqja,9F(PϣqQԈE%4aE5r?+/r,*ןwˋ:uJyFyc)Dz Ɓ4
+b`iQ^Rr(.,6NEQ(<UxEQqC7`
+1$@:^a &>lkŨ)zſKeEݏ.cõX^Bi<eM;/_Q
+!&ۇrYJmm;,ri%bL|ݏaY'
+6a^ +!+,$~1<Oy]ljI<Fp%LN6VJ2&
+Gѭ]"upIDEGK Feqe ,cx(E#|tt:BUS2N08.I\9DOPw8\W/UA0-?,k!
+%WHlGÍ
+eݰ%eK=4+|,A&Q(mĜˡ~=mUD$\
+bjo*
+̐f(T$C|
+34*~]JQƺyY&/97WF3lT2UY BC-Xn+c9\"|ZFg>gsR
+/:|YlE){+PU 2VGsIU@Mׁ1K3Hr`0fR>z9Kɮu`hv((4#b0y6FgHY!8m &NCmrMo.'.cQq@
+F "/{9*Ii;N"v3<T`,`0$xWr" l`!.4JXCEk)A<.KR]:-UM:m85\,Iw}%DXI
+270\ PU5!y<&A/-ËS $9uLTF)p l>xr:<zԸ8jy_hMSdBʘX0,&:Zl+@1[_9 o_
+҆!2D!*ysHTruh<z$*s;T>.;-?HeUSӛZWWn([8D
+HMd7OPw LBDRZzz tK=*+R?d0"4>7U"ke~Az\-XV]gf Ǩ>MڠZ#\lYggG!H_|4zY.ݬ*\ u[}x
+S @>le~&$iU6:^e>g@5f]1=Ww;̱Zfk!jToL0>O;فBGx1!ְ$Bq5Z`#.-b&[lS08s2ȩeE`N@jB=@~| a2> ф yI[?ןo>p@fo6^dm'ǞU*MA1}N唓Z` #hH0?l'gG$iƤ3q ꨎ :pOA~^Nk;>G x8X T-74
+nZ}zVaVwch6s8Yh*Syw<՛RbU|3zițE]ǕʗbEcW}w_
+ v
+IaR5^<@I RK>yKů3TprF(Hdya~Mۙ/5n}nJbWd;Fb$qSNwʀw8}?eD(URȟ<*
+`b!cꝢ6 !E ^2& 9*G'|*N ɭR \rw0tFbԐ~.%oC̭˕A9
+cy[Kl]Q=Rbu.OH$Q.q43".Ruw2~h@\8Ʀ,\G%(' =$ yN mhrP2K2Hqᡁ]h0>R\Fϸ!5[:ֱ21u[WSp8a r9c #8"۠4,gPF%<ZpRE9s~ѥHKT?[s2x< Q 1 iS0ѕ5S'JQڬ`jRdF:'E ª7
+*4!ưĶ«&r}chnl;[]Uye5VrzʥLu~ ):n^Xq38*VFrJ[)ıD]_4V" fxK~hCuvzL]a
+$9;=/& Ȋoz"V`}ޏ(8T/y W`YDR;[Nmb
+iW;$JHl[v۵22XC+TŠd r wb2pUwD(D4N y0!z~xIR6i
+O<̆5+yI%zzr
+EjmV()M7s<9=FIB$C_iz}+=ԭ`IIZzG AR 8|`-DFU8L'8+
+ߨ^d>F"e^/Gx(ty9z^r\6AѦgW¹mBkX'0S}@w$mqw/96 G;QGə\e|ÎyAҠ=hpI`WPtqnv8V"&i"Ebdb+* > Ϩ9;
+'X|pzOD5fDʀR+::53g%5] ?gli`Rl2$%Xq X鵔(mV;y7MQJ.hZ4S EnKN`
+J~`N6ht~XG.7,& ln;EsBZFǼ"# hvm+H:F@+c (yeGO d)XGDJGSUf$zr
+AK矰E?)̩_,sU(ak,ruҤHpVea`a|016ZGw;J1l1
+KH Fw- Wilyxya@H-o… 4gIꊽ
+
+W 
+"Sg҉L6o"9IʛNh\VFň:V {TN9+ieiY\BZ&yq9Do3I_ F2͸Os7ty7IVća]n78lHHCУ*#|USɠy#,Ɓ+j:Z6|̤ϰ1QgwCgcwtEމ`$@!"!OٶzpHԺv
+oD,zfpRe
+wR ooM`7[.Qم<xx4Cњ\g29Yy0y!fL/AefĶ;@>)ׁ:<24w')= jqe0?Q}.<QJYJI4M\EÉE=
+jEjeHVJfLPoXpxܞR(Sf0U?U<-(B^9btb
+**0Ô,>UnÈdT/ E$Wnı'߱9( b78Dዲ -LɃԥ, o2ey:{i+ h.yLu6g=_'3BD+4XY";kę<5(n;0N_֡(j3CbQ?쮮$6=[_@L!." Yvs{]|
+:9KA@<śQ@m8k1~NԘM`3hZ/OV ]Xjm\
+HԂU낽@Lk.,ikߥ}GRNEY@WbI`@` A/ݐx!,pv8
+CuKDf&I22 xaPLV8ɣq]f軻mB_)ψE*Qߙrc!rt,OƏCH BI8 +*FE(S")b2ʵ0?&OQseV]q) H$#ҏo7 )m]i\ "I,HEϣxGp ˤ.8zs̭?"Ңsa9KlQ#XRw҄ɸu"H76vLSA'j4$[T13qrەva}ԙHaAc6>"ŒN(t[ 9/Pյ☦`n!g1_x\$IZi{ٗ(wtȲe>tnKG]-ZoHzb( W=My< "qsY0gF2rSk=2nV$6ސ`_[χ~E6d |<QȐ(%R።(_
+[7D}٥嶞]
+"D; #yFGqrvu8WĮ]G
+"1vpV$zX J[,3| bL@WLoe
+qEz 'V[gfڦ?$@{3q@_?SuXة[dMZOAb\ݖO!{rm$S@bQ~9ʐIտq]17+cF&8 (:2NA>̯1k C`0VY'/_C)sLXG:^bJg;7R)Dt(S-&_=XɅ.o'}( )\(9[[&f]sxnGz
+Ӻ kc
+}k%FzQ22br?t.cȆW}+ޚ[CfWxiٝJ(LP %6A:oQar'%Pv WuQIlo "bHjp;f޸v;ԮSCJ)nfp Eq9D8Đ z 0! D?fWK$cskG/<CZn)+~^Y"@+}NJ|B+UVLߒc1刂%#^[qSO6Ɗ
+X
+rc&lekCYILH14 *a dp06A.SvF]7A0'/E{R"@QN\İT$0/A)'23O
+SR4獗-"R _ʽR@ I>O
+:[*Y&xL|~g=bYsrVb["ORQ/-l#?sj dU< 匔ε1#M@\V9] [$m8ă4%T㱸ݿNå<rP"\vn X0#-T0T y"E1f@A&3+VY&JֱX9?՜&F /=Ù'5/;2:۝0>9Z uSY2aICp&: -
+fg̺)բiRKB.gh?)VE8i^6@`Ӛ ,  JSdT;]m,QٳLW q8˰'0~)DI~6WZbUԧ2%3*LD0xj{ I7b cy9i_3N+9Zԃ1@Hh׳
+>WK~9C)Y7.5Oc-B07#O7UR2\44` U\4u~dp#n:~"3f5SQGw$SgQѮH9^
+ΈP0}W57
+GA4m&U(:bJR}Eϭsk us3AùO<|!:oY9<yTNEdJٯmk#2K(<x,svytqkPe5$rstyJ\p{A BP\` #UA`-M/4-I  6
+0R)Gai0` Ct0kgy:ecHQD7A0c *V<[ \_=f1BĀeI7]
+=)G fn@؋3N:TAZH Xy@:7ފ*C̼PFh=QD' ]i٥;ču,j+Nw+Jq:wC20w[a(׎cuq!."{1ЪOJiU`'4ud ALUa/I~q _<J
+ŏau%g8LF{&8o]#¤ ?X;z/≹4&B~N*
+>P7%DWy `z"_l8/1Q]I]j->?;8&Fc,>]2%./c2b6|m؃xt0MS9Jd}|')?Nt,hM]
+.jo<ȆF% K ,U%ƫߠ)\Ĥ%gĔ9=əMHP:w}\%<#k$b/B^7EPz]>oTCό"F<q,N;QN€9g! .œ@#{8Ρ6Ű/iC). 蓆k<W3(+|ҡs*OPwQ$V:Y`(_k>]%w EC*g([?Pb8y q J1IvW!W4^*Tl\6V\IgM]r
+\LSAO5m1$` ۲.pXUrF^AJs0G\.FMmKT;cKɸ
+LosXWEpYI !_ t#K
+Tj_qqrs
+Bx; ?Nnd@a9' &{K@ ,m
+8;;~HE1um6Fnem5i{aIX۩
+ϑs=!a6ݦ¾ ^SC~Z{q O#e
+C?&_
+r.0dj,*9uIRѓ:L ISv!-UsgSv=tUclD@Cn{sfmϩƒgI>*nk
+4X(FƓGoТI*p_s-' |TjNWuۖg9}89251~'\nszHwŁoy>Йʱ׵:y]wDCE.XTS|HXxy{4ϓ8V1^) ~LĴ!*BOPӉ_dgWω΢O69lc=90S\ݤ[>οDk!4ǀFIiF7Z$b-fpď
+5p"mux z>jyzKRv '2_7lևMFяoZ(;\pI>6^?,- {sZ-p#5|.y !'M=vN} پ~+n爥Er8A8hTJ rMxv/@[bʜ:삓Ƕ3+מT1x1_E#:ŕU_*qu]Wl;
+`roN2=@w]i a;[X 7}Fu*i[%W=hFSJνB aR`|&ڸ)
+oO LI85I+ [j+3}44.Kִg0D/TB>zD)ˌ
+EFf9^r:d9{拃}G
+j5 ְv!hsIfz2lnHRzk|ZXL$G'PP!,9/xZZ_Ν?*첶RV("%'c*H.@=k-qi[**:僼c. s
+|?҉9w l=Ei9`w6Ͽ>R
+ )ivTunMUcLz8UCoGW+&iY0ϊm,,,HW]$PxJx
+Tl puu˂(@#DEO@)rt7`K8Llߦȼ
+IڮW\X9PW6 #2B-U ";$!nt_|8 4@ېhjcU3¬HfbToa9ORD]K 4A# bC1y zAspIbNĚlja޵M$0E5/ܪ_P׋$A0;es0Jo dhs<NW&]qLPވ7JmBd"7Vs-[\ᒪA@QKU͔+-!W-s ]#ğK VCؽѯv_7 j;l,J{zĈU,;N./2I*g/[ ="{siL%)#}
+"T֏Gaк^%cV 71~
+|
+Re1OILr`B*h"W0@sZ-%F:'hYmT$x$7uȍ&3c>.tY-@M,)F1n}TCiqC
+q
+hĄbS7̮u(;Złʫԕ=1a+6y*=T
+[xٶBJ(]X" Ącƒw \qA2M 'Mf)@!P7#س@m}Cώl/*$@;m2O]AXk" Um84ϩr=7J45:^#.f>I j\& %tg_]1_HSiBQ{Ʈ4F!=眔r$vwSR k2;^!$7嵀`j3k< gj^4"FtGnFz~ɺ@.|hSW V s"ίmfTcz72 aMs(Ě3+ RNtG4#ap*xT`m5Fȡ|6Gpy,sJ\qg$$1e#&1QW0)2KMU~z`qw%,E ڌ <]1/P+G&Ee`ˈՋ;o4fk4SD1t lXa1EV}ܾe¢9<A'(Qg71׏=]PzNZSz(L Zk!]:D :AC0Úw2DLPa(a ԂkZS ؒF2_C;BbfiS!.,g*Q(HoT"$
+8h%\Uص D.…6aEN)&t3Z9.AE;+(fJio7
+D4kt` XF`,% Y`m"2pbn*`| 2}~<6ַVoC{(Q_"{eX`ւ9:RW%gB!\٪LȊ$!Ai$#%㕌%œW/^&*@Y.Led 4''Ϲp@]%699 Ob(tHcwG-
+Za3ɀP8¾MnQ+YY H<R(r ]n= <M>=!H]_O׆S<Y-v*IZ_x5vWKcmĐ }8QNP~e0+seJ ɂd[* N(cy&> !/s冷,T;->y"">R .<SޚTa}N?iF+"uZ.6u7I
+/Bs~h: #u]hl`N҄Gȃ HKT`+ hT+(W(Ob"t&Gn*OYɚ&_Ԏ"9 1R夙H8|ɐh>$YEM;BabS*In4t}A Lu ͇A{a&d-HkH _YAj<kwAd.0Rc/ ^J$$9[vM??(2*S* @[<v:o#g'drIj6̋3]99/N{뤔L胅Ƀ+ۊb׾ *@!wBV7' $*"g_N*R9RuAIY)#}qtbη),_ֲr+7=eLr㺁0|A
+\!<NҼ1(GD)) z9h "T0jip:
+J~:%4DA
+Ն0( ' (*C'0l,6\liCiPBB4ú4 nV:9l$GAI~ţ={VOLrB&? "gQ\/zeD( nXO18.*?h 蔵6eM %IVU4U)ZM/(Ȧ;gY!K6J:-f2_xN†D.xұ5tܵO!vQ'x#-C M&07cL`G$ⷷCZC-Wi@%Qe@DV+L~vg% R|5)F/ft MׂD2&-/03"c8nTcpBUJݨn@Z^Ġ
+[}x|, q1l dG8S_TBjrtu1cj!lB&ؐpI)k=} F1L7IKAK
+NA=E
+k`ojU3Re~7*1
+Ą@j%$7ߌ7u)qA! j1B#+] ,vA
+Zm!$l"5f;i#㞁ڢAP ^dzηXΛBM"3U KnqԬb!IaI- _|5&"TCt4)V|H$ 4~+-I~ Ŀ_aM'X(E2@t+\~_;xYz拎+`$yoKA02zKlwxF^d!Fm:J@t́ւn܃o'v\}/
+V`02{!VD8MȦkp[Ԛ8FoVw h1+~E)%!Y_aHmCK%U )Ra݋Qi&\
+Ո;IA܀l)qX$'cG(!PC`:IC@l>p4]`c,1G1]`F ax'ʼzXtJHIMH&|
+^(1_IYȎZ!$NNru9:YVHvWd -@r88iV*9 ^'C8~X:Q61R(/R>v$l 1_B ģ߰O][aE2,^)CK_xGV.0QabXn}P*_ڝBdRZ.R3i"U泾b(C<DBi^J(B
+=X3ll'EL wYb.hA^OL]l2o;;
+Y$::GJZ<aʟB-w]x\2"Dd d6}7}$v`. l
+702gف͑qa-TU{S-Mb{P
+2ŠRB7)v!d/"2P
+M5a`V&a@J$ BFfc轔 Zt9^zh„|M{@=|&XHcmd TYcO!:JI8S6 %#UODah}Eke4N6pN=쫒 ceaj{S>+!!a|1}SLm(9wAsBMWǣ(]
+-grVmC_ʘыguq|emy pSVwD\MtEP&
+czW:D 2)cȬ砏W* # ''%7_}+P":^bjC
+
+y ̿a ނJy`10)t9㕜?o;2oȮEK6b21dgVx̄C>[Y݃
+dD XzDb7&2yx!%dOq:T]r\Adm ,ݷ"Y9|95[2''?)ZwA gwٻ\ڊ%=yHkoQ+/a܉Ev!kCAhr]냝pbtrKa
+YAJs| ݿ:TR1R1,ɋR$Ro]T?sɶʬ"+Rn$XԕG@o$kPר%>/eaC6sd*4KDqیn!,*M7vhfKVcTbs뼩A{Rx~dcFt =e+n5|KOZǽXvE,nL WQ3) WFٸhnf\t
+Xtث&8a 4̙U*"",=R1oV2# 5-Uw9nW9n v>9UEd&oh*['~}[x-B(t/1{Њq)R dG1D9 *L|qLŷ.765&սbHrF䶪+)l0䁱B
+ f-1||ԁ32-V֩yw!c7_ρb{Lc ܎GmԂd.F͉I4 g⋢[N=5-ٌF⮣)bk ;] K2L.C(Q,ed&M=(lH92qݧ.ɈT{OfY^v 2񇸞_ jf2ӻQ&17&
+5n
+N&29nJ>,spQ/6/:Z|~L<]S:CN\ #ІHB[1
+/]
+<Aa<pZPMb k)KDvrHR-T5 \R>ATbHK%sϠ&{ru6MA*7ȓ71|@uKY>p'\A
+Z3j2LŠyX OQ+(W9Eb`Xrl9Āp
+R`dvПe򈍠gvQo H&"ZS ^0>gT _Ebk~Á cÄAXiu58ؐk{xdg?<J#15U|(1c+vJ
+?X\<ʔbqk4XiIX9 zؽdߏ"^j+ťҰ ouNFEeuVc\0B@zA!KLaQeB΁`_څ Um0BWH3{h<C9$>e?gFYDI! (B59QXkX&"B}0ή1]
+HMOw LA$uo1߾/$f + 0ˑD2AW٣ s>Fcb!V-*uz+x-jVK=)ƚ5RmxQ:w +sS3}8fPzYΚa1jOk3}mkeāQ-BZ9P,3Vz_e8yp֭ϒ+e
+'(3+Z* \5ݒp;j
+PqZ~Q~11TOc3gW{wn0
+/ꨥhDkǤ)8WfF.݁(%l; 48yWMX"AQ)Ęk@)۠?~ ֩' jP =z ~/(k<ہvS)/2
+ 6gBƀ$
+ 5I;|Wg(pćDv:/ky~v$~~(wSeQEA@P4KI&\R?!~%`r8Fǥ6 ' RB?Q&i6Br)̄b.@ycmTH3HC<ف}o%bmځ V9kW*
+@y@_͛D%B9SA3Nȅ
+hbU<=1c T40
+"A&8:N=J< ´m Ǿ$PL?\<}#5(5#f3{0cyê'4ye(.HgY%? 6"%מ=$.}NHS4 UtSr^Y(3
+3
+! >H6z3cax1.)_n'RBQ/ǰ5(i{ut vkmYOD
+ƣuUyzA0l0_QD rU>0NC(]M)î" ;5 =BŁZVH '4d
+ X+v4\r|G\ikV8l/{
+CmV
+RvQ?H(bdv0Ά⑂aXpL!ǘ  Zs98Lr@1ͮ.ƣr/t/o8VD_łAKctN?Ħl LXbw}7!ImXzh|}C,ӪK;M.'< ?)|&+6FQ*r#te7U S)XNyu.L{$q<Jf\ 4xԖƏ'L;+gP /`Ak
+zvgxĹ[R@.U}=<n0Sx HLdSU;
+Ԑ>ճbRTm]\!p
+-;-Ǡ'
+KBl= ,)
+EroVY»j/>׸-I^s
+vW׈{CdJ4scضxڶ[2,$A*0
+H0F`@ ȆsPb#htY4!jW:EЫU~~[2=+;i /8ܴ es
+/n {
+T$v OOs.ʮ$eG#H4lbV}ک)%\!CӠ7s&#R[&<?
+aHfM!\,YSvQ!X; j03N*e09 tAd>ʪ+r]D7HzJC#`1U{,΅`s͜Sbʓ
+#qjGФ"2Ք^%P Lfz)2|)AOHV:B$2&K*~hw6>+ZHJ\ٶ,
+
+7 gJ
+
+Mv"^D.`3bOUr_y;ǐ1 mಥjZ#$ xU)
+^C Q
+qP&p7e'@tӑks5KFsGSf!r,5X갭\ fc23!L5GإnԹu{ jb|k {F*,
++Q>& { 3!@E%D́t۪ٮo Ul9)`'++TT =M(
+ u_fzѾLz`9%1YWQn$$EOLA!c~,'ۍ9" 1N2s%@îH.L#fԶy6~iCڷԝ;Tނ _Qh2.MC`8z;F"mm` Ҩ6JzBes`6+^<etvR Iz"|_tHGJfa]~^5'Rc)+n02d!$\N$nZ|GKӮXL\z , j<=Jl2Q=-k%3(˧>H64obm]gF{mia
+[:p]gX^_A<Ma-$gR6L6YlKrQKJbdlRtYUF9AB hK
+܆B/
+d:S}SAd$9S6G!Jz%y`@Pxxb(e
+҅(K r -rW>k#3Gt RC$1A
+J<#v@R9p? ̩UQXŨP&CK*mH܎kOC+uAx=m<U!_N?Ń`y#U:Z K"lT<=EjS. #]>2Û`V"c](t;%Q$q]djEA>qIDO;4ú9j/v~usE1@Db ~ ^y#@ C h
+pPT\/@Tgh51)mvLkpLڱ Bb2սփZq̚"dZ
+Vp;Cg&AXPd/\FFF8av .'\;V>lN.8F6^`G}ңpSƗk*Ryh[q?*jǨ2=w@ i֯BRЎ<31ì'>)Ta!^ZM?[tH'/,΁ gֳX] -R=(aI&cU.W8:r%N;˜s?s3ö̪HDEc19g7.KLkS(@s1.CB zrxlm-N}uq3^tyїsX9$([Uũ9`'mvY&U*?]ԏŽQZ^L&Qbxhb#נc!%NXrvUG<Y<V؉ `CXȃ|vV%BAԯubjǨo:?I7F*oL\./ X&:0ּ|H-:<~A+c֚:`}L4ۺ)w94'lȃ1{j.Y6c$VJ7!C˪;;1QIM  ـ`sxLL)VԻ)T
+ѷs
+7Jfzߤb $zyEe@kePԆ5S1IÀK &)\?gtȘC0^Y!B>T'Ю
+sܝK'}C
+OZg0x 'W De9AJC5[}ϕaȞ}oT
+M# (RsIW
+Lca84bu9"O_{$s.F_?@Tk#D6s;}k̓R@!XK>ҙ672(I "oej׭ j"&,6@Jꉟ^oH줌O9;97V|07|
+cfՅsL'92[]=Mߠ͕a4b"@Kn tG/Y%\
+jHŏ9^9Z_ߩ7}('1רG//h,<QY z "5p3؝ծ C!-y 0 lF@3(sQ+e0x\ `ؒW5 j"#E ㌜bv_H{ :Pi,B|99:S L0f@&sHtBL&/h2i0窌]5bL'&,||_ ,5 Ԕ'SۮR
+n׶sEP\Y!*"Q`%-R7ycEJlab\UO&*R&pS2vbPT>j$NVXRoJnɭx#?$Wc+!fwO}"ITueė F?T#څ3MӟSܘ?T1xeyc|1"5
+(^e5Q".n^қa/*!A49r
+,#۰"bN\-d
+뉨v9-bU#nqƱ*D[>R YrDS1y=
+TʣLYtg㶝o/EegXMfz3@
+!ފCgyc#-7?-tߑQq!.lF"k<q<'-52{&CHS`1<ho[{\s͎~H_3cJx:Kw]z7(YY>ߧ7
+DCNb+v0jCJv2Y/U20Kt
+]m8Y j{-Bٙ3[ar7ip&SxC
+G
+c3ڻs=& bJ`kvZT/ﵫX @@ZsdH"q
+S
+*nDӇ@P@"4Il=Hk2PD<{L`%Դ,õC2bgfa9 æ[E緢_ҵB&]պ|kѻYU ,1"9Y,9 Z.ïzKb_kx 9/%%ə"1}
+;pis(h-L'0cxRӋAX2Jr
+-d q >) Z{p)a? ^VMRd)aUCn(o{瞿|Uo&OWe֛tغh&i.V
+輄h[6*ÞE bm
+TŅ
+6̏U0˲^'IFO; h
+CۮuTs /ktF|K:U?ҧ^‹d?=ȺKu%l!׫T~lu ͚
+q=/@J%f
+zj$$p./i3yJ̮ǚCH+ҷX\:=eՎhΠ,Ip![ir<395ZD 4 z=2iĽvF -oxN$wo
+$p}O~ ~ܷ C+Cf1ͲU\Y/O|ײ
+n5U}qYxLp[RZPרcSݾ5NH┈#ehDtE"aO;p=:
+@&w{ CS(o.Y4d5ȾN|zdϩI$pZ驩8~7gӠ+=$JȔ<G]BmIRm ν}*-:c/, Фc> {]QkG8ϐA #Ap::tAʼ :㫴,YpL-,D1 5w/ME$%ҍ cvXuӜS)dϘ>6s&fn4 b|sþ&h^CWgz ?@Q4I]'c4};TyoGDN+y{geP팻~D lSpJDn}Lwfb#cӎ|HY*qS;Yle{0[Bپ$3Q;ZT\#^VsTk+;JbQp}n
+9%_uz3: >unfPq"/-BY Faz X_+6uu쾅n_P[dI>~S!zcG|Bz5B.L0]T]C󪗂-'
+ Ѵ_n\dжo KhAo!𧷛a %w0nSg"h|4@χG OxcJM ;ًs1TFx ƙXP x?}Lj{ΞuA+
+<&>-jJ+l&|='C oaOhAw=m
+tCK!X~!W7 ˼G'fq =C ڶ'65jR꜖')咬-Os[vZTfjׯ"./e:v/}z%_$I,<{aHd 7&)@ XG$ ?CE6AҔ #i
+-0#Ъi.ÅAvUe{ozY#&
+HѬC.x
+Ij:vF`8 <
+b1|"aJNwܐ)@[UIA'=7" =v䁕+n
+efGoNsl6G混.r-?Tg%VGVZv>BMudK4$5UR<b $7ۊpSܤJ42>m)c`=y4}b1F}Z JY P)()i?n|: אPM (}apCHvJL~'UF^í0
+LL#_ bP3<QQ4C%vVxĈ`ͦ*5k8|[VyZ)cxأo .٦[dy fV%o6#JRMJ^yd蘨)ꯠ^ χx\ 1 RV0_
+,oޓcK[jK2ʔagl}VP
+7KhMd2֞W603S,wQveg|qP7PRbZY<AsH3 o+6hRb-V癍-qh,fp w[50^ѨZ!?Kf};id O ,ˈnd \A4]izŴH MOr+#v"l ,:elw&#
+
+HyV'%b#X e @M06Zy oU#U \wUc ʺ,^X I_3+]q3A7t(wm0Q;AP';C AX_./ǜ|]pbNtX;dAla]wo)^fvNsa|s)Ǒ/F5FGt{^j퇑>ȾSȢ<qxޝm`>-^ѼI+ӅSo,dV+ $#X8 gT*0r7A/OzwjoEo)>eي&Ѡso1E_I߉*W3P> TwסBcͼgML_i҇mzի>*Mf/sS@Px; Fg @1xw:".Е4^Ng->[ógˮg?fǹZtN(c9ޏuPgaaj'.
+BRx%@ ֖`L1a_X7@/$.ۃ_/+"l@LP75C+-B13+!tB
+W wozKO#}=DÊ`bݯe۶G?`vʊ 8"+ovI|o,˰H9Igm%*0~s
+f K%86E ^Yq.b<Csŧd} CR// 2os Lz΅5ll* Ȕe3DjeyFGhKHYYW'6F!)HfX{@ڹ镳
+HQ
+rNW8my MRuaiy
+nd^dxCi|)q-'CN@iao7"oc{;*)<4; Vt%i+0416<%1B""{UfxlBqomKI(uH׫_<l0,Ո_MT]EE(2V3وڠr+~Sf#j@Y]0H\ Ά\uWԚME5JZ$YoɱX9+RsӠU Wd:"JZ%V1U^ & 3U8w\yGfdosK F
+DX~+-"D&ɫYRd3֗/u }?*qtfC UIYj&AQ5MA-
+Ǭ
+a"toe%-SPT3%؃2HE:W ĉ*]4 *do 60JT9gPMpaHX0Jt"Y$ZJ75d
+JjVDڈY;A)6qJ֮%0 `ùRJH*ng)+fL \\M[ާ Y>Ai)@Q4>Fk_d!*$*EhGeU@ly"Xދ[ۀ%ebEwPbf8h @L=-Mt82.݋p$c؇W_>%
+꬞D{}dP<HauɆJ_Ok|G̊.0YCATf bqU#.2n1k.tOYI>$7EV&=Ua-)& y qB'ҖyOT+!De9PG7+V-yxY:D]Qӧ|ZF=*Za4ݚѩ*oDGQytxhEC-9:(ra @N P eYf}&90AReAK8(jH$8SŸU5@ N~^"LPӾ)YV!.yE3CFdPLf;
+l ^9&$s:GLۨ:D.d2B*xc@$gcüF'?vC$a#nJK\#:ewZS/Jr 3^9zj>V9"Çߊގ}ܦ>?Pd*J.mV^Ȉn6 RRd=]
+BCú[üRu[6U`ocociTIxc)|FY&E'L еz:
+I(`!Z^B7-Ek}u_8AJxi7+ w2(?r@\ta9b^EUoJ.5SYPؘ$O(b~mCVk^*8%|! iLMS`k-%T_"laSRP}ȫ9 .xRR%HH6E>5fc0'4v`DQkC-":O~. *;=, =ⷀ)`ÜL7DG$|
+9욗Q4}KdK
+AYuz) "
+?]Xv̅SA Y }-uc0M;]-\L&Dں.)agAкQr8I9|lY^cH 6`uRh&J|3jd{ MC gWBΰB +G͈ZsՄH%jhK+S BIq'R3j\$(nEU<e9_(yU_>p MJ5olFnipzS%QBR҇VN=>X.$.(KƓK[h<S.%a9B€=_#|25 p
+xwi`e^
+ i%>S)$ZNدK>Xg;)9BNFm}}Sk#BpjE.\"PoEZ2 K;53
+ Jp[IwLgktñG C`R~
+th3[HByp53*洚O6!qc™x"mLՒ/i ck_mhƱQT jbm
+p+1CLA@-1|y9892LŨAA8V8fD[6gŇsYZI֦<Vg~
+'<pPOQ.TApVⰑm
+.n+ t!_SWk3Z1KXG?~Zϟ/=hMcʹ~)zy}bH]?y}H/oWm%(uk `sbAUGĸ bB06*cNq`,lү_ODG;DVf%Ί׀ahEFb?*,6'v R98 1J?*1 BfP(-brejJ[~!f [Y1~awu=$)sRP d IarIV&ʫ?X&%M1̒%ėGKp48%G0Q&;WUK-I9 S?pt'j@$*dqOdr\~~Q2ܳ"MfF.K8^#8"Y;x
+v<b%in'|2ȈH늾o%~VW)l
+Ѿzs&dB}*{Q]<4eM|A/M]-d;M>؆~WK\q" n}S܂*sM[qW"&e{:ԚiO[EV:̄MR$|J;|?Lrzj%`
+HAn];DW= !$3.>#g>%]Ob^:{F6|fF{/}bE=flg7$ҲQV¯k(:@Nh1fslP3H%PuJdSnی^/HI7jሙڰUؠ{+yb6/J=>׹\(vVrC2~x;Tn}cEGa܌XssND_ j}<Lf}B SҲ*%SFhqSVKo!TZyΩ[ +xm
+L*ǸLuV>Tr 2s
+jt PJYfBrxէĉ`g 1=GO} ?V$#ڴRj >
+"IuKrCw/+scC ap8rj=lFrM.gV)XY7WR8> ŋ9$ҿhLnbDt TtxS5'^bRALȉR\0V+HOnwz>oz\9Ν!RjPnA8'_ЋdPԁCÑ@mGR9FԵm+ -RrK6D1%)ic^W
+s Cd'AP-bQ=
+̹%Ih>zJ0uX !?t/=?;3 P(ec^w(kaR ŀ\h12жL<.$ hH|}+L9K\ dVQNZPs'&<I7Eb)P5a
+ΌM- 3gl <WRmC
+Ud.)tۈI5A̓cf癚PPD^7^ 1{NyǘJ @yeRDjfo<>a>`AzB$\Q
+)ȵ=7c3?˅Ω"^đ 3;̩g5џֲY0dC 33]F#[x2a7ÅKk DBBtu⹵S7qF-GX yԬ5
+Ƌ6@&/ij^?iIN]1Xhޘ+BD`ewFëeabL9bB-
+yXZAڈR5<(=[:#S; $Du9*v ;gwQ6-sIVѣSfffbivYGT2:gy$6%,zrVK$nl4b;[,1RsgUUĨ[݀olA٬dM eMj߷Qౚ)
+1_ c脘FDZhp1S[_dI22_
+
+y5XWd"R~ rXNUR^}k ܏A껇gzEdi>.Y3I?|-2 UV:]@_t3 €!gAp
+
+mA2[яb&̵l/HjAĠio<4\|W>]#]R#g.Eo6!A[S @&c xijΦ] \ \rcb@`}|#Z
+
+gyS_o73ߙ@4&^ C2j(acX#VGޏp4v1aڧ= \&G2aIq' %ƏUfMbGYx9{`"]Rl S==}sJ,T\Eެ'+;/rqL8tl E[`J/D˙ÞXˋdҥ  |G] L6TG>7jK! H9:X2x'^ Q,05I:;#RlYfqJ[I?~2\[ՇvuG )Dx} 5};9MDj{o|^2Q, gCjy z%|uĞGPg]IY!RM $Vjiv<4\81iu%IMIj^DVDvYfBD< ^P2.QB^z˛+Tu~
+
+t9jLΙ Q)UF.y^7,QkZ7x呑?Q{;qbpCQbJ^.jh(fƢ- 00C YseVdK؏+iBf0ʺXď?aHI yֱPj%> y-\Qڤ^kUdtb׶N
+qՠ~ ĴNRVO^6=VX7Y83;,%
+Sq4?dEqtYg#4{t2BY6|n,es\!,I/[[MwcWYV,aZ/E䗆8Dȋ%s 뒯,J W6`!=lEC2H #|M9oPڲLHd
+.}WĦ~<nIIE5xu fNO9hH-9]=1l]0igޱߗ8`56AygBve |D!F]AOVEч*3r[` Bm?;#M/ɶ%~ڠ}_̧8g9%z2 47y2*HVy 0+*^
+ x> * ;8ǶkIWG j婢*|Fʏ?G}u}6,WMV
+$u0 
+s5F&KVU6o{nbYTP?*Y- tg r(dk43?9Snb `c/+kπ,`ֿuɟ/2`lR9 bGtԴsoZ?xf_گ&HN-f(%@2 [ZAEO, KP8`z走SbrGAO}ɛ闳ȴS*-$#_=-A f]z%?
+z4K
+K l%9  .Pd־n}z]>$*lH5NѫP$ pR#~TQ̈P) cDa%3F
+T1 ȟSPjU]]'-}V4v
+mHc:W<a SMA
+(94t]?(5`#+!TdD:Z%^[ƈ BTidJ^fX N o7Z8f
+E'"xR60ʏZ7 R)ds* (BɚX8if+Rq~u NEXNZ/ВsK1<KTAy& Yօ
+?Fv ή0GDɴqqHcfXR"Br Wh};iiȝAU8
+M‰O \B\+=1f#va@dOa@0D
+rIkBR)( n@/PR8Cry
+z Gf 򁡐J63e>Z>2w!Oö@s(BH'k%'>rM4Pڏb{곛B(AnLaXtn=F6Jt!'Ƈ_1*ՒbN=(p<6!`MIBBhYh$O_%SdpӚ5gZ2"-!Ę0*> %JU6_˧ghdQ?v(#E5sРѪ*8L!S6% AE
+((
+![иZ@)AqҠ1JHn#&n M?(dLB ,=bƸ%c~% r$s2F1fY*S !|uw=ԋ~!]1BE7Y\h/t%́M!C%#jkGMX
+L9'k
+7 R;B,ev(Ba.SKn[W'9l/:Cb壞cnu
+āXA&U)s:᪐)"DҎhҏ]zGfl&jR=FݕdX(" Uy4 <`޽%]Z bcQ3bҬJFۢc+& cB !B5n/U]NhH!"Öς<N8g ̠YD<h=!Z1$JF门Jʇz*~dETIQ:{\-Zp#z9TL4?4-ũs0J0bw[zo%z P<b8!B6WUVs
+mUs_fٮaJ:zRE6~ƇuM?b-jRQk!CSq0!k3Ar3jƝn_l=
+, !UUu_]$,Fs3?,)$
+ 'q}CǙgg7
+=ҁ'NtGwB4 ;9W8ȆXF\UAŎ20E!كnzGmi&FI\kC!πxTC}&9=Ȭ>,69dd`K1)ܖ_lc2L ȇAT]i>b
+1@J RymW):_߃
+'v
+2.w
+$t_ qݳ}y^flKJ*,+})⬃@=h*Kq3T`z}B. 1ܺU:*Վ2JN
+EC(zrk.4 76* Px8WQQ攪 [. + 빡豊 uCF, 5M3%
+io /?XMGشm  # lSM/PjP,ܬR:NH
+,e7g誑!XE"? P1&B,nGPJ6CPiAH?~o_c2f:CSokد~rS,L yBP,rjP :L#$g3IzJWF`ԭS`X9QHx.װ6;y5īpmy:LJB uD>)+&O6+W<cB~*z *k0k
+StY<fEG:YVa5.ث3=8ur^>YO[uWn"mE47cDKeSj:RuSPe? Vt")*W]TPAJ^'|){'?~@D4+*peq'*'Rf#@;Pxmz;@rI316L%'7u];hԶDZaM}
+1PKCE~ qNVu sk@ Nw~'7j<Qup& 8$z{5,P 9QWȪ eptARu>!sj;)ZRvZFGmE٩,\m,
+=FdY=c}g6QyVN\PpL['m&o,?`4%!q@t7#@Z_i`oF~<[i UܕI#Lߖ&Ӽ
+Y%"mu:<s]{[Gޤ^Z;#Huv>yC6c=~@> B@m8ΗxQ5seHIF"c#$¿
+8B X<u Iղ'*K%g]5. 7`BN7E܄SpIh%R ?ЦDv+j-$MjV 31{MaЉ")>@n?V
+)f/K0{+R<(>uJ]K"K"T\@SvK-?
+Ar3 5[H|3F \
+v9I>(HƾPϲP es\%'䳍2Sy*e kM `)ڛ6!+ %0 _t*{5qʜ%==
+-uӴ5E P-*Bd[Թ=B!K@<% VC,sb0ךi-]kd<fd%  %hA}ʝ8k`WgrjѮ<PH_%J,6GP<
+xcP̚/71,BM.5]X``1t0!n!Ddqxn]a$19,$J,QKjg
+DOrk(Je8;>8Xii75ѱ}eo!73V؁c6fחuC-9:FbÛ_X&J*)P_8,C}*bCdE>0iĸHtJ%q#zLEϡw}}DeQwbmJ^6}+o͑j6i1>n>}ѫ}a1Ȓst[Eja`祣e˜e&ͥ M)C,x8;',v T.J֗?xB@"D%ɻ0<~ iGmW *Yl/)r@r["49"ސIW4cp,NI}Ĝ3F󅍱OUi+kiH+ɎL t[0)ĤK 
+H2/.+x^h]EhM`\c4s*"M%\q_,lT9kVBor] [ɵgį"MpL[(Ӎ"O
+dM[\}%5$&y>FF؛3sSװDK{O0&I/*<:Cu//'>uxzkzs\ LO؏)g4L1r@|/8ABc^EM@[KNR^:?XB|&X,SL$K?O5
+C;bhZAc?~0`?QbTK^3tPH)Z16w<[7@ 7\ݭvI࿦s1IK_UC7i? #@e+i \}[I,e4!(бۊoҫxX(A$怆aBIq]qR BxD mc%-$1FJC`/'E}7sډN jX†q;WyowˬmƼ_@B\@V#V@žR`{ea{UCI}m9Jb*?톕dPm;ŌYQ>ע"' ƛ͸s?e]WnH9.jJmw$EC6ZE&F79/.چykjJc@qE,e$)Oq ^^|W':jMC& ؿ>pAQi1%R!7#n\! eΫKD(̺Vh-K2RcA2)TN#EBVA} /0zE>xzSCu8Ϡ=aI%,%vP6d_{>B~6~qMiD!_Z8^p!"sB;3|Ek"\,`QJ[/uShc>we"<E]~pla;B!gKZR{=|LZkMqSEƲ#TRfco
+.w 9ϡN(SSD(ef)x7&t|IϤ&p~ʣ=fCwԶЯ;O0
+c& R=dX~ұY`^K#b`qRu:75n[Ԏk
+mDa2Qfyn$`EYnE
+g jEoMtk84
+*W'W7bY ̹Y3
+OP:R^QֈF M
+-
+'Y<]gs$52/tb (1N޻TJ50o,EF
+yFG%!IG=JN=rטBI\˩˔I 9a4:Ya (PLk,XL]UtDj>>G4"Iϕka'ADӾQvg
+Hya,;xkguYGy x<*Tva;b_4\͈ 06b6z# iGPMcG^E훦VL3[@uUj@HA8\!+&̹ }ً&džJ5wad@ 9QDƭmی#@e3p#Q4K1{#Μs(gg0uv}J7dgdq8x\SBglU?RrO5E7]+WiAd.P{pJ>@Rsƫ):B2lB5&Al+wGEOHlHqkS⤽OժVAfs8KlhnW%e1y Ip,rTN|mϻ5,' Z<IӀ,X*jeQƺBW(W<6pk <EԸ ƚrHs$ϰwͷ~PҪD ':s7đ'g2 n24P5[i1bz3XGrb>Z8[( kSDVͷwCbaAp `ɔ{V٠|e,08J#e6yú"CbP7Bu!dj ŏJBē, C271ļ%)Nq [_e5j b3eW3!U0o[`%`ka'>`}&34omߓ>A
+[ICJ~ES9+nrE:/Pn2i+BsYpO;46>Lˆ=;Hv+w5X *吽}{3Hc$@/cD/cf"C׆ZK(yl{E?:|: ZCEkC~>mWE0(I#pTjk[!,CL=Y$e>Efv%C
+(=ba YTΠ&>M'KOb)C UVs g$ׄU03)<ªcqoSt]jGmo
+-2ďMqJ4@l!փ0!~_} =6oDB!6']b*P5!΁rUt<֨_}b2fv|C2% 2DȾ*xf|=b?ׯ?yIZ{x RcلyNELfI4֫};(ݜVo_)¾֯m)FZm*5Vfq+1"Xs[9s|mST<oC/
+*DWPtZ1A"ICL~a~p [×r#ƖløAYb
+
+dv S3]mCHQM~^C)w=6=8S6"+8XoAw~OY=< }]Xd%*&(G=P޹!er^׭#a-g-
+&arEYӄ_,КVbX$bh۽
+;/M0:1PM$, G,6 8T;5"鸔4T[3e$bcAl+.>vH f~U)Rc #q5,|Z~NRḏܰ<le*F1
+%3'tݛp\(q^L@L<{eι,lawB43Q u3(fIϔޔuNX^9ea=vNF؈$eFT
+g5[6qeieVE1vpNYYͷ}T)2Hʖxɘ*PujIYW0N |]g ykxj<ci
+Hf
+J <ː5JrKuh< kDt h`5NM
+q;ʛν7HYeiR\/BCs ##fҫYz\Cf1RLdA>ֱ9UV
+3Md{vg`cm_8 Ӎ<CH#O2spkpDYvl ܞ!CK~ d+e^n'Hx^/T( au`Fjc/n=zx3@ZJܙbfA׽ ;…R^5T1{_ ?m.ȪtattY)%'۾MRɌ-l5@޲.% _~M@99 H :쎭ǿ@~q<<[*=t k/J .vX8l=
+"!,y:tW^$K.bbQ7 ijM.Ns%|!zO!-b=yf8Qc9K\%0^F!NM0gFFs09ڳ&ͧ\RDL|FjP@^pC0`5C0eLysVdm/ݑ7w]5&lmrϹZ~Uxޤ٩YmWPyEpp#_F<M ]|?l AXwG\oeFqdٴ=D1ȘvnD]xYo 4C9WdP,G:)5x-
+.1˩eYS 6$sH}VoA'.L
+5:N){+c0W)= MNeQ!/<Wo쪚 ^?l. 71
+"!QAcaV0.A!3 e)DCHK !} Il!qNiL
+i!
+LHSÃPi* 72}&#my
+NpA\`0F/l!d-ھ+3H>ZAT"&f^{a}I|个b)D m+#H\-ڌ0v)qɮ"`>&
+ŎIPo!1rx@~+ \[blZqYR8m
+zf
+j:! CtT]벣1y|çTO6Nڔ#ţKG*OJUO$]Ug_쨇x%QvItlAƅ(F ՝;~;$39)/c
+qϵ Ϡsqt8dh<pf >}PoPjEBg3 n~!j\XȒBm*_{aKJV'Q,{nJQxSUԜ ]xdf4h: YR2Y
+(#q_i(*B2K!pK\b&
+lIF@UK2"w9ŀ<Hhٵԥ)xCS]
+0m*0PE\?O0&;q;ȔȆ"Cr^scnE1}~twA
+)Xg1kYaH5;K36>HDᙿ 1~cf_`fFxKrBɼe6cȞL4ũLFnxbHOF J6~$ٰlmrZϴ+$q8ע}Sr@[Ӡ
+]Pj
+fq["bVeBrYK@# N4b6t񃈻< 3F6䩘<!B~45h"$_nӐ ?y Uw2ˢ6Uw]ÓGI,&'vօ}@y݆2X\ky
+ lԋo(H[+,Q , i^KԑiL}J. u7Y gc9[<8[ox-2%XLlCK B:aA~ cDBQ o?$G뿭җvT E68,IBIDObZ97̢$yK#70V3nOHsp>ϫ *1i8QjhKF`5 i;A^!/KA.+(y_‘,)Y&H*=m
+l [VKt*Af@@$1K:)쳌 csKm?$ZFzdKʁ5
+HAr9DOw$,u GJvHVǸXvHDj^>>*|R.(@i?Θ 24Gkˉ(/ZU.(jcAj R?~΃bM$ڨi.ݹJ {V3 qiZhu8@$u)#8ǔJEj~}rDGjpPCGWiåAxP ^nl-)mbޣ?I^iS6揭fQ=ʨ WޚD+c=kق!]mrV>x ?>ŬWߡy51BjeP=zZD6FTZ4Bɝ;$[#Ď߱P852 jo ݡ% WfҦ=uj*8z.Jޤx)!F瀠 @0"&DGz|_g֨Ѯ! /x hy0@ev:fNp!?'3s'F/o ` nנ> }T4Ex+hHk%GBNhުۂ(jhǁ1 }(:qSiEA} mАZ ܡi
+&$,+1dk]u Zg ^زL@
+KB*hH1h ivv PrNkxO7޵oU-%u#گG/eLݮ3Ѭ8!?I(STg?0r/~I87H_\NQy]^2Yڵ2! eb\nF ?3 BK#\eQ!$
+-XGԂ\Q`< > vaQWn࿺nspj
+hw#Y%pzbF-مe=yЫڏ߁X0a2"͸yQR^Hl@VkN畋<ɩp 9,SJfňޚq>Ki*u۸GQf|Ĥ5"t&=qJH+PQ}1
+ _nYG w :2O`h(>d$k嗶Q*-e V&mԫW|Vͨ-&b=)2OR
+y1-]+Yk"r
+.: s'厤eĊrlQ DΒ*W̮ؐ,ccDŽ8Eb:%.D6ʾ1i8x\$6>DIfc%'' YzVh"BwB:(rJa<ܦqۮ{-1WP-(<Ee_{f<m%z b@ө:J(%TJUS?
+FI&*:v„)ݟ!v܁\pENȴb:)@0D!HAJG{ďSN0E5Ж+XuaĒzLD'y
+M?g7:Qht #^cAeNB@(;!p)"sՇN˒0`l۵g),% =@'K'n"N& cx$; Ar
+:g"4؁J&#,HTc
+c]wP?-)b?G{qR vyeͻL%=(1Qch
+0`LCr<+Lb`\= @=ف Բ˾.ah*+µu D0YnL$EJLEX1$F\z<sTkFPNlm.v59cž̻/E+'d~oA)r\36G
+~r̻5i bO1Ă ~M#_/%?']k0rvH3' vIB#7V
+l
+QC8uP 6}߁!U1$ȃ'ø.0S7jML .,&^5RWgпBX9-ܰ* ඲EP®2H !bt`uѭ..Y $G|]p;v/ -cgSUR7).Ȟb!s dQq"!}m"A^im8hh-߭9fav~at2/e_X/@hJ*.$i*
+(ƿyuHgp0tgK^֬H/(.E;p/"$iC0yۤ]Ҽ&QwEYo%ִ#ԝ}ܢK QRxmE]B
+[{-QTu)9D,^ yٌ@)!4;)U]0<L{E
+ޠQ0G%%2LvF1F,[7"VnG*NL;QJ;
+cimjSW O`$ʄ 900!TNtA 4r47e\lZtuڞ]M)z|e<Y,y` j,Ljl1#30{rl
+jȳ(yIWiէ`o7*32swDM1 X
+,$[ሢ7i.t9B[>NDsF%j~/8ضZj!:ݢhFl@Y5ğV
+ D; 1Ip-KC,p!ԎW2en$7@2I@vJ,ׅ 9I;%E5Z *䑸wdJdn\Ħ%b.Ql@}SY=DŽ^.R72 $i'ktbC_YgzHeyl$ӏ##
+fj11F!k 3Yʩ^2gJK\JhhV&NdҔrBwE<4d--6:%:  p,w90V#d/P/JQeۇR`ǠVߊ<jjFDuѷue3[xڅy=
+hX$Ԗβ'k?"P;VXrs-|kٴ=Ʒ[ͻ ^{棧
+9g.OD xCwx`*B}GfRaQKT4ŗSc$J|píHxpJ8"NТw]=pUa>4T|B^wTJej}z=vK>V 4u D@fGyUSO69fsƾ-p@t1#~6
+qQ1p(R}{iG8Y~w-zN؅-,\g,R&]} {~ZQ/D+"l,`f*Ɛ MG\q|h/VTq(AXvN+5FqEF>PTar d|
+ cP{|Ur>6w9ugazK: v} */3 ).ʏ Ap翀Vdy*@&M;$J*:4:nKRTEHWz9#Hfˋp1,N;qhi )${ ֩8gOHLxv0uBG>S;;ӈsuH/^75
+vx)5jRt?R`@יRM ƴ
+"hn[
+8ujK&b"pdJ0s>ca0cxJ *:0۵F{[Sq0IShZZ?7b_<OzM,IŴeGbyw`[L[ƏQO \cm};G#s7J7 Mˢt}l})(;/x1y_L̠ŰOdJ*~ @ @Oa {
+k +ME6Ged=-@!|=evLI!d1"F*5^stY*_(ǖQ&]E*,'3Ad1MvfG\P5cũN ǨV/ ԟaؚgxbWe&蝧p"'-3 ?,YwlW>+A|C63ή4jEc
+1}A8'V3GA #Ys0IjD˒ocd<vtq-[daHIneO1
+2/ cckiP/<VdBcs,:@c
+\Uy48̈́mI4 A㬋l ݧ6cfZ T.0#T-ҽ/ -͈F:\S#^j7g LrRX8"GB{LIWcEMdSc8#bf.wNMAzs`&ܱ!:ƗyZ/ʹȸ)4Ӻ֢m|a(G@r%E3q8%Xep(r4Mb9[^'gn21[
++i74x"d֦iKam
+.a EAc6m{ uu !|-aN/@:=/V "ՎRshuc&Ct i3wʐ'rz1AMhI.*F99ViYhe.Lf3z2b6/w8d @dڙ; RpcM?Ȃ28; X)7#p1ϼfħnC.\%ܭA%JS2xѓ>!~`zg<2ڗau
+\Õ䳟ʺlμO"M,t91h_ :;$EG)@$WzdZ'Э+]3 ZD˝@YӵD$?K sð`=Th-ߤ$, 'u?Kc|c\fكq[B7ʺ!mb (.䝕F1hDDXym"d|p`ݪQ.@Q%uXqNee%L\
+UyjC;Y#3 Hd^<^dSppNo?oIJ/GX^=nE'=G PlIwQ.Eb,)=9SI<C{rIuO3Ϗ 6 {zr=b\~!g~ L"/NM];9=
+^8
+gm鄕 Du}ڭa{<04I\ _z<}ug1&+.G$q^}+OP>RE-U#:+6=E9np+ Εm. .9{'An̡9Os"&M;gDc&f &H(h`XQa)#&6<cev$;˺حZ=Mp) 7+&rZb0 NVbMP0)xaD$'[tpDhE+F϶cL^xB88 u%)~
+ @Ztdn tN 89htlKgPb' "S.5~'l[hp1?\(CDX,s.A*6Xx-6 69hS:v~@8gI!Ư8v1cHpSn4TVݵ X}~Eܔ 'Sfi\`4g )(!xL,3z]aW)M+_06$a6F+ 36(ΕDL 6 #47"QƯ!uIXsyMAibe'ˣ6kNz/n׈LRg}_OY[ s!7 t 8^٥)q<%ZBo0nپ!p)1I1 e\JHh-񄅠YCO@vi -ܔ)╗sP:^|G&3AP^?$K '|5u nfFxJJ J
++Zί }cMsV" DgA];Β5vŊ97Rby#w+Ab2z*g'h$ ܠj5a򄟩B~)ۛ2~殀fHC=jge 7CL,PA a;6%mxѾA+̤mܢK
+'v!&dQW؆AUvdO(Qq$4
+)1uRTڔ@`2Y%E` q`b1.-IJ3[i7!AS5B *췃C)*̴fA iv9 i2 wGG}OpAx)_Ƨge(:;p9d3lUQ6J@!.?ѬF289.n5,cԎ#7'Ȳ9kҩz؋8+S,fX й:w5hFfs N~OUf?))-iibmn
+.DA bFpa7s6W̚˹%r$͢uD͛-Ʋet쟅"ej5y~h0Qvfsx\,x43#͌UmQ.+sNŰ1U6rYm[FQ[椤_?
+I'# GF"dL&cYcD @$?b"Ap 'AVR4.i]ZB};6q
+9[iZYн-m/>@1Q`HSCԔQuB宪N-
+JL GS./&"*E]oVp_1p TJѡiAb|n ^MJb*\ _B=Z+ Bs";#4Y!JZ
+{Q؇D2HM]Y$+1p{k,҃
+$#ʂDv͆>h pKln&6
++H2g< "%M7ޣ|eΙ)EV;8g $;1\77쀜lH&Aw(5p.&˄}w=>YR`~",a iͫLYPļ> #
+=N| $Y dLz֌9 )[ &J5 5@;6Clɯ+s4kV[Ahw,s Yc՞[Dj
+ߒjNa$J5+w{PJe&C {3QZ13@^4 -
+gqSТR*AŞRAn.i]1 }@\
+j?d_㱤__OK۷ !*zaΈ_(Q<ǚIp@/{^-XXYP믗3܏w0sYNBAeϣ)$ud΁wobKQcJDlp>m3=똇$=,D6|م̺ &? ܫ5#enK%He<~*r߾=na^-u E6@v4a BoŁ>%;utlA GlŕFJ9T;]Q)9:sd=t9ۦ)gr_ A(~cԊ.uKpzA 8,uWK4jOF\&2(i_=AR.ZXNj7iǻĞ^SٞH4{Ht R d=&xt]#"e~DJ[7Z!\sgxWmX.ضOc\prgc]5l iK'?snC/h@|5&t134e4xgH>5&h*:4+pL@GSY&ӚpU&B.JK/[gQn_sJ41z5qj61*`!l)ٶ{=/=7WP2%w nmӎ5<xCt:i^A~Rc$RBr8Trʌ= xf8fkt_H^%@71+E2y⭭%x>_sd:\M`xc8R"UPJlImq`%}V/:WQh>J4.lNK=%ԕ3}d@@L̀mQ樨ڙ4W3+ RBz}W{5@چߞ"z8sMo2H$2=/ÉC9<\$ofױs>TkvU$!_#n^JD:BdsTDЛM/LnE3+YcfV4UmoJ~SEilѾq)v[r[ʵYϘ;̙]֯/}Y_&p;>u؂ķj;}|LKl,3>a)Ԏ 0t7ahW/mlaŪSa3g:Ei}LNϦa^,G:N8Cc=VC;ҡk Imm΃j1{]U&>yH^LP@elqFA)\CɵQ"\݇sbQph*mzm]ʧ*cӄ|e9(SVS[tf+ ^
+H6K%ifx"_`ڝoVphkDFJ(MClKq R?O$qN K[gxa]{ؤEpAyc(6rZiɽlOnkXZb"ƴ&:Qx_[n
+<P^GɆwb'у?ǗeQAE:G
+nR9_:RK'ҼLX
+NggYKI[|sfu]D$ЭI-;:o3H EœPHgJ>gRa0W7wМ Qam҄߹#_c~^DgSs cT %D>_%Khw ^*-rlW* *%#ѣ 7!c +aՆlw3|ѢԬ ~F’~Ssɠ#J^b+'(9# zQޕ1(){)8^!vc+U"@*bD?X罝W'Xipoo,ۻsjjS⯱$2i2Nf}Sğ]t~) lߖkQ ]Χ-=GI{ǛsKO<%7%n hF06LtWoJ'۫FޛhMt i w% 9;^7 ՇKamZ} A!8' F5ìKh<ݛãk`:ٴ}OВ=5 C*.nK/eG$]P8VE8n1\
+5,$3
+ -`E:TŤù\:<KKR)yCh:{8?\_9u]X *!wATgLr#q(|O`Z-U=2(fh"ߴrۊiئ})pCC6ZF@w/E <G[ii"jy
+hb>;gqa#V|(@$N\+uh*=fbLSw 0D'-OVRp 3yMuX1Cɋ׭oCBXظKt\ۭTl@~s@n }*oٍ" _i2F /#'!0Ҵ{t- i٪Sܨ`]U oɍ)ge|>$(VGjp`ɹ~0tYGq4Nye^B,0 |"(qY.(֙ݰk e̺
+
+% b w2^5dc!zZeNXH,SP
+|*Kz/ڇS(_T\`v4 G<ڟK%E7I8ӬP=JT`p21H뺎
+˼$+4SH=b+l$k%E
+
+&'Z Grpj
+7w.%&5Fyj>,uf1yP.ޣ]d@"XW=J*h-ڶ,W𚘑zf&åҦ%ozql8lF02 5Quڼ5ʕBױQIQ>~,vVnc%@^p-yp1l/
+n! iip
+wsD
+3x`zU4>\I.^VuH>7C`N#i)hm oQΉLK5{xV0ڟm^h;3q~= X&s`=&`'h\6W$7HYY&uEvk(5wu\C\ G?2](i =/B|z o$G*x0D{={Ea3ȈeEqf@FWK +N w : ShFYNPKWkv|f^Ts njCbAiDxk]vQ[1}1:CJܯ#_9Zd`p%kI SI}R`Yi/Ut^&ߡ1aUBg?NjBgL݈1
+:;POr1Md.@]<a$u!WIcv` .\F"y8l.bSSd}A2y9O %[9 yu:4j~ZLj;>ndUzyZ=-\J:Zctte JlB;F#3xPn,S
+̰>*a8yZd1e_4EVx9ᄔ
+/eՎ8&=EB#YF8%/ ,gxRCGpeJc ܤ#d3v LS\9 jkMNJ0n6Os''Nd1 Kﲮ")'jްHye0vb[,?$'
+oKY2DDK8| o}nJjXHypP{X B'ae{D,龣roXF0?FeZMgt QV$ؐ:Xͫ
+~]>!081h4+?Cutr}vo.Av&fU
+0;ԢøƎ2 `
+?p:Ĥ `ӌ!\~mf'/ ?RQh7q
+tSظ8{Kƍ'7y7.✥ֹ)7e+yULBIUM<iVu/ef5ݹ5P^& T)5ᐴF>j
+ &4%d.%&A ׼"uVF(0jL))xAYa!;xN:ț윣$ Ŏܫk^ȡϑ_AJU2(wBM> 쎌Ά"LZޜ"KLc1&G;(rsv_ oǪqhg(aa'z\D8~9s
+W8KpcXk(됵rL\{FSz'ŕ|S2L(B32mۑ0&,\[gL)n{INˠFגdڏ! sN`5`GQEo|AIVR>-L+l
+B|g'Ḟ8L'x<\*12U,Ep!1 > |kdp ǿ?((I\J
+
+ΑºT_:> ,UKh-G&S U%$*]/@ :J JF9%E DDq/D&X / /oŬ%X ۷.rWUZm;;XP%)ְV <Y+!
+Cf*R"m4;RI5b G|LcƜC 3Y a1\PY
+X
+U#Z*!HYc lQ3C)}Zi&OE^bv
+5r#qJBd/!F(c0aT6s
+w 7Av I9vHFO P>Yt{J?NV~PYt6YQx"靫7!R 'J{^s
+E.<*,mZ30ͯSČM_@gù8!ڑs B0 rV; 
+ $b8 ya81MXk #1u<Y@5EMȓ]X:*-j΁Sg` dDb'b
+
+u!F]DeDūj9l`\  uhtG,[>|\>:tqY6l "pR ~tű~™H#z!yo 2wzPbD Q<V0a °ƫD]MStH^JUր m|>,a`/6I%6F4<XUQ2.F.{;[d39t$׀=ff啙lDD{-J/žv+nCUxx7?ps岧#e, ]3<X^-l(TEQ(R=u/E&,c_ue0P b·θ0PHK<gk]d1yctnH
+m\?]웟=d& v x8&q́ij|H<T}:a_cSbu^[;NU!q̀W 7Um~]GLy#Ċ&&L<KVa{%?P9jOcsYLtSۋ@SΊb!ikw`vMfL
+ ,)ZȎ'ǧ
+4DI-9e
+ v 9;`[Gkadq]2!7Cp;>A/i#qad[rDz rrjfNH<UUf/'Cr3]&0!$!!e$$USL2k *Mao0*}y䨠@NIsX zHeAq10r,.ifO.2H`hy{p5OGH~F1YjjM>ɮ/9H_
+©pچoIBM5iO]jj nhʌTPGNjir ^
+MDXQ]`L.ځdّj~=t8ԻC\19IJ:sw Xge>,3hv*vac QvX/}b&yX"nxR@PvjqX.A_F1En_ &S hfLU@RwvLwθ 擭xZ7))/Xx9vJBu6-JTB9=OQvp7& j3S$<24𰕺\ 廹n~)tDQ^'F<^VFszH8kq#ǁXFo$~,bbi*1!&tr@O &GU mс,}i`(EqLb^m,/1[.)Ң)S7 Zdwdn;v@Y_K;@rpY|elC$CW{&QEEf5@$ 'Ee
+Ua
+v5X1lEy2C )NM2Rdwc@:d~5䌍gsq'C'aHNs}vS8e+0B*¼ro&V4ku\
+HKn9OPwE=˺Er_ӰL
+(# H>e~V<1Û{1">:
+\9=8doYx-hY'JQx9fmTuzSyfβSf:̳ȠSı!6JT
+v2nջ2fRvuvXQjUޗ*ͻ˛1``vWr#)w:͇&
+k kM9 h[Ƨ9uhVNÇ_-[|OyR/؄@:*D|Bt-ifOA}
+ĠUۢY)&|:kЈ cL&|CDwr̳UzcN՘[u,ePih\^:ÁUb\|oe
+d->[5쭟LΑ6Գ2k5@*1uAfmA (47e0^ϳ,bMb)&9u&!W?C4 OPPqaٯGPCL VJϛȥʱE ^38Wf\E9WߺH7\Wo&膸Lܭw:L/,R}gzj(ؐRܐ@So1r=v8
+ޅ,bgGÜfQe=opDZ'В9`oTdUC湕 4e^|_cU LH`b^G5>1V1ϝ OAƹM /Y^(`KHV; ǷzVJlˠ=tn7h ͹Ҵ0lV8NIJ(o\SCuD@:g@2T?{6*N^% DwPNNO=;U U
+u>mXK\'85SiQwƔ+rmA
+Q
+S7 |9] X¬^ 1LDIz;I}wˤs EۋcYXDI@5zCSkW@m3
+#O!qa3yV8f9Sw^wG%54؏fg+R ZA,QZ"@D-TM?%04gg@NKfyݏL$X&@x
+5Rq@PS#?݂R5Fxq6?W
+ $HunwCL(éDjH+3NtN',y!5M(/|"4Rzi.M
++?wJhy?\L {q
+$`ڋ B4s/Tȕr,MR_oᚱ233"ϏDKcQ>d%/ YU4yhnd{PC7QE
+2$%nRU 6m׬0e?Bh?#G- x€d.6V=fl+2NJ/h3"2ҁfn<=
+9;Gl; e9@L_DL\4#&M ҝaM oZms]  ē
+_ !&}',EC[Sq.'ĥz0,&oc䈑D'3HE3( Qeb[IEXw
+'qRģhm$F+thVS4uhӝȆZaJg F>-gn<DSP}oي{HgR2qAY:<J!k_Jl+6:N9`6PS?ت& J[AH&"iɐs^}q9u/"h{NDp*nP7 C^z=5+F(p^'r~pH:/%(* > oP{ɟJ2tOtm^K3u-pC|[穜?Wb;SdBkɟn+0 s.5%4f!9RkӘ`dy!_O
+qēhε~FYq%Ӕ v^߆MX/LƱ<#(`G]eM` yOwhr~L92_(8c:2mJ0u,7fb,i H텶("zN6F sCCܺDNoQhy86A`kqu"u֩,g^&4ioYK
+S|)篛}2ݥ!%C9Fu/V~J
+b" 6$E2XiG°A'a3}9NEX*RsHGa~vC^T#_w 3Vmr7,>K:xFE4[oAWcv[/YVU8u? >pگ8OL|d7F?0Ti`78f?P4蔠F PZo[-R11|cfݰ`\#ep2^&g҇O!:[Z+ٴ@ po
+ "{ qbzL?SBPfaYә[m+
+" Yk(E|]RmΨ#!-BZF[!T=F.w (ñ)*^'h܂ ?7:8>#|)}ޯ眉˚{* <P_nHYz8_פ`.fhUauuMmXg 켰 5n_-#YA+ZA;ge.sӳ 4Z4v6Oh,DpD @{v1?a1hpu5¯"|ڦK_KvsT#}jWq]g$mx7Lœr*"e{ádT\1`Z M6]PXF/"SK nAJ$,Λ;FIY- yZͯ-NMp#75thdRIU%cAL[Ko|gcb=DOeaaݬEH|
+F.8^;wU&G|=F"l ?{U偵z p`Y!K С@<#CDg JAJW)VE}X^>%ZtP8@cl(a0 "9dMP2"X%HQR~>͏]g/?7%kS EA"(^p7K!(yRXG;CĠ˨bXBNx2 AI|4Ql2E# )t|_4ufZR:ȫhbt3Vh/!h9f쫶`P)ͯ9Rx:D*Fv].a]w*9!pa$+BT!Ar2%į2nrv9 kȢwzy $U*!7McV#XO 5`BvX/kg0:1<U'
+6H%4[H&A<!T=%
+P '5,xr`=yG{.ܵ=e?d=Ο
+n,vO<">/zhEr}_0M -׷b<ACԺEAXzUvϢVc `*}KgJ"lcs;#˄Yp 'j/o\2Pv'^ӎ}hc+ÐX-d$ Ѭς0,_9J=ԫL\)7UH9fUnGͬ}2G^eTI-ϯMa|uF+q&Ռ7q|lvvUnYFN8S{mйÇiCUrё>#
+ߧmjӖYfdXg:g"ጁE
+:IPtʂ T64Nז
+xړjrt+?4k]J-N.!gy^ˌLn 2RB
+.KH=rLJJ3eM%B n#|OAB+AߗBDmsG( 1}Z]QSŃL!o({ Ē1TD
+Air|*8dmn@z\A\M΄U= n˃L}(AfZ:YKL`Դ_"& $;s|9t
+4Ky$yPNP$eۺGj;UL$ bx-P%H!h{YG>d&`e&{ &g.XRY&.@eyth ^R0=C aI?_"q8m[Ю 4>QcWM*Lۃ(z[x̽F;_vj
+޸M-;`*z
+aWA3ўbD8 =!<&C:%9}3 Tl.#7jN B"P}_&K'/NqhKArx9(10 9Z&kx
+gupw .V5mfT6=N,"CĘv*ht^g [#[t$\c!ؤ 1JC Aޔ8t7\ Ma)ƿH7
+Wi*e*"@dn|$Ǐ8zʚ' @H&].J]CPֲkˆ0 lG/+n*T]%ZBa=߄)}˦/_SJMG6%?W#`#zyJ :Ϗu=FLCfh_)vƜ8Cq yU
+*PMf?NNYp :-
+IVpZߏyu
+ P,Fm^􎮗R??pqdR^"pīFҖA\ xN&rK:dyBhEʄ؁z;%ova3\A>!R;Ɇ
+)67q oX- +r7U¬<p)
+eb"9[m5Fx
+5Yb:(\f~jҘF~Y0sA9 g<Jփ23B24usohŜfieJGLМG83Z#f\1IhF4q̟WS{k3e:{\`#XJ*@0p@.4t.A
+ZkHZF>0Yav\.}p
+,P}1'H9+BVTZmG
+T$*r C- ?Zц"c9=)тl
+H`R."na -` z!P=j'(>M a*֌*Ff]5NV`?&af T3 \%U%$s ձZ )(ɈDsaH{GZlzơ XsmPi=h#!1#pQtp@EM k1!h@4
+8(D$O-^ǰP=A?o2Iԑ
+{7l,N1_W P
+YõʄFzlDו!0T>{eVv "],_1q͋S9S^!GJ&#Є=tFbTτMPicKc p X&R&HQ0@ :YH{)2plK_݇@&٩Xvul
+D'X*@mVMo~Y:T>7
+V/X<t*PqȺ"BE[ i'W&"Of NĆ0
+E4O1%N~{j*-h3 1]TdDEΩ[L(o 4܎!َBZ#lnZ1([ ۘ,P> y)(2k*~Cnr %
+bp"'VJ˃/`u (v,PP8n$*MB9RM<5( > &BTQkQCj$
+.Z o
+fDVd(r^S
+r8| ٵ6p4 ~MbIb~MjFQ_>,ҾY
+|TbE:ۮK oK3TKAJcD^=ݪn8(!2+%-Ofa\FrgB:TR!f!H7:{p8]Qx(%""_9RZ
+)M a.ngj^%"y!d@,gdK:fz2FIJ"RUr}!mͮS>>$KF2IN0&
+!r$ pZ~ܤe<\ϏSлHט];!l1x>[#"w
+H
+'⯣[+:F 3`vVj׊
+u[]#OdB{gБ 3Zsߍ-aI軶Md n86D"nY}O27c`!RaUˠq=:_'ֽwY&%M[u$ F%.]%D0Bf! ).u4jwNB9<zO<AOT}]-sXCKms&W=T4P ۹uTu
+a*ˤ36/
+ 'A)n:KtJUyi@C(0/sd!@2J"ptTx&/{:`0:1;Y\`Tw ,Sz&޺pVYSh=2f~aIgȈ@(8.
+k ~CT=ɀK$!uN'yWɆU,gR'^i9AvœL՜P.mr@Ȉ X5AXP9A#X4k=6Hj_ S
+* "X_kbؗ IBs9P k
+-ZB=<kD԰"
+*=O(dvAٹ7I6,
+ٳ8)N2q$Yk.[!hD# PG\9e{B
+A}U$ɤ(,(>>6&;o[kT61(HTZ> ʵ&?ǼolaBM!w2^'ɑ#G@O; d
+<J<^ 5@$n?:w/~+%6|螿9L< 1=F8QGݲw4}IA@ieN&9p/̯W}52KzYK4۞YV2Ћ`4g!3ҽdN{n 58~f,k3Rx'gǠ(Rm_1{RQ3V2+<wόKyz JHgDu?*6!h=k+O{L{&~ƥ3iTxy{vKxOle7[iQ)#~HBƉ d+*r-ʛ[ƚ,eD-%XwN];o S\cH䕉ɶu-[o293g<Wd@T0~"u^7 dBp_'؎$X t>KJ,C6̶io.1?_ᇫ/S4ijH',돂AȌս))hYu%<_
+SmVl` 81b\pԉҗl ݹhP٢;Tø%m?LGJ[lߢa?t֯a`Zakx}9>ݥԯ6Ɇh$/;v"M%#CMfVhs'vǩCVXkl,vZtz$:*@Ǫ~'x&XPbnxQلQNi3g
+ݶ%߭k)۳CqҶ/@džf~6^kq('ap5uڂP0Cpm/k % V1dH_YHHdh9E&m#7T4 2LB׳
+\uQ3P1(rBL@
+ǝA;femS7$fZ|EF>O''pa>YyOe{*Ļf{NX4Od:o#-rBg '8|8E\42s.BL!}]η1LZ,l(@PZSI51pUsÜ%eڠrϴ [Bv |π>"<Q:$hI_Olݚ0N:7K%Ѝ<Ms=> 4j[Aa͐ @ Fڤ#lmY=mZߺF
+˵͝@F5.!=j2L
+%6?Df(u*qPN/r*TQ:Hj]%6oX[4\䱉9xҐ?TkO
+g{DCf8=88mPkOB?KfIQtT1۹yg>C4#y7~]p=G$[rpp޺m:xoߡ%}}ClyP+pqŋCvM;ɛI֙e~ mˁ3',7H+D+_N]ثƠwԗb@3tg QaW 7|пp^'%'TԙTXX$eUi/^%~ǡT9/ȣkj]CB务
+Z^(JFh?$X?Hq,_A`Tm+i0T4 u|ɧgGo+4azgJ RedCx5C_s`4iU[=٥`u0N9f _XI;VUCc:Xő-Wt&/)w4s`aE'NbE&%lSU*VB1
+>8sH^BVX鏛kzKIyj y>()<9
+JcxG홨"l2
+$ɝS(dꡊn+ncp;|G6ͅ>+ߡ4 =2֩
+{
+T!mϦbȠ|!,Ʌps | kO4g $]hr3sNL;<d[T)-ܬ{Ud\mqTN?G~Յa].U86jDBms6.P[orf`棖&a##@Aq0ݦMNqJ`ǒֽA܄jQ9t<(V]tc<|-_Bd]ϳ
+ĪA<ՁkD SB
+L@}X4vUĂӧ$"
+lj8&@p.o
+=g9!ipclQ˫̚cTgiz[5/I&]MtK6\j[Oe!#mn6 F@f e;cf6u+iCRqθr@:/~#f=6y B2`Y@vO~u@HQgGKrqx7ZK2b)y`} e^Vc'C0׼an@H<@Ĺ PO </aj{@ 8_yZC˴ 1|P;t5IxRMtodVy*|.2d+fӏ" S8j|^Ǽ_H០]o=D\Z C0/CӖ|TIJAd/XBb?@-ē!n$T)XR<3Aɔ UǝaLW, !zVPi&PN8/ܒOY;g@ M  %69\GۈN,0ɨIq3xK!S9{Te#N-`S=4
+/Sj *" * ,$uEEmgX2CUhx})əmt}@&z@JQ;"05aFa,4xcfiVvai_&@d=EŘ &2wDr#T]J!9p |||+2&oKTa=8 1<ܵ6 A{ot?a~OU9q1$?bҒ_s>*8 79 H+#-MQ,$/D.pHqK_!CUihI=ܯi8frAA!MZM}0D'vb@csfd[TK2 $^qWP % G F~^}eɐ'dsyě1"uQ^.?;PffY{bE|>[-OO}5[w>/𡂔 o3?bgts P`OA>կP0cC휃1n&<&JM#2ףmw
+<V$瘁M<C7&{Qiޱ8T?" C`"4+I j_w4$$!?|#jJ)_~8}A%gܼ) Iv?D2D ؀=f}ll)YSh'K $i=A̝b7qqz6F9)nڸۘEa+> {b#$vO^.P~g!!Rk憥w|1%}*~@KA'AlُUʜUc/{ 5c1+w?bsmm(a4Ԥ؇.EZQ
+]E`ą\]yPѩ쒶XH˃K# Yk:SC"Xs&\ a~/ݮl
+DuG`9>,?@ 2Z)+]MKXCan!YfR6"W/w`uo.\
+pWoŐ] QH Lg49)QҤ(}C6_t>hރUoMebxV8<渨5
+]ffLيAпC~ƙ[%g!uX Š-̻wYcb%`Gc&<=ǬիO!Id ] 1tiuBLyb BIWfZe cө B罿U@8'nn(YiȢtjBW
+ @SB'vgCԥ٭8gfb%{uz |1Y^*&Zmb.5SͨLPJ>-x݊Sy8qDfڋMg,-8OP*8
+mڐ(۠5Sa&6zVmx§}ҕi’j"_%tt:zk7RL,UL׭C 0nH;\3cd6V
+S1<q %`M˛̢  '+E^bz,pǣv8_b'nAmݫ)T p1Vr:|)!},jBE2x#Jl~^Gd6jlU^|VޚљN &#Kr4)%,gaxJ OyHJ30R oI9|H
+LhAƱw71%#%'o p5~ݧ=wox"ƃqq dc7ʽk4.! ($,UL\0ebx"ܪC1)a;GPO4Ԋ/%?GdPg?VF_R@JXYQ<^KY5vވ[`<m3LL%B+1 iJw' XaXƔ=H .IH(V! B#&V?Uh
+3U{CQJ^Z/l0C|u A۱Vh@Q"u)񭘊T4j:4lp+v΁3\odxnby*hz-1X^(^A3
+q\pa 1o+"Gav<@ΘAfrĶ*9O>jV
+#kML7/yiU@~|W6)pXu`Y`ɪXN4Jt^
+)+Ox, H'3̑c+"fDpJ`?;TgVj2! %K}J`!t3i%/+ZH֏"-́r`+c@}̌J<7fN)™]o9;BP1i[
+²<]t_ř'l4[ѯ"7z7݃sK !pd5pUXu@]Z<U$Lv9s$K"@$et$ӼxyP -"a%3}b@o KM9\%d8$ֳ?\xՕOQz(%EC~֗J4.oX0H6`Z 9q
+9bzq:*"basԦYL&QL:AEGYKJUK"hF}a.<8  VQJdk ~d>TmhI̼zAU%:
+םӺb^'~_gys9|DP KdXؤF`Z]o%:%qUXFpiĝF8  3%oh[]CBTau;L3v**Dxj0?hzDuj1V)?^" RbSHBV`
+H1n9O;ېHb?$ -/pj"Ţ?|ͣy?3óY7$FΘu]imVj}
+*훟ίл_D:Jz@6c /tW<; ܺ/IU(j
+նm/TjؐjS8
+`L2
+ s<5FU|1ډRȞ_Ƀ4O/"R\laLvl $璘 b`P4 c_`j F\9%Ii}qZj^ \U`&IC3GH!y&ϻ=u9T&
+d悦c2cO%88 $5~A``Oj$3mwLY|4yܸ!> o *0Bu,|.`^^50]0.˖C c
+ʏrsRM\Ь<*ԟa4ůaa%HFT׌YowM+AӫQHPeQa4 `j˹qds
+?a
+7)EҟR5E"-wǷ.]3j9ɖcaVFy<2C]^}d5:Ds"62rX~v@rb@dt6 8 HЖWӬ'A(ϻ(7ˇd:(ZKEO t
+:ӮJ5akjK րh@4*pLt:oVJg JDZ't w:)Ξ( B:m5r/q4l#YzQ(_?hjxxS/
+pf.䛐6jK$.?]@Ve)h/n2/Wͫ ¥2KAkնPbe283f腂[V@".f@t, `hP
+A%ŘhUd?`-Pl:˳1jR Xc+VWH0Ǿ zO/*NjGrusφѬeLƳjD5D Ct^M.(8DwQ~F_5-Qu!6
+cc|"KI*
+G 뭕zYéKbA=L,5~n
+Ŀ$CзA (]Þ. B2Q-V|a{G:luPN|d,-R!Q2{/Cf ˑ=p#{bT uH|{+~=60ƫHsȥW-²DJQ
+>gV1P.s65@B%y0@[$9+2k6^[Α"$jX[O(P4(0{5l+2pUsMi ` Hs1h,`ǨqTҏIs$ Gf}c1/MGRǚh9>Ecwc|zwC{|!E)UYU}7:?($aOGB19 8Hyy%m U֥0TAFH;x9 KȮaW"`Xhv p+䰫0*Qo׀lUȘ;#[[PFB>{1nB<(
+"jA5czl+?<ծz, ʌH)ԣ4"I
+i" 33a2:lbW&um=D5y50YKM{*(4$(R#L|%{JfGL숾qP#A}ޏnQŃqBI=g'e*(,>xMJ x6 yb6EvyHGA(ԆEret Ҁ!'X3ں~A,s7e"MӃ,CY*u d*cB<$Qb]KNAYR,iE|uAC&SXlsH0!KY,E|KR\@nͯ\rMv%MNB͹\X=^BF楥ŊOHFSU!ًV=I*ǣ :qrI0zŴv_b :zӲOX{QJ vF2Yx6pC=E]( h!ddk! 21-o.NQiGsuRbڀ8S%F2LnM@35S{PG=G\Pxӿ]G7, ;I
+xfyPglq]:@)
+{v8]K(V@6iUha"&{uIG0+uKQP->9 ц~
+ ]Xv"1T{h$/AvV&MaʹpեHb5dGjn5{
+`n6t`I ۖfX<dt6 (VxKC:34cV:&$G]{=cH49BHc`&l!BA
+zBV5 Q94k! </_a|pǓ% H
+RPh"BO\?֣++}`T<ZBv<3 Go29xNgaQ
+6^J`B!ۂBLc_3{t,٦z(VmoאNH)SJa~P'e)s1@vu<*<{
+T]р!WBsF(ʊv1JfDjYS<_( <@sok?(m3 {2)}ejb6YT›~i .L%)35ayߵqi^ h2WBXE
+e!QP>HgT .LJfd0]LLG&E~""yɐ?7}釳nr
+ѪC׋-P16Bme
+b]' *ïq$v my2X$Zܒ c^s z&?rW fs ($C_TTmV0ɪ$ow^@(
+mIY
+~o:jLFL :BŏwtFvȢcsO%\e|%T"˽0V[*k|}O/6)Bh&&0X̚B%ͿmSɓ+4G\dعD ]8$BtNw%9Į>NHCv?ȓ)cGp:L$gEEht2B$U@d ,JZP.J*
+~hRTU?W񰄓hDBEyD~qI
+ a+/žq7p,5̰(f]5:#&龰h =tC%@^ $AFky"AJ-cq،̈VAm B% b$W>(1
+JiǵơS1 <Eu㙒ݫTA^H|&}Zb:GF@,Dj%2pk3sB, 9׽oo#tdlQB#9TɊ>?98ӶB@#+oN?9fqPr 1t"⥎$Hwj7WxnPCh4̍N\ }KP>0hoL42?VTvA0%b^dKUE& 9+HddrLS]ْ5?ē?u+)25*BfP=m_`{8
+_TxTܿuA0Ї$$KN6ZA@&a  W Mвs,{vs D~!%QǧS&u 5EHXoX};0QEMYqW&&Kg% $(9 i lQhpjyCZ?n.VȮv8AݓkGCinp;ļS@JL~"4"܌K .vZqV Jr^o SJg&I`RW*<m
+=)7uYu^b \ؠhԉ׫,$9*c
+f:{)(E'~ –1Th\?0DnKkͱ/i; 5\aln9, '4yRPe1Dg &ҲdoS›
+4ǻ2JdžƠ'Zx#UyYP' YopMV X4 +"jcVe+(MV*d FF L'aeEbL?jdVT.AhgkKvt0+zNgae
+*KQfXPkNxb/u]j|q2%n鋄 4] 1asmv_JɲaǑGh`<$U$PR!_= z0cd͐H9K; S<
+ CSy.|pp
+ FC*~=T
+lh* v*t_՟+m,ȭwB!C/rS4=hzdEtp E(l;P eW'jIT' O(2SFɀ1WQ>Qa<l%BI /@G H. {*oPe oَ54GԘ7ymXhLb KAф!+TR
+>8EQ eq Q3Qd(-]BZJfi$a7^@CBp&ҫ6r%44z*<!ӐaeΡtj fC鶃o!>(%kۑ6u+h]irc*)*T^>BPEfzdrDzw#P\I3fM<`Y@N$1'=`I]JoD;T#:-*5;ڄgX*7'֙Db:Tq8#_GWmOMh<zܬ5Wbɟd%(XAurtD9߲<Dʱ_BJXh$[-|Ry^zrllҌ9&oρeo)tW&IGهhv5?O @V +% g0b!آiJ|Jm3͠ts'7Jr +ОbĤ9
+9o=EM6dCYRNՖ?lpR@E*CU
+E/
+bW{ 8drٱB! 8ClɜC
+Q-y[Hb-R,WF'(Vx5o"yS]"K Y`SHŌOB9>APk!$ ]B<G*=<*#v.4"-Ce|γ3 i
+I¡; ٦J}^nV:J91Xc
+Rn]R\f'$mO"E~ChUEW:b !H*CtVfk[<tjp ćFHÕII'$i=XTsZ1"3O4Zqą%C|p굀([)ٴkc^܇fBLDmB|*_Yy?{ѡdfmx99Wd}crFY
+ָט:t$‚D*pMF 37͐o@ 4!RlA2DgS"l+G{X2.ēpU0TҤhG@Ԓe<.A3Qp̋p몟yG
+Q
+>jOZ(LިfW6Ӛ5mNٰu&@fLD/XAUyvKPDjY38uQRn@Ɵ ꤿSs 3{r# ͢k0>svfTpq-d3"bj#z~l9_$B #>X/o
+bpD)u@~n<56h3t!X6MgLr,(C5( C<W`X#iGF$,A5 9h"(&a 7p .3v>yctF7N|_7aaIY`ꜷL<O/zkbg/z5}e$MTG3q6J$\x.PڻboSs7"#ω4N$ N좏=yz!dE&^f$4s 5#I}|
+^ fjHǣP_% WNT}1ZgDAb'ATh HLc1KkT2nܦAy`4~Gd=bмi^,Mq߆]jQe䰽V
+"1uH)JQ24vɽV
+bnM7E:Ի|@J/~[pS[hTgq>c.9Iǟb\[:mݥZlB%a86gL
+A. KzOnnFeLqvu[፪$n ۚI_("_xBah=6t?R m/u?D'a$/Ym1IvCnxMr1,6$_!:aMA'Iϲniwf<0(fC/- tvs_@4 H};(dUfoHZ9
+ aJb9np%yQ?7i-J71dKȎۼN/1l=rW%`h$tag`lxn e -| uȕ(Sg|: |ĕi.KEC۔erEޖ|6-5dł4<.weJPZ0 ndžX
+tY3msb++ܕJc04w.3L̆௧A9hZӱp-G8 kH:sD؞<1 thQY,2mA R=K1H6=@++xj yԲ<
+ 4zĻgf
+?M~=_q>-gSͬҏ%LEG23jRx]udbW>YؘikmfN濓~/ ɚyKß A3\4s>r٠Rb{4{~` T߹D<>)%8Jg ^޲J]fѹ/6-[8ﰄP0}-.b6k>[M2Խ\źIm.K+e4ų b\ r(`N4v-U#0
+ q^h Eb;MLWkͺ=*>"iüs3#ŖK7"ՠq{޺Onj6;񗳛(5? $.{Tn[09)@ XmM8 $t14@_ _]8\8
+*a5}e%ߢyM v)! VqFc[6kΖru WӞPH^ 81[؝<Kjk9i2AI][ȷ>7"JH7;s<9##[)3C\J
+:)fy^
+ _Ow>7h23Eb,QwqڐU8jS2_I
+ѥ*@6}ZiHPГeC!o٬+jtT\tS ?N|ԱlK .SA#~ CLҊƿ
+Z8
+pQ:8V /~%blL(4P GRdG'Vo[}x;A Ȅ'pI$†@~b@)^@DcC_q2W,^?R]s`ZUk%4:s LIQMzmHUֆ}G2B<ȑp#2uu 6@mw*Be*2d8 `
+eUc :uNzaMen w]Giչ
+98rЉ=x%̹v|}d^4zoy<Ku>zZ
+A&zY2غ' y8g)d/D$Y*3g `1ވ\a
+qLHX2/+qԖ&zΧOk%9L7#
+ X+ 9Σw^ #^ :@\C
+?-[YVmr(*xU@Eh
+ryB|F2ozw伥VU2(08x7ּ#kB|L QEiI
+L(ᮄ[v&(ά:XZ]B d
+
+"q
+UFOlFA-Fpj!$vR!^bWFw<$ܙN̬7DۈA79(RdIWRWzYn,4 KC~ م.3 K_(AL+Ry EA/S6=ly8Z^w3mL+J @OcJ K܆jYxvRZq"Vv,)U0C=HjvyOnKB8,P^qcCu
+X
+!QIT );߰~rtx 0CŸ%X/B.՘gOε/: <JF
+UܱԅEԈ ?E FQ) V=Ք ȶ"I8} D
+qln ]h膸`J1(9N*XH԰Ȫz70ڣ
+&%7,SI@| zbI8"̓*k
+DZi!Okdm
+;kFvmNAg!Ue(ݵK@jFA={Nfvu N`A`]X~=Nd)%&jynSl.Ws-fWATIrv y&#%W;ap&H
+] 24N s]o&:C]2$,dY
+4\xs۸jP$$v<y`aM0AEԽ@?y"uV
+t
+5|DVRx1m)uzG"jHI;IZwbSG)ïj.à-]hl ٢B@EjplƅHK"@R蚬P‡h B$!B(/cgv
+*%x&[
+y5KwC{$c}hqjHJdT% ;, +9%{ ENRva}^$I /.َ~ӑd9˜h/!vnT }& a8ŒC 5!{ƶb`t0ʫN;_ ^=7kNJ63{=q&raBz8aT 0^tI!-h/A.0u-7+/|z[zkn@ƴd;$e F$>FLXxǕU&aS" 6mÂ%C&Y PTrWqh܁1*+ls_H2q28 e}uuF;pmxmhQ!٭ Ix$΄QMc\ΛFo(qA̦fRPYsI*C:[EHP꺡]xB&JDy E\.աLJl(raĒ+vqw
+v p0S<وWuQ_XmӇ bP`?_0BYxY /Qm]t*#Ľ
+PB y- A t Q|xM%"@ci'ap$[or?+o==$WFţAvزxZҎ].5EY/Ild@3BȺTQY,VP66=ÁoM;)7ܐGrbs[4u>|F']0%I94/Fzm/$<~o]@+=[6 3!TC8{Z5n;P5-'֝n/!`2z87͘bqC^
+|L(vYJBg3:z- ,"8ۡ==!J?ƺEsnq;+oc@ ٴ0pp<4z<.,nu12U q(Y&%wJ|l$)(&|K>9 loľ TTmOA?L .CgiTT>=>u2 N+1_s
+?]`PdGAZ*RVDǀ^k
+$xS<Ɇ
+o DۨR<٦k,Bi[2L+%( ӿQ }Qz;h[fD0&[E Z0o]n%8 vyi 1[?o k=XK'ΡDV͉~#N 58_eVK%Bfxb`Reql?@d<'1Q%44pΊ,hpV"yÌ ]udq, hq: $$
+ǣDʂHRlKt|(::FC>HKMaq}Ҥ3vYB8TNG
+:M!?5Yǜ7tT7#
+!$2kfgM*㎂@E=SM;Ljb
+z8yWw)Q9LB@-61*zߡ8K|㠮j9g+ĉ΁HLm+$rz{m56,X1MjB:mnrf(,N%
+H*H짳$7i"e.V"+P~`;I'T]ze)N4juLJviFM-m/z`䶛| dq}/% 94÷qȱ&a)Xrv/ *n,.`o0tϳ,6QoVS F N%o e\+uڃWpCϸްvS{>3:ˆ
+2%؜*`L+cU\GHH|Cqv
+ E#K~(كIr^_P[|@7YpcS0:p$Z'F$M*5u ~m|Z͠"Bg߷DW`p!un[1.c`qVk_ ¬g9qwIdAA"M"T螓o"г{5\^*@AYe]u8-n=ȏN/ ~Z2U>qDQ*س O݋S
+Y9N6w::yLuX8L@XT?IIu~3mQqGy1KYc8O5AT#ے89k2JÒ9ԙJ'qY<aضH{ Q!,dJ6_eoZ=>҈DK,J1 ,)vq:u@l҄_ݯA
+zڟR:_JQa^%:ËoasrlP~]z º8W$%&sdc/q0c385i#kun`QDS
+eoᡲ`|)`iNFΒ{f$Qa-?D",KD@6BpAv=cT,his=kBOb:X#8/ZAZK\CRJU`wn cڴ@ 'XZ 2+Ov9iJo8A<_qDw\ъ^@J!(%L70npN/dJqyT]gjb(vVqPI<ANq
+Fh\Tf SK7Ac0ih)Fܩ&w:Q/)=)h+}t&1}$eqx Sԩ
+.wtwA2 r;_HzAě{ÎwZ
+~(``
+&RFœw ce0/C4Oށ929ɻ L)׾N9yg9AOv8~bm'@ ٲ/!Z Ί$ ICDTN2L_ѾIeaЈ8
+> P
+\=.*f =Ykp":Y$ fw<YA *cZvn²":OM֠OGvJ<?DF9LvN-Y1Ӻ-sḲQٟdZ N4LVtėzT2$Aa'3]umÀl,[#kc EG %Ze7;ZXB6a0  g;)JgI> 4HIHK'o)D;#S: ucB{x9+MJrUGpV5!C2xR@&ן9x|nIJ& ǘAxKO<
+ڗpL-]ZW %uNa΃hɊdIof= 5u cWFueZ<Z
+´[ 4⠑?줳pH8BN){)&-'Ve4gex׸%SV{0OBe1<>âi.Jc{2{L}"ydz9!dh9ʑ$5 ֶP.e^gHc=<V ^td{9'O+BuWQ]$8(Ǹ1ŒQ*T81Q^10v0i6U#%B,w7hA/(϶gI"ٻątk&s7Yʊ2z9mȰ_c"li@q 6+m`~`
+HM9DOPwFA @Kߢ"fvHJ1G.S2o/wMߛ7:_RkDņvn#jHĄ U+^<01n q- { ^6& j~E|ύjjuD?-RYmcn ֚y V1IHZY+׸Dq:k"{jTsSSP{#ԋ:*4}<2A;k-Um-4۰ћ u U)1ޫL/#|eGx^x4:t6T7Bު:;@rы07<cpfS\h4_7 =I@֎n )b>Fc34YO~
+5|Ѡeo}2q(>ԛ{{yt% *R>6sXǁ-rm ]gjO1VHr пºT jͯҼxm49`1
+*]:k Xa`+(̭C.KuA#},Q V }q
+rJNi'4*\#<A{[Ή4CMH
+"ۜLľb\ q
+]5SWH[Nfy?b@5ptׁZuF pF"'E-={*S8SKXꞟ(܃YTD =mx680$/hi8W39\bTBFK‚e#Z%v ѯVgvAm.8QsTAi:-!N2pL3 c,;i[,$i(:YQo~mȪ^ahmO1t; ȶl2wɴEHAc3$
+g6s\=^*kg?e*hvΫƳqhz#U sj>2]r&|mȔ7[^O7O
+<9fؙoSd5k6<zj5&ir 9.C 0.y8ogj.\5v/yS͒ A)&$ez\Wđ))ߦUN5oN2tps`哀aa5<E~NA5I!Q,z I-s1]enM=!5΂PK)\ 䆝AQ׼wmAٕ t=Oӏ,`?%|]w7 a!dPl}GAV\fPU&/ \1CdBAf*9JZVu%hMDMu<K{m4+i+ш6Y[%_fOhz1*9?iK#P8(įk2,CxVf#1.s@Hz,T' -,j(ӿ
+0zz|RAݙ!uuP|B|
+
+
+|ЮIS<0YI>NJ^`Bx/,İ!ćCòq(i􈁮)kZ و]I;zRH'gIx
+oTh_/o"GF0{J+>xl[E+Ni~YJځ@5 R`6yO< <Pj.MG K)ۆQzͱG d18t QA#?U0LZhи$QJ$ӫ釚1 P\D`BP(u[$Ŭe`F4 =DL مRIsNM?$Tu/^9qc,Y(fx@0;ivOUgF#B&1a+q!Z{9\6:π k͐g5"K皊`ol\oAq_Q'j8JRPӸ7e%͓$@vNlD@
+<b %+AR,pldiaU _ױ/A X~\Pa@*KART_lT
+6v37 (4Re(Y!E~LZ
+J4tFܼhZ:`)؄T~(E& ZUfԑIV d?)[>.AĞ5$roI f?a"/CF9 I @LiI,) :E*aXLs`F
+;;i^]bׯ/sE*a&R2ʴD!$&K
+113xf1(,PB2ӡ轞GFKLW/E*aT`-$1b$uf(nWI$Cs"9}
+WM|$Cy%
+Ŗh"ԂtN>;#Փ/C/+IzXCdFR $X/"r$5Y%,4t4o%R|T:"dOd80pa^yQ yCy7iod$Hb t~rڈ_;0MK@-vlp^ť\<)ɂ
+E&['E B`LDW]1
+_#xVw`Ac04\|cD lj7&#].)Go%+?*item-
+O@ >&'GQO ~N Y9-{s!\ rr="
+M<TwEMJ}@HH0gtLܷ2R\b ~ᔬJ&ʼn;IzmpyM ̘Nu71'vX}/IY]
+b{754
+"vJ3UNSP[΋K.,a塅u~K}6[E)A\ۍs@^=
+ǁi`:a M=!k4}*Qe^Qc %lȖЭ $#ޥ ǶWt)z(B9cɅ` ZDYoY21MdQQaeF2e؂jȝ֏S("/ srLͧMmJsWS%a, dQdxʺN|L!v>N]W`%i>DHG?)S4B]K$whnF:6n#3 5GևgCɡWP#`'J8zf搹w䠬[HwڞF| UQP6ȓlc-c,qJ;b`ЩZ ('6i[2UE $;`R;I
+wY?I( ^M'=`MM u~k"b &V PN;y! hbSgb0J8ʒdV,nRM%
+#ރ$rwIJB:l -6l` "`)",.־D`AfŅN&700La`dP3uS<2Pa~}3uXCc̔K?ɆjI; Q8l(E9H!q+J &sv8mdO(0Qa<T]~o_1s3l%3S!a58]FbFfD8pRbLD1B$v}@Ʉc]46$)Du,%GHuaNL a0Ի9[S:+αP$6s$,g: 9ꣵ['I6t;d$WyOT"fB~
+? 糷pAs>j"BNc8{w.hAYx$tTcCfxJS}Żc|h];>ݲ<X+U C+H)_mW3봗h]\ʧJG) !򱇋_EůӜxuqy)Q>52K
+\( l '
+PW83 *}&ڔ`d:ӡwX:<tZ1rU84Q,ZNsT!̅Ț[mR
+'x"fػLK…YP <9 +zmNCUɸqŔd3J{z)YG;p^o
+os1 [;rIoWȆ13Ac0,2,Ռ!R+:1ތ DcsߟwqHI5
+^7j2W+
+)s!Cj4>-856rAa9'wj"P*ƺLtHDI3 4eXYN}?SQ`Lc'0e3C
+suL uO.'B+? GIeH E%I}i AbH
+"fpɒF-H:*`%P  =_EZ_A)Z׽tF ˔nLnſ AT%| ɋ
+2>@
+>8+H=I
+bLwѝai+Ed݋_9X3kpKY9vvF5RSQ grEcw廃พ>x?X*2Tw_t ԕ e.F'ib"\Na8CT$~ @ ڎNdIIbD+kT<@郑df\/0ҟOVtor(:< HaX._ȡɿө|֫ z_}yɑ1+RuFc:^D$@P[rbI\Jx-)@HX96u
+yVM~ ˽б/YŵԒٟ*'nh/fYeˀ
+6xUu= KɀX)I46Qsk~ | IƆ]Agsgj'$5Fb57TasRZʶ[ ̊DJTP2h&^As :u]f=9!Ǡ=?nqnDl ?b/?+f@]v hO?J!vQ>@d
+RPl1~EF]X
+䀆o]Fq@(xr
+D'+G8>0M(Ub3t,2I=>t,} mitiKIARM|Uyw{*rH1HaV"Q;
+jkMwUfJ?X`d}^rp*/IP{QsnY~"41^xeR #}s$M-à 쯽,Wqۤ~uC.Ŋ5\*V7j"h4Qn'iZ
+dZtyS:Gn#"GƦH
+Aq{>+&,Se^H2E_AaHD_7'
+{HQS "YsBɵ&;rV}b\*M=$ &pmh
+g5\RFXus.v#4uRX-elыSk&Vm&~&A-;,b\"l bvs6ܯBull&-o4yK32+yzɶԡ#;+Qؖb+7sגˤAv2],G(ě# m jʕR݋n w;ܞ!21g0S];2Rtg/l?4DRɲlːGM|&=鰭AaZ_΁{XLMwy_?`[ݥ'*#.z!۞ABhHro5S6)[*lE 芽=DY ^)Դlk)4xa[ Ud.2WhvnhE,a@뚂 2zLoXrѶL⢭rtm&ZzE f_jmF !m{=.jˌǶt &L+9Qm=e[laARFza[ b>:n4m=@
+rF?ؖ+'9']k^̯+Fc1b.ښ(5Ⱦm= δy>^VI)cڈ@[Fj]#Wm[]蘋t9D,֧osG[H$me$Kld'fd/>(у`s13+
+"B<T9㴲ؖ۰nR*ڀC0(n3 v U1oMR tEî2v|LKHlrԆE|9i#;ۜ/Ag9
+3iYnT'uӉPR$t47Pn@0
+"e-jObhP<tiǚ=nҊ'dg͘U<`<5tᲱVF\p-u@4=֐rMFfM(6]ةQ֒ťbV;ЉZuhd81-ŗs``McT /GUNIC0ُ^uh| r2BYr.-4sjRXvǵG ~ID)W#Mx|NisbA,=s0X!]sh־Eix@ Icsk#[;\SQ]|pɢ)?Sɋ7!y6F:Iha:fjk mBAK&a-$qoIB+ ːP.A;z8z6NI^(r 8/g P)_%G^nMMt]਴,/1?0 *6꠫ ²}di
+,SUb_Sg"ib%꾒]IM" d_>
+h=(95ah&Y>P`ha kE i
+\6R cOGUNVݸrX183`-^
+Ni̶C'pZ*SMA,o̎PcU)I5wM0 -bY'mI#5@-KV$wIQA?tK[D[*HN Bv ѧ܈rPcR
+ԕ0D55:\ |Ύ\|(C{br 4īEw2l5@4iD7bY7yUS᱁B
+'53- -;s9QsZsκpotBpڎtBxg ۾jB]]fH&zt}MiC%A٦ RYsAAR<yˇAO,P Cf)ónnoÍ좍{1j)Dd-B\8Ew)9Aj "066BMtđU̲x0o חVe38@Aؒ)
+\J̊گCEŚΡ伎T;!v8ɝjҶMw3:sq'$ $\J"+ 򒥂5Џgq5 8:FYɼ?[jA~C>k$(ҳr%!ܽPba{Rd43+EdJQ0$$ ]秘ҩ:N{ ɇxr@OyXk[mo.6,m$1NMyB% <ekYJr:e2`02M).)?^߻b܂v|̅k3[YF@=ze)h爤
+#ٗx o[\\ApqSiQ7wh0(z)S܎ԛD@LImȗUW%2Wk5.;,裖.^ǵ^/l(dGًSbdzMV痋S"Hزᑹ kV*Ѐ[$=r(]V$K'nlP H;R,/k
+$FK{Iܥgr :e7͗mԬ%0xiÇj(xi%\QZc/pufɴ]##w&#T$ aiɱ~lVT`/O))ųl78KEH ܄E%ΆGUk,C& ly88| :?v|o4Xue Pb ¯fmԶv dL
+YMť3a't J7&T ō(>b7D4.Eٽfu>%j[ۄHJ&-rym.L](#bxE¤<!| xׅH9=MMrpL܋ ~{~WV~[BTs ,~yR-})5]=܏ogI0׈_I\Ik{~U`JtSM7C5LRE2uvv * eZ9.dE \J 6=N&4`@qܼM.|h=dM<|A`c4x8|#@`)Bh*1X0՞n&1!8 &1]6j4_ |$0ry>bͬ(WC[b<F3:I
+ӓeo<PoN,%xq4Ijt<# x18rye(1Nk\ĩAiD6V0qt( KF|Pf3_0wk+Lz@ F .`ƙqXN/jV/yz^
+]G4RqeQGRj ^/\>fr'B_e\~uǸ_]Y`xŝ̕ rXfϤP -+׏#6*v{rRȒ+ =9CV6G̏+;۔?-Ր+S:Xf2lm01OC4N2rC.Ac^4̑.5Uő c Zy ~8,sՑwGNp4DjT#{iPő8:9Xgo̜4#׏Q{Ȋ<zUK clo~ow̑)hFJ\mm t=ulՑӢL*0qd9̑%o!#vƣf\LIP2l"6+n#wd"!Ү_a-RX6bt.Xbzvb%83KbW,9%Omgǹ7rM,‹4T=?iz E&bED
+ 2E]@Q0Ǒy\m5$ f)^XV0˂u kw햃_?kG
+JNxzC<#,mxo>(Ý#=-{"]WFd(8g@s0VcUv5d[8rE\K)Ir[D[qTk,Uc[E&KXJVA()wVk 4BUs #.V nbB)suH{k.眑UUU?'
+&"@Cc1{^"JlEMƯl^{Ǟ7|>˃׳j0LqT;Gh]LǤjqt')]5 (1CԬ^nP.Wبy}IV!E<:)X:E=bZ6'"/ER
+_?ww:rZ}蝀U"
+)^dkf$E`?Iow*ܷM`ǢN+-=ח:3}7mOtAlI衻Ci!l~8Ƙ$}I^Z,h_j=3tO6<L4Pp5g,HyǕsr]-S[SxT`MᜑgDG>*tNP
+^(LRJ#Σ|[E
+g)?CpN3a?ol{x QDQ?sŗӫY$+)ݔ@;Uv74p( s38tJp6۟"ÁG[}*ӆ^%v1.hH~0𱕹ˢ%ܤ)Sdku"cEa㕔B0~cIVf;~'
+՛N;ɬn1y~tSm4Lb~uvS*%Ԫ綕bc 0'%FHwcm,*/T$EP}öM\s8?Ba *)9)(J F%a!7e7Ap QG b?q"18 6J^ _~>c#
+VAq3@.\[CO&RB}LTD:rixWKM৿p>`>tn;q=G2C,R>Fgg ]6}6I)H M&<×LRDR;yFQbfe"푧da<w|J}ثKp#.rٕ32st/>ondcSZxEe!C3Α?*wIG 0K0@hVO5I<փ[YjmEi^.m˹+ϴx%?BiSh~Rl 7>2gURz>fY-XAj}&)Ot\hϺEaD,tUBNd{3klלPPs+.YkъU*f14[ycjRȈHZYQ|޷Q҇,a+K!,c4oԣcS7L2^.q@]A4H>P,#k"; AUx~tEsCT }lSmc i aگ
+`Z}bB7c0GDXLv~i; &Py*`GR w{ /E"*rrE]ǥ\2Qhƅi
+98_lu(R4V6/0u`ZF/%f|$X6`8 ?Z M^LT?'sҴPs8-S_I>Ɂ+>KIצ6MtnIQ$ }$cM
+֋׶G4H^e3QrUKX
+c'K!m+OXIY:@fnkp a9FBIP>qԣ|MTyԷ9Fpgtz
+~<i뢈%)3*b`kX2]Q+)"U(0m ku=s> {+3홫0Қc"zV SlGh pwa̡%Y F{'Ӎ(I ow)U0`HmkL!J5HAĭE#3\Mί
+HK7O;$XK￝|(Ug<rXI<2{{U_>k_{1[/:!fZ4mHu|#A]G/e$j3+"}chnAzŵ% W뽵c]j>I^.TG'F^QGِc fnWWutUk2UCGAd!N1)ZJR(S7DF)j7Id
+tmUf/K";C)Wj5^7/}w-
+u*[M{!#c(B&IO6h^5~yB8 ;dC\Dr|~Gb^E"b80:_9X@A_qaB4L#ԅR!/ֻBqJSLW}ft,}ݵJlAklu`m$3L:tlr #-LzRȅg,H_ϕffm0v ܕt:gu>pzH{Q<y}o5Y0h8W2&zXI#(5&
+Q|[`I;
+
+ՖTS%dc\wD?4`
+C@>rHn}|Sa_"riy!"YyUgH*u5Si NR` 8Lk) U P1'1g4i`c9r``>Rp;d@P$翞@ J6P\@˴7X^e76vM&4&)IR_(7d`e;,m j]՘7 UXnz: ].BZ+J^=Ё1Tw DX1X{>%pd|7"p//9Z|F738h]qPa<?u;qZNHO'""_1+@$ 2T90S0ԓBȺ+Jc4°tFײpډ5/ 1`ih1o$&]b4WMW40w7Gr &xYY/(f/j܆É`P9EA9 9MOf{A A
+=m^Co)&}{K6MxK>^5e6─{ԦfDr b23fd8[FҚXlf,cGRػ>]!
+pmLzq?W rbɎ1 c^=Evo5eqdAQoF(<2Z>сL׋C:>~4"ɂBYEaX$z AnL^M' v*Y!!I"f Bw"TtsNv8
+LO]AfS ӓn'5Ȝj>='ak l\?$¨d!8
+-+rh<u> pJ
+&m'!pUgW65ݧ.C 8dV&h?ALgqÌ[S7\cƭŮ]gXZo
+=
+=}QZCԃ݂4w#FjEΙ:nUKַ0R9OJ5%4xGE 'D5GZSB_z H;NRq9Hh ¤pp6 s_7 %e݌5b赺1ZG2$+W"CQLa>!vƓ6hb}m,E@t<Ke
+m1ƿ~,P. %veEUg'eg卜ۃ81{uT`2
+c| R.WvTH"*n!j0UPtw83ct,;ov0RU+~Ù ٜ`)4W\.ئcvSJ<_
+K\)f2\AU)AGA)' ¸fv!]0W`sK3Ic!Gˇ@C$҇`q^үB*7:lTf53C18 E_SZSo*@ѰMK^ĕGE~&ali2Vpb0v]̜5)|h᜴WC0v RX4ʍD#Q Hg4;㦦Eam19ORQ]t}>5Dۘ%Bw$GL E)X7wmA)WgvG@+)Q]C+DjX0%\Z0ZžkmLK_غBZ io~-Pi\\=N1֡}i"-j~!cXeIa9gYD'dZ/j}&~З w 2xq)jJ쯻I-7N=C Ou҇.| t37U+=aB2[Ԓ;
+6h # >WA`HZ=Z<Vވ7O8?#[]Q u5SZNJ2AHۦTc !
+閷2|h4|؊
+
+&fH1'Ӳ4Lwmχlfb-3ԓ%(3E@?klIK-#/ J9eǝYjB#wӑ9 }C<-ABv.Ae~:dL6-ނ/ce
+>ToBhը7Bn -< %Cf/A1=QZc T-\cL&NZ-K5k:`AB:
+,FOJxZcZ} =Arڀq` 1 T8UgS<>[SliCs9l:ZBA:WU-:ZQpF3-4qX|YP) M,ta ƜuxyIrQ0t@H/x@c*+fbuo6D ~ErH nlZPA/!RVEwL :A j]1q$ⶹM5 $R$%ڇ & +0YO`)
+V*'y3mt%¹cxz. Gf ]BN| !<Ppep*ȉyHN֡H!Gݘ=Vڰ3Ɓh iG-`4FhNq&wGX%`[XjL *Q͂Xң,ALٞ@g!E -e?T sWP /|
+h=uT{ۇH01
+2iGO*J5q+h*Kyã }W
+)L޻Q~ultFa$ݵ1Yֶ;sņB+PWa[q8%{.TnN;uxgLP9GFf.ȡQCh%+[Q`-g}ԓu3 tcXK_j=׽uy(Lmcw㈌7 i) Հ !sy _FvK> L_ '{MyTE~\Q
+0 n#au`:pc$EH&bև(Ӈc(qNM=Mu*}Z# /%En@ƯƇ
+$57|x@HSEMG$0ȇ n߸=p$iHMo9c9 Nɍ,cS_
+ߧ[9$?DBw'&l%$Xc3䏞J2O\'EcdI]dԍj m(m#(42
+ɔ-Ӳ2䒉m/ Zq" Tʯ|2uEv",i%].&W\&bEb%5ZO:b p&"\|D1U
+nKJ#'1rO9VK)!?}@:p H%2#F
+8곙; ;{5tErWgҘTywj S\,7CP
+NEzc dU;ak
+T!ÙK'L*} t@C;@Kv$ nw> eBX^W^:$ۍ_W+KRD`.l~i)i cن0aeX#rhP? 91`2zynBm!R`Ru(P% 0׊1/ e%Ki5௣0Lp8$$3/N>,Z3dMqo
+lm=FS겸MPɀK۱`1&)'Wq k SfD4^> 0F5{ܵ_EQ;bR )1UҼCzfgQ#$%,IdTCp3"%Yi!Ƕ- ]^Kz<]*d=3@f~S d߻%}>6c'E섂c
++e/nY
+`2".,KQx%+n@v9[m!p ;O(S{
+H("nPE `m&Dy}cCmZ0>x%bPZ~E"2xGUxL?KV<OT0poG܆VMXCpr<l@q\ wR&ݴoLLCf'+.Au!& v9
+L/?Q
+6C2I!bT%oqeHI'zOуh6$`*bh
+|sc+bRFEKZ@Wg`pnDISV=ʜ*R8[Fg<A+4d%}bU㾿VKikP"Wl<_}:A`D
+ĸQnv frerg=/a
+F0*qB\+'zAAԉbU ԇP2X"˗e)cIQ1nby"}CDl88ѹ)
+(@.xz`#CdYZ{ S;GMOMr45&cƺKE֮^va}FyQNH]$ b&UІ1/%w/b3`ė+tԑ WΥl>i"WQ7g̒  旊'RSiC^y똷X.
+HQћxX_MiUV
+W7?@R
+ N`Qa6}_[sPrL"A4pӱtsdkNvaE%c
+08Qfg?w_.\OQ]9 U{ $gt0k$k⺭g빝W#K,^r]a_ Mc
+j91v >mRW3G >0=t45ۥHJQKjDKŊ|W;<#)Qk~PI HK%L47/􀙥|wY
+m)!m188RP*NA$t5eP
+'`*(;gw6`* 0=9lޯz+Ash,%<" NI㭕<Qnܸhj|uBƇ9M,vMB3NXšA:WN +ee+k>*0" TbΩ]Fr\},o %pnk),B
+f|TŴi ]sU)9Y_T!^
+ƿ\VN|i8n={K9%7~{u9c$ɼ攫X[O'[c٤{
+OT-=1f=
+PRdNT^婑o%d*sI\0aZ@2Q[;hwTд!̈q9g2貲U@]<`؁v +0?2l7N&kf֒׊ I)~R޶U
+8#  <懊{e\9@IZ%U5j4x%\O
+Q$lnsZni0*ߚFN%`N6voY7aBaa
+Rfd_LģmG!
+eRlD@{ӳfv?os^رM|P\MDk&!fgQ/$!ngP]G^CwSzb3~o6UW>koKUKR&=L(ol#JtZ42k{ߔ(bBCȹB׍ 9[Κ %RBhעYI=8YH٣_I \?C0rݵK̓
+
+j[Cm;\>Mg"nM3XbJ!
+<?E'/Yoҽ՟Sx,nUe"O'` {Zv T3!;$!^1)BQ2F2vg!X)XSTL@B262 ^&! Wsco?Rmţu&u^B"1C*$%n$`sאϏ^MC%UF7!8tH)걑̼ͻ2M<ķ]͔N%X+ᇠz62=% RҳDޭ^j+5pmE ^&
+NBK\F;U91j}/)~Sj?+D|BFUl~WZ.Ts
+|L63[<e@]mE5RgBdTIjŀ5/'_DK.:J8QqɐJPFh k
+w0v?ֹL\P.AH̀(兓&b1} ӭ_VbY~}US8&1hC@c$Wn[oҧDƥ-ƾ*g\ru(W[8fwPW5 q7-X|dlٕ 2T4\J5^6? rN^"d1r>pW7RZ"6D{ӂz`փ;nSmQ%YW$-4 ˖PVEx+%t(Ve@DؽJ6gG3ب(AzS\oUր?xOh<LA 1TU/A:\䍛_-FP2ta`~ 2z0ŋD
+cڃͳO*"s`!OT|{ )>,W?}:$<j| Od\X&[tL<Mf6RX
+Q3_g~"9LaUTz` ` tiWD0$"`N
+6˩)ف@1P@z
+lD˂Q 0"C7}
+/+
+ r4S=Bψ9o@8wYj9&ԧØcg/1 4u{qxtÂvZ4fEl$Ip*`7+N?X*hOB
+cdFjfUψ13Z"Iwr?[qKzDAi@7l a)Re;.6?,B+[Mwݰ~Jb/ ei.Ҩt9BLJh@Ѫg$\+je4UcIһ}-7/,~k1N? lB r[GsRQ͹  nrH;%>
+qUdOz/a1|T­y]v[?M# B4Mi}opVTRARS=,dm21*v9M*ԝOȫ|(U<+rAބLjyԴ ؔ'lϛq@*Ll?aWwiѥdS]~zQ3Kz|8UYRIU2a~ %< \Z;9,]} 2C9Rk+%_,BabZ_.XsV/C=JC3 %Q}a8E'Sua3  J8Д8G
+댃FSKx ݩc0N9.I
+cܬYδO.YmKqye\|^|"^;d% b@U~
+lF,\vI9C2xTZ:J!&4 <iErNK'W zaEY#%MRreH(dOPqջw߆9b.%|w,"MU Wo 2I#W xRU2iL c6!UiAET
+EAH,b}& jCsk5lHLI(
+zob8aiwܔ*g~'"΃V
+zt%dMg_*%;`
+ȍXȪG8a*Z%sECk+:0̄+ Uضw
+]@0 ւ 8nG$2@q[|-[' | GMLIҳsG}:e'#w8A k#_@&U] `nS>vF$:򀕞C$T)EN^S]Ngv
+MGgyY>HdV]V:`f?twP˲-\mwua^o0 oh "-2,F\1p*=18L3=$DqxK bA궎`-#3ӯ, ,mDrD(?k/\ $cldDgД}Y (Uh8x(^簘X:<:2E҂եg+$]T%e)fS"4ZĜC>;De֫p%0e\}y9g|
+сՆ5%mUW1H@ʴl'f%Sn=7wՖC36A_|dehC~nP))d]`T ۔%1e=j Q ,۴ueQTP銝2Ip_="_J[MC}ܜbR".WdVgew,W)%gl6 #{ɫ_|kxj?"@ FI3C{šϷ׽~zzp͍Bt*L
+QDIbtU޿V?%Y bw EtB; ̘J
+'2 A`*Z [B8inT|^@;ߔڠU,X9DאؓDo#uC:|=y(sE)oSO XT _t]d&q{AxSD}}ɃdK06LDB yX3u K u;nLQ6Q*Ķ xtBa\8`NV~E$#
+3ɰjX7S[0)hdo'rX>+ЪbIh"9M^W* Rȃ^1{+oͯ|N*]S" YL08|1*,IlҀrgGu_?ѫ-kބJB W AJc)
+i-a
+>iJP`
+PU*d\E"9 Xz9ir58v}mɨfk %di/и6m #Arɂzqf(+
+?ddޜPX7b3EUf!@U× {| QY@n% FgCe `0]C$3ޛ~5m7e3Ú|Lm2mZ]̷rm$/ؒ.ACUW~D|$G^Y1 9t0DZK#d%#@y3._ػ4d ^1`D5\ XwĀJ+2S s@C0y-//i-zZX'UcPxB}_ yP?7pMs0ke|T_IED啡p0Z74Uo*2}IطDͰF cFO&3-%Pe[sSVí?o;0`\0SN b:b?`!Mg
+דТ.ojWDYksA0v-/E+bSV`X|Ft5n&̞OċAb>cjU|(ݽ{1
+ wwUs_D_#?=Fu(.6į&okF$ZZmz VKT!xs^g .Ә hQ%@+_/E^gpdIxNd#MNhq}:{w
+ڒm8+ m0l-KJ_G"J5 =f挩n%;۶$`Pfs{@Ғ1_\QKɵ_&N5cV H<kEn P}d-S%IV]bȶQiGuR)g2>$A!
+/u}woU[} }},nr'Kc?/WyWm8a5ǐTy
++ѮӪQK;ZqEenwh!{VjM(zS撣CE-(Ц*mM91dwL_{'sq>Wć1mM2c?R3ǘvKx"7klq
+@v]Q%1眂^),jP>.jF,?hxi}ΏJܖ%ޝcd[W9e@s.ISb (8sxQ"1Vc#Qcl+0(w_9 ޴@^l%p&ϖOzIxJ+P%2Y;SIuØ7x4%]>Y4gTC,n >OZ㢑3*m{#dΧc9,sp+4yp
+f08lvؓn%
+ߊ# ^)a"^,gv%Lp!%GcrNܙ#M& 5J(~/'/vT o!5V+ۛhrt*4u\=Ú*M/ItYYtSŊfK
+,s > @c_;i`*=iLI;oQ2>sAWqf ~*F#~OvY-anJd4'QV- 󾜞AQN%vv1o+
+HKn9O;S`>Z}zv hnRGDY_-{ZV>~>mA,j:&tRRBUQfZ32ǰkV-uN,ղX6dTeBe%f+^mHo֬[|J>n}l1ZuNzZcs IVHw'ՙ'ث2-[|Gڋ%8Acg!;b|uzrVkL/WjSpNꗳ[ul4.\9otZf ʫShe1=}zRs
+Nk ӇSO.3rӁni&n֟W5GC{i?<1sìa!:v^
+2RNv>$ V^NArUt蔪'QѹL gT=LW&B9~ "@۸fhƗBϤe[
+l;"OwZDN&iJ<jU6Q ~ W Ca<wz#~$PoModjDzEd*ӺrW7NMg z|&sU0cOtL֬!!Hj(.Ա'-8(Dxܭ*9|ZNAS ci<Vs4M(y cuL' M_Ѵ"9Ε*W+¤ytfcd&PM >HP7~ -dgu d)s͙؋q_
+0k
+Sy?.$T r_k:G˅eУR=}s *|ϯrhH+&ggG ; q
+]~l6u4H.}bQԵ O%eMv#Cx
+ES;Ah 6
+EbdYh-93}̦g"ζC7Ȼ0Pf+><
+G\_/|GWU>kzh?j[ee$hڥJMI. <Ƭ힀h B/m]{x6Pd? ١/˂ M o9b֡RaA(8 *U[-bC@R',^"% 6/Pjs$x (_s1HS
+<<|
+&sh{oр 2B~]#IA]lW49za\>$ c[ AW xlZ
+nBY9$dͳaĠc[lL%A_ <5bԗ6<@ݳ'aVH`ZT߿֥A~}a}9 ߦAcy OVhB%
+1dbE~y~j*AYkĿap6/ż<:kJ\/Z>OCEwn?e \Gj8hJ Snx֌ԑ+;f"L9= ΃!4 '#dTAual(C"GN925&&nBd<y/**xTGd#{VB9];puWR "n(027%DYKy8&+|9 e0 1qu)Vh
+c>b6Z絟F&E.S1w?ϰfTi<A&@y
+%5rc%Ig*3pdfK7/H^[U8? b&Ei6`ՍiT7W`4@n@WI4Z[AF
+zRV(R\f| V7nw0<|v_=ɵ,嚢  Zm,Nwe:}h1RS@,6 ?[El-AC-Q0Mb.F(~Ŗb8D<w(r:k*_t4(a-mE}F
+8:[EqND`~qD|M {:p ,{jU\an+{XG5`<$M~g8*sO6eJI[23Tꗊ4H8w+.u!&.E r 8ԭ$BۙҏrY?zѣxv?
+łVwq6GeH%O;ɺNEЅ\5P|& 0
+8rg̕,Ռ ,1ljy0 $Y7qyϢgmxJnD.w(
+f0XURHta#gs&o 84Aib}:TدcrJA@LHL%ʹ%q w$IU|qs}8)B
+ΜG%VUf?{TGƂǦeCGgc&$pi'+WP[QR˔LJןr/R!}\| c 0[լU
+>A[B'wҫ|2Xny wcPґkMVwu JvNrvm &'U(t.sHxh/Jh߷G;rۋ G>`2F?"HY;DnIZk`)Jx},ڍ VeUC
+𤓹_S{
++ɑKCyw M#qRm*D@> NQؠ'VrfIC󢎱}$ǿdAq{aK`2G^ xk2
+ g>?+8n{_H,wn \ oA!GOX|G҆2]
+sܸurڸoH^chA,}rzT&2gOh}j ^*1oo&X`<,r+y눂Ḿ{70owr>K9hthS>9B>[A
+ tp]-.҈@@Bc3Y6*$M b["&).)ctӵͮ_jںpvg O Vǻl逞#36klc$FA%쌗2{;KS:׃G<!N aˁ75:uF5ډy&ϱԨK2u<-G?J{9NEKA8 `vS#nH)`O2֍Ia޽۱B9Tu))~ rGgj]7Kb(t%dXF!^n˴.at)xC"eS"㴙)=4|48b>_KВ(6(gF5]A肮4TE1.D?29YYM=4_#L#bE?2: uY1L;H믭36 >ǙOQ0ZAł!.ωݒ;P"~hn0 /CP~ L \FpD 6NQ;՗
+^n*X2"eu0B=m"Y R^H&7NT89ԛ@4킪9nBb%f7cނBw!~cTM8|,'~}h||x< nV CLYXĽF=^"Y^l07<P46¥P[~)P$Ti$R% ¥bDZRcXptzY nNگ^5 g07xu! C"ZֽE`("NAG2d ;n
++gx?M.evAA
+|s3 ($1Ǻ:FK{0 -Eܴh=nncQ2Tkd1=P%U"kg\ ۮ(W &?2'уD)3,~qr#05km |:mquĬ O{_r\Ѧ<8.av?:Xf0"| ztg@p낮Z +VD&:d7݂ɱ/Ѽp : >c.11GFdm 9\Є bNup϶iq'dKյ9 'X46
+HV upcIW  Il yh7϶Z+d[FLbzօܳrGu/AN=̶RPe%d.@FLZfـ0+BV5!&$x^75E-.s
+HgU%i["53Bmoa%< bT4@)fKW[7
+ uz-͚%=ȥV{ޅC._aH=F|w)^לwz>=t/%\M.ŊgoxĹ#VWj~ZT?OM>'9s$Ϫ(<*9\#nOδ#hu:=-s=1ZTV\ ~{]bck2wqgn`QDHvf:i!AC -" 5QWb[銤
+x)X@>Lƻs[njx!<~Hւj`r@# Af{Lҁϵ<"5 %,Xq)f{]} \C ԓ/0E.xKRpC<s ZtN)*+4b< 3|*TJgd0*PQKs
+mV
+/iL3E*\N Y!Lvj]WgًDW[^7' ̷7ckw[p;*tcZJO]ݏ!2싱Pg@ɛjܘ xv ;x.`fl8iKꌺ} A %]3K񢔓 Đ*K9;i #bmKL"jZ[mFFoLZyRPOGG'&r5+.8\U,#f;w$[ܥkDpaqTtEr/Sq;: -t3.
+I~HNe`@V~Ĉш{a'!mY3g>Ϙ` *їטg@ߟ9i;&ޘ 0IcI8} 0tDӳ5/4i lKR3Qmtv`:7dԘ/=QhL iD5QA&[nT_RI67(oFQ;aײ5#
+LKJ>6JʢS1`#kԣYnB C4-1G1H(? 㪴;$DAK<?-ѭMj~*]NJƋN(l
+9*b׈3ZnwIN&$z݆SYֹSC(]ͮH^y|c0:#q$}c̙-.~?Eon6< TZP}Di#A}lJ+.0Dgea2M[_+4lQPv _ٚ+jaZl,v^
+# ѕ)CsRC<$u1W(>xqNo4dmQ#sg0(8JIU7nȜAT==Ty>d,r& s,Eسm ;4XHΧ$,~&,Kk6.JH :0
+
+osM EZ=NO!4OG- ARQ3Q`0d)B5jɕjHt2kV82pcȹ\J"c1熢;;ʜr׈sjH}Q+\E.
+#QHVP^Pޝ1N%Lp@?Py8a'H-yv?Dphz.b2~yv
+b<%b'_r ѧҋU&9:œg ^O \dz4,p$)CTLXٹ_FK;eڻ؞tm38n@a?z8iXC9oRIr>L휨pnyMQBk%G
+܋WɧD:'gv<3'8^b~0|-n#aj<u f$X:)NdU?D]"SdE}K49LZ ܏7ΐfQӖxh~μEKlR5^O
+:n 0g
+6i,:HjF6éa5S=
+Û= S~C:
+2G1{yIS4T iǺk5}Lϝo)P ;TGnIr9̪%QkwxV&a>)+H
+ э W!򎳉Tv1I(Ac"vD.%Th@"rG% *zI
+ mkǤݹV2kNI
+B\L2F~KukFH]~~֦j3! s謔MDL"3f:Io!IN%{%ǥPpyl4(iW SfKUw9.˅0;HF0+Vk:A>ވԕ(QߖKsPh^Trzٮ<U*ojH(~bvdH #!xb5f5hkhtk3;G_N/v"'>VV<+
+7Y 
+d$+\0TcWT\כ]@E69+z< =]
+::Qk %D'"<Ax KC\{9(x(~).=KKCb|oy~A|뱷 Y|1Z+?r#x|[5 u$]=?VmVh8m '[(>حshat6|剢_I
+hf9 +uY%s<=k\H׺:lD?f̘ i@kNAIbB$$dnCǜHR]tLu >7'% "Ri0WI hoPȠDSӵ#Lk]$ЧըRI.g|%K12>ck{|KihM02})8ms 1M(#f5<P(2l XŹlK*)
+i~ĔY;$*tVN>
+ q6w8p7%17ŗv*6hZH/ĽJ'Wi_
+7%7/8p(ݐS b/'J9 ;MA&̻=oԙu1UTvxmf080Ȍ;=h @'`z`- [’Vn-0Cȸ<tHw:!VV]`[hg1}yW&e4p>cƹ-n=v#=/g WCJQS&Gx!f["4E>2
+>@ma?N)`B&n.c6,mA7o]w1t\0o{/E]#VC L"Bc[`^҃<FҬ*4@8Ռ &vM:\NL.&L7UE0ٮWbףlSBm#t$>
+}0[`=ˏ .X6}xDrk.IttfPW$ct٥.N9=d4EC]4Ñ㌯N)tH%jD~_u
+WM2_3U;WL*b#4m-.Oc=w²WKX-kDH
+?
+[B$.'|sשrnaRk
+h&pClkfg*)WXsTrRS^JY78 
+0/fz2?JbU.5e­%S!*pD4ַ NF2"s=xjWAD{-wUuLW"+4s4d
+ Ҝ"Ͱ/9#( r'ȏ u#VԾxW@
+jPk< b$oȣ8,eYѫ 8U[APeT;$~L&eB
+;^UH2I/)
+un/#4A_G.bCsWYt*{Vl]7) ʛk'%ʶ8J)z~Ki%heRyýfL`@C (E %"*{VɶY59Ht jTH kْ=TWK MjDLX&>Tm[ Eok*L|d Um@4|8j
+(˜%%>l$wM~d (<4}V|:/M fgLIBV$<4{4 GExlͪM,yԖ
+',BBP2W\U>7ja`tk:G^d` I/yM:ta҈F4wŀA9,+@Ll] u_Pg~[+
+T(WTTtysÂLZjq-,zgXKvc:sPD,ry9$.6zG.G !9y ~&5}tk4Vt.wZ"[>t _O^>o {9>O%)dJ緭h xfD-Pj? Y e<?/i8/Ј3kFtoTTШC?Ȫ5zrvŐARI&E%p"&YC?2p96qL 1Sr&LW.\nz*ۧk6$ 9x>M|'
+HrW {<fپ#@giOIN!
+n(@BI;J0lllg{O{6KMT
+rNj;()LW4KL"Жvraj%$߆C5sV/1b8P,4aͬ2r#]t\k/ApA
+<Jxix " [2*+ɛzFr%#<蠋h7Ұ
+A%ةbl~M1ouZ- FE]'Yϰ("hL__
+/]:WnbOR ?]cp)A?A&nBf-JU#0Hn(;AVr`QAQ(C4#]H'78`@ij􊁣45R+nX+7Q3
+/@#X7,
+x/1N[+aF&LJ: ?e Y;Z|>*sl[ \~bJg;ӞeluH`+(Y̬S౔Fq佌 O6< oTw{
+&ALng&,0OzG[:@Ia_τ u;KeA-ERm%o_Ix$N_JȝJMD24*AGXc*2qoE?5ԅz6qbM6?S03Ś B^*۬;
+ "!^bKlw֙"39mf9ڸF2v(?;p=9J1u?.se!9lv ߣ#MhUGmUED]}
+@Ⱥ؊1y rDV@g0,zl-q' N NQ< `SܮhIDUN7"d3|LtyŬY$(;5D2tͬ }Pp2BLfME(c!#gfՇuqk<Bx%Lud)z*-Klvl>1`Ƨ׺O AΆvT \yۡJ|, oЀMqWJݒV.4Nj2EIXҫO8`Bą(2My`.sg(xYvvaj XIE#>=
+s,8#ZRɴ9c
++<IaϋVP9!F
+,\a09y|p
+bJOw9$tߪv*o`p)仍>KD~w0dʹ B)4̱r YQˊѮ稊~|+$2wdFUgȇh#
+p bHysjoEܻ+ TDPH}̒o:䲋tbر* Rx =e@;bVN]2?WΝo^m6(B!!zL_tDR:C&$}x pOXmYϹ ɻE۠ٶ7VWNTb `B0š %N
+h$Gy-l?؋ %'o"TE_ >ygfjW
+ hfQxx$u
+0OV+vwX*^d ZQ>Ο+KayvOʐeSdߖ
+s9~C2MX ;,ڴɂU-:a[
+,Q[ $R>џ^[z雵P&
+r}6#4 2i6٭B
+#v(
+MAd%%W T/u-kr*\UhDe"([N/qGid<['JOGNid.Mrr4-@,zLQ!!+
+,Nfzv3&j"'5Qȇ
+ӄAJKƉ#{mVDK{9JiI=->!13 h3m&M~_\LqtdW l:-tbv@盅ޔߔ"ƠVfkH m@ttH~CeH:ktٞ`6(+b1Y("E9T4 hI@"׃VqIOJ"<1Ø` 培1 p6ȃ/FF$ױ35VB1&o-ԑdeS{YhKJd Tp2 I/2؄YC;癨 wpH4q%D N܎3c0f_ k#P;*`aIqX%Jj;@%(h%gJ^dvE#h~2Qą?G/-ʙ{+q')FA9ڌW}Z,7wVV2#JґB%,Aߕ=vX
+i2%n23۲3EKyj@bHV{ĥKW2Wb2>ai!F:EAJ$5
+v9ܣ:Xm=WE~t WavT}5qB0إfk#(a[0!2dk%(pf)/?1`X H#p5yEyص-j; ̘
+խ&`
+cw"(
+rJZ28mrerCu ,){
+E~;E/
+]` J_k<^>qy8ǦWt?Ӈ"eY"l$!'
+0
+HlM$9
+O0wl݄ZAzwGduDZYE:!~mm].vXֺ#h:=?_Bowkb{ZƘi}5m\{-1FkΟSc<rҖ]=11'niFQmY3,^^ |sbzu{թ֒{J]7;nOFxr3yj ǚ2OmTWWּ}
+6me9S[" Oqk{%$uu |Y b;sxow3Z51=vī¦RMidAi
+}#ܚ :[cZ)6&<ЄoHdMJeHk
+b05.ڐm\VBtBF.Hc)'N*,J+Wiin5gi&Zd0_7q%b9)ؕk Eu$H
+hU)WP\67ZcW~j4
+8!;0KZo*Wp
+.T2jBt29x;VxaҰXhP`yix%_ԩвtx
+lB?Uմ/0DT)k )MHSƺ4_}
+mLۈqOɬ?}5뗖6ǀP[[
+
+:i6ӡ
+/<_4QܠM_Z*;(AR94F1
+*@/P%E=:Kv]ZEeACT$f!<8d0+ WKրZB`wMh׉%$.A[
+@SP<:.V4p`q,!CEʐbZbxI_F[b-@eΎKs
+r`z4 S55>3%k_
+Z՚j +ZCȼ E%n1)^- {5<%U2 vV*j\ɞe9ѠNJT
+Rn{/yX~Og_#1A,37J
+8~[ t]V!c@g눧ʬj/8АU{Bwzm(_E|νG~`A26
+F1neh)a[6g曱jģ@W bunDӕ^Wڍ~W2?Ǡ]y k84U;tAdzb1n]#m@@sØE4_({.48st _#]o~gң\)~㷻/ N_ʴvoS  7"AC`1GP.ؗy=4IF4$҉H[jE;adeƔ ۆ$> ݁:”zDg'-vwYj#]GgFTX$"
+:O AEB'K|,#"sJ(X?QQN#݈jMp_.b!gw/p{v75 
+bRܴW8#l$ >yJd&_sR
+z"Da~
+,,,njWY@{Sm&/⚯i Unÿ,e4
+ wNQT✄,*rNj` A
+p>)_ĸ,Zpk;>B,/b  *&ĖcYH/"^<cWmǂ}t "q׮$
+ڼ B
+UnIlGc tZX``\O@{3JEqQnoV20q
+:fݐ q°8#J-<Hl!2W(`{5`׭&3΍/!
+QtQ։xH; wƀ]
+6j[oHa5*6g&,EZb\e@{b(YTͰhV81LgдKS#& Y v͞S
+8)-$UݡW H#Qp=ymb! Y/jq1 vͪVV)z Ng0wQds9ʁ >#ثd}<
+
+x0%v|HR
+K统 tyi6ަVݲv/FYiL6|~2>+5{ 8 %m a7#D@T,m.i *O2V$zdBj
+ϰuW`ҏ6',[lO9,i` ȡ7
+fcFIʁY&j =<Dx'u.py:ez#`}a)~)f gu"Tu޷ٙ/@/3f0+ʍ#PP0fbX4,}U ̀{d uK3fE2/Q=:W:0RJ_C
+fCx(/N 2ΏfMV_`ecU\.b)ѷ5aFAxe3(z9ZC
+u"ݔTMlkN:,a>W)6Rky:ֳ0wF | ɊX̺
+jCՅӜTĢ T+Q/ t(.Sfju24f\B
+f2?Su 6ru8@5Lm܃j#TpD`\yKzX2%%𦒼bB;A]h։VU7P
+Im@Jyfg͡Aj&@Ztz*94Xw/eqsSݚQ 7l4&6a
+ȵͧteK*_vz,m'O|Ң:h֡`G }2AUl`<*aM {_$jy$d154k0ֱΤ!1NfbXl<8-֠eN/N%Paeڬ0J"h4R)N,GnmmAW ARvU#2e옌,hjA鴃d :cdIHnnf~%k\ⅰb$<ŧ(~{/ !dj@k*l U*'pdWrf(R2DVY Y&oj4m|OFBZR3C$ujETͩu ?A-0G4oC##*{dZ a rYvAYh`Y#|! b3<QꓕsdTٍOdcsjυڎxgK$5rB7i<2'\bA?ggϑҀo0c0T¤*
+YM]iimJ\ Y8}9%5 >PWoN5٩$ѺM)=b6}޸/f0Y=ߺmv݊BIXij
+=vu(i-5*Q$hs! !:VKHIqC !ϝ:vR Mw/5 o$N"4HcÆk![
+u_L&vwI?Fm*S[?Ph*RRU7 !eB9_/%:D5e&РVE/vc94ҥ< ˸"@Ja@PTż|?!ǢC/2 +PK)cBXr'y!n FXب+
+V":
+A'Ƴkl4z
+}Sb
+vc"8o&_:i!
+BOh
+M@QJò }*iB],$-r!חWQoUL"khk2JaS-3؇ Squ@ r
+.٧ L\`F1HEYlx)zLg#<AC`(% )xÙ KUHdk9NE]c7+2[ô$
+7+a7B~E8&vNǦ*}u5 KeQh lV=E
+'cI&]t*_`q]ƙdwvxY#)9OT Bd6!#kAȠ͘ȋ,dYU4#1Ob]ڝsd YPdLZdb%6QBm^Y:TfaaMSatv&4*mB#Lq~(98_g)=צǐ#b+ l2';OBY[ƌ,if`7#z$6f,A/*&m$\q! *yB
+Sl`[G`y:
+wDg{4x@!#ș9àOD\oV<U'iQ q?N
+1o)Yţ3)i\9@+) @uy[h&u;"$r 7%xJrr
+ʊxVuXʒ%TILWs
+uOݒbtAכ[`t8deIx~YhHx]*s†l&*҄rs43ܜ7Zڗ]{']e υ~UBiyu0;rbx@ڕFPjG|?VRqyKd kRcC"VbQ1%q
+XgP2rY s0͖fXd
+W"
+QM=E^ue7Ϣფ7\yZ# ) (J0ĬRQe#8yo(3,JJn/J2*T߁qjlUdpnQ){c<9tEhn+ T lQbb'uhɚ6FIlD #
+)3&W* m < HD70@]H(IYwRt?ݙcA
+ f@ y䯯S?|Q@M>O`xp@)@k$
+D0y
+P\EuXĸzmXX|nK Ձk툼w]Nn l|ͳTHLޮ>c5wJ fQ"].81c)v:fupCQIcs&f,r
+/B<*f5p( aYGOog<ofP~&phlj KwD]N
++~kT|ſi)r51'Z/Z3--{%Jc@A/F.5Q K iߋ"Q(RDN;|ֹGMb"Hc~c+GN h
+9yMVuiy(Gs|A 壛̖(w0F oH|q'l数EI7pf5mkcOsih8|
+ƛUN NoG,\#Gbo&-$VCuzuQG'q_vw'  Ja,+qDfUs1o(=VVGqOʠq.-uᜦTd׀2Dh1SLn`nF3.I2_q
+NI#*ʷFJ i2jOv F C=
+ ) 5×+Ң6&<-~/ŋ(j]n
+
+<sGo=VfYd!A0IDeDwG#M׵Z@-& I~_ '*D`arǻA\L f̍mA
+RL,8=
+%`JQhQ.7x>{jd{M\#%\fCQxv10v5b*W!Yd`P2`15fNA"HO2hDm<ς{
+08n lHd 4kC0Xmݷtvt".wCgEyRBoj BzZv&a;آ~~C eJ:
+22;M=M~`WNs@GT:P1cz]1@<چrRRER$<H1S.:G<w?7|zkۇ}{o+<;YAj^}\_W?Cߞ}>,o_s{뿼yxxOo޽?xo^s]n^oo\?ٿ);sG#lxfdN`OQ
+z $JxdԔ}ySzy-kzsjL\xT@;Ao &uhL5k
+bYbH %$
+:lc%~q5#ס u ϠH
+^ү(4Q'cP:%b Da#)Ar
+
+$Rz(
+dAc"^mk]D|&NwX"8<1zPz8Z@'uglA΃:=Æ
++*Sq]5[P!%^F!>1xfS֝`~ny!K1h+%JZrKzTa(B8YiȰ(TCx$9@+|Aq?G 2ud
+`#j6\ m |x( O6!ΰAf}Is<3VtzPX~hDLF"*yp)
+} +
+|O'P0XR3I>sb$D!A؟z} Z@
+i{n]Q5%Us]`
+g7F9),}Lwgd)`F
+)Яpyag͆SOE&_C[v%һqI}'S,[й[`8Z
+VWpN'ncjdc3:M^iztĨu1p/k<}fل!jPCAx.{3Kzɮe6 !]yo 8,4Y0H"i|Ni#$ D<mRs+gǿ H>{p47EbjIK|C%`"vF m0EzePr9TtBZ! ʮ-4R4
+/ʈI!p|>
+ŢZY oopPSeEhT\qˑ*+췛?Uk '^4og
+'iaT8 A߾ao-6%ۦc`w מ wؓu (o-梔QCPzPb}|E +6-SIl՜VZ7%0/1唓4MD"
+ykR9Rd%Js.3]2C<1 p˺u U
+[Dp,`\K;
+5j[/,Vt@I; X<
+30iP"?aHer@ n-ĺh)4e4P i/S/4!mC']v %ACq~+NAprةbWcQƮO% X?a?$1+vvE?GElb<AL*h1<1Bvk y͈}4 ]:W}
+/N ȱag
+mosn9IHtݿ|˾0#UhXhyhjYrC4/D9(m1KA-&)a:E
+7j ly^
+p#~ Fn3QX~QsAnfrQT"r֣fl[ GX^YJI t
+I݌NT1D
+^Ep뛪5̄r<l.>BxЮl7.#^Ka}xu4kKQ]@-#d
+A[owHp}@X;쟋4E9R|iߟv G)ǠoqeqºY.̙xR5
+?W>vo&1:ܱQj8%Gv(һ3oy/N(SO@lI.jK`8V*?U5>f%^H0I@t}3nN,@k!r=$u tA+eǒ"~F?z4*Ҵ
+L1վD8%ܾOlT#uN2*,J̇0EZ Ox*YJD +h}]'8kyNU
+)t2C`K XHK14PCC 9%\|
+&:Q< ] Rf\
+2Hb,ڣ9[-q`c샆%ȸG96D$@!Cm#3䐺`
+T>2r9wEhmO ksًI0F5
+5Y/\Kn#n%`%$H
+504\{퉀"M06Wpo2K$ =irnA֖\feFHG-6dyޣ=0A _pQsIBty)3\/d:kڃnאȽỲ)ܽ x"lkncfP%-K cѵLV{_
+~󿎿7fZ=Ͽ~ӧ߿lǟ+Eh0RA[-`9‰z,a:|8nM:9lԄ(7|Y&'"hwb|~=ÿ!ivZO D9 rΌ;Zr+WZN3/Ϣ_{PSLD B= 8}@8/VYF
+ތ
+ܮى7}_U[
+({rd Wmai
+VOSt3o6SlYA$Xo}QNj^.lh TC AMJE>xT-~Zsq 032h.5~u << c48: d)a:cç<߰XpGA+?e2l;?T7( M.43\NF;UGMNEv)UY8/>)6-TU긴S9N]nw;ܱTѢøwnuEsg 7] ;Fp=;)E9
+hat
+dzى
+ 4aBti3QNW2ʧ8oF(A4`!E[!;=N])z t$Iתc'@ZXJopޓܞ-^W{
+-FSMD|u9pWѕ'W3@SR5.|"
+eʎNW} Mĸ|^
+E#z5 5_WA)j|&= Y}}($JI|Rbgb_iwG7[J*Tk^T^}2oP4Tl,>|iY
+
++āG#j\bEqi_BC89Yyx4LZŻzƛr~o˃YG>k(6y KX y
+fX)4.-)1L69z`2r8ൔ͝+C >ԃ}
+7Xrj \hv)GFR@${
+["Qp@V(udr#[kCʼ6ujX},WOc
+![̎i(*j _ ^8 ;< /
+|#HwI=ܴ0텮FBLs0 S $Etx' VB"ԦN
+
+wW,x:M [5`(DhсFm.h]%˔ONh؉N#P;;1*ES6ˆp)D.foLx?vG.OM$2RՋ0eHގ)|4moDLsHfs艐]V
+rݨuu:O{J8!5H݌UmFDŤj(G`DlayJCAyg{O M]E8MLP򮂆91&BˆNcO:&=!L!˜Q(cip"`T9
+J pO~`CΩMl˝ *MI*=V
+7$^/a` eeEqK;B
+%F*LKAKXgsM뀆\̊m]ȢSN<h}veXpk^v!h{< }hb L:)6ףq!bz2(Vt8K
+kXpR\85R\vss9lxZ&٠1sz2DY#i"ӌV$(#z*BL`݇) RLF ΍-!̌ȳyDB2Ծ iuАqU WU,^I_ڱM)}^,GCK1Hw""<ǼoDg!:[f)l2!ϺH1hsRUw9 % .Ʉ4
+[B3M&X05ɱ*pd*ua֒e`CR<ްx3@ UZMCJ }H [6///ȍc!͓Eູ<QKV]Ԟr˧3Jj#>)ODpe"9pQ_ԺM8d JD\ V̈:v9ϼ#Q
+<H|#6d@
+2!Y?ƻ=V8{GQ<7x<2 2
+h%A<?,s3Iú> /`m X_Oos9g e
+M*8]s<
+
+;.:Pc+Q@xQ,.xKn=TU\1~2U-(=CN⿰C-d*=_EOr/8h Po H7)
+HA\9DO;惔(\E*;/c_Fm4"% Zlh9eՆԖ׿?
+c6&:sj} @T.!zu3u>RXW=AYH.lmn!"M=H"kKs]5 {k&sl7N(b,L,›N1|K|:Ǯ3??[Mo1==7 @jHSĥ\!#<uf@gvS6dxڌdel i6no/ouj˟J\!QƘZ):B>}4'H}6H2,c6YXz4UA4h?}S#ۨ{lP$ܾzϰ\* ӨkUa]v|C$yx;(_8DĄbO$}=]i>W "QLj#[m;h՝sHLDm*m9t!& 94E{bEjAeIIDĹaruop_QF jxM"1%~30:A(ZĈ5ym~RJA:еuQ٣[dzw8!XBHI;~`Le -1h
+7D_(.JGy
+ڪ--|UuA즾N:FZJ (U~J͋8nbKnƾ+Z|PtCp5 G)5dVƻyio~zm7_MZF.և@FkBJ?Wck?AXJ{`ZUIoo 5iٲP MgT')fB`(1^(kùdϿ2ԂV<.;#.!: :Hs:۫&3ьL!5PQûJLq##;k=(1_G366.\1~_c9Xd}2)_dsIbƷve j2T 9V @JKtlC&DsCƴ"u%@-pޫm8u
+eBﹷT]W!oNE0l:]&GUP[?ux}|X+fI]Ց,ذqAeph
+z*M},Ӷ!r$ukSZ֥*:ژ.}(Gr9g\ŭX,w~87tWM3k̔[{ p+GS
+DͱcGg؝uN9sRc~Ĵ1]Xso]ʇ!K1`.m:2ͅ;fq3dcBCwO+
+"\
+cnʼK VhH,6j1E k1Ǽt/% m?BrȊnY;cMPXƾC~-Խ׼T,~2hmk{e?F~kl;kV{3[n(xyo
+;dn,DO_#MfyugD0 N  o|6-s=ʻ,}8\s@Z#WsĸN#s=c ]:j5ķBH椵M#$D\Lq 9bѳ2iyX8D-Ua[LuZcGFC:Lb
+{(~P$^<k/_Sald<J_f<!l@kݒCqQ:rFoIZ' VzO<Ykg6[
+;PX𼖁E7AAPvpYolAw5\(65e.xd:?8~?ez`W5Β_ WwW
+R,%dA
+-YmUuֽ% >h\->i38| S狋4ʸE푻*꿃"NqT97oU{U^{ LW@#<(i AtrzEXI} B,WG$F>ߘw^x 6alyN8u%V:$kaTr/s}iA}适t#ƧygA-e['?ZQn9]*@vϲߊZKSTj<aUjNCJ
+
+.}^UpeBk\L={ă
+\6q%i,I)Um
+Ls{%GnJ)f_ B
+^MbUs2P'ܺ:%OxIg.; G*qX
+GjJoU,Z(Po ;AA:4-j,MH:IgdLHTt@Ҩ/ޒ2wR֣(dj$I%.鲖&'fDCM?PN2P u!$Br؁39mnpB⭔˚
+  oBiG!@yKr]ҝ^QU 4+ 3n *p+ȳ dTvkp4z*_J{Ì Nsm˻'@NV^58AQpliQϓ} h|gѓ7V L n{/uz+ha<>J$Q܁TF(RY:MpwQOV@b|؝Édw:'4h !cIYj.6"
+ |zStɇTpSUf& #Y? b,0FEl$`nRK'rYxG
+ J+Qn#<At9j ջYTn5g8!X2z#oC W"QJy~) Zk8il.@U 󦆼5r׵}"bya#KX1͛CH7#ު^KlBly  fgwqIr)žW9yde['͞Kg:U+>!3!.Gj7^uY>0B !At8>5agÂ#'^?4D xG^>OtEJީUN 2ɍ# tLZ[@o}2Xpe2n2 /?n>΃̚J+S;!*/]Os‘SMcx;HiD9:_"A3Esc4LLx'ХAiEq\c}a 8q h޲E͓=W7XY#dNQYILum Qq^ʇX.1wx
+Rw,̷26H Y$9סGaV}V |b;T*Ê4DU-P<ejά546 )G> H=5^ɴnc 7z(h KGwlA, FoE# }o^W2P+ )YCީ,M_+V_om.AYj[Étw[q%o&PZ9@|n~CMS\}R#ֽ +qF.֔i*1c"d>YGvM!S &tǏCy|.2$1f(Zc`1T4픽)nѪ1h
+&9f^ŃTq@PK$vG"!Zal{Q5lm7*c4B::9m~KEFW5v޵9"y9t2\Jfh.wT/0YI7ీUIvd!>gS)gL[0SC),<_jAAzq!w Ԫd}-de</ʓN&ˆ_е~<i[f#h
+>̡pM'̻]BDHF:'m %|N7ΐ
+9kZd&ic֭N 9A=C.CC6 _1x2Y
+Xcۨ>"1s6FX[5o &H57*kem\FTȯؙ2ydpY')f1r6uoSQMD&&Pk"#q4 7E2Gp?)U2y.oR
+^/Qgv4JI~ŋ ?$LF  ;Ob%(S;ahb|o *G#:סbX
+P1Gt"Y๢<3w'Y
+38N=Փ
+D>sh5Fiٜ d[S!YD69з(@IP6 hʄCzoAV IwA渢hU$ׁٱɔhXh1( IM
+Ru.r"PMʕڊ9.lv<ջ:Q CuO~&W}=4Lc=z )bߓ iS r#4ύ0Ĭ*
+'D2 Å<<ݰtHP-2}C#0~I`YdAlX&RNX,zÃa>ŌqTmYTd1-6f_!5].K&"mKCBɘ
+cƪ@(5F+@,* c*N \IYz>Y @'l=&Cu
+f،`α(JFpc﹕fyW vbHD,(PDLA䔯Dm>%7n%8ΝpZ3ެd:XBȃ-搾gTeSSs}m`ֲ]&uU`eO2.=9IMzYjz_<dư&cҞK0P@Z5evhh~a??fl4\E{vpݚ6h66"^O>2e%@I~L; . 9 a1 M\#2UB6l
+>z}.Q{tƠ`^!C. KC#xn7u%^tqOSc%m~!1μ .ޱ T7rL|SS4'P"A,u
+eMZLY(vui&Y9yGcKe =8
+Y#
+L5^O:nml޿/qzG[d%pM`kA;%P`VnS.{)MR/ϛ:$4V, ڎެ
+4p"6VL3CxK}em}~XakBshXz, 7(1u;rj {`XTa1O^W 5=.P N "ԙȬ1.ZLK@)Vp')H\Ń躟~bɁbH[lΆ;
+m8䦸
+1}GDpHzٵ lǒ~]s_O|nb}(M~)Y5,ye<"?bv솭<WzxC`bwD3@XRKXnI̲Љ٧n0sѬ A󊴌+ _75qv- xHZ!ٶ3G.:uညe`Z!ǯO
+>\:,C,,/ƵF (WP4A# yp(vC
+}eÿTK)jO!jE
+0NE)"Tc('Û-U:\ r{<e>Cl5\!30O"% cȐ:-Y[z=#9`a(LT3ě^ov4~8K&̊qSb -X
+^joSµ;zMՎ` ".B;,^*+RfЩ:
+
+'TP>znŌJ,*ʼtR+%<gp-;
+j6*,䧽>ӱ-L)ZVЃj#נl
+Aw3I .Vz֑ [_羷3!ㄩ0R훒3$Yb I̒"(g0nLaa3~XAd0]+dPW| sa
+FT.KXMZC^ՏJ7B^ǐ<$<꣪l-YBՒVٖDoHY=;A
+BZ3nx)YC~>B^t(eO$uJmޢzѐ kOKzW{[
+5e.Oy_G1uEiNpsMю|h=.d$cu5[Khk,:O ն^)I!+S: a(YQb]1yKH>Rq 6$ )wH"sұ:k/Ib%<%q!&?ބ9 Wg{ٕd`ӆGH CW7*i|">Gʉ` Gl׾T5`yS T:MJqF>RĜЏ
+ZxkpWDGTڲ<Wv81{\ݲI-DwJ6V78p0G&4ohAk2 e}s[bbiwc1v$ʙ
+?qflUFE)Lf˫l>oHkJRxM5hQV-m2.wF\fLeIԚQEj6p6u JL]y3層
+RmŊ+u78׿sR^z09r-FB:q5-Gy&:ڳ^2X%/(+0X>Qͯ;.TS,yE~{ ƭu|%
+cn( uMBH"dd,@7gI~Wa "/˧fa1Ont_;S;..gQb-g̲(?ϴ(1GㅒiRl6٣IUN՝Zʯ;GS܏QJΨC׻9:uG]I3_``E‚TZ`=]P%5%+n?ԉq r@BFxlQ 0B1D4cBU wI i4)yyQa]-1oK d†Ft\d=Iݘt2ɬ:9sEw],պc# /wɁS=nf9-HKKZL%kqgq^QE Bp{߼wK}V_+A+#GHV˨ 5cE Y)W7x܁/E[[,b,1TGXŔ5bF'vu;AUb>NX7돂=3[܍^ќ܇`%jz[C4LFK:U:k
+ϜL8zW-8
+vJt87(A%<_z ! 1GGOFL ee,篃P<lXB0UHDq9mYӋk-JyGM/N`GC@OC<8X ,"`>HVQoMlنaT*Ȝhж0cdܶ4 8gu/GȻx:ToAxA&
+0e`$[jO~
+4-UREea ,i{#| p:E&nQ\"@CpHtoCd7o5}#P]OOdZJ&vdg LrUxxqV ɜ04tqUnZIJ>߀N6e(q " FwA/}9Y8zBEd2`"Az#R]w H+`^yN0u"EvZOC sSPQP|P!a;ᡰB%$!-T !B "lef=29<JQ)@ D38
+6ʐa<i1!.D[xSYG\uql[)f[$4S@: Q$$xk,+I`ìp\aWfG;r8AsSE3o-M9fEɝXe1`eL>"f =hx1tx@wP_=H!߀/輇QCY<<K Ff$UAWH:<V_qgT$*,H x?m64lfA2pQ%j8 q 7`V2Ff "}A}g0pv:#yG#anj0ٳׁ\/Υ ;#ʇx'.zGȈ`#,=+et8ځ֚ c`Y&qHV 'f\`qޅ0YڲߜQ=e. &sQH|@E
+r13L
+fF&TDK,)5)@񀐇L5У,E<P&K]NVtJ8W-'YoK]YSD^@ݮB/cN{}_m=Jς0Ps_@ aTٮ²5b߁8c,b^Xį0VE =ʈKAy"{80
+&$`%3udHRvvd6dld> 3"mE>H
+((|dP#?ʓX{>pHԊ0 dFjL" 8? L#sjd[|R~@֢ٓ X9mU0F:H!VQFV#:)ȉQ'U$J (eo9 ֈ
+L>ۜzD9ڴqi/.ͣ]d"oeyZ=P i*=lR-$4Tf~G Gk̢Ue+}Jcăx"AԳ%l؇Qzkئ=6A;e7[dv] Sv\V dc7a!֥TVd&Z8(ZBVN6=+z1D~bq 3Xu2nD} VpRyŶR906z<)~~PQV4ݷJ
+h$oahu*VɱDz'
+lx&E|,V_"H[^cys/Z2D9: D' Fa¨%]+v >Ѝj2<to G]dńDZ֣N Ex7"o-7`g~H4W_@~CoktͺbGp;BG 3YR46ݫXJ\-iie"5>}t[_2?H$-:-[٨0u\f<毺%(~S%T-߾Ϣ'ۘk;IOWrw$f>[SD? xIG;j죠4-m^w҄R@qLT;Ǟ$F`Q J g$:kI~c^D͵Y22JCa{4 hdp]"64/#.<ᦛkp]Ψ/%t%J
+pݦpBXĭ\xzh4ߓDD/ ,}ЕO*C%Ĵo︪1mA*Q.
+7 "HuT%\i(ń 6Ĭ}F^+߈ tרּ %-ptK*P-{=JѪ4J
+oL\oKK^=o>!Pߺë(fs4oqKO4ux|nm[QmhT;u ؃J4#UCM n9[})nz|?G 9*!SqYkQo[c{}Wc@1 Mp zmGix1}pM]B~;*)AJU»vNm( ۻ
+OXo[)S:{>=[7v(9 BjW#jKڗ"||PGwb0\v>
+`GZW0#0J
+y$Zѱ)u_00Sh2^~I:d*I xrlMC(S 2l[u@W(Y
+#:36TևT*}fyL]h֑t_XbSI $E ".ȾȽZzguF`Y/aʎW'EN iJ+d8A6m9#o _k.gpcTjZ;9_{Y/^@n-YR^V[k1HjuG<2;ǿņ`t
+ؗ5pWz37sBlT[ROExnXb󎕜;ړI#D(mc<vm] ag^5
+*+62IUUX`7 &:pBC&XqO?O#[%Nf%a 2زGޗY<%){Kp=jڲ޶sџyq"Jclѭqce S7,)¸@uRcpET0Htշuo~5@\Cɱv*{{~ SXW?jl48-a)a͑٥ƬOWš$ d @`T>r05=קJ.6?YOYo7Goz*b]=92-}X C@&~5oİ#,zSR}U{/*ܮ<V
+HK9OPwuER[oF^ Ii)ݮGD`У<%gw?>|R_.3ژ5u<꓿}ܐl<, 2rXihu]53ZyrRaFڜcfsjmǂd>{x!OgW|K
+H : ޫq#!|5r||[ 9GL6(Jd󨏟֌H^7#+Aiz?J"xyh<sH~z6w=*(9Gl:ųIQk^ Q)99e(g!N4ΈҭBjs#fyJea$DǺRKOC-x8bҶ!MhXY{-mCZ2~l:|b;kP:b>w-U>(h#EhU|ެJ۪$ E=Яg*РHSP:e|Ku |N1:qj˼7^j%,DdiF-fuxpM7/#cK'F1~PԱx])4D!1Pխ(BkuI=qڥ`hNg\XdpČ 1o_ 9eV;LrQ0-zw9sIYtoίW݀<{JRDcЙGF] yU05h,e0RI9*zÕ
+/t](.֪VA`In}!4.6+D3B}Q5-TDCP:oMJh467јZ/L$AH IֺH<NL)1)TbϩCg2$B1ƗAo(]sjk@WioPNfC7ż98% A۹ރI ";A :7 uCC&(hkc P>p%9J[_c
+䋴kNO. AN@1qJ9'ΐOΑ!PQmb!&)=XM4Q#%NLv~ j0_Is(8axz#z
+3 T~ D0^>GyAɟJ#](1A2q0Dk<~݂qW.P}ʈN6 2Fʄ t 9οI `CR`pYe6$Q"t аLy/ aѤ0) L(`³c1|.v65rщ:c
+KPK;0ĵ`tdԯO@XjG LJ1۞im\0+9rB59ōm+Hhc^9
+ d_x`:"H9\KC~ 祖ɫ4xZi%hAչr\60Dݿ3dc.$=;„u81.&/Ď/zw܄r͓4 o MmGSC9:^#(]Yֱbݟ\bHpth]ImK,Dv
+ M/Y~u&A_V*H8[R&Z⻈d
+4۰Q!فg`꼨waev)B3Rs Ad.&% 1^CX)CyS3zveQz:ԲI1 Oz69*zWXԔ7v2Onl<MvK
+Q8r՛ a.^ +#QJn+_JlqlUǑ20 f
+Z2E\զty:DU\GGb:'nxc鸞?,LBjpXy2SpE$'NaڐAJZQb05,Z;-T3)j7qL\};czr |$CֲK.y[NkTy$ON
+9^?Ţ
+8>>sdt`sZa΂7%g 5yen3Ojn֭E+eMVr|L͡&F@@!GN$e+
+\􌽟8Ȏ߬dK@/oQź3܆SY` 4!ǜ1upIPwNJ)?R7tT)ri
+nCA,/>C !)m=J^Fzu}k^nP:A7 3oݡTC#ا3D6?g
+bSGtN=ji~_. q3>_"~;,
+8[nd{8 Vx2%%xOv9CY!VUX0ȌV6CŒ-@|J&=䟁SQ193OlUp?cd3hlr)fqV<6E
+U3W4sa"]]a+f+`yIխwAM#<`euOKC!ρ}8* i%HRum`C P.Ss&M#Tڐ9Sc8$|scfB/A%4F g\ɠ[ O1}8+6KjN#WK BSyS
+lx3 6Wa-9m AeXbϩܲ7 Fh.<!A":%U)KqblQc jue[IJ]mt~u[ar1PC"\
+, >?)a!\ g&P9G"qFՇd`GcS'" a(3"ؤSvjW. RI:Mҵ-sB.W5J(`Z<qhؔ]/m&"ލ8!y#Q|CZ;R9"f.؛C Ǫ"(j/+bw[ϕ;mt6V95E(Z 1ǢȓȤd {8\o^oRb#HtQ˽%IN&16Q4
+-1;i=Ů4ќ*VoMɋQ=>_ZeeDSnEͽ,ƴCT71o 0t<LS&f1(a-sAɐ
+#upŮ
+HJKAK?K+ylpێd[hP uN0* f9,}a1&JDP6DzY:GbꉐQqEJ$䞮% )ѧmNb"69!=u*+*a}h΢eаuȥ"4WL1)w勼_05? VKLSmy\/[%kaXL0e܍ؑ%<5 :#tSG=k}
+&YNsEy@؄FKEQnyo.Qgv]Q枣K6ܽoQ/
+T. `wsezIEt[
+3PMw`^p09%'pcTCN0a b}#
+`K"!q?JYE=̖kÓ)C<fBo A`Ȭ:\.#'|m<<L8]LeSh\^$W=Q0e$jx#\y
+Ɔ$+)B+cB) ,p 0=l HY`[ /Գ_Xڰ#cʢ՝!h "#;c똪aǑiJoȊGzF@4.@h1V 2ulɼ+=\esK7hRST3ƕxDm.Ջ<Nfq.1$DAq^eY%Kb^׍q4OWiM`y"S@dwx.]"k1;8}!ĤMbv5P/
+p{<O(1v>H!{ӕWƆ>e/3K2bk1-։f*I"Y"a妱eL~(@2QWfν쾐@B[CE
+U3Hˀ?2HȒ~_pj\p)dt2yPPFU"N!iOk2
+y-zJpO#]<vW%Q3 ٧h],u!fG {=&E->og2\&TOk
+.
+Vr[fr# xC3$|Bh=H!z3U8WY9/_҈3a,Ca J0pj+j*ó~LglaS%xmFre1CG9/|Ƈ
+]
+}zq?c̊f)@24%GaAdHB1-77?*u@mZ(H CK|l{JyN`2
+<XC(/\07Pe
+߆ԳD<[JV'T{,f&b^6)Eqɀa\} N
+Toi%"@C!RGxSEҴ+]
+" "h`Q֮V`XnJ&y8
+;{|ŪDv8P|_r?7Ba ḧC%DJ`<AV&";x7Zh%/<M
+s,0ɨ3e%;Xv|xXj
+HB(5y'3hzxׅ-xq^^wpd5K/Q&>^Xm
+E$pA9ZKGE (zpTr$8!e'^OO
+f^MOPIk5/VV!Mi<8O-+-dꮀjH'1@+ڴC
+ 0JrIc
+H`7.<?}RJz+)Ͻ'1l<M'? *ꈨ+捺Z S.uR 8 Z d( '1-
+
+>w zNz*Xt|kNdYs suFFvC&U;uzCi58h<AfQ<SLS ]=vt<{Yj&K"GpQxM*aI|"-~ #!1VDL芁<Fd7kn6RЃWg^7&g]yhv>"'9a3X q-H)c- (@sX,q")X'B
+IZ3+ {;:iv/z kJ7A0+TD IǠoBPM+ PA,|}Gm
+ Oe@;J9}VL.īYEuE|哾{p<'
+ZE#S) a,aRS!| V`$]I%9, UD~ mM߄07EPT)I
+S郠k3rps_)MO/&=SZLS!W)}^EaGA1":GMA4o?e8fB2e']lkxvJ<NG_F V,6E'֗
+Ai2T]=& ÚupKEI
+$|;J
+,~T=>4blxzU#=8L<FBGKIA5
+\2J8U o\:*eG @6)C(%c1xy2(PKͥv<{l
+KpH Ճd9}tDV1,mg3$;%ar|}ՖPkPڱ'(F/Iڎ|t- S-$mUQpR6 B((*DS`}&'p<kDžm
+-
+6( BXU#gxz@N-@zI }g'&a+5{@qȅiGAnSv܌ WcҎ܏303jAo6Pt&\?4v
+Rܝ{!m
+RH5!Uߨ#VV=0h"yacx)QЅy+-7c&n % 8T)hkҋ%q-m
+]A 91$t-1Ma5l*#vep$\ΎZIKvh ¸ [f8[b-P&l$/e-
+|]ۑP!k|_9P)Ҝ|o`ɰ,;qf@_C֧*I3pI dAE <a4r]=ʲ8† ƥPҕeg> ʃtLZKsRb|H1 8[7׾~z2&]Yu F~uDH\{rҷ_Qн#9
++_O`𱗂.%D6H lĘA~((,J ?"DPʂ%zbʮ3 ;ϩEQ2o9m"
+A0Py+Bp kQ+ƺ$$εԂ_<z_<"}aaZNS`қƹ'Xp) @?G1F`n̚r$s_Cg)|~YJҞ+bK;1"Hƫϳw;Dt~P̥&E,
+QqB)@WϬJ(܅{o~Seۓ؟X )XV9
+Zt}2)jl.>:͎᤽x𸲡OO,ne"0 ȥ%Ϧ %\;Fr0H:Ǿ6Šwi<<K1z3m1J waR%aʃP/3 ǭfN8jr.Y"# Eb Qc3פ%įe[cR=rjj}v&JTĆDBX˚D&ȳɎܒbRλ(*p0?]p&_b^$Y8edKw
+e;0OǧDOPʄɔ\XA.l蚽bLK(ej gE@g=>Y X~eLED.A6d[zse9wwάG:VԞ " =+[
+DY2QŹUwgfzK'164P9?~a
+FE9)l cC&E?ʜUv <GLճ)Z̻M_Rͻމ pc;T s _vU뎧8}q+0_\#+:+Pɮ<Ԙ-5>y"\Zh=vWܳc1q ^3Џ!
+vC#HعUO@<!/GHǴt5%_ 5ߞ MB<d%Dgg--}471[]b w]"n7W%}
+RL >gΖ+°3\,P+fg\1)AQ
+ lkg#!)f<KɺTR7>YԔVGZAăX Ā!<Ks<ߥ]mR
+-vPCsL
+YY,
+w8}$57\@Per'o^ҠE+VvW-_W*Љ =R
+8zGpfL
+2!/+Q|xВO2_QK ;<c1y~J$mau "h\+˖.&pF .XXVtW}wm:e%]
+UA5iv Lodq 8vxdmٷf^(9 b+~
+6bއE$X+
+q|? H :y+"r<$KmF8.(ck|tv'゜n5QHnt(a.Gҏ,T"QꭙS>M
+uݚf}JUY8 ,1.z0T
+S
+KuKDR fȳ'"Ƅ?E/B'JT$mfG@D\A [O]*1 f8@# l|S=ZW=,
+s
+΅q&L;\_L!䮱v?Y
+v17!EVB6vS!⏕}0 E
+eI`*ՙY3~[u)Y 9F;%WDs
+!U 5(ꔐŊl:i1ցϝꤸtͼMȟ}WOolHu3H9>ΙMȓI<hGI?Qj3)I-P-iW-c\P, Kv}ѳp~z̄EkKsS/49i}_ 5Ϛߥrek O`Yϊ: 'X=b#[VQ?˃TW0f{
+4ms<Mk 0Ȟ幾꣆S/< pBE]<uYx^ ;>3Ϣg ^SJh0+PěQ)ox1C
+ǖM{4lҼ% gF><E$Sʌc~}H{5.YM`PȼJ$.L؍8[Kj@%\?
+@ 7|$PN1P)?m ĩ=ܙ G3Q$BzsDS$qKՕIi r(_㯨m:{1CG'ct݂3`D59ŭ}j H{xĹzK]<zNDæ062>Y@XENEZ<V˪ƈ):kC8v"\2 l-NXfg]5-0q;\f+f&@gh*GEoi+Qoś'J(GVkrp7ؖ YeM\ls]z oHV]4\A41#:a1|P&Xjp京8.o ^yz4҉"1.DOk4^5}o0gJqOcwZ0"ċco3,R֣2˘RۢPO1|AZ&U|:
+3LSz8:?Ub~4 OI_VpΏWcoWߛVbz*y%G䒮C1!79 Ԉg_*Y7H]:Lj{֧Z-e1b&O
+ɠ盢"p2سH[ Sto%p
+tOzWPwuвCCW&ބM(ɗxTeHNꝿVO)딠!lgmnC:cUjmtl/w$;{-E?]xMs?YX7!Jh+3>a]
+?4"<߿0t#>Z˧0%R_~+x#͙`yq
+ODSc^Rx0]R=gTQE:X7X%vG:Q}`nvS~p2tO
+[Ip.ﮌtPx$ľ<]b
+4Bd /_]*V/o_(& θP!D~:G%M()8 #72V(=IZe{s2azT[VUy-Y=V6\zm ^֜h~+ :"G&› HJV55jmR6[o04ݲG(0{d|pec8# h“YtW3 h+ԭxbC,\E^<sn#i$ HN)*)7WD@$z0 ]eK_\J=E2qkh/?VR
+vov+7Yo3"x"?ˏaIk&9b/ӟE7
+v?b_WLEjTy|Ox/DYߢ"ܶ{AoJ,R~anNd
+s_/'ɤ1W@OgU:gΤrbƺ,juĸiޥHCKJ#7vDu8*mR~?(0M~E\:w2YuJ1.e#hAȐf(_EQN6g(G=c*EHjtaF~2)P^v^h5g*|<?*n::p?FD!=1C VvWw`^^)&@J sx!`m| Mq2uǃqlؘ5lsSޤ1|FKb2Z`Q價2/}lHg{ɒb4Q9䄿QQ9fFoʗB,Td;< lk}uN1zĈU\u;4Hki
+[$;8B2`ko !4  QRELM ˔X8G&`d88xaO3J d}Pj`$NJ9(Uʩrq]ie?ױ%8qPibN'}e%5}0+a|[VRWA\H%OTfb-ʰH;8y
+eI#v50^|I
+;A/JD%xfbV bS1Q",8ߑȭB2f%ۜ2,̤ aymHk2'WoJp KNËV&SxWlU`Űͭ\.6bٲ '9<!; eQH=ׄRRFp3'SqJOR*HN|j_4H4#d+AX(fD<9@x((TVGRbGhBۛԐ\iY,#f,
+X=8siZOK#\0;oACDSafPلfJ+kȺx uZ >F5J;M ZH}~#!\gЙ,?YD:Q/oNY,ΟzIYQ[gTx^G `6)>ȸ)A#Gr_)g)yL#C)ônƚ5a;|lL|DS4qluwdE ئko]Xtd V_٦wDSonDxYQ"S{Jm6
+9Ǥ1L] VLQ*[Z{ۚY<it=HKԋB$$t c\
+#r%[ƑCRqQ,*|~9ͷl{ħEejgV펄ȀȰG{|
+!1>#S
+Fx-;9< by]rGҷ@wf:)A|ܯ@wp;UJwSFI'G
+(G+Ba;ɾ̸x0&UU}
+z%/ BKvܺz!"L\-e!JFHSD4qg..5u~85DQ{<pωVPjQBj1vIHfT(+.^3$h ,;eSY !AۘDJ@m.7WjvYhxS/fK^!0}QW
+e F8+@-f
+M/5`k( 7BHiʡ(C
+2y>w0,
+ґ2 zFX|LyAMɢE
+8-3\"/9Ť "@y4K"gSMqR VH!GHʄϵҘ&LRPΐ@u9D()LveEoFZcSRtA#'t­:_ %TwPLoY2~|Տ=e9pYTDa-^ݎ oYaEGaXl4k0 D*2!vՉ .#j2$f *Ț}c#B* mY du2+i:,)UjOtF)zD6+C:BG!*'K>TGCCi fsp2 $ F/(z(x0;F}3\}n}bWfZbAr4ԉŰdW bq
+b2Rê Du
+HAnO;A)-s(a8jI$?SEͫ?E]m<AJ{^K,|A&e(2zU Gk7ųX[ -Q6p^mX-e^UCj/Wx\E<>UaSyi4!f9AjE+%Lsxj㳢.ut&bj_LPb^J$Lսx 8
+[KJjpP0/?ڃwCF./HSJ1ljb@z„box{U> > I9N(BxŎQM=
+"16h$u2-FFdOL@d%fD 025S(9Y
+oA$9?B9v6b^ 2²"u}qԈc(E5(
+oV}7! (F6ϡ~$P:Em4vu_Ҝ7L2{(
+TT{SP 7
+Ʀ 0Pc=/՞jeq4ޜSȜ(@U82!ӊ[+>e@&i:b7! bRԀ"U4gmA :G4ݞw: dn+N4@d5_6xȑ]ʺD<WQU2uǩ~{%}d5 0`=`ѽ
+GCT*gYz CKU7y{_SØGbi&*Qّ\rXJ)s1SrvΝ9לxddjKhs?:E@~6rAFӨN9wɛrrIwsmKʄ$-|ya\Gͣ"߀pt b"5. ґۘm;2.PiEN9Ɯwo@)7)
+YJ=;<f%* r(~=(q֥=V1X,쬏CH4v(Hۊ DZ΍>-Ȋ_BJqFm~2]NS&D(ӏ$-Ô ir\-gTOVNagf
+0wjƏ}KGh~\H:P* X.A_#Eu-d ­0%j!"5ƛj&<QkGo
+Bz)`XS&ݛ*iS
+ߜ#Rێ)Ӗoiep~N}fcO7=zkzcTWw r|Zݽs9CT5FKmt.A~Y
+RzqHҋ$oDf!()h&NP? ,)J*Ӣ#MRHη,_YB]K'399MiD^ ʠd&f;9SIoϫ٢AHg2;%.c$Bs󘴨BxN$ Kzzr2@"s@t7b /U[S nJ"*l #
+m'y6;
+*a|dr *
+,}/AOC:gn+&Ir$DOw 0ֲo-ye]bLH9d >qsR⨻(,ZXYLt`X颼3P0́~8 wartəAFAuF#p0lY \RPMIs`Ťb~Ĥ( d<EubyWPڥ}"ee=LӇpv8f13Tp朇'J;d F|0 &@66l0ޯkŘ8BvpsĻ{BZ1 d!?_ES+(#b /#'XE6OPםwzGEMl#
+1_X6X5>TL{֧_K
+F~1~˩R'maܿKM
+_ MU=b`E[,]P YpZAE6;e;2#J2|UdBu# yx`m^YF
+0
+D˾t-Ja0;@C>(^Du.xh+oN0U\FOe$]<t ;$M l?v Bht75?d Jrv"bh=PПP)>Z@cY;dj%J plYWe {!
+$K KfS *>v[o<H_H]Q~󹯍7A L?_H<LЗ/ BBw нBX%bnanxg!HDʭF_.2z1^$B>Fc}9dd`htWGiLpiU4eܚ$=g"MKQD 26*D).j;N4㓐tWADqsH۟-ɳ
+::d 6W6OQ ?;ߪ{mҔINV j܈F#,S1+ wbGR&[ϚOn!7dR}Fz5Sy9==.603Y/{2\q)~ڞnzA{P !%"p vC<l|CMY7ZT4"b<]Ef?p`IY$?3;,: 90/ݑz{2C#a!3g{@8M{w3aΙ:eWs9xw0H<~ĸ
+%"+̨JaPd!j79~ Nsm8BXxs*t5s*yhM] 7S!TG*t<)C ARjM; pTSr
+Q0T<b:TN9:k4"pFm >]tM*g|
+U
+E6|
+e T89 f+¦r|K*Ԑ 5 ?Սȟc:X~i9
+dbo\7l =2#f
+?C^%hY^$>ܫṼY(DWQ )AsޜT0
+h{y79 2Or遊`sy x]k!IjK@'ԉo?߄h<H96p% >F\/w0# !̸l.|ʶ`Oz(k|ɂ6Xi@&r nBtbVIs8O)oJXɁ`AɋIuT(j_R"MzQD骂bó{˲U6"5p)ƧcxDjz$H^,b'ȓ2Te vtȫȭ V7-\sj-׹q>:8~xir
+^V1&"7
+6 m
+sCh e׈c*!E,%(
+,o߈A``b #2UpsJ_ vclBS\rUVgg 0U&nҰE :}I(v•X-2#r0k iGr)\Frw3\uJż#¨@XGo/FFd BrNEg nQmi3 |%phv&j?9Iorx],;E! q6"/ >DŻf}(a  r=.vMGbQ^ݧ{8 <=( ǽS(C
+}78ؔ9??X&},mH1q51OٰFHm7PL 1dZT/ă8o|Vl,e "܋ \=uΕ'.-2փcM(Ucg\ۚ Q%j32ۯw;
+*=%qu*و)+(̂_t;tD1Z\TyKkexi^{AC]4,֩n qIvk~plg޳ B'MY E2m.I Fv%TEyC.4'"Nw3QYIZ|- c'l?C}9Y;
+}%dͪa_nt5DQ;,kO8/L
+.i5oJ=vd }9bhᐢ^1gd E\ $綋VȞkke,(
+5-S~,<2= S>HY/hpƱficW $pbPqUG Iq}*gl0".Y
+L)ZǧImĤ+|e|3XprT]%\NJ!
+U
+-aY)e&5('?hG:I*!#RV4r.)_Ӡ\qmڈʪ,-!a˱7da3ϭ&2T"rj/JI Gf>v;+)|s͕W$K4hmmK
+yWO> R덧fCK9֥籝S<+?fv^G{3u̠('NlևLd+i\GԄct:qSqwX4E'Z-춽8\6"TJr89J.2õpI#*D\m)1X+:ꚤ8g_nbwb'Aر%{+ u"1O?eí(b$ߎTh_)m~{SɧVE,2}/88.|q'4dm(2NlWN=N=w3nv4jt< |Piߘk䎽_)Ҧ"(١DZFJG]^t'-=ߖ\"˔𭁚GcNhEl5&,F%\Hr2*QQ9#mU (Wf*0JMrxZP* ubVfuXQP|PKj᫤/ppteAΡķ⹱p^f`B֕va{&GEJ()ZӉx8)QɃ?NELbƇL1gkM&$%DJ|T=^s~UnM(Elᾚ)Nѐ2lHv:˸NƃVXswlP&zʸx񇢪asIƇ-^
+iУT t-f#aN2M gKnp'R,p0\Q"\6|=[Cً45QV]:s1E2ӯ
+ ĨGKӄBdc؃~܏~iyej6Bj\"pW:5'z= haڀ6HQ˵d+-1/ؤe-9&]X"DUʯhteGsyCe%bl9*񮆅rHj|Du~a7̚
+W|_
+z5*Qmu;O$?So7cH@8m"Cu(uƀMu9SsgnL4ב GE OE/8>YUX-5X
+T"kg=[~LtkX;G@uoaX¸Ujz8—!HhL9sͿ t|ۢ_
+FƉ8LXd`Xۉ0!ƥ?ePy<xLrtҴAu0H-l;P^PAր¾sX[3d?
+͢2~5*.<ϥ&.:1ZN칀<O?QDZHQKLzd/ l,$pܭ-6],bH1ڝ'snr&/X\R_1꽴UnRsk/;u;WǴLm NLK2Jª@+:{Ji/s
+RD׍;8}U;+lk**AَPi,
+24n?/
+ F ai"[XJŬiV) rǞu;Tsda#2v?</*Ƈ|6zq[߸r\4aqonr
+-oDYrn$tX)WX"78~)k(*m5kA8xH/Bf(a"6ZM#8[<INGJ1{ ~ɏRP2:un=O8Xk$B̆O0a5$| dxrt 1zQX\~U!HF|S osBN  a]Z>9%%NIPdL֓{cFx 8BxdV{ΩSRʈCc}%knP/hWϵQefvV2jVavۧNݞ;%د^WrدH ЌtYVBcӤfEo"Rkw\Eɘ]q9Dg'.D3+igZ7 0A
+2L`vF0pBِ__ВO䭠UעǺƉ.ܒcjVK"`-e>dђw=ku&tÖJKqaZK.N aApUi)VfTzuKgVdώEWIpc8eB]u,T5A2@])a"dSCS:I,`"mPZ̓᭯Gk!KJ%c
+W(`C>,.9"v
+J
+#tqX}JcCv&O
+>;R¨FgҖ'[dmu椽MY"YFT!bǴT #D7o'@c*UsPJJntbY?%aEȴ+Y3ʡN޵ {‘<OWBFA}JWua%K>滮a?A(PCRo^㬏4eQt
+hMY-SdlYϒ "/KhcQ$^1UNAFqH3ΛP1O{fQ(@kP?ιTMJ,tqIe SrmϤ>"9Odc-t
+s)PXtTvn?~]c9ٯH/7ۓ-Lg[бn>K\מhw(u{Qb"#jXSjC"WQ#t5(&šY,>=Bb}Ak>Oyͯ>H;+xCXoy_ZqV8Ҳd`rk(re D`v3FBqp`‥lW߀0P7DxكW`8=.2M?ߡ(O#4v"?wt|3D5ֿ_zM 1Ip՟)a3^CA`a\Gq(x3@ᇫ WqX[˄>J|xS\<:qY <&OJҘu}jOjC6x?fQ5<0cEQ$
++yWLg10&J2ӷkx\>l 7S`D܎拃zZuwͪ`cPҦ\z ^?h9^f7o߳7-~vxXiRk
+:^~Q
+x6.b|庅
+WPqBC,Xr9eMtGeUJbzROmdJB%]Ej?ZrZ [Nc%Q[Wt#QGx}AcT=pKԘYssSCY⪺{mL&H.F 9nhii/]Ῠs
+GDSxU)O[QwJ[|m0ӿ)N# -ݪ=e%Z
+x %#s,sҟ3
+EyxL Iù5x7>5T<37fgT~pq[\rAQη"Q|Q໩NwL Mmb}c%"HQT.~mNd]n*Z%q{׸QH{{dâ Fe|E+&S=r n)p h qݴ/+[P搈j w<p:đos|v 6ZzoB`wK3&bfʦ~
+BP1GNXزQxf^ "4?3װ-mDq8ln1/!-;az9)m:Ѱg\@0d &={/dePҶ…u2>gX FkoHrg<d%ٞӾdNtrOielP˘ϡG^Gì5g틡A8'1&<׌3'մmW+fhXMc?Lf ڨaN1hw{1xE38mFoGBg8|75*QR96uP;Bm'd]9;Mඩ>Zi":C(^9aGFE4"z4wK%ݖoa'k[ms2QI<(y/Yw 3Kn7SKh<@1
+BEYƴly`D{TP,}ĪoJYyt_[+yⓧ
+T(xÆƨ@EM50@Jp{#\%K$S?Zc+`GǏ*Ÿ"園4ET-I_6H{ X%>PHyA|fhmV>-F Xl}YDzͣ,IX5,ÊOj_zᬓz\_z^&D\3Nz}T<؃Գ9)jŨȠXɗJ<Gzx|psq^n󺀃W.r>a~{CZGyoI<]=nˀYZNڮ\9(z%Es_wBvEQy!sK֪0O;+Všg{ {
+<mI̒GyP[B8+ZۜH+ sE%>E<S2>戓^jeQ*:)x 21z:(CT
+mh>f|ǒ3q7æoíKw
+y3y_a9jl{KeίM3$I V"LpJ878%QKh%z:!4un9 a|(n;EV@dW
+ {;@}YZnKAjqz&Ki8h6;&n_Fl:|ai7me:琮EZAr٦z_obaM=EfF3bpxOyُ7NDde!0e'Edx۱$m"4w*5HwElcdEQ(M ~'Z5PL:(9?_€e@/P'<&MT 喴2)RB:ozgp{)aJNTlvT$`bxS{^H9Hv =gk
+j-,B,1'˅$=-IE^Bn٥y, 0\i\\33K|vdm'9f_="+FY~~z}
+KNUY'40cRnG}Jt5%躝@WGX<1g8KT6{`?~;p}Mkm}hңe2\Hwٹ={),Kn"g n[A+u2830*0,2lNjsw?2-FEo0D4Vӌb"/lXkJ_uyLE(- }YSr]#33v=bl@ gE_-Ӛm(җDYy,-Ǥ]D+&lF<p4X..OCX1JN::xy3礤{bM<9O؍Xg[,(JXbklJ/WZP?{NaᏄ}!9Utk٦b8R.LzG݃GMQDhE뼫^|eF'n9m PvM$^p g/10(CEh}:p
+V] "n%S(ṶwS-^ֽ;ǹ .)&0N:mfE"X++U~HJ$NVS)%$zsp j!TWޗlO`M'ӾPa*iҖĒ'ɇV!xeĦk*! t넼
+LϺ2F195~Dy%K)O
+C\L>4%jZ<̊>y/l㱋^R kH1kO{c)mHϟ4KPPFsT+ >.A/Nf<BX\QP'<jsh?W ӖA<wOXFjk5#eu h~!'+۳r0H&EN{^pn #oSEGݶ?Hiuc]ps\9<l tE lS4S)~gm=,^暒)-wNGQk2[m:.e
+
+`_+ԜAXp8WAvupQ0
++\us$f6?qJ$
+\$ЬƸځaK|e!v_ZϿ0ڱQhSgnpd0BJ ;_iDE NnΟgc/qwv
+M0b$~U '|ؼbLo Ϥ_2)/8r$a֪%om8 GjՔ%~\u\ !楅9s&dx%C} BL |^4I kq`)\p1x's)M3>y>86䐒b5L=N$)쳈K¨ dZE~=/+i`8*M]T vfPv{IiN4hV6_L&.c9z"N>pwq
+/O N t;(C.jCm6`v]]M'{/1:RJ{`2ݎCЧBQ-]ڄ/!
+'T,#Ü>#EQBM{'ĸdMhfu9ہTb\jkNKwK*.1MŎ'\ȀRC*Ypa(I{\mj %P),{/1A?)
+3K6*BNW"oBcxSp xx3ɘռ4
+u.kMC9iBv5(ҘjHV(oXZ*Gf4Z3s*! 11qWo
+hE#(A=84Hp {,zEɣst5&
+r:"=!G/ ڥȟsDLxhђh/D`Ԟb )QWWfJ!H0 kzqr&Ix+} <-l?.ycsぜVD*&-u'LTIZqCGq%YUhg!zp"<c006L@u!"r#ߗDp {؈!d<9ƚ壧O,;lžI~N,'ɬ7ц-k򺏄J?H>S;Xcא0+;/q5B[<)E.V1T" jA+@IQ
+,ȴ`W'<j ,s@Ps*jPCP\nz7<$)Gh{1RÓeFZ?U:%d _bA<Y6% gdu&ːTwM72' D=, RsּG:sQaVzܠmTU74dV
+APdK ң9gb,CNrɊ >0U<A:oEo)"c)%UUYMv!$('jl& uwbBqnTO/FWA,l:r SUCF<Lj-̱,F8Ɔg3ye8b-\+#]%ߒٟ#1bK=rNVf.U|}4<ܟ*Jw@q0#K(H
+֙ hZ:T6<T+1-b#c!RwmK9U׻X=~%ȫ _LC@X$>46\FGQ-^uZN>5YдQxH`˹0Xc`ψXc(\ SZes]Ah>3a)Z[I.
+Gov8*R-w/p?blPy2q|2߀x)3$* "SE7 $Qj< }h:j9]FU $I<Kj|핿Dj-t5sʷ8bt͛.kQ†/ <,#" ^($B&FUs_ ᆩ_
+븒5/^͞5cl Tnj
+ۈJ)U
+ɣx˛
+W%y
+:N.<tˏ8o\bt ᔸLBuMoW~2Y <Yus2Ԗh:̈́CE'SPPM9yh/Iۿ|pYD,$ɧC6|]*[Ug#q!2y-,ݛ t9VN'5%Q
+CZXg%k!
+ 9 y/8bF}UJ_>v1% 7|%qa#96&t]N9m*4 ݂\j.0PYI
+6a& F4Q<k)kC⒊}C[+.bkndhcYَPQXuca.v8|
+er̄T0Ep2ka8qnaТJ:`
+:J/.".okUOr_ԆTWK4;{Qe$Dd HM_ Ŕj݂3~ 4A}%c]Y|!=KĀ@_+L(_$r.&HԱn7JB
+ױwi
+g4? 鍮ᩱzd(-(6rnE.9:6d6| YԀ
+1$)Yت{ASkHqɆ /$CbYmO3u&Oȓ\ jybb)*B,=<H^";}YȗBp6/yF-I=76n>yS֒5>sj%g'GZzs.[L/fKq8I*R Xxva8 М!S`]Iham }Q䤌kg;y*r8[ɹ9m/A!*jd~QR5)}g 1nEWdKϨΓ\0
+ړ 1`x8))DEؽ/BaQ'
+C>QCZ DŽ\ Ճ-]*0)`"dJ`xu֞ð
+0
+HAd DOPw
+I@x^! ?Qy\5D. IGkPfe4ܶ.P-+o]iJ$yrt[P$~gx͡r/TA| ,dhQ_ $2.u&
+7ٍib2Xɔ1t̘|LHj4c,
+6|# O킂Ȇ4Hg IoW˶ߚygT~r3L7e}Bȱt~h,EQi ɛM4U}ȷ='
+-Vr TʨxδЖA|aYXf4m
+ >ۺ #KaNg HQ3_!Ý z۠ja!Q
+Wu6BtVYi3NQ-?>rXjB2aZYj:LwH !i l'GXW8]T۾1
+0Lt Z C+`acb@_P{i;XXCGI%{DT_<]6;P!8SZXLq
+GIUؑ*6l OxX8~n2і=PZ.[e1Sؤ!t#S_ f!?}gta?ϞW 3䲠׳e4;~~/oaX aPL7h.8AT! ѓ4H,Y1i|E*S).hi&|"/ӻba/R )a<*|]iZQBڦޙxV@uC5b/Dɀ3 h]E$2j[/m%I$!mJDU`:IP;8.,@1YjI;6KWtIMV«@^
+6FbҏYR3 W BCu,LǁӚ54B7:(Zr0`r("M%\ơDGIZejXsC1e@m@C<0|.މ6IAn븲51rbAQ+x
+ׯܧUR8MD?:u}M
+@AS(8a YHy$.Y+i}~r4fn1!*R* {b[fn|b}'oȗ !lJGsLNw>JB lNAp8'Ho|0y^2|8BDCew2F"i(M +?)&-]z`qoa1M٧|qR"5gzƥ) 4! Jq
+
+&!Cz(b|<'fI
+3@N+(E6z sbhWXɅ&[+"
+Ex ;ruz;?Ö8_D* ^2KOUк : Gxd<4'uo2zǠKk#1N\'G ۣ(iJGQHMqh1%D(4ku;?qs~G]`HEWb.WSuTzq,;F<0c_3@"?xVUt=R;Mj]U$ߐ7NB̵~(`SUeAy;5sI̘%PC/gA<S\G^\"Ԟ]/RD988[ Fs5VY&e>E!{ƛmB^*M#%8P(uPVi:e;0{ 
+^D?xW)JȤXe” % EQSӍXR^vv:0ֻI2oyfݽBE=諆'uF
+cx2`Yaf}=9HM)=|Vâ
+NVl|ѮdL9 xAêFgZ@{x]Rư_.cEzAX2,6 bŅPP`fD_ݎ߀+,駌,:`wٓ@1$ǵJ6 Ta~\L7x"Bţćq(q (1;
+vm>V*T =eSK`4* KPMZ5QKD6(v;hVQ @\9/(%ey(㤫\IRS]J+ޭzN5!GQu%(8ƭ0h^$NMM7&6ԌO GU˨<=TE^!)-<,fqBXnHFp.EeCXII_s6ȱԴmAKϖ$_LV 0 4/%e߆w@>`qi6,\! S(,s TfMEw+:*[z(VBto^//lƼʤiyr`Eb&KaE^*3$;^ʇ<bۮ?>~a0fn < ')ijprQ;؁YQwLߩE(b
+?](VUt8'2w?ua՞%AHv%ZlTzAm6^+6ա:铟Nère( SĸWAwh_#mwVp'$չDٜb +>e9A|
+mYym9nw*:#w 
+Q_S2 YG5ydMi"D!|*>XE*&xL.U
+@3+Hd |rM>A7F#p
+bK0s`ABU$
+it.0h
+HTA(mfcJD{n7;nV ,-% Q%h|)s PXH][ŤDNA 1@J
+9-.%;>տ̍IdEW=
+qywQӬO}.E'߀a$ { A-+
+Ҭ?i3Ro+&_qv[^$E+ X'GbFPy)Z EsƯ"3^!PZ&4!>b]J~Qy]gXtb6E0 07EZN*I*_"(΢)bi%qe`@jji
+h YށZTJj"#sfA^*6f*.;#K
+jJPVDEdUd{?'dbB0۰JL"ؗy+Qn8@ʪFMKrTS{]%}tX1V.JgAHJJ;&%ۃ2.F%%52+V\
+x#Ө>4Aࠗ- \>˧ZX 9{D%/yK3䀢U@hF q`Q8<Ro T=w־nCulb|p=,/C6MON{^-3yN- /Q f.8JU3pzVhTcjk`(nƺ5uO.F`733?6yI)
+MQZ_݊NA~MEn}~P`b=]S xU EbkQj$7Ȋ.sXbi(Zp K*ӿP|1HN)&  W^nEYPmXdpx@!w!8m _{ë:&%ķ5dط*&'"Js}e(X
+E t?ň/(lbJ|;RQ=K*#}6
+ X)xZ$D-*\%ĵğ!ԝ"=GG@X0ifЩD[VtPwFQ@twؔB($Mup'?·j!C2ɗh'!Y`jCOp>9b*UA4 [ ة>A'47锴xD4L!5;q7$JƫϬ~гġ̱OY*{R X<L %Ye'lNы dME>ZvEv" bu9)n@UCMaD^+Xw؄`VBD|?;v1a5A _lvB(0
+1ւqzz~^ .eM>MPxY(YTjf9Pp`kkuA8nd|+Y'hTj{Vw0'(}>WDAtGI0QAǒ~f { WEZ~㵄Ń`"GE`-G _ *6S1,!uԬcj_y33\x¦~Ft*q_5|q- %R4
+ZJǒ306P A'~
+0.8.E߫=,|L; w8%)qF^gO«O*9R<0qfޜc[kRSfX' !gpb< }C <5sIABZpQYkO'jn%Ӈ7*;漀AjdcW$w3_{+N]JsH
+*zU32L}F BlWO@kx }-#I2k QsmN\^u"ΉǷY(3߯$@Dq?^Le7 UIPfPE=٦`EG/\$Gbq>x5~ELjo?b~KNn2I3ׁ t@yXk[|V* 'D Iھ/(\)=)E󘽪IE II)tv+;HU^B0>XYQl҅NIWW{+YP8-yW\ 2PX,]R~,S!"HFn4&_/E<"EO%^zv=D/* yf(pvK,
+@TEhe*]ة" s>4etңS&k,e$(J=T.$ĐϷ%u}Lyd ZIzQ؃?"!3)hPz7+ xTʢ^ a@h埒yDз}͓dYN;ܬ)on: O?ҕ6[BkIExwBfIx\]hlSFƏ;e%{0 &8(ӥ+Ը%ņ*_70SZf@!5i
+!ɜOAs,xmg;`:JLd)SBOintvdr_rE^Nog`K__9lj C wfLCZZ nrOg ^D?S_sT bqVݾahMmK#e:_sHh7e_Bc`J4-/+]8%ɾ<ȋv\NlY1If'<zˋЂJ>OR"ՁG}TƌcGÕ^iRc
+@D qrP٥.fDlၸ%s:cĚyC ;ĎL%q)˴M)ĒR\I$\=ukk2"Yz$g90XIdW&؝̗ (P7=6wr[>咣k6n<TZ/<k DU^#<vłACZOX~ÄwҪ|ڃ"_hkE";6t%P C|0| Q9mg
+2*èJZPu&✮2bHx=k@X+8.< ~(㮽>( @ed h(Tሒ]uJ
+*N҃S*j
+d,=;="vu-˽ R !+UKq`,Qj?o 7zdZ{ 3N{ A+(Rɀ.b%]KHJURVN6Z[o7FVؤ
+ml쐗 Y{4EɆy1ʚ?XD<E<0RG{v$C6GOb0_׮|:acx)棐(nS K)3]191^k C,$Ð[1/,olAuA$E#^H:GOgmqO8ųˍS)>UIB\`Buǐa5^3c:KIb
+iO E ܷt;#
+B{EU֯߿ s|V>
+WkƵ}񱕰Z'ߑmX[I3ǟb`GóF~)[ӊ
+Hi da4K^g&j51$H
+t|
+Ipv`6,Kv5[rUf;jȟQV1דD,w FF5_ɰj1!1iAܰ8BTJG$dh;R)\1iӇ1+0wƏp zގeZe;_aFEMqi,,'{.H[HC+/ouŵc.ʠ+~Cu\`#zFqF$0Ȗ@s̩]8|@ӭ__bx0 y\վ_W
+NI^1T0$(5B-27BdIdҭu+-M`9_d5wm Uuy(%` ")$xoÏ@Vr
+?/;b(+[aҨ}+zqz *a8+RQDc8<@4+V!vԭw9os?Q8K p:SM<FZN}^@ 7meH_Q|"y Ν5$\gt
+5xPF$
+[m}Vp y/ <L!e2ab Ӳ2^/˫;q1us @س%$e)(bb6"]Qo!k>$Z%N\ٙA/hxFzP}TV Zn=F mH{ fJQܲ()t5=,i DQLY3?wΥna],m
+#u۩+fȧ{3g~'rQ֩q{MA蟘53.t& ngp׌}%PZZD=;C
+Ů֝?=D3&HAd{kB9&5Y[OM7ЯPviQ
+h3VEƧS6]e !^ǯ`5]U 35]>!=w)(yN}) |'h;0ߡ
+/Xݦ0<e4¥8;>Sң${үhh(6<*d)RgՉ<Wee*d2ND#ͻ,B+[~[+_b
+WdJ)xV &\Rl'AHĉ57Ȋಔb:Sj(iyljp#Ɠn=Cr
+@HpĦYZt1P L|lx_QƆ䭓҇ԞC{<!O3€`ȹXʚ$aURb`SxCЎ'ț(nYAp͹)Гa*E G2
+X㾍SWLD?P~L%Td>%$ж@T^A&k~bC#/@; D~
+L7$g-eX:i\j_}k`5JB@kH.iai8B6#*\FhXQ &?}|:UIס,ɨ$e0R
+cN-zI#4!7#@ s>:
+3|֒)->X<߭i6RtG##eN?r<S88J|U9Z~~6
+:7G^&$FNSﴖA2R%Z}vgEڐJEwmYbeD̺ /Z:]yY]L&@eMKf4<~ _I6҉tzSZTyM}2. E{D˷etv՞į\_b({ypfƢ;bA
+1My%Pܲ?iyXQ g\ӵ –^-:Niɜ PX[t|dʷhyh7Rb
+)\
+hכ?&3niYe@+<۠˨HrI*Do;i'ԀV.#bD"c\۟ */`bzh}Zˈ1t+>r~wí6* Ve^b+P ITd&1ĢNM2̦a hs@lCdpi6M])meD`m^V!vYt|ޗX5~3fD6tM7REAOPV3wZ=_E߰X|ϨQT2|=dxe$@HX
+
+LJu*`{·H |KAojۍdK}!XZ9
+rDqrH_P,~n5lN1lMLFazya .,'V
+sL]!wxY,R xh1wxHLu(73B`β`w x<z\{uUC6I25T`VRkWX!p]B6q-S슶{`[G
+d͝@T"gαɮOG5$. L.e/V3r@>)s4X̝˛ck1&۴bLc3GTg EWp@g1Lzз<:SCw,U9 V-W$c*IC51M򉉥1ˍY"Pwn*c}ڬdiCFcr̘%_r SMyd4h}d!O愺Q;TYNQ,#9 ApEϘ}}WR q]O>:mGmI-c'hblfNCkH/K!!!;"2ZgupF-e-}䚾NHd4Q9*&z1vtG0ϩc]! BQ"FLA,¥Ё5
+HFF@? UV&rB`|]Ug0mMFjA[:*^2{ѹ(ÄEB^Ղ(pa6]>2QVEfgߒVČkB ,ҁ +OF!p6F,^2Oc+HUz]<Ɯw^hoh=
+u[v-𪮘|M
+Le`]&h)Pq͂rR/ Rv+Iq[SqrT%s5T|THv,le'm9H ́l-dxÏ<J|A^O{\
+2ZVi3+G; Cԧ: Z؎p]:BG6m 9,CdPcX")@Ox C2?('J5LgoxGYf'ngkaqZ?_e?[#Cٺk
+GPs 7A3Ăv@mSs:"HLzN+ R1]=-D$ L3:s\w CgN3Ib9:4OH+SiPQ|D)R7
+eL/]O_YsMe`a4Lv]&c-sN5qd<Y CN 'Q":sXH}JK !M@
+`C5+y}q:W'NR<
+Dmf/i!倶aCÕ-1-ԟb^EP N%7J :g1/GE*I@_ PJ2:!qBMv=~*r6V.尒cNqt'4zxl%gxmh4(R,5fsO &4jNZ@d3AOerOo41SAJ`ܮS^
+dc ]eMZ[<SUdGRE8 t>9*6Psq+Y7bi45$g̳?sg,Ulnq捏fLt_&>J-꣟R29\{'- 7ffw#!vzgĎaT$$$FAl)<#&/|=s3
+^{"W:BrD?Ǐiy=غReB!\:-KZ"y Iy%g_@rX>XhRwj,I)(7C1Jl,CT]c}Rcz5sײo,JLy^#F5z n[؛?&mHCu7KPip2LİM 2?"YP& V)wfp=A2$1@f~/v8~ ½'QiYs 7U?s<u /@!32Ǥd`ͻђgm3NJr^k~#X$:s)KhA^0.f_gnN_D.A>geSf ED~tjez99⊌.%Is CVjdj^֩F&{K\@Ƨ1[(@}
+?G54ޝ>I|ՁHK,wYmv[ 63 RIknai:-dpG¶-rw c* B:<P/5kTέϑYbg6ֽ ScĻk\[+{#·N%*/>ﯰ+T륺Ƭԓ0/@
+]Q @#zFO9{&SVb!Gpst`BU0&%[t8yq=ÀS8Gʦrϱԭ#hFvIts,:$EȏE`B~A%}c j!iiScکxivi^_ K%;eۤvsBu$&z7jh:1jVX s}? 6zγ'L8^VlH:C6arb&cܷ&'ĎMv.I=1-[yU>AF4++Ix#ouSs[AyQ} ~5VPCx
+nm
+ͦ~I6ʏHgzshX^s[w}7;eY^d!TIAe׋? N|? cnq, ^rc7‰NDla]ElWs2A6}=n|ŶG4Qe?- ['ËxˠK>1;h*-fp~Pڋ/T豲-?%g5@lNQ[3ϺoPB~SWTB+h>:3쉬YZ6jfJLшxhs$3׍/-Dg`u0mqߟV ,Ly]O;AҭzQ wO<5+Fn澓܃MV+0| smjӄ5o+vUF2 V,>ЧE]'Xyzςe<>l9v>1eo H]sz. D`J4qԺwyc~3.gF %;}x^m Yگns1,1w'>,˒|6y؍WÚ>^UN27smҧ6Xg{@kۤD"q@B\!(1[:1s"a]sJVx;gмC5QTJ;=5jZ{ "]Q|#n*N5Բ8|:xa\Kޞԗ\gV||u|ᲽZag,EdGk= LMjcӧ-C8lph@srL)N|$= sl`m== `)ݜ-UZmEi\PDz~gV3}_%]2<9I9jZx#-'jMэ\Pceo,P)*AAAZ`0h co'*mU-y~n] !lW:t#Ʉr&ˀMmwrv{GN鋒>Fɾ/ -we%(I()xYP}Qs$ee>r=ΐ@v,S_͊T %%<xcLnV[mҮn,v&v{׵2ߛ柼u~71CMW>;N{Sa_e_Mx&=[!ߨJdFuEBLpIۯ0%FP
+mwz'%_@K|#E V{À'Y F:dS2ޭi`oܜCX~OSwF9^x>܅aBL=
+< S &qKe++6UgݒOKzZ$ M@
+ϘM \̣2GjۮU`ʍ_F7[vYSU9CUsnZ,4yҢE_K^ew.G՛fڗG`
+HA\7DOw#
+a_xT"And Bsd29$2.C%/srMb3f!;e:d|P(^ѵ:i}e'xmq聂5@@~c) k3?(Az(R7;FND FB(WbB*I
+Lvu!RȜ]_@ X?c
+s T H?l K" \٦E;;Ibv<u?# z:m DWԻ!;(D` W$ I~g=
+7mDkG_3\BT&'[^آUG "(
+;Jm9QѡxBv;/xv6+3n=h>UȮ5 3:̢!ݙtz!e `2: @@,z0f8Ŏg0OCzN7UfH9|b-
+ƾ+ S t ,W 8ix* Ι-0)ux/K@ ?A4s"ļ+(ԣpÕY (`zu UҐ* I]L1Ġr0G
+TR(ږ*!O?Q˦⸏
+C{<`<9)" AWƽ8`7kD
+Te;^# &v;չ6GUSJah9Ox>U1r+.J#] φ<Yʼ>W1O"eB~ SX]aV;[1dLnfޗA! 6B³sC VM]%%IZ΁L&JpAa,9l WbF\ÂįG^<bq rd\kޘT3SF %9QvL*[<oEWedhp$Q=D;"mQbđ$>A׽oPQ2HTW˫ 'ʴh<e:E,C`E{1\%;]@*H^SGVZYM;Qnu/kh#5( %-`@"-=d24Hll a!i;1z11~b(7,;oOg,IL܈t0D*y{XYd 5fcCEr譪R
+ܦP2K|wBQ
+=E7wސ+9r6IH>C}[iyAxEY}E47-AE3-AN@8#?+KeUN h`Cs4bb^ 2zn9#N&e|
+M7Z6T1X󁩖+ߴ ] ?#7uN]9x$qPNyXo>HQHuya+IE
+&#08urWMDoeHoLØ5VkW&9M 2,1K,U26RerL[ 0тV vH*jʙl抵#ma؞{E?cehKè)aQ28`)Yr`nT) 63qQrr~B?EĘ6i|R0I5c1ܥb}F_
+ [Iafb} e` #Eeg0]8a 3]
+dۊ ץ03֠g^JIDZ3p׿( )JM dm5^'ަ
+[IBdY9ټU{ModpoHhltr`<Pץ%r+x̡.
+.=z)!5V;
+"ҕ)VlW`ha)ɐVףB84d*Ck= c;zk,uKoHaG[)"EE8+{܂1E15`ɻŗsR*,-L@Dw* }^JPLuI)- $iH TEָ4nY\qugh;'|OZ5S8  ~U).))]"2ZVU3~TwQh@xDz֔unjqx0/% 5H,gMĪPz 3щ'bػLs4Fv!ItJ1 uTOr3 %c VN@a* өZ% ajcQf'UQ4@>a% *T@0TTr;o#")jF5?M\1wj"!ޫ*ӎ.Hcњp;ZAqSe[-A@'gQ"NygMJ0~<sFŽnu @t
+Ewj*`Z+Ӻ'.6ue! |4@2Q9&x%(2bAY_
+4{
+CB|L$!M\yj
+_fupËG";2f?W(|l>=K}ş䔬JБ4JuRt.C B"~P.ZC Aȸ%/ZG݋bqs6Y[* h%YnkD%x]vD>kII'~7\w}ah7R%m/,(K^PsO~/
+$=DW a==cB]\g(?l_llnŷt _j,VQ${*Ɉ 3`-”X~9(80NOKU(p2%b+ VQ|ek`PpoCZ A#L1#A@Ux.(XFd(qtrRcF$v [I4;ѬL̄k6͠
+&:dNRi.2 ; =vnv
+X.#TFr[L#ɕ *@ ʰ#qZ:ȚDCӼD,5_8a}cHPZ밓R2\s!*3J˟w6?ёyf!
+(et<9~MK("hMH֘XK^I"(LZpikQ\ Lxā7RT*Gm, ؍ly_DEJ̔TY$$5 I"CW(/) erHG҂hbb[ cI"G%4X)Qgu?v3A(K^4!۫_{h3Ćjs<b@SrmLl|FZΫ_8aNv#K
+Nl8fa<*rJjO{q0l v~/yiպjA(!Ϟ?I"\{6WAýu^=GTxӭq=m 7z^=g}GysdJS>e ^.~ y{YJJiR?xl;A;m8]@|Ӥa2ͧtOm~j֐0
+cU#ZYq# Ld#"h7\1~r]2lMO/μs4N@72ᑟXfP+O/ / cGfeCIWUb\ !^ K/dn1C])JCRyv%̋ؔh=׫h8d?5b \!<Rk9Bǐ3L>
+l@YKuIVNjaFcx#>!=r*eX4&ifcgέbq+,ZˎMw*tB*;msrj׆48Ebm?oDSwc*1DoQoc* ƼieFj(A,s¿׈Uc\c1_J{keWg[69;?-r 7 `N2^"G]a~Ob(侾d:eK>y~G]_.%a_}?>5/
+ڰCK@Pi81
+Hnh
+xGnO\v@oΔN$U'TWkl2EX34$Qz*@^D+Ka p# q9Y,~AD g*ɪ|>נ:SʜAcțǠoެ2΋5~1Wo [
+xN8ZHzuhf-Y$2-fQz۠wCЍ ! g.2m<_G$Ġ6'N'i4jF !pA./!LmRI 0աk;]ܯU8@
+=
+:)c$.Bo&8G9 |:d}Ԣ+R3j(Isl2[A$3Zh bw]-Z
+YŤիaЙ
+$cC<6lGr22|ބ]tuw*Ģ'pie9oR7a*DbO|PcW!d+Ơ&g[뛽b7l;bhC W8r"Uq8y+frŨ4
+ᳲk hl3d쉫U;N@, jq^t+ =+[j$q)H|ckZ,A ,e$4
+ a-d_,pQ\VU?eЃNGA)|($HQ`?6 a,ϸް|-йT hf<2PZ(.w-Va6!شg 0Cг#,uCHbz;]orKh1\Yd;/ ë-q])@z|
+9Rzb;iR`M*6wK+RX 񲢞`Jb̲ 3 ڶR+3 O)؃.p2oW;~>5GܮZ;<VlHuM _P5-:ih=4 ,`2mz8>֖#f$p1 BORT O\pSx3ؼ];07K(Lٯc(yKīy[ܩ #1|A쓦&jLVZ!N8ŕep1fࣵ2$t:IꃠL(!ÂPut%-qƔR)8%HK:oG(ȺQh
+J!x
+-WG4\!b.MU垠\WUirEXҪs Tɣ(lԏ6)UH^4yY>q^ {,=N49o&`!~Rɀ+3NY ]&߭n(*Mx#k WΝ*X"e^rOWL0 39mknpѯ0q 1]?sl-Quu ױ6H$_{v(I:t*~)IwnĬ gs#kF
+m1A@~g6/r["B1G<4%?y_Ѳv2Ȳ(J % +5l7{8)z@=Y ټ j)[
+"˜g{@B-~_
+œ.o"FBEv Aim^,"S0e"⺕L,j<7O̜.@UkYh؊ tT:¡ j.rVԫJ#~q*;_>9x}oҩ!_ oUM|Ԃ0͔krP(O0sEϼ>c#GX)o3џ.'
+ #,|(QR %"<|WZz3֛ۨE/&A@+bp}UzH~ P6̢a}ۆP, i[*4_!h8]aIUL چ`}qkډ mrLԘy{W-"C6TH)1^&q@=(0ky[hK ][f6η(Ff+_BL|5Q鼺8%;JkFcU03ccMMC EC2.!1Sf 8_ߋ\C+cEhy8:K+S!Jv cA
+ElP-\z
+kEe"fVZS3.Sfy%(dɴ)R`KUk%:WT
+.}]f4 %n' `?D)9!i9el^d%5J[1PBOb 2OqD=&37!pA#=\+a;/wpܫkK2A 
+تdcQ
+_u#)P|z Yv}rn'$#U{q^ x yi/߾ j3+/
+0C6:޻l ߝAuuV w(.cVO*c)ҠWͥ3rA[f!du<6bA6M; p0K9V0REC@QBL%,K*SU9'[i%DV}!z 8&X ۖ&BIfdaZh,Y"L!`OhXU Ų2L/:E$VnUR q@ޒd]єh"-'Hnr|)ͦP^2F}O ;PVDѥrZf"
+0ۚSP2 IV&bΡRAC< e
+`yNC Xύџ^
+5)ha<؎r8MC^nAu2z9׎_I6ŷvM` Fִ㾎Av-fT_+HxM7 H3Rw/iVx,vF-kEFEr>{@A*gs@䈪*sg#Jp5ۇLјvC{BIK!*:":[|zG)x8Z]! `.Vȑ! n1,zZ3J}aWHhvBcxt*< n. 1ㄓ7FERO -&vM1} F7"Q3ȕ̪c. Y9a8X68!.`XvchAYYߛ۔J*->z84eK~ErFmX}NOg]d;MEQAP\M:ۭ誮i{9فѿ]'GIi QD1
+M*"c eɖF4(:)mE 31]LQ`1t ;d<\F-hͻF;TrtY8M~S
+yg!l v &17k
+lB"i)zA2AvarI#ׁ
+@Aޅ}D[^GeE)aOcS9f mbi]{UK)pi
+ aR_LGW\#7MK<B'kso
+ {ts9l#~
+e0Ѣ$X ցg#8b#~5kW@Ø-/&S%coM<]q
+Qͮ%K6~9ѠĦ`0LDžJx]fe
+¥ᶐ //F &ay\hAq)-Ry9 !$?E׫AQ^O$UK"!y8 cdݞi>Ԡ?Zv!Q$EE i:bhy=
+9ECyx?DCt!NHsQ#w~Ȟ6«Qr!_q a Jw o0H_Cqh|55sPGcj$ha Jk`՝ A؂[$(ag?Eb%4{ oɨ2%j(JP6fSQm(Ʋ(JP2o<o:(ܣDX%ueȈͳZ%tL(@5Jh΄Yd&]g <)˝(J4>2,ԯQmoaTEIpd(QP*DZ~(Ƅ7W%,!ŰY5,AH\k%ܥe&;&"}-ߣCy(]=Cf4^a
+&cEQ,@9ͿQ"@=Jb#%ty卢ij3opu .̚<{jEoτ|xd" Q=biaFΕa%!/XC; [i[MejzYEwFQ*.x}d N m08TuӃ}c b.
+u'NA&?g{" (s 9*RgA8,pB.)%2X,8l}>ųג Ώ$V9Ŭ&,w'R%.^ |$xk@WFV?#Hoe<^t_n臻pdǍv!3$<E
++h?8"`B4Ӽ(^l&l)21&Д)Bٙj}–rL>g"Z,n~.*[=%{)p妀GTdb%+->a-*zE
+CAJRBnLc0Qth3mg.ڴ(d~rG@Vgk>hJj6eS+ċE|n5Օ_H;]zrΗ#̅ES!e\
+ $+ўkTʅ-tcPL~< Z Hњ/$xjd4 \+Gk CK-n`<Pk@Vg6I|)bw$./(Vm 1>M m+9R%5~až+O%D(w' %!ǣ_l%{ ]QQ܍ `^0
+Em]$Q|JjE~!rbnQ2r:p0/N 2 ́SMOM^DMkНj3ӽuC /9 #iȂv>q17G\+ rYDp rY+T)&0(9B`P.e1E0؊2R/6_5`,6FNBZ؂9r|۶|`FѠ9ȻCIWB1HNG4~?AE;`'LYY2X[7r eؼ*L{:7ORܪ= aag\ܓ,qX竀!W.RMKvrCLpol$=|蘹}GŠ4,asmm{
+ρ8vLmon*Dv.]W gKf#(=]
+b!Ӥ_1.
+~1%MJ ю{$G'M2q*Q )AmOyJlXLX\b}>g`K ^SҤc$ 3=%M!C@(iR+@~\r)i
+t?$I'|
+Z^}Pe"pVM2?@9#o?YӢ{~Ef,(ۑ?U_+r,J{u2&5w!x(ѥ}Hd\jܛeux]
+8"F
+XƷ*2/eάnk Kk,t@"4f}ZA4dYpOL_`=BLz" C o?.f7SwRhӵ
+ 5ʫrQ/y菿"%s:?.r~'EWJp7ZӅV"&va%ː3l5x]Gw%yxY6>W.Z JpamG[[%\]UCK6{/&& f=h% 5eeEOZO){v~ j&}G&,tV 8dXp|E\%%քiHD'!ʜ Ih3Lx
+ {Ҭ<(\P݅zy$Yy _`F aB|kW"- ,j*+_0p"xtt,-5 (agtKM` &=褨EK[ toż㑑 FMPgs䉏H|EU({a%^ uh-U$YW!>麜(u9^9/QѢA)!uE[6-.}%Y\%W:AZEY]7]ўYڕ䠺新`R0
+qf~퉘vly@56;ۘ٪Wnd󣸨9 no%ͦ"a3'^ʠm{"5lFsPaZbq/<5*$qw Q)" q~>6
+*)F(zEJB%~Yn`A:G rhf#ӝ?i]g^`" dd&[Y};UxXscCre<Y,+ ĖÀE~-kD
+!m(E'X^:frKKK؉1tr2AEAȔHsWrZ(wSrQXq4
+C2
+ɘ+YL#s}8GSNhC(3%8kǺi1pߋڴ2bak g5q"r[Av
+O ̮䷎a{rvHv4?RDي9(ֺP_jꐿ`@.C
+-!POf,9i =:B]@W yagN5r%!w/R
+܀[~ Z} 9!~72$Mro)Ìl@_za(y3C 9YO188\sQ=
+=B}}N!tjzR}DF\t9`L^ 1rIn0 ڗs);M
+ bt2\!. Isθ?6OG~F68
+%arPg(bY%#?l[2-:^UPTURP9RmlĊdM؈|dۼc$cMqBA8k&;3}]['<
+ An #R>Ju `M1F)643ܕMJ"F{Y-#
+HAd7DOPw LB)\Ev^{P*ݎȈ`p xǦ=kZZmx٣d:xGehˬ3/nӽCVV+Ef|Z^8=mğdFr :j<&wƓϜY~(z 昭9i^d9x>3[_̴Xh4dQ(y juړQWlĺކzvj ~t&ƅ(sм="O>z3 }ז^9736sM!^t.=O<ZHHstjaK\u@mAū-uƃ3{ҠY^P!/^s/̠V-Q1 wAQĒRc_ `f']O;~!jq(5ыh?}>"IY{ ޵LEX6c@SWm R'4ѮF5fO{9T:NEbĸ Zg 8Tgv13KĮ=ߠyR.g4d# *7FriVJg Ez߆
+fCiP{mY5 šmJW-mYZoڦ j4'aq}ҿhS2O*.[")clY 'ʵ/z>&A3J$o(5Dsj=@>IЋSh4RM>$ zu|F7iDK&WvA@[Txj .Ѿ ?Π
+sI0Rc}9u*u0k;݀*ä7.GW}hj%3w~i?Nz}ҿpu ^.5'1f؟#>js6LSE3<R:Mjp|B`-UU~#L#01aY8wU7C՜|VA#=<
+zEC| 5^C`E
+9Qgγ"ؕႬ>I,rc#ЛF`K&e?Zu*"{0h(\ |!Q@i`\mw2ya^c* [\ԏސoHRrZ3Q B 7 ިB$Wj,?ΪiroO%&Nv6Ӡ" C@v78pzB#\ؠ~R 5 E}D`llXArʘ1K C 힟:FYd43)SI}-xL6Ƣuٔb8@QhBy@-|H:f"+zčXq
+`?,Ĕ#P;k~:SrCRqY/gnݽBڡeC)t@ɾSGpi\~  ujJΌHC)}f*ll]8!_(z';czzx8'WS8jtpq81?tQ*hMZ'$l8 k(8&ۊm07:q' I,F90^;cc92Ws衼h..42~7ft sf?dr?0"%v>*{X_L"m\Q
+njMN n:2X>73T\ceP% u{MLTo>ę#wjCE]yA('b/Z;EsWq
+9ߵu\bS{D&Qua|?T10N8?lqڙPHʣE8rc$`᧵#irK
+w Wr krI&4L?qпyKiܹ \9
+xĠUbPJS,a
+J1%W͂HxR P`UbC+Cv~cMCT<
++8_ $CsSVcq3I(|ށShylS"Pf@cVf,oah y'H?CA
+")*410%U/㥼)l#@D_uxvFȌ+CKX@.Efud'"fg$ B +D48sPr[(u3I"͠sXC&FeQicp`ɈH靽 rq su3+uDz]ޖ-:!7Ɍɷ@pEzxy<'o䴿)Y[jL`2{Ir,xd*G!+-d-T _9 J.pR2<vSƋgɕ{a\Cb\/zK0{&dha(GYiC w$n--r_q7=Kd6.-piB 4?۞1=#[jQX
+d&h?!Maq G:21$XbAkVY< c)z$w;h+HheJ\D QF0
+ľ7npJ)2/U(z cJ-9 (o1UX
+ap`耳M*L֮S3q @} ;#}v!gIa5b@FsB~?A 5roQAUR3L^K8 Bjl
+Ë6iLH`zWxCGzO;~;>6`ߊkqDXwOd3> Y5%f<CiWy%dH٥14iSd50M\/'1"`%kRWn(4~ƳB&Htx<-|*)z[8_dt2
+mJog#<0hـuM!oBk+ 0*2;|Pvt'? +dWVL8锊@4!661wMC*ZHϗ{׮ɧ $HSŷYR?gY#ԲKOLm@dFLH:4Ğ|$kׁ(vN;Lm@Afc<WZqcoʣ @1(3Eĕ`\l:c(85BS[(Voa
+:Hz9
+3hNM5g=ӵIۈ+=Mj Y1
+vZl%ԎDUt-maY-=!VL`Nh
+(* ʣq-^;N ql[s](]kѢL7
+>E]s@
+]QT۪e-nZq|ss0TEB$%"^5{D}(
+X:Ia >XC@ L~ȫ猇3MӳB7)e8$<'yITׂMl)9J9嶥Jc!
+r+)ѭREuMH5}/EkgXXijYެ̸M1;#& WQ5Hrcʸ
+݋7ě0Qϭ
+Sc@t.5˪]~(*ej:d'`
+6M9{b{#dְEo<6^P_~(1[R$DEB/D
+Mr_xW9 Ή<#bj~͈#:LJW!E2
+4- uE4(q+\VT2U[\qt8=AREOuJ`!X \ly?h iJd* swf!wI+Y
+X_
+`7^{J$GJ;7UX iP-OEH SMQ#PPID_/j T*>"'X/J*
+2{0)ӱZ^)q<13O63Y ʔCF MAOG bA]. p kd ,L$a(؏x/X!(*K׏~}1f!)E~ekbỵI&34VQYnO'hڍ$ +.eR&G_*֫s"8 ~5/
+ـ,yqVܯuWB& vÆ;X
+$#P6EQYhB{|zV L96n0Fǰc&钩estF'`:^9ًR(˥IO5eh_<
+&9d8%2)p7W|ŢN_뀞Ϟw>:$-A#HVYP "΍8%kM死瀍:8Z@o2ysaL; ZBZ1ETyLjNq]ڌO]Xlb8%vOf+1RdpGԂ> AY{AUJ!VõST8nEiͿ>Ĕ^ĺ[BQ V
+G
+/R;q̧St1{E@-{,Ux{#ʤaE; 57w]ti;}2gצ*#FB&e:NW;Oyd@t@_gڻow
+џ룀Z6sJaa^ dmE }rIwWWc3#ӡ T A깯*A
+,i 18;Fȳ6
+8g_Y5;WXF{Ε ]
+3B ح;_L8qZdgO*v"x~TC93w%1 CJGeY#֒/F,+ ddYQur^ Hza5`gcɗgЇˆ|2- I9>9x>n$
+D0Ӧu (C#0!Kv6%ΡX, 6P-v'F giksorI$,qQN1=B'}RxMzF[-6#V8y %zBce>Ù6UQb^dQTGfP}ƅ3hY%>4Jx)i{sY+zܹK1r1t[" e*o6 נ':i}Sp:)ۦ6B{49H0?tF%TEtB6
+e<Rh}3NQ}Fw 'c53Lw*B%DVk|d9IXSo^31V0䓘/\</.9LG,/ \q^s6iL h5sog
+2=6E#o 4&OܴHf- u~dimKl=}|ɢ$.W'luvbbmBٞfMH)uQM p>I][K H$i!Kfʋ1Ȉ~Wz9qP
+eU$Z8/0}r,6|2|w,N)<w@<RCa:'75
+S
+ڝGIٳDquV7W
+Q ~h& 42LȒub9<`耿w yNƕC4y=DO{hCM^%Z$KR e;[ȁA33A ߅b)&Yk^!Q<P@3X.%wa4#7K!j
+ޑD\{x1qz.$j[Ħ/*タ
+y+R i
+9(9$E;&EKqh!7hQZ )U
+NlǠK
+^dYm?ހ odŖzu$pxH׹V 7L& y,ڄ14
+[gڧ[!4|hZ7#6Z (Cq3*tRkP Dgsې:f@7:zc:M dS l\j7ћ{%{d$- #-|{z:gTB
+#a3|E"q[/~i"V1A@i}~5u[H
+ c|0$=Qu,_Dqmvs5=*Q4-v"p#Ri1&$I^>eDCA,fQ9R8G 0J6Wfpؾ۟FQن8kdU³ψ0fx3`<<l
+
+ F q5CF!J0iHdx$Bq
+v%#Es 6`
+`@
+@C_A!_2v&T`MG|^JZ0N!Dr95&F+U}~ cJNC
+!e>u>jG9=: 轚`&&#T CzB2%i }˷BS^/ɕJ@W=h bzjw
+-%W1 ZD9
+⍟3Gf%s<uGMfڮ_L`$܁Lղv߻5`0D*hR/(-S)unE<hՑ;ݱwL+eno*%0ݷe8i6hsuw MP[;"~n.GP
+۸ךj;ћIny0^{a< A(2̤TS8p8GL1<0G Z6Z+<b`e? |ևȉCg[avCu1%qW CͯYs+ H(6w ݭg4p{ŘLHF\x\`%jlzIS+LIG%\SJh>k A>dnWb=Z)13$U)pKf
+?CyL"]^Y3A0R6l>*0|x[фk&"-Պ#gt<ک(SPľLҢ6["`OroX>rǜ$Ljn ]T/*⼬q67{2ZbSOO!KSlE[Џ^x+s5B}O8Mq"YUFt5%Cg$jMnA#=Uҕw#-`'7M SэQ"ⴘG+hIRfkx@2gH׮5H z#޻\
+V 8яĘk >G})SRE{j/rv{u-yoak--[m% =0Ҝ~jezwXEDv |(E-hzp%u5*O2%+쩱j[z|ᔤM.zAX|U W]s@a ޏ)^و:/+ Ӷw1|{vjB`)e/{S*Նþ3ul7u<g+^̶)'YcnS"Xu#Vc{n| 2WXg(VuJSy=}YT<2"$FXXe75Y4R_ oC`ǟ[SD=vXc>Ј6_}Pa>"z/<4ܱ,L'l
+:c4F4|֍[; #CnSE&f ʜ<P=7/;< ;zۇ5Xn0~g1tNqk1
+c
+R=Sk.Ȭ3;s-⪝
+=/=BGh|^7c0۳*|\@{75m͒ U2$f+ltG=؀`ʈRcӦ=buD3I<>hFO~6G"D;g]"%g|[yHWA+%3K^{49ʳU=PsyM`ɜZ/ҷlq0 %n(|'cg]gǸ10ԿgZqOOh`f]gyvZæ;#}e/$iQs+],NGxd<*BD1'7?'xZe36%$l_T k5 \dwsK7W7LbjA |fנr!VRÛ"|ן.4vΦ@my-˯cx",tKXř҂5bR~(D-oc(J򟧨'r+lnGAϒ&3BOu4C! ŕ
+CzHyd?0 JKX~!\~d35anYӫca]
+lQ9{$v(m
+.%Wxg5yl*>` nIS* ҒŝX#nhv%zi;=TQ8]ܺV_7s.kp*G
+2EaA%ޖJ>0fFBBl7)[i
+:>|%Ya8[yҦh{h]a,!l)|
+piy^ZG`vI,`e&"?Cl7X$ӰdQ=/ xJ[щlHya<"}ƥh ]g cF \ /^!'\Iϥ`~S_Ǝ ,r%gQ^40'^ՀhJ ܾέXEA>m<d"<n
+O eGbx0/a\ZbOSgv"k4HP3z O\O*<s pRMAŚzV;{/@FŊ%qW̎cPC}G ͏#K ~IRU>(z-c*0ۙI+K*JsϬIJ璄>jb @xi's
+ǷEܾb~Tc<spiq!B%v3vJ/uTgO1欄" G
+Mr:w
+lKc]Ϙ_o0]-9
+\%y.[FTlI7{f-~8ui32C:k{ˉ1XzOjٺlA_aXayu6h&3ud L٬
+A4* 5uOB&ml-t~_Co3oRtuݿ"*'6
+Y~"c Qx#p[A# {8tv/fFw/aGZ Fly{C9
+DI<ʖ(ي)wt&u72&L&aL1 x f 쨮r)>TAP5:q%'d6
+jQzZ[kxyJN2}A ;ށ64W~1UrDS4bz\량ƭG
+WA5Μ~䨋ٯ<BTe 'oVٕקOAK8|jP^ڹf.i2nh@**ib)ĔP:ra=T6ʘv3??|{ED"_ZPUo*=G1qFe*;Vݯ:Ck^>!S«MY-,7G
+ Ϳ %-W'|W5n)q]|~T%d$ p&I ,U Iw;Ң*٢q~J4ʧ?@Ư4<D b Li۔TW("{b>S.|ѽ6nP1dR89ƘfJ';/o!M9!IKbe`Gr@D}IIJ g9sWN7m^3'ү5x4%Z3. vl!qK|Ӷ?vز pm|2q>cݸ_輼}|=8!?ֿRZq'Z'r RZw^]8A1_߱5|W˅6Jyvn[k-8JfO?5|ݺ'-vh!>i_M0ED]#<20}b<Uiԍz}=%4
+Lc$9DYc.-/:צ 4cc@,YDsu_'n5U\!X56Ng 8-k8j'>#5ɖbPzkJ~Nit$楊Q_TX=xl}w'm $R
+lה$SII
+6D Elp>}n9l]y2ro^mi
+I?#8J,Wo#xS7_}8ce/jxRk_1gߥ>eӿzφ PI.4vg_G xkq[xa4M7D<9>-靅i1mfcYI2͛"*w.:{t86Rqǖ0n0cscRt?TNu Lm:s~>~}\G_<`sIYc[Ow:v֓ 6G?WGÄǝڴ
+T_f ea8EP0:~!2aׅT9=&o-"C]bMQ-aɹ3k̷nw$&7E5qH{{2D[z
+ܲ>EnxtO͉uGC(}/Ob!R&,>=
+^6=/5RǼ]^g=%ko.aVD~-A6NԵ!3qvEC wvn(wP^1
+KRZ`'0w})! D.-LNg`&8B*V93r?tBu1Co?
+\)>>f+KNj8yǝ4Yw q-czsYN^{ju@Nc t6Ӌ'o?C%jca%R+_ˢ0L03E@ e w>Y,/i=B~mPDK1b,OP}}e,QE8ľi-+^J˒3plj[ (EtB>%,7m"1Q^[M d8ڶ{rKQa({ʂ {GQ !8^}"q(?
+2)2ZJcsR5|v弳^~D 鱼*|gk6M$dq4@8I 25z̒`CO8~gY(3#Iȶ< Β|ǨwwڹlwTv>tV2vT9a#RmE<^{+KzO +@sRò#q*%X}~vY@۫jf>d71EB'% ];/<t<1iEM /3*=FL٘J߾A  H3g dh{{R2C9-LfIy΁juT.Ie-%X|b^n:m F(({o:2NjxU
+HMr DO;
+?>JңG=GV{4i٢s.VS9ox4!=FtaInPXژ+ ^{” TrwPaJ1.u(<I[
+UלrF{$@ƅL?3'kƴYNx*0AFnj?OX\Gh؉SMh
+Ǻrނ< 4f؂Poo<kCL>VW4΁_qAAV+_뭴1չZGlV\A4+ ~( SlH&mM&p`~A T8".! 8^^l=&([,JnTDnW~,Mtǩ . ,y_[gPUs_3x}(T i<6->h8trW
+CԢ~}>(@`OXBr.3;$xFߞ
+4
+HpcOn z+oE@f0koM㤩Q'=&j)Ң ĥ0C7q~3o =yop/761dPje&[j`j!z؉V4jsFZz (jKڋtI d[og] OCS{ٗ*K ( 6d %-'}ߪ FA
+\H吩6 !?`F,DZ“~`\e0\Q!硫h(B;<Hfwfہtb(z|b>owm9I ڈ7gxV+FEk
+y`+O
+Zi?6lCxځkniNFݍ G4[h FV8SKf pH\:Lif5ЫYvW׻ݱ@xt\k&Lf)Yat2,26/6.ӰUJ='Uh\G]6h<3ZF  ~®Tml ` ,b!WW!E7-q߇7;y
+j!}Xe*!ɸ}?nJ2E>/Gr8QvON. HS1DT#EN5آ+∼&dJtG>ծLx$tpKhZSišl'&>ugC08KRIS&M-la:&|tp\]sApM@3{ B"!
+$\7E:w(ϫ$@4?oHn-|FcEj&V^'Rl
+ly ,XOD mff{
+ژZ%La+ ǾOR@r>mT*bTzam30~s6 ^0pȎ/rx' gky"bPd0k97ȯ??0<"lJmR $U2?cLJjcLe4% &IdоS3Q J
+V9`K<h(Eި qE v A&|!q8G.hNף0-H?a4p qS|R:Z=bE3GC
+b'07"u %<!XpyA.x? JF>4ydbQbرm7jci1s;Jʟ:1x^<$NyzFUTTBxQ
+uےg,_n*3e7)Ajx~7IA &_q7mҌ']0P%6eAYb\]$5}!&.wuI\5ߒ4v X{CFpbrT^>bFH;ud|0į8ܯ٦9-z%?zQγнH?*aq*q28G!&1GANU C;,blczSW`km6rOt0 ꍘG4ߦոۛ#XRrz ˬMyG%!kbm?n^ʜG0)\J5GAv5HǾL)3?a!޻؛x~B<_q9+b&Yjگ⟜xRb 7 DOlIZ9Yb6W:
+Je:E ąQ%Ś5K3=f%:o*m,XW%\$Wh|r=2
+U %ŋ,(NoMGIc5v!0HAz$ rc4tEZSܳr[w<,a+2omr M#iMkjefe w̦V Eg(x>I ^/.IQ9'gE{ks*prx_Scl&mF\<lYdcΔu{KGy͓`1d-r*~ Xq%t8`ͽ:,W{؛hZQ dGΖ.K*`8j"_whgMy äDPV?Als&U{ة2K8P2~Eqe(5d(%>h(%{Wx(>%,g0;^Eܷ!4!~T&<JR.p}p%(֡YRAkwefLtv_̻v 27gvOY3a_i=ɤ7>bvv$%@o`X#׻䂿- u$g?ѱ ue*;-d_ޞC.%$V($DPooZ
+ik\x(E%M(5N ["KB"ɴWh!
+iQI8.6"ɸ];Z6k,aI몈Z^%9*`}}=<*pbs_UE:
+$z=5G&'cJ>LjR`e$Q}4=zm$e}sdЯQ}(x<m
+{,c\)UM\Xe<6Q_}m*YRQ x[v͢}`u LuĊ=9J.%}(q@D"zVzK vڮllƙv7Sv9Z"
+v>-5BqKs=" vQ&$_zPCW7߿D邨[\4?=P_^P:zz(Q1kK ]/sA"n qŽD,4D2JW㵆%x'+OE5c9Y]v^(f %>=//sBG',88l 'ʀ83 SŮc#h7Cg36gy*ze^
+΃s@^nkjrB r!ƶ:̿!tzgw
+FmIށ*m%>K2fǰUm4
+j!=52gK.KPtZw(; x܏.pD׵hQ ACe
+Ze`eU]qT4!aLJihkAQ!2a_U>J i*s@.;I>lP$%$TCKL8^F%Đ(EW-`lK^&基u+A"nӑXivwԵ;lHsA\{
+ igu)YpuoQ57
+zU; RP2 =R8r>(?rtաϩ]>r'c<10w^u^xvSOE]_0D _ 
+OT
+NlؐKS$@ue{'LfWSTBaJ觷=1)4 &I3}Ϙw`^ml@"}6{D*Ġ(:M-_}q:e
+:5o]p#iiTh EDbB?yh?WC<gLQ:(fZ\u0s)`Nq?^mr<GYe7 װt)oZ{~H 8V-vwU =(2Ű̓g|aE===z|](ȎMЁ6ҟTvG%}_)Ls}Ikz&9xG>0[ 2e/hL#%^EE# dJd/Φ"'-F@cJ<m=JLFV KBgZ%ڕ6GmDЪZ 0&@Ćݣ|%
+im*i%#t;(F93[|MI9c&3y TFdJF SZD5rX ~cKvKfI Y s
+(9Se$<A<iJƗ6_5*i9j+x:r?& W 66cL"|0t?EdA۷ .~aM
+dW{wd7S)c @a::
+s7Pp.Og"6! G xc(òM' 4GϱYĠf^u^J,Hb 9>lJa/%S/(l99lJʁh*P5mB~zYC ϸvj1i y,XU>5 + cH~}=.Q%9Ga-d_*aseAUPa((|fK,!xGA[:d"<9r41սJ!Jף$|SAVo)[s LE+ (a݅q4qP) @x]>ae~ Փ?-rXPa9㪸mC9k0$KNcR
+.B > BaL}hPx_])9W4+|!1791iX3)~v[>E 1l/Ebc0MAr'ʸeRD S`vD+UTtCii*˰omb3W)F8IӖC1b(g9mw.A/˟<:Gތ +meTѨz<a>qwTKJ4UM,
+Z"IlLZ0nߒ)ձ $C9b~{@AP)` yCq[Fq¶CZ7(D8T-.VTc0^5vi}zڰa}V5>?-ġMOe, !<!145a{lc_W30xPǂEAxLś7 |&'2d
+B~yöDNRp(HA?ɃpE)|Z]&K-F'3b(+\<[ȊO,ɥ2,0#rS?I)ӆcKQ07<2,#់x
+n1c
+2I4Ʈ4#ěin0 IV<Wqcj.Q HwzQo%Oߥ;oQL- oDM&&:s_ MIٵ/&=KqyxФ&OZFJd "`Ew7pŇEּ[FPQ Wھ|h+7<4`6j vnكg4}sgwn7^x1;?01(pwxßgAE_!JswULHyQ}Bs[5qolQ6 hEwDB R>.BH"o˰qo >1,W~EgI@D bЬ,21b%cMw 1Րqx}jAr$-/%,WUs ^YRl1y2$g$T|T^W-N~
+I@P ԏu0[E]1v~$w/}nݻ ))R}> x/#5
+LUE/ɃwL(̷6prYm+MԳ}\ ^II$fJ
+-nDqD1I[ Q9bwť^
+yyₘ*$RM+fjg͒LuZ Itc6v}q8\VpE381^.ɑ8=AݡO Y-z+;ARL"M)3\Ap<!``=Bu:F
+MRb*TI~"Ch5p$7 a=vhh 뱵#aARԣ3|-3EͺO$&
+կ@I,1nw&60UlV׊=Z\s<
+1"/ӃJ rd3 #0 xG{%j
+/2x2+EH^_~ F(: vT {vn>f4n|^jU-ڰZ- NsGg#w\:2E_έGtV1~aFŪ5ad_dԾ ,sÕ@iIH5q(\f=wtȀs
+ NV\vKueW@^Ԧi5Eў3)EӀ 2/O`0bY
+g)BN&#U+R!DzRzYvq7NF/N5չgX J+ŭq̩xrin걗 ע/)3EgYS|gMN_t)`VZ3
+3BSPMfn'$=Y U^tF&OAv%b FiO"S0>'>0$t/D3bg$ANۉΪ"R
+~Ѥ .5ZCeW(sfOɌ
+Sd¡򴰋Bw)DV
+ji NхWލn=L`+.Wp|@i~fW&I΄KO5|*Q[k4W`abTpP(+U-zzLS}:4@.ҐR$T|8Uжx1IU%soڌhf"]AB+= 3tM6Uv!a%T|i'Yoj_jixIqVUTADp gq OЭ{$cyKST
+aeG#&#FAZ"B}%|d1iZ@vvގ\/h8%R(o!l䟨1Qص{
+7v4}?ng#jM„L}M
+OGto7Dt, z FHk/*$QeTJ,l:j9q3LwznxbН
+,F1H0敶 bKRH ’=fր\€zDrE
+UNy[Q>6^B,
+BSei,<z>89 >& AmZP):Vfj?E,Z jkğQ?vV}B+ޛz%)Ղ+QZGǴ%s$bjd,ew)u~ͣƩ HVFmGdv\9q{dx_fG5? &%<z(q%r*q~ :05 +݉] C .]Ɖ-#1USK!2}8hF@Il%`vю-W}]eff 9]X;9}>S'vwL
+ \1 g`I7)$ 8uZG* KPru.É:cxAY܄No/rWe`cQI_͉IN7Y0&O,Rf ލt s9z6!Rڕ+nj";D|ԃ3
+ky1%,(1}ۗ36^;&m(25jw2߬8Ĕ}jX rwNNlB`!ħT.Ot@k=wEh$} * Y ~f ;@*$K<l4! b`('Li rCJR a5;XIua
+lFv9)9^>%?Mʫb1*O#U^N1ӬWNaNDi s;'}7O @00F+o}Iv@bg9!=q7sP;\'UHa3<+ZC)_4OA!i܃^tȇz<!kl3J! >?k(i<_1 牸ѵ^y:с:/0]׀IQ?71
+ \_WXW-;B+ɽ\~sTx!k윎4hfz,HRyB0eJ}*4ϛsf"C2<$P͔Hp 6[2tcy[-n@(R6c-jW*Eм6dZa\`BqHuV.SX啟<@9xĤL;';G aߋ QO/~<m.sz^sKOV}+C'vK>T[N)Vhf<sEz̬P<REч&R]"<ZW7TAX]s}k߯RWA)rr[jh@"T $Q.שa[؂XEVY<VK 1.ĐsIŖ!_&K}A=W PS'+3؍[^
+:F\%&r׈)UvTNGхXūU$G`a1I%_ >2LAMSs*
+ ɵuaQy#S4|BKr-)!
+# *&JY%cQD<Ixxyl)oK[% ]=Sn
+LY8ke6m>\0߇NŸ>z=^_+Z=S6бr/r-kHƑbڵלUw#{A   ӕ7
+ C^U)֍ f3!u
+˼`xARa5
+!EvUR 4
+@fpq3 VvFBg+s{HtBח( o,OiL^&>Eѵݢˇqu&Q#`$Dӆh"7O[RІMOF-Je8A FQ}V IH둱lHS/Cʂ;, T?sdSnˡ-k7C/ey/D-t轟#<$Bٵ6<mvºQE6!
+
+OrqԻ3QHh7N3;ab71 5Q㒧S9d2r;0).E)^w<57xpH sͶeZ,h8~X&W;QFݿ6Fm= qO$l&͟ޕHQS5CzVڻ'&4w%6`&:vn yGWƗcPBe\r#a z'(YotOe2` ;:%`v GfӊEY˼acc2#}_'*`R> uQ0?ې%:dzm(]Kj5? Ą؃ՙ'<P _Xہ@ɤ-E4C ᓽag'˫ag$_ e>y 1݁h0qL=\T>`$F [ʶKKsS+B_nsu (Vp_mgEf-ju*Ě̈́!|
+c_[@4N sǝhs̕}Λ,HÒXٛןo O:F/B4n
+`W(TЧZrw}rOz͈88%W RoWgQXCdϖ0^-)ڈx]6u/A_NJC
+)cHD=9YEf
+6Q,/ 8@=1G$2B"͔
+ b쮢\Yw _ QFvK!z1ʦM<욡Ȧ5N)=jC<zdBF3<{jKT7Ȼ|x<[0 !WAh[` mNWfFSlDq0)5PI^V0bHCWgQ-Qj2O=FsjȤpgHS9q)&W7E}ހ0g+@د
+\<_-ب'W…,XN+1a a(l>Mz`^븑_dbA!H*Sb#Q QUm╸QF^MPHVA.MhAC\!_vR3
+˼L2}17(KM
+sۼgdă=ۦ/b0N3܂N7:;o|Ji@-s$gUR(uF0=N Z}fSec(3R8!`EZq- GOfKfnY!Crހvn0ƍZN!69@x3K8`~Φk=*û)2nO wkRϗo:2#cGJ2mIPLM-7Q2Av3!\ͣp?2Ĝ-BN*Zw' JAZXؒvί"7@ƌ>\.o̼NYtV{unNEs/߹r+G]yLq`=ݟeʏq&ԪcX
+gK?<) He3^t34&w)izo< ӉgiJ^:PEamht(#:G!ja_Z Yc`^SD,d9Lo׳.|]@EF|+Y(ְ+kOB<^S8-=X9[TYq9 [RJ_RaqC
+|5o~i<Օ_ X vP݄WkA3*1d\bZda?<L6Pmp3PD!f\a)mDVtz=I0Zb&to]]P6)R,+u V9ZA0k,f'Uf #^Y2Z",CBx\'%Tjn5d³G vS E٨_EE)j@M+ᒂ$}kAr! DO;.50UI*n3 uZg~
+4%Tl]LtM虝pǕ"g2we0\O<rfi SB 5Jq<^_`:Ķi:sdOY`g@B}z%$ jWi\Zvzc*</]h>,Pqj;Ҙ|.~OFTY::Ұw}T G>12v1Xe#&ڥ?ʌ ^Q z)"*{ o E
+g7̖ARt׵(/,<H2C>̀.1DAA%)^Εjo.ҝ)t?LQp*{,aL:[\"GbJf2Rҙ=b?&yDʻޑHvduaٜgub7vPԐJxDo{iM*Ⅳ;Ȉ˜<Q HU"&|>-pLzߐ ;tDlR%8笍1d%0$YN0!)4h)Fț=ӫ嵝Z!鏃<BYeԈki+B|}V r=ׯFW@97"+̗VOAg6i02V70Բxibx`RE[[܏)9Ү6(_.b6BȍLnYe(6L conІCN>$!
+HA9DO;&!Q(=KoQRLwv9R`0qE] ߪԫyQ8~MP0\,
+$upyC, )荞9`&M+0S'Ae{DB[eޔDP$v-q$Z-@Hd#ưmSו+6kBW1{Z5̱ue)QVT@ ١.'Er6xx➥s^gq8Ωs/ZJ ^86hp 1='~ c!aixsxiȾ)Adq?'.Y9+0#!g1`H1y¤Bm^E0rvz0z5  W :P\zdyvLkfXOu/so5G~Q娇1^gdO3 5kL_9zv)&̣ Le`]tliacn@WUjfmA4uoZr,v v9n@?tؖjXy}]v0D4,5&;te>T5š6UKi܂Y:ӓ_׭B(ܪgJ
+Wj5OzMs',Zh%N{ t>
+XJv rج%d ߛ+۝U SeL<5?lg叠ru34!O4S+pr8 [;)KQԥs1
+osu,>jD9H7c6!̙)¡v HćSJn=ӧ<&'ͅ>wcqBƺ)s|lj;Ҳpu)qWAsءbӒ14W*˗1`pHdO@!haT̶6O
+J!%8*~h{ 8@iw'6J<`rinL?U0]M
+X4{IeG5c,a|$wr@(2N+Qt+x,':
+P,mWɽp9ܪ}M?Im΁ y(;¯}gJڞ@dQ)0gp
+ܧOّr arUub1lyǨē`ssebs2lcnuսs9cTw&<~Q% ܒ5X &_Zwj
+r<@}XKa6w4%8c7O&5}Bjkn;5L!+!k<1֦H8>Čk2Ǒ0\EsDd']v+n'kҧL4/-Lݐ_gh
+TQss~pk2b!)ěL 㘹T,dd>b$A< f 4R̂#&ְ֚@Z o 4_,{sOH78Q50fEӟ< _4T[Za*2Z4"dUOE/Kb99
+]S~0Y& $yLE{bS\~}
+KضЭxD44ow.En6w5)VeXbσ<X[Q)¿=`^uܻa6
+4~v?dIP->~nu|Eyٕs8>~MHGjVW6ʪ>Wi_umM
+q2Ŭб&P%8?w2D\g1Jsn}ئ-1474a
+-*d=)b<iKΑ%&(jO*Nkmg}c~7N`w\DHl[f7a:YŮ7Un8?s-!g=߭?T`hH
+~<*W<;Ie8Ylk;;I[՚7޽&Y1/_Z%IdE>W-*m.}M&t cI`SEdmD]c[8k̗U]C;!SCd!KA2+Ewo0` =}-36(M+ș~;sdRr
+cԬYzJ4aּIG|Slvަ
+5ʻO<w*:_9.^
+lАcwQSy; ( EyP%9'OCpE.^ f7oK\*7x& f2~T7ղ=MFYHp='!ϱy D'mC8/Ak?Nߞ/HVfkִrct2e&סjWw|q[NfUx_
+!PӢ鱕6%Bri%4AK-zuvvbЌ}ͮ!_Vi·C9BDNI6ȱ95P>AmVS7cѴ)?CMƒgP چўRwٛX /vxkS#?JR
+:n}LI44ykhk&N!!l%i2ȴ?CϏ *"\%+(,:| z7%ayF 
+bfR<[wW
+(Pz 1AT (@p9Ό#q jyYF:1L>fEQ>ؙ!5_cmi闥lnӜx&RXhaPR-7W*Aka<ܓmV#GK!]Dz/Gl}MC3|% РLM]ma23}mv͓<.8#/I˛w=*C$ݴro>,T$zmIaE(B92  bU M%cR{g9t7<@RR?ӽO<d`Ϭ7O+9iowMQ =TT.uzy$1m8\Z[B]`8mKmCk6v5"0ySGoqh*%`HtIOu^xu#8/͉M:^YG
+g*ռ䅏oF\5| "4޺޼<=ѣtykWIۍ@K"\W >̳F[d&2aH2Qò5&HJnɫ!֝ _{<-2fk~v̺%/rޟo֘+ևq`Cx>Yy*vEz} +^7? ڍZn^\My*Nh|6W1PC3*Nj>Z۞HA8SfָaF%0v-r1v f n /-Ǥv9XLė(ṳ~=II"a=~+z7EZ{X[i2G%;//Gnw?`RD?3nsiY2kcx+oz[פ)n<x)ay ח͇4ncd†@*xYDkl~NL(+-!Xپ<A6K;)ZBhF^>N B= =F!6鷩I  ٌ_H#EfZTzqF],7}<[d: }{e[U,Z^MmW T?.}]nYf G6yR>0kK <YiCK2DV]M4%`G|':Omn%myk(69sP2&)2w/`BsNK_gXfa[&v ,q rL Yz" 11; BޟW€x{%qe8<A;cR>ٍެta9-z]XЬq?, -(Q~ v
+Ϛgcuvd{0}x <
+4%dp9!-ogG"J" "'{i8 D/z Ac!v@,$akbS5Qm)!*`m ,% i!! ]'OִZˠ)-g`Ĝ/Jd8"ߊ|/'2
+¶}Nt] c/J0 1NL7Zҍ?fV6d9agW6[ ~rGxVXlPڪDdSцsL.7L8MmӚX/y#-UYI8)JE;r
+>"hQ,E90 08SKՈl>F%ܤTyϻ
+9 AN#H\ujdl+*ǴXKn{}(L YObtnxR&ѸZg ;@y (E doʵXZ>iPᆬy\4Ckr-y;3ɐܣl2U/pj#V-) P7HǷЄ,*8{:;QLh"
+z ^pq̛x毚h/%b2_El?$שpBJ=Nм^"9|
+dƟ[#]>̀t|CXN ~$wՋ>C|G(UO,8 B$ƥy&"lvrVw@tz$4f-^.
+k#.d]˷ i\\xgx>=՟#2FxXTTF!y,:^:Р8cذmfZ2&sE *Ee씚"R1T|Aeϗbp΢nđmz8OyMOwcH'A7Ë;WIמ3Ikʾ83Yqb83%f]n'[%suj|µjkW>q&gS$WNոV$
+fgVp$8x:%x\ -2mͮ`h@P9=I(Wwl>{A Sx#~*u]7b%PER N_Q\v
+̳`QkȦ)fci\'HiCR~)95?|8sL 96Q`E#`fbcF$F
+"UdyxyA~d!Y[+X{ikDd4ci2cmKYK$M,I+s7(fi'u~d)`RX+dC,z>OX2Լ Eʸі>ZFs
+W~^ZDeqQQUC%Q<Ǯo: |TBpRŠV.RU̩ZV4Y8`C*MR"?J%҈<|)sDLY[^7֏,(9؊?K^>!m^G%L|^mбBUn
+B7;Ȁ"GfWH.-KTiÞyx<aGҨB5p˜L%ZF:H/Rdm勝i.Dw5Ɉ+
+<q9Qѓ"D44sPZri,@>oΨ`3u.Џt"Z
+V;
+ VeV:ҀS9|cj6'Ll19p\q| 4v;qA ګUVZz+_K[[u Xr*|,±ci KmsſZE =΁*NW$Z:[ \*u!2ɖ>El`|RFF *
+By--L"1F5'҈}ʰpMd@5nAt;Ӛ;Q,b /hO:&7jlUx;vJqFHf 03I@0f8jS+Ć7x6}t9OZ nL ٥K$lg> ^EEkLXjm?m~f5&WiL5{.eZx9x K&ڰ?&m~-0KS8WkDPז^KZj?n0fYrNY6^=JxU\G_TcFVQD{
+coUn&X?G}*N
+kc^`C
+fȣSFC;Or3Bq)9P+M\
+qTw'Àj"}fgy:js^T5G`$8tn#
+K]|]
+]%f
+@
+bi }MtWUKQ'aƅIKg[Mqy;Zhrmj #13 5h\G.Wfx| &ڴ{Jo4lmeeᪿ*ʏjw % yzŒe(
+TR:Q!7F 5QUiI5 O,U1"ݎR%_ i ?Up N?5+*]T7SF`
+oX/ >O
+z8`
+2x"U?6].(<=:`9YC4ʡ
+INw/oseA-ݍ&*[vHU7ees\?EB$=nO*]m9fihAF58L*%8;=Ka|/
+u$,ш🬵]AlWzP!&E2eLԴZ$4*l1-(mIp@OTLЃ-@z̞ڕ5[^=cO!rwH3AG 
+ aFf=N!T4F8Of)>z&i6{up{5~</&Q9MUjY )r
+vFTk\,4J^ fWu!Cq r^JY-KHr˔}F˳'LLPɝP45 F3a/tfγPF +je-dk<)P1`Йɤ}ȊcM;QUIjC,Ή:adȱ#=u7[R%m;)t gFޗߊN,x ^/>nPHc+mɻݦ/иZ+ M
+EFbBJ Q`.;U8<uC|:/RFQTJaIh\L@%5ȶٺ"Mg-_l鯞<cb1`qG! ufRg[qy ?D_<ZLz9,R\Ic#4!>%VN㙁RvL\߄@xv43LBhֵvtF[1۩7AF`7Qb /mVE;>
+Z
+z#Uq)QP^*y4{k&ς#mJMTaj gł8/fچ ǧ
+ՌWZkD9 gLK'a| _G
+]2_2@#϶Z7, }08ba֔7/3dF u<M`:bRDI!N!OLU!yAeB(}W-%)D(S0ooZ=$V7A[P*AR,@Fs]+0_K8<$M`[$CD8,K4Hǰj+%ɜsETNN<?"|$34Xa촸
+V aXΗU]w"8f@*j :Ze0)y
+ٽ٦2YLcaz 1ZMCHh7J8Sd iBHKLsqci؛
+~y
+=
+5=r =B/K<('
+]Jlb/N}"[&K
+Ugq͂Cb6 Jܮ*" Uن+R1
+R7ZB2#M dQ:N^U
+
+Y*!
+Vp>}˦錖wLs$OE ?T6^[*VN:FQnY@~݊wcY4F)~y [ H6DN| L6ɯ-< % g/!7CCX9]/)_rBFr"3ldMK!Dށ1$nOp=*3MT Orͻ5HuќY4;J#!Stu }.MG M7Cs\E\:ȢrBfk,]"`r*;Zl GN5G:JP'AhN=
+rո=c^:.y'H1Y>K$)<}pI_sXyx
+9ib|ôQRSh=m 7JbDFʊb a
+`*!t@Aj`N&84)"%޵țq㎙ (O +HK5dl^y
+#U3 P,HV7K
+".' yQ
+B`b- :&CėMOqD|7lIY">C
+6/iA<9@B3iǹ5%$wY]Bk<F uXZ e >Ǒ ϙ4^<86 .do
+%Via <D;fN{3]Ǜ OIc^B'`-irn!*~ABe5,<}W`do.h0ЕƗ-T*)%yʠ()L~ؿH|(s^Yﲎ*] _GwῚP%Je+dKtoE1l$5CNԄes͞^4Ix&U@,H 0y(YP栐Jqw8Y  S sW NqSVwNy8;qJouc%S垥чBOtI
+c"/Esf/L[Eep+{09pJ^]wgp`bkD8 h%z,{죭. 0';d$Ƈqٹ& vbNms@|0-U=6ix8GT ra*cpiA.d#˨m#oBg}!|IJ wT@3BD`$q`,!;>fՒ^&]"@D +d[Ɛ8"PUxޤ:mbPKɅ5߷t OcIM%m`Rdr4\Z$Qi#?mro:Ւ|}(Z{@$ڽd:^)xXjOkјmx]Y;j 5f:w K*K6&kd4W0gXZ=@s K4F[e1*s__aQ3D
+HMr\7 O;"@$2HUV@⩢7UZXG=$Tiģh?f%DVaCl\o|mHf[:9ͣnB.-"ǹg5?&Vkc1UbL 7b}5?~Gnaf'@n4-,zὙ,Xa#5 c"_n2_%3gf\:` P>7E& -/nݴM˺Pcۜ1W[#ӵ!hYodW:qJkq>gI}U4&:]ᠥ9=+\4жO*W7O"§\OjGN]$s_h9"6,o %ɂh>V NI<L6Bm^%wSp:0Mi0ƞ#JθĚ4a "0  I!@7^lu
+~7 H,$BC‡`6A\`?^rʔ]E4<O0_ֆym2KV{PFQfuS<F3zY?:)i_JN?:@O, c%%cu?zU3?ZB"@݂&,A
+1;>A7׽G%s0;cP,R'b'ǟ@#RjZׄǀos@dm
+-B1)kRіBZ]u$Iu1DCWMhO.Ɍ*h$I.^"cp)m!kpR}݃5IZkD(HkAH$M ؒMGNu9;RD_ Fxxd.RMU%AǬT*}U!e r{qڮK$ &jeuUV?|>ǧ˱ JDjЁ8 #VgU9UIu
+Nn"Ub[[ q,%DFK̡O1[}v͜Vxv,:Y{wOxi,5ߜCM"W@0XFO'8^:{ >,Mb2@
+ӡ*iIo3
+mxv]2KMef3T7,>Yڞs+qqO 7o4oamgZXdIkIaF28n@{2jewipӕ1ФR>Y(А0tsPmnD G
+@J#egcf#'| &2D ңl ZZ*t;絔C8Y2Åj\AYJ{y8k@Pj>=&8H*k@NhMdXOJ '8#
+G CMP2V+bBƹSΙv:GIעMRe&y8&R|B >Ρ @;ʙfa;:xE91'Jkfѳےox_#he o ;
+b$ C:g1Zm\BHCz HgѲ(i}|oͫ>o]3Rوݣ(.q e5Ks+(5xMH NʇeeY$ *fQ&EY e1$p ^I9-q3Z>unƭqGTajT11p}iX,xك 6V艑2(KKH e+_YPȍM,eh0l+,*o^htvVx)8 s;a<AqApXX}4TM|b&XzfIp,
+;LI)ͭ62TBlRdx.RCD)KOl
+~XZnAɑ| deH(2@6rNtϗZg/(B=Y~V%쭊/>)}A |̖gKu Ó9]۷<htFptx
+.~2 CrېQߚ; $VpXA8i41^/zvbp#l4YL<ͯ߄pURM/A܅kWRaa2!ÿOܝ/ j+1.nZ(q̪H2nSXD1;ŪT.S I3L.pt?zPKsģ WMF&R&V%)IaIS.穒G3qLh}#Xj
+5e9\\DiY\h!S>%;Š\aB8zVBu!gi*:ԓTu)Вe`4&qnyWsFM
+q (~M{J!eiBDFRQJ3t!G50\,IF'ǔP^Yef fbȰg$֢?Qk\$NIoK[# a%ty :a$V3K:5}+_! .>Mh0Gl+EAn;ۘ`E#9,2-wԦj!qŽ{l@Βj^OHl:<Yr4c},X5zfI-"i"31r<} NR<WytV%!|UPፔu%į@R@"a_E><ūh+hHz:1APL ȌV˔%ްQ Mo`ek?פ{#83mj\!B 9v)mc1H5 KZ"¥tm"T {M}amS=¥a`ί}Zi7!È|nzM%{MO#Hh8Uӛ7=u2@{#ԣkMEh!{
+e'I6h*<|A\MaW9p?V2V@Qe\1 ` :d[([SビIf`g,Y̅ni^? ])od%$1xov|6$9׼>ZM'_r$Z*r? }-}9p"M}9\Qm;fmKn1_W" JA+h!!=ĥ! (Rkc.7)Ïn S~|l$Ǝ ?"+G9Wo&R'iQvr3fPve[B CmٲoOs4ś5{ q߅4~Kc UZyw^"' I'dkMxj ȀT#/WC
+&M٬ EGcR4G\<q,?6ek[9յDF]YT1i\:_FyՌMHj ݸTW:n[zEȭy9:{ g*;+6 05-8NŤ*p
+866:kPTXWbr|wvC6rb>x='=%5TS®52ߘKhl|O<LQ:j> Iך7732C:s[{a!~nj6Wٍ&$MY^M5¤j.f~c/Eס3h@eOW=_p^dI\m?TJHѦ=;E*s;m%A:YWIo( %ױyn>3 EEXDarڟ&3r8]ROeeD} j7 ĺNk7wFG3/|yw2 cV
+Y k ?L֣4WREbHEai!QE.dyW 0
+fgEK0u9P!FI~ ms?`%K,NfjF6ゼ޻(R-C;vs
+ð`RUm ;U݄NeQ]/g':I f`=NH1+)BYE17 F:]vtj`*=ʞeNiFQxX:P
+P6 9ҪcUř e(P6,ӯڟlX%Y~~IQ2qs&MT Lgi5ccB0Som}DeOqìE4
+[lGh+*2GN\mS b˱ȱ! uq\f 0%Թ?=rKg
+(
+lHAhM
+ 8,RV"l8| .E>,ᔬO5uQ9(X wۇ3 lhĝ St◐,YGxj )FLZIA==B JԚK1) nَ.ƽ§&C ?0KTw2BL8[~o曒~r<W2(lߌK$9DO0wܢ3Jrg s,i43um&&HH٠lKڵG-Pnjq}|`Y @Hhϑ3"a[gDo,?T U0B^3|hS!|*b݈~=Hk*<g*gW s/ʘrc
+/J;/EcN
+|s??%e^O)LXDO[j
+4ޚ~h9O0:,]-64Q6K e=
+%CiUbFXA: 5ZuK|63̢maX ΢RŲC(t kTD_ 7!J4` a1qIgSZxWηC <nr82Sj?e^C{iz̀pA6(;9^
+Ɛd9
+vg@M?;6v<ﶟ%iFe[%趹h`!FuvGx;M> A]C]r֙ށ;O($ŊEڲ
+
+"}N}|.&!i
+B:><?E\CEzDR
+`Gr]Qs^(NEԙJ~䇏5d>vU;x +c0W`sSnJ#  _lh+%s9VAQQ_5 v5B?h(9a/
+D-xQ
+e1 hʎIb/%
+@Ɯ?gHX:UHoVbx]v1wT#zv
+ V4zlg.nctӠ({
+ebPy\Ie.Da{-Z鍒CqxU0ч?9o
+a40vnʍ !/ů\S k%@=TNe1)a@(,ɓ!//e$בxYZ[p[j)Xɚ)0~}+i\EJfrL5Zh-qÈS%EL4G!wbD ih&&EScMo2,Bq Ls0ְJ6X<t%3s=Ζ٬a׾\H!í'Z"`w2ga+9ޝKJ<+h }Y{QYdmXNhVΊle%ъVn%O i UpIZ^+*+/<a@WV**
+[BEer ų (e$R?%dIZ SLX)ʰ$dSNMrF ΦVl8EQҾVdW-_ңCұNmC;4(JM"=!riJuRMUq/PQc"\J,Ǜs2wK
+t!bC`A'FHI_¦6<,~}SfᜒFhaF[ŠUDx2LJ.Ӌx:dGСEl.)%+޺;5\%H4x2ƚs ^Y;1=msGjY@:ΗG((ஓ^9J;%HI4dsp!fpSF=WV6 r:O28xA{)[? &X1/+"bez7B1К87%fǤc ɮ+Wf22vRX)!937HALY^v@ lF})Z m5c"ќK+puHvjQ!8<
+=W@T
+iLz)ڜ̯su02};\y ? : (/-4]XkH{+/UX6pc̅1,5KEpW$VWYG1M|>nn\#,'s>m<@*햏NJ&
+F@ZH;
+eҤDP![A6lf4vVɸ?Im2#02n 1#܄ dÌ& }64i[L +'Pb;>gGU07ť.d*
+ށ$kb
+KCl  ;V]Wr(DrdEPp@2m%e]{_>nEE@2c^>sz|NVza
+䭬Go`/cyl%P
+-]q.3%@j%v_A|
+&e %tY _%%nK-XR</!
+ًqb09Q:
+
+p<kk)Ygv!hl"ϗ𙚸sJ7Ggoyҁ9Kʅ[bbyh%QD
+r vI쬭 ^j
+s*" \PmI{3 ~C'N4`X4)W
+?&[+SqLOJrvT*q D
+`<yr^}2O^G@<RЪ$9O ?
+Ť "22qV,T=6h
+7q:;AՍ"MzdW`PFvCeVpq>Uh&ԇs܌$`nm,G, UdOoB)Jm?SY0!_MJQfVP51 \\nBf/;s .n*\+v7/
+D Xa! TT`M 2zcpsDԏ}x&memNtlntIgʛ2pt)/~S]I9wAWqAU0z1dܡy}T AmɟPKԋ+d TSY=AXh]FY1KL vm,b-@[dW6Q:Ax#F=R8Dd$0 |0` 1q/h}$:sFHl]AzcҮ<+[р5;
+/1E/):U'd *@4R1TȌGً+ߕ*<9uʖBAaCd#,$b[C5((Rr^`
+w L|^w/0M.6(7dF?ѕNm H*p@\&6/Cz>ZI[T(.>I@ Y?k@6XYZ_j/c u}G? :wu\SUN˒w'7zV|w'Or0lhE/KW%'RTnVðx:F}߄ETw4Ʋ$eɨ VxdgTq=Ԗ3?zkЉYf)Ǭn#s37>WE2*e/Tj~ owDnw@}M29X\A@l;B
+ItTh</I
+D12WQ9T%d@F[LёQHt6%M?o.:Ɋ1;&2L_;ei}q.5x 6i#R 98(b;+/6j_!6ʵY ՐD^&8/N Io*YܾǦH%$
+??4K듌J @.M6wb/B&䐆ca]>"U s*N<2T)ț,.pdϘ֖6H|9!K V`_PzͧY0Gme];21oH/1/S'a+ )CGsJ1ćJ`{<~Q N 6 yђB[JLK BB*I|hV/aomZ :RyI` XS5ՙM90[tҿ1/y=p +D5xg+ݨF9#CWS;4Dtr˷N/$rXU8!, SgvL
+$*K2(kCXCdD u_<ʫҞbNspu
+4,C(] C(/no9.<UZ7@PSU5!>DCф5LW1dz^6z&6s>hˑ iQ BHx\a$J w~ţFR]
+n(F)5U`ؙH9C'WB`-6
+Ʀ$R W%Ou7}t'\^_
+j6A,;s@Ir9TheD>&g4,12)w0Z5$Xo vcR>J"Y:*Q,3B3`j)""|g;e fT?-@ZaQ?S(Rs?[l .єqK[HtHtDGMZDʬ*5?\rL%1j^K$,JYޜȧCOiO;oFTx$~iJO(?]C 9
+r(2;7Z~\\>pt) G<p|-z%<R|FTo~YK|~c!1eODg
+{9)glj9+W&KZX$RgT-ȐnC>`QA\*եstO`E sW»%Ю!p
+(UPޜ+VFj]!(kj.y"ԃP`k
+3_g僐3Yɋ ^(J\xF'G2Za*oE h(,@dtĸJYIX*I>ȓ",Xux RL _ߦg*ƗVj3SagD"ǘ d
+i#ECXظqI}2hXt9a8TCV5!ZA~&|OB071/1GT)]a1
+7b}VOٰ"S,jbJu Q _ dlm1̻~.
+NU`E=V>,ۚa=( MGx2 ʖbWYޯø![≌i3 q^4,]fR>w+&Yv&öI ʦcrD%~f?{~Vۇs&n2]$t 媢`ֈVC Of>z@7.R7% Œ:"`})EZ~AxڛhkYo
+)8 PQ|B$ J,5HsЧ( @-YqDG&ߒPZ <'|n%0}ki.o1<\8)j#V1I;vAmӔyͿ
+ gJ4sU!FOa(]2te`S,w}SHGcPF}~PBjjѪL_@Q0 ?$G' ú-z[V U'j!L2q˩%'B}ʍ6jSV/3@&@a+٪aLx=@DM)˩yCKt
+=6H#$nJb~<n|Vv ]\L<D8t+ޚ G&/o/duL~LFA;U16FS 2*S$E!V ɿ8몛61Q{Lpd_q,X:d"7>E/mbBP\:Hc! > qA7U$Sɢ(9
+r3ͺ'<`8" Xd[bNW"Q۸v>+Dq*yuM LcK#C W>Ø &E @۴# bD)*It Qavtܧ^,& P<(!-2~_E,0Qg펚v2"~%oqb
+lmuL,mgm7PAhNü$#X\: T#s1 h=h)tQat1,hw]"_3nJW؈k $aNuDWtât[/%-">Bg1`;ޔ"?#j}sm)aj 5̐e:
+ˣjqP+8=81âdDMYYDA_5H )y0b>^Y%alCi%)ڶL׫Ʃ"k_[Q/$|1o6I N)kJ jqNxV9*o^uk(?Nzd< uNFG'oG?2}$(Vxڗhy+h۶;2EږDGURd7xLɣ]TmޗDyI*ʉs+\FXdBG
+.9nfɆ/l`X Ϟ,4}shoo̳c
+$[CMyo]V!0 <,&"=#YwgE-3i7 w x6{Qͬp0&9g9oJ^;
+t3
+_Uċ5?!͛ʛC0EWy6>~oC'ۊGVxr(RIm) +ABanP*BJ,Q hѬ:*䱎aJSY,Hٯr.]S"CMnt퇢_7EPs'Y)""z
+2&ê%^Ԭ#v`J I`ywF/)ЙsB)c/6e?nF#305ǃYVqpqGGdij.S$9xIoD{&O'_*R<B-PE-x<9qaNE%~ns`}V]ȍAPev4т>8W!*X`u娾/H7z B
+$I+lY$<`Γ)q!,\sx(î B5|`!{,FPa*YȮxM)^'O eUbspa\%W4-v2(*H U~i7ka8t>(dkY Sb*2#/cwDhΟE'F<UaHH[mDt(YϠKFq$Yt0
+L> ,`]J9EytMd ,rOlrmp G͖.&a\bJD7~hekꖜ3\)f\"ZG
+HA\7DO;$,} E̪u<
+u}
+.g H$M{wi5>FhRKoih(ފt֊4Ԯ>J3!y\{Q ?bN\Fqy=?`F५FcE?~1}?L^kQ]6e]%F7d缨<SKxU뽚m a#xbi,5dԛߜ|Mfo&+xT7;xZcrB;fR} H/)k
+<8EWhCB`Nkv^+4ON9VH ]XȺc^ysGVx$G]>Ê;@OE%Sg}=5*TAɾ BVD1bu]u*]: K;MAV5qN }2X}R+B&q
+$4R(4^ TkTi;$ؐFxTY”(]@u%/8)e! %qCP #5SW4[N>@s]|} !D%𱋙* T=S[ p]V-* Yh
+25@X 8˪<4?q&1a֡01 +* "jLJn7} G$ _ZRL{O0!f;ʸG6ǵ,<-4$rF<'*jk{*6{򎌗FNhk<@*脢޳q Ȓv)/H1#& (l*Fc T+Y}{b賖#.#bhs0I 2&נ΍Vz}$hޘxوdS3hjwAt R$ *gJ:k193sNz09>QRNd{^1+V?uEw%
+:mȘ `w%<wYyf&dtwU ҈2[~ԩb7R{;gH=(њ"P8tߏb6"U5ݢgߩ1iia *˞I3pV/١N;O/U<t$9ɫ*T\2_d'DqOʴ8zVi+΀'4̰ce0#6;>5)/6is`n ^a!U. = 
+AWl fk;rٽf z#{u SR֜\)b'
+ Fכhd IIsZj"TW! >㕹@& -zzZW bd[CS2&Y*)ou
+hs!@e,ۛ o@
+RnE6D ԗ2M#kP
+PߖBz{3 w9 oKOqԛs^JAӫ|fAgO\T?4_eJ=($~!*l
+8UH3 R'{tLZx# DBoM2݌y
+ !S EzRі{>BAF,3ʧ |[ crϧO`kQ>9
+o7|6076hF2`g>XQ |OWOL~m3Χvv{VEVFsQ> 7O\+a%'VĖ>[Q79sKI$d˟pEt
+ d\TrgC@yA`XF<š\,H4hΫF bGNU?'ep}bˈmssTN>43iPCJpB)1 F(+opd qF=Mmi8A3 /E4fl)Y戇S0a!qlg|5+|)Ti[ <7=A\f9\mnVΫeݛWݘI8_T1nM
+u(HTG+F} VkQH ( 3rx;&JK$XEe<bKoC@dB*/'`a#"snw\!9`RHdD-; Q2]ɥY3H17mn<]ҡv@T(֮ly1d$R1t9͉a;osoΡ[,\_}@l<%غ[ND}F^i\p%.7n>=& GP'KK$/ 4
+0
+X %yO+XlÄ T,9t3K9e!V 5%;1a`a.=]!0bZّI5;3/
+_)B PvQDo'gA
+b4~@D(yכul+|<&(Voj#d u(NL #HeSoJ8;z*e*T0QnJh}=; cLdżмF4?fzRd|@Lq*aX g@Pr$7E4”,N}SRL?/+~ .d$t8 WWCv$A{PKL܉
+ާf0qZ@CٔQ R;TFK[ƥCɧRF"Ӑ- nIDhx(0^;(>O: M
++t~曒t-:!D t1O ũ2^8>7 1d%^5BCxa7 byR󙞩nWS)Lhێδ!ɫ`'AI,("9d:^#/C,R`pZ-R<}-'`1/fRm󲼙ɨrwɑWnيp6
+w[!Pؔ!, 0Y9`xEXw3bӆ"g暬0˝I`AThTܘk}}ou)zp1'>iD+jlGyp͡SS&D^W'6r[A !Mn/Ά|.R8Iأ-#@*N}p)>!zd$WY,mJQ&(| aB:S 9, A>V!KK>})0
+Аf"I^@k@3m2,̺LxUئaLDl(A j9'%;1 F|$OH;m  w{#
+cb+\æA,5L`A9WҌ<4o"(Zb(*ݬCZj4l-j]$3T
+2S!tD
+aۭT]Wr6gf _J^B)!' .mN)`B)L'Ҵ_>mt&cavT]8Y.k?$R 04'?VС1dk^(Z;W.E5RP1&HkO`b
+aI o[!\
+ȀT‡.e((R;59#ٝTVYgNc) yY˂h|akKmRKԝ
+fȅ<
+$!>*4\!Y=_=zsZr`őiף+`A\GX2 &agXtdLמ t̪]\[]KfQjE7KfUaѷ?;~%=)EǓĚ[Kf[5<ۑT5*ŷdvCWKf!Pzvb߁]K8,"FPeZ2/ҖI:ob {I!Y(W<*#nb%WfU
+v&8MDҬN
+ r5k OJ X2ELג+^'|hɷ<` иzreA9Sz2ZuٓɟT:f@@[TKljz5ZD ]!4ݨy=Y:Y,zRKz 8-LV *Uň>e9bt Oc,\cvѡn
+bDd᎝BX.eh1n%%#\-رGAVgstĉ?c|zl] .CNXˉh#^CSєyAUG!\?f&
+=1&ÒFo);!*!Cs4ʪ|ڗC UYÀ@aj㊡τuSѱ
+,S(B-LM j"`g`+1Ȭw' 8#<ynvkד Igcut_2l
+
+Eʻgv-:b!lĐŬW!C(ڢ A
+rh)Ԡ&TMyhZǮA_/_x$6ca+#" ?ͦFAE:8@Dm+NPǨp
+> 2v j-X9j>b_ <)wB3Djԧ~"Y$Af)M"@?/BXfFB'IB g1&ÉiNQPE, Qd+'d݂>T(i61aP(Z 6)Qӂ#UݟT EK Y"bC"MyF+Au'\׶"qL(k@WʂN`f&;=C]e$ 1IV
+FdsLsZiǨ& <!G5k-l8fm>ʗh2Wf,HdyY(eFƙ(.$
+F曄.K!
+Gev7ǂy`ku#gc.Ag>,'DK水97kuMv
+DEI}#=nxᑡѐnhb1xh$rm{Z||s8RB_
+]Ï>IM#w/Vh h%{<@km9 m`^j:}qeހ$)s^_žd7<GTA;Ǵ*.G&e K\LT4u) 8'f,K&"6St- L-qMڟzC2Tj92lЌ\
+*VI2{ ,mVVdK:/Vf@▾D!Q_6.UkRR`V?<!
+Rd<&D^63,}! (y1%e0z*gc
+چp ˞D"YEM49 ]ڈ!UՉuKck%Q
+3{4 >ȊJ8GTqrԭ,$ƅ˴r 8S iVfU}p2ΐ_'q+rl,V J~4R\6"@Z(!Î;E= 3kF׊ʛs|2&:X ;ţ44N m̘2:CMϞ}_ CpBΡtq7)Qp׮wK6iz#.۸B;.Pi:,<'(cf'N!NDd#K]qVI{RA[P R߉ow`9PH1%o[>~nj qKRt:dp4fz΢c,c$?a-mSi{6Gs@|}UqCvI \N ,?<M
+~'銑O@bIyOZz0~"UӢ?܌=Ƴ
+SyToZ)S8bTK &:;>>Nw՚f/9 WOz
+W~Im8|}9V8rq|OA>=
+mҤHJ=N ҈~7 8[(oq wflr ndG}(hisUpczV7GEۂrU7ќHe⎲T`.:,x鬒Ҿna⛺O)h ۵[[f e{.}ovnI8Wq+&r7X
+nGPwq?D 0(n 0ɌU~7@ .~Q[ ɺWܫh6Ѷ(jfd wm;aLKr^YԗhMmN6"ֲ=>/Q &IW8Opm/ujᮏ5Q
+,uU6@fŠ^
+
+"8؝1%;zZګ(OfAccMAE }屚DaWԵ&\Ӎ(/!~x( vQCϏs1d;j< s9ƻJȌcs{s+PpC)ԉ2Ιcl)0. bb<oTO\WCL¢̞M99> ìsӡv:gS+
+6e-j$?<bAUGTzNHc#Bcm/mr:irz7R
+B5WA-6Dk/ơ6Գ`ohpn|q+\
+8cu&%;m^i-XNK̸h\]#![UIe_A3T9O jw"*J,|
+PV}iF8 ooa.ȓzVŒ@ѵƈ7vNK^wI~b+o#/,֓rU 7f~_CevI|<\o_6MFѻ| pf CFB~W1d1_jLg~8  InT C,V ±2и"[3:*Eј#
+<}B*gߥ߀#ش 塗Ddme
+< 1 i#NA*i)RUEvq#8fmXLigP~(
+^qo/B=u9RIi\pl?!0Z`!gLX@0p4.dU3fI)n vCy ϮHV_71aExni#86!CrU??a@hA5m=P\aei{- Dlrx=dB4@?$'Oy֋}:7Я7v,L;+Q9y@?r '{KtXR~Ro=KhBmɀ SޡrosimT)-m+uU68d;, ߨ\wV'8F LXG9K@_} ¢H0WsZM)hq]zʞ#K L}=COH
+Hƈ1pLI6  k d1iDje*DҢzIFd(-sdBe]58T \&k&q*x(D*%6^(*P" g =o 7J@r2
+%o1E",Y!Ŵs"d`#&9®q$x  f<fᶡfgFS& ͮTFE2998xup<tb g,EQw_ QJ>{H϶8 tSҝuHVIӸ-#ruoΓ?BaYmzsN, ИuoƕfY~o,Jznt$
+V@Up&g7z:N?$ 'r@#%}
+dTsC@ub1k6..ade+ۆL&ZӖ ,SvlmCxϰRɴM!yy-KΟU!sxrO!<@Ԛ#3fy
+Evz.%" HI@.BLt{FI.%u`0P:Sp^v{QC[E:jϖ[:d&aZuIt'[͝iqh4`ŘLz8@ttA#%.N:G)g"P(m'zX!h4qu2/mivN
+?YhL-g7=T95 Fo |/DiꤔrQW"%%8kFiT*WƇeL_u܊oВG&(9rylĐ9G0
+ &–f1əDˋ
+) c(lmD0lq}a
+BF 녖+Y.ָXCD,Si.[
+ /wF<$n+HN
+5>@;C
+u }7q
+_j9/,hdGmMX/f3I<.Iwy醈[X4:RqW!
+cZ
+XIt1/ή!}XL/Q:O_˺Bۖ<apowBYðӾNE?\["K En&`sNTo >BT3l@Žq浥U 
+L; ^ą3ԑET i[E9
+HIwB) B;ђ\,M"0,Mxrn֦Z!IXkᲸGb+L/U`4q@ML »h;<`}9 f. sܺ闂Kxmx
+4\ Q#O -ա"ɉEܼVS&j6(?feBSrj'2({༃E/d%M
+SMzPTSN jtM0<2nX V4D
+C
+4_G ,^OC~CNUW,f-N@)S rCltYw5*UU&+J^h|0>]xSV $O8fE8x5*`B(?
+v
+?ܮ~yOQZNL2Z0&ǘe|`)(*$
+cU# <&s䄍z{F[ Pm"jB}uu`j|<X O|8^rE pb Yۻ ޓiNgC
+DεW_4jWճ@V`r;h`+8uo2Ci}xX&W.FXʉ5wq_`2 (J̥e@)gr&ҞL.?ӹ3Σ_~ʹ`WAB|: ۋS?2b(b%ɯ^!EL_46:oSLFyIR<eQIdߏN" }›`eujxd5ZϮVꮋ1uMEң3RD~xoÿy}F\39GgQ<,Cǹ3%&IvJ
+df  wf!!Ӝݗymr):q
+Ei++Ԕ*_W!+%
+ٶ`Rп)X(@ƙ4E?>Ot@fZX9/ //"JoC}c;$VG"Hs+nd1APaFB|h!FǡCE(cmₔfHc}(&: tz
+stҴ{2N`L z<4At2 \.NAp;4TBD*J<ÕID7!Ux . foj-7KF(Jr){HXb̿Vt9PG/Ϗl{_<^k2,5x'"A {C.yn=C%,:ͯ5ڒ0(& =
+TTYrlp4׌
+12/bTΑ%0&,<Ej,tE˻/a9YІSUIvHs 
+H_g7W R"UvLV
+L
+pEr| Eålcy:΢1{-h()>} 8jtmߛS@aNllB`Bf5 ɑn$͇*hZSu ֶŅƫZ݌i5oo 4yOo9"يxUC >}MP]}M&
+rZw1Mh*
+d 臝{B* &R49x# : 3~14 Z|qعNF*2*Vt ~s;m"0A;HC,֖d;!Gi'l#ڇ">- Cr
+u{?ckycҦǣV;HF{I!5IC hMљiH2$FA@#\x.BQk
+h*&)OWFcԕݬvce8ʣ`x'N ǣǜ8@5^ȓɐγ/XTmH*HQʣm?-Hy16,Icݻ^{!ډbGB 9Ax<(PpjNh7Tfk #58kUU˧8KO%WIֲ.[Jij^ 쳃4)-PdE]̣ 0@ jNCb3$>QzȉygI/@8àE8YM-l<pA&,ƒ6,.qy!R9zȧ*\K)i())a
+^'CkwU=IDBڤ4aZLAͤArI2UfDqfR>|Uj)@H\2ˆ
+CN"FkW+J'}YN3>Y+"nQk~U+#GƗ1"0HJY }^.JXhAF'/vXH7j)ph
+Y'~"6O/<j~Yd2KRz;3(YL`}B0bKVK@.JL:ٿ&'y M]fTjm71:Kсrw_͉,Qt$H
+;,jhctoA+铨#Gh 5U-e^0-
+MʀWv-uƵb62HK*ψܕx6E}?E
+iUDsmT),@]|N{At)<y>ٳOջy ؈/5A0*D2-2
+(Nb7JY6,xl%iʘ)G^?j:|PJکwXa*|>d3ҹc&߂
+a"w}؈:ӊ2OĮ)"9@c9h"
+]DDqu: ͪ;1Fefg_M`qk ZJKwBTOoȡX?7jӵ
+EՇLP-A_}If*gh@;y":QHW8d1IL
+'-.N
+|Qd[-lbܿ&UYG3zdacJ@zP
+CY82$1 @zgPQy
+y/xgn Վ@4^J0"É7#wFAAtD჌W/vMCefJq"@Q#hu"SFl}PURiL% b(r[,eQNrKmhyPNy2v sm^ cd
+^_#jX 2Zq
+D(nU5v-,-%b+&,TTrܱ [q"L0d"
+
+7y:# ׀Q+NxC
+cu_VjFxiĮ_@yIcqzwc8 iN?:)Q~ψ+>>gNCp}` HM: lQg?^k <nJ R4E 5ܸg8l !uIќQc N@ ]5ǜ.3t"ޥb{}Cn`R"|DlpQNHڐ !~1וѥhWDEfF,.ErW3WTM<>83K%nBX!j
+R^ڋ~O˛zH
+,D& D{LCYBVL}x.6?nMvOSOr,<ÅB~r#x ؑ~-FѾ伥5.ZX1Hd9w_}ԅv5]GTgK!vXSb;UD6E>,PB<
+GZ>VGJa
+ZNo=31 > t |dEm>.58$tƤpQNf<h~5L
+5AP(p?<kP AQX?+6ȴ-`vM4e%.&C +j'@
+0/]2`D.X7x PFEdTGP\߀l :MX
+Ԙ1EtTmr
+}Ӻx|-K;„I!{+<#vR| ܞĥ\(gx
+B%5 0j3DG2x4PC)[;Q:hEqP@x e7#B@.!r%qjٻ%^s)/z*FOEjԦ٦Od:N/(bA PѤ`uv-Er" &0)MItqh(V&AIiN!"]ȃ4,<URE{2h/"EzA
+Ԏgpk͆\ښM5zbBĊ$s;$PBE}p:_<Gu- /
+lH@iJ7ohnS%AL!t"̈́ДĖ!|h31;ӄ
++ iBZj-K B:ǾpӒOgk~+)^]11ve!>`a/.)Xppe#=
+pgʏ;q6pmo4:͓da5vh'oJpY7zkLUцTy $;w?8cu5%}7{ƿKec,b]ԒomG|siܾ!l6n-ĢA>
+`n
+ۇ^I
+g
+C!gpSj`G#rG‰6LN4^̀,x
+ ʗJㆊH")q!üBpX8-#E Ld;@X7Wj@f^M.kɕ@ o7NkzAnw?P͏?tٕHU) }Z+!Hfwu}t =mJ=HS0[ njL쟷Gt>> vGwmPd. X@5ʓt/6Qin7iz,1CJh=7tǼ- S A:)
+$Rj@,uA65?嶰*HM"MP_M˷Ѩgv1*Ta=]s81;Ýtn<g<k0X`+1H/6Z1Q
+*]wgMh{41٭"42vVՀx6qCMlzesg;X2dYi[4Z4@? c8I
+.F¨Gj¢4qL#nۀSo Ėp(Eraǘ
+96KnvTpzC:pи]`.1,Svb%^q%qߓNX!"@YIf5VU3!# y
+Ó+T-9IK(C|DGFde'vdި|޿i"<>MC˜@c߂62C MSvE&SW IR<ox9,D7~/ADAZnXojo4A>9kr
+'5 ć43yH:ip5U`ܐTF3Pb/gԷxRָM05mN#<P":va4J}
+
+$p˕ (>B3^Cu@]tB'`E0yxt_p Lʎ3}CyaER
+;^ayBeL;tD-H?*w]/
+dH"%e
+h8HGnі M5@wn@# ln:$pSwMKEjh0H"EJIt z1?MwTuA2~9&7AyDRnvt/"2.ŠtU c%n(C\'DU;F t!<,wd\*0@MeZ yo&r rz&{SIJ4U9F%m#ҭdxD4ATl1hW=X쌠 -(˚6/"(6#TPX7e;&t%6쉮
+Zm|y@ONFC ٳZNڠ&<ckEQ5 z-$0iD%*0ۈ;l'w>lNO=ͪ0
+ru'$E >zvɝB)̝:A@N+(+&#8n{꣕I:xWQZW=
+}lndbH^wPRqa&tqcC3٪Çة;'-vyb'*L::t"Iќw2k<O$Q?&Bkᾥm_z/W2l*E3"Ey$HŞ-"l%#֢. x߱̄HAFbhY|nFc\IFE&Is$Bl=gy8UʎsѸnkzgyu9l7I~xG\"h[BCܫwi=O=MyCnc/.
+% xsM [X|M-Τ;h*Ўp*BTXO
+3u79q>
+:fY|tFɦH5Z`x(0,G_j~Ql%m\ls`-/kG*l\*1t3$R1j7,fTR{gc?[  b>%$n~f
+o
+Ĵc"G,E -/J׏e5ŰP7go~4R#\
+lS'#j$lx<jBJNІL=I8׸{.MF9TlvgULZO4K<0L]^.4s !DhO Lh.R$qDl[Կ ֡"JƢJ- M!7
+R`(}:`N*M{-oh47%WNV2@-vv`XJ)qQidF&rH+&ϒqvMy7'МF;-w_W$ {R淳.kX];>[̙ZE"%.~8+ hhȕG)w%oWrlиtԹ>ւoh"~=~o2o@*~6g-oeTِf goLW VL O!7Z}%H$<_sW EW_g6o8kv8)RC9iV\JSQ H[/v.*LD[ON?tǑ,GUi %' 모$AQDMAC_ {h%4 deVI3P?(Sjƨ S2 B3wߚ"O%8!-5e&k9G*M)1=Ⓚhn,C+?5=M~^~DgbX99%;xKX2b^P?dSV{g2l Q^_k.V0NX:<q E7!SyLm˨OtK$/] jĴD%yősdZ-!NU*%$Y۠Do_18kisǠҧ30Gl- uҮv'I")o~1v"?Mq=ѷӟkT` sQ}lL+c:5e~ X`WHmNo#%` -vb@q z[3_@ǥ/:̠|
+:C}:' X %;`%aM,DhZdf[{ gU&6F5BDPc: N
+j:q!4mU{4[OT`1U؜50 !,~Dت0Aa7\=IVmiJEw_\F
+8#uUZ2҂D-HJ+DEcWuu`%^gK|'TCۂ[5b^yJLSe&⿢N}Q-!@liuD q}փ&
+#0F1Mo{CN.t
+Z(e*BFP-0(SZàZtRmwxdP-M4+@MWFcx叮~Y BPb,-7-7e>,E"˶$) d5ž o˝rn˛̌VḺPrtQ:ޝ^C
+[$5MњCP|`0wu$#Rۋh#,nr X*ef= CyLfn3l?tPS
+_5<ksC
+t͈NA@>pC/ӢE ,h=7D&qkRL14\}vcr5$o"AL͈nfI+)Vj)]=tB3C/"p3
+&bwwWvdⶭޖVFDyUk~ >C|ʃ^Z 2
+qbT,j5KWTyPqbY<x&{A7 4D8V^\~WjB5J{:
+Z0pDB{(zp)
+Exdt
+Nuj+2
+# Bgh 0 $Q N((6۫5nZGW\ !VDO1B.r,P"C {
+I"hWFL\
+<Y7WC rd$>J# Hˡ6
+o][m7VZ#
+"Oȸ#‡s O';gہE9 Ty@RoX**Yx
+Dgi
+Ul!rjryVm<u 4DeVei#؛BI=ɔ@HX{7
+x mNN]
+^潎#AeR5_{aUoK&&<ĉ-'rLtfQp؎
+8$j'JGџkˑrt)Z3JF;Bip2XUwz&EQ<4 EkY8) B320^7c`op[|̲iGֈ# @݁&E H6v+ogI)NK!@gVf@m55$"+$`dI;+ Y˄Q"C0cCTz#!j͌? 9`*h7z"kLG,Y-nN|ù3n}%eکAڔbwA tUA4'ִt29D5ԮB|JUހcjF۞#c-" Ə hHc$<5s]^]jevC
+hür;= YXM =hwPeTIߌW<(Ulxayߩ;>àn4Λ1Fl"fײ D'b,B|U>T*
+ TkϻZOWE8@XS(3a9#dꑺWhSIzDG%A pe0ŰJc9<D yD}l$WwzYίJ>ob8rd'
+>,tr=|Ӝ{Uj3tIVџYPȢlm8tu
+2
+Cdo %uH\ TlVa$l)d3_H9cD-\_ap@{X0ds"fՀ9
+U62u#s
+pauWIw0WT/X]z:p(B,#GV)Uj@.hR>(f}熰
+<`nFRWUaʋ
+T51+8Y#=!Ҹ)eJi1v4Ek4r]UEy>փTA:UjйF<f H d8HC:&:%B#V1R*r#kfƽ>7ey-y)u Tb 'Rt3|FT-:,DRIlLJHSŖaa[
+uu0!P/1;-($tNI@Ҩ[PزK#~օ2fF KэӺ2N
+dkpF`:~'j {!SƵt^>k9MΘChq
+͝:EbzR<{VN.NAb4;GR]eLpZyU1etǮ12
+k1HgSA'g dUD4}cbF .f)C@Ϭs#dnn'B(R(C'#؆u!UAuH]ߢ9tmIAؕEr;^v}OOɓr
+쳒r G30 ecڹrD[V?%#B<zTk]$R6bk"X>p?
+Qb7E{7HWBba,MOdb½af3fp5a X/9*~t"׽';A(("<Y )N}=@^H2kw]e}\Y[jJ_F9<8t~'
+ (&%
+ΎbےX[LJ]\[~7?7|؍7O.Ͽz_/^|}yZ'_-?YH~[0.>|~X<y˳_û^}Wxë~?>o|w޽}q?~y3YQkЮcKNTUq K?5?Gr|)Y"UDw8ރrŜii
+;:0fJN.ffTq[x&f.jz\"sE2:E=.{rs D5fkIo| { D:oM'CO f~4m!$aV9^B(791|hpgwwƔ*NU&pOp ˒d)ȫlUa?GԊ.SKxDA?v-R7уV
+U!K>ZM9w
+>AP($
+4\L4&6""ybI.f
+ R^E<1'l3F1"RJW%q9vZHAUek
+o8móAG XQgf'(>QG_Y|ITR4A#lmmRA/b} p Z.dG+-ҁEjڹ,9^I8wM` N*;vGƢ\J{B9o=z0 gЫsQ;Xf #V5
+HoZp0}[!au)Ti`OstπSSd+LlnAUyԃPtED:CV;2'QೳmB\t,:;w Ԣ3@Iפ}q=v%4Dѡ/DP c
+Fܤ$A8E6u(p"B'@N@2=8iHPs̀oiw)a- [4 Za-"d;#v  f*Ȯ3„ J<G8.էEߌ@B@Z
+v3EBЗ0.i˜Lh? TE-S y}HXASk/@q3Wp,#ڝd*鲈..BĬ2"xIpXHU\~k阡RKgλ7($bpl)#…I
+$R^+9X$ŬIМ<$ADoy%w2rԬN*Bztf&6*rY̱4#r9ƫP}uȼ`@n.B37?9IXUi3>
+=w'>A)F}9FEoS~9]GFxYBX<'GNA8(NDQwaIܳ=V"@2.SDda2ɡ+mA#L3>Aj0-a1֫HD IW(rX8x叉/2H8 <KHChFZ>Q(?!B ipu"*z@1ڗvѸ,o8",:۩JуW U UoB#"@xb\@\#A?@tU)Wt;žaMWNp1h+EW4? DcR(0]JKp` b5lXޓ(<Rh
+7.HLvB 躒-?Ns퉸Eq3pAg
+=Rz"bUd8rms}$á۸6 OΐI)sC=]>kD"b𖎖BJG[.V@U Dגe*Zr*3<cEζ_Hc}VvQ+l6̎29
+>F0X;Bwoq=@생G$8
+
+'
+D-`ޞME;E!(c<rO%&ujƛٖ >&qn#DjԨ
+RuK uu'T_38v.()׉f+ 0,4U \E`MwnjEXpp0Vq'u. ^NaVA0ytR+z,r5KKJab<;1(7D|b퀜Dx,gZN 7EO38S=A ě΄ \qIA6s,́V%G,ASVlBXq"B˓اbEPյAZyk`d?na:٢g&'3|ѡ̗?PHY*:JG
+miMB&V
+"bO 6k`DU ٺbS .N·rPS3eĠr
+3[[l-G`@ЬCD\MĶ|FqQ~,k$E'Ay ^|^ԯv \;Aѧ
+Ī̕Ɠi`׎y3w$ FӰ
+(0sĩT%oء?SqwZp $l$K#-|ק(NȮKo$FS{yChmuHUhAA3/u#q*BX4i|N%=39#Ob,l$kusZ1?v8_ Y\bKbMϩR0Gָglۑ'80X-C,L;m:w` jcnhW(p$a𥷘_;
+nOƏ*w|\Z͎qX=NOHFD,(5
+0"²>*sv(&YzcblCLp)oq̠kqYa)LB=&Y >N5ˆ}6w_}P <}PVc;'c"${t zHEevhQ+o\Auys]%+D@\K,Va35%6MrrUyZQZu "{"0"@E3v\ iDPqM-<ĿHM Ct6\A аh# Gx?+O tJgY.>ub',*]D,@,Αs;(F76 ayF3CS-A|t]v[qIC9w@o7>h0~MQspf!N摣/$,PiʕYW~Yn
+H=r$;O;?
+GOSi J9y}٪OS5cOEH ېYDNQ6Uj],s6URFd˨Y5'WmflD7&ڜV+dd˄4/ΙBRxLIW+k9bzIDWNɡs#-ZDjh+tIGi X'/ <x֠1jr!"QQiHiٗf{z@f7V簝c!Oڊxy[}ÅBz
+Z<.$@#zJ=l#d|Z].fpgLzȳUJ8{>[T(4܈}@R+CQ*>n HZ5/.uE
+ cbT̬O!}
+t#=5b՟uUS\ssNJWwoABTJTQ¤Mmr =ed Lt! 4"UF軆vtDURm(ӢI9Q=]g[B݋VʪF\n<4ŏ;Q)BFHxaVa3vt I_L6Aאx$Mg:KOf2T,lEOSB*A2
+e1=_AwFE1Ot*Iϧ { M tH](tz:LH%TcurHҩ,T?-4:_ndcYcBީsdʵ<D;m/^ea!j:qJ˾&e,)e6F=c
+MB=;
+Q(/=?  Cg B9
+8 F.ErjCWx<`G ֥f܆&G-hwaу (ςexE܃
+zSvٯ@5(NK 
+m~@"(#\v?@1"yp\.
+!zl&5 1Bet'Y
+2J^󹗵/Ĕk7u/!} vBqI n m틸4vUMdAȓ5=DXn*y,HU9H} tdw!{d ).R<p E5_َ4A%^؈pFb;mLt-bąud"? OB[;e@)A(D`z̼!K!\Lh s-+8HSǶzފ4X8inȸe%c3=䴧Pa2 K0LU4Q;jIhY{D.0k
+{P ^AB/ЧPg%@eboRZTeS\"c)~crZv5|aa%žDnbNXȻ
+!s_%0ibca>d'yHa,Hqտlg^*uwJ̕L
+>)D嚡(R4[.(Ƨ#r1F|lE[|
+f˭JFΆm01e]Jd?\W\W)5G kb%r[<6sEIf Ɨftd܌ck)c&^r5
+ m~XF'ڼ*
+ %]Jխutv!yJxTu 0/,S=ЪR!/jFVyR zP4Q,&v)aQ ھȨ-qCáVp1crϼ}]ҜxpᎰytf}Rp*kZÀ0$JrC::v~qLߴ`llrd.wppFSu
+tO1eHrGFOZih ˪ho/E/f3 kqE:tpE>z;0ҒYD6>ۗXl<4 FVOvO,jsBG:`~)^HAm/dϐ'D@'օh"F/}q#sEOj#`U/>>EBe6aJ2W@D0t<!Y+zl`oo
+ucWNeķ)S8fkh|/˒_Epyc&c
+!)
+c :cH\߻hjM:V-liO-dogn6A)/}iA K+h_pX54y} -ư1nL66ust!\
+3 Ʉ7i:x&mlp2'?<"/U|[G\*QΫWC85K1cO0!;Ʀ8FiH׋"E+3e%fzvO ꃍߜӝEw#jڬuʵq[j,}> &CZa7d[H"%M>#2P@Mwy}<ةp'N2;h~Yt̃.52>b?+Z:|Y> b
+T
+sA-cR fBrCIW謁G9hՌ" p{`H2
+8I
+M-,Iz&ѧ(b1ᖩD [[\9[(y-Ѫ2¶i!*qӰɸgEؗSIuܰ- eg (Tp3h &ܨ u^
+)6Ί{>W䎞^~\%KaV'QF2<7LCPBЬ?*pL6 tף2V
+p]6x"%nz\pI$n`6is̒dLmt?Ȉ) E"{87+,o (#T
+ңB~:.95]Ҽ> #XSqMnm@"9"HjYX+D܇Wb|KJg6Pʴd/+Ryή|!ňxPY#`,:=%*d@>\fՂpV/}}8EA4
+ofӞ会L !-΄LWEV I ȥbqj
+t%F^6eP(2BaIÍ=jˎe*跄
+>āsY1) dv@(34
+ܢQ&EN"x"'M:EiR'謵&E|2Q4_s9zM(ނ%@ ڛn\t40ʉg
+ʕ YʀU,E_T%wFTǢA[W\2 遝KIXݦ@2rWHpYJrEA6;'Șu?l86+ޘj@vSƖ) ՀJZs0PryoiFtp4=c+1g0\FlqNK٫<Hym[!|/9⊖wM><:b.f8sR7l}YϪr/Y%sM.%'!dOG,<ڒ?}i^3EUF[9-n4wB`^#QMtkQ`o
+.g%>%v*8vJ@j2^ OF
+]0;R$^*t*?̍)DDo7v ={N#ED5N>p/53% \%ݥf-t92jue/iY1<U>(8䁫qP"f_:4*2,e6e.=꺀\beT+,xǔ HBE"b:QC)y.b<dr3CL!n#aWd!U- ^uZ&?cf5Ev.7< 2dI_9`LD`9œn!󈃆2Ox!vJml"ѮVëyM (0Yѵ
+"o qjҽXQ{:RT:ƬLŔa<e+˙{C\SKM5Dju[(fP* լ}r\h+[ N1r5W@ʘ{l?)#o2Qsv d
+4?(w chE]3H."2 yE3z,11WI C2D(ia>""ȀYN6߹K"%N*q:d'RYyp&/{h~vHxEW(k5I'ucV^k)h$*+qAJU73>Ӡ.aL ~w:Rhow-8'}+AX] <!\B?-UA A7\|ȤJr-R^@RRFy
+'#DV \rnO $Cu_B^PebӾM@QZ֦JbI%D='4QQ AQ ֬FȑIZ% Ayf/!Kk"49xI-9`@8\\[sc.&@WI E{
+@w #aِ
+S-=SʟaA>D۶oHf`ya.XZ|&ɋxN+GM 4ErJMYuzA݅eZulJ
+
+>8|-!V\CWu"RK4$
+#"#rMe5hQ0׳.ˏ<rrb-Ad4Tܸ>Z~m!
+`~ 5+J4 Hޮ4"{L'"h1ےhnclAaHIF@1n< bi<3+1"J(
+$>_S~F]TҨKI\lQoCQ yr^Yl1LWPD ZhŔKh}f|3A"4}|S+jBݐeJ!Uχ"\Gm<Ǒey iv;$
+hs)gX"*|BsыDP{֔*7 aFf8*hƮ6 ,Ӗ$x·s̀z/Ad+UaG&Dν~ ,|c
+h*!8Z
+*7sa)@Xm%j
+q$迴 rD7.<~_:Nd>>}KvV 9>Bפn'l81OUivc98v?*;HMb-cj=[XHoIX
+8qnEV~[EM+:[nJlQӫGw S>؜>C?J {f>pԬ?w[Z}|
+;rPPD
+kP
+>ok{dG`~ ]H};-Aa!!`V3O,W),% ̬5D;D~g!VOe#R?[ٱ ae4>pJBxc<
+ͬO
+$;h#YN
+
+DAYW GY`d~OUT̂=S ĉ݀1BA>~@SA2"6M?>w`?v?L.6,b2hNJ23ؓ]#8|08cz)3 kԠEhqXE!7 &\uU5+یީR-h5תGr@]?<(챍ōcD64^pYgg=8"Yaߡ"Ds/@Bsny+ivIT=KM*JVUj|YQ;ث cks\HŶƾuS"1`L&*aL
+qaWV(@yA==6ˎ{X]LY(Oq-x55 u-t#P ,90/hfVkk1`pI=됞8cٷ7'Kڶ
+Go wg;X;7K&C!_* C A:.gԼ`E*0wF=8
+!3zD:_w(V0_j"T00m\h)xxܱI<t/isNwDͽ[ss0/Z_BI۴,j=U'0~N&V
+nW]unas<ա0Wx-
+uI 1żkk V}{+$JXwNoAs|Σ uL:Yu|/^(>܊q/s,j Pvy4&1qYAjs_H*H^K1Od%C= AhDk+OέMu+y_D
+!npQu/wk_ ,chj23c7t6hS2] 2+Č0}NOL#9>OprvVɫu<-Vu]Suk5sL~dU!`9
+Y4dRC=悝нB}ut0,lGS~)BG"e|#|e`tXYH=!B
+و<Z8⁕sApĹu62jAd<~|@/ E qjACҨֲAr|K9Bٱ\gI~:\a;fC0Q
+i C7Ǡiͽ =؄՘n^%̜U:؃<WfYcluA~DmTpձ><#cdj1jDFcuu6JKj%!OL8|ǵ 1}J6b9C Ž REӛGȦR[,w)G:_JAZzi VHd,9W
+,cO@9k*CTRn q$Z>'$*K.\
+̔u<C\x5XءgܜE7?usfTmM*{/?BSLjbJi2 W*,͛wJ1znQ;&öni >zZ* K 4YAx3OBI*i
+R6eM6/e& sɮ0[VC&*bcvP8\V$bc~Qn,RKzMN,b}'K
+TGOh,<Mى_ \lз?Ӫf1s%?3Bsps}効߫!d8Yc+Ů6N5wT,d4csu84y痁`^AƓ̄mspͦK9qTIz\X:.ImQEfvLHP,KQ%ȼ׳uWܟ3~Y7ޭ<@\; A;AnK)qXDrf-C#
+y-) ]m<v0yc7d2
+t2TxĦ'\!ޘvYrcg,Ӝf=84iGΧؗ>\%ok~ k(KıoLԬl8)M(,8 E#yT;6Ω
+Gr?lĽ#SErӥ,jɵ<R =o"`X>%[ݤL
+k5=MjTÍ C->e^C)zv>pd( r5帥:dr*Bh;[rPa(UbLҎEI:E=)Ҭdi#sx˧dNl\Ϋ ])!PAY_j xevcޚ(cLZӊzu*g]ɋ7DCAN3:1YpբX!ݬrl B49jzxC! r@GmXyq2_ii#SȵZ""A<] S>{v o!qD$24۰\y"-sH8ͤ S< V9{!]x@fE79mX;XpQVj)dY{V̠e/8&I3.yjXG$ ʾȾEeRn׷_I6ZǖfSN(eV  3H%+3AJh9,o?IrDa-*edY/ʉb*0U5 Gdz Y37&Qa f JɀqѰAoBe ûz
+
+7Qtqb}H"NEF{>SU'NTzGL("$vL
+8!&=o\S>wOIr kJ82!: SY߁"6Fu"hq-@QCh "r(ۋJ#)L"bEQ{X4ԓԖ!JmLQkHql@"]239/|Ak8v
+!sUB"]O
+hkl4-ʉUoCgj 'C
+Q6ݝ`bv 1ٳ}7I3nEVItQŭQ@D`Q| ~NU@© ) ymj6R}cnXwyDt?r蔑l-JF=̨4E|tqP"@5ćQ՞{ AmAhDA7ǀA6n`H#a SSxEeڿs}=&0HOc_|;)S_.0CE/ر:LmRc6V:0fzh,B?ck=se<ˆ4:+Lr0 Z:M ڶ"&,NJɏ(3SB5H&:G&T 2Eߐ@JHǰl) pǔR%6*dY^f
+gLUwZV*OhSls:`&/JBi:mwxC_D\WG1$ )<@i$YɈuR3uPnW nax-#2#q [ncxmvD̈@og(f| *
+bx4R9Es"
+;
+L[١H⿷%Χ2 DwW06wJTGZKL;?#.1QGf' \_rnE䊘@st[rˌmBu:ׅ^l9] s;009zPX`yA3ZR^Χڂ0t,yޒܲE.s-9Pd͕=2֤66*)# ՟/f7- [ɭVBG)#lN^eOSֱba "dporVWֻcn\ Hg|LmW>ks?<Y"4 o!vk:O bq'[#DKic̎oJ7_p
+ % kR(uXwq<XQã{tI#wDw'm+t~iVaXGCQCj_E|HDHPvK"wf!ԁ1ݏKԂc"hpLʵtgX-"fdR8?97Lь/}s "k >"LKҾ vwYNHBA+
+o"#HI,.c{cL1Umx(nsJ7'dl}b/ P
+KoXаO7ӭ1 .sQ~M}B嶽-Ky#/-&0 m<?ŷ7Yde͉-NS 72vLmJn&LT.%%!YllCp]j zaWk?EӂfWI~[)9fAA
+1AR# &|?rR
+௝WyRiJ(+$
+N2>Ơvf䎿)X#/4Q{y6P̗I]~^e6';{'cO>8lϕАyZD)2 4:A  pc (KMK@2kFCIϣZnxRU, 9)+<9@ fFC1֚2ё,qUW =25"3xQ!?W
+HMr7O;A?X{Ef;O|='q$RF(ǿjRK#f{՘sa7dҭM`B+{9}W=9d0}d9:?6f"uL15JHx/-_
+hޒ#s.M H!+eRmM,(&OQ jɹARmE-c*#w~5mYw.(g4~*%Qcj|ɞB&&p40w/+˰rp! ^fZ8fpIS̖1iJs
+SOů)1_ZC_=u
+|<-k߰$_Q% / . hԜt 2ɌHyʗ~y|0PUIJ`T^\Gi~3(c/ss.MOcetȾ$A3fBKjMrlGƊIub1m=WMڎF+h`D$~@o9шAY峓&FVzS`6I(Oˁs溺Y
+n$ֻ|;w a$(-Hu;:%̃%aթ&`(nwL*+6ը~<݀L=mk+WGyb 0 ߵg@j#2.,qiͮQ_n1<qO)Š}En:/us(ut9γ:%3c.$)oEe #QH(FH>/o>$Y{Pٲɢ f! W,*HleC8<4J&nB2UܟM :77 x4v34
+ZW!)UI6orZ(oZ cg<)W]/uɑDd
+̌51Rlu0Aq?#"Ȫ,@X<Y` U*ܪӔ:~›$P41]?s uRݨ4]Qj! '@з'G^M%C3&=i1,s)­?2h,g_G6~;zy] Wl&ͥxHLԕYXuϮK=Z;=h[;%ֽ?VC kť({Oe_[=*Jkp7l~XcqxO׹߇MCq9M1w!ocA)o/G#xStSPMԝ*nd"<~܁C2NΙ"Vnof s8OH'R J@A)L5QށR.U[X&z2[GKw]_
+Wӛ`YcB2M!C[;y$|L W][k=WM:gvbZv"M֨ Je5$Go@/@ܤ)ZhYs!MWuoɫ L<ZÆuʀ8F72[g<(\"xus hUDVW?xs@Lެq<nDVw؏:: x9J/V+(X`ZbRF<¨$" !# 率s"<D]d@y}_9BK_, f=&Kp6k F
+
+aXY(!dBvV'tCe=AAl:DS 4
+[T?|+VMlWv<.ge5z5 Yb2ۮO5(Vi %Ȕ*ҡHhp2APм E4co7U E.S6_<Eaqڶ`{y>^b± -7%G=՘ۙim<'vMŐe2h/ġP4e)!ka(Ev/8mE}N_2R:@V=n.iuK3*gZzxvK7
+]W'}`smQ@0v)_7)J/5z a}hu@vcZ29R@ڤF>ʈBcm
+{A,nNZė!| h4paрڼG|DVwN۔%L<Qb)mKO#|zm1 A>QeTMOSkfX99=-:9yG/RE`E;MW$(ӾH0(kXz$a&iC +mok4g4F bI<_gPN
+1c@T;xTXyΞ-Yaހ08dU#QHJۀl
+Qbuḍn'sSP'Wce|MΧu v#-¡ODqu-ՈX{ VIKîp: tz̞"ӭ3[a@ wJbJ7$e^̠z)MeOs4co~pRpdaސGUof4A?nA]ώ
+bmRػpf:Ox;SY
+=>&Q:!oEVSP\>qBYYIA*u"D]j{Apc+mֹ];qrv)[mtfM+*.Ğh0N6fԮspSR9
+6_>Vp.ޙ[&6;q$cƞ@V={uޣ͑"w?Vx_af6)㣮#n˳G=er|8q,hqÀyk8O~;U^3,a:7is͂lPH>q &)(Nc@=[-ɆRH8M_F=mXiT7
+0BErԠry UܵmcM6] @<x
+{|S(
+e0_AQ[Kr~::۟3*cx?{I
+FrF֩q1q[ ɵDj&d3{ Qva܊j9|E@ &cR !]!ѦʬZ]wϝ/yXVC-x#ץvK0? dnţmAYn"q8tW4Rۄ:rEV;\nn$2`c3NI\7 Dtp&V}_`[]@"8t7}jt-bM%l ?1M<~yJrq|xJ<Nɴř>wѥ%2o=Bjx5j:e,P!ʕ}Hy'L?/CCzZ{3c,`&,jqPR{II[paKΜPP`v]O2^ғ$MgzZZ>,KCOSWϩ@yB'?sr9H) >Ɏr}
+Syl+I<tm_J6Y&!QcjH.)S_KpBA_wFTz{(?t_[sK ǃ
+w"'f4px{,.zE
+-<QH9U,m󑼾eCp_$E3=2l>֤¨!etJH ȁ (;1M[ M
+<J\2q"ZpL,Ia6j7Qƒdw?Dnk
+=4'+"sX9P%|CU룘jyE" f0mkN>j[5I`Wl81UF䕖 0G=w#_
+5{}2M&F1Зχ%4<&фܢ;XŞf{X %N:xY:IJ $a XNhHu)_dd!3{Mr6 ހSYqhrĶͻ2/z|q-!a,+k C.qS_`)@aaxƘu0fjݼ;|U̢c}
+Zl" &=}@uܮ
+r޶f8sKQR365._`T}`3mSɣL,8dʘEDXb'`BE'9k'Z8Wε=M8>fӰhh4=n .oI&!5yIlw ˶Jv1+p[}d`JO6` pCMh* ,v\TJb]A$|,<vM?$W3DN=c{%H-Nx
+ȯ9Ěf1W!V@:iP*%I0F+t[$,٭myHk[Vk>jqcHUvUa @z"&7,ݥq%R8EEKӃdN
+;PwVN]7x 0>2E\ d|zƂVܑ}w#AG+]w\ΠNs
+1aV䃶bwTTqŵ[I]djPZ'.tG IB* - (3W
+xȶ޿{UkD)F\DsI8B8¦5
+Ҷ&+kx8AH,HP@~jzL" C+S<T-8g){t~'k1C8^AQ%R':jI\`clt
+G
+jw`ty zKBde=Ƹ4٥(+гrPچ&ʪy) |q<;2UQߦ"˅{xNP}2li o~XUbd?- PɀԽF'o Vp@cr˜Au]n΅kP]Ĝ_5x}Ϭxq|0V ;QEJlj|V /RB JQh}
+`%ϿG(N2
+"QgO1^<򪟊~\3 (Ub]mQh7q) 3E㴠B7M6z𛨔Iqcsb>. /wr+.&!N v.! N7e.y.i$í|vh--PdTlG5LIUt8xn .T:o:K\' O=ΑG
+D]GT T;[&ߺrr]/撈q7Y+.?"*V@t`dxXcŎhy%Ɋx Sp/`C6 (n
+z
+LO*NRBWLTL%5F߇~?Y66G꿂Dl˼#(Z`H t4~B\d<a4Rkh}0SE?ފ`ppVGqW|,i2{K? iF(1>#/&M<78ecTE&F'M7aJ0kNI]46;K1PpPQ4Sg"ˡy`QYhD9_Gx-~)EhzZ
+`h%cRVEζ.:K#9BFJg@\Ґ"x.֑.Qjxll
+`Iq
+)̑Nk
+ _"qQRXA@X y.`e7(OC
+al]K.nV yw'fp#=[ 6C̢2Q 1ڊ4 H{$&3JPb<=Qp"QX{*ܞ|ό"~Hv?NDuPl˜y:H.(x<V%C|+NqBs'qRm %<<ݟc}Y']Plxᷭo'm$'q%Cx>@S|0v8/&K!&KGQ8Mis>
+I挣 K<aRxN_,a@^q}+2X=4
+Vh@
+66TrG:I
+ "2[/&]P0C$ Xٙ"Ƀ"+ƍ/dlNzEpc.m&7Ng;n.x*$ % :
+<Pޔ[y]&#/?
+wy4Utu@3tbl\?~-xc_?.5hK .&$*ƻr%L# 'Wu +H0{3>~ =%RZxB I1Dо VM5kHi0
+=3tH0oy$em2'Z
+{`f@_?8'Z^MQ0HER׭H2s<EK/Nqע lذp\E{$ؖE5,ւfdM;t/ZpIGVRN5@^^" $yjRE(8^ⳜCg߁-͛рѪrȿT.6CGmћTg*O^xV Q<֦ eXH+YM I(Q//,=jq$DIHUdͤ ַ;jtvNMu<qۣ`)ZWNrܕ4
+}i:yd1TUĽDz^a `V韹PE 1ihq k\J
+S%0([*5SA1"e|e4XH1""z<x"[h::6nEҒ}7X8)9;f@$n5&q
+WrJwX+L(50=;Մ1bv H{ƺZ0
+
+(
+|KkP
+lQ
+Ue 8>*ԇPY I֟pv[>ǿ{gAǎRPđ Vukgˍja`!"RÓńre
+%"O
+52pz`Zq}(X 63Io,1
+cû:j\%eEh0-cyY GY dnJ+-%F!cc.92 ԫh 0jЦP3|G\reLc ϊv5CqqR5lLzQ\Xˎ!ifΡ]ukQM|F5ؿ>\.$+pJ/Za!ѪJwoѱlfpݷ29Ƅ2͏ 0MAfb`\AaSՉ}
+qgZː&v"$Ex:%3 '֛=2 -$AREƐj0YVE
+ Zc`OU}BH@<Q%@&6ށqR8E  A覉?]Ab%کBU[D@a\Yx ^OyB,޴*;iФa:Ь^1 Z7],FwﲡYwѽ:n?/p\ENY!Lޙ-]5Ys=$Hls5"H!Os
+=iM)쫒vSf,ɷs0YlA#脼 (\ih&UdAu 4%e-NGqC:
+N n Dp q*21ŝs&{ - uQQ֢)s;&iU@%'/ۯC;`.j@,'>nmyîpfr+)*[O?9wq@rݮt7t7 򼥹d#/V1ii8 P_WNp
+<)\!t`ch
+ r8"p,NloM.ٟ` S%܉e+\ p|cuUȒy]*bR0|}S b[l*٬3w}]bu {ٛ)buZղu4]đV3F*ۡ c@zgʒ]=jpk_2G0ҡs"rc/V1h?im^孬Pty7aW
+3π_ [콌iҦ|We%%q %M-Bݨnnƴth[- <uW&$qOdz@E-
+B96C{U'"?WСhT@ `t 8#X dK9蔾%E.u+&EA0Mv% l8IxBP[D3vV uES!c_6cܳqh
+ÿj=} p2Īi.'\6J*KpD'0NK%L?= FedvEh]_!A5a׃x;? |7 S9}kcë3:ac61.M=.7FMœ
+q}ևcX$Iw'(qM5͟EfJwn%Kq+hI=E38,<5-)Cv <C¾IQM@[-AaCZY3 \feXKڱLl܎D EDeZ,~Hyt9 \&^]2+Xm:1q
+fqZU^flglbD3lûG'aT9%6֑#nZ` ,$gIhǪ<^+bxy 7')24ߥ81 AN4@R(z
+lf,z9j L/#$Bˇ۷ ߇Ë@yzex--ۯԳ!˘B[IHk4` 4#׹
+Dh_pJI (T*
+=('xӣ9DOܫ3$z D+NW>ɵ
+lL!}t%Q#j(t? dP`|Az@J!{4,OQ[EEƙ= pRV̿>񢿱]
+>`[g?eiC|DeWo{"eP 8_h7`HLĈepHzSS=g}Yogc9PeQ| e&TYqG7hF#Ӏ.WA13?*@A{Ґo@n@wCH%f^wr_Q7&uIuS9
+ǯ Xg"04Ԑs I.mH1lBw#w_]:Q`lP*DŽlWhX~@b%rK5oQx!C2舢a{#}p(-RMa `?׆&Dr9ҦU|-k0d wLF$^B;hK^2L~E0A*Κz*@Ae\|D>:ѯɘѦ|m䔩] s.04n72^&'UrQ<yVABH;h/~(XmC8kt^T'3S'us+уE:[aZ4`
+g.G;Ǟ4υ>z۫9.-eEpTΥ(R`daOE*{A0 _ #uS|[\z0-WW KlHYC#1\qVB5$UHlÝH2ӯkɊ,?o@g2\G_з>r&?ZOMr_^\-zؚx'ű.۽gq7CVOA70O*MIr]ȕ 3 }uN1D @P >1]2 Nű'!/<K9H:ݸIC3, X`HZīr50cUl[fSaR <*qXTm4KAf2|e#3ZJ=m.\^ U&TIKY'θLxkYRN8Wq+T[@i";%(RL/b9OS{Y
+_Q *O:ѡSŒ;c+U:hrü <HɚY
+qNԆy>4H#R8* u6gTQX1
+bZz;[ɔ!
+ʠCP:3,(.EF- Y߽K ypi%1 I^Wf:i3fVr:sN҉pFM|V1X_8^AO"{bm-H S[hݵ$8$cL" \Ga3mRAX"Rhc '_ ͑58s}NȌ!>%P5TR7`QnJ0gd&d$q[2BJ|S҉zf*H}Qp<h
+TcLGgf
+O\ePisdz+|{loQ,ڏ<rC~LP2<o$Oqg> ss^!L!=mF dTe%<b!@!gU+ cެH7K"C_j9oI7.%N"L?q{8_!߼M7>s/ՠyy"2PGh)fd<|st{J(Շ.O }³8_
+֢lqrA(1 n黀\ᠦq)YWӱq"l !<N&bfќH|SBޚ-cZZj[\iLM[>@aLfTrޓĈ.ʿAx@/{}_i*?q| 6},'ڄp&G!2H:|r H6I4X 6=oE?RH_ʊÐA!Jk
+H*: u&_(<PTIqYt 's\
+x(0t(<5Cp^%Q t)@ dzFrI(DҏeI@f*z.B Ge0IKlq5+H pIe:<\%.60<@@IMpiVn]dNhy
+w7XiqxA j&Ȩ֔6x((?wm1swM䤼@MMuMAb4'ky,R%csL :̮G 1 {2Di&nYR>j!|}Նy_@ꊞ%GK:@X9MN SL)V;7pDc˸0M`9@ݏ6\qs
+CE#Ls$ǎ5X)uB+\10AZ$rqty!dl"ΥAϯz T>e,+
+W ?o@[jAO+MEh:YW>k!#BYȇ0b(zށVKC>ʎ
+EXߺ"^OITiw'l 7;9j\K1Dk1Jh1U/v-,QSelxh)]}*E =r>0_Y峧(IƋX&yU V*dF*lFȝƥ1`8.+>Jz8VQ!'f Օ61f7D7037W,>r[ok'
+ΈhV!aÝT l iNz7 UVh9bS?m
+x㏍zJX9ʓE _UyK<@=}01. S;%d_F X?%z[c~*Uj2`G"ZS^,1(G('.Ŧt
+jM<X+:dq[-,
+Qw" \wUJ:I @#tb 4/%.љd{]I(L9ؒ#^:Ez<ST됆S(ius֒aedT
+Eރ3 +Yi:GȐ#p%Q`'hdѷb8y
+qaY0̐cr!$?9Jl<{
+T0Q(sF],PJ"j"΁
+t6e%tphey=N':t&cҼ[ܙĹǥJh5En#/J;ws# ~ ;@p6i}!\}j0CcR|E0yF ے"*R[ YkupSS!o'#rwt2 7n(^ǁ">RC4]$epLl&(,~i^EVAPr?Xn
+?H%vb98 i繑M[OH#\^TJ d3NQhAﱱVVJEdIr4z28{緢OdozX{"^%JͫD1C@(&l+A@kDu{Tqyx|K3Ořj{ҫ
+HQr7 DO;" OUrf`JIi;CFN-KQٵV?y+iǬbf@ǣYTYVEd֦[
+H"C[QRsα!}5_o
+ph<p. bc9 6p
+cϘMy}*EzYNױST)e'^;jvRZ7:krbS欵7}P'mb 1k_ (0\xE8JV,
+P^ʭa=ֵÒcq%4DQJTVƏ?!|a6dj-٣uWϴ?I
+]+2 Us큘J`1'⬢LH KsqoT4<Xh 6(ج`0~ S kجj} ]w/evc~v8~~rʊ BCN-5Ps\'j,Z= c Z#[:lz\|ĴSXMGNPvAVރX}4F
+\D+͓0ZC:o@Ft!vVHpn@4!\ET( le4XKq _rp3Ha*6)1_ L֟PhdX*_Al>Qc]_#fqx{e& F(\'cƘn =BuHEn4%$Sf=I*^[<&Sk6vS4Gn *"oAb*WIhM
+n0(:reB~tay6N#P |Fϥ|L\͇~=S]eUܞ;vcN Q̖֔s{׭qH:xf hN߉:vC1g;J9D^"VO!/4x@ sY} u?}|^@gSyT riσ ʯ 9@ȼ:mΖ? L7߁yS|"(oUoYSW~gn; 03> 3{1% 7H,Ye/ o#<[^؎3}@rk0Jg_eO1`cvP4ʦ<얕QYtCBYR9e>B^_t"SCWKRW
+P5E#(48lI1D[ c,pdҷ,1ҥĦ{7_ TfOĆK,E(T엀.A/}uP,`Cǿ5m_lr[/m1봸WOcB^ '!8՞>ĦZ=#Jz~:ӸE*gt.ſ`%zNtfǓEvS,I_(<2H}+RdDF#J!=
+apjo}O^ 2CT9y34πȮs>'9TٗD϶W:J+^#3ʯN|'Bp#C#Ba~ϧ(hE¢QT%Jh 6# Z?MX^:>ѻEV&yǡg|Wq]fyH#=l#資/,Xxfѐ!XMO>Y 6<NE%6b̠$?@<}NFGsa4!2E.
+W5y+7¦`BJ1Ͳ]ݕHT`9G#\I|4zI-%q2I؁
+FSSqSPKC֭<뛢ċ+XC8s$ԩrD*)ӍcL% khQȽ*Tf ,&RKP].]M46~$%x<[t>-aeI<8ߎa-5 æPcJ
+JMۉ b]=Q3
+MG3Qiv _XCVa&_VeKHE3wMW){$,Im/R&A~B ju+MNSG+O n̽f%D^HbReLX:QU
+ut4eu]Ȁ߸k,-0Bc`vѭd@P9ñ=DFKC"鼜wTmK4UÓѭDq U>MXNm^~^8H}#G']ekV:RK‹&C?eZ;o@L l#_(qCa(wP0U/)'6ݎszmO]A ̓b  0~|ɬ{CZ
+/+1B ϒ,yJC@˂)3@%2UE'HƋx|OyZ7kǠ(z|ﵹqFmh'`i'5Xʐ/;)I.`tDnK}>ʊ | sV 񀂐 bjBw/51k~W+C{ ԥ)ɔ 2깢I9L '$56i6%BtsV)U7[
+ng,@bRĜ: IKHJD,9ñ60%-̳"9t wG3 "tU
+uVOA2+1
+>Wd*-NDdK'7}gb<@; v
+oasP1+C˝G
+Q5xfGFus鶎Lݖ=ZZ y\`z+r$fƎu4wJ
+M)$g/,1zvf\R.
+^^2Bn-}/^Y$t(C|u@-T:$;E)-P ӈ "w؛ FwJOyFh/P"V kbA7^:7{T
+%V˄u0ދ.3, okoĘ$-b/ 
+m35}q"4W)
+%iuM(dXWjE ANx9{'<v
+1^&uJ]07cz]hJss,vD7oDV*€bCb/+(Ք( N뷒URo%*.\`
+0E(D-Н3mɘ1c9ݬ(xt Q;ʚ2&z@k>(cѫ9gxD= j*5 |9J}
+g
+
+;aڃW;%mM!
+p*|`^Px3rNYO|
+)1@PNc
+Umc$ؚc /2H2@N
+wk}Eo!^a3zOKwiV{e^W6vTT"^$OĠ,Xv\!
+㊮ h&!2y`᫣nǬk5즊՚B'tƇ
+:b^ Q ΃u?5~G(c TGROaÀsi& w O*}R=;%XIl!ĀO/x+@L3lYye߼"@YfryE,n^na~Oy/:$f0c:3qj2?C}%ڱ[Hէs#Uw޺sNۤ~caZV+kX<J C\{hJ
+8̇N\%J;Kd&X"2j% l2^TE/:..{&pЄ0m*,( ~#Ro^d=v):tV[- &4 FjJyl88fWtCQ+>fOj펩p0 & pvvSnBeǺhSVK*n|Ǝ 1dM6]H'\m8*@0
+#BAu \9.%g&6e, ם1Vly&ԏNYPzD?$^^[-ZVG6:Na@7οt;g~p1f5W @g؈6d[StH\ܱ<6nSZ Ҵ]6%TdQQNº'ALXo.XĸJUvd
+
+$D}hr c.#M/*0h }N4PyÃu!s*Λ rBD"N83
+v?e9@@Vf%O[j@~J&FOm:.(h<5UWXb(!F.^K. Z "YIm\a@ ;Ϡ
+ȬM H$v0ĮHPBCRZG{% VW<q56WLGMyE`zB` ՙ*[QݝNTRX00"O|걈g_6Z6? q4 #D3C;XJyuvxf[] e6
+G,Dfȳ}2".Lb&XOPjN(soSg|)l0llc!OB`|bV6΂r0NE8ٸ<J0iǟB
+054愼UdG ~|[Ie(4F.4/CNjIW}2}7/6X₏c}]
+D5bZ𹮰y( %Ifҗr-P饾XG,,Cg,Ãe6S<[h){D1/JX8߷U 3Bځѿ_V Т})nMZIL˖Mi% 3٩tWc2
+\* \v(m氒k q0bҒ{C8mݹnYM\jh
+2|qU("^R.2a&p֢'RhK qtd1%RE>SF*͕rg&`J|)I/ʈwpMRehe’<v-7U7j4\ʴ3 cmdJi>{gW5Qݾ.q F
+sH)/#Qž&5@:+9IRʣ˧8r+A߯%,4i
+G认YQK j*WJ3J>C@s[ih^%[(ar{mDb->THMʍ5Ltm-&,v)RF*
+t8JRd7vT4R0ⱋ'hAKi+l6U9;EJ20UZ[I.6y9_:'V0vCi~A gчp׭H%mem`P̲Qb 5; ij@pz!'fJ1o9i|J&ے[Kz<doVm T2I؁ m1kmy nHҘn3I&Q7">ɘ
+K$U(n&͎1.UuG<>Tn&#{h2$
+]
+p(e){X-yA8ux"L3,cމ͚ B~_e<қ2(fȣ%bMNʤ7 _BcExBDpʩE.?Y!mV`́&.3zPOX=L.f/ӉjPe1]{V _Y,0Ǥ5R.!>T"vcKXs& Y}D+NV d8wM _c܎Z
+gg(C"y`Y*gwO%xYSf5_<4$˜Nɂ`uݘK;d%iiͰsƷ8nnzPN>W8dVW5D
+:G$qEBn‚H^O2S4Nbm4eEE/)pbfc)RL/o޻h]H-;)gPJZge'ev|N!1%>}JCzӡm\CdS`aYviEt`9|)$=!z
+SS׭'8Mxֳ*RJ ogi[9~T˩ |=܊mAtp rrshFHRvng?_ڼEQ((lf|d}l`kD2bjӷ
+ *%BZ 'SBII}wGJ!A6QK~țRq'TM JEHs>c? o3aoBPYZ%kqcR'8F%L?u+ 6`ޮZW&w 0L{@,n%yQz7=hc ncLs67<=_a3g{rwWd́kכ"E&ŽTr
+oО&o@,B r- 87*][9@qbdl)PY3z6M^%(їHw7?&"8Uk[zCsQE`M((!Pvwe#[kTNW7k8 q׹q&%ikGA<sG/ArTK̵_ߕ/ǂ|2'y zS˃D% ҴڼIIY&:}rsoccց^~u
+bScu
+$^c9V>%MQFT  sAlYb<>pj%|3cCsV`S43LLES:584UYѩ-y RPYLCV^%XaLj*s ~<{9@ykI($d_QϰaF(X?n{%,(Mg2֩ib\,Й,7/ZmPXc"R [Pr>M(ι&Z[sOƌƳh/L-sٖQQ0<# BQ_/_6H^>S_?xq.8g|ZEXEFˊX&&B ThJ7s+B?LDh]Lp.%~$KrN14IƘIa}2G x2SAruySE0X
+Y02 UxjfHtx4 A..Dr>V{Ļ+yE*8(D k40üqx '업7+84PO
+2M5Hq,>Fѥ.+1΁Ijoi"񧫾!jZ(qZUG\]%'%SP1ѭzpٙM*~ ct .9  ؄&wcvz'z]o
+uw&}`je򮶪͆j_M燺.oJiҙI1&ldRnMQ
+Җ9ڨ-uU> z !gdh9En=!xՐ큤 UgI
+IE#$+o"<V@Ot`M UCh
+$BHt脗(Y 99O_s
+0F#,l*
+R'e|L,3ԙږEAh8Pv9"{' ,ٙ"E$MW@1߅P %zʤ( xVb(:?Ce%ƘCfN?F[ve\}}S5-ȎZ9q@\VׯI8k[鲗ihN!)L>J53e0LQҽ ]HJS( ycSJrȻ&:Nvp<brWi2sˍhoV2H*q4+
+W͵Td[>GAI{߮-O>D&m<[]>+37<f^mwCxLbt*R /io">)3~%LE- Ƒ@.h F`7aOC2mH~tF+\=`Rt#)a@*ظQӾz,\3"a>Sw02ms?7=gx=&Ԣ]qڈr~9j=T#c𗎽KxqΗ[B!\p 8N/^PÓWE`P^%iFk=^bIdt#Fs[ |B9'-SI
+ηܴ0CTi߅'c6G6ccQ@
+ۭD 'LyL[IKyDk !2}"|Asju\BMr t
+~J3*La4 ?LwUumRդU qI'݋
+K+6rxL FռSLF63>k_zPabuNր>Oz)Rmp"iड़<Fe
+aN6\H ]r2SRHTܳ<5=s9JX#Y[ȆV9vca d~׶PU0NG(kZI0'YJ +K9x
+&E3U
+KN Ro3qxSGQeu,;Ց8mPrD "mDw̴&K W)aA*= R)CyL9AF %t g:"s
+O2`nuJP]M6MD/ vN0PRrqs!BƘOqjJ` pxI^wؾj]KXh5$2KYm'Ԃq8Wvkɇ,wo6_|﷒+5*ߵl*Rќ}4$y~O,OELڷׁV&Bӝ|N/-Ue~,hrW۔1 2~(rs`w) *".!K`(Xė
+g{pS%Ϩ1G " &(PTF8eYZ!fRIRw_W
+Q8<k-ĺuTf K56Z&c ߺѴȊ.T*=՟π!NDt/9.VeBPRS4-Q7 Mvo{\H.__*%4qs UTD)·8LYy bۃ_ 5"1KϬ#2'}}*E#6EH%PQ"vKcABW 8
+Nc!~82;C%)
+2P՜ ቁI]G x̄Ew*əh2 fG+)S_AO8_C9yދ`
+1߼ I)z3ŬSpCܣMY<vA=\n*YjFw%:v|S"Kw!W@[Ӓ^-rZgܝ:i'("{E*Ap8a6CTC+!p(6d pA$dzT}ea0շUR
+QyW@ irc?䌶ܡԤ /" gբ$fɒVDw ANU I;;4?Cgz(g xx7k&
+a7W"\)~.)Cdd<7ڕp"y1x(Ƨwbw?~PX,S+V
+Lg8%:)[+.߉/+V@#{Jz!/*3m%H
+bè[Q
+Q Q#Z9Sq?fY(0
+"xjx.+2})!vK־ WXU{E )% zHBH /Gu~DDcuY[EAfZ"0ُj`["?ċq`-boޘe`"YS+1"1v԰-o
+;pUw jҫ&781ī%-@Qd{ ģtyZRE^l0Fa2 1Fm~Ɖ/u%z6\`UZi7ax%Ay0<wh)V.| 5N|k`qxt D9vLF2H&Hz7 BHnw%x͓/=kP1H1[xzIPzb!l<%wW\DB-R}E(MWqN1gUPs.%Ҹ圬.yކv+2 E#<qP
+"ԅsqhM) > rkѲy-1% !͎FҫI\]kXCɠ@Bb2.
+ir|*+Dk4c' eeǸ:,,JGۼ]j',{טWE*^"oEfd_Zn0};(EKhDv|SS]>%?7*4%/s1tZ,f^
+HK8DO;&AJD=˾Y￝G}pH4Pʊ$~"ڿS?&cH|å>- {ֽ@M$ji&UxT&/Eݥ~]\UV("R 6
+vG-䋿Pn E|ׄD<2̢ 5ZQs]z:~ͣhã~/3L(U샬!"+#\}7ȯBZGt~xGWUlTMV4
+¿~^ui4+Se~&(xzg #lCJ(ՕˆF'Y9v޵QqQ(VpDŽ(!y]ۂt˶Q>QJ}9LIc]V=n鰓BL 6WSq]=.Y^Fv܇h>]O/`z4 r/[/RRK&$J)CD;e7J >(g:]&͸r;Awڄ@!ݯ^T҇3<jXfH{|O1O0I
+38$9cUf,3`m_7R3'KN2}3rK @mƙ 8k.I2AZbC8&yXj ӝftLvƶ^Ilw* ^Jo^p5HH!MUp Mim7a`^'YፑnNӅC ::fY(#9j7=60tY$1Ɲ}?4Fs 1þcKk5+QPmx~:%BbtpM!E#D+2HvKy+m#
+ba/3UmL'QU"[*D|<*RBhp i-<m\""`A2 *pgYDNqܙ B3X>dHQ)NїD sj_e,el|d{ mV-iYRd7t;$.*6zҳRڸ 0b.\:00eڛ8r QXB2& )ghga;16J-Ne`tg'Fqq8\-g}v_S\@WAC$T(%Ccpfuůl;wvAc=*\RF2c$׻JTiAIN %
+!w&r_,:Pۂ(1Y[C3;\ٖA۴=,Fc JH؞dB &hfO=لQ=9G\|7-g϶`a*zRLJ7RYTM2_M^t JCGfWJVz{[Y-_c##
+ژB̨|mNy=-'qZT
+FJvs߀^p<x1b_dA *VSR7پrZpŒ7|<w
+5Gi[JiLgI%k5FI#!Y\f$)7N qO'tIL72rQ Ddvk)z]Zàs湼ƇLpzD4ꍒrzz] x^{s6Yd{mc9<S !\cΠqXrê8^HF|tYt^<+(WeSz]<<
+)\p5LA7!f<9baoaRUL,J3Kqm N-`Wi:8G=;F5|Nnt8s!'vr/VPL3,GLiy"%~u6BQ}sHn^0a*>l a\Fzk
+>XxEEOfG#;
+.
+H _Y"SuiKZ+ږ =}9)ze<,} 4$#D7l-!-A"O^18׊~.H}c<TnQڱ0PQ\ig?b)iٟ_7I}1f21< gQ+<aC3ac) ]O~S cڵq6-zd7m4[S1 s-/
+7b-e5Ҿ5 iB"Atr
+=,^ܟ a1 hNDw^GWwC9ދDigB0eX)YQy~-{ѡ%Yr,fä$ye' >ڗ-@CH m:W"k yVDʓԶ+aqEf"Yj g潊iG<]Jt
+#kS#y\] Bzfq(c9$s:O6TQ' `R>yoBe!Ц$Q1KlL<m>H KҢѢC˅lAA$%K\:A)ȥ֝^Z:x i=xx`aQ0
+I*MHtoWO
+[TFV0Mިc%)$*yD HU ּ5O"Bhɔg}&8F)P{C.$;&*v?Qh>bZjl,n`<z)Ùn lU-6%fB
+_E*TN)kA9.oeR^1П3]pϠ}jG!p֨T҅fD\Jaס% YK2 BRՐŸȸ!Ah&mXۢWb XT/Q!)d@3<]̅5
+T'kTXZV*R !2dfo
+
+:b㨄4;tw}"1:1^1Bݬ_IYc {QA
+D3RA|`JjR%A86nj>=%1Fz{V恾}UwGoAd&!쯫wSQ}
+rm
+kJ Į
+/@,WHD iϻI&aS`ј3_ ܋ϕJ<Ȍ:y @1H7X qF"j0ͣ!?nj`8R|xK":g5o0?R'$2Zhr)..]Βz R@{`]%i7D#yO'` /r޸%rȋk2gWd*)x Mأ!6_⍂QG4/
+Bj%QҒiB;&b_a"y/%JBd?s`",
+WM6:
+mC:FjגD |ϵe48]EgP Q9(-0gJq+" ekt//#;n%Z@{m?b`H|a*Q gPC vӢ2(SAhDj+MV u8t::]Yi"_c4ijBL# 7tuΖ`"I};kdGuqW~gk`i/XY'V/A~BD
+Y2%v6i<p> PO^x
+\@CcȞQnҠE3} ]36Р5m|-!. l%jp"8n>YS{&e L$Hґѳ)M rB(/v!뫂tK='/՘!x(3*㤎Lڍ*Xj^(KR9Ja3:L*/)qO*TBȼ8:c20M5O^)f>cZ`5A&o(2hQi`ȳ2m
+%D24q ,XW,AI]I۬}[Fz8!BW2H,[(x.8Șk|g]Jg/%Ӡyo؂=yFA
+
+`Qc¬xLd- p((U6AlԼ)p/hVBFVv.i'3y["pK;;.
+G1֠2Tgq.[3SFM >aGJ.)M "^<I0n! }9VPF3e(D3K ?U|+iӭZHE!o\ҜϠ5Ir `vP4h]$
+6?$w*
+jkG4dE:
+We5?0L?v %uMC!f:m eAx6Tѵ~/5i&AKڹT%줈i2
+Ι>-MBjFiHi!HqX1'sﳓ@!'>rG ij9&5tl3fT,{_fSv )UZw5$ U6NQ.*٣A /鶏 i)IAiDonmXkfLs-9:AV|9ŏG!_ZwVFەvq)%f$aW"@FrpgH
+Ѷ!
+*)A_8yaz AB 0?N D8u"W8c2Yc͘H^Z=am,էDXy8v:#p& \~km̍oW3jcH&JǴ"
+"c)'3(3 b$YPdAC9Whi4FqG0Vq#NPٹ.wC$57&oIÓ}7@{7Sjm' BNgE:jLCtgB0t'i#jIiCQlJ}Q98zml?3)c(tӿ68pHϪticApTA-x1)/ 3f%!i'гx Q$# QP0h |^͠//- I7䙸@<* .b8&v~eG`3/a[NZm%Wc%mcf=ʠn<'Q8 ɶ+2c*w#0!V_ΡS`$~ 0)_c$Bz_*|5ʯzMDz7GyLFϬ ~EbUWݫcK
+/w&Q=_ 3^.uH]?cy]hJ@YBr$
+OKi)F$'UnU3$懘,E|dYZw>4ИG!j:|"$%/>Vmwqg:4T
+3?0[xUv)4A`<FMȃ3@ieg@<$
+0;8ųόe=L!r6LOr8=8?0)?: F1!8u. ~:C ^7׌1 XʤHŧcPxbj_#)UuمrT&8քZEPYROJ9 ʨ..Hf5e'm[[<:\x)p^A"!qrd"vjK!m`Q>+cSHe`lVQI!R`}'sŸZ1 Bdg`nzk W
+I+QĐBy!;hh'
+}#rяVy8KHKdQ%0a%'nEVPFh楜'UozsC3o4ONBqJFˎ$<-hkgtQ#ҌxSzNԞubُPw3VuOX;oA6l7CX"Aw}*z,%du kW{8GIXLJ Y
+ ^Ή|WْZi`ۓ
+R_212aY,Qsuq쬘6٢ØKŊl36 9cUqEvyBf$;$uBC@ V6$P$3o`jxTQnk7OKr8Őu ڽ<G饁
+
+dEd kYP?(c| T!kR.
+m8ɪ$ҕX<DK@W0DM/Ja
+A8@BQ"ub254 ${.DFT}|뷗2m*&P, ?*q=)xۗ7L.'Va5ef 7$ TKu6={ι4֦iߗ
+58>)&[D
+Mό3G3j7O#vE. CBʔUr-a|2U:j[EQ8.)Kk$vqͩJG!C!4W1Ch^%);.XU̜6kp Iz/ FA- !^\FPQL
+flYRڣ:4"!(;ڼiAmV
+?%#eG}N21x% =OeDj"Řk]_"O6]ע`Ф̩͢0b5;?6c^`EJA)gVqq>_ܶfCf_ϒQ<Jt%0{$/O7N)%>J)zW7i #u/TS, 
+(n?dHmq5߬
+oC?βq/&VU)1\ޏ/@(V;D? b r_vS\GNH #Q? i*ٲ:HxLH=s1:ԑEH
+N
+oQ PI oTj~̒@d|y0tdI)mCR&.셑[Fa dJOe3JZ?Ϙ„[=LHHeμJt[/J]Si#*4v, KVvg $}-BGh|n74Ч}3h,"p+{r ;ȥdƞO
+(@w3+9U)5cAHf#Zp jv)Vqb2if}dY~B:m؈S~+ƶ@LDp,j|HD\l2º#ϮeU@*
+_E
+5\I).?
+)Q
+ ƍ[؇Hi;
+H/zg;Gԋ>172-kj0|;
+aik68Go=mT`)%8GwH*G5Lb#6X
+0 `3`g!vȚF\uixКxA΂2$I
+(>@e[<7jm#je@<K-0Uy pZc;5 PYSAdf՘, okVR´1hqEFe,,I5$\ ,9n$t 4yO@x
+y:zq Nъ Q_ழ=[pAh7L$jA\R(;|P>4Ra͂&T&eJB!qXE!gIŽLD߰!1ŮaԐƲ0Ԟ; "Ezή[Se}lgBσ/cdn{`r5-IC$)Ƌ39{G22|ء~b`Z(A*_%tj)2 Hk|2",/hNx|kD5$ #yvN1v $K{uD-VAfUf@fMŷZ hIꦪ^I}Oi^*E
+*SzLڌ D[gWLi`%fXfo3_g;s 9J
+x`B$zlpz!*ɏٲ0ۯ
+ޢSr$
+|GpQcl3J{yw,@P)Yb.7x""26yS*Y~U "ij-Sf7Me` )R,ͬ V:2<sR dDl5Mg9mI5I
+%vŗA0>%^˂ Q.4B><h<0WX%ٌVPE, [s85b3kVXٕ{O 9y/y*mIspЉOT2 0 g`%a`Z5sU`P':=zT
+@#qIDzNUTBC1q"j}hR1md7KG& 4OKCf~1T4LZ(3`ǫ&;aXS_nqw
+<|E%ue_"SNHL`}=7@b <>^o bGХ_b5+|'̭}gEz@bf*ldU1 E] Uq=|a˨j Ƞ9"]6Ii<2ɐl:D1&
+xaa T7ʮ|:l'ZP@MvO(}]N5[<%Y !):eJGWƱ Pą(~ӴHg9V4Pm)~ ?@M%'
+bFoId !Z]O?&Zf|yEF=X$6BPm&k4O v/[L>}y Ì9e _~2<YZJN︎?W I<<z*=zGЬWa5G<_FFU.ѩA2/kXv: ܎|ZŢ8'r&HXCz=bq--}WOj55rɑcWb
+ c4pG0$5\J&2KRHF&)$ N^<sAB, ?8Ka0]jx[A KˌE-PZV5̟A` .ui J祩~]͇VqJ&ڋRA3(f
+&z ZٜD*#~F"d ŋn`ߎX D"Ǡu9$b#薂u0% (2uxgLO^": *Y X3`lM y1q*nmF &B\l24ȺUy `sj8QX $3ȑsX|<-ъ$D9^ *ԑ[*/7 D08R^(H(˜݌\Ky4!tЇ%&L%4W!eo4\>69X v}{ oaKPX
+4s ޓ.$pths& Z0"_?ΠJAջ:gCYv_<FEn`6Xތ#Tn9+,
+֞fN vu AZ
+3#Ez?%h^a?_hm}Hz
+@ׄW!kQ|,/~Jq",}$fpKE _B*pqF;ѵs =PWOad-!ACY$#,b"3%fy%XK\sK5:f?n ؏ Uz: kj^,Ӓ9J
+JLf-C ju;
++xM{Js=9 3kfR+ R-ژcl+p4laqHX@:|)s#*_vg`䶦! 
+U eLuQ G~0̛+0N`ZiE
+e +7sPL50S<4l1`{9&Ƞ<bg)Rt@ Z\ 4ٺ*EʅMǨs%qDۘ=Ye2uS/ L<a6f(,z}slWoaxA[3^z Gʓ<.Έ3|`Hwȍ+O
+EqGY$
+ؐ `(GU7PjEӲPAr7(TۃH`
+:^2 J
+ܠuHpT*z
+R#HRL Ơ|s)(7(e89LT&$qW?Ev,aMC+t$Z}ثsuӂ @M8H &貶!,|DSdqAYK
+Ўz*~w4zM.?qӉ4 Tw ʍ4"(Ժ=7Nr:ρh-n+ q^%mgpy:eܮrmce 8SQq^4A-jEN&-BLOHBuU@&xɢK~<}½VZ^t?do]A6dPęwrO6a?T*
+6G8i$X#
+u2L~01yta0-%qC;2Ɏ
+؃WCv}
+ɐE ]I,E!$Ŕy|ŚM.y(l5v<1IPiBN`>/MfF4C4 >ՐFf)]URD%^T#PL6jH)c(ˇU[ JXOVK+r 52<|:Jկd}'K9ܨl%2Y$yO]vpC@Kp0*ˮ87o5!N7ЬávN-b'bN[*|V
+kD5B۟V&F9X͹Q[qBF')
+&(Ցt6
+/
+|
+ŕeB>Gx<vc|)beOڲA35ʦ:[%#z! *ch:),P-U BY+#UOttuv&$
+!޳s\ۀhq,#e*wGg/RN
+ix&50t- ]LbwF
+эSsŨӠqcpkPB~Z *|,^n<uTє3 ZO:tje,Je=3m] '+Gj+\
+Kg{M},Yb 0ܛ,0۱op$7g+vnaI:2[+>vI|8_J\1$1,l/{fM'A0V!R" WO1<˜;Y=rY8v4ޘ$YoJ䣜&{%H
+8"\`_"AAItJN@,AGl<N yLyC2c0j_\ȁ3ߜ9Y@F+iNߘK!l5M:ؘc'ٚ/{ƺ5[bP=l ={27i$"w8%c:Ě"}QH0
+%L/:*堂-w +ʱE
+avD8YTn6󐀋N
+kU
+)vmB>a%E
+&;%e~r0BPb0x .=t@+"%ϑX0 !UB]O:#cy)2!M3H
+hlNDF]6f )i"R?EMcI H\AJGw4ax x '7+ J"l*9FʘH26;4td$(ԑ)t zS($K8tz:s`7gdYXi (U*KU(|Jf4w'm12Joľ$-0&p٪4&BrO߯dR  Ԧ8'Ӊ w:H7ߙT<3n&Hq=*;y{0HAD$͙)BA&@ZBpBB"L}8q71IUmCɾ%I": d;kXpi</Gq6Wu 3ênңyGr9]ƠaHDȹD[]"+BUѹQQU>[-+A=1/VTޚ ; i<.$^m374֥Im8 ֽDXlqdI0ңBQ^ <qwIR5uwPż/[U,W:fQ4o>8`74rB$ ZKΕ >̧*%|0{ (.|gh ;bi1$~</zC*(&chkQ|7]-dڵۜ{M +>i`d ]1Ri>T$g]lhv1.~$o#V(KoHGGf7cTBϛ퀐d,Je}t6f(P`lYHKf!;aQe@$nȀ=+ו 22tic&Xpa^"%$o$΅~CctA~T<֊^ -}:LYo ~6ZZdԈh״ m@APAO⧠ Ϡ YU<!\7!?m(2޿(^+>u:CwGGD2n3oJ\},emb8B:m 6Y4+_Jh0WK+F/iklxq1vi},W@
+l>Ġ_?2nZ? m~d>K1?OXc[X=ˠkZ65ʟwF`
+L"YЙ_|<PAmO8tZYZvm a:dhZ^xS,L%iC|(FiWh.(mgt;PX8ޒA;jRxcT*N ^
+pm]aUtYIKڥYY­JP/h;g"?A*7Wk:.#ޤ5ZbFHE_&PeLoO$[3M9jk!Ks#p_0S
+ŗ!HfdpAt$: B AA37Ϫ}Z+ΐAoNߺlEOj)i,!&)&̸</k>GAG,t0UtAkYނ~*K|Mf셁}aiU(
+HtKrdCW=xϡ%RtD?xvޜTi>$@>ZmZ}O,(sz؆^8nU>i%V,u@u(l2Κ41)>WehHmf{Z
+NsчoRV[ 'Ĉ*_ [ )*}>zo#w:w@#α^{TL0J9~G{8^DެSTft/ZVWz%$Ok[ T{[X"nj2B v>-Ը;XCm#Ojd/{YQk0K[8j.pu&5!M |oZB3֤4#r+.ܩu@v:S\xд29dAzQo9%dWցpx^s B0q`Fk6Le
+•!$6dcsuP
+A thkķ"&Ăj._@i}v1hv*XS>Qy '\#7TjՏziӼAVc,p=@D= C0?Vw}:4( )RA~px
+@OPU^+B60.þ bńN@Z [EX/i NPF[n&R@a
++}+b:
+YMQlxLk\7N0ZW<VYa,{5nb`yb$·x#bI= * B<oSuPbho(G*XMBnARt`EgHO(װ 6k'e A%y3.}3)O '͡l(̺-pE$#$ lE$Z'h{aΠE:P]k=u_ѩPL1t
+1`o@NhjW4EQg 5Cd2n]'
+Kdd'rP{˝zZH"zd7D8
+FR"4G
+96bx"gcqLr(|ݡ6
+/@nsjsFGK
+Ii
+n/:U
+iL\+'Br<][PKKºVo`:GPbaٙ1PST2TaQNLlnU<@ZWx, һeBܳˆѡb%MreZb`Rb+YfJ5ozpɌJR+5OgC1PUn%] Ʉ{[04td
+gb"=)rLh(H'h^ 4' oijdy P$^fԈz)Sqp^2TāmMMڼ8Y5b~9v<H8!,, $z\\JEQtv!#|1+!}=%KmH_6 +AڭD"Ю,5۱n7͙LǷl
+ݛ`^JCt VYY >vx@{oVPŤt{{߯Q@DB z<'7M"+
+y_`U
+>V8^*ٝKJ
+K aQs?f @w@$
+] s{aR!{">
+l20p$ gRv{96~HEv:3h"ʁ<fvl5+df ,[5FO]R.m-pOSkea*hpP'8`ס[F:qGq}n'ZULǚկ= )4e"vV5*q-ޣIwk%PmJ_ݭHM 8q47"+kqgȺa)Vޭ2Hj2Vnb/ `W Wͫ؉K܈+CE`o@|i1'JhH&
+
+KKElW̜HXoE6~f]
+c|eYJ8y]_'i/xGU5RWds5QŽH: }+êS)(5ցqrmf
+@N*5?+|# ⮫~ f֏Hx{%Y,X}f /Ni䷇E~i${onRA$?
+ٝ<9|"|[;'KV[=6<wƐc6 MH}c+d׸(ۨt.6ioYv39i$EE#2*m*bt"Dێ~+pFE)A+SWDxυ3>K>&1(Kؠ"+G %pADu8<|u@-Y5p7mBS*E0|^7*1)^,KʸStWtipQ6"VL)΃訒wVʲBOSE*AIm*[]b+~ ER*!:9c<K(E|_"赆'
+3G0\cjY&>3_2XtJ!7f7.AJ̳oQ%$M̉gKeY BnWc :&A9r@
+5}lı1.|9]Ů{oD}D,b
+J_}.RZW4pR$G@T8,rN1lۑVfO;~ޔ59:c,@ "k甴@JNsVF!$3i^nn\.a$QWn@B #&"=%^YO?;c[<&w!W7
+
+r.o+jھ"f3~ߤ$Eu(@HPג<:纔"ZuӢ\W#_5oN%]oc+4;)q %i߶20%1#%0†7Y#
+XVré]RNd9fMݚM؊_tKOx.(u&sZ8MK), Luu[ay߉⧿st
+pBx?jiM~[͐jKS .>ʔLTxkN `NXz屵ݠ}+:"`N/ad
+ܑ/D v™ 㖣܈WϗEDFfX?ޙPZ9?r#$wŽ1MOZ0Wp$m;ձybe8-1X ɠq‹{k7sltFPy+ѩcl /sq\EʄdwVb=Yϵ+V&)*.
+,y7VS£K "0<A!c*c$ļ_f qG<e| C=Q0Pn+Bbi*
+?uSix;
+UW O `a[H<c GG(-heVٖr 100'7VЈ3vN>q/ǽ0] e$vyd8󐸞$TErE-g=%PSKJ"!RAѥPUQ?F иX\3J4e+oEhhFԏe`B}_@+Z(Xgx58/*SaEI;JOi,t
+`@]nЂ\BBD~_;HKմ FQMxA.rDZ3=?o _ǩcDFO)Y \"ATF3V#ᯄolan/{'0UmykB+Nq^%h#iLR(
+K"(b:djJ6x 9@Y~_݆w>Lؕwp1[soPqB!%3]-a%DP4_K3Vk4d'yBHѴp<CNz%6/!düJbH٪ ?ÛX)(
+X| d%
+Q J;д %,S3;e:%{ђvz[@$x`ԟX
+eS.uzA% Ex ̬]{nh
+Fk YCjl(!_a0rWTy!c@h
+@caF
+*FPL"9
+%;dD Do
+4(`Đz:gt={YSKO_Vl95Q "p{$M !v8$A)q<xc<* 18eW@ؠ%d&+nL6܋F[N@Զ?֡I%'4~UHl$:/l$z̈(G]NV,HI\ #2vqC#ME>3V:duΧ.ɑ!>EN
+.e4eE]^r8(!urc͛\Xif>p"$_W& cDBm /':v89MR'G6?v -5 -?s엢.B7WRR3s9)A )r|37Û+=(oZNEd+V{W!ּ5("ι<Î]~0
+$BsY%mAL>űD֧xCTˣNŁO?܃qS
+
+ƋFM$%".)ݵqglj-0%똈݃(g
+1jj}-$$| N8_o 5 *)yCqrp9AƃP0("?3Ug6i8TK^L(`{
+YUQ(h 7D_Rq=A]2pҷI0b˪*M"!% Pq= {\yjS7{ x
+ ΃;hZ{b̦W?-Ү Moq࿧*pEx\y$%?-3R5bcJ\ M#Փ=wȇJ!đΙ-/=(P
+Qh{.(I3H!NLqR"Ze br@AŊ
+ǥ\=⩬J%>2֊nCcc x
+[P%8ܒTv ,,`/LթAEוؙR3* Z*s.%:Nc
+ 귋һV^UhvsJz""
+{d5ylG!8*XMI- 3oiva3eNW.%-VI%ƨŒ
+nt ɡ&l%,kh[dy
+;бƾmH9v*v%S }^$D }Y 3&ֵ\޶ڱ~lcl8Ni/TÊ8&IC2
+Rw ֪CĤR\SP~MY #2,˥{<% n+&**c&7L
+@^Ym#>@`d4ҔnTjJ,X=.3l⁖,镠@tI)95xR:ul%
+ս4S,Sz(3sKDF1&&.`ح;,]LJP+4EhUlN՛{65lǷo@
+@wX%tɡR@lR.dOxxitQwм`z<cEfRCa^ u5M/B((%+D96bj<s"vYQWn" ΪYl.W4+S~E
+qlƢ<
+
+^`pեf)Ij(i<?޹\8/ٍmd1P<"P3Jًyqz28e`kX,RŽ;Mrs1%#8AtĔ
+M
+7g9B!o^ >'*I
+E'3AbFJ\;OVj9a0>Ta/XyCS[7/9ɕ.c jA1n'@lzQiUb(rԕ!>2faSч 3vM(q0A>622haNeUj=&0
+yG ׮G4+ϛd8j`2;KSTFw"*YMr<r)ww#t4B//JaHO%Eq{
+kÈ[}^{ n,*^\TJh6w!h(.M=;6yA0Ou6(VA +8WԨAFtU(1\œX{*@|S理 < ʏ:p^Y׫qIόUP$~I?<
+n睲6swN<U7gT](HVsP/9wp6iӥ(
+z`@)Ś5v  ^E glt|^0<DtY7>/Jm2%a3
+o* VZ:н\z -Az?oEQD ^mPZ!qV4p[P"Vݣ{"ܢ*<j/E+׮.KUU(3P@ *}o!sLm1
+w,KpoCD[D,t:8~L`>`[pR]`k%EQTt)eGm_|JS%8rЂ`n« "h;" _4j47"D*^]*!ȓ+ԉԵn%=Ӧ1]] g*A"׵/8uڐ*P u@lEt;'݊PJ.D6kWqvn|
+ _EۯL?f7UʤbОgJP2I#ơ |z[h+spweB#,CLAmbK%9΁GXҹ +5l=:wW4w@|.T{r_SY(* ckKyT
+S&g/۹AbL;bfsEGzk:.P̈QlP0I=D6oV !80
+TVX?^"
+],so]H  0S ѳg11 NJ WY`fxH~o!:E?/ۊ ja8ʱn+%jꙬ{2y_ q6y}ѓ&}?#ѝDiݷi:`d5JcD\\t.
+9ᘱ%rHyEYTf^QBI>.#hƮglamO2xrDY٦ّa҈&
+{~z+ᜣl[":.G, ׮]$2Pp'\!R0di?!bԻ_Bh(lv9_~ܢ$g8ͧQ4Hݨ"R%
+/ԯ<Zsb/u<<3uv=?Zb"u6sf
+ū(
+f#.V@`U2bΫ"S۶"@CcyzESqE$ħjǀUMiq
+%
+AC#s(uݤM >Ngą0Q|w5?2 [`cW @' <@hkxmVK!v=5o%P+V {MOr
+/rsk@\ /A7غ_^}
+z!E"L|X>t3D
+5WM\4Cvax\
+$)kLX}\N
+ZvMW--Jtb潮HQdO;tϩQ 4;g *MlZ^;
+U:"J,
+.8ϽX7LFo"~`-I̔B>E(%o '2"? (pنRIa$1ntKt[ K=]9m| d}"Oyj?8- jdn
+NNgy@ZcŠ,;
+rwħGiuZ%Ch:wpQ12։dnB p~أgB 06އ""(X^`$.**(WoPhDf厙BW8EXC$2z#]Tap-闒tSsuvrU)
+KNZ%Q(ҏCkpg~YLeŃ?| ¨|Qs^I $`DۮX
+%~6Gu'E\oYJ( '>e۳Q">Ny#T3I,hXq߶U1{EeimK
+R#22o%QL >RNcyԀpIZj`UqǸx$.%~{uwhO}\ި
+5Ӆ~UX I;UI@Eaq*}~&*"Qýd٥,e2MFsϫmd*8Sq:w@_{-r#p9q
+ֽԴZófOQÈ-4-Hi[˄1wjv3ދ@s)})'7
+K
+Ľ`X\G,L+ht*֗F!\#m]`,c7 )w.M`Ӝ" \$2Ra?U0?ctk .uPz]
+`j^'*{k&<q=]XfWP1}o_ƐNOoS! $b d2tpZ#!74y+78h Ԅ.2j!χG XBch-)t /w Rō Y3*
+X<#
+v^Zz?SI`lkI YLc{>QɠoYZκA1"mA
+顇 /V rƘ?h+:e|5|,N \W
+a$kOq/dpЫդz}
+N;SBTdWVYOӻ*lɨ$! \qo= FA{'NG$fSѯ/e-㯲#c0R4b7WEkFܗX g3o$D~^󊎝Ɔ^(A6Y}:̒"_2Ee`ȝȊVw 8f@%E_oi,$,uͬ
+`@G* \a۰@'AHdV4}*A/* 6]Nn(VX EŴIσDŽjdymjg _&51&{vffY`M%DEuASY"&W|2BsDjzUxy1Ü`cmn1ۙoQU2-5HzE"@'#牰jB$E*g\4' ezcvAR,P'p+ 8l\:jYN~Qj^[Y`NDY˸1CU4v]G.smNAѩR 7f. ZQ`րud6c
+Q>rMo
+Ƅ^1nw zGgl^*/k
+tp03o,VGz :]!.j{wJrWʧhi\@F`;,Afx`+ OI ? ފWP1c,HyͶ^w H>˞ӜR($rFEG `0h hhҳ;/% 1"hTh0BMRHsSM>D
+QSjaQedDFF*FS^?NJK(2^ns̲,C'J 5vzVy2J-nnhJd睚ou<Nm=sjb;>9Is$R2*dwA,'Fx/8~Hh`8ԊG)^xtn?-(+ɭ{@j0\djI sPJ:v{A u+QMR
+)vb.Jg$C(l
+}eI$̸+:t^z4E WA!D_$-m$|:cV"Ra| l@X|3ѕ|4ṵu1zH.U<!q ۢ U$aj{+-J= lyqVŽ@oq٣
+:yG2bPY;B%s0kƓqs2S6 ]VQc* f =NfkfXLĄP kju}(%[
+HMUW-ɲ< oTڟl: _U^[RT/f~ >G?Zj͆hVJ}L >;o_LnE3C%az
+4+h4k2e ׺ Vs3) ]v]üWBp҂+G*b b]՚D١E}^͒wk T:l8
+-J҂
+:$T#觾yъ@
+u>YJR$lct4m!.@KU|tuRAdH%]IUy͌ȆvdH+:Q/gdkxya&TF[/׬ouKv9hRnOdFzJJ>G#qҕCrDϏT.HIqGCEqLhNu{"LWpJ3ʚ!B }(ך.e
+J򇍈'<K}~TY@D1veG%HF* x j`%)~*Z
+iPk.MhePaf<X8tOE ԭяG;&ÓC6Dsf RAˁ5g =YIUF"I1rF8 {=F-7}`M9n|C0A׎Me"FL<¯)D/]e BHd}nC0\$ӯ?qR}PÃJb@P92{X8AFOǔ-it>FNJ:5<Ay:IĂܐ+e^'B<yL*%~k%:.4!dx݃5e?>q2ķ8<[?Sżכsz
+!lqwhYMobފZx/ŀ {d{[amQ2tҿ qco->dJd}'q5FSRV~b<{ V} ?۷#I$^zh$(_hz:E-jdUsC)s("ހ;yӫΤKS 9r1xTQ\g X>^6{4?dA~aKUV@Ⱗ1?YU( `Fρ+^"'lq{R>Or{
+{meO),^C{VL k
+YmfpȱISBcj;KV5R?OQ9#^Y LLH4x.A  r<& T~7M2 YP-]X 2~A -sXey<"75|Pz 餙ՙ=
+;ǐӓbro57z?WәBi$ŽՍ7.aS~IO=R$z2}oaH\gCغ'=)W`F3ˎ7jǕu']̠y$E ףJ~$Q U?*RZ r>샷b g9!KQU#G;3`~#liRT&fe0}SBd#$?oG/u8,ZGt\ް-nc]-ܠ6+ ]Ur'P Ep:tYwjI&Vp.x<f5lsw0-X"(gO@eJE7? Z+sg A#^FZ.Ԏ,p2[RY튡=8X4ȏ7 H* D,Ƈos+EU*IaC1)uȵa$q;r9ϡ9/JlTE G#+:r+aH;GFBL\*8ҁ~r{)X"L-F
+!} s8$
+zz=h2
+[x3K@QävL~OO"}P5UFu7ڨEK'wێ~LcێLN5ox6VU,  sŽz
+&:Su( wsp11qrtIkF5ٍ`Q{|[
+}@eQdQaФhߡP~ҽܷܛv{uo
+
+c8 HhiNWvPUtc ݃=}~gDmFW1;6eu< rj~S:ի00AlE(DLOxF<R0R~1(ޕ1!ESm^(ݬ =7m2:o[W@%59./d"u1QBɀF,/c|&`Ƌ,bc^WaMjl*QLsunA<`%8σԠV&Bho(+qsn4 S`"hSB6<wMM|}nD~?o,32suQv]1bJ=7$TY6`"C;.+ȋ%@tڣKVa9`Ee)#0r[ӿ`f)uԻ،g^,u Sm!F}ڮX#sکy<V<[!hyAH !lU >)8%Lvu\zۿ3@kH(A+L8]G݂'
+Xx9,[?~ua\!ȯfi%*U4JS1)Of_լD;,׉f ٘|<܉T
+AIUiXKI{gZA@c\y,v+~eRP5?1QSEڂU8!>hSYhv,cDxʕ+
+BaJq֟6\bU:ڙ4i/}VlU;4N=tCii>ϝ ֊RDnqTW0e~=xxC̡5#@UdFF ~H7wӶƳ 3
+^ݕ7Z `V!j)ս+ ]/*o/ނ[vY"8DPβ;@{i|,Jl?΂H)}x
+ܭJBDӭE R?&&eczO!enAӜ/Se4r1$fs 9WnA97?7W:YMNUzž}2[{ WyGQeMok
+΍~r?~[~[OC%g{x t-'!'5{1vB OAftD#ܜ,*F #4=9
+ڛ\)/raߌ=.j*o
+vE;zTLUwW3ec!(<^k0uQLǭ7mpdD&kS@)j`%26+88틏I3O 27niXkw3%O_O%c&Ύɣ95
+Gl+ɢ2(+RV{+ѻVEҷ}j Zדd1lFj
+^,B-da'0YP ,[ &caxQ`4v+"JLk؍R-"XIJ; ЀwM#c[h˧/#%xX :H'Pamh3؍gWqszvv+NakK򎗘Dn6bC%Z"IDpRgq|A}d510?4cb Q)aH&`7sS!T/F
+ :z3<esBu,\r# ܜ P
+W 8<VOs42t{\L%RV&LCV,b709p!usVfp % g9DM#l^@w !԰J?>V3>)EI{X1^4t7^sD+fZ1$iƊSpK,_a/V w։iރ]6-M v ({|:C8tdl MpUr)\2/ ƯƃnѼޚlƢPQ]wmBw*pz;dTrV2(: #VDDiK.2%kKi|RC4}G"f8pwd֠1&*6
+ɩxCaR3t,Y4
+q|";5Ҥ탄;֕Pndы-09޶7,+
+׭HE0'*(1LPSQ;$I)-,0H[p=rZï|h%|m}T46Axxa%`B҃4vL Ǥ@Mċv'@n8 Vsx@Y:.%KѯkQܳkFԆ5݇bk{IxϪHT|kEXf0ˎcb(Lo&s_h5I;ȡ6 N&W.w*Xx{Hr}SE
+/E*n4na5"g6MC)e[ע14ɂ4v2LPAc/E0L=mB܍PKq,z\m\8@^mݬJx{$N*xd4ZIn%Q\ A`x7
+ES0q [Fݏ%Tx6|#W%\v> AdW5o5,܃z)"ҧ/;#Xb\qM6Xve S b5.!΁ubh(73`: ?ERqO+`/R/20\o1
+R$$2*.ݞwH;ȳ lOIF1do3(4V K R³ FӁp!B>?8L<jkl8aP+.H voiR>/ܺ#{
+- @ܷvx}.>i_VT1&]qϣiG$)Ijc[gwg]~GzpXpY^@4g1")$4Kxkv1ST/<d>r;C6
+܎躳s>[8./}Ց@$HPN'++*e{(!]g(~T96~ׄ4{ǘTF$Y9Fi]ײ+Au؍}A\Xoj]zby>%:azG8
+ccM(?N*RSt
+;"6;aIށx 6| [,Ӯ zS T"dE <FNB- 5X0oG2Yk\rUs7=)8)fiҮ à ƒ%azx-sh 8ўd<%?vljP*҆{!g=楈4V5@pZ5ȱ*A܀ ~#
+spAWAѕ[mt7"U[5MZ`A|6 (R᩺Fz fYr!j+Cʴ`&1f;.,
+f{")xI<ZIGPv ,Z$90nЩbVڗ  2PL0s~ 3BBPFeCbY}hS<.=743xn*H76iMήzg mK&yIgHl=-H\[5|o*3n>z%EZP<>6ڱqi0;qѶ+HCOc;F7N ,drCVzc&AMc*4MܚYR e F S1>̃(@
+\b`OvΕPκIJ"Fg\>[C׃q("ъѻqCL&Җ9cifu0^ 2p0,!x@|<m.|dt<@0hb1<i=|f1ؗA6AXH2Wlq=D68AΤJfljiu^7Ufјta~1ę)^ې+նƛ m`HeF`Znb2!51׽8<fɬP|r?́\Ag<9\4dm_yB
+ل\WR@9ǛrZ}[.W1x9sQ 4Mœ(5A"hƙzdUfm T%{]<:xC7
+@ܮѢA}J)[#{ O١4Q a i'P'񋳆w#a 3xD
+ = +k}ۨ dĵ9>{Γ#|+qPTQ $q$_oI: IY!PƐ2DF6w3˲rO5>=P2B@箠+wx'i4cCMo IOy$ɑ*A
+!a9D˂~\̝<EB%s9[0RZ.ݖHD~=º6b D'kWtnQ
+yB8#νs|y"U) .F895%e*u ٫9;;So-\7Y:hG}/--RQT4;R
+'{]4a3h(u
+PBhs頦IҎeEsiđfu,YdGjԲ X9"aP]uzL'V(v3f a=j5} 5d {Ayses|^?"HpT١aOyO"8!D"]#d岭" ɔ3mv9[X+/"V?ġ.uF;u4A3*p ߾L;'&LZޭuY&$$kAB.1A8ops3Ԏj4:9|oa@߀8 w9MRK(q-BHl n%6mˤ_!HPP5z$vM.Xh,.bҬ|6i27]̧yL8FB q֛$ı}+lLd%6̵"LNx:ЎyUﶛI& '4TtObK'V9FVmAsA ׅA<}ۭkK29S ;9Le+"BcXlD6PL\+|QA\;^\ᑯ0:JyH]G
+.J XU ~/Ƒ16ou~E^T#|>k ake.m=Ʒ=A[8&J/ 626V<@<9D‘яC-zo-ؕc*(-=`~=`C{&Y#+ T~oK Zd@vڴ e^SNͲ|Y COogsqUÝR̸ag~%7Z~=ꡝGe6Q7{=JQ'Z4wAO^<G w,&9q w1a:B$ۚ|'۳(p\;ƒ#|{~֛$={D)GP8UFF&r a}y lHJ]?G{̱5"!lDմG+\>783q^@Ə+X"> Ss"^ `p -qȸ&7KÖ1>"G~Ε³0_ RR`C#>@"C|Ԍo1[Q'O?ḸĶ#}x7$c y
+0 vj}t~0Eb!2S^ ُ7}GV܀wux~<L珧X0
+i=`+. )2<[8J,O8#ju mU#C[~K.]q˫ihQ +s[Tn<WHv7Ҥj;M's9hrˠ}34
+\?! aۑ0wUsWD!vv,@cLΉF~q=UZ'DnBB<:OSCy Y拓p{Dx
++U ³,҂PZ|']%#8f byᦪO.׈`o^]bαZΥ']ǶG1ܻ?RN"?6joJ2mGPV+1M7d[OjõEbqKe6KDZ4#+( #[g҂]kFXG.WNhų&amA1tP@$+#kGZx^GP؅B&PDŽEK>-rH3l4HsYfA3v R>!gĊg/Ļ|s?UL!39qQ[ 2}_攒n*!.Ks'$lz>pE
+2HCT(K&M ji;UTQrQ3!)ۊuz F.
+DŽ`D-| n--9{2%{r!}ȇgWQ
+HV(JGٳ`iY$ĥ {σ;GWaC۶n"6L1K^^Ķ k>|򪀙%C,q,7
+OSI9&
+d0sbLd9!Y=
+H?
+(O\FCh_7Rx(P:vNj>9n@m
+6`ao|OAL21E%6h O]
+ʜG+`Zר!pmYhw؟'n[OEp7S F?;odvZũ#,m⣅ڋf ahaz `o2t;_hxLcvPFǣrB4 S<PSI((GJD r pC{o(GA6oz7Ո _e)!]']2IH1ՠ,KZюWg
+q:/ -)A%bu("I*%f靔'HAzFאqJȈ&3֑M(b1Y8ʲA
+op==b/K꣓WnɷitI Lʰס )d==!] t{ZȘ^7D2 @ <f (!B7{A"==G
+c ;Q֚
+;]i5 u&^$1©6P/[w*`43<[$q
+l4 );Q}US*,&3؁QG05w'S3TtTXCuq.)lJbbBѼ0ᒢyf fh$VrR!-RaaL6%H&U(aשmnN7ɽ˒{o,nJQ8Ч FD w2*HRSռ " 5Od
+i#9L@P$
+<f&z]Ok!n=(X9 H+au
+"4e+#Ԅi! eu"'
+I0I KQ"!"ӆd>JbrɻC +1d' $Iu۶Br`eJA( 1Ƴ>v8'T*G| d9pj3X
+c2.:$b6iOOys-&0
+' ^O_'}*t %BԯN=%TEحbTOʒ4)uP+ԄQ끺$F͂Ć BAT."# 30h!9T!2l4 "_e mX[Ҡa= XZAy:WjUG/H-laZSK h)rRTpS+CYo|n8#IT"~ASy`e)*DF4
+cau7ԙ%$P
+g|Tv|{
+ B
+?J2m. ԘmJԄ57si3Cpa3Fb9M=fĀO)eH>ydEoXj3 Ė)pZMb f
+RrBɉe'$[HP!y"yfdkV
+q1RcQ
+p/$7lw#p&vEj PeIT%N%i82O A;SƩƸ6p|\mQ2
+͈AAWxJhr]^C+="Rr
+Þ6m)Qt)+֣%h$uh0!|%+7E0Hxe.7sIФdك<B;u;l>>CpŮqPS(@;N)U,F':&i<-6>C z@91͚>pHfl\aGS (?a'~<z}_3bV;$&e1CԌ[,-՛U!wJ1qT
+9$8+a:whj8ߤdưKp&>3|'%c52;2$Yt[xe89\Y Da0^ay57 0Xp(Py^h&\OƾE^^Ʌ/LfznfysUpCB/tEz`xOPy46H$ٳ{u/HGE1A8PΔQaKcYIydԪ $[k2lyn! HӔA\9;L9ǥNL!
+U3ψy=(N Kc7B@ʩ37 H$ m3<d#̘|Y Ѫ &pz;kW~[]RFw"UQ -wȈ_ x,W;y y{=t=z5":O!fuh5+ʦt ۄ9q1&i{+qEb5KnDyp&Ƶ
+ K PuA.5PbhbM__dx D1/ήʙD6yu};HLCA;qu$\fJQ 2$S\GWsPX>;!E\$F*>8W5tf55;o?!x9=kbȐ^uIzRNƲt9?p8)׌ȉ߼m}0-FVtqvb+ NʽH!U#‡
+6|, 'IGD#ז[$hdwB| R)5 ??_U1>X^"
+Bt1 <dʚŨE80@;̌u#$蹅A
+JtLumCQA K}\d[aA`qq nM\^RPwɣ
+[WvL%Črju*Naqd;JXH}M4L l<nʼnO<Ɵ8N#Ș>A('%}kA C%[!(Ё3.ܠ>=i(Bϧi< ,.ah0 _iJ59b\(RH+!]x P JFyǐxnĥ(
+@`U>;"ъ3,JDBem_Efta_Lh
+1Hڂ0E"y༂ !a]W JP ˳:2T>]PflUTǡ)(r1:% Owg*
+Q!pXᡐSZiPd)q>/*\b|p1W?MRc 8߮kt" mJa\H[`0buA5G^-17ί[_cRbV/OΓ
+HKOw
+9F,*$g+% g[{+6=trnE9FH3[;hݠ7rPEk+uDXKݐkGDضT)9pqc4PIy
+o6unN歗
+'a4]MEqp
+$I[;I`bbQ]e]D!$IK5
+6/19>3dj9DqgKoPfA)ɾ ҋNuiDdoɨ8KF@F
+:}]B}PcKFw@HV)ywMse0!7 2ݙމQd05|^14Smx0H;2-Ŋlc*b˳^{}~G?}R`E)(K_ADi)NbPHcpB7@Xvжv
+A~_:+Xg7;  Y%ȝ0^4
+3:Cdڮ+vwӕ[ĭRchH_EL=rrׁ\;i>/O ;pvat &"}bcAsҬN [HʦmqcŢ
+ki2B)٭n!I*+3;l$CRpm2D%ܭw.r'eMkKGh Lx@<Cvn2t&N^FRL#.<"UaZ$դXq/̤4ueh<y](GhάmwZ\(L{n}.4bv
+A@doƿdo !4Dy8#ME#iF*UQC~auB TPq3 +\P v x4A)Rc rZ"q+yZ71
+"JIiBgZf':m)x:E/Y&o a䗑Dшk6)f Qlñ!0TP5m҈4쭺Z]eXH̀cbc |UN ,^6PfS .@$g)Z{O:4w&%JŻ=ў0,_b́7vxQhk]TxbL'µ+N=;VY{!hdT㆔#Xo`R~nc.D}t6d'R3@]H̴|֨&d^ H<GX C1XOtc.LW%=&ɒ!Aoމc3^iV2S8RO7_+9j
+Г +
+4+uޭ=7 )`0U5<BJ&52dlZ^'RC!I|@|}~>r v AdKO2/ӡe JT:rͱ u $;h2@= JX]@;1oDhU3<Y$m(6Fμ7b-
+#uOzY֙SY`n N TT'yG0Dg~_ڴW}<H7ɑЩ~
+@F\
+@R+aoĪuo:p,m'zLϹSf^,s8/s$n$`24,MJuN6[s
+d.F 5ފf8%cb X<GE11K37+WM }ӯ}դL?$6vѮ*r?A ЂWMwMюd(6*,WĸI,Bpf<*-MC/0UoU% 1xBb%1RyS!8d*LB%Mc@xH\Pf覥md$hHC4R/$A/C: uʏQjF D63_ȩ
+x~T~=y8 Jrr(Mpv*4e^:]EȬhg}1:MA6]]q
+
+#l@oa _;GP3%|[f|j8jJHFk^HR}*b
+ f=ʄ5 5ׯ b G[1, mߏfQ9ּLA9BWtaz+V)0̰ukP,k}i:h?`2Zf+
+5@bߜS jm<d .Ja0]w@x uXsEVW6*n
+DG\yVs`T4/BY#9 &<TM,
+y Y˓hb7Ja1 cM$FExs@=o\%GE؟a[}>x؛0BX"" &e`;}0z(e^R_PĀWs]d1`Ú0 -HsoWA$LSwD^&j;qAcujLCѶ_tG5`b+h[`s{uJ xы{NVx؁UiȝKo3y_EYVj R2G
+5ssoĉYZ-N<Uw؛ײ]A.1/J
+?Q=í 4rDas'M)PۛsNkH 8sKڐ k0(i e:e )y3$T@GEOrn-Z%Uc/º"
+>t?\룅 h"Ju7.,
+̞F
+3(i&~: Rc žvVh0j^N3:
+owgmY[
+JqX8KdaIy씬wf%iyi-HE7T{ፇ)MC- Bbm4W9u]$H
+| %Aޣ()@_;C{~8-V Z(:KUȽsx_sgh;\=&Qu \ß]_&'A7pݙùa/I8k~5#zSDL6M*Ļ{R
+Iˋ+r;s{ǫU'*hp9ki`gp?cA>LU*D~E2J>f2Uff ICj(]}g&Du
+IW' L_/*)w~pI8%2 s?(
+L($ٜXqڣCy=BCJ4I>^]Ž ΧE#H<Q Td{#pt%?] G&m F| uyͅ^\
+^<E3}b_d#|Ju"Ek&8nFQb:WhfU_G B̷"TAbC(Ep
+K^/w
+q(XrH1m1r@8 ƓԋG
+LD7pv}69Bn
+}lB
+,h:4,oN] PA13Zw:1DaZ\S Z
+^)q+^LY 'FbF]bؤ̶
+5Kp$?TV'sL«0ŕDT(*!QcJ`.\Z( _'uXBخxCH$6‰Dq]A|'&\J;8 (gpI4m䙙M?n`8\,ɵÑ
+#AKRĂX4@7
+YxнVlQp(ky:d$r@>R%"83v/B!O 7 qVݫdȧ m|?BEU/oNh!
+3vS086&+J\ (0K5 Rz
+*S8`a C
+ENqg<'#]F>HἨ^WKPLBHdUt{(Bs2a3c TkgdQIM0űIF\հo1xXGR@$?6< NS[5hټSO%uɕȬo5tV҂E@`Iwe);9Ei7c*v6S#HmPS];o [q)
+:,bA2R;ا[.RJSeJ[z/?HRT"^WC$rO Aspa͉Kx}pO"7ɕ}?_**xOxY C͗†C\Ɇ.ܓ9ٸ
+#*ePwj'SjsH E.unCLi[…~*P2h3lr]z`h:*5ţ*C'uGf^ 7F^Z  cʐf.ʟ4Kg9)uB_^`()AI R-(s~D l17.f<=xXBP-vC r_Z%i/i3H!~jᇉ|4?$I';e1ki[[=)g%SFE
+nSp'3\zEtض^q^l>+UҞV?ME$LvDc "Mo0T{8W%('i9g©,} ڊǶŸpĥ KWi;51Tkkb*܍CnR`T3(9NꔑࢫA
+*!) mZd[ q
+6W6;6}a8N*gY
+^)CPz%?пb#/%}J08z~P=߾r4xˇ J8F׬%N!HY ףv&
+'쬓 &RRf:!%nzVHL3:즒=?1L4-Ign
+S4EGME&Lc(ˎM[,`|?{7CQ V ˂Xep˕}NOM}8[&>\]Jx+l8 @f91TֵEkؾ,h h=z&m2<`)zS Gv-HK;f4eIfq
+5_ȶ0A_|<z!^B^4 ~Mý`~/ޭhĶ2Kg; ߆fa
+x5V aS6UT’[[ak y/MZ|S4QTPQer񣞯?I';#ŔOwN4u}@Ȫ,5C&:3-|ȣd: GYL3weWRӜ֪#-
+XtEX`jowRU b7HwA)77lgf|\9$՜ c1@q@|Ir>[of)ԼԨU-4Y<0PPd* w62v)vUg5tLT/D%N &V$ϥocך*Z,
+O;{ɋuf7g ExxPQ Q <p0buϛ@ al&Q#=DJms7`*y+!
+Z\>+>jK H`sHs0+==|TeK
+[>݉2k_aX$tbgZY˰PrY7'#k#HlޠtE+;6-[nL*fn֯bp8ۛsdMDV7 5JW1 iSo\@Kl.kw.oJ
+䙷'AX..Eop
+wQNq
+mN˽t٢z^ُm%6< 6R N~ G19;B2ytKzc%"H$('<9I<\
+x-"Z)| .cIb>^Ț2s %P8Ѕ5YrWKcU2/S.筂}uٿVWS4?㦕 xl3pD 7 Nb?Ea>sa!j%xgQjUZ}7L@ܕG*o^cЛ~N*ks [osU"YRhѿ_Czjy* (;l3ʭ; FDDۭǔl}uVO%~8SAs
+<+fyV/K_S^c8䲆La/BQHŮio)QtAH
+M^ U]?dlg$,O<ҵv a}f6Sv)J\$? {f0N7S).Ң[xy(ϛs&jOγ(0Iiŭ97px).v 4
+i%1n}`<Ć!j̕nm癃DJ[J\9A4ԋK# P 7P/i X TI.`keCtup*i9A__U2gK;U,AP=;^VސOB
+I4l tX ß(F ]/C);!R,
+]#"DIK2(GtxE.;Y I!H6o|.lMto V2SPX%="cLȮks^ۀ Jm&5!8P)f<jR|% Ā
+:]>--
+#ܔLhEGЛi?1Jd
+p 8yDro5 Ʒcvs囙Gm>5|SwZ#P,F< fE߀tNe52unq$V֣3j{}IgJh0 G?Z>GI;xN*):@n'ײ ! 8*
+ ^;eaMٚv"[r7EPD/>&͍@$*\bGbi$FRcT }^@a1{^ ϺJa[Mh_46nSw^HSi k<
+>*DJyot"ۇLJвIq}d5Lv(kj+o~NVjR&\KVDg5r|;g s6st뜴:\ǃ-?]DY.]ü%]*Cym<mz:*o؋aľ/ʴЮv:~Iž5 btPcu]d:3)ao4J~ 5o鷠>SJ >ס
+I\c Sp\+#ٍ^@
+|jW}' &CD MPٹ~m/2/ (3G+Wl4k'/A4G~֘p/w
+T Wnb+S&#=' <,o޷x V
+߯+rP¡:g#9L]_%hb ߓV _ ťqƎ9xg.H@ ZYKW4G=o bϟgJ3!Rlgsb2P <`!t,Q)oAx-Dr$sYižAJ
+W:&p}O.ae9@%Υe} ҭ+<aÄ:n~ X9?N~[A顋YGRYS<w0抖PF y3Qԛ]aE_:j9 cc"F]qXzEQPs^zW8/:wTdQ_w~dZޯ$<ңNh,ڝE 5x5JDa.= 20cg Cyկ5̂I%@H/o@0^ӹ=([!^^$I_Ä{Ted>Hi&-~+sñΩj❕[bO:4qX&pB^1A%Ӄ?vURt:t:R<Q̉$^ֵ E[faEjS&N #fl=fcPˌ4mW0#A6h${ՇvE}Hu'FjRU7oPdm&Rhj%+/eHG*.W&1<E-%8| 0Z<o@%!7e}Y;S A* T@7Y|dԯdĖoVAKk{ }$]wY? phwr SHxEHX9D2 k$)55y}Q 2|[Nt݆w!" ,ۊtQ?Grv3 ]N9Q.#<4emI]4[h /eF:aM/} mu$P|fUҢ{t
+KXp"#"$c 8jm ȡ{pq<,b ,hd7GA|=hc۪L~m&Y?,8c#S:ࢰƌ8(yټ[ҵB0ޥ幹FfF47ܘ֍X&hӥ^x7kL_~w@'ѫ%u
+Qk\P7OtJuB~iב"Cfe/3 Y,B%=i"PNj$vLtl1$S;)Nǒ"a$d& #нv&)Gm@
+"" GTq0rGL)v/#,P_LҀqos`ǯ!Զ2գ`2m) +l$*b/ZRм%LţCI$D73vdQdii X;C:CB=1MIz*ɔ+4H#h̨x$6U)K"k-}4JҊXN14%g^4!1W<3hR
+HArd DO; A=˾"mgYUHH$cDZ{.%Fj[?0iѭxw-L,!9BƄY-j b1j!?%*?<)Hk35N*! mEjNH3 饏bBZꂈj+yLNm=4Ltw.ZUdSBK:
+(:}pl_8JRǒ(NS4XtPGRqfLmcZ8$BZJj
+8>v$9+QM0jxԝ
+YiE
+QfC=DvO&Y/x=K
+c)ԏ@ i+@”tı]jC
+.yU@mydnh%1=z*DcNo7N/Qf=藪zZYf8nޘbMyθtii6Gy2QHwA߯@%LȅE;f$8M–X9*ys^'S#Iڤy%X\LdGM%yNvztITҦI=W)XN$z_F^ŨK!q=Uqؘ$H)$he=|s8-GH{0ߋe0GP63B>ۯv Є5a}IWc<QY
+U9*٩7Ec-k^S^NEqR篂*+,\ NtrQ0a2b\g|3~AHCZZXYi5H\23 Y={M7Iq $g׮3S yk.})B%E۾1;efs C!KXj#vvxɎK `Wѫ\ڋs 'J#(L̏-"%]W3 )1ԓzbq'ّOnӂI1HNI+v9WOpn9[MŹ>Ph.,xS@ J4dAO=>:F* ?v*Cg3P_~}'ObZ7VMo"QŒ$mc!
+F!& P}j>9w[c}!/í)N6R<l d[E|h:c sc6n򛓽Ѹ&čZUpӼ<#>&?[Rr(ZBw6$[0u
+E4B8bGQoA7Ҙ0q<NX;Y0kn~'F-%cdesAq/D:͏umL3|ntFf^0 PbAB>ѺxR![7B1!>#7<.#; š0!pHeЪy6?RNNv# 5do簓F.UҶȥO;Opx$((̛z[Ii9X$) iCQ2!
+X)*{T,nj B㯷ޓYcuf#0EVϳwJd3X/nZǢ 0s9}Y8t 0bә8:ɓ2}tA"ŵA p4d
+y
+wAݪpGKIEѝА,5cԊ Iul[閎v Zd|B
+d1}&[Ko*@lV_xl)@hzJu2 ţAڂ/czG[P e'4`FpYx3(M6q4 "R2uZFLȐ4~c
+$@#HBYD2l[1.C_ RYI[8.}m6<i"3鍞.z;#Rv?
+##qvVV]CNGgNYTg [/ 9n9z_ )Pux=1y[#}/ w" aoVWpf+ CĘWqmf5BݸYAe&< za Ot# .v?
+[ɖ@ty޶FHwPո QAeqMk kpAT3s888 C+Z#oP{_Ձhő
+{'
+\m#>n0 v@:Uv^`6i#m<l;5bTi#T'#1HD,e|['LgMc<Q(lu`3}y8XdH;hP=ӆY"3܊_#>I&HN<ALQWC$#GP_0Er xܸyz${/b hh3̃[}S`ԗÊL%4dd2uTLp+Oe t.?^Ӵ:gP7KHq[$K u`iJ /*Լao Xhւ^.m.Gx+wMᒉT$?n@VSQ56טH2]ѥ!ʌ;98ksUHC8!E2ڪƂz\
+ om
+1KAxB+5 e>9uND
+z]S5  _Зsހ8jט<6݅i4]ӡ"9*f^>tjΑOoQPn?7K(h>c"Q!)>oAUfTc2/ix|szEo"z՛ɤ)lih,bgtBqC W`8 L ]nq!dx lj ְ}9u
+[0uQ"A;lNDyBɬ
+NPV(uʡޘTt>2E2'} < 2_\HBrf<R-94I@'=_
+B4; z@SԌBVYNW 4t °Q~{1f<
+v6H+㿐+GM!'&CV!3^^,G~һ` D-Ǯ& bQ.ﳭH'PeO (TXf ^JgTĔQüT2+N<@$Rꦵ:Č7.+z"
+JCcSaDC0|僾'"QN5"\!SnAʨG
+'yl2*и=GV:R-rȫ CHcRd%xV>IO@8ӪcVBOE BA#f܋\G83x~TLMWhqAxSآ,g^[UfV-ت&MkZOcoIr@ɑ]qͦUFԣ7 ڔc>RҺSfI\L [sWUDɺBNd Hd
++^Lif 헋 ,æx BBKZJY[/6b 8EvK<7̈L|UzΝ/EaɚÂzƸ~v+X"׊E@"\FiC i##2=U@MbN\VD=
+6M!'[:D kBhBXKPM$#:KDk-3:HL~!cq#9(zށ "(N01uIDb Aͨ_pd
+4'"h 0XmW3IP<*J8^a+̅J ]-q(|N@%?6c0홿"
+7EtK
+R>8xcw9yTqpM·
+bZ!f:~)O
+fAbu@wPjk.F?C.?-fK e0N (=&x}&TP)_ &Ԍ#KޜsJXUU*P\5Yg8J**11zI0ŅvQB
+i 16Чj AIqo?֜YN8=yp
+-`]?D(0
+vmR_q&9>
+XfxXAr`l3̊z("޻N7J1nKAΠu0Jlc*YuS!i$ʏӦ1] ( 
+ ޏݼ=Lɧo&
+}nD܅%-wHN]_ז!Crn (+LϷV}9Zhc,i :X߫Ӥ^<K41= AQuY%)4F~A 4aa:{G|o)Va7xNhG/?]B: γҔ]()
+ISc]c6 iB/SbŠQ+ .VQNx(-kJ^3TE7E"p
+KOEYEEzo~45 8Ջ$+قQࢋWUQ)G܏jer^[T',
+_2xqŢe Mk"8*O{rп$] @/MPd uy@Jx )
+KPI nYǪ_1KI
+gv>} 6+˃(xX`
+_`3*a\>Jf], -ƒ{n TјFX%jr??T̈́H2 B\۵z(PwR`pb,XEJ/.
+Ԃ}/H;tOA;) R~[-ߎPN"PC)~H5(ŒR-I9V$;,RɴH*Q=z pa~FJ EAم"'aT:WƻऽvV2q$gjRpY+.$Ijr(..(#+2κ)ZJ6*o} `C
+ ,q}H\3%{ɛ}fCR122SA6C;L9IGWf#s`*FQ@NϺ- D|z=Ec1yJ8#j~FI54A%`YwjDE%RSCuuϣ3PD
+ ^:2!xUzes,׸eʢFJkvQĊP/h0wɪ.t-W>;T:0 <Ni0ץ:))>HTY~
+P\AS4٩soPLEXx SHxE*-R-a2pą Dݓ:A|f"yz "ӳ* ^/#5}'b EA$HzLOZUH-.́ⶴ~<εܹN[u<؛^hž/>)@zEm"&fPݫˢ.GAjh@h<Y*"l "-S IM6;>ԽwdڽRS{_΍QRH;%kP"ݾHCY
+혆Spy˻t>:Zk'kgAJO'^86D=Q8b]?q( h.qo\taH:>
+VTn3sp*kHnklw}IiWH-KCbS-pT^WA!`aY|Gk_Tp bP=\RJ, y=W\ȼ40ȓ"k5*YwD;rxq בIzB Q}/s\P[LzRQ'ogo^d(ιx@*[s"*#~®Np*jLXZ5sPw&!\uU
+$-P84ȸmƊ=Q9OZvT'Cvf[f==oEٓQh1\&7A>.MΨO\rCJUc@R#+;Og<|-!ᲅU|rEI"_(yhs$c>I$DO; \} ms*;g$XDQ$\9N΂ι-.gA8Vۍ%A
+=ODgIGd>X1k•`Z=r_gJ.Ѥ%};,^'e@Gx9C0/p0Euu-W7aepS׽ib1[E,$%6,EI-D bCenRW°RF׋V`eelV9FK:J7fCY$fQ*N?S1 ch8v@qԚ5yA]%(/@3 &l.i1~-6 (uecAX],zoN#7>f c9O5&y$#yw=pS`ۤur./!$#bD9cLZ>o6Q.Ugr
+]QHwp(
+E@1K*>)MCø;v
+jrw܏@d_]&EI
+szߣUX$PWAUs#
+LFD>><Q"1c OT F)2"
+RwqD6X$}LR8REˎa5DvSĺ-Nnpfq)YSO<&;="~$ N`)]#Vs Y#5X7i,,_>U6O G[T Ptt^}<(≤^(;ۉrdzBۚ+δ.NNITKÕ(x#l@l 2dY,ЁN"A?~Gh NgS2OG-gI60/6]Wh4jmIW4/
+DѺ أM>w%PZBifEa<8*0߲4glQ\[AZ͸_ gNɚ'߹v;tGxkƷ{4ٙTNBxP{/ֲbǎ*' :tƝAj|\o2UEH ldXӘn>}w#6 f M4aVE?
+lLPnO !TEHs] hQ6GN\u@f
+="(xǽ "Љ S+v4N O)q>+]t߽io\]k" s*oeL zݡO@7mz Hd"ˉ)"|@I׆1H)zW$1,k<z4HQ'0|I 4Bz=&t'LlƯhà7P7)dA(ʪf  Ol;P7O !3#nW1\,Aּp|'|q Ag,p#u gW`C`̻NF3 KY'ZTKG+tU b]^l+P\%dO۾Az<
+D&t.o0y\ Y#bՁh'
+Y!.
+Q-7Wlͷ:_ Gjhk H AbsV8rRG=I r*| z@7¸݉B~LH<pO~`fxT٢5^U9o䍳3Їuxܘ=Wgx-:MZj?]Lfa/jt13WOYo08qH:\c\v;ղ2LG$lm1~.6ErEn5*/+: gJIK|^ 9qV@{y
+w r>,(1B {i%ſ yAwCDc;U\Dzp|@#<GVxhsngoTWMhxI,{;A3=c/7 R0%_'L5S+a<Bp>8jhq~M w% ҂qʘetad;]k
+}Jiu[4u 0}&QT(@6^?k=^]bx s}=7S%q U~ m>B|NTW6$֬<ş֨s `:Q:V^A%&9U*ݘ&)<sqw[-x;Q?VhRF@0r\j|{ RHTwWxDD=c%>64;woE_|LJ:~.5QV҃1O^GZf[)L|Wݠڹ:]T<
+O
+L "lے񘒴LDR%Ctv5<v1JYyp+EUxb[Mt= !#^ZwE LV߂V(6^$
+EBnˋc'[my(K|D?P7cDDmrNR@&#u9E:zE2G)Ʃ:)ҏL璺 @q%U<Nh5/UgfC}]z_X|owt:DYs!LK$hV̖0@[޼5\ G/s<Bʅv%ES`J0<PymȲWZGCO %G_L.b7:kB ^ED[kv HA:"fBAjAm[nK2#k:Lo7h10b8 0(†jK*3?Ae ]ZM_|ஔzVB7KM #Oh
+6#rq3<!9@djhe<8?i.i!8~Q@JSچp.4>b!ebx >qu3c,>ո D><́)AуO&l bxJr<fq-ѥ DϤb%f;R <@1>iP{-:
+bL=_YEfJ&}*ܘr byN_NH
+sLeIWAGG|1[#"WX,ňku^]u T]>RR`Z /'yWXw a%i<M8C^Hれ&ZSޟ[3*"p&`G/)vmtc
+gx5Ӟ4LV<~Œ@UUP K*4$MݥY&hiex pEع+15C¿\b2bs3F0eWF+sͫΤRpnD"=wvⲣQ3up2z`$^G}b|zeğ ZE>UO|ftEn˜%?ss9xao>*'F)$Sä?$K[+jy7P<<NAAU$UB`^bqۈ
+ti+v n`"j!R~"o*a dнy&Dռ3)A‹ݏQQٟd6իa'KJZ'4'"C]%5#GĢ#aAX)sR1J: Qv`RN:4;PF3g@$Ro/$܍eE`1;yc!9Ҵ
+~ʅ)t@VxPF%n$D
+!UOIP o۔@e!VN"9$H#}$6E5=?iM!40~ U$f8 8y^)'>6zP,^wLqj
+ `͊1u<VҸ5#`Y֝&;q6/0r웛1otjFh ݮ syF_ɟ";0&5Hԙ.e "R)1r#!hy A)ndދ/2q#Z#%ʢhёkΜ"26H b;ن'M'\!Zc\7uxO5~HJJݙ)J1Q
+w(a4a޶m~T3KH'I5hco@@&+,{>ҔE `/!XZY%Qu $H?u~)S)-)jXS1#t"-_ëXҬgs((|%Ext3]kXIÂp{3hPb哎h\8(>pW5jf u%oĶjֹ['&J
+Nt$J'xEJ2 */趈\@;fhg3)B
+cKXy-`(:!իz<1-:i<;XY'
+|%R}ćBh$nxx"TSܛ`Ə0K(%,ޕ=3<LLHNyQ^<U'(RjMF8+Es4 |F8tReD5_ e_ @S= ʴN|>iA-4ҋP0 d瑟PP;!'h_VD.Z-Zܕ1UbnYCvƀ(WLC#=d!f|[N9E&}\؄Ę-oVBʖhbiT8߁:MQ-1qonWԈ6@ŷ"%BFrMRq vyx^:8J[t|6ɊF`Aa׶zbȇ&xTP;ISRx7Pa5e"]`~ulx Fϭl/[Vk*WY6]uj=l9ҚY-zsqU`EbU2iVR] .%@^Ѻl
+*$Vmq1;%
+NBV.mr3J@m?(XB9NYC`cBUd>]4¿W 8 ;ăjon V9_ZL4^a6txb|;HE)4 O;v /)!q})Y.Z 1q_C=Rć2g5<ZjE\Z(^h?_Qc|'*[5|~>݈83L:D&Ve+LdnvqF`ʺxdyNEߔhGu<3%pO͏Te[wjTArL23 B?4w^D
+
+֣:;\/TgqXCG)ĶϰM&z'@0+͈d<s_jXf0S1pV5ĹVZƑW,u0>2g\k ac`#iz]%
+4%K
+A #ˍ8MS`:PdKe ,h<`S6e1: ::FX4/ҩeZ<<ʤ3
+Mŵ₴dĀ0|Iqր$P- *Y<õЬrL/u>
+HMd O0w
+)|6lcj"24ƆOb} Q4Z˵>El9s6uH= Ѻp68uouu$56׽]{}b*;Nzinl=N>F9z>]o.:F4sMD{fo*)?}{g_1??yp*J5hW m6EK(J)^7 53_bB3|-D>
+ }X[%pY8(p ieDxlu()0JՁۜe^i2Z9\xft+2xE+2$TdaM&jy,ͱhP1j?2Gsbis@z_"ψ gi"uinQ[֧en%trKWQohA '*J<e"4齃'P ՛,<[t3rG=4i?sӝ7-+̰}w{OjŌM PN(
+bXՌ'd Zȁ;hr 1ֱ <^};dy
++Lo 8&&5!K$O
+W۠l~ Ey 9W /HPAgr / !CQ>u5mEr2Qʙr/3Ja*'ך_C9=NF /--Rs_rCyx
+,~n
+j284+˂4aհ bcp%y^13O\S9悘V@-T+Ϋp/VBN~]͂Y[o0Ώ]i&-AOgǸyQ\Ai'ՙhOJ1)吕LMiO*Q7I8 H5ۚN`_K,]oȊɐH?}w17d
+T[(v)D9D)njR^
+:NĽFwd}xvĒ~ O':P*b#LT ʳ45=̪-jE%MyiV:G@?rpSqޫRT/b*եoiKsVO5G06*{-'|.oY
+˯pKk\FB)@lhIW_p!ň~wÅ/MWrJ"^IzA [SLGE#u urNf!^cX"^Eh* uXONpavdA($Ql\f\t:5QA۠s
+DPgI7Ɯ`y^D &g$' MWjT"W^$KT%"K|Q82%"( : d
+?oXOݪ24*/$"'qYWR\ˢ
+%4kG=0 Y5-1MveM+!cv:ĊEkQ_%wmP
+H١zT8RɃi:-"+yQ$.
+>,N*T:LW tJ}QFeqS5/Vr(y,<<xt+zvvn4?Zܹᾗ 4{?xrhYw%6/a`M~=޴a깱TbA_^BX`޷d=.V¥a <V?".p'"oJ( VE
+N}ȥz]éaE}@
+i'qK%V?ɢ%[K(
+t
+*匭49o܀6*,/[bb{1w%K۩=9@G #t:Ea.N&x4nn d[ذ3TgȇDŽ<EVKX8_Wk$BK7W!Q8X˭GO&%ɟL p=srn"!R]POZ )04vE#{(*N q0WaE?_ix4"hF0ts-b4 ̃4=f^xLGa-/;V\DRpco/鸅ei&} FpH/ߊ| ݌c/$2ݞ(c2
+ŸbްQR. @=rfZp&沑JzVVdbsa7=8ԕ30\p5e'qOO5ju#wNFYXxNp
+=3MYq ,ǟsz
+z)q+K2X(uE$7hU qY^<Q
+)aV]#Zo]<ExP=^yTdJz`=}37ʓ %P}EڠDW+gD3**&';=lnv]Q< NC `)= F ={BѢKߎZ-TIyW [
+Z,wmřZ,
+=mA<Yv39eU.1._u@?#:睜9LDD |ޱ(0L$=Q$Z2-s\_:ǡ!11FXr
+LjMʔc‡xs5dZDAI>DdϣMYF9[q6ZX'C3B9mo]Vyܷ^h;d񉹡|_L8+dQTcy]}z!%l3We;K%T:
+[ވC dE([}@Qcrvf@HC.JK $R w2 _ dQ^HdQF'(Y
+n@/~Tr\a9
+e4f)6fzMH֝3 tBCbޯ29*d96-ڜoRk}}Wh}kT x WiX41:8d%b+&}35K8b:T
+o+ qe7Y G0zְcNobo0<@,ڀ̌7~w"t&) '1D;ZF⦩SK%[uS[ܘ3sz|%}l(sP j%P?WmVҖEﲚ5d|`D3׽ >b 2?$,͒p}IRdAҿ0
+PD7Fڱa]V~6gs>-yYA57&5$7$NB(V;ߠZr Rxl"dBBa{$_ v &cy|K"qN6(A™Wyζ 7 & ]SZqhHRR^o6R}4{Ԉ:۱[xNMY&
+@XOMm[P~+ <xmإ".7AGJk»M\Ab[*`UH܂wuyBjÿ ma+^<~S|7tQX`Cc%&7<Xjaj.2]L5 l\eC'U;B *A*˱7 |5 BZhwx-8Dw)z@QWFE%0|7 oB {Ax4Fz>4-6"Lk~ c]Q0\_Y %Cx7Mn GW-ED.,IkO
+@5ÞA:HTGXɘΊU ]͇y+ՋWF*]rd)jN%O9ĈV4XBd,xY
+h204r'P[O8"q}~2$γ7ҚKVZ럘Ŕq7ai0^s9ޮV "~Cu-F@iVT q-\d(1I>B;@3%_!XPT78r! bO/fp8}:$e} kJ^'^ZTC=tFB N{ yy d Krl|Dr><z=(:w
+Un{7Y# 5dʔ]Ofdec'KX!s6ց}cޥ__RVtt=8J G=* q$:cz1cPl:K`
+DJ{VmK
+Oqs4WBp0Y(@ o{G ԁYo'<:$B3׆pKTX+K"k}LM|Ĭx59bFE)%41R]q~i<XoȰ
+a~$@9Qfm'B&/s&f=&'n06
+H¹R0L|B96= h2PD3]ifUN@;3xA
+v>A"^1gh7SauSf`l݁!*P첛Wеy*Qe_ϝ^r3N ͸P-31 sHg($! 3GZ!RF\'d>JQET%dDTP@Z$14Ia.9=VQ|c59` Ŵ K/(C #b=A@2_t_b8%
+Ȣ#Y#`;fL'@0#[t%5
+Y,aXE5WySRFφ<@J6[KONX#{a5@e'CQ2[Mjzs)Rfs;!W]Š6Cԙ!LKN$[%)z'|tfw{CmuhڗP;8ؠ+8Ys _nqmlEK1ĘUw 6/~ !RNx`, q}RxMu0 :0͡A
+&I$pRm$:Ao@SERS.AdǏñ5>Ɏ`LBd(P[Ds񌝾> NM"=ű' N)qfbxN)!2ŎS_ŵi۸tIpT/RǕS](C"L'V"- dKiu(D r1t<NسŸ I .LjeQKN?t &}au
+'(Ζ
+ۏ*@aܔi?n': Q!V\AE61&6yTmR8qLP2cykĄwi~g}"–63&(` ?{91{M{TަJyzLW2#N^x AOG JA(r%!5V6>&+zѸ^]=H
+B$-s$EF#,?T2:!GԪucT''PH}NbHE#AȬ ͛KC,01R=Ԧyhk<'pIT)Eayte>g5;Y֜r)NE+ A"֧WbaE= 2(,a).8q_C6`%@`ƶ%_gl\MC"l6-.dQ.V8@w-0ݳ~M#@swdG~<d^.N#hwh5u@~q.xw ]`*=FS5FWF8y ug(tMBFHBh),7Jzwj8<2f>BieV?G KyF0΢,Éŕ]#QƏ(bơno2<JֵW) *zj/t?-m5(fGf;<& X"vRwIW@9)uZ.~:uq;Au-\gGt@A1 MX%.' (w ra16h:E{Vh
+_8FWy8H%Wj69DSI &dF[&t}'Yp ,’<x"$;M L~eH ۫.ydt'cڄ4E:vzBT`DJX
+=J P*FMA'ML9HQU ln g(ě !see<Ì*5@Nf~>P}aV7jDkz'-ORr<{7 h!oKFU4$"[=-?eH2<(D!PR^wl)Iyj\u':3u%F%.26U%A8U<<ת`D4<? j%lcUSKC*'DL'P9yQ P׮!',6׻x";NQ$Ur(,6Ij=<0ªņ&tZ-&U11֟PV$9Rk1 ➭9Gj}Մ6ިq}[J
+s`(H~1({WB%l̡&Ă`w'%,6% AC)&Y|:ZP>H}}}NɊзU=vcmCn=WvC&UgɆ-D v"M |( >NfH!PdKY|.)n^XtC,
+$f2HA{I 7gqBAfм2 6XWP/ (;pY)܌pQHcՈxYQw/;)uz\.|
+
+1hswaߝ ;Fg(7\ocAi.<\F 11~
+H蟀+ F91(LfqT2 TtlǨ;zR[*BY M-ρ-+PJջe|Y>,V|ѻ*AA I Oc-u/*'"x1I+PiEc@T72._+RΆ9KS۠K*Uh&۠K{my#T+h $*AvZ`KɢvIBz_*Bo#x<Ce;ńB HgY ^X=tn\򺕇bhd`x2ܰ/2SRQӟuv޺z˯$ cD%Paۅa?)s|2z1H/lp] ~-QSsm3ja=TJ$g"5'<Paq$q@6D]: ҈XUϫ,=[ ҉I9!?c658z 6-sQΰxVAcB>>Hu:2%&eTEMdP喻bK9\$@9ЧyZoKYmXʋs-{Fłt}\wdEqG%fYEpbtЏu^,>Ah-CŠPZ),9,_21(9MdBZ*nVB I<-(ȞA4,yujd+6
+sx h9cD(ɮI̢$=Uw8rVY 1<K~2f$G_cf'2._EIoV࿭]ɞU$hdi &H:
+kę1A:G+%d-O\f6Xѩ5~9IdѰѯRbWʈ<_C-9UTIzKbj\cJR3恿jZ$Yл|)YAxه|
+(sޚ,A&j5Tn5q
+`r=S327t-B1S)FaB6
+4q!%SF*S2&w ~6BMRb\*@aāL[Ҙ>\rW>MEq,]bBHGXMe֛OVFr7NƑ%a֍cAv%j>w! :$?8: a9{I
+m)eM1wY ?<<Õ騹fU/|v7Z*h SemXU6rh'/]i0yμpbYߚ޲30H!e /Y<emLt#}Hi exSWm^zI, /?{KSePF$:{0_<ҘQPFy d |e⌎8ѶpQx`P._x|RelCS<}=ssέE;*^.uu=hX(s* =JjPR8ùcNۂWz 2d.I#*Amis/7O -S?N lpKV8.pG엺!~I:@@A~YGE|w Q Yi!v>5]R2.'
+dG )cJZd&gH+\$ DZ;B׾hGt=}hǵwIzݻ<Vo笸4{Ic'mVC!7p]= NmtxߝD]l_% &lx|#%u<B0}ʼrF{,tY޵Ex"M
+yp[ǑcV@_c=0c#Qqxa;.^&¸ݗlV3 S\Ma63zNn"goPatץ r"ɘs^8?3JX$G_PԂ92; g-~h/p>(I ˰g[YbN<nkv۰;$uz!;gTڝƝ*NQW([EƧ!uNxkWfy+#f+:V[ɷ v\~3:187 _ޘ ̍b4w0ONfcu
+S31hKΚ
+1L%[LmX$ @nRx ("K-$4IDnh+=e~)YV4qǗu$saL=[ FaM'qqOuux=_JpP_+4^d
+9Ҟ:kCmf԰U﹊Px~EI8 :6J0O~{H4Όx\-d9RwO#ߜ&Guʘw}0Xq5Ovih;Za<K {h 6<*9^4!x
+ R1^o G;+ZHL1ʋ
+*Z+JuRBa([@r{"]^V A2, F,H\Ò͇ AJb 4Qb|>v*X!$Xj6ғѝ[6Eפ%@rک9ڰ,;(Vҽhe< @# ]jyq(Le.ȷ"KBg-䰣N:n.Y{uXkRpP⡫eRu4&/c͌u]`p1bgcQA ;BIhgLdΦh֙:#^2Y]3gS7qZx'T$KWI4$C ;N'Nq}'vhUFw)TΤF>w0?i%J,y$JH0yQ
+[X)v,F-Pt
+h.~| 3,Vb b:JC_\J)m]hA^u0yW%Zb@y0 @A^3+Y:>)Pw?CC $}5ݵ0]"էz=b"̌CpKP
+Cs| K5 <VUO'fh>g B=b]?@PUtxL(^tFLNL(ߔbYڭqbȢ',\IA!9nوpCe)i+$:@eW0k\
+b2_+شTFwTKwA8g@edh F{?榨08`75'ImݜU.J]?#<eJzӓo l2#La0S0eoXBw `@I7OW TqH<* bkұCJYPKB?'$5CHq!:2a |Xxhlb^/J*E6q
+7
++ N(/0p hwNWp=@:{J hXMVlH<Wl+Z|A
+^I 5}NOIrv BHzqɥ+e Y Wϲ8 "U9nR/Q. o(Osʾ3/@;HooɌ~r:E+8VAuu @Pbשү*͞7?X V4,6O_rZl%*6'ˡclE0e]--EHFOݝ;KZ2731');['[t<銭 T1p!M'M2i!qv`&^eQ#Bvsoy`RĬ4{$)~M&$- TsV_0hL%Y]:":s~4gbȯR?T:Yʌt::erx_##1y[ɯŽHdH2|Ji)U,j e+)7B'~dڑQhc˾!lKM\ c "cM\KGgEQS#ZN[62 { eыOdsSO!Vv RXH2TBݕ%:rM y*Q3
+ d_ya<\ŭ8 Zb/ŷ3Lv=/D7[vނhtڰ*FBW&Ӷz >9ΤxNJ\M#Q>`K*f'9Rhifa)FQbhg:8?JY* 6ʂAY p:RO؊|Jq` J!
+"B-PsF?K+:ݢi7"7N %h IM w}̯;9yArŕ Iא TAz-v{ t15X@̄]wCb
+:}d!eJ7ʁt30Ε*:L,vuТ#AeLr<b(|A'0jҷsmG~$l-vM||\|a t&a%Oyu\ (>wm@ 9c'{<<`2D3ց'zVaN3rY^
+a
+LlRͼ5kmqdLl׺$K|44n
+j/[/XT-Qy?,i4 wĴ.ExnRFI5d;\iTl\^K"Ph`ۋ5GN7V 䳓;d}~g-yVfӀAM͢3J6uׂ(4N]tVBO퀊hƭ8t p(vh8UZr0 ?@9qTDVB;XFD !(ZDh@<g;p;Nqϫs@Wxγ `:˸[.
+>fbt'V)ʡ "%DދD| y(z-2ȫxb\DDQD,"s^!uS28%MfJχ[}+}aHtn9xe ]-JI9t3wLkC9 R)e,Ģ|! 3>%bp$w,uz<;-9SB #lt/:Q :K㬔<0ÚuՆ)j8mahj`4Ӗaɭ؀,[J8ਇภ
+&OO,w3'KmWEZpM'Iy(yEDDl(ŏapt{3ZSKrU>Z/1|+bGo9ЖvN)9Ւ<~!%]Ua3E!6%XOԟ6A-#g}
+d7Da@$q4869Ȋqʣ*!mePx|ϡgz_SQYJPE꽄EJč*=ڪqIv9v's*oo3˽b 8t ڜN;cBx
+ C
+
+tI/Y/A-FKg$:A- R/Oτ)@hrfRdM!c3slUہ4+WHA0Jh#sVL=fikNfiMQ߱Kx/3凹Ҧ>{0T%I0W%b :=Jg+wD?Q%Hb+ k>/EBAi("%EZ'XR܊^yL"lZ[NKc(P]+ GKÇ>x(Q 2Xi,}{ 3`P+;sxEZG9S
+UVԜ> Fx(ǘe'u\1R?0}X2#>Ƨ\-dJ~|w:_Ny +4W=~
+RC pțɀZX)1|KbNɒM'LfʎE~1!t+مR: -EI!]^>}E3{vVT(:dwbfpuDAa:D@.`0vkcsy7AF%'RdL0
+ x[< T)N4xi"FH;q* F= Fes<~]n{8!r) 6LV&AB/g_$\Y:ai"#Id4=^J Ct"ؒ6٣Z)NE*9y"j%D7pzN87FT1;IXKCG@dYdd*D׆!71#ᤅW
+HAd DOPw
+25w!4 EvsʹhN:E% ^xfUO>6 ?#Mk cvAzS>Urd% OiJSO4*:񶝾M[Zv ;tw'B8լ i1 dӚF9[;S$7{U<=q|ctD39/.|A~Ŧ%Yo &4Yܠs4#1tScXVr4(׃10c_a<9N'KW ;*ϨG y q4Hl3Ocz &"1z$x{o 2:x s Y片 [ F?ۛ+R%|NHSiI9HMܾsҊf_ŗ6gٳ:-sS2h5dDBivLe iM]lS,{<Fۼ( Q*H KZ.Ȩ"sDUlc'b͒^X} OƁHbm!PR{uJ{ Frρ1]@E5FН6h}Ecn_HSsޤJa\O v({5`2&h]9|y:TUTovɩIֱm" )AC8o36cx@x![.:t2z4C\ajrb>gsdR *(T3
+&8|llC1c
+q"1 @SLo@KoBO8_AHU3 ZxCΜ-ji{_#o ?U9Lv P7)rvu=x?_]_" ;K ֣L |-'FF]Dj⁸Ƚy\G]kjd1*4<_IGO?@I],⠝:.[e8yiLLV\ǜtĜlNOg$>쐯aGF7r=C<
+j@,kȮ`%Ƥ;:YR@^ґ'a-K
+xU SIhGo ??
+5Q<,[L1Ua1LL.ea|j>AJJC-5}h8B_Y1Aݝ*]`ub" M?ӽi34
+?
+.DzSye鯤P9מǕ$(61Pa˝XMM_RUE|B7jG}D;6Z h ^ \fk;yǵ{zUlK0nq>)8; ()[zu9PwsէwgwA_%;'J
+Nh=JI
+Ju+_&Q[ ǟKԿ"ǂ¼LD"UAE{D剮R!r@ WQ9M 3"|@ Zأ~ꉂS,>Q;b{{@bq)O9VY솤u NzeN=.GFx~%G'p7 /}S
+޺>;gqAwZRW̔3eZB,\z~zwQr!2D "+@0Ch'ފsżo NlXI-WYSXjeY[3b$jj=1V(6/;rs;OӤxri{
+c1\_xRT{_;v%X-Nj]4vqK8d , n,ʹF
+Ԓ6fPބ5 G `'[$ D{vx8k}LN3aɇO @3Ƙ %h)7 XIt|BۄZi7L鍕L PR.&^ǡ$wO ?d<TD2eKjTTTlR#؛μS1b4kŪcv$@ J(Ǔ e5Ɇ~bXLu'3 R8c _&7!kq5b+k ŁO^F Vi`ަa))b(71#ŤtՇg'iD
+Kϲ'h VQb-vL@[V.?Qַ"tQf~H'{D^,'45%?BAP!f¼̩F`XFCN?
+(&*u.U.rIB߷- ǔč,) pTBEzSߠ'
+s $ %ړ}9_&%vER|DZk+|Wo=)QrFT9
+L;L>hOzK\$ +怪t0]u睞 b.rK ALd7Hm$)+~l$ jr #D@X\*LsX(LVcb؀d^!
+p
+d/eo:[%QqEKESn&[B (dP|u{H-V.0i!b
+֪h1 IsfT|YߥFᩧ쓂1sbFS%[QEH74,8VJ%7Ճ61<-(u9Ȼg{vy;}c(
+^\Gg&j/
+}<%E2Pߠ#"|
+G!!5,-V!hv
+D'- '{V'{nM
+vɀs:MfGA;:&i)Km>
+1*oTpj5H=X``oGcERknu=A\׎o'Pk?dWǁ^Q+&338N5q?Fjaj{UW`沥ЏBmÝ[˸k(yʬUKcd\ lZ5=UH%3bҙ}fPOM5`ق Ǧ
+Q!V54A"oZ7 Rcs?I)ВbL]l}X@Ȋ$TuH(Ǟ#$ML)u//EJ4eJXS횚<ꐉ ZU
+7kt903jV܉)'= gf4r«ъ[pa5lSn w8g OȶME~1Ӌ,fZ^!(2Aࢂhax&҂ydmi_wZ $38Z6) q_ ϼ~pd,1U+aGQLGK  3\~Ap9 RutnSűoʩ5 PTy
+٣}4/)yp;Co2 pgk I=BR¨5'**Lqhf)쵝nb7Zɕ_bb f{)ƶ_?G&@bkzp~AhC@K/HeZ)F;ĆC|9 %N 4q'C.lJʌ$GUF!b@ <˘m7C$3Z)Ie&p}0Q
+s<iҘ`~'fo3|M&z^FxN;\;d?Vwmxv;@4XRQ D
+F/ \IŜ0YONzQSt')
+ήZ2qUM<ۣQW™= mڸ%h2;Ѹ~Ȩ wvcuȱci;0SX@r_H\ |(A
+J|t9Gfm~ q@bKؘ`#<`(贯ł)F1J2vxmv g2|WLI5 jRvޕT徬
+/^R2 qL7 ' \V+>㺐Jjf^> P %9%$q6$+w;e C-heIa3@8`jk# r!6!/gj,ecP,Olwh) o'`џ
+y7b`! 1ݤ-ğrN!|guJdL(<=
+@$cY8U|YI'`^yۏe拭48v||\&*3we6 <;_")M!C^.;>ڜVnϽte;x,]#i<@܉.z'EV,25cVyq i*gR,)>j3:01X;\\a)brHf-C$8Ĝk| gUČQDʆ` P1}\YZk9D$bm8erErc ks'h(J4*D$]tg(]V\َxI%%<sk6~_!}iI"#mJGțIЧ=k)ՓW}@_ AGӡW\4:<m#BHn ecz|a'ZO&~NQMy?E[Y )q!-sR.p\چfàGxCzpXQ iur[1M1-ԁ*0 ?]Н˾ srR ;'0H?cd4Z*5[ДB\ڋ L b7a̭pıA
+i,ndvpޮ.p!g2<Saa'HiLJ%.̍l9^C\25́sƍyW@L$Ɇ4UE
+PC]CTЪwׅ1a%6+pWf(gVl[\T*Po$mtclqh^&@ٰKY YZ%
+1^evR0}`8lcZ9'<BftG/D үHZBhwUhsC #ҍr5/T̰W9DSTֲϫD1Xgs;71[vYV9/Eb*%K CW,O|zqy*E F9d(4Q†_(c}1WCw̗2qngcӅ`Vf$<{_៶!2vXd
+WW3u`
+PF9B
+°gEYŎv|簫X!;gm=B1SOJ1@s2S(Y" ِ#Q{54#Gx)kMvޡM>6L Qק V5`螃t?ttq)Ŀ|j$S:21Ě:8p  |9|;ır7 )ϔ9jЕm,n
+t7;!T$pq5:loZ
+!OtŨAh:5%%ģ7p4Ɔ'8Dʶm6&SFER{S2m[N $?"*eJC\dу< !-vXq}{~ba<Hm2k!M@T˴2;}"| h$2#:_@lMBN
+(~HBX c{l_tw]ZAȥ[&L`&\/Rn6=)8PJf@&bu<fi͆弾ZevrPO.v/wr$@{F ́wVPhO2{s., h4TWd|g+*94& NT<J<> h Fz|b: P;"$ˆ/!̓YnE2
+/UJ%lHoz =+hm{~hd
+܀+| |
+ 7BZ#B $Ҫ_"R# K1%$ޮtwj='vstRD,shGHI#q)%bS.)L_Nrf]%?H`vn,/w1eCЉ)r'ƾˌSDG@P[(z7/$^,*w~m ^a!fRdNg |~NH1FqRnzpcT-eܩfTQ8`lciC_2A{Wa ֠S<)0/cfoĕC6H*?,J0_?@Vq`T%_;~M/%3[_^gDHQSǙ`ꬣ08%,b[ӕr1̇TyӅ-#Rn0bݼG Gi~(":37FX~l}zr erL65ͧ;2!jO)_bdm<,,$BFؗ!viwUOCF)y/Hh \ցᐙ8 ҧZt!)l溂qxJue;a*-Y?,49)I/T!Cé{pB\'pA{R'Fbjqu{3yD~6NO)Yi'}F%/g7% A?>$G~.5u^ bj4GđUH BYHG8qؑМ, ݰ; (*G_`To6O([6
+5 : f-kG~w0<QocͣHn-cqd{qd^J|<ʏ
+W3?oSKM<NI~ҵ8H!AdVf
+)Lidĵ\*{}i_rڃqĢa>P.`/ӌ|:zΏ: ~#pC?`f{]IRA(pJLؤ* { GV΂) ='1@|e
+p;2xU JFyA!QI y#8-n΃di\
+MJ!ؼ qȈ"y52u4/48SSEfӬYqX U'k+?AJ<$N"X1U7BYt@'q8~n>STmF\Hl
+z2w]
+us巎F9ad )
++!]N <v> 뢂V$|Yd(WKSь__iH6GAKB.U(@6,f'r߁oxjvd*B&C}6:aKs5 l#'1<,Hqغi HVO5P5u*뭙o3IeSP= a }-mtf<mUӥ$7 #P\\~epN :I)ԩ_o6+͊M&~7HZt9ј>n&s>pp2/` c9~X ~ΡûAAPU^G6@uH:N(zN$2
+1^Wt홟2B˘k9XxDmk3|Ȃ
+E0W_n YU8ŏn.?)6nlI6caV JJ.f .i(y=xD$CQ= i-@dGP˥f(C1O_ڙ.q;;M jfI>
+2cw5I- (ȡe| ҙJ>0Gl}^1K2^lp<YUa~4oq]BKdMƍ]QX!jZn%E$Xq54Qpc l )fR!PtwhGR% "l <X}`21Ej /q
+$qɭ9 h`8/Z f{Nßb*E
+sCc$Z%[MP%OՇKԬ]iUl⓪UY]%_IHwX]ӷW$&I ;|ܜƐq*DY_K e.a0Frp5<FwA
+W9ڙ2*`FTtsT7J+=l~Le`}16c˼
+ (_yKZO zY߷<WM3gͨ?h3Ls-0>Bs7[`U  {&X\1Q0p|1N`IKZQ
+ς@hi1 ȤΆ3FuɂC"c7u }@s^xEz&L)錪Ӏ\jc[+;cs8pO Ҩ$,A2O>T6~tmpI^f38#Lב81XZc%C
+
+2 zTp#xEq*texÀ|q5Qf]roHw(_r1MΥ(hA\kSoh.NϋıcAzMlVTت?%'c=? =@ e%f}IT*.7v+H x$ 0/ Z"1g(hm EѺ_tx
+THt`,WTTU
+7U9!ކZUD& =Pg^˨nE O/
+|ܻ@b<3+f&IU/30kg-p=e5_J8k9]J$sG6w偸 JBW),^,q41$HO}FO:' 'c^}֏[gD(5+ ^PiUt4 18KfěYYp ,(v=L3WPaTxUP`NxH^$G@Ęj(
+a|'#َMͭc..ZKrr{bu1!\&% R.H&:QVZ/,xSRᰉ0D<vه倻"$*Eצz }x/jczL)R,!@p#*:8e]rA<B| 4%sc %hK[|'G/x2{N{,$&b^iZ`OA͋2ѯEq6r(hbH.Iqe{s۴r_ɜ SWky>kɚ{d9Ot0YJPv"JI`R
+3G)1/.3dyw(D `
+5"s <Y҇z
+
+Ny_wƤo(?P"%4oMRf%MardĜJ_k}G?.q
+_EsV w /\b`q^T(+;
+mū` Z#_`.+-i)2dyB^ܠ1d|j2_1 |ם5O^ v=VX\|v
+2L9Ac!3Uf@375TQF6j3Ny,X'm YZuJ]4z#YW0 s:'1^C1+QW B&F]C@S}!e)\f}$m-ctzd SE /+|#1-:Dxf&YW3skna@T @Ŕ鵹?(^j
+
+2 %`&>;&5 (S:0b_ԫU41U#sΧס JM{f2uPѲP~2ra!Hp6ȶkl#瞨Dв\i(G5:nDž9A&b϶\C`\Zz5޳; O3i4r{`Sd_VY^%L*j*o&FJ+<
+c ~z;QuHTcaV`5O
+W^Kh7 sq F֤UZ{~"IJ!%I8ImډK%W:ˑdBš="Ы
+{QgpZؓq% _?+z%$kuZ.!x ,n(f+.)! v.8?q bpϡA"aW\B3SW\2؃3` _qIf)%Wt%Gt%}r8%(ő>.)$ÚKvJ5iq9aqIuk҈P]Q8bv⒪Gи>.ڵ@5KjXr:qdB>Mʯb.Vȟ\Va\rDpH|tNowDO:a3lB1umwZfĩ)L@[B36sm
+7":'51a IɮQ?/SCٓ|t`\xk$:咘 F!}8KX#4O‘SDw<x];*PhzEH o$VڣI\apj"c+L`<ݶ%֌A-2Ju__ G;B@,Fpjx\EDʏL>%#]0/2iD7Sp{._`&n^b2c{htU&uD?,Z)4c%ZRJ]d}͛(J*9'L
+ [[yV I'al \ L<GdrX7
+RNo*$[AJpeKn R 16wrUVV ئ%5\E $dCa3E¥ qv'5&QM.S $t miraWs8TAl%ǪyWPT4coE$2ՂM6>@Qx^<K;3Cv>*~ ~s)p͜WX 8pf8!Ǎ8fRB""!m繀L$`8Rʧ-M>6+nxjgy\1m}mUѽ'ɤF,BȜ}2̏p f:$UA@FQ 9E!GibBԻ.PmxV&;k|w@A#L3$p̌qw*F aPJԱ~U*%Fcec}濣\CM
+ݤKqz(Bm+QKѫ$]=LF}TѨ7:+38+Z<LߕwA(Dg-{Ռg22te
+ªe"Bs!%{H} 6؅,o*܂ :O~vAD8X3W}BKz9# x.6߆I:J+-g ipIdBd"2tVcuF&102>"kw-8f6$P
+
+2Wa@Zv
+*%3/=*<wx* _IGBRjJ5|PY.P.4*6GhZ*م>)
+I!-+SQE]Vv WrL,kt%M&oSP/=UFʤiL&nm;SN0@}C>Qɝ(
+k 5jG}4V IyP7Τ3?^^^F PvỆCZ;[_Qy.|G Ie)?#haj
+&1U6CKl ?3de%U$4}{cz~d*WIN L.w`B<Pb/u˳B\.4Q2Ykjʃe@*DuA2ǁ}g (ѬȆ1HV!%\"ڐ. A`Yr JuC@)lS^rs5iQ5nj{`wE^<BQ'
+Hl$ @Ў
+; kFލ"A H3,駝#EEb5᏿ndϙֱl}Ny/c u_ |<|uzN>,Bf{y1=Di<`hѻ bQBY&'mY;<68L: egBIVװ֩uV_Cc]ֱ  1h" g㧻{=*S"X{C{}m=kZ%p+P yQ,1:kbӓh|GN")E$#)yBՃc? vYN?Q|mvruOIZs:MJ&J/﹘QӆAM-·u2sņBP>4G tg3U؄xN,F6d<wصJ*+LNwh}
+ƺP<2@# q|ŠڈB8"!Iu! ԻDbKLs%66]IKƨÔ9 ;|H+ZʩCr8|ӢHo
+;zt Ĵٗ<V[Dv>H8πFAC,Jil2$T3Pۦk)ㄮ e]
+
+U,ybPuB"BQ OEHNzI$ŌBQ
+sQ5ϡaBI,ȱ x,CqK!s2U@lyiIFzp`0DK^K;؃4(ǑkD <񌆴"Py0BH9zHYkT>!ɩ#_7d@p!JݙLFk].ߧ0sG"o[naP,>[RפIRه??Q(K|S%!Fz s)@]"EK5tf"I 46z,>v,ڔ5w_gY6}g_O4b% tw` CC_af3c<,cǾc0xM?e'4UqQKa޽!q{2:T:vYeװO'(XE8+,
+( \؍$з5t5˛r̖M,ה= )xd%SRLԝ_Z9K
+^ I6*SvkN>7Ӓg~QthXL_= |Ah,)P3@5~ B2_wQXݡcw@0J:\5%]bul2UjuL$Nzf8/olJ݌4uKЖ[(̾qKC+B+݋q 6VX,GuW IGWy.[I-WW%%U\~YW<zY<v/V(Plf6S6,BbVN_vuK
+u]"sH)JCabWR{>*nHOFM(tfk#^pȜ8
+BpSD!WY ..șz_%׶]9 @ P
+ID"Q o==&Wc;7hER jUy6*y F#fMAz_:xw^&bN CP9b˱h%gKfo!D/;Zm@X
+fքEAT-4?T""0F8s+}2#Dou|<E)#bxsVr#,qr̸e9nF륡fFncWeUfpW4 B%_9[z!ix[+Fy*v)p B6dtɧO7\W}'X4þrRn
+"tc xUoNWa|(R"RX,TA׻ͪ;.?! "G~Eb́q9NN49bwc?6-ץ;7*#Jug\zQϸT
+-h$$X eN!X+06epۼkh6[pb@!
+4F1s ʬmY8"sΈˋ2P4G+Q (RƖdu~;̾NjHG_ӮA]Ƴ L<Nv8!K3#
+
+z&e65HLka0 ;fRu
+,B1i?*o†qsz.[(3-55KSY3wmI]1/T5x H
+3Hoo9NZKx ƛ0XXT۴wmtO> H4|~anM011e@FPDP*F>}_YfjFf9UNs h1%O'rI&`VxQF]:g~w~O烨w*PGH2@+XUwSё!5!} PJyKE^-8D3jDA-V!~
+D$Jr+zm뇙M!Lϝw%
+22jfN, '.WJ; jňQ9'5A5zu0cZ0촠
+C/j]y߄Hcmzrs2?b 8pM 5aexII9o9Qn>qDx7@ht\@Ti]Ue'5xoF7 
+)\<&5d61|2ngJ)QZ6im/~gŒl?)H5B֮N)^1s&D&/[p4I_*T2"u2AYCO WscNFN&iz'
+UZJ=@%ig'.TDUxSJrHU"]u6^3
+&dZ zf'{fI
+JgON@fèV)
+maji\a |RijnT{Nwul }V*d'@(wD<TM ~O{cGmىVE#.vD誊X).I^ D
+-d`ocdrNmw6N:NИ9ٓ@W<<A Q?cHdtheҕ[f!қU`GCE\Օ0G<t" -Q03I3yfVIlTD$=عÒZQ^Q#*<TĜNz76#Jq-ztNV6ow}=&_i)@lFO
+n*~o%)uIOԨ{ь>~a_<
+?6q
+r!-5 ia1C2r;y-WФJ/
+
+Dp:
+804zf/|>'E hR HZ!UoE;&翕%>R10j#u1Nu_մ'4"{gAwg%{Hy
+SlU}c_y@>HXC57O@2ov8.;?/"RbW~m_^Q5
+&od=7 ]J
+_c`+B#֎غxߊЖ7!: ] E/-G{Ì-""ʊ/88 !ΡkK&TfPYཟ4#rL)&6auj<7.fqRj2igh0"m)G!`h}h]5|ólP|+L\.T8w*a1 "e4, ..xJ=W Y?}k%-Q(*X$aRx_ip6[t\DQH5(U8LI)}C1 9~Obry,%j,3Dzk"`0}[1ZE腧7"fj= ٜD+(ɘwln6li!YӴK/dmV)≠Ϭ4Q3T=,GyO1b6rax\\D0%V16oFbrGp7
+Fށ:QR$'ELʳUEZ; zлJg8Zһf*{?]E kRQ68 a'i8JS>(=WEow18PF޹:t0sDɀHqqʱ/ڣ$Ci[Al( dڲaջ-/=/ PlHG>w}PBqDxiz,e#
+WDg
+˝%OvK/_[G23+jI!r3{%پz VV9m<Y"QE^DX@D~/^*oϙ "&Ô
+tf
+Ø:,%S"X`$ A=jMʔMqrx Gd=~Gt?'\ vc?jfբGh3 w:1 ޙ"ԢJ3eA´@e% dMtLz;YxvY+B^f:%\=D%)ݩYeiUs)O7RSSv-劽T1Ld$h 3s
+& l@{6i
+Q@,40̪ KҞro, ]lE W:,\VNҗ@!"phMջ؀"4Q&@Vy( xNq֜#tuc!I`MHZfyKΣi`^WB|FČL9?/Gjlc"
+2YwRx6UB"1O\}D7
+zgX BnѤSf)5}\ZGM9TAg.
+?q~P j*@~@:c(Pf-v5?И@뙀Ir  ]d^br8p, 0vV=0~2RoYFkf4i4 {DDJ…Sr<.-1\ml !sE6Vm!Y1iVyϓE_WZj!j1OD iAxyǶL,*y氆 gCL)/M(Fz AQ"L,RPZIx:jŁ2&))=l'B
+$^9%ߕ
+~]"%bEA4`1 H
+bYa#S #Eu(*-$@" 3\f h?x6P@Vk>-PHY$bqXMRu@S*^1;˙WbXHO,pUys5T6" LakuYJp(6 YD”<?$QF i}~P:EY~.]06$ϨteY/$r
+^NPkw&@U;$Ex^tG 0/I8غ7z۷P9</)
+|wT'{N"*dF>3ߩ
+UD >T.ۇLi Bѳx!
+LEvZ 'xQCiW6(Wx1D{BǠ*0>?A:U͢N:'A5=ZY{Z0Q(OOTH֏ɔ
+KF@lf B\RDҼ\_9_A:ֆig &W *c<bWy)%-ƇMû}qy 0bqypE;U"UQGt\\DFu庇EzYy)#SlHT'#PIPb$0EU
+>62"H3theEtOKg2v (mOcT;`'%;z?bՖ́\u4Q-ŕ͌pڙCڏ4u1=V wۦ$/[8Nƚ_-1xh\< 4-h}uq{ih aqu<b
+H i=Q 6ח]h\#\zjVD }B*DA4^ôǻMx! yc"e\yc E7Ŵ D*9zD>kFD(" %cP/ddz?; |wzG!*wnāo؅# DJ\8a͌+W/L)P vL$Aoմ(o'dӿߠ~=uC0j
+(yA;$o,&h`]f ҉4-/ϽpB Ry rn"fY ͤq8mȻ^Tp8uSX^qEGQAX{L:>F{~ٷ_Ǧm*mł=]޸j ^׼7&uNt _SO@(Zv!A7AO(VZgd ?\b`a D]cź/EI!N;ީsBWRyD~=xI3(Bן@54`Em ו1 ":.BKıMrC4a=!:0y b#D
+D
+DkإbP9W\λ$q}Wa>c)&}1!L-:YuQhqڟ_ү0MQc (9Y
+yr度M?`e-0B&pSBi޵tΘU-N{-D@qa mkEEz 07#@`[v0'PSJ
+ⴗ7eVBd"FAuf;!irx…W< N9a솖˝!/9*+|{3D)Vk
+#<3Øc4kmf^LEi caqEcX9{Ν
+:m
+ˮ7L*p)W EԪ"$E49v]ڳZkeLK<yQg
+$b/wcm3HJ$8d~cQ 5
+'-ZYl+FIChMZW.d$)zR[N<Mϻ}4V.|W=?_tT)OA/Ŷ2k'Ӝl(=Sh$yU~jA r&ѓY?W1rig4#\ƱS[66:v:;iN"zYut[D8vA@l qX{~d* %E`? ܅\޽1cɎ jC
+6QL8!7s\ithn)-.LP6D^Ӈ=@SM u@g "@c ;ȒfNiT<lj h+FWbWbɤٓ68̽Tɀ[1
+EMeXHug[v:H@u$}o;m*U<KCk@Ì~"+E5y_h_z rYxeY%#
+B}<SVl^&biHO8FiR
+n @rH 3oGg3e[
+!±Xp?ّ+7 ES;P>hɶZey 6,Wvа
+D3 %b)ʻD};3IE"MʰVŒ!1%VGvX.}ng$HRpQlͻ1=rxPr+^0ӁelpM/EhE'"
+}
+
+HE|wM<!Z =HD 
+6_\Oԇn׺82-7 p@BPw(D<JY'Gb"T|riw#̄i{?y'Ҙ/(KR7sHAb- "@/4_γFdM?ּ6'<% itFA@e,
+ML]C5jU^nF SkR3km GĪZӍM+PW8ID:$ZX6N^ҮN
+D\eһ<a :+HG9|sGo .>c\Ub?/jmL'%2B9*/`I0 #B?i*˲
+] Vi@ŧv\"NHDsUu8)4õš`%j6D G "(x{#ƨ:LtBJN@q Ǹt=MQ:7B4Gx_y=[w.z k*T^qxDow2#V~gno-
+}~Zi3dy\l#3J<ECBhy?]&(mݙyZhn8cĢq_'51XCNƗ?X>PC*$/`C/ _7mP"+E1W|Y%n޼=ٸ=W]5+@Tlt6Qǃ#]5~51"972BP"R(>{s\SQRwdh}0r5{T]:"KzW~M
+q~JbL=
+mET֢ @,H9a:͐ʇmÓdDrEE/`dEc(3W8`9G<I3༬w?[_n?~k%0eCwHR OG0_.}18r (b11$vtKuW8Z C\AsJPS)s}Y炔t]:Gi j_L2
+lAh^Y5 A9t-YgQ Z[A1>!>TٙR<D6$@_dڀc 3۩6fF'
+θV
+NŽS]6<^ ' j10SOاH)@T:lÒLxO£>1A@K>51'DD#4cȡ0LT>^4~Tǡ:@@D?v#`G͟ Ol^>wdgxI<>h Sp3N`HݝH?dnNфW3+*Y"$A+<F)8bkte0baONݧAN+.ؼ+,F<N;%
+mf(t_+
+ǞQ:eWNbkӾ&l fP9<z%nĔ lBfh.jF,55 6-܍m
+fNDalo9 2V@tt4)@.YcRcjTDdh8MuZZdN<Oj뱦R|7
+% jEJ5p@2v6i԰O0l~z WO(tAYU&u6CtvXN$
+59j<¦dgTaP  !bts~
+f<NQIILƏ{|tZW /Nǿ求uSTq nϸ{[8r TǍ"'{fb{m̦B} J29 "X(j=U0yI?H 43%
+T#ؚ,~Ð@i!YpC^ T~ޥ6yAPS;oz' >ia$JɮI2#YHq0G\נ=j> s煙Ow6[4z=QkC N0B淭uӆdr.n8h!bmaIut׮**3~k bocf|D.o<}W'AD's|T}m0"Av#qeP E`dCZӏSq!B#k
+#2iHKW0"S"CĺEs.]di"iȀa7vH 󓒖Z#zaށ(P}k'_;Um<~]@(:>
+_2Q C&vs:x1XFRF.W0g"
+=2s7EVK,7BuD\
+RV!oU(iu*)Փ! wbZ\x
+Zw]uEH/,H ՠ6)
+X-J
+4eavC mmGb\o*1k.*00`ar@e#2S0d1\ ֳNgp"\Ѣxs`DMMg8 7I#mG0.5)lDW 2>yxPf[ϓxp `Kܹ$PNX4mBShuEeY[BRRָD @ fm>@t=g%a| VJc
+Ɗ NF`{ϝS>z|1l15P.%"@ȒcaDs-; d ܱk"Xw2@;ϝf ¾}X|=SH:Oߙ0_RG+wLJL 
+~qJW3HZP<Y$WWK:žD_T /|b' sСRoqEʦg9sƯ,LUJ(ZիV
+8FD(y@&TDF'`PM!Am'H!D`7"FyIt|X`R>3Z`Ah{2Sjj>Ha-+ UdҞR;-PAtM.hdRjjy%~JhWX>c3(.Sg$:m|\TmaQ1"EŒZs℣q|"2(#r>.t!x<묟E@հYZzE@ !BODЂXB.jeŀ/O=OCc1!G@ ԪEY6(;$'XM'+65ZޏZ(YP/ HD%6}WQxoՉ,n(GK4/ Y;]fr0O`h)ms9D? l-Z{2g(_3p7lkSY9ᒣp,%GN´AF\KOYOOfd
+"EM:v>z قz9=)H)nm [EA#u/ A&/vėC~J`'0OX#g)b%M<٩.ciMG<|Aʊhwf[R;u!&[7- tGIt̓OR RcAؙT u$by$iJ/|>TN6+ݍ|}>ynU(CKڭkVuםDu}-$&W%unξ;1~BY`e bR8{}53S!"N_#>A5
+QbY{~0ddduđo'qֳ9 euF#?qPd| MaƼ/MFF ReG%+!2BZ*nDFtWNϪL/>flW媿y
+
+ #wJ/:<NtAN+%>Fj{1IF^ 6jikD=CjQv#f0]wxED8DѮ0qtqrxv*QXȺW &i`VɁ\Rm&bE+\
+/Lo8
+;`oDa HREY
+K~۳s1.a."} ?.3eb&{6f AUQCpgD 딨&9u%4*F\&RkA
+覿?6Vz´.
+U4 "Ϝ2mMy@ -L
+: Pc+s+
+a9JT3'8Rlw<ҼY4}"iܢGdlᯒpgi("PlvSv"Wey>Zmk|'d9бFb;DY]/!T^~.YЛpKs$%+X؎#Sl !K\YUw}jп
+nݛ\IǢDʣ{Z
+,6YG*QXa-7W/J]Ayܨu,cҸdzQQT|י//H?nSo"([;QM4ny=8=3w'FRijMhxq=ZlhP "h/Ĩ4Rr¬ٹ&LlݡbdNXnefhfwryU?F٥D-K(`%KF"4_6w56_n:(3!WdC拀.u
+eG07QD~C{:ghW+:((N"S<Ԃ$t^aAp4K{U[=_x^8c D+
+NAgw#­yjsSY',+Fc:|rIWSt T>Qv~ B8NdlEws
+۴9:^ԮE))֫OXpܝǢ"OrҩagC1H2A/Utu̎M'lx6HXkԂ~Qkg[6z"{'k%^Q5y4mc^Ut!<@]$m*qP fd v#OUgnfP(A.'
+$X'0Ϗ[%n,
+_7~1-jˢ53Q2Q:
+l=r(MEHsޝ@PBԻ}3 8Na sr+:QBb,(L;:
+HM\9OPwu)HAșs(ʗj۰HQ"cct>Ѥ[ނ[f1DIi<,՗$Ϟ2\fd>ZZW=Zo*}pqowGiܢй9cmNnߛS(3V@m燭@\!3sHCP->#N+q^Ir4Ofn|εqO7ͳkצ$T8:҄!:]<'X6,W$ɕ@6^6A|rQ
+Nn܂L%y
+a]]xP
+7U8msx\ p{Lj/
+~Tz:T # --[!f|o8̫'eQ'R篜ۘÍ⯥FPșoDt:+ dSќC✺\:5o~nLN$rA.hv"ѹƈҢYJ,'7XjEhDTyց5/ ;уxx#F PP<!Ԧqͱ\U$JoV"R\I\ia:)Vhٖ ĒxgP=G"Yِ Ac! #~-ChneSfB@Jpŏ(hGҌ=n ?TY_71>;5[cH'"GL0?Ã76ڧXP[dF~H! 8գ_@p}]tt+/=(MBPD0ҡYcz͊ #u{;a?ӵ4sahK;|SĐAetxp9;&@QXq(eMu ;},?YT/WߠFԿuj +qө[6/-%m}
+1N(x<"\kݦ,ߐ7:UlC`MB$R45|fh3}^k@c&IHeA S05?CY]<m8W`I9ĘXdj Ǩͅw(ʸ>+eEKqeВsΨ* I]ңR d"h(0IPemv^?ޅgZ@X4kA@0lZ/_O/|fd@~$. 3} k K;O(/$i͟h<^e!>AXD@vj2=cELcp~D@ oq>_7y_t 1GGfZ Na4)c!'Si\rRLJ'D|S\B146ߒjc^r}Fy ԂJ!J'Cr5~m(lfCOk̕%~e[Utk["i!ا~8AʡmJ,a/" L)5Sy_zG.I8 T5sgKi1מ2R-Ժ:5r0! y$*ീbİ]̗`߹ѾQ_Qh`t|iH2<۠hϏB%zXOFWMc,0 c\nAlݾIp A9P̚ "8vxTؐb5UG5-'骵j@lJѫ<ge*h pA}5%nTcŰmьS,S\_j¶U2F*J끔=¹f7Ka6aPr/1y*is,$@H1\ v
+DXxÂ,Wف|H}gMv*PekpS}- Nkȴn
+, raIb;Nee<HAWȼ6T'["=Z,+6=lЈC~͇V֕u{zJ._@-ZY'{Dv;8},I }_݆@V+4/N5)HevvHF> 0ZCkbƋsLrfZ ͫAB3ހvA'wR%vö>u([b]e/n$@w
+ZoU0htC[ʘc۱p'8;n>o v08~P5Y^*[l<DŽ`n]zT. -vƆ CXvG&gй Dlce1DU+5>Wҟ?Y_BI\zY%0xJCrֳe|5j}B:=^tP7
+UwLlV a"I DK}iK(U* M)5}XMA+*š7~]1+k tQl_ XR9> e'qm]>x0!m^n>,zOm7K )/%<%~չS%w3mD2W&D +FN_ƫD 21ws*j0\v K@tvXJtPfKu70I=3ZiqF9
+mP L~*}<X!%' /ZnLB2"
+l.Cgpx2QT
+[ r=B )*ѿkTxEL ,(ck2Vj&w*⏞MTHlSM!T
+x#*O
+U./
+z #rB0#`26㘧?ClU )&,(SO) xz $*)aNm, p!6E J&r7п7PGk݁0+kv@b%gAܟ;ce`s1b^J+Y=9>!DtnکsʪI5.SՌ3o. _)H쥕+H;1|DWT-ºy$~ꡭX_[-.s9V5)=D~,ODt GZ-7{lHh3F)blL BN
+7"OFpǪXj/."˨^rNZ `/oCckS f}J;QێNFjp{;\| kScNَ7PMLP9Jh"ЄV2!ciA@'QhA gJwsQxe٥Wy M E'u9\r%A C+<!j\\c'D RL.*E1;dݘ8qCTsx.HeR|f֏#\'Uo|FDvg"F,m@}@~o#rၜǛ'l,͖9m=Hl_mN|c\TiO2WRW8ǻ}^3+V
+T?9zټk+zi"\N=_tG%;?
+9iN[H8c]|
+l#,eK_F^_"3ctFsؕVUJq<á §>0‹1%vG
+K3-*
+eH^]^ïQ
+\Q28VԶv!Fv@U~Sn1[;UNY*0c˼lT9Qp$:--V;Ƭ#HGa1L? DRFDv#)[`}*$$ű}!R<cODBer:b}`n F{"1k+7ػqZ;8)7H5( 68{#h`|F73]0PB
+ R[YDK=G#+?X(^/ݫUJO ?LuBv!J0' :n wp_?0]f`ՆFChżHs R>(@ʥY|n@XRda L
+QJa,մ5$&t&>Diɣy,!(ꊽ{@@TN?-}yK$4g$1f RY2*%zw<:B&-+IOi$XGB$q[މB"}N@Lq z ̵z[Vum='@YFU$Ul{1s̀5tW
+d>%CAT$N
+"`+h/.IIM͸ gz9T̠R^IN2SGR4NtG fec@RqTG9`[) ܞkA$15 >J^#S?3jT$#]K\$)~{8gHDv*#5"VAjD8\Jl̻~d B]'L#8Mr5~+vr)+N"l,@5cP iH9{\@V5iw:K&:khIWJXu.N uD6YLY%<"%Cqcc)h׼Z1(\w(Ps$j*xS_GqЍt˕.!b>YޒZ(>8L ?U
+`,G?j<PvF `Ԅ:B7|(18Vp9bi&h:pʣ~(^Bd^ul)GAāG&#x1F2o/Rk=vRnuurPe<!9 ̑9ԫ
+`
+Lk (A4$ZH4~pn2ix}L С.zdLnקq]N
+`v
+kh$ E,.Oq3ބ sb@X0&e`Lh$JA2ߜq)1":OY"zܥb6W՟%H @p Ґ
+`"7t+FUAsqtPCmKˏّ%8#15"%掴dTĠpN"Z8sFL2c0@8Yڣu`d2,1]q
+Ь#xUfhv 2v놁
+-Hבin?Q_ءP _a)!u9oX(5uƉ |9RL[1i%Er&rD erh.Ԕ&yԦcH{Vy%@|`
+Ps"["03@n3N줔?@(U^[/BX: z+y "Ou@5܃EDq t>+RO?V.x-~PMvգ7sVMf!8(A4@`)X=j(ә;&ǀ8` 104 ъR'*mE7K:a[I8_ eئ B:,V՜l
+"ůȅa}|PL_y=N6]we
+|< ֳP2r`F:q긮\yb\&x^=FZD~KVEnH(@>~hAuh=JB[OMsM YB
+͢JQ3.oRA=2<9
+y=^oWRz>(YJqb{D/RJ7!
+[f <5xTo%+tm<*}XJ Pe5ZZD>|G$<}U%kھٜU73f~]~x>uiu3jwh8*ɭ/M:IVԦ*\}XE 4,Tm}E诚 `oE$Zaj{#%/Gb#ݔ$v fގFxY\'/B{y$z4~G[G]oԶ>s$NGDjl4@ZqNhtePBR-R|H1.ɑC( BS-5'bŹmRl?b%Ȋ<Z&~Kɷ+cɰ|y<,%l_P2nSaVL 'uc=,K >%-aOdxQ< dC[_>p+cz/"qIYaK8_j
+gѥXQHQ`2mci4uc
+̕zex,$j:-!\6L>T]/P{m{IiVR0t+$%ν
+=QDr,o@\XۧzISDP.Apgwt
+AGمc_N,,YN*EtDu} t=Eɒ8V@f} q0yn_(0' s|EI]8J`fVg  zbq)بDP4)YAEk:@wrDޗiCNpp1 (HhrRصMe. s(Adx1ch&9\%PTuȩ4*O,dHҨCRc[ѵˍN&4EA-iJe( -~@wzs(:B7M!8Xv]ķ~r,܋G y/†͡K +fѸl5]2Ry2l}*(2m
+2!{c!Tw+n<X(ǵt-7l
+8抭*8=qG8v?q0I0yX*MwASL`\pJ6R}^E lj]
+Cȑ( > $~@TvS"oʂP< (枕Ad`Yc sem\lcRIBsnY
+ e
+.#!GZX{H{&^&HB]x?0Mh^uq >bD;-C;4F *q`"
+Q.6/~NfF9B2ɣhr~L*"5"J ,/OX3; w0} QFb< ;.JWFb N*\y784_2uwPPwKy
+5Д}( .{ Bm/ L`f;=\0uـX)H2y^
+Iq Ql9_tV +xVk`iqnxΗig/pBoi &:Zb
+amV=wA`pgL/$#M0 H>.A+<h7ãE/IK,(O =u|ln
+:/gBBs\䶹]G]i[F]: `,WwR<hRsLoAR o-?o;)!i/LVo0CDwD@,1
+r߄7rs~נLOHwhb,Z 0z7qnhBYuv;+;"Cb y(Sa /;MCȘ; B9Q!@ 4hY}AM^sߕa;Bv cQzwD .#I7(fڋ2`Bw4PחAT h-|1m@mm?╔dvaˊ
+jZ<|DQo/YmHIz
+,_]ⅇ}DV=atTP~i VBҍ/`gQXa*ЇCFmGUeIG xZ2Ұ5d,,B LƶE$$DaL%s:DLTx5-Sc`c5 zuP`+(= [߄bd.k@k^@K~kة'sǃ<6^1h]
+>\mEX%|h~U?#nRCRoo(+q۟15n=~}Fmٲa~hdzAD(b 0)%:h;Yꍍd58˱pI-lZD,jkD|&m5
+YsUyMC1#4e5ny;?^cj;ţ=%5vHq ϣu9}X+<8i-O  #XLoh '<ڑȁxXD Rym[y6EZ9;DM2Ȳ1y9֢ɸy*ر[OWrv]vNIQuuSydb,x#h_wH
+t<Knz\MQ‚ew
+Sh) 25Øj
+HT{pyjf%׋-x<E X%XXI$gJRtO!~EcWLSoo%ܠLmnS6}gVh?wFlʣi\ ;aQqn'm DQ[U6IPP8t^ aO=Cy$Q!hH*%͉5+=466̾w2
+?PA(ThIaNĮّ*\NL&x öf,PB'Eu0}jo0l +csͪ2B7'O|@f0#sçj?^eQ0Z[  蕋r^|>bQs{>hPU̴$$} w3M[Cx J
+$ %sQ(Q(( n{-X ]/b02\ S봡%ΌƗqmDZ [kҚZ9k%0Wl>2JՖgkYh(8 x1g L=$.gjyc LIt*(95A@ l:2 &f\_QeP
+@JLd*99I.(4\DƣMbjA6W?U_DZOA:{߃X7Cps,I8gf {0dgd}M 1pi3dGiyA!D
+̰ 5=XJiAG=U֊JJIs
+241!uƖYCRw:N_,/ ӘFWz!ImaG^TSſ} =cm #AK8^Aw|A$31ѲL0/<#Hͩx@C/F˞P(E,iNoďRElq|#^sȋ
+-M76y6{-CӬ& <%gi9 {%;0zImI)cQ"|2C[^ݮNoD@&A-pA`炏Y5!Mj`&1z
+ىd\pӹrߠDA0.HP(QHCe 0:L;.9zLhHq&)q+] k+f")h}JᎡ麦-ŐK ?o%=@"Ictk7#|r#)
+|
+<;˂Eƶp+ª!=B蛄dD]ʋff)zF2Mٔ[DϯHH99'ime 7]E #CѼL.` ]Sau_ oZsS'Jk U8|J'J
+d&ְ7(U *EGTX}ffnU-„bSbQ ̹-|zŴN$0P,h@S~$!?J5SiCwT-اFenm;"pugH+: ̨]БeQ.!m9tWP6&$_E5o6~M9ˇՈ;-pĨ9Lme"N t|V SZYXai Էa3C@ta|{-@DD
+eh X%hPQ_Պ[RMVXjfTבE(c~{b"8J搦u.([3|D0t?!fՠ˦X6/ Jٛg{{'Ep$@AbJN';naL@a TmnTc;NTMX뙼`⤡4[q-ys, 6Kr@=|c ݚWykdB 1E&*.%mxhhh}M='u{ՅR.+PH"u!r T;nN APN0d'bA
+U werBm} o$SvWa4$2 ƠK̛ňfKk;fm]"r6zM Q`1i R#C{؃r65;¸**YA޳##2e3<$;zؑPN-'ja!XV=~}(
+X%Qt7
+[džlWH{H.
+{L f-ɿTF"H1PN
+kSQ.%~Baa1zx {*!BXIYm]c:C.x4wxEq* tk~
+9 þlyUa;%4xK8vF'lGH&(~Pp6%[YlvPYov%01
+hhL=^顽(6bh.|~Uh8˱rݼ.%1`(WHw/D>wFs&"+:#G܃ AU(LQCSÇUsv` "J-|Xd\UtT]ooԷ9 >w{D:!6ߊ\էZ _FL{mBp& bf+&@SSrK>C${3b,2j-U$K+\x@xGū9` qJU*"S`X[eG1ބ Ѿgo-\w,ϔ^'(|牛m^<b n끉.0Ux&% ꟳz,eqWX>N&b]ē^E,<?H"JyE߷"IueQ)p0c55ovXk!a.&&r!Jc.|$2` H꒍ϲ=<,zBqSJV' .%:ȢYbllB)gFl"[Y,
+7^WEi]$Xd&Ú7F~92MR1MLO2E5XxtSnÚ 
+NLR1=xP6U+աL+JJk1z<޺
+Zn^$[,!XgO $Jp}KIM;Ė:-|N&k F;Gm
+ <6PwϷ\X)ƍ+oJ%ih&,'x(A~16h,ݰ#FvK4ز
+Ur\!"1/d%8['Gbi[4>Hqr'^K..E,#yҾ]"\`چLw_N_MGZ{ژ3 Kw;Uo%Kseɚ3iUDHHv 4;@>ZG/ohYPӳH%Hv*c Lc&4\/@6MM~tw9eqe15ۅvc$q/EIF*ʴ@GK0lK@fgZ;h*
+4N,877M"5202+
+z)/n {43.<s)pU` ~H`,VspeXV_Y{C/lyfw*Ge֔"(Uf/>x7nIB) l2Dr 2`4)Q`4)Gԍ8驆ǠϾevH0W)
+JfL"ElEx*݀:pEġyr1FYM0$BݥOOE֕:/c魨&HY揧/"$2Sd ,zƸI#_;D8㈗,l 8?I&P7,긔QX KY|rCM0kͺl<sv8h` at:=}|CHJ?xSyBѥ}`겲K?֯E_oIF)|j:+.ɚG7ŖtHS"J 0=Dw*
+}eœ=6MCPƸϥWM%tr'xHhwS '" a&"ESٲll4`|ۚgu+UçbjU6†&<y Ƽ9*AW"@AN3yTH|)yX]&渔X.RĴԆ9>.SxnG!`V| Ã1$Cg5kdMBSn~^S+m0qc(%D9aj GeZ\/sc*%p=+GqqYMKJz)m:sSq/^w;gOFIrf'VTӇPr-zK*#sCDwXW&U |8󍒔)55X#ŶNvjߩ`6dəM8ߧFiΰ\RQJlP&
+kH8#a*Z`yG=ʶ^Etb|^Z~d2,&}m3(nZf=*/.F S:]? Y8#_s\O9=qsF
+a{hJ<u% ӓ#~sݷ
+14 31&Q8ʥM^.3_+x<%%ξo
+0
+3&J˪Hc/ e83
+/kU8<-|r`>;l,{֌;)33%®$c[3a:)DC77NYx_ \l0sʈ5`R
+Qbɪƨh<Q[}eui`=M z`A_.ox⒎pM>C98k+IK$`8;ƭ}{m:c+?
+SQb+]mG/jd3Zyq<`~9Pu!V
+],] ]XA%]+ ˵D(uo(e3ݭNseePI4
+HMr9O;
+{yK^7la}Bc0!}A|| KЪҍ& X:1JNyC6%r:'e`
+ܭ{hC=@oU`R
+f0P+9A+ ΦDw^`R(8PPMUN3IZDk+͐!/iAl&$5nDMD-iH֜=yO"UPnכZX]=jc9Y!-*4^
+c p4qtf ajB^iIᆈf?iH]wւR KK?@Vb}2P6!L,c-*b !JC ?&9<߾:"CR2
+uغmZiD$t9 Z Z_)
+cg޿28kC:t$H7 8?AXSA=yg?
+.!|A84i̺9?h@ ZBQH!x9"4!,;A%{un>Fӭ{GШ_iF~A"<̖UJh\ܘ*zLH<f7^q6^n^NRtqV/Lmdf#eׁ[Ȱ4POQuh*0!R E0&n£)oų܋̤ CK~aTeA9"xRs 'ATVtG)DQlS20p
+wgdmvю{aT8+}Ssω,yˈTG QqS)hXPwr^,&+S qD2=@pN A} ʡLqՈMOC!wȪum0#3˳5QNxnXLܣ$A]ȴ q'CkNȿq!cBɒC0>21V>_l !MΤvczÄMCȔAV>"$\[Y{n 0>+Pgd$`D $
+b>E0WZe|uB9l0#`21 Ē
+dyD U[ůV}njOA8lOɸ~k[j)fԋ8G|t45CkVcMjPtyݽ GX&]t.5D[N0 %zaJk˃ JkY=$GOt&OC{ ?C$Hlt GsUCϢAz
+ :j!H^
+'sOR>nU_
+n;.ۚwӘZȺ$9bm4G0O8Um&qڼzpk- Fv)B*h(si'@b?/ 7:Q1&
+"18=  UAq"̟@UēI_aP s>66 7/jXioaY-i:䯒&w]rsàStA۬.8<A v(/9Wà:oMxFAwt Q{OTiwqQ槹Q+zDAnXX&iTPUDq"NvUQV+~"ΰMt+ zEWcDF
+VYs< 22k$hOz'NGL{kk=imĀd(ˋ;l aGI^4rNtL<7f//bM]qe*e Ò}Lj%3];Y9Gݱ\t /pN<\=pNʰ \V̡ UYsyf(ee^Wv82;s ,S=!].{|{ <{[vn]);/U9Os]0|%W^=EWva"Ř^?N[V@ 'WvxVp<cٕ xVv}$;E3+×] Kd熳#;w#)U*-4p>yJcdV*
+xVWx. %<_]kg j 02MH%a|cU-E[|xLkRM2%2n'b^|#
+؉'O.RhS,alu!um2IH͊y H[xf04v4#Ymva,|KBjC (p_8
+wLX,tC'_[aZbBГsi^%!7T:1eB#/_? T5@~Lbmۢ$ޞ9c# $p5
+3oѥ"Y$猿bF6EC@Pg`m3晻NZ.dubd2bhq4=CP}wy C%82t qhCU*#߇7Cc%B,uFЬ;0%' f E:!k.H0`` eyM`0"<JD&n9c.!'A- 4u/0)Y>QGHJ hUXi.Ii
+9[QFd!$m|xĶLDN y3 Wk[T\%<ږ,I^K{sZ 灑`2KQRh-1تw7g}tdjUdZJе ![*fc?1Έ fAx+"54[E_X 
+r/4d:n !OUOd/5y%4`4"ؖA3mxtR ^7&!R^
+r1^&0O`hu-W # p
+=Vgd" #Z4N~Iq.$̀xs"5SBnˋd˲$>si\il88fI&q
+!Sh\<|Q[4 { ԋp~y)Er?]v)_D {)
+ԸHY6yF+$\q\R?;ǽյE%\Bm?+6ld91.~?8,=Av,Dak> =|u>|Yurf#YxK+II /B,7S5KAX6"a
+Rfa X47RA s)RAkUg/s}[l8ᄊS_D7ʷC >e?meݨ5g%79QuR];
+pM㸋Acx-ީ͐X5Mw"4`B.TI`meSG4/ac
+F4A6c$ 3@4&~0a/tm,hZTHT&ԑ]Vk *t\(G\`MWcaaâ-OU*=JL,(i!znܨPIS֒w^+  6TWIA;iSv3YZ<*/ "7>[.ÜjMW@BS^md]srqd uY=1Ĭϟz[ @Lk QUȖ \f=Mkxbs#$M>+
+ƪy
+ҶMnuQjmPcOf('4ĬJ$EyUEqbdűWؑX%
+Oy〞]*: VfmĐsF62 #µh&KlE'm2!M8$[lkgB2 )15w%{
+Msj1DPdhٽB3(qN!1s~V=іVUbRӌC+-B-ÖE XRk'tMxዘy;3=}("fߊ*? *N,N"62Nk^!7B$c
+>qMrZw dLȕ z݁'(<} mo
+/:=[cCԱxnP]y&#&8@C;@r5 X [?D5?G9q{!Ii4q[\?Q` =D܊.9%ԀpYLN9<_dH Jby%;Niϸ)B6PQ!GD<Wq)f rb z0*<e x")A$VHV/HxN@H 4 ӁOQ񜚌f9 K$i&K٤7p -Iݏ OI ˶tStL'kz}K9rB}Lg Ξu 0Qv DAVV$_6Ge@C5Ʉ]:Z\(<bXyS%q9EB/>
+ E4}.:YģqeV,Y &>Oo Jĭn|Z挔^tKa\傦ʭ*?JcN7'<TMI}"t 4kRiC %xFGiv}AWԶ(#51c GsC3հ\Y3=2#%Y|z< fb'򻖬gꇙڇӅSďFw'6WzSE]$>X9KEb?2}u#$vG-Frs:]9U D4+ڳhlVIkHSG՘2jCfZBee{CY4|$rcxuaӐ$L W' 5J'yWe9m
+Sa P;+eKZ2OxU9BdX ;*%bjgPB'|aTGG!Av@Tm4)MU=N m.T;})>T [&7 e~LSi*)S Q VJD`!lɊ':p=&c}&V>1 %E+t @cXƐm1/Lf8RdwAg:d[gH!/@ 2P=,[mk
+S*u,&<01"HKޗdyrz`wø-3礼Pj}lt` zA&-j rz}U9'7Oκh,=iy_.A^) lRG.G̿W$toJuR-M ):Jr3*Kr!P,/ots^˜MIM&9L4DInK)dBJ_C/օZWgT"%O!}[zL!"кa0lk\j$_Y2聞z遠 ver&>u,
+6y&}$/hL{ Có"15Ġ!vN`Vf%01lylVp4{ɅP<hc1)kLf*VZf=O4<Ѯʏb;07J}'% a>C[o6KB|_R)n#(6)
+߮d)׹횗 e'U7RAbMZ'.^CvV#R|]&S5Fb*.Rȟ ǒ\;L>$W9XkBCLV:IM/1J}iZԚы^֎}f~C/N#M|HцrYIwt )B6᫰>Ch[VrD1嵊O @'v >jƛaL-5sohBRV)V8s @`Է#ɝTq@š.!Lt[*"iise;4qAZS /},$vJKxo?RP𬯎Q4Y@4a (;K/)Q/|Tl;=֣`94P%cJz0,~>& Ν!dVWɇhbg*1,E=տԼS:ݍh]m("Y?$ee@o+?>3辩ϏJTᳰ+Y.$k[zj=>s?̙<e$T%g N7 TX,]MھIⵘ:$X("IPX~E5u.&״Y%JTgƬ *68FXbA6mf_.&LQzWˢgIM
+Fz7Gd`~~yLknȴEX,j<ʛdD%.' k ٬bQmŴ{lze yZ.ř ;cϽqZwH7hdF /4!Ra,ʾp6g&fC.Hc <WgC/=@=dRšdI/Zrn+!>7f2îG+%
+^J9|LRs{L`&G^=
+p`vmLC9v*>?t\M0 ?wﮍ)ÓR^J˸ 0wL˴cq.s;# Yb~%?wˆڊ{3xJ`O.n}>S.Zb, ^ETbF@>hklx8rHa7"QIn,8s?#Q-2A)aƏ>x`O\%1"˳ Ƶ2ɓ9#d9rFe"w30Q ,w fuץY9>%mQVKkcEO\#o3XKRd<Y/EX;[ &*I r C.,R]%G?_ATkmgQdcatˢGH
+(
+4{Q IOb
+ ذb+?kN
+^(5qH@ 4"&1zFnb*i(O㪶Y<(szEeH0<Wv)C&ᜦT^
+$^ErLwNfV̓5s˟+ X"yN#"O⽢SL J<>ӏ\$^qNroUxE6]NdJbvϰH%]b OyRħCA@ pll
++SlO<5?&"opJ#O-$+x@4_ . XڡET/,e&þu%>LF2I+rȘxZ-_<&_b)U[лElǡF
+%F1WA /SlZUpF *^URB"I3*hMpdmFp!SXGĒѶ{>^ tawdd)"k}U`?y=P% Y]Yۏ>iK1yHv zO-tm'zQ;gZYb9F\es@̙m3K<!Py= nR1"5A/e۸ﷹ{}!|kQZaR0e~3,޲ oPl<;lAt
+3DYlǪhʎZpv ʶM(!s_;eEGaXt ^M6dyY:#'LZnqpv*l?.(?PYe`:*1fc^30gy8Gȡ
+e3ί?Q0GzsW ]"OS*6g*Iv5ld[8dF t,G|\V:Ð
+ܢ:*a^Ce/.tv?]T>ue4[v
+䈮fIQ?#OBΙL&
+%ҧqeS`g %y~ {>aM-ܻszZ`ZЅ fM+зo/#9Wi C@[+_d~z5>^B6`@C)1%Qtb,b:iy!/A6>gH%H/
+SCj8%SB֥6эעUb
+JM$BsHS(K56
+'{rMꔚԺy05y`MPZa4kQYZ/GW_|O=C*nLs GQ YL˙m6n]5.gڌqLDuʚ}(J
+7K](u:$F7mB9Eu@2
+V,JpKV 0 |yyW%raUf !sZG Xv8b. :
+#[5Bzl"m#
+AIID& U;s?1&TO8@y"ٴVr7}Z nF[@+_Jg8uá/kg*O#1 _T
+&``ێ'Kh#.c8tlGL)
+\5E1TG1ց3y1򇷦,cI}M M,N Oޚ/Хz>u5ee&Gw5) LZ*g\Ai%rAT'K>jJXNO^P2-}8wWch9U6+<݌5%Hfn=һgC`ǐ Ybս:kj]x57g-A*YB̓͏wֶyPóZ-XmNşX+>IJE)]6wJG]ΓM ZbM@G5%Y8kTEmA,2s"$7P]DHٲw(&Kk<ދnʎG^)ɐE/Δ}_$8ٸQY^V"9QЎx6;/Х >f6<j
+"hבhmZ@LͰ33U唬/AS:"Ң2gь!2~ZQ;&c܍36cCY?bXh7(~^Re&&8II)<!`[NV6} }K% AL-O=dICc2v_l,ax/J?Nu2pY(7.ֵ}Ѹ鐝0ZVIrT2
+iS?&hjgl9#e(窰Rhlu Mb6eHa S+
+fU;v% 2i(:a%Q63ՂEex#I%
+0C
+d/ y\.߁A$Ԍ8q
+Tq۠V8 ػ.D`62K'ے
+
+)*@YA\E&YMeߨBˆ*Az脰-V+]#ў?av_S@mneҀh>"Q1-n俭\E2Q,WKe3&E54}ȥІar@HV"'S3͵Cj 3:~W%Z4bg분{-Jnl>wdkZ&+E8haܰȍ!(k;\V4Ʊ^!o Gٟl/L R
+cY|xp|qUX83 @ȶ ^GbP.*sDLBG'
+(¥LO70WS<;=BUdz3Y-q*6WzF e#Dڦ1}1I'ޏ
+~feeY
+E97Kl227 _aȨ<Q'C4 =.9 $75Eq ({^d"ޏY'N_A.?xAo48 ^j?
+4%r Bc >\ZG.ǞvQ;ϕ±ylYZ_"bJHwoƀY۟ y 36o&Z8b͒c%mDPLِ̦W)I-%+nZQKn_Y S (V[qL/ $~(lcE L><l+IG"D@BD-$i:y QW@$R<IcR Í CßJ58s_y<"C b u՘RT%ZEj,۰d6Mj9;}!Ts4Z-*eWHBvk& \<S#]
+Q1sXcζPH -ץn^)f 8\YʺAYb9É\~Z0XZ+
+!FFXIJph*q<,-C\qL $nb q& Y¾㭣F#YL%H&:֫?\pys0 VhT!`7XPSڬ_L ${Uͤ#g!1
+TNbF)j;op@ć67A;\yvY* XځVkއ^3TɑH'(؍6WYF
+Kև{Jii7rw\3<$l1lz¢jk2~U֠>L#Ӫ`6U:^1q2fzw:\$n:T#3b5:D?I-!`Ր/wSNa֗v'jR>e%{m v|`AŢϤ7!IBDaj=I
+(@yN|6e^y.q94C/tu=ijARv3OEL0qHV@ǞF(=z$5mWE$ی< ]}\hn;
+oB~쮔vS 2%&&\lܮvahMQ3C&b?#7Eh %q 8t+E~`M(T~.ߜ[}-sW
+a'mz ж> ĥ)+Ruv\UA<E(Itgw ڍO.ODeVh2N BDCl2Pg'[[ N1mTSƒ
+*fiN"PTh&4aNX%tP¹ʟij>{r7NAR/IHK7Օ% $<_LVN G!b.H;d>]BSm tbQK #k] ׬51RNW[A3G_t jHRW =R\S#-$L 1>okDUPr/v8 ze;-{- {6 $2 wٍ&:q@?/@ (^=.@Aꅆ]>$Ƿ]0B`.-tu0q [ l]JS4Kbd1B pDBWyFI[hw8~ð8rI,a
+zU3*F r[%>>5ij@𭐒3ziDv^D)_l ̬/ug1E巋>nɞ.af#zb"n*"$Hj>aJx?O[a>>V1@ qP\¤v ww{ ݯ~A\䪮BփR|7tA')ī+A;[BHzZ<gv n%{X]ڇFRYl_be1(d܊G $dQJޏ9PЬ&eju簀xW
+uؑ PpGҲ8YrAK;%fS U2m^UJ-n >d8I,T-';oiV 聠Y]v}Q3S Z(vuȷ&dBZo0+"lm՘yZ؞"瘍aEiG`4.r͈%18y]e>l9ɭH)N<R՟6W~ԄDV=QMKœ >TT(^S3aMȤ+9N*T%A9 TKs\\kP
+A^B`>ożRaDu/
+HAn9O;x`
+"ERҲ^z;'0Wr?%F\BtvYhzޢZd|6Fw/gPZKXUSoT-bZe1!UJmj˿/uA[Jk@G^":tWv7QhoHhV[ Q8c_eht@g-[ot] p@N@*ִ$G_ +׍s87 ZG(fhm$t>\}U1TeJ:LwHGk
+:VV^G[q/ѳP#"5&OetgR$$[\LqB]]F'D-KRL7Yf/=c7Zcب@eGC)DuU;F }^eh'T:C*@3H< -4A~GrGY/qG/r>`$QQoѺi*]}(7 $wB/2:V8C;ꍡf>n$%KA7V&9/v0Sw*<N &[1џu/n̉!FIxEt4N-f
+o bQEaȪJ}85fz #[! ! Xjm=="cŃrwAy]K x}Y7[ީ(+]G01 z<sp-L*Ģ{awF,9>1j*V0&S(
+l̩P_ ﳚ.|c*\.`ԬYM7ώP8=&7rP']O|eQ;Ç)or*7`]t9~.VzRId"Hs|nB2R9 l0eeYEĸڦ0Y fCFmߜ[m~2ʖaFn9H>S_Î^ Eb^x fR19"w ' &
+INl;Hk/4@_3QVk>^}5IG,u!l1ϡuǢ'i\Ժ~PT{'?j֥-o:!>=mKfrkCI"Wr#&AfSf[Ɲ)ؖc $
+::%>;Hy%]w5(JX^
+`'ǼjXxϝ&`WqZ&T`OwDƁ2pihi;"KsuW^
+s`m}Az-JAl^0Ѳܯ1oج`#(T\UE%.A=z=Kϸ&.
+^ -x=pnhpO >RcU  OhdI .fHތJӿJ塪L1:jxV80B|kSy9OےW'D=
+3="z-}J3Ɲ˨:٧9/3l~B)ڍYPW?@E_HiLɌD{n.BhyPN~rDSV Bv1SUrDPxo29{/O<[O9
+O>H-5.KĹJ/hdM"˅L?7df[A2겒ND<#
+Wβ2| Խ% _W`ݹI
+Atjogѳ\šznw /iW@@S8{L ¾
+өQze0 lHH]3l^3|Md<"gǰbMޚʄbIJ{LN:g=!
+.kY^VUªI'
+3)Ұ>"0 R*p &3l<߇.H& |h}x#}546B 7ߓ!Z)Pyz!]ZVta %g
+HA:(ma62hrz ")[a`.Ф竒%hh\-ޟ@YLTHx`- >Ţ@Iͅx>.~y?]hk, @>O(dB,㵒<1v2F)Uڵ/kж6T<bj3Fc[QE.y8drBJHE7ԕ)J#4cw+%46TO~hMw &Ms%,K.I!c9bI[Qv]Yf=0Mt;˦Mh:Ξ/zmic_֡FM:
+Ek1Pw=
+6h'BP{g
+ti/bFm&/39mQs٩nLBګ3 ]9 #2ɒYM]ӢV<3&r2eM<'O?<X|ʼH:9b
+q@"9ĬO>juXU,yPm
+⥍=tS.N_E1oEP)R
+L&̉^yǼͅb.â6Hjg`жY`Vy"MLxZ2ҙiO3PGP>*mbب9Gؿڨ0lq" <gưGbq:ڂ8aZIdLUiF1dHO L֩<U35bBt @H#^ E|i}J
+Y&|me_8LM w(q<F$M=KqJ>6Ih)֌:buR`22]
+*q7N
+.X2`uSWLD|;Qղ.SS[oҺZ,˃A3ͿڛjkWj㍝89 .U(`ү1(`n05[0/c$G;&B#z E9:jYWIt4/[tx<ľd+*|V=9l ~)P'i}Qz跤FcxBm0~דhWӷS-
+ C$Ac\lÃ| kЕ6Ց%+yWA.yV34o"}Y.Ġ!,
+/=ģ!7[~iƆSse&̞JD>YÝcwoV$6
+e3\Z[|%=4NE
+>b05}/J& #Gu8#Q[rpʼnbǶr7؍`+ݶ0b,u4aڴ aePyFAe}JuyM/
+^$GŘx}/1Gm~%qX>l taZVȕNq
+Af W4 VR{0"3S%.M;p:/ܸ3G r$3d!YUH|hXNMq
+u_`*5X؉؇ RxL2-t~KѭL_F2ܷ̀YEbd}X( *t{E[*8xW(Ue
+8se#/Rsy(;+Ț}efibB#g5!D*>d:& Y#*YFFs y,{ 'bjjPV IpΈҽKP\rͅ[GȐB>je**o=k6ˌ5nqq<T5W$YmIk ])#tKS%Aq]WVJPMƋK="%84VON_֏1D[ȍ/QO?z;$݁`qKn.*1c<
+"ǣ68ס%PTb8:\3%c`>ؘVk5kҫ_,䕫U V$FV>H3q,}R A? %?W@%M?j'0^\|pmLTL3ֽ Rn.}-zΙ~#ۿ~M_eMw|s@rSŃHNZ߃B\U F~vM S
+ڌ44{9 0@C;s}h#x^$K5ZsY&mH{z D :ĩ"qeJ
+8:PUxd=ĦK MY%^Vl hm"V?E
+B[
+D-LvoEF
+/uǍDN`$3o@8VU {!CU! Jj佄-L>* {Ef<Wl㷗,G<HE{
+,Ri,KgP> d&
+ <r]'%{I˧$WXO9ܽcp[\^slfgQ%N*zM E"{0X)m't]|k`!IUGH!9'=&nQ
+ x^Qc-ScےMM+0Mp4nExt64%.\1!/
+^Po+y><Q܇4W_Ɏ_Z+g/am|9?ؼ X1Kbw ~ !IW1dnL:-{
+ѕ{q"p֐ ƙsw;J˴;0ia8_Ԅp2sݮ1TevtJ})W}Mڥ&9A^lwatB~l(͛M+:v$
+[G>Iv&5kt4=AP7H!nx<ȷC&iJhƷ o: [''ƴoe1q
+,;V*S`Ӆra֠v/a
+Q K
+RñPbMR^ܪ>3﷞
+>S]j~.DpӎVf*"fǦ&(+B(#a^5V(WEEs1ܨax
+S2D? S~UTlE~vx9w oA*9f(Aս='yNۆ w5k^gO+< +U -5ؗ8KAs!^ 69:Ǒ20AsZ \v1S*eYwo'lF3o
+qgtZC2PvĬF|1aWf47=K= S6ci PTݏ6P$ѣvڀq~+?c%*.i8*"fѲ:x(/_L1^RmW|6B^AѬ|KDF>N.2_H* 3=[svٕFd_ʼ
+_ FFƬϧ#}>-3ͅ'@x[DT8e@`:g1t0W{/sQ/N4y(\WJ,Ohk]Oxf}9'|,9bRíytN9j
+M]G b]xiD@R2B;;usq?Qgy1 WŇY/.fڏ @z87߲`Q,cü}Ɍ0<(b~Lm{:K0:Ux!('yD-cŝEmDL['&!=kbZӝl8wbn2ΗAUBcb, N{lѱĎ{n&NQ#s?GO1fw/5CnM("1y<kAtsԱ}`9ŭf꫶9VnQXrT8n08f\7ήxdvR1χȥ36gg1<(ca, yޫ9f)>s
+\lnivOs.*_Ė DsxFBh^$[>"VIC{k*(0Sԗ|25Uj:SQ;Zh-B&!
+Pu}Fu`5QpӤZHQɬ9> H'uْrB`P&?0!5-ཬg 6DWT)`hD K l\Dg
+b+Tsdɿ' CQN(ً)\L0{ܕW:&gBs (1FXO@x&Xs71d slviLw'5 .hf')2 chQhu.C9bMzKؒqZOx
+7UX.O3߆ rɼU!#Sj͵ɩr3rB0Q:THgHt;٩6a5Ir=RA/2` i}0k<y= ;wHƧ-| >w|O(̴f)doVj<}1l|a@
+{rHly)%xfdDl!TİORagB$ by:\sZj *#f83!^Gh<lE
+8a6_~hgWAő5%$x!"( :2!ԅ&TcΤ[Ė53 hpȢz<d_J$;PyI~qTJ] cŐj ~MQ'CaCbӌ5Xipx
+%_ (pZFIAK"t 4Hr8 K f፮32( b\j IJcB@ xOG0J<x (RlImwEc2ki%kRd ߃P#e1H^ /6`釔C2.V\VЀ3qχ
+L!KAD/{a#HSL@VF׊5B:! Mgx*л8>x>-
+@*l1Ӈ&
+
+P?W-q ~)a4a}#(kYz{[|@ORs.Y7\M<)%WNjqP(>` KM`\)oEҝ Z%w 5 lfmuQ
+.BToy!+ԎY%Y#T2S Pdb *D}Id*CCY@nTcyB+ެysn۫ *@`㖶?}b*u
+W)D
+p-P~U2
+(ZUxNNΐP5_5S4 !*4aΜ=+(JzO 8
+
+%:߹V
+c)8ou%򸫵^/2ܞ"`֢B(yՁLM'm}zi((2o8T)d5f0_ZzN/z3'!~Zr̭>'e^yVNbNaz3hTY[-u(ݒoՋSfׯP_ {[x%A(qVq *Kl J"e+TDWMȹ
+ ,$A,qnk'į^5OgktHY[h,YK\K.NG CY{`%{ʯwi:j1zz[Y,)d$,=ǡ4yrDm$>)_5lnn"n<O6l&0NÆ|-ړ 4]
+As3\Cp
+î>6.t{v(,$=V:"hI?u_{FxX\ss뙙\η1pB #G:RAb+$(q!(2K\kX7x er驞[B5^ZZ9c3[hzNv$mw,EWj|SJJ :ڸܜ9&+x~`fۯ12w)ǫ$PIJ` YC{ {UA^'LX΁X%#I
+GIܟY iT\i0"tYu{.AQoZ;qab{D'dk}]u/A3p5xN`ZC:j
+,r>`Ҟp&߭iLs޿YM|s?y5Ĉ
+%X
+h3/@>Y
+-*Riē"؃M\}|iԡDvT7ė7p,. 5_0JF[Χfd1YNfZsXſO>DJMg[ҀoU
+TB5
+MBiWGcmt< `XVK#cOqpMƴ7f0wO "l?q܍p cAq/}/B
+9 O:?G+ߎT3-n"p@GbWeV\t IXU;̂DUj2`QXDŽVn+bU,_F&%>a#K 2E!b& &݅R8
+bSE<L7/=c"i%A jKyQ2S؈ mP1XTJ% 0{UDǥ"9p:|]F`S[Z*ܷ^&q>-/A $ikve$uȗy.Fʬ
+r47FppjMbt reE*HLXj
+;Z4D pW2"4v2X'lϓN{\Qcje(2gv&bD "ls9q*10T:_>J)%3Jp8Mw ˔D\JS2J֟s`ri 0
+szy ?H~VzHJIҤx P.o%jM^)<`%%W^0܂VUd! ȱCi<<Ȉ
+/ 6gL-1X|K鰠fҰa]Ok ~loq>Rğ;tAݦ]_' L1"hooX;Xd|7/ٵ$qv
+Vu6#wYsjb>p>!B}kJFB>0(AKg}"F:6},4H'Z(yn|K:*{G |n% IIliD){ ˠԤ 8dtū.l){K+BoTvFXԫXt5h(I3^+Ћږn)O[v/|GG yGH+k`}͛Op$X4MNI1b|V8+ʔ*3f
+Fy+9A7˰L 0l*aJEn[>#& " f@eT%>|@w`U/TQԥ(L :LsA @G/;ҲW(+)XXرM3>izgF
+7Bn`_J'e4VM53E(IFx1V%,dcV(c<R|sY#_Zo I_XŮC[;S]A8P@lv=f'&8B3gc Fb^WUzy -6E !tdǀ*R=x.M{:eY
+/؉fM3G(O~9!f ٪eq2~d[I.lcsDI3%5_FS'īb}jGu5dI"miTňq9~N{`\_v".5߹!_4z8ֻDJS+?
+vP]/LQt+2vJ_ѧT4+a~#/&:ܡšk<`GG`<u 9bM|M;O&Ko * 7 ^aM~uL+Lsd߼L<d4/VӒa[|**߿E'cY۩Kr~TX~Pt#n݋`H,Uu>׋* ^{nM?-%9J<9!AgF:J|g2()/$"pFTڀF ~
+00(Xχے}uƶB:pVqCnvX O5((T?P<ʒ698e%mdI# ALÈүA#`cbQ
+ j'Y?ԀOu(>$7Dz<Ѫ
+rjxo,Mmr^D+T[ql Ɲ$l(ɱoSO݋&[>9L\:_5#5)mBnQ94L,㔾W~q7_s/]gsnZCIs<U&;Mn"2Dl
+v_iN,LJcE5.SJ
+ NE/Ҩ:۵Ϭ= @™V5 C.S{ZI CWv!+öm9~+pg\s|B\LNs^il(V/2Sf핶 TRa5'aS;GDցI]K(* %\xn;,
+Qdh0hX^aFP
+w,I Pl(y<ec#0/_KLӮL}YX0˼/I14">xPL׮'7:uRRH^|N}, ]%5rcf6Fwx("<(.8(2%\;w@tklȊMqm[i "
+W'Jt6%gnҰ$,cG ;;YRityq. #XQb(Gq!+c_$%pvuD/*x;;O]kn9o%q)Y}(Քd8$'0pf R@׮]X11 ŮC]v`"_d.qHu9< ?k^l 횗qs<) Hv6
+,016!J|^a.yt96]#Bb@|0Gfy"C̠Gj f`kC^GȰg xǭV(N~$]% &YdzВ› 6b+NAU#XGB3i
++2l/b`
+HA6DO; @\;KUv^TfO=I%e ƣxk3Kf|[m~+r>[xJ 6.A
+,^yyBlGYf_!mfk,f/\5[}ɇ?E^Ι ˣƨV/|sI[=żGl=C&hTI}(dw#'^0wZ+bic
+Q&Õr~Q%%wPRjԐd,ɯ )Z ojƼt;'+/qF ~8빪Lj~`AyYYwLԜ[D‡鳞97g+VJ7@ZVj}rGi<|ΓN:Esx <kdZ*cN_!4&[Ѱ2q'H|o׷=pJg^pӃgY21Y c]{gVʸ':|fdh<̈g;%,i<qi24Ĭu<H!Ic
+ lnX`h܆M@kqk(x8Oo"}ңgM uX"$X:ikoBBzN*p賣¹T̕hn(L#+]30tIuGWa:ވ@*pWd;[ֹϨy2
+O0كg,uEjZO
+U"z}-(ySULE1HG_Z}2 dҘBaf>e~,G?9!H#-_Ռ1Yr T[xŸCNɺh>2O/3 DL)CF h8]<ٟR 016
+nP
+Ɇ\I1U p *#ŅJ؈w屃V =قL3JOO$z7m0DvQ{bbNt>b:F44,HǘYti!.C 蓬UX.4Fx3.Bh0<DQ2xٰ_Qb [Td(d[ħQ<NyXa^)A>ڥ!u~!DvzQ55<c<
+C,,KlY.SJ6qxSPwvC|s:"o) i0kA-kUy|v r`@+ ercqSk9p<o]% Xv`H-NY(M܄0$8|jA>зCM L|JfmIV}E.+ΡUn4ހ)צ1(( J
+bI`g,kۚY| 0]4R#?ER]Y2oKBQI PXH`Ě+DuGkkI
+Iƴ(/ԇ_u[  MXB4ϳ1 ;O\V1 :S
+OV\h
+9{1NUEL(SA- 1lj}K5~O+!x<h+-A>.AoF%}ݴ|mSe >d0L;)J-JiϗSŠ2/Lsk_LN5<Ċ` R'6eWBGD^B(6y R&_ 3(20{`h ɢ6:lڝ:ZA#V ͡Eno[^o(O:pk gNYk9ni&Nw†d-1T
+|mp_uwgs_m^fLFv zNV/u mK`Dvk!3P Ë1?]}oui8mc?L%HJcxiwcd%zCL):Z-a:leFr)E:p Cs@{2R[sNU:7 26S$%ˈ|Ͻ7IQ4gn8HwGI0I}%EjMNx>g@_x@v`=HrČ~HD9FRjL-{vw;1)r_26 ƌY^:@dXω!^>YcKXPuYxȯZHc5p*Rh[SJ9ejl<ۗu'qd1_!Ch
+Ŧ\ J-XR
+(8SuwI_m1~ Kַ`aƆa@1#PBҭػw/Jm>}[ٺy]߻<R 
+UԐSvpEus
+`K<4NEGH lLXrNxa,c cR#  f|2SXmG ȅA؉}bA 5n|*9A_N9uV?.-wEBpZdtl2Cv;aK2H>Q~龢Th#o H{)1AIJ~azgIL;fߪE?^Rh{R&,sVV" >a{*ʐxÑi͇x%B9b!+c kD b +)z2+}E|sh\eUY2&a}OTP s9X)36 :*tz 1vzNn7k, L2;"XHa]HyJNþC@SZq˭HYXyE۫8M~_9JJ}NJ"O͞;,5>$L`15v+&Wc&u
+}vi\;FpI9RF|gby'͂+ͮD/U>SX EEf3X9D?Nѯ"^
+#`y- "e_8(jc.{߯ETj~gef6q٠1c6&bPd)ҜY|VOS&OR;=5{qRhAjsJhNg9 I…Y&A`Qu\%
+4qAzE4ګ^2mmhYI 㒦Au>KR(NVNjzLLA8y܅ӟfE*']]"wc]
+Yp. lE0@ay{đ:g#VVacq"T|ї[Q“i~!Y<Nj$51Rr6h0j.a$}}MC(QZbMyvly$fK\Jv9קgXe&3 xm8/%>aZil[ۚZ<"7TS]Py>kj1)Zl* J
+-#قZ< ) HXJOX
+~r,YyKv?$9'r]4òu>wԲ;Te1)Q?쬂&-XR)Bݭ8h7,Q)Z~݀@E΍e9X"%RRSMکӅp_숃d+ܚ-
+:0F NֳxC%xnG-CStŤGcSSe=)R7|B5oSxarYL+1;\O׿mZ@DŽžq71✛&"lʴK'c7 bhk/⒱Eba_$0aI!PA1S,`׻m+ckNbXlW,
+"#c_;_LUfߧL*VBX/o|T,(<{5@n-7y ];3$ ְ{)ecfI $mE6KP-A"߹[W79J\+[ltC[$ ˎqzQF#7淺yKӃ
+Xُ[Wӱ30mGA&O駭G;@JZgVBRñ=@\DDи,zOۀ3eWNPq1<AwB:Un
+`h<|G_ #ځ(4NC炐{#A\ZQYN@ZF2Jߩ,
+O650j'.FK-`9kO6SJ!Kٞ |>$>DVxqOueĴ4q`3rY^6-J3N˯^sK=K>-XЂEYxJ7yjנ DsGPqA ȼQU._g{TU6M>%|C0*2>L! +9 s9GApx–(Ȼ%~c/f&J]ƮF"d%Uc̄5:sOH/Xst z1jʃ)a]єBƑ1& O~qK0 %Sh2LD^R}$G4׼\1AT/D9%/ 0AAke1-.*Ia+Puƽ߸}F&JG:F\:
+nH+Y;,!KI?,!?{<y,xEULU&X 0rbGv"^4eGT1 yɾ#R p Fye UbA6
+wdE0J
+%<(ʱH\ .`E"A} :Y<)vӞ"XF,(H bV6dM>~ y)]}(l,sXf/#HV'*AG$RBYyp9XȂn"np'>kmA]q` !T; 2 .HWoXK^ZyYZyFdmak8<UYf2(`$tD;֐@Ug[4 Y^Aέ#(?>FReƤ;gd M /pz"W.$&Ruyl*lwBjJ>G @8
+`eFP!{fQq A|Z2LG?ij1Bd4?>9H!HdVJt˅z`]  @RHLj(S}tLAFF#1v+7dƝl_ݴ)prm O!HPҪs#"LG;p~r@ޘk <e
+WZv ]ؤّ֢"q}1
+isߙE BoSm$2Dn ("+Fj}g
+)Dꍛ`h R)킮  MLhy҃ hYA$#ak3C3JL4 ~tWHgHŽMeJD=0) .ȃe\+KϹ"Ɣc,UR_b'$2>ڔAR NŒmg%u\* ik\D-dyAgr>/M_f_q a^kpo@L!#B_N J0'(k+RRXA:Ya0y%ZP;AKA`4.r訨'h7fR'Zjeim@ҏyaZuV -yi>r 6= r _iFLȕ zށ'(<y PDfmM$b*fM+XKq`aM[o'!ч@LXޜCpTOOsۓNS|)i.N}UK{"\TCZ6O8{i1! {Fiq2k_W1YJz!mDvxs4ܚX@kHhQ#S++EP1GSQ@Pci䔉$Y^^@^UG1|u} v3كZQq!̤ 1g4Τ ~<]cn݂&%ױEod;ۛȈ8DV3a0r? ~DIE.1ˈՕRb+,eb٬]wСQjeL5n-e\#_SrL>x[;!#jZH!<+r &T ϫ 1XӊAL8
+r%*vc_u I0txoԅlvQt"+ħV"k Od>0^@&Fvw>-3Kjw*p{(6Gf8[X2ߓrTTˇ
+#n"3g\@ހl toi@Htf X cDqŅ4G"Oq{ S儨v;><֧\ LCG16+Um;gg;$5?P VF)ǀ1mƍD @UiA(ɓ UFN7IŰ&qkXr LM4ݏ骼<[CmmA(Cc0rnœhWfdY̨0F\"QJ(UԚJA(>e ~mM$tSF!%#O9s)tI =
+}TBsDc &IE;~b+"";~AXhl \&V_+5N7i{1t5k8/OۮI*OV6q\pIa ] h~
+Dn <U)OmF#H;v| %/qWC"[
+7@B-Wq<84y "5Sۼ _%xltFQUswm)N貨y)T<?G IDv@00n05ImWBEh sNmAZKXɌR( +sI&=@_3g.gK΁|aqAxxZQ|kn-U1BQYX>~.tJvNO-MM RK T`0:tO58xA.p@F<0<)qHoAuR"|r
+\D޿EY~%*5 ~?͐ U]VS,cAu-#!@Тm*@ qB }tw5LMzM@
+ʜln@8ƤUC#[\Z'0$Q'mVsG1àoҩNCQxi -erU%BVMIV/bW%ؽlP7,shzǏ73(MY's8Ux8РS<}?d`]>~LB?}oܕ:a%Àci 4rYyT eBN&&(G@4 $?,*W 4q
+)PHV_ܥͣ䬭xpSPFk'5zjn %>TΜ|'*Ltcx}JY[вZNV(
+QPv4f=](0)É
+a*X(S=!D[bf.diPB|Ο#
+Yu;Z!h L @Ga/5a!؜L&1t˷hZ؅Cc +\u:fCdBD> .([p
+#^Ɯ !u3m^3J=D0RM]zc
+99\J#K3Q8ݸ*
+(PJ0u*,^Z4+_ķ!4Q m ] G+t4l^!z+ q y5&F_jq Д$M Lx}Uu hB\
+ F
+jqWЂ 0`
+\4`sk.pfځ) ˾yFmB]NPZk'q6ɵ=IMH\;.q(~br!SQi+)o@nɥ^|+R4zpPche\!HȈ}cȫIPq:M MltV
+)FE#BhR=@=
+2∫#gV۝Ԕ5f33&K;d<#B"θz0@oCC\GXa2dӀP!*
+ob!D
+HUdTLRjEi&pDPC)ڨ8 %j4(fҦO|2pmf!B,?Ign25=bACf [Ne+*fO48C͇=]Eg:z;(ΓSԢO+zrf
+!c VxUOTTCDDS!5䕘A NN|9L5w좻T1SC(,:+'>a~L0d7EC*
+ = eS M!reSi^~jm vg\V~ dǫa4t 5:YM^` xFz|tf
+P0%3?ͧ~2aF:
+Uzh N2qj#_/<SxeM2lK# Mt[{d~ \qO5idf1mPN7msTaB#[V6-^p :h$ofl m$ r4C`l)V (U%zΦ^n@y 7E_B#f,nxhËh)W 6V@`pzjs@)m<3P!Ӵ Ln?FCkX߈RSu`]DS
+&@j+xbB]*MZWXS׀ٞBuab+αf JIPqy|Ug&T
+r%h.Q?CGSRJxrARw 4K?bQn\:|;;dUk]dW2^pfqЪE}]:'10@8h.4XG T3F^'?(. _-ba!m+KiW=~UKXFm~dq"5T7_.>敁?Ҩ;飏 t48!)t~03WG&h,mlFS_wb\@iiD 7҄01O큥ɢ]ʍ ! vϐ߂ET*i48&cz+0D|{m+ғ_Ͱ0*jfjO8=oy7 4bl!zbeɐG%$ua8k\`y!zu ;L@2 r 9[e9;|ϤlR!sztb$!?I/B(H
+H)G+]vUu|
+iZ}t-?< A ):_KUjr$Eש8a8^9q8‹I[mU(o䜛8կG.&fTosq4/ZvξWhoܝc_S9Qɳֈ:z{Vs{^( 2h^OHOy܉L-ysi![Cd2B#ML_3㠵V> ~*LBqfdd+ w0E+4pj IF@-O[=10
+bXm3%֝/sjN83}esG@,mWc*;Ƶ14Z
+7G~)'7a!(<}=Cy>ѻ5x{+{(%0U?!X杣cZ|OeK']lXsۑBaXZ<׺Gh.ȩ#gJ]S8쟓ˌ@S_qP%iܥV[9WrU7fSC5\Nh=UTtlEA3ZPeT$&<2Lv 02Tt(@ĔKHN)$LѼ>uP³:HlW%}Q(žۗB渉.o싸Ny!9 W
+z:ѿ068҈x\~m~Rs%\o S&3=51" j?!by:D,)rƭleScH~뵭tMsG,AO `CEkNY;5g7
+x
+5 L.=ui >hvdܵܟgC#MS>4
++k4m5LԚQT)
+
+$YIYsتV>fJ_DIJ\;<RCQ\
+
+1DnK<!ӏt EGC,o)#( ˁQtሦk=
+IYn)7ޞ7vzMn&hakn'W*0^7 K_ 2<Sҫ4+Pa
+mѼv<`up?[ߍWe\ Jpa2GfXtOPZWj |w.zS(8H .&3FɎ [#~0 =c9Ss+dYu2/m(R"q.3<{@dp׶QӂR$iC*½L  8R3Cx,͇?-qׄ.#?j(R \PxWBv`yz`_.E*m2~
+b]^
+@:1l,Q{tYcX:_b)a u<%SG@ز
+1 
+װKfzI?%Cd0Ob)Q PҢS%,ܟt(h,TrZ84ULL9Q d1z~wsX.dp_9mFhSZM jC%b? "@vPzZlESkx$`hv)l _xI'#R_Fq2~'+C4!ַBP_6'+(?Bz3]5rȳmRSFmR4b8)!XL@3]
+O%8gbdȈzC Zޭ>:UgEo1qd[`*\
+3ՈT;p7ADә1=bqyDr`}úR; HřNUphjk9(I&+K&rň}nnE(lc,gI^da>y0h$&_SO|$f1-
+2WU4M=XT5xdz>)|8yyߨK{㧠: ?o ;c \\f7._rge_K%iA+˔} 9_ݯ+*Pd`3ǂ1
+" V9&/gv @֌ka
+,
+]b !
+i13LB&~@\X>J_"DMVY-2.f ^Ib`+"c89n.;!+mi
+ g]4(ݾ kuSdթtnJqqb@?dcOȀжFSCG~STܥY:wg*<Ė fWA$L.!qBKJ2'/LbF>뢘*fJ<Pxג} !]j{xNJc2Y)w;1.iԃ4"AzyHB9 L'LEu_ g؎x:k+*:8yòr=H
+V9O=5ޕizQ>!ݲXΫ Q\g@32E9+ IYϭs
+swIbeIkh{,6~;JF7< #*_h#w2kpoA藰 kAχ"l%=tKh^NAvr]MB[
+ܒkh}U!- fK=?R
+US.}@vqܸdf%DZկ4VR*c.ċ!P0{* BI6X?0訄j?(i;R]{g(brs -3)Oܠ=G\B~2ҡ!*qQx(ؕĦpMJF|1'R+T¡|`e2G]Xtf#ҥk_ôU+)A0yi8
+2
+=+@bxPeP |^Qg  sLJRhfJ8λBTX B͜^ʎ]ͅ & ZKN"ŇyW#![B+Jd"!%Ԕ}<OTrnz
+95!w8
+H>maI 0<BP
+H][GW=h#&G<9<F,an$JnX,[WTSl̀hng,!S|x$btu,k@|jsNi6o]EQdҵD_}$Kw?km qƐ+KDm9C5yw<fɻMGdB&$\$Mr!-:%M}!zP󩓛JЊQɅh]Lf>"\>ؐb1eWS}
+93rer1(ةe[76>&וaZ׆hӉz9V؇Ps]Ƞͼ̢0ػIԣsA:wI yX[iЅLP:FH7gT-Vo#4_,C$<STՆs 6:su8 Xddk%mNhdq,))ƠINhhF h5)}G(?^{>~ЂbR}ؽc'ABJ)ȸN;Y1Śt4<BFU1rHՖ9mFBNnliD
+u4"[Q4@SC:9'-Σ(
+;Tdl22LcRALicQ!\lH[8 RpÊNh? 'WYtN@b&y- !:- DUhjKiҜC2VОTt H @vZKs xo&k)daκ.BHҠzb$Q.62 sR#:UeBw0m?eGW:TEƔ*$i&5:G9EYl@$ V(BW#Mpδ,#nv.ys.afsnIxPYHݻ\?gfv'.thiI%r f%>@P~6S9
+mc,AJ;[GO_T*"˗obЉ8IF{&@:_]ӟMdf3_K WEB%cCj0@`9}̧dd!<@/o+Τ&lDF?xqcF8' I~,Bڽ)62SS}n%&\<L|Vt;[}$ا{P_.L[t!s!ѽɽ!SaL:}$R43ɵ! AuPdeW:g9u*HF?#3H
+|v-
+E[vZj 1bsJK
+BCywMkyCHL&z!Pb2SD\g#i=:x?
+ZCOad9Gׂ3݈Y먢
+‹i`O׳!| WB͟QPoBPq+MX
+fxG2o BԳBq["|@=-cyϣl;A!KVO
+Dgļڔv).hj^wP& 䢻2t`39GC6œ%!FQ ]LD΀msv}1vZnb&)z i 7g]J0M^MWbG)`{1U^$
+khHy
+߯DR//ZD*2
+d@y񄮀2Ώ(24. {ƍY$~D %.h4Qƽz jAU%bƌ
+a=%p_vL_dt23ɫ!)LRd9ô%$ޔAMPGhJR w/y
+0z-"П2(̖EBģ
+<!~,8 @`0̀J;K Dn-Rn۟lBe.#dƭ ˏ1ΑHIcRb#L_d!Kg}gr'5YsdYNL''(ONrxUgw
+ƿػR0h;Yƣq&yt
+`GRt>Ej k2),J!P8"tBO+ 0UW076b-T{7y.1X.[+sI4ܼicHqWæqH0/6TKK؉7AM  E/?Wt?ݛWp(oJ@֬"xP9Q))jZqqQS0ވ`PEe, [-fiBц5 W/ݔ|[b܃skB9S
+]Eu&`uI'ryI|gPAB HwWxoi=Q+hEjw?Yj[k'⁸0)ř=
+w>n>@XJ9D+$
+tk;K@FpPs>4
+3KyE
+ٺk5ԉ@I4x@XdGp M}?<F) OiZIB蚗HIҮQʭ) Ĕ{+b<]
+]I^j$9c+`@<MZC@S׹U _
+'H.8Qkt4NBfD`Z/aN)EpH,piF1CZB9Hk$쉗XR+FEoɆpC,#h >p5G!0{?>3Rrp
+|@=`D9FRwŞ;-IƔLz!mGk=1_cWl!CI,}(.9ޕwb7$
+[:AaxK]뢂КNh1ډKnA2lOghRwn!8Ң~DK}aBC=ɴe+*Ф,K¤#MIsSWI8Nl
+,#*~)c ѥ׋_Jx\ v~UQ+ک3N*W_YrF M%IOoJ*#44 4bm@cG>+蟋1"^ֱ foS
+:N\dWJ(cv?8cU}r sv;yF]aƭPG 8Rf%zLG:a-k}1pIۭ=*`KHhj~fQ<k䏖}M#aF_%'c7 |A"<ے3<*茮Ahrx+L 
+Ⰰah>͏hW @#:hjKI:7-MK bEgq*AMa}
+RvdPބkoms0ӯA Exzf͜2Nrknu芚 q7jb!I%n%4}J~%YdExUQdg\.r݆InO[{Jpo<8y>O
+Peց!O`,BT@{Bq|4R@ HM `y:O!^= 9֢ۡ}T]byOY3nJ{b$Ȇ4̪~,z"ƞ+CDˉrʷtY 4%o%@ȑ;ᑗc2bD(hGY94 O`A
+3n11Zl[0̣7oQ}Rk@ibʭnl8y3[&fogPdN!~f5O*"IلEBX"P~v=A
+˳*0n|Z QuId_R$-\
+2L=A^"fFQ`*?-f.gd%)\&8<F{f%<B"59K.1$lE9eE`4.b;pev
+#j5Y %T>DQurƴQ2Jt+NGsLCsN$yEP(r
+Hm޹!F3ds>~Z>L:LyDPDK>Ry'i"kd~ʺ,=ٜ'%ec>si4nuuh|cC~~gj~l#eUu_"(C D%B;Xr:QN%4&X^ g7G
+PRS:Q&0'gIlGO5?<|h{s,Ƀ3Qy *qSS d%UnpDU b{
+`V9Ce\&H u,>MNʆPIqo %|HGqID÷< oD&:#65L~Ku\\b858RZEE רC}EWS†<Hs|hYw5Ь7LuQ{5x)M'Tc)1Pj I%Xlug@/Rs7)+-a^XETg2ͬ
++|YfG%õ V`AQ|p,zGTad9b b>8^L͘v4~[=c9?
+E2:,?!&켢`J àadfr^+`YJ
+>|^F؀-d|=:K?bR`}+MɺyiyhaΤҞDA0U
+]^ϝX uL!j
+U.ASG.+/nnoYNFR }9?/
+}pL12ƐX,񨅶'C=|&Ʉ) %0
+hD]Cbע3Tj\ע*ЉX+S׺2)^soz
+%3e3 ;@bTjA F<Oh?|`^~[B^puV;fRl>|_ZRk<ߜ;\7j;e>67`B%Uq\)tCci)|P աJ*Ћ,)g2\j{w+*؀AV
+Y{?m4劣|GdH &ɧ95|.zIHPCM&= 5
+9GUK||x:oCTL)#UvHn*C
+ŽA]S,F
+2+^-D H̉aN#ɷT,0ϛxKN3YA'BܵM̤a=0%g쉣O&L . ;K+h&2tki t
+͢K:Y什|~Fx'H 0$%;r8壠/(~i@#~1~r*CPU'ٝ:U E/DcQg(>!c<"Wh~G)<g U&FpmFT ]U~̝f{?l f:~o|#; e?}\EKaʗ-f\Rh
+DjBcxJ$TD[ҀS}Z`M>OMwk&y^7N!;kЦ%}ەkar]ἭQn5jAllhפfTdr)lhYMtA2E`_`Kg'gl1., Wx{7*nyrưz xdGj9 1 WeêΤPLR+ϗ;\@\!x>SaAȩC(Nc*[2rʨ0}a<y )5.gj.c"^:w?$iud?+Bz>6
+pBfȫLҊQtBpHr<)T܁S<)(DHV@JsoAQZGC݂qHi;`+A ԬbƛbBUt')W8ACv#FYcOK0J9Kqi.8cfB(!<O Ɋw`ogNϸL$>u#-(,?0VӇi5(aܯ5;S,iΚƩh':x Co( Rg6Cjd,3^HzA>A6F&!L@2?_VW/z@DBKtwUVfl
+E[g
+
+!4Q6m!ӑQ'\#iʢ\Ľnr*
+BFyw*"ɳ
+ `DH^1 ?-Z4? 0Mqa-zBsqHD*\  +UMi2vT?ѹ;ᔣ#89B5;[&s 3UCTږY]%/^S Yd-VX-~9[ T
+18D9 0r]e/z/Hvv쌦VQT'.f#B&Dm
+(]:AJ /G>L$ z
+]Td
+~H|E2 u
+ %|#EAɁ
+^\A NŅ %j$잉X_NPUe#Pn
+}lm
+ӫT~:59u9s^[>:W&)7{V(o[/1/+!6|J:LƎR 'Ů4
+COm;Y5b~/kam0$CxfT1T@iS*
+擀4L5<0娸d* +]1dp=;'MnX<o#VLa)D ְ8+fe~ fš#|Gz5K<d1흜v9ƹ˸3#ll$,?*U3j1-6*R!%S
+SHhKS.ŅU9h;fJcIzAi5)
+DG + m> tYQJ\fƯVŢ=Ⱥg6&.?%"D X׌>`\`(FXʻ6\x˲rjJLT#
+~'?,hBz*K0 + i0`5
+Tsebod^#jEMg`yDcj Ñ  >lФ<wN1eKT
+{ڂ Y?. Χ@xfݿKƈ(=?R5qaƀ<tA:vyDͻJUC\V]$3UE<`ĎIKR)@ "6j̼Em
+z=g`/ںAhtu;O]O|&ծbS|g۟g@Ĕǵ# Q1 rA^M2?Mtl;k 20Z&.KeҩG: L ۂ`6L5+ϮRH׽AԎaVSG_\7kY2Hi$$ud]E4)s4):LQvSCm1
+1f悑bJ$]k_ a&5:0ȿU)4bޢHLM9ALs
+C@X=VqѸv~k4&ECp>YdžZ[q-\0QRH;4 t`~f2u9+@ JxA.j7|Ѐ@Ŷ=^Y&uϣPPCȋ1_A_C}֗PHZDߥ6 Jy]ΟR!lC;mX!NʲqfȄ]0 ή<KV@N_Ed%LU=x/ip6ey2CG"v[v5{0 }4aGR؎ձcJf4Us'BF;` BsQ
+D"13Xki=ANY[i0;߉Qo!'sK+;̱{,֊2Dfe3|]
+zC<hk +3Ug̑#( Tr{f_>
+%bL sFxehM~KBéN |d$&$HP "wa|(~$pyģ(!1^]ʊjY8ϚcXXS&Q*Jn
+k_[4Ekș+tMA#I!#^fSm9N2x&8 : ߌ.>HsH0vıȹLФ)/*B$h TZ=a)
+7ӺT2k(ރy3/2~yR2"713IVF%TK!ӎNt1w/s?9')7% wzei_aL.9}1ʦf.HN^|!+!|jr |}uLWё\
+rHF8`HdngA{qn<6?\7ˁZ'66WJrDhV?qR2H(% OZ4qNZ=b%@c@d@BR6cc+qq)8'5売[( LW-1#JLc#AVQ`*Gds> QavoUz 6ҏGbkFS[cw1*!< |FOQ>j%޽L7f4iYA5(4[, Elq296cN5OO^
+'؃*i#AU
+(8䒬wA 2(KZ5/UN<~m#$tgT&뚖.|oNQl 0-oè'Pز. bbu.^J(Pw#C4됸"׉0wK^LmE?>vNaLk7_zvpC~83 kFk1e掩sJĎ оO,N~@C2J7lDrYPYO06ŦѾWl-o`y;^lQP}G sH図߰nx\a_ώt1ˬBp<qqI,Z AUy@Aq!%\{Psa`!#*/mI]؏@"1Y(d<4zm.jbn" eg –ѹ؇!);ߥ17X^X_j&A7PbA.y;P?
+ / 3/4E~#&Nmh_-VQ>P+K ;XbNqf^Ge
+n<A!F}:`8^zYQoyo8'!cWZ".,[j&E=.`SjC 7qpl0U!hRQHDk H8DҠAnI3*ܟu;-*miU.YBoJ>ބ(߭?(-VVj·&\&z ;:d@`"[b ₰nf#V2hBp@5m8`[lAJyN5FY^kEP2B-*񲉿t :=|*0gwv
+-s޷ 0 +CE*GM2yz010 dD1 L=qCA*4$r Q˔I#2
+ee,mAgB?T 6$W
+y0\VW#bŔE h5/@\HHyv<Gk@N-sGQ0jɛ-spѭ㾬(h?5*9??.rHK/paX,! "s@A0֬m^=P/s/N.fZKi@#n5\}+"D+[4$)wiv#)AnqhdCX2*
+Hd}DžpSysܣ  - y M|qȊZ8k4 &XO65̒2w
+LN!(UO#Ϸ+țFik|lc/6 ȶ Ext85#"m-$$! OǭP21!bT^rApfdd&=)4 SKڣ2sL&[oR/
+pژQXfSXpfeJw6pQ5Vyh@2+D692./6Q쪲'0lq[{& T`'!hIY?y^9 E+P@I[ Ťr%3KI
+$:1Äa]2xEE8
+= &ɀ[ȠE|GN2%8Qר 3į4f H8޹fex;@,qRk#~;,Ž(AHBꨪu, ܝ@\~E}KKEEe : ՔƲC&:0HcLiV;8}89"L;ґDwpk>Nb+EV}r޻mIh Ƶ;P[j
+96>?bT 9>ƥV9t:/f?74G'&!#A8
+Pu S?Ի
+OU=LK} 1(G'm
+1T
+<+t${Q`edr3hv?jɅ
+H"D{NmQ-$&
+S*Ob[;"s=,xb ߞxִP+%BIAnho"2#Mp.0C莌p%g곑۔<N ' 6a#JK0uHZ<% p+sB*5e9",HΤ0䄛7!6)h2o
+mV6;&/kN]u9> !!&REշC#?JC3CUaxE^rMXY69Iڲz=%$@a|*] Ku7` =+tBiWp@\›eq1:Ń0ac(8aw?tzAlQ&QѣHذϨNA](jpLVu6y&Ͻ ^﷾DH]C@8KCFυ ձL9QG?
+HM;O;&!R)s j;%R7 (1}ϏVeZ(%L>"ѤhEK6uM Cz2|Azc!5{5bkn4lo1Z#_j{ײ2"*_ެK<Z͛8@r+ ƨf^{z{2T9!VÇ}+p.&'Ÿ'+|xn-/i=>NH
+ӹz1x^-\~VώA}ˇս__)1!缂8YzC$4ݴS:nix<<x*"U^PNxSwWSy8zd'k+cSE:\>W
+<?@~qWg[G _F 5S
+
+Fb%<a<b1TGo5X\x)"O<N$F'<̩^svUȁr`Pqh<
+NfGyL .Zc`W%Tfayy3!D>CG|=LjZf;m->;M3eϬ1r^ ܋!JZsTx3jNHuwe4/ZIF 4DT}Cͫe#; ܻN3L:
+`@b{4s-' $o 9#Lc*|a+q\uN73#橶`1'(C^";`7\ӧ7g^5Ӑ#Aʷ6ס;x &O
+j5fP
+fCϹ)/_JKO{Ib!fkz!Oe&Vw F Y> 9H41O`RH(.jB<4p\B.˞4"MI
+ZvG}hӂ.z)b>q?5!
+t"<{pnf9fr`G7א:z 2R^X- u:/u%4K<k?'PA|.3(*(Bç2IW| 9J~S_}
+ ᠲL{QTI(YYLYbeӦW}1`? 亡I &RXͪc^A2\{\|cj7Bf1ۊFc6jh{m}!Pv &J4R -$YM jA48HA4 0n$(h'+ŸE7@NrŽr4?j?F(G^9
+a_ bDN
+MZİ"PDKX5ksqB~UwАs@|""=hT.])uصyme4Bs'=`}h*<% Oˁ#agyXsdh
+zUEㅬZE6;zXn"5ytؕnO@w
+b&Su%+#m G[dCXMݷe*DV~$d?&_ֹO'撗Ȅ/P|RSh- {
+?F'H;:mC 
+ЏCeo
+t]("d-+Du'H$wk^c4 x1Y~Lv4skui&9fX_rl *`W/s;K 
+ 6Me?,!aLjAU!W*Y!]cTy{U
+E]e`[`pvBդ[!7*+`P}DrF6,MU]Iצ6tGSI60B6 \  @NښE`ބve~E
+7b+*h)+d0&h:ZⵥdTI¾cTW}wTcnPA4.~TBP A$"h
+iK- _ #'XZi hĥA."" CPqĺHاHyhm H ]u5F*'&!DĚ"ұf0YE˞eRmi ?bY:1BHs^?T0 rf "d}Ω#bI&aի~d1xBіu[ͧ]= `9
+2VנxƇ=
+
+Avd <VNăvP+]*
+sf~Նy-ճ/_]:SҼ9GQ6fkް;.m@
+e&
+$U?u^Ai
+X'M*ZPd0fDBffh澹р!NYH6QJe.#
+@*FD{DTq`nAJH7C^%GAǝV/ Zŏ~Aw?/< -g|4Gty(ت#He珹Eպ}WT&yI>ic8Ɔ\>B􂒐*EKñ~܊Lc[UElucc3I/l
+]F"Pl*@uBHgPz4Ƅ+<x3Om=f#& a`!k(pWCpϕ?/"VINel Hw bV:)LǙ|1HXG}Eu)##)o6{*ȵ_U| ];R<|?j
+T*CC$eo{ō\C&^ݲl76,!NA*
+e8 %V' vQaC!!]8DA#6& ޅQӨ[26.f0qs8q whw04K]<Ь iʅao8O58uh\pG,qllV1zi%A+^ԉD团L|xr:ȴr$ r,!Sgłp~'%S0sU38sX0vN[ >L}6-/'[t]XǷWPѬ/5}_YӟG!ļ(ܡfd܁MP W@tSL!nX26o<~
+_fP H+JSpKdM+"uyEx>9\,!JDe2щq:
+M^$=x{|mm4ms瓙քWOn}Q8 *biy
+yt]425QXӱȖ6"
+8EfɸrF3s纫7J"%`}
+qD*HUU-- D̅ԩ uL8&cS[؅7zq 7f~dHU-꭪QL]0#rG'[0 h eqG m
+v^6N}e}Hp)Rr0X417'ǂHU>x@a#a~@|3>%1%Z?cPFzrt
+E7t"6HD3L@s5hȉߕ+{fU)p.EJ5- '6.4AI@gRb.-2pb橽=ߤ]NOrG`WY-*nk@k/f0nj@Oj Ω$flM5 51 R5SGM)_vun}`&הl$(,@V,UsOe~(=fQDE/h'husv$_(CHD
+ybbVjxз] "QGf,<Z{!DE&\_g;aZ`zx΄c,fOY+ᰋO L@[֫'LrUtԯav#|oVbZ)x9h?[b)UC$4o-IPiC,˓\/q+(Y
+I)pXn|!h@Ėev@1r>yMi'|
+ նFmGB op@O<a/w6c,{;d&oƷI<lj5+x@Z@20B
+W'"LrUYLvinD5
+"5F:2;D7]Pt {~qЋz)e<:ZWl4U5t͸2qB ?0HV$jL^rݯ¬ݛ0W̊QY:僧2 wY'L~$)%4 QJR@8{WƒW'{x59s9aڞSgt?=D:(嫑Gf $B"s"ի:]߹B W5ad\$!bP*3 ժw&lD-j
+XL=F ] ᬪkFPewG݆db& d+jw>Lڰ|i&g!>!I4-jlE@M
+A ($𱽬`cv
+)@_hbWDrH݄ 
++\a䠜|H]Zv7
+O<3?@&&j6nOE`9$0_GV[m|8 
+\O8 EKÛj:,C$¶Km]82LpWufeGR4d\Jw튴oC2TAR8NC-lzFS[
+{}|L_}sa7Cl (k;F)HU4Ѷ=3I,HD9`Mm̤X Rh"p9d nZY-xW.&'&!=`8xˤ,"`4W>LF3LvGb˶Hb'y
+@(m.[ٶ`!
+EhZP^
+
+웱څJDfzaKHl_|7^eӤI0=
+3DS
+#rnĺ~%O0hC1*3+`(Gù 1S =0Z]JN}bynD}%wWB7ae
+h]B0l8C
+0Qm+RWHV%Y,$,‚>iw a'X{>qdF  MmY鄎RVzSyD\]܈6获`$h BWUfȘxc7ʆ#/`3!yrEw>߅TM"yȦc*Z
+7DyXa
+t}k\-- wW;? IR|,0/+ QX& ;FԆ|>r*$Vrk+ <K| ,.gR4V5B
+@6_2 "7e{E׹ICn܉W~
+Κl!?9 T[&qC>op& ЗY^ D!}+[n o}J'k$.X-SZgqb_^ ЊLgLJHD,-j\icZ$ #X rd5azVT˅rUB f<P Gsh^WLe)$Ca^ ~<s\PP^
+yxnSZ
+5L #r ,gߔa ěSFApb9 K1iN 5UDr:Np~NYS&n $TeCzs.SUxk(ߑKX2ZU<2 %9Px
+<A~3_uh 2OmGƃ9-!n
+1x\AoJfIP*aau ,`wcEЦ%-'y!(. 4lJn.TD`f%ǘPv l" bh {Y^;[+(&D^AՇ'd 33MIJ >xvN~qE!Kb]`z
+lx i2Đվdva:8CV)% C6i،ll^n*#uCwчxsj˜ au 8V>cE٧Ի=L"/;܍V&i#w20
+m<"IV*Ք9SrOցH
+z
+0.d<]DGf,D|rj yAPϐ-KKBO-z"a H˼ #D.zM:d.y]B8 'Y: (4G Kv>#C*
+nFkdmHٮg4!w:ud(=T;uI]أ"g?-$,'@nx[ ~bK+EΔv
+gЛ ^PPޚWbeUG
+R}
+rH?Y?B5 qwO]|!?x
++hK_(bD4)s D ksVY^|g@=
+QC qP@g
+5),!'}@Tɱ ~ϫ'tVPRR܌i_@Ӏ؂"9࡛&mdj 18dD/B Ԗmv# `6p Vk}=*IՅ)x=SL%Yțt=<)1:")5G|j!P@ ʗM!J!岩5k0rg jyCAD1Qޮ(a*G1;CϏ:~H,WA3: 5z?c]m h66R۬`~)(
+P1do=:[@~u|\i!:r]E;hK
+6[)W1[%ڰ\:|wX]x.`{ mL;s:[f]O"!xQ*܆|@%Pލ#<k
+RP4XƠuuTXZ5*h&-NޙҦwpib
+ m0!+;`! @EŖ\$$k{%Ft.d#ٮ9j**C3\t}RƵ! B$fcmK0H^'k<au P@t3):8>M]btv^U
+qVO=\8@4k׵{QUԽ^|'Rhu cC Iڊژ<-Sy>Үl 
+yPz'*l<d`y~ 5@ph]h»`!a47w]B,2zH_O'0$I0Zx(@SLKu`OddFDˆ)UJ2HcfI7Hj JH
+DW}HB#07̃Da蛴E/A f8o%eQv(Y
+4$\b8
+cح!|BD!2T
+7 ^6$'ixu=س?1/I;H5trr@~ߓ!̮ $ފ bo@ ߅*)= [u4T/Z?g#eq|Hx-Td8+"52U;8]Cד8"C*huh3L% `0Yv.@ %I6P/{n@W%6y6zEcBF4!=w)_".s$L)vn$Ǥ
+dTP(ynZ*6NbT <7Xjvle{(Ex8"\Hm5MYS *BǙ*Qڶ)!\?h;:
+L"wP)kpu!)gS|60BfqeGcf1#yw
+Ƨ9[!DAmhi*OJB#.ϳt>Mh۟!(>'ۆ|3/$In\  t@F,m?'R&d2U"1} %K}X'Js;i
+צv_q;Y'\JQ>$ e.{T3*kG"UJN%yO_y?`$.$|,Ke&/
+} "v' nP#osJU5F3zLxZpdrRpQFX.S̸pO}KI^_/Юׇu6C
+1yLIֱ1 ʈ<r>,5'we#-65:Bg߸ڹ+lq{uUՋ?p+(^3"˦Q{L5
+i|(12zܭ> SuN~j{('| v1l{7>*5yv9v>.#=n™x/cPqĦ0ZY+VQ3L+,l>-u- z N]͐\|?I{ QnX~vwwE%Q^Goal ;c1JܒxJ FKE$ CѨCIw0ăoIYy5Rݹ.%]_pNM$Ee>w6T -%}!JWMRZ}ijnBMs
+35NprćvJ;b~q'XmhXb$=MG6sPP{s Le!&X'{8Ţ"K3\~[+c'G#ãGm%O"/->9q-qu4E F(ڔ7n#*)غ$=^:{}XP]?^ϣevf]Q;! 9@uy<Z=}跑3l+^d*"wlgQ#8.'yb4P2l񰌃l׸^/f39BåT ױaeI`r/50K _y{sƃF׆MlL ڸ
+#%^,2F`ܳQz $t'uV` *LֿQS @Hp~s:gV!]\R
+n[(2YE^|* uYa]E:?&l#Hh.jϑ74379q۬(bBs#`M1*sf|65a
+9>D C2N^H
+ė.%{ʶߛux{p+Ww|&8Td*j+:m0w /E
+Ec/Pz`-A5**Df8\ ^*'&xVՌyH6XTx
+Tw-sqdW(?!V(d n=#?9 G.׈;W<Ѻ#[N"zQMn8y꬜
+n015zg^270޷jw7Ĩrn]5<Yb YmG_Yf"KPFu]ru̶Te1s4gԡ_j#Cq=lV%;a&޳mxe~x*zO9@,k~/:Ѩj5,ȫ+2amsdJO76چE޼i2HK0}5Cv?ymiVt]|7UD4g¹zQdȞmy{L3LHv{/ Q:v 6ԣ`%2i >fB^c+\eHRˈ`(9"'Z`y\^B*YHN #09rqJWpDׂc%bSQ9^uǣkCE1*qwZ.KPOM{8W
+HA$ EOwu$Re`/ x5^yX:mS5$\]sͰmsMˑ3zH
+=Mm0W?H#np7Iٌ8g'CI} Q-"׵ƒ<S&sUR晽*KΝ <sLSέ(jYZID^ß^!ް@v3vMYhUZFgnuG?"ZPVj5Le. Qt]NX]Ҍf!jHյr4u_ųC!Xo@fo-4 9;a0+ P|<sUf~Xh_їK9WFԞj3$Bd\^/*0j-R6thYvR(, G *#լEFܨP5{4 Kؓi ;CJ3+v9/0zW(2&[E彘~L ۣ RAO.=HjXy Ơu7oo@x6?oՠ?g\kШE Wh}*q!9.Ⱦ+,|~ZՎQo΁rףpyl= ajh ixсKbn6StM1D\rG`+=SԎ:RT|8 AUOrDT>|9!EX˖jo YZx@AaئƖ~:}<kݔ2"SY>7_mW b1rSH2Ƴoң| 4>2Zm7 [-,&zg EAL.]e:{(; ZӬ1ݏe}茔w(0%!Oڐ!]n+MY_1?(`I "˜}_;=By2s<Bd9T[ .jeG]B9e
+Ҫ$J]@jLNؙ-,<,﮷TS3aĽafͮiCj Ψe[g#phGmtIusNaem)SԹ1jl^`)z!P]F^7(z3wKvHXa"h-%" o_DNX &zUŀoMVycM[MޯAal^ߟ%soDeУ .I٭ިqHYH>;-X| }EzPw~l?T\xr/"P?.-\>PaadedבCpeT<r(+>@R(jP/3I5gD#"L$I[0W;/})¿1 H:SBɸ+ō!` iulmqgǹ밌Hy t #0k+nYn[ki]*|{f_?_@=RD8JQ\VIP1yI 8+0D5B]HnޚiqE'%?Jx^& ̈Ù|kDJRO%ſ38VJ+,rpvTcdeɜ+ve3A^ғ\^ޘX
+XX$3pb8Ij֥$Vt1=݊AEv:7&gU8HI
+B)%0^(L>fWl,_vTBs8&G
+ J!PʹlBҒ厍aMË3;Qַtu{_-X$ijw &ɞChA'5[~gߗz܍?R?%uf{)h :HLeK筨,@L얻Z7{CVK#q9^PË uLk ?OQ|0>bwR]vX38uY))d
+&ԁ$~C<uFDAj)))AcM 1H7?݊)/Z` R4\,&\Yj!bxǦT4#/_>ix;R; U8+(5g[v >b9?a6N<!h)p~gʉg$WT4nxIVBeLT%vS*0d7 $R0\teƻf/ZsYA)mkP3)gJsjGO=, _w"JspfK( %4V,H)A
+_|\HȐOqѧlkp}9PY/{Ŀ~G7%|@#E,z9o0n@ Ekr3T,YyX5(ΎH}Pxt]LM)bIOD\f9ٕF>yS/S}b SI{:|
+&;M (aâ=[i {8+餰z-֔"@ JtIo|yZZkBq
+Q#z֤ AEA Eq&C`a]FQ T{ st\ ڵ$Sߐ;{5l\N&&D.O#bVhݑ>ިDG[A 90Ymy1 }Z̤Mmw%)A)?RJ$騽KJ6t@igKbJ|*c7ߙ2AQ²M׀>2+Ks$^$,8U
+]NMj[㙶
+{vt1FQ:CZϨ%@AY*ߍv5&fi<o5Լ
+A ٬f'_~ Go͸`h()~[*|&Ҧ~xZIqid1wDtk *GԋPw0YN:
+Pԅ̷puCXQLzCAnes U}1JD^EkѬOr]W }݅YLrFXʒDž
+w18"TfiUGkb-ߞ^È4MZڹM;%+D!eCeP;-Y@c(㸾Í{lz87A 堥iQP@ҖD(2"X:~ESFrMuFemSFZT~AMB;/T,t~Q
+"'$^R%[T;!\]v`1fLlJ5f42 % â koZ =C
+7
+çDѐ[Ǽim){5iLJ'D?rz܏^5{ԶמMq*> Qi3g2|F}*"BJo[1KiEwVwL ,
+3h6/̝gB"Zڶ 8,whuP"f
+Ȍ-0;A6?q[ڎ>>ʼna
+
+)" YP@)l#бt97G t/MnFC? Bd Z~%FR:F3DI_#tV"1,¤g!pD*%^yAXxvv 8^]}EAEgOB7$6zw`Y,Ӈԑā+ҝ Yd萺Vrk8vkr-`ɿ"oTm{|tO7SZǾD ԎaE(A5 YDcs
+?CX5U³*(K^/ [ynNlvgh:,jo9NmW}MCDYoHPn*oB β ;[ w03=¡&46!S&f_'a#/mD\_mJ$ ..Tŏn.c@yYᡊ#WTJXJe>*֟Lk&a3S iHVSԲw$dd{G}3RtXAUX W}.K 򃈓2O~~? DL1SdWb;C>,K@" &kXMf:˜-!'oշQ/a%LFv-mC:"(1;FkwBQZ6L&|7
+x-sۃ,#[)/Jr$ jYȭtm?s2%5@J& XƇ<>E ܵD
+*sMwnco;s3t2<9苇Qt,nn cRP*)|kD5шe4-"Tl&OفlJU WEiȭLl=F4o$AJ[4IZx8jsY&ACMt_>x$-)?c=
+:9RAPbA̡6 J^ˋ`(7yO̮v7`MCn$tۦTcQ6sBgv( <}jΉ]M٫˥U9!Oxn+c|?еȕwʺkߓM)I Ķ$O@W;}Ax3@aeFSD@@ ^翘 vͬ\%o㶊zvڈ20?)wpuy){E6!=abѭ!#IɭGC U.%5]pD!FNEKj4YOy`
+Tz/nn5 V;~s7y FB)at
+ آnT
+զ!
+ַoS]Rb Ta1AKIg@pz&
+
+wx'kmR3њ8.\ܟOϬd"duH1[/L<󇿸^Ci6]aF Y B6'PL Oӂ XX>N/Ԗpڪ"O{c!:\'lj_iU qmOeI B`p k!hM<-үO0 {ڕ$rn02 C~a0it4S7 ,_V4CΈ!(2gyRaϪADTX+Y )M (` A7S@=+pU6`r -iZ:Y5&Gd>ق29\rdMDz@dgrL@?Zd GN堊r$a>"Դ6ŕ*qCʤp$ ]0G guh({kPTK mG8m׷7)SâeU9RݦY -vv.Cɓv}*aldNI~Qas<Yv*"3dP l(Vھ6M 1P[='ՉR6,- C)] ڟ~TiHX`lU/}*˄ÈRVµV
+^lj
+wHv~;zL8Ý%v,!&DP
+.0|~%]V-P@@=kpךDo
+Y!H 2G8$ly jH)HúUD[Tb;X 08oZJ,iEѶ#2Z
+CowЌ9~P䞆YRQUYcڸGc@rQ ٛ 0Lsd^Cl>ⵋr,S$t Pu>E6K
+gkEecCX4:碓c0_ V5X{oԆgvm
+vdi5L
+ƶc(%k>fM=`5Ƞ8k+@sź<މk+E.uLbޝ.!VM
+?䖈L{+,L499{=cԖd!"Ɔ}$MH%Db ӇP>4
+Ńu̢a_dfF]~](=W&
+mAP1Hi4N@% pcbLWv|wta78.Y$i_┬A@
+IJ߄3AB67 Cq T1ǽ@:s(˵(+aہ%<G3O;lԺ9EEb\h 4Q=0}erրMy,qtÿxQެJ{xCilá= ]@mMȅ熖wwDMݦ{Vj"&>bɄQCpp&Ml=:Fm6 CA6@ 9&AƸ3l!I#Ȁ9X0Gհ}t(Gߪb
+rEl *r9=}ѝ~y˰>lPpNAasR `9~
+ęBa"8/IPA` |1BfGy
+ ԨenސtwNwN iѼ
+sxx&5LBkR燺$9W1Y0>Ę}mncޖa:пݰܑ_Ehs=8F;ˁg G"Uߔ=n%7OxnΤW$G^`aÀrꪈ|MnRj9Uq+u}s|׳lw1x NcuD-&/_0C$=F[A1h;(`VUףY1a#ޏ&ʑ.omb=pfR?\gyaG=Ht L,wϱs+6N'XAx5l3-ε䏏Oa#/`tȞE[Xi,ګ_ X)^+hV 54Bes`az~%[TG3_xT(5i(sT=<J R>&HsPI-k8D;D3\ˣ101C_@W0l9X}%!:ZL|0<R&)LPv&%W+j`N:\UKpb:rF 7@l<iRsT Ɵf o9Kmӱǫp")k3:S:KP3PLxl\|vU)Bś4Z_Y<<>xǺQ
+#= z)JUt GI
+N;sr槇sa*̓-I6c>&#@6 `I֐ctt"hV| mBt8znÍ|̙K~s3˹/D}Cli IzK9%9=)tH5 ;QpMQk.d5̙)jgD6\E_Җ&V} 6$VY~]IMj*Rq)zE/y_@6!R46il…UjS jڑĔPpX$j=9zA 9Ӟ1UN#zƧ@z{t]'RLȝ텕`QI eaɠy- i_( :Vcc"HB@~/Fl 80XUKDmᙹ ^ 6@IPLF?{%b xh1=%l߭Kz![z_z>tX.R6п NatMn<6ͯ`AKf
+sOopX&wTs yFMwv3;-0bmgw!xgg:ki^=|3㨆US9{ Dn`)Ќ7&Y 8".4Ȟ` F#Q"BPgKHx \m+į(f'"$KC%6x(!Z7 \Fkj ~/=ƚID <}I{^
+2NbЕX+5V=BG$EVd / fpclC}jHyDXQj[nq*mC{51!F2uC(gE&W&q{Dugup64^809_L|be s4nڈ3DkuEQZiFU!%cXrȶHHuZO:fq`T].ût-yXE||.3b̸ bcޙ5!|3ݟaul `e8RtF$~}45nmLJR Nq,&`g!/QO|7,ҳڸ iT_&pA\vKBGz69-/ZcU
+_ j*U3$>;F;K&9rFH(jp/1p9j3A<4o&Hf/Wy>
+fUMerH0`..>R/bp,JKw
+ /2 9
+kgT倾 LCP1=<3O&? 0S[?E
+\ g?'cH6%rPA}|e,O?RI%Qz7~b\3z?u} >&yeӭKdo6F6)=?u.I>s= }MM[UxH#=}3хT
+4kiLmuS˄hYT,ƺN7=8"9&&$MAi,IQV)*2W@TՊ\g/ V)g8'l%@V~0{Dv엗&[ k_$9[ '; 0ֲo-ФOi!H ÇA{Q0yzp;dq/I0Ť2ቀ@ }1A,᳣A|ve(߾U!QzH%F]
+ek}>UB0V4`f4U/aVVahS1҅X6C &Ym.DB
+7&[LT=.C,0MX}F'U͋ڎ
+24F(pR7 $fK%ԥ~Z݋蝔B)%-b-:R_Ru>wk<V
+X82iQ2 OqƗvN)J`om8%6rxE?hQ 1
+7:ZlInFiC,~%3;"QY+8=,Q
+%Cso:Vgihc}:Ȋpcj#oE eZ="@s)3dXFvqL%E=LOLP0%̪BʈtixOLm)ۗAm-F$iCQ]@sb!y
+*[8Efxi
+'|?ևrAE8JĂg?Ɏ;Uu[peҥd
+6` >9"&?Kvo30+<
+AKD6ǀruk j^T[0_^Bl].m6 ȵBȟM:Ku9W8}Ʒxpi;8^&rTLhW[@".o}NNH/Dot9@^"&*IQ1'b0 .]!R<ͧ&ѕ;|c^
+J(<07D9O6G<#$ мm,*h2^O<欋Z-E(:f-<l
+H@:I
+ 8,9M'e[9I@\tf줅LÊxhl{X S9oeE
+ CrK=SMBJ7SШZ^Y&}99u%'⻗*zU2jKuRKsn5t6%;4rT}Q
+( iut1S-7q2ok" M$u|1xgRUdϣ-j+ !jHA [<@/kgHJsFC|.jd|
+q 0!sĮeKG^d"7]:IsqgΧB#ˍmIլ<Ew 0{$,G24H;ٯ\iPEFFRf`
+Gum ztցᅌLHős
+,HmZ(ә(9D</C1)Hgz]X*Au <xwW+7Z|[G+ tx֭#,G7'ȧ"9d oA8L[ Gf6o"gxl1s73iΧ"}j`2uOoĻY^
+ BOGG31Ҝs+i|Uں
+-Dθ=E X
+ §Lgjv_SiB*2vSnv”
+9=!*ba{O|Ď/:Rh8!G
+HK]DWP{q 3I&9lz { WzJ$#ZTGtQRʩ,\>Jm$ Kq@=R  ~#uŏ5zʭ\[Fԣ
+W/=ȭz*=+5/LMa-GM%HtDm>$g{=B:Z탣kۑ19ܸs総
+^
+_MCKzd
+Eo56@GBTNHΕPEZ|@(3_\q1d*kyoi-tbfLAY4@(7 W2-.^SI|gWDM(eC:2-)~vlsZӪΓY R߱Iq"@)B/Dg~NN˄,N&o[;(RTeIݨ덼B(d1`kxrB ?@p̠'􆱖4Iq0=]IDG  ADAߏNTSNSfw<&ļMc2*s*a*U7 rZxLfYcϭjXES t_L&bhq|8ToHEcQpK+;}V2iJ^G! Fs^ g: J.3AULnyz%Pz&ǾFr~i1t O!D 
+CL˨톖EDij,I$ʠ1G;Ȕ7ERAYs<\Y`QbӴ~a 9g,wW$u u;$kt.yи]# Qv3݉nߌ@q,ry 4Ygc4 Ԇ'PEsm$i([b%,Z4y<QFF52% < d+_H}*^4tz=
+dDC9FôB
+qqm&mP&]j6sf'#u?ӊא6n! ubYp_4)CǴȬH]R-KJ1#!;p^ X~{Qdc->O:q'>3qC(}?u|fhY Y)WEv)j[!R_Ax -]<ð9+
+'$=rv?7AX)E>]<Ic[iPC`(7@/|;/q%M SAm6 CލE1a@1tu)kX
+ÇMA7 Jā|TaGKՖƝidx c>!꤂GR(ɂ TJ|xh ڇޞ.*4v^mfidE7#k*YB9e^k0Kӑ)Hxr*SVʴ'ͯ!H5?3.~=K ;hbGDd1(5QSr/H|~kw82*ImAXdFDɬ9FP0 Hm^1<GH LwݯBFUuVß~s #\W063'>-ӽч+/z5E>L2S>1mNy쁗S#Z=lN)Q&ʽ2՝$# 9c`-S0rT[ @¯#x$S
+"4G|AJ"lhoەJ +|.'@
+l'|Cg}?LaOFMs'4&vaW' 9B4KtT#L~i^E];{P`P0.>WkԕiȓuH4. ER! +/%k24UFE’]qi26k Aj-}֥
+$|QlZd#H'
+KJvVO,Ggdl8
+2nA{v.
+ [z͖eɢI&,6RQ󛚘MuI$1.zEKn|쑂^;%@Ë-)
+w;AM_ht''%Jo9` tܽ,I~ #:XqJrBMi6b/Gn2CΤmݛ
+STf}Ξ8O7Ui"ӓUqyipS)塾4胁(2>`>`
+?I<U OU"GWhmA
+g*]i5Mi1>4Bٹ
+jC{rghS;YN8Ծ%jU}ex/SsQTs{Q
+,q=NrL)8.+qWѧP)b@O{T=C@uR#'ܽAJckқ3GɹJ#cb/(/$RHLfZ E>EQf(riz:qT'd`w)7P<ՇoŨD
+WTTCEcTKؾ\V& Hgс0m~0Hlug6P3_nr_
+u1y}SR,dᛨsA0{crygKOϻA
+4}Q/yGJORAb9}dE!dy˺APu󸳝|)L_[a\Gl;9@=0\XC"uns'cST6o()*F\7pu4 sw'*(k\ۮ%ՐK <K WI/wi9DhK?I\G DO;FZ^ Y b|1 i_(y%#X\JB$yء?%, *~e5,=oz3T
+]aDNQ( by!Y8=]8 !mx EF}
+ZUHP"Ng >9!U( Pe+<fU>Qm\nO& ifHZN!^ė;}^EQ"9m!HY-ܐ,#((9P"Si2?J r ަ1dJ f,*I>H^Eu{rS`{Ʒ
+֌EFy:Ge*񕌺"4VGTpנw OJ0ÛqcaYkatsay6Ĵ5ᄰ{0?x8xaC\в܈P@rV
+eθiU~cȌ7``H(j"dY`&K*ۅ .Ê!<(=\IR9KSTKA8Ң["#Ģ8*Ltry1,}pM3Dz%lPcIOuw#l)u dk"-&Xľ9_dluN㚾IO|Iռ{"@&f2pT]@Ę" k4ZKۯWQmޤI4o~e.)ʧrNDy!'L[>AZk<Ɓ$s=#U!k<Vb"VK HI!xC? gh7zu+0zsYDw"N H= ,)"( KDߌ$!G'b`@g
+'J1 RD} !Cku)ӡr?pWڱ.GOJ}zsPn)ë6 ut\:3)jnZ-E *ܹPѯFLɷ1X$:)x(BƀAtQDqȑa
+
+EgŲigZzt A (/ B
+\
+4OUʶfDmbRs{+hsH>e
+TaaA%H(k{
+ X/c=z_
+Pk,RRxkv 0ۆQ<qI#Sf U.Q\b,D!Vj
+*l9D]lXİyH1î>xR͖,T
+ÑkpNb|>5J׭){`]o"2 z/#!L%rJ!(Pw,C^5J [s4Niಘ1a{;9/_7\
+shA,p~
+uҴAr>~
+c Sua:$wq\r` hGl zn2OOF/30 /Zb"3l2!ss0`ERt’^w *-)fmU&3A8 &qیˤ 7xѲ].-MEe2] O-?A@(5=ss9CYW3bk`ٳq- Kkb"'7sLju#
+ufz:,z͈0gp fmr-ĩpB֤0K^>ܚ!m,E8Z8GCp\ӊ -̱Cc1
+ C魙wcG|^D M
+*WFbȬ~l@p7ZcH} ?:Q{Ceo.Eкl
+BEt' 4oxjW:5[vO|;]Fj%nz^Ǐ&'A%\G ;!-/8sAtQyB0l
+_(iat@>$&a6s-P33.*phﯞJs{=}
+.W*!
+7nEH1aĕ{
+!*5s˞3A!_=
+C) FXg ӎaKb;wD@w+1 -PlUآX oP𦶐 -`T
+βLpVnqtZa$^<vq3S$GxHZ~GT /.=Cr  Jd`śo \~a+Ԥز%R@Hp6b)Haɩ_ vϫ'tV=o&_=h[Pd9'<t@3$Z=,VSZ@8$FA&
+^cҸW %'i;0 @ Bx7oD 0C@Pfא:xb(]VsOiZ |$ZQ^Tuл+{(3
+DҼ8bLy&Э9.$&Ю^UH޷r sj2lR'|9]BnW!3xFD5Չp4gd,"AS1\ˌ{/
+hByQLь `r%O%$8JDF#qB l0,
+G3\Ehikg\JyE9
+@m A+{T!
+-H6+Dk{%Ft.h#ٮƆ9
+uPT
+DUD mTs?wjD-r fcmIHa8sRS/it5(Bx3)!:v( >M]d(wv^U0
+쪥B. Pm?v`3<:f-iEyNCܳ" % bks%SO* ڽx*^ZdN
+Gv|{Ъ
+ZL*/IQO%LѢCbZ7t!|''q5= %Z6^X)I *1B 96&BVCt`? 5>0$ĸ H"Yu[̯[ EdFA d(oJ@Td\ùE[A@M~{Х~=Cn H4/`"C@K@<4AbMAHfQFNx܀k/V~:K7a^D:BjP$.r&ߴeÏqsKY=:!L5*pnAlF&'i xu=۳Ș$CH$~#ƣ$ \/!ɐJfWd |$ЪC'zgjRhE4 ]!rZµSYE@\)c_5x= nAxHy ͒:y  ` 3YvWYD@%I2P/" ]\ =ajAl5f $il+k7Pm
+DF`6lO$!5<:R#e3{ A"G\p' ޑ(k$0+P3U-SpQ~֥h+;D.@^&B(Ȋ5e`$JޤXsP$>f-e#i5p)-(0
+
+錢- XH~K#rfj+]2XA/~N~;_טK.K3uԟƼzOb.Rf"]L~tW| Z#/"'PlqUj26Ä
+t3~ !_
+LNDtVkeX:
+u!wO"^a%0g6FJ/%a+3\-QZļ1Sh鞝KQU&.qۃ.I!'%=.L;WM
+LZ\ZZbhoE:iS<Q^_I * OYH^BU犉r3`E [O?L͝#/Jp4$E稒
+!娕'١/G$NAQzMZNNs?6\3u_< W^%ҝm9-vh=2vAgLt"""zBů?aUC`EҶ; M'+`=!|'\0O „2ޙ(^$i:SBBtXܑ@H@Et|"D*'8H.eD ʇ]QK&u!`] Yh+ҳQETQ'bmԴbn<9챈cS3|$Qjas0Mx#*͐M*ƴg`^}ƻiKr?$
+z<cDb8PAdZX\%/'Aʽª8up j:qu
+`Q7(,qT@u;Igp(H?OV矈Ued 6f
+Wq:P=n!X,fF[^*M(wmQp-YYE
+LxY g
+ ټ'3${M+{JߑL3
+z,.>39J+6'@vìeoI scċ8.|DI+]/3"W
+Pc-Am"F oYS[[ %cu]lpiBm/UKĎ枧S 2ƈP9}&Q< S"f:a _G<4V@ SSH[ c(bV<37&)-?*0
+8
+P2#<C|>2,)S5WvOn㺛ccSqa>Td%L"'N BpTdjK`yLSZ< Ӑ)cP>Db;XA{D pC\Jj$z;WK=A`]<ūP&ūۡ6(4势PPt dy PI7Ɏh^xȅMAp.+M}Ĉ\(䕘Jxa\K8G
+^qT,\j{Q$aU9r1ţΣT.!ۛJ2xF}4[>6Ɠ9l#OL~;FFd gQ~:R\fxêgR@DHYaAF&l)ꔱ7S};J"5#ġڡ_ yx>vRik`-y830j\09Ln9"1u<"TH51XBjN]\.JvD۬@oЖ2K9èae{E02D0BKupA8l+oVm1ď"Bsjΐ<Ap G2!mFB$[B0in,6-"4 5yN$%KU Sht\.$_g ^Z az'Jgl~H*pL<_]-}|BpU}3P&ZE*+NI%\ P
+CiU[IT0cԫjo_#}"xl 'e ~??!]s71pF"?R H{)2ƁWd5IoL\1}{2v3F: ŠR}5qSEJyJh]9eHধ -DxӠ2P=tlk}{ 7CӠ'yNzwBEq/ylO,a9A
+!wT5e%jrzx.P􍡎ŤN(:1(ܞtm}nEǢPBdV^zR5"2eT7!NSm6PLN|g*5BЋq\BBĮC8Wtتa$x ξ' 3}VPB7A3Z ~\=Mjh8.ŠŠfw"3ٿP:ƅp<Rm2p!DewH"d@; 4ho`Dsͭ*RSMPDzҰm
+pEh_]0EQyYL=}'mjzS7=hMHQ
+jEo2 ~v=DɊj\CӦcD駥*em
+ :Gt[?TęvF m9B,Y@ 6LYR5a0KäfVTT"- t5G
+5Ub^[U3e
+crAHk,Cm݈*Iv7љ$ E.ݡ(JĔX1p .:?] /ݵVJ{-FА*#Ac_ VrT]G_ R' I.[y (Cr?
++ȕՓYgf!Ȇl(2n^`"+Q'fN&ڬKQdC@o* {T|+f:f&%8VVMIn[moBTDʖy1LJ { !M5܄'щ
+`z0}m-: H6C#R@javpm%׬AP)|xCuȹ${\C3!s:䟄N>X`eJԾr,7 BRBFINq $|u[6 iAR#ر Hq{_Q&^¢e4ϫPG4"w ,<5+m ?L +€ﰠh[zW.N@495Ղz1w_s=,FqΓVJĸf(V*JW6ކ
+AR͙<辛z
+),0J30Mg| ytQCLKS-un)'dgC:CP|\Zu>zə践$81wCPgIn=4l:ify$[IGM/A?^sR2f[8u;S-3,
+SI~tz#
+h=:<}A)07AL`A @: e1i }8€
+¨GC48L$Bon#ĄOF\C!n
+_Weǂ})2C1-/RNrN]{
+R_ xb>N0e#d*ΌNVm+hc#<BɶS]:5FzjuBgN8n[%x S-U&%RK +B()V1z.Y:m=\ֲT#oY͡:V#"ir76iU9
+ɤ(''iX3v0^HD
+hBFTd
+MRQ;6|V\?*#I?L|;3pMO$ Mpc(e" Яe+tm^AH*bzp%DѨ dJiftbv=gyųyFF40YZ0vJU,d0 M,6@Ch&_aCZDӲaq1x.gnXGހUYu +UbS_̚ \F4<J6$:m~avY ͈Pjb!zq;bEjJ 5}HM p'y;TÀ^!VrV !8l;F$wExEased c5~v/R=GŅxx5COq, DObꣁ6 qPxUf*lHQVST#B!pش~R,&H [[[Xh.6}C2s<@W9߿ެ9QibNoJD}y'a{2YBq&zM-xTAsjQQ0 x}hA(zxeK]t}6iW@P}&iըr$vβiF|م
+(q]gCCeB[<x܇'7ej;a~'tJR؉oj|4 $H\V E2 "5 ?+Tn
+p+1*s&,&ڣ $RHH
+5J, ?#M2ӆ#y_3tq/De!V*nrLuQ}s4qa]22jS; 5@}$kfz[ n xV04( N׆18*qa رwHۮ- 70
+c\qa
+mKȨ
+r ,gP]gi[5b
+cR7 @*cqȔP4ٌUy$Z} 8Nq&Tm?4)ycOy
+528/
+
+v3=hJ?b"`Eb!̃[08GEuf@fK\K} ]#am<e
+a"h:S)}G'@kW
+IAeIS2MW响ުw=9Yvf c,2qoF`2ËVSyH~N7JE#ЂHʯK>N>8l4sbhH4UkZJbOt@GaJ+[IA’ -֛F:
+;/?6q;vox{~z0=1Y>3-hS>ɽ^е|c䬠t 4
+s/l,Dބ+`^0B%ɦ|ٌ!R
+@tf9P0 DS |>Td&sՋ.H/'-4M& 9E!Sv_đi.yEATLgR
+ʔ!zWCICD#q7G;Ny޸:)8T3͠23yipHb'_Ji٧8,H{u2dIҸ*c.x(p~A\^{%Cs)eM:W3c"9+3´#A|ItN%/'q\
+HKcDW{ <L~rz<*N.
+(@[EDYO%>9e4̬j|scXuQ^{/S#L5jc5p/W:gZzZ}Cneدܽb2yNanul6hx}cF@zpYc4N^ӏjjȊsƹ)H;7&Fs$yw !ٍ lWPy݆xF+8 rGr3|@Ս6hU52 >rZiNU beNo-qEYVz'oO9Ku$ڋ7o1F21ccm/Z;
+=Fn?1|dVM/P̓ v
+sBʴN.I<0k2d#@9' |`';ڠ3+
+22V=h&W1{ڭ0$z[nmcjN
+i^qHy NZP,Dc(j/S"JdJIF[{8Fk;jX d_eP Xtԛs4ؔ$ׯ\,<m7u C}i\/EI+f'4 J6u37cxBlчuC
+v~B )SZM7n~EDNJ=[+0Ѓt]&2\2/yge<fb"$Թ9Z{mUCP>&+5,؜0>lJ;Y-Yn排wQO _m;5QN˙E?(8C*HBmϏ8TZN5\,Bj(<=u tNb,niaL􇟯c
+Z3̦*!޷6|y"ւ̏cF*%ȉAIxtsYQXDPbـ/:dR;I`D'A=aHY7R'r3_ϡj_fk˂Ic֮kr͚$}G>sՁ9ɠՂ/v3㦆έI F~ZB{"r'9 c~ΟpU!XCZy13LN=
+sΐ69۬C/-
+_xh(qsX۶X4 m@Bwc1<9Ԡk[<+sHH2껆mB^ HVyrxE@+XfHJbnTBWKH˄ɂ@ sX%
+G;3!2=:2+HƹFG
+>eY)]Kڐ~օ|h01/]4jI׺i@|vo9y #]EGPA@byc F՗r1  F @pBjggJI!¤:&,:%K.H@Rs)|TNr}O6sC9xA㣛1@ BC}X0Ɇ(7ڬR0n^ I;±M|K⵨v+u@Lk8OV;,ќ*pxMRoxDZ
+7uO_vWĥ}k?n{\etʵr%SIdTӮ-n7<l3XCjaP9s$l@>$p8**Ϝ fNQkZMUoC6>o@$i<\U4S>e ]4A0齦IS1};WSp~PCoI rtC4 ${R1п$%ۤuo@޵iș >%4Y?BJ
+Á+?>B^ᩱ29
+u7 *E3^H7]Al92
+6 +[UCafRySZOow^2΄kh N<xshU<ں9DT 2ۜ*8@d#+!iJK%(\m7H`YN~lыgsJ8%2^iR%<`5HԴFэw~h,HP"AvT0^0K,D }JOS$ws&uK 㫇"zXXiv4-n~3NEYM of9m'd|~C֭30 I"h!K~ӊȠqaЊ~f u3JTuT)bn@Ef|pܷl#9TdW I%)-V„zߡPq=tJM
+Zߴ,PK֎P~z^3w:c"gs~_&L !$<X~S].#s^ [%`R?aw0o>`aܓ5<^%FA؃l2-5>UA B+Ryha8ĔI5(
+L3U
+x<Q:8dE1%Yb(uн}K-|>{Ry?XG__?oE^==% Df;e˄KV?+t[.!>*Qd%i $b" +)%JM3qa&%㰖=bz>zI2_yC^9?#mD i 5.uk߈Q}GFJ:Fp *m qǯ
+ GMtbF%E,dXZ$EY#X̟/.1
+m \2/ ,'2"@<c KI |:}?KUa1B`ó'?67?B
+QGyx6X\פme^qckf4pi!'e'qjMm :!8R%t5L sVb Pqv ,Y go7 ʭh Įa#oe,thEgxk!_=FU:QgXJ"J NRr
+;D6
+sgBW\W%Ie =.EV¤]s
+в?]!d(am %Nۙ]mq!`]ۉ(&(Sw"eNE${)8VuSHd[X\s&
+s*8</k}~6q~HX5h=uo9cA0K"8op(
+Ad.MP ۅTf"fMʬ3jƝ+7C?iu #k`09Q{Ub9v/j \߷hI=^e_^*4y}FijLX6r+Q 1fVoV%FX VgޭM[ iO7>G;J\oɍfc]JԋސSʻs1#Pn|H,`Һ&ͰQVv"ȿZh NoQ Lޞ^lj
+s
+SmOOé1/xSeL\#щq0vī) R$ (ƀ^Bb)d[$RaԽѩ+h6/707hr
+^q$,/{U oNB#*ڍ3@ eb˴ ͗y&81e墟t{iz߮VT(-98U5*4<Fgy}KY׊ @p4Bgz~Y=G%kqkz`Jw'YɨǷ B݁;<uz(54_Y}
+k@A`םߨwk?]
+SՇQd Ed0mK/]Dǰ^ϓr„Ħ/+v3@e <+%Gt>gS,=/*U͙@Ć/Ї+ ^㇑d5[)+^n$Ǔ9@PPBIu@dv#8f!ijׄ<@NB CBY2|)ΐCƹRPfg!ؓg#`6!O,t1)ew>U
+PB5 dύMWT5 ʤIy⢀R%]p8yG(NHHf
+v@pwIi΄\: :( P8e;-}uBbKy+u?S:&QОZFu h:
+vS͹)YN!=1YLC(,V;|
+DZN׊r|r.V\GG R!\&WV5
+ l'ӥرv*Fٱ7;_vUM/o0Ixxw& :߶xܚ 97j(C% K-KP EHoOG 5I4=z,gu2Sġ1PL֭)V! *ޙzQq)-|!z$0RIqH BKxf|T$ zOӄyeh1PyTwBa{O8X槡ǩx=@XRT N^wʦa]>Sn Ȭ& B O7\ ~lRgsJdd^C'\h9f|87tW|CUсdnOU@އb#xG1MQ?pC"%bC\hunPJY@nn; $.e@S5&<}`90<iA/}}` Djt)DwHՒӁe؃ ېP7"tv^$$T_b~XoL9*ŻH(#zz8"3epW.Y!uyp jSf*>d!(Q^6F>,34vNNZ?BW|!>2322B{Iװ -cRq%ۂDw@Qr[amOf8&=ⅇv!
+ 8&L4E @ TLK'*rHtdA)Hf&vL 2 ʗYc=rAhQ WHhx]]}^ӧ[Sט49bX %OC5^R(W#s /ϯsҖ\"Q*%[x U!aA1I81Rn]f2ξ
+rSٙYL܄%tA$٧^{Xb,_| +6vEDx;!`ZQd&x6E#|C&3hbP
+t`~TYB?XL!{A96
+Nd5F@f )7 'ҌT;0EE~5LE0Cr6) 4:8]͖*.%î)/ЪEm\Mۙr)a.߄ңNd/! ]R
+-S^;@+Aa're ҵIFl? q]Ko+J\$OJqVrXt\1mgJdp2恥\Pt: Ax"OHa(koLF=4fl
+"V1Pܧ; 3QW|+U 8ո jr$8=9-!6YSqزێ/LSZpS8k
+_?憁`cu, h(edžbYiANpsig0ڃQ쳜QG0Cqz1h9WXofyoEZCiW
+ +L΁9)*IcM7`dzQWϔX MxDVւK<D,A\Pi#.Hc(P/fHϖAzK%QiBT&ʧS w"1h*V Z
+Z\4 ۻ:k8z_ 4QJg:bY4
+5( C;FntHSUVk1R]3V4FiH?2kqk czAz9+"xrge2특 ChI2Zn>pFnA: u4Wsa0=q" /)fgƄnk`oi @4 <\iPd M(B+Z܌|C[)O@ZJ1nNBΤ }B; mYDW'@@C9CjPmFDq`L2OEnHfP:lk)$tLvx ^`Q/XZ,;s Z A/\@,~:Ջr6WD3yNvk\~7! U!1 JsY8rsW"W3nEJļ[+.% 
+MGߧkm}8}߀2aa=;HR!ᛇAZm[VQǂ"kǵAV=**rb1]]]5'gla2{wkî:+ݲ[aЩ71i`WF|X}++op?W2_V>pοğ9 ӔtoCkfWF'ܽ
+w-wDZQRȨƁ@`w?\>IGbp哮 )_ԍr ?>wlg|0xGB3J\1,-߲)X1DPeW\:ABDj1pէ"0$0H$1Y&d˸Y_bZs)ޜ0%PjJ?f޽^ѻ J,܇rᔂr\h_v~/ (
+ۯ^i>QGݓWƹJhAO#x8ӯ KY.S}Ӥiuƀo@(ϑ nj_]PqʂL-ɨ3DѨH"LtiVl[Xe ̷x$G@u kͲnQ[`"]jkn+A pGƸ/0aY?ܖaCӠPM´
+~ RKNy8ו=A:n rtqYe5@Z<]4o-9!H {bOCw %Z
+>+bP?]Dd4@DC$z2̦)s^`"|[כ"cwFc>`8-zT nґHK1H]Kx%@.!nT-۞@c!
+yb{H?P\ըH%>
+F-Z6EG\$n=9! g9^Dɻ7e?1oTUr,|-[*UV"z=K
+U:̈`XZ0N(%zFz9!6I,Pivr>O4 p:4ΥzH9'*k Q̣#RZȺs ѫE!AF叺Т,:c \Crx \:[}WUKB! q2Swr[7K`EV3<X)BukGvƮ &*&\\#78.9]KU0m7%Wɿ\HY12y [
+7 kJ筭Ӑ2]C"t$ɣV sc@*)l<',ԋ+f1fپs
+$#%^aN_)2+#]RYҲMKӡS5f!c<\ZA(}<O1/Qࣈst %e篨D6 ޖʛh!7C{qn߰ve}qYRR8t
+yȏ&:}e0
+@/*l+|JoNvliɒ$BĚ!
+cmJF
+,/{c|& )~DY8ԭAqxp7{}+ v<F8h4'Se1WE |V2Ds2VREG-/!rShRj0Lk]w7@t9l=[cEш}o 8,3IV:]9g 1u;Evp]90>bO1sxI\< ;ϭA-~>a
+8ɒL:(i(=u| kЊW'!v <Bt7%S ν@}۹gh
+)<jzh6*גQVC! s΋b/=G<Ma/Gp%o+.r9,|
+" <%4/V5/Amdv6{$ $ =s34.Eȋ`o^"
+n$"]BKd1.QDNP f6t˶ذ=OGY\zˇa8{'Hf?`a3Lo(T1?{ i)qKr g?av΁g8h3.jU%}k@~= fcoٯ
++#l"ݏƔNa!Tv"oI NaϢ%}][  "n 
+ʉ}MPX|%r2]3!<5a~xmb9hLKGq/p
+Ғ*Du(N6ˠ^٠8k聤$)W:nT墠A*LDhTl}\fB "%b*Zc#ByܛPc=>y5԰]}{uFrZ gÐT
+('kBJ+?'Nq ~Frg["P5J-ZɌ]{;1N{ ;lFiq
+]Bܧ\H9%'iRH+=?6}L]AUDq& Jmw^>%`zomx@Om7BlZG{wnL[bż}8# UGfPßǮAڥXL qR0>1eo^AG'UO9E%;b n #~i, o,XZgXh \a a
+7|e
+a=`2T
+o2,tOVRpwlRQۯ^35VNsaFEh+YWsFehHjJxp UA
+r
+2YK&lf'0lҺtis?zoqD Fr2RNHcиoD:cT72FɰP$LR
+ nMJEdss]]>HhkşGaCQ82
+o<%3@O3<7J_XAЕ^" Ijhx_"'C 82J~։N87]O^j% 6NQvhЀ3p :[ 47d/ ,)^
+8]J)H|C^-z6oșvƖR@s/X_'b088@QnSn2yr|V\u' ~ǘv_#[5`ND *FwM^Ǩ'J8*oMokɏcW1|NK1lSR]N.iEkDeM`)xʥP߫]tfŸ
+ꛟjօB؟ԳNfĥD͕L$n kV bvj):<e@Rj6-,2p~|v4M!|SSbC ))Za3W- Bda?~xA!}SH3&^B6ƪœs H\_< xc{ ,!>;$H
+rL'df.I equv{!̌+1\t
+Jk.eZI85zL)(B,v+rQ3
+XK5
+õJԪM[shfnTX8,d],ʺ0+ȥw2:l\s@bFI$l!
+\]v'M 3V?AE&hB֢تmGTCr:2_.mVN2 $Z0HҼ`b&F΁g1L[#'/jn5sh.LYd/$8MCգ(!ate*чݣE4~TB ƴL;aHEڗ|PD BLQ*V V{߇ӈj\P*(p̧[ q(sG~6yk}"6+
+`
+hi&ԓX<&մ*"#y/a
+tE-h=5AZKmƛZ^p{󦣁I قH1@VlW rOxR\,J]Rvvv7Z2~@aI?mZQ;E)Q}Y?ؿ
+CADE-\rIƋec-`, X ke| lHxeԩ1DGcNuϿ O
+ n]eBL T6Y;듉-Ȭ潗 Wl[ÎqU8~MyZY[v ĆWEy7 0W6RVeeav.)XsKoA<z@,<hLFI2H.V~V)-NSM:b"8f9Bq O7;MkXju?^f@OQXZpf<-#UĐ En Rab_ش5R
+QfBA Ly /TF
+ #)_9VI "{e=Rți= vG%3qwrݠ]|A=Zy+@I$Aoh5L䐶({Sit֙{l謽BY#W-$n K|B86n:5tNownu^SC|9ipZ^eX:J81~ҕ t& Iqt YLdK3XD<m =sl/PMA.}).mK;}ӂ:r8A\)
+ Zj>ShW\^+;RHmg2
+Brs40`{@a[ 4(/КX
+rS=Uw)`+ CO<Qtȫ]:]K%E"]B8nHK1v/&/
+rPAP 4{{L)&|l0='+shY[9m{<Ρc~rp/H 5,P}L(82gM>|.y
+ =x6 @F%yC'N`qj@زYU{ 4wI.q*<6Ewx )Cc1͚Ǝy /pWܡa3 0q9*M}z %fCb<@Z)tv݊J*NhLj숢AhW.aǏ<a/"~y@ +vD;#v*Vi-ؑ+wŋ(<fA}v[9x( 9e|< x(1kŻǯ앐V`E'FXSo<wp~#ռGEXǸh#flƿ"Ux]cv{iOe_D`1<tiz H юo~Bn92,4 =.2BPjݡ:Cg(Um>I|?lT>t6m['J+?5ܐLYGE9IKũ+7d f'$=KF\s0!7JqxD@{* z82Fl$3 + ω  Z#
+zC65h
+G`
+HAc DOw XA {}[$Sq"A H/賎1M˛=<-r>$ mԴ^z6Aƣj[ >r:=s _uV:Gśs̆
+O4uUрGf1˴1|CF)ќY}0k] Q{q GF#F&)x1DjUϠ9mF#~W[<{ HcKt2BF܀?z+$[h QJ#DimCZkPhY#$ ͺ)b;bs *6[_jШj=j1S2>~8u7VH>K%݀>ȝ4{1j[o@ry.#M#\OFTn1WUm>»)ڹɉ%o gGNmHPW||;Ms3Vξ jQw(@B_lHF{=~۸^Tyhr>
+݈֩ j+<}^s*}B=/X tsc>ԋJ}RDul.Ch$fi6^ p։-] \`A!=&- .
+B1hȭ8=acԯ)),>6`RS'at42x A;_Zbzr֥IAHT!6755 3f m|Z-ۛsFssZy8ud3ljFE!.:(fuC+MAbK ):Fq3,6 )y}mkt'J5 ;(䧚Lv\f{p3ն@?7֣7<Cը\%+5Sʵu?٣{^FB]=jiSoҁromo(@1榖C=AZ%n9 HRzŵqhdTi~)/ZlQR$w.Z aǰu0W1zшo2+呛De[(A!2KW 6ue?Gz˼Lk 6$0P"pZg40ű{ۉԖ^t ox4}cxo5  &q1qjߔĭVY|_I2MakzZL̮ak8tmU>Ƙ!OCH{1$Sv@tUcRi9YnY B5/$- ~!*d!*eL7iP viLBO Z-jzCC9<W=¶sx!h:jrHB|[SvhZj8o7t B>a#%,JK]ZX.@i,^2^y\T>ES[!×NΡ3rϘAD\0C;)7|/L6D2rVc1Eu3lzT1FO7n`ӆmעZW"g<m+b_q(J-H^\-Fy0SGuU}`au^D-d?Ϻjv |2UԆ%l,i'r ^^{3?юJ\S;H4N:Lw"!ί AΉ$Q5ڧ`a1~-q7 ħZQ|af+υ
+3u?qNAw +8kkZ$e9РJ"L2ԍrq+@bU;;+KJ<mbR #Ns؆7hC0vƗv4D~ A"4.(0ĥ؝L/Be`FavE4G;>~CEkI"cS~MMdEur<Y` ߮k<߀!EW`wAF>EA^0ИxԌWjœiaap[
+c U APOm`d~
+34Ž05 ˍWPy]ˆ]Q`G ^0rTcs5צ;F1M1m
+&#sT# 7!7|ѵȟi18_+Uvi$3U0@EFt^A_q=FbPe]Pcɴ
+fhUv!vqs TSz ] {O;WNU U!WR)) "Dcl%OM"-Zh".+ K9?9vGO}1ɥWm
+/:|IA*ݐ/ MqSk2&V
+C eƵ':6R: rC*/zYԘ[$V/c؏b* &icl
+09k"w~Yf:>s̪x2)Dz{
+`vӇg.+Djj:ujIۋߦl#5<+/
+-#: "-igOf
+^zS1m)3fHc
+98eo1V?#lvٙ4Ɋ1$
+0 Pn*5~)Q)4S» ⦯Ym 6l[>윆
+tOx$:WuQe^n3T+.<!js).9p5/&~@,P/<kL0IdX,v}[W.\"̧N?&;[(`/4 E0[.tY&s7[l|H8zsn?±Lt_ CIf4KSLk*bКRH%"xGIM{'*,Z3ڔw7CHE>I). \s^tNo(!9\E8%pB55Xxó#4IZ.5f<ci 7G Â^u_lɖ~ɻ#GVYtX*XB@6.,oJKN$\Ssti~c<':QӠYw7"@+IOJeU 6sͶ.G$>|޿(\.J}X=SSxV]
+s</oR *۽|#Kr<q`:c`93S!v u->m@TU/|lP\6 >kyt2UIי\F]urĿKLa{rrѴ,f6+s_JTH. uV)gef̸JHRR̎g$.62Xb(O$#2f"?qa4ő>=
+NK l2*lc=kI@']
+p!TE2,ǽ+Q&~"8sm*H3):fT a)%v/
+oL
+-jY%("
+z I pD:RU?#cXũvTˬy"LO'vHeP) Χ~+I[ P #Ʀ^TƬ}R_gG)K=y7ƚ-7 Bo]I(WbO$6z[1"Z]cEJtM\W4hq+PjHz*[Kҳx26q{+ A4Y$a7­wՐ$O^
+CwT@IY
+L,VBV!4m+x4QyMR ve0; n=n=ʅbWla 2(/ !dDui ?*ft\f963e~/A7Jstm[,ggj90I"*(欕<[3t %PRbΧ~P\ahr^5%8~lQ[Pd%ڒI`KM4$b
+u}x-ݵE* 0ICm˱}Xk 4v +W0vܣSU.VRI+#v0)~QBͤ ҭI=?՟XW^lVzsUמCQ-R%<N/߁R՞ם %)Z0P>ѳb^;=9"5s\F .&4ԯ@VAL29)8E]qbvJ59x7D\aIsrٚdXMjNLUv8ȣ!;6z$8<&j`0}u:W$zy0ϔޟպcq`=܋xCg_VSƭ"|AEѷ4<׌
+0iBI&6f
+׋BWN5,yڸ)#DjrdIEaEuG2I.K0kr4F_9#'`Ә}1IW'`"`zYݍ /Q0KuVf dJ6>Tѐr $@,i@ԈD os!ӕ:tl,{f1#tS{ۃh2$mHfB8Ma,B""|2_ng2hT"_L}@ЭڬWs<adֵ?jG=<d(:7ѥJ$:PP Qdf>BRM]#hcB{ ha$fHA2鳅TlN\8tM 2#(UlB"_ *$nJ;J2AcIB,@
+W9A>M2yx0
+ RE.jAF\8dwv} FJ$JrW٣[qb;u)рAĥZx}/WH$<`2T1x[Ox=O h<)H4å 9-cj pb"&O~U2PV?]3 a('~Vn"|pBTTX2DƇ"ÙHAdeAy=8(~#I 5Dn#QҬ@'VR )eo7"IO>X[元.됪5 Q |ߴ
+&A =Hȱ>u6=VJRvO5iZ==Y)klt_F$A EZJR81 e(se*RhQ΋$Nl'З u!1
+=HZˤ hr ðXt5R}kŻxOؙ@V9gjq]AWVGNA>YҬBcNBaZG*۹XQcol4&b"dIrt^u¢v;+J\e[>;1 `K{,t(ԫH"p׋ O+LLxEK}PTg
+= YR1n|!e¤Πv)$%ѹեSn Z OW4<
+ AW ^\Zmq@W@` ˭T"ɝu.ƣR?KS fazGSU?r~&fBˢ /<65~x:? g+3i ?ژ⒆7'NObqQ !DS\v6JT < R(fkH
+z{v*K+? )1c8(11a,~x RD
+J) I(|i3#<BeD゠gM#؁P
+Dӑx|ĴZqZvʒ8 @ lAhY}LXDGA)=:9J7AJtL^JheՑ=L$/3M{*NuOtĝLGVqlO<.'諞PM[I. {h93o׹i8PP|S-d\$dRZmf i iR"^HOIv?"Pm|_i=ŨQcɔzDlHĔ.Uzk(P|&"PPxZA+d# ɸ֠:ѐR[S*E204P]o
+Da;\]8dr ?χ@&f8F$TތGJ<`Uy[\8J{J&#411vQ)
+|?wfa)uK^)aT՘4H֬4 ;mUA ]F.Πxʗ! vRq ToIV-uM#ОTds`Хx:F]HMp<+o/Sh>%Ȼ8y8#N
+V$ o7ym$N0 MEɘ687IC9ZR8sN]28B ScQn렔N;㔸)
+d[7? FI$=1k&AGBW?/Ly[v,8։$C8ah>ʢgHhjj6[#-J
+ٝ~} dq,ˆ>A5w8H\4QnRx&Nb0j6"*=hg93 D,Z|V@N&xJ NaLkupMDCLo.HN&B{zdERPNvkWG`}ڷĭrjݑ)*v䠜 ]iaAPIpvX?eIDguܪt5D
+*} σd,
+i1ҩɘ"ps1<y>2B |0h=xDoԓ)J'A|&cԘK(uӑRX-X:-
+wDvex%EY"_X ̎e<4>l,R(SkR`@h.PEU2ߤԺjwֲ6Z]7j!6/|R`#SI@<d4)Д@Bvrx|dzOPZ|!Dծیy, ̺߽ tL?_>#~NQXYϽ^cf,qt5wv醼7W9ekX(bA@ݚQqR:)V!$ܦS X0(-nĤ"a0}l܉L!•JPݩ=
+Cu}7Y7`|1g\W mO|>`HC\|*הE:a-& shIO
+uX_"ͣIptH$1Sv];clvLh^ ^[Mj,TM!1$cf 9bsͶC"dV
+lG𜮸bg:WLY=@q 98MGmIރx L@`Pb@T PPeҹ64֣L3PCG!Dֽ_TFU
+iN?o#x<dzPQq]BҪA~ҫoExWIJF&IzG'9ES8_= $ZƜ\܏[9ȷT7r=\pk,J.d.m,
+A 2 ⓑ^
+Ԯ`ViWD)뚧@}i6AU ˷ mO
+b7)t'cXԺhRWD}KFkW (jDJM=pQHxQ (32<*?%IJ̪GQ) Mi;ɕT^ةfvD-.2>-߉, F̓$OJlNn'3q|EyEZ0;t},Ffʄbu(QӤgެdԦ>5:vXNY.˒KtxvmyX(ŀЗ\x%|9<
+ԤZT>u6'Dߢ;I+HdW]
+R"⥾O*vWQZ`/-+;TIQwܲ R#U7%S[7fkD'}Y[Qb)5L5Q F`1JY|9JqJί6J >~n`:0RZ~~^Mcqn
+4+ū!fnf
+J E.xX„
+e$@ŋXU цY5I[At)$лvUs[ͬA
+$ɛEF om!^OlfZ^2İ ׊S]=]y@A*5wT\wMjlu4cDı@s|_pFKd{Rl\FQwВ "xvZcy|TUأTXQũb)tNs dƱS
+Ǘz@h dTa@U˳a >
+JyEK~yh.꣡z&ۗδqz|0}aJ4v04NZ:0b}~0BbdÚh#w/DFXN#/I\ 5
+T$7ŅPԊ\k$ ll .V@4 bI$ 1
+lsm$sǩP4?cuQ8W}-$J6_roz}-\6K;*1-@]p>J
+Q>YpJpQ;G@Q:Pa7vgq@R}h˸Ύ)Y#B$urJvn!,FO&k3s.b3F8)wE*991Oإe$HCZzZ A*kITKK_]!M` '<F
+݅~I-VEKqEFQ/~ d0B!* tIK0z"fLF9o'6
+Lbc]"70
+)Lڣzn|Dg@5%Z|lmQH8;:2A
+Dˀ`Б$*~&gWYXLJϨolEr|JaJHyz1@ɪ#>
+@\bŏh3Ucl -XD,쵙qN~l (<鵙6nJ"$p#[(/an޷\&%d=-ax#GvPtì`RSK]R7,G~$gNAo+Ĭ4U4drdk `F\τm6?`M+¢'⌲aċ|.?PicA [zF"?*@[)o02 |g()#anE!I: 9[Yպ)]Nϊ912e Qfz[~܊ږ2S/oa! UWͯa9 kK{W
+S IGE@ ޜo .fČ eCҌ%5pߍ.%82邊Ǫ7&h1D>[za(PX6bFhD<~3i1T~ IV6T`,)}0D꼚vV[%ОCJ&z}h"ґV=$C5/a8+$`. ZK'pP
+@QA{3JI#VfԀH r ^`.u䛎QU<#jVw"+ji!kKW8`~Ke^a'>
+BJ(jռ|e06$a.)l8䗱IFb8VZ1#>M&
+v |XݡZrd·wML7b Kg$c>/Ȣtdb OP1&GIL6i V͝dA#zx?.M&] юkѫ\_Q WlIqXL\ zu0ɹʮYϿ+%G^pkd
+iVy{)9
++"5@4@
+:5l:`H1F/EZV%_ ʻ7}q"'}wQ~
+z
+BqV(
+-R[
+^ d^\i;;ʹ 8B^p?'A-m7QxqwD =W oGȸiõ
+Waa)_OxBQW&IےCDGp
+?$5
+|q*c{ @YS+ De Z`1 v2Mnt<<|Bp&ȭ6գU6?76@zX諱JCI- m6 TyzcKpC
+`ҸT$`2j9L#
+/Jпa'kB 8-2#
+ߕyq aXWĺB
+#íl $Y媇'jp_ r1"02Ɲ~@S ܙ>rQ+F vaYLA`(Ano"Hjv LSF=J((,N&Tx/X2.W2xo f-Jպd"Ȼ@C_xL_1]l/u{IE/FX _mCE5F o)H&s# xfir#NΚs쮺vPqicF3wO/B"x4_$^"߮ DL_`y&1OF98HOpj iIO-r*Uɭݢ2*Uz1}_?jv~rh$i6 bXv$'ۥ!nTq =D= L*zC)19k}A&۲s1Uwt<PVH#vN?U&"Ŏ”atl$,f2ַ̇aEqXk&@(IW7\p@tȬZB"< 07ٯq.zbl~J%u+ c8<" g %L0OjmRs1s;IYfIz{K_|9yQ$k2Ss;c/8b\rHeaLBM0!רUelveu~&)й頕5ReGē&a1rnIP
+ke09ZJE)f&ǭBZV%n\1C$ӵkKXr[.ِ-*}$ S 9*L"8|4.J\|ԵY@&H dӜFo h ˃Lq?8KW{1#HM ň,Pq*2Lv5&ob611"’rb|+2hg *=vy@E>ح<)ظ" yF]? Fo{uC)%?1Y07mF|X3kq[N> TnXM6
+܇$Rj+P~Q)eSb1pr .|
+uWߵ#Y\3 y( 879<⡁!C@qܲ[`Mqk$\[&pKv2s 9bj.
+DBDIy?*A[`"B*OnԆ$vj=軴$05a544f8
+` *,Ohۏ VE+)ZC
+JyXL@IS$&ix˧bٿar@wzͧP8LDC,?{h"Tۙ/z0qbq{@޺ =mUb' X^bD(ٕٴ+ODrӴ&5ڀ^k!jC|p#.?Lr |4K'B`~mb/8Z<2S"Mz;z\fJn6dM@j g3
+c{'HlU^ݨ2ĠشIB
+:N~n& "+uȖ,aĺI3x^3%04D[>!XjH{jw,!-VG&OoC2vl[~dl9<[8_]7l
+Hώg p7
+QFFÂ;MatOkcW6}O֛߫={>gۺg[m]}c'/=2yf#~q7699/wGؖ+W^s-}1\fWn]¶>=akr6^q=V#"θ|zl⠯~[DsƫۇwIs~ՂU|ЇOAYVw8H'2lO((l52v\J6_֕9cq
+4" UļL RP
+
+l~Q!H
+*y zفbvc'sxx{vJH\wB™S%768` dh4 2c/ADC*
++Y`-v1OTZ 7yb,t7 J[b ;1N.4ɔvxѤ >S4%B`<ط\jA
+Ћ:R]mJ yk*l3hO '9 ~In/%pfDTF|UiJJTK"5t@9ڪx7hBʓk4#[493hQ'Vf\G%Y E`4~s+AHc@@Q1y^_0P*톈sRp>7uoڮ sBZc eUA-7Bt[@~P48f2iZJ!Dutꌲ|}R^
+::;iQG3xPA(5j-Ve<
+ʧ_Z*f,8#B@h75jdl>|ݏX2RcIthd1&Y9FY1:iFm[h" V[,.K* i:\KkPL$ I7"׼uB*:1ku5CP$ $>R_[%چn̰C` !X pi6FDAw֣@D-#t!yNqXOLjHY[-V/Zzg6NęR I۳ՍB$63ֵ#,zbb4nɱXO g>uD[d
+)غpQIc[Ӄd!ݝd*5[*ś~û_ϵNO_|囷o?NO_'Cz_?;]?=RGe:koꫩ0h . ?@Jfb1,.%DI7M ͵3#Xe-X]sL,$[#8-(RYhVl<g/ui
+E?K6βÜ/D_\S0m R$?6
+^V}cxʨ^zu*A`*qaY=LL":WzK\
+{\9Y!mB1촫z$In#A*u2rs~`V:ӤYhꩤ
+|A1TqzsQdqOAXa޽[u! W%(j9
+o‘ԯePkLjOyYQ yDxL<]^C{pFz"eC
+f@'Uvj H$qI.C e)C򂐈
+E~BwgErZƃfIFI2lLr3aGܱ5
+8V.k0t/=h젖Dk]Yǯ/?^j׿tKYq&@ Mеy!4:d%[B5
+ CyyuJOl ej_R/}#Qz0F-(|3c/^'N}v 3@v%RsT9G
+2>({Yz5_nU#{]A!^
+3(
+{фAtj 89̔g~ ] = pX3뛃sE^*Bq&,z('D B$S{J֬wqg3ظK2] ,F)
+N7WT|,x[@4l:6ʉo!?d|[o < dU4U^PDro8
+[FDˍ6P{>u!!T{n1G|{ٚ1@Eɽ\{a4}ά^t{GTI<
+x䒍ɓ%cr 'XBG+|R^)sGAU];ʟfwVp(Ay:\
+D6DecҺt#l0
+N Z+'_:V)mPwÆƏC.,IPA\h*T<oڮ3E ?@oHN$#?C:'@]{x9"ҥu{n֧r,c(&\L#`mltq&`0F z~ ,ܯ󅂰8rާJE<Rξim\`"r<4!}!ޭ,S(.A4 O7 Akhh$6PjHX(3鷖m9
+GBx!Ԝ[@Pr4 moD&+XAJ˴%3m3E(%#8>K 8f\ڍ8pW%@z-`R.0{y8 2QS[`hbзj(14Fnf}'`pK~Ybk#+8b,FȉmfOPFLp]Zs܍37~Q
+-zA) '\YDH}`->DAN؉@ cuMRhT}r 2pb4kފbR
+U׿@j1i@DmɧėL=bs20d3}A9uqr B[TctY`)&#,}h,}L2$\L~Y^2c9h(:
+Iu wo+/pj_ዕFL= irCrabYr8[pPSZ-DPI{Y4l߯7AZFD̻~>Qc g񎍎ܨd u}PMր q`t?Pq$>,=AiU?H9ak7fuH&bԌij>~}4B*5X ȓ
+9  <q5wk4Pʌc4SSh vz(YMG ^&Pl&:E7xJg;3P]׈\甐ͤ@`]¢E~<l6"d,
+ E8g`j;u5:V\!` .z{ ر)*Bh$e3;i
+F%4w-N'7n9a>ѡ !鯉T孩 xŀ c_]411ϙR<d݉a֝_{Q6bfQO7=XǬ0-lY Fa@mQ8\85 f>xjnỵ`cK؜{_ Px@*5V|Gҟ:̴͠f;zy,!dEg"6 q6;;oD6&|>ަ*,aF:
+WH>1Sn
+rv=*IbWO=l~]%=sP]Cn2`"E!oNI= 'Rg(mƑb[ݧoc Pb'ݪhBD1N:7
+th\i;Ls[/ՠee.oČ"%۠4 ;rrfQ+(6y`^!=0ۉ2URч#KDpFY$fB*b&(2S1ƋID#im%0=_[t?yq'EWyGN nPç8H%c0eiѧjD/ްѿX|/}h@͹$] Bwnq8ӅBU i
+\eDcJp7C]3 =QDYV=KNUF_aˌUb4^f_pM ~PXz&|!*-0̜*yn彪jF=e^D);$љ7ʙ
+aTrOW\ D2+ce%IF _-OeX D|@lS
+ZOu2zy!ce@}SX
+M0_=*a*9?Z3jDbG5)Wg@<T@nK^Gʷt"wN@Y > 8%tnjX7E7..t*Z})#.2s^6:i-7G
+(ZumEh|z
+q] T9@"Ȍ/تI-_“b܁>k}pD| Q
+@|
+*]?pr "BC#{P*c{b@nʪi{cS
++ꑨ}z6MW8Xe>bU 0Yr_3`Hl\A]`pMy`^}OpP4;)2ECFAq3z2=fƻe
+ߋ6Gg%4p
+GhSx"+lՈkAW,r
+s* )N~N|) B6 c2^Qʼn }D
+vAݓБד@\G]qENhB+6ɘ 8Wc ԱVOǍ֕$.^z΃.wXK8-H_Օ+fJ&[84( R䵩:YdS)oFR "I\7a4c3#H(yF+H6ˠ6 CFW:Y?P@X'waGF;ؒ=5{. 8vN HphioRE-"mFi6v;
+Xs} Ԗs᪱wC9acf9Ѵ3@on ީ&KīYeBKYfLk=,9> (ƨbo5JЛSLDй')ŷm#P}PGxDR]k"iK2@!<)w?)wA'1&CMPqip:LFgQ4l)tio%@ѐ)Y;(s%_K= : l˕`2K)8I+R7AKXXyjj] myʕQ\vĨ]s55q־"+/55u()S Ȯ`1ս  Ʒ_-&-ԯ歬|tQKI_ICT3!刈,60Ծ!c*Η+5t_2Ԃa4TWKjg"_W
+S[7*L kQ@JkJiO Vڱ`Zψ#3eLڸ9$!#għ8xiЏ(BWvRK )ݴixx"+7'Cwyw+Q><8担 KE }{
+Æ%
+F 3E=q_ߖ_ ̋Ys@ Pj,hq:߭ ufkab!_
+]B59qz.vók,9 /ocs(5 ŏSC\*jQj??j=Y]ۃddx55ϻj<,@`V}ym6.K~36V#|3Bh]7Hd3~ ꏮA(xXK(4E^󘱒QhU(;ӶD]4qnt22 -t!vrEp yC QT}<RaQ!-`߳C'm?`T
+hB
+_lvRvN}*R["ЋgD ]]D$<
+Wh-WYRЗ
+E7=P
+4U!Jİ`(X{\elP\3gDVS<b :S])g/QQ]YDҌ *$xg@UE,.KH+hu<}A(&M/6ZIb
+`
+Px#@u5e~Q%;>w)la/@"&bUeIDD8iFRy}8|G9"F62'2aZ>"hbDeAwQpΒ(z1 ]^}FD[";jzi0I/Oq{Ρ6li9pW\^TV="h p@|FU}"rg1[3f]!x9
+Hg_ ˾aa_^.vE+g pݽa!# #+ HZU\" ħk8bNZ,V#^2Sլs&j~1@7l:o *? 8 ſ02cI@,#~мZ`ͭvrf cr؇ǫr/z:qj7ֿ 6J謸^ED7QRekxl$_gC3w70UĿXUlɎhgl2 #:us, Qeڦ[Itb|$2?k`ͦy|tR%ݡ{D= "s5-:j
+1-XJCU
+-(8r IyΛ._"J@q&ƾ*:N/ѲLN›UҨx/|G29fƄ&.x"]"t Av6A K!44벳@C~E]yp]Dosi<nWj0U(=b&<_a,Kƿ3Hzӣ?b,Y<g֍N˻BQꊨ}]b~ZSOFPFu0giDR-(N{YL<$vOIRWE!jqTuЛt&.xn2Js- e$k3ʹP>{'"Vd&k8I切hlr+){ޔc<Z-Xٳr6c"UxunZ=%(aDV1=(i
+)4oTkN!yFzx/yv=jq kksbyZ ׀'and'_T"_OPj!X2A?0:ՠ5˲)ZW +8:pJ\,Q#B7@ ƹ&$3@AbU6]_FNf@L%ni4hD#ՄrA_ƞ"Cc2pi}I}-#[%Q`5j@/F
+ jYb;dAphlrryTfxϯm -BPkd+L)RdL[/tK#,:3IWUK!Aݲ^S2.EiV-~j i'
+o@HysKa1estP1 .wplbWœhyNTa)llb Stg5DDm+yGu mtDo`Ȓ >$8WTՉ8`3"A tғ$8#Eq$` 1p1pqe<(Tn+|j,=!q,5&tv^oDLm۬Tr?
+*s4d@h*cy+i0s[1g'{G\y`m1H" Etr!j0VKz_G*x@SD n(]HҊ࡮sTHo*(
+Qxy*i`VիcsYevT:BW9[~\KQFκ|6R֢<Gu=(k< [ˎ4t>qaA5e=i+X.:+ba-xL#\(ҍ.֊tc͏v,Ů]Gq%
+|ر$Q4NUR,h" |!\4#! _|QԈ;<G}?\)U*UdȘy'6 =Lg~J8z7@]~ƅ
+Nvᶷ`\@}6-]̏(8‰dY*. nxb,>jr:Ayr]&νq@NLޚT suH,w\i6>j@|$<CtK40sD`;T_#) 
+H'miK4xʶK?(4/!*/~ׂX!#<И2Ey0 {*Ʈ%vuX%(3pJj<C=&<'{hVh`J
+W@~d#OcFN*n7 .
+Fu+(6" -W{W9 a0TpoO"
+_{Ņx As79N5UAz#O}j~@[y蝟РA&18U!R%>;w .dʡ>(UɥkzH,dO>&_ր
+A^ B8S`]wULt]PF&Ldz(q(z.3ggAӿ:|Z]#}-@: J(P+Q1W
+N\@dT7X!c*c1.R>'biXv5cs _9I!T{D)N3UIk0yHIW;(~ ꯛ7
+67[JeQehTM7 ̑na9v:(&xwyq- HTP.1d1kC}0aLRg߉B3TYWu>+a!>-=pWVK,z[e*-GD
+]]# QC yW`D.뷫W^<&A>UEF4mnX}bj'6ZU*ȓiD2!NБ\.nW9>1ndM̄^5%b{a*e˛{h\YW't T9~Ď/:mBl'S?*Nj f`~HwcȈA,ACeLpƻ\TȚ%v&\N" Hz-.Qjc1RoL̍^;4T<m.#|oҋ_-Yy.5.%R:@!+L[Oe0z-2ydTnDyu 3jF
+ԵV]f5$@/  Cjk ]>"z8E*[wlX]ಁ 2*uc;~Z@O*:e~P330&'E p)K9Or/+}@{=;")Ū8s^i &*V#_Ǎ;$CAآ
+\ӡܻ$]+!pƴ0bz&x uU )(o"I;WIJ.8ŢD?CYO @ϟ¹ "SݵR #c T;(S!W@qcA |D!]tfH4)]0uAc:EaFwFf訷#Tmbь>`y7ⒷmjAeOBD-ncR  9b+wHTN7yR`~[׻1+z
+<fz\^E a
+$PBl:~:
+s sAT^,楧VKclǩcUXlDڤ@/l׶hZۣefБw&J*ț jA" z>T>k@ܤAbaX/-d:_|Cݡ7Ay[;U޹B&$},Yɽ8D5)gL뾔? Ooj@x)oZHº+*)|˃dyi؜,RǤOM/V~H!6Am>?Ղ?o}_ oG_|7ݟx؏_~?o?O'_׿~2N :^f<BP*HVlx3GyPTI89wٟ,:0t16&"p7 ?g
+j"KI~ G xEpҁR+ksΧ5ʔ&?4Tg&9];&םro S _
+Κx\9IS'DOѬEίeo|!1 q^e@]BaJQ"];m a$C}ΐ[oM a_-8PwG>暔E(/ԂĀh1%c_4LM9:AKF&>#鼐)-";Nor{nw{Y>(CNմs4-ǴۻљurK,U_5z،Ⱥ
+}=eLs$q0za$@.Z([\iL ?VCOW1MdtPWUȢC󒇈mBcy׊ygC<SF"x%)NhuSJ1-%į"aEzjY&,tFd#N;¡N
+Q2O훃\a!cY2c
+QԠ/r
+!D1##+B)daa̙YsC#}vz<(=Œ9I )$`Mj#+i VXDqF_p߬i5fř\w4Aq;ϩ
+ո*CvlW0`sw (Va6Kʛ?r
+V30^ɈwM<S9F8[6',Bd8޲8C6u}/vX۞w^!PmPE (</hQxvpD @$j?դ{F4T
+EҚB*56b=֫r;*5ƴ1ϱS f!{3y\GC 8tof+(Een(SNuOp$xB)T0.g}pGQl4=HQo R)x;k+f3*B TN<Ʊj
+!Kd"z^;٣Qմ"Ɖ D5g_^N}x9x):~x$/!m']Q爀k6絁,[!>FV5ݤYV1 'EZ)d+{;f!!뺞
+rpntuĪR?/8=_$9.DVR
+0KY-*T)2Q>d#ڡ^^'K`9׮,a˫<k\/- ^|KCi!d̈́5縁&)QD,ϚS}`ؼuOE埌mqHD 1f&\kQƌ;j8~\aH3d+ :M|at#Jq#FuEVښh Y^Ӭ`RM3:bXYn5qF9o=8% 7;(gZ K)2gc qLzr[Y*aRLLzl~rKx 8G&V1y8Ŏ
+hv:MC]B""'-StI23 w1
+FD9u<R^:1Q"I^rNNߩy6{HeU@ Jm dRDz(;v
+w}`ÃEٯ3"3\ݹĒPO+hێ~R4Zo1v8n&3NYBT30 TBA7?Sġ)
+HInd9DOw::kYhWUsjHL ws3jk/
+Tgzjz:05Z 2ŽYYoc ’_f1/(̇4. :,ψ S 2ުk#f&f*U OTfmă&X|8[GNvXS4nV4R"1CZfA<tZrdF?ﵓf.q{ꚄtVsv2p/6MԵ!2׽Ų:؝kkއZ'G>@ZN&}A)ĀTD; &ު)wBMnJA k9ތ\3ú#q#9wL6D6{kAĈAk`mʤ_ %P; zFPM_ Ԥ>Uy;d
+%"5NӜѤk&L +@H}u8d=AV
+х Kh)U/5^0
+
+B_SCsDŨ8辖yay='!cl&H:?Vr$dpot4aY UЃҁڦy:Dyvr#`:&1B#4io *(LY &fP?˙ת31өfKAٞ9CȞeaΡC;`bC`١:ZU(3mx* n1 Z{/κE7Eٹ!Qneq
+Բ<;d,2,G97+ږm/q/eD섖 /'q{)AV/XSH!I2![Z ghq@ؕj8.@_9'VUƃpOK !-3 eBܼwP~Ër4(K
+xtT"+>BEye(
+K+i^zIpAe Lr)[!. *杚^JJ]l z@lۓTAO!BpJ||}YP<vIYUdoŊOao@Rʶ+Xcn(HV{ xQ+d/J1>_n魒HkѩW6~?U*lG.G26B:}EBL)OB8qZy԰HeCȊ(T^ϑMEb.Q
+ab~=?@NvxG%x)zX<E)%ao0VϞKU?Kuaq !tdy$S)%qw Uw鮃Zqt#39|?o$I
+<h o߀R:9Y b2o a_lm[Y 5Ǖ&  YI'HF݈٥R5V@_ *xagG4B9I L,N'J84ޭ"qGYrn#rHE{/&N/%5_@[ʌ?
+$K$'9fGD$}xo͝N3c gyVU%eGG|+nY6<zpB
+!j&-F{@
+.Jz )+Rl*M dn D?Du 
+Vnև  Ɠk~Đc^h529#CI]p wI$6co
+ZfFx*HI,dyf;: &T7(#…ˉ2?fzqP"
+T!\39_cZG- m1A'5Qp:pBy"V9]>@ S# u0+leNp8I ULH?[r-yFJ<F\YiɮezVUA9r24ǬzT7OVf܏!LZm`+J@9Ky$ǹ@>ҷV_bET
+VŔPߊ hz@ #zv%`i0툷ҁ),6Zd#izq)#窦O [% 9슝Z.$V!
+۸*4)CgO{>ށnUhdE
++Z#S97ˌ%b,k[q=|E~e!0@:d 9ᬮՎG*:\ eX״DAq̈́SǛTAi<RNҠ: v0ĔA0
+Ǡd%beR~ӣ@n-P>:StTd[H
+$fUn@NRӌkgxb+N"iΐ$DQӄB
+a5c'Q]SCaB&.?3HU2nB9ؔXG^;a^J *_=Tp;A2<@0Hr<8
+b
+q2Iwʽ auqV.wR~24}Ln{>`}>d2T/߭
+df`1U`-2ܫ#CIoUҺ;=g게_N
+^HmvMl>˅q|'hVw|+"XN'Lr"Z 1Jet\ɐ Ii1nǜ$F[ >]>)Mc5 fkBc*qȳf≥KDp'͝1%eYUNC)- sJtESI|JSFlTgd
+y7yuxz-7|ͣW<zm#5*ʠ cąQ_iWTE;!?ߪz94l1ßs%^/%Γ%~zZ*mz?E.t'DEhk|PeLj퓐
+8O&eHXv\֩Hd1-;07sA|sGß
+aa;bϊVUiXdE $a3>P ": Lm\ ܉һ"=
+ R;@t~B5Fg>(kvaFxjA֡|$1^fʸ@zq_ S[i]节:eR~]xRRiVWI; X*T
+ 
+F4Yn_cdiF.1VZo y X g+\`U#@zrI5r޻iXpk/cP0^u9^؁ߏpJ2;
+[ʗ~p ^dr|<h mLm+- Ez!#Iল(@}FrZbcQˆd3p,:OBmq *&4 d%XK.DӑɓP١op[l8rKϷ?9/V
+z~(l;Pqɶ
+C LhBU8J,*%[L7EMcr\$Йrƫ%ȕ5ʋFVx PϷ[%[p'JSFԘ]o1dB
+IE!\B7fEavA"aio
+7`q
+P{j/J~*q]c_9V0
+<=/ ,8͘QkyP\"4%AJL[Prhhz;E/`/J^J#zۢ\SMϗA
+O`JђracG-YZ
+*R̵ƱF1T-3=i^1Nqy}\:n2/s}֞%qpXDr<_kX-x0#-É+S?t?de![Nu'zSd؏}c5Ǚ$&~ (ܐ:
+scH`i`/`
+~?6fY{j٦,1
+wĊ1N0 EN=MP@((xޖB*eUbؤ
+Q٧EJ0*1NtvW
+ZE11Nн
+HQTBi"@W
+N+`Ze 2%JC =BU.ZgqcYi1k4yx7Hr/nUJ"\Λ!mџdAiëK ')IF(c!Rl3~.i:=8şl( '@0s\/EV"S_my710)0;W U_`d"$ϽD)RG1MszՒLbf_7b9T9$䱯N
+b"G)%1$]\W"d<"}50(ǖ2^hSdb#`!w
+F6 cVwPEC,rqCԫUX%z[WG+Wϭa88l^e_`GTG&G'x@#Phf^Q16l#BQkɾf1o-o ` vib?./^qƻJ#Q?h':`CAKo*y -̗; :b&2b1FLV~< }OR<\ş >P6éla-i"KFm3gnaPaQ5qVI,QJf?Јb98ԅF<Ë9r[m7cVa`d:q QvO!n+4X68܁cKsO^%W#MAwT`ߋ*b(B;5p Y Eq7cUf-kc>P`G?XMᔏWPgq̰4CYr4 rfO߯/ iDa\,fCEŸ/HhTj"f1D)ʅq*|oVW`̡0bPF\&yrϔn%*H,Ouڥď-Z[xNoMB;aUiƒ9uO5p7)/m%{
+^=0.JLPQ"@ ۰CA()
+rriʊ sPgJ["LcXB̓/¿bű!u`BFsc@6Q@޴نZ,砞XB
+UCP]wIRg1g%Sx0<f39ژm0*b*5t ,&հ:
+԰VDЀwد/_#|Tr/;Ե8(;[TF&@N5]~=>5ܧ/xR44r![ I~R%pA5 |JAg>wNed8YEf\+#Zq3b:G#V՜*j9iL #E  |g2ZϾ "=mw}
+
+A`; aCLC<a[ 4=Dc QAI:/uz): auOwZcshr3=撬:3y=`YƁq9d@|( s)zs+I+KٴmnTwQOfJxtyU6}E$3yhKN^ŹAPodĨa"TS/<@i',g>ʫ3 +768-F?+h2m4ł#ϔ;-mlDCr~Us~Mn3''s]aENe
+H9ƆvK2t}+W
+BBl;BM5+ٳ1e>p21qiO8ňvع+?E-k /3KN8U!,B)z1!L) yAp/:h<Cg
++dyl^Ep}&s.u!4A%B )ppzR,Uz{Hd[ = >?UkHP*xMG;3?)㿷<]b_2EQ#c?݌df:4+rkHY,OmU** =2T¿svq'V%n 59.G7o%-'_
+j됍Go^&A1}r?)k{ 1ͼs)evz]SlS~:Ý|՚nV*ٖ- 2j92&3DUB Xr"Kl7\!r2|3rZ<%c<ٷe>9//1dsm
+
+)F9k: 6ɿt`Ӹ+Kժs 2~na2xS1ILDh?gR}#mb}EWrש  /=߹_a Pi6藭2怩?|b!W'D q9G :Juo&БB>b-ʦZljntp3hi2wޑ7ws#ˏazp/mJkX|,WR0#cbsN 11ӻ
+^dYZTi>񲥈PlV~2JkMWmcOvILkJ ,0 %< I\=I
+pu (q΂>Kޚ Y&{hkl9tX6jDj ٧
+=jD H{ /m3ԝ/2lLw< a`='u'"AGUM^0|zOKT4uCI>RH
+G*ixSߨ$)kcQDKM~*#?Fsl_SfLC7dHŒX% $V*=T8kߧ=Rr $08d-5JcC`bxJ뎔2t=GK
+rHR,-׸Wy8Q*vP8#RŮ|~<}U85wbt؞3WIĢKBYl?qm;^fVba.,*&0%Ӄ`VJ#܆WL~x-;5?G@Fi1,t9qĐsoB|EIM3jE4Qq^,E/E"J56Uؕavkt,v=S=hDz`sD"L k??K9@Nt9JZ S
+v$[6u8O(*@^їzEFܱ!wn}8^=]ƙ%t( pTQqvmȝ,;Z(\CwaRZ;R9U(}/igcc5rDŽ6$CS̴R$/9 f GcLƒ~0:]*XϫkRX`pʼn-*WэxEG۾q_35E< dޟ%Ovd,F_@D!V/%Ay(@QJALj'b
+x`@%MGd19@ui7wf4@H
+Km Y^IRNyXҤHDACU{9z8ɐܢ oe wt ۉPX|h3ܢʝwy /O]j ^
+/wMAZ!cH~
+B@R%,JMyQt8c
+Fc[dÇzԑÀ̷Xk 20A!
+5e"6.`FZưW`FZhxO]X!p59.kR]Bv23ٖ"+ RИDWaH7m ͞@5E2k!ly^N\L2Я͡2m÷7=j0 S;Dc##XۛVFgښ&d]ap~5@l:~=剙ǧ<wyŒ{+e pX7ڛƽ}? Q% _=Iloѥ۞D/D>u$kLyZ#tJ%l֛0zIFKyݝ0.L}>n GL
+ɼ|(JZH,5gx e^|Js\CY@`>qp3#Y56>6|J'US1JSׯ,§%v t^oEo+\4y3K5XHv{oyFaśi *;Lnj=)nD2vı7R2NYbo!FChEDp"@']KMI$ΤD*]~oN־B>z}"'xICyV,H
+ I`Qo[Iph]s@POUCZ=MGei6O IT'`C.:~9E8f
+hZP!T҅.+i FUHaÏ1瀄y,I!f^ |Jx ;r`cb񁗢o&Yf<Ewdg'pV*Chi<}%.^3,| p^-,"sxv@k8r#t0SDB.с45M+1)%WG;Sq2=蝿) 7EQIUW.O.?9zČ|+'~"[^2Mraưp貐19'~98Y97AI#so !?<=C'v=|6楤-CƁ'6E=u–Qtk,*?+qGdPL!U/Q>ɶ
+Y{~N!qՏkhՌ\y+'I=3P$*ўqT=G31DAR
+xY>X7^@5OCPfvm^,Ʒ1ms>K
+J뗒}ؾs
+ !L֭ۼ;NM-d;6u^>fA_Jђpϋ$rWN' na(h«%ʏ%>aϫ8>5%3|&7K`~q fG[Jg*h `oraCRk#MsF%+&0t0\KɢT0TpkcNt)DJP6 ȷv<_JtUL%^]ϩ0_OWԇA2@\<_#(+dc+cڑSs:{>Gi3iGڔG29u|qWV +C7j=UFvv}'`īo<1ʛw޹$|oΙ|kuwFs <H"#lI9XX܇B< o}{܋}粻]F"/d$Mb!R7 QMna6x]tbIzx`.1(aA {䗒 <rj
+\
+>HI\/3}ZEA`p8|Lr9r:h0Elvi6
+Op N6ZPS9{a谓 HE{gG㏿)m/
+etдun%OTԛ*y}SxWf^8 B+ʌXR0sSp[ΈkXرP G;vC.3Di&k D{(z[x6GO]/E*x|9'^^*YXFtMAxfYZ?c
+’Y Irެ1_@*1cZѰ:oBzdl@Gz*3(%_ɅG,qZr&KCQ."MoU b/p5䢘JY0 JaߒZ]r/( ]ă忨+Ne9bC< ŁS9VhLILp
+^ߨM s0u3DedghMXsVRD "N X€.-6j^`MK?XQ`v;~LH;Jq"{/ C҅Y
+Xyr:*4(Bm)B!P܏#э!I
+ y*q͓pDx:c pBx O+A2ImHBjݒ=CjB  !zB %$zL|m(8@9"E>ӰW:kPN>& ț`܆bm@ Te4EA#>;Ja yacJU`S
+=1 0
+s]LJrz.\T',]DEoUf>,J:e gLaD!r <m4=X; \k[O}?*vXk9طz(!f5L1Px8PIǰSJrϣ`wxt8Dy 3q/ 6)6hߜc
+d,Qr\jK7i򡭯rPOYVLj:Z݊ʏS1V<ңF
+LK\ފ1׈VDoSAin\!l^]qJZ 0qX=t_
+gưC Wt}q;W1(~\  +R8  /*iOf(;hO<8?-&m#4roRӼ60/.ӐBI6/>* lM9r ljZ
+s*g@]sb(P%6p@8&6I@Y]o/\
+y,RH+E>
+Ro-ӑJd ɗF 0~Gks&Z>oFP
+W% 9J%~7:\ >/mgr=Jh&=y[[^O(I("u%Il%#]vx(%%[cJ}cĎf|1E|8/?a45̐eٸ34_%&F';.嫩rB(=h!!4%UIP_V6m!Qhh
+/&}r dH`*W}0<5w
+I}c l0+_UeÝD`3t!Dp8a
+Il7- ];dXY[XT_
+^1['iF1-z=%]
+4E@GA0Vlf #=w[z0"XUKjP|2Vm1= šcnNnt Rg!,
+ͣ7B/'x<2O"Kes,mi2ח0ՠCVG߹< 9ѫ|vGԿ/r7Vѷ`w. ?n$jxpW+`!aïFc|IG_LZ)-pw_pgj 꽠lSzz)ojI=8ᏎC{ՊAOpJ$(˝3dq}KkиDvK͛m,mH*3'uaPG,XLBE587wŮdm$jdqLi0O 9wxwX>8aPdF(eB!G rVĚ&0sƅ|ń ;$s/:#kZW-]Ε?
+ɔf?JKE7$o$l(X@.==u@8L0 sU P':KiE?'݊y݇)o_A gs3r Br\@Րϵŗ!& )U|t'0\2VK@΋%1C݊>)@.g8C?
+HA5 Ow58{eo9V=K$@W4]*gCD~mZ[5Vʹ߇vcX)6G
+nBz C2aGEJ1}}K(:@nο2tuƂ"b&DLGE5ʸg]xjuQ0zM~b GNzQ6xu*V[ "yFq&IDOW;xMѥ0gL"Ƹ%"3GExJ!DBvܥ^u\Ri{+n!J'@݆I<20ԥN ^k beh]lߤΌpnnҬZ4 T(PF)E2\8Sś[P ;% ~KiL
+MARD/oϘK~\
+B@tӉQd|8B !-)fEFlvi4AeyH
+=p,۾`jp9/ $Ӏ57=> w>&rR餹: 6 a!mҬBޞz]v& j =99NH{ )zvFɾ:OWdpn45`>q+5,M}_6HYQhґ@ j}9x4o͂:NZa,!^Wc{3&qG䥸_]&%w!5e*h y;:q;D&BSP1eq|79#r`iMR7>@X>=昐DUa[.0^ Y`g:\7=9JUr$Wbd x=9TFquC
+:NNuL\`tGPL@1|`{VP(XbkZCa^2>L<ѪOF4wlo
+1 C_JfOBYjBPʗ+[tg>>I:I)K-_Gv+á,b9pyB${Nw=BM%7'^=MS9z_cqM;9
+PT]n-1s -Ժ8ᱬ`:A9(K)b!!4־19|B3s9y \4+
+XSHsx#(L
+X}U Vj:)읹e?# kvaVH";O4ؤA?zO9Er b(r=U+cM#_S\FςJˆ2 Vnor(c֘4T4r ƫ(!wݐ:Sa۬ %}Ɛ;6=Äf DB8:sL2 1mi[9%[\Swp W?>VzX0ɔn:5!X\Mi'$,A:lc"_c]LOG'ozZ26b ~۴r\CsjS|[QKE39B-|ܤXqw)腤Zf|E*gʲ.~)I3AeDdZg]xj-F^ G$Jln|dE7"C4& [mFe :Ii 3[I) xOTk+I3/No>u$ꟶNfx $0jՐ|:"em5MZCb_P/<XTdS )::al ވY#s 8V1,
+b`p7WťEQ-H+f>r`%@ Jpi}> %)My˲09<~i՛+Dqlɇ/^ڊ)uP Yw^E 
+Mt$rɳk>^Ԙ17W~1kʏm
+u?1JzZH|4.ſw8=)6ۜ`<9QfB仄uK&ḏ#h,ߜw
+f_~JqL,!0Uk m KgUvwu=p1KQ_ @H%) M%xQP= n9ʇbEtF!W9y57B%{
+ ^`nj˺e94)ENy]j>~qABTazdO@9c|L@SmTWz~W"0I;D)7XHTu,#^:%gi7RV=L@0
+ਲ਼Ɣ29(el
+'[k%).9)$h*1qؼ Bű)1$M`.lTf8UĊYu/k(GuF< IcPBh?zlSg $Ix ?NSjJS>Nq+n,_9JxGۖzn *`1A)!R{<` 9 Yt[eTcCK0/.)e _|cHhD,/V<n %XcF/m~kX+?׵P-3("b`*rVLLx
+Waǂ(&Xu:)CԺܕĔ'?D9Ypn&kT
+I9р͠AI#dmhp޽<[
+(c {*CC|HbLdYYWBÈ
+cVAF< -., OhnI8x\-(6:Ҧ~W'Aґ7zL[#K Ha5
+,Wp4 %ݿ<{RJݠ#r$ll )B2!ŜǞ qe4oM`B)'o z{EL#B`)Ls<+#tVt `-GXX!34&\iDoxXU[ؕUoL"o"Ef,6ESwҙS:%nSJ
+4}ca&f`||ӓ
+(V
+W|^|Q58$b5v ,L}JE}A,"Xwۉ7̞v 'EbkjXo
+]蔬QV:V7ݛsG}L L=i#ܧ[0KṎkfcJF-<h~hPԳ(3,t_寡A ˑ͇$%+2CyG-bW\AՄ8PA|' *[vfnk+!U~rp=W$`7`m%F]60ǚ:c:Xx BM]f)\l? QjrN\.5y]ޅ 6M(MdZVܣAKNN](E9PE0x
+
+4\[k6rd]c1{W8Ќ?Z3911x, A0*Hf:r$Sqt Dh$ EoSq+#8?R ˜X)1XkR L8#^Ni.ː'1E?&'tֶo[d9ZPaxzGNH ȌB4 +Ps%YMFsƗb[EzI$c $bDfлSDViDS>'VTMRuRDh
+:^v?gx\91!Ui
+ܬ,fB1x!L@\54
+v?`JvR+%%m H/׾&Q0oʠv 8^A; 96ɔ@34(~:/B34 }wyH2Lr1v*0@W5
+`—٫f)mT(ƌ+_PPs8×Oa<[O>,[ƅ E)j^ YB%RbLՉ3Y/9 Ñ65p|Q'% ş8vsdls QСvՊmWWWi(-uիdg0I┆mM]\NcH7PBaGf97l ehdK7z}dD}\}r#/u%zX1$jr*-BZq"_M\JsixRB{,kڛ= kv Y:̥m.0RzTf;bP3XkX}'75];Nֆ؟d
+/b6!{@'h #*x@oUÁ2i>.h.~A+662J* X˫@ K-tg@X
+KA۩;sY}2N$6G'$ɪB~Dڠ|䠏M[Q;Ι& _t U[ˇI0
+ftՏ@7bJV?=/R:Tj4)!nLYdz>ExJAӹLf=A7> 8z?z}eIMԩ#BiDk/3G.}Iyn+!^Tf{A}:1udCa 2zsu2Pc*m
+`چ <}6Qw 4Pv>Q"~YTI=8i 1Vhze TOٴ_U̥#x$WvPtރV OO\Tk
+Qh`)^E}1T-N829u{ moaxȑƗ7E MC
+[ 4 iQg&gqlQ>r IBIԯI͍G2淒7ۀ0$ɇ*L9< Jv4 2 s.~#G
+mJ6{MKcNo_T(`'׺%
+žeR|vWZtի.,Eɺo'$9dȧ)nuN~WM uaX B>dl6tEl :]X<-i Is
+A`m2t. zOg&0<s( h7'˚CƜ8_JΗ8[s3PDG=S6pNGɱ5S#kEySͮ揿 [Ge-׊$yY2M 030\h^eዕj;i:lxh͂/Vehـ}l;3Z8Ҝ$O?e7"O+aMQ-Aџ7ElytzJ
+.k1?EFehK;%RtEDrq#qMERG#_/$(if%{ꦕdL|hNLtWG(WlD
+`L%DTs= H=6l<x?) NFWΰToJ;hWL+L
+rB[X%P"K!F*bc^4|aj=&C8TD
+΄BEvokbx 6րF9e,m xf
+Ɉ}֝EY!
+ڀ 0rmzOS<DZ
+CFK;);WC\C=q5,k`b 7>LCEK(x]%8x少?b*]z-άiݟˈq8i*ގ`M*Tea&vЎ}2 pº(Ueѿb=*(>yRk
+RIlr;(͚r$ V'ܜ,E܃tl"T%&y KGv,H͎ZTuCWiБJ R(kJ39:<a]jPJ:\}6mfQM?Q )+Wڡ<
+&D|[cMJ@ytEás#2Vn"A78X'EH0kALN){[$E
+Ezd/$Pcľ>XNک
+$XbKVMsX4UhEx^(ۚ0.E_{-ɝՍv
+
+IP A!G`*H 0B !IMl4{,ESPI/ Mu- ե%cX\R&%ښqi!<
+Z[sAg cK $܀-hcy5.a^+UN]l&'5)gݘi=
+3bKwq0T{
+k
+Q\k'X ds#ڗbv+ qS>PrbcDZ¤
+,H+9[
+l;˴b1JI_LTj;G^ <}$dͱ*9,l(2EAdž;Ab0X F^Ӭ|Zª$80,KhqPySE1&:|U(W~˱0+ZI4)Sr&%uo5Q`c6Fun-"AȏbqoDe *$
+gjUQ%!sP
+`BЗD#9!"{ơ|h3dH6A,:yue
+?lݵɦŗ(]lfiޯc[$wUarco㷢ϟLPPE; =?皡9č*P2-fI,9͒$/Ҳ4xH c(|Ga{ZXT:ncխA8,P?^Aq(=XX zZwh]/s؎${-)r0_&^A-Qf́P
+TH@!`,E ;&ɰ9qNiV״΁C r 4d U_OTěrrĽK6ܦVag٧`]>jL7"t?o/k(dr0LQ״ʐ)#2 vM4>_D*J@X}.$(Jh-
+M> `W .bHR@$ؠFqe[|"L:Ap? D#9EGX"%y mPl!ht^MG3"8,𵙱,Ip )v;8nU
+6TV
+'aC=QG<zHjWRP=QDVvcd(Y,t0dI8#jQnkt# :?HID
+v $d֪b
+tf%ak'#T f:K{$DH"B7{;CB ( Lq(}`B *9ayc
+x~!
+&fVV`=?!A0#nE qÓ$N1d.}Pp]]Vo!LU df-,uA[ [4_\X"Kx:Ӱ !18>ͪh(vh*Ab.x8& ZRUH%xI
+''靮,7t
+a"21ˢC/Kْ.yh GaxA_;/+BŃoޡO: itfyT,Z=A}gN`ol 1\{c'M=Ž]555eLF=l%h#j ۚT
+5UVoVLxdP0T0\4ݮ3hNX셬f;\[) {̩w!TAmJ-G%=Ҩu=g([k`Nd5K_JknRnF*D}̵P+K/݄wt~ub\:ܗV,αC9Fo8`.!~)߹ɽPYSDӸv| p~Dy e\+=E "o-EJqS!| uSXr᭛r
+l]x s1sSNS8.i!OpEް1³p<՚)2DВ_<mq> J.t}M߷?G(͊$2vljH.WHctuEKpdAHl$*W>WфGA}sQD0(i%% hkK ~R'U?jE?n+(N" ";ai
+f3tLLC?0aqx >)%z'۱p#ŘNfgM衾1DVHBO aVaV_B%Akl^@ȝNRM6UK*46qc+0$k^"e"(B0&X>DY),
+4ԅQ4l zK& H#,i!
+wy;EfDp
+mL)@q C+2 X!|`Gp* hZӡVFneo+) Bv8C5GC@$`R}Y/ YEYvyaa)+!x%ir@Np{Ϣ_%YB3n7$rXMQTe]]ًl(醨Vƀ*ÕAeY%_]19zi 2o5.%))L zx_,dƟF H$/` :sh89tENK"sGcm@gŋ
+b#^ l &~J0|#QǑ|l{0jHʛ89SDuQnV{Ɉ˼_+tNg”/E
+J &f4/@~cet>"$D'pL&%Nh4n!ۃjeuZé BټT:$5{PɤXx"Xo!L)=e:l]Jb6a
+92Mw T;t!G(RZk헎褓YKP#
+n/9"-B [UynC2pNɷP"ip'^`;7}Ϩ-W΄``ķBWle=]`љ(AuHF;md^%V08)|(
+ 9LCĘ/e83
+6A@KX~}\g#D([Lx5
+RB%_Jj04r{tp
+U*QVJrb]a=
+Iqrt.Wh=uigTas .԰(xJLf/ż<t]TgM#ȘVt[V\OjP(E Q$QH?o@ ,kbJ=z8k{3ZqPM!sG`': @'iDW,ñoC &YX H_ V᧑~U\KCu(vIz2"
+tLKv}J;$=-(ydNڝtYi$)Tٳ)2TPtUWѓ`#sCa4Xk^+*Gt˳a7@ORԟQo
+S,`  wQ9TF%A
+ "Ut
+6ϻV]pn.NhcJ:i =©eIIz4xa+@@kb@cjFgZC}NѸ[y0{hl(2R
+F Ò#rX|,AL8'[0x,I{sW2˼VSr*=f}Yx;(ɰ# ݠVJFL]\5=:fx>69%G{_14|6,>l^"NpszoH%0qV.2Idؔ7}k
+f4^J`!j*[?[o7M@l2l
+9H Jc;te\TF24Ɗ\J$s^Je$]akqJJoBq–JWp`* Eg3V]֚}R: K2DL]_1 $. efd,y*?:ibR/k In>V"+'$2&[BL[8|~\*0^.9z0>Azko}
+Jv#_)f6Ω{I=42cO- AcDeDp'aR{'wPdߤ-EE00_G: 1`5~T0Chvv!cZ˯j}YZQ2X{%q&(LJO&9
+9Aajri
+$g# { R(gF=kruKugEV֠!˾婗id;P @!DWD "Sax&4AW0%Q_*[q2m'nߡ8Qj#=*p۾םf)v;3(9c{
+sjq)u)Gu5URRD%зA 30]ܟц
+2Y ~
+ "8<Kf\w^ɞ[U
+ iW/iYǶ /0\OS<>{l%gQy
+##ф)WBeZwpC|b*xȿ0gۤR(wjBxM;<,( \;\$!6Տ?D!E^lUibNxP[ly4־醓;aW)3
+*)Dp^J<0BrA0@0%Chy9(-3׮ U ֆD/II`+Wn%Xʜ.Fi2ZYڲ  1((AetŁ2\_ VAaxc"!s 0?+H $Q:ɲZ_b`k/V<Lb䷣L'-\0d֮M ĥ |U #z x t+وN vyID^FuDJN[R*Ƹ(8IL*TwBLP-}@>2PVl$']\sɡk1Ubhͅ Erc6PpMfKM2L,3OOM"ŵL5Y
+FRZMzuJM'Y`'5pk(!*\A*W#x׸ k-k8.[t
+8M!4<179)1#A6se)p3p5S%Wk*;'_
+HIn9O;Hֹ[4Ыo@:@0
+e5P|J磅=J]X)0/X }b:JC~ jZҭ~v1j<j·z?hUu&( 3A2/kov)3!fncÂ=
+ɄŝRчS$)jV,Pܩ=XRZ#HsmMnvVˈ^sbV8@50|&
+qx޻9fEVTK~{nnźh<UcHn.tU17(}C;Q|wQV(l -ּ"]ĥx~wRϷl̲ jkI^ۂdc#xox_7 5\TTز
+ϻ1xBJﮣrqvWVktuSNw#IL*4-V)PMDA*6zFcZ͠ M$P>'i3yzj@CJi=|ׯR&U7 ܗfKzc łЪuYhy@!ݐb(`1 Q"ҹ>pꨦd7K-Dy[V+J^-so:CyY@`3G O5aQϭ!{pcYA_G-j:^+D3HM&S_7ЅVw,*Xkmݏ@h"Yyv <p*IA CQlzfۄsϛ;Jmio։F]@#-뛭Jn,{Jo=(9DG)y0awW9B;KJyw/x#<̓|3Aya/KhC$m5$mtz & }<B;ҌuNP:3!'G6#VdPP0v;5$-%Omd2{̥sď!
+R־ )eȣ)ܪ]h(+4![52\%X*HC萤PߗIlqz*46<:m\ok+7j[y
+6lmA
+eG)3tyRѨ '|CF)t>DŽ ,L;d1
+>fK9IӱpRtDA6IY厀s=7Ȳ81(jzPB#L)t9!y+;'2g, 0Y]5.JT|? gզUV%.ňİf9"ڟY8@2܋|ʊ"zV[Rmg8' jBʙ"[n"k @n=ɼĪ1\yY[qcKXx_(p;JfcQ|Bux\/a< (H[<gYr3͊qڄM<W f,)j$SaLi<Lz윘 h(Kv =
+~ E/})9('[8<^g%,;`9\Q-=cd' #09
+7C/ 4AbBȅ-)$>p%(R?%@:TE*2&@rZ`ztrxɈymтɭ/^ ;aI8> ASw3|V $R<y!deB@]??!y5rȱD`C$9opTۄ<yO0Q\
+G(1js:1s$Ny$EL]^a#_!Z~J9Klo %$y|W#HV#G9kނvC
+7s8MhkO$㲇oeG|`
+:sAm)@Щh>aO(vN7frV(}k'{CI˷t;;FA9gx}[5\: ;ŗh{ 3\jd9aL!`:/#g|-j 3 ޔx̵W@QEaŨ:Y>seCq1B(rP z؛NJDޓJ;ז!
+ Gd8C8 e3=c&pKt2=yIW*:m č a.#BQ"\ԿA.DZXaZ~N6ri\A3L uGmr5<qA\4̨޳&aR,Me:/lcY#|ٗ_W{H}O8QsJ  *됩&YwE#m~<I*8ψr< 92Cl>$_BJEi-*┡ɢ֋dz{Ȗx_eՀ|z*f~ q<oB;jd qG,
+c Cl n^A~[|tfeAtPT~[c
+mڅ-Mx ;gX`'u; |<ɔn [(3 ҠzzORA` N7aV/@Ta2?rWsH=LuNy ݘ14yƘW°1Du1 ,ށ )If\E%
+߰1heW>`%fa*/aPMߝ8smM1l7 DS/6 jlSӤ/ai=6%P7!! /+3~k-|s@v}:IiiDy}$*8țeƉxt DnNZM7;l~2l|8p1)pqm^
+OsUHI2*J=ew2 ~U aFZYV0܀Ctzc__`$}v m<LלTy1!T5! X.Px^ǠF2Wz0dI`Esr'@XLR|*b#7>w4~l~Bt@?oRa@%MG6{9T(u5C{뗭2 ú8[_A17PǼ͋17(1PI$Y^>~ZMd7&:y
+>FpLŐ1_Uvo*3[?o;z}",<d9Ewm0D2:u[FQauhGB!09(ʖ<7)!]#XB4R(0
+Am#Lƭ+ Q2@JaJeb߀4ob$
+l$bi!яX݆*v)AzghV̅^Jb)?L
+e>~7K?T;E>X v!qlքCԜ2I |yXKB[[L(G MfaH%(5"s:Dǂ\^V#CM(@͊Q@ƧeE:
+w~DW Z!ejFNeRd}$#jZ'Fk$32mEM hIÚPNV
+av§(%|R-nm>ܨ*㥔2ExoL ֿ
+K-ے$)R e.*~K:&5J<7pxA^яc* DdlyTWXN Ԁv\˶Lʦww:"q.cPĞd;CoRF
+:*J!} M}ƛYE>6/2㠠ߛ%8edm/IEcDhd1 SQMIKFg* x"HӧoŪ
+ WFP@GGOE40 H?; +diU\]<@G< Sm׀T<I8)2dPn,
+!#`~ '.! ͇ &d
+X "dAӹcKK6qmd.5iFsTӅb,vBZGEzOmLX4D˛@8cI1m O[6BN̐PKqS\%&FžBbd|+U멾N1aynJߨpO|ňRab7} )5ܜ1[>JIXj l&F_n ۤM4]VI^$N<.^*w!<D3䞕$xVWIGa#.}>փ@_J]0;\_$}cڶy2ewcȐ^d~&N׽GOL)ZǢQ>3]d7έ3L@|;ғKoAlCE%F"rTO5^_%-Q>L5,4څSc~#uXFyop)dYtӜ"/-#ߛ䩜"z($˒^L.~le
+6Zh8uEQˤeIhIoT;##X,ִunܹ*uұJeV6,DS҃"\6T 'yM_?0E/Lvnzd
+S_EoD ]|\t~,M\Q
+V>*:جfފ~}q=L? Won!ĂيzCMZF
+a*I D
+vbX
+>QE
+Pٙ
+A&ɘ+FT$ڨ(#E_ ߥD݃Lpk)pdV;LgGӱX?p
+ECY߉W
+ e\"}Y<RvB2FzWB<1kJf>ٔ@t4!PwS}єE-tg8/,ϐVRw.NBO,M"Tp`Z~(@)?Ux@Jb~`94?c&|LV2I '<e߂V=KJ-kxϑe5kZY%7Ac'J=H2u|261`P:0U9E1
+@Ir]T%ٿMw,Fj) 1a`M3aF %7֏r}I\~HAȇ3R>0-%Q?c[f0࿄8+R砭Eƴz0d&Xpٯ5vK4 A `e`DZTG>8p9!ph]=c
+䷱&ځQMÓ3'?F@tnCT8&Aee1*좇?C<WMͶᣖL0Ӧ2IBb`8#ɟL|F:RȺBj
+/N%]Oai8^Xlz F<D6pa)2$Gp}N
+Dhs-X~Mběؓ b i+13g#@D)%N &mxļ-/ ?Yڕ
+ <ތX^6i>X|FH 'K1:?AKcB(CVs~ wN`h&TRpLފJ
+Jߢ>G%+EšӿS{$W%%WuC
+`Ej,*_y!ߒ~r^s,y[/ BMRb1~Hk,gYetbH|SAL-
+~NR!Թ׎9:ԺD@X7ҥ!Y,+&X ]c.6p49ty)^g?#M(mp<ap!aJ9[8<<I:Ôaj{#Ope8J#A3VxKpu&;F< Jme$
+Сu$3s3pO\aK<>z?L 5kFɗǒ @9WMYrq{"QuŒ-:Ur*HT
+ V,yOČMrF,~&:#-x.ß, YY3j:v]\0N=H
+=4ƅuX.|j([ެ.KP =D:>cs<N@mUAC6j7#y6dː+;ʂ'e%!./h%C]`@ bfp &a*p-!'q,Wb`K^ ls lkOdg9GLں"%OO`>B!xܫv{
+$G*m=`O
+`''gEo{ !!Hv0o#/@FfCs^yQALI3rƛ1ڂ]Q?l %Ig
+K!(*5ۊSxBB"hQL/u&UUЗ"T*i:*b
+I;;xqq}.Nxi姴^[Q)e&v?9Op.ln . b1w# Ͽ:" )FQrl
+|
+c#1 {']Q_fUr`r69B2 ᯂ`a#$擊7PBm U Rd% "oJ0+4-:z3&Y`ᆪXǚ}AрLc* it?
+뉃.4~x J>Q2H#g"ha.x `.iM?
+z\p,g;gdu2=y.b'\!p~4S
+0H2
+/hul-G7V#""[–$hS˦u<+Ct2 M9ɆJ[, JAtOT"Ķ!%(,h TQp$.Zp)z~Nɳf1"^XhAw
+γ *78e@3!,.8dk@ &LY]3!"Y×$ұp_ƅf ,U`AS0=Kw;띚'`>EY u*ktVij~vRrtvL/8kU@
+\j0ؠ@SOŚ*v 2j]nӇc*2ȝö*X$[D6{Ri=xQvm3E)3<?Td B֎:d;& XYίR]TBv4
+
+ҳZE*y% :BK+p Gk'G1QO:5
+1-teXOSlGiv++RH`2:Mb:ӧ)F"C%.wg![J(3?D1ꗺ-Q,a_aD*͹"%,dr`L6N&yl-1z tQLί0'+U
+W&JZN_2Y+#(Z HL.Xtցo:>*z|e8g Ք~AEY
+X .
+q4V4
+E/wUF%5O tqLŒyq˛"5mCwpK6]gh[5V4nV,1_0U6;S 8#ƅG "Nk(O݇6ņr %JRNLi}s{$MV울朔IfF'pwIsY"㮂
+s/R=͸dZ<(s܇p$?Iv9 DO; 8kҷV^W&Un[$A+Ns:jV]" 6#@N
+GFq TxVWRveĠz5cS8+A0۞&5*PLZmU=.
+AX DF@f*:ڬ$C~OnXGZ!If"@v:2si ai
+Q& YUS7Ȭ|ctJ($*9wp=誓m' [B^@@rQS]?*\`VSB(e4!K/W2(f,Os ]8Y,Vghȴ, "lw>AE(\ WdFȭ]A5bN)L G}pV{NW+0Qs~f +ö9wFݨ!܋RiE%cN |ĝ"x@ѝTE` yI&&b.(9)h+@~BaPL{,^z*Y+MDq7 AWsqğWl(UshD;1dU#wG;zA!VsyGbNhz{ J O*tnz.y?hÀ ZVQT[aVAܒS|F $E̔@`xl5S[-(uJm>">׉Ś? hHl>E42CDIL[X0"6&1&f6K^0u >-VPit)e*@g^4|q-OQ o =#p=au5wҶK] .7Ꞓ2V 'a#.LYv*=93(g[R ] DX*o5=Z)P O -Ī1Y[r_^st5?Vх XXHƳfš~(2;1M.AHBM>Uh%Xr $n@HQv~a(@0#NicJIJhV।0S>5
+a1X` 7XCH(iBI
+/dXkE#LDXi pFy"5UD "̊r8{.1H(m [B
++2U4wvU7PE#7p-:5Xfګ#(|
+2WwY$V9%Z N0jvuWΕu. 8OE@rpOF 2r B緋M ٫0Qch"mߠA#x 01
+DGc3(MƊQ
+ׁWtz<%ve?YԵaH '
+D+}Nx!TEtDҰ!a j Ū.nCP'xGs(:hd×" 45Y^ AH4|0 wҔ9>?lNj&Fe`GK6q۰`<!^lIX>k (BߨM'2(:Q`~?=hPǮ- %;ӗ{¸EwZ"mSQ^jv{琰o06mI,B;oU٩McL3[puUYd88Ȥpz~aP
+ht&ͽ]-6VP) ? y.=p?DOQDϭom w~&i~vknX+%QH,Hadݮ
+Dd YX4 p}ϬхRMyHh8Bqyb'"[ kǸ&j:3L4$ڨ[DH愰<
+d[$xifwϗ*l򳒏$hE|*.V|EUkb;E
+\rat ԆyxѬ<N$#">#g×%Tqun2 gJMgm5M~
+9>k׌OE*?'>D@?̬c
+4SLS9 FWs7:⇴W:spN*ަ!{d~
+pZ\ &9v)9!Vdz --
+կ49~6HM1\9&:/ -g]רA"L4,wapǪ>L٪Z_Log0ˣhdvXJ2R ERRkuM%1̖+()-"pfVʂZ?m) ϣˆDy`#z\r41 m_o69!UlUQ̳6-Ûő[d
+74xd쨈~6 h]kRF+]7cƝ*a)h0mlDc8^66/]>\g bō(<hüYt
+uqcxQ&w=
+PtFTbrHoT)8AFv;Fh*@,nN}y;5$Q Q`R%herE<h"n?.i<UTDz
+,Wqhsc7$曯e"q zC1ȃM,Fr=FzG.? q};Zڕ{ƀ %є\茐~K$H9rL ] *mFE4Pr!7пt$at"yB*r|BmSsDvl6 `4@bm$ZS(\\6kWXӏ,F
+
+.۩s`jc6ga`= C}VԢJ5l;m':/6n#IiHo"(ӻO6%'nMQܘ&ڀzyZLk9p(|㊎-L6~ fp"VyNy14c+&n#7HP}qO*`j6a3 x[%B?(6o Tt)zmI4{x[f)Zۣ۠\"a(V@+;WvP
+"msfѤA-"exPfpMPAqg%}gDRAf6OLRSZ䈸 as7QrڕG&af2>jz,+P?Ttw GPߜ.trb[!Y=QB[F2g4S\%!T.|QuB3ZN|[\(C(lܵ$"^D=F*`<+ XA$gv(uEwYȼ4&K
+L?~ƣiS)hRzBŘm)^\nA@P+ycc[U9Lg<(#ݤL/{ftᑴM& o w/1, Pp "-:P󂴝8;PA;5%=$ $]M7m/*֧1Lak9ϺMjJFȨ ȺҸZ=/0ĺU?Q>
+dDh"Fw3t*"Rb2O̞-BE]Lx)o?'chih.<@YV6px. 펓pAnM s}/,*q#!Z9̙:*L,#ޛt H=zQ*Q~ o{?RKK.\oD S=f`Up.'ej1Jm#܂b
+ȅwHi&Đ™[]𢊒Nz{! G-?K?3s̱uʛyblqvDK'a,K.GN*y-(Asr$
+۹. q5F1D NFMHF#Yt} OVCܘte
+HK9DOPw LA|˺fvHUi^H)OFp;ld>rF]| a>ǔ>l_棉j2۸}M? i|sjP<D9ed =Gt@t gܐnsdI>I \y$kI͹Ήl}J&qsmdX K+Hr3=݁h:_E{ kmhP9u3^S<5`S_ǂ դ祫m۔\ 7HwN:GSя?Tڌ6N;UgЌz~e룻zӬ֧Nב 1C
+9t9k:,tKXټSk!A(4tɛ9۔P3 hnf#eHDR`Th~Fڨ!<|c&h$]][f<ß
+Sr|L iM o4(R=DOI&`#<nKzNݑeoH?p5 #i a>^ț
+=O`0twŎ,~*PA? ܄S:l΂F594i¼6o\MSМo~݁HAP2wxs!8 YlZ 8z$Sx.#G4DGSΐoK߭TZDӝ)sF&@
++] -j :f1z^NioHnoK"+\HTajEj(UDNRH2Yc@1?WA7@/3۠ `=C !vwӝ X5^u&"]ħ.qߞO {9Yvх8(?#t"+AO 2%JQ?_gK(p_@X<q{ATH+ ؏u'z#GRףL^2԰ԙ|:.#a$<aйh3CƸd'! .C㆘mj4E*p܀r5&j7c(s_unkVɛD0Qc d
+PSi 7.ɧSQcT+ra<+?Kh82˱DhI$c}6荜GeV>2xrj}ԀUOGu&Pb1[YG1_Xlw[e,t
+T/@Z".ӿPacLYA&x ei.GL
+^̖s7IƋ n5D<~}c5(P+Q`"RD0~);f V~-jѨY/ kZrYd% D_N9JT}s*2ޝeWrZľ #oǨ'||;`QUk@Q+6Jy&TR`\6/f gV |Z~GwDoD:O+-oZ׆$IAD'R1޴賙n0V{ƌ Ǔ݂PR2{SI
+\1hKVZ/%$^>4#3BDPz: x齅7"7 dd֞VD}!!OhSk$PWnY"t{${ r7MvĢ2-^3k%y)8]@? t+G'Q"" x_CA-66b]$PK.̨R§n
+Vt7cOJHlϩL$;&q Mp'B[J$c^+63Å2LE,M0ȧ˽YE?N9OG!<_ʼnf({JSar\r)Ǎx!}2Jr#$;{ D4P~& 5.!+>-o` AQe9//UiI x;*#~̫<ZAL|Eg3P\0<vMg
+yJ G+2,ဌ(ي5l?BsX'F^JtApZ"Ya}iV}j6Xd!v4m]Nb.OP<%8
+}R>8pN!:l!Ć* Y[e wxsy/&х}BNq1" ˃ڜu0i"ZBEH,0f*xnҸWz:鯃nP_X1S%XaQ]}Ěx6J=6[]!$JT.UsI4mvݘ'U+AQQBP},Q5!]kjګTMJ̯pYqe p&(ۼDT^ yB5wFsZMbjA;i ^)MUT'uN!s0nݠ6r/!?cIk/ORy^v(&i.Ԑ
+6 UG} T$9C5!(k.V+{ʹ*JX9|=/cP<w:b25.YqH.SeăO5LJN78Ho>T'rX@vmA@A5!C-j+|A5!s]]P}fj`2CKg x05AHeSZ~Mn~?81u Q%pd `:AW?5Fު_DHb~K()~A#P(f [Itߝӡ&jVJaCVѲx
+,
+CėZ7vRK.ZLLs)EBgtBFS0k\}%"۸Br>c_n<ޘ y-J@ֽҀ)POM^-umrHÉ^Ix=;Wu`(bq('uP3DZ2a'G1[f;<[hEYoc7U z>Uͨ`R*9Z Va~Yԏ:\ZU@,i'%L`>sld1ibY&QEU sG@E%Mj tՃVVt6kR6@iAL= Y"#:A
+`_SY'
+0 d(O"w*AD1t
+H=%YFV**x; ab>8D֑Ń$~x?"KLFXF8Sc"9ڑ|w`Qo_S sa 3<1duJN+̪ƸZߢ'܆0"",U ;#z@
+=[EДEqZJZiugB3M"y΅fjP gNݑ#~ވlv;3%P؄|u$gFhVv9"R{;z!@Z'r+CX6JYZH b.¯ΫP:]ǣ-RJ䇲0.Ȥoi8![odQ#/C1AMsAtz)mL]2Z")9\g1!-hF?MEUUn5
+uw>FYฉz@
+{~B &U, 1t@m\L՚fv>6NMk.B7ZZޖ෨zm.ߴ6冐eY1+Row̧DD?Qй"myW ed!`ʺ5RZ[1C%4>X
+%׭r~`." U&a1Ѱ
+y`3]$z]ERc'$kW
+t- "t_ox<9V[Qe+􌼙:eǂI<4QM5Wv1L-U)G軱䩲a^ld;gdyO=PϢ(Ȼ̿,)<+h8L]8RIDSW;
+i VH% :8WL(H@(``7yV\A4+
+H'YxC mХ((:a.>Ց*f+^2 nt['ԓNyf?/E  txSq}z ЄQf!)Q4ti>KFS7*BZfxtP5ACA7'| '"5xS$ ^50n#ΨbvlUSj-$Hjܿ[sǹWU㕙Ce:R@w0&̄"*ZMmr漉1l('RpzU(0}6+7צD tA zF)5xo /̨ ÄQ X5~5Q/S B2W3K"jd&1ʢQL$FnxQi6[CEO$/6jN,G-
+expXX{!]W,a %kB3$sUCly<LlPK &N6A^ȣFck^&@VE@+]ĶmGjY\׽dmlZ,?mT~#fBw<p1v0|Y?cED`A6
+eJuw24ixƊ_tJi27ATl0'}B/'!AL ngK9Q2c1$JFVY1J0>=/+t1*$ lD
+h)
+%HԜdpcENyIۉATh˂0 M+Nc
+tD?{YZo@g%1$ /RB:S/xSPX-)VYI)78'fxڣ8*RB/B+HWQ)) AB19ybcʽ(g/C15ɑ%lAf6b<XjL$8òXIݵo)#֓)5RngǴ򂒳r@x3ZWIeU%[x#[~Ɖ6~;,-*NZ7~!븐<F9 ,$_(?>??~#~Poܼ!ya@HΏ- EK4N%1Ee^!a.O:m! G0U Y|S
+٢3ޯ VzǝEd2\Pjj!,hQ1 m-m_]E>YC(+lL%!2i
++-@戭Ů%Kt5⾂0k% aw8( -[>W>%pP:%I,RT)Svîť4S NW)D͠=YQ-wE# \9:ăS%Ŀƺ}IXOH"=7uvkIaL6T,֙|7ЧT?hnUkcmk,`}tL.٩,)L)
+NXGߏ4$lmLߨtQ4rI3<^6MQDI;n $|s; 3 $3Ӧb t- xnl'c)U)
+ZU~܂ H
+p >hs]+fJvm@]o{)5o]krݟ͝'J:Ds'qJYn4똛A cL4
+5H(>{MRAOPИH$f7H#:|e|LS7OvO | K@!_#ǢWK^_I);ȷ*Uv6#cn8"2W]3&]˳xn R>[:}VrεgN%]S:QɊn,hB+Fo`X:h &&UNe$cΠ;oZVkeYdEPl_rΠ-r n.1m&Cvq0l>X }bMMLbފPss[z50hA39:7rqTm$舠 aQ-PDQg }%φZj]H }Br#?h;e,BΈ:X
+>9XZ7;0E& QE$łbJ Z$&A `1
+B|1-?|AYZ$BY䒞yLpTaxZGoғ.-C<]73K,U2# !9Q;sdmA8h5Ѐp{`Bs16F9xPH2?,3i$V,6>ABтB79mcedZ Qb9rѣCG03{ OEL:MyUO;'RVPx3 HK vSR*:~Fᕢp$V~!a9 PQ&;"Q5YlK0ZCe[#vt(
+ǛO TҒ"FCh9>!7)aTh8 hj9P|Zhl`!/b/|Ob}`E_!R=JTԍ rF PvJ[#9$@e>;Qʍ0^6Iz8=tɵ9f%;/A೺5pݖ"Ll*ALoli[W/yk}} 2#]ʃv5K^% A+ȊGD6gM\'ɂYI 65J"
+Ie{'ʌ(0ռc~Ld!'b8csUIxeV3 i,Hp6 *}JвR[uT.2ʥ UN M\}PM \?B7Ĉf|
+_›1AqbXgxhl΀ eo{!ٿ`N&% d5iQt ʭYr\F
+ 뉫,@a_f1 (8oUeԙ)M[1V\"V (F.qQ*
+m.gov?*̬0VIVu]keސ&yCFp8c*sU5&6|HZ1M dž4I}SIЛ?]> qJ~ Re%kʡ_/ :>~㺔b ~0AM^Ρ*B#Ai*zUI-d )FDH-=(UPRiZZJ9܌ӡ&X$-Ed漠 R_o y&9sCu$z~c-8@ёzso'
+ m\%r_,FD1nx! 2uhcHd$]9]E{Jxݦ%:ad2P+W7KYS>W,I we 4͑70G*WaI8b[maʲ;r UK 7mX ;\M_v52~(kTHst-k0o0.& +mfXTGMN(HƦ y67 (*pĵ^&@oY}@,"8E;F$zZW
+#R8[>UdH/g&0)o10T8]T.LXf+|~2jƲ6s݈mnGXEw̖\Rjͨ(Ͽ T#AC{ebTζ#@eop Ly@d|a0)5RWFoFyAS<8 BC2NiʤNV+oZ Pi # !&P:1 E#1tW-ſ7QUBC4rA Yk*x~s^ִsDN7DfMKQ/ej QȄ)OL@0tzCL2q4YC8LA&HP$:Ż2evfųVhs1b nN x@Jܜrq:Qp26CLGbZ){uӤT-< (7L
+
+D~I:ٿEUH[R?#Ϻ!M
+'C m̧V>bSc/e D:yXK€Wo>#XPe1!<.]E-IQ G풏5pQڱY9
+dd0Hl$V$R`aɃ#-K“-Vm2U&&\)}ŊODI\иo-#IL]2ڢ[5%qWGVWьgZȶ']AF5!+yW Y܋糩2\\ g#t]'qIlᩊfUAH"=r^*+P.,{*T/dR t!C 83^z%+!]S)9ϐTG4Fza@h$ɌrzXmud ɬNwcܵ;1b> WFuԒ$ (= 1`@i!l/H2swVlqvD
+}CUWL@ xco#qAF≞ m-ipʋ*s/3i%Zdi qh| C
+pNt![He.ߢl5ɍ!7{կA
+*9vG)
+/ ."u ocĘ*8Ƞ0g|)NVH$;xVjZ_N3t $}8*x:21Fsz(ԴZO,̊R}U,fV`qwjaap6æ2J5 {z!żfVXz9@)b/sIA,Z040TK79i: r שi꧶9X; |z¢Rt|^M<aLmsli+9c2fbD< Q.R"]
+_*#mŸ|SvRr,m^&hJۙ7 œө.2ƅQ@\a,?̠y8mOۈc NzV#ʠ}:QfbX0Ҏdc Zw2?l6 a:W ,(pHbG}e`̃Sn`{h":I[Go`O{ud A|Ծxti/ ;sp:A:ÈP:n /z6h]x$ɉ$&ƜH/p~]\!NW fyh8R<"˘c{F 'C% qXϫ .`n$fW:5"6I;oyK4ˁO{@!op<% ^ܶD,h+EID+TXTFȢ #!Y)%0<OS #9g
+F!ȞK6_ ^C98q"E:߉T~N( a"08eeVKOVF`?\^ot\mbu)=jHBTkNբa1==U.Tcg&)ApW{]( Tv+axuaAJ[8V7;x\CKIKH.ip^@rK+v;1)v (ʽ (,zYC_A}9: /0RSt -)?/bҠ^jK-%VdLopg @H7_<K|Ĺy"H?n.?oTi2/feđM1)b)!ʻC^{x|GuR9_x/W<Y:zCl'ևj֊sApl2yJD$U'>B=DM7bj 3:myj []XiXcbɐi8Cd,i[ Na(Tu33E&՘V#@P%ѬrNTmi3R;URV[$D"yX IC$<@l+,f*G87W_yX\U1¾=
+%)_V']m^$n
+s# $km*6ry,!o${Z"| 2f
+r+ܹi3b6]Gv2nȤ#vٻ!P$<IGm$ŜΖUH8Mbu&5.aI1H9F
+:ͬQ#2Ab}R!"hPܱ VЎjdWtUiCl}4ţQYȩ>@h ,N"b@Pbzs#H^.ԔG
+]Ѡ'q2d]
+`CDHK{L%i$#n3*?,P53<ި@U> T'AE]bA$و|}Z-8,AdBG٢C`MEq8&Eo1h+3*IJ
+Z5d|{3A'Z b JPO%*8ชlk*׉vUF~5m3v'&)|@u)DNK e;@Q}Gmw޵zfR,hj?(DӋZX|; m@Sy2|]AbݷxHF?J%Zʜ^45wkߑ!D] DAAw3b32tښ[F3( ?sPER_o ߭د'̋mE4AWWD7,f gv =Hlb0ʲ('maibG1[Gzu)# m&Ll2Rٷ RLABDcS1ɺaS
+a q$,kTˊU@X E!D:uPI$-ƚgİryI%K5l
+1
+dBwܟn}T94}DEsV(Oziu)-Wd[I@(ae(h
+^AxOȔ=9\PP^Ď6Κ
+m^kޘda^K;n\𖉓:j*zan7d~ŎKZc1Uw
+*3f"T59-]kzLndm83?OMT:ˑ'7ryU整s ƓK
+%Gas|14 L-&=MӃ/M kRUdE_bh<נlHܞ*DGL]3ӲBRO(e4 Z
+uq=ggw<T?_y> {Tr>i32"☇˱bwŶAĝѧwX
+·*%Asr^ "Ue؍BJy'/ (J(q~vkQYl
+]vn*S8½gV[
+Y H]/ByIGI0hg4k0SB(
+]9*hZ8vX,,>˵aH@_qS8~)![H?u[_U&hΞJ^¥T5G5"џ6VOB_OPa>vfĂ]õ,P5d
+/[6V{]5Uih ]*{7x]0OcHBЮx3=c}a7qt8XɕgvT]m]8dF K_O@ɀ3 G.;C1C\,kE17kA؈OamNCQbv)1 Ei0P V_lrd$C:]4
+߈R|~ n/c]6tYcIۨY p.[@%W(-
+.<_J1m-f4;GP{Kkਫ਼ձFfNy_JB{GKr.$04Vu&,CO4?B›\ jt44+ P8KI[N '_V,ЌQq,A7zJ&,C>J  2l} P |8\9BǠӜ̅ GBI0?H5UMW[oNN}WW/./ݿ]7L C@NǔCn],c
+[
+
+.'ﶞu0՞b9QM
+B&D D ۈ6U
+iFDz#OwH)7'J*A*n%,C Ʉ9E@9ȵy0 uOP_ bk_Qu{*<־ǵ`(W+!4f9"|
+ll4U0ΝS^Xn0ފW0Ozn.*DLx?fR% ]K!rXyddϾ>h qBA29nbp}t ^Zœ3POulw:( >_x>Er8`rsd.>}e 8 puXRJ1,΃ޤc~J+2s\P. xS#3oZ rhOCYV\0ye?U9YA*
+1m3l(랈Dj$X173PL Vb/}`%_ yo7r*QSzx_g> #"YB07k
+8mHo`%HO'[ ;a}{$ DY s-Y2wtgoEMnI@d@ȥ(&)y oljxjTR Nb<Q[!%Lp7\+ɧ=rӾ +Z!ˋ"6V]ݘbx8`&2?$ Z] )QY>??Ȭ$|sW–r,(K CA
+Ρ-q*Otb
+DAoBK@LKqK`ҝGorIKɃP?Spcc񮴂ՈP+,{]Y8lnu 0pH3U\/-V5eg8J
+hp4JeֈB6 cZ6bGؠA,FOe2%˂%ܐ Zw-jvH0t/8*J欥"9cE?2Y.^a_f"ݭ^@ 3/Xh%n2W5p[R m)sSu9,?EF<`㋲-WPV{ EZmW\YԺŷn׍/VjKv7t-R)齄Ԁ2Kܺ"oH'`)K w~{Jg&J$rP{AU%VƈЩ9JD oDD|u8S8v|t~NOCIhEz
+1
+=
+sQ%8)Cw깉HL3%aiȹ
+@ Gt@4/0f%4Z 7uPM$$C@j]b=|((PA"x3<+KFo9l=e̅Es
+HMr$O;
+sYwt)an+7W ?>6[/X˭MQ=t"tUf}u6@\\fUOiiScϏ?c5xm 0]oxՊ-(cy_Kb_=]+o:O94p5m[o}갾ANLuee/
+n jׅ$B3  Lg9:i9g;|i58dNJ]JH&=ϊ IԼQa<)*?\8>jfx}NNpsA4!𘏃\f o`^t1 _ҲGL3<ZN\tJ6@Q5%} .JcM|Oeu,7y $w)OBJ:mdKk[oidv۳V*
+1Ij"0\kz01!}kɋ9Ff' bCfgYS.uUm+r<E79<FPQ-w6զ=Ӱ!FDexUiļ{iGfo[o aDNM_=A 3AZHφfs*
+
+z!9m3ڝJC1UjJZAN."p"zm }r[@
+uՐ`Sw ꙯a#rrLW̟tbK{6 4u 7[ѾqM6):SO;ВUXWL y+q3hŪ (Ӹ/a٠jSrFupU0XUCn#hQR1G6D$ٛ뽐_M\>tEӾ!ncgmd1c z&KxuлO;:%)2E4>$s Rx  BySM
+ż$rl Y&AזY&[#]~ss_լD .Ɓ0#N4\p9
+D8OuQ>fjI>9gd8NH8l6V64i҆RP`:Dz.HO4xBx{K'uQ&, j۫6IWx{)Zck7D
+D23<v]B+,<7OQq9dTiKff$ )^~kgmOGg_cGwN.K#,z'3 ּ SXC` X7+|ғtܜQzVB i/Í(Tp~2zsK๬)V*f"}POaXr{M"l( |
+sK׮,A0-^)s$ĝPޛm
+;fty%*.]^Z\ηBp~URБE.[ BL^ThD
+҉@c3K2f~
+{-nb8l9#q|΅†Gp0y9 azqhӹW=](1$%"
+:$u0^ήiXap h/cm\?f_(uVçQh1p]7ISw@\F}΀-r;n 'Gc[?
+9*=d\a="
+ Bw$k n<NvrG@@J* v/) C-Ge{O
+A@GMG1C ʆVWNu.xu/ْIINF%a
+/ǽ%\~IrGsD9p
+Ǚ YJwƻX.²@iX{!R]ܦ,y<΁0@zXUJ >^s`of9)$Z.LTtb8q PXʰ(KZkݟw) X1u⨏'~S1nz4xGh`*LCk1aEDI߉ûn`sncu p
+4B A/ .,Du)j"?! HHw|L) ,IAw5v8Ogg񵢇1$, 1DS!74~#Bۑzo.2)smxKAP̳ȸ7lX $j2:`Ad̰8I b+gTd$`ߣW|ǺQ+bFx}<tڞg0g/QR\.Q-$)$4l$َ4&ج5n`]cKMCn7skbrCTc9|z%*Yr{z3'?}9bmՀRo@쯛)J#,I9Gt%IlCO<WzՕ@Dۀ1fqMuBQR=_tUw M䃜Z8H 1-"X䌯e<O
+4 հ]i~ng4!_23sԲ'PLQ9::{E`i)?^ &+Qa
+T{@KY4?iB'gh 3]ۖRB{XxJFն]-ű4ְؚr=ͿC<ZMםP' xeK%CqQ J^$C+R{,ޮ k`4aAI0E2g.#\}d-t.F?:)ډHTxyR
+QԢM
+,AK_^Z܂i.HNO a2ٙ^zÓR:$/o2vEVk *=`>-#T s"ACs͝f)<tknE`T4Jm,") X~kضap l_}'vJeq$9(zC
+/G:'hPyy̴͢   ӓe;اhMT7ȹ#!ZiuHWHЀAb^<݇bsj[.L}ä4wUr jpv YX32rtd!Zt͈Xa|,ri\ۚT,R{^"qDf~Ue뷫drF.] iJ|D`X";oi!ޮgYGja3$ O׫ڍ!7]^ЖiTvOĥ֧jUVy7Y5SVac̶j!XXHc@ScQ3 —vy:y*7L# [u'يB;qy}qLkO}ķai\By)
+w9;=Gbg &C~U7֟a/JsHC-W
+g
+ `2M)@ dL
+[9lFHH$JɉReԡc*Lɀ:`'T8}sϗӿ*/T H%ᮘk1?|Z!G%Q|̞V+Wld7Ii?ERC3LT]O1&
+^ Cc7[:#T)M݅ys" iݴ \FنU@(͞M*K&$
+EFVƛ:u<fq6MIҖ)\F,DH}*[/MLu>aHL% M' Iu ٬Y2g N6IKe0D ԽuXĬ\T:
+-5u` H>3: b#Vڿ?r Ϟ
+z]{s*Q74A,{)e\E~є$/"~Y_΅ gꭩ7ّ(YTy-v |&ph -TC]<4f{ F`j22]G =O_<Ȭ>]
+L Mi ??
+c)w!1BaE {':zdpU GUeS?H
+Ni0)c{L~RBl>:H.әtKs0d3$<ES #7^Ml%Ltha%-bh+0 _1ߔwIDXAuCKEMi%hI窒 )ؓv.U򩫐=x\su2@$M5cP2U^#1:i.) E&:@JT9=Kǔ3}xrhq-K=saDL-f_z Y~$ggHP1טU>)l91 \U
+u9@ 1pIBwsgSkXC96Jt+n|ASmAu)(2" kA^z#=+a0!*,<++gӉQpk
+dڈp5-dF25^|7PF9-UgQVF'N4ԸR QN(o}A˂Q-^EX _ޜ@C
+oPT7@R2Q~$Ih
+(@-;$%4b<m)d2+Pio-6lmsf+!0>D£YFO'%@B۔J
+E9jRki~ 7{ܤ(
+ `vQ_*#ՅŰ<~:%+ФZs
+և0 8aCF|Q عE
+le*lZPRV5f'*!LqF6
+БJ 0/Zv+w7&_?"d=EPĵO1I6 oGx%@sxMDU\mъ#4Zk9-愤bzQZFPbԂ^;{S4]-X27>w N2J|HlWpsQy 7[ʏŅ9oQN&L^f@ C'_ˌic֥`
+8]1Id:fGd"ʱ'%]IFt̅s 6J!HwǠk3{]R/JCHviuhU%Ɲd~&i*iUU$;t鱟>m?-U9K)5Oť?RXUt
+CGCFjV1\GW Laʆ-IF@[^D-F9fM`exG%x*9S@SY
+[%qM:D>$H*hn&Kz>̰/]ۻ22d'ݧ_Jq,[9 b4
+1!X͝\GuT'9Eq5 A,V[|z(c8Em`D@ 9*#dOsx]oW" +
+ʅuuIIC,fvE`zJ'7n*ѾerxF[zxJ~H!%IbI0;":E4 K} JXzB("&(D\=K߂df8/kA\QKWX|^[>'xHsyQϟAF֌e_]t6Cv~Y\"MWzpEd'=<.
+k{FƘJ `J[5 doIŘ!>F u 4HUףPZD/vfH-8(: OtJdA
+'v
+.OsuCŘJ,gp.K7l9bpƵ+b\IbmOѓ
+GtTc_S{_IQjgr@s' 1UWIP>z#"OuQ3]a%jRט*k'R)o{6`ji YfKmFqϹV:l}k_`ޔ07U!r,BnyBY5Qel?PI Kp1PJ1=g6ZFIlS12QG*~Pe`$=AMA rx2W
+rscxֈ;Bvp _Pq(FapMY-(aS{soP^.f#P#I[% X}WA6H;m1G-aڢS aQDzc W]: Hdn=ތN2@(&o58Jz<|)[9mjt`{lO!8cQԳY$ˣњ)" "qC:ә(v@N
+{4g?:Aiǚ)
+"Ui
+we5<\"!g!xp~
+QZlƑ{Zr yz\sD 8D+HP\
+F3&
+k:Ȏz*N2RMnS>?|K " =+w|ZGɑt|s:s |,/ŻF˃tsz v9G1fBG3rކ`Tͫ4g$ywsjZU&"1~鐪 ~8l:CQ4u<iXqMnb3D"[hL"Rw0w ?MzumoY)S1JrF nG匘'sfQ{uNhB4VPoNjOK?WS_pZ#h7/_kuagxF;ć Ax'pH3*  T'G@82:uםɩ+4R^K:dؔD2N>aR|Iѯ$M
+ybYzC9߄d0>!o5]k*Ps2V6Of2cN
+DF4yӃd1e-=\)7E2<"in2'1{7k}MBfcS)Ō'[]D!)VA+ 4t,GLa ኤ8Z+'NcJkmq օaFbc ]3kBhF7uā);6nâX:ϫdSQ[0:\V؃|JGy 4˻ Ug*QWQ$C6^ud6وScZÒҜ^] kϝ\@UW&;չíiA$)"MA65;/'e$Gi%mn?S"iP Aan/Ԓ5Qwj2S1ͥƂ L5"71Pb"%VsWCCxX yZ]P5_l\ jtbr/A yB2ԡ¹bD$zj9T<=NEqw; jWh;Z~;yGX5zZqwLQOT~ۆ^
+C2QfB d\ú^SsIB y<ј:V(U![4>8Y4Z7l.3|p@|B~V0Ymo<2BL*d]2 ĿZDL[ X/. 2֪Н dڃwRRN+57P0{&6EZk ԂeXj HbCE]wtp@0&)
+-i@G3 .>|(+m4ԀHX yGt!a&q i9I Ǡ}dH@y&}0R-X<Wyቍ At"TӚw`1h $[ pzM2~$zG*'c1(D%̍%*[<oB[[O;bLPHXPVĨЬe,
+rq=A䑨ЬTgh-ɴa2
+޺/򀜃 p>*pb\U3XCQv(<}Iy4`Bj՜9[oY#E~@,EM0]3M _~ܞZ1aT6a =ZY "]FP5\!r4㊷NڅRJ8.cI]woLڏ*XjndܝYybh|V*Uot^Lv6ð!Qg
+ti 6*"YirAqwB
+C{@$PBсF!byk鐰PY&GYG{ as@Lr6FTdWY9㊼,i}y\SAm5lG{?H.CH3OtMxɜCbڒ]. x?R^&8ƻ.EJfObi@") P_ I7 EW=h:웱E$e*(_ 6T$nY :i=O]BT`|E|S?V꒛P8J=Y OVTC8%:jn./U!y*TА <X N,s?0vl!4B(tN"{`ah1Ix)ϦCMhMd>3t얬c zVӛC8"þ ?I+<5LJ
+b,VU%abH^͂Uc
+jwW */l3QB o+§I,@k ^Zv/lPh8qyNOwF
+KdD~1C =Mlk
+~c cICqTpX8b.HEL xtxraƉ ,۠Q@@m6H56^hJ"-qBV稘8{iC 6x_u(9JG34pE`B&F )oH"<$B i=\;>@_gS}3 &OW aXڸ<`lFfU vAMg9]<nKb{@*KAݛUUgZMt"^$kE_r'542ult G
+`:u:]B 6
+s؄z8v?ߜxyK,(oI&Rd6Љ7$HBOtm<r{TXmJ2v  6L)AÖ ;1#Ru-ķD*mzj+h}ـ8V<ri7^)*R
+.w)ɝ~M03ߋ0"
+./-yxl4""y /i(@NA  -L" y`M.ά5(Z,~}l?>a"13;8fesAKEqઙtJtd 1ԇ[^Kh،أ3*H6.#N~+NA}F#J[%S8Iib+P;PQ5;ְЕĔ2Aa{'uqwW-bZNjr+ o(`a0#)hZ~
+f(
+1narl#TCxP)jhԗ/q@sۓ< #0 pel8&.2g5v7AT_>coϽȡY, V$1"zpJalClqvӾ( %ۥwKQ)DH ZHO1.j`#ϓ`p$ !n
+}Hɧa$5H< Sأ
+dL 6N 8@5Qd+Nxt<A/m'PL=D=DPּJ'>1a&<`g\4
+Vt*
+LѬܐ!5NŴ"Ep)ր07hWKv'W=h:@g]d/@n#M||eITͦ`^֎Vl*0|:OHTl>ripWEs*?|%DJ͢g!d{hr0YSS'=/t]
+;JҊjp\Vc-ELut3J${@lG(o")xtUYqXa-!R
+gokFrbqwS^#\OgGGL
+{wP
+ _t*@KY|$\=}\7W.t? C+bج5m]͎Ð3rMEFM7$va $:Fw*1)1QoP,g䎫;/8 H(Hk# _=ȿ.'a( D\FKG:xtEo8?L4~ N^c v3;UZ/7?$$4P9#|k'0┲gN[ {¼VlR#ͫ[v{uu2S!$[ڔ90C_H$oF*#`PF_8&u(/DMt܃ ) *+\䚄[I0JPX> O$^!I#Ϋ؊~[i/FhCg3ţ+.1
+99t_hшec3ř#&
+"DQ+\27k鿞Q#bA:9B#yULM[u,@ȝ|DMἲr.{CBUΞR3B><weU-wEUj:F2Eеm)1"Z yj~Ͼ1򂌿o^2Uޢ>(ZpbS|LW뭦FXV
+*T9=Y9CW8d4?bVdn)NMΎwh}籛_>*zKpj"nk.w[| ] es'٥!<
+CyC]MMU耯
+HMn$7 O0wIrn1@VoQR .5HgDPa:lDZۣyҬv~0Z7q2> &ۄb͛ڂ#U}U´c+m}L먭넸4m1nѥ6\J륷֊sϢ=:!\3Oꦾ-ԇI>~tPՏS*aK<e|U~|ΫTpU' P-&zibc!L(Ll O袝M^*rEC>8ZCeڽyD jl7Ⱥ3MC8GҬ67圹ޣN_MFHQZ㉭JYkj2!\<ט·ZfNQF; Hv!|'C,mz_ x-כ$t("}7S8"11WU ʆJU>íVǂ0B 6ĝ2D)Vb,?Ws*RRdBx`cQڠmt}N(8}
+[00au`ʭ1”T6y}
+b/D^2=ЧX8,F!6YS_fɥ)IT7e SyNd1饖NT+)+U*Rf "`9 pxWl _do5el=
+erٙmmnN?ǨL-H@Qbl  B+sȪ_^ 5l235p4:QwPMSPe Ģ]T荓V3Q`2UGޛ Qg;Ȝ*䑏a0 S
+~S}>?P,|JD*&:)sV3)%Ue0s~ǿt 3v[̈́A3 =fz*%ɬ\K"AkZ BdX]*^Ky
+̤T"mFRi]>tTX$a'D*]f ACyׯآp0Jc3uCD5 GQ]my{ ^Y[s2ʞ ‡Sj"S9 IRQh2? uF܇ęS`ED|!i8j. L?و,p8΂RQ}o dqTRwa8
+|.W*%;vXwԄ?N$$Oҝf{8SߟC}!nCN]h6'q_>Pstšivuā0K߄PH)㪰#;0U#
+yí~aʞlY" T9wPx/,)1q 3V"W&ʊ
+ChD
+,
+ܞB˝SղJy
+1ÍOW=-uEG3CP%%|QٓFJ5$*OqVi
+/'yKUl6>5W2[Qzqp}sI}J.2~;2Y/9b EP`ldǧs!Xfk, LD7ƅ qL~l>CU.ia:cA[FYCCA+
+P6w\,h;"z/ TRѽ ig )&}2-8k-̱G"cқt'Q^WF1WK)' *ũߒ@P49=lR( GhP}~#]_y~ LK -͘>Ppؒ 4.3Ŵ@N6(\ؠ<Yz!\zM&0ܡPb!>Frl/!ɥ'_?q wӌ_&Gv+CO *֓GEpRN
+d}
+1DʎJSx'?̈́.gާk߬kMSKyFﷃ~VC^ 2()8aB'hI>KItbq):JrA Y2:&Esl4~C X գ:,!>p',J9XIDE[Xߜf0K]&r@B,pM`_KD`C=Ӹrk\y~VЕƿ  ?=h:'Ibi9`
+pADɠB0okQ+2ų"+(yϭoiXK]ňN8IsFH[1] ѧ߱RPa7`)
+)%h
+C>~S2'eeX_0oad>1Ǻ-Qv|H@wCigc Y F𚄉7ր'9q|מ:FJ:/U]tnknZ J>AeQGTi&+(rİtC4/P'd;zСK3X!*㬏؛@MU# 1zmкZm#U*9A iLs
+)r%<Q`_ ύCsl
+Ekb(U*ם&c
+Z q@P)6jήa#ͩqNYI)DbAsfi*眺_)!&amx"o.H"ҌuLisK.] 3ERO|
+Pݺ
+I` `9A-s5v K]:KYXZɻbʂV
+(ks+v>U&gT#\g +jދ 67&rRZDB@ QJt6BY}c' ˶5Q0<xSXߍZlZH30K `L7ŔCvBVcO07 @a6J6!0P nh4^KTnr(42_",;[ ׄN=}Qy>[tŸ|Yk6_幉P+5hVb*݅8po8($Mh^9LLab9es#IfVnE~TfdӗQg
+\+I]fֳh8#'nDiu?9ltCyn! `u:!Cܾ5D{,MeKU x0Iק@\Ք+Td}*O4N4<0*@6;E
+ ^3oT\$pBV+X
+׻-HRr u%dV#^oqPYW,7h0/eɭ}am߂zdfHwTE[9RND 9v:1Iɡ@;(^_Mz\- ?Etjl+a
+BrX<Je>v* W
+sg{pj0!
+'bIL8y}@*ͅ;##{}pqڠtўD)#.lyDM 14}3w~tW'gI5; 6Pw5_:5bKn5m}_GG"()}[!6j/'v@SJ_FW֥`-
+b}n Px!k0<WD4V(ء9;5bU't~62NB𺶾Ío'[dBr~3$9BiGчj<@k Z >:ocT.! $wt/:N~-ֺ'!6pBc
+EARz#qV,[۾44ԻU|jk? coNXDTܭ\6d| f\DܺO
+ 3:w Zg-2Фk[t-z!Q0^wl L ȸ
+K-RfiFDe)4 隘piGU'iMa Nj ` `v-&DŽse4u'@s$խ́tNKիUk2Hh@m@ɡ.;NC:.oAk9[nd&@:iGۊT䖸cS~v9y99sBGI zE;S#
+y6SE.qAdI{@HO":l0k;*
+3AI.R 
+
+ȑ"pZ!6dlq.>ɩtciC\M ٥˛M!/Q_W
+e ņcX{H㑂m =݉> inP43* F.iX13Y܎!k?3ЊzL͆a\~Sp1sðq
+"k<
+μƨB#dfEL87wc:٣f0:sK6Ye-BB"ZLϴG5iUմ*2Hj_P55Cܣ闰HRto$ef ʲuo
+Gl]/ k V,V^ς`lݕeTsqi
+"3&^S=F+
+Y-:q"}4$3*{_.wbpSfr8;{ݓVىP~՜-^5U:xΡS5G됥C0m@ߴխ፥ _*| aP)H#6хLD4>W] }^Xfʁpc_fH8z %O[F8AgѸ֧۠.s_RVۂLiF_qIjfQO_ Ϥfh;%1WZ~ 4ߴs(!MdpV.܄9҂iIA-4"J{6p
+>T}h+"UM7? Ψ{Z.4AÚ BzeLFAFw~m S]`yb#_Yc1IڊiW FY4Â]T
+k2Gd7 % [`iR hfDޟ$W"ҺG*/
+BGgWt=L+_ )DrHGR/hTP2+6 YYnAs," [( $K7S6LuGRa5icDy ErؽET"2]Å|/t;hWO1I d}b<Qɗ.S-E:ΞWҎvRK +W"CHA lPL 0B0=WkxxL[ ]cP KWGr>r.SnTwfSz)nԭq7cs:S)IIuM Q+\%Nu(M7fwfVFő
+~xTWAs{Y ZDIOͨ(mV5AS׫1RW{hW3&[qϡw|J}ø $}þyk,~CgM^ڔ$@lEDJ# HKL(W'3(bTcWkvt@L1&՚@j"=fMgfb
+}Lwec:-1Hm]%|c[;9 ,mJS]MZ(pfm$(CzVF\$-?TjVU'FOLI1X} jӒ@D h{8:A(ܟF[تiG#W&DhhŤhYXi!˂iȐUî!xuLbE[Ⱥ
+j99sdzt_CP}DU,@{;v7RTT>7AMqB2{3co1>:[ZcJN7Ȫӽ9q^svŷxp30zlp?a /X="YRV8rGƘ^Ios;^sGnΑ92A>*叞;WK5op
+B{$&3D b$1F
+G މc͔2 {joFdXt > |#|d} #:chّY[yR{Z
+yH Pi6E @K*)љm:i{'U#h T̵1-FD&4kApCpqH{k]W1!&${\TJ"c m,HSԄ% 4-.kcX-قp ے<3iAH1T͎2XLXr!5_A*TuB"pad^xc@s@τS|En 6 jݫE#+h-7k_UnP{sV#a
+2|S]jpe%"*r߹
+iȉ6TDԗ*vfYb&ز'IQ Afe]i6H@h͊pbCs1^K`)2qwЕ21=J Ynn:duN*Dٯ@eCYK NNvM?b%HEg}ɗK(Cr`rG%%%'>lΊe7OHof,I*XiPͮs⊲{`b\V)
+T
+0",x\16J(CY"OOu׸p )MX{vϒS0!dRlg{QH+qFbPZ@B4}zBؐMvAH)w|W0/%9`Td(hDx&×TxǣJ !IzJƉdnW{Ll&j;l\aL% 1QnA:*0]kzԅ6fSPٍTOe (ԊdJ#C+R 6tE __Bqal
+_|ҵ7
+)luCqV|dwRĝsqnsş+D!qYe.s)W=%(Sn \;,_}E{ڥ7Z@! ? '#dTޯwL`˰r* N˽sي[_ydD$< 6Q s<;u]Z֯ԇ"^'S$B -Jl6Ժ9kč3 <V )bGRSߐV{zӈw WDcKUd0Cd}ީM%gQ<>qcn?
+ 3bm
+!+LSkRH+/S ^})b)x(.MQ,*7aFIF|B$ڒ>%$(3m[|fG(vdxHP_@"MSr7m;vc!ar=旎.:ȫDEGΧ'65%8䌛>ǘt8]@QzTJT,YؗPtâ
+l6h Q}
+W(bwK0WH>DF C‰z!200뿞ppYP# ^d UR }X .l>T t!T'+P1D eSK4FwISj5^k$Jޛ:vEKϏAŽ[l+g%Yios%qp傌!f!R<Na`QF=ȇn"Ҏ+F7 ;K@)d7pV%,X9ؙz">S(d<> IQ'29?BfҞlH4wWQX-9nQ:ƬrquaoYtČF V$EU)[VOďhlaiڐVt܏>@OZbqE\
+FX4$*o *KZGj)!I4 P n7{D! Vh5.QRrj5OxpN$Ɲf t_qpm
+n{ߣs۩]T˧<nFJAEN^>Y؏38qMI:䨜K.E.L~NjDP,^g92)dH:"\0?^v^ Qq
+r]^v?StR׬I`oYj$ŀ_mf?
+0V:c\;>UĽBx9D-fk1o{zw.=(
+3)8{db;j
+Nn/u mo=Lue2
+G.OxxPP
+c%3Yr)Pz{30,N-%qhfpq)薱8J}d8V޳]AM/bn@ m `6C?CZ_(u#0Wsꯦ*
+t2xo?]`:>e.zڿ_YRB
+K$TĆ#sdFK $bbfC%\cf~W/@ypA 8jT>rimgxqnZ
+DV0Z`FihBM"v?p3!H7<Zj1BNrQb-$5sb݊~]6yM"ښ.嫂Y,p[GD(pc]WKa?%]3"1Z|ǩcw"I5bŤĘ3
+QHQSphf1!nMZ^oJuE\a"9qK<uA31'(/#{ hCkCOBgrס+tQީU1|tC>M5v_!k6d.\˙D|؟aE=Ra`576H45<JRǽu0:a%36.{x[zPD{<|]KMDYQE Xue.&Y{UW9ɜ>R&K6I >-k4Î@ADؚ|ǗFWøL햌<
+>kJc 6A",%+D=EY@[ .M~Ӗ&$Q l +^<B(&R>'!$XcƒXIޔc(K:cYҘf_J6r@j\#=P ̳mX2{2UUn8E'"K
+
+l,nۻtCiz#{Z
+6FB1?}PF1 G MצbC+ua ځCЯTJ;Ӌ>w#H!*a֛@r;$[?`2v`Ц7%EA(鸣E1Bߊ^m;u*4>-²31&'8?Cx:=x轂䎐}_mt_#Ay6fɃH6 #<#7 ҷ:rԀ031dⶰ'O
+}*6gX.U.R vE s+\hG1Y*ٔ0W,4
+IK[H/ZеA_J:TD"/%:CQ˛෠| I@7~=짢`]TۥÌV
+:ZAYbm:(cܞT—́0>|' c68Q". 6֛XYkJE~Ȃe~SĒ.P !BG`?I`Bɚ5WW
+MTyBPrɳ!Mq<-Mٺ!AY ؘLN$F鋋!bAFwt<2ɬ}j Ifa7B
+W@>ԽW
+pa⾉'[U]Ն͉% f~ mN0L phbldI|.Sud/H'ɀכ)86E2*ۼ6{9=MwS%V$p2Q}Ǯv*G$2_t*s ΝbQ<f\[1+{<M+V%;.]P 4 f& ڻ`MrTyB2Wf@曑k'./oR
+u;Ia`NI
+ XuY0nR)'BU|Yb ,) -MM"3!L
+y:Ƴ
+kU^(0xz.
+ƍqUX|TrO `w9R&Q|VSNN8;|6w 44GWyIj|]wxr4cy~T2K [0;4uz514h
+'i&"{QtNY$ePQ@Jzf<4g?6ѫї H7ٌjtApK㾌rHcB]9>*F H {CQz[GO1L7FCru!u6THԋ'"X6$co'be0SԶNf47]#14SjW4$p}4z 2TQ ,Rȓ4
+W \$@ruؖJ4zé#i}K׻9Ɠ:9jflrž4xM۳?y`…/"~<j<CZ
+ޭE?}pwЛeM5)?d(Z
+{m$.!f}QFbF&f{84m9$o3m+`*㎈g֬z0Xy?KU0bR:Z>f-@pE3tG%w`/G;gV.e#/L~_ԵùPS vM
+gm4r<Qb;p h3ygy'd|]u~b" %bz~ǧmy
+U mוg[G
+HK\;DW=:)cۅvݫ EQ{I)=cx{VZjǷD-|4 "zw)Q'iÝOObQ{̋(+Z4^2Z-cDz{i V,Z+*@jZuiMw)T~+
+B:S`8&إ*tG.3C\Hw:9,琒drwq91Q )ՃJ!( 4 ;OsPϒv>`4ZNIiG0KH<.;PMYHD!޲ιn{g0StV)|+c&İ-]ˠGZzwL¸& Malq2CoPyUVby m"\ފKKdAH4'WDt__z -J߀d0x7-Ry2]@2B
+sY^&,MY w"MR5F|@=,Z !.~'Dg^/~%/DS'r@c>uZ]UaNzIdp~vDSxҟ@22˙ZYt#lvɈI}7Yҥ54WN'i@_Bl(aK3RȬtkGt7Dv]N "3wqu
+SuUj/Ej X5ܺ^ݽ~=\)_3)4Ŋ'( :#wYqgU$[I
+Cyk;,pFi^OЈt٩`cj?_e4wXC*նa"ZY'>S@?Sz TH
+c39uIVh mvaA
+ MhvL֯º9dJGF~ *u;owxԓ$Dz }[PH7?j:fu*9i>YˆMt랦1-d( aYu8a7z~YxCG i! mTs_e+mL_ 0,^6oIX@O;fИOߋrgNGV9 ' KKg yYTPhCV˶y=xy2Z0yyNZ>j c֒x),I莻}RabB~F;e $)[W1ؾVW :'(TVr?$'h!侘jS1Vk̹|/#~IP,P%*[2m&cN;_JvFA
+HCܢN5)LW&D!s
+>~C'ϬMUZ<֤7LR]aPmG|BTR#l,׹
+FDuBA&"9b
+C,D t^gBf6`Ȕ_ Ac$Vc+"P}=ߚ IMVӋ$mz]tAWsY?%pHt=~嚎5
+1 m/5bWI&8Yd3'jUGW$&S51V|eA<KmrM!(I/d^ D~c
+z$bPfjW_H
+4FP$=u-6:B~y/zWytSDIԆAS!Sʹ9n󑴋$cvsُ-AE\̭y |@n=NPtQ 1L[)B* U"l@x-LH=OQg!qIF'84eL@ \}R~^鯫r)!JZj(qޜ2f^AV9W-1%fju945 A9o>ݿޙK`ːIFSO I5HvX #O#">NȀi!2>^H?@ͯ2/RrΡmhGL@ z)*w#^Xuf:O~ÿ7C<)b7 !.Iv||/ANv1/:'(_Ū?}|T>*#5B_=hu [f|TFAʀp<)1N_GVEҲf3=SH:J *I zN|]\*Ҁl 3$fîIXo:,QNTGgmr
+o2/:SֵBtwna4d`|R!|e e t,?g٫_%0)ۓBs&ԫݫaZ(% A@+XVy`VO8\W]ۅIc,j&mjK6\7wkxNhڠ`uJ
+TؒOŽ,V[D/"R=j V
+]ȀGH*$>"8ܥ3u
+0̀I\GDO; } YmR+'cDf,kd%<$ǥ/GC
+v [u^-%7:U 0/#8:
+nd}
+l3( I|52"Cal/țG$z/%ʑq0%S.*
+V Is$Ex6LI/W#|L@"}
+րK!]2=kb̞0 BLNx),\c鰬;J08ܐD9w\16#ɝ@Ap' %;t Zl!ldV[# aZi$XuC4
+ I#aо*|6;x4Q}lRSvQ%ix_JBfuzYf,)9FҗvX YNsTcH>;.Fƍ e OB, /TX2ka,ZٞYBJ(ݴq 67^<"Ox_z}3,sL;T+³Fx
+ML nI9s9c dXIu 3n_xy6"N 0!2YqW#KC&6LOd|O̔(ɶrfH~
+?@׎&`ѼŻ;v.7$r (ƊdtnVa0Gk LNƓ!MGrt)1+>kcH" o;1/kI6***ƘIW<wA3$$VHOpP}*XG:/*ȼ(,Celыm%L^|ӥ?$K/@\c^J .!LG8tL(V&|8/%X<L1VrЭ+\l3^7xY% ,7lf=QKt/A
+pl#qJ s"#+x޶R#WFi(3'.֌QqJz!g}ʥ(:!%0!U0/ɛ޲KIőVY)ta2gLƆ:%^@L( 9Lc@YUv(rOx+^5f@]IO-im%
+݈Ti辮FKϭ0 +Doڡ$Yd2pR+ 1l.?-gYYnYf_(
+D
+tnGa\ra |aNX{;s|EQw1A.K-XUן
+g&QDL΁UD-f$q!+h ;ehH:S5b<@v2k= $xȲ2fv횲<"cH Cv rp<2x[0wb(q>+kPLA
+J7]iLB+]aaX)
+II4!ҩ r3QIP< h*-G2> Il \
+I~ XZPIX
+^EO
+Y Rw Vn 6xz+|.6TcSU#Z9ڒTFBדU ´NbKFq3
+H֙%1 kIԆ$U9k;,=3YrDǖ֓nYNQGL#yr89ߍi_)ϽhM6ɽ8Z>%BR-ّ՛\nX niQ5JXA#H֌ī|F1n6Xvrு]Xp7=_^q(F0P8%ímW 6d񹴍NaZN-Kt*q3~zvdlZC}ϊdJQ~2`?J Ԙ"se{zb0d}?Tq=N;6rq!%iys8(cG%)̹ۺň ]}W*+4(!Ϙ{.s"Ch-cG`+UIPFaWMYFa0k
+@IVJ8927/3M?? %}Fد'PÊZ8~"prRRDtZdJaI@Jހ,=aQZ`E sgkNs,9r0RO
+$:Be TDAfA"@ْqDwd\p'L=yH@8@U/Nnx΄~wlH1?^ 4C"s lr.ʅq H
+
+ 
+Dy= f{lk#P`
+zq`2hLMX-!U#vQֽ_L>NCXVXoM:rs@']O
+uy-5")\E'/"B`5b̀3zEjrLr=
+nLbֱ}ψ&\Ȑ~iW2a9)*0 </͒onNɔ^}"m 2Y|e,U1O [\wDn쳁Ԫz6 -d K=K{'}s{Hn1ɫkCj bkJJaa7Ⱥ
+"bA9Q3>,
+?_09vFEZ h:1s6q|ԯj:$6Bmm$&P#<e,3u[BZh4¶k`4HQ=*0VFx;G T[C]t <q' ǰ}#JfZa2ĔttVfYMW1
+fJ$6(@WxKua}.3$ͫ҅ T-" k1.RR}b)kL3<B_
+Hdaag d>unغ1߂l @݋vf3|$M;5uW<kj8x)krc!mVN %!h0\)\pYfhpNr#EY SeaNADvț_|JefɯB~ )xk=4JmQ{^N%-= yۍΈNj^{K8@l[#v^1^&Ir%7=A߁'(yXSKBfZ5s
+A8IW,-^f9!XS$还-oIL;봍:0?_|?eAD
+VbAo
+ ̲˟0Tt/ł1P=~X Ы2aD=Ilt͵/߄J,?dscktٹp,
+?'j˗QIR
+J!waaFNNZ(4P ~?d<Y(/_0 5|
+|-dHf|lS-x,_J KX1/(_"Xm;v 8U<RXYvm/^@~ sή6,&pk,ѣ?L02`GF?Rv>,8J)rCuJ|g'"кÆ$3[~ᨑ<.g1, 
+IP )oa0}`Y
+67\J$9sQOyHdJ7+|VD
+(R3?&E?12& 5FZR`ePe 2QT
+s.ŁXh4OQ!$Ǐ  e2\Gno.Ï'ZPDWH12f|<Ҕ) 1o_bc]Wm܀Rܩ
+
+Oq-cǏ1) ~O%4 0=;Kg~;: Td!$0_n]?~(5LjZEEZPg0e&%S~'ˎ
+s)␪3r,_-t#+b7&yEt`LDv=SU–% iY0 &&Bu nâ(m&38]On橪yR|qL݊nUFI{ҾT#K0~irKeT =F n! %(r*
+j]m-Og:Bopc8
+<9=W>CbZQ≽2?l1IpXE+[0p ϛv̆esy
+؅ Y=EI(!,vPOֺs"nSG΄C~5u
+_Ձs G uP#%'/T*@2l5q}6_5-&@zؤ\612x>I@%uΨr<~-d9=$YXXH({Ibo/#)}FAyż\McZp_)FH@
+i
+LNh:sTLZI`L+5vѼ~9b$5gs"T@5}umHJ
+]{;,p 1uyEDVȳjPTI[\ ;sAH9qF0:@Q3BodgϵշͥPWy]' *9<I[m1bY;I%?,o.|iJ.e{Qa5MQK>inA lBKoK-9y4ǸguhfTeLW;v<+_W!Y}`PVzI%ɰ_b ?vȀW=aͯ^a a$겝5/to,o1^&u@=80ky[(+[*':W
+@אEs1Lɖ3G*N@O_$hq(gΏ)ظQ\pըDȄ0y[1ri3HH8n OT&{ {S >`1Tx2GWyf4`+O0YJ1tDٲb<FobԺfپて"'i;tAN
+əi$ܻ. eP-3e $ڵofn(Qqk J!UոP>Z9,]<)GMLhTɄ5Xg;ItI0^SAg`X$Y(`aD@q[qD&cNL,a`[=b_@o25
+p1()'E_K2|$ ftp1IF(H$[#N(~!̀߄/uHʼnx':
+&S`+b+6`[ !X ǷtO#xӛX0zyIQ&mYU#}k5fZԵX'#1*OqVk"JcL+
+qҒi/bCy e@¿!E=-}˾~SQSN2G,蠁R"-;q@0Ƥ
+uo J# =Nk B_c>K5,ɣ&di.U&ic0EAܕQ ]8 .%;9)x'"gCW$1fhF0q61<8-S,vNٔu܏d66
+X Z{;Uq&aR[ `f}ӝ]7Qzy'yH\7sa
+1 P$ P+ĉ6y+A5xr @8q/\Y\DaO. 0ff1j _rhoYn6
+L{_j s(6a^bF}S-Fy#S+
+TϦgĆ7/'I}z=gt+Yذ5)%Nf}"d)F %l4ˀy;B/_'HS8btZA 3/v
+mdRtV^z>6Ll~lc\|Fgoj}c1E@oW 9ٗ:D1>C\j(fTd勥bd4iIsDE7CV7(ݑ $Ӑt@vĸ,aAd8Rl??&g.OAqϔ8 J&#\6K*HȒTy_R_luز|$UZg4 ;l,֣<c9 ƔCu1Ju ·0bpr 7s@8
+品hOdKGZVJlg4;̯+qz:%Sg@G1[+ 8>z T,ny@K%s΢BOLIն
+ D?08!hf9
+"G\fWhȠp3jspJkl'm $4Ò2 }=hjyr;gU;c<jDX4B QaByW9miZ&9=2
+``e2%^xmtrf/$wJ5B+ ~̊7m+RFr!p*[:Dol:,·E@/]Fnm 3 f8Si4x X߮Nż9爛_*@3?ȺJ-SptJæRJejAÔ
+׼xq(!٨W?8.VY<;DZ|`6U0v6y$K렔bK `D
+%U6lE-rp(?**}292 Sg ijϘ
+~*!
+!@084)3]8c3A(^P َ/I⸮2F6$Ih#Zxa'i
+"yiAa1Aa4r>k߆2Ǻ
+BkxfQHLltB"g2
+ͯ"d0Mvwnm)u7:A~Ϳ~@'GCXKRt
+rw-1P&~-a14L!R%(=$>`钎u[O
+$(+Bu%.D "-A񵮃Vrt`̴(-eWD R;W?AܯË!fc#>
+h&-{\ 2hj)Ҕ*[AXEŴe0T"ĸU5z T(
+oqN%Mx\'l1/
+ewAP,vCmc8cvHšcR~zbx0v+&%yuh̥́
+6̈v"@!ŻMՆ" KiWDށE.wHD368!zX;h(2ua0D,%C0f6y%Ȝ!NG~w
+3 e_%0~{i [„xa Re-/[צT<)CۃB? Mׅ:T:e:IpMEZcx7\͢uFYM6GS!ɕRR&@BUbtR"4.G[Ia`E#c/4Ӵjg1ȧE9Geł!HL(C겕=a(u󷖳 DƅlɏQϚJ~SgZ^907)$ QalU<@613WX$X>u}C6B s5.^%'2J>]֧κj2OgH!uI 4 %} :\w{G1IӶd3a_
+HtMr9DO;/
+)ZJ# ^Z6 zJƨ&?[suRqOgwOHkg5ؐ 'rG'9%(eS.bm
+ZZ-F,_ՖԺu}n<xe%/ܢY2״(!yBPy.v"R*<}AY&TXP<Wr[%&U9}I,^usN-ϫ0R HS H[ï}PkSU1oAr@T-1ҭy"7K?S?Q1p4Bix057',5Ԥy}Z4y݂tx>DBS7hZ,1KU$o=
+ߢ|"ozРo+$aG^eD[E%MGf; (?Nz&7is(Y NH z"#ДP89gL$Kg%^T)ѓӫS2@}R"i+E|H%㔧.~࠾H?jG: ƞw[!B[B9%kjڡiEr<Fw4qAˏ1ƞ0 ~  ߡI"'YMBHǯzF㢗JU\s G|R3Ѷ%ُZˬ6RTb&3Vf(Y.}9iFHCљ&(HL_< u7 D">&.+h/9ŻbByMP0dPđkzNl.ܟe -<ͫ3x3!l Nޫ
+zϫPZEO&jM4g%)`
+>ɎH#`FMC)y"YѣL~XGIѼɁo (=w{ (xNwa;H|`o*)&&1]R)I.#9Q
+1OUԸD{0;9_3dU_@ f206q޵RfZu=lJEWII Ԏ ̢#w>R,)3c GqHe
+"*} ul<ۙUMDgH!.+?& !4⺿`(GQs8OB^ L[|@0Szl`eKj'gO\1SDN6$ѐWтDyQsW #o u^jݙO S5W Ή)pӣnX;_Dvrvw{j38]ϵO)ݦI{5Dg%ZјUriLˠj" ))1A -ǹ ?twW&- N449F4|^7kAPsNϭ̮cdpXtj$z20Bh2x+@xL
+(;$Kv8LUEɫ'`Mf~bXxAӯJ$1, ϣ|L`e_kX+醅_ף}Z r=XHp`*4ȓs)c\C~94`C0QJ6+m c P{Vcښ憩EjI8-(X(v?0Fj,~MR*rHq/탭L!/s}W!/E"
+y v
+Gf%AawTЄd!K@~Gt /)A5
+-X%K<%Va|,,W+VHM *IDvb6Pss
+π/ҮYpzLV0,GDd~a
+`dz+oW)Gh8kS>2*l؍X
+CTS2{( ΃ǥďbP?%<?>{!+UP̭\</C+<,6v$JrJjr<c
+dĻdi
+ᶗ|/:OݻF9Oc{C@_=UKskmd
+.Sd.1:օ o\{ 6uK@' ja
+F;'Q21L<bcPg YJDɞP<HLiioa@6*y Ti1"p[H
+~Lmhl,'dJI_9R.EK++([[{SVR׏{ A
+2TB|ڒVWȈ;{W (82@Aۗu9{Qg_Kql8~j˶$S;薕Tb67X
+ _}u;w2J0ik3ZYrxx<1å'^Ռ>B\/YE/˨T돹XJ@%>}yJ.[Kthoy1i</uڞ]U7
+:՛ b{kň}, vh: :eX=;
+U%Hb2K_ i3߂9k>^
+ޢ n>@/% v;@NphU,2k%d=#%dhXjqTB
+q+Bj\R7r0<] qliɲ~xDv}/TKi=;&`[KK ?丒@Ay^Uu^4ba)  $rd89׾|r~qz:q!ׇߋОڛȐV鷆?S+Eםs ؒѿ@@Sf(e-}c2p×}u!<:4 &/oUK-rE=*ӇUG@'s(&+`Q`7Ȕ#䏃#)(WpS 3d@k^ʙ %ؐv֧HL[mŋ=(#X
+1 @'Ii7axjv*E\u(m
+Q5-Y ' ` j$`~h#)X?D T`@E4 A@OEo5>F`*[m`"`u@tNɶ鯡(ii e4(2_ȅ(`Y`rB_/"T41N/$Mu6f`0Z(SzTE؂\k:{):pXት-D )&fs/].0~] (qV*"rM(FXo"n wܳA,z}fޛK$jk%"R )8m#,`@ryq'D(;bY`u/R?$y jlS C<Tqi5"v1pI)jF- 9v%]*RGƽne4|짢
+!5|xjSc0RMr_~3J+T݃IgMEףn g\2=@tRy
+6ò1m/ qaYVa V]-)ap
+fCmTKyx,᪁u>V+"
+%8cb3<ab
+hǫy7jG|v{Ldk1]?[9hl#2g,"Qq$eIlVI8R\Pfs
+a3odAh.< Nuk$ɔ>P4<[HB1օqp 7<ߍg&9AVm;r{A^!:yYsH 7_ͿDwaa=Zʵ ,B΀g BZ}=Z`fxX1φ0dr4o>fKA\E7ŤZxNِ: ,\e2cI2ntFܬf0ӧ6~{&N):I zBh"\dcPshrMc"AÃ; 6pMa
+m~J}
+:p&;٭\%QC d -ɚF~~;ْ/F.g NR<S GQ?j P#(Jd
+fZ9EP/x\
+wFl+TG{+:E^&B$x پ*7Btdr-r%35_uT'NOb\p#,h)DV.a!][
+ʬm[/pd=: ct._MHJWSFsarvypYn1p"{Zv(
+.hr3>чg(sEE짱ヱ7ëe$4RdVɭAYrƉФ0B"N/A 
+,X'DQ`v7HԚb-@ًp@4БVM%Y+&o1SͲmnJj?UK+Lұ3'i.WV[LSލa4U -s5 Q8S숡ob#,΁x!prM(:i$QD;X0ۀR==^mɱڗ`RD1EsV~P4n?}&K0ʎڳH?ԮSsΘ6GWSHZй)ZӺUx}fpnlDE1UnſB\Pe|PdRĖQi"f
+GiA^IGv(aV[a?$O~-ݙ4aӸ3"2!>%
+FFtHr
+-9Sp4Tm NYo!Ir>EcIW^5HE$_,([߀Xf+m{%lÜJ߼^pKpsk*F2NEBx<{mV'
+r%0s'0O. |rDQW-Ġ X-ruqd((sdIv|X{~>hur^}SiM1{79R7c XJѝp
+ ]}pP&Y2%*c&kufJ/pKn$#4jԲ(aw Sʔk 4g+KSZ"|"ײh]}B`҂1UKBrbg$~.nRGmc ʝXtvpT<-DyxI(If/2St5]&x>Q
+SQ˩'I00j 5e8
+5xrJsWhJFxN6^N 09,O(1?\!kKDN2(KlZdZ (j?4t ͰXwCߔI$EO; 0kjٷm[
+M= JDF~ #L% ;xkk&0Bl*D4Bl
+C:KN;RED0˒RğMPb8 8 ו"k Yu+^$蝝>`\$,*̌}F^0F"<! tr7Bp:6" WkOYjYQv[X0(nAzDP>m ޡYC ̵nC"*9*!*2: A?+ޛa\XVf<eKhܒ"cMh<`kTӘˏmy>=@,H}
+dٚueB
+k$y лzRf'\/2. ~H>x^U~_n 7þuŽÔya&Qe%ǬcX"}3O5Gy
+x;oGu CwBάeG71KoE%2Ni9 #_iSNhIB *$偐%lz@??޽v>`A3+lϹ`m1 Yɒb HyퟅxF`)ƹc2EAvdYDQ,lk'OdZsϙ/L35+k P[rú5OB&_A*ڥ8bSO1bb!({qr 8vcn1l:/uWlF8ȉN&dP7$psVΡ7vFb_c<Ӈa<Skyql$1B
+RA1 
+~'Ȧ twG[,(=Q2S]1B9²sY31
+ьy@#ڱޏ&B^v~Cm N(9AVɽLSϳoR"R4Ny@I` V!Fzk/Qpr///[G`k|)`coP v`j7ZsަbuBY
+OҨC-U2+AvcfOi\ɤ5H Xr(rGQa>< =H)h{bפTK-߄*Unav5q@PqZmT GkԨT[s@Wu:_ja@0#0iW/I!h .'GXB+eץ&'~*/ 5kA0UQfѤׅ`%E"ޝHJBe _Bwz oх>!?v-ΡږP.Jat8%$ "! 2)ymw@yڨ u3Ɨ2R9KHB`Gy@Z}:{B|{wYb&iF,njߧѕa|Q>:@7e՘=2ő_wAj},D@` jA ,,9k=&\lؕ6W_9++ХWrF޿m
+/3$'P2ѣԢ٤U!;%ԬU Eך.c$Ia V[|tAOo`TtX}セyZB0^zKpu^آ ZۂS1(k -/4mGzn.D\d 8FЖZ籠=><سCIh->|3Y 5ˮ"Kʳ 4=Na\.
+Vn/=]?_::<CFQvHlr,fw:d>C?v(5 P]#{OxQ&y%ⓆKKbqr~2ANvk;RK=Xz2QS9HM+of@5 %&tbVIVld ,^rFZG!Ky0x*YU,uSr[Ǻk߲"iƩ92E^sTe0)Q#R2
+I4Bg:FD{ꝱIAgw(R=uեjoH$Bi2
+sJPȺ<lE6\a o;rdЪmH>.$8԰`IJ<usEnP:Z$TORFq2J椷NU Uz50 vʠ};UY_Ya$m7Q-*KǓX FC\P= a<L娄W'ժ>X섳Ò";mnI?T4224='^Kvx` g7AϓPM7."1>_,rVDXN[#Ř(1$
+PL3iśbAk #1aJ(:
++/dDK{ d׏SQQTAӌ?\r~,.mKLlKOK,C:ע/ʜ|@N`!r4E!-Ҹ!o*%@rUB
+Z16&J}>)41PT0 H_ֶ~(an%8Ưl% 4Ț{G'}5H?, 9Sm>F}])|Ί^aaUB%NxQbN,r ƹ3X=Z9nVwOyAiӁ0WSYn~,zǓ.U#íƥ
+Vd.yi C~z0D24\yI`4F<U<y<`8'c*B'SuD
+>8*cѢL_vč A/9_TpKuŝ| 6#xgPF9BT@\l-pC4y`S=,ވf{;D=&0j]
+J2mF,i<]
+0\zmjEm|{~Fh7(ۢ{}؍Lf^Y6].bI_ R*!aVyTȮaqܗI"/C3 ՚±m#
+K^+U!.++@f`|ZS1Ӏ% QT0UCDSd.Kr)PI;4>I2?wEIthuY#<Jz,5,exN^
+Eb8jb~4K ﲀ
+[#w4Y]-.`Gt0普`3p5" @Q "g+,
+gx,B|/6G  #A-A[-ύA՜"U,`0$1B?"d♎ 3
+z vѓuIi"8t0PYrړHtDv99_\<@uGvC%e(ڍ1}ʰ (="*<ЃC0:;,FeWuڱ M)ILV?Q Hc3L)ɅLIT<%\RJn帧4L[uևȀy[hd~/⻠dϳ-|sGtgzSwǬ>ٚWN)52&?8E&xQ"\xy"-|E^]7)i27 ƃBٍF(aK _:;{]g/9 #tx Lƴq>Օ0,x?Ƙf. chC}5馬zkO!,bPI?-}A^)bZ!Mcrg2l CQ5ab$>:i#xN0-D!4 M.GxNSJ6 R#ҼT˪I"u 7>
+| nvq6.`5#)]Q>dv'4[Kb.Nn]Ck*1SA&Ϣ皿/jK# on:?N$`gG#N^b"](*SMX, Äu76H;'^rJh66H䀨!˜y_gbl0q
+=a/be4'}f@</)ܦ]Bڽ6Z7n0TиoG]laF%,?X0<Oe$q'ku͢QvE^Y&̝0JP Dg7g:0 qEgUHd@cpSđghs1MpJhH ?WVaƆ8ZdJz$mzџ͇\kLM/Χ0XuւɃ\}X#<oWU6O|X W'T -yܚ7w,hU{>Y_U䋸ĔT?=늋yz%tyk a6&Y(Ddh#&lSԋ 1Hm^Vo8u1w JKdžXo}.|-t[Dޮ!&F|GR0JqP֡|O'li^X
+c! !xR:E2L/{sE_l__
+%
+)uz!]aMBҼtO6Kf|[9*ٟ29npʁ/g9*htfL]dOd s)G/R
+*E{@o~8IZKyvCu2BPڴ7Rcht
+MAq M ;Y=K~~x ի
+g0'VK/<VC$5 +>I7.NZ bb%%{@XrE!9N2\|]sF|Ck'jP㍀J,kS2qbBR +x`3y-P)n9&U%CpcvAS|- r0͕AS#a1xb(^ ,VIp-]Yq$ىdDj`{tyUVWƜ-ₛRSϮiygѯ}ѹU\L۾dRқ#Iatd$f(yD*@l(`G""XsBm|)_M[yq=$r
+ _]?z2<tG
+Y s=w>f wz(m͌ 4.)f
+ O(.'( R3 ZKч]n.,Xι~<eJ34`jo섫K?_ij,Ta
+>,I6Z ZqRCL)p9[@rmc+|6T}h"[/Qz۩ݿ ᚼ]G׸iݬҁAPdB:.KR$߳PcQ 󤤒P-=*ǎ̰(W燇QdD}8ʲyKΉaN%4{󋒬Gqxε7Ѻ?\^g
++zdٱ[= FX- 4pr&^dVn}暤+In5u)>[{}&'å$Rڈz "rNROc=<Q K8;
+N%g3ɲ<Ct^7 cniϒ#s2-i բpbPA/
+<5`?i6 tqԁbBlOqu+@Mi. !qΖ~-^ tEᘄzj8Ȟ3|ԂD[p=`+ɼoZ<cğSyjGT]On%(RK6u
+HMr\9O;
+;<
+pYU{(ٹA Twne<2Hnnѓ!\i_< 1)R*OijdEzyrk9HuОU TFΝ8ydn@8U6 Z|CԆ Ց,
+$qҧ@FO/7 iHuV<%hnc7B&](`[d>,XV+]TlF[HK3zeuC:=(5SIƽCV%i;*:PUݐtuó%K@9h?5
+Dk8A? WCn[M%:Mpz)£f;$ up
+8UjtKc. xl׬?LB AW,@͇\
+}׹*ِE_;,A}li7Tcb㾟ur/ ɑ86&]fC@<.Dn4>Gv)Jl,6|B aPRs&]z} WyΚJz&yD8Be$࿖==M\ędjo2%#`b61 e0/'ʤ`#<aՕPXҝ[ tTf֫,)ˤznaj:yD[΂@Hs͐)J'v*[BdHY
+AĶiN>]l=7TM!ud^Ngv 3w #1Ym;S
+r"Nd,Z[j^:wn7wc
+#[Hc\LI:MNJ}AyK[]3$%epKFPBҳTC陈~A71$ֶ.|>l Fq(s!&?czɿߓtPv%a= a!4^8(&TyESwfy搚`q 3pI@q\#x1C/׈]`T 91caujty~02Ov㪬Usp[PUx@yse*CVc8M-HjȌ DrO;!ά<8.;9 1eq?w %h@'Aӹ$< uGZzmnǼ(¹^@K]HTq0}䘀t]dd{92Xbfԫd)&r^'HW!@]|"LK!8K `՗j|  "{v%(irXbd0 )6zC܌~9zRC>b9ngM)^">o2D}Jj<h TjR dN
+ ТzIk"7}rnB2. 2GUI: c_R\-=s7VI.. 0byR
+LU"+KȒ064F~K">"⶘W&m((,l^`$dҦpfѺљ1egq]s_Q86K!"%/+۽uPBn!-"DO$0'U}YQZ4m 4ǸsDp2;ȧ^;y-Xh$1 Վ1 da Z<EiC[Z7r1:%K|UM
+(琴Jql\' "QNN<c{t<ϋnH_)cFVhmٶء%0:_aEnLJޘyI9UvyB(p }e([h@^BE=pj3XDiE$2R+b}8>Rz8Ph@ay1"jCs(zIgٝˍ.nh5A*- "bQ
+],Tc9IJ&@dL눽(媤s ^k=+2BYzt_e-_jzZcv{ȿ^@
+`vNyU;1> d}(XsM6vlPJ*1WZ
+A7DFc}14t+_(&B0\%BX4\ȫ}ST~n4Z;FHfo C`B!#:=
+4}u#5J=JhR I>z+K.=a֧~]Hu(!%͈sN<NitY1[s,d8bUF8Le=MJ*D|o^"v]S>͇&\7/5~rBd@ڴXh9יnsǎ;oݹ#cmV>YmX /& j(u)4CWwaq
+q7d%~WyFI9\,0$DF
+D.ٚR1ߔ|(ЧUI,FL6<}dC <vG( %1/U岓LTWUc{2"(i}]5;VO.(if4ǻi-aFA#[  Bn[
+"91Hjև2{a˻We*XQ,#,-C*fU3L!LQgoYվdF7YϬ:+u7/Rp;L !^&70CfVM9K(6W}H$Zs6i; i"%H~KDC
+UJ Lz:d:[:֢!Dތ?{&6SUj $'x )>a_щE6d:Ehu: idqJ;0m4Т*" <m[آ\LE6M Yһº.kc2<l)A$xI* eA?0-M Kŭ-IJT;e s^V,('!ぜadv1w !u-r 
+[=zhc&mt
+/A./Z7(%mUb|9(0px؃ZOos)Pr.\tAf{. e1I0qF$P*uC۩ du;>ΫsvsXcm}B.<Bb$Omsڍ4~bqFj`mO&*.N&?}b5&$Οe KF4{z s$;"GD`l\]*}aw@N3dy., }hgYϲ-g: /Uug=R1T+e 04 ;Pyv 
+&j*?#<| 3waw@N4ޓAs@!d" m ],I\dK;4&#EQFb$ pH#ʕ +w2-`D$I?v< -/驰DǙn!
+Jׇns2c;lDڶ#QF,kSV
+s4Ń;Am,QgGlCpQb+7G1@X
+ΎZ6^LsrZ^ 'RR *_dA+N/>F
+v9,iRH!ϴCJ.8pc``aMQ] 'h<*AY$99 lƨgՖI$47$r"oƐmf% @0X;&: Agmm)h IMR7 |lr"S W-ÚhTI^ƅqd쓺l
+Bwԭ[ h=r]W=0VOR+P9B_
+iIRywȑԐ
+#wq [ldDL!~Ah6n`H>0%_3l۰!E[@!&8>
+*3CS~Gc"! }Az( cLMj
+[+ko09N)AN8ҩƆ߸v `0-+1ǣdĥ|uƱ<CW=JH(gif
+GNl̄oK|^RX^"%d9GHOa2 y"Dgl9Y y5JFuhd3/2IO,kyЅP .k%BME'1ʸ'LؾmIIT@+
+#?F6F>/5ZKf0?Z<]\fKX/V/CeA8#_%a,_0WFvM{VR CW"^tST9y(<qRnaG b`pb s s74C!UUm[25BfR*nA0&GI|hP%hjÐaK{c cra'Ү+eLb#uv" f"藁w˺E#IN [=0
+1Q l
+ z,y2 ++;(`exd,La.^$
+"TF8KWUV_tBL8WluA DDZ D97YB֐vjgR$Ibuȴ-/gE);*[Sߕ=;DGu:ߗ;3(>edJJ!~Dp@k@=YxJ<|fU'*b^$Ø& $u*qbгz~. ?h(֭fbfi'uk <: so|3hy9?ㄨ8A6IB;,LD Q.HcljVg~PO
+Ph l7p :1P.cS۪;@yt!rVLR3we, xa˳, eQ>7,lg/<LߔJJ>2(.K ݩ"0}^]V)Q 2IUК1:œqup+1 N'e6L_okDMrIS#j9l'HșI-MĿo,%+yJh~AÏ1>(C٦7:ۂ0  4R69YD(㽇ev\Nc!%D#SdXLD3ĠbL'렩TG純w IUh ,>yRWX,8[ j΅\ G@hTG]n@ĄWބb"ؕE at *}I
+}
+J%}@Vvs%s+WI|7q~0L5M<>L(K1jsw1CO<4HV:Gu5C #c,EkqKO/:B9d]ҏ
+>KiiX0,"U1&2XJ (Rd;!-g̪hI|]fAڔauYXHr{F4xg+u"*aMj| ۴p |)ԫeA@tTB3ugvF`;9WBee}I%"4:A.A&<FLt͑0 !kt.S&YRj$ۈ}ASQ6eg"D6&QX>Kec 
+X!%0H 1u.Qmp+1_,Z\p-*Ï yλIp R;H,0u0Υy*גM^1h4m(T9%@E3a@B&
+Sq
+]8b`_&#ki_aY%a}tH
+ ߼ϠsKGY3
+@PH
+C* :Q^|vʝ1h ^9cG@7P^m c@\%&vRfMlʘwX<,\
+LEYZ+./f>Vt}KJ~92ZFn/BN;'1 .*R9-\0$;cv7"ؕ%k6M?%Pv½Mpd<w#q^E>)[ZHJshkӸTt][]E*j!F}H=d ԭh0v~RC;pKf
+]0C|w١FVi_;Еu9#ms|Qh)@mN)9Kֲ^@b8gIcЫ~^Y^Nd;A悙giw)fX]<+ZD[ᨾ"i:Hx&cwYH
+6{9JFaWG 0CtˬCZ%o#oJr=+F
+_xItF ܋_0F>G}DO"V^ ؎4B}!`R#K1`;MdxN!N!*Q" ޯ$_ >$`n /P ~Re_ H叝 Wү4!̘r
+[vxBz|
+|gd]$+% 5YuǪW7
+u 2%^ `Xx^ޡzА8W]KD?44fxP>3&0CHU3%*\D!=Ga yq1#;]IW**zdjXBk8caѧl$ʙ[te(2OG,;A
+<OPM1Ѝyq`O0)?nm HBs#&hQkؚ9RRܠ"L;.q ]9&|;{g݁Qoh/'#,: C~&A:h U2Ǭq[&yg@ƨ.g&ſ3XIEl8yuNV{rE^lq} f#qqepN ,f=E$..r4
+GdJJndn}
+}!?\_!!8-Jwu! p츻/̐q#zI0h(VP n8G%@InD&-/
+/sJh(Ŝ$I?QfhMo=9#,@ *Vj"''M>`PF`_3*:øw fw ČRQ-(Xarz6CV`{m errm?0.xEǮ'S[t xfvr!ky m\wJn xCGp.ov;*gdVgd) 'g2
+b `D A1in]&VڼL⏻n
+O.g,yBz</V1`p1%8)c_fPwykqȀ?]\6Pw|^]&m^XZ
+
+dgvmc
+迀2=&a(r+;dS.Y/c,1G62q{AVAG\-F/0 wp;W[Kf:v&HΖnS~VA_&(aSi4Ӏd z-wtOF
+Cv_mҹZvIA3 $0"چhSÇ!d6W%EH}8 ,7UW1%{0bcC<6H_!cDRzI+ CiW %Rl}d,CH9zT)nJ !NE9$ZcXxyC:VB/Cx%W]dv?KORʻ@YLa,D&:b4ro!p/Db!=z~xbg4K<d!Ey89IDS/&TԈ;HҰ(2D6\V瘨$^‡@i*""1D;t2X_anPj9<bK3"_SR^AQ-yN܄# %_GH9)y1yeIP9(n+14m
+ţ,UJ7;)dx$dQ&KUCre~ ^`ن iΒV0ѕr D0>}]鐦TgS
+W'[/dj'/RFDyb,J{m KnNP f+S(OTSm"8 7>utKڳTl6a~6$v K}hZi5kxJuA~9Jq㸠6z&j˫<+· CaSpQ$J%Ԇ9Y#i`,d#ղKbXΫ
+.U9YܸCA)?:/kҤl%4VYޘ \[Ш(uK!2jIqޤȔ"j?|VJ4Y"
+>!ɻbA2߾))ե_>/Z"< #$h4% CXPڙb
+:E)*2Dj sAZ|& S`n PNm2]9FXe)Ɏ.0iJ@u^m@]3S];5i$+ڜe*Ks[o(Aӷ8%. Xi7Sۻt44
+/`pѮsl!/$>'"|ʗunxVK l(M[y;2>Kxc5^|֝RL^
+!<}N_ ;S įBPzsZ֔A!q#}IůjZ& ]>j.aɸ,!rGR52I`H *1b4tK>Y
+s` mU64Mm!F1ڱNr^d̞w9]Ձkut 9zW +[@/qN A; e.2g ya~W].X6 _f
+"vAe+- *ٕ'MU0Co rc~u|-Xq
+pCDssP, Cꦓ
+!0Om8e;
+0׹P\CV, s1J[OFrn7%}YBu"dâ6"1\kQ:t>#tKϺ84OH)"
+gpF LxgP_9k'U4ye qF Z|P@
+N&tތػvv]A"+pf`uɐW˩ $WԘy$)
+??
+:6X:(L>.s6J5
+Pip?,IA#\pF _C!OhsF "۞V*i͊n2
+zҽO6ʑL$PoPZz ^_<-R1lBA *aih ۮ()@[ B}{\~p)A0XyzLQohl
+QJdЧ!GVHy4覴0e>-G!-<$5|nMڰl5~?Ii0$hϝPp&c:,ێWkӤFP&a
+%$0W 0w.e߱Xq @r`d4/r?;ɚ3K$b5GSHm+N~
+дğ09 %2ǜB
+v" éuvCp]% 9(sBΩ)LI#4xָn5RX1@(%@Ϩ?k vuFe+؃XVrwn
+M>8q 3 U2_^)w /ҧ,
+q]Q߇/iHlLbllDySǡd]gK;DuQ
+Ii ܖULiLCZTprt`Ure#id~\!G@?OdsoGɠt$ۧ0sl8,Tq`iUhF5wc=yF@.Fnqn[CEww+܍`X_N%pi[#wnJqjH+UxQC sWC__,^?Tq|IYhp g=o
+,PD@1 qXT Kc.}*TT YB* <V^ 碀oX3FS-1j;$Lt%&YSy8#2};D
+&aۻE;\p*MSE]c=d^&XJU) @W@H+f"њ4?z"di6-J{&Q75ѹҟJ$J_ty v(ZlDBiL "#=ͦa32dR=`y
+HKr7O;%Q)-R5+cwkE"ux>R{Ԟ#ǣ2YmQJ#lR?ォkz?:ՈdJ5?҈-ג~|Y^*ҰTB}c%dpZyE{Ԓ%w/GdNK,S n 1ڨzA3{cxVpbq"1yVs;}s#<^Z&m>ty\:5i_h;#GxR~Z=Ȇu^oq3ja#Gi3O/{/E旱)S^ڠh:e#n\g}Clna~i:dL|]#UVa2 {7{]v͋GMa{`3yX~AxjkW>! hr
+Vĩ|u64[qs`dB
+oO…%졍NUNպ068ubBp7!\}c:?l$z?$ d_¶7
+rx^@K},՟װ[Uy^ےFVTi0lHvzġE=oZ'=FhF$1OEB8v=1T.'%]$}/\xh>] (jĩ vCCY
+v|`19"Hީ@c/
+N5S\s-8R 2
+WM$7lD ,s>_Q!R;d$NOgFZ4&NOBoB_PhO=AHCF/h:la:?Uo""G-R^X]U/]j_^R4)ЦHA)3*k~؟䇆\4$2Q!5xB
+=~ +3\o#"'^Ҏ\Fچ7+J n!G=jL-\܉ĵsPIGaqI)7<6M`5JJ%0J E H}*uF>G SVny9@ۄ(y178O. (7,9E>M"`ʓ;U,E\3gM/4{fMB`LWXxú2蜑EIirz`V'/ei0XέR@V70/ެ3WO
+YB3i]@{Ư`I}2]jrաrk*aڽ3]ɫ_!dёV ޜr2H+̏Dp'bƊr'ڊ u%\3fUmq>ey ț~[mk]rLcK(o@!?VOy>ہn i̩ukci3qȺ 5cs1G=T:q :G졨@1a2,ۢy4Er+>tD$ex8s2wXHpEiOȕ
+D 6F8в
+1] .|
+akjGcԁ3
+I?RL>yo2 /я
+!x/ᖉWd@B: /OM')XjH:$jh;I4:% |I,̕KL)OZzV%R=*vɇbgd^7ۺ {r,`2TI\E DW=pof:O!), U/;)`p +m$ 8Dt[Fߞ \RKyag;%CQ½+B@lSfK|#eg\1մc.)58KhD6O<b=7Q'p|;޷r-X;ĸEߋ^lKo^;Aq2Qhe,Ĺ$(6Դ5FUh2ZEVRMDF mٱ,PX W]{Iy< _)meǑ&l)w^ \ ybrP+F7s:rR+pWtkb e2XZ|'dì{R\*|n!'A5K*>h W
+zkpRњL
+7ܲ=Dcyğ ,
+_) k{/aaޟ唨:;7%Y3*%) !cm <sK}vkBF:3y%C_]E7l{9&t
+3}Ю(< ](l^7@/G+{3qrR댞1FS @3M9R/'qiC칼pҽC%+ F'a`K32 <_{T8#/rLݼj>&S
+p7!&'bEyO L8Yz)^
+:8"2]V/f+!]Bχ(c3f[/Ȇ@ABtmW^#`YHR/DTq6E<AZumg3z_plߡ< sD\rމu;Z͈]<_+5L&ꗃ'j.mG#y4*!dH[m0/>)UR/\$f52~KL+4
+\0ve
+M@?iqGs2 \` wzJb76ǜP;taB4t98xD_q$b,qՔp٦][C.]~/&nE} uWx{/ <<8a
+qZ*4C(r/a eQEJn?
+_`6,_ -ED(e>ԓrjof@MOmB(  \T?R9ۆ`B7Sm:fV|C-Z.,(ė$|ɪI]xJq'Vk"s[ V1ѐM/EӀ b# %B +ZFdrS\r]%>a{$kqdh gˈ2^$2zԔ? $#0k1\-Nh'<Ǧ!\KbZ%U˛ A3~]0:z _J|)XzT0,|~]6ṯ/QʗR<%c(k,<Yk<t/1sdWx!}KV;f(495g@SlN?D5Hc;ʁ%NsP :)H?"?)a<)b0yt3 ܐqw<t&f:ZL#rmVD
+;6`Vb~ Sp:7EH *2 } AOW>~YY "J|L?3|M4z;!>aƬސ&'Qn8
+'[ 6 L VgɈ$ 3K1ȉܮd@cP<,4Z_՗b 5fR4̳KUZdh
+϶]0,qt I:~;x HvGN E{R*f>C#/e?D;#\a<[0C\%NL %12A:Z/Ɨ&i5`-3k*ѭp2]"y-VD;{/DO5mS^.r8]Vj_U1>9Pd"n*vOE6B?(!P+i4H}$#k+;.4"W`u"BJ>ڿ Ihoj<uQ$1K8Blr*Q>k̕l.K( * )@+Z:0 aܚL}DM,
+:e'TU)왂 ̝F0K
+ݿHQwYY Q|W]9SQ' rSؑ{ HA(5NΐEFgb*Q
+.艫*H (.a ƝN6$p h9A䃥yww|g&
+I{+Ĉm8$(5s#tem<r@"<.pWK|"tZ< U- rDΤGIzR+iI2![VL\^1pbAi7bЙ(䉯W{)}ST\0,i7nMITcT7. I-NDcLZ?P*Υ!)i BMģSf
+筳5 <rHY|*=Uܽ[vZe4)|Vvwqq#Z
+;!O8'H0q
+ClSGdOE?ovzۡh]һ"3i){xDn͋KdXEy3Y;~Tv>(2]EhCgX+/](J`\p3ɟ6VsK
+n uJ"/rSE>woS:c:&_
+zqH0oU;k+'_0^2[k#y m0ǥN>c
+Ec
+dB};Sʺi:v)ɘďoPvzee+n( L/S҂,E<KNU
+3%?͌KCկA`o똔Rv}#VT]$ƩV1 oS&NSZrnb/
+`kh,z>>n):p|xFۿś7x[·#d`Ayz[:?1'j1p؊ GՐ"E gj}'$;*^S<*'%aJ:ȳ,]Ga^r,({
+̱<:<?Ȇu>ԂdčasF4}Zd̓>CX/8gf:=w"qӖH|ڲ)AbX;a%P.~21Y<ji,k>d bdSxwN )硱XzjD(L#q&ɳ X\2hOI.Tpluz,~
+5# eCxliLHENJ{Yc3r&, ^HT K"V@B]'ڑGgeJt96i׺X
+}%sYj`C]- ;^;Yv] QЉoLKI/6rm__[V䌆ɇ tړ<.\~aY2a=)"-6W "DDd1H;Mұg΅%XH+
+Q6i+!OIU8 $mJ$S]tWT18hoDYġ(o?PuqsT&#0=&Kl˲=<zx/V"țBbQPlM}8n_Fre32[3?%-+K,PdWꀰYὖj fv=ElVE,tHܗnϫBN&Ϧ%t`=@Tq@ |
+}Q%ӷ?oEK"ΫƜ c/_JzRy>~8
+H6g/m; 8axlf|-وhh/B+ q{Z趉xV;[M><@Bgm?'V0 ި֐S:QXxc3PYD:{"ғI[eTx@ڜ .Jf8l[Ob~1 # u"˦g@}^QkώlLtAeuᨴO۳'wEEt[xgxΕϓQ͗|4P)7⚗UZ
+2z;J]`w߳H{eW-D`GI':R (f;cbdo
+^nIS쌫--ǝRbñ-<)x)o?O㋧1CwcS /BE}v͊s+ƀip(~cPU o5X HCu@%H`̣#<F"P/9zVyC|T렂1TUlTɧ
+xeF%mt> ybs>Ij+Dp:%~$[̣t|E/!} b+|o֞}Iӳ<*DLgWw*ib+~a& VZ ZD $ RA3g0I$}% /iǿ".΅ QE5jGJ0ް*Q-\- q(f@*:}\YEnJv̞[ծ" KKBŬhiPuБ
+#D2N=dž擬fE?HFÞu]L,aJP!v}+Lޯ>((d"%т{Gn@!?H5`RAR݃^ta8N*`XXnFƵJJtKΒ="i(ѹ>7:'Ԇ*?b}uY!.2*%18tK9oKL8dرBU"{9A%[L ƿ
+y9,I
+V|d`xEa0Gw {9ЋޞFɹ <"#OU{a,mb0H'EӈCf
+zNL}A;g뵕qvqz<Fkay.YkWzR<ؐga(~45 +G7y!?~"
+$,_.x;Iԟaw̤
+}s _PrGs[-t's۰#+b'T*V\@A7
+O*,z:jzs(L.;MF!
+aǍTv5bEAOF9bJёP e\! _AS;A̤ĈW˖Q'XT>@yteNLB± tp]4
+< `kh7_A!M-&+y1
+k VK22R]
+Y',t`W cx9Óh6IDZ2:dsʨc}OO}ZGAUl9Rxosa #><(cPݨ{mzlTa S,k@Q׎smwx}oչ¥)m`A$߳IJ*KM^% Zdܜ@+B*Sa}b LT(E %JWw;Jy8;JSIWUa-a+%Am.Ȕ`'3cbԈ$ *RUPq7m¶4
+?h"\i[PK$̌c3=E@pOd?+miĐ@G{‹ݤܣz;W 7L*vfߧKާd 16tb,Q #<'S
+>orF7B)$1 ^( 0m2QYTj%dXl`i˘!iͯԐ+(7EgU
+~;.& >a6u%|WTd[敮nZ㹈T/xZ*}ZUFg~'aJDu:*¡(e6w0p^t֟@ITJUrVGX{:֛Dž12Ѣ){U\+H`x z) Dt|w&K8.9ONjRCq;! DXAvT~W}7\"X;91D[{ ʂ0,.Rd43"׷3hjzmOg Slfm0Ne:B?u@CuAc<=6Avv&Kӱ(#*e$߾`͂8lCfp'D\ &wg# k.ċ[hi Y-
+(ŭ01.WhAEAqRU djpP?s Q.aPHMGd0&0 Ldv|Kp4cv׹1+mA']F-vhweF#E}YLCH?Nh';(Kb%0&
+`1!bB!Py:+: ar4<ޢtm(RYSH%i 2D?񥗳1Ct}&ƂDH <-B[4"+x'`A)N}
+$~a6'Чia HbZ *
+ZRƒg8* c*SUe>#;pʞMrC1mȏY0 jb4t*~FGA*iC~VyWEF;Iː~{;^pb~i%nNݺb,Q,`p|+vݝ#&YiM3揶yXDEWJ0%*Xgh'mJY: @-ү5dҭ
+T8@t6*f=30*YE39+r 5$mvt@! DpDTZv1j)U.tBIɭҍ-8z/;l"v*a+D+8ltqO4wiO>O ?WCsm696ڜ&RSac[w+DJ P|
+JWPFR,ۥ{Z/cJw֞nM,j݁0IΞ;*%BQXM5N#7ks\RA ̮|4t|:CX#m#TN_Q_=6WW$5-4,†<WĎm:\ô=O}"!x`׎@A( C7ƅyx!cOmxêҟ]ۆ3>D,ֲQ Ax6]9 xAk!ڷ3KI:UBFBVcx&E|aWj1"a0\#vV: 7Q(,#KJ\faq xg /O "
+IYf1{/Q]Kr x~&hAgKBsmݯOboEayK3|Hl.
+P!U!MҼ^ϯq/ Z+oEeԴByS})\FNTk Zdj) a l҇\/ÁcRNԵv C0klא 77uvA
+`,zW
+κ5Z`:NBjY1IDaYS"u<}m(/rʸZ9V9N^D CdhY$@&ٯ(b6)XJu{cQ6ʽalfrY
+n
+!t E'H/˖o(3] ]g},`Aln
+%աkiJꪎ2 ұYhcU/ШO-2xc-cV5&ꊛO fH)M8/50Ax 8Q(p/k,
+R-4Op@X&C)OLZzOZo/ &YUxխ&Bʳ鮂)@L4!MIoPK(lڦ~>YZ
+Ge$UůS#Psc$]wClD x!^)AϠ"ͰHaL &?BtCh;V{0(CbC$.E'} V](&b04B)nMɥB! Yj(;MT[bb` }ARY7ɋQ$#s,a?@õRN
+@8b~ ں%cR/X ypAqE(DzW D_GN,y5LEo;A<:f F@ps]23|͏~"d5[<^BCߢb)_O!s.ł4RZc~]f |i#H~Ta}V
+m{{&1++%;_x?Z@L9Cϯ0H&.Ż
+N{ z9AAk*~@ulSǂp'UJ>24G񶰩
+s3)A&1fi ';@QIC|΄ɐF?eGCua^ YݕCX$qW*:}QFjYm4O9c
+c|Ú1!By1F$iu=r@rRyWZo\7Vt-rq }d
+X)HS5. ^)aU2f*WwTȝsqn>Mw W- ""@Mˠ>r#yDzDy nEw}a#DP%<ǭW`ǔo*72s(=*2 QǴZ
+>!7d, zZ`% GwNQr(:̫ct|k{:F-Зc(E-v}1sJyEg'2 'z
+ >5#F'`PpzSR[dCYz)?Ŧq9JZ@Z*_<T/!:oDE ׀!c9Igll߾9oEJ$5 DMH5&b\ :4K^C!Y-P;[./څ< C[lG\ɖw<Lf17*ʒ'dc "Y~rXjEA4d{ƵdsVs8^tom:v\rU8TXxmnQw`Vx$̅+ܓD&f`%[‚ .G[PݟbmX!fMCi,]cEh:1)RIb K1Kl.u/30^WQ+lUX'<J:[zN6E3"UR>Y)1Aq/闠ʫ$Q~7=$=J%Q:vIkl?I$O+!ue>Oy!_6fald*:/y)A:T-Ђ&Xqo6gXkiVRBfI4a` N/S\9P
+CY!*ptI&f(ru`id#&&,E`jSWE8U<36
+:5(
+tWu %@8=&Aj`IJaz %e-R^¬8>[d{E* ;F.|ս7#]|p/a٢dbcWFKy9P DE2azE6.΅_c}`]@D3R drU?kЁS wKs-u? Mb.4%h%lT6 HMmbx!P)LlCpi^ɂ;4DKN=3MɣrL0NBN1p:hժ$:achݓ)[c8zv@H@aNy$vchXCF]@E]%$&dUtaHbZ#i/hD6CM,Zw)Y{cVsα\e ܀rT.W cDS~.JX:$ɦEQ{ C
+=a1vw.s3LSU2<p݌;?SpZUQXvKc`i!Sn?]ܑ{ty=SװȬ__J@R )Tvz/7/KB .PF*?aWgxԖZ`z+-ăY݄돑-h)n+G3`:a2l :6 iȨ(hx&X\;T]̇C`/ppwZ
+ڠ ɉje%ïptÊ΁Sۢ6v* R e$%O{8(|}ADaBj2>wy6ZUoj(VFPM
+W%@<ƌˁ3 Fdg}v'?2\WQp$\&%C2p4RHIG@2t}{g[,x
+6yD<2sì;
+bfe<#a z]EAsٶ BjզH8KqO ru9G WA@.)<o 2.:$]~f4~<62*Qat2!eD0?IKm%shR9*Xdh 01`4Y%>Us74@J n3J>=L `Y0^,hg#/s'Ofe.1^d",CEeXT~ecS:giy Dm_ >rZ:"_T*dvgF`jwjz3Y@9-ULe;h OAJ_8 '&\jcQScsk1(NU&,2̈́|`qKeVbO;[ c=[!SkƧ!+
+|}XyL"pÒe]XT4<S/3Zٌ\\b
+o
+yʺh̆|#­oፙdTRի
+c|M
+I ]Bȹ8pmUQ+F"WɐLɪ+I+,y{"TA)geVrI9]V9`gHviZk3ZX3C!l)JP~ J9,8gɢy L8|̃&eR/]FeS+o~(e*PO
+H=m W=tHJp`S_Q`H)8ٹWn_sXYU_qsl G?׿ f-sQZk552
+Elω=9-y5Ěx8!ΨZ D>`&':r5:0Xa휱f'#~[WQ
+Eŝ܇X wqՀ!͇!ƴĞ1}w6H˟w{LguzH8c\bB$|b@Y} N^Of@a5(1>P&ޓ[ÛJ9A/u|L72TP-Z
+S\@uL9AFЪw\
+}rIm,y3QGʢ\ߒʊAHvP{{_PpZ2r7_
+M/b8  PCѕ?p>Lju j t!۴ݺI뚗:Y̸Z2p;!iBbڈhfwއcn28ޯo:؛t`Ȱ
+j(${DqO֒B@|CY VaPZr ֳoB8DZdH1/!zzC4.8ܚ5cvJiK;r
+S(PDd%Α~a&{0THahwCQ51TuȄΞ9h ]|XsrP~uB)
+!~?"Q,=da*'<nT]̍AbdU\:nߣ1>Kb.m&/B^~ECJ
+B,rhĝvY(-&5gR%RppI{ZE5ϼ"Q͸ICtFM{ݽbYF6h3=#V+uj$bicY6J
+ЮtJ\
+G0b۴;智^bh046B<߇_ፂ uKmh .FG5{<9!4/>̡5@x6K FI<\6O".Cؤ
+Wv JTq>2Q·l+{=nӶڍ&I ##Rj$F>jY*zH(t(\u ,j.0#'{8$p*I"Ah;
+KZJZ_aLp%q(xK;'tf
+YΥb;Ɣh(#Wq19 "C<8ryiFv8$UnO/Jwy!8c}ӃA}uIU6 $?8]`?'5F3 9 {D/8eqH@Nx$B^!Xc}K7~* TVŶ_*k@)xn==W"PlkT5\,zA|Nzs Q碊!|$CRxǂ;&mpJ,ew
+TPg%՛:1c
+irA[@@
+;5"("L'
+t,CizǕ
+QKEs!Bnz[F$д7
+U:Jnc0<V䃨?
+id˱
+M))yapqG1adD'$ }5bk}}9^ WcxG EP
+jA"`Cr&b%Nq<:M)x<39
+aGߝ2m.jwSq%D2bNJ;zAU<~ Q#Lgn2+PrI\iPfㇱ׳b7NVcvwkQ(?b9
+n|Ds(hXWB
+i!lD'nL
+k@TnD&ݗ1omhA-lӤ>$wN\G9GĹD 结/
+GE?h;l<:\J;΃@A$H]HM
+SYo{{TXr]fE\Yӯ`H:(2Lf_r_
+FgzlIB U"51qulo"XSy"
+rmP aL0)=ƂjǏj钹Z r .
+Unu /d:6d ݁Kp8ƎNiry=%ykElUʇR@}֤B3ؚvyXbԁaݣͰX=*yX.ffEd귍[fh/"I=ׁhGgJaqxк"}Pn@67'p`wc$|L+kDd4UB*<n Z^Kv*I}7FmthCK3 LӎW
+BcQY/[* =LD;u3t: A%$N{gUt7dv]V^htMkm|ʂEόx/$VO`lxoj NIM97nz2Ny=UoZ+kq%N1Ӥ3!XOۇ!:-,/z 4OLL2~Nyu < H5iH1;81DXcWX_E?Β'B@UzMH. ۟ UPvlUw2Al{d(XWUAS'1 3Pe1޵Kq[>Oǡ[v̾|"8o D%85دx
+fƒNy01QGuF s9gx
+Em
+0k{ CCl<۴h V"v#
+n t"!( Bkߠ˪ b;ٮ ZeA=bozy2[3e&T:dmh<PGMcE^_+ˆBMG'S
+CD!nIhd$jQe8C@hؙa,NH<GBr#?7_w~Hr[AdKf/7[8D6M* fxE@gj5R'"m ˋ }0Q0 ^F,tˆ
+wTU8"!q)!.vG3^SP!Ȭ F6`gmx^L \R<UDcփW'!"`@Њ^T2ǬzOe\f P"^ay\k $R d%шGnmA2AeE(!BxـnZ7HcQ J1(;= %w'nXY=0U Y2"<w`fP p*Cl['m}t]/d:6hkTWah {FxJ:DrH/wyb+W66'4FI7RxB]sel B* qmY#8S jYWSuh`cnzM䰢e:V'6
+9O\lt_sOZAWMKv~ϨsٰN>VG;M+QWyxvj!asH3Px^ ;(IJsP3߹|;l|u P9MXh]'a ֧ .֖g"Q@Ómaf/|1NyǫhDFUq* LRubT\n@#P9B.8CD\|QX
+@S8LlmzBU9xt<(]c0:QP>(-*3 8>5,~SyybX=7TU`@IqJ
+8۪SV:' B} y
+qeİG9ݲ`2ZMioQA=-:[+,!tV $ȶ3wZXլ_:<ќTsr'#A8'#?fle#n |1_fNVh#@eF|P! ywGP8rщ#,V[~t@h鼛P~5hS(R[֬8x$
+Ys,q<kN #bh#<)R"vRх" B޳k^K7V]DУPq'Z7
+aSm.Aʒ P UQ\ߋQ$*GԷpN`HryOR%
+T5O=YFAvcp;c0j^:(BWd\uh)<x;~-i(>C|M"F eupRU]Bќ,@VF8tҙhiTfW#V*( H
+&sDPUQ)hEuy{H= d,e%==v@s-|M5,fji2#bg()wx3 XtIkCS
+Qɟ#x|[DDudc$3fr'6I}6aIK{DF%cV7`ͅ;ߟV\!J!J[P
+Z`AP_SG5x,,qv][?6jD
+d0x\0|%$LF P? l:hs"Ve_Z~:|Wh9z_ߌOY]8a]/bfFH^Cp'ĤA:[(aŐ>F*a8V2D]:%\=P EQ*█$\wtl_3vtWz7UB4zg9@l^Pj31tyR$嫙QCm+]{+M7l4`<bH%5ٌ&
+,収DpM=G3صaKv\AG1
+,Sغv 2uA'-R8uwDfY?1 3FcX<qa8@f'9pj;+0D9fIT\t0
+ub)uZH:d|:!CJ%U~@Tf&]DYK/ikOz\<ᔓu"I[ R9hZB%_
+ؐ^Z]GOVYD{Q6(a&)DIX8`#Ilox(n7SͨY|<Eco0WsGz|23&I.@X
+<y:?hZIa`ѽ^
+6
+cmA@"v}ő@} U[(:v11SR,ޜa(^4G
+KߊI[E}:L#]UaQ"m[&
+|&K淂
+&`:wwCDՊ#Y
+߈
+qĭ0а 3-]#xD8DϘ ͠E_ALVvjP*Q{."#j@wCVS=zg+FpJg+Gy 6̈́H^;E/)aˠ.R$W4;<*^`LD?X⯅2诣T,{ցɊ IHbTgÕ_1AE^ hC7fH(_ )<yow{5IvO%
+%DUn$bcUղr%f#tf_$PS1qVfN3q7I)Nif;8 \ 
+4/ E#"[znu)짟n'}/ç?/G_ky_>o~;"_O ]o~W<oGH慅_];B_A+
+ X_ ))>?Ҷ׻Kͻ>[Z%EKJyP>"(f@JVp2;#ŁehBZ^鎈JiȾ,1Y1b1E7X/
+EkRԅȬT2Q`]wB+ǹH[kaNn aKYo6Q /T DA
+9L.ч)Kp w<}m !#'݋l:
+AՠNlѴx6TV<}{AR,r45S{0s6m6:)ש ^|@psR|Xo G+śK`M
+.A]DAy8\ xLO"`WZ`0b"BhZ(Ʒf×) )Y3Aq<3 0YH7NɁlşf" if#S婕t"eԗƬ0^&Z [F=PUo
+eLƦsml|НpyGe.C[{jy@ЇߠqYA{X\v`Nt+ve2AW8cBB&խަ
+%p- AhոE: VpF=vrcE)0ΏmZr^]m4-;>ԜՎô0B~"2IY|^Qdnvdd2)UlpB}4ŢTP Cp
+H"0$̿.Sh\J
+M
+&RhQE@`2NAh
+Q| Ĩ
+x=Z3}(&'*TT=H5}mF׆uY3
+AҴ6A }/(,+?mC puI^j
+݁_qoxE ͊ցrա>onJC[!9yNjȢܖ`m<k"(ގ.؎59q֋(8h p8Ð #/fi+%(>{Ax=)^AnpMdcyGȖiHe#qu!BʡB!TAf8JO7N>[fH@ 'fT<`sC+@^wzP; w7G"j V YTN#P_;|(⌌7:cɖj ʫC6i}@Upðmˬ -U
+ C
+/zrySQL =4N:NuZ:M&q|G{ΠJ;^ 5O!'HпvB4aF$:AHyFD
+Dډ)4NA$.UEVx8Nc*l\s͢%F҃ D#\K=WJ*ҭpMQ645<7"0G]RqFSYz9'N8
+'y4v!6q}"E
+uT"|lۓK ށlT{<?+0Of?2M])) r/hx}o(@y&3!q[+`<|1<a<NM[5'GF`0ZY=kE>c״zE<149.߈nK|.We *ce=]Hdv;WbЭD&NuɡKLe $CI
+B)h 0Wsy`iF
+g-Ntcd8CCa.{;k_SJsES`flu1r}Bz#@ްdmv(fiKNeX?jahM`CYgI_/'۷.`Fa>Ff_5*pz?VyUh+25Q(
+E*@K?5 bި8TݨPg〴4
+1Cه2X[mE"|ECuzwL?,j-@i]AR$ ĞEFь"֩MVpGFUys~Q.؍WxWg{c8W 5\RDqRe~鉰q8M@,1\1b,v^Drȴ;+U&i~<8YO"5Mˁ1Fi
+
+)'RLBPZ t PHtiG kFM 3aC. a֔EPniPBvCv;9J'%1:|WN(q'_-=?g_1s*V=^a+A|RO/-A1 xr;º+?C}\T Ukڗ*5OB
+vA2 9Ջ؉󮐃`n~/fP
+oSB+ׯÌϫPПǕ,iȪûܴް(ō18ɫj+Nv7dDu:z9U+26HR3Wσ@1DmyͅΨ<[̳pՁRqA# Ta|Lې|[ܖt>j) 4̎<Qì! g?+uy;wo[?|#rF35_BP?T кD׺xO'ׇ^Ǚj("P\N߻\ÛU |;ݯZ.P5v yG$R+JՙGD96"?ecQK;*X9 BY PPYAc1=sg c~9lS4
+r'DF:gT_D|
+V)7@%-ANbp|MBmc bP
+2\m%]X;4!vQP(tHI+8PLȤ$>hc |_,& 9-Gp}Km?Y:T3X2)igG`#-8yrJySu8>w~+DтLe^%F0,5 pq0nirdbq99rm/.%rvVͱ>cph9rR0^b
+<^wٞ}ӷ>~_|_Kӿo)e{۳۫?m^~o>w{W?x>ko|o~c;|:A^?_߿o~\i<cЪirZӉ@ABi^Dl]D0vR.X Xm V(fԙW 0m}O20rFA6 82H$LBqZuBEPs*Jo,0 @c`.{s
+:11%y-,\ =lv `I;aȝñ7.\6 D=+l~P%\]I;+1?,~EʲdMä1.i\jЄt:\|~XU@Js<7M#3= `'pOUPC]ZR¼2[@UfA.<Z3y<L
+BHE0${ p$1֟$8IM p8cĔo9{L/vspr*A mC`n/6k9*-h߃R.B2򟃨!cU8AE:݋ǔ\`K!׀țyq4q/3s %X̀KPtm` }r6%݁Ѷ9쉠i+
+#E|ٱy&^u ncpO`' C^z\HY!Sӈ}- Npl:,F F$'e17ցչļw,Qh@j+vς,a ML#G
+'Hu<# p^ aradwz=]V&w57=#ng#U5B|=g8\/!Z
+
+Г$FLĨ87;
+MLZBİ=]ڮ
+'E <tTSLGg(ȳ=àe#yav 8,{N4pxs v5VkD=Nר"‰R7bFQ5-St$ n:6
+B18;B)!:b Yd8SE1ۍ>?1يeUh}<;]d΋FGimH}*T2ߊT|/f7e=d2K\FtGMetT\M'4Dʰvc[Y Q((pa$̎u(JYPI{cJE証wD 'D
+$mc8 JCw*躏ev .|.7O/vz:Y:1/}:>eUPk<&`u qpҽN)"h5'Pz/Pl<F;Pt̝ꊳc `@q/s<,*JTbzS<0]5\eha%yVu>
+Q`Dfy"Tv07|GRk- xut@tX(ɥ9 ^nQN&2 왦 9Y? Ձ՛z^VS2pQ Z!(8 FUA@&
+k;v(CT52~VZkn>' 2$އ9
+ :C<^@Epi\k 攀M3=~:[P0cKq߄D[bRIWvbL)g Y{~HsQ~wL͙~U!pΖ3&C9djZq)25p0'
+Xʊ1L*:|NvCոԤ[j g*X\w^,+<I3`¬6ލqkyE5} (1p@0u5Yw>E6$.m'#(Q1*-4.MqVvo@\L( )P\ꚑ:֨@|UOQ3zWu_ZRTY(. [%݂MaAa1FQk2+eػkX1T!ΜSbՁAL
+_ "011].vΨġ٬fGа뺛遪_bx~a=7(¾qMr㪼 9t`M, R_]Q(ly
+w)BfI sESJ{rۚ0-.{H[$dn̶-uz_4Q{ۇG?ڬ"?%4Զ;;XƦsV6 }d1hL|u@\$LeJ鯈oBĔ]R8HlsYٳ2K_(+r;9BW"_qT([nl(kl@o40zT?`*%>ѡm"
+DE3 3 lr}1H޾i=HcT$-o)cX$M)?2>Bϐ
+Zj˥厛"t OᢱcQ7I+Tz2LP,(ڡ~WkN+W 9~T>aIfr#* nQJl*29Ɗ*: CSwq|X&0
+N1_S?4^ %[)cvN^0gy'50EX"TYbf
++W'|@S-
+)׽S_uRnJ|C:30o0'S
+EP/&1+"ZJU=54&qCAi\ɽfutƅS|
+`0q9W xnQB p }=;J3:ar pTbЦ2!Ev* e4U%2
+G]s}j{b ˣ/8k[/L}mJ X#t
+=> @1ad)|&EEItEri)=p*en0P"b<$'K"`;
+tw-ECܨikS@6Q n"UȘ3ሰ |,lր@ɖ"TE҅F,1W~' "c{E⇚%3 akbGwܬKv)xA:hu,] E,jbv}}ϳwASxW
+HM\Wpp7IQ8vޅ74%'9 wZ?dUjfw˙uu.#9\_6pyK o2qyEd!y4dtuCXPF٨s03S}Ň;쭧5o 3…c71Zfl3 hp}BFx}s>D6lh~X!i&7HiML͢ꚯdQbwr:Ѧw `Ff])|I}Dۈt15yHRN|r0iǛu@&-aAjZVԲdL܅i TuJ5G 2Op:BY0KCqCE>MVT5[d" a8Ol7oz|K霐Oiܨ3sn1L:eO( 7Tʩ%؃@Ix2 1;i{ ( !y:p 6"M֐ EOa%/ pw1^l-/QW؈fõ 46_v0_{|1_`cLj&ԆTZBu E=s.]'~[[ 'X;%<hMѶIl0M›N_ rp:aGӆL!AQnP8Ďh4ʃtzzXIcLiB&N mUQn`I`6Z\ԢFġF_>0Y m5sa jG"7vcBU.l_:˯H&Ȗ c'‹RK=.ti<mԱ .X^".~I)
+2v#1ƅԾfE{R
+Y![֠71Z{A#ԑKO{ PZSmO[]Oxc&:!6Q?P mXDy̒&H4:C,Dk8K࡛:+I%<0D220(1}>]Ym0'/g#2[a38,oԮ f[bUĩM p:0G2HFZu¬W%}bdhEdƱwuM ,ν$mb5\<ͤ#Q,mvFFC,\~_П!0H+Lh @.r x3$&0DHEq6 !^ lNr8| )IK\]jVAR !jEOA0+scz0peT0o1c>#&sAY'~F}л ̣zLZ= -(p$;1,tF`\eJg0"*JZQDNCQ RH6Yvə~^UԻ]V XB *ezPA0V9Zq 1J Z:"W͗d`&obV JfCX^Fo" ?ْC`PyX.w_@H
+L--dwLZ74u{(1oXLvćk+I &ns\D _Z얒/$Aʹ2 8')1*?@l5"V7WZ7 )#OFmMqnMSP ^$i.\+#AĥʳR""xH8ɺޢxR*n=@9O XEvZ\01+Ak۳!9A҄t\ExD]|%n
+,F=`g٭x" Чu\JNdzWpF$nŲx]T62]%b67)qd5ψ q/uP{}* oTqe22LYR0lוdCTկK֯ħU{[ X<,!꾷9#AD75a+ \TߤVbҌǸWgusMX{|N[ \[wFW\k Xy'9
+)<kRX9Ax^d H"f
+ZvHA?2W6r>c.gϓ gdZGOifAu54]KeWy\_3TrWפA ʄed 8br$YSӁ0`˔WC1"4'Y2 #rYl3?9rOL`_lRwߗ4#QS%>AQe@~SX3;ޘF&U6/
+3wI=$Gז
+_3\qӳ1+YuFm3U
+oxws-\b4#=K %$'ӳ a
+L?#T6m;q21: onL-XL5UHuI&C@Cg\FSȋTd.L|N]14%4_i篠QA{:9hS"!TSt#eerBY i$Qq KFc) "!c0z2 XΓ"<0 ( om_:@!B[9ˠ0KNUƺwxh1Q?^yUۦd}n8OsH&'nk=^zgDJKg 3eb1_0nOnW`Xe ?jtဎ;5੠!FWvl} [֕M\л>^yYo2
+Sp{wgN3t9>3e>77}#QvH:]4xs#L^|pb8uzkHDõOÅPШ u>dvчl`͐hm(Ҹ6,d"]_26Pcr4fg/2./5X(ԐKqA/sEbӁSո>Y=ᜑS* Ak\'Cm #/+(zosc!#TrXc|?8W*͍IJŎ+5Aֻ4աd#eq&jӅ`xRA|gc?'PkÔo%}r\᯻V>b6F8|N 3>i`<K)fA^u=G?4Ax5;<1
+X2IH5o
+/Ȅ*`S+8 A@nss1=sQCF9lq96esMCp6Fp׵u|C{V;{HA8@_s¯72 =&}1)$@1kL3dF\1e cN
+7hmV)@ )0% 0Du)1n.wlgxwbgؑPҵ| ʔ}C
+UO ZFNd/ Rt_FF%]Cl"!{أ Z ӣYGq cȣ6x'y8`9jY2),Hb?ErV016B折̊c%!*zdsAiGD٬V\Ț(n#[sGKɖ.)!ץ9,K=`ا /LkHQUa`-A&vT4dXb L?˴+f$yI2u!
+q <Hd\h`AXXE>XT<1Qj8t4DҺOSa AUf&\z97P@7`mg1րW"h#O,7"t0u$;$'; |KB[G dz%p 6 KmF~XF1j
+6mˎ5fK dwZכRC^MccIT
+^"6wYHj¾wK'ګ48pSTAa0Z9G
+069Xy ؔ>ǰQE%_Խ2KD1%DNUA>M2ҕ˿60!ltC0%;n4/0p%G</(9(3Xp:!<&LG<s.*ct]Oŀ⡊+u'v3/t՘އ)cVN57a$ߞy LXIh8."m,LKO)SLq^Qk"\}}-WQL%ŦLYK"1Lh ݍBUg$ )9qv`R }K^ҠSB[o:ȝa-aJa/=})aq%|SD5,v>ch03j d-u^b(J^Prax:=EQ ,d) hu(xcaŗ~~0e +ax\$U"MaS8ǧ3%j {(16tv~U})`ր |b~c^t$RK9ċi^܆ NZ|c)gf08ᙅ_y{i+JQxC)ݻ`\eX#޴K{!
+1i ZEE=Yr-/kG%b=0!)aPB_)h~'*"{ Mq^dWX_V6XdJ$QaT:]L~
+ֈ4>/aA}M(D"6Oy-:WؑkIRcKJVDwS>nDcEx t5'ۛhb%ZrOv^dHaa5÷naWjZ}[s639!cw)zȱt#-d8f?) Zff
+f4:!-ބPXy247;3Lh5&zTWot-V\âL? La[Z%u*Vxyimp] @ǘVzO6mG+Mä*(PBaqtt;(9_yKSs&z,['{:D)gԢT,FPLRh|ma1$o"f<ΕaDp3NA_|)9O1][s3K 9xW*Y=a
+3ՠh?v8G+'gdx@"tWtb;wތ
+,VߐO14 EBT-o(9=se69Qh
+`>E5,ӽ_?KGw*
+\.gYؼFYP|V^Lu0]HڇwNM$M|K}QEQSo2 g^Jȯ#:==.☿C~Dd'`-c
+`|m-#Ns;Y 3sYP Hט718sB{Xކ1$'h4NY
+i<&x2x-`Z?]XV9!9Bi321y&d6Hlܥ9X7B. 9M*i!2c/BXveͭ&4d-<Ъ`17 ACIN=& )@='݋U!+f߾EYTqݚC֗joʅ1\ݱ%FAZOזd1tE> F!ƩYʻT^M Lh3apJPVQ<qM/Ef,|\V~O
+նeNװVUj{+9FR@#zǷi
+H*MU
+ʫ(
+".HU7_F
+S43`IєaRBH}wBV]Q8Qod )18D 8qU_8N-N&fbSj҅CMB.n&
+({B2sG9O
+VꎎD(RX&
+mGg^~{.2x BGXYR&Sd!s_2 `PAٖ":',hO4ցeJgA,ڐkHٕyt-Y'lNyV4S#(I^C
+I<'j)PX
+2'$ʳ)B_ƛӆ5&ϵSQoj܋ṪuHĝd!1@OaK<:I\Y7Fne)&ًS;74?!UXddw[`@3x#k2E,<p^Up4oz#}:mGF2b;%zKƚSmFA<Y@fht/ӑhtb^NjL֕ja;]C<{mo[]x_zaT i`rrp[.=8$FS_i*riJ1~[Ry(PFfOmZ!}4
+mm@»Nn v$
+/
+*ojټ%g w$sn
+][{]+q|zq hѣ+JK4R|d9~j<rk,}rƭ<'܆ۛ՛<:Ňnm!>le >gL"PZطJ|}w:c
+j# /KrZw"x${G]h
+f[WZ0kCRZXk3@`6"qTud͈cLst>=~ 5\NN&
+Q>C4p\=ځ`<<U2m(LL)V UE-H
+''(L;!RDCx~X@K1G#AuъhrP\|`rX GyFCB؝xG kl)"(z4۠44Ǝ
+X*ΡQ5
+_[4! p,,XBeNͻLZm * aO4LK!6KHb7!"=A*C͙yt)D<rJ ::5 ] `aw
+LсqAz/hT9AQm>
+#AZ"̐9=VeYX5_͂Si<<k#4K*
+\Q9 b$cҰeP9
+f }' A8Ў&*ҫJRSYP~+tq<ΠKO%ae`{k[[wH%a 9S.=lHļ?E@jb݉)ݪ'jI940𸕠ԤDvrhg,>*'?<!irBT
+bYBFvL`b.xM
+6.slaʟKx*9
++G GW֏E_C zŝdd8q.W6? f]VO( `{̢SuϵvܷӼmq4On|i"Ab(vq 7Ʌ
+Mg  2)>v[gLF ;<kaEL~1\NI/t6~mznG8fb P jNo8 0)$('06~F2 *'_F1c[j (_ֻ0M {bT[.I
+5] ebma"8k'65R @pa;dŝQXЎt\c
+`e4:?ǛR ך_c2Lqϱ
+-:jM GI 
+$o</"Ew8mk(H2 YdM(Qi.fKXq-[1@_7E7ϡ];|E;]ŗAv$’OI8 <t1V*c~ z\ YBdBp~u\sxO9B{%ίtY>(`rT(UI<\'ÝP*$7|v?j!Nѳvt?CƜlZs?A,Zt4?`y(,ܾ ew}
+ L fl MD\Ait{}gGhQ`y~- ʹV2aJ@1?uK1YiCpmH@6G@IAJţ48E%o5[wAg%h
+dmQMLdD'kd˾ 7H w-:O`XD,fG، gvf0k_d*N
+g ;s4lf)d`xYܱG&=(9#eQҧEAG1 od%+aok\#B.APz#MX5 -Vm^k>nj2{Mkm
+\'!A/@O<ԕTP7=n\1VNjr-h
+.9r; O cpo>g,r$_^qhш&An/A)٫ˀ9'c\ ]aOKp0 {e.vOV'Hv.\[m! * ;+E)ބY@%-k N>%vŘ#l S_۵kKjMQ)k1r8wD
+-D]*V~'SCDOF.nSB˱ Ehs3:pp ּ/6csdiA$}I@-"3u&GY{
+?]< tՙ2KDS re'J@<1;yEߖ)W2ytH&z6Հ̦HH5&4I
+!k)G5{I7:S$ Kp 7Pc
+hΡbT ^x!oS&9AV 2I@.Q9C
+,ZFTy rϿdOFc"Q: 0/yr4ѻ~Iޢ4 J5 U(CX2W@f)_Djy0 PrWdE A,FwP6Hq["d,ε/kXay`}0\) 4ȏ!0qj &!d1yƍK\L WkH rďnsgN;QQ?_$ "~
+ gi^geaLFۗg?C &`sطYrЇk%uxzt[!jΑZПRpK :Hq)p9 G4I!^)򲡈Vg{agx ZVuU_FxU?{MAe`%+J91gj5WXrحӯH2-pZmeCے 0,I9p : LjG9)mISDK-#])͛DcOy-I p*
+-\k?cEgj ɵ/uקn ّX:@oFW4Ѩַ/(aZ5^ K;+rCH6veKk۵pQbIG]#|Ts`wAn6y! j\ }&F6[Gƨ_c
+f=mN,SʿWd gBZu~:uwZk% \DGE)D;e9C+%Y:*(Eah!T+Σ8AjρhߪU? R'Z#"!CݘXŦlo>Wfʽ Ň/sy*;{{TEj:4v1H p
+>ߴY}hʙL[ Xg0e~1Oo"-NAhRZT?j5
+ KAhi Ëeb,<Ėp$%@R0RM@`曊O,}GMrI)#`X<u燛$Dɛ~ByB" +$Vm(;ar,i_CujqkDaה%؉3t^7is7LbG5uR_=A?h:U
++_b;RcՙѴB
+z
+X<@
+A5L3KhASvhmp&}
+j!-B i( B4 Z ڌAchON@Z;V3"B2cNgdO,P#[U{_pF[IüIN+M&USHI%8c:
+m,KRH%=
+%0j(*xP>wig gW%$UPˇ`ܢ>,Q?n}/qB>RK[>L*dKl]>$AaQ5[/_Mv]%B7`D'n
+a Hni5t6[_5g^oαi pz
+/`r*נgѧˤX) F)o$CNїODLy R;#_4vn[82e4忤
+/
+ Z~h?Y>G}&iJs ]&L)ݠ
+'L.sЇKbX/(0J _nA}*rҨAN1e 5c"siJYcp(FkHEE0L
+A/ލg Vf .>C5=AsݙX$%IZ .ucX=,Bo+Bb64($UAV
+.BÃʎ6m Ql_\ㇽiK$)ɪUIǾ,3HH+8ê\,Dȇ2Ǒ+ e(p_LAc $sI3KLYvN+L`dWƒ/N3Ũmƨ1Q@~Zgx".LϻS}S$w;lL"^$,HR{ISI/9m
+֯T%48=cDŽ*HVcXAv$ؐAW85balR,6>1IdZWm`H*"k B*7W-Lܗ(TQ@xH6!{)&լv
+RV%aR|L] -,9Nt"0$ /V>5,~f
+@)_@>5uQR7W9m N1m'[D/?o_{z|P\υ*:i4pA=HCj0NGpcA&s?46襵F1ʉQkDAho1pOը ך2M?!HAH Yr i<|1 B[O_sX[n+X',c,H沩M%xCl&,pRV8#6zmh}C7%C9x`0L4Q$ ڊfrE$zQ%;훲\=b215cs+TSR7pzdQuߛXSkeiߺϣ4˶v?1>|V*E{jDlݕĨrQ斧!8Ws_"Ƶ+d>1D$*l _E$a d_C
+%r02Z{8rW{!@ڤkw ʋBK:WZ0g'1rCG%nT,xKĭ)|S:C
+T5 {HUY;dՂ~{kW44eӰY|IsLyeGn$XH"D6uciT;5F!}Gj8sF*9lHSV@ ra㦆ά EUgbIgM b+CG-. \MFR9r/{ yA߀3o ̺{_9J95RHK]
+HAc9DOPwCEZg/*y]mgX`0hZ!5G7Zm[7 H KZjm@8y^ wo0.&91^[t ݢ#!Z-]l
+ GCȂ0K:X<p6i7(7-u=E\bARB <zZ,?@U|joi% ކyBnmTPoCEf679~TL,Kac(r0sAQE{*s?s)@0%KYW=p3qy&1g" 1Ew1P^ͽ"Rw5̀rm8K*'+;뿿i]+%֩f+FY0ë<ua; 5O麿i;fN %+v&cB&[o,4d۶Tv1pmKI
+NWEq 8WĺC'c06sbK,(uA0_1Mw8AZm\j{.d/ qgf
+VQ+3 ;2Fn;cs{$]qJMrNMNaZ웈7mkrX@0wWߜT@`ǏƢTz҄ck=R_dur!e~{]0zӨ+s,ym!㑃\Ril8+ȇ9%9eTboXmUEs $J~#zYz`7 :& @1r9wt A o#P&k,_8k藾Uy.[YB2ggcJ[LƛZ_' kyjEK86 Ӏ{ TܙB1
+&Fr<`-EV
+v>*8쯲MPAܲ>߀D̼ ;Ǜlol S(tvH*#1'bFRre(:d#6PDm[b NkÎQx3ry;">!d;~k[^K|Fvo7r=ёm{L_i*e;ؒLu[Ԓ4]VX9tR$3**mBfr[1þ
+b2 .n{|~E_nB1ږD/؅
+JMV5%tsꄕ0y&% ʆ)#T3Nr"2u<m8!WytŠi _io3e" 6 M(zD@8c;MA4!k[]2
+r҄Ҏ[6
+̑aWĈ¾c!F /_F~*6(ΥP fCrQ
+JfqAO*n.iB3'H:
+֑62:krXBHuA(d~DE[xEF\ v)- |w0a18hNz@sjaw[ ]7n")kRNe],e}R&Z6G2Cd n
+BƐ1$Дޘ耕5BlwEjZ~i^όNQ7
+ZR|l_>`LoR#_55v䈐MӱԄAgګ alU0 F!?DYB(JoA=Shlʰ4V,n_Q8sgAI㄀Jw; QW=ي &MplAW[S:C(+`<!O&J'?n7S2\xL@[j8ds5&DMA2ϖ-C7%d
+ !1gRQtiT
+Zǝ'd|ӣeaHAeJI#K ~Vܐ9Ay*#L0y^&֙{b4^CiH4 pNM9I!9n a;9:$*^F^82y3%jµU1}iQSO [=L/Q~# öz(m!/͚)KKh//m
+8G;_z3FGbu Aj
+FHB#b6i'<
+Z|
+#(^']DP ݋rCJ9>!5׼ᢊc,Ջb"8y7RMm 8.Z|S|@c*Z`!:u]^`< X?*į|ouX|?Z&hr.^#(@=opV?/7R\V',RjuqU(v-zP3!uTKD\s(%/ԛ aH`=!bz2f4?.yU%V>]ԅUZ353l!\p⫵@>v
+LkAʐkqs
+ō{3!S3>[Ƙ/8/z!,8@i_8rx=1Ljaҟ FƳ1Ve;[=1 ;^\yh ZmYUO~qډZ*³u **tu̽ ]:(M`L~'ADyvs @&^Ə_?Yx#uRHCүiX'MV/(7G0c$y1=MCǫ&]o4&Eb~6LӰF~D4?1P@o1-FʀZ<EM%rUgK@̵E̵#Q:CcS~?uOpaAI8(?0HD&H Ee!cV{<`/wwUZJ9\ eqVi}. 7vR+s2Dgg#lbAWlL񋵇lRuG\8VGaur&x6l,C0-] 5%? >I80eSQ!tQUԍMdfg_fm*z}urk '{?q
+7)s0n˼tma>J3Cִ ;
+?q:W.JoR‚dv3sGk!]~D͘qs&dmsشPE A^C-$q~hq ,/* "
+
+~͚8\egMUG[z{Q{4j=qʎ,]>$xjj.#c0{-嚽av&Ξ0rxƮ
+R0XDHƵ_4carS$9FJ Vc /#P$e;1e&VAG H@aax ~v`xT~D9Ao1/P(B M鑋ؒ,KuIs9W-(vd5=[de4a
+/-Ԥ%HY#ꆐ&SQ姑>feVja1T'ZFw*B{ސ$8ȺUç@{+ 1 UA[%f-Nh@
+S
+?s|>dbtǯ_nlQݏd5#s%6RdΰNHQe-xɍce֠qO &n]QtlwgnnsAǚ=fqA'
+J-jvv@bv3(T/;*{&k2iS`}'~鮰ZGVlcۨ K*2<ݭR\Ưam"APtUm08r@ FycH3ea-&űPƑH-&j75ɦ#o(C(8ro[7q ᒉ u 5Z03W {wPTuUD=Q,l{FzF'+/ ڐ/$U Q=;.m"E4po0&g{Wjd~?e D$'Reh51
+#q9sRR4~ðM@FMp_0/W!
+';lji&+\->x d
+Uh ~zǡW
+N>ߓ.l2!&7HL*niLd㑻aIeꍂͫaF9Ғl9L\9hG~n/(!:K86PDyU
+"h3e}ΠV
+#˞V1D*VwX:B5=ey>|dt[~͕m gJ27Hq>g2c@v|y8׈1M]8#
+17QFytBłxijuL/EiLʘm!QS_!x _Tz?h1&&5joXH80zsLرQ?oMُvB7s2KouSh]hY.;DeIJcF!rB9n2ܗhw`oݔI;fUK3
+]Qջ;0\[g>20W?~AWY
+燰~\BӭHvjs)Jղ]m%,JICY&{"5"x>qq{3ˎ1޿$J-KxԠ,=y P6+TG U u4|NԴl-@+um0m3c k\H/!dVW/7
+q}W_!Xj {_9)0݈
+V!W7-3ƫqn!B_~WVgnŷHmƜ\ژ@:e3bL[ !W4VٯE_aZ!gՎkBEkA}mA|ypk'c'F^w\G}3~-=Y4+dZ'<gԄhgb31c 4r5٨xNn*'pwg# ;€&0o]Oc<N޾v}g50w:C[}TE߾/4NCBn@Qukqu=Ȼ(a(qgv|Vhz^3f$)2 "]q 4.t7}/Wu R@:NGC (4PG>lB' -^g]~p_71^nSK N] &|[]؎vcs({V|w~/5Zf*_?ݯHo3\A
+jc(|?Gwc> Cge]g [pVL^a,s"۳M3Glivs|jQk}H 5?sTme(D:厂z"F8ᄞk%GBjlWYWRUЛ
+B޴|aM
+H#m3ԠW_=2"|pQrìaz# 1aV1%̐3C5CKm:Aέ #6 JYeU*DZTLqŁ90a`7fx
+Uj?3Vw3$/ڬ
+S8vSlPCĦ۝>JN
+ާBq;tRG3w}`BۉQѪpl ֢@{Ke)˜S͠-bHDl/e䪦}aKf舑1җ:b]p_es87@6ZS Kt½m=/Syub)`~g vRn+9b*&&uV},^BAѫt˱?DuN0}NCK yGNhzx*~[dT+ߏ^tt(i
+LY:[PjR+Ѩ62MIlWA AoeYXgƓ-ݽ8G/ROԃDnP\M;1G3||*F/&
+
+pN4hnTR
+\;~ k넄q='
+2^) IjZ!N*r}o^QtzXPuӕLM
+dX^TRz{ +"K ȔTEQg^+}vRg3`ZFei-'5[Eȳ
+@E=tʔHsn) i. k6~,3
+E"
+lv-uC|JkrGkIT58`U:_; +H62[PqCnҢA$
+Z B*X TaqwXuϋN(
+: VGC2-(poy:mQH:Ԝtj ɸ`^{л$Α8ˆr*Ha*.$3hRك o")5Tp9YmY`ǚf;"@.S%3 A> H;@F5U 1&8gvR%y5אJx*.xJ{~q1٧0]BPMKT(: Q(5]c"XIKK$
+4'"T$?i0< DYnhHAI'H+FZG4mE;%&'3<۲[qI13$+Q&W,>(DW&m.T_3 Tnlv[5gyDd)BGx$@dEhс%Y֑K0!`D%+0JrcX7%6vqչEJl Pks AmZh UָhAk.X9M\UKС'k r|#Oc8M.pfS]'pH=flf=ChȖJe-#G HD
+p[7>WviT "
+ϋɨ18VPO{ هȼsڧ~a[<@Iz{"hHH 'r7m
+UP4Q9ꊏ9աB/ g
+T Xȩ瘒C;2ֱE=B1 iRoBO2kh:z"
+t,4*։]
+ʟG8 y%
+ztk_45m %f\.݈Wʇd*8(14W 2Xb={I"R19( у
+ȅ+kt A7A5j NdVEȺӟ7p>9DqHmASql[#;,PB ei]U.<(=tDI/)qؠԠeeZTXD&i" ѦuĴȷR*[jE-
+z}̀M -(Ct'B)6}XCHv[!INio~l)jOT 27XNDvAMJ`y/NBޙ?E u +~ig PRFTU5ϐ,,QXNZctiw|W _eA? zyBV;铳Wꯠw B w#y<g^.'
+vl [BM_
+ɲJ +6.  Q.R,
+jWPү&aNCa SZ
+GZC'ۢ:dGy5PXԆEt#uxuzJj{tD~a>ESi9DS,gbЁ#?9#_-c|0
+yzSs D|Sslj-]e_4s?gb@$cUA
+[M^eExZ2nTceځ
+q`^)4c3fR`8A)Imp5=.An=aƢ34kW6r <h1<j4`ۙo B( lNދ+JNx,|dh<SbnMDg80|{|%Y(]4b)?BǑ80Xd3@c6[)H/i@
+7U?|3Q!{>($ DsK$,"MQ] 
+OC.<_&.
+J@WN)?AtFY9L39RC`$QۥYUP+Y渨mbɂ^$">X n[ߜC
+m/]Y* ᤕqRz0CMngVK!h[q>-2%FMށ 0I0w=
+Ӫ{W@.+*rFeP%4,'x;uDOt!,d2S)Y{H|Sy жfiԤ6S%\BչX'-sE@<*kV{lUZA*s,7wC
+)|O"c0c|u29bI+c#_H 2rr(-/("Kp,xVcq7U!wZy/l#òtU|=͂E2@f#g%yK0!9/2J1Y8GdV$K`)!p@Ax8W* ~/|_% ݧ"W"'*LEJ̝?ө .VFC62*m5wK;a`'1ݯbA3oHAlũk\Q0zQ7`uqn6AX8o6ACCJ=s*7gK~$Bf$VWUEhܔ<!G!cCaVBX mƇȞ_>J3 ͂5ax(CfEF l1a.-
+*)Pea
+~XDgLوa5hc E/cu~ O sm싖ܩP,mN.6 etVlI6}스+[F:Cư@1_#Nc+J~U +QjCK!ZPUل/j;6V!C`QN<ޫX$P.h.m*"mtZ!-0Q Umt!bZeģ㱦@͐_1mvM
+(VJE%%O0CA].8/Z]acցN\_DiZ/NO,J5zF牶uU <`>nW1 4x]xnMƻ)s@.lydU(dr  Z5$YV
+u "
+zA4+>^f݅r;㘲coD& R_NI!HX
+b%3$%#%+蹂s
+82T L75i9]v +/Kl<!>eB>]~|q˺~/tˇ?[~ޫ6N4٩R# 
+TCgM>\h 8Q-!EF2y.Q.3'h`KpLb"#Œv-HàɄiѩ7Y%X#2By<M ۧ47[Wѭdƙf:)z:i4hb}'ɩHk
+h
+%JT*:[:]Q4iJ6$@e O[N ySDig'@Vd(VSJE(k
+`EߞBe
+MɧMX,Miw
+,5yN{#Af m|%
+:Ay$vJ,E-Gd剣`
+XLI*L s)+"X 站c݇ b ;N#ڧW3մc,̒AAc9nG@:6ΝbPM#]q`hT-p]eThxXa݄FX^{EG[>Q,8jPTj,`{| d'lDsZQ;wAGȵ;algAD\dԓc% l{85/~̭T_^%(6V/CĤ9=}f2l#ZBp~[ b:E%Ϸ7DُLiq(Q97xY{0 ̀I
+W eT%8|~8^#ZWoh2& UBɛ,e˺!%-9s)PNS6 QN I"m/_^7%H@u/E K):i;}&w!3)Z*~\_l(oݷ{KV?{E TɄ9͓Z97%y vE4F(/q S B(} 6VE y!Z ȷ=dMgNJ4;%cddY)i@,EhlǃьQ]>Hj`/
+(բљR6K#DIrXmbhh b}D r5%EIe7A0EV \0
+?+)"ubU$y #$f
+Z۷M4vB(UUl]gjC9uUQi[ӗ<G92?CnJ(԰s2ǿ'P5A v5mNwR^KL6f,gDs(7chm@3xܼâSԐ`Dǐg//nRėdupB׬pZ7Sya+ H+ԟ9Icu53mdg.sōaI7NKHH 4f-p$2QV'̚LJ
+ W&71d#_
+9]{,5Py-Kq$iQ ѐ4E8z: 7qQĕU[K5#ZAF*v ͥM Yںu 9dcщ󙓑z6Xl 6u;`bH`CXa` _ϗ@t
+l9m^.A@\MRn
+4;<SGjmˎ9G`GC*[=)NWɂG!{ǎAZ[95=' Ty
+HI\G DOw rZKBWo/@ݿ` P۪ʁ ~e 9d]8&m5R]
+׭orXVrVEchTz2Ui- mk AR4͝
+«O %] gcj8cybyZL"7zO6Dzjh.UT}B8cUVH[qӵIQB[Z;m4 ƛ[Lê; 2zPw@ѓʗm uo-/LG0=/߆E|]gQql>#yZ
+7!k\iXyY)*]~vF&W矜ޢ4,C=u
+Nȣ c^%Au9\6'IcXO ,!zBf3wMhE{2 ciE^ PŜa
+1a=
+P8,jtP> T@K`(ǘȯ
+%TJ$>xgqC[<2yڽ
+ݹ^I(",
+&m*eW(zfEՋ#kEkxuuR6m0Y蛀'LsypU#HFFjW4#D׭E5Q]vSŚsEו$Qöq:$
+AmhB@}ܝKMyc{$j;܃F;lg+Gt:5獜?Di bF
+~cOtL㜷;dJ 9-)܂
+7Yb9Lݿe Ii-ow1XN>L0Tp#dFz!Y43%}!R9.+1̝Z"BBa=FŰqЁx)xO 2JĭjJ{,͂C!94 JGKih*-L <D/Ѵ1#(dV'*!R<pG
+FЊo5E:|`D00IzlBf\-$,6q
+[*?ڄ8Z2L4n cyn)/ޠ-zOL?r O/fR4t~)8zPd$XM۞#UD7cEvqAxd<4klDh+ZƋDhZiMƥ/їel$n2b1T"2^ThCkfy$2R'ѹ~Yiw! f Qn1ʟtŠ߄7yc'we=Bx'LLr8~WH`C_I
+l=N稧a3AQCN(|klc<Cbza%"0Y/#8,)a 1$+E
+FzJ.]Mlsj:Pd478Xru-#cڼ<0D%eNy-|3Ex3t:Nhn蠂,dr qdoN:mV˭.~/( y4,4Y"YT#eX+ At%'':#}j'1"%sx$Wv@t+Z،EMO}
+&v+QnE(2;Z$N%$̏u`Y~(R:0E($VHikqsd=:kWe,]_A-R;T}̌GɸN(!,6a4<F#w69B@ڮV蹳{\P8[S8ˠ%"cʢ.YHiH
+Mt9R҅?B&tL
+񖟊3^t{z "@@E6LՍmX@
+w멨(z?Lu4:+pV'o1w7}@D he<"x%;eE8#I$%T93u /d;IE[#^DÇZu,}wvrKB^'/F(CG)鲉̇50p92̻ם89P¯oK;*vQEW*@xH3o2dwj"tdxT)45f~p:7c
+%A8@Kפ" W|8#tœ$U/o(N}Ӿ%䋃._{aEPt>|82ؠoQcu[4@E`1u /'BɔVQ ׼єe 0C4-:1zaegBn@6ub1*|imGFYji`w/7^§N
+I;WLވ,p:"ϏMa &9N`EYYѷ`{/b]]3 2'n/ˋSm
+֞,f6m%OR@D H-y`8+?ps({Pݏ*rޖQ9{v(j?(_X38 X_W;6Sd0
+yTD<DFl^KồqpZxLqRjF1u1o@]d2*lo77S
+[O:dG>" *&%Efd,wb6(51"II`HZ=9R
+ e):
+0&Zƃaӕà E&~J##8Lri"" *5}< = ŹU޶ky'M )d(zöȣTAXIdV(utWFn$ چ8& .s'waj)CA!IhXj̏C%MAͱm.f3_X&N~mUa3e`bͪrnMXAtyK4E ayڎʽ(N~ ԙgl3ʀ{^{9JP!* 7Kai&8È/0
+>%N&5^٭OI>Gr46`KV?,+~1ȸ* <V d(?"Pa"1 z~>[Hh5-ƨ͙‡Qp~
+`ˁUWEAd15$Fv`3Min\Y#וhl 5. pOy(r(Nƒ#6H=N1hewA_,ϚN0d!80*f%Ez*{U;ʭ,~ĝe<z5JB`#:ceЄBhmWPOӕ5sr/n{Mi9Wuֆ狢Dhzǽ ŻaLa(P+Fa]dZ,P|m4XZy.D3ZOV8t*V WbU
+<hυJ8@KpƝ=ݜ^xgMpRc7إ®n,IPvH.=XT@Ȭ&8H :_PBtDi+V214f 4_ݩpis
+d
+@}>*oHj>U}e޵ZzyxHϖ"%yI[L&MC8EBRg
+CY(:Q9y{aL̃AeӑU[+p=&٘^!B38M%E&?1ˎ57=gɔO[=Ou(~4,
+5|Ľ(1
+JCl/f^H~ Q@2KHDCa`PzS?2-TS% T"=]Y(^jHbK -WN,J੶)>+E as A5I';*dbrE*!1 C W9iS\PB$*%A=Ht-rGZ^E w09ڙљJ y#p!Lu5qL`d`5ekfL)
+@8Qɀ,}EC?d6XGdCkʽ̜@j[?^5>- :bq#=ǦLSD1ȪuD_Ϊw[;C` $faq4FL(]QRdxrS5k%3|z^(Vzt-0#e՛CEZQM
+
+
+\w"z{p٣1'
+2a3bڃ L<CNڊPM(yܙ4qMjBsvQRk%RE8U q)% 1-Ȕ$-
+`v9h.#a憝a>y "/_k%ex Y qS%8<p @GBgJ\ C#L*Y/OL{zWZX=
+?aض/)*k;a؅BIp!d0<#Iq'i-kj/ (M0SN!]+sm+&'6 +oǠxߎIK-kG'T3ٖ'AMk
+)Lu0Eiir!,3A-"#ƾah8-
+- *"ӵ0IHqDp5 (JgDճ>6cH+D7@ IWQ7㇎}aǷ\[
+}PjPT 7 QMh
+NߢS42K[#ȝ԰1Mds)hsÕepǙ5`zr t6|Jh?Lѕ
+1^BUeg$?w&"U/.}+k!pP܀X@Eۯ5!5@g؋$69XGȅ'U:?#e39F)Pso EȠzW1-*HV/SMЊ#]PBƈ~uRR͐ (*_&V`2Q(66b89MigH+Y]DzA}I.WB+8ҿ6'h*hǕMRZKY9u[5R4L9%M6l3
+6tk?
+l r)+Vfq9 ]Ͽ 0Z|9~+ǗÇ.'*6}T1'IL ӡ #NmoH 3q@8)K1;"8t\y4PI;("x ̍L'VO /e:Lz+~:9$w\ƞC.ZcEHa)V~ĞTH2,ԅ`!-z4_l+Y!pV{&+8.0&MSoP6q-H`vI";YqsWHk:[o)x;!i#=H3*e!wNuY$v{,YǺ@2O<GyƤ8B҃XcHxve +z}Bd6^D)o)Z!Qj?(@jhi #;1T4I^f'?O;YFGD4@juD˸!0`C2$I'4ivS,_jh:$餰}?jQUuI?7 ӵOަu\ U, 6-(\1ds: f1&}u:^yRW4QϞض"I/ ۛe9*3I}b<8feg,'<@m3(M"320p^- ê&`4!62 L-j,9
+liL-ds';PҊ<V~$X!kU4Yvh73cp nxG?"t]\EQ |/l/kLz*IY{\7
+b /W ˯w Exx+VɰmҴ8i ^br2!`+h
+KAO毨E)-? #@()7a!M ?.B6 9⫦T ͑a!u*x1 ng
+M Rwloۈ
++<GV
+?3r~cݎw+3Lb$ưtQ':C:Եq(&<!{AɸΏ5Q Iߔ$GNdm}P/L*R.ԀrL7
+^HWc-y8>1H9ΕBTh: Z.GEtļp|ӈ$nIjLPoGql'N!Oᔹ8cĞUZNFDeZT Lnalu"l/eFsfx_Re?5AY6<̯)NyKrȜZ-~l
+҇^+pm=1\蹗`+A+,ImsPH=&l()h1;LE@`E I<O"}
+l8d4ci*]jY{T   ~zAoHF ^v=_!ٱJ_̲v<,ľ+{P}y(̞/ˋL3-:񝱳r⦹%oc;5]Wd>^5JdhJ&&2Dz׼(Hw\&vcm7'UTPf,Ze:
+԰U~6WdFv1&GݘS}T-Wŗ 6@pYl* e{1.z 9Xprcs?b ':8
+!qEt8kpDo$Tzݦͯ1~~+>QM#h v<ļOgX%>!x {xA{CWDz5%(4_:v`D"cEԑ_(83IF0AW*- PHG<d8Uy("0?xk1R~KOjvKE"_/<0AفQ.M<vRhC aC>H{BRQw|G,_ t9F [
+)#r^$k=S
+b-c\ވYdA9x,La Ԣ5KfDo`+nϽ`4¾bssu |lDyRmi6)E;wK8M vM( Pߞ[I+ z(J'ޙ'!E"p'+,;\"GƳ cEy#Y}6cbd
+j%e[I+Ep#YTYpgMt>s@bqGMAf<_KT1!G\P\8 :2kthj>;֫1.0*4KV:4~sV`uufđϚ}Y/ ?"(P؀K\D&:SUN˽M'G ;a U=e6 4Z|U
+ A ysa*ŽvtN^К{̰,R ,Ť%;H2s!ɼgp#jѕ$+SP'RХ@=
+kɕA`do4-2Jd(h)+dV$<F%iG@ Fo3 /h>}d.G׵ '?Vpc= !Lb(Fb#}iWQOY 1 ,ꩀ1V04kSIY'@c#q,Z~_Vpe&wWeq 8J҉RRl?X|9\l+o21|/Բ:B0
+ L}+zQ] Wp@Mk@L2ntNlY5 †bZz "z4:&MR㋅^# t82͙&рK_h&옢RVǻ)q vj<5(L ]F%$ݕ}3q.7}BHVƖ.'jgj![cIRR d⡱aQ$Dcc YSRDK@h-@tKƹ 3X?Xi2+w$ª  S?J>}eT"^?hX$*BI]יּ#gZ , {!qLO';
+TM l54}>vG@D6WYId"9*gL
+0q.;OH $΀/y 1od@ u'NP@>Çy@b0R`ca!=É)U8%dYD
+8ℒs
+J}+hJ>q- (0-֡{„]FW$O)%Ǘ h\kvN`2$!ztU
+L.h[D19c8Uan&mUc#G>e ޲bXcjn0AI ;KP:t-WFfx&N𜖬M1=.-a:*v`PBjü_>p[ڐJIH~kr;sK%`sh#1ֲ`~͢
+I\H#)"MW[?orYPfEh,YYpes
+w8@ukÅp=*~)QB)FĴPIW2n{D?-Cɿ9a9DhzbTPZ|Gr9=DIb,
+EG8_F 0-#9Zw~?;%;Z*1xjfx Փ] #8McSIɉg*r<2*PN8ޖͭZ%zU˖v(ۡ9t\nl/;n+Ъ.(1hAO/ ȂY/
+V>&1Ck&KC@wViO䶺,
+ ŋ
+Zm3z KzJv Pr@zA:|SHt Jr.
+֐Y@CY[[DXؠd|$0Ȩ.! Znaȧ{MkH49fAHkwt]w*$yd0Oj|0<MK|~IC(jyX}%8^sȏ$uKm?78x1dKm!EDcY~muh7!Q%x:'4`YǍ5SQ )\bSa)3p%MHz)z
+
+4~c^Pd__vjYV|AaBѼY 0ǭoO1l ߡ=О!=2L,Oż'ϖP c A}Mue8H{ ?e(NjJMA"Af/BuI5n3de K*!
+U7KNy22%w闡`q¨
+"bMl(Eӷ͢׺*}
+3)r)
+6 &R?~E5GLeٕDd)٩r
+ HmAPs IqacoÞeٵmF6T
+#/7*GE" $RyEcvW(wdVȮטN!6
+@Ms6W[ص~,?
+(-ᇜ|"{X{O ".^ hUDw
+L*'l<y8e2h|0J =73ZH>[NWe'z0ؓx.~"Hj48{R {<so _0Ci0^HY Yygݠ^w)Iَ6"juY<@n[7MnE|2j%+œ:]Ρ:Fv$S1GG[E-#y][mEͰ1hhO?gѬ*]&CWO%:-:BZ%\?q18ɜWdxخ8HNݟ7PdX
+'c)m^?9paQe[ !6z&
+ P1ܔ +]ѯW~YgA@E}C \:Ob
+_^]<PFqKw@6j/-NIƒmTQy84\Y'|yzUg
+Y30gWxqo;Wqa&}+%11nά0"h_ɻX#%l缯E<( Xgo{ 17K+4pq[8jrٸ>%ۈpcz}P6˽{ 8Z=JJ\fyxp1uKfp"9}1.< l98p\8JXcG}4n߆f0c8ר FIH{NGf.L7!
+ehㅞP^L?둳IVis)xK'ea`mYP@(| ϥ1*/z۪H@52𗒜DnqqOF)tnH
+S2+o;?!!+>xe݉/E?^tm@z*jcJX*,29[xj_ݢmA #\;)k ֠_} {qxpK 3r)1
+ejM 3cC))6_~ӟd2M/0zJؼl" } =m7Kv/+WK<^gnts~$!O}qz9e+a_iP-Xa(bZsHB<k 77z |Mmŕސ(0s6/'E}$&ehj,DYM+E4Rd2e=)">R; ȦlCNnQAC^/5 pk~~`#||ASq *]+Bg>Zm(HJ|) ?q:/XH&rs;rT)/ENF~q~GڭY1%>_Qųp+
+_JY^u3&|*oӔLU[<Euuvs5G=Ƚ
+rgN
+r;e|1x\Ӯv]FJk{e1n$Hn4 ùJ۵?#įH5{ pl֗#U9'hs9I'va:0-lQ;L% *fszrۖh#$|¦nLc%m$#<i;lqv]9(SAWEm*LUUz3{궧1˳?=FTCيmy#S*G+Wi% 9^f7*$u9x.e$_y
+HԗMd Ow~(R$K,r=ón"% !&6[|*Z>Sf!^!
+t
+֮
+Zdk]ԛu]=j/>n, Mo[~3NG ׊DG_1K܄jjgj7y t"M!3q҄q,1:%ۤsSaTaN{I-(d}sQAw*
+<d8t'.E-+; :nF^4]ЩvQ |Ҝ/C6:Ng<C{~-Щ%9]v*t\N z9`\٠|Ϡu) ?3Y>N{Xn{A.Ϋ\8b
+4eB<ʚɀo@.L>d<%E\\
+Tȍqqկ ٲGĈ,Ib\rFZ5D׳9k UPI4>c_Y)xÿPQmUsAl#A Y䄔hnH~I^җӮ`2#1AS6[.ݠ
+H3[,OA-+ 4S+-݆3f2RJe|5\CFPC{&WeF9yhZgpv<~oXF-yb㚴j훱PKV0 >k$3왕^ hdiw+iњ hS@@&!}tܯ tCRmU 3v\e؈\#yEٴڗ7!(h $1:c #Q%bNc_*VaxX,Esa#ߡƶX5g21z>;4֫{[^U{|Eu)t&gq^{RԴ©.Gp4?zP^y+HEQ+*ٖϹ5(2*B>QCAm6^ܚlarie H+H5
+_M`"_CS8 Yz0BqhH+
+4ݐh)j"q%!ܮ~N7CDV\iZbdS-[=
+ad'Ђ0ю^
+p ECL{>N=9c^7a%L?ڋyv^WܨgP84h=>@q͞E;v6R;sOo(,v`3uu$ iOptXQ8U4
+[kbIjׂsr{(iU*OLK]7|' Ώarr#tp.a)OzQ;pPe
+ <+OLEa@b#Ɍ镗??Ky"җ ˸ RB
+@ bfd&m9qƓ
+\@/FSFk&JӝdПMK*uL6?on#Vu;Nէ\A9 B)Evb >9E0!)WƷψP=%ѸDZOb):?|y{Mi`mmP'[7p͔hYěͭCW _
+Wt3Ki&ͭGᗅ ̸HZ.'4=raOsl==)dpzZ; g1jTJ>[Rh Q*#cQ,* sNMcǐI1/"m'1˷j?/įCT/S3=ҖR o$WT
+@ ?S1U)Dضߝ2J.]=[.u.<,
+C"*f=<cH'0"
+v
+g./Lbh*m+$:SHxHvLգui6iRz\Ư<dxVe/obt\!ghxwE?
+ʘdzSj!bJX/q5{:ޤK&z~4Zeo%FB!1%_ʫqzJf Ԑ 09Becux"APe0qLNGS%X
+PUzkJ_5<_A\(MZ+~ :m? ]~2.)2B]+<RKs|N RR ~p6z=??T<!bJEM՘'?#)\@z//l6a9Q=P=bj|=Er6gP敖mj/3Ǘd,}8. I;0^C:<Dj|&T~x~*ӄJGH=
+fJF1-V'P5ĖA)O֩5wحd_w ReJ0QPF!dRC;FWL6g»<ݔmYXa~Ǽj niPJ{7n{gW
+ҴMhgOhOT(2?%vG5eGQ>6YYKݞ>f]hf(Kf<RԲC@prt ~]f۸4L
+^Say(03w<ƨs&˳)gsFuvuۄY+ Nۏ5ugsbޓ&Ik3 (WqAɰ|96=T6q9_"@ܓ DNT i|"hnlhM`\LBL`@(å;?;T'Q޷ M})tnIj?^C߲}AP/dJ?>+%n3 aƚ8I३#Ln ѓ&GA][~逸]8SrWA*#VGO/>QaA/(2#7 tcXk۷_ QWHۯ
+RWq5)ZA.?BJr!/H]\ϹPPP8
+(GP FTkQ,y Bd>oץT
+.Rםg]I۩{*
+B]`9z
+_j(
+ȨP[9 -lZVb)A4 m
+ek!GV&8`χdhXCX|hPr&FyխE ^Isߎ9H~쩙{[r @5^⸄J*4,{ůnj/>}USw?^i@.`.SKxe@|ImZ ADh k{Ú*]eYm͔Jik1K6v3~$@IDO)mEsp`<(}SM|t)>ZęgD6ĉ32Ss4¯bX%&aSX8&a%NY}ART$2~ׄX]~H- &;߮qe"X7Z+dԇ@&6i?OXu40\eog VcE>%zRpF J.L*8#Z5ܭjʘ>^zg
+Wϗ7`ˉxÆ:7ڗupEUdDO)0d
+՘L'ZWžl]c  ۙj$1 F󛒼? Ƕr Rc ϠM?'Lk0s|޿^j&0rݬB:6 B4W}OxpQzwEuִy zW[
+CQ6 aKi%Eyо˖ׯsVWBT
+5ڵ1wį 1iԟʕ
+oe:罂 A&nhT++OR'ɤ{J3 T9C֝Դ tLH
+\s' Jq41o,*QEڟE07q*1zzLxpb{=llX} 4 Y;_{P;߿X-`ϸ'i(Y63!wGI6o|ZRf%8&:{ .RڠB4򀸱o1 bp1 D zCo/ o  sX Ck 'I*$GtJJzOw4j%v¬'c%&`EG2HU[T0pOJV)ڻ~nBZH9Yo|Kd
+8!5LcK|Ė5~g&Nb!D1^s L +P#sB{=i4|XsIOSL<x^f@
+7)JTSTҶDc+5h%
+ӲU)9^<DDL L׸,2u <Y|}S>@ލH`>1^X(? N+@)1xsk<؋O;B3J0%&N<'w.bc{!i 7T{UYź3ػxHFW)q`\0Q~L<GGNA|$PEGp?Q]+ VW^9s ‰$I~]e<ZsdaGxB4!6QdXX7fgGf;`0 XMr^p3+_d􏿾|W2]}z'S_dB.;nO|fR8Q+ 4B4S g+  3A^k F6ȧ B/J:\3L$J+QJV?
+3R{r6\hc
+
+^]A,Q!1Ո)W+TV) m#6je}9D%-*rOWv{Jd"RU
+(BUB0 D~etρܓ9㥅 h@л4t^@O,( Ψ"4藪L`9XXðQ6CRdHKCAB; .kV
+k"7?>?nzƄX2r@}B=5p ^%m2|=|Wy,
+(;ìQ|t
+6o?B10.R@{b¼Y 1eޡF ,],`Žqc ĵI,8'¹'+tA:Qjv#1Y_['?&"ax6  |*I $.gtQ 93g#uQգ&^@Fi eլTMCXhQ "!T_
+#<X[Lax$qPtC$C/E& ے$i)1&cM~rrF7a}yɨh9g*yJŒ֦Jta"P$sIcxHncJs#v5wEol|!54!QDPN#-KqdH.?4= aڽ1L+t^V+%i4kZpNkd [7K:d7xRWMbɥŇwzAs1$EC VN~ǒ߉;<[L*SnQ:Oz5˙<}轃9J>y(@le$1yKxn~0=,2^$q6-s$_6+O%4%5nCQ!NBre3.C
+x| %UA$oBD {$={&^(%it67-àr/)$e|!X$7ϩ+-
+\qPC7_ǩrd'/J*E8nu#PD0(^M%% j^2,K,
+ElF<bF4Ҙ֜wZǐF3$5=_R@$a3 ػVM l:͍mV]"o%H)2++-5
+P'~αD*:^h(Ff Jc:UKtڐѷS&̛?s{*BJ T4
+ʳ~<Q20xj  $+4$h;ĕqAtG8wA^jWsN^]*޶'4&~v菇DEEa䦨%-;-EG ݘD
+f%-w I˧1/@}T#t(;93p`KѰ'5aSxP
+
+TfZ+K;E.[BSsjNE- ̩$e :_P&\>7;Wq=~[
+K%E'дHϹj #7_ 7fdV"Y_YN[{TUY(ii#th'LD$>" iSHRhܖIR`|pSUrQ~~<9bSi,g-?Af
+*_}%֫stO%% tg$xK3=M,=W"9ę<
+&008}g2TBO׾
+FEAضI3rdyZ~+O, Aĺ<7 ?ӂ0#g?*I:de 
+̒w* Eo}c8T{q^^r"JlM"0ޜo%qb&tLu⦕ i5uړbV֍;:
+F(qi^^7D~1]SΘ&YL?"z 6 Z{:Fwe x`\o,7ʢm䓂VizYl4䟷=.(/}}
+V"")L[\q}(]`q$6Vy̭,a^v9h-|Uu9 甋(-o~T@2?NEo Q$c4SgBڡE|+ 2d eLrȕ zC@̵&oY=ԙ
+ǰ6 nYƢ 2
+S!U4}>SiQ<AqlM/V yqQ(%)3`З9~D+1N6zCjO/?` xh'H>,Y M
+}7|#G-fSm-y`lz߃x->1ø;\dxi|&@*ﴣ ' ܄ s9@p7n^}3'Me~CdЊZc*'5AՖڲ6$>LfSe?"8#'rwڻwL&(N.~e?h4~cPa0 !g2漉yѳUB*<uzT honX$py
+*i.%/.fR`F/w7W?XZ
+9!$eYb+opqZ#d+>GKjn6.pJ@&CH~v)LFڌ|AtWCU{e.GȆaD?s:yr@tr9cX(7OTAK%keYKLE~0yC9,f qUURB՜p9(e\kNi*\ɂjQ2Fv%gU'ĥ eYN1s޿x˲L[r ޢA|$&t(&)B9h~LCx[BmV-.by_LW#OP^^6()oE mޭ=2_x_H`8VɾN<)8 [`翠ԯ*Q".Jqk9QPAYl1ə9PݤS,ߏARTg TuҜT0m݆^5oGL5d`ssˆϫnf2oْg!2u"<2nb
+,l&uHPjC")p&fi''*sɶ8HD_XXF,ٖHa?*JAۿl(O0iO˳anҒyGNp0YQ][gn8J"VF?~ zgÏVպ;}71=7XEUpf͵8;f 3fiLm$ ӴxD+GV;3ϼ/3/)8"l0<CR
+WvW088 j0,Qx r:G_m H# tQ&g7Fmf֑͙b&{da^@h46^5ā19ܵ0FWG &F+āW"s:
+/Q[0ȜQe7RIjAwQ,DNr29_SyqrX%?~9 X1.Oε0P<6^o+no=P5q 吇` u\*]EnWH&aUkR&Ao1c{z{ ʥs/lsx<@B8
+9KkeYrLsZ]y!PdZ (.6UFsֵPdR:ԏ̉<k] 4,.u7τhi%Z 4rJ8(E3Uġ1Ŭ*-Cy
+z@/DiĊH1?PV ByIr12vā47xpȽLJ#Ia~3sG$m(OW܏i2>.$<2%E&n$Lᗪ'v(oԸi "dOrTH̼faV%2 TyfC|:AK&i)F!B({ַrHwjh: ?_/[&^E
+1el:o@ b쩈26gH/h1&'1
+bVX@ԉ
+vTDOB$%o\IN(^I&8!vWp-Cو^͑Ie(a`rhah^ OWDUTe%5)}ԅq*?Bԝo9=T\' )KEaAQSފ8`hf?I͑K"Wjr4c8Pbe@4$ W0 71٘nFFI.06|
+aD]2Ib}iiaTYx+FVofBݱi!ln9h&^dkwZJ͒k <:oH ~ap
+ϡзkS AƣT?vdG 0!IY=ˤ)TEgPB#阏&^d$-yw^rbCQIw߼MS5ys% $-zX+#ЎQ9b]h ex+}ŜZի;)!)Q
+Gn" #g>
+m=˻ UuwPPp
+#W#3Ql[&r]g& "+AJ2E?
+chWitLPs;)JUxF'@%{;ukyQW  RG!9
+X1">Y%KlJQ#8 ~ <@%` pK$ 5O{Y~T9) x i C"ˈ75c1xgv2Q*hC ^r^lj}$.:9#,ghjZL+@v0{ sA+P{`_XtpF3Wpޮ΍Olc;ݜj6^OEn{g"BS0ֵ7=g*{ Wxd| "M[댙(a
+cDŮ>{ tV(ex-N1T݀Tj'aenBX|$Ue7,rf،H
+cV6Ē<Q(( ?4g{
+^'J(> <z,"1TFy~Gφ[%]бc"9'qMx3Hs(1Ѓ e2i*YD"*R
+
+(feDwdbkl1{&bp9_J
+jɖF|Ӈ&/YΟYS_Mɿ/pցU4ۃ)w46}TM2!
+TP,&SwdqX8-Qqr o֡5ɧ^</`oږ
+Kbm߹S-7|cɕ( ix;)FԭUI
+}=|%?|ſh4ҰX(hJWd S8:6w*'1q-^XFM4ƢSS=5^?|,PþUqLPd.E{*mq:iv$u+Be Wgho0U; U|Rebk ʠړ# iNoJMv, &n"y |Iy
+U/e,E p9!ZK`r "./RՁiI䂳;rXTT= tp2?4C(vL׺)OA;ռ k/cTfԡ߬F!N0I/-q×ZxkD/C}i[_.Xbkp: a_SOJ
+% 'W(u~y?èFKYm{g?3_oNs!(16J0³ysu$ {=Qu%|
+?@Qldxk'ц9"]Qͼ
+HNi^k@0(I,x -Iv U=*P-osjE/Y@ CSꜸ^ MUdT9QYy ɔuWl~FErdZE7C[ ±VcFu<`+&n"(&ƎlpS'K~G e`L믻y@wڲWWrl@ڐt@x(F (̸VjMo`/Fv Ix[d*{& ,5fYNNZU`WvYz5Sf!cLCrXlQҌ*E;hWk!0 x}
+Klѫn74M1|oM.
+I\w9dF5evj@ ]{@f
+HMc9Ow6De4fV˹|
+Sgt.
+$ş`\tw c=OYӻI?E-ޛ#!a:
+.k-6d=:őzY-3؞/uZ-d
+V5;rzl#_- ;Qz4%I4e67X1Y^z)^•L4wrd1mj3)3Xc#!kɤbL=4K;~j $DE3C<ٛK^:Ӛ2}2v5-J3f'%I ~2B&]@lٳ\c2eăb02#`J;Gt2ضC ќI=O-@E8 #\1٣ `A#`8#b&k.Dhg YFbMZ Q,D/avUQ&mgdnEb΂{=c8Xk_AqBtͦv'yF4HE N<#ކB@[ϗz[gҕ1̱fΘ O%nʓHey
+v@^wD$.qrfjZq^ \,7I\irQQL j:R菑8ga+zՐb`u["eៜx`E|#bS F!9<@ frÜ/{`ɕyI`H96@G_tgdg*`fVDPritj-/8Z^ӖBNl64ڴ"Ig6
+ȬNH;d\ [y2 Xۯ) a/[;J@+ G xxA}o
+i#\}1a1\K_wΙaL'GU#TN8sCjD]NQya%U"Xp4\~:
+x3-E>ߜ 37g'T`ƣ> ,\YɓG71ZGA#a0즈`Vi^J 8=o85h1krm8ʢpGR(&b،mSz$q 1Ěs"%::54 c"8 w%Ba[^TQ.饬À)Od6.rDwg [8]s[XX&}]ExXD3NY#-f)%hsU>dvr<cU\LG9; 0ζzCKP$|;M,{ϾkkX$ ]BGע';LTHcJ13= H*q O> U(yMg61','eC?ݴ%F>
+ ǒ fCM|%Ȏ 4s2!ǘ*攅λD_3hZ/<T?߼ ]q= CW)E)
+)˲ÄNYl = j(d=xb&pޠmu@
+3phs̱1O,O{ ݒ^pln`<Q
+9@q Ryqn|"h]HjcĮjIbRIV
+[`T&6`57fkɆ5گ6wKV!q>AmG\@Zt&mB͑[8;z2ZJ'T&j0e.<D6U5P )QolaNQNASq綧"B<.çd-yoyJ 8nrM
+9f(X5b=GC(jނ9w(U>Dl˨HN3q_ׄxNy,j CO*m
+FL>#t{b'5$'(/s4tJD^|sj\x_3_.麗..ֵo%EVDp<`,X4k_$9^q╬!ѣ1
+cw~$98&)re7}\]{.
+z@ 0[{-R,ʚ|޺KBK?bs]a^GFڏgh/+<e`,.90Q8#hx]JR$$#Gh:*JGEk
+@ESBH>>u&'T~F#z-WeRy#Z=(D>WkʒɧQx޸d 䡵IK)Z%00"ybwBI5PW#){"} YifuL
+M ؜] +I1Q7tNNtm;KM6z8,q9O^WX]Yg9X@ny@SuKuD`!EKz7 O;Hϵ-_$zMcdًvMVB!*0Uo>)c`qzxa "=c)h'-Lm` wzDG0EA\EbM9Wvƈ
+" 8V.# q%<ƄT䉫Y'Mf9v-Ն4LSV%b';7ҮZUuK̀?HC{sҌ I-4zCXw%+d}Dž9O>qV,bƏ@,);幣tBbI؞K'ߝFw\Z B/)6\w2&<8N=d*K6JpZ`uSbX(훴i!%$(Dvk=H3vΡZcTŁK`DT'dZU 
+^F _;Tr ifSV_;_
+ˮhƃQQ,\
+}>DEQSGrU5u<' -?UƓ3(>Z/>[^(Z9 ;=_/1gD-˅Ÿ ,cjңPO$rśBF
+t(#"|S*N'dds}{epTQdس*dַ"t3YU RQ4^PbX5
+̓5ti<*asAԺKVqWjEz)ZpE*ڝ-^/O#c,gɽ"*#/삿z)>t#i`FFU!ߎ&mкA&k*J=#PrC ^@D7$`-6
+i.k\+6ڴ+3&t.\
+av (R)!HE29A}uK:<2QF
+F~][= 82IKCP]WԄ3ygvAK".U"@[-im|@B(Tz8RH(::`21]&lc_Є/JΦ.c}$5&^^>A6tl=I5>ڰڈ*n b4vz`K69=QE\S; ")fS,7blCV>J x5>ٳt] \E^J=-BhwjV@j.]!d.VQvAsW üj˞ jK9J;IAsT8
+G1aZ.lX2.惐0L#ƔwI .scFI8ʦC=L P$B%"grڙ& _7&Q Chz{=[EYf.c @!N Ans줄_՗&^L;#؂Gwϸ@E!%psZokRgp@V(\H UaP"m<7<3oG=/(N̋F+BuXKCtgQQ[ zRj@$#a=„)kU<n%7olxy3iKqҿ=H<d[CXi"WN)zMbzޡO}EvΙ搖ڕ2Y`I(!ԡaRS|}G"餂 2O &T h%<\c'93J`0nӳP: *C=O΀:}؜X ?
+ESVU}> bՐEe%Vث4,hVb5@ SGiW~ зl5= f`fS4쿵V۵
+eX0x5$lKWbd5sU;(lC@B؞2
+UjN+vhʧ
+?cM"xeUу^^ .?87e,LדMYQ .fECCf)ya\Jc\sPrIZzyzJSS$UM}M͂E úzq=M< oBAn\'ⴑ1_1.jG bT}*%:5F:yϵeQ`q0Ra2~gB"
+_hL=2 (ET R8d*@ֿgs3U dPnB 2#2 YS?Seڂei#R A6ඉ):D*tT"bQe]&7e0 e#^G* <V>斄@%H)kyT͹#SϹ۹}j7݇ϩ3;{'[Ui$c
+IBxg2y9ί nRy $ts
+nR3p
+og`k<y z)'"syJ/cT?*zS5e%!O&yJ3uvavS lYG7Oi@x9) :
+m<u<=Կ\-2za- LJ=:̄}v33w@ `Vu0 2xvB (tadѪ]3+)w:g@lmBG dgMbec()cN9C_+0BN A-Sa|z[/%aSs~k3TK[ײCUaq ieMǵ)0Oss
+- "{ʿVbBmWس$Ҙ193``}RBO X
+1W}@7Mpuzgo/5"
+ o 3'=!Kø2T G̗QovoN ,dfpyy9kSHQj&W7ҭɵc=79h>ũU9Z\'pȂW2fZM:TB_{S˩-uI^5[KۛICN 1)|uFuc-ʈъÔ"n*PjW$2Sw%%;_hvLs2^DfbyZ dRCJ47bL[f-Y|.Y)vcO-6CMgksʰ-?ӶZK, 5i`J@-~T? ?@T^ER5j13m9.a!&X.G̽A\kitDË{fMSZ}XH#! n7nNtO!,yHVW46ld zؗ4</0> $O{yiÎS06d#7f{B2n Z[f)riwY7ʈ3kyS5|u甦mc0!k^0nm+NDƔHb3U‘G;35.˲I62Q4| ImS;p9t $dK1{W\}rEeYΗ(HuYZ˃\+,' >$-Xj$Wqia`+&(-a!ݜ8IYNmd)gCE<UV&Ü@)@|x<GHQqӽ glyx&#Ƙ[cWSwDXE/6Υ𪬢K4ԣ:cT˯1v'uzbcorn&*oYx=V:| 虴wޠ7xR tI0cew@rx)RA_u 籩[#7r]Sݒ64fVeRx +klfb}TפƚQnZ(2z~2;1p9 Cqx{t_H>wU5}P ڮ]pD]"dP湡
+)$88ȠZyw*|* ԮݫqAH(V;Щ9<@WƷN DQC[%>4A<;0HtӕxJvg53On˫vLÇ^dep+~ 6(r#01 ~xD5Hw@8D,0+Y_ 7+2X9 Ҡؐqa|>dZ
+x$Y+Qtg1'LO\ #< 1*n*$onЭNc)#5v ီù5`8 :׀0^9ɹ6W9| >| \O1?5: 5"{Grq/ub$)hꗁ(˙Ȟm#!<Lkմ"2~ !f{كXꟃ^ѫA:@ܐػJCz`"T~De,MZ^Z_|`sOp',<{!UTv W0|țC2N 'W@ FLP?jR՝aJ'SQ!OM޹
+:-<E,ŗj.'X'b"5& @$h1@2(~"Ӟ0 fe3D4CR{cG(.eX!\x
+TDA\{!4{䗸CAzT.!nJ!TIɷ  $cuKޢd
+rS
+S69>菖?&2$a蘂֋7B%|
+)c*;"yqD}wv*YJ #nd`S& D
+A\$4yf5  CRJ5Ej{m( oRڙaFބy;kÝ\}uR;&ƪhY0 +~y&D FNdxENz2D`6Tq x>&b  LT<+5q+VSC*Dfv,c#xJ#L嚏r +1Ì|TX5Ȁ8 HAm[ڊ-K?]P䤄C\g;s ߘ8=k }RXac:E.Y"ѕuPV0; MmG8lܑBL~^w?Cy1 sדbXe|VQe}Y8 r8*;z׵)iA9p:& Q,7%! D(L 'N$uByCع dV Iۗ! qy*J|:핹> s{dF5Q/2IZyg "cE${)]!dUvyg
+pgmYdDBY wM #eɧM:`c_Sђy
+v_}Nc'+_uJAlWz0Ev3r@"Ib\YT bzO_;hYP 'L>>8qmCl-s瞃'!ۜp8z]3Jɧg7(O1h4e >S0Jjfb`e'bPz[ @סNSG
+
+srx8D>] M>(ȍlH+tػnO-Z|㸠:ϐB6{ bВET` eB&/ }Cj6 `FY(fr4q-
+y W?(jjg#00-}an,$8 zd)nkhSs_r ]%VeʚS!A,!c͠gVA2 OrLSp!2QXh` I1kMJb[Nnm (Sk% gkڈvۿi Jpk'<PKj|.\<@Thq.T5)\őh $֭%D5T
+kK ~ꤤ&ѭ9OW_ʃ9?`A '۽ЁYWvwF.Vvnfq@X>2-YIJ\0#u9H{wc$ڡkx= ~ה U4$!1̍x(-"_x=ᅯDܗ  BySF`HM=ol/u<iPB+Y >Ř)(`&hgFEI5OaGzȍFtb,v@1&u%z#9uʗAu2K5qPjS7P٘nW&j~SY :FOmi/dQer[>_Yh3c}i4-.;$Cyʃ a]q
+U9BNYb|P!U94"J|JsÄ!10fLzM!9ˇa2#bդFB  k\LjrO뱱go;kx/sI$2HVyjIfp0=ܖc&ͯ6LXl踭7tWzmcp
+fY9)*uŖ:k"__pPGQFUrJK]R1T;TJL熺#p m1)Ug`R]sI(̄{7$ߩ*~OJ
+4[}CbL1(Fl^P
+(Gyܬ=`Ibb;TfL<b毋YU7
+Kۇ2ipCWP4yATY(ROQq*0ն!& < !U״l |/-U:S2AEsO"T1:ŗեPT"yhKcr
+b8E}<MdE#ZAC|:$|DVt
+&Qz1鮕fApc>MZ01з"0Gb$HԂŜ*v1g0㑨r`L\YARv !(=(kz&=5J(`F,IuWSDՆjQ2\4ɼXxg3&98c{egPn+cfdZ >(0HuP
+eCMECS73NvCB}3=:uUx?'=4]kXjֻ֦GirK~qVI
+_/k)yKtEeE¤5jɍsqӦMĥs.CsgrZiy,B|>|xis2̞ɢ-_-{DFy@rظ(qO3/w '
+GxCGt@?o@ u]슻(EobcngAM%Ϗ>~$/3S>uR];$.Ư̆6: bip{$!vzM f+ʅ/+e5wqbjOYȇXaZ,h½W@d^\/_8IêqC ڜXӁU|-g)DT 7b'
+qh+p sa\]G?;IkdUA`l;b8Z|Bvvv\u>GAHu+ r]J.p0WZqom:v]3gdIPϳ! {b$3o^[gl/G.P}UznWU٧BZ-H}UذFJ& s8)䭢cHt茷T{!M"& o G%Ɔf9H{:FD"#n;z8gW2jKk᤯_`nTkAM Kp@HDHq]!C| ʄRnNQȀ .bD^ SL5ELɥ&Ҁ4cɴ4}LOjUo] j%oR\h]Ϋ\@.XsԐLB0$jF̲< .z'X#Аf y9&dAm
+\ NX]3U~VZ݂W 9ٚ\?`Hd?m
+(
+bñKsc}&Q׻>\܄3[tmFmrA藽iB oi@U:QS<P,ɼ.k҆4x r(7P>}DH؟/-S,A
+L"] 0ƁO-aȮ_P^UeASqLW_L>ϰL"E=9˔9]zbS$I!o+!(}zCݹZ$VA `g~ũ{U7(Ґ?Py@ss{Qvؔ8CJK|[e2vE40’˯,AC l=|rpt y0Yl:FxGk님M WTԷQ$Hr3=%GkѽVo"_N0nIM  g7x$r߸3@s+ !Xs~9FHzL2p9H&!6Г'ಣq?K_63apo`H
+IXܧ׸.30d؆"[KF /[-ASEA2il̎bOemR{zޒo bkqC(7L%8 df: <L>HɠeSzlR0kmdM9`_
+Sc1uPGH"b{9
+-SG2䄎
+2UK"'
+1XoI|ov&%ҍvHZ"-&9CZpO5?FBMY{_³Bx;Ćx @9JTJ3=b5c5 xo F!/sKr+Pv΃)tA^\  4u?|bGLD%mf30HfxE1QnIZ;(4\zQ}j6(,+n)FN7䋼m4/ʤ1aY}K%MWT7_v
+!CIq.S:
+Js4.̩ fJ&|A2\}uȌ[g( bjgEʼn156>Jg9!࿻")2G8SG.L@B-ҐIY ¾T~Ac*%/.Q!A\sk>
+#K̗G9 ?㜳Ovw068nd82=͵ziї=]^/WڈiW֯6edɬIq3#j1f}$ύ'52R$C3I*hCq\ vqpL伬õX!7Fc iN}XIkOaNi#!au/'DPS8edD"mx;cBͧdç ~pAyrƥ1 ԜDV}
+#lꚻ_YI "M?*NӠWi&,eE;;be0WZC<yE+ReJmypROTαYNArST"9OfJ܌Ʌ$>Jvoиm;{Wo_ GҼ/k|
+lT`9*]s&*J`J41&W+`bfI )9V3 vN²Іڣ3z?mzzL:ۤ%46k&Df)6}(ebӱȹ}aX 9ߛz;e53mjHjGwƌ?@
+ e</O#nsK_8rSs6طЕO&C{R y3"QֿȋQ-??$ D{|^h{+s@@VМ$QPA0fV PAbph0 'vZ
+-"_7BEҿ=dyw{͔ ^. y\iSBK>`3} wh&6aѲrHoUp*ȽU%հPDc Gle'x&;7!AAX?ik@IMBZEƥl"Y t:;/B5nvӎHL=7q΁dxHAcqF'm8Խ)NB8J 33ӨcA4$,޺.>"ʪK%Z<lpn, L *],@oAAc ؤh\<[2l ")!&H9y銇Kǣ֘|vw΍>}5 XFpᾱXGV +.g Ӆ]+)f;Bvx9%k/ Zķ(2n͎AhL;; a%է,PH2F7E_
+0
+!l!D8:Zr=C7'FW ,"IQh-S÷)|A&#NI$;-<viPl"
+G \89\K} H{.2EŠ-4l}Vr[AD[Ht📚`v\oC51nT-vc"՞>]&ۑtVcd9JРV-Ȥ_݁f[  8ScTȁ9/!/='u6yU*Aw^Lk[7^\x`h
+6^v dvix:yAȎ?MP7 eY'hރ3əNaꊃ1%Y_ ?[q{`$Utw/?vt&&'ry2d4 Jݎ{\jd]>
+HAn;OwƐHֽ-U凶S(X,_xh_Қ5[h1 WW}lHb!CL/AM%ZĈ韎ֻ0^hjā55?:9~9]_?WzF7Uc̡jʿޖtzx X&!v{=|Z'1@ a
+PQ)6in\o2&^爆H|3timTb8rU2mF,W ;A
+ĝ&tWe)5umXPF5F0'.<FVtV%P<9Ҵ/znDŗ1W'<҃g[:GϬ N p!"9y(H\X>'i #&(Ϧ=6D[zإ
+ 9 H"ON\JqRWdǪԏG |jT<x~x
+uZHK k9I \Ci@$D
+*tc{'7n K6
+&hY/҅X1F[Мx{fr"؉<7!:/*! IY,gHSieF`]H\'v⢤[nۛb1yq:eMqtiFbc,7
+}4+=ƶNތUr+5b"\e&ä)s4Q2$`?@piGF(=YBơ~6Q< <MRβnz9@R (]paDIڈ`.^!+ / .[@t8ͭ g+|"EnpR}6 +9䊛s`0^+ņZYg
+7 @n'E͐%'9v
+w10|DA$ucKX=rJ$6,PTJQ:KB3n*e9{~\+?WMW
+bA5NEG *%
+3!`ŭYVRZ9J- [GY $K CF -X*)E (|'wġ?eGD[žcP hޏdz4~zkRCI^Qf5T Om*p;jI_-2pxaVU" )oJ67'v&9,8Ib84qģYǠMRa.j)1=_`CrXE8뾷,}wYD+TnpGVP/ 3'etZYuȾ-!C{8vOsq'ôO Z0a0aQ:Qމ0|ÆN9N>@^@H }X=7 zlKd-v#:{ WE汀fie[hq Dc ACǫ"3GCYuCh&Rlb[e
+9F>Gi^GV+vID _+!H&y=K(ܠ5r@}﹗hLrtF1V[V1Nr‘|ZFjFrxՎT}߹
+e[2CW*+R Xj!/3DD5w<b;AaNi4dx: NydRrxG[;/+ʑ?M7@9Jaʛݵub\ؘojZ}V?y0N=/1uqI7 ܋$R=]"t[A07Oc;;g2)xfⷁq+8 A*Yг7#
+h)-ƣ=$p
+"B$<xU&V=$DlH><N <nsr^Ȝ7:VO{ΣsytwG'37xM_UNrع ޷sOgđ!nLH$!PyH2j9Lb,3@Qj'GOw+s՗#Smn, Q mٸ#RD\>pFYM RpX]rsM
+7䔍3sizN}؎j</Ll`T̵ '3JN) 2b*Fl[:v$S/ x=u.0,|1Hm2rY[aґ7փF_Ǜ0걢GX7xz)8?{ccF(#i\͠9 f )w(qCDev{CbZ 0x=hş
+ -ZԷlT
+ .kʁ( 2Rv47N`(][U0h?]D:\&fPMJyJ1E}k;HoIݎLs%JEiBiLf]k >kPKzԯ(۱Ri"0q`iuO}|_ZK> g~CI?]xd^`Q$+ 6(/684] - W6hu c 82Mʿy<=jM4<F3` &ga z ('뉱𕛌a01xRBR03r<84[F"p* iaH]D{E`vq-K,Ikq'I^QZU`d=p0wj
+5߰xz^=ew7H4`=sp3” "0vYi1J&aUt ;Ð{+"*AtY?@qEIN RȵGcKs8;Nd`]3HAK3I|$0 RH릪I|"[7J=Zwgf\ʈ%T3?[*+jP&OiZȥ'HG_/] p5Mj2EH]-GE9K9//s8(
+ 1?E&Lfab`f&n `;{6Ϸd
+k׹H;YܷìW>f:[8|>h>;!bJKVf :Q
+^Y<[_<a&0dšPMW쏋w4OSpMA>%DMϸ 4hζҼ$YoX>RB 4PiwÑ_%L1 eBY7E&詚%2'>J 9+4䅨D-B/ sĔ1{dt%y p s$y PAz䝢)ZP6>zt h{:?f]qT'syii!6\X^3Kh6GQ(ERYHa H=;?̮}|wZ_,o,%d2ujVKYzcSt9ݜ=gÌ)u3,
+!;u4;4/kC 8M\W40'z$9f \@vN2Ml5T*O "xh$ȭ`2\6:!t,K
+s1KB0FfεuQܐD˭Mv]r`>oR&%1ꘉq ~rnpY';BBx76FԬe<s|m W̎:]oV1O\.3 `vwsۜ|y~*Q?^Udea7 HX(82(VJiB$4Hu=ᴲI ("d=n}ږ1bll 6gڟ1,dArCe0c:EaRCNQ@49oo"ʼnAgUDsS)MvWr~d
+٥D3`3rfhbZ6,noMme΂w"47p 9^:]'۲,"5Exhmyl#_.PGT'pB|MPog1;fpZtIZŪUd;#gAθ_=WgxC'oؾ`0+
+ _ *sU9j|%}9c>rRNu]v|^]F/ J0B=ds?AeWe`w[Co=F'/c='<٧¼
+
+qs,Rp+!sMs-_et
+2Dp\kG+ ;_ߥӉd$p[i]M(2@͈u+yA°kZc\D,P4l%pXͬhHIv&Bv
+!2A>- DLRR!fO[y)f)dpD3"a>-%}q֘DFL`~zs:I ߙ돝F e7
+6玎]„,%cD3Rh
+PShBr*gf5(e,8dA [s(O^b+N@,A"l2 fHbLH0M;]Qf4Bb@4=yVX} b?Z+:kZz7
+I *k>߀`6aFڦ9>Y߂ V rRv nVn/[t}ikc';D #d2$C9T9b+-`k+gy]%};DWN
+mF4d"cS(
+uf?m\ǔ^.WI1thX$W BCq_ u
+k4xWR*Cz?xCD]>R;Y@YOn.{5V)$y^ D*{q,>]'+(G̈́Ӿ4bDX5ViGc+#C?y}@r\|>D$kr @21I24Y(F:UD?ʦk\x@oeqgJZ藚%i
+g2]%\,Q+:T*}lQ6!Wăt!wN.7FsI
+!8.JotYX p#!ǥjKʨTEU? $*FçެS@>8$*1>Z݄P0C5JȒ)@,I@CdTBG(f([mwxq!1iRޝXpż>T5ɣ{uޛT̞>D;{c:5U`4tc~7bU?,Vy)|i`.
+}kʥ{q$wU dFC1@W
+oP7Ƒ$E3U60UPVZ_?F}I
+ ;O ?z Tr
+Zd;(YrYY9 7']AmTI<{h0p\p*2 Eo!9O&.
+݊ K׿h@6c
+Y 4$Df ~ <n;l:EtDb'Pan<\-UjΊ)jAw~; @luзPAm4Г &E*jhScp:\ϲ  PǪVs#qU kIo鵞u[}#
+ Y"TLZ؄n(%8 #SGىrXV~&%d]ݫYi@jHÜ;|]mPUKDEF
+Q4A:3LU34,kU*I&%B^˙e;U]Ɓ`0a'Hfph@ZK[Y$V)
+x)YGI3TrPhgoG┎8A2b NVziP.N:4ɬ^X:*6^nߚ,͑W@}O^L
+Щac=ǁp˩|(^vl_eK!H
+ B%?'[I}'z|nZ+9vRD`JI]Rn!;Ŝ}@Bawڽ>[Y_{lb9ȭS=tw!wh+ Al9^.s+7B
+n}=_#SuFLyNp)7C++휶IVLVr7 . _ Hÿ/?ah%8S5j,tnZ SDL( JQŸ́A؋V. 3iud@!~,qƞ.33s0"* 2"ɸLJ Y}'nR(dq
+X^|ŕa\֐6ry) Lp<OkYOWʲ_n*X5oȺO7ԩtJ:adqH +yԛ9&3>31fOYVa̐:l4)0mp~!Pu|u"I 7u*2L
+h6u2T VI i~UiAa(a<@}+e%?Uo%macZFS_(0wƒ]b `HR܊l1P`RLY\=ax L#Y 1؉I#S/2aڥķ:=m.<*\&--#[@Ps7
+b ҍ> :%9z҇\L!/
+<t~-|[lSR"LAb2伳ӄZ̓E ' 6ݟ"^M`0fK/!ց TBƛweU`&*=U~oN'2Ó[Λ]s*UwYhs9ax)*c'$#S̼;B !u$`K`YK{
+W|x-aR.=BGZNo<bK8 g0t$R"aA_A︲ƏbR9Oc1`KZo2sI_iīB j&ܢ}Yꕄڳbi%7oO+u1 &͂ŻC2Cݦ6b΢ u0(y)meKO뼉L*FY}A2Ӎ#dz)qr7p]0H$Կn>־3KS}G5.aN.q)mܶ,BhEUQV *Qd )S a%f ΍UYgyA bֲ!NH1jl%k_ĝ//&jK
+âX\i:WGE)Gx6:;Z|%)eKoU-Ou86.$[橠 ؂)T! S'بxC4`v B[ 6 ~G 1u9}h=7wڴ ֑9GYGlS)ko%8e2ٞL66wʝ#G?SΥ\
+8guMy0Z^BH.L]^2:xjF䱙gXq[x颽xٮ4a=Qd8lfNS>J~@O3|d$/E@|b!ĦyLRh⪓i(azq՚c`n[5'L *.
+/]- t&h_Z=)D49mq_ ec5^{N!
+ULUs2ѴHTA~]^b" Q"55pAWKkZ4dŊ;ޘ0g T^s
+7Ux y`
+&VX{h{2sH4v
+:q A 4BqԻܤC ֪)خ'ViB%à(w#Hb]ي]hD10NhqYcZ _5cW6`X&bT%0JQ=Q| rBAio0Nvv+PbW18
+s@ !V DaզCemɵSʱ/Vr2[o :öy{J؛cb*zh`&A~+|ys¦~ < j?@U SVѤ()R+yY6%#$%*i7
+(YMooW<1WY 8i7J;gFd3iPƂhj2;Lf=}?U,XS TY.|KYJ$=)b
+؏FƴE\Xr%kxKaqd,1!D[Q[Uc#b5;R0gЏoOjWuw2TT`>''zBix@! `ۙ ȭ%^Wad[3P@B)Ƙ]N)(sB7,Xw2SU%5۾GF6L ;wtBjbRWElഊ:L-:Jxz
+ " kؚx3ҿrƞlp }z,rK("EY}E/p~aq!ګs(`
+F~oF FG曘e<*6zZ Hble Z:Vp_z_6- H2?8H<a&p+]B1Y-YE KH[TFU,fW&9_|?gH_XRRlhc*IC3Ğ2YGKZUjBY:3r=[ dP2(";QGRr'ˁ7)rEm+sŌ%BԺiʴ#g;ЭE jB}xei
+n
+q 0fby2 B<KD!ҙ
+(#09Pi3d`+ݽ;kIAKޝr&~K܄qc3F\pLu#COKRI% 
+)cx%}Xg} _%rHD+Ǡa4e\|;2 )tϲ4 ?Gg+ IoS5b ŋJÀ1.@Zew
+{KmʂvsBb9V4IXAM"fta9n'hƁ6I|':fuK!'ЯRZFNlB䑣O 20[摓Yd݂s*wYD0wb6@!jMԧGu-
+*K@}ѯQMP8goąEB -V˕Σ7yLӯ3cyVPFp?"1aZm˩:; RWcߙ(!nhSO*RH
+(Y=֯Dnx0~J$"U\& Mv ͫ} Ӥ.{(b]!@?Ԡ2S9GǬFa%@1Ĕg=Xo/rASL&'#?$3K}TLiNJP }knF S
+@5oD C !iT4<H)\K3A>PVIx-ǥ`;>Ǔ)x
+\33Spg8nPa&=s63( ٜ
+[0PQw
+vGqS 5%ɹK?I6;Q6 cƌVX I4/8&%b׋&NC[
++(xNsdk2EhwLӏz)Ado+a}уZAcAwT^>,A(Y_;Ѯ7@Yk["olDRB-RIxCK"ra\+縉WyyQ
+&1:q% T܎&w3!d(%hޡƹ.Vp\,A7OuIi碣c<ž(ұ/$%̺ EY "MB30KC#['ڕ'G3㏘,ɘ: O<:o4ʒL猩.I3M ȉbʗ)̌8(vMٶ,zb*ig<PX
+ E-ܗp͵=Wzح83D?N}LI4ZbНSLdT]O-"d!`;>O>jdKR.-v-+DعB[~HT:N*h.! Փ~ps*U
+50L
+"V""[&ڸNg&Q#q;Y
+|ɨMDsgBR'ZvvEGsZE^/[
+jy`g&$Qv hᏭBDn&pd7=\~nH2X5 !emHeYJ 2BgF}%Xg(;N +X[?1_Ԍ
+
+S> RPK$RQ!- {GD>LU dJ#&pa,r"Y߭-b&^M8a;r7З"ZkSeU˲0X"껓%S2~tL>!y#gn3ևK7H N:LxX!ʹwZ"XqqDx bF8Oȧ:Ʉv^t u paH&[E}D&v_<gѳ5CKHIjÈ+2V{,+fK唪A<
+Q{ʊy2 ZCQx0{hNU{lC1W` XjX|cob6Q a@v!aJa>N<;岉a;Ҏ9vbLV#͘uU2=ϊKOp0q}]K!DnB(؊Xv
+sVߊL[^0ۿ$^n5O^*8x#=$ETcJ L^ e=+A+Pj
+XBPҝ,I/M`=N!c)}$c@fyAM1V=Z!i hlME V;}it@\#j_!4p"%VB>)iXJOU gS
+ń =m!{M.a̴{ϭ%C2]]?VfQ
+l 6|/n^
+8r 7uYѣ<0UwJ
+F@+#ЌKI`;ֿE!J:ssj>.h=F$qY⭀^'t]z[ߌojQJY,0zI%OH%Ҍx"=R@U
+@gFPu]6i bpSq}ɛü҈PzBO%c}(.#udg( RW4(
+HM[7 O;Q-R}m><ryT5q F֣a2XE-i-/_ `lJ={3f&cD̈njm c'ĜCXsC]#(t2XP-ĴYym6s|s%Ɔ9dr+29z_eO1
+]CZ?FwZtc(Ǵ|QD/NqX6|&Fv }n]B3]dA".$ʐ"7eC&Q[V
+~Ʃ+3CQ:2FQE+Ԕ)^8ƽ^}4.!}j3_ܚ6,e? Z1 N%֨ 0jrӂaK]VEu!֥E[ƒ礀+"Q =? $%vE)fPWHAFdNs=ٮOɳf #*6> јt Ն 5zCϫ:)!Ŕ@H:l!IfNj/}/EOΨ` ~JQ9 zKuvOaIi
+[LM*xoQr   jEC5"5;-Tu' SIjˋā XAVև+?(:I^'x4>:%ۮYCa>
+޴'W9y _dހ4,u`56og#ҋ03%~)XU((˸ yϱGIOQ?qX\~
+kAEBz3=H-mk*8[ 7Px CpEV6Gna)f*5D7
+Y3y۬6 FGs y_<:Hp/0M}͘9>XTn
+qgn4UjxYгcI[] *-'^ro$6#|$wCzN{|E2gGqcиtG3-ps%VL D@Of8p.7> ܵzT_hU6!0d:HBc^Zvqc|הicsx0!EIg"gj('1)|;+on`\KVno1dƉbGK5XZ4}- BT!7$_bˉKJy J8N:4c$o߳qw.ssmp+].N$0)s]2u1FG=r1-Y,B}!/{ ɞrTqֈ";W}Nk[Nr̲VJ'FmyiAH- ,hJr2 gdy8P0hW4v?Ѥ]y=3P>4,':`'q4=N;sդrP~_DD@Jo$%ߐo0Gҁ8?6;DZ
+4 /R0~@F%9Po^ ipʔ*e$ e[[;`+-WDM;OT 7G*9HK"p 严_9h@h&5:h:vUP~S|iJЉTpo8R0mjM&+Li*dბbOOSP431X ݲL@7H5o4/K.zBz,ʙNxC3>"^>j o5&kAin_
+Ag"I i0lnKk=)j &<2G`+(j"-3k[7^LAX)Oc@]rPu L8܏BqL9Wp,+ S;;v&3[krr&"HÇa,H\ 0W2#L|
+hޏi0/U/In$$8ֲn!WYWE8Yh5 %G}aqRMd=8z#w>NVpy0$m$ں(>a_
+y,B\
+gKj-
+7P`$/4=]Yj pś'\~6C$SiEP&
+!O8V5>A8.ZGG&Aʊ^M3z>W]x%in}{&JҤ
+Ê} G0HY
+$*S<6,0\;Oe=I8j sC3Ip`<r^D {A䡥cz57Q;OԷKKh@I`T.EĻȗ)S6Pj*gϳ'r c
+Mu1E*D q [ju4ut,ة؇7 1yll 3mTۖp;&*V󗦆ɦDiCH{J3I-NET0N-2ђ(+!g:Rv;X07$6,䁼qʸՌUo:h܁'.:i?<,BqB|C_o)$8.-ȄS %
+r9Y#'iHQ4ެL66YN#+JO61+al<E/2t1[bů451CvP_ ~FK4Edc9lAntA{*H||LN#@j}, yvvm SV{p+bdxџGTAn]@$wG14ݘ ^<x5!pĮPD%`aE*QxpZ'|x)v%YocDk
+ us`RIK'/<P} >.7@<6q!rzXkSJ{A6ڶR#cK,L }_2sj\f譏%uB$D} yEO@SVKuQĔTӬHrh5a/Ek .NF΅X19U؝V$|F" ,)̅z^)e ;4j?lj 0,#
+On[a*iW= .Ӎ
+,σF%Q<pS> ׬BHW-31;;A"tsGo
+J}'& YHRB|^a)PMYQyPSw@orI71ʑb0_86d&$?@Sv[8՞A/}r&;m(>BH.2=|owGWO0dލL9ArҰ=Kfj<<+p3^^ER@ o
+s<Q R(Sr+jGoeH1srn:MDy0LkЂd!Yz z9 (6BFH+-ʝ:L8Wo[:V:˨ b@iai/K`{QXD _B+HH7oEQ,^,cku*F*X 'a%eReZd/$;n$a
+
+dNH}G 90ƴ#6]!Z?8@҂l+<@(Ne{cd1[GA IL^Q?
+ 0!cˆ `C?Ch
+h)*+.jSʑ9(Uk>]HbC
+h0ʔoJBx
+(Pĺ#J/6Iw^``A?}bѶ|0)kEdf5K3!Yㇿgɠ;~8A| P&kۘ</|<}
+-޵}[x؎tY tA(?6Q,kyC5,g-k܏.<E/e ĵ3pKA)DŽ2"ϓ[ J`7|
+-/~1 GZ36H'$!T岲Oi;14'ٗ1tp>Jƞ&/G 2 g<G]9eoR?6˴)mȸ,|CX,ßב.ͯ{#xu+
+,?^¹D؋C:XywVqƳJ_5ANe9Xd)DHELҷK9@[7 R6mďJжBZi Ƽf!gDHOt& @R#5e *,ߡUYc8BV.Gm;CEc^VyB%9H$5{uyq{_C
+yȋWY'Q\"="ᒗ#נQ&29ԄhϩY3* Wߡ+DS!IOb! g{v1*(( mō?I`BFHzPB
+Z?Fi_kTY栰sQT4 Aâ)82G݁N#ޏNkvoX_7rrʴBGA.oV/
+ۆ3Xb n/SAD+Zuk9
+JcE,'mW"q[=*fGśz @Kv1,8Oo/J\t~)kuh$ c`'eU#M
+P4"ӿVg;6/b)_Z%I`J\;KGx+,6+i&2Hd48~9Y!xW`{d5`4w04jChsq*.08CI ?ǁNE>1}ǘ]6Abcy!s
+ SAYF|\ɬG(Z%b 0?d;p:\EEє&kk SUq?q[_mk2ڀ$"SU>< Ljlb\Gg ǒvȃvo^4^{'pL(UkZX,ב=.E)zeG22\ɗ<$g>Þ܎U2bwK2"
+)9*oN;| 8%PԼyaMșf^Pmn۔Z威W~d? *^ƢNep>;ßE"?8'G/Š#.XSB*yuL
+w0~f߻Hd["Nj G4e8yd`4+X򢓼~ 0qIiᒻȊ1k QcdHYy;n[H#\c>uFμ3* X"0u7&aNW;B.6S䠭ZԿs5,V8`J
+ǁP]~֑wO?~#~j F,,AGHr6eh /Ap%ki <A@83Dp67ޤ_0<ޡ>|u#@dE ҍMQe#` 貖XZ%cU % J4XqyQLy\O AW(Ž:V4?~f]ACF7@bKW ݓ<i;,Yd`dxstŴ'D !q3"QBmܳ"ipEbrl3Ŏ[% p=%[l,6uf2ƭQj(c>2%Kzs0H6osk2A/Q26lHIeXKtխA@k9j4/^,?@6 rQәVJc
+-c/D N~hUފS茣PM(;ː2I,4V<v<l|9W ɲxH4aJSx+L|>2d2dnO%%en䌌D=q~&p;Ć!8 x:i&X
+,UVě_xQڠ|DyYϯ~￴aT=#B`
+guidM|]I)N ~.Dg
+PJasi*u*-LPl 5x8(s5oz
+}.[: :Jq$DJMd
+k/NPL㳱JjEs\H(?s7cK::/%Kv@,=eN%o[
+%4UV#B
+Ͻ{)D6WuCG\ʽi(!f #V15sTw4[bJ(w]T)k?ۓS 8`-
+JAI&n$iQWSwUw2f _)B2 /'Dz.L?'?(ʛ1?e>S럫%D ͒,c?I% |Y~.m!*P|Uf Tq'פ0 . ՙhoNI*7Gjb Эie"z&}<xUV/1p'M`~Bp3
+<p-M?JjcaX++$!=5KYŃ LTW2P9' L͆u/{yuyNlAC(f%\heVqOش{O:` ,'l03He?"\@
+OL.]{0B7"Cťxh?+%f0q0Mȭ7LfALr xmsR)7 0<)๱1WӾD$4淃_xᮅ,{F(HrWu
+i.F:_!
+h6.*w|_`ů:PوP4 ԐAOw{޷@>f|!w[uZ#dxgCH
+t0Wr)2@2!AvJ, g8N ig (ঈyV%Ma=>\D.C-VOyuH(zd=Gꄖ(26h qQ) !9Yb,Xd%в
+yﱯ. B|OKe.Cy죰 :T9OS뷁Q<2!
+Zʌ>04j')@ V Tfz7,H2Sfw8ThxAfoɫw_ Ll;@7RMi;:UE,!$"jG; bNux8;)Oŷ˪*Βq} 23,he8uE(E- ?6 &!| Y:ORX 6[E=V0a{ FQQ'qfZ=aMpo{M=r-LqqI<57`'](mˇ{J+]'$[ )
+yєͶcF,aYt!v}kG!GL[0LUm{~ɲ"@7AƆ($GDO|C 9Gwix Q !6qC.)8 F)蠝3M@Di~1xo?52@0y#dkcBHAj \qtUVŞ# ͦ|̢&I*A`)Pb?l5bl"!W( zF>P(ưgA$uujADaqkXxi##I;עX&$g^0[.CYl̼r$s Q׈9-Y U).+hD.HMEɢ(FoXԁ7ӶHtZQDo k+0E0Վ
+ +˧W(!&ux
+n +c8ڽU \Ӈ A(,_H3y/ѰZʥo3BX'w54Yt6{}ąnzҢ!`
+z׸)9[KK0|(mj$d=}إ(nv} ^`<D+1P*?T$w
+-K
+*O -ۖV$eQ"]e,0K(O؂%ӦsZ
+˘-THÆ(ҼH 7Üף|R-AbU"(!1M0|(!uӾ~ W8Oyħy˩]z}_ufW/ dzy\D_ ߁ F _EMr%,cx: h܈kݼbȓSd?;J BKI4a!E,na$aͺZNdi2 _S;8'}h=mKcvHKXt2E;ĆȒ|"<J|db,[ϟS)T' Om
+.
+K1u q!,E1Miۚ!%چ猬, _m-/2 a~ꑫP =|+R N#Mgw%'UKo$;ι>3%s2M. VI,Ūxv(,U)`\U}mcyTN^|VfR#ˢ"/,4xIK
+[Jh[?eIG3aNGe<i!P׭-%G`\BD|M}ŏVG٪GF۪ /]-ôϏHo !pyzX$:.7E&*vc[:ݴ \ #_ZIVsy:
+lUYkb lJ%g!zžGDep
+V;
+!.Pm
+i >UٸiN
+/Z
+ē2^TcIKz\W=
+1f=u??$:(I$<b9RAHW
+!)(|%Y/%@4ĖO$${R9k) {$G\ztbAP2G; OC$*`Q:.+3/vߢWyz5:DǨWs;jB.CqpxMgW,~~ l, x0DS_TqR,s'
+ُ;ߩ̸'
+r@^B j`ҵ5q
+f7WQcCXdʪ:;*txEX2LM(QQLZosߍ.:*T#eG|yˏ\Rsڰ 'Ҵ
+  $B6 b'5xjDprNZ-㰮Yƻ(O4r([+!0_.ێ64(o.PYbH( 
+>̈bɾw}N Š}PJ
+t._'ǂōBwXg7`9;Q?x
+[1oc
+d+l`!*O 69J0]Z; g
+s"%MqPgg%kՌ2;{V}q-p#)!f'pp\0~Ɗx fuCp5!ghφHQxۑmz8j2Gݎ"9GY{Аn2o ؕ>~y nEix,;=3 tN5Z|h'
+V˥J)t3ݔY%S#+~I+@z݂uU Jsa-Ol/))9 (
+C~: IksэT:%6aBIZ.j!J𑎝TJ#̌$B!y9ee%Dzf't3$iq|M$B)d>\%to*6(I9}g=Wր9v3}8CJLhk2r O7_Goo
+FF
+!2~YFKyPcBI"r9a,l )P_aT@iPq5c[WV;a)О=DjDl(A7Gf#;;*Zՠ["FLvzAZq*U/x|UQ-Z_iqyGuź٥ꃾw;HM)"4,jL3 !$sPmIU9@tP9n_Hx#\PAt P7ƪ2}-DPq &us򗪀:%JF/>҇_N=5Xok="G͚hb6<zXsQ Nfc1u{ȾCxk 29ރdV9D4,Y
+gTB'~w9G7Epud:`mmq0.N q=
+ms[q:ߥiG}0 '\FA줷_se>:UM?|*`n{rݨ8VH'H:W.ϟiKƠX1W9AEN<O\i g0hfRǂ̎ӷ4<od xKw@h}u>7!봄 5*6_!^~vAGGM/:r{
+3v蠟}!QX'ɉ$<Ѱ9{MBWF so9E`AcxseQ15Af)ۃJ˕e1_ģ!g.Ǡ@3Xx,s +Z^)s.AUۖ_`ݷtv_U.ċϐ@)s+3}CK{T @{|f,Hms!sb­l _HW*RO@lnv2S}cEW33 U^V
+žq9Mgd>wP>kzqָ5Vr12 zy`
+u0C$~*px
+afH2i+Iqo8,`g\ϩW ^TW@J]c<[Nc8}]G Q<iErL?IVj@z‰#!x 6MOs~M#9{Y,)T'Bk|QI4]EAA}'[NƓHgE 7sO"hi< f pNi Zyħ@8{A<BUh\EZD_ˊ09=N_{i? ;9u E{ !-ٕEvTk0Ҥ>8aB
+33Nn^Ҥ mh2D
+O HMᯍ@ gi4pg>9 F_LגưPw&H b&5ػq`;k)&YضZ恢YoU|(tZ}LfJw+()gG*sNɲ4<n%Sfj'霷~{wӅ^m_+@:OFFt!l$voG ct|m&WS6Bty1Y<JMHgÀjT5~zǷ@ DuYg ?76
+vє:tʲtWª4>Tآ@,@)FV^k[ ;[٦5̞T#tٷly@wՀDagWޠcV>_()DJ )mC/r4ԌŭnӅW4%?;("N4∠ gRsHFZRq:_r
+
+mO‚Jl}.Hԧ_IPD+pbdB!L"4"iÕN;'upNy=XC0<!DJ`Yǹmj©# .W4q ٞ&ڒOgY;W'ׇzS_he+̼Ks!JgLᗇ/.XV-|>5~+Z44eb껴[$v Z0R2|s§vx6f4JBܟ*nTWH\:1+q"/}2y, j) Sq 0
+HA\ DO;\A
+_/NgOud_W9[|CRXMXid^w4*LXZ.[vUOINRRo,,x&HazvZ3 [ώ6*H8'#b57)3 yDOv(2Q
+_L 9>#
+zRZVy2O
+y WC,t"#7;.izݻPI\ӰEjrm帕)FjCDՎA6ɪrJNAxjˠR0 :CP4KAExdWĶ,0 u:cC5*oޤHD(@ú1inO Qe!Rq
+Cg/LVKv Rǎ 9aDev4M :OEƈꢦym/]CKG;=uw̔R"􌤡1y6Z SDV#n`B=*1fC+|ArfzC!4-ȍUv; ؅1Jrߋ-&%WŐ,|@QFe@ !h\E0<XZ :~KGNb+}kh$yğk&ÐlanP|Z
+,`WeF}<qr> 9_hq> |,Tعg$ arsӞ>w!sr3*M{A܎[
+~cRN0 ܸ\k.;gQml4VoՃu
+PԜs"-xXm Hg$@V.I* Y2dd&ڀ' UpKUs{kb2P 8,"ĞfOdsr(h·wiGy*@(99 =KvB7ƍY~2v0ycId.Ȟܤ0u˰y Qz C*<m{{vpO?ul#
+־Y4| Q{J>L;HQĬs(|1wd,<C~ĉg3.(sKiߋi\l6 dX=~7?<As `s*`L%48M>ddɥdsra Lp-T K]Ƃ[.u!~Rg=i.l˽ 8$w=y`ZrIց
+@I9ԻT4`:͖Mp$PwsH( L ?B9^5{Rtu1ݵ[oc\VS
+ I{nNy |>"݅L%taHk,<E>hh 5<$H2k`ۓizXPǢYxo5X$N!nl$$Jr5j/ .X8{;lawCK'{lL;Gr2W[DXW6cq_eb!CL>-ǡw>%Q2nQPe*NNC@S7̌_*BtUď!f8SQ`s쳹SJvpVءcAZxC3@*HczYrq0=[ LjI=w_O0IC*s8挀 IPh(pM>)20΢D9bzԉwO>$”\PLnWmM|$"uG࿐ŏ`YlW:Jp;YS)];}‘aΪV9GFj!g.f~Js%),-:tĢљ@!ntNp?1rHfv|)Gd7Tɼ?ҥ@ fHq, h+S%璨!LkmKauK2)gxo(
+p0x
+2GeӋ|*A$2J|whsO/yI| L #</cU_r" ~
+XМgV'۶s+$QRUXv``
+Aoj
+#69]z@q~J!!F0M3,/EDY6 hJƱ eX}*٠M`g[T}E;d/ByNd'\̗ˠCKaX=[Eo1zA+Td0j815AZc8׽(!@Ě<ȷWsMv3lT[4|J|Oك
+D^&Dž!:(+Y
+z/ J~ ?v<%LXdeS0k`z;P:oՂZ.0JFf9%DAgo ة%0ri e\S@i;+ʀ4ޅ"ɕO9cYk1%\BÊKr(&iGʹ9 <.~xL":t=PtaRĕKpk {XςV/n R=uDt+b!!H0>0m wkk^p<q=U֓nO?|ہrd
+).2pQ{;Xl侼U,lq>WK5$#T;1Mxٝ"l.mb)܁<8G;uZd0wiKXi`x$dV
+#-P=_Bե?^!×BY{,)`oU0S8b]%= 1x7 }< 3ݟu/b J I1N~tX2`t*%$ S%HGB'0!c !SHlOzB; `cB޼dH~]B?k
+5/azr L d<8C`E'`gH|bM)k>ʹHX_:wdf(ƘL0+V !y7ȱ셑8)3B  @ےǃ7D/1L=rbw")6knYkOו kBHB<Btrj^d.3^hr0ʜ@%CBG-wn%GmU6n56I4kW+ G<W`i AB;EY9W8
+e(}8n-¡W\ޝ)M9y;r]Mszm^ۤ~}+lpA&J\H9SOGLKqh-H:/&wlMh7j۠jRЉh E}㡛-Нn?> +$93PA=X% M鶇>ߢ%Kh.fkN7ũ9>g4%Z<atg&׋lvl#s!V6o!9(ng. gJE ӁoﶧGV/A-gšZ/9lyW MwmW@\'p˃ږ$fJ2~ગ5@W0|ܝƃ(%$ss7-:AL_>n]<=w;ww [I0'$ymÆEt{Ei6+/1<^ĕ:p%MfHG>/(R %U +M  E(t/A‘n".%EkGKMX9(VCF#jSDo˟7[b`sE?$ӏCL{5bSPh]}>
+)<vGC$ يO!+y,pT"z HwzItT܊ˎ_moXye<ޮ
+nE0r=i ̅;EJ3?Rd
+z>8OwIy]<Vw/6P'Rw rUsY&sD3ګp`졦׫ȁ
+Z;l4vp#GM7Wm%Rƺn {Pv gzf9ēhs?e~xfdODG&h"c>^%YiGѭuiz.Kk0W
+GtJa<!cq'o%*V.ɿCW1"ʬӫ =EҫT%8;Yгcߣ:7]k-D 1}ú%2<P @\uiUޥiW]ZLIh
+ix.%{\5_,r ?ӪlΗ<OySɿG{(Eb8"|̂uý1t׆ԡAEnEߟ|O@$Y*c}:E3*GK+u$evߐws%Q+Qy$6BGICd;ƒYvJL1ȐGV[7~a}S#&:!3Q!TgU9vF-я+xVW&f3.qN5|T黤H"Y <SbWu%Zs&=D=t5
+W](bX$&|pvGF@ުk0wɚӇED4|.t) _4Yu"o2oߙ i
+3υ1<0\ז$Zgⷊ
+9[7YK25yHD&
+9m{-җ2h|֊qTZ+N^.M
+W[c
+\R{Hƴ5n6jtxSĵ?Isn$&ۃMn `<S~:@T0P8&yȐFVH2bFr#67%y{t!&Ez0fNX㩆CCT;ʒCa,eby9{!T'RdkX%YN܊$J!QU \>
+8轮.x2),%*}`8cdTtl
+!$atIh hʼnĞ`hSȝ<=}}$3z.y:T%gIB%X7ȚWZшuzKД={t/&
+*E<s
+2$`I' a脜n5lO%6SCr܉D䡯 o\wMnɲCCt6ľoB
+M+ƙܞ h7i: 5R[4,Pm,ūݣ@cߔ#c,\Ru?Bi92H6)  Yq l-ݽF&v"X ]hϺbcPߑe}֧̝jS
+l~?P8AG@-YK2E^-O2Zj7!"n6=Kt5ҵȲT`hr|' SJ0Q 5+_%y[3:ӌj5Yu,UO7E*4`oJZAY
+S[k+0BXxE. "Wu02oE XA;81w_ Ck*t
+
+4!i}Tʑϵ#W41${mh}rN[EdPeqfb-`A|e-Oo ($rjq(=KE`wKLΛ u
+bw
+@w]*S 0'խTƈBRԩWn[-
+z)q+9x8\ k2ޢMcPA߱gB uB(12^&qH=0kՒ6um'+3*V[uNPX.|JFE›3HS VB`8bLㄖT[ђ  ׏-(V3mT-nɽb99 y*X<C:1+h-&ggY$YH
+_;?<FpsD9u$#׭Obyj@KI!E{*p%6yf3b8 z,J2\&Vi8I'(9ުgr*
+#X("+W/_nWLJւ,f_ 8Ȕ6rI _70Sk l9R#䥈L T$$N+ :؜UQ{nߜ"
+h@߾ VfuF4MpA!j"/::j
+@BTrGL/Ev'ހHȂ s*BV% <>->aͥJ
+ {Rڢ+ ~r)D$Zm> 4VnmPy$*śQX (PeE"&K=J$,2c"N0@C '}x"}r~@ai| :XfK%:U3Z^;']z
+
+&ҿ 0ElK;wT J$~(zb5}WIvPOTl!8hwQffE)%ߤmşF$.'+s ^ >m; Ĕb@al
+ÊDelpmcHЉsWt(]a%ޔ|La(:k_6wS&\P z E#ѧlwd;޺KD8Vz]Ytb%t"}Ng NƓ ^8%\h;x~te&sNeH)klՁhlzQۨ8Ia9!\I`Lx7YT8 P tǭs|^ɮƤ*8ҳR$ !}(&1(Ӵiq&dNq.gY?L"m͖WޕUg?=n@Rl kkVzG ؈p9Lq*\1؞G`4=rܠ)n*Gh F#Ƴu dP1 %s B #J. $ ٰ0m.!ݔc/{  qNO{F ٻW$"b߹C֏v$0E\1o@TҩvƏSK\LFf&
+lE(EN-f,`n0'+Q%. `'MS2@peFt DS<08ܔ@L;=^Y6ި,%CLIzDz|^ܶA$OXwp+ 'Y12رA8$VI[yfV
+/W;ܯb!̈́/}}Ś-LySa-Tl`)k{%YZ_aE:D(ArDmUQfZsy~ \G\Wq,
+Tyb u\wan.0ͻs8$Xʞޱ3OYU
+A
+|
+dzs(bCMQaH⻄9'bR~;}85[R/ \=|%bA 3%d?-#8P/$fYC<Ĉx8 4*YցWjdI>YC9D蔓VwXi>ȟǂ ƒVF[ /ʒWw~)9/vݐ&8yMAO{i9bhJ
+lm`/>yt~ HkrFQ/9Aٵ4D 1БAO!FR?]%+6`ɆFR蠉DRACYհ "ťnG'jcԤ/爮YRg,{븁c1ijy
+qy8'WpB+unɡyNPRbM+`9qSۂ;Z)7P <~f3nar!b<Y}LiWqŚYQ'm@1 (q |Rj O6鈾#(6,o/!\w~ ~9z6mܑ;r320v/|r ZŲi7>9F_")Gq]|)N<wjI|L.sFXCؚ۫5lz9Ia ܀T!=W SZ&;}*8WL<V&70njz㞼m j^$qhLg[?哷!ڟ9ɫ w ¼ w^ΫXnviV3w&ޚ@8]׬C
+mrDh?*wf~3p|8- F7i R?Og=3g\Qô-Z?Ț>k<jT>iv|/`5V[\<8Fq
+|x)QV^q:Mwg0m+"3.AaPf"LŢwia
+,JnZ:Mo+$ ߏ_;*OݟB^}KT!Y<vnS:a,蕡dFߦCCoF+(k$Ɋ
+џ¯+_-|lQgO/V#ek]` E3 25`MnIQZ#S
+Ҫ#-h@p>,)Z"ov${ŽBW H'.d|i'.UB| s;q&kZR0(Aͫס`WLA‰͋_H5 ƽ^:g
+W}H9[*FhGHXùj'dcnDX(G䎐7ׇ|1OdkEHޅ7<'Z[=2iv-@L447? 2sAWAfH ;e}DREY+
+^A1ћ?9"*4fҧ#+fU`f"JYkQR4-J̛:,zUɆ\DBX_1aqIrJK2OF;wEAiT k[˒Xy7}T
+oA-R<є*8>mI/`
+-I ^^{ ^b'0#<aB<t{s&uA$ʭ Vq
+ 3Xۖ@JpkJb%TkM'?┈ǵ&_nEzc5zD-t xEC3Z1]GvRZGqD2YZ_8 D2$%^z|@JsͶ.{KԴˆ" KH808<H88"9# H _pSqE)hA %<9Eh<PÅǑCƵ=8"@tЉ6DwW׋`
+@,4Ǎ/-F }/1|fǐkj9j8D;c4GnflGiXG.K>{j;ơqGsq)y-je7]'V'+\z,N1P]ֈq-}9酮(?111"Sh\h0\c,jO ]IPŋldEtQ;)C8\/D>bůzqMEPq;bPk.))/"53^QyEn%CddfyS2L/uzZDG("VD["*ݺY
+O{..*zZc5PQA֫XMi?Ak$};O\r^<LBCF0y/sO֡TiG"DtB&)tLօQ% g@f
+y1^y9qyHOְ)K,Br Da27jt6 m^"f =älSmfP[ %%qaI:dp RVK+fmP3Ug'O0LH#HRZ
+ w%qٶ L(WpJmƌ\c雃[
+eiי8?MVRδ\YU9FEpZ*UQ?lx5+)l4rXT΁-{| ΰZ/v:NFٗnX*+$5Q8apG>^>PӾt)04I6/]~?668w3/l,]d5(O:ha Bu3!e.h\. 0.>_F$\.F_7kR@-V̓VPs'/%q@|wa0$nEYH^"h [f Ƿ|KeŠ]>FV^m>Ōst
+;s@q 2зu怋7aR),Uhym|k434%АUFq`m-I9 $'-ͪD..Oi 0'̐aﰉ4<hAkAXdB-dEy 2/?;HhJ
+<mYZy<v.+T 9$4~Ci4XtSHvNƮ3V-q}N4V)ŧn钹pƃM;c{̹VӐ:=v j鍳nH}hsKr:YҶc+dqɰOlLCݣ$,L6}Da̵k8nh&_?;R \OWV0fuY&hGg<e3Ȃ᫘B(ۈ_ys
+Ikq =F>Ԟlkt1 $ !6%{TRL?wY04C-1Uc`aĞߣx%b%[5ɟ?|~ZTp"WHkE
+h4_T ;فO5>Oȓ6sڻhjodKU]H^
+zDz٩o^d5}K_Pb/._?hDr"!&y+h$#}JIlOтSۊizcm`۸e}-Y|J`9oκT4SQ
+@v1a|?^Vm&nIޤ9c #$1?ӹoThmµ2uKmx9,E*2k\WI+mӾ6[:w= ?*\3B$W_HƍgϬR_SP(%#S0=F(- ⠷'^B 3Nhd;d\3 +/
+ j`@?7FI:'Hʱe?@[d2AB@b7dg/`
+ ߽g> {M Сp`^H5O{ϥVa!H2ӳ65D#x$@F.w-MCbd.F3jMM]> mY!v̔X$JA6E\TqڱǸ3d1|l28z#3)$^Jo ]ft|)"2
+Aؿ?M,`IdYFKjhSAk? 0~3T;TǶ. 'Is\ a>6,Ԁ&+@@Gg}XQM;@p7xȎ'.4EK"lkXV,}33!jiJ caؒxq2}O.^EL3UǸouJ]Ś82Rƛmz7a^d9vH<bGIJ2\4g熲g~=A:eAwy1ZgiJDg
+9g!Ә˹I..7WeHAF(14+QM_,]?PpK
+HM7Ow#A ,sqk9$bۥY/ ?WņJooTJ(&V>~m\H:g:H"_k墣r 2ZKтnyHk&h>:n爷QRX&u>z/ |4U/W+b:F9PnU/)VzqS%x1>@~6
+1Q۟oẄIc <r}
+2K
+FHsП^8j{]u qLSkt_N tYVTB2fi}i{Sȋsa)y'xg<,$sЅ9]iC4'2.H!;6փg)VNFKv6,ⲯ>,@M6 -@DCv\Pȇ,
+nPƜ `cCn!\6U1?@v2@J8S=ID٭FJ a-fpm r r5SLr h
+/ 2i
+Ң s24.ȓ@IQᕀ5]3
+; Ql֟uku{ 0n v}cHZ%t#nS='zVn9| }J]F/埛V Vso{g!LϠy6!-2w%Hi_t׻56c:I})s4[rAQ>!\g!(=vR7
+[0>Ȃ
+ϚcRuG2ѣmH. VueO
+< 8aN;ap/\?.^\bhi 0z[IS
+~b舛I㗦MTчI @rY0ogsݧl^|&&PEst*̐;y sv EC]rWpEΉp=S6P:^ > /
+/Q-㌭A?
+86솪DjI6QO %Pxar%~,Vv[$I g 9R
+i"lTvtAَJq r,Qb,/` і+(x0CrץstJÀȴ+s ȯr@l{<d-'٩o
+L<~N :X@$>5 Y,gǬuPaȊO'|'ـ"M[gZ&V>\z{(Et֮57W דJ5;n^\
+BtOHw8y,z<Э}f_JiŠ#Osõ={Q]In:.^"8xX5)9:E] L.X69z|JW낅1 idkV4̳Ӌ;%r58A
+n!^5(h
+8|)r(nVDIR M%+
+*C1XƅPa$٘O9Unz<ߪuc1D݉euR0~cvv|{Iߣ%ktZvQo_2fS4ym~,|
+ /Uɝ[uA|)m ƧuH2>tbVDr$
+Hɣ
+%4+ 7q[ڋtiuZqx8Mtͨ\,+~b.)C+$.iihJcUR~HN,3m_wV–Ќ>(@
+l,U4sCt>$C[:HDn_rV8R&FE
+5Ǭxf.QL5ɮ@?}6^UGB|! Kßվmնי
+S/d*שEԤ* wϧDϳ؉!SRO#D}'hXWy%(=@OI (.<=U5t8::go/?NQHJN_ԭDѵ9̼+
+%p8FxEd6x&BTY;"+̍;Sw$C)R#DT w]r-D
+4뽻mAiXY!JA^ۆ=JTs`+FXx]_ݭv
+Ԋɚжie%<=F^]vJV{uF6> *qЈU VDG1.#S^PfW=;*^%3J G;]ŏ0]=d>(ffܾ,nNJ kK] IYqLC'x?&DEFYiHop6*R S0k4 <U"p8ytȦv@m1kjY+?d0Pm*A,(
+?&w[ZC
+n=}(']}J t}݈mҹDC7)fȭ
+ĔLVGkz^_J@fO>yAGDfɽ(B 8R`"[x$B#I7/i=l3 =|uhhC΍\40TtdVhb8oaakpܿKS%x8~G 6.!m*&.SV͑5!l8pC<>J.(JY/e2Sd3CIG~
+BzvzaBR|=
+
+r;Y
+!lc t˓,@$!#
+rCtaxtw{h=a+
+1uac &dIOuݖu RNagg;mcShh
+KdK݃x7$ciCt,1@(P~cĢ}Z26ObC6c=WPTE N^:z4WB[m W 9`oJ1DvƲaz;GUZ8!Vaʃd>ɗPI9BHH9AGyH PNV(%Y7wNDAg.MxJ!\\UM@)7p,dzIY6wݿeG@{#=-pM!Ah#P!,G'/;z { 期K%u)3ķ}ΡڄKUТ_Ŕ@艗 6sJsCͣ(͝Q?< /,QOAR*IW6SnO2<>[-LL~)PQZl#X :S駁CXQ\ꐳJK(w"AEΆΎ50aE/"7['9[BJBuzkvpY5rzC4DQLC74<2*?5GYXC
+Zv]0ΓE`+ !)u_vps ¥@Qʛ} X2qi(&ET3IЉr"q @t5TClߡ]q_1HJjQ&-!ؑMWi
+V=ˠ$;xOlݦ@ #j{Dmsm
++KgBzKݜgFn8r4ʮ{Fl%jÉquf]u!B`AK@,&x;&:#:iѝع-Ϯ#( c݀aq"஼Nx9rFp/ɅJZ AoC
+5d!<[G01knA/˅ݙ%r($j/XbօԩYPF/ c}+8Mϝ3 Jl {[gPVŵzԡjf=TQ я%SUKMBfN6x@zaJZt>fyQ e''l b
+ԂHu21 L~%vY:@=o*)}xG9SWSb_."lw;N}{tƕ O13])\ݔIpְJk a8$`҆`r_Lh2h5ڜ<yj܂ꬫ\TE iXY<
+ +\ e])٦m9'.1eǧz>9pk̆1&2C qI7G0ceL{ECۖx=ҹtQh.@rmxA *\y_8gSPj8
+a}7 ek >x$CeAyiݢy&_=q(&E)!`E.Mw"B
+ !$etbi I;Mb"BmS2r/hq߁}.GK:F5D+j`2 vSKFq-L2"ql)('؀9p?a A:)J#1
+KdI<Z=#LKSL:V];ۃNyuQ0ӍtTFpK vW${ܔGRylqVS쮼QҧhW3 ڙ?P]
+ìd$
+
+ݖd\ǀ
+ʨQN"s{6);lx)ַEL$0uANh3WhrBKGb͜VHx MFO)v
+ U}FYfpG&!TfUw F3
+ X-EfŔ`ӄ8
+" XS;H3sS0µE2@SՒSq@r3ĸ($i!2߅0BO" <@CU)10<u`)CR9mGZPLN )"g+C  7L#pj u{p_p#3si26WjȚfe@ UѳL F8dFe쯒ĦdǐĂHIHՎˀ~8^WMx@}K %7
+rzvN z
+] ? D#QgyϜMk ri $_kU'jds*7Dޙж#YT/ 9tNrYM@/+nʘ5*/&T
+xB(Na> ~(~tD땲ݵdw3zY%m DUb#-F0Ӎa8bEʅ sgƖ6ygmʄO$L-i
+;Y߂Zb@OQDҒ5Uk, =sW'
+8!n|
+ /_E^cٟz Zx.=
+H v.T±Ta iN@Sι6;>2ŔgRT3y:vW0tsD}z;Io
+9JSG}_<qV>bDzsʯP2'D?CnIB222H<Y AìQr*9^.Y@jB\Yq"1\ B-uO+d}
+wTJ7yNAD^ ow@A/mHԱ-IRs^VLX$^9mKKūC3%`8rסIiha
+DU ፓD3}Oc{F F?N, 퉿(n+֎_op0rnhd qئQj}1']P<dkVlxAz24z10y!1͚ ,3t9!S,߆Fvf3c|<֔?bnO%sJ |omc" dRz<;)Wх\eW/FV&:B0p14t0^LdW1XmvUo&.e'פ8z\ nR ~r`(72̑f<EC,[aFcXELJ #'"e[S|SV\VSfRס>|^(芮%yh`Hϰ>bԹ{:g#u |Nbk̾E
+G4
+hKu Llm)lJqj(\fkB*kz%g D
+;"qHG69#ˆIqM% "dqS!ZRʞVɥ
+юaJ-Zފĥlhb[J0Ɉ\ߕX[ÌD$M_݊+ b,}YE6,]b4*v=Y/Ȃ
+b, LyTM/'ppEOG42 r $EMڗU3YDѾ~j{A ӮYӈb(q )fE]Zݧ)m
+%rk| K'ɣfDϓllĪC@^D3
+^VI]wo ;%ps̎֒8}Q A"]I*E58{V頾ۧU%8O4i^ it+1haZď&4B<zN64mqg$D:lvRZΥF= hPbz%h9݊$H6Cx(rDoZmx.zXPR4Y,W^EA%ٔ',Y3\'"|Ly]_!5ŲSA R^y3 kTbKf5ɍ9Vtuߋɟ!{ C `-=()6[-XEbYšʝQbҚ%v`cfw>a6(
+5GK BJހ{[0[bm圽 fُ26Q1,9}ibx/##tp8{.}[Ʊw93wE|xQQd7׋_
+t"X|gL'%٨:'y6G:8Q9Ŝ:ߦc8JƟmUv@lyK!t
+4⟙,tOTPbǜ8|2tD>琹H^iTָYAjJ$KVtw4C2r[e, )*cUH
+*0b7G/`+ܬ̮_"
+5HQEM͙b_VFQ!K@q/M\{1]i3n%j(!Hg0 "S3s
+!49Q艹ωTYi_wo ;EDm[}t܈ɂU3G0~5O>$Ҙ;aY+$,2r35C`M["Q5p$Mŧ|}moレ$_;
+k3[ForAD42W5l[2
+͖$؂<
+B+:? vA27Mh}TvKw4Y]nV7cH4N6YStYx,g~P,xD_|/`"4d2V00<k+1mAd&G%q~b>VIzXdzeS'L׋%(]рv͊;k1{s_511AGn4U-eh 4)E3S=X!mn @Rո+АoТԶik<}h@f-:k-C\LgT4cm.XW
+ZݒU.6F']Ҹ)f\]4
+V3LD5 TAЫ+o2) JBgqD{"b ( jBk3+|J.89_a
+}{/*('+8 J|EK[nizG٤\?Smq+F$
+~}g6V.r 8lmdPܼscGJ!0ߖ\nDaH> Q}g1*ˍd|]i,Ø!Kt$B HWbOHf]t qm%$Bqj P*}z=I`#,>
+oG*¨>|EG$k!P梣$adtDNɉQx,E=?XVTL#(׃ߞ墈9$;)IF)z
+a٥0D}kگ\*Hd/E@'zJAp
+~VN0iU'ո|6_EĩEyЀh ߿x,=mkv7lw!Vd|W] MϤVua6 '  9a; pp}~Y G
+Tdf׋기|Ie0 7y^uLc*1O֑AxUc8!քRFxk"Oӊ 3Y=$'K$>lLC6OL_DD9ȇx%|>'
+s*npp>TijɮܨC@~O!aUF7FDU"%I,2.p'+7z}~KԻ dAS$)Ya!}`t觢p{ M &%$]B L:[_,SM&'M8 sScPcف_4KϊRK2nJyQ>eh>$X3KJ|z=@$[6ۆa:t>c-bxtisI늛 9Ux^5|Q:a>| c6[!qK1$‡2bNYPz"+s1%rrB/$ܮz^3^&q0=(8k{G>V2 G@.tOb<hĵ_˕a!zFO/*K
+ ƃ|pм4We["Btơ)vM"_Q=gvΦ qPm:pcqwQ<~OH /49#+vn[y2QPQ$lK^ p)afzKҹ(
+DF|Aqpe[Mf&Jwz֡ܯ/(.[WENjO\%[O_OsKt׹O^Xҕ,,RIXUlSR+EDr %J湬b@k
+Pwa(-iFvĹ$!4>/݊w@*΁pRC`a,śpRnq.রX6YXZ7xbfUeKTӡ䉙ފ;Ip&."tW性*0.tق1Q3o^c ^F[cJB 49KK ;K&tsH
+yӾL&! R'_
+B)%mzCyf;$\
+HA\7DO; XKB￝Oeu8aW'A Ht=G|MD!zˣO4]@jçiKGjhL҇Krx,EHl "[u|4ɘ̇ٽ7 M6WI沣 Sf 1Fd~
+zk{Rm$3[4+ F^3lÜ ,H 㒫
+Xun~G>Wα!hM-|$u<GN39򘄫.fh#rt 2%F~UV GNdz_T|Wac̏26RcATոzz׌b lpqXTx7Ӧl\u^+k2Rz5q :YRō&O4zwĻ 'xBQvYQrFPӿ"+.42I|&qA&Tf 1hlZݑK <mWݍs.&r JMa6 8S!m+^*6w&ɘm|7$9FԹPs@މa$:/wxiŅϜ)VkVt; s๞sYq%l3!@zU1)ڻ_ƏCMOLo5T:3 b9ߛ8褄hm(4?G3feE:'FE庯J"FsEW؊Rs} ÉOGE =H&GŢP:3E\$xa)uEQOz< ~jc;r||A0-?pQ R} "ظE1Y6ϣUXb99S(@{hڋ ˭߈mOCꤳJFt"˴e}.4öJ(wt4#CLϰ/Nrݗ@Oplg|,AϘ7㠏q
+Z ٭=#[Wi@
+sCU(ټ3LzU1Rlۉj
+X5.c:kB*n,
+♬H$v:jĊ`~H9J֪5wĘb10%z&'Ct{iJDL(]}jPb\ &C̭eqQǽ5*d o^)]/׶!]),5+V^l| fNoZKR /_&mk
+ oGGKA=*R-T.bSy2‡14k`I˃!wW}BQO;$95A=ej*@fÐ#܆O}G
+]ҩ@>*GqZ.%Odk/nb~'L)LQ,3*HuQCg9\+Ue 0,>G;;!^xL +϶I{-1 r-(U>]쭛'TR^vf 6u"5lWŎOX mJ'sDa@S}6iT*&XBz^vvp)"S(? O&X4xB19N̤evV(5( 86>eil*G5+frcC/?
+uazK>r;ӣA2ʾ 6}NВOIAo,t"{zlB,b#W_]ayXŔD(z@jaD q]n]
+Ҽ 9 $`A2Hς SƼ
+A ҇
+GJbAp-EQ<n'"#}pdPEOEGw
+rx67ioǽq '^.~;Nb?(:0)%RXK*gO5+׭;) IoY'`idt,}2ʜًdrw$B}mFVu]"Q {7!AbY2
+xHNګVcu76B~2 º!,MrvrZQwQ|GyVIR=6.!r% \4mSAz>g*,h+năCM2|5մOJuvm\&o߁-j_ʟ ai?`?1~Gw!zg;/?pQTSN<Z_'ܴm
+E\_@`
+ Gc4g=y ةˬEƨziUd$%BT_J4-dE'0
+ę19^ѵ/Xs9A*4d4(eɿ_Z{ܜ)_Ǒ%ѱ3X!َ/kD>5HaM{ SeAyVI>˹Ja,"o21@#3v}"6(};rQ,C9q X'Qg3^&q@=00%-@BR8V?i¼Jmp.`0pE"*͝;!0'd󓸗)*E}FNJ0YeI$^gyN7It𢄍GurRY {-LR!iH\#O"w4xPyYZ 7[bvdu|fFQWe!3uҚ=$&Kn 4d^>SxK$J`sDo$W{+
+Z9}q~xqhvn1E$n~X 9eC<<-S" /<3
+޴2a){JgSyKu~}<e(2 hϗOaVe46V g
+U d@_ b^b:ݔpѵ)<z*z\"@t/'\P7xNH
+c< @rHц\Z()v-ߪwq)XS/q(ރoH0P:J?
+W<YsHU ڭ.㜫IKsEE{r
+$X7^&n&ϥ,Ll+CѧE9y2ϊQAN
+xs=Pg8xE]bC utc|ph4+yv^5, 3u@usWՕĸ[:̒JO=|3
+@CyYi߭QN 6nkM ٦z
+#
+NsՄ#HZNP
+:y5&AK$54,JYpDL|R$_ܣ8^PJ`&՘
+ZW^Oc6)7cWa$xq7%עW簙"q&r+{_~R=H
+?)J6 b'_F[$$Z;15FzsX%0N \ǐZ%xD̓p=v읾㏇uD`~Ue!8e\#~&G`V)ǯ*\ \At>lsD:C `(L?oV}*/NC3;9e_nuлعGc6m~(9~ST8jQh MnYyzƊkрv@)\ލ?5=/l0QX
+p
+#(n ۫&
+3m;Ar>:NK`#@T>4!'/t&y ((,^pR߁ǚjxF ANq)To'Sx*aE\eCr"tyS
+ЋDQXO @>!}"إ':dzB
+숁0MufP/ѐpD xA8R6SwQN=cl@Z)#ݭCA@^A\A 8G[5(~N8JьZF -; d20ӾS e+MB_M@e}&T;2wtg`5 6&ԑ 6&GR4E2yʫA"t([)"iIJX^Bz Zwbc(Ztf3^&uH=AݡN@<-@,fF6k$b<ϭ: TCLyL s
+ 6Yo (4}c/Bqc>jkPhcƘ&X7#D2V!SoBAYh*! "!hj< WP_n)O@̑LV֡rlcl@hí+z)*$28Ilޓ
+܀AxHQm0LA /Mnc`j nІb_/Ř!"d]? >>E BCҊ
+'Suc SyF!=M7OB98I^ip(U?Žt<  23>8Agy5VFƆsꁍĎLo+rJLRxRow$CFB:Θ d1,Wvw.ٹMfAo8dHZqjU!FKYjf =HjRnHNžTK.2SGi^7_ȝOŴ*,&vSh^p T9zR Ҵ"8
+2t(k!Dq>ґXem bDOeqJ']2S,׽{*G ˸0l *ưG55--Jj#YslDDf>y>bѰW vJMƲ:be(yHN޾V
+]@77:\#}
+ y?2Է b(6~+Ck/Y'.ͭV{=Хj7YK)ŭ*˦OWGG&I\ë@HB
+ه="ιC8lMC L5Q
+r^<)3 BVevc>^NbX<)\yT+ ۻW@?X4#
+H\o#'Ū12a!QR15!;Rb4^:x̜zx% _bU:Ȃ7*+aD2nfDa;}nÕ3^ﱃG|՘N:!S)GU_֕U̐vTNJrDHF)ܒ䴗i
+gcq[Ճ\(=`: o
+bC!:*o‡X8mB'X *B@+l[$瞖Ήr] {ʐ'S5,plܭo"K3CY an+o$2䪓 jhY/ A AHp[β/in$8@EVrq
+[N +ՌړO]A
+
+XSaSػAb5؄)`0OhQ.{rAEbq%텋)*jfp8$4ό"4hc6dse$ɍCq4ú-ͺ';+Z)>PׯzHQ'!552@\֑p ǑEO%{+{L%|,P*
+xW8EE<<Β(Tlde^!-1$E;F!֎iIVuY0i^JS,.O12ȟ<> \.#f{/"s~m !$N
+X kq'kH>? 5^&%-8PeO: 7:Xs>4dvhKf#%p _rq ѹ!X#8` WBMAotML:)DYoօR
+(T6~C.IGhz\k" j] J }T.U63o"nA뱁 ݹ<Yy34j< 5⍹B~1帺
+ys#f+zov}[yWf:@"ϱ2gw<)W'& u* I!ɥtVw9'\iCvնu 4?JSV9ÆeU(+pax_ZqTT] L@;q ԇk5i9VeX?/rs?)Fo{Jb׃۬,!]B$b8EScACJ
+hCMY$b1\s,. o* 8
+~%l
+dЫا)HDc~ 6yR.nns[acR[Q#) e|˻ J/nw#ɡttlmʩ:LIA6ݷI]JS{\ps Σn(}44|Wy@NY cR2獼p uɷ1}>/2~ QL8'"%aMk0 )94mx jb0/8[cw_Ks_1;z%*E(?N{V Ɉqt[t ]ٮ@JrA#~/ 1tB@]`Mm`Ƕ4s(*S׶)I
+%9rz4gૄڳ,8K&)s]@;>%7Sq.HIUQ:9
+ܦ\Y3r¦k `#oAS4s2a3647y"aY:7NUqr*;v;H~}üGLk픠]w 5j 튡)T0{9TunqV:'
+Jz:3CuU7r
+Z `6=;FEA$Cs۾Fly%Ǽ?o/G$e
+A
+<~9L`%1\fBHXD^]F稽JD+ _ MB
+~֜o+zkXXW CCAȧj2 >% {y7cbLcJӬ>NiN
+riux8'iSAa.WUx&呡?G$ W ex~YFqPj>c̱㼱(b<28B￿PTՏjv`Q7z" ^Mv<X2Om˙^.V\ku
+cJ$r"wv|e~#Ex>ɩ܍wF 71bB [C*^gjGabbAg5"VDndw 5bDF}
+ƺ!Z>()ʈ ʴ2 T2q^56|5
+-TfT;~1&*#NlVLH.sGt-OT2U KGd ?].sL
+2 Il|'!O
+oW 3ˀ2wl;*$4r9L x`3po(c$NKA0Fk'hM-ɕϨU]F6l34VrȋTIxq
+Xv2wpUa:N֌zYTct
+prD\^i_ph;G]>N "Q)xH}sH IBvԫ'kKvLFcK w:s3CZ䮷byZǦe*b"x3';&9ydsf@, }
+٘Wĉq@jdQƸp٫
+CϝZ7D^}(n,9ˆ 9([^"J}Id$[B6*mA&1jTdhE<[Ӝo$HXի2l_QXisvxЩg(+?xb.>}Q@&JSm`*9KS2g5It C9OsseL1xTa %h]C~y .-n)8꿼h/ Q>8 ɆxgoaW&3]YKsW|
+UֿQFmy1w~|~]z_} ׿o"uJ\oV 㛐k&H|HUb 9dĂܨ)#?yIRZ% l
+npȥdAf"aq0|'wVod!,
+PY;9~G`|Y0 $܊ w0B(z`2eFǙE@3*f.&P'T f#:/Z<@ n̈́^QLKqWTNXWh3KH:c/GRp]6?C88)YF٣II[3; WAẓ`%
+u8DA-"k&>qMƵ of"êkT.jZ/$5得i9܈[m-ڹ0H GatX2bߡ#!U2tc"lAI7 .}cYO9_hO)">٥$=DfZN*"g,m;Li!B_';,{D̰%j
+
+,mW2
+ 69pZ4XZ-Hm:s +)C]"Nt
+ yPɝ)bITg%J6*^/n};@I=4
+h
+=L|$GХ Ї@ S̪AaT
+lqռ7T6f'D{ܪ= 1`R=
+ =1UYj–vimzjR=
+!
+^xR" ~
+וLi{$SRSey#pQ~)*E*t D UG4SnYyQ ugS6X~gGWJnM(bh$,ف3#<RѲApJY5lI@EAAek0ΙL-LľvЌl\U1 j|L0jƏB\ym2kCB6s㨲hyNq
+쉼Bݽ!`4cSR87*N8=jAܐHL
+⧃V)rEǸ9-,Ѝ;l i;4 MB1W
+Fu~ad.J@hCauj=߽2/ "%x zNg.SZSbJc1*:R:d8II hBO ;U}0Opnvm;)NhZYWбe.HA֌|IӾ|!--8j}(ȇ_ z_mOc 
+c%#"*锂ocyHLdnϯ^[Xvĉ
+ K`|?6O XA
+|q&9LjIeuI+fd^(E;ʃVY2\rh Sbx:(a0lu\Bxhgݸ.mr|w7L<Vc}"DVy dp0]6A88
+Y`
+HwVu6PprqV*2P036P04P1R
+@}\|@.W_@.
+8;Z,'4.>1P%!M&K+3#%BQUs'$E0Y0B0&\W^Q'U_e6G+lVS/qL]DoKd+#,B3l$)2#h
+WO$l_LsNPA]VJhAao?t6jF+JPF'VPY"=1*FOLRDK7:]\)gY6A5L[iQ.4=erIAU-IU
+s02KkN?e>G(g0)U(&q?aUtE*5Z-D!QD+#6GHTL.`pUUN4fK=Ftn+F*$[eHZ3&F;hY
+!_r)C8*3Y$[bn:/qKQj]YQRNaB(dqm(uHjq,<G*OT`cmS(YH%,O$nqaB[#>!.G45$
+%'@a;dFr'sBZ<,pa:tIrqEdr&@bKc"qLhFJ1O6tX<ULUcQfYj>4'I2pXB[b03BSe*
+br!K)$sl__n#RNE.Y2$#)>7//rB]kA`=X:Lq>>2RcZ:D+;L':,<@M!s+(P1<c4dQ1
+i\<goA+/V'5#9C&FOhlR;0HX(nPp,4IlZ'9k:Oe==O1"h-?Kg^)-q`XK9-*_oRVtP
+g2T8.\c/\e,mq0lHT!oAs%XNE&`72*Gth+(dSr+M$/p!mC@u0InS4`KP?'Li1++ND
+OcEcBj5b?1a.Q>):sX;&1UNHmCJj\S[00N^V?'7EOC!u3gIG=L7;>hr9;VHX4A!g2
+j.=GhQj:7r4g`[,Nh=$[9r%QLR#i3CiNKonmo:3Ak\*L&kQ_nu6aWUQj)`HO4&#el
+R?JrV$/N[I1Z[kI;#71*KnmPk6]dA2dYVKKnNPQqB=tEKNa3rOeI!hSTS":jT!T(U
+D5"k"S*iY>($I^YJ);0Br,EljcDT@8Glf;5rS;E4HL(7Pj?5!W4<\2fMr5+@]TaeL
+,=m$`H.'b\VF=-_0&o-kB//#s=:=G"-%k`\$cr&!Q4YJ!S)j/dbP`C@QZi0^pi2tH
+mgD/F>Ib=-lI[^J9BQWAol<t@PIfV86:RMo0BS,CK[,dAHb"ZaL_t,9@<*NENqW4J
+\B`(Bd45eBlQRObMaTp'lS_E)U<=.8-dfPuj`HLaD^UU#/oHd+]rN(c8QVEnf9fCN
+c!\C5HBiJj9tIU,oCn)hGCn<#prZ0<P-#NTOhBEEV%maTkPVb+r6QU_*F6P6V3!_Y
+#a2Y?f4Jr=bfV$%.99`(I_`QP%:f42gr8?fYL5e@dK81,B.#'u,4_;uZY"1.O0q*c
+J*ZJ(W1;'Zi'=Y"/@bnG56Cmo^g2<~> endstream endobj 13 0 obj <</BBox[0.0 630.0 810.0 0.0]/Group 295 0 R/Length 1678498/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R/GS1 296 0 R>>/XObject<</Fm0 297 0 R>>>>/Subtype/Form>>stream
+0.793 0.801 0.129 0.016 k
+/GS0 gs
+0 630 810 -174.639 re
+f
+0 75.361 810 -75.361 re
+f
+0 0 0 0 k
+q 1 0 0 1 758.8652 63.3223 cm
+0 0 m
+0.44 2.19 l
+1.396 2.19 l
+0.44 -1.294 l
+-0.427 -1.294 l
+-1.397 2.19 l
+-0.441 2.19 l
+h
+3.881 -1.294 m
+2.969 -1.294 l
+2.969 2.278 l
+2.072 1.94 l
+2.072 2.69 l
+3.792 3.395 l
+3.881 3.395 l
+h
+5.409 -0.823 m
+5.409 -0.688 5.453 -0.57 5.541 -0.47 c
+5.637 -0.375 5.765 -0.324 5.923 -0.324 c
+6.077 -0.324 6.206 -0.375 6.306 -0.47 c
+6.412 -0.559 6.468 -0.676 6.468 -0.823 c
+6.468 -0.981 6.412 -1.103 6.306 -1.191 c
+6.206 -1.278 6.077 -1.323 5.923 -1.323 c
+5.776 -1.323 5.651 -1.278 5.556 -1.191 c
+5.456 -1.103 5.409 -0.981 5.409 -0.823 c
+9.998 0.646 m
+9.998 0 9.881 -0.496 9.645 -0.838 c
+9.41 -1.183 9.076 -1.353 8.646 -1.353 c
+8.213 -1.353 7.881 -1.187 7.646 -0.852 c
+7.411 -0.522 7.287 -0.044 7.279 0.573 c
+7.279 1.455 l
+7.279 2.102 7.389 2.595 7.617 2.94 c
+7.852 3.281 8.191 3.454 8.631 3.454 c
+9.072 3.454 9.404 3.281 9.631 2.94 c
+9.867 2.605 9.988 2.124 9.998 1.5 c
+h
+9.088 1.587 m
+9.088 1.959 9.047 2.234 8.97 2.41 c
+8.899 2.595 8.786 2.69 8.631 2.69 c
+8.345 2.69 8.194 2.356 8.176 1.691 c
+8.176 0.515 l
+8.176 0.139 8.213 -0.14 8.294 -0.324 c
+8.371 -0.511 8.488 -0.603 8.646 -0.603 c
+8.793 -0.603 8.899 -0.522 8.97 -0.353 c
+9.036 -0.177 9.076 0.092 9.088 0.455 c
+h
+10.807 -0.823 m
+10.807 -0.688 10.851 -0.57 10.939 -0.47 c
+11.035 -0.375 11.164 -0.324 11.322 -0.324 c
+11.476 -0.324 11.605 -0.375 11.704 -0.47 c
+11.81 -0.559 11.866 -0.676 11.866 -0.823 c
+11.866 -0.981 11.81 -1.103 11.704 -1.191 c
+11.605 -1.278 11.476 -1.323 11.322 -1.323 c
+11.174 -1.323 11.05 -1.278 10.954 -1.191 c
+10.855 -1.103 10.807 -0.981 10.807 -0.823 c
+15.397 0.646 m
+15.397 0 15.279 -0.496 15.044 -0.838 c
+14.809 -1.183 14.474 -1.353 14.044 -1.353 c
+13.611 -1.353 13.28 -1.187 13.045 -0.852 c
+12.81 -0.522 12.685 -0.044 12.677 0.573 c
+12.677 1.455 l
+12.677 2.102 12.787 2.595 13.016 2.94 c
+13.251 3.281 13.589 3.454 14.03 3.454 c
+14.47 3.454 14.802 3.281 15.029 2.94 c
+15.264 2.605 15.386 2.124 15.397 1.5 c
+h
+14.485 1.587 m
+14.485 1.959 14.445 2.234 14.368 2.41 c
+14.298 2.595 14.184 2.69 14.03 2.69 c
+13.743 2.69 13.593 2.356 13.574 1.691 c
+13.574 0.515 l
+13.574 0.139 13.611 -0.14 13.692 -0.324 c
+13.769 -0.511 13.886 -0.603 14.044 -0.603 c
+14.192 -0.603 14.298 -0.522 14.368 -0.353 c
+14.434 -0.177 14.474 0.092 14.485 0.455 c
+h
+f
+Q
+q 1 0 0 1 40.6324 65.0269 cm
+0 0 m
+-0.276 -0.305 -0.632 -0.54 -1.073 -0.706 c
+-1.507 -0.87 -1.97 -0.947 -2.469 -0.941 c
+-2.911 -0.941 -3.293 -0.845 -3.616 -0.661 c
+-3.939 -0.467 -4.189 -0.187 -4.366 0.177 c
+-4.542 0.537 -4.642 0.956 -4.659 1.426 c
+-4.671 1.68 -4.656 1.945 -4.615 2.22 c
+-4.439 3.425 l
+-4.285 4.454 -3.95 5.248 -3.439 5.806 c
+-2.932 6.365 -2.263 6.633 -1.44 6.615 c
+-0.735 6.604 -0.206 6.394 0.147 5.983 c
+0.5 5.571 0.68 4.969 0.69 4.175 c
+-0.721 4.175 l
+-0.735 4.586 l
+-0.775 5.104 -1.037 5.373 -1.514 5.395 c
+-2.213 5.424 -2.668 4.961 -2.881 4.013 c
+-2.955 3.631 l
+-3.16 2.22 l
+-3.2 1.897 -3.215 1.617 -3.204 1.382 c
+-3.197 1.008 -3.113 0.736 -2.955 0.559 c
+-2.801 0.389 -2.583 0.302 -2.308 0.294 c
+-2.043 0.294 -1.749 0.383 -1.426 0.559 c
+-1.176 1.912 l
+-2.19 1.912 l
+-1.984 3.028 l
+0.47 3.028 l
+h
+2.095 -0.837 m
+0.698 -0.837 l
+1.639 4.63 l
+3.05 4.63 l
+h
+1.83 6.012 m
+1.83 6.247 1.903 6.438 2.051 6.585 c
+2.198 6.733 2.373 6.806 2.579 6.806 c
+2.793 6.814 2.977 6.747 3.123 6.6 c
+3.271 6.461 3.344 6.284 3.344 6.072 c
+3.344 5.836 3.271 5.644 3.123 5.498 c
+2.977 5.351 2.793 5.278 2.579 5.278 c
+2.363 5.266 2.183 5.328 2.036 5.469 c
+1.897 5.615 1.83 5.796 1.83 6.012 c
+5.945 5.968 m
+5.71 4.63 l
+6.416 4.63 l
+6.24 3.558 l
+5.534 3.558 l
+5.064 0.794 l
+5.049 0.632 l
+5.038 0.405 5.13 0.294 5.328 0.294 c
+5.388 0.283 5.505 0.287 5.681 0.31 c
+5.548 -0.808 l
+5.343 -0.897 5.097 -0.941 4.814 -0.941 c
+4.409 -0.929 4.108 -0.786 3.902 -0.5 c
+3.697 -0.205 3.616 0.184 3.667 0.676 c
+4.137 3.558 l
+3.52 3.558 l
+3.697 4.63 l
+4.314 4.63 l
+4.549 5.968 l
+h
+7.915 0.397 m
+10.444 0.397 l
+10.238 -0.837 l
+6.254 -0.837 l
+7.533 6.527 l
+8.974 6.527 l
+h
+13.498 -0.837 m
+13.475 -0.72 13.468 -0.58 13.468 -0.411 c
+13.152 -0.764 12.796 -0.941 12.395 -0.941 c
+11.973 -0.941 11.634 -0.789 11.381 -0.484 c
+11.135 -0.183 11.021 0.195 11.042 0.647 c
+11.072 1.235 11.296 1.691 11.719 2.014 c
+12.137 2.345 12.704 2.514 13.409 2.514 c
+13.82 2.514 l
+13.88 2.955 l
+13.895 3.175 l
+13.895 3.469 13.777 3.616 13.542 3.616 c
+13.218 3.624 13.02 3.418 12.954 2.999 c
+11.557 2.984 l
+11.586 3.502 11.8 3.925 12.204 4.248 c
+12.604 4.58 13.093 4.74 13.674 4.734 c
+14.21 4.723 14.622 4.549 14.909 4.219 c
+15.202 3.896 15.324 3.462 15.276 2.926 c
+14.82 0.148 l
+14.805 -0.132 l
+14.795 -0.367 14.82 -0.573 14.879 -0.749 c
+14.865 -0.837 l
+h
+12.792 0.177 m
+13.034 0.166 13.263 0.272 13.468 0.5 c
+13.718 1.646 l
+13.409 1.646 l
+13.145 1.636 12.928 1.548 12.762 1.382 c
+12.594 1.213 12.498 1.004 12.469 0.75 c
+12.469 0.559 l
+12.469 0.449 12.49 0.357 12.542 0.279 c
+12.601 0.21 12.681 0.177 12.792 0.177 c
+18.057 -0.941 m
+17.595 -0.918 17.249 -0.706 17.014 -0.294 c
+16.837 -0.837 l
+15.53 -0.837 l
+16.882 6.924 l
+18.279 6.924 l
+17.749 4.175 l
+18.061 4.557 18.418 4.74 18.822 4.734 c
+19.3 4.723 19.66 4.543 19.895 4.19 c
+20.13 3.844 20.233 3.341 20.204 2.675 c
+20.182 1.9 20.087 1.228 19.91 0.662 c
+19.74 0.092 19.502 -0.323 19.189 -0.588 c
+18.874 -0.841 18.499 -0.959 18.057 -0.941 c
+18.836 2.661 m
+18.844 2.974 18.807 3.194 18.719 3.323 c
+18.639 3.458 18.506 3.528 18.323 3.528 c
+18.065 3.535 17.83 3.404 17.617 3.132 c
+17.19 0.618 l
+17.286 0.383 17.477 0.254 17.764 0.235 c
+18.282 0.206 18.591 0.578 18.69 1.353 c
+18.734 1.721 l
+h
+25.672 1.721 m
+23.262 1.721 l
+23.482 2.911 l
+25.878 2.911 l
+h
+32.933 2.352 m
+30.684 2.352 l
+30.346 0.397 l
+33.007 0.397 l
+32.787 -0.837 l
+28.685 -0.837 l
+29.964 6.527 l
+34.065 6.527 l
+33.845 5.278 l
+31.199 5.278 l
+30.89 3.543 l
+33.139 3.543 l
+h
+35.424 1.206 m
+36.63 4.63 l
+38.115 4.63 l
+35.807 -0.837 l
+34.484 -0.837 l
+33.867 4.63 l
+35.293 4.63 l
+h
+39.966 -0.941 m
+39.526 -0.941 39.147 -0.833 38.835 -0.617 c
+38.53 -0.404 38.31 -0.103 38.173 0.279 c
+38.034 0.662 37.99 1.095 38.041 1.588 c
+38.085 1.956 l
+38.202 2.866 38.474 3.562 38.908 4.042 c
+39.349 4.52 39.912 4.752 40.599 4.734 c
+41.098 4.711 41.488 4.557 41.774 4.263 c
+42.058 3.969 42.223 3.55 42.274 3.014 c
+42.293 2.691 42.282 2.374 42.245 2.073 c
+42.157 1.411 l
+39.423 1.411 l
+39.401 1.272 39.397 1.135 39.409 1 c
+39.438 0.507 39.677 0.258 40.128 0.25 c
+40.548 0.239 40.955 0.401 41.348 0.736 c
+41.819 -0.132 l
+41.631 -0.389 41.371 -0.588 41.04 -0.735 c
+40.706 -0.881 40.349 -0.947 39.966 -0.941 c
+40.467 3.558 m
+40.062 3.564 39.783 3.308 39.629 2.779 c
+39.526 2.411 l
+40.907 2.411 l
+40.944 2.606 40.966 2.764 40.966 2.881 c
+40.974 3.311 40.808 3.535 40.467 3.558 c
+45.799 3.249 m
+45.358 3.308 l
+44.982 3.315 44.681 3.138 44.446 2.779 c
+43.814 -0.837 l
+42.418 -0.837 l
+43.373 4.63 l
+44.681 4.63 l
+44.564 4.028 l
+44.729 4.293 44.891 4.476 45.049 4.586 c
+45.203 4.693 45.376 4.748 45.564 4.748 c
+45.67 4.748 45.813 4.723 45.99 4.675 c
+h
+47.897 1.573 m
+49.146 4.63 l
+50.661 4.63 l
+47.853 -1.66 l
+47.647 -2.15 47.405 -2.502 47.133 -2.719 c
+46.857 -2.944 46.537 -3.057 46.177 -3.057 c
+46.037 -3.057 45.832 -3.021 45.56 -2.954 c
+45.692 -1.837 l
+45.839 -1.851 l
+46.221 -1.851 46.501 -1.679 46.677 -1.337 c
+46.912 -0.823 l
+46.339 4.63 l
+47.808 4.63 l
+h
+52.997 4.734 m
+53.556 4.711 53.986 4.52 54.291 4.16 c
+54.603 3.807 54.776 3.326 54.806 2.72 c
+54.806 2.367 l
+54.754 1.309 54.501 0.485 54.041 -0.103 c
+53.578 -0.683 52.976 -0.959 52.233 -0.941 c
+51.8 -0.929 51.443 -0.816 51.16 -0.588 c
+50.873 -0.363 50.667 -0.055 50.543 0.339 c
+50.426 0.739 50.389 1.199 50.44 1.721 c
+50.469 1.985 l
+50.565 2.845 50.84 3.521 51.292 4.013 c
+51.741 4.513 52.31 4.752 52.997 4.734 c
+51.822 1.147 m
+51.822 0.559 51.997 0.254 52.35 0.235 c
+52.839 0.206 53.159 0.578 53.306 1.353 c
+53.35 1.721 l
+53.398 2.198 53.424 2.506 53.424 2.646 c
+53.424 3.223 53.24 3.528 52.88 3.558 c
+52.604 3.564 52.38 3.44 52.204 3.175 c
+52.035 2.918 51.928 2.547 51.88 2.058 c
+51.839 1.565 51.822 1.264 51.822 1.147 c
+57.246 4.63 m
+57.142 4.087 l
+57.532 4.535 57.958 4.752 58.422 4.734 c
+58.804 4.723 59.091 4.576 59.288 4.293 c
+59.494 4.017 59.598 3.62 59.598 3.102 c
+59.568 2.646 l
+58.98 -0.837 l
+57.584 -0.837 l
+58.157 2.646 l
+58.187 2.94 l
+58.204 3.341 58.058 3.543 57.745 3.543 c
+57.599 3.543 57.47 3.502 57.363 3.425 c
+57.264 3.344 57.175 3.252 57.098 3.146 c
+56.393 -0.837 l
+54.997 -0.837 l
+55.952 4.63 l
+h
+62.141 -0.941 m
+61.699 -0.941 61.321 -0.833 61.009 -0.617 c
+60.703 -0.404 60.483 -0.103 60.347 0.279 c
+60.207 0.662 60.163 1.095 60.215 1.588 c
+60.259 1.956 l
+60.377 2.866 60.649 3.562 61.082 4.042 c
+61.522 4.52 62.085 4.752 62.773 4.734 c
+63.272 4.711 63.662 4.557 63.949 4.263 c
+64.231 3.969 64.396 3.55 64.448 3.014 c
+64.466 2.691 64.456 2.374 64.419 2.073 c
+64.331 1.411 l
+61.597 1.411 l
+61.574 1.272 61.57 1.135 61.582 1 c
+61.611 0.507 61.85 0.258 62.302 0.25 c
+62.721 0.239 63.128 0.401 63.522 0.736 c
+63.992 -0.132 l
+63.805 -0.389 63.544 -0.588 63.213 -0.735 c
+62.879 -0.881 62.522 -0.947 62.141 -0.941 c
+62.64 3.558 m
+62.236 3.564 61.956 3.308 61.802 2.779 c
+61.699 2.411 l
+63.081 2.411 l
+63.118 2.606 63.14 2.764 63.14 2.881 c
+63.147 3.311 62.982 3.535 62.64 3.558 c
+69.034 0.235 m
+69.416 0.225 69.655 0.5 69.754 1.058 c
+71.063 1.058 l
+71.004 0.449 70.776 -0.04 70.386 -0.411 c
+69.993 -0.786 69.519 -0.959 68.961 -0.941 c
+68.45 -0.929 68.042 -0.779 67.741 -0.484 c
+67.436 -0.191 67.255 0.214 67.197 0.736 c
+67.145 1.154 67.171 1.665 67.27 2.264 c
+67.365 2.87 67.554 3.373 67.829 3.778 c
+68.269 4.432 68.894 4.752 69.711 4.734 c
+70.258 4.711 70.681 4.513 70.974 4.131 c
+71.269 3.749 71.4 3.234 71.371 2.587 c
+70.048 2.587 l
+70.048 2.897 l
+70.037 3.315 69.875 3.535 69.563 3.558 c
+69.063 3.576 68.77 3.19 68.682 2.396 c
+68.578 1.485 l
+68.538 1.21 68.523 0.985 68.535 0.809 c
+68.564 0.434 68.729 0.243 69.034 0.235 c
+74.028 -0.837 m
+74.006 -0.72 73.999 -0.58 73.999 -0.411 c
+73.682 -0.764 73.326 -0.941 72.926 -0.941 c
+72.503 -0.941 72.165 -0.789 71.911 -0.484 c
+71.666 -0.183 71.552 0.195 71.573 0.647 c
+71.602 1.235 71.827 1.691 72.25 2.014 c
+72.668 2.345 73.235 2.514 73.94 2.514 c
+74.351 2.514 l
+74.411 2.955 l
+74.425 3.175 l
+74.425 3.469 74.307 3.616 74.072 3.616 c
+73.749 3.624 73.551 3.418 73.484 2.999 c
+72.088 2.984 l
+72.117 3.502 72.331 3.925 72.734 4.248 c
+73.135 4.58 73.624 4.74 74.205 4.734 c
+74.741 4.723 75.153 4.549 75.439 4.219 c
+75.733 3.896 75.855 3.462 75.807 2.926 c
+75.351 0.148 l
+75.336 -0.132 l
+75.325 -0.367 75.351 -0.573 75.41 -0.749 c
+75.396 -0.837 l
+h
+73.322 0.177 m
+73.565 0.166 73.793 0.272 73.999 0.5 c
+74.249 1.646 l
+73.94 1.646 l
+73.675 1.636 73.459 1.548 73.293 1.382 c
+73.124 1.213 73.029 1.004 72.999 0.75 c
+72.999 0.559 l
+72.999 0.449 73.021 0.357 73.073 0.279 c
+73.131 0.21 73.212 0.177 73.322 0.177 c
+78.28 4.63 m
+78.177 4.087 l
+78.567 4.535 78.993 4.752 79.456 4.734 c
+79.838 4.723 80.125 4.576 80.323 4.293 c
+80.529 4.017 80.632 3.62 80.632 3.102 c
+80.603 2.646 l
+80.015 -0.837 l
+78.618 -0.837 l
+79.191 2.646 l
+79.221 2.94 l
+79.238 3.341 79.092 3.543 78.779 3.543 c
+78.633 3.543 78.504 3.502 78.397 3.425 c
+78.298 3.344 78.21 3.252 78.133 3.146 c
+77.428 -0.837 l
+76.031 -0.837 l
+76.986 4.63 l
+h
+85.357 0.235 m
+85.74 0.225 85.979 0.5 86.078 1.058 c
+87.386 1.058 l
+87.327 0.449 87.099 -0.04 86.71 -0.411 c
+86.317 -0.786 85.842 -0.959 85.284 -0.941 c
+84.773 -0.929 84.366 -0.779 84.064 -0.484 c
+83.759 -0.191 83.579 0.214 83.52 0.736 c
+83.469 1.154 83.494 1.665 83.593 2.264 c
+83.689 2.87 83.876 3.373 84.152 3.778 c
+84.593 4.432 85.218 4.752 86.033 4.734 c
+86.581 4.711 87.003 4.513 87.298 4.131 c
+87.591 3.749 87.724 3.234 87.695 2.587 c
+86.372 2.587 l
+86.372 2.897 l
+86.361 3.315 86.199 3.535 85.887 3.558 c
+85.387 3.576 85.093 3.19 85.004 2.396 c
+84.902 1.485 l
+84.861 1.21 84.846 0.985 84.858 0.809 c
+84.887 0.434 85.052 0.243 85.357 0.235 c
+90.627 4.734 m
+91.186 4.711 91.616 4.52 91.921 4.16 c
+92.233 3.807 92.406 3.326 92.435 2.72 c
+92.435 2.367 l
+92.383 1.309 92.13 0.485 91.67 -0.103 c
+91.208 -0.683 90.605 -0.959 89.862 -0.941 c
+89.43 -0.929 89.073 -0.816 88.79 -0.588 c
+88.503 -0.363 88.297 -0.055 88.173 0.339 c
+88.055 0.739 88.018 1.199 88.069 1.721 c
+88.098 1.985 l
+88.194 2.845 88.47 3.521 88.921 4.013 c
+89.37 4.513 89.939 4.752 90.627 4.734 c
+89.451 1.147 m
+89.451 0.559 89.627 0.254 89.98 0.235 c
+90.469 0.206 90.789 0.578 90.936 1.353 c
+90.98 1.721 l
+91.028 2.198 91.053 2.506 91.053 2.646 c
+91.053 3.223 90.87 3.528 90.509 3.558 c
+90.234 3.564 90.01 3.44 89.833 3.175 c
+89.665 2.918 89.557 2.547 89.509 2.058 c
+89.469 1.565 89.451 1.264 89.451 1.147 c
+94.878 4.63 m
+94.776 4.087 l
+95.165 4.535 95.591 4.752 96.054 4.734 c
+96.437 4.723 96.723 4.576 96.922 4.293 c
+97.128 4.017 97.23 3.62 97.23 3.102 c
+97.201 2.646 l
+96.613 -0.837 l
+95.217 -0.837 l
+95.79 2.646 l
+95.819 2.94 l
+95.838 3.341 95.691 3.543 95.379 3.543 c
+95.231 3.543 95.103 3.502 94.996 3.425 c
+94.897 3.344 94.809 3.252 94.732 3.146 c
+94.026 -0.837 l
+92.63 -0.837 l
+93.585 4.63 l
+h
+100.318 5.968 m
+100.082 4.63 l
+100.788 4.63 l
+100.611 3.558 l
+99.906 3.558 l
+99.435 0.794 l
+99.421 0.632 l
+99.41 0.405 99.502 0.294 99.7 0.294 c
+99.759 0.283 99.876 0.287 100.052 0.31 c
+99.921 -0.808 l
+99.715 -0.897 99.468 -0.941 99.186 -0.941 c
+98.781 -0.929 98.48 -0.786 98.274 -0.5 c
+98.068 -0.205 97.987 0.184 98.039 0.676 c
+98.51 3.558 l
+97.892 3.558 l
+98.068 4.63 l
+98.685 4.63 l
+98.921 5.968 l
+h
+103.933 3.249 m
+103.493 3.308 l
+103.117 3.315 102.816 3.138 102.581 2.779 c
+101.949 -0.837 l
+100.553 -0.837 l
+101.508 4.63 l
+102.816 4.63 l
+102.699 4.028 l
+102.864 4.293 103.026 4.476 103.184 4.586 c
+103.338 4.693 103.51 4.748 103.698 4.748 c
+103.805 4.748 103.948 4.723 104.125 4.675 c
+h
+105.304 -0.837 m
+103.907 -0.837 l
+104.848 4.63 l
+106.259 4.63 l
+h
+105.039 6.012 m
+105.039 6.247 105.113 6.438 105.26 6.585 c
+105.407 6.733 105.583 6.806 105.789 6.806 c
+106.003 6.814 106.186 6.747 106.333 6.6 c
+106.479 6.461 106.554 6.284 106.554 6.072 c
+106.554 5.836 106.479 5.644 106.333 5.498 c
+106.186 5.351 106.003 5.278 105.789 5.278 c
+105.573 5.266 105.392 5.328 105.245 5.469 c
+105.106 5.615 105.039 5.796 105.039 6.012 c
+108.876 -0.941 m
+108.413 -0.918 108.067 -0.706 107.832 -0.294 c
+107.655 -0.837 l
+106.348 -0.837 l
+107.7 6.924 l
+109.097 6.924 l
+108.567 4.175 l
+108.879 4.557 109.236 4.74 109.64 4.734 c
+110.118 4.723 110.478 4.543 110.713 4.19 c
+110.948 3.844 111.051 3.341 111.022 2.675 c
+111 1.9 110.905 1.228 110.728 0.662 c
+110.559 0.092 110.32 -0.323 110.007 -0.588 c
+109.692 -0.841 109.317 -0.959 108.876 -0.941 c
+109.655 2.661 m
+109.662 2.974 109.625 3.194 109.537 3.323 c
+109.457 3.458 109.324 3.528 109.141 3.528 c
+108.883 3.535 108.648 3.404 108.435 3.132 c
+108.009 0.618 l
+108.104 0.383 108.295 0.254 108.582 0.235 c
+109.1 0.206 109.409 0.578 109.508 1.353 c
+109.552 1.721 l
+h
+114.003 -0.338 m
+113.656 -0.749 113.257 -0.947 112.797 -0.941 c
+112.433 -0.941 112.143 -0.823 111.929 -0.588 c
+111.713 -0.345 111.591 -0.014 111.562 0.397 c
+111.54 0.632 111.54 0.86 111.562 1.088 c
+112.164 4.63 l
+113.546 4.63 l
+112.958 1.073 l
+112.944 0.823 l
+112.933 0.655 112.958 0.518 113.018 0.412 c
+113.076 0.312 113.168 0.258 113.297 0.25 c
+113.569 0.239 113.826 0.383 114.061 0.676 c
+114.751 4.63 l
+116.148 4.63 l
+115.208 -0.837 l
+113.899 -0.837 l
+h
+118.897 5.968 m
+118.662 4.63 l
+119.368 4.63 l
+119.191 3.558 l
+118.485 3.558 l
+118.015 0.794 l
+118.001 0.632 l
+117.989 0.405 118.082 0.294 118.279 0.294 c
+118.338 0.283 118.456 0.287 118.632 0.31 c
+118.5 -0.808 l
+118.294 -0.897 118.048 -0.941 117.766 -0.941 c
+117.361 -0.929 117.06 -0.786 116.854 -0.5 c
+116.648 -0.205 116.567 0.184 116.619 0.676 c
+117.089 3.558 l
+116.472 3.558 l
+116.648 4.63 l
+117.265 4.63 l
+117.5 5.968 l
+h
+121.396 -0.941 m
+120.955 -0.941 120.576 -0.833 120.264 -0.617 c
+119.959 -0.404 119.738 -0.103 119.603 0.279 c
+119.463 0.662 119.418 1.095 119.47 1.588 c
+119.514 1.956 l
+119.632 2.866 119.904 3.562 120.337 4.042 c
+120.779 4.52 121.34 4.752 122.028 4.734 c
+122.528 4.711 122.917 4.557 123.204 4.263 c
+123.487 3.969 123.652 3.55 123.703 3.014 c
+123.722 2.691 123.711 2.374 123.674 2.073 c
+123.586 1.411 l
+120.852 1.411 l
+120.829 1.272 120.826 1.135 120.837 1 c
+120.866 0.507 121.105 0.258 121.558 0.25 c
+121.976 0.239 122.385 0.401 122.778 0.736 c
+123.248 -0.132 l
+123.061 -0.389 122.799 -0.588 122.469 -0.735 c
+122.134 -0.881 121.778 -0.947 121.396 -0.941 c
+121.895 3.558 m
+121.492 3.564 121.212 3.308 121.058 2.779 c
+120.955 2.411 l
+122.337 2.411 l
+122.373 2.606 122.395 2.764 122.395 2.881 c
+122.402 3.311 122.237 3.535 121.895 3.558 c
+135.212 4.146 m
+135.565 4.546 135.948 4.74 136.359 4.734 c
+136.76 4.723 137.065 4.572 137.271 4.278 c
+137.484 3.992 137.594 3.595 137.594 3.088 c
+137.579 2.602 l
+136.991 -0.837 l
+135.595 -0.837 l
+136.168 2.617 l
+136.197 2.911 l
+136.205 3.323 136.058 3.528 135.757 3.528 c
+135.529 3.535 135.316 3.418 135.11 3.175 c
+134.404 -0.837 l
+133.008 -0.837 l
+134.36 6.924 l
+135.757 6.924 l
+h
+140.696 5.968 m
+140.461 4.63 l
+141.166 4.63 l
+140.99 3.558 l
+140.284 3.558 l
+139.814 0.794 l
+139.799 0.632 l
+139.788 0.405 139.879 0.294 140.078 0.294 c
+140.137 0.283 140.255 0.287 140.431 0.31 c
+140.299 -0.808 l
+140.093 -0.897 139.847 -0.941 139.563 -0.941 c
+139.16 -0.929 138.858 -0.786 138.653 -0.5 c
+138.447 -0.205 138.366 0.184 138.418 0.676 c
+138.888 3.558 l
+138.27 3.558 l
+138.447 4.63 l
+139.064 4.63 l
+139.299 5.968 l
+h
+143.742 5.968 m
+143.507 4.63 l
+144.213 4.63 l
+144.036 3.558 l
+143.33 3.558 l
+142.86 0.794 l
+142.846 0.632 l
+142.834 0.405 142.927 0.294 143.125 0.294 c
+143.183 0.283 143.301 0.287 143.478 0.31 c
+143.345 -0.808 l
+143.139 -0.897 142.894 -0.941 142.61 -0.941 c
+142.206 -0.929 141.905 -0.786 141.699 -0.5 c
+141.493 -0.205 141.412 0.184 141.464 0.676 c
+141.934 3.558 l
+141.317 3.558 l
+141.493 4.63 l
+142.111 4.63 l
+142.346 5.968 l
+h
+146.491 -0.941 m
+146.069 -0.929 145.734 -0.746 145.491 -0.382 c
+145.007 -2.94 l
+143.625 -2.94 l
+144.933 4.63 l
+146.212 4.63 l
+146.123 4.131 l
+146.454 4.543 146.836 4.74 147.27 4.734 c
+147.748 4.723 148.107 4.543 148.342 4.19 c
+148.578 3.837 148.681 3.326 148.652 2.661 c
+148.629 1.867 148.534 1.195 148.357 0.647 c
+148.182 0.107 147.931 -0.301 147.608 -0.573 c
+147.292 -0.837 146.921 -0.959 146.491 -0.941 c
+147.27 2.675 m
+147.27 2.988 147.226 3.209 147.137 3.337 c
+147.056 3.462 146.931 3.532 146.755 3.543 c
+146.509 3.543 146.285 3.418 146.079 3.175 c
+145.624 0.588 l
+145.73 0.372 145.921 0.258 146.197 0.25 c
+146.704 0.221 147.023 0.622 147.152 1.455 c
+147.255 2.484 l
+h
+151.499 0.662 m
+151.536 0.897 151.356 1.106 150.956 1.294 c
+150.551 1.478 150.25 1.65 150.044 1.808 c
+149.846 1.974 149.699 2.153 149.603 2.352 c
+149.515 2.558 149.475 2.786 149.485 3.043 c
+149.515 3.532 149.721 3.94 150.103 4.263 c
+150.485 4.586 150.948 4.74 151.499 4.734 c
+152.047 4.723 152.477 4.561 152.793 4.248 c
+153.105 3.932 153.256 3.521 153.248 3.014 c
+151.852 3.014 l
+151.86 3.249 151.831 3.414 151.764 3.514 c
+151.694 3.62 151.58 3.675 151.426 3.675 c
+151.257 3.675 151.118 3.616 151 3.499 c
+150.89 3.389 150.827 3.256 150.809 3.102 c
+150.757 2.885 150.927 2.691 151.309 2.514 c
+151.698 2.345 151.977 2.205 152.146 2.088 c
+152.646 1.754 152.874 1.297 152.837 0.721 c
+152.815 0.387 152.712 0.092 152.529 -0.161 c
+152.34 -0.419 152.087 -0.613 151.764 -0.749 c
+151.448 -0.885 151.106 -0.947 150.735 -0.941 c
+150.195 -0.929 149.757 -0.76 149.427 -0.426 c
+149.092 -0.084 148.928 0.346 148.928 0.867 c
+150.264 0.853 l
+150.254 0.588 150.294 0.397 150.382 0.279 c
+150.478 0.169 150.625 0.118 150.823 0.118 c
+151 0.118 151.147 0.162 151.264 0.25 c
+151.389 0.346 151.47 0.485 151.499 0.662 c
+153.595 -0.147 m
+153.595 0.096 153.668 0.294 153.815 0.441 c
+153.969 0.595 154.167 0.676 154.403 0.676 c
+154.638 0.676 154.829 0.603 154.976 0.456 c
+155.13 0.316 155.211 0.14 155.211 -0.073 c
+155.211 -0.319 155.126 -0.521 154.961 -0.675 c
+154.803 -0.823 154.612 -0.897 154.388 -0.897 c
+154.152 -0.897 153.961 -0.83 153.815 -0.691 c
+153.668 -0.544 153.595 -0.363 153.595 -0.147 c
+154.535 3.616 m
+154.535 3.859 154.609 4.057 154.755 4.204 c
+154.91 4.358 155.108 4.439 155.343 4.439 c
+155.579 4.439 155.77 4.366 155.916 4.219 c
+156.071 4.079 156.151 3.903 156.151 3.69 c
+156.151 3.444 156.067 3.242 155.902 3.088 c
+155.744 2.94 155.553 2.866 155.328 2.866 c
+155.093 2.866 154.902 2.933 154.755 3.072 c
+154.609 3.219 154.535 3.4 154.535 3.616 c
+156.5 -1.469 m
+155.442 -1.469 l
+158.97 6.527 l
+160.028 6.527 l
+h
+158.566 -1.469 m
+157.508 -1.469 l
+161.036 6.527 l
+162.094 6.527 l
+h
+164.02 -0.837 m
+163.997 -0.72 163.99 -0.58 163.99 -0.411 c
+163.674 -0.764 163.317 -0.941 162.917 -0.941 c
+162.494 -0.941 162.156 -0.789 161.903 -0.484 c
+161.657 -0.183 161.543 0.195 161.564 0.647 c
+161.594 1.235 161.818 1.691 162.241 2.014 c
+162.659 2.345 163.226 2.514 163.931 2.514 c
+164.342 2.514 l
+164.402 2.955 l
+164.416 3.175 l
+164.416 3.469 164.298 3.616 164.063 3.616 c
+163.74 3.624 163.542 3.418 163.475 2.999 c
+162.079 2.984 l
+162.108 3.502 162.322 3.925 162.726 4.248 c
+163.126 4.58 163.615 4.74 164.196 4.734 c
+164.732 4.723 165.144 4.549 165.431 4.219 c
+165.724 3.896 165.846 3.462 165.798 2.926 c
+165.342 0.148 l
+165.327 -0.132 l
+165.316 -0.367 165.342 -0.573 165.401 -0.749 c
+165.387 -0.837 l
+h
+163.314 0.177 m
+163.556 0.166 163.785 0.272 163.99 0.5 c
+164.24 1.646 l
+163.931 1.646 l
+163.667 1.636 163.45 1.548 163.284 1.382 c
+163.116 1.213 163.02 1.004 162.991 0.75 c
+162.991 0.559 l
+162.991 0.449 163.012 0.357 163.064 0.279 c
+163.122 0.21 163.203 0.177 163.314 0.177 c
+168.58 -0.941 m
+168.117 -0.918 167.771 -0.706 167.536 -0.294 c
+167.359 -0.837 l
+166.052 -0.837 l
+167.404 6.924 l
+168.801 6.924 l
+168.271 4.175 l
+168.583 4.557 168.94 4.74 169.344 4.734 c
+169.822 4.723 170.182 4.543 170.417 4.19 c
+170.652 3.844 170.755 3.341 170.725 2.675 c
+170.704 1.9 170.608 1.228 170.432 0.662 c
+170.263 0.092 170.024 -0.323 169.711 -0.588 c
+169.395 -0.841 169.021 -0.959 168.58 -0.941 c
+169.358 2.661 m
+169.366 2.974 169.329 3.194 169.241 3.323 c
+169.16 3.458 169.028 3.528 168.844 3.528 c
+168.587 3.535 168.352 3.404 168.138 3.132 c
+167.712 0.618 l
+167.808 0.383 167.999 0.254 168.286 0.235 c
+168.803 0.206 169.113 0.578 169.212 1.353 c
+169.256 1.721 l
+h
+173.823 4.734 m
+174.382 4.711 174.812 4.52 175.117 4.16 c
+175.429 3.807 175.602 3.326 175.631 2.72 c
+175.631 2.367 l
+175.581 1.309 175.327 0.485 174.867 -0.103 c
+174.405 -0.683 173.802 -0.959 173.059 -0.941 c
+172.626 -0.929 172.269 -0.816 171.986 -0.588 c
+171.7 -0.363 171.494 -0.055 171.369 0.339 c
+171.251 0.739 171.215 1.199 171.266 1.721 c
+171.295 1.985 l
+171.39 2.845 171.666 3.521 172.119 4.013 c
+172.566 4.513 173.136 4.752 173.823 4.734 c
+172.647 1.147 m
+172.647 0.559 172.824 0.254 173.177 0.235 c
+173.665 0.206 173.985 0.578 174.133 1.353 c
+174.176 1.721 l
+174.224 2.198 174.25 2.506 174.25 2.646 c
+174.25 3.223 174.066 3.528 173.706 3.558 c
+173.43 3.564 173.206 3.44 173.03 3.175 c
+172.861 2.918 172.755 2.547 172.707 2.058 c
+172.666 1.565 172.647 1.264 172.647 1.147 c
+178.615 -0.338 m
+178.27 -0.749 177.869 -0.947 177.41 -0.941 c
+177.046 -0.941 176.756 -0.823 176.543 -0.588 c
+176.327 -0.345 176.205 -0.014 176.175 0.397 c
+176.153 0.632 176.153 0.86 176.175 1.088 c
+176.778 4.63 l
+178.16 4.63 l
+177.572 1.073 l
+177.557 0.823 l
+177.546 0.655 177.572 0.518 177.63 0.412 c
+177.69 0.312 177.781 0.258 177.91 0.25 c
+178.182 0.239 178.439 0.383 178.675 0.676 c
+179.365 4.63 l
+180.761 4.63 l
+179.82 -0.837 l
+178.513 -0.837 l
+h
+183.514 5.968 m
+183.279 4.63 l
+183.984 4.63 l
+183.808 3.558 l
+183.103 3.558 l
+182.632 0.794 l
+182.617 0.632 l
+182.606 0.405 182.698 0.294 182.897 0.294 c
+182.955 0.283 183.073 0.287 183.249 0.31 c
+183.117 -0.808 l
+182.912 -0.897 182.665 -0.941 182.382 -0.941 c
+181.978 -0.929 181.677 -0.786 181.47 -0.5 c
+181.265 -0.205 181.185 0.184 181.235 0.676 c
+181.706 3.558 l
+181.089 3.558 l
+181.265 4.63 l
+181.883 4.63 l
+182.118 5.968 l
+h
+183.999 -0.147 m
+183.999 0.096 184.073 0.294 184.219 0.441 c
+184.374 0.595 184.572 0.676 184.807 0.676 c
+185.042 0.676 185.233 0.603 185.381 0.456 c
+185.535 0.316 185.616 0.14 185.616 -0.073 c
+185.616 -0.319 185.532 -0.521 185.366 -0.675 c
+185.208 -0.823 185.017 -0.897 184.793 -0.897 c
+184.558 -0.897 184.366 -0.83 184.219 -0.691 c
+184.073 -0.544 183.999 -0.363 183.999 -0.147 c
+189.137 4.734 m
+189.614 4.711 189.967 4.513 190.195 4.131 c
+190.371 4.63 l
+191.635 4.63 l
+190.71 -0.837 l
+190.61 -1.55 190.334 -2.094 189.886 -2.469 c
+189.445 -2.84 188.886 -3.017 188.21 -2.998 c
+187.916 -2.987 187.622 -2.925 187.328 -2.807 c
+187.034 -2.697 186.792 -2.543 186.608 -2.337 c
+187.167 -1.352 l
+187.45 -1.675 187.803 -1.841 188.225 -1.851 c
+188.82 -1.881 189.187 -1.547 189.328 -0.852 c
+189.43 -0.396 l
+189.107 -0.76 188.743 -0.941 188.343 -0.941 c
+187.872 -0.941 187.512 -0.76 187.269 -0.396 c
+187.024 -0.037 186.906 0.47 186.916 1.118 c
+186.916 1.507 186.953 1.929 187.034 2.382 c
+187.111 2.841 187.226 3.227 187.373 3.543 c
+187.755 4.355 188.343 4.752 189.137 4.734 c
+188.284 1.133 m
+188.284 0.551 188.468 0.258 188.842 0.25 c
+189.085 0.25 189.316 0.357 189.534 0.574 c
+190.004 3.19 l
+189.875 3.414 189.688 3.532 189.445 3.543 c
+188.857 3.572 188.497 3.091 188.372 2.103 c
+188.313 1.632 188.284 1.309 188.284 1.133 c
+193.054 -0.837 m
+191.657 -0.837 l
+192.598 4.63 l
+194.009 4.63 l
+h
+192.789 6.012 m
+192.789 6.247 192.863 6.438 193.01 6.585 c
+193.156 6.733 193.333 6.806 193.538 6.806 c
+193.752 6.814 193.935 6.747 194.083 6.6 c
+194.23 6.461 194.303 6.284 194.303 6.072 c
+194.303 5.836 194.23 5.644 194.083 5.498 c
+193.935 5.351 193.752 5.278 193.538 5.278 c
+193.322 5.266 193.142 5.328 192.995 5.469 c
+192.855 5.615 192.789 5.796 192.789 6.012 c
+196.909 5.968 m
+196.674 4.63 l
+197.379 4.63 l
+197.202 3.558 l
+196.497 3.558 l
+196.027 0.794 l
+196.012 0.632 l
+196.001 0.405 196.092 0.294 196.291 0.294 c
+196.35 0.283 196.468 0.287 196.644 0.31 c
+196.512 -0.808 l
+196.306 -0.897 196.059 -0.941 195.776 -0.941 c
+195.373 -0.929 195.071 -0.786 194.866 -0.5 c
+194.66 -0.205 194.579 0.184 194.631 0.676 c
+195.101 3.558 l
+194.483 3.558 l
+194.66 4.63 l
+195.277 4.63 l
+195.512 5.968 l
+h
+198.614 -0.837 m
+197.218 -0.837 l
+198.555 6.924 l
+199.966 6.924 l
+h
+202.259 -0.837 m
+202.237 -0.72 202.23 -0.58 202.23 -0.411 c
+201.914 -0.764 201.557 -0.941 201.156 -0.941 c
+200.734 -0.941 200.396 -0.789 200.142 -0.484 c
+199.896 -0.183 199.782 0.195 199.805 0.647 c
+199.834 1.235 200.058 1.691 200.48 2.014 c
+200.9 2.345 201.465 2.514 202.171 2.514 c
+202.583 2.514 l
+202.641 2.955 l
+202.656 3.175 l
+202.656 3.469 202.538 3.616 202.303 3.616 c
+201.98 3.624 201.781 3.418 201.715 2.999 c
+200.318 2.984 l
+200.348 3.502 200.561 3.925 200.965 4.248 c
+201.366 4.58 201.854 4.74 202.435 4.734 c
+202.972 4.723 203.383 4.549 203.67 4.219 c
+203.965 3.896 204.085 3.462 204.038 2.926 c
+203.582 0.148 l
+203.568 -0.132 l
+203.556 -0.367 203.582 -0.573 203.641 -0.749 c
+203.626 -0.837 l
+h
+201.553 0.177 m
+201.796 0.166 202.024 0.272 202.23 0.5 c
+202.479 1.646 l
+202.171 1.646 l
+201.906 1.636 201.69 1.548 201.524 1.382 c
+201.355 1.213 201.259 1.004 201.23 0.75 c
+201.23 0.559 l
+201.23 0.449 201.252 0.357 201.303 0.279 c
+201.362 0.21 201.443 0.177 201.553 0.177 c
+206.82 -0.941 m
+206.356 -0.918 206.011 -0.706 205.775 -0.294 c
+205.6 -0.837 l
+204.291 -0.837 l
+205.644 6.924 l
+207.04 6.924 l
+206.511 4.175 l
+206.823 4.557 207.179 4.74 207.584 4.734 c
+208.061 4.723 208.422 4.543 208.657 4.19 c
+208.892 3.844 208.995 3.341 208.965 2.675 c
+208.943 1.9 208.848 1.228 208.671 0.662 c
+208.503 0.092 208.264 -0.323 207.951 -0.588 c
+207.635 -0.841 207.26 -0.959 206.82 -0.941 c
+207.599 2.661 m
+207.606 2.974 207.569 3.194 207.481 3.323 c
+207.4 3.458 207.267 3.528 207.084 3.528 c
+206.826 3.535 206.591 3.404 206.378 3.132 c
+205.952 0.618 l
+206.047 0.383 206.238 0.254 206.525 0.235 c
+207.044 0.206 207.352 0.578 207.452 1.353 c
+207.495 1.721 l
+h
+209.432 -0.147 m
+209.432 0.096 209.505 0.294 209.652 0.441 c
+209.807 0.595 210.005 0.676 210.24 0.676 c
+210.475 0.676 210.666 0.603 210.814 0.456 c
+210.968 0.316 211.049 0.14 211.049 -0.073 c
+211.049 -0.319 210.965 -0.521 210.799 -0.675 c
+210.641 -0.823 210.45 -0.897 210.226 -0.897 c
+209.991 -0.897 209.8 -0.83 209.652 -0.691 c
+209.505 -0.544 209.432 -0.363 209.432 -0.147 c
+214.217 0.235 m
+214.599 0.225 214.838 0.5 214.937 1.058 c
+216.245 1.058 l
+216.187 0.449 215.959 -0.04 215.569 -0.411 c
+215.175 -0.786 214.702 -0.959 214.143 -0.941 c
+213.632 -0.929 213.224 -0.779 212.923 -0.484 c
+212.618 -0.191 212.438 0.214 212.379 0.736 c
+212.328 1.154 212.353 1.665 212.453 2.264 c
+212.548 2.87 212.736 3.373 213.012 3.778 c
+213.452 4.432 214.077 4.752 214.893 4.734 c
+215.441 4.711 215.863 4.513 216.157 4.131 c
+216.451 3.749 216.584 3.234 216.553 2.587 c
+215.231 2.587 l
+215.231 2.897 l
+215.22 3.315 215.058 3.535 214.745 3.558 c
+214.246 3.576 213.952 3.19 213.864 2.396 c
+213.761 1.485 l
+213.721 1.21 213.706 0.985 213.717 0.809 c
+213.746 0.434 213.912 0.243 214.217 0.235 c
+219.49 4.734 m
+220.048 4.711 220.478 4.52 220.783 4.16 c
+221.095 3.807 221.268 3.326 221.298 2.72 c
+221.298 2.367 l
+221.247 1.309 220.993 0.485 220.534 -0.103 c
+220.071 -0.683 219.468 -0.959 218.726 -0.941 c
+218.292 -0.929 217.935 -0.816 217.652 -0.588 c
+217.366 -0.363 217.16 -0.055 217.035 0.339 c
+216.918 0.739 216.881 1.199 216.933 1.721 c
+216.962 1.985 l
+217.057 2.845 217.332 3.521 217.785 4.013 c
+218.233 4.513 218.803 4.752 219.49 4.734 c
+218.314 1.147 m
+218.314 0.559 218.49 0.254 218.843 0.235 c
+219.331 0.206 219.651 0.578 219.799 1.353 c
+219.842 1.721 l
+219.89 2.198 219.917 2.506 219.917 2.646 c
+219.917 3.223 219.732 3.528 219.372 3.558 c
+219.096 3.564 218.872 3.44 218.696 3.175 c
+218.527 2.918 218.421 2.547 218.373 2.058 c
+218.332 1.565 218.314 1.264 218.314 1.147 c
+223.767 4.63 m
+223.68 4.116 l
+224.062 4.535 224.491 4.74 224.973 4.734 c
+225.491 4.711 225.829 4.469 225.987 3.998 c
+226.398 4.499 226.857 4.74 227.368 4.734 c
+227.758 4.723 228.052 4.576 228.251 4.293 c
+228.457 4.017 228.559 3.62 228.559 3.102 c
+228.53 2.646 l
+227.956 -0.837 l
+226.56 -0.837 l
+227.133 2.646 l
+227.163 2.926 l
+227.192 3.337 227.052 3.543 226.751 3.543 c
+226.516 3.543 226.3 3.373 226.105 3.043 c
+226.075 2.808 l
+225.443 -0.837 l
+224.046 -0.837 l
+224.62 2.646 l
+224.649 2.926 l
+224.679 3.337 224.546 3.543 224.252 3.543 c
+224.106 3.543 223.981 3.502 223.885 3.425 c
+223.786 3.344 223.697 3.252 223.62 3.146 c
+222.93 -0.837 l
+221.533 -0.837 l
+222.474 4.63 l
+h
+229.232 -1.469 m
+228.174 -1.469 l
+231.701 6.527 l
+232.76 6.527 l
+h
+f
+Q
+q
+457.854 554.164 m
+456.424 554.164 455.223 553.183 454.899 551.849 c
+408.477 551.849 l
+408.315 551.849 408.182 551.651 408.197 551.489 c
+408.211 551.327 408.373 551.191 408.535 551.191 c
+454.8 551.191 l
+454.8 551.129 l
+454.8 549.449 456.175 548.093 457.854 548.093 c
+459.489 548.093 460.798 549.376 460.871 550.989 c
+467.03 550.126 470.499 546.631 474.067 543.063 c
+477.584 539.549 481.196 535.97 487.366 534.997 c
+487.535 533.475 488.796 532.299 490.361 532.299 c
+491.838 532.299 493.062 533.339 493.338 534.735 c
+505.038 534.735 l
+505.313 533.339 506.537 532.299 508.014 532.299 c
+509.492 532.299 510.711 533.339 510.987 534.735 c
+523.687 534.735 l
+532.026 534.735 536.266 538.947 540.381 543.063 c
+544.067 546.748 547.654 550.338 554.199 551.051 c
+554.239 549.405 555.599 548.093 557.253 548.093 c
+558.936 548.093 560.288 549.449 560.288 551.129 c
+560.288 551.191 l
+586.724 551.191 l
+586.724 551.129 l
+586.724 549.449 588.081 548.093 589.76 548.093 c
+591.399 548.093 592.733 549.386 592.795 551.011 c
+599.329 550.305 604.44 547.512 608.828 543.562 c
+613.928 538.972 618.052 532.821 622.167 526.651 c
+626.283 520.477 630.399 514.285 635.588 509.618 c
+639.369 506.212 643.723 503.643 649.023 502.49 c
+625.261 502.49 l
+624.986 503.886 623.766 504.944 622.289 504.944 c
+620.812 504.944 619.569 503.886 619.293 502.49 c
+592.754 502.49 l
+592.479 503.886 591.237 504.944 589.76 504.944 c
+588.341 504.944 587.161 503.963 586.824 502.648 c
+580.466 503.434 576.916 506.983 573.286 510.615 c
+569.655 514.249 565.914 517.964 559.351 518.783 c
+559.263 520.385 557.94 521.657 556.316 521.657 c
+554.746 521.657 553.486 520.466 553.32 518.941 c
+543.535 518.941 l
+543.369 520.466 542.091 521.657 540.522 521.657 c
+538.952 521.657 537.692 520.466 537.526 518.941 c
+529.001 518.941 l
+534.035 520.283 537.247 523.477 540.381 526.611 c
+543.913 530.142 547.36 533.607 553.397 534.515 c
+553.758 533.237 554.92 532.299 556.316 532.299 c
+557.8 532.299 559.042 533.35 559.311 534.758 c
+586.787 534.758 l
+587.055 533.35 588.275 532.299 589.76 532.299 c
+591.443 532.299 592.817 533.655 592.817 535.334 c
+592.817 537.017 591.443 538.37 589.76 538.37 c
+588.098 538.37 586.757 537.047 586.724 535.397 c
+559.369 535.397 l
+559.336 537.047 557.977 538.37 556.316 538.37 c
+554.633 538.37 553.28 537.017 553.28 535.334 c
+553.28 535.275 553.295 535.217 553.299 535.155 c
+547.07 534.207 543.436 530.602 539.901 527.07 c
+535.917 523.083 532.066 519.18 524.448 518.941 c
+510.09 518.941 l
+510.069 519.136 510.028 519.32 509.969 519.5 c
+509.918 519.673 509.852 519.841 509.771 520 c
+509.683 520.169 509.587 520.331 509.47 520.481 c
+509.381 520.599 509.279 520.694 509.172 520.801 c
+509.146 520.823 509.136 520.856 509.113 520.878 c
+509.076 520.911 509.028 520.929 508.992 520.959 c
+508.889 521.044 508.787 521.127 508.672 521.198 c
+508.521 521.293 508.359 521.374 508.195 521.437 c
+507.849 521.572 507.467 521.657 507.073 521.657 c
+506.867 521.657 506.67 521.635 506.474 521.598 c
+506.273 521.557 506.082 521.495 505.898 521.418 c
+505.729 521.345 505.549 521.26 505.398 521.158 c
+505.391 521.154 505.383 521.143 505.376 521.139 c
+505.215 521.029 505.078 520.896 504.939 520.761 c
+504.814 520.635 504.7 520.503 504.6 520.36 c
+504.531 520.264 504.476 520.165 504.421 520.059 c
+504.384 519.992 504.332 519.93 504.299 519.86 c
+504.292 519.841 504.288 519.82 504.28 519.801 c
+504.203 519.625 504.16 519.452 504.12 519.261 c
+504.101 519.18 504.089 519.103 504.079 519.022 c
+504.068 518.923 504.042 518.824 504.039 518.721 c
+497.747 517.798 494.094 514.168 490.541 510.615 c
+490.008 510.081 489.483 509.56 488.946 509.038 c
+486.308 511.853 484.577 515.282 482.835 518.761 c
+480.777 522.877 478.69 527.044 475.026 530.182 c
+471.811 532.938 467.387 534.864 460.75 535.294 c
+460.368 536.54 459.225 537.451 457.854 537.451 c
+456.524 537.451 455.392 536.588 454.98 535.397 c
+375.929 535.397 l
+375.9 535.4 375.859 535.4 375.83 535.397 c
+375.657 535.371 375.524 535.188 375.551 535.015 c
+375.572 534.845 375.756 534.714 375.929 534.735 c
+454.841 534.735 l
+454.83 534.629 454.8 534.53 454.8 534.415 c
+454.8 532.736 456.175 531.362 457.854 531.362 c
+459.537 531.362 460.889 532.736 460.889 534.415 c
+460.889 534.493 460.875 534.563 460.871 534.636 c
+467.294 534.188 471.531 532.303 474.608 529.665 c
+478.146 526.633 480.178 522.579 482.236 518.463 c
+483.975 514.984 485.735 511.46 488.446 508.56 c
+485.543 505.815 482.354 503.452 477.484 502.728 c
+477.117 503.999 475.956 504.944 474.567 504.944 c
+473.089 504.944 471.869 503.886 471.594 502.49 c
+460.831 502.49 l
+460.555 503.886 459.331 504.944 457.854 504.944 c
+456.377 504.944 455.134 503.886 454.859 502.49 c
+375.551 502.49 l
+326.151 502.49 l
+325.974 502.482 325.823 502.306 325.831 502.129 c
+325.838 501.953 325.996 501.802 326.168 501.809 c
+454.8 501.809 l
+454.845 500.167 456.2 498.855 457.854 498.855 c
+459.508 498.855 460.848 500.167 460.889 501.809 c
+471.531 501.809 l
+471.576 500.167 472.913 498.855 474.567 498.855 c
+476.22 498.855 477.562 500.167 477.602 501.809 c
+504.039 501.809 l
+504.083 500.167 505.42 498.855 507.073 498.855 c
+508.727 498.855 510.087 500.167 510.131 501.809 c
+518.377 501.809 l
+513.343 500.465 510.127 497.275 506.996 494.144 c
+503.495 490.642 500.062 487.218 494.117 486.277 c
+493.672 487.409 492.569 488.213 491.279 488.213 c
+489.898 488.213 488.755 487.28 488.384 486.015 c
+460.75 486.015 l
+460.378 487.28 459.24 488.213 457.854 488.213 c
+456.472 488.213 455.311 487.28 454.94 486.015 c
+392.002 486.015 l
+391.819 486.038 391.642 485.884 391.642 485.695 c
+391.642 485.508 391.819 485.354 392.002 485.377 c
+454.818 485.377 l
+454.815 485.306 454.8 485.248 454.8 485.178 c
+454.8 483.495 456.175 482.121 457.854 482.121 c
+459.537 482.121 460.889 483.495 460.889 485.178 c
+460.889 485.248 460.875 485.306 460.871 485.377 c
+488.266 485.377 l
+488.262 485.306 488.245 485.248 488.245 485.178 c
+488.245 483.495 489.6 482.121 491.279 482.121 c
+492.962 482.121 494.337 483.495 494.337 485.178 c
+494.337 485.346 494.323 485.497 494.296 485.655 c
+500.382 486.655 503.968 490.198 507.455 493.685 c
+511.046 497.275 514.555 500.795 520.791 501.63 c
+520.924 500.072 522.214 498.855 523.808 498.855 c
+525.462 498.855 526.8 500.167 526.844 501.809 c
+537.486 501.809 l
+537.526 500.167 538.868 498.855 540.522 498.855 c
+542.175 498.855 543.535 500.167 543.575 501.809 c
+556.595 501.809 l
+564.713 501.809 568.715 497.797 572.826 493.685 c
+576.461 490.05 580.202 486.35 586.764 485.537 c
+586.75 485.413 586.724 485.302 586.724 485.178 c
+586.724 483.495 588.081 482.121 589.76 482.121 c
+591.443 482.121 592.817 483.495 592.817 485.178 c
+592.817 485.248 592.798 485.306 592.795 485.377 c
+603.459 485.377 l
+603.451 485.306 603.437 485.248 603.437 485.178 c
+603.437 483.495 604.812 482.121 606.495 482.121 c
+608.174 482.121 609.529 483.495 609.529 485.178 c
+609.529 485.248 609.512 485.306 609.508 485.377 c
+635.984 485.377 l
+635.981 485.306 635.966 485.248 635.966 485.178 c
+635.966 483.495 637.318 482.121 639.002 482.121 c
+640.681 482.121 642.037 483.495 642.037 485.178 c
+642.037 485.317 642.015 485.442 641.996 485.578 c
+648.35 486.474 652.021 490.113 655.593 493.685 c
+659.106 497.198 662.534 500.619 668.514 501.549 c
+668.682 500.031 669.943 498.855 671.508 498.855 c
+673.162 498.855 674.518 500.167 674.562 501.809 c
+704.732 501.809 l
+712.853 501.809 716.833 497.797 720.949 493.685 c
+724.502 490.127 728.159 486.512 734.464 485.597 c
+734.446 485.454 734.424 485.325 734.424 485.178 c
+734.424 483.495 735.798 482.121 737.481 482.121 c
+739.161 482.121 740.517 483.495 740.517 485.178 c
+740.517 485.248 740.498 485.306 740.494 485.377 c
+751.177 485.377 l
+751.174 485.306 751.159 485.248 751.159 485.178 c
+751.159 483.495 752.511 482.121 754.194 482.121 c
+755.874 482.121 757.248 483.495 757.248 485.178 c
+757.248 486.857 755.874 488.213 754.194 488.213 c
+752.809 488.213 751.666 487.28 751.299 486.015 c
+740.373 486.015 l
+740.006 487.28 738.863 488.213 737.481 488.213 c
+736.17 488.213 735.052 487.378 734.626 486.214 c
+728.471 487.077 724.995 490.572 721.427 494.144 c
+718.292 497.275 715.08 500.465 710.046 501.809 c
+734.424 501.809 l
+734.468 500.167 735.827 498.855 737.481 498.855 c
+739.161 498.855 740.517 500.207 740.517 501.89 c
+740.517 503.569 739.161 504.944 737.481 504.944 c
+736.004 504.944 734.762 503.886 734.487 502.49 c
+693.571 502.49 l
+698.606 503.835 701.818 507.002 704.952 510.137 c
+708.443 513.628 711.865 517.042 717.774 518.004 c
+718.057 516.616 719.277 515.568 720.746 515.568 c
+722.312 515.568 723.59 516.762 723.763 518.284 c
+734.464 518.284 l
+734.634 516.762 735.916 515.568 737.481 515.568 c
+739.161 515.568 740.517 516.942 740.517 518.621 c
+740.517 520.304 739.161 521.657 737.481 521.657 c
+735.912 521.657 734.63 520.466 734.464 518.941 c
+723.763 518.941 l
+723.598 520.466 722.316 521.657 720.746 521.657 c
+719.081 521.657 717.733 520.323 717.711 518.662 c
+711.593 517.67 707.991 514.112 704.493 510.615 c
+700.378 506.503 696.379 502.49 688.262 502.49 c
+674.504 502.49 l
+674.228 503.886 672.985 504.944 671.508 504.944 c
+670.031 504.944 668.807 503.886 668.532 502.49 c
+658.709 502.49 l
+658.698 502.545 658.683 502.596 658.669 502.648 c
+658.632 502.794 658.584 502.931 658.529 503.066 c
+658.47 503.206 658.404 503.342 658.327 503.467 c
+658.29 503.529 658.249 503.588 658.209 503.647 c
+658.11 503.791 657.993 503.922 657.871 504.047 c
+657.75 504.169 657.628 504.286 657.489 504.386 c
+657.47 504.4 657.449 504.411 657.43 504.427 c
+657.42 504.433 657.401 504.437 657.39 504.444 c
+657.235 504.547 657.081 504.632 656.913 504.705 c
+656.549 504.859 656.152 504.944 655.733 504.944 c
+655.516 504.944 655.317 504.907 655.115 504.863 c
+654.957 504.83 654.799 504.801 654.656 504.745 c
+654.549 504.705 654.453 504.654 654.355 504.606 c
+654.292 504.573 654.233 504.54 654.174 504.506 c
+654.087 504.452 653.998 504.408 653.917 504.346 c
+653.825 504.279 653.74 504.184 653.657 504.107 c
+653.627 504.077 653.586 504.059 653.557 504.026 c
+653.422 503.889 653.304 503.746 653.197 503.588 c
+653.094 503.43 652.992 503.261 652.917 503.089 c
+652.914 503.081 652.921 503.074 652.917 503.066 c
+652.855 502.919 652.797 502.769 652.756 502.607 c
+645.888 503.176 640.57 506.006 636.024 510.096 c
+630.925 514.686 626.819 520.838 622.707 527.007 c
+618.592 533.181 614.476 539.395 609.288 544.062 c
+604.8 548.1 599.491 550.989 592.754 551.687 c
+592.494 553.106 591.252 554.164 589.76 554.164 c
+588.326 554.164 587.15 553.183 586.824 551.849 c
+560.189 551.849 l
+559.865 553.183 558.685 554.164 557.253 554.164 c
+555.776 554.164 554.533 553.124 554.257 551.728 c
+547.434 551.018 543.612 547.23 539.901 543.522 c
+535.789 539.406 531.808 535.397 523.687 535.397 c
+511.05 535.397 l
+511.017 537.047 509.676 538.37 508.014 538.37 c
+506.354 538.37 505.012 537.047 504.979 535.397 c
+493.396 535.397 l
+493.367 537.047 492.022 538.37 490.361 538.37 c
+488.796 538.37 487.535 537.194 487.366 535.676 c
+481.45 536.628 478.021 540.027 474.527 543.522 c
+470.936 547.115 467.261 550.797 460.831 551.669 c
+460.577 553.095 459.354 554.164 457.854 554.164 c
+454.462 523.674 m
+454.462 513.672 l
+457.795 508.66 l
+461.128 513.672 l
+461.128 523.674 l
+h
+668.433 523.674 m
+668.433 513.672 l
+671.766 508.66 l
+675.102 513.672 l
+675.102 523.674 l
+h
+510.09 518.284 m
+537.526 518.284 l
+537.695 516.762 538.956 515.568 540.522 515.568 c
+542.087 515.568 543.365 516.762 543.535 518.284 c
+553.32 518.284 l
+553.49 516.762 554.75 515.568 556.316 515.568 c
+557.826 515.568 559.094 516.678 559.329 518.122 c
+565.664 517.324 569.206 513.76 572.826 510.137 c
+575.961 507.002 579.176 503.835 584.21 502.49 c
+576.023 502.49 l
+575.747 503.886 574.524 504.944 573.047 504.944 c
+571.57 504.944 570.328 503.886 570.052 502.49 c
+543.517 502.49 l
+543.241 503.886 541.998 504.944 540.522 504.944 c
+539.045 504.944 537.821 503.886 537.545 502.49 c
+526.781 502.49 l
+526.505 503.886 525.286 504.944 523.808 504.944 c
+522.331 504.944 521.107 503.886 520.832 502.49 c
+510.069 502.49 l
+509.793 503.886 508.551 504.944 507.073 504.944 c
+505.645 504.944 504.465 503.941 504.141 502.607 c
+497.751 503.059 493.529 504.911 490.464 507.542 c
+490.089 507.862 489.725 508.219 489.384 508.56 c
+489.931 509.086 490.468 509.603 491 510.137 c
+494.547 513.682 498.015 517.166 504.101 518.063 c
+504.13 517.909 504.167 517.751 504.218 517.603 c
+504.23 517.578 504.23 517.549 504.241 517.523 c
+504.292 517.391 504.369 517.269 504.439 517.144 c
+504.454 517.119 504.465 517.093 504.479 517.063 c
+504.534 516.968 504.593 516.876 504.66 516.784 c
+504.744 516.67 504.839 516.568 504.939 516.464 c
+505.045 516.358 505.155 516.259 505.277 516.167 c
+505.336 516.123 505.394 516.086 505.456 516.046 c
+505.541 515.994 505.629 515.951 505.718 515.906 c
+505.809 515.862 505.898 515.803 505.997 515.766 c
+506.148 515.708 506.313 515.66 506.474 515.627 c
+506.673 515.587 506.867 515.568 507.073 515.568 c
+507.467 515.568 507.831 515.652 508.172 515.789 c
+508.349 515.855 508.514 515.932 508.672 516.028 c
+508.787 516.097 508.889 516.182 508.992 516.266 c
+509.028 516.296 509.076 516.314 509.113 516.347 c
+509.153 516.383 509.194 516.428 509.231 516.464 c
+509.452 516.689 509.624 516.946 509.771 517.225 c
+509.852 517.383 509.918 517.553 509.969 517.725 c
+510.025 517.905 510.069 518.093 510.09 518.284 c
+488.906 508.101 m
+489.266 507.737 489.644 507.38 490.041 507.043 c
+492.482 504.951 495.619 503.342 499.886 502.49 c
+479.62 502.49 l
+483.551 503.537 486.367 505.705 488.906 508.101 c
+750.717 505.565 m
+750.717 495.559 l
+754.054 490.569 l
+757.387 495.559 l
+757.387 505.565 l
+h
+561.905 501.809 m
+569.993 501.809 l
+570.033 500.167 571.393 498.855 573.047 498.855 c
+574.7 498.855 576.042 500.167 576.082 501.809 c
+586.724 501.809 l
+586.768 500.167 588.106 498.855 589.76 498.855 c
+591.414 498.855 592.773 500.167 592.817 501.809 c
+619.231 501.809 l
+619.276 500.167 620.635 498.855 622.289 498.855 c
+623.943 498.855 625.28 500.167 625.324 501.809 c
+652.679 501.809 l
+652.679 501.736 652.69 501.663 652.697 501.589 c
+652.712 501.46 652.73 501.335 652.756 501.211 c
+652.797 501.034 652.848 500.872 652.917 500.711 c
+652.955 500.623 653.009 500.538 653.057 500.454 c
+653.197 500.193 653.37 499.939 653.576 499.733 c
+653.612 499.697 653.657 499.667 653.697 499.634 c
+653.946 499.41 654.222 499.226 654.534 499.094 c
+654.542 499.091 654.549 499.097 654.557 499.094 c
+654.733 499.02 654.92 498.954 655.115 498.914 c
+655.119 498.914 655.126 498.918 655.134 498.914 c
+655.325 498.877 655.531 498.855 655.733 498.855 c
+655.942 498.855 656.133 498.873 656.331 498.914 c
+656.633 498.977 656.909 499.094 657.169 499.234 c
+657.258 499.282 657.349 499.318 657.43 499.373 c
+657.581 499.476 657.721 499.586 657.85 499.715 c
+657.867 499.733 l
+657.894 499.756 657.908 499.789 657.93 499.814 c
+658.041 499.932 658.158 500.057 658.249 500.193 c
+658.349 500.34 658.438 500.49 658.507 500.652 c
+658.518 500.67 658.522 500.693 658.529 500.711 c
+658.596 500.872 658.65 501.038 658.687 501.211 c
+658.717 501.335 658.735 501.46 658.75 501.589 c
+658.754 501.663 658.764 501.736 658.768 501.809 c
+666.496 501.809 l
+661.461 500.465 658.247 497.275 655.115 494.144 c
+651.533 490.561 648.049 487.062 641.857 486.214 c
+641.427 487.378 640.313 488.213 639.002 488.213 c
+637.616 488.213 636.473 487.28 636.105 486.015 c
+609.386 486.015 l
+609.019 487.28 607.877 488.213 606.495 488.213 c
+605.109 488.213 603.948 487.28 603.576 486.015 c
+592.673 486.015 l
+592.306 487.28 591.145 488.213 589.76 488.213 c
+588.433 488.213 587.323 487.361 586.905 486.177 c
+580.495 486.942 576.931 490.499 573.286 494.144 c
+570.155 497.275 566.939 500.465 561.905 501.809 c
+540.481 495.761 m
+537.144 490.767 l
+537.144 480.746 l
+543.814 480.746 l
+543.814 490.767 l
+h
+W n
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g
+/GS1 gs
+0 TL/Fm0 Do
+Q
+Q
+q 1 0 0 1 175.2352 546.0975 cm
+0 0 m
+-3.391 0 l
+-3.381 -25.219 l
+10.33 -25.219 l
+10.33 -22.1 l
+0.008 -22.1 l
+h
+f
+Q
+q 1 0 0 1 198.6173 525.3062 cm
+0 0 m
+-0.845 -0.886 -2.271 -1.771 -4.196 -1.771 c
+-6.776 -1.771 -7.816 -0.5 -7.816 1.153 c
+-7.816 3.657 -6.081 4.85 -2.385 4.85 c
+-1.693 4.85 -0.577 4.773 0 4.659 c
+h
+-3.501 15.283 m
+-6.239 15.283 -8.749 14.313 -10.708 12.7 c
+-9.51 10.628 l
+-8.124 11.436 -6.43 12.244 -4.005 12.244 c
+-1.23 12.244 0 10.819 0 8.43 c
+0 7.199 l
+-0.536 7.316 -1.653 7.393 -2.348 7.393 c
+-8.279 7.393 -11.281 5.313 -11.281 0.962 c
+-11.281 -2.926 -8.893 -4.891 -5.273 -4.891 c
+-2.836 -4.891 -0.5 -3.774 0.31 -1.966 c
+0.927 -4.428 l
+3.315 -4.428 l
+3.315 8.47 l
+3.315 12.553 1.544 15.283 -3.501 15.283 c
+f
+Q
+q 1 0 0 1 212.8648 523.4172 cm
+0 0 m
+-1.272 0 -2.389 0.154 -3.233 0.54 c
+-3.233 12.208 l
+-2.08 13.17 -0.654 13.861 1.158 13.861 c
+4.428 13.861 5.7 11.553 5.7 7.817 c
+5.7 2.502 3.66 0 0 0 c
+1.426 17.172 m
+-1.602 17.172 -3.233 15.114 y
+-3.233 18.366 l
+-3.245 22.68 l
+-6.556 22.68 l
+-6.545 -1.922 l
+-4.891 -2.616 -2.616 -3.002 -0.154 -3.002 c
+6.163 -3.002 9.205 1.039 9.205 8.011 c
+9.205 13.516 6.394 17.172 1.426 17.172 c
+f
+Q
+q 1 0 0 1 138.3959 543.3637 cm
+0 0 m
+3.002 0 4.928 -1.003 6.199 -2.003 c
+7.655 0.518 l
+5.67 2.26 3.002 3.194 0.154 3.194 c
+-7.048 3.194 -12.094 -1.194 -12.094 -10.05 c
+-12.094 -19.329 -6.651 -22.948 -0.422 -22.948 c
+2.697 -22.948 5.354 -22.217 7.085 -21.487 c
+7.015 -11.572 l
+7.015 -8.452 l
+-2.227 -8.452 l
+-2.227 -11.572 l
+3.663 -11.572 l
+3.734 -19.098 l
+2.965 -19.484 1.617 -19.792 -0.191 -19.792 c
+-5.199 -19.792 -8.548 -16.643 -8.548 -10.009 c
+-8.548 -3.274 -5.082 0 0 0 c
+f
+Q
+q 1 0 0 1 162.2267 546.0975 cm
+0 0 m
+-3.311 0 l
+-3.3 -4.237 l
+-3.3 -18.866 l
+-3.3 -22.948 -1.529 -25.682 3.516 -25.682 c
+4.215 -25.682 4.895 -25.62 5.556 -25.499 c
+5.556 -22.526 l
+5.078 -22.599 4.567 -22.64 4.016 -22.64 c
+1.246 -22.64 0.011 -21.214 0.011 -18.829 c
+0.011 -8.742 l
+5.556 -8.742 l
+5.556 -5.967 l
+0.011 -5.967 l
+h
+f
+Q
+150.512 540.13 3.314 -19.252 re
+f
+150.512 546.098 3.314 -3.311 re
+f
+0 0.672 0.855 0 k
+q 1 0 0 1 111.978 528.4332 cm
+0 0 m
+-4.278 13.163 l
+-12.755 39.254 l
+-13.193 40.595 -15.092 40.595 -15.53 39.254 c
+-24.008 13.163 l
+-52.159 13.163 l
+-60.641 39.254 l
+-61.075 40.595 -62.975 40.595 -63.411 39.254 c
+-71.889 13.163 l
+-76.167 0 l
+-76.56 -1.201 -76.13 -2.514 -75.109 -3.256 c
+-38.086 -30.152 l
+-1.058 -3.256 l
+-0.037 -2.514 0.389 -1.201 0 0 c
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 73.8922 498.2816 cm
+0 0 m
+14.078 43.314 l
+-14.073 43.314 l
+h
+f
+Q
+0 0.672 0.855 0 k
+q 1 0 0 1 73.8922 498.2816 cm
+0 0 m
+-14.073 43.314 l
+-33.804 43.314 l
+h
+f
+Q
+0 0.43 0.871 0 k
+q 1 0 0 1 40.0886 541.5961 cm
+0 0 m
+-4.278 -13.163 l
+-4.671 -14.364 -4.241 -15.68 -3.219 -16.419 c
+33.804 -43.314 l
+h
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 40.0886 541.5961 cm
+0 0 m
+19.73 0 l
+11.248 26.091 l
+10.815 27.432 8.914 27.432 8.478 26.091 c
+h
+f
+Q
+0 0.672 0.855 0 k
+q 1 0 0 1 73.8922 498.2816 cm
+0 0 m
+14.078 43.314 l
+33.808 43.314 l
+h
+f
+Q
+0 0.43 0.871 0 k
+q 1 0 0 1 107.7005 541.5961 cm
+0 0 m
+4.278 -13.163 l
+4.667 -14.364 4.241 -15.68 3.219 -16.419 c
+-33.808 -43.314 l
+h
+f
+Q
+0.031 0.844 0.875 0.004 k
+q 1 0 0 1 107.7005 541.5961 cm
+0 0 m
+-19.73 0 l
+-11.252 26.091 l
+-10.815 27.432 -8.915 27.432 -8.478 26.091 c
+h
+f
+Q
+0 0 0 0 k
+q 1 0 0 1 142.633 472.606 cm
+0 0 m
+-0.559 -0.706 l
+-2.168 -2.579 -4.513 -3.513 -7.599 -3.513 c
+-10.356 -3.513 -12.517 -2.601 -14.082 -0.779 c
+-15.64 1.044 -16.441 3.62 -16.478 6.953 c
+-16.478 11.936 l
+-16.478 15.501 -15.769 18.172 -14.346 19.947 c
+-12.917 21.718 -10.782 22.608 -7.938 22.608 c
+-5.519 22.608 -3.627 21.931 -2.263 20.579 c
+-0.893 19.227 -0.14 17.301 0 14.803 c
+-3.19 14.803 l
+-3.319 16.378 -3.759 17.613 -4.513 18.506 c
+-5.259 19.395 -6.394 19.844 -7.923 19.844 c
+-9.746 19.844 -11.083 19.245 -11.936 18.051 c
+-12.788 16.864 -13.23 14.964 -13.259 12.347 c
+-13.259 7.159 l
+-13.259 4.601 -12.773 2.635 -11.803 1.264 c
+-10.826 -0.099 -9.419 -0.779 -7.585 -0.779 c
+-5.872 -0.779 -4.564 -0.363 -3.66 0.47 c
+-3.19 0.912 l
+-3.19 6.776 l
+-7.834 6.776 l
+-7.834 9.496 l
+0 9.496 l
+h
+8.712 -3.16 -3.189 25.415 re
+28.737 19.491 m
+22.048 19.491 l
+22.048 -3.16 l
+18.859 -3.16 l
+18.859 19.491 l
+12.185 19.491 l
+12.185 22.255 l
+28.737 22.255 l
+h
+56.088 4.91 m
+55.941 2.183 55.169 0.096 53.78 -1.352 c
+52.398 -2.792 50.436 -3.513 47.901 -3.513 c
+45.35 -3.513 43.322 -2.543 41.815 -0.602 c
+40.315 1.338 39.566 3.961 39.566 7.277 c
+39.566 11.892 l
+39.566 15.192 40.334 17.804 41.873 19.726 c
+43.421 21.645 45.526 22.608 48.194 22.608 c
+50.642 22.608 52.537 21.865 53.883 20.388 c
+55.236 18.918 55.97 16.816 56.088 14.082 c
+52.854 14.082 l
+52.714 16.158 52.281 17.639 51.546 18.521 c
+50.81 19.403 49.694 19.844 48.194 19.844 c
+46.46 19.844 45.126 19.16 44.196 17.801 c
+43.263 16.449 42.8 14.464 42.8 11.848 c
+42.8 7.188 l
+42.8 4.619 43.23 2.65 44.093 1.279 c
+44.965 -0.095 46.232 -0.779 47.901 -0.779 c
+49.565 -0.779 50.759 -0.367 51.487 0.456 c
+52.221 1.279 52.678 2.764 52.854 4.91 c
+h
+77.144 -3.16 m
+73.939 -3.16 l
+73.939 8.584 l
+63.709 8.584 l
+63.709 -3.16 l
+60.505 -3.16 l
+60.505 22.255 l
+63.709 22.255 l
+63.709 11.333 l
+73.939 11.333 l
+73.939 22.255 l
+77.144 22.255 l
+h
+95.025 8.584 m
+86.045 8.584 l
+86.045 -0.426 l
+96.51 -0.426 l
+96.51 -3.16 l
+82.84 -3.16 l
+82.84 22.255 l
+96.334 22.255 l
+96.334 19.491 l
+86.045 19.491 l
+86.045 11.333 l
+95.025 11.333 l
+h
+112.54 3.469 m
+103.955 3.469 l
+101.971 -3.16 l
+98.693 -3.16 l
+106.88 22.255 l
+109.614 22.255 l
+117.831 -3.16 l
+114.539 -3.16 l
+h
+104.793 6.232 m
+111.717 6.232 l
+108.247 17.787 l
+h
+134.007 19.491 m
+127.32 19.491 l
+127.32 -3.16 l
+124.13 -3.16 l
+124.13 19.491 l
+117.456 19.491 l
+117.456 22.255 l
+134.007 22.255 l
+h
+156.527 3.263 m
+156.527 4.528 156.181 5.498 155.498 6.174 c
+154.81 6.85 153.572 7.504 151.779 8.144 c
+149.985 8.79 148.611 9.467 147.663 10.172 c
+146.711 10.878 146.002 11.678 145.531 12.582 c
+145.061 13.483 144.826 14.512 144.826 15.67 c
+144.826 17.687 145.495 19.348 146.84 20.652 c
+148.181 21.953 149.942 22.608 152.117 22.608 c
+153.605 22.608 154.931 22.269 156.1 21.593 c
+157.265 20.924 158.162 19.998 158.79 18.815 c
+159.415 17.629 159.731 16.324 159.731 14.905 c
+156.527 14.905 l
+156.527 16.47 156.144 17.687 155.38 18.55 c
+154.623 19.41 153.535 19.844 152.117 19.844 c
+150.831 19.844 149.831 19.48 149.118 18.757 c
+148.412 18.04 148.06 17.029 148.06 15.728 c
+148.06 14.659 148.442 13.762 149.206 13.039 c
+149.978 12.311 151.165 11.664 152.764 11.098 c
+155.27 10.275 157.059 9.253 158.129 8.041 c
+159.205 6.835 159.745 5.251 159.745 3.293 c
+159.745 1.235 159.073 -0.419 157.732 -1.66 c
+156.398 -2.896 154.579 -3.513 152.278 -3.513 c
+150.798 -3.513 149.431 -3.189 148.177 -2.543 c
+146.931 -1.896 145.95 -0.992 145.238 0.177 c
+144.521 1.353 144.165 2.694 144.165 4.204 c
+147.369 4.204 l
+147.369 2.635 147.81 1.415 148.691 0.544 c
+149.574 -0.33 150.768 -0.764 152.278 -0.764 c
+153.69 -0.764 154.748 -0.407 155.453 0.309 c
+156.167 1.033 156.527 2.018 156.527 3.263 c
+180.662 -3.16 m
+177.458 -3.16 l
+177.458 8.584 l
+167.227 8.584 l
+167.227 -3.16 l
+164.023 -3.16 l
+164.023 22.255 l
+167.227 22.255 l
+167.227 11.333 l
+177.458 11.333 l
+177.458 22.255 l
+180.662 22.255 l
+h
+198.544 8.584 m
+189.563 8.584 l
+189.563 -0.426 l
+200.028 -0.426 l
+200.028 -3.16 l
+186.358 -3.16 l
+186.358 22.255 l
+199.852 22.255 l
+199.852 19.491 l
+189.563 19.491 l
+189.563 11.333 l
+198.544 11.333 l
+h
+216.38 8.584 m
+207.4 8.584 l
+207.4 -0.426 l
+217.866 -0.426 l
+217.866 -3.16 l
+204.195 -3.16 l
+204.195 22.255 l
+217.689 22.255 l
+217.689 19.491 l
+207.4 19.491 l
+207.4 11.333 l
+216.38 11.333 l
+h
+237.246 19.491 m
+230.558 19.491 l
+230.558 -3.16 l
+227.368 -3.16 l
+227.368 19.491 l
+220.695 19.491 l
+220.695 22.255 l
+237.246 22.255 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+535.667 442.028 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 655.8467 428.4505 cm
+0 0 m
+-2.573 0 l
+-3.072 -1.911 l
+-5.072 -1.911 l
+-2.147 7.453 l
+-0.426 7.453 l
+2.528 -1.911 l
+0.5 -1.911 l
+h
+-2.161 1.587 m
+-0.412 1.587 l
+-1.294 4.924 l
+h
+3.686 -0.985 m
+3.686 -0.691 3.781 -0.453 3.979 -0.264 c
+4.174 -0.081 4.428 0.014 4.744 0.014 c
+5.045 0.014 5.295 -0.081 5.494 -0.264 c
+5.699 -0.453 5.802 -0.691 5.802 -0.985 c
+5.802 -1.29 5.699 -1.536 5.494 -1.72 c
+5.295 -1.897 5.045 -1.985 4.744 -1.985 c
+4.438 -1.985 4.185 -1.893 3.979 -1.706 c
+3.781 -1.521 3.686 -1.279 3.686 -0.985 c
+17.055 -0.852 m
+16.691 -1.246 16.246 -1.544 15.717 -1.75 c
+15.187 -1.945 14.607 -2.043 13.982 -2.043 c
+12.902 -2.043 12.064 -1.713 11.469 -1.044 c
+10.869 -0.379 10.565 0.592 10.557 1.866 c
+10.557 3.557 l
+10.557 4.85 10.836 5.843 11.395 6.541 c
+11.962 7.235 12.785 7.584 13.865 7.584 c
+14.883 7.584 15.647 7.327 16.158 6.82 c
+16.676 6.321 16.974 5.534 17.055 4.469 c
+15.217 4.469 l
+15.166 5.064 15.044 5.471 14.85 5.689 c
+14.651 5.901 14.343 6.011 13.924 6.011 c
+13.413 6.011 13.041 5.824 12.806 5.453 c
+12.579 5.078 12.461 4.486 12.453 3.675 c
+12.453 1.97 l
+12.453 1.117 12.579 0.492 12.835 0.103 c
+13.089 -0.279 13.504 -0.47 14.085 -0.47 c
+14.456 -0.47 14.761 -0.397 14.996 -0.25 c
+15.158 -0.133 l
+15.158 1.587 l
+13.836 1.587 l
+13.836 3.013 l
+17.055 3.013 l
+h
+20.612 -1.911 -1.897 9.363 re
+28.192 5.88 m
+25.87 5.88 l
+25.87 -1.911 l
+23.974 -1.911 l
+23.974 5.88 l
+21.695 5.88 l
+21.695 7.453 l
+28.192 7.453 l
+h
+34.187 -1.911 -1.897 9.363 re
+42.436 -1.911 m
+40.54 -1.911 l
+37.776 4.233 l
+37.776 -1.911 l
+35.88 -1.911 l
+35.88 7.453 l
+37.776 7.453 l
+40.54 1.308 l
+40.54 7.453 l
+42.436 7.453 l
+h
+48.143 0.544 m
+48.143 0.926 48.044 1.213 47.849 1.411 c
+47.65 1.606 47.298 1.808 46.79 2.013 c
+45.85 2.373 45.173 2.793 44.762 3.263 c
+44.35 3.74 44.145 4.31 44.145 4.968 c
+44.145 5.751 44.424 6.383 44.982 6.865 c
+45.541 7.342 46.25 7.584 47.114 7.584 c
+47.691 7.584 48.205 7.459 48.657 7.217 c
+49.106 6.971 49.451 6.629 49.686 6.188 c
+49.929 5.747 50.054 5.247 50.054 4.689 c
+48.172 4.689 l
+48.172 5.13 48.076 5.46 47.893 5.689 c
+47.706 5.913 47.438 6.026 47.085 6.026 c
+46.75 6.026 46.49 5.928 46.305 5.733 c
+46.129 5.545 46.041 5.284 46.041 4.953 c
+46.041 4.696 46.144 4.461 46.349 4.247 c
+46.555 4.042 46.916 3.825 47.438 3.601 c
+48.348 3.278 49.01 2.873 49.422 2.396 c
+49.84 1.914 50.054 1.301 50.054 0.559 c
+50.054 -0.258 49.792 -0.893 49.275 -1.353 c
+48.753 -1.816 48.047 -2.043 47.158 -2.043 c
+46.548 -2.043 45.997 -1.918 45.497 -1.675 c
+45.005 -1.422 44.618 -1.066 44.336 -0.603 c
+44.049 -0.133 43.91 0.415 43.91 1.043 c
+45.806 1.043 l
+45.806 0.503 45.909 0.11 46.114 -0.133 c
+46.328 -0.379 46.677 -0.5 47.158 -0.5 c
+47.812 -0.5 48.143 -0.154 48.143 0.544 c
+57.587 5.88 m
+55.265 5.88 l
+55.265 -1.911 l
+53.368 -1.911 l
+53.368 5.88 l
+51.09 5.88 l
+51.09 7.453 l
+57.587 7.453 l
+h
+62.548 0 m
+59.976 0 l
+59.475 -1.911 l
+57.476 -1.911 l
+60.402 7.453 l
+62.122 7.453 l
+65.077 -1.911 l
+63.047 -1.911 l
+h
+60.387 1.587 m
+62.137 1.587 l
+61.254 4.924 l
+h
+68.071 -0.339 m
+71.393 -0.339 l
+71.393 -1.911 l
+66.175 -1.911 l
+66.175 7.453 l
+68.071 7.453 l
+h
+74.554 -0.339 m
+77.875 -0.339 l
+77.875 -1.911 l
+72.657 -1.911 l
+72.657 7.453 l
+74.554 7.453 l
+h
+83.74 0 m
+81.168 0 l
+80.668 -1.911 l
+78.669 -1.911 l
+81.594 7.453 l
+83.314 7.453 l
+86.269 -1.911 l
+84.24 -1.911 l
+h
+81.579 1.587 m
+83.329 1.587 l
+82.446 4.924 l
+h
+92.644 5.88 m
+90.321 5.88 l
+90.321 -1.911 l
+88.426 -1.911 l
+88.426 5.88 l
+86.147 5.88 l
+86.147 7.453 l
+92.644 7.453 l
+h
+95.915 -1.911 -1.897 9.363 re
+104.205 1.926 m
+104.205 0.669 103.904 -0.305 103.308 -1 c
+102.709 -1.698 101.886 -2.043 100.839 -2.043 c
+99.788 -2.043 98.961 -1.702 98.355 -1.014 c
+97.756 -0.32 97.451 0.646 97.444 1.881 c
+97.444 3.484 l
+97.444 4.766 97.741 5.77 98.34 6.497 c
+98.936 7.221 99.766 7.584 100.825 7.584 c
+101.86 7.584 102.68 7.224 103.279 6.512 c
+103.885 5.806 104.194 4.81 104.205 3.528 c
+h
+102.309 3.499 m
+102.309 4.34 102.184 4.968 101.941 5.38 c
+101.706 5.791 101.332 5.997 100.825 5.997 c
+100.324 5.997 99.95 5.795 99.707 5.394 c
+99.472 5.001 99.347 4.402 99.339 3.601 c
+99.339 1.926 l
+99.339 1.109 99.461 0.507 99.707 0.118 c
+99.95 -0.276 100.328 -0.47 100.839 -0.47 c
+101.328 -0.47 101.691 -0.279 101.926 0.103 c
+102.169 0.484 102.298 1.072 102.309 1.866 c
+h
+112.337 -1.911 m
+110.441 -1.911 l
+107.678 4.233 l
+107.678 -1.911 l
+105.781 -1.911 l
+105.781 7.453 l
+107.678 7.453 l
+110.441 1.308 l
+110.441 7.453 l
+112.337 7.453 l
+h
+f
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 539.3305 407.9565 cm
+0 0 m
+-2.263 0 l
+-2.263 -2.955 l
+-3.102 -2.955 l
+-3.102 3.733 l
+0.383 3.733 l
+0.383 3.013 l
+-2.263 3.013 l
+-2.263 0.72 l
+0 0.72 l
+h
+0.871 -0.235 m
+0.871 0.477 1.04 1.047 1.386 1.469 c
+1.739 1.888 2.201 2.102 2.782 2.102 c
+3.359 2.102 3.818 1.896 4.164 1.484 c
+4.517 1.08 4.696 0.521 4.708 -0.191 c
+4.708 -0.706 l
+4.708 -1.434 4.532 -2.007 4.179 -2.425 c
+3.833 -2.837 3.373 -3.043 2.797 -3.043 c
+2.216 -3.043 1.754 -2.845 1.401 -2.44 c
+1.055 -2.029 0.879 -1.478 0.871 -0.779 c
+h
+1.679 -0.706 m
+1.679 -1.216 1.775 -1.617 1.974 -1.912 c
+2.18 -2.205 2.452 -2.352 2.797 -2.352 c
+3.51 -2.352 3.877 -1.834 3.899 -0.794 c
+3.899 -0.235 l
+3.899 0.272 3.796 0.675 3.591 0.97 c
+3.392 1.263 3.124 1.411 2.782 1.411 c
+2.448 1.411 2.18 1.263 1.974 0.97 c
+1.775 0.675 1.679 0.272 1.679 -0.235 c
+h
+7.622 1.249 m
+7.504 1.267 7.379 1.278 7.254 1.278 c
+6.832 1.278 6.541 1.051 6.387 0.602 c
+6.387 -2.955 l
+5.564 -2.955 l
+5.564 2.013 l
+6.358 2.013 l
+6.373 1.514 l
+6.585 1.903 6.894 2.102 7.298 2.102 c
+7.423 2.102 7.533 2.08 7.622 2.043 c
+h
+14.93 -2.117 m
+14.784 -2.308 l
+14.361 -2.801 13.744 -3.043 12.931 -3.043 c
+12.204 -3.043 11.638 -2.804 11.227 -2.323 c
+10.815 -1.845 10.602 -1.169 10.595 -0.294 c
+10.595 1.014 l
+10.595 1.955 10.778 2.653 11.153 3.116 c
+11.524 3.586 12.087 3.821 12.844 3.821 c
+13.479 3.821 13.976 3.645 14.328 3.293 c
+14.689 2.94 14.89 2.433 14.93 1.778 c
+14.093 1.778 l
+14.053 2.19 13.935 2.514 13.74 2.749 c
+13.542 2.984 13.244 3.102 12.844 3.102 c
+12.362 3.102 12.01 2.944 11.786 2.631 c
+11.557 2.315 11.439 1.815 11.433 1.132 c
+11.433 -0.235 l
+11.433 -0.912 11.557 -1.434 11.815 -1.794 c
+12.079 -2.147 12.451 -2.323 12.931 -2.323 c
+13.38 -2.323 13.725 -2.216 13.961 -1.999 c
+14.093 -1.881 l
+14.093 -0.339 l
+12.858 -0.339 l
+12.858 0.382 l
+14.93 0.382 l
+h
+20.454 -2.955 m
+19.616 -2.955 l
+16.941 2.204 l
+16.941 -2.955 l
+16.089 -2.955 l
+16.089 3.733 l
+16.941 3.733 l
+19.616 -1.441 l
+19.616 3.733 l
+20.454 3.733 l
+h
+25.661 3.733 m
+25.661 -1.014 l
+25.661 -1.654 25.477 -2.153 25.118 -2.514 c
+24.754 -2.866 24.25 -3.043 23.603 -3.043 c
+22.946 -3.043 22.442 -2.874 22.09 -2.529 c
+21.737 -2.176 21.56 -1.673 21.56 -1.014 c
+21.56 3.733 l
+22.398 3.733 l
+22.398 -0.985 l
+22.398 -1.437 22.49 -1.775 22.677 -1.999 c
+22.872 -2.216 23.181 -2.323 23.603 -2.323 c
+24.033 -2.323 24.342 -2.216 24.529 -1.999 c
+24.725 -1.775 24.823 -1.437 24.823 -0.985 c
+24.823 3.733 l
+h
+26.878 -3.528 m
+26.186 -3.528 l
+28.524 3.733 l
+29.215 3.733 l
+h
+30.964 -2.234 m
+33.581 -2.234 l
+33.581 -2.955 l
+30.111 -2.955 l
+30.111 3.733 l
+30.964 3.733 l
+h
+35.16 -2.955 -0.808 4.968 re
+35.219 3.337 m
+35.219 3.197 35.179 3.079 35.102 2.984 c
+35.032 2.896 34.917 2.851 34.763 2.851 c
+34.605 2.851 34.488 2.896 34.41 2.984 c
+34.341 3.079 34.308 3.197 34.308 3.337 c
+34.308 3.472 34.341 3.586 34.41 3.675 c
+34.488 3.77 34.602 3.821 34.749 3.821 c
+34.903 3.821 35.021 3.77 35.102 3.675 c
+35.179 3.586 35.219 3.472 35.219 3.337 c
+37.108 2.013 m
+37.138 1.484 l
+37.45 1.896 37.851 2.102 38.343 2.102 c
+39.225 2.102 39.669 1.517 39.68 0.353 c
+39.68 -2.955 l
+38.872 -2.955 l
+38.872 0.309 l
+38.872 0.698 38.805 0.974 38.68 1.132 c
+38.552 1.297 38.358 1.381 38.092 1.381 c
+37.887 1.381 37.703 1.311 37.549 1.176 c
+37.391 1.047 37.263 0.874 37.167 0.661 c
+37.167 -2.955 l
+36.344 -2.955 l
+36.344 2.013 l
+h
+43.26 -2.514 m
+42.984 -2.866 42.587 -3.043 42.069 -3.043 c
+41.628 -3.043 41.29 -2.893 41.055 -2.587 c
+40.827 -2.275 40.71 -1.819 40.702 -1.22 c
+40.702 2.013 l
+41.51 2.013 l
+41.51 -1.162 l
+41.51 -1.937 41.745 -2.323 42.216 -2.323 c
+42.705 -2.323 43.043 -2.103 43.23 -1.661 c
+43.23 2.013 l
+44.053 2.013 l
+44.053 -2.955 l
+43.274 -2.955 l
+h
+46.53 0.205 m
+47.382 2.013 l
+48.323 2.013 l
+46.971 -0.441 l
+48.353 -2.955 l
+47.426 -2.955 l
+46.545 -1.088 l
+45.663 -2.955 l
+44.722 -2.955 l
+46.104 -0.441 l
+44.766 2.013 l
+45.693 2.013 l
+h
+51.208 -0.25 m
+51.208 0.521 51.347 1.105 51.634 1.499 c
+51.918 1.899 52.329 2.102 52.87 2.102 c
+53.34 2.102 53.707 1.911 53.971 1.529 c
+53.971 4.101 l
+54.794 4.101 l
+54.794 -2.955 l
+54.045 -2.955 l
+54.001 -2.425 l
+53.736 -2.837 53.358 -3.043 52.87 -3.043 c
+52.347 -3.043 51.943 -2.849 51.649 -2.455 c
+51.355 -2.055 51.208 -1.484 51.208 -0.75 c
+h
+52.016 -0.706 m
+52.016 -1.264 52.097 -1.676 52.267 -1.941 c
+52.432 -2.198 52.7 -2.323 53.075 -2.323 c
+53.475 -2.323 53.773 -2.124 53.971 -1.72 c
+53.971 0.793 l
+53.766 1.182 53.464 1.381 53.075 1.381 c
+52.7 1.381 52.432 1.249 52.267 0.985 c
+52.097 0.727 52.016 0.33 52.016 -0.206 c
+h
+56.731 -2.955 -0.808 4.968 re
+56.79 3.337 m
+56.79 3.197 56.749 3.079 56.672 2.984 c
+56.602 2.896 56.489 2.851 56.334 2.851 c
+56.176 2.851 56.059 2.896 55.982 2.984 c
+55.912 3.079 55.879 3.197 55.879 3.337 c
+55.879 3.472 55.912 3.586 55.982 3.675 c
+56.059 3.77 56.172 3.821 56.319 3.821 c
+56.474 3.821 56.592 3.77 56.672 3.675 c
+56.749 3.586 56.79 3.472 56.79 3.337 c
+60.34 -1.676 m
+60.34 -1.511 60.27 -1.364 60.134 -1.235 c
+60.005 -1.11 59.752 -0.963 59.37 -0.794 c
+58.936 -0.611 58.628 -0.452 58.443 -0.324 c
+58.268 -0.198 58.135 -0.055 58.046 0.103 c
+57.959 0.268 57.915 0.463 57.915 0.691 c
+57.915 1.103 58.061 1.44 58.356 1.705 c
+58.649 1.969 59.024 2.102 59.488 2.102 c
+59.976 2.102 60.369 1.959 60.664 1.675 c
+60.957 1.4 61.104 1.043 61.104 0.602 c
+60.296 0.602 l
+60.296 0.827 60.215 1.018 60.061 1.176 c
+59.914 1.33 59.723 1.411 59.488 1.411 c
+59.253 1.411 59.064 1.344 58.929 1.22 c
+58.789 1.103 58.723 0.933 58.723 0.72 c
+58.723 0.551 58.771 0.419 58.87 0.323 c
+58.966 0.224 59.208 0.091 59.59 -0.073 c
+60.197 -0.309 60.608 -0.541 60.825 -0.765 c
+61.038 -0.992 61.148 -1.276 61.148 -1.617 c
+61.148 -2.051 60.994 -2.396 60.693 -2.66 c
+60.398 -2.918 60.002 -3.043 59.502 -3.043 c
+58.991 -3.043 58.576 -2.896 58.252 -2.602 c
+57.929 -2.308 57.768 -1.933 57.768 -1.47 c
+58.591 -1.47 l
+58.598 -1.746 58.682 -1.962 58.84 -2.117 c
+58.995 -2.275 59.216 -2.352 59.502 -2.352 c
+59.774 -2.352 59.98 -2.293 60.12 -2.176 c
+60.267 -2.051 60.34 -1.881 60.34 -1.676 c
+63.096 3.219 m
+63.096 2.013 l
+63.845 2.013 l
+63.845 1.352 l
+63.096 1.352 l
+63.096 -1.72 l
+63.096 -1.918 63.126 -2.07 63.184 -2.176 c
+63.251 -2.275 63.364 -2.323 63.523 -2.323 c
+63.629 -2.323 63.735 -2.305 63.845 -2.264 c
+63.831 -2.955 l
+63.654 -3.013 63.467 -3.043 63.272 -3.043 c
+62.949 -3.043 62.703 -2.933 62.538 -2.705 c
+62.368 -2.469 62.287 -2.147 62.287 -1.735 c
+62.287 1.352 l
+61.523 1.352 l
+61.523 2.013 l
+62.287 2.013 l
+62.287 3.219 l
+h
+66.745 1.249 m
+66.627 1.267 66.503 1.278 66.378 1.278 c
+65.955 1.278 65.665 1.051 65.51 0.602 c
+65.51 -2.955 l
+64.687 -2.955 l
+64.687 2.013 l
+65.481 2.013 l
+65.495 1.514 l
+65.709 1.903 66.017 2.102 66.422 2.102 c
+66.547 2.102 66.657 2.08 66.745 2.043 c
+h
+68.321 -2.955 -0.808 4.968 re
+68.38 3.337 m
+68.38 3.197 68.34 3.079 68.263 2.984 c
+68.193 2.896 68.078 2.851 67.924 2.851 c
+67.766 2.851 67.649 2.896 67.571 2.984 c
+67.502 3.079 67.469 3.197 67.469 3.337 c
+67.469 3.472 67.502 3.586 67.571 3.675 c
+67.649 3.77 67.763 3.821 67.91 3.821 c
+68.064 3.821 68.182 3.77 68.263 3.675 c
+68.34 3.586 68.38 3.472 68.38 3.337 c
+73.102 -0.706 m
+73.102 -1.482 72.959 -2.066 72.676 -2.455 c
+72.4 -2.849 72 -3.043 71.471 -3.043 c
+70.949 -3.043 70.559 -2.818 70.295 -2.367 c
+70.251 -2.955 l
+69.516 -2.955 l
+69.516 4.101 l
+70.324 4.101 l
+70.324 1.469 l
+70.588 1.888 70.971 2.102 71.471 2.102 c
+72.007 2.102 72.415 1.911 72.691 1.529 c
+72.963 1.146 73.102 0.562 73.102 -0.221 c
+h
+72.294 -0.25 m
+72.294 0.338 72.209 0.753 72.044 0.999 c
+71.886 1.253 71.621 1.381 71.251 1.381 c
+70.839 1.381 70.53 1.153 70.324 0.706 c
+70.324 -1.661 l
+70.519 -2.103 70.831 -2.323 71.265 -2.323 c
+71.625 -2.323 71.886 -2.198 72.044 -1.941 c
+72.209 -1.687 72.294 -1.29 72.294 -0.75 c
+h
+76.508 -2.514 m
+76.233 -2.866 75.837 -3.043 75.318 -3.043 c
+74.877 -3.043 74.54 -2.893 74.304 -2.587 c
+74.076 -2.275 73.958 -1.819 73.952 -1.22 c
+73.952 2.013 l
+74.76 2.013 l
+74.76 -1.162 l
+74.76 -1.937 74.995 -2.323 75.465 -2.323 c
+75.954 -2.323 76.292 -2.103 76.479 -1.661 c
+76.479 2.013 l
+77.302 2.013 l
+77.302 -2.955 l
+76.523 -2.955 l
+h
+79.412 3.219 m
+79.412 2.013 l
+80.161 2.013 l
+80.161 1.352 l
+79.412 1.352 l
+79.412 -1.72 l
+79.412 -1.918 79.442 -2.07 79.5 -2.176 c
+79.566 -2.275 79.681 -2.323 79.838 -2.323 c
+79.945 -2.323 80.051 -2.305 80.161 -2.264 c
+80.147 -2.955 l
+79.97 -3.013 79.783 -3.043 79.589 -3.043 c
+79.265 -3.043 79.018 -2.933 78.854 -2.705 c
+78.684 -2.469 78.604 -2.147 78.604 -1.735 c
+78.604 1.352 l
+77.839 1.352 l
+77.839 2.013 l
+78.604 2.013 l
+78.604 3.219 l
+h
+81.885 -2.955 -0.808 4.968 re
+81.944 3.337 m
+81.944 3.197 81.904 3.079 81.826 2.984 c
+81.757 2.896 81.642 2.851 81.488 2.851 c
+81.33 2.851 81.212 2.896 81.135 2.984 c
+81.065 3.079 81.032 3.197 81.032 3.337 c
+81.032 3.472 81.065 3.586 81.135 3.675 c
+81.212 3.77 81.327 3.821 81.474 3.821 c
+81.628 3.821 81.746 3.77 81.826 3.675 c
+81.904 3.586 81.944 3.472 81.944 3.337 c
+82.903 -0.235 m
+82.903 0.477 83.072 1.047 83.417 1.469 c
+83.77 1.888 84.233 2.102 84.814 2.102 c
+85.391 2.102 85.85 1.896 86.195 1.484 c
+86.548 1.08 86.729 0.521 86.739 -0.191 c
+86.739 -0.706 l
+86.739 -1.434 86.563 -2.007 86.21 -2.425 c
+85.865 -2.837 85.405 -3.043 84.828 -3.043 c
+84.248 -3.043 83.785 -2.845 83.432 -2.44 c
+83.087 -2.029 82.91 -1.478 82.903 -0.779 c
+h
+83.712 -0.706 m
+83.712 -1.216 83.807 -1.617 84.005 -1.912 c
+84.211 -2.205 84.483 -2.352 84.828 -2.352 c
+85.542 -2.352 85.909 -1.834 85.931 -0.794 c
+85.931 -0.235 l
+85.931 0.272 85.828 0.675 85.622 0.97 c
+85.424 1.263 85.156 1.411 84.814 1.411 c
+84.479 1.411 84.211 1.263 84.005 0.97 c
+83.807 0.675 83.712 0.272 83.712 -0.235 c
+h
+88.364 2.013 m
+88.393 1.484 l
+88.705 1.896 89.106 2.102 89.598 2.102 c
+90.48 2.102 90.925 1.517 90.936 0.353 c
+90.936 -2.955 l
+90.128 -2.955 l
+90.128 0.309 l
+90.128 0.698 90.062 0.974 89.937 1.132 c
+89.808 1.297 89.613 1.381 89.349 1.381 c
+89.143 1.381 88.959 1.311 88.805 1.176 c
+88.647 1.047 88.518 0.874 88.422 0.661 c
+88.422 -2.955 l
+87.599 -2.955 l
+87.599 2.013 l
+h
+94.398 -1.676 m
+94.398 -1.511 94.328 -1.364 94.192 -1.235 c
+94.064 -1.11 93.81 -0.963 93.428 -0.794 c
+92.994 -0.611 92.685 -0.452 92.501 -0.324 c
+92.325 -0.198 92.192 -0.055 92.105 0.103 c
+92.017 0.268 91.972 0.463 91.972 0.691 c
+91.972 1.103 92.119 1.44 92.414 1.705 c
+92.707 1.969 93.082 2.102 93.545 2.102 c
+94.034 2.102 94.427 1.959 94.721 1.675 c
+95.015 1.4 95.162 1.043 95.162 0.602 c
+94.353 0.602 l
+94.353 0.827 94.272 1.018 94.118 1.176 c
+93.971 1.33 93.78 1.411 93.545 1.411 c
+93.31 1.411 93.123 1.344 92.986 1.22 c
+92.847 1.103 92.78 0.933 92.78 0.72 c
+92.78 0.551 92.828 0.419 92.928 0.323 c
+93.023 0.224 93.266 0.091 93.648 -0.073 c
+94.255 -0.309 94.666 -0.541 94.883 -0.765 c
+95.096 -0.992 95.206 -1.276 95.206 -1.617 c
+95.206 -2.051 95.051 -2.396 94.75 -2.66 c
+94.457 -2.918 94.06 -3.043 93.559 -3.043 c
+93.049 -3.043 92.634 -2.896 92.31 -2.602 c
+91.987 -2.308 91.826 -1.933 91.826 -1.47 c
+92.649 -1.47 l
+92.655 -1.746 92.74 -1.962 92.898 -2.117 c
+93.052 -2.275 93.273 -2.352 93.559 -2.352 c
+93.831 -2.352 94.037 -2.293 94.177 -2.176 c
+94.324 -2.051 94.398 -1.881 94.398 -1.676 c
+102.699 -2.117 m
+102.552 -2.308 l
+102.13 -2.801 101.512 -3.043 100.7 -3.043 c
+99.972 -3.043 99.406 -2.804 98.995 -2.323 c
+98.583 -1.845 98.37 -1.169 98.363 -0.294 c
+98.363 1.014 l
+98.363 1.955 98.546 2.653 98.922 3.116 c
+99.292 3.586 99.855 3.821 100.612 3.821 c
+101.247 3.821 101.744 3.645 102.097 3.293 c
+102.456 2.94 102.658 2.433 102.699 1.778 c
+101.861 1.778 l
+101.821 2.19 101.703 2.514 101.509 2.749 c
+101.31 2.984 101.012 3.102 100.612 3.102 c
+100.13 3.102 99.778 2.944 99.553 2.631 c
+99.325 2.315 99.208 1.815 99.201 1.132 c
+99.201 -0.235 l
+99.201 -0.912 99.325 -1.434 99.583 -1.794 c
+99.847 -2.147 100.219 -2.323 100.7 -2.323 c
+101.148 -2.323 101.494 -2.216 101.729 -1.999 c
+101.861 -1.881 l
+101.861 -0.339 l
+100.626 -0.339 l
+100.626 0.382 l
+102.699 0.382 l
+h
+104.617 -2.955 -0.808 4.968 re
+104.676 3.337 m
+104.676 3.197 104.636 3.079 104.558 2.984 c
+104.489 2.896 104.375 2.851 104.22 2.851 c
+104.062 2.851 103.944 2.896 103.867 2.984 c
+103.797 3.079 103.765 3.197 103.765 3.337 c
+103.765 3.472 103.797 3.586 103.867 3.675 c
+103.944 3.77 104.059 3.821 104.206 3.821 c
+104.36 3.821 104.478 3.77 104.558 3.675 c
+104.636 3.586 104.676 3.472 104.676 3.337 c
+106.874 3.219 m
+106.874 2.013 l
+107.623 2.013 l
+107.623 1.352 l
+106.874 1.352 l
+106.874 -1.72 l
+106.874 -1.918 106.903 -2.07 106.962 -2.176 c
+107.028 -2.275 107.142 -2.323 107.3 -2.323 c
+107.406 -2.323 107.512 -2.305 107.623 -2.264 c
+107.608 -2.955 l
+107.432 -3.013 107.244 -3.043 107.05 -3.043 c
+106.727 -3.043 106.48 -2.933 106.315 -2.705 c
+106.146 -2.469 106.065 -2.147 106.065 -1.735 c
+106.065 1.352 l
+105.301 1.352 l
+105.301 2.013 l
+106.065 2.013 l
+106.065 3.219 l
+h
+113.197 -1.676 m
+113.197 -1.511 113.128 -1.364 112.992 -1.235 c
+112.863 -1.11 112.609 -0.963 112.227 -0.794 c
+111.794 -0.611 111.485 -0.452 111.302 -0.324 c
+111.125 -0.198 110.993 -0.055 110.905 0.103 c
+110.816 0.268 110.772 0.463 110.772 0.691 c
+110.772 1.103 110.92 1.44 111.213 1.705 c
+111.508 1.969 111.882 2.102 112.345 2.102 c
+112.834 2.102 113.227 1.959 113.521 1.675 c
+113.815 1.4 113.962 1.043 113.962 0.602 c
+113.154 0.602 l
+113.154 0.827 113.073 1.018 112.919 1.176 c
+112.771 1.33 112.58 1.411 112.345 1.411 c
+112.11 1.411 111.923 1.344 111.786 1.22 c
+111.647 1.103 111.581 0.933 111.581 0.72 c
+111.581 0.551 111.628 0.419 111.728 0.323 c
+111.823 0.224 112.066 0.091 112.448 -0.073 c
+113.054 -0.309 113.466 -0.541 113.683 -0.765 c
+113.896 -0.992 114.006 -1.276 114.006 -1.617 c
+114.006 -2.051 113.852 -2.396 113.55 -2.66 c
+113.257 -2.918 112.86 -3.043 112.36 -3.043 c
+111.849 -3.043 111.433 -2.896 111.111 -2.602 c
+110.787 -2.308 110.625 -1.933 110.625 -1.47 c
+111.448 -1.47 l
+111.456 -1.746 111.541 -1.962 111.699 -2.117 c
+111.853 -2.275 112.073 -2.352 112.36 -2.352 c
+112.632 -2.352 112.838 -2.293 112.977 -2.176 c
+113.124 -2.051 113.197 -1.881 113.197 -1.676 c
+115.703 1.499 m
+116.005 1.899 116.399 2.102 116.879 2.102 c
+117.762 2.102 118.207 1.517 118.217 0.353 c
+118.217 -2.955 l
+117.409 -2.955 l
+117.409 0.309 l
+117.409 0.698 117.343 0.974 117.218 1.132 c
+117.089 1.297 116.894 1.381 116.63 1.381 c
+116.424 1.381 116.241 1.311 116.086 1.176 c
+115.928 1.047 115.799 0.874 115.703 0.661 c
+115.703 -2.955 l
+114.88 -2.955 l
+114.88 4.101 l
+115.703 4.101 l
+h
+119.077 -0.235 m
+119.077 0.477 119.246 1.047 119.591 1.469 c
+119.944 1.888 120.407 2.102 120.989 2.102 c
+121.565 2.102 122.024 1.896 122.37 1.484 c
+122.722 1.08 122.903 0.521 122.914 -0.191 c
+122.914 -0.706 l
+122.914 -1.434 122.737 -2.007 122.385 -2.425 c
+122.039 -2.837 121.58 -3.043 121.003 -3.043 c
+120.422 -3.043 119.959 -2.845 119.607 -2.44 c
+119.261 -2.029 119.084 -1.478 119.077 -0.779 c
+h
+119.886 -0.706 m
+119.886 -1.216 119.981 -1.617 120.179 -1.912 c
+120.385 -2.205 120.657 -2.352 121.003 -2.352 c
+121.716 -2.352 122.084 -1.834 122.105 -0.794 c
+122.105 -0.235 l
+122.105 0.272 122.003 0.675 121.797 0.97 c
+121.598 1.263 121.33 1.411 120.989 1.411 c
+120.654 1.411 120.385 1.263 120.179 0.97 c
+119.981 0.675 119.886 0.272 119.886 -0.235 c
+h
+126.317 -2.514 m
+126.041 -2.866 125.644 -3.043 125.126 -3.043 c
+124.685 -3.043 124.347 -2.893 124.112 -2.587 c
+123.884 -2.275 123.767 -1.819 123.759 -1.22 c
+123.759 2.013 l
+124.567 2.013 l
+124.567 -1.162 l
+124.567 -1.937 124.802 -2.323 125.273 -2.323 c
+125.762 -2.323 126.1 -2.103 126.287 -1.661 c
+126.287 2.013 l
+127.11 2.013 l
+127.11 -2.955 l
+126.331 -2.955 l
+h
+129.029 -2.955 -0.809 7.056 re
+130.05 -0.25 m
+130.05 0.521 130.19 1.105 130.477 1.499 c
+130.759 1.899 131.171 2.102 131.711 2.102 c
+132.181 2.102 132.549 1.911 132.814 1.529 c
+132.814 4.101 l
+133.637 4.101 l
+133.637 -2.955 l
+132.887 -2.955 l
+132.843 -2.425 l
+132.578 -2.837 132.2 -3.043 131.711 -3.043 c
+131.189 -3.043 130.785 -2.849 130.491 -2.455 c
+130.197 -2.055 130.05 -1.484 130.05 -0.75 c
+h
+130.859 -0.706 m
+130.859 -1.264 130.94 -1.676 131.108 -1.941 c
+131.274 -2.198 131.542 -2.323 131.917 -2.323 c
+132.318 -2.323 132.615 -2.124 132.814 -1.72 c
+132.814 0.793 l
+132.608 1.182 132.307 1.381 131.917 1.381 c
+131.542 1.381 131.274 1.249 131.108 0.985 c
+130.94 0.727 130.859 0.33 130.859 -0.206 c
+h
+140.6 -0.706 m
+140.6 -1.482 140.457 -2.066 140.174 -2.455 c
+139.898 -2.849 139.498 -3.043 138.969 -3.043 c
+138.447 -3.043 138.057 -2.818 137.793 -2.367 c
+137.749 -2.955 l
+137.014 -2.955 l
+137.014 4.101 l
+137.822 4.101 l
+137.822 1.469 l
+138.086 1.888 138.469 2.102 138.969 2.102 c
+139.505 2.102 139.913 1.911 140.189 1.529 c
+140.461 1.146 140.6 0.562 140.6 -0.221 c
+h
+139.792 -0.25 m
+139.792 0.338 139.707 0.753 139.542 0.999 c
+139.384 1.253 139.119 1.381 138.749 1.381 c
+138.337 1.381 138.028 1.153 137.822 0.706 c
+137.822 -1.661 l
+138.017 -2.103 138.329 -2.323 138.763 -2.323 c
+139.123 -2.323 139.384 -2.198 139.542 -1.941 c
+139.707 -1.687 139.792 -1.29 139.792 -0.75 c
+h
+143.243 -3.043 m
+142.626 -3.043 142.148 -2.863 141.816 -2.5 c
+141.494 -2.128 141.325 -1.584 141.317 -0.867 c
+141.317 -0.265 l
+141.317 0.47 141.479 1.047 141.802 1.469 c
+142.125 1.888 142.574 2.102 143.154 2.102 c
+143.731 2.102 144.161 1.914 144.448 1.543 c
+144.742 1.18 144.893 0.606 144.904 -0.177 c
+144.904 -0.706 l
+142.125 -0.706 l
+142.125 -0.823 l
+142.125 -1.364 142.221 -1.757 142.42 -1.999 c
+142.626 -2.234 142.911 -2.352 143.287 -2.352 c
+143.53 -2.352 143.742 -2.308 143.919 -2.22 c
+144.103 -2.132 144.276 -1.992 144.434 -1.794 c
+144.86 -2.308 l
+144.507 -2.801 143.966 -3.043 143.243 -3.043 c
+143.154 1.411 m
+142.82 1.411 142.57 1.294 142.404 1.058 c
+142.236 0.83 142.144 0.474 142.125 -0.015 c
+144.081 -0.015 l
+144.081 0.103 l
+144.058 0.573 143.977 0.904 143.831 1.103 c
+143.684 1.308 143.455 1.411 143.154 1.411 c
+150.562 -2.955 m
+150.511 -2.849 150.478 -2.668 150.46 -2.411 c
+150.173 -2.833 149.805 -3.043 149.357 -3.043 c
+148.905 -3.043 148.552 -2.922 148.299 -2.675 c
+148.053 -2.422 147.931 -2.066 147.931 -1.602 c
+147.931 -1.095 148.101 -0.691 148.446 -0.397 c
+148.787 -0.103 149.258 0.047 149.857 0.058 c
+150.445 0.058 l
+150.445 0.588 l
+150.445 0.882 150.375 1.091 150.239 1.22 c
+150.111 1.344 149.916 1.411 149.651 1.411 c
+149.405 1.411 149.203 1.338 149.049 1.19 c
+148.902 1.043 148.828 0.856 148.828 0.632 c
+148.005 0.632 l
+148.005 0.885 148.079 1.132 148.226 1.367 c
+148.38 1.602 148.586 1.782 148.843 1.911 c
+149.097 2.036 149.379 2.102 149.695 2.102 c
+150.202 2.102 150.592 1.973 150.857 1.72 c
+151.121 1.473 151.254 1.105 151.254 0.617 c
+151.254 -1.881 l
+151.261 -2.264 151.316 -2.598 151.415 -2.881 c
+151.415 -2.955 l
+h
+149.49 -2.308 m
+149.685 -2.308 149.872 -2.257 150.048 -2.147 c
+150.232 -2.029 150.364 -1.893 150.445 -1.735 c
+150.445 -0.544 l
+149.99 -0.544 l
+149.608 -0.555 149.302 -0.643 149.078 -0.809 c
+148.85 -0.977 148.74 -1.206 148.74 -1.5 c
+148.74 -1.786 148.791 -1.992 148.902 -2.117 c
+149.02 -2.246 149.214 -2.308 149.49 -2.308 c
+153.668 -1.72 m
+154.609 2.013 l
+155.447 2.013 l
+153.961 -2.955 l
+153.359 -2.955 l
+151.86 2.013 l
+152.698 2.013 l
+h
+158.607 -2.955 m
+158.555 -2.849 158.522 -2.668 158.504 -2.411 c
+158.217 -2.833 157.849 -3.043 157.402 -3.043 c
+156.949 -3.043 156.596 -2.922 156.343 -2.675 c
+156.097 -2.422 155.976 -2.066 155.976 -1.602 c
+155.976 -1.095 156.145 -0.691 156.49 -0.397 c
+156.832 -0.103 157.302 0.047 157.901 0.058 c
+158.489 0.058 l
+158.489 0.588 l
+158.489 0.882 158.42 1.091 158.283 1.22 c
+158.154 1.344 157.96 1.411 157.695 1.411 c
+157.449 1.411 157.247 1.338 157.093 1.19 c
+156.945 1.043 156.872 0.856 156.872 0.632 c
+156.049 0.632 l
+156.049 0.885 156.122 1.132 156.27 1.367 c
+156.424 1.602 156.629 1.782 156.887 1.911 c
+157.14 2.036 157.423 2.102 157.739 2.102 c
+158.247 2.102 158.636 1.973 158.9 1.72 c
+159.166 1.473 159.297 1.105 159.297 0.617 c
+159.297 -1.881 l
+159.305 -2.264 159.36 -2.598 159.459 -2.881 c
+159.459 -2.955 l
+h
+157.533 -2.308 m
+157.728 -2.308 157.916 -2.257 158.092 -2.147 c
+158.276 -2.029 158.408 -1.893 158.489 -1.735 c
+158.489 -0.544 l
+158.034 -0.544 l
+157.651 -0.555 157.346 -0.643 157.122 -0.809 c
+156.895 -0.977 156.784 -1.206 156.784 -1.5 c
+156.784 -1.786 156.835 -1.992 156.945 -2.117 c
+157.063 -2.246 157.258 -2.308 157.533 -2.308 c
+161.252 -2.955 -0.808 4.968 re
+161.311 3.337 m
+161.311 3.197 161.271 3.079 161.194 2.984 c
+161.124 2.896 161.01 2.851 160.856 2.851 c
+160.698 2.851 160.581 2.896 160.503 2.984 c
+160.433 3.079 160.4 3.197 160.4 3.337 c
+160.4 3.472 160.433 3.586 160.503 3.675 c
+160.581 3.77 160.694 3.821 160.841 3.821 c
+160.995 3.821 161.113 3.77 161.194 3.675 c
+161.271 3.586 161.311 3.472 161.311 3.337 c
+163.314 -2.955 -0.809 7.056 re
+167.055 -2.955 m
+167.004 -2.849 166.971 -2.668 166.952 -2.411 c
+166.665 -2.833 166.298 -3.043 165.85 -3.043 c
+165.398 -3.043 165.045 -2.922 164.791 -2.675 c
+164.545 -2.422 164.424 -2.066 164.424 -1.602 c
+164.424 -1.095 164.593 -0.691 164.938 -0.397 c
+165.28 -0.103 165.751 0.047 166.349 0.058 c
+166.937 0.058 l
+166.937 0.588 l
+166.937 0.882 166.867 1.091 166.732 1.22 c
+166.603 1.344 166.408 1.411 166.144 1.411 c
+165.898 1.411 165.695 1.338 165.541 1.19 c
+165.394 1.043 165.321 0.856 165.321 0.632 c
+164.498 0.632 l
+164.498 0.885 164.571 1.132 164.718 1.367 c
+164.872 1.602 165.078 1.782 165.335 1.911 c
+165.589 2.036 165.872 2.102 166.188 2.102 c
+166.695 2.102 167.085 1.973 167.349 1.72 c
+167.613 1.473 167.746 1.105 167.746 0.617 c
+167.746 -1.881 l
+167.754 -2.264 167.808 -2.598 167.908 -2.881 c
+167.908 -2.955 l
+h
+165.982 -2.308 m
+166.177 -2.308 166.364 -2.257 166.541 -2.147 c
+166.724 -2.029 166.856 -1.893 166.937 -1.735 c
+166.937 -0.544 l
+166.482 -0.544 l
+166.1 -0.555 165.795 -0.643 165.57 -0.809 c
+165.342 -0.977 165.232 -1.206 165.232 -1.5 c
+165.232 -1.786 165.284 -1.992 165.394 -2.117 c
+165.512 -2.246 165.707 -2.308 165.982 -2.308 c
+172.421 -0.706 m
+172.421 -1.482 172.277 -2.066 171.994 -2.455 c
+171.718 -2.849 171.318 -3.043 170.788 -3.043 c
+170.266 -3.043 169.877 -2.818 169.612 -2.367 c
+169.568 -2.955 l
+168.834 -2.955 l
+168.834 4.101 l
+169.642 4.101 l
+169.642 1.469 l
+169.907 1.888 170.289 2.102 170.788 2.102 c
+171.325 2.102 171.733 1.911 172.009 1.529 c
+172.28 1.146 172.421 0.562 172.421 -0.221 c
+h
+171.612 -0.25 m
+171.612 0.338 171.527 0.753 171.362 0.999 c
+171.204 1.253 170.939 1.381 170.568 1.381 c
+170.156 1.381 169.848 1.153 169.642 0.706 c
+169.642 -1.661 l
+169.836 -2.103 170.149 -2.323 170.582 -2.323 c
+170.943 -2.323 171.204 -2.198 171.362 -1.941 c
+171.527 -1.687 171.612 -1.29 171.612 -0.75 c
+h
+174.162 -2.955 -0.808 7.056 re
+177.124 -3.043 m
+176.506 -3.043 176.028 -2.863 175.698 -2.5 c
+175.375 -2.128 175.205 -1.584 175.199 -0.867 c
+175.199 -0.265 l
+175.199 0.47 175.36 1.047 175.683 1.469 c
+176.007 1.888 176.455 2.102 177.036 2.102 c
+177.613 2.102 178.042 1.914 178.329 1.543 c
+178.623 1.18 178.773 0.606 178.785 -0.177 c
+178.785 -0.706 l
+176.007 -0.706 l
+176.007 -0.823 l
+176.007 -1.364 176.103 -1.757 176.301 -1.999 c
+176.506 -2.234 176.793 -2.352 177.168 -2.352 c
+177.41 -2.352 177.624 -2.308 177.8 -2.22 c
+177.984 -2.132 178.156 -1.992 178.314 -1.794 c
+178.74 -2.308 l
+178.388 -2.801 177.848 -3.043 177.124 -3.043 c
+177.036 1.411 m
+176.701 1.411 176.452 1.294 176.286 1.058 c
+176.117 0.83 176.026 0.474 176.007 -0.015 c
+177.962 -0.015 l
+177.962 0.103 l
+177.94 0.573 177.859 0.904 177.712 1.103 c
+177.565 1.308 177.337 1.411 177.036 1.411 c
+182.769 -2.955 -0.809 4.968 re
+182.827 3.337 m
+182.827 3.197 182.787 3.079 182.709 2.984 c
+182.64 2.896 182.526 2.851 182.372 2.851 c
+182.214 2.851 182.096 2.896 182.019 2.984 c
+181.948 3.079 181.915 3.197 181.915 3.337 c
+181.915 3.472 181.948 3.586 182.019 3.675 c
+182.096 3.77 182.21 3.821 182.357 3.821 c
+182.511 3.821 182.629 3.77 182.709 3.675 c
+182.787 3.586 182.827 3.472 182.827 3.337 c
+184.716 2.013 m
+184.745 1.484 l
+185.058 1.896 185.458 2.102 185.95 2.102 c
+186.833 2.102 187.277 1.517 187.288 0.353 c
+187.288 -2.955 l
+186.48 -2.955 l
+186.48 0.309 l
+186.48 0.698 186.414 0.974 186.289 1.132 c
+186.16 1.297 185.965 1.381 185.701 1.381 c
+185.495 1.381 185.312 1.311 185.157 1.176 c
+184.999 1.047 184.87 0.874 184.774 0.661 c
+184.774 -2.955 l
+183.951 -2.955 l
+183.951 2.013 l
+h
+191.706 3.219 m
+191.706 2.013 l
+192.455 2.013 l
+192.455 1.352 l
+191.706 1.352 l
+191.706 -1.72 l
+191.706 -1.918 191.735 -2.07 191.793 -2.176 c
+191.86 -2.275 191.974 -2.323 192.132 -2.323 c
+192.238 -2.323 192.345 -2.305 192.455 -2.264 c
+192.44 -2.955 l
+192.264 -3.013 192.076 -3.043 191.882 -3.043 c
+191.558 -3.043 191.313 -2.933 191.147 -2.705 c
+190.978 -2.469 190.897 -2.147 190.897 -1.735 c
+190.897 1.352 l
+190.133 1.352 l
+190.133 2.013 l
+190.897 2.013 l
+190.897 3.219 l
+h
+194.12 1.499 m
+194.421 1.899 194.814 2.102 195.296 2.102 c
+196.177 2.102 196.622 1.517 196.633 0.353 c
+196.633 -2.955 l
+195.824 -2.955 l
+195.824 0.309 l
+195.824 0.698 195.758 0.974 195.633 1.132 c
+195.505 1.297 195.311 1.381 195.045 1.381 c
+194.84 1.381 194.656 1.311 194.502 1.176 c
+194.344 1.047 194.216 0.874 194.12 0.661 c
+194.12 -2.955 l
+193.297 -2.955 l
+193.297 4.101 l
+194.12 4.101 l
+h
+199.433 -3.043 m
+198.816 -3.043 198.338 -2.863 198.008 -2.5 c
+197.684 -2.128 197.515 -1.584 197.508 -0.867 c
+197.508 -0.265 l
+197.508 0.47 197.669 1.047 197.993 1.469 c
+198.316 1.888 198.764 2.102 199.346 2.102 c
+199.922 2.102 200.352 1.914 200.639 1.543 c
+200.933 1.18 201.083 0.606 201.094 -0.177 c
+201.094 -0.706 l
+198.316 -0.706 l
+198.316 -0.823 l
+198.316 -1.364 198.411 -1.757 198.61 -1.999 c
+198.816 -2.234 199.103 -2.352 199.477 -2.352 c
+199.72 -2.352 199.933 -2.308 200.109 -2.22 c
+200.293 -2.132 200.466 -1.992 200.624 -1.794 c
+201.05 -2.308 l
+200.697 -2.801 200.157 -3.043 199.433 -3.043 c
+199.346 1.411 m
+199.011 1.411 198.761 1.294 198.596 1.058 c
+198.426 0.83 198.334 0.474 198.316 -0.015 c
+200.271 -0.015 l
+200.271 0.103 l
+200.25 0.573 200.169 0.904 200.021 1.103 c
+199.874 1.308 199.647 1.411 199.346 1.411 c
+206.621 -1.676 m
+206.621 -1.511 206.552 -1.364 206.415 -1.235 c
+206.287 -1.11 206.033 -0.963 205.651 -0.794 c
+205.218 -0.611 204.909 -0.452 204.725 -0.324 c
+204.549 -0.198 204.416 -0.055 204.329 0.103 c
+204.24 0.268 204.196 0.463 204.196 0.691 c
+204.196 1.103 204.343 1.44 204.637 1.705 c
+204.931 1.969 205.306 2.102 205.769 2.102 c
+206.257 2.102 206.65 1.959 206.945 1.675 c
+207.238 1.4 207.386 1.043 207.386 0.602 c
+206.577 0.602 l
+206.577 0.827 206.496 1.018 206.342 1.176 c
+206.195 1.33 206.004 1.411 205.769 1.411 c
+205.534 1.411 205.346 1.344 205.21 1.22 c
+205.071 1.103 205.004 0.933 205.004 0.72 c
+205.004 0.551 205.052 0.419 205.151 0.323 c
+205.247 0.224 205.49 0.091 205.871 -0.073 c
+206.478 -0.309 206.889 -0.541 207.107 -0.765 c
+207.319 -0.992 207.429 -1.276 207.429 -1.617 c
+207.429 -2.051 207.275 -2.396 206.974 -2.66 c
+206.68 -2.918 206.283 -3.043 205.783 -3.043 c
+205.272 -3.043 204.857 -2.896 204.534 -2.602 c
+204.21 -2.308 204.049 -1.933 204.049 -1.47 c
+204.872 -1.47 l
+204.879 -1.746 204.964 -1.962 205.122 -2.117 c
+205.276 -2.275 205.497 -2.352 205.783 -2.352 c
+206.055 -2.352 206.261 -2.293 206.401 -2.176 c
+206.548 -2.051 206.621 -1.881 206.621 -1.676 c
+209.378 3.219 m
+209.378 2.013 l
+210.127 2.013 l
+210.127 1.352 l
+209.378 1.352 l
+209.378 -1.72 l
+209.378 -1.918 209.407 -2.07 209.465 -2.176 c
+209.532 -2.275 209.646 -2.323 209.804 -2.323 c
+209.91 -2.323 210.016 -2.305 210.127 -2.264 c
+210.112 -2.955 l
+209.935 -3.013 209.748 -3.043 209.553 -3.043 c
+209.23 -3.043 208.984 -2.933 208.819 -2.705 c
+208.649 -2.469 208.569 -2.147 208.569 -1.735 c
+208.569 1.352 l
+207.805 1.352 l
+207.805 2.013 l
+208.569 2.013 l
+208.569 3.219 l
+h
+213.526 -2.955 m
+213.474 -2.849 213.442 -2.668 213.423 -2.411 c
+213.137 -2.833 212.769 -3.043 212.321 -3.043 c
+211.869 -3.043 211.516 -2.922 211.263 -2.675 c
+211.016 -2.422 210.895 -2.066 210.895 -1.602 c
+210.895 -1.095 211.064 -0.691 211.41 -0.397 c
+211.751 -0.103 212.221 0.047 212.821 0.058 c
+213.409 0.058 l
+213.409 0.588 l
+213.409 0.882 213.339 1.091 213.203 1.22 c
+213.074 1.344 212.879 1.411 212.615 1.411 c
+212.368 1.411 212.167 1.338 212.012 1.19 c
+211.865 1.043 211.792 0.856 211.792 0.632 c
+210.968 0.632 l
+210.968 0.885 211.042 1.132 211.188 1.367 c
+211.344 1.602 211.549 1.782 211.807 1.911 c
+212.06 2.036 212.343 2.102 212.659 2.102 c
+213.166 2.102 213.555 1.973 213.82 1.72 c
+214.085 1.473 214.217 1.105 214.217 0.617 c
+214.217 -1.881 l
+214.224 -2.264 214.28 -2.598 214.378 -2.881 c
+214.378 -2.955 l
+h
+212.453 -2.308 m
+212.648 -2.308 212.835 -2.257 213.012 -2.147 c
+213.195 -2.029 213.328 -1.893 213.409 -1.735 c
+213.409 -0.544 l
+212.952 -0.544 l
+212.57 -0.555 212.266 -0.643 212.042 -0.809 c
+211.814 -0.977 211.703 -1.206 211.703 -1.5 c
+211.703 -1.786 211.755 -1.992 211.865 -2.117 c
+211.982 -2.246 212.177 -2.308 212.453 -2.308 c
+216.054 2.013 m
+216.084 1.484 l
+216.396 1.896 216.796 2.102 217.289 2.102 c
+218.171 2.102 218.616 1.517 218.627 0.353 c
+218.627 -2.955 l
+217.818 -2.955 l
+217.818 0.309 l
+217.818 0.698 217.752 0.974 217.627 1.132 c
+217.499 1.297 217.303 1.381 217.039 1.381 c
+216.833 1.381 216.649 1.311 216.495 1.176 c
+216.337 1.047 216.208 0.874 216.113 0.661 c
+216.113 -2.955 l
+215.29 -2.955 l
+215.29 2.013 l
+h
+219.505 -0.25 m
+219.505 0.521 219.645 1.105 219.931 1.499 c
+220.214 1.899 220.626 2.102 221.166 2.102 c
+221.636 2.102 222.004 1.911 222.268 1.529 c
+222.268 4.101 l
+223.092 4.101 l
+223.092 -2.955 l
+222.342 -2.955 l
+222.298 -2.425 l
+222.033 -2.837 221.654 -3.043 221.166 -3.043 c
+220.644 -3.043 220.24 -2.849 219.946 -2.455 c
+219.652 -2.055 219.505 -1.484 219.505 -0.75 c
+h
+220.314 -0.706 m
+220.314 -1.264 220.395 -1.676 220.563 -1.941 c
+220.729 -2.198 220.997 -2.323 221.372 -2.323 c
+221.772 -2.323 222.07 -2.124 222.268 -1.72 c
+222.268 0.793 l
+222.062 1.182 221.761 1.381 221.372 1.381 c
+220.997 1.381 220.729 1.249 220.563 0.985 c
+220.395 0.727 220.314 0.33 220.314 -0.206 c
+h
+226.704 -2.955 m
+226.652 -2.849 226.619 -2.668 226.601 -2.411 c
+226.315 -2.833 225.947 -3.043 225.498 -3.043 c
+225.047 -3.043 224.694 -2.922 224.44 -2.675 c
+224.194 -2.422 224.073 -2.066 224.073 -1.602 c
+224.073 -1.095 224.241 -0.691 224.587 -0.397 c
+224.929 -0.103 225.399 0.047 225.999 0.058 c
+226.587 0.058 l
+226.587 0.588 l
+226.587 0.882 226.516 1.091 226.38 1.22 c
+226.252 1.344 226.057 1.411 225.793 1.411 c
+225.546 1.411 225.344 1.338 225.19 1.19 c
+225.043 1.043 224.969 0.856 224.969 0.632 c
+224.146 0.632 l
+224.146 0.885 224.22 1.132 224.366 1.367 c
+224.521 1.602 224.727 1.782 224.984 1.911 c
+225.237 2.036 225.521 2.102 225.837 2.102 c
+226.344 2.102 226.733 1.973 226.998 1.72 c
+227.262 1.473 227.395 1.105 227.395 0.617 c
+227.395 -1.881 l
+227.402 -2.264 227.457 -2.598 227.556 -2.881 c
+227.556 -2.955 l
+h
+225.631 -2.308 m
+225.825 -2.308 226.013 -2.257 226.19 -2.147 c
+226.373 -2.029 226.506 -1.893 226.587 -1.735 c
+226.587 -0.544 l
+226.13 -0.544 l
+225.748 -0.555 225.443 -0.643 225.22 -0.809 c
+224.991 -0.977 224.881 -1.206 224.881 -1.5 c
+224.881 -1.786 224.933 -1.992 225.043 -2.117 c
+225.16 -2.246 225.355 -2.308 225.631 -2.308 c
+230.525 1.249 m
+230.408 1.267 230.283 1.278 230.159 1.278 c
+229.735 1.278 229.445 1.051 229.291 0.602 c
+229.291 -2.955 l
+228.468 -2.955 l
+228.468 2.013 l
+229.261 2.013 l
+229.276 1.514 l
+229.49 1.903 229.798 2.102 230.202 2.102 c
+230.327 2.102 230.437 2.08 230.525 2.043 c
+h
+230.97 -0.25 m
+230.97 0.521 231.11 1.105 231.396 1.499 c
+231.68 1.899 232.091 2.102 232.631 2.102 c
+233.101 2.102 233.469 1.911 233.733 1.529 c
+233.733 4.101 l
+234.556 4.101 l
+234.556 -2.955 l
+233.807 -2.955 l
+233.763 -2.425 l
+233.498 -2.837 233.12 -3.043 232.631 -3.043 c
+232.11 -3.043 231.705 -2.849 231.412 -2.455 c
+231.117 -2.055 230.97 -1.484 230.97 -0.75 c
+h
+231.778 -0.706 m
+231.778 -1.264 231.859 -1.676 232.029 -1.941 c
+232.194 -2.198 232.462 -2.323 232.837 -2.323 c
+233.238 -2.323 233.535 -2.124 233.733 -1.72 c
+233.733 0.793 l
+233.528 1.182 233.226 1.381 232.837 1.381 c
+232.462 1.381 232.194 1.249 232.029 0.985 c
+231.859 0.727 231.778 0.33 231.778 -0.206 c
+h
+f
+Q
+q 1 0 0 1 538.5375 394.9912 cm
+0 0 m
+0 0.166 -0.071 0.312 -0.206 0.441 c
+-0.335 0.566 -0.588 0.713 -0.971 0.882 c
+-1.405 1.066 -1.713 1.224 -1.896 1.353 c
+-2.073 1.478 -2.205 1.621 -2.294 1.779 c
+-2.382 1.945 -2.426 2.139 -2.426 2.367 c
+-2.426 2.779 -2.278 3.117 -1.985 3.381 c
+-1.69 3.645 -1.316 3.778 -0.853 3.778 c
+-0.364 3.778 0.029 3.635 0.323 3.352 c
+0.617 3.076 0.764 2.72 0.764 2.278 c
+-0.044 2.278 l
+-0.044 2.503 -0.125 2.694 -0.279 2.852 c
+-0.427 3.007 -0.618 3.088 -0.853 3.088 c
+-1.088 3.088 -1.276 3.021 -1.411 2.897 c
+-1.551 2.779 -1.617 2.61 -1.617 2.396 c
+-1.617 2.228 -1.569 2.095 -1.47 1.999 c
+-1.374 1.9 -1.133 1.768 -0.75 1.603 c
+-0.144 1.368 0.268 1.135 0.484 0.912 c
+0.698 0.684 0.808 0.401 0.808 0.059 c
+0.808 -0.374 0.654 -0.72 0.353 -0.984 c
+0.058 -1.242 -0.339 -1.367 -0.838 -1.367 c
+-1.349 -1.367 -1.764 -1.219 -2.087 -0.926 c
+-2.411 -0.631 -2.573 -0.257 -2.573 0.206 c
+-1.75 0.206 l
+-1.742 -0.07 -1.658 -0.286 -1.5 -0.44 c
+-1.345 -0.598 -1.125 -0.675 -0.838 -0.675 c
+-0.566 -0.675 -0.36 -0.617 -0.221 -0.5 c
+-0.074 -0.374 0 -0.205 0 0 c
+3.05 0.074 m
+3.946 3.69 l
+4.814 3.69 l
+3.182 -1.984 l
+3.064 -2.403 2.892 -2.726 2.667 -2.954 c
+2.439 -3.179 2.186 -3.293 1.903 -3.293 c
+1.793 -3.293 1.657 -3.266 1.491 -3.218 c
+1.491 -2.528 l
+1.668 -2.543 l
+1.903 -2.543 2.083 -2.484 2.212 -2.366 c
+2.348 -2.256 2.454 -2.065 2.535 -1.793 c
+2.697 -1.234 l
+1.242 3.69 l
+2.123 3.69 l
+h
+7.867 0 m
+7.867 0.166 7.798 0.312 7.661 0.441 c
+7.532 0.566 7.279 0.713 6.898 0.882 c
+6.464 1.066 6.155 1.224 5.971 1.353 c
+5.795 1.478 5.662 1.621 5.574 1.779 c
+5.486 1.945 5.442 2.139 5.442 2.367 c
+5.442 2.779 5.589 3.117 5.882 3.381 c
+6.177 3.645 6.551 3.778 7.015 3.778 c
+7.503 3.778 7.897 3.635 8.191 3.352 c
+8.485 3.076 8.631 2.72 8.631 2.278 c
+7.823 2.278 l
+7.823 2.503 7.742 2.694 7.588 2.852 c
+7.441 3.007 7.25 3.088 7.015 3.088 c
+6.78 3.088 6.592 3.021 6.456 2.897 c
+6.316 2.779 6.25 2.61 6.25 2.396 c
+6.25 2.228 6.298 2.095 6.397 1.999 c
+6.493 1.9 6.736 1.768 7.118 1.603 c
+7.723 1.368 8.136 1.135 8.352 0.912 c
+8.565 0.684 8.676 0.401 8.676 0.059 c
+8.676 -0.374 8.521 -0.72 8.22 -0.984 c
+7.926 -1.242 7.529 -1.367 7.029 -1.367 c
+6.518 -1.367 6.104 -1.219 5.78 -0.926 c
+5.456 -0.631 5.294 -0.257 5.294 0.206 c
+6.118 0.206 l
+6.125 -0.07 6.21 -0.286 6.368 -0.44 c
+6.522 -0.598 6.742 -0.675 7.029 -0.675 c
+7.301 -0.675 7.507 -0.617 7.646 -0.5 c
+7.794 -0.374 7.867 -0.205 7.867 0 c
+10.624 4.896 m
+10.624 3.69 l
+11.373 3.69 l
+11.373 3.028 l
+10.624 3.028 l
+10.624 -0.043 l
+10.624 -0.242 10.653 -0.393 10.711 -0.5 c
+10.778 -0.598 10.892 -0.646 11.05 -0.646 c
+11.156 -0.646 11.263 -0.628 11.373 -0.588 c
+11.359 -1.278 l
+11.182 -1.337 10.994 -1.367 10.8 -1.367 c
+10.476 -1.367 10.231 -1.257 10.065 -1.028 c
+9.896 -0.793 9.815 -0.47 9.815 -0.058 c
+9.815 3.028 l
+9.051 3.028 l
+9.051 3.69 l
+9.815 3.69 l
+9.815 4.896 l
+h
+13.994 -1.367 m
+13.375 -1.367 12.898 -1.186 12.567 -0.823 c
+12.244 -0.452 12.074 0.092 12.068 0.809 c
+12.068 1.411 l
+12.068 2.147 12.23 2.723 12.552 3.146 c
+12.876 3.564 13.325 3.778 13.905 3.778 c
+14.482 3.778 14.912 3.591 15.199 3.219 c
+15.492 2.856 15.643 2.282 15.654 1.5 c
+15.654 0.971 l
+12.876 0.971 l
+12.876 0.853 l
+12.876 0.312 12.972 -0.081 13.17 -0.323 c
+13.375 -0.558 13.662 -0.675 14.037 -0.675 c
+14.279 -0.675 14.493 -0.631 14.669 -0.544 c
+14.853 -0.455 15.026 -0.316 15.184 -0.118 c
+15.61 -0.631 l
+15.257 -1.124 14.717 -1.367 13.994 -1.367 c
+13.905 3.088 m
+13.57 3.088 13.321 2.97 13.155 2.735 c
+12.986 2.506 12.895 2.151 12.876 1.661 c
+14.831 1.661 l
+14.831 1.779 l
+14.809 2.249 14.728 2.58 14.581 2.779 c
+14.434 2.984 14.206 3.088 13.905 3.088 c
+17.212 3.69 m
+17.242 3.234 l
+17.543 3.595 17.94 3.778 18.432 3.778 c
+18.991 3.778 19.376 3.535 19.594 3.057 c
+19.906 3.535 20.344 3.778 20.901 3.778 c
+21.82 3.778 22.291 3.209 22.312 2.073 c
+22.312 -1.278 l
+21.504 -1.278 l
+21.504 1.999 l
+21.504 2.352 21.435 2.617 21.298 2.793 c
+21.169 2.97 20.953 3.057 20.652 3.057 c
+20.406 3.057 20.203 2.962 20.049 2.779 c
+19.902 2.591 19.814 2.352 19.785 2.058 c
+19.785 -1.278 l
+18.976 -1.278 l
+18.976 2.029 l
+18.965 2.712 18.686 3.057 18.138 3.057 c
+17.726 3.057 17.437 2.852 17.271 2.44 c
+17.271 -1.278 l
+16.463 -1.278 l
+16.463 3.69 l
+h
+28.942 2.926 m
+28.824 2.944 28.699 2.955 28.575 2.955 c
+28.152 2.955 27.862 2.727 27.708 2.278 c
+27.708 -1.278 l
+26.884 -1.278 l
+26.884 3.69 l
+27.677 3.69 l
+27.693 3.19 l
+27.906 3.58 28.215 3.778 28.618 3.778 c
+28.743 3.778 28.853 3.756 28.942 3.72 c
+h
+31.327 -1.367 m
+30.71 -1.367 30.232 -1.186 29.901 -0.823 c
+29.578 -0.452 29.408 0.092 29.401 0.809 c
+29.401 1.411 l
+29.401 2.147 29.563 2.723 29.886 3.146 c
+30.21 3.564 30.658 3.778 31.239 3.778 c
+31.816 3.778 32.246 3.591 32.533 3.219 c
+32.826 2.856 32.977 2.282 32.988 1.5 c
+32.988 0.971 l
+30.21 0.971 l
+30.21 0.853 l
+30.21 0.312 30.305 -0.081 30.503 -0.323 c
+30.71 -0.558 30.996 -0.675 31.371 -0.675 c
+31.614 -0.675 31.827 -0.631 32.003 -0.544 c
+32.186 -0.455 32.36 -0.316 32.518 -0.118 c
+32.944 -0.631 l
+32.591 -1.124 32.051 -1.367 31.327 -1.367 c
+31.239 3.088 m
+30.904 3.088 30.654 2.97 30.489 2.735 c
+30.32 2.506 30.228 2.151 30.21 1.661 c
+32.165 1.661 l
+32.165 1.779 l
+32.142 2.249 32.062 2.58 31.915 2.779 c
+31.768 2.984 31.54 3.088 31.239 3.088 c
+37.383 0.971 m
+37.383 0.184 37.239 -0.404 36.957 -0.793 c
+36.67 -1.176 36.269 -1.367 35.751 -1.367 c
+35.251 -1.367 34.869 -1.182 34.605 -0.808 c
+34.605 -3.189 l
+33.796 -3.189 l
+33.796 3.69 l
+34.532 3.69 l
+34.561 3.146 l
+34.833 3.564 35.226 3.778 35.737 3.778 c
+36.284 3.778 36.692 3.587 36.957 3.205 c
+37.229 2.83 37.372 2.268 37.383 1.515 c
+h
+36.574 1.426 m
+36.574 1.985 36.487 2.396 36.31 2.661 c
+36.14 2.926 35.869 3.057 35.487 3.057 c
+35.093 3.057 34.8 2.866 34.605 2.485 c
+34.605 -0.103 l
+34.8 -0.484 35.097 -0.675 35.502 -0.675 c
+35.862 -0.675 36.126 -0.544 36.296 -0.278 c
+36.472 -0.014 36.564 0.389 36.574 0.941 c
+h
+38.081 1.441 m
+38.081 2.153 38.25 2.723 38.596 3.146 c
+38.948 3.564 39.411 3.778 39.992 3.778 c
+40.569 3.778 41.029 3.572 41.374 3.161 c
+41.727 2.756 41.906 2.198 41.917 1.485 c
+41.917 0.971 l
+41.917 0.243 41.742 -0.33 41.389 -0.749 c
+41.043 -1.161 40.583 -1.367 40.007 -1.367 c
+39.426 -1.367 38.963 -1.168 38.611 -0.764 c
+38.265 -0.353 38.089 0.198 38.081 0.897 c
+h
+38.889 0.971 m
+38.889 0.46 38.985 0.059 39.184 -0.235 c
+39.39 -0.529 39.662 -0.675 40.007 -0.675 c
+40.72 -0.675 41.087 -0.158 41.109 0.882 c
+41.109 1.441 l
+41.109 1.948 41.006 2.352 40.801 2.646 c
+40.602 2.94 40.334 3.088 39.992 3.088 c
+39.658 3.088 39.39 2.94 39.184 2.646 c
+38.985 2.352 38.889 1.948 38.889 1.441 c
+h
+45.203 0 m
+45.203 0.166 45.133 0.312 44.997 0.441 c
+44.869 0.566 44.615 0.713 44.233 0.882 c
+43.799 1.066 43.49 1.224 43.307 1.353 c
+43.13 1.478 42.998 1.621 42.91 1.779 c
+42.822 1.945 42.777 2.139 42.777 2.367 c
+42.777 2.779 42.924 3.117 43.219 3.381 c
+43.512 3.645 43.887 3.778 44.35 3.778 c
+44.839 3.778 45.233 3.635 45.526 3.352 c
+45.821 3.076 45.967 2.72 45.967 2.278 c
+45.158 2.278 l
+45.158 2.503 45.077 2.694 44.923 2.852 c
+44.776 3.007 44.585 3.088 44.35 3.088 c
+44.115 3.088 43.928 3.021 43.791 2.897 c
+43.652 2.779 43.586 2.61 43.586 2.396 c
+43.586 2.228 43.633 2.095 43.733 1.999 c
+43.828 1.9 44.071 1.768 44.453 1.603 c
+45.06 1.368 45.471 1.135 45.688 0.912 c
+45.901 0.684 46.012 0.401 46.012 0.059 c
+46.012 -0.374 45.857 -0.72 45.555 -0.984 c
+45.262 -1.242 44.865 -1.367 44.365 -1.367 c
+43.854 -1.367 43.439 -1.219 43.116 -0.926 c
+42.792 -0.631 42.631 -0.257 42.631 0.206 c
+43.454 0.206 l
+43.461 -0.07 43.546 -0.286 43.704 -0.44 c
+43.858 -0.598 44.078 -0.675 44.365 -0.675 c
+44.637 -0.675 44.842 -0.617 44.982 -0.5 c
+45.129 -0.374 45.203 -0.205 45.203 0 c
+47.768 -1.278 -0.809 4.968 re
+47.826 5.013 m
+47.826 4.873 47.786 4.755 47.709 4.66 c
+47.639 4.572 47.525 4.528 47.371 4.528 c
+47.213 4.528 47.095 4.572 47.018 4.66 c
+46.949 4.755 46.916 4.873 46.916 5.013 c
+46.916 5.149 46.949 5.263 47.018 5.351 c
+47.095 5.446 47.209 5.498 47.356 5.498 c
+47.51 5.498 47.628 5.446 47.709 5.351 c
+47.786 5.263 47.826 5.149 47.826 5.013 c
+50.024 4.896 m
+50.024 3.69 l
+50.774 3.69 l
+50.774 3.028 l
+50.024 3.028 l
+50.024 -0.043 l
+50.024 -0.242 50.054 -0.393 50.112 -0.5 c
+50.178 -0.598 50.292 -0.646 50.45 -0.646 c
+50.557 -0.646 50.664 -0.628 50.774 -0.588 c
+50.759 -1.278 l
+50.583 -1.337 50.395 -1.367 50.201 -1.367 c
+49.877 -1.367 49.631 -1.257 49.466 -1.028 c
+49.297 -0.793 49.216 -0.47 49.216 -0.058 c
+49.216 3.028 l
+48.451 3.028 l
+48.451 3.69 l
+49.216 3.69 l
+49.216 4.896 l
+h
+51.365 1.441 m
+51.365 2.153 51.535 2.723 51.88 3.146 c
+52.233 3.564 52.695 3.778 53.276 3.778 c
+53.854 3.778 54.313 3.572 54.658 3.161 c
+55.011 2.756 55.19 2.198 55.202 1.485 c
+55.202 0.971 l
+55.202 0.243 55.026 -0.33 54.673 -0.749 c
+54.328 -1.161 53.868 -1.367 53.291 -1.367 c
+52.711 -1.367 52.248 -1.168 51.895 -0.764 c
+51.549 -0.353 51.373 0.198 51.365 0.897 c
+h
+52.173 0.971 m
+52.173 0.46 52.269 0.059 52.468 -0.235 c
+52.674 -0.529 52.946 -0.675 53.291 -0.675 c
+54.004 -0.675 54.371 -0.158 54.394 0.882 c
+54.394 1.441 l
+54.394 1.948 54.29 2.352 54.085 2.646 c
+53.887 2.94 53.618 3.088 53.276 3.088 c
+52.942 3.088 52.674 2.94 52.468 2.646 c
+52.269 2.352 52.173 1.948 52.173 1.441 c
+h
+58.116 2.926 m
+57.998 2.944 57.873 2.955 57.748 2.955 c
+57.326 2.955 57.035 2.727 56.881 2.278 c
+56.881 -1.278 l
+56.058 -1.278 l
+56.058 3.69 l
+56.852 3.69 l
+56.867 3.19 l
+57.079 3.58 57.388 3.778 57.792 3.778 c
+57.918 3.778 58.028 3.756 58.116 3.72 c
+h
+60.266 0.074 m
+61.162 3.69 l
+62.03 3.69 l
+60.398 -1.984 l
+60.281 -2.403 60.108 -2.726 59.884 -2.954 c
+59.656 -3.179 59.402 -3.293 59.119 -3.293 c
+59.009 -3.293 58.873 -3.266 58.708 -3.218 c
+58.708 -2.528 l
+58.884 -2.543 l
+59.119 -2.543 59.299 -2.484 59.427 -2.366 c
+59.564 -2.256 59.67 -2.065 59.751 -1.793 c
+59.913 -1.234 l
+58.458 3.69 l
+59.34 3.69 l
+h
+62.239 -0.837 m
+62.239 -0.69 62.284 -0.569 62.371 -0.47 c
+62.459 -0.374 62.585 -0.323 62.754 -0.323 c
+62.93 -0.323 63.062 -0.374 63.15 -0.47 c
+63.246 -0.569 63.298 -0.69 63.298 -0.837 c
+63.298 -0.977 63.246 -1.095 63.15 -1.19 c
+63.062 -1.278 62.93 -1.323 62.754 -1.323 c
+62.585 -1.323 62.459 -1.278 62.371 -1.19 c
+62.284 -1.095 62.239 -0.977 62.239 -0.837 c
+71.426 1.676 m
+69.162 1.676 l
+69.162 -1.278 l
+68.324 -1.278 l
+68.324 5.409 l
+71.809 5.409 l
+71.809 4.69 l
+69.162 4.69 l
+69.162 2.396 l
+71.426 2.396 l
+h
+72.297 1.441 m
+72.297 2.153 72.466 2.723 72.811 3.146 c
+73.164 3.564 73.627 3.778 74.207 3.778 c
+74.785 3.778 75.244 3.572 75.589 3.161 c
+75.942 2.756 76.122 2.198 76.133 1.485 c
+76.133 0.971 l
+76.133 0.243 75.957 -0.33 75.604 -0.749 c
+75.259 -1.161 74.799 -1.367 74.222 -1.367 c
+73.642 -1.367 73.179 -1.168 72.826 -0.764 c
+72.48 -0.353 72.304 0.198 72.297 0.897 c
+h
+73.105 0.971 m
+73.105 0.46 73.201 0.059 73.399 -0.235 c
+73.605 -0.529 73.877 -0.675 74.222 -0.675 c
+74.936 -0.675 75.302 -0.158 75.325 0.882 c
+75.325 1.441 l
+75.325 1.948 75.221 2.352 75.016 2.646 c
+74.818 2.94 74.55 3.088 74.207 3.088 c
+73.873 3.088 73.605 2.94 73.399 2.646 c
+73.201 2.352 73.105 1.948 73.105 1.441 c
+h
+79.051 2.926 m
+78.934 2.944 78.809 2.955 78.683 2.955 c
+78.261 2.955 77.97 2.727 77.816 2.278 c
+77.816 -1.278 l
+76.993 -1.278 l
+76.993 3.69 l
+77.787 3.69 l
+77.802 3.19 l
+78.015 3.58 78.323 3.778 78.728 3.778 c
+78.853 3.778 78.963 3.756 79.051 3.72 c
+h
+85.17 -1.367 m
+84.552 -1.367 84.075 -1.186 83.744 -0.823 c
+83.42 -0.452 83.252 0.092 83.244 0.809 c
+83.244 1.411 l
+83.244 2.147 83.406 2.723 83.729 3.146 c
+84.052 3.564 84.501 3.778 85.081 3.778 c
+85.658 3.778 86.088 3.591 86.375 3.219 c
+86.668 2.856 86.82 2.282 86.83 1.5 c
+86.83 0.971 l
+84.052 0.971 l
+84.052 0.853 l
+84.052 0.312 84.148 -0.081 84.347 -0.323 c
+84.552 -0.558 84.839 -0.675 85.214 -0.675 c
+85.456 -0.675 85.669 -0.631 85.845 -0.544 c
+86.03 -0.455 86.202 -0.316 86.36 -0.118 c
+86.786 -0.631 l
+86.433 -1.124 85.893 -1.367 85.17 -1.367 c
+85.081 3.088 m
+84.747 3.088 84.497 2.97 84.332 2.735 c
+84.162 2.506 84.071 2.151 84.052 1.661 c
+86.007 1.661 l
+86.007 1.779 l
+85.985 2.249 85.905 2.58 85.758 2.779 c
+85.61 2.984 85.382 3.088 85.081 3.088 c
+89.065 1.881 m
+89.918 3.69 l
+90.859 3.69 l
+89.506 1.235 l
+90.888 -1.278 l
+89.961 -1.278 l
+89.08 0.588 l
+88.197 -1.278 l
+87.256 -1.278 l
+88.638 1.235 l
+87.301 3.69 l
+88.227 3.69 l
+h
+94.151 -1.278 m
+94.099 -1.172 94.066 -0.992 94.048 -0.735 c
+93.761 -1.157 93.394 -1.367 92.945 -1.367 c
+92.494 -1.367 92.141 -1.246 91.887 -0.999 c
+91.641 -0.746 91.52 -0.389 91.52 0.074 c
+91.52 0.581 91.688 0.985 92.034 1.279 c
+92.376 1.573 92.846 1.723 93.445 1.735 c
+94.034 1.735 l
+94.034 2.264 l
+94.034 2.558 93.963 2.768 93.827 2.897 c
+93.699 3.021 93.504 3.088 93.24 3.088 c
+92.993 3.088 92.791 3.014 92.636 2.866 c
+92.49 2.72 92.416 2.532 92.416 2.309 c
+91.593 2.309 l
+91.593 2.562 91.667 2.808 91.813 3.043 c
+91.968 3.279 92.174 3.458 92.43 3.587 c
+92.685 3.712 92.968 3.778 93.284 3.778 c
+93.791 3.778 94.18 3.649 94.445 3.396 c
+94.709 3.15 94.842 2.782 94.842 2.294 c
+94.842 -0.205 l
+94.849 -0.588 94.904 -0.922 95.003 -1.205 c
+95.003 -1.278 l
+h
+93.078 -0.631 m
+93.272 -0.631 93.46 -0.58 93.636 -0.47 c
+93.82 -0.353 93.953 -0.216 94.034 -0.058 c
+94.034 1.133 l
+93.577 1.133 l
+93.195 1.121 92.891 1.033 92.666 0.867 c
+92.438 0.699 92.328 0.47 92.328 0.177 c
+92.328 -0.11 92.38 -0.316 92.49 -0.44 c
+92.607 -0.569 92.802 -0.631 93.078 -0.631 c
+96.679 3.69 m
+96.708 3.234 l
+97.01 3.595 97.407 3.778 97.899 3.778 c
+98.458 3.778 98.844 3.535 99.06 3.057 c
+99.372 3.535 99.81 3.778 100.368 3.778 c
+101.287 3.778 101.757 3.209 101.78 2.073 c
+101.78 -1.278 l
+100.971 -1.278 l
+100.971 1.999 l
+100.971 2.352 100.901 2.617 100.765 2.793 c
+100.637 2.97 100.42 3.057 100.118 3.057 c
+99.873 3.057 99.67 2.962 99.516 2.779 c
+99.368 2.591 99.281 2.352 99.251 2.058 c
+99.251 -1.278 l
+98.443 -1.278 l
+98.443 2.029 l
+98.431 2.712 98.152 3.057 97.605 3.057 c
+97.193 3.057 96.903 2.852 96.738 2.44 c
+96.738 -1.278 l
+95.929 -1.278 l
+95.929 3.69 l
+h
+106.306 0.971 m
+106.306 0.184 106.163 -0.404 105.88 -0.793 c
+105.594 -1.176 105.194 -1.367 104.675 -1.367 c
+104.176 -1.367 103.794 -1.182 103.528 -0.808 c
+103.528 -3.189 l
+102.72 -3.189 l
+102.72 3.69 l
+103.455 3.69 l
+103.484 3.146 l
+103.757 3.564 104.149 3.778 104.66 3.778 c
+105.208 3.778 105.616 3.587 105.88 3.205 c
+106.152 2.83 106.296 2.268 106.306 1.515 c
+h
+105.498 1.426 m
+105.498 1.985 105.41 2.396 105.234 2.661 c
+105.065 2.926 104.793 3.057 104.411 3.057 c
+104.018 3.057 103.723 2.866 103.528 2.485 c
+103.528 -0.103 l
+103.723 -0.484 104.021 -0.675 104.425 -0.675 c
+104.785 -0.675 105.05 -0.544 105.219 -0.278 c
+105.396 -0.014 105.487 0.389 105.498 0.941 c
+h
+108.049 -1.278 -0.808 7.056 re
+111.01 -1.367 m
+110.393 -1.367 109.915 -1.186 109.585 -0.823 c
+109.261 -0.452 109.092 0.092 109.085 0.809 c
+109.085 1.411 l
+109.085 2.147 109.246 2.723 109.57 3.146 c
+109.893 3.564 110.342 3.778 110.923 3.778 c
+111.499 3.778 111.929 3.591 112.216 3.219 c
+112.51 2.856 112.66 2.282 112.671 1.5 c
+112.671 0.971 l
+109.893 0.971 l
+109.893 0.853 l
+109.893 0.312 109.988 -0.081 110.187 -0.323 c
+110.393 -0.558 110.68 -0.675 111.054 -0.675 c
+111.297 -0.675 111.511 -0.631 111.686 -0.544 c
+111.87 -0.455 112.043 -0.316 112.201 -0.118 c
+112.627 -0.631 l
+112.274 -1.124 111.734 -1.367 111.01 -1.367 c
+110.923 3.088 m
+110.588 3.088 110.338 2.97 110.173 2.735 c
+110.003 2.506 109.911 2.151 109.893 1.661 c
+111.848 1.661 l
+111.848 1.779 l
+111.827 2.249 111.746 2.58 111.598 2.779 c
+111.451 2.984 111.224 3.088 110.923 3.088 c
+117.992 -1.278 -0.808 4.968 re
+118.052 5.013 m
+118.052 4.873 118.011 4.755 117.934 4.66 c
+117.864 4.572 117.75 4.528 117.595 4.528 c
+117.437 4.528 117.32 4.572 117.242 4.66 c
+117.173 4.755 117.14 4.873 117.14 5.013 c
+117.14 5.149 117.173 5.263 117.242 5.351 c
+117.32 5.446 117.434 5.498 117.581 5.498 c
+117.735 5.498 117.853 5.446 117.934 5.351 c
+118.011 5.263 118.052 5.149 118.052 5.013 c
+119.94 3.69 m
+119.97 3.161 l
+120.282 3.572 120.683 3.778 121.175 3.778 c
+122.057 3.778 122.501 3.194 122.513 2.029 c
+122.513 -1.278 l
+121.704 -1.278 l
+121.704 1.985 l
+121.704 2.374 121.638 2.65 121.513 2.808 c
+121.385 2.974 121.19 3.057 120.925 3.057 c
+120.719 3.057 120.535 2.988 120.381 2.852 c
+120.223 2.723 120.095 2.55 119.999 2.338 c
+119.999 -1.278 l
+119.176 -1.278 l
+119.176 3.69 l
+h
+127.315 -1.278 m
+127.315 5.409 l
+128.918 5.409 l
+129.689 5.409 130.292 5.164 130.725 4.675 c
+131.155 4.183 131.372 3.499 131.372 2.617 c
+131.372 1.5 l
+131.372 0.607 131.152 -0.081 130.711 -0.558 c
+130.277 -1.039 129.645 -1.278 128.815 -1.278 c
+h
+128.153 4.69 m
+128.153 -0.558 l
+128.83 -0.558 l
+129.425 -0.558 129.859 -0.393 130.123 -0.058 c
+130.395 0.283 130.538 0.786 130.549 1.455 c
+130.549 2.646 l
+130.549 3.341 130.41 3.855 130.137 4.19 c
+129.862 4.52 129.454 4.69 128.918 4.69 c
+h
+134.125 -1.367 m
+133.507 -1.367 133.03 -1.186 132.699 -0.823 c
+132.375 -0.452 132.207 0.092 132.199 0.809 c
+132.199 1.411 l
+132.199 2.147 132.361 2.723 132.685 3.146 c
+133.007 3.564 133.456 3.778 134.037 3.778 c
+134.613 3.778 135.043 3.591 135.33 3.219 c
+135.624 2.856 135.775 2.282 135.785 1.5 c
+135.785 0.971 l
+133.007 0.971 l
+133.007 0.853 l
+133.007 0.312 133.103 -0.081 133.302 -0.323 c
+133.507 -0.558 133.794 -0.675 134.169 -0.675 c
+134.411 -0.675 134.625 -0.631 134.801 -0.544 c
+134.985 -0.455 135.157 -0.316 135.315 -0.118 c
+135.742 -0.631 l
+135.388 -1.124 134.848 -1.367 134.125 -1.367 c
+134.037 3.088 m
+133.703 3.088 133.452 2.97 133.287 2.735 c
+133.117 2.506 133.026 2.151 133.007 1.661 c
+134.962 1.661 l
+134.962 1.779 l
+134.941 2.249 134.86 2.58 134.713 2.779 c
+134.566 2.984 134.338 3.088 134.037 3.088 c
+140.181 0.971 m
+140.181 0.195 140.038 -0.389 139.754 -0.779 c
+139.479 -1.172 139.078 -1.367 138.549 -1.367 c
+138.027 -1.367 137.638 -1.142 137.373 -0.69 c
+137.329 -1.278 l
+136.594 -1.278 l
+136.594 5.777 l
+137.403 5.777 l
+137.403 3.146 l
+137.667 3.564 138.05 3.778 138.549 3.778 c
+139.086 3.778 139.494 3.587 139.769 3.205 c
+140.041 2.822 140.181 2.238 140.181 1.455 c
+h
+139.372 1.426 m
+139.372 2.014 139.288 2.429 139.122 2.675 c
+138.964 2.929 138.7 3.057 138.329 3.057 c
+137.917 3.057 137.609 2.83 137.403 2.382 c
+137.403 0.015 l
+137.597 -0.426 137.91 -0.646 138.343 -0.646 c
+138.704 -0.646 138.964 -0.521 139.122 -0.264 c
+139.288 -0.01 139.372 0.387 139.372 0.927 c
+h
+141.927 -1.278 -0.809 4.968 re
+141.985 5.013 m
+141.985 4.873 141.944 4.755 141.867 4.66 c
+141.798 4.572 141.684 4.528 141.53 4.528 c
+141.372 4.528 141.254 4.572 141.177 4.66 c
+141.107 4.755 141.073 4.873 141.073 5.013 c
+141.073 5.149 141.107 5.263 141.177 5.351 c
+141.254 5.446 141.368 5.498 141.514 5.498 c
+141.669 5.498 141.786 5.446 141.867 5.351 c
+141.944 5.263 141.985 5.149 141.985 5.013 c
+145.663 -1.278 m
+145.612 -1.172 145.579 -0.992 145.561 -0.735 c
+145.274 -1.157 144.907 -1.367 144.458 -1.367 c
+144.007 -1.367 143.654 -1.246 143.4 -0.999 c
+143.153 -0.746 143.033 -0.389 143.033 0.074 c
+143.033 0.581 143.201 0.985 143.547 1.279 c
+143.889 1.573 144.359 1.723 144.958 1.735 c
+145.546 1.735 l
+145.546 2.264 l
+145.546 2.558 145.476 2.768 145.34 2.897 c
+145.212 3.021 145.017 3.088 144.753 3.088 c
+144.506 3.088 144.304 3.014 144.149 2.866 c
+144.003 2.72 143.929 2.532 143.929 2.309 c
+143.106 2.309 l
+143.106 2.562 143.18 2.808 143.326 3.043 c
+143.481 3.279 143.687 3.458 143.943 3.587 c
+144.198 3.712 144.481 3.778 144.796 3.778 c
+145.304 3.778 145.693 3.649 145.958 3.396 c
+146.222 3.15 146.355 2.782 146.355 2.294 c
+146.355 -0.205 l
+146.362 -0.588 146.417 -0.922 146.516 -1.205 c
+146.516 -1.278 l
+h
+144.591 -0.631 m
+144.785 -0.631 144.973 -0.58 145.149 -0.47 c
+145.333 -0.353 145.465 -0.216 145.546 -0.058 c
+145.546 1.133 l
+145.09 1.133 l
+144.708 1.121 144.404 1.033 144.179 0.867 c
+143.951 0.699 143.841 0.47 143.841 0.177 c
+143.841 -0.11 143.893 -0.316 144.003 -0.44 c
+144.12 -0.569 144.315 -0.631 144.591 -0.631 c
+148.192 3.69 m
+148.221 3.161 l
+148.533 3.572 148.934 3.778 149.426 3.778 c
+150.309 3.778 150.754 3.194 150.764 2.029 c
+150.764 -1.278 l
+149.956 -1.278 l
+149.956 1.985 l
+149.956 2.374 149.89 2.65 149.765 2.808 c
+149.636 2.974 149.441 3.057 149.177 3.057 c
+148.971 3.057 148.787 2.988 148.633 2.852 c
+148.475 2.723 148.346 2.55 148.25 2.338 c
+148.25 -1.278 l
+147.427 -1.278 l
+147.427 3.69 l
+h
+152.039 -1.851 m
+151.348 -1.851 l
+153.686 5.409 l
+154.376 5.409 l
+h
+159.257 5.409 m
+159.257 0.662 l
+159.257 0.023 159.072 -0.477 158.712 -0.837 c
+158.349 -1.19 157.846 -1.367 157.198 -1.367 c
+156.541 -1.367 156.038 -1.198 155.685 -0.852 c
+155.332 -0.5 155.155 0.004 155.155 0.662 c
+155.155 5.409 l
+155.993 5.409 l
+155.993 0.691 l
+155.993 0.239 156.085 -0.099 156.273 -0.323 c
+156.468 -0.54 156.776 -0.646 157.198 -0.646 c
+157.628 -0.646 157.937 -0.54 158.124 -0.323 c
+158.32 -0.099 158.419 0.239 158.419 0.691 c
+158.419 5.409 l
+h
+163.835 0.971 m
+163.835 0.195 163.691 -0.389 163.409 -0.779 c
+163.134 -1.172 162.733 -1.367 162.203 -1.367 c
+161.682 -1.367 161.293 -1.142 161.027 -0.69 c
+160.984 -1.278 l
+160.248 -1.278 l
+160.248 5.777 l
+161.057 5.777 l
+161.057 3.146 l
+161.322 3.564 161.704 3.778 162.203 3.778 c
+162.74 3.778 163.148 3.587 163.423 3.205 c
+163.695 2.822 163.835 2.238 163.835 1.455 c
+h
+163.026 1.426 m
+163.026 2.014 162.943 2.429 162.777 2.675 c
+162.619 2.929 162.355 3.057 161.983 3.057 c
+161.572 3.057 161.262 2.83 161.057 2.382 c
+161.057 0.015 l
+161.252 -0.426 161.565 -0.646 161.998 -0.646 c
+162.357 -0.646 162.619 -0.521 162.777 -0.264 c
+162.943 -0.01 163.026 0.387 163.026 0.927 c
+h
+167.242 -0.837 m
+166.966 -1.19 166.569 -1.367 166.051 -1.367 c
+165.611 -1.367 165.272 -1.216 165.037 -0.911 c
+164.809 -0.598 164.691 -0.143 164.684 0.456 c
+164.684 3.69 l
+165.492 3.69 l
+165.492 0.515 l
+165.492 -0.261 165.727 -0.646 166.198 -0.646 c
+166.687 -0.646 167.024 -0.426 167.213 0.015 c
+167.213 3.69 l
+168.036 3.69 l
+168.036 -1.278 l
+167.257 -1.278 l
+h
+169.836 3.69 m
+169.866 3.161 l
+170.178 3.572 170.579 3.778 171.071 3.778 c
+171.953 3.778 172.397 3.194 172.408 2.029 c
+172.408 -1.278 l
+171.6 -1.278 l
+171.6 1.985 l
+171.6 2.374 171.534 2.65 171.409 2.808 c
+171.28 2.974 171.086 3.057 170.821 3.057 c
+170.615 3.057 170.431 2.988 170.277 2.852 c
+170.119 2.723 169.991 2.55 169.895 2.338 c
+169.895 -1.278 l
+169.072 -1.278 l
+169.072 3.69 l
+h
+174.518 4.896 m
+174.518 3.69 l
+175.267 3.69 l
+175.267 3.028 l
+174.518 3.028 l
+174.518 -0.043 l
+174.518 -0.242 174.548 -0.393 174.606 -0.5 c
+174.672 -0.598 174.786 -0.646 174.944 -0.646 c
+175.051 -0.646 175.157 -0.628 175.267 -0.588 c
+175.253 -1.278 l
+175.076 -1.337 174.889 -1.367 174.694 -1.367 c
+174.371 -1.367 174.124 -1.257 173.959 -1.028 c
+173.79 -0.793 173.709 -0.47 173.709 -0.058 c
+173.709 3.028 l
+172.945 3.028 l
+172.945 3.69 l
+173.709 3.69 l
+173.709 4.896 l
+h
+178.652 -0.837 m
+178.376 -1.19 177.979 -1.367 177.461 -1.367 c
+177.02 -1.367 176.682 -1.216 176.447 -0.911 c
+176.219 -0.598 176.102 -0.143 176.094 0.456 c
+176.094 3.69 l
+176.902 3.69 l
+176.902 0.515 l
+176.902 -0.261 177.137 -0.646 177.608 -0.646 c
+178.097 -0.646 178.435 -0.426 178.623 0.015 c
+178.623 3.69 l
+179.446 3.69 l
+179.446 -1.278 l
+178.666 -1.278 l
+h
+187.732 0.971 m
+187.732 0.184 187.589 -0.404 187.306 -0.793 c
+187.019 -1.176 186.619 -1.367 186.101 -1.367 c
+185.601 -1.367 185.218 -1.182 184.954 -0.808 c
+184.954 -3.189 l
+184.146 -3.189 l
+184.146 3.69 l
+184.881 3.69 l
+184.91 3.146 l
+185.182 3.564 185.575 3.778 186.086 3.778 c
+186.633 3.778 187.042 3.587 187.306 3.205 c
+187.578 2.83 187.721 2.268 187.732 1.515 c
+h
+186.924 1.426 m
+186.924 1.985 186.836 2.396 186.659 2.661 c
+186.49 2.926 186.218 3.057 185.836 3.057 c
+185.443 3.057 185.149 2.866 184.954 2.485 c
+184.954 -0.103 l
+185.149 -0.484 185.446 -0.675 185.851 -0.675 c
+186.211 -0.675 186.475 -0.544 186.645 -0.278 c
+186.82 -0.014 186.913 0.389 186.924 0.941 c
+h
+189.474 -1.278 -0.809 7.056 re
+192.436 -1.367 m
+191.819 -1.367 191.341 -1.186 191.011 -0.823 c
+190.687 -0.452 190.518 0.092 190.51 0.809 c
+190.51 1.411 l
+190.51 2.147 190.672 2.723 190.995 3.146 c
+191.319 3.564 191.767 3.778 192.347 3.778 c
+192.925 3.778 193.355 3.591 193.641 3.219 c
+193.935 2.856 194.086 2.282 194.097 1.5 c
+194.097 0.971 l
+191.319 0.971 l
+191.319 0.853 l
+191.319 0.312 191.414 -0.081 191.613 -0.323 c
+191.819 -0.558 192.106 -0.675 192.48 -0.675 c
+192.723 -0.675 192.935 -0.631 193.112 -0.544 c
+193.296 -0.455 193.469 -0.316 193.627 -0.118 c
+194.053 -0.631 l
+193.7 -1.124 193.16 -1.367 192.436 -1.367 c
+192.347 3.088 m
+192.013 3.088 191.763 2.97 191.598 2.735 c
+191.429 2.506 191.337 2.151 191.319 1.661 c
+193.274 1.661 l
+193.274 1.779 l
+193.251 2.249 193.17 2.58 193.024 2.779 c
+192.877 2.984 192.649 3.088 192.347 3.088 c
+197.448 -1.278 m
+197.397 -1.172 197.363 -0.992 197.346 -0.735 c
+197.059 -1.157 196.692 -1.367 196.243 -1.367 c
+195.791 -1.367 195.439 -1.246 195.185 -0.999 c
+194.938 -0.746 194.817 -0.389 194.817 0.074 c
+194.817 0.581 194.986 0.985 195.331 1.279 c
+195.674 1.573 196.144 1.723 196.742 1.735 c
+197.33 1.735 l
+197.33 2.264 l
+197.33 2.558 197.261 2.768 197.125 2.897 c
+196.997 3.021 196.802 3.088 196.536 3.088 c
+196.291 3.088 196.089 3.014 195.934 2.866 c
+195.788 2.72 195.714 2.532 195.714 2.309 c
+194.89 2.309 l
+194.89 2.562 194.964 2.808 195.111 3.043 c
+195.266 3.279 195.472 3.458 195.728 3.587 c
+195.982 3.712 196.265 3.778 196.581 3.778 c
+197.088 3.778 197.477 3.649 197.742 3.396 c
+198.007 3.15 198.139 2.782 198.139 2.294 c
+198.139 -0.205 l
+198.146 -0.588 198.202 -0.922 198.301 -1.205 c
+198.301 -1.278 l
+h
+196.376 -0.631 m
+196.57 -0.631 196.758 -0.58 196.933 -0.47 c
+197.118 -0.353 197.25 -0.216 197.33 -0.058 c
+197.33 1.133 l
+196.875 1.133 l
+196.493 1.121 196.187 1.033 195.964 0.867 c
+195.736 0.699 195.626 0.47 195.626 0.177 c
+195.626 -0.11 195.677 -0.316 195.788 -0.44 c
+195.905 -0.569 196.1 -0.631 196.376 -0.631 c
+201.637 0 m
+201.637 0.166 201.568 0.312 201.432 0.441 c
+201.303 0.566 201.049 0.713 200.667 0.882 c
+200.234 1.066 199.925 1.224 199.742 1.353 c
+199.565 1.478 199.433 1.621 199.345 1.779 c
+199.256 1.945 199.212 2.139 199.212 2.367 c
+199.212 2.779 199.359 3.117 199.653 3.381 c
+199.948 3.645 200.322 3.778 200.785 3.778 c
+201.274 3.778 201.667 3.635 201.961 3.352 c
+202.255 3.076 202.402 2.72 202.402 2.278 c
+201.594 2.278 l
+201.594 2.503 201.513 2.694 201.359 2.852 c
+201.211 3.007 201.02 3.088 200.785 3.088 c
+200.55 3.088 200.362 3.021 200.226 2.897 c
+200.087 2.779 200.021 2.61 200.021 2.396 c
+200.021 2.228 200.068 2.095 200.168 1.999 c
+200.263 1.9 200.505 1.768 200.888 1.603 c
+201.494 1.368 201.906 1.135 202.123 0.912 c
+202.336 0.684 202.446 0.401 202.446 0.059 c
+202.446 -0.374 202.292 -0.72 201.99 -0.984 c
+201.696 -1.242 201.299 -1.367 200.8 -1.367 c
+200.289 -1.367 199.873 -1.219 199.551 -0.926 c
+199.227 -0.631 199.065 -0.257 199.065 0.206 c
+199.888 0.206 l
+199.896 -0.07 199.981 -0.286 200.139 -0.44 c
+200.293 -0.598 200.513 -0.675 200.8 -0.675 c
+201.072 -0.675 201.278 -0.617 201.417 -0.5 c
+201.564 -0.374 201.637 -0.205 201.637 0 c
+205.099 -1.367 m
+204.482 -1.367 204.004 -1.186 203.673 -0.823 c
+203.35 -0.452 203.181 0.092 203.173 0.809 c
+203.173 1.411 l
+203.173 2.147 203.335 2.723 203.659 3.146 c
+203.982 3.564 204.43 3.778 205.011 3.778 c
+205.588 3.778 206.018 3.591 206.304 3.219 c
+206.599 2.856 206.749 2.282 206.76 1.5 c
+206.76 0.971 l
+203.982 0.971 l
+203.982 0.853 l
+203.982 0.312 204.077 -0.081 204.276 -0.323 c
+204.482 -0.558 204.768 -0.675 205.143 -0.675 c
+205.386 -0.675 205.599 -0.631 205.775 -0.544 c
+205.959 -0.455 206.132 -0.316 206.29 -0.118 c
+206.716 -0.631 l
+206.363 -1.124 205.823 -1.367 205.099 -1.367 c
+205.011 3.088 m
+204.677 3.088 204.426 2.97 204.261 2.735 c
+204.092 2.506 204 2.151 203.982 1.661 c
+205.937 1.661 l
+205.937 1.779 l
+205.915 2.249 205.834 2.58 205.687 2.779 c
+205.54 2.984 205.313 3.088 205.011 3.088 c
+212.276 4.896 m
+212.276 3.69 l
+213.026 3.69 l
+213.026 3.028 l
+212.276 3.028 l
+212.276 -0.043 l
+212.276 -0.242 212.305 -0.393 212.364 -0.5 c
+212.43 -0.598 212.544 -0.646 212.702 -0.646 c
+212.808 -0.646 212.916 -0.628 213.026 -0.588 c
+213.011 -1.278 l
+212.835 -1.337 212.648 -1.367 212.452 -1.367 c
+212.129 -1.367 211.883 -1.257 211.717 -1.028 c
+211.549 -0.793 211.468 -0.47 211.468 -0.058 c
+211.468 3.028 l
+210.703 3.028 l
+210.703 3.69 l
+211.468 3.69 l
+211.468 4.896 l
+h
+215.235 0.074 m
+216.131 3.69 l
+216.998 3.69 l
+215.366 -1.984 l
+215.249 -2.403 215.077 -2.726 214.852 -2.954 c
+214.624 -3.179 214.371 -3.293 214.088 -3.293 c
+213.978 -3.293 213.841 -3.266 213.676 -3.218 c
+213.676 -2.528 l
+213.853 -2.543 l
+214.088 -2.543 214.268 -2.484 214.396 -2.366 c
+214.532 -2.256 214.639 -2.065 214.72 -1.793 c
+214.881 -1.234 l
+213.427 3.69 l
+214.308 3.69 l
+h
+221.224 0.971 m
+221.224 0.184 221.08 -0.404 220.798 -0.793 c
+220.511 -1.176 220.11 -1.367 219.592 -1.367 c
+219.093 -1.367 218.711 -1.182 218.446 -0.808 c
+218.446 -3.189 l
+217.637 -3.189 l
+217.637 3.69 l
+218.372 3.69 l
+218.402 3.146 l
+218.674 3.564 219.067 3.778 219.578 3.778 c
+220.126 3.778 220.533 3.587 220.798 3.205 c
+221.07 2.83 221.213 2.268 221.224 1.515 c
+h
+220.415 1.426 m
+220.415 1.985 220.328 2.396 220.151 2.661 c
+219.982 2.926 219.71 3.057 219.328 3.057 c
+218.935 3.057 218.641 2.866 218.446 2.485 c
+218.446 -0.103 l
+218.641 -0.484 218.938 -0.675 219.343 -0.675 c
+219.703 -0.675 219.967 -0.544 220.136 -0.278 c
+220.313 -0.014 220.405 0.389 220.415 0.941 c
+h
+223.862 -1.367 m
+223.245 -1.367 222.767 -1.186 222.437 -0.823 c
+222.113 -0.452 221.944 0.092 221.936 0.809 c
+221.936 1.411 l
+221.936 2.147 222.098 2.723 222.422 3.146 c
+222.745 3.564 223.193 3.778 223.775 3.778 c
+224.351 3.778 224.781 3.591 225.068 3.219 c
+225.362 2.856 225.512 2.282 225.523 1.5 c
+225.523 0.971 l
+222.745 0.971 l
+222.745 0.853 l
+222.745 0.312 222.84 -0.081 223.039 -0.323 c
+223.245 -0.558 223.532 -0.675 223.906 -0.675 c
+224.149 -0.675 224.363 -0.631 224.539 -0.544 c
+224.722 -0.455 224.895 -0.316 225.053 -0.118 c
+225.479 -0.631 l
+225.126 -1.124 224.586 -1.367 223.862 -1.367 c
+223.775 3.088 m
+223.44 3.088 223.19 2.97 223.025 2.735 c
+222.856 2.506 222.763 2.151 222.745 1.661 c
+224.7 1.661 l
+224.7 1.779 l
+224.679 2.249 224.598 2.58 224.45 2.779 c
+224.303 2.984 224.076 3.088 223.775 3.088 c
+230.848 -1.278 -0.808 4.968 re
+230.907 5.013 m
+230.907 4.873 230.867 4.755 230.79 4.66 c
+230.719 4.572 230.605 4.528 230.451 4.528 c
+230.293 4.528 230.175 4.572 230.098 4.66 c
+230.029 4.755 229.996 4.873 229.996 5.013 c
+229.996 5.149 230.029 5.263 230.098 5.351 c
+230.175 5.446 230.289 5.498 230.437 5.498 c
+230.591 5.498 230.709 5.446 230.79 5.351 c
+230.867 5.263 230.907 5.149 230.907 5.013 c
+232.793 3.69 m
+232.822 3.161 l
+233.134 3.572 233.535 3.778 234.027 3.778 c
+234.909 3.778 235.353 3.194 235.365 2.029 c
+235.365 -1.278 l
+234.556 -1.278 l
+234.556 1.985 l
+234.556 2.374 234.49 2.65 234.365 2.808 c
+234.237 2.974 234.042 3.057 233.777 3.057 c
+233.571 3.057 233.387 2.988 233.233 2.852 c
+233.075 2.723 232.947 2.55 232.851 2.338 c
+232.851 -1.278 l
+232.028 -1.278 l
+232.028 3.69 l
+h
+f
+Q
+q 1 0 0 1 537.1847 388.598 cm
+0 0 m
+0 -1.206 l
+0.75 -1.206 l
+0.75 -1.867 l
+0 -1.867 l
+0 -4.939 l
+0 -5.137 0.029 -5.289 0.088 -5.395 c
+0.154 -5.494 0.268 -5.542 0.426 -5.542 c
+0.532 -5.542 0.64 -5.524 0.75 -5.484 c
+0.735 -6.174 l
+0.559 -6.232 0.372 -6.263 0.177 -6.263 c
+-0.147 -6.263 -0.393 -6.152 -0.559 -5.924 c
+-0.727 -5.689 -0.808 -5.366 -0.808 -4.954 c
+-0.808 -1.867 l
+-1.573 -1.867 l
+-1.573 -1.206 l
+-0.808 -1.206 l
+-0.808 0 l
+h
+2.414 -1.721 m
+2.716 -1.32 3.109 -1.118 3.59 -1.118 c
+4.472 -1.118 4.917 -1.702 4.928 -2.866 c
+4.928 -6.174 l
+4.12 -6.174 l
+4.12 -2.911 l
+4.12 -2.521 4.054 -2.246 3.929 -2.087 c
+3.8 -1.922 3.605 -1.838 3.341 -1.838 c
+3.135 -1.838 2.951 -1.908 2.797 -2.043 c
+2.639 -2.172 2.51 -2.345 2.414 -2.558 c
+2.414 -6.174 l
+1.591 -6.174 l
+1.591 0.881 l
+2.414 0.881 l
+h
+7.724 -6.263 m
+7.107 -6.263 6.629 -6.082 6.298 -5.719 c
+5.976 -5.347 5.806 -4.803 5.799 -4.087 c
+5.799 -3.485 l
+5.799 -2.749 5.961 -2.172 6.284 -1.75 c
+6.607 -1.331 7.056 -1.118 7.636 -1.118 c
+8.214 -1.118 8.644 -1.305 8.93 -1.676 c
+9.224 -2.04 9.374 -2.613 9.386 -3.396 c
+9.386 -3.925 l
+6.607 -3.925 l
+6.607 -4.042 l
+6.607 -4.583 6.703 -4.977 6.901 -5.218 c
+7.107 -5.453 7.393 -5.571 7.769 -5.571 c
+8.011 -5.571 8.224 -5.527 8.401 -5.439 c
+8.584 -5.351 8.757 -5.212 8.915 -5.013 c
+9.342 -5.527 l
+8.989 -6.02 8.449 -6.263 7.724 -6.263 c
+7.636 -1.808 m
+7.302 -1.808 7.052 -1.926 6.886 -2.161 c
+6.718 -2.389 6.626 -2.745 6.607 -3.234 c
+8.563 -3.234 l
+8.563 -3.117 l
+8.54 -2.646 8.459 -2.315 8.312 -2.117 c
+8.166 -1.912 7.938 -1.808 7.636 -1.808 c
+13.317 0 m
+13.317 -1.206 l
+14.067 -1.206 l
+14.067 -1.867 l
+13.317 -1.867 l
+13.317 -4.939 l
+13.317 -5.137 13.347 -5.289 13.406 -5.395 c
+13.471 -5.494 13.585 -5.542 13.743 -5.542 c
+13.851 -5.542 13.957 -5.524 14.067 -5.484 c
+14.053 -6.174 l
+13.876 -6.232 13.689 -6.263 13.494 -6.263 c
+13.17 -6.263 12.924 -6.152 12.759 -5.924 c
+12.59 -5.689 12.509 -5.366 12.509 -4.954 c
+12.509 -1.867 l
+11.744 -1.867 l
+11.744 -1.206 l
+12.509 -1.206 l
+12.509 0 l
+h
+16.687 -6.263 m
+16.07 -6.263 15.592 -6.082 15.262 -5.719 c
+14.938 -5.347 14.769 -4.803 14.761 -4.087 c
+14.761 -3.485 l
+14.761 -2.749 14.923 -2.172 15.247 -1.75 c
+15.57 -1.331 16.018 -1.118 16.599 -1.118 c
+17.176 -1.118 17.606 -1.305 17.893 -1.676 c
+18.186 -2.04 18.337 -2.613 18.348 -3.396 c
+18.348 -3.925 l
+15.57 -3.925 l
+15.57 -4.042 l
+15.57 -4.583 15.665 -4.977 15.864 -5.218 c
+16.07 -5.453 16.357 -5.571 16.731 -5.571 c
+16.974 -5.571 17.187 -5.527 17.363 -5.439 c
+17.547 -5.351 17.72 -5.212 17.878 -5.013 c
+18.304 -5.527 l
+17.951 -6.02 17.411 -6.263 16.687 -6.263 c
+16.599 -1.808 m
+16.264 -1.808 16.014 -1.926 15.85 -2.161 c
+15.68 -2.389 15.588 -2.745 15.57 -3.234 c
+17.525 -3.234 l
+17.525 -3.117 l
+17.503 -2.646 17.422 -2.315 17.275 -2.117 c
+17.128 -1.912 16.9 -1.808 16.599 -1.808 c
+21.2 -1.97 m
+21.082 -1.952 20.957 -1.941 20.833 -1.941 c
+20.409 -1.941 20.12 -2.168 19.965 -2.617 c
+19.965 -6.174 l
+19.142 -6.174 l
+19.142 -1.206 l
+19.935 -1.206 l
+19.95 -1.706 l
+20.164 -1.316 20.472 -1.118 20.876 -1.118 c
+21.001 -1.118 21.111 -1.139 21.2 -1.176 c
+h
+22.655 -1.206 m
+22.684 -1.661 l
+22.986 -1.301 23.382 -1.118 23.875 -1.118 c
+24.434 -1.118 24.82 -1.36 25.036 -1.838 c
+25.348 -1.36 25.786 -1.118 26.344 -1.118 c
+27.264 -1.118 27.734 -1.687 27.756 -2.822 c
+27.756 -6.174 l
+26.948 -6.174 l
+26.948 -2.897 l
+26.948 -2.544 26.877 -2.278 26.741 -2.103 c
+26.613 -1.926 26.396 -1.838 26.094 -1.838 c
+25.849 -1.838 25.646 -1.933 25.492 -2.117 c
+25.344 -2.305 25.257 -2.544 25.227 -2.837 c
+25.227 -6.174 l
+24.419 -6.174 l
+24.419 -2.866 l
+24.407 -2.183 24.128 -1.838 23.581 -1.838 c
+23.169 -1.838 22.879 -2.043 22.714 -2.455 c
+22.714 -6.174 l
+21.905 -6.174 l
+21.905 -1.206 l
+h
+29.564 -6.174 -0.809 4.968 re
+29.622 0.118 m
+29.622 -0.023 29.582 -0.14 29.504 -0.235 c
+29.435 -0.324 29.321 -0.368 29.167 -0.368 c
+29.009 -0.368 28.891 -0.324 28.814 -0.235 c
+28.744 -0.14 28.711 -0.023 28.711 0.118 c
+28.711 0.253 28.744 0.367 28.814 0.455 c
+28.891 0.55 29.005 0.602 29.152 0.602 c
+29.306 0.602 29.424 0.55 29.504 0.455 c
+29.582 0.367 29.622 0.253 29.622 0.118 c
+31.511 -1.206 m
+31.54 -1.735 l
+31.852 -1.324 32.253 -1.118 32.746 -1.118 c
+33.628 -1.118 34.073 -1.702 34.084 -2.866 c
+34.084 -6.174 l
+33.275 -6.174 l
+33.275 -2.911 l
+33.275 -2.521 33.209 -2.246 33.084 -2.087 c
+32.955 -1.922 32.76 -1.838 32.496 -1.838 c
+32.29 -1.838 32.107 -1.908 31.952 -2.043 c
+31.794 -2.172 31.665 -2.345 31.57 -2.558 c
+31.57 -6.174 l
+30.747 -6.174 l
+30.747 -1.206 l
+h
+37.678 -6.174 m
+37.626 -6.068 37.593 -5.887 37.574 -5.63 c
+37.288 -6.053 36.92 -6.263 36.472 -6.263 c
+36.02 -6.263 35.667 -6.141 35.414 -5.895 c
+35.168 -5.642 35.046 -5.285 35.046 -4.821 c
+35.046 -4.314 35.216 -3.911 35.561 -3.616 c
+35.902 -3.323 36.373 -3.172 36.972 -3.161 c
+37.56 -3.161 l
+37.56 -2.631 l
+37.56 -2.338 37.49 -2.128 37.354 -1.999 c
+37.225 -1.875 37.03 -1.808 36.766 -1.808 c
+36.519 -1.808 36.317 -1.881 36.163 -2.029 c
+36.016 -2.176 35.943 -2.363 35.943 -2.587 c
+35.12 -2.587 l
+35.12 -2.334 35.193 -2.087 35.34 -1.852 c
+35.495 -1.617 35.7 -1.437 35.958 -1.309 c
+36.211 -1.183 36.494 -1.118 36.81 -1.118 c
+37.317 -1.118 37.707 -1.246 37.971 -1.5 c
+38.236 -1.746 38.368 -2.114 38.368 -2.602 c
+38.368 -5.101 l
+38.376 -5.484 38.431 -5.818 38.53 -6.101 c
+38.53 -6.174 l
+h
+36.604 -5.527 m
+36.799 -5.527 36.986 -5.476 37.163 -5.366 c
+37.346 -5.248 37.479 -5.112 37.56 -4.954 c
+37.56 -3.763 l
+37.104 -3.763 l
+36.722 -3.774 36.417 -3.863 36.193 -4.028 c
+35.965 -4.197 35.854 -4.425 35.854 -4.719 c
+35.854 -5.006 35.906 -5.212 36.016 -5.336 c
+36.134 -5.465 36.328 -5.527 36.604 -5.527 c
+40.323 -6.174 -0.808 7.056 re
+41.566 -5.733 m
+41.566 -5.586 41.61 -5.465 41.697 -5.366 c
+41.786 -5.27 41.911 -5.218 42.08 -5.218 c
+42.256 -5.218 42.389 -5.27 42.476 -5.366 c
+42.572 -5.465 42.624 -5.586 42.624 -5.733 c
+42.624 -5.873 42.572 -5.991 42.476 -6.086 c
+42.389 -6.174 42.256 -6.218 42.08 -6.218 c
+41.911 -6.218 41.786 -6.174 41.697 -6.086 c
+41.61 -5.991 41.566 -5.873 41.566 -5.733 c
+41.566 -1.97 m
+41.566 -1.823 41.61 -1.702 41.697 -1.603 c
+41.786 -1.507 41.911 -1.455 42.08 -1.455 c
+42.256 -1.455 42.389 -1.507 42.476 -1.603 c
+42.572 -1.702 42.624 -1.823 42.624 -1.97 c
+42.624 -2.11 42.572 -2.228 42.476 -2.323 c
+42.389 -2.411 42.256 -2.455 42.08 -2.455 c
+41.911 -2.455 41.786 -2.411 41.697 -2.323 c
+41.61 -2.228 41.566 -2.11 41.566 -1.97 c
+f
+Q
+537.111 348.557 -0.838 6.688 re
+538.735 348.557 m
+538.735 352.864 l
+538.089 352.864 l
+538.089 353.525 l
+538.735 353.525 l
+538.735 354.099 l
+538.743 354.606 538.871 355.003 539.118 355.289 c
+539.361 355.572 539.71 355.715 540.161 355.715 c
+540.315 355.715 540.477 355.686 540.647 355.628 c
+540.602 354.936 l
+540.492 354.967 540.371 354.981 540.235 354.981 c
+539.772 354.981 539.544 354.65 539.544 353.996 c
+539.544 353.525 l
+540.396 353.525 l
+540.396 352.864 l
+539.544 352.864 l
+539.544 348.557 l
+h
+544.655 349.91 m
+545.553 353.525 l
+546.419 353.525 l
+544.788 347.852 l
+544.67 347.433 544.497 347.109 544.273 346.882 c
+544.046 346.657 543.792 346.543 543.509 346.543 c
+543.398 346.543 543.263 346.57 543.097 346.617 c
+543.097 347.308 l
+543.274 347.293 l
+543.509 347.293 543.689 347.352 543.818 347.47 c
+543.953 347.58 544.061 347.771 544.141 348.043 c
+544.302 348.602 l
+542.848 353.525 l
+543.729 353.525 l
+h
+546.816 351.277 m
+546.816 351.989 546.985 352.559 547.331 352.982 c
+547.683 353.4 548.146 353.614 548.728 353.614 c
+549.304 353.614 549.763 353.408 550.109 352.997 c
+550.461 352.592 550.642 352.033 550.652 351.321 c
+550.652 350.807 l
+550.652 350.078 550.476 349.506 550.124 349.087 c
+549.778 348.675 549.318 348.469 548.742 348.469 c
+548.161 348.469 547.698 348.667 547.346 349.072 c
+547 349.483 546.824 350.034 546.816 350.733 c
+h
+547.625 350.807 m
+547.625 350.296 547.72 349.895 547.919 349.601 c
+548.125 349.307 548.396 349.16 548.742 349.16 c
+549.455 349.16 549.823 349.678 549.844 350.718 c
+549.844 351.277 l
+549.844 351.784 549.742 352.188 549.536 352.482 c
+549.337 352.776 549.069 352.923 548.728 352.923 c
+548.393 352.923 548.125 352.776 547.919 352.482 c
+547.72 352.188 547.625 351.784 547.625 351.277 c
+h
+554.052 348.999 m
+553.776 348.646 553.38 348.469 552.861 348.469 c
+552.42 348.469 552.082 348.619 551.847 348.925 c
+551.619 349.237 551.502 349.693 551.494 350.292 c
+551.494 353.525 l
+552.302 353.525 l
+552.302 350.35 l
+552.302 349.575 552.538 349.189 553.008 349.189 c
+553.497 349.189 553.835 349.41 554.022 349.851 c
+554.022 353.525 l
+554.845 353.525 l
+554.845 348.557 l
+554.066 348.557 l
+h
+561.651 349.983 m
+562.415 353.525 l
+563.209 353.525 l
+562.004 348.557 l
+561.357 348.557 l
+560.387 352.114 l
+559.431 348.557 l
+558.785 348.557 l
+557.58 353.525 l
+558.373 353.525 l
+559.153 350.071 l
+560.063 353.525 l
+560.711 353.525 l
+h
+566.381 348.557 m
+566.33 348.664 566.296 348.844 566.278 349.101 c
+565.991 348.679 565.624 348.469 565.175 348.469 c
+564.723 348.469 564.37 348.59 564.117 348.837 c
+563.871 349.09 563.749 349.446 563.749 349.91 c
+563.749 350.417 563.919 350.821 564.264 351.115 c
+564.605 351.409 565.076 351.559 565.675 351.57 c
+566.263 351.57 l
+566.263 352.1 l
+566.263 352.394 566.193 352.603 566.057 352.732 c
+565.929 352.856 565.734 352.923 565.469 352.923 c
+565.223 352.923 565.021 352.85 564.867 352.702 c
+564.72 352.555 564.646 352.368 564.646 352.144 c
+563.823 352.144 l
+563.823 352.397 563.897 352.644 564.044 352.879 c
+564.198 353.114 564.404 353.294 564.661 353.423 c
+564.915 353.548 565.197 353.614 565.513 353.614 c
+566.02 353.614 566.41 353.485 566.675 353.232 c
+566.939 352.985 567.072 352.618 567.072 352.129 c
+567.072 349.631 l
+567.079 349.248 567.134 348.914 567.233 348.631 c
+567.233 348.557 l
+h
+565.308 349.205 m
+565.503 349.205 565.69 349.255 565.866 349.365 c
+566.05 349.483 566.182 349.619 566.263 349.777 c
+566.263 350.968 l
+565.808 350.968 l
+565.426 350.957 565.12 350.869 564.896 350.703 c
+564.668 350.535 564.558 350.306 564.558 350.013 c
+564.558 349.726 564.609 349.52 564.72 349.396 c
+564.838 349.267 565.032 349.205 565.308 349.205 c
+568.909 353.525 m
+568.938 352.997 l
+569.251 353.408 569.651 353.614 570.143 353.614 c
+571.026 353.614 571.47 353.03 571.481 351.865 c
+571.481 348.557 l
+570.673 348.557 l
+570.673 351.821 l
+570.673 352.21 570.606 352.486 570.482 352.644 c
+570.353 352.809 570.159 352.893 569.894 352.893 c
+569.688 352.893 569.504 352.824 569.35 352.688 c
+569.191 352.559 569.064 352.386 568.968 352.173 c
+568.968 348.557 l
+568.144 348.557 l
+568.144 353.525 l
+h
+573.59 354.731 m
+573.59 353.525 l
+574.34 353.525 l
+574.34 352.864 l
+573.59 352.864 l
+573.59 349.792 l
+573.59 349.594 573.62 349.443 573.679 349.336 c
+573.745 349.237 573.858 349.189 574.017 349.189 c
+574.124 349.189 574.23 349.207 574.34 349.248 c
+574.326 348.557 l
+574.149 348.499 573.962 348.469 573.767 348.469 c
+573.444 348.469 573.197 348.579 573.032 348.808 c
+572.863 349.043 572.782 349.365 572.782 349.777 c
+572.782 352.864 l
+572.017 352.864 l
+572.017 353.525 l
+572.782 353.525 l
+572.782 354.731 l
+h
+577.081 351.277 m
+577.081 351.989 577.251 352.559 577.596 352.982 c
+577.949 353.4 578.412 353.614 578.992 353.614 c
+579.57 353.614 580.029 353.408 580.374 352.997 c
+580.727 352.592 580.907 352.033 580.918 351.321 c
+580.918 350.807 l
+580.918 350.078 580.742 349.506 580.389 349.087 c
+580.044 348.675 579.584 348.469 579.007 348.469 c
+578.427 348.469 577.964 348.667 577.611 349.072 c
+577.265 349.483 577.089 350.034 577.081 350.733 c
+h
+577.891 350.807 m
+577.891 350.296 577.986 349.895 578.184 349.601 c
+578.39 349.307 578.662 349.16 579.007 349.16 c
+579.72 349.16 580.087 349.678 580.11 350.718 c
+580.11 351.277 l
+580.11 351.784 580.007 352.188 579.801 352.482 c
+579.603 352.776 579.335 352.923 578.992 352.923 c
+578.658 352.923 578.39 352.776 578.184 352.482 c
+577.986 352.188 577.891 351.784 577.891 351.277 c
+h
+583.836 352.761 m
+583.718 352.779 583.593 352.791 583.468 352.791 c
+583.046 352.791 582.755 352.563 582.601 352.114 c
+582.601 348.557 l
+581.778 348.557 l
+581.778 353.525 l
+582.572 353.525 l
+582.587 353.026 l
+582.799 353.415 583.108 353.614 583.512 353.614 c
+583.637 353.614 583.748 353.592 583.836 353.555 c
+h
+587.356 353.525 m
+587.385 352.997 l
+587.698 353.408 588.098 353.614 588.591 353.614 c
+589.473 353.614 589.918 353.03 589.928 351.865 c
+589.928 348.557 l
+589.12 348.557 l
+589.12 351.821 l
+589.12 352.21 589.054 352.486 588.929 352.644 c
+588.8 352.809 588.606 352.893 588.341 352.893 c
+588.135 352.893 587.952 352.824 587.797 352.688 c
+587.639 352.559 587.51 352.386 587.415 352.173 c
+587.415 348.557 l
+586.592 348.557 l
+586.592 353.525 l
+h
+592.748 348.469 m
+592.13 348.469 591.652 348.65 591.321 349.013 c
+590.998 349.384 590.828 349.928 590.822 350.645 c
+590.822 351.247 l
+590.822 351.983 590.984 352.559 591.306 352.982 c
+591.63 353.4 592.079 353.614 592.659 353.614 c
+593.236 353.614 593.666 353.427 593.953 353.055 c
+594.246 352.692 594.397 352.118 594.408 351.335 c
+594.408 350.807 l
+591.63 350.807 l
+591.63 350.689 l
+591.63 350.148 591.726 349.755 591.924 349.513 c
+592.13 349.278 592.417 349.16 592.791 349.16 c
+593.034 349.16 593.247 349.205 593.423 349.292 c
+593.607 349.38 593.78 349.52 593.938 349.718 c
+594.364 349.205 l
+594.011 348.712 593.471 348.469 592.748 348.469 c
+592.659 352.923 m
+592.324 352.923 592.075 352.806 591.909 352.57 c
+591.74 352.342 591.649 351.986 591.63 351.497 c
+593.585 351.497 l
+593.585 351.615 l
+593.563 352.085 593.482 352.416 593.336 352.615 c
+593.188 352.82 592.96 352.923 592.659 352.923 c
+596.981 348.469 m
+596.363 348.469 595.885 348.65 595.555 349.013 c
+595.231 349.384 595.062 349.928 595.055 350.645 c
+595.055 351.247 l
+595.055 351.983 595.217 352.559 595.54 352.982 c
+595.863 353.4 596.312 353.614 596.893 353.614 c
+597.469 353.614 597.899 353.427 598.186 353.055 c
+598.479 352.692 598.63 352.118 598.641 351.335 c
+598.641 350.807 l
+595.863 350.807 l
+595.863 350.689 l
+595.863 350.148 595.959 349.755 596.158 349.513 c
+596.363 349.278 596.65 349.16 597.024 349.16 c
+597.267 349.16 597.48 349.205 597.656 349.292 c
+597.841 349.38 598.013 349.52 598.171 349.718 c
+598.597 349.205 l
+598.244 348.712 597.704 348.469 596.981 348.469 c
+596.893 352.923 m
+596.558 352.923 596.308 352.806 596.143 352.57 c
+595.973 352.342 595.882 351.986 595.863 351.497 c
+597.818 351.497 l
+597.818 351.615 l
+597.797 352.085 597.716 352.416 597.569 352.615 c
+597.421 352.82 597.193 352.923 596.893 352.923 c
+599.273 351.262 m
+599.273 352.033 599.413 352.618 599.7 353.011 c
+599.983 353.412 600.394 353.614 600.935 353.614 c
+601.405 353.614 601.772 353.423 602.037 353.041 c
+602.037 355.613 l
+602.861 355.613 l
+602.861 348.557 l
+602.111 348.557 l
+602.067 349.087 l
+601.802 348.675 601.423 348.469 600.935 348.469 c
+600.413 348.469 600.008 348.664 599.715 349.057 c
+599.42 349.458 599.273 350.028 599.273 350.762 c
+h
+600.082 350.807 m
+600.082 350.248 600.162 349.836 600.332 349.571 c
+600.497 349.315 600.766 349.189 601.14 349.189 c
+601.541 349.189 601.839 349.388 602.037 349.792 c
+602.037 352.305 l
+601.831 352.695 601.529 352.893 601.14 352.893 c
+600.766 352.893 600.497 352.761 600.332 352.497 c
+600.162 352.239 600.082 351.842 600.082 351.306 c
+h
+607.053 354.731 m
+607.053 353.525 l
+607.802 353.525 l
+607.802 352.864 l
+607.053 352.864 l
+607.053 349.792 l
+607.053 349.594 607.083 349.443 607.141 349.336 c
+607.208 349.237 607.322 349.189 607.48 349.189 c
+607.586 349.189 607.692 349.207 607.802 349.248 c
+607.788 348.557 l
+607.611 348.499 607.424 348.469 607.229 348.469 c
+606.906 348.469 606.66 348.579 606.495 348.808 c
+606.325 349.043 606.244 349.365 606.244 349.777 c
+606.244 352.864 l
+605.48 352.864 l
+605.48 353.525 l
+606.244 353.525 l
+606.244 354.731 l
+h
+608.39 351.277 m
+608.39 351.989 608.56 352.559 608.905 352.982 c
+609.258 353.4 609.72 353.614 610.302 353.614 c
+610.878 353.614 611.338 353.408 611.683 352.997 c
+612.036 352.592 612.216 352.033 612.227 351.321 c
+612.227 350.807 l
+612.227 350.078 612.051 349.506 611.698 349.087 c
+611.353 348.675 610.894 348.469 610.316 348.469 c
+609.735 348.469 609.273 348.667 608.92 349.072 c
+608.575 349.483 608.398 350.034 608.39 350.733 c
+h
+609.199 350.807 m
+609.199 350.296 609.294 349.895 609.493 349.601 c
+609.699 349.307 609.971 349.16 610.316 349.16 c
+611.029 349.16 611.397 349.678 611.418 350.718 c
+611.418 351.277 l
+611.418 351.784 611.316 352.188 611.11 352.482 c
+610.911 352.776 610.643 352.923 610.302 352.923 c
+609.967 352.923 609.699 352.776 609.493 352.482 c
+609.294 352.188 609.199 351.784 609.199 351.277 c
+h
+616.034 348.557 -0.808 4.968 re
+616.093 354.849 m
+616.093 354.709 616.053 354.591 615.975 354.496 c
+615.906 354.408 615.792 354.364 615.638 354.364 c
+615.48 354.364 615.362 354.408 615.285 354.496 c
+615.214 354.591 615.181 354.709 615.181 354.849 c
+615.181 354.984 615.214 355.098 615.285 355.187 c
+615.362 355.282 615.476 355.333 615.623 355.333 c
+615.777 355.333 615.894 355.282 615.975 355.187 c
+616.053 355.098 616.093 354.984 616.093 354.849 c
+617.978 353.525 m
+618.007 352.997 l
+618.32 353.408 618.721 353.614 619.212 353.614 c
+620.095 353.614 620.539 353.03 620.55 351.865 c
+620.55 348.557 l
+619.742 348.557 l
+619.742 351.821 l
+619.742 352.21 619.676 352.486 619.551 352.644 c
+619.422 352.809 619.228 352.893 618.963 352.893 c
+618.757 352.893 618.574 352.824 618.419 352.688 c
+618.261 352.559 618.133 352.386 618.036 352.173 c
+618.036 348.557 l
+617.213 348.557 l
+617.213 353.525 l
+h
+624.016 349.836 m
+624.016 350.001 623.946 350.148 623.81 350.277 c
+623.681 350.402 623.428 350.549 623.046 350.718 c
+622.612 350.902 622.304 351.06 622.119 351.189 c
+621.943 351.314 621.811 351.457 621.722 351.615 c
+621.635 351.78 621.591 351.975 621.591 352.203 c
+621.591 352.615 621.737 352.952 622.031 353.217 c
+622.325 353.481 622.7 353.614 623.164 353.614 c
+623.652 353.614 624.045 353.471 624.339 353.188 c
+624.633 352.912 624.78 352.555 624.78 352.114 c
+623.972 352.114 l
+623.972 352.339 623.891 352.53 623.737 352.688 c
+623.59 352.842 623.399 352.923 623.164 352.923 c
+622.928 352.923 622.74 352.856 622.605 352.732 c
+622.465 352.615 622.399 352.445 622.399 352.232 c
+622.399 352.063 622.447 351.931 622.546 351.835 c
+622.641 351.736 622.884 351.603 623.266 351.439 c
+623.872 351.204 624.284 350.971 624.5 350.747 c
+624.714 350.52 624.824 350.237 624.824 349.895 c
+624.824 349.461 624.67 349.116 624.369 348.852 c
+624.074 348.594 623.677 348.469 623.178 348.469 c
+622.667 348.469 622.252 348.617 621.928 348.91 c
+621.605 349.205 621.443 349.579 621.443 350.042 c
+622.266 350.042 l
+622.274 349.766 622.358 349.55 622.516 349.396 c
+622.671 349.237 622.891 349.16 623.178 349.16 c
+623.45 349.16 623.656 349.219 623.795 349.336 c
+623.943 349.461 624.016 349.631 624.016 349.836 c
+626.772 354.731 m
+626.772 353.525 l
+627.521 353.525 l
+627.521 352.864 l
+626.772 352.864 l
+626.772 349.792 l
+626.772 349.594 626.801 349.443 626.86 349.336 c
+626.927 349.237 627.04 349.189 627.198 349.189 c
+627.305 349.189 627.411 349.207 627.521 349.248 c
+627.507 348.557 l
+627.33 348.499 627.143 348.469 626.948 348.469 c
+626.625 348.469 626.379 348.579 626.213 348.808 c
+626.044 349.043 625.963 349.365 625.963 349.777 c
+625.963 352.864 l
+625.199 352.864 l
+625.199 353.525 l
+625.963 353.525 l
+625.963 354.731 l
+h
+630.921 348.557 m
+630.869 348.664 630.836 348.844 630.817 349.101 c
+630.531 348.679 630.164 348.469 629.715 348.469 c
+629.263 348.469 628.911 348.59 628.657 348.837 c
+628.411 349.09 628.29 349.446 628.29 349.91 c
+628.29 350.417 628.458 350.821 628.804 351.115 c
+629.146 351.409 629.616 351.559 630.215 351.57 c
+630.803 351.57 l
+630.803 352.1 l
+630.803 352.394 630.733 352.603 630.597 352.732 c
+630.468 352.856 630.274 352.923 630.009 352.923 c
+629.763 352.923 629.561 352.85 629.406 352.702 c
+629.26 352.555 629.186 352.368 629.186 352.144 c
+628.363 352.144 l
+628.363 352.397 628.436 352.644 628.583 352.879 c
+628.737 353.114 628.943 353.294 629.201 353.423 c
+629.454 353.548 629.737 353.614 630.054 353.614 c
+630.561 353.614 630.95 353.485 631.214 353.232 c
+631.479 352.985 631.611 352.618 631.611 352.129 c
+631.611 349.631 l
+631.619 349.248 631.674 348.914 631.773 348.631 c
+631.773 348.557 l
+h
+629.848 349.205 m
+630.042 349.205 630.229 349.255 630.406 349.365 c
+630.59 349.483 630.722 349.619 630.803 349.777 c
+630.803 350.968 l
+630.347 350.968 l
+629.965 350.957 629.66 350.869 629.436 350.703 c
+629.208 350.535 629.098 350.306 629.098 350.013 c
+629.098 349.726 629.15 349.52 629.26 349.396 c
+629.377 349.267 629.572 349.205 629.848 349.205 c
+633.566 348.557 -0.808 7.056 re
+635.628 348.557 -0.809 7.056 re
+643.183 349.396 m
+643.037 349.205 l
+642.613 348.712 641.996 348.469 641.184 348.469 c
+640.456 348.469 639.891 348.708 639.479 349.189 c
+639.068 349.667 638.854 350.343 638.847 351.218 c
+638.847 352.526 l
+638.847 353.467 639.031 354.165 639.405 354.628 c
+639.777 355.098 640.339 355.333 641.096 355.333 c
+641.732 355.333 642.228 355.158 642.58 354.805 c
+642.941 354.452 643.143 353.945 643.183 353.29 c
+642.345 353.29 l
+642.305 353.702 642.187 354.026 641.992 354.261 c
+641.794 354.496 641.497 354.614 641.096 354.614 c
+640.614 354.614 640.261 354.456 640.038 354.143 c
+639.81 353.827 639.692 353.327 639.685 352.644 c
+639.685 351.277 l
+639.685 350.601 639.81 350.078 640.067 349.718 c
+640.332 349.365 640.703 349.189 641.184 349.189 c
+641.632 349.189 641.978 349.296 642.214 349.513 c
+642.345 349.631 l
+642.345 351.173 l
+641.111 351.173 l
+641.111 351.894 l
+643.183 351.894 l
+h
+645.102 348.557 -0.809 4.968 re
+645.16 354.849 m
+645.16 354.709 645.119 354.591 645.042 354.496 c
+644.973 354.408 644.859 354.364 644.705 354.364 c
+644.547 354.364 644.429 354.408 644.352 354.496 c
+644.282 354.591 644.249 354.709 644.249 354.849 c
+644.249 354.984 644.282 355.098 644.352 355.187 c
+644.429 355.282 644.543 355.333 644.69 355.333 c
+644.844 355.333 644.961 355.282 645.042 355.187 c
+645.119 355.098 645.16 354.984 645.16 354.849 c
+647.358 354.731 m
+647.358 353.525 l
+648.107 353.525 l
+648.107 352.864 l
+647.358 352.864 l
+647.358 349.792 l
+647.358 349.594 647.388 349.443 647.446 349.336 c
+647.512 349.237 647.626 349.189 647.784 349.189 c
+647.891 349.189 647.997 349.207 648.107 349.248 c
+648.093 348.557 l
+647.916 348.499 647.729 348.469 647.534 348.469 c
+647.211 348.469 646.964 348.579 646.8 348.808 c
+646.63 349.043 646.549 349.365 646.549 349.777 c
+646.549 352.864 l
+645.785 352.864 l
+645.785 353.525 l
+646.549 353.525 l
+646.549 354.731 l
+h
+651.378 348.557 m
+651.378 352.864 l
+650.731 352.864 l
+650.731 353.525 l
+651.378 353.525 l
+651.378 354.099 l
+651.386 354.606 651.514 355.003 651.76 355.289 c
+652.003 355.572 652.352 355.715 652.803 355.715 c
+652.958 355.715 653.12 355.686 653.289 355.628 c
+653.245 354.936 l
+653.135 354.967 653.013 354.981 652.878 354.981 c
+652.414 354.981 652.186 354.65 652.186 353.996 c
+652.186 353.525 l
+653.039 353.525 l
+653.039 352.864 l
+652.186 352.864 l
+652.186 348.557 l
+h
+655.928 352.761 m
+655.81 352.779 655.685 352.791 655.56 352.791 c
+655.137 352.791 654.847 352.563 654.692 352.114 c
+654.692 348.557 l
+653.869 348.557 l
+653.869 353.525 l
+654.663 353.525 l
+654.678 353.026 l
+654.891 353.415 655.2 353.614 655.604 353.614 c
+655.729 353.614 655.839 353.592 655.928 353.555 c
+h
+656.368 351.277 m
+656.368 351.989 656.537 352.559 656.883 352.982 c
+657.235 353.4 657.698 353.614 658.279 353.614 c
+658.856 353.614 659.315 353.408 659.661 352.997 c
+660.013 352.592 660.194 352.033 660.205 351.321 c
+660.205 350.807 l
+660.205 350.078 660.028 349.506 659.676 349.087 c
+659.33 348.675 658.871 348.469 658.294 348.469 c
+657.713 348.469 657.25 348.667 656.898 349.072 c
+656.552 349.483 656.375 350.034 656.368 350.733 c
+h
+657.177 350.807 m
+657.177 350.296 657.272 349.895 657.47 349.601 c
+657.677 349.307 657.948 349.16 658.294 349.16 c
+659.007 349.16 659.375 349.678 659.396 350.718 c
+659.396 351.277 l
+659.396 351.784 659.294 352.188 659.088 352.482 c
+658.889 352.776 658.621 352.923 658.279 352.923 c
+657.945 352.923 657.677 352.776 657.47 352.482 c
+657.272 352.188 657.177 351.784 657.177 351.277 c
+h
+661.829 353.525 m
+661.858 353.07 l
+662.16 353.43 662.557 353.614 663.049 353.614 c
+663.608 353.614 663.994 353.371 664.21 352.893 c
+664.522 353.371 664.96 353.614 665.518 353.614 c
+666.438 353.614 666.908 353.045 666.93 351.909 c
+666.93 348.557 l
+666.122 348.557 l
+666.122 351.835 l
+666.122 352.188 666.051 352.453 665.915 352.629 c
+665.787 352.806 665.57 352.893 665.268 352.893 c
+665.023 352.893 664.82 352.798 664.666 352.615 c
+664.518 352.427 664.431 352.188 664.402 351.894 c
+664.402 348.557 l
+663.593 348.557 l
+663.593 351.865 l
+663.581 352.548 663.303 352.893 662.756 352.893 c
+662.344 352.893 662.053 352.688 661.888 352.276 c
+661.888 348.557 l
+661.079 348.557 l
+661.079 353.525 l
+h
+672.346 349.836 m
+672.346 350.001 672.277 350.148 672.14 350.277 c
+672.011 350.402 671.758 350.549 671.376 350.718 c
+670.943 350.902 670.633 351.06 670.45 351.189 c
+670.274 351.314 670.141 351.457 670.053 351.615 c
+669.965 351.78 669.921 351.975 669.921 352.203 c
+669.921 352.615 670.068 352.952 670.361 353.217 c
+670.656 353.481 671.03 353.614 671.494 353.614 c
+671.982 353.614 672.376 353.471 672.67 353.188 c
+672.964 352.912 673.11 352.555 673.11 352.114 c
+672.302 352.114 l
+672.302 352.339 672.221 352.53 672.067 352.688 c
+671.92 352.842 671.729 352.923 671.494 352.923 c
+671.259 352.923 671.071 352.856 670.935 352.732 c
+670.795 352.615 670.729 352.445 670.729 352.232 c
+670.729 352.063 670.777 351.931 670.876 351.835 c
+670.972 351.736 671.215 351.603 671.597 351.439 c
+672.202 351.204 672.615 350.971 672.831 350.747 c
+673.044 350.52 673.154 350.237 673.154 349.895 c
+673.154 349.461 673 349.116 672.699 348.852 c
+672.405 348.594 672.008 348.469 671.508 348.469 c
+670.997 348.469 670.582 348.617 670.259 348.91 c
+669.935 349.205 669.773 349.579 669.773 350.042 c
+670.597 350.042 l
+670.604 349.766 670.689 349.55 670.847 349.396 c
+671.001 349.237 671.222 349.16 671.508 349.16 c
+671.78 349.16 671.986 349.219 672.125 349.336 c
+672.273 349.461 672.346 349.631 672.346 349.836 c
+673.868 351.277 m
+673.868 351.989 674.037 352.559 674.382 352.982 c
+674.735 353.4 675.198 353.614 675.778 353.614 c
+676.356 353.614 676.815 353.408 677.16 352.997 c
+677.513 352.592 677.693 352.033 677.704 351.321 c
+677.704 350.807 l
+677.704 350.078 677.528 349.506 677.175 349.087 c
+676.829 348.675 676.37 348.469 675.793 348.469 c
+675.213 348.469 674.75 348.667 674.396 349.072 c
+674.051 349.483 673.875 350.034 673.868 350.733 c
+h
+674.676 350.807 m
+674.676 350.296 674.772 349.895 674.97 349.601 c
+675.176 349.307 675.448 349.16 675.793 349.16 c
+676.506 349.16 676.873 349.678 676.896 350.718 c
+676.896 351.277 l
+676.896 351.784 676.792 352.188 676.587 352.482 c
+676.389 352.776 676.121 352.923 675.778 352.923 c
+675.444 352.923 675.176 352.776 674.97 352.482 c
+674.772 352.188 674.676 351.784 674.676 351.277 c
+h
+681.107 348.999 m
+680.831 348.646 680.434 348.469 679.917 348.469 c
+679.475 348.469 679.138 348.619 678.902 348.925 c
+678.674 349.237 678.556 349.693 678.55 350.292 c
+678.55 353.525 l
+679.358 353.525 l
+679.358 350.35 l
+679.358 349.575 679.593 349.189 680.063 349.189 c
+680.552 349.189 680.89 349.41 681.077 349.851 c
+681.077 353.525 l
+681.901 353.525 l
+681.901 348.557 l
+681.122 348.557 l
+h
+684.995 352.761 m
+684.877 352.779 684.752 352.791 684.628 352.791 c
+684.204 352.791 683.915 352.563 683.76 352.114 c
+683.76 348.557 l
+682.937 348.557 l
+682.937 353.525 l
+683.73 353.525 l
+683.745 353.026 l
+683.959 353.415 684.267 353.614 684.671 353.614 c
+684.796 353.614 684.906 353.592 684.995 353.555 c
+h
+687.335 349.16 m
+687.6 349.16 687.809 349.241 687.967 349.41 c
+688.133 349.575 688.225 349.814 688.247 350.13 c
+689.012 350.13 l
+688.989 349.649 688.821 349.252 688.497 348.939 c
+688.181 348.623 687.795 348.469 687.335 348.469 c
+686.718 348.469 686.248 348.66 685.924 349.043 c
+685.601 349.432 685.44 350.013 685.44 350.776 c
+685.44 351.321 l
+685.44 352.074 685.601 352.644 685.924 353.026 c
+686.248 353.415 686.711 353.614 687.321 353.614 c
+687.828 353.614 688.233 353.452 688.526 353.128 c
+688.827 352.812 688.989 352.38 689.012 351.821 c
+688.247 351.821 l
+688.225 352.181 688.137 352.457 687.982 352.644 c
+687.824 352.827 687.604 352.923 687.321 352.923 c
+686.968 352.923 686.704 352.798 686.527 352.555 c
+686.351 352.32 686.255 351.931 686.248 351.395 c
+686.248 350.762 l
+686.248 350.174 686.336 349.755 686.512 349.513 c
+686.689 349.278 686.961 349.16 687.335 349.16 c
+691.558 348.469 m
+690.94 348.469 690.463 348.65 690.132 349.013 c
+689.808 349.384 689.64 349.928 689.632 350.645 c
+689.632 351.247 l
+689.632 351.983 689.794 352.559 690.117 352.982 c
+690.441 353.4 690.889 353.614 691.47 353.614 c
+692.046 353.614 692.476 353.427 692.763 353.055 c
+693.057 352.692 693.208 352.118 693.219 351.335 c
+693.219 350.807 l
+690.441 350.807 l
+690.441 350.689 l
+690.441 350.148 690.536 349.755 690.735 349.513 c
+690.94 349.278 691.227 349.16 691.602 349.16 c
+691.844 349.16 692.058 349.205 692.234 349.292 c
+692.418 349.38 692.59 349.52 692.748 349.718 c
+693.174 349.205 l
+692.822 348.712 692.282 348.469 691.558 348.469 c
+691.47 352.923 m
+691.135 352.923 690.886 352.806 690.72 352.57 c
+690.551 352.342 690.459 351.986 690.441 351.497 c
+692.395 351.497 l
+692.395 351.615 l
+692.374 352.085 692.293 352.416 692.146 352.615 c
+691.998 352.82 691.771 352.923 691.47 352.923 c
+694.028 347.22 m
+693.542 347.558 l
+693.825 347.962 693.976 348.374 693.997 348.792 c
+693.997 349.557 l
+694.821 349.557 l
+694.821 348.895 l
+694.821 348.59 694.741 348.285 694.585 347.969 c
+694.439 347.657 694.252 347.407 694.028 347.22 c
+699.227 349.91 m
+700.124 353.525 l
+700.991 353.525 l
+699.36 347.852 l
+699.242 347.433 699.069 347.109 698.845 346.882 c
+698.617 346.657 698.363 346.543 698.08 346.543 c
+697.97 346.543 697.835 346.57 697.669 346.617 c
+697.669 347.308 l
+697.845 347.293 l
+698.08 347.293 698.261 347.352 698.389 347.47 c
+698.525 347.58 698.632 347.771 698.712 348.043 c
+698.874 348.602 l
+697.419 353.525 l
+698.301 353.525 l
+h
+701.384 351.277 m
+701.384 351.989 701.554 352.559 701.899 352.982 c
+702.252 353.4 702.714 353.614 703.295 353.614 c
+703.872 353.614 704.331 353.408 704.677 352.997 c
+705.03 352.592 705.209 352.033 705.221 351.321 c
+705.221 350.807 l
+705.221 350.078 705.045 349.506 704.692 349.087 c
+704.346 348.675 703.887 348.469 703.31 348.469 c
+702.729 348.469 702.267 348.667 701.913 349.072 c
+701.568 349.483 701.392 350.034 701.384 350.733 c
+h
+702.192 350.807 m
+702.192 350.296 702.288 349.895 702.487 349.601 c
+702.693 349.307 702.965 349.16 703.31 349.16 c
+704.023 349.16 704.39 349.678 704.412 350.718 c
+704.412 351.277 l
+704.412 351.784 704.309 352.188 704.104 352.482 c
+703.905 352.776 703.637 352.923 703.295 352.923 c
+702.961 352.923 702.693 352.776 702.487 352.482 c
+702.288 352.188 702.192 351.784 702.192 351.277 c
+h
+708.623 348.999 m
+708.348 348.646 707.951 348.469 707.433 348.469 c
+706.992 348.469 706.654 348.619 706.419 348.925 c
+706.19 349.237 706.073 349.693 706.066 350.292 c
+706.066 353.525 l
+706.874 353.525 l
+706.874 350.35 l
+706.874 349.575 707.109 349.189 707.58 349.189 c
+708.068 349.189 708.407 349.41 708.594 349.851 c
+708.594 353.525 l
+709.417 353.525 l
+709.417 348.557 l
+708.638 348.557 l
+h
+714.253 349.16 m
+714.518 349.16 714.728 349.241 714.886 349.41 c
+715.05 349.575 715.143 349.814 715.164 350.13 c
+715.929 350.13 l
+715.907 349.649 715.738 349.252 715.414 348.939 c
+715.098 348.623 714.713 348.469 714.253 348.469 c
+713.635 348.469 713.165 348.66 712.842 349.043 c
+712.519 349.432 712.357 350.013 712.357 350.776 c
+712.357 351.321 l
+712.357 352.074 712.519 352.644 712.842 353.026 c
+713.165 353.415 713.629 353.614 714.238 353.614 c
+714.745 353.614 715.15 353.452 715.444 353.128 c
+715.745 352.812 715.907 352.38 715.929 351.821 c
+715.164 351.821 l
+715.143 352.181 715.054 352.457 714.9 352.644 c
+714.742 352.827 714.522 352.923 714.238 352.923 c
+713.886 352.923 713.621 352.798 713.444 352.555 c
+713.269 352.32 713.173 351.931 713.165 351.395 c
+713.165 350.762 l
+713.165 350.174 713.253 349.755 713.43 349.513 c
+713.606 349.278 713.878 349.16 714.253 349.16 c
+719.254 348.557 m
+719.203 348.664 719.17 348.844 719.152 349.101 c
+718.865 348.679 718.497 348.469 718.049 348.469 c
+717.597 348.469 717.244 348.59 716.991 348.837 c
+716.745 349.09 716.623 349.446 716.623 349.91 c
+716.623 350.417 716.793 350.821 717.138 351.115 c
+717.479 351.409 717.95 351.559 718.549 351.57 c
+719.137 351.57 l
+719.137 352.1 l
+719.137 352.394 719.067 352.603 718.931 352.732 c
+718.803 352.856 718.608 352.923 718.343 352.923 c
+718.097 352.923 717.895 352.85 717.741 352.702 c
+717.593 352.555 717.52 352.368 717.52 352.144 c
+716.697 352.144 l
+716.697 352.397 716.77 352.644 716.918 352.879 c
+717.072 353.114 717.278 353.294 717.535 353.423 c
+717.789 353.548 718.071 353.614 718.387 353.614 c
+718.894 353.614 719.284 353.485 719.549 353.232 c
+719.813 352.985 719.945 352.618 719.945 352.129 c
+719.945 349.631 l
+719.952 349.248 720.008 348.914 720.107 348.631 c
+720.107 348.557 l
+h
+718.181 349.205 m
+718.376 349.205 718.564 349.255 718.74 349.365 c
+718.924 349.483 719.056 349.619 719.137 349.777 c
+719.137 350.968 l
+718.682 350.968 l
+718.299 350.957 717.994 350.869 717.77 350.703 c
+717.542 350.535 717.432 350.306 717.432 350.013 c
+717.432 349.726 717.483 349.52 717.593 349.396 c
+717.711 349.267 717.905 349.205 718.181 349.205 c
+721.783 353.525 m
+721.812 352.997 l
+722.125 353.408 722.525 353.614 723.017 353.614 c
+723.9 353.614 724.344 353.03 724.355 351.865 c
+724.355 348.557 l
+723.547 348.557 l
+723.547 351.821 l
+723.547 352.21 723.48 352.486 723.355 352.644 c
+723.227 352.809 723.032 352.893 722.767 352.893 c
+722.562 352.893 722.378 352.824 722.223 352.688 c
+722.065 352.559 721.937 352.386 721.841 352.173 c
+721.841 348.557 l
+721.018 348.557 l
+721.018 353.525 l
+h
+727.295 351.262 m
+727.295 352.033 727.434 352.618 727.721 353.011 c
+728.004 353.412 728.415 353.614 728.956 353.614 c
+729.463 353.614 729.853 353.397 730.117 352.967 c
+730.146 353.525 l
+730.881 353.525 l
+730.881 348.513 l
+730.881 347.896 730.724 347.426 730.411 347.102 c
+730.096 346.772 729.662 346.602 729.103 346.602 c
+728.857 346.602 728.577 346.668 728.265 346.793 c
+727.96 346.911 727.736 347.058 727.588 347.235 c
+727.912 347.793 l
+728.254 347.462 728.625 347.293 729.03 347.293 c
+729.705 347.293 730.051 347.661 730.073 348.396 c
+730.073 349.043 l
+729.809 348.66 729.433 348.469 728.956 348.469 c
+728.434 348.469 728.033 348.66 727.75 349.043 c
+727.464 349.432 727.313 349.99 727.295 350.718 c
+h
+728.118 350.807 m
+728.118 350.248 728.195 349.836 728.353 349.571 c
+728.519 349.315 728.787 349.189 729.161 349.189 c
+729.562 349.189 729.867 349.396 730.073 349.807 c
+730.073 352.291 l
+729.867 352.692 729.566 352.893 729.176 352.893 c
+728.802 352.893 728.533 352.761 728.368 352.497 c
+728.199 352.239 728.118 351.842 728.118 351.306 c
+h
+733.682 348.469 m
+733.065 348.469 732.587 348.65 732.255 349.013 c
+731.933 349.384 731.763 349.928 731.756 350.645 c
+731.756 351.247 l
+731.756 351.983 731.918 352.559 732.241 352.982 c
+732.565 353.4 733.013 353.614 733.593 353.614 c
+734.171 353.614 734.601 353.427 734.887 353.055 c
+735.181 352.692 735.332 352.118 735.343 351.335 c
+735.343 350.807 l
+732.565 350.807 l
+732.565 350.689 l
+732.565 350.148 732.66 349.755 732.858 349.513 c
+733.065 349.278 733.35 349.16 733.726 349.16 c
+733.969 349.16 734.181 349.205 734.358 349.292 c
+734.541 349.38 734.715 349.52 734.873 349.718 c
+735.299 349.205 l
+734.946 348.712 734.406 348.469 733.682 348.469 c
+733.593 352.923 m
+733.259 352.923 733.009 352.806 732.843 352.57 c
+732.675 352.342 732.583 351.986 732.565 351.497 c
+734.52 351.497 l
+734.52 351.615 l
+734.497 352.085 734.416 352.416 734.27 352.615 c
+734.123 352.82 733.895 352.923 733.593 352.923 c
+737.209 354.731 m
+737.209 353.525 l
+737.959 353.525 l
+737.959 352.864 l
+737.209 352.864 l
+737.209 349.792 l
+737.209 349.594 737.239 349.443 737.298 349.336 c
+737.364 349.237 737.478 349.189 737.636 349.189 c
+737.742 349.189 737.849 349.207 737.959 349.248 c
+737.944 348.557 l
+737.768 348.499 737.581 348.469 737.386 348.469 c
+737.063 348.469 736.816 348.579 736.651 348.808 c
+736.482 349.043 736.401 349.365 736.401 349.777 c
+736.401 352.864 l
+735.636 352.864 l
+735.636 353.525 l
+736.401 353.525 l
+736.401 354.731 l
+h
+741.744 348.557 -0.808 4.968 re
+741.803 354.849 m
+741.803 354.709 741.763 354.591 741.685 354.496 c
+741.616 354.408 741.502 354.364 741.347 354.364 c
+741.189 354.364 741.072 354.408 740.994 354.496 c
+740.924 354.591 740.891 354.709 740.891 354.849 c
+740.891 354.984 740.924 355.098 740.994 355.187 c
+741.072 355.282 741.186 355.333 741.333 355.333 c
+741.487 355.333 741.605 355.282 741.685 355.187 c
+741.763 355.098 741.803 354.984 741.803 354.849 c
+744.001 354.731 m
+744.001 353.525 l
+744.75 353.525 l
+744.75 352.864 l
+744.001 352.864 l
+744.001 349.792 l
+744.001 349.594 744.03 349.443 744.089 349.336 c
+744.155 349.237 744.269 349.189 744.427 349.189 c
+744.533 349.189 744.639 349.207 744.75 349.248 c
+744.735 348.557 l
+744.559 348.499 744.371 348.469 744.177 348.469 c
+743.854 348.469 743.607 348.579 743.442 348.808 c
+743.272 349.043 743.192 349.365 743.192 349.777 c
+743.192 352.864 l
+742.428 352.864 l
+742.428 353.525 l
+743.192 353.525 l
+743.192 354.731 l
+h
+748.02 348.557 m
+748.02 352.864 l
+747.374 352.864 l
+747.374 353.525 l
+748.02 353.525 l
+748.02 354.099 l
+748.028 354.606 748.157 355.003 748.402 355.289 c
+748.645 355.572 748.994 355.715 749.447 355.715 c
+749.601 355.715 749.763 355.686 749.931 355.628 c
+749.888 354.936 l
+749.777 354.967 749.655 354.981 749.52 354.981 c
+749.057 354.981 748.829 354.65 748.829 353.996 c
+748.829 353.525 l
+749.682 353.525 l
+749.682 352.864 l
+748.829 352.864 l
+748.829 348.557 l
+h
+752.57 352.761 m
+752.452 352.779 752.327 352.791 752.203 352.791 c
+751.78 352.791 751.49 352.563 751.336 352.114 c
+751.336 348.557 l
+750.512 348.557 l
+750.512 353.525 l
+751.305 353.525 l
+751.32 353.026 l
+751.534 353.415 751.843 353.614 752.246 353.614 c
+752.371 353.614 752.481 353.592 752.57 353.555 c
+h
+753.015 351.277 m
+753.015 351.989 753.183 352.559 753.529 352.982 c
+753.882 353.4 754.345 353.614 754.925 353.614 c
+755.502 353.614 755.962 353.408 756.307 352.997 c
+756.66 352.592 756.84 352.033 756.851 351.321 c
+756.851 350.807 l
+756.851 350.078 756.674 349.506 756.321 349.087 c
+755.976 348.675 755.517 348.469 754.94 348.469 c
+754.359 348.469 753.896 348.667 753.543 349.072 c
+753.198 349.483 753.022 350.034 753.015 350.733 c
+h
+753.823 350.807 m
+753.823 350.296 753.919 349.895 754.117 349.601 c
+754.322 349.307 754.594 349.16 754.94 349.16 c
+755.654 349.16 756.02 349.678 756.043 350.718 c
+756.043 351.277 l
+756.043 351.784 755.94 352.188 755.734 352.482 c
+755.535 352.776 755.267 352.923 754.925 352.923 c
+754.591 352.923 754.322 352.776 754.117 352.482 c
+753.919 352.188 753.823 351.784 753.823 351.277 c
+h
+758.472 353.525 m
+758.501 353.07 l
+758.802 353.43 759.199 353.614 759.691 353.614 c
+760.25 353.614 760.636 353.371 760.853 352.893 c
+761.165 353.371 761.603 353.614 762.161 353.614 c
+763.08 353.614 763.55 353.045 763.572 351.909 c
+763.572 348.557 l
+762.764 348.557 l
+762.764 351.835 l
+762.764 352.188 762.694 352.453 762.558 352.629 c
+762.43 352.806 762.212 352.893 761.911 352.893 c
+761.665 352.893 761.463 352.798 761.308 352.615 c
+761.162 352.427 761.073 352.188 761.044 351.894 c
+761.044 348.557 l
+760.236 348.557 l
+760.236 351.865 l
+760.225 352.548 759.945 352.893 759.398 352.893 c
+758.986 352.893 758.696 352.688 758.53 352.276 c
+758.53 348.557 l
+757.722 348.557 l
+757.722 353.525 l
+h
+f
+q 1 0 0 1 536.9344 341.7219 cm
+0 0 m
+0.302 0.401 0.695 0.603 1.176 0.603 c
+2.058 0.603 2.503 0.019 2.514 -1.146 c
+2.514 -4.453 l
+1.706 -4.453 l
+1.706 -1.19 l
+1.706 -0.801 1.64 -0.525 1.515 -0.367 c
+1.386 -0.201 1.191 -0.118 0.927 -0.118 c
+0.721 -0.118 0.537 -0.187 0.383 -0.323 c
+0.225 -0.452 0.096 -0.625 0 -0.837 c
+0 -4.453 l
+-0.823 -4.453 l
+-0.823 2.602 l
+0 2.602 l
+h
+4.605 1.721 m
+4.605 0.515 l
+5.355 0.515 l
+5.355 -0.147 l
+4.605 -0.147 l
+4.605 -3.218 l
+4.605 -3.417 4.634 -3.568 4.693 -3.674 c
+4.759 -3.773 4.873 -3.821 5.031 -3.821 c
+5.137 -3.821 5.245 -3.803 5.355 -3.763 c
+5.34 -4.453 l
+5.164 -4.512 4.976 -4.542 4.781 -4.542 c
+4.458 -4.542 4.212 -4.432 4.046 -4.203 c
+3.877 -3.968 3.797 -3.645 3.797 -3.233 c
+3.797 -0.147 l
+3.032 -0.147 l
+3.032 0.515 l
+3.797 0.515 l
+3.797 1.721 l
+h
+7.269 1.721 m
+7.269 0.515 l
+8.019 0.515 l
+8.019 -0.147 l
+7.269 -0.147 l
+7.269 -3.218 l
+7.269 -3.417 7.298 -3.568 7.358 -3.674 c
+7.423 -3.773 7.537 -3.821 7.695 -3.821 c
+7.802 -3.821 7.909 -3.803 8.019 -3.763 c
+8.004 -4.453 l
+7.828 -4.512 7.64 -4.542 7.445 -4.542 c
+7.122 -4.542 6.876 -4.432 6.71 -4.203 c
+6.542 -3.968 6.461 -3.645 6.461 -3.233 c
+6.461 -0.147 l
+5.696 -0.147 l
+5.696 0.515 l
+6.461 0.515 l
+6.461 1.721 l
+h
+12.462 -2.204 m
+12.462 -2.991 12.318 -3.579 12.035 -3.968 c
+11.749 -4.351 11.348 -4.542 10.83 -4.542 c
+10.33 -4.542 9.948 -4.357 9.683 -3.983 c
+9.683 -6.364 l
+8.875 -6.364 l
+8.875 0.515 l
+9.61 0.515 l
+9.64 -0.029 l
+9.912 0.389 10.305 0.603 10.816 0.603 c
+11.363 0.603 11.771 0.412 12.035 0.03 c
+12.307 -0.345 12.451 -0.907 12.462 -1.66 c
+h
+11.653 -1.749 m
+11.653 -1.19 11.565 -0.779 11.389 -0.514 c
+11.219 -0.249 10.947 -0.118 10.565 -0.118 c
+10.172 -0.118 9.878 -0.309 9.683 -0.69 c
+9.683 -3.277 l
+9.878 -3.659 10.176 -3.85 10.581 -3.85 c
+10.94 -3.85 11.205 -3.719 11.374 -3.453 c
+11.55 -3.189 11.642 -2.786 11.653 -2.234 c
+h
+15.747 -3.175 m
+15.747 -3.009 15.676 -2.863 15.541 -2.734 c
+15.412 -2.609 15.159 -2.462 14.776 -2.293 c
+14.343 -2.109 14.034 -1.951 13.851 -1.822 c
+13.675 -1.697 13.542 -1.554 13.454 -1.396 c
+13.365 -1.23 13.322 -1.036 13.322 -0.808 c
+13.322 -0.396 13.469 -0.058 13.762 0.206 c
+14.057 0.47 14.431 0.603 14.894 0.603 c
+15.383 0.603 15.776 0.46 16.07 0.177 c
+16.364 -0.099 16.511 -0.455 16.511 -0.897 c
+15.703 -0.897 l
+15.703 -0.672 15.622 -0.481 15.468 -0.323 c
+15.321 -0.168 15.129 -0.087 14.894 -0.087 c
+14.659 -0.087 14.471 -0.154 14.336 -0.278 c
+14.196 -0.396 14.13 -0.565 14.13 -0.779 c
+14.13 -0.947 14.178 -1.08 14.277 -1.176 c
+14.373 -1.275 14.615 -1.407 14.997 -1.572 c
+15.603 -1.807 16.015 -2.04 16.232 -2.263 c
+16.445 -2.491 16.555 -2.774 16.555 -3.116 c
+16.555 -3.549 16.401 -3.895 16.1 -4.159 c
+15.805 -4.417 15.408 -4.542 14.909 -4.542 c
+14.398 -4.542 13.983 -4.394 13.66 -4.101 c
+13.336 -3.806 13.174 -3.432 13.174 -2.969 c
+13.997 -2.969 l
+14.005 -3.245 14.089 -3.461 14.247 -3.615 c
+14.402 -3.773 14.622 -3.85 14.909 -3.85 c
+15.181 -3.85 15.387 -3.792 15.526 -3.674 c
+15.674 -3.549 15.747 -3.38 15.747 -3.175 c
+17.492 -4.012 m
+17.492 -3.865 17.536 -3.744 17.625 -3.645 c
+17.713 -3.549 17.837 -3.498 18.007 -3.498 c
+18.184 -3.498 18.315 -3.549 18.404 -3.645 c
+18.499 -3.744 18.55 -3.865 18.55 -4.012 c
+18.55 -4.152 18.499 -4.27 18.404 -4.365 c
+18.315 -4.453 18.184 -4.498 18.007 -4.498 c
+17.837 -4.498 17.713 -4.453 17.625 -4.365 c
+17.536 -4.27 17.492 -4.152 17.492 -4.012 c
+17.492 -0.249 m
+17.492 -0.103 17.536 0.019 17.625 0.118 c
+17.713 0.214 17.837 0.265 18.007 0.265 c
+18.184 0.265 18.315 0.214 18.404 0.118 c
+18.499 0.019 18.55 -0.103 18.55 -0.249 c
+18.55 -0.389 18.499 -0.507 18.404 -0.602 c
+18.315 -0.69 18.184 -0.735 18.007 -0.735 c
+17.837 -0.735 17.713 -0.69 17.625 -0.602 c
+17.536 -0.507 17.492 -0.389 17.492 -0.249 c
+19.786 -5.026 m
+19.094 -5.026 l
+21.432 2.234 l
+22.122 2.234 l
+h
+22.148 -5.026 m
+21.457 -5.026 l
+23.794 2.234 l
+24.486 2.234 l
+h
+25.103 -1.749 m
+25.103 -0.977 25.242 -0.393 25.529 0 c
+25.812 0.401 26.223 0.603 26.764 0.603 c
+27.271 0.603 27.661 0.387 27.925 -0.043 c
+27.954 0.515 l
+28.69 0.515 l
+28.69 -4.498 l
+28.69 -5.115 28.532 -5.585 28.219 -5.909 c
+27.903 -6.239 27.47 -6.408 26.911 -6.408 c
+26.664 -6.408 26.385 -6.342 26.073 -6.217 c
+25.768 -6.1 25.544 -5.953 25.397 -5.776 c
+25.72 -5.217 l
+26.062 -5.548 26.433 -5.718 26.837 -5.718 c
+27.514 -5.718 27.859 -5.35 27.881 -4.615 c
+27.881 -3.968 l
+27.616 -4.351 27.241 -4.542 26.764 -4.542 c
+26.242 -4.542 25.841 -4.351 25.558 -3.968 c
+25.272 -3.579 25.122 -3.021 25.103 -2.293 c
+h
+25.926 -2.204 m
+25.926 -2.763 26.003 -3.175 26.161 -3.439 c
+26.327 -3.696 26.595 -3.821 26.969 -3.821 c
+27.37 -3.821 27.675 -3.615 27.881 -3.204 c
+27.881 -0.72 l
+27.675 -0.319 27.374 -0.118 26.984 -0.118 c
+26.61 -0.118 26.341 -0.249 26.176 -0.514 c
+26.007 -0.771 25.926 -1.168 25.926 -1.705 c
+h
+30.593 -4.453 -0.808 4.968 re
+30.651 1.838 m
+30.651 1.698 30.611 1.58 30.534 1.485 c
+30.464 1.397 30.35 1.353 30.196 1.353 c
+30.038 1.353 29.92 1.397 29.843 1.485 c
+29.773 1.58 29.741 1.698 29.741 1.838 c
+29.741 1.974 29.773 2.088 29.843 2.176 c
+29.92 2.271 30.034 2.323 30.181 2.323 c
+30.336 2.323 30.453 2.271 30.534 2.176 c
+30.611 2.088 30.651 1.974 30.651 1.838 c
+32.845 1.721 m
+32.845 0.515 l
+33.595 0.515 l
+33.595 -0.147 l
+32.845 -0.147 l
+32.845 -3.218 l
+32.845 -3.417 32.875 -3.568 32.933 -3.674 c
+33 -3.773 33.114 -3.821 33.272 -3.821 c
+33.378 -3.821 33.485 -3.803 33.595 -3.763 c
+33.581 -4.453 l
+33.404 -4.512 33.217 -4.542 33.022 -4.542 c
+32.698 -4.542 32.453 -4.432 32.287 -4.203 c
+32.118 -3.968 32.037 -3.645 32.037 -3.233 c
+32.037 -0.147 l
+31.273 -0.147 l
+31.273 0.515 l
+32.037 0.515 l
+32.037 1.721 l
+h
+35.95 -1.955 -1.896 0.691 re
+39.104 -3.175 m
+39.104 -3.009 39.034 -2.863 38.898 -2.734 c
+38.769 -2.609 38.516 -2.462 38.134 -2.293 c
+37.7 -2.109 37.392 -1.951 37.207 -1.822 c
+37.031 -1.697 36.899 -1.554 36.81 -1.396 c
+36.723 -1.23 36.679 -1.036 36.679 -0.808 c
+36.679 -0.396 36.825 -0.058 37.119 0.206 c
+37.413 0.47 37.788 0.603 38.251 0.603 c
+38.74 0.603 39.133 0.46 39.427 0.177 c
+39.721 -0.099 39.868 -0.455 39.868 -0.897 c
+39.06 -0.897 l
+39.06 -0.672 38.979 -0.481 38.824 -0.323 c
+38.678 -0.168 38.487 -0.087 38.251 -0.087 c
+38.016 -0.087 37.828 -0.154 37.693 -0.278 c
+37.552 -0.396 37.487 -0.565 37.487 -0.779 c
+37.487 -0.947 37.535 -1.08 37.633 -1.176 c
+37.729 -1.275 37.972 -1.407 38.354 -1.572 c
+38.96 -1.807 39.372 -2.04 39.588 -2.263 c
+39.802 -2.491 39.912 -2.774 39.912 -3.116 c
+39.912 -3.549 39.758 -3.895 39.456 -4.159 c
+39.162 -4.417 38.765 -4.542 38.266 -4.542 c
+37.755 -4.542 37.34 -4.394 37.016 -4.101 c
+36.693 -3.806 36.531 -3.432 36.531 -2.969 c
+37.354 -2.969 l
+37.362 -3.245 37.446 -3.461 37.604 -3.615 c
+37.758 -3.773 37.979 -3.85 38.266 -3.85 c
+38.537 -3.85 38.743 -3.792 38.883 -3.674 c
+39.03 -3.549 39.104 -3.38 39.104 -3.175 c
+42.521 -3.85 m
+42.786 -3.85 42.996 -3.77 43.153 -3.601 c
+43.318 -3.436 43.41 -3.197 43.432 -2.881 c
+44.197 -2.881 l
+44.174 -3.362 44.006 -3.759 43.682 -4.072 c
+43.366 -4.388 42.981 -4.542 42.521 -4.542 c
+41.903 -4.542 41.433 -4.351 41.11 -3.968 c
+40.787 -3.579 40.625 -2.998 40.625 -2.234 c
+40.625 -1.69 l
+40.625 -0.937 40.787 -0.367 41.11 0.015 c
+41.433 0.405 41.897 0.603 42.506 0.603 c
+43.013 0.603 43.418 0.441 43.711 0.118 c
+44.013 -0.198 44.174 -0.631 44.197 -1.19 c
+43.432 -1.19 l
+43.41 -0.83 43.322 -0.554 43.168 -0.367 c
+43.01 -0.183 42.79 -0.087 42.506 -0.087 c
+42.154 -0.087 41.889 -0.213 41.712 -0.455 c
+41.536 -0.69 41.441 -1.08 41.433 -1.616 c
+41.433 -2.248 l
+41.433 -2.836 41.521 -3.256 41.698 -3.498 c
+41.874 -3.733 42.146 -3.85 42.521 -3.85 c
+45.733 0.515 m
+45.762 0.059 l
+46.063 0.42 46.46 0.603 46.953 0.603 c
+47.511 0.603 47.897 0.36 48.114 -0.118 c
+48.427 0.36 48.864 0.603 49.423 0.603 c
+50.341 0.603 50.811 0.034 50.834 -1.102 c
+50.834 -4.453 l
+50.025 -4.453 l
+50.025 -1.176 l
+50.025 -0.823 49.955 -0.558 49.819 -0.382 c
+49.691 -0.205 49.474 -0.118 49.172 -0.118 c
+48.926 -0.118 48.724 -0.213 48.569 -0.396 c
+48.423 -0.584 48.334 -0.823 48.305 -1.117 c
+48.305 -4.453 l
+47.497 -4.453 l
+47.497 -1.146 l
+47.486 -0.463 47.206 -0.118 46.659 -0.118 c
+46.248 -0.118 45.957 -0.323 45.791 -0.735 c
+45.791 -4.453 l
+44.983 -4.453 l
+44.983 0.515 l
+h
+51.818 -4.012 m
+51.818 -3.865 51.862 -3.744 51.951 -3.645 c
+52.039 -3.549 52.164 -3.498 52.332 -3.498 c
+52.509 -3.498 52.641 -3.549 52.729 -3.645 c
+52.825 -3.744 52.876 -3.865 52.876 -4.012 c
+52.876 -4.152 52.825 -4.27 52.729 -4.365 c
+52.641 -4.453 52.509 -4.498 52.332 -4.498 c
+52.164 -4.498 52.039 -4.453 51.951 -4.365 c
+51.862 -4.27 51.818 -4.152 51.818 -4.012 c
+55.875 -3.85 m
+56.14 -3.85 56.349 -3.77 56.507 -3.601 c
+56.673 -3.436 56.764 -3.197 56.787 -2.881 c
+57.551 -2.881 l
+57.529 -3.362 57.36 -3.759 57.036 -4.072 c
+56.72 -4.388 56.334 -4.542 55.875 -4.542 c
+55.258 -4.542 54.788 -4.351 54.464 -3.968 c
+54.141 -3.579 53.979 -2.998 53.979 -2.234 c
+53.979 -1.69 l
+53.979 -0.937 54.141 -0.367 54.464 0.015 c
+54.788 0.405 55.251 0.603 55.86 0.603 c
+56.367 0.603 56.772 0.441 57.066 0.118 c
+57.367 -0.198 57.529 -0.631 57.551 -1.19 c
+56.787 -1.19 l
+56.764 -0.83 56.677 -0.554 56.522 -0.367 c
+56.363 -0.183 56.143 -0.087 55.86 -0.087 c
+55.507 -0.087 55.243 -0.213 55.067 -0.455 c
+54.89 -0.69 54.795 -1.08 54.788 -1.616 c
+54.788 -2.248 l
+54.788 -2.836 54.875 -3.256 55.052 -3.498 c
+55.228 -3.733 55.501 -3.85 55.875 -3.85 c
+58.157 -1.734 m
+58.157 -1.022 58.326 -0.452 58.672 -0.029 c
+59.025 0.389 59.488 0.603 60.068 0.603 c
+60.645 0.603 61.105 0.397 61.45 -0.014 c
+61.803 -0.419 61.983 -0.977 61.994 -1.69 c
+61.994 -2.204 l
+61.994 -2.932 61.817 -3.505 61.464 -3.924 c
+61.119 -4.336 60.66 -4.542 60.083 -4.542 c
+59.502 -4.542 59.039 -4.343 58.686 -3.939 c
+58.341 -3.528 58.165 -2.977 58.157 -2.277 c
+h
+58.966 -2.204 m
+58.966 -2.715 59.062 -3.116 59.26 -3.41 c
+59.465 -3.704 59.737 -3.85 60.083 -3.85 c
+60.795 -3.85 61.163 -3.333 61.185 -2.293 c
+61.185 -1.734 l
+61.185 -1.227 61.082 -0.823 60.876 -0.529 c
+60.678 -0.235 60.41 -0.087 60.068 -0.087 c
+59.734 -0.087 59.465 -0.235 59.26 -0.529 c
+59.062 -0.823 58.966 -1.227 58.966 -1.734 c
+h
+63.617 0.515 m
+63.648 0.059 l
+63.949 0.42 64.346 0.603 64.838 0.603 c
+65.396 0.603 65.782 0.36 66 -0.118 c
+66.312 0.36 66.749 0.603 67.307 0.603 c
+68.226 0.603 68.697 0.034 68.718 -1.102 c
+68.718 -4.453 l
+67.91 -4.453 l
+67.91 -1.176 l
+67.91 -0.823 67.841 -0.558 67.704 -0.382 c
+67.575 -0.205 67.359 -0.118 67.058 -0.118 c
+66.811 -0.118 66.609 -0.213 66.455 -0.396 c
+66.308 -0.584 66.22 -0.823 66.19 -1.117 c
+66.19 -4.453 l
+65.381 -4.453 l
+65.381 -1.146 l
+65.371 -0.463 65.092 -0.118 64.544 -0.118 c
+64.132 -0.118 63.842 -0.323 63.677 -0.735 c
+63.677 -4.453 l
+62.869 -4.453 l
+62.869 0.515 l
+h
+69.88 -5.026 m
+69.189 -5.026 l
+71.526 2.234 l
+72.217 2.234 l
+h
+72.834 -1.749 m
+72.834 -0.977 72.974 -0.393 73.26 0 c
+73.543 0.401 73.955 0.603 74.495 0.603 c
+74.966 0.603 75.333 0.412 75.598 0.03 c
+75.598 2.602 l
+76.421 2.602 l
+76.421 -4.453 l
+75.671 -4.453 l
+75.627 -3.924 l
+75.363 -4.336 74.984 -4.542 74.495 -4.542 c
+73.973 -4.542 73.57 -4.347 73.275 -3.954 c
+72.982 -3.553 72.834 -2.983 72.834 -2.248 c
+h
+73.643 -2.204 m
+73.643 -2.763 73.724 -3.175 73.892 -3.439 c
+74.058 -3.696 74.326 -3.821 74.701 -3.821 c
+75.101 -3.821 75.399 -3.623 75.598 -3.218 c
+75.598 -0.706 l
+75.392 -0.316 75.091 -0.118 74.701 -0.118 c
+74.326 -0.118 74.058 -0.249 73.892 -0.514 c
+73.724 -0.771 73.643 -1.168 73.643 -1.705 c
+h
+77.314 -1.734 m
+77.314 -1.022 77.483 -0.452 77.828 -0.029 c
+78.181 0.389 78.644 0.603 79.224 0.603 c
+79.802 0.603 80.261 0.397 80.606 -0.014 c
+80.959 -0.419 81.139 -0.977 81.15 -1.69 c
+81.15 -2.204 l
+81.15 -2.932 80.974 -3.505 80.621 -3.924 c
+80.275 -4.336 79.816 -4.542 79.239 -4.542 c
+78.659 -4.542 78.195 -4.343 77.843 -3.939 c
+77.497 -3.528 77.321 -2.977 77.314 -2.277 c
+h
+78.122 -2.204 m
+78.122 -2.715 78.218 -3.116 78.416 -3.41 c
+78.622 -3.704 78.894 -3.85 79.239 -3.85 c
+79.953 -3.85 80.319 -3.333 80.342 -2.293 c
+80.342 -1.734 l
+80.342 -1.227 80.239 -0.823 80.033 -0.529 c
+79.835 -0.235 79.567 -0.087 79.224 -0.087 c
+78.89 -0.087 78.622 -0.235 78.416 -0.529 c
+78.218 -0.823 78.122 -1.227 78.122 -1.734 c
+h
+85.715 -3.027 m
+86.478 0.515 l
+87.272 0.515 l
+86.067 -4.453 l
+85.42 -4.453 l
+84.45 -0.897 l
+83.494 -4.453 l
+82.848 -4.453 l
+81.643 0.515 l
+82.436 0.515 l
+83.215 -2.94 l
+84.127 0.515 l
+84.774 0.515 l
+h
+88.647 0.515 m
+88.676 -0.014 l
+88.988 0.397 89.389 0.603 89.881 0.603 c
+90.763 0.603 91.208 0.019 91.219 -1.146 c
+91.219 -4.453 l
+90.411 -4.453 l
+90.411 -1.19 l
+90.411 -0.801 90.345 -0.525 90.22 -0.367 c
+90.091 -0.201 89.896 -0.118 89.632 -0.118 c
+89.426 -0.118 89.242 -0.187 89.088 -0.323 c
+88.93 -0.452 88.801 -0.625 88.705 -0.837 c
+88.705 -4.453 l
+87.882 -4.453 l
+87.882 0.515 l
+h
+93.137 -4.453 -0.808 7.056 re
+94.159 -1.734 m
+94.159 -1.022 94.328 -0.452 94.673 -0.029 c
+95.026 0.389 95.489 0.603 96.069 0.603 c
+96.647 0.603 97.106 0.397 97.451 -0.014 c
+97.804 -0.419 97.985 -0.977 97.995 -1.69 c
+97.995 -2.204 l
+97.995 -2.932 97.819 -3.505 97.466 -3.924 c
+97.121 -4.336 96.661 -4.542 96.084 -4.542 c
+95.504 -4.542 95.041 -4.343 94.688 -3.939 c
+94.343 -3.528 94.166 -2.977 94.159 -2.277 c
+h
+94.968 -2.204 m
+94.968 -2.715 95.063 -3.116 95.261 -3.41 c
+95.467 -3.704 95.739 -3.85 96.084 -3.85 c
+96.797 -3.85 97.165 -3.333 97.187 -2.293 c
+97.187 -1.734 l
+97.187 -1.227 97.084 -0.823 96.878 -0.529 c
+96.68 -0.235 96.412 -0.087 96.069 -0.087 c
+95.735 -0.087 95.467 -0.235 95.261 -0.529 c
+95.063 -0.823 94.968 -1.227 94.968 -1.734 c
+h
+101.413 -4.453 m
+101.362 -4.347 101.328 -4.167 101.31 -3.91 c
+101.023 -4.332 100.656 -4.542 100.208 -4.542 c
+99.755 -4.542 99.402 -4.421 99.149 -4.174 c
+98.903 -3.921 98.781 -3.564 98.781 -3.101 c
+98.781 -2.594 98.951 -2.19 99.296 -1.896 c
+99.637 -1.602 100.108 -1.452 100.707 -1.44 c
+101.295 -1.44 l
+101.295 -0.911 l
+101.295 -0.617 101.225 -0.407 101.089 -0.278 c
+100.961 -0.154 100.766 -0.087 100.501 -0.087 c
+100.256 -0.087 100.053 -0.161 99.899 -0.309 c
+99.752 -0.455 99.678 -0.642 99.678 -0.866 c
+98.855 -0.866 l
+98.855 -0.613 98.929 -0.367 99.076 -0.132 c
+99.23 0.104 99.436 0.283 99.693 0.412 c
+99.947 0.537 100.229 0.603 100.545 0.603 c
+101.052 0.603 101.442 0.474 101.707 0.221 c
+101.971 -0.025 102.104 -0.393 102.104 -0.881 c
+102.104 -3.38 l
+102.111 -3.763 102.166 -4.097 102.265 -4.38 c
+102.265 -4.453 l
+h
+100.34 -3.806 m
+100.535 -3.806 100.722 -3.755 100.898 -3.645 c
+101.082 -3.528 101.214 -3.391 101.295 -3.233 c
+101.295 -2.042 l
+100.84 -2.042 l
+100.458 -2.054 100.152 -2.142 99.928 -2.308 c
+99.701 -2.476 99.59 -2.705 99.59 -2.998 c
+99.59 -3.285 99.641 -3.491 99.752 -3.615 c
+99.87 -3.744 100.065 -3.806 100.34 -3.806 c
+103.015 -1.749 m
+103.015 -0.977 103.155 -0.393 103.441 0 c
+103.724 0.401 104.136 0.603 104.676 0.603 c
+105.146 0.603 105.514 0.412 105.779 0.03 c
+105.779 2.602 l
+106.602 2.602 l
+106.602 -4.453 l
+105.852 -4.453 l
+105.808 -3.924 l
+105.543 -4.336 105.164 -4.542 104.676 -4.542 c
+104.154 -4.542 103.75 -4.347 103.456 -3.954 c
+103.162 -3.553 103.015 -2.983 103.015 -2.248 c
+h
+103.824 -2.204 m
+103.824 -2.763 103.905 -3.175 104.073 -3.439 c
+104.239 -3.696 104.507 -3.821 104.882 -3.821 c
+105.282 -3.821 105.58 -3.623 105.779 -3.218 c
+105.779 -0.706 l
+105.573 -0.316 105.272 -0.118 104.882 -0.118 c
+104.507 -0.118 104.239 -0.249 104.073 -0.514 c
+103.905 -0.771 103.824 -1.168 103.824 -1.705 c
+h
+110.082 -3.175 m
+110.082 -3.009 110.012 -2.863 109.876 -2.734 c
+109.748 -2.609 109.494 -2.462 109.112 -2.293 c
+108.678 -2.109 108.369 -1.951 108.185 -1.822 c
+108.009 -1.697 107.876 -1.554 107.789 -1.396 c
+107.701 -1.23 107.656 -1.036 107.656 -0.808 c
+107.656 -0.396 107.803 -0.058 108.098 0.206 c
+108.391 0.47 108.766 0.603 109.229 0.603 c
+109.718 0.603 110.111 0.46 110.405 0.177 c
+110.699 -0.099 110.846 -0.455 110.846 -0.897 c
+110.037 -0.897 l
+110.037 -0.672 109.956 -0.481 109.802 -0.323 c
+109.655 -0.168 109.464 -0.087 109.229 -0.087 c
+108.994 -0.087 108.807 -0.154 108.67 -0.278 c
+108.531 -0.396 108.464 -0.565 108.464 -0.779 c
+108.464 -0.947 108.512 -1.08 108.612 -1.176 c
+108.707 -1.275 108.95 -1.407 109.332 -1.572 c
+109.939 -1.807 110.35 -2.04 110.567 -2.263 c
+110.78 -2.491 110.89 -2.774 110.89 -3.116 c
+110.89 -3.549 110.735 -3.895 110.434 -4.159 c
+110.141 -4.417 109.744 -4.542 109.243 -4.542 c
+108.733 -4.542 108.318 -4.394 107.994 -4.101 c
+107.671 -3.806 107.51 -3.432 107.51 -2.969 c
+108.333 -2.969 l
+108.339 -3.245 108.424 -3.461 108.582 -3.615 c
+108.736 -3.773 108.957 -3.85 109.243 -3.85 c
+109.515 -3.85 109.721 -3.792 109.861 -3.674 c
+110.008 -3.549 110.082 -3.38 110.082 -3.175 c
+111.824 -4.012 m
+111.824 -3.865 111.867 -3.744 111.956 -3.645 c
+112.044 -3.549 112.169 -3.498 112.337 -3.498 c
+112.514 -3.498 112.647 -3.549 112.734 -3.645 c
+112.83 -3.744 112.882 -3.865 112.882 -4.012 c
+112.882 -4.152 112.83 -4.27 112.734 -4.365 c
+112.647 -4.453 112.514 -4.498 112.337 -4.498 c
+112.169 -4.498 112.044 -4.453 111.956 -4.365 c
+111.867 -4.27 111.824 -4.152 111.824 -4.012 c
+f
+Q
+q 1 0 0 1 539.3456 316.4395 cm
+0 0 m
+-2.249 0 l
+-2.778 -1.749 l
+-3.645 -1.749 l
+-1.484 4.939 l
+-0.765 4.939 l
+1.396 -1.749 l
+0.529 -1.749 l
+h
+-2.028 0.721 m
+-0.206 0.721 l
+-1.132 3.763 l
+h
+2.734 3.219 m
+2.763 2.691 l
+3.075 3.102 3.476 3.308 3.969 3.308 c
+4.85 3.308 5.295 2.723 5.307 1.559 c
+5.307 -1.749 l
+4.498 -1.749 l
+4.498 1.515 l
+4.498 1.904 4.432 2.18 4.307 2.338 c
+4.178 2.503 3.983 2.587 3.719 2.587 c
+3.513 2.587 3.329 2.517 3.175 2.382 c
+3.017 2.253 2.888 2.08 2.793 1.867 c
+2.793 -1.749 l
+1.97 -1.749 l
+1.97 3.219 l
+h
+10.911 -1.837 m
+10.293 -1.837 9.816 -1.657 9.485 -1.294 c
+9.161 -0.922 8.992 -0.378 8.985 0.339 c
+8.985 0.941 l
+8.985 1.676 9.147 2.253 9.469 2.675 c
+9.793 3.094 10.242 3.308 10.822 3.308 c
+11.399 3.308 11.829 3.12 12.116 2.749 c
+12.409 2.386 12.56 1.812 12.571 1.029 c
+12.571 0.5 l
+9.793 0.5 l
+9.793 0.383 l
+9.793 -0.158 9.889 -0.551 10.088 -0.793 c
+10.293 -1.028 10.58 -1.146 10.954 -1.146 c
+11.197 -1.146 11.41 -1.102 11.586 -1.014 c
+11.771 -0.926 11.943 -0.786 12.101 -0.588 c
+12.527 -1.102 l
+12.174 -1.595 11.634 -1.837 10.911 -1.837 c
+10.822 2.617 m
+10.487 2.617 10.238 2.5 10.073 2.264 c
+9.903 2.036 9.812 1.68 9.793 1.191 c
+11.748 1.191 l
+11.748 1.309 l
+11.726 1.779 11.645 2.11 11.499 2.309 c
+11.351 2.514 11.123 2.617 10.822 2.617 c
+14.805 1.411 m
+15.658 3.219 l
+16.598 3.219 l
+15.247 0.765 l
+16.628 -1.749 l
+15.702 -1.749 l
+14.82 0.118 l
+13.938 -1.749 l
+12.997 -1.749 l
+14.379 0.765 l
+13.042 3.219 l
+13.968 3.219 l
+h
+18.98 -1.146 m
+19.245 -1.146 19.455 -1.065 19.613 -0.897 c
+19.777 -0.731 19.869 -0.492 19.891 -0.176 c
+20.656 -0.176 l
+20.634 -0.658 20.465 -1.055 20.141 -1.367 c
+19.825 -1.683 19.439 -1.837 18.98 -1.837 c
+18.362 -1.837 17.892 -1.646 17.569 -1.263 c
+17.246 -0.874 17.084 -0.294 17.084 0.47 c
+17.084 1.015 l
+17.084 1.768 17.246 2.338 17.569 2.72 c
+17.892 3.109 18.356 3.308 18.965 3.308 c
+19.472 3.308 19.877 3.146 20.17 2.822 c
+20.472 2.506 20.634 2.073 20.656 1.515 c
+19.891 1.515 l
+19.869 1.875 19.781 2.151 19.627 2.338 c
+19.469 2.521 19.248 2.617 18.965 2.617 c
+18.613 2.617 18.348 2.492 18.171 2.249 c
+17.995 2.014 17.899 1.625 17.892 1.088 c
+17.892 0.456 l
+17.892 -0.132 17.98 -0.551 18.157 -0.793 c
+18.333 -1.028 18.605 -1.146 18.98 -1.146 c
+23.206 -1.837 m
+22.589 -1.837 22.111 -1.657 21.78 -1.294 c
+21.456 -0.922 21.288 -0.378 21.28 0.339 c
+21.28 0.941 l
+21.28 1.676 21.442 2.253 21.766 2.675 c
+22.089 3.094 22.537 3.308 23.118 3.308 c
+23.694 3.308 24.124 3.12 24.411 2.749 c
+24.706 2.386 24.856 1.812 24.867 1.029 c
+24.867 0.5 l
+22.089 0.5 l
+22.089 0.383 l
+22.089 -0.158 22.185 -0.551 22.383 -0.793 c
+22.589 -1.028 22.875 -1.146 23.25 -1.146 c
+23.493 -1.146 23.706 -1.102 23.883 -1.014 c
+24.066 -0.926 24.239 -0.786 24.397 -0.588 c
+24.823 -1.102 l
+24.471 -1.595 23.93 -1.837 23.206 -1.837 c
+23.118 2.617 m
+22.784 2.617 22.534 2.5 22.368 2.264 c
+22.2 2.036 22.107 1.68 22.089 1.191 c
+24.043 1.191 l
+24.043 1.309 l
+24.022 1.779 23.941 2.11 23.794 2.309 c
+23.647 2.514 23.419 2.617 23.118 2.617 c
+26.543 -1.749 -0.809 7.056 re
+28.608 -1.749 -0.808 7.056 re
+31.567 -1.837 m
+30.948 -1.837 30.471 -1.657 30.14 -1.294 c
+29.817 -0.922 29.648 -0.378 29.641 0.339 c
+29.641 0.941 l
+29.641 1.676 29.803 2.253 30.125 2.675 c
+30.449 3.094 30.898 3.308 31.478 3.308 c
+32.055 3.308 32.485 3.12 32.772 2.749 c
+33.065 2.386 33.216 1.812 33.227 1.029 c
+33.227 0.5 l
+30.449 0.5 l
+30.449 0.383 l
+30.449 -0.158 30.545 -0.551 30.743 -0.793 c
+30.948 -1.028 31.235 -1.146 31.61 -1.146 c
+31.852 -1.146 32.066 -1.102 32.242 -1.014 c
+32.426 -0.926 32.599 -0.786 32.757 -0.588 c
+33.183 -1.102 l
+32.83 -1.595 32.29 -1.837 31.567 -1.837 c
+31.478 2.617 m
+31.143 2.617 30.894 2.5 30.728 2.264 c
+30.559 2.036 30.468 1.68 30.449 1.191 c
+32.404 1.191 l
+32.404 1.309 l
+32.382 1.779 32.301 2.11 32.154 2.309 c
+32.007 2.514 31.779 2.617 31.478 2.617 c
+34.785 3.219 m
+34.815 2.691 l
+35.127 3.102 35.528 3.308 36.02 3.308 c
+36.901 3.308 37.346 2.723 37.358 1.559 c
+37.358 -1.749 l
+36.549 -1.749 l
+36.549 1.515 l
+36.549 1.904 36.483 2.18 36.358 2.338 c
+36.23 2.503 36.035 2.587 35.77 2.587 c
+35.565 2.587 35.38 2.517 35.226 2.382 c
+35.068 2.253 34.94 2.08 34.844 1.867 c
+34.844 -1.749 l
+34.021 -1.749 l
+34.021 3.219 l
+h
+39.471 4.425 m
+39.471 3.219 l
+40.22 3.219 l
+40.22 2.558 l
+39.471 2.558 l
+39.471 -0.514 l
+39.471 -0.712 39.5 -0.864 39.559 -0.97 c
+39.625 -1.069 39.739 -1.117 39.897 -1.117 c
+40.003 -1.117 40.11 -1.099 40.22 -1.058 c
+40.205 -1.749 l
+40.029 -1.807 39.841 -1.837 39.647 -1.837 c
+39.324 -1.837 39.077 -1.727 38.912 -1.499 c
+38.743 -1.263 38.662 -0.941 38.662 -0.529 c
+38.662 2.558 l
+37.898 2.558 l
+37.898 3.219 l
+38.662 3.219 l
+38.662 4.425 l
+h
+48.154 -0.911 m
+48.007 -1.102 l
+47.584 -1.595 46.967 -1.837 46.155 -1.837 c
+45.427 -1.837 44.861 -1.598 44.45 -1.117 c
+44.038 -0.639 43.825 0.037 43.818 0.912 c
+43.818 2.22 l
+43.818 3.161 44.001 3.859 44.377 4.322 c
+44.747 4.792 45.31 5.027 46.067 5.027 c
+46.702 5.027 47.199 4.851 47.552 4.499 c
+47.912 4.146 48.113 3.639 48.154 2.984 c
+47.316 2.984 l
+47.276 3.396 47.158 3.72 46.964 3.955 c
+46.765 4.19 46.467 4.308 46.067 4.308 c
+45.585 4.308 45.233 4.15 45.009 3.837 c
+44.78 3.521 44.663 3.021 44.656 2.338 c
+44.656 0.971 l
+44.656 0.294 44.78 -0.228 45.038 -0.588 c
+45.302 -0.941 45.674 -1.117 46.155 -1.117 c
+46.603 -1.117 46.948 -1.01 47.184 -0.793 c
+47.316 -0.675 l
+47.316 0.867 l
+46.081 0.867 l
+46.081 1.588 l
+48.154 1.588 l
+h
+50.076 -1.749 -0.808 4.968 re
+50.135 4.543 m
+50.135 4.403 50.094 4.285 50.017 4.19 c
+49.948 4.102 49.834 4.057 49.679 4.057 c
+49.521 4.057 49.404 4.102 49.327 4.19 c
+49.256 4.285 49.223 4.403 49.223 4.543 c
+49.223 4.678 49.256 4.792 49.327 4.881 c
+49.404 4.976 49.518 5.027 49.664 5.027 c
+49.819 5.027 49.936 4.976 50.017 4.881 c
+50.094 4.792 50.135 4.678 50.135 4.543 c
+52.329 4.425 m
+52.329 3.219 l
+53.078 3.219 l
+53.078 2.558 l
+52.329 2.558 l
+52.329 -0.514 l
+52.329 -0.712 52.358 -0.864 52.417 -0.97 c
+52.483 -1.069 52.597 -1.117 52.755 -1.117 c
+52.861 -1.117 52.968 -1.099 53.078 -1.058 c
+53.063 -1.749 l
+52.887 -1.807 52.699 -1.837 52.505 -1.837 c
+52.182 -1.837 51.935 -1.727 51.77 -1.499 c
+51.6 -1.263 51.521 -0.941 51.521 -0.529 c
+51.521 2.558 l
+50.756 2.558 l
+50.756 3.219 l
+51.521 3.219 l
+51.521 4.425 l
+h
+58.443 -1.146 m
+58.708 -1.146 58.918 -1.065 59.076 -0.897 c
+59.241 -0.731 59.332 -0.492 59.355 -0.176 c
+60.119 -0.176 l
+60.097 -0.658 59.928 -1.055 59.604 -1.367 c
+59.288 -1.683 58.903 -1.837 58.443 -1.837 c
+57.826 -1.837 57.356 -1.646 57.032 -1.263 c
+56.709 -0.874 56.547 -0.294 56.547 0.47 c
+56.547 1.015 l
+56.547 1.768 56.709 2.338 57.032 2.72 c
+57.356 3.109 57.819 3.308 58.428 3.308 c
+58.935 3.308 59.34 3.146 59.634 2.822 c
+59.935 2.506 60.097 2.073 60.119 1.515 c
+59.355 1.515 l
+59.332 1.875 59.244 2.151 59.09 2.338 c
+58.932 2.521 58.712 2.617 58.428 2.617 c
+58.076 2.617 57.811 2.492 57.635 2.249 c
+57.458 2.014 57.362 1.625 57.356 1.088 c
+57.356 0.456 l
+57.356 -0.132 57.443 -0.551 57.62 -0.793 c
+57.796 -1.028 58.068 -1.146 58.443 -1.146 c
+60.729 0.971 m
+60.729 1.683 60.898 2.253 61.243 2.675 c
+61.596 3.094 62.06 3.308 62.64 3.308 c
+63.217 3.308 63.676 3.102 64.022 2.691 c
+64.375 2.286 64.555 1.727 64.566 1.015 c
+64.566 0.5 l
+64.566 -0.228 64.389 -0.801 64.036 -1.219 c
+63.691 -1.631 63.232 -1.837 62.654 -1.837 c
+62.074 -1.837 61.611 -1.639 61.258 -1.234 c
+60.913 -0.823 60.736 -0.272 60.729 0.427 c
+h
+61.538 0.5 m
+61.538 -0.01 61.633 -0.411 61.831 -0.706 c
+62.037 -0.999 62.309 -1.146 62.654 -1.146 c
+63.367 -1.146 63.735 -0.628 63.757 0.412 c
+63.757 0.971 l
+63.757 1.478 63.654 1.881 63.448 2.176 c
+63.25 2.469 62.982 2.617 62.64 2.617 c
+62.305 2.617 62.037 2.469 61.831 2.176 c
+61.633 1.881 61.538 1.478 61.538 0.971 c
+h
+67.968 -1.308 m
+67.693 -1.66 67.296 -1.837 66.777 -1.837 c
+66.337 -1.837 65.998 -1.687 65.763 -1.381 c
+65.536 -1.069 65.418 -0.613 65.411 -0.014 c
+65.411 3.219 l
+66.22 3.219 l
+66.22 0.044 l
+66.22 -0.731 66.455 -1.117 66.925 -1.117 c
+67.413 -1.117 67.751 -0.897 67.939 -0.455 c
+67.939 3.219 l
+68.762 3.219 l
+68.762 -1.749 l
+67.984 -1.749 l
+h
+71.857 2.455 m
+71.739 2.473 71.614 2.484 71.489 2.484 c
+71.066 2.484 70.776 2.257 70.621 1.808 c
+70.621 -1.749 l
+69.798 -1.749 l
+69.798 3.219 l
+70.592 3.219 l
+70.607 2.72 l
+70.82 3.109 71.128 3.308 71.533 3.308 c
+71.658 3.308 71.768 3.286 71.857 3.249 c
+h
+74.976 -0.47 m
+74.976 -0.305 74.906 -0.158 74.77 -0.029 c
+74.642 0.096 74.388 0.243 74.006 0.412 c
+73.572 0.595 73.264 0.754 73.08 0.882 c
+72.904 1.008 72.771 1.151 72.683 1.309 c
+72.595 1.474 72.551 1.669 72.551 1.897 c
+72.551 2.309 72.698 2.646 72.992 2.911 c
+73.285 3.175 73.661 3.308 74.124 3.308 c
+74.612 3.308 75.005 3.165 75.3 2.882 c
+75.593 2.606 75.741 2.249 75.741 1.808 c
+74.932 1.808 l
+74.932 2.033 74.851 2.224 74.697 2.382 c
+74.55 2.536 74.359 2.617 74.124 2.617 c
+73.888 2.617 73.701 2.55 73.565 2.426 c
+73.426 2.309 73.359 2.139 73.359 1.926 c
+73.359 1.757 73.407 1.625 73.507 1.529 c
+73.602 1.43 73.844 1.297 74.226 1.133 c
+74.833 0.897 75.244 0.665 75.461 0.441 c
+75.674 0.214 75.784 -0.07 75.784 -0.411 c
+75.784 -0.845 75.63 -1.19 75.329 -1.454 c
+75.035 -1.712 74.638 -1.837 74.138 -1.837 c
+73.628 -1.837 73.212 -1.69 72.888 -1.396 c
+72.566 -1.102 72.404 -0.727 72.404 -0.264 c
+73.227 -0.264 l
+73.235 -0.54 73.318 -0.756 73.476 -0.911 c
+73.631 -1.069 73.852 -1.146 74.138 -1.146 c
+74.411 -1.146 74.616 -1.087 74.756 -0.97 c
+74.903 -0.845 74.976 -0.675 74.976 -0.47 c
+78.438 -1.837 m
+77.821 -1.837 77.343 -1.657 77.012 -1.294 c
+76.688 -0.922 76.52 -0.378 76.512 0.339 c
+76.512 0.941 l
+76.512 1.676 76.674 2.253 76.998 2.675 c
+77.32 3.094 77.769 3.308 78.349 3.308 c
+78.926 3.308 79.356 3.12 79.643 2.749 c
+79.937 2.386 80.088 1.812 80.098 1.029 c
+80.098 0.5 l
+77.32 0.5 l
+77.32 0.383 l
+77.32 -0.158 77.416 -0.551 77.615 -0.793 c
+77.821 -1.028 78.107 -1.146 78.482 -1.146 c
+78.725 -1.146 78.937 -1.102 79.114 -1.014 c
+79.298 -0.926 79.47 -0.786 79.628 -0.588 c
+80.055 -1.102 l
+79.702 -1.595 79.161 -1.837 78.438 -1.837 c
+78.349 2.617 m
+78.016 2.617 77.765 2.5 77.6 2.264 c
+77.43 2.036 77.339 1.68 77.32 1.191 c
+79.275 1.191 l
+79.275 1.309 l
+79.254 1.779 79.173 2.11 79.026 2.309 c
+78.879 2.514 78.651 2.617 78.349 2.617 c
+85.416 -1.146 m
+85.681 -1.146 85.89 -1.065 86.049 -0.897 c
+86.213 -0.731 86.305 -0.492 86.328 -0.176 c
+87.092 -0.176 l
+87.07 -0.658 86.901 -1.055 86.577 -1.367 c
+86.261 -1.683 85.875 -1.837 85.416 -1.837 c
+84.799 -1.837 84.329 -1.646 84.005 -1.263 c
+83.682 -0.874 83.52 -0.294 83.52 0.47 c
+83.52 1.015 l
+83.52 1.768 83.682 2.338 84.005 2.72 c
+84.329 3.109 84.792 3.308 85.401 3.308 c
+85.908 3.308 86.313 3.146 86.606 2.822 c
+86.908 2.506 87.07 2.073 87.092 1.515 c
+86.328 1.515 l
+86.305 1.875 86.217 2.151 86.063 2.338 c
+85.905 2.521 85.684 2.617 85.401 2.617 c
+85.048 2.617 84.784 2.492 84.607 2.249 c
+84.431 2.014 84.335 1.625 84.329 1.088 c
+84.329 0.456 l
+84.329 -0.132 84.416 -0.551 84.593 -0.793 c
+84.769 -1.028 85.041 -1.146 85.416 -1.146 c
+90.421 -1.749 m
+90.369 -1.643 90.336 -1.462 90.319 -1.205 c
+90.032 -1.627 89.664 -1.837 89.216 -1.837 c
+88.763 -1.837 88.411 -1.716 88.158 -1.469 c
+87.911 -1.216 87.79 -0.86 87.79 -0.396 c
+87.79 0.111 87.959 0.515 88.304 0.809 c
+88.646 1.103 89.116 1.253 89.715 1.264 c
+90.303 1.264 l
+90.303 1.794 l
+90.303 2.088 90.234 2.297 90.097 2.426 c
+89.969 2.55 89.775 2.617 89.509 2.617 c
+89.264 2.617 89.062 2.544 88.907 2.396 c
+88.76 2.249 88.686 2.062 88.686 1.838 c
+87.863 1.838 l
+87.863 2.091 87.937 2.338 88.084 2.573 c
+88.239 2.808 88.445 2.988 88.701 3.117 c
+88.954 3.242 89.238 3.308 89.554 3.308 c
+90.061 3.308 90.45 3.179 90.716 2.926 c
+90.98 2.679 91.112 2.311 91.112 1.823 c
+91.112 -0.675 l
+91.119 -1.058 91.175 -1.392 91.273 -1.675 c
+91.273 -1.749 l
+h
+89.348 -1.102 m
+89.543 -1.102 89.731 -1.051 89.906 -0.941 c
+90.091 -0.823 90.223 -0.687 90.303 -0.529 c
+90.303 0.662 l
+89.848 0.662 l
+89.465 0.651 89.16 0.563 88.937 0.397 c
+88.709 0.229 88.599 0 88.599 -0.294 c
+88.599 -0.58 88.65 -0.786 88.76 -0.911 c
+88.877 -1.04 89.073 -1.102 89.348 -1.102 c
+92.95 3.219 m
+92.979 2.691 l
+93.291 3.102 93.692 3.308 94.184 3.308 c
+95.066 3.308 95.51 2.723 95.522 1.559 c
+95.522 -1.749 l
+94.714 -1.749 l
+94.714 1.515 l
+94.714 1.904 94.647 2.18 94.522 2.338 c
+94.394 2.503 94.199 2.587 93.934 2.587 c
+93.729 2.587 93.544 2.517 93.39 2.382 c
+93.232 2.253 93.104 2.08 93.008 1.867 c
+93.008 -1.749 l
+92.185 -1.749 l
+92.185 3.219 l
+h
+102.949 0.5 m
+102.949 -0.276 102.805 -0.86 102.522 -1.249 c
+102.246 -1.643 101.846 -1.837 101.317 -1.837 c
+100.795 -1.837 100.405 -1.612 100.141 -1.161 c
+100.097 -1.749 l
+99.362 -1.749 l
+99.362 5.307 l
+100.17 5.307 l
+100.17 2.675 l
+100.435 3.094 100.817 3.308 101.317 3.308 c
+101.853 3.308 102.261 3.117 102.537 2.735 c
+102.809 2.352 102.949 1.768 102.949 0.985 c
+h
+102.14 0.956 m
+102.14 1.544 102.055 1.959 101.89 2.205 c
+101.733 2.459 101.467 2.587 101.097 2.587 c
+100.685 2.587 100.376 2.359 100.17 1.912 c
+100.17 -0.455 l
+100.365 -0.897 100.677 -1.117 101.111 -1.117 c
+101.471 -1.117 101.733 -0.992 101.89 -0.735 c
+102.055 -0.481 102.14 -0.084 102.14 0.456 c
+h
+105.59 -1.837 m
+104.973 -1.837 104.495 -1.657 104.164 -1.294 c
+103.842 -0.922 103.672 -0.378 103.665 0.339 c
+103.665 0.941 l
+103.665 1.676 103.827 2.253 104.15 2.675 c
+104.474 3.094 104.922 3.308 105.502 3.308 c
+106.08 3.308 106.51 3.12 106.796 2.749 c
+107.09 2.386 107.241 1.812 107.252 1.029 c
+107.252 0.5 l
+104.474 0.5 l
+104.474 0.383 l
+104.474 -0.158 104.569 -0.551 104.767 -0.793 c
+104.973 -1.028 105.26 -1.146 105.635 -1.146 c
+105.877 -1.146 106.09 -1.102 106.267 -1.014 c
+106.45 -0.926 106.623 -0.786 106.781 -0.588 c
+107.208 -1.102 l
+106.855 -1.595 106.315 -1.837 105.59 -1.837 c
+105.502 2.617 m
+105.168 2.617 104.918 2.5 104.752 2.264 c
+104.584 2.036 104.492 1.68 104.474 1.191 c
+106.429 1.191 l
+106.429 1.309 l
+106.406 1.779 106.325 2.11 106.178 2.309 c
+106.032 2.514 105.804 2.617 105.502 2.617 c
+111.202 -1.749 m
+111.202 2.558 l
+110.555 2.558 l
+110.555 3.219 l
+111.202 3.219 l
+111.202 3.793 l
+111.209 4.3 111.337 4.697 111.584 4.983 c
+111.827 5.266 112.176 5.409 112.628 5.409 c
+112.782 5.409 112.943 5.38 113.113 5.322 c
+113.068 4.63 l
+112.958 4.66 112.837 4.675 112.702 4.675 c
+112.238 4.675 112.01 4.344 112.01 3.69 c
+112.01 3.219 l
+112.863 3.219 l
+112.863 2.558 l
+112.01 2.558 l
+112.01 -1.749 l
+h
+113.532 0.971 m
+113.532 1.683 113.701 2.253 114.046 2.675 c
+114.399 3.094 114.862 3.308 115.443 3.308 c
+116.019 3.308 116.479 3.102 116.825 2.691 c
+117.177 2.286 117.357 1.727 117.369 1.015 c
+117.369 0.5 l
+117.369 -0.228 117.192 -0.801 116.839 -1.219 c
+116.494 -1.631 116.035 -1.837 115.457 -1.837 c
+114.877 -1.837 114.414 -1.639 114.061 -1.234 c
+113.716 -0.823 113.539 -0.272 113.532 0.427 c
+h
+114.34 0.5 m
+114.34 -0.01 114.435 -0.411 114.634 -0.706 c
+114.84 -0.999 115.112 -1.146 115.457 -1.146 c
+116.17 -1.146 116.538 -0.628 116.56 0.412 c
+116.56 0.971 l
+116.56 1.478 116.457 1.881 116.251 2.176 c
+116.052 2.469 115.784 2.617 115.443 2.617 c
+115.108 2.617 114.84 2.469 114.634 2.176 c
+114.435 1.881 114.34 1.478 114.34 0.971 c
+h
+120.767 -1.308 m
+120.492 -1.66 120.095 -1.837 119.576 -1.837 c
+119.136 -1.837 118.797 -1.687 118.562 -1.381 c
+118.335 -1.069 118.217 -0.613 118.21 -0.014 c
+118.21 3.219 l
+119.019 3.219 l
+119.019 0.044 l
+119.019 -0.731 119.254 -1.117 119.724 -1.117 c
+120.212 -1.117 120.55 -0.897 120.738 -0.455 c
+120.738 3.219 l
+121.561 3.219 l
+121.561 -1.749 l
+120.782 -1.749 l
+h
+123.366 3.219 m
+123.395 2.691 l
+123.707 3.102 124.108 3.308 124.6 3.308 c
+125.482 3.308 125.926 2.723 125.938 1.559 c
+125.938 -1.749 l
+125.13 -1.749 l
+125.13 1.515 l
+125.13 1.904 125.063 2.18 124.938 2.338 c
+124.81 2.503 124.615 2.587 124.351 2.587 c
+124.145 2.587 123.96 2.517 123.806 2.382 c
+123.648 2.253 123.52 2.08 123.424 1.867 c
+123.424 -1.749 l
+122.601 -1.749 l
+122.601 3.219 l
+h
+126.813 0.956 m
+126.813 1.727 126.952 2.311 127.239 2.705 c
+127.522 3.105 127.933 3.308 128.473 3.308 c
+128.943 3.308 129.311 3.117 129.576 2.735 c
+129.576 5.307 l
+130.399 5.307 l
+130.399 -1.749 l
+129.649 -1.749 l
+129.605 -1.219 l
+129.34 -1.631 128.962 -1.837 128.473 -1.837 c
+127.952 -1.837 127.547 -1.643 127.253 -1.249 c
+126.959 -0.849 126.813 -0.278 126.813 0.456 c
+h
+127.621 0.5 m
+127.621 -0.058 127.702 -0.47 127.871 -0.735 c
+128.036 -0.992 128.305 -1.117 128.679 -1.117 c
+129.08 -1.117 129.377 -0.918 129.576 -0.514 c
+129.576 1.999 l
+129.37 2.389 129.068 2.587 128.679 2.587 c
+128.305 2.587 128.036 2.455 127.871 2.191 c
+127.702 1.933 127.621 1.536 127.621 1 c
+h
+135.125 -1.749 -0.809 4.968 re
+135.183 4.543 m
+135.183 4.403 135.143 4.285 135.066 4.19 c
+134.996 4.102 134.882 4.057 134.728 4.057 c
+134.57 4.057 134.452 4.102 134.375 4.19 c
+134.306 4.285 134.272 4.403 134.272 4.543 c
+134.272 4.678 134.306 4.792 134.375 4.881 c
+134.452 4.976 134.566 5.027 134.713 5.027 c
+134.867 5.027 134.985 4.976 135.066 4.881 c
+135.143 4.792 135.183 4.678 135.183 4.543 c
+137.072 3.219 m
+137.102 2.691 l
+137.414 3.102 137.815 3.308 138.307 3.308 c
+139.189 3.308 139.634 2.723 139.644 1.559 c
+139.644 -1.749 l
+138.836 -1.749 l
+138.836 1.515 l
+138.836 1.904 138.77 2.18 138.645 2.338 c
+138.516 2.503 138.322 2.587 138.057 2.587 c
+137.851 2.587 137.668 2.517 137.513 2.382 c
+137.355 2.253 137.227 2.08 137.131 1.867 c
+137.131 -1.749 l
+136.307 -1.749 l
+136.307 3.219 l
+h
+144.547 4.425 m
+144.547 3.219 l
+145.296 3.219 l
+145.296 2.558 l
+144.547 2.558 l
+144.547 -0.514 l
+144.547 -0.712 144.577 -0.864 144.635 -0.97 c
+144.701 -1.069 144.815 -1.117 144.973 -1.117 c
+145.08 -1.117 145.186 -1.099 145.296 -1.058 c
+145.282 -1.749 l
+145.105 -1.807 144.918 -1.837 144.723 -1.837 c
+144.4 -1.837 144.153 -1.727 143.988 -1.499 c
+143.819 -1.263 143.738 -0.941 143.738 -0.529 c
+143.738 2.558 l
+142.974 2.558 l
+142.974 3.219 l
+143.738 3.219 l
+143.738 4.425 l
+h
+146.958 2.705 m
+147.259 3.105 147.652 3.308 148.134 3.308 c
+149.015 3.308 149.46 2.723 149.471 1.559 c
+149.471 -1.749 l
+148.662 -1.749 l
+148.662 1.515 l
+148.662 1.904 148.596 2.18 148.471 2.338 c
+148.342 2.503 148.148 2.587 147.883 2.587 c
+147.677 2.587 147.494 2.517 147.34 2.382 c
+147.181 2.253 147.053 2.08 146.958 1.867 c
+146.958 -1.749 l
+146.134 -1.749 l
+146.134 5.307 l
+146.958 5.307 l
+h
+152.271 -1.837 m
+151.654 -1.837 151.176 -1.657 150.846 -1.294 c
+150.522 -0.922 150.353 -0.378 150.345 0.339 c
+150.345 0.941 l
+150.345 1.676 150.507 2.253 150.831 2.675 c
+151.154 3.094 151.602 3.308 152.182 3.308 c
+152.76 3.308 153.19 3.12 153.476 2.749 c
+153.77 2.386 153.921 1.812 153.932 1.029 c
+153.932 0.5 l
+151.154 0.5 l
+151.154 0.383 l
+151.154 -0.158 151.249 -0.551 151.448 -0.793 c
+151.654 -1.028 151.941 -1.146 152.315 -1.146 c
+152.558 -1.146 152.77 -1.102 152.947 -1.014 c
+153.131 -0.926 153.304 -0.786 153.462 -0.588 c
+153.888 -1.102 l
+153.535 -1.595 152.995 -1.837 152.271 -1.837 c
+152.182 2.617 m
+151.849 2.617 151.598 2.5 151.434 2.264 c
+151.264 2.036 151.172 1.68 151.154 1.191 c
+153.109 1.191 l
+153.109 1.309 l
+153.087 1.779 153.006 2.11 152.859 2.309 c
+152.712 2.514 152.484 2.617 152.182 2.617 c
+157.354 0.956 m
+157.354 1.727 157.493 2.311 157.78 2.705 c
+158.062 3.105 158.474 3.308 159.014 3.308 c
+159.521 3.308 159.911 3.091 160.176 2.661 c
+160.205 3.219 l
+160.94 3.219 l
+160.94 -1.793 l
+160.94 -2.41 160.782 -2.881 160.469 -3.204 c
+160.153 -3.534 159.72 -3.704 159.161 -3.704 c
+158.915 -3.704 158.636 -3.638 158.324 -3.513 c
+158.019 -3.395 157.794 -3.248 157.647 -3.072 c
+157.971 -2.513 l
+158.312 -2.844 158.684 -3.013 159.087 -3.013 c
+159.764 -3.013 160.109 -2.645 160.132 -1.911 c
+160.132 -1.263 l
+159.866 -1.646 159.492 -1.837 159.014 -1.837 c
+158.492 -1.837 158.092 -1.646 157.809 -1.263 c
+157.522 -0.874 157.372 -0.316 157.354 0.412 c
+h
+158.177 0.5 m
+158.177 -0.058 158.254 -0.47 158.412 -0.735 c
+158.577 -0.992 158.845 -1.117 159.22 -1.117 c
+159.621 -1.117 159.926 -0.911 160.132 -0.5 c
+160.132 1.985 l
+159.926 2.386 159.625 2.587 159.235 2.587 c
+158.86 2.587 158.592 2.455 158.426 2.191 c
+158.257 1.933 158.177 1.536 158.177 1 c
+h
+164.019 2.455 m
+163.901 2.473 163.777 2.484 163.652 2.484 c
+163.23 2.484 162.939 2.257 162.785 1.808 c
+162.785 -1.749 l
+161.961 -1.749 l
+161.961 3.219 l
+162.755 3.219 l
+162.77 2.72 l
+162.983 3.109 163.292 3.308 163.696 3.308 c
+163.821 3.308 163.931 3.286 164.019 3.249 c
+h
+166.401 -1.837 m
+165.783 -1.837 165.306 -1.657 164.975 -1.294 c
+164.651 -0.922 164.483 -0.378 164.475 0.339 c
+164.475 0.941 l
+164.475 1.676 164.637 2.253 164.96 2.675 c
+165.283 3.094 165.732 3.308 166.312 3.308 c
+166.889 3.308 167.319 3.12 167.606 2.749 c
+167.899 2.386 168.051 1.812 168.061 1.029 c
+168.061 0.5 l
+165.283 0.5 l
+165.283 0.383 l
+165.283 -0.158 165.379 -0.551 165.578 -0.793 c
+165.783 -1.028 166.07 -1.146 166.445 -1.146 c
+166.687 -1.146 166.9 -1.102 167.076 -1.014 c
+167.261 -0.926 167.433 -0.786 167.591 -0.588 c
+168.017 -1.102 l
+167.664 -1.595 167.124 -1.837 166.401 -1.837 c
+166.312 2.617 m
+165.978 2.617 165.728 2.5 165.563 2.264 c
+165.393 2.036 165.302 1.68 165.283 1.191 c
+167.238 1.191 l
+167.238 1.309 l
+167.216 1.779 167.136 2.11 166.989 2.309 c
+166.841 2.514 166.613 2.617 166.312 2.617 c
+171.413 -1.749 m
+171.361 -1.643 171.328 -1.462 171.31 -1.205 c
+171.024 -1.627 170.656 -1.837 170.208 -1.837 c
+169.755 -1.837 169.403 -1.716 169.15 -1.469 c
+168.903 -1.216 168.782 -0.86 168.782 -0.396 c
+168.782 0.111 168.951 0.515 169.296 0.809 c
+169.638 1.103 170.108 1.253 170.708 1.264 c
+171.295 1.264 l
+171.295 1.794 l
+171.295 2.088 171.226 2.297 171.089 2.426 c
+170.961 2.55 170.766 2.617 170.501 2.617 c
+170.255 2.617 170.054 2.544 169.898 2.396 c
+169.752 2.249 169.678 2.062 169.678 1.838 c
+168.855 1.838 l
+168.855 2.091 168.929 2.338 169.075 2.573 c
+169.231 2.808 169.436 2.988 169.693 3.117 c
+169.946 3.242 170.23 3.308 170.546 3.308 c
+171.053 3.308 171.442 3.179 171.707 2.926 c
+171.972 2.679 172.104 2.311 172.104 1.823 c
+172.104 -0.675 l
+172.111 -1.058 172.167 -1.392 172.265 -1.675 c
+172.265 -1.749 l
+h
+170.34 -1.102 m
+170.534 -1.102 170.722 -1.051 170.898 -0.941 c
+171.082 -0.823 171.215 -0.687 171.295 -0.529 c
+171.295 0.662 l
+170.839 0.662 l
+170.457 0.651 170.152 0.563 169.929 0.397 c
+169.701 0.229 169.59 0 169.59 -0.294 c
+169.59 -0.58 169.642 -0.786 169.752 -0.911 c
+169.869 -1.04 170.064 -1.102 170.34 -1.102 c
+174.249 4.425 m
+174.249 3.219 l
+174.999 3.219 l
+174.999 2.558 l
+174.249 2.558 l
+174.249 -0.514 l
+174.249 -0.712 174.28 -0.864 174.338 -0.97 c
+174.405 -1.069 174.518 -1.117 174.677 -1.117 c
+174.783 -1.117 174.889 -1.099 174.999 -1.058 c
+174.985 -1.749 l
+174.808 -1.807 174.621 -1.837 174.426 -1.837 c
+174.103 -1.837 173.856 -1.727 173.692 -1.499 c
+173.522 -1.263 173.441 -0.941 173.441 -0.529 c
+173.441 2.558 l
+172.677 2.558 l
+172.677 3.219 l
+173.441 3.219 l
+173.441 4.425 l
+h
+f
+Q
+q 1 0 0 1 719.2545 317.0425 cm
+0 0 m
+0 -2.352 l
+-1.338 -2.352 l
+-1.338 4.336 l
+0.941 4.336 l
+1.595 4.336 2.12 4.131 2.514 3.719 c
+2.903 3.308 3.102 2.77 3.102 2.117 c
+3.102 1.47 2.903 0.956 2.514 0.573 c
+2.132 0.191 1.595 0 0.912 0 c
+h
+0 1.132 m
+0.941 1.132 l
+1.195 1.132 1.39 1.213 1.529 1.382 c
+1.675 1.548 1.749 1.793 1.749 2.117 c
+1.749 2.448 1.675 2.712 1.529 2.911 c
+1.382 3.105 1.191 3.204 0.956 3.204 c
+0 3.204 l
+h
+6.177 1.367 m
+5.751 1.396 l
+5.388 1.396 5.149 1.238 5.031 0.926 c
+5.031 -2.352 l
+3.723 -2.352 l
+3.723 2.616 l
+4.943 2.616 l
+4.987 2.087 l
+5.193 2.499 5.475 2.705 5.839 2.705 c
+5.986 2.705 6.104 2.683 6.192 2.646 c
+h
+6.416 0.294 m
+6.416 1.047 6.593 1.635 6.945 2.058 c
+7.298 2.488 7.786 2.705 8.415 2.705 c
+9.051 2.705 9.548 2.488 9.9 2.058 c
+10.26 1.635 10.444 1.043 10.444 0.279 c
+10.444 -0.029 l
+10.444 -0.786 10.267 -1.378 9.914 -1.808 c
+9.562 -2.23 9.066 -2.44 8.43 -2.44 c
+7.79 -2.44 7.298 -2.23 6.945 -1.808 c
+6.593 -1.378 6.416 -0.786 6.416 -0.029 c
+h
+7.724 -0.029 m
+7.724 -0.922 7.96 -1.367 8.43 -1.367 c
+8.871 -1.367 9.106 -0.996 9.135 -0.25 c
+9.151 0.294 l
+9.151 0.742 9.084 1.077 8.96 1.294 c
+8.831 1.517 8.65 1.631 8.415 1.631 c
+8.199 1.631 8.025 1.517 7.901 1.294 c
+7.784 1.077 7.724 0.742 7.724 0.294 c
+h
+18.485 -1.587 m
+18.219 -1.874 17.897 -2.088 17.514 -2.234 c
+17.139 -2.371 16.727 -2.44 16.28 -2.44 c
+15.515 -2.44 14.916 -2.205 14.486 -1.735 c
+14.063 -1.257 13.847 -0.559 13.839 0.353 c
+13.839 1.558 l
+13.839 2.477 14.038 3.183 14.442 3.674 c
+14.842 4.175 15.43 4.424 16.206 4.424 c
+16.93 4.424 17.473 4.241 17.837 3.881 c
+18.209 3.528 18.425 2.969 18.485 2.205 c
+17.176 2.205 l
+17.136 2.624 17.043 2.914 16.897 3.072 c
+16.757 3.227 16.536 3.308 16.235 3.308 c
+15.871 3.308 15.607 3.175 15.441 2.911 c
+15.283 2.646 15.199 2.219 15.192 1.631 c
+15.192 0.426 l
+15.192 -0.183 15.279 -0.628 15.456 -0.912 c
+15.64 -1.187 15.945 -1.323 16.368 -1.323 c
+16.632 -1.323 16.845 -1.272 17.014 -1.161 c
+17.132 -1.073 l
+17.132 0.147 l
+16.176 0.147 l
+16.176 1.161 l
+18.485 1.161 l
+h
+20.527 -2.352 -1.308 4.968 re
+19.16 3.91 m
+19.16 4.104 19.223 4.266 19.351 4.395 c
+19.476 4.531 19.649 4.601 19.866 4.601 c
+20.079 4.601 20.251 4.531 20.38 4.395 c
+20.505 4.266 20.571 4.104 20.571 3.91 c
+20.571 3.705 20.505 3.532 20.38 3.395 c
+20.263 3.267 20.09 3.204 19.866 3.204 c
+19.649 3.204 19.476 3.267 19.351 3.395 c
+19.223 3.532 19.16 3.705 19.16 3.91 c
+22.949 3.836 m
+22.949 2.616 l
+23.611 2.616 l
+23.611 1.646 l
+22.949 1.646 l
+22.949 -0.823 l
+22.949 -1.022 22.971 -1.157 23.023 -1.234 c
+23.081 -1.305 23.188 -1.338 23.345 -1.338 c
+23.464 -1.338 23.566 -1.33 23.655 -1.309 c
+23.64 -2.323 l
+23.412 -2.4 23.173 -2.44 22.919 -2.44 c
+22.086 -2.44 21.662 -1.962 21.656 -0.999 c
+21.656 1.646 l
+21.082 1.646 l
+21.082 2.616 l
+21.656 2.616 l
+21.656 3.836 l
+h
+f
+Q
+q 1 0 0 1 749.9827 316.94 cm
+0 0 m
+0 -0.776 -0.143 -1.36 -0.426 -1.75 c
+-0.702 -2.143 -1.103 -2.338 -1.631 -2.338 c
+-2.153 -2.338 -2.543 -2.113 -2.807 -1.661 c
+-2.851 -2.249 l
+-3.586 -2.249 l
+-3.586 4.806 l
+-2.778 4.806 l
+-2.778 2.175 l
+-2.514 2.594 -2.131 2.807 -1.631 2.807 c
+-1.095 2.807 -0.687 2.616 -0.411 2.234 c
+-0.139 1.851 0 1.267 0 0.484 c
+h
+-0.808 0.455 m
+-0.808 1.043 -0.893 1.458 -1.058 1.705 c
+-1.216 1.959 -1.481 2.087 -1.852 2.087 c
+-2.263 2.087 -2.572 1.859 -2.778 1.411 c
+-2.778 -0.956 l
+-2.583 -1.397 -2.271 -1.617 -1.837 -1.617 c
+-1.477 -1.617 -1.216 -1.492 -1.058 -1.235 c
+-0.893 -0.981 -0.808 -0.584 -0.808 -0.044 c
+h
+0.698 0.47 m
+0.698 1.182 0.867 1.753 1.213 2.175 c
+1.565 2.594 2.028 2.807 2.61 2.807 c
+3.186 2.807 3.645 2.601 3.991 2.19 c
+4.343 1.786 4.524 1.227 4.534 0.515 c
+4.534 0 l
+4.534 -0.728 4.359 -1.301 4.006 -1.72 c
+3.66 -2.132 3.2 -2.338 2.624 -2.338 c
+2.043 -2.338 1.581 -2.139 1.228 -1.735 c
+0.883 -1.324 0.706 -0.772 0.698 -0.073 c
+h
+1.507 0 m
+1.507 -0.511 1.602 -0.912 1.801 -1.206 c
+2.007 -1.5 2.279 -1.646 2.624 -1.646 c
+3.337 -1.646 3.705 -1.129 3.726 -0.088 c
+3.726 0.47 l
+3.726 0.977 3.624 1.381 3.418 1.675 c
+3.219 1.969 2.951 2.117 2.61 2.117 c
+2.275 2.117 2.007 1.969 1.801 1.675 c
+1.602 1.381 1.507 0.977 1.507 0.47 c
+h
+5.233 0.47 m
+5.233 1.182 5.402 1.753 5.748 2.175 c
+6.101 2.594 6.564 2.807 7.144 2.807 c
+7.721 2.807 8.18 2.601 8.526 2.19 c
+8.879 1.786 9.058 1.227 9.07 0.515 c
+9.07 0 l
+9.07 -0.728 8.893 -1.301 8.54 -1.72 c
+8.195 -2.132 7.736 -2.338 7.159 -2.338 c
+6.578 -2.338 6.115 -2.139 5.762 -1.735 c
+5.417 -1.324 5.24 -0.772 5.233 -0.073 c
+h
+6.041 0 m
+6.041 -0.511 6.137 -0.912 6.336 -1.206 c
+6.541 -1.5 6.813 -1.646 7.159 -1.646 c
+7.871 -1.646 8.239 -1.129 8.261 -0.088 c
+8.261 0.47 l
+8.261 0.977 8.158 1.381 7.952 1.675 c
+7.754 1.969 7.486 2.117 7.144 2.117 c
+6.809 2.117 6.541 1.969 6.336 1.675 c
+6.137 1.381 6.041 0.977 6.041 0.47 c
+h
+11.175 0.029 m
+10.749 -0.47 l
+10.749 -2.249 l
+9.941 -2.249 l
+9.941 4.806 l
+10.749 4.806 l
+10.749 0.588 l
+12.293 2.719 l
+13.263 2.719 l
+11.69 0.646 l
+13.483 -2.249 l
+12.528 -2.249 l
+h
+20.391 0 m
+20.391 -0.776 20.249 -1.36 19.965 -1.75 c
+19.69 -2.143 19.289 -2.338 18.76 -2.338 c
+18.238 -2.338 17.849 -2.113 17.584 -1.661 c
+17.54 -2.249 l
+16.805 -2.249 l
+16.805 4.806 l
+17.614 4.806 l
+17.614 2.175 l
+17.878 2.594 18.26 2.807 18.76 2.807 c
+19.297 2.807 19.704 2.616 19.979 2.234 c
+20.252 1.851 20.391 1.267 20.391 0.484 c
+h
+19.583 0.455 m
+19.583 1.043 19.499 1.458 19.333 1.705 c
+19.175 1.959 18.911 2.087 18.539 2.087 c
+18.128 2.087 17.82 1.859 17.614 1.411 c
+17.614 -0.956 l
+17.808 -1.397 18.121 -1.617 18.554 -1.617 c
+18.915 -1.617 19.175 -1.492 19.333 -1.235 c
+19.499 -0.981 19.583 -0.584 19.583 -0.044 c
+h
+22.567 -0.897 m
+23.464 2.719 l
+24.33 2.719 l
+22.699 -2.955 l
+22.582 -3.374 22.408 -3.697 22.185 -3.925 c
+21.957 -4.15 21.703 -4.263 21.421 -4.263 c
+21.31 -4.263 21.174 -4.237 21.009 -4.189 c
+21.009 -3.499 l
+21.185 -3.514 l
+21.421 -3.514 21.6 -3.454 21.729 -3.337 c
+21.865 -3.227 21.972 -3.036 22.053 -2.764 c
+22.214 -2.205 l
+20.759 2.719 l
+21.641 2.719 l
+h
+f
+Q
+q 1 0 0 1 539.1547 305.0923 cm
+0 0 m
+0 0.33 -0.096 0.588 -0.279 0.764 c
+-0.456 0.941 -0.779 1.11 -1.249 1.278 c
+-1.72 1.455 -2.084 1.635 -2.338 1.822 c
+-2.583 2.007 -2.771 2.219 -2.896 2.454 c
+-3.025 2.69 -3.087 2.958 -3.087 3.263 c
+-3.087 3.792 -2.911 4.226 -2.558 4.571 c
+-2.198 4.913 -1.731 5.086 -1.162 5.086 c
+-0.772 5.086 -0.422 4.997 -0.118 4.821 c
+0.195 4.644 0.43 4.399 0.588 4.087 c
+0.753 3.781 0.837 3.439 0.837 3.057 c
+0 3.057 l
+0 3.476 -0.104 3.8 -0.309 4.027 c
+-0.507 4.251 -0.79 4.366 -1.162 4.366 c
+-1.507 4.366 -1.771 4.266 -1.955 4.072 c
+-2.143 3.884 -2.234 3.62 -2.234 3.278 c
+-2.234 2.992 -2.132 2.756 -1.926 2.572 c
+-1.72 2.385 -1.407 2.212 -0.985 2.057 c
+-0.331 1.841 0.139 1.573 0.426 1.249 c
+0.709 0.933 0.852 0.522 0.852 0.015 c
+0.852 -0.536 0.676 -0.97 0.324 -1.294 c
+-0.029 -1.617 -0.511 -1.779 -1.118 -1.779 c
+-1.511 -1.779 -1.874 -1.694 -2.205 -1.529 c
+-2.529 -1.363 -2.786 -1.128 -2.969 -0.823 c
+-3.157 -0.511 -3.248 -0.154 -3.248 0.25 c
+-2.411 0.25 l
+-2.411 -0.162 -2.301 -0.485 -2.072 -0.721 c
+-1.837 -0.948 -1.521 -1.058 -1.118 -1.058 c
+-0.746 -1.058 -0.467 -0.966 -0.279 -0.779 c
+-0.096 -0.584 0 -0.324 0 0 c
+3.366 -1.087 m
+3.63 -1.087 3.84 -1.007 3.998 -0.838 c
+4.164 -0.673 4.255 -0.434 4.278 -0.118 c
+5.041 -0.118 l
+5.02 -0.599 4.85 -0.996 4.527 -1.309 c
+4.211 -1.625 3.825 -1.779 3.366 -1.779 c
+2.749 -1.779 2.278 -1.588 1.955 -1.205 c
+1.631 -0.816 1.469 -0.235 1.469 0.529 c
+1.469 1.073 l
+1.469 1.826 1.631 2.396 1.955 2.778 c
+2.278 3.167 2.741 3.366 3.351 3.366 c
+3.858 3.366 4.262 3.204 4.557 2.881 c
+4.858 2.564 5.02 2.132 5.041 1.573 c
+4.278 1.573 l
+4.255 1.933 4.166 2.209 4.012 2.396 c
+3.854 2.58 3.634 2.675 3.351 2.675 c
+2.998 2.675 2.734 2.55 2.558 2.308 c
+2.381 2.072 2.285 1.683 2.278 1.147 c
+2.278 0.515 l
+2.278 -0.073 2.366 -0.493 2.543 -0.735 c
+2.719 -0.97 2.991 -1.087 3.366 -1.087 c
+5.648 1.029 m
+5.648 1.741 5.817 2.311 6.163 2.734 c
+6.516 3.152 6.978 3.366 7.559 3.366 c
+8.135 3.366 8.595 3.16 8.941 2.749 c
+9.294 2.344 9.473 1.786 9.484 1.073 c
+9.484 0.559 l
+9.484 -0.169 9.308 -0.742 8.955 -1.161 c
+8.61 -1.573 8.151 -1.779 7.574 -1.779 c
+6.992 -1.779 6.53 -1.58 6.177 -1.176 c
+5.832 -0.765 5.655 -0.214 5.648 0.485 c
+h
+6.456 0.559 m
+6.456 0.048 6.552 -0.353 6.751 -0.647 c
+6.956 -0.941 7.228 -1.087 7.574 -1.087 c
+8.286 -1.087 8.654 -0.57 8.675 0.47 c
+8.675 1.029 l
+8.675 1.536 8.573 1.94 8.367 2.234 c
+8.168 2.528 7.9 2.675 7.559 2.675 c
+7.224 2.675 6.956 2.528 6.751 2.234 c
+6.552 1.94 6.456 1.536 6.456 1.029 c
+h
+11.418 4.484 m
+11.418 3.278 l
+12.167 3.278 l
+12.167 2.616 l
+11.418 2.616 l
+11.418 -0.455 l
+11.418 -0.654 11.447 -0.805 11.505 -0.912 c
+11.572 -1.01 11.686 -1.058 11.844 -1.058 c
+11.95 -1.058 12.056 -1.04 12.167 -1 c
+12.152 -1.69 l
+11.976 -1.749 11.788 -1.779 11.594 -1.779 c
+11.27 -1.779 11.024 -1.669 10.859 -1.44 c
+10.69 -1.205 10.609 -0.882 10.609 -0.47 c
+10.609 2.616 l
+9.845 2.616 l
+9.845 3.278 l
+10.609 3.278 l
+10.609 4.484 l
+h
+14.082 4.484 m
+14.082 3.278 l
+14.831 3.278 l
+14.831 2.616 l
+14.082 2.616 l
+14.082 -0.455 l
+14.082 -0.654 14.111 -0.805 14.169 -0.912 c
+14.236 -1.01 14.35 -1.058 14.508 -1.058 c
+14.614 -1.058 14.721 -1.04 14.831 -1 c
+14.817 -1.69 l
+14.64 -1.749 14.453 -1.779 14.258 -1.779 c
+13.934 -1.779 13.689 -1.669 13.523 -1.44 c
+13.354 -1.205 13.273 -0.882 13.273 -0.47 c
+13.273 2.616 l
+12.509 2.616 l
+12.509 3.278 l
+13.273 3.278 l
+13.273 4.484 l
+h
+22.416 0.426 m
+22.387 -0.291 22.184 -0.838 21.813 -1.22 c
+21.45 -1.595 20.935 -1.779 20.27 -1.779 c
+19.594 -1.779 19.057 -1.525 18.668 -1.014 c
+18.275 -0.507 18.08 0.183 18.08 1.058 c
+18.08 2.263 l
+18.08 3.135 18.278 3.821 18.682 4.322 c
+19.094 4.829 19.645 5.086 20.343 5.086 c
+20.99 5.086 21.49 4.887 21.843 4.498 c
+22.196 4.116 22.387 3.564 22.416 2.851 c
+21.578 2.851 l
+21.537 3.388 21.42 3.778 21.225 4.013 c
+21.026 4.248 20.733 4.366 20.343 4.366 c
+19.891 4.366 19.542 4.182 19.299 3.821 c
+19.054 3.469 18.932 2.947 18.932 2.263 c
+18.932 1.029 l
+18.932 0.353 19.042 -0.169 19.27 -0.53 c
+19.494 -0.882 19.829 -1.058 20.27 -1.058 c
+20.71 -1.058 21.023 -0.952 21.211 -0.735 c
+21.406 -0.522 21.527 -0.133 21.578 0.426 c
+h
+24.047 2.763 m
+24.349 3.164 24.742 3.366 25.223 3.366 c
+26.105 3.366 26.549 2.782 26.561 1.617 c
+26.561 -1.69 l
+25.753 -1.69 l
+25.753 1.573 l
+25.753 1.962 25.686 2.238 25.562 2.396 c
+25.433 2.562 25.238 2.645 24.974 2.645 c
+24.768 2.645 24.584 2.576 24.43 2.44 c
+24.272 2.311 24.143 2.138 24.047 1.926 c
+24.047 -1.69 l
+23.224 -1.69 l
+23.224 5.365 l
+24.047 5.365 l
+h
+30.14 -1.69 m
+30.089 -1.584 30.056 -1.404 30.037 -1.147 c
+29.751 -1.569 29.383 -1.779 28.935 -1.779 c
+28.483 -1.779 28.13 -1.658 27.877 -1.411 c
+27.63 -1.158 27.509 -0.802 27.509 -0.338 c
+27.509 0.169 27.678 0.573 28.024 0.867 c
+28.365 1.161 28.836 1.311 29.435 1.323 c
+30.023 1.323 l
+30.023 1.852 l
+30.023 2.146 29.953 2.356 29.817 2.484 c
+29.688 2.609 29.493 2.675 29.229 2.675 c
+28.982 2.675 28.781 2.602 28.626 2.454 c
+28.479 2.308 28.406 2.12 28.406 1.897 c
+27.582 1.897 l
+27.582 2.15 27.656 2.396 27.803 2.631 c
+27.958 2.866 28.163 3.046 28.421 3.175 c
+28.674 3.3 28.957 3.366 29.273 3.366 c
+29.78 3.366 30.169 3.237 30.434 2.984 c
+30.699 2.738 30.831 2.37 30.831 1.882 c
+30.831 -0.617 l
+30.838 -1 30.894 -1.334 30.993 -1.617 c
+30.993 -1.69 l
+h
+29.067 -1.043 m
+29.262 -1.043 29.449 -0.992 29.626 -0.882 c
+29.809 -0.765 29.942 -0.628 30.023 -0.47 c
+30.023 0.721 l
+29.566 0.721 l
+29.185 0.709 28.88 0.621 28.656 0.455 c
+28.428 0.287 28.317 0.058 28.317 -0.235 c
+28.317 -0.522 28.369 -0.728 28.479 -0.852 c
+28.596 -0.981 28.791 -1.043 29.067 -1.043 c
+33.639 -1.087 m
+33.903 -1.087 34.112 -1.007 34.27 -0.838 c
+34.436 -0.673 34.528 -0.434 34.549 -0.118 c
+35.314 -0.118 l
+35.292 -0.599 35.123 -0.996 34.8 -1.309 c
+34.484 -1.625 34.098 -1.779 33.639 -1.779 c
+33.021 -1.779 32.55 -1.588 32.228 -1.205 c
+31.904 -0.816 31.742 -0.235 31.742 0.529 c
+31.742 1.073 l
+31.742 1.826 31.904 2.396 32.228 2.778 c
+32.55 3.167 33.014 3.366 33.624 3.366 c
+34.131 3.366 34.535 3.204 34.829 2.881 c
+35.131 2.564 35.292 2.132 35.314 1.573 c
+34.549 1.573 l
+34.528 1.933 34.439 2.209 34.285 2.396 c
+34.127 2.58 33.907 2.675 33.624 2.675 c
+33.271 2.675 33.007 2.55 32.83 2.308 c
+32.654 2.072 32.558 1.683 32.55 1.147 c
+32.55 0.515 l
+32.55 -0.073 32.639 -0.493 32.816 -0.735 c
+32.992 -0.97 33.264 -1.087 33.639 -1.087 c
+35.924 1.029 m
+35.924 1.741 36.093 2.311 36.439 2.734 c
+36.791 3.152 37.254 3.366 37.836 3.366 c
+38.412 3.366 38.871 3.16 39.217 2.749 c
+39.569 2.344 39.75 1.786 39.76 1.073 c
+39.76 0.559 l
+39.76 -0.169 39.584 -0.742 39.232 -1.161 c
+38.886 -1.573 38.426 -1.779 37.85 -1.779 c
+37.269 -1.779 36.806 -1.58 36.454 -1.176 c
+36.108 -0.765 35.931 -0.214 35.924 0.485 c
+h
+36.733 0.559 m
+36.733 0.048 36.828 -0.353 37.026 -0.647 c
+37.233 -0.941 37.504 -1.087 37.85 -1.087 c
+38.563 -1.087 38.931 -0.57 38.952 0.47 c
+38.952 1.029 l
+38.952 1.536 38.85 1.94 38.644 2.234 c
+38.445 2.528 38.177 2.675 37.836 2.675 c
+37.501 2.675 37.233 2.528 37.026 2.234 c
+36.828 1.94 36.733 1.536 36.733 1.029 c
+h
+41.381 3.278 m
+41.41 2.749 l
+41.723 3.16 42.123 3.366 42.616 3.366 c
+43.498 3.366 43.943 2.782 43.953 1.617 c
+43.953 -1.69 l
+43.145 -1.69 l
+43.145 1.573 l
+43.145 1.962 43.079 2.238 42.954 2.396 c
+42.825 2.562 42.63 2.645 42.366 2.645 c
+42.16 2.645 41.977 2.576 41.822 2.44 c
+41.664 2.311 41.535 2.138 41.44 1.926 c
+41.44 -1.69 l
+40.617 -1.69 l
+40.617 3.278 l
+h
+49.988 -1.69 m
+49.936 -1.584 49.903 -1.404 49.885 -1.147 c
+49.598 -1.569 49.231 -1.779 48.782 -1.779 c
+48.33 -1.779 47.978 -1.658 47.724 -1.411 c
+47.478 -1.158 47.357 -0.802 47.357 -0.338 c
+47.357 0.169 47.525 0.573 47.871 0.867 c
+48.213 1.161 48.683 1.311 49.282 1.323 c
+49.87 1.323 l
+49.87 1.852 l
+49.87 2.146 49.8 2.356 49.664 2.484 c
+49.536 2.609 49.341 2.675 49.076 2.675 c
+48.83 2.675 48.628 2.602 48.473 2.454 c
+48.327 2.308 48.253 2.12 48.253 1.897 c
+47.43 1.897 l
+47.43 2.15 47.504 2.396 47.65 2.631 c
+47.805 2.866 48.011 3.046 48.267 3.175 c
+48.521 3.3 48.805 3.366 49.121 3.366 c
+49.628 3.366 50.017 3.237 50.282 2.984 c
+50.546 2.738 50.679 2.37 50.679 1.882 c
+50.679 -0.617 l
+50.686 -1 50.741 -1.334 50.84 -1.617 c
+50.84 -1.69 l
+h
+48.915 -1.043 m
+49.109 -1.043 49.297 -0.992 49.473 -0.882 c
+49.657 -0.765 49.789 -0.628 49.87 -0.47 c
+49.87 0.721 l
+49.414 0.721 l
+49.032 0.709 48.727 0.621 48.503 0.455 c
+48.275 0.287 48.165 0.058 48.165 -0.235 c
+48.165 -0.522 48.217 -0.728 48.327 -0.852 c
+48.444 -0.981 48.639 -1.043 48.915 -1.043 c
+52.516 3.278 m
+52.545 2.749 l
+52.857 3.16 53.258 3.366 53.751 3.366 c
+54.632 3.366 55.077 2.782 55.088 1.617 c
+55.088 -1.69 l
+54.28 -1.69 l
+54.28 1.573 l
+54.28 1.962 54.214 2.238 54.089 2.396 c
+53.96 2.562 53.765 2.645 53.501 2.645 c
+53.295 2.645 53.111 2.576 52.957 2.44 c
+52.799 2.311 52.67 2.138 52.575 1.926 c
+52.575 -1.69 l
+51.751 -1.69 l
+51.751 3.278 l
+h
+55.966 1.014 m
+55.966 1.786 56.106 2.37 56.393 2.763 c
+56.676 3.164 57.087 3.366 57.628 3.366 c
+58.098 3.366 58.465 3.175 58.729 2.793 c
+58.729 5.365 l
+59.552 5.365 l
+59.552 -1.69 l
+58.804 -1.69 l
+58.76 -1.161 l
+58.494 -1.573 58.116 -1.779 57.628 -1.779 c
+57.106 -1.779 56.701 -1.584 56.408 -1.191 c
+56.113 -0.79 55.966 -0.22 55.966 0.515 c
+h
+56.774 0.559 m
+56.774 0 56.855 -0.412 57.025 -0.676 c
+57.19 -0.933 57.458 -1.058 57.833 -1.058 c
+58.234 -1.058 58.532 -0.86 58.729 -0.455 c
+58.729 2.057 l
+58.524 2.447 58.222 2.645 57.833 2.645 c
+57.458 2.645 57.19 2.514 57.025 2.249 c
+56.855 1.992 56.774 1.595 56.774 1.058 c
+h
+63.165 -1.69 m
+63.165 4.997 l
+65.077 4.997 l
+65.682 4.997 66.138 4.843 66.443 4.542 c
+66.756 4.248 66.914 3.807 66.914 3.219 c
+66.914 2.903 66.833 2.624 66.679 2.381 c
+66.521 2.146 66.311 1.962 66.046 1.837 c
+66.347 1.738 66.59 1.547 66.766 1.264 c
+66.951 0.977 67.046 0.636 67.046 0.235 c
+67.046 -0.364 66.877 -0.834 66.546 -1.176 c
+66.212 -1.521 65.742 -1.69 65.135 -1.69 c
+h
+64.003 1.44 m
+64.003 -0.97 l
+65.15 -0.97 l
+65.473 -0.97 65.727 -0.867 65.914 -0.661 c
+66.097 -0.449 66.193 -0.147 66.193 0.235 c
+66.193 1.036 65.855 1.44 65.179 1.44 c
+h
+64.003 2.146 m
+65.091 2.146 l
+65.374 2.146 65.605 2.242 65.782 2.44 c
+65.966 2.635 66.061 2.896 66.061 3.219 c
+66.061 3.59 65.977 3.858 65.811 4.027 c
+65.653 4.193 65.407 4.278 65.077 4.278 c
+64.003 4.278 l
+h
+69.746 -1.779 m
+69.129 -1.779 68.651 -1.598 68.321 -1.235 c
+67.997 -0.864 67.828 -0.32 67.822 0.397 c
+67.822 0.999 l
+67.822 1.735 67.982 2.311 68.306 2.734 c
+68.63 3.152 69.077 3.366 69.659 3.366 c
+70.236 3.366 70.665 3.179 70.952 2.807 c
+71.246 2.444 71.396 1.87 71.408 1.087 c
+71.408 0.559 l
+68.63 0.559 l
+68.63 0.441 l
+68.63 -0.1 68.725 -0.493 68.923 -0.735 c
+69.129 -0.97 69.416 -1.087 69.791 -1.087 c
+70.033 -1.087 70.247 -1.043 70.423 -0.956 c
+70.606 -0.867 70.779 -0.728 70.937 -0.53 c
+71.363 -1.043 l
+71.011 -1.536 70.471 -1.779 69.746 -1.779 c
+69.659 2.675 m
+69.324 2.675 69.075 2.558 68.909 2.323 c
+68.74 2.094 68.648 1.738 68.63 1.249 c
+70.585 1.249 l
+70.585 1.367 l
+70.563 1.837 70.482 2.168 70.334 2.367 c
+70.188 2.572 69.96 2.675 69.659 2.675 c
+72.966 3.278 m
+72.996 2.749 l
+73.308 3.16 73.708 3.366 74.201 3.366 c
+75.082 3.366 75.527 2.782 75.539 1.617 c
+75.539 -1.69 l
+74.729 -1.69 l
+74.729 1.573 l
+74.729 1.962 74.664 2.238 74.538 2.396 c
+74.41 2.562 74.215 2.645 73.951 2.645 c
+73.745 2.645 73.561 2.576 73.407 2.44 c
+73.249 2.311 73.12 2.138 73.025 1.926 c
+73.025 -1.69 l
+72.202 -1.69 l
+72.202 3.278 l
+h
+82.057 0 m
+82.057 0.33 81.962 0.588 81.777 0.764 c
+81.602 0.941 81.278 1.11 80.808 1.278 c
+80.337 1.455 79.973 1.635 79.72 1.822 c
+79.474 2.007 79.286 2.219 79.161 2.454 c
+79.032 2.69 78.97 2.958 78.97 3.263 c
+78.97 3.792 79.147 4.226 79.5 4.571 c
+79.859 4.913 80.327 5.086 80.896 5.086 c
+81.285 5.086 81.635 4.997 81.939 4.821 c
+82.252 4.644 82.487 4.399 82.645 4.087 c
+82.81 3.781 82.895 3.439 82.895 3.057 c
+82.057 3.057 l
+82.057 3.476 81.954 3.8 81.748 4.027 c
+81.55 4.251 81.268 4.366 80.896 4.366 c
+80.551 4.366 80.286 4.266 80.102 4.072 c
+79.915 3.884 79.823 3.62 79.823 3.278 c
+79.823 2.992 79.926 2.756 80.131 2.572 c
+80.337 2.385 80.65 2.212 81.072 2.057 c
+81.727 1.841 82.197 1.573 82.483 1.249 c
+82.766 0.933 82.91 0.522 82.91 0.015 c
+82.91 -0.536 82.733 -0.97 82.38 -1.294 c
+82.028 -1.617 81.546 -1.779 80.94 -1.779 c
+80.547 -1.779 80.183 -1.694 79.853 -1.529 c
+79.529 -1.363 79.271 -1.128 79.088 -0.823 c
+78.901 -0.511 78.808 -0.154 78.808 0.25 c
+79.647 0.25 l
+79.647 -0.162 79.757 -0.485 79.984 -0.721 c
+80.22 -0.948 80.536 -1.058 80.94 -1.058 c
+81.311 -1.058 81.59 -0.966 81.777 -0.779 c
+81.962 -0.584 82.057 -0.324 82.057 0 c
+84.761 4.484 m
+84.761 3.278 l
+85.511 3.278 l
+85.511 2.616 l
+84.761 2.616 l
+84.761 -0.455 l
+84.761 -0.654 84.792 -0.805 84.85 -0.912 c
+84.916 -1.01 85.031 -1.058 85.188 -1.058 c
+85.295 -1.058 85.401 -1.04 85.511 -1 c
+85.497 -1.69 l
+85.32 -1.749 85.133 -1.779 84.938 -1.779 c
+84.615 -1.779 84.368 -1.669 84.204 -1.44 c
+84.034 -1.205 83.953 -0.882 83.953 -0.47 c
+83.953 2.616 l
+83.189 2.616 l
+83.189 3.278 l
+83.953 3.278 l
+83.953 4.484 l
+h
+88.411 2.514 m
+88.293 2.532 88.168 2.543 88.044 2.543 c
+87.62 2.543 87.331 2.315 87.176 1.866 c
+87.176 -1.69 l
+86.353 -1.69 l
+86.353 3.278 l
+87.147 3.278 l
+87.161 2.778 l
+87.375 3.167 87.683 3.366 88.088 3.366 c
+88.212 3.366 88.323 3.344 88.411 3.308 c
+h
+91.483 -1.69 m
+91.431 -1.584 91.398 -1.404 91.381 -1.147 c
+91.094 -1.569 90.726 -1.779 90.278 -1.779 c
+89.826 -1.779 89.473 -1.658 89.22 -1.411 c
+88.973 -1.158 88.852 -0.802 88.852 -0.338 c
+88.852 0.169 89.021 0.573 89.366 0.867 c
+89.708 1.161 90.178 1.311 90.778 1.323 c
+91.365 1.323 l
+91.365 1.852 l
+91.365 2.146 91.296 2.356 91.159 2.484 c
+91.031 2.609 90.836 2.675 90.572 2.675 c
+90.325 2.675 90.124 2.602 89.969 2.454 c
+89.822 2.308 89.748 2.12 89.748 1.897 c
+88.925 1.897 l
+88.925 2.15 88.999 2.396 89.145 2.631 c
+89.301 2.866 89.506 3.046 89.763 3.175 c
+90.016 3.3 90.3 3.366 90.616 3.366 c
+91.123 3.366 91.512 3.237 91.777 2.984 c
+92.042 2.738 92.174 2.37 92.174 1.882 c
+92.174 -0.617 l
+92.181 -1 92.237 -1.334 92.335 -1.617 c
+92.335 -1.69 l
+h
+90.41 -1.043 m
+90.604 -1.043 90.792 -0.992 90.969 -0.882 c
+91.152 -0.765 91.285 -0.628 91.365 -0.47 c
+91.365 0.721 l
+90.91 0.721 l
+90.527 0.709 90.222 0.621 89.999 0.455 c
+89.771 0.287 89.66 0.058 89.66 -0.235 c
+89.66 -0.522 89.712 -0.728 89.822 -0.852 c
+89.939 -0.981 90.134 -1.043 90.41 -1.043 c
+95.79 -1.249 m
+95.514 -1.602 95.117 -1.779 94.599 -1.779 c
+94.159 -1.779 93.82 -1.628 93.585 -1.323 c
+93.357 -1.01 93.239 -0.555 93.232 0.044 c
+93.232 3.278 l
+94.041 3.278 l
+94.041 0.103 l
+94.041 -0.673 94.276 -1.058 94.747 -1.058 c
+95.235 -1.058 95.573 -0.838 95.761 -0.397 c
+95.761 3.278 l
+96.584 3.278 l
+96.584 -1.69 l
+95.805 -1.69 l
+h
+101.224 0.559 m
+101.224 -0.217 101.081 -0.802 100.798 -1.191 c
+100.523 -1.584 100.122 -1.779 99.593 -1.779 c
+99.071 -1.779 98.682 -1.554 98.417 -1.103 c
+98.373 -1.69 l
+97.638 -1.69 l
+97.638 5.365 l
+98.446 5.365 l
+98.446 2.734 l
+98.711 3.152 99.094 3.366 99.593 3.366 c
+100.129 3.366 100.538 3.175 100.813 2.793 c
+101.085 2.41 101.224 1.826 101.224 1.043 c
+h
+100.416 1.014 m
+100.416 1.602 100.332 2.017 100.166 2.263 c
+100.008 2.517 99.744 2.645 99.373 2.645 c
+98.961 2.645 98.652 2.418 98.446 1.97 c
+98.446 -0.397 l
+98.641 -0.838 98.953 -1.058 99.387 -1.058 c
+99.747 -1.058 100.008 -0.933 100.166 -0.676 c
+100.332 -0.422 100.416 -0.025 100.416 0.515 c
+h
+102.144 -1.249 m
+102.144 -1.103 102.188 -0.981 102.276 -0.882 c
+102.364 -0.786 102.489 -0.735 102.658 -0.735 c
+102.834 -0.735 102.967 -0.786 103.055 -0.882 c
+103.15 -0.981 103.202 -1.103 103.202 -1.249 c
+103.202 -1.389 103.15 -1.507 103.055 -1.602 c
+102.967 -1.69 102.834 -1.735 102.658 -1.735 c
+102.489 -1.735 102.364 -1.69 102.276 -1.602 c
+102.188 -1.507 102.144 -1.389 102.144 -1.249 c
+110.757 4.278 m
+108.993 4.278 l
+108.993 -1.69 l
+108.156 -1.69 l
+108.156 4.278 l
+106.406 4.278 l
+106.406 4.997 l
+110.757 4.997 l
+h
+112.264 2.763 m
+112.565 3.164 112.958 3.366 113.44 3.366 c
+114.321 3.366 114.766 2.782 114.778 1.617 c
+114.778 -1.69 l
+113.969 -1.69 l
+113.969 1.573 l
+113.969 1.962 113.903 2.238 113.778 2.396 c
+113.649 2.562 113.454 2.645 113.19 2.645 c
+112.984 2.645 112.8 2.576 112.646 2.44 c
+112.488 2.311 112.359 2.138 112.264 1.926 c
+112.264 -1.69 l
+111.441 -1.69 l
+111.441 5.365 l
+112.264 5.365 l
+h
+117.574 -1.779 m
+116.956 -1.779 116.479 -1.598 116.148 -1.235 c
+115.825 -0.864 115.655 -0.32 115.648 0.397 c
+115.648 0.999 l
+115.648 1.735 115.81 2.311 116.133 2.734 c
+116.457 3.152 116.905 3.366 117.486 3.366 c
+118.063 3.366 118.493 3.179 118.779 2.807 c
+119.073 2.444 119.224 1.87 119.235 1.087 c
+119.235 0.559 l
+116.457 0.559 l
+116.457 0.441 l
+116.457 -0.1 116.552 -0.493 116.75 -0.735 c
+116.956 -0.97 117.243 -1.087 117.618 -1.087 c
+117.86 -1.087 118.073 -1.043 118.25 -0.956 c
+118.433 -0.867 118.607 -0.728 118.765 -0.53 c
+119.191 -1.043 l
+118.838 -1.536 118.298 -1.779 117.574 -1.779 c
+117.486 2.675 m
+117.151 2.675 116.901 2.558 116.736 2.323 c
+116.567 2.094 116.475 1.738 116.457 1.249 c
+118.412 1.249 l
+118.412 1.367 l
+118.389 1.837 118.308 2.168 118.161 2.367 c
+118.015 2.572 117.787 2.675 117.486 2.675 c
+126.069 0.559 m
+126.069 -0.217 125.926 -0.802 125.643 -1.191 c
+125.368 -1.584 124.968 -1.779 124.438 -1.779 c
+123.916 -1.779 123.527 -1.554 123.262 -1.103 c
+123.218 -1.69 l
+122.483 -1.69 l
+122.483 5.365 l
+123.291 5.365 l
+123.291 2.734 l
+123.557 3.152 123.939 3.366 124.438 3.366 c
+124.974 3.366 125.383 3.175 125.658 2.793 c
+125.93 2.41 126.069 1.826 126.069 1.043 c
+h
+125.261 1.014 m
+125.261 1.602 125.177 2.017 125.012 2.263 c
+124.854 2.517 124.589 2.645 124.218 2.645 c
+123.806 2.645 123.497 2.418 123.291 1.97 c
+123.291 -0.397 l
+123.486 -0.838 123.798 -1.058 124.232 -1.058 c
+124.592 -1.058 124.854 -0.933 125.012 -0.676 c
+125.177 -0.422 125.261 -0.025 125.261 0.515 c
+h
+126.768 1.029 m
+126.768 1.741 126.937 2.311 127.283 2.734 c
+127.636 3.152 128.099 3.366 128.679 3.366 c
+129.256 3.366 129.716 3.16 130.061 2.749 c
+130.414 2.344 130.593 1.786 130.605 1.073 c
+130.605 0.559 l
+130.605 -0.169 130.428 -0.742 130.075 -1.161 c
+129.73 -1.573 129.271 -1.779 128.694 -1.779 c
+128.113 -1.779 127.65 -1.58 127.297 -1.176 c
+126.952 -0.765 126.775 -0.214 126.768 0.485 c
+h
+127.576 0.559 m
+127.576 0.048 127.672 -0.353 127.871 -0.647 c
+128.076 -0.941 128.348 -1.087 128.694 -1.087 c
+129.406 -1.087 129.774 -0.57 129.796 0.47 c
+129.796 1.029 l
+129.796 1.536 129.693 1.94 129.487 2.234 c
+129.289 2.528 129.02 2.675 128.679 2.675 c
+128.344 2.675 128.076 2.528 127.871 2.234 c
+127.672 1.94 127.576 1.536 127.576 1.029 c
+h
+131.303 1.029 m
+131.303 1.741 131.472 2.311 131.817 2.734 c
+132.17 3.152 132.633 3.366 133.213 3.366 c
+133.791 3.366 134.25 3.16 134.595 2.749 c
+134.948 2.344 135.128 1.786 135.139 1.073 c
+135.139 0.559 l
+135.139 -0.169 134.963 -0.742 134.61 -1.161 c
+134.264 -1.573 133.805 -1.779 133.228 -1.779 c
+132.648 -1.779 132.184 -1.58 131.832 -1.176 c
+131.486 -0.765 131.31 -0.214 131.303 0.485 c
+h
+132.111 0.559 m
+132.111 0.048 132.207 -0.353 132.405 -0.647 c
+132.611 -0.941 132.883 -1.087 133.228 -1.087 c
+133.941 -1.087 134.308 -0.57 134.331 0.47 c
+134.331 1.029 l
+134.331 1.536 134.227 1.94 134.022 2.234 c
+133.824 2.528 133.556 2.675 133.213 2.675 c
+132.879 2.675 132.611 2.528 132.405 2.234 c
+132.207 1.94 132.111 1.536 132.111 1.029 c
+h
+137.244 0.588 m
+136.818 0.088 l
+136.818 -1.69 l
+136.01 -1.69 l
+136.01 5.365 l
+136.818 5.365 l
+136.818 1.147 l
+138.362 3.278 l
+139.332 3.278 l
+137.759 1.205 l
+139.553 -1.69 l
+138.597 -1.69 l
+h
+143.393 -1.69 -0.809 4.968 re
+143.451 4.601 m
+143.451 4.461 143.411 4.343 143.334 4.248 c
+143.264 4.16 143.15 4.116 142.996 4.116 c
+142.838 4.116 142.72 4.16 142.643 4.248 c
+142.573 4.343 142.54 4.461 142.54 4.601 c
+142.54 4.737 142.573 4.85 142.643 4.939 c
+142.72 5.034 142.834 5.086 142.981 5.086 c
+143.135 5.086 143.253 5.034 143.334 4.939 c
+143.411 4.85 143.451 4.737 143.451 4.601 c
+147.001 -0.412 m
+147.001 -0.246 146.931 -0.1 146.796 0.029 c
+146.667 0.154 146.414 0.301 146.031 0.47 c
+145.597 0.654 145.289 0.812 145.105 0.941 c
+144.928 1.066 144.797 1.209 144.708 1.367 c
+144.62 1.532 144.576 1.727 144.576 1.955 c
+144.576 2.367 144.723 2.705 145.017 2.969 c
+145.311 3.233 145.686 3.366 146.148 3.366 c
+146.638 3.366 147.031 3.223 147.324 2.94 c
+147.619 2.664 147.766 2.308 147.766 1.866 c
+146.958 1.866 l
+146.958 2.091 146.877 2.282 146.722 2.44 c
+146.575 2.595 146.384 2.675 146.148 2.675 c
+145.913 2.675 145.726 2.609 145.59 2.484 c
+145.451 2.367 145.385 2.198 145.385 1.984 c
+145.385 1.816 145.433 1.683 145.531 1.587 c
+145.627 1.488 145.869 1.356 146.252 1.191 c
+146.858 0.956 147.27 0.723 147.486 0.5 c
+147.7 0.272 147.81 -0.011 147.81 -0.353 c
+147.81 -0.786 147.656 -1.132 147.355 -1.396 c
+147.06 -1.654 146.663 -1.779 146.164 -1.779 c
+145.653 -1.779 145.238 -1.631 144.914 -1.338 c
+144.591 -1.043 144.429 -0.669 144.429 -0.206 c
+145.252 -0.206 l
+145.26 -0.482 145.344 -0.698 145.502 -0.852 c
+145.656 -1.01 145.877 -1.087 146.164 -1.087 c
+146.435 -1.087 146.641 -1.029 146.781 -0.912 c
+146.927 -0.786 147.001 -0.617 147.001 -0.412 c
+153.682 -1.69 m
+153.63 -1.584 153.597 -1.404 153.579 -1.147 c
+153.292 -1.569 152.925 -1.779 152.477 -1.779 c
+152.024 -1.779 151.672 -1.658 151.419 -1.411 c
+151.172 -1.158 151.051 -0.802 151.051 -0.338 c
+151.051 0.169 151.22 0.573 151.565 0.867 c
+151.907 1.161 152.377 1.311 152.976 1.323 c
+153.564 1.323 l
+153.564 1.852 l
+153.564 2.146 153.495 2.356 153.358 2.484 c
+153.23 2.609 153.036 2.675 152.77 2.675 c
+152.525 2.675 152.323 2.602 152.168 2.454 c
+152.021 2.308 151.947 2.12 151.947 1.897 c
+151.124 1.897 l
+151.124 2.15 151.197 2.396 151.345 2.631 c
+151.499 2.866 151.705 3.046 151.962 3.175 c
+152.215 3.3 152.499 3.366 152.815 3.366 c
+153.322 3.366 153.711 3.237 153.976 2.984 c
+154.241 2.738 154.372 2.37 154.372 1.882 c
+154.372 -0.617 l
+154.38 -1 154.435 -1.334 154.534 -1.617 c
+154.534 -1.69 l
+h
+152.609 -1.043 m
+152.803 -1.043 152.991 -0.992 153.167 -0.882 c
+153.351 -0.765 153.483 -0.628 153.564 -0.47 c
+153.564 0.721 l
+153.109 0.721 l
+152.726 0.709 152.421 0.621 152.197 0.455 c
+151.97 0.287 151.86 0.058 151.86 -0.235 c
+151.86 -0.522 151.911 -0.728 152.021 -0.852 c
+152.138 -0.981 152.333 -1.043 152.609 -1.043 c
+156.784 -0.455 m
+157.724 3.278 l
+158.562 3.278 l
+157.077 -1.69 l
+156.475 -1.69 l
+154.975 3.278 l
+155.814 3.278 l
+h
+161.722 -1.69 m
+161.671 -1.584 161.638 -1.404 161.62 -1.147 c
+161.333 -1.569 160.965 -1.779 160.517 -1.779 c
+160.065 -1.779 159.712 -1.658 159.459 -1.411 c
+159.213 -1.158 159.091 -0.802 159.091 -0.338 c
+159.091 0.169 159.261 0.573 159.606 0.867 c
+159.947 1.161 160.418 1.311 161.017 1.323 c
+161.605 1.323 l
+161.605 1.852 l
+161.605 2.146 161.535 2.356 161.399 2.484 c
+161.27 2.609 161.075 2.675 160.811 2.675 c
+160.564 2.675 160.363 2.602 160.209 2.454 c
+160.061 2.308 159.988 2.12 159.988 1.897 c
+159.165 1.897 l
+159.165 2.15 159.238 2.396 159.386 2.631 c
+159.54 2.866 159.745 3.046 160.003 3.175 c
+160.256 3.3 160.539 3.366 160.855 3.366 c
+161.362 3.366 161.752 3.237 162.016 2.984 c
+162.281 2.738 162.413 2.37 162.413 1.882 c
+162.413 -0.617 l
+162.42 -1 162.476 -1.334 162.575 -1.617 c
+162.575 -1.69 l
+h
+160.649 -1.043 m
+160.844 -1.043 161.032 -0.992 161.208 -0.882 c
+161.391 -0.765 161.524 -0.628 161.605 -0.47 c
+161.605 0.721 l
+161.15 0.721 l
+160.767 0.709 160.462 0.621 160.238 0.455 c
+160.01 0.287 159.899 0.058 159.899 -0.235 c
+159.899 -0.522 159.951 -0.728 160.061 -0.852 c
+160.179 -0.981 160.373 -1.043 160.649 -1.043 c
+164.368 -1.69 -0.808 4.968 re
+164.427 4.601 m
+164.427 4.461 164.387 4.343 164.31 4.248 c
+164.24 4.16 164.126 4.116 163.972 4.116 c
+163.814 4.116 163.696 4.16 163.619 4.248 c
+163.548 4.343 163.516 4.461 163.516 4.601 c
+163.516 4.737 163.548 4.85 163.619 4.939 c
+163.696 5.034 163.81 5.086 163.957 5.086 c
+164.111 5.086 164.229 5.034 164.31 4.939 c
+164.387 4.85 164.427 4.737 164.427 4.601 c
+166.434 -1.69 -0.809 7.056 re
+170.174 -1.69 m
+170.123 -1.584 170.089 -1.404 170.072 -1.147 c
+169.785 -1.569 169.418 -1.779 168.969 -1.779 c
+168.517 -1.779 168.165 -1.658 167.911 -1.411 c
+167.664 -1.158 167.543 -0.802 167.543 -0.338 c
+167.543 0.169 167.712 0.573 168.057 0.867 c
+168.4 1.161 168.87 1.311 169.469 1.323 c
+170.056 1.323 l
+170.056 1.852 l
+170.056 2.146 169.987 2.356 169.851 2.484 c
+169.723 2.609 169.528 2.675 169.263 2.675 c
+169.017 2.675 168.815 2.602 168.66 2.454 c
+168.514 2.308 168.44 2.12 168.44 1.897 c
+167.617 1.897 l
+167.617 2.15 167.69 2.396 167.837 2.631 c
+167.992 2.866 168.198 3.046 168.454 3.175 c
+168.708 3.3 168.992 3.366 169.307 3.366 c
+169.814 3.366 170.204 3.237 170.469 2.984 c
+170.733 2.738 170.865 2.37 170.865 1.882 c
+170.865 -0.617 l
+170.873 -1 170.928 -1.334 171.027 -1.617 c
+171.027 -1.69 l
+h
+169.102 -1.043 m
+169.296 -1.043 169.484 -0.992 169.659 -0.882 c
+169.844 -0.765 169.976 -0.628 170.056 -0.47 c
+170.056 0.721 l
+169.601 0.721 l
+169.219 0.709 168.913 0.621 168.69 0.455 c
+168.462 0.287 168.352 0.058 168.352 -0.235 c
+168.352 -0.522 168.403 -0.728 168.514 -0.852 c
+168.631 -0.981 168.826 -1.043 169.102 -1.043 c
+175.539 0.559 m
+175.539 -0.217 175.396 -0.802 175.113 -1.191 c
+174.837 -1.584 174.437 -1.779 173.908 -1.779 c
+173.386 -1.779 172.996 -1.554 172.732 -1.103 c
+172.688 -1.69 l
+171.953 -1.69 l
+171.953 5.365 l
+172.761 5.365 l
+172.761 2.734 l
+173.026 3.152 173.408 3.366 173.908 3.366 c
+174.444 3.366 174.852 3.175 175.128 2.793 c
+175.4 2.41 175.539 1.826 175.539 1.043 c
+h
+174.731 1.014 m
+174.731 1.602 174.646 2.017 174.481 2.263 c
+174.323 2.517 174.058 2.645 173.688 2.645 c
+173.276 2.645 172.967 2.418 172.761 1.97 c
+172.761 -0.397 l
+172.956 -0.838 173.268 -1.058 173.702 -1.058 c
+174.062 -1.058 174.323 -0.933 174.481 -0.676 c
+174.646 -0.422 174.731 -0.025 174.731 0.515 c
+h
+177.281 -1.69 -0.808 7.056 re
+180.243 -1.779 m
+179.626 -1.779 179.148 -1.598 178.818 -1.235 c
+178.494 -0.864 178.325 -0.32 178.318 0.397 c
+178.318 0.999 l
+178.318 1.735 178.479 2.311 178.803 2.734 c
+179.126 3.152 179.575 3.366 180.155 3.366 c
+180.732 3.366 181.162 3.179 181.449 2.807 c
+181.742 2.444 181.893 1.87 181.904 1.087 c
+181.904 0.559 l
+179.126 0.559 l
+179.126 0.441 l
+179.126 -0.1 179.221 -0.493 179.42 -0.735 c
+179.626 -0.97 179.913 -1.087 180.287 -1.087 c
+180.53 -1.087 180.743 -1.043 180.919 -0.956 c
+181.103 -0.867 181.276 -0.728 181.434 -0.53 c
+181.86 -1.043 l
+181.507 -1.536 180.967 -1.779 180.243 -1.779 c
+180.155 2.675 m
+179.82 2.675 179.571 2.558 179.406 2.323 c
+179.236 2.094 179.144 1.738 179.126 1.249 c
+181.081 1.249 l
+181.081 1.367 l
+181.059 1.837 180.978 2.168 180.831 2.367 c
+180.684 2.572 180.456 2.675 180.155 2.675 c
+184.973 1.029 m
+184.973 1.741 185.141 2.311 185.487 2.734 c
+185.84 3.152 186.303 3.366 186.883 3.366 c
+187.46 3.366 187.92 3.16 188.265 2.749 c
+188.618 2.344 188.798 1.786 188.809 1.073 c
+188.809 0.559 l
+188.809 -0.169 188.632 -0.742 188.279 -1.161 c
+187.934 -1.573 187.475 -1.779 186.899 -1.779 c
+186.317 -1.779 185.854 -1.58 185.502 -1.176 c
+185.156 -0.765 184.98 -0.214 184.973 0.485 c
+h
+185.781 0.559 m
+185.781 0.048 185.877 -0.353 186.075 -0.647 c
+186.28 -0.941 186.552 -1.087 186.899 -1.087 c
+187.611 -1.087 187.978 -0.57 188.001 0.47 c
+188.001 1.029 l
+188.001 1.536 187.898 1.94 187.692 2.234 c
+187.493 2.528 187.225 2.675 186.883 2.675 c
+186.549 2.675 186.28 2.528 186.075 2.234 c
+185.877 1.94 185.781 1.536 185.781 1.029 c
+h
+190.433 3.278 m
+190.463 2.749 l
+190.775 3.16 191.176 3.366 191.668 3.366 c
+192.549 3.366 192.995 2.782 193.006 1.617 c
+193.006 -1.69 l
+192.197 -1.69 l
+192.197 1.573 l
+192.197 1.962 192.131 2.238 192.006 2.396 c
+191.878 2.562 191.683 2.645 191.418 2.645 c
+191.213 2.645 191.028 2.576 190.874 2.44 c
+190.716 2.311 190.588 2.138 190.492 1.926 c
+190.492 -1.69 l
+189.669 -1.69 l
+189.669 3.278 l
+h
+194.924 -1.69 -0.808 7.056 re
+196.989 -1.69 -0.808 4.968 re
+197.048 4.601 m
+197.048 4.461 197.008 4.343 196.931 4.248 c
+196.86 4.16 196.746 4.116 196.592 4.116 c
+196.434 4.116 196.316 4.16 196.239 4.248 c
+196.169 4.343 196.137 4.461 196.137 4.601 c
+196.137 4.737 196.169 4.85 196.239 4.939 c
+196.316 5.034 196.43 5.086 196.578 5.086 c
+196.732 5.086 196.85 5.034 196.931 4.939 c
+197.008 4.85 197.048 4.737 197.048 4.601 c
+198.937 3.278 m
+198.966 2.749 l
+199.279 3.16 199.679 3.366 200.171 3.366 c
+201.054 3.366 201.498 2.782 201.509 1.617 c
+201.509 -1.69 l
+200.701 -1.69 l
+200.701 1.573 l
+200.701 1.962 200.634 2.238 200.509 2.396 c
+200.381 2.562 200.186 2.645 199.921 2.645 c
+199.716 2.645 199.532 2.576 199.377 2.44 c
+199.219 2.311 199.091 2.138 198.995 1.926 c
+198.995 -1.69 l
+198.172 -1.69 l
+198.172 3.278 l
+h
+204.324 -1.779 m
+203.707 -1.779 203.229 -1.598 202.898 -1.235 c
+202.575 -0.864 202.406 -0.32 202.398 0.397 c
+202.398 0.999 l
+202.398 1.735 202.56 2.311 202.884 2.734 c
+203.207 3.152 203.655 3.366 204.235 3.366 c
+204.813 3.366 205.243 3.179 205.529 2.807 c
+205.823 2.444 205.974 1.87 205.985 1.087 c
+205.985 0.559 l
+203.207 0.559 l
+203.207 0.441 l
+203.207 -0.1 203.302 -0.493 203.501 -0.735 c
+203.707 -0.97 203.994 -1.087 204.368 -1.087 c
+204.611 -1.087 204.823 -1.043 205 -0.956 c
+205.184 -0.867 205.357 -0.728 205.515 -0.53 c
+205.941 -1.043 l
+205.588 -1.536 205.048 -1.779 204.324 -1.779 c
+204.235 2.675 m
+203.901 2.675 203.651 2.558 203.486 2.323 c
+203.317 2.094 203.225 1.738 203.207 1.249 c
+205.162 1.249 l
+205.162 1.367 l
+205.139 1.837 205.059 2.168 204.912 2.367 c
+204.765 2.572 204.537 2.675 204.235 2.675 c
+209.586 -1.69 m
+209.586 2.616 l
+208.939 2.616 l
+208.939 3.278 l
+209.586 3.278 l
+209.586 3.851 l
+209.594 4.358 209.722 4.755 209.968 5.041 c
+210.211 5.325 210.56 5.468 211.012 5.468 c
+211.167 5.468 211.328 5.438 211.497 5.38 c
+211.453 4.689 l
+211.343 4.719 211.221 4.733 211.086 4.733 c
+210.622 4.733 210.394 4.403 210.394 3.748 c
+210.394 3.278 l
+211.247 3.278 l
+211.247 2.616 l
+210.394 2.616 l
+210.394 -1.69 l
+h
+211.912 1.029 m
+211.912 1.741 212.081 2.311 212.426 2.734 c
+212.779 3.152 213.243 3.366 213.823 3.366 c
+214.4 3.366 214.859 3.16 215.204 2.749 c
+215.558 2.344 215.738 1.786 215.749 1.073 c
+215.749 0.559 l
+215.749 -0.169 215.572 -0.742 215.219 -1.161 c
+214.874 -1.573 214.415 -1.779 213.838 -1.779 c
+213.257 -1.779 212.794 -1.58 212.441 -1.176 c
+212.096 -0.765 211.919 -0.214 211.912 0.485 c
+h
+212.721 0.559 m
+212.721 0.048 212.816 -0.353 213.014 -0.647 c
+213.22 -0.941 213.492 -1.087 213.838 -1.087 c
+214.551 -1.087 214.918 -0.57 214.94 0.47 c
+214.94 1.029 l
+214.94 1.536 214.838 1.94 214.632 2.234 c
+214.433 2.528 214.165 2.675 213.823 2.675 c
+213.489 2.675 213.22 2.528 213.014 2.234 c
+212.816 1.94 212.721 1.536 212.721 1.029 c
+h
+218.666 2.514 m
+218.549 2.532 218.424 2.543 218.299 2.543 c
+217.876 2.543 217.586 2.315 217.432 1.866 c
+217.432 -1.69 l
+216.609 -1.69 l
+216.609 3.278 l
+217.402 3.278 l
+217.417 2.778 l
+217.631 3.167 217.939 3.366 218.343 3.366 c
+218.468 3.366 218.578 3.344 218.666 3.308 c
+h
+222.165 -1.69 m
+222.165 2.616 l
+221.518 2.616 l
+221.518 3.278 l
+222.165 3.278 l
+222.165 3.851 l
+222.172 4.358 222.3 4.755 222.547 5.041 c
+222.79 5.325 223.139 5.468 223.591 5.468 c
+223.745 5.468 223.906 5.438 224.076 5.38 c
+224.031 4.689 l
+223.921 4.719 223.8 4.733 223.664 4.733 c
+223.201 4.733 222.973 4.403 222.973 3.748 c
+222.973 3.278 l
+223.826 3.278 l
+223.826 2.616 l
+222.973 2.616 l
+222.973 -1.69 l
+h
+226.714 2.514 m
+226.597 2.532 226.472 2.543 226.347 2.543 c
+225.924 2.543 225.633 2.315 225.479 1.866 c
+225.479 -1.69 l
+224.656 -1.69 l
+224.656 3.278 l
+225.45 3.278 l
+225.465 2.778 l
+225.678 3.167 225.986 3.366 226.391 3.366 c
+226.516 3.366 226.626 3.344 226.714 3.308 c
+h
+229.099 -1.779 m
+228.482 -1.779 228.004 -1.598 227.673 -1.235 c
+227.35 -0.864 227.181 -0.32 227.173 0.397 c
+227.173 0.999 l
+227.173 1.735 227.335 2.311 227.659 2.734 c
+227.982 3.152 228.43 3.366 229.011 3.366 c
+229.588 3.366 230.018 3.179 230.304 2.807 c
+230.599 2.444 230.749 1.87 230.76 1.087 c
+230.76 0.559 l
+227.982 0.559 l
+227.982 0.441 l
+227.982 -0.1 228.077 -0.493 228.276 -0.735 c
+228.482 -0.97 228.768 -1.087 229.143 -1.087 c
+229.386 -1.087 229.599 -1.043 229.776 -0.956 c
+229.959 -0.867 230.132 -0.728 230.29 -0.53 c
+230.716 -1.043 l
+230.364 -1.536 229.823 -1.779 229.099 -1.779 c
+229.011 2.675 m
+228.677 2.675 228.427 2.558 228.261 2.323 c
+228.093 2.094 228 1.738 227.982 1.249 c
+229.937 1.249 l
+229.937 1.367 l
+229.915 1.837 229.834 2.168 229.687 2.367 c
+229.54 2.572 229.313 2.675 229.011 2.675 c
+233.332 -1.779 m
+232.715 -1.779 232.237 -1.598 231.906 -1.235 c
+231.584 -0.864 231.414 -0.32 231.407 0.397 c
+231.407 0.999 l
+231.407 1.735 231.569 2.311 231.892 2.734 c
+232.216 3.152 232.664 3.366 233.244 3.366 c
+233.822 3.366 234.252 3.179 234.538 2.807 c
+234.832 2.444 234.983 1.87 234.994 1.087 c
+234.994 0.559 l
+232.216 0.559 l
+232.216 0.441 l
+232.216 -0.1 232.311 -0.493 232.509 -0.735 c
+232.715 -0.97 233.001 -1.087 233.377 -1.087 c
+233.619 -1.087 233.832 -1.043 234.009 -0.956 c
+234.192 -0.867 234.365 -0.728 234.523 -0.53 c
+234.95 -1.043 l
+234.597 -1.536 234.057 -1.779 233.332 -1.779 c
+233.244 2.675 m
+232.91 2.675 232.66 2.558 232.494 2.323 c
+232.326 2.094 232.234 1.738 232.216 1.249 c
+234.171 1.249 l
+234.171 1.367 l
+234.148 1.837 234.067 2.168 233.92 2.367 c
+233.774 2.572 233.546 2.675 233.244 2.675 c
+f
+Q
+q 1 0 0 1 538.6692 292.1129 cm
+0 0 m
+-0.052 0.106 -0.085 0.287 -0.103 0.544 c
+-0.389 0.121 -0.757 -0.088 -1.205 -0.088 c
+-1.658 -0.088 -2.01 0.033 -2.263 0.279 c
+-2.51 0.532 -2.631 0.889 -2.631 1.353 c
+-2.631 1.86 -2.462 2.263 -2.117 2.558 c
+-1.775 2.851 -1.305 3.002 -0.706 3.013 c
+-0.118 3.013 l
+-0.118 3.543 l
+-0.118 3.836 -0.187 4.046 -0.324 4.175 c
+-0.452 4.299 -0.646 4.366 -0.912 4.366 c
+-1.157 4.366 -1.359 4.293 -1.514 4.145 c
+-1.66 3.998 -1.735 3.811 -1.735 3.587 c
+-2.558 3.587 l
+-2.558 3.84 -2.484 4.087 -2.337 4.322 c
+-2.182 4.557 -1.977 4.737 -1.72 4.866 c
+-1.466 4.991 -1.183 5.056 -0.867 5.056 c
+-0.36 5.056 0.029 4.928 0.294 4.675 c
+0.559 4.428 0.691 4.06 0.691 3.572 c
+0.691 1.073 l
+0.698 0.69 0.754 0.357 0.852 0.073 c
+0.852 0 l
+h
+-1.072 0.647 m
+-0.878 0.647 -0.69 0.698 -0.515 0.808 c
+-0.33 0.926 -0.199 1.062 -0.118 1.22 c
+-0.118 2.411 l
+-0.573 2.411 l
+-0.955 2.4 -1.261 2.311 -1.484 2.146 c
+-1.712 1.977 -1.822 1.749 -1.822 1.455 c
+-1.822 1.168 -1.771 0.962 -1.66 0.838 c
+-1.543 0.709 -1.348 0.647 -1.072 0.647 c
+2.837 6.174 m
+2.837 4.968 l
+3.587 4.968 l
+3.587 4.307 l
+2.837 4.307 l
+2.837 1.235 l
+2.837 1.037 2.866 0.885 2.926 0.779 c
+2.992 0.68 3.105 0.632 3.263 0.632 c
+3.37 0.632 3.476 0.65 3.587 0.69 c
+3.572 0 l
+3.396 -0.058 3.208 -0.088 3.013 -0.088 c
+2.691 -0.088 2.444 0.022 2.278 0.25 c
+2.109 0.485 2.028 0.808 2.028 1.22 c
+2.028 4.307 l
+1.264 4.307 l
+1.264 4.968 l
+2.028 4.968 l
+2.028 6.174 l
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+q 1 0 0 1 545.9825 296.5664 cm
+0 0 m
+0.301 0.401 0.694 0.603 1.176 0.603 c
+2.057 0.603 2.502 0.019 2.513 -1.146 c
+2.513 -4.453 l
+1.705 -4.453 l
+1.705 -1.19 l
+1.705 -0.801 1.639 -0.525 1.514 -0.367 c
+1.385 -0.201 1.19 -0.118 0.926 -0.118 c
+0.72 -0.118 0.536 -0.187 0.382 -0.323 c
+0.224 -0.452 0.095 -0.625 0 -0.837 c
+0 -4.453 l
+-0.823 -4.453 l
+-0.823 2.602 l
+0 2.602 l
+h
+4.608 1.721 m
+4.608 0.515 l
+5.357 0.515 l
+5.357 -0.147 l
+4.608 -0.147 l
+4.608 -3.218 l
+4.608 -3.417 4.637 -3.568 4.696 -3.674 c
+4.762 -3.773 4.876 -3.821 5.034 -3.821 c
+5.14 -3.821 5.247 -3.803 5.357 -3.763 c
+5.342 -4.453 l
+5.167 -4.512 4.979 -4.542 4.785 -4.542 c
+4.461 -4.542 4.214 -4.432 4.049 -4.203 c
+3.881 -3.968 3.8 -3.645 3.8 -3.233 c
+3.8 -0.147 l
+3.035 -0.147 l
+3.035 0.515 l
+3.8 0.515 l
+3.8 1.721 l
+h
+7.272 1.721 m
+7.272 0.515 l
+8.022 0.515 l
+8.022 -0.147 l
+7.272 -0.147 l
+7.272 -3.218 l
+7.272 -3.417 7.301 -3.568 7.36 -3.674 c
+7.426 -3.773 7.54 -3.821 7.698 -3.821 c
+7.804 -3.821 7.912 -3.803 8.022 -3.763 c
+8.007 -4.453 l
+7.831 -4.512 7.643 -4.542 7.449 -4.542 c
+7.125 -4.542 6.879 -4.432 6.713 -4.203 c
+6.545 -3.968 6.464 -3.645 6.464 -3.233 c
+6.464 -0.147 l
+5.699 -0.147 l
+5.699 0.515 l
+6.464 0.515 l
+6.464 1.721 l
+h
+12.461 -2.204 m
+12.461 -2.991 12.317 -3.579 12.035 -3.968 c
+11.748 -4.351 11.347 -4.542 10.829 -4.542 c
+10.329 -4.542 9.947 -4.357 9.683 -3.983 c
+9.683 -6.364 l
+8.874 -6.364 l
+8.874 0.515 l
+9.609 0.515 l
+9.639 -0.029 l
+9.911 0.389 10.304 0.603 10.815 0.603 c
+11.362 0.603 11.77 0.412 12.035 0.03 c
+12.307 -0.345 12.45 -0.907 12.461 -1.66 c
+h
+11.652 -1.749 m
+11.652 -1.19 11.564 -0.779 11.388 -0.514 c
+11.218 -0.249 10.946 -0.118 10.564 -0.118 c
+10.171 -0.118 9.878 -0.309 9.683 -0.69 c
+9.683 -3.277 l
+9.878 -3.659 10.175 -3.85 10.58 -3.85 c
+10.94 -3.85 11.204 -3.719 11.373 -3.453 c
+11.549 -3.189 11.642 -2.786 11.652 -2.234 c
+h
+15.75 -3.175 m
+15.75 -3.009 15.68 -2.863 15.544 -2.734 c
+15.415 -2.609 15.162 -2.462 14.78 -2.293 c
+14.346 -2.109 14.037 -1.951 13.853 -1.822 c
+13.677 -1.697 13.545 -1.554 13.456 -1.396 c
+13.369 -1.23 13.325 -1.036 13.325 -0.808 c
+13.325 -0.396 13.471 -0.058 13.765 0.206 c
+14.059 0.47 14.434 0.603 14.898 0.603 c
+15.386 0.603 15.779 0.46 16.073 0.177 c
+16.367 -0.099 16.514 -0.455 16.514 -0.897 c
+15.706 -0.897 l
+15.706 -0.672 15.625 -0.481 15.47 -0.323 c
+15.324 -0.168 15.133 -0.087 14.898 -0.087 c
+14.662 -0.087 14.474 -0.154 14.339 -0.278 c
+14.198 -0.396 14.133 -0.565 14.133 -0.779 c
+14.133 -0.947 14.181 -1.08 14.279 -1.176 c
+14.375 -1.275 14.618 -1.407 15 -1.572 c
+15.606 -1.807 16.018 -2.04 16.234 -2.263 c
+16.448 -2.491 16.558 -2.774 16.558 -3.116 c
+16.558 -3.549 16.404 -3.895 16.103 -4.159 c
+15.808 -4.417 15.411 -4.542 14.912 -4.542 c
+14.401 -4.542 13.986 -4.394 13.662 -4.101 c
+13.339 -3.806 13.177 -3.432 13.177 -2.969 c
+14 -2.969 l
+14.008 -3.245 14.092 -3.461 14.25 -3.615 c
+14.405 -3.773 14.625 -3.85 14.912 -3.85 c
+15.183 -3.85 15.39 -3.792 15.529 -3.674 c
+15.676 -3.549 15.75 -3.38 15.75 -3.175 c
+17.491 -4.012 m
+17.491 -3.865 17.535 -3.744 17.624 -3.645 c
+17.712 -3.549 17.837 -3.498 18.006 -3.498 c
+18.183 -3.498 18.314 -3.549 18.403 -3.645 c
+18.499 -3.744 18.549 -3.865 18.549 -4.012 c
+18.549 -4.152 18.499 -4.27 18.403 -4.365 c
+18.314 -4.453 18.183 -4.498 18.006 -4.498 c
+17.837 -4.498 17.712 -4.453 17.624 -4.365 c
+17.535 -4.27 17.491 -4.152 17.491 -4.012 c
+17.491 -0.249 m
+17.491 -0.103 17.535 0.019 17.624 0.118 c
+17.712 0.214 17.837 0.265 18.006 0.265 c
+18.183 0.265 18.314 0.214 18.403 0.118 c
+18.499 0.019 18.549 -0.103 18.549 -0.249 c
+18.549 -0.389 18.499 -0.507 18.403 -0.602 c
+18.314 -0.69 18.183 -0.735 18.006 -0.735 c
+17.837 -0.735 17.712 -0.69 17.624 -0.602 c
+17.535 -0.507 17.491 -0.389 17.491 -0.249 c
+19.785 -5.026 m
+19.093 -5.026 l
+21.431 2.234 l
+22.121 2.234 l
+h
+22.148 -5.026 m
+21.456 -5.026 l
+23.794 2.234 l
+24.485 2.234 l
+h
+25.102 -1.749 m
+25.102 -0.977 25.242 -0.393 25.528 0 c
+25.811 0.401 26.223 0.603 26.763 0.603 c
+27.27 0.603 27.66 0.387 27.924 -0.043 c
+27.953 0.515 l
+28.689 0.515 l
+28.689 -4.498 l
+28.689 -5.115 28.531 -5.585 28.218 -5.909 c
+27.902 -6.239 27.469 -6.408 26.91 -6.408 c
+26.663 -6.408 26.384 -6.342 26.072 -6.217 c
+25.767 -6.1 25.543 -5.953 25.396 -5.776 c
+25.719 -5.217 l
+26.061 -5.548 26.432 -5.718 26.836 -5.718 c
+27.513 -5.718 27.858 -5.35 27.88 -4.615 c
+27.88 -3.968 l
+27.615 -4.351 27.241 -4.542 26.763 -4.542 c
+26.241 -4.542 25.84 -4.351 25.558 -3.968 c
+25.271 -3.579 25.121 -3.021 25.102 -2.293 c
+h
+25.925 -2.204 m
+25.925 -2.763 26.002 -3.175 26.16 -3.439 c
+26.326 -3.696 26.594 -3.821 26.969 -3.821 c
+27.369 -3.821 27.675 -3.615 27.88 -3.204 c
+27.88 -0.72 l
+27.675 -0.319 27.373 -0.118 26.983 -0.118 c
+26.609 -0.118 26.341 -0.249 26.175 -0.514 c
+26.006 -0.771 25.925 -1.168 25.925 -1.705 c
+h
+30.592 -4.453 -0.808 4.968 re
+30.651 1.838 m
+30.651 1.698 30.611 1.58 30.534 1.485 c
+30.463 1.397 30.349 1.353 30.195 1.353 c
+30.037 1.353 29.919 1.397 29.842 1.485 c
+29.772 1.58 29.74 1.698 29.74 1.838 c
+29.74 1.974 29.772 2.088 29.842 2.176 c
+29.919 2.271 30.033 2.323 30.181 2.323 c
+30.335 2.323 30.453 2.271 30.534 2.176 c
+30.611 2.088 30.651 1.974 30.651 1.838 c
+32.849 1.721 m
+32.849 0.515 l
+33.598 0.515 l
+33.598 -0.147 l
+32.849 -0.147 l
+32.849 -3.218 l
+32.849 -3.417 32.878 -3.568 32.936 -3.674 c
+33.003 -3.773 33.117 -3.821 33.275 -3.821 c
+33.381 -3.821 33.487 -3.803 33.598 -3.763 c
+33.583 -4.453 l
+33.407 -4.512 33.219 -4.542 33.025 -4.542 c
+32.701 -4.542 32.456 -4.432 32.29 -4.203 c
+32.121 -3.968 32.04 -3.645 32.04 -3.233 c
+32.04 -0.147 l
+31.276 -0.147 l
+31.276 0.515 l
+32.04 0.515 l
+32.04 1.721 l
+h
+35.949 -1.955 -1.896 0.691 re
+39.103 -3.175 m
+39.103 -3.009 39.033 -2.863 38.897 -2.734 c
+38.769 -2.609 38.515 -2.462 38.133 -2.293 c
+37.699 -2.109 37.391 -1.951 37.206 -1.822 c
+37.03 -1.697 36.898 -1.554 36.81 -1.396 c
+36.722 -1.23 36.677 -1.036 36.677 -0.808 c
+36.677 -0.396 36.824 -0.058 37.119 0.206 c
+37.412 0.47 37.788 0.603 38.25 0.603 c
+38.739 0.603 39.132 0.46 39.426 0.177 c
+39.72 -0.099 39.868 -0.455 39.868 -0.897 c
+39.059 -0.897 l
+39.059 -0.672 38.978 -0.481 38.823 -0.323 c
+38.677 -0.168 38.486 -0.087 38.25 -0.087 c
+38.015 -0.087 37.828 -0.154 37.692 -0.278 c
+37.552 -0.396 37.486 -0.565 37.486 -0.779 c
+37.486 -0.947 37.534 -1.08 37.632 -1.176 c
+37.728 -1.275 37.971 -1.407 38.353 -1.572 c
+38.96 -1.807 39.371 -2.04 39.588 -2.263 c
+39.801 -2.491 39.911 -2.774 39.911 -3.116 c
+39.911 -3.549 39.757 -3.895 39.456 -4.159 c
+39.162 -4.417 38.765 -4.542 38.265 -4.542 c
+37.754 -4.542 37.339 -4.394 37.015 -4.101 c
+36.692 -3.806 36.531 -3.432 36.531 -2.969 c
+37.354 -2.969 l
+37.36 -3.245 37.445 -3.461 37.603 -3.615 c
+37.758 -3.773 37.979 -3.85 38.265 -3.85 c
+38.536 -3.85 38.742 -3.792 38.883 -3.674 c
+39.029 -3.549 39.103 -3.38 39.103 -3.175 c
+42.52 -3.85 m
+42.785 -3.85 42.995 -3.77 43.153 -3.601 c
+43.317 -3.436 43.409 -3.197 43.432 -2.881 c
+44.196 -2.881 l
+44.174 -3.362 44.005 -3.759 43.681 -4.072 c
+43.365 -4.388 42.979 -4.542 42.52 -4.542 c
+41.903 -4.542 41.433 -4.351 41.109 -3.968 c
+40.786 -3.579 40.624 -2.998 40.624 -2.234 c
+40.624 -1.69 l
+40.624 -0.937 40.786 -0.367 41.109 0.015 c
+41.433 0.405 41.896 0.603 42.505 0.603 c
+43.012 0.603 43.417 0.441 43.71 0.118 c
+44.012 -0.198 44.174 -0.631 44.196 -1.19 c
+43.432 -1.19 l
+43.409 -0.83 43.321 -0.554 43.167 -0.367 c
+43.009 -0.183 42.789 -0.087 42.505 -0.087 c
+42.153 -0.087 41.888 -0.213 41.711 -0.455 c
+41.535 -0.69 41.44 -1.08 41.433 -1.616 c
+41.433 -2.248 l
+41.433 -2.836 41.52 -3.256 41.697 -3.498 c
+41.873 -3.733 42.145 -3.85 42.52 -3.85 c
+45.732 0.515 m
+45.761 0.059 l
+46.062 0.42 46.459 0.603 46.952 0.603 c
+47.51 0.603 47.897 0.36 48.113 -0.118 c
+48.425 0.36 48.863 0.603 49.422 0.603 c
+50.34 0.603 50.81 0.034 50.833 -1.102 c
+50.833 -4.453 l
+50.024 -4.453 l
+50.024 -1.176 l
+50.024 -0.823 49.954 -0.558 49.819 -0.382 c
+49.69 -0.205 49.473 -0.118 49.171 -0.118 c
+48.925 -0.118 48.724 -0.213 48.569 -0.396 c
+48.422 -0.584 48.334 -0.823 48.304 -1.117 c
+48.304 -4.453 l
+47.496 -4.453 l
+47.496 -1.146 l
+47.485 -0.463 47.205 -0.118 46.658 -0.118 c
+46.247 -0.118 45.956 -0.323 45.79 -0.735 c
+45.79 -4.453 l
+44.982 -4.453 l
+44.982 0.515 l
+h
+51.818 -4.012 m
+51.818 -3.865 51.862 -3.744 51.949 -3.645 c
+52.038 -3.549 52.163 -3.498 52.332 -3.498 c
+52.508 -3.498 52.641 -3.549 52.728 -3.645 c
+52.824 -3.744 52.876 -3.865 52.876 -4.012 c
+52.876 -4.152 52.824 -4.27 52.728 -4.365 c
+52.641 -4.453 52.508 -4.498 52.332 -4.498 c
+52.163 -4.498 52.038 -4.453 51.949 -4.365 c
+51.862 -4.27 51.818 -4.152 51.818 -4.012 c
+55.874 -3.85 m
+56.139 -3.85 56.348 -3.77 56.506 -3.601 c
+56.672 -3.436 56.763 -3.197 56.786 -2.881 c
+57.55 -2.881 l
+57.528 -3.362 57.359 -3.759 57.036 -4.072 c
+56.72 -4.388 56.333 -4.542 55.874 -4.542 c
+55.257 -4.542 54.787 -4.351 54.463 -3.968 c
+54.14 -3.579 53.979 -2.998 53.979 -2.234 c
+53.979 -1.69 l
+53.979 -0.937 54.14 -0.367 54.463 0.015 c
+54.787 0.405 55.25 0.603 55.86 0.603 c
+56.367 0.603 56.771 0.441 57.065 0.118 c
+57.366 -0.198 57.528 -0.631 57.55 -1.19 c
+56.786 -1.19 l
+56.763 -0.83 56.676 -0.554 56.521 -0.367 c
+56.363 -0.183 56.142 -0.087 55.86 -0.087 c
+55.506 -0.087 55.242 -0.213 55.066 -0.455 c
+54.889 -0.69 54.794 -1.08 54.787 -1.616 c
+54.787 -2.248 l
+54.787 -2.836 54.875 -3.256 55.051 -3.498 c
+55.228 -3.733 55.5 -3.85 55.874 -3.85 c
+58.16 -1.734 m
+58.16 -1.022 58.329 -0.452 58.675 -0.029 c
+59.028 0.389 59.49 0.603 60.071 0.603 c
+60.648 0.603 61.108 0.397 61.453 -0.014 c
+61.806 -0.419 61.985 -0.977 61.997 -1.69 c
+61.997 -2.204 l
+61.997 -2.932 61.82 -3.505 61.467 -3.924 c
+61.122 -4.336 60.663 -4.542 60.086 -4.542 c
+59.505 -4.542 59.042 -4.343 58.689 -3.939 c
+58.344 -3.528 58.168 -2.977 58.16 -2.278 c
+h
+58.968 -2.204 m
+58.968 -2.715 59.064 -3.116 59.263 -3.41 c
+59.468 -3.704 59.74 -3.85 60.086 -3.85 c
+60.799 -3.85 61.166 -3.333 61.188 -2.293 c
+61.188 -1.734 l
+61.188 -1.227 61.085 -0.823 60.879 -0.529 c
+60.68 -0.235 60.412 -0.087 60.071 -0.087 c
+59.737 -0.087 59.468 -0.235 59.263 -0.529 c
+59.064 -0.823 58.968 -1.227 58.968 -1.734 c
+h
+63.617 0.515 m
+63.647 0.059 l
+63.948 0.42 64.345 0.603 64.837 0.603 c
+65.395 0.603 65.781 0.36 65.998 -0.118 c
+66.311 0.36 66.748 0.603 67.306 0.603 c
+68.225 0.603 68.696 0.034 68.717 -1.102 c
+68.717 -4.453 l
+67.909 -4.453 l
+67.909 -1.176 l
+67.909 -0.823 67.839 -0.558 67.703 -0.382 c
+67.575 -0.205 67.358 -0.118 67.057 -0.118 c
+66.81 -0.118 66.608 -0.213 66.454 -0.396 c
+66.307 -0.584 66.219 -0.823 66.189 -1.117 c
+66.189 -4.453 l
+65.381 -4.453 l
+65.381 -1.146 l
+65.37 -0.463 65.091 -0.118 64.543 -0.118 c
+64.131 -0.118 63.841 -0.323 63.676 -0.735 c
+63.676 -4.453 l
+62.868 -4.453 l
+62.868 0.515 l
+h
+69.879 -5.026 m
+69.188 -5.026 l
+71.525 2.234 l
+72.216 2.234 l
+h
+76.596 -2.204 m
+76.596 -2.98 76.453 -3.564 76.17 -3.954 c
+75.894 -4.347 75.494 -4.542 74.965 -4.542 c
+74.443 -4.542 74.053 -4.317 73.789 -3.865 c
+73.745 -4.453 l
+73.01 -4.453 l
+73.01 2.602 l
+73.818 2.602 l
+73.818 -0.029 l
+74.083 0.389 74.465 0.603 74.965 0.603 c
+75.501 0.603 75.909 0.412 76.185 0.03 c
+76.457 -0.353 76.596 -0.937 76.596 -1.72 c
+h
+75.788 -1.749 m
+75.788 -1.161 75.703 -0.746 75.538 -0.5 c
+75.38 -0.246 75.115 -0.118 74.745 -0.118 c
+74.332 -0.118 74.024 -0.345 73.818 -0.793 c
+73.818 -3.16 l
+74.013 -3.601 74.325 -3.821 74.759 -3.821 c
+75.119 -3.821 75.38 -3.696 75.538 -3.439 c
+75.703 -3.185 75.788 -2.788 75.788 -2.248 c
+h
+77.299 -1.734 m
+77.299 -1.022 77.467 -0.452 77.812 -0.029 c
+78.165 0.389 78.629 0.603 79.209 0.603 c
+79.786 0.603 80.245 0.397 80.591 -0.014 c
+80.944 -0.419 81.124 -0.977 81.135 -1.69 c
+81.135 -2.204 l
+81.135 -2.932 80.958 -3.505 80.605 -3.924 c
+80.26 -4.336 79.801 -4.542 79.223 -4.542 c
+78.643 -4.542 78.18 -4.343 77.827 -3.939 c
+77.482 -3.528 77.305 -2.977 77.299 -2.278 c
+h
+78.107 -2.204 m
+78.107 -2.715 78.203 -3.116 78.4 -3.41 c
+78.606 -3.704 78.878 -3.85 79.223 -3.85 c
+79.936 -3.85 80.304 -3.333 80.326 -2.293 c
+80.326 -1.734 l
+80.326 -1.227 80.223 -0.823 80.017 -0.529 c
+79.819 -0.235 79.551 -0.087 79.209 -0.087 c
+78.874 -0.087 78.606 -0.235 78.4 -0.529 c
+78.203 -0.823 78.107 -1.227 78.107 -1.734 c
+h
+81.829 -1.734 m
+81.829 -1.022 81.999 -0.452 82.344 -0.029 c
+82.697 0.389 83.159 0.603 83.74 0.603 c
+84.317 0.603 84.777 0.397 85.122 -0.014 c
+85.475 -0.419 85.654 -0.977 85.666 -1.69 c
+85.666 -2.204 l
+85.666 -2.932 85.49 -3.505 85.137 -3.924 c
+84.791 -4.336 84.332 -4.542 83.755 -4.542 c
+83.174 -4.542 82.711 -4.343 82.358 -3.939 c
+82.013 -3.528 81.837 -2.977 81.829 -2.278 c
+h
+82.637 -2.204 m
+82.637 -2.715 82.733 -3.116 82.932 -3.41 c
+83.138 -3.704 83.41 -3.85 83.755 -3.85 c
+84.468 -3.85 84.835 -3.333 84.857 -2.293 c
+84.857 -1.734 l
+84.857 -1.227 84.754 -0.823 84.549 -0.529 c
+84.35 -0.235 84.082 -0.087 83.74 -0.087 c
+83.406 -0.087 83.138 -0.235 82.932 -0.529 c
+82.733 -0.823 82.637 -1.227 82.637 -1.734 c
+h
+87.775 -2.175 m
+87.349 -2.674 l
+87.349 -4.453 l
+86.54 -4.453 l
+86.54 2.602 l
+87.349 2.602 l
+87.349 -1.616 l
+88.892 0.515 l
+89.862 0.515 l
+88.289 -1.558 l
+90.082 -4.453 l
+89.128 -4.453 l
+h
+f
+Q
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 636.6425 292.5541 cm
+0 0 m
+0 0.147 0.044 0.268 0.132 0.367 c
+0.22 0.463 0.345 0.515 0.515 0.515 c
+0.691 0.515 0.823 0.463 0.911 0.367 c
+1.007 0.268 1.058 0.147 1.058 0 c
+1.058 -0.14 1.007 -0.258 0.911 -0.353 c
+0.823 -0.441 0.691 -0.485 0.515 -0.485 c
+0.345 -0.485 0.22 -0.441 0.132 -0.353 c
+0.044 -0.258 0 -0.14 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 375.475 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 368.6364 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.647 -0.242 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.141 1.278 -3.218 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.319 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.318 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.476 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.2 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+7.975 -0.25 m
+7.975 -0.42 7.934 -0.57 7.857 -0.706 c
+7.787 -0.834 7.684 -0.948 7.548 -1.044 c
+7.42 -1.132 7.258 -1.202 7.063 -1.249 c
+6.876 -1.297 6.659 -1.323 6.417 -1.323 c
+6.189 -1.323 5.991 -1.309 5.814 -1.279 c
+5.638 -1.249 5.48 -1.202 5.343 -1.132 c
+5.204 -1.055 5.093 -0.956 5.006 -0.838 c
+4.917 -0.721 4.848 -0.574 4.8 -0.397 c
+5.608 -0.279 l
+5.627 -0.379 5.656 -0.456 5.696 -0.515 c
+5.744 -0.574 5.802 -0.617 5.873 -0.647 c
+5.939 -0.676 6.02 -0.702 6.108 -0.721 c
+6.196 -0.732 6.299 -0.735 6.417 -0.735 c
+6.512 -0.735 6.608 -0.732 6.696 -0.721 c
+6.784 -0.702 6.861 -0.676 6.931 -0.647 c
+6.997 -0.617 7.049 -0.58 7.078 -0.53 c
+7.115 -0.482 7.136 -0.42 7.136 -0.339 c
+7.136 -0.243 7.107 -0.169 7.049 -0.118 c
+6.997 -0.07 6.931 -0.029 6.843 0 c
+6.755 0.037 6.644 0.066 6.519 0.088 c
+6.402 0.118 6.269 0.147 6.122 0.176 c
+5.983 0.213 5.843 0.253 5.696 0.293 c
+5.557 0.341 5.432 0.404 5.314 0.484 c
+5.204 0.562 5.116 0.661 5.05 0.779 c
+4.979 0.897 4.946 1.047 4.946 1.234 c
+4.946 1.389 4.976 1.532 5.035 1.66 c
+5.101 1.797 5.197 1.911 5.314 1.999 c
+5.439 2.087 5.597 2.153 5.785 2.205 c
+5.968 2.252 6.182 2.278 6.417 2.278 c
+6.6 2.278 6.776 2.256 6.945 2.219 c
+7.111 2.19 7.258 2.135 7.387 2.057 c
+7.512 1.988 7.622 1.889 7.71 1.764 c
+7.798 1.646 7.857 1.502 7.886 1.338 c
+7.092 1.264 l
+7.071 1.341 7.041 1.404 7.005 1.455 c
+6.964 1.514 6.916 1.558 6.857 1.587 c
+6.806 1.624 6.743 1.65 6.666 1.66 c
+6.585 1.668 6.504 1.675 6.417 1.675 c
+6.199 1.675 6.038 1.646 5.931 1.587 c
+5.821 1.536 5.77 1.448 5.77 1.323 c
+5.77 1.242 5.788 1.18 5.829 1.132 c
+5.876 1.08 5.939 1.043 6.02 1.014 c
+6.108 0.985 6.203 0.955 6.313 0.926 c
+6.421 0.904 6.541 0.881 6.681 0.852 c
+6.835 0.823 6.993 0.783 7.151 0.735 c
+7.306 0.683 7.445 0.621 7.563 0.544 c
+7.68 0.463 7.776 0.36 7.857 0.235 c
+7.934 0.106 7.975 -0.055 7.975 -0.25 c
+9.816 2.219 m
+9.816 0.264 l
+9.816 0.125 9.823 0 9.845 -0.118 c
+9.864 -0.228 9.897 -0.32 9.948 -0.397 c
+9.995 -0.478 10.055 -0.54 10.124 -0.588 c
+10.19 -0.628 10.275 -0.647 10.375 -0.647 c
+10.462 -0.647 10.543 -0.628 10.624 -0.588 c
+10.712 -0.54 10.786 -0.47 10.845 -0.382 c
+10.903 -0.287 10.947 -0.177 10.977 -0.059 c
+11.013 0.066 11.036 0.206 11.036 0.353 c
+11.036 2.219 l
+11.932 2.219 l
+11.932 -0.485 l
+11.932 -0.721 l
+11.94 -0.802 11.947 -0.879 11.947 -0.956 c
+11.947 -1.147 l
+11.954 -1.199 11.961 -1.235 11.961 -1.264 c
+11.109 -1.264 l
+11.098 -1.235 11.088 -1.199 11.08 -1.147 c
+11.08 -0.956 l
+11.08 -0.89 11.073 -0.819 11.065 -0.75 c
+11.065 -0.574 l
+11.05 -0.574 l
+10.932 -0.838 10.778 -1.029 10.595 -1.147 c
+10.419 -1.264 10.216 -1.323 9.992 -1.323 c
+9.787 -1.323 9.613 -1.286 9.478 -1.22 c
+9.338 -1.154 9.228 -1.058 9.139 -0.941 c
+9.058 -0.823 9 -0.688 8.963 -0.53 c
+8.933 -0.364 8.919 -0.187 8.919 0 c
+8.919 2.219 l
+h
+15.173 -1.264 m
+15.163 -1.246 15.152 -1.216 15.144 -1.176 c
+15.144 -1.128 15.136 -1.081 15.129 -1.029 c
+15.129 -0.97 15.122 -0.912 15.115 -0.852 c
+15.115 -0.691 l
+14.997 -0.927 14.853 -1.095 14.689 -1.191 c
+14.519 -1.279 14.321 -1.323 14.086 -1.323 c
+13.887 -1.323 13.711 -1.279 13.557 -1.191 c
+13.399 -1.103 13.266 -0.981 13.16 -0.823 c
+13.06 -0.658 12.983 -0.467 12.925 -0.25 c
+12.873 -0.037 12.851 0.206 12.851 0.47 c
+12.851 0.735 12.873 0.974 12.925 1.19 c
+12.983 1.415 13.06 1.606 13.16 1.764 c
+13.266 1.918 13.399 2.043 13.557 2.131 c
+13.722 2.227 13.913 2.278 14.13 2.278 c
+14.225 2.278 14.321 2.263 14.409 2.234 c
+14.504 2.212 14.6 2.179 14.689 2.131 c
+14.776 2.08 14.853 2.017 14.924 1.94 c
+15.001 1.859 15.063 1.768 15.115 1.66 c
+15.115 1.749 l
+15.115 1.896 l
+15.115 2.057 l
+15.115 2.234 l
+15.115 3.513 l
+16.011 3.513 l
+16.011 -0.5 l
+16.011 -0.676 16.015 -0.834 16.026 -0.97 c
+16.033 -1.099 16.041 -1.199 16.041 -1.264 c
+h
+15.129 0.484 m
+15.129 0.72 15.104 0.912 15.056 1.058 c
+15.015 1.213 14.961 1.338 14.894 1.425 c
+14.836 1.514 14.766 1.573 14.689 1.602 c
+14.608 1.639 14.531 1.66 14.454 1.66 c
+14.354 1.66 14.263 1.635 14.174 1.587 c
+14.093 1.547 14.027 1.477 13.968 1.382 c
+13.916 1.282 13.872 1.161 13.835 1.014 c
+13.806 0.867 13.792 0.683 13.792 0.47 c
+13.792 0.077 13.843 -0.217 13.953 -0.412 c
+14.071 -0.611 14.232 -0.706 14.438 -0.706 c
+14.516 -0.706 14.593 -0.688 14.674 -0.647 c
+14.751 -0.611 14.824 -0.544 14.894 -0.456 c
+14.961 -0.368 15.015 -0.246 15.056 -0.088 c
+15.104 0.066 15.129 0.257 15.129 0.484 c
+20.263 0.484 m
+20.263 0.209 20.226 -0.04 20.16 -0.264 c
+20.09 -0.482 19.987 -0.669 19.852 -0.823 c
+19.711 -0.981 19.535 -1.103 19.322 -1.191 c
+19.106 -1.279 18.852 -1.323 18.558 -1.323 c
+18.282 -1.323 18.036 -1.279 17.823 -1.191 c
+17.617 -1.103 17.444 -0.981 17.309 -0.823 c
+17.169 -0.669 17.066 -0.482 17 -0.264 c
+16.93 -0.04 16.897 0.209 16.897 0.484 c
+16.897 0.738 16.927 0.974 16.985 1.19 c
+17.051 1.415 17.154 1.606 17.294 1.764 c
+17.43 1.929 17.606 2.057 17.823 2.146 c
+18.036 2.234 18.294 2.278 18.587 2.278 c
+18.899 2.278 19.161 2.234 19.366 2.146 c
+19.58 2.057 19.752 1.929 19.881 1.764 c
+20.017 1.606 20.116 1.415 20.175 1.19 c
+20.233 0.974 20.263 0.738 20.263 0.484 c
+19.308 0.484 m
+19.308 0.691 19.293 0.867 19.263 1.014 c
+19.241 1.161 19.204 1.282 19.146 1.382 c
+19.087 1.477 19.013 1.547 18.926 1.587 c
+18.837 1.635 18.727 1.66 18.602 1.66 c
+18.338 1.66 18.146 1.562 18.028 1.367 c
+17.911 1.18 17.852 0.885 17.852 0.484 c
+17.852 0.062 17.911 -0.243 18.028 -0.426 c
+18.146 -0.614 18.323 -0.706 18.558 -0.706 c
+18.683 -0.706 18.797 -0.688 18.896 -0.647 c
+18.992 -0.599 19.073 -0.526 19.131 -0.426 c
+19.198 -0.331 19.241 -0.206 19.263 -0.059 c
+19.293 0.088 19.308 0.268 19.308 0.484 c
+26.136 -1.323 m
+25.966 -1.323 25.816 -1.301 25.679 -1.264 c
+25.551 -1.216 25.437 -1.147 25.342 -1.058 c
+25.253 -0.97 25.184 -0.864 25.136 -0.735 c
+25.084 -0.599 25.062 -0.449 25.062 -0.279 c
+25.062 -0.073 25.095 0.095 25.165 0.235 c
+25.232 0.382 25.327 0.492 25.444 0.573 c
+25.569 0.661 25.712 0.723 25.87 0.764 c
+26.036 0.801 26.213 0.827 26.4 0.837 c
+27.121 0.852 l
+27.121 1.029 l
+27.121 1.147 27.109 1.249 27.09 1.338 c
+27.069 1.425 27.036 1.492 26.988 1.543 c
+26.948 1.602 26.899 1.639 26.841 1.66 c
+26.782 1.679 26.716 1.69 26.65 1.69 c
+26.58 1.69 26.518 1.679 26.458 1.66 c
+26.407 1.65 26.36 1.624 26.312 1.587 c
+26.271 1.558 26.238 1.506 26.209 1.44 c
+26.186 1.382 26.172 1.301 26.165 1.205 c
+25.224 1.249 l
+25.253 1.396 25.297 1.532 25.356 1.66 c
+25.423 1.785 25.518 1.896 25.635 1.984 c
+25.753 2.08 25.893 2.153 26.061 2.205 c
+26.238 2.252 26.444 2.278 26.679 2.278 c
+27.121 2.278 27.451 2.167 27.678 1.955 c
+27.914 1.749 28.031 1.44 28.031 1.029 c
+28.031 -0.235 l
+28.031 -0.456 l
+28.039 -0.515 28.054 -0.57 28.075 -0.617 c
+28.094 -0.658 28.123 -0.691 28.164 -0.721 c
+28.201 -0.742 28.252 -0.75 28.311 -0.75 c
+28.376 -0.75 28.447 -0.746 28.517 -0.735 c
+28.517 -1.22 l
+28.457 -1.231 28.403 -1.243 28.355 -1.249 c
+28.314 -1.261 28.274 -1.268 28.237 -1.279 c
+28.197 -1.286 28.153 -1.294 28.105 -1.294 c
+28.054 -1.301 27.995 -1.309 27.929 -1.309 c
+27.701 -1.309 27.535 -1.257 27.429 -1.147 c
+27.318 -1.029 27.256 -0.864 27.237 -0.647 c
+27.223 -0.647 l
+27.154 -0.757 27.083 -0.852 27.017 -0.941 c
+26.948 -1.022 26.87 -1.087 26.782 -1.147 c
+26.693 -1.205 26.595 -1.249 26.488 -1.279 c
+26.389 -1.309 26.271 -1.323 26.136 -1.323 c
+27.121 0.353 m
+26.693 0.338 l
+26.595 0.338 26.503 0.33 26.415 0.324 c
+26.334 0.312 26.267 0.286 26.209 0.249 c
+26.15 0.209 26.099 0.151 26.061 0.073 c
+26.022 0.004 26.003 -0.088 26.003 -0.206 c
+26.003 -0.375 26.036 -0.497 26.106 -0.574 c
+26.172 -0.655 26.271 -0.691 26.4 -0.691 c
+26.506 -0.691 26.606 -0.669 26.693 -0.617 c
+26.789 -0.57 26.87 -0.507 26.929 -0.426 c
+26.995 -0.349 27.046 -0.262 27.076 -0.162 c
+27.106 -0.055 27.121 0.058 27.121 0.176 c
+h
+30.107 2.219 m
+30.115 2.198 30.122 2.165 30.122 2.117 c
+30.13 2.076 30.138 2.028 30.138 1.97 c
+30.144 1.918 30.152 1.866 30.152 1.808 c
+30.152 1.646 l
+30.167 1.646 l
+30.225 1.764 30.292 1.859 30.373 1.94 c
+30.45 2.017 30.534 2.08 30.622 2.131 c
+30.71 2.19 30.799 2.227 30.886 2.248 c
+30.982 2.267 31.081 2.278 31.181 2.278 c
+31.387 2.278 31.567 2.234 31.725 2.146 c
+31.879 2.057 32.008 1.929 32.106 1.764 c
+32.214 1.606 32.291 1.415 32.342 1.19 c
+32.401 0.974 32.43 0.738 32.43 0.484 c
+32.43 0.22 32.401 -0.026 32.342 -0.25 c
+32.291 -0.467 32.214 -0.658 32.106 -0.823 c
+32.008 -0.981 31.875 -1.103 31.709 -1.191 c
+31.551 -1.279 31.364 -1.323 31.152 -1.323 c
+31.052 -1.323 30.953 -1.312 30.857 -1.294 c
+30.758 -1.272 30.666 -1.243 30.578 -1.191 c
+30.497 -1.143 30.42 -1.081 30.343 -1 c
+30.273 -0.923 30.215 -0.831 30.167 -0.721 c
+30.152 -0.721 l
+30.152 -0.809 l
+30.159 -0.85 30.167 -0.897 30.167 -0.956 c
+30.167 -1.118 l
+30.167 -1.294 l
+30.167 -2.631 l
+29.255 -2.631 l
+29.255 1.455 l
+29.255 1.62 29.248 1.768 29.24 1.896 c
+29.24 2.219 l
+h
+30.152 0.455 m
+30.152 0.228 30.17 0.037 30.211 -0.118 c
+30.258 -0.264 30.313 -0.382 30.373 -0.47 c
+30.439 -0.559 30.512 -0.625 30.593 -0.661 c
+30.67 -0.702 30.747 -0.721 30.828 -0.721 c
+30.923 -0.721 31.011 -0.698 31.092 -0.647 c
+31.181 -0.599 31.247 -0.53 31.298 -0.441 c
+31.357 -0.345 31.401 -0.221 31.431 -0.073 c
+31.468 0.081 31.489 0.268 31.489 0.484 c
+31.489 0.874 31.431 1.168 31.313 1.367 c
+31.202 1.562 31.048 1.66 30.843 1.66 c
+30.762 1.66 30.685 1.639 30.608 1.602 c
+30.527 1.562 30.453 1.5 30.387 1.411 c
+30.317 1.323 30.258 1.198 30.211 1.043 c
+30.17 0.885 30.152 0.691 30.152 0.455 c
+33.907 1.602 m
+33.363 1.602 l
+33.363 2.219 l
+33.951 2.219 l
+34.231 3.116 l
+34.804 3.116 l
+34.804 2.219 l
+36.039 2.219 l
+36.039 1.602 l
+34.804 1.602 l
+34.804 -0.103 l
+34.804 -0.324 l
+34.811 -0.393 34.834 -0.456 34.863 -0.515 c
+34.9 -0.566 34.955 -0.611 35.025 -0.647 c
+35.102 -0.676 35.216 -0.691 35.362 -0.691 c
+35.499 -0.691 35.634 -0.688 35.774 -0.676 c
+35.91 -0.658 36.043 -0.632 36.171 -0.603 c
+36.171 -1.205 l
+36.091 -1.216 36.013 -1.231 35.936 -1.249 c
+35.855 -1.261 35.778 -1.268 35.701 -1.279 c
+35.62 -1.286 35.532 -1.294 35.436 -1.294 c
+35.348 -1.301 35.249 -1.309 35.142 -1.309 c
+34.955 -1.309 34.793 -1.294 34.657 -1.264 c
+34.528 -1.228 34.414 -1.183 34.319 -1.132 c
+34.231 -1.085 34.157 -1.025 34.098 -0.956 c
+34.04 -0.879 33.995 -0.802 33.966 -0.721 c
+33.937 -0.632 33.915 -0.544 33.907 -0.456 c
+33.897 -0.36 33.893 -0.264 33.893 -0.177 c
+h
+37.953 0.837 1.867 -0.793 re
+37.953 0.044 m
+42.955 -2.66 m
+42.738 -2.66 42.547 -2.635 42.381 -2.587 c
+42.212 -2.547 42.073 -2.484 41.955 -2.396 c
+41.837 -2.315 41.739 -2.22 41.662 -2.103 c
+41.591 -1.985 41.544 -1.856 41.514 -1.72 c
+42.41 -1.617 l
+42.447 -1.754 42.518 -1.86 42.616 -1.941 c
+42.712 -2.028 42.838 -2.072 42.984 -2.072 c
+43.073 -2.072 43.153 -2.058 43.234 -2.028 c
+43.311 -1.999 43.381 -1.945 43.44 -1.867 c
+43.499 -1.797 43.543 -1.706 43.572 -1.588 c
+43.609 -1.47 43.631 -1.323 43.631 -1.147 c
+43.631 -0.956 l
+43.631 -0.89 43.634 -0.831 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.073 c
+43.017 -1.172 42.811 -1.22 42.587 -1.22 c
+42.381 -1.22 42.198 -1.183 42.044 -1.103 c
+41.897 -1.014 41.768 -0.897 41.662 -0.75 c
+41.562 -0.595 41.488 -0.412 41.44 -0.206 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.771 41.389 1.018 41.44 1.234 c
+41.5 1.448 41.581 1.631 41.691 1.778 c
+41.797 1.932 41.93 2.05 42.088 2.131 c
+42.242 2.219 42.429 2.263 42.646 2.263 c
+42.742 2.263 42.84 2.252 42.94 2.234 c
+43.035 2.212 43.123 2.179 43.204 2.131 c
+43.293 2.08 43.37 2.017 43.44 1.94 c
+43.517 1.859 43.58 1.768 43.631 1.66 c
+43.646 1.66 l
+43.646 1.808 l
+43.653 1.866 43.661 1.918 43.661 1.97 c
+43.667 2.028 43.675 2.076 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.219 c
+44.557 2.219 l
+44.546 2.138 44.535 2.028 44.527 1.881 c
+44.527 1.411 l
+44.527 -1.162 l
+44.527 -1.415 44.49 -1.636 44.424 -1.823 c
+44.355 -2.007 44.251 -2.161 44.116 -2.278 c
+43.976 -2.404 43.811 -2.499 43.616 -2.558 c
+43.418 -2.624 43.197 -2.66 42.955 -2.66 c
+43.646 0.529 m
+43.646 0.742 43.62 0.918 43.572 1.058 c
+43.532 1.205 43.476 1.323 43.41 1.411 c
+43.351 1.5 43.282 1.558 43.204 1.587 c
+43.123 1.624 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.62 42.69 1.573 c
+42.609 1.532 42.543 1.462 42.485 1.367 c
+42.433 1.278 42.389 1.161 42.352 1.014 c
+42.323 0.874 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.367 -0.154 42.485 -0.339 c
+42.602 -0.515 42.763 -0.603 42.969 -0.603 c
+43.035 -0.603 43.109 -0.588 43.19 -0.559 c
+43.278 -0.522 43.351 -0.463 43.41 -0.382 c
+43.476 -0.294 43.532 -0.177 43.572 -0.029 c
+43.62 0.118 43.646 0.301 43.646 0.529 c
+47.044 -1.323 m
+46.788 -1.323 46.56 -1.286 46.354 -1.22 c
+46.148 -1.143 45.972 -1.029 45.824 -0.882 c
+45.678 -0.728 45.56 -0.537 45.472 -0.309 c
+45.391 -0.085 45.354 0.18 45.354 0.484 c
+45.354 0.816 45.398 1.095 45.487 1.323 c
+45.582 1.558 45.711 1.741 45.869 1.881 c
+46.034 2.017 46.221 2.117 46.427 2.175 c
+46.633 2.242 46.842 2.278 47.06 2.278 c
+47.331 2.278 47.567 2.227 47.765 2.131 c
+47.971 2.043 48.136 1.911 48.265 1.735 c
+48.401 1.565 48.5 1.359 48.559 1.117 c
+48.625 0.881 48.662 0.617 48.662 0.324 c
+48.662 0.309 l
+46.295 0.309 l
+46.295 0.162 46.31 0.022 46.339 -0.103 c
+46.376 -0.231 46.431 -0.345 46.501 -0.441 c
+46.567 -0.53 46.651 -0.599 46.751 -0.647 c
+46.846 -0.698 46.96 -0.721 47.089 -0.721 c
+47.243 -0.721 47.383 -0.688 47.501 -0.617 c
+47.625 -0.551 47.713 -0.449 47.765 -0.309 c
+48.602 -0.382 l
+48.573 -0.482 48.519 -0.588 48.441 -0.706 c
+48.361 -0.816 48.257 -0.919 48.132 -1.014 c
+48.014 -1.103 47.86 -1.176 47.677 -1.235 c
+47.501 -1.294 47.287 -1.323 47.044 -1.323 c
+47.044 1.705 m
+46.956 1.705 46.869 1.69 46.78 1.66 c
+46.692 1.631 46.611 1.579 46.545 1.514 c
+46.475 1.444 46.416 1.356 46.368 1.249 c
+46.328 1.139 46.31 1.014 46.31 0.867 c
+47.779 0.867 l
+47.779 1.003 47.754 1.124 47.706 1.234 c
+47.665 1.341 47.611 1.429 47.544 1.5 c
+47.486 1.565 47.412 1.617 47.324 1.646 c
+47.235 1.683 47.14 1.705 47.044 1.705 c
+50.15 1.602 m
+49.606 1.602 l
+49.606 2.219 l
+50.194 2.219 l
+50.474 3.116 l
+51.046 3.116 l
+51.046 2.219 l
+52.282 2.219 l
+52.282 1.602 l
+51.046 1.602 l
+51.046 -0.103 l
+51.046 -0.324 l
+51.054 -0.393 51.076 -0.456 51.106 -0.515 c
+51.142 -0.566 51.197 -0.611 51.267 -0.647 c
+51.345 -0.676 51.458 -0.691 51.605 -0.691 c
+51.741 -0.691 51.877 -0.688 52.016 -0.676 c
+52.153 -0.658 52.285 -0.632 52.413 -0.603 c
+52.413 -1.205 l
+52.332 -1.216 52.255 -1.231 52.178 -1.249 c
+52.097 -1.261 52.02 -1.268 51.943 -1.279 c
+51.862 -1.286 51.775 -1.294 51.679 -1.294 c
+51.59 -1.301 51.491 -1.309 51.384 -1.309 c
+51.197 -1.309 51.035 -1.294 50.9 -1.264 c
+50.771 -1.228 50.657 -1.183 50.561 -1.132 c
+50.474 -1.085 50.4 -1.025 50.341 -0.956 c
+50.283 -0.879 50.238 -0.802 50.208 -0.721 c
+50.179 -0.632 50.157 -0.544 50.15 -0.456 c
+50.139 -0.36 50.135 -0.264 50.135 -0.177 c
+h
+59.774 -0.647 m
+60.906 -0.647 l
+60.906 -1.264 l
+57.599 -1.264 l
+57.599 -0.647 l
+58.863 -0.647 l
+58.863 1.602 l
+57.936 1.602 l
+57.936 2.219 l
+59.774 2.219 l
+h
+58.863 3.513 0.911 -0.676 re
+58.863 2.836 m
+63.923 -1.264 m
+63.923 0.72 l
+63.923 1.022 63.879 1.242 63.791 1.382 c
+63.71 1.529 63.574 1.602 63.379 1.602 c
+63.268 1.602 63.166 1.577 63.07 1.529 c
+62.983 1.477 62.902 1.411 62.835 1.323 c
+62.776 1.234 62.725 1.124 62.688 0.999 c
+62.659 0.881 62.644 0.75 62.644 0.602 c
+62.644 -1.264 l
+61.732 -1.264 l
+61.732 1.44 l
+61.732 1.66 l
+61.732 1.749 61.726 1.826 61.718 1.896 c
+61.718 2.087 l
+61.718 2.219 l
+62.57 2.219 l
+62.578 2.19 62.586 2.146 62.586 2.087 c
+62.586 1.896 l
+62.593 1.826 62.6 1.756 62.6 1.69 c
+62.607 1.62 62.615 1.565 62.615 1.529 c
+62.63 1.529 l
+62.747 1.793 62.898 1.984 63.085 2.102 c
+63.268 2.219 63.49 2.278 63.746 2.278 c
+63.93 2.278 64.092 2.248 64.232 2.19 c
+64.367 2.131 64.481 2.043 64.57 1.926 c
+64.658 1.808 64.72 1.664 64.76 1.5 c
+64.808 1.341 64.834 1.153 64.834 0.941 c
+64.834 -1.264 l
+h
+68.895 -0.25 m
+68.895 -0.42 68.855 -0.57 68.777 -0.706 c
+68.708 -0.834 68.604 -0.948 68.469 -1.044 c
+68.34 -1.132 68.178 -1.202 67.983 -1.249 c
+67.796 -1.297 67.579 -1.323 67.337 -1.323 c
+67.109 -1.323 66.91 -1.309 66.734 -1.279 c
+66.557 -1.249 66.399 -1.202 66.264 -1.132 c
+66.124 -1.055 66.014 -0.956 65.926 -0.838 c
+65.838 -0.721 65.768 -0.574 65.72 -0.397 c
+66.528 -0.279 l
+66.547 -0.379 66.576 -0.456 66.617 -0.515 c
+66.665 -0.574 66.723 -0.617 66.792 -0.647 c
+66.859 -0.676 66.94 -0.702 67.028 -0.721 c
+67.116 -0.732 67.219 -0.735 67.337 -0.735 c
+67.432 -0.735 67.528 -0.732 67.616 -0.721 c
+67.704 -0.702 67.781 -0.676 67.851 -0.647 c
+67.918 -0.617 67.968 -0.58 67.999 -0.53 c
+68.035 -0.482 68.057 -0.42 68.057 -0.339 c
+68.057 -0.243 68.028 -0.169 67.968 -0.118 c
+67.918 -0.07 67.851 -0.029 67.763 0 c
+67.675 0.037 67.565 0.066 67.44 0.088 c
+67.322 0.118 67.19 0.147 67.043 0.176 c
+66.904 0.213 66.763 0.253 66.617 0.293 c
+66.476 0.341 66.352 0.404 66.235 0.484 c
+66.124 0.562 66.036 0.661 65.969 0.779 c
+65.9 0.897 65.867 1.047 65.867 1.234 c
+65.867 1.389 65.896 1.532 65.955 1.66 c
+66.021 1.797 66.117 1.911 66.235 1.999 c
+66.359 2.087 66.517 2.153 66.705 2.205 c
+66.888 2.252 67.102 2.278 67.337 2.278 c
+67.521 2.278 67.697 2.256 67.866 2.219 c
+68.031 2.19 68.178 2.135 68.307 2.057 c
+68.432 1.988 68.542 1.889 68.63 1.764 c
+68.718 1.646 68.777 1.502 68.807 1.338 c
+68.013 1.264 l
+67.991 1.341 67.962 1.404 67.924 1.455 c
+67.885 1.514 67.837 1.558 67.777 1.587 c
+67.727 1.624 67.664 1.65 67.586 1.66 c
+67.506 1.668 67.425 1.675 67.337 1.675 c
+67.12 1.675 66.958 1.646 66.852 1.587 c
+66.742 1.536 66.69 1.448 66.69 1.323 c
+66.69 1.242 66.709 1.18 66.748 1.132 c
+66.796 1.08 66.859 1.043 66.94 1.014 c
+67.028 0.985 67.124 0.955 67.234 0.926 c
+67.34 0.904 67.461 0.881 67.602 0.852 c
+67.756 0.823 67.914 0.783 68.072 0.735 c
+68.226 0.683 68.365 0.621 68.483 0.544 c
+68.601 0.463 68.697 0.36 68.777 0.235 c
+68.855 0.106 68.895 -0.055 68.895 -0.25 c
+70.457 1.602 m
+69.913 1.602 l
+69.913 2.219 l
+70.501 2.219 l
+70.78 3.116 l
+71.353 3.116 l
+71.353 2.219 l
+72.588 2.219 l
+72.588 1.602 l
+71.353 1.602 l
+71.353 -0.103 l
+71.353 -0.324 l
+71.361 -0.393 71.382 -0.456 71.412 -0.515 c
+71.449 -0.566 71.504 -0.611 71.573 -0.647 c
+71.651 -0.676 71.765 -0.691 71.912 -0.691 c
+72.047 -0.691 72.184 -0.688 72.323 -0.676 c
+72.46 -0.658 72.591 -0.632 72.72 -0.603 c
+72.72 -1.205 l
+72.639 -1.216 72.562 -1.231 72.485 -1.249 c
+72.404 -1.261 72.327 -1.268 72.25 -1.279 c
+72.169 -1.286 72.08 -1.294 71.985 -1.294 c
+71.897 -1.301 71.798 -1.309 71.691 -1.309 c
+71.504 -1.309 71.342 -1.294 71.206 -1.264 c
+71.078 -1.228 70.964 -1.183 70.868 -1.132 c
+70.78 -1.085 70.707 -1.025 70.648 -0.956 c
+70.589 -0.879 70.545 -0.802 70.515 -0.721 c
+70.486 -0.632 70.464 -0.544 70.457 -0.456 c
+70.445 -0.36 70.442 -0.264 70.442 -0.177 c
+h
+74.873 -1.323 m
+74.705 -1.323 74.554 -1.301 74.418 -1.264 c
+74.289 -1.216 74.175 -1.147 74.079 -1.058 c
+73.992 -0.97 73.922 -0.864 73.874 -0.735 c
+73.823 -0.599 73.801 -0.449 73.801 -0.279 c
+73.801 -0.073 73.834 0.095 73.904 0.235 c
+73.969 0.382 74.065 0.492 74.183 0.573 c
+74.308 0.661 74.451 0.723 74.609 0.764 c
+74.775 0.801 74.951 0.827 75.138 0.837 c
+75.858 0.852 l
+75.858 1.029 l
+75.858 1.147 75.847 1.249 75.829 1.338 c
+75.807 1.425 75.774 1.492 75.726 1.543 c
+75.685 1.602 75.638 1.639 75.579 1.66 c
+75.521 1.679 75.454 1.69 75.388 1.69 c
+75.318 1.69 75.255 1.679 75.197 1.66 c
+75.145 1.65 75.098 1.624 75.05 1.587 c
+75.01 1.558 74.977 1.506 74.947 1.44 c
+74.925 1.382 74.91 1.301 74.903 1.205 c
+73.962 1.249 l
+73.992 1.396 74.036 1.532 74.094 1.66 c
+74.16 1.785 74.256 1.896 74.374 1.984 c
+74.492 2.08 74.631 2.153 74.8 2.205 c
+74.977 2.252 75.182 2.278 75.417 2.278 c
+75.858 2.278 76.19 2.167 76.417 1.955 c
+76.652 1.749 76.77 1.44 76.77 1.029 c
+76.77 -0.235 l
+76.77 -0.456 l
+76.778 -0.515 76.792 -0.57 76.814 -0.617 c
+76.832 -0.658 76.861 -0.691 76.902 -0.721 c
+76.939 -0.742 76.99 -0.75 77.049 -0.75 c
+77.115 -0.75 77.185 -0.746 77.254 -0.735 c
+77.254 -1.22 l
+77.196 -1.231 77.141 -1.243 77.094 -1.249 c
+77.053 -1.261 77.013 -1.268 76.976 -1.279 c
+76.936 -1.286 76.891 -1.294 76.843 -1.294 c
+76.792 -1.301 76.733 -1.309 76.667 -1.309 c
+76.439 -1.309 76.274 -1.257 76.167 -1.147 c
+76.057 -1.029 75.995 -0.864 75.976 -0.647 c
+75.961 -0.647 l
+75.891 -0.757 75.822 -0.852 75.756 -0.941 c
+75.685 -1.022 75.608 -1.087 75.521 -1.147 c
+75.432 -1.205 75.333 -1.249 75.226 -1.279 c
+75.127 -1.309 75.01 -1.323 74.873 -1.323 c
+75.858 0.353 m
+75.432 0.338 l
+75.333 0.338 75.241 0.33 75.153 0.324 c
+75.072 0.312 75.006 0.286 74.947 0.249 c
+74.889 0.209 74.837 0.151 74.8 0.073 c
+74.76 0.004 74.742 -0.088 74.742 -0.206 c
+74.742 -0.375 74.775 -0.497 74.844 -0.574 c
+74.91 -0.655 75.01 -0.691 75.138 -0.691 c
+75.245 -0.691 75.344 -0.669 75.432 -0.617 c
+75.528 -0.57 75.608 -0.507 75.667 -0.426 c
+75.733 -0.349 75.785 -0.262 75.814 -0.162 c
+75.843 -0.055 75.858 0.058 75.858 0.176 c
+h
+80.08 -0.647 m
+81.213 -0.647 l
+81.213 -1.264 l
+77.905 -1.264 l
+77.905 -0.647 l
+79.17 -0.647 l
+79.17 2.896 l
+78.243 2.896 l
+78.243 3.513 l
+80.08 3.513 l
+h
+84.142 -0.647 m
+85.273 -0.647 l
+85.273 -1.264 l
+81.966 -1.264 l
+81.966 -0.647 l
+83.23 -0.647 l
+83.23 2.896 l
+82.304 2.896 l
+82.304 3.513 l
+84.142 3.513 l
+h
+91.689 -2.66 m
+91.473 -2.66 91.282 -2.635 91.116 -2.587 c
+90.947 -2.547 90.808 -2.484 90.69 -2.396 c
+90.573 -2.315 90.473 -2.22 90.396 -2.103 c
+90.326 -1.985 90.278 -1.856 90.249 -1.72 c
+91.145 -1.617 l
+91.182 -1.754 91.252 -1.86 91.351 -1.941 c
+91.446 -2.028 91.572 -2.072 91.718 -2.072 c
+91.807 -2.072 91.888 -2.058 91.969 -2.028 c
+92.046 -1.999 92.115 -1.945 92.175 -1.867 c
+92.233 -1.797 92.277 -1.706 92.306 -1.588 c
+92.344 -1.47 92.366 -1.323 92.366 -1.147 c
+92.366 -0.956 l
+92.366 -0.89 92.369 -0.831 92.381 -0.779 c
+92.381 -0.588 l
+92.366 -0.588 l
+92.267 -0.816 92.123 -0.977 91.939 -1.073 c
+91.752 -1.172 91.546 -1.22 91.322 -1.22 c
+91.116 -1.22 90.933 -1.183 90.778 -1.103 c
+90.631 -1.014 90.502 -0.897 90.396 -0.75 c
+90.297 -0.595 90.224 -0.412 90.176 -0.206 c
+90.124 0.008 90.102 0.243 90.102 0.5 c
+90.102 0.771 90.124 1.018 90.176 1.234 c
+90.234 1.448 90.315 1.631 90.425 1.778 c
+90.532 1.932 90.664 2.05 90.822 2.131 c
+90.976 2.219 91.164 2.263 91.381 2.263 c
+91.477 2.263 91.575 2.252 91.675 2.234 c
+91.77 2.212 91.859 2.179 91.939 2.131 c
+92.028 2.08 92.105 2.017 92.175 1.94 c
+92.252 1.859 92.314 1.768 92.366 1.66 c
+92.381 1.66 l
+92.381 1.808 l
+92.387 1.866 92.395 1.918 92.395 1.97 c
+92.402 2.028 92.41 2.076 92.41 2.117 c
+92.417 2.165 92.428 2.198 92.439 2.219 c
+93.291 2.219 l
+93.281 2.138 93.27 2.028 93.262 1.881 c
+93.262 1.411 l
+93.262 -1.162 l
+93.262 -1.415 93.225 -1.636 93.16 -1.823 c
+93.089 -2.007 92.986 -2.161 92.851 -2.278 c
+92.711 -2.404 92.545 -2.499 92.35 -2.558 c
+92.152 -2.624 91.932 -2.66 91.689 -2.66 c
+92.381 0.529 m
+92.381 0.742 92.354 0.918 92.306 1.058 c
+92.267 1.205 92.211 1.323 92.145 1.411 c
+92.086 1.5 92.017 1.558 91.939 1.587 c
+91.859 1.624 91.781 1.646 91.704 1.646 c
+91.604 1.646 91.513 1.62 91.425 1.573 c
+91.344 1.532 91.278 1.462 91.219 1.367 c
+91.168 1.278 91.124 1.161 91.087 1.014 c
+91.057 0.874 91.043 0.706 91.043 0.5 c
+91.043 0.125 91.101 -0.154 91.219 -0.339 c
+91.336 -0.515 91.498 -0.603 91.704 -0.603 c
+91.77 -0.603 91.843 -0.588 91.924 -0.559 c
+92.013 -0.522 92.086 -0.463 92.145 -0.382 c
+92.211 -0.294 92.267 -0.177 92.306 -0.029 c
+92.354 0.118 92.381 0.301 92.381 0.529 c
+96.327 -0.647 m
+97.459 -0.647 l
+97.459 -1.264 l
+94.151 -1.264 l
+94.151 -0.647 l
+95.415 -0.647 l
+95.415 1.602 l
+94.49 1.602 l
+94.49 2.219 l
+96.327 2.219 l
+h
+95.415 3.513 0.912 -0.676 re
+95.415 2.836 m
+98.889 1.602 m
+98.344 1.602 l
+98.344 2.219 l
+98.932 2.219 l
+99.211 3.116 l
+99.785 3.116 l
+99.785 2.219 l
+101.019 2.219 l
+101.019 1.602 l
+99.785 1.602 l
+99.785 -0.103 l
+99.785 -0.324 l
+99.793 -0.393 99.814 -0.456 99.844 -0.515 c
+99.88 -0.566 99.936 -0.611 100.005 -0.647 c
+100.082 -0.676 100.196 -0.691 100.343 -0.691 c
+100.479 -0.691 100.615 -0.688 100.755 -0.676 c
+100.891 -0.658 101.023 -0.632 101.152 -0.603 c
+101.152 -1.205 l
+101.071 -1.216 100.994 -1.231 100.917 -1.249 c
+100.836 -1.261 100.759 -1.268 100.682 -1.279 c
+100.601 -1.286 100.512 -1.294 100.417 -1.294 c
+100.329 -1.301 100.229 -1.309 100.123 -1.309 c
+99.936 -1.309 99.774 -1.294 99.637 -1.264 c
+99.51 -1.228 99.396 -1.183 99.3 -1.132 c
+99.211 -1.085 99.138 -1.025 99.08 -0.956 c
+99.02 -0.879 98.976 -0.802 98.947 -0.721 c
+98.918 -0.632 98.895 -0.544 98.889 -0.456 c
+98.877 -0.36 98.874 -0.264 98.874 -0.177 c
+h
+f
+Q
+0.793 0.801 0.129 0.016 k
+35.668 201.199 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 164.9238 185.7106 cm
+0 0 m
+0 9.363 l
+2.896 9.363 l
+3.873 9.363 4.619 9.142 5.13 8.702 c
+5.637 8.268 5.895 7.632 5.895 6.79 c
+5.895 6.32 5.785 5.913 5.571 5.57 c
+5.365 5.225 5.075 4.976 4.704 4.821 c
+5.122 4.692 5.446 4.446 5.674 4.086 c
+5.909 3.733 6.026 3.285 6.026 2.748 c
+6.026 1.844 5.777 1.161 5.277 0.691 c
+4.777 0.228 4.05 0 3.102 0 c
+h
+1.897 4.072 m
+1.897 1.572 l
+3.102 1.572 l
+3.443 1.572 3.705 1.675 3.881 1.881 c
+4.057 2.094 4.145 2.395 4.145 2.778 c
+4.145 3.619 3.836 4.049 3.219 4.072 c
+h
+1.897 5.453 m
+2.882 5.453 l
+3.616 5.453 3.983 5.835 3.983 6.599 c
+3.983 7.018 3.896 7.324 3.719 7.511 c
+3.55 7.694 3.278 7.79 2.896 7.79 c
+1.897 7.79 l
+h
+7.655 0.926 m
+7.655 1.219 7.75 1.458 7.948 1.646 c
+8.143 1.83 8.397 1.925 8.713 1.925 c
+9.014 1.925 9.264 1.83 9.463 1.646 c
+9.668 1.458 9.771 1.219 9.771 0.926 c
+9.771 0.621 9.668 0.374 9.463 0.191 c
+9.264 0.014 9.014 -0.074 8.713 -0.074 c
+8.408 -0.074 8.154 0.018 7.948 0.205 c
+7.75 0.389 7.655 0.631 7.655 0.926 c
+16.644 0 -1.897 9.363 re
+24.702 1.058 m
+24.338 0.665 23.894 0.367 23.364 0.161 c
+22.836 -0.034 22.254 -0.133 21.629 -0.133 c
+20.55 -0.133 19.711 0.198 19.116 0.866 c
+18.518 1.532 18.212 2.502 18.205 3.777 c
+18.205 5.468 l
+18.205 6.761 18.485 7.754 19.042 8.452 c
+19.609 9.146 20.432 9.495 21.512 9.495 c
+22.53 9.495 23.295 9.238 23.805 8.731 c
+24.324 8.231 24.621 7.445 24.702 6.379 c
+22.865 6.379 l
+22.813 6.975 22.692 7.382 22.497 7.599 c
+22.298 7.812 21.99 7.922 21.571 7.922 c
+21.06 7.922 20.689 7.735 20.454 7.364 c
+20.226 6.989 20.108 6.397 20.101 5.585 c
+20.101 3.881 l
+20.101 3.027 20.226 2.403 20.484 2.013 c
+20.737 1.631 21.152 1.44 21.733 1.44 c
+22.104 1.44 22.408 1.514 22.644 1.66 c
+22.805 1.778 l
+22.805 3.498 l
+21.483 3.498 l
+21.483 4.924 l
+24.702 4.924 l
+h
+32.831 0 m
+30.934 0 l
+28.17 6.144 l
+28.17 0 l
+26.275 0 l
+26.275 9.363 l
+28.17 9.363 l
+30.934 3.218 l
+30.934 9.363 l
+32.831 9.363 l
+h
+41.183 3.836 m
+41.183 2.58 40.882 1.606 40.286 0.911 c
+39.688 0.213 38.865 -0.133 37.817 -0.133 c
+36.766 -0.133 35.939 0.209 35.333 0.897 c
+34.734 1.591 34.429 2.557 34.422 3.792 c
+34.422 5.394 l
+34.422 6.676 34.719 7.68 35.318 8.407 c
+35.914 9.132 36.744 9.495 37.803 9.495 c
+38.838 9.495 39.658 9.135 40.257 8.422 c
+40.864 7.717 41.172 6.721 41.183 5.438 c
+h
+39.287 5.409 m
+39.287 6.25 39.162 6.879 38.919 7.291 c
+38.684 7.702 38.31 7.908 37.803 7.908 c
+37.302 7.908 36.928 7.706 36.685 7.305 c
+36.45 6.912 36.325 6.312 36.318 5.512 c
+36.318 3.836 l
+36.318 3.02 36.439 2.418 36.685 2.028 c
+36.928 1.635 37.306 1.44 37.817 1.44 c
+38.306 1.44 38.67 1.631 38.905 2.013 c
+39.147 2.395 39.276 2.983 39.287 3.777 c
+h
+45.593 3.424 m
+44.652 3.424 l
+44.652 0 l
+42.771 0 l
+42.771 9.363 l
+45.784 9.363 l
+46.732 9.363 47.463 9.117 47.974 8.628 c
+48.492 8.136 48.753 7.441 48.753 6.541 c
+48.753 5.294 48.301 4.424 47.401 3.924 c
+49.032 0.087 l
+49.032 0 l
+47.004 0 l
+h
+44.652 4.997 m
+45.726 4.997 l
+46.108 4.997 46.391 5.119 46.578 5.365 c
+46.761 5.618 46.857 5.957 46.857 6.379 c
+46.857 7.32 46.493 7.79 45.769 7.79 c
+44.652 7.79 l
+h
+52.255 0 -1.897 9.363 re
+60.505 0 m
+58.609 0 l
+55.845 6.144 l
+55.845 0 l
+53.95 0 l
+53.95 9.363 l
+55.845 9.363 l
+58.609 3.218 l
+58.609 9.363 l
+60.505 9.363 l
+h
+68.622 1.058 m
+68.259 0.665 67.814 0.367 67.285 0.161 c
+66.756 -0.034 66.175 -0.133 65.551 -0.133 c
+64.47 -0.133 63.633 0.198 63.037 0.866 c
+62.438 1.532 62.133 2.502 62.125 3.777 c
+62.125 5.468 l
+62.125 6.761 62.405 7.754 62.964 8.452 c
+63.529 9.146 64.352 9.495 65.433 9.495 c
+66.451 9.495 67.215 9.238 67.726 8.731 c
+68.244 8.231 68.541 7.445 68.622 6.379 c
+66.785 6.379 l
+66.734 6.975 66.613 7.382 66.418 7.599 c
+66.22 7.812 65.911 7.922 65.491 7.922 c
+64.981 7.922 64.61 7.735 64.375 7.364 c
+64.147 6.989 64.03 6.397 64.022 5.585 c
+64.022 3.881 l
+64.022 3.027 64.147 2.403 64.404 2.013 c
+64.658 1.631 65.073 1.44 65.653 1.44 c
+66.025 1.44 66.33 1.514 66.565 1.66 c
+66.727 1.778 l
+66.727 3.498 l
+65.404 3.498 l
+65.404 4.924 l
+68.622 4.924 l
+h
+78.151 3.821 m
+75.211 3.821 l
+75.211 0 l
+73.316 0 l
+73.316 9.363 l
+78.504 9.363 l
+78.504 7.79 l
+75.211 7.79 l
+75.211 5.394 l
+78.151 5.394 l
+h
+81.756 0 -1.896 9.363 re
+85.347 1.572 m
+88.668 1.572 l
+88.668 0 l
+83.45 0 l
+83.45 9.363 l
+85.347 9.363 l
+h
+94.768 4.056 m
+91.828 4.056 l
+91.828 1.572 l
+95.312 1.572 l
+95.312 0 l
+89.933 0 l
+89.933 9.363 l
+95.298 9.363 l
+95.298 7.79 l
+91.828 7.79 l
+91.828 5.57 l
+94.768 5.57 l
+h
+100.526 2.454 m
+100.526 2.836 100.428 3.123 100.233 3.322 c
+100.034 3.516 99.682 3.719 99.175 3.924 c
+98.234 4.284 97.558 4.704 97.146 5.174 c
+96.734 5.651 96.528 6.221 96.528 6.879 c
+96.528 7.661 96.808 8.294 97.367 8.775 c
+97.925 9.252 98.635 9.495 99.498 9.495 c
+100.075 9.495 100.589 9.37 101.041 9.128 c
+101.49 8.882 101.835 8.54 102.07 8.099 c
+102.313 7.658 102.438 7.158 102.438 6.599 c
+100.557 6.599 l
+100.557 7.04 100.461 7.371 100.277 7.599 c
+100.09 7.823 99.821 7.937 99.468 7.937 c
+99.134 7.937 98.874 7.838 98.689 7.644 c
+98.513 7.455 98.425 7.195 98.425 6.864 c
+98.425 6.607 98.527 6.372 98.733 6.158 c
+98.939 5.953 99.3 5.736 99.821 5.512 c
+100.732 5.188 101.394 4.784 101.806 4.307 c
+102.225 3.825 102.438 3.212 102.438 2.469 c
+102.438 1.653 102.177 1.018 101.659 0.558 c
+101.137 0.095 100.431 -0.133 99.542 -0.133 c
+98.932 -0.133 98.381 -0.008 97.881 0.235 c
+97.389 0.488 97.002 0.845 96.72 1.308 c
+96.433 1.778 96.293 2.326 96.293 2.954 c
+98.19 2.954 l
+98.19 2.414 98.292 2.021 98.498 1.778 c
+98.712 1.532 99.061 1.411 99.542 1.411 c
+100.196 1.411 100.526 1.756 100.526 2.454 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 173.911 238.665 -49.165 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 167.0717 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.431 -1.323 m
+6.145 -1.323 5.902 -1.282 5.696 -1.205 c
+5.49 -1.117 5.318 -0.996 5.182 -0.838 c
+5.042 -0.684 4.939 -0.496 4.873 -0.279 c
+4.803 -0.055 4.77 0.191 4.77 0.455 c
+4.77 0.75 4.803 1.007 4.873 1.235 c
+4.95 1.459 5.056 1.646 5.197 1.793 c
+5.343 1.947 5.519 2.065 5.725 2.146 c
+5.931 2.234 6.167 2.278 6.431 2.278 c
+6.656 2.278 6.857 2.249 7.034 2.19 c
+7.21 2.132 7.361 2.047 7.489 1.941 c
+7.614 1.841 7.717 1.72 7.798 1.573 c
+7.875 1.433 7.93 1.282 7.96 1.118 c
+7.048 1.073 l
+7.019 1.249 6.949 1.389 6.843 1.5 c
+6.743 1.606 6.6 1.661 6.417 1.661 c
+6.17 1.661 5.993 1.558 5.887 1.353 c
+5.777 1.154 5.725 0.867 5.725 0.485 c
+5.725 -0.309 5.961 -0.706 6.431 -0.706 c
+6.596 -0.706 6.739 -0.654 6.857 -0.544 c
+6.975 -0.437 7.048 -0.276 7.078 -0.058 c
+7.989 -0.103 l
+7.96 -0.272 7.905 -0.426 7.828 -0.573 c
+7.757 -0.721 7.655 -0.852 7.518 -0.97 c
+7.39 -1.08 7.232 -1.168 7.048 -1.234 c
+6.872 -1.294 6.666 -1.323 6.431 -1.323 c
+9.889 -1.323 m
+9.72 -1.323 9.569 -1.301 9.434 -1.264 c
+9.305 -1.216 9.191 -1.147 9.095 -1.058 c
+9.008 -0.97 8.937 -0.864 8.889 -0.735 c
+8.838 -0.599 8.816 -0.449 8.816 -0.279 c
+8.816 -0.073 8.85 0.096 8.919 0.235 c
+8.985 0.382 9.081 0.492 9.199 0.573 c
+9.323 0.661 9.467 0.724 9.625 0.765 c
+9.79 0.802 9.966 0.827 10.153 0.838 c
+10.874 0.852 l
+10.874 1.029 l
+10.874 1.147 10.863 1.249 10.845 1.338 c
+10.822 1.426 10.789 1.492 10.741 1.544 c
+10.701 1.602 10.654 1.639 10.595 1.661 c
+10.535 1.679 10.469 1.691 10.404 1.691 c
+10.334 1.691 10.271 1.679 10.213 1.661 c
+10.161 1.65 10.113 1.625 10.065 1.588 c
+10.025 1.558 9.992 1.507 9.962 1.44 c
+9.941 1.382 9.926 1.301 9.918 1.205 c
+8.977 1.249 l
+9.008 1.396 9.051 1.532 9.11 1.661 c
+9.176 1.786 9.272 1.897 9.39 1.984 c
+9.507 2.08 9.646 2.153 9.816 2.205 c
+9.992 2.253 10.198 2.278 10.433 2.278 c
+10.874 2.278 11.204 2.168 11.433 1.955 c
+11.668 1.749 11.786 1.44 11.786 1.029 c
+11.786 -0.235 l
+11.786 -0.455 l
+11.792 -0.515 11.807 -0.569 11.83 -0.617 c
+11.848 -0.658 11.877 -0.69 11.917 -0.721 c
+11.954 -0.742 12.006 -0.75 12.065 -0.75 c
+12.131 -0.75 12.2 -0.746 12.27 -0.735 c
+12.27 -1.22 l
+12.212 -1.231 12.156 -1.242 12.108 -1.249 c
+12.068 -1.261 12.027 -1.268 11.991 -1.278 c
+11.95 -1.286 11.907 -1.294 11.859 -1.294 c
+11.807 -1.301 11.749 -1.309 11.682 -1.309 c
+11.454 -1.309 11.289 -1.257 11.183 -1.147 c
+11.072 -1.029 11.009 -0.864 10.992 -0.646 c
+10.977 -0.646 l
+10.907 -0.757 10.837 -0.852 10.771 -0.941 c
+10.701 -1.022 10.624 -1.087 10.535 -1.147 c
+10.448 -1.205 10.348 -1.249 10.242 -1.278 c
+10.143 -1.309 10.025 -1.323 9.889 -1.323 c
+10.874 0.353 m
+10.448 0.338 l
+10.348 0.338 10.257 0.331 10.168 0.324 c
+10.088 0.312 10.022 0.287 9.962 0.25 c
+9.904 0.21 9.852 0.151 9.816 0.073 c
+9.775 0.004 9.756 -0.088 9.756 -0.206 c
+9.756 -0.374 9.79 -0.496 9.86 -0.573 c
+9.926 -0.654 10.025 -0.69 10.153 -0.69 c
+10.261 -0.69 10.359 -0.669 10.448 -0.617 c
+10.543 -0.569 10.624 -0.507 10.683 -0.426 c
+10.749 -0.349 10.801 -0.261 10.83 -0.162 c
+10.859 -0.055 10.874 0.059 10.874 0.177 c
+h
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.566 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.801 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.178 -0.279 0.926 -0.985 re
+22.178 -1.264 m
+26.709 -2.66 m
+26.491 -2.66 26.3 -2.635 26.136 -2.587 c
+25.966 -2.547 25.826 -2.484 25.709 -2.396 c
+25.591 -2.315 25.492 -2.219 25.415 -2.102 c
+25.345 -1.984 25.297 -1.856 25.268 -1.72 c
+26.165 -1.617 l
+26.201 -1.753 26.271 -1.86 26.371 -1.94 c
+26.466 -2.028 26.591 -2.072 26.738 -2.072 c
+26.826 -2.072 26.907 -2.057 26.988 -2.028 c
+27.065 -1.999 27.135 -1.944 27.194 -1.866 c
+27.252 -1.797 27.296 -1.705 27.326 -1.587 c
+27.362 -1.469 27.385 -1.323 27.385 -1.147 c
+27.385 -0.956 l
+27.385 -0.889 27.389 -0.831 27.399 -0.779 c
+27.399 -0.588 l
+27.385 -0.588 l
+27.285 -0.816 27.142 -0.977 26.959 -1.073 c
+26.771 -1.172 26.566 -1.22 26.341 -1.22 c
+26.136 -1.22 25.951 -1.183 25.797 -1.103 c
+25.65 -1.014 25.521 -0.897 25.415 -0.75 c
+25.315 -0.595 25.242 -0.411 25.195 -0.206 c
+25.143 0.008 25.121 0.243 25.121 0.5 c
+25.121 0.771 25.143 1.018 25.195 1.235 c
+25.253 1.448 25.334 1.631 25.444 1.779 c
+25.55 1.933 25.683 2.051 25.841 2.132 c
+25.995 2.219 26.183 2.263 26.4 2.263 c
+26.495 2.263 26.595 2.253 26.693 2.234 c
+26.789 2.213 26.878 2.179 26.959 2.132 c
+27.046 2.08 27.123 2.018 27.194 1.941 c
+27.271 1.86 27.333 1.768 27.385 1.661 c
+27.399 1.661 l
+27.399 1.808 l
+27.407 1.866 27.414 1.918 27.414 1.97 c
+27.422 2.028 27.429 2.076 27.429 2.117 c
+27.436 2.165 27.447 2.198 27.458 2.219 c
+28.311 2.219 l
+28.299 2.138 28.289 2.028 28.281 1.881 c
+28.281 1.411 l
+28.281 -1.161 l
+28.281 -1.415 28.245 -1.635 28.178 -1.822 c
+28.108 -2.007 28.006 -2.161 27.869 -2.278 c
+27.73 -2.404 27.565 -2.499 27.37 -2.558 c
+27.171 -2.624 26.951 -2.66 26.709 -2.66 c
+27.399 0.53 m
+27.399 0.742 27.374 0.919 27.326 1.058 c
+27.285 1.205 27.231 1.323 27.164 1.411 c
+27.106 1.5 27.036 1.558 26.959 1.588 c
+26.878 1.625 26.801 1.646 26.724 1.646 c
+26.624 1.646 26.532 1.621 26.444 1.573 c
+26.363 1.532 26.296 1.463 26.238 1.367 c
+26.186 1.278 26.142 1.161 26.106 1.014 c
+26.076 0.875 26.061 0.706 26.061 0.5 c
+26.061 0.125 26.121 -0.154 26.238 -0.338 c
+26.356 -0.515 26.518 -0.603 26.724 -0.603 c
+26.789 -0.603 26.863 -0.588 26.944 -0.559 c
+27.032 -0.522 27.106 -0.463 27.164 -0.382 c
+27.231 -0.294 27.285 -0.176 27.326 -0.029 c
+27.374 0.118 27.399 0.301 27.399 0.53 c
+31.343 -0.646 m
+32.474 -0.646 l
+32.474 -1.264 l
+29.167 -1.264 l
+29.167 -0.646 l
+30.431 -0.646 l
+30.431 1.602 l
+29.505 1.602 l
+29.505 2.219 l
+31.343 2.219 l
+h
+30.431 3.513 0.912 -0.675 re
+30.431 2.837 m
+33.907 1.602 m
+33.363 1.602 l
+33.363 2.219 l
+33.951 2.219 l
+34.231 3.117 l
+34.804 3.117 l
+34.804 2.219 l
+36.039 2.219 l
+36.039 1.602 l
+34.804 1.602 l
+34.804 -0.103 l
+34.804 -0.324 l
+34.811 -0.393 34.834 -0.455 34.863 -0.515 c
+34.9 -0.566 34.955 -0.61 35.025 -0.646 c
+35.102 -0.676 35.216 -0.69 35.362 -0.69 c
+35.499 -0.69 35.634 -0.687 35.774 -0.676 c
+35.91 -0.658 36.043 -0.632 36.17 -0.603 c
+36.17 -1.205 l
+36.091 -1.216 36.013 -1.231 35.935 -1.249 c
+35.855 -1.261 35.778 -1.268 35.7 -1.278 c
+35.62 -1.286 35.532 -1.294 35.436 -1.294 c
+35.348 -1.301 35.249 -1.309 35.142 -1.309 c
+34.955 -1.309 34.793 -1.294 34.657 -1.264 c
+34.528 -1.228 34.414 -1.183 34.319 -1.132 c
+34.231 -1.084 34.157 -1.025 34.098 -0.956 c
+34.04 -0.879 33.995 -0.801 33.966 -0.721 c
+33.937 -0.632 33.915 -0.544 33.907 -0.455 c
+33.897 -0.36 33.893 -0.264 33.893 -0.176 c
+h
+39.467 -0.646 m
+40.599 -0.646 l
+40.599 -1.264 l
+37.292 -1.264 l
+37.292 -0.646 l
+38.556 -0.646 l
+38.556 1.602 l
+37.63 1.602 l
+37.63 2.219 l
+39.467 2.219 l
+h
+38.556 3.513 0.911 -0.675 re
+38.556 2.837 m
+42.954 -2.66 m
+42.738 -2.66 42.547 -2.635 42.381 -2.587 c
+42.212 -2.547 42.073 -2.484 41.955 -2.396 c
+41.837 -2.315 41.738 -2.219 41.661 -2.102 c
+41.591 -1.984 41.543 -1.856 41.514 -1.72 c
+42.41 -1.617 l
+42.447 -1.753 42.518 -1.86 42.616 -1.94 c
+42.712 -2.028 42.837 -2.072 42.984 -2.072 c
+43.072 -2.072 43.153 -2.057 43.234 -2.028 c
+43.311 -1.999 43.381 -1.944 43.44 -1.866 c
+43.499 -1.797 43.542 -1.705 43.572 -1.587 c
+43.609 -1.469 43.631 -1.323 43.631 -1.147 c
+43.631 -0.956 l
+43.631 -0.889 43.634 -0.831 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.073 c
+43.017 -1.172 42.811 -1.22 42.587 -1.22 c
+42.381 -1.22 42.198 -1.183 42.044 -1.103 c
+41.896 -1.014 41.768 -0.897 41.661 -0.75 c
+41.562 -0.595 41.488 -0.411 41.441 -0.206 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.771 41.389 1.018 41.441 1.235 c
+41.5 1.448 41.58 1.631 41.691 1.779 c
+41.797 1.933 41.93 2.051 42.088 2.132 c
+42.242 2.219 42.429 2.263 42.646 2.263 c
+42.742 2.263 42.84 2.253 42.94 2.234 c
+43.035 2.213 43.123 2.179 43.204 2.132 c
+43.293 2.08 43.37 2.018 43.44 1.941 c
+43.517 1.86 43.58 1.768 43.631 1.661 c
+43.646 1.661 l
+43.646 1.808 l
+43.653 1.866 43.66 1.918 43.66 1.97 c
+43.667 2.028 43.675 2.076 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.219 c
+44.557 2.219 l
+44.546 2.138 44.535 2.028 44.527 1.881 c
+44.527 1.411 l
+44.527 -1.161 l
+44.527 -1.415 44.49 -1.635 44.425 -1.822 c
+44.355 -2.007 44.251 -2.161 44.116 -2.278 c
+43.976 -2.404 43.811 -2.499 43.616 -2.558 c
+43.418 -2.624 43.197 -2.66 42.954 -2.66 c
+43.646 0.53 m
+43.646 0.742 43.619 0.919 43.572 1.058 c
+43.532 1.205 43.476 1.323 43.41 1.411 c
+43.351 1.5 43.282 1.558 43.204 1.588 c
+43.123 1.625 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.621 42.69 1.573 c
+42.609 1.532 42.543 1.463 42.484 1.367 c
+42.433 1.278 42.389 1.161 42.352 1.014 c
+42.323 0.875 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.366 -0.154 42.484 -0.338 c
+42.601 -0.515 42.763 -0.603 42.969 -0.603 c
+43.035 -0.603 43.109 -0.588 43.189 -0.559 c
+43.278 -0.522 43.351 -0.463 43.41 -0.382 c
+43.476 -0.294 43.532 -0.176 43.572 -0.029 c
+43.619 0.118 43.646 0.301 43.646 0.53 c
+47.677 -1.264 m
+47.677 0.721 l
+47.677 1.022 47.632 1.242 47.544 1.382 c
+47.463 1.529 47.328 1.602 47.133 1.602 c
+47.023 1.602 46.919 1.577 46.824 1.529 c
+46.736 1.477 46.655 1.411 46.589 1.323 c
+46.53 1.235 46.479 1.124 46.441 1 c
+46.412 0.882 46.398 0.75 46.398 0.603 c
+46.398 -1.264 l
+45.487 -1.264 l
+45.487 1.44 l
+45.487 1.661 l
+45.487 1.749 45.479 1.826 45.472 1.897 c
+45.472 2.088 l
+45.472 2.219 l
+46.324 2.219 l
+46.331 2.19 46.339 2.146 46.339 2.088 c
+46.339 1.897 l
+46.346 1.826 46.354 1.756 46.354 1.691 c
+46.362 1.621 46.368 1.565 46.368 1.529 c
+46.383 1.529 l
+46.501 1.793 46.651 1.984 46.838 2.102 c
+47.023 2.219 47.243 2.278 47.5 2.278 c
+47.684 2.278 47.846 2.249 47.985 2.19 c
+48.122 2.132 48.235 2.043 48.323 1.926 c
+48.411 1.808 48.474 1.665 48.515 1.5 c
+48.562 1.342 48.588 1.154 48.588 0.941 c
+48.588 -1.264 l
+h
+52.752 0.485 m
+52.752 0.21 52.714 -0.04 52.648 -0.264 c
+52.579 -0.482 52.476 -0.669 52.34 -0.823 c
+52.201 -0.981 52.024 -1.103 51.811 -1.191 c
+51.594 -1.278 51.341 -1.323 51.046 -1.323 c
+50.771 -1.323 50.524 -1.278 50.312 -1.191 c
+50.106 -1.103 49.933 -0.981 49.797 -0.823 c
+49.657 -0.669 49.554 -0.482 49.489 -0.264 c
+49.419 -0.04 49.385 0.21 49.385 0.485 c
+49.385 0.738 49.415 0.974 49.473 1.191 c
+49.539 1.415 49.643 1.606 49.782 1.764 c
+49.918 1.929 50.094 2.058 50.312 2.146 c
+50.524 2.234 50.782 2.278 51.076 2.278 c
+51.388 2.278 51.649 2.234 51.854 2.146 c
+52.068 2.058 52.241 1.929 52.369 1.764 c
+52.505 1.606 52.604 1.415 52.664 1.191 c
+52.722 0.974 52.752 0.738 52.752 0.485 c
+51.796 0.485 m
+51.796 0.691 51.781 0.867 51.752 1.014 c
+51.73 1.161 51.693 1.282 51.634 1.382 c
+51.576 1.477 51.502 1.548 51.414 1.588 c
+51.326 1.635 51.216 1.661 51.091 1.661 c
+50.826 1.661 50.635 1.562 50.517 1.367 c
+50.4 1.18 50.341 0.885 50.341 0.485 c
+50.341 0.062 50.4 -0.243 50.517 -0.426 c
+50.635 -0.613 50.811 -0.706 51.046 -0.706 c
+51.172 -0.706 51.285 -0.687 51.384 -0.646 c
+51.48 -0.599 51.561 -0.526 51.619 -0.426 c
+51.686 -0.331 51.73 -0.206 51.752 -0.058 c
+51.781 0.088 51.796 0.268 51.796 0.485 c
+56.625 1.47 m
+56.525 1.477 56.423 1.488 56.316 1.5 c
+56.205 1.517 56.084 1.529 55.949 1.529 c
+55.772 1.529 55.614 1.488 55.478 1.411 c
+55.339 1.342 55.22 1.242 55.125 1.118 c
+55.037 0.989 54.967 0.842 54.919 0.676 c
+54.879 0.507 54.861 0.331 54.861 0.147 c
+54.861 -1.264 l
+53.965 -1.264 l
+53.965 0.985 l
+53.965 1.11 53.953 1.235 53.934 1.353 c
+53.924 1.477 53.909 1.595 53.89 1.706 c
+53.88 1.823 53.865 1.918 53.847 1.999 c
+53.824 2.088 53.807 2.161 53.788 2.219 c
+54.67 2.219 l
+54.677 2.168 54.688 2.117 54.699 2.058 c
+54.717 1.999 54.732 1.933 54.743 1.866 c
+54.761 1.808 54.776 1.742 54.788 1.675 c
+54.794 1.606 54.806 1.544 54.817 1.484 c
+54.831 1.484 l
+54.869 1.602 54.919 1.708 54.979 1.808 c
+55.045 1.903 55.125 1.988 55.214 2.058 c
+55.301 2.124 55.405 2.179 55.522 2.219 c
+55.648 2.256 55.794 2.278 55.964 2.278 c
+56.088 2.278 56.205 2.271 56.316 2.263 c
+56.434 2.253 56.537 2.238 56.625 2.219 c
+h
+59.23 -1.323 m
+58.973 -1.323 58.745 -1.286 58.539 -1.22 c
+58.333 -1.143 58.157 -1.029 58.01 -0.881 c
+57.863 -0.727 57.745 -0.536 57.657 -0.309 c
+57.576 -0.085 57.539 0.18 57.539 0.485 c
+57.539 0.816 57.584 1.095 57.672 1.323 c
+57.768 1.558 57.896 1.742 58.054 1.881 c
+58.22 2.018 58.407 2.117 58.613 2.176 c
+58.819 2.242 59.028 2.278 59.245 2.278 c
+59.517 2.278 59.752 2.227 59.951 2.132 c
+60.157 2.043 60.321 1.911 60.45 1.735 c
+60.586 1.565 60.685 1.359 60.744 1.118 c
+60.81 0.882 60.847 0.617 60.847 0.324 c
+60.847 0.309 l
+58.48 0.309 l
+58.48 0.162 58.495 0.022 58.524 -0.103 c
+58.561 -0.231 58.617 -0.345 58.686 -0.441 c
+58.752 -0.529 58.837 -0.599 58.936 -0.646 c
+59.031 -0.698 59.145 -0.721 59.274 -0.721 c
+59.428 -0.721 59.569 -0.687 59.686 -0.617 c
+59.81 -0.551 59.899 -0.449 59.951 -0.309 c
+60.788 -0.382 l
+60.759 -0.482 60.704 -0.588 60.627 -0.706 c
+60.546 -0.816 60.443 -0.919 60.317 -1.014 c
+60.2 -1.103 60.046 -1.176 59.862 -1.234 c
+59.686 -1.294 59.473 -1.323 59.23 -1.323 c
+59.23 1.706 m
+59.141 1.706 59.054 1.691 58.966 1.661 c
+58.877 1.631 58.796 1.58 58.73 1.514 c
+58.661 1.444 58.601 1.356 58.553 1.249 c
+58.513 1.139 58.495 1.014 58.495 0.867 c
+59.965 0.867 l
+59.965 1.003 59.939 1.124 59.891 1.235 c
+59.851 1.342 59.796 1.43 59.729 1.5 c
+59.671 1.565 59.598 1.617 59.509 1.646 c
+59.421 1.683 59.326 1.706 59.23 1.706 c
+f
+Q
+q 1 0 0 1 40.8309 120.2041 cm
+0 0 m
+-1.411 0 l
+-1.411 -4.777 l
+-2.072 -4.777 l
+-2.072 0 l
+-3.484 0 l
+-3.484 0.573 l
+0 0.573 l
+h
+1.352 -1.206 m
+1.606 -0.882 1.926 -0.721 2.308 -0.721 c
+3.013 -0.721 3.37 -1.191 3.381 -2.132 c
+3.381 -4.777 l
+2.734 -4.777 l
+2.734 -2.161 l
+2.734 -1.849 2.679 -1.628 2.572 -1.5 c
+2.462 -1.374 2.308 -1.309 2.102 -1.309 c
+1.944 -1.309 1.797 -1.363 1.661 -1.47 c
+1.532 -1.58 1.429 -1.716 1.352 -1.881 c
+1.352 -4.777 l
+0.706 -4.777 l
+0.706 0.867 l
+1.352 0.867 l
+h
+6.379 -4.777 m
+6.339 -4.69 6.313 -4.542 6.306 -4.337 c
+6.071 -4.682 5.777 -4.851 5.424 -4.851 c
+5.06 -4.851 4.777 -4.755 4.571 -4.557 c
+4.373 -4.351 4.278 -4.065 4.278 -3.69 c
+4.278 -3.289 4.413 -2.97 4.689 -2.735 c
+4.961 -2.492 5.336 -2.367 5.806 -2.367 c
+6.291 -2.367 l
+6.291 -1.941 l
+6.291 -1.706 6.236 -1.54 6.13 -1.441 c
+6.019 -1.334 5.857 -1.279 5.644 -1.279 c
+5.446 -1.279 5.284 -1.338 5.159 -1.455 c
+5.041 -1.573 4.983 -1.72 4.983 -1.897 c
+4.336 -1.897 l
+4.336 -1.702 4.395 -1.511 4.513 -1.324 c
+4.638 -1.139 4.8 -0.992 4.997 -0.882 c
+5.203 -0.775 5.431 -0.721 5.689 -0.721 c
+6.089 -0.721 6.394 -0.823 6.6 -1.029 c
+6.813 -1.235 6.927 -1.529 6.938 -1.912 c
+6.938 -3.925 l
+6.938 -4.23 6.975 -4.495 7.056 -4.719 c
+7.056 -4.777 l
+h
+5.512 -4.263 m
+5.677 -4.263 5.828 -4.219 5.968 -4.131 c
+6.115 -4.042 6.221 -3.932 6.291 -3.793 c
+6.291 -2.852 l
+5.924 -2.852 l
+5.608 -2.852 5.365 -2.922 5.189 -3.057 c
+5.012 -3.186 4.924 -3.373 4.924 -3.616 c
+4.924 -3.844 4.968 -4.009 5.056 -4.116 c
+5.145 -4.215 5.295 -4.263 5.512 -4.263 c
+8.555 -0.794 m
+8.569 -1.235 l
+8.823 -0.893 9.147 -0.721 9.54 -0.721 c
+10.246 -0.721 10.601 -1.191 10.612 -2.132 c
+10.612 -4.777 l
+9.966 -4.777 l
+9.966 -2.161 l
+9.966 -1.849 9.911 -1.628 9.804 -1.5 c
+9.694 -1.374 9.54 -1.309 9.334 -1.309 c
+9.176 -1.309 9.029 -1.363 8.893 -1.47 c
+8.764 -1.58 8.661 -1.716 8.584 -1.881 c
+8.584 -4.777 l
+7.937 -4.777 l
+7.937 -0.794 l
+h
+12.582 -2.955 m
+12.245 -3.352 l
+12.245 -4.777 l
+11.582 -4.777 l
+11.582 0.867 l
+12.245 0.867 l
+12.245 -2.514 l
+13.479 -0.794 l
+14.258 -0.794 l
+12.993 -2.455 l
+14.42 -4.777 l
+13.67 -4.777 l
+h
+16.918 -3.763 m
+16.918 -3.616 16.864 -3.495 16.756 -3.396 c
+16.646 -3.3 16.44 -3.183 16.139 -3.043 c
+15.794 -2.896 15.551 -2.774 15.405 -2.675 c
+15.258 -2.569 15.148 -2.452 15.081 -2.323 c
+15.011 -2.198 14.978 -2.04 14.978 -1.852 c
+14.978 -1.529 15.096 -1.261 15.331 -1.044 c
+15.566 -0.831 15.867 -0.721 16.243 -0.721 c
+16.625 -0.721 16.933 -0.834 17.168 -1.058 c
+17.404 -1.286 17.521 -1.573 17.521 -1.926 c
+16.874 -1.926 l
+16.874 -1.75 16.816 -1.598 16.698 -1.47 c
+16.581 -1.345 16.426 -1.279 16.243 -1.279 c
+16.044 -1.279 15.893 -1.334 15.787 -1.441 c
+15.676 -1.54 15.625 -1.673 15.625 -1.837 c
+15.625 -1.966 15.661 -2.072 15.742 -2.161 c
+15.819 -2.242 16.01 -2.344 16.316 -2.469 c
+16.794 -2.657 17.124 -2.845 17.301 -3.028 c
+17.477 -3.205 17.565 -3.433 17.565 -3.705 c
+17.565 -4.057 17.44 -4.337 17.198 -4.542 c
+16.962 -4.748 16.646 -4.851 16.257 -4.851 c
+15.835 -4.851 15.497 -4.734 15.243 -4.499 c
+14.986 -4.256 14.861 -3.95 14.861 -3.587 c
+15.507 -3.587 l
+15.515 -3.815 15.584 -3.991 15.713 -4.116 c
+15.838 -4.233 16.022 -4.293 16.257 -4.293 c
+16.47 -4.293 16.632 -4.245 16.742 -4.146 c
+16.86 -4.05 16.918 -3.921 16.918 -3.763 c
+23.518 0.162 m
+23.518 -0.794 l
+24.122 -0.794 l
+24.122 -1.324 l
+23.518 -1.324 l
+23.518 -3.793 l
+23.518 -3.95 23.54 -4.068 23.592 -4.146 c
+23.651 -4.226 23.739 -4.263 23.856 -4.263 c
+23.945 -4.263 24.033 -4.248 24.122 -4.219 c
+24.122 -4.777 l
+23.974 -4.825 23.82 -4.851 23.665 -4.851 c
+23.408 -4.851 23.214 -4.759 23.077 -4.572 c
+22.938 -4.388 22.871 -4.127 22.871 -3.793 c
+22.871 -1.324 l
+22.269 -1.324 l
+22.269 -0.794 l
+22.871 -0.794 l
+22.871 0.162 l
+h
+24.679 -2.602 m
+24.679 -2.025 24.816 -1.569 25.091 -1.235 c
+25.375 -0.893 25.745 -0.721 26.208 -0.721 c
+26.668 -0.721 27.035 -0.89 27.311 -1.22 c
+27.594 -1.544 27.741 -1.992 27.752 -2.558 c
+27.752 -2.984 l
+27.752 -3.554 27.609 -4.009 27.326 -4.351 c
+27.05 -4.686 26.682 -4.851 26.223 -4.851 c
+25.76 -4.851 25.389 -4.69 25.106 -4.366 c
+24.83 -4.035 24.687 -3.595 24.679 -3.043 c
+h
+25.327 -2.984 m
+25.327 -3.389 25.404 -3.705 25.562 -3.94 c
+25.727 -4.175 25.947 -4.293 26.223 -4.293 c
+26.788 -4.293 27.083 -3.881 27.105 -3.057 c
+27.105 -2.602 l
+27.105 -2.201 27.021 -1.881 26.855 -1.646 c
+26.697 -1.404 26.48 -1.279 26.208 -1.279 c
+25.944 -1.279 25.727 -1.404 25.562 -1.646 c
+25.404 -1.881 25.327 -2.201 25.327 -2.602 c
+h
+33.701 0.162 m
+33.701 -0.794 l
+34.304 -0.794 l
+34.304 -1.324 l
+33.701 -1.324 l
+33.701 -3.793 l
+33.701 -3.95 33.724 -4.068 33.774 -4.146 c
+33.834 -4.226 33.922 -4.263 34.04 -4.263 c
+34.127 -4.263 34.216 -4.248 34.304 -4.219 c
+34.304 -4.777 l
+34.157 -4.825 34.002 -4.851 33.848 -4.851 c
+33.591 -4.851 33.396 -4.759 33.26 -4.572 c
+33.121 -4.388 33.055 -4.127 33.055 -3.793 c
+33.055 -1.324 l
+32.452 -1.324 l
+32.452 -0.794 l
+33.055 -0.794 l
+33.055 0.162 l
+h
+35.715 -1.206 m
+35.968 -0.882 36.288 -0.721 36.67 -0.721 c
+37.376 -0.721 37.732 -1.191 37.743 -2.132 c
+37.743 -4.777 l
+37.097 -4.777 l
+37.097 -2.161 l
+37.097 -1.849 37.042 -1.628 36.935 -1.5 c
+36.824 -1.374 36.67 -1.309 36.465 -1.309 c
+36.307 -1.309 36.159 -1.363 36.024 -1.47 c
+35.895 -1.58 35.792 -1.716 35.715 -1.881 c
+35.715 -4.777 l
+35.068 -4.777 l
+35.068 0.867 l
+35.715 0.867 l
+h
+39.405 -4.777 -0.647 3.983 re
+39.449 0.249 m
+39.449 0.139 39.419 0.048 39.361 -0.03 c
+39.301 -0.1 39.206 -0.133 39.081 -0.133 c
+38.964 -0.133 38.868 -0.1 38.802 -0.03 c
+38.743 0.048 38.713 0.139 38.713 0.249 c
+38.713 0.367 38.743 0.459 38.802 0.529 c
+38.868 0.606 38.964 0.646 39.081 0.646 c
+39.206 0.646 39.301 0.606 39.361 0.529 c
+39.419 0.448 39.449 0.357 39.449 0.249 c
+42.359 -3.763 m
+42.359 -3.616 42.304 -3.495 42.197 -3.396 c
+42.087 -3.3 41.881 -3.183 41.58 -3.043 c
+41.234 -2.896 40.992 -2.774 40.845 -2.675 c
+40.698 -2.569 40.587 -2.452 40.521 -2.323 c
+40.452 -2.198 40.419 -2.04 40.419 -1.852 c
+40.419 -1.529 40.536 -1.261 40.772 -1.044 c
+41.007 -0.831 41.308 -0.721 41.683 -0.721 c
+42.065 -0.721 42.374 -0.834 42.609 -1.058 c
+42.844 -1.286 42.962 -1.573 42.962 -1.926 c
+42.314 -1.926 l
+42.314 -1.75 42.256 -1.598 42.139 -1.47 c
+42.021 -1.345 41.867 -1.279 41.683 -1.279 c
+41.485 -1.279 41.333 -1.334 41.227 -1.441 c
+41.117 -1.54 41.065 -1.673 41.065 -1.837 c
+41.065 -1.966 41.102 -2.072 41.183 -2.161 c
+41.26 -2.242 41.451 -2.344 41.757 -2.469 c
+42.234 -2.657 42.565 -2.845 42.742 -3.028 c
+42.917 -3.205 43.006 -3.433 43.006 -3.705 c
+43.006 -4.057 42.881 -4.337 42.638 -4.542 c
+42.403 -4.748 42.087 -4.851 41.697 -4.851 c
+41.275 -4.851 40.937 -4.734 40.683 -4.499 c
+40.426 -4.256 40.301 -3.95 40.301 -3.587 c
+40.948 -3.587 l
+40.955 -3.815 41.025 -3.991 41.154 -4.116 c
+41.279 -4.233 41.462 -4.293 41.697 -4.293 c
+41.911 -4.293 42.073 -4.245 42.183 -4.146 c
+42.3 -4.05 42.359 -3.921 42.359 -3.763 c
+48.279 -4.777 m
+48.279 -1.324 l
+47.764 -1.324 l
+47.764 -0.794 l
+48.279 -0.794 l
+48.279 -0.426 l
+48.286 0.004 48.4 0.338 48.617 0.573 c
+48.841 0.816 49.154 0.941 49.558 0.941 c
+49.705 0.941 49.844 0.918 49.984 0.881 c
+50.131 0.841 50.282 0.786 50.44 0.72 c
+50.322 0.147 l
+50.087 0.272 49.844 0.338 49.601 0.338 c
+49.356 0.338 49.183 0.268 49.088 0.132 c
+48.988 0.004 48.94 -0.191 48.94 -0.456 c
+48.94 -0.794 l
+49.587 -0.794 l
+49.587 -1.324 l
+48.94 -1.324 l
+48.94 -4.777 l
+h
+50.748 -4.777 -0.646 3.983 re
+52.498 -4.777 -0.647 5.644 re
+54.937 -4.851 m
+54.438 -4.851 54.056 -4.704 53.791 -4.41 c
+53.526 -4.116 53.394 -3.682 53.394 -3.102 c
+53.394 -2.631 l
+53.394 -2.036 53.52 -1.569 53.776 -1.235 c
+54.041 -0.893 54.401 -0.721 54.864 -0.721 c
+55.324 -0.721 55.665 -0.875 55.893 -1.176 c
+56.128 -1.47 56.25 -1.933 56.261 -2.558 c
+56.261 -2.984 l
+54.041 -2.984 l
+54.041 -3.072 l
+54.041 -3.506 54.118 -3.818 54.276 -4.013 c
+54.442 -4.2 54.673 -4.293 54.967 -4.293 c
+55.162 -4.293 55.334 -4.26 55.481 -4.189 c
+55.629 -4.112 55.764 -3.994 55.893 -3.836 c
+56.231 -4.248 l
+55.945 -4.653 55.515 -4.851 54.937 -4.851 c
+54.864 -1.279 m
+54.588 -1.279 54.386 -1.374 54.262 -1.559 c
+54.133 -1.746 54.06 -2.036 54.041 -2.425 c
+55.614 -2.425 l
+55.614 -2.338 l
+55.592 -1.955 55.525 -1.687 55.408 -1.529 c
+55.29 -1.363 55.107 -1.279 54.864 -1.279 c
+64.738 -4.116 m
+64.62 -4.263 l
+64.286 -4.656 63.791 -4.851 63.136 -4.851 c
+62.555 -4.851 62.1 -4.659 61.769 -4.278 c
+61.445 -3.896 61.277 -3.352 61.269 -2.646 c
+61.269 -1.602 l
+61.269 -0.849 61.416 -0.287 61.711 0.087 c
+62.012 0.459 62.463 0.646 63.062 0.646 c
+63.57 0.646 63.967 0.503 64.253 0.22 c
+64.547 -0.067 64.709 -0.47 64.738 -1 c
+64.062 -1 l
+64.04 -0.669 63.948 -0.408 63.783 -0.221 c
+63.625 -0.026 63.39 0.073 63.078 0.073 c
+62.684 0.073 62.401 -0.055 62.224 -0.309 c
+62.048 -0.566 61.952 -0.967 61.946 -1.515 c
+61.946 -2.602 l
+61.946 -3.142 62.048 -3.558 62.254 -3.851 c
+62.459 -4.138 62.754 -4.278 63.136 -4.278 c
+63.496 -4.278 63.776 -4.189 63.974 -4.013 c
+64.062 -3.925 l
+64.062 -2.691 l
+63.092 -2.691 l
+63.092 -2.117 l
+64.738 -2.117 l
+h
+66.458 -4.777 -0.646 3.983 re
+66.502 0.249 m
+66.502 0.139 66.473 0.048 66.414 -0.03 c
+66.355 -0.1 66.26 -0.133 66.135 -0.133 c
+66.017 -0.133 65.921 -0.1 65.856 -0.03 c
+65.796 0.048 65.767 0.139 65.767 0.249 c
+65.767 0.367 65.796 0.459 65.856 0.529 c
+65.921 0.606 66.017 0.646 66.135 0.646 c
+66.26 0.646 66.355 0.606 66.414 0.529 c
+66.473 0.448 66.502 0.357 66.502 0.249 c
+68.325 0.162 m
+68.325 -0.794 l
+68.927 -0.794 l
+68.927 -1.324 l
+68.325 -1.324 l
+68.325 -3.793 l
+68.325 -3.95 68.347 -4.068 68.398 -4.146 c
+68.457 -4.226 68.545 -4.263 68.663 -4.263 c
+68.751 -4.263 68.84 -4.248 68.927 -4.219 c
+68.927 -4.777 l
+68.78 -4.825 68.626 -4.851 68.472 -4.851 c
+68.215 -4.851 68.02 -4.759 67.884 -4.572 c
+67.745 -4.388 67.678 -4.127 67.678 -3.793 c
+67.678 -1.324 l
+67.076 -1.324 l
+67.076 -0.794 l
+67.678 -0.794 l
+67.678 0.162 l
+h
+76.921 -3.631 m
+77.523 -0.794 l
+78.17 -0.794 l
+77.185 -4.777 l
+76.67 -4.777 l
+75.891 -1.926 l
+75.142 -4.777 l
+74.612 -4.777 l
+73.657 -0.794 l
+74.289 -0.794 l
+74.906 -3.558 l
+75.641 -0.794 l
+76.156 -0.794 l
+h
+79.551 -4.777 -0.646 3.983 re
+79.595 0.249 m
+79.595 0.139 79.566 0.048 79.508 -0.03 c
+79.448 -0.1 79.353 -0.133 79.228 -0.133 c
+79.111 -0.133 79.015 -0.1 78.949 -0.03 c
+78.889 0.048 78.86 0.139 78.86 0.249 c
+78.86 0.367 78.889 0.459 78.949 0.529 c
+79.015 0.606 79.111 0.646 79.228 0.646 c
+79.353 0.646 79.448 0.606 79.508 0.529 c
+79.566 0.448 79.595 0.357 79.595 0.249 c
+81.271 -4.777 -0.647 5.644 re
+82.991 -4.777 -0.647 5.644 re
+88.973 -4.777 -0.646 3.983 re
+89.017 0.249 m
+89.017 0.139 88.988 0.048 88.929 -0.03 c
+88.871 -0.1 88.775 -0.133 88.65 -0.133 c
+88.532 -0.133 88.437 -0.1 88.37 -0.03 c
+88.312 0.048 88.283 0.139 88.283 0.249 c
+88.283 0.367 88.312 0.459 88.37 0.529 c
+88.437 0.606 88.532 0.646 88.65 0.646 c
+88.775 0.646 88.871 0.606 88.929 0.529 c
+88.988 0.448 89.017 0.357 89.017 0.249 c
+89.856 -2.602 m
+89.856 -1.985 89.966 -1.521 90.193 -1.206 c
+90.417 -0.882 90.752 -0.721 91.192 -0.721 c
+91.593 -0.721 91.898 -0.897 92.104 -1.249 c
+92.148 -0.794 l
+92.736 -0.794 l
+92.736 -4.821 l
+92.736 -5.31 92.607 -5.689 92.354 -5.953 c
+92.096 -6.218 91.744 -6.35 91.296 -6.35 c
+91.097 -6.35 90.877 -6.299 90.635 -6.203 c
+90.388 -6.104 90.208 -5.983 90.091 -5.835 c
+90.355 -5.395 l
+90.62 -5.659 90.917 -5.792 91.252 -5.792 c
+91.788 -5.792 92.064 -5.498 92.075 -4.91 c
+92.075 -4.381 l
+91.869 -4.696 91.568 -4.851 91.178 -4.851 c
+90.766 -4.851 90.444 -4.7 90.208 -4.395 c
+89.98 -4.083 89.862 -3.631 89.856 -3.043 c
+h
+90.517 -2.984 m
+90.517 -3.425 90.579 -3.755 90.708 -3.969 c
+90.833 -4.175 91.049 -4.278 91.354 -4.278 c
+91.678 -4.278 91.917 -4.112 92.075 -3.778 c
+92.075 -1.794 l
+91.906 -1.47 91.667 -1.309 91.354 -1.309 c
+91.061 -1.309 90.843 -1.411 90.708 -1.617 c
+90.579 -1.823 90.517 -2.147 90.517 -2.587 c
+h
+94.309 -0.794 m
+94.324 -1.235 l
+94.577 -0.893 94.901 -0.721 95.294 -0.721 c
+96 -0.721 96.356 -1.191 96.367 -2.132 c
+96.367 -4.777 l
+95.72 -4.777 l
+95.72 -2.161 l
+95.72 -1.849 95.665 -1.628 95.558 -1.5 c
+95.448 -1.374 95.294 -1.309 95.088 -1.309 c
+94.93 -1.309 94.783 -1.363 94.647 -1.47 c
+94.519 -1.58 94.415 -1.716 94.338 -1.881 c
+94.338 -4.777 l
+93.692 -4.777 l
+93.692 -0.794 l
+h
+97.205 -2.602 m
+97.205 -2.025 97.341 -1.569 97.617 -1.235 c
+97.899 -0.893 98.271 -0.721 98.733 -0.721 c
+99.192 -0.721 99.56 -0.89 99.836 -1.22 c
+100.119 -1.544 100.266 -1.992 100.277 -2.558 c
+100.277 -2.984 l
+100.277 -3.554 100.133 -4.009 99.851 -4.351 c
+99.575 -4.686 99.208 -4.851 98.748 -4.851 c
+98.285 -4.851 97.914 -4.69 97.631 -4.366 c
+97.355 -4.035 97.212 -3.595 97.205 -3.043 c
+h
+97.852 -2.984 m
+97.852 -3.389 97.929 -3.705 98.087 -3.94 c
+98.252 -4.175 98.473 -4.293 98.748 -4.293 c
+99.314 -4.293 99.608 -3.881 99.63 -3.057 c
+99.63 -2.602 l
+99.63 -2.201 99.545 -1.881 99.381 -1.646 c
+99.223 -1.404 99.005 -1.279 98.733 -1.279 c
+98.469 -1.279 98.252 -1.404 98.087 -1.646 c
+97.929 -1.881 97.852 -2.201 97.852 -2.602 c
+h
+102.761 -1.411 m
+102.673 -1.393 102.574 -1.382 102.467 -1.382 c
+102.132 -1.382 101.897 -1.565 101.762 -1.926 c
+101.762 -4.777 l
+101.114 -4.777 l
+101.114 -0.794 l
+101.747 -0.794 l
+101.762 -1.206 l
+101.938 -0.882 102.18 -0.721 102.496 -0.721 c
+102.603 -0.721 102.691 -0.742 102.761 -0.779 c
+h
+104.76 -4.851 m
+104.26 -4.851 103.878 -4.704 103.614 -4.41 c
+103.349 -4.116 103.217 -3.682 103.217 -3.102 c
+103.217 -2.631 l
+103.217 -2.036 103.342 -1.569 103.599 -1.235 c
+103.863 -0.893 104.224 -0.721 104.686 -0.721 c
+105.145 -0.721 105.488 -0.875 105.716 -1.176 c
+105.951 -1.47 106.072 -1.933 106.083 -2.558 c
+106.083 -2.984 l
+103.863 -2.984 l
+103.863 -3.072 l
+103.863 -3.506 103.94 -3.818 104.098 -4.013 c
+104.264 -4.2 104.495 -4.293 104.79 -4.293 c
+104.985 -4.293 105.157 -4.26 105.304 -4.189 c
+105.451 -4.112 105.587 -3.994 105.716 -3.836 c
+106.053 -4.248 l
+105.767 -4.653 105.337 -4.851 104.76 -4.851 c
+104.686 -1.279 m
+104.411 -1.279 104.209 -1.374 104.084 -1.559 c
+103.955 -1.746 103.882 -2.036 103.863 -2.425 c
+105.436 -2.425 l
+105.436 -2.338 l
+105.415 -1.955 105.348 -1.687 105.23 -1.529 c
+105.113 -1.363 104.929 -1.279 104.686 -1.279 c
+113.164 -4.777 m
+113.124 -4.69 113.099 -4.542 113.091 -4.337 c
+112.856 -4.682 112.561 -4.851 112.209 -4.851 c
+111.845 -4.851 111.562 -4.755 111.356 -4.557 c
+111.158 -4.351 111.063 -4.065 111.063 -3.69 c
+111.063 -3.289 111.198 -2.97 111.474 -2.735 c
+111.746 -2.492 112.121 -2.367 112.591 -2.367 c
+113.076 -2.367 l
+113.076 -1.941 l
+113.076 -1.706 113.021 -1.54 112.914 -1.441 c
+112.804 -1.334 112.642 -1.279 112.43 -1.279 c
+112.231 -1.279 112.069 -1.338 111.944 -1.455 c
+111.827 -1.573 111.768 -1.72 111.768 -1.897 c
+111.121 -1.897 l
+111.121 -1.702 111.18 -1.511 111.298 -1.324 c
+111.422 -1.139 111.584 -0.992 111.782 -0.882 c
+111.988 -0.775 112.216 -0.721 112.474 -0.721 c
+112.874 -0.721 113.179 -0.823 113.385 -1.029 c
+113.598 -1.235 113.712 -1.529 113.723 -1.912 c
+113.723 -3.925 l
+113.723 -4.23 113.76 -4.495 113.841 -4.719 c
+113.841 -4.777 l
+h
+112.297 -4.263 m
+112.463 -4.263 112.613 -4.219 112.752 -4.131 c
+112.9 -4.042 113.006 -3.932 113.076 -3.793 c
+113.076 -2.852 l
+112.709 -2.852 l
+112.393 -2.852 112.15 -2.922 111.973 -3.057 c
+111.797 -3.186 111.709 -3.373 111.709 -3.616 c
+111.709 -3.844 111.753 -4.009 111.842 -4.116 c
+111.929 -4.215 112.081 -4.263 112.297 -4.263 c
+115.428 -4.777 -0.646 5.644 re
+117.147 -4.777 -0.646 5.644 re
+122.597 -4.777 m
+122.597 -1.324 l
+122.083 -1.324 l
+122.083 -0.794 l
+122.597 -0.794 l
+122.597 -0.426 l
+122.605 0.004 122.719 0.338 122.936 0.573 c
+123.16 0.816 123.472 0.941 123.877 0.941 c
+124.023 0.941 124.163 0.918 124.303 0.881 c
+124.449 0.841 124.6 0.786 124.758 0.72 c
+124.64 0.147 l
+124.405 0.272 124.163 0.338 123.92 0.338 c
+123.674 0.338 123.501 0.268 123.406 0.132 c
+123.306 0.004 123.258 -0.191 123.258 -0.456 c
+123.258 -0.794 l
+123.906 -0.794 l
+123.906 -1.324 l
+123.258 -1.324 l
+123.258 -4.777 l
+h
+125.067 -4.777 -0.646 3.983 re
+126.816 -4.777 -0.647 5.644 re
+129.256 -4.851 m
+128.756 -4.851 128.374 -4.704 128.11 -4.41 c
+127.845 -4.116 127.713 -3.682 127.713 -3.102 c
+127.713 -2.631 l
+127.713 -2.036 127.838 -1.569 128.095 -1.235 c
+128.359 -0.893 128.719 -0.721 129.182 -0.721 c
+129.642 -0.721 129.984 -0.875 130.212 -1.176 c
+130.447 -1.47 130.568 -1.933 130.579 -2.558 c
+130.579 -2.984 l
+128.359 -2.984 l
+128.359 -3.072 l
+128.359 -3.506 128.436 -3.818 128.594 -4.013 c
+128.76 -4.2 128.991 -4.293 129.286 -4.293 c
+129.481 -4.293 129.653 -4.26 129.799 -4.189 c
+129.947 -4.112 130.083 -3.994 130.212 -3.836 c
+130.549 -4.248 l
+130.263 -4.653 129.833 -4.851 129.256 -4.851 c
+129.182 -1.279 m
+128.907 -1.279 128.704 -1.374 128.58 -1.559 c
+128.451 -1.746 128.378 -2.036 128.359 -2.425 c
+129.932 -2.425 l
+129.932 -2.338 l
+129.91 -1.955 129.844 -1.687 129.726 -1.529 c
+129.608 -1.363 129.425 -1.279 129.182 -1.279 c
+133.298 -3.763 m
+133.298 -3.616 133.244 -3.495 133.136 -3.396 c
+133.026 -3.3 132.82 -3.183 132.519 -3.043 c
+132.174 -2.896 131.931 -2.774 131.784 -2.675 c
+131.638 -2.569 131.527 -2.452 131.461 -2.323 c
+131.391 -2.198 131.358 -2.04 131.358 -1.852 c
+131.358 -1.529 131.476 -1.261 131.711 -1.044 c
+131.946 -0.831 132.247 -0.721 132.622 -0.721 c
+133.005 -0.721 133.313 -0.834 133.548 -1.058 c
+133.783 -1.286 133.901 -1.573 133.901 -1.926 c
+133.254 -1.926 l
+133.254 -1.75 133.196 -1.598 133.078 -1.47 c
+132.96 -1.345 132.806 -1.279 132.622 -1.279 c
+132.424 -1.279 132.273 -1.334 132.166 -1.441 c
+132.056 -1.54 132.005 -1.673 132.005 -1.837 c
+132.005 -1.966 132.041 -2.072 132.122 -2.161 c
+132.199 -2.242 132.39 -2.344 132.696 -2.469 c
+133.173 -2.657 133.504 -2.845 133.681 -3.028 c
+133.857 -3.205 133.945 -3.433 133.945 -3.705 c
+133.945 -4.057 133.82 -4.337 133.577 -4.542 c
+133.342 -4.748 133.026 -4.851 132.637 -4.851 c
+132.214 -4.851 131.877 -4.734 131.623 -4.499 c
+131.366 -4.256 131.241 -3.95 131.241 -3.587 c
+131.887 -3.587 l
+131.894 -3.815 131.964 -3.991 132.093 -4.116 c
+132.218 -4.233 132.402 -4.293 132.637 -4.293 c
+132.85 -4.293 133.012 -4.245 133.122 -4.146 c
+133.24 -4.05 133.298 -3.921 133.298 -3.763 c
+139.748 -4.777 -0.647 3.983 re
+139.792 0.249 m
+139.792 0.139 139.762 0.048 139.704 -0.03 c
+139.644 -0.1 139.549 -0.133 139.424 -0.133 c
+139.307 -0.133 139.211 -0.1 139.145 -0.03 c
+139.086 0.048 139.056 0.139 139.056 0.249 c
+139.056 0.367 139.086 0.459 139.145 0.529 c
+139.211 0.606 139.307 0.646 139.424 0.646 c
+139.549 0.646 139.644 0.606 139.704 0.529 c
+139.762 0.448 139.792 0.357 139.792 0.249 c
+141.379 -0.794 m
+141.394 -1.235 l
+141.647 -0.893 141.971 -0.721 142.364 -0.721 c
+143.07 -0.721 143.426 -1.191 143.437 -2.132 c
+143.437 -4.777 l
+142.79 -4.777 l
+142.79 -2.161 l
+142.79 -1.849 142.735 -1.628 142.628 -1.5 c
+142.518 -1.374 142.364 -1.309 142.158 -1.309 c
+142 -1.309 141.853 -1.363 141.717 -1.47 c
+141.589 -1.58 141.485 -1.716 141.408 -1.881 c
+141.408 -4.777 l
+140.762 -4.777 l
+140.762 -0.794 l
+h
+f
+Q
+190.482 115.427 -1.043 5.644 re
+191.172 117.544 m
+191.172 118.15 191.312 118.624 191.599 118.969 c
+191.882 119.311 192.275 119.484 192.775 119.484 c
+193.282 119.484 193.678 119.311 193.965 118.969 c
+194.249 118.624 194.392 118.15 194.392 117.544 c
+194.392 117.278 l
+194.392 116.68 194.249 116.21 193.965 115.867 c
+193.678 115.522 193.282 115.353 192.775 115.353 c
+192.264 115.353 191.867 115.522 191.584 115.867 c
+191.309 116.21 191.172 116.684 191.172 117.293 c
+h
+192.217 117.278 m
+192.217 116.573 192.4 116.22 192.775 116.22 c
+193.128 116.22 193.319 116.515 193.348 117.102 c
+193.348 117.544 l
+193.348 117.903 193.296 118.175 193.201 118.352 c
+193.102 118.528 192.959 118.616 192.775 118.616 c
+192.598 118.616 192.459 118.528 192.363 118.352 c
+192.264 118.175 192.217 117.903 192.217 117.544 c
+h
+194.906 117.544 m
+194.906 118.19 195.024 118.675 195.259 118.998 c
+195.494 119.322 195.825 119.484 196.259 119.484 c
+196.612 119.484 196.884 119.34 197.082 119.057 c
+197.126 119.41 l
+198.067 119.41 l
+198.067 115.427 l
+198.067 114.92 197.923 114.53 197.64 114.265 c
+197.354 113.993 196.949 113.854 196.421 113.854 c
+196.192 113.854 195.957 113.898 195.715 113.986 c
+195.48 114.074 195.303 114.188 195.185 114.324 c
+195.538 115.044 l
+195.634 114.938 195.762 114.853 195.92 114.795 c
+196.074 114.728 196.222 114.691 196.361 114.691 c
+196.597 114.691 196.762 114.751 196.861 114.868 c
+196.968 114.978 197.023 115.155 197.023 115.397 c
+197.023 115.75 l
+196.824 115.485 196.567 115.353 196.244 115.353 c
+195.821 115.353 195.494 115.515 195.259 115.838 c
+195.031 116.169 194.914 116.64 194.906 117.249 c
+h
+195.95 117.278 m
+195.95 116.904 195.997 116.636 196.097 116.47 c
+196.192 116.301 196.346 116.22 196.552 116.22 c
+196.766 116.22 196.924 116.297 197.023 116.455 c
+197.023 118.352 l
+196.913 118.517 196.758 118.602 196.552 118.602 c
+196.346 118.602 196.192 118.517 196.097 118.352 c
+195.997 118.182 195.95 117.914 195.95 117.544 c
+h
+200.595 116.499 m
+200.595 116.588 200.551 116.665 200.462 116.735 c
+200.375 116.812 200.186 116.915 199.904 117.043 c
+199.471 117.22 199.172 117.4 199.008 117.587 c
+198.85 117.771 198.773 118.003 198.773 118.278 c
+198.773 118.62 198.893 118.903 199.139 119.131 c
+199.393 119.366 199.731 119.484 200.154 119.484 c
+200.583 119.484 200.932 119.37 201.198 119.146 c
+201.462 118.918 201.595 118.616 201.595 118.234 c
+200.551 118.234 l
+200.551 118.558 200.411 118.72 200.139 118.72 c
+200.028 118.72 199.941 118.683 199.874 118.616 c
+199.805 118.547 199.772 118.448 199.772 118.323 c
+199.772 118.234 199.808 118.153 199.889 118.087 c
+199.966 118.028 200.147 117.933 200.433 117.808 c
+200.863 117.65 201.161 117.473 201.329 117.278 c
+201.506 117.091 201.595 116.842 201.595 116.529 c
+201.595 116.176 201.462 115.89 201.198 115.676 c
+200.932 115.46 200.583 115.353 200.154 115.353 c
+199.86 115.353 199.598 115.408 199.375 115.515 c
+199.147 115.632 198.971 115.794 198.846 116 c
+198.728 116.206 198.669 116.426 198.669 116.661 c
+199.654 116.661 l
+199.654 116.474 199.691 116.338 199.772 116.25 c
+199.86 116.162 199.992 116.118 200.169 116.118 c
+200.452 116.118 200.595 116.243 200.595 116.499 c
+f
+q 1 0 0 1 206.4894 117.602 cm
+0 0 m
+0 0.607 0.11 1.073 0.338 1.396 c
+0.573 1.72 0.9 1.881 1.323 1.881 c
+1.705 1.881 2.003 1.723 2.219 1.411 c
+2.219 3.469 l
+2.866 3.469 l
+2.866 -2.175 l
+2.278 -2.175 l
+2.234 -1.749 l
+2.028 -2.084 1.723 -2.249 1.323 -2.249 c
+0.911 -2.249 0.588 -2.094 0.353 -1.779 c
+0.118 -1.455 0 -0.999 0 -0.411 c
+h
+0.646 -0.382 m
+0.646 -0.823 0.709 -1.153 0.837 -1.367 c
+0.974 -1.573 1.194 -1.675 1.499 -1.675 c
+1.822 -1.675 2.061 -1.514 2.219 -1.191 c
+2.219 0.823 l
+2.05 1.135 1.811 1.294 1.499 1.294 c
+1.194 1.294 0.974 1.191 0.837 0.985 c
+0.709 0.779 0.646 0.455 0.646 0.015 c
+h
+4.571 -2.175 -0.646 3.983 re
+4.615 2.851 m
+4.615 2.741 4.586 2.65 4.527 2.572 c
+4.469 2.502 4.373 2.469 4.247 2.469 c
+4.13 2.469 4.035 2.502 3.968 2.572 c
+3.91 2.65 3.881 2.741 3.881 2.851 c
+3.881 2.969 3.91 3.061 3.968 3.131 c
+4.035 3.208 4.13 3.248 4.247 3.248 c
+4.373 3.248 4.469 3.208 4.527 3.131 c
+4.586 3.05 4.615 2.959 4.615 2.851 c
+7.231 1.191 m
+7.143 1.209 7.044 1.22 6.938 1.22 c
+6.603 1.22 6.368 1.037 6.232 0.676 c
+6.232 -2.175 l
+5.585 -2.175 l
+5.585 1.808 l
+6.217 1.808 l
+6.232 1.396 l
+6.408 1.72 6.651 1.881 6.967 1.881 c
+7.073 1.881 7.162 1.86 7.231 1.823 c
+h
+9.231 -2.249 m
+8.731 -2.249 8.349 -2.102 8.084 -1.808 c
+7.819 -1.514 7.688 -1.08 7.688 -0.5 c
+7.688 -0.029 l
+7.688 0.566 7.812 1.033 8.07 1.367 c
+8.334 1.709 8.694 1.881 9.157 1.881 c
+9.616 1.881 9.959 1.727 10.186 1.426 c
+10.422 1.132 10.543 0.669 10.553 0.044 c
+10.553 -0.382 l
+8.334 -0.382 l
+8.334 -0.47 l
+8.334 -0.904 8.411 -1.216 8.569 -1.411 c
+8.735 -1.598 8.966 -1.691 9.26 -1.691 c
+9.454 -1.691 9.628 -1.658 9.774 -1.587 c
+9.922 -1.51 10.057 -1.392 10.186 -1.234 c
+10.524 -1.646 l
+10.237 -2.051 9.807 -2.249 9.231 -2.249 c
+9.157 1.323 m
+8.882 1.323 8.679 1.228 8.554 1.043 c
+8.426 0.856 8.353 0.566 8.334 0.177 c
+9.907 0.177 l
+9.907 0.264 l
+9.885 0.647 9.819 0.915 9.701 1.073 c
+9.583 1.239 9.4 1.323 9.157 1.323 c
+12.714 -1.691 m
+12.928 -1.691 13.1 -1.627 13.229 -1.5 c
+13.365 -1.363 13.438 -1.172 13.45 -0.926 c
+14.067 -0.926 l
+14.044 -1.309 13.909 -1.627 13.655 -1.881 c
+13.398 -2.128 13.086 -2.249 12.714 -2.249 c
+12.222 -2.249 11.847 -2.098 11.582 -1.793 c
+11.326 -1.481 11.2 -1.014 11.2 -0.397 c
+11.2 0.044 l
+11.2 0.64 11.326 1.095 11.582 1.411 c
+11.847 1.723 12.222 1.881 12.714 1.881 c
+13.115 1.881 13.435 1.749 13.67 1.484 c
+13.913 1.228 14.044 0.882 14.067 0.441 c
+13.45 0.441 l
+13.427 0.735 13.354 0.956 13.229 1.103 c
+13.111 1.249 12.939 1.323 12.714 1.323 c
+12.421 1.323 12.203 1.224 12.068 1.029 c
+11.928 0.842 11.854 0.533 11.847 0.103 c
+11.847 -0.411 l
+11.847 -0.881 11.914 -1.216 12.053 -1.411 c
+12.2 -1.598 12.421 -1.691 12.714 -1.691 c
+15.669 2.764 m
+15.669 1.808 l
+16.272 1.808 l
+16.272 1.278 l
+15.669 1.278 l
+15.669 -1.191 l
+15.669 -1.348 15.691 -1.466 15.742 -1.544 c
+15.802 -1.624 15.889 -1.661 16.007 -1.661 c
+16.095 -1.661 16.184 -1.646 16.272 -1.617 c
+16.272 -2.175 l
+16.124 -2.223 15.97 -2.249 15.816 -2.249 c
+15.559 -2.249 15.364 -2.157 15.228 -1.97 c
+15.089 -1.786 15.022 -1.525 15.022 -1.191 c
+15.022 1.278 l
+14.42 1.278 l
+14.42 1.808 l
+15.022 1.808 l
+15.022 2.764 l
+h
+16.83 0 m
+16.83 0.577 16.966 1.033 17.242 1.367 c
+17.525 1.709 17.896 1.881 18.359 1.881 c
+18.819 1.881 19.185 1.712 19.461 1.382 c
+19.744 1.058 19.891 0.611 19.902 0.044 c
+19.902 -0.382 l
+19.902 -0.952 19.759 -1.407 19.476 -1.749 c
+19.2 -2.084 18.833 -2.249 18.374 -2.249 c
+17.911 -2.249 17.539 -2.088 17.256 -1.764 c
+16.98 -1.433 16.837 -0.992 16.83 -0.441 c
+h
+17.477 -0.382 m
+17.477 -0.786 17.554 -1.103 17.712 -1.338 c
+17.878 -1.573 18.098 -1.691 18.374 -1.691 c
+18.939 -1.691 19.233 -1.278 19.255 -0.455 c
+19.255 0 l
+19.255 0.401 19.171 0.721 19.006 0.956 c
+18.848 1.199 18.63 1.323 18.359 1.323 c
+18.094 1.323 17.878 1.199 17.712 0.956 c
+17.554 0.721 17.477 0.401 17.477 0 c
+h
+22.387 1.191 m
+22.298 1.209 22.199 1.22 22.092 1.22 c
+21.758 1.22 21.523 1.037 21.387 0.676 c
+21.387 -2.175 l
+20.74 -2.175 l
+20.74 1.808 l
+21.372 1.808 l
+21.387 1.396 l
+21.564 1.72 21.805 1.881 22.122 1.881 c
+22.229 1.881 22.316 1.86 22.387 1.823 c
+h
+24.194 -1.087 m
+24.915 1.808 l
+25.605 1.808 l
+24.312 -2.734 l
+24.213 -3.075 24.07 -3.337 23.885 -3.513 c
+23.709 -3.69 23.507 -3.778 23.283 -3.778 c
+23.195 -3.778 23.081 -3.755 22.945 -3.719 c
+22.945 -3.175 l
+23.092 -3.19 l
+23.276 -3.19 23.423 -3.146 23.533 -3.057 c
+23.64 -2.969 23.727 -2.811 23.798 -2.587 c
+23.915 -2.146 l
+22.754 1.808 l
+23.459 1.808 l
+h
+30.482 0 m
+30.482 0.636 30.57 1.239 30.746 1.808 c
+30.923 2.374 31.166 2.87 31.482 3.293 c
+31.677 3.557 31.864 3.748 32.04 3.865 c
+32.172 3.41 l
+31.878 3.135 31.636 2.712 31.452 2.146 c
+31.265 1.577 31.162 0.945 31.143 0.25 c
+31.143 -0.044 l
+31.143 -0.908 31.261 -1.672 31.496 -2.337 c
+31.679 -2.837 31.908 -3.219 32.172 -3.484 c
+32.04 -3.91 l
+31.812 -3.752 31.588 -3.502 31.364 -3.16 c
+30.776 -2.278 30.482 -1.228 30.482 0 c
+34.289 -2.249 m
+33.789 -2.249 33.407 -2.102 33.142 -1.808 c
+32.878 -1.514 32.745 -1.08 32.745 -0.5 c
+32.745 -0.029 l
+32.745 0.566 32.87 1.033 33.128 1.367 c
+33.392 1.709 33.753 1.881 34.216 1.881 c
+34.675 1.881 35.016 1.727 35.245 1.426 c
+35.48 1.132 35.6 0.669 35.612 0.044 c
+35.612 -0.382 l
+33.392 -0.382 l
+33.392 -0.47 l
+33.392 -0.904 33.47 -1.216 33.628 -1.411 c
+33.793 -1.598 34.025 -1.691 34.318 -1.691 c
+34.513 -1.691 34.686 -1.658 34.833 -1.587 c
+34.98 -1.51 35.116 -1.392 35.245 -1.234 c
+35.583 -1.646 l
+35.296 -2.051 34.866 -2.249 34.289 -2.249 c
+34.216 1.323 m
+33.94 1.323 33.738 1.228 33.613 1.043 c
+33.484 0.856 33.41 0.566 33.392 0.177 c
+34.965 0.177 l
+34.965 0.264 l
+34.943 0.647 34.877 0.915 34.759 1.073 c
+34.642 1.239 34.458 1.323 34.216 1.323 c
+37.537 0.353 m
+38.228 1.808 l
+38.978 1.808 l
+37.89 -0.162 l
+39.008 -2.175 l
+38.258 -2.175 l
+37.552 -0.691 l
+36.847 -2.175 l
+36.097 -2.175 l
+37.2 -0.162 l
+36.126 1.808 l
+36.876 1.808 l
+h
+41.007 -1.691 m
+41.219 -1.691 41.393 -1.627 41.52 -1.5 c
+41.657 -1.363 41.73 -1.172 41.742 -0.926 c
+42.359 -0.926 l
+42.337 -1.309 42.201 -1.627 41.948 -1.881 c
+41.69 -2.128 41.377 -2.249 41.007 -2.249 c
+40.514 -2.249 40.139 -2.098 39.874 -1.793 c
+39.617 -1.481 39.492 -1.014 39.492 -0.397 c
+39.492 0.044 l
+39.492 0.64 39.617 1.095 39.874 1.411 c
+40.139 1.723 40.514 1.881 41.007 1.881 c
+41.407 1.881 41.727 1.749 41.962 1.484 c
+42.204 1.228 42.337 0.882 42.359 0.441 c
+41.742 0.441 l
+41.719 0.735 41.646 0.956 41.52 1.103 c
+41.403 1.249 41.231 1.323 41.007 1.323 c
+40.712 1.323 40.496 1.224 40.36 1.029 c
+40.22 0.842 40.146 0.533 40.139 0.103 c
+40.139 -0.411 l
+40.139 -0.881 40.205 -1.216 40.345 -1.411 c
+40.492 -1.598 40.712 -1.691 41.007 -1.691 c
+43.814 -2.175 -0.647 5.644 re
+46.856 -1.822 m
+46.64 -2.109 46.328 -2.249 45.916 -2.249 c
+45.552 -2.249 45.277 -2.128 45.092 -1.881 c
+44.917 -1.627 44.821 -1.264 44.813 -0.794 c
+44.813 1.808 l
+45.46 1.808 l
+45.46 -0.735 l
+45.46 -1.363 45.644 -1.675 46.019 -1.675 c
+46.419 -1.675 46.695 -1.5 46.842 -1.147 c
+46.842 1.808 l
+47.489 1.808 l
+47.489 -2.175 l
+46.871 -2.175 l
+h
+48.341 0 m
+48.341 0.607 48.452 1.073 48.68 1.396 c
+48.915 1.72 49.241 1.881 49.664 1.881 c
+50.046 1.881 50.344 1.723 50.561 1.411 c
+50.561 3.469 l
+51.207 3.469 l
+51.207 -2.175 l
+50.619 -2.175 l
+50.575 -1.749 l
+50.37 -2.084 50.064 -2.249 49.664 -2.249 c
+49.252 -2.249 48.929 -2.094 48.694 -1.779 c
+48.458 -1.455 48.341 -0.999 48.341 -0.411 c
+h
+48.988 -0.382 m
+48.988 -0.823 49.05 -1.153 49.179 -1.367 c
+49.315 -1.573 49.536 -1.675 49.84 -1.675 c
+50.164 -1.675 50.403 -1.514 50.561 -1.191 c
+50.561 0.823 l
+50.392 1.135 50.153 1.294 49.84 1.294 c
+49.536 1.294 49.315 1.191 49.179 0.985 c
+49.05 0.779 48.988 0.455 48.988 0.015 c
+h
+52.913 -2.175 -0.647 3.983 re
+52.957 2.851 m
+52.957 2.741 52.927 2.65 52.869 2.572 c
+52.809 2.502 52.714 2.469 52.589 2.469 c
+52.472 2.469 52.376 2.502 52.31 2.572 c
+52.251 2.65 52.221 2.741 52.221 2.851 c
+52.221 2.969 52.251 3.061 52.31 3.131 c
+52.376 3.208 52.472 3.248 52.589 3.248 c
+52.714 3.248 52.809 3.208 52.869 3.131 c
+52.927 3.05 52.957 2.959 52.957 2.851 c
+54.544 1.808 m
+54.559 1.367 l
+54.812 1.709 55.136 1.881 55.529 1.881 c
+56.235 1.881 56.591 1.411 56.602 0.47 c
+56.602 -2.175 l
+55.955 -2.175 l
+55.955 0.441 l
+55.955 0.754 55.901 0.974 55.793 1.103 c
+55.683 1.228 55.529 1.294 55.323 1.294 c
+55.165 1.294 55.018 1.239 54.883 1.132 c
+54.754 1.022 54.65 0.886 54.573 0.721 c
+54.573 -2.175 l
+53.927 -2.175 l
+53.927 1.808 l
+h
+57.44 0 m
+57.44 0.617 57.55 1.081 57.778 1.396 c
+58.002 1.72 58.336 1.881 58.777 1.881 c
+59.178 1.881 59.483 1.706 59.689 1.353 c
+59.733 1.808 l
+60.321 1.808 l
+60.321 -2.219 l
+60.321 -2.708 60.192 -3.087 59.939 -3.351 c
+59.681 -3.616 59.329 -3.748 58.881 -3.748 c
+58.682 -3.748 58.461 -3.697 58.219 -3.601 c
+57.973 -3.502 57.792 -3.381 57.675 -3.233 c
+57.94 -2.793 l
+58.204 -3.057 58.502 -3.19 58.837 -3.19 c
+59.373 -3.19 59.649 -2.896 59.66 -2.308 c
+59.66 -1.779 l
+59.454 -2.094 59.153 -2.249 58.763 -2.249 c
+58.351 -2.249 58.028 -2.098 57.792 -1.793 c
+57.565 -1.481 57.447 -1.029 57.44 -0.441 c
+h
+58.101 -0.382 m
+58.101 -0.823 58.164 -1.153 58.293 -1.367 c
+58.417 -1.573 58.634 -1.675 58.939 -1.675 c
+59.263 -1.675 59.502 -1.51 59.66 -1.176 c
+59.66 0.808 l
+59.49 1.132 59.252 1.294 58.939 1.294 c
+58.646 1.294 58.428 1.191 58.293 0.985 c
+58.164 0.779 58.101 0.455 58.101 0.015 c
+h
+f
+Q
+q 1 0 0 1 38.464 110.9585 cm
+0 0 m
+0 -0.956 l
+0.603 -0.956 l
+0.603 -1.485 l
+0 -1.485 l
+0 -3.955 l
+0 -4.112 0.023 -4.23 0.073 -4.308 c
+0.133 -4.388 0.221 -4.425 0.339 -4.425 c
+0.426 -4.425 0.515 -4.41 0.603 -4.381 c
+0.603 -4.939 l
+0.456 -4.987 0.302 -5.013 0.148 -5.013 c
+-0.11 -5.013 -0.305 -4.921 -0.44 -4.734 c
+-0.58 -4.549 -0.646 -4.289 -0.646 -3.955 c
+-0.646 -1.485 l
+-1.249 -1.485 l
+-1.249 -0.956 l
+-0.646 -0.956 l
+-0.646 0 l
+h
+2.014 -1.368 m
+2.267 -1.044 2.587 -0.882 2.97 -0.882 c
+3.675 -0.882 4.031 -1.353 4.042 -2.294 c
+4.042 -4.939 l
+3.396 -4.939 l
+3.396 -2.323 l
+3.396 -2.01 3.341 -1.79 3.234 -1.661 c
+3.124 -1.536 2.97 -1.47 2.764 -1.47 c
+2.606 -1.47 2.459 -1.525 2.323 -1.632 c
+2.194 -1.742 2.091 -1.878 2.014 -2.043 c
+2.014 -4.939 l
+1.367 -4.939 l
+1.367 0.706 l
+2.014 0.706 l
+h
+6.423 -5.013 m
+5.924 -5.013 5.542 -4.866 5.278 -4.572 c
+5.012 -4.278 4.881 -3.844 4.881 -3.263 c
+4.881 -2.793 l
+4.881 -2.198 5.006 -1.731 5.262 -1.397 c
+5.527 -1.055 5.887 -0.882 6.35 -0.882 c
+6.81 -0.882 7.152 -1.037 7.379 -1.338 c
+7.614 -1.632 7.736 -2.095 7.747 -2.72 c
+7.747 -3.146 l
+5.527 -3.146 l
+5.527 -3.234 l
+5.527 -3.668 5.604 -3.98 5.762 -4.175 c
+5.928 -4.362 6.159 -4.454 6.453 -4.454 c
+6.648 -4.454 6.82 -4.421 6.968 -4.351 c
+7.115 -4.274 7.25 -4.156 7.379 -3.998 c
+7.717 -4.41 l
+7.431 -4.815 7.001 -5.013 6.423 -5.013 c
+6.35 -1.441 m
+6.074 -1.441 5.872 -1.536 5.748 -1.721 c
+5.619 -1.908 5.546 -2.198 5.527 -2.587 c
+7.1 -2.587 l
+7.1 -2.5 l
+7.078 -2.117 7.011 -1.849 6.894 -1.691 c
+6.776 -1.525 6.593 -1.441 6.35 -1.441 c
+f
+Q
+q 1 0 0 1 50.5656 106.5483 cm
+0 0 m
+0 0.166 0.051 0.301 0.161 0.412 c
+0.268 0.518 0.415 0.573 0.602 0.573 c
+0.768 0.573 0.911 0.518 1.028 0.412 c
+1.146 0.301 1.205 0.166 1.205 0 c
+1.205 -0.169 1.146 -0.305 1.028 -0.411 c
+0.911 -0.522 0.768 -0.573 0.602 -0.573 c
+0.426 -0.573 0.278 -0.522 0.161 -0.411 c
+0.051 -0.305 0 -0.169 0 0 c
+1.969 1.588 m
+1.969 2.234 2.087 2.72 2.322 3.042 c
+2.557 3.366 2.888 3.528 3.322 3.528 c
+3.675 3.528 3.946 3.385 4.145 3.102 c
+4.189 3.454 l
+5.13 3.454 l
+5.13 -0.529 l
+5.13 -1.036 4.986 -1.426 4.704 -1.691 c
+4.417 -1.962 4.012 -2.102 3.484 -2.102 c
+3.256 -2.102 3.021 -2.057 2.778 -1.97 c
+2.543 -1.881 2.366 -1.768 2.248 -1.631 c
+2.601 -0.912 l
+2.697 -1.018 2.826 -1.103 2.983 -1.161 c
+3.138 -1.228 3.285 -1.264 3.424 -1.264 c
+3.659 -1.264 3.825 -1.205 3.924 -1.087 c
+4.031 -0.977 4.086 -0.801 4.086 -0.559 c
+4.086 -0.206 l
+3.887 -0.47 3.63 -0.603 3.307 -0.603 c
+2.884 -0.603 2.557 -0.441 2.322 -0.118 c
+2.094 0.214 1.977 0.684 1.969 1.294 c
+h
+3.013 1.323 m
+3.013 0.948 3.061 0.68 3.16 0.515 c
+3.256 0.345 3.41 0.264 3.615 0.264 c
+3.829 0.264 3.987 0.341 4.086 0.5 c
+4.086 2.396 l
+3.976 2.562 3.821 2.646 3.615 2.646 c
+3.41 2.646 3.256 2.562 3.16 2.396 c
+3.061 2.227 3.013 1.959 3.013 1.588 c
+h
+6.981 -0.529 -1.043 3.983 re
+5.894 4.484 m
+5.894 4.638 5.942 4.767 6.04 4.866 c
+6.148 4.972 6.283 5.027 6.453 5.027 c
+6.628 5.027 6.765 4.972 6.864 4.866 c
+6.971 4.767 7.025 4.638 7.025 4.484 c
+7.025 4.314 6.971 4.179 6.864 4.072 c
+6.765 3.973 6.628 3.925 6.453 3.925 c
+6.283 3.925 6.148 3.973 6.04 4.072 c
+5.942 4.179 5.894 4.314 5.894 4.484 c
+8.995 4.424 m
+8.995 3.454 l
+9.525 3.454 l
+9.525 2.66 l
+8.995 2.66 l
+8.995 0.69 l
+8.995 0.533 9.014 0.426 9.055 0.368 c
+9.102 0.309 9.186 0.279 9.304 0.279 c
+9.411 0.279 9.495 0.287 9.554 0.309 c
+9.554 -0.5 l
+9.377 -0.565 9.186 -0.603 8.98 -0.603 c
+8.305 -0.603 7.96 -0.216 7.952 0.559 c
+7.952 2.66 l
+7.496 2.66 l
+7.496 3.454 l
+7.952 3.454 l
+7.952 4.424 l
+h
+11.421 1 m
+11.141 0.69 l
+11.141 -0.529 l
+10.098 -0.529 l
+10.098 5.116 l
+11.141 5.116 l
+11.141 2.072 l
+11.259 2.263 l
+11.979 3.454 l
+13.229 3.454 l
+12.068 1.808 l
+13.331 -0.529 l
+12.141 -0.529 l
+h
+15.228 -0.603 m
+14.699 -0.603 14.279 -0.448 13.978 -0.133 c
+13.684 0.191 13.537 0.651 13.537 1.249 c
+13.537 1.558 l
+13.537 2.183 13.674 2.668 13.949 3.013 c
+14.221 3.356 14.614 3.528 15.125 3.528 c
+15.625 3.528 15.996 3.366 16.242 3.042 c
+16.496 2.72 16.628 2.242 16.639 1.617 c
+16.639 1.118 l
+14.566 1.118 l
+14.585 0.823 14.647 0.607 14.757 0.47 c
+14.875 0.331 15.056 0.264 15.301 0.264 c
+15.643 0.264 15.933 0.382 16.168 0.617 c
+16.581 -0.015 l
+16.452 -0.191 16.264 -0.334 16.022 -0.441 c
+15.775 -0.548 15.511 -0.603 15.228 -0.603 c
+14.581 1.837 m
+15.61 1.837 l
+15.61 1.941 l
+15.61 2.176 15.569 2.352 15.492 2.469 c
+15.422 2.595 15.294 2.66 15.11 2.66 c
+14.934 2.66 14.802 2.591 14.713 2.454 c
+14.632 2.326 14.588 2.12 14.581 1.837 c
+18.829 -0.603 m
+18.3 -0.603 17.881 -0.448 17.58 -0.133 c
+17.286 0.191 17.138 0.651 17.138 1.249 c
+17.138 1.558 l
+17.138 2.183 17.275 2.668 17.55 3.013 c
+17.822 3.356 18.216 3.528 18.726 3.528 c
+19.226 3.528 19.597 3.366 19.843 3.042 c
+20.097 2.72 20.23 2.242 20.24 1.617 c
+20.24 1.118 l
+18.168 1.118 l
+18.186 0.823 18.248 0.607 18.359 0.47 c
+18.476 0.331 18.657 0.264 18.902 0.264 c
+19.245 0.264 19.534 0.382 19.77 0.617 c
+20.182 -0.015 l
+20.053 -0.191 19.866 -0.334 19.623 -0.441 c
+19.376 -0.548 19.112 -0.603 18.829 -0.603 c
+18.183 1.837 m
+19.211 1.837 l
+19.211 1.941 l
+19.211 2.176 19.17 2.352 19.093 2.469 c
+19.024 2.595 18.896 2.66 18.711 2.66 c
+18.535 2.66 18.403 2.591 18.314 2.454 c
+18.233 2.326 18.19 2.12 18.183 1.837 c
+23.93 1.338 m
+23.93 0.709 23.82 0.228 23.606 -0.103 c
+23.39 -0.437 23.07 -0.603 22.651 -0.603 c
+22.328 -0.603 22.067 -0.47 21.872 -0.206 c
+21.872 -2.057 l
+20.828 -2.057 l
+20.828 3.454 l
+21.784 3.454 l
+21.828 3.087 l
+22.023 3.381 22.291 3.528 22.636 3.528 c
+23.055 3.528 23.375 3.37 23.592 3.057 c
+23.804 2.753 23.918 2.282 23.93 1.646 c
+h
+22.886 1.602 m
+22.886 1.984 22.842 2.253 22.754 2.411 c
+22.673 2.565 22.534 2.646 22.328 2.646 c
+22.121 2.646 21.967 2.558 21.872 2.381 c
+21.872 0.515 l
+21.96 0.345 22.114 0.264 22.343 0.264 c
+22.548 0.264 22.688 0.345 22.769 0.515 c
+22.846 0.69 22.886 0.963 22.886 1.338 c
+h
+f
+Q
+q 1 0 0 1 78.9929 106.0196 cm
+0 0 m
+0 3.453 l
+-0.515 3.453 l
+-0.515 3.983 l
+0 3.983 l
+0 4.351 l
+0.008 4.781 0.121 5.115 0.339 5.35 c
+0.563 5.593 0.875 5.718 1.279 5.718 c
+1.426 5.718 1.565 5.695 1.706 5.659 c
+1.852 5.618 2.003 5.564 2.161 5.497 c
+2.043 4.924 l
+1.808 5.049 1.565 5.115 1.324 5.115 c
+1.077 5.115 0.904 5.045 0.809 4.909 c
+0.709 4.781 0.661 4.586 0.661 4.321 c
+0.661 3.983 l
+1.309 3.983 l
+1.309 3.453 l
+0.661 3.453 l
+0.661 0 l
+h
+2.469 0 -0.646 3.983 re
+4.219 0 -0.647 5.644 re
+6.659 -0.074 m
+6.159 -0.074 5.777 0.073 5.513 0.367 c
+5.247 0.661 5.116 1.095 5.116 1.675 c
+5.116 2.146 l
+5.116 2.741 5.241 3.208 5.498 3.542 c
+5.762 3.884 6.122 4.056 6.585 4.056 c
+7.045 4.056 7.387 3.902 7.614 3.601 c
+7.85 3.307 7.971 2.844 7.982 2.219 c
+7.982 1.793 l
+5.762 1.793 l
+5.762 1.705 l
+5.762 1.271 5.839 0.959 5.997 0.764 c
+6.163 0.577 6.394 0.484 6.689 0.484 c
+6.883 0.484 7.056 0.517 7.203 0.588 c
+7.35 0.665 7.485 0.783 7.614 0.941 c
+7.952 0.529 l
+7.666 0.124 7.236 -0.074 6.659 -0.074 c
+6.585 3.498 m
+6.31 3.498 6.108 3.403 5.983 3.218 c
+5.854 3.031 5.781 2.741 5.762 2.352 c
+7.335 2.352 l
+7.335 2.439 l
+7.313 2.822 7.247 3.09 7.129 3.248 c
+7.011 3.414 6.828 3.498 6.585 3.498 c
+10.157 2.131 m
+10.157 1.043 9.912 0.077 9.422 -0.765 c
+9.158 -1.213 8.882 -1.536 8.599 -1.735 c
+8.482 -1.309 l
+8.783 -1.015 9.029 -0.563 9.216 0.043 c
+9.411 0.65 9.511 1.315 9.511 2.042 c
+9.511 2.175 l
+9.511 3.104 9.357 3.939 9.055 4.674 c
+8.886 5.074 8.695 5.394 8.482 5.629 c
+8.599 6.04 l
+8.871 5.853 9.136 5.556 9.393 5.144 c
+9.9 4.292 10.157 3.285 10.157 2.131 c
+11.171 -1.073 m
+10.774 -0.809 l
+11.009 -0.485 11.131 -0.151 11.142 0.191 c
+11.142 0.808 l
+11.803 0.808 l
+11.803 0.278 l
+11.803 0.022 11.738 -0.225 11.612 -0.47 c
+11.495 -0.713 11.348 -0.915 11.171 -1.073 c
+19.198 1.146 m
+19.8 3.983 l
+20.447 3.983 l
+19.462 0 l
+18.947 0 l
+18.169 2.851 l
+17.419 0 l
+16.889 0 l
+15.934 3.983 l
+16.566 3.983 l
+17.184 1.219 l
+17.918 3.983 l
+18.433 3.983 l
+h
+21.77 3.571 m
+22.023 3.895 22.343 4.056 22.725 4.056 c
+23.431 4.056 23.788 3.586 23.798 2.645 c
+23.798 0 l
+23.152 0 l
+23.152 2.616 l
+23.152 2.929 23.096 3.149 22.99 3.278 c
+22.88 3.403 22.725 3.469 22.519 3.469 c
+22.361 3.469 22.215 3.414 22.078 3.307 c
+21.949 3.197 21.847 3.061 21.77 2.896 c
+21.77 0 l
+21.122 0 l
+21.122 5.644 l
+21.77 5.644 l
+h
+24.621 2.175 m
+24.621 2.752 24.757 3.208 25.033 3.542 c
+25.315 3.884 25.687 4.056 26.15 4.056 c
+26.61 4.056 26.977 3.887 27.252 3.557 c
+27.535 3.233 27.682 2.786 27.693 2.219 c
+27.693 1.793 l
+27.693 1.223 27.551 0.768 27.267 0.426 c
+26.992 0.091 26.624 -0.074 26.165 -0.074 c
+25.702 -0.074 25.33 0.087 25.047 0.411 c
+24.772 0.742 24.629 1.183 24.621 1.734 c
+h
+25.268 1.793 m
+25.268 1.389 25.345 1.072 25.503 0.837 c
+25.669 0.602 25.889 0.484 26.165 0.484 c
+26.73 0.484 27.025 0.897 27.046 1.72 c
+27.046 2.175 l
+27.046 2.576 26.962 2.896 26.797 3.131 c
+26.639 3.373 26.422 3.498 26.15 3.498 c
+25.885 3.498 25.669 3.373 25.503 3.131 c
+25.345 2.896 25.268 2.576 25.268 2.175 c
+h
+29.236 0 -0.646 5.644 re
+31.677 -0.074 m
+31.177 -0.074 30.795 0.073 30.53 0.367 c
+30.265 0.661 30.134 1.095 30.134 1.675 c
+30.134 2.146 l
+30.134 2.741 30.258 3.208 30.516 3.542 c
+30.78 3.884 31.14 4.056 31.603 4.056 c
+32.062 4.056 32.405 3.902 32.632 3.601 c
+32.868 3.307 32.989 2.844 32.999 2.219 c
+32.999 1.793 l
+30.78 1.793 l
+30.78 1.705 l
+30.78 1.271 30.857 0.959 31.015 0.764 c
+31.181 0.577 31.412 0.484 31.706 0.484 c
+31.9 0.484 32.074 0.517 32.22 0.588 c
+32.368 0.665 32.503 0.783 32.632 0.941 c
+32.97 0.529 l
+32.684 0.124 32.254 -0.074 31.677 -0.074 c
+31.603 3.498 m
+31.328 3.498 31.125 3.403 31 3.218 c
+30.872 3.031 30.799 2.741 30.78 2.352 c
+32.353 2.352 l
+32.353 2.439 l
+32.331 2.822 32.265 3.09 32.147 3.248 c
+32.029 3.414 31.846 3.498 31.603 3.498 c
+f
+Q
+q 1 0 0 1 117.4607 110.9726 cm
+0 0 m
+0 -0.97 l
+0.529 -0.97 l
+0.529 -1.764 l
+0 -1.764 l
+0 -3.734 l
+0 -3.891 0.018 -3.998 0.058 -4.056 c
+0.106 -4.116 0.191 -4.145 0.309 -4.145 c
+0.415 -4.145 0.5 -4.137 0.559 -4.116 c
+0.559 -4.924 l
+0.382 -4.99 0.191 -5.027 -0.015 -5.027 c
+-0.691 -5.027 -1.037 -4.641 -1.043 -3.865 c
+-1.043 -1.764 l
+-1.5 -1.764 l
+-1.5 -0.97 l
+-1.043 -0.97 l
+-1.043 0 l
+h
+2.072 -0.97 m
+2.102 -1.338 l
+2.337 -1.043 2.645 -0.897 3.028 -0.897 c
+3.429 -0.897 3.707 -1.08 3.866 -1.44 c
+4.101 -1.08 4.428 -0.897 4.85 -0.897 c
+5.546 -0.897 5.897 -1.382 5.909 -2.352 c
+5.909 -4.953 l
+4.88 -4.953 l
+4.88 -2.41 l
+4.88 -2.186 4.843 -2.024 4.777 -1.926 c
+4.719 -1.83 4.608 -1.778 4.453 -1.778 c
+4.255 -1.778 4.116 -1.896 4.027 -2.131 c
+4.027 -4.953 l
+2.984 -4.953 l
+2.984 -2.425 l
+2.984 -2.19 2.955 -2.024 2.896 -1.926 c
+2.837 -1.83 2.726 -1.778 2.572 -1.778 c
+2.396 -1.778 2.253 -1.874 2.146 -2.057 c
+2.146 -4.953 l
+1.103 -4.953 l
+1.103 -0.97 l
+h
+9.789 -3.087 m
+9.789 -3.715 9.679 -4.197 9.466 -4.527 c
+9.249 -4.862 8.93 -5.027 8.511 -5.027 c
+8.187 -5.027 7.927 -4.895 7.732 -4.63 c
+7.732 -6.482 l
+6.688 -6.482 l
+6.688 -0.97 l
+7.644 -0.97 l
+7.688 -1.338 l
+7.882 -1.043 8.151 -0.897 8.496 -0.897 c
+8.915 -0.897 9.234 -1.055 9.452 -1.367 c
+9.664 -1.672 9.779 -2.142 9.789 -2.778 c
+h
+8.746 -2.822 m
+8.746 -2.44 8.702 -2.171 8.613 -2.013 c
+8.533 -1.859 8.393 -1.778 8.187 -1.778 c
+7.981 -1.778 7.827 -1.866 7.732 -2.043 c
+7.732 -3.91 l
+7.819 -4.079 7.975 -4.16 8.202 -4.16 c
+8.407 -4.16 8.548 -4.079 8.628 -3.91 c
+8.706 -3.734 8.746 -3.461 8.746 -3.087 c
+h
+f
+Q
+q 1 0 0 1 131.4391 108.1946 cm
+0 0 m
+0 0.607 0.111 1.073 0.339 1.396 c
+0.574 1.72 0.9 1.881 1.324 1.881 c
+1.706 1.881 2.003 1.723 2.22 1.411 c
+2.22 3.469 l
+2.866 3.469 l
+2.866 -2.175 l
+2.278 -2.175 l
+2.234 -1.749 l
+2.029 -2.084 1.723 -2.249 1.324 -2.249 c
+0.912 -2.249 0.588 -2.094 0.353 -1.779 c
+0.118 -1.455 0 -0.999 0 -0.411 c
+h
+0.647 -0.382 m
+0.647 -0.823 0.709 -1.153 0.838 -1.367 c
+0.975 -1.573 1.195 -1.675 1.5 -1.675 c
+1.823 -1.675 2.062 -1.514 2.22 -1.191 c
+2.22 0.823 l
+2.051 1.135 1.812 1.294 1.5 1.294 c
+1.195 1.294 0.975 1.191 0.838 0.985 c
+0.709 0.779 0.647 0.455 0.647 0.015 c
+h
+4.572 -2.175 -0.647 3.983 re
+4.616 2.851 m
+4.616 2.741 4.586 2.65 4.528 2.572 c
+4.469 2.502 4.374 2.469 4.248 2.469 c
+4.131 2.469 4.035 2.502 3.969 2.572 c
+3.911 2.65 3.881 2.741 3.881 2.851 c
+3.881 2.969 3.911 3.061 3.969 3.131 c
+4.035 3.208 4.131 3.248 4.248 3.248 c
+4.374 3.248 4.469 3.208 4.528 3.131 c
+4.586 3.05 4.616 2.959 4.616 2.851 c
+7.232 1.191 m
+7.144 1.209 7.045 1.22 6.938 1.22 c
+6.604 1.22 6.369 1.037 6.232 0.676 c
+6.232 -2.175 l
+5.586 -2.175 l
+5.586 1.808 l
+6.218 1.808 l
+6.232 1.396 l
+6.409 1.72 6.652 1.881 6.968 1.881 c
+7.074 1.881 7.163 1.86 7.232 1.823 c
+h
+9.231 -2.249 m
+8.732 -2.249 8.349 -2.102 8.085 -1.808 c
+7.82 -1.514 7.688 -1.08 7.688 -0.5 c
+7.688 -0.029 l
+7.688 0.566 7.813 1.033 8.07 1.367 c
+8.335 1.709 8.695 1.881 9.158 1.881 c
+9.617 1.881 9.959 1.727 10.186 1.426 c
+10.422 1.132 10.543 0.669 10.554 0.044 c
+10.554 -0.382 l
+8.335 -0.382 l
+8.335 -0.47 l
+8.335 -0.904 8.412 -1.216 8.57 -1.411 c
+8.736 -1.598 8.967 -1.691 9.261 -1.691 c
+9.455 -1.691 9.628 -1.658 9.775 -1.587 c
+9.922 -1.51 10.058 -1.392 10.186 -1.234 c
+10.525 -1.646 l
+10.238 -2.051 9.808 -2.249 9.231 -2.249 c
+9.158 1.323 m
+8.882 1.323 8.68 1.228 8.555 1.043 c
+8.426 0.856 8.353 0.566 8.335 0.177 c
+9.908 0.177 l
+9.908 0.264 l
+9.885 0.647 9.819 0.915 9.702 1.073 c
+9.584 1.239 9.401 1.323 9.158 1.323 c
+12.715 -1.691 m
+12.929 -1.691 13.101 -1.627 13.23 -1.5 c
+13.365 -1.363 13.439 -1.172 13.45 -0.926 c
+14.067 -0.926 l
+14.045 -1.309 13.91 -1.627 13.656 -1.881 c
+13.399 -2.128 13.086 -2.249 12.715 -2.249 c
+12.223 -2.249 11.848 -2.098 11.583 -1.793 c
+11.326 -1.481 11.201 -1.014 11.201 -0.397 c
+11.201 0.044 l
+11.201 0.64 11.326 1.095 11.583 1.411 c
+11.848 1.723 12.223 1.881 12.715 1.881 c
+13.116 1.881 13.436 1.749 13.671 1.484 c
+13.913 1.228 14.045 0.882 14.067 0.441 c
+13.45 0.441 l
+13.428 0.735 13.355 0.956 13.23 1.103 c
+13.112 1.249 12.939 1.323 12.715 1.323 c
+12.421 1.323 12.204 1.224 12.068 1.029 c
+11.929 0.842 11.855 0.533 11.848 0.103 c
+11.848 -0.411 l
+11.848 -0.881 11.914 -1.216 12.054 -1.411 c
+12.2 -1.598 12.421 -1.691 12.715 -1.691 c
+15.67 2.764 m
+15.67 1.808 l
+16.272 1.808 l
+16.272 1.278 l
+15.67 1.278 l
+15.67 -1.191 l
+15.67 -1.348 15.692 -1.466 15.743 -1.544 c
+15.802 -1.624 15.89 -1.661 16.008 -1.661 c
+16.096 -1.661 16.184 -1.646 16.272 -1.617 c
+16.272 -2.175 l
+16.125 -2.223 15.971 -2.249 15.817 -2.249 c
+15.559 -2.249 15.364 -2.157 15.229 -1.97 c
+15.089 -1.786 15.023 -1.525 15.023 -1.191 c
+15.023 1.278 l
+14.42 1.278 l
+14.42 1.808 l
+15.023 1.808 l
+15.023 2.764 l
+h
+16.831 0 m
+16.831 0.577 16.967 1.033 17.242 1.367 c
+17.525 1.709 17.897 1.881 18.359 1.881 c
+18.819 1.881 19.186 1.712 19.462 1.382 c
+19.745 1.058 19.892 0.611 19.903 0.044 c
+19.903 -0.382 l
+19.903 -0.952 19.759 -1.407 19.476 -1.749 c
+19.201 -2.084 18.834 -2.249 18.375 -2.249 c
+17.911 -2.249 17.54 -2.087 17.257 -1.764 c
+16.981 -1.433 16.838 -0.992 16.831 -0.441 c
+h
+17.477 -0.382 m
+17.477 -0.786 17.554 -1.103 17.712 -1.338 c
+17.878 -1.573 18.099 -1.691 18.375 -1.691 c
+18.94 -1.691 19.234 -1.278 19.256 -0.455 c
+19.256 0 l
+19.256 0.401 19.171 0.721 19.006 0.956 c
+18.849 1.199 18.631 1.323 18.359 1.323 c
+18.095 1.323 17.878 1.199 17.712 0.956 c
+17.554 0.721 17.477 0.401 17.477 0 c
+h
+22.387 1.191 m
+22.298 1.209 22.2 1.22 22.093 1.22 c
+21.758 1.22 21.523 1.037 21.388 0.676 c
+21.388 -2.175 l
+20.74 -2.175 l
+20.74 1.808 l
+21.373 1.808 l
+21.388 1.396 l
+21.564 1.72 21.806 1.881 22.122 1.881 c
+22.229 1.881 22.317 1.86 22.387 1.823 c
+h
+24.195 -1.087 m
+24.915 1.808 l
+25.606 1.808 l
+24.312 -2.734 l
+24.214 -3.075 24.07 -3.337 23.886 -3.513 c
+23.709 -3.69 23.508 -3.778 23.283 -3.778 c
+23.196 -3.778 23.082 -3.755 22.946 -3.719 c
+22.946 -3.175 l
+23.092 -3.19 l
+23.277 -3.19 23.423 -3.146 23.534 -3.057 c
+23.64 -2.969 23.728 -2.811 23.798 -2.587 c
+23.915 -2.146 l
+22.755 1.808 l
+23.46 1.808 l
+h
+31.871 -2.175 m
+31.831 -2.087 31.805 -1.94 31.798 -1.735 c
+31.563 -2.08 31.269 -2.249 30.916 -2.249 c
+30.552 -2.249 30.269 -2.153 30.063 -1.955 c
+29.865 -1.749 29.77 -1.463 29.77 -1.087 c
+29.77 -0.687 29.905 -0.368 30.181 -0.133 c
+30.453 0.11 30.828 0.235 31.298 0.235 c
+31.784 0.235 l
+31.784 0.661 l
+31.784 0.897 31.728 1.062 31.622 1.161 c
+31.511 1.268 31.35 1.323 31.137 1.323 c
+30.938 1.323 30.776 1.264 30.651 1.147 c
+30.534 1.029 30.475 0.882 30.475 0.706 c
+29.828 0.706 l
+29.828 0.9 29.887 1.091 30.005 1.278 c
+30.13 1.463 30.292 1.61 30.489 1.72 c
+30.695 1.827 30.923 1.881 31.181 1.881 c
+31.582 1.881 31.886 1.779 32.092 1.573 c
+32.305 1.367 32.419 1.073 32.43 0.691 c
+32.43 -1.323 l
+32.43 -1.627 32.467 -1.893 32.548 -2.117 c
+32.548 -2.175 l
+h
+31.004 -1.661 m
+31.17 -1.661 31.32 -1.617 31.46 -1.529 c
+31.607 -1.44 31.713 -1.33 31.784 -1.191 c
+31.784 -0.25 l
+31.416 -0.25 l
+31.1 -0.25 30.857 -0.32 30.681 -0.455 c
+30.504 -0.584 30.416 -0.771 30.416 -1.014 c
+30.416 -1.242 30.46 -1.407 30.549 -1.514 c
+30.637 -1.613 30.788 -1.661 31.004 -1.661 c
+34.047 1.808 m
+34.061 1.367 l
+34.315 1.709 34.639 1.881 35.032 1.881 c
+35.738 1.881 36.094 1.411 36.105 0.47 c
+36.105 -2.175 l
+35.458 -2.175 l
+35.458 0.441 l
+35.458 0.754 35.403 0.974 35.297 1.103 c
+35.186 1.228 35.032 1.294 34.826 1.294 c
+34.668 1.294 34.521 1.239 34.385 1.132 c
+34.256 1.022 34.154 0.886 34.076 0.721 c
+34.076 -2.175 l
+33.43 -2.175 l
+33.43 1.808 l
+h
+36.943 0 m
+36.943 0.607 37.053 1.073 37.281 1.396 c
+37.516 1.72 37.843 1.881 38.266 1.881 c
+38.647 1.881 38.946 1.723 39.162 1.411 c
+39.162 3.469 l
+39.809 3.469 l
+39.809 -2.175 l
+39.221 -2.175 l
+39.177 -1.749 l
+38.971 -2.084 38.666 -2.249 38.266 -2.249 c
+37.854 -2.249 37.531 -2.094 37.296 -1.779 c
+37.06 -1.455 36.943 -0.999 36.943 -0.411 c
+h
+37.589 -0.382 m
+37.589 -0.823 37.652 -1.153 37.78 -1.367 c
+37.917 -1.573 38.137 -1.675 38.442 -1.675 c
+38.765 -1.675 39.004 -1.514 39.162 -1.191 c
+39.162 0.823 l
+38.994 1.135 38.755 1.294 38.442 1.294 c
+38.137 1.294 37.917 1.191 37.78 0.985 c
+37.652 0.779 37.589 0.455 37.589 0.015 c
+h
+46.439 -2.175 m
+46.398 -2.087 46.372 -1.94 46.365 -1.735 c
+46.13 -2.08 45.836 -2.249 45.483 -2.249 c
+45.119 -2.249 44.836 -2.153 44.631 -1.955 c
+44.432 -1.749 44.336 -1.463 44.336 -1.087 c
+44.336 -0.687 44.473 -0.368 44.748 -0.133 c
+45.02 0.11 45.394 0.235 45.865 0.235 c
+46.35 0.235 l
+46.35 0.661 l
+46.35 0.897 46.295 1.062 46.188 1.161 c
+46.078 1.268 45.917 1.323 45.703 1.323 c
+45.505 1.323 45.344 1.264 45.219 1.147 c
+45.101 1.029 45.042 0.882 45.042 0.706 c
+44.395 0.706 l
+44.395 0.9 44.454 1.091 44.571 1.278 c
+44.696 1.463 44.858 1.61 45.057 1.72 c
+45.263 1.827 45.49 1.881 45.747 1.881 c
+46.148 1.881 46.453 1.779 46.659 1.573 c
+46.872 1.367 46.986 1.073 46.997 0.691 c
+46.997 -1.323 l
+46.997 -1.627 47.033 -1.893 47.114 -2.117 c
+47.114 -2.175 l
+h
+45.571 -1.661 m
+45.737 -1.661 45.887 -1.617 46.027 -1.529 c
+46.173 -1.44 46.281 -1.33 46.35 -1.191 c
+46.35 -0.25 l
+45.982 -0.25 l
+45.666 -0.25 45.425 -0.32 45.248 -0.455 c
+45.071 -0.584 44.983 -0.771 44.983 -1.014 c
+44.983 -1.242 45.028 -1.407 45.115 -1.514 c
+45.203 -1.613 45.354 -1.661 45.571 -1.661 c
+48.702 -2.175 -0.647 5.644 re
+50.422 -2.175 -0.647 5.644 re
+55.199 -2.175 m
+55.199 1.278 l
+54.684 1.278 l
+54.684 1.808 l
+55.199 1.808 l
+55.199 2.176 l
+55.206 2.606 55.32 2.94 55.538 3.175 c
+55.761 3.418 56.074 3.543 56.478 3.543 c
+56.625 3.543 56.764 3.52 56.904 3.484 c
+57.051 3.443 57.202 3.389 57.36 3.322 c
+57.242 2.749 l
+57.007 2.874 56.764 2.94 56.521 2.94 c
+56.276 2.94 56.103 2.87 56.008 2.734 c
+55.908 2.606 55.86 2.411 55.86 2.146 c
+55.86 1.808 l
+56.507 1.808 l
+56.507 1.278 l
+55.86 1.278 l
+55.86 -2.175 l
+h
+57.668 -2.175 -0.646 3.983 re
+59.417 -2.175 -0.646 5.644 re
+61.857 -2.249 m
+61.358 -2.249 60.976 -2.102 60.712 -1.808 c
+60.446 -1.514 60.315 -1.08 60.315 -0.5 c
+60.315 -0.029 l
+60.315 0.566 60.439 1.033 60.697 1.367 c
+60.961 1.709 61.321 1.881 61.784 1.881 c
+62.243 1.881 62.586 1.727 62.813 1.426 c
+63.048 1.132 63.17 0.669 63.18 0.044 c
+63.18 -0.382 l
+60.961 -0.382 l
+60.961 -0.47 l
+60.961 -0.904 61.038 -1.216 61.196 -1.411 c
+61.362 -1.598 61.593 -1.691 61.887 -1.691 c
+62.082 -1.691 62.254 -1.658 62.401 -1.587 c
+62.549 -1.51 62.684 -1.392 62.813 -1.234 c
+63.151 -1.646 l
+62.865 -2.051 62.435 -2.249 61.857 -2.249 c
+61.784 1.323 m
+61.508 1.323 61.306 1.228 61.182 1.043 c
+61.053 0.856 60.98 0.566 60.961 0.177 c
+62.534 0.177 l
+62.534 0.264 l
+62.512 0.647 62.445 0.915 62.328 1.073 c
+62.21 1.239 62.027 1.323 61.784 1.323 c
+65.9 -1.161 m
+65.9 -1.014 65.845 -0.893 65.738 -0.794 c
+65.628 -0.698 65.422 -0.58 65.121 -0.441 c
+64.776 -0.294 64.533 -0.172 64.386 -0.073 c
+64.239 0.033 64.128 0.151 64.062 0.279 c
+63.993 0.405 63.96 0.563 63.96 0.75 c
+63.96 1.073 64.078 1.341 64.313 1.558 c
+64.548 1.771 64.849 1.881 65.223 1.881 c
+65.606 1.881 65.915 1.768 66.15 1.544 c
+66.385 1.316 66.503 1.029 66.503 0.676 c
+65.856 0.676 l
+65.856 0.852 65.797 1.004 65.68 1.132 c
+65.562 1.257 65.408 1.323 65.223 1.323 c
+65.025 1.323 64.874 1.268 64.768 1.161 c
+64.658 1.062 64.606 0.929 64.606 0.765 c
+64.606 0.636 64.643 0.53 64.724 0.441 c
+64.801 0.36 64.992 0.258 65.297 0.133 c
+65.775 -0.055 66.106 -0.243 66.282 -0.426 c
+66.459 -0.603 66.547 -0.831 66.547 -1.103 c
+66.547 -1.455 66.422 -1.735 66.179 -1.94 c
+65.944 -2.146 65.628 -2.249 65.238 -2.249 c
+64.816 -2.249 64.477 -2.132 64.224 -1.897 c
+63.967 -1.654 63.842 -1.348 63.842 -0.985 c
+64.489 -0.985 l
+64.496 -1.213 64.566 -1.389 64.695 -1.514 c
+64.82 -1.631 65.003 -1.691 65.238 -1.691 c
+65.452 -1.691 65.613 -1.643 65.724 -1.544 c
+65.841 -1.448 65.9 -1.319 65.9 -1.161 c
+f
+Q
+q 1 0 0 1 203.1893 109.5615 cm
+0 0 m
+-1.161 0.324 l
+-0.941 0.985 l
+0.191 0.53 l
+0.132 1.808 l
+0.852 1.808 l
+0.779 0.5 l
+1.897 0.956 l
+2.102 0.279 l
+0.926 -0.044 l
+1.705 -1.029 l
+1.117 -1.44 l
+0.441 -0.367 l
+-0.22 -1.411 l
+-0.809 -0.999 l
+h
+2.631 -3.013 m
+2.631 -2.848 2.682 -2.712 2.793 -2.601 c
+2.899 -2.495 3.046 -2.44 3.233 -2.44 c
+3.399 -2.44 3.543 -2.495 3.659 -2.601 c
+3.778 -2.712 3.836 -2.848 3.836 -3.013 c
+3.836 -3.183 3.778 -3.318 3.659 -3.424 c
+3.543 -3.535 3.399 -3.586 3.233 -3.586 c
+3.057 -3.586 2.911 -3.535 2.793 -3.424 c
+2.682 -3.318 2.631 -3.183 2.631 -3.013 c
+6.497 -2.469 m
+6.497 -2.381 6.453 -2.304 6.365 -2.234 c
+6.277 -2.157 6.089 -2.054 5.806 -1.926 c
+5.373 -1.749 5.074 -1.569 4.91 -1.382 c
+4.752 -1.198 4.675 -0.966 4.675 -0.691 c
+4.675 -0.349 4.796 -0.066 5.041 0.162 c
+5.295 0.397 5.633 0.515 6.056 0.515 c
+6.485 0.515 6.835 0.401 7.1 0.177 c
+7.364 -0.051 7.497 -0.353 7.497 -0.735 c
+6.453 -0.735 l
+6.453 -0.411 6.313 -0.249 6.041 -0.249 c
+5.931 -0.249 5.843 -0.286 5.776 -0.353 c
+5.707 -0.422 5.674 -0.521 5.674 -0.646 c
+5.674 -0.735 5.71 -0.816 5.791 -0.881 c
+5.868 -0.941 6.049 -1.036 6.335 -1.161 c
+6.765 -1.319 7.063 -1.496 7.231 -1.691 c
+7.408 -1.878 7.497 -2.127 7.497 -2.44 c
+7.497 -2.793 7.364 -3.079 7.1 -3.293 c
+6.835 -3.509 6.485 -3.616 6.056 -3.616 c
+5.762 -3.616 5.501 -3.561 5.277 -3.454 c
+5.049 -3.337 4.873 -3.175 4.748 -2.969 c
+4.63 -2.763 4.571 -2.543 4.571 -2.308 c
+5.556 -2.308 l
+5.556 -2.495 5.593 -2.631 5.674 -2.719 c
+5.762 -2.807 5.895 -2.851 6.071 -2.851 c
+6.354 -2.851 6.497 -2.726 6.497 -2.469 c
+11.054 -1.793 m
+11.406 0.441 l
+12.406 0.441 l
+11.582 -3.542 l
+10.715 -3.542 l
+10.157 -1.234 l
+9.598 -3.542 l
+8.731 -3.542 l
+7.908 0.441 l
+8.908 0.441 l
+9.261 -1.793 l
+9.789 0.441 l
+10.524 0.441 l
+h
+16.022 -1.675 m
+16.022 -2.304 15.912 -2.786 15.698 -3.116 c
+15.482 -3.451 15.162 -3.616 14.743 -3.616 c
+14.42 -3.616 14.159 -3.484 13.964 -3.219 c
+13.964 -5.071 l
+12.92 -5.071 l
+12.92 0.441 l
+13.876 0.441 l
+13.92 0.073 l
+14.115 0.368 14.383 0.515 14.728 0.515 c
+15.147 0.515 15.467 0.357 15.684 0.044 c
+15.897 -0.261 16.01 -0.731 16.022 -1.367 c
+h
+14.978 -1.411 m
+14.978 -1.029 14.934 -0.76 14.846 -0.602 c
+14.765 -0.448 14.626 -0.367 14.42 -0.367 c
+14.214 -0.367 14.059 -0.455 13.964 -0.632 c
+13.964 -2.499 l
+14.052 -2.668 14.206 -2.749 14.435 -2.749 c
+14.64 -2.749 14.78 -2.668 14.861 -2.499 c
+14.938 -2.323 14.978 -2.05 14.978 -1.675 c
+h
+f
+Q
+q 1 0 0 1 219.99 106.3724 cm
+0 0 m
+0 0.118 0.033 0.213 0.103 0.294 c
+0.169 0.371 0.272 0.411 0.412 0.411 c
+0.559 0.411 0.665 0.371 0.735 0.294 c
+0.813 0.213 0.853 0.118 0.853 0 c
+0.853 -0.111 0.813 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.111 0 0 c
+5.619 -0.353 m
+5.619 4.997 l
+6.897 4.997 l
+7.522 4.997 8.008 4.799 8.353 4.409 c
+8.694 4.016 8.867 3.469 8.867 2.763 c
+8.867 1.866 l
+8.867 1.161 8.691 0.61 8.339 0.22 c
+7.993 -0.162 7.489 -0.353 6.824 -0.353 c
+h
+6.295 4.424 m
+6.295 0.22 l
+6.839 0.22 l
+7.31 0.22 7.651 0.357 7.868 0.631 c
+8.092 0.904 8.206 1.308 8.206 1.837 c
+8.206 2.778 l
+8.206 3.343 8.096 3.763 7.882 4.027 c
+7.666 4.292 7.339 4.424 6.897 4.424 c
+h
+11.248 -0.427 m
+10.749 -0.427 10.367 -0.279 10.103 0.014 c
+9.837 0.309 9.706 0.742 9.706 1.323 c
+9.706 1.793 l
+9.706 2.389 9.83 2.855 10.088 3.189 c
+10.352 3.532 10.712 3.704 11.175 3.704 c
+11.634 3.704 11.977 3.549 12.204 3.248 c
+12.439 2.954 12.561 2.491 12.572 1.866 c
+12.572 1.44 l
+10.352 1.44 l
+10.352 1.352 l
+10.352 0.918 10.429 0.606 10.587 0.411 c
+10.753 0.224 10.984 0.132 11.279 0.132 c
+11.473 0.132 11.645 0.165 11.792 0.235 c
+11.94 0.312 12.075 0.43 12.204 0.588 c
+12.542 0.176 l
+12.256 -0.229 11.826 -0.427 11.248 -0.427 c
+11.175 3.145 m
+10.899 3.145 10.697 3.05 10.573 2.865 c
+10.444 2.678 10.371 2.389 10.352 1.999 c
+11.925 1.999 l
+11.925 2.087 l
+11.903 2.469 11.836 2.738 11.719 2.896 c
+11.601 3.061 11.418 3.145 11.175 3.145 c
+15.291 0.661 m
+15.291 0.808 15.236 0.929 15.129 1.028 c
+15.019 1.124 14.813 1.242 14.512 1.381 c
+14.167 1.529 13.924 1.65 13.777 1.749 c
+13.63 1.855 13.519 1.973 13.454 2.102 c
+13.384 2.227 13.351 2.385 13.351 2.572 c
+13.351 2.896 13.469 3.164 13.704 3.38 c
+13.939 3.594 14.24 3.704 14.614 3.704 c
+14.997 3.704 15.306 3.59 15.541 3.366 c
+15.776 3.138 15.894 2.851 15.894 2.499 c
+15.247 2.499 l
+15.247 2.675 15.188 2.826 15.071 2.954 c
+14.953 3.079 14.799 3.145 14.614 3.145 c
+14.416 3.145 14.265 3.09 14.159 2.983 c
+14.049 2.884 13.997 2.752 13.997 2.587 c
+13.997 2.458 14.034 2.352 14.115 2.263 c
+14.192 2.183 14.383 2.08 14.689 1.955 c
+15.166 1.768 15.497 1.579 15.673 1.396 c
+15.85 1.219 15.938 0.992 15.938 0.72 c
+15.938 0.367 15.813 0.087 15.57 -0.118 c
+15.335 -0.324 15.019 -0.427 14.629 -0.427 c
+14.207 -0.427 13.868 -0.31 13.615 -0.074 c
+13.358 0.168 13.233 0.474 13.233 0.837 c
+13.88 0.837 l
+13.887 0.61 13.957 0.434 14.086 0.309 c
+14.211 0.191 14.394 0.132 14.629 0.132 c
+14.843 0.132 15.004 0.18 15.115 0.278 c
+15.232 0.374 15.291 0.503 15.291 0.661 c
+18.157 0.132 m
+18.371 0.132 18.543 0.195 18.672 0.323 c
+18.807 0.459 18.882 0.65 18.892 0.897 c
+19.51 0.897 l
+19.487 0.514 19.352 0.195 19.098 -0.059 c
+18.841 -0.306 18.529 -0.427 18.157 -0.427 c
+17.665 -0.427 17.29 -0.276 17.025 0.029 c
+16.768 0.341 16.644 0.808 16.644 1.425 c
+16.644 1.866 l
+16.644 2.462 16.768 2.917 17.025 3.233 c
+17.29 3.546 17.665 3.704 18.157 3.704 c
+18.558 3.704 18.878 3.571 19.113 3.307 c
+19.355 3.05 19.487 2.705 19.51 2.263 c
+18.892 2.263 l
+18.87 2.557 18.797 2.778 18.672 2.925 c
+18.554 3.072 18.381 3.145 18.157 3.145 c
+17.864 3.145 17.646 3.046 17.511 2.851 c
+17.371 2.664 17.297 2.356 17.29 1.925 c
+17.29 1.411 l
+17.29 0.941 17.356 0.606 17.496 0.411 c
+17.643 0.224 17.864 0.132 18.157 0.132 c
+21.905 3.013 m
+21.818 3.031 21.718 3.042 21.612 3.042 c
+21.277 3.042 21.042 2.859 20.906 2.499 c
+20.906 -0.353 l
+20.259 -0.353 l
+20.259 3.63 l
+20.891 3.63 l
+20.906 3.218 l
+21.082 3.542 21.325 3.704 21.641 3.704 c
+21.747 3.704 21.835 3.682 21.905 3.645 c
+h
+23.258 -0.353 -0.647 3.983 re
+23.302 4.674 m
+23.302 4.564 23.273 4.472 23.214 4.394 c
+23.155 4.325 23.059 4.292 22.934 4.292 c
+22.817 4.292 22.722 4.325 22.655 4.394 c
+22.597 4.472 22.567 4.564 22.567 4.674 c
+22.567 4.791 22.597 4.883 22.655 4.953 c
+22.722 5.03 22.817 5.071 22.934 5.071 c
+23.059 5.071 23.155 5.03 23.214 4.953 c
+23.273 4.872 23.302 4.781 23.302 4.674 c
+27.154 1.44 m
+27.154 0.823 27.039 0.357 26.815 0.043 c
+26.598 -0.272 26.275 -0.427 25.845 -0.427 c
+25.423 -0.427 25.11 -0.246 24.904 0.118 c
+24.875 -0.353 l
+24.272 -0.353 l
+24.272 5.292 l
+24.919 5.292 l
+24.919 3.189 l
+25.132 3.532 25.44 3.704 25.845 3.704 c
+26.275 3.704 26.598 3.546 26.815 3.233 c
+27.039 2.929 27.154 2.462 27.154 1.837 c
+h
+26.506 1.822 m
+26.506 2.293 26.437 2.624 26.3 2.822 c
+26.172 3.017 25.963 3.116 25.668 3.116 c
+25.334 3.116 25.084 2.932 24.919 2.572 c
+24.919 0.691 l
+25.084 0.326 25.338 0.147 25.683 0.147 c
+25.978 0.147 26.186 0.249 26.315 0.455 c
+26.44 0.661 26.506 0.977 26.506 1.411 c
+h
+29.417 -0.427 m
+28.917 -0.427 28.535 -0.279 28.27 0.014 c
+28.006 0.309 27.873 0.742 27.873 1.323 c
+27.873 1.793 l
+27.873 2.389 27.998 2.855 28.255 3.189 c
+28.52 3.532 28.88 3.704 29.344 3.704 c
+29.803 3.704 30.144 3.549 30.372 3.248 c
+30.607 2.954 30.728 2.491 30.74 1.866 c
+30.74 1.44 l
+28.52 1.44 l
+28.52 1.352 l
+28.52 0.918 28.598 0.606 28.756 0.411 c
+28.92 0.224 29.153 0.132 29.446 0.132 c
+29.641 0.132 29.814 0.165 29.961 0.235 c
+30.107 0.312 30.244 0.43 30.372 0.588 c
+30.71 0.176 l
+30.424 -0.229 29.994 -0.427 29.417 -0.427 c
+29.344 3.145 m
+29.068 3.145 28.866 3.05 28.741 2.865 c
+28.612 2.678 28.538 2.389 28.52 1.999 c
+30.093 1.999 l
+30.093 2.087 l
+30.071 2.469 30.005 2.738 29.887 2.896 c
+29.77 3.061 29.585 3.145 29.344 3.145 c
+31.387 1.822 m
+31.387 2.429 31.497 2.896 31.725 3.218 c
+31.96 3.542 32.287 3.704 32.709 3.704 c
+33.091 3.704 33.389 3.546 33.606 3.233 c
+33.606 5.292 l
+34.252 5.292 l
+34.252 -0.353 l
+33.664 -0.353 l
+33.621 0.073 l
+33.415 -0.262 33.11 -0.427 32.709 -0.427 c
+32.297 -0.427 31.975 -0.272 31.74 0.043 c
+31.504 0.367 31.387 0.823 31.387 1.411 c
+h
+32.033 1.44 m
+32.033 0.999 32.095 0.669 32.224 0.455 c
+32.36 0.249 32.581 0.147 32.885 0.147 c
+33.209 0.147 33.448 0.309 33.606 0.631 c
+33.606 2.645 l
+33.437 2.958 33.198 3.116 32.885 3.116 c
+32.581 3.116 32.36 3.013 32.224 2.807 c
+32.095 2.601 32.033 2.278 32.033 1.837 c
+h
+39.015 -0.353 m
+39.015 3.101 l
+38.501 3.101 l
+38.501 3.63 l
+39.015 3.63 l
+39.015 3.998 l
+39.023 4.428 39.137 4.762 39.353 4.997 c
+39.578 5.24 39.89 5.365 40.294 5.365 c
+40.441 5.365 40.581 5.342 40.72 5.306 c
+40.868 5.265 41.018 5.211 41.176 5.144 c
+41.059 4.571 l
+40.823 4.696 40.581 4.762 40.338 4.762 c
+40.091 4.762 39.919 4.692 39.823 4.556 c
+39.725 4.428 39.677 4.233 39.677 3.968 c
+39.677 3.63 l
+40.324 3.63 l
+40.324 3.101 l
+39.677 3.101 l
+39.677 -0.353 l
+h
+41.485 -0.353 -0.647 3.983 re
+43.234 -0.353 -0.646 5.644 re
+45.674 -0.427 m
+45.174 -0.427 44.792 -0.279 44.527 0.014 c
+44.263 0.309 44.13 0.742 44.13 1.323 c
+44.13 1.793 l
+44.13 2.389 44.255 2.855 44.513 3.189 c
+44.777 3.532 45.138 3.704 45.6 3.704 c
+46.06 3.704 46.401 3.549 46.63 3.248 c
+46.865 2.954 46.986 2.491 46.997 1.866 c
+46.997 1.44 l
+44.777 1.44 l
+44.777 1.352 l
+44.777 0.918 44.854 0.606 45.012 0.411 c
+45.178 0.224 45.409 0.132 45.703 0.132 c
+45.898 0.132 46.071 0.165 46.218 0.235 c
+46.364 0.312 46.501 0.43 46.63 0.588 c
+46.967 0.176 l
+46.68 -0.229 46.251 -0.427 45.674 -0.427 c
+45.6 3.145 m
+45.325 3.145 45.123 3.05 44.997 2.865 c
+44.869 2.678 44.795 2.389 44.777 1.999 c
+46.35 1.999 l
+46.35 2.087 l
+46.328 2.469 46.262 2.738 46.144 2.896 c
+46.027 3.061 45.843 3.145 45.6 3.145 c
+f
+Q
+38.317 96.612 -0.646 3.983 re
+38.361 101.639 m
+38.361 101.529 38.332 101.437 38.273 101.359 c
+38.215 101.29 38.119 101.257 37.994 101.257 c
+37.876 101.257 37.781 101.29 37.714 101.359 c
+37.656 101.437 37.627 101.529 37.627 101.639 c
+37.627 101.756 37.656 101.848 37.714 101.918 c
+37.781 101.995 37.876 102.036 37.994 102.036 c
+38.119 102.036 38.215 101.995 38.273 101.918 c
+38.332 101.837 38.361 101.746 38.361 101.639 c
+39.2 98.787 m
+39.2 99.404 39.31 99.868 39.537 100.183 c
+39.761 100.507 40.096 100.669 40.536 100.669 c
+40.937 100.669 41.242 100.493 41.448 100.14 c
+41.492 100.595 l
+42.08 100.595 l
+42.08 96.568 l
+42.08 96.079 41.951 95.701 41.698 95.436 c
+41.44 95.171 41.088 95.039 40.64 95.039 c
+40.441 95.039 40.221 95.09 39.979 95.186 c
+39.732 95.285 39.552 95.406 39.435 95.554 c
+39.699 95.994 l
+39.964 95.73 40.261 95.597 40.596 95.597 c
+41.132 95.597 41.408 95.892 41.419 96.48 c
+41.419 97.008 l
+41.213 96.693 40.912 96.538 40.522 96.538 c
+40.11 96.538 39.788 96.689 39.552 96.994 c
+39.324 97.307 39.206 97.758 39.2 98.346 c
+h
+39.861 98.405 m
+39.861 97.964 39.923 97.634 40.052 97.42 c
+40.177 97.214 40.393 97.112 40.698 97.112 c
+41.022 97.112 41.261 97.277 41.419 97.611 c
+41.419 99.595 l
+41.249 99.919 41.011 100.081 40.698 100.081 c
+40.405 100.081 40.187 99.978 40.052 99.772 c
+39.923 99.566 39.861 99.243 39.861 98.802 c
+h
+43.653 100.595 m
+43.668 100.154 l
+43.921 100.497 44.245 100.669 44.638 100.669 c
+45.344 100.669 45.7 100.198 45.71 99.258 c
+45.71 96.612 l
+45.064 96.612 l
+45.064 99.228 l
+45.064 99.541 45.009 99.761 44.902 99.89 c
+44.792 100.015 44.638 100.081 44.432 100.081 c
+44.274 100.081 44.127 100.026 43.991 99.919 c
+43.863 99.809 43.759 99.673 43.682 99.508 c
+43.682 96.612 l
+43.036 96.612 l
+43.036 100.595 l
+h
+46.549 98.787 m
+46.549 99.364 46.685 99.82 46.961 100.154 c
+47.243 100.497 47.615 100.669 48.077 100.669 c
+48.536 100.669 48.904 100.499 49.18 100.169 c
+49.463 99.846 49.61 99.398 49.621 98.831 c
+49.621 98.405 l
+49.621 97.835 49.477 97.38 49.195 97.038 c
+48.919 96.703 48.552 96.538 48.092 96.538 c
+47.629 96.538 47.258 96.7 46.975 97.023 c
+46.699 97.354 46.556 97.795 46.549 98.346 c
+h
+47.196 98.405 m
+47.196 98.001 47.273 97.685 47.431 97.45 c
+47.596 97.214 47.817 97.097 48.092 97.097 c
+48.658 97.097 48.952 97.509 48.974 98.332 c
+48.974 98.787 l
+48.974 99.188 48.889 99.508 48.725 99.743 c
+48.567 99.986 48.349 100.11 48.077 100.11 c
+47.813 100.11 47.596 99.986 47.431 99.743 c
+47.273 99.508 47.196 99.188 47.196 98.787 c
+h
+52.105 99.978 m
+52.017 99.996 51.917 100.007 51.811 100.007 c
+51.476 100.007 51.241 99.824 51.106 99.464 c
+51.106 96.612 l
+50.458 96.612 l
+50.458 100.595 l
+51.091 100.595 l
+51.106 100.183 l
+51.282 100.507 51.524 100.669 51.84 100.669 c
+51.947 100.669 52.035 100.647 52.105 100.61 c
+h
+53.457 96.612 -0.647 3.983 re
+53.502 101.639 m
+53.502 101.529 53.472 101.437 53.413 101.359 c
+53.354 101.29 53.259 101.257 53.134 101.257 c
+53.016 101.257 52.921 101.29 52.854 101.359 c
+52.796 101.437 52.766 101.529 52.766 101.639 c
+52.766 101.756 52.796 101.848 52.854 101.918 c
+52.921 101.995 53.016 102.036 53.134 102.036 c
+53.259 102.036 53.354 101.995 53.413 101.918 c
+53.472 101.837 53.502 101.746 53.502 101.639 c
+55.089 100.595 m
+55.104 100.154 l
+55.357 100.497 55.68 100.669 56.074 100.669 c
+56.779 100.669 57.136 100.198 57.147 99.258 c
+57.147 96.612 l
+56.5 96.612 l
+56.5 99.228 l
+56.5 99.541 56.445 99.761 56.338 99.89 c
+56.228 100.015 56.074 100.081 55.868 100.081 c
+55.71 100.081 55.563 100.026 55.427 99.919 c
+55.298 99.809 55.195 99.673 55.118 99.508 c
+55.118 96.612 l
+54.472 96.612 l
+54.472 100.595 l
+h
+57.984 98.787 m
+57.984 99.404 58.095 99.868 58.323 100.183 c
+58.547 100.507 58.881 100.669 59.322 100.669 c
+59.723 100.669 60.028 100.493 60.234 100.14 c
+60.278 100.595 l
+60.866 100.595 l
+60.866 96.568 l
+60.866 96.079 60.737 95.701 60.484 95.436 c
+60.226 95.171 59.873 95.039 59.426 95.039 c
+59.227 95.039 59.006 95.09 58.763 95.186 c
+58.518 95.285 58.337 95.406 58.219 95.554 c
+58.485 95.994 l
+58.749 95.73 59.046 95.597 59.381 95.597 c
+59.918 95.597 60.193 95.892 60.204 96.48 c
+60.204 97.008 l
+59.998 96.693 59.697 96.538 59.308 96.538 c
+58.896 96.538 58.572 96.689 58.337 96.994 c
+58.109 97.307 57.992 97.758 57.984 98.346 c
+h
+58.646 98.405 m
+58.646 97.964 58.709 97.634 58.838 97.42 c
+58.962 97.214 59.179 97.112 59.484 97.112 c
+59.807 97.112 60.046 97.277 60.204 97.611 c
+60.204 99.595 l
+60.035 99.919 59.796 100.081 59.484 100.081 c
+59.19 100.081 58.973 99.978 58.838 99.772 c
+58.709 99.566 58.646 99.243 58.646 98.802 c
+h
+66.734 97.758 m
+67.337 100.595 l
+67.983 100.595 l
+66.998 96.612 l
+66.484 96.612 l
+65.705 99.464 l
+64.955 96.612 l
+64.426 96.612 l
+63.471 100.595 l
+64.103 100.595 l
+64.72 97.831 l
+65.456 100.595 l
+65.97 100.595 l
+h
+69.365 96.612 -0.647 3.983 re
+69.41 101.639 m
+69.41 101.529 69.38 101.437 69.321 101.359 c
+69.263 101.29 69.167 101.257 69.042 101.257 c
+68.924 101.257 68.829 101.29 68.762 101.359 c
+68.704 101.437 68.675 101.529 68.675 101.639 c
+68.675 101.756 68.704 101.848 68.762 101.918 c
+68.829 101.995 68.924 102.036 69.042 102.036 c
+69.167 102.036 69.263 101.995 69.321 101.918 c
+69.38 101.837 69.41 101.746 69.41 101.639 c
+71.085 96.612 -0.646 5.644 re
+72.805 96.612 -0.646 5.644 re
+78.732 97.758 m
+79.335 100.595 l
+79.982 100.595 l
+78.997 96.612 l
+78.482 96.612 l
+77.703 99.464 l
+76.953 96.612 l
+76.425 96.612 l
+75.469 100.595 l
+76.101 100.595 l
+76.718 97.831 l
+77.454 100.595 l
+77.967 100.595 l
+h
+80.525 98.787 m
+80.525 99.364 80.662 99.82 80.937 100.154 c
+81.221 100.497 81.591 100.669 82.054 100.669 c
+82.514 100.669 82.881 100.499 83.157 100.169 c
+83.44 99.846 83.587 99.398 83.598 98.831 c
+83.598 98.405 l
+83.598 97.835 83.455 97.38 83.172 97.038 c
+82.896 96.703 82.528 96.538 82.069 96.538 c
+81.606 96.538 81.235 96.7 80.952 97.023 c
+80.676 97.354 80.533 97.795 80.525 98.346 c
+h
+81.173 98.405 m
+81.173 98.001 81.25 97.685 81.408 97.45 c
+81.573 97.214 81.793 97.097 82.069 97.097 c
+82.635 97.097 82.929 97.509 82.951 98.332 c
+82.951 98.787 l
+82.951 99.188 82.867 99.508 82.701 99.743 c
+82.543 99.986 82.326 100.11 82.054 100.11 c
+81.79 100.11 81.573 99.986 81.408 99.743 c
+81.25 99.508 81.173 99.188 81.173 98.787 c
+h
+86.082 99.978 m
+85.994 99.996 85.894 100.007 85.788 100.007 c
+85.454 100.007 85.219 99.824 85.082 99.464 c
+85.082 96.612 l
+84.436 96.612 l
+84.436 100.595 l
+85.067 100.595 l
+85.082 100.183 l
+85.258 100.507 85.501 100.669 85.817 100.669 c
+85.924 100.669 86.012 100.647 86.082 100.61 c
+h
+87.729 98.434 m
+87.39 98.037 l
+87.39 96.612 l
+86.729 96.612 l
+86.729 102.257 l
+87.39 102.257 l
+87.39 98.876 l
+88.625 100.595 l
+89.404 100.595 l
+88.14 98.934 l
+89.566 96.612 l
+88.816 96.612 l
+h
+92.366 96.612 m
+92.366 100.066 l
+91.837 100.066 l
+91.837 100.595 l
+92.366 100.595 l
+92.366 101.051 l
+92.366 101.451 92.461 101.764 92.66 101.991 c
+92.865 102.216 93.144 102.33 93.497 102.33 c
+93.634 102.33 93.765 102.307 93.894 102.271 c
+93.865 101.727 l
+93.765 101.746 93.667 101.756 93.571 101.756 c
+93.196 101.756 93.013 101.492 93.013 100.963 c
+93.013 100.595 l
+93.688 100.595 l
+93.688 100.066 l
+93.013 100.066 l
+93.013 96.612 l
+h
+94.32 98.787 m
+94.32 99.364 94.457 99.82 94.732 100.154 c
+95.016 100.497 95.386 100.669 95.849 100.669 c
+96.309 100.669 96.676 100.499 96.952 100.169 c
+97.235 99.846 97.382 99.398 97.393 98.831 c
+97.393 98.405 l
+97.393 97.835 97.25 97.38 96.967 97.038 c
+96.691 96.703 96.323 96.538 95.864 96.538 c
+95.401 96.538 95.03 96.7 94.747 97.023 c
+94.471 97.354 94.328 97.795 94.32 98.346 c
+h
+94.968 98.405 m
+94.968 98.001 95.045 97.685 95.203 97.45 c
+95.368 97.214 95.588 97.097 95.864 97.097 c
+96.43 97.097 96.724 97.509 96.746 98.332 c
+96.746 98.787 l
+96.746 99.188 96.662 99.508 96.496 99.743 c
+96.338 99.986 96.121 100.11 95.849 100.11 c
+95.585 100.11 95.368 99.986 95.203 99.743 c
+95.045 99.508 94.968 99.188 94.968 98.787 c
+h
+99.877 99.978 m
+99.789 99.996 99.689 100.007 99.583 100.007 c
+99.249 100.007 99.014 99.824 98.877 99.464 c
+98.877 96.612 l
+98.231 96.612 l
+98.231 100.595 l
+98.862 100.595 l
+98.877 100.183 l
+99.054 100.507 99.296 100.669 99.612 100.669 c
+99.719 100.669 99.807 100.647 99.877 100.61 c
+h
+103.32 101.551 m
+103.32 100.595 l
+103.922 100.595 l
+103.922 100.066 l
+103.32 100.066 l
+103.32 97.596 l
+103.32 97.439 103.342 97.322 103.394 97.243 c
+103.452 97.164 103.541 97.126 103.658 97.126 c
+103.747 97.126 103.835 97.141 103.922 97.17 c
+103.922 96.612 l
+103.776 96.564 103.621 96.538 103.467 96.538 c
+103.21 96.538 103.016 96.63 102.879 96.817 c
+102.74 97.002 102.673 97.262 102.673 97.596 c
+102.673 100.066 l
+102.071 100.066 l
+102.071 100.595 l
+102.673 100.595 l
+102.673 101.551 l
+h
+105.334 100.183 m
+105.588 100.507 105.907 100.669 106.289 100.669 c
+106.995 100.669 107.351 100.198 107.363 99.258 c
+107.363 96.612 l
+106.716 96.612 l
+106.716 99.228 l
+106.716 99.541 106.66 99.761 106.554 99.89 c
+106.444 100.015 106.289 100.081 106.083 100.081 c
+105.925 100.081 105.779 100.026 105.642 99.919 c
+105.514 99.809 105.411 99.673 105.334 99.508 c
+105.334 96.612 l
+104.687 96.612 l
+104.687 102.257 l
+105.334 102.257 l
+h
+109.744 96.538 m
+109.244 96.538 108.861 96.686 108.597 96.979 c
+108.333 97.274 108.2 97.707 108.2 98.288 c
+108.2 98.758 l
+108.2 99.354 108.325 99.82 108.582 100.154 c
+108.847 100.497 109.208 100.669 109.67 100.669 c
+110.129 100.669 110.471 100.514 110.699 100.213 c
+110.934 99.919 111.055 99.456 111.066 98.831 c
+111.066 98.405 l
+108.847 98.405 l
+108.847 98.317 l
+108.847 97.883 108.924 97.571 109.082 97.376 c
+109.247 97.189 109.479 97.097 109.773 97.097 c
+109.968 97.097 110.141 97.13 110.288 97.2 c
+110.434 97.277 110.571 97.395 110.699 97.553 c
+111.037 97.141 l
+110.75 96.736 110.32 96.538 109.744 96.538 c
+109.67 100.11 m
+109.395 100.11 109.193 100.015 109.067 99.831 c
+108.939 99.643 108.865 99.354 108.847 98.964 c
+110.42 98.964 l
+110.42 99.052 l
+110.398 99.434 110.332 99.703 110.214 99.861 c
+110.097 100.026 109.913 100.11 109.67 100.11 c
+113.657 98.787 m
+113.657 99.394 113.767 99.861 113.995 100.183 c
+114.23 100.507 114.558 100.669 114.98 100.669 c
+115.362 100.669 115.66 100.511 115.876 100.198 c
+115.876 102.257 l
+116.524 102.257 l
+116.524 96.612 l
+115.936 96.612 l
+115.892 97.038 l
+115.685 96.703 115.381 96.538 114.98 96.538 c
+114.569 96.538 114.245 96.693 114.01 97.008 c
+113.775 97.332 113.657 97.788 113.657 98.376 c
+h
+114.304 98.405 m
+114.304 97.964 114.367 97.634 114.495 97.42 c
+114.631 97.214 114.852 97.112 115.157 97.112 c
+115.48 97.112 115.718 97.274 115.876 97.596 c
+115.876 99.61 l
+115.708 99.923 115.469 100.081 115.157 100.081 c
+114.852 100.081 114.631 99.978 114.495 99.772 c
+114.367 99.566 114.304 99.243 114.304 98.802 c
+h
+118.228 96.612 -0.646 3.983 re
+118.273 101.639 m
+118.273 101.529 118.243 101.437 118.184 101.359 c
+118.126 101.29 118.03 101.257 117.906 101.257 c
+117.788 101.257 117.692 101.29 117.626 101.359 c
+117.567 101.437 117.538 101.529 117.538 101.639 c
+117.538 101.756 117.567 101.848 117.626 101.918 c
+117.692 101.995 117.788 102.036 117.906 102.036 c
+118.03 102.036 118.126 101.995 118.184 101.918 c
+118.243 101.837 118.273 101.746 118.273 101.639 c
+120.89 99.978 m
+120.801 99.996 120.702 100.007 120.595 100.007 c
+120.261 100.007 120.026 99.824 119.89 99.464 c
+119.89 96.612 l
+119.243 96.612 l
+119.243 100.595 l
+119.875 100.595 l
+119.89 100.183 l
+120.066 100.507 120.308 100.669 120.624 100.669 c
+120.732 100.669 120.819 100.647 120.89 100.61 c
+h
+122.888 96.538 m
+122.388 96.538 122.006 96.686 121.742 96.979 c
+121.477 97.274 121.345 97.707 121.345 98.288 c
+121.345 98.758 l
+121.345 99.354 121.47 99.82 121.727 100.154 c
+121.991 100.497 122.352 100.669 122.814 100.669 c
+123.274 100.669 123.616 100.514 123.844 100.213 c
+124.079 99.919 124.2 99.456 124.211 98.831 c
+124.211 98.405 l
+121.991 98.405 l
+121.991 98.317 l
+121.991 97.883 122.068 97.571 122.226 97.376 c
+122.392 97.189 122.623 97.097 122.918 97.097 c
+123.113 97.097 123.285 97.13 123.432 97.2 c
+123.579 97.277 123.715 97.395 123.844 97.553 c
+124.182 97.141 l
+123.895 96.736 123.465 96.538 122.888 96.538 c
+122.814 100.11 m
+122.539 100.11 122.337 100.015 122.212 99.831 c
+122.083 99.643 122.01 99.354 121.991 98.964 c
+123.564 98.964 l
+123.564 99.052 l
+123.543 99.434 123.477 99.703 123.358 99.861 c
+123.242 100.026 123.057 100.11 122.814 100.11 c
+126.372 97.097 m
+126.585 97.097 126.758 97.16 126.886 97.288 c
+127.022 97.424 127.096 97.615 127.107 97.862 c
+127.724 97.862 l
+127.702 97.479 127.566 97.16 127.313 96.906 c
+127.055 96.659 126.743 96.538 126.372 96.538 c
+125.879 96.538 125.505 96.689 125.24 96.994 c
+124.983 97.307 124.858 97.773 124.858 98.39 c
+124.858 98.831 l
+124.858 99.427 124.983 99.882 125.24 100.198 c
+125.505 100.511 125.879 100.669 126.372 100.669 c
+126.772 100.669 127.092 100.536 127.327 100.272 c
+127.57 100.015 127.702 99.67 127.724 99.228 c
+127.107 99.228 l
+127.084 99.522 127.011 99.743 126.886 99.89 c
+126.769 100.037 126.596 100.11 126.372 100.11 c
+126.078 100.11 125.861 100.011 125.725 99.816 c
+125.586 99.629 125.512 99.321 125.505 98.89 c
+125.505 98.376 l
+125.505 97.906 125.571 97.571 125.71 97.376 c
+125.858 97.189 126.078 97.097 126.372 97.097 c
+129.326 101.551 m
+129.326 100.595 l
+129.929 100.595 l
+129.929 100.066 l
+129.326 100.066 l
+129.326 97.596 l
+129.326 97.439 129.349 97.322 129.4 97.243 c
+129.459 97.164 129.547 97.126 129.665 97.126 c
+129.752 97.126 129.841 97.141 129.929 97.17 c
+129.929 96.612 l
+129.782 96.564 129.628 96.538 129.473 96.538 c
+129.216 96.538 129.021 96.63 128.886 96.817 c
+128.746 97.002 128.68 97.262 128.68 97.596 c
+128.68 100.066 l
+128.077 100.066 l
+128.077 100.595 l
+128.68 100.595 l
+128.68 101.551 l
+h
+130.488 98.787 m
+130.488 99.364 130.623 99.82 130.899 100.154 c
+131.182 100.497 131.553 100.669 132.017 100.669 c
+132.476 100.669 132.844 100.499 133.119 100.169 c
+133.402 99.846 133.549 99.398 133.56 98.831 c
+133.56 98.405 l
+133.56 97.835 133.417 97.38 133.133 97.038 c
+132.858 96.703 132.491 96.538 132.031 96.538 c
+131.568 96.538 131.197 96.7 130.914 97.023 c
+130.639 97.354 130.495 97.795 130.488 98.346 c
+h
+131.134 98.405 m
+131.134 98.001 131.211 97.685 131.369 97.45 c
+131.535 97.214 131.755 97.097 132.031 97.097 c
+132.597 97.097 132.891 97.509 132.913 98.332 c
+132.913 98.787 l
+132.913 99.188 132.829 99.508 132.663 99.743 c
+132.505 99.986 132.289 100.11 132.017 100.11 c
+131.751 100.11 131.535 99.986 131.369 99.743 c
+131.211 99.508 131.134 99.188 131.134 98.787 c
+h
+136.044 99.978 m
+135.956 99.996 135.857 100.007 135.75 100.007 c
+135.416 100.007 135.18 99.824 135.044 99.464 c
+135.044 96.612 l
+134.398 96.612 l
+134.398 100.595 l
+135.03 100.595 l
+135.044 100.183 l
+135.221 100.507 135.464 100.669 135.78 100.669 c
+135.886 100.669 135.974 100.647 136.044 100.61 c
+h
+137.852 97.7 m
+138.572 100.595 l
+139.263 100.595 l
+137.97 96.053 l
+137.87 95.712 137.727 95.45 137.544 95.275 c
+137.367 95.098 137.164 95.009 136.941 95.009 c
+136.852 95.009 136.738 95.032 136.603 95.068 c
+136.603 95.612 l
+136.75 95.597 l
+136.933 95.597 137.08 95.641 137.191 95.73 c
+137.297 95.818 137.386 95.976 137.455 96.2 c
+137.573 96.641 l
+136.412 100.595 l
+137.117 100.595 l
+h
+141.824 98.787 m
+141.824 99.423 141.912 100.026 142.089 100.595 c
+142.265 101.162 142.508 101.657 142.824 102.08 c
+143.019 102.344 143.206 102.535 143.383 102.653 c
+143.514 102.197 l
+143.221 101.922 142.978 101.499 142.795 100.933 c
+142.607 100.364 142.504 99.732 142.486 99.037 c
+142.486 98.743 l
+142.486 97.879 142.604 97.116 142.839 96.45 c
+143.022 95.95 143.25 95.568 143.514 95.304 c
+143.383 94.878 l
+143.154 95.036 142.93 95.285 142.706 95.627 c
+142.118 96.509 141.824 97.56 141.824 98.787 c
+146.249 96.612 m
+146.209 96.7 146.182 96.847 146.175 97.053 c
+145.94 96.707 145.646 96.538 145.293 96.538 c
+144.929 96.538 144.646 96.634 144.441 96.832 c
+144.243 97.038 144.147 97.324 144.147 97.7 c
+144.147 98.1 144.283 98.419 144.559 98.655 c
+144.831 98.897 145.205 99.022 145.675 99.022 c
+146.161 99.022 l
+146.161 99.449 l
+146.161 99.684 146.105 99.849 145.999 99.948 c
+145.889 100.055 145.727 100.11 145.514 100.11 c
+145.315 100.11 145.153 100.052 145.029 99.934 c
+144.911 99.816 144.852 99.67 144.852 99.493 c
+144.206 99.493 l
+144.206 99.688 144.264 99.878 144.382 100.066 c
+144.507 100.25 144.669 100.397 144.867 100.507 c
+145.073 100.614 145.301 100.669 145.558 100.669 c
+145.958 100.669 146.263 100.566 146.469 100.36 c
+146.682 100.154 146.797 99.861 146.807 99.478 c
+146.807 97.465 l
+146.807 97.16 146.844 96.894 146.925 96.671 c
+146.925 96.612 l
+h
+145.382 97.126 m
+145.546 97.126 145.698 97.17 145.837 97.259 c
+145.984 97.347 146.091 97.457 146.161 97.596 c
+146.161 98.537 l
+145.793 98.537 l
+145.477 98.537 145.234 98.467 145.058 98.332 c
+144.881 98.203 144.794 98.016 144.794 97.773 c
+144.794 97.545 144.838 97.38 144.926 97.274 c
+145.014 97.174 145.165 97.126 145.382 97.126 c
+148.424 100.595 m
+148.439 100.154 l
+148.692 100.497 149.016 100.669 149.409 100.669 c
+150.115 100.669 150.471 100.198 150.482 99.258 c
+150.482 96.612 l
+149.835 96.612 l
+149.835 99.228 l
+149.835 99.541 149.78 99.761 149.673 99.89 c
+149.563 100.015 149.409 100.081 149.203 100.081 c
+149.045 100.081 148.898 100.026 148.762 99.919 c
+148.634 99.809 148.53 99.673 148.453 99.508 c
+148.453 96.612 l
+147.807 96.612 l
+147.807 100.595 l
+h
+151.32 98.787 m
+151.32 99.394 151.43 99.861 151.658 100.183 c
+151.894 100.507 152.22 100.669 152.642 100.669 c
+153.025 100.669 153.323 100.511 153.54 100.198 c
+153.54 102.257 l
+154.186 102.257 l
+154.186 96.612 l
+153.598 96.612 l
+153.554 97.038 l
+153.348 96.703 153.043 96.538 152.642 96.538 c
+152.231 96.538 151.908 96.693 151.673 97.008 c
+151.437 97.332 151.32 97.788 151.32 98.376 c
+h
+151.967 98.405 m
+151.967 97.964 152.029 97.634 152.158 97.42 c
+152.293 97.214 152.514 97.112 152.819 97.112 c
+153.143 97.112 153.382 97.274 153.54 97.596 c
+153.54 99.61 l
+153.371 99.923 153.132 100.081 152.819 100.081 c
+152.514 100.081 152.293 99.978 152.158 99.772 c
+152.029 99.566 151.967 99.243 151.967 98.802 c
+h
+158.512 97.097 m
+158.724 97.097 158.897 97.16 159.026 97.288 c
+159.162 97.424 159.235 97.615 159.246 97.862 c
+159.864 97.862 l
+159.842 97.479 159.706 97.16 159.452 96.906 c
+159.195 96.659 158.882 96.538 158.512 96.538 c
+158.019 96.538 157.644 96.689 157.38 96.994 c
+157.122 97.307 156.997 97.773 156.997 98.39 c
+156.997 98.831 l
+156.997 99.427 157.122 99.882 157.38 100.198 c
+157.644 100.511 158.019 100.669 158.512 100.669 c
+158.912 100.669 159.231 100.536 159.467 100.272 c
+159.709 100.015 159.842 99.67 159.864 99.228 c
+159.246 99.228 l
+159.225 99.522 159.15 99.743 159.026 99.89 c
+158.909 100.037 158.736 100.11 158.512 100.11 c
+158.217 100.11 158.001 100.011 157.864 99.816 c
+157.725 99.629 157.652 99.321 157.644 98.89 c
+157.644 98.376 l
+157.644 97.906 157.71 97.571 157.85 97.376 c
+157.997 97.189 158.217 97.097 158.512 97.097 c
+161.261 100.183 m
+161.514 100.507 161.833 100.669 162.215 100.669 c
+162.921 100.669 163.277 100.198 163.289 99.258 c
+163.289 96.612 l
+162.642 96.612 l
+162.642 99.228 l
+162.642 99.541 162.587 99.761 162.48 99.89 c
+162.37 100.015 162.215 100.081 162.009 100.081 c
+161.851 100.081 161.705 100.026 161.569 99.919 c
+161.44 99.809 161.338 99.673 161.261 99.508 c
+161.261 96.612 l
+160.613 96.612 l
+160.613 102.257 l
+161.261 102.257 l
+h
+164.949 96.612 -0.646 3.983 re
+164.993 101.639 m
+164.993 101.529 164.964 101.437 164.906 101.359 c
+164.847 101.29 164.751 101.257 164.627 101.257 c
+164.509 101.257 164.413 101.29 164.347 101.359 c
+164.288 101.437 164.259 101.529 164.259 101.639 c
+164.259 101.756 164.288 101.848 164.347 101.918 c
+164.413 101.995 164.509 102.036 164.627 102.036 c
+164.751 102.036 164.847 101.995 164.906 101.918 c
+164.964 101.837 164.993 101.746 164.993 101.639 c
+166.67 96.612 -0.647 5.644 re
+167.551 98.787 m
+167.551 99.394 167.661 99.861 167.889 100.183 c
+168.124 100.507 168.452 100.669 168.874 100.669 c
+169.257 100.669 169.554 100.511 169.77 100.198 c
+169.77 102.257 l
+170.418 102.257 l
+170.418 96.612 l
+169.83 96.612 l
+169.786 97.038 l
+169.58 96.703 169.275 96.538 168.874 96.538 c
+168.463 96.538 168.139 96.693 167.904 97.008 c
+167.669 97.332 167.551 97.788 167.551 98.376 c
+h
+168.199 98.405 m
+168.199 97.964 168.261 97.634 168.389 97.42 c
+168.525 97.214 168.746 97.112 169.051 97.112 c
+169.374 97.112 169.612 97.274 169.77 97.596 c
+169.77 99.61 l
+169.602 99.923 169.363 100.081 169.051 100.081 c
+168.746 100.081 168.525 99.978 168.389 99.772 c
+168.261 99.566 168.199 99.243 168.199 98.802 c
+h
+173.063 99.978 m
+172.976 99.996 172.876 100.007 172.77 100.007 c
+172.435 100.007 172.199 99.824 172.064 99.464 c
+172.064 96.612 l
+171.417 96.612 l
+171.417 100.595 l
+172.049 100.595 l
+172.064 100.183 l
+172.24 100.507 172.483 100.669 172.799 100.669 c
+172.905 100.669 172.993 100.647 173.063 100.61 c
+h
+175.062 96.538 m
+174.563 96.538 174.181 96.686 173.916 96.979 c
+173.651 97.274 173.519 97.707 173.519 98.288 c
+173.519 98.758 l
+173.519 99.354 173.644 99.82 173.901 100.154 c
+174.166 100.497 174.526 100.669 174.989 100.669 c
+175.449 100.669 175.79 100.514 176.018 100.213 c
+176.253 99.919 176.374 99.456 176.386 98.831 c
+176.386 98.405 l
+174.166 98.405 l
+174.166 98.317 l
+174.166 97.883 174.243 97.571 174.401 97.376 c
+174.566 97.189 174.798 97.097 175.092 97.097 c
+175.287 97.097 175.459 97.13 175.607 97.2 c
+175.754 97.277 175.889 97.395 176.018 97.553 c
+176.356 97.141 l
+176.07 96.736 175.64 96.538 175.062 96.538 c
+174.989 100.11 m
+174.713 100.11 174.512 100.015 174.387 99.831 c
+174.258 99.643 174.184 99.354 174.166 98.964 c
+175.739 98.964 l
+175.739 99.052 l
+175.717 99.434 175.65 99.703 175.533 99.861 c
+175.415 100.026 175.231 100.11 174.989 100.11 c
+177.782 100.595 m
+177.797 100.154 l
+178.05 100.497 178.374 100.669 178.767 100.669 c
+179.472 100.669 179.829 100.198 179.84 99.258 c
+179.84 96.612 l
+179.193 96.612 l
+179.193 99.228 l
+179.193 99.541 179.137 99.761 179.031 99.89 c
+178.921 100.015 178.767 100.081 178.561 100.081 c
+178.403 100.081 178.256 100.026 178.12 99.919 c
+177.992 99.809 177.888 99.673 177.811 99.508 c
+177.811 96.612 l
+177.165 96.612 l
+177.165 100.595 l
+h
+182.622 98.787 m
+182.622 99.394 182.732 99.861 182.96 100.183 c
+183.195 100.507 183.522 100.669 183.945 100.669 c
+184.327 100.669 184.625 100.511 184.841 100.198 c
+184.841 102.257 l
+185.487 102.257 l
+185.487 96.612 l
+184.899 96.612 l
+184.856 97.038 l
+184.65 96.703 184.345 96.538 183.945 96.538 c
+183.533 96.538 183.21 96.693 182.975 97.008 c
+182.74 97.332 182.622 97.788 182.622 98.376 c
+h
+183.268 98.405 m
+183.268 97.964 183.33 97.634 183.459 97.42 c
+183.596 97.214 183.816 97.112 184.121 97.112 c
+184.444 97.112 184.683 97.274 184.841 97.596 c
+184.841 99.61 l
+184.672 99.923 184.433 100.081 184.121 100.081 c
+183.816 100.081 183.596 99.978 183.459 99.772 c
+183.33 99.566 183.268 99.243 183.268 98.802 c
+h
+187.193 96.612 -0.647 3.983 re
+187.237 101.639 m
+187.237 101.529 187.208 101.437 187.149 101.359 c
+187.09 101.29 186.994 101.257 186.869 101.257 c
+186.752 101.257 186.657 101.29 186.59 101.359 c
+186.532 101.437 186.502 101.529 186.502 101.639 c
+186.502 101.756 186.532 101.848 186.59 101.918 c
+186.657 101.995 186.752 102.036 186.869 102.036 c
+186.994 102.036 187.09 101.995 187.149 101.918 c
+187.208 101.837 187.237 101.746 187.237 101.639 c
+189.853 99.978 m
+189.765 99.996 189.666 100.007 189.56 100.007 c
+189.225 100.007 188.99 99.824 188.854 99.464 c
+188.854 96.612 l
+188.207 96.612 l
+188.207 100.595 l
+188.839 100.595 l
+188.854 100.183 l
+189.03 100.507 189.273 100.669 189.589 100.669 c
+189.695 100.669 189.784 100.647 189.853 100.61 c
+h
+191.852 96.538 m
+191.353 96.538 190.971 96.686 190.706 96.979 c
+190.441 97.274 190.309 97.707 190.309 98.288 c
+190.309 98.758 l
+190.309 99.354 190.434 99.82 190.692 100.154 c
+190.956 100.497 191.316 100.669 191.779 100.669 c
+192.238 100.669 192.581 100.514 192.808 100.213 c
+193.043 99.919 193.165 99.456 193.175 98.831 c
+193.175 98.405 l
+190.956 98.405 l
+190.956 98.317 l
+190.956 97.883 191.033 97.571 191.191 97.376 c
+191.357 97.189 191.588 97.097 191.882 97.097 c
+192.076 97.097 192.249 97.13 192.396 97.2 c
+192.543 97.277 192.679 97.395 192.808 97.553 c
+193.146 97.141 l
+192.859 96.736 192.429 96.538 191.852 96.538 c
+191.779 100.11 m
+191.503 100.11 191.301 100.015 191.176 99.831 c
+191.048 99.643 190.975 99.354 190.956 98.964 c
+192.529 98.964 l
+192.529 99.052 l
+192.506 99.434 192.44 99.703 192.323 99.861 c
+192.205 100.026 192.022 100.11 191.779 100.11 c
+195.336 97.097 m
+195.55 97.097 195.722 97.16 195.851 97.288 c
+195.987 97.424 196.06 97.615 196.071 97.862 c
+196.689 97.862 l
+196.666 97.479 196.531 97.16 196.277 96.906 c
+196.02 96.659 195.708 96.538 195.336 96.538 c
+194.844 96.538 194.469 96.689 194.204 96.994 c
+193.947 97.307 193.822 97.773 193.822 98.39 c
+193.822 98.831 l
+193.822 99.427 193.947 99.882 194.204 100.198 c
+194.469 100.511 194.844 100.669 195.336 100.669 c
+195.737 100.669 196.057 100.536 196.292 100.272 c
+196.535 100.015 196.666 99.67 196.689 99.228 c
+196.071 99.228 l
+196.049 99.522 195.976 99.743 195.851 99.89 c
+195.733 100.037 195.56 100.11 195.336 100.11 c
+195.042 100.11 194.825 100.011 194.69 99.816 c
+194.55 99.629 194.476 99.321 194.469 98.89 c
+194.469 98.376 l
+194.469 97.906 194.535 97.571 194.675 97.376 c
+194.821 97.189 195.042 97.097 195.336 97.097 c
+198.291 101.551 m
+198.291 100.595 l
+198.893 100.595 l
+198.893 100.066 l
+198.291 100.066 l
+198.291 97.596 l
+198.291 97.439 198.313 97.322 198.364 97.243 c
+198.423 97.164 198.511 97.126 198.629 97.126 c
+198.717 97.126 198.805 97.141 198.893 97.17 c
+198.893 96.612 l
+198.746 96.564 198.592 96.538 198.438 96.538 c
+198.181 96.538 197.986 96.63 197.85 96.817 c
+197.71 97.002 197.644 97.262 197.644 97.596 c
+197.644 100.066 l
+197.042 100.066 l
+197.042 100.595 l
+197.644 100.595 l
+197.644 101.551 l
+h
+199.452 98.787 m
+199.452 99.364 199.588 99.82 199.864 100.154 c
+200.147 100.497 200.518 100.669 200.98 100.669 c
+201.44 100.669 201.807 100.499 202.083 100.169 c
+202.366 99.846 202.513 99.398 202.524 98.831 c
+202.524 98.405 l
+202.524 97.835 202.38 97.38 202.098 97.038 c
+201.822 96.703 201.455 96.538 200.995 96.538 c
+200.533 96.538 200.161 96.7 199.878 97.023 c
+199.602 97.354 199.459 97.795 199.452 98.346 c
+h
+200.099 98.405 m
+200.099 98.001 200.176 97.685 200.334 97.45 c
+200.499 97.214 200.72 97.097 200.995 97.097 c
+201.561 97.097 201.855 97.509 201.877 98.332 c
+201.877 98.787 l
+201.877 99.188 201.793 99.508 201.628 99.743 c
+201.47 99.986 201.252 100.11 200.98 100.11 c
+200.716 100.11 200.499 99.986 200.334 99.743 c
+200.176 99.508 200.099 99.188 200.099 98.787 c
+h
+205.008 99.978 m
+204.92 99.996 204.821 100.007 204.714 100.007 c
+204.38 100.007 204.145 99.824 204.009 99.464 c
+204.009 96.612 l
+203.361 96.612 l
+203.361 100.595 l
+203.994 100.595 l
+204.009 100.183 l
+204.185 100.507 204.427 100.669 204.743 100.669 c
+204.851 100.669 204.938 100.647 205.008 100.61 c
+h
+206.361 96.612 -0.647 3.983 re
+206.405 101.639 m
+206.405 101.529 206.376 101.437 206.316 101.359 c
+206.258 101.29 206.162 101.257 206.037 101.257 c
+205.919 101.257 205.824 101.29 205.758 101.359 c
+205.699 101.437 205.67 101.529 205.67 101.639 c
+205.67 101.756 205.699 101.848 205.758 101.918 c
+205.824 101.995 205.919 102.036 206.037 102.036 c
+206.162 102.036 206.258 101.995 206.316 101.918 c
+206.376 101.837 206.405 101.746 206.405 101.639 c
+208.801 96.538 m
+208.3 96.538 207.918 96.686 207.654 96.979 c
+207.39 97.274 207.257 97.707 207.257 98.288 c
+207.257 98.758 l
+207.257 99.354 207.382 99.82 207.639 100.154 c
+207.904 100.497 208.264 100.669 208.727 100.669 c
+209.187 100.669 209.528 100.514 209.756 100.213 c
+209.991 99.919 210.112 99.456 210.123 98.831 c
+210.123 98.405 l
+207.904 98.405 l
+207.904 98.317 l
+207.904 97.883 207.981 97.571 208.139 97.376 c
+208.304 97.189 208.536 97.097 208.83 97.097 c
+209.025 97.097 209.198 97.13 209.345 97.2 c
+209.491 97.277 209.628 97.395 209.756 97.553 c
+210.094 97.141 l
+209.807 96.736 209.377 96.538 208.801 96.538 c
+208.727 100.11 m
+208.452 100.11 208.25 100.015 208.124 99.831 c
+207.996 99.643 207.922 99.354 207.904 98.964 c
+209.476 98.964 l
+209.476 99.052 l
+209.455 99.434 209.389 99.703 209.271 99.861 c
+209.154 100.026 208.969 100.11 208.727 100.11 c
+212.843 97.626 m
+212.843 97.773 212.788 97.894 212.681 97.993 c
+212.571 98.089 212.365 98.207 212.063 98.346 c
+211.718 98.494 211.475 98.615 211.329 98.714 c
+211.182 98.82 211.072 98.938 211.005 99.067 c
+210.935 99.192 210.902 99.35 210.902 99.537 c
+210.902 99.861 211.02 100.129 211.255 100.345 c
+211.49 100.559 211.791 100.669 212.167 100.669 c
+212.549 100.669 212.857 100.555 213.092 100.331 c
+213.328 100.103 213.445 99.816 213.445 99.464 c
+212.799 99.464 l
+212.799 99.64 212.74 99.791 212.622 99.919 c
+212.505 100.044 212.35 100.11 212.167 100.11 c
+211.968 100.11 211.818 100.055 211.711 99.948 c
+211.6 99.849 211.55 99.717 211.55 99.552 c
+211.55 99.423 211.586 99.317 211.667 99.228 c
+211.744 99.148 211.935 99.045 212.24 98.92 c
+212.718 98.733 213.048 98.545 213.225 98.361 c
+213.401 98.184 213.489 97.957 213.489 97.685 c
+213.489 97.332 213.364 97.053 213.122 96.847 c
+212.886 96.641 212.571 96.538 212.181 96.538 c
+211.758 96.538 211.421 96.656 211.167 96.891 c
+210.91 97.133 210.785 97.439 210.785 97.802 c
+211.432 97.802 l
+211.439 97.575 211.509 97.399 211.637 97.274 c
+211.762 97.156 211.946 97.097 212.181 97.097 c
+212.394 97.097 212.556 97.145 212.666 97.243 c
+212.784 97.339 212.843 97.468 212.843 97.626 c
+215.724 98.743 m
+215.724 97.656 215.477 96.689 214.989 95.847 c
+214.725 95.4 214.449 95.076 214.166 94.878 c
+214.048 95.304 l
+214.349 95.597 214.596 96.05 214.783 96.656 c
+214.978 97.262 215.077 97.927 215.077 98.655 c
+215.077 98.787 l
+215.077 99.717 214.923 100.551 214.621 101.286 c
+214.453 101.687 214.261 102.006 214.048 102.242 c
+214.166 102.653 l
+214.438 102.466 214.702 102.168 214.96 101.756 c
+215.467 100.904 215.724 99.897 215.724 98.743 c
+221.636 97.758 m
+222.239 100.595 l
+222.886 100.595 l
+221.901 96.612 l
+221.387 96.612 l
+220.608 99.464 l
+219.858 96.612 l
+219.329 96.612 l
+218.373 100.595 l
+219.005 100.595 l
+219.623 97.831 l
+220.358 100.595 l
+220.872 100.595 l
+h
+224.209 100.183 m
+224.462 100.507 224.782 100.669 225.164 100.669 c
+225.87 100.669 226.226 100.198 226.237 99.258 c
+226.237 96.612 l
+225.59 96.612 l
+225.59 99.228 l
+225.59 99.541 225.536 99.761 225.428 99.89 c
+225.318 100.015 225.164 100.081 224.958 100.081 c
+224.801 100.081 224.653 100.026 224.518 99.919 c
+224.389 99.809 224.286 99.673 224.209 99.508 c
+224.209 96.612 l
+223.562 96.612 l
+223.562 102.257 l
+224.209 102.257 l
+h
+228.618 96.538 m
+228.119 96.538 227.737 96.686 227.472 96.979 c
+227.207 97.274 227.075 97.707 227.075 98.288 c
+227.075 98.758 l
+227.075 99.354 227.2 99.82 227.458 100.154 c
+227.722 100.497 228.082 100.669 228.545 100.669 c
+229.004 100.669 229.347 100.514 229.574 100.213 c
+229.809 99.919 229.931 99.456 229.941 98.831 c
+229.941 98.405 l
+227.722 98.405 l
+227.722 98.317 l
+227.722 97.883 227.799 97.571 227.957 97.376 c
+228.123 97.189 228.354 97.097 228.648 97.097 c
+228.842 97.097 229.015 97.13 229.162 97.2 c
+229.31 97.277 229.445 97.395 229.574 97.553 c
+229.912 97.141 l
+229.625 96.736 229.195 96.538 228.618 96.538 c
+228.545 100.11 m
+228.269 100.11 228.067 100.015 227.942 99.831 c
+227.814 99.643 227.741 99.354 227.722 98.964 c
+229.295 98.964 l
+229.295 99.052 l
+229.272 99.434 229.206 99.703 229.089 99.861 c
+228.971 100.026 228.788 100.11 228.545 100.11 c
+232.367 99.978 m
+232.279 99.996 232.179 100.007 232.073 100.007 c
+231.739 100.007 231.504 99.824 231.367 99.464 c
+231.367 96.612 l
+230.721 96.612 l
+230.721 100.595 l
+231.352 100.595 l
+231.367 100.183 l
+231.543 100.507 231.786 100.669 232.102 100.669 c
+232.209 100.669 232.297 100.647 232.367 100.61 c
+h
+234.365 96.538 m
+233.866 96.538 233.484 96.686 233.22 96.979 c
+232.954 97.274 232.823 97.707 232.823 98.288 c
+232.823 98.758 l
+232.823 99.354 232.948 99.82 233.205 100.154 c
+233.469 100.497 233.829 100.669 234.292 100.669 c
+234.752 100.669 235.094 100.514 235.321 100.213 c
+235.556 99.919 235.678 99.456 235.689 98.831 c
+235.689 98.405 l
+233.469 98.405 l
+233.469 98.317 l
+233.469 97.883 233.546 97.571 233.704 97.376 c
+233.87 97.189 234.101 97.097 234.396 97.097 c
+234.59 97.097 234.762 97.13 234.91 97.2 c
+235.057 97.277 235.192 97.395 235.321 97.553 c
+235.66 97.141 l
+235.373 96.736 234.943 96.538 234.365 96.538 c
+234.292 100.11 m
+234.016 100.11 233.815 100.015 233.69 99.831 c
+233.561 99.643 233.488 99.354 233.469 98.964 c
+235.042 98.964 l
+235.042 99.052 l
+235.02 99.434 234.954 99.703 234.836 99.861 c
+234.719 100.026 234.535 100.11 234.292 100.11 c
+f
+q 1 0 0 1 238.3974 97.1409 cm
+0 0 m
+0 0.166 0.051 0.301 0.162 0.412 c
+0.268 0.518 0.415 0.573 0.602 0.573 c
+0.768 0.573 0.911 0.518 1.028 0.412 c
+1.146 0.301 1.205 0.166 1.205 0 c
+1.205 -0.169 1.146 -0.305 1.028 -0.411 c
+0.911 -0.522 0.768 -0.573 0.602 -0.573 c
+0.426 -0.573 0.279 -0.522 0.162 -0.411 c
+0.051 -0.305 0 -0.169 0 0 c
+1.969 1.588 m
+1.969 2.234 2.087 2.72 2.322 3.042 c
+2.557 3.366 2.888 3.528 3.322 3.528 c
+3.675 3.528 3.946 3.385 4.145 3.102 c
+4.189 3.454 l
+5.13 3.454 l
+5.13 -0.529 l
+5.13 -1.036 4.986 -1.426 4.704 -1.691 c
+4.417 -1.962 4.012 -2.102 3.484 -2.102 c
+3.256 -2.102 3.021 -2.057 2.778 -1.97 c
+2.543 -1.881 2.366 -1.768 2.248 -1.631 c
+2.601 -0.912 l
+2.697 -1.018 2.826 -1.103 2.984 -1.161 c
+3.138 -1.228 3.285 -1.264 3.424 -1.264 c
+3.659 -1.264 3.825 -1.205 3.925 -1.087 c
+4.031 -0.977 4.086 -0.801 4.086 -0.559 c
+4.086 -0.206 l
+3.887 -0.47 3.63 -0.603 3.307 -0.603 c
+2.884 -0.603 2.557 -0.441 2.322 -0.118 c
+2.094 0.214 1.977 0.684 1.969 1.294 c
+h
+3.013 1.323 m
+3.013 0.948 3.061 0.68 3.16 0.515 c
+3.256 0.345 3.41 0.264 3.615 0.264 c
+3.829 0.264 3.987 0.341 4.086 0.5 c
+4.086 2.396 l
+3.976 2.562 3.821 2.646 3.615 2.646 c
+3.41 2.646 3.256 2.562 3.16 2.396 c
+3.061 2.227 3.013 1.959 3.013 1.588 c
+h
+6.982 -0.529 -1.044 3.983 re
+5.894 4.484 m
+5.894 4.638 5.942 4.767 6.041 4.866 c
+6.148 4.972 6.283 5.027 6.453 5.027 c
+6.629 5.027 6.765 4.972 6.865 4.866 c
+6.971 4.767 7.025 4.638 7.025 4.484 c
+7.025 4.314 6.971 4.179 6.865 4.072 c
+6.765 3.973 6.629 3.925 6.453 3.925 c
+6.283 3.925 6.148 3.973 6.041 4.072 c
+5.942 4.179 5.894 4.314 5.894 4.484 c
+8.995 4.424 m
+8.995 3.454 l
+9.525 3.454 l
+9.525 2.66 l
+8.995 2.66 l
+8.995 0.69 l
+8.995 0.533 9.014 0.426 9.055 0.368 c
+9.102 0.309 9.186 0.279 9.304 0.279 c
+9.411 0.279 9.495 0.287 9.554 0.309 c
+9.554 -0.5 l
+9.377 -0.565 9.186 -0.603 8.981 -0.603 c
+8.305 -0.603 7.96 -0.216 7.952 0.559 c
+7.952 2.66 l
+7.496 2.66 l
+7.496 3.454 l
+7.952 3.454 l
+7.952 4.424 l
+h
+11.185 -0.529 -1.043 3.983 re
+10.098 4.484 m
+10.098 4.638 10.146 4.767 10.245 4.866 c
+10.352 4.972 10.487 5.027 10.657 5.027 c
+10.833 5.027 10.969 4.972 11.068 4.866 c
+11.175 4.767 11.23 4.638 11.23 4.484 c
+11.23 4.314 11.175 4.179 11.068 4.072 c
+10.969 3.973 10.833 3.925 10.657 3.925 c
+10.487 3.925 10.352 3.973 10.245 4.072 c
+10.146 4.179 10.098 4.314 10.098 4.484 c
+11.862 1.588 m
+11.862 2.234 11.979 2.72 12.215 3.042 c
+12.45 3.366 12.781 3.528 13.215 3.528 c
+13.567 3.528 13.839 3.385 14.038 3.102 c
+14.081 3.454 l
+15.022 3.454 l
+15.022 -0.529 l
+15.022 -1.036 14.879 -1.426 14.596 -1.691 c
+14.31 -1.962 13.905 -2.102 13.375 -2.102 c
+13.148 -2.102 12.913 -2.057 12.67 -1.97 c
+12.435 -1.881 12.259 -1.768 12.141 -1.631 c
+12.494 -0.912 l
+12.589 -1.018 12.718 -1.103 12.876 -1.161 c
+13.03 -1.228 13.177 -1.264 13.317 -1.264 c
+13.552 -1.264 13.718 -1.205 13.817 -1.087 c
+13.923 -0.977 13.978 -0.801 13.978 -0.559 c
+13.978 -0.206 l
+13.78 -0.47 13.523 -0.603 13.2 -0.603 c
+12.777 -0.603 12.45 -0.441 12.215 -0.118 c
+11.987 0.214 11.869 0.684 11.862 1.294 c
+h
+12.905 1.323 m
+12.905 0.948 12.953 0.68 13.053 0.515 c
+13.148 0.345 13.302 0.264 13.508 0.264 c
+13.722 0.264 13.88 0.341 13.978 0.5 c
+13.978 2.396 l
+13.868 2.562 13.714 2.646 13.508 2.646 c
+13.302 2.646 13.148 2.562 13.053 2.396 c
+12.953 2.227 12.905 1.959 12.905 1.588 c
+h
+16.742 3.454 m
+16.771 3.057 l
+17.007 3.37 17.308 3.528 17.683 3.528 c
+18.366 3.528 18.719 3.046 18.741 2.087 c
+18.741 -0.529 l
+17.697 -0.529 l
+17.697 2.014 l
+17.697 2.238 17.661 2.4 17.595 2.499 c
+17.525 2.595 17.407 2.646 17.242 2.646 c
+17.055 2.646 16.907 2.55 16.801 2.367 c
+16.801 -0.529 l
+15.757 -0.529 l
+15.757 3.454 l
+h
+19.373 1.588 m
+19.373 2.194 19.513 2.668 19.8 3.013 c
+20.082 3.356 20.475 3.528 20.976 3.528 c
+21.483 3.528 21.879 3.356 22.166 3.013 c
+22.449 2.668 22.592 2.194 22.592 1.588 c
+22.592 1.323 l
+22.592 0.724 22.449 0.254 22.166 -0.088 c
+21.879 -0.434 21.483 -0.603 20.976 -0.603 c
+20.465 -0.603 20.068 -0.434 19.785 -0.088 c
+19.509 0.254 19.373 0.728 19.373 1.338 c
+h
+20.417 1.323 m
+20.417 0.617 20.6 0.264 20.976 0.264 c
+21.328 0.264 21.519 0.559 21.549 1.147 c
+21.549 1.588 l
+21.549 1.947 21.497 2.219 21.402 2.396 c
+21.302 2.572 21.159 2.66 20.976 2.66 c
+20.799 2.66 20.66 2.572 20.564 2.396 c
+20.465 2.219 20.417 1.947 20.417 1.588 c
+h
+25.194 2.44 m
+24.856 2.469 l
+24.569 2.469 24.378 2.344 24.282 2.102 c
+24.282 -0.529 l
+23.239 -0.529 l
+23.239 3.454 l
+24.209 3.454 l
+24.238 3.013 l
+24.404 3.356 24.635 3.528 24.93 3.528 c
+25.047 3.528 25.138 3.506 25.209 3.469 c
+h
+27.266 -0.603 m
+26.738 -0.603 26.318 -0.448 26.017 -0.133 c
+25.723 0.191 25.576 0.651 25.576 1.249 c
+25.576 1.558 l
+25.576 2.183 25.712 2.668 25.988 3.013 c
+26.26 3.356 26.653 3.528 27.164 3.528 c
+27.663 3.528 28.034 3.366 28.281 3.042 c
+28.535 2.72 28.666 2.242 28.678 1.617 c
+28.678 1.118 l
+26.605 1.118 l
+26.623 0.823 26.686 0.607 26.796 0.47 c
+26.914 0.331 27.093 0.264 27.34 0.264 c
+27.681 0.264 27.972 0.382 28.207 0.617 c
+28.619 -0.015 l
+28.49 -0.191 28.303 -0.334 28.06 -0.441 c
+27.814 -0.548 27.55 -0.603 27.266 -0.603 c
+26.62 1.837 m
+27.648 1.837 l
+27.648 1.941 l
+27.648 2.176 27.608 2.352 27.531 2.469 c
+27.461 2.595 27.332 2.66 27.149 2.66 c
+26.973 2.66 26.84 2.591 26.752 2.454 c
+26.671 2.326 26.627 2.12 26.62 1.837 c
+f
+Q
+q 1 0 0 1 37.7885 87.2048 cm
+0 0 m
+0 3.453 l
+-0.515 3.453 l
+-0.515 3.983 l
+0 3.983 l
+0 4.351 l
+0.007 4.781 0.12 5.115 0.338 5.35 c
+0.562 5.593 0.874 5.718 1.278 5.718 c
+1.425 5.718 1.565 5.695 1.705 5.659 c
+1.851 5.618 2.002 5.564 2.16 5.497 c
+2.042 4.924 l
+1.807 5.049 1.565 5.115 1.323 5.115 c
+1.076 5.115 0.903 5.045 0.808 4.909 c
+0.708 4.781 0.661 4.586 0.661 4.321 c
+0.661 3.983 l
+1.308 3.983 l
+1.308 3.453 l
+0.661 3.453 l
+0.661 0 l
+h
+2.469 0 -0.647 3.983 re
+4.218 0 -0.647 5.644 re
+6.659 -0.074 m
+6.158 -0.074 5.776 0.073 5.512 0.367 c
+5.247 0.661 5.115 1.095 5.115 1.675 c
+5.115 2.146 l
+5.115 2.741 5.24 3.208 5.497 3.542 c
+5.762 3.884 6.121 4.056 6.585 4.056 c
+7.044 4.056 7.386 3.902 7.613 3.601 c
+7.849 3.307 7.97 2.844 7.981 2.219 c
+7.981 1.793 l
+5.762 1.793 l
+5.762 1.705 l
+5.762 1.271 5.839 0.959 5.997 0.764 c
+6.162 0.577 6.393 0.484 6.688 0.484 c
+6.882 0.484 7.056 0.517 7.202 0.588 c
+7.349 0.665 7.485 0.783 7.613 0.941 c
+7.952 0.529 l
+7.665 0.124 7.235 -0.074 6.659 -0.074 c
+6.585 3.498 m
+6.31 3.498 6.107 3.403 5.982 3.218 c
+5.853 3.031 5.78 2.741 5.762 2.352 c
+7.334 2.352 l
+7.334 2.439 l
+7.312 2.822 7.247 3.09 7.129 3.248 c
+7.011 3.414 6.827 3.498 6.585 3.498 c
+11.185 0 -0.646 3.983 re
+11.23 5.026 m
+11.23 4.916 11.2 4.825 11.141 4.747 c
+11.083 4.677 10.987 4.644 10.862 4.644 c
+10.744 4.644 10.649 4.677 10.583 4.747 c
+10.524 4.825 10.495 4.916 10.495 5.026 c
+10.495 5.144 10.524 5.236 10.583 5.306 c
+10.649 5.383 10.744 5.423 10.862 5.423 c
+10.987 5.423 11.083 5.383 11.141 5.306 c
+11.2 5.225 11.23 5.134 11.23 5.026 c
+14.14 1.014 m
+14.14 1.161 14.085 1.282 13.978 1.381 c
+13.868 1.477 13.662 1.595 13.361 1.734 c
+13.016 1.881 12.773 2.003 12.626 2.102 c
+12.479 2.208 12.369 2.326 12.303 2.454 c
+12.232 2.58 12.2 2.738 12.2 2.925 c
+12.2 3.248 12.317 3.516 12.552 3.733 c
+12.787 3.946 13.089 4.056 13.464 4.056 c
+13.846 4.056 14.154 3.943 14.39 3.719 c
+14.625 3.491 14.742 3.204 14.742 2.851 c
+14.096 2.851 l
+14.096 3.027 14.037 3.179 13.919 3.307 c
+13.802 3.432 13.647 3.498 13.464 3.498 c
+13.265 3.498 13.115 3.443 13.009 3.336 c
+12.898 3.237 12.847 3.104 12.847 2.94 c
+12.847 2.811 12.883 2.705 12.964 2.616 c
+13.041 2.535 13.232 2.433 13.537 2.308 c
+14.015 2.12 14.346 1.932 14.522 1.749 c
+14.699 1.572 14.787 1.344 14.787 1.072 c
+14.787 0.72 14.662 0.44 14.42 0.235 c
+14.184 0.029 13.868 -0.074 13.479 -0.074 c
+13.056 -0.074 12.718 0.043 12.465 0.278 c
+12.207 0.521 12.082 0.827 12.082 1.19 c
+12.729 1.19 l
+12.737 0.962 12.806 0.786 12.935 0.661 c
+13.059 0.544 13.244 0.484 13.479 0.484 c
+13.692 0.484 13.853 0.532 13.963 0.631 c
+14.081 0.727 14.14 0.856 14.14 1.014 c
+20.226 1.793 m
+20.226 1.165 20.108 0.694 19.873 0.382 c
+19.645 0.077 19.328 -0.074 18.917 -0.074 c
+18.513 -0.074 18.204 0.077 17.992 0.382 c
+17.992 -1.529 l
+17.344 -1.529 l
+17.344 3.983 l
+17.932 3.983 l
+17.977 3.542 l
+18.19 3.884 18.499 4.056 18.902 4.056 c
+19.343 4.056 19.671 3.902 19.887 3.601 c
+20.101 3.296 20.215 2.84 20.226 2.234 c
+h
+19.579 2.175 m
+19.579 2.616 19.509 2.94 19.373 3.145 c
+19.233 3.358 19.012 3.469 18.711 3.469 c
+18.395 3.469 18.156 3.314 17.992 3.013 c
+17.992 0.941 l
+18.156 0.635 18.395 0.484 18.711 0.484 c
+19.006 0.484 19.218 0.588 19.359 0.793 c
+19.494 1.007 19.567 1.337 19.579 1.778 c
+h
+21.769 0 -0.646 5.644 re
+24.826 0 m
+24.786 0.087 24.76 0.235 24.753 0.44 c
+24.518 0.095 24.224 -0.074 23.871 -0.074 c
+23.507 -0.074 23.224 0.022 23.018 0.22 c
+22.82 0.426 22.724 0.712 22.724 1.087 c
+22.724 1.488 22.86 1.807 23.136 2.042 c
+23.407 2.285 23.783 2.41 24.253 2.41 c
+24.738 2.41 l
+24.738 2.836 l
+24.738 3.072 24.683 3.237 24.577 3.336 c
+24.466 3.443 24.305 3.498 24.091 3.498 c
+23.893 3.498 23.731 3.439 23.606 3.322 c
+23.488 3.204 23.43 3.057 23.43 2.881 c
+22.783 2.881 l
+22.783 3.075 22.842 3.266 22.96 3.453 c
+23.085 3.638 23.246 3.785 23.444 3.895 c
+23.65 4.002 23.878 4.056 24.136 4.056 c
+24.536 4.056 24.841 3.954 25.047 3.748 c
+25.26 3.542 25.374 3.248 25.385 2.865 c
+25.385 0.852 l
+25.385 0.548 25.422 0.282 25.503 0.058 c
+25.503 0 l
+h
+23.959 0.514 m
+24.124 0.514 24.275 0.558 24.415 0.646 c
+24.562 0.735 24.668 0.845 24.738 0.984 c
+24.738 1.925 l
+24.371 1.925 l
+24.055 1.925 23.812 1.855 23.636 1.72 c
+23.459 1.591 23.371 1.404 23.371 1.161 c
+23.371 0.933 23.415 0.768 23.503 0.661 c
+23.592 0.562 23.742 0.514 23.959 0.514 c
+27.766 0.484 m
+27.979 0.484 28.152 0.548 28.281 0.675 c
+28.417 0.812 28.49 1.003 28.501 1.249 c
+29.119 1.249 l
+29.096 0.866 28.961 0.548 28.707 0.294 c
+28.45 0.047 28.138 -0.074 27.766 -0.074 c
+27.274 -0.074 26.899 0.077 26.634 0.382 c
+26.377 0.694 26.252 1.161 26.252 1.778 c
+26.252 2.219 l
+26.252 2.815 26.377 3.27 26.634 3.586 c
+26.899 3.898 27.274 4.056 27.766 4.056 c
+28.167 4.056 28.487 3.924 28.722 3.659 c
+28.964 3.403 29.096 3.057 29.119 2.616 c
+28.501 2.616 l
+28.479 2.91 28.406 3.131 28.281 3.278 c
+28.163 3.424 27.99 3.498 27.766 3.498 c
+27.472 3.498 27.255 3.399 27.12 3.204 c
+26.979 3.017 26.906 2.708 26.899 2.278 c
+26.899 1.764 l
+26.899 1.294 26.965 0.959 27.105 0.764 c
+27.251 0.577 27.472 0.484 27.766 0.484 c
+31.294 -0.074 m
+30.794 -0.074 30.412 0.073 30.147 0.367 c
+29.883 0.661 29.751 1.095 29.751 1.675 c
+29.751 2.146 l
+29.751 2.741 29.875 3.208 30.133 3.542 c
+30.397 3.884 30.757 4.056 31.22 4.056 c
+31.679 4.056 32.022 3.902 32.249 3.601 c
+32.485 3.307 32.606 2.844 32.616 2.219 c
+32.616 1.793 l
+30.397 1.793 l
+30.397 1.705 l
+30.397 1.271 30.474 0.959 30.632 0.764 c
+30.798 0.577 31.029 0.484 31.323 0.484 c
+31.518 0.484 31.691 0.517 31.837 0.588 c
+31.985 0.665 32.121 0.783 32.249 0.941 c
+32.587 0.529 l
+32.301 0.124 31.87 -0.074 31.294 -0.074 c
+31.22 3.498 m
+30.945 3.498 30.742 3.403 30.617 3.218 c
+30.489 3.031 30.416 2.741 30.397 2.352 c
+31.97 2.352 l
+31.97 2.439 l
+31.948 2.822 31.882 3.09 31.764 3.248 c
+31.646 3.414 31.463 3.498 31.22 3.498 c
+33.264 2.175 m
+33.264 2.782 33.374 3.248 33.601 3.571 c
+33.837 3.895 34.164 4.056 34.586 4.056 c
+34.968 4.056 35.266 3.898 35.483 3.586 c
+35.483 5.644 l
+36.13 5.644 l
+36.13 0 l
+35.542 0 l
+35.498 0.426 l
+35.292 0.091 34.987 -0.074 34.586 -0.074 c
+34.175 -0.074 33.852 0.081 33.616 0.396 c
+33.381 0.72 33.264 1.176 33.264 1.764 c
+h
+33.91 1.793 m
+33.91 1.352 33.973 1.022 34.102 0.808 c
+34.237 0.602 34.457 0.5 34.763 0.5 c
+35.086 0.5 35.325 0.661 35.483 0.984 c
+35.483 2.998 l
+35.314 3.31 35.075 3.469 34.763 3.469 c
+34.457 3.469 34.237 3.366 34.102 3.16 c
+33.973 2.954 33.91 2.63 33.91 2.19 c
+h
+37.173 0.353 m
+37.173 0.47 37.206 0.565 37.277 0.646 c
+37.343 0.723 37.445 0.764 37.585 0.764 c
+37.732 0.764 37.838 0.723 37.908 0.646 c
+37.985 0.565 38.026 0.47 38.026 0.353 c
+38.026 0.242 37.985 0.151 37.908 0.073 c
+37.838 -0.004 37.732 -0.044 37.585 -0.044 c
+37.445 -0.044 37.343 -0.004 37.277 0.073 c
+37.206 0.151 37.173 0.242 37.173 0.353 c
+f
+Q
+q 1 0 0 1 37.6521 155.6032 cm
+0 0 m
+2.646 4.835 l
+3.204 4.835 l
+0.588 0 l
+h
+6.059 0.515 m
+7.279 0.515 l
+7.279 0.058 l
+4.119 0.058 l
+4.119 0.515 l
+5.486 0.515 l
+5.486 4.38 l
+4.546 4.38 l
+4.546 4.835 l
+6.059 4.835 l
+h
+11.281 1.808 m
+11.281 1.502 11.241 1.234 11.164 0.999 c
+11.094 0.771 10.992 0.588 10.855 0.44 c
+10.726 0.294 10.565 0.18 10.37 0.103 c
+10.172 0.037 9.951 0 9.708 0 c
+9.473 0 9.261 0.037 9.076 0.103 c
+8.889 0.18 8.727 0.294 8.592 0.44 c
+8.452 0.588 8.345 0.771 8.268 0.999 c
+8.199 1.223 8.166 1.492 8.166 1.808 c
+8.166 2.403 8.301 2.851 8.577 3.145 c
+8.849 3.447 9.238 3.601 9.739 3.601 c
+10.256 3.601 10.643 3.447 10.899 3.145 c
+11.152 2.851 11.281 2.403 11.281 1.808 c
+10.679 1.808 m
+10.679 2.072 10.653 2.293 10.605 2.469 c
+10.554 2.645 10.487 2.782 10.4 2.881 c
+10.319 2.987 10.223 3.061 10.105 3.102 c
+9.995 3.149 9.874 3.175 9.739 3.175 c
+9.598 3.175 9.473 3.149 9.356 3.102 c
+9.238 3.061 9.136 2.987 9.047 2.881 c
+8.966 2.77 8.904 2.631 8.856 2.454 c
+8.804 2.278 8.783 2.061 8.783 1.808 c
+8.783 1.532 8.804 1.308 8.856 1.132 c
+8.904 0.955 8.966 0.812 9.047 0.706 c
+9.136 0.595 9.231 0.521 9.342 0.484 c
+9.459 0.444 9.58 0.426 9.708 0.426 c
+9.845 0.426 9.974 0.444 10.091 0.484 c
+10.209 0.521 10.311 0.595 10.4 0.706 c
+10.487 0.812 10.554 0.955 10.605 1.132 c
+10.653 1.308 10.679 1.532 10.679 1.808 c
+13.799 -1.309 m
+13.6 -1.309 13.431 -1.283 13.284 -1.235 c
+13.137 -1.195 13.009 -1.135 12.902 -1.058 c
+12.792 -0.989 12.704 -0.9 12.638 -0.794 c
+12.579 -0.684 12.534 -0.566 12.505 -0.441 c
+13.093 -0.368 l
+13.13 -0.522 13.211 -0.647 13.328 -0.736 c
+13.454 -0.823 13.615 -0.867 13.814 -0.867 c
+13.931 -0.867 14.038 -0.846 14.136 -0.809 c
+14.232 -0.779 14.317 -0.721 14.387 -0.632 c
+14.453 -0.551 14.508 -0.449 14.549 -0.324 c
+14.585 -0.195 14.607 -0.037 14.607 0.147 c
+14.607 0.764 l
+14.566 0.683 14.512 0.602 14.445 0.515 c
+14.387 0.434 14.306 0.359 14.21 0.294 c
+14.122 0.235 14.019 0.183 13.901 0.147 c
+13.784 0.118 13.652 0.103 13.504 0.103 c
+13.277 0.103 13.086 0.135 12.931 0.205 c
+12.785 0.272 12.66 0.374 12.564 0.515 c
+12.465 0.661 12.391 0.841 12.343 1.058 c
+12.292 1.282 12.27 1.535 12.27 1.822 c
+12.27 2.105 12.292 2.356 12.343 2.572 c
+12.391 2.786 12.465 2.969 12.564 3.116 c
+12.66 3.27 12.792 3.388 12.961 3.469 c
+13.126 3.546 13.328 3.586 13.564 3.586 c
+13.806 3.586 14.019 3.528 14.196 3.41 c
+14.372 3.299 14.508 3.145 14.607 2.94 c
+14.622 2.94 l
+14.622 3.116 l
+14.622 3.307 l
+14.629 3.366 14.637 3.414 14.637 3.454 c
+14.644 3.501 14.651 3.532 14.651 3.542 c
+15.21 3.542 l
+15.199 3.52 15.195 3.487 15.195 3.439 c
+15.195 3.388 15.188 3.329 15.181 3.262 c
+15.181 3.057 l
+15.181 2.822 l
+15.181 0.162 l
+15.181 -0.327 15.067 -0.695 14.842 -0.941 c
+14.614 -1.183 14.269 -1.309 13.799 -1.309 c
+14.607 1.837 m
+14.607 2.072 14.581 2.271 14.533 2.439 c
+14.483 2.616 14.416 2.752 14.328 2.851 c
+14.24 2.958 14.14 3.035 14.034 3.087 c
+13.924 3.135 13.818 3.16 13.71 3.16 c
+13.564 3.16 13.435 3.135 13.328 3.087 c
+13.23 3.035 13.145 2.958 13.078 2.851 c
+13.009 2.752 12.954 2.616 12.917 2.439 c
+12.887 2.271 12.873 2.072 12.873 1.837 c
+12.873 1.58 12.887 1.371 12.917 1.205 c
+12.954 1.036 13.005 0.9 13.064 0.793 c
+13.13 0.694 13.218 0.625 13.328 0.588 c
+13.435 0.548 13.556 0.529 13.696 0.529 c
+13.814 0.529 13.924 0.548 14.034 0.588 c
+14.14 0.635 14.232 0.709 14.313 0.808 c
+14.402 0.914 14.468 1.051 14.519 1.22 c
+14.578 1.385 14.607 1.591 14.607 1.837 c
+19.289 1.058 m
+19.289 0.889 19.252 0.738 19.186 0.602 c
+19.127 0.474 19.032 0.367 18.907 0.279 c
+18.789 0.191 18.642 0.121 18.466 0.073 c
+18.296 0.025 18.102 0 17.878 0 c
+17.672 0 17.485 0.014 17.319 0.044 c
+17.161 0.073 17.018 0.118 16.893 0.176 c
+16.775 0.242 16.673 0.33 16.584 0.44 c
+16.503 0.558 16.452 0.694 16.422 0.852 c
+16.922 0.955 l
+16.952 0.837 16.995 0.742 17.055 0.675 c
+17.113 0.606 17.18 0.551 17.261 0.515 c
+17.338 0.474 17.425 0.448 17.525 0.44 c
+17.631 0.43 17.749 0.426 17.878 0.426 c
+18.003 0.426 18.117 0.434 18.216 0.455 c
+18.323 0.474 18.414 0.503 18.495 0.544 c
+18.572 0.592 18.631 0.65 18.672 0.72 c
+18.719 0.786 18.745 0.87 18.745 0.97 c
+18.745 1.076 18.716 1.165 18.657 1.234 c
+18.605 1.3 18.532 1.356 18.437 1.396 c
+18.348 1.444 18.234 1.484 18.098 1.514 c
+17.97 1.543 17.834 1.58 17.687 1.631 c
+17.547 1.66 17.411 1.693 17.275 1.734 c
+17.136 1.782 17.014 1.841 16.908 1.911 c
+16.797 1.977 16.709 2.065 16.643 2.175 c
+16.584 2.281 16.555 2.418 16.555 2.587 c
+16.555 2.899 16.665 3.145 16.893 3.322 c
+17.117 3.498 17.444 3.586 17.878 3.586 c
+18.054 3.586 18.216 3.572 18.363 3.542 c
+18.51 3.513 18.635 3.461 18.745 3.395 c
+18.863 3.326 18.958 3.237 19.039 3.131 c
+19.116 3.031 19.171 2.91 19.2 2.763 c
+18.686 2.69 l
+18.664 2.786 18.631 2.866 18.583 2.925 c
+18.532 2.984 18.473 3.027 18.407 3.057 c
+18.337 3.094 18.252 3.119 18.157 3.131 c
+18.069 3.149 17.973 3.16 17.878 3.16 c
+17.356 3.16 17.099 2.998 17.099 2.675 c
+17.099 2.576 17.117 2.499 17.157 2.439 c
+17.205 2.381 17.267 2.326 17.348 2.278 c
+17.437 2.238 17.54 2.204 17.658 2.175 c
+17.775 2.146 17.899 2.117 18.04 2.087 c
+18.175 2.046 18.319 2.003 18.466 1.955 c
+18.613 1.914 18.745 1.855 18.863 1.778 c
+18.988 1.708 19.09 1.616 19.171 1.499 c
+19.248 1.381 19.289 1.234 19.289 1.058 c
+20.307 0 m
+22.952 4.835 l
+23.511 4.835 l
+20.895 0 l
+h
+26.161 3.881 m
+27.013 4.203 l
+27.145 3.792 l
+26.249 3.557 l
+26.836 2.749 l
+26.455 2.514 l
+25.969 3.351 l
+25.47 2.528 l
+25.088 2.749 l
+25.705 3.557 l
+24.793 3.792 l
+24.941 4.218 l
+25.808 3.865 l
+25.764 4.821 l
+26.204 4.821 l
+h
+f
+Q
+q 1 0 0 1 39.5044 148.4743 cm
+0 0 m
+-0.485 0 l
+-0.559 3.057 l
+0.073 3.057 l
+h
+-0.559 -0.632 0.617 -0.647 re
+-0.559 -1.279 m
+4.207 -0.823 m
+5.427 -0.823 l
+5.427 -1.279 l
+2.267 -1.279 l
+2.267 -0.823 l
+3.634 -0.823 l
+3.634 3.042 l
+2.693 3.042 l
+2.693 3.498 l
+4.207 3.498 l
+h
+9.429 0.47 m
+9.429 0.165 9.389 -0.103 9.311 -0.339 c
+9.242 -0.566 9.139 -0.75 9.003 -0.897 c
+8.874 -1.044 8.713 -1.158 8.517 -1.235 c
+8.32 -1.301 8.099 -1.338 7.856 -1.338 c
+7.621 -1.338 7.408 -1.301 7.224 -1.235 c
+7.037 -1.158 6.875 -1.044 6.739 -0.897 c
+6.599 -0.75 6.493 -0.566 6.416 -0.339 c
+6.346 -0.115 6.313 0.154 6.313 0.47 c
+6.313 1.065 6.449 1.514 6.724 1.807 c
+6.996 2.109 7.386 2.263 7.886 2.263 c
+8.404 2.263 8.79 2.109 9.047 1.807 c
+9.3 1.514 9.429 1.065 9.429 0.47 c
+8.827 0.47 m
+8.827 0.735 8.801 0.955 8.753 1.132 c
+8.702 1.308 8.635 1.444 8.548 1.543 c
+8.467 1.649 8.371 1.723 8.253 1.764 c
+8.143 1.811 8.022 1.837 7.886 1.837 c
+7.746 1.837 7.621 1.811 7.503 1.764 c
+7.386 1.723 7.283 1.649 7.195 1.543 c
+7.114 1.433 7.052 1.294 7.004 1.117 c
+6.952 0.941 6.93 0.723 6.93 0.47 c
+6.93 0.195 6.952 -0.03 7.004 -0.206 c
+7.052 -0.383 7.114 -0.526 7.195 -0.632 c
+7.283 -0.743 7.379 -0.817 7.489 -0.853 c
+7.607 -0.894 7.728 -0.912 7.856 -0.912 c
+7.993 -0.912 8.121 -0.894 8.239 -0.853 c
+8.357 -0.817 8.459 -0.743 8.548 -0.632 c
+8.635 -0.526 8.702 -0.383 8.753 -0.206 c
+8.801 -0.03 8.827 0.195 8.827 0.47 c
+11.946 -2.646 m
+11.748 -2.646 11.579 -2.621 11.432 -2.573 c
+11.285 -2.532 11.156 -2.473 11.05 -2.396 c
+10.94 -2.326 10.851 -2.238 10.786 -2.132 c
+10.726 -2.022 10.682 -1.904 10.653 -1.779 c
+11.241 -1.706 l
+11.278 -1.86 11.358 -1.985 11.476 -2.073 c
+11.601 -2.161 11.763 -2.205 11.962 -2.205 c
+12.079 -2.205 12.185 -2.183 12.284 -2.147 c
+12.38 -2.117 12.465 -2.058 12.534 -1.97 c
+12.6 -1.889 12.656 -1.786 12.696 -1.661 c
+12.733 -1.532 12.755 -1.374 12.755 -1.191 c
+12.755 -0.574 l
+12.714 -0.655 12.66 -0.736 12.593 -0.823 c
+12.534 -0.904 12.454 -0.978 12.358 -1.044 c
+12.27 -1.103 12.167 -1.154 12.049 -1.191 c
+11.931 -1.22 11.8 -1.235 11.652 -1.235 c
+11.424 -1.235 11.233 -1.202 11.079 -1.133 c
+10.932 -1.066 10.807 -0.963 10.711 -0.823 c
+10.612 -0.676 10.539 -0.497 10.491 -0.279 c
+10.439 -0.055 10.418 0.198 10.418 0.484 c
+10.418 0.768 10.439 1.018 10.491 1.234 c
+10.539 1.448 10.612 1.631 10.711 1.778 c
+10.807 1.932 10.94 2.05 11.108 2.131 c
+11.274 2.208 11.476 2.248 11.711 2.248 c
+11.954 2.248 12.167 2.19 12.343 2.072 c
+12.519 1.961 12.656 1.807 12.755 1.602 c
+12.77 1.602 l
+12.77 1.778 l
+12.77 1.969 l
+12.777 2.028 12.785 2.076 12.785 2.117 c
+12.791 2.164 12.799 2.194 12.799 2.204 c
+13.358 2.204 l
+13.346 2.183 13.343 2.15 13.343 2.102 c
+13.343 2.05 13.336 1.992 13.328 1.925 c
+13.328 1.72 l
+13.328 1.484 l
+13.328 -1.176 l
+13.328 -1.665 13.215 -2.033 12.99 -2.278 c
+12.762 -2.521 12.417 -2.646 11.946 -2.646 c
+12.755 0.5 m
+12.755 0.735 12.729 0.933 12.681 1.102 c
+12.63 1.278 12.564 1.414 12.476 1.514 c
+12.388 1.62 12.288 1.697 12.182 1.749 c
+12.072 1.797 11.965 1.822 11.858 1.822 c
+11.711 1.822 11.582 1.797 11.476 1.749 c
+11.377 1.697 11.293 1.62 11.226 1.514 c
+11.156 1.414 11.102 1.278 11.065 1.102 c
+11.035 0.933 11.021 0.735 11.021 0.5 c
+11.021 0.242 11.035 0.033 11.065 -0.133 c
+11.102 -0.302 11.152 -0.437 11.212 -0.545 c
+11.278 -0.643 11.366 -0.713 11.476 -0.75 c
+11.582 -0.79 11.704 -0.809 11.844 -0.809 c
+11.962 -0.809 12.072 -0.79 12.182 -0.75 c
+12.288 -0.703 12.38 -0.628 12.461 -0.53 c
+12.549 -0.423 12.615 -0.287 12.667 -0.118 c
+12.725 0.047 12.755 0.253 12.755 0.5 c
+17.437 -0.279 m
+17.437 -0.449 17.4 -0.599 17.334 -0.736 c
+17.275 -0.864 17.18 -0.971 17.055 -1.058 c
+16.937 -1.147 16.789 -1.216 16.613 -1.264 c
+16.444 -1.312 16.249 -1.338 16.025 -1.338 c
+15.819 -1.338 15.632 -1.324 15.467 -1.294 c
+15.309 -1.264 15.166 -1.22 15.041 -1.162 c
+14.923 -1.096 14.82 -1.008 14.732 -0.897 c
+14.651 -0.78 14.599 -0.643 14.57 -0.485 c
+15.07 -0.383 l
+15.1 -0.5 15.143 -0.595 15.202 -0.662 c
+15.261 -0.732 15.327 -0.786 15.408 -0.823 c
+15.486 -0.864 15.573 -0.89 15.673 -0.897 c
+15.779 -0.908 15.897 -0.912 16.025 -0.912 c
+16.151 -0.912 16.264 -0.904 16.363 -0.882 c
+16.47 -0.864 16.562 -0.834 16.643 -0.794 c
+16.72 -0.746 16.779 -0.688 16.819 -0.618 c
+16.867 -0.551 16.893 -0.468 16.893 -0.368 c
+16.893 -0.262 16.864 -0.173 16.804 -0.103 c
+16.753 -0.038 16.679 0.018 16.584 0.058 c
+16.496 0.106 16.382 0.147 16.246 0.176 c
+16.118 0.205 15.981 0.242 15.835 0.294 c
+15.694 0.323 15.559 0.356 15.422 0.396 c
+15.283 0.444 15.162 0.503 15.056 0.573 c
+14.945 0.639 14.857 0.727 14.79 0.837 c
+14.732 0.944 14.703 1.08 14.703 1.249 c
+14.703 1.562 14.813 1.807 15.041 1.984 c
+15.264 2.16 15.592 2.248 16.025 2.248 c
+16.201 2.248 16.363 2.234 16.511 2.204 c
+16.658 2.175 16.783 2.123 16.893 2.057 c
+17.01 1.988 17.105 1.899 17.186 1.793 c
+17.264 1.693 17.319 1.572 17.348 1.425 c
+16.834 1.352 l
+16.812 1.448 16.779 1.529 16.731 1.587 c
+16.679 1.646 16.621 1.69 16.554 1.72 c
+16.485 1.756 16.4 1.782 16.305 1.793 c
+16.216 1.811 16.121 1.822 16.025 1.822 c
+15.503 1.822 15.247 1.66 15.247 1.337 c
+15.247 1.238 15.264 1.161 15.305 1.102 c
+15.353 1.043 15.415 0.988 15.496 0.941 c
+15.584 0.9 15.688 0.866 15.805 0.837 c
+15.923 0.808 16.047 0.779 16.187 0.749 c
+16.323 0.708 16.467 0.665 16.613 0.617 c
+16.76 0.577 16.893 0.517 17.01 0.44 c
+17.136 0.371 17.238 0.278 17.319 0.161 c
+17.396 0.043 17.437 -0.103 17.437 -0.279 c
+18.454 -1.338 m
+21.1 3.498 l
+21.659 3.498 l
+19.042 -1.338 l
+h
+23.75 -0.324 0.75 -0.956 re
+23.75 -1.279 m
+28.193 -2.646 m
+27.995 -2.646 27.825 -2.621 27.678 -2.573 c
+27.531 -2.532 27.403 -2.473 27.296 -2.396 c
+27.186 -2.326 27.097 -2.238 27.031 -2.132 c
+26.973 -2.022 26.929 -1.904 26.9 -1.779 c
+27.487 -1.706 l
+27.524 -1.86 27.605 -1.985 27.723 -2.073 c
+27.847 -2.161 28.009 -2.205 28.207 -2.205 c
+28.325 -2.205 28.431 -2.183 28.531 -2.147 c
+28.626 -2.117 28.71 -2.058 28.781 -1.97 c
+28.847 -1.889 28.901 -1.786 28.942 -1.661 c
+28.979 -1.532 29.001 -1.374 29.001 -1.191 c
+29.001 -0.574 l
+28.961 -0.655 28.905 -0.736 28.839 -0.823 c
+28.781 -0.904 28.7 -0.978 28.604 -1.044 c
+28.516 -1.103 28.413 -1.154 28.296 -1.191 c
+28.178 -1.22 28.045 -1.235 27.899 -1.235 c
+27.671 -1.235 27.48 -1.202 27.326 -1.133 c
+27.178 -1.066 27.054 -0.963 26.958 -0.823 c
+26.859 -0.676 26.785 -0.497 26.738 -0.279 c
+26.686 -0.055 26.664 0.198 26.664 0.484 c
+26.664 0.768 26.686 1.018 26.738 1.234 c
+26.785 1.448 26.859 1.631 26.958 1.778 c
+27.054 1.932 27.186 2.05 27.355 2.131 c
+27.52 2.208 27.723 2.248 27.958 2.248 c
+28.2 2.248 28.413 2.19 28.589 2.072 c
+28.766 1.961 28.901 1.807 29.001 1.602 c
+29.016 1.602 l
+29.016 1.778 l
+29.016 1.969 l
+29.023 2.028 29.03 2.076 29.03 2.117 c
+29.038 2.164 29.045 2.194 29.045 2.204 c
+29.604 2.204 l
+29.593 2.183 29.589 2.15 29.589 2.102 c
+29.589 2.05 29.582 1.992 29.574 1.925 c
+29.574 1.72 l
+29.574 1.484 l
+29.574 -1.176 l
+29.574 -1.665 29.46 -2.033 29.236 -2.278 c
+29.009 -2.521 28.663 -2.646 28.193 -2.646 c
+29.001 0.5 m
+29.001 0.735 28.976 0.933 28.928 1.102 c
+28.876 1.278 28.81 1.414 28.722 1.514 c
+28.633 1.62 28.535 1.697 28.428 1.749 c
+28.317 1.797 28.211 1.822 28.105 1.822 c
+27.958 1.822 27.829 1.797 27.723 1.749 c
+27.623 1.697 27.538 1.62 27.472 1.514 c
+27.403 1.414 27.347 1.278 27.311 1.102 c
+27.281 0.933 27.266 0.735 27.266 0.5 c
+27.266 0.242 27.281 0.033 27.311 -0.133 c
+27.347 -0.302 27.399 -0.437 27.457 -0.545 c
+27.524 -0.643 27.612 -0.713 27.723 -0.75 c
+27.829 -0.79 27.95 -0.809 28.09 -0.809 c
+28.207 -0.809 28.317 -0.79 28.428 -0.75 c
+28.535 -0.703 28.626 -0.628 28.707 -0.53 c
+28.795 -0.423 28.861 -0.287 28.913 -0.118 c
+28.972 0.047 29.001 0.253 29.001 0.5 c
+32.664 -0.823 m
+33.885 -0.823 l
+33.885 -1.279 l
+30.725 -1.279 l
+30.725 -0.823 l
+32.091 -0.823 l
+32.091 1.749 l
+31.062 1.749 l
+31.062 2.204 l
+32.664 2.204 l
+h
+32.018 3.498 0.646 -0.617 re
+32.018 2.881 m
+34.95 1.749 m
+34.95 2.204 l
+35.494 2.204 l
+35.671 3.101 l
+36.068 3.101 l
+36.068 2.204 l
+37.449 2.204 l
+37.449 1.749 l
+36.068 1.749 l
+36.068 -0.353 l
+36.068 -0.522 36.111 -0.647 36.2 -0.736 c
+36.288 -0.817 36.439 -0.853 36.656 -0.853 c
+36.733 -0.853 36.817 -0.849 36.905 -0.838 c
+37.001 -0.831 37.09 -0.82 37.171 -0.809 c
+37.258 -0.801 37.335 -0.79 37.406 -0.78 c
+37.483 -0.772 37.545 -0.757 37.597 -0.736 c
+37.597 -1.176 l
+37.556 -1.199 37.497 -1.216 37.42 -1.235 c
+37.339 -1.246 37.25 -1.261 37.155 -1.279 c
+37.067 -1.287 36.968 -1.297 36.861 -1.309 c
+36.751 -1.327 36.641 -1.338 36.523 -1.338 c
+36.178 -1.338 35.92 -1.264 35.744 -1.118 c
+35.567 -0.971 35.48 -0.736 35.48 -0.412 c
+35.48 1.749 l
+h
+41.333 -1.279 m
+40.157 0.323 l
+39.731 0.014 l
+39.731 -1.279 l
+39.158 -1.279 l
+39.158 3.498 l
+39.731 3.498 l
+39.731 0.514 l
+41.26 2.204 l
+41.936 2.204 l
+40.525 0.706 l
+42.01 -1.279 l
+h
+43.483 0.338 m
+43.483 0.151 43.502 -0.023 43.542 -0.177 c
+43.59 -0.324 43.652 -0.452 43.733 -0.559 c
+43.81 -0.669 43.91 -0.757 44.028 -0.823 c
+44.152 -0.882 44.296 -0.912 44.454 -0.912 c
+44.571 -0.912 44.678 -0.897 44.776 -0.867 c
+44.884 -0.838 44.975 -0.805 45.056 -0.765 c
+45.133 -0.717 45.196 -0.659 45.247 -0.588 c
+45.306 -0.522 45.343 -0.452 45.364 -0.383 c
+45.879 -0.515 l
+45.838 -0.614 45.784 -0.713 45.717 -0.809 c
+45.648 -0.908 45.556 -0.996 45.439 -1.073 c
+45.328 -1.154 45.192 -1.216 45.027 -1.264 c
+44.869 -1.312 44.678 -1.338 44.454 -1.338 c
+44.207 -1.338 43.987 -1.301 43.792 -1.235 c
+43.594 -1.158 43.428 -1.044 43.292 -0.897 c
+43.164 -0.743 43.06 -0.551 42.983 -0.324 c
+42.914 -0.088 42.881 0.18 42.881 0.484 c
+42.881 0.816 42.917 1.095 42.998 1.323 c
+43.087 1.547 43.204 1.726 43.351 1.866 c
+43.498 2.013 43.663 2.117 43.851 2.175 c
+44.034 2.234 44.233 2.263 44.439 2.263 c
+44.722 2.263 44.957 2.219 45.144 2.131 c
+45.339 2.042 45.497 1.914 45.615 1.749 c
+45.74 1.591 45.828 1.396 45.879 1.161 c
+45.938 0.933 45.967 0.683 45.967 0.411 c
+45.967 0.338 l
+h
+44.439 1.837 m
+44.34 1.837 44.236 1.822 44.13 1.793 c
+44.02 1.764 43.917 1.705 43.822 1.616 c
+43.733 1.535 43.66 1.429 43.6 1.294 c
+43.542 1.165 43.505 0.992 43.498 0.779 c
+45.379 0.779 l
+45.358 0.984 45.321 1.15 45.262 1.278 c
+45.21 1.414 45.144 1.521 45.056 1.602 c
+44.975 1.69 44.884 1.749 44.776 1.778 c
+44.666 1.815 44.556 1.837 44.439 1.837 c
+47.544 0.338 m
+47.544 0.151 47.562 -0.023 47.602 -0.177 c
+47.65 -0.324 47.713 -0.452 47.793 -0.559 c
+47.87 -0.669 47.97 -0.757 48.088 -0.823 c
+48.213 -0.882 48.356 -0.912 48.514 -0.912 c
+48.632 -0.912 48.738 -0.897 48.838 -0.867 c
+48.944 -0.838 49.036 -0.805 49.117 -0.765 c
+49.194 -0.717 49.256 -0.659 49.308 -0.588 c
+49.366 -0.522 49.403 -0.452 49.426 -0.383 c
+49.94 -0.515 l
+49.9 -0.614 49.844 -0.713 49.778 -0.809 c
+49.709 -0.908 49.616 -0.996 49.499 -1.073 c
+49.389 -1.154 49.252 -1.216 49.087 -1.264 c
+48.93 -1.312 48.738 -1.338 48.514 -1.338 c
+48.267 -1.338 48.047 -1.301 47.853 -1.235 c
+47.654 -1.158 47.489 -1.044 47.353 -0.897 c
+47.224 -0.743 47.122 -0.551 47.044 -0.324 c
+46.974 -0.088 46.941 0.18 46.941 0.484 c
+46.941 0.816 46.978 1.095 47.059 1.323 c
+47.147 1.547 47.265 1.726 47.411 1.866 c
+47.558 2.013 47.724 2.117 47.911 2.175 c
+48.095 2.234 48.294 2.263 48.499 2.263 c
+48.782 2.263 49.017 2.219 49.204 2.131 c
+49.4 2.042 49.557 1.914 49.675 1.749 c
+49.8 1.591 49.888 1.396 49.94 1.161 c
+49.998 0.933 50.028 0.683 50.028 0.411 c
+50.028 0.338 l
+h
+48.499 1.837 m
+48.4 1.837 48.298 1.822 48.19 1.793 c
+48.08 1.764 47.978 1.705 47.882 1.616 c
+47.793 1.535 47.72 1.429 47.662 1.294 c
+47.602 1.165 47.566 0.992 47.558 0.779 c
+49.44 0.779 l
+49.418 0.984 49.381 1.15 49.322 1.278 c
+49.271 1.414 49.204 1.521 49.117 1.602 c
+49.036 1.69 48.944 1.749 48.838 1.778 c
+48.727 1.815 48.616 1.837 48.499 1.837 c
+54.074 0.47 m
+54.074 0.213 54.052 -0.026 54.015 -0.25 c
+53.975 -0.478 53.905 -0.673 53.809 -0.838 c
+53.711 -0.996 53.578 -1.118 53.412 -1.206 c
+53.254 -1.294 53.06 -1.338 52.824 -1.338 c
+52.707 -1.338 52.593 -1.327 52.487 -1.309 c
+52.377 -1.287 52.273 -1.257 52.178 -1.206 c
+52.09 -1.158 52.005 -1.099 51.928 -1.029 c
+51.858 -0.952 51.799 -0.861 51.752 -0.75 c
+51.737 -0.75 l
+51.737 -0.809 l
+51.744 -0.838 51.752 -0.879 51.752 -0.927 c
+51.752 -1.103 l
+51.752 -1.279 l
+51.752 -2.646 l
+51.163 -2.646 l
+51.163 1.484 l
+51.163 1.72 l
+51.163 1.94 l
+51.163 2.006 51.156 2.061 51.149 2.102 c
+51.149 2.204 l
+51.708 2.204 l
+51.714 2.194 51.722 2.167 51.722 2.131 c
+51.722 1.984 l
+51.729 1.932 51.737 1.874 51.737 1.807 c
+51.744 1.738 51.752 1.679 51.752 1.631 c
+51.766 1.631 l
+51.814 1.738 51.872 1.83 51.943 1.911 c
+52.009 1.999 52.082 2.065 52.163 2.117 c
+52.251 2.164 52.347 2.204 52.458 2.234 c
+52.564 2.263 52.685 2.278 52.824 2.278 c
+53.06 2.278 53.254 2.234 53.412 2.146 c
+53.578 2.057 53.711 1.932 53.809 1.778 c
+53.905 1.62 53.975 1.429 54.015 1.205 c
+54.052 0.988 54.074 0.742 54.074 0.47 c
+53.486 0.47 m
+53.486 0.683 53.472 0.874 53.442 1.043 c
+53.42 1.209 53.376 1.352 53.31 1.469 c
+53.251 1.587 53.166 1.675 53.06 1.734 c
+52.95 1.793 52.817 1.822 52.663 1.822 c
+52.545 1.822 52.427 1.801 52.31 1.764 c
+52.2 1.723 52.104 1.649 52.016 1.543 c
+51.935 1.444 51.872 1.3 51.825 1.117 c
+51.774 0.929 51.752 0.694 51.752 0.411 c
+51.752 0.154 51.77 -0.055 51.81 -0.221 c
+51.847 -0.39 51.906 -0.526 51.987 -0.632 c
+52.064 -0.732 52.156 -0.805 52.266 -0.853 c
+52.383 -0.894 52.516 -0.912 52.663 -0.912 c
+52.817 -0.912 52.946 -0.882 53.045 -0.823 c
+53.152 -0.765 53.236 -0.676 53.295 -0.559 c
+53.361 -0.441 53.412 -0.294 53.442 -0.118 c
+53.472 0.058 53.486 0.253 53.486 0.47 c
+f
+Q
+q 1 0 0 1 37.6521 138.6699 cm
+0 0 m
+2.646 4.835 l
+3.204 4.835 l
+0.588 0 l
+h
+4.31 3.087 m
+4.31 3.542 l
+4.854 3.542 l
+5.031 4.438 l
+5.428 4.438 l
+5.428 3.542 l
+6.809 3.542 l
+6.809 3.087 l
+5.428 3.087 l
+5.428 0.985 l
+5.428 0.816 5.471 0.691 5.56 0.602 c
+5.648 0.521 5.799 0.484 6.016 0.484 c
+6.093 0.484 6.177 0.488 6.265 0.5 c
+6.361 0.507 6.449 0.517 6.53 0.529 c
+6.618 0.536 6.695 0.548 6.765 0.558 c
+6.842 0.565 6.905 0.58 6.957 0.602 c
+6.957 0.162 l
+6.916 0.139 6.857 0.121 6.78 0.103 c
+6.699 0.091 6.611 0.077 6.516 0.058 c
+6.427 0.051 6.328 0.04 6.221 0.029 c
+6.111 0.01 6.001 0 5.883 0 c
+5.538 0 5.28 0.073 5.104 0.22 c
+4.928 0.367 4.84 0.602 4.84 0.926 c
+4.84 3.087 l
+h
+9.459 0.058 m
+9.459 2.263 l
+9.459 2.429 9.452 2.572 9.444 2.69 c
+9.433 2.807 9.415 2.899 9.386 2.969 c
+9.356 3.035 9.315 3.087 9.268 3.116 c
+9.216 3.145 9.157 3.16 9.091 3.16 c
+9.022 3.16 8.959 3.131 8.9 3.072 c
+8.849 3.021 8.801 2.944 8.754 2.836 c
+8.713 2.738 8.684 2.62 8.665 2.484 c
+8.644 2.344 8.636 2.19 8.636 2.013 c
+8.636 0.058 l
+8.092 0.058 l
+8.092 2.792 l
+8.092 3.027 l
+8.092 3.104 8.085 3.179 8.077 3.248 c
+8.077 3.439 l
+8.077 3.542 l
+8.548 3.542 l
+8.548 3.454 l
+8.555 3.414 8.563 3.366 8.563 3.307 c
+8.563 3.131 l
+8.569 3.072 8.577 3.017 8.577 2.969 c
+8.606 3.057 8.64 3.135 8.68 3.204 c
+8.717 3.281 8.761 3.351 8.812 3.41 c
+8.871 3.469 8.933 3.513 9.003 3.542 c
+9.08 3.579 9.168 3.601 9.268 3.601 c
+9.463 3.601 9.606 3.546 9.694 3.439 c
+9.789 3.34 9.86 3.182 9.899 2.969 c
+9.937 3.064 9.977 3.152 10.017 3.233 c
+10.065 3.31 10.12 3.373 10.179 3.424 c
+10.246 3.484 10.315 3.528 10.385 3.557 c
+10.462 3.586 10.554 3.601 10.664 3.601 c
+10.789 3.601 10.899 3.575 10.988 3.528 c
+11.075 3.476 11.15 3.403 11.208 3.307 c
+11.267 3.208 11.304 3.079 11.326 2.925 c
+11.355 2.778 11.37 2.594 11.37 2.381 c
+11.37 0.058 l
+10.826 0.058 l
+10.826 2.263 l
+10.826 2.429 10.819 2.572 10.811 2.69 c
+10.801 2.807 10.782 2.899 10.753 2.969 c
+10.723 3.035 10.682 3.087 10.635 3.116 c
+10.583 3.145 10.525 3.16 10.458 3.16 c
+10.319 3.16 10.209 3.064 10.12 2.881 c
+10.04 2.705 10.003 2.433 10.003 2.072 c
+10.003 0.058 l
+h
+15.312 1.808 m
+15.312 1.55 15.291 1.311 15.254 1.087 c
+15.214 0.86 15.144 0.665 15.048 0.5 c
+14.949 0.341 14.817 0.22 14.651 0.132 c
+14.493 0.044 14.298 0 14.063 0 c
+13.946 0 13.832 0.01 13.725 0.029 c
+13.615 0.051 13.512 0.081 13.417 0.132 c
+13.328 0.18 13.244 0.239 13.167 0.309 c
+13.097 0.386 13.038 0.477 12.991 0.588 c
+12.976 0.588 l
+12.976 0.529 l
+12.983 0.5 12.991 0.459 12.991 0.411 c
+12.991 0.235 l
+12.991 0.058 l
+12.991 -1.309 l
+12.403 -1.309 l
+12.403 2.822 l
+12.403 3.057 l
+12.403 3.278 l
+12.403 3.343 12.395 3.399 12.388 3.439 c
+12.388 3.542 l
+12.946 3.542 l
+12.954 3.532 12.961 3.505 12.961 3.469 c
+12.961 3.322 l
+12.968 3.27 12.976 3.212 12.976 3.145 c
+12.983 3.075 12.991 3.017 12.991 2.969 c
+13.005 2.969 l
+13.053 3.075 13.112 3.167 13.182 3.248 c
+13.247 3.337 13.321 3.403 13.402 3.454 c
+13.49 3.501 13.585 3.542 13.696 3.572 c
+13.803 3.601 13.924 3.615 14.063 3.615 c
+14.298 3.615 14.493 3.572 14.651 3.484 c
+14.817 3.395 14.949 3.27 15.048 3.116 c
+15.144 2.958 15.214 2.767 15.254 2.543 c
+15.291 2.326 15.312 2.08 15.312 1.808 c
+14.724 1.808 m
+14.724 2.021 14.71 2.212 14.68 2.381 c
+14.659 2.547 14.614 2.69 14.549 2.807 c
+14.489 2.925 14.406 3.013 14.298 3.072 c
+14.188 3.131 14.056 3.16 13.901 3.16 c
+13.784 3.16 13.666 3.138 13.549 3.102 c
+13.438 3.061 13.343 2.987 13.255 2.881 c
+13.174 2.782 13.112 2.638 13.064 2.454 c
+13.012 2.267 12.991 2.032 12.991 1.749 c
+12.991 1.492 13.009 1.282 13.049 1.117 c
+13.086 0.947 13.145 0.812 13.226 0.706 c
+13.303 0.606 13.394 0.532 13.504 0.484 c
+13.623 0.444 13.755 0.426 13.901 0.426 c
+14.056 0.426 14.184 0.455 14.284 0.515 c
+14.39 0.573 14.475 0.661 14.533 0.779 c
+14.6 0.897 14.651 1.043 14.68 1.22 c
+14.71 1.396 14.724 1.591 14.724 1.808 c
+f
+Q
+q 1 0 0 1 39.4451 134.0838 cm
+0 0 m
+0.853 0.323 l
+0.985 -0.088 l
+0.088 -0.324 l
+0.676 -1.132 l
+0.294 -1.367 l
+-0.191 -0.53 l
+-0.69 -1.353 l
+-1.072 -1.132 l
+-0.455 -0.324 l
+-1.367 -0.088 l
+-1.22 0.338 l
+-0.353 -0.015 l
+-0.397 0.941 l
+0.044 0.941 l
+h
+3.502 -2.866 0.75 -0.956 re
+3.502 -3.822 m
+9.371 -2.822 m
+9.371 -2.992 9.334 -3.142 9.268 -3.278 c
+9.209 -3.406 9.114 -3.514 8.989 -3.601 c
+8.871 -3.69 8.724 -3.759 8.548 -3.807 c
+8.379 -3.855 8.184 -3.881 7.96 -3.881 c
+7.754 -3.881 7.566 -3.866 7.401 -3.836 c
+7.243 -3.807 7.1 -3.763 6.975 -3.705 c
+6.857 -3.639 6.755 -3.55 6.666 -3.44 c
+6.585 -3.323 6.534 -3.186 6.504 -3.028 c
+7.005 -2.926 l
+7.034 -3.043 7.078 -3.138 7.136 -3.205 c
+7.196 -3.275 7.262 -3.329 7.342 -3.366 c
+7.42 -3.406 7.508 -3.433 7.607 -3.44 c
+7.713 -3.451 7.832 -3.454 7.96 -3.454 c
+8.085 -3.454 8.199 -3.447 8.298 -3.425 c
+8.405 -3.406 8.497 -3.377 8.577 -3.337 c
+8.654 -3.289 8.713 -3.23 8.754 -3.161 c
+8.802 -3.094 8.827 -3.01 8.827 -2.911 c
+8.827 -2.804 8.798 -2.716 8.739 -2.646 c
+8.688 -2.58 8.614 -2.525 8.518 -2.484 c
+8.43 -2.437 8.316 -2.396 8.181 -2.367 c
+8.052 -2.338 7.915 -2.301 7.769 -2.249 c
+7.629 -2.22 7.493 -2.187 7.358 -2.147 c
+7.217 -2.099 7.096 -2.04 6.99 -1.97 c
+6.88 -1.904 6.791 -1.816 6.725 -1.706 c
+6.666 -1.599 6.637 -1.463 6.637 -1.294 c
+6.637 -0.981 6.747 -0.736 6.975 -0.559 c
+7.199 -0.383 7.526 -0.294 7.96 -0.294 c
+8.136 -0.294 8.298 -0.309 8.445 -0.339 c
+8.592 -0.368 8.717 -0.42 8.827 -0.485 c
+8.945 -0.555 9.041 -0.643 9.121 -0.75 c
+9.199 -0.849 9.253 -0.971 9.282 -1.118 c
+8.769 -1.191 l
+8.746 -1.095 8.713 -1.014 8.665 -0.956 c
+8.614 -0.897 8.555 -0.853 8.489 -0.823 c
+8.419 -0.786 8.335 -0.761 8.239 -0.75 c
+8.151 -0.732 8.056 -0.721 7.96 -0.721 c
+7.438 -0.721 7.181 -0.882 7.181 -1.206 c
+7.181 -1.305 7.199 -1.382 7.24 -1.441 c
+7.287 -1.5 7.35 -1.555 7.431 -1.602 c
+7.518 -1.643 7.622 -1.676 7.739 -1.706 c
+7.857 -1.735 7.982 -1.764 8.121 -1.794 c
+8.258 -1.834 8.401 -1.878 8.548 -1.926 c
+8.694 -1.966 8.827 -2.025 8.945 -2.103 c
+9.07 -2.172 9.172 -2.264 9.253 -2.382 c
+9.33 -2.5 9.371 -2.646 9.371 -2.822 c
+13.299 -3.822 m
+12.638 -3.822 l
+12.182 -2.308 l
+12.16 -2.249 12.142 -2.187 12.123 -2.117 c
+12.102 -2.04 12.083 -1.966 12.065 -1.897 c
+12.035 -1.819 12.009 -1.742 11.991 -1.661 c
+11.969 -1.742 11.95 -1.819 11.932 -1.897 c
+11.91 -1.966 11.892 -2.04 11.873 -2.117 c
+11.851 -2.187 11.83 -2.257 11.8 -2.323 c
+11.329 -3.822 l
+10.683 -3.822 l
+10.095 -0.339 l
+10.668 -0.339 l
+10.962 -2.294 l
+10.969 -2.345 10.98 -2.419 10.992 -2.514 c
+10.999 -2.602 11.009 -2.701 11.021 -2.808 c
+11.028 -2.907 11.04 -3.007 11.05 -3.102 c
+11.057 -3.201 11.065 -3.278 11.065 -3.337 c
+11.094 -3.248 11.117 -3.161 11.138 -3.072 c
+11.157 -2.995 11.175 -2.918 11.198 -2.837 c
+11.215 -2.76 11.234 -2.701 11.256 -2.66 c
+11.682 -1.294 l
+12.314 -1.294 l
+12.726 -2.66 l
+12.733 -2.701 12.748 -2.76 12.771 -2.837 c
+12.788 -2.918 12.807 -2.992 12.829 -3.057 c
+12.858 -3.146 12.881 -3.242 12.902 -3.337 c
+12.902 -3.278 12.906 -3.201 12.917 -3.102 c
+12.925 -3.007 12.935 -2.907 12.946 -2.808 c
+12.954 -2.701 12.965 -2.602 12.976 -2.514 c
+12.994 -2.425 13.009 -2.352 13.02 -2.294 c
+13.343 -0.339 l
+13.902 -0.339 l
+h
+17.584 -2.072 m
+17.584 -2.33 17.562 -2.569 17.525 -2.793 c
+17.485 -3.021 17.415 -3.215 17.319 -3.381 c
+17.22 -3.539 17.088 -3.66 16.923 -3.749 c
+16.765 -3.836 16.57 -3.881 16.335 -3.881 c
+16.217 -3.881 16.103 -3.87 15.996 -3.851 c
+15.886 -3.83 15.784 -3.8 15.688 -3.749 c
+15.599 -3.701 15.515 -3.642 15.438 -3.572 c
+15.368 -3.495 15.31 -3.404 15.262 -3.293 c
+15.247 -3.293 l
+15.247 -3.352 l
+15.254 -3.381 15.262 -3.421 15.262 -3.469 c
+15.262 -3.645 l
+15.262 -3.822 l
+15.262 -5.189 l
+14.674 -5.189 l
+14.674 -1.058 l
+14.674 -0.823 l
+14.674 -0.603 l
+14.674 -0.537 14.666 -0.482 14.659 -0.441 c
+14.659 -0.339 l
+15.217 -0.339 l
+15.225 -0.349 15.232 -0.375 15.232 -0.412 c
+15.232 -0.559 l
+15.239 -0.611 15.247 -0.669 15.247 -0.736 c
+15.254 -0.805 15.262 -0.864 15.262 -0.912 c
+15.277 -0.912 l
+15.324 -0.805 15.383 -0.713 15.453 -0.632 c
+15.518 -0.544 15.593 -0.478 15.673 -0.426 c
+15.761 -0.379 15.857 -0.339 15.967 -0.309 c
+16.073 -0.279 16.195 -0.265 16.335 -0.265 c
+16.57 -0.265 16.765 -0.309 16.923 -0.397 c
+17.088 -0.485 17.22 -0.611 17.319 -0.765 c
+17.415 -0.923 17.485 -1.114 17.525 -1.338 c
+17.562 -1.555 17.584 -1.801 17.584 -2.072 c
+16.996 -2.072 m
+16.996 -1.86 16.981 -1.669 16.952 -1.5 c
+16.93 -1.334 16.885 -1.191 16.819 -1.073 c
+16.761 -0.956 16.676 -0.867 16.57 -0.809 c
+16.459 -0.75 16.327 -0.721 16.173 -0.721 c
+16.056 -0.721 15.938 -0.742 15.82 -0.779 c
+15.709 -0.819 15.614 -0.894 15.526 -1 c
+15.445 -1.099 15.383 -1.243 15.335 -1.426 c
+15.283 -1.613 15.262 -1.849 15.262 -2.132 c
+15.262 -2.389 15.279 -2.598 15.32 -2.764 c
+15.358 -2.933 15.416 -3.069 15.497 -3.175 c
+15.574 -3.275 15.666 -3.348 15.776 -3.396 c
+15.894 -3.437 16.025 -3.454 16.173 -3.454 c
+16.327 -3.454 16.455 -3.425 16.555 -3.366 c
+16.661 -3.308 16.746 -3.219 16.805 -3.102 c
+16.871 -2.984 16.923 -2.837 16.952 -2.66 c
+16.981 -2.484 16.996 -2.29 16.996 -2.072 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+35.668 442.028 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 146.2115 426.5399 cm
+0 0 m
+-1.822 0 l
+-1.822 7.158 l
+-3.601 6.468 l
+-3.601 7.981 l
+-0.191 9.377 l
+0 9.377 l
+h
+3.047 0.926 m
+3.047 1.219 3.142 1.458 3.341 1.646 c
+3.535 1.83 3.789 1.925 4.105 1.925 c
+4.406 1.925 4.657 1.83 4.855 1.646 c
+5.06 1.458 5.164 1.219 5.164 0.926 c
+5.164 0.621 5.06 0.374 4.855 0.191 c
+4.657 0.014 4.406 -0.074 4.105 -0.074 c
+3.801 -0.074 3.547 0.018 3.341 0.205 c
+3.142 0.389 3.047 0.631 3.047 0.926 c
+16.416 1.058 m
+16.052 0.665 15.607 0.367 15.078 0.161 c
+14.549 -0.034 13.968 -0.133 13.343 -0.133 c
+12.263 -0.133 11.425 0.198 10.83 0.866 c
+10.231 1.532 9.926 2.502 9.918 3.777 c
+9.918 5.468 l
+9.918 6.761 10.198 7.754 10.756 8.452 c
+11.323 9.146 12.146 9.495 13.226 9.495 c
+14.244 9.495 15.009 9.238 15.519 8.731 c
+16.037 8.231 16.335 7.445 16.416 6.379 c
+14.579 6.379 l
+14.527 6.975 14.406 7.382 14.211 7.599 c
+14.012 7.812 13.704 7.922 13.285 7.922 c
+12.774 7.922 12.403 7.735 12.168 7.364 c
+11.94 6.989 11.822 6.397 11.815 5.585 c
+11.815 3.881 l
+11.815 3.027 11.94 2.403 12.197 2.013 c
+12.451 1.631 12.866 1.44 13.446 1.44 c
+13.818 1.44 14.122 1.514 14.358 1.66 c
+14.519 1.778 l
+14.519 3.498 l
+13.197 3.498 l
+13.197 4.924 l
+16.416 4.924 l
+h
+19.973 0 -1.897 9.363 re
+27.554 7.79 m
+25.232 7.79 l
+25.232 0 l
+23.335 0 l
+23.335 7.79 l
+21.057 7.79 l
+21.057 9.363 l
+27.554 9.363 l
+h
+37.913 3.116 m
+37.862 2.046 37.56 1.238 37.002 0.691 c
+36.451 0.139 35.678 -0.133 34.679 -0.133 c
+33.61 -0.133 32.79 0.213 32.224 0.911 c
+31.666 1.606 31.387 2.601 31.387 3.895 c
+31.387 5.468 l
+31.387 6.761 31.673 7.754 32.254 8.452 c
+32.842 9.146 33.654 9.495 34.694 9.495 c
+35.711 9.495 36.488 9.205 37.016 8.628 c
+37.546 8.058 37.847 7.239 37.928 6.173 c
+36.031 6.173 l
+36.01 6.838 35.906 7.294 35.723 7.54 c
+35.535 7.794 35.194 7.922 34.694 7.922 c
+34.194 7.922 33.834 7.746 33.621 7.393 c
+33.415 7.04 33.301 6.456 33.282 5.644 c
+33.282 3.881 l
+33.282 2.946 33.386 2.308 33.591 1.955 c
+33.805 1.609 34.169 1.44 34.679 1.44 c
+35.168 1.44 35.506 1.558 35.694 1.793 c
+35.888 2.036 35.995 2.476 36.017 3.116 c
+h
+45.887 3.836 m
+45.887 2.579 45.585 1.606 44.991 0.911 c
+44.392 0.213 43.568 -0.133 42.521 -0.133 c
+41.471 -0.133 40.644 0.209 40.037 0.897 c
+39.438 1.591 39.133 2.557 39.125 3.792 c
+39.125 5.394 l
+39.125 6.676 39.424 7.68 40.022 8.407 c
+40.617 9.132 41.448 9.495 42.506 9.495 c
+43.543 9.495 44.362 9.135 44.961 8.422 c
+45.568 7.717 45.876 6.721 45.887 5.438 c
+h
+43.991 5.409 m
+43.991 6.25 43.866 6.879 43.624 7.291 c
+43.389 7.702 43.013 7.908 42.506 7.908 c
+42.007 7.908 41.631 7.706 41.39 7.305 c
+41.155 6.912 41.029 6.312 41.022 5.512 c
+41.022 3.836 l
+41.022 3.02 41.143 2.418 41.39 2.028 c
+41.631 1.635 42.011 1.44 42.521 1.44 c
+43.01 1.44 43.374 1.631 43.609 2.013 c
+43.852 2.395 43.98 2.983 43.991 3.777 c
+h
+54.019 0 m
+52.124 0 l
+49.36 6.144 l
+49.36 0 l
+47.464 0 l
+47.464 9.363 l
+49.36 9.363 l
+52.124 3.218 l
+52.124 9.363 l
+54.019 9.363 l
+h
+60.608 3.821 m
+57.668 3.821 l
+57.668 0 l
+55.773 0 l
+55.773 9.363 l
+60.961 9.363 l
+60.961 7.79 l
+57.668 7.79 l
+57.668 5.394 l
+60.608 5.394 l
+h
+64.213 0 -1.896 9.363 re
+72.272 1.058 m
+71.908 0.665 71.463 0.367 70.935 0.161 c
+70.405 -0.034 69.825 -0.133 69.2 -0.133 c
+68.12 -0.133 67.282 0.198 66.686 0.866 c
+66.087 1.532 65.782 2.502 65.775 3.777 c
+65.775 5.468 l
+65.775 6.761 66.054 7.754 66.613 8.452 c
+67.179 9.146 68.002 9.495 69.082 9.495 c
+70.1 9.495 70.865 9.238 71.376 8.731 c
+71.893 8.231 72.191 7.445 72.272 6.379 c
+70.435 6.379 l
+70.383 6.975 70.262 7.382 70.067 7.599 c
+69.869 7.812 69.56 7.922 69.142 7.922 c
+68.631 7.922 68.259 7.735 68.024 7.364 c
+67.796 6.989 67.679 6.397 67.671 5.585 c
+67.671 3.881 l
+67.671 3.027 67.796 2.403 68.053 2.013 c
+68.307 1.631 68.722 1.44 69.302 1.44 c
+69.674 1.44 69.979 1.514 70.214 1.66 c
+70.376 1.778 l
+70.376 3.498 l
+69.053 3.498 l
+69.053 4.924 l
+72.272 4.924 l
+h
+79.945 9.363 m
+79.945 2.881 l
+79.934 1.911 79.666 1.165 79.137 0.646 c
+78.607 0.124 77.846 -0.133 76.858 -0.133 c
+75.858 -0.133 75.095 0.124 74.565 0.646 c
+74.036 1.176 73.771 1.932 73.771 2.925 c
+73.771 9.363 l
+75.667 9.363 l
+75.667 2.925 l
+75.667 2.385 75.748 2.002 75.918 1.778 c
+76.094 1.55 76.406 1.44 76.858 1.44 c
+77.306 1.44 77.615 1.55 77.784 1.778 c
+77.95 2.002 78.038 2.37 78.048 2.881 c
+78.048 9.363 l
+h
+84.431 3.424 m
+83.491 3.424 l
+83.491 0 l
+81.609 0 l
+81.609 9.363 l
+84.623 9.363 l
+85.571 9.363 86.302 9.117 86.813 8.628 c
+87.332 8.136 87.592 7.441 87.592 6.541 c
+87.592 5.294 87.14 4.424 86.239 3.924 c
+87.872 0.087 l
+87.872 0 l
+85.842 0 l
+h
+83.491 4.997 m
+84.564 4.997 l
+84.946 4.997 85.229 5.119 85.416 5.365 c
+85.601 5.618 85.696 5.957 85.696 6.379 c
+85.696 7.32 85.332 7.79 84.608 7.79 c
+83.491 7.79 l
+h
+93.578 1.911 m
+91.006 1.911 l
+90.506 0 l
+88.508 0 l
+91.432 9.363 l
+93.152 9.363 l
+96.107 0 l
+94.078 0 l
+h
+91.417 3.498 m
+93.167 3.498 l
+92.285 6.834 l
+h
+102.482 7.79 m
+100.16 7.79 l
+100.16 0 l
+98.264 0 l
+98.264 7.79 l
+95.986 7.79 l
+95.986 9.363 l
+102.482 9.363 l
+h
+105.753 0 -1.897 9.363 re
+114.047 3.836 m
+114.047 2.579 113.746 1.606 113.15 0.911 c
+112.551 0.213 111.728 -0.133 110.681 -0.133 c
+109.63 -0.133 108.803 0.209 108.196 0.897 c
+107.597 1.591 107.292 2.557 107.285 3.792 c
+107.285 5.394 l
+107.285 6.676 107.583 7.68 108.182 8.407 c
+108.777 9.132 109.607 9.495 110.666 9.495 c
+111.702 9.495 112.522 9.135 113.121 8.422 c
+113.727 7.717 114.036 6.721 114.047 5.438 c
+h
+112.15 5.409 m
+112.15 6.25 112.026 6.879 111.783 7.291 c
+111.548 7.702 111.173 7.908 110.666 7.908 c
+110.166 7.908 109.791 7.706 109.549 7.305 c
+109.314 6.912 109.189 6.312 109.181 5.512 c
+109.181 3.836 l
+109.181 3.02 109.303 2.418 109.549 2.028 c
+109.791 1.635 110.17 1.44 110.681 1.44 c
+111.169 1.44 111.533 1.631 111.768 2.013 c
+112.011 2.395 112.14 2.983 112.15 3.777 c
+h
+122.176 0 m
+120.279 0 l
+117.515 6.144 l
+117.515 0 l
+115.62 0 l
+115.62 9.363 l
+117.515 9.363 l
+120.279 3.218 l
+120.279 9.363 l
+122.176 9.363 l
+h
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 411.726 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 404.8916 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.485 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.245 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.116 l
+14.497 3.116 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.456 14.556 -0.515 c
+14.593 -0.566 14.648 -0.611 14.718 -0.647 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.688 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.279 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.085 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.456 c
+13.59 -0.36 13.586 -0.264 13.586 -0.177 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.943 -1.205 c
+21.737 -1.118 21.564 -0.996 21.428 -0.838 c
+21.288 -0.684 21.185 -0.497 21.119 -0.279 c
+21.049 -0.056 21.016 0.191 21.016 0.455 c
+21.016 0.75 21.049 1.007 21.119 1.234 c
+21.197 1.459 21.303 1.646 21.442 1.793 c
+21.589 1.947 21.766 2.065 21.972 2.146 c
+22.178 2.234 22.413 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.248 23.28 2.19 c
+23.456 2.131 23.607 2.047 23.736 1.94 c
+23.861 1.841 23.963 1.72 24.044 1.573 c
+24.122 1.433 24.176 1.282 24.206 1.117 c
+23.295 1.072 l
+23.265 1.249 23.196 1.389 23.089 1.5 c
+22.99 1.606 22.846 1.66 22.662 1.66 c
+22.416 1.66 22.24 1.558 22.134 1.352 c
+22.023 1.153 21.972 0.867 21.972 0.484 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.276 23.324 -0.059 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.574 c
+24.004 -0.721 23.901 -0.852 23.765 -0.97 c
+23.636 -1.081 23.478 -1.168 23.295 -1.235 c
+23.119 -1.294 22.913 -1.323 22.677 -1.323 c
+28.384 0.484 m
+28.384 0.209 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.191 c
+27.227 -1.279 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.279 25.944 -1.191 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.209 25.018 0.484 c
+25.018 0.738 25.047 0.974 25.106 1.19 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.057 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.057 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.19 c
+28.355 0.974 28.384 0.738 28.384 0.484 c
+27.429 0.484 m
+27.429 0.69 27.414 0.867 27.385 1.014 c
+27.362 1.161 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.547 27.046 1.587 c
+26.959 1.635 26.848 1.66 26.724 1.66 c
+26.458 1.66 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.885 25.974 0.484 c
+25.974 0.062 26.032 -0.243 26.15 -0.426 c
+26.267 -0.614 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.688 27.017 -0.647 c
+27.113 -0.599 27.194 -0.526 27.252 -0.426 c
+27.318 -0.331 27.362 -0.206 27.385 -0.059 c
+27.414 0.088 27.429 0.268 27.429 0.484 c
+31.43 -1.264 m
+31.43 0.72 l
+31.43 1.022 31.387 1.242 31.298 1.382 c
+31.217 1.529 31.081 1.602 30.886 1.602 c
+30.776 1.602 30.674 1.577 30.578 1.529 c
+30.489 1.477 30.409 1.411 30.343 1.323 c
+30.284 1.234 30.233 1.124 30.196 0.999 c
+30.167 0.881 30.152 0.75 30.152 0.602 c
+30.152 -1.264 l
+29.24 -1.264 l
+29.24 1.44 l
+29.24 1.66 l
+29.24 1.749 29.233 1.826 29.226 1.896 c
+29.226 2.087 l
+29.226 2.219 l
+30.078 2.219 l
+30.086 2.19 30.093 2.146 30.093 2.087 c
+30.093 1.896 l
+30.1 1.826 30.107 1.756 30.107 1.69 c
+30.115 1.62 30.122 1.565 30.122 1.529 c
+30.137 1.529 l
+30.254 1.793 30.406 1.984 30.593 2.102 c
+30.776 2.219 30.996 2.278 31.254 2.278 c
+31.438 2.278 31.599 2.248 31.74 2.19 c
+31.875 2.131 31.989 2.043 32.077 1.926 c
+32.166 1.808 32.228 1.664 32.268 1.5 c
+32.316 1.341 32.342 1.153 32.342 0.941 c
+32.342 -1.264 l
+h
+34.951 1.602 m
+34.951 -1.264 l
+34.054 -1.264 l
+34.054 1.602 l
+33.232 1.602 l
+33.232 2.219 l
+34.054 2.219 l
+34.054 2.484 l
+34.054 2.609 34.069 2.741 34.098 2.881 c
+34.135 3.017 34.205 3.135 34.304 3.233 c
+34.41 3.341 34.554 3.428 34.73 3.499 c
+34.907 3.564 35.131 3.601 35.407 3.601 c
+35.62 3.601 35.819 3.59 35.995 3.572 c
+36.17 3.549 36.322 3.532 36.45 3.513 c
+36.45 2.925 l
+36.322 2.944 36.178 2.958 36.024 2.969 c
+35.866 2.977 35.715 2.984 35.568 2.984 c
+35.44 2.984 35.337 2.969 35.26 2.94 c
+35.179 2.911 35.116 2.87 35.069 2.822 c
+35.017 2.77 34.984 2.708 34.965 2.631 c
+34.955 2.561 34.951 2.484 34.951 2.396 c
+34.951 2.219 l
+36.377 2.219 l
+36.377 1.602 l
+h
+39.467 -0.647 m
+40.599 -0.647 l
+40.599 -1.264 l
+37.292 -1.264 l
+37.292 -0.647 l
+38.556 -0.647 l
+38.556 1.602 l
+37.63 1.602 l
+37.63 2.219 l
+39.467 2.219 l
+h
+38.556 3.513 0.911 -0.676 re
+38.556 2.836 m
+42.954 -2.66 m
+42.738 -2.66 42.547 -2.635 42.381 -2.587 c
+42.212 -2.547 42.073 -2.485 41.955 -2.396 c
+41.837 -2.315 41.738 -2.22 41.661 -2.103 c
+41.591 -1.985 41.543 -1.856 41.514 -1.72 c
+42.41 -1.617 l
+42.447 -1.753 42.518 -1.86 42.616 -1.941 c
+42.712 -2.028 42.837 -2.072 42.984 -2.072 c
+43.072 -2.072 43.153 -2.058 43.234 -2.028 c
+43.311 -1.999 43.381 -1.945 43.44 -1.867 c
+43.499 -1.797 43.542 -1.706 43.572 -1.588 c
+43.609 -1.47 43.631 -1.323 43.631 -1.147 c
+43.631 -0.956 l
+43.631 -0.889 43.634 -0.831 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.073 c
+43.017 -1.172 42.811 -1.22 42.587 -1.22 c
+42.381 -1.22 42.198 -1.183 42.044 -1.103 c
+41.896 -1.014 41.768 -0.897 41.661 -0.75 c
+41.562 -0.595 41.488 -0.412 41.441 -0.206 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.771 41.389 1.018 41.441 1.234 c
+41.5 1.448 41.58 1.631 41.691 1.778 c
+41.797 1.933 41.93 2.051 42.088 2.131 c
+42.242 2.219 42.429 2.263 42.646 2.263 c
+42.742 2.263 42.84 2.252 42.94 2.234 c
+43.035 2.212 43.123 2.179 43.204 2.131 c
+43.293 2.08 43.37 2.017 43.44 1.94 c
+43.517 1.859 43.58 1.768 43.631 1.66 c
+43.646 1.66 l
+43.646 1.808 l
+43.653 1.866 43.66 1.918 43.66 1.97 c
+43.667 2.028 43.675 2.076 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.219 c
+44.557 2.219 l
+44.546 2.138 44.535 2.028 44.527 1.881 c
+44.527 1.411 l
+44.527 -1.162 l
+44.527 -1.415 44.49 -1.635 44.425 -1.823 c
+44.355 -2.007 44.251 -2.161 44.116 -2.278 c
+43.976 -2.404 43.811 -2.499 43.616 -2.558 c
+43.418 -2.624 43.197 -2.66 42.954 -2.66 c
+43.646 0.529 m
+43.646 0.742 43.619 0.918 43.572 1.058 c
+43.532 1.205 43.476 1.323 43.41 1.411 c
+43.351 1.5 43.282 1.558 43.204 1.587 c
+43.123 1.624 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.62 42.69 1.573 c
+42.609 1.532 42.543 1.463 42.484 1.367 c
+42.433 1.278 42.389 1.161 42.352 1.014 c
+42.323 0.875 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.366 -0.154 42.484 -0.339 c
+42.601 -0.515 42.763 -0.603 42.969 -0.603 c
+43.035 -0.603 43.109 -0.588 43.189 -0.559 c
+43.278 -0.522 43.351 -0.463 43.41 -0.382 c
+43.476 -0.294 43.532 -0.177 43.572 -0.029 c
+43.619 0.118 43.646 0.301 43.646 0.529 c
+50.135 0.837 1.867 -0.793 re
+50.135 0.044 m
+54.2 0.837 1.866 -0.793 re
+54.2 0.044 m
+59.201 -2.66 m
+58.983 -2.66 58.792 -2.635 58.628 -2.587 c
+58.458 -2.547 58.318 -2.485 58.201 -2.396 c
+58.083 -2.315 57.984 -2.22 57.907 -2.103 c
+57.838 -1.985 57.79 -1.856 57.76 -1.72 c
+58.657 -1.617 l
+58.694 -1.753 58.763 -1.86 58.863 -1.941 c
+58.958 -2.028 59.083 -2.072 59.23 -2.072 c
+59.318 -2.072 59.399 -2.058 59.48 -2.028 c
+59.557 -1.999 59.627 -1.945 59.686 -1.867 c
+59.744 -1.797 59.789 -1.706 59.818 -1.588 c
+59.855 -1.47 59.877 -1.323 59.877 -1.147 c
+59.877 -0.956 l
+59.877 -0.889 59.881 -0.831 59.891 -0.779 c
+59.891 -0.588 l
+59.877 -0.588 l
+59.777 -0.816 59.634 -0.977 59.451 -1.073 c
+59.263 -1.172 59.058 -1.22 58.833 -1.22 c
+58.628 -1.22 58.443 -1.183 58.289 -1.103 c
+58.142 -1.014 58.014 -0.897 57.907 -0.75 c
+57.807 -0.595 57.734 -0.412 57.687 -0.206 c
+57.635 0.008 57.613 0.243 57.613 0.5 c
+57.613 0.771 57.635 1.018 57.687 1.234 c
+57.745 1.448 57.826 1.631 57.936 1.778 c
+58.043 1.933 58.175 2.051 58.333 2.131 c
+58.488 2.219 58.675 2.263 58.892 2.263 c
+58.987 2.263 59.087 2.252 59.186 2.234 c
+59.282 2.212 59.37 2.179 59.451 2.131 c
+59.538 2.08 59.616 2.017 59.686 1.94 c
+59.763 1.859 59.825 1.768 59.877 1.66 c
+59.891 1.66 l
+59.891 1.808 l
+59.899 1.866 59.906 1.918 59.906 1.97 c
+59.914 2.028 59.921 2.076 59.921 2.117 c
+59.928 2.165 59.939 2.198 59.951 2.219 c
+60.803 2.219 l
+60.792 2.138 60.781 2.028 60.774 1.881 c
+60.774 1.411 l
+60.774 -1.162 l
+60.774 -1.415 60.737 -1.635 60.67 -1.823 c
+60.601 -2.007 60.498 -2.161 60.362 -2.278 c
+60.222 -2.404 60.057 -2.499 59.862 -2.558 c
+59.664 -2.624 59.443 -2.66 59.201 -2.66 c
+59.891 0.529 m
+59.891 0.742 59.866 0.918 59.818 1.058 c
+59.777 1.205 59.723 1.323 59.656 1.411 c
+59.598 1.5 59.528 1.558 59.451 1.587 c
+59.37 1.624 59.293 1.646 59.216 1.646 c
+59.116 1.646 59.024 1.62 58.936 1.573 c
+58.855 1.532 58.789 1.463 58.73 1.367 c
+58.679 1.278 58.634 1.161 58.598 1.014 c
+58.569 0.875 58.553 0.706 58.553 0.5 c
+58.553 0.125 58.613 -0.154 58.73 -0.339 c
+58.848 -0.515 59.01 -0.603 59.216 -0.603 c
+59.282 -0.603 59.355 -0.588 59.436 -0.559 c
+59.524 -0.522 59.598 -0.463 59.656 -0.382 c
+59.723 -0.294 59.777 -0.177 59.818 -0.029 c
+59.866 0.118 59.891 0.301 59.891 0.529 c
+63.835 -0.647 m
+64.967 -0.647 l
+64.967 -1.264 l
+61.659 -1.264 l
+61.659 -0.647 l
+62.923 -0.647 l
+62.923 2.896 l
+61.998 2.896 l
+61.998 3.513 l
+63.835 3.513 l
+h
+68.998 0.484 m
+68.998 0.209 68.961 -0.04 68.895 -0.264 c
+68.824 -0.482 68.722 -0.669 68.586 -0.823 c
+68.446 -0.981 68.27 -1.103 68.057 -1.191 c
+67.84 -1.279 67.586 -1.323 67.293 -1.323 c
+67.017 -1.323 66.771 -1.279 66.557 -1.191 c
+66.352 -1.103 66.179 -0.981 66.043 -0.823 c
+65.903 -0.669 65.801 -0.482 65.734 -0.264 c
+65.665 -0.04 65.632 0.209 65.632 0.484 c
+65.632 0.738 65.661 0.974 65.72 1.19 c
+65.786 1.415 65.888 1.606 66.029 1.764 c
+66.164 1.929 66.341 2.057 66.557 2.146 c
+66.771 2.234 67.028 2.278 67.322 2.278 c
+67.634 2.278 67.895 2.234 68.101 2.146 c
+68.314 2.057 68.487 1.929 68.616 1.764 c
+68.751 1.606 68.851 1.415 68.909 1.19 c
+68.968 0.974 68.998 0.738 68.998 0.484 c
+68.042 0.484 m
+68.042 0.69 68.028 0.867 67.999 1.014 c
+67.976 1.161 67.939 1.282 67.881 1.382 c
+67.822 1.477 67.748 1.547 67.66 1.587 c
+67.571 1.635 67.461 1.66 67.336 1.66 c
+67.072 1.66 66.881 1.562 66.763 1.367 c
+66.646 1.18 66.587 0.885 66.587 0.484 c
+66.587 0.062 66.646 -0.243 66.763 -0.426 c
+66.881 -0.614 67.058 -0.706 67.293 -0.706 c
+67.417 -0.706 67.531 -0.688 67.631 -0.647 c
+67.726 -0.599 67.807 -0.526 67.866 -0.426 c
+67.932 -0.331 67.976 -0.206 67.999 -0.059 c
+68.028 0.088 68.042 0.268 68.042 0.484 c
+69.854 -1.264 m
+69.854 -0.97 l
+69.861 -0.834 69.869 -0.676 69.869 -0.5 c
+69.869 3.513 l
+70.78 3.513 l
+70.78 2.234 l
+70.78 2.072 l
+70.78 1.896 l
+70.78 1.845 70.773 1.801 70.765 1.764 c
+70.765 1.675 l
+70.78 1.675 l
+70.827 1.782 70.89 1.874 70.971 1.955 c
+71.048 2.032 71.133 2.094 71.221 2.146 c
+71.309 2.194 71.401 2.227 71.5 2.248 c
+71.596 2.267 71.695 2.278 71.794 2.278 c
+72.007 2.278 72.194 2.234 72.352 2.146 c
+72.507 2.057 72.635 1.929 72.735 1.764 c
+72.841 1.606 72.919 1.415 72.97 1.19 c
+73.017 0.974 73.044 0.735 73.044 0.47 c
+73.044 0.213 73.015 -0.026 72.955 -0.25 c
+72.897 -0.467 72.812 -0.658 72.705 -0.823 c
+72.595 -0.981 72.463 -1.103 72.309 -1.191 c
+72.151 -1.279 71.97 -1.323 71.764 -1.323 c
+71.666 -1.323 71.567 -1.312 71.471 -1.294 c
+71.382 -1.272 71.294 -1.242 71.206 -1.191 c
+71.118 -1.132 71.037 -1.066 70.971 -0.985 c
+70.901 -0.908 70.839 -0.809 70.78 -0.691 c
+70.765 -0.691 l
+70.765 -0.852 l
+70.765 -0.912 70.758 -0.97 70.75 -1.029 c
+70.75 -1.081 70.743 -1.128 70.736 -1.176 c
+70.736 -1.216 70.729 -1.246 70.721 -1.264 c
+h
+70.765 0.5 m
+70.765 0.264 70.783 0.066 70.824 -0.088 c
+70.872 -0.246 70.931 -0.368 71 -0.456 c
+71.066 -0.544 71.14 -0.611 71.221 -0.647 c
+71.298 -0.688 71.375 -0.706 71.456 -0.706 c
+71.662 -0.706 71.816 -0.611 71.926 -0.412 c
+72.044 -0.217 72.103 0.077 72.103 0.47 c
+72.103 0.683 72.08 0.867 72.044 1.014 c
+72.015 1.168 71.97 1.294 71.912 1.382 c
+71.86 1.477 71.794 1.55 71.706 1.602 c
+71.625 1.65 71.537 1.675 71.442 1.675 c
+71.361 1.675 71.284 1.654 71.206 1.617 c
+71.126 1.577 71.052 1.514 70.985 1.425 c
+70.927 1.338 70.872 1.213 70.824 1.058 c
+70.783 0.912 70.765 0.723 70.765 0.5 c
+74.873 -1.323 m
+74.704 -1.323 74.554 -1.301 74.418 -1.264 c
+74.289 -1.216 74.175 -1.147 74.079 -1.058 c
+73.992 -0.97 73.921 -0.864 73.874 -0.735 c
+73.823 -0.599 73.8 -0.449 73.8 -0.279 c
+73.8 -0.073 73.834 0.095 73.904 0.235 c
+73.969 0.382 74.065 0.492 74.183 0.573 c
+74.308 0.661 74.451 0.723 74.609 0.764 c
+74.775 0.801 74.951 0.827 75.138 0.837 c
+75.858 0.852 l
+75.858 1.029 l
+75.858 1.147 75.847 1.249 75.829 1.338 c
+75.807 1.425 75.774 1.492 75.726 1.543 c
+75.685 1.602 75.638 1.639 75.579 1.66 c
+75.521 1.679 75.454 1.69 75.388 1.69 c
+75.318 1.69 75.255 1.679 75.197 1.66 c
+75.145 1.65 75.097 1.624 75.05 1.587 c
+75.01 1.558 74.976 1.506 74.947 1.44 c
+74.925 1.382 74.91 1.301 74.903 1.205 c
+73.962 1.249 l
+73.992 1.396 74.035 1.532 74.095 1.66 c
+74.16 1.785 74.256 1.896 74.374 1.984 c
+74.492 2.08 74.631 2.153 74.8 2.205 c
+74.976 2.252 75.182 2.278 75.417 2.278 c
+75.858 2.278 76.19 2.168 76.417 1.955 c
+76.652 1.749 76.77 1.44 76.77 1.029 c
+76.77 -0.235 l
+76.77 -0.456 l
+76.777 -0.515 76.792 -0.57 76.814 -0.617 c
+76.832 -0.658 76.861 -0.691 76.902 -0.721 c
+76.938 -0.742 76.99 -0.75 77.049 -0.75 c
+77.115 -0.75 77.185 -0.746 77.254 -0.735 c
+77.254 -1.22 l
+77.196 -1.231 77.141 -1.242 77.093 -1.249 c
+77.053 -1.261 77.013 -1.268 76.976 -1.279 c
+76.936 -1.286 76.891 -1.294 76.843 -1.294 c
+76.792 -1.301 76.733 -1.309 76.666 -1.309 c
+76.439 -1.309 76.273 -1.257 76.167 -1.147 c
+76.057 -1.029 75.995 -0.864 75.976 -0.647 c
+75.961 -0.647 l
+75.891 -0.757 75.822 -0.852 75.756 -0.941 c
+75.685 -1.022 75.608 -1.087 75.521 -1.147 c
+75.432 -1.205 75.333 -1.249 75.226 -1.279 c
+75.127 -1.309 75.01 -1.323 74.873 -1.323 c
+75.858 0.353 m
+75.432 0.338 l
+75.333 0.338 75.241 0.33 75.153 0.324 c
+75.072 0.312 75.006 0.287 74.947 0.249 c
+74.889 0.209 74.837 0.151 74.8 0.073 c
+74.76 0.004 74.741 -0.088 74.741 -0.206 c
+74.741 -0.375 74.775 -0.497 74.844 -0.574 c
+74.91 -0.654 75.01 -0.691 75.138 -0.691 c
+75.245 -0.691 75.344 -0.669 75.432 -0.617 c
+75.527 -0.57 75.608 -0.507 75.667 -0.426 c
+75.733 -0.349 75.785 -0.262 75.814 -0.162 c
+75.843 -0.056 75.858 0.058 75.858 0.176 c
+h
+80.08 -0.647 m
+81.212 -0.647 l
+81.212 -1.264 l
+77.905 -1.264 l
+77.905 -0.647 l
+79.17 -0.647 l
+79.17 2.896 l
+78.243 2.896 l
+78.243 3.513 l
+80.08 3.513 l
+h
+86.982 2.219 m
+86.982 0.264 l
+86.982 0.125 86.989 0 87.011 -0.118 c
+87.03 -0.228 87.063 -0.32 87.114 -0.397 c
+87.162 -0.478 87.221 -0.54 87.29 -0.588 c
+87.357 -0.628 87.441 -0.647 87.54 -0.647 c
+87.629 -0.647 87.71 -0.628 87.791 -0.588 c
+87.878 -0.54 87.952 -0.47 88.011 -0.382 c
+88.069 -0.287 88.113 -0.177 88.144 -0.059 c
+88.18 0.066 88.202 0.206 88.202 0.353 c
+88.202 2.219 l
+89.098 2.219 l
+89.098 -0.485 l
+89.098 -0.721 l
+89.106 -0.802 89.113 -0.879 89.113 -0.956 c
+89.113 -1.147 l
+89.121 -1.199 89.128 -1.235 89.128 -1.264 c
+88.275 -1.264 l
+88.265 -1.235 88.254 -1.199 88.246 -1.147 c
+88.246 -0.956 l
+88.246 -0.889 88.239 -0.819 88.231 -0.75 c
+88.231 -0.574 l
+88.217 -0.574 l
+88.099 -0.838 87.945 -1.029 87.761 -1.147 c
+87.585 -1.264 87.382 -1.323 87.159 -1.323 c
+86.953 -1.323 86.779 -1.286 86.644 -1.22 c
+86.504 -1.154 86.394 -1.058 86.305 -0.941 c
+86.225 -0.823 86.166 -0.688 86.129 -0.53 c
+86.1 -0.364 86.085 -0.187 86.085 0 c
+86.085 2.219 l
+h
+93.262 -0.25 m
+93.262 -0.419 93.222 -0.57 93.144 -0.706 c
+93.075 -0.834 92.971 -0.948 92.836 -1.044 c
+92.707 -1.132 92.545 -1.202 92.351 -1.249 c
+92.163 -1.297 91.947 -1.323 91.704 -1.323 c
+91.477 -1.323 91.278 -1.309 91.101 -1.279 c
+90.925 -1.249 90.767 -1.202 90.631 -1.132 c
+90.492 -1.055 90.382 -0.956 90.293 -0.838 c
+90.205 -0.721 90.135 -0.574 90.087 -0.397 c
+90.895 -0.279 l
+90.914 -0.379 90.943 -0.456 90.984 -0.515 c
+91.032 -0.574 91.09 -0.617 91.16 -0.647 c
+91.226 -0.676 91.307 -0.702 91.396 -0.721 c
+91.483 -0.732 91.587 -0.735 91.704 -0.735 c
+91.799 -0.735 91.895 -0.732 91.984 -0.721 c
+92.071 -0.702 92.148 -0.676 92.219 -0.647 c
+92.285 -0.617 92.336 -0.58 92.366 -0.53 c
+92.402 -0.482 92.424 -0.419 92.424 -0.339 c
+92.424 -0.243 92.395 -0.169 92.336 -0.118 c
+92.285 -0.07 92.219 -0.029 92.13 0 c
+92.042 0.037 91.932 0.066 91.807 0.088 c
+91.689 0.118 91.557 0.147 91.41 0.176 c
+91.271 0.213 91.13 0.253 90.984 0.293 c
+90.844 0.341 90.719 0.405 90.602 0.484 c
+90.492 0.562 90.403 0.661 90.337 0.779 c
+90.267 0.897 90.234 1.047 90.234 1.234 c
+90.234 1.389 90.263 1.532 90.322 1.66 c
+90.388 1.797 90.484 1.911 90.602 1.999 c
+90.727 2.087 90.885 2.153 91.072 2.205 c
+91.255 2.252 91.469 2.278 91.704 2.278 c
+91.888 2.278 92.065 2.256 92.233 2.219 c
+92.398 2.19 92.545 2.135 92.674 2.057 c
+92.799 1.988 92.909 1.889 92.998 1.764 c
+93.085 1.646 93.144 1.502 93.174 1.338 c
+92.38 1.264 l
+92.358 1.341 92.329 1.404 92.292 1.455 c
+92.252 1.514 92.204 1.558 92.144 1.587 c
+92.094 1.624 92.031 1.65 91.954 1.66 c
+91.873 1.668 91.793 1.675 91.704 1.675 c
+91.487 1.675 91.325 1.646 91.219 1.587 c
+91.109 1.536 91.057 1.448 91.057 1.323 c
+91.057 1.242 91.076 1.18 91.116 1.132 c
+91.164 1.08 91.226 1.043 91.307 1.014 c
+91.396 0.985 91.491 0.955 91.601 0.926 c
+91.708 0.904 91.829 0.881 91.969 0.852 c
+92.123 0.823 92.281 0.783 92.439 0.735 c
+92.593 0.683 92.733 0.621 92.85 0.544 c
+92.969 0.463 93.064 0.36 93.144 0.235 c
+93.222 0.106 93.262 -0.056 93.262 -0.25 c
+95.783 -1.323 m
+95.525 -1.323 95.298 -1.286 95.092 -1.22 c
+94.887 -1.143 94.71 -1.029 94.563 -0.882 c
+94.416 -0.728 94.299 -0.536 94.21 -0.309 c
+94.129 -0.085 94.093 0.18 94.093 0.484 c
+94.093 0.816 94.137 1.095 94.224 1.323 c
+94.32 1.558 94.449 1.741 94.607 1.881 c
+94.772 2.017 94.96 2.117 95.165 2.175 c
+95.371 2.242 95.581 2.278 95.797 2.278 c
+96.069 2.278 96.304 2.227 96.503 2.131 c
+96.709 2.043 96.875 1.911 97.003 1.735 c
+97.139 1.565 97.239 1.359 97.297 1.117 c
+97.363 0.881 97.399 0.617 97.399 0.324 c
+97.399 0.309 l
+95.033 0.309 l
+95.033 0.162 95.048 0.022 95.078 -0.103 c
+95.114 -0.231 95.169 -0.345 95.24 -0.441 c
+95.305 -0.53 95.39 -0.599 95.489 -0.647 c
+95.585 -0.698 95.699 -0.721 95.827 -0.721 c
+95.982 -0.721 96.121 -0.688 96.239 -0.617 c
+96.364 -0.551 96.452 -0.449 96.503 -0.309 c
+97.341 -0.382 l
+97.312 -0.482 97.256 -0.588 97.179 -0.706 c
+97.098 -0.816 96.996 -0.919 96.871 -1.014 c
+96.753 -1.103 96.599 -1.176 96.415 -1.235 c
+96.239 -1.294 96.026 -1.323 95.783 -1.323 c
+95.783 1.705 m
+95.695 1.705 95.606 1.69 95.518 1.66 c
+95.43 1.631 95.35 1.58 95.283 1.514 c
+95.213 1.444 95.155 1.356 95.107 1.249 c
+95.066 1.139 95.048 1.014 95.048 0.867 c
+96.518 0.867 l
+96.518 1.003 96.493 1.124 96.445 1.234 c
+96.404 1.341 96.349 1.429 96.283 1.5 c
+96.224 1.565 96.15 1.617 96.063 1.646 c
+95.974 1.683 95.878 1.705 95.783 1.705 c
+101.299 1.469 m
+101.2 1.477 101.097 1.488 100.99 1.5 c
+100.88 1.517 100.759 1.529 100.622 1.529 c
+100.446 1.529 100.288 1.488 100.152 1.411 c
+100.013 1.341 99.895 1.242 99.799 1.117 c
+99.711 0.989 99.641 0.841 99.593 0.676 c
+99.554 0.507 99.535 0.33 99.535 0.147 c
+99.535 -1.264 l
+98.638 -1.264 l
+98.638 0.985 l
+98.638 1.11 98.627 1.234 98.609 1.352 c
+98.598 1.477 98.583 1.595 98.565 1.705 c
+98.554 1.822 98.539 1.918 98.521 1.999 c
+98.498 2.087 98.48 2.161 98.462 2.219 c
+99.344 2.219 l
+99.351 2.168 99.362 2.117 99.373 2.057 c
+99.392 1.999 99.406 1.933 99.417 1.866 c
+99.435 1.808 99.45 1.741 99.462 1.675 c
+99.469 1.606 99.479 1.543 99.491 1.484 c
+99.506 1.484 l
+99.542 1.602 99.593 1.708 99.653 1.808 c
+99.718 1.903 99.799 1.988 99.888 2.057 c
+99.976 2.124 100.079 2.179 100.196 2.219 c
+100.321 2.256 100.468 2.278 100.637 2.278 c
+100.763 2.278 100.88 2.271 100.99 2.263 c
+101.108 2.252 101.21 2.238 101.299 2.219 c
+h
+103.404 -0.279 0.927 -0.985 re
+103.404 -1.264 m
+108.597 -1.264 m
+108.597 0.72 l
+108.597 1.022 108.553 1.242 108.464 1.382 c
+108.384 1.529 108.248 1.602 108.053 1.602 c
+107.942 1.602 107.84 1.577 107.745 1.529 c
+107.656 1.477 107.575 1.411 107.51 1.323 c
+107.45 1.234 107.399 1.124 107.362 0.999 c
+107.333 0.881 107.318 0.75 107.318 0.602 c
+107.318 -1.264 l
+106.407 -1.264 l
+106.407 1.44 l
+106.407 1.66 l
+106.407 1.749 106.399 1.826 106.392 1.896 c
+106.392 2.087 l
+106.392 2.219 l
+107.244 2.219 l
+107.252 2.19 107.259 2.146 107.259 2.087 c
+107.259 1.896 l
+107.267 1.826 107.274 1.756 107.274 1.69 c
+107.281 1.62 107.288 1.565 107.288 1.529 c
+107.304 1.529 l
+107.421 1.793 107.572 1.984 107.759 2.102 c
+107.942 2.219 108.163 2.278 108.42 2.278 c
+108.605 2.278 108.765 2.248 108.906 2.19 c
+109.041 2.131 109.156 2.043 109.243 1.926 c
+109.332 1.808 109.394 1.664 109.434 1.5 c
+109.482 1.341 109.509 1.153 109.509 0.941 c
+109.509 -1.264 l
+h
+111.423 -1.323 m
+111.254 -1.323 111.103 -1.301 110.967 -1.264 c
+110.839 -1.216 110.724 -1.147 110.629 -1.058 c
+110.541 -0.97 110.471 -0.864 110.423 -0.735 c
+110.372 -0.599 110.35 -0.449 110.35 -0.279 c
+110.35 -0.073 110.383 0.095 110.452 0.235 c
+110.519 0.382 110.614 0.492 110.732 0.573 c
+110.857 0.661 111 0.723 111.158 0.764 c
+111.323 0.801 111.5 0.827 111.687 0.837 c
+112.408 0.852 l
+112.408 1.029 l
+112.408 1.147 112.397 1.249 112.378 1.338 c
+112.356 1.425 112.323 1.492 112.275 1.543 c
+112.235 1.602 112.187 1.639 112.129 1.66 c
+112.069 1.679 112.003 1.69 111.938 1.69 c
+111.867 1.69 111.805 1.679 111.746 1.66 c
+111.695 1.65 111.647 1.624 111.599 1.587 c
+111.559 1.558 111.526 1.506 111.496 1.44 c
+111.474 1.382 111.46 1.301 111.452 1.205 c
+110.511 1.249 l
+110.541 1.396 110.585 1.532 110.644 1.66 c
+110.71 1.785 110.805 1.896 110.923 1.984 c
+111.04 2.08 111.18 2.153 111.35 2.205 c
+111.526 2.252 111.732 2.278 111.967 2.278 c
+112.408 2.278 112.738 2.168 112.966 1.955 c
+113.201 1.749 113.319 1.44 113.319 1.029 c
+113.319 -0.235 l
+113.319 -0.456 l
+113.326 -0.515 113.341 -0.57 113.363 -0.617 c
+113.382 -0.658 113.411 -0.691 113.451 -0.721 c
+113.488 -0.742 113.54 -0.75 113.598 -0.75 c
+113.665 -0.75 113.734 -0.746 113.804 -0.735 c
+113.804 -1.22 l
+113.745 -1.231 113.69 -1.242 113.642 -1.249 c
+113.602 -1.261 113.561 -1.268 113.525 -1.279 c
+113.484 -1.286 113.44 -1.294 113.392 -1.294 c
+113.341 -1.301 113.282 -1.309 113.216 -1.309 c
+112.988 -1.309 112.823 -1.257 112.717 -1.147 c
+112.606 -1.029 112.543 -0.864 112.526 -0.647 c
+112.511 -0.647 l
+112.441 -0.757 112.37 -0.852 112.305 -0.941 c
+112.235 -1.022 112.158 -1.087 112.069 -1.147 c
+111.981 -1.205 111.882 -1.249 111.776 -1.279 c
+111.676 -1.309 111.559 -1.323 111.423 -1.323 c
+112.408 0.353 m
+111.981 0.338 l
+111.882 0.338 111.79 0.33 111.702 0.324 c
+111.622 0.312 111.555 0.287 111.496 0.249 c
+111.437 0.209 111.386 0.151 111.35 0.073 c
+111.309 0.004 111.29 -0.088 111.29 -0.206 c
+111.29 -0.375 111.323 -0.497 111.393 -0.574 c
+111.46 -0.654 111.559 -0.691 111.687 -0.691 c
+111.794 -0.691 111.893 -0.669 111.981 -0.617 c
+112.077 -0.57 112.158 -0.507 112.216 -0.426 c
+112.283 -0.349 112.334 -0.262 112.364 -0.162 c
+112.393 -0.056 112.408 0.058 112.408 0.176 c
+h
+115.693 -1.264 m
+115.693 0.852 l
+115.693 1.018 115.686 1.153 115.678 1.264 c
+115.667 1.371 115.649 1.455 115.62 1.514 c
+115.597 1.58 115.568 1.631 115.531 1.66 c
+115.502 1.69 115.462 1.705 115.414 1.705 c
+115.354 1.705 115.3 1.675 115.252 1.617 c
+115.211 1.565 115.178 1.492 115.149 1.396 c
+115.119 1.308 115.094 1.194 115.076 1.058 c
+115.065 0.918 115.061 0.768 115.061 0.602 c
+115.061 -1.264 l
+114.311 -1.264 l
+114.311 1.469 l
+114.311 1.705 l
+114.311 1.926 l
+114.311 2.003 114.304 2.065 114.296 2.117 c
+114.296 2.219 l
+114.972 2.219 l
+114.972 2.131 l
+114.972 1.984 l
+114.98 1.926 114.988 1.866 114.988 1.808 c
+114.988 1.646 l
+115.002 1.646 l
+115.02 1.735 115.05 1.812 115.09 1.881 c
+115.127 1.959 115.171 2.028 115.223 2.087 c
+115.281 2.146 115.348 2.19 115.428 2.219 c
+115.506 2.256 115.593 2.278 115.693 2.278 c
+115.877 2.278 116.017 2.223 116.104 2.117 c
+116.2 2.017 116.27 1.859 116.31 1.646 c
+116.325 1.646 l
+116.362 1.741 116.402 1.83 116.443 1.911 c
+116.49 1.988 116.545 2.051 116.604 2.102 c
+116.663 2.161 116.729 2.205 116.81 2.234 c
+116.887 2.263 116.975 2.278 117.074 2.278 c
+117.21 2.278 117.324 2.252 117.413 2.205 c
+117.501 2.153 117.567 2.08 117.619 1.984 c
+117.677 1.885 117.714 1.756 117.736 1.602 c
+117.766 1.455 117.78 1.271 117.78 1.058 c
+117.78 -1.264 l
+117.06 -1.264 l
+117.06 0.852 l
+117.06 1.018 117.052 1.153 117.045 1.264 c
+117.035 1.371 117.016 1.455 116.987 1.514 c
+116.964 1.58 116.935 1.631 116.898 1.66 c
+116.869 1.69 116.829 1.705 116.781 1.705 c
+116.663 1.705 116.567 1.617 116.501 1.44 c
+116.443 1.271 116.413 1.014 116.413 0.661 c
+116.413 -1.264 l
+h
+120.15 -1.323 m
+119.893 -1.323 119.665 -1.286 119.46 -1.22 c
+119.254 -1.143 119.077 -1.029 118.93 -0.882 c
+118.783 -0.728 118.666 -0.536 118.577 -0.309 c
+118.496 -0.085 118.46 0.18 118.46 0.484 c
+118.46 0.816 118.504 1.095 118.592 1.323 c
+118.687 1.558 118.816 1.741 118.974 1.881 c
+119.14 2.017 119.327 2.117 119.533 2.175 c
+119.739 2.242 119.948 2.278 120.165 2.278 c
+120.437 2.278 120.672 2.227 120.871 2.131 c
+121.076 2.043 121.242 1.911 121.37 1.735 c
+121.506 1.565 121.606 1.359 121.664 1.117 c
+121.731 0.881 121.767 0.617 121.767 0.324 c
+121.767 0.309 l
+119.401 0.309 l
+119.401 0.162 119.416 0.022 119.445 -0.103 c
+119.481 -0.231 119.537 -0.345 119.607 -0.441 c
+119.672 -0.53 119.757 -0.599 119.857 -0.647 c
+119.952 -0.698 120.066 -0.721 120.195 -0.721 c
+120.349 -0.721 120.488 -0.688 120.606 -0.617 c
+120.731 -0.551 120.819 -0.449 120.871 -0.309 c
+121.708 -0.382 l
+121.679 -0.482 121.623 -0.588 121.546 -0.706 c
+121.465 -0.816 121.363 -0.919 121.238 -1.014 c
+121.12 -1.103 120.966 -1.176 120.782 -1.235 c
+120.606 -1.294 120.393 -1.323 120.15 -1.323 c
+120.15 1.705 m
+120.062 1.705 119.974 1.69 119.886 1.66 c
+119.798 1.631 119.717 1.58 119.651 1.514 c
+119.581 1.444 119.522 1.356 119.474 1.249 c
+119.433 1.139 119.416 1.014 119.416 0.867 c
+120.885 0.867 l
+120.885 1.003 120.86 1.124 120.812 1.234 c
+120.771 1.341 120.717 1.429 120.65 1.5 c
+120.591 1.565 120.518 1.617 120.43 1.646 c
+120.341 1.683 120.246 1.705 120.15 1.705 c
+129.286 1.455 m
+128.654 1.455 l
+128.521 3.513 l
+129.418 3.513 l
+h
+127.815 1.455 m
+127.184 1.455 l
+127.067 3.513 l
+127.933 3.513 l
+h
+132.758 0.529 m
+132.758 -1.264 l
+131.817 -1.264 l
+131.817 0.529 l
+130.333 3.072 l
+131.318 3.072 l
+132.288 1.249 l
+133.259 3.072 l
+134.258 3.072 l
+h
+138.043 0.484 m
+138.043 0.209 138.006 -0.04 137.94 -0.264 c
+137.87 -0.482 137.768 -0.669 137.631 -0.823 c
+137.492 -0.981 137.315 -1.103 137.102 -1.191 c
+136.885 -1.279 136.632 -1.323 136.338 -1.323 c
+136.062 -1.323 135.815 -1.279 135.603 -1.191 c
+135.397 -1.103 135.224 -0.981 135.088 -0.823 c
+134.948 -0.669 134.846 -0.482 134.78 -0.264 c
+134.71 -0.04 134.676 0.209 134.676 0.484 c
+134.676 0.738 134.706 0.974 134.765 1.19 c
+134.831 1.415 134.934 1.606 135.073 1.764 c
+135.21 1.929 135.386 2.057 135.603 2.146 c
+135.815 2.234 136.073 2.278 136.367 2.278 c
+136.679 2.278 136.941 2.234 137.146 2.146 c
+137.359 2.057 137.532 1.929 137.66 1.764 c
+137.797 1.606 137.895 1.415 137.955 1.19 c
+138.013 0.974 138.043 0.738 138.043 0.484 c
+137.087 0.484 m
+137.087 0.69 137.072 0.867 137.043 1.014 c
+137.022 1.161 136.985 1.282 136.926 1.382 c
+136.867 1.477 136.793 1.547 136.705 1.587 c
+136.617 1.635 136.507 1.66 136.382 1.66 c
+136.117 1.66 135.926 1.562 135.809 1.367 c
+135.691 1.18 135.632 0.885 135.632 0.484 c
+135.632 0.062 135.691 -0.243 135.809 -0.426 c
+135.926 -0.614 136.102 -0.706 136.338 -0.706 c
+136.463 -0.706 136.577 -0.688 136.675 -0.647 c
+136.771 -0.599 136.852 -0.526 136.91 -0.426 c
+136.977 -0.331 137.022 -0.206 137.043 -0.059 c
+137.072 0.088 137.087 0.268 137.087 0.484 c
+139.781 2.219 m
+139.781 0.264 l
+139.781 0.125 139.788 0 139.81 -0.118 c
+139.829 -0.228 139.862 -0.32 139.913 -0.397 c
+139.961 -0.478 140.02 -0.54 140.089 -0.588 c
+140.156 -0.628 140.241 -0.647 140.339 -0.647 c
+140.428 -0.647 140.509 -0.628 140.59 -0.588 c
+140.677 -0.54 140.751 -0.47 140.81 -0.382 c
+140.868 -0.287 140.912 -0.177 140.943 -0.059 c
+140.979 0.066 141.001 0.206 141.001 0.353 c
+141.001 2.219 l
+141.897 2.219 l
+141.897 -0.485 l
+141.897 -0.721 l
+141.905 -0.802 141.912 -0.879 141.912 -0.956 c
+141.912 -1.147 l
+141.92 -1.199 141.927 -1.235 141.927 -1.264 c
+141.074 -1.264 l
+141.063 -1.235 141.053 -1.199 141.045 -1.147 c
+141.045 -0.956 l
+141.045 -0.889 141.038 -0.819 141.03 -0.75 c
+141.03 -0.574 l
+141.016 -0.574 l
+140.898 -0.838 140.744 -1.029 140.56 -1.147 c
+140.384 -1.264 140.181 -1.323 139.958 -1.323 c
+139.752 -1.323 139.578 -1.286 139.443 -1.22 c
+139.303 -1.154 139.193 -1.058 139.104 -0.941 c
+139.024 -0.823 138.965 -0.688 138.928 -0.53 c
+138.899 -0.364 138.884 -0.187 138.884 0 c
+138.884 2.219 l
+h
+145.973 1.469 m
+145.874 1.477 145.77 1.488 145.664 1.5 c
+145.554 1.517 145.433 1.529 145.296 1.529 c
+145.12 1.529 144.962 1.488 144.826 1.411 c
+144.687 1.341 144.569 1.242 144.474 1.117 c
+144.386 0.989 144.316 0.841 144.268 0.676 c
+144.228 0.507 144.209 0.33 144.209 0.147 c
+144.209 -1.264 l
+143.312 -1.264 l
+143.312 0.985 l
+143.312 1.11 143.301 1.234 143.283 1.352 c
+143.272 1.477 143.258 1.595 143.239 1.705 c
+143.228 1.822 143.213 1.918 143.195 1.999 c
+143.173 2.087 143.154 2.161 143.136 2.219 c
+144.018 2.219 l
+144.025 2.168 144.037 2.117 144.047 2.057 c
+144.066 1.999 144.081 1.933 144.091 1.866 c
+144.11 1.808 144.124 1.741 144.135 1.675 c
+144.143 1.606 144.154 1.543 144.165 1.484 c
+144.18 1.484 l
+144.216 1.602 144.268 1.708 144.326 1.808 c
+144.393 1.903 144.474 1.988 144.562 2.057 c
+144.65 2.124 144.753 2.179 144.87 2.219 c
+144.995 2.256 145.142 2.278 145.311 2.278 c
+145.436 2.278 145.554 2.271 145.664 2.263 c
+145.782 2.252 145.885 2.238 145.973 2.219 c
+h
+153.036 -1.264 m
+151.801 1.984 l
+151.808 1.826 151.823 1.679 151.845 1.543 c
+151.845 1.352 l
+151.852 1.294 151.86 1.228 151.86 1.161 c
+151.867 1.103 151.875 1.043 151.875 0.985 c
+151.881 0.933 151.889 0.889 151.889 0.852 c
+151.889 -1.264 l
+151.066 -1.264 l
+151.066 3.072 l
+152.139 3.072 l
+153.404 -0.264 l
+153.381 -0.118 153.367 0.022 153.359 0.162 c
+153.348 0.287 153.337 0.415 153.33 0.544 c
+153.319 0.679 153.315 0.801 153.315 0.912 c
+153.315 3.072 l
+154.138 3.072 l
+154.138 -1.264 l
+h
+156.101 -1.323 m
+155.931 -1.323 155.781 -1.301 155.644 -1.264 c
+155.516 -1.216 155.403 -1.147 155.307 -1.058 c
+155.218 -0.97 155.149 -0.864 155.101 -0.735 c
+155.05 -0.599 155.027 -0.449 155.027 -0.279 c
+155.027 -0.073 155.06 0.095 155.131 0.235 c
+155.197 0.382 155.293 0.492 155.409 0.573 c
+155.534 0.661 155.678 0.723 155.836 0.764 c
+156.001 0.801 156.178 0.827 156.365 0.837 c
+157.086 0.852 l
+157.086 1.029 l
+157.086 1.147 157.074 1.249 157.055 1.338 c
+157.034 1.425 157.001 1.492 156.953 1.543 c
+156.913 1.602 156.865 1.639 156.806 1.66 c
+156.747 1.679 156.681 1.69 156.615 1.69 c
+156.546 1.69 156.483 1.679 156.424 1.66 c
+156.373 1.65 156.325 1.624 156.277 1.587 c
+156.236 1.558 156.203 1.506 156.174 1.44 c
+156.152 1.382 156.137 1.301 156.13 1.205 c
+155.189 1.249 l
+155.218 1.396 155.262 1.532 155.322 1.66 c
+155.388 1.785 155.484 1.896 155.601 1.984 c
+155.719 2.08 155.858 2.153 156.027 2.205 c
+156.203 2.252 156.409 2.278 156.644 2.278 c
+157.086 2.278 157.416 2.168 157.644 1.955 c
+157.88 1.749 157.996 1.44 157.996 1.029 c
+157.996 -0.235 l
+157.996 -0.456 l
+158.004 -0.515 158.019 -0.57 158.04 -0.617 c
+158.059 -0.658 158.088 -0.691 158.129 -0.721 c
+158.166 -0.742 158.217 -0.75 158.276 -0.75 c
+158.342 -0.75 158.412 -0.746 158.482 -0.735 c
+158.482 -1.22 l
+158.423 -1.231 158.368 -1.242 158.32 -1.249 c
+158.279 -1.261 158.239 -1.268 158.202 -1.279 c
+158.162 -1.286 158.118 -1.294 158.071 -1.294 c
+158.019 -1.301 157.96 -1.309 157.894 -1.309 c
+157.666 -1.309 157.5 -1.257 157.394 -1.147 c
+157.284 -1.029 157.221 -0.864 157.203 -0.647 c
+157.188 -0.647 l
+157.119 -0.757 157.049 -0.852 156.982 -0.941 c
+156.913 -1.022 156.835 -1.087 156.747 -1.147 c
+156.659 -1.205 156.56 -1.249 156.453 -1.279 c
+156.354 -1.309 156.236 -1.323 156.101 -1.323 c
+157.086 0.353 m
+156.659 0.338 l
+156.56 0.338 156.468 0.33 156.38 0.324 c
+156.299 0.312 156.233 0.287 156.174 0.249 c
+156.115 0.209 156.064 0.151 156.027 0.073 c
+155.987 0.004 155.968 -0.088 155.968 -0.206 c
+155.968 -0.375 156.001 -0.497 156.071 -0.574 c
+156.137 -0.654 156.236 -0.691 156.365 -0.691 c
+156.471 -0.691 156.571 -0.669 156.659 -0.617 c
+156.754 -0.57 156.835 -0.507 156.895 -0.426 c
+156.96 -0.349 157.012 -0.262 157.041 -0.162 c
+157.071 -0.056 157.086 0.058 157.086 0.176 c
+h
+160.367 -1.264 m
+160.367 0.852 l
+160.367 1.018 160.359 1.153 160.352 1.264 c
+160.341 1.371 160.323 1.455 160.294 1.514 c
+160.271 1.58 160.242 1.631 160.205 1.66 c
+160.176 1.69 160.135 1.705 160.087 1.705 c
+160.029 1.705 159.974 1.675 159.926 1.617 c
+159.885 1.565 159.852 1.492 159.823 1.396 c
+159.794 1.308 159.768 1.194 159.75 1.058 c
+159.738 0.918 159.735 0.768 159.735 0.602 c
+159.735 -1.264 l
+158.985 -1.264 l
+158.985 1.469 l
+158.985 1.705 l
+158.985 1.926 l
+158.985 2.003 158.977 2.065 158.971 2.117 c
+158.971 2.219 l
+159.646 2.219 l
+159.646 2.131 l
+159.646 1.984 l
+159.654 1.926 159.661 1.866 159.661 1.808 c
+159.661 1.646 l
+159.676 1.646 l
+159.694 1.735 159.723 1.812 159.764 1.881 c
+159.801 1.959 159.845 2.028 159.897 2.087 c
+159.956 2.146 160.022 2.19 160.103 2.219 c
+160.18 2.256 160.268 2.278 160.367 2.278 c
+160.55 2.278 160.691 2.223 160.779 2.117 c
+160.874 2.017 160.944 1.859 160.984 1.646 c
+160.999 1.646 l
+161.036 1.741 161.076 1.83 161.117 1.911 c
+161.165 1.988 161.219 2.051 161.278 2.102 c
+161.337 2.161 161.404 2.205 161.484 2.234 c
+161.562 2.263 161.649 2.278 161.749 2.278 c
+161.884 2.278 161.998 2.252 162.087 2.205 c
+162.175 2.153 162.241 2.08 162.293 1.984 c
+162.351 1.885 162.388 1.756 162.41 1.602 c
+162.439 1.455 162.454 1.271 162.454 1.058 c
+162.454 -1.264 l
+161.734 -1.264 l
+161.734 0.852 l
+161.734 1.018 161.726 1.153 161.72 1.264 c
+161.708 1.371 161.69 1.455 161.66 1.514 c
+161.639 1.58 161.609 1.631 161.572 1.66 c
+161.543 1.69 161.502 1.705 161.454 1.705 c
+161.337 1.705 161.242 1.617 161.175 1.44 c
+161.117 1.271 161.088 1.014 161.088 0.661 c
+161.088 -1.264 l
+h
+164.824 -1.323 m
+164.567 -1.323 164.34 -1.286 164.134 -1.22 c
+163.928 -1.143 163.752 -1.029 163.604 -0.882 c
+163.457 -0.728 163.34 -0.536 163.251 -0.309 c
+163.17 -0.085 163.134 0.18 163.134 0.484 c
+163.134 0.816 163.178 1.095 163.266 1.323 c
+163.362 1.558 163.49 1.741 163.648 1.881 c
+163.814 2.017 164.001 2.117 164.207 2.175 c
+164.413 2.242 164.622 2.278 164.839 2.278 c
+165.111 2.278 165.346 2.227 165.545 2.131 c
+165.751 2.043 165.915 1.911 166.044 1.735 c
+166.181 1.565 166.279 1.359 166.339 1.117 c
+166.405 0.881 166.441 0.617 166.441 0.324 c
+166.441 0.309 l
+164.074 0.309 l
+164.074 0.162 164.089 0.022 164.119 -0.103 c
+164.155 -0.231 164.211 -0.345 164.28 -0.441 c
+164.346 -0.53 164.431 -0.599 164.531 -0.647 c
+164.626 -0.698 164.739 -0.721 164.868 -0.721 c
+165.023 -0.721 165.163 -0.688 165.28 -0.617 c
+165.406 -0.551 165.493 -0.449 165.545 -0.309 c
+166.383 -0.382 l
+166.353 -0.482 166.298 -0.588 166.221 -0.706 c
+166.14 -0.816 166.037 -0.919 165.913 -1.014 c
+165.795 -1.103 165.641 -1.176 165.456 -1.235 c
+165.28 -1.294 165.067 -1.323 164.824 -1.323 c
+164.824 1.705 m
+164.737 1.705 164.648 1.69 164.56 1.66 c
+164.471 1.631 164.39 1.58 164.325 1.514 c
+164.255 1.444 164.196 1.356 164.149 1.249 c
+164.108 1.139 164.089 1.014 164.089 0.867 c
+165.56 0.867 l
+165.56 1.003 165.533 1.124 165.485 1.234 c
+165.445 1.341 165.39 1.429 165.325 1.5 c
+165.265 1.565 165.192 1.617 165.104 1.646 c
+165.015 1.683 164.92 1.705 164.824 1.705 c
+169.899 1.455 m
+169.267 1.455 l
+169.135 3.513 l
+170.031 3.513 l
+h
+168.429 1.455 m
+167.797 1.455 l
+167.679 3.513 l
+168.547 3.513 l
+h
+f
+Q
+q 1 0 0 1 91.976 390.0891 cm
+0 0 m
+0 0.265 -0.073 0.464 -0.22 0.603 c
+-0.36 0.75 -0.617 0.89 -0.999 1.029 c
+-1.374 1.166 -1.66 1.309 -1.866 1.455 c
+-2.065 1.603 -2.212 1.768 -2.308 1.956 c
+-2.406 2.151 -2.454 2.371 -2.454 2.617 c
+-2.454 3.036 -2.315 3.385 -2.028 3.66 c
+-1.745 3.932 -1.378 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.088 3.851 c
+0.154 3.712 0.341 3.517 0.47 3.263 c
+0.607 3.017 0.676 2.749 0.676 2.455 c
+0 2.455 l
+0 2.786 -0.081 3.043 -0.235 3.219 c
+-0.393 3.404 -0.625 3.499 -0.926 3.499 c
+-1.19 3.499 -1.404 3.418 -1.558 3.263 c
+-1.705 3.117 -1.779 2.903 -1.779 2.631 c
+-1.779 2.404 -1.701 2.213 -1.544 2.058 c
+-1.378 1.912 -1.124 1.771 -0.779 1.646 c
+-0.261 1.478 0.11 1.268 0.338 1.015 c
+0.573 0.757 0.691 0.427 0.691 0.015 c
+0.691 -0.426 0.548 -0.779 0.264 -1.043 c
+-0.022 -1.3 -0.405 -1.425 -0.881 -1.425 c
+-1.198 -1.425 -1.484 -1.356 -1.749 -1.219 c
+-2.014 -1.084 -2.227 -0.893 -2.381 -0.646 c
+-2.528 -0.404 -2.601 -0.118 -2.601 0.206 c
+-1.926 0.206 l
+-1.926 -0.128 -1.834 -0.389 -1.646 -0.573 c
+-1.463 -0.76 -1.205 -0.852 -0.881 -0.852 c
+-0.588 -0.852 -0.368 -0.779 -0.22 -0.631 c
+-0.073 -0.477 0 -0.264 0 0 c
+2.896 -1.425 m
+2.396 -1.425 2.014 -1.278 1.749 -0.984 c
+1.484 -0.69 1.353 -0.257 1.353 0.324 c
+1.353 0.794 l
+1.353 1.389 1.477 1.856 1.735 2.191 c
+1.999 2.532 2.359 2.705 2.822 2.705 c
+3.281 2.705 3.624 2.55 3.851 2.249 c
+4.087 1.956 4.208 1.492 4.219 0.867 c
+4.219 0.441 l
+1.999 0.441 l
+1.999 0.353 l
+1.999 -0.08 2.076 -0.393 2.234 -0.588 c
+2.4 -0.775 2.631 -0.866 2.925 -0.866 c
+3.12 -0.866 3.293 -0.833 3.439 -0.764 c
+3.587 -0.687 3.723 -0.569 3.851 -0.411 c
+4.189 -0.823 l
+3.903 -1.227 3.473 -1.425 2.896 -1.425 c
+2.822 2.147 m
+2.547 2.147 2.344 2.051 2.219 1.867 c
+2.091 1.68 2.018 1.389 1.999 1 c
+3.572 1 l
+3.572 1.088 l
+3.55 1.47 3.484 1.738 3.366 1.897 c
+3.248 2.062 3.065 2.147 2.822 2.147 c
+5.85 3.587 m
+5.85 2.631 l
+6.453 2.631 l
+6.453 2.103 l
+5.85 2.103 l
+5.85 -0.367 l
+5.85 -0.525 5.872 -0.643 5.924 -0.72 c
+5.982 -0.801 6.071 -0.837 6.188 -0.837 c
+6.277 -0.837 6.365 -0.823 6.453 -0.793 c
+6.453 -1.352 l
+6.306 -1.4 6.151 -1.425 5.997 -1.425 c
+5.74 -1.425 5.546 -1.334 5.409 -1.146 c
+5.27 -0.962 5.203 -0.702 5.203 -0.367 c
+5.203 2.103 l
+4.601 2.103 l
+4.601 2.631 l
+5.203 2.631 l
+5.203 3.587 l
+h
+9.789 3.587 m
+9.789 2.631 l
+10.392 2.631 l
+10.392 2.103 l
+9.789 2.103 l
+9.789 -0.367 l
+9.789 -0.525 9.812 -0.643 9.864 -0.72 c
+9.922 -0.801 10.01 -0.837 10.128 -0.837 c
+10.215 -0.837 10.304 -0.823 10.392 -0.793 c
+10.392 -1.352 l
+10.246 -1.4 10.091 -1.425 9.937 -1.425 c
+9.679 -1.425 9.485 -1.334 9.349 -1.146 c
+9.209 -0.962 9.143 -0.702 9.143 -0.367 c
+9.143 2.103 l
+8.54 2.103 l
+8.54 2.631 l
+9.143 2.631 l
+9.143 3.587 l
+h
+11.803 2.22 m
+12.057 2.544 12.376 2.705 12.759 2.705 c
+13.465 2.705 13.821 2.234 13.832 1.294 c
+13.832 -1.352 l
+13.185 -1.352 l
+13.185 1.264 l
+13.185 1.577 13.13 1.798 13.024 1.926 c
+12.914 2.051 12.759 2.117 12.553 2.117 c
+12.395 2.117 12.248 2.062 12.112 1.956 c
+11.983 1.845 11.881 1.709 11.803 1.544 c
+11.803 -1.352 l
+11.156 -1.352 l
+11.156 4.293 l
+11.803 4.293 l
+h
+16.214 -1.425 m
+15.713 -1.425 15.331 -1.278 15.067 -0.984 c
+14.803 -0.69 14.67 -0.257 14.67 0.324 c
+14.67 0.794 l
+14.67 1.389 14.795 1.856 15.052 2.191 c
+15.316 2.532 15.676 2.705 16.139 2.705 c
+16.599 2.705 16.941 2.55 17.168 2.249 c
+17.404 1.956 17.525 1.492 17.536 0.867 c
+17.536 0.441 l
+15.316 0.441 l
+15.316 0.353 l
+15.316 -0.08 15.393 -0.393 15.551 -0.588 c
+15.717 -0.775 15.948 -0.866 16.243 -0.866 c
+16.438 -0.866 16.61 -0.833 16.757 -0.764 c
+16.904 -0.687 17.04 -0.569 17.168 -0.411 c
+17.506 -0.823 l
+17.22 -1.227 16.79 -1.425 16.214 -1.425 c
+16.139 2.147 m
+15.864 2.147 15.662 2.051 15.537 1.867 c
+15.408 1.68 15.335 1.389 15.316 1 c
+16.889 1 l
+16.889 1.088 l
+16.867 1.47 16.801 1.738 16.684 1.897 c
+16.565 2.062 16.382 2.147 16.139 2.147 c
+20.652 2.631 m
+20.667 2.191 l
+20.92 2.532 21.244 2.705 21.637 2.705 c
+22.343 2.705 22.699 2.234 22.71 1.294 c
+22.71 -1.352 l
+22.063 -1.352 l
+22.063 1.264 l
+22.063 1.577 22.009 1.798 21.901 1.926 c
+21.791 2.051 21.637 2.117 21.431 2.117 c
+21.273 2.117 21.126 2.062 20.991 1.956 c
+20.862 1.845 20.759 1.709 20.682 1.544 c
+20.682 -1.352 l
+20.035 -1.352 l
+20.035 2.631 l
+h
+25.724 -1.352 m
+25.683 -1.263 25.658 -1.117 25.65 -0.911 c
+25.415 -1.256 25.121 -1.425 24.768 -1.425 c
+24.405 -1.425 24.121 -1.33 23.915 -1.132 c
+23.717 -0.926 23.621 -0.639 23.621 -0.264 c
+23.621 0.136 23.757 0.456 24.033 0.691 c
+24.305 0.934 24.68 1.058 25.151 1.058 c
+25.635 1.058 l
+25.635 1.485 l
+25.635 1.721 25.581 1.885 25.473 1.985 c
+25.363 2.091 25.201 2.147 24.989 2.147 c
+24.79 2.147 24.629 2.087 24.503 1.97 c
+24.386 1.852 24.327 1.706 24.327 1.529 c
+23.68 1.529 l
+23.68 1.723 23.74 1.915 23.856 2.103 c
+23.981 2.286 24.143 2.433 24.342 2.544 c
+24.548 2.65 24.775 2.705 25.032 2.705 c
+25.433 2.705 25.738 2.602 25.944 2.396 c
+26.157 2.191 26.271 1.897 26.282 1.515 c
+26.282 -0.5 l
+26.282 -0.804 26.319 -1.069 26.4 -1.294 c
+26.4 -1.352 l
+h
+24.856 -0.837 m
+25.022 -0.837 25.172 -0.793 25.312 -0.706 c
+25.459 -0.617 25.566 -0.507 25.635 -0.367 c
+25.635 0.574 l
+25.267 0.574 l
+24.952 0.574 24.709 0.504 24.533 0.368 c
+24.357 0.239 24.268 0.052 24.268 -0.191 c
+24.268 -0.419 24.312 -0.584 24.401 -0.69 c
+24.488 -0.789 24.64 -0.837 24.856 -0.837 c
+27.899 2.631 m
+27.914 2.264 l
+28.156 2.558 28.476 2.705 28.869 2.705 c
+29.31 2.705 29.619 2.507 29.795 2.117 c
+30.049 2.507 30.398 2.705 30.838 2.705 c
+31.574 2.705 31.948 2.242 31.971 1.324 c
+31.971 -1.352 l
+31.324 -1.352 l
+31.324 1.264 l
+31.324 1.559 31.268 1.771 31.162 1.912 c
+31.063 2.047 30.89 2.117 30.647 2.117 c
+30.449 2.117 30.287 2.037 30.163 1.881 c
+30.045 1.735 29.975 1.544 29.957 1.309 c
+29.957 -1.352 l
+29.296 -1.352 l
+29.296 1.294 l
+29.296 1.841 29.074 2.117 28.634 2.117 c
+28.299 2.117 28.064 1.956 27.929 1.632 c
+27.929 -1.352 l
+27.281 -1.352 l
+27.281 2.631 l
+h
+34.366 -1.425 m
+33.867 -1.425 33.485 -1.278 33.22 -0.984 c
+32.955 -0.69 32.823 -0.257 32.823 0.324 c
+32.823 0.794 l
+32.823 1.389 32.948 1.856 33.205 2.191 c
+33.47 2.532 33.83 2.705 34.293 2.705 c
+34.753 2.705 35.094 2.55 35.322 2.249 c
+35.557 1.956 35.678 1.492 35.69 0.867 c
+35.69 0.441 l
+33.47 0.441 l
+33.47 0.353 l
+33.47 -0.08 33.547 -0.393 33.705 -0.588 c
+33.87 -0.775 34.102 -0.866 34.396 -0.866 c
+34.591 -0.866 34.763 -0.833 34.91 -0.764 c
+35.058 -0.687 35.193 -0.569 35.322 -0.411 c
+35.66 -0.823 l
+35.374 -1.227 34.944 -1.425 34.366 -1.425 c
+34.293 2.147 m
+34.017 2.147 33.815 2.051 33.691 1.867 c
+33.562 1.68 33.488 1.389 33.47 1 c
+35.043 1 l
+35.043 1.088 l
+35.021 1.47 34.954 1.738 34.837 1.897 c
+34.719 2.062 34.535 2.147 34.293 2.147 c
+39.041 3.587 m
+39.041 2.631 l
+39.644 2.631 l
+39.644 2.103 l
+39.041 2.103 l
+39.041 -0.367 l
+39.041 -0.525 39.063 -0.643 39.114 -0.72 c
+39.173 -0.801 39.262 -0.837 39.378 -0.837 c
+39.467 -0.837 39.555 -0.823 39.644 -0.793 c
+39.644 -1.352 l
+39.497 -1.4 39.342 -1.425 39.187 -1.425 c
+38.931 -1.425 38.736 -1.334 38.599 -1.146 c
+38.46 -0.962 38.394 -0.702 38.394 -0.367 c
+38.394 2.103 l
+37.791 2.103 l
+37.791 2.631 l
+38.394 2.631 l
+38.394 3.587 l
+h
+41.055 2.22 m
+41.308 2.544 41.628 2.705 42.01 2.705 c
+42.715 2.705 43.072 2.234 43.083 1.294 c
+43.083 -1.352 l
+42.436 -1.352 l
+42.436 1.264 l
+42.436 1.577 42.381 1.798 42.275 1.926 c
+42.164 2.051 42.01 2.117 41.805 2.117 c
+41.647 2.117 41.499 2.062 41.363 1.956 c
+41.234 1.845 41.132 1.709 41.055 1.544 c
+41.055 -1.352 l
+40.408 -1.352 l
+40.408 4.293 l
+41.055 4.293 l
+h
+46.082 -1.352 m
+46.042 -1.263 46.015 -1.117 46.008 -0.911 c
+45.773 -1.256 45.479 -1.425 45.126 -1.425 c
+44.762 -1.425 44.479 -1.33 44.274 -1.132 c
+44.076 -0.926 43.98 -0.639 43.98 -0.264 c
+43.98 0.136 44.116 0.456 44.392 0.691 c
+44.663 0.934 45.038 1.058 45.508 1.058 c
+45.994 1.058 l
+45.994 1.485 l
+45.994 1.721 45.938 1.885 45.832 1.985 c
+45.722 2.091 45.56 2.147 45.346 2.147 c
+45.148 2.147 44.986 2.087 44.862 1.97 c
+44.744 1.852 44.685 1.706 44.685 1.529 c
+44.039 1.529 l
+44.039 1.723 44.097 1.915 44.215 2.103 c
+44.34 2.286 44.502 2.433 44.7 2.544 c
+44.906 2.65 45.134 2.705 45.391 2.705 c
+45.791 2.705 46.096 2.602 46.302 2.396 c
+46.515 2.191 46.63 1.897 46.64 1.515 c
+46.64 -0.5 l
+46.64 -0.804 46.677 -1.069 46.758 -1.294 c
+46.758 -1.352 l
+h
+45.215 -0.837 m
+45.379 -0.837 45.531 -0.793 45.67 -0.706 c
+45.817 -0.617 45.924 -0.507 45.994 -0.367 c
+45.994 0.574 l
+45.626 0.574 l
+45.31 0.574 45.067 0.504 44.891 0.368 c
+44.714 0.239 44.627 0.052 44.627 -0.191 c
+44.627 -0.419 44.671 -0.584 44.758 -0.69 c
+44.847 -0.789 44.997 -0.837 45.215 -0.837 c
+48.492 3.587 m
+48.492 2.631 l
+49.095 2.631 l
+49.095 2.103 l
+48.492 2.103 l
+48.492 -0.367 l
+48.492 -0.525 48.514 -0.643 48.566 -0.72 c
+48.625 -0.801 48.712 -0.837 48.83 -0.837 c
+48.918 -0.837 49.007 -0.823 49.095 -0.793 c
+49.095 -1.352 l
+48.948 -1.4 48.793 -1.425 48.639 -1.425 c
+48.382 -1.425 48.187 -1.334 48.051 -1.146 c
+47.912 -0.962 47.845 -0.702 47.845 -0.367 c
+47.845 2.103 l
+47.243 2.103 l
+47.243 2.631 l
+47.845 2.631 l
+47.845 3.587 l
+h
+54.549 -0.205 m
+55.151 2.631 l
+55.798 2.631 l
+54.813 -1.352 l
+54.299 -1.352 l
+53.52 1.5 l
+52.77 -1.352 l
+52.24 -1.352 l
+51.285 2.631 l
+51.918 2.631 l
+52.535 -0.132 l
+53.269 2.631 l
+53.784 2.631 l
+h
+57.179 -1.352 -0.646 3.983 re
+57.223 3.675 m
+57.223 3.565 57.194 3.473 57.136 3.396 c
+57.077 3.326 56.981 3.293 56.856 3.293 c
+56.739 3.293 56.643 3.326 56.577 3.396 c
+56.518 3.473 56.489 3.565 56.489 3.675 c
+56.489 3.793 56.518 3.884 56.577 3.955 c
+56.643 4.032 56.739 4.072 56.856 4.072 c
+56.981 4.072 57.077 4.032 57.136 3.955 c
+57.194 3.874 57.223 3.782 57.223 3.675 c
+58.899 -1.352 -0.646 5.644 re
+60.619 -1.352 -0.647 5.644 re
+66.234 0.441 m
+66.234 -0.176 66.12 -0.643 65.896 -0.955 c
+65.68 -1.271 65.356 -1.425 64.926 -1.425 c
+64.504 -1.425 64.191 -1.246 63.985 -0.881 c
+63.956 -1.352 l
+63.353 -1.352 l
+63.353 4.293 l
+63.999 4.293 l
+63.999 2.191 l
+64.213 2.532 64.522 2.705 64.926 2.705 c
+65.356 2.705 65.68 2.547 65.896 2.234 c
+66.12 1.929 66.234 1.463 66.234 0.838 c
+h
+65.587 0.823 m
+65.587 1.294 65.518 1.625 65.381 1.823 c
+65.252 2.018 65.044 2.117 64.749 2.117 c
+64.415 2.117 64.165 1.933 63.999 1.573 c
+63.999 -0.309 l
+64.165 -0.672 64.419 -0.852 64.764 -0.852 c
+65.058 -0.852 65.268 -0.749 65.396 -0.544 c
+65.522 -0.338 65.587 -0.022 65.587 0.412 c
+h
+68.498 -1.425 m
+67.998 -1.425 67.616 -1.278 67.351 -0.984 c
+67.087 -0.69 66.954 -0.257 66.954 0.324 c
+66.954 0.794 l
+66.954 1.389 67.079 1.856 67.336 2.191 c
+67.601 2.532 67.961 2.705 68.425 2.705 c
+68.884 2.705 69.225 2.55 69.453 2.249 c
+69.688 1.956 69.809 1.492 69.821 0.867 c
+69.821 0.441 l
+67.601 0.441 l
+67.601 0.353 l
+67.601 -0.08 67.679 -0.393 67.836 -0.588 c
+68.001 -0.775 68.233 -0.866 68.527 -0.866 c
+68.722 -0.866 68.895 -0.833 69.042 -0.764 c
+69.189 -0.687 69.325 -0.569 69.453 -0.411 c
+69.792 -0.823 l
+69.505 -1.227 69.075 -1.425 68.498 -1.425 c
+68.425 2.147 m
+68.149 2.147 67.947 2.051 67.822 1.867 c
+67.693 1.68 67.619 1.389 67.601 1 c
+69.173 1 l
+69.173 1.088 l
+69.152 1.47 69.086 1.738 68.968 1.897 c
+68.851 2.062 68.666 2.147 68.425 2.147 c
+74.363 -1.352 m
+74.322 -1.263 74.297 -1.117 74.289 -0.911 c
+74.054 -1.256 73.76 -1.425 73.407 -1.425 c
+73.044 -1.425 72.761 -1.33 72.555 -1.132 c
+72.356 -0.926 72.261 -0.639 72.261 -0.264 c
+72.261 0.136 72.396 0.456 72.672 0.691 c
+72.944 0.934 73.319 1.058 73.79 1.058 c
+74.274 1.058 l
+74.274 1.485 l
+74.274 1.721 74.22 1.885 74.112 1.985 c
+74.002 2.091 73.841 2.147 73.628 2.147 c
+73.429 2.147 73.268 2.087 73.142 1.97 c
+73.025 1.852 72.967 1.706 72.967 1.529 c
+72.319 1.529 l
+72.319 1.723 72.379 1.915 72.496 2.103 c
+72.62 2.286 72.782 2.433 72.981 2.544 c
+73.187 2.65 73.414 2.705 73.672 2.705 c
+74.072 2.705 74.378 2.602 74.583 2.396 c
+74.796 2.191 74.91 1.897 74.921 1.515 c
+74.921 -0.5 l
+74.921 -0.804 74.958 -1.069 75.039 -1.294 c
+75.039 -1.352 l
+h
+73.495 -0.837 m
+73.661 -0.837 73.811 -0.793 73.951 -0.706 c
+74.098 -0.617 74.205 -0.507 74.274 -0.367 c
+74.274 0.574 l
+73.907 0.574 l
+73.591 0.574 73.348 0.504 73.172 0.368 c
+72.996 0.239 72.907 0.052 72.907 -0.191 c
+72.907 -0.419 72.952 -0.584 73.04 -0.69 c
+73.128 -0.789 73.279 -0.837 73.495 -0.837 c
+76.773 3.587 m
+76.773 2.631 l
+77.376 2.631 l
+77.376 2.103 l
+76.773 2.103 l
+76.773 -0.367 l
+76.773 -0.525 76.795 -0.643 76.847 -0.72 c
+76.905 -0.801 76.994 -0.837 77.111 -0.837 c
+77.2 -0.837 77.287 -0.823 77.376 -0.793 c
+77.376 -1.352 l
+77.229 -1.4 77.075 -1.425 76.92 -1.425 c
+76.663 -1.425 76.468 -1.334 76.333 -1.146 c
+76.192 -0.962 76.126 -0.702 76.126 -0.367 c
+76.126 2.103 l
+75.523 2.103 l
+75.523 2.631 l
+76.126 2.631 l
+76.126 3.587 l
+h
+78.993 3.587 m
+78.993 2.631 l
+79.595 2.631 l
+79.595 2.103 l
+78.993 2.103 l
+78.993 -0.367 l
+78.993 -0.525 79.015 -0.643 79.066 -0.72 c
+79.125 -0.801 79.213 -0.837 79.331 -0.837 c
+79.419 -0.837 79.508 -0.823 79.595 -0.793 c
+79.595 -1.352 l
+79.448 -1.4 79.294 -1.425 79.14 -1.425 c
+78.883 -1.425 78.688 -1.334 78.552 -1.146 c
+78.412 -0.962 78.346 -0.702 78.346 -0.367 c
+78.346 2.103 l
+77.744 2.103 l
+77.744 2.631 l
+78.346 2.631 l
+78.346 3.587 l
+h
+82.403 -1.352 m
+82.363 -1.263 82.337 -1.117 82.33 -0.911 c
+82.095 -1.256 81.8 -1.425 81.447 -1.425 c
+81.084 -1.425 80.801 -1.33 80.595 -1.132 c
+80.397 -0.926 80.301 -0.639 80.301 -0.264 c
+80.301 0.136 80.437 0.456 80.713 0.691 c
+80.984 0.934 81.36 1.058 81.83 1.058 c
+82.315 1.058 l
+82.315 1.485 l
+82.315 1.721 82.26 1.885 82.153 1.985 c
+82.043 2.091 81.881 2.147 81.668 2.147 c
+81.47 2.147 81.308 2.087 81.183 1.97 c
+81.065 1.852 81.006 1.706 81.006 1.529 c
+80.36 1.529 l
+80.36 1.723 80.419 1.915 80.536 2.103 c
+80.661 2.286 80.823 2.433 81.021 2.544 c
+81.227 2.65 81.455 2.705 81.712 2.705 c
+82.112 2.705 82.417 2.602 82.623 2.396 c
+82.837 2.191 82.951 1.897 82.962 1.515 c
+82.962 -0.5 l
+82.962 -0.804 82.999 -1.069 83.08 -1.294 c
+83.08 -1.352 l
+h
+81.536 -0.837 m
+81.701 -0.837 81.852 -0.793 81.991 -0.706 c
+82.139 -0.617 82.245 -0.507 82.315 -0.367 c
+82.315 0.574 l
+81.947 0.574 l
+81.632 0.574 81.389 0.504 81.212 0.368 c
+81.036 0.239 80.948 0.052 80.948 -0.191 c
+80.948 -0.419 80.992 -0.584 81.08 -0.69 c
+81.168 -0.789 81.319 -0.837 81.536 -0.837 c
+85.343 -0.866 m
+85.556 -0.866 85.729 -0.804 85.857 -0.675 c
+85.993 -0.54 86.066 -0.349 86.078 -0.103 c
+86.695 -0.103 l
+86.673 -0.484 86.537 -0.804 86.284 -1.058 c
+86.026 -1.304 85.714 -1.425 85.343 -1.425 c
+84.85 -1.425 84.476 -1.275 84.211 -0.97 c
+83.953 -0.658 83.828 -0.191 83.828 0.427 c
+83.828 0.867 l
+83.828 1.463 83.953 1.919 84.211 2.234 c
+84.476 2.547 84.85 2.705 85.343 2.705 c
+85.744 2.705 86.064 2.573 86.299 2.309 c
+86.54 2.051 86.673 1.706 86.695 1.264 c
+86.078 1.264 l
+86.056 1.559 85.983 1.779 85.857 1.926 c
+85.74 2.073 85.567 2.147 85.343 2.147 c
+85.048 2.147 84.832 2.047 84.696 1.852 c
+84.556 1.665 84.483 1.357 84.476 0.927 c
+84.476 0.412 l
+84.476 -0.058 84.541 -0.393 84.682 -0.588 c
+84.828 -0.775 85.048 -0.866 85.343 -0.866 c
+88.092 2.22 m
+88.345 2.544 88.665 2.705 89.047 2.705 c
+89.752 2.705 90.109 2.234 90.12 1.294 c
+90.12 -1.352 l
+89.473 -1.352 l
+89.473 1.264 l
+89.473 1.577 89.418 1.798 89.312 1.926 c
+89.201 2.051 89.047 2.117 88.842 2.117 c
+88.684 2.117 88.536 2.062 88.4 1.956 c
+88.271 1.845 88.169 1.709 88.092 1.544 c
+88.092 -1.352 l
+87.445 -1.352 l
+87.445 4.293 l
+88.092 4.293 l
+h
+92.501 -1.425 m
+92.001 -1.425 91.62 -1.278 91.354 -0.984 c
+91.09 -0.69 90.958 -0.257 90.958 0.324 c
+90.958 0.794 l
+90.958 1.389 91.082 1.856 91.34 2.191 c
+91.604 2.532 91.965 2.705 92.428 2.705 c
+92.887 2.705 93.229 2.55 93.457 2.249 c
+93.692 1.956 93.813 1.492 93.825 0.867 c
+93.825 0.441 l
+91.604 0.441 l
+91.604 0.353 l
+91.604 -0.08 91.682 -0.393 91.84 -0.588 c
+92.005 -0.775 92.237 -0.866 92.53 -0.866 c
+92.726 -0.866 92.898 -0.833 93.045 -0.764 c
+93.192 -0.687 93.328 -0.569 93.457 -0.411 c
+93.795 -0.823 l
+93.509 -1.227 93.079 -1.425 92.501 -1.425 c
+92.428 2.147 m
+92.152 2.147 91.95 2.051 91.825 1.867 c
+91.697 1.68 91.623 1.389 91.604 1 c
+93.177 1 l
+93.177 1.088 l
+93.156 1.47 93.089 1.738 92.971 1.897 c
+92.854 2.062 92.67 2.147 92.428 2.147 c
+94.471 0.823 m
+94.471 1.43 94.581 1.897 94.809 2.22 c
+95.044 2.544 95.371 2.705 95.794 2.705 c
+96.176 2.705 96.474 2.547 96.69 2.234 c
+96.69 4.293 l
+97.337 4.293 l
+97.337 -1.352 l
+96.749 -1.352 l
+96.705 -0.926 l
+96.499 -1.26 96.194 -1.425 95.794 -1.425 c
+95.382 -1.425 95.059 -1.271 94.824 -0.955 c
+94.589 -0.631 94.471 -0.176 94.471 0.412 c
+h
+95.117 0.441 m
+95.117 0 95.18 -0.33 95.309 -0.544 c
+95.445 -0.749 95.666 -0.852 95.97 -0.852 c
+96.293 -0.852 96.532 -0.69 96.69 -0.367 c
+96.69 1.646 l
+96.522 1.959 96.283 2.117 95.97 2.117 c
+95.666 2.117 95.445 2.014 95.309 1.808 c
+95.18 1.603 95.117 1.279 95.117 0.838 c
+h
+100.909 3.587 m
+100.909 2.631 l
+101.511 2.631 l
+101.511 2.103 l
+100.909 2.103 l
+100.909 -0.367 l
+100.909 -0.525 100.931 -0.643 100.983 -0.72 c
+101.041 -0.801 101.129 -0.837 101.247 -0.837 c
+101.335 -0.837 101.424 -0.823 101.511 -0.793 c
+101.511 -1.352 l
+101.365 -1.4 101.21 -1.425 101.056 -1.425 c
+100.799 -1.425 100.605 -1.334 100.468 -1.146 c
+100.329 -0.962 100.262 -0.702 100.262 -0.367 c
+100.262 2.103 l
+99.66 2.103 l
+99.66 2.631 l
+100.262 2.631 l
+100.262 3.587 l
+h
+102.07 0.823 m
+102.07 1.401 102.207 1.856 102.482 2.191 c
+102.764 2.532 103.136 2.705 103.599 2.705 c
+104.058 2.705 104.426 2.536 104.701 2.205 c
+104.985 1.881 105.131 1.434 105.143 0.867 c
+105.143 0.441 l
+105.143 -0.128 104.999 -0.584 104.717 -0.926 c
+104.441 -1.26 104.073 -1.425 103.614 -1.425 c
+103.151 -1.425 102.78 -1.263 102.496 -0.941 c
+102.221 -0.61 102.078 -0.168 102.07 0.383 c
+h
+102.717 0.441 m
+102.717 0.038 102.795 -0.278 102.953 -0.514 c
+103.117 -0.749 103.338 -0.866 103.614 -0.866 c
+104.179 -0.866 104.474 -0.455 104.495 0.368 c
+104.495 0.823 l
+104.495 1.224 104.411 1.544 104.246 1.779 c
+104.088 2.022 103.871 2.147 103.599 2.147 c
+103.335 2.147 103.117 2.022 102.953 1.779 c
+102.795 1.544 102.717 1.224 102.717 0.823 c
+h
+108.788 -0.264 m
+109.508 2.631 l
+110.199 2.631 l
+108.906 -1.911 l
+108.806 -2.252 108.663 -2.513 108.479 -2.69 c
+108.303 -2.865 108.1 -2.954 107.876 -2.954 c
+107.788 -2.954 107.674 -2.932 107.539 -2.896 c
+107.539 -2.352 l
+107.685 -2.366 l
+107.869 -2.366 108.016 -2.322 108.127 -2.234 c
+108.233 -2.146 108.321 -1.988 108.391 -1.764 c
+108.509 -1.323 l
+107.347 2.631 l
+108.052 2.631 l
+h
+110.639 0.823 m
+110.639 1.401 110.776 1.856 111.051 2.191 c
+111.335 2.532 111.705 2.705 112.169 2.705 c
+112.628 2.705 112.995 2.536 113.271 2.205 c
+113.554 1.881 113.701 1.434 113.712 0.867 c
+113.712 0.441 l
+113.712 -0.128 113.569 -0.584 113.286 -0.926 c
+113.01 -1.26 112.642 -1.425 112.183 -1.425 c
+111.72 -1.425 111.349 -1.263 111.067 -0.941 c
+110.791 -0.61 110.647 -0.168 110.639 0.383 c
+h
+111.287 0.441 m
+111.287 0.038 111.364 -0.278 111.522 -0.514 c
+111.687 -0.749 111.908 -0.866 112.183 -0.866 c
+112.749 -0.866 113.043 -0.455 113.066 0.368 c
+113.066 0.823 l
+113.066 1.224 112.981 1.544 112.815 1.779 c
+112.657 2.022 112.441 2.147 112.169 2.147 c
+111.904 2.147 111.687 2.022 111.522 1.779 c
+111.364 1.544 111.287 1.224 111.287 0.823 c
+h
+116.578 -0.999 m
+116.362 -1.286 116.049 -1.425 115.638 -1.425 c
+115.273 -1.425 114.998 -1.304 114.814 -1.058 c
+114.638 -0.804 114.543 -0.44 114.535 0.03 c
+114.535 2.631 l
+115.182 2.631 l
+115.182 0.088 l
+115.182 -0.54 115.366 -0.852 115.74 -0.852 c
+116.141 -0.852 116.416 -0.675 116.563 -0.323 c
+116.563 2.631 l
+117.21 2.631 l
+117.21 -1.352 l
+116.593 -1.352 l
+h
+119.842 2.014 m
+119.753 2.033 119.655 2.043 119.547 2.043 c
+119.213 2.043 118.978 1.86 118.842 1.5 c
+118.842 -1.352 l
+118.195 -1.352 l
+118.195 2.631 l
+118.828 2.631 l
+118.842 2.22 l
+119.019 2.544 119.261 2.705 119.576 2.705 c
+119.684 2.705 119.772 2.683 119.842 2.646 c
+h
+123.59 -0.866 m
+123.803 -0.866 123.975 -0.804 124.104 -0.675 c
+124.241 -0.54 124.314 -0.349 124.324 -0.103 c
+124.942 -0.103 l
+124.92 -0.484 124.784 -0.804 124.53 -1.058 c
+124.274 -1.304 123.961 -1.425 123.59 -1.425 c
+123.098 -1.425 122.722 -1.275 122.458 -0.97 c
+122.201 -0.658 122.076 -0.191 122.076 0.427 c
+122.076 0.867 l
+122.076 1.463 122.201 1.919 122.458 2.234 c
+122.722 2.547 123.098 2.705 123.59 2.705 c
+123.99 2.705 124.31 2.573 124.545 2.309 c
+124.788 2.051 124.92 1.706 124.942 1.264 c
+124.324 1.264 l
+124.303 1.559 124.229 1.779 124.104 1.926 c
+123.987 2.073 123.814 2.147 123.59 2.147 c
+123.296 2.147 123.079 2.047 122.943 1.852 c
+122.803 1.665 122.73 1.357 122.722 0.927 c
+122.722 0.412 l
+122.722 -0.058 122.789 -0.393 122.928 -0.588 c
+123.075 -0.775 123.296 -0.866 123.59 -0.866 c
+125.56 0.823 m
+125.56 1.401 125.695 1.856 125.971 2.191 c
+126.254 2.532 126.625 2.705 127.088 2.705 c
+127.547 2.705 127.915 2.536 128.191 2.205 c
+128.474 1.881 128.621 1.434 128.632 0.867 c
+128.632 0.441 l
+128.632 -0.128 128.488 -0.584 128.205 -0.926 c
+127.929 -1.26 127.562 -1.425 127.102 -1.425 c
+126.64 -1.425 126.269 -1.263 125.986 -0.941 c
+125.71 -0.61 125.567 -0.168 125.56 0.383 c
+h
+126.206 0.441 m
+126.206 0.038 126.283 -0.278 126.441 -0.514 c
+126.607 -0.749 126.828 -0.866 127.102 -0.866 c
+127.669 -0.866 127.963 -0.455 127.985 0.368 c
+127.985 0.823 l
+127.985 1.224 127.9 1.544 127.735 1.779 c
+127.576 2.022 127.36 2.147 127.088 2.147 c
+126.824 2.147 126.607 2.022 126.441 1.779 c
+126.283 1.544 126.206 1.224 126.206 0.823 c
+h
+130.086 2.631 m
+130.101 2.264 l
+130.344 2.558 130.664 2.705 131.057 2.705 c
+131.497 2.705 131.806 2.507 131.983 2.117 c
+132.237 2.507 132.586 2.705 133.026 2.705 c
+133.762 2.705 134.136 2.242 134.158 1.324 c
+134.158 -1.352 l
+133.512 -1.352 l
+133.512 1.264 l
+133.512 1.559 133.456 1.771 133.35 1.912 c
+133.251 2.047 133.078 2.117 132.835 2.117 c
+132.637 2.117 132.475 2.037 132.351 1.881 c
+132.233 1.735 132.163 1.544 132.145 1.309 c
+132.145 -1.352 l
+131.483 -1.352 l
+131.483 1.294 l
+131.483 1.841 131.262 2.117 130.822 2.117 c
+130.487 2.117 130.252 1.956 130.116 1.632 c
+130.116 -1.352 l
+129.469 -1.352 l
+129.469 2.631 l
+h
+135.746 2.631 m
+135.761 2.264 l
+136.003 2.558 136.323 2.705 136.716 2.705 c
+137.157 2.705 137.466 2.507 137.642 2.117 c
+137.895 2.507 138.244 2.705 138.686 2.705 c
+139.42 2.705 139.796 2.242 139.817 1.324 c
+139.817 -1.352 l
+139.171 -1.352 l
+139.171 1.264 l
+139.171 1.559 139.116 1.771 139.009 1.912 c
+138.91 2.047 138.737 2.117 138.495 2.117 c
+138.296 2.117 138.134 2.037 138.009 1.881 c
+137.892 1.735 137.822 1.544 137.804 1.309 c
+137.804 -1.352 l
+137.142 -1.352 l
+137.142 1.294 l
+137.142 1.841 136.922 2.117 136.481 2.117 c
+136.147 2.117 135.911 1.956 135.775 1.632 c
+135.775 -1.352 l
+135.129 -1.352 l
+135.129 2.631 l
+h
+141.493 -1.352 -0.646 3.983 re
+141.537 3.675 m
+141.537 3.565 141.508 3.473 141.449 3.396 c
+141.39 3.326 141.294 3.293 141.17 3.293 c
+141.053 3.293 140.957 3.326 140.891 3.396 c
+140.831 3.473 140.802 3.565 140.802 3.675 c
+140.802 3.793 140.831 3.884 140.891 3.955 c
+140.957 4.032 141.053 4.072 141.17 4.072 c
+141.294 4.072 141.39 4.032 141.449 3.955 c
+141.508 3.874 141.537 3.782 141.537 3.675 c
+143.36 3.587 m
+143.36 2.631 l
+143.962 2.631 l
+143.962 2.103 l
+143.36 2.103 l
+143.36 -0.367 l
+143.36 -0.525 143.382 -0.643 143.434 -0.72 c
+143.492 -0.801 143.58 -0.837 143.698 -0.837 c
+143.786 -0.837 143.875 -0.823 143.962 -0.793 c
+143.962 -1.352 l
+143.816 -1.4 143.661 -1.425 143.507 -1.425 c
+143.25 -1.425 143.055 -1.334 142.919 -1.146 c
+142.78 -0.962 142.713 -0.702 142.713 -0.367 c
+142.713 2.103 l
+142.111 2.103 l
+142.111 2.631 l
+142.713 2.631 l
+142.713 3.587 l
+h
+146.667 -0.338 m
+146.667 -0.191 146.612 -0.07 146.506 0.03 c
+146.395 0.125 146.19 0.243 145.888 0.383 c
+145.543 0.53 145.3 0.651 145.153 0.75 c
+145.006 0.857 144.896 0.975 144.83 1.103 c
+144.76 1.228 144.727 1.386 144.727 1.573 c
+144.727 1.897 144.845 2.165 145.08 2.382 c
+145.315 2.595 145.616 2.705 145.991 2.705 c
+146.373 2.705 146.682 2.591 146.917 2.367 c
+147.152 2.139 147.27 1.852 147.27 1.5 c
+146.623 1.5 l
+146.623 1.676 146.564 1.827 146.447 1.956 c
+146.329 2.08 146.175 2.147 145.991 2.147 c
+145.793 2.147 145.642 2.091 145.535 1.985 c
+145.425 1.885 145.373 1.754 145.373 1.588 c
+145.373 1.459 145.41 1.353 145.491 1.264 c
+145.568 1.183 145.76 1.081 146.065 0.956 c
+146.543 0.769 146.873 0.581 147.05 0.397 c
+147.226 0.221 147.314 -0.007 147.314 -0.278 c
+147.314 -0.631 147.189 -0.911 146.946 -1.117 c
+146.711 -1.323 146.395 -1.425 146.006 -1.425 c
+145.583 -1.425 145.245 -1.308 144.991 -1.072 c
+144.735 -0.83 144.609 -0.525 144.609 -0.161 c
+145.256 -0.161 l
+145.263 -0.389 145.333 -0.565 145.462 -0.69 c
+145.587 -0.808 145.77 -0.866 146.006 -0.866 c
+146.219 -0.866 146.381 -0.819 146.491 -0.72 c
+146.609 -0.625 146.667 -0.496 146.667 -0.338 c
+151.915 -1.352 m
+151.875 -1.263 151.848 -1.117 151.841 -0.911 c
+151.606 -1.256 151.312 -1.425 150.959 -1.425 c
+150.595 -1.425 150.312 -1.33 150.107 -1.132 c
+149.909 -0.926 149.813 -0.639 149.813 -0.264 c
+149.813 0.136 149.949 0.456 150.225 0.691 c
+150.497 0.934 150.871 1.058 151.341 1.058 c
+151.827 1.058 l
+151.827 1.485 l
+151.827 1.721 151.771 1.885 151.665 1.985 c
+151.555 2.091 151.393 2.147 151.18 2.147 c
+150.981 2.147 150.819 2.087 150.695 1.97 c
+150.578 1.852 150.518 1.706 150.518 1.529 c
+149.872 1.529 l
+149.872 1.723 149.93 1.915 150.048 2.103 c
+150.173 2.286 150.335 2.433 150.533 2.544 c
+150.739 2.65 150.967 2.705 151.224 2.705 c
+151.625 2.705 151.929 2.602 152.135 2.396 c
+152.348 2.191 152.463 1.897 152.473 1.515 c
+152.473 -0.5 l
+152.473 -0.804 152.51 -1.069 152.591 -1.294 c
+152.591 -1.352 l
+h
+151.048 -0.837 m
+151.213 -0.837 151.364 -0.793 151.503 -0.706 c
+151.65 -0.617 151.757 -0.507 151.827 -0.367 c
+151.827 0.574 l
+151.459 0.574 l
+151.143 0.574 150.9 0.504 150.724 0.368 c
+150.547 0.239 150.46 0.052 150.46 -0.191 c
+150.46 -0.419 150.504 -0.584 150.592 -0.69 c
+150.68 -0.789 150.831 -0.837 151.048 -0.837 c
+154.09 2.631 m
+154.105 2.191 l
+154.358 2.532 154.682 2.705 155.075 2.705 c
+155.781 2.705 156.137 2.234 156.149 1.294 c
+156.149 -1.352 l
+155.501 -1.352 l
+155.501 1.264 l
+155.501 1.577 155.446 1.798 155.34 1.926 c
+155.23 2.051 155.075 2.117 154.869 2.117 c
+154.711 2.117 154.564 2.062 154.428 1.956 c
+154.3 1.845 154.197 1.709 154.119 1.544 c
+154.119 -1.352 l
+153.473 -1.352 l
+153.473 2.631 l
+h
+156.986 0.823 m
+156.986 1.43 157.096 1.897 157.325 2.22 c
+157.56 2.544 157.886 2.705 158.309 2.705 c
+158.691 2.705 158.989 2.547 159.206 2.234 c
+159.206 4.293 l
+159.852 4.293 l
+159.852 -1.352 l
+159.264 -1.352 l
+159.22 -0.926 l
+159.014 -1.26 158.709 -1.425 158.309 -1.425 c
+157.897 -1.425 157.574 -1.271 157.339 -0.955 c
+157.103 -0.631 156.986 -0.176 156.986 0.412 c
+h
+157.633 0.441 m
+157.633 0 157.695 -0.33 157.824 -0.544 c
+157.96 -0.749 158.181 -0.852 158.485 -0.852 c
+158.809 -0.852 159.048 -0.69 159.206 -0.367 c
+159.206 1.646 l
+159.037 1.959 158.798 2.117 158.485 2.117 c
+158.181 2.117 157.96 2.014 157.824 1.808 c
+157.695 1.603 157.633 1.279 157.633 0.838 c
+h
+163.424 3.587 m
+163.424 2.631 l
+164.026 2.631 l
+164.026 2.103 l
+163.424 2.103 l
+163.424 -0.367 l
+163.424 -0.525 163.446 -0.643 163.498 -0.72 c
+163.556 -0.801 163.644 -0.837 163.762 -0.837 c
+163.85 -0.837 163.939 -0.823 164.026 -0.793 c
+164.026 -1.352 l
+163.88 -1.4 163.725 -1.425 163.571 -1.425 c
+163.314 -1.425 163.119 -1.334 162.983 -1.146 c
+162.844 -0.962 162.777 -0.702 162.777 -0.367 c
+162.777 2.103 l
+162.175 2.103 l
+162.175 2.631 l
+162.777 2.631 l
+162.777 3.587 l
+h
+166.834 -1.352 m
+166.794 -1.263 166.769 -1.117 166.761 -0.911 c
+166.526 -1.256 166.231 -1.425 165.879 -1.425 c
+165.516 -1.425 165.232 -1.33 165.026 -1.132 c
+164.828 -0.926 164.732 -0.639 164.732 -0.264 c
+164.732 0.136 164.868 0.456 165.144 0.691 c
+165.416 0.934 165.791 1.058 166.262 1.058 c
+166.746 1.058 l
+166.746 1.485 l
+166.746 1.721 166.691 1.885 166.584 1.985 c
+166.474 2.091 166.312 2.147 166.1 2.147 c
+165.901 2.147 165.739 2.087 165.614 1.97 c
+165.497 1.852 165.437 1.706 165.437 1.529 c
+164.791 1.529 l
+164.791 1.723 164.85 1.915 164.967 2.103 c
+165.092 2.286 165.254 2.433 165.453 2.544 c
+165.659 2.65 165.886 2.705 166.143 2.705 c
+166.544 2.705 166.849 2.602 167.055 2.396 c
+167.268 2.191 167.382 1.897 167.393 1.515 c
+167.393 -0.5 l
+167.393 -0.804 167.43 -1.069 167.511 -1.294 c
+167.511 -1.352 l
+h
+165.967 -0.837 m
+166.133 -0.837 166.283 -0.793 166.422 -0.706 c
+166.57 -0.617 166.676 -0.507 166.746 -0.367 c
+166.746 0.574 l
+166.378 0.574 l
+166.063 0.574 165.82 0.504 165.643 0.368 c
+165.468 0.239 165.379 0.052 165.379 -0.191 c
+165.379 -0.419 165.423 -0.584 165.512 -0.69 c
+165.599 -0.789 165.751 -0.837 165.967 -0.837 c
+168.26 0.823 m
+168.26 1.441 168.371 1.904 168.598 2.22 c
+168.822 2.544 169.157 2.705 169.597 2.705 c
+169.998 2.705 170.303 2.529 170.509 2.176 c
+170.553 2.631 l
+171.141 2.631 l
+171.141 -1.396 l
+171.141 -1.884 171.012 -2.263 170.759 -2.528 c
+170.501 -2.792 170.149 -2.925 169.701 -2.925 c
+169.502 -2.925 169.281 -2.873 169.04 -2.778 c
+168.793 -2.678 168.613 -2.557 168.495 -2.41 c
+168.76 -1.969 l
+169.025 -2.234 169.322 -2.366 169.657 -2.366 c
+170.193 -2.366 170.469 -2.072 170.48 -1.484 c
+170.48 -0.955 l
+170.274 -1.271 169.973 -1.425 169.583 -1.425 c
+169.171 -1.425 168.849 -1.275 168.613 -0.97 c
+168.385 -0.658 168.267 -0.205 168.26 0.383 c
+h
+168.922 0.441 m
+168.922 0 168.984 -0.33 169.113 -0.544 c
+169.238 -0.749 169.454 -0.852 169.759 -0.852 c
+170.083 -0.852 170.322 -0.687 170.48 -0.353 c
+170.48 1.632 l
+170.311 1.956 170.072 2.117 169.759 2.117 c
+169.466 2.117 169.248 2.014 169.113 1.808 c
+168.984 1.603 168.922 1.279 168.922 0.838 c
+h
+174.037 -0.338 m
+174.037 -0.191 173.982 -0.07 173.875 0.03 c
+173.765 0.125 173.559 0.243 173.258 0.383 c
+172.913 0.53 172.67 0.651 172.523 0.75 c
+172.376 0.857 172.265 0.975 172.2 1.103 c
+172.13 1.228 172.097 1.386 172.097 1.573 c
+172.097 1.897 172.215 2.165 172.45 2.382 c
+172.685 2.595 172.986 2.705 173.36 2.705 c
+173.743 2.705 174.052 2.591 174.287 2.367 c
+174.522 2.139 174.64 1.852 174.64 1.5 c
+173.993 1.5 l
+173.993 1.676 173.934 1.827 173.817 1.956 c
+173.699 2.08 173.545 2.147 173.36 2.147 c
+173.162 2.147 173.011 2.091 172.905 1.985 c
+172.795 1.885 172.743 1.754 172.743 1.588 c
+172.743 1.459 172.78 1.353 172.861 1.264 c
+172.938 1.183 173.129 1.081 173.434 0.956 c
+173.912 0.769 174.243 0.581 174.419 0.397 c
+174.596 0.221 174.684 -0.007 174.684 -0.278 c
+174.684 -0.631 174.559 -0.911 174.316 -1.117 c
+174.081 -1.323 173.765 -1.425 173.375 -1.425 c
+172.953 -1.425 172.614 -1.308 172.361 -1.072 c
+172.104 -0.83 171.979 -0.525 171.979 -0.161 c
+172.626 -0.161 l
+172.633 -0.389 172.703 -0.565 172.832 -0.69 c
+172.957 -0.808 173.14 -0.866 173.375 -0.866 c
+173.589 -0.866 173.75 -0.819 173.861 -0.72 c
+173.978 -0.625 174.037 -0.496 174.037 -0.338 c
+175.565 -0.999 m
+175.565 -0.881 175.598 -0.786 175.669 -0.706 c
+175.735 -0.628 175.837 -0.588 175.978 -0.588 c
+176.124 -0.588 176.231 -0.628 176.3 -0.706 c
+176.377 -0.786 176.418 -0.881 176.418 -0.999 c
+176.418 -1.109 176.377 -1.201 176.3 -1.278 c
+176.231 -1.356 176.124 -1.396 175.978 -1.396 c
+175.837 -1.396 175.735 -1.356 175.669 -1.278 c
+175.598 -1.201 175.565 -1.109 175.565 -0.999 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 383.129 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 376.2903 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.807 l
+-1.896 -1.807 l
+-1.896 -1.263 l
+-2.142 -1.256 -2.359 -1.219 -2.543 -1.161 c
+-2.719 -1.102 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.514 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.662 l
+-1.907 0.662 -1.926 0.666 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.485 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.132 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.132 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.485 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.368 l
+-1.514 1.368 l
+-1.506 1.368 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.743 -0.132 0.588 c
+-0.044 0.431 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.485 -2.19 2.455 c
+-2.26 2.426 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.437 2.249 -2.454 2.191 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.838 -2.439 1.779 c
+-2.41 1.721 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.395 c
+5.284 -2.314 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.219 6.034 -1.219 c
+5.829 -1.219 5.644 -1.182 5.49 -1.102 c
+5.343 -1.014 5.215 -0.897 5.108 -0.749 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.019 4.888 1.235 c
+4.946 1.449 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.919 7.107 1.97 c
+7.115 2.029 7.122 2.077 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.414 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.16 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.743 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.368 c
+5.88 1.279 5.835 1.162 5.799 1.015 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.514 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.293 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.603 l
+9.199 1.603 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.603 m
+13.057 1.603 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.22 l
+15.732 2.22 l
+15.732 1.603 l
+14.497 1.603 l
+14.497 -0.103 l
+14.497 -0.323 l
+14.504 -0.392 14.527 -0.455 14.556 -0.514 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.675 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.675 c
+15.603 -0.658 15.736 -0.631 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.215 15.707 -1.23 15.629 -1.249 c
+15.549 -1.26 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.3 14.942 -1.308 14.835 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.263 c
+14.221 -1.227 14.107 -1.182 14.012 -1.132 c
+13.924 -1.084 13.85 -1.024 13.791 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.631 13.608 -0.544 13.6 -0.455 c
+13.59 -0.359 13.586 -0.264 13.586 -0.176 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.943 -1.205 c
+21.737 -1.117 21.564 -0.995 21.428 -0.837 c
+21.288 -0.683 21.185 -0.496 21.119 -0.278 c
+21.049 -0.055 21.016 0.192 21.016 0.456 c
+21.016 0.75 21.049 1.008 21.119 1.235 c
+21.197 1.459 21.303 1.646 21.442 1.794 c
+21.589 1.948 21.766 2.066 21.972 2.147 c
+22.178 2.234 22.413 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.249 23.28 2.191 c
+23.456 2.132 23.607 2.047 23.736 1.941 c
+23.861 1.842 23.963 1.721 24.044 1.573 c
+24.122 1.434 24.176 1.283 24.206 1.118 c
+23.295 1.073 l
+23.265 1.25 23.196 1.389 23.089 1.5 c
+22.99 1.607 22.846 1.661 22.662 1.661 c
+22.416 1.661 22.24 1.559 22.134 1.353 c
+22.023 1.154 21.972 0.867 21.972 0.485 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.436 23.295 -0.275 23.324 -0.058 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.573 c
+24.004 -0.72 23.901 -0.852 23.765 -0.97 c
+23.636 -1.08 23.478 -1.168 23.295 -1.234 c
+23.119 -1.294 22.913 -1.323 22.677 -1.323 c
+28.384 0.485 m
+28.384 0.21 28.347 -0.039 28.281 -0.264 c
+28.212 -0.481 28.108 -0.668 27.973 -0.823 c
+27.833 -0.98 27.657 -1.102 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.102 25.566 -0.98 25.43 -0.823 c
+25.29 -0.668 25.187 -0.481 25.121 -0.264 c
+25.051 -0.039 25.018 0.21 25.018 0.485 c
+25.018 0.739 25.047 0.975 25.106 1.191 c
+25.172 1.415 25.275 1.607 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.147 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.147 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.607 28.237 1.415 28.296 1.191 c
+28.355 0.975 28.384 0.739 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.015 c
+27.362 1.162 27.326 1.283 27.267 1.382 c
+27.208 1.478 27.135 1.548 27.046 1.588 c
+26.959 1.636 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.563 26.15 1.368 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.242 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.598 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.205 27.385 -0.058 c
+27.414 0.088 27.429 0.269 27.429 0.485 c
+31.43 -1.263 m
+31.43 0.721 l
+31.43 1.022 31.387 1.243 31.298 1.382 c
+31.217 1.529 31.081 1.603 30.886 1.603 c
+30.776 1.603 30.674 1.577 30.578 1.529 c
+30.489 1.478 30.409 1.411 30.343 1.324 c
+30.284 1.235 30.233 1.125 30.196 1 c
+30.167 0.882 30.152 0.75 30.152 0.603 c
+30.152 -1.263 l
+29.24 -1.263 l
+29.24 1.441 l
+29.24 1.661 l
+29.24 1.75 29.233 1.827 29.226 1.897 c
+29.226 2.087 l
+29.226 2.22 l
+30.078 2.22 l
+30.086 2.191 30.093 2.147 30.093 2.087 c
+30.093 1.897 l
+30.1 1.827 30.107 1.757 30.107 1.691 c
+30.115 1.621 30.122 1.566 30.122 1.529 c
+30.137 1.529 l
+30.254 1.794 30.406 1.985 30.593 2.103 c
+30.776 2.22 30.996 2.278 31.254 2.278 c
+31.438 2.278 31.599 2.249 31.74 2.191 c
+31.875 2.132 31.989 2.043 32.077 1.926 c
+32.166 1.808 32.228 1.665 32.268 1.5 c
+32.316 1.341 32.342 1.154 32.342 0.941 c
+32.342 -1.263 l
+h
+34.951 1.603 m
+34.951 -1.263 l
+34.054 -1.263 l
+34.054 1.603 l
+33.232 1.603 l
+33.232 2.22 l
+34.054 2.22 l
+34.054 2.485 l
+34.054 2.61 34.069 2.742 34.098 2.882 c
+34.135 3.018 34.205 3.135 34.304 3.234 c
+34.41 3.341 34.554 3.429 34.73 3.499 c
+34.907 3.565 35.131 3.602 35.407 3.602 c
+35.62 3.602 35.819 3.591 35.995 3.572 c
+36.17 3.55 36.322 3.532 36.45 3.514 c
+36.45 2.926 l
+36.322 2.944 36.178 2.959 36.024 2.97 c
+35.866 2.977 35.715 2.984 35.568 2.984 c
+35.44 2.984 35.337 2.97 35.26 2.94 c
+35.179 2.911 35.116 2.87 35.069 2.822 c
+35.017 2.771 34.984 2.708 34.965 2.631 c
+34.955 2.562 34.951 2.485 34.951 2.396 c
+34.951 2.22 l
+36.377 2.22 l
+36.377 1.603 l
+h
+39.467 -0.646 m
+40.599 -0.646 l
+40.599 -1.263 l
+37.292 -1.263 l
+37.292 -0.646 l
+38.556 -0.646 l
+38.556 1.603 l
+37.63 1.603 l
+37.63 2.22 l
+39.467 2.22 l
+h
+38.556 3.514 0.911 -0.676 re
+38.556 2.837 m
+42.954 -2.66 m
+42.738 -2.66 42.547 -2.634 42.381 -2.587 c
+42.212 -2.547 42.073 -2.484 41.955 -2.395 c
+41.837 -2.314 41.738 -2.219 41.661 -2.102 c
+41.591 -1.984 41.543 -1.855 41.514 -1.72 c
+42.41 -1.616 l
+42.447 -1.753 42.518 -1.859 42.616 -1.94 c
+42.712 -2.028 42.837 -2.072 42.984 -2.072 c
+43.072 -2.072 43.153 -2.057 43.234 -2.028 c
+43.311 -1.999 43.381 -1.944 43.44 -1.866 c
+43.499 -1.797 43.542 -1.705 43.572 -1.587 c
+43.609 -1.469 43.631 -1.323 43.631 -1.146 c
+43.631 -0.955 l
+43.631 -0.889 43.634 -0.83 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.072 c
+43.017 -1.172 42.811 -1.219 42.587 -1.219 c
+42.381 -1.219 42.198 -1.182 42.044 -1.102 c
+41.896 -1.014 41.768 -0.897 41.661 -0.749 c
+41.562 -0.595 41.488 -0.411 41.441 -0.205 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.772 41.389 1.019 41.441 1.235 c
+41.5 1.449 41.58 1.632 41.691 1.779 c
+41.797 1.933 41.93 2.051 42.088 2.132 c
+42.242 2.22 42.429 2.264 42.646 2.264 c
+42.742 2.264 42.84 2.253 42.94 2.234 c
+43.035 2.213 43.123 2.18 43.204 2.132 c
+43.293 2.08 43.37 2.018 43.44 1.941 c
+43.517 1.86 43.58 1.768 43.631 1.661 c
+43.646 1.661 l
+43.646 1.808 l
+43.653 1.867 43.66 1.919 43.66 1.97 c
+43.667 2.029 43.675 2.077 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.22 c
+44.557 2.22 l
+44.546 2.139 44.535 2.029 44.527 1.881 c
+44.527 1.411 l
+44.527 -1.161 l
+44.527 -1.414 44.49 -1.635 44.425 -1.822 c
+44.355 -2.006 44.251 -2.16 44.116 -2.278 c
+43.976 -2.403 43.811 -2.499 43.616 -2.557 c
+43.418 -2.624 43.197 -2.66 42.954 -2.66 c
+43.646 0.53 m
+43.646 0.743 43.619 0.919 43.572 1.058 c
+43.532 1.206 43.476 1.324 43.41 1.411 c
+43.351 1.5 43.282 1.559 43.204 1.588 c
+43.123 1.625 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.621 42.69 1.573 c
+42.609 1.532 42.543 1.463 42.484 1.368 c
+42.433 1.279 42.389 1.162 42.352 1.015 c
+42.323 0.875 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.366 -0.154 42.484 -0.338 c
+42.601 -0.514 42.763 -0.602 42.969 -0.602 c
+43.035 -0.602 43.109 -0.588 43.189 -0.558 c
+43.278 -0.521 43.351 -0.463 43.41 -0.382 c
+43.476 -0.293 43.532 -0.176 43.572 -0.029 c
+43.619 0.118 43.646 0.302 43.646 0.53 c
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+54.2 0.838 1.866 -0.794 re
+54.2 0.044 m
+59.201 -2.66 m
+58.983 -2.66 58.792 -2.634 58.628 -2.587 c
+58.458 -2.547 58.318 -2.484 58.201 -2.395 c
+58.083 -2.314 57.984 -2.219 57.907 -2.102 c
+57.838 -1.984 57.79 -1.855 57.76 -1.72 c
+58.657 -1.616 l
+58.694 -1.753 58.763 -1.859 58.863 -1.94 c
+58.958 -2.028 59.083 -2.072 59.23 -2.072 c
+59.318 -2.072 59.399 -2.057 59.48 -2.028 c
+59.557 -1.999 59.627 -1.944 59.686 -1.866 c
+59.744 -1.797 59.789 -1.705 59.818 -1.587 c
+59.855 -1.469 59.877 -1.323 59.877 -1.146 c
+59.877 -0.955 l
+59.877 -0.889 59.881 -0.83 59.891 -0.779 c
+59.891 -0.588 l
+59.877 -0.588 l
+59.777 -0.816 59.634 -0.977 59.451 -1.072 c
+59.263 -1.172 59.058 -1.219 58.833 -1.219 c
+58.628 -1.219 58.443 -1.182 58.289 -1.102 c
+58.142 -1.014 58.014 -0.897 57.907 -0.749 c
+57.807 -0.595 57.734 -0.411 57.687 -0.205 c
+57.635 0.008 57.613 0.243 57.613 0.5 c
+57.613 0.772 57.635 1.019 57.687 1.235 c
+57.745 1.449 57.826 1.632 57.936 1.779 c
+58.043 1.933 58.175 2.051 58.333 2.132 c
+58.488 2.22 58.675 2.264 58.892 2.264 c
+58.987 2.264 59.087 2.253 59.186 2.234 c
+59.282 2.213 59.37 2.18 59.451 2.132 c
+59.538 2.08 59.616 2.018 59.686 1.941 c
+59.763 1.86 59.825 1.768 59.877 1.661 c
+59.891 1.661 l
+59.891 1.808 l
+59.899 1.867 59.906 1.919 59.906 1.97 c
+59.914 2.029 59.921 2.077 59.921 2.117 c
+59.928 2.165 59.939 2.198 59.951 2.22 c
+60.803 2.22 l
+60.792 2.139 60.781 2.029 60.774 1.881 c
+60.774 1.411 l
+60.774 -1.161 l
+60.774 -1.414 60.737 -1.635 60.67 -1.822 c
+60.601 -2.006 60.498 -2.16 60.362 -2.278 c
+60.222 -2.403 60.057 -2.499 59.862 -2.557 c
+59.664 -2.624 59.443 -2.66 59.201 -2.66 c
+59.891 0.53 m
+59.891 0.743 59.866 0.919 59.818 1.058 c
+59.777 1.206 59.723 1.324 59.656 1.411 c
+59.598 1.5 59.528 1.559 59.451 1.588 c
+59.37 1.625 59.293 1.646 59.216 1.646 c
+59.116 1.646 59.024 1.621 58.936 1.573 c
+58.855 1.532 58.789 1.463 58.73 1.368 c
+58.679 1.279 58.634 1.162 58.598 1.015 c
+58.569 0.875 58.553 0.706 58.553 0.5 c
+58.553 0.125 58.613 -0.154 58.73 -0.338 c
+58.848 -0.514 59.01 -0.602 59.216 -0.602 c
+59.282 -0.602 59.355 -0.588 59.436 -0.558 c
+59.524 -0.521 59.598 -0.463 59.656 -0.382 c
+59.723 -0.293 59.777 -0.176 59.818 -0.029 c
+59.866 0.118 59.891 0.302 59.891 0.53 c
+63.835 -0.646 m
+64.967 -0.646 l
+64.967 -1.263 l
+61.659 -1.263 l
+61.659 -0.646 l
+62.923 -0.646 l
+62.923 2.897 l
+61.998 2.897 l
+61.998 3.514 l
+63.835 3.514 l
+h
+68.998 0.485 m
+68.998 0.21 68.961 -0.039 68.895 -0.264 c
+68.824 -0.481 68.722 -0.668 68.586 -0.823 c
+68.446 -0.98 68.27 -1.102 68.057 -1.19 c
+67.84 -1.278 67.586 -1.323 67.293 -1.323 c
+67.017 -1.323 66.771 -1.278 66.557 -1.19 c
+66.352 -1.102 66.179 -0.98 66.043 -0.823 c
+65.903 -0.668 65.801 -0.481 65.734 -0.264 c
+65.665 -0.039 65.632 0.21 65.632 0.485 c
+65.632 0.739 65.661 0.975 65.72 1.191 c
+65.786 1.415 65.888 1.607 66.029 1.764 c
+66.164 1.929 66.341 2.058 66.557 2.147 c
+66.771 2.234 67.028 2.278 67.322 2.278 c
+67.634 2.278 67.895 2.234 68.101 2.147 c
+68.314 2.058 68.487 1.929 68.616 1.764 c
+68.751 1.607 68.851 1.415 68.909 1.191 c
+68.968 0.975 68.998 0.739 68.998 0.485 c
+68.042 0.485 m
+68.042 0.691 68.028 0.867 67.999 1.015 c
+67.976 1.162 67.939 1.283 67.881 1.382 c
+67.822 1.478 67.748 1.548 67.66 1.588 c
+67.571 1.636 67.461 1.661 67.336 1.661 c
+67.072 1.661 66.881 1.563 66.763 1.368 c
+66.646 1.18 66.587 0.886 66.587 0.485 c
+66.587 0.063 66.646 -0.242 66.763 -0.426 c
+66.881 -0.613 67.058 -0.706 67.293 -0.706 c
+67.417 -0.706 67.531 -0.687 67.631 -0.646 c
+67.726 -0.598 67.807 -0.525 67.866 -0.426 c
+67.932 -0.33 67.976 -0.205 67.999 -0.058 c
+68.028 0.088 68.042 0.269 68.042 0.485 c
+69.854 -1.263 m
+69.854 -0.97 l
+69.861 -0.833 69.869 -0.675 69.869 -0.5 c
+69.869 3.514 l
+70.78 3.514 l
+70.78 2.234 l
+70.78 2.073 l
+70.78 1.897 l
+70.78 1.845 70.773 1.802 70.765 1.764 c
+70.765 1.676 l
+70.78 1.676 l
+70.827 1.783 70.89 1.875 70.971 1.956 c
+71.048 2.033 71.133 2.095 71.221 2.147 c
+71.309 2.195 71.401 2.228 71.5 2.249 c
+71.596 2.268 71.695 2.278 71.794 2.278 c
+72.007 2.278 72.194 2.234 72.352 2.147 c
+72.507 2.058 72.635 1.929 72.735 1.764 c
+72.841 1.607 72.919 1.415 72.97 1.191 c
+73.017 0.975 73.044 0.736 73.044 0.47 c
+73.044 0.214 73.015 -0.025 72.955 -0.249 c
+72.897 -0.467 72.812 -0.658 72.705 -0.823 c
+72.595 -0.98 72.463 -1.102 72.309 -1.19 c
+72.151 -1.278 71.97 -1.323 71.764 -1.323 c
+71.666 -1.323 71.567 -1.311 71.471 -1.294 c
+71.382 -1.271 71.294 -1.242 71.206 -1.19 c
+71.118 -1.132 71.037 -1.065 70.971 -0.984 c
+70.901 -0.907 70.839 -0.808 70.78 -0.69 c
+70.765 -0.69 l
+70.765 -0.852 l
+70.765 -0.911 70.758 -0.97 70.75 -1.028 c
+70.75 -1.08 70.743 -1.128 70.736 -1.176 c
+70.736 -1.215 70.729 -1.246 70.721 -1.263 c
+h
+70.765 0.5 m
+70.765 0.265 70.783 0.067 70.824 -0.087 c
+70.872 -0.246 70.931 -0.367 71 -0.455 c
+71.066 -0.544 71.14 -0.61 71.221 -0.646 c
+71.298 -0.687 71.375 -0.706 71.456 -0.706 c
+71.662 -0.706 71.816 -0.61 71.926 -0.411 c
+72.044 -0.216 72.103 0.078 72.103 0.47 c
+72.103 0.684 72.08 0.867 72.044 1.015 c
+72.015 1.169 71.97 1.294 71.912 1.382 c
+71.86 1.478 71.794 1.551 71.706 1.603 c
+71.625 1.65 71.537 1.676 71.442 1.676 c
+71.361 1.676 71.284 1.654 71.206 1.617 c
+71.126 1.577 71.052 1.515 70.985 1.426 c
+70.927 1.338 70.872 1.214 70.824 1.058 c
+70.783 0.912 70.765 0.724 70.765 0.5 c
+74.873 -1.323 m
+74.704 -1.323 74.554 -1.3 74.418 -1.263 c
+74.289 -1.215 74.175 -1.146 74.079 -1.058 c
+73.992 -0.97 73.921 -0.863 73.874 -0.735 c
+73.823 -0.598 73.8 -0.448 73.8 -0.278 c
+73.8 -0.073 73.834 0.096 73.904 0.235 c
+73.969 0.383 74.065 0.493 74.183 0.574 c
+74.308 0.662 74.451 0.724 74.609 0.765 c
+74.775 0.802 74.951 0.827 75.138 0.838 c
+75.858 0.853 l
+75.858 1.029 l
+75.858 1.147 75.847 1.25 75.829 1.338 c
+75.807 1.426 75.774 1.492 75.726 1.544 c
+75.685 1.603 75.638 1.64 75.579 1.661 c
+75.521 1.68 75.454 1.691 75.388 1.691 c
+75.318 1.691 75.255 1.68 75.197 1.661 c
+75.145 1.65 75.097 1.625 75.05 1.588 c
+75.01 1.559 74.976 1.507 74.947 1.441 c
+74.925 1.382 74.91 1.301 74.903 1.206 c
+73.962 1.25 l
+73.992 1.397 74.035 1.532 74.095 1.661 c
+74.16 1.786 74.256 1.897 74.374 1.985 c
+74.492 2.08 74.631 2.154 74.8 2.205 c
+74.976 2.253 75.182 2.278 75.417 2.278 c
+75.858 2.278 76.19 2.168 76.417 1.956 c
+76.652 1.75 76.77 1.441 76.77 1.029 c
+76.77 -0.235 l
+76.77 -0.455 l
+76.777 -0.514 76.792 -0.569 76.814 -0.617 c
+76.832 -0.658 76.861 -0.69 76.902 -0.72 c
+76.938 -0.742 76.99 -0.749 77.049 -0.749 c
+77.115 -0.749 77.185 -0.745 77.254 -0.735 c
+77.254 -1.219 l
+77.196 -1.23 77.141 -1.242 77.093 -1.249 c
+77.053 -1.26 77.013 -1.267 76.976 -1.278 c
+76.936 -1.286 76.891 -1.294 76.843 -1.294 c
+76.792 -1.3 76.733 -1.308 76.666 -1.308 c
+76.439 -1.308 76.273 -1.256 76.167 -1.146 c
+76.057 -1.028 75.995 -0.863 75.976 -0.646 c
+75.961 -0.646 l
+75.891 -0.756 75.822 -0.852 75.756 -0.941 c
+75.685 -1.021 75.608 -1.087 75.521 -1.146 c
+75.432 -1.205 75.333 -1.249 75.226 -1.278 c
+75.127 -1.308 75.01 -1.323 74.873 -1.323 c
+75.858 0.353 m
+75.432 0.339 l
+75.333 0.339 75.241 0.331 75.153 0.324 c
+75.072 0.313 75.006 0.287 74.947 0.25 c
+74.889 0.21 74.837 0.151 74.8 0.074 c
+74.76 0.004 74.741 -0.087 74.741 -0.205 c
+74.741 -0.374 74.775 -0.496 74.844 -0.573 c
+74.91 -0.654 75.01 -0.69 75.138 -0.69 c
+75.245 -0.69 75.344 -0.668 75.432 -0.617 c
+75.527 -0.569 75.608 -0.507 75.667 -0.426 c
+75.733 -0.349 75.785 -0.261 75.814 -0.161 c
+75.843 -0.055 75.858 0.059 75.858 0.177 c
+h
+80.08 -0.646 m
+81.212 -0.646 l
+81.212 -1.263 l
+77.905 -1.263 l
+77.905 -0.646 l
+79.17 -0.646 l
+79.17 2.897 l
+78.243 2.897 l
+78.243 3.514 l
+80.08 3.514 l
+h
+86.982 2.22 m
+86.982 0.265 l
+86.982 0.125 86.989 0 87.011 -0.118 c
+87.03 -0.228 87.063 -0.319 87.114 -0.396 c
+87.162 -0.477 87.221 -0.54 87.29 -0.588 c
+87.357 -0.627 87.441 -0.646 87.54 -0.646 c
+87.629 -0.646 87.71 -0.627 87.791 -0.588 c
+87.878 -0.54 87.952 -0.47 88.011 -0.382 c
+88.069 -0.286 88.113 -0.176 88.144 -0.058 c
+88.18 0.067 88.202 0.206 88.202 0.353 c
+88.202 2.22 l
+89.098 2.22 l
+89.098 -0.484 l
+89.098 -0.72 l
+89.106 -0.801 89.113 -0.878 89.113 -0.955 c
+89.113 -1.146 l
+89.121 -1.198 89.128 -1.234 89.128 -1.263 c
+88.275 -1.263 l
+88.265 -1.234 88.254 -1.198 88.246 -1.146 c
+88.246 -0.955 l
+88.246 -0.889 88.239 -0.819 88.231 -0.749 c
+88.231 -0.573 l
+88.217 -0.573 l
+88.099 -0.837 87.945 -1.028 87.761 -1.146 c
+87.585 -1.263 87.382 -1.323 87.159 -1.323 c
+86.953 -1.323 86.779 -1.286 86.644 -1.219 c
+86.504 -1.153 86.394 -1.058 86.305 -0.941 c
+86.225 -0.823 86.166 -0.687 86.129 -0.529 c
+86.1 -0.363 86.085 -0.187 86.085 0 c
+86.085 2.22 l
+h
+93.262 -0.249 m
+93.262 -0.419 93.222 -0.569 93.144 -0.706 c
+93.075 -0.833 92.971 -0.947 92.836 -1.043 c
+92.707 -1.132 92.545 -1.201 92.351 -1.249 c
+92.163 -1.296 91.947 -1.323 91.704 -1.323 c
+91.477 -1.323 91.278 -1.308 91.101 -1.278 c
+90.925 -1.249 90.767 -1.201 90.631 -1.132 c
+90.492 -1.055 90.382 -0.955 90.293 -0.837 c
+90.205 -0.72 90.135 -0.573 90.087 -0.396 c
+90.895 -0.278 l
+90.914 -0.378 90.943 -0.455 90.984 -0.514 c
+91.032 -0.573 91.09 -0.617 91.16 -0.646 c
+91.226 -0.675 91.307 -0.702 91.396 -0.72 c
+91.483 -0.731 91.587 -0.735 91.704 -0.735 c
+91.799 -0.735 91.895 -0.731 91.984 -0.72 c
+92.071 -0.702 92.148 -0.675 92.219 -0.646 c
+92.285 -0.617 92.336 -0.58 92.366 -0.529 c
+92.402 -0.481 92.424 -0.419 92.424 -0.338 c
+92.424 -0.242 92.395 -0.168 92.336 -0.118 c
+92.285 -0.07 92.219 -0.029 92.13 0 c
+92.042 0.038 91.932 0.067 91.807 0.088 c
+91.689 0.118 91.557 0.148 91.41 0.177 c
+91.271 0.214 91.13 0.254 90.984 0.294 c
+90.844 0.342 90.719 0.405 90.602 0.485 c
+90.492 0.563 90.403 0.662 90.337 0.78 c
+90.267 0.897 90.234 1.048 90.234 1.235 c
+90.234 1.389 90.263 1.532 90.322 1.661 c
+90.388 1.798 90.484 1.912 90.602 1.999 c
+90.727 2.087 90.885 2.154 91.072 2.205 c
+91.255 2.253 91.469 2.278 91.704 2.278 c
+91.888 2.278 92.065 2.257 92.233 2.22 c
+92.398 2.191 92.545 2.135 92.674 2.058 c
+92.799 1.989 92.909 1.889 92.998 1.764 c
+93.085 1.646 93.144 1.503 93.174 1.338 c
+92.38 1.264 l
+92.358 1.341 92.329 1.405 92.292 1.455 c
+92.252 1.515 92.204 1.559 92.144 1.588 c
+92.094 1.625 92.031 1.65 91.954 1.661 c
+91.873 1.669 91.793 1.676 91.704 1.676 c
+91.487 1.676 91.325 1.646 91.219 1.588 c
+91.109 1.536 91.057 1.449 91.057 1.324 c
+91.057 1.243 91.076 1.18 91.116 1.133 c
+91.164 1.081 91.226 1.044 91.307 1.015 c
+91.396 0.985 91.491 0.956 91.601 0.927 c
+91.708 0.904 91.829 0.882 91.969 0.853 c
+92.123 0.823 92.281 0.784 92.439 0.736 c
+92.593 0.684 92.733 0.622 92.85 0.545 c
+92.969 0.464 93.064 0.36 93.144 0.235 c
+93.222 0.107 93.262 -0.055 93.262 -0.249 c
+95.783 -1.323 m
+95.525 -1.323 95.298 -1.286 95.092 -1.219 c
+94.887 -1.142 94.71 -1.028 94.563 -0.881 c
+94.416 -0.727 94.299 -0.536 94.21 -0.309 c
+94.129 -0.084 94.093 0.181 94.093 0.485 c
+94.093 0.817 94.137 1.096 94.224 1.324 c
+94.32 1.559 94.449 1.742 94.607 1.881 c
+94.772 2.018 94.96 2.117 95.165 2.176 c
+95.371 2.242 95.581 2.278 95.797 2.278 c
+96.069 2.278 96.304 2.228 96.503 2.132 c
+96.709 2.043 96.875 1.912 97.003 1.735 c
+97.139 1.566 97.239 1.36 97.297 1.118 c
+97.363 0.882 97.399 0.618 97.399 0.324 c
+97.399 0.31 l
+95.033 0.31 l
+95.033 0.162 95.048 0.023 95.078 -0.103 c
+95.114 -0.231 95.169 -0.345 95.24 -0.44 c
+95.305 -0.529 95.39 -0.598 95.489 -0.646 c
+95.585 -0.698 95.699 -0.72 95.827 -0.72 c
+95.982 -0.72 96.121 -0.687 96.239 -0.617 c
+96.364 -0.55 96.452 -0.448 96.503 -0.309 c
+97.341 -0.382 l
+97.312 -0.481 97.256 -0.588 97.179 -0.706 c
+97.098 -0.816 96.996 -0.918 96.871 -1.014 c
+96.753 -1.102 96.599 -1.176 96.415 -1.234 c
+96.239 -1.294 96.026 -1.323 95.783 -1.323 c
+95.783 1.706 m
+95.695 1.706 95.606 1.691 95.518 1.661 c
+95.43 1.632 95.35 1.58 95.283 1.515 c
+95.213 1.445 95.155 1.357 95.107 1.25 c
+95.066 1.139 95.048 1.015 95.048 0.867 c
+96.518 0.867 l
+96.518 1.004 96.493 1.125 96.445 1.235 c
+96.404 1.341 96.349 1.43 96.283 1.5 c
+96.224 1.566 96.15 1.617 96.063 1.646 c
+95.974 1.684 95.878 1.706 95.783 1.706 c
+101.299 1.47 m
+101.2 1.478 101.097 1.489 100.99 1.5 c
+100.88 1.518 100.759 1.529 100.622 1.529 c
+100.446 1.529 100.288 1.489 100.152 1.411 c
+100.013 1.341 99.895 1.243 99.799 1.118 c
+99.711 0.989 99.641 0.842 99.593 0.676 c
+99.554 0.508 99.535 0.331 99.535 0.148 c
+99.535 -1.263 l
+98.638 -1.263 l
+98.638 0.985 l
+98.638 1.11 98.627 1.235 98.609 1.353 c
+98.598 1.478 98.583 1.596 98.565 1.706 c
+98.554 1.823 98.539 1.919 98.521 1.999 c
+98.498 2.087 98.48 2.161 98.462 2.22 c
+99.344 2.22 l
+99.351 2.168 99.362 2.117 99.373 2.058 c
+99.392 1.999 99.406 1.933 99.417 1.867 c
+99.435 1.808 99.45 1.742 99.462 1.676 c
+99.469 1.607 99.479 1.544 99.491 1.485 c
+99.506 1.485 l
+99.542 1.603 99.593 1.709 99.653 1.808 c
+99.718 1.904 99.799 1.989 99.888 2.058 c
+99.976 2.124 100.079 2.18 100.196 2.22 c
+100.321 2.257 100.468 2.278 100.637 2.278 c
+100.763 2.278 100.88 2.272 100.99 2.264 c
+101.108 2.253 101.21 2.238 101.299 2.22 c
+h
+103.404 -0.278 0.927 -0.985 re
+103.404 -1.263 m
+107.965 -1.323 m
+107.707 -1.323 107.479 -1.286 107.274 -1.219 c
+107.068 -1.142 106.892 -1.028 106.745 -0.881 c
+106.598 -0.727 106.48 -0.536 106.392 -0.309 c
+106.311 -0.084 106.274 0.181 106.274 0.485 c
+106.274 0.817 106.319 1.096 106.407 1.324 c
+106.502 1.559 106.631 1.742 106.789 1.881 c
+106.955 2.018 107.142 2.117 107.348 2.176 c
+107.553 2.242 107.763 2.278 107.98 2.278 c
+108.252 2.278 108.487 2.228 108.686 2.132 c
+108.891 2.043 109.056 1.912 109.185 1.735 c
+109.32 1.566 109.42 1.36 109.479 1.118 c
+109.545 0.882 109.582 0.618 109.582 0.324 c
+109.582 0.31 l
+107.215 0.31 l
+107.215 0.162 107.23 0.023 107.259 -0.103 c
+107.296 -0.231 107.352 -0.345 107.421 -0.44 c
+107.487 -0.529 107.572 -0.598 107.67 -0.646 c
+107.766 -0.698 107.88 -0.72 108.009 -0.72 c
+108.163 -0.72 108.303 -0.687 108.42 -0.617 c
+108.545 -0.55 108.634 -0.448 108.686 -0.309 c
+109.523 -0.382 l
+109.494 -0.481 109.438 -0.588 109.361 -0.706 c
+109.28 -0.816 109.178 -0.918 109.052 -1.014 c
+108.935 -1.102 108.781 -1.176 108.597 -1.234 c
+108.42 -1.294 108.208 -1.323 107.965 -1.323 c
+107.965 1.706 m
+107.876 1.706 107.788 1.691 107.701 1.661 c
+107.612 1.632 107.531 1.58 107.465 1.515 c
+107.395 1.445 107.336 1.357 107.288 1.25 c
+107.248 1.139 107.23 1.015 107.23 0.867 c
+108.7 0.867 l
+108.7 1.004 108.674 1.125 108.626 1.235 c
+108.586 1.341 108.53 1.43 108.464 1.5 c
+108.406 1.566 108.333 1.617 108.244 1.646 c
+108.156 1.684 108.06 1.706 107.965 1.706 c
+111.628 -1.263 m
+111.628 0.853 l
+111.628 1.019 111.622 1.154 111.614 1.264 c
+111.603 1.372 111.585 1.455 111.555 1.515 c
+111.533 1.58 111.504 1.632 111.467 1.661 c
+111.437 1.691 111.397 1.706 111.35 1.706 c
+111.29 1.706 111.235 1.676 111.188 1.617 c
+111.147 1.566 111.114 1.492 111.084 1.397 c
+111.055 1.309 111.03 1.195 111.011 1.058 c
+111 0.919 110.997 0.769 110.997 0.603 c
+110.997 -1.263 l
+110.247 -1.263 l
+110.247 1.47 l
+110.247 1.706 l
+110.247 1.926 l
+110.247 2.003 110.24 2.066 110.232 2.117 c
+110.232 2.22 l
+110.908 2.22 l
+110.908 2.132 l
+110.908 1.985 l
+110.916 1.926 110.923 1.867 110.923 1.808 c
+110.923 1.646 l
+110.938 1.646 l
+110.956 1.735 110.986 1.812 111.026 1.881 c
+111.063 1.96 111.107 2.029 111.158 2.087 c
+111.217 2.147 111.283 2.191 111.364 2.22 c
+111.441 2.257 111.529 2.278 111.628 2.278 c
+111.813 2.278 111.952 2.224 112.04 2.117 c
+112.135 2.018 112.206 1.86 112.246 1.646 c
+112.26 1.646 l
+112.297 1.742 112.337 1.831 112.378 1.912 c
+112.426 1.989 112.481 2.051 112.54 2.103 c
+112.599 2.161 112.665 2.205 112.746 2.234 c
+112.823 2.264 112.911 2.278 113.01 2.278 c
+113.146 2.278 113.26 2.253 113.349 2.205 c
+113.436 2.154 113.503 2.08 113.554 1.985 c
+113.613 1.885 113.65 1.757 113.671 1.603 c
+113.702 1.455 113.716 1.272 113.716 1.058 c
+113.716 -1.263 l
+112.996 -1.263 l
+112.996 0.853 l
+112.996 1.019 112.988 1.154 112.981 1.264 c
+112.97 1.372 112.952 1.455 112.922 1.515 c
+112.9 1.58 112.871 1.632 112.834 1.661 c
+112.804 1.691 112.764 1.706 112.717 1.706 c
+112.599 1.706 112.503 1.617 112.437 1.441 c
+112.378 1.272 112.349 1.015 112.349 0.662 c
+112.349 -1.263 l
+h
+115.487 -1.323 m
+115.318 -1.323 115.167 -1.3 115.032 -1.263 c
+114.903 -1.215 114.789 -1.146 114.693 -1.058 c
+114.606 -0.97 114.535 -0.863 114.487 -0.735 c
+114.436 -0.598 114.414 -0.448 114.414 -0.278 c
+114.414 -0.073 114.448 0.096 114.517 0.235 c
+114.583 0.383 114.679 0.493 114.797 0.574 c
+114.921 0.662 115.065 0.724 115.223 0.765 c
+115.388 0.802 115.564 0.827 115.751 0.838 c
+116.472 0.853 l
+116.472 1.029 l
+116.472 1.147 116.461 1.25 116.443 1.338 c
+116.42 1.426 116.387 1.492 116.339 1.544 c
+116.299 1.603 116.252 1.64 116.193 1.661 c
+116.133 1.68 116.067 1.691 116.002 1.691 c
+115.932 1.691 115.869 1.68 115.811 1.661 c
+115.759 1.65 115.711 1.625 115.663 1.588 c
+115.623 1.559 115.59 1.507 115.56 1.441 c
+115.539 1.382 115.524 1.301 115.516 1.206 c
+114.575 1.25 l
+114.606 1.397 114.649 1.532 114.708 1.661 c
+114.774 1.786 114.87 1.897 114.988 1.985 c
+115.105 2.08 115.244 2.154 115.414 2.205 c
+115.59 2.253 115.796 2.278 116.031 2.278 c
+116.472 2.278 116.802 2.168 117.031 1.956 c
+117.266 1.75 117.384 1.441 117.384 1.029 c
+117.384 -0.235 l
+117.384 -0.455 l
+117.39 -0.514 117.405 -0.569 117.428 -0.617 c
+117.446 -0.658 117.475 -0.69 117.515 -0.72 c
+117.552 -0.742 117.604 -0.749 117.663 -0.749 c
+117.729 -0.749 117.798 -0.745 117.868 -0.735 c
+117.868 -1.219 l
+117.81 -1.23 117.754 -1.242 117.706 -1.249 c
+117.666 -1.26 117.625 -1.267 117.589 -1.278 c
+117.548 -1.286 117.505 -1.294 117.457 -1.294 c
+117.405 -1.3 117.347 -1.308 117.28 -1.308 c
+117.052 -1.308 116.887 -1.256 116.781 -1.146 c
+116.67 -1.028 116.607 -0.863 116.59 -0.646 c
+116.575 -0.646 l
+116.505 -0.756 116.435 -0.852 116.369 -0.941 c
+116.299 -1.021 116.222 -1.087 116.133 -1.146 c
+116.046 -1.205 115.946 -1.249 115.84 -1.278 c
+115.741 -1.308 115.623 -1.323 115.487 -1.323 c
+116.472 0.353 m
+116.046 0.339 l
+115.946 0.339 115.855 0.331 115.766 0.324 c
+115.686 0.313 115.62 0.287 115.56 0.25 c
+115.502 0.21 115.45 0.151 115.414 0.074 c
+115.373 0.004 115.354 -0.087 115.354 -0.205 c
+115.354 -0.374 115.388 -0.496 115.458 -0.573 c
+115.524 -0.654 115.623 -0.69 115.751 -0.69 c
+115.859 -0.69 115.957 -0.668 116.046 -0.617 c
+116.141 -0.569 116.222 -0.507 116.281 -0.426 c
+116.347 -0.349 116.399 -0.261 116.428 -0.161 c
+116.457 -0.055 116.472 0.059 116.472 0.177 c
+h
+120.694 -0.646 m
+121.826 -0.646 l
+121.826 -1.263 l
+118.519 -1.263 l
+118.519 -0.646 l
+119.782 -0.646 l
+119.782 1.603 l
+118.857 1.603 l
+118.857 2.22 l
+120.694 2.22 l
+h
+119.782 3.514 0.912 -0.676 re
+119.782 2.837 m
+124.755 -0.646 m
+125.887 -0.646 l
+125.887 -1.263 l
+122.579 -1.263 l
+122.579 -0.646 l
+123.844 -0.646 l
+123.844 2.897 l
+122.917 2.897 l
+122.917 3.514 l
+124.755 3.514 l
+h
+133.346 1.455 m
+132.715 1.455 l
+132.582 3.514 l
+133.479 3.514 l
+h
+131.877 1.455 m
+131.244 1.455 l
+131.127 3.514 l
+131.994 3.514 l
+h
+136.764 -1.44 m
+136.683 -1.646 136.602 -1.822 136.514 -1.969 c
+136.434 -2.123 136.341 -2.248 136.235 -2.337 c
+136.124 -2.432 136.007 -2.506 135.882 -2.557 c
+135.753 -2.605 135.603 -2.63 135.426 -2.63 c
+135.327 -2.63 135.224 -2.624 135.117 -2.616 c
+135.019 -2.616 134.926 -2.605 134.838 -2.587 c
+134.838 -1.94 l
+134.857 -1.947 134.882 -1.955 134.911 -1.955 c
+135 -1.955 l
+135.037 -1.961 135.067 -1.969 135.088 -1.969 c
+135.177 -1.969 l
+135.264 -1.969 135.341 -1.959 135.412 -1.94 c
+135.478 -1.918 135.537 -1.884 135.588 -1.837 c
+135.647 -1.797 135.698 -1.738 135.75 -1.66 c
+135.798 -1.591 135.842 -1.499 135.882 -1.381 c
+135.941 -1.234 l
+134.5 2.22 l
+135.456 2.22 l
+136.073 0.515 l
+136.081 0.493 136.091 0.456 136.102 0.397 c
+136.121 0.346 136.139 0.283 136.162 0.206 c
+136.191 0.136 136.212 0.063 136.235 -0.014 c
+136.264 -0.095 136.286 -0.172 136.308 -0.249 c
+136.326 -0.319 136.341 -0.382 136.353 -0.44 c
+136.371 -0.492 136.386 -0.529 136.397 -0.558 c
+136.397 -0.529 136.4 -0.492 136.411 -0.44 c
+136.43 -0.382 136.448 -0.319 136.47 -0.249 c
+136.488 -0.183 136.507 -0.11 136.529 -0.029 c
+136.558 0.048 136.577 0.121 136.588 0.192 c
+136.606 0.258 136.625 0.324 136.646 0.383 c
+136.665 0.441 136.679 0.485 136.69 0.515 c
+137.263 2.22 l
+138.204 2.22 l
+h
+142.103 0.485 m
+142.103 0.21 142.067 -0.039 142.001 -0.264 c
+141.93 -0.481 141.828 -0.668 141.691 -0.823 c
+141.552 -0.98 141.376 -1.102 141.163 -1.19 c
+140.946 -1.278 140.692 -1.323 140.398 -1.323 c
+140.122 -1.323 139.877 -1.278 139.663 -1.19 c
+139.457 -1.102 139.285 -0.98 139.149 -0.823 c
+139.009 -0.668 138.907 -0.481 138.84 -0.264 c
+138.77 -0.039 138.737 0.21 138.737 0.485 c
+138.737 0.739 138.767 0.975 138.826 1.191 c
+138.892 1.415 138.994 1.607 139.134 1.764 c
+139.27 1.929 139.447 2.058 139.663 2.147 c
+139.877 2.234 140.133 2.278 140.428 2.278 c
+140.74 2.278 141.001 2.234 141.207 2.147 c
+141.419 2.058 141.593 1.929 141.721 1.764 c
+141.857 1.607 141.957 1.415 142.015 1.191 c
+142.074 0.975 142.103 0.739 142.103 0.485 c
+141.148 0.485 m
+141.148 0.691 141.133 0.867 141.103 1.015 c
+141.082 1.162 141.045 1.283 140.986 1.382 c
+140.927 1.478 140.854 1.548 140.766 1.588 c
+140.677 1.636 140.567 1.661 140.442 1.661 c
+140.178 1.661 139.987 1.563 139.869 1.368 c
+139.752 1.18 139.692 0.886 139.692 0.485 c
+139.692 0.063 139.752 -0.242 139.869 -0.426 c
+139.987 -0.613 140.163 -0.706 140.398 -0.706 c
+140.523 -0.706 140.637 -0.687 140.736 -0.646 c
+140.831 -0.598 140.912 -0.525 140.972 -0.426 c
+141.038 -0.33 141.082 -0.205 141.103 -0.058 c
+141.133 0.088 141.148 0.269 141.148 0.485 c
+143.842 2.22 m
+143.842 0.265 l
+143.842 0.125 143.848 0 143.871 -0.118 c
+143.889 -0.228 143.923 -0.319 143.974 -0.396 c
+144.022 -0.477 144.081 -0.54 144.15 -0.588 c
+144.216 -0.627 144.301 -0.646 144.4 -0.646 c
+144.488 -0.646 144.569 -0.627 144.65 -0.588 c
+144.738 -0.54 144.812 -0.47 144.87 -0.382 c
+144.929 -0.286 144.974 -0.176 145.003 -0.058 c
+145.039 0.067 145.061 0.206 145.061 0.353 c
+145.061 2.22 l
+145.959 2.22 l
+145.959 -0.484 l
+145.959 -0.72 l
+145.965 -0.801 145.973 -0.878 145.973 -0.955 c
+145.973 -1.146 l
+145.98 -1.198 145.988 -1.234 145.988 -1.263 c
+145.135 -1.263 l
+145.124 -1.234 145.113 -1.198 145.105 -1.146 c
+145.105 -0.955 l
+145.105 -0.889 145.099 -0.819 145.091 -0.749 c
+145.091 -0.573 l
+145.076 -0.573 l
+144.959 -0.837 144.804 -1.028 144.621 -1.146 c
+144.444 -1.263 144.242 -1.323 144.018 -1.323 c
+143.812 -1.323 143.64 -1.286 143.503 -1.219 c
+143.364 -1.153 143.254 -1.058 143.165 -0.941 c
+143.085 -0.823 143.025 -0.687 142.989 -0.529 c
+142.959 -0.363 142.944 -0.187 142.944 0 c
+142.944 2.22 l
+h
+150.387 1.162 m
+150.387 0.857 150.36 0.574 150.313 0.31 c
+150.273 0.052 150.21 -0.168 150.121 -0.353 c
+150.04 -0.529 149.938 -0.672 149.813 -0.779 c
+149.695 -0.878 149.556 -0.926 149.402 -0.926 c
+149.342 -0.926 149.284 -0.922 149.225 -0.911 c
+149.166 -0.893 149.115 -0.863 149.078 -0.823 c
+149.038 -0.786 149.005 -0.735 148.975 -0.675 c
+148.953 -0.61 148.945 -0.525 148.945 -0.426 c
+148.945 -0.396 l
+148.945 -0.353 l
+148.945 -0.309 l
+148.953 -0.29 148.96 -0.275 148.96 -0.264 c
+148.931 -0.264 l
+148.902 -0.353 148.862 -0.436 148.814 -0.514 c
+148.762 -0.595 148.704 -0.668 148.637 -0.735 c
+148.578 -0.793 148.509 -0.845 148.432 -0.881 c
+148.351 -0.911 148.27 -0.926 148.181 -0.926 c
+148.041 -0.926 147.924 -0.893 147.829 -0.823 c
+147.74 -0.756 147.667 -0.668 147.609 -0.558 c
+147.557 -0.44 147.52 -0.309 147.491 -0.161 c
+147.468 -0.007 147.461 0.151 147.461 0.31 c
+147.461 0.474 147.468 0.636 147.491 0.794 c
+147.52 0.948 147.553 1.103 147.594 1.25 c
+147.642 1.397 147.7 1.532 147.769 1.661 c
+147.836 1.786 147.917 1.897 148.005 1.985 c
+148.093 2.073 148.189 2.139 148.299 2.191 c
+148.405 2.249 148.519 2.278 148.637 2.278 c
+148.714 2.278 148.785 2.264 148.843 2.234 c
+148.902 2.205 148.949 2.165 148.99 2.117 c
+149.038 2.066 149.07 2.007 149.093 1.941 c
+149.122 1.871 149.144 1.798 149.166 1.721 c
+149.181 1.721 l
+149.284 2.205 l
+149.725 2.205 l
+149.402 0.574 l
+149.379 0.485 149.361 0.397 149.342 0.31 c
+149.332 0.221 149.321 0.136 149.313 0.059 c
+149.302 -0.022 149.292 -0.095 149.284 -0.161 c
+149.273 -0.22 149.269 -0.275 149.269 -0.323 c
+149.269 -0.374 149.273 -0.411 149.284 -0.44 c
+149.292 -0.47 149.302 -0.496 149.313 -0.514 c
+149.332 -0.525 149.35 -0.536 149.372 -0.544 c
+149.431 -0.544 l
+149.508 -0.544 149.581 -0.507 149.651 -0.426 c
+149.718 -0.338 149.772 -0.22 149.813 -0.073 c
+149.861 0.074 149.894 0.25 149.916 0.456 c
+149.945 0.669 149.96 0.904 149.96 1.162 c
+149.96 1.426 149.93 1.676 149.872 1.912 c
+149.82 2.154 149.743 2.367 149.637 2.544 c
+149.537 2.72 149.409 2.856 149.255 2.955 c
+149.097 3.051 148.92 3.102 148.725 3.102 c
+148.549 3.102 148.388 3.065 148.24 2.999 c
+148.101 2.94 147.975 2.852 147.858 2.735 c
+147.74 2.617 147.638 2.473 147.549 2.309 c
+147.461 2.139 147.388 1.956 147.329 1.75 c
+147.27 1.551 147.218 1.338 147.181 1.103 c
+147.152 0.875 147.138 0.636 147.138 0.383 c
+147.138 0.067 147.167 -0.22 147.226 -0.484 c
+147.293 -0.749 147.388 -0.98 147.505 -1.176 c
+147.623 -1.359 147.763 -1.502 147.931 -1.602 c
+148.097 -1.708 148.288 -1.764 148.505 -1.764 c
+148.629 -1.764 148.747 -1.749 148.858 -1.72 c
+148.964 -1.69 149.067 -1.649 149.166 -1.602 c
+149.261 -1.562 149.357 -1.514 149.446 -1.454 c
+149.533 -1.396 149.614 -1.326 149.695 -1.249 c
+149.916 -1.572 l
+149.828 -1.649 149.728 -1.723 149.622 -1.793 c
+149.523 -1.87 149.409 -1.932 149.284 -1.984 c
+149.166 -2.042 149.038 -2.087 148.902 -2.117 c
+148.773 -2.153 148.629 -2.175 148.475 -2.175 c
+148.199 -2.175 147.954 -2.109 147.74 -1.984 c
+147.524 -1.866 147.336 -1.693 147.181 -1.469 c
+147.023 -1.256 146.906 -0.992 146.829 -0.675 c
+146.748 -0.353 146.711 0 146.711 0.383 c
+146.711 0.831 146.755 1.25 146.844 1.632 c
+146.932 2.014 147.057 2.342 147.226 2.617 c
+147.403 2.9 147.611 3.12 147.858 3.279 c
+148.112 3.433 148.402 3.514 148.725 3.514 c
+149.008 3.514 149.255 3.448 149.46 3.323 c
+149.666 3.194 149.835 3.021 149.975 2.808 c
+150.111 2.591 150.214 2.342 150.283 2.058 c
+150.35 1.771 150.387 1.474 150.387 1.162 c
+148.99 1.264 m
+148.99 1.478 148.96 1.636 148.902 1.735 c
+148.843 1.831 148.754 1.881 148.637 1.881 c
+148.527 1.881 148.432 1.831 148.343 1.735 c
+148.262 1.636 148.197 1.515 148.137 1.368 c
+148.079 1.22 148.035 1.052 148.005 0.867 c
+147.975 0.68 147.961 0.493 147.961 0.31 c
+147.961 0 l
+147.968 -0.099 147.983 -0.187 148.005 -0.264 c
+148.035 -0.345 148.068 -0.407 148.108 -0.455 c
+148.145 -0.507 148.197 -0.529 148.255 -0.529 c
+148.332 -0.529 148.405 -0.507 148.475 -0.455 c
+148.542 -0.396 148.608 -0.319 148.667 -0.22 c
+148.725 -0.114 148.773 0.015 148.814 0.162 c
+148.862 0.31 148.895 0.47 148.916 0.647 c
+148.924 0.684 148.935 0.736 148.945 0.794 c
+148.953 0.853 148.96 0.912 148.96 0.971 c
+148.968 1.029 148.975 1.081 148.975 1.133 c
+148.982 1.18 148.99 1.224 148.99 1.264 c
+152.639 -1.323 m
+152.382 -1.323 152.154 -1.286 151.948 -1.219 c
+151.742 -1.142 151.566 -1.028 151.419 -0.881 c
+151.272 -0.727 151.154 -0.536 151.066 -0.309 c
+150.985 -0.084 150.948 0.181 150.948 0.485 c
+150.948 0.817 150.992 1.096 151.081 1.324 c
+151.176 1.559 151.305 1.742 151.463 1.881 c
+151.628 2.018 151.816 2.117 152.022 2.176 c
+152.228 2.242 152.436 2.278 152.654 2.278 c
+152.926 2.278 153.161 2.228 153.359 2.132 c
+153.565 2.043 153.73 1.912 153.859 1.735 c
+153.995 1.566 154.094 1.36 154.153 1.118 c
+154.219 0.882 154.256 0.618 154.256 0.324 c
+154.256 0.31 l
+151.889 0.31 l
+151.889 0.162 151.904 0.023 151.933 -0.103 c
+151.97 -0.231 152.025 -0.345 152.095 -0.44 c
+152.161 -0.529 152.245 -0.598 152.345 -0.646 c
+152.44 -0.698 152.554 -0.72 152.683 -0.72 c
+152.837 -0.72 152.977 -0.687 153.095 -0.617 c
+153.219 -0.55 153.308 -0.448 153.359 -0.309 c
+154.197 -0.382 l
+154.167 -0.481 154.113 -0.588 154.036 -0.706 c
+153.955 -0.816 153.851 -0.918 153.726 -1.014 c
+153.609 -1.102 153.454 -1.176 153.271 -1.234 c
+153.095 -1.294 152.881 -1.323 152.639 -1.323 c
+152.639 1.706 m
+152.55 1.706 152.463 1.691 152.374 1.661 c
+152.286 1.632 152.205 1.58 152.139 1.515 c
+152.07 1.445 152.01 1.357 151.962 1.25 c
+151.922 1.139 151.904 1.015 151.904 0.867 c
+153.373 0.867 l
+153.373 1.004 153.348 1.125 153.3 1.235 c
+153.26 1.341 153.205 1.43 153.138 1.5 c
+153.08 1.566 153.007 1.617 152.918 1.646 c
+152.83 1.684 152.735 1.706 152.639 1.706 c
+157.497 -1.263 m
+156.659 0 l
+155.806 -1.263 l
+154.851 -1.263 l
+156.159 0.53 l
+154.91 2.22 l
+155.88 2.22 l
+156.659 1.073 l
+157.423 2.22 l
+158.408 2.22 l
+157.159 0.545 l
+158.482 -1.263 l
+h
+160.161 -1.323 m
+159.992 -1.323 159.841 -1.3 159.706 -1.263 c
+159.577 -1.215 159.463 -1.146 159.368 -1.058 c
+159.279 -0.97 159.21 -0.863 159.162 -0.735 c
+159.11 -0.598 159.088 -0.448 159.088 -0.278 c
+159.088 -0.073 159.121 0.096 159.191 0.235 c
+159.257 0.383 159.353 0.493 159.47 0.574 c
+159.595 0.662 159.738 0.724 159.897 0.765 c
+160.062 0.802 160.238 0.827 160.426 0.838 c
+161.146 0.853 l
+161.146 1.029 l
+161.146 1.147 161.135 1.25 161.117 1.338 c
+161.094 1.426 161.061 1.492 161.014 1.544 c
+160.974 1.603 160.926 1.64 160.866 1.661 c
+160.808 1.68 160.741 1.691 160.675 1.691 c
+160.606 1.691 160.544 1.68 160.484 1.661 c
+160.433 1.65 160.386 1.625 160.338 1.588 c
+160.297 1.559 160.264 1.507 160.234 1.441 c
+160.213 1.382 160.198 1.301 160.191 1.206 c
+159.25 1.25 l
+159.279 1.397 159.324 1.532 159.382 1.661 c
+159.448 1.786 159.544 1.897 159.661 1.985 c
+159.779 2.08 159.918 2.154 160.087 2.205 c
+160.264 2.253 160.469 2.278 160.705 2.278 c
+161.146 2.278 161.477 2.168 161.705 1.956 c
+161.94 1.75 162.057 1.441 162.057 1.029 c
+162.057 -0.235 l
+162.057 -0.455 l
+162.065 -0.514 162.079 -0.569 162.102 -0.617 c
+162.119 -0.658 162.15 -0.69 162.19 -0.72 c
+162.227 -0.742 162.278 -0.749 162.337 -0.749 c
+162.403 -0.749 162.472 -0.745 162.543 -0.735 c
+162.543 -1.219 l
+162.484 -1.23 162.428 -1.242 162.381 -1.249 c
+162.341 -1.26 162.3 -1.267 162.263 -1.278 c
+162.223 -1.286 162.179 -1.294 162.131 -1.294 c
+162.079 -1.3 162.021 -1.308 161.955 -1.308 c
+161.726 -1.308 161.562 -1.256 161.454 -1.146 c
+161.344 -1.028 161.282 -0.863 161.263 -0.646 c
+161.249 -0.646 l
+161.179 -0.756 161.109 -0.852 161.043 -0.941 c
+160.974 -1.021 160.897 -1.087 160.808 -1.146 c
+160.72 -1.205 160.621 -1.249 160.514 -1.278 c
+160.415 -1.308 160.297 -1.323 160.161 -1.323 c
+161.146 0.353 m
+160.72 0.339 l
+160.621 0.339 160.529 0.331 160.44 0.324 c
+160.359 0.313 160.294 0.287 160.234 0.25 c
+160.176 0.21 160.124 0.151 160.087 0.074 c
+160.047 0.004 160.029 -0.087 160.029 -0.205 c
+160.029 -0.374 160.062 -0.496 160.132 -0.573 c
+160.198 -0.654 160.297 -0.69 160.426 -0.69 c
+160.532 -0.69 160.631 -0.668 160.72 -0.617 c
+160.816 -0.569 160.897 -0.507 160.955 -0.426 c
+161.021 -0.349 161.072 -0.261 161.102 -0.161 c
+161.132 -0.055 161.146 0.059 161.146 0.177 c
+h
+164.427 -1.263 m
+164.427 0.853 l
+164.427 1.019 164.421 1.154 164.413 1.264 c
+164.402 1.372 164.384 1.455 164.354 1.515 c
+164.332 1.58 164.303 1.632 164.266 1.661 c
+164.236 1.691 164.196 1.706 164.149 1.706 c
+164.089 1.706 164.034 1.676 163.987 1.617 c
+163.946 1.566 163.913 1.492 163.883 1.397 c
+163.854 1.309 163.829 1.195 163.81 1.058 c
+163.799 0.919 163.796 0.769 163.796 0.603 c
+163.796 -1.263 l
+163.046 -1.263 l
+163.046 1.47 l
+163.046 1.706 l
+163.046 1.926 l
+163.046 2.003 163.039 2.066 163.031 2.117 c
+163.031 2.22 l
+163.707 2.22 l
+163.707 2.132 l
+163.707 1.985 l
+163.715 1.926 163.722 1.867 163.722 1.808 c
+163.722 1.646 l
+163.737 1.646 l
+163.755 1.735 163.785 1.812 163.825 1.881 c
+163.862 1.96 163.906 2.029 163.957 2.087 c
+164.016 2.147 164.082 2.191 164.163 2.22 c
+164.24 2.257 164.328 2.278 164.427 2.278 c
+164.612 2.278 164.751 2.224 164.839 2.117 c
+164.935 2.018 165.005 1.86 165.045 1.646 c
+165.059 1.646 l
+165.096 1.742 165.136 1.831 165.177 1.912 c
+165.225 1.989 165.28 2.051 165.339 2.103 c
+165.398 2.161 165.464 2.205 165.545 2.234 c
+165.622 2.264 165.71 2.278 165.809 2.278 c
+165.945 2.278 166.059 2.253 166.148 2.205 c
+166.235 2.154 166.302 2.08 166.353 1.985 c
+166.412 1.885 166.449 1.757 166.47 1.603 c
+166.501 1.455 166.515 1.272 166.515 1.058 c
+166.515 -1.263 l
+165.795 -1.263 l
+165.795 0.853 l
+165.795 1.019 165.787 1.154 165.78 1.264 c
+165.769 1.372 165.751 1.455 165.721 1.515 c
+165.699 1.58 165.67 1.632 165.633 1.661 c
+165.603 1.691 165.563 1.706 165.516 1.706 c
+165.398 1.706 165.302 1.617 165.236 1.441 c
+165.177 1.272 165.148 1.015 165.148 0.662 c
+165.148 -1.263 l
+h
+168.194 2.22 m
+168.201 2.198 168.209 2.165 168.209 2.117 c
+168.216 2.077 168.224 2.029 168.224 1.97 c
+168.231 1.919 168.238 1.867 168.238 1.808 c
+168.238 1.646 l
+168.253 1.646 l
+168.311 1.764 168.378 1.86 168.459 1.941 c
+168.536 2.018 168.62 2.08 168.708 2.132 c
+168.797 2.191 168.885 2.228 168.973 2.249 c
+169.069 2.268 169.168 2.278 169.267 2.278 c
+169.473 2.278 169.653 2.234 169.811 2.147 c
+169.965 2.058 170.094 1.929 170.193 1.764 c
+170.3 1.607 170.377 1.415 170.428 1.191 c
+170.487 0.975 170.517 0.739 170.517 0.485 c
+170.517 0.221 170.487 -0.025 170.428 -0.249 c
+170.377 -0.467 170.3 -0.658 170.193 -0.823 c
+170.094 -0.98 169.962 -1.102 169.796 -1.19 c
+169.639 -1.278 169.451 -1.323 169.238 -1.323 c
+169.138 -1.323 169.04 -1.311 168.944 -1.294 c
+168.845 -1.271 168.753 -1.242 168.664 -1.19 c
+168.583 -1.142 168.506 -1.08 168.429 -0.999 c
+168.359 -0.922 168.301 -0.83 168.253 -0.72 c
+168.238 -0.72 l
+168.238 -0.808 l
+168.246 -0.849 168.253 -0.897 168.253 -0.955 c
+168.253 -1.117 l
+168.253 -1.294 l
+168.253 -2.63 l
+167.342 -2.63 l
+167.342 1.455 l
+167.342 1.621 167.334 1.768 167.326 1.897 c
+167.326 2.22 l
+h
+168.238 0.456 m
+168.238 0.229 168.257 0.038 168.297 -0.118 c
+168.344 -0.264 168.4 -0.382 168.459 -0.47 c
+168.525 -0.558 168.598 -0.625 168.679 -0.661 c
+168.756 -0.702 168.834 -0.72 168.914 -0.72 c
+169.01 -0.72 169.098 -0.698 169.179 -0.646 c
+169.267 -0.598 169.333 -0.529 169.385 -0.44 c
+169.443 -0.345 169.487 -0.22 169.517 -0.073 c
+169.554 0.081 169.576 0.269 169.576 0.485 c
+169.576 0.875 169.517 1.169 169.4 1.368 c
+169.289 1.563 169.135 1.661 168.93 1.661 c
+168.849 1.661 168.771 1.64 168.694 1.603 c
+168.613 1.563 168.54 1.5 168.473 1.411 c
+168.404 1.324 168.344 1.199 168.297 1.044 c
+168.257 0.886 168.238 0.691 168.238 0.456 c
+173.489 -0.646 m
+174.621 -0.646 l
+174.621 -1.263 l
+171.314 -1.263 l
+171.314 -0.646 l
+172.578 -0.646 l
+172.578 2.897 l
+171.652 2.897 l
+171.652 3.514 l
+173.489 3.514 l
+h
+177.01 -1.323 m
+176.753 -1.323 176.525 -1.286 176.319 -1.219 c
+176.113 -1.142 175.937 -1.028 175.79 -0.881 c
+175.643 -0.727 175.525 -0.536 175.438 -0.309 c
+175.357 -0.084 175.32 0.181 175.32 0.485 c
+175.32 0.817 175.363 1.096 175.452 1.324 c
+175.548 1.559 175.676 1.742 175.834 1.881 c
+175.999 2.018 176.186 2.117 176.392 2.176 c
+176.598 2.242 176.808 2.278 177.025 2.278 c
+177.296 2.278 177.532 2.228 177.73 2.132 c
+177.936 2.043 178.102 1.912 178.23 1.735 c
+178.366 1.566 178.465 1.36 178.524 1.118 c
+178.59 0.882 178.627 0.618 178.627 0.324 c
+178.627 0.31 l
+176.261 0.31 l
+176.261 0.162 176.275 0.023 176.304 -0.103 c
+176.341 -0.231 176.396 -0.345 176.466 -0.44 c
+176.533 -0.529 176.616 -0.598 176.716 -0.646 c
+176.811 -0.698 176.926 -0.72 177.054 -0.72 c
+177.208 -0.72 177.348 -0.687 177.466 -0.617 c
+177.591 -0.55 177.678 -0.448 177.73 -0.309 c
+178.568 -0.382 l
+178.538 -0.481 178.484 -0.588 178.407 -0.706 c
+178.326 -0.816 178.222 -0.918 178.098 -1.014 c
+177.98 -1.102 177.826 -1.176 177.642 -1.234 c
+177.466 -1.294 177.252 -1.323 177.01 -1.323 c
+177.01 1.706 m
+176.922 1.706 176.834 1.691 176.745 1.661 c
+176.657 1.632 176.576 1.58 176.51 1.515 c
+176.44 1.445 176.381 1.357 176.334 1.25 c
+176.294 1.139 176.275 1.015 176.275 0.867 c
+177.745 0.867 l
+177.745 1.004 177.719 1.125 177.672 1.235 c
+177.631 1.341 177.576 1.43 177.51 1.5 c
+177.451 1.566 177.377 1.617 177.289 1.646 c
+177.201 1.684 177.105 1.706 177.01 1.706 c
+180.571 -0.278 0.926 -0.985 re
+180.571 -1.263 m
+185.131 -1.323 m
+184.845 -1.323 184.602 -1.282 184.396 -1.205 c
+184.19 -1.117 184.018 -0.995 183.882 -0.837 c
+183.742 -0.683 183.639 -0.496 183.573 -0.278 c
+183.503 -0.055 183.471 0.192 183.471 0.456 c
+183.471 0.75 183.503 1.008 183.573 1.235 c
+183.65 1.459 183.757 1.646 183.897 1.794 c
+184.043 1.948 184.22 2.066 184.425 2.147 c
+184.631 2.234 184.867 2.278 185.131 2.278 c
+185.356 2.278 185.557 2.249 185.734 2.191 c
+185.91 2.132 186.061 2.047 186.189 1.941 c
+186.314 1.842 186.417 1.721 186.498 1.573 c
+186.575 1.434 186.63 1.283 186.66 1.118 c
+185.748 1.073 l
+185.719 1.25 185.649 1.389 185.543 1.5 c
+185.443 1.607 185.3 1.661 185.117 1.661 c
+184.87 1.661 184.693 1.559 184.587 1.353 c
+184.477 1.154 184.425 0.867 184.425 0.485 c
+184.425 -0.309 184.661 -0.706 185.131 -0.706 c
+185.296 -0.706 185.439 -0.654 185.557 -0.544 c
+185.675 -0.436 185.748 -0.275 185.778 -0.058 c
+186.689 -0.103 l
+186.66 -0.272 186.605 -0.426 186.528 -0.573 c
+186.457 -0.72 186.355 -0.852 186.218 -0.97 c
+186.09 -1.08 185.932 -1.168 185.748 -1.234 c
+185.572 -1.294 185.366 -1.323 185.131 -1.323 c
+190.838 0.485 m
+190.838 0.21 190.802 -0.039 190.735 -0.264 c
+190.665 -0.481 190.563 -0.668 190.426 -0.823 c
+190.287 -0.98 190.11 -1.102 189.898 -1.19 c
+189.68 -1.278 189.427 -1.323 189.133 -1.323 c
+188.857 -1.323 188.611 -1.278 188.398 -1.19 c
+188.192 -1.102 188.02 -0.98 187.884 -0.823 c
+187.744 -0.668 187.641 -0.481 187.575 -0.264 c
+187.505 -0.039 187.472 0.21 187.472 0.485 c
+187.472 0.739 187.502 0.975 187.56 1.191 c
+187.627 1.415 187.729 1.607 187.868 1.764 c
+188.005 1.929 188.181 2.058 188.398 2.147 c
+188.611 2.234 188.868 2.278 189.162 2.278 c
+189.474 2.278 189.736 2.234 189.942 2.147 c
+190.154 2.058 190.328 1.929 190.455 1.764 c
+190.592 1.607 190.691 1.415 190.75 1.191 c
+190.808 0.975 190.838 0.739 190.838 0.485 c
+189.883 0.485 m
+189.883 0.691 189.868 0.867 189.838 1.015 c
+189.817 1.162 189.78 1.283 189.721 1.382 c
+189.662 1.478 189.589 1.548 189.501 1.588 c
+189.412 1.636 189.302 1.661 189.177 1.661 c
+188.913 1.661 188.722 1.563 188.604 1.368 c
+188.487 1.18 188.427 0.886 188.427 0.485 c
+188.427 0.063 188.487 -0.242 188.604 -0.426 c
+188.722 -0.613 188.898 -0.706 189.133 -0.706 c
+189.258 -0.706 189.372 -0.687 189.471 -0.646 c
+189.567 -0.598 189.647 -0.525 189.707 -0.426 c
+189.773 -0.33 189.817 -0.205 189.838 -0.058 c
+189.868 0.088 189.883 0.269 189.883 0.485 c
+192.855 -1.263 m
+192.855 0.853 l
+192.855 1.019 192.848 1.154 192.841 1.264 c
+192.83 1.372 192.811 1.455 192.782 1.515 c
+192.76 1.58 192.73 1.632 192.694 1.661 c
+192.664 1.691 192.624 1.706 192.576 1.706 c
+192.518 1.706 192.462 1.676 192.414 1.617 c
+192.374 1.566 192.341 1.492 192.312 1.397 c
+192.282 1.309 192.256 1.195 192.238 1.058 c
+192.227 0.919 192.223 0.769 192.223 0.603 c
+192.223 -1.263 l
+191.473 -1.263 l
+191.473 1.47 l
+191.473 1.706 l
+191.473 1.926 l
+191.473 2.003 191.467 2.066 191.459 2.117 c
+191.459 2.22 l
+192.136 2.22 l
+192.136 2.132 l
+192.136 1.985 l
+192.142 1.926 192.15 1.867 192.15 1.808 c
+192.15 1.646 l
+192.165 1.646 l
+192.183 1.735 192.213 1.812 192.253 1.881 c
+192.29 1.96 192.333 2.029 192.385 2.087 c
+192.444 2.147 192.51 2.191 192.591 2.22 c
+192.668 2.257 192.757 2.278 192.855 2.278 c
+193.039 2.278 193.179 2.224 193.267 2.117 c
+193.362 2.018 193.432 1.86 193.472 1.646 c
+193.488 1.646 l
+193.524 1.742 193.565 1.831 193.605 1.912 c
+193.653 1.989 193.708 2.051 193.767 2.103 c
+193.825 2.161 193.892 2.205 193.973 2.234 c
+194.05 2.264 194.138 2.278 194.237 2.278 c
+194.373 2.278 194.488 2.253 194.575 2.205 c
+194.663 2.154 194.729 2.08 194.781 1.985 c
+194.84 1.885 194.877 1.757 194.899 1.603 c
+194.928 1.455 194.943 1.272 194.943 1.058 c
+194.943 -1.263 l
+194.222 -1.263 l
+194.222 0.853 l
+194.222 1.019 194.215 1.154 194.208 1.264 c
+194.197 1.372 194.178 1.455 194.149 1.515 c
+194.127 1.58 194.098 1.632 194.06 1.661 c
+194.031 1.691 193.991 1.706 193.943 1.706 c
+193.825 1.706 193.73 1.617 193.664 1.441 c
+193.605 1.272 193.576 1.015 193.576 0.662 c
+193.576 -1.263 l
+h
+198.331 1.455 m
+197.699 1.455 l
+197.567 3.514 l
+198.463 3.514 l
+h
+196.861 1.455 m
+196.229 1.455 l
+196.111 3.514 l
+196.979 3.514 l
+h
+f
+Q
+q 1 0 0 1 64.9298 361.4887 cm
+0 0 m
+0 0.264 -0.073 0.463 -0.22 0.603 c
+-0.36 0.75 -0.617 0.889 -0.999 1.029 c
+-1.374 1.165 -1.66 1.309 -1.866 1.455 c
+-2.065 1.602 -2.212 1.768 -2.308 1.955 c
+-2.406 2.15 -2.454 2.371 -2.454 2.616 c
+-2.454 3.036 -2.315 3.385 -2.028 3.66 c
+-1.745 3.932 -1.378 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.088 3.851 c
+0.154 3.711 0.341 3.516 0.47 3.263 c
+0.607 3.017 0.676 2.749 0.676 2.454 c
+0 2.454 l
+0 2.786 -0.081 3.042 -0.235 3.219 c
+-0.393 3.403 -0.625 3.499 -0.926 3.499 c
+-1.19 3.499 -1.404 3.418 -1.558 3.263 c
+-1.705 3.117 -1.779 2.903 -1.779 2.631 c
+-1.779 2.404 -1.701 2.213 -1.544 2.058 c
+-1.378 1.911 -1.124 1.771 -0.779 1.646 c
+-0.261 1.477 0.11 1.268 0.338 1.014 c
+0.573 0.757 0.691 0.426 0.691 0.015 c
+0.691 -0.426 0.548 -0.779 0.264 -1.043 c
+-0.022 -1.301 -0.405 -1.426 -0.881 -1.426 c
+-1.198 -1.426 -1.484 -1.356 -1.749 -1.22 c
+-2.014 -1.084 -2.227 -0.893 -2.381 -0.646 c
+-2.528 -0.405 -2.601 -0.118 -2.601 0.206 c
+-1.926 0.206 l
+-1.926 -0.129 -1.833 -0.389 -1.646 -0.573 c
+-1.463 -0.76 -1.205 -0.852 -0.881 -0.852 c
+-0.588 -0.852 -0.368 -0.779 -0.22 -0.632 c
+-0.073 -0.478 0 -0.264 0 0 c
+2.896 -1.426 m
+2.396 -1.426 2.014 -1.278 1.749 -0.985 c
+1.484 -0.691 1.353 -0.257 1.353 0.324 c
+1.353 0.794 l
+1.353 1.389 1.477 1.856 1.735 2.19 c
+1.999 2.532 2.359 2.705 2.822 2.705 c
+3.281 2.705 3.624 2.55 3.851 2.249 c
+4.087 1.955 4.208 1.492 4.219 0.867 c
+4.219 0.441 l
+1.999 0.441 l
+1.999 0.353 l
+1.999 -0.081 2.076 -0.393 2.234 -0.588 c
+2.4 -0.775 2.631 -0.867 2.925 -0.867 c
+3.12 -0.867 3.293 -0.834 3.439 -0.764 c
+3.587 -0.687 3.723 -0.569 3.851 -0.411 c
+4.189 -0.823 l
+3.903 -1.228 3.473 -1.426 2.896 -1.426 c
+2.822 2.146 m
+2.547 2.146 2.344 2.051 2.219 1.866 c
+2.091 1.679 2.018 1.389 1.999 1 c
+3.572 1 l
+3.572 1.087 l
+3.55 1.47 3.484 1.738 3.366 1.897 c
+3.248 2.062 3.065 2.146 2.822 2.146 c
+5.85 3.587 m
+5.85 2.631 l
+6.453 2.631 l
+6.453 2.102 l
+5.85 2.102 l
+5.85 -0.368 l
+5.85 -0.525 5.872 -0.643 5.924 -0.721 c
+5.982 -0.801 6.071 -0.838 6.188 -0.838 c
+6.277 -0.838 6.365 -0.823 6.453 -0.794 c
+6.453 -1.352 l
+6.306 -1.4 6.151 -1.426 5.997 -1.426 c
+5.74 -1.426 5.546 -1.334 5.409 -1.147 c
+5.27 -0.962 5.203 -0.702 5.203 -0.368 c
+5.203 2.102 l
+4.601 2.102 l
+4.601 2.631 l
+5.203 2.631 l
+5.203 3.587 l
+h
+9.789 3.587 m
+9.789 2.631 l
+10.392 2.631 l
+10.392 2.102 l
+9.789 2.102 l
+9.789 -0.368 l
+9.789 -0.525 9.812 -0.643 9.864 -0.721 c
+9.922 -0.801 10.01 -0.838 10.128 -0.838 c
+10.215 -0.838 10.304 -0.823 10.392 -0.794 c
+10.392 -1.352 l
+10.246 -1.4 10.091 -1.426 9.937 -1.426 c
+9.679 -1.426 9.485 -1.334 9.349 -1.147 c
+9.209 -0.962 9.143 -0.702 9.143 -0.368 c
+9.143 2.102 l
+8.54 2.102 l
+8.54 2.631 l
+9.143 2.631 l
+9.143 3.587 l
+h
+11.803 2.219 m
+12.057 2.543 12.376 2.705 12.759 2.705 c
+13.465 2.705 13.821 2.234 13.832 1.294 c
+13.832 -1.352 l
+13.185 -1.352 l
+13.185 1.264 l
+13.185 1.577 13.13 1.797 13.024 1.926 c
+12.914 2.051 12.759 2.117 12.553 2.117 c
+12.395 2.117 12.248 2.062 12.112 1.955 c
+11.983 1.845 11.881 1.709 11.803 1.544 c
+11.803 -1.352 l
+11.156 -1.352 l
+11.156 4.293 l
+11.803 4.293 l
+h
+16.214 -1.426 m
+15.713 -1.426 15.331 -1.278 15.067 -0.985 c
+14.803 -0.691 14.67 -0.257 14.67 0.324 c
+14.67 0.794 l
+14.67 1.389 14.795 1.856 15.052 2.19 c
+15.316 2.532 15.676 2.705 16.139 2.705 c
+16.599 2.705 16.941 2.55 17.169 2.249 c
+17.404 1.955 17.525 1.492 17.536 0.867 c
+17.536 0.441 l
+15.316 0.441 l
+15.316 0.353 l
+15.316 -0.081 15.393 -0.393 15.551 -0.588 c
+15.717 -0.775 15.948 -0.867 16.243 -0.867 c
+16.438 -0.867 16.61 -0.834 16.757 -0.764 c
+16.904 -0.687 17.04 -0.569 17.169 -0.411 c
+17.506 -0.823 l
+17.22 -1.228 16.79 -1.426 16.214 -1.426 c
+16.139 2.146 m
+15.864 2.146 15.662 2.051 15.537 1.866 c
+15.408 1.679 15.335 1.389 15.316 1 c
+16.889 1 l
+16.889 1.087 l
+16.867 1.47 16.801 1.738 16.684 1.897 c
+16.565 2.062 16.382 2.146 16.139 2.146 c
+21.461 -1.426 m
+20.961 -1.426 20.579 -1.278 20.314 -0.985 c
+20.05 -0.691 19.917 -0.257 19.917 0.324 c
+19.917 0.794 l
+19.917 1.389 20.042 1.856 20.299 2.19 c
+20.564 2.532 20.924 2.705 21.388 2.705 c
+21.847 2.705 22.188 2.55 22.416 2.249 c
+22.651 1.955 22.772 1.492 22.784 0.867 c
+22.784 0.441 l
+20.564 0.441 l
+20.564 0.353 l
+20.564 -0.081 20.642 -0.393 20.799 -0.588 c
+20.964 -0.775 21.196 -0.867 21.49 -0.867 c
+21.685 -0.867 21.858 -0.834 22.005 -0.764 c
+22.152 -0.687 22.288 -0.569 22.416 -0.411 c
+22.755 -0.823 l
+22.468 -1.228 22.038 -1.426 21.461 -1.426 c
+21.388 2.146 m
+21.112 2.146 20.91 2.051 20.785 1.866 c
+20.656 1.679 20.582 1.389 20.564 1 c
+22.137 1 l
+22.137 1.087 l
+22.115 1.47 22.049 1.738 21.931 1.897 c
+21.814 2.062 21.629 2.146 21.388 2.146 c
+24.768 0.647 -1.514 0.558 re
+26.047 2.631 m
+26.061 2.263 l
+26.304 2.558 26.624 2.705 27.017 2.705 c
+27.458 2.705 27.767 2.506 27.943 2.117 c
+28.197 2.506 28.546 2.705 28.987 2.705 c
+29.722 2.705 30.096 2.242 30.119 1.323 c
+30.119 -1.352 l
+29.471 -1.352 l
+29.471 1.264 l
+29.471 1.558 29.417 1.771 29.31 1.911 c
+29.211 2.047 29.038 2.117 28.795 2.117 c
+28.598 2.117 28.436 2.036 28.311 1.881 c
+28.193 1.735 28.123 1.544 28.105 1.309 c
+28.105 -1.352 l
+27.443 -1.352 l
+27.443 1.294 l
+27.443 1.841 27.223 2.117 26.782 2.117 c
+26.447 2.117 26.212 1.955 26.076 1.631 c
+26.076 -1.352 l
+25.429 -1.352 l
+25.429 2.631 l
+h
+33.132 -1.352 m
+33.091 -1.264 33.066 -1.117 33.059 -0.912 c
+32.823 -1.257 32.529 -1.426 32.176 -1.426 c
+31.813 -1.426 31.53 -1.33 31.324 -1.132 c
+31.125 -0.926 31.03 -0.64 31.03 -0.264 c
+31.03 0.136 31.166 0.455 31.441 0.69 c
+31.713 0.933 32.088 1.058 32.558 1.058 c
+33.043 1.058 l
+33.043 1.484 l
+33.043 1.72 32.989 1.885 32.882 1.984 c
+32.772 2.091 32.61 2.146 32.397 2.146 c
+32.199 2.146 32.037 2.087 31.912 1.97 c
+31.794 1.852 31.736 1.706 31.736 1.529 c
+31.089 1.529 l
+31.089 1.723 31.147 1.914 31.265 2.102 c
+31.39 2.286 31.551 2.433 31.75 2.543 c
+31.956 2.65 32.184 2.705 32.441 2.705 c
+32.841 2.705 33.147 2.602 33.352 2.396 c
+33.566 2.19 33.679 1.897 33.691 1.514 c
+33.691 -0.5 l
+33.691 -0.804 33.727 -1.07 33.808 -1.294 c
+33.808 -1.352 l
+h
+32.265 -0.838 m
+32.43 -0.838 32.581 -0.794 32.72 -0.706 c
+32.868 -0.617 32.974 -0.507 33.043 -0.368 c
+33.043 0.573 l
+32.677 0.573 l
+32.36 0.573 32.118 0.503 31.941 0.368 c
+31.765 0.239 31.677 0.052 31.677 -0.191 c
+31.677 -0.419 31.721 -0.584 31.809 -0.691 c
+31.897 -0.79 32.048 -0.838 32.265 -0.838 c
+35.395 -1.352 -0.646 3.983 re
+35.44 3.674 m
+35.44 3.564 35.41 3.473 35.351 3.395 c
+35.293 3.326 35.197 3.293 35.072 3.293 c
+34.954 3.293 34.859 3.326 34.793 3.395 c
+34.734 3.473 34.705 3.564 34.705 3.674 c
+34.705 3.792 34.734 3.884 34.793 3.954 c
+34.859 4.031 34.954 4.072 35.072 4.072 c
+35.197 4.072 35.293 4.031 35.351 3.954 c
+35.41 3.873 35.44 3.782 35.44 3.674 c
+37.115 -1.352 -0.646 5.644 re
+41.892 -1.352 m
+41.852 -1.264 41.826 -1.117 41.819 -0.912 c
+41.583 -1.257 41.29 -1.426 40.937 -1.426 c
+40.573 -1.426 40.29 -1.33 40.084 -1.132 c
+39.886 -0.926 39.79 -0.64 39.79 -0.264 c
+39.79 0.136 39.927 0.455 40.202 0.69 c
+40.474 0.933 40.849 1.058 41.319 1.058 c
+41.805 1.058 l
+41.805 1.484 l
+41.805 1.72 41.749 1.885 41.643 1.984 c
+41.533 2.091 41.371 2.146 41.157 2.146 c
+40.959 2.146 40.797 2.087 40.673 1.97 c
+40.554 1.852 40.496 1.706 40.496 1.529 c
+39.849 1.529 l
+39.849 1.723 39.908 1.914 40.026 2.102 c
+40.151 2.286 40.313 2.433 40.511 2.543 c
+40.716 2.65 40.945 2.705 41.202 2.705 c
+41.602 2.705 41.907 2.602 42.113 2.396 c
+42.326 2.19 42.44 1.897 42.451 1.514 c
+42.451 -0.5 l
+42.451 -0.804 42.488 -1.07 42.568 -1.294 c
+42.568 -1.352 l
+h
+41.025 -0.838 m
+41.19 -0.838 41.341 -0.794 41.481 -0.706 c
+41.628 -0.617 41.734 -0.507 41.805 -0.368 c
+41.805 0.573 l
+41.437 0.573 l
+41.121 0.573 40.878 0.503 40.702 0.368 c
+40.525 0.239 40.438 0.052 40.438 -0.191 c
+40.438 -0.419 40.481 -0.584 40.569 -0.691 c
+40.658 -0.79 40.808 -0.838 41.025 -0.838 c
+43.318 0.823 m
+43.318 1.43 43.428 1.897 43.656 2.219 c
+43.891 2.543 44.219 2.705 44.641 2.705 c
+45.023 2.705 45.321 2.547 45.537 2.234 c
+45.537 4.293 l
+46.185 4.293 l
+46.185 -1.352 l
+45.597 -1.352 l
+45.552 -0.926 l
+45.346 -1.261 45.042 -1.426 44.641 -1.426 c
+44.23 -1.426 43.906 -1.271 43.671 -0.956 c
+43.436 -0.632 43.318 -0.176 43.318 0.412 c
+h
+43.965 0.441 m
+43.965 0 44.028 -0.33 44.156 -0.544 c
+44.292 -0.75 44.513 -0.852 44.818 -0.852 c
+45.141 -0.852 45.379 -0.691 45.537 -0.368 c
+45.537 1.646 l
+45.369 1.959 45.13 2.117 44.818 2.117 c
+44.513 2.117 44.292 2.014 44.156 1.808 c
+44.028 1.602 43.965 1.278 43.965 0.838 c
+h
+47.052 0.823 m
+47.052 1.43 47.162 1.897 47.39 2.219 c
+47.625 2.543 47.952 2.705 48.375 2.705 c
+48.757 2.705 49.055 2.547 49.271 2.234 c
+49.271 4.293 l
+49.918 4.293 l
+49.918 -1.352 l
+49.33 -1.352 l
+49.286 -0.926 l
+49.08 -1.261 48.775 -1.426 48.375 -1.426 c
+47.964 -1.426 47.64 -1.271 47.405 -0.956 c
+47.17 -0.632 47.052 -0.176 47.052 0.412 c
+h
+47.698 0.441 m
+47.698 0 47.761 -0.33 47.889 -0.544 c
+48.026 -0.75 48.246 -0.852 48.551 -0.852 c
+48.874 -0.852 49.113 -0.691 49.271 -0.368 c
+49.271 1.646 l
+49.102 1.959 48.864 2.117 48.551 2.117 c
+48.246 2.117 48.026 2.014 47.889 1.808 c
+47.761 1.602 47.698 1.278 47.698 0.838 c
+h
+52.564 2.014 m
+52.475 2.032 52.377 2.043 52.27 2.043 c
+51.935 2.043 51.7 1.86 51.565 1.5 c
+51.565 -1.352 l
+50.918 -1.352 l
+50.918 2.631 l
+51.55 2.631 l
+51.565 2.219 l
+51.741 2.543 51.983 2.705 52.299 2.705 c
+52.406 2.705 52.494 2.683 52.564 2.646 c
+h
+54.563 -1.426 m
+54.063 -1.426 53.681 -1.278 53.416 -0.985 c
+53.152 -0.691 53.019 -0.257 53.019 0.324 c
+53.019 0.794 l
+53.019 1.389 53.144 1.856 53.402 2.19 c
+53.666 2.532 54.027 2.705 54.49 2.705 c
+54.949 2.705 55.291 2.55 55.519 2.249 c
+55.754 1.955 55.875 1.492 55.886 0.867 c
+55.886 0.441 l
+53.666 0.441 l
+53.666 0.353 l
+53.666 -0.081 53.743 -0.393 53.902 -0.588 c
+54.067 -0.775 54.299 -0.867 54.592 -0.867 c
+54.787 -0.867 54.96 -0.834 55.107 -0.764 c
+55.254 -0.687 55.39 -0.569 55.519 -0.411 c
+55.856 -0.823 l
+55.569 -1.228 55.14 -1.426 54.563 -1.426 c
+54.49 2.146 m
+54.214 2.146 54.012 2.051 53.886 1.866 c
+53.759 1.679 53.685 1.389 53.666 1 c
+55.239 1 l
+55.239 1.087 l
+55.217 1.47 55.151 1.738 55.033 1.897 c
+54.916 2.062 54.732 2.146 54.49 2.146 c
+58.605 -0.338 m
+58.605 -0.191 58.55 -0.07 58.443 0.029 c
+58.333 0.125 58.127 0.243 57.826 0.382 c
+57.481 0.53 57.238 0.651 57.092 0.75 c
+56.944 0.856 56.834 0.974 56.768 1.103 c
+56.698 1.228 56.665 1.386 56.665 1.573 c
+56.665 1.897 56.782 2.165 57.017 2.381 c
+57.252 2.595 57.554 2.705 57.929 2.705 c
+58.312 2.705 58.62 2.591 58.855 2.367 c
+59.091 2.139 59.208 1.852 59.208 1.5 c
+58.561 1.5 l
+58.561 1.675 58.503 1.827 58.385 1.955 c
+58.268 2.08 58.113 2.146 57.929 2.146 c
+57.73 2.146 57.58 2.091 57.474 1.984 c
+57.363 1.885 57.312 1.753 57.312 1.588 c
+57.312 1.459 57.348 1.353 57.429 1.264 c
+57.506 1.183 57.697 1.081 58.002 0.956 c
+58.48 0.769 58.811 0.58 58.987 0.397 c
+59.164 0.22 59.252 -0.008 59.252 -0.279 c
+59.252 -0.632 59.127 -0.912 58.885 -1.117 c
+58.649 -1.323 58.333 -1.426 57.944 -1.426 c
+57.522 -1.426 57.183 -1.309 56.93 -1.073 c
+56.672 -0.831 56.547 -0.525 56.547 -0.162 c
+57.194 -0.162 l
+57.202 -0.389 57.271 -0.565 57.4 -0.691 c
+57.525 -0.808 57.709 -0.867 57.944 -0.867 c
+58.157 -0.867 58.318 -0.819 58.428 -0.721 c
+58.547 -0.625 58.605 -0.496 58.605 -0.338 c
+62.03 -0.338 m
+62.03 -0.191 61.975 -0.07 61.869 0.029 c
+61.759 0.125 61.553 0.243 61.251 0.382 c
+60.905 0.53 60.664 0.651 60.516 0.75 c
+60.369 0.856 60.259 0.974 60.193 1.103 c
+60.123 1.228 60.09 1.386 60.09 1.573 c
+60.09 1.897 60.207 2.165 60.443 2.381 c
+60.678 2.595 60.979 2.705 61.354 2.705 c
+61.736 2.705 62.045 2.591 62.28 2.367 c
+62.515 2.139 62.633 1.852 62.633 1.5 c
+61.986 1.5 l
+61.986 1.675 61.927 1.827 61.809 1.955 c
+61.692 2.08 61.538 2.146 61.354 2.146 c
+61.156 2.146 61.005 2.091 60.899 1.984 c
+60.788 1.885 60.737 1.753 60.737 1.588 c
+60.737 1.459 60.774 1.353 60.855 1.264 c
+60.932 1.183 61.123 1.081 61.427 0.956 c
+61.905 0.769 62.236 0.58 62.412 0.397 c
+62.588 0.22 62.677 -0.008 62.677 -0.279 c
+62.677 -0.632 62.552 -0.912 62.31 -1.117 c
+62.075 -1.323 61.759 -1.426 61.369 -1.426 c
+60.946 -1.426 60.608 -1.309 60.354 -1.073 c
+60.097 -0.831 59.972 -0.525 59.972 -0.162 c
+60.619 -0.162 l
+60.626 -0.389 60.697 -0.565 60.824 -0.691 c
+60.95 -0.808 61.134 -0.867 61.369 -0.867 c
+61.582 -0.867 61.744 -0.819 61.854 -0.721 c
+61.971 -0.625 62.03 -0.496 62.03 -0.338 c
+66.087 3.587 m
+66.087 2.631 l
+66.69 2.631 l
+66.69 2.102 l
+66.087 2.102 l
+66.087 -0.368 l
+66.087 -0.525 66.11 -0.643 66.16 -0.721 c
+66.22 -0.801 66.308 -0.838 66.425 -0.838 c
+66.513 -0.838 66.602 -0.823 66.69 -0.794 c
+66.69 -1.352 l
+66.543 -1.4 66.388 -1.426 66.234 -1.426 c
+65.977 -1.426 65.782 -1.334 65.646 -1.147 c
+65.507 -0.962 65.441 -0.702 65.441 -0.368 c
+65.441 2.102 l
+64.838 2.102 l
+64.838 2.631 l
+65.441 2.631 l
+65.441 3.587 l
+h
+68.101 2.219 m
+68.354 2.543 68.674 2.705 69.056 2.705 c
+69.761 2.705 70.118 2.234 70.129 1.294 c
+70.129 -1.352 l
+69.482 -1.352 l
+69.482 1.264 l
+69.482 1.577 69.428 1.797 69.321 1.926 c
+69.21 2.051 69.056 2.117 68.851 2.117 c
+68.693 2.117 68.545 2.062 68.41 1.955 c
+68.281 1.845 68.178 1.709 68.101 1.544 c
+68.101 -1.352 l
+67.454 -1.352 l
+67.454 4.293 l
+68.101 4.293 l
+h
+73.128 -1.352 m
+73.088 -1.264 73.062 -1.117 73.054 -0.912 c
+72.819 -1.257 72.525 -1.426 72.173 -1.426 c
+71.809 -1.426 71.525 -1.33 71.32 -1.132 c
+71.122 -0.926 71.026 -0.64 71.026 -0.264 c
+71.026 0.136 71.162 0.455 71.438 0.69 c
+71.71 0.933 72.084 1.058 72.555 1.058 c
+73.04 1.058 l
+73.04 1.484 l
+73.04 1.72 72.984 1.885 72.878 1.984 c
+72.768 2.091 72.606 2.146 72.393 2.146 c
+72.194 2.146 72.032 2.087 71.908 1.97 c
+71.791 1.852 71.731 1.706 71.731 1.529 c
+71.085 1.529 l
+71.085 1.723 71.143 1.914 71.261 2.102 c
+71.386 2.286 71.548 2.433 71.746 2.543 c
+71.952 2.65 72.18 2.705 72.437 2.705 c
+72.838 2.705 73.142 2.602 73.349 2.396 c
+73.561 2.19 73.676 1.897 73.686 1.514 c
+73.686 -0.5 l
+73.686 -0.804 73.723 -1.07 73.804 -1.294 c
+73.804 -1.352 l
+h
+72.261 -0.838 m
+72.426 -0.838 72.577 -0.794 72.716 -0.706 c
+72.863 -0.617 72.97 -0.507 73.04 -0.368 c
+73.04 0.573 l
+72.672 0.573 l
+72.356 0.573 72.113 0.503 71.937 0.368 c
+71.761 0.239 71.673 0.052 71.673 -0.191 c
+71.673 -0.419 71.717 -0.584 71.805 -0.691 c
+71.893 -0.79 72.044 -0.838 72.261 -0.838 c
+75.539 3.587 m
+75.539 2.631 l
+76.142 2.631 l
+76.142 2.102 l
+75.539 2.102 l
+75.539 -0.368 l
+75.539 -0.525 75.56 -0.643 75.612 -0.721 c
+75.671 -0.801 75.759 -0.838 75.876 -0.838 c
+75.965 -0.838 76.053 -0.823 76.142 -0.794 c
+76.142 -1.352 l
+75.994 -1.4 75.84 -1.426 75.685 -1.426 c
+75.428 -1.426 75.234 -1.334 75.097 -1.147 c
+74.958 -0.962 74.891 -0.702 74.891 -0.368 c
+74.891 2.102 l
+74.289 2.102 l
+74.289 2.631 l
+74.891 2.631 l
+74.891 3.587 l
+h
+81.595 -0.206 m
+82.197 2.631 l
+82.844 2.631 l
+81.859 -1.352 l
+81.345 -1.352 l
+80.566 1.5 l
+79.816 -1.352 l
+79.286 -1.352 l
+78.332 2.631 l
+78.964 2.631 l
+79.581 -0.133 l
+80.316 2.631 l
+80.83 2.631 l
+h
+84.225 -1.352 -0.646 3.983 re
+84.27 3.674 m
+84.27 3.564 84.24 3.473 84.182 3.395 c
+84.123 3.326 84.027 3.293 83.903 3.293 c
+83.785 3.293 83.689 3.326 83.623 3.395 c
+83.564 3.473 83.535 3.564 83.535 3.674 c
+83.535 3.792 83.564 3.884 83.623 3.954 c
+83.689 4.031 83.785 4.072 83.903 4.072 c
+84.027 4.072 84.123 4.031 84.182 3.954 c
+84.24 3.873 84.27 3.782 84.27 3.674 c
+85.945 -1.352 -0.646 5.644 re
+87.666 -1.352 -0.647 5.644 re
+93.28 0.441 m
+93.28 -0.176 93.166 -0.643 92.942 -0.956 c
+92.726 -1.271 92.402 -1.426 91.972 -1.426 c
+91.55 -1.426 91.238 -1.246 91.032 -0.881 c
+91.002 -1.352 l
+90.399 -1.352 l
+90.399 4.293 l
+91.046 4.293 l
+91.046 2.19 l
+91.259 2.532 91.568 2.705 91.972 2.705 c
+92.402 2.705 92.726 2.547 92.942 2.234 c
+93.166 1.929 93.28 1.463 93.28 0.838 c
+h
+92.634 0.823 m
+92.634 1.294 92.564 1.625 92.428 1.823 c
+92.299 2.018 92.09 2.117 91.795 2.117 c
+91.462 2.117 91.211 1.933 91.046 1.573 c
+91.046 -0.309 l
+91.211 -0.673 91.465 -0.852 91.811 -0.852 c
+92.104 -0.852 92.314 -0.75 92.443 -0.544 c
+92.568 -0.338 92.634 -0.022 92.634 0.412 c
+h
+95.544 -1.426 m
+95.044 -1.426 94.662 -1.278 94.398 -0.985 c
+94.133 -0.691 94.001 -0.257 94.001 0.324 c
+94.001 0.794 l
+94.001 1.389 94.126 1.856 94.383 2.19 c
+94.647 2.532 95.007 2.705 95.471 2.705 c
+95.93 2.705 96.271 2.55 96.499 2.249 c
+96.734 1.955 96.856 1.492 96.867 0.867 c
+96.867 0.441 l
+94.647 0.441 l
+94.647 0.353 l
+94.647 -0.081 94.725 -0.393 94.882 -0.588 c
+95.048 -0.775 95.279 -0.867 95.573 -0.867 c
+95.768 -0.867 95.941 -0.834 96.088 -0.764 c
+96.235 -0.687 96.371 -0.569 96.499 -0.411 c
+96.838 -0.823 l
+96.551 -1.228 96.121 -1.426 95.544 -1.426 c
+95.471 2.146 m
+95.195 2.146 94.993 2.051 94.868 1.866 c
+94.739 1.679 94.666 1.389 94.647 1 c
+96.22 1 l
+96.22 1.087 l
+96.198 1.47 96.132 1.738 96.015 1.897 c
+95.897 2.062 95.713 2.146 95.471 2.146 c
+101.409 -1.352 m
+101.368 -1.264 101.343 -1.117 101.335 -0.912 c
+101.1 -1.257 100.806 -1.426 100.453 -1.426 c
+100.09 -1.426 99.807 -1.33 99.601 -1.132 c
+99.402 -0.926 99.307 -0.64 99.307 -0.264 c
+99.307 0.136 99.443 0.455 99.718 0.69 c
+99.99 0.933 100.366 1.058 100.836 1.058 c
+101.32 1.058 l
+101.32 1.484 l
+101.32 1.72 101.266 1.885 101.159 1.984 c
+101.049 2.091 100.887 2.146 100.674 2.146 c
+100.476 2.146 100.314 2.087 100.189 1.97 c
+100.071 1.852 100.013 1.706 100.013 1.529 c
+99.366 1.529 l
+99.366 1.723 99.425 1.914 99.542 2.102 c
+99.667 2.286 99.828 2.433 100.027 2.543 c
+100.233 2.65 100.461 2.705 100.718 2.705 c
+101.118 2.705 101.424 2.602 101.629 2.396 c
+101.843 2.19 101.956 1.897 101.968 1.514 c
+101.968 -0.5 l
+101.968 -0.804 102.004 -1.07 102.085 -1.294 c
+102.085 -1.352 l
+h
+100.542 -0.838 m
+100.707 -0.838 100.858 -0.794 100.997 -0.706 c
+101.145 -0.617 101.251 -0.507 101.32 -0.368 c
+101.32 0.573 l
+100.954 0.573 l
+100.637 0.573 100.395 0.503 100.218 0.368 c
+100.042 0.239 99.954 0.052 99.954 -0.191 c
+99.954 -0.419 99.998 -0.584 100.086 -0.691 c
+100.175 -0.79 100.325 -0.838 100.542 -0.838 c
+103.819 3.587 m
+103.819 2.631 l
+104.422 2.631 l
+104.422 2.102 l
+103.819 2.102 l
+103.819 -0.368 l
+103.819 -0.525 103.842 -0.643 103.893 -0.721 c
+103.952 -0.801 104.04 -0.838 104.158 -0.838 c
+104.246 -0.838 104.334 -0.823 104.422 -0.794 c
+104.422 -1.352 l
+104.275 -1.4 104.121 -1.426 103.967 -1.426 c
+103.709 -1.426 103.514 -1.334 103.379 -1.147 c
+103.239 -0.962 103.173 -0.702 103.173 -0.368 c
+103.173 2.102 l
+102.57 2.102 l
+102.57 2.631 l
+103.173 2.631 l
+103.173 3.587 l
+h
+106.039 3.587 m
+106.039 2.631 l
+106.641 2.631 l
+106.641 2.102 l
+106.039 2.102 l
+106.039 -0.368 l
+106.039 -0.525 106.061 -0.643 106.113 -0.721 c
+106.171 -0.801 106.259 -0.838 106.377 -0.838 c
+106.465 -0.838 106.554 -0.823 106.641 -0.794 c
+106.641 -1.352 l
+106.495 -1.4 106.34 -1.426 106.186 -1.426 c
+105.929 -1.426 105.734 -1.334 105.598 -1.147 c
+105.459 -0.962 105.392 -0.702 105.392 -0.368 c
+105.392 2.102 l
+104.79 2.102 l
+104.79 2.631 l
+105.392 2.631 l
+105.392 3.587 l
+h
+109.449 -1.352 m
+109.409 -1.264 109.384 -1.117 109.376 -0.912 c
+109.141 -1.257 108.846 -1.426 108.494 -1.426 c
+108.13 -1.426 107.847 -1.33 107.641 -1.132 c
+107.443 -0.926 107.347 -0.64 107.347 -0.264 c
+107.347 0.136 107.483 0.455 107.759 0.69 c
+108.031 0.933 108.406 1.058 108.876 1.058 c
+109.361 1.058 l
+109.361 1.484 l
+109.361 1.72 109.306 1.885 109.199 1.984 c
+109.089 2.091 108.927 2.146 108.715 2.146 c
+108.516 2.146 108.354 2.087 108.229 1.97 c
+108.112 1.852 108.052 1.706 108.052 1.529 c
+107.406 1.529 l
+107.406 1.723 107.465 1.914 107.582 2.102 c
+107.707 2.286 107.869 2.433 108.067 2.543 c
+108.273 2.65 108.501 2.705 108.758 2.705 c
+109.159 2.705 109.463 2.602 109.67 2.396 c
+109.883 2.19 109.997 1.897 110.008 1.514 c
+110.008 -0.5 l
+110.008 -0.804 110.045 -1.07 110.126 -1.294 c
+110.126 -1.352 l
+h
+108.582 -0.838 m
+108.748 -0.838 108.898 -0.794 109.037 -0.706 c
+109.185 -0.617 109.291 -0.507 109.361 -0.368 c
+109.361 0.573 l
+108.993 0.573 l
+108.678 0.573 108.435 0.503 108.258 0.368 c
+108.082 0.239 107.994 0.052 107.994 -0.191 c
+107.994 -0.419 108.038 -0.584 108.127 -0.691 c
+108.214 -0.79 108.366 -0.838 108.582 -0.838 c
+112.389 -0.867 m
+112.602 -0.867 112.775 -0.804 112.904 -0.676 c
+113.039 -0.54 113.113 -0.349 113.124 -0.103 c
+113.741 -0.103 l
+113.719 -0.485 113.583 -0.804 113.33 -1.058 c
+113.072 -1.305 112.76 -1.426 112.389 -1.426 c
+111.896 -1.426 111.522 -1.275 111.257 -0.97 c
+111 -0.658 110.875 -0.191 110.875 0.426 c
+110.875 0.867 l
+110.875 1.463 111 1.918 111.257 2.234 c
+111.522 2.547 111.896 2.705 112.389 2.705 c
+112.79 2.705 113.11 2.572 113.345 2.308 c
+113.587 2.051 113.719 1.706 113.741 1.264 c
+113.124 1.264 l
+113.102 1.558 113.029 1.779 112.904 1.926 c
+112.786 2.072 112.613 2.146 112.389 2.146 c
+112.095 2.146 111.878 2.047 111.742 1.852 c
+111.603 1.665 111.529 1.357 111.522 0.926 c
+111.522 0.412 l
+111.522 -0.058 111.588 -0.393 111.728 -0.588 c
+111.875 -0.775 112.095 -0.867 112.389 -0.867 c
+115.138 2.219 m
+115.391 2.543 115.711 2.705 116.093 2.705 c
+116.798 2.705 117.155 2.234 117.166 1.294 c
+117.166 -1.352 l
+116.519 -1.352 l
+116.519 1.264 l
+116.519 1.577 116.464 1.797 116.358 1.926 c
+116.247 2.051 116.093 2.117 115.888 2.117 c
+115.73 2.117 115.582 2.062 115.447 1.955 c
+115.318 1.845 115.215 1.709 115.138 1.544 c
+115.138 -1.352 l
+114.491 -1.352 l
+114.491 4.293 l
+115.138 4.293 l
+h
+119.547 -1.426 m
+119.048 -1.426 118.666 -1.278 118.401 -0.985 c
+118.136 -0.691 118.004 -0.257 118.004 0.324 c
+118.004 0.794 l
+118.004 1.389 118.129 1.856 118.386 2.19 c
+118.651 2.532 119.011 2.705 119.474 2.705 c
+119.933 2.705 120.275 2.55 120.503 2.249 c
+120.738 1.955 120.86 1.492 120.871 0.867 c
+120.871 0.441 l
+118.651 0.441 l
+118.651 0.353 l
+118.651 -0.081 118.728 -0.393 118.886 -0.588 c
+119.051 -0.775 119.283 -0.867 119.576 -0.867 c
+119.772 -0.867 119.944 -0.834 120.091 -0.764 c
+120.239 -0.687 120.374 -0.569 120.503 -0.411 c
+120.841 -0.823 l
+120.555 -1.228 120.125 -1.426 119.547 -1.426 c
+119.474 2.146 m
+119.198 2.146 118.996 2.051 118.871 1.866 c
+118.743 1.679 118.67 1.389 118.651 1 c
+120.224 1 l
+120.224 1.087 l
+120.202 1.47 120.135 1.738 120.018 1.897 c
+119.9 2.062 119.717 2.146 119.474 2.146 c
+121.517 0.823 m
+121.517 1.43 121.627 1.897 121.855 2.219 c
+122.09 2.543 122.417 2.705 122.84 2.705 c
+123.223 2.705 123.52 2.547 123.736 2.234 c
+123.736 4.293 l
+124.384 4.293 l
+124.384 -1.352 l
+123.796 -1.352 l
+123.751 -0.926 l
+123.545 -1.261 123.241 -1.426 122.84 -1.426 c
+122.429 -1.426 122.105 -1.271 121.87 -0.956 c
+121.635 -0.632 121.517 -0.176 121.517 0.412 c
+h
+122.163 0.441 m
+122.163 0 122.227 -0.33 122.355 -0.544 c
+122.491 -0.75 122.712 -0.852 123.017 -0.852 c
+123.339 -0.852 123.578 -0.691 123.736 -0.368 c
+123.736 1.646 l
+123.568 1.959 123.329 2.117 123.017 2.117 c
+122.712 2.117 122.491 2.014 122.355 1.808 c
+122.227 1.602 122.163 1.278 122.163 0.838 c
+h
+127.956 3.587 m
+127.956 2.631 l
+128.558 2.631 l
+128.558 2.102 l
+127.956 2.102 l
+127.956 -0.368 l
+127.956 -0.525 127.977 -0.643 128.029 -0.721 c
+128.087 -0.801 128.176 -0.838 128.293 -0.838 c
+128.382 -0.838 128.47 -0.823 128.558 -0.794 c
+128.558 -1.352 l
+128.411 -1.4 128.257 -1.426 128.102 -1.426 c
+127.846 -1.426 127.651 -1.334 127.514 -1.147 c
+127.375 -0.962 127.308 -0.702 127.308 -0.368 c
+127.308 2.102 l
+126.706 2.102 l
+126.706 2.631 l
+127.308 2.631 l
+127.308 3.587 l
+h
+129.116 0.823 m
+129.116 1.4 129.253 1.856 129.529 2.19 c
+129.811 2.532 130.182 2.705 130.645 2.705 c
+131.104 2.705 131.472 2.535 131.748 2.205 c
+132.031 1.881 132.178 1.434 132.189 0.867 c
+132.189 0.441 l
+132.189 -0.129 132.045 -0.584 131.763 -0.926 c
+131.487 -1.261 131.119 -1.426 130.66 -1.426 c
+130.197 -1.426 129.826 -1.264 129.543 -0.941 c
+129.267 -0.61 129.124 -0.169 129.116 0.382 c
+h
+129.764 0.441 m
+129.764 0.037 129.841 -0.279 129.999 -0.515 c
+130.164 -0.75 130.385 -0.867 130.66 -0.867 c
+131.226 -0.867 131.52 -0.455 131.542 0.368 c
+131.542 0.823 l
+131.542 1.224 131.457 1.544 131.292 1.779 c
+131.134 2.022 130.917 2.146 130.645 2.146 c
+130.381 2.146 130.164 2.022 129.999 1.779 c
+129.841 1.544 129.764 1.224 129.764 0.823 c
+h
+135.834 -0.264 m
+136.554 2.631 l
+137.245 2.631 l
+135.952 -1.911 l
+135.852 -2.252 135.709 -2.514 135.526 -2.69 c
+135.349 -2.866 135.147 -2.955 134.923 -2.955 c
+134.834 -2.955 134.72 -2.932 134.585 -2.896 c
+134.585 -2.352 l
+134.732 -2.367 l
+134.915 -2.367 135.062 -2.323 135.173 -2.234 c
+135.279 -2.146 135.368 -1.988 135.437 -1.764 c
+135.555 -1.323 l
+134.393 2.631 l
+135.099 2.631 l
+h
+137.686 0.823 m
+137.686 1.4 137.822 1.856 138.098 2.19 c
+138.381 2.532 138.752 2.705 139.215 2.705 c
+139.674 2.705 140.041 2.535 140.317 2.205 c
+140.6 1.881 140.747 1.434 140.758 0.867 c
+140.758 0.441 l
+140.758 -0.129 140.615 -0.584 140.332 -0.926 c
+140.056 -1.261 139.689 -1.426 139.229 -1.426 c
+138.767 -1.426 138.395 -1.264 138.113 -0.941 c
+137.837 -0.61 137.693 -0.169 137.686 0.382 c
+h
+138.333 0.441 m
+138.333 0.037 138.41 -0.279 138.568 -0.515 c
+138.734 -0.75 138.954 -0.867 139.229 -0.867 c
+139.796 -0.867 140.089 -0.455 140.112 0.368 c
+140.112 0.823 l
+140.112 1.224 140.027 1.544 139.862 1.779 c
+139.704 2.022 139.487 2.146 139.215 2.146 c
+138.95 2.146 138.734 2.022 138.568 1.779 c
+138.41 1.544 138.333 1.224 138.333 0.823 c
+h
+143.625 -0.999 m
+143.408 -1.286 143.095 -1.426 142.684 -1.426 c
+142.32 -1.426 142.044 -1.305 141.861 -1.058 c
+141.684 -0.804 141.589 -0.441 141.581 0.029 c
+141.581 2.631 l
+142.229 2.631 l
+142.229 0.088 l
+142.229 -0.54 142.412 -0.852 142.786 -0.852 c
+143.187 -0.852 143.463 -0.676 143.609 -0.324 c
+143.609 2.631 l
+144.257 2.631 l
+144.257 -1.352 l
+143.64 -1.352 l
+h
+146.888 2.014 m
+146.8 2.032 146.701 2.043 146.594 2.043 c
+146.26 2.043 146.024 1.86 145.888 1.5 c
+145.888 -1.352 l
+145.242 -1.352 l
+145.242 2.631 l
+145.874 2.631 l
+145.888 2.219 l
+146.065 2.543 146.308 2.705 146.623 2.705 c
+146.73 2.705 146.818 2.683 146.888 2.646 c
+h
+150.636 -0.867 m
+150.849 -0.867 151.022 -0.804 151.15 -0.676 c
+151.287 -0.54 151.36 -0.349 151.371 -0.103 c
+151.989 -0.103 l
+151.966 -0.485 151.831 -0.804 151.577 -1.058 c
+151.32 -1.305 151.007 -1.426 150.636 -1.426 c
+150.144 -1.426 149.769 -1.275 149.504 -0.97 c
+149.247 -0.658 149.122 -0.191 149.122 0.426 c
+149.122 0.867 l
+149.122 1.463 149.247 1.918 149.504 2.234 c
+149.769 2.547 150.144 2.705 150.636 2.705 c
+151.037 2.705 151.356 2.572 151.592 2.308 c
+151.834 2.051 151.966 1.706 151.989 1.264 c
+151.371 1.264 l
+151.349 1.558 151.276 1.779 151.15 1.926 c
+151.033 2.072 150.86 2.146 150.636 2.146 c
+150.342 2.146 150.125 2.047 149.99 1.852 c
+149.849 1.665 149.776 1.357 149.769 0.926 c
+149.769 0.412 l
+149.769 -0.058 149.835 -0.393 149.975 -0.588 c
+150.121 -0.775 150.342 -0.867 150.636 -0.867 c
+152.606 0.823 m
+152.606 1.4 152.741 1.856 153.017 2.19 c
+153.3 2.532 153.672 2.705 154.134 2.705 c
+154.594 2.705 154.961 2.535 155.237 2.205 c
+155.52 1.881 155.667 1.434 155.678 0.867 c
+155.678 0.441 l
+155.678 -0.129 155.534 -0.584 155.251 -0.926 c
+154.976 -1.261 154.609 -1.426 154.149 -1.426 c
+153.686 -1.426 153.315 -1.264 153.032 -0.941 c
+152.756 -0.61 152.613 -0.169 152.606 0.382 c
+h
+153.252 0.441 m
+153.252 0.037 153.329 -0.279 153.487 -0.515 c
+153.653 -0.75 153.874 -0.867 154.149 -0.867 c
+154.715 -0.867 155.009 -0.455 155.031 0.368 c
+155.031 0.823 l
+155.031 1.224 154.946 1.544 154.781 1.779 c
+154.623 2.022 154.406 2.146 154.134 2.146 c
+153.87 2.146 153.653 2.022 153.487 1.779 c
+153.329 1.544 153.252 1.224 153.252 0.823 c
+h
+157.133 2.631 m
+157.148 2.263 l
+157.39 2.558 157.71 2.705 158.103 2.705 c
+158.544 2.705 158.852 2.506 159.029 2.117 c
+159.283 2.506 159.632 2.705 160.072 2.705 c
+160.808 2.705 161.183 2.242 161.204 1.323 c
+161.204 -1.352 l
+160.558 -1.352 l
+160.558 1.264 l
+160.558 1.558 160.502 1.771 160.396 1.911 c
+160.297 2.047 160.124 2.117 159.881 2.117 c
+159.683 2.117 159.521 2.036 159.397 1.881 c
+159.279 1.735 159.209 1.544 159.191 1.309 c
+159.191 -1.352 l
+158.53 -1.352 l
+158.53 1.294 l
+158.53 1.841 158.309 2.117 157.868 2.117 c
+157.533 2.117 157.298 1.955 157.163 1.631 c
+157.163 -1.352 l
+156.516 -1.352 l
+156.516 2.631 l
+h
+162.792 2.631 m
+162.807 2.263 l
+163.049 2.558 163.369 2.705 163.762 2.705 c
+164.203 2.705 164.512 2.506 164.689 2.117 c
+164.942 2.506 165.291 2.705 165.732 2.705 c
+166.467 2.705 166.842 2.242 166.864 1.323 c
+166.864 -1.352 l
+166.217 -1.352 l
+166.217 1.264 l
+166.217 1.558 166.162 1.771 166.056 1.911 c
+165.956 2.047 165.784 2.117 165.541 2.117 c
+165.342 2.117 165.181 2.036 165.056 1.881 c
+164.938 1.735 164.868 1.544 164.85 1.309 c
+164.85 -1.352 l
+164.188 -1.352 l
+164.188 1.294 l
+164.188 1.841 163.968 2.117 163.527 2.117 c
+163.193 2.117 162.958 1.955 162.821 1.631 c
+162.821 -1.352 l
+162.175 -1.352 l
+162.175 2.631 l
+h
+168.539 -1.352 -0.646 3.983 re
+168.583 3.674 m
+168.583 3.564 168.554 3.473 168.495 3.395 c
+168.437 3.326 168.341 3.293 168.216 3.293 c
+168.099 3.293 168.003 3.326 167.937 3.395 c
+167.878 3.473 167.849 3.564 167.849 3.674 c
+167.849 3.792 167.878 3.884 167.937 3.954 c
+168.003 4.031 168.099 4.072 168.216 4.072 c
+168.341 4.072 168.437 4.031 168.495 3.954 c
+168.554 3.873 168.583 3.782 168.583 3.674 c
+170.406 3.587 m
+170.406 2.631 l
+171.009 2.631 l
+171.009 2.102 l
+170.406 2.102 l
+170.406 -0.368 l
+170.406 -0.525 170.428 -0.643 170.48 -0.721 c
+170.538 -0.801 170.627 -0.838 170.744 -0.838 c
+170.833 -0.838 170.921 -0.823 171.009 -0.794 c
+171.009 -1.352 l
+170.862 -1.4 170.708 -1.426 170.553 -1.426 c
+170.296 -1.426 170.102 -1.334 169.965 -1.147 c
+169.826 -0.962 169.759 -0.702 169.759 -0.368 c
+169.759 2.102 l
+169.157 2.102 l
+169.157 2.631 l
+169.759 2.631 l
+169.759 3.587 l
+h
+173.713 -0.338 m
+173.713 -0.191 173.659 -0.07 173.552 0.029 c
+173.441 0.125 173.236 0.243 172.934 0.382 c
+172.589 0.53 172.346 0.651 172.2 0.75 c
+172.053 0.856 171.943 0.974 171.876 1.103 c
+171.806 1.228 171.773 1.386 171.773 1.573 c
+171.773 1.897 171.891 2.165 172.126 2.381 c
+172.361 2.595 172.662 2.705 173.038 2.705 c
+173.42 2.705 173.728 2.591 173.963 2.367 c
+174.199 2.139 174.316 1.852 174.316 1.5 c
+173.669 1.5 l
+173.669 1.675 173.611 1.827 173.493 1.955 c
+173.375 2.08 173.221 2.146 173.038 2.146 c
+172.839 2.146 172.689 2.091 172.581 1.984 c
+172.471 1.885 172.42 1.753 172.42 1.588 c
+172.42 1.459 172.456 1.353 172.537 1.264 c
+172.614 1.183 172.806 1.081 173.111 0.956 c
+173.589 0.769 173.919 0.58 174.096 0.397 c
+174.272 0.22 174.36 -0.008 174.36 -0.279 c
+174.36 -0.632 174.235 -0.912 173.993 -1.117 c
+173.757 -1.323 173.441 -1.426 173.052 -1.426 c
+172.629 -1.426 172.292 -1.309 172.038 -1.073 c
+171.781 -0.831 171.656 -0.525 171.656 -0.162 c
+172.302 -0.162 l
+172.31 -0.389 172.379 -0.565 172.508 -0.691 c
+172.633 -0.808 172.817 -0.867 173.052 -0.867 c
+173.265 -0.867 173.427 -0.819 173.537 -0.721 c
+173.655 -0.625 173.713 -0.496 173.713 -0.338 c
+178.962 -1.352 m
+178.921 -1.264 178.895 -1.117 178.887 -0.912 c
+178.652 -1.257 178.359 -1.426 178.006 -1.426 c
+177.642 -1.426 177.359 -1.33 177.153 -1.132 c
+176.955 -0.926 176.859 -0.64 176.859 -0.264 c
+176.859 0.136 176.995 0.455 177.271 0.69 c
+177.543 0.933 177.917 1.058 178.388 1.058 c
+178.873 1.058 l
+178.873 1.484 l
+178.873 1.72 178.818 1.885 178.711 1.984 c
+178.601 2.091 178.439 2.146 178.226 2.146 c
+178.027 2.146 177.866 2.087 177.741 1.97 c
+177.624 1.852 177.565 1.706 177.565 1.529 c
+176.918 1.529 l
+176.918 1.723 176.977 1.914 177.094 2.102 c
+177.219 2.286 177.381 2.433 177.58 2.543 c
+177.786 2.65 178.013 2.705 178.27 2.705 c
+178.671 2.705 178.976 2.602 179.182 2.396 c
+179.394 2.19 179.509 1.897 179.519 1.514 c
+179.519 -0.5 l
+179.519 -0.804 179.556 -1.07 179.637 -1.294 c
+179.637 -1.352 l
+h
+178.094 -0.838 m
+178.259 -0.838 178.41 -0.794 178.55 -0.706 c
+178.696 -0.617 178.804 -0.507 178.873 -0.368 c
+178.873 0.573 l
+178.505 0.573 l
+178.189 0.573 177.946 0.503 177.771 0.368 c
+177.594 0.239 177.506 0.052 177.506 -0.191 c
+177.506 -0.419 177.55 -0.584 177.638 -0.691 c
+177.726 -0.79 177.877 -0.838 178.094 -0.838 c
+181.137 2.631 m
+181.152 2.19 l
+181.405 2.532 181.728 2.705 182.121 2.705 c
+182.827 2.705 183.184 2.234 183.195 1.294 c
+183.195 -1.352 l
+182.548 -1.352 l
+182.548 1.264 l
+182.548 1.577 182.492 1.797 182.386 1.926 c
+182.276 2.051 182.121 2.117 181.915 2.117 c
+181.757 2.117 181.611 2.062 181.474 1.955 c
+181.346 1.845 181.243 1.709 181.166 1.544 c
+181.166 -1.352 l
+180.519 -1.352 l
+180.519 2.631 l
+h
+184.032 0.823 m
+184.032 1.43 184.142 1.897 184.371 2.219 c
+184.606 2.543 184.932 2.705 185.355 2.705 c
+185.738 2.705 186.035 2.547 186.252 2.234 c
+186.252 4.293 l
+186.899 4.293 l
+186.899 -1.352 l
+186.311 -1.352 l
+186.266 -0.926 l
+186.06 -1.261 185.756 -1.426 185.355 -1.426 c
+184.944 -1.426 184.62 -1.271 184.385 -0.956 c
+184.15 -0.632 184.032 -0.176 184.032 0.412 c
+h
+184.679 0.441 m
+184.679 0 184.741 -0.33 184.87 -0.544 c
+185.006 -0.75 185.227 -0.852 185.532 -0.852 c
+185.855 -0.852 186.094 -0.691 186.252 -0.368 c
+186.252 1.646 l
+186.083 1.959 185.844 2.117 185.532 2.117 c
+185.227 2.117 185.006 2.014 184.87 1.808 c
+184.741 1.602 184.679 1.278 184.679 0.838 c
+h
+190.471 3.587 m
+190.471 2.631 l
+191.073 2.631 l
+191.073 2.102 l
+190.471 2.102 l
+190.471 -0.368 l
+190.471 -0.525 190.492 -0.643 190.544 -0.721 c
+190.602 -0.801 190.691 -0.838 190.808 -0.838 c
+190.897 -0.838 190.985 -0.823 191.073 -0.794 c
+191.073 -1.352 l
+190.926 -1.4 190.772 -1.426 190.617 -1.426 c
+190.36 -1.426 190.166 -1.334 190.029 -1.147 c
+189.89 -0.962 189.823 -0.702 189.823 -0.368 c
+189.823 2.102 l
+189.221 2.102 l
+189.221 2.631 l
+189.823 2.631 l
+189.823 3.587 l
+h
+193.881 -1.352 m
+193.84 -1.264 193.815 -1.117 193.807 -0.912 c
+193.572 -1.257 193.278 -1.426 192.925 -1.426 c
+192.562 -1.426 192.279 -1.33 192.073 -1.132 c
+191.874 -0.926 191.778 -0.64 191.778 -0.264 c
+191.778 0.136 191.915 0.455 192.19 0.69 c
+192.462 0.933 192.837 1.058 193.308 1.058 c
+193.792 1.058 l
+193.792 1.484 l
+193.792 1.72 193.738 1.885 193.63 1.984 c
+193.52 2.091 193.359 2.146 193.146 2.146 c
+192.948 2.146 192.786 2.087 192.661 1.97 c
+192.543 1.852 192.484 1.706 192.484 1.529 c
+191.837 1.529 l
+191.837 1.723 191.897 1.914 192.013 2.102 c
+192.138 2.286 192.3 2.433 192.499 2.543 c
+192.705 2.65 192.932 2.705 193.189 2.705 c
+193.59 2.705 193.895 2.602 194.101 2.396 c
+194.314 2.19 194.428 1.897 194.44 1.514 c
+194.44 -0.5 l
+194.44 -0.804 194.476 -1.07 194.557 -1.294 c
+194.557 -1.352 l
+h
+193.013 -0.838 m
+193.179 -0.838 193.329 -0.794 193.469 -0.706 c
+193.616 -0.617 193.723 -0.507 193.792 -0.368 c
+193.792 0.573 l
+193.424 0.573 l
+193.109 0.573 192.867 0.503 192.69 0.368 c
+192.514 0.239 192.425 0.052 192.425 -0.191 c
+192.425 -0.419 192.47 -0.584 192.558 -0.691 c
+192.646 -0.79 192.797 -0.838 193.013 -0.838 c
+195.306 0.823 m
+195.306 1.44 195.417 1.904 195.645 2.219 c
+195.869 2.543 196.203 2.705 196.644 2.705 c
+197.044 2.705 197.349 2.529 197.555 2.176 c
+197.599 2.631 l
+198.187 2.631 l
+198.187 -1.396 l
+198.187 -1.885 198.059 -2.263 197.806 -2.528 c
+197.548 -2.793 197.195 -2.925 196.747 -2.925 c
+196.549 -2.925 196.328 -2.874 196.086 -2.778 c
+195.839 -2.679 195.66 -2.558 195.541 -2.41 c
+195.806 -1.97 l
+196.071 -2.234 196.368 -2.367 196.703 -2.367 c
+197.239 -2.367 197.515 -2.072 197.526 -1.484 c
+197.526 -0.956 l
+197.32 -1.271 197.019 -1.426 196.63 -1.426 c
+196.218 -1.426 195.895 -1.275 195.66 -0.97 c
+195.431 -0.658 195.313 -0.206 195.306 0.382 c
+h
+195.968 0.441 m
+195.968 0 196.03 -0.33 196.159 -0.544 c
+196.284 -0.75 196.501 -0.852 196.806 -0.852 c
+197.129 -0.852 197.368 -0.687 197.526 -0.353 c
+197.526 1.631 l
+197.357 1.955 197.118 2.117 196.806 2.117 c
+196.512 2.117 196.295 2.014 196.159 1.808 c
+196.03 1.602 195.968 1.278 195.968 0.838 c
+h
+201.083 -0.338 m
+201.083 -0.191 201.028 -0.07 200.921 0.029 c
+200.811 0.125 200.605 0.243 200.304 0.382 c
+199.959 0.53 199.716 0.651 199.569 0.75 c
+199.423 0.856 199.312 0.974 199.246 1.103 c
+199.176 1.228 199.143 1.386 199.143 1.573 c
+199.143 1.897 199.261 2.165 199.496 2.381 c
+199.731 2.595 200.032 2.705 200.407 2.705 c
+200.79 2.705 201.098 2.591 201.333 2.367 c
+201.568 2.139 201.686 1.852 201.686 1.5 c
+201.039 1.5 l
+201.039 1.675 200.98 1.827 200.863 1.955 c
+200.745 2.08 200.591 2.146 200.407 2.146 c
+200.208 2.146 200.058 2.091 199.951 1.984 c
+199.841 1.885 199.79 1.753 199.79 1.588 c
+199.79 1.459 199.826 1.353 199.907 1.264 c
+199.984 1.183 200.175 1.081 200.48 0.956 c
+200.958 0.769 201.289 0.58 201.465 0.397 c
+201.642 0.22 201.73 -0.008 201.73 -0.279 c
+201.73 -0.632 201.605 -0.912 201.362 -1.117 c
+201.127 -1.323 200.811 -1.426 200.422 -1.426 c
+199.999 -1.426 199.661 -1.309 199.408 -1.073 c
+199.15 -0.831 199.026 -0.525 199.026 -0.162 c
+199.672 -0.162 l
+199.679 -0.389 199.749 -0.565 199.878 -0.691 c
+200.003 -0.808 200.187 -0.867 200.422 -0.867 c
+200.635 -0.867 200.796 -0.819 200.907 -0.721 c
+201.025 -0.625 201.083 -0.496 201.083 -0.338 c
+202.612 -0.999 m
+202.612 -0.881 202.645 -0.786 202.715 -0.706 c
+202.781 -0.628 202.884 -0.588 203.024 -0.588 c
+203.171 -0.588 203.277 -0.628 203.346 -0.706 c
+203.424 -0.786 203.464 -0.881 203.464 -0.999 c
+203.464 -1.11 203.424 -1.201 203.346 -1.278 c
+203.277 -1.356 203.171 -1.396 203.024 -1.396 c
+202.884 -1.396 202.781 -1.356 202.715 -1.278 c
+202.645 -1.201 202.612 -1.11 202.612 -0.999 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 354.533 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 347.6937 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.182 -0.103 1.999 c
+-0.941 1.882 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.882 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.117 l
+14.497 3.117 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.566 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.278 c
+15.313 -1.286 15.225 -1.293 15.129 -1.293 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.293 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.943 -1.205 c
+21.737 -1.117 21.564 -0.996 21.428 -0.838 c
+21.288 -0.684 21.185 -0.496 21.119 -0.279 c
+21.049 -0.056 21.016 0.191 21.016 0.455 c
+21.016 0.75 21.049 1.007 21.119 1.235 c
+21.197 1.459 21.303 1.646 21.442 1.793 c
+21.589 1.947 21.766 2.065 21.972 2.146 c
+22.178 2.234 22.413 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.249 23.28 2.19 c
+23.456 2.132 23.607 2.047 23.736 1.941 c
+23.861 1.841 23.963 1.72 24.044 1.573 c
+24.122 1.433 24.176 1.282 24.206 1.118 c
+23.295 1.073 l
+23.265 1.249 23.196 1.389 23.089 1.5 c
+22.99 1.606 22.846 1.661 22.662 1.661 c
+22.416 1.661 22.24 1.558 22.134 1.353 c
+22.023 1.154 21.972 0.867 21.972 0.485 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.276 23.324 -0.058 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.573 c
+24.004 -0.721 23.901 -0.852 23.765 -0.97 c
+23.636 -1.08 23.478 -1.168 23.295 -1.234 c
+23.119 -1.293 22.913 -1.323 22.677 -1.323 c
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.482 28.108 -0.669 27.973 -0.823 c
+27.833 -0.981 27.657 -1.103 27.443 -1.191 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.191 c
+25.739 -1.103 25.566 -0.981 25.43 -0.823 c
+25.29 -0.669 25.187 -0.482 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.738 25.047 0.974 25.106 1.191 c
+25.172 1.415 25.275 1.606 25.415 1.764 c
+25.55 1.929 25.727 2.058 25.944 2.146 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.146 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.606 28.237 1.415 28.296 1.191 c
+28.355 0.974 28.384 0.738 28.384 0.485 c
+27.429 0.485 m
+27.429 0.69 27.414 0.867 27.385 1.014 c
+27.362 1.161 27.326 1.282 27.267 1.382 c
+27.208 1.477 27.135 1.548 27.046 1.588 c
+26.959 1.635 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.562 26.15 1.367 c
+26.032 1.18 25.974 0.885 25.974 0.485 c
+25.974 0.062 26.032 -0.243 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.599 27.194 -0.526 27.252 -0.426 c
+27.318 -0.331 27.362 -0.206 27.385 -0.058 c
+27.414 0.088 27.429 0.268 27.429 0.485 c
+31.43 -1.264 m
+31.43 0.721 l
+31.43 1.022 31.387 1.242 31.298 1.382 c
+31.217 1.529 31.081 1.602 30.886 1.602 c
+30.776 1.602 30.674 1.577 30.578 1.529 c
+30.489 1.477 30.409 1.411 30.343 1.323 c
+30.284 1.235 30.233 1.124 30.196 1 c
+30.167 0.882 30.152 0.75 30.152 0.603 c
+30.152 -1.264 l
+29.24 -1.264 l
+29.24 1.44 l
+29.24 1.661 l
+29.24 1.749 29.233 1.826 29.226 1.897 c
+29.226 2.087 l
+29.226 2.219 l
+30.078 2.219 l
+30.086 2.19 30.093 2.146 30.093 2.087 c
+30.093 1.897 l
+30.1 1.826 30.107 1.756 30.107 1.691 c
+30.115 1.621 30.122 1.565 30.122 1.529 c
+30.137 1.529 l
+30.254 1.793 30.406 1.984 30.593 2.102 c
+30.776 2.219 30.996 2.278 31.254 2.278 c
+31.438 2.278 31.599 2.249 31.74 2.19 c
+31.875 2.132 31.989 2.043 32.077 1.926 c
+32.166 1.808 32.228 1.665 32.268 1.5 c
+32.316 1.341 32.342 1.154 32.342 0.941 c
+32.342 -1.264 l
+h
+34.951 1.602 m
+34.951 -1.264 l
+34.054 -1.264 l
+34.054 1.602 l
+33.232 1.602 l
+33.232 2.219 l
+34.054 2.219 l
+34.054 2.484 l
+34.054 2.609 34.069 2.741 34.098 2.882 c
+34.135 3.017 34.205 3.135 34.304 3.234 c
+34.41 3.341 34.554 3.429 34.73 3.499 c
+34.907 3.564 35.131 3.601 35.407 3.601 c
+35.62 3.601 35.819 3.59 35.995 3.572 c
+36.17 3.549 36.322 3.532 36.45 3.513 c
+36.45 2.925 l
+36.322 2.944 36.178 2.959 36.024 2.969 c
+35.866 2.977 35.715 2.984 35.568 2.984 c
+35.44 2.984 35.337 2.969 35.26 2.94 c
+35.179 2.911 35.116 2.87 35.069 2.822 c
+35.017 2.77 34.984 2.708 34.965 2.631 c
+34.955 2.562 34.951 2.484 34.951 2.396 c
+34.951 2.219 l
+36.377 2.219 l
+36.377 1.602 l
+h
+39.467 -0.646 m
+40.599 -0.646 l
+40.599 -1.264 l
+37.292 -1.264 l
+37.292 -0.646 l
+38.556 -0.646 l
+38.556 1.602 l
+37.63 1.602 l
+37.63 2.219 l
+39.467 2.219 l
+h
+38.556 3.513 0.911 -0.675 re
+38.556 2.837 m
+42.954 -2.66 m
+42.738 -2.66 42.547 -2.635 42.381 -2.587 c
+42.212 -2.547 42.073 -2.484 41.955 -2.396 c
+41.837 -2.315 41.738 -2.219 41.661 -2.102 c
+41.591 -1.984 41.543 -1.856 41.514 -1.72 c
+42.41 -1.617 l
+42.447 -1.753 42.518 -1.86 42.616 -1.94 c
+42.712 -2.028 42.837 -2.072 42.984 -2.072 c
+43.072 -2.072 43.153 -2.057 43.234 -2.028 c
+43.311 -1.999 43.381 -1.944 43.44 -1.866 c
+43.499 -1.797 43.542 -1.705 43.572 -1.587 c
+43.609 -1.469 43.631 -1.323 43.631 -1.147 c
+43.631 -0.956 l
+43.631 -0.889 43.634 -0.831 43.646 -0.779 c
+43.646 -0.588 l
+43.631 -0.588 l
+43.532 -0.816 43.388 -0.977 43.204 -1.073 c
+43.017 -1.172 42.811 -1.22 42.587 -1.22 c
+42.381 -1.22 42.198 -1.183 42.044 -1.103 c
+41.896 -1.014 41.768 -0.897 41.661 -0.75 c
+41.562 -0.595 41.488 -0.411 41.441 -0.206 c
+41.389 0.008 41.367 0.243 41.367 0.5 c
+41.367 0.771 41.389 1.018 41.441 1.235 c
+41.5 1.448 41.58 1.631 41.691 1.779 c
+41.797 1.933 41.93 2.051 42.088 2.132 c
+42.242 2.219 42.429 2.263 42.646 2.263 c
+42.742 2.263 42.84 2.253 42.94 2.234 c
+43.035 2.213 43.123 2.179 43.204 2.132 c
+43.293 2.08 43.37 2.018 43.44 1.941 c
+43.517 1.86 43.58 1.768 43.631 1.661 c
+43.646 1.661 l
+43.646 1.808 l
+43.653 1.866 43.66 1.918 43.66 1.97 c
+43.667 2.028 43.675 2.076 43.675 2.117 c
+43.682 2.165 43.694 2.198 43.704 2.219 c
+44.557 2.219 l
+44.546 2.138 44.535 2.028 44.527 1.882 c
+44.527 1.411 l
+44.527 -1.161 l
+44.527 -1.415 44.49 -1.635 44.425 -1.822 c
+44.355 -2.007 44.251 -2.161 44.116 -2.278 c
+43.976 -2.404 43.811 -2.499 43.616 -2.558 c
+43.418 -2.624 43.197 -2.66 42.954 -2.66 c
+43.646 0.53 m
+43.646 0.742 43.619 0.919 43.572 1.058 c
+43.532 1.205 43.476 1.323 43.41 1.411 c
+43.351 1.5 43.282 1.558 43.204 1.588 c
+43.123 1.625 43.046 1.646 42.969 1.646 c
+42.87 1.646 42.778 1.621 42.69 1.573 c
+42.609 1.532 42.543 1.463 42.484 1.367 c
+42.433 1.278 42.389 1.161 42.352 1.014 c
+42.323 0.875 42.308 0.706 42.308 0.5 c
+42.308 0.125 42.366 -0.154 42.484 -0.338 c
+42.601 -0.515 42.763 -0.603 42.969 -0.603 c
+43.035 -0.603 43.109 -0.588 43.189 -0.559 c
+43.278 -0.522 43.351 -0.463 43.41 -0.382 c
+43.476 -0.294 43.532 -0.176 43.572 -0.029 c
+43.619 0.118 43.646 0.301 43.646 0.53 c
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+54.2 0.838 1.866 -0.794 re
+54.2 0.044 m
+59.201 -2.66 m
+58.983 -2.66 58.792 -2.635 58.628 -2.587 c
+58.458 -2.547 58.318 -2.484 58.201 -2.396 c
+58.083 -2.315 57.984 -2.219 57.907 -2.102 c
+57.838 -1.984 57.79 -1.856 57.76 -1.72 c
+58.657 -1.617 l
+58.694 -1.753 58.763 -1.86 58.863 -1.94 c
+58.958 -2.028 59.083 -2.072 59.23 -2.072 c
+59.318 -2.072 59.399 -2.057 59.48 -2.028 c
+59.557 -1.999 59.627 -1.944 59.686 -1.866 c
+59.744 -1.797 59.789 -1.705 59.818 -1.587 c
+59.855 -1.469 59.877 -1.323 59.877 -1.147 c
+59.877 -0.956 l
+59.877 -0.889 59.881 -0.831 59.891 -0.779 c
+59.891 -0.588 l
+59.877 -0.588 l
+59.777 -0.816 59.634 -0.977 59.451 -1.073 c
+59.263 -1.172 59.058 -1.22 58.833 -1.22 c
+58.628 -1.22 58.443 -1.183 58.289 -1.103 c
+58.142 -1.014 58.014 -0.897 57.907 -0.75 c
+57.807 -0.595 57.734 -0.411 57.687 -0.206 c
+57.635 0.008 57.613 0.243 57.613 0.5 c
+57.613 0.771 57.635 1.018 57.687 1.235 c
+57.745 1.448 57.826 1.631 57.936 1.779 c
+58.043 1.933 58.175 2.051 58.333 2.132 c
+58.488 2.219 58.675 2.263 58.892 2.263 c
+58.987 2.263 59.087 2.253 59.186 2.234 c
+59.282 2.213 59.37 2.179 59.451 2.132 c
+59.538 2.08 59.616 2.018 59.686 1.941 c
+59.763 1.86 59.825 1.768 59.877 1.661 c
+59.891 1.661 l
+59.891 1.808 l
+59.899 1.866 59.906 1.918 59.906 1.97 c
+59.914 2.028 59.921 2.076 59.921 2.117 c
+59.928 2.165 59.939 2.198 59.951 2.219 c
+60.803 2.219 l
+60.792 2.138 60.781 2.028 60.774 1.882 c
+60.774 1.411 l
+60.774 -1.161 l
+60.774 -1.415 60.737 -1.635 60.67 -1.822 c
+60.601 -2.007 60.498 -2.161 60.362 -2.278 c
+60.222 -2.404 60.057 -2.499 59.862 -2.558 c
+59.664 -2.624 59.443 -2.66 59.201 -2.66 c
+59.891 0.53 m
+59.891 0.742 59.866 0.919 59.818 1.058 c
+59.777 1.205 59.723 1.323 59.656 1.411 c
+59.598 1.5 59.528 1.558 59.451 1.588 c
+59.37 1.625 59.293 1.646 59.216 1.646 c
+59.116 1.646 59.024 1.621 58.936 1.573 c
+58.855 1.532 58.789 1.463 58.73 1.367 c
+58.679 1.278 58.634 1.161 58.598 1.014 c
+58.569 0.875 58.553 0.706 58.553 0.5 c
+58.553 0.125 58.613 -0.154 58.73 -0.338 c
+58.848 -0.515 59.01 -0.603 59.216 -0.603 c
+59.282 -0.603 59.355 -0.588 59.436 -0.559 c
+59.524 -0.522 59.598 -0.463 59.656 -0.382 c
+59.723 -0.294 59.777 -0.176 59.818 -0.029 c
+59.866 0.118 59.891 0.301 59.891 0.53 c
+63.835 -0.646 m
+64.967 -0.646 l
+64.967 -1.264 l
+61.659 -1.264 l
+61.659 -0.646 l
+62.923 -0.646 l
+62.923 2.896 l
+61.998 2.896 l
+61.998 3.513 l
+63.835 3.513 l
+h
+68.998 0.485 m
+68.998 0.21 68.961 -0.04 68.895 -0.264 c
+68.824 -0.482 68.722 -0.669 68.586 -0.823 c
+68.446 -0.981 68.27 -1.103 68.057 -1.191 c
+67.84 -1.278 67.586 -1.323 67.293 -1.323 c
+67.017 -1.323 66.771 -1.278 66.557 -1.191 c
+66.352 -1.103 66.179 -0.981 66.043 -0.823 c
+65.903 -0.669 65.801 -0.482 65.734 -0.264 c
+65.665 -0.04 65.632 0.21 65.632 0.485 c
+65.632 0.738 65.661 0.974 65.72 1.191 c
+65.786 1.415 65.888 1.606 66.029 1.764 c
+66.164 1.929 66.341 2.058 66.557 2.146 c
+66.771 2.234 67.028 2.278 67.322 2.278 c
+67.634 2.278 67.895 2.234 68.101 2.146 c
+68.314 2.058 68.487 1.929 68.616 1.764 c
+68.751 1.606 68.851 1.415 68.909 1.191 c
+68.968 0.974 68.998 0.738 68.998 0.485 c
+68.042 0.485 m
+68.042 0.69 68.028 0.867 67.999 1.014 c
+67.976 1.161 67.939 1.282 67.881 1.382 c
+67.822 1.477 67.748 1.548 67.66 1.588 c
+67.571 1.635 67.461 1.661 67.336 1.661 c
+67.072 1.661 66.881 1.562 66.763 1.367 c
+66.646 1.18 66.587 0.885 66.587 0.485 c
+66.587 0.062 66.646 -0.243 66.763 -0.426 c
+66.881 -0.613 67.058 -0.706 67.293 -0.706 c
+67.417 -0.706 67.531 -0.687 67.631 -0.646 c
+67.726 -0.599 67.807 -0.526 67.866 -0.426 c
+67.932 -0.331 67.976 -0.206 67.999 -0.058 c
+68.028 0.088 68.042 0.268 68.042 0.485 c
+69.854 -1.264 m
+69.854 -0.97 l
+69.861 -0.834 69.869 -0.676 69.869 -0.5 c
+69.869 3.513 l
+70.78 3.513 l
+70.78 2.234 l
+70.78 2.072 l
+70.78 1.897 l
+70.78 1.845 70.773 1.801 70.765 1.764 c
+70.765 1.675 l
+70.78 1.675 l
+70.827 1.783 70.89 1.874 70.971 1.955 c
+71.048 2.032 71.133 2.095 71.221 2.146 c
+71.309 2.194 71.401 2.227 71.5 2.249 c
+71.596 2.267 71.695 2.278 71.794 2.278 c
+72.007 2.278 72.194 2.234 72.352 2.146 c
+72.507 2.058 72.635 1.929 72.735 1.764 c
+72.841 1.606 72.919 1.415 72.97 1.191 c
+73.017 0.974 73.044 0.735 73.044 0.47 c
+73.044 0.214 73.015 -0.025 72.955 -0.25 c
+72.897 -0.467 72.812 -0.658 72.705 -0.823 c
+72.595 -0.981 72.463 -1.103 72.309 -1.191 c
+72.151 -1.278 71.97 -1.323 71.764 -1.323 c
+71.666 -1.323 71.567 -1.311 71.471 -1.293 c
+71.382 -1.272 71.294 -1.242 71.206 -1.191 c
+71.118 -1.132 71.037 -1.066 70.971 -0.985 c
+70.901 -0.908 70.839 -0.808 70.78 -0.69 c
+70.765 -0.69 l
+70.765 -0.852 l
+70.765 -0.912 70.758 -0.97 70.75 -1.029 c
+70.75 -1.08 70.743 -1.128 70.736 -1.176 c
+70.736 -1.216 70.729 -1.246 70.721 -1.264 c
+h
+70.765 0.5 m
+70.765 0.264 70.783 0.066 70.824 -0.088 c
+70.872 -0.246 70.931 -0.368 71 -0.455 c
+71.066 -0.544 71.14 -0.61 71.221 -0.646 c
+71.298 -0.687 71.375 -0.706 71.456 -0.706 c
+71.662 -0.706 71.816 -0.61 71.926 -0.411 c
+72.044 -0.216 72.103 0.077 72.103 0.47 c
+72.103 0.684 72.08 0.867 72.044 1.014 c
+72.015 1.168 71.97 1.294 71.912 1.382 c
+71.86 1.477 71.794 1.55 71.706 1.602 c
+71.625 1.65 71.537 1.675 71.442 1.675 c
+71.361 1.675 71.284 1.654 71.206 1.617 c
+71.126 1.577 71.052 1.514 70.985 1.426 c
+70.927 1.338 70.872 1.213 70.824 1.058 c
+70.783 0.912 70.765 0.724 70.765 0.5 c
+74.873 -1.323 m
+74.704 -1.323 74.554 -1.301 74.418 -1.264 c
+74.289 -1.216 74.175 -1.147 74.079 -1.058 c
+73.992 -0.97 73.921 -0.864 73.874 -0.735 c
+73.823 -0.599 73.8 -0.449 73.8 -0.279 c
+73.8 -0.073 73.834 0.096 73.904 0.235 c
+73.969 0.382 74.065 0.492 74.183 0.573 c
+74.308 0.661 74.451 0.724 74.609 0.765 c
+74.775 0.802 74.951 0.827 75.138 0.838 c
+75.858 0.852 l
+75.858 1.029 l
+75.858 1.147 75.847 1.249 75.829 1.338 c
+75.807 1.426 75.774 1.492 75.726 1.544 c
+75.685 1.602 75.638 1.639 75.579 1.661 c
+75.521 1.679 75.454 1.691 75.388 1.691 c
+75.318 1.691 75.255 1.679 75.197 1.661 c
+75.145 1.65 75.097 1.625 75.05 1.588 c
+75.01 1.558 74.976 1.507 74.947 1.44 c
+74.925 1.382 74.91 1.301 74.903 1.205 c
+73.962 1.249 l
+73.992 1.396 74.035 1.532 74.095 1.661 c
+74.16 1.786 74.256 1.897 74.374 1.984 c
+74.492 2.08 74.631 2.153 74.8 2.205 c
+74.976 2.253 75.182 2.278 75.417 2.278 c
+75.858 2.278 76.19 2.168 76.417 1.955 c
+76.652 1.749 76.77 1.44 76.77 1.029 c
+76.77 -0.235 l
+76.77 -0.455 l
+76.777 -0.515 76.792 -0.569 76.814 -0.617 c
+76.832 -0.658 76.861 -0.69 76.902 -0.721 c
+76.938 -0.742 76.99 -0.75 77.049 -0.75 c
+77.115 -0.75 77.185 -0.746 77.254 -0.735 c
+77.254 -1.22 l
+77.196 -1.231 77.141 -1.242 77.093 -1.249 c
+77.053 -1.261 77.013 -1.268 76.976 -1.278 c
+76.936 -1.286 76.891 -1.293 76.843 -1.293 c
+76.792 -1.301 76.733 -1.309 76.666 -1.309 c
+76.439 -1.309 76.273 -1.257 76.167 -1.147 c
+76.057 -1.029 75.995 -0.864 75.976 -0.646 c
+75.961 -0.646 l
+75.891 -0.757 75.822 -0.852 75.756 -0.941 c
+75.685 -1.022 75.608 -1.087 75.521 -1.147 c
+75.432 -1.205 75.333 -1.249 75.226 -1.278 c
+75.127 -1.309 75.01 -1.323 74.873 -1.323 c
+75.858 0.353 m
+75.432 0.338 l
+75.333 0.338 75.241 0.331 75.153 0.324 c
+75.072 0.312 75.006 0.287 74.947 0.25 c
+74.889 0.21 74.837 0.151 74.8 0.073 c
+74.76 0.004 74.741 -0.088 74.741 -0.206 c
+74.741 -0.374 74.775 -0.496 74.844 -0.573 c
+74.91 -0.654 75.01 -0.69 75.138 -0.69 c
+75.245 -0.69 75.344 -0.669 75.432 -0.617 c
+75.527 -0.569 75.608 -0.507 75.667 -0.426 c
+75.733 -0.349 75.785 -0.261 75.814 -0.162 c
+75.843 -0.056 75.858 0.059 75.858 0.177 c
+h
+80.08 -0.646 m
+81.212 -0.646 l
+81.212 -1.264 l
+77.905 -1.264 l
+77.905 -0.646 l
+79.17 -0.646 l
+79.17 2.896 l
+78.243 2.896 l
+78.243 3.513 l
+80.08 3.513 l
+h
+87.658 -1.323 m
+87.371 -1.323 87.128 -1.282 86.923 -1.205 c
+86.717 -1.117 86.544 -0.996 86.409 -0.838 c
+86.269 -0.684 86.166 -0.496 86.1 -0.279 c
+86.03 -0.056 85.997 0.191 85.997 0.455 c
+85.997 0.75 86.03 1.007 86.1 1.235 c
+86.177 1.459 86.284 1.646 86.423 1.793 c
+86.571 1.947 86.747 2.065 86.953 2.146 c
+87.159 2.234 87.394 2.278 87.658 2.278 c
+87.882 2.278 88.084 2.249 88.261 2.19 c
+88.437 2.132 88.588 2.047 88.716 1.941 c
+88.842 1.841 88.944 1.72 89.025 1.573 c
+89.102 1.433 89.158 1.282 89.187 1.118 c
+88.275 1.073 l
+88.246 1.249 88.176 1.389 88.069 1.5 c
+87.97 1.606 87.827 1.661 87.643 1.661 c
+87.398 1.661 87.221 1.558 87.114 1.353 c
+87.004 1.154 86.953 0.867 86.953 0.485 c
+86.953 -0.309 87.188 -0.706 87.658 -0.706 c
+87.824 -0.706 87.967 -0.654 88.084 -0.544 c
+88.202 -0.437 88.275 -0.276 88.304 -0.058 c
+89.216 -0.103 l
+89.187 -0.272 89.131 -0.426 89.054 -0.573 c
+88.985 -0.721 88.882 -0.852 88.746 -0.97 c
+88.617 -1.08 88.46 -1.168 88.275 -1.234 c
+88.099 -1.293 87.893 -1.323 87.658 -1.323 c
+93.365 0.485 m
+93.365 0.21 93.328 -0.04 93.262 -0.264 c
+93.192 -0.482 93.089 -0.669 92.954 -0.823 c
+92.813 -0.981 92.637 -1.103 92.424 -1.191 c
+92.208 -1.278 91.954 -1.323 91.66 -1.323 c
+91.384 -1.323 91.138 -1.278 90.925 -1.191 c
+90.719 -1.103 90.546 -0.981 90.411 -0.823 c
+90.271 -0.669 90.168 -0.482 90.102 -0.264 c
+90.032 -0.04 89.999 0.21 89.999 0.485 c
+89.999 0.738 90.028 0.974 90.087 1.191 c
+90.153 1.415 90.256 1.606 90.396 1.764 c
+90.532 1.929 90.708 2.058 90.925 2.146 c
+91.138 2.234 91.396 2.278 91.689 2.278 c
+92.001 2.278 92.263 2.234 92.468 2.146 c
+92.682 2.058 92.854 1.929 92.983 1.764 c
+93.119 1.606 93.218 1.415 93.277 1.191 c
+93.335 0.974 93.365 0.738 93.365 0.485 c
+92.41 0.485 m
+92.41 0.69 92.395 0.867 92.366 1.014 c
+92.343 1.161 92.306 1.282 92.248 1.382 c
+92.189 1.477 92.115 1.548 92.028 1.588 c
+91.939 1.635 91.829 1.661 91.704 1.661 c
+91.439 1.661 91.248 1.562 91.13 1.367 c
+91.013 1.18 90.954 0.885 90.954 0.485 c
+90.954 0.062 91.013 -0.243 91.13 -0.426 c
+91.248 -0.613 91.425 -0.706 91.66 -0.706 c
+91.785 -0.706 91.899 -0.687 91.998 -0.646 c
+92.094 -0.599 92.175 -0.526 92.233 -0.426 c
+92.3 -0.331 92.343 -0.206 92.366 -0.058 c
+92.395 0.088 92.41 0.268 92.41 0.485 c
+96.327 -0.646 m
+97.459 -0.646 l
+97.459 -1.264 l
+94.151 -1.264 l
+94.151 -0.646 l
+95.415 -0.646 l
+95.415 2.896 l
+94.49 2.896 l
+94.49 3.513 l
+96.327 3.513 l
+h
+101.49 0.485 m
+101.49 0.21 101.453 -0.04 101.387 -0.264 c
+101.317 -0.482 101.214 -0.669 101.079 -0.823 c
+100.939 -0.981 100.763 -1.103 100.549 -1.191 c
+100.333 -1.278 100.079 -1.323 99.785 -1.323 c
+99.51 -1.323 99.263 -1.278 99.049 -1.191 c
+98.844 -1.103 98.671 -0.981 98.535 -0.823 c
+98.396 -0.669 98.293 -0.482 98.226 -0.264 c
+98.157 -0.04 98.124 0.21 98.124 0.485 c
+98.124 0.738 98.153 0.974 98.212 1.191 c
+98.278 1.415 98.381 1.606 98.521 1.764 c
+98.656 1.929 98.833 2.058 99.049 2.146 c
+99.263 2.234 99.52 2.278 99.814 2.278 c
+100.127 2.278 100.387 2.234 100.593 2.146 c
+100.807 2.058 100.979 1.929 101.108 1.764 c
+101.243 1.606 101.343 1.415 101.401 1.191 c
+101.461 0.974 101.49 0.738 101.49 0.485 c
+100.534 0.485 m
+100.534 0.69 100.52 0.867 100.491 1.014 c
+100.468 1.161 100.431 1.282 100.373 1.382 c
+100.314 1.477 100.24 1.548 100.152 1.588 c
+100.064 1.635 99.954 1.661 99.828 1.661 c
+99.564 1.661 99.373 1.562 99.256 1.367 c
+99.138 1.18 99.08 0.885 99.08 0.485 c
+99.08 0.062 99.138 -0.243 99.256 -0.426 c
+99.373 -0.613 99.55 -0.706 99.785 -0.706 c
+99.909 -0.706 100.024 -0.687 100.123 -0.646 c
+100.219 -0.599 100.299 -0.526 100.358 -0.426 c
+100.424 -0.331 100.468 -0.206 100.491 -0.058 c
+100.52 0.088 100.534 0.268 100.534 0.485 c
+105.359 1.47 m
+105.26 1.477 105.158 1.488 105.05 1.5 c
+104.94 1.517 104.819 1.529 104.684 1.529 c
+104.507 1.529 104.349 1.488 104.213 1.411 c
+104.073 1.341 103.955 1.242 103.86 1.118 c
+103.772 0.989 103.702 0.842 103.654 0.676 c
+103.614 0.507 103.595 0.331 103.595 0.147 c
+103.595 -1.264 l
+102.699 -1.264 l
+102.699 0.985 l
+102.699 1.11 102.688 1.235 102.669 1.353 c
+102.658 1.477 102.644 1.595 102.625 1.706 c
+102.614 1.823 102.6 1.918 102.581 1.999 c
+102.559 2.087 102.541 2.161 102.523 2.219 c
+103.404 2.219 l
+103.412 2.168 103.423 2.117 103.433 2.058 c
+103.452 1.999 103.467 1.933 103.478 1.866 c
+103.496 1.808 103.511 1.742 103.522 1.675 c
+103.529 1.606 103.541 1.544 103.552 1.484 c
+103.566 1.484 l
+103.603 1.602 103.654 1.708 103.713 1.808 c
+103.78 1.903 103.86 1.988 103.948 2.058 c
+104.036 2.124 104.139 2.179 104.257 2.219 c
+104.382 2.256 104.529 2.278 104.698 2.278 c
+104.823 2.278 104.94 2.271 105.05 2.263 c
+105.168 2.253 105.272 2.238 105.359 2.219 c
+h
+107.465 -0.279 0.926 -0.985 re
+107.465 -1.264 m
+111.35 2.219 m
+111.35 0.264 l
+111.35 0.125 111.356 0 111.379 -0.118 c
+111.397 -0.228 111.43 -0.32 111.481 -0.397 c
+111.529 -0.478 111.588 -0.54 111.658 -0.588 c
+111.724 -0.628 111.809 -0.646 111.908 -0.646 c
+111.996 -0.646 112.077 -0.628 112.158 -0.588 c
+112.246 -0.54 112.32 -0.47 112.378 -0.382 c
+112.437 -0.287 112.481 -0.176 112.511 -0.058 c
+112.547 0.066 112.569 0.206 112.569 0.353 c
+112.569 2.219 l
+113.466 2.219 l
+113.466 -0.485 l
+113.466 -0.721 l
+113.473 -0.802 113.48 -0.879 113.48 -0.956 c
+113.48 -1.147 l
+113.488 -1.198 113.495 -1.234 113.495 -1.264 c
+112.643 -1.264 l
+112.632 -1.234 112.621 -1.198 112.613 -1.147 c
+112.613 -0.956 l
+112.613 -0.889 112.606 -0.819 112.599 -0.75 c
+112.599 -0.573 l
+112.584 -0.573 l
+112.466 -0.838 112.312 -1.029 112.129 -1.147 c
+111.952 -1.264 111.749 -1.323 111.526 -1.323 c
+111.32 -1.323 111.147 -1.286 111.011 -1.22 c
+110.872 -1.154 110.762 -1.058 110.673 -0.941 c
+110.592 -0.823 110.533 -0.687 110.496 -0.529 c
+110.467 -0.364 110.452 -0.187 110.452 0 c
+110.452 2.219 l
+h
+116.634 -0.646 m
+117.766 -0.646 l
+117.766 -1.264 l
+114.458 -1.264 l
+114.458 -0.646 l
+115.722 -0.646 l
+115.722 1.602 l
+114.797 1.602 l
+114.797 2.219 l
+116.634 2.219 l
+h
+115.722 3.513 0.912 -0.675 re
+115.722 2.837 m
+123.608 -1.323 m
+123.439 -1.323 123.289 -1.301 123.152 -1.264 c
+123.024 -1.216 122.91 -1.147 122.814 -1.058 c
+122.726 -0.97 122.656 -0.864 122.608 -0.735 c
+122.558 -0.599 122.535 -0.449 122.535 -0.279 c
+122.535 -0.073 122.568 0.096 122.639 0.235 c
+122.704 0.382 122.799 0.492 122.917 0.573 c
+123.042 0.661 123.186 0.724 123.344 0.765 c
+123.509 0.802 123.686 0.827 123.873 0.838 c
+124.593 0.852 l
+124.593 1.029 l
+124.593 1.147 124.582 1.249 124.563 1.338 c
+124.542 1.426 124.509 1.492 124.461 1.544 c
+124.42 1.602 124.372 1.639 124.314 1.661 c
+124.255 1.679 124.189 1.691 124.123 1.691 c
+124.052 1.691 123.99 1.679 123.932 1.661 c
+123.88 1.65 123.832 1.625 123.784 1.588 c
+123.744 1.558 123.711 1.507 123.682 1.44 c
+123.659 1.382 123.645 1.301 123.638 1.205 c
+122.697 1.249 l
+122.726 1.396 122.77 1.532 122.829 1.661 c
+122.895 1.786 122.991 1.897 123.109 1.984 c
+123.227 2.08 123.366 2.153 123.535 2.205 c
+123.711 2.253 123.917 2.278 124.152 2.278 c
+124.593 2.278 124.924 2.168 125.151 1.955 c
+125.386 1.749 125.504 1.44 125.504 1.029 c
+125.504 -0.235 l
+125.504 -0.455 l
+125.512 -0.515 125.527 -0.569 125.548 -0.617 c
+125.567 -0.658 125.596 -0.69 125.637 -0.721 c
+125.673 -0.742 125.725 -0.75 125.783 -0.75 c
+125.85 -0.75 125.92 -0.746 125.989 -0.735 c
+125.989 -1.22 l
+125.931 -1.231 125.876 -1.242 125.828 -1.249 c
+125.787 -1.261 125.747 -1.268 125.71 -1.278 c
+125.67 -1.286 125.625 -1.293 125.578 -1.293 c
+125.527 -1.301 125.467 -1.309 125.401 -1.309 c
+125.174 -1.309 125.008 -1.257 124.902 -1.147 c
+124.792 -1.029 124.729 -0.864 124.711 -0.646 c
+124.696 -0.646 l
+124.626 -0.757 124.557 -0.852 124.49 -0.941 c
+124.42 -1.022 124.343 -1.087 124.255 -1.147 c
+124.167 -1.205 124.068 -1.249 123.961 -1.278 c
+123.861 -1.309 123.744 -1.323 123.608 -1.323 c
+124.593 0.353 m
+124.167 0.338 l
+124.068 0.338 123.975 0.331 123.888 0.324 c
+123.807 0.312 123.74 0.287 123.682 0.25 c
+123.623 0.21 123.572 0.151 123.535 0.073 c
+123.495 0.004 123.476 -0.088 123.476 -0.206 c
+123.476 -0.374 123.509 -0.496 123.579 -0.573 c
+123.645 -0.654 123.744 -0.69 123.873 -0.69 c
+123.979 -0.69 124.079 -0.669 124.167 -0.617 c
+124.262 -0.569 124.343 -0.507 124.402 -0.426 c
+124.468 -0.349 124.52 -0.261 124.549 -0.162 c
+124.578 -0.056 124.593 0.059 124.593 0.177 c
+h
+127.595 2.219 m
+127.595 0.264 l
+127.595 0.125 127.603 0 127.624 -0.118 c
+127.643 -0.228 127.676 -0.32 127.728 -0.397 c
+127.776 -0.478 127.834 -0.54 127.904 -0.588 c
+127.971 -0.628 128.054 -0.646 128.154 -0.646 c
+128.243 -0.646 128.323 -0.628 128.403 -0.588 c
+128.492 -0.54 128.565 -0.47 128.624 -0.382 c
+128.683 -0.287 128.727 -0.176 128.756 -0.058 c
+128.794 0.066 128.815 0.206 128.815 0.353 c
+128.815 2.219 l
+129.712 2.219 l
+129.712 -0.485 l
+129.712 -0.721 l
+129.719 -0.802 129.727 -0.879 129.727 -0.956 c
+129.727 -1.147 l
+129.735 -1.198 129.741 -1.234 129.741 -1.264 c
+128.889 -1.264 l
+128.878 -1.234 128.867 -1.198 128.86 -1.147 c
+128.86 -0.956 l
+128.86 -0.889 128.852 -0.819 128.845 -0.75 c
+128.845 -0.573 l
+128.83 -0.573 l
+128.713 -0.838 128.559 -1.029 128.374 -1.147 c
+128.198 -1.264 127.996 -1.323 127.772 -1.323 c
+127.566 -1.323 127.393 -1.286 127.258 -1.22 c
+127.117 -1.154 127.007 -1.058 126.919 -0.941 c
+126.838 -0.823 126.78 -0.687 126.743 -0.529 c
+126.714 -0.364 126.699 -0.187 126.699 0 c
+126.699 2.219 l
+h
+131.377 1.602 m
+130.833 1.602 l
+130.833 2.219 l
+131.42 2.219 l
+131.7 3.117 l
+132.274 3.117 l
+132.274 2.219 l
+133.508 2.219 l
+133.508 1.602 l
+132.274 1.602 l
+132.274 -0.103 l
+132.274 -0.324 l
+132.281 -0.393 132.303 -0.455 132.332 -0.515 c
+132.369 -0.566 132.424 -0.61 132.494 -0.646 c
+132.571 -0.676 132.685 -0.69 132.831 -0.69 c
+132.968 -0.69 133.104 -0.687 133.243 -0.676 c
+133.38 -0.658 133.512 -0.632 133.64 -0.603 c
+133.64 -1.205 l
+133.56 -1.216 133.482 -1.231 133.405 -1.249 c
+133.324 -1.261 133.247 -1.268 133.17 -1.278 c
+133.089 -1.286 133.001 -1.293 132.906 -1.293 c
+132.817 -1.301 132.718 -1.309 132.611 -1.309 c
+132.424 -1.309 132.262 -1.293 132.126 -1.264 c
+131.998 -1.228 131.884 -1.183 131.788 -1.132 c
+131.7 -1.084 131.626 -1.025 131.568 -0.956 c
+131.509 -0.879 131.465 -0.802 131.435 -0.721 c
+131.406 -0.632 131.384 -0.544 131.377 -0.455 c
+131.366 -0.36 131.362 -0.264 131.362 -0.176 c
+h
+138.043 0.485 m
+138.043 0.21 138.006 -0.04 137.94 -0.264 c
+137.87 -0.482 137.768 -0.669 137.631 -0.823 c
+137.492 -0.981 137.315 -1.103 137.102 -1.191 c
+136.885 -1.278 136.632 -1.323 136.338 -1.323 c
+136.062 -1.323 135.815 -1.278 135.603 -1.191 c
+135.397 -1.103 135.224 -0.981 135.088 -0.823 c
+134.948 -0.669 134.846 -0.482 134.78 -0.264 c
+134.71 -0.04 134.676 0.21 134.676 0.485 c
+134.676 0.738 134.706 0.974 134.765 1.191 c
+134.831 1.415 134.934 1.606 135.073 1.764 c
+135.21 1.929 135.386 2.058 135.603 2.146 c
+135.815 2.234 136.073 2.278 136.367 2.278 c
+136.679 2.278 136.941 2.234 137.146 2.146 c
+137.359 2.058 137.532 1.929 137.66 1.764 c
+137.797 1.606 137.895 1.415 137.955 1.191 c
+138.013 0.974 138.043 0.738 138.043 0.485 c
+137.087 0.485 m
+137.087 0.69 137.072 0.867 137.043 1.014 c
+137.022 1.161 136.985 1.282 136.926 1.382 c
+136.867 1.477 136.793 1.548 136.705 1.588 c
+136.617 1.635 136.507 1.661 136.382 1.661 c
+136.117 1.661 135.926 1.562 135.809 1.367 c
+135.691 1.18 135.632 0.885 135.632 0.485 c
+135.632 0.062 135.691 -0.243 135.809 -0.426 c
+135.926 -0.613 136.102 -0.706 136.338 -0.706 c
+136.463 -0.706 136.577 -0.687 136.675 -0.646 c
+136.771 -0.599 136.852 -0.526 136.91 -0.426 c
+136.977 -0.331 137.022 -0.206 137.043 -0.058 c
+137.072 0.088 137.087 0.268 137.087 0.485 c
+f
+Q
+q 1 0 0 1 156.4026 334.0088 cm
+0 0 m
+-1.897 0 l
+-1.897 -1.896 l
+0.309 -1.896 l
+0.309 -2.469 l
+-2.573 -2.469 l
+-2.573 2.881 l
+0.278 2.881 l
+0.278 2.308 l
+-1.897 2.308 l
+-1.897 0.588 l
+0 0.588 l
+h
+1.69 1.515 m
+1.705 1.073 l
+1.959 1.415 2.281 1.588 2.675 1.588 c
+3.38 1.588 3.737 1.118 3.748 0.177 c
+3.748 -2.469 l
+3.101 -2.469 l
+3.101 0.147 l
+3.101 0.459 3.046 0.68 2.939 0.809 c
+2.829 0.933 2.675 1 2.468 1 c
+2.311 1 2.164 0.944 2.028 0.838 c
+1.899 0.728 1.797 0.592 1.72 0.426 c
+1.72 -2.469 l
+1.072 -2.469 l
+1.072 1.515 l
+h
+6.761 -2.469 m
+6.721 -2.381 6.695 -2.234 6.688 -2.028 c
+6.453 -2.374 6.158 -2.543 5.805 -2.543 c
+5.442 -2.543 5.159 -2.447 4.953 -2.248 c
+4.755 -2.043 4.659 -1.756 4.659 -1.382 c
+4.659 -0.981 4.795 -0.661 5.071 -0.426 c
+5.342 -0.183 5.718 -0.058 6.188 -0.058 c
+6.673 -0.058 l
+6.673 0.368 l
+6.673 0.603 6.618 0.769 6.511 0.867 c
+6.401 0.974 6.239 1.029 6.026 1.029 c
+5.828 1.029 5.666 0.97 5.541 0.852 c
+5.423 0.735 5.365 0.588 5.365 0.412 c
+4.718 0.412 l
+4.718 0.607 4.777 0.798 4.895 0.985 c
+5.019 1.168 5.181 1.316 5.379 1.426 c
+5.585 1.532 5.813 1.588 6.071 1.588 c
+6.47 1.588 6.776 1.484 6.981 1.279 c
+7.195 1.073 7.309 0.779 7.32 0.397 c
+7.32 -1.617 l
+7.32 -1.922 7.357 -2.186 7.437 -2.41 c
+7.437 -2.469 l
+h
+5.894 -1.955 m
+6.059 -1.955 6.21 -1.911 6.35 -1.822 c
+6.497 -1.735 6.603 -1.624 6.673 -1.484 c
+6.673 -0.544 l
+6.306 -0.544 l
+5.99 -0.544 5.747 -0.613 5.57 -0.75 c
+5.394 -0.878 5.306 -1.066 5.306 -1.308 c
+5.306 -1.536 5.35 -1.701 5.438 -1.808 c
+5.526 -1.907 5.677 -1.955 5.894 -1.955 c
+11.2 -0.676 m
+11.2 -1.294 11.087 -1.76 10.862 -2.072 c
+10.645 -2.389 10.322 -2.543 9.892 -2.543 c
+9.469 -2.543 9.157 -2.363 8.951 -1.999 c
+8.922 -2.469 l
+8.319 -2.469 l
+8.319 3.175 l
+8.966 3.175 l
+8.966 1.073 l
+9.179 1.415 9.487 1.588 9.892 1.588 c
+10.322 1.588 10.645 1.43 10.862 1.118 c
+11.087 0.812 11.2 0.345 11.2 -0.279 c
+h
+10.553 -0.294 m
+10.553 0.177 10.484 0.507 10.348 0.706 c
+10.219 0.9 10.009 1 9.716 1 c
+9.381 1 9.132 0.816 8.966 0.456 c
+8.966 -1.425 l
+9.132 -1.789 9.385 -1.97 9.73 -1.97 c
+10.025 -1.97 10.233 -1.866 10.362 -1.66 c
+10.487 -1.455 10.553 -1.139 10.553 -0.706 c
+h
+12.743 -2.469 -0.646 5.644 re
+15.184 -2.543 m
+14.684 -2.543 14.302 -2.396 14.037 -2.102 c
+13.772 -1.808 13.641 -1.374 13.641 -0.794 c
+13.641 -0.324 l
+13.641 0.272 13.765 0.738 14.023 1.073 c
+14.287 1.415 14.647 1.588 15.11 1.588 c
+15.569 1.588 15.912 1.434 16.139 1.132 c
+16.374 0.838 16.496 0.375 16.506 -0.249 c
+16.506 -0.676 l
+14.287 -0.676 l
+14.287 -0.764 l
+14.287 -1.198 14.364 -1.51 14.522 -1.705 c
+14.688 -1.893 14.919 -1.984 15.213 -1.984 c
+15.407 -1.984 15.581 -1.951 15.727 -1.882 c
+15.874 -1.804 16.01 -1.687 16.139 -1.529 c
+16.477 -1.94 l
+16.19 -2.344 15.76 -2.543 15.184 -2.543 c
+15.11 1.029 m
+14.835 1.029 14.632 0.933 14.507 0.75 c
+14.379 0.563 14.306 0.272 14.287 -0.118 c
+15.86 -0.118 l
+15.86 -0.029 l
+15.837 0.353 15.771 0.621 15.654 0.779 c
+15.536 0.944 15.353 1.029 15.11 1.029 c
+20.946 -1.455 m
+20.946 -1.308 20.891 -1.187 20.784 -1.088 c
+20.674 -0.993 20.468 -0.875 20.167 -0.735 c
+19.821 -0.588 19.579 -0.467 19.432 -0.367 c
+19.285 -0.261 19.174 -0.143 19.108 -0.014 c
+19.039 0.11 19.006 0.268 19.006 0.456 c
+19.006 0.779 19.123 1.047 19.359 1.264 c
+19.594 1.477 19.895 1.588 20.269 1.588 c
+20.652 1.588 20.961 1.474 21.196 1.249 c
+21.431 1.022 21.549 0.735 21.549 0.382 c
+20.901 0.382 l
+20.901 0.559 20.843 0.709 20.725 0.838 c
+20.608 0.963 20.454 1.029 20.269 1.029 c
+20.071 1.029 19.92 0.974 19.814 0.867 c
+19.704 0.769 19.652 0.636 19.652 0.47 c
+19.652 0.341 19.689 0.235 19.77 0.147 c
+19.847 0.066 20.038 -0.037 20.343 -0.162 c
+20.82 -0.349 21.152 -0.536 21.327 -0.72 c
+21.504 -0.897 21.593 -1.124 21.593 -1.396 c
+21.593 -1.749 21.468 -2.028 21.225 -2.234 c
+20.99 -2.44 20.674 -2.543 20.284 -2.543 c
+19.862 -2.543 19.523 -2.425 19.27 -2.19 c
+19.012 -1.947 18.888 -1.643 18.888 -1.278 c
+19.534 -1.278 l
+19.542 -1.506 19.612 -1.683 19.74 -1.808 c
+19.866 -1.926 20.049 -1.984 20.284 -1.984 c
+20.498 -1.984 20.659 -1.936 20.77 -1.837 c
+20.887 -1.741 20.946 -1.613 20.946 -1.455 c
+22.298 -0.294 m
+22.298 0.283 22.434 0.738 22.709 1.073 c
+22.993 1.415 23.363 1.588 23.827 1.588 c
+24.286 1.588 24.654 1.419 24.93 1.087 c
+25.212 0.765 25.36 0.316 25.37 -0.249 c
+25.37 -0.676 l
+25.37 -1.246 25.227 -1.701 24.944 -2.043 c
+24.668 -2.377 24.301 -2.543 23.841 -2.543 c
+23.378 -2.543 23.008 -2.381 22.724 -2.057 c
+22.449 -1.727 22.305 -1.286 22.298 -0.735 c
+h
+22.945 -0.676 m
+22.945 -1.08 23.022 -1.396 23.18 -1.631 c
+23.345 -1.866 23.566 -1.984 23.841 -1.984 c
+24.407 -1.984 24.701 -1.573 24.724 -0.75 c
+24.724 -0.294 l
+24.724 0.106 24.639 0.426 24.473 0.661 c
+24.315 0.904 24.099 1.029 23.827 1.029 c
+23.562 1.029 23.345 0.904 23.18 0.661 c
+23.022 0.426 22.945 0.106 22.945 -0.294 c
+h
+26.825 1.515 m
+26.84 1.147 l
+27.083 1.44 27.402 1.588 27.795 1.588 c
+28.236 1.588 28.545 1.389 28.722 1 c
+28.975 1.389 29.324 1.588 29.765 1.588 c
+30.5 1.588 30.875 1.124 30.897 0.206 c
+30.897 -2.469 l
+30.25 -2.469 l
+30.25 0.147 l
+30.25 0.441 30.195 0.654 30.089 0.794 c
+29.989 0.929 29.817 1 29.574 1 c
+29.376 1 29.214 0.919 29.089 0.765 c
+28.971 0.617 28.901 0.426 28.884 0.191 c
+28.884 -2.469 l
+28.222 -2.469 l
+28.222 0.177 l
+28.222 0.724 28.001 1 27.56 1 c
+27.226 1 26.991 0.838 26.854 0.515 c
+26.854 -2.469 l
+26.208 -2.469 l
+26.208 1.515 l
+h
+33.293 -2.543 m
+32.793 -2.543 32.411 -2.396 32.146 -2.102 c
+31.882 -1.808 31.75 -1.374 31.75 -0.794 c
+31.75 -0.324 l
+31.75 0.272 31.874 0.738 32.132 1.073 c
+32.396 1.415 32.757 1.588 33.219 1.588 c
+33.678 1.588 34.021 1.434 34.249 1.132 c
+34.484 0.838 34.605 0.375 34.615 -0.249 c
+34.615 -0.676 l
+32.396 -0.676 l
+32.396 -0.764 l
+32.396 -1.198 32.473 -1.51 32.631 -1.705 c
+32.797 -1.893 33.028 -1.984 33.322 -1.984 c
+33.517 -1.984 33.69 -1.951 33.837 -1.882 c
+33.983 -1.804 34.12 -1.687 34.249 -1.529 c
+34.586 -1.94 l
+34.299 -2.344 33.869 -2.543 33.293 -2.543 c
+33.219 1.029 m
+32.944 1.029 32.742 0.933 32.616 0.75 c
+32.488 0.563 32.415 0.272 32.396 -0.118 c
+33.969 -0.118 l
+33.969 -0.029 l
+33.947 0.353 33.881 0.621 33.763 0.779 c
+33.646 0.944 33.462 1.029 33.219 1.029 c
+38.496 -1.984 m
+38.71 -1.984 38.883 -1.922 39.011 -1.793 c
+39.147 -1.658 39.22 -1.466 39.232 -1.22 c
+39.849 -1.22 l
+39.826 -1.602 39.691 -1.922 39.437 -2.175 c
+39.18 -2.421 38.868 -2.543 38.496 -2.543 c
+38.004 -2.543 37.63 -2.392 37.364 -2.088 c
+37.107 -1.775 36.982 -1.308 36.982 -0.691 c
+36.982 -0.249 l
+36.982 0.345 37.107 0.801 37.364 1.118 c
+37.63 1.43 38.004 1.588 38.496 1.588 c
+38.897 1.588 39.217 1.455 39.452 1.191 c
+39.694 0.933 39.826 0.588 39.849 0.147 c
+39.232 0.147 l
+39.209 0.441 39.136 0.661 39.011 0.809 c
+38.893 0.956 38.721 1.029 38.496 1.029 c
+38.202 1.029 37.985 0.929 37.85 0.735 c
+37.71 0.547 37.636 0.239 37.63 -0.191 c
+37.63 -0.706 l
+37.63 -1.176 37.695 -1.51 37.835 -1.705 c
+37.981 -1.893 38.202 -1.984 38.496 -1.984 c
+40.466 -0.294 m
+40.466 0.283 40.602 0.738 40.878 1.073 c
+41.16 1.415 41.532 1.588 41.995 1.588 c
+42.454 1.588 42.822 1.419 43.097 1.087 c
+43.38 0.765 43.527 0.316 43.538 -0.249 c
+43.538 -0.676 l
+43.538 -1.246 43.394 -1.701 43.112 -2.043 c
+42.837 -2.377 42.469 -2.543 42.01 -2.543 c
+41.547 -2.543 41.175 -2.381 40.892 -2.057 c
+40.616 -1.727 40.473 -1.286 40.466 -0.735 c
+h
+41.113 -0.676 m
+41.113 -1.08 41.19 -1.396 41.348 -1.631 c
+41.513 -1.866 41.734 -1.984 42.01 -1.984 c
+42.575 -1.984 42.869 -1.573 42.891 -0.75 c
+42.891 -0.294 l
+42.891 0.106 42.806 0.426 42.642 0.661 c
+42.484 0.904 42.266 1.029 41.995 1.029 c
+41.73 1.029 41.513 0.904 41.348 0.661 c
+41.19 0.426 41.113 0.106 41.113 -0.294 c
+h
+45.081 -2.469 -0.646 5.644 re
+45.964 -0.294 m
+45.964 0.283 46.099 0.738 46.375 1.073 c
+46.658 1.415 47.029 1.588 47.492 1.588 c
+47.951 1.588 48.319 1.419 48.595 1.087 c
+48.878 0.765 49.025 0.316 49.035 -0.249 c
+49.035 -0.676 l
+49.035 -1.246 48.892 -1.701 48.609 -2.043 c
+48.333 -2.377 47.966 -2.543 47.507 -2.543 c
+47.044 -2.543 46.673 -2.381 46.39 -2.057 c
+46.114 -1.727 45.971 -1.286 45.964 -0.735 c
+h
+46.61 -0.676 m
+46.61 -1.08 46.687 -1.396 46.845 -1.631 c
+47.011 -1.866 47.232 -1.984 47.507 -1.984 c
+48.073 -1.984 48.367 -1.573 48.389 -0.75 c
+48.389 -0.294 l
+48.389 0.106 48.304 0.426 48.139 0.661 c
+47.981 0.904 47.764 1.029 47.492 1.029 c
+47.228 1.029 47.011 0.904 46.845 0.661 c
+46.687 0.426 46.61 0.106 46.61 -0.294 c
+h
+51.52 0.896 m
+51.431 0.915 51.332 0.927 51.226 0.927 c
+50.891 0.927 50.656 0.742 50.521 0.382 c
+50.521 -2.469 l
+49.873 -2.469 l
+49.873 1.515 l
+50.505 1.515 l
+50.521 1.103 l
+50.696 1.426 50.939 1.588 51.255 1.588 c
+51.362 1.588 51.45 1.565 51.52 1.529 c
+h
+52.872 -2.469 -0.647 3.984 re
+52.917 2.558 m
+52.917 2.448 52.886 2.356 52.828 2.278 c
+52.769 2.209 52.674 2.176 52.549 2.176 c
+52.431 2.176 52.335 2.209 52.269 2.278 c
+52.211 2.356 52.181 2.448 52.181 2.558 c
+52.181 2.675 52.211 2.768 52.269 2.837 c
+52.335 2.914 52.431 2.955 52.549 2.955 c
+52.674 2.955 52.769 2.914 52.828 2.837 c
+52.886 2.756 52.917 2.664 52.917 2.558 c
+54.489 -1.911 m
+56.414 -1.911 l
+56.414 -2.469 l
+53.754 -2.469 l
+53.754 -1.97 l
+55.577 0.941 l
+53.769 0.941 l
+53.769 1.515 l
+56.341 1.515 l
+56.341 1.029 l
+h
+59.236 -2.469 m
+59.196 -2.381 59.171 -2.234 59.163 -2.028 c
+58.928 -2.374 58.634 -2.543 58.282 -2.543 c
+57.918 -2.543 57.634 -2.447 57.428 -2.248 c
+57.23 -2.043 57.135 -1.756 57.135 -1.382 c
+57.135 -0.981 57.27 -0.661 57.546 -0.426 c
+57.818 -0.183 58.193 -0.058 58.664 -0.058 c
+59.148 -0.058 l
+59.148 0.368 l
+59.148 0.603 59.093 0.769 58.987 0.867 c
+58.876 0.974 58.715 1.029 58.502 1.029 c
+58.303 1.029 58.141 0.97 58.016 0.852 c
+57.899 0.735 57.84 0.588 57.84 0.412 c
+57.193 0.412 l
+57.193 0.607 57.252 0.798 57.37 0.985 c
+57.495 1.168 57.657 1.316 57.855 1.426 c
+58.061 1.532 58.288 1.588 58.546 1.588 c
+58.947 1.588 59.252 1.484 59.458 1.279 c
+59.67 1.073 59.784 0.779 59.795 0.397 c
+59.795 -1.617 l
+59.795 -1.922 59.832 -2.186 59.913 -2.41 c
+59.913 -2.469 l
+h
+58.369 -1.955 m
+58.535 -1.955 58.685 -1.911 58.825 -1.822 c
+58.972 -1.735 59.078 -1.624 59.148 -1.484 c
+59.148 -0.544 l
+58.781 -0.544 l
+58.465 -0.544 58.222 -0.613 58.046 -0.75 c
+57.87 -0.878 57.781 -1.066 57.781 -1.308 c
+57.781 -1.536 57.825 -1.701 57.914 -1.808 c
+58.002 -1.907 58.153 -1.955 58.369 -1.955 c
+61.648 2.469 m
+61.648 1.515 l
+62.25 1.515 l
+62.25 0.985 l
+61.648 0.985 l
+61.648 -1.484 l
+61.648 -1.643 61.669 -1.76 61.721 -1.837 c
+61.779 -1.918 61.868 -1.955 61.985 -1.955 c
+62.074 -1.955 62.162 -1.94 62.25 -1.911 c
+62.25 -2.469 l
+62.103 -2.517 61.949 -2.543 61.794 -2.543 c
+61.538 -2.543 61.343 -2.451 61.206 -2.263 c
+61.067 -2.08 61 -1.818 61 -1.484 c
+61 0.985 l
+60.398 0.985 l
+60.398 1.515 l
+61 1.515 l
+61 2.469 l
+h
+63.72 -2.469 -0.647 3.984 re
+63.764 2.558 m
+63.764 2.448 63.735 2.356 63.676 2.278 c
+63.617 2.209 63.522 2.176 63.396 2.176 c
+63.279 2.176 63.184 2.209 63.117 2.278 c
+63.059 2.356 63.03 2.448 63.03 2.558 c
+63.03 2.675 63.059 2.768 63.117 2.837 c
+63.184 2.914 63.279 2.955 63.396 2.955 c
+63.522 2.955 63.617 2.914 63.676 2.837 c
+63.735 2.756 63.764 2.664 63.764 2.558 c
+64.602 -0.294 m
+64.602 0.283 64.738 0.738 65.014 1.073 c
+65.297 1.415 65.667 1.588 66.13 1.588 c
+66.59 1.588 66.957 1.419 67.233 1.087 c
+67.516 0.765 67.663 0.316 67.674 -0.249 c
+67.674 -0.676 l
+67.674 -1.246 67.531 -1.701 67.248 -2.043 c
+66.972 -2.377 66.604 -2.543 66.145 -2.543 c
+65.682 -2.543 65.311 -2.381 65.028 -2.057 c
+64.753 -1.727 64.609 -1.286 64.602 -0.735 c
+h
+65.249 -0.676 m
+65.249 -1.08 65.326 -1.396 65.484 -1.631 c
+65.65 -1.866 65.87 -1.984 66.145 -1.984 c
+66.712 -1.984 67.005 -1.573 67.028 -0.75 c
+67.028 -0.294 l
+67.028 0.106 66.943 0.426 66.777 0.661 c
+66.619 0.904 66.402 1.029 66.13 1.029 c
+65.866 1.029 65.65 0.904 65.484 0.661 c
+65.326 0.426 65.249 0.106 65.249 -0.294 c
+h
+69.129 1.515 m
+69.144 1.073 l
+69.397 1.415 69.721 1.588 70.114 1.588 c
+70.82 1.588 71.176 1.118 71.187 0.177 c
+71.187 -2.469 l
+70.54 -2.469 l
+70.54 0.147 l
+70.54 0.459 70.485 0.68 70.379 0.809 c
+70.269 0.933 70.114 1 69.908 1 c
+69.75 1 69.603 0.944 69.467 0.838 c
+69.339 0.728 69.236 0.592 69.158 0.426 c
+69.158 -2.469 l
+68.512 -2.469 l
+68.512 1.515 l
+h
+73.745 -0.294 m
+73.745 0.283 73.881 0.738 74.157 1.073 c
+74.439 1.415 74.81 1.588 75.273 1.588 c
+75.732 1.588 76.1 1.419 76.376 1.087 c
+76.659 0.765 76.806 0.316 76.817 -0.249 c
+76.817 -0.676 l
+76.817 -1.246 76.673 -1.701 76.391 -2.043 c
+76.115 -2.377 75.747 -2.543 75.288 -2.543 c
+74.825 -2.543 74.454 -2.381 74.171 -2.057 c
+73.895 -1.727 73.752 -1.286 73.745 -0.735 c
+h
+74.392 -0.676 m
+74.392 -1.08 74.469 -1.396 74.627 -1.631 c
+74.792 -1.866 75.013 -1.984 75.288 -1.984 c
+75.854 -1.984 76.148 -1.573 76.17 -0.75 c
+76.17 -0.294 l
+76.17 0.106 76.085 0.426 75.92 0.661 c
+75.762 0.904 75.545 1.029 75.273 1.029 c
+75.009 1.029 74.792 0.904 74.627 0.661 c
+74.469 0.426 74.392 0.106 74.392 -0.294 c
+h
+77.949 -2.469 m
+77.949 0.985 l
+77.419 0.985 l
+77.419 1.515 l
+77.949 1.515 l
+77.949 1.97 l
+77.949 2.371 78.044 2.683 78.242 2.911 c
+78.448 3.134 78.728 3.248 79.08 3.248 c
+79.217 3.248 79.349 3.227 79.477 3.19 c
+79.448 2.646 l
+79.349 2.664 79.25 2.675 79.154 2.675 c
+78.779 2.675 78.595 2.411 78.595 1.881 c
+78.595 1.515 l
+79.271 1.515 l
+79.271 0.985 l
+78.595 0.985 l
+78.595 -2.469 l
+h
+85.195 -1.808 m
+85.078 -1.955 l
+84.744 -2.348 84.247 -2.543 83.593 -2.543 c
+83.013 -2.543 82.556 -2.352 82.226 -1.97 c
+81.903 -1.587 81.733 -1.043 81.726 -0.338 c
+81.726 0.706 l
+81.726 1.459 81.873 2.022 82.167 2.396 c
+82.469 2.768 82.921 2.955 83.52 2.955 c
+84.027 2.955 84.424 2.811 84.71 2.529 c
+85.004 2.242 85.166 1.837 85.195 1.309 c
+84.519 1.309 l
+84.497 1.639 84.405 1.9 84.239 2.087 c
+84.081 2.282 83.846 2.381 83.534 2.381 c
+83.141 2.381 82.858 2.253 82.682 1.999 c
+82.506 1.742 82.41 1.341 82.402 0.794 c
+82.402 -0.294 l
+82.402 -0.834 82.506 -1.249 82.711 -1.543 c
+82.917 -1.83 83.211 -1.97 83.593 -1.97 c
+83.953 -1.97 84.233 -1.882 84.431 -1.705 c
+84.519 -1.617 l
+84.519 -0.382 l
+83.549 -0.382 l
+83.549 0.191 l
+85.195 0.191 l
+h
+86.915 -2.469 -0.646 3.984 re
+86.959 2.558 m
+86.959 2.448 86.93 2.356 86.871 2.278 c
+86.812 2.209 86.716 2.176 86.591 2.176 c
+86.474 2.176 86.379 2.209 86.313 2.278 c
+86.254 2.356 86.224 2.448 86.224 2.558 c
+86.224 2.675 86.254 2.768 86.313 2.837 c
+86.379 2.914 86.474 2.955 86.591 2.955 c
+86.716 2.955 86.812 2.914 86.871 2.837 c
+86.93 2.756 86.959 2.664 86.959 2.558 c
+88.781 2.469 m
+88.781 1.515 l
+89.384 1.515 l
+89.384 0.985 l
+88.781 0.985 l
+88.781 -1.484 l
+88.781 -1.643 88.804 -1.76 88.856 -1.837 c
+88.914 -1.918 89.002 -1.955 89.12 -1.955 c
+89.208 -1.955 89.296 -1.94 89.384 -1.911 c
+89.384 -2.469 l
+89.238 -2.517 89.083 -2.543 88.929 -2.543 c
+88.671 -2.543 88.477 -2.451 88.341 -2.263 c
+88.201 -2.08 88.135 -1.818 88.135 -1.484 c
+88.135 0.985 l
+87.532 0.985 l
+87.532 1.515 l
+88.135 1.515 l
+88.135 2.469 l
+h
+91.736 -0.294 m
+91.736 0.283 91.873 0.738 92.148 1.073 c
+92.43 1.415 92.802 1.588 93.265 1.588 c
+93.724 1.588 94.092 1.419 94.367 1.087 c
+94.651 0.765 94.797 0.316 94.809 -0.249 c
+94.809 -0.676 l
+94.809 -1.246 94.665 -1.701 94.382 -2.043 c
+94.107 -2.377 93.739 -2.543 93.28 -2.543 c
+92.817 -2.543 92.446 -2.381 92.162 -2.057 c
+91.887 -1.727 91.744 -1.286 91.736 -0.735 c
+h
+92.383 -0.676 m
+92.383 -1.08 92.461 -1.396 92.619 -1.631 c
+92.783 -1.866 93.004 -1.984 93.28 -1.984 c
+93.845 -1.984 94.14 -1.573 94.161 -0.75 c
+94.161 -0.294 l
+94.161 0.106 94.077 0.426 93.912 0.661 c
+93.754 0.904 93.537 1.029 93.265 1.029 c
+93.001 1.029 92.783 0.904 92.619 0.661 c
+92.461 0.426 92.383 0.106 92.383 -0.294 c
+h
+97.675 -2.117 m
+97.458 -2.404 97.145 -2.543 96.734 -2.543 c
+96.37 -2.543 96.095 -2.421 95.911 -2.175 c
+95.734 -1.922 95.639 -1.558 95.632 -1.088 c
+95.632 1.515 l
+96.278 1.515 l
+96.278 -1.029 l
+96.278 -1.658 96.462 -1.97 96.837 -1.97 c
+97.238 -1.97 97.513 -1.793 97.66 -1.44 c
+97.66 1.515 l
+98.307 1.515 l
+98.307 -2.469 l
+97.689 -2.469 l
+h
+100.145 2.469 m
+100.145 1.515 l
+100.747 1.515 l
+100.747 0.985 l
+100.145 0.985 l
+100.145 -1.484 l
+100.145 -1.643 100.166 -1.76 100.218 -1.837 c
+100.276 -1.918 100.365 -1.955 100.482 -1.955 c
+100.571 -1.955 100.659 -1.94 100.747 -1.911 c
+100.747 -2.469 l
+100.6 -2.517 100.446 -2.543 100.291 -2.543 c
+100.034 -2.543 99.839 -2.451 99.703 -2.263 c
+99.563 -2.08 99.497 -1.818 99.497 -1.484 c
+99.497 0.985 l
+98.894 0.985 l
+98.894 1.515 l
+99.497 1.515 l
+99.497 2.469 l
+h
+104.392 -0.676 m
+104.392 -1.305 104.274 -1.775 104.039 -2.088 c
+103.812 -2.392 103.495 -2.543 103.084 -2.543 c
+102.68 -2.543 102.371 -2.392 102.158 -2.088 c
+102.158 -3.998 l
+101.511 -3.998 l
+101.511 1.515 l
+102.099 1.515 l
+102.144 1.073 l
+102.356 1.415 102.665 1.588 103.069 1.588 c
+103.51 1.588 103.837 1.434 104.054 1.132 c
+104.267 0.827 104.382 0.372 104.392 -0.235 c
+h
+103.746 -0.294 m
+103.746 0.147 103.676 0.47 103.54 0.676 c
+103.4 0.889 103.179 1 102.878 1 c
+102.562 1 102.323 0.846 102.158 0.544 c
+102.158 -1.529 l
+102.323 -1.834 102.562 -1.984 102.878 -1.984 c
+103.172 -1.984 103.385 -1.882 103.525 -1.675 c
+103.661 -1.463 103.734 -1.132 103.746 -0.691 c
+h
+107.258 -2.117 m
+107.042 -2.404 106.73 -2.543 106.318 -2.543 c
+105.954 -2.543 105.678 -2.421 105.495 -2.175 c
+105.319 -1.922 105.223 -1.558 105.215 -1.088 c
+105.215 1.515 l
+105.862 1.515 l
+105.862 -1.029 l
+105.862 -1.658 106.046 -1.97 106.42 -1.97 c
+106.821 -1.97 107.097 -1.793 107.244 -1.44 c
+107.244 1.515 l
+107.891 1.515 l
+107.891 -2.469 l
+107.273 -2.469 l
+h
+109.728 2.469 m
+109.728 1.515 l
+110.331 1.515 l
+110.331 0.985 l
+109.728 0.985 l
+109.728 -1.484 l
+109.728 -1.643 109.75 -1.76 109.801 -1.837 c
+109.86 -1.918 109.948 -1.955 110.066 -1.955 c
+110.154 -1.955 110.242 -1.94 110.331 -1.911 c
+110.331 -2.469 l
+110.183 -2.517 110.029 -2.543 109.875 -2.543 c
+109.618 -2.543 109.423 -2.451 109.287 -2.263 c
+109.147 -2.08 109.082 -1.818 109.082 -1.484 c
+109.082 0.985 l
+108.479 0.985 l
+108.479 1.515 l
+109.082 1.515 l
+109.082 2.469 l
+h
+111.139 -2.117 m
+111.139 -1.999 111.172 -1.903 111.242 -1.822 c
+111.308 -1.745 111.411 -1.705 111.551 -1.705 c
+111.698 -1.705 111.804 -1.745 111.874 -1.822 c
+111.951 -1.903 111.991 -1.999 111.991 -2.117 c
+111.991 -2.227 111.951 -2.319 111.874 -2.396 c
+111.804 -2.473 111.698 -2.514 111.551 -2.514 c
+111.411 -2.514 111.308 -2.473 111.242 -2.396 c
+111.172 -2.319 111.139 -2.227 111.139 -2.117 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+35.668 318.604 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 140.2002 303.1149 cm
+0 0 m
+-5.513 0 l
+-5.513 1.294 l
+-2.984 4.513 l
+-2.66 4.954 -2.425 5.34 -2.278 5.675 c
+-2.124 6.016 -2.043 6.34 -2.043 6.644 c
+-2.043 7.063 -2.117 7.394 -2.263 7.629 c
+-2.404 7.865 -2.61 7.982 -2.881 7.982 c
+-3.175 7.982 -3.41 7.842 -3.587 7.57 c
+-3.763 7.294 -3.851 6.909 -3.851 6.409 c
+-5.674 6.409 l
+-5.674 6.986 -5.556 7.512 -5.321 7.982 c
+-5.079 8.46 -4.74 8.835 -4.307 9.099 c
+-3.877 9.363 -3.392 9.496 -2.851 9.496 c
+-2.022 9.496 -1.374 9.264 -0.912 8.805 c
+-0.441 8.342 -0.206 7.688 -0.206 6.835 c
+-0.206 6.306 -0.339 5.77 -0.603 5.233 c
+-0.86 4.693 -1.32 4.028 -1.985 3.234 c
+-3.19 1.515 l
+0 1.515 l
+h
+1.532 0.927 m
+1.532 1.22 1.627 1.459 1.826 1.646 c
+2.021 1.831 2.275 1.926 2.591 1.926 c
+2.892 1.926 3.142 1.831 3.341 1.646 c
+3.546 1.459 3.649 1.22 3.649 0.927 c
+3.649 0.621 3.546 0.375 3.341 0.191 c
+3.142 0.015 2.892 -0.073 2.591 -0.073 c
+2.286 -0.073 2.032 0.019 1.826 0.206 c
+1.627 0.389 1.532 0.632 1.532 0.927 c
+12.49 2.455 m
+12.49 2.837 12.391 3.124 12.197 3.323 c
+11.998 3.517 11.645 3.719 11.138 3.925 c
+10.198 4.285 9.521 4.704 9.109 5.174 c
+8.698 5.652 8.492 6.222 8.492 6.88 c
+8.492 7.662 8.771 8.295 9.33 8.775 c
+9.889 9.253 10.597 9.496 11.461 9.496 c
+12.039 9.496 12.553 9.371 13.005 9.128 c
+13.454 8.882 13.799 8.54 14.034 8.1 c
+14.277 7.659 14.401 7.159 14.401 6.6 c
+12.519 6.6 l
+12.519 7.041 12.424 7.372 12.241 7.599 c
+12.053 7.824 11.785 7.938 11.432 7.938 c
+11.098 7.938 10.836 7.838 10.653 7.644 c
+10.477 7.456 10.389 7.196 10.389 6.865 c
+10.389 6.608 10.491 6.373 10.697 6.159 c
+10.903 5.953 11.263 5.737 11.785 5.513 c
+12.696 5.189 13.358 4.785 13.77 4.307 c
+14.188 3.826 14.401 3.212 14.401 2.469 c
+14.401 1.654 14.14 1.018 13.622 0.559 c
+13.101 0.096 12.395 -0.132 11.505 -0.132 c
+10.896 -0.132 10.344 -0.007 9.845 0.235 c
+9.352 0.489 8.966 0.846 8.683 1.309 c
+8.397 1.779 8.257 2.326 8.257 2.955 c
+10.153 2.955 l
+10.153 2.415 10.256 2.022 10.462 1.779 c
+10.675 1.532 11.025 1.411 11.505 1.411 c
+12.16 1.411 12.49 1.757 12.49 2.455 c
+21.938 7.791 m
+19.615 7.791 l
+19.615 0 l
+17.72 0 l
+17.72 7.791 l
+15.441 7.791 l
+15.441 9.363 l
+21.938 9.363 l
+h
+26.896 1.912 m
+24.323 1.912 l
+23.823 0 l
+21.824 0 l
+24.749 9.363 l
+26.47 9.363 l
+29.424 0 l
+27.395 0 l
+h
+24.735 3.499 m
+26.484 3.499 l
+25.602 6.835 l
+h
+33.363 3.425 m
+32.423 3.425 l
+32.423 0 l
+30.541 0 l
+30.541 9.363 l
+33.554 9.363 l
+34.503 9.363 35.234 9.118 35.744 8.628 c
+36.263 8.136 36.523 7.441 36.523 6.541 c
+36.523 5.295 36.072 4.424 35.171 3.925 c
+36.803 0.088 l
+36.803 0 l
+34.774 0 l
+h
+32.423 4.998 m
+33.495 4.998 l
+33.878 4.998 34.16 5.12 34.348 5.365 c
+34.532 5.619 34.627 5.957 34.627 6.38 c
+34.627 7.321 34.264 7.791 33.539 7.791 c
+32.423 7.791 l
+h
+43.792 7.791 m
+41.47 7.791 l
+41.47 0 l
+39.573 0 l
+39.573 7.791 l
+37.295 7.791 l
+37.295 9.363 l
+43.792 9.363 l
+h
+47.062 0 -1.896 9.363 re
+55.309 0 m
+53.412 0 l
+50.649 6.145 l
+50.649 0 l
+48.753 0 l
+48.753 9.363 l
+50.649 9.363 l
+53.412 3.219 l
+53.412 9.363 l
+55.309 9.363 l
+h
+63.427 1.058 m
+63.062 0.665 62.617 0.368 62.089 0.162 c
+61.559 -0.033 60.979 -0.132 60.354 -0.132 c
+59.274 -0.132 58.436 0.198 57.84 0.867 c
+57.241 1.532 56.936 2.502 56.929 3.778 c
+56.929 5.469 l
+56.929 6.762 57.208 7.755 57.767 8.453 c
+58.333 9.147 59.157 9.496 60.236 9.496 c
+61.254 9.496 62.019 9.239 62.53 8.732 c
+63.047 8.231 63.346 7.445 63.427 6.38 c
+61.589 6.38 l
+61.538 6.975 61.416 7.383 61.221 7.599 c
+61.023 7.813 60.714 7.923 60.296 7.923 c
+59.785 7.923 59.413 7.736 59.178 7.364 c
+58.951 6.99 58.833 6.398 58.825 5.586 c
+58.825 3.881 l
+58.825 3.028 58.951 2.404 59.207 2.014 c
+59.461 1.632 59.876 1.441 60.457 1.441 c
+60.828 1.441 61.133 1.515 61.368 1.661 c
+61.53 1.779 l
+61.53 3.499 l
+60.207 3.499 l
+60.207 4.925 l
+63.427 4.925 l
+h
+72.591 1.912 m
+70.019 1.912 l
+69.519 0 l
+67.52 0 l
+70.445 9.363 l
+72.165 9.363 l
+75.119 0 l
+73.091 0 l
+h
+70.43 3.499 m
+72.179 3.499 l
+71.298 6.835 l
+h
+81.238 3.293 m
+81.238 0 l
+79.342 0 l
+79.342 9.363 l
+82.531 9.363 l
+83.461 9.363 84.2 9.073 84.751 8.497 c
+85.299 7.927 85.574 7.181 85.574 6.263 c
+85.574 5.351 85.299 4.623 84.751 4.087 c
+84.21 3.558 83.461 3.293 82.502 3.293 c
+h
+81.238 4.866 m
+82.531 4.866 l
+82.891 4.866 83.171 4.983 83.369 5.218 c
+83.564 5.453 83.663 5.795 83.663 6.247 c
+83.663 6.718 83.56 7.088 83.354 7.364 c
+83.156 7.637 82.891 7.78 82.561 7.791 c
+81.238 7.791 l
+h
+89.877 3.425 m
+88.937 3.425 l
+88.937 0 l
+87.055 0 l
+87.055 9.363 l
+90.068 9.363 l
+91.017 9.363 91.747 9.118 92.258 8.628 c
+92.777 8.136 93.037 7.441 93.037 6.541 c
+93.037 5.295 92.586 4.424 91.685 3.925 c
+93.317 0.088 l
+93.317 0 l
+91.288 0 l
+h
+88.937 4.998 m
+90.01 4.998 l
+90.392 4.998 90.675 5.12 90.862 5.365 c
+91.046 5.619 91.142 5.957 91.142 6.38 c
+91.142 7.321 90.778 7.791 90.053 7.791 c
+88.937 7.791 l
+h
+101.155 3.836 m
+101.155 2.58 100.854 1.606 100.258 0.912 c
+99.659 0.214 98.836 -0.132 97.789 -0.132 c
+96.738 -0.132 95.911 0.21 95.304 0.897 c
+94.706 1.592 94.4 2.558 94.394 3.793 c
+94.394 5.395 l
+94.394 6.677 94.691 7.68 95.29 8.408 c
+95.886 9.132 96.716 9.496 97.774 9.496 c
+98.811 9.496 99.63 9.136 100.229 8.422 c
+100.835 7.717 101.144 6.722 101.155 5.439 c
+h
+99.259 5.409 m
+99.259 6.251 99.134 6.88 98.891 7.291 c
+98.656 7.703 98.282 7.909 97.774 7.909 c
+97.274 7.909 96.9 7.707 96.657 7.306 c
+96.422 6.913 96.297 6.313 96.289 5.513 c
+96.289 3.836 l
+96.289 3.021 96.411 2.419 96.657 2.029 c
+96.9 1.636 97.278 1.441 97.789 1.441 c
+98.278 1.441 98.641 1.632 98.876 2.014 c
+99.119 2.396 99.248 2.984 99.259 3.778 c
+h
+105.814 9.363 m
+107.696 9.363 l
+107.696 2.882 l
+107.696 1.97 107.439 1.239 106.932 0.691 c
+106.432 0.14 105.785 -0.132 104.991 -0.132 c
+104.128 -0.132 103.456 0.121 102.978 0.632 c
+102.508 1.139 102.272 1.852 102.272 2.764 c
+104.168 2.764 l
+104.168 1.881 104.44 1.441 104.991 1.441 c
+105.539 1.441 105.814 1.948 105.814 2.97 c
+h
+114.208 4.057 m
+111.268 4.057 l
+111.268 1.573 l
+114.751 1.573 l
+114.751 0 l
+109.372 0 l
+109.372 9.363 l
+114.737 9.363 l
+114.737 7.791 l
+111.268 7.791 l
+111.268 5.571 l
+114.208 5.571 l
+h
+122.362 3.117 m
+122.31 2.047 122.009 1.239 121.45 0.691 c
+120.899 0.14 120.128 -0.132 119.129 -0.132 c
+118.059 -0.132 117.24 0.214 116.673 0.912 c
+116.115 1.606 115.836 2.602 115.836 3.896 c
+115.836 5.469 l
+115.836 6.762 116.122 7.755 116.703 8.453 c
+117.291 9.147 118.103 9.496 119.143 9.496 c
+120.161 9.496 120.937 9.205 121.465 8.628 c
+121.995 8.059 122.296 7.24 122.377 6.174 c
+120.481 6.174 l
+120.459 6.839 120.355 7.294 120.172 7.541 c
+119.985 7.794 119.643 7.923 119.143 7.923 c
+118.643 7.923 118.283 7.747 118.07 7.394 c
+117.864 7.041 117.75 6.457 117.732 5.644 c
+117.732 3.881 l
+117.732 2.947 117.835 2.308 118.04 1.955 c
+118.254 1.61 118.618 1.441 119.129 1.441 c
+119.617 1.441 119.956 1.559 120.143 1.794 c
+120.338 2.036 120.444 2.477 120.466 3.117 c
+h
+129.624 7.791 m
+127.301 7.791 l
+127.301 0 l
+125.405 0 l
+125.405 7.791 l
+123.127 7.791 l
+123.127 9.363 l
+129.624 9.363 l
+h
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 288.302 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 281.4638 cm
+0 0 m
+0 -0.188 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.776 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.206 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.148 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.675 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.263 -0.941 1.205 c
+-0.756 1.146 -0.595 1.066 -0.455 0.97 c
+-0.32 0.87 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.499 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.558 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.754 5.964 -1.86 6.064 -1.941 c
+6.159 -2.029 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.029 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.324 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.245 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.969 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.164 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.636 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.5 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.499 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.383 c
+6.924 -0.294 6.978 -0.177 7.019 -0.03 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.116 l
+14.497 3.116 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.104 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.456 14.556 -0.515 c
+14.593 -0.566 14.648 -0.611 14.718 -0.647 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.688 15.468 -0.676 c
+15.603 -0.659 15.736 -0.632 15.865 -0.603 c
+15.865 -1.206 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.279 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.085 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.456 c
+13.59 -0.36 13.586 -0.265 13.586 -0.177 c
+h
+23.221 -0.647 m
+24.353 -0.647 l
+24.353 -1.264 l
+21.045 -1.264 l
+21.045 -0.647 l
+22.31 -0.647 l
+22.31 1.602 l
+21.384 1.602 l
+21.384 2.219 l
+23.221 2.219 l
+h
+22.31 3.513 0.912 -0.676 re
+22.31 2.836 m
+27.37 -1.264 m
+27.37 0.72 l
+27.37 1.022 27.326 1.242 27.237 1.381 c
+27.156 1.529 27.021 1.602 26.826 1.602 c
+26.716 1.602 26.613 1.576 26.518 1.529 c
+26.429 1.477 26.348 1.411 26.282 1.323 c
+26.223 1.234 26.172 1.124 26.136 0.999 c
+26.106 0.881 26.091 0.75 26.091 0.602 c
+26.091 -1.264 l
+25.18 -1.264 l
+25.18 1.44 l
+25.18 1.66 l
+25.18 1.749 25.172 1.826 25.165 1.896 c
+25.165 2.087 l
+25.165 2.219 l
+26.018 2.219 l
+26.025 2.19 26.032 2.146 26.032 2.087 c
+26.032 1.896 l
+26.04 1.826 26.047 1.756 26.047 1.69 c
+26.055 1.62 26.061 1.565 26.061 1.529 c
+26.076 1.529 l
+26.194 1.793 26.344 1.984 26.532 2.102 c
+26.716 2.219 26.936 2.278 27.194 2.278 c
+27.377 2.278 27.539 2.248 27.678 2.19 c
+27.815 2.131 27.929 2.043 28.017 1.926 c
+28.105 1.808 28.168 1.664 28.208 1.499 c
+28.255 1.341 28.281 1.153 28.281 0.941 c
+28.281 -1.264 l
+h
+31.343 -0.647 m
+32.474 -0.647 l
+32.474 -1.264 l
+29.167 -1.264 l
+29.167 -0.647 l
+30.431 -0.647 l
+30.431 1.602 l
+29.505 1.602 l
+29.505 2.219 l
+31.343 2.219 l
+h
+30.431 3.513 0.912 -0.676 re
+30.431 2.836 m
+33.907 1.602 m
+33.363 1.602 l
+33.363 2.219 l
+33.951 2.219 l
+34.231 3.116 l
+34.804 3.116 l
+34.804 2.219 l
+36.039 2.219 l
+36.039 1.602 l
+34.804 1.602 l
+34.804 -0.104 l
+34.804 -0.324 l
+34.811 -0.393 34.834 -0.456 34.863 -0.515 c
+34.9 -0.566 34.955 -0.611 35.025 -0.647 c
+35.102 -0.676 35.216 -0.691 35.362 -0.691 c
+35.499 -0.691 35.634 -0.688 35.774 -0.676 c
+35.91 -0.659 36.043 -0.632 36.17 -0.603 c
+36.17 -1.206 l
+36.091 -1.216 36.013 -1.231 35.935 -1.249 c
+35.855 -1.261 35.778 -1.268 35.7 -1.279 c
+35.62 -1.286 35.532 -1.294 35.436 -1.294 c
+35.348 -1.301 35.249 -1.309 35.142 -1.309 c
+34.955 -1.309 34.793 -1.294 34.657 -1.264 c
+34.528 -1.228 34.414 -1.183 34.319 -1.132 c
+34.231 -1.085 34.157 -1.025 34.098 -0.956 c
+34.04 -0.879 33.995 -0.802 33.966 -0.721 c
+33.937 -0.632 33.915 -0.544 33.907 -0.456 c
+33.897 -0.36 33.893 -0.265 33.893 -0.177 c
+h
+42.175 -2.631 m
+42.175 3.513 l
+44.101 3.513 l
+44.101 2.896 l
+43.028 2.896 l
+43.028 -2.014 l
+44.101 -2.014 l
+44.101 -2.631 l
+h
+46.354 2.219 m
+46.362 2.198 46.368 2.164 46.368 2.117 c
+46.376 2.076 46.383 2.028 46.383 1.969 c
+46.391 1.918 46.398 1.866 46.398 1.808 c
+46.398 1.646 l
+46.412 1.646 l
+46.472 1.764 46.537 1.859 46.618 1.94 c
+46.695 2.017 46.78 2.08 46.869 2.131 c
+46.956 2.19 47.044 2.227 47.133 2.248 c
+47.228 2.267 47.328 2.278 47.426 2.278 c
+47.632 2.278 47.813 2.234 47.97 2.146 c
+48.125 2.057 48.253 1.928 48.353 1.764 c
+48.459 1.606 48.536 1.415 48.588 1.19 c
+48.647 0.974 48.676 0.738 48.676 0.484 c
+48.676 0.22 48.647 -0.026 48.588 -0.25 c
+48.536 -0.467 48.459 -0.659 48.353 -0.823 c
+48.253 -0.981 48.122 -1.103 47.956 -1.191 c
+47.798 -1.279 47.611 -1.324 47.397 -1.324 c
+47.298 -1.324 47.199 -1.312 47.104 -1.294 c
+47.004 -1.272 46.912 -1.243 46.824 -1.191 c
+46.743 -1.143 46.666 -1.081 46.589 -1 c
+46.519 -0.923 46.46 -0.831 46.412 -0.721 c
+46.398 -0.721 l
+46.398 -0.809 l
+46.405 -0.85 46.412 -0.897 46.412 -0.956 c
+46.412 -1.118 l
+46.412 -1.294 l
+46.412 -2.631 l
+45.501 -2.631 l
+45.501 1.455 l
+45.501 1.62 45.494 1.768 45.487 1.896 c
+45.487 2.219 l
+h
+46.398 0.455 m
+46.398 0.228 46.416 0.037 46.457 -0.118 c
+46.505 -0.265 46.559 -0.383 46.618 -0.47 c
+46.684 -0.559 46.758 -0.625 46.838 -0.661 c
+46.916 -0.702 46.993 -0.721 47.074 -0.721 c
+47.17 -0.721 47.258 -0.698 47.339 -0.647 c
+47.426 -0.599 47.493 -0.53 47.544 -0.441 c
+47.603 -0.345 47.648 -0.221 47.677 -0.073 c
+47.713 0.081 47.735 0.268 47.735 0.484 c
+47.735 0.874 47.677 1.168 47.559 1.367 c
+47.449 1.562 47.295 1.66 47.089 1.66 c
+47.008 1.66 46.931 1.639 46.854 1.602 c
+46.773 1.562 46.699 1.499 46.633 1.411 c
+46.563 1.323 46.505 1.198 46.457 1.043 c
+46.416 0.885 46.398 0.69 46.398 0.455 c
+52.56 1.469 m
+52.461 1.477 52.359 1.488 52.251 1.499 c
+52.141 1.517 52.02 1.529 51.885 1.529 c
+51.708 1.529 51.55 1.488 51.414 1.411 c
+51.274 1.341 51.156 1.242 51.061 1.117 c
+50.973 0.988 50.903 0.841 50.855 0.675 c
+50.815 0.507 50.796 0.33 50.796 0.147 c
+50.796 -1.264 l
+49.9 -1.264 l
+49.9 0.985 l
+49.9 1.109 49.889 1.234 49.87 1.352 c
+49.859 1.477 49.845 1.595 49.826 1.705 c
+49.815 1.822 49.801 1.918 49.782 1.999 c
+49.76 2.087 49.742 2.161 49.724 2.219 c
+50.605 2.219 l
+50.613 2.167 50.624 2.117 50.635 2.057 c
+50.653 1.999 50.668 1.932 50.679 1.866 c
+50.697 1.808 50.712 1.741 50.723 1.675 c
+50.73 1.606 50.742 1.543 50.752 1.484 c
+50.767 1.484 l
+50.804 1.602 50.855 1.708 50.914 1.808 c
+50.981 1.903 51.061 1.988 51.149 2.057 c
+51.237 2.124 51.341 2.179 51.458 2.219 c
+51.583 2.256 51.73 2.278 51.899 2.278 c
+52.024 2.278 52.141 2.271 52.251 2.263 c
+52.369 2.252 52.473 2.238 52.56 2.219 c
+h
+56.816 0.484 m
+56.816 0.209 56.779 -0.04 56.712 -0.265 c
+56.643 -0.482 56.54 -0.669 56.404 -0.823 c
+56.265 -0.981 56.088 -1.103 55.875 -1.191 c
+55.658 -1.279 55.405 -1.324 55.11 -1.324 c
+54.835 -1.324 54.589 -1.279 54.376 -1.191 c
+54.17 -1.103 53.997 -0.981 53.861 -0.823 c
+53.722 -0.669 53.618 -0.482 53.553 -0.265 c
+53.483 -0.04 53.45 0.209 53.45 0.484 c
+53.45 0.738 53.479 0.974 53.537 1.19 c
+53.604 1.415 53.707 1.606 53.847 1.764 c
+53.982 1.928 54.159 2.057 54.376 2.146 c
+54.589 2.234 54.846 2.278 55.14 2.278 c
+55.453 2.278 55.713 2.234 55.919 2.146 c
+56.132 2.057 56.305 1.928 56.434 1.764 c
+56.569 1.606 56.669 1.415 56.728 1.19 c
+56.787 0.974 56.816 0.738 56.816 0.484 c
+55.86 0.484 m
+55.86 0.69 55.846 0.867 55.816 1.014 c
+55.794 1.161 55.758 1.282 55.698 1.381 c
+55.64 1.477 55.567 1.547 55.478 1.587 c
+55.39 1.635 55.28 1.66 55.155 1.66 c
+54.89 1.66 54.699 1.562 54.582 1.367 c
+54.464 1.18 54.405 0.885 54.405 0.484 c
+54.405 0.062 54.464 -0.243 54.582 -0.426 c
+54.699 -0.614 54.875 -0.706 55.11 -0.706 c
+55.236 -0.706 55.349 -0.688 55.449 -0.647 c
+55.544 -0.599 55.625 -0.526 55.684 -0.426 c
+55.75 -0.331 55.794 -0.206 55.816 -0.059 c
+55.846 0.087 55.86 0.268 55.86 0.484 c
+59.995 -1.309 m
+59.995 -1.544 59.951 -1.742 59.862 -1.912 c
+59.781 -2.076 59.675 -2.213 59.538 -2.323 c
+59.399 -2.429 59.245 -2.506 59.068 -2.558 c
+58.892 -2.606 58.709 -2.631 58.524 -2.631 c
+58.436 -2.631 58.348 -2.624 58.26 -2.617 c
+58.172 -2.606 58.083 -2.595 57.996 -2.587 c
+57.915 -2.577 57.841 -2.562 57.775 -2.543 c
+57.705 -2.533 57.647 -2.517 57.599 -2.5 c
+57.599 -1.823 l
+57.687 -1.841 57.805 -1.86 57.951 -1.882 c
+58.098 -1.912 58.26 -1.926 58.436 -1.926 c
+58.532 -1.926 58.62 -1.914 58.701 -1.897 c
+58.778 -1.874 58.848 -1.841 58.906 -1.794 c
+58.966 -1.742 59.01 -1.669 59.039 -1.573 c
+59.068 -1.484 59.083 -1.371 59.083 -1.235 c
+59.083 1.602 l
+57.951 1.602 l
+57.951 2.219 l
+59.995 2.219 l
+h
+59.098 3.513 0.897 -0.676 re
+59.098 2.836 m
+63.291 -1.324 m
+63.033 -1.324 62.806 -1.286 62.6 -1.22 c
+62.395 -1.143 62.218 -1.029 62.071 -0.882 c
+61.924 -0.728 61.806 -0.537 61.718 -0.309 c
+61.637 -0.085 61.601 0.18 61.601 0.484 c
+61.601 0.816 61.645 1.095 61.732 1.323 c
+61.828 1.558 61.957 1.741 62.115 1.881 c
+62.28 2.017 62.468 2.117 62.673 2.175 c
+62.879 2.242 63.089 2.278 63.305 2.278 c
+63.577 2.278 63.812 2.227 64.011 2.131 c
+64.217 2.043 64.382 1.911 64.511 1.734 c
+64.647 1.565 64.746 1.359 64.805 1.117 c
+64.871 0.881 64.907 0.617 64.907 0.323 c
+64.907 0.309 l
+62.541 0.309 l
+62.541 0.162 62.555 0.022 62.586 -0.104 c
+62.622 -0.231 62.677 -0.345 62.746 -0.441 c
+62.813 -0.53 62.898 -0.599 62.997 -0.647 c
+63.093 -0.698 63.206 -0.721 63.335 -0.721 c
+63.49 -0.721 63.629 -0.688 63.746 -0.618 c
+63.872 -0.551 63.96 -0.449 64.011 -0.309 c
+64.849 -0.383 l
+64.82 -0.482 64.764 -0.588 64.687 -0.706 c
+64.606 -0.816 64.504 -0.919 64.379 -1.014 c
+64.261 -1.103 64.107 -1.176 63.922 -1.235 c
+63.746 -1.294 63.533 -1.324 63.291 -1.324 c
+63.291 1.705 m
+63.203 1.705 63.114 1.69 63.026 1.66 c
+62.938 1.631 62.857 1.579 62.791 1.514 c
+62.721 1.444 62.663 1.356 62.615 1.249 c
+62.574 1.139 62.555 1.014 62.555 0.867 c
+64.026 0.867 l
+64.026 1.003 64 1.124 63.952 1.234 c
+63.912 1.341 63.856 1.429 63.791 1.499 c
+63.731 1.565 63.658 1.616 63.57 1.646 c
+63.482 1.683 63.386 1.705 63.291 1.705 c
+67.351 -1.324 m
+67.064 -1.324 66.823 -1.283 66.617 -1.206 c
+66.411 -1.118 66.237 -0.996 66.102 -0.838 c
+65.962 -0.684 65.859 -0.497 65.793 -0.279 c
+65.724 -0.056 65.69 0.191 65.69 0.455 c
+65.69 0.75 65.724 1.007 65.793 1.234 c
+65.871 1.458 65.977 1.646 66.117 1.793 c
+66.264 1.947 66.44 2.065 66.646 2.146 c
+66.852 2.234 67.087 2.278 67.351 2.278 c
+67.575 2.278 67.777 2.248 67.954 2.19 c
+68.13 2.131 68.281 2.046 68.41 1.94 c
+68.535 1.841 68.637 1.72 68.718 1.573 c
+68.795 1.433 68.851 1.282 68.88 1.117 c
+67.968 1.072 l
+67.939 1.249 67.87 1.389 67.763 1.499 c
+67.664 1.606 67.521 1.66 67.336 1.66 c
+67.091 1.66 66.914 1.558 66.808 1.352 c
+66.697 1.153 66.646 0.867 66.646 0.484 c
+66.646 -0.309 66.881 -0.706 67.351 -0.706 c
+67.517 -0.706 67.66 -0.655 67.777 -0.544 c
+67.895 -0.437 67.968 -0.276 67.999 -0.059 c
+68.909 -0.104 l
+68.88 -0.272 68.824 -0.426 68.747 -0.574 c
+68.678 -0.721 68.575 -0.853 68.439 -0.971 c
+68.311 -1.081 68.153 -1.168 67.968 -1.235 c
+67.792 -1.294 67.586 -1.324 67.351 -1.324 c
+70.457 1.602 m
+69.913 1.602 l
+69.913 2.219 l
+70.501 2.219 l
+70.78 3.116 l
+71.353 3.116 l
+71.353 2.219 l
+72.587 2.219 l
+72.587 1.602 l
+71.353 1.602 l
+71.353 -0.104 l
+71.353 -0.324 l
+71.361 -0.393 71.382 -0.456 71.412 -0.515 c
+71.448 -0.566 71.504 -0.611 71.573 -0.647 c
+71.65 -0.676 71.764 -0.691 71.912 -0.691 c
+72.047 -0.691 72.184 -0.688 72.323 -0.676 c
+72.46 -0.659 72.591 -0.632 72.72 -0.603 c
+72.72 -1.206 l
+72.639 -1.216 72.562 -1.231 72.485 -1.249 c
+72.404 -1.261 72.327 -1.268 72.25 -1.279 c
+72.169 -1.286 72.08 -1.294 71.985 -1.294 c
+71.897 -1.301 71.798 -1.309 71.691 -1.309 c
+71.504 -1.309 71.342 -1.294 71.206 -1.264 c
+71.078 -1.228 70.964 -1.183 70.868 -1.132 c
+70.78 -1.085 70.706 -1.025 70.648 -0.956 c
+70.588 -0.879 70.545 -0.802 70.515 -0.721 c
+70.486 -0.632 70.464 -0.544 70.457 -0.456 c
+70.445 -0.36 70.442 -0.265 70.442 -0.177 c
+h
+80.169 -1.264 m
+80.169 0.72 l
+80.169 1.022 80.125 1.242 80.036 1.381 c
+79.955 1.529 79.82 1.602 79.625 1.602 c
+79.515 1.602 79.412 1.576 79.317 1.529 c
+79.228 1.477 79.147 1.411 79.081 1.323 c
+79.022 1.234 78.971 1.124 78.935 0.999 c
+78.905 0.881 78.89 0.75 78.89 0.602 c
+78.89 -1.264 l
+77.979 -1.264 l
+77.979 1.44 l
+77.979 1.66 l
+77.979 1.749 77.971 1.826 77.964 1.896 c
+77.964 2.087 l
+77.964 2.219 l
+78.817 2.219 l
+78.824 2.19 78.831 2.146 78.831 2.087 c
+78.831 1.896 l
+78.839 1.826 78.846 1.756 78.846 1.69 c
+78.854 1.62 78.86 1.565 78.86 1.529 c
+78.875 1.529 l
+78.993 1.793 79.143 1.984 79.331 2.102 c
+79.515 2.219 79.735 2.278 79.993 2.278 c
+80.176 2.278 80.338 2.248 80.477 2.19 c
+80.614 2.131 80.728 2.043 80.816 1.926 c
+80.904 1.808 80.967 1.664 81.007 1.499 c
+81.054 1.341 81.08 1.153 81.08 0.941 c
+81.08 -1.264 l
+h
+82.995 -1.324 m
+82.826 -1.324 82.675 -1.301 82.54 -1.264 c
+82.411 -1.216 82.297 -1.147 82.201 -1.058 c
+82.112 -0.971 82.043 -0.864 81.995 -0.736 c
+81.944 -0.599 81.921 -0.449 81.921 -0.279 c
+81.921 -0.073 81.954 0.095 82.025 0.235 c
+82.091 0.382 82.187 0.492 82.304 0.573 c
+82.429 0.661 82.572 0.723 82.73 0.764 c
+82.895 0.801 83.072 0.827 83.259 0.837 c
+83.98 0.852 l
+83.98 1.028 l
+83.98 1.146 83.969 1.249 83.951 1.338 c
+83.928 1.425 83.895 1.492 83.847 1.543 c
+83.807 1.602 83.759 1.639 83.7 1.66 c
+83.641 1.679 83.575 1.69 83.509 1.69 c
+83.44 1.69 83.377 1.679 83.318 1.66 c
+83.267 1.65 83.219 1.624 83.171 1.587 c
+83.13 1.558 83.097 1.506 83.068 1.44 c
+83.047 1.381 83.032 1.301 83.024 1.205 c
+82.083 1.249 l
+82.112 1.396 82.157 1.532 82.216 1.66 c
+82.282 1.786 82.378 1.896 82.495 1.984 c
+82.613 2.08 82.752 2.153 82.921 2.204 c
+83.097 2.252 83.303 2.278 83.539 2.278 c
+83.98 2.278 84.31 2.167 84.539 1.955 c
+84.774 1.749 84.891 1.44 84.891 1.028 c
+84.891 -0.235 l
+84.891 -0.456 l
+84.898 -0.515 84.913 -0.57 84.935 -0.618 c
+84.953 -0.659 84.983 -0.691 85.023 -0.721 c
+85.06 -0.742 85.112 -0.75 85.17 -0.75 c
+85.237 -0.75 85.306 -0.746 85.376 -0.736 c
+85.376 -1.22 l
+85.318 -1.231 85.262 -1.243 85.214 -1.249 c
+85.174 -1.261 85.133 -1.268 85.096 -1.279 c
+85.056 -1.286 85.012 -1.294 84.965 -1.294 c
+84.913 -1.301 84.854 -1.309 84.788 -1.309 c
+84.56 -1.309 84.395 -1.257 84.288 -1.147 c
+84.178 -1.029 84.115 -0.864 84.097 -0.647 c
+84.082 -0.647 l
+84.013 -0.757 83.943 -0.853 83.876 -0.941 c
+83.807 -1.022 83.73 -1.088 83.641 -1.147 c
+83.554 -1.206 83.454 -1.249 83.348 -1.279 c
+83.248 -1.309 83.13 -1.324 82.995 -1.324 c
+83.98 0.353 m
+83.554 0.338 l
+83.454 0.338 83.363 0.33 83.274 0.323 c
+83.193 0.312 83.127 0.286 83.068 0.249 c
+83.01 0.209 82.958 0.151 82.921 0.073 c
+82.881 0.004 82.862 -0.088 82.862 -0.206 c
+82.862 -0.375 82.895 -0.497 82.966 -0.574 c
+83.032 -0.655 83.13 -0.691 83.259 -0.691 c
+83.366 -0.691 83.465 -0.669 83.554 -0.618 c
+83.649 -0.57 83.73 -0.507 83.789 -0.426 c
+83.855 -0.349 83.906 -0.262 83.936 -0.162 c
+83.965 -0.056 83.98 0.058 83.98 0.176 c
+h
+87.261 -1.264 m
+87.261 0.852 l
+87.261 1.018 87.254 1.153 87.246 1.263 c
+87.236 1.371 87.217 1.455 87.188 1.514 c
+87.166 1.579 87.136 1.631 87.099 1.66 c
+87.07 1.69 87.03 1.705 86.982 1.705 c
+86.923 1.705 86.868 1.675 86.82 1.616 c
+86.779 1.565 86.747 1.492 86.717 1.396 c
+86.688 1.308 86.662 1.194 86.644 1.058 c
+86.633 0.918 86.629 0.768 86.629 0.602 c
+86.629 -1.264 l
+85.879 -1.264 l
+85.879 1.469 l
+85.879 1.705 l
+85.879 1.926 l
+85.879 2.003 85.873 2.065 85.865 2.117 c
+85.865 2.219 l
+86.54 2.219 l
+86.54 2.131 l
+86.54 1.984 l
+86.548 1.926 86.556 1.866 86.556 1.808 c
+86.556 1.646 l
+86.571 1.646 l
+86.588 1.734 86.619 1.811 86.658 1.881 c
+86.696 1.959 86.739 2.028 86.791 2.087 c
+86.85 2.146 86.916 2.19 86.997 2.219 c
+87.074 2.256 87.162 2.278 87.261 2.278 c
+87.445 2.278 87.585 2.223 87.673 2.117 c
+87.768 2.017 87.838 1.859 87.878 1.646 c
+87.893 1.646 l
+87.93 1.741 87.97 1.83 88.011 1.911 c
+88.059 1.988 88.113 2.05 88.173 2.102 c
+88.231 2.161 88.298 2.204 88.379 2.234 c
+88.456 2.263 88.543 2.278 88.643 2.278 c
+88.779 2.278 88.892 2.252 88.981 2.204 c
+89.069 2.153 89.135 2.08 89.187 1.984 c
+89.245 1.885 89.283 1.756 89.304 1.602 c
+89.334 1.455 89.349 1.271 89.349 1.058 c
+89.349 -1.264 l
+88.628 -1.264 l
+88.628 0.852 l
+88.628 1.018 88.62 1.153 88.614 1.263 c
+88.603 1.371 88.584 1.455 88.555 1.514 c
+88.533 1.579 88.503 1.631 88.466 1.66 c
+88.437 1.69 88.397 1.705 88.349 1.705 c
+88.231 1.705 88.136 1.616 88.069 1.44 c
+88.011 1.271 87.982 1.014 87.982 0.661 c
+87.982 -1.264 l
+h
+91.718 -1.324 m
+91.462 -1.324 91.234 -1.286 91.028 -1.22 c
+90.822 -1.143 90.646 -1.029 90.498 -0.882 c
+90.351 -0.728 90.234 -0.537 90.146 -0.309 c
+90.065 -0.085 90.028 0.18 90.028 0.484 c
+90.028 0.816 90.072 1.095 90.16 1.323 c
+90.256 1.558 90.384 1.741 90.542 1.881 c
+90.708 2.017 90.895 2.117 91.101 2.175 c
+91.307 2.242 91.517 2.278 91.733 2.278 c
+92.005 2.278 92.24 2.227 92.439 2.131 c
+92.645 2.043 92.811 1.911 92.938 1.734 c
+93.075 1.565 93.174 1.359 93.233 1.117 c
+93.299 0.881 93.335 0.617 93.335 0.323 c
+93.335 0.309 l
+90.969 0.309 l
+90.969 0.162 90.984 0.022 91.013 -0.104 c
+91.049 -0.231 91.105 -0.345 91.175 -0.441 c
+91.241 -0.53 91.325 -0.599 91.425 -0.647 c
+91.52 -0.698 91.635 -0.721 91.763 -0.721 c
+91.917 -0.721 92.057 -0.688 92.175 -0.618 c
+92.3 -0.551 92.387 -0.449 92.439 -0.309 c
+93.277 -0.383 l
+93.247 -0.482 93.192 -0.588 93.115 -0.706 c
+93.034 -0.816 92.931 -0.919 92.807 -1.014 c
+92.689 -1.103 92.535 -1.176 92.351 -1.235 c
+92.175 -1.294 91.961 -1.324 91.718 -1.324 c
+91.718 1.705 m
+91.631 1.705 91.542 1.69 91.454 1.66 c
+91.366 1.631 91.285 1.579 91.219 1.514 c
+91.149 1.444 91.09 1.356 91.043 1.249 c
+91.002 1.139 90.984 1.014 90.984 0.867 c
+92.454 0.867 l
+92.454 1.003 92.428 1.124 92.38 1.234 c
+92.34 1.341 92.285 1.429 92.219 1.499 c
+92.16 1.565 92.086 1.616 91.998 1.646 c
+91.909 1.683 91.814 1.705 91.718 1.705 c
+94.592 -2.631 m
+94.592 -2.014 l
+95.666 -2.014 l
+95.666 2.896 l
+94.592 2.896 l
+94.592 3.513 l
+96.518 3.513 l
+96.518 -2.631 l
+h
+f
+Q
+q 1 0 0 1 59.3004 267.0178 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.485 -1.323 c
+-0.779 -1.627 -1.199 -1.778 -1.735 -1.778 c
+-2.264 -1.778 -2.691 -1.579 -3.013 -1.176 c
+-3.329 -0.764 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.47 l
+-3.484 2.165 -3.322 2.712 -2.999 3.117 c
+-2.675 3.517 -2.23 3.719 -1.661 3.719 c
+-1.154 3.719 -0.757 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.691 1.926 l
+-0.721 2.367 -0.816 2.679 -0.97 2.866 c
+-1.118 3.05 -1.349 3.146 -1.661 3.146 c
+-2.036 3.146 -2.319 2.999 -2.514 2.705 c
+-2.712 2.419 -2.808 2.003 -2.808 1.455 c
+-2.808 0.47 l
+-2.808 -0.07 -2.716 -0.484 -2.529 -0.779 c
+-2.344 -1.066 -2.08 -1.205 -1.735 -1.205 c
+-1.382 -1.205 -1.128 -1.117 -0.97 -0.941 c
+-0.816 -0.764 -0.721 -0.452 -0.691 0 c
+h
+2.454 1.661 m
+2.366 1.679 2.267 1.691 2.161 1.691 c
+1.826 1.691 1.591 1.507 1.455 1.147 c
+1.455 -1.705 l
+0.808 -1.705 l
+0.808 2.278 l
+1.44 2.278 l
+1.455 1.867 l
+1.631 2.19 1.874 2.352 2.19 2.352 c
+2.296 2.352 2.385 2.33 2.454 2.294 c
+h
+4.453 -1.778 m
+3.954 -1.778 3.572 -1.631 3.307 -1.338 c
+3.042 -1.043 2.91 -0.61 2.91 -0.029 c
+2.91 0.441 l
+2.91 1.037 3.035 1.503 3.293 1.837 c
+3.557 2.18 3.917 2.352 4.38 2.352 c
+4.839 2.352 5.182 2.198 5.409 1.897 c
+5.644 1.602 5.766 1.139 5.776 0.515 c
+5.776 0.088 l
+3.557 0.088 l
+3.557 0 l
+3.557 -0.434 3.634 -0.746 3.792 -0.941 c
+3.958 -1.128 4.189 -1.22 4.483 -1.22 c
+4.677 -1.22 4.85 -1.186 4.997 -1.117 c
+5.145 -1.039 5.28 -0.922 5.409 -0.764 c
+5.747 -1.176 l
+5.46 -1.579 5.03 -1.778 4.453 -1.778 c
+4.38 1.793 m
+4.104 1.793 3.902 1.698 3.777 1.515 c
+3.649 1.326 3.576 1.037 3.557 0.647 c
+5.13 0.647 l
+5.13 0.735 l
+5.107 1.118 5.041 1.386 4.924 1.544 c
+4.806 1.709 4.623 1.793 4.38 1.793 c
+8.598 -1.705 m
+8.558 -1.617 8.533 -1.469 8.525 -1.264 c
+8.29 -1.61 7.996 -1.778 7.644 -1.778 c
+7.279 -1.778 6.996 -1.683 6.791 -1.484 c
+6.593 -1.278 6.497 -0.992 6.497 -0.617 c
+6.497 -0.216 6.633 0.103 6.908 0.339 c
+7.181 0.58 7.555 0.706 8.025 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.455 1.532 8.349 1.632 c
+8.239 1.738 8.077 1.793 7.864 1.793 c
+7.665 1.793 7.503 1.735 7.378 1.617 c
+7.262 1.5 7.202 1.353 7.202 1.176 c
+6.556 1.176 l
+6.556 1.371 6.614 1.562 6.732 1.75 c
+6.857 1.933 7.019 2.08 7.217 2.19 c
+7.422 2.297 7.651 2.352 7.908 2.352 c
+8.309 2.352 8.613 2.249 8.819 2.043 c
+9.032 1.837 9.146 1.544 9.157 1.162 c
+9.157 -0.852 l
+9.157 -1.157 9.194 -1.421 9.275 -1.646 c
+9.275 -1.705 l
+h
+7.732 -1.19 m
+7.897 -1.19 8.047 -1.147 8.187 -1.058 c
+8.334 -0.97 8.44 -0.86 8.511 -0.72 c
+8.511 0.221 l
+8.143 0.221 l
+7.827 0.221 7.584 0.151 7.408 0.015 c
+7.231 -0.114 7.143 -0.301 7.143 -0.544 c
+7.143 -0.771 7.187 -0.937 7.276 -1.043 c
+7.364 -1.143 7.515 -1.19 7.732 -1.19 c
+11.009 3.234 m
+11.009 2.278 l
+11.612 2.278 l
+11.612 1.75 l
+11.009 1.75 l
+11.009 -0.72 l
+11.009 -0.878 11.031 -0.995 11.083 -1.072 c
+11.141 -1.153 11.23 -1.19 11.347 -1.19 c
+11.436 -1.19 11.524 -1.176 11.612 -1.147 c
+11.612 -1.705 l
+11.465 -1.753 11.311 -1.778 11.156 -1.778 c
+10.899 -1.778 10.705 -1.687 10.568 -1.5 c
+10.429 -1.315 10.362 -1.055 10.362 -0.72 c
+10.362 1.75 l
+9.76 1.75 l
+9.76 2.278 l
+10.362 2.278 l
+10.362 3.234 l
+h
+13.803 -1.778 m
+13.302 -1.778 12.92 -1.631 12.656 -1.338 c
+12.391 -1.043 12.259 -0.61 12.259 -0.029 c
+12.259 0.441 l
+12.259 1.037 12.384 1.503 12.641 1.837 c
+12.906 2.18 13.265 2.352 13.728 2.352 c
+14.188 2.352 14.53 2.198 14.757 1.897 c
+14.993 1.602 15.114 1.139 15.125 0.515 c
+15.125 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.306 -1.128 13.537 -1.22 13.832 -1.22 c
+14.026 -1.22 14.199 -1.186 14.346 -1.117 c
+14.493 -1.039 14.629 -0.922 14.757 -0.764 c
+15.096 -1.176 l
+14.809 -1.579 14.379 -1.778 13.803 -1.778 c
+13.728 1.793 m
+13.454 1.793 13.251 1.698 13.126 1.515 c
+12.997 1.326 12.924 1.037 12.906 0.647 c
+14.478 0.647 l
+14.478 0.735 l
+14.456 1.118 14.39 1.386 14.273 1.544 c
+14.155 1.709 13.971 1.793 13.728 1.793 c
+18.241 2.278 m
+18.256 1.837 l
+18.51 2.18 18.833 2.352 19.226 2.352 c
+19.931 2.352 20.288 1.882 20.299 0.941 c
+20.299 -1.705 l
+19.652 -1.705 l
+19.652 0.912 l
+19.652 1.224 19.597 1.444 19.491 1.573 c
+19.38 1.698 19.226 1.764 19.021 1.764 c
+18.863 1.764 18.715 1.709 18.58 1.602 c
+18.451 1.492 18.348 1.357 18.271 1.191 c
+18.271 -1.705 l
+17.624 -1.705 l
+17.624 2.278 l
+h
+22.695 -1.778 m
+22.195 -1.778 21.813 -1.631 21.549 -1.338 c
+21.284 -1.043 21.152 -0.61 21.152 -0.029 c
+21.152 0.441 l
+21.152 1.037 21.277 1.503 21.534 1.837 c
+21.799 2.18 22.158 2.352 22.622 2.352 c
+23.081 2.352 23.423 2.198 23.65 1.897 c
+23.885 1.602 24.007 1.139 24.018 0.515 c
+24.018 0.088 l
+21.799 0.088 l
+21.799 0 l
+21.799 -0.434 21.876 -0.746 22.034 -0.941 c
+22.199 -1.128 22.43 -1.22 22.725 -1.22 c
+22.919 -1.22 23.092 -1.186 23.239 -1.117 c
+23.386 -1.039 23.522 -0.922 23.65 -0.764 c
+23.989 -1.176 l
+23.702 -1.579 23.272 -1.778 22.695 -1.778 c
+22.622 1.793 m
+22.346 1.793 22.144 1.698 22.019 1.515 c
+21.89 1.326 21.817 1.037 21.799 0.647 c
+23.371 0.647 l
+23.371 0.735 l
+23.349 1.118 23.283 1.386 23.166 1.544 c
+23.048 1.709 22.864 1.793 22.622 1.793 c
+27.766 -0.559 m
+28.369 2.278 l
+29.015 2.278 l
+28.031 -1.705 l
+27.517 -1.705 l
+26.738 1.147 l
+25.988 -1.705 l
+25.458 -1.705 l
+24.503 2.278 l
+25.136 2.278 l
+25.753 -0.484 l
+26.487 2.278 l
+27.002 2.278 l
+h
+32.117 -1.705 -0.646 5.644 re
+32.999 0.47 m
+32.999 1.048 33.135 1.503 33.41 1.837 c
+33.694 2.18 34.065 2.352 34.528 2.352 c
+34.987 2.352 35.355 2.183 35.631 1.852 c
+35.914 1.529 36.06 1.081 36.071 0.515 c
+36.071 0.088 l
+36.071 -0.481 35.928 -0.937 35.645 -1.278 c
+35.369 -1.613 35.002 -1.778 34.543 -1.778 c
+34.079 -1.778 33.709 -1.617 33.425 -1.294 c
+33.15 -0.962 33.007 -0.521 32.999 0.029 c
+h
+33.646 0.088 m
+33.646 -0.316 33.723 -0.632 33.881 -0.867 c
+34.046 -1.103 34.267 -1.22 34.543 -1.22 c
+35.108 -1.22 35.403 -0.808 35.424 0.015 c
+35.424 0.47 l
+35.424 0.871 35.34 1.191 35.174 1.426 c
+35.016 1.669 34.8 1.793 34.528 1.793 c
+34.264 1.793 34.046 1.669 33.881 1.426 c
+33.723 1.191 33.646 0.871 33.646 0.47 c
+h
+38.291 -1.22 m
+38.504 -1.22 38.677 -1.157 38.805 -1.029 c
+38.941 -0.893 39.014 -0.702 39.026 -0.455 c
+39.643 -0.455 l
+39.621 -0.837 39.485 -1.157 39.232 -1.411 c
+38.974 -1.657 38.662 -1.778 38.291 -1.778 c
+37.798 -1.778 37.424 -1.627 37.159 -1.323 c
+36.901 -1.01 36.776 -0.544 36.776 0.073 c
+36.776 0.515 l
+36.776 1.11 36.901 1.565 37.159 1.882 c
+37.424 2.194 37.798 2.352 38.291 2.352 c
+38.692 2.352 39.012 2.22 39.247 1.955 c
+39.488 1.698 39.621 1.353 39.643 0.912 c
+39.026 0.912 l
+39.004 1.205 38.931 1.426 38.805 1.573 c
+38.688 1.72 38.515 1.793 38.291 1.793 c
+37.996 1.793 37.78 1.694 37.644 1.5 c
+37.504 1.312 37.431 1.004 37.424 0.574 c
+37.424 0.059 l
+37.424 -0.411 37.489 -0.746 37.63 -0.941 c
+37.776 -1.128 37.996 -1.22 38.291 -1.22 c
+42.436 -1.705 m
+42.395 -1.617 42.37 -1.469 42.362 -1.264 c
+42.127 -1.61 41.834 -1.778 41.48 -1.778 c
+41.117 -1.778 40.834 -1.683 40.628 -1.484 c
+40.429 -1.278 40.334 -0.992 40.334 -0.617 c
+40.334 -0.216 40.47 0.103 40.745 0.339 c
+41.017 0.58 41.393 0.706 41.863 0.706 c
+42.347 0.706 l
+42.347 1.132 l
+42.347 1.367 42.293 1.532 42.186 1.632 c
+42.076 1.738 41.914 1.793 41.701 1.793 c
+41.503 1.793 41.341 1.735 41.216 1.617 c
+41.098 1.5 41.04 1.353 41.04 1.176 c
+40.393 1.176 l
+40.393 1.371 40.452 1.562 40.569 1.75 c
+40.695 1.933 40.855 2.08 41.054 2.19 c
+41.26 2.297 41.488 2.352 41.745 2.352 c
+42.146 2.352 42.451 2.249 42.656 2.043 c
+42.869 1.837 42.983 1.544 42.995 1.162 c
+42.995 -0.852 l
+42.995 -1.157 43.031 -1.421 43.112 -1.646 c
+43.112 -1.705 l
+h
+41.568 -1.19 m
+41.734 -1.19 41.885 -1.147 42.025 -1.058 c
+42.171 -0.97 42.278 -0.86 42.347 -0.72 c
+42.347 0.221 l
+41.98 0.221 l
+41.664 0.221 41.422 0.151 41.245 0.015 c
+41.069 -0.114 40.98 -0.301 40.98 -0.544 c
+40.98 -0.771 41.025 -0.937 41.113 -1.043 c
+41.202 -1.143 41.352 -1.19 41.568 -1.19 c
+44.699 -1.705 -0.646 5.644 re
+49.08 1.661 m
+48.992 1.679 48.892 1.691 48.786 1.691 c
+48.452 1.691 48.217 1.507 48.08 1.147 c
+48.08 -1.705 l
+47.434 -1.705 l
+47.434 2.278 l
+48.065 2.278 l
+48.08 1.867 l
+48.257 2.19 48.499 2.352 48.815 2.352 c
+48.922 2.352 49.01 2.33 49.08 2.294 c
+h
+51.079 -1.778 m
+50.579 -1.778 50.197 -1.631 49.933 -1.338 c
+49.668 -1.043 49.536 -0.61 49.536 -0.029 c
+49.536 0.441 l
+49.536 1.037 49.661 1.503 49.918 1.837 c
+50.182 2.18 50.542 2.352 51.006 2.352 c
+51.465 2.352 51.807 2.198 52.034 1.897 c
+52.269 1.602 52.391 1.139 52.402 0.515 c
+52.402 0.088 l
+50.182 0.088 l
+50.182 0 l
+50.182 -0.434 50.26 -0.746 50.417 -0.941 c
+50.583 -1.128 50.814 -1.22 51.108 -1.22 c
+51.303 -1.22 51.476 -1.186 51.623 -1.117 c
+51.77 -1.039 51.906 -0.922 52.034 -0.764 c
+52.373 -1.176 l
+52.086 -1.579 51.656 -1.778 51.079 -1.778 c
+51.006 1.793 m
+50.73 1.793 50.528 1.698 50.403 1.515 c
+50.274 1.326 50.201 1.037 50.182 0.647 c
+51.755 0.647 l
+51.755 0.735 l
+51.733 1.118 51.667 1.386 51.55 1.544 c
+51.432 1.709 51.248 1.793 51.006 1.793 c
+56.061 0.088 m
+56.061 -0.54 55.945 -1.01 55.71 -1.323 c
+55.481 -1.627 55.165 -1.778 54.754 -1.778 c
+54.349 -1.778 54.041 -1.627 53.828 -1.323 c
+53.828 -3.233 l
+53.181 -3.233 l
+53.181 2.278 l
+53.769 2.278 l
+53.813 1.837 l
+54.026 2.18 54.335 2.352 54.739 2.352 c
+55.18 2.352 55.507 2.198 55.724 1.897 c
+55.937 1.592 56.051 1.135 56.061 0.53 c
+h
+55.415 0.47 m
+55.415 0.912 55.346 1.235 55.209 1.44 c
+55.07 1.654 54.849 1.764 54.548 1.764 c
+54.232 1.764 53.993 1.61 53.828 1.309 c
+53.828 -0.764 l
+53.993 -1.069 54.232 -1.22 54.548 -1.22 c
+54.842 -1.22 55.055 -1.117 55.195 -0.912 c
+55.331 -0.698 55.404 -0.367 55.415 0.073 c
+h
+56.767 0.47 m
+56.767 1.048 56.903 1.503 57.179 1.837 c
+57.462 2.18 57.833 2.352 58.297 2.352 c
+58.756 2.352 59.123 2.183 59.398 1.852 c
+59.681 1.529 59.828 1.081 59.839 0.515 c
+59.839 0.088 l
+59.839 -0.481 59.697 -0.937 59.413 -1.278 c
+59.138 -1.613 58.77 -1.778 58.311 -1.778 c
+57.848 -1.778 57.476 -1.617 57.194 -1.294 c
+56.918 -0.962 56.775 -0.521 56.767 0.029 c
+h
+57.414 0.088 m
+57.414 -0.316 57.491 -0.632 57.649 -0.867 c
+57.815 -1.103 58.035 -1.22 58.311 -1.22 c
+58.877 -1.22 59.171 -0.808 59.193 0.015 c
+59.193 0.47 l
+59.193 0.871 59.109 1.191 58.943 1.426 c
+58.785 1.669 58.569 1.793 58.297 1.793 c
+58.031 1.793 57.815 1.669 57.649 1.426 c
+57.491 1.191 57.414 0.871 57.414 0.47 c
+h
+62.617 -0.69 m
+62.617 -0.544 62.563 -0.422 62.456 -0.324 c
+62.346 -0.228 62.14 -0.11 61.839 0.029 c
+61.493 0.177 61.251 0.298 61.104 0.397 c
+60.957 0.503 60.846 0.621 60.78 0.75 c
+60.711 0.875 60.678 1.033 60.678 1.22 c
+60.678 1.544 60.795 1.812 61.03 2.028 c
+61.266 2.242 61.567 2.352 61.941 2.352 c
+62.324 2.352 62.633 2.238 62.868 2.014 c
+63.103 1.786 63.221 1.5 63.221 1.147 c
+62.573 1.147 l
+62.573 1.323 62.515 1.474 62.397 1.602 c
+62.28 1.727 62.125 1.793 61.941 1.793 c
+61.744 1.793 61.592 1.738 61.486 1.632 c
+61.376 1.532 61.324 1.401 61.324 1.235 c
+61.324 1.106 61.361 1 61.442 0.912 c
+61.519 0.831 61.71 0.728 62.015 0.603 c
+62.492 0.416 62.824 0.228 63 0.044 c
+63.176 -0.132 63.265 -0.36 63.265 -0.632 c
+63.265 -0.985 63.14 -1.264 62.897 -1.469 c
+62.662 -1.675 62.346 -1.778 61.956 -1.778 c
+61.534 -1.778 61.196 -1.66 60.942 -1.425 c
+60.685 -1.183 60.56 -0.878 60.56 -0.515 c
+61.206 -0.515 l
+61.214 -0.742 61.284 -0.918 61.412 -1.043 c
+61.538 -1.161 61.721 -1.22 61.956 -1.22 c
+62.17 -1.22 62.331 -1.172 62.442 -1.072 c
+62.559 -0.977 62.617 -0.849 62.617 -0.69 c
+64.808 -1.705 -0.646 3.983 re
+64.852 3.322 m
+64.852 3.212 64.823 3.12 64.763 3.043 c
+64.705 2.973 64.609 2.94 64.485 2.94 c
+64.367 2.94 64.271 2.973 64.205 3.043 c
+64.146 3.12 64.117 3.212 64.117 3.322 c
+64.117 3.439 64.146 3.532 64.205 3.601 c
+64.271 3.678 64.367 3.719 64.485 3.719 c
+64.609 3.719 64.705 3.678 64.763 3.601 c
+64.823 3.52 64.852 3.429 64.852 3.322 c
+66.675 3.234 m
+66.675 2.278 l
+67.277 2.278 l
+67.277 1.75 l
+66.675 1.75 l
+66.675 -0.72 l
+66.675 -0.878 66.697 -0.995 66.748 -1.072 c
+66.807 -1.153 66.895 -1.19 67.013 -1.19 c
+67.101 -1.19 67.189 -1.176 67.277 -1.147 c
+67.277 -1.705 l
+67.13 -1.753 66.976 -1.778 66.822 -1.778 c
+66.565 -1.778 66.37 -1.687 66.234 -1.5 c
+66.094 -1.315 66.028 -1.055 66.028 -0.72 c
+66.028 1.75 l
+65.426 1.75 l
+65.426 2.278 l
+66.028 2.278 l
+66.028 3.234 l
+h
+67.836 0.47 m
+67.836 1.048 67.972 1.503 68.248 1.837 c
+68.53 2.18 68.902 2.352 69.364 2.352 c
+69.824 2.352 70.191 2.183 70.467 1.852 c
+70.75 1.529 70.897 1.081 70.908 0.515 c
+70.908 0.088 l
+70.908 -0.481 70.764 -0.937 70.482 -1.278 c
+70.206 -1.613 69.839 -1.778 69.38 -1.778 c
+68.917 -1.778 68.545 -1.617 68.262 -1.294 c
+67.986 -0.962 67.843 -0.521 67.836 0.029 c
+h
+68.483 0.088 m
+68.483 -0.316 68.56 -0.632 68.718 -0.867 c
+68.883 -1.103 69.104 -1.22 69.38 -1.22 c
+69.945 -1.22 70.239 -0.808 70.261 0.015 c
+70.261 0.47 l
+70.261 0.871 70.176 1.191 70.012 1.426 c
+69.854 1.669 69.636 1.793 69.364 1.793 c
+69.1 1.793 68.883 1.669 68.718 1.426 c
+68.56 1.191 68.483 0.871 68.483 0.47 c
+h
+73.392 1.661 m
+73.304 1.679 73.205 1.691 73.098 1.691 c
+72.763 1.691 72.528 1.507 72.393 1.147 c
+72.393 -1.705 l
+71.745 -1.705 l
+71.745 2.278 l
+72.378 2.278 l
+72.393 1.867 l
+72.569 2.19 72.811 2.352 73.127 2.352 c
+73.234 2.352 73.322 2.33 73.392 2.294 c
+h
+75.2 -0.617 m
+75.92 2.278 l
+76.611 2.278 l
+75.317 -2.263 l
+75.219 -2.605 75.075 -2.866 74.891 -3.042 c
+74.715 -3.219 74.513 -3.307 74.289 -3.307 c
+74.201 -3.307 74.087 -3.285 73.951 -3.248 c
+73.951 -2.705 l
+74.097 -2.719 l
+74.282 -2.719 74.428 -2.675 74.539 -2.587 c
+74.645 -2.499 74.733 -2.341 74.803 -2.117 c
+74.92 -1.675 l
+73.76 2.278 l
+74.465 2.278 l
+h
+76.89 -1.352 m
+76.89 -1.234 76.923 -1.139 76.993 -1.058 c
+77.06 -0.981 77.162 -0.941 77.302 -0.941 c
+77.449 -0.941 77.555 -0.981 77.625 -1.058 c
+77.702 -1.139 77.743 -1.234 77.743 -1.352 c
+77.743 -1.462 77.702 -1.554 77.625 -1.631 c
+77.555 -1.708 77.449 -1.749 77.302 -1.749 c
+77.162 -1.749 77.06 -1.708 76.993 -1.631 c
+76.923 -1.554 76.89 -1.462 76.89 -1.352 c
+81.345 -1.705 -0.676 5.35 re
+82.726 -1.705 m
+82.726 1.75 l
+82.197 1.75 l
+82.197 2.278 l
+82.726 2.278 l
+82.726 2.734 l
+82.726 3.135 82.822 3.447 83.02 3.675 c
+83.226 3.899 83.505 4.013 83.857 4.013 c
+83.994 4.013 84.127 3.991 84.255 3.954 c
+84.225 3.41 l
+84.127 3.429 84.027 3.439 83.932 3.439 c
+83.556 3.439 83.373 3.175 83.373 2.646 c
+83.373 2.278 l
+84.048 2.278 l
+84.048 1.75 l
+83.373 1.75 l
+83.373 -1.705 l
+h
+f
+Q
+q 1 0 0 1 147.1862 270.7224 cm
+0 0 m
+-0.383 0 l
+-0.383 -5.835 l
+0 -5.835 l
+0 -6.659 l
+-1.426 -6.659 l
+-1.426 0.823 l
+0 0.823 l
+h
+3.63 -3.543 m
+3.63 -4.171 3.52 -4.653 3.307 -4.983 c
+3.09 -5.318 2.77 -5.483 2.352 -5.483 c
+2.028 -5.483 1.768 -5.351 1.572 -5.087 c
+1.572 -6.938 l
+0.529 -6.938 l
+0.529 -1.426 l
+1.484 -1.426 l
+1.529 -1.794 l
+1.723 -1.5 1.992 -1.353 2.337 -1.353 c
+2.755 -1.353 3.075 -1.511 3.293 -1.823 c
+3.505 -2.128 3.619 -2.598 3.63 -3.234 c
+h
+2.587 -3.278 m
+2.587 -2.896 2.543 -2.628 2.454 -2.469 c
+2.373 -2.315 2.234 -2.234 2.028 -2.234 c
+1.822 -2.234 1.668 -2.323 1.572 -2.5 c
+1.572 -4.366 l
+1.66 -4.535 1.815 -4.616 2.042 -4.616 c
+2.248 -4.616 2.389 -4.535 2.469 -4.366 c
+2.547 -4.189 2.587 -3.917 2.587 -3.543 c
+h
+6.217 -2.44 m
+5.88 -2.411 l
+5.593 -2.411 5.402 -2.536 5.306 -2.778 c
+5.306 -5.409 l
+4.262 -5.409 l
+4.262 -1.426 l
+5.232 -1.426 l
+5.262 -1.867 l
+5.427 -1.525 5.659 -1.353 5.953 -1.353 c
+6.071 -1.353 6.162 -1.374 6.232 -1.411 c
+h
+6.511 -3.293 m
+6.511 -2.687 6.651 -2.213 6.938 -1.867 c
+7.22 -1.525 7.613 -1.353 8.114 -1.353 c
+8.621 -1.353 9.018 -1.525 9.304 -1.867 c
+9.587 -2.213 9.73 -2.687 9.73 -3.293 c
+9.73 -3.558 l
+9.73 -4.156 9.587 -4.627 9.304 -4.969 c
+9.018 -5.314 8.621 -5.483 8.114 -5.483 c
+7.603 -5.483 7.206 -5.314 6.923 -4.969 c
+6.647 -4.627 6.511 -4.152 6.511 -3.543 c
+h
+7.555 -3.558 m
+7.555 -4.263 7.739 -4.616 8.114 -4.616 c
+8.467 -4.616 8.658 -4.322 8.687 -3.734 c
+8.687 -3.293 l
+8.687 -2.932 8.635 -2.66 8.54 -2.484 c
+8.44 -2.308 8.297 -2.22 8.114 -2.22 c
+7.937 -2.22 7.798 -2.308 7.702 -2.484 c
+7.603 -2.66 7.555 -2.932 7.555 -3.293 c
+h
+11.465 -1.426 m
+11.465 -5.63 l
+11.465 -6.078 11.362 -6.423 11.156 -6.659 c
+10.95 -6.894 10.657 -7.011 10.274 -7.011 c
+10.105 -7.011 9.951 -6.99 9.803 -6.953 c
+9.789 -6.101 l
+9.907 -6.13 9.999 -6.145 10.069 -6.145 c
+10.304 -6.145 10.421 -5.983 10.421 -5.659 c
+10.421 -1.426 l
+h
+10.362 -0.397 m
+10.362 -0.243 10.41 -0.114 10.509 -0.015 c
+10.616 0.091 10.752 0.147 10.921 0.147 c
+11.098 0.147 11.233 0.091 11.333 -0.015 c
+11.439 -0.114 11.494 -0.243 11.494 -0.397 c
+11.494 -0.566 11.439 -0.702 11.333 -0.809 c
+11.233 -0.908 11.098 -0.956 10.921 -0.956 c
+10.744 -0.956 10.605 -0.908 10.509 -0.809 c
+10.41 -0.702 10.362 -0.566 10.362 -0.397 c
+13.832 -5.483 m
+13.302 -5.483 12.883 -5.328 12.582 -5.012 c
+12.288 -4.69 12.141 -4.23 12.141 -3.631 c
+12.141 -3.323 l
+12.141 -2.697 12.277 -2.213 12.552 -1.867 c
+12.824 -1.525 13.217 -1.353 13.728 -1.353 c
+14.229 -1.353 14.599 -1.515 14.846 -1.837 c
+15.099 -2.161 15.232 -2.639 15.243 -3.263 c
+15.243 -3.763 l
+13.17 -3.763 l
+13.188 -4.057 13.251 -4.274 13.361 -4.41 c
+13.479 -4.549 13.659 -4.616 13.905 -4.616 c
+14.247 -4.616 14.537 -4.499 14.772 -4.263 c
+15.184 -4.895 l
+15.056 -5.072 14.867 -5.215 14.626 -5.322 c
+14.379 -5.428 14.115 -5.483 13.832 -5.483 c
+13.184 -3.043 m
+14.214 -3.043 l
+14.214 -2.94 l
+14.214 -2.705 14.173 -2.529 14.096 -2.411 c
+14.026 -2.286 13.898 -2.22 13.714 -2.22 c
+13.537 -2.22 13.406 -2.29 13.317 -2.425 c
+13.236 -2.554 13.192 -2.76 13.184 -3.043 c
+17.271 -4.616 m
+17.565 -4.616 17.716 -4.421 17.726 -4.028 c
+18.697 -4.028 l
+18.697 -4.461 18.565 -4.814 18.3 -5.087 c
+18.035 -5.351 17.697 -5.483 17.286 -5.483 c
+16.775 -5.483 16.382 -5.328 16.11 -5.012 c
+15.845 -4.69 15.706 -4.219 15.698 -3.601 c
+15.698 -3.278 l
+15.698 -2.654 15.831 -2.176 16.095 -1.852 c
+16.367 -1.521 16.764 -1.353 17.286 -1.353 c
+17.716 -1.353 18.057 -1.492 18.314 -1.764 c
+18.568 -2.04 18.697 -2.421 18.697 -2.911 c
+17.726 -2.911 l
+17.726 -2.697 17.686 -2.529 17.609 -2.411 c
+17.539 -2.286 17.422 -2.22 17.256 -2.22 c
+17.08 -2.22 16.951 -2.286 16.874 -2.411 c
+16.793 -2.539 16.749 -2.789 16.742 -3.161 c
+16.742 -3.572 l
+16.742 -3.896 16.756 -4.123 16.786 -4.248 c
+16.822 -4.377 16.878 -4.469 16.947 -4.528 c
+17.025 -4.586 17.132 -4.616 17.271 -4.616 c
+20.505 -0.456 m
+20.505 -1.426 l
+21.034 -1.426 l
+21.034 -2.22 l
+20.505 -2.22 l
+20.505 -4.189 l
+20.505 -4.347 20.523 -4.454 20.564 -4.513 c
+20.612 -4.572 20.696 -4.601 20.814 -4.601 c
+20.92 -4.601 21.005 -4.594 21.063 -4.572 c
+21.063 -5.38 l
+20.887 -5.446 20.696 -5.483 20.49 -5.483 c
+19.814 -5.483 19.469 -5.097 19.461 -4.322 c
+19.461 -2.22 l
+19.006 -2.22 l
+19.006 -1.426 l
+19.461 -1.426 l
+19.461 -0.456 l
+h
+24.297 -1.426 m
+24.327 -1.823 l
+24.562 -1.511 24.863 -1.353 25.238 -1.353 c
+25.921 -1.353 26.274 -1.833 26.296 -2.793 c
+26.296 -5.409 l
+25.252 -5.409 l
+25.252 -2.866 l
+25.252 -2.643 25.216 -2.481 25.15 -2.382 c
+25.08 -2.286 24.963 -2.234 24.797 -2.234 c
+24.61 -2.234 24.463 -2.33 24.356 -2.514 c
+24.356 -5.409 l
+23.312 -5.409 l
+23.312 -1.426 l
+h
+28.928 -5.409 m
+28.898 -5.351 28.868 -5.247 28.839 -5.101 c
+28.652 -5.358 28.402 -5.483 28.09 -5.483 c
+27.756 -5.483 27.476 -5.376 27.251 -5.16 c
+27.035 -4.935 26.929 -4.645 26.929 -4.293 c
+26.929 -3.881 27.06 -3.564 27.326 -3.337 c
+27.59 -3.102 27.972 -2.984 28.471 -2.984 c
+28.795 -2.984 l
+28.795 -2.66 l
+28.795 -2.484 28.758 -2.363 28.693 -2.294 c
+28.633 -2.216 28.545 -2.176 28.427 -2.176 c
+28.17 -2.176 28.045 -2.33 28.045 -2.631 c
+27.002 -2.631 l
+27.002 -2.261 27.137 -1.955 27.413 -1.72 c
+27.685 -1.478 28.034 -1.353 28.457 -1.353 c
+28.898 -1.353 29.236 -1.47 29.471 -1.706 c
+29.714 -1.933 29.838 -2.257 29.838 -2.675 c
+29.838 -4.542 l
+29.838 -4.888 29.886 -5.156 29.986 -5.351 c
+29.986 -5.409 l
+h
+28.325 -4.659 m
+28.431 -4.659 28.523 -4.642 28.604 -4.601 c
+28.693 -4.553 28.755 -4.495 28.795 -4.424 c
+28.795 -3.601 l
+28.545 -3.601 l
+28.369 -3.601 28.226 -3.66 28.119 -3.778 c
+28.02 -3.888 27.972 -4.035 27.972 -4.219 c
+27.972 -4.513 28.09 -4.659 28.325 -4.659 c
+31.559 -1.426 m
+31.588 -1.794 l
+31.823 -1.5 32.132 -1.353 32.514 -1.353 c
+32.915 -1.353 33.194 -1.536 33.352 -1.897 c
+33.587 -1.536 33.914 -1.353 34.337 -1.353 c
+35.031 -1.353 35.384 -1.837 35.395 -2.808 c
+35.395 -5.409 l
+34.366 -5.409 l
+34.366 -2.866 l
+34.366 -2.643 34.329 -2.481 34.263 -2.382 c
+34.204 -2.286 34.094 -2.234 33.94 -2.234 c
+33.741 -2.234 33.601 -2.352 33.514 -2.587 c
+33.514 -5.409 l
+32.47 -5.409 l
+32.47 -2.882 l
+32.47 -2.646 32.44 -2.481 32.381 -2.382 c
+32.323 -2.286 32.213 -2.234 32.059 -2.234 c
+31.882 -2.234 31.739 -2.33 31.632 -2.514 c
+31.632 -5.409 l
+30.588 -5.409 l
+30.588 -1.426 l
+h
+37.776 -5.483 m
+37.247 -5.483 36.828 -5.328 36.527 -5.012 c
+36.233 -4.69 36.086 -4.23 36.086 -3.631 c
+36.086 -3.323 l
+36.086 -2.697 36.222 -2.213 36.498 -1.867 c
+36.77 -1.525 37.163 -1.353 37.674 -1.353 c
+38.173 -1.353 38.544 -1.515 38.79 -1.837 c
+39.044 -2.161 39.176 -2.639 39.187 -3.263 c
+39.187 -3.763 l
+37.115 -3.763 l
+37.133 -4.057 37.196 -4.274 37.306 -4.41 c
+37.424 -4.549 37.603 -4.616 37.85 -4.616 c
+38.191 -4.616 38.482 -4.499 38.717 -4.263 c
+39.128 -4.895 l
+39 -5.072 38.812 -5.215 38.57 -5.322 c
+38.324 -5.428 38.059 -5.483 37.776 -5.483 c
+37.129 -3.043 m
+38.158 -3.043 l
+38.158 -2.94 l
+38.158 -2.705 38.118 -2.529 38.041 -2.411 c
+37.971 -2.286 37.842 -2.22 37.659 -2.22 c
+37.482 -2.22 37.35 -2.29 37.262 -2.425 c
+37.181 -2.554 37.137 -2.76 37.129 -3.043 c
+39.525 0.823 m
+40.951 0.823 l
+40.951 -6.659 l
+39.525 -6.659 l
+39.525 -5.835 l
+39.907 -5.835 l
+39.907 0 l
+39.525 0 l
+h
+f
+Q
+191.474 265.313 -0.647 3.983 re
+191.518 270.34 m
+191.518 270.229 191.488 270.138 191.43 270.061 c
+191.371 269.991 191.276 269.958 191.151 269.958 c
+191.033 269.958 190.937 269.991 190.871 270.061 c
+190.813 270.138 190.783 270.229 190.783 270.34 c
+190.783 270.457 190.813 270.549 190.871 270.619 c
+190.937 270.696 191.033 270.737 191.151 270.737 c
+191.276 270.737 191.371 270.696 191.43 270.619 c
+191.488 270.538 191.518 270.447 191.518 270.34 c
+194.428 266.327 m
+194.428 266.474 194.374 266.595 194.267 266.694 c
+194.156 266.79 193.951 266.908 193.649 267.047 c
+193.304 267.195 193.061 267.316 192.915 267.415 c
+192.768 267.521 192.658 267.639 192.591 267.768 c
+192.521 267.893 192.488 268.051 192.488 268.238 c
+192.488 268.562 192.606 268.83 192.841 269.046 c
+193.076 269.26 193.377 269.37 193.753 269.37 c
+194.135 269.37 194.443 269.256 194.678 269.032 c
+194.914 268.804 195.031 268.517 195.031 268.165 c
+194.384 268.165 l
+194.384 268.34 194.326 268.492 194.208 268.62 c
+194.09 268.745 193.936 268.811 193.753 268.811 c
+193.554 268.811 193.404 268.756 193.296 268.65 c
+193.186 268.55 193.135 268.419 193.135 268.253 c
+193.135 268.124 193.171 268.018 193.252 267.929 c
+193.329 267.848 193.521 267.746 193.826 267.621 c
+194.304 267.434 194.634 267.245 194.811 267.062 c
+194.987 266.886 195.075 266.657 195.075 266.386 c
+195.075 266.033 194.95 265.753 194.708 265.548 c
+194.472 265.342 194.156 265.24 193.767 265.24 c
+193.344 265.24 193.007 265.357 192.753 265.593 c
+192.496 265.834 192.371 266.14 192.371 266.503 c
+193.017 266.503 l
+193.025 266.276 193.094 266.1 193.223 265.974 c
+193.348 265.857 193.532 265.798 193.767 265.798 c
+193.98 265.798 194.142 265.846 194.252 265.945 c
+194.37 266.04 194.428 266.169 194.428 266.327 c
+200.514 267.106 m
+200.514 266.478 200.396 266.007 200.161 265.695 c
+199.933 265.39 199.617 265.24 199.206 265.24 c
+198.802 265.24 198.493 265.39 198.28 265.695 c
+198.28 263.784 l
+197.633 263.784 l
+197.633 269.296 l
+198.221 269.296 l
+198.265 268.855 l
+198.478 269.197 198.787 269.37 199.191 269.37 c
+199.632 269.37 199.959 269.215 200.176 268.914 c
+200.389 268.609 200.503 268.153 200.514 267.547 c
+h
+199.868 267.488 m
+199.868 267.929 199.797 268.253 199.662 268.458 c
+199.521 268.672 199.301 268.782 199 268.782 c
+198.684 268.782 198.445 268.627 198.28 268.326 c
+198.28 266.254 l
+198.445 265.949 198.684 265.798 199 265.798 c
+199.294 265.798 199.507 265.901 199.646 266.106 c
+199.783 266.32 199.856 266.651 199.868 267.091 c
+h
+202.998 268.679 m
+202.91 268.697 202.811 268.708 202.704 268.708 c
+202.37 268.708 202.135 268.525 201.998 268.165 c
+201.998 265.313 l
+201.352 265.313 l
+201.352 269.296 l
+201.984 269.296 l
+201.998 268.885 l
+202.175 269.208 202.418 269.37 202.734 269.37 c
+202.84 269.37 202.929 269.348 202.998 269.311 c
+h
+203.44 267.488 m
+203.44 268.066 203.575 268.521 203.851 268.855 c
+204.134 269.197 204.504 269.37 204.967 269.37 c
+205.427 269.37 205.794 269.201 206.07 268.87 c
+206.353 268.546 206.5 268.099 206.511 267.532 c
+206.511 267.106 l
+206.511 266.537 206.368 266.081 206.085 265.739 c
+205.809 265.404 205.441 265.24 204.982 265.24 c
+204.52 265.24 204.148 265.401 203.866 265.724 c
+203.59 266.055 203.446 266.497 203.44 267.047 c
+h
+204.086 267.106 m
+204.086 266.702 204.163 266.386 204.321 266.15 c
+204.487 265.915 204.707 265.798 204.982 265.798 c
+205.549 265.798 205.842 266.21 205.865 267.033 c
+205.865 267.488 l
+205.865 267.889 205.78 268.209 205.615 268.444 c
+205.456 268.687 205.24 268.811 204.967 268.811 c
+204.703 268.811 204.487 268.687 204.321 268.444 c
+204.163 268.209 204.086 267.889 204.086 267.488 c
+h
+208.422 266.298 m
+209.171 269.296 l
+209.833 269.296 l
+208.657 265.313 l
+208.172 265.313 l
+206.981 269.296 l
+207.643 269.296 l
+h
+211.215 265.313 -0.646 3.983 re
+211.259 270.34 m
+211.259 270.229 211.23 270.138 211.171 270.061 c
+211.112 269.991 211.016 269.958 210.891 269.958 c
+210.774 269.958 210.679 269.991 210.612 270.061 c
+210.553 270.138 210.524 270.229 210.524 270.34 c
+210.524 270.457 210.553 270.549 210.612 270.619 c
+210.679 270.696 210.774 270.737 210.891 270.737 c
+211.016 270.737 211.112 270.696 211.171 270.619 c
+211.23 270.538 211.259 270.447 211.259 270.34 c
+212.097 267.488 m
+212.097 268.095 212.207 268.562 212.435 268.885 c
+212.67 269.208 212.997 269.37 213.42 269.37 c
+213.802 269.37 214.1 269.212 214.316 268.899 c
+214.316 270.958 l
+214.964 270.958 l
+214.964 265.313 l
+214.375 265.313 l
+214.331 265.739 l
+214.125 265.404 213.821 265.24 213.42 265.24 c
+213.008 265.24 212.685 265.394 212.45 265.71 c
+212.215 266.033 212.097 266.489 212.097 267.077 c
+h
+212.743 267.106 m
+212.743 266.665 212.806 266.335 212.934 266.121 c
+213.071 265.915 213.291 265.813 213.596 265.813 c
+213.919 265.813 214.158 265.974 214.316 266.298 c
+214.316 268.311 l
+214.147 268.624 213.908 268.782 213.596 268.782 c
+213.291 268.782 213.071 268.679 212.934 268.473 c
+212.806 268.267 212.743 267.944 212.743 267.503 c
+h
+217.389 265.24 m
+216.888 265.24 216.506 265.387 216.242 265.68 c
+215.978 265.974 215.845 266.408 215.845 266.989 c
+215.845 267.459 l
+215.845 268.054 215.97 268.521 216.227 268.855 c
+216.491 269.197 216.852 269.37 217.315 269.37 c
+217.775 269.37 218.116 269.215 218.344 268.914 c
+218.579 268.62 218.7 268.157 218.712 267.532 c
+218.712 267.106 l
+216.491 267.106 l
+216.491 267.018 l
+216.491 266.584 216.569 266.272 216.727 266.077 c
+216.892 265.89 217.124 265.798 217.418 265.798 c
+217.613 265.798 217.786 265.832 217.933 265.901 c
+218.079 265.978 218.216 266.096 218.344 266.254 c
+218.682 265.842 l
+218.395 265.438 217.965 265.24 217.389 265.24 c
+217.315 268.811 m
+217.04 268.811 216.838 268.716 216.712 268.532 c
+216.584 268.344 216.51 268.054 216.491 267.665 c
+218.064 267.665 l
+218.064 267.753 l
+218.043 268.135 217.977 268.403 217.859 268.562 c
+217.742 268.727 217.557 268.811 217.315 268.811 c
+219.358 267.488 m
+219.358 268.095 219.469 268.562 219.696 268.885 c
+219.932 269.208 220.258 269.37 220.681 269.37 c
+221.063 269.37 221.361 269.212 221.578 268.899 c
+221.578 270.958 l
+222.224 270.958 l
+222.224 265.313 l
+221.636 265.313 l
+221.592 265.739 l
+221.387 265.404 221.081 265.24 220.681 265.24 c
+220.269 265.24 219.946 265.394 219.711 265.71 c
+219.475 266.033 219.358 266.489 219.358 267.077 c
+h
+220.005 267.106 m
+220.005 266.665 220.067 266.335 220.196 266.121 c
+220.332 265.915 220.553 265.813 220.857 265.813 c
+221.181 265.813 221.42 265.974 221.578 266.298 c
+221.578 268.311 l
+221.409 268.624 221.17 268.782 220.857 268.782 c
+220.553 268.782 220.332 268.679 220.196 268.473 c
+220.067 268.267 220.005 267.944 220.005 267.503 c
+h
+223.238 264.24 m
+222.841 264.504 l
+223.077 264.828 223.198 265.163 223.209 265.504 c
+223.209 266.121 l
+223.871 266.121 l
+223.871 265.593 l
+223.871 265.335 223.805 265.088 223.68 264.843 c
+223.562 264.6 223.415 264.398 223.238 264.24 c
+229.868 265.974 m
+229.75 265.828 l
+229.416 265.435 228.919 265.24 228.266 265.24 c
+227.685 265.24 227.23 265.431 226.899 265.813 c
+226.575 266.195 226.407 266.738 226.399 267.444 c
+226.399 268.488 l
+226.399 269.242 226.546 269.803 226.839 270.179 c
+227.141 270.549 227.593 270.737 228.192 270.737 c
+228.699 270.737 229.096 270.594 229.383 270.31 c
+229.677 270.024 229.839 269.62 229.868 269.09 c
+229.191 269.09 l
+229.17 269.421 229.077 269.682 228.913 269.869 c
+228.755 270.065 228.52 270.164 228.207 270.164 c
+227.814 270.164 227.531 270.035 227.354 269.782 c
+227.178 269.524 227.082 269.124 227.075 268.576 c
+227.075 267.488 l
+227.075 266.948 227.178 266.533 227.384 266.239 c
+227.589 265.952 227.884 265.813 228.266 265.813 c
+228.626 265.813 228.905 265.901 229.104 266.077 c
+229.191 266.165 l
+229.191 267.4 l
+228.221 267.4 l
+228.221 267.974 l
+229.868 267.974 l
+h
+231.587 265.313 -0.646 3.983 re
+231.632 270.34 m
+231.632 270.229 231.602 270.138 231.543 270.061 c
+231.485 269.991 231.389 269.958 231.265 269.958 c
+231.147 269.958 231.051 269.991 230.985 270.061 c
+230.926 270.138 230.897 270.229 230.897 270.34 c
+230.897 270.457 230.926 270.549 230.985 270.619 c
+231.051 270.696 231.147 270.737 231.265 270.737 c
+231.389 270.737 231.485 270.696 231.543 270.619 c
+231.602 270.538 231.632 270.447 231.632 270.34 c
+233.455 270.252 m
+233.455 269.296 l
+234.057 269.296 l
+234.057 268.768 l
+233.455 268.768 l
+233.455 266.298 l
+233.455 266.14 233.476 266.022 233.528 265.945 c
+233.586 265.864 233.675 265.828 233.792 265.828 c
+233.881 265.828 233.969 265.842 234.057 265.871 c
+234.057 265.313 l
+233.91 265.265 233.756 265.24 233.602 265.24 c
+233.345 265.24 233.15 265.331 233.014 265.518 c
+232.874 265.703 232.808 265.963 232.808 266.298 c
+232.808 268.768 l
+232.205 268.768 l
+232.205 269.296 l
+232.808 269.296 l
+232.808 270.252 l
+h
+239.51 266.459 m
+240.113 269.296 l
+240.76 269.296 l
+239.775 265.313 l
+239.261 265.313 l
+238.482 268.165 l
+237.732 265.313 l
+237.203 265.313 l
+236.247 269.296 l
+236.879 269.296 l
+237.497 266.533 l
+238.232 269.296 l
+238.746 269.296 l
+h
+242.142 265.313 -0.646 3.983 re
+242.186 270.34 m
+242.186 270.229 242.157 270.138 242.097 270.061 c
+242.039 269.991 241.943 269.958 241.818 269.958 c
+241.7 269.958 241.605 269.991 241.539 270.061 c
+241.48 270.138 241.451 270.229 241.451 270.34 c
+241.451 270.457 241.48 270.549 241.539 270.619 c
+241.605 270.696 241.7 270.737 241.818 270.737 c
+241.943 270.737 242.039 270.696 242.097 270.619 c
+242.157 270.538 242.186 270.447 242.186 270.34 c
+243.861 265.313 -0.646 5.644 re
+245.581 265.313 -0.646 5.644 re
+249.697 265.798 m
+249.91 265.798 250.083 265.861 250.211 265.989 c
+250.348 266.125 250.421 266.316 250.432 266.562 c
+251.049 266.562 l
+251.027 266.181 250.891 265.861 250.637 265.607 c
+250.381 265.361 250.068 265.24 249.697 265.24 c
+249.205 265.24 248.83 265.39 248.565 265.695 c
+248.308 266.007 248.183 266.474 248.183 267.091 c
+248.183 267.532 l
+248.183 268.128 248.308 268.583 248.565 268.899 c
+248.83 269.212 249.205 269.37 249.697 269.37 c
+250.097 269.37 250.417 269.238 250.652 268.973 c
+250.895 268.716 251.027 268.371 251.049 267.929 c
+250.432 267.929 l
+250.41 268.223 250.336 268.444 250.211 268.591 c
+250.094 268.737 249.921 268.811 249.697 268.811 c
+249.403 268.811 249.186 268.712 249.05 268.517 c
+248.91 268.33 248.837 268.022 248.83 267.592 c
+248.83 267.077 l
+248.83 266.607 248.896 266.272 249.035 266.077 c
+249.182 265.89 249.403 265.798 249.697 265.798 c
+253.445 268.679 m
+253.357 268.697 253.258 268.708 253.151 268.708 c
+252.817 268.708 252.582 268.525 252.445 268.165 c
+252.445 265.313 l
+251.799 265.313 l
+251.799 269.296 l
+252.431 269.296 l
+252.445 268.885 l
+252.622 269.208 252.865 269.37 253.18 269.37 c
+253.287 269.37 253.376 269.348 253.445 269.311 c
+h
+255.445 265.24 m
+254.945 265.24 254.562 265.387 254.298 265.68 c
+254.033 265.974 253.901 266.408 253.901 266.989 c
+253.901 267.459 l
+253.901 268.054 254.026 268.521 254.283 268.855 c
+254.548 269.197 254.907 269.37 255.371 269.37 c
+255.83 269.37 256.172 269.215 256.399 268.914 c
+256.635 268.62 256.756 268.157 256.767 267.532 c
+256.767 267.106 l
+254.548 267.106 l
+254.548 267.018 l
+254.548 266.584 254.625 266.272 254.783 266.077 c
+254.948 265.89 255.18 265.798 255.474 265.798 c
+255.668 265.798 255.842 265.832 255.988 265.901 c
+256.135 265.978 256.271 266.096 256.399 266.254 c
+256.738 265.842 l
+256.451 265.438 256.021 265.24 255.445 265.24 c
+255.371 268.811 m
+255.096 268.811 254.893 268.716 254.768 268.532 c
+254.639 268.344 254.566 268.054 254.548 267.665 c
+256.121 267.665 l
+256.121 267.753 l
+256.098 268.135 256.033 268.403 255.915 268.562 c
+255.797 268.727 255.613 268.811 255.371 268.811 c
+259.589 265.313 m
+259.549 265.401 259.524 265.548 259.516 265.753 c
+259.281 265.408 258.986 265.24 258.634 265.24 c
+258.271 265.24 257.987 265.335 257.781 265.533 c
+257.583 265.739 257.488 266.026 257.488 266.401 c
+257.488 266.801 257.623 267.121 257.899 267.356 c
+258.171 267.598 258.546 267.723 259.017 267.723 c
+259.501 267.723 l
+259.501 268.149 l
+259.501 268.385 259.446 268.55 259.339 268.65 c
+259.229 268.756 259.067 268.811 258.855 268.811 c
+258.656 268.811 258.494 268.753 258.369 268.635 c
+258.252 268.517 258.193 268.371 258.193 268.194 c
+257.546 268.194 l
+257.546 268.388 257.605 268.579 257.723 268.768 c
+257.847 268.951 258.009 269.098 258.208 269.208 c
+258.414 269.315 258.641 269.37 258.899 269.37 c
+259.299 269.37 259.604 269.267 259.81 269.061 c
+260.023 268.855 260.137 268.562 260.148 268.18 c
+260.148 266.165 l
+260.148 265.861 260.185 265.596 260.266 265.371 c
+260.266 265.313 l
+h
+258.722 265.828 m
+258.888 265.828 259.038 265.871 259.178 265.959 c
+259.325 266.048 259.431 266.158 259.501 266.298 c
+259.501 267.239 l
+259.134 267.239 l
+258.818 267.239 258.575 267.168 258.398 267.033 c
+258.223 266.904 258.134 266.717 258.134 266.474 c
+258.134 266.246 258.178 266.081 258.267 265.974 c
+258.354 265.875 258.506 265.828 258.722 265.828 c
+262.001 270.252 m
+262.001 269.296 l
+262.603 269.296 l
+262.603 268.768 l
+262.001 268.768 l
+262.001 266.298 l
+262.001 266.14 262.022 266.022 262.074 265.945 c
+262.132 265.864 262.221 265.828 262.338 265.828 c
+262.427 265.828 262.514 265.842 262.603 265.871 c
+262.603 265.313 l
+262.456 265.265 262.302 265.24 262.147 265.24 c
+261.89 265.24 261.695 265.331 261.559 265.518 c
+261.419 265.703 261.353 265.963 261.353 266.298 c
+261.353 268.768 l
+260.75 268.768 l
+260.75 269.296 l
+261.353 269.296 l
+261.353 270.252 l
+h
+264.793 265.24 m
+264.293 265.24 263.911 265.387 263.647 265.68 c
+263.382 265.974 263.25 266.408 263.25 266.989 c
+263.25 267.459 l
+263.25 268.054 263.374 268.521 263.632 268.855 c
+263.896 269.197 264.256 269.37 264.719 269.37 c
+265.178 269.37 265.521 269.215 265.748 268.914 c
+265.984 268.62 266.105 268.157 266.115 267.532 c
+266.115 267.106 l
+263.896 267.106 l
+263.896 267.018 l
+263.896 266.584 263.973 266.272 264.131 266.077 c
+264.297 265.89 264.528 265.798 264.823 265.798 c
+265.018 265.798 265.19 265.832 265.336 265.901 c
+265.484 265.978 265.62 266.096 265.748 266.254 c
+266.086 265.842 l
+265.8 265.438 265.37 265.24 264.793 265.24 c
+264.719 268.811 m
+264.444 268.811 264.241 268.716 264.117 268.532 c
+263.988 268.344 263.915 268.054 263.896 267.665 c
+265.469 267.665 l
+265.469 267.753 l
+265.447 268.135 265.381 268.403 265.263 268.562 c
+265.145 268.727 264.962 268.811 264.719 268.811 c
+f
+q 1 0 0 1 41.8817 255.9058 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.603 -0.073 -0.955 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.713 -2.102 1.087 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.249 3.337 c
+-0.36 3.443 -0.522 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.266 -1.866 3.454 c
+-1.741 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.29 4.056 0.015 3.954 0.221 3.748 c
+0.434 3.542 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.558 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.855 -1.19 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.562 -1.084 0.515 -0.867 0.515 c
+3.896 3.983 m
+3.91 3.542 l
+4.164 3.884 4.487 4.056 4.881 4.056 c
+5.586 4.056 5.943 3.586 5.953 2.645 c
+5.953 0 l
+5.307 0 l
+5.307 2.616 l
+5.307 2.929 5.251 3.149 5.145 3.278 c
+5.035 3.403 4.881 3.469 4.675 3.469 c
+4.516 3.469 4.37 3.414 4.233 3.307 c
+4.104 3.197 4.002 3.061 3.925 2.896 c
+3.925 0 l
+3.278 0 l
+3.278 3.983 l
+h
+8.349 -0.073 m
+7.85 -0.073 7.468 0.073 7.202 0.367 c
+6.938 0.661 6.806 1.095 6.806 1.675 c
+6.806 2.146 l
+6.806 2.741 6.93 3.208 7.188 3.542 c
+7.453 3.884 7.813 4.056 8.276 4.056 c
+8.735 4.056 9.077 3.902 9.305 3.601 c
+9.54 3.307 9.661 2.844 9.672 2.219 c
+9.672 1.793 l
+7.453 1.793 l
+7.453 1.705 l
+7.453 1.271 7.53 0.959 7.688 0.764 c
+7.853 0.577 8.085 0.484 8.378 0.484 c
+8.573 0.484 8.746 0.518 8.893 0.588 c
+9.04 0.665 9.176 0.783 9.305 0.941 c
+9.643 0.529 l
+9.356 0.125 8.926 -0.073 8.349 -0.073 c
+8.276 3.498 m
+8 3.498 7.798 3.403 7.673 3.219 c
+7.545 3.031 7.471 2.741 7.453 2.352 c
+9.025 2.352 l
+9.025 2.439 l
+9.003 2.822 8.937 3.09 8.819 3.248 c
+8.702 3.414 8.518 3.498 8.276 3.498 c
+13.421 1.146 m
+14.023 3.983 l
+14.67 3.983 l
+13.685 0 l
+13.17 0 l
+12.391 2.851 l
+11.642 0 l
+11.113 0 l
+10.157 3.983 l
+10.789 3.983 l
+11.406 1.22 l
+12.141 3.983 l
+12.656 3.983 l
+h
+16.933 2.175 m
+16.933 2.782 17.043 3.248 17.271 3.572 c
+17.506 3.895 17.834 4.056 18.256 4.056 c
+18.639 4.056 18.936 3.898 19.153 3.586 c
+19.153 5.644 l
+19.8 5.644 l
+19.8 0 l
+19.212 0 l
+19.168 0.426 l
+18.962 0.091 18.657 -0.073 18.256 -0.073 c
+17.845 -0.073 17.521 0.081 17.286 0.397 c
+17.051 0.72 16.933 1.176 16.933 1.764 c
+h
+17.581 1.793 m
+17.581 1.352 17.643 1.022 17.771 0.808 c
+17.907 0.602 18.128 0.5 18.433 0.5 c
+18.756 0.5 18.995 0.661 19.153 0.985 c
+19.153 2.998 l
+18.984 3.31 18.745 3.469 18.433 3.469 c
+18.128 3.469 17.907 3.366 17.771 3.16 c
+17.643 2.954 17.581 2.631 17.581 2.19 c
+h
+21.504 0 -0.646 3.983 re
+21.549 5.026 m
+21.549 4.916 21.519 4.825 21.461 4.748 c
+21.402 4.677 21.307 4.644 21.182 4.644 c
+21.064 4.644 20.968 4.677 20.902 4.748 c
+20.843 4.825 20.814 4.916 20.814 5.026 c
+20.814 5.144 20.843 5.236 20.902 5.306 c
+20.968 5.383 21.064 5.423 21.182 5.423 c
+21.307 5.423 21.402 5.383 21.461 5.306 c
+21.519 5.225 21.549 5.134 21.549 5.026 c
+24.166 3.366 m
+24.077 3.384 23.978 3.395 23.871 3.395 c
+23.537 3.395 23.302 3.212 23.166 2.851 c
+23.166 0 l
+22.519 0 l
+22.519 3.983 l
+23.151 3.983 l
+23.166 3.572 l
+23.343 3.895 23.584 4.056 23.9 4.056 c
+24.008 4.056 24.095 4.035 24.166 3.998 c
+h
+26.165 -0.073 m
+25.664 -0.073 25.282 0.073 25.018 0.367 c
+24.754 0.661 24.621 1.095 24.621 1.675 c
+24.621 2.146 l
+24.621 2.741 24.746 3.208 25.003 3.542 c
+25.267 3.884 25.628 4.056 26.091 4.056 c
+26.55 4.056 26.892 3.902 27.12 3.601 c
+27.355 3.307 27.476 2.844 27.487 2.219 c
+27.487 1.793 l
+25.267 1.793 l
+25.267 1.705 l
+25.267 1.271 25.345 0.959 25.503 0.764 c
+25.668 0.577 25.899 0.484 26.194 0.484 c
+26.389 0.484 26.562 0.518 26.709 0.588 c
+26.855 0.665 26.992 0.783 27.12 0.941 c
+27.458 0.529 l
+27.171 0.125 26.741 -0.073 26.165 -0.073 c
+26.091 3.498 m
+25.816 3.498 25.614 3.403 25.488 3.219 c
+25.36 3.031 25.286 2.741 25.267 2.352 c
+26.84 2.352 l
+26.84 2.439 l
+26.819 2.822 26.753 3.09 26.635 3.248 c
+26.518 3.414 26.333 3.498 26.091 3.498 c
+29.648 0.484 m
+29.861 0.484 30.034 0.548 30.163 0.675 c
+30.298 0.812 30.372 1.003 30.383 1.249 c
+31 1.249 l
+30.979 0.867 30.842 0.548 30.589 0.294 c
+30.331 0.048 30.019 -0.073 29.648 -0.073 c
+29.155 -0.073 28.781 0.077 28.517 0.382 c
+28.259 0.694 28.134 1.161 28.134 1.778 c
+28.134 2.219 l
+28.134 2.815 28.259 3.27 28.517 3.586 c
+28.781 3.898 29.155 4.056 29.648 4.056 c
+30.049 4.056 30.368 3.925 30.603 3.659 c
+30.846 3.403 30.979 3.057 31 2.616 c
+30.383 2.616 l
+30.361 2.91 30.287 3.131 30.163 3.278 c
+30.045 3.424 29.872 3.498 29.648 3.498 c
+29.354 3.498 29.138 3.399 29.001 3.204 c
+28.862 3.017 28.788 2.708 28.781 2.278 c
+28.781 1.764 l
+28.781 1.294 28.847 0.959 28.987 0.764 c
+29.134 0.577 29.354 0.484 29.648 0.484 c
+32.602 4.939 m
+32.602 3.983 l
+33.205 3.983 l
+33.205 3.454 l
+32.602 3.454 l
+32.602 0.985 l
+32.602 0.827 32.625 0.709 32.677 0.632 c
+32.735 0.551 32.823 0.515 32.941 0.515 c
+33.028 0.515 33.117 0.529 33.205 0.558 c
+33.205 0 l
+33.059 -0.048 32.904 -0.073 32.75 -0.073 c
+32.492 -0.073 32.297 0.018 32.162 0.205 c
+32.022 0.389 31.956 0.65 31.956 0.985 c
+31.956 3.454 l
+31.353 3.454 l
+31.353 3.983 l
+31.956 3.983 l
+31.956 4.939 l
+h
+33.764 2.175 m
+33.764 2.753 33.9 3.208 34.175 3.542 c
+34.458 3.884 34.83 4.056 35.293 4.056 c
+35.752 4.056 36.12 3.888 36.395 3.557 c
+36.678 3.233 36.825 2.786 36.836 2.219 c
+36.836 1.793 l
+36.836 1.224 36.693 0.768 36.409 0.426 c
+36.134 0.091 35.767 -0.073 35.307 -0.073 c
+34.844 -0.073 34.473 0.087 34.19 0.411 c
+33.915 0.742 33.772 1.183 33.764 1.734 c
+h
+34.41 1.793 m
+34.41 1.389 34.488 1.072 34.646 0.837 c
+34.811 0.602 35.031 0.484 35.307 0.484 c
+35.873 0.484 36.167 0.897 36.189 1.72 c
+36.189 2.175 l
+36.189 2.576 36.105 2.896 35.939 3.131 c
+35.781 3.374 35.565 3.498 35.293 3.498 c
+35.028 3.498 34.811 3.374 34.646 3.131 c
+34.488 2.896 34.41 2.576 34.41 2.175 c
+h
+39.32 3.366 m
+39.232 3.384 39.133 3.395 39.027 3.395 c
+38.692 3.395 38.456 3.212 38.321 2.851 c
+38.321 0 l
+37.674 0 l
+37.674 3.983 l
+38.306 3.983 l
+38.321 3.572 l
+38.497 3.895 38.74 4.056 39.056 4.056 c
+39.162 4.056 39.25 4.035 39.32 3.998 c
+h
+41.128 1.087 m
+41.849 3.983 l
+42.539 3.983 l
+41.246 -0.559 l
+41.146 -0.9 41.003 -1.162 40.82 -1.338 c
+40.643 -1.515 40.441 -1.602 40.217 -1.602 c
+40.128 -1.602 40.014 -1.58 39.879 -1.544 c
+39.879 -1 l
+40.026 -1.014 l
+40.209 -1.014 40.357 -0.971 40.467 -0.882 c
+40.573 -0.794 40.662 -0.636 40.731 -0.412 c
+40.849 0.029 l
+39.688 3.983 l
+40.393 3.983 l
+h
+45.508 3.983 m
+45.523 3.542 l
+45.776 3.884 46.1 4.056 46.493 4.056 c
+47.199 4.056 47.555 3.586 47.567 2.645 c
+47.567 0 l
+46.919 0 l
+46.919 2.616 l
+46.919 2.929 46.865 3.149 46.758 3.278 c
+46.648 3.403 46.493 3.469 46.287 3.469 c
+46.129 3.469 45.982 3.414 45.847 3.307 c
+45.718 3.197 45.615 3.061 45.537 2.896 c
+45.537 0 l
+44.891 0 l
+44.891 3.983 l
+h
+50.58 0 m
+50.539 0.087 50.513 0.235 50.506 0.44 c
+50.271 0.095 49.977 -0.073 49.624 -0.073 c
+49.26 -0.073 48.978 0.022 48.772 0.22 c
+48.573 0.426 48.477 0.713 48.477 1.087 c
+48.477 1.488 48.614 1.808 48.889 2.043 c
+49.161 2.285 49.536 2.41 50.006 2.41 c
+50.491 2.41 l
+50.491 2.836 l
+50.491 3.072 50.436 3.237 50.33 3.337 c
+50.219 3.443 50.058 3.498 49.845 3.498 c
+49.647 3.498 49.485 3.439 49.36 3.322 c
+49.242 3.204 49.183 3.057 49.183 2.881 c
+48.536 2.881 l
+48.536 3.075 48.595 3.266 48.712 3.454 c
+48.838 3.638 48.999 3.785 49.198 3.895 c
+49.404 4.002 49.632 4.056 49.888 4.056 c
+50.289 4.056 50.594 3.954 50.8 3.748 c
+51.013 3.542 51.127 3.248 51.138 2.866 c
+51.138 0.852 l
+51.138 0.548 51.175 0.283 51.256 0.058 c
+51.256 0 l
+h
+49.712 0.515 m
+49.878 0.515 50.029 0.558 50.168 0.646 c
+50.315 0.735 50.422 0.845 50.491 0.985 c
+50.491 1.926 l
+50.124 1.926 l
+49.807 1.926 49.566 1.855 49.389 1.72 c
+49.213 1.591 49.124 1.404 49.124 1.161 c
+49.124 0.933 49.169 0.768 49.256 0.661 c
+49.345 0.562 49.495 0.515 49.712 0.515 c
+52.755 3.983 m
+52.77 3.615 l
+53.013 3.91 53.332 4.056 53.725 4.056 c
+54.166 4.056 54.474 3.858 54.651 3.469 c
+54.904 3.858 55.254 4.056 55.695 4.056 c
+56.43 4.056 56.805 3.594 56.826 2.675 c
+56.826 0 l
+56.18 0 l
+56.18 2.616 l
+56.18 2.91 56.125 3.123 56.018 3.262 c
+55.919 3.399 55.746 3.469 55.504 3.469 c
+55.305 3.469 55.143 3.388 55.019 3.233 c
+54.901 3.087 54.831 2.896 54.813 2.66 c
+54.813 0 l
+54.152 0 l
+54.152 2.645 l
+54.152 3.193 53.931 3.469 53.49 3.469 c
+53.156 3.469 52.92 3.307 52.784 2.984 c
+52.784 0 l
+52.138 0 l
+52.138 3.983 l
+h
+59.222 -0.073 m
+58.723 -0.073 58.341 0.073 58.077 0.367 c
+57.811 0.661 57.68 1.095 57.68 1.675 c
+57.68 2.146 l
+57.68 2.741 57.804 3.208 58.061 3.542 c
+58.326 3.884 58.686 4.056 59.149 4.056 c
+59.608 4.056 59.951 3.902 60.178 3.601 c
+60.413 3.307 60.535 2.844 60.545 2.219 c
+60.545 1.793 l
+58.326 1.793 l
+58.326 1.705 l
+58.326 1.271 58.403 0.959 58.561 0.764 c
+58.727 0.577 58.958 0.484 59.252 0.484 c
+59.447 0.484 59.619 0.518 59.766 0.588 c
+59.914 0.665 60.049 0.783 60.178 0.941 c
+60.516 0.529 l
+60.23 0.125 59.8 -0.073 59.222 -0.073 c
+59.149 3.498 m
+58.873 3.498 58.671 3.403 58.547 3.219 c
+58.418 3.031 58.345 2.741 58.326 2.352 c
+59.899 2.352 l
+59.899 2.439 l
+59.877 2.822 59.81 3.09 59.693 3.248 c
+59.575 3.414 59.392 3.498 59.149 3.498 c
+61.192 2.175 m
+61.192 2.782 61.302 3.248 61.53 3.572 c
+61.765 3.895 62.093 4.056 62.515 4.056 c
+62.897 4.056 63.195 3.898 63.411 3.586 c
+63.411 5.644 l
+64.059 5.644 l
+64.059 0 l
+63.471 0 l
+63.427 0.426 l
+63.221 0.091 62.916 -0.073 62.515 -0.073 c
+62.104 -0.073 61.78 0.081 61.545 0.397 c
+61.31 0.72 61.192 1.176 61.192 1.764 c
+h
+61.84 1.793 m
+61.84 1.352 61.902 1.022 62.03 0.808 c
+62.166 0.602 62.387 0.5 62.692 0.5 c
+63.015 0.5 63.253 0.661 63.411 0.985 c
+63.411 2.998 l
+63.243 3.31 63.004 3.469 62.692 3.469 c
+62.387 3.469 62.166 3.366 62.03 3.16 c
+61.902 2.954 61.84 2.631 61.84 2.19 c
+h
+f
+Q
+q 1 0 0 1 110.0119 261.315 cm
+0 0 m
+-0.382 0 l
+-0.382 -5.835 l
+0 -5.835 l
+0 -6.659 l
+-1.426 -6.659 l
+-1.426 0.823 l
+0 0.823 l
+h
+3.63 -3.543 m
+3.63 -4.171 3.52 -4.653 3.308 -4.983 c
+3.09 -5.318 2.77 -5.483 2.352 -5.483 c
+2.028 -5.483 1.768 -5.351 1.573 -5.087 c
+1.573 -6.938 l
+0.53 -6.938 l
+0.53 -1.426 l
+1.484 -1.426 l
+1.529 -1.794 l
+1.723 -1.5 1.992 -1.353 2.337 -1.353 c
+2.756 -1.353 3.076 -1.511 3.293 -1.823 c
+3.506 -2.128 3.62 -2.598 3.63 -3.234 c
+h
+2.587 -3.278 m
+2.587 -2.896 2.543 -2.627 2.454 -2.469 c
+2.373 -2.315 2.234 -2.234 2.028 -2.234 c
+1.822 -2.234 1.668 -2.323 1.573 -2.5 c
+1.573 -4.366 l
+1.661 -4.535 1.816 -4.616 2.043 -4.616 c
+2.249 -4.616 2.389 -4.535 2.469 -4.366 c
+2.547 -4.189 2.587 -3.917 2.587 -3.543 c
+h
+6.217 -2.44 m
+5.88 -2.411 l
+5.593 -2.411 5.402 -2.536 5.307 -2.778 c
+5.307 -5.409 l
+4.262 -5.409 l
+4.262 -1.426 l
+5.233 -1.426 l
+5.263 -1.867 l
+5.428 -1.525 5.66 -1.353 5.953 -1.353 c
+6.071 -1.353 6.163 -1.374 6.232 -1.411 c
+h
+6.512 -3.293 m
+6.512 -2.687 6.651 -2.213 6.938 -1.867 c
+7.221 -1.525 7.614 -1.353 8.114 -1.353 c
+8.621 -1.353 9.018 -1.525 9.305 -1.867 c
+9.587 -2.213 9.731 -2.687 9.731 -3.293 c
+9.731 -3.558 l
+9.731 -4.156 9.587 -4.627 9.305 -4.969 c
+9.018 -5.314 8.621 -5.483 8.114 -5.483 c
+7.603 -5.483 7.206 -5.314 6.923 -4.969 c
+6.647 -4.627 6.512 -4.152 6.512 -3.543 c
+h
+7.555 -3.558 m
+7.555 -4.263 7.739 -4.616 8.114 -4.616 c
+8.467 -4.616 8.658 -4.322 8.687 -3.734 c
+8.687 -3.293 l
+8.687 -2.932 8.636 -2.66 8.54 -2.484 c
+8.441 -2.308 8.297 -2.22 8.114 -2.22 c
+7.937 -2.22 7.798 -2.308 7.702 -2.484 c
+7.603 -2.66 7.555 -2.932 7.555 -3.293 c
+h
+11.465 -1.426 m
+11.465 -5.63 l
+11.465 -6.078 11.362 -6.423 11.156 -6.659 c
+10.951 -6.894 10.657 -7.011 10.275 -7.011 c
+10.105 -7.011 9.951 -6.99 9.804 -6.953 c
+9.789 -6.101 l
+9.907 -6.13 9.999 -6.145 10.069 -6.145 c
+10.304 -6.145 10.422 -5.983 10.422 -5.659 c
+10.422 -1.426 l
+h
+10.363 -0.397 m
+10.363 -0.243 10.41 -0.114 10.51 -0.015 c
+10.616 0.091 10.753 0.147 10.921 0.147 c
+11.098 0.147 11.233 0.091 11.333 -0.015 c
+11.439 -0.114 11.495 -0.243 11.495 -0.397 c
+11.495 -0.566 11.439 -0.702 11.333 -0.809 c
+11.233 -0.908 11.098 -0.956 10.921 -0.956 c
+10.745 -0.956 10.605 -0.908 10.51 -0.809 c
+10.41 -0.702 10.363 -0.566 10.363 -0.397 c
+13.832 -5.483 m
+13.303 -5.483 12.883 -5.328 12.582 -5.012 c
+12.289 -4.69 12.141 -4.23 12.141 -3.631 c
+12.141 -3.323 l
+12.141 -2.697 12.278 -2.213 12.553 -1.867 c
+12.825 -1.525 13.218 -1.353 13.729 -1.353 c
+14.229 -1.353 14.6 -1.515 14.846 -1.837 c
+15.1 -2.161 15.232 -2.639 15.243 -3.263 c
+15.243 -3.763 l
+13.17 -3.763 l
+13.189 -4.057 13.251 -4.274 13.361 -4.41 c
+13.479 -4.549 13.66 -4.616 13.905 -4.616 c
+14.247 -4.616 14.537 -4.499 14.772 -4.263 c
+15.184 -4.895 l
+15.056 -5.072 14.868 -5.215 14.626 -5.322 c
+14.379 -5.428 14.115 -5.483 13.832 -5.483 c
+13.185 -3.043 m
+14.214 -3.043 l
+14.214 -2.94 l
+14.214 -2.705 14.173 -2.529 14.096 -2.411 c
+14.026 -2.286 13.898 -2.22 13.714 -2.22 c
+13.538 -2.22 13.406 -2.29 13.317 -2.425 c
+13.236 -2.554 13.192 -2.76 13.185 -3.043 c
+17.271 -4.616 m
+17.565 -4.616 17.716 -4.421 17.727 -4.028 c
+18.697 -4.028 l
+18.697 -4.461 18.565 -4.814 18.3 -5.087 c
+18.036 -5.351 17.698 -5.483 17.286 -5.483 c
+16.775 -5.483 16.382 -5.328 16.11 -5.012 c
+15.846 -4.69 15.706 -4.219 15.698 -3.601 c
+15.698 -3.278 l
+15.698 -2.654 15.831 -2.176 16.095 -1.852 c
+16.367 -1.521 16.764 -1.353 17.286 -1.353 c
+17.716 -1.353 18.057 -1.492 18.315 -1.764 c
+18.568 -2.04 18.697 -2.421 18.697 -2.911 c
+17.727 -2.911 l
+17.727 -2.697 17.687 -2.529 17.61 -2.411 c
+17.54 -2.286 17.423 -2.22 17.257 -2.22 c
+17.08 -2.22 16.952 -2.286 16.874 -2.411 c
+16.794 -2.539 16.75 -2.789 16.742 -3.161 c
+16.742 -3.572 l
+16.742 -3.896 16.757 -4.123 16.787 -4.248 c
+16.823 -4.377 16.878 -4.469 16.948 -4.528 c
+17.026 -4.586 17.132 -4.616 17.271 -4.616 c
+20.505 -0.456 m
+20.505 -1.426 l
+21.034 -1.426 l
+21.034 -2.22 l
+20.505 -2.22 l
+20.505 -4.189 l
+20.505 -4.347 20.523 -4.454 20.564 -4.513 c
+20.612 -4.572 20.696 -4.601 20.814 -4.601 c
+20.92 -4.601 21.005 -4.594 21.064 -4.572 c
+21.064 -5.38 l
+20.887 -5.446 20.696 -5.483 20.49 -5.483 c
+19.815 -5.483 19.469 -5.097 19.461 -4.322 c
+19.461 -2.22 l
+19.006 -2.22 l
+19.006 -1.426 l
+19.461 -1.426 l
+19.461 -0.456 l
+h
+24.297 -1.426 m
+24.327 -1.823 l
+24.562 -1.511 24.864 -1.353 25.238 -1.353 c
+25.922 -1.353 26.275 -1.833 26.296 -2.793 c
+26.296 -5.409 l
+25.253 -5.409 l
+25.253 -2.866 l
+25.253 -2.643 25.217 -2.481 25.15 -2.382 c
+25.08 -2.286 24.963 -2.234 24.797 -2.234 c
+24.61 -2.234 24.463 -2.33 24.357 -2.514 c
+24.357 -5.409 l
+23.312 -5.409 l
+23.312 -1.426 l
+h
+28.928 -5.409 m
+28.899 -5.351 28.868 -5.247 28.839 -5.101 c
+28.652 -5.358 28.402 -5.483 28.09 -5.483 c
+27.756 -5.483 27.476 -5.376 27.252 -5.16 c
+27.035 -4.935 26.929 -4.645 26.929 -4.293 c
+26.929 -3.881 27.061 -3.564 27.326 -3.337 c
+27.59 -3.102 27.972 -2.984 28.472 -2.984 c
+28.795 -2.984 l
+28.795 -2.66 l
+28.795 -2.484 28.758 -2.363 28.693 -2.294 c
+28.633 -2.216 28.546 -2.176 28.428 -2.176 c
+28.17 -2.176 28.046 -2.33 28.046 -2.631 c
+27.002 -2.631 l
+27.002 -2.261 27.138 -1.955 27.414 -1.72 c
+27.686 -1.478 28.035 -1.353 28.457 -1.353 c
+28.899 -1.353 29.236 -1.47 29.471 -1.706 c
+29.714 -1.933 29.839 -2.257 29.839 -2.675 c
+29.839 -4.542 l
+29.839 -4.888 29.887 -5.156 29.986 -5.351 c
+29.986 -5.409 l
+h
+28.325 -4.659 m
+28.432 -4.659 28.523 -4.642 28.604 -4.601 c
+28.693 -4.553 28.755 -4.495 28.795 -4.424 c
+28.795 -3.601 l
+28.546 -3.601 l
+28.369 -3.601 28.226 -3.66 28.12 -3.778 c
+28.02 -3.888 27.972 -4.035 27.972 -4.219 c
+27.972 -4.513 28.09 -4.659 28.325 -4.659 c
+31.559 -1.426 m
+31.588 -1.794 l
+31.823 -1.5 32.132 -1.353 32.515 -1.353 c
+32.915 -1.353 33.194 -1.536 33.352 -1.897 c
+33.587 -1.536 33.915 -1.353 34.337 -1.353 c
+35.031 -1.353 35.384 -1.837 35.395 -2.808 c
+35.395 -5.409 l
+34.366 -5.409 l
+34.366 -2.866 l
+34.366 -2.643 34.329 -2.481 34.264 -2.382 c
+34.204 -2.286 34.094 -2.234 33.94 -2.234 c
+33.742 -2.234 33.602 -2.352 33.514 -2.587 c
+33.514 -5.409 l
+32.471 -5.409 l
+32.471 -2.881 l
+32.471 -2.646 32.44 -2.481 32.382 -2.382 c
+32.323 -2.286 32.213 -2.234 32.059 -2.234 c
+31.883 -2.234 31.739 -2.33 31.632 -2.514 c
+31.632 -5.409 l
+30.589 -5.409 l
+30.589 -1.426 l
+h
+37.776 -5.483 m
+37.248 -5.483 36.828 -5.328 36.527 -5.012 c
+36.234 -4.69 36.086 -4.23 36.086 -3.631 c
+36.086 -3.323 l
+36.086 -2.697 36.222 -2.213 36.498 -1.867 c
+36.77 -1.525 37.163 -1.353 37.674 -1.353 c
+38.173 -1.353 38.545 -1.515 38.79 -1.837 c
+39.044 -2.161 39.177 -2.639 39.187 -3.263 c
+39.187 -3.763 l
+37.115 -3.763 l
+37.134 -4.057 37.196 -4.274 37.306 -4.41 c
+37.424 -4.549 37.604 -4.616 37.85 -4.616 c
+38.192 -4.616 38.482 -4.499 38.717 -4.263 c
+39.129 -4.895 l
+39 -5.072 38.813 -5.215 38.57 -5.322 c
+38.324 -5.428 38.059 -5.483 37.776 -5.483 c
+37.13 -3.043 m
+38.159 -3.043 l
+38.159 -2.94 l
+38.159 -2.705 38.119 -2.529 38.041 -2.411 c
+37.971 -2.286 37.843 -2.22 37.659 -2.22 c
+37.483 -2.22 37.35 -2.29 37.262 -2.425 c
+37.181 -2.554 37.138 -2.76 37.13 -3.043 c
+39.526 0.823 m
+40.951 0.823 l
+40.951 -6.659 l
+39.526 -6.659 l
+39.526 -5.835 l
+39.908 -5.835 l
+39.908 0 l
+39.526 0 l
+h
+f
+Q
+q 1 0 0 1 155.6378 255.9058 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.713 -2.102 1.087 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.25 3.337 c
+-0.36 3.443 -0.522 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.266 -1.866 3.454 c
+-1.742 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.015 3.954 0.22 3.748 c
+0.434 3.542 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.558 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.855 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.235 0.562 -1.084 0.515 -0.867 0.515 c
+2.176 3.983 m
+2.19 3.542 l
+2.444 3.884 2.767 4.056 3.16 4.056 c
+3.865 4.056 4.222 3.586 4.233 2.645 c
+4.233 0 l
+3.587 0 l
+3.587 2.616 l
+3.587 2.929 3.532 3.149 3.425 3.278 c
+3.314 3.403 3.16 3.469 2.955 3.469 c
+2.797 3.469 2.649 3.414 2.514 3.307 c
+2.385 3.197 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.558 0 l
+1.558 3.983 l
+h
+5.072 2.175 m
+5.072 2.782 5.182 3.248 5.409 3.572 c
+5.644 3.895 5.972 4.056 6.394 4.056 c
+6.776 4.056 7.074 3.898 7.291 3.586 c
+7.291 5.644 l
+7.937 5.644 l
+7.937 0 l
+7.35 0 l
+7.306 0.426 l
+7.1 0.091 6.795 -0.073 6.394 -0.073 c
+5.982 -0.073 5.659 0.081 5.424 0.397 c
+5.189 0.72 5.072 1.176 5.072 1.764 c
+h
+5.718 1.793 m
+5.718 1.352 5.781 1.022 5.909 0.808 c
+6.045 0.602 6.265 0.5 6.57 0.5 c
+6.894 0.5 7.133 0.661 7.291 0.985 c
+7.291 2.998 l
+7.121 3.31 6.882 3.469 6.57 3.469 c
+6.265 3.469 6.045 3.366 5.909 3.16 c
+5.781 2.954 5.718 2.631 5.718 2.19 c
+h
+13.626 1.146 m
+14.229 3.983 l
+14.876 3.983 l
+13.891 0 l
+13.376 0 l
+12.597 2.851 l
+11.848 0 l
+11.318 0 l
+10.363 3.983 l
+10.994 3.983 l
+11.612 1.22 l
+12.347 3.983 l
+12.862 3.983 l
+h
+16.257 0 -0.646 3.983 re
+16.301 5.026 m
+16.301 4.916 16.272 4.825 16.213 4.748 c
+16.154 4.677 16.058 4.644 15.933 4.644 c
+15.817 4.644 15.721 4.677 15.655 4.748 c
+15.596 4.825 15.566 4.916 15.566 5.026 c
+15.566 5.144 15.596 5.236 15.655 5.306 c
+15.721 5.383 15.817 5.423 15.933 5.423 c
+16.058 5.423 16.154 5.383 16.213 5.306 c
+16.272 5.225 16.301 5.134 16.301 5.026 c
+17.977 0 -0.646 5.644 re
+19.696 0 -0.646 5.644 re
+23.137 0 -0.647 3.983 re
+23.181 5.026 m
+23.181 4.916 23.151 4.825 23.092 4.748 c
+23.033 4.677 22.938 4.644 22.813 4.644 c
+22.695 4.644 22.599 4.677 22.534 4.748 c
+22.475 4.825 22.445 4.916 22.445 5.026 c
+22.445 5.144 22.475 5.236 22.534 5.306 c
+22.599 5.383 22.695 5.423 22.813 5.423 c
+22.938 5.423 23.033 5.383 23.092 5.306 c
+23.151 5.225 23.181 5.134 23.181 5.026 c
+24.768 3.983 m
+24.783 3.542 l
+25.036 3.884 25.359 4.056 25.753 4.056 c
+26.458 4.056 26.815 3.586 26.826 2.645 c
+26.826 0 l
+26.179 0 l
+26.179 2.616 l
+26.179 2.929 26.124 3.149 26.017 3.278 c
+25.907 3.403 25.753 3.469 25.547 3.469 c
+25.389 3.469 25.242 3.414 25.105 3.307 c
+24.978 3.197 24.874 3.061 24.797 2.896 c
+24.797 0 l
+24.151 0 l
+24.151 3.983 l
+h
+28.502 0 -0.647 3.983 re
+28.546 5.026 m
+28.546 4.916 28.517 4.825 28.457 4.748 c
+28.398 4.677 28.303 4.644 28.178 4.644 c
+28.06 4.644 27.965 4.677 27.899 4.748 c
+27.84 4.825 27.811 4.916 27.811 5.026 c
+27.811 5.144 27.84 5.236 27.899 5.306 c
+27.965 5.383 28.06 5.423 28.178 5.423 c
+28.303 5.423 28.398 5.383 28.457 5.306 c
+28.517 5.225 28.546 5.134 28.546 5.026 c
+30.368 4.939 m
+30.368 3.983 l
+30.971 3.983 l
+30.971 3.454 l
+30.368 3.454 l
+30.368 0.985 l
+30.368 0.827 30.391 0.709 30.441 0.632 c
+30.501 0.551 30.589 0.515 30.707 0.515 c
+30.794 0.515 30.883 0.529 30.971 0.558 c
+30.971 0 l
+30.824 -0.048 30.67 -0.073 30.515 -0.073 c
+30.258 -0.073 30.063 0.018 29.928 0.205 c
+29.788 0.389 29.722 0.65 29.722 0.985 c
+29.722 3.454 l
+29.119 3.454 l
+29.119 3.983 l
+29.722 3.983 l
+29.722 4.939 l
+h
+32.44 0 -0.646 3.983 re
+32.485 5.026 m
+32.485 4.916 32.456 4.825 32.396 4.748 c
+32.338 4.677 32.242 4.644 32.118 4.644 c
+32 4.644 31.904 4.677 31.838 4.748 c
+31.779 4.825 31.75 4.916 31.75 5.026 c
+31.75 5.144 31.779 5.236 31.838 5.306 c
+31.904 5.383 32 5.423 32.118 5.423 c
+32.242 5.423 32.338 5.383 32.396 5.306 c
+32.456 5.225 32.485 5.134 32.485 5.026 c
+35.498 0 m
+35.457 0.087 35.432 0.235 35.424 0.44 c
+35.189 0.095 34.896 -0.073 34.543 -0.073 c
+34.179 -0.073 33.896 0.022 33.691 0.22 c
+33.492 0.426 33.396 0.713 33.396 1.087 c
+33.396 1.488 33.533 1.808 33.807 2.043 c
+34.08 2.285 34.455 2.41 34.925 2.41 c
+35.41 2.41 l
+35.41 2.836 l
+35.41 3.072 35.355 3.237 35.249 3.337 c
+35.138 3.443 34.977 3.498 34.763 3.498 c
+34.565 3.498 34.403 3.439 34.278 3.322 c
+34.161 3.204 34.102 3.057 34.102 2.881 c
+33.456 2.881 l
+33.456 3.075 33.514 3.266 33.631 3.454 c
+33.757 3.638 33.918 3.785 34.117 3.895 c
+34.322 4.002 34.551 4.056 34.807 4.056 c
+35.208 4.056 35.513 3.954 35.719 3.748 c
+35.932 3.542 36.045 3.248 36.057 2.866 c
+36.057 0.852 l
+36.057 0.548 36.093 0.283 36.174 0.058 c
+36.174 0 l
+h
+34.631 0.515 m
+34.796 0.515 34.947 0.558 35.087 0.646 c
+35.234 0.735 35.34 0.845 35.41 0.985 c
+35.41 1.926 l
+35.043 1.926 l
+34.726 1.926 34.484 1.855 34.308 1.72 c
+34.131 1.591 34.043 1.404 34.043 1.161 c
+34.043 0.933 34.087 0.768 34.175 0.661 c
+34.264 0.562 34.414 0.515 34.631 0.515 c
+37.762 0 -0.647 5.644 re
+39.482 0 -0.647 3.983 re
+39.526 5.026 m
+39.526 4.916 39.496 4.825 39.438 4.748 c
+39.378 4.677 39.283 4.644 39.158 4.644 c
+39.041 4.644 38.945 4.677 38.879 4.748 c
+38.821 4.825 38.79 4.916 38.79 5.026 c
+38.79 5.144 38.821 5.236 38.879 5.306 c
+38.945 5.383 39.041 5.423 39.158 5.423 c
+39.283 5.423 39.378 5.383 39.438 5.306 c
+39.496 5.225 39.526 5.134 39.526 5.026 c
+41.098 0.558 m
+43.024 0.558 l
+43.024 0 l
+40.363 0 l
+40.363 0.5 l
+42.187 3.41 l
+40.378 3.41 l
+40.378 3.983 l
+42.95 3.983 l
+42.95 3.498 l
+h
+45.171 -0.073 m
+44.67 -0.073 44.288 0.073 44.024 0.367 c
+43.759 0.661 43.627 1.095 43.627 1.675 c
+43.627 2.146 l
+43.627 2.741 43.752 3.208 44.009 3.542 c
+44.274 3.884 44.633 4.056 45.096 4.056 c
+45.556 4.056 45.898 3.902 46.125 3.601 c
+46.361 3.307 46.482 2.844 46.493 2.219 c
+46.493 1.793 l
+44.274 1.793 l
+44.274 1.705 l
+44.274 1.271 44.351 0.959 44.509 0.764 c
+44.674 0.577 44.905 0.484 45.2 0.484 c
+45.394 0.484 45.567 0.518 45.714 0.588 c
+45.861 0.665 45.997 0.783 46.125 0.941 c
+46.464 0.529 l
+46.177 0.125 45.747 -0.073 45.171 -0.073 c
+45.096 3.498 m
+44.822 3.498 44.619 3.403 44.494 3.219 c
+44.365 3.031 44.292 2.741 44.274 2.352 c
+45.846 2.352 l
+45.846 2.439 l
+45.824 2.822 45.758 3.09 45.641 3.248 c
+45.523 3.414 45.339 3.498 45.096 3.498 c
+51.035 0 m
+50.995 0.087 50.969 0.235 50.962 0.44 c
+50.727 0.095 50.432 -0.073 50.079 -0.073 c
+49.716 -0.073 49.433 0.022 49.227 0.22 c
+49.029 0.426 48.934 0.713 48.934 1.087 c
+48.934 1.488 49.069 1.808 49.345 2.043 c
+49.616 2.285 49.992 2.41 50.462 2.41 c
+50.947 2.41 l
+50.947 2.836 l
+50.947 3.072 50.892 3.237 50.785 3.337 c
+50.675 3.443 50.513 3.498 50.3 3.498 c
+50.102 3.498 49.94 3.439 49.815 3.322 c
+49.697 3.204 49.639 3.057 49.639 2.881 c
+48.992 2.881 l
+48.992 3.075 49.051 3.266 49.169 3.454 c
+49.293 3.638 49.455 3.785 49.653 3.895 c
+49.859 4.002 50.087 4.056 50.345 4.056 c
+50.744 4.056 51.05 3.954 51.255 3.748 c
+51.469 3.542 51.583 3.248 51.594 2.866 c
+51.594 0.852 l
+51.594 0.548 51.631 0.283 51.711 0.058 c
+51.711 0 l
+h
+50.168 0.515 m
+50.333 0.515 50.484 0.558 50.624 0.646 c
+50.771 0.735 50.877 0.845 50.947 0.985 c
+50.947 1.926 l
+50.58 1.926 l
+50.264 1.926 50.021 1.855 49.844 1.72 c
+49.668 1.591 49.58 1.404 49.58 1.161 c
+49.58 0.933 49.624 0.768 49.712 0.661 c
+49.8 0.562 49.951 0.515 50.168 0.515 c
+55.959 3.366 m
+55.871 3.384 55.772 3.395 55.665 3.395 c
+55.331 3.395 55.095 3.212 54.96 2.851 c
+54.96 0 l
+54.313 0 l
+54.313 3.983 l
+54.945 3.983 l
+54.96 3.572 l
+55.136 3.895 55.378 4.056 55.695 4.056 c
+55.801 4.056 55.889 4.035 55.959 3.998 c
+h
+57.958 -0.073 m
+57.458 -0.073 57.077 0.073 56.812 0.367 c
+56.547 0.661 56.415 1.095 56.415 1.675 c
+56.415 2.146 l
+56.415 2.741 56.54 3.208 56.797 3.542 c
+57.061 3.884 57.422 4.056 57.885 4.056 c
+58.345 4.056 58.686 3.902 58.914 3.601 c
+59.149 3.307 59.27 2.844 59.282 2.219 c
+59.282 1.793 l
+57.061 1.793 l
+57.061 1.705 l
+57.061 1.271 57.139 0.959 57.297 0.764 c
+57.462 0.577 57.694 0.484 57.988 0.484 c
+58.183 0.484 58.355 0.518 58.502 0.588 c
+58.649 0.665 58.785 0.783 58.914 0.941 c
+59.252 0.529 l
+58.966 0.125 58.536 -0.073 57.958 -0.073 c
+57.885 3.498 m
+57.609 3.498 57.407 3.403 57.283 3.219 c
+57.154 3.031 57.08 2.741 57.061 2.352 c
+58.634 2.352 l
+58.634 2.439 l
+58.613 2.822 58.546 3.09 58.428 3.248 c
+58.311 3.414 58.127 3.498 57.885 3.498 c
+62.941 1.793 m
+62.941 1.165 62.824 0.694 62.588 0.382 c
+62.361 0.077 62.045 -0.073 61.633 -0.073 c
+61.229 -0.073 60.92 0.077 60.707 0.382 c
+60.707 -1.529 l
+60.061 -1.529 l
+60.061 3.983 l
+60.649 3.983 l
+60.693 3.542 l
+60.905 3.884 61.214 4.056 61.618 4.056 c
+62.06 4.056 62.386 3.902 62.603 3.601 c
+62.816 3.296 62.931 2.84 62.941 2.234 c
+h
+62.295 2.175 m
+62.295 2.616 62.225 2.94 62.089 3.145 c
+61.95 3.358 61.728 3.469 61.427 3.469 c
+61.111 3.469 60.872 3.314 60.707 3.013 c
+60.707 0.941 l
+60.872 0.636 61.111 0.484 61.427 0.484 c
+61.721 0.484 61.935 0.588 62.074 0.793 c
+62.21 1.007 62.284 1.338 62.295 1.778 c
+h
+63.647 2.175 m
+63.647 2.753 63.783 3.208 64.059 3.542 c
+64.342 3.884 64.713 4.056 65.175 4.056 c
+65.635 4.056 66.002 3.888 66.278 3.557 c
+66.561 3.233 66.708 2.786 66.719 2.219 c
+66.719 1.793 l
+66.719 1.224 66.576 0.768 66.293 0.426 c
+66.017 0.091 65.649 -0.073 65.19 -0.073 c
+64.728 -0.073 64.356 0.087 64.073 0.411 c
+63.797 0.742 63.654 1.183 63.647 1.734 c
+h
+64.294 1.793 m
+64.294 1.389 64.371 1.072 64.529 0.837 c
+64.695 0.602 64.915 0.484 65.19 0.484 c
+65.756 0.484 66.05 0.897 66.072 1.72 c
+66.072 2.175 l
+66.072 2.576 65.988 2.896 65.823 3.131 c
+65.665 3.374 65.447 3.498 65.175 3.498 c
+64.911 3.498 64.695 3.374 64.529 3.131 c
+64.371 2.896 64.294 2.576 64.294 2.175 c
+h
+69.497 1.014 m
+69.497 1.161 69.442 1.282 69.335 1.381 c
+69.225 1.477 69.019 1.595 68.718 1.734 c
+68.373 1.881 68.13 2.003 67.983 2.102 c
+67.836 2.208 67.726 2.326 67.66 2.454 c
+67.59 2.579 67.557 2.738 67.557 2.925 c
+67.557 3.248 67.674 3.516 67.909 3.733 c
+68.144 3.946 68.446 4.056 68.821 4.056 c
+69.204 4.056 69.512 3.943 69.747 3.719 c
+69.983 3.491 70.1 3.204 70.1 2.851 c
+69.453 2.851 l
+69.453 3.027 69.395 3.179 69.277 3.307 c
+69.159 3.432 69.005 3.498 68.821 3.498 c
+68.622 3.498 68.472 3.443 68.365 3.337 c
+68.255 3.237 68.204 3.105 68.204 2.94 c
+68.204 2.811 68.24 2.705 68.321 2.616 c
+68.398 2.535 68.589 2.433 68.894 2.308 c
+69.372 2.12 69.703 1.932 69.879 1.749 c
+70.056 1.573 70.144 1.344 70.144 1.072 c
+70.144 0.72 70.019 0.44 69.777 0.235 c
+69.541 0.029 69.225 -0.073 68.836 -0.073 c
+68.413 -0.073 68.075 0.044 67.822 0.279 c
+67.564 0.521 67.439 0.827 67.439 1.19 c
+68.086 1.19 l
+68.094 0.962 68.163 0.786 68.292 0.661 c
+68.417 0.544 68.601 0.484 68.836 0.484 c
+69.048 0.484 69.21 0.532 69.32 0.632 c
+69.439 0.727 69.497 0.856 69.497 1.014 c
+71.687 0 -0.646 3.983 re
+71.731 5.026 m
+71.731 4.916 71.702 4.825 71.643 4.748 c
+71.585 4.677 71.489 4.644 71.364 4.644 c
+71.246 4.644 71.151 4.677 71.085 4.748 c
+71.026 4.825 70.997 4.916 70.997 5.026 c
+70.997 5.144 71.026 5.236 71.085 5.306 c
+71.151 5.383 71.246 5.423 71.364 5.423 c
+71.489 5.423 71.585 5.383 71.643 5.306 c
+71.702 5.225 71.731 5.134 71.731 5.026 c
+73.554 4.939 m
+73.554 3.983 l
+74.157 3.983 l
+74.157 3.454 l
+73.554 3.454 l
+73.554 0.985 l
+73.554 0.827 73.576 0.709 73.628 0.632 c
+73.686 0.551 73.775 0.515 73.892 0.515 c
+73.981 0.515 74.068 0.529 74.157 0.558 c
+74.157 0 l
+74.01 -0.048 73.856 -0.073 73.701 -0.073 c
+73.444 -0.073 73.249 0.018 73.113 0.205 c
+72.973 0.389 72.907 0.65 72.907 0.985 c
+72.907 3.454 l
+72.304 3.454 l
+72.304 3.983 l
+72.907 3.983 l
+72.907 4.939 l
+h
+74.715 2.175 m
+74.715 2.753 74.851 3.208 75.126 3.542 c
+75.41 3.884 75.781 4.056 76.244 4.056 c
+76.703 4.056 77.071 3.888 77.347 3.557 c
+77.63 3.233 77.777 2.786 77.787 2.219 c
+77.787 1.793 l
+77.787 1.224 77.644 0.768 77.361 0.426 c
+77.085 0.091 76.718 -0.073 76.259 -0.073 c
+75.795 -0.073 75.425 0.087 75.142 0.411 c
+74.866 0.742 74.723 1.183 74.715 1.734 c
+h
+75.362 1.793 m
+75.362 1.389 75.439 1.072 75.597 0.837 c
+75.762 0.602 75.984 0.484 76.259 0.484 c
+76.825 0.484 77.119 0.897 77.141 1.72 c
+77.141 2.175 l
+77.141 2.576 77.056 2.896 76.89 3.131 c
+76.732 3.374 76.516 3.498 76.244 3.498 c
+75.98 3.498 75.762 3.374 75.597 3.131 c
+75.439 2.896 75.362 2.576 75.362 2.175 c
+h
+80.271 3.366 m
+80.183 3.384 80.084 3.395 79.978 3.395 c
+79.643 3.395 79.408 3.212 79.272 2.851 c
+79.272 0 l
+78.625 0 l
+78.625 3.983 l
+79.257 3.983 l
+79.272 3.572 l
+79.448 3.895 79.691 4.056 80.007 4.056 c
+80.113 4.056 80.202 4.035 80.271 3.998 c
+h
+82.079 1.087 m
+82.8 3.983 l
+83.491 3.983 l
+82.197 -0.559 l
+82.098 -0.9 81.954 -1.162 81.771 -1.338 c
+81.594 -1.515 81.393 -1.602 81.168 -1.602 c
+81.079 -1.602 80.966 -1.58 80.83 -1.544 c
+80.83 -1 l
+80.977 -1.014 l
+81.16 -1.014 81.308 -0.971 81.418 -0.882 c
+81.524 -0.794 81.613 -0.636 81.683 -0.412 c
+81.8 0.029 l
+80.639 3.983 l
+81.345 3.983 l
+h
+86.548 0 -0.646 3.983 re
+86.592 5.026 m
+86.592 4.916 86.563 4.825 86.504 4.748 c
+86.445 4.677 86.35 4.644 86.224 4.644 c
+86.107 4.644 86.012 4.677 85.945 4.748 c
+85.887 4.825 85.858 4.916 85.858 5.026 c
+85.858 5.144 85.887 5.236 85.945 5.306 c
+86.012 5.383 86.107 5.423 86.224 5.423 c
+86.35 5.423 86.445 5.383 86.504 5.306 c
+86.563 5.225 86.592 5.134 86.592 5.026 c
+88.179 3.983 m
+88.194 3.542 l
+88.448 3.884 88.771 4.056 89.164 4.056 c
+89.87 4.056 90.226 3.586 90.238 2.645 c
+90.238 0 l
+89.59 0 l
+89.59 2.616 l
+89.59 2.929 89.536 3.149 89.43 3.278 c
+89.318 3.403 89.164 3.469 88.959 3.469 c
+88.801 3.469 88.653 3.414 88.518 3.307 c
+88.389 3.197 88.287 3.061 88.209 2.896 c
+88.209 0 l
+87.562 0 l
+87.562 3.983 l
+h
+93.148 1.014 m
+93.148 1.161 93.093 1.282 92.986 1.381 c
+92.876 1.477 92.67 1.595 92.368 1.734 c
+92.023 1.881 91.781 2.003 91.634 2.102 c
+91.487 2.208 91.377 2.326 91.311 2.454 c
+91.24 2.579 91.208 2.738 91.208 2.925 c
+91.208 3.248 91.325 3.516 91.56 3.733 c
+91.795 3.946 92.096 4.056 92.472 4.056 c
+92.854 4.056 93.162 3.943 93.398 3.719 c
+93.633 3.491 93.75 3.204 93.75 2.851 c
+93.104 2.851 l
+93.104 3.027 93.045 3.179 92.927 3.307 c
+92.81 3.432 92.655 3.498 92.472 3.498 c
+92.273 3.498 92.123 3.443 92.017 3.337 c
+91.906 3.237 91.855 3.105 91.855 2.94 c
+91.855 2.811 91.891 2.705 91.972 2.616 c
+92.049 2.535 92.24 2.433 92.545 2.308 c
+93.023 2.12 93.353 1.932 93.53 1.749 c
+93.706 1.573 93.795 1.344 93.795 1.072 c
+93.795 0.72 93.669 0.44 93.428 0.235 c
+93.192 0.029 92.876 -0.073 92.487 -0.073 c
+92.064 -0.073 91.726 0.044 91.472 0.279 c
+91.215 0.521 91.09 0.827 91.09 1.19 c
+91.737 1.19 l
+91.744 0.962 91.814 0.786 91.942 0.661 c
+92.067 0.544 92.252 0.484 92.487 0.484 c
+92.7 0.484 92.861 0.532 92.971 0.632 c
+93.089 0.727 93.148 0.856 93.148 1.014 c
+95.338 0 -0.647 3.983 re
+95.382 5.026 m
+95.382 4.916 95.352 4.825 95.294 4.748 c
+95.235 4.677 95.14 4.644 95.015 4.644 c
+94.897 4.644 94.801 4.677 94.735 4.748 c
+94.677 4.825 94.647 4.916 94.647 5.026 c
+94.647 5.144 94.677 5.236 94.735 5.306 c
+94.801 5.383 94.897 5.423 95.015 5.423 c
+95.14 5.423 95.235 5.383 95.294 5.306 c
+95.352 5.225 95.382 5.134 95.382 5.026 c
+96.22 2.175 m
+96.22 2.782 96.33 3.248 96.558 3.572 c
+96.794 3.895 97.12 4.056 97.542 4.056 c
+97.925 4.056 98.223 3.898 98.44 3.586 c
+98.44 5.644 l
+99.086 5.644 l
+99.086 0 l
+98.498 0 l
+98.454 0.426 l
+98.248 0.091 97.943 -0.073 97.542 -0.073 c
+97.131 -0.073 96.808 0.081 96.573 0.397 c
+96.337 0.72 96.22 1.176 96.22 1.764 c
+h
+96.867 1.793 m
+96.867 1.352 96.929 1.022 97.058 0.808 c
+97.193 0.602 97.414 0.5 97.719 0.5 c
+98.043 0.5 98.282 0.661 98.44 0.985 c
+98.44 2.998 l
+98.271 3.31 98.032 3.469 97.719 3.469 c
+97.414 3.469 97.193 3.366 97.058 3.16 c
+96.929 2.954 96.867 2.631 96.867 2.19 c
+h
+101.511 -0.073 m
+101.012 -0.073 100.63 0.073 100.365 0.367 c
+100.1 0.661 99.969 1.095 99.969 1.675 c
+99.969 2.146 l
+99.969 2.741 100.093 3.208 100.351 3.542 c
+100.615 3.884 100.975 4.056 101.438 4.056 c
+101.897 4.056 102.24 3.902 102.467 3.601 c
+102.702 3.307 102.824 2.844 102.835 2.219 c
+102.835 1.793 l
+100.615 1.793 l
+100.615 1.705 l
+100.615 1.271 100.692 0.959 100.85 0.764 c
+101.016 0.577 101.247 0.484 101.541 0.484 c
+101.736 0.484 101.908 0.518 102.055 0.588 c
+102.203 0.665 102.338 0.783 102.467 0.941 c
+102.805 0.529 l
+102.519 0.125 102.089 -0.073 101.511 -0.073 c
+101.438 3.498 m
+101.162 3.498 100.96 3.403 100.835 3.219 c
+100.707 3.031 100.634 2.741 100.615 2.352 c
+102.188 2.352 l
+102.188 2.439 l
+102.166 2.822 102.099 3.09 101.982 3.248 c
+101.864 3.414 101.681 3.498 101.438 3.498 c
+106.039 0 -0.647 3.983 re
+106.083 5.026 m
+106.083 4.916 106.053 4.825 105.995 4.748 c
+105.936 4.677 105.841 4.644 105.716 4.644 c
+105.598 4.644 105.502 4.677 105.436 4.748 c
+105.378 4.825 105.348 4.916 105.348 5.026 c
+105.348 5.144 105.378 5.236 105.436 5.306 c
+105.502 5.383 105.598 5.423 105.716 5.423 c
+105.841 5.423 105.936 5.383 105.995 5.306 c
+106.053 5.225 106.083 5.134 106.083 5.026 c
+107.906 4.939 m
+107.906 3.983 l
+108.509 3.983 l
+108.509 3.454 l
+107.906 3.454 l
+107.906 0.985 l
+107.906 0.827 107.928 0.709 107.979 0.632 c
+108.038 0.551 108.126 0.515 108.244 0.515 c
+108.332 0.515 108.42 0.529 108.509 0.558 c
+108.509 0 l
+108.361 -0.048 108.207 -0.073 108.052 -0.073 c
+107.796 -0.073 107.601 0.018 107.464 0.205 c
+107.325 0.389 107.259 0.65 107.259 0.985 c
+107.259 3.454 l
+106.656 3.454 l
+106.656 3.983 l
+107.259 3.983 l
+107.259 4.939 l
+h
+109.317 0.353 m
+109.317 0.47 109.35 0.565 109.42 0.646 c
+109.486 0.723 109.589 0.764 109.729 0.764 c
+109.876 0.764 109.982 0.723 110.051 0.646 c
+110.129 0.565 110.169 0.47 110.169 0.353 c
+110.169 0.243 110.129 0.151 110.051 0.073 c
+109.982 -0.004 109.876 -0.044 109.729 -0.044 c
+109.589 -0.044 109.486 -0.004 109.42 0.073 c
+109.35 0.151 109.317 0.243 109.317 0.353 c
+f
+Q
+39.089 246.498 -0.675 5.35 re
+40.471 246.498 m
+40.471 249.953 l
+39.942 249.953 l
+39.942 250.481 l
+40.471 250.481 l
+40.471 250.937 l
+40.471 251.338 40.567 251.65 40.765 251.878 c
+40.97 252.102 41.249 252.216 41.602 252.216 c
+41.739 252.216 41.87 252.194 41.999 252.157 c
+41.97 251.613 l
+41.87 251.632 41.772 251.642 41.676 251.642 c
+41.301 251.642 41.118 251.378 41.118 250.849 c
+41.118 250.481 l
+41.793 250.481 l
+41.793 249.953 l
+41.118 249.953 l
+41.118 246.498 l
+h
+f
+q 1 0 0 1 45.6305 251.9076 cm
+0 0 m
+-0.383 0 l
+-0.383 -5.835 l
+0 -5.835 l
+0 -6.659 l
+-1.426 -6.659 l
+-1.426 0.823 l
+0 0.823 l
+h
+3.63 -3.543 m
+3.63 -4.171 3.52 -4.653 3.307 -4.983 c
+3.09 -5.318 2.77 -5.483 2.352 -5.483 c
+2.028 -5.483 1.767 -5.351 1.572 -5.087 c
+1.572 -6.938 l
+0.529 -6.938 l
+0.529 -1.426 l
+1.484 -1.426 l
+1.528 -1.794 l
+1.723 -1.5 1.992 -1.353 2.337 -1.353 c
+2.755 -1.353 3.075 -1.511 3.293 -1.823 c
+3.505 -2.128 3.619 -2.598 3.63 -3.234 c
+h
+2.587 -3.278 m
+2.587 -2.896 2.543 -2.627 2.454 -2.469 c
+2.373 -2.315 2.233 -2.234 2.028 -2.234 c
+1.822 -2.234 1.668 -2.323 1.572 -2.5 c
+1.572 -4.366 l
+1.66 -4.535 1.815 -4.616 2.042 -4.616 c
+2.248 -4.616 2.389 -4.535 2.469 -4.366 c
+2.547 -4.189 2.587 -3.917 2.587 -3.543 c
+h
+6.217 -2.44 m
+5.88 -2.411 l
+5.593 -2.411 5.402 -2.536 5.306 -2.778 c
+5.306 -5.409 l
+4.262 -5.409 l
+4.262 -1.426 l
+5.232 -1.426 l
+5.262 -1.867 l
+5.427 -1.525 5.659 -1.353 5.953 -1.353 c
+6.071 -1.353 6.162 -1.374 6.231 -1.411 c
+h
+6.511 -3.293 m
+6.511 -2.687 6.651 -2.213 6.937 -1.867 c
+7.22 -1.525 7.613 -1.353 8.113 -1.353 c
+8.621 -1.353 9.017 -1.525 9.304 -1.867 c
+9.587 -2.213 9.73 -2.687 9.73 -3.293 c
+9.73 -3.558 l
+9.73 -4.156 9.587 -4.627 9.304 -4.969 c
+9.017 -5.314 8.621 -5.483 8.113 -5.483 c
+7.603 -5.483 7.206 -5.314 6.923 -4.969 c
+6.647 -4.627 6.511 -4.152 6.511 -3.543 c
+h
+7.555 -3.558 m
+7.555 -4.263 7.739 -4.616 8.113 -4.616 c
+8.467 -4.616 8.658 -4.322 8.687 -3.734 c
+8.687 -3.293 l
+8.687 -2.932 8.635 -2.66 8.54 -2.484 c
+8.44 -2.308 8.297 -2.22 8.113 -2.22 c
+7.937 -2.22 7.798 -2.308 7.702 -2.484 c
+7.603 -2.66 7.555 -2.932 7.555 -3.293 c
+h
+11.465 -1.426 m
+11.465 -5.63 l
+11.465 -6.078 11.362 -6.423 11.156 -6.659 c
+10.95 -6.894 10.657 -7.011 10.274 -7.011 c
+10.105 -7.011 9.951 -6.99 9.803 -6.953 c
+9.789 -6.101 l
+9.907 -6.13 9.998 -6.145 10.069 -6.145 c
+10.304 -6.145 10.422 -5.983 10.422 -5.66 c
+10.422 -1.426 l
+h
+10.362 -0.397 m
+10.362 -0.243 10.41 -0.114 10.509 -0.015 c
+10.616 0.091 10.752 0.147 10.921 0.147 c
+11.097 0.147 11.233 0.091 11.332 -0.015 c
+11.439 -0.114 11.494 -0.243 11.494 -0.397 c
+11.494 -0.566 11.439 -0.702 11.332 -0.809 c
+11.233 -0.908 11.097 -0.956 10.921 -0.956 c
+10.744 -0.956 10.605 -0.908 10.509 -0.809 c
+10.41 -0.702 10.362 -0.566 10.362 -0.397 c
+13.832 -5.483 m
+13.302 -5.483 12.883 -5.328 12.581 -5.012 c
+12.288 -4.69 12.141 -4.23 12.141 -3.631 c
+12.141 -3.323 l
+12.141 -2.697 12.277 -2.213 12.552 -1.867 c
+12.824 -1.525 13.217 -1.353 13.728 -1.353 c
+14.228 -1.353 14.599 -1.515 14.846 -1.837 c
+15.099 -2.161 15.232 -2.639 15.243 -3.263 c
+15.243 -3.763 l
+13.17 -3.763 l
+13.188 -4.057 13.25 -4.274 13.361 -4.41 c
+13.479 -4.549 13.659 -4.616 13.905 -4.616 c
+14.247 -4.616 14.537 -4.499 14.772 -4.263 c
+15.184 -4.895 l
+15.055 -5.072 14.867 -5.215 14.625 -5.322 c
+14.379 -5.428 14.114 -5.483 13.832 -5.483 c
+13.184 -3.043 m
+14.214 -3.043 l
+14.214 -2.94 l
+14.214 -2.705 14.173 -2.529 14.096 -2.411 c
+14.026 -2.286 13.898 -2.22 13.714 -2.22 c
+13.537 -2.22 13.406 -2.29 13.317 -2.425 c
+13.236 -2.554 13.192 -2.76 13.184 -3.043 c
+17.271 -4.616 m
+17.565 -4.616 17.716 -4.421 17.726 -4.028 c
+18.696 -4.028 l
+18.696 -4.461 18.565 -4.814 18.3 -5.087 c
+18.035 -5.351 17.697 -5.483 17.285 -5.483 c
+16.775 -5.483 16.382 -5.328 16.109 -5.012 c
+15.845 -4.69 15.706 -4.219 15.698 -3.601 c
+15.698 -3.278 l
+15.698 -2.654 15.831 -2.176 16.095 -1.852 c
+16.367 -1.521 16.764 -1.353 17.285 -1.353 c
+17.716 -1.353 18.057 -1.492 18.314 -1.764 c
+18.568 -2.04 18.696 -2.421 18.696 -2.911 c
+17.726 -2.911 l
+17.726 -2.697 17.686 -2.529 17.609 -2.411 c
+17.539 -2.286 17.422 -2.22 17.256 -2.22 c
+17.08 -2.22 16.951 -2.286 16.874 -2.411 c
+16.793 -2.539 16.749 -2.789 16.741 -3.161 c
+16.741 -3.572 l
+16.741 -3.896 16.756 -4.123 16.786 -4.248 c
+16.822 -4.377 16.878 -4.469 16.947 -4.528 c
+17.025 -4.586 17.131 -4.616 17.271 -4.616 c
+20.504 -0.456 m
+20.504 -1.426 l
+21.034 -1.426 l
+21.034 -2.22 l
+20.504 -2.22 l
+20.504 -4.189 l
+20.504 -4.347 20.523 -4.454 20.564 -4.513 c
+20.612 -4.572 20.696 -4.601 20.813 -4.601 c
+20.92 -4.601 21.005 -4.594 21.063 -4.572 c
+21.063 -5.38 l
+20.887 -5.446 20.696 -5.483 20.49 -5.483 c
+19.814 -5.483 19.469 -5.097 19.461 -4.322 c
+19.461 -2.22 l
+19.006 -2.22 l
+19.006 -1.426 l
+19.461 -1.426 l
+19.461 -0.456 l
+h
+24.297 -1.426 m
+24.327 -1.823 l
+24.562 -1.511 24.863 -1.353 25.238 -1.353 c
+25.921 -1.353 26.274 -1.834 26.296 -2.793 c
+26.296 -5.409 l
+25.252 -5.409 l
+25.252 -2.866 l
+25.252 -2.643 25.216 -2.481 25.15 -2.382 c
+25.08 -2.286 24.963 -2.234 24.797 -2.234 c
+24.61 -2.234 24.462 -2.33 24.356 -2.514 c
+24.356 -5.409 l
+23.312 -5.409 l
+23.312 -1.426 l
+h
+28.928 -5.409 m
+28.898 -5.351 28.868 -5.247 28.839 -5.101 c
+28.652 -5.358 28.402 -5.483 28.09 -5.483 c
+27.755 -5.483 27.476 -5.376 27.251 -5.16 c
+27.035 -4.935 26.928 -4.645 26.928 -4.293 c
+26.928 -3.881 27.06 -3.564 27.325 -3.337 c
+27.59 -3.102 27.972 -2.984 28.471 -2.984 c
+28.795 -2.984 l
+28.795 -2.66 l
+28.795 -2.484 28.758 -2.363 28.693 -2.294 c
+28.633 -2.216 28.545 -2.176 28.427 -2.176 c
+28.17 -2.176 28.045 -2.33 28.045 -2.631 c
+27.002 -2.631 l
+27.002 -2.261 27.138 -1.955 27.413 -1.72 c
+27.685 -1.478 28.034 -1.353 28.457 -1.353 c
+28.898 -1.353 29.236 -1.47 29.471 -1.706 c
+29.713 -1.933 29.838 -2.257 29.838 -2.675 c
+29.838 -4.542 l
+29.838 -4.888 29.886 -5.156 29.985 -5.351 c
+29.985 -5.409 l
+h
+28.325 -4.659 m
+28.431 -4.659 28.523 -4.642 28.604 -4.601 c
+28.693 -4.553 28.755 -4.495 28.795 -4.424 c
+28.795 -3.601 l
+28.545 -3.601 l
+28.369 -3.601 28.225 -3.66 28.119 -3.778 c
+28.02 -3.888 27.972 -4.035 27.972 -4.219 c
+27.972 -4.513 28.09 -4.659 28.325 -4.659 c
+31.558 -1.426 m
+31.588 -1.794 l
+31.823 -1.5 32.132 -1.353 32.514 -1.353 c
+32.915 -1.353 33.194 -1.536 33.352 -1.897 c
+33.587 -1.536 33.914 -1.353 34.337 -1.353 c
+35.031 -1.353 35.384 -1.837 35.394 -2.808 c
+35.394 -5.409 l
+34.366 -5.409 l
+34.366 -2.866 l
+34.366 -2.643 34.329 -2.481 34.263 -2.382 c
+34.204 -2.286 34.094 -2.234 33.94 -2.234 c
+33.742 -2.234 33.601 -2.352 33.513 -2.587 c
+33.513 -5.409 l
+32.47 -5.409 l
+32.47 -2.881 l
+32.47 -2.646 32.44 -2.481 32.381 -2.382 c
+32.323 -2.286 32.213 -2.234 32.059 -2.234 c
+31.882 -2.234 31.739 -2.33 31.631 -2.514 c
+31.631 -5.409 l
+30.588 -5.409 l
+30.588 -1.426 l
+h
+37.776 -5.483 m
+37.247 -5.483 36.828 -5.328 36.527 -5.012 c
+36.233 -4.69 36.086 -4.23 36.086 -3.631 c
+36.086 -3.323 l
+36.086 -2.697 36.221 -2.213 36.497 -1.867 c
+36.769 -1.525 37.162 -1.353 37.673 -1.353 c
+38.173 -1.353 38.544 -1.515 38.79 -1.837 c
+39.044 -2.161 39.176 -2.639 39.187 -3.263 c
+39.187 -3.763 l
+37.115 -3.763 l
+37.133 -4.057 37.196 -4.274 37.306 -4.41 c
+37.424 -4.549 37.603 -4.616 37.85 -4.616 c
+38.191 -4.616 38.482 -4.499 38.717 -4.263 c
+39.128 -4.895 l
+39 -5.072 38.812 -5.215 38.57 -5.322 c
+38.324 -5.428 38.059 -5.483 37.776 -5.483 c
+37.129 -3.043 m
+38.158 -3.043 l
+38.158 -2.94 l
+38.158 -2.705 38.118 -2.529 38.041 -2.411 c
+37.971 -2.286 37.842 -2.22 37.659 -2.22 c
+37.482 -2.22 37.35 -2.29 37.262 -2.425 c
+37.181 -2.554 37.137 -2.76 37.129 -3.043 c
+39.525 0.823 m
+40.951 0.823 l
+40.951 -6.659 l
+39.525 -6.659 l
+39.525 -5.835 l
+39.907 -5.835 l
+39.907 0 l
+39.525 0 l
+h
+f
+Q
+89.919 246.498 -0.647 3.983 re
+89.962 251.525 m
+89.962 251.415 89.933 251.323 89.874 251.246 c
+89.815 251.176 89.72 251.143 89.595 251.143 c
+89.477 251.143 89.381 251.176 89.316 251.246 c
+89.256 251.323 89.227 251.415 89.227 251.525 c
+89.227 251.642 89.256 251.735 89.316 251.804 c
+89.381 251.881 89.477 251.922 89.595 251.922 c
+89.72 251.922 89.815 251.881 89.874 251.804 c
+89.933 251.723 89.962 251.632 89.962 251.525 c
+92.873 247.512 m
+92.873 247.659 92.818 247.781 92.711 247.879 c
+92.601 247.975 92.395 248.093 92.094 248.232 c
+91.748 248.38 91.506 248.501 91.359 248.6 c
+91.212 248.706 91.101 248.824 91.035 248.953 c
+90.966 249.078 90.933 249.236 90.933 249.423 c
+90.933 249.747 91.05 250.015 91.286 250.231 c
+91.521 250.445 91.822 250.555 92.197 250.555 c
+92.579 250.555 92.888 250.441 93.123 250.217 c
+93.358 249.989 93.476 249.703 93.476 249.35 c
+92.828 249.35 l
+92.828 249.526 92.77 249.677 92.652 249.805 c
+92.535 249.93 92.381 249.996 92.197 249.996 c
+91.999 249.996 91.847 249.941 91.741 249.835 c
+91.631 249.735 91.579 249.604 91.579 249.438 c
+91.579 249.309 91.616 249.203 91.697 249.115 c
+91.774 249.034 91.965 248.931 92.27 248.806 c
+92.747 248.619 93.079 248.431 93.255 248.247 c
+93.431 248.071 93.52 247.843 93.52 247.571 c
+93.52 247.218 93.395 246.939 93.152 246.734 c
+92.917 246.528 92.601 246.425 92.211 246.425 c
+91.789 246.425 91.451 246.543 91.197 246.778 c
+90.94 247.02 90.815 247.325 90.815 247.688 c
+91.461 247.688 l
+91.469 247.461 91.539 247.285 91.667 247.16 c
+91.793 247.042 91.976 246.983 92.211 246.983 c
+92.425 246.983 92.587 247.031 92.697 247.131 c
+92.814 247.226 92.873 247.354 92.873 247.512 c
+96.695 250.481 m
+96.709 250.04 l
+96.963 250.383 97.287 250.555 97.68 250.555 c
+98.385 250.555 98.742 250.084 98.752 249.144 c
+98.752 246.498 l
+98.106 246.498 l
+98.106 249.115 l
+98.106 249.427 98.05 249.647 97.944 249.776 c
+97.834 249.901 97.68 249.967 97.474 249.967 c
+97.316 249.967 97.169 249.912 97.033 249.805 c
+96.904 249.695 96.801 249.56 96.724 249.394 c
+96.724 246.498 l
+96.077 246.498 l
+96.077 250.481 l
+h
+99.59 248.673 m
+99.59 249.251 99.726 249.706 100.001 250.04 c
+100.285 250.383 100.656 250.555 101.119 250.555 c
+101.578 250.555 101.946 250.386 102.222 250.055 c
+102.505 249.732 102.652 249.284 102.662 248.718 c
+102.662 248.291 l
+102.662 247.722 102.519 247.266 102.236 246.925 c
+101.96 246.59 101.593 246.425 101.134 246.425 c
+100.67 246.425 100.3 246.586 100.017 246.909 c
+99.741 247.241 99.598 247.682 99.59 248.232 c
+h
+100.237 248.291 m
+100.237 247.887 100.314 247.571 100.472 247.336 c
+100.637 247.1 100.858 246.983 101.134 246.983 c
+101.7 246.983 101.994 247.395 102.016 248.218 c
+102.016 248.673 l
+102.016 249.074 101.931 249.394 101.765 249.629 c
+101.607 249.872 101.391 249.996 101.119 249.996 c
+100.855 249.996 100.637 249.872 100.472 249.629 c
+100.314 249.394 100.237 249.074 100.237 248.673 c
+h
+104.352 251.437 m
+104.352 250.481 l
+104.955 250.481 l
+104.955 249.953 l
+104.352 249.953 l
+104.352 247.483 l
+104.352 247.325 104.375 247.208 104.427 247.131 c
+104.485 247.05 104.573 247.013 104.691 247.013 c
+104.779 247.013 104.867 247.027 104.955 247.056 c
+104.955 246.498 l
+104.809 246.45 104.654 246.425 104.5 246.425 c
+104.242 246.425 104.048 246.516 103.912 246.703 c
+103.772 246.888 103.706 247.148 103.706 247.483 c
+103.706 249.953 l
+103.103 249.953 l
+103.103 250.481 l
+103.706 250.481 l
+103.706 251.437 l
+h
+110.32 248.291 m
+110.32 247.663 110.203 247.193 109.968 246.88 c
+109.74 246.576 109.424 246.425 109.012 246.425 c
+108.608 246.425 108.3 246.576 108.086 246.88 c
+108.086 244.97 l
+107.44 244.97 l
+107.44 250.481 l
+108.028 250.481 l
+108.071 250.04 l
+108.285 250.383 108.593 250.555 108.998 250.555 c
+109.439 250.555 109.765 250.401 109.983 250.1 c
+110.195 249.795 110.309 249.338 110.32 248.733 c
+h
+109.674 248.673 m
+109.674 249.115 109.604 249.438 109.468 249.643 c
+109.328 249.857 109.108 249.967 108.807 249.967 c
+108.491 249.967 108.252 249.813 108.086 249.512 c
+108.086 247.439 l
+108.252 247.134 108.491 246.983 108.807 246.983 c
+109.1 246.983 109.314 247.086 109.453 247.291 c
+109.59 247.505 109.663 247.836 109.674 248.276 c
+h
+112.805 249.864 m
+112.717 249.882 112.618 249.893 112.51 249.893 c
+112.177 249.893 111.941 249.71 111.805 249.35 c
+111.805 246.498 l
+111.159 246.498 l
+111.159 250.481 l
+111.791 250.481 l
+111.805 250.07 l
+111.982 250.393 112.225 250.555 112.54 250.555 c
+112.647 250.555 112.735 250.533 112.805 250.497 c
+h
+113.245 248.673 m
+113.245 249.251 113.382 249.706 113.657 250.04 c
+113.94 250.383 114.311 250.555 114.775 250.555 c
+115.234 250.555 115.601 250.386 115.876 250.055 c
+116.16 249.732 116.306 249.284 116.318 248.718 c
+116.318 248.291 l
+116.318 247.722 116.175 247.266 115.892 246.925 c
+115.616 246.59 115.248 246.425 114.789 246.425 c
+114.326 246.425 113.955 246.586 113.672 246.909 c
+113.397 247.241 113.253 247.682 113.245 248.232 c
+h
+113.892 248.291 m
+113.892 247.887 113.97 247.571 114.128 247.336 c
+114.293 247.1 114.513 246.983 114.789 246.983 c
+115.355 246.983 115.649 247.395 115.671 248.218 c
+115.671 248.673 l
+115.671 249.074 115.587 249.394 115.421 249.629 c
+115.263 249.872 115.047 249.996 114.775 249.996 c
+114.51 249.996 114.293 249.872 114.128 249.629 c
+113.97 249.394 113.892 249.074 113.892 248.673 c
+h
+118.228 247.483 m
+118.978 250.481 l
+119.639 250.481 l
+118.464 246.498 l
+117.979 246.498 l
+116.788 250.481 l
+117.449 250.481 l
+h
+121.021 246.498 -0.646 3.983 re
+121.066 251.525 m
+121.066 251.415 121.036 251.323 120.977 251.246 c
+120.919 251.176 120.823 251.143 120.698 251.143 c
+120.58 251.143 120.485 251.176 120.419 251.246 c
+120.36 251.323 120.331 251.415 120.331 251.525 c
+120.331 251.642 120.36 251.735 120.419 251.804 c
+120.485 251.881 120.58 251.922 120.698 251.922 c
+120.823 251.922 120.919 251.881 120.977 251.804 c
+121.036 251.723 121.066 251.632 121.066 251.525 c
+121.904 248.673 m
+121.904 249.28 122.014 249.747 122.242 250.07 c
+122.477 250.393 122.804 250.555 123.226 250.555 c
+123.608 250.555 123.907 250.397 124.123 250.084 c
+124.123 252.143 l
+124.769 252.143 l
+124.769 246.498 l
+124.182 246.498 l
+124.138 246.925 l
+123.932 246.59 123.627 246.425 123.226 246.425 c
+122.814 246.425 122.492 246.579 122.257 246.895 c
+122.021 247.218 121.904 247.674 121.904 248.262 c
+h
+122.55 248.291 m
+122.55 247.85 122.613 247.52 122.741 247.306 c
+122.877 247.1 123.098 246.998 123.402 246.998 c
+123.726 246.998 123.965 247.16 124.123 247.483 c
+124.123 249.497 l
+123.954 249.809 123.715 249.967 123.402 249.967 c
+123.098 249.967 122.877 249.864 122.741 249.658 c
+122.613 249.452 122.55 249.13 122.55 248.688 c
+h
+127.195 246.425 m
+126.695 246.425 126.313 246.572 126.049 246.865 c
+125.784 247.16 125.652 247.593 125.652 248.174 c
+125.652 248.644 l
+125.652 249.24 125.777 249.706 126.034 250.04 c
+126.299 250.383 126.658 250.555 127.121 250.555 c
+127.581 250.555 127.923 250.401 128.15 250.1 c
+128.385 249.805 128.507 249.342 128.518 248.718 c
+128.518 248.291 l
+126.299 248.291 l
+126.299 248.203 l
+126.299 247.769 126.376 247.457 126.534 247.262 c
+126.699 247.075 126.93 246.983 127.225 246.983 c
+127.419 246.983 127.591 247.017 127.739 247.086 c
+127.886 247.163 128.022 247.281 128.15 247.439 c
+128.489 247.027 l
+128.202 246.623 127.772 246.425 127.195 246.425 c
+127.121 249.996 m
+126.846 249.996 126.644 249.901 126.519 249.718 c
+126.39 249.529 126.317 249.24 126.299 248.85 c
+127.871 248.85 l
+127.871 248.938 l
+127.849 249.321 127.783 249.589 127.666 249.747 c
+127.548 249.912 127.364 249.996 127.121 249.996 c
+129.164 248.673 m
+129.164 249.28 129.275 249.747 129.503 250.07 c
+129.738 250.393 130.065 250.555 130.488 250.555 c
+130.87 250.555 131.167 250.397 131.385 250.084 c
+131.385 252.143 l
+132.031 252.143 l
+132.031 246.498 l
+131.443 246.498 l
+131.399 246.925 l
+131.194 246.59 130.888 246.425 130.488 246.425 c
+130.076 246.425 129.752 246.579 129.517 246.895 c
+129.282 247.218 129.164 247.674 129.164 248.262 c
+h
+129.812 248.291 m
+129.812 247.85 129.874 247.52 130.003 247.306 c
+130.139 247.1 130.359 246.998 130.664 246.998 c
+130.988 246.998 131.227 247.16 131.385 247.483 c
+131.385 249.497 l
+131.215 249.809 130.976 249.967 130.664 249.967 c
+130.359 249.967 130.139 249.864 130.003 249.658 c
+129.874 249.452 129.812 249.13 129.812 248.688 c
+h
+133.045 245.425 m
+132.649 245.689 l
+132.884 246.013 133.005 246.348 133.016 246.689 c
+133.016 247.306 l
+133.677 247.306 l
+133.677 246.778 l
+133.677 246.52 133.611 246.274 133.486 246.028 c
+133.369 245.785 133.222 245.583 133.045 245.425 c
+137.087 251.437 m
+137.087 250.481 l
+137.69 250.481 l
+137.69 249.953 l
+137.087 249.953 l
+137.087 247.483 l
+137.087 247.325 137.11 247.208 137.161 247.131 c
+137.22 247.05 137.308 247.013 137.426 247.013 c
+137.513 247.013 137.602 247.027 137.69 247.056 c
+137.69 246.498 l
+137.544 246.45 137.389 246.425 137.234 246.425 c
+136.977 246.425 136.783 246.516 136.647 246.703 c
+136.507 246.888 136.441 247.148 136.441 247.483 c
+136.441 249.953 l
+135.838 249.953 l
+135.838 250.481 l
+136.441 250.481 l
+136.441 251.437 l
+h
+139.101 250.07 m
+139.354 250.393 139.674 250.555 140.056 250.555 c
+140.762 250.555 141.118 250.084 141.13 249.144 c
+141.13 246.498 l
+140.483 246.498 l
+140.483 249.115 l
+140.483 249.427 140.428 249.647 140.322 249.776 c
+140.212 249.901 140.056 249.967 139.851 249.967 c
+139.693 249.967 139.546 249.912 139.41 249.805 c
+139.281 249.695 139.179 249.56 139.101 249.394 c
+139.101 246.498 l
+138.454 246.498 l
+138.454 252.143 l
+139.101 252.143 l
+h
+143.511 246.425 m
+143.011 246.425 142.629 246.572 142.365 246.865 c
+142.1 247.16 141.968 247.593 141.968 248.174 c
+141.968 248.644 l
+141.968 249.24 142.093 249.706 142.35 250.04 c
+142.614 250.383 142.974 250.555 143.437 250.555 c
+143.897 250.555 144.239 250.401 144.466 250.1 c
+144.702 249.805 144.823 249.342 144.834 248.718 c
+144.834 248.291 l
+142.614 248.291 l
+142.614 248.203 l
+142.614 247.769 142.691 247.457 142.849 247.262 c
+143.015 247.075 143.246 246.983 143.541 246.983 c
+143.736 246.983 143.908 247.017 144.054 247.086 c
+144.202 247.163 144.338 247.281 144.466 247.439 c
+144.804 247.027 l
+144.518 246.623 144.088 246.425 143.511 246.425 c
+143.437 249.996 m
+143.162 249.996 142.959 249.901 142.835 249.718 c
+142.706 249.529 142.633 249.24 142.614 248.85 c
+144.187 248.85 l
+144.187 248.938 l
+144.165 249.321 144.099 249.589 143.981 249.747 c
+143.863 249.912 143.68 249.996 143.437 249.996 c
+146.23 250.481 m
+146.245 250.04 l
+146.498 250.383 146.822 250.555 147.215 250.555 c
+147.921 250.555 148.277 250.084 148.288 249.144 c
+148.288 246.498 l
+147.641 246.498 l
+147.641 249.115 l
+147.641 249.427 147.586 249.647 147.48 249.776 c
+147.37 249.901 147.215 249.967 147.009 249.967 c
+146.851 249.967 146.704 249.912 146.568 249.805 c
+146.44 249.695 146.337 249.56 146.26 249.394 c
+146.26 246.498 l
+145.613 246.498 l
+145.613 250.481 l
+h
+153.022 246.498 m
+152.981 246.586 152.955 246.734 152.948 246.939 c
+152.713 246.593 152.419 246.425 152.066 246.425 c
+151.702 246.425 151.419 246.52 151.213 246.718 c
+151.015 246.925 150.919 247.211 150.919 247.586 c
+150.919 247.987 151.055 248.306 151.331 248.542 c
+151.603 248.783 151.977 248.909 152.448 248.909 c
+152.933 248.909 l
+152.933 249.335 l
+152.933 249.57 152.878 249.735 152.771 249.835 c
+152.661 249.941 152.499 249.996 152.286 249.996 c
+152.088 249.996 151.927 249.938 151.801 249.82 c
+151.684 249.703 151.625 249.556 151.625 249.379 c
+150.978 249.379 l
+150.978 249.574 151.037 249.765 151.154 249.953 c
+151.279 250.136 151.441 250.283 151.64 250.393 c
+151.846 250.5 152.073 250.555 152.33 250.555 c
+152.731 250.555 153.036 250.452 153.242 250.246 c
+153.455 250.04 153.569 249.747 153.58 249.365 c
+153.58 247.351 l
+153.58 247.046 153.617 246.782 153.697 246.557 c
+153.697 246.498 l
+h
+152.154 247.013 m
+152.32 247.013 152.47 247.056 152.61 247.145 c
+152.756 247.233 152.864 247.343 152.933 247.483 c
+152.933 248.424 l
+152.565 248.424 l
+152.249 248.424 152.007 248.354 151.831 248.218 c
+151.655 248.089 151.566 247.902 151.566 247.659 c
+151.566 247.432 151.61 247.266 151.699 247.16 c
+151.786 247.06 151.937 247.013 152.154 247.013 c
+156.916 250.481 m
+156.931 250.04 l
+157.185 250.383 157.508 250.555 157.901 250.555 c
+158.607 250.555 158.963 250.084 158.975 249.144 c
+158.975 246.498 l
+158.327 246.498 l
+158.327 249.115 l
+158.327 249.427 158.273 249.647 158.166 249.776 c
+158.055 249.901 157.901 249.967 157.695 249.967 c
+157.538 249.967 157.39 249.912 157.255 249.805 c
+157.126 249.695 157.023 249.56 156.946 249.394 c
+156.946 246.498 l
+156.299 246.498 l
+156.299 250.481 l
+h
+161.371 246.425 m
+160.871 246.425 160.488 246.572 160.224 246.865 c
+159.96 247.16 159.827 247.593 159.827 248.174 c
+159.827 248.644 l
+159.827 249.24 159.952 249.706 160.209 250.04 c
+160.474 250.383 160.833 250.555 161.297 250.555 c
+161.756 250.555 162.098 250.401 162.325 250.1 c
+162.561 249.805 162.682 249.342 162.693 248.718 c
+162.693 248.291 l
+160.474 248.291 l
+160.474 248.203 l
+160.474 247.769 160.551 247.457 160.709 247.262 c
+160.874 247.075 161.106 246.983 161.4 246.983 c
+161.595 246.983 161.768 247.017 161.914 247.086 c
+162.061 247.163 162.198 247.281 162.325 247.439 c
+162.664 247.027 l
+162.377 246.623 161.947 246.425 161.371 246.425 c
+161.297 249.996 m
+161.022 249.996 160.819 249.901 160.694 249.718 c
+160.565 249.529 160.492 249.24 160.474 248.85 c
+162.047 248.85 l
+162.047 248.938 l
+162.024 249.321 161.959 249.589 161.841 249.747 c
+161.723 249.912 161.539 249.996 161.297 249.996 c
+166.441 247.644 m
+167.044 250.481 l
+167.691 250.481 l
+166.706 246.498 l
+166.192 246.498 l
+165.413 249.35 l
+164.663 246.498 l
+164.134 246.498 l
+163.179 250.481 l
+163.81 250.481 l
+164.428 247.719 l
+165.163 250.481 l
+165.677 250.481 l
+h
+171.733 249.864 m
+171.645 249.882 171.546 249.893 171.439 249.893 c
+171.104 249.893 170.869 249.71 170.734 249.35 c
+170.734 246.498 l
+170.087 246.498 l
+170.087 250.481 l
+170.719 250.481 l
+170.734 250.07 l
+170.91 250.393 171.152 250.555 171.469 250.555 c
+171.575 250.555 171.663 250.533 171.733 250.497 c
+h
+173.732 246.425 m
+173.232 246.425 172.85 246.572 172.586 246.865 c
+172.321 247.16 172.189 247.593 172.189 248.174 c
+172.189 248.644 l
+172.189 249.24 172.314 249.706 172.571 250.04 c
+172.835 250.383 173.196 250.555 173.659 250.555 c
+174.119 250.555 174.46 250.401 174.688 250.1 c
+174.923 249.805 175.044 249.342 175.056 248.718 c
+175.056 248.291 l
+172.835 248.291 l
+172.835 248.203 l
+172.835 247.769 172.913 247.457 173.071 247.262 c
+173.236 247.075 173.468 246.983 173.762 246.983 c
+173.957 246.983 174.129 247.017 174.277 247.086 c
+174.423 247.163 174.559 247.281 174.688 247.439 c
+175.025 247.027 l
+174.739 246.623 174.31 246.425 173.732 246.425 c
+173.659 249.996 m
+173.383 249.996 173.181 249.901 173.056 249.718 c
+172.928 249.529 172.854 249.24 172.835 248.85 c
+174.408 248.85 l
+174.408 248.938 l
+174.387 249.321 174.32 249.589 174.202 249.747 c
+174.085 249.912 173.901 249.996 173.659 249.996 c
+178.715 248.291 m
+178.715 247.663 178.597 247.193 178.362 246.88 c
+178.135 246.576 177.819 246.425 177.407 246.425 c
+177.003 246.425 176.694 246.576 176.481 246.88 c
+176.481 244.97 l
+175.834 244.97 l
+175.834 250.481 l
+176.422 250.481 l
+176.467 250.04 l
+176.679 250.383 176.988 250.555 177.392 250.555 c
+177.834 250.555 178.16 250.401 178.377 250.1 c
+178.59 249.795 178.705 249.338 178.715 248.733 c
+h
+178.069 248.673 m
+178.069 249.115 177.999 249.438 177.863 249.643 c
+177.723 249.857 177.502 249.967 177.201 249.967 c
+176.885 249.967 176.646 249.813 176.481 249.512 c
+176.481 247.439 l
+176.646 247.134 176.885 246.983 177.201 246.983 c
+177.495 246.983 177.708 247.086 177.848 247.291 c
+177.984 247.505 178.057 247.836 178.069 248.276 c
+h
+179.421 248.673 m
+179.421 249.251 179.557 249.706 179.833 250.04 c
+180.116 250.383 180.486 250.555 180.949 250.555 c
+181.409 250.555 181.776 250.386 182.052 250.055 c
+182.335 249.732 182.482 249.284 182.493 248.718 c
+182.493 248.291 l
+182.493 247.722 182.35 247.266 182.067 246.925 c
+181.791 246.59 181.423 246.425 180.964 246.425 c
+180.501 246.425 180.13 246.586 179.847 246.909 c
+179.571 247.241 179.428 247.682 179.421 248.232 c
+h
+180.068 248.291 m
+180.068 247.887 180.145 247.571 180.303 247.336 c
+180.469 247.1 180.689 246.983 180.964 246.983 c
+181.53 246.983 181.824 247.395 181.846 248.218 c
+181.846 248.673 l
+181.846 249.074 181.762 249.394 181.597 249.629 c
+181.438 249.872 181.221 249.996 180.949 249.996 c
+180.685 249.996 180.469 249.872 180.303 249.629 c
+180.145 249.394 180.068 249.074 180.068 248.673 c
+h
+185.271 247.512 m
+185.271 247.659 185.216 247.781 185.109 247.879 c
+184.999 247.975 184.793 248.093 184.492 248.232 c
+184.147 248.38 183.904 248.501 183.757 248.6 c
+183.61 248.706 183.5 248.824 183.434 248.953 c
+183.364 249.078 183.33 249.236 183.33 249.423 c
+183.33 249.747 183.449 250.015 183.684 250.231 c
+183.919 250.445 184.22 250.555 184.595 250.555 c
+184.977 250.555 185.286 250.441 185.521 250.217 c
+185.756 249.989 185.874 249.703 185.874 249.35 c
+185.227 249.35 l
+185.227 249.526 185.169 249.677 185.051 249.805 c
+184.933 249.93 184.779 249.996 184.595 249.996 c
+184.396 249.996 184.246 249.941 184.139 249.835 c
+184.029 249.735 183.978 249.604 183.978 249.438 c
+183.978 249.309 184.014 249.203 184.095 249.115 c
+184.172 249.034 184.363 248.931 184.668 248.806 c
+185.146 248.619 185.477 248.431 185.653 248.247 c
+185.83 248.071 185.917 247.843 185.917 247.571 c
+185.917 247.218 185.793 246.939 185.55 246.734 c
+185.315 246.528 184.999 246.425 184.61 246.425 c
+184.187 246.425 183.849 246.543 183.596 246.778 c
+183.338 247.02 183.214 247.325 183.214 247.688 c
+183.86 247.688 l
+183.867 247.461 183.937 247.285 184.066 247.16 c
+184.191 247.042 184.375 246.983 184.61 246.983 c
+184.822 246.983 184.984 247.031 185.095 247.131 c
+185.212 247.226 185.271 247.354 185.271 247.512 c
+187.461 246.498 -0.646 3.983 re
+187.505 251.525 m
+187.505 251.415 187.476 251.323 187.417 251.246 c
+187.359 251.176 187.263 251.143 187.137 251.143 c
+187.02 251.143 186.925 251.176 186.858 251.246 c
+186.8 251.323 186.771 251.415 186.771 251.525 c
+186.771 251.642 186.8 251.735 186.858 251.804 c
+186.925 251.881 187.02 251.922 187.137 251.922 c
+187.263 251.922 187.359 251.881 187.417 251.804 c
+187.476 251.723 187.505 251.632 187.505 251.525 c
+189.328 251.437 m
+189.328 250.481 l
+189.931 250.481 l
+189.931 249.953 l
+189.328 249.953 l
+189.328 247.483 l
+189.328 247.325 189.35 247.208 189.402 247.131 c
+189.46 247.05 189.549 247.013 189.666 247.013 c
+189.755 247.013 189.842 247.027 189.931 247.056 c
+189.931 246.498 l
+189.784 246.45 189.629 246.425 189.475 246.425 c
+189.217 246.425 189.023 246.516 188.887 246.703 c
+188.747 246.888 188.681 247.148 188.681 247.483 c
+188.681 249.953 l
+188.078 249.953 l
+188.078 250.481 l
+188.681 250.481 l
+188.681 251.437 l
+h
+190.489 248.673 m
+190.489 249.251 190.625 249.706 190.9 250.04 c
+191.184 250.383 191.555 250.555 192.018 250.555 c
+192.477 250.555 192.845 250.386 193.121 250.055 c
+193.404 249.732 193.55 249.284 193.562 248.718 c
+193.562 248.291 l
+193.562 247.722 193.418 247.266 193.135 246.925 c
+192.859 246.59 192.492 246.425 192.032 246.425 c
+191.569 246.425 191.199 246.586 190.915 246.909 c
+190.64 247.241 190.497 247.682 190.489 248.232 c
+h
+191.136 248.291 m
+191.136 247.887 191.213 247.571 191.371 247.336 c
+191.536 247.1 191.757 246.983 192.032 246.983 c
+192.598 246.983 192.893 247.395 192.915 248.218 c
+192.915 248.673 l
+192.915 249.074 192.83 249.394 192.664 249.629 c
+192.506 249.872 192.29 249.996 192.018 249.996 c
+191.754 249.996 191.536 249.872 191.371 249.629 c
+191.213 249.394 191.136 249.074 191.136 248.673 c
+h
+196.045 249.864 m
+195.957 249.882 195.858 249.893 195.752 249.893 c
+195.417 249.893 195.182 249.71 195.046 249.35 c
+195.046 246.498 l
+194.399 246.498 l
+194.399 250.481 l
+195.031 250.481 l
+195.046 250.07 l
+195.222 250.393 195.465 250.555 195.781 250.555 c
+195.887 250.555 195.976 250.533 196.045 250.497 c
+h
+197.853 247.586 m
+198.574 250.481 l
+199.265 250.481 l
+197.971 245.94 l
+197.872 245.598 197.728 245.337 197.545 245.161 c
+197.368 244.984 197.167 244.896 196.942 244.896 c
+196.854 244.896 196.74 244.918 196.604 244.955 c
+196.604 245.498 l
+196.751 245.484 l
+196.934 245.484 197.082 245.528 197.192 245.616 c
+197.298 245.704 197.387 245.862 197.456 246.086 c
+197.574 246.528 l
+196.413 250.481 l
+197.119 250.481 l
+h
+202.322 246.498 -0.647 3.983 re
+202.366 251.525 m
+202.366 251.415 202.337 251.323 202.278 251.246 c
+202.219 251.176 202.123 251.143 201.998 251.143 c
+201.881 251.143 201.786 251.176 201.719 251.246 c
+201.661 251.323 201.631 251.415 201.631 251.525 c
+201.631 251.642 201.661 251.735 201.719 251.804 c
+201.786 251.881 201.881 251.922 201.998 251.922 c
+202.123 251.922 202.219 251.881 202.278 251.804 c
+202.337 251.723 202.366 251.632 202.366 251.525 c
+205.277 247.512 m
+205.277 247.659 205.221 247.781 205.115 247.879 c
+205.005 247.975 204.799 248.093 204.497 248.232 c
+204.152 248.38 203.91 248.501 203.762 248.6 c
+203.615 248.706 203.505 248.824 203.44 248.953 c
+203.369 249.078 203.336 249.236 203.336 249.423 c
+203.336 249.747 203.454 250.015 203.689 250.231 c
+203.924 250.445 204.225 250.555 204.6 250.555 c
+204.982 250.555 205.291 250.441 205.526 250.217 c
+205.761 249.989 205.879 249.703 205.879 249.35 c
+205.233 249.35 l
+205.233 249.526 205.173 249.677 205.056 249.805 c
+204.938 249.93 204.784 249.996 204.6 249.996 c
+204.402 249.996 204.251 249.941 204.145 249.835 c
+204.034 249.735 203.983 249.604 203.983 249.438 c
+203.983 249.309 204.02 249.203 204.101 249.115 c
+204.178 249.034 204.369 248.931 204.674 248.806 c
+205.152 248.619 205.482 248.431 205.659 248.247 c
+205.835 248.071 205.923 247.843 205.923 247.571 c
+205.923 247.218 205.798 246.939 205.556 246.734 c
+205.321 246.528 205.005 246.425 204.615 246.425 c
+204.192 246.425 203.854 246.543 203.6 246.778 c
+203.344 247.02 203.218 247.325 203.218 247.688 c
+203.866 247.688 l
+203.872 247.461 203.943 247.285 204.071 247.16 c
+204.196 247.042 204.38 246.983 204.615 246.983 c
+204.828 246.983 204.99 247.031 205.1 247.131 c
+205.218 247.226 205.277 247.354 205.277 247.512 c
+209.187 246.498 -0.647 3.983 re
+209.231 251.525 m
+209.231 251.415 209.201 251.323 209.142 251.246 c
+209.084 251.176 208.988 251.143 208.863 251.143 c
+208.745 251.143 208.65 251.176 208.584 251.246 c
+208.525 251.323 208.495 251.415 208.495 251.525 c
+208.495 251.642 208.525 251.735 208.584 251.804 c
+208.65 251.881 208.745 251.922 208.863 251.922 c
+208.988 251.922 209.084 251.881 209.142 251.804 c
+209.201 251.723 209.231 251.632 209.231 251.525 c
+210.818 250.481 m
+210.833 250.04 l
+211.086 250.383 211.409 250.555 211.803 250.555 c
+212.508 250.555 212.865 250.084 212.876 249.144 c
+212.876 246.498 l
+212.229 246.498 l
+212.229 249.115 l
+212.229 249.427 212.174 249.647 212.067 249.776 c
+211.957 249.901 211.803 249.967 211.597 249.967 c
+211.439 249.967 211.292 249.912 211.156 249.805 c
+211.028 249.695 210.925 249.56 210.847 249.394 c
+210.847 246.498 l
+210.201 246.498 l
+210.201 250.481 l
+h
+214.552 246.498 -0.647 3.983 re
+214.596 251.525 m
+214.596 251.415 214.567 251.323 214.507 251.246 c
+214.449 251.176 214.353 251.143 214.228 251.143 c
+214.11 251.143 214.015 251.176 213.949 251.246 c
+213.89 251.323 213.861 251.415 213.861 251.525 c
+213.861 251.642 213.89 251.735 213.949 251.804 c
+214.015 251.881 214.11 251.922 214.228 251.922 c
+214.353 251.922 214.449 251.881 214.507 251.804 c
+214.567 251.723 214.596 251.632 214.596 251.525 c
+216.418 251.437 m
+216.418 250.481 l
+217.021 250.481 l
+217.021 249.953 l
+216.418 249.953 l
+216.418 247.483 l
+216.418 247.325 216.441 247.208 216.491 247.131 c
+216.551 247.05 216.639 247.013 216.757 247.013 c
+216.845 247.013 216.933 247.027 217.021 247.056 c
+217.021 246.498 l
+216.874 246.45 216.72 246.425 216.566 246.425 c
+216.308 246.425 216.113 246.516 215.978 246.703 c
+215.838 246.888 215.772 247.148 215.772 247.483 c
+215.772 249.953 l
+215.169 249.953 l
+215.169 250.481 l
+215.772 250.481 l
+215.772 251.437 l
+h
+218.491 246.498 -0.647 3.983 re
+218.535 251.525 m
+218.535 251.415 218.505 251.323 218.447 251.246 c
+218.388 251.176 218.293 251.143 218.168 251.143 c
+218.05 251.143 217.954 251.176 217.888 251.246 c
+217.829 251.323 217.8 251.415 217.8 251.525 c
+217.8 251.642 217.829 251.735 217.888 251.804 c
+217.954 251.881 218.05 251.922 218.168 251.922 c
+218.293 251.922 218.388 251.881 218.447 251.804 c
+218.505 251.723 218.535 251.632 218.535 251.525 c
+221.549 246.498 m
+221.508 246.586 221.482 246.734 221.474 246.939 c
+221.239 246.593 220.946 246.425 220.593 246.425 c
+220.229 246.425 219.946 246.52 219.741 246.718 c
+219.542 246.925 219.446 247.211 219.446 247.586 c
+219.446 247.987 219.583 248.306 219.858 248.542 c
+220.13 248.783 220.505 248.909 220.975 248.909 c
+221.46 248.909 l
+221.46 249.335 l
+221.46 249.57 221.405 249.735 221.299 249.835 c
+221.188 249.941 221.027 249.996 220.813 249.996 c
+220.615 249.996 220.453 249.938 220.329 249.82 c
+220.211 249.703 220.152 249.556 220.152 249.379 c
+219.505 249.379 l
+219.505 249.574 219.564 249.765 219.681 249.953 c
+219.807 250.136 219.968 250.283 220.167 250.393 c
+220.373 250.5 220.6 250.555 220.857 250.555 c
+221.258 250.555 221.563 250.452 221.769 250.246 c
+221.982 250.04 222.096 249.747 222.107 249.365 c
+222.107 247.351 l
+222.107 247.046 222.143 246.782 222.224 246.557 c
+222.224 246.498 l
+h
+220.681 247.013 m
+220.846 247.013 220.997 247.056 221.137 247.145 c
+221.283 247.233 221.391 247.343 221.46 247.483 c
+221.46 248.424 l
+221.093 248.424 l
+220.776 248.424 220.534 248.354 220.358 248.218 c
+220.181 248.089 220.093 247.902 220.093 247.659 c
+220.093 247.432 220.138 247.266 220.225 247.16 c
+220.314 247.06 220.464 247.013 220.681 247.013 c
+223.812 246.498 -0.647 5.644 re
+225.532 246.498 -0.647 3.983 re
+225.576 251.525 m
+225.576 251.415 225.547 251.323 225.488 251.246 c
+225.428 251.176 225.333 251.143 225.208 251.143 c
+225.091 251.143 224.996 251.176 224.929 251.246 c
+224.871 251.323 224.841 251.415 224.841 251.525 c
+224.841 251.642 224.871 251.735 224.929 251.804 c
+224.996 251.881 225.091 251.922 225.208 251.922 c
+225.333 251.922 225.428 251.881 225.488 251.804 c
+225.547 251.723 225.576 251.632 225.576 251.525 c
+227.149 247.056 m
+229.075 247.056 l
+229.075 246.498 l
+226.413 246.498 l
+226.413 246.998 l
+228.236 249.909 l
+226.428 249.909 l
+226.428 250.481 l
+229 250.481 l
+229 249.996 l
+h
+231.221 246.425 m
+230.721 246.425 230.338 246.572 230.074 246.865 c
+229.809 247.16 229.677 247.593 229.677 248.174 c
+229.677 248.644 l
+229.677 249.24 229.802 249.706 230.059 250.04 c
+230.324 250.383 230.683 250.555 231.147 250.555 c
+231.606 250.555 231.948 250.401 232.175 250.1 c
+232.411 249.805 232.532 249.342 232.543 248.718 c
+232.543 248.291 l
+230.324 248.291 l
+230.324 248.203 l
+230.324 247.769 230.401 247.457 230.559 247.262 c
+230.724 247.075 230.956 246.983 231.25 246.983 c
+231.444 246.983 231.618 247.017 231.764 247.086 c
+231.911 247.163 232.047 247.281 232.175 247.439 c
+232.514 247.027 l
+232.227 246.623 231.797 246.425 231.221 246.425 c
+231.147 249.996 m
+230.872 249.996 230.669 249.901 230.544 249.718 c
+230.415 249.529 230.342 249.24 230.324 248.85 c
+231.897 248.85 l
+231.897 248.938 l
+231.874 249.321 231.808 249.589 231.691 249.747 c
+231.573 249.912 231.389 249.996 231.147 249.996 c
+233.189 248.673 m
+233.189 249.28 233.3 249.747 233.528 250.07 c
+233.763 250.393 234.091 250.555 234.513 250.555 c
+234.895 250.555 235.192 250.397 235.41 250.084 c
+235.41 252.143 l
+236.056 252.143 l
+236.056 246.498 l
+235.468 246.498 l
+235.425 246.925 l
+235.219 246.59 234.914 246.425 234.513 246.425 c
+234.101 246.425 233.778 246.579 233.543 246.895 c
+233.308 247.218 233.189 247.674 233.189 248.262 c
+h
+233.837 248.291 m
+233.837 247.85 233.899 247.52 234.028 247.306 c
+234.164 247.1 234.384 246.998 234.689 246.998 c
+235.013 246.998 235.252 247.16 235.41 247.483 c
+235.41 249.497 l
+235.24 249.809 235.001 249.967 234.689 249.967 c
+234.384 249.967 234.164 249.864 234.028 249.658 c
+233.899 249.452 233.837 249.13 233.837 248.688 c
+h
+239.481 246.498 -0.647 3.983 re
+239.525 251.525 m
+239.525 251.415 239.496 251.323 239.437 251.246 c
+239.379 251.176 239.283 251.143 239.158 251.143 c
+239.04 251.143 238.945 251.176 238.878 251.246 c
+238.82 251.323 238.791 251.415 238.791 251.525 c
+238.791 251.642 238.82 251.735 238.878 251.804 c
+238.945 251.881 239.04 251.922 239.158 251.922 c
+239.283 251.922 239.379 251.881 239.437 251.804 c
+239.496 251.723 239.525 251.632 239.525 251.525 c
+241.112 250.481 m
+241.127 250.04 l
+241.381 250.383 241.704 250.555 242.097 250.555 c
+242.803 250.555 243.159 250.084 243.171 249.144 c
+243.171 246.498 l
+242.523 246.498 l
+242.523 249.115 l
+242.523 249.427 242.469 249.647 242.362 249.776 c
+242.252 249.901 242.097 249.967 241.891 249.967 c
+241.734 249.967 241.587 249.912 241.451 249.805 c
+241.322 249.695 241.22 249.56 241.143 249.394 c
+241.143 246.498 l
+240.495 246.498 l
+240.495 250.481 l
+h
+247.242 246.983 m
+247.456 246.983 247.628 247.046 247.757 247.174 c
+247.892 247.31 247.967 247.501 247.977 247.748 c
+248.595 247.748 l
+248.572 247.366 248.437 247.046 248.183 246.792 c
+247.926 246.546 247.614 246.425 247.242 246.425 c
+246.75 246.425 246.375 246.576 246.111 246.88 c
+245.853 247.193 245.729 247.659 245.729 248.276 c
+245.729 248.718 l
+245.729 249.313 245.853 249.768 246.111 250.084 c
+246.375 250.397 246.75 250.555 247.242 250.555 c
+247.643 250.555 247.963 250.423 248.198 250.158 c
+248.44 249.901 248.572 249.556 248.595 249.115 c
+247.977 249.115 l
+247.955 249.408 247.882 249.629 247.757 249.776 c
+247.639 249.923 247.466 249.996 247.242 249.996 c
+246.949 249.996 246.731 249.897 246.595 249.703 c
+246.456 249.515 246.382 249.207 246.375 248.777 c
+246.375 248.262 l
+246.375 247.792 246.441 247.457 246.581 247.262 c
+246.728 247.075 246.949 246.983 247.242 246.983 c
+251.373 246.851 m
+251.156 246.564 250.843 246.425 250.432 246.425 c
+250.068 246.425 249.793 246.546 249.609 246.792 c
+249.432 247.046 249.337 247.409 249.33 247.879 c
+249.33 250.481 l
+249.976 250.481 l
+249.976 247.939 l
+249.976 247.31 250.16 246.998 250.535 246.998 c
+250.936 246.998 251.211 247.174 251.358 247.527 c
+251.358 250.481 l
+252.004 250.481 l
+252.004 246.498 l
+251.387 246.498 l
+h
+254.636 249.864 m
+254.548 249.882 254.448 249.893 254.342 249.893 c
+254.007 249.893 253.772 249.71 253.636 249.35 c
+253.636 246.498 l
+252.989 246.498 l
+252.989 250.481 l
+253.621 250.481 l
+253.636 250.07 l
+253.812 250.393 254.055 250.555 254.371 250.555 c
+254.477 250.555 254.566 250.533 254.636 250.497 c
+h
+256.929 249.864 m
+256.841 249.882 256.742 249.893 256.635 249.893 c
+256.301 249.893 256.065 249.71 255.929 249.35 c
+255.929 246.498 l
+255.283 246.498 l
+255.283 250.481 l
+255.915 250.481 l
+255.929 250.07 l
+256.106 250.393 256.349 250.555 256.665 250.555 c
+256.771 250.555 256.859 250.533 256.929 250.497 c
+h
+258.928 246.425 m
+258.429 246.425 258.046 246.572 257.781 246.865 c
+257.517 247.16 257.384 247.593 257.384 248.174 c
+257.384 248.644 l
+257.384 249.24 257.509 249.706 257.767 250.04 c
+258.032 250.383 258.392 250.555 258.855 250.555 c
+259.314 250.555 259.655 250.401 259.884 250.1 c
+260.119 249.805 260.24 249.342 260.251 248.718 c
+260.251 248.291 l
+258.032 248.291 l
+258.032 248.203 l
+258.032 247.769 258.109 247.457 258.267 247.262 c
+258.432 247.075 258.664 246.983 258.957 246.983 c
+259.152 246.983 259.325 247.017 259.472 247.086 c
+259.619 247.163 259.755 247.281 259.884 247.439 c
+260.222 247.027 l
+259.935 246.623 259.505 246.425 258.928 246.425 c
+258.855 249.996 m
+258.579 249.996 258.377 249.901 258.252 249.718 c
+258.123 249.529 258.049 249.24 258.032 248.85 c
+259.604 248.85 l
+259.604 248.938 l
+259.582 249.321 259.516 249.589 259.398 249.747 c
+259.281 249.912 259.097 249.996 258.855 249.996 c
+261.647 250.481 m
+261.662 250.04 l
+261.916 250.383 262.239 250.555 262.632 250.555 c
+263.337 250.555 263.694 250.084 263.705 249.144 c
+263.705 246.498 l
+263.058 246.498 l
+263.058 249.115 l
+263.058 249.427 263.003 249.647 262.897 249.776 c
+262.786 249.901 262.632 249.967 262.427 249.967 c
+262.269 249.967 262.121 249.912 261.986 249.805 c
+261.857 249.695 261.754 249.56 261.677 249.394 c
+261.677 246.498 l
+261.03 246.498 l
+261.03 250.481 l
+h
+265.528 251.437 m
+265.528 250.481 l
+266.13 250.481 l
+266.13 249.953 l
+265.528 249.953 l
+265.528 247.483 l
+265.528 247.325 265.55 247.208 265.602 247.131 c
+265.66 247.05 265.748 247.013 265.866 247.013 c
+265.954 247.013 266.042 247.027 266.13 247.056 c
+266.13 246.498 l
+265.984 246.45 265.829 246.425 265.675 246.425 c
+265.417 246.425 265.223 246.516 265.087 246.703 c
+264.947 246.888 264.881 247.148 264.881 247.483 c
+264.881 249.953 l
+264.278 249.953 l
+264.278 250.481 l
+264.881 250.481 l
+264.881 251.437 l
+h
+f
+q 1 0 0 1 239.0691 239.266 cm
+0 0 m
+0 0.607 0.111 1.073 0.339 1.397 c
+0.574 1.72 0.901 1.881 1.324 1.881 c
+1.706 1.881 2.003 1.723 2.22 1.411 c
+2.22 3.469 l
+2.866 3.469 l
+2.866 -2.175 l
+2.278 -2.175 l
+2.235 -1.749 l
+2.029 -2.084 1.724 -2.248 1.324 -2.248 c
+0.912 -2.248 0.589 -2.094 0.354 -1.778 c
+0.119 -1.455 0 -0.999 0 -0.411 c
+h
+0.647 -0.382 m
+0.647 -0.823 0.709 -1.153 0.838 -1.367 c
+0.975 -1.573 1.195 -1.675 1.5 -1.675 c
+1.823 -1.675 2.062 -1.514 2.22 -1.19 c
+2.22 0.823 l
+2.051 1.135 1.812 1.294 1.5 1.294 c
+1.195 1.294 0.975 1.191 0.838 0.985 c
+0.709 0.779 0.647 0.456 0.647 0.015 c
+h
+4.572 -2.175 -0.647 3.983 re
+4.616 2.851 m
+4.616 2.741 4.587 2.65 4.528 2.573 c
+4.469 2.502 4.374 2.469 4.248 2.469 c
+4.131 2.469 4.036 2.502 3.969 2.573 c
+3.911 2.65 3.882 2.741 3.882 2.851 c
+3.882 2.969 3.911 3.061 3.969 3.131 c
+4.036 3.208 4.131 3.248 4.248 3.248 c
+4.374 3.248 4.469 3.208 4.528 3.131 c
+4.587 3.05 4.616 2.959 4.616 2.851 c
+7.232 1.191 m
+7.144 1.209 7.045 1.22 6.939 1.22 c
+6.604 1.22 6.369 1.037 6.233 0.676 c
+6.233 -2.175 l
+5.586 -2.175 l
+5.586 1.808 l
+6.218 1.808 l
+6.233 1.397 l
+6.409 1.72 6.652 1.881 6.968 1.881 c
+7.074 1.881 7.163 1.86 7.232 1.823 c
+h
+9.231 -2.248 m
+8.732 -2.248 8.35 -2.102 8.085 -1.808 c
+7.82 -1.514 7.688 -1.08 7.688 -0.5 c
+7.688 -0.029 l
+7.688 0.566 7.813 1.033 8.071 1.367 c
+8.335 1.709 8.695 1.881 9.158 1.881 c
+9.617 1.881 9.959 1.727 10.187 1.426 c
+10.422 1.132 10.544 0.669 10.554 0.044 c
+10.554 -0.382 l
+8.335 -0.382 l
+8.335 -0.47 l
+8.335 -0.904 8.412 -1.216 8.57 -1.411 c
+8.736 -1.598 8.967 -1.691 9.261 -1.691 c
+9.455 -1.691 9.628 -1.657 9.775 -1.587 c
+9.922 -1.51 10.058 -1.392 10.187 -1.234 c
+10.525 -1.646 l
+10.238 -2.05 9.808 -2.248 9.231 -2.248 c
+9.158 1.323 m
+8.882 1.323 8.68 1.228 8.555 1.044 c
+8.427 0.856 8.353 0.566 8.335 0.177 c
+9.908 0.177 l
+9.908 0.264 l
+9.885 0.647 9.819 0.915 9.702 1.073 c
+9.584 1.239 9.401 1.323 9.158 1.323 c
+12.715 -1.691 m
+12.929 -1.691 13.101 -1.627 13.23 -1.5 c
+13.366 -1.363 13.439 -1.172 13.45 -0.926 c
+14.068 -0.926 l
+14.045 -1.308 13.91 -1.627 13.656 -1.881 c
+13.399 -2.127 13.087 -2.248 12.715 -2.248 c
+12.223 -2.248 11.848 -2.098 11.583 -1.793 c
+11.327 -1.481 11.201 -1.014 11.201 -0.397 c
+11.201 0.044 l
+11.201 0.64 11.327 1.095 11.583 1.411 c
+11.848 1.723 12.223 1.881 12.715 1.881 c
+13.116 1.881 13.436 1.75 13.671 1.484 c
+13.914 1.228 14.045 0.882 14.068 0.441 c
+13.45 0.441 l
+13.428 0.735 13.355 0.956 13.23 1.103 c
+13.112 1.249 12.939 1.323 12.715 1.323 c
+12.422 1.323 12.204 1.224 12.069 1.029 c
+11.929 0.842 11.855 0.533 11.848 0.103 c
+11.848 -0.411 l
+11.848 -0.881 11.914 -1.216 12.054 -1.411 c
+12.2 -1.598 12.422 -1.691 12.715 -1.691 c
+15.67 2.764 m
+15.67 1.808 l
+16.272 1.808 l
+16.272 1.279 l
+15.67 1.279 l
+15.67 -1.19 l
+15.67 -1.348 15.692 -1.466 15.743 -1.543 c
+15.802 -1.624 15.89 -1.66 16.008 -1.66 c
+16.096 -1.66 16.184 -1.646 16.272 -1.617 c
+16.272 -2.175 l
+16.125 -2.223 15.971 -2.248 15.817 -2.248 c
+15.56 -2.248 15.365 -2.157 15.229 -1.97 c
+15.089 -1.786 15.023 -1.525 15.023 -1.19 c
+15.023 1.279 l
+14.421 1.279 l
+14.421 1.808 l
+15.023 1.808 l
+15.023 2.764 l
+h
+16.831 0 m
+16.831 0.578 16.967 1.033 17.243 1.367 c
+17.525 1.709 17.897 1.881 18.359 1.881 c
+18.819 1.881 19.186 1.713 19.462 1.382 c
+19.745 1.058 19.892 0.611 19.903 0.044 c
+19.903 -0.382 l
+19.903 -0.951 19.759 -1.407 19.477 -1.749 c
+19.201 -2.084 18.834 -2.248 18.375 -2.248 c
+17.912 -2.248 17.54 -2.087 17.257 -1.764 c
+16.981 -1.433 16.838 -0.992 16.831 -0.441 c
+h
+17.478 -0.382 m
+17.478 -0.786 17.555 -1.103 17.713 -1.338 c
+17.878 -1.573 18.099 -1.691 18.375 -1.691 c
+18.94 -1.691 19.234 -1.278 19.256 -0.455 c
+19.256 0 l
+19.256 0.401 19.171 0.721 19.007 0.956 c
+18.849 1.199 18.631 1.323 18.359 1.323 c
+18.095 1.323 17.878 1.199 17.713 0.956 c
+17.555 0.721 17.478 0.401 17.478 0 c
+h
+22.387 1.191 m
+22.299 1.209 22.2 1.22 22.093 1.22 c
+21.758 1.22 21.523 1.037 21.388 0.676 c
+21.388 -2.175 l
+20.741 -2.175 l
+20.741 1.808 l
+21.373 1.808 l
+21.388 1.397 l
+21.564 1.72 21.806 1.881 22.122 1.881 c
+22.229 1.881 22.317 1.86 22.387 1.823 c
+h
+24.195 -1.087 m
+24.915 1.808 l
+25.606 1.808 l
+24.312 -2.734 l
+24.214 -3.075 24.07 -3.337 23.886 -3.513 c
+23.71 -3.69 23.508 -3.777 23.283 -3.777 c
+23.196 -3.777 23.082 -3.755 22.946 -3.719 c
+22.946 -3.175 l
+23.092 -3.189 l
+23.277 -3.189 23.423 -3.146 23.534 -3.057 c
+23.64 -2.969 23.728 -2.811 23.798 -2.587 c
+23.915 -2.146 l
+22.755 1.808 l
+23.46 1.808 l
+h
+25.885 -1.822 m
+25.885 -1.705 25.918 -1.61 25.989 -1.529 c
+26.055 -1.452 26.157 -1.411 26.297 -1.411 c
+26.444 -1.411 26.551 -1.452 26.62 -1.529 c
+26.697 -1.61 26.738 -1.705 26.738 -1.822 c
+26.738 -1.932 26.697 -2.024 26.62 -2.102 c
+26.551 -2.179 26.444 -2.219 26.297 -2.219 c
+26.157 -2.219 26.055 -2.179 25.989 -2.102 c
+25.918 -2.024 25.885 -1.932 25.885 -1.822 c
+f
+Q
+0.113 0.082 0.09 0 k
+35.668 231.104 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 40.8563 224.2696 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.437 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.245 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.152 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.116 l
+14.497 3.116 l
+14.497 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.497 1.602 l
+14.497 -0.103 l
+14.497 -0.324 l
+14.504 -0.393 14.527 -0.456 14.556 -0.515 c
+14.593 -0.566 14.648 -0.611 14.718 -0.647 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.688 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.279 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.041 -1.301 14.942 -1.309 14.835 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.221 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.085 13.85 -1.025 13.791 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.456 c
+13.59 -0.36 13.586 -0.264 13.586 -0.177 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.943 -1.205 c
+21.737 -1.118 21.564 -0.996 21.428 -0.838 c
+21.288 -0.684 21.185 -0.497 21.119 -0.279 c
+21.049 -0.056 21.016 0.191 21.016 0.455 c
+21.016 0.75 21.049 1.007 21.119 1.234 c
+21.197 1.459 21.303 1.646 21.442 1.793 c
+21.589 1.947 21.766 2.065 21.972 2.146 c
+22.178 2.234 22.413 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.248 23.28 2.19 c
+23.456 2.131 23.607 2.047 23.736 1.94 c
+23.861 1.841 23.963 1.72 24.044 1.573 c
+24.122 1.433 24.176 1.282 24.206 1.117 c
+23.295 1.072 l
+23.265 1.249 23.196 1.389 23.089 1.5 c
+22.99 1.606 22.846 1.66 22.662 1.66 c
+22.416 1.66 22.24 1.558 22.134 1.352 c
+22.023 1.153 21.972 0.867 21.972 0.484 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.276 23.324 -0.059 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.574 c
+24.004 -0.721 23.901 -0.852 23.765 -0.97 c
+23.636 -1.081 23.478 -1.168 23.295 -1.235 c
+23.119 -1.294 22.913 -1.323 22.677 -1.323 c
+27.281 -0.647 m
+28.413 -0.647 l
+28.413 -1.264 l
+25.106 -1.264 l
+25.106 -0.647 l
+26.371 -0.647 l
+26.371 2.896 l
+25.444 2.896 l
+25.444 3.513 l
+27.281 3.513 l
+h
+32.445 0.484 m
+32.445 0.209 32.408 -0.04 32.342 -0.264 c
+32.272 -0.482 32.17 -0.669 32.033 -0.823 c
+31.894 -0.981 31.717 -1.103 31.504 -1.191 c
+31.287 -1.279 31.034 -1.323 30.74 -1.323 c
+30.464 -1.323 30.217 -1.279 30.005 -1.191 c
+29.799 -1.103 29.626 -0.981 29.49 -0.823 c
+29.35 -0.669 29.248 -0.482 29.182 -0.264 c
+29.112 -0.04 29.078 0.209 29.078 0.484 c
+29.078 0.738 29.108 0.974 29.167 1.19 c
+29.233 1.415 29.336 1.606 29.475 1.764 c
+29.612 1.929 29.788 2.057 30.005 2.146 c
+30.217 2.234 30.475 2.278 30.769 2.278 c
+31.081 2.278 31.343 2.234 31.548 2.146 c
+31.761 2.057 31.934 1.929 32.062 1.764 c
+32.199 1.606 32.297 1.415 32.357 1.19 c
+32.415 0.974 32.445 0.738 32.445 0.484 c
+31.489 0.484 m
+31.489 0.69 31.474 0.867 31.445 1.014 c
+31.424 1.161 31.387 1.282 31.328 1.382 c
+31.269 1.477 31.195 1.547 31.107 1.587 c
+31.019 1.635 30.909 1.66 30.784 1.66 c
+30.519 1.66 30.328 1.562 30.211 1.367 c
+30.093 1.18 30.034 0.885 30.034 0.484 c
+30.034 0.062 30.093 -0.243 30.211 -0.426 c
+30.328 -0.614 30.504 -0.706 30.74 -0.706 c
+30.865 -0.706 30.979 -0.688 31.077 -0.647 c
+31.173 -0.599 31.254 -0.526 31.313 -0.426 c
+31.379 -0.331 31.424 -0.206 31.445 -0.059 c
+31.474 0.088 31.489 0.268 31.489 0.484 c
+35.495 -1.264 m
+35.495 0.72 l
+35.495 1.022 35.451 1.242 35.362 1.382 c
+35.281 1.529 35.146 1.602 34.951 1.602 c
+34.84 1.602 34.738 1.577 34.643 1.529 c
+34.554 1.477 34.473 1.411 34.408 1.323 c
+34.348 1.234 34.297 1.124 34.26 0.999 c
+34.231 0.881 34.216 0.75 34.216 0.602 c
+34.216 -1.264 l
+33.305 -1.264 l
+33.305 1.44 l
+33.305 1.66 l
+33.305 1.749 33.297 1.826 33.29 1.896 c
+33.29 2.087 l
+33.29 2.219 l
+34.142 2.219 l
+34.15 2.19 34.157 2.146 34.157 2.087 c
+34.157 1.896 l
+34.165 1.826 34.172 1.756 34.172 1.691 c
+34.179 1.62 34.186 1.565 34.186 1.529 c
+34.202 1.529 l
+34.319 1.793 34.47 1.984 34.657 2.102 c
+34.84 2.219 35.061 2.278 35.318 2.278 c
+35.503 2.278 35.663 2.248 35.804 2.19 c
+35.939 2.131 36.054 2.043 36.141 1.926 c
+36.23 1.808 36.292 1.664 36.332 1.5 c
+36.38 1.341 36.406 1.153 36.406 0.941 c
+36.406 -1.264 l
+h
+38.923 -1.323 m
+38.666 -1.323 38.439 -1.286 38.233 -1.22 c
+38.027 -1.143 37.851 -1.029 37.703 -0.882 c
+37.556 -0.728 37.439 -0.536 37.35 -0.309 c
+37.269 -0.085 37.233 0.18 37.233 0.484 c
+37.233 0.816 37.277 1.095 37.365 1.323 c
+37.461 1.558 37.589 1.741 37.747 1.881 c
+37.913 2.017 38.1 2.117 38.306 2.175 c
+38.512 2.242 38.721 2.278 38.938 2.278 c
+39.21 2.278 39.445 2.227 39.644 2.131 c
+39.85 2.043 40.014 1.911 40.143 1.735 c
+40.28 1.565 40.378 1.359 40.438 1.117 c
+40.504 0.881 40.54 0.617 40.54 0.324 c
+40.54 0.309 l
+38.173 0.309 l
+38.173 0.162 38.188 0.022 38.218 -0.103 c
+38.254 -0.231 38.31 -0.345 38.379 -0.441 c
+38.445 -0.53 38.53 -0.599 38.63 -0.647 c
+38.725 -0.698 38.838 -0.721 38.967 -0.721 c
+39.122 -0.721 39.262 -0.688 39.379 -0.617 c
+39.504 -0.551 39.592 -0.449 39.644 -0.309 c
+40.482 -0.382 l
+40.452 -0.482 40.397 -0.588 40.32 -0.706 c
+40.239 -0.816 40.136 -0.919 40.012 -1.014 c
+39.894 -1.103 39.739 -1.176 39.555 -1.235 c
+39.379 -1.294 39.166 -1.323 38.923 -1.323 c
+38.923 1.705 m
+38.836 1.705 38.747 1.691 38.659 1.66 c
+38.57 1.631 38.489 1.58 38.424 1.514 c
+38.354 1.444 38.295 1.356 38.248 1.249 c
+38.207 1.139 38.188 1.014 38.188 0.867 c
+39.659 0.867 l
+39.659 1.003 39.632 1.124 39.584 1.234 c
+39.544 1.341 39.489 1.429 39.424 1.5 c
+39.364 1.565 39.291 1.617 39.202 1.646 c
+39.114 1.683 39.019 1.705 38.923 1.705 c
+46.236 -2.631 m
+46.236 3.513 l
+48.162 3.513 l
+48.162 2.896 l
+47.089 2.896 l
+47.089 -2.014 l
+48.162 -2.014 l
+48.162 -2.631 l
+h
+50.414 2.219 m
+50.422 2.198 50.429 2.165 50.429 2.117 c
+50.437 2.076 50.443 2.028 50.443 1.97 c
+50.451 1.918 50.458 1.866 50.458 1.808 c
+50.458 1.646 l
+50.473 1.646 l
+50.532 1.764 50.598 1.859 50.679 1.94 c
+50.756 2.017 50.84 2.08 50.929 2.131 c
+51.017 2.19 51.106 2.227 51.193 2.248 c
+51.289 2.267 51.388 2.278 51.488 2.278 c
+51.693 2.278 51.873 2.234 52.031 2.146 c
+52.186 2.057 52.315 1.929 52.413 1.764 c
+52.52 1.606 52.597 1.415 52.648 1.19 c
+52.708 0.974 52.737 0.738 52.737 0.484 c
+52.737 0.22 52.708 -0.026 52.648 -0.25 c
+52.597 -0.467 52.52 -0.658 52.413 -0.823 c
+52.315 -0.981 52.182 -1.103 52.016 -1.191 c
+51.858 -1.279 51.671 -1.323 51.458 -1.323 c
+51.359 -1.323 51.26 -1.312 51.164 -1.294 c
+51.065 -1.272 50.973 -1.242 50.885 -1.191 c
+50.804 -1.143 50.727 -1.081 50.649 -1 c
+50.58 -0.923 50.521 -0.831 50.473 -0.721 c
+50.458 -0.721 l
+50.458 -0.809 l
+50.466 -0.849 50.473 -0.897 50.473 -0.956 c
+50.473 -1.118 l
+50.473 -1.294 l
+50.473 -2.631 l
+49.562 -2.631 l
+49.562 1.455 l
+49.562 1.62 49.554 1.768 49.547 1.896 c
+49.547 2.219 l
+h
+50.458 0.455 m
+50.458 0.228 50.477 0.037 50.517 -0.118 c
+50.565 -0.264 50.62 -0.382 50.679 -0.47 c
+50.745 -0.559 50.819 -0.625 50.9 -0.661 c
+50.977 -0.702 51.054 -0.721 51.135 -0.721 c
+51.23 -0.721 51.318 -0.698 51.399 -0.647 c
+51.488 -0.599 51.553 -0.53 51.605 -0.441 c
+51.664 -0.345 51.708 -0.221 51.737 -0.073 c
+51.774 0.081 51.796 0.268 51.796 0.484 c
+51.796 0.875 51.737 1.168 51.619 1.367 c
+51.509 1.562 51.355 1.66 51.149 1.66 c
+51.068 1.66 50.991 1.639 50.914 1.602 c
+50.833 1.562 50.759 1.5 50.694 1.411 c
+50.624 1.323 50.565 1.198 50.517 1.043 c
+50.477 0.885 50.458 0.69 50.458 0.455 c
+56.625 1.469 m
+56.525 1.477 56.423 1.488 56.316 1.5 c
+56.205 1.517 56.084 1.529 55.949 1.529 c
+55.772 1.529 55.614 1.488 55.478 1.411 c
+55.339 1.341 55.22 1.242 55.125 1.117 c
+55.037 0.989 54.967 0.841 54.919 0.676 c
+54.879 0.507 54.861 0.33 54.861 0.147 c
+54.861 -1.264 l
+53.965 -1.264 l
+53.965 0.985 l
+53.965 1.11 53.953 1.234 53.934 1.352 c
+53.924 1.477 53.909 1.595 53.89 1.705 c
+53.88 1.822 53.865 1.918 53.847 1.999 c
+53.824 2.087 53.807 2.161 53.788 2.219 c
+54.67 2.219 l
+54.677 2.168 54.688 2.117 54.699 2.057 c
+54.717 1.999 54.732 1.933 54.743 1.866 c
+54.761 1.808 54.776 1.741 54.788 1.675 c
+54.794 1.606 54.806 1.543 54.817 1.484 c
+54.831 1.484 l
+54.869 1.602 54.919 1.708 54.979 1.808 c
+55.045 1.903 55.125 1.988 55.214 2.057 c
+55.301 2.124 55.405 2.179 55.522 2.219 c
+55.648 2.256 55.794 2.278 55.964 2.278 c
+56.088 2.278 56.205 2.271 56.316 2.263 c
+56.434 2.252 56.537 2.238 56.625 2.219 c
+h
+60.876 0.484 m
+60.876 0.209 60.839 -0.04 60.774 -0.264 c
+60.704 -0.482 60.601 -0.669 60.465 -0.823 c
+60.325 -0.981 60.149 -1.103 59.935 -1.191 c
+59.719 -1.279 59.465 -1.323 59.172 -1.323 c
+58.896 -1.323 58.649 -1.279 58.436 -1.191 c
+58.231 -1.103 58.058 -0.981 57.922 -0.823 c
+57.782 -0.669 57.68 -0.482 57.613 -0.264 c
+57.543 -0.04 57.51 0.209 57.51 0.484 c
+57.51 0.738 57.539 0.974 57.599 1.19 c
+57.665 1.415 57.768 1.606 57.907 1.764 c
+58.043 1.929 58.22 2.057 58.436 2.146 c
+58.649 2.234 58.906 2.278 59.201 2.278 c
+59.513 2.278 59.774 2.234 59.98 2.146 c
+60.193 2.057 60.365 1.929 60.494 1.764 c
+60.63 1.606 60.729 1.415 60.788 1.19 c
+60.847 0.974 60.876 0.738 60.876 0.484 c
+59.921 0.484 m
+59.921 0.69 59.906 0.867 59.877 1.014 c
+59.855 1.161 59.818 1.282 59.76 1.382 c
+59.7 1.477 59.627 1.547 59.538 1.587 c
+59.451 1.635 59.34 1.66 59.216 1.66 c
+58.95 1.66 58.76 1.562 58.642 1.367 c
+58.524 1.18 58.466 0.885 58.466 0.484 c
+58.466 0.062 58.524 -0.243 58.642 -0.426 c
+58.76 -0.614 58.936 -0.706 59.172 -0.706 c
+59.297 -0.706 59.411 -0.688 59.509 -0.647 c
+59.605 -0.599 59.686 -0.526 59.744 -0.426 c
+59.81 -0.331 59.855 -0.206 59.877 -0.059 c
+59.906 0.088 59.921 0.268 59.921 0.484 c
+64.055 -1.309 m
+64.055 -1.544 64.011 -1.742 63.922 -1.911 c
+63.842 -2.076 63.735 -2.213 63.6 -2.323 c
+63.459 -2.429 63.305 -2.506 63.129 -2.558 c
+62.952 -2.606 62.769 -2.631 62.586 -2.631 c
+62.497 -2.631 62.409 -2.624 62.32 -2.616 c
+62.233 -2.606 62.144 -2.595 62.056 -2.587 c
+61.975 -2.576 61.902 -2.562 61.836 -2.543 c
+61.766 -2.532 61.707 -2.517 61.659 -2.499 c
+61.659 -1.823 l
+61.747 -1.841 61.865 -1.86 62.012 -1.881 c
+62.159 -1.911 62.32 -1.926 62.497 -1.926 c
+62.592 -1.926 62.681 -1.914 62.761 -1.897 c
+62.839 -1.874 62.908 -1.841 62.967 -1.793 c
+63.026 -1.742 63.07 -1.669 63.1 -1.573 c
+63.129 -1.484 63.143 -1.371 63.143 -1.235 c
+63.143 1.602 l
+62.012 1.602 l
+62.012 2.219 l
+64.055 2.219 l
+h
+63.158 3.513 0.897 -0.676 re
+63.158 2.836 m
+67.351 -1.323 m
+67.094 -1.323 66.866 -1.286 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.728 65.867 -0.536 65.778 -0.309 c
+65.697 -0.085 65.661 0.18 65.661 0.484 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.741 66.175 1.881 c
+66.341 2.017 66.528 2.117 66.734 2.175 c
+66.94 2.242 67.149 2.278 67.366 2.278 c
+67.638 2.278 67.873 2.227 68.072 2.131 c
+68.277 2.043 68.443 1.911 68.571 1.735 c
+68.707 1.565 68.807 1.359 68.865 1.117 c
+68.932 0.881 68.968 0.617 68.968 0.324 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.162 66.617 0.022 66.646 -0.103 c
+66.682 -0.231 66.738 -0.345 66.808 -0.441 c
+66.873 -0.53 66.958 -0.599 67.058 -0.647 c
+67.153 -0.698 67.267 -0.721 67.396 -0.721 c
+67.55 -0.721 67.689 -0.688 67.807 -0.617 c
+67.932 -0.551 68.02 -0.449 68.072 -0.309 c
+68.909 -0.382 l
+68.88 -0.482 68.824 -0.588 68.747 -0.706 c
+68.666 -0.816 68.564 -0.919 68.439 -1.014 c
+68.321 -1.103 68.167 -1.176 67.983 -1.235 c
+67.807 -1.294 67.594 -1.323 67.351 -1.323 c
+67.351 1.705 m
+67.263 1.705 67.175 1.691 67.087 1.66 c
+66.999 1.631 66.918 1.58 66.852 1.514 c
+66.782 1.444 66.723 1.356 66.675 1.249 c
+66.634 1.139 66.617 1.014 66.617 0.867 c
+68.086 0.867 l
+68.086 1.003 68.061 1.124 68.013 1.234 c
+67.972 1.341 67.918 1.429 67.851 1.5 c
+67.792 1.565 67.719 1.617 67.631 1.646 c
+67.542 1.683 67.447 1.705 67.351 1.705 c
+71.412 -1.323 m
+71.126 -1.323 70.883 -1.282 70.677 -1.205 c
+70.471 -1.118 70.299 -0.996 70.162 -0.838 c
+70.023 -0.684 69.92 -0.497 69.854 -0.279 c
+69.784 -0.056 69.751 0.191 69.751 0.455 c
+69.751 0.75 69.784 1.007 69.854 1.234 c
+69.931 1.459 70.037 1.646 70.177 1.793 c
+70.324 1.947 70.501 2.065 70.706 2.146 c
+70.912 2.234 71.147 2.278 71.412 2.278 c
+71.636 2.278 71.839 2.248 72.015 2.19 c
+72.191 2.131 72.342 2.047 72.47 1.94 c
+72.595 1.841 72.698 1.72 72.779 1.573 c
+72.856 1.433 72.911 1.282 72.94 1.117 c
+72.03 1.072 l
+71.999 1.249 71.93 1.389 71.824 1.5 c
+71.724 1.606 71.581 1.66 71.397 1.66 c
+71.151 1.66 70.975 1.558 70.868 1.352 c
+70.758 1.153 70.706 0.867 70.706 0.484 c
+70.706 -0.309 70.941 -0.706 71.412 -0.706 c
+71.577 -0.706 71.721 -0.654 71.839 -0.544 c
+71.956 -0.437 72.03 -0.276 72.059 -0.059 c
+72.97 -0.103 l
+72.94 -0.272 72.886 -0.426 72.809 -0.574 c
+72.739 -0.721 72.635 -0.852 72.5 -0.97 c
+72.371 -1.081 72.213 -1.168 72.03 -1.235 c
+71.853 -1.294 71.647 -1.323 71.412 -1.323 c
+74.521 1.602 m
+73.977 1.602 l
+73.977 2.219 l
+74.565 2.219 l
+74.844 3.116 l
+75.417 3.116 l
+75.417 2.219 l
+76.652 2.219 l
+76.652 1.602 l
+75.417 1.602 l
+75.417 -0.103 l
+75.417 -0.324 l
+75.425 -0.393 75.446 -0.456 75.476 -0.515 c
+75.513 -0.566 75.568 -0.611 75.638 -0.647 c
+75.715 -0.676 75.829 -0.691 75.976 -0.691 c
+76.112 -0.691 76.248 -0.688 76.387 -0.676 c
+76.523 -0.658 76.656 -0.632 76.784 -0.603 c
+76.784 -1.205 l
+76.703 -1.216 76.626 -1.231 76.549 -1.249 c
+76.468 -1.261 76.391 -1.268 76.314 -1.279 c
+76.233 -1.286 76.145 -1.294 76.049 -1.294 c
+75.961 -1.301 75.862 -1.309 75.756 -1.309 c
+75.568 -1.309 75.407 -1.294 75.27 -1.264 c
+75.142 -1.228 75.028 -1.183 74.933 -1.132 c
+74.844 -1.085 74.771 -1.025 74.712 -0.956 c
+74.653 -0.879 74.609 -0.802 74.58 -0.721 c
+74.55 -0.632 74.528 -0.544 74.521 -0.456 c
+74.509 -0.36 74.506 -0.264 74.506 -0.177 c
+h
+82.921 2.219 m
+82.921 0.264 l
+82.921 0.125 82.929 0 82.951 -0.118 c
+82.969 -0.228 83.002 -0.32 83.053 -0.397 c
+83.101 -0.478 83.16 -0.54 83.23 -0.588 c
+83.296 -0.628 83.381 -0.647 83.48 -0.647 c
+83.568 -0.647 83.649 -0.628 83.73 -0.588 c
+83.818 -0.54 83.891 -0.47 83.951 -0.382 c
+84.009 -0.287 84.053 -0.177 84.082 -0.059 c
+84.119 0.066 84.142 0.206 84.142 0.353 c
+84.142 2.219 l
+85.038 2.219 l
+85.038 -0.485 l
+85.038 -0.721 l
+85.046 -0.802 85.052 -0.879 85.052 -0.956 c
+85.052 -1.147 l
+85.06 -1.199 85.067 -1.235 85.067 -1.264 c
+84.215 -1.264 l
+84.204 -1.235 84.192 -1.199 84.186 -1.147 c
+84.186 -0.956 l
+84.186 -0.889 84.178 -0.819 84.171 -0.75 c
+84.171 -0.574 l
+84.156 -0.574 l
+84.038 -0.838 83.884 -1.029 83.7 -1.147 c
+83.524 -1.264 83.322 -1.323 83.097 -1.323 c
+82.892 -1.323 82.719 -1.286 82.583 -1.22 c
+82.444 -1.154 82.334 -1.058 82.245 -0.941 c
+82.164 -0.823 82.106 -0.688 82.069 -0.53 c
+82.039 -0.364 82.025 -0.187 82.025 0 c
+82.025 2.219 l
+h
+89.113 1.469 m
+89.014 1.477 88.911 1.488 88.805 1.5 c
+88.695 1.517 88.573 1.529 88.437 1.529 c
+88.261 1.529 88.103 1.488 87.967 1.411 c
+87.827 1.341 87.71 1.242 87.614 1.117 c
+87.525 0.989 87.456 0.841 87.408 0.676 c
+87.367 0.507 87.35 0.33 87.35 0.147 c
+87.35 -1.264 l
+86.453 -1.264 l
+86.453 0.985 l
+86.453 1.11 86.442 1.234 86.423 1.352 c
+86.413 1.477 86.398 1.595 86.38 1.705 c
+86.368 1.822 86.353 1.918 86.335 1.999 c
+86.313 2.087 86.295 2.161 86.276 2.219 c
+87.159 2.219 l
+87.166 2.168 87.176 2.117 87.188 2.057 c
+87.206 1.999 87.221 1.933 87.232 1.866 c
+87.25 1.808 87.265 1.741 87.276 1.675 c
+87.284 1.606 87.294 1.543 87.305 1.484 c
+87.32 1.484 l
+87.357 1.602 87.408 1.708 87.467 1.808 c
+87.533 1.903 87.614 1.988 87.702 2.057 c
+87.791 2.124 87.893 2.179 88.011 2.219 c
+88.136 2.256 88.283 2.278 88.452 2.278 c
+88.577 2.278 88.695 2.271 88.805 2.263 c
+88.922 2.252 89.025 2.238 89.113 2.219 c
+h
+92.263 -0.647 m
+93.395 -0.647 l
+93.395 -1.264 l
+90.087 -1.264 l
+90.087 -0.647 l
+91.351 -0.647 l
+91.351 2.896 l
+90.425 2.896 l
+90.425 3.513 l
+92.263 3.513 l
+h
+94.592 -2.631 m
+94.592 -2.014 l
+95.666 -2.014 l
+95.666 2.896 l
+94.592 2.896 l
+94.592 3.513 l
+96.518 3.513 l
+96.518 -2.631 l
+h
+f
+Q
+q 1 0 0 1 65.7934 208.1152 cm
+0 0 m
+0 5.35 l
+1.278 5.35 l
+1.904 5.35 2.389 5.152 2.734 4.762 c
+3.076 4.369 3.248 3.821 3.248 3.116 c
+3.248 2.219 l
+3.248 1.514 3.072 0.962 2.72 0.573 c
+2.374 0.191 1.87 0 1.205 0 c
+h
+0.676 4.777 m
+0.676 0.573 l
+1.22 0.573 l
+1.691 0.573 2.032 0.709 2.249 0.985 c
+2.473 1.257 2.587 1.661 2.587 2.19 c
+2.587 3.131 l
+2.587 3.697 2.477 4.116 2.263 4.38 c
+2.047 4.644 1.72 4.777 1.278 4.777 c
+h
+4.072 2.175 m
+4.072 2.753 4.208 3.208 4.484 3.543 c
+4.767 3.884 5.137 4.056 5.6 4.056 c
+6.059 4.056 6.427 3.888 6.703 3.557 c
+6.986 3.233 7.133 2.786 7.144 2.219 c
+7.144 1.793 l
+7.144 1.224 7 0.768 6.718 0.426 c
+6.442 0.092 6.074 -0.073 5.615 -0.073 c
+5.152 -0.073 4.781 0.088 4.498 0.411 c
+4.222 0.742 4.079 1.183 4.072 1.735 c
+h
+4.719 1.793 m
+4.719 1.389 4.796 1.073 4.954 0.838 c
+5.119 0.603 5.34 0.485 5.615 0.485 c
+6.181 0.485 6.475 0.897 6.497 1.72 c
+6.497 2.175 l
+6.497 2.576 6.413 2.896 6.247 3.131 c
+6.089 3.373 5.872 3.499 5.6 3.499 c
+5.336 3.499 5.119 3.373 4.954 3.131 c
+4.796 2.896 4.719 2.576 4.719 2.175 c
+h
+10.951 1.147 m
+11.553 3.983 l
+12.2 3.983 l
+11.215 0 l
+10.701 0 l
+9.922 2.851 l
+9.172 0 l
+8.644 0 l
+7.688 3.983 l
+8.32 3.983 l
+8.937 1.22 l
+9.672 3.983 l
+10.186 3.983 l
+h
+13.494 3.983 m
+13.508 3.543 l
+13.762 3.884 14.086 4.056 14.479 4.056 c
+15.184 4.056 15.541 3.586 15.551 2.645 c
+15.551 0 l
+14.905 0 l
+14.905 2.616 l
+14.905 2.929 14.85 3.15 14.743 3.278 c
+14.633 3.403 14.479 3.469 14.273 3.469 c
+14.115 3.469 13.968 3.414 13.832 3.308 c
+13.704 3.197 13.6 3.061 13.523 2.896 c
+13.523 0 l
+12.877 0 l
+12.877 3.983 l
+h
+17.228 0 -0.647 5.644 re
+18.109 2.175 m
+18.109 2.753 18.246 3.208 18.521 3.543 c
+18.803 3.884 19.175 4.056 19.638 4.056 c
+20.097 4.056 20.465 3.888 20.74 3.557 c
+21.024 3.233 21.17 2.786 21.182 2.219 c
+21.182 1.793 l
+21.182 1.224 21.038 0.768 20.756 0.426 c
+20.48 0.092 20.112 -0.073 19.653 -0.073 c
+19.19 -0.073 18.819 0.088 18.535 0.411 c
+18.26 0.742 18.117 1.183 18.109 1.735 c
+h
+18.756 1.793 m
+18.756 1.389 18.834 1.073 18.992 0.838 c
+19.156 0.603 19.377 0.485 19.653 0.485 c
+20.218 0.485 20.513 0.897 20.534 1.72 c
+20.534 2.175 l
+20.534 2.576 20.45 2.896 20.285 3.131 c
+20.127 3.373 19.91 3.499 19.638 3.499 c
+19.374 3.499 19.156 3.373 18.992 3.131 c
+18.834 2.896 18.756 2.576 18.756 2.175 c
+h
+24.062 0 m
+24.022 0.088 23.996 0.235 23.989 0.441 c
+23.754 0.096 23.46 -0.073 23.107 -0.073 c
+22.743 -0.073 22.46 0.022 22.254 0.22 c
+22.056 0.426 21.961 0.713 21.961 1.088 c
+21.961 1.488 22.096 1.808 22.372 2.043 c
+22.644 2.286 23.019 2.41 23.489 2.41 c
+23.974 2.41 l
+23.974 2.837 l
+23.974 3.072 23.919 3.237 23.813 3.337 c
+23.702 3.443 23.541 3.499 23.328 3.499 c
+23.129 3.499 22.967 3.439 22.842 3.322 c
+22.725 3.204 22.666 3.057 22.666 2.881 c
+22.019 2.881 l
+22.019 3.075 22.078 3.267 22.196 3.454 c
+22.321 3.638 22.483 3.785 22.68 3.896 c
+22.886 4.002 23.114 4.056 23.372 4.056 c
+23.772 4.056 24.077 3.954 24.283 3.748 c
+24.496 3.543 24.61 3.248 24.621 2.866 c
+24.621 0.852 l
+24.621 0.548 24.658 0.283 24.739 0.058 c
+24.739 0 l
+h
+23.195 0.515 m
+23.36 0.515 23.511 0.559 23.651 0.646 c
+23.798 0.735 23.904 0.845 23.974 0.985 c
+23.974 1.926 l
+23.607 1.926 l
+23.291 1.926 23.048 1.856 22.872 1.72 c
+22.695 1.591 22.607 1.404 22.607 1.161 c
+22.607 0.933 22.651 0.768 22.74 0.661 c
+22.828 0.563 22.979 0.515 23.195 0.515 c
+25.488 2.175 m
+25.488 2.782 25.598 3.248 25.826 3.572 c
+26.061 3.896 26.389 4.056 26.811 4.056 c
+27.193 4.056 27.491 3.898 27.708 3.586 c
+27.708 5.644 l
+28.355 5.644 l
+28.355 0 l
+27.767 0 l
+27.723 0.426 l
+27.517 0.092 27.212 -0.073 26.811 -0.073 c
+26.4 -0.073 26.076 0.081 25.841 0.397 c
+25.606 0.721 25.488 1.176 25.488 1.764 c
+h
+26.135 1.793 m
+26.135 1.352 26.198 1.022 26.326 0.808 c
+26.462 0.603 26.682 0.5 26.988 0.5 c
+27.311 0.5 27.55 0.661 27.708 0.985 c
+27.708 2.998 l
+27.539 3.31 27.3 3.469 26.988 3.469 c
+26.682 3.469 26.462 3.366 26.326 3.16 c
+26.198 2.955 26.135 2.631 26.135 2.19 c
+h
+31.295 1.014 m
+31.295 1.161 31.239 1.282 31.133 1.382 c
+31.023 1.477 30.817 1.595 30.516 1.735 c
+30.17 1.881 29.928 2.003 29.78 2.102 c
+29.633 2.209 29.523 2.326 29.457 2.454 c
+29.387 2.58 29.354 2.738 29.354 2.925 c
+29.354 3.248 29.471 3.516 29.707 3.734 c
+29.942 3.946 30.244 4.056 30.618 4.056 c
+31 4.056 31.309 3.943 31.544 3.719 c
+31.779 3.491 31.897 3.204 31.897 2.851 c
+31.25 2.851 l
+31.25 3.028 31.191 3.179 31.074 3.308 c
+30.956 3.432 30.802 3.499 30.618 3.499 c
+30.42 3.499 30.269 3.443 30.163 3.337 c
+30.052 3.237 30.001 3.105 30.001 2.94 c
+30.001 2.811 30.038 2.705 30.119 2.616 c
+30.196 2.535 30.387 2.433 30.692 2.308 c
+31.17 2.12 31.5 1.933 31.677 1.749 c
+31.852 1.573 31.941 1.345 31.941 1.073 c
+31.941 0.721 31.816 0.441 31.574 0.235 c
+31.339 0.029 31.023 -0.073 30.633 -0.073 c
+30.21 -0.073 29.872 0.044 29.618 0.279 c
+29.361 0.522 29.236 0.827 29.236 1.191 c
+29.884 1.191 l
+29.891 0.962 29.961 0.786 30.089 0.661 c
+30.214 0.544 30.398 0.485 30.633 0.485 c
+30.846 0.485 31.008 0.532 31.118 0.632 c
+31.235 0.727 31.295 0.856 31.295 1.014 c
+36.542 0 m
+36.502 0.088 36.476 0.235 36.469 0.441 c
+36.234 0.096 35.939 -0.073 35.586 -0.073 c
+35.222 -0.073 34.94 0.022 34.734 0.22 c
+34.535 0.426 34.44 0.713 34.44 1.088 c
+34.44 1.488 34.576 1.808 34.852 2.043 c
+35.123 2.286 35.498 2.41 35.968 2.41 c
+36.454 2.41 l
+36.454 2.837 l
+36.454 3.072 36.398 3.237 36.292 3.337 c
+36.182 3.443 36.02 3.499 35.807 3.499 c
+35.609 3.499 35.447 3.439 35.322 3.322 c
+35.204 3.204 35.145 3.057 35.145 2.881 c
+34.499 2.881 l
+34.499 3.075 34.557 3.267 34.675 3.454 c
+34.8 3.638 34.962 3.785 35.16 3.896 c
+35.366 4.002 35.594 4.056 35.851 4.056 c
+36.251 4.056 36.556 3.954 36.762 3.748 c
+36.976 3.543 37.09 3.248 37.101 2.866 c
+37.101 0.852 l
+37.101 0.548 37.138 0.283 37.218 0.058 c
+37.218 0 l
+h
+35.675 0.515 m
+35.84 0.515 35.991 0.559 36.13 0.646 c
+36.278 0.735 36.384 0.845 36.454 0.985 c
+36.454 1.926 l
+36.086 1.926 l
+35.771 1.926 35.528 1.856 35.351 1.72 c
+35.175 1.591 35.087 1.404 35.087 1.161 c
+35.087 0.933 35.131 0.768 35.219 0.661 c
+35.307 0.563 35.457 0.515 35.675 0.515 c
+42.701 1.793 m
+42.701 1.165 42.584 0.694 42.348 0.382 c
+42.121 0.077 41.805 -0.073 41.393 -0.073 c
+40.988 -0.073 40.679 0.077 40.467 0.382 c
+40.467 -1.529 l
+39.82 -1.529 l
+39.82 3.983 l
+40.408 3.983 l
+40.452 3.543 l
+40.665 3.884 40.974 4.056 41.377 4.056 c
+41.819 4.056 42.146 3.902 42.362 3.601 c
+42.576 3.296 42.69 2.84 42.701 2.234 c
+h
+42.054 2.175 m
+42.054 2.616 41.984 2.94 41.848 3.146 c
+41.709 3.358 41.488 3.469 41.187 3.469 c
+40.87 3.469 40.631 3.314 40.467 3.013 c
+40.467 0.941 l
+40.631 0.636 40.87 0.485 41.187 0.485 c
+41.481 0.485 41.694 0.588 41.834 0.794 c
+41.969 1.007 42.043 1.338 42.054 1.779 c
+h
+45.185 3.366 m
+45.097 3.385 44.997 3.395 44.891 3.395 c
+44.556 3.395 44.321 3.212 44.186 2.851 c
+44.186 0 l
+43.538 0 l
+43.538 3.983 l
+44.171 3.983 l
+44.186 3.572 l
+44.362 3.896 44.604 4.056 44.92 4.056 c
+45.027 4.056 45.115 4.035 45.185 3.998 c
+h
+45.626 2.175 m
+45.626 2.753 45.762 3.208 46.038 3.543 c
+46.32 3.884 46.692 4.056 47.155 4.056 c
+47.614 4.056 47.981 3.888 48.257 3.557 c
+48.54 3.233 48.687 2.786 48.698 2.219 c
+48.698 1.793 l
+48.698 1.224 48.554 0.768 48.272 0.426 c
+47.997 0.092 47.629 -0.073 47.17 -0.073 c
+46.707 -0.073 46.335 0.088 46.052 0.411 c
+45.776 0.742 45.633 1.183 45.626 1.735 c
+h
+46.273 1.793 m
+46.273 1.389 46.35 1.073 46.508 0.838 c
+46.673 0.603 46.894 0.485 47.17 0.485 c
+47.735 0.485 48.029 0.897 48.051 1.72 c
+48.051 2.175 l
+48.051 2.576 47.966 2.896 47.802 3.131 c
+47.644 3.373 47.426 3.499 47.155 3.499 c
+46.89 3.499 46.673 3.373 46.508 3.131 c
+46.35 2.896 46.273 2.576 46.273 2.175 c
+h
+50.197 3.983 m
+50.197 -0.5 l
+50.197 -1.235 49.907 -1.602 49.33 -1.602 c
+49.19 -1.602 49.069 -1.58 48.963 -1.544 c
+48.963 -1 l
+49.032 -1.018 49.117 -1.029 49.227 -1.029 c
+49.333 -1.029 49.411 -0.985 49.462 -0.897 c
+49.521 -0.816 49.551 -0.676 49.551 -0.47 c
+49.551 3.983 l
+h
+50.227 5.027 m
+50.227 4.917 50.197 4.825 50.139 4.748 c
+50.079 4.678 49.984 4.644 49.859 4.644 c
+49.742 4.644 49.647 4.678 49.58 4.748 c
+49.521 4.825 49.491 4.917 49.491 5.027 c
+49.491 5.145 49.521 5.236 49.58 5.307 c
+49.647 5.384 49.742 5.424 49.859 5.424 c
+49.984 5.424 50.079 5.384 50.139 5.307 c
+50.197 5.226 50.227 5.134 50.227 5.027 c
+52.652 -0.073 m
+52.153 -0.073 51.77 0.073 51.505 0.368 c
+51.241 0.661 51.108 1.095 51.108 1.675 c
+51.108 2.146 l
+51.108 2.741 51.234 3.208 51.49 3.543 c
+51.756 3.884 52.116 4.056 52.579 4.056 c
+53.038 4.056 53.379 3.902 53.607 3.601 c
+53.842 3.308 53.964 2.844 53.975 2.219 c
+53.975 1.793 l
+51.756 1.793 l
+51.756 1.705 l
+51.756 1.272 51.833 0.959 51.991 0.764 c
+52.156 0.577 52.388 0.485 52.681 0.485 c
+52.876 0.485 53.049 0.518 53.196 0.588 c
+53.343 0.665 53.479 0.783 53.607 0.941 c
+53.946 0.529 l
+53.659 0.125 53.229 -0.073 52.652 -0.073 c
+52.579 3.499 m
+52.303 3.499 52.101 3.403 51.976 3.219 c
+51.847 3.032 51.774 2.741 51.756 2.352 c
+53.329 2.352 l
+53.329 2.44 l
+53.306 2.822 53.24 3.09 53.123 3.248 c
+53.005 3.414 52.822 3.499 52.579 3.499 c
+56.136 0.485 m
+56.349 0.485 56.521 0.548 56.65 0.676 c
+56.786 0.812 56.859 1.003 56.871 1.249 c
+57.488 1.249 l
+57.466 0.867 57.33 0.548 57.077 0.294 c
+56.82 0.048 56.507 -0.073 56.136 -0.073 c
+55.644 -0.073 55.268 0.077 55.004 0.382 c
+54.746 0.694 54.622 1.161 54.622 1.779 c
+54.622 2.219 l
+54.622 2.815 54.746 3.271 55.004 3.586 c
+55.268 3.898 55.644 4.056 56.136 4.056 c
+56.537 4.056 56.856 3.925 57.092 3.66 c
+57.333 3.403 57.466 3.057 57.488 2.616 c
+56.871 2.616 l
+56.849 2.911 56.775 3.131 56.65 3.278 c
+56.533 3.425 56.36 3.499 56.136 3.499 c
+55.841 3.499 55.625 3.399 55.489 3.204 c
+55.349 3.017 55.276 2.708 55.268 2.278 c
+55.268 1.764 l
+55.268 1.294 55.334 0.959 55.474 0.764 c
+55.621 0.577 55.841 0.485 56.136 0.485 c
+59.091 4.939 m
+59.091 3.983 l
+59.693 3.983 l
+59.693 3.454 l
+59.091 3.454 l
+59.091 0.985 l
+59.091 0.827 59.112 0.709 59.164 0.632 c
+59.222 0.551 59.311 0.515 59.428 0.515 c
+59.517 0.515 59.604 0.529 59.693 0.559 c
+59.693 0 l
+59.546 -0.048 59.392 -0.073 59.237 -0.073 c
+58.98 -0.073 58.785 0.018 58.649 0.206 c
+58.509 0.389 58.443 0.65 58.443 0.985 c
+58.443 3.454 l
+57.84 3.454 l
+57.84 3.983 l
+58.443 3.983 l
+58.443 4.939 l
+h
+65.146 1.147 m
+65.749 3.983 l
+66.396 3.983 l
+65.411 0 l
+64.896 0 l
+64.117 2.851 l
+63.367 0 l
+62.839 0 l
+61.883 3.983 l
+62.515 3.983 l
+63.132 1.22 l
+63.868 3.983 l
+64.382 3.983 l
+h
+67.777 0 -0.647 3.983 re
+67.822 5.027 m
+67.822 4.917 67.792 4.825 67.733 4.748 c
+67.675 4.678 67.579 4.644 67.454 4.644 c
+67.336 4.644 67.241 4.678 67.174 4.748 c
+67.116 4.825 67.087 4.917 67.087 5.027 c
+67.087 5.145 67.116 5.236 67.174 5.307 c
+67.241 5.384 67.336 5.424 67.454 5.424 c
+67.579 5.424 67.675 5.384 67.733 5.307 c
+67.792 5.226 67.822 5.134 67.822 5.027 c
+69.644 4.939 m
+69.644 3.983 l
+70.247 3.983 l
+70.247 3.454 l
+69.644 3.454 l
+69.644 0.985 l
+69.644 0.827 69.666 0.709 69.717 0.632 c
+69.777 0.551 69.865 0.515 69.983 0.515 c
+70.07 0.515 70.158 0.529 70.247 0.559 c
+70.247 0 l
+70.1 -0.048 69.946 -0.073 69.792 -0.073 c
+69.534 -0.073 69.339 0.018 69.204 0.206 c
+69.063 0.389 68.998 0.65 68.998 0.985 c
+68.998 3.454 l
+68.395 3.454 l
+68.395 3.983 l
+68.998 3.983 l
+68.998 4.939 l
+h
+71.658 3.572 m
+71.911 3.896 72.231 4.056 72.614 4.056 c
+73.319 4.056 73.676 3.586 73.686 2.645 c
+73.686 0 l
+73.04 0 l
+73.04 2.616 l
+73.04 2.929 72.984 3.15 72.878 3.278 c
+72.768 3.403 72.614 3.469 72.408 3.469 c
+72.25 3.469 72.103 3.414 71.967 3.308 c
+71.838 3.197 71.735 3.061 71.658 2.896 c
+71.658 0 l
+71.011 0 l
+71.011 5.644 l
+71.658 5.644 l
+h
+77.788 -0.073 m
+77.287 -0.073 76.905 0.073 76.641 0.368 c
+76.377 0.661 76.244 1.095 76.244 1.675 c
+76.244 2.146 l
+76.244 2.741 76.369 3.208 76.626 3.543 c
+76.89 3.884 77.251 4.056 77.714 4.056 c
+78.174 4.056 78.515 3.902 78.743 3.601 c
+78.978 3.308 79.099 2.844 79.111 2.219 c
+79.111 1.793 l
+76.89 1.793 l
+76.89 1.705 l
+76.89 1.272 76.968 0.959 77.126 0.764 c
+77.291 0.577 77.523 0.485 77.817 0.485 c
+78.012 0.485 78.184 0.518 78.332 0.588 c
+78.478 0.665 78.615 0.783 78.743 0.941 c
+79.081 0.529 l
+78.794 0.125 78.365 -0.073 77.788 -0.073 c
+77.714 3.499 m
+77.439 3.499 77.237 3.403 77.111 3.219 c
+76.983 3.032 76.909 2.741 76.89 2.352 c
+78.463 2.352 l
+78.463 2.44 l
+78.442 2.822 78.376 3.09 78.258 3.248 c
+78.141 3.414 77.956 3.499 77.714 3.499 c
+80.507 3.983 m
+80.522 3.543 l
+80.775 3.884 81.098 4.056 81.492 4.056 c
+82.197 4.056 82.554 3.586 82.565 2.645 c
+82.565 0 l
+81.918 0 l
+81.918 2.616 l
+81.918 2.929 81.863 3.15 81.756 3.278 c
+81.646 3.403 81.492 3.469 81.286 3.469 c
+81.127 3.469 80.981 3.414 80.845 3.308 c
+80.716 3.197 80.613 3.061 80.536 2.896 c
+80.536 0 l
+79.889 0 l
+79.889 3.983 l
+h
+84.387 4.939 m
+84.387 3.983 l
+84.99 3.983 l
+84.99 3.454 l
+84.387 3.454 l
+84.387 0.985 l
+84.387 0.827 84.41 0.709 84.461 0.632 c
+84.52 0.551 84.608 0.515 84.726 0.515 c
+84.813 0.515 84.902 0.529 84.99 0.559 c
+84.99 0 l
+84.843 -0.048 84.689 -0.073 84.534 -0.073 c
+84.277 -0.073 84.082 0.018 83.946 0.206 c
+83.807 0.389 83.741 0.65 83.741 0.985 c
+83.741 3.454 l
+83.138 3.454 l
+83.138 3.983 l
+83.741 3.983 l
+83.741 4.939 l
+h
+86.46 0 -0.646 3.983 re
+86.504 5.027 m
+86.504 4.917 86.475 4.825 86.415 4.748 c
+86.357 4.678 86.261 4.644 86.137 4.644 c
+86.019 4.644 85.923 4.678 85.858 4.748 c
+85.798 4.825 85.769 4.917 85.769 5.027 c
+85.769 5.145 85.798 5.236 85.858 5.307 c
+85.923 5.384 86.019 5.424 86.137 5.424 c
+86.261 5.424 86.357 5.384 86.415 5.307 c
+86.475 5.226 86.504 5.134 86.504 5.027 c
+89.12 3.366 m
+89.033 3.385 88.933 3.395 88.826 3.395 c
+88.493 3.395 88.257 3.212 88.121 2.851 c
+88.121 0 l
+87.474 0 l
+87.474 3.983 l
+88.106 3.983 l
+88.121 3.572 l
+88.297 3.896 88.54 4.056 88.856 4.056 c
+88.963 4.056 89.05 4.035 89.12 3.998 c
+h
+91.119 -0.073 m
+90.62 -0.073 90.238 0.073 89.973 0.368 c
+89.708 0.661 89.576 1.095 89.576 1.675 c
+89.576 2.146 l
+89.576 2.741 89.701 3.208 89.958 3.543 c
+90.223 3.884 90.583 4.056 91.046 4.056 c
+91.506 4.056 91.847 3.902 92.075 3.601 c
+92.31 3.308 92.431 2.844 92.443 2.219 c
+92.443 1.793 l
+90.223 1.793 l
+90.223 1.705 l
+90.223 1.272 90.3 0.959 90.458 0.764 c
+90.623 0.577 90.855 0.485 91.149 0.485 c
+91.344 0.485 91.516 0.518 91.664 0.588 c
+91.811 0.665 91.946 0.783 92.075 0.941 c
+92.413 0.529 l
+92.127 0.125 91.697 -0.073 91.119 -0.073 c
+91.046 3.499 m
+90.77 3.499 90.569 3.403 90.444 3.219 c
+90.315 3.032 90.241 2.741 90.223 2.352 c
+91.795 2.352 l
+91.795 2.44 l
+91.774 2.822 91.707 3.09 91.589 3.248 c
+91.472 3.414 91.288 3.499 91.046 3.499 c
+95.588 3.572 m
+95.842 3.896 96.161 4.056 96.543 4.056 c
+97.249 4.056 97.605 3.586 97.617 2.645 c
+97.617 0 l
+96.97 0 l
+96.97 2.616 l
+96.97 2.929 96.915 3.15 96.808 3.278 c
+96.698 3.403 96.543 3.469 96.337 3.469 c
+96.179 3.469 96.033 3.414 95.897 3.308 c
+95.768 3.197 95.665 3.061 95.588 2.896 c
+95.588 0 l
+94.941 0 l
+94.941 5.644 l
+95.588 5.644 l
+h
+99.277 0 -0.646 3.983 re
+99.321 5.027 m
+99.321 4.917 99.292 4.825 99.233 4.748 c
+99.175 4.678 99.079 4.644 98.954 4.644 c
+98.837 4.644 98.741 4.678 98.675 4.748 c
+98.616 4.825 98.587 4.917 98.587 5.027 c
+98.587 5.145 98.616 5.236 98.675 5.307 c
+98.741 5.384 98.837 5.424 98.954 5.424 c
+99.079 5.424 99.175 5.384 99.233 5.307 c
+99.292 5.226 99.321 5.134 99.321 5.027 c
+102.232 1.014 m
+102.232 1.161 102.177 1.282 102.07 1.382 c
+101.96 1.477 101.754 1.595 101.453 1.735 c
+101.108 1.881 100.865 2.003 100.718 2.102 c
+100.571 2.209 100.461 2.326 100.395 2.454 c
+100.325 2.58 100.291 2.738 100.291 2.925 c
+100.291 3.248 100.409 3.516 100.644 3.734 c
+100.879 3.946 101.181 4.056 101.556 4.056 c
+101.938 4.056 102.247 3.943 102.482 3.719 c
+102.717 3.491 102.835 3.204 102.835 2.851 c
+102.188 2.851 l
+102.188 3.028 102.129 3.179 102.012 3.308 c
+101.894 3.432 101.74 3.499 101.556 3.499 c
+101.357 3.499 101.207 3.443 101.1 3.337 c
+100.99 3.237 100.939 3.105 100.939 2.94 c
+100.939 2.811 100.975 2.705 101.056 2.616 c
+101.133 2.535 101.324 2.433 101.629 2.308 c
+102.107 2.12 102.438 1.933 102.614 1.749 c
+102.791 1.573 102.878 1.345 102.878 1.073 c
+102.878 0.721 102.754 0.441 102.511 0.235 c
+102.276 0.029 101.96 -0.073 101.571 -0.073 c
+101.148 -0.073 100.81 0.044 100.557 0.279 c
+100.299 0.522 100.174 0.827 100.174 1.191 c
+100.821 1.191 l
+100.828 0.962 100.898 0.786 101.027 0.661 c
+101.152 0.544 101.335 0.485 101.571 0.485 c
+101.783 0.485 101.945 0.532 102.055 0.632 c
+102.173 0.727 102.232 0.856 102.232 1.014 c
+104.569 4.939 m
+104.569 3.983 l
+105.172 3.983 l
+105.172 3.454 l
+104.569 3.454 l
+104.569 0.985 l
+104.569 0.827 104.591 0.709 104.642 0.632 c
+104.701 0.551 104.79 0.515 104.907 0.515 c
+104.995 0.515 105.083 0.529 105.172 0.559 c
+105.172 0 l
+105.025 -0.048 104.871 -0.073 104.717 -0.073 c
+104.459 -0.073 104.264 0.018 104.129 0.206 c
+103.988 0.389 103.923 0.65 103.923 0.985 c
+103.923 3.454 l
+103.32 3.454 l
+103.32 3.983 l
+103.923 3.983 l
+103.923 4.939 l
+h
+105.731 2.175 m
+105.731 2.753 105.866 3.208 106.142 3.543 c
+106.425 3.884 106.796 4.056 107.259 4.056 c
+107.718 4.056 108.086 3.888 108.362 3.557 c
+108.644 3.233 108.792 2.786 108.802 2.219 c
+108.802 1.793 l
+108.802 1.224 108.659 0.768 108.376 0.426 c
+108.1 0.092 107.733 -0.073 107.273 -0.073 c
+106.811 -0.073 106.44 0.088 106.157 0.411 c
+105.881 0.742 105.738 1.183 105.731 1.735 c
+h
+106.377 1.793 m
+106.377 1.389 106.454 1.073 106.612 0.838 c
+106.778 0.603 106.998 0.485 107.273 0.485 c
+107.84 0.485 108.133 0.897 108.156 1.72 c
+108.156 2.175 l
+108.156 2.576 108.071 2.896 107.906 3.131 c
+107.748 3.373 107.531 3.499 107.259 3.499 c
+106.994 3.499 106.778 3.373 106.612 3.131 c
+106.454 2.896 106.377 2.576 106.377 2.175 c
+h
+111.287 3.366 m
+111.198 3.385 111.099 3.395 110.992 3.395 c
+110.658 3.395 110.423 3.212 110.287 2.851 c
+110.287 0 l
+109.64 0 l
+109.64 3.983 l
+110.273 3.983 l
+110.287 3.572 l
+110.463 3.896 110.706 4.056 111.022 4.056 c
+111.129 4.056 111.217 4.035 111.287 3.998 c
+h
+113.095 1.088 m
+113.814 3.983 l
+114.506 3.983 l
+113.212 -0.559 l
+113.113 -0.9 112.97 -1.161 112.786 -1.338 c
+112.609 -1.514 112.407 -1.602 112.183 -1.602 c
+112.095 -1.602 111.981 -1.58 111.845 -1.544 c
+111.845 -1 l
+111.992 -1.014 l
+112.176 -1.014 112.323 -0.97 112.433 -0.882 c
+112.54 -0.794 112.628 -0.636 112.698 -0.412 c
+112.815 0.029 l
+111.654 3.983 l
+112.36 3.983 l
+h
+117.151 0 m
+117.151 3.454 l
+116.623 3.454 l
+116.623 3.983 l
+117.151 3.983 l
+117.151 4.439 l
+117.151 4.839 117.247 5.152 117.446 5.38 c
+117.652 5.604 117.93 5.718 118.283 5.718 c
+118.419 5.718 118.552 5.696 118.68 5.66 c
+118.651 5.115 l
+118.552 5.134 118.452 5.145 118.357 5.145 c
+117.982 5.145 117.798 4.88 117.798 4.351 c
+117.798 3.983 l
+118.475 3.983 l
+118.475 3.454 l
+117.798 3.454 l
+117.798 0 l
+h
+120.885 3.366 m
+120.797 3.385 120.698 3.395 120.592 3.395 c
+120.257 3.395 120.021 3.212 119.886 2.851 c
+119.886 0 l
+119.239 0 l
+119.239 3.983 l
+119.871 3.983 l
+119.886 3.572 l
+120.062 3.896 120.305 4.056 120.621 4.056 c
+120.727 4.056 120.815 4.035 120.885 3.998 c
+h
+121.326 2.175 m
+121.326 2.753 121.462 3.208 121.737 3.543 c
+122.02 3.884 122.392 4.056 122.855 4.056 c
+123.314 4.056 123.682 3.888 123.957 3.557 c
+124.241 3.233 124.387 2.786 124.398 2.219 c
+124.398 1.793 l
+124.398 1.224 124.255 0.768 123.972 0.426 c
+123.696 0.092 123.329 -0.073 122.869 -0.073 c
+122.406 -0.073 122.036 0.088 121.752 0.411 c
+121.477 0.742 121.334 1.183 121.326 1.735 c
+h
+121.972 1.793 m
+121.972 1.389 122.05 1.073 122.208 0.838 c
+122.373 0.603 122.594 0.485 122.869 0.485 c
+123.435 0.485 123.73 0.897 123.751 1.72 c
+123.751 2.175 l
+123.751 2.576 123.667 2.896 123.501 3.131 c
+123.343 3.373 123.127 3.499 122.855 3.499 c
+122.591 3.499 122.373 3.373 122.208 3.131 c
+122.05 2.896 121.972 2.576 121.972 2.175 c
+h
+125.853 3.983 m
+125.868 3.616 l
+126.111 3.91 126.431 4.056 126.824 4.056 c
+127.264 4.056 127.573 3.859 127.75 3.469 c
+128.004 3.859 128.353 4.056 128.793 4.056 c
+129.529 4.056 129.903 3.594 129.925 2.675 c
+129.925 0 l
+129.278 0 l
+129.278 2.616 l
+129.278 2.911 129.223 3.123 129.116 3.263 c
+129.018 3.399 128.845 3.469 128.602 3.469 c
+128.403 3.469 128.242 3.389 128.117 3.233 c
+128 3.087 127.929 2.896 127.911 2.66 c
+127.911 0 l
+127.25 0 l
+127.25 2.645 l
+127.25 3.193 127.029 3.469 126.589 3.469 c
+126.254 3.469 126.019 3.308 125.883 2.984 c
+125.883 0 l
+125.236 0 l
+125.236 3.983 l
+h
+133.467 4.939 m
+133.467 3.983 l
+134.07 3.983 l
+134.07 3.454 l
+133.467 3.454 l
+133.467 0.985 l
+133.467 0.827 133.49 0.709 133.541 0.632 c
+133.6 0.551 133.688 0.515 133.805 0.515 c
+133.894 0.515 133.982 0.529 134.07 0.559 c
+134.07 0 l
+133.923 -0.048 133.768 -0.073 133.614 -0.073 c
+133.357 -0.073 133.163 0.018 133.026 0.206 c
+132.887 0.389 132.821 0.65 132.821 0.985 c
+132.821 3.454 l
+132.218 3.454 l
+132.218 3.983 l
+132.821 3.983 l
+132.821 4.939 l
+h
+135.482 3.572 m
+135.735 3.896 136.054 4.056 136.436 4.056 c
+137.142 4.056 137.498 3.586 137.51 2.645 c
+137.51 0 l
+136.863 0 l
+136.863 2.616 l
+136.863 2.929 136.808 3.15 136.702 3.278 c
+136.591 3.403 136.436 3.469 136.231 3.469 c
+136.073 3.469 135.926 3.414 135.79 3.308 c
+135.661 3.197 135.559 3.061 135.482 2.896 c
+135.482 0 l
+134.834 0 l
+134.834 5.644 l
+135.482 5.644 l
+h
+139.891 -0.073 m
+139.391 -0.073 139.009 0.073 138.744 0.368 c
+138.48 0.661 138.348 1.095 138.348 1.675 c
+138.348 2.146 l
+138.348 2.741 138.472 3.208 138.73 3.543 c
+138.994 3.884 139.355 4.056 139.817 4.056 c
+140.276 4.056 140.619 3.902 140.847 3.601 c
+141.082 3.308 141.203 2.844 141.213 2.219 c
+141.213 1.793 l
+138.994 1.793 l
+138.994 1.705 l
+138.994 1.272 139.071 0.959 139.229 0.764 c
+139.395 0.577 139.626 0.485 139.92 0.485 c
+140.115 0.485 140.288 0.518 140.435 0.588 c
+140.582 0.665 140.718 0.783 140.847 0.941 c
+141.184 0.529 l
+140.898 0.125 140.468 -0.073 139.891 -0.073 c
+139.817 3.499 m
+139.542 3.499 139.339 3.403 139.214 3.219 c
+139.086 3.032 139.013 2.741 138.994 2.352 c
+140.567 2.352 l
+140.567 2.44 l
+140.546 2.822 140.479 3.09 140.361 3.248 c
+140.244 3.414 140.06 3.499 139.817 3.499 c
+145.359 3.366 m
+145.271 3.385 145.172 3.395 145.065 3.395 c
+144.731 3.395 144.496 3.212 144.359 2.851 c
+144.359 0 l
+143.713 0 l
+143.713 3.983 l
+144.345 3.983 l
+144.359 3.572 l
+144.536 3.896 144.779 4.056 145.094 4.056 c
+145.201 4.056 145.289 4.035 145.359 3.998 c
+h
+147.358 -0.073 m
+146.858 -0.073 146.476 0.073 146.212 0.368 c
+145.947 0.661 145.815 1.095 145.815 1.675 c
+145.815 2.146 l
+145.815 2.741 145.94 3.208 146.197 3.543 c
+146.462 3.884 146.821 4.056 147.285 4.056 c
+147.744 4.056 148.086 3.902 148.313 3.601 c
+148.548 3.308 148.67 2.844 148.681 2.219 c
+148.681 1.793 l
+146.462 1.793 l
+146.462 1.705 l
+146.462 1.272 146.539 0.959 146.697 0.764 c
+146.862 0.577 147.093 0.485 147.388 0.485 c
+147.582 0.485 147.755 0.518 147.902 0.588 c
+148.049 0.665 148.185 0.783 148.313 0.941 c
+148.652 0.529 l
+148.365 0.125 147.935 -0.073 147.358 -0.073 c
+147.285 3.499 m
+147.009 3.499 146.807 3.403 146.682 3.219 c
+146.553 3.032 146.48 2.741 146.462 2.352 c
+148.034 2.352 l
+148.034 2.44 l
+148.012 2.822 147.946 3.09 147.829 3.248 c
+147.711 3.414 147.527 3.499 147.285 3.499 c
+150.077 3.983 m
+150.092 3.616 l
+150.335 3.91 150.655 4.056 151.048 4.056 c
+151.488 4.056 151.797 3.859 151.974 3.469 c
+152.228 3.859 152.577 4.056 153.017 4.056 c
+153.753 4.056 154.127 3.594 154.149 2.675 c
+154.149 0 l
+153.502 0 l
+153.502 2.616 l
+153.502 2.911 153.447 3.123 153.341 3.263 c
+153.242 3.399 153.069 3.469 152.826 3.469 c
+152.627 3.469 152.466 3.389 152.341 3.233 c
+152.224 3.087 152.153 2.896 152.135 2.66 c
+152.135 0 l
+151.474 0 l
+151.474 2.645 l
+151.474 3.193 151.253 3.469 150.813 3.469 c
+150.478 3.469 150.243 3.308 150.107 2.984 c
+150.107 0 l
+149.46 0 l
+149.46 3.983 l
+h
+154.987 2.175 m
+154.987 2.753 155.123 3.208 155.399 3.543 c
+155.681 3.884 156.053 4.056 156.516 4.056 c
+156.975 4.056 157.342 3.888 157.618 3.557 c
+157.901 3.233 158.048 2.786 158.059 2.219 c
+158.059 1.793 l
+158.059 1.224 157.915 0.768 157.633 0.426 c
+157.357 0.092 156.99 -0.073 156.531 -0.073 c
+156.068 -0.073 155.696 0.088 155.413 0.411 c
+155.137 0.742 154.994 1.183 154.987 1.735 c
+h
+155.634 1.793 m
+155.634 1.389 155.711 1.073 155.869 0.838 c
+156.034 0.603 156.255 0.485 156.531 0.485 c
+157.096 0.485 157.39 0.897 157.412 1.72 c
+157.412 2.175 l
+157.412 2.576 157.327 2.896 157.163 3.131 c
+157.005 3.373 156.787 3.499 156.516 3.499 c
+156.251 3.499 156.034 3.373 155.869 3.131 c
+155.711 2.896 155.634 2.576 155.634 2.175 c
+h
+159.75 4.939 m
+159.75 3.983 l
+160.352 3.983 l
+160.352 3.454 l
+159.75 3.454 l
+159.75 0.985 l
+159.75 0.827 159.771 0.709 159.823 0.632 c
+159.881 0.551 159.97 0.515 160.087 0.515 c
+160.176 0.515 160.263 0.529 160.352 0.559 c
+160.352 0 l
+160.205 -0.048 160.051 -0.073 159.897 -0.073 c
+159.639 -0.073 159.444 0.018 159.309 0.206 c
+159.168 0.389 159.103 0.65 159.103 0.985 c
+159.103 3.454 l
+158.5 3.454 l
+158.5 3.983 l
+159.103 3.983 l
+159.103 4.939 l
+h
+162.542 -0.073 m
+162.042 -0.073 161.66 0.073 161.396 0.368 c
+161.131 0.661 160.999 1.095 160.999 1.675 c
+160.999 2.146 l
+160.999 2.741 161.124 3.208 161.381 3.543 c
+161.645 3.884 162.006 4.056 162.469 4.056 c
+162.928 4.056 163.27 3.902 163.498 3.601 c
+163.733 3.308 163.854 2.844 163.866 2.219 c
+163.866 1.793 l
+161.645 1.793 l
+161.645 1.705 l
+161.645 1.272 161.723 0.959 161.881 0.764 c
+162.046 0.577 162.278 0.485 162.572 0.485 c
+162.767 0.485 162.939 0.518 163.086 0.588 c
+163.233 0.665 163.369 0.783 163.498 0.941 c
+163.835 0.529 l
+163.549 0.125 163.12 -0.073 162.542 -0.073 c
+162.469 3.499 m
+162.193 3.499 161.991 3.403 161.866 3.219 c
+161.738 3.032 161.664 2.741 161.645 2.352 c
+163.218 2.352 l
+163.218 2.44 l
+163.197 2.822 163.13 3.09 163.012 3.248 c
+162.895 3.414 162.711 3.499 162.469 3.499 c
+168.01 3.366 m
+167.922 3.385 167.823 3.395 167.716 3.395 c
+167.382 3.395 167.147 3.212 167.01 2.851 c
+167.01 0 l
+166.364 0 l
+166.364 3.983 l
+166.996 3.983 l
+167.01 3.572 l
+167.187 3.896 167.43 4.056 167.746 4.056 c
+167.852 4.056 167.941 4.035 168.01 3.998 c
+h
+170.009 -0.073 m
+169.51 -0.073 169.127 0.073 168.863 0.368 c
+168.598 0.661 168.466 1.095 168.466 1.675 c
+168.466 2.146 l
+168.466 2.741 168.591 3.208 168.848 3.543 c
+169.113 3.884 169.473 4.056 169.936 4.056 c
+170.395 4.056 170.737 3.902 170.964 3.601 c
+171.2 3.308 171.321 2.844 171.332 2.219 c
+171.332 1.793 l
+169.113 1.793 l
+169.113 1.705 l
+169.113 1.272 169.19 0.959 169.348 0.764 c
+169.513 0.577 169.745 0.485 170.039 0.485 c
+170.233 0.485 170.406 0.518 170.553 0.588 c
+170.7 0.665 170.836 0.783 170.964 0.941 c
+171.303 0.529 l
+171.016 0.125 170.586 -0.073 170.009 -0.073 c
+169.936 3.499 m
+169.66 3.499 169.458 3.403 169.333 3.219 c
+169.204 3.032 169.131 2.741 169.113 2.352 c
+170.686 2.352 l
+170.686 2.44 l
+170.663 2.822 170.597 3.09 170.48 3.248 c
+170.362 3.414 170.179 3.499 169.936 3.499 c
+174.993 1.793 m
+174.993 1.165 174.875 0.694 174.64 0.382 c
+174.412 0.077 174.096 -0.073 173.684 -0.073 c
+173.279 -0.073 172.971 0.077 172.758 0.382 c
+172.758 -1.529 l
+172.111 -1.529 l
+172.111 3.983 l
+172.699 3.983 l
+172.743 3.543 l
+172.957 3.884 173.265 4.056 173.669 4.056 c
+174.11 4.056 174.438 3.902 174.654 3.601 c
+174.867 3.296 174.981 2.84 174.993 2.234 c
+h
+174.345 2.175 m
+174.345 2.616 174.276 2.94 174.139 3.146 c
+174 3.358 173.78 3.469 173.478 3.469 c
+173.162 3.469 172.924 3.314 172.758 3.013 c
+172.758 0.941 l
+172.924 0.636 173.162 0.485 173.478 0.485 c
+173.772 0.485 173.985 0.588 174.125 0.794 c
+174.261 1.007 174.335 1.338 174.345 1.779 c
+h
+175.698 2.175 m
+175.698 2.753 175.834 3.208 176.109 3.543 c
+176.392 3.884 176.764 4.056 177.227 4.056 c
+177.686 4.056 178.054 3.888 178.329 3.557 c
+178.612 3.233 178.759 2.786 178.77 2.219 c
+178.77 1.793 l
+178.77 1.224 178.627 0.768 178.343 0.426 c
+178.068 0.092 177.701 -0.073 177.241 -0.073 c
+176.778 -0.073 176.407 0.088 176.124 0.411 c
+175.849 0.742 175.706 1.183 175.698 1.735 c
+h
+176.344 1.793 m
+176.344 1.389 176.422 1.073 176.58 0.838 c
+176.745 0.603 176.965 0.485 177.241 0.485 c
+177.807 0.485 178.101 0.897 178.123 1.72 c
+178.123 2.175 l
+178.123 2.576 178.039 2.896 177.873 3.131 c
+177.715 3.373 177.499 3.499 177.227 3.499 c
+176.962 3.499 176.745 3.373 176.58 3.131 c
+176.422 2.896 176.344 2.576 176.344 2.175 c
+h
+181.548 1.014 m
+181.548 1.161 181.493 1.282 181.387 1.382 c
+181.276 1.477 181.071 1.595 180.769 1.735 c
+180.423 1.881 180.181 2.003 180.034 2.102 c
+179.887 2.209 179.777 2.326 179.71 2.454 c
+179.641 2.58 179.608 2.738 179.608 2.925 c
+179.608 3.248 179.725 3.516 179.961 3.734 c
+180.196 3.946 180.497 4.056 180.872 4.056 c
+181.254 4.056 181.563 3.943 181.798 3.719 c
+182.033 3.491 182.151 3.204 182.151 2.851 c
+181.504 2.851 l
+181.504 3.028 181.445 3.179 181.328 3.308 c
+181.21 3.432 181.056 3.499 180.872 3.499 c
+180.674 3.499 180.523 3.443 180.416 3.337 c
+180.306 3.237 180.254 3.105 180.254 2.94 c
+180.254 2.811 180.292 2.705 180.372 2.616 c
+180.45 2.535 180.641 2.433 180.946 2.308 c
+181.423 2.12 181.754 1.933 181.931 1.749 c
+182.106 1.573 182.195 1.345 182.195 1.073 c
+182.195 0.721 182.07 0.441 181.827 0.235 c
+181.592 0.029 181.276 -0.073 180.886 -0.073 c
+180.464 -0.073 180.126 0.044 179.872 0.279 c
+179.615 0.522 179.49 0.827 179.49 1.191 c
+180.137 1.191 l
+180.144 0.962 180.215 0.786 180.343 0.661 c
+180.468 0.544 180.651 0.485 180.886 0.485 c
+181.1 0.485 181.262 0.532 181.372 0.632 c
+181.489 0.727 181.548 0.856 181.548 1.014 c
+183.739 0 -0.647 3.983 re
+183.782 5.027 m
+183.782 4.917 183.753 4.825 183.694 4.748 c
+183.635 4.678 183.54 4.644 183.415 4.644 c
+183.297 4.644 183.201 4.678 183.136 4.748 c
+183.076 4.825 183.047 4.917 183.047 5.027 c
+183.047 5.145 183.076 5.236 183.136 5.307 c
+183.201 5.384 183.297 5.424 183.415 5.424 c
+183.54 5.424 183.635 5.384 183.694 5.307 c
+183.753 5.226 183.782 5.134 183.782 5.027 c
+185.605 4.939 m
+185.605 3.983 l
+186.208 3.983 l
+186.208 3.454 l
+185.605 3.454 l
+185.605 0.985 l
+185.605 0.827 185.627 0.709 185.678 0.632 c
+185.738 0.551 185.825 0.515 185.943 0.515 c
+186.031 0.515 186.12 0.529 186.208 0.559 c
+186.208 0 l
+186.06 -0.048 185.906 -0.073 185.752 -0.073 c
+185.495 -0.073 185.3 0.018 185.164 0.206 c
+185.025 0.389 184.958 0.65 184.958 0.985 c
+184.958 3.454 l
+184.356 3.454 l
+184.356 3.983 l
+184.958 3.983 l
+184.958 4.939 l
+h
+186.766 2.175 m
+186.766 2.753 186.902 3.208 187.178 3.543 c
+187.461 3.884 187.832 4.056 188.295 4.056 c
+188.755 4.056 189.122 3.888 189.397 3.557 c
+189.68 3.233 189.827 2.786 189.838 2.219 c
+189.838 1.793 l
+189.838 1.224 189.695 0.768 189.412 0.426 c
+189.137 0.092 188.769 -0.073 188.31 -0.073 c
+187.847 -0.073 187.475 0.088 187.192 0.411 c
+186.916 0.742 186.773 1.183 186.766 1.735 c
+h
+187.413 1.793 m
+187.413 1.389 187.49 1.073 187.648 0.838 c
+187.814 0.603 188.034 0.485 188.31 0.485 c
+188.876 0.485 189.17 0.897 189.191 1.72 c
+189.191 2.175 l
+189.191 2.576 189.107 2.896 188.942 3.131 c
+188.784 3.373 188.567 3.499 188.295 3.499 c
+188.03 3.499 187.814 3.373 187.648 3.131 c
+187.49 2.896 187.413 2.576 187.413 2.175 c
+h
+192.323 3.366 m
+192.234 3.385 192.135 3.395 192.028 3.395 c
+191.694 3.395 191.459 3.212 191.323 2.851 c
+191.323 0 l
+190.677 0 l
+190.677 3.983 l
+191.308 3.983 l
+191.323 3.572 l
+191.5 3.896 191.742 4.056 192.058 4.056 c
+192.165 4.056 192.252 4.035 192.323 3.998 c
+h
+194.13 1.088 m
+194.851 3.983 l
+195.541 3.983 l
+194.248 -0.559 l
+194.149 -0.9 194.006 -1.161 193.821 -1.338 c
+193.646 -1.514 193.443 -1.602 193.219 -1.602 c
+193.131 -1.602 193.017 -1.58 192.881 -1.544 c
+192.881 -1 l
+193.028 -1.014 l
+193.212 -1.014 193.359 -0.97 193.469 -0.882 c
+193.576 -0.794 193.663 -0.636 193.734 -0.412 c
+193.852 0.029 l
+192.69 3.983 l
+193.395 3.983 l
+h
+195.821 0.353 m
+195.821 0.47 195.853 0.566 195.924 0.646 c
+195.99 0.723 196.092 0.764 196.233 0.764 c
+196.379 0.764 196.486 0.723 196.556 0.646 c
+196.633 0.566 196.674 0.47 196.674 0.353 c
+196.674 0.243 196.633 0.151 196.556 0.073 c
+196.486 -0.004 196.379 -0.044 196.233 -0.044 c
+196.092 -0.044 195.99 -0.004 195.924 0.073 c
+195.853 0.151 195.821 0.243 195.821 0.353 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+287.665 442.028 234.667 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 400.8622 432.0517 cm
+0 0 m
+0.882 0 l
+1.213 0 1.459 0.118 1.617 0.353 c
+1.771 0.588 1.852 0.897 1.852 1.278 c
+1.852 1.661 1.768 1.955 1.602 2.161 c
+1.444 2.367 1.228 2.469 0.955 2.469 c
+0.709 2.469 0.503 2.37 0.338 2.175 c
+0.18 1.976 0.103 1.727 0.103 1.426 c
+-1.72 1.426 l
+-1.72 1.914 -1.61 2.352 -1.382 2.734 c
+-1.158 3.123 -0.846 3.428 -0.441 3.645 c
+-0.029 3.869 0.419 3.983 0.912 3.983 c
+1.771 3.983 2.447 3.74 2.94 3.263 c
+3.428 2.793 3.675 2.138 3.675 1.309 c
+3.675 0.885 3.561 0.492 3.337 0.133 c
+3.12 -0.231 2.83 -0.511 2.469 -0.706 c
+2.911 -0.893 3.237 -1.176 3.454 -1.558 c
+3.667 -1.933 3.777 -2.374 3.777 -2.882 c
+3.777 -3.715 3.513 -4.388 2.984 -4.895 c
+2.454 -5.394 1.756 -5.644 0.897 -5.644 c
+0.092 -5.644 -0.559 -5.402 -1.058 -4.91 c
+-1.558 -4.41 -1.808 -3.755 -1.808 -2.94 c
+0.014 -2.94 l
+0.014 -3.285 0.103 -3.568 0.279 -3.792 c
+0.455 -4.021 0.68 -4.131 0.955 -4.131 c
+1.268 -4.131 1.514 -4.021 1.691 -3.792 c
+1.874 -3.557 1.97 -3.245 1.97 -2.851 c
+1.97 -1.933 1.61 -1.47 0.897 -1.47 c
+0 -1.47 l
+h
+5.427 -4.586 m
+5.427 -4.293 5.523 -4.054 5.722 -3.866 c
+5.916 -3.682 6.169 -3.587 6.485 -3.587 c
+6.787 -3.587 7.037 -3.682 7.235 -3.866 c
+7.441 -4.054 7.544 -4.293 7.544 -4.586 c
+7.544 -4.891 7.441 -5.137 7.235 -5.321 c
+7.037 -5.498 6.787 -5.586 6.485 -5.586 c
+6.181 -5.586 5.928 -5.494 5.722 -5.307 c
+5.523 -5.122 5.427 -4.881 5.427 -4.586 c
+12.432 -5.512 m
+12.432 3.851 l
+14.915 3.851 l
+16.004 3.851 16.87 3.502 17.518 2.807 c
+18.171 2.109 18.506 1.161 18.517 -0.044 c
+18.517 -1.558 l
+18.517 -2.793 18.194 -3.763 17.547 -4.469 c
+16.9 -5.167 16.004 -5.512 14.857 -5.512 c
+h
+14.327 2.278 m
+14.327 -3.94 l
+14.886 -3.94 l
+15.522 -3.94 15.967 -3.774 16.224 -3.439 c
+16.477 -3.109 16.61 -2.535 16.621 -1.72 c
+16.621 -0.103 l
+16.621 0.779 16.496 1.389 16.253 1.735 c
+16.018 2.076 15.607 2.256 15.019 2.278 c
+h
+24.415 -3.601 m
+21.843 -3.601 l
+21.343 -5.512 l
+19.344 -5.512 l
+22.269 3.851 l
+23.989 3.851 l
+26.944 -5.512 l
+24.915 -5.512 l
+h
+22.254 -2.014 m
+24.003 -2.014 l
+23.121 1.323 l
+h
+29.886 -0.353 m
+31.297 3.851 l
+33.356 3.851 l
+30.842 -2.117 l
+30.842 -5.512 l
+28.932 -5.512 l
+28.932 -2.117 l
+26.418 3.851 l
+28.475 3.851 l
+h
+36.604 -2.263 -3.146 1.529 re
+44.406 2.278 m
+42.083 2.278 l
+42.083 -5.512 l
+40.187 -5.512 l
+40.187 2.278 l
+37.909 2.278 l
+37.909 3.851 l
+44.406 3.851 l
+h
+52.105 -1.675 m
+52.105 -2.932 51.803 -3.906 51.207 -4.601 c
+50.609 -5.299 49.786 -5.644 48.738 -5.644 c
+47.687 -5.644 46.86 -5.303 46.254 -4.615 c
+45.655 -3.921 45.35 -2.955 45.343 -1.72 c
+45.343 -0.118 l
+45.343 1.165 45.64 2.168 46.239 2.896 c
+46.835 3.62 47.665 3.983 48.724 3.983 c
+49.759 3.983 50.579 3.623 51.178 2.911 c
+51.785 2.205 52.093 1.209 52.105 -0.073 c
+h
+50.208 -0.103 m
+50.208 0.738 50.083 1.367 49.84 1.779 c
+49.605 2.19 49.231 2.396 48.724 2.396 c
+48.224 2.396 47.849 2.194 47.606 1.793 c
+47.371 1.4 47.247 0.801 47.239 0 c
+47.239 -1.675 l
+47.239 -2.492 47.361 -3.094 47.606 -3.484 c
+47.849 -3.877 48.227 -4.072 48.738 -4.072 c
+49.227 -4.072 49.591 -3.881 49.826 -3.499 c
+50.069 -3.117 50.197 -2.529 50.208 -1.735 c
+h
+56.871 -2.263 -3.146 1.529 re
+58.601 -5.512 m
+58.601 3.851 l
+61.085 3.851 l
+62.173 3.851 63.041 3.502 63.687 2.807 c
+64.341 2.109 64.676 1.161 64.687 -0.044 c
+64.687 -1.558 l
+64.687 -2.793 64.364 -3.763 63.716 -4.469 c
+63.07 -5.167 62.173 -5.512 61.027 -5.512 c
+h
+60.497 2.278 m
+60.497 -3.94 l
+61.056 -3.94 l
+61.692 -3.94 62.137 -3.774 62.394 -3.439 c
+62.648 -3.109 62.779 -2.535 62.791 -1.72 c
+62.791 -0.103 l
+62.791 0.779 62.665 1.389 62.423 1.735 c
+62.188 2.076 61.776 2.256 61.189 2.278 c
+h
+70.585 -3.601 m
+68.013 -3.601 l
+67.512 -5.512 l
+65.514 -5.512 l
+68.439 3.851 l
+70.158 3.851 l
+73.113 -5.512 l
+71.084 -5.512 l
+h
+68.424 -2.014 m
+70.174 -2.014 l
+69.291 1.323 l
+h
+76.057 -0.353 m
+77.468 3.851 l
+79.525 3.851 l
+77.012 -2.117 l
+77.012 -5.512 l
+75.101 -5.512 l
+75.101 -2.117 l
+72.587 3.851 l
+74.646 3.851 l
+h
+89.796 -2.028 m
+90.679 3.851 l
+92.56 3.851 l
+90.884 -5.512 l
+88.988 -5.512 l
+87.9 0 l
+86.827 -5.512 l
+84.916 -5.512 l
+83.24 3.851 l
+85.122 3.851 l
+86.004 -2.028 l
+87.107 3.851 l
+88.694 3.851 l
+h
+100.472 -1.675 m
+100.472 -2.932 100.17 -3.906 99.575 -4.601 c
+98.976 -5.299 98.153 -5.644 97.106 -5.644 c
+96.054 -5.644 95.227 -5.303 94.621 -4.615 c
+94.022 -3.921 93.717 -2.955 93.71 -1.72 c
+93.71 -0.118 l
+93.71 1.165 94.008 2.168 94.606 2.896 c
+95.202 3.62 96.033 3.983 97.091 3.983 c
+98.127 3.983 98.947 3.623 99.545 2.911 c
+100.152 2.205 100.461 1.209 100.472 -0.073 c
+h
+98.575 -0.103 m
+98.575 0.738 98.45 1.367 98.208 1.779 c
+97.972 2.19 97.598 2.396 97.091 2.396 c
+96.591 2.396 96.216 2.194 95.973 1.793 c
+95.738 1.4 95.614 0.801 95.606 0 c
+95.606 -1.675 l
+95.606 -2.492 95.728 -3.094 95.973 -3.484 c
+96.216 -3.877 96.595 -4.072 97.106 -4.072 c
+97.594 -4.072 97.958 -3.881 98.193 -3.499 c
+98.436 -3.117 98.564 -2.529 98.575 -1.735 c
+h
+104.885 -2.087 m
+103.944 -2.087 l
+103.944 -5.512 l
+102.063 -5.512 l
+102.063 3.851 l
+105.076 3.851 l
+106.024 3.851 106.755 3.605 107.266 3.116 c
+107.784 2.624 108.045 1.929 108.045 1.029 c
+108.045 -0.217 107.593 -1.088 106.693 -1.588 c
+108.324 -5.424 l
+108.324 -5.512 l
+106.296 -5.512 l
+h
+103.944 -0.515 m
+105.018 -0.515 l
+105.4 -0.515 105.683 -0.393 105.87 -0.147 c
+106.053 0.106 106.149 0.445 106.149 0.867 c
+106.149 1.808 105.785 2.278 105.062 2.278 c
+103.944 2.278 l
+h
+112.205 -1.897 m
+111.455 -2.837 l
+111.455 -5.512 l
+109.559 -5.512 l
+109.559 3.851 l
+111.455 3.851 l
+111.455 -0.235 l
+112.058 0.779 l
+113.793 3.851 l
+116.115 3.851 l
+113.425 -0.264 l
+116.159 -5.512 l
+113.91 -5.512 l
+h
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 411.726 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 404.8916 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.485 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.264 13.582 -0.177 c
+h
+24.22 -0.25 m
+24.22 -0.419 24.18 -0.57 24.103 -0.706 c
+24.033 -0.834 23.931 -0.948 23.794 -1.044 c
+23.666 -1.132 23.504 -1.202 23.31 -1.249 c
+23.121 -1.297 22.905 -1.323 22.662 -1.323 c
+22.435 -1.323 22.236 -1.309 22.06 -1.279 c
+21.883 -1.249 21.725 -1.202 21.59 -1.132 c
+21.45 -1.055 21.34 -0.956 21.251 -0.838 c
+21.163 -0.721 21.093 -0.574 21.045 -0.397 c
+21.854 -0.279 l
+21.872 -0.379 21.902 -0.456 21.942 -0.515 c
+21.99 -0.574 22.049 -0.617 22.119 -0.647 c
+22.185 -0.676 22.265 -0.702 22.354 -0.721 c
+22.442 -0.732 22.545 -0.735 22.662 -0.735 c
+22.758 -0.735 22.853 -0.732 22.942 -0.721 c
+23.03 -0.702 23.107 -0.676 23.177 -0.647 c
+23.243 -0.617 23.295 -0.58 23.324 -0.53 c
+23.36 -0.482 23.383 -0.419 23.383 -0.339 c
+23.383 -0.243 23.353 -0.169 23.295 -0.118 c
+23.243 -0.07 23.177 -0.029 23.089 0 c
+23.001 0.037 22.89 0.066 22.766 0.088 c
+22.647 0.118 22.516 0.147 22.369 0.176 c
+22.229 0.213 22.09 0.253 21.942 0.293 c
+21.803 0.341 21.677 0.405 21.56 0.484 c
+21.45 0.562 21.361 0.661 21.296 0.779 c
+21.226 0.897 21.193 1.047 21.193 1.234 c
+21.193 1.389 21.222 1.532 21.28 1.66 c
+21.347 1.797 21.442 1.911 21.56 1.999 c
+21.685 2.087 21.843 2.153 22.03 2.205 c
+22.215 2.252 22.427 2.278 22.662 2.278 c
+22.846 2.278 23.023 2.256 23.192 2.219 c
+23.357 2.19 23.504 2.135 23.632 2.057 c
+23.757 1.988 23.868 1.889 23.956 1.764 c
+24.044 1.646 24.103 1.502 24.133 1.338 c
+23.339 1.264 l
+23.316 1.341 23.287 1.404 23.25 1.455 c
+23.21 1.514 23.162 1.558 23.104 1.587 c
+23.052 1.624 22.99 1.65 22.913 1.66 c
+22.832 1.668 22.751 1.675 22.662 1.675 c
+22.446 1.675 22.284 1.646 22.177 1.587 c
+22.067 1.536 22.016 1.448 22.016 1.323 c
+22.016 1.242 22.034 1.18 22.074 1.132 c
+22.122 1.08 22.185 1.043 22.265 1.014 c
+22.354 0.985 22.45 0.955 22.56 0.926 c
+22.666 0.904 22.788 0.881 22.927 0.852 c
+23.081 0.823 23.239 0.783 23.397 0.735 c
+23.551 0.683 23.692 0.621 23.809 0.544 c
+23.927 0.463 24.022 0.36 24.103 0.235 c
+24.18 0.106 24.22 -0.056 24.22 -0.25 c
+25.783 1.602 m
+25.238 1.602 l
+25.238 2.219 l
+25.826 2.219 l
+26.106 3.116 l
+26.679 3.116 l
+26.679 2.219 l
+27.914 2.219 l
+27.914 1.602 l
+26.679 1.602 l
+26.679 -0.103 l
+26.679 -0.324 l
+26.686 -0.393 26.709 -0.456 26.738 -0.515 c
+26.774 -0.566 26.83 -0.611 26.9 -0.647 c
+26.977 -0.676 27.09 -0.691 27.237 -0.691 c
+27.374 -0.691 27.509 -0.688 27.649 -0.676 c
+27.785 -0.658 27.917 -0.632 28.046 -0.603 c
+28.046 -1.205 l
+27.965 -1.216 27.888 -1.231 27.811 -1.249 c
+27.73 -1.261 27.653 -1.268 27.576 -1.279 c
+27.495 -1.286 27.407 -1.294 27.312 -1.294 c
+27.223 -1.301 27.123 -1.309 27.017 -1.309 c
+26.83 -1.309 26.668 -1.294 26.532 -1.264 c
+26.404 -1.228 26.29 -1.183 26.194 -1.132 c
+26.106 -1.085 26.032 -1.025 25.974 -0.956 c
+25.915 -0.879 25.87 -0.802 25.841 -0.721 c
+25.812 -0.632 25.789 -0.544 25.783 -0.456 c
+25.772 -0.36 25.768 -0.264 25.768 -0.177 c
+h
+30.196 -1.323 m
+30.027 -1.323 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.313 -0.97 29.244 -0.864 29.196 -0.735 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.155 0.095 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.723 29.931 0.764 c
+30.096 0.801 30.273 0.827 30.46 0.837 c
+31.181 0.852 l
+31.181 1.029 l
+31.181 1.147 31.17 1.249 31.152 1.338 c
+31.129 1.425 31.096 1.492 31.048 1.543 c
+31.008 1.602 30.96 1.639 30.901 1.66 c
+30.842 1.679 30.776 1.69 30.71 1.69 c
+30.641 1.69 30.578 1.679 30.519 1.66 c
+30.468 1.65 30.42 1.624 30.372 1.587 c
+30.331 1.558 30.298 1.506 30.269 1.44 c
+30.248 1.382 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.313 1.396 29.358 1.532 29.417 1.66 c
+29.483 1.785 29.579 1.896 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.252 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.456 l
+32.099 -0.515 32.114 -0.57 32.136 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.371 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.279 c
+32.257 -1.286 32.213 -1.294 32.166 -1.294 c
+32.114 -1.301 32.055 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.647 c
+31.283 -0.647 l
+31.214 -0.757 31.144 -0.852 31.077 -0.941 c
+31.008 -1.022 30.931 -1.087 30.842 -1.147 c
+30.755 -1.205 30.655 -1.249 30.549 -1.279 c
+30.449 -1.309 30.331 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.33 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.249 c
+30.211 0.209 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.375 30.096 -0.497 30.167 -0.574 c
+30.233 -0.654 30.331 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.617 c
+30.85 -0.57 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.262 31.137 -0.162 c
+31.166 -0.056 31.181 0.058 31.181 0.176 c
+h
+33.903 1.602 m
+33.36 1.602 l
+33.36 2.219 l
+33.948 2.219 l
+34.227 3.116 l
+34.8 3.116 l
+34.8 2.219 l
+36.035 2.219 l
+36.035 1.602 l
+34.8 1.602 l
+34.8 -0.103 l
+34.8 -0.324 l
+34.807 -0.393 34.83 -0.456 34.859 -0.515 c
+34.896 -0.566 34.951 -0.611 35.021 -0.647 c
+35.098 -0.676 35.212 -0.691 35.359 -0.691 c
+35.495 -0.691 35.631 -0.688 35.771 -0.676 c
+35.906 -0.658 36.039 -0.632 36.168 -0.603 c
+36.168 -1.205 l
+36.087 -1.216 36.01 -1.231 35.932 -1.249 c
+35.852 -1.261 35.774 -1.268 35.697 -1.279 c
+35.616 -1.286 35.528 -1.294 35.432 -1.294 c
+35.345 -1.301 35.245 -1.309 35.138 -1.309 c
+34.951 -1.309 34.789 -1.294 34.653 -1.264 c
+34.525 -1.228 34.41 -1.183 34.315 -1.132 c
+34.227 -1.085 34.154 -1.025 34.094 -0.956 c
+34.036 -0.879 33.992 -0.802 33.963 -0.721 c
+33.933 -0.632 33.911 -0.544 33.903 -0.456 c
+33.893 -0.36 33.889 -0.264 33.889 -0.177 c
+h
+38.248 2.219 m
+38.248 0.264 l
+38.248 0.125 38.254 0 38.277 -0.118 c
+38.295 -0.228 38.328 -0.32 38.379 -0.397 c
+38.427 -0.478 38.486 -0.54 38.556 -0.588 c
+38.622 -0.628 38.707 -0.647 38.806 -0.647 c
+38.894 -0.647 38.975 -0.628 39.056 -0.588 c
+39.144 -0.54 39.218 -0.47 39.276 -0.382 c
+39.335 -0.287 39.379 -0.177 39.409 -0.059 c
+39.445 0.066 39.467 0.206 39.467 0.353 c
+39.467 2.219 l
+40.364 2.219 l
+40.364 -0.485 l
+40.364 -0.721 l
+40.371 -0.802 40.378 -0.879 40.378 -0.956 c
+40.378 -1.147 l
+40.386 -1.199 40.393 -1.235 40.393 -1.264 c
+39.541 -1.264 l
+39.53 -1.235 39.519 -1.199 39.511 -1.147 c
+39.511 -0.956 l
+39.511 -0.889 39.504 -0.819 39.497 -0.75 c
+39.497 -0.574 l
+39.482 -0.574 l
+39.364 -0.838 39.21 -1.029 39.027 -1.147 c
+38.85 -1.264 38.647 -1.323 38.424 -1.323 c
+38.218 -1.323 38.045 -1.286 37.909 -1.22 c
+37.77 -1.154 37.66 -1.058 37.571 -0.941 c
+37.49 -0.823 37.431 -0.688 37.394 -0.53 c
+37.365 -0.364 37.35 -0.187 37.35 0 c
+37.35 2.219 l
+h
+44.527 -0.25 m
+44.527 -0.419 44.487 -0.57 44.409 -0.706 c
+44.34 -0.834 44.237 -0.948 44.101 -1.044 c
+43.972 -1.132 43.811 -1.202 43.616 -1.249 c
+43.428 -1.297 43.212 -1.323 42.969 -1.323 c
+42.742 -1.323 42.543 -1.309 42.366 -1.279 c
+42.19 -1.249 42.032 -1.202 41.896 -1.132 c
+41.757 -1.055 41.647 -0.956 41.558 -0.838 c
+41.47 -0.721 41.4 -0.574 41.352 -0.397 c
+42.161 -0.279 l
+42.179 -0.379 42.208 -0.456 42.249 -0.515 c
+42.297 -0.574 42.356 -0.617 42.425 -0.647 c
+42.491 -0.676 42.572 -0.702 42.661 -0.721 c
+42.749 -0.732 42.852 -0.735 42.969 -0.735 c
+43.065 -0.735 43.16 -0.732 43.249 -0.721 c
+43.337 -0.702 43.414 -0.676 43.484 -0.647 c
+43.55 -0.617 43.601 -0.58 43.631 -0.53 c
+43.667 -0.482 43.69 -0.419 43.69 -0.339 c
+43.69 -0.243 43.66 -0.169 43.601 -0.118 c
+43.55 -0.07 43.484 -0.029 43.395 0 c
+43.307 0.037 43.197 0.066 43.072 0.088 c
+42.954 0.118 42.822 0.147 42.676 0.176 c
+42.536 0.213 42.396 0.253 42.249 0.293 c
+42.109 0.341 41.984 0.405 41.867 0.484 c
+41.757 0.562 41.668 0.661 41.602 0.779 c
+41.533 0.897 41.5 1.047 41.5 1.234 c
+41.5 1.389 41.529 1.532 41.587 1.66 c
+41.654 1.797 41.749 1.911 41.867 1.999 c
+41.992 2.087 42.15 2.153 42.337 2.205 c
+42.521 2.252 42.734 2.278 42.969 2.278 c
+43.153 2.278 43.33 2.256 43.499 2.219 c
+43.663 2.19 43.811 2.135 43.939 2.057 c
+44.064 1.988 44.174 1.889 44.263 1.764 c
+44.351 1.646 44.409 1.502 44.44 1.338 c
+43.646 1.264 l
+43.623 1.341 43.594 1.404 43.557 1.455 c
+43.517 1.514 43.469 1.558 43.41 1.587 c
+43.359 1.624 43.297 1.65 43.219 1.66 c
+43.139 1.668 43.058 1.675 42.969 1.675 c
+42.753 1.675 42.591 1.646 42.484 1.587 c
+42.374 1.536 42.323 1.448 42.323 1.323 c
+42.323 1.242 42.341 1.18 42.381 1.132 c
+42.429 1.08 42.491 1.043 42.572 1.014 c
+42.661 0.985 42.757 0.955 42.867 0.926 c
+42.973 0.904 43.094 0.881 43.234 0.852 c
+43.388 0.823 43.546 0.783 43.704 0.735 c
+43.858 0.683 43.998 0.621 44.116 0.544 c
+44.234 0.463 44.329 0.36 44.409 0.235 c
+44.487 0.106 44.527 -0.056 44.527 -0.25 c
+f
+Q
+q 1 0 0 1 310.8155 390.0891 cm
+0 0 m
+0 0.265 -0.073 0.464 -0.22 0.603 c
+-0.36 0.75 -0.617 0.89 -0.999 1.029 c
+-1.374 1.166 -1.661 1.309 -1.866 1.455 c
+-2.065 1.603 -2.212 1.768 -2.308 1.956 c
+-2.406 2.151 -2.454 2.371 -2.454 2.617 c
+-2.454 3.036 -2.315 3.385 -2.028 3.66 c
+-1.745 3.932 -1.378 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.088 3.851 c
+0.154 3.712 0.341 3.517 0.47 3.263 c
+0.607 3.017 0.676 2.749 0.676 2.455 c
+0 2.455 l
+0 2.786 -0.081 3.043 -0.235 3.219 c
+-0.393 3.404 -0.625 3.499 -0.926 3.499 c
+-1.191 3.499 -1.404 3.418 -1.558 3.263 c
+-1.705 3.117 -1.778 2.903 -1.778 2.631 c
+-1.778 2.404 -1.701 2.213 -1.543 2.058 c
+-1.378 1.912 -1.124 1.771 -0.779 1.646 c
+-0.261 1.478 0.11 1.268 0.339 1.015 c
+0.574 0.757 0.691 0.427 0.691 0.015 c
+0.691 -0.426 0.548 -0.779 0.264 -1.043 c
+-0.022 -1.3 -0.405 -1.425 -0.881 -1.425 c
+-1.198 -1.425 -1.484 -1.356 -1.749 -1.219 c
+-2.013 -1.084 -2.227 -0.893 -2.381 -0.646 c
+-2.528 -0.404 -2.602 -0.118 -2.602 0.206 c
+-1.926 0.206 l
+-1.926 -0.128 -1.833 -0.389 -1.646 -0.573 c
+-1.463 -0.76 -1.205 -0.852 -0.881 -0.852 c
+-0.588 -0.852 -0.367 -0.779 -0.22 -0.631 c
+-0.073 -0.477 0 -0.264 0 0 c
+2.896 -1.425 m
+2.396 -1.425 2.014 -1.278 1.75 -0.984 c
+1.484 -0.69 1.353 -0.257 1.353 0.324 c
+1.353 0.794 l
+1.353 1.389 1.477 1.856 1.735 2.191 c
+1.999 2.532 2.359 2.705 2.822 2.705 c
+3.281 2.705 3.624 2.55 3.851 2.249 c
+4.087 1.956 4.208 1.492 4.218 0.867 c
+4.218 0.441 l
+1.999 0.441 l
+1.999 0.353 l
+1.999 -0.08 2.076 -0.393 2.234 -0.588 c
+2.4 -0.775 2.631 -0.866 2.926 -0.866 c
+3.12 -0.866 3.293 -0.833 3.439 -0.764 c
+3.587 -0.687 3.723 -0.569 3.851 -0.411 c
+4.189 -0.823 l
+3.903 -1.227 3.473 -1.425 2.896 -1.425 c
+2.822 2.147 m
+2.547 2.147 2.344 2.051 2.22 1.867 c
+2.091 1.68 2.018 1.389 1.999 1 c
+3.572 1 l
+3.572 1.088 l
+3.55 1.47 3.484 1.738 3.366 1.897 c
+3.248 2.062 3.065 2.147 2.822 2.147 c
+6.423 -1.425 m
+5.924 -1.425 5.542 -1.278 5.278 -0.984 c
+5.012 -0.69 4.881 -0.257 4.881 0.324 c
+4.881 0.794 l
+4.881 1.389 5.005 1.856 5.263 2.191 c
+5.527 2.532 5.887 2.705 6.35 2.705 c
+6.809 2.705 7.151 2.55 7.379 2.249 c
+7.614 1.956 7.736 1.492 7.746 0.867 c
+7.746 0.441 l
+5.527 0.441 l
+5.527 0.353 l
+5.527 -0.08 5.604 -0.393 5.762 -0.588 c
+5.928 -0.775 6.159 -0.866 6.453 -0.866 c
+6.648 -0.866 6.82 -0.833 6.967 -0.764 c
+7.115 -0.687 7.25 -0.569 7.379 -0.411 c
+7.717 -0.823 l
+7.431 -1.227 7.001 -1.425 6.423 -1.425 c
+6.35 2.147 m
+6.074 2.147 5.872 2.051 5.748 1.867 c
+5.619 1.68 5.546 1.389 5.527 1 c
+7.1 1 l
+7.1 1.088 l
+7.078 1.47 7.011 1.738 6.894 1.897 c
+6.776 2.062 6.593 2.147 6.35 2.147 c
+11.098 3.587 m
+11.098 2.631 l
+11.701 2.631 l
+11.701 2.103 l
+11.098 2.103 l
+11.098 -0.367 l
+11.098 -0.525 11.12 -0.643 11.171 -0.72 c
+11.231 -0.801 11.318 -0.837 11.436 -0.837 c
+11.524 -0.837 11.612 -0.823 11.701 -0.793 c
+11.701 -1.352 l
+11.553 -1.4 11.399 -1.425 11.245 -1.425 c
+10.988 -1.425 10.793 -1.334 10.657 -1.146 c
+10.517 -0.962 10.452 -0.702 10.452 -0.367 c
+10.452 2.103 l
+9.849 2.103 l
+9.849 2.631 l
+10.452 2.631 l
+10.452 3.587 l
+h
+13.112 2.22 m
+13.365 2.544 13.685 2.705 14.067 2.705 c
+14.772 2.705 15.129 2.234 15.14 1.294 c
+15.14 -1.352 l
+14.493 -1.352 l
+14.493 1.264 l
+14.493 1.577 14.438 1.798 14.331 1.926 c
+14.221 2.051 14.067 2.117 13.861 2.117 c
+13.704 2.117 13.556 2.062 13.421 1.956 c
+13.292 1.845 13.189 1.709 13.112 1.544 c
+13.112 -1.352 l
+12.465 -1.352 l
+12.465 4.293 l
+13.112 4.293 l
+h
+17.521 -1.425 m
+17.022 -1.425 16.64 -1.278 16.375 -0.984 c
+16.11 -0.69 15.978 -0.257 15.978 0.324 c
+15.978 0.794 l
+15.978 1.389 16.103 1.856 16.36 2.191 c
+16.625 2.532 16.985 2.705 17.448 2.705 c
+17.907 2.705 18.249 2.55 18.477 2.249 c
+18.712 1.956 18.834 1.492 18.844 0.867 c
+18.844 0.441 l
+16.625 0.441 l
+16.625 0.353 l
+16.625 -0.08 16.702 -0.393 16.86 -0.588 c
+17.026 -0.775 17.257 -0.866 17.55 -0.866 c
+17.745 -0.866 17.918 -0.833 18.065 -0.764 c
+18.213 -0.687 18.348 -0.569 18.477 -0.411 c
+18.815 -0.823 l
+18.528 -1.227 18.098 -1.425 17.521 -1.425 c
+17.448 2.147 m
+17.172 2.147 16.97 2.051 16.845 1.867 c
+16.717 1.68 16.644 1.389 16.625 1 c
+18.198 1 l
+18.198 1.088 l
+18.175 1.47 18.109 1.738 17.992 1.897 c
+17.874 2.062 17.691 2.147 17.448 2.147 c
+23.283 -0.338 m
+23.283 -0.191 23.229 -0.07 23.122 0.03 c
+23.011 0.125 22.805 0.243 22.504 0.383 c
+22.159 0.53 21.916 0.651 21.77 0.75 c
+21.622 0.857 21.512 0.975 21.446 1.103 c
+21.376 1.228 21.344 1.386 21.344 1.573 c
+21.344 1.897 21.461 2.165 21.696 2.382 c
+21.931 2.595 22.233 2.705 22.607 2.705 c
+22.99 2.705 23.298 2.591 23.534 2.367 c
+23.769 2.139 23.886 1.852 23.886 1.5 c
+23.239 1.5 l
+23.239 1.676 23.181 1.827 23.063 1.956 c
+22.946 2.08 22.791 2.147 22.607 2.147 c
+22.408 2.147 22.258 2.091 22.152 1.985 c
+22.042 1.885 21.99 1.754 21.99 1.588 c
+21.99 1.459 22.026 1.353 22.107 1.264 c
+22.185 1.183 22.375 1.081 22.681 0.956 c
+23.158 0.769 23.489 0.581 23.665 0.397 c
+23.842 0.221 23.931 -0.007 23.931 -0.278 c
+23.931 -0.631 23.805 -0.911 23.563 -1.117 c
+23.328 -1.323 23.011 -1.425 22.622 -1.425 c
+22.2 -1.425 21.861 -1.308 21.608 -1.072 c
+21.35 -0.83 21.226 -0.525 21.226 -0.161 c
+21.872 -0.161 l
+21.88 -0.389 21.949 -0.565 22.078 -0.69 c
+22.203 -0.808 22.387 -0.866 22.622 -0.866 c
+22.836 -0.866 22.996 -0.819 23.107 -0.72 c
+23.225 -0.625 23.283 -0.496 23.283 -0.338 c
+25.62 3.587 m
+25.62 2.631 l
+26.223 2.631 l
+26.223 2.103 l
+25.62 2.103 l
+25.62 -0.367 l
+25.62 -0.525 25.643 -0.643 25.694 -0.72 c
+25.753 -0.801 25.841 -0.837 25.959 -0.837 c
+26.047 -0.837 26.135 -0.823 26.223 -0.793 c
+26.223 -1.352 l
+26.076 -1.4 25.922 -1.425 25.768 -1.425 c
+25.51 -1.425 25.315 -1.334 25.18 -1.146 c
+25.04 -0.962 24.974 -0.702 24.974 -0.367 c
+24.974 2.103 l
+24.371 2.103 l
+24.371 2.631 l
+24.974 2.631 l
+24.974 3.587 l
+h
+29.031 -1.352 m
+28.991 -1.263 28.964 -1.117 28.957 -0.911 c
+28.722 -1.256 28.428 -1.425 28.075 -1.425 c
+27.711 -1.425 27.428 -1.33 27.223 -1.132 c
+27.025 -0.926 26.929 -0.639 26.929 -0.264 c
+26.929 0.136 27.065 0.456 27.341 0.691 c
+27.613 0.934 27.987 1.058 28.457 1.058 c
+28.943 1.058 l
+28.943 1.485 l
+28.943 1.721 28.887 1.885 28.781 1.985 c
+28.671 2.091 28.509 2.147 28.296 2.147 c
+28.097 2.147 27.935 2.087 27.811 1.97 c
+27.693 1.852 27.634 1.706 27.634 1.529 c
+26.988 1.529 l
+26.988 1.723 27.046 1.915 27.164 2.103 c
+27.289 2.286 27.451 2.433 27.649 2.544 c
+27.855 2.65 28.083 2.705 28.34 2.705 c
+28.741 2.705 29.045 2.602 29.251 2.396 c
+29.464 2.191 29.579 1.897 29.589 1.515 c
+29.589 -0.5 l
+29.589 -0.804 29.626 -1.069 29.707 -1.294 c
+29.707 -1.352 l
+h
+28.164 -0.837 m
+28.328 -0.837 28.48 -0.793 28.619 -0.706 c
+28.766 -0.617 28.873 -0.507 28.943 -0.367 c
+28.943 0.574 l
+28.575 0.574 l
+28.259 0.574 28.016 0.504 27.84 0.368 c
+27.663 0.239 27.576 0.052 27.576 -0.191 c
+27.576 -0.419 27.62 -0.584 27.708 -0.69 c
+27.796 -0.789 27.947 -0.837 28.164 -0.837 c
+31.441 3.587 m
+31.441 2.631 l
+32.044 2.631 l
+32.044 2.103 l
+31.441 2.103 l
+31.441 -0.367 l
+31.441 -0.525 31.463 -0.643 31.515 -0.72 c
+31.574 -0.801 31.662 -0.837 31.779 -0.837 c
+31.868 -0.837 31.956 -0.823 32.044 -0.793 c
+32.044 -1.352 l
+31.897 -1.4 31.742 -1.425 31.588 -1.425 c
+31.331 -1.425 31.137 -1.334 31 -1.146 c
+30.861 -0.962 30.794 -0.702 30.794 -0.367 c
+30.794 2.103 l
+30.192 2.103 l
+30.192 2.631 l
+30.794 2.631 l
+30.794 3.587 l
+h
+34.837 -0.999 m
+34.62 -1.286 34.308 -1.425 33.896 -1.425 c
+33.533 -1.425 33.257 -1.304 33.073 -1.058 c
+32.897 -0.804 32.801 -0.44 32.794 0.03 c
+32.794 2.631 l
+33.44 2.631 l
+33.44 0.088 l
+33.44 -0.54 33.624 -0.852 33.999 -0.852 c
+34.4 -0.852 34.676 -0.675 34.822 -0.323 c
+34.822 2.631 l
+35.469 2.631 l
+35.469 -1.352 l
+34.852 -1.352 l
+h
+38.394 -0.338 m
+38.394 -0.191 38.339 -0.07 38.233 0.03 c
+38.123 0.125 37.917 0.243 37.615 0.383 c
+37.269 0.53 37.027 0.651 36.88 0.75 c
+36.733 0.857 36.623 0.975 36.557 1.103 c
+36.487 1.228 36.454 1.386 36.454 1.573 c
+36.454 1.897 36.571 2.165 36.806 2.382 c
+37.042 2.595 37.343 2.705 37.718 2.705 c
+38.1 2.705 38.409 2.591 38.644 2.367 c
+38.879 2.139 38.996 1.852 38.996 1.5 c
+38.35 1.5 l
+38.35 1.676 38.291 1.827 38.173 1.956 c
+38.056 2.08 37.901 2.147 37.718 2.147 c
+37.52 2.147 37.369 2.091 37.263 1.985 c
+37.152 1.885 37.101 1.754 37.101 1.588 c
+37.101 1.459 37.138 1.353 37.218 1.264 c
+37.296 1.183 37.487 1.081 37.791 0.956 c
+38.269 0.769 38.599 0.581 38.776 0.397 c
+38.952 0.221 39.041 -0.007 39.041 -0.278 c
+39.041 -0.631 38.916 -0.911 38.674 -1.117 c
+38.439 -1.323 38.123 -1.425 37.733 -1.425 c
+37.31 -1.425 36.972 -1.308 36.718 -1.072 c
+36.461 -0.83 36.336 -0.525 36.336 -0.161 c
+36.983 -0.161 l
+36.99 -0.389 37.06 -0.565 37.188 -0.69 c
+37.314 -0.808 37.498 -0.866 37.733 -0.866 c
+37.946 -0.866 38.107 -0.819 38.218 -0.72 c
+38.335 -0.625 38.394 -0.496 38.394 -0.338 c
+41.466 0.823 m
+41.466 1.401 41.602 1.856 41.878 2.191 c
+42.161 2.532 42.532 2.705 42.995 2.705 c
+43.455 2.705 43.822 2.536 44.097 2.205 c
+44.38 1.881 44.527 1.434 44.538 0.867 c
+44.538 0.441 l
+44.538 -0.128 44.395 -0.584 44.112 -0.926 c
+43.837 -1.26 43.469 -1.425 43.01 -1.425 c
+42.547 -1.425 42.175 -1.263 41.892 -0.941 c
+41.616 -0.61 41.473 -0.168 41.466 0.383 c
+h
+42.113 0.441 m
+42.113 0.038 42.19 -0.278 42.348 -0.514 c
+42.514 -0.749 42.734 -0.866 43.01 -0.866 c
+43.575 -0.866 43.87 -0.455 43.891 0.368 c
+43.891 0.823 l
+43.891 1.224 43.807 1.544 43.642 1.779 c
+43.484 2.022 43.267 2.147 42.995 2.147 c
+42.73 2.147 42.514 2.022 42.348 1.779 c
+42.19 1.544 42.113 1.224 42.113 0.823 c
+h
+45.67 -1.352 m
+45.67 2.103 l
+45.14 2.103 l
+45.14 2.631 l
+45.67 2.631 l
+45.67 3.088 l
+45.67 3.487 45.766 3.801 45.965 4.028 c
+46.17 4.252 46.449 4.366 46.802 4.366 c
+46.938 4.366 47.07 4.344 47.199 4.308 c
+47.17 3.763 l
+47.07 3.782 46.971 3.793 46.875 3.793 c
+46.501 3.793 46.316 3.528 46.316 2.999 c
+46.316 2.631 l
+46.993 2.631 l
+46.993 2.103 l
+46.316 2.103 l
+46.316 -1.352 l
+h
+50.565 -0.264 m
+51.285 2.631 l
+51.976 2.631 l
+50.682 -1.911 l
+50.584 -2.252 50.44 -2.513 50.256 -2.69 c
+50.079 -2.865 49.878 -2.954 49.653 -2.954 c
+49.566 -2.954 49.452 -2.932 49.315 -2.896 c
+49.315 -2.352 l
+49.462 -2.366 l
+49.647 -2.366 49.793 -2.322 49.903 -2.234 c
+50.01 -2.146 50.098 -1.988 50.168 -1.764 c
+50.285 -1.323 l
+49.124 2.631 l
+49.83 2.631 l
+h
+52.417 0.823 m
+52.417 1.401 52.553 1.856 52.828 2.191 c
+53.111 2.532 53.483 2.705 53.946 2.705 c
+54.405 2.705 54.773 2.536 55.048 2.205 c
+55.331 1.881 55.478 1.434 55.489 0.867 c
+55.489 0.441 l
+55.489 -0.128 55.346 -0.584 55.062 -0.926 c
+54.787 -1.26 54.42 -1.425 53.961 -1.425 c
+53.497 -1.425 53.126 -1.263 52.843 -0.941 c
+52.568 -0.61 52.425 -0.168 52.417 0.383 c
+h
+53.063 0.441 m
+53.063 0.038 53.141 -0.278 53.299 -0.514 c
+53.464 -0.749 53.685 -0.866 53.961 -0.866 c
+54.526 -0.866 54.821 -0.455 54.842 0.368 c
+54.842 0.823 l
+54.842 1.224 54.758 1.544 54.592 1.779 c
+54.434 2.022 54.218 2.147 53.946 2.147 c
+53.681 2.147 53.464 2.022 53.299 1.779 c
+53.141 1.544 53.063 1.224 53.063 0.823 c
+h
+58.355 -0.999 m
+58.139 -1.286 57.826 -1.425 57.414 -1.425 c
+57.051 -1.425 56.776 -1.304 56.591 -1.058 c
+56.415 -0.804 56.319 -0.44 56.313 0.03 c
+56.313 2.631 l
+56.959 2.631 l
+56.959 0.088 l
+56.959 -0.54 57.142 -0.852 57.518 -0.852 c
+57.918 -0.852 58.194 -0.675 58.341 -0.323 c
+58.341 2.631 l
+58.987 2.631 l
+58.987 -1.352 l
+58.37 -1.352 l
+h
+61.618 2.014 m
+61.53 2.033 61.431 2.043 61.325 2.043 c
+60.99 2.043 60.755 1.86 60.619 1.5 c
+60.619 -1.352 l
+59.972 -1.352 l
+59.972 2.631 l
+60.604 2.631 l
+60.619 2.22 l
+60.795 2.544 61.038 2.705 61.354 2.705 c
+61.46 2.705 61.549 2.683 61.618 2.646 c
+h
+66.954 -0.205 m
+67.557 2.631 l
+68.204 2.631 l
+67.219 -1.352 l
+66.704 -1.352 l
+65.925 1.5 l
+65.175 -1.352 l
+64.647 -1.352 l
+63.691 2.631 l
+64.323 2.631 l
+64.94 -0.132 l
+65.676 2.631 l
+66.19 2.631 l
+h
+68.747 0.823 m
+68.747 1.401 68.884 1.856 69.159 2.191 c
+69.443 2.532 69.813 2.705 70.276 2.705 c
+70.736 2.705 71.103 2.536 71.379 2.205 c
+71.662 1.881 71.809 1.434 71.82 0.867 c
+71.82 0.441 l
+71.82 -0.128 71.677 -0.584 71.394 -0.926 c
+71.118 -1.26 70.75 -1.425 70.291 -1.425 c
+69.828 -1.425 69.457 -1.263 69.174 -0.941 c
+68.898 -0.61 68.755 -0.168 68.747 0.383 c
+h
+69.395 0.441 m
+69.395 0.038 69.472 -0.278 69.63 -0.514 c
+69.795 -0.749 70.015 -0.866 70.291 -0.866 c
+70.857 -0.866 71.151 -0.455 71.173 0.368 c
+71.173 0.823 l
+71.173 1.224 71.089 1.544 70.923 1.779 c
+70.765 2.022 70.548 2.147 70.276 2.147 c
+70.012 2.147 69.795 2.022 69.63 1.779 c
+69.472 1.544 69.395 1.224 69.395 0.823 c
+h
+74.303 2.014 m
+74.216 2.033 74.116 2.043 74.01 2.043 c
+73.676 2.043 73.441 1.86 73.304 1.5 c
+73.304 -1.352 l
+72.657 -1.352 l
+72.657 2.631 l
+73.289 2.631 l
+73.304 2.22 l
+73.481 2.544 73.723 2.705 74.039 2.705 c
+74.146 2.705 74.234 2.683 74.303 2.646 c
+h
+75.95 0.47 m
+75.612 0.074 l
+75.612 -1.352 l
+74.951 -1.352 l
+74.951 4.293 l
+75.612 4.293 l
+75.612 0.912 l
+76.847 2.631 l
+77.626 2.631 l
+76.362 0.971 l
+77.788 -1.352 l
+77.038 -1.352 l
+h
+78.39 -0.999 m
+78.39 -0.881 78.423 -0.786 78.493 -0.706 c
+78.559 -0.628 78.662 -0.588 78.802 -0.588 c
+78.949 -0.588 79.055 -0.628 79.126 -0.706 c
+79.203 -0.786 79.242 -0.881 79.242 -0.999 c
+79.242 -1.109 79.203 -1.201 79.126 -1.278 c
+79.055 -1.356 78.949 -1.396 78.802 -1.396 c
+78.662 -1.396 78.559 -1.356 78.493 -1.278 c
+78.423 -1.201 78.39 -1.109 78.39 -0.999 c
+85.636 -1.352 m
+84.961 -1.352 l
+82.814 2.779 l
+82.814 -1.352 l
+82.139 -1.352 l
+82.139 3.998 l
+82.814 3.998 l
+84.975 -0.147 l
+84.975 3.998 l
+85.636 3.998 l
+h
+88.136 -1.425 m
+87.636 -1.425 87.254 -1.278 86.989 -0.984 c
+86.725 -0.69 86.592 -0.257 86.592 0.324 c
+86.592 0.794 l
+86.592 1.389 86.717 1.856 86.974 2.191 c
+87.239 2.532 87.599 2.705 88.063 2.705 c
+88.522 2.705 88.863 2.55 89.091 2.249 c
+89.326 1.956 89.447 1.492 89.459 0.867 c
+89.459 0.441 l
+87.239 0.441 l
+87.239 0.353 l
+87.239 -0.08 87.317 -0.393 87.474 -0.588 c
+87.639 -0.775 87.871 -0.866 88.165 -0.866 c
+88.36 -0.866 88.533 -0.833 88.68 -0.764 c
+88.827 -0.687 88.963 -0.569 89.091 -0.411 c
+89.43 -0.823 l
+89.143 -1.227 88.713 -1.425 88.136 -1.425 c
+88.063 2.147 m
+87.787 2.147 87.585 2.051 87.46 1.867 c
+87.331 1.68 87.257 1.389 87.239 1 c
+88.811 1 l
+88.811 1.088 l
+88.79 1.47 88.724 1.738 88.606 1.897 c
+88.489 2.062 88.304 2.147 88.063 2.147 c
+93.207 -0.205 m
+93.81 2.631 l
+94.456 2.631 l
+93.472 -1.352 l
+92.957 -1.352 l
+92.177 1.5 l
+91.429 -1.352 l
+90.899 -1.352 l
+89.944 2.631 l
+90.575 2.631 l
+91.193 -0.132 l
+91.928 2.631 l
+92.443 2.631 l
+h
+94.691 -2.425 m
+94.294 -2.16 l
+94.529 -1.837 94.651 -1.502 94.662 -1.161 c
+94.662 -0.544 l
+95.323 -0.544 l
+95.323 -1.072 l
+95.323 -1.33 95.257 -1.576 95.132 -1.822 c
+95.015 -2.065 94.868 -2.267 94.691 -2.425 c
+99.822 -0.338 m
+99.822 -0.191 99.766 -0.07 99.66 0.03 c
+99.549 0.125 99.344 0.243 99.042 0.383 c
+98.697 0.53 98.454 0.651 98.307 0.75 c
+98.161 0.857 98.05 0.975 97.984 1.103 c
+97.914 1.228 97.881 1.386 97.881 1.573 c
+97.881 1.897 97.999 2.165 98.234 2.382 c
+98.469 2.595 98.77 2.705 99.145 2.705 c
+99.527 2.705 99.836 2.591 100.071 2.367 c
+100.306 2.139 100.424 1.852 100.424 1.5 c
+99.778 1.5 l
+99.778 1.676 99.718 1.827 99.601 1.956 c
+99.483 2.08 99.329 2.147 99.145 2.147 c
+98.947 2.147 98.796 2.091 98.689 1.985 c
+98.579 1.885 98.527 1.754 98.527 1.588 c
+98.527 1.459 98.565 1.353 98.646 1.264 c
+98.723 1.183 98.914 1.081 99.219 0.956 c
+99.697 0.769 100.027 0.581 100.204 0.397 c
+100.38 0.221 100.468 -0.007 100.468 -0.278 c
+100.468 -0.631 100.343 -0.911 100.1 -1.117 c
+99.865 -1.323 99.549 -1.425 99.16 -1.425 c
+98.737 -1.425 98.399 -1.308 98.145 -1.072 c
+97.889 -0.83 97.764 -0.525 97.764 -0.161 c
+98.411 -0.161 l
+98.417 -0.389 98.488 -0.565 98.616 -0.69 c
+98.741 -0.808 98.924 -0.866 99.16 -0.866 c
+99.373 -0.866 99.535 -0.819 99.645 -0.72 c
+99.763 -0.625 99.822 -0.496 99.822 -0.338 c
+102.159 3.587 m
+102.159 2.631 l
+102.761 2.631 l
+102.761 2.103 l
+102.159 2.103 l
+102.159 -0.367 l
+102.159 -0.525 102.18 -0.643 102.232 -0.72 c
+102.29 -0.801 102.379 -0.837 102.496 -0.837 c
+102.585 -0.837 102.673 -0.823 102.761 -0.793 c
+102.761 -1.352 l
+102.614 -1.4 102.46 -1.425 102.305 -1.425 c
+102.049 -1.425 101.854 -1.334 101.717 -1.146 c
+101.578 -0.962 101.511 -0.702 101.511 -0.367 c
+101.511 2.103 l
+100.909 2.103 l
+100.909 2.631 l
+101.511 2.631 l
+101.511 3.587 l
+h
+105.569 -1.352 m
+105.528 -1.263 105.503 -1.117 105.495 -0.911 c
+105.26 -1.256 104.966 -1.425 104.613 -1.425 c
+104.25 -1.425 103.967 -1.33 103.761 -1.132 c
+103.562 -0.926 103.466 -0.639 103.466 -0.264 c
+103.466 0.136 103.603 0.456 103.878 0.691 c
+104.15 0.934 104.526 1.058 104.996 1.058 c
+105.48 1.058 l
+105.48 1.485 l
+105.48 1.721 105.426 1.885 105.319 1.985 c
+105.209 2.091 105.047 2.147 104.834 2.147 c
+104.636 2.147 104.474 2.087 104.349 1.97 c
+104.231 1.852 104.172 1.706 104.172 1.529 c
+103.526 1.529 l
+103.526 1.723 103.585 1.915 103.701 2.103 c
+103.827 2.286 103.988 2.433 104.187 2.544 c
+104.393 2.65 104.621 2.705 104.877 2.705 c
+105.278 2.705 105.583 2.602 105.789 2.396 c
+106.003 2.191 106.116 1.897 106.128 1.515 c
+106.128 -0.5 l
+106.128 -0.804 106.164 -1.069 106.245 -1.294 c
+106.245 -1.352 l
+h
+104.701 -0.837 m
+104.867 -0.837 105.018 -0.793 105.157 -0.706 c
+105.304 -0.617 105.411 -0.507 105.48 -0.367 c
+105.48 0.574 l
+105.113 0.574 l
+104.797 0.574 104.555 0.504 104.378 0.368 c
+104.202 0.239 104.114 0.052 104.114 -0.191 c
+104.114 -0.419 104.158 -0.584 104.246 -0.69 c
+104.334 -0.789 104.485 -0.837 104.701 -0.837 c
+106.994 0.823 m
+106.994 1.441 107.105 1.904 107.333 2.22 c
+107.557 2.544 107.892 2.705 108.332 2.705 c
+108.733 2.705 109.037 2.529 109.243 2.176 c
+109.288 2.631 l
+109.876 2.631 l
+109.876 -1.396 l
+109.876 -1.884 109.747 -2.263 109.494 -2.528 c
+109.236 -2.792 108.883 -2.925 108.435 -2.925 c
+108.237 -2.925 108.016 -2.873 107.774 -2.778 c
+107.527 -2.678 107.348 -2.557 107.229 -2.41 c
+107.495 -1.969 l
+107.759 -2.234 108.056 -2.366 108.391 -2.366 c
+108.927 -2.366 109.203 -2.072 109.214 -1.484 c
+109.214 -0.955 l
+109.008 -1.271 108.707 -1.425 108.318 -1.425 c
+107.906 -1.425 107.583 -1.275 107.348 -0.97 c
+107.119 -0.658 107.002 -0.205 106.994 0.383 c
+h
+107.656 0.441 m
+107.656 0 107.718 -0.33 107.847 -0.544 c
+107.972 -0.749 108.189 -0.852 108.494 -0.852 c
+108.817 -0.852 109.056 -0.687 109.214 -0.353 c
+109.214 1.632 l
+109.045 1.956 108.806 2.117 108.494 2.117 c
+108.2 2.117 107.983 2.014 107.847 1.808 c
+107.718 1.603 107.656 1.279 107.656 0.838 c
+h
+112.257 -1.425 m
+111.757 -1.425 111.375 -1.278 111.111 -0.984 c
+110.845 -0.69 110.714 -0.257 110.714 0.324 c
+110.714 0.794 l
+110.714 1.389 110.838 1.856 111.096 2.191 c
+111.36 2.532 111.72 2.705 112.183 2.705 c
+112.642 2.705 112.985 2.55 113.212 2.249 c
+113.448 1.956 113.569 1.492 113.579 0.867 c
+113.579 0.441 l
+111.36 0.441 l
+111.36 0.353 l
+111.36 -0.08 111.437 -0.393 111.595 -0.588 c
+111.761 -0.775 111.992 -0.866 112.287 -0.866 c
+112.481 -0.866 112.654 -0.833 112.8 -0.764 c
+112.948 -0.687 113.083 -0.569 113.212 -0.411 c
+113.55 -0.823 l
+113.264 -1.227 112.834 -1.425 112.257 -1.425 c
+112.183 2.147 m
+111.908 2.147 111.705 2.051 111.581 1.867 c
+111.452 1.68 111.379 1.389 111.36 1 c
+112.933 1 l
+112.933 1.088 l
+112.911 1.47 112.845 1.738 112.727 1.897 c
+112.609 2.062 112.426 2.147 112.183 2.147 c
+114.226 0.823 m
+114.226 1.43 114.337 1.897 114.564 2.22 c
+114.799 2.544 115.127 2.705 115.549 2.705 c
+115.931 2.705 116.229 2.547 116.446 2.234 c
+116.446 4.293 l
+117.093 4.293 l
+117.093 -1.352 l
+116.505 -1.352 l
+116.461 -0.926 l
+116.255 -1.26 115.95 -1.425 115.549 -1.425 c
+115.138 -1.425 114.814 -1.271 114.579 -0.955 c
+114.344 -0.631 114.226 -0.176 114.226 0.412 c
+h
+114.874 0.441 m
+114.874 0 114.936 -0.33 115.065 -0.544 c
+115.2 -0.749 115.421 -0.852 115.726 -0.852 c
+116.05 -0.852 116.288 -0.69 116.446 -0.367 c
+116.446 1.646 l
+116.277 1.959 116.038 2.117 115.726 2.117 c
+115.421 2.117 115.2 2.014 115.065 1.808 c
+114.936 1.603 114.874 1.279 114.874 0.838 c
+h
+118.107 -2.425 m
+117.71 -2.16 l
+117.945 -1.837 118.067 -1.502 118.078 -1.161 c
+118.078 -0.544 l
+118.739 -0.544 l
+118.739 -1.072 l
+118.739 -1.33 118.673 -1.576 118.548 -1.822 c
+118.431 -2.065 118.283 -2.267 118.107 -2.425 c
+121.914 2.631 m
+121.929 2.264 l
+122.171 2.558 122.491 2.705 122.884 2.705 c
+123.325 2.705 123.634 2.507 123.811 2.117 c
+124.064 2.507 124.413 2.705 124.854 2.705 c
+125.589 2.705 125.964 2.242 125.986 1.324 c
+125.986 -1.352 l
+125.339 -1.352 l
+125.339 1.264 l
+125.339 1.559 125.284 1.771 125.178 1.912 c
+125.078 2.047 124.906 2.117 124.663 2.117 c
+124.465 2.117 124.303 2.037 124.178 1.881 c
+124.06 1.735 123.99 1.544 123.972 1.309 c
+123.972 -1.352 l
+123.31 -1.352 l
+123.31 1.294 l
+123.31 1.841 123.09 2.117 122.649 2.117 c
+122.315 2.117 122.08 1.956 121.943 1.632 c
+121.943 -1.352 l
+121.297 -1.352 l
+121.297 2.631 l
+h
+126.824 0.823 m
+126.824 1.401 126.959 1.856 127.235 2.191 c
+127.518 2.532 127.889 2.705 128.353 2.705 c
+128.812 2.705 129.18 2.536 129.455 2.205 c
+129.737 1.881 129.885 1.434 129.895 0.867 c
+129.895 0.441 l
+129.895 -0.128 129.752 -0.584 129.469 -0.926 c
+129.194 -1.26 128.827 -1.425 128.367 -1.425 c
+127.904 -1.425 127.533 -1.263 127.25 -0.941 c
+126.974 -0.61 126.831 -0.168 126.824 0.383 c
+h
+127.47 0.441 m
+127.47 0.038 127.547 -0.278 127.705 -0.514 c
+127.871 -0.749 128.091 -0.866 128.367 -0.866 c
+128.933 -0.866 129.227 -0.455 129.249 0.368 c
+129.249 0.823 l
+129.249 1.224 129.164 1.544 128.999 1.779 c
+128.841 2.022 128.624 2.147 128.353 2.147 c
+128.087 2.147 127.871 2.022 127.705 1.779 c
+127.547 1.544 127.47 1.224 127.47 0.823 c
+h
+130.601 0.823 m
+130.601 1.43 130.711 1.897 130.94 2.22 c
+131.175 2.544 131.501 2.705 131.924 2.705 c
+132.307 2.705 132.604 2.547 132.821 2.234 c
+132.821 4.293 l
+133.467 4.293 l
+133.467 -1.352 l
+132.879 -1.352 l
+132.835 -0.926 l
+132.629 -1.26 132.324 -1.425 131.924 -1.425 c
+131.513 -1.425 131.189 -1.271 130.954 -0.955 c
+130.719 -0.631 130.601 -0.176 130.601 0.412 c
+h
+131.248 0.441 m
+131.248 0 131.31 -0.33 131.439 -0.544 c
+131.575 -0.749 131.796 -0.852 132.101 -0.852 c
+132.424 -0.852 132.663 -0.69 132.821 -0.367 c
+132.821 1.646 l
+132.652 1.959 132.413 2.117 132.101 2.117 c
+131.796 2.117 131.575 2.014 131.439 1.808 c
+131.31 1.603 131.248 1.279 131.248 0.838 c
+h
+135.173 -1.352 -0.647 3.983 re
+135.216 3.675 m
+135.216 3.565 135.187 3.473 135.129 3.396 c
+135.069 3.326 134.974 3.293 134.849 3.293 c
+134.732 3.293 134.636 3.326 134.57 3.396 c
+134.511 3.473 134.482 3.565 134.482 3.675 c
+134.482 3.793 134.511 3.884 134.57 3.955 c
+134.636 4.032 134.732 4.072 134.849 4.072 c
+134.974 4.072 135.069 4.032 135.129 3.955 c
+135.187 3.874 135.216 3.782 135.216 3.675 c
+136.363 -1.352 m
+136.363 2.103 l
+135.848 2.103 l
+135.848 2.631 l
+136.363 2.631 l
+136.363 2.999 l
+136.371 3.429 136.484 3.763 136.702 3.998 c
+136.926 4.241 137.238 4.366 137.642 4.366 c
+137.789 4.366 137.928 4.344 138.069 4.308 c
+138.215 4.267 138.366 4.212 138.524 4.146 c
+138.406 3.572 l
+138.171 3.697 137.928 3.763 137.687 3.763 c
+137.44 3.763 137.267 3.693 137.172 3.558 c
+137.072 3.429 137.024 3.234 137.024 2.97 c
+137.024 2.631 l
+137.672 2.631 l
+137.672 2.103 l
+137.024 2.103 l
+137.024 -1.352 l
+h
+138.832 -1.352 -0.646 3.983 re
+141.302 -1.425 m
+140.802 -1.425 140.42 -1.278 140.155 -0.984 c
+139.891 -0.69 139.759 -0.257 139.759 0.324 c
+139.759 0.794 l
+139.759 1.389 139.883 1.856 140.141 2.191 c
+140.405 2.532 140.766 2.705 141.229 2.705 c
+141.688 2.705 142.03 2.55 142.258 2.249 c
+142.493 1.956 142.614 1.492 142.625 0.867 c
+142.625 0.441 l
+140.405 0.441 l
+140.405 0.353 l
+140.405 -0.08 140.483 -0.393 140.641 -0.588 c
+140.806 -0.775 141.038 -0.866 141.331 -0.866 c
+141.527 -0.866 141.699 -0.833 141.846 -0.764 c
+141.993 -0.687 142.129 -0.569 142.258 -0.411 c
+142.595 -0.823 l
+142.309 -1.227 141.879 -1.425 141.302 -1.425 c
+141.229 2.147 m
+140.953 2.147 140.751 2.051 140.626 1.867 c
+140.498 1.68 140.424 1.389 140.405 1 c
+141.978 1 l
+141.978 1.088 l
+141.957 1.47 141.89 1.738 141.772 1.897 c
+141.655 2.062 141.471 2.147 141.229 2.147 c
+143.272 0.823 m
+143.272 1.43 143.382 1.897 143.61 2.22 c
+143.845 2.544 144.172 2.705 144.594 2.705 c
+144.977 2.705 145.275 2.547 145.491 2.234 c
+145.491 4.293 l
+146.138 4.293 l
+146.138 -1.352 l
+145.55 -1.352 l
+145.506 -0.926 l
+145.3 -1.26 144.995 -1.425 144.594 -1.425 c
+144.183 -1.425 143.86 -1.271 143.625 -0.955 c
+143.389 -0.631 143.272 -0.176 143.272 0.412 c
+h
+143.918 0.441 m
+143.918 0 143.981 -0.33 144.11 -0.544 c
+144.245 -0.749 144.467 -0.852 144.771 -0.852 c
+145.094 -0.852 145.333 -0.69 145.491 -0.367 c
+145.491 1.646 l
+145.323 1.959 145.084 2.117 144.771 2.117 c
+144.467 2.117 144.245 2.014 144.11 1.808 c
+143.981 1.603 143.918 1.279 143.918 0.838 c
+h
+149.034 -1.352 m
+149.034 2.103 l
+148.519 2.103 l
+148.519 2.631 l
+149.034 2.631 l
+149.034 2.999 l
+149.041 3.429 149.155 3.763 149.372 3.998 c
+149.596 4.241 149.909 4.366 150.312 4.366 c
+150.46 4.366 150.599 4.344 150.738 4.308 c
+150.886 4.267 151.037 4.212 151.195 4.146 c
+151.077 3.572 l
+150.842 3.697 150.599 3.763 150.357 3.763 c
+150.111 3.763 149.938 3.693 149.842 3.558 c
+149.743 3.429 149.695 3.234 149.695 2.97 c
+149.695 2.631 l
+150.342 2.631 l
+150.342 2.103 l
+149.695 2.103 l
+149.695 -1.352 l
+h
+151.503 -1.352 -0.646 3.983 re
+153.252 -1.352 -0.646 5.644 re
+155.692 -1.425 m
+155.193 -1.425 154.811 -1.278 154.546 -0.984 c
+154.281 -0.69 154.15 -0.257 154.15 0.324 c
+154.15 0.794 l
+154.15 1.389 154.274 1.856 154.531 2.191 c
+154.796 2.532 155.156 2.705 155.619 2.705 c
+156.078 2.705 156.421 2.55 156.648 2.249 c
+156.883 1.956 157.005 1.492 157.015 0.867 c
+157.015 0.441 l
+154.796 0.441 l
+154.796 0.353 l
+154.796 -0.08 154.873 -0.393 155.031 -0.588 c
+155.197 -0.775 155.428 -0.866 155.722 -0.866 c
+155.916 -0.866 156.089 -0.833 156.236 -0.764 c
+156.383 -0.687 156.519 -0.569 156.648 -0.411 c
+156.986 -0.823 l
+156.699 -1.227 156.269 -1.425 155.692 -1.425 c
+155.619 2.147 m
+155.343 2.147 155.141 2.051 155.016 1.867 c
+154.888 1.68 154.815 1.389 154.796 1 c
+156.369 1 l
+156.369 1.088 l
+156.346 1.47 156.28 1.738 156.163 1.897 c
+156.045 2.062 155.862 2.147 155.619 2.147 c
+159.735 -0.338 m
+159.735 -0.191 159.679 -0.07 159.573 0.03 c
+159.463 0.125 159.257 0.243 158.956 0.383 c
+158.611 0.53 158.368 0.651 158.221 0.75 c
+158.073 0.857 157.963 0.975 157.897 1.103 c
+157.828 1.228 157.794 1.386 157.794 1.573 c
+157.794 1.897 157.913 2.165 158.148 2.382 c
+158.383 2.595 158.684 2.705 159.058 2.705 c
+159.44 2.705 159.75 2.591 159.985 2.367 c
+160.22 2.139 160.338 1.852 160.338 1.5 c
+159.691 1.5 l
+159.691 1.676 159.632 1.827 159.515 1.956 c
+159.397 2.08 159.243 2.147 159.058 2.147 c
+158.86 2.147 158.709 2.091 158.603 1.985 c
+158.493 1.885 158.441 1.754 158.441 1.588 c
+158.441 1.459 158.478 1.353 158.559 1.264 c
+158.636 1.183 158.827 1.081 159.132 0.956 c
+159.61 0.769 159.941 0.581 160.117 0.397 c
+160.294 0.221 160.381 -0.007 160.381 -0.278 c
+160.381 -0.631 160.257 -0.911 160.014 -1.117 c
+159.779 -1.323 159.463 -1.425 159.073 -1.425 c
+158.651 -1.425 158.312 -1.308 158.059 -1.072 c
+157.802 -0.83 157.677 -0.525 157.677 -0.161 c
+158.324 -0.161 l
+158.331 -0.389 158.401 -0.565 158.53 -0.69 c
+158.655 -0.808 158.838 -0.866 159.073 -0.866 c
+159.286 -0.866 159.448 -0.819 159.559 -0.72 c
+159.675 -0.625 159.735 -0.496 159.735 -0.338 c
+161.263 -0.999 m
+161.263 -0.881 161.296 -0.786 161.366 -0.706 c
+161.433 -0.628 161.535 -0.588 161.675 -0.588 c
+161.822 -0.588 161.929 -0.628 161.998 -0.706 c
+162.075 -0.786 162.116 -0.881 162.116 -0.999 c
+162.116 -1.109 162.075 -1.201 161.998 -1.278 c
+161.929 -1.356 161.822 -1.396 161.675 -1.396 c
+161.535 -1.396 161.433 -1.356 161.366 -1.278 c
+161.296 -1.201 161.263 -1.109 161.263 -0.999 c
+168.377 0.353 m
+168.348 -0.228 168.186 -0.668 167.893 -0.97 c
+167.598 -1.275 167.18 -1.425 166.644 -1.425 c
+166.114 -1.425 165.688 -1.227 165.364 -0.823 c
+165.048 -0.411 164.894 0.148 164.894 0.853 c
+164.894 1.823 l
+164.894 2.517 165.056 3.065 165.379 3.469 c
+165.703 3.87 166.147 4.072 166.717 4.072 c
+167.224 4.072 167.621 3.914 167.907 3.602 c
+168.19 3.296 168.348 2.856 168.377 2.278 c
+167.687 2.278 l
+167.658 2.72 167.562 3.032 167.407 3.219 c
+167.261 3.404 167.029 3.499 166.717 3.499 c
+166.342 3.499 166.059 3.352 165.865 3.057 c
+165.666 2.771 165.57 2.356 165.57 1.808 c
+165.57 0.823 l
+165.57 0.283 165.662 -0.132 165.85 -0.426 c
+166.033 -0.712 166.298 -0.852 166.644 -0.852 c
+166.996 -0.852 167.249 -0.764 167.407 -0.588 c
+167.562 -0.411 167.658 -0.099 167.687 0.353 c
+h
+171.215 -0.999 m
+170.998 -1.286 170.686 -1.425 170.274 -1.425 c
+169.91 -1.425 169.634 -1.304 169.451 -1.058 c
+169.275 -0.804 169.179 -0.44 169.171 0.03 c
+169.171 2.631 l
+169.819 2.631 l
+169.819 0.088 l
+169.819 -0.54 170.002 -0.852 170.377 -0.852 c
+170.777 -0.852 171.053 -0.675 171.2 -0.323 c
+171.2 2.631 l
+171.847 2.631 l
+171.847 -1.352 l
+171.23 -1.352 l
+h
+174.478 2.014 m
+174.39 2.033 174.291 2.043 174.184 2.043 c
+173.85 2.043 173.614 1.86 173.478 1.5 c
+173.478 -1.352 l
+172.832 -1.352 l
+172.832 2.631 l
+173.464 2.631 l
+173.478 2.22 l
+173.655 2.544 173.898 2.705 174.214 2.705 c
+174.32 2.705 174.408 2.683 174.478 2.646 c
+h
+176.771 2.014 m
+176.683 2.033 176.583 2.043 176.477 2.043 c
+176.142 2.043 175.907 1.86 175.772 1.5 c
+175.772 -1.352 l
+175.124 -1.352 l
+175.124 2.631 l
+175.756 2.631 l
+175.772 2.22 l
+175.947 2.544 176.19 2.705 176.506 2.705 c
+176.613 2.705 176.701 2.683 176.771 2.646 c
+h
+178.77 -1.425 m
+178.27 -1.425 177.888 -1.278 177.624 -0.984 c
+177.359 -0.69 177.227 -0.257 177.227 0.324 c
+177.227 0.794 l
+177.227 1.389 177.352 1.856 177.609 2.191 c
+177.873 2.532 178.233 2.705 178.696 2.705 c
+179.156 2.705 179.498 2.55 179.725 2.249 c
+179.961 1.956 180.082 1.492 180.093 0.867 c
+180.093 0.441 l
+177.873 0.441 l
+177.873 0.353 l
+177.873 -0.08 177.95 -0.393 178.108 -0.588 c
+178.274 -0.775 178.505 -0.866 178.8 -0.866 c
+178.994 -0.866 179.167 -0.833 179.314 -0.764 c
+179.461 -0.687 179.597 -0.569 179.725 -0.411 c
+180.063 -0.823 l
+179.777 -1.227 179.347 -1.425 178.77 -1.425 c
+178.696 2.147 m
+178.421 2.147 178.218 2.051 178.094 1.867 c
+177.965 1.68 177.892 1.389 177.873 1 c
+179.446 1 l
+179.446 1.088 l
+179.424 1.47 179.358 1.738 179.24 1.897 c
+179.122 2.062 178.939 2.147 178.696 2.147 c
+181.489 2.631 m
+181.504 2.191 l
+181.757 2.532 182.081 2.705 182.474 2.705 c
+183.18 2.705 183.536 2.234 183.548 1.294 c
+183.548 -1.352 l
+182.9 -1.352 l
+182.9 1.264 l
+182.9 1.577 182.845 1.798 182.739 1.926 c
+182.629 2.051 182.474 2.117 182.268 2.117 c
+182.11 2.117 181.964 2.062 181.827 1.956 c
+181.699 1.845 181.596 1.709 181.518 1.544 c
+181.518 -1.352 l
+180.872 -1.352 l
+180.872 2.631 l
+h
+185.37 3.587 m
+185.37 2.631 l
+185.973 2.631 l
+185.973 2.103 l
+185.37 2.103 l
+185.37 -0.367 l
+185.37 -0.525 185.392 -0.643 185.443 -0.72 c
+185.503 -0.801 185.59 -0.837 185.708 -0.837 c
+185.796 -0.837 185.884 -0.823 185.973 -0.793 c
+185.973 -1.352 l
+185.825 -1.4 185.671 -1.425 185.517 -1.425 c
+185.26 -1.425 185.065 -1.334 184.929 -1.146 c
+184.789 -0.962 184.724 -0.702 184.724 -0.367 c
+184.724 2.103 l
+184.121 2.103 l
+184.121 2.631 l
+184.724 2.631 l
+184.724 3.587 l
+h
+191.338 0.441 m
+191.338 -0.176 191.224 -0.643 190.999 -0.955 c
+190.783 -1.271 190.459 -1.425 190.029 -1.425 c
+189.607 -1.425 189.295 -1.246 189.089 -0.881 c
+189.059 -1.352 l
+188.456 -1.352 l
+188.456 4.293 l
+189.104 4.293 l
+189.104 2.191 l
+189.316 2.532 189.625 2.705 190.029 2.705 c
+190.459 2.705 190.783 2.547 190.999 2.234 c
+191.224 1.929 191.338 1.463 191.338 0.838 c
+h
+190.691 0.823 m
+190.691 1.294 190.621 1.625 190.485 1.823 c
+190.357 2.018 190.147 2.117 189.853 2.117 c
+189.519 2.117 189.269 1.933 189.104 1.573 c
+189.104 -0.309 l
+189.269 -0.672 189.522 -0.852 189.868 -0.852 c
+190.162 -0.852 190.371 -0.749 190.5 -0.544 c
+190.625 -0.338 190.691 -0.022 190.691 0.412 c
+h
+193.822 2.014 m
+193.734 2.033 193.634 2.043 193.528 2.043 c
+193.193 2.043 192.958 1.86 192.822 1.5 c
+192.822 -1.352 l
+192.175 -1.352 l
+192.175 2.631 l
+192.807 2.631 l
+192.822 2.22 l
+192.998 2.544 193.241 2.705 193.557 2.705 c
+193.663 2.705 193.752 2.683 193.822 2.646 c
+h
+196.364 -1.352 m
+196.325 -1.263 196.298 -1.117 196.291 -0.911 c
+196.056 -1.256 195.762 -1.425 195.409 -1.425 c
+195.045 -1.425 194.762 -1.33 194.557 -1.132 c
+194.359 -0.926 194.263 -0.639 194.263 -0.264 c
+194.263 0.136 194.399 0.456 194.675 0.691 c
+194.947 0.934 195.321 1.058 195.791 1.058 c
+196.277 1.058 l
+196.277 1.485 l
+196.277 1.721 196.221 1.885 196.115 1.985 c
+196.005 2.091 195.843 2.147 195.63 2.147 c
+195.431 2.147 195.269 2.087 195.145 1.97 c
+195.027 1.852 194.968 1.706 194.968 1.529 c
+194.322 1.529 l
+194.322 1.723 194.38 1.915 194.498 2.103 c
+194.623 2.286 194.785 2.433 194.983 2.544 c
+195.188 2.65 195.417 2.705 195.674 2.705 c
+196.075 2.705 196.379 2.602 196.585 2.396 c
+196.798 2.191 196.913 1.897 196.923 1.515 c
+196.923 -0.5 l
+196.923 -0.804 196.96 -1.069 197.041 -1.294 c
+197.041 -1.352 l
+h
+195.498 -0.837 m
+195.662 -0.837 195.814 -0.793 195.953 -0.706 c
+196.1 -0.617 196.207 -0.507 196.277 -0.367 c
+196.277 0.574 l
+195.909 0.574 l
+195.593 0.574 195.35 0.504 195.174 0.368 c
+194.997 0.239 194.91 0.052 194.91 -0.191 c
+194.91 -0.419 194.953 -0.584 195.042 -0.69 c
+195.13 -0.789 195.281 -0.837 195.498 -0.837 c
+198.54 2.631 m
+198.555 2.191 l
+198.808 2.532 199.132 2.705 199.525 2.705 c
+200.231 2.705 200.587 2.234 200.598 1.294 c
+200.598 -1.352 l
+199.951 -1.352 l
+199.951 1.264 l
+199.951 1.577 199.896 1.798 199.79 1.926 c
+199.679 2.051 199.525 2.117 199.319 2.117 c
+199.161 2.117 199.014 2.062 198.878 1.956 c
+198.75 1.845 198.647 1.709 198.569 1.544 c
+198.569 -1.352 l
+197.923 -1.352 l
+197.923 2.631 l
+h
+202.949 -0.866 m
+203.163 -0.866 203.336 -0.804 203.464 -0.675 c
+203.6 -0.54 203.674 -0.349 203.685 -0.103 c
+204.302 -0.103 l
+204.281 -0.484 204.144 -0.804 203.89 -1.058 c
+203.633 -1.304 203.321 -1.425 202.949 -1.425 c
+202.457 -1.425 202.083 -1.275 201.818 -0.97 c
+201.561 -0.658 201.436 -0.191 201.436 0.427 c
+201.436 0.867 l
+201.436 1.463 201.561 1.919 201.818 2.234 c
+202.083 2.547 202.457 2.705 202.949 2.705 c
+203.35 2.705 203.67 2.573 203.905 2.309 c
+204.148 2.051 204.281 1.706 204.302 1.264 c
+203.685 1.264 l
+203.663 1.559 203.589 1.779 203.464 1.926 c
+203.346 2.073 203.174 2.147 202.949 2.147 c
+202.656 2.147 202.44 2.047 202.303 1.852 c
+202.164 1.665 202.09 1.357 202.083 0.927 c
+202.083 0.412 l
+202.083 -0.058 202.149 -0.393 202.288 -0.588 c
+202.436 -0.775 202.656 -0.866 202.949 -0.866 c
+205.698 2.22 m
+205.952 2.544 206.272 2.705 206.654 2.705 c
+207.36 2.705 207.716 2.234 207.728 1.294 c
+207.728 -1.352 l
+207.08 -1.352 l
+207.08 1.264 l
+207.08 1.577 207.026 1.798 206.918 1.926 c
+206.808 2.051 206.654 2.117 206.448 2.117 c
+206.29 2.117 206.143 2.062 206.007 1.956 c
+205.879 1.845 205.775 1.709 205.698 1.544 c
+205.698 -1.352 l
+205.052 -1.352 l
+205.052 4.293 l
+205.698 4.293 l
+h
+208.727 -0.999 m
+208.727 -0.881 208.759 -0.786 208.829 -0.706 c
+208.896 -0.628 208.998 -0.588 209.139 -0.588 c
+209.285 -0.588 209.392 -0.628 209.461 -0.706 c
+209.538 -0.786 209.579 -0.881 209.579 -0.999 c
+209.579 -1.109 209.538 -1.201 209.461 -1.278 c
+209.392 -1.356 209.285 -1.396 209.139 -1.396 c
+208.998 -1.396 208.896 -1.356 208.829 -1.278 c
+208.759 -1.201 208.727 -1.109 208.727 -0.999 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 383.129 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 376.2903 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.807 l
+-1.896 -1.807 l
+-1.896 -1.263 l
+-2.142 -1.256 -2.359 -1.219 -2.543 -1.161 c
+-2.719 -1.102 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.514 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.662 l
+-1.907 0.662 -1.926 0.666 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.485 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.132 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.132 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.485 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.368 l
+-1.514 1.368 l
+-1.506 1.368 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.743 -0.132 0.588 c
+-0.044 0.431 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.485 -2.19 2.455 c
+-2.26 2.426 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.191 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.838 -2.439 1.779 c
+-2.41 1.721 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.395 c
+5.284 -2.314 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.219 6.034 -1.219 c
+5.829 -1.219 5.644 -1.182 5.49 -1.102 c
+5.343 -1.014 5.215 -0.897 5.108 -0.749 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.019 4.888 1.235 c
+4.946 1.449 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.919 7.107 1.97 c
+7.115 2.029 7.122 2.077 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.414 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.16 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.743 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.368 c
+5.88 1.279 5.835 1.162 5.799 1.015 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.514 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.293 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.603 l
+9.199 1.603 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.603 m
+13.053 1.603 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.603 l
+14.494 1.603 l
+14.494 -0.103 l
+14.494 -0.323 l
+14.501 -0.392 14.523 -0.455 14.552 -0.514 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.675 14.905 -0.69 15.052 -0.69 c
+15.188 -0.69 15.324 -0.687 15.464 -0.675 c
+15.599 -0.658 15.732 -0.631 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.215 15.703 -1.23 15.626 -1.249 c
+15.545 -1.26 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.3 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.263 c
+14.218 -1.227 14.104 -1.182 14.009 -1.132 c
+13.92 -1.084 13.847 -1.024 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.631 13.604 -0.544 13.597 -0.455 c
+13.586 -0.359 13.582 -0.264 13.582 -0.176 c
+h
+23.295 -1.263 m
+23.283 -1.246 23.273 -1.215 23.265 -1.176 c
+23.265 -1.128 23.258 -1.08 23.25 -1.028 c
+23.25 -0.97 23.243 -0.911 23.236 -0.852 c
+23.236 -0.69 l
+23.118 -0.926 22.975 -1.095 22.809 -1.19 c
+22.641 -1.278 22.442 -1.323 22.207 -1.323 c
+22.009 -1.323 21.832 -1.278 21.677 -1.19 c
+21.519 -1.102 21.388 -0.98 21.28 -0.823 c
+21.182 -0.658 21.105 -0.467 21.045 -0.249 c
+20.994 -0.037 20.972 0.206 20.972 0.47 c
+20.972 0.736 20.994 0.975 21.045 1.191 c
+21.105 1.415 21.182 1.607 21.28 1.764 c
+21.388 1.919 21.519 2.043 21.677 2.132 c
+21.843 2.228 22.034 2.278 22.251 2.278 c
+22.346 2.278 22.442 2.264 22.531 2.234 c
+22.626 2.213 22.722 2.18 22.809 2.132 c
+22.898 2.08 22.975 2.018 23.044 1.941 c
+23.121 1.86 23.185 1.768 23.236 1.661 c
+23.236 1.75 l
+23.236 1.897 l
+23.236 2.058 l
+23.236 2.234 l
+23.236 3.514 l
+24.133 3.514 l
+24.133 -0.5 l
+24.133 -0.675 24.137 -0.833 24.147 -0.97 c
+24.154 -1.098 24.162 -1.198 24.162 -1.263 c
+h
+23.25 0.485 m
+23.25 0.721 23.225 0.912 23.177 1.058 c
+23.137 1.214 23.081 1.338 23.015 1.426 c
+22.957 1.515 22.886 1.573 22.809 1.603 c
+22.728 1.64 22.651 1.661 22.574 1.661 c
+22.475 1.661 22.383 1.636 22.296 1.588 c
+22.215 1.548 22.148 1.478 22.09 1.382 c
+22.038 1.283 21.994 1.162 21.957 1.015 c
+21.928 0.867 21.913 0.684 21.913 0.47 c
+21.913 0.078 21.964 -0.216 22.074 -0.411 c
+22.192 -0.61 22.354 -0.706 22.56 -0.706 c
+22.637 -0.706 22.714 -0.687 22.795 -0.646 c
+22.872 -0.61 22.946 -0.544 23.015 -0.455 c
+23.081 -0.367 23.137 -0.246 23.177 -0.087 c
+23.225 0.067 23.25 0.258 23.25 0.485 c
+27.281 -0.646 m
+28.413 -0.646 l
+28.413 -1.263 l
+25.106 -1.263 l
+25.106 -0.646 l
+26.371 -0.646 l
+26.371 1.603 l
+25.444 1.603 l
+25.444 2.22 l
+27.281 2.22 l
+h
+26.371 3.514 0.911 -0.676 re
+26.371 2.837 m
+30.886 1.603 m
+30.886 -1.263 l
+29.99 -1.263 l
+29.99 1.603 l
+29.167 1.603 l
+29.167 2.22 l
+29.99 2.22 l
+29.99 2.485 l
+29.99 2.61 30.005 2.742 30.034 2.882 c
+30.071 3.018 30.14 3.135 30.24 3.234 c
+30.346 3.341 30.489 3.429 30.666 3.499 c
+30.842 3.565 31.067 3.602 31.343 3.602 c
+31.555 3.602 31.754 3.591 31.931 3.572 c
+32.107 3.55 32.257 3.532 32.386 3.514 c
+32.386 2.926 l
+32.257 2.944 32.114 2.959 31.96 2.97 c
+31.802 2.977 31.651 2.984 31.504 2.984 c
+31.376 2.984 31.272 2.97 31.195 2.94 c
+31.114 2.911 31.052 2.87 31.004 2.822 c
+30.953 2.771 30.919 2.708 30.901 2.631 c
+30.89 2.562 30.886 2.485 30.886 2.396 c
+30.886 2.22 l
+32.313 2.22 l
+32.313 1.603 l
+h
+34.948 1.603 m
+34.948 -1.263 l
+34.051 -1.263 l
+34.051 1.603 l
+33.228 1.603 l
+33.228 2.22 l
+34.051 2.22 l
+34.051 2.485 l
+34.051 2.61 34.065 2.742 34.094 2.882 c
+34.132 3.018 34.202 3.135 34.3 3.234 c
+34.407 3.341 34.551 3.429 34.726 3.499 c
+34.903 3.565 35.127 3.602 35.403 3.602 c
+35.616 3.602 35.815 3.591 35.991 3.572 c
+36.168 3.55 36.318 3.532 36.446 3.514 c
+36.446 2.926 l
+36.318 2.944 36.174 2.959 36.02 2.97 c
+35.862 2.977 35.711 2.984 35.565 2.984 c
+35.436 2.984 35.333 2.97 35.256 2.94 c
+35.175 2.911 35.112 2.87 35.065 2.822 c
+35.013 2.771 34.98 2.708 34.962 2.631 c
+34.951 2.562 34.948 2.485 34.948 2.396 c
+34.948 2.22 l
+36.373 2.22 l
+36.373 1.603 l
+h
+42.175 -2.63 m
+42.175 3.514 l
+44.101 3.514 l
+44.101 2.897 l
+43.028 2.897 l
+43.028 -2.013 l
+44.101 -2.013 l
+44.101 -2.63 l
+h
+47.133 1.603 m
+47.133 -1.263 l
+46.236 -1.263 l
+46.236 1.603 l
+45.413 1.603 l
+45.413 2.22 l
+46.236 2.22 l
+46.236 2.485 l
+46.236 2.61 46.251 2.742 46.281 2.882 c
+46.317 3.018 46.387 3.135 46.486 3.234 c
+46.593 3.341 46.736 3.429 46.912 3.499 c
+47.089 3.565 47.313 3.602 47.588 3.602 c
+47.802 3.602 48 3.591 48.176 3.572 c
+48.353 3.55 48.504 3.532 48.632 3.514 c
+48.632 2.926 l
+48.504 2.944 48.361 2.959 48.205 2.97 c
+48.047 2.977 47.897 2.984 47.75 2.984 c
+47.621 2.984 47.519 2.97 47.441 2.94 c
+47.361 2.911 47.298 2.87 47.251 2.822 c
+47.199 2.771 47.166 2.708 47.147 2.631 c
+47.137 2.562 47.133 2.485 47.133 2.396 c
+47.133 2.22 l
+48.558 2.22 l
+48.558 1.603 l
+h
+51.649 -0.646 m
+52.781 -0.646 l
+52.781 -1.263 l
+49.473 -1.263 l
+49.473 -0.646 l
+50.738 -0.646 l
+50.738 1.603 l
+49.812 1.603 l
+49.812 2.22 l
+51.649 2.22 l
+h
+50.738 3.514 0.912 -0.676 re
+50.738 2.837 m
+55.71 -0.646 m
+56.841 -0.646 l
+56.841 -1.263 l
+53.535 -1.263 l
+53.535 -0.646 l
+54.798 -0.646 l
+54.798 2.897 l
+53.872 2.897 l
+53.872 3.514 l
+55.71 3.514 l
+h
+59.23 -1.323 m
+58.973 -1.323 58.745 -1.286 58.539 -1.219 c
+58.333 -1.142 58.157 -1.028 58.01 -0.881 c
+57.863 -0.727 57.745 -0.536 57.657 -0.309 c
+57.576 -0.084 57.539 0.181 57.539 0.485 c
+57.539 0.817 57.584 1.096 57.672 1.324 c
+57.768 1.559 57.896 1.742 58.054 1.881 c
+58.22 2.018 58.407 2.117 58.613 2.176 c
+58.819 2.242 59.028 2.278 59.245 2.278 c
+59.517 2.278 59.752 2.228 59.951 2.132 c
+60.157 2.043 60.321 1.912 60.45 1.735 c
+60.586 1.566 60.685 1.36 60.744 1.118 c
+60.81 0.882 60.847 0.618 60.847 0.324 c
+60.847 0.31 l
+58.48 0.31 l
+58.48 0.162 58.495 0.023 58.524 -0.103 c
+58.561 -0.231 58.617 -0.345 58.686 -0.44 c
+58.752 -0.529 58.837 -0.598 58.936 -0.646 c
+59.031 -0.698 59.145 -0.72 59.274 -0.72 c
+59.428 -0.72 59.569 -0.687 59.686 -0.617 c
+59.81 -0.55 59.899 -0.448 59.951 -0.309 c
+60.788 -0.382 l
+60.759 -0.481 60.704 -0.588 60.627 -0.706 c
+60.546 -0.816 60.443 -0.918 60.317 -1.014 c
+60.2 -1.102 60.046 -1.176 59.862 -1.234 c
+59.686 -1.294 59.473 -1.323 59.23 -1.323 c
+59.23 1.706 m
+59.141 1.706 59.054 1.691 58.966 1.661 c
+58.877 1.632 58.796 1.58 58.73 1.515 c
+58.661 1.445 58.602 1.357 58.554 1.25 c
+58.514 1.139 58.495 1.015 58.495 0.867 c
+59.965 0.867 l
+59.965 1.004 59.939 1.125 59.891 1.235 c
+59.851 1.341 59.796 1.43 59.729 1.5 c
+59.671 1.566 59.598 1.617 59.509 1.646 c
+59.421 1.684 59.326 1.706 59.23 1.706 c
+62.1 -2.63 m
+62.1 -2.013 l
+63.173 -2.013 l
+63.173 2.897 l
+62.1 2.897 l
+62.1 3.514 l
+64.026 3.514 l
+64.026 -2.63 l
+h
+f
+Q
+q 1 0 0 1 346.0048 361.4887 cm
+0 0 m
+0 0.264 -0.073 0.463 -0.22 0.603 c
+-0.359 0.75 -0.617 0.889 -0.999 1.029 c
+-1.374 1.165 -1.66 1.309 -1.866 1.455 c
+-2.065 1.602 -2.212 1.768 -2.308 1.955 c
+-2.406 2.15 -2.454 2.371 -2.454 2.616 c
+-2.454 3.036 -2.315 3.385 -2.028 3.66 c
+-1.745 3.932 -1.377 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.087 3.851 c
+0.154 3.711 0.342 3.516 0.47 3.263 c
+0.607 3.017 0.676 2.749 0.676 2.454 c
+0 2.454 l
+0 2.786 -0.081 3.042 -0.235 3.219 c
+-0.393 3.403 -0.625 3.499 -0.926 3.499 c
+-1.19 3.499 -1.404 3.418 -1.558 3.263 c
+-1.705 3.117 -1.778 2.903 -1.778 2.631 c
+-1.778 2.404 -1.701 2.213 -1.543 2.058 c
+-1.377 1.911 -1.124 1.771 -0.779 1.646 c
+-0.261 1.477 0.111 1.268 0.339 1.014 c
+0.574 0.757 0.691 0.426 0.691 0.015 c
+0.691 -0.426 0.548 -0.779 0.265 -1.043 c
+-0.022 -1.301 -0.404 -1.426 -0.881 -1.426 c
+-1.198 -1.426 -1.484 -1.356 -1.749 -1.22 c
+-2.013 -1.084 -2.227 -0.893 -2.381 -0.646 c
+-2.528 -0.405 -2.601 -0.118 -2.601 0.206 c
+-1.925 0.206 l
+-1.925 -0.129 -1.833 -0.389 -1.646 -0.573 c
+-1.462 -0.76 -1.205 -0.852 -0.881 -0.852 c
+-0.588 -0.852 -0.367 -0.779 -0.22 -0.632 c
+-0.073 -0.478 0 -0.264 0 0 c
+2.117 2.219 m
+2.371 2.543 2.691 2.705 3.072 2.705 c
+3.778 2.705 4.135 2.234 4.146 1.294 c
+4.146 -1.352 l
+3.499 -1.352 l
+3.499 1.264 l
+3.499 1.577 3.444 1.797 3.337 1.926 c
+3.227 2.051 3.072 2.117 2.866 2.117 c
+2.708 2.117 2.562 2.062 2.425 1.955 c
+2.297 1.845 2.194 1.709 2.117 1.544 c
+2.117 -1.352 l
+1.47 -1.352 l
+1.47 4.293 l
+2.117 4.293 l
+h
+4.969 0.823 m
+4.969 1.4 5.104 1.856 5.38 2.19 c
+5.663 2.532 6.034 2.705 6.498 2.705 c
+6.957 2.705 7.325 2.535 7.599 2.205 c
+7.882 1.881 8.03 1.434 8.04 0.867 c
+8.04 0.441 l
+8.04 -0.129 7.898 -0.584 7.614 -0.926 c
+7.339 -1.261 6.972 -1.426 6.512 -1.426 c
+6.049 -1.426 5.678 -1.264 5.395 -0.941 c
+5.12 -0.61 4.976 -0.169 4.969 0.382 c
+h
+5.615 0.441 m
+5.615 0.037 5.692 -0.279 5.85 -0.515 c
+6.016 -0.75 6.236 -0.867 6.512 -0.867 c
+7.078 -0.867 7.372 -0.455 7.394 0.368 c
+7.394 0.823 l
+7.394 1.224 7.31 1.544 7.144 1.779 c
+6.986 2.022 6.77 2.146 6.498 2.146 c
+6.232 2.146 6.016 2.022 5.85 1.779 c
+5.692 1.544 5.615 1.224 5.615 0.823 c
+h
+11.848 -0.206 m
+12.451 2.631 l
+13.097 2.631 l
+12.112 -1.352 l
+11.597 -1.352 l
+10.819 1.5 l
+10.07 -1.352 l
+9.54 -1.352 l
+8.584 2.631 l
+9.216 2.631 l
+9.834 -0.133 l
+10.569 2.631 l
+11.084 2.631 l
+h
+16.875 -0.867 m
+17.088 -0.867 17.261 -0.804 17.39 -0.676 c
+17.525 -0.54 17.598 -0.349 17.61 -0.103 c
+18.227 -0.103 l
+18.205 -0.485 18.069 -0.804 17.816 -1.058 c
+17.558 -1.305 17.246 -1.426 16.875 -1.426 c
+16.382 -1.426 16.008 -1.275 15.743 -0.97 c
+15.486 -0.658 15.36 -0.191 15.36 0.426 c
+15.36 0.867 l
+15.36 1.463 15.486 1.918 15.743 2.234 c
+16.008 2.547 16.382 2.705 16.875 2.705 c
+17.276 2.705 17.596 2.572 17.831 2.308 c
+18.073 2.051 18.205 1.706 18.227 1.264 c
+17.61 1.264 l
+17.588 1.558 17.515 1.779 17.39 1.926 c
+17.272 2.072 17.099 2.146 16.875 2.146 c
+16.581 2.146 16.364 2.047 16.228 1.852 c
+16.089 1.665 16.015 1.357 16.008 0.926 c
+16.008 0.412 l
+16.008 -0.058 16.073 -0.393 16.214 -0.588 c
+16.36 -0.775 16.581 -0.867 16.875 -0.867 c
+19.624 2.219 m
+19.877 2.543 20.197 2.705 20.579 2.705 c
+21.284 2.705 21.641 2.234 21.652 1.294 c
+21.652 -1.352 l
+21.005 -1.352 l
+21.005 1.264 l
+21.005 1.577 20.95 1.797 20.844 1.926 c
+20.733 2.051 20.579 2.117 20.374 2.117 c
+20.216 2.117 20.068 2.062 19.932 1.955 c
+19.804 1.845 19.701 1.709 19.624 1.544 c
+19.624 -1.352 l
+18.977 -1.352 l
+18.977 4.293 l
+19.624 4.293 l
+h
+24.651 -1.352 m
+24.611 -1.264 24.584 -1.117 24.577 -0.912 c
+24.342 -1.257 24.048 -1.426 23.695 -1.426 c
+23.331 -1.426 23.048 -1.33 22.843 -1.132 c
+22.645 -0.926 22.549 -0.64 22.549 -0.264 c
+22.549 0.136 22.685 0.455 22.961 0.69 c
+23.232 0.933 23.607 1.058 24.077 1.058 c
+24.563 1.058 l
+24.563 1.484 l
+24.563 1.72 24.507 1.885 24.401 1.984 c
+24.291 2.091 24.129 2.146 23.915 2.146 c
+23.717 2.146 23.555 2.087 23.431 1.97 c
+23.313 1.852 23.254 1.706 23.254 1.529 c
+22.608 1.529 l
+22.608 1.723 22.666 1.914 22.784 2.102 c
+22.909 2.286 23.071 2.433 23.269 2.543 c
+23.475 2.65 23.703 2.705 23.96 2.705 c
+24.36 2.705 24.665 2.602 24.871 2.396 c
+25.084 2.19 25.199 1.897 25.209 1.514 c
+25.209 -0.5 l
+25.209 -0.804 25.246 -1.07 25.327 -1.294 c
+25.327 -1.352 l
+h
+23.784 -0.838 m
+23.948 -0.838 24.1 -0.794 24.239 -0.706 c
+24.386 -0.617 24.493 -0.507 24.563 -0.368 c
+24.563 0.573 l
+24.195 0.573 l
+23.879 0.573 23.636 0.503 23.46 0.368 c
+23.283 0.239 23.196 0.052 23.196 -0.191 c
+23.196 -0.419 23.24 -0.584 23.328 -0.691 c
+23.416 -0.79 23.566 -0.838 23.784 -0.838 c
+26.826 2.631 m
+26.841 2.19 l
+27.094 2.532 27.418 2.705 27.811 2.705 c
+28.517 2.705 28.873 2.234 28.884 1.294 c
+28.884 -1.352 l
+28.237 -1.352 l
+28.237 1.264 l
+28.237 1.577 28.182 1.797 28.075 1.926 c
+27.965 2.051 27.811 2.117 27.605 2.117 c
+27.447 2.117 27.3 2.062 27.164 1.955 c
+27.036 1.845 26.932 1.709 26.855 1.544 c
+26.855 -1.352 l
+26.209 -1.352 l
+26.209 2.631 l
+h
+29.722 0.823 m
+29.722 1.44 29.832 1.904 30.06 2.219 c
+30.284 2.543 30.618 2.705 31.059 2.705 c
+31.46 2.705 31.765 2.529 31.971 2.176 c
+32.015 2.631 l
+32.603 2.631 l
+32.603 -1.396 l
+32.603 -1.885 32.474 -2.263 32.22 -2.528 c
+31.964 -2.793 31.611 -2.925 31.162 -2.925 c
+30.964 -2.925 30.743 -2.874 30.501 -2.778 c
+30.255 -2.679 30.074 -2.558 29.957 -2.41 c
+30.221 -1.97 l
+30.487 -2.234 30.784 -2.367 31.118 -2.367 c
+31.655 -2.367 31.931 -2.072 31.942 -1.484 c
+31.942 -0.956 l
+31.736 -1.271 31.434 -1.426 31.044 -1.426 c
+30.633 -1.426 30.31 -1.275 30.074 -0.97 c
+29.847 -0.658 29.729 -0.206 29.722 0.382 c
+h
+30.383 0.441 m
+30.383 0 30.446 -0.33 30.574 -0.544 c
+30.699 -0.75 30.916 -0.852 31.221 -0.852 c
+31.545 -0.852 31.784 -0.687 31.942 -0.353 c
+31.942 1.631 l
+31.773 1.955 31.534 2.117 31.221 2.117 c
+30.927 2.117 30.71 2.014 30.574 1.808 c
+30.446 1.602 30.383 1.278 30.383 0.838 c
+h
+34.984 -1.426 m
+34.485 -1.426 34.102 -1.278 33.837 -0.985 c
+33.573 -0.691 33.44 -0.257 33.44 0.324 c
+33.44 0.794 l
+33.44 1.389 33.566 1.856 33.823 2.19 c
+34.088 2.532 34.448 2.705 34.911 2.705 c
+35.37 2.705 35.711 2.55 35.94 2.249 c
+36.175 1.955 36.296 1.492 36.307 0.867 c
+36.307 0.441 l
+34.088 0.441 l
+34.088 0.353 l
+34.088 -0.081 34.165 -0.393 34.323 -0.588 c
+34.488 -0.775 34.72 -0.867 35.013 -0.867 c
+35.208 -0.867 35.381 -0.834 35.528 -0.764 c
+35.675 -0.687 35.811 -0.569 35.94 -0.411 c
+36.278 -0.823 l
+35.991 -1.228 35.561 -1.426 34.984 -1.426 c
+34.911 2.146 m
+34.635 2.146 34.433 2.051 34.308 1.866 c
+34.179 1.679 34.106 1.389 34.088 1 c
+35.661 1 l
+35.661 1.087 l
+35.638 1.47 35.572 1.738 35.455 1.897 c
+35.337 2.062 35.154 2.146 34.911 2.146 c
+39.027 -0.338 m
+39.027 -0.191 38.971 -0.07 38.865 0.029 c
+38.755 0.125 38.549 0.243 38.248 0.382 c
+37.901 0.53 37.66 0.651 37.512 0.75 c
+37.365 0.856 37.255 0.974 37.189 1.103 c
+37.119 1.228 37.086 1.386 37.086 1.573 c
+37.086 1.897 37.203 2.165 37.439 2.381 c
+37.674 2.595 37.976 2.705 38.35 2.705 c
+38.732 2.705 39.041 2.591 39.276 2.367 c
+39.511 2.139 39.629 1.852 39.629 1.5 c
+38.982 1.5 l
+38.982 1.675 38.923 1.827 38.806 1.955 c
+38.688 2.08 38.534 2.146 38.35 2.146 c
+38.152 2.146 38.001 2.091 37.895 1.984 c
+37.784 1.885 37.733 1.753 37.733 1.588 c
+37.733 1.459 37.77 1.353 37.851 1.264 c
+37.928 1.183 38.119 1.081 38.424 0.956 c
+38.901 0.769 39.233 0.58 39.409 0.397 c
+39.584 0.22 39.673 -0.008 39.673 -0.279 c
+39.673 -0.632 39.548 -0.912 39.306 -1.117 c
+39.071 -1.323 38.755 -1.426 38.365 -1.426 c
+37.942 -1.426 37.604 -1.309 37.351 -1.073 c
+37.093 -0.831 36.968 -0.525 36.968 -0.162 c
+37.615 -0.162 l
+37.623 -0.389 37.693 -0.565 37.821 -0.691 c
+37.946 -0.808 38.13 -0.867 38.365 -0.867 c
+38.578 -0.867 38.74 -0.819 38.85 -0.721 c
+38.967 -0.625 39.027 -0.496 39.027 -0.338 c
+45.112 0.441 m
+45.112 -0.176 44.997 -0.643 44.774 -0.956 c
+44.557 -1.271 44.234 -1.426 43.804 -1.426 c
+43.381 -1.426 43.069 -1.246 42.863 -0.881 c
+42.834 -1.352 l
+42.231 -1.352 l
+42.231 4.293 l
+42.877 4.293 l
+42.877 2.19 l
+43.091 2.532 43.399 2.705 43.804 2.705 c
+44.234 2.705 44.557 2.547 44.774 2.234 c
+44.997 1.929 45.112 1.463 45.112 0.838 c
+h
+44.465 0.823 m
+44.465 1.294 44.395 1.625 44.259 1.823 c
+44.131 2.018 43.921 2.117 43.627 2.117 c
+43.293 2.117 43.043 1.933 42.877 1.573 c
+42.877 -0.309 l
+43.043 -0.673 43.297 -0.852 43.642 -0.852 c
+43.936 -0.852 44.145 -0.75 44.274 -0.544 c
+44.399 -0.338 44.465 -0.022 44.465 0.412 c
+h
+47.376 -1.426 m
+46.875 -1.426 46.493 -1.278 46.229 -0.985 c
+45.965 -0.691 45.832 -0.257 45.832 0.324 c
+45.832 0.794 l
+45.832 1.389 45.957 1.856 46.214 2.19 c
+46.479 2.532 46.839 2.705 47.302 2.705 c
+47.761 2.705 48.103 2.55 48.331 2.249 c
+48.566 1.955 48.687 1.492 48.698 0.867 c
+48.698 0.441 l
+46.479 0.441 l
+46.479 0.353 l
+46.479 -0.081 46.556 -0.393 46.714 -0.588 c
+46.879 -0.775 47.11 -0.867 47.405 -0.867 c
+47.6 -0.867 47.773 -0.834 47.919 -0.764 c
+48.066 -0.687 48.203 -0.569 48.331 -0.411 c
+48.669 -0.823 l
+48.382 -1.228 47.952 -1.426 47.376 -1.426 c
+47.302 2.146 m
+47.027 2.146 46.824 2.051 46.699 1.866 c
+46.57 1.679 46.497 1.389 46.479 1 c
+48.051 1 l
+48.051 1.087 l
+48.029 1.47 47.964 1.738 47.846 1.897 c
+47.728 2.062 47.544 2.146 47.302 2.146 c
+50.33 3.587 m
+50.33 2.631 l
+50.933 2.631 l
+50.933 2.102 l
+50.33 2.102 l
+50.33 -0.368 l
+50.33 -0.525 50.352 -0.643 50.403 -0.721 c
+50.462 -0.801 50.551 -0.838 50.668 -0.838 c
+50.757 -0.838 50.844 -0.823 50.933 -0.794 c
+50.933 -1.352 l
+50.786 -1.4 50.632 -1.426 50.477 -1.426 c
+50.22 -1.426 50.025 -1.334 49.889 -1.147 c
+49.749 -0.962 49.683 -0.702 49.683 -0.368 c
+49.683 2.102 l
+49.08 2.102 l
+49.08 2.631 l
+49.683 2.631 l
+49.683 3.587 l
+h
+54.666 -0.206 m
+55.268 2.631 l
+55.916 2.631 l
+54.931 -1.352 l
+54.416 -1.352 l
+53.637 1.5 l
+52.887 -1.352 l
+52.359 -1.352 l
+51.403 2.631 l
+52.035 2.631 l
+52.652 -0.133 l
+53.387 2.631 l
+53.902 2.631 l
+h
+58.017 -1.426 m
+57.518 -1.426 57.136 -1.278 56.871 -0.985 c
+56.606 -0.691 56.474 -0.257 56.474 0.324 c
+56.474 0.794 l
+56.474 1.389 56.599 1.856 56.856 2.19 c
+57.121 2.532 57.481 2.705 57.944 2.705 c
+58.403 2.705 58.745 2.55 58.973 2.249 c
+59.208 1.955 59.33 1.492 59.34 0.867 c
+59.34 0.441 l
+57.121 0.441 l
+57.121 0.353 l
+57.121 -0.081 57.198 -0.393 57.356 -0.588 c
+57.522 -0.775 57.753 -0.867 58.047 -0.867 c
+58.242 -0.867 58.414 -0.834 58.561 -0.764 c
+58.709 -0.687 58.844 -0.569 58.973 -0.411 c
+59.311 -0.823 l
+59.025 -1.228 58.595 -1.426 58.017 -1.426 c
+57.944 2.146 m
+57.668 2.146 57.466 2.051 57.342 1.866 c
+57.213 1.679 57.14 1.389 57.121 1 c
+58.694 1 l
+58.694 1.087 l
+58.672 1.47 58.605 1.738 58.488 1.897 c
+58.37 2.062 58.187 2.146 57.944 2.146 c
+61.545 -1.426 m
+61.046 -1.426 60.664 -1.278 60.399 -0.985 c
+60.134 -0.691 60.002 -0.257 60.002 0.324 c
+60.002 0.794 l
+60.002 1.389 60.126 1.856 60.384 2.19 c
+60.649 2.532 61.009 2.705 61.472 2.705 c
+61.931 2.705 62.273 2.55 62.501 2.249 c
+62.736 1.955 62.857 1.492 62.868 0.867 c
+62.868 0.441 l
+60.649 0.441 l
+60.649 0.353 l
+60.649 -0.081 60.726 -0.393 60.884 -0.588 c
+61.049 -0.775 61.281 -0.867 61.575 -0.867 c
+61.77 -0.867 61.942 -0.834 62.089 -0.764 c
+62.236 -0.687 62.372 -0.569 62.501 -0.411 c
+62.839 -0.823 l
+62.553 -1.228 62.123 -1.426 61.545 -1.426 c
+61.472 2.146 m
+61.196 2.146 60.994 2.051 60.87 1.866 c
+60.741 1.679 60.667 1.389 60.649 1 c
+62.221 1 l
+62.221 1.087 l
+62.2 1.47 62.133 1.738 62.015 1.897 c
+61.898 2.062 61.714 2.146 61.472 2.146 c
+64.265 2.631 m
+64.279 2.19 l
+64.533 2.532 64.856 2.705 65.25 2.705 c
+65.955 2.705 66.312 2.234 66.322 1.294 c
+66.322 -1.352 l
+65.676 -1.352 l
+65.676 1.264 l
+65.676 1.577 65.62 1.797 65.514 1.926 c
+65.404 2.051 65.25 2.117 65.044 2.117 c
+64.886 2.117 64.739 2.062 64.602 1.955 c
+64.475 1.845 64.371 1.709 64.294 1.544 c
+64.294 -1.352 l
+63.648 -1.352 l
+63.648 2.631 l
+h
+f
+Q
+q 1 0 0 1 417.8096 361.8857 cm
+0 0 m
+0.354 2.234 l
+1.353 2.234 l
+0.53 -1.749 l
+-0.338 -1.749 l
+-0.897 0.559 l
+-1.454 -1.749 l
+-2.322 -1.749 l
+-3.145 2.234 l
+-2.146 2.234 l
+-1.793 0 l
+-1.263 2.234 l
+-0.529 2.234 l
+h
+1.75 0.368 m
+1.75 0.974 1.889 1.448 2.176 1.793 c
+2.459 2.135 2.852 2.308 3.352 2.308 c
+3.859 2.308 4.256 2.135 4.543 1.793 c
+4.825 1.448 4.969 0.974 4.969 0.368 c
+4.969 0.103 l
+4.969 -0.496 4.825 -0.966 4.543 -1.309 c
+4.256 -1.654 3.859 -1.823 3.352 -1.823 c
+2.841 -1.823 2.444 -1.654 2.161 -1.309 c
+1.885 -0.966 1.75 -0.492 1.75 0.118 c
+h
+2.793 0.103 m
+2.793 -0.603 2.977 -0.956 3.352 -0.956 c
+3.705 -0.956 3.896 -0.661 3.925 -0.073 c
+3.925 0.368 l
+3.925 0.727 3.874 0.999 3.778 1.176 c
+3.679 1.352 3.535 1.44 3.352 1.44 c
+3.176 1.44 3.036 1.352 2.941 1.176 c
+2.841 0.999 2.793 0.727 2.793 0.368 c
+h
+7.57 1.22 m
+7.232 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.881 c
+6.659 -1.749 l
+5.615 -1.749 l
+5.615 2.234 l
+6.585 2.234 l
+6.615 1.793 l
+6.781 2.135 7.012 2.308 7.306 2.308 c
+7.423 2.308 7.516 2.286 7.585 2.249 c
+h
+9.437 -0.22 m
+9.158 -0.53 l
+9.158 -1.749 l
+8.115 -1.749 l
+8.115 3.896 l
+9.158 3.896 l
+9.158 0.852 l
+9.276 1.043 l
+9.996 2.234 l
+11.246 2.234 l
+10.084 0.588 l
+11.348 -1.749 l
+10.157 -1.749 l
+h
+12.803 -1.749 -1.044 3.983 re
+11.716 3.263 m
+11.716 3.418 11.763 3.547 11.863 3.645 c
+11.969 3.752 12.105 3.807 12.274 3.807 c
+12.451 3.807 12.586 3.752 12.686 3.645 c
+12.792 3.547 12.848 3.418 12.848 3.263 c
+12.848 3.094 12.792 2.959 12.686 2.851 c
+12.586 2.753 12.451 2.705 12.274 2.705 c
+12.105 2.705 11.969 2.753 11.863 2.851 c
+11.763 2.959 11.716 3.094 11.716 3.263 c
+14.567 2.234 m
+14.596 1.837 l
+14.832 2.15 15.133 2.308 15.508 2.308 c
+16.191 2.308 16.544 1.826 16.566 0.867 c
+16.566 -1.749 l
+15.522 -1.749 l
+15.522 0.794 l
+15.522 1.018 15.486 1.18 15.42 1.278 c
+15.35 1.374 15.232 1.426 15.067 1.426 c
+14.88 1.426 14.733 1.33 14.626 1.147 c
+14.626 -1.749 l
+13.582 -1.749 l
+13.582 2.234 l
+h
+17.184 0.368 m
+17.184 1.014 17.301 1.5 17.536 1.822 c
+17.771 2.146 18.103 2.308 18.536 2.308 c
+18.889 2.308 19.161 2.165 19.359 1.881 c
+19.404 2.234 l
+20.344 2.234 l
+20.344 -1.749 l
+20.344 -2.256 20.2 -2.646 19.917 -2.911 c
+19.631 -3.183 19.227 -3.322 18.698 -3.322 c
+18.47 -3.322 18.234 -3.278 17.993 -3.19 c
+17.757 -3.102 17.581 -2.988 17.463 -2.851 c
+17.816 -2.132 l
+17.912 -2.238 18.04 -2.323 18.198 -2.381 c
+18.352 -2.448 18.5 -2.485 18.639 -2.485 c
+18.874 -2.485 19.04 -2.425 19.138 -2.308 c
+19.246 -2.198 19.3 -2.021 19.3 -1.779 c
+19.3 -1.426 l
+19.102 -1.691 18.845 -1.823 18.521 -1.823 c
+18.099 -1.823 17.771 -1.661 17.536 -1.338 c
+17.309 -1.007 17.191 -0.536 17.184 0.073 c
+h
+18.228 0.103 m
+18.228 -0.272 18.275 -0.54 18.375 -0.706 c
+18.47 -0.875 18.624 -0.956 18.83 -0.956 c
+19.043 -0.956 19.201 -0.879 19.3 -0.721 c
+19.3 1.176 l
+19.19 1.341 19.036 1.426 18.83 1.426 c
+18.624 1.426 18.47 1.341 18.375 1.176 c
+18.275 1.007 18.228 0.738 18.228 0.368 c
+h
+22.696 0.368 m
+22.696 1.014 22.803 1.5 23.019 1.822 c
+23.244 2.146 23.566 2.308 23.989 2.308 c
+24.302 2.308 24.555 2.175 24.754 1.911 c
+24.754 3.896 l
+25.812 3.896 l
+25.812 -1.749 l
+24.856 -1.749 l
+24.813 -1.338 l
+24.596 -1.661 24.32 -1.823 23.989 -1.823 c
+23.578 -1.823 23.258 -1.668 23.034 -1.353 c
+22.817 -1.029 22.703 -0.559 22.696 0.058 c
+h
+23.74 0.103 m
+23.74 -0.291 23.776 -0.566 23.857 -0.721 c
+23.946 -0.879 24.092 -0.956 24.298 -0.956 c
+24.503 -0.956 24.655 -0.864 24.754 -0.676 c
+24.754 1.132 l
+24.655 1.326 24.503 1.426 24.298 1.426 c
+24.1 1.426 23.96 1.345 23.872 1.191 c
+23.784 1.043 23.74 0.771 23.74 0.382 c
+h
+27.664 -1.749 -1.044 3.983 re
+26.576 3.263 m
+26.576 3.418 26.624 3.547 26.724 3.645 c
+26.83 3.752 26.966 3.807 27.135 3.807 c
+27.312 3.807 27.447 3.752 27.547 3.645 c
+27.653 3.547 27.708 3.418 27.708 3.263 c
+27.708 3.094 27.653 2.959 27.547 2.851 c
+27.447 2.753 27.312 2.705 27.135 2.705 c
+26.966 2.705 26.83 2.753 26.724 2.851 c
+26.624 2.959 26.576 3.094 26.576 3.263 c
+30.427 1.22 m
+30.09 1.249 l
+29.803 1.249 29.612 1.124 29.517 0.881 c
+29.517 -1.749 l
+28.472 -1.749 l
+28.472 2.234 l
+29.442 2.234 l
+29.472 1.793 l
+29.637 2.135 29.868 2.308 30.163 2.308 c
+30.28 2.308 30.373 2.286 30.442 2.249 c
+h
+32.5 -1.823 m
+31.971 -1.823 31.552 -1.668 31.25 -1.353 c
+30.957 -1.029 30.809 -0.569 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.946 1.448 31.221 1.793 c
+31.493 2.135 31.886 2.308 32.397 2.308 c
+32.897 2.308 33.268 2.146 33.515 1.822 c
+33.768 1.5 33.9 1.022 33.911 0.397 c
+33.911 -0.103 l
+31.838 -0.103 l
+31.857 -0.397 31.919 -0.613 32.029 -0.75 c
+32.147 -0.889 32.328 -0.956 32.574 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.724 -1.411 33.536 -1.554 33.294 -1.661 c
+33.047 -1.768 32.783 -1.823 32.5 -1.823 c
+31.853 0.617 m
+32.883 0.617 l
+32.883 0.721 l
+32.883 0.956 32.842 1.132 32.765 1.249 c
+32.694 1.374 32.566 1.44 32.382 1.44 c
+32.206 1.44 32.074 1.371 31.985 1.234 c
+31.905 1.106 31.861 0.9 31.853 0.617 c
+35.94 -0.956 m
+36.233 -0.956 36.384 -0.761 36.395 -0.368 c
+37.365 -0.368 l
+37.365 -0.802 37.233 -1.154 36.968 -1.426 c
+36.704 -1.691 36.366 -1.823 35.954 -1.823 c
+35.443 -1.823 35.05 -1.668 34.778 -1.353 c
+34.514 -1.029 34.375 -0.559 34.367 0.058 c
+34.367 0.382 l
+34.367 1.007 34.499 1.484 34.764 1.808 c
+35.036 2.138 35.433 2.308 35.954 2.308 c
+36.384 2.308 36.726 2.168 36.983 1.897 c
+37.237 1.621 37.365 1.238 37.365 0.75 c
+36.395 0.75 l
+36.395 0.962 36.355 1.132 36.278 1.249 c
+36.208 1.374 36.091 1.44 35.925 1.44 c
+35.748 1.44 35.62 1.374 35.543 1.249 c
+35.462 1.12 35.418 0.871 35.41 0.5 c
+35.41 0.088 l
+35.41 -0.235 35.425 -0.463 35.455 -0.588 c
+35.491 -0.717 35.547 -0.808 35.616 -0.867 c
+35.694 -0.926 35.8 -0.956 35.94 -0.956 c
+39.173 3.204 m
+39.173 2.234 l
+39.703 2.234 l
+39.703 1.44 l
+39.173 1.44 l
+39.173 -0.53 l
+39.173 -0.687 39.192 -0.794 39.233 -0.852 c
+39.28 -0.912 39.364 -0.941 39.482 -0.941 c
+39.589 -0.941 39.673 -0.933 39.732 -0.912 c
+39.732 -1.72 l
+39.555 -1.786 39.364 -1.823 39.159 -1.823 c
+38.483 -1.823 38.138 -1.437 38.13 -0.661 c
+38.13 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.13 2.234 l
+38.13 3.204 l
+h
+40.056 0.368 m
+40.056 0.974 40.195 1.448 40.482 1.793 c
+40.765 2.135 41.157 2.308 41.658 2.308 c
+42.165 2.308 42.562 2.135 42.848 1.793 c
+43.131 1.448 43.274 0.974 43.274 0.368 c
+43.274 0.103 l
+43.274 -0.496 43.131 -0.966 42.848 -1.309 c
+42.562 -1.654 42.165 -1.823 41.658 -1.823 c
+41.147 -1.823 40.75 -1.654 40.467 -1.309 c
+40.191 -0.966 40.056 -0.492 40.056 0.118 c
+h
+41.099 0.103 m
+41.099 -0.603 41.282 -0.956 41.658 -0.956 c
+42.011 -0.956 42.202 -0.661 42.231 -0.073 c
+42.231 0.368 l
+42.231 0.727 42.179 0.999 42.084 1.176 c
+41.984 1.352 41.841 1.44 41.658 1.44 c
+41.481 1.44 41.342 1.352 41.246 1.176 c
+41.147 0.999 41.099 0.727 41.099 0.368 c
+h
+45.876 1.22 m
+45.538 1.249 l
+45.251 1.249 45.06 1.124 44.965 0.881 c
+44.965 -1.749 l
+43.921 -1.749 l
+43.921 2.234 l
+44.891 2.234 l
+44.92 1.793 l
+45.086 2.135 45.317 2.308 45.612 2.308 c
+45.729 2.308 45.822 2.286 45.891 2.249 c
+h
+47.773 -0.015 m
+48.301 2.234 l
+49.404 2.234 l
+48.096 -2.352 l
+47.898 -3.017 47.53 -3.352 46.994 -3.352 c
+46.865 -3.352 46.722 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.685 -2.485 l
+46.85 -2.485 46.971 -2.448 47.052 -2.381 c
+47.129 -2.323 47.192 -2.213 47.243 -2.058 c
+47.316 -1.793 l
+46.171 2.234 l
+47.287 2.234 l
+h
+f
+Q
+q 1 0 0 1 471.5352 360.1369 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.603 -0.074 -0.956 -0.074 c
+-1.319 -0.074 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.712 -2.102 1.087 c
+-2.102 1.488 -1.966 1.807 -1.691 2.042 c
+-1.419 2.285 -1.044 2.41 -0.574 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.071 -0.143 3.237 -0.25 3.336 c
+-0.36 3.443 -0.522 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.985 3.266 -1.866 3.453 c
+-1.742 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.015 3.954 0.22 3.748 c
+0.434 3.542 0.547 3.248 0.559 2.865 c
+0.559 0.852 l
+0.559 0.547 0.595 0.282 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.514 m
+-0.702 0.514 -0.551 0.558 -0.412 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.984 c
+-0.088 1.925 l
+-0.455 1.925 l
+-0.771 1.925 -1.014 1.855 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.235 0.562 -1.084 0.514 -0.867 0.514 c
+2.175 3.983 m
+2.19 3.542 l
+2.444 3.884 2.767 4.056 3.16 4.056 c
+3.865 4.056 4.222 3.586 4.233 2.645 c
+4.233 0 l
+3.586 0 l
+3.586 2.616 l
+3.586 2.929 3.532 3.149 3.424 3.278 c
+3.314 3.403 3.16 3.469 2.954 3.469 c
+2.797 3.469 2.649 3.414 2.514 3.307 c
+2.385 3.197 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.558 0 l
+1.558 3.983 l
+h
+5.071 2.175 m
+5.071 2.782 5.182 3.248 5.409 3.571 c
+5.644 3.895 5.972 4.056 6.394 4.056 c
+6.776 4.056 7.073 3.898 7.291 3.586 c
+7.291 5.644 l
+7.937 5.644 l
+7.937 0 l
+7.349 0 l
+7.306 0.426 l
+7.1 0.091 6.795 -0.074 6.394 -0.074 c
+5.982 -0.074 5.659 0.081 5.424 0.396 c
+5.189 0.72 5.071 1.176 5.071 1.764 c
+h
+5.718 1.793 m
+5.718 1.352 5.78 1.022 5.909 0.808 c
+6.045 0.602 6.265 0.5 6.57 0.5 c
+6.894 0.5 7.133 0.661 7.291 0.984 c
+7.291 2.998 l
+7.121 3.31 6.882 3.469 6.57 3.469 c
+6.265 3.469 6.045 3.366 5.909 3.16 c
+5.78 2.954 5.718 2.63 5.718 2.19 c
+h
+f
+Q
+q 1 0 0 1 483.8532 361.2093 cm
+0 0 m
+0 0.088 -0.044 0.166 -0.133 0.235 c
+-0.221 0.312 -0.408 0.416 -0.691 0.544 c
+-1.125 0.721 -1.422 0.9 -1.588 1.087 c
+-1.746 1.272 -1.823 1.503 -1.823 1.779 c
+-1.823 2.12 -1.702 2.404 -1.455 2.631 c
+-1.202 2.866 -0.864 2.984 -0.441 2.984 c
+-0.011 2.984 0.338 2.87 0.602 2.646 c
+0.867 2.419 0.999 2.117 0.999 1.735 c
+-0.044 1.735 l
+-0.044 2.058 -0.184 2.22 -0.456 2.22 c
+-0.566 2.22 -0.655 2.183 -0.721 2.117 c
+-0.79 2.047 -0.823 1.948 -0.823 1.823 c
+-0.823 1.735 -0.786 1.654 -0.706 1.588 c
+-0.628 1.529 -0.449 1.434 -0.162 1.309 c
+0.268 1.151 0.565 0.974 0.735 0.779 c
+0.911 0.592 0.999 0.342 0.999 0.029 c
+0.999 -0.324 0.867 -0.61 0.602 -0.823 c
+0.338 -1.039 -0.011 -1.147 -0.441 -1.147 c
+-0.736 -1.147 -0.996 -1.091 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.75 -0.5 c
+-1.867 -0.293 -1.926 -0.073 -1.926 0.162 c
+-0.941 0.162 l
+-0.941 -0.025 -0.904 -0.162 -0.823 -0.249 c
+-0.736 -0.338 -0.603 -0.382 -0.427 -0.382 c
+-0.144 -0.382 0 -0.257 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.395 2.911 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.01 2.884 -0.118 2.925 -0.176 c
+2.973 -0.235 3.057 -0.264 3.175 -0.264 c
+3.281 -0.264 3.366 -0.257 3.424 -0.235 c
+3.424 -1.043 l
+3.248 -1.109 3.057 -1.147 2.851 -1.147 c
+2.175 -1.147 1.83 -0.76 1.822 0.015 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.911 l
+1.822 2.911 l
+1.822 3.881 l
+h
+5.85 -1.072 m
+5.82 -1.014 5.791 -0.912 5.762 -0.764 c
+5.574 -1.022 5.325 -1.147 5.012 -1.147 c
+4.677 -1.147 4.398 -1.039 4.174 -0.823 c
+3.958 -0.598 3.85 -0.309 3.85 0.044 c
+3.85 0.456 3.983 0.772 4.247 1 c
+4.512 1.235 4.895 1.353 5.394 1.353 c
+5.718 1.353 l
+5.718 1.675 l
+5.718 1.852 5.681 1.974 5.614 2.043 c
+5.556 2.12 5.468 2.161 5.35 2.161 c
+5.093 2.161 4.968 2.007 4.968 1.706 c
+3.925 1.706 l
+3.925 2.076 4.06 2.381 4.336 2.616 c
+4.608 2.859 4.957 2.984 5.379 2.984 c
+5.82 2.984 6.158 2.866 6.393 2.631 c
+6.636 2.404 6.761 2.08 6.761 1.661 c
+6.761 -0.206 l
+6.761 -0.551 6.809 -0.819 6.908 -1.014 c
+6.908 -1.072 l
+h
+5.247 -0.324 m
+5.354 -0.324 5.446 -0.305 5.527 -0.264 c
+5.614 -0.216 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.468 0.735 l
+5.292 0.735 5.148 0.676 5.041 0.559 c
+4.943 0.449 4.895 0.302 4.895 0.118 c
+4.895 -0.176 5.012 -0.324 5.247 -0.324 c
+7.378 1.044 m
+7.378 1.691 7.496 2.176 7.731 2.499 c
+7.966 2.822 8.297 2.984 8.731 2.984 c
+9.084 2.984 9.356 2.841 9.554 2.558 c
+9.598 2.911 l
+10.539 2.911 l
+10.539 -1.072 l
+10.539 -1.579 10.395 -1.97 10.113 -2.234 c
+9.826 -2.506 9.422 -2.645 8.893 -2.645 c
+8.665 -2.645 8.43 -2.601 8.187 -2.514 c
+7.952 -2.425 7.775 -2.311 7.658 -2.175 c
+8.01 -1.455 l
+8.106 -1.562 8.235 -1.646 8.393 -1.705 c
+8.548 -1.771 8.694 -1.808 8.834 -1.808 c
+9.069 -1.808 9.234 -1.749 9.334 -1.631 c
+9.44 -1.521 9.495 -1.344 9.495 -1.103 c
+9.495 -0.75 l
+9.296 -1.014 9.04 -1.147 8.716 -1.147 c
+8.294 -1.147 7.966 -0.985 7.731 -0.661 c
+7.503 -0.33 7.386 0.14 7.378 0.75 c
+h
+8.422 0.779 m
+8.422 0.405 8.47 0.136 8.569 -0.029 c
+8.665 -0.198 8.819 -0.279 9.025 -0.279 c
+9.238 -0.279 9.396 -0.202 9.495 -0.044 c
+9.495 1.852 l
+9.385 2.018 9.231 2.103 9.025 2.103 c
+8.819 2.103 8.665 2.018 8.569 1.852 c
+8.47 1.683 8.422 1.415 8.422 1.044 c
+h
+12.391 -1.072 -1.044 3.983 re
+11.303 3.94 m
+11.303 4.094 11.351 4.223 11.451 4.322 c
+11.557 4.428 11.692 4.484 11.862 4.484 c
+12.038 4.484 12.174 4.428 12.273 4.322 c
+12.38 4.223 12.435 4.094 12.435 3.94 c
+12.435 3.771 12.38 3.635 12.273 3.528 c
+12.174 3.429 12.038 3.381 11.862 3.381 c
+11.692 3.381 11.557 3.429 11.451 3.528 c
+11.351 3.635 11.303 3.771 11.303 3.94 c
+14.154 2.911 m
+14.184 2.514 l
+14.42 2.826 14.721 2.984 15.095 2.984 c
+15.779 2.984 16.132 2.502 16.154 1.544 c
+16.154 -1.072 l
+15.11 -1.072 l
+15.11 1.47 l
+15.11 1.694 15.073 1.856 15.008 1.955 c
+14.938 2.051 14.82 2.103 14.655 2.103 c
+14.468 2.103 14.32 2.007 14.214 1.823 c
+14.214 -1.072 l
+13.17 -1.072 l
+13.17 2.911 l
+h
+16.772 1.044 m
+16.772 1.691 16.889 2.176 17.124 2.499 c
+17.359 2.822 17.69 2.984 18.123 2.984 c
+18.476 2.984 18.748 2.841 18.947 2.558 c
+18.991 2.911 l
+19.931 2.911 l
+19.931 -1.072 l
+19.931 -1.579 19.788 -1.97 19.505 -2.234 c
+19.218 -2.506 18.815 -2.645 18.285 -2.645 c
+18.057 -2.645 17.822 -2.601 17.58 -2.514 c
+17.344 -2.425 17.168 -2.311 17.051 -2.175 c
+17.404 -1.455 l
+17.499 -1.562 17.628 -1.646 17.786 -1.705 c
+17.94 -1.771 18.087 -1.808 18.227 -1.808 c
+18.462 -1.808 18.627 -1.749 18.726 -1.631 c
+18.833 -1.521 18.888 -1.344 18.888 -1.103 c
+18.888 -0.75 l
+18.69 -1.014 18.432 -1.147 18.109 -1.147 c
+17.686 -1.147 17.359 -0.985 17.124 -0.661 c
+16.897 -0.33 16.779 0.14 16.772 0.75 c
+h
+17.815 0.779 m
+17.815 0.405 17.863 0.136 17.962 -0.029 c
+18.057 -0.198 18.212 -0.279 18.418 -0.279 c
+18.63 -0.279 18.788 -0.202 18.888 -0.044 c
+18.888 1.852 l
+18.778 2.018 18.623 2.103 18.418 2.103 c
+18.212 2.103 18.057 2.018 17.962 1.852 c
+17.863 1.683 17.815 1.415 17.815 1.044 c
+h
+24.312 -1.072 m
+24.282 -1.014 24.253 -0.912 24.224 -0.764 c
+24.036 -1.022 23.787 -1.147 23.474 -1.147 c
+23.139 -1.147 22.86 -1.039 22.636 -0.823 c
+22.42 -0.598 22.312 -0.309 22.312 0.044 c
+22.312 0.456 22.445 0.772 22.709 1 c
+22.975 1.235 23.357 1.353 23.856 1.353 c
+24.18 1.353 l
+24.18 1.675 l
+24.18 1.852 24.143 1.974 24.076 2.043 c
+24.018 2.12 23.93 2.161 23.812 2.161 c
+23.555 2.161 23.43 2.007 23.43 1.706 c
+22.386 1.706 l
+22.386 2.076 22.522 2.381 22.798 2.616 c
+23.07 2.859 23.419 2.984 23.841 2.984 c
+24.282 2.984 24.621 2.866 24.856 2.631 c
+25.098 2.404 25.223 2.08 25.223 1.661 c
+25.223 -0.206 l
+25.223 -0.551 25.271 -0.819 25.37 -1.014 c
+25.37 -1.072 l
+h
+23.709 -0.324 m
+23.816 -0.324 23.908 -0.305 23.989 -0.264 c
+24.076 -0.216 24.139 -0.158 24.18 -0.088 c
+24.18 0.735 l
+23.93 0.735 l
+23.754 0.735 23.61 0.676 23.503 0.559 c
+23.405 0.449 23.357 0.302 23.357 0.118 c
+23.357 -0.176 23.474 -0.324 23.709 -0.324 c
+27.928 1.897 m
+27.59 1.926 l
+27.303 1.926 27.112 1.801 27.016 1.558 c
+27.016 -1.072 l
+25.973 -1.072 l
+25.973 2.911 l
+26.943 2.911 l
+26.973 2.469 l
+27.137 2.812 27.369 2.984 27.663 2.984 c
+27.781 2.984 27.873 2.962 27.943 2.926 c
+h
+30 -1.147 m
+29.471 -1.147 29.052 -0.992 28.751 -0.676 c
+28.457 -0.353 28.31 0.107 28.31 0.706 c
+28.31 1.014 l
+28.31 1.639 28.446 2.124 28.722 2.469 c
+28.994 2.812 29.387 2.984 29.898 2.984 c
+30.397 2.984 30.769 2.822 31.014 2.499 c
+31.268 2.176 31.401 1.698 31.411 1.073 c
+31.411 0.574 l
+29.339 0.574 l
+29.358 0.279 29.42 0.063 29.53 -0.073 c
+29.647 -0.213 29.828 -0.279 30.074 -0.279 c
+30.416 -0.279 30.706 -0.162 30.941 0.073 c
+31.353 -0.559 l
+31.224 -0.735 31.037 -0.878 30.794 -0.985 c
+30.548 -1.091 30.283 -1.147 30 -1.147 c
+29.354 1.294 m
+30.382 1.294 l
+30.382 1.397 l
+30.382 1.632 30.343 1.808 30.265 1.926 c
+30.195 2.051 30.067 2.117 29.883 2.117 c
+29.707 2.117 29.574 2.047 29.486 1.911 c
+29.405 1.783 29.361 1.577 29.354 1.294 c
+33.881 -1.072 m
+33.852 -1.014 33.822 -0.912 33.793 -0.764 c
+33.605 -1.022 33.356 -1.147 33.043 -1.147 c
+32.709 -1.147 32.429 -1.039 32.205 -0.823 c
+31.989 -0.598 31.882 -0.309 31.882 0.044 c
+31.882 0.456 32.014 0.772 32.279 1 c
+32.543 1.235 32.926 1.353 33.425 1.353 c
+33.749 1.353 l
+33.749 1.675 l
+33.749 1.852 33.712 1.974 33.646 2.043 c
+33.587 2.12 33.499 2.161 33.381 2.161 c
+33.124 2.161 32.999 2.007 32.999 1.706 c
+31.955 1.706 l
+31.955 2.076 32.091 2.381 32.367 2.616 c
+32.639 2.859 32.988 2.984 33.41 2.984 c
+33.852 2.984 34.189 2.866 34.424 2.631 c
+34.667 2.404 34.792 2.08 34.792 1.661 c
+34.792 -0.206 l
+34.792 -0.551 34.84 -0.819 34.939 -1.014 c
+34.939 -1.072 l
+h
+33.279 -0.324 m
+33.385 -0.324 33.477 -0.305 33.558 -0.264 c
+33.646 -0.216 33.709 -0.158 33.749 -0.088 c
+33.749 0.735 l
+33.499 0.735 l
+33.323 0.735 33.179 0.676 33.073 0.559 c
+32.973 0.449 32.926 0.302 32.926 0.118 c
+32.926 -0.176 33.043 -0.324 33.279 -0.324 c
+f
+Q
+q 1 0 0 1 519.5421 360.4896 cm
+0 0 m
+0 0.118 0.033 0.213 0.103 0.294 c
+0.169 0.371 0.272 0.411 0.412 0.411 c
+0.559 0.411 0.665 0.371 0.735 0.294 c
+0.812 0.213 0.852 0.118 0.852 0 c
+0.852 -0.111 0.812 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.111 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 356.035 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 349.197 cm
+0 0 m
+0 -0.188 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.776 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.206 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.148 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.675 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.882 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.263 -0.941 1.205 c
+-0.756 1.146 -0.595 1.066 -0.455 0.97 c
+-0.32 0.87 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.499 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.558 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.754 5.964 -1.86 6.064 -1.941 c
+6.159 -2.029 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.029 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.324 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.969 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.164 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.882 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.636 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.5 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.499 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.383 c
+6.924 -0.294 6.978 -0.177 7.019 -0.03 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.659 15.732 -0.632 15.861 -0.603 c
+15.861 -1.206 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.801 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.265 13.582 -0.177 c
+h
+23.295 -1.264 m
+23.283 -1.246 23.273 -1.216 23.265 -1.176 c
+23.265 -1.129 23.258 -1.081 23.25 -1.029 c
+23.25 -0.971 23.243 -0.912 23.236 -0.853 c
+23.236 -0.691 l
+23.118 -0.927 22.975 -1.095 22.809 -1.191 c
+22.641 -1.279 22.442 -1.324 22.207 -1.324 c
+22.009 -1.324 21.832 -1.279 21.677 -1.191 c
+21.519 -1.103 21.388 -0.981 21.28 -0.823 c
+21.182 -0.659 21.105 -0.467 21.045 -0.25 c
+20.994 -0.037 20.972 0.205 20.972 0.47 c
+20.972 0.735 20.994 0.974 21.045 1.19 c
+21.105 1.415 21.182 1.606 21.28 1.764 c
+21.388 1.918 21.519 2.043 21.677 2.131 c
+21.843 2.227 22.034 2.278 22.251 2.278 c
+22.346 2.278 22.442 2.263 22.531 2.234 c
+22.626 2.212 22.722 2.179 22.809 2.131 c
+22.898 2.08 22.975 2.017 23.044 1.94 c
+23.121 1.859 23.185 1.768 23.236 1.66 c
+23.236 1.749 l
+23.236 1.896 l
+23.236 2.057 l
+23.236 2.234 l
+23.236 3.513 l
+24.133 3.513 l
+24.133 -0.5 l
+24.133 -0.676 24.137 -0.834 24.147 -0.971 c
+24.154 -1.099 24.162 -1.199 24.162 -1.264 c
+h
+23.25 0.484 m
+23.25 0.72 23.225 0.911 23.177 1.058 c
+23.137 1.213 23.081 1.338 23.015 1.425 c
+22.957 1.514 22.886 1.573 22.809 1.602 c
+22.728 1.639 22.651 1.66 22.574 1.66 c
+22.475 1.66 22.383 1.635 22.296 1.587 c
+22.215 1.547 22.148 1.477 22.09 1.381 c
+22.038 1.282 21.994 1.161 21.957 1.014 c
+21.928 0.867 21.913 0.683 21.913 0.47 c
+21.913 0.077 21.964 -0.217 22.074 -0.412 c
+22.192 -0.611 22.354 -0.706 22.56 -0.706 c
+22.637 -0.706 22.714 -0.688 22.795 -0.647 c
+22.872 -0.611 22.946 -0.544 23.015 -0.456 c
+23.081 -0.368 23.137 -0.246 23.177 -0.088 c
+23.225 0.066 23.25 0.257 23.25 0.484 c
+27.281 -0.647 m
+28.413 -0.647 l
+28.413 -1.264 l
+25.106 -1.264 l
+25.106 -0.647 l
+26.371 -0.647 l
+26.371 1.602 l
+25.444 1.602 l
+25.444 2.219 l
+27.281 2.219 l
+h
+26.371 3.513 0.911 -0.676 re
+26.371 2.836 m
+30.886 1.602 m
+30.886 -1.264 l
+29.99 -1.264 l
+29.99 1.602 l
+29.167 1.602 l
+29.167 2.219 l
+29.99 2.219 l
+29.99 2.484 l
+29.99 2.609 30.005 2.741 30.034 2.881 c
+30.071 3.017 30.14 3.135 30.24 3.233 c
+30.346 3.34 30.489 3.428 30.666 3.498 c
+30.842 3.564 31.067 3.601 31.343 3.601 c
+31.555 3.601 31.754 3.59 31.931 3.572 c
+32.107 3.549 32.257 3.532 32.386 3.513 c
+32.386 2.925 l
+32.257 2.944 32.114 2.958 31.96 2.969 c
+31.802 2.977 31.651 2.984 31.504 2.984 c
+31.376 2.984 31.272 2.969 31.195 2.94 c
+31.114 2.91 31.052 2.869 31.004 2.822 c
+30.953 2.771 30.919 2.708 30.901 2.631 c
+30.89 2.561 30.886 2.484 30.886 2.396 c
+30.886 2.219 l
+32.313 2.219 l
+32.313 1.602 l
+h
+34.948 1.602 m
+34.948 -1.264 l
+34.051 -1.264 l
+34.051 1.602 l
+33.228 1.602 l
+33.228 2.219 l
+34.051 2.219 l
+34.051 2.484 l
+34.051 2.609 34.065 2.741 34.094 2.881 c
+34.132 3.017 34.202 3.135 34.3 3.233 c
+34.407 3.34 34.551 3.428 34.726 3.498 c
+34.903 3.564 35.127 3.601 35.403 3.601 c
+35.616 3.601 35.815 3.59 35.991 3.572 c
+36.168 3.549 36.318 3.532 36.446 3.513 c
+36.446 2.925 l
+36.318 2.944 36.174 2.958 36.02 2.969 c
+35.862 2.977 35.711 2.984 35.565 2.984 c
+35.436 2.984 35.333 2.969 35.256 2.94 c
+35.175 2.91 35.112 2.869 35.065 2.822 c
+35.013 2.771 34.98 2.708 34.962 2.631 c
+34.951 2.561 34.948 2.484 34.948 2.396 c
+34.948 2.219 l
+36.373 2.219 l
+36.373 1.602 l
+h
+42.013 0.837 1.867 -0.793 re
+42.013 0.044 m
+46.075 0.837 1.866 -0.793 re
+46.075 0.044 m
+52.648 -0.25 m
+52.648 -0.42 52.608 -0.57 52.531 -0.706 c
+52.461 -0.834 52.359 -0.948 52.222 -1.044 c
+52.093 -1.132 51.932 -1.202 51.737 -1.249 c
+51.55 -1.297 51.333 -1.324 51.091 -1.324 c
+50.863 -1.324 50.664 -1.309 50.488 -1.279 c
+50.312 -1.249 50.154 -1.202 50.017 -1.132 c
+49.878 -1.055 49.768 -0.956 49.68 -0.838 c
+49.591 -0.721 49.521 -0.574 49.473 -0.397 c
+50.283 -0.279 l
+50.3 -0.379 50.33 -0.456 50.37 -0.515 c
+50.418 -0.574 50.477 -0.618 50.547 -0.647 c
+50.613 -0.676 50.694 -0.702 50.782 -0.721 c
+50.87 -0.732 50.973 -0.736 51.091 -0.736 c
+51.186 -0.736 51.282 -0.732 51.37 -0.721 c
+51.458 -0.702 51.536 -0.676 51.605 -0.647 c
+51.671 -0.618 51.723 -0.58 51.752 -0.53 c
+51.789 -0.482 51.81 -0.42 51.81 -0.339 c
+51.81 -0.243 51.781 -0.169 51.723 -0.118 c
+51.671 -0.071 51.605 -0.03 51.517 0 c
+51.428 0.037 51.318 0.066 51.193 0.087 c
+51.076 0.118 50.944 0.147 50.796 0.176 c
+50.657 0.213 50.518 0.253 50.37 0.294 c
+50.231 0.341 50.106 0.404 49.988 0.484 c
+49.878 0.562 49.79 0.661 49.724 0.779 c
+49.654 0.897 49.62 1.047 49.62 1.234 c
+49.62 1.389 49.65 1.532 49.709 1.66 c
+49.775 1.797 49.87 1.911 49.988 1.999 c
+50.113 2.087 50.271 2.153 50.458 2.204 c
+50.642 2.252 50.855 2.278 51.091 2.278 c
+51.274 2.278 51.451 2.256 51.619 2.219 c
+51.785 2.19 51.932 2.135 52.061 2.057 c
+52.186 1.988 52.296 1.889 52.384 1.764 c
+52.473 1.646 52.531 1.502 52.56 1.338 c
+51.767 1.263 l
+51.744 1.341 51.715 1.404 51.679 1.455 c
+51.638 1.514 51.59 1.558 51.532 1.587 c
+51.48 1.624 51.418 1.65 51.34 1.66 c
+51.26 1.668 51.179 1.675 51.091 1.675 c
+50.873 1.675 50.712 1.646 50.605 1.587 c
+50.495 1.536 50.443 1.448 50.443 1.323 c
+50.443 1.242 50.462 1.18 50.503 1.132 c
+50.551 1.08 50.613 1.043 50.694 1.014 c
+50.782 0.985 50.877 0.955 50.988 0.926 c
+51.094 0.904 51.216 0.881 51.355 0.852 c
+51.509 0.823 51.667 0.783 51.825 0.735 c
+51.98 0.683 52.12 0.621 52.237 0.544 c
+52.355 0.463 52.45 0.36 52.531 0.235 c
+52.608 0.106 52.648 -0.055 52.648 -0.25 c
+54.21 1.602 m
+53.666 1.602 l
+53.666 2.219 l
+54.254 2.219 l
+54.534 3.116 l
+55.107 3.116 l
+55.107 2.219 l
+56.342 2.219 l
+56.342 1.602 l
+55.107 1.602 l
+55.107 -0.103 l
+55.107 -0.324 l
+55.114 -0.393 55.137 -0.456 55.166 -0.515 c
+55.203 -0.566 55.258 -0.611 55.328 -0.647 c
+55.405 -0.676 55.519 -0.691 55.665 -0.691 c
+55.802 -0.691 55.937 -0.688 56.077 -0.676 c
+56.213 -0.659 56.346 -0.632 56.474 -0.603 c
+56.474 -1.206 l
+56.394 -1.216 56.316 -1.231 56.239 -1.249 c
+56.158 -1.261 56.081 -1.268 56.004 -1.279 c
+55.923 -1.286 55.835 -1.294 55.739 -1.294 c
+55.651 -1.301 55.552 -1.309 55.445 -1.309 c
+55.258 -1.309 55.096 -1.294 54.96 -1.264 c
+54.831 -1.228 54.717 -1.183 54.622 -1.132 c
+54.534 -1.085 54.46 -1.025 54.401 -0.956 c
+54.343 -0.879 54.299 -0.801 54.269 -0.721 c
+54.24 -0.632 54.218 -0.544 54.21 -0.456 c
+54.2 -0.36 54.196 -0.265 54.196 -0.177 c
+h
+58.628 -1.324 m
+58.458 -1.324 58.308 -1.301 58.172 -1.264 c
+58.044 -1.216 57.929 -1.147 57.834 -1.058 c
+57.745 -0.971 57.676 -0.864 57.628 -0.736 c
+57.576 -0.599 57.554 -0.449 57.554 -0.279 c
+57.554 -0.073 57.587 0.095 57.657 0.235 c
+57.724 0.382 57.819 0.492 57.936 0.573 c
+58.061 0.661 58.204 0.723 58.363 0.764 c
+58.528 0.801 58.705 0.827 58.892 0.837 c
+59.612 0.852 l
+59.612 1.028 l
+59.612 1.146 59.601 1.249 59.583 1.338 c
+59.561 1.425 59.528 1.492 59.48 1.543 c
+59.44 1.602 59.392 1.639 59.333 1.66 c
+59.274 1.679 59.208 1.691 59.141 1.691 c
+59.072 1.691 59.01 1.679 58.951 1.66 c
+58.9 1.65 58.852 1.624 58.804 1.587 c
+58.763 1.558 58.73 1.506 58.701 1.44 c
+58.679 1.381 58.664 1.301 58.657 1.205 c
+57.716 1.249 l
+57.745 1.396 57.79 1.532 57.848 1.66 c
+57.915 1.786 58.01 1.896 58.127 1.984 c
+58.245 2.08 58.385 2.153 58.554 2.204 c
+58.73 2.252 58.936 2.278 59.172 2.278 c
+59.612 2.278 59.943 2.167 60.171 1.955 c
+60.406 1.749 60.523 1.44 60.523 1.028 c
+60.523 -0.235 l
+60.523 -0.456 l
+60.531 -0.515 60.546 -0.57 60.568 -0.618 c
+60.586 -0.659 60.616 -0.691 60.656 -0.721 c
+60.693 -0.742 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.736 c
+61.009 -1.22 l
+60.95 -1.231 60.895 -1.243 60.847 -1.249 c
+60.807 -1.261 60.766 -1.268 60.729 -1.279 c
+60.689 -1.286 60.645 -1.294 60.597 -1.294 c
+60.546 -1.301 60.487 -1.309 60.421 -1.309 c
+60.193 -1.309 60.028 -1.257 59.921 -1.147 c
+59.81 -1.029 59.748 -0.864 59.729 -0.647 c
+59.715 -0.647 l
+59.646 -0.757 59.575 -0.853 59.509 -0.941 c
+59.44 -1.022 59.363 -1.088 59.274 -1.147 c
+59.186 -1.206 59.087 -1.249 58.981 -1.279 c
+58.881 -1.309 58.763 -1.324 58.628 -1.324 c
+59.612 0.353 m
+59.186 0.338 l
+59.087 0.338 58.995 0.33 58.906 0.323 c
+58.826 0.312 58.76 0.286 58.701 0.249 c
+58.642 0.209 58.591 0.151 58.554 0.073 c
+58.514 0.004 58.495 -0.088 58.495 -0.206 c
+58.495 -0.375 58.528 -0.497 58.598 -0.574 c
+58.664 -0.655 58.763 -0.691 58.892 -0.691 c
+58.998 -0.691 59.098 -0.669 59.186 -0.618 c
+59.282 -0.57 59.363 -0.507 59.421 -0.426 c
+59.488 -0.349 59.538 -0.262 59.569 -0.162 c
+59.598 -0.055 59.612 0.058 59.612 0.176 c
+h
+63.261 -2.66 m
+63.045 -2.66 62.854 -2.635 62.688 -2.587 c
+62.519 -2.547 62.379 -2.484 62.262 -2.396 c
+62.144 -2.315 62.045 -2.22 61.967 -2.103 c
+61.898 -1.985 61.85 -1.856 61.821 -1.72 c
+62.717 -1.617 l
+62.754 -1.754 62.824 -1.86 62.923 -1.941 c
+63.019 -2.029 63.143 -2.072 63.291 -2.072 c
+63.379 -2.072 63.459 -2.058 63.54 -2.029 c
+63.618 -1.999 63.688 -1.945 63.746 -1.867 c
+63.805 -1.797 63.849 -1.706 63.879 -1.588 c
+63.916 -1.47 63.937 -1.324 63.937 -1.147 c
+63.937 -0.956 l
+63.937 -0.89 63.941 -0.831 63.952 -0.779 c
+63.952 -0.588 l
+63.937 -0.588 l
+63.839 -0.816 63.695 -0.977 63.511 -1.073 c
+63.324 -1.172 63.118 -1.22 62.894 -1.22 c
+62.688 -1.22 62.505 -1.183 62.35 -1.103 c
+62.203 -1.014 62.075 -0.897 61.967 -0.75 c
+61.869 -0.595 61.795 -0.412 61.747 -0.206 c
+61.696 0.008 61.674 0.243 61.674 0.5 c
+61.674 0.771 61.696 1.018 61.747 1.234 c
+61.807 1.448 61.887 1.631 61.998 1.778 c
+62.104 1.932 62.236 2.05 62.394 2.131 c
+62.549 2.219 62.736 2.263 62.952 2.263 c
+63.048 2.263 63.147 2.252 63.247 2.234 c
+63.342 2.212 63.43 2.179 63.511 2.131 c
+63.6 2.08 63.677 2.017 63.746 1.94 c
+63.824 1.859 63.886 1.768 63.937 1.66 c
+63.952 1.66 l
+63.952 1.808 l
+63.96 1.866 63.967 1.918 63.967 1.969 c
+63.974 2.028 63.982 2.076 63.982 2.117 c
+63.989 2.164 64 2.198 64.011 2.219 c
+64.864 2.219 l
+64.853 2.138 64.841 2.028 64.834 1.882 c
+64.834 1.411 l
+64.834 -1.162 l
+64.834 -1.415 64.797 -1.636 64.731 -1.823 c
+64.662 -2.007 64.558 -2.161 64.423 -2.278 c
+64.283 -2.404 64.118 -2.5 63.923 -2.558 c
+63.725 -2.624 63.504 -2.66 63.261 -2.66 c
+63.952 0.529 m
+63.952 0.742 63.926 0.918 63.879 1.058 c
+63.839 1.205 63.783 1.323 63.717 1.411 c
+63.658 1.499 63.588 1.558 63.511 1.587 c
+63.43 1.624 63.353 1.646 63.276 1.646 c
+63.177 1.646 63.085 1.62 62.997 1.573 c
+62.916 1.532 62.85 1.462 62.791 1.367 c
+62.74 1.278 62.696 1.161 62.659 1.014 c
+62.629 0.874 62.615 0.706 62.615 0.5 c
+62.615 0.125 62.673 -0.154 62.791 -0.339 c
+62.908 -0.515 63.07 -0.603 63.276 -0.603 c
+63.342 -0.603 63.415 -0.588 63.496 -0.559 c
+63.585 -0.522 63.658 -0.463 63.717 -0.383 c
+63.783 -0.294 63.839 -0.177 63.879 -0.03 c
+63.926 0.118 63.952 0.301 63.952 0.529 c
+67.351 -1.324 m
+67.094 -1.324 66.866 -1.286 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.728 65.867 -0.537 65.778 -0.309 c
+65.697 -0.085 65.661 0.18 65.661 0.484 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.741 66.175 1.882 c
+66.341 2.017 66.528 2.117 66.734 2.175 c
+66.94 2.242 67.149 2.278 67.366 2.278 c
+67.638 2.278 67.873 2.227 68.072 2.131 c
+68.277 2.043 68.443 1.911 68.571 1.734 c
+68.707 1.565 68.807 1.359 68.865 1.117 c
+68.932 0.881 68.968 0.617 68.968 0.323 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.162 66.617 0.022 66.646 -0.103 c
+66.682 -0.231 66.738 -0.345 66.808 -0.441 c
+66.873 -0.53 66.958 -0.599 67.058 -0.647 c
+67.153 -0.698 67.267 -0.721 67.396 -0.721 c
+67.55 -0.721 67.689 -0.688 67.807 -0.618 c
+67.932 -0.551 68.02 -0.449 68.072 -0.309 c
+68.909 -0.383 l
+68.88 -0.482 68.824 -0.588 68.747 -0.706 c
+68.666 -0.816 68.564 -0.919 68.439 -1.014 c
+68.321 -1.103 68.167 -1.176 67.983 -1.235 c
+67.807 -1.294 67.594 -1.324 67.351 -1.324 c
+67.351 1.705 m
+67.263 1.705 67.175 1.691 67.087 1.66 c
+66.999 1.631 66.918 1.579 66.852 1.514 c
+66.782 1.444 66.723 1.356 66.675 1.249 c
+66.634 1.139 66.617 1.014 66.617 0.867 c
+68.086 0.867 l
+68.086 1.003 68.061 1.124 68.013 1.234 c
+67.972 1.341 67.918 1.429 67.851 1.499 c
+67.793 1.565 67.719 1.616 67.631 1.646 c
+67.542 1.683 67.447 1.705 67.351 1.705 c
+72.03 -1.264 m
+72.018 -1.246 72.007 -1.216 72 -1.176 c
+72 -1.129 71.993 -1.081 71.985 -1.029 c
+71.985 -0.971 71.978 -0.912 71.97 -0.853 c
+71.97 -0.691 l
+71.853 -0.927 71.71 -1.095 71.544 -1.191 c
+71.375 -1.279 71.176 -1.324 70.941 -1.324 c
+70.744 -1.324 70.567 -1.279 70.412 -1.191 c
+70.254 -1.103 70.122 -0.981 70.015 -0.823 c
+69.917 -0.659 69.84 -0.467 69.78 -0.25 c
+69.729 -0.037 69.707 0.205 69.707 0.47 c
+69.707 0.735 69.729 0.974 69.78 1.19 c
+69.84 1.415 69.917 1.606 70.015 1.764 c
+70.122 1.918 70.254 2.043 70.412 2.131 c
+70.578 2.227 70.769 2.278 70.985 2.278 c
+71.081 2.278 71.176 2.263 71.265 2.234 c
+71.361 2.212 71.456 2.179 71.544 2.131 c
+71.633 2.08 71.71 2.017 71.779 1.94 c
+71.857 1.859 71.92 1.768 71.97 1.66 c
+71.97 1.749 l
+71.97 1.896 l
+71.97 2.057 l
+71.97 2.234 l
+71.97 3.513 l
+72.867 3.513 l
+72.867 -0.5 l
+72.867 -0.676 72.871 -0.834 72.882 -0.971 c
+72.889 -1.099 72.897 -1.199 72.897 -1.264 c
+h
+71.985 0.484 m
+71.985 0.72 71.959 0.911 71.912 1.058 c
+71.872 1.213 71.816 1.338 71.75 1.425 c
+71.691 1.514 71.621 1.573 71.544 1.602 c
+71.463 1.639 71.386 1.66 71.309 1.66 c
+71.21 1.66 71.118 1.635 71.03 1.587 c
+70.949 1.547 70.883 1.477 70.824 1.381 c
+70.773 1.282 70.729 1.161 70.692 1.014 c
+70.663 0.867 70.648 0.683 70.648 0.47 c
+70.648 0.077 70.699 -0.217 70.809 -0.412 c
+70.927 -0.611 71.089 -0.706 71.294 -0.706 c
+71.371 -0.706 71.449 -0.688 71.529 -0.647 c
+71.606 -0.611 71.681 -0.544 71.75 -0.456 c
+71.816 -0.368 71.872 -0.246 71.912 -0.088 c
+71.959 0.066 71.985 0.257 71.985 0.484 c
+78.729 -2.631 m
+78.729 3.513 l
+80.654 3.513 l
+80.654 2.896 l
+79.581 2.896 l
+79.581 -2.014 l
+80.654 -2.014 l
+80.654 -2.631 l
+h
+83.685 1.602 m
+83.685 -1.264 l
+82.789 -1.264 l
+82.789 1.602 l
+81.966 1.602 l
+81.966 2.219 l
+82.789 2.219 l
+82.789 2.484 l
+82.789 2.609 82.804 2.741 82.833 2.881 c
+82.87 3.017 82.939 3.135 83.039 3.233 c
+83.145 3.34 83.288 3.428 83.465 3.498 c
+83.641 3.564 83.866 3.601 84.142 3.601 c
+84.354 3.601 84.553 3.59 84.73 3.572 c
+84.905 3.549 85.056 3.532 85.185 3.513 c
+85.185 2.925 l
+85.056 2.944 84.913 2.958 84.759 2.969 c
+84.601 2.977 84.45 2.984 84.303 2.984 c
+84.175 2.984 84.071 2.969 83.994 2.94 c
+83.914 2.91 83.851 2.869 83.803 2.822 c
+83.752 2.771 83.718 2.708 83.7 2.631 c
+83.689 2.561 83.685 2.484 83.685 2.396 c
+83.685 2.219 l
+85.112 2.219 l
+85.112 1.602 l
+h
+88.202 -0.647 m
+89.334 -0.647 l
+89.334 -1.264 l
+86.027 -1.264 l
+86.027 -0.647 l
+87.29 -0.647 l
+87.29 1.602 l
+86.365 1.602 l
+86.365 2.219 l
+88.202 2.219 l
+h
+87.29 3.513 0.912 -0.676 re
+87.29 2.836 m
+92.262 -0.647 m
+93.395 -0.647 l
+93.395 -1.264 l
+90.087 -1.264 l
+90.087 -0.647 l
+91.351 -0.647 l
+91.351 2.896 l
+90.425 2.896 l
+90.425 3.513 l
+92.262 3.513 l
+h
+95.78 -1.324 m
+95.522 -1.324 95.294 -1.286 95.088 -1.22 c
+94.883 -1.143 94.706 -1.029 94.559 -0.882 c
+94.413 -0.728 94.295 -0.537 94.207 -0.309 c
+94.126 -0.085 94.089 0.18 94.089 0.484 c
+94.089 0.816 94.133 1.095 94.222 1.323 c
+94.317 1.558 94.446 1.741 94.604 1.882 c
+94.769 2.017 94.956 2.117 95.162 2.175 c
+95.367 2.242 95.577 2.278 95.794 2.278 c
+96.065 2.278 96.301 2.227 96.499 2.131 c
+96.705 2.043 96.871 1.911 97 1.734 c
+97.135 1.565 97.235 1.359 97.293 1.117 c
+97.359 0.881 97.397 0.617 97.397 0.323 c
+97.397 0.309 l
+95.03 0.309 l
+95.03 0.162 95.045 0.022 95.074 -0.103 c
+95.111 -0.231 95.165 -0.345 95.236 -0.441 c
+95.302 -0.53 95.386 -0.599 95.485 -0.647 c
+95.581 -0.698 95.695 -0.721 95.824 -0.721 c
+95.978 -0.721 96.117 -0.688 96.235 -0.618 c
+96.36 -0.551 96.448 -0.449 96.499 -0.309 c
+97.337 -0.383 l
+97.308 -0.482 97.253 -0.588 97.176 -0.706 c
+97.095 -0.816 96.992 -0.919 96.867 -1.014 c
+96.749 -1.103 96.595 -1.176 96.412 -1.235 c
+96.235 -1.294 96.022 -1.324 95.78 -1.324 c
+95.78 1.705 m
+95.691 1.705 95.603 1.691 95.515 1.66 c
+95.427 1.631 95.346 1.579 95.28 1.514 c
+95.209 1.444 95.151 1.356 95.103 1.249 c
+95.063 1.139 95.045 1.014 95.045 0.867 c
+96.514 0.867 l
+96.514 1.003 96.489 1.124 96.441 1.234 c
+96.4 1.341 96.345 1.429 96.279 1.499 c
+96.221 1.565 96.146 1.616 96.059 1.646 c
+95.97 1.683 95.875 1.705 95.78 1.705 c
+98.653 -2.631 m
+98.653 -2.014 l
+99.726 -2.014 l
+99.726 2.896 l
+98.653 2.896 l
+98.653 3.513 l
+100.578 3.513 l
+100.578 -2.631 l
+h
+f
+Q
+q 1 0 0 1 294.3676 334.3982 cm
+0 0 m
+0 0.264 -0.073 0.463 -0.221 0.603 c
+-0.36 0.75 -0.617 0.89 -1 1.029 c
+-1.374 1.166 -1.661 1.309 -1.867 1.455 c
+-2.066 1.602 -2.213 1.768 -2.308 1.955 c
+-2.407 2.15 -2.455 2.371 -2.455 2.616 c
+-2.455 3.036 -2.315 3.385 -2.028 3.66 c
+-1.746 3.932 -1.378 4.072 -0.927 4.072 c
+-0.614 4.072 -0.335 3.998 -0.088 3.851 c
+0.154 3.712 0.341 3.517 0.47 3.263 c
+0.606 3.017 0.675 2.749 0.675 2.455 c
+0 2.455 l
+0 2.786 -0.081 3.043 -0.235 3.219 c
+-0.393 3.403 -0.625 3.499 -0.927 3.499 c
+-1.191 3.499 -1.404 3.418 -1.558 3.263 c
+-1.706 3.117 -1.779 2.903 -1.779 2.631 c
+-1.779 2.404 -1.702 2.213 -1.544 2.058 c
+-1.378 1.911 -1.125 1.771 -0.779 1.646 c
+-0.262 1.478 0.11 1.268 0.338 1.014 c
+0.573 0.757 0.69 0.426 0.69 0.015 c
+0.69 -0.426 0.548 -0.779 0.264 -1.043 c
+-0.023 -1.301 -0.405 -1.425 -0.882 -1.425 c
+-1.198 -1.425 -1.484 -1.356 -1.75 -1.22 c
+-2.014 -1.084 -2.227 -0.893 -2.382 -0.646 c
+-2.529 -0.404 -2.602 -0.118 -2.602 0.206 c
+-1.926 0.206 l
+-1.926 -0.128 -1.834 -0.389 -1.646 -0.573 c
+-1.463 -0.76 -1.206 -0.852 -0.882 -0.852 c
+-0.588 -0.852 -0.368 -0.779 -0.221 -0.632 c
+-0.073 -0.478 0 -0.264 0 0 c
+2.117 2.22 m
+2.37 2.543 2.69 2.705 3.072 2.705 c
+3.777 2.705 4.134 2.234 4.145 1.294 c
+4.145 -1.352 l
+3.498 -1.352 l
+3.498 1.264 l
+3.498 1.577 3.443 1.797 3.337 1.926 c
+3.226 2.051 3.072 2.117 2.866 2.117 c
+2.708 2.117 2.561 2.062 2.425 1.955 c
+2.296 1.845 2.194 1.709 2.117 1.544 c
+2.117 -1.352 l
+1.469 -1.352 l
+1.469 4.293 l
+2.117 4.293 l
+h
+4.968 0.823 m
+4.968 1.401 5.104 1.856 5.379 2.19 c
+5.662 2.532 6.034 2.705 6.497 2.705 c
+6.956 2.705 7.324 2.536 7.599 2.205 c
+7.882 1.881 8.029 1.434 8.04 0.867 c
+8.04 0.441 l
+8.04 -0.128 7.897 -0.584 7.614 -0.926 c
+7.339 -1.261 6.971 -1.425 6.512 -1.425 c
+6.048 -1.425 5.677 -1.264 5.394 -0.941 c
+5.119 -0.61 4.976 -0.168 4.968 0.382 c
+h
+5.614 0.441 m
+5.614 0.037 5.692 -0.279 5.85 -0.515 c
+6.015 -0.75 6.236 -0.867 6.512 -0.867 c
+7.077 -0.867 7.372 -0.455 7.393 0.368 c
+7.393 0.823 l
+7.393 1.224 7.309 1.544 7.144 1.779 c
+6.986 2.022 6.769 2.146 6.497 2.146 c
+6.232 2.146 6.015 2.022 5.85 1.779 c
+5.692 1.544 5.614 1.224 5.614 0.823 c
+h
+11.848 -0.206 m
+12.45 2.631 l
+13.097 2.631 l
+12.112 -1.352 l
+11.597 -1.352 l
+10.818 1.5 l
+10.069 -1.352 l
+9.539 -1.352 l
+8.584 2.631 l
+9.216 2.631 l
+9.834 -0.132 l
+10.568 2.631 l
+11.083 2.631 l
+h
+16.874 -0.867 m
+17.088 -0.867 17.26 -0.804 17.389 -0.676 c
+17.525 -0.54 17.598 -0.349 17.609 -0.103 c
+18.227 -0.103 l
+18.204 -0.484 18.069 -0.804 17.815 -1.058 c
+17.558 -1.304 17.246 -1.425 16.874 -1.425 c
+16.382 -1.425 16.007 -1.275 15.742 -0.97 c
+15.486 -0.658 15.36 -0.191 15.36 0.426 c
+15.36 0.867 l
+15.36 1.463 15.486 1.918 15.742 2.234 c
+16.007 2.547 16.382 2.705 16.874 2.705 c
+17.275 2.705 17.595 2.573 17.83 2.308 c
+18.073 2.051 18.204 1.706 18.227 1.264 c
+17.609 1.264 l
+17.587 1.558 17.514 1.779 17.389 1.926 c
+17.271 2.072 17.099 2.146 16.874 2.146 c
+16.581 2.146 16.363 2.047 16.228 1.852 c
+16.088 1.665 16.014 1.357 16.007 0.927 c
+16.007 0.412 l
+16.007 -0.058 16.073 -0.393 16.213 -0.588 c
+16.359 -0.775 16.581 -0.867 16.874 -0.867 c
+19.623 2.22 m
+19.877 2.543 20.196 2.705 20.579 2.705 c
+21.284 2.705 21.641 2.234 21.651 1.294 c
+21.651 -1.352 l
+21.005 -1.352 l
+21.005 1.264 l
+21.005 1.577 20.949 1.797 20.843 1.926 c
+20.733 2.051 20.579 2.117 20.373 2.117 c
+20.215 2.117 20.068 2.062 19.931 1.955 c
+19.803 1.845 19.7 1.709 19.623 1.544 c
+19.623 -1.352 l
+18.977 -1.352 l
+18.977 4.293 l
+19.623 4.293 l
+h
+24.65 -1.352 m
+24.61 -1.264 24.584 -1.117 24.577 -0.912 c
+24.342 -1.257 24.047 -1.425 23.694 -1.425 c
+23.331 -1.425 23.048 -1.33 22.842 -1.132 c
+22.644 -0.926 22.548 -0.639 22.548 -0.264 c
+22.548 0.136 22.684 0.456 22.96 0.691 c
+23.232 0.933 23.607 1.058 24.077 1.058 c
+24.562 1.058 l
+24.562 1.484 l
+24.562 1.72 24.507 1.885 24.4 1.985 c
+24.29 2.091 24.128 2.146 23.915 2.146 c
+23.717 2.146 23.555 2.088 23.43 1.97 c
+23.312 1.852 23.253 1.706 23.253 1.529 c
+22.607 1.529 l
+22.607 1.723 22.666 1.914 22.783 2.103 c
+22.908 2.286 23.07 2.433 23.268 2.543 c
+23.474 2.65 23.702 2.705 23.959 2.705 c
+24.359 2.705 24.664 2.602 24.87 2.396 c
+25.084 2.19 25.198 1.897 25.209 1.515 c
+25.209 -0.5 l
+25.209 -0.804 25.246 -1.069 25.327 -1.294 c
+25.327 -1.352 l
+h
+23.783 -0.837 m
+23.948 -0.837 24.099 -0.794 24.238 -0.706 c
+24.386 -0.617 24.492 -0.507 24.562 -0.367 c
+24.562 0.574 l
+24.194 0.574 l
+23.879 0.574 23.636 0.503 23.459 0.368 c
+23.283 0.239 23.195 0.052 23.195 -0.191 c
+23.195 -0.419 23.239 -0.584 23.328 -0.69 c
+23.415 -0.79 23.566 -0.837 23.783 -0.837 c
+26.825 2.631 m
+26.84 2.19 l
+27.094 2.532 27.417 2.705 27.81 2.705 c
+28.516 2.705 28.872 2.234 28.884 1.294 c
+28.884 -1.352 l
+28.236 -1.352 l
+28.236 1.264 l
+28.236 1.577 28.182 1.797 28.075 1.926 c
+27.964 2.051 27.81 2.117 27.605 2.117 c
+27.447 2.117 27.299 2.062 27.164 1.955 c
+27.035 1.845 26.932 1.709 26.855 1.544 c
+26.855 -1.352 l
+26.208 -1.352 l
+26.208 2.631 l
+h
+29.722 0.823 m
+29.722 1.44 29.832 1.904 30.059 2.22 c
+30.283 2.543 30.618 2.705 31.059 2.705 c
+31.459 2.705 31.764 2.529 31.97 2.176 c
+32.014 2.631 l
+32.602 2.631 l
+32.602 -1.396 l
+32.602 -1.885 32.473 -2.263 32.22 -2.528 c
+31.963 -2.793 31.61 -2.925 31.162 -2.925 c
+30.964 -2.925 30.742 -2.873 30.501 -2.778 c
+30.254 -2.678 30.074 -2.558 29.957 -2.41 c
+30.221 -1.97 l
+30.486 -2.234 30.783 -2.366 31.118 -2.366 c
+31.654 -2.366 31.93 -2.072 31.941 -1.484 c
+31.941 -0.955 l
+31.735 -1.271 31.434 -1.425 31.044 -1.425 c
+30.632 -1.425 30.309 -1.275 30.074 -0.97 c
+29.846 -0.658 29.728 -0.206 29.722 0.382 c
+h
+30.383 0.441 m
+30.383 0 30.445 -0.33 30.574 -0.544 c
+30.699 -0.75 30.916 -0.852 31.22 -0.852 c
+31.544 -0.852 31.783 -0.687 31.941 -0.353 c
+31.941 1.632 l
+31.772 1.955 31.533 2.117 31.22 2.117 c
+30.927 2.117 30.71 2.014 30.574 1.808 c
+30.445 1.602 30.383 1.279 30.383 0.838 c
+h
+34.983 -1.425 m
+34.484 -1.425 34.102 -1.278 33.837 -0.985 c
+33.572 -0.69 33.44 -0.257 33.44 0.324 c
+33.44 0.794 l
+33.44 1.389 33.565 1.856 33.822 2.19 c
+34.087 2.532 34.447 2.705 34.91 2.705 c
+35.369 2.705 35.711 2.55 35.939 2.249 c
+36.174 1.955 36.296 1.492 36.307 0.867 c
+36.307 0.441 l
+34.087 0.441 l
+34.087 0.353 l
+34.087 -0.081 34.164 -0.393 34.322 -0.588 c
+34.487 -0.775 34.719 -0.867 35.012 -0.867 c
+35.208 -0.867 35.38 -0.833 35.527 -0.764 c
+35.675 -0.687 35.81 -0.569 35.939 -0.411 c
+36.277 -0.823 l
+35.991 -1.227 35.561 -1.425 34.983 -1.425 c
+34.91 2.146 m
+34.634 2.146 34.432 2.051 34.307 1.867 c
+34.179 1.679 34.106 1.389 34.087 1 c
+35.66 1 l
+35.66 1.087 l
+35.638 1.47 35.571 1.738 35.454 1.897 c
+35.336 2.062 35.153 2.146 34.91 2.146 c
+39.026 -0.338 m
+39.026 -0.191 38.971 -0.07 38.864 0.029 c
+38.754 0.125 38.548 0.243 38.247 0.382 c
+37.901 0.53 37.659 0.651 37.512 0.75 c
+37.364 0.856 37.254 0.974 37.188 1.103 c
+37.119 1.228 37.086 1.386 37.086 1.573 c
+37.086 1.897 37.203 2.165 37.439 2.381 c
+37.674 2.595 37.975 2.705 38.349 2.705 c
+38.732 2.705 39.041 2.591 39.276 2.367 c
+39.511 2.139 39.629 1.852 39.629 1.5 c
+38.981 1.5 l
+38.981 1.675 38.923 1.827 38.805 1.955 c
+38.688 2.08 38.534 2.146 38.349 2.146 c
+38.151 2.146 38 2.091 37.894 1.985 c
+37.784 1.885 37.732 1.754 37.732 1.588 c
+37.732 1.459 37.769 1.353 37.85 1.264 c
+37.927 1.183 38.118 1.081 38.424 0.956 c
+38.901 0.769 39.232 0.58 39.408 0.397 c
+39.584 0.221 39.673 -0.008 39.673 -0.279 c
+39.673 -0.632 39.548 -0.912 39.305 -1.117 c
+39.07 -1.323 38.754 -1.425 38.364 -1.425 c
+37.942 -1.425 37.603 -1.308 37.35 -1.072 c
+37.092 -0.831 36.968 -0.525 36.968 -0.162 c
+37.615 -0.162 l
+37.622 -0.389 37.692 -0.565 37.821 -0.69 c
+37.946 -0.808 38.129 -0.867 38.364 -0.867 c
+38.578 -0.867 38.739 -0.819 38.85 -0.72 c
+38.967 -0.625 39.026 -0.496 39.026 -0.338 c
+45.111 0.441 m
+45.111 -0.176 44.997 -0.643 44.774 -0.955 c
+44.556 -1.271 44.233 -1.425 43.803 -1.425 c
+43.38 -1.425 43.068 -1.246 42.862 -0.881 c
+42.833 -1.352 l
+42.23 -1.352 l
+42.23 4.293 l
+42.877 4.293 l
+42.877 2.19 l
+43.09 2.532 43.399 2.705 43.803 2.705 c
+44.233 2.705 44.556 2.547 44.774 2.234 c
+44.997 1.929 45.111 1.463 45.111 0.838 c
+h
+44.464 0.823 m
+44.464 1.294 44.394 1.625 44.259 1.823 c
+44.13 2.018 43.92 2.117 43.627 2.117 c
+43.292 2.117 43.043 1.933 42.877 1.573 c
+42.877 -0.309 l
+43.043 -0.673 43.296 -0.852 43.641 -0.852 c
+43.935 -0.852 44.145 -0.75 44.273 -0.544 c
+44.398 -0.338 44.464 -0.022 44.464 0.412 c
+h
+47.375 -1.425 m
+46.875 -1.425 46.493 -1.278 46.228 -0.985 c
+45.964 -0.69 45.831 -0.257 45.831 0.324 c
+45.831 0.794 l
+45.831 1.389 45.956 1.856 46.214 2.19 c
+46.478 2.532 46.838 2.705 47.301 2.705 c
+47.76 2.705 48.103 2.55 48.33 2.249 c
+48.566 1.955 48.687 1.492 48.697 0.867 c
+48.697 0.441 l
+46.478 0.441 l
+46.478 0.353 l
+46.478 -0.081 46.555 -0.393 46.713 -0.588 c
+46.879 -0.775 47.11 -0.867 47.404 -0.867 c
+47.599 -0.867 47.772 -0.833 47.918 -0.764 c
+48.066 -0.687 48.202 -0.569 48.33 -0.411 c
+48.668 -0.823 l
+48.381 -1.227 47.951 -1.425 47.375 -1.425 c
+47.301 2.146 m
+47.026 2.146 46.823 2.051 46.698 1.867 c
+46.57 1.679 46.497 1.389 46.478 1 c
+48.051 1 l
+48.051 1.087 l
+48.029 1.47 47.963 1.738 47.845 1.897 c
+47.727 2.062 47.544 2.146 47.301 2.146 c
+50.33 3.587 m
+50.33 2.631 l
+50.932 2.631 l
+50.932 2.103 l
+50.33 2.103 l
+50.33 -0.367 l
+50.33 -0.525 50.351 -0.643 50.403 -0.72 c
+50.461 -0.801 50.55 -0.837 50.667 -0.837 c
+50.756 -0.837 50.844 -0.823 50.932 -0.794 c
+50.932 -1.352 l
+50.785 -1.4 50.631 -1.425 50.476 -1.425 c
+50.219 -1.425 50.025 -1.334 49.888 -1.147 c
+49.749 -0.962 49.682 -0.702 49.682 -0.367 c
+49.682 2.103 l
+49.08 2.103 l
+49.08 2.631 l
+49.682 2.631 l
+49.682 3.587 l
+h
+54.665 -0.206 m
+55.268 2.631 l
+55.915 2.631 l
+54.93 -1.352 l
+54.416 -1.352 l
+53.636 1.5 l
+52.887 -1.352 l
+52.358 -1.352 l
+51.402 2.631 l
+52.034 2.631 l
+52.651 -0.132 l
+53.387 2.631 l
+53.902 2.631 l
+h
+58.017 -1.425 m
+57.517 -1.425 57.135 -1.278 56.871 -0.985 c
+56.606 -0.69 56.474 -0.257 56.474 0.324 c
+56.474 0.794 l
+56.474 1.389 56.599 1.856 56.855 2.19 c
+57.12 2.532 57.48 2.705 57.944 2.705 c
+58.403 2.705 58.744 2.55 58.972 2.249 c
+59.207 1.955 59.329 1.492 59.34 0.867 c
+59.34 0.441 l
+57.12 0.441 l
+57.12 0.353 l
+57.12 -0.081 57.198 -0.393 57.355 -0.588 c
+57.521 -0.775 57.752 -0.867 58.046 -0.867 c
+58.241 -0.867 58.414 -0.833 58.561 -0.764 c
+58.708 -0.687 58.844 -0.569 58.972 -0.411 c
+59.311 -0.823 l
+59.024 -1.227 58.594 -1.425 58.017 -1.425 c
+57.944 2.146 m
+57.668 2.146 57.466 2.051 57.341 1.867 c
+57.212 1.679 57.139 1.389 57.12 1 c
+58.693 1 l
+58.693 1.087 l
+58.671 1.47 58.605 1.738 58.488 1.897 c
+58.37 2.062 58.186 2.146 57.944 2.146 c
+61.545 -1.425 m
+61.045 -1.425 60.663 -1.278 60.398 -0.985 c
+60.134 -0.69 60.001 -0.257 60.001 0.324 c
+60.001 0.794 l
+60.001 1.389 60.126 1.856 60.383 2.19 c
+60.648 2.532 61.008 2.705 61.472 2.705 c
+61.931 2.705 62.272 2.55 62.5 2.249 c
+62.735 1.955 62.856 1.492 62.868 0.867 c
+62.868 0.441 l
+60.648 0.441 l
+60.648 0.353 l
+60.648 -0.081 60.726 -0.393 60.883 -0.588 c
+61.048 -0.775 61.28 -0.867 61.574 -0.867 c
+61.769 -0.867 61.942 -0.833 62.089 -0.764 c
+62.236 -0.687 62.372 -0.569 62.5 -0.411 c
+62.839 -0.823 l
+62.552 -1.227 62.122 -1.425 61.545 -1.425 c
+61.472 2.146 m
+61.196 2.146 60.994 2.051 60.869 1.867 c
+60.74 1.679 60.666 1.389 60.648 1 c
+62.221 1 l
+62.221 1.087 l
+62.199 1.47 62.133 1.738 62.015 1.897 c
+61.898 2.062 61.713 2.146 61.472 2.146 c
+64.264 2.631 m
+64.279 2.19 l
+64.532 2.532 64.855 2.705 65.249 2.705 c
+65.954 2.705 66.311 2.234 66.322 1.294 c
+66.322 -1.352 l
+65.675 -1.352 l
+65.675 1.264 l
+65.675 1.577 65.62 1.797 65.513 1.926 c
+65.403 2.051 65.249 2.117 65.043 2.117 c
+64.885 2.117 64.738 2.062 64.602 1.955 c
+64.474 1.845 64.371 1.709 64.294 1.544 c
+64.294 -1.352 l
+63.647 -1.352 l
+63.647 2.631 l
+h
+f
+Q
+q 1 0 0 1 365.0407 334.1188 cm
+0 0 m
+0 0.088 -0.044 0.166 -0.133 0.235 c
+-0.221 0.312 -0.408 0.416 -0.691 0.544 c
+-1.125 0.721 -1.422 0.9 -1.588 1.088 c
+-1.746 1.272 -1.823 1.503 -1.823 1.779 c
+-1.823 2.12 -1.702 2.404 -1.455 2.631 c
+-1.202 2.866 -0.864 2.984 -0.441 2.984 c
+-0.011 2.984 0.338 2.87 0.602 2.646 c
+0.867 2.419 0.999 2.117 0.999 1.735 c
+-0.044 1.735 l
+-0.044 2.058 -0.184 2.22 -0.456 2.22 c
+-0.566 2.22 -0.655 2.183 -0.721 2.117 c
+-0.79 2.047 -0.823 1.948 -0.823 1.823 c
+-0.823 1.735 -0.786 1.654 -0.706 1.588 c
+-0.628 1.529 -0.449 1.434 -0.162 1.309 c
+0.268 1.151 0.565 0.975 0.735 0.779 c
+0.912 0.592 0.999 0.342 0.999 0.03 c
+0.999 -0.323 0.867 -0.61 0.602 -0.823 c
+0.338 -1.039 -0.011 -1.146 -0.441 -1.146 c
+-0.735 -1.146 -0.996 -1.091 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.75 -0.499 c
+-1.867 -0.293 -1.926 -0.073 -1.926 0.162 c
+-0.941 0.162 l
+-0.941 -0.025 -0.904 -0.162 -0.823 -0.249 c
+-0.735 -0.338 -0.603 -0.382 -0.426 -0.382 c
+-0.144 -0.382 0 -0.257 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.395 2.911 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.148 l
+2.866 -0.01 2.884 -0.118 2.925 -0.176 c
+2.973 -0.235 3.057 -0.264 3.175 -0.264 c
+3.281 -0.264 3.366 -0.257 3.424 -0.235 c
+3.424 -1.043 l
+3.248 -1.109 3.057 -1.146 2.851 -1.146 c
+2.175 -1.146 1.83 -0.76 1.822 0.015 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.911 l
+1.822 2.911 l
+1.822 3.881 l
+h
+5.85 -1.072 m
+5.82 -1.014 5.791 -0.911 5.762 -0.764 c
+5.575 -1.022 5.325 -1.146 5.012 -1.146 c
+4.677 -1.146 4.399 -1.039 4.174 -0.823 c
+3.958 -0.598 3.85 -0.309 3.85 0.044 c
+3.85 0.456 3.983 0.772 4.247 1 c
+4.513 1.235 4.895 1.353 5.394 1.353 c
+5.718 1.353 l
+5.718 1.676 l
+5.718 1.852 5.681 1.974 5.615 2.043 c
+5.556 2.12 5.468 2.161 5.35 2.161 c
+5.093 2.161 4.968 2.007 4.968 1.706 c
+3.925 1.706 l
+3.925 2.076 4.06 2.382 4.336 2.617 c
+4.608 2.859 4.957 2.984 5.38 2.984 c
+5.82 2.984 6.159 2.866 6.394 2.631 c
+6.636 2.404 6.761 2.08 6.761 1.661 c
+6.761 -0.205 l
+6.761 -0.551 6.809 -0.819 6.908 -1.014 c
+6.908 -1.072 l
+h
+5.247 -0.323 m
+5.354 -0.323 5.446 -0.305 5.527 -0.264 c
+5.615 -0.216 5.677 -0.158 5.718 -0.087 c
+5.718 0.736 l
+5.468 0.736 l
+5.292 0.736 5.148 0.676 5.041 0.559 c
+4.943 0.449 4.895 0.302 4.895 0.118 c
+4.895 -0.176 5.012 -0.323 5.247 -0.323 c
+7.378 1.044 m
+7.378 1.691 7.497 2.176 7.732 2.5 c
+7.967 2.822 8.297 2.984 8.731 2.984 c
+9.084 2.984 9.356 2.841 9.554 2.558 c
+9.598 2.911 l
+10.539 2.911 l
+10.539 -1.072 l
+10.539 -1.579 10.396 -1.969 10.113 -2.234 c
+9.826 -2.506 9.422 -2.645 8.893 -2.645 c
+8.665 -2.645 8.43 -2.601 8.187 -2.514 c
+7.952 -2.425 7.775 -2.311 7.658 -2.175 c
+8.01 -1.455 l
+8.106 -1.562 8.235 -1.646 8.393 -1.705 c
+8.548 -1.77 8.694 -1.808 8.834 -1.808 c
+9.069 -1.808 9.234 -1.749 9.334 -1.631 c
+9.44 -1.521 9.495 -1.344 9.495 -1.103 c
+9.495 -0.75 l
+9.297 -1.014 9.04 -1.146 8.716 -1.146 c
+8.294 -1.146 7.967 -0.985 7.732 -0.661 c
+7.503 -0.33 7.386 0.14 7.378 0.75 c
+h
+8.422 0.779 m
+8.422 0.405 8.47 0.136 8.569 -0.029 c
+8.665 -0.198 8.819 -0.279 9.025 -0.279 c
+9.238 -0.279 9.396 -0.201 9.495 -0.044 c
+9.495 1.852 l
+9.385 2.018 9.231 2.103 9.025 2.103 c
+8.819 2.103 8.665 2.018 8.569 1.852 c
+8.47 1.683 8.422 1.415 8.422 1.044 c
+h
+12.391 -1.072 -1.044 3.983 re
+11.303 3.94 m
+11.303 4.094 11.351 4.223 11.451 4.322 c
+11.557 4.428 11.692 4.484 11.862 4.484 c
+12.039 4.484 12.174 4.428 12.274 4.322 c
+12.38 4.223 12.436 4.094 12.436 3.94 c
+12.436 3.771 12.38 3.635 12.274 3.528 c
+12.174 3.429 12.039 3.381 11.862 3.381 c
+11.692 3.381 11.557 3.429 11.451 3.528 c
+11.351 3.635 11.303 3.771 11.303 3.94 c
+14.155 2.911 m
+14.184 2.514 l
+14.42 2.826 14.721 2.984 15.096 2.984 c
+15.779 2.984 16.132 2.503 16.154 1.544 c
+16.154 -1.072 l
+15.11 -1.072 l
+15.11 1.47 l
+15.11 1.694 15.073 1.856 15.008 1.955 c
+14.938 2.051 14.82 2.103 14.655 2.103 c
+14.468 2.103 14.32 2.007 14.214 1.823 c
+14.214 -1.072 l
+13.17 -1.072 l
+13.17 2.911 l
+h
+16.772 1.044 m
+16.772 1.691 16.889 2.176 17.124 2.5 c
+17.359 2.822 17.69 2.984 18.123 2.984 c
+18.476 2.984 18.748 2.841 18.947 2.558 c
+18.991 2.911 l
+19.931 2.911 l
+19.931 -1.072 l
+19.931 -1.579 19.788 -1.969 19.505 -2.234 c
+19.218 -2.506 18.815 -2.645 18.285 -2.645 c
+18.057 -2.645 17.822 -2.601 17.58 -2.514 c
+17.344 -2.425 17.168 -2.311 17.051 -2.175 c
+17.404 -1.455 l
+17.499 -1.562 17.628 -1.646 17.786 -1.705 c
+17.94 -1.77 18.087 -1.808 18.227 -1.808 c
+18.462 -1.808 18.628 -1.749 18.726 -1.631 c
+18.833 -1.521 18.888 -1.344 18.888 -1.103 c
+18.888 -0.75 l
+18.69 -1.014 18.432 -1.146 18.109 -1.146 c
+17.687 -1.146 17.359 -0.985 17.124 -0.661 c
+16.897 -0.33 16.779 0.14 16.772 0.75 c
+h
+17.815 0.779 m
+17.815 0.405 17.863 0.136 17.962 -0.029 c
+18.057 -0.198 18.212 -0.279 18.418 -0.279 c
+18.63 -0.279 18.788 -0.201 18.888 -0.044 c
+18.888 1.852 l
+18.778 2.018 18.624 2.103 18.418 2.103 c
+18.212 2.103 18.057 2.018 17.962 1.852 c
+17.863 1.683 17.815 1.415 17.815 1.044 c
+h
+24.312 -1.072 m
+24.282 -1.014 24.253 -0.911 24.224 -0.764 c
+24.037 -1.022 23.787 -1.146 23.474 -1.146 c
+23.139 -1.146 22.861 -1.039 22.636 -0.823 c
+22.42 -0.598 22.313 -0.309 22.313 0.044 c
+22.313 0.456 22.445 0.772 22.709 1 c
+22.975 1.235 23.357 1.353 23.856 1.353 c
+24.18 1.353 l
+24.18 1.676 l
+24.18 1.852 24.143 1.974 24.076 2.043 c
+24.018 2.12 23.93 2.161 23.812 2.161 c
+23.555 2.161 23.43 2.007 23.43 1.706 c
+22.387 1.706 l
+22.387 2.076 22.522 2.382 22.798 2.617 c
+23.07 2.859 23.419 2.984 23.841 2.984 c
+24.282 2.984 24.621 2.866 24.856 2.631 c
+25.098 2.404 25.223 2.08 25.223 1.661 c
+25.223 -0.205 l
+25.223 -0.551 25.271 -0.819 25.371 -1.014 c
+25.371 -1.072 l
+h
+23.709 -0.323 m
+23.816 -0.323 23.908 -0.305 23.989 -0.264 c
+24.076 -0.216 24.139 -0.158 24.18 -0.087 c
+24.18 0.736 l
+23.93 0.736 l
+23.754 0.736 23.61 0.676 23.503 0.559 c
+23.405 0.449 23.357 0.302 23.357 0.118 c
+23.357 -0.176 23.474 -0.323 23.709 -0.323 c
+27.928 1.897 m
+27.59 1.926 l
+27.303 1.926 27.112 1.801 27.017 1.559 c
+27.017 -1.072 l
+25.973 -1.072 l
+25.973 2.911 l
+26.943 2.911 l
+26.973 2.469 l
+27.138 2.812 27.369 2.984 27.663 2.984 c
+27.781 2.984 27.873 2.962 27.943 2.926 c
+h
+30 -1.146 m
+29.471 -1.146 29.053 -0.992 28.751 -0.675 c
+28.457 -0.353 28.31 0.107 28.31 0.706 c
+28.31 1.014 l
+28.31 1.64 28.446 2.124 28.722 2.469 c
+28.994 2.812 29.387 2.984 29.898 2.984 c
+30.397 2.984 30.769 2.822 31.015 2.5 c
+31.268 2.176 31.401 1.698 31.411 1.073 c
+31.411 0.574 l
+29.339 0.574 l
+29.358 0.279 29.42 0.063 29.53 -0.073 c
+29.647 -0.213 29.828 -0.279 30.074 -0.279 c
+30.416 -0.279 30.706 -0.162 30.941 0.073 c
+31.353 -0.558 l
+31.224 -0.735 31.037 -0.878 30.794 -0.985 c
+30.548 -1.091 30.283 -1.146 30 -1.146 c
+29.354 1.294 m
+30.383 1.294 l
+30.383 1.397 l
+30.383 1.632 30.343 1.808 30.265 1.926 c
+30.195 2.051 30.067 2.117 29.883 2.117 c
+29.707 2.117 29.574 2.047 29.486 1.912 c
+29.406 1.783 29.361 1.577 29.354 1.294 c
+33.881 -1.072 m
+33.852 -1.014 33.822 -0.911 33.793 -0.764 c
+33.605 -1.022 33.356 -1.146 33.043 -1.146 c
+32.709 -1.146 32.429 -1.039 32.205 -0.823 c
+31.989 -0.598 31.882 -0.309 31.882 0.044 c
+31.882 0.456 32.014 0.772 32.279 1 c
+32.543 1.235 32.926 1.353 33.425 1.353 c
+33.749 1.353 l
+33.749 1.676 l
+33.749 1.852 33.712 1.974 33.646 2.043 c
+33.587 2.12 33.499 2.161 33.381 2.161 c
+33.124 2.161 32.999 2.007 32.999 1.706 c
+31.956 1.706 l
+31.956 2.076 32.091 2.382 32.367 2.617 c
+32.639 2.859 32.988 2.984 33.41 2.984 c
+33.852 2.984 34.189 2.866 34.424 2.631 c
+34.667 2.404 34.792 2.08 34.792 1.661 c
+34.792 -0.205 l
+34.792 -0.551 34.84 -0.819 34.939 -1.014 c
+34.939 -1.072 l
+h
+33.279 -0.323 m
+33.385 -0.323 33.477 -0.305 33.558 -0.264 c
+33.646 -0.216 33.709 -0.158 33.749 -0.087 c
+33.749 0.736 l
+33.499 0.736 l
+33.323 0.736 33.179 0.676 33.073 0.559 c
+32.974 0.449 32.926 0.302 32.926 0.118 c
+32.926 -0.176 33.043 -0.323 33.279 -0.323 c
+f
+Q
+q 1 0 0 1 404.4483 333.0464 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.602 -0.073 -0.955 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.807 0.22 c
+-2.006 0.426 -2.102 0.713 -2.102 1.087 c
+-2.102 1.488 -1.965 1.808 -1.691 2.043 c
+-1.418 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.249 3.337 c
+-0.359 3.443 -0.521 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.337 3.204 -1.396 3.057 -1.396 2.881 c
+-2.042 2.881 l
+-2.042 3.075 -1.984 3.266 -1.866 3.454 c
+-1.741 3.638 -1.58 3.785 -1.381 3.895 c
+-1.176 4.002 -0.947 4.056 -0.691 4.056 c
+-0.29 4.056 0.015 3.954 0.221 3.748 c
+0.434 3.542 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.866 0.515 m
+-0.702 0.515 -0.551 0.558 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.855 -1.19 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.562 -1.084 0.515 -0.866 0.515 c
+2.176 3.983 m
+2.191 3.542 l
+2.444 3.884 2.768 4.056 3.161 4.056 c
+3.866 4.056 4.223 3.586 4.233 2.645 c
+4.233 0 l
+3.587 0 l
+3.587 2.616 l
+3.587 2.929 3.532 3.149 3.425 3.278 c
+3.315 3.403 3.161 3.469 2.955 3.469 c
+2.797 3.469 2.65 3.414 2.514 3.307 c
+2.386 3.197 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.559 0 l
+1.559 3.983 l
+h
+5.072 2.175 m
+5.072 2.782 5.182 3.248 5.409 3.572 c
+5.644 3.895 5.972 4.056 6.394 4.056 c
+6.776 4.056 7.074 3.898 7.291 3.586 c
+7.291 5.644 l
+7.938 5.644 l
+7.938 0 l
+7.35 0 l
+7.306 0.426 l
+7.1 0.091 6.795 -0.073 6.394 -0.073 c
+5.983 -0.073 5.659 0.081 5.424 0.397 c
+5.189 0.72 5.072 1.176 5.072 1.764 c
+h
+5.719 1.793 m
+5.719 1.352 5.781 1.022 5.91 0.808 c
+6.045 0.602 6.266 0.5 6.571 0.5 c
+6.895 0.5 7.133 0.661 7.291 0.985 c
+7.291 2.998 l
+7.122 3.31 6.883 3.469 6.571 3.469 c
+6.266 3.469 6.045 3.366 5.91 3.16 c
+5.781 2.954 5.719 2.631 5.719 2.19 c
+h
+f
+Q
+416.09 333.046 -1.043 3.983 re
+415.002 338.059 m
+415.002 338.213 415.05 338.342 415.149 338.441 c
+415.256 338.547 415.392 338.602 415.561 338.602 c
+415.737 338.602 415.874 338.547 415.972 338.441 c
+416.08 338.342 416.134 338.213 416.134 338.059 c
+416.134 337.889 416.08 337.754 415.972 337.647 c
+415.874 337.548 415.737 337.5 415.561 337.5 c
+415.392 337.5 415.256 337.548 415.149 337.647 c
+415.05 337.754 415.002 337.889 415.002 338.059 c
+417.854 337.029 m
+417.884 336.632 l
+418.119 336.945 418.42 337.103 418.795 337.103 c
+419.478 337.103 419.831 336.622 419.853 335.663 c
+419.853 333.046 l
+418.81 333.046 l
+418.81 335.589 l
+418.81 335.813 418.773 335.975 418.707 336.074 c
+418.637 336.17 418.519 336.221 418.354 336.221 c
+418.166 336.221 418.019 336.125 417.913 335.942 c
+417.913 333.046 l
+416.869 333.046 l
+416.869 337.029 l
+h
+420.456 335.163 m
+420.456 335.809 420.562 336.295 420.779 336.618 c
+421.003 336.941 421.327 337.103 421.749 337.103 c
+422.062 337.103 422.316 336.971 422.513 336.706 c
+422.513 338.691 l
+423.573 338.691 l
+423.573 333.046 l
+422.617 333.046 l
+422.573 333.457 l
+422.356 333.134 422.081 332.973 421.749 332.973 c
+421.337 332.973 421.018 333.127 420.794 333.443 c
+420.577 333.766 420.463 334.236 420.456 334.854 c
+h
+421.499 334.898 m
+421.499 334.505 421.536 334.23 421.617 334.075 c
+421.705 333.918 421.852 333.839 422.058 333.839 c
+422.264 333.839 422.414 333.932 422.513 334.119 c
+422.513 335.927 l
+422.414 336.122 422.264 336.221 422.058 336.221 c
+421.859 336.221 421.72 336.14 421.632 335.986 c
+421.543 335.839 421.499 335.567 421.499 335.177 c
+h
+425.939 332.973 m
+425.41 332.973 424.99 333.127 424.689 333.443 c
+424.395 333.766 424.248 334.226 424.248 334.824 c
+424.248 335.133 l
+424.248 335.759 424.384 336.243 424.66 336.588 c
+424.932 336.931 425.325 337.103 425.836 337.103 c
+426.336 337.103 426.707 336.941 426.953 336.618 c
+427.207 336.295 427.338 335.817 427.35 335.192 c
+427.35 334.693 l
+425.277 334.693 l
+425.296 334.398 425.358 334.182 425.468 334.045 c
+425.586 333.906 425.766 333.839 426.012 333.839 c
+426.354 333.839 426.644 333.957 426.879 334.192 c
+427.291 333.561 l
+427.162 333.384 426.975 333.241 426.732 333.134 c
+426.486 333.028 426.222 332.973 425.939 332.973 c
+425.292 335.412 m
+426.32 335.412 l
+426.32 335.516 l
+426.32 335.751 426.28 335.927 426.203 336.044 c
+426.133 336.17 426.004 336.235 425.821 336.235 c
+425.645 336.235 425.512 336.166 425.424 336.03 c
+425.343 335.902 425.299 335.696 425.292 335.412 c
+429.26 335.839 m
+429.731 337.029 l
+430.833 337.029 l
+429.923 335.075 l
+430.863 333.046 l
+429.761 333.046 l
+429.275 334.296 l
+428.79 333.046 l
+427.673 333.046 l
+428.614 335.075 l
+427.717 337.029 l
+428.82 337.029 l
+h
+f
+q 1 0 0 1 433.1559 335.2214 cm
+0 0 m
+0 0.636 0.088 1.239 0.264 1.808 c
+0.441 2.374 0.684 2.87 1 3.293 c
+1.195 3.557 1.382 3.749 1.558 3.866 c
+1.691 3.41 l
+1.396 3.135 1.154 2.712 0.97 2.146 c
+0.783 1.577 0.68 0.945 0.661 0.25 c
+0.661 -0.044 l
+0.661 -0.908 0.779 -1.672 1.014 -2.337 c
+1.198 -2.836 1.426 -3.219 1.691 -3.484 c
+1.558 -3.91 l
+1.33 -3.752 1.106 -3.501 0.882 -3.16 c
+0.294 -2.278 0 -1.227 0 0 c
+4.027 1.191 m
+3.939 1.209 3.84 1.22 3.734 1.22 c
+3.399 1.22 3.164 1.037 3.028 0.676 c
+3.028 -2.175 l
+2.381 -2.175 l
+2.381 1.808 l
+3.013 1.808 l
+3.028 1.397 l
+3.204 1.72 3.447 1.881 3.763 1.881 c
+3.869 1.881 3.958 1.86 4.027 1.823 c
+h
+6.026 -2.248 m
+5.527 -2.248 5.145 -2.102 4.88 -1.808 c
+4.615 -1.514 4.484 -1.08 4.484 -0.5 c
+4.484 -0.029 l
+4.484 0.566 4.608 1.033 4.866 1.367 c
+5.13 1.709 5.49 1.881 5.953 1.881 c
+6.412 1.881 6.755 1.727 6.982 1.426 c
+7.217 1.132 7.339 0.669 7.35 0.044 c
+7.35 -0.382 l
+5.13 -0.382 l
+5.13 -0.47 l
+5.13 -0.904 5.207 -1.216 5.365 -1.411 c
+5.531 -1.598 5.762 -1.691 6.056 -1.691 c
+6.251 -1.691 6.423 -1.657 6.57 -1.587 c
+6.718 -1.51 6.853 -1.392 6.982 -1.234 c
+7.32 -1.646 l
+7.034 -2.05 6.604 -2.248 6.026 -2.248 c
+5.953 1.323 m
+5.677 1.323 5.475 1.228 5.35 1.044 c
+5.222 0.856 5.149 0.566 5.13 0.177 c
+6.703 0.177 l
+6.703 0.264 l
+6.681 0.647 6.614 0.915 6.497 1.073 c
+6.379 1.239 6.196 1.323 5.953 1.323 c
+11.009 -0.382 m
+11.009 -1.01 10.892 -1.481 10.657 -1.793 c
+10.429 -2.098 10.113 -2.248 9.702 -2.248 c
+9.297 -2.248 8.989 -2.098 8.775 -1.793 c
+8.775 -3.704 l
+8.129 -3.704 l
+8.129 1.808 l
+8.717 1.808 l
+8.761 1.367 l
+8.974 1.709 9.282 1.881 9.687 1.881 c
+10.128 1.881 10.454 1.727 10.672 1.426 c
+10.884 1.121 10.998 0.665 11.009 0.059 c
+h
+10.363 0 m
+10.363 0.441 10.293 0.765 10.157 0.97 c
+10.017 1.183 9.797 1.294 9.496 1.294 c
+9.18 1.294 8.941 1.139 8.775 0.838 c
+8.775 -1.234 l
+8.941 -1.539 9.18 -1.691 9.496 -1.691 c
+9.789 -1.691 10.003 -1.587 10.142 -1.382 c
+10.279 -1.168 10.352 -0.837 10.363 -0.397 c
+h
+11.715 0 m
+11.715 0.578 11.851 1.033 12.127 1.367 c
+12.409 1.709 12.781 1.881 13.244 1.881 c
+13.703 1.881 14.071 1.713 14.346 1.382 c
+14.629 1.058 14.776 0.611 14.787 0.044 c
+14.787 -0.382 l
+14.787 -0.951 14.644 -1.407 14.361 -1.749 c
+14.086 -2.084 13.718 -2.248 13.259 -2.248 c
+12.796 -2.248 12.424 -2.087 12.141 -1.764 c
+11.866 -1.433 11.723 -0.992 11.715 -0.441 c
+h
+12.362 -0.382 m
+12.362 -0.786 12.439 -1.103 12.597 -1.338 c
+12.762 -1.573 12.983 -1.691 13.259 -1.691 c
+13.824 -1.691 14.119 -1.278 14.14 -0.455 c
+14.14 0 l
+14.14 0.401 14.056 0.721 13.891 0.956 c
+13.733 1.199 13.516 1.323 13.244 1.323 c
+12.979 1.323 12.762 1.199 12.597 0.956 c
+12.439 0.721 12.362 0.401 12.362 0 c
+h
+17.565 -1.161 m
+17.565 -1.014 17.51 -0.893 17.404 -0.794 c
+17.294 -0.698 17.088 -0.58 16.787 -0.441 c
+16.441 -0.294 16.199 -0.172 16.052 -0.073 c
+15.904 0.033 15.794 0.151 15.728 0.279 c
+15.659 0.405 15.625 0.563 15.625 0.75 c
+15.625 1.073 15.742 1.341 15.978 1.558 c
+16.213 1.771 16.515 1.881 16.889 1.881 c
+17.271 1.881 17.58 1.768 17.815 1.544 c
+18.05 1.316 18.168 1.029 18.168 0.676 c
+17.521 0.676 l
+17.521 0.852 17.463 1.004 17.344 1.132 c
+17.228 1.257 17.073 1.323 16.889 1.323 c
+16.691 1.323 16.54 1.268 16.434 1.162 c
+16.324 1.062 16.272 0.93 16.272 0.765 c
+16.272 0.636 16.309 0.53 16.39 0.441 c
+16.467 0.36 16.658 0.258 16.962 0.133 c
+17.44 -0.055 17.772 -0.243 17.947 -0.426 c
+18.124 -0.602 18.212 -0.831 18.212 -1.103 c
+18.212 -1.455 18.088 -1.735 17.845 -1.94 c
+17.61 -2.146 17.294 -2.248 16.904 -2.248 c
+16.482 -2.248 16.143 -2.131 15.89 -1.896 c
+15.632 -1.654 15.507 -1.348 15.507 -0.985 c
+16.154 -0.985 l
+16.162 -1.213 16.232 -1.389 16.36 -1.514 c
+16.485 -1.631 16.669 -1.691 16.904 -1.691 c
+17.117 -1.691 17.279 -1.643 17.389 -1.543 c
+17.506 -1.448 17.565 -1.319 17.565 -1.161 c
+19.756 -2.175 -0.646 3.983 re
+19.8 2.851 m
+19.8 2.741 19.771 2.65 19.711 2.573 c
+19.653 2.502 19.557 2.469 19.432 2.469 c
+19.314 2.469 19.219 2.502 19.153 2.573 c
+19.094 2.65 19.065 2.741 19.065 2.851 c
+19.065 2.969 19.094 3.061 19.153 3.131 c
+19.219 3.208 19.314 3.248 19.432 3.248 c
+19.557 3.248 19.653 3.208 19.711 3.131 c
+19.771 3.05 19.8 2.959 19.8 2.851 c
+21.622 2.764 m
+21.622 1.808 l
+22.225 1.808 l
+22.225 1.279 l
+21.622 1.279 l
+21.622 -1.19 l
+21.622 -1.348 21.645 -1.466 21.696 -1.543 c
+21.755 -1.624 21.843 -1.66 21.961 -1.66 c
+22.048 -1.66 22.137 -1.646 22.225 -1.617 c
+22.225 -2.175 l
+22.078 -2.223 21.924 -2.248 21.77 -2.248 c
+21.512 -2.248 21.317 -2.157 21.182 -1.97 c
+21.042 -1.786 20.976 -1.525 20.976 -1.19 c
+20.976 1.279 l
+20.373 1.279 l
+20.373 1.808 l
+20.976 1.808 l
+20.976 2.764 l
+h
+22.784 0 m
+22.784 0.578 22.919 1.033 23.195 1.367 c
+23.478 1.709 23.85 1.881 24.312 1.881 c
+24.772 1.881 25.139 1.713 25.415 1.382 c
+25.697 1.058 25.845 0.611 25.855 0.044 c
+25.855 -0.382 l
+25.855 -0.951 25.712 -1.407 25.429 -1.749 c
+25.154 -2.084 24.787 -2.248 24.327 -2.248 c
+23.864 -2.248 23.493 -2.087 23.21 -1.764 c
+22.934 -1.433 22.791 -0.992 22.784 -0.441 c
+h
+23.43 -0.382 m
+23.43 -0.786 23.507 -1.103 23.665 -1.338 c
+23.831 -1.573 24.051 -1.691 24.327 -1.691 c
+24.893 -1.691 25.186 -1.278 25.209 -0.455 c
+25.209 0 l
+25.209 0.401 25.124 0.721 24.959 0.956 c
+24.801 1.199 24.584 1.323 24.312 1.323 c
+24.048 1.323 23.831 1.199 23.665 0.956 c
+23.507 0.721 23.43 0.401 23.43 0 c
+h
+28.34 1.191 m
+28.251 1.209 28.153 1.22 28.046 1.22 c
+27.711 1.22 27.476 1.037 27.341 0.676 c
+27.341 -2.175 l
+26.693 -2.175 l
+26.693 1.808 l
+27.326 1.808 l
+27.341 1.397 l
+27.517 1.72 27.759 1.881 28.075 1.881 c
+28.182 1.881 28.27 1.86 28.34 1.823 c
+h
+30.148 -1.087 m
+30.868 1.808 l
+31.559 1.808 l
+30.265 -2.734 l
+30.166 -3.075 30.023 -3.337 29.839 -3.513 c
+29.662 -3.69 29.46 -3.777 29.236 -3.777 c
+29.148 -3.777 29.034 -3.755 28.899 -3.719 c
+28.899 -3.175 l
+29.045 -3.189 l
+29.229 -3.189 29.376 -3.146 29.487 -3.057 c
+29.593 -2.969 29.681 -2.811 29.751 -2.587 c
+29.868 -2.146 l
+28.708 1.808 l
+29.413 1.808 l
+h
+35.293 -1.691 m
+35.505 -1.691 35.678 -1.627 35.807 -1.5 c
+35.943 -1.363 36.016 -1.172 36.027 -0.926 c
+36.645 -0.926 l
+36.623 -1.308 36.487 -1.627 36.234 -1.882 c
+35.976 -2.127 35.663 -2.248 35.293 -2.248 c
+34.8 -2.248 34.425 -2.098 34.161 -1.793 c
+33.903 -1.481 33.778 -1.014 33.778 -0.397 c
+33.778 0.044 l
+33.778 0.64 33.903 1.095 34.161 1.411 c
+34.425 1.723 34.8 1.881 35.293 1.881 c
+35.693 1.881 36.012 1.75 36.248 1.484 c
+36.49 1.228 36.623 0.882 36.645 0.441 c
+36.027 0.441 l
+36.005 0.735 35.932 0.956 35.807 1.103 c
+35.689 1.249 35.517 1.323 35.293 1.323 c
+34.998 1.323 34.782 1.224 34.646 1.029 c
+34.506 0.842 34.433 0.533 34.425 0.103 c
+34.425 -0.411 l
+34.425 -0.881 34.491 -1.216 34.631 -1.411 c
+34.778 -1.598 34.998 -1.691 35.293 -1.691 c
+37.262 0 m
+37.262 0.578 37.398 1.033 37.674 1.367 c
+37.957 1.709 38.328 1.881 38.79 1.881 c
+39.25 1.881 39.617 1.713 39.893 1.382 c
+40.176 1.058 40.323 0.611 40.334 0.044 c
+40.334 -0.382 l
+40.334 -0.951 40.191 -1.407 39.908 -1.749 c
+39.632 -2.084 39.265 -2.248 38.806 -2.248 c
+38.343 -2.248 37.971 -2.087 37.689 -1.764 c
+37.413 -1.433 37.269 -0.992 37.262 -0.441 c
+h
+37.909 -0.382 m
+37.909 -0.786 37.986 -1.103 38.144 -1.338 c
+38.31 -1.573 38.53 -1.691 38.806 -1.691 c
+39.372 -1.691 39.665 -1.278 39.687 -0.455 c
+39.687 0 l
+39.687 0.401 39.603 0.721 39.438 0.956 c
+39.28 1.199 39.062 1.323 38.79 1.323 c
+38.526 1.323 38.31 1.199 38.144 0.956 c
+37.986 0.721 37.909 0.401 37.909 0 c
+h
+41.79 1.808 m
+41.804 1.44 l
+42.046 1.735 42.366 1.881 42.759 1.881 c
+43.201 1.881 43.509 1.683 43.685 1.294 c
+43.939 1.683 44.288 1.881 44.729 1.881 c
+45.464 1.881 45.839 1.419 45.861 0.5 c
+45.861 -2.175 l
+45.215 -2.175 l
+45.215 0.441 l
+45.215 0.735 45.159 0.948 45.053 1.087 c
+44.953 1.224 44.781 1.294 44.538 1.294 c
+44.34 1.294 44.178 1.213 44.053 1.058 c
+43.935 0.912 43.866 0.721 43.847 0.485 c
+43.847 -2.175 l
+43.186 -2.175 l
+43.186 0.47 l
+43.186 1.018 42.965 1.294 42.524 1.294 c
+42.19 1.294 41.955 1.132 41.819 0.809 c
+41.819 -2.175 l
+41.172 -2.175 l
+41.172 1.808 l
+h
+47.448 1.808 m
+47.463 1.44 l
+47.706 1.735 48.026 1.881 48.419 1.881 c
+48.859 1.881 49.169 1.683 49.345 1.294 c
+49.599 1.683 49.948 1.881 50.389 1.881 c
+51.124 1.881 51.498 1.419 51.521 0.5 c
+51.521 -2.175 l
+50.873 -2.175 l
+50.873 0.441 l
+50.873 0.735 50.819 0.948 50.712 1.087 c
+50.613 1.224 50.44 1.294 50.197 1.294 c
+49.998 1.294 49.838 1.213 49.712 1.058 c
+49.595 0.912 49.525 0.721 49.506 0.485 c
+49.506 -2.175 l
+48.845 -2.175 l
+48.845 0.47 l
+48.845 1.018 48.624 1.294 48.184 1.294 c
+47.849 1.294 47.614 1.132 47.478 0.809 c
+47.478 -2.175 l
+46.831 -2.175 l
+46.831 1.808 l
+h
+53.196 -2.175 -0.647 3.983 re
+53.24 2.851 m
+53.24 2.741 53.211 2.65 53.152 2.573 c
+53.093 2.502 52.997 2.469 52.872 2.469 c
+52.755 2.469 52.66 2.502 52.593 2.573 c
+52.535 2.65 52.505 2.741 52.505 2.851 c
+52.505 2.969 52.535 3.061 52.593 3.131 c
+52.66 3.208 52.755 3.248 52.872 3.248 c
+52.997 3.248 53.093 3.208 53.152 3.131 c
+53.211 3.05 53.24 2.959 53.24 2.851 c
+55.062 2.764 m
+55.062 1.808 l
+55.665 1.808 l
+55.665 1.279 l
+55.062 1.279 l
+55.062 -1.19 l
+55.062 -1.348 55.085 -1.466 55.136 -1.543 c
+55.195 -1.624 55.283 -1.66 55.401 -1.66 c
+55.489 -1.66 55.577 -1.646 55.665 -1.617 c
+55.665 -2.175 l
+55.519 -2.223 55.364 -2.248 55.209 -2.248 c
+54.952 -2.248 54.758 -2.157 54.622 -1.97 c
+54.482 -1.786 54.416 -1.525 54.416 -1.19 c
+54.416 1.279 l
+53.813 1.279 l
+53.813 1.808 l
+54.416 1.808 l
+54.416 2.764 l
+h
+57.855 -2.248 m
+57.356 -2.248 56.974 -2.102 56.709 -1.808 c
+56.444 -1.514 56.312 -1.08 56.312 -0.5 c
+56.312 -0.029 l
+56.312 0.566 56.437 1.033 56.695 1.367 c
+56.959 1.709 57.319 1.881 57.782 1.881 c
+58.241 1.881 58.583 1.727 58.811 1.426 c
+59.046 1.132 59.168 0.669 59.178 0.044 c
+59.178 -0.382 l
+56.959 -0.382 l
+56.959 -0.47 l
+56.959 -0.904 57.036 -1.216 57.194 -1.411 c
+57.36 -1.598 57.591 -1.691 57.885 -1.691 c
+58.079 -1.691 58.252 -1.657 58.399 -1.587 c
+58.546 -1.51 58.682 -1.392 58.811 -1.234 c
+59.149 -1.646 l
+58.862 -2.05 58.432 -2.248 57.855 -2.248 c
+57.782 1.323 m
+57.507 1.323 57.304 1.228 57.179 1.044 c
+57.051 0.856 56.977 0.566 56.959 0.177 c
+58.532 0.177 l
+58.532 0.264 l
+58.509 0.647 58.443 0.915 58.326 1.073 c
+58.208 1.239 58.025 1.323 57.782 1.323 c
+59.825 0 m
+59.825 0.607 59.935 1.073 60.163 1.397 c
+60.398 1.72 60.726 1.881 61.148 1.881 c
+61.53 1.881 61.828 1.723 62.045 1.411 c
+62.045 3.469 l
+62.692 3.469 l
+62.692 -2.175 l
+62.104 -2.175 l
+62.06 -1.749 l
+61.854 -2.084 61.549 -2.248 61.148 -2.248 c
+60.737 -2.248 60.413 -2.094 60.178 -1.778 c
+59.943 -1.455 59.825 -0.999 59.825 -0.411 c
+h
+60.472 -0.382 m
+60.472 -0.823 60.535 -1.153 60.663 -1.367 c
+60.799 -1.573 61.019 -1.675 61.324 -1.675 c
+61.648 -1.675 61.887 -1.514 62.045 -1.19 c
+62.045 0.823 l
+61.875 1.135 61.637 1.294 61.324 1.294 c
+61.019 1.294 60.799 1.191 60.663 0.985 c
+60.535 0.779 60.472 0.456 60.472 0.015 c
+h
+67.351 -1.161 m
+67.351 -1.014 67.296 -0.893 67.189 -0.794 c
+67.079 -0.698 66.873 -0.58 66.572 -0.441 c
+66.226 -0.294 65.984 -0.172 65.837 -0.073 c
+65.69 0.033 65.58 0.151 65.514 0.279 c
+65.443 0.405 65.411 0.563 65.411 0.75 c
+65.411 1.073 65.528 1.341 65.763 1.558 c
+65.999 1.771 66.3 1.881 66.675 1.881 c
+67.057 1.881 67.365 1.768 67.601 1.544 c
+67.836 1.316 67.953 1.029 67.953 0.676 c
+67.307 0.676 l
+67.307 0.852 67.248 1.004 67.13 1.132 c
+67.013 1.257 66.858 1.323 66.675 1.323 c
+66.476 1.323 66.326 1.268 66.22 1.162 c
+66.109 1.062 66.058 0.93 66.058 0.765 c
+66.058 0.636 66.094 0.53 66.175 0.441 c
+66.253 0.36 66.444 0.258 66.748 0.133 c
+67.226 -0.055 67.557 -0.243 67.733 -0.426 c
+67.909 -0.602 67.998 -0.831 67.998 -1.103 c
+67.998 -1.455 67.872 -1.735 67.631 -1.94 c
+67.396 -2.146 67.079 -2.248 66.69 -2.248 c
+66.267 -2.248 65.929 -2.131 65.676 -1.896 c
+65.418 -1.654 65.293 -1.348 65.293 -0.985 c
+65.94 -0.985 l
+65.948 -1.213 66.017 -1.389 66.146 -1.514 c
+66.27 -1.631 66.455 -1.691 66.69 -1.691 c
+66.903 -1.691 67.064 -1.643 67.174 -1.543 c
+67.292 -1.448 67.351 -1.319 67.351 -1.161 c
+69.688 2.764 m
+69.688 1.808 l
+70.291 1.808 l
+70.291 1.279 l
+69.688 1.279 l
+69.688 -1.19 l
+69.688 -1.348 69.711 -1.466 69.761 -1.543 c
+69.821 -1.624 69.909 -1.66 70.026 -1.66 c
+70.114 -1.66 70.203 -1.646 70.291 -1.617 c
+70.291 -2.175 l
+70.144 -2.223 69.989 -2.248 69.835 -2.248 c
+69.578 -2.248 69.383 -2.157 69.247 -1.97 c
+69.108 -1.786 69.042 -1.525 69.042 -1.19 c
+69.042 1.279 l
+68.439 1.279 l
+68.439 1.808 l
+69.042 1.808 l
+69.042 2.764 l
+h
+73.098 -2.175 m
+73.058 -2.087 73.032 -1.94 73.025 -1.735 c
+72.79 -2.08 72.496 -2.248 72.142 -2.248 c
+71.779 -2.248 71.496 -2.153 71.29 -1.955 c
+71.092 -1.749 70.997 -1.462 70.997 -1.087 c
+70.997 -0.687 71.132 -0.367 71.408 -0.132 c
+71.68 0.11 72.055 0.235 72.525 0.235 c
+73.01 0.235 l
+73.01 0.661 l
+73.01 0.897 72.955 1.062 72.848 1.162 c
+72.738 1.268 72.576 1.323 72.364 1.323 c
+72.165 1.323 72.003 1.264 71.878 1.147 c
+71.761 1.029 71.702 0.882 71.702 0.706 c
+71.055 0.706 l
+71.055 0.9 71.114 1.091 71.232 1.279 c
+71.357 1.463 71.518 1.61 71.716 1.72 c
+71.922 1.827 72.15 1.881 72.408 1.881 c
+72.809 1.881 73.113 1.779 73.318 1.573 c
+73.532 1.367 73.646 1.073 73.657 0.691 c
+73.657 -1.323 l
+73.657 -1.627 73.694 -1.892 73.775 -2.117 c
+73.775 -2.175 l
+h
+72.231 -1.66 m
+72.396 -1.66 72.547 -1.617 72.687 -1.529 c
+72.834 -1.44 72.94 -1.33 73.01 -1.19 c
+73.01 -0.249 l
+72.643 -0.249 l
+72.327 -0.249 72.084 -0.32 71.907 -0.455 c
+71.731 -0.584 71.643 -0.771 71.643 -1.014 c
+71.643 -1.242 71.687 -1.407 71.776 -1.514 c
+71.864 -1.613 72.015 -1.66 72.231 -1.66 c
+75.509 2.764 m
+75.509 1.808 l
+76.111 1.808 l
+76.111 1.279 l
+75.509 1.279 l
+75.509 -1.19 l
+75.509 -1.348 75.531 -1.466 75.583 -1.543 c
+75.641 -1.624 75.73 -1.66 75.847 -1.66 c
+75.936 -1.66 76.024 -1.646 76.111 -1.617 c
+76.111 -2.175 l
+75.965 -2.223 75.81 -2.248 75.656 -2.248 c
+75.398 -2.248 75.204 -2.157 75.068 -1.97 c
+74.928 -1.786 74.862 -1.525 74.862 -1.19 c
+74.862 1.279 l
+74.259 1.279 l
+74.259 1.808 l
+74.862 1.808 l
+74.862 2.764 l
+h
+78.905 -1.822 m
+78.688 -2.109 78.376 -2.248 77.964 -2.248 c
+77.6 -2.248 77.324 -2.127 77.141 -1.882 c
+76.965 -1.627 76.869 -1.264 76.861 -0.794 c
+76.861 1.808 l
+77.508 1.808 l
+77.508 -0.735 l
+77.508 -1.363 77.692 -1.675 78.066 -1.675 c
+78.467 -1.675 78.743 -1.5 78.889 -1.147 c
+78.889 1.808 l
+79.537 1.808 l
+79.537 -2.175 l
+78.92 -2.175 l
+h
+82.461 -1.161 m
+82.461 -1.014 82.407 -0.893 82.3 -0.794 c
+82.19 -0.698 81.984 -0.58 81.683 -0.441 c
+81.337 -0.294 81.095 -0.172 80.948 -0.073 c
+80.801 0.033 80.69 0.151 80.624 0.279 c
+80.555 0.405 80.522 0.563 80.522 0.75 c
+80.522 1.073 80.639 1.341 80.874 1.558 c
+81.11 1.771 81.411 1.881 81.785 1.881 c
+82.168 1.881 82.477 1.768 82.712 1.544 c
+82.947 1.316 83.064 1.029 83.064 0.676 c
+82.417 0.676 l
+82.417 0.852 82.359 1.004 82.241 1.132 c
+82.124 1.257 81.969 1.323 81.785 1.323 c
+81.587 1.323 81.436 1.268 81.33 1.162 c
+81.22 1.062 81.168 0.93 81.168 0.765 c
+81.168 0.636 81.205 0.53 81.286 0.441 c
+81.363 0.36 81.554 0.258 81.859 0.133 c
+82.336 -0.055 82.668 -0.243 82.844 -0.426 c
+83.02 -0.602 83.109 -0.831 83.109 -1.103 c
+83.109 -1.455 82.984 -1.735 82.741 -1.94 c
+82.506 -2.146 82.19 -2.248 81.8 -2.248 c
+81.378 -2.248 81.04 -2.131 80.786 -1.896 c
+80.529 -1.654 80.404 -1.348 80.404 -0.985 c
+81.05 -0.985 l
+81.058 -1.213 81.127 -1.389 81.256 -1.514 c
+81.382 -1.631 81.565 -1.691 81.8 -1.691 c
+82.014 -1.691 82.175 -1.643 82.286 -1.543 c
+82.403 -1.448 82.461 -1.319 82.461 -1.161 c
+85.343 -0.044 m
+85.343 -1.132 85.096 -2.098 84.607 -2.94 c
+84.343 -3.388 84.067 -3.711 83.785 -3.91 c
+83.667 -3.484 l
+83.969 -3.189 84.215 -2.738 84.402 -2.131 c
+84.597 -1.525 84.696 -0.86 84.696 -0.132 c
+84.696 0 l
+84.696 0.93 84.541 1.764 84.24 2.499 c
+84.071 2.899 83.88 3.219 83.667 3.454 c
+83.785 3.866 l
+84.057 3.678 84.321 3.381 84.578 2.969 c
+85.085 2.117 85.343 1.11 85.343 -0.044 c
+86.386 -1.822 m
+86.386 -1.705 86.419 -1.61 86.489 -1.529 c
+86.556 -1.452 86.658 -1.411 86.798 -1.411 c
+86.945 -1.411 87.051 -1.452 87.121 -1.529 c
+87.198 -1.61 87.239 -1.705 87.239 -1.822 c
+87.239 -1.932 87.198 -2.024 87.121 -2.102 c
+87.051 -2.179 86.945 -2.219 86.798 -2.219 c
+86.658 -2.219 86.556 -2.179 86.489 -2.102 c
+86.419 -2.024 86.386 -1.932 86.386 -1.822 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 327.439 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 320.5995 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.263 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.319 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.029 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.293 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.323 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.675 14.905 -0.69 15.052 -0.69 c
+15.188 -0.69 15.324 -0.687 15.464 -0.675 c
+15.599 -0.658 15.732 -0.632 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.23 15.626 -1.249 c
+15.545 -1.261 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.263 c
+14.218 -1.227 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.942 -1.205 c
+21.737 -1.117 21.564 -0.995 21.428 -0.837 c
+21.288 -0.683 21.185 -0.496 21.12 -0.279 c
+21.049 -0.055 21.016 0.191 21.016 0.456 c
+21.016 0.75 21.049 1.008 21.12 1.235 c
+21.197 1.459 21.303 1.646 21.442 1.794 c
+21.59 1.948 21.766 2.066 21.972 2.147 c
+22.177 2.234 22.412 2.279 22.677 2.279 c
+22.901 2.279 23.104 2.249 23.28 2.19 c
+23.456 2.132 23.607 2.047 23.736 1.941 c
+23.861 1.841 23.963 1.72 24.044 1.573 c
+24.121 1.434 24.177 1.283 24.206 1.118 c
+23.295 1.073 l
+23.265 1.249 23.196 1.389 23.089 1.5 c
+22.99 1.606 22.846 1.661 22.662 1.661 c
+22.416 1.661 22.24 1.559 22.134 1.353 c
+22.023 1.154 21.972 0.867 21.972 0.485 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.276 23.324 -0.058 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.573 c
+24.004 -0.72 23.901 -0.852 23.765 -0.97 c
+23.636 -1.08 23.478 -1.168 23.295 -1.234 c
+23.118 -1.294 22.913 -1.323 22.677 -1.323 c
+26.076 1.515 m
+26.194 1.786 26.344 1.985 26.532 2.103 c
+26.716 2.22 26.936 2.279 27.194 2.279 c
+27.399 2.279 27.568 2.242 27.708 2.176 c
+27.855 2.106 27.965 2.014 28.046 1.897 c
+28.135 1.779 28.193 1.636 28.222 1.47 c
+28.259 1.301 28.281 1.125 28.281 0.941 c
+28.281 -1.263 l
+27.37 -1.263 l
+27.37 0.736 l
+27.37 0.871 27.359 0.992 27.341 1.103 c
+27.329 1.209 27.304 1.297 27.267 1.367 c
+27.227 1.444 27.168 1.503 27.09 1.544 c
+27.021 1.58 26.929 1.602 26.811 1.602 c
+26.701 1.602 26.606 1.577 26.518 1.529 c
+26.429 1.478 26.348 1.411 26.282 1.324 c
+26.223 1.235 26.172 1.125 26.136 1 c
+26.106 0.882 26.091 0.75 26.091 0.603 c
+26.091 -1.263 l
+25.18 -1.263 l
+25.18 3.514 l
+26.091 3.514 l
+26.091 2.205 l
+26.091 2.135 26.084 2.066 26.076 1.999 c
+26.076 1.794 l
+26.076 1.735 26.069 1.679 26.061 1.632 c
+26.061 1.515 l
+h
+30.799 -1.323 m
+30.541 -1.323 30.313 -1.286 30.107 -1.22 c
+29.901 -1.143 29.725 -1.028 29.579 -0.881 c
+29.431 -0.727 29.313 -0.536 29.226 -0.309 c
+29.145 -0.085 29.108 0.181 29.108 0.485 c
+29.108 0.816 29.153 1.095 29.24 1.324 c
+29.336 1.559 29.465 1.742 29.623 1.881 c
+29.788 2.018 29.976 2.117 30.181 2.176 c
+30.387 2.242 30.597 2.279 30.813 2.279 c
+31.085 2.279 31.32 2.227 31.519 2.132 c
+31.725 2.043 31.89 1.912 32.018 1.735 c
+32.154 1.565 32.253 1.36 32.313 1.118 c
+32.378 0.882 32.415 0.618 32.415 0.324 c
+32.415 0.309 l
+30.049 0.309 l
+30.049 0.162 30.063 0.023 30.093 -0.103 c
+30.13 -0.231 30.185 -0.345 30.254 -0.44 c
+30.321 -0.529 30.406 -0.598 30.504 -0.646 c
+30.6 -0.698 30.714 -0.72 30.842 -0.72 c
+30.997 -0.72 31.137 -0.687 31.254 -0.617 c
+31.379 -0.551 31.468 -0.448 31.519 -0.309 c
+32.357 -0.382 l
+32.328 -0.481 32.272 -0.588 32.195 -0.706 c
+32.114 -0.816 32.011 -0.918 31.886 -1.014 c
+31.769 -1.103 31.614 -1.176 31.43 -1.234 c
+31.254 -1.294 31.041 -1.323 30.799 -1.323 c
+30.799 1.706 m
+30.71 1.706 30.622 1.691 30.534 1.661 c
+30.446 1.632 30.365 1.58 30.298 1.515 c
+30.229 1.444 30.17 1.357 30.122 1.249 c
+30.082 1.139 30.063 1.014 30.063 0.867 c
+31.534 0.867 l
+31.534 1.004 31.507 1.125 31.46 1.235 c
+31.42 1.342 31.364 1.43 31.298 1.5 c
+31.239 1.565 31.166 1.617 31.077 1.646 c
+30.99 1.683 30.894 1.706 30.799 1.706 c
+34.859 -1.323 m
+34.572 -1.323 34.329 -1.282 34.124 -1.205 c
+33.918 -1.117 33.745 -0.995 33.61 -0.837 c
+33.47 -0.683 33.367 -0.496 33.301 -0.279 c
+33.231 -0.055 33.198 0.191 33.198 0.456 c
+33.198 0.75 33.231 1.008 33.301 1.235 c
+33.378 1.459 33.485 1.646 33.624 1.794 c
+33.772 1.948 33.948 2.066 34.154 2.147 c
+34.36 2.234 34.595 2.279 34.859 2.279 c
+35.083 2.279 35.285 2.249 35.462 2.19 c
+35.638 2.132 35.789 2.047 35.917 1.941 c
+36.043 1.841 36.145 1.72 36.226 1.573 c
+36.303 1.434 36.359 1.283 36.388 1.118 c
+35.476 1.073 l
+35.447 1.249 35.377 1.389 35.27 1.5 c
+35.171 1.606 35.028 1.661 34.844 1.661 c
+34.599 1.661 34.422 1.559 34.315 1.353 c
+34.205 1.154 34.154 0.867 34.154 0.485 c
+34.154 -0.309 34.389 -0.706 34.859 -0.706 c
+35.025 -0.706 35.168 -0.654 35.285 -0.544 c
+35.403 -0.437 35.476 -0.276 35.505 -0.058 c
+36.417 -0.103 l
+36.388 -0.272 36.332 -0.426 36.255 -0.573 c
+36.186 -0.72 36.083 -0.852 35.947 -0.97 c
+35.818 -1.08 35.661 -1.168 35.476 -1.234 c
+35.3 -1.294 35.094 -1.323 34.859 -1.323 c
+39.688 -1.263 m
+38.761 0.309 l
+38.365 0.044 l
+38.365 -1.263 l
+37.468 -1.263 l
+37.468 3.514 l
+38.365 3.514 l
+38.365 0.779 l
+39.615 2.22 l
+40.584 2.22 l
+39.364 0.853 l
+40.673 -1.263 l
+h
+44.631 0.485 m
+44.631 0.21 44.594 -0.04 44.527 -0.264 c
+44.457 -0.481 44.355 -0.669 44.219 -0.823 c
+44.079 -0.981 43.902 -1.103 43.69 -1.19 c
+43.473 -1.278 43.219 -1.323 42.925 -1.323 c
+42.649 -1.323 42.403 -1.278 42.19 -1.19 c
+41.984 -1.103 41.812 -0.981 41.676 -0.823 c
+41.536 -0.669 41.433 -0.481 41.367 -0.264 c
+41.298 -0.04 41.265 0.21 41.265 0.485 c
+41.265 0.738 41.294 0.974 41.352 1.191 c
+41.419 1.415 41.521 1.606 41.661 1.764 c
+41.797 1.929 41.973 2.058 42.19 2.147 c
+42.403 2.234 42.661 2.279 42.954 2.279 c
+43.267 2.279 43.528 2.234 43.734 2.147 c
+43.947 2.058 44.12 1.929 44.248 1.764 c
+44.384 1.606 44.483 1.415 44.542 1.191 c
+44.6 0.974 44.631 0.738 44.631 0.485 c
+43.675 0.485 m
+43.675 0.691 43.66 0.867 43.631 1.014 c
+43.609 1.162 43.572 1.283 43.513 1.382 c
+43.455 1.478 43.381 1.548 43.293 1.588 c
+43.204 1.636 43.094 1.661 42.969 1.661 c
+42.705 1.661 42.514 1.562 42.396 1.367 c
+42.279 1.18 42.219 0.886 42.219 0.485 c
+42.219 0.063 42.279 -0.243 42.396 -0.426 c
+42.514 -0.613 42.69 -0.706 42.925 -0.706 c
+43.05 -0.706 43.164 -0.687 43.264 -0.646 c
+43.359 -0.598 43.44 -0.525 43.499 -0.426 c
+43.565 -0.33 43.609 -0.205 43.631 -0.058 c
+43.66 0.088 43.675 0.268 43.675 0.485 c
+46.368 2.22 m
+46.368 0.265 l
+46.368 0.125 46.376 0 46.398 -0.118 c
+46.416 -0.228 46.449 -0.32 46.501 -0.397 c
+46.549 -0.478 46.607 -0.54 46.677 -0.588 c
+46.743 -0.628 46.828 -0.646 46.927 -0.646 c
+47.015 -0.646 47.096 -0.628 47.177 -0.588 c
+47.265 -0.54 47.339 -0.47 47.397 -0.382 c
+47.457 -0.286 47.5 -0.176 47.53 -0.058 c
+47.567 0.067 47.588 0.206 47.588 0.353 c
+47.588 2.22 l
+48.485 2.22 l
+48.485 -0.484 l
+48.485 -0.72 l
+48.492 -0.801 48.5 -0.878 48.5 -0.955 c
+48.5 -1.146 l
+48.507 -1.198 48.515 -1.234 48.515 -1.263 c
+47.662 -1.263 l
+47.651 -1.234 47.64 -1.198 47.632 -1.146 c
+47.632 -0.955 l
+47.632 -0.889 47.625 -0.819 47.617 -0.75 c
+47.617 -0.573 l
+47.603 -0.573 l
+47.486 -0.837 47.331 -1.028 47.147 -1.146 c
+46.971 -1.263 46.769 -1.323 46.545 -1.323 c
+46.339 -1.323 46.166 -1.286 46.03 -1.22 c
+45.891 -1.153 45.78 -1.058 45.693 -0.941 c
+45.612 -0.823 45.552 -0.687 45.516 -0.529 c
+45.487 -0.363 45.472 -0.187 45.472 0 c
+45.472 2.22 l
+h
+50.15 1.602 m
+49.606 1.602 l
+49.606 2.22 l
+50.194 2.22 l
+50.473 3.117 l
+51.046 3.117 l
+51.046 2.22 l
+52.281 2.22 l
+52.281 1.602 l
+51.046 1.602 l
+51.046 -0.103 l
+51.046 -0.323 l
+51.054 -0.393 51.076 -0.455 51.105 -0.515 c
+51.142 -0.565 51.197 -0.61 51.267 -0.646 c
+51.344 -0.675 51.458 -0.69 51.605 -0.69 c
+51.741 -0.69 51.877 -0.687 52.016 -0.675 c
+52.153 -0.658 52.284 -0.632 52.413 -0.602 c
+52.413 -1.205 l
+52.332 -1.216 52.255 -1.23 52.178 -1.249 c
+52.097 -1.261 52.02 -1.267 51.943 -1.278 c
+51.862 -1.286 51.774 -1.294 51.679 -1.294 c
+51.59 -1.301 51.491 -1.308 51.384 -1.308 c
+51.197 -1.308 51.035 -1.294 50.9 -1.263 c
+50.771 -1.227 50.657 -1.183 50.561 -1.132 c
+50.473 -1.084 50.399 -1.025 50.341 -0.955 c
+50.283 -0.878 50.238 -0.801 50.208 -0.72 c
+50.179 -0.632 50.157 -0.544 50.15 -0.455 c
+50.139 -0.36 50.135 -0.264 50.135 -0.176 c
+h
+58.26 0.838 1.866 -0.794 re
+58.26 0.044 m
+62.32 0.838 1.867 -0.794 re
+62.32 0.044 m
+70.603 -2.631 m
+70.603 3.514 l
+72.529 3.514 l
+72.529 2.896 l
+71.456 2.896 l
+71.456 -2.013 l
+72.529 -2.013 l
+72.529 -2.631 l
+h
+75.561 1.602 m
+75.561 -1.263 l
+74.664 -1.263 l
+74.664 1.602 l
+73.841 1.602 l
+73.841 2.22 l
+74.664 2.22 l
+74.664 2.484 l
+74.664 2.61 74.679 2.741 74.708 2.882 c
+74.745 3.017 74.815 3.135 74.914 3.234 c
+75.02 3.341 75.164 3.429 75.34 3.499 c
+75.517 3.564 75.741 3.601 76.016 3.601 c
+76.23 3.601 76.428 3.591 76.604 3.572 c
+76.78 3.55 76.932 3.532 77.06 3.514 c
+77.06 2.926 l
+76.932 2.944 76.788 2.959 76.634 2.97 c
+76.476 2.977 76.325 2.984 76.178 2.984 c
+76.049 2.984 75.947 2.97 75.87 2.94 c
+75.789 2.911 75.726 2.87 75.679 2.822 c
+75.627 2.771 75.594 2.708 75.575 2.631 c
+75.564 2.562 75.561 2.484 75.561 2.396 c
+75.561 2.22 l
+76.986 2.22 l
+76.986 1.602 l
+h
+80.08 -0.646 m
+81.212 -0.646 l
+81.212 -1.263 l
+77.905 -1.263 l
+77.905 -0.646 l
+79.17 -0.646 l
+79.17 1.602 l
+78.243 1.602 l
+78.243 2.22 l
+80.08 2.22 l
+h
+79.17 3.514 0.911 -0.676 re
+79.17 2.837 m
+84.142 -0.646 m
+85.273 -0.646 l
+85.273 -1.263 l
+81.966 -1.263 l
+81.966 -0.646 l
+83.23 -0.646 l
+83.23 2.896 l
+82.304 2.896 l
+82.304 3.514 l
+84.142 3.514 l
+h
+87.658 -1.323 m
+87.401 -1.323 87.173 -1.286 86.968 -1.22 c
+86.762 -1.143 86.585 -1.028 86.438 -0.881 c
+86.291 -0.727 86.174 -0.536 86.085 -0.309 c
+86.004 -0.085 85.968 0.181 85.968 0.485 c
+85.968 0.816 86.012 1.095 86.1 1.324 c
+86.195 1.559 86.324 1.742 86.482 1.881 c
+86.648 2.018 86.835 2.117 87.041 2.176 c
+87.246 2.242 87.456 2.279 87.673 2.279 c
+87.945 2.279 88.18 2.227 88.379 2.132 c
+88.584 2.043 88.749 1.912 88.878 1.735 c
+89.014 1.565 89.113 1.36 89.172 1.118 c
+89.239 0.882 89.275 0.618 89.275 0.324 c
+89.275 0.309 l
+86.908 0.309 l
+86.908 0.162 86.923 0.023 86.953 -0.103 c
+86.989 -0.231 87.045 -0.345 87.114 -0.44 c
+87.18 -0.529 87.265 -0.598 87.364 -0.646 c
+87.46 -0.698 87.573 -0.72 87.702 -0.72 c
+87.857 -0.72 87.996 -0.687 88.113 -0.617 c
+88.239 -0.551 88.327 -0.448 88.379 -0.309 c
+89.216 -0.382 l
+89.187 -0.481 89.131 -0.588 89.054 -0.706 c
+88.973 -0.816 88.871 -0.918 88.746 -1.014 c
+88.628 -1.103 88.474 -1.176 88.29 -1.234 c
+88.113 -1.294 87.901 -1.323 87.658 -1.323 c
+87.658 1.706 m
+87.57 1.706 87.481 1.691 87.394 1.661 c
+87.305 1.632 87.224 1.58 87.159 1.515 c
+87.088 1.444 87.03 1.357 86.982 1.249 c
+86.941 1.139 86.923 1.014 86.923 0.867 c
+88.393 0.867 l
+88.393 1.004 88.367 1.125 88.319 1.235 c
+88.279 1.342 88.224 1.43 88.158 1.5 c
+88.099 1.565 88.026 1.617 87.938 1.646 c
+87.849 1.683 87.754 1.706 87.658 1.706 c
+90.528 -2.631 m
+90.528 -2.013 l
+91.601 -2.013 l
+91.601 2.896 l
+90.528 2.896 l
+90.528 3.514 l
+92.454 3.514 l
+92.454 -2.631 l
+h
+f
+Q
+q 1 0 0 1 311.4185 304.4451 cm
+0 0 m
+0 5.351 l
+1.278 5.351 l
+1.903 5.351 2.389 5.152 2.734 4.763 c
+3.075 4.37 3.248 3.822 3.248 3.117 c
+3.248 2.22 l
+3.248 1.515 3.072 0.963 2.719 0.574 c
+2.373 0.192 1.87 0 1.205 0 c
+h
+0.676 4.778 m
+0.676 0.574 l
+1.22 0.574 l
+1.69 0.574 2.032 0.709 2.248 0.985 c
+2.473 1.257 2.587 1.661 2.587 2.191 c
+2.587 3.132 l
+2.587 3.697 2.477 4.116 2.263 4.381 c
+2.047 4.645 1.72 4.778 1.278 4.778 c
+h
+4.91 0 -0.647 3.984 re
+4.953 5.027 m
+4.953 4.917 4.924 4.825 4.865 4.748 c
+4.806 4.678 4.711 4.645 4.586 4.645 c
+4.469 4.645 4.373 4.678 4.307 4.748 c
+4.247 4.825 4.218 4.917 4.218 5.027 c
+4.218 5.145 4.247 5.237 4.307 5.307 c
+4.373 5.384 4.469 5.424 4.586 5.424 c
+4.711 5.424 4.806 5.384 4.865 5.307 c
+4.924 5.226 4.953 5.134 4.953 5.027 c
+7.864 1.015 m
+7.864 1.162 7.809 1.283 7.702 1.382 c
+7.592 1.478 7.386 1.596 7.085 1.735 c
+6.739 1.882 6.497 2.003 6.35 2.103 c
+6.202 2.209 6.092 2.326 6.026 2.455 c
+5.957 2.58 5.924 2.739 5.924 2.926 c
+5.924 3.249 6.041 3.517 6.277 3.734 c
+6.512 3.947 6.813 4.057 7.187 4.057 c
+7.57 4.057 7.879 3.944 8.114 3.72 c
+8.349 3.491 8.467 3.205 8.467 2.852 c
+7.819 2.852 l
+7.819 3.028 7.761 3.179 7.643 3.308 c
+7.526 3.433 7.372 3.499 7.187 3.499 c
+6.989 3.499 6.838 3.444 6.732 3.337 c
+6.622 3.238 6.57 3.105 6.57 2.94 c
+6.57 2.812 6.607 2.705 6.688 2.617 c
+6.765 2.536 6.956 2.433 7.262 2.309 c
+7.739 2.12 8.07 1.933 8.246 1.75 c
+8.422 1.573 8.511 1.345 8.511 1.073 c
+8.511 0.721 8.386 0.441 8.143 0.235 c
+7.908 0.03 7.592 -0.073 7.202 -0.073 c
+6.78 -0.073 6.441 0.044 6.188 0.279 c
+5.93 0.522 5.806 0.827 5.806 1.191 c
+6.453 1.191 l
+6.46 0.963 6.53 0.786 6.659 0.662 c
+6.784 0.545 6.967 0.485 7.202 0.485 c
+7.416 0.485 7.577 0.533 7.688 0.632 c
+7.805 0.728 7.864 0.857 7.864 1.015 c
+10.73 0.485 m
+10.944 0.485 11.116 0.548 11.245 0.676 c
+11.38 0.813 11.454 1.004 11.465 1.25 c
+12.082 1.25 l
+12.06 0.867 11.925 0.548 11.671 0.294 c
+11.414 0.048 11.102 -0.073 10.73 -0.073 c
+10.238 -0.073 9.863 0.077 9.598 0.383 c
+9.341 0.695 9.216 1.162 9.216 1.779 c
+9.216 2.22 l
+9.216 2.816 9.341 3.271 9.598 3.587 c
+9.863 3.899 10.238 4.057 10.73 4.057 c
+11.131 4.057 11.451 3.925 11.686 3.66 c
+11.928 3.404 12.06 3.057 12.082 2.617 c
+11.465 2.617 l
+11.443 2.911 11.37 3.132 11.245 3.279 c
+11.127 3.425 10.954 3.499 10.73 3.499 c
+10.436 3.499 10.219 3.4 10.084 3.205 c
+9.944 3.017 9.87 2.708 9.863 2.278 c
+9.863 1.764 l
+9.863 1.294 9.929 0.96 10.069 0.765 c
+10.215 0.578 10.436 0.485 10.73 0.485 c
+14.875 0 m
+14.835 0.088 14.809 0.235 14.802 0.441 c
+14.566 0.096 14.273 -0.073 13.92 -0.073 c
+13.556 -0.073 13.273 0.023 13.067 0.221 c
+12.868 0.427 12.773 0.713 12.773 1.088 c
+12.773 1.488 12.909 1.808 13.184 2.043 c
+13.456 2.286 13.832 2.411 14.302 2.411 c
+14.787 2.411 l
+14.787 2.837 l
+14.787 3.072 14.732 3.238 14.626 3.337 c
+14.515 3.444 14.354 3.499 14.14 3.499 c
+13.942 3.499 13.78 3.44 13.655 3.323 c
+13.537 3.205 13.479 3.057 13.479 2.882 c
+12.832 2.882 l
+12.832 3.076 12.891 3.267 13.009 3.454 c
+13.134 3.639 13.295 3.786 13.493 3.896 c
+13.699 4.002 13.927 4.057 14.184 4.057 c
+14.585 4.057 14.89 3.955 15.096 3.749 c
+15.309 3.543 15.422 3.249 15.434 2.866 c
+15.434 0.853 l
+15.434 0.548 15.47 0.283 15.551 0.059 c
+15.551 0 l
+h
+14.008 0.515 m
+14.173 0.515 14.324 0.559 14.464 0.647 c
+14.611 0.736 14.717 0.846 14.787 0.985 c
+14.787 1.926 l
+14.42 1.926 l
+14.104 1.926 13.861 1.856 13.685 1.721 c
+13.508 1.592 13.42 1.405 13.42 1.162 c
+13.42 0.934 13.464 0.769 13.552 0.662 c
+13.641 0.563 13.791 0.515 14.008 0.515 c
+18.08 3.367 m
+17.992 3.385 17.892 3.396 17.786 3.396 c
+17.452 3.396 17.216 3.212 17.08 2.852 c
+17.08 0 l
+16.434 0 l
+16.434 3.984 l
+17.065 3.984 l
+17.08 3.572 l
+17.256 3.896 17.499 4.057 17.815 4.057 c
+17.922 4.057 18.01 4.035 18.08 3.998 c
+h
+18.52 2.176 m
+18.52 2.782 18.63 3.249 18.859 3.572 c
+19.094 3.896 19.421 4.057 19.843 4.057 c
+20.226 4.057 20.523 3.899 20.74 3.587 c
+20.74 5.644 l
+21.387 5.644 l
+21.387 0 l
+20.799 0 l
+20.755 0.427 l
+20.549 0.092 20.244 -0.073 19.843 -0.073 c
+19.432 -0.073 19.108 0.081 18.873 0.397 c
+18.638 0.721 18.52 1.176 18.52 1.764 c
+h
+19.168 1.794 m
+19.168 1.353 19.23 1.022 19.359 0.809 c
+19.494 0.603 19.715 0.5 20.02 0.5 c
+20.343 0.5 20.582 0.662 20.74 0.985 c
+20.74 2.999 l
+20.571 3.311 20.332 3.469 20.02 3.469 c
+19.715 3.469 19.494 3.367 19.359 3.161 c
+19.23 2.955 19.168 2.631 19.168 2.191 c
+h
+25.487 0.485 m
+25.701 0.485 25.874 0.548 26.002 0.676 c
+26.138 0.813 26.212 1.004 26.223 1.25 c
+26.84 1.25 l
+26.819 0.867 26.682 0.548 26.428 0.294 c
+26.171 0.048 25.859 -0.073 25.487 -0.073 c
+24.995 -0.073 24.621 0.077 24.356 0.383 c
+24.099 0.695 23.974 1.162 23.974 1.779 c
+23.974 2.22 l
+23.974 2.816 24.099 3.271 24.356 3.587 c
+24.621 3.899 24.995 4.057 25.487 4.057 c
+25.888 4.057 26.208 3.925 26.443 3.66 c
+26.686 3.404 26.819 3.057 26.84 2.617 c
+26.223 2.617 l
+26.201 2.911 26.127 3.132 26.002 3.279 c
+25.884 3.425 25.712 3.499 25.487 3.499 c
+25.194 3.499 24.978 3.4 24.841 3.205 c
+24.702 3.017 24.628 2.708 24.621 2.278 c
+24.621 1.764 l
+24.621 1.294 24.687 0.96 24.826 0.765 c
+24.974 0.578 25.194 0.485 25.487 0.485 c
+28.236 3.572 m
+28.49 3.896 28.81 4.057 29.192 4.057 c
+29.898 4.057 30.254 3.587 30.265 2.646 c
+30.265 0 l
+29.618 0 l
+29.618 2.617 l
+29.618 2.929 29.564 3.15 29.456 3.279 c
+29.346 3.404 29.192 3.469 28.986 3.469 c
+28.828 3.469 28.681 3.414 28.545 3.308 c
+28.417 3.198 28.313 3.061 28.236 2.897 c
+28.236 0 l
+27.59 0 l
+27.59 5.644 l
+28.236 5.644 l
+h
+33.264 0 m
+33.223 0.088 33.198 0.235 33.19 0.441 c
+32.955 0.096 32.662 -0.073 32.308 -0.073 c
+31.945 -0.073 31.662 0.023 31.456 0.221 c
+31.257 0.427 31.162 0.713 31.162 1.088 c
+31.162 1.488 31.297 1.808 31.573 2.043 c
+31.845 2.286 32.22 2.411 32.691 2.411 c
+33.175 2.411 l
+33.175 2.837 l
+33.175 3.072 33.121 3.238 33.013 3.337 c
+32.903 3.444 32.741 3.499 32.529 3.499 c
+32.33 3.499 32.169 3.44 32.043 3.323 c
+31.926 3.205 31.868 3.057 31.868 2.882 c
+31.22 2.882 l
+31.22 3.076 31.28 3.267 31.397 3.454 c
+31.522 3.639 31.683 3.786 31.882 3.896 c
+32.088 4.002 32.315 4.057 32.573 4.057 c
+32.974 4.057 33.279 3.955 33.484 3.749 c
+33.697 3.543 33.811 3.249 33.822 2.866 c
+33.822 0.853 l
+33.822 0.548 33.859 0.283 33.94 0.059 c
+33.94 0 l
+h
+32.396 0.515 m
+32.562 0.515 32.712 0.559 32.852 0.647 c
+32.999 0.736 33.106 0.846 33.175 0.985 c
+33.175 1.926 l
+32.808 1.926 l
+32.492 1.926 32.249 1.856 32.073 1.721 c
+31.897 1.592 31.808 1.405 31.808 1.162 c
+31.808 0.934 31.852 0.769 31.941 0.662 c
+32.029 0.563 32.18 0.515 32.396 0.515 c
+35.44 3.984 m
+35.454 3.543 l
+35.708 3.884 36.031 4.057 36.424 4.057 c
+37.13 4.057 37.486 3.587 37.497 2.646 c
+37.497 0 l
+36.851 0 l
+36.851 2.617 l
+36.851 2.929 36.795 3.15 36.689 3.279 c
+36.579 3.404 36.424 3.469 36.218 3.469 c
+36.06 3.469 35.914 3.414 35.777 3.308 c
+35.648 3.198 35.546 3.061 35.469 2.897 c
+35.469 0 l
+34.821 0 l
+34.821 3.984 l
+h
+38.335 2.176 m
+38.335 2.793 38.445 3.256 38.673 3.572 c
+38.897 3.896 39.232 4.057 39.673 4.057 c
+40.073 4.057 40.378 3.881 40.583 3.528 c
+40.628 3.984 l
+41.216 3.984 l
+41.216 -0.043 l
+41.216 -0.532 41.088 -0.911 40.834 -1.176 c
+40.577 -1.44 40.224 -1.572 39.775 -1.572 c
+39.577 -1.572 39.357 -1.521 39.114 -1.425 c
+38.868 -1.326 38.688 -1.205 38.57 -1.058 c
+38.835 -0.617 l
+39.099 -0.881 39.397 -1.014 39.731 -1.014 c
+40.267 -1.014 40.543 -0.72 40.554 -0.132 c
+40.554 0.397 l
+40.348 0.081 40.047 -0.073 39.658 -0.073 c
+39.247 -0.073 38.923 0.077 38.688 0.383 c
+38.46 0.695 38.343 1.147 38.335 1.735 c
+h
+38.996 1.794 m
+38.996 1.353 39.059 1.022 39.187 0.809 c
+39.313 0.603 39.529 0.5 39.834 0.5 c
+40.157 0.5 40.396 0.665 40.554 1 c
+40.554 2.984 l
+40.385 3.308 40.147 3.469 39.834 3.469 c
+39.54 3.469 39.324 3.367 39.187 3.161 c
+39.059 2.955 38.996 2.631 38.996 2.191 c
+h
+43.597 -0.073 m
+43.097 -0.073 42.715 0.074 42.451 0.368 c
+42.186 0.662 42.054 1.095 42.054 1.676 c
+42.054 2.147 l
+42.054 2.741 42.179 3.209 42.436 3.543 c
+42.7 3.884 43.06 4.057 43.523 4.057 c
+43.983 4.057 44.325 3.903 44.552 3.602 c
+44.788 3.308 44.909 2.845 44.92 2.22 c
+44.92 1.794 l
+42.7 1.794 l
+42.7 1.706 l
+42.7 1.272 42.777 0.96 42.935 0.765 c
+43.101 0.578 43.332 0.485 43.627 0.485 c
+43.822 0.485 43.994 0.518 44.141 0.588 c
+44.288 0.665 44.424 0.783 44.552 0.941 c
+44.891 0.53 l
+44.604 0.125 44.174 -0.073 43.597 -0.073 c
+43.523 3.499 m
+43.248 3.499 43.046 3.404 42.921 3.219 c
+42.792 3.032 42.719 2.741 42.7 2.352 c
+44.273 2.352 l
+44.273 2.44 l
+44.251 2.822 44.186 3.091 44.067 3.249 c
+43.95 3.414 43.766 3.499 43.523 3.499 c
+47.639 1.015 m
+47.639 1.162 47.584 1.283 47.478 1.382 c
+47.367 1.478 47.162 1.596 46.86 1.735 c
+46.515 1.882 46.272 2.003 46.125 2.103 c
+45.979 2.209 45.869 2.326 45.802 2.455 c
+45.732 2.58 45.699 2.739 45.699 2.926 c
+45.699 3.249 45.817 3.517 46.052 3.734 c
+46.287 3.947 46.588 4.057 46.964 4.057 c
+47.346 4.057 47.654 3.944 47.889 3.72 c
+48.124 3.491 48.242 3.205 48.242 2.852 c
+47.595 2.852 l
+47.595 3.028 47.536 3.179 47.419 3.308 c
+47.301 3.433 47.147 3.499 46.964 3.499 c
+46.765 3.499 46.615 3.444 46.507 3.337 c
+46.397 3.238 46.346 3.105 46.346 2.94 c
+46.346 2.812 46.382 2.705 46.463 2.617 c
+46.54 2.536 46.732 2.433 47.037 2.309 c
+47.515 2.12 47.845 1.933 48.022 1.75 c
+48.198 1.573 48.286 1.345 48.286 1.073 c
+48.286 0.721 48.161 0.441 47.918 0.235 c
+47.683 0.03 47.367 -0.073 46.978 -0.073 c
+46.555 -0.073 46.218 0.044 45.964 0.279 c
+45.707 0.522 45.582 0.827 45.582 1.191 c
+46.228 1.191 l
+46.235 0.963 46.305 0.786 46.434 0.662 c
+46.559 0.545 46.743 0.485 46.978 0.485 c
+47.191 0.485 47.353 0.533 47.463 0.632 c
+47.581 0.728 47.639 0.857 47.639 1.015 c
+51.55 0 -0.647 3.984 re
+51.593 5.027 m
+51.593 4.917 51.564 4.825 51.505 4.748 c
+51.446 4.678 51.351 4.645 51.226 4.645 c
+51.108 4.645 51.013 4.678 50.947 4.748 c
+50.887 4.825 50.858 4.917 50.858 5.027 c
+50.858 5.145 50.887 5.237 50.947 5.307 c
+51.013 5.384 51.108 5.424 51.226 5.424 c
+51.351 5.424 51.446 5.384 51.505 5.307 c
+51.564 5.226 51.593 5.134 51.593 5.027 c
+53.181 3.984 m
+53.196 3.543 l
+53.449 3.884 53.773 4.057 54.166 4.057 c
+54.871 4.057 55.228 3.587 55.239 2.646 c
+55.239 0 l
+54.592 0 l
+54.592 2.617 l
+54.592 2.929 54.537 3.15 54.43 3.279 c
+54.32 3.404 54.166 3.469 53.96 3.469 c
+53.802 3.469 53.655 3.414 53.519 3.308 c
+53.391 3.198 53.287 3.061 53.21 2.897 c
+53.21 0 l
+52.564 0 l
+52.564 3.984 l
+h
+f
+Q
+q 1 0 0 1 372.1404 306.1949 cm
+0 0 m
+0.353 2.234 l
+1.352 2.234 l
+0.529 -1.75 l
+-0.339 -1.75 l
+-0.897 0.559 l
+-1.455 -1.75 l
+-2.323 -1.75 l
+-3.146 2.234 l
+-2.147 2.234 l
+-1.794 0 l
+-1.264 2.234 l
+-0.53 2.234 l
+h
+1.749 0.367 m
+1.749 0.974 1.888 1.448 2.175 1.793 c
+2.458 2.135 2.851 2.308 3.351 2.308 c
+3.858 2.308 4.255 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.367 c
+4.968 0.103 l
+4.968 -0.497 4.825 -0.967 4.542 -1.309 c
+4.255 -1.654 3.858 -1.823 3.351 -1.823 c
+2.84 -1.823 2.443 -1.654 2.16 -1.309 c
+1.885 -0.967 1.749 -0.493 1.749 0.118 c
+h
+2.792 0.103 m
+2.792 -0.603 2.977 -0.956 3.351 -0.956 c
+3.704 -0.956 3.895 -0.661 3.925 -0.073 c
+3.925 0.367 l
+3.925 0.727 3.873 0.999 3.777 1.176 c
+3.678 1.352 3.534 1.44 3.351 1.44 c
+3.175 1.44 3.035 1.352 2.94 1.176 c
+2.84 0.999 2.792 0.727 2.792 0.367 c
+h
+7.569 1.22 m
+7.231 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.881 c
+6.659 -1.75 l
+5.614 -1.75 l
+5.614 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.305 2.308 c
+7.422 2.308 7.515 2.285 7.584 2.248 c
+h
+9.437 -0.221 m
+9.157 -0.53 l
+9.157 -1.75 l
+8.114 -1.75 l
+8.114 3.895 l
+9.157 3.895 l
+9.157 0.852 l
+9.275 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.083 0.588 l
+11.347 -1.75 l
+10.156 -1.75 l
+h
+12.803 -1.75 -1.043 3.984 re
+11.715 3.263 m
+11.715 3.418 11.763 3.546 11.862 3.645 c
+11.968 3.752 12.104 3.807 12.273 3.807 c
+12.45 3.807 12.586 3.752 12.685 3.645 c
+12.791 3.546 12.847 3.418 12.847 3.263 c
+12.847 3.094 12.791 2.958 12.685 2.851 c
+12.586 2.753 12.45 2.705 12.273 2.705 c
+12.104 2.705 11.968 2.753 11.862 2.851 c
+11.763 2.958 11.715 3.094 11.715 3.263 c
+14.566 2.234 m
+14.596 1.837 l
+14.831 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.826 16.565 0.867 c
+16.565 -1.75 l
+15.522 -1.75 l
+15.522 0.794 l
+15.522 1.018 15.486 1.18 15.419 1.278 c
+15.349 1.374 15.232 1.425 15.066 1.425 c
+14.879 1.425 14.732 1.33 14.625 1.147 c
+14.625 -1.75 l
+13.581 -1.75 l
+13.581 2.234 l
+h
+17.183 0.367 m
+17.183 1.014 17.3 1.5 17.535 1.822 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.165 19.359 1.882 c
+19.403 2.234 l
+20.343 2.234 l
+20.343 -1.75 l
+20.343 -2.257 20.2 -2.646 19.917 -2.911 c
+19.63 -3.182 19.226 -3.322 18.697 -3.322 c
+18.469 -3.322 18.233 -3.278 17.992 -3.19 c
+17.756 -3.102 17.58 -2.988 17.462 -2.851 c
+17.815 -2.132 l
+17.911 -2.238 18.039 -2.323 18.197 -2.381 c
+18.351 -2.448 18.499 -2.484 18.638 -2.484 c
+18.873 -2.484 19.039 -2.425 19.137 -2.308 c
+19.245 -2.198 19.299 -2.022 19.299 -1.779 c
+19.299 -1.426 l
+19.101 -1.69 18.844 -1.823 18.52 -1.823 c
+18.098 -1.823 17.771 -1.661 17.535 -1.338 c
+17.308 -1.008 17.19 -0.537 17.183 0.073 c
+h
+18.227 0.103 m
+18.227 -0.272 18.274 -0.54 18.374 -0.706 c
+18.469 -0.875 18.623 -0.956 18.829 -0.956 c
+19.042 -0.956 19.201 -0.879 19.299 -0.721 c
+19.299 1.176 l
+19.189 1.341 19.035 1.425 18.829 1.425 c
+18.623 1.425 18.469 1.341 18.374 1.176 c
+18.274 1.007 18.227 0.738 18.227 0.367 c
+h
+22.695 0.367 m
+22.695 1.014 22.802 1.5 23.018 1.822 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.554 2.175 24.753 1.911 c
+24.753 3.895 l
+25.811 3.895 l
+25.811 -1.75 l
+24.856 -1.75 l
+24.812 -1.338 l
+24.595 -1.661 24.319 -1.823 23.989 -1.823 c
+23.577 -1.823 23.257 -1.669 23.033 -1.353 c
+22.817 -1.029 22.702 -0.559 22.695 0.058 c
+h
+23.739 0.103 m
+23.739 -0.291 23.775 -0.566 23.856 -0.721 c
+23.945 -0.879 24.091 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.753 -0.676 c
+24.753 1.132 l
+24.654 1.326 24.503 1.425 24.297 1.425 c
+24.099 1.425 23.959 1.344 23.871 1.19 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.75 -1.044 3.984 re
+26.576 3.263 m
+26.576 3.418 26.623 3.546 26.723 3.645 c
+26.829 3.752 26.965 3.807 27.134 3.807 c
+27.311 3.807 27.446 3.752 27.546 3.645 c
+27.652 3.546 27.708 3.418 27.708 3.263 c
+27.708 3.094 27.652 2.958 27.546 2.851 c
+27.446 2.753 27.311 2.705 27.134 2.705 c
+26.965 2.705 26.829 2.753 26.723 2.851 c
+26.623 2.958 26.576 3.094 26.576 3.263 c
+30.426 1.22 m
+30.089 1.249 l
+29.802 1.249 29.611 1.124 29.516 0.881 c
+29.516 -1.75 l
+28.471 -1.75 l
+28.471 2.234 l
+29.441 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.162 2.308 c
+30.28 2.308 30.372 2.285 30.441 2.248 c
+h
+32.499 -1.823 m
+31.97 -1.823 31.551 -1.669 31.249 -1.353 c
+30.956 -1.029 30.809 -0.57 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.945 1.448 31.22 1.793 c
+31.492 2.135 31.885 2.308 32.396 2.308 c
+32.896 2.308 33.267 2.146 33.514 1.822 c
+33.767 1.5 33.9 1.022 33.91 0.397 c
+33.91 -0.103 l
+31.837 -0.103 l
+31.856 -0.397 31.918 -0.614 32.028 -0.75 c
+32.147 -0.89 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.204 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.723 -1.411 33.535 -1.555 33.293 -1.661 c
+33.047 -1.768 32.782 -1.823 32.499 -1.823 c
+31.853 0.617 m
+32.882 0.617 l
+32.882 0.72 l
+32.882 0.955 32.841 1.132 32.764 1.249 c
+32.694 1.374 32.566 1.44 32.382 1.44 c
+32.205 1.44 32.073 1.371 31.985 1.234 c
+31.904 1.106 31.86 0.9 31.853 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.383 -0.761 36.394 -0.368 c
+37.364 -0.368 l
+37.364 -0.802 37.233 -1.154 36.967 -1.426 c
+36.703 -1.69 36.365 -1.823 35.953 -1.823 c
+35.442 -1.823 35.049 -1.669 34.777 -1.353 c
+34.513 -1.029 34.374 -0.559 34.366 0.058 c
+34.366 0.382 l
+34.366 1.007 34.499 1.484 34.763 1.808 c
+35.035 2.138 35.432 2.308 35.953 2.308 c
+36.383 2.308 36.726 2.167 36.982 1.896 c
+37.236 1.62 37.364 1.238 37.364 0.75 c
+36.394 0.75 l
+36.394 0.962 36.354 1.132 36.277 1.249 c
+36.207 1.374 36.09 1.44 35.924 1.44 c
+35.748 1.44 35.619 1.374 35.542 1.249 c
+35.461 1.12 35.417 0.871 35.409 0.5 c
+35.409 0.088 l
+35.409 -0.235 35.424 -0.463 35.454 -0.588 c
+35.49 -0.717 35.546 -0.809 35.615 -0.867 c
+35.693 -0.927 35.799 -0.956 35.939 -0.956 c
+39.172 3.204 m
+39.172 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.172 1.44 l
+39.172 -0.53 l
+39.172 -0.688 39.191 -0.794 39.232 -0.852 c
+39.28 -0.912 39.363 -0.941 39.481 -0.941 c
+39.588 -0.941 39.673 -0.933 39.731 -0.912 c
+39.731 -1.72 l
+39.554 -1.786 39.363 -1.823 39.158 -1.823 c
+38.482 -1.823 38.137 -1.437 38.129 -0.661 c
+38.129 1.44 l
+37.673 1.44 l
+37.673 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.367 m
+40.055 0.974 40.194 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.847 1.793 c
+43.13 1.448 43.274 0.974 43.274 0.367 c
+43.274 0.103 l
+43.274 -0.497 43.13 -0.967 42.847 -1.309 c
+42.561 -1.654 42.164 -1.823 41.657 -1.823 c
+41.146 -1.823 40.749 -1.654 40.466 -1.309 c
+40.19 -0.967 40.055 -0.493 40.055 0.118 c
+h
+41.098 0.103 m
+41.098 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.201 -0.661 42.23 -0.073 c
+42.23 0.367 l
+42.23 0.727 42.179 0.999 42.083 1.176 c
+41.984 1.352 41.84 1.44 41.657 1.44 c
+41.48 1.44 41.341 1.352 41.245 1.176 c
+41.146 0.999 41.098 0.727 41.098 0.367 c
+h
+45.875 1.22 m
+45.537 1.249 l
+45.251 1.249 45.06 1.124 44.964 0.881 c
+44.964 -1.75 l
+43.92 -1.75 l
+43.92 2.234 l
+44.89 2.234 l
+44.92 1.793 l
+45.085 2.135 45.317 2.308 45.611 2.308 c
+45.728 2.308 45.821 2.285 45.89 2.248 c
+h
+47.772 -0.015 m
+48.3 2.234 l
+49.403 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.529 -3.352 46.993 -3.352 c
+46.864 -3.352 46.721 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.484 l
+46.849 -2.484 46.97 -2.448 47.051 -2.381 c
+47.128 -2.323 47.191 -2.213 47.242 -2.058 c
+47.315 -1.793 l
+46.17 2.234 l
+47.286 2.234 l
+h
+f
+Q
+q 1 0 0 1 422.1464 304.7979 cm
+0 0 m
+0 0.118 0.033 0.214 0.103 0.294 c
+0.169 0.372 0.272 0.412 0.411 0.412 c
+0.559 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.201 0.735 -0.278 c
+0.665 -0.357 0.559 -0.396 0.411 -0.396 c
+0.272 -0.396 0.169 -0.357 0.103 -0.278 c
+0.033 -0.201 0 -0.11 0 0 c
+6.732 4.425 m
+5.321 4.425 l
+5.321 -0.353 l
+4.659 -0.353 l
+4.659 4.425 l
+3.248 4.425 l
+3.248 4.998 l
+6.732 4.998 l
+h
+8.085 3.219 m
+8.338 3.543 8.658 3.705 9.04 3.705 c
+9.745 3.705 10.102 3.234 10.113 2.294 c
+10.113 -0.353 l
+9.466 -0.353 l
+9.466 2.264 l
+9.466 2.577 9.411 2.797 9.304 2.926 c
+9.194 3.051 9.04 3.117 8.834 3.117 c
+8.676 3.117 8.529 3.061 8.393 2.955 c
+8.264 2.845 8.162 2.708 8.085 2.544 c
+8.085 -0.353 l
+7.437 -0.353 l
+7.437 5.292 l
+8.085 5.292 l
+h
+11.774 -0.353 -0.647 3.984 re
+11.818 4.675 m
+11.818 4.564 11.788 4.472 11.73 4.395 c
+11.671 4.326 11.576 4.293 11.451 4.293 c
+11.333 4.293 11.237 4.326 11.171 4.395 c
+11.112 4.472 11.083 4.564 11.083 4.675 c
+11.083 4.792 11.112 4.884 11.171 4.954 c
+11.237 5.031 11.333 5.072 11.451 5.072 c
+11.576 5.072 11.671 5.031 11.73 4.954 c
+11.788 4.873 11.818 4.781 11.818 4.675 c
+14.728 0.662 m
+14.728 0.809 14.674 0.93 14.566 1.029 c
+14.456 1.125 14.25 1.243 13.949 1.382 c
+13.604 1.529 13.361 1.65 13.215 1.75 c
+13.067 1.856 12.957 1.974 12.891 2.103 c
+12.821 2.228 12.788 2.386 12.788 2.573 c
+12.788 2.897 12.906 3.165 13.141 3.381 c
+13.376 3.595 13.677 3.705 14.052 3.705 c
+14.435 3.705 14.743 3.591 14.978 3.367 c
+15.214 3.138 15.331 2.852 15.331 2.5 c
+14.684 2.5 l
+14.684 2.675 14.626 2.826 14.508 2.955 c
+14.39 3.08 14.236 3.146 14.052 3.146 c
+13.853 3.146 13.703 3.091 13.596 2.984 c
+13.486 2.885 13.435 2.753 13.435 2.587 c
+13.435 2.459 13.471 2.352 13.552 2.264 c
+13.629 2.183 13.82 2.08 14.126 1.956 c
+14.603 1.768 14.934 1.58 15.11 1.397 c
+15.287 1.22 15.375 0.992 15.375 0.721 c
+15.375 0.368 15.25 0.088 15.008 -0.118 c
+14.772 -0.323 14.456 -0.426 14.067 -0.426 c
+13.644 -0.426 13.306 -0.309 13.053 -0.073 c
+12.795 0.169 12.671 0.474 12.671 0.838 c
+13.317 0.838 l
+13.325 0.611 13.394 0.434 13.523 0.31 c
+13.648 0.192 13.832 0.133 14.067 0.133 c
+14.28 0.133 14.441 0.181 14.552 0.279 c
+14.67 0.375 14.728 0.504 14.728 0.662 c
+17.801 1.823 m
+17.801 2.4 17.936 2.856 18.212 3.19 c
+18.495 3.532 18.867 3.705 19.329 3.705 c
+19.788 3.705 20.156 3.535 20.432 3.205 c
+20.714 2.882 20.862 2.433 20.872 1.867 c
+20.872 1.441 l
+20.872 0.871 20.729 0.416 20.446 0.074 c
+20.17 -0.261 19.803 -0.426 19.343 -0.426 c
+18.881 -0.426 18.51 -0.264 18.227 0.059 c
+17.951 0.389 17.808 0.831 17.801 1.382 c
+h
+18.447 1.441 m
+18.447 1.037 18.524 0.721 18.682 0.485 c
+18.848 0.25 19.068 0.133 19.343 0.133 c
+19.91 0.133 20.203 0.545 20.226 1.368 c
+20.226 1.823 l
+20.226 2.224 20.141 2.544 19.976 2.779 c
+19.818 3.021 19.601 3.146 19.329 3.146 c
+19.065 3.146 18.848 3.021 18.682 2.779 c
+18.524 2.544 18.447 2.224 18.447 1.823 c
+h
+24.591 1.441 m
+24.591 0.813 24.474 0.342 24.239 0.03 c
+24.01 -0.276 23.694 -0.426 23.283 -0.426 c
+22.879 -0.426 22.57 -0.276 22.358 0.03 c
+22.358 -1.881 l
+21.71 -1.881 l
+21.71 3.631 l
+22.298 3.631 l
+22.343 3.19 l
+22.555 3.532 22.865 3.705 23.268 3.705 c
+23.709 3.705 24.037 3.55 24.253 3.249 c
+24.467 2.944 24.581 2.488 24.591 1.881 c
+h
+23.945 1.823 m
+23.945 2.264 23.875 2.587 23.739 2.793 c
+23.599 3.007 23.378 3.117 23.077 3.117 c
+22.761 3.117 22.522 2.962 22.358 2.661 c
+22.358 0.588 l
+22.522 0.283 22.761 0.133 23.077 0.133 c
+23.372 0.133 23.584 0.235 23.724 0.441 c
+23.86 0.655 23.933 0.985 23.945 1.426 c
+h
+26.855 -0.426 m
+26.356 -0.426 25.973 -0.278 25.709 0.015 c
+25.444 0.31 25.312 0.742 25.312 1.324 c
+25.312 1.794 l
+25.312 2.389 25.437 2.856 25.693 3.19 c
+25.959 3.532 26.318 3.705 26.782 3.705 c
+27.241 3.705 27.582 3.55 27.81 3.249 c
+28.045 2.955 28.167 2.492 28.178 1.867 c
+28.178 1.441 l
+25.959 1.441 l
+25.959 1.353 l
+25.959 0.919 26.036 0.607 26.194 0.412 c
+26.359 0.225 26.591 0.133 26.884 0.133 c
+27.079 0.133 27.252 0.166 27.399 0.235 c
+27.546 0.312 27.682 0.43 27.81 0.588 c
+28.149 0.177 l
+27.862 -0.228 27.432 -0.426 26.855 -0.426 c
+26.782 3.146 m
+26.506 3.146 26.304 3.051 26.179 2.866 c
+26.05 2.679 25.977 2.389 25.959 1.999 c
+27.532 1.999 l
+27.532 2.088 l
+27.509 2.469 27.443 2.738 27.326 2.897 c
+27.208 3.061 27.024 3.146 26.782 3.146 c
+30.603 3.014 m
+30.515 3.032 30.416 3.043 30.31 3.043 c
+29.975 3.043 29.74 2.859 29.604 2.5 c
+29.604 -0.353 l
+28.957 -0.353 l
+28.957 3.631 l
+29.589 3.631 l
+29.604 3.219 l
+29.78 3.543 30.023 3.705 30.339 3.705 c
+30.445 3.705 30.534 3.682 30.603 3.645 c
+h
+33.146 -0.353 m
+33.106 -0.264 33.08 -0.118 33.073 0.088 c
+32.837 -0.257 32.544 -0.426 32.191 -0.426 c
+31.827 -0.426 31.544 -0.33 31.338 -0.132 c
+31.139 0.074 31.044 0.36 31.044 0.736 c
+31.044 1.135 31.18 1.455 31.456 1.691 c
+31.727 1.933 32.103 2.058 32.573 2.058 c
+33.058 2.058 l
+33.058 2.485 l
+33.058 2.72 33.003 2.885 32.897 2.984 c
+32.786 3.091 32.625 3.146 32.411 3.146 c
+32.213 3.146 32.051 3.088 31.926 2.97 c
+31.808 2.852 31.75 2.705 31.75 2.529 c
+31.103 2.529 l
+31.103 2.723 31.162 2.914 31.28 3.102 c
+31.405 3.286 31.566 3.433 31.765 3.543 c
+31.97 3.649 32.198 3.705 32.456 3.705 c
+32.856 3.705 33.161 3.602 33.367 3.396 c
+33.58 3.19 33.694 2.897 33.705 2.514 c
+33.705 0.5 l
+33.705 0.195 33.741 -0.07 33.822 -0.293 c
+33.822 -0.353 l
+h
+32.279 0.162 m
+32.444 0.162 32.595 0.206 32.735 0.294 c
+32.882 0.383 32.988 0.493 33.058 0.632 c
+33.058 1.573 l
+32.691 1.573 l
+32.375 1.573 32.132 1.503 31.956 1.368 c
+31.779 1.239 31.691 1.052 31.691 0.809 c
+31.691 0.581 31.735 0.416 31.823 0.31 c
+31.912 0.21 32.062 0.162 32.279 0.162 c
+35.557 4.586 m
+35.557 3.631 l
+36.159 3.631 l
+36.159 3.102 l
+35.557 3.102 l
+35.557 0.632 l
+35.557 0.474 35.579 0.357 35.63 0.279 c
+35.689 0.198 35.777 0.162 35.895 0.162 c
+35.983 0.162 36.072 0.177 36.159 0.206 c
+36.159 -0.353 l
+36.012 -0.4 35.858 -0.426 35.704 -0.426 c
+35.447 -0.426 35.252 -0.334 35.116 -0.147 c
+34.977 0.037 34.91 0.298 34.91 0.632 c
+34.91 3.102 l
+34.308 3.102 l
+34.308 3.631 l
+34.91 3.631 l
+34.91 4.586 l
+h
+37.63 -0.353 -0.647 3.984 re
+37.674 4.675 m
+37.674 4.564 37.645 4.472 37.585 4.395 c
+37.526 4.326 37.431 4.293 37.306 4.293 c
+37.188 4.293 37.093 4.326 37.027 4.395 c
+36.968 4.472 36.939 4.564 36.939 4.675 c
+36.939 4.792 36.968 4.884 37.027 4.954 c
+37.093 5.031 37.188 5.072 37.306 5.072 c
+37.431 5.072 37.526 5.031 37.585 4.954 c
+37.645 4.873 37.674 4.781 37.674 4.675 c
+38.511 1.823 m
+38.511 2.4 38.647 2.856 38.923 3.19 c
+39.206 3.532 39.577 3.705 40.04 3.705 c
+40.5 3.705 40.867 3.535 41.142 3.205 c
+41.425 2.882 41.572 2.433 41.583 1.867 c
+41.583 1.441 l
+41.583 0.871 41.44 0.416 41.157 0.074 c
+40.882 -0.261 40.514 -0.426 40.055 -0.426 c
+39.592 -0.426 39.22 -0.264 38.937 0.059 c
+38.663 0.389 38.519 0.831 38.511 1.382 c
+h
+39.158 1.441 m
+39.158 1.037 39.235 0.721 39.393 0.485 c
+39.559 0.25 39.779 0.133 40.055 0.133 c
+40.621 0.133 40.915 0.545 40.937 1.368 c
+40.937 1.823 l
+40.937 2.224 40.853 2.544 40.687 2.779 c
+40.529 3.021 40.312 3.146 40.04 3.146 c
+39.775 3.146 39.559 3.021 39.393 2.779 c
+39.235 2.544 39.158 2.224 39.158 1.823 c
+h
+43.039 3.631 m
+43.054 3.19 l
+43.307 3.532 43.631 3.705 44.024 3.705 c
+44.729 3.705 45.086 3.234 45.096 2.294 c
+45.096 -0.353 l
+44.45 -0.353 l
+44.45 2.264 l
+44.45 2.577 44.394 2.797 44.288 2.926 c
+44.178 3.051 44.024 3.117 43.818 3.117 c
+43.66 3.117 43.513 3.061 43.377 2.955 c
+43.249 2.845 43.145 2.708 43.068 2.544 c
+43.068 -0.353 l
+42.422 -0.353 l
+42.422 3.631 l
+h
+f
+Q
+470.639 304.445 -0.647 3.984 re
+470.683 309.472 m
+470.683 309.362 470.653 309.27 470.594 309.193 c
+470.535 309.123 470.44 309.09 470.315 309.09 c
+470.197 309.09 470.102 309.123 470.036 309.193 c
+469.977 309.27 469.947 309.362 469.947 309.472 c
+469.947 309.59 469.977 309.682 470.036 309.752 c
+470.102 309.829 470.197 309.869 470.315 309.869 c
+470.44 309.869 470.535 309.829 470.594 309.752 c
+470.653 309.671 470.683 309.579 470.683 309.472 c
+473.593 305.46 m
+473.593 305.607 473.538 305.728 473.432 305.827 c
+473.321 305.923 473.116 306.041 472.814 306.18 c
+472.468 306.327 472.226 306.448 472.079 306.548 c
+471.932 306.654 471.822 306.772 471.755 306.9 c
+471.686 307.026 471.653 307.184 471.653 307.371 c
+471.653 307.694 471.77 307.963 472.006 308.179 c
+472.241 308.392 472.542 308.503 472.917 308.503 c
+473.299 308.503 473.608 308.389 473.843 308.165 c
+474.078 307.936 474.196 307.65 474.196 307.297 c
+473.548 307.297 l
+473.548 307.473 473.49 307.624 473.372 307.753 c
+473.255 307.878 473.101 307.944 472.917 307.944 c
+472.719 307.944 472.568 307.889 472.461 307.782 c
+472.351 307.683 472.299 307.55 472.299 307.385 c
+472.299 307.257 472.336 307.15 472.417 307.062 c
+472.494 306.981 472.686 306.878 472.991 306.754 c
+473.468 306.565 473.799 306.378 473.975 306.195 c
+474.151 306.018 474.24 305.79 474.24 305.518 c
+474.24 305.166 474.115 304.886 473.872 304.68 c
+473.637 304.475 473.321 304.372 472.931 304.372 c
+472.509 304.372 472.171 304.489 471.917 304.724 c
+471.66 304.967 471.535 305.272 471.535 305.636 c
+472.182 305.636 l
+472.189 305.408 472.259 305.232 472.388 305.107 c
+472.513 304.99 472.696 304.931 472.931 304.931 c
+473.145 304.931 473.307 304.978 473.417 305.077 c
+473.534 305.173 473.593 305.302 473.593 305.46 c
+f
+q 1 0 0 1 478.6491 304.8129 cm
+0 0 m
+-0.216 -0.294 -0.507 -0.441 -0.867 -0.441 c
+-1.23 -0.441 -1.51 -0.32 -1.705 -0.073 c
+-1.892 0.18 -1.984 0.548 -1.984 1.029 c
+-1.984 3.616 l
+-0.941 3.616 l
+-0.941 1.014 l
+-0.941 0.621 -0.816 0.426 -0.558 0.426 c
+-0.323 0.426 -0.154 0.53 -0.043 0.735 c
+-0.043 3.616 l
+1 3.616 l
+1 -0.368 l
+0.03 -0.368 l
+h
+2.705 3.616 m
+2.735 3.219 l
+2.97 3.532 3.271 3.69 3.645 3.69 c
+4.329 3.69 4.682 3.208 4.704 2.249 c
+4.704 -0.368 l
+3.66 -0.368 l
+3.66 2.176 l
+3.66 2.4 3.624 2.562 3.558 2.66 c
+3.487 2.756 3.37 2.807 3.205 2.807 c
+3.017 2.807 2.87 2.712 2.764 2.529 c
+2.764 -0.368 l
+1.72 -0.368 l
+1.72 3.616 l
+h
+7.408 2.602 m
+7.071 2.631 l
+6.784 2.631 6.593 2.506 6.498 2.263 c
+6.498 -0.368 l
+5.453 -0.368 l
+5.453 3.616 l
+6.423 3.616 l
+6.453 3.175 l
+6.619 3.516 6.85 3.69 7.144 3.69 c
+7.262 3.69 7.354 3.667 7.423 3.63 c
+h
+9.481 -0.441 m
+8.952 -0.441 8.533 -0.287 8.231 0.029 c
+7.938 0.353 7.791 0.812 7.791 1.411 c
+7.791 1.72 l
+7.791 2.344 7.927 2.83 8.202 3.175 c
+8.474 3.516 8.867 3.69 9.378 3.69 c
+9.878 3.69 10.249 3.528 10.496 3.204 c
+10.749 2.881 10.882 2.404 10.892 1.779 c
+10.892 1.278 l
+8.819 1.278 l
+8.838 0.985 8.9 0.768 9.01 0.632 c
+9.129 0.492 9.309 0.426 9.555 0.426 c
+9.897 0.426 10.186 0.544 10.422 0.779 c
+10.834 0.147 l
+10.705 -0.029 10.517 -0.173 10.275 -0.279 c
+10.029 -0.386 9.764 -0.441 9.481 -0.441 c
+8.834 1.999 m
+9.864 1.999 l
+9.864 2.102 l
+9.864 2.337 9.823 2.514 9.746 2.631 c
+9.676 2.756 9.548 2.822 9.364 2.822 c
+9.187 2.822 9.055 2.753 8.967 2.616 c
+8.886 2.488 8.842 2.282 8.834 1.999 c
+12.921 0.426 m
+13.215 0.426 13.365 0.621 13.376 1.014 c
+14.346 1.014 l
+14.346 0.58 14.215 0.228 13.949 -0.044 c
+13.685 -0.309 13.347 -0.441 12.935 -0.441 c
+12.424 -0.441 12.031 -0.287 11.759 0.029 c
+11.495 0.353 11.356 0.823 11.348 1.44 c
+11.348 1.764 l
+11.348 2.389 11.481 2.866 11.745 3.19 c
+12.017 3.52 12.414 3.69 12.935 3.69 c
+13.365 3.69 13.708 3.549 13.964 3.278 c
+14.218 3.002 14.346 2.62 14.346 2.132 c
+13.376 2.132 l
+13.376 2.344 13.336 2.514 13.259 2.631 c
+13.189 2.756 13.072 2.822 12.906 2.822 c
+12.73 2.822 12.601 2.756 12.524 2.631 c
+12.443 2.502 12.399 2.253 12.391 1.881 c
+12.391 1.47 l
+12.391 1.147 12.406 0.919 12.436 0.794 c
+12.472 0.665 12.528 0.573 12.597 0.515 c
+12.675 0.455 12.781 0.426 12.921 0.426 c
+14.832 1.749 m
+14.832 2.356 14.971 2.83 15.258 3.175 c
+15.541 3.516 15.934 3.69 16.434 3.69 c
+16.941 3.69 17.338 3.516 17.625 3.175 c
+17.908 2.83 18.051 2.356 18.051 1.749 c
+18.051 1.484 l
+18.051 0.885 17.908 0.415 17.625 0.073 c
+17.338 -0.272 16.941 -0.441 16.434 -0.441 c
+15.923 -0.441 15.526 -0.272 15.244 0.073 c
+14.968 0.415 14.832 0.889 14.832 1.5 c
+h
+15.875 1.484 m
+15.875 0.779 16.059 0.426 16.434 0.426 c
+16.787 0.426 16.978 0.721 17.007 1.309 c
+17.007 1.749 l
+17.007 2.109 16.956 2.381 16.86 2.558 c
+16.761 2.734 16.617 2.822 16.434 2.822 c
+16.258 2.822 16.118 2.734 16.023 2.558 c
+15.923 2.381 15.875 2.109 15.875 1.749 c
+h
+19.947 1.103 m
+20.447 3.616 l
+21.534 3.616 l
+20.432 -0.368 l
+19.447 -0.368 l
+18.344 3.616 l
+19.433 3.616 l
+h
+23.578 -0.441 m
+23.048 -0.441 22.629 -0.287 22.328 0.029 c
+22.034 0.353 21.887 0.812 21.887 1.411 c
+21.887 1.72 l
+21.887 2.344 22.024 2.83 22.299 3.175 c
+22.571 3.516 22.964 3.69 23.475 3.69 c
+23.975 3.69 24.345 3.528 24.592 3.204 c
+24.846 2.881 24.978 2.404 24.989 1.779 c
+24.989 1.278 l
+22.916 1.278 l
+22.934 0.985 22.997 0.768 23.107 0.632 c
+23.225 0.492 23.405 0.426 23.651 0.426 c
+23.993 0.426 24.283 0.544 24.518 0.779 c
+24.93 0.147 l
+24.802 -0.029 24.614 -0.173 24.372 -0.279 c
+24.125 -0.386 23.861 -0.441 23.578 -0.441 c
+22.931 1.999 m
+23.96 1.999 l
+23.96 2.102 l
+23.96 2.337 23.919 2.514 23.842 2.631 c
+23.773 2.756 23.644 2.822 23.46 2.822 c
+23.283 2.822 23.152 2.753 23.063 2.616 c
+22.982 2.488 22.938 2.282 22.931 1.999 c
+27.532 2.602 m
+27.194 2.631 l
+26.907 2.631 26.716 2.506 26.62 2.263 c
+26.62 -0.368 l
+25.577 -0.368 l
+25.577 3.616 l
+26.547 3.616 l
+26.576 3.175 l
+26.741 3.516 26.973 3.69 27.267 3.69 c
+27.385 3.69 27.476 3.667 27.547 3.63 c
+h
+29.854 -0.368 m
+29.825 -0.309 29.795 -0.206 29.766 -0.058 c
+29.579 -0.316 29.328 -0.441 29.016 -0.441 c
+28.682 -0.441 28.403 -0.334 28.179 -0.118 c
+27.962 0.106 27.855 0.397 27.855 0.75 c
+27.855 1.161 27.987 1.477 28.252 1.706 c
+28.517 1.941 28.899 2.058 29.398 2.058 c
+29.722 2.058 l
+29.722 2.381 l
+29.722 2.558 29.685 2.679 29.619 2.749 c
+29.56 2.826 29.471 2.866 29.355 2.866 c
+29.097 2.866 28.972 2.712 28.972 2.411 c
+27.929 2.411 l
+27.929 2.782 28.064 3.087 28.34 3.322 c
+28.612 3.564 28.962 3.69 29.384 3.69 c
+29.825 3.69 30.163 3.572 30.398 3.337 c
+30.641 3.109 30.766 2.786 30.766 2.367 c
+30.766 0.5 l
+30.766 0.154 30.813 -0.114 30.913 -0.309 c
+30.913 -0.368 l
+h
+29.251 0.382 m
+29.358 0.382 29.45 0.401 29.531 0.441 c
+29.619 0.489 29.681 0.548 29.722 0.617 c
+29.722 1.44 l
+29.471 1.44 l
+29.296 1.44 29.153 1.382 29.045 1.264 c
+28.947 1.154 28.899 1.007 28.899 0.823 c
+28.899 0.53 29.016 0.382 29.251 0.382 c
+34.616 1.5 m
+34.616 0.852 34.514 0.368 34.308 0.044 c
+34.102 -0.279 33.779 -0.441 33.338 -0.441 c
+32.993 -0.441 32.713 -0.287 32.5 0.029 c
+32.471 -0.368 l
+31.515 -0.368 l
+31.515 5.277 l
+32.559 5.277 l
+32.559 3.293 l
+32.754 3.557 33.007 3.69 33.323 3.69 c
+33.764 3.69 34.088 3.528 34.294 3.204 c
+34.499 2.881 34.606 2.411 34.616 1.793 c
+h
+33.573 1.749 m
+33.573 2.168 33.533 2.448 33.456 2.587 c
+33.375 2.734 33.234 2.807 33.029 2.807 c
+32.812 2.807 32.654 2.708 32.559 2.514 c
+32.559 0.706 l
+32.647 0.518 32.808 0.426 33.043 0.426 c
+33.238 0.426 33.375 0.489 33.456 0.617 c
+33.533 0.742 33.573 1 33.573 1.382 c
+h
+36.336 -0.368 -1.043 5.644 re
+38.747 -0.441 m
+38.218 -0.441 37.799 -0.287 37.498 0.029 c
+37.203 0.353 37.057 0.812 37.057 1.411 c
+37.057 1.72 l
+37.057 2.344 37.193 2.83 37.468 3.175 c
+37.741 3.516 38.134 3.69 38.644 3.69 c
+39.144 3.69 39.515 3.528 39.761 3.204 c
+40.015 2.881 40.147 2.404 40.158 1.779 c
+40.158 1.278 l
+38.086 1.278 l
+38.104 0.985 38.167 0.768 38.277 0.632 c
+38.394 0.492 38.574 0.426 38.821 0.426 c
+39.162 0.426 39.453 0.544 39.688 0.779 c
+40.099 0.147 l
+39.971 -0.029 39.783 -0.173 39.541 -0.279 c
+39.295 -0.386 39.03 -0.441 38.747 -0.441 c
+38.1 1.999 m
+39.129 1.999 l
+39.129 2.102 l
+39.129 2.337 39.089 2.514 39.012 2.631 c
+38.942 2.756 38.813 2.822 38.63 2.822 c
+38.453 2.822 38.321 2.753 38.233 2.616 c
+38.152 2.488 38.107 2.282 38.1 1.999 c
+f
+Q
+q 1 0 0 1 519.5421 304.7979 cm
+0 0 m
+0 0.118 0.033 0.214 0.103 0.294 c
+0.169 0.372 0.272 0.412 0.412 0.412 c
+0.559 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.201 0.735 -0.278 c
+0.665 -0.357 0.559 -0.396 0.412 -0.396 c
+0.272 -0.396 0.169 -0.357 0.103 -0.278 c
+0.033 -0.201 0 -0.11 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 298.837 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 292.0029 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.264 13.582 -0.177 c
+h
+22.074 -1.323 m
+21.905 -1.323 21.755 -1.301 21.619 -1.264 c
+21.49 -1.216 21.376 -1.147 21.28 -1.058 c
+21.193 -0.97 21.122 -0.864 21.075 -0.735 c
+21.024 -0.599 21.001 -0.449 21.001 -0.279 c
+21.001 -0.073 21.035 0.095 21.105 0.235 c
+21.17 0.382 21.266 0.492 21.384 0.573 c
+21.509 0.661 21.652 0.723 21.81 0.764 c
+21.976 0.801 22.152 0.827 22.339 0.837 c
+23.059 0.852 l
+23.059 1.029 l
+23.059 1.147 23.048 1.249 23.03 1.338 c
+23.008 1.425 22.975 1.492 22.927 1.543 c
+22.886 1.602 22.839 1.639 22.78 1.66 c
+22.722 1.679 22.655 1.691 22.589 1.691 c
+22.519 1.691 22.456 1.679 22.398 1.66 c
+22.346 1.65 22.298 1.624 22.251 1.587 c
+22.211 1.558 22.177 1.506 22.148 1.44 c
+22.126 1.382 22.111 1.301 22.104 1.205 c
+21.163 1.249 l
+21.193 1.396 21.236 1.532 21.296 1.66 c
+21.361 1.786 21.457 1.896 21.575 1.984 c
+21.693 2.08 21.832 2.153 22.001 2.205 c
+22.177 2.252 22.383 2.278 22.618 2.278 c
+23.059 2.278 23.391 2.168 23.618 1.955 c
+23.853 1.749 23.971 1.44 23.971 1.029 c
+23.971 -0.235 l
+23.971 -0.456 l
+23.979 -0.515 23.993 -0.57 24.015 -0.617 c
+24.033 -0.658 24.062 -0.691 24.103 -0.721 c
+24.139 -0.742 24.191 -0.75 24.25 -0.75 c
+24.316 -0.75 24.386 -0.746 24.455 -0.735 c
+24.455 -1.22 l
+24.397 -1.231 24.342 -1.242 24.294 -1.249 c
+24.254 -1.261 24.214 -1.268 24.177 -1.279 c
+24.137 -1.286 24.092 -1.294 24.044 -1.294 c
+23.993 -1.301 23.934 -1.309 23.868 -1.309 c
+23.64 -1.309 23.474 -1.257 23.368 -1.147 c
+23.258 -1.029 23.196 -0.864 23.177 -0.647 c
+23.162 -0.647 l
+23.092 -0.757 23.023 -0.852 22.957 -0.941 c
+22.886 -1.022 22.809 -1.087 22.722 -1.147 c
+22.633 -1.205 22.534 -1.249 22.427 -1.279 c
+22.328 -1.309 22.211 -1.323 22.074 -1.323 c
+23.059 0.353 m
+22.633 0.338 l
+22.534 0.338 22.442 0.33 22.354 0.324 c
+22.273 0.312 22.207 0.287 22.148 0.249 c
+22.09 0.209 22.038 0.151 22.001 0.073 c
+21.961 0.004 21.942 -0.088 21.942 -0.206 c
+21.942 -0.375 21.976 -0.497 22.045 -0.574 c
+22.111 -0.654 22.211 -0.691 22.339 -0.691 c
+22.446 -0.691 22.545 -0.669 22.633 -0.617 c
+22.728 -0.57 22.809 -0.507 22.868 -0.426 c
+22.934 -0.349 22.986 -0.262 23.015 -0.162 c
+23.044 -0.056 23.059 0.058 23.059 0.176 c
+h
+27.355 -1.264 m
+27.344 -1.246 27.333 -1.216 27.326 -1.176 c
+27.326 -1.128 27.318 -1.081 27.312 -1.029 c
+27.312 -0.97 27.304 -0.912 27.297 -0.852 c
+27.297 -0.691 l
+27.179 -0.927 27.036 -1.095 26.87 -1.191 c
+26.701 -1.279 26.503 -1.323 26.267 -1.323 c
+26.069 -1.323 25.893 -1.279 25.739 -1.191 c
+25.581 -1.103 25.448 -0.981 25.342 -0.823 c
+25.242 -0.658 25.165 -0.467 25.106 -0.25 c
+25.055 -0.037 25.033 0.206 25.033 0.47 c
+25.033 0.735 25.055 0.974 25.106 1.19 c
+25.165 1.415 25.242 1.606 25.342 1.764 c
+25.448 1.918 25.581 2.043 25.739 2.131 c
+25.903 2.227 26.095 2.278 26.312 2.278 c
+26.408 2.278 26.503 2.263 26.591 2.234 c
+26.686 2.212 26.782 2.179 26.87 2.131 c
+26.959 2.08 27.036 2.017 27.106 1.94 c
+27.183 1.859 27.245 1.768 27.297 1.66 c
+27.297 1.749 l
+27.297 1.896 l
+27.297 2.057 l
+27.297 2.234 l
+27.297 3.513 l
+28.193 3.513 l
+28.193 -0.5 l
+28.193 -0.676 28.197 -0.834 28.208 -0.97 c
+28.215 -1.099 28.222 -1.199 28.222 -1.264 c
+h
+27.312 0.484 m
+27.312 0.72 27.285 0.912 27.237 1.058 c
+27.197 1.213 27.142 1.338 27.076 1.425 c
+27.017 1.514 26.947 1.573 26.87 1.602 c
+26.789 1.639 26.712 1.66 26.635 1.66 c
+26.535 1.66 26.444 1.635 26.356 1.587 c
+26.275 1.547 26.209 1.477 26.15 1.382 c
+26.098 1.282 26.055 1.161 26.018 1.014 c
+25.988 0.867 25.974 0.683 25.974 0.47 c
+25.974 0.077 26.025 -0.217 26.136 -0.412 c
+26.253 -0.611 26.414 -0.706 26.62 -0.706 c
+26.697 -0.706 26.774 -0.688 26.855 -0.647 c
+26.932 -0.611 27.006 -0.544 27.076 -0.456 c
+27.142 -0.368 27.197 -0.246 27.237 -0.088 c
+27.285 0.066 27.312 0.257 27.312 0.484 c
+31.416 -1.264 m
+31.405 -1.246 31.393 -1.216 31.387 -1.176 c
+31.387 -1.128 31.379 -1.081 31.372 -1.029 c
+31.372 -0.97 31.364 -0.912 31.357 -0.852 c
+31.357 -0.691 l
+31.239 -0.927 31.096 -1.095 30.931 -1.191 c
+30.762 -1.279 30.564 -1.323 30.328 -1.323 c
+30.13 -1.323 29.953 -1.279 29.799 -1.191 c
+29.641 -1.103 29.508 -0.981 29.402 -0.823 c
+29.303 -0.658 29.226 -0.467 29.167 -0.25 c
+29.116 -0.037 29.093 0.206 29.093 0.47 c
+29.093 0.735 29.116 0.974 29.167 1.19 c
+29.226 1.415 29.303 1.606 29.402 1.764 c
+29.508 1.918 29.641 2.043 29.799 2.131 c
+29.964 2.227 30.155 2.278 30.372 2.278 c
+30.468 2.278 30.564 2.263 30.651 2.234 c
+30.747 2.212 30.842 2.179 30.931 2.131 c
+31.019 2.08 31.096 2.017 31.166 1.94 c
+31.243 1.859 31.306 1.768 31.357 1.66 c
+31.357 1.749 l
+31.357 1.896 l
+31.357 2.057 l
+31.357 2.234 l
+31.357 3.513 l
+32.253 3.513 l
+32.253 -0.5 l
+32.253 -0.676 32.257 -0.834 32.268 -0.97 c
+32.276 -1.099 32.283 -1.199 32.283 -1.264 c
+h
+31.372 0.484 m
+31.372 0.72 31.346 0.912 31.298 1.058 c
+31.258 1.213 31.202 1.338 31.137 1.425 c
+31.077 1.514 31.008 1.573 30.931 1.602 c
+30.85 1.639 30.773 1.66 30.695 1.66 c
+30.597 1.66 30.504 1.635 30.416 1.587 c
+30.335 1.547 30.269 1.477 30.211 1.382 c
+30.159 1.282 30.115 1.161 30.078 1.014 c
+30.049 0.867 30.034 0.683 30.034 0.47 c
+30.034 0.077 30.086 -0.217 30.196 -0.412 c
+30.313 -0.611 30.475 -0.706 30.681 -0.706 c
+30.758 -0.706 30.836 -0.688 30.916 -0.647 c
+30.994 -0.611 31.067 -0.544 31.137 -0.456 c
+31.202 -0.368 31.258 -0.246 31.298 -0.088 c
+31.346 0.066 31.372 0.257 31.372 0.484 c
+38.115 -2.631 m
+38.115 3.513 l
+40.041 3.513 l
+40.041 2.896 l
+38.967 2.896 l
+38.967 -2.014 l
+40.041 -2.014 l
+40.041 -2.631 l
+h
+43.072 1.602 m
+43.072 -1.264 l
+42.175 -1.264 l
+42.175 1.602 l
+41.352 1.602 l
+41.352 2.219 l
+42.175 2.219 l
+42.175 2.484 l
+42.175 2.609 42.19 2.741 42.219 2.881 c
+42.256 3.017 42.326 3.135 42.425 3.233 c
+42.532 3.341 42.676 3.428 42.852 3.499 c
+43.028 3.564 43.252 3.601 43.528 3.601 c
+43.741 3.601 43.939 3.59 44.116 3.572 c
+44.292 3.549 44.442 3.532 44.571 3.513 c
+44.571 2.925 l
+44.442 2.944 44.299 2.958 44.145 2.969 c
+43.987 2.977 43.837 2.984 43.69 2.984 c
+43.561 2.984 43.458 2.969 43.381 2.94 c
+43.3 2.911 43.237 2.87 43.189 2.822 c
+43.139 2.77 43.106 2.708 43.087 2.631 c
+43.076 2.561 43.072 2.484 43.072 2.396 c
+43.072 2.219 l
+44.498 2.219 l
+44.498 1.602 l
+h
+47.588 -0.647 m
+48.72 -0.647 l
+48.72 -1.264 l
+45.413 -1.264 l
+45.413 -0.647 l
+46.677 -0.647 l
+46.677 1.602 l
+45.751 1.602 l
+45.751 2.219 l
+47.588 2.219 l
+h
+46.677 3.513 0.912 -0.676 re
+46.677 2.836 m
+51.649 -0.647 m
+52.781 -0.647 l
+52.781 -1.264 l
+49.473 -1.264 l
+49.473 -0.647 l
+50.738 -0.647 l
+50.738 2.896 l
+49.812 2.896 l
+49.812 3.513 l
+51.649 3.513 l
+h
+55.166 -1.323 m
+54.908 -1.323 54.68 -1.286 54.475 -1.22 c
+54.269 -1.143 54.093 -1.029 53.946 -0.882 c
+53.799 -0.728 53.681 -0.536 53.593 -0.309 c
+53.512 -0.085 53.475 0.18 53.475 0.484 c
+53.475 0.816 53.52 1.095 53.608 1.323 c
+53.703 1.558 53.832 1.741 53.99 1.881 c
+54.156 2.017 54.343 2.117 54.549 2.175 c
+54.754 2.242 54.964 2.278 55.181 2.278 c
+55.453 2.278 55.688 2.227 55.887 2.131 c
+56.092 2.043 56.257 1.911 56.386 1.735 c
+56.522 1.565 56.621 1.359 56.68 1.117 c
+56.746 0.881 56.783 0.617 56.783 0.324 c
+56.783 0.309 l
+54.416 0.309 l
+54.416 0.162 54.431 0.022 54.46 -0.103 c
+54.497 -0.231 54.553 -0.345 54.622 -0.441 c
+54.688 -0.53 54.773 -0.599 54.871 -0.647 c
+54.967 -0.698 55.081 -0.721 55.21 -0.721 c
+55.364 -0.721 55.504 -0.688 55.621 -0.617 c
+55.746 -0.551 55.835 -0.449 55.887 -0.309 c
+56.724 -0.382 l
+56.695 -0.482 56.639 -0.588 56.562 -0.706 c
+56.481 -0.816 56.379 -0.919 56.253 -1.014 c
+56.136 -1.103 55.982 -1.176 55.798 -1.235 c
+55.621 -1.294 55.409 -1.323 55.166 -1.323 c
+55.166 1.705 m
+55.077 1.705 54.989 1.691 54.902 1.66 c
+54.813 1.631 54.732 1.58 54.666 1.514 c
+54.596 1.444 54.537 1.356 54.49 1.249 c
+54.449 1.139 54.431 1.014 54.431 0.867 c
+55.901 0.867 l
+55.901 1.003 55.875 1.124 55.827 1.234 c
+55.787 1.341 55.731 1.429 55.665 1.5 c
+55.607 1.565 55.534 1.617 55.445 1.646 c
+55.357 1.683 55.261 1.705 55.166 1.705 c
+58.04 -2.631 m
+58.04 -2.014 l
+59.112 -2.014 l
+59.112 2.896 l
+58.04 2.896 l
+58.04 3.513 l
+59.965 3.513 l
+59.965 -2.631 l
+h
+f
+Q
+q 1 0 0 1 316.4525 277.2445 cm
+0 0 m
+-1.808 0 l
+-2.219 -1.396 l
+-2.91 -1.396 l
+-1.19 3.954 l
+-0.617 3.954 l
+1.118 -1.396 l
+0.426 -1.396 l
+h
+-1.631 0.588 m
+-0.176 0.588 l
+-0.897 3.013 l
+h
+1.617 0.779 m
+1.617 1.386 1.727 1.852 1.955 2.176 c
+2.19 2.5 2.517 2.66 2.94 2.66 c
+3.323 2.66 3.62 2.502 3.836 2.19 c
+3.836 4.248 l
+4.484 4.248 l
+4.484 -1.396 l
+3.896 -1.396 l
+3.851 -0.97 l
+3.645 -1.304 3.341 -1.469 2.94 -1.469 c
+2.529 -1.469 2.205 -1.315 1.97 -0.999 c
+1.735 -0.675 1.617 -0.22 1.617 0.368 c
+h
+2.264 0.397 m
+2.264 -0.044 2.326 -0.374 2.455 -0.588 c
+2.591 -0.793 2.812 -0.897 3.117 -0.897 c
+3.44 -0.897 3.678 -0.735 3.836 -0.411 c
+3.836 1.602 l
+3.668 1.914 3.429 2.072 3.117 2.072 c
+2.812 2.072 2.591 1.97 2.455 1.764 c
+2.326 1.559 2.264 1.235 2.264 0.794 c
+h
+5.351 0.779 m
+5.351 1.386 5.461 1.852 5.689 2.176 c
+5.924 2.5 6.251 2.66 6.674 2.66 c
+7.056 2.66 7.354 2.502 7.57 2.19 c
+7.57 4.248 l
+8.217 4.248 l
+8.217 -1.396 l
+7.629 -1.396 l
+7.585 -0.97 l
+7.379 -1.304 7.074 -1.469 6.674 -1.469 c
+6.262 -1.469 5.939 -1.315 5.704 -0.999 c
+5.469 -0.675 5.351 -0.22 5.351 0.368 c
+h
+5.997 0.397 m
+5.997 -0.044 6.06 -0.374 6.188 -0.588 c
+6.325 -0.793 6.545 -0.897 6.85 -0.897 c
+7.173 -0.897 7.412 -0.735 7.57 -0.411 c
+7.57 1.602 l
+7.402 1.914 7.163 2.072 6.85 2.072 c
+6.545 2.072 6.325 1.97 6.188 1.764 c
+6.06 1.559 5.997 1.235 5.997 0.794 c
+h
+12.979 -1.396 m
+12.939 -1.308 12.914 -1.161 12.906 -0.955 c
+12.671 -1.3 12.377 -1.469 12.025 -1.469 c
+11.66 -1.469 11.377 -1.374 11.171 -1.176 c
+10.973 -0.97 10.878 -0.683 10.878 -0.309 c
+10.878 0.092 11.013 0.412 11.289 0.647 c
+11.561 0.89 11.936 1.014 12.406 1.014 c
+12.891 1.014 l
+12.891 1.441 l
+12.891 1.676 12.836 1.841 12.73 1.941 c
+12.619 2.047 12.457 2.103 12.245 2.103 c
+12.046 2.103 11.884 2.043 11.759 1.926 c
+11.642 1.808 11.583 1.661 11.583 1.484 c
+10.936 1.484 l
+10.936 1.679 10.995 1.871 11.113 2.058 c
+11.238 2.242 11.4 2.389 11.597 2.5 c
+11.803 2.606 12.031 2.66 12.289 2.66 c
+12.69 2.66 12.994 2.558 13.2 2.352 c
+13.413 2.147 13.527 1.852 13.538 1.47 c
+13.538 -0.544 l
+13.538 -0.849 13.575 -1.113 13.656 -1.338 c
+13.656 -1.396 l
+h
+12.112 -0.881 m
+12.278 -0.881 12.428 -0.837 12.568 -0.75 c
+12.715 -0.661 12.821 -0.551 12.891 -0.411 c
+12.891 0.53 l
+12.524 0.53 l
+12.208 0.53 11.965 0.46 11.789 0.324 c
+11.612 0.195 11.524 0.008 11.524 -0.235 c
+11.524 -0.463 11.568 -0.628 11.657 -0.735 c
+11.745 -0.833 11.896 -0.881 12.112 -0.881 c
+16.434 -1.396 m
+16.434 2.058 l
+15.919 2.058 l
+15.919 2.587 l
+16.434 2.587 l
+16.434 2.955 l
+16.441 3.385 16.555 3.719 16.771 3.954 c
+16.996 4.197 17.309 4.322 17.712 4.322 c
+17.86 4.322 17.999 4.3 18.139 4.263 c
+18.286 4.223 18.437 4.168 18.595 4.102 c
+18.477 3.528 l
+18.242 3.653 17.999 3.719 17.756 3.719 c
+17.511 3.719 17.338 3.649 17.242 3.514 c
+17.143 3.385 17.095 3.19 17.095 2.926 c
+17.095 2.587 l
+17.742 2.587 l
+17.742 2.058 l
+17.095 2.058 l
+17.095 -1.396 l
+h
+18.903 -1.396 -0.646 3.983 re
+20.652 -1.396 -0.646 5.644 re
+23.092 -1.469 m
+22.593 -1.469 22.211 -1.323 21.946 -1.028 c
+21.681 -0.735 21.549 -0.301 21.549 0.279 c
+21.549 0.75 l
+21.549 1.345 21.674 1.812 21.931 2.147 c
+22.196 2.488 22.556 2.66 23.019 2.66 c
+23.478 2.66 23.82 2.506 24.048 2.205 c
+24.283 1.912 24.405 1.448 24.415 0.823 c
+24.415 0.397 l
+22.196 0.397 l
+22.196 0.309 l
+22.196 -0.124 22.273 -0.437 22.431 -0.632 c
+22.597 -0.819 22.828 -0.911 23.121 -0.911 c
+23.316 -0.911 23.489 -0.878 23.636 -0.808 c
+23.784 -0.731 23.919 -0.613 24.048 -0.455 c
+24.386 -0.867 l
+24.1 -1.271 23.669 -1.469 23.092 -1.469 c
+23.019 2.103 m
+22.743 2.103 22.541 2.007 22.416 1.823 c
+22.288 1.636 22.215 1.345 22.196 0.956 c
+23.769 0.956 l
+23.769 1.044 l
+23.746 1.426 23.68 1.694 23.563 1.852 c
+23.445 2.018 23.262 2.103 23.019 2.103 c
+27.767 3.543 m
+27.767 2.587 l
+28.37 2.587 l
+28.37 2.058 l
+27.767 2.058 l
+27.767 -0.411 l
+27.767 -0.569 27.788 -0.687 27.84 -0.764 c
+27.899 -0.845 27.987 -0.881 28.105 -0.881 c
+28.193 -0.881 28.281 -0.867 28.37 -0.837 c
+28.37 -1.396 l
+28.222 -1.444 28.068 -1.469 27.914 -1.469 c
+27.657 -1.469 27.462 -1.378 27.326 -1.19 c
+27.186 -1.007 27.12 -0.746 27.12 -0.411 c
+27.12 2.058 l
+26.518 2.058 l
+26.518 2.587 l
+27.12 2.587 l
+27.12 3.543 l
+h
+28.928 0.779 m
+28.928 1.357 29.064 1.812 29.34 2.147 c
+29.623 2.488 29.994 2.66 30.456 2.66 c
+30.916 2.66 31.283 2.492 31.559 2.161 c
+31.842 1.837 31.989 1.389 32 0.823 c
+32 0.397 l
+32 -0.172 31.857 -0.628 31.574 -0.97 c
+31.298 -1.304 30.931 -1.469 30.471 -1.469 c
+30.009 -1.469 29.637 -1.308 29.354 -0.985 c
+29.078 -0.654 28.935 -0.213 28.928 0.339 c
+h
+29.575 0.397 m
+29.575 -0.007 29.652 -0.323 29.81 -0.558 c
+29.976 -0.793 30.196 -0.911 30.471 -0.911 c
+31.037 -0.911 31.331 -0.5 31.353 0.324 c
+31.353 0.779 l
+31.353 1.18 31.269 1.5 31.104 1.735 c
+30.946 1.977 30.728 2.103 30.456 2.103 c
+30.192 2.103 29.976 1.977 29.81 1.735 c
+29.652 1.5 29.575 1.18 29.575 0.779 c
+h
+35.41 3.543 m
+35.41 2.587 l
+36.013 2.587 l
+36.013 2.058 l
+35.41 2.058 l
+35.41 -0.411 l
+35.41 -0.569 35.432 -0.687 35.484 -0.764 c
+35.543 -0.845 35.63 -0.881 35.748 -0.881 c
+35.837 -0.881 35.925 -0.867 36.013 -0.837 c
+36.013 -1.396 l
+35.866 -1.444 35.711 -1.469 35.557 -1.469 c
+35.3 -1.469 35.106 -1.378 34.969 -1.19 c
+34.83 -1.007 34.763 -0.746 34.763 -0.411 c
+34.763 2.058 l
+34.161 2.058 l
+34.161 2.587 l
+34.763 2.587 l
+34.763 3.543 l
+h
+37.424 2.176 m
+37.678 2.5 37.997 2.66 38.379 2.66 c
+39.085 2.66 39.441 2.19 39.453 1.249 c
+39.453 -1.396 l
+38.805 -1.396 l
+38.805 1.22 l
+38.805 1.532 38.751 1.754 38.644 1.881 c
+38.534 2.007 38.379 2.072 38.173 2.072 c
+38.015 2.072 37.868 2.018 37.733 1.912 c
+37.604 1.801 37.502 1.665 37.424 1.5 c
+37.424 -1.396 l
+36.777 -1.396 l
+36.777 4.248 l
+37.424 4.248 l
+h
+41.834 -1.469 m
+41.334 -1.469 40.952 -1.323 40.687 -1.028 c
+40.423 -0.735 40.29 -0.301 40.29 0.279 c
+40.29 0.75 l
+40.29 1.345 40.415 1.812 40.673 2.147 c
+40.937 2.488 41.297 2.66 41.76 2.66 c
+42.219 2.66 42.561 2.506 42.79 2.205 c
+43.025 1.912 43.146 1.448 43.156 0.823 c
+43.156 0.397 l
+40.937 0.397 l
+40.937 0.309 l
+40.937 -0.124 41.014 -0.437 41.172 -0.632 c
+41.338 -0.819 41.569 -0.911 41.863 -0.911 c
+42.058 -0.911 42.231 -0.878 42.377 -0.808 c
+42.524 -0.731 42.661 -0.613 42.79 -0.455 c
+43.127 -0.867 l
+42.84 -1.271 42.41 -1.469 41.834 -1.469 c
+41.76 2.103 m
+41.485 2.103 41.282 2.007 41.157 1.823 c
+41.029 1.636 40.955 1.345 40.937 0.956 c
+42.51 0.956 l
+42.51 1.044 l
+42.488 1.426 42.422 1.694 42.304 1.852 c
+42.186 2.018 42.003 2.103 41.76 2.103 c
+f
+Q
+q 1 0 0 1 363.7688 276.9219 cm
+0 0 m
+0 0.087 -0.044 0.165 -0.132 0.235 c
+-0.22 0.312 -0.407 0.415 -0.69 0.544 c
+-1.124 0.72 -1.422 0.9 -1.587 1.087 c
+-1.745 1.271 -1.822 1.502 -1.822 1.778 c
+-1.822 2.119 -1.701 2.403 -1.455 2.63 c
+-1.201 2.865 -0.864 2.983 -0.441 2.983 c
+-0.011 2.983 0.339 2.869 0.603 2.645 c
+0.867 2.418 1 2.117 1 1.734 c
+-0.044 1.734 l
+-0.044 2.057 -0.183 2.219 -0.455 2.219 c
+-0.565 2.219 -0.654 2.183 -0.72 2.117 c
+-0.79 2.046 -0.823 1.947 -0.823 1.822 c
+-0.823 1.734 -0.786 1.653 -0.706 1.587 c
+-0.628 1.529 -0.448 1.433 -0.162 1.308 c
+0.268 1.15 0.566 0.974 0.735 0.779 c
+0.912 0.591 1 0.341 1 0.029 c
+1 -0.324 0.867 -0.611 0.603 -0.823 c
+0.339 -1.04 -0.011 -1.147 -0.441 -1.147 c
+-0.735 -1.147 -0.995 -1.092 -1.22 -0.985 c
+-1.448 -0.867 -1.624 -0.706 -1.749 -0.5 c
+-1.866 -0.294 -1.926 -0.074 -1.926 0.161 c
+-0.941 0.161 l
+-0.941 -0.026 -0.904 -0.162 -0.823 -0.25 c
+-0.735 -0.339 -0.602 -0.383 -0.426 -0.383 c
+-0.143 -0.383 0 -0.258 0 0 c
+2.866 3.881 m
+2.866 2.91 l
+3.396 2.91 l
+3.396 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.011 2.885 -0.118 2.926 -0.177 c
+2.973 -0.235 3.057 -0.265 3.175 -0.265 c
+3.281 -0.265 3.366 -0.258 3.425 -0.235 c
+3.425 -1.044 l
+3.248 -1.11 3.057 -1.147 2.851 -1.147 c
+2.176 -1.147 1.83 -0.761 1.823 0.014 c
+1.823 2.117 l
+1.367 2.117 l
+1.367 2.91 l
+1.823 2.91 l
+1.823 3.881 l
+h
+5.85 -1.073 m
+5.821 -1.015 5.791 -0.912 5.762 -0.765 c
+5.575 -1.022 5.325 -1.147 5.012 -1.147 c
+4.678 -1.147 4.399 -1.04 4.175 -0.823 c
+3.958 -0.599 3.851 -0.31 3.851 0.043 c
+3.851 0.455 3.984 0.771 4.248 0.999 c
+4.513 1.234 4.895 1.352 5.395 1.352 c
+5.718 1.352 l
+5.718 1.675 l
+5.718 1.851 5.681 1.973 5.615 2.042 c
+5.556 2.119 5.469 2.16 5.351 2.16 c
+5.093 2.16 4.968 2.006 4.968 1.705 c
+3.925 1.705 l
+3.925 2.076 4.061 2.381 4.337 2.616 c
+4.609 2.859 4.958 2.983 5.38 2.983 c
+5.821 2.983 6.159 2.865 6.394 2.63 c
+6.637 2.403 6.762 2.08 6.762 1.66 c
+6.762 -0.206 l
+6.762 -0.551 6.809 -0.82 6.909 -1.015 c
+6.909 -1.073 l
+h
+5.247 -0.324 m
+5.355 -0.324 5.446 -0.306 5.527 -0.265 c
+5.615 -0.217 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.469 0.735 l
+5.292 0.735 5.149 0.675 5.042 0.558 c
+4.943 0.448 4.895 0.301 4.895 0.118 c
+4.895 -0.177 5.012 -0.324 5.247 -0.324 c
+7.379 1.043 m
+7.379 1.69 7.497 2.175 7.732 2.499 c
+7.967 2.822 8.298 2.983 8.731 2.983 c
+9.084 2.983 9.356 2.84 9.554 2.557 c
+9.598 2.91 l
+10.539 2.91 l
+10.539 -1.073 l
+10.539 -1.58 10.396 -1.97 10.113 -2.234 c
+9.826 -2.506 9.422 -2.646 8.893 -2.646 c
+8.665 -2.646 8.43 -2.602 8.187 -2.514 c
+7.952 -2.426 7.776 -2.311 7.659 -2.176 c
+8.011 -1.455 l
+8.106 -1.563 8.235 -1.646 8.393 -1.706 c
+8.548 -1.771 8.694 -1.808 8.835 -1.808 c
+9.07 -1.808 9.235 -1.75 9.334 -1.632 c
+9.44 -1.522 9.496 -1.345 9.496 -1.103 c
+9.496 -0.75 l
+9.297 -1.015 9.04 -1.147 8.717 -1.147 c
+8.294 -1.147 7.967 -0.985 7.732 -0.662 c
+7.504 -0.331 7.387 0.139 7.379 0.749 c
+h
+8.422 0.779 m
+8.422 0.404 8.47 0.135 8.57 -0.03 c
+8.665 -0.198 8.819 -0.279 9.025 -0.279 c
+9.239 -0.279 9.396 -0.202 9.496 -0.044 c
+9.496 1.851 l
+9.386 2.017 9.231 2.102 9.025 2.102 c
+8.819 2.102 8.665 2.017 8.57 1.851 c
+8.47 1.683 8.422 1.414 8.422 1.043 c
+h
+12.391 -1.073 -1.043 3.983 re
+11.304 3.939 m
+11.304 4.093 11.352 4.222 11.451 4.321 c
+11.557 4.428 11.693 4.483 11.863 4.483 c
+12.039 4.483 12.175 4.428 12.274 4.321 c
+12.38 4.222 12.436 4.093 12.436 3.939 c
+12.436 3.77 12.38 3.634 12.274 3.528 c
+12.175 3.428 12.039 3.38 11.863 3.38 c
+11.693 3.38 11.557 3.428 11.451 3.528 c
+11.352 3.634 11.304 3.77 11.304 3.939 c
+14.155 2.91 m
+14.184 2.513 l
+14.42 2.825 14.722 2.983 15.096 2.983 c
+15.78 2.983 16.133 2.502 16.154 1.543 c
+16.154 -1.073 l
+15.111 -1.073 l
+15.111 1.469 l
+15.111 1.693 15.074 1.855 15.008 1.955 c
+14.938 2.05 14.82 2.102 14.655 2.102 c
+14.468 2.102 14.321 2.006 14.215 1.822 c
+14.215 -1.073 l
+13.17 -1.073 l
+13.17 2.91 l
+h
+16.772 1.043 m
+16.772 1.69 16.889 2.175 17.124 2.499 c
+17.359 2.822 17.691 2.983 18.124 2.983 c
+18.477 2.983 18.749 2.84 18.947 2.557 c
+18.992 2.91 l
+19.932 2.91 l
+19.932 -1.073 l
+19.932 -1.58 19.788 -1.97 19.506 -2.234 c
+19.219 -2.506 18.815 -2.646 18.286 -2.646 c
+18.058 -2.646 17.822 -2.602 17.581 -2.514 c
+17.345 -2.426 17.169 -2.311 17.051 -2.176 c
+17.404 -1.455 l
+17.5 -1.563 17.628 -1.646 17.786 -1.706 c
+17.941 -1.771 18.088 -1.808 18.227 -1.808 c
+18.462 -1.808 18.628 -1.75 18.726 -1.632 c
+18.834 -1.522 18.888 -1.345 18.888 -1.103 c
+18.888 -0.75 l
+18.69 -1.015 18.433 -1.147 18.109 -1.147 c
+17.687 -1.147 17.359 -0.985 17.124 -0.662 c
+16.897 -0.331 16.779 0.139 16.772 0.749 c
+h
+17.816 0.779 m
+17.816 0.404 17.863 0.135 17.962 -0.03 c
+18.058 -0.198 18.213 -0.279 18.418 -0.279 c
+18.631 -0.279 18.789 -0.202 18.888 -0.044 c
+18.888 1.851 l
+18.778 2.017 18.624 2.102 18.418 2.102 c
+18.213 2.102 18.058 2.017 17.962 1.851 c
+17.863 1.683 17.816 1.414 17.816 1.043 c
+h
+f
+Q
+q 1 0 0 1 388.3315 275.8485 cm
+0 0 m
+-0.04 0.088 -0.067 0.235 -0.074 0.441 c
+-0.309 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.32 -0.073 -1.603 0.022 -1.808 0.22 c
+-2.007 0.426 -2.103 0.713 -2.103 1.087 c
+-2.103 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.044 2.41 -0.574 2.41 c
+-0.088 2.41 l
+-0.088 2.837 l
+-0.088 3.072 -0.144 3.237 -0.25 3.337 c
+-0.36 3.443 -0.522 3.499 -0.736 3.499 c
+-0.934 3.499 -1.096 3.439 -1.22 3.322 c
+-1.338 3.204 -1.397 3.057 -1.397 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.985 3.267 -1.867 3.454 c
+-1.742 3.638 -1.58 3.785 -1.382 3.896 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.014 3.954 0.22 3.748 c
+0.434 3.543 0.548 3.248 0.558 2.866 c
+0.558 0.852 l
+0.558 0.548 0.595 0.283 0.675 0.058 c
+0.675 0 l
+h
+-0.867 0.515 m
+-0.703 0.515 -0.551 0.559 -0.412 0.646 c
+-0.265 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.456 1.926 l
+-0.772 1.926 -1.015 1.856 -1.191 1.72 c
+-1.368 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.324 0.661 c
+-1.235 0.563 -1.085 0.515 -0.867 0.515 c
+3.204 3.366 m
+3.116 3.385 3.017 3.395 2.91 3.395 c
+2.576 3.395 2.341 3.212 2.204 2.851 c
+2.204 0 l
+1.558 0 l
+1.558 3.983 l
+2.19 3.983 l
+2.204 3.572 l
+2.381 3.896 2.624 4.056 2.94 4.056 c
+3.046 4.056 3.135 4.035 3.204 3.998 c
+h
+5.203 -0.073 m
+4.704 -0.073 4.321 0.073 4.056 0.368 c
+3.792 0.661 3.659 1.095 3.659 1.675 c
+3.659 2.146 l
+3.659 2.741 3.785 3.208 4.041 3.543 c
+4.307 3.884 4.667 4.056 5.13 4.056 c
+5.589 4.056 5.93 3.902 6.158 3.601 c
+6.393 3.308 6.515 2.844 6.526 2.219 c
+6.526 1.793 l
+4.307 1.793 l
+4.307 1.705 l
+4.307 1.272 4.384 0.959 4.542 0.764 c
+4.707 0.577 4.939 0.485 5.232 0.485 c
+5.427 0.485 5.6 0.518 5.747 0.588 c
+5.894 0.665 6.03 0.783 6.158 0.941 c
+6.497 0.529 l
+6.21 0.125 5.78 -0.073 5.203 -0.073 c
+5.13 3.499 m
+4.854 3.499 4.652 3.403 4.527 3.219 c
+4.398 3.032 4.325 2.741 4.307 2.352 c
+5.88 2.352 l
+5.88 2.44 l
+5.857 2.822 5.791 3.09 5.674 3.248 c
+5.556 3.414 5.373 3.499 5.13 3.499 c
+9.348 0 m
+9.308 0.088 9.282 0.235 9.275 0.441 c
+9.04 0.096 8.745 -0.073 8.392 -0.073 c
+8.029 -0.073 7.746 0.022 7.54 0.22 c
+7.342 0.426 7.247 0.713 7.247 1.087 c
+7.247 1.488 7.382 1.808 7.658 2.043 c
+7.93 2.286 8.305 2.41 8.775 2.41 c
+9.26 2.41 l
+9.26 2.837 l
+9.26 3.072 9.205 3.237 9.098 3.337 c
+8.988 3.443 8.826 3.499 8.613 3.499 c
+8.415 3.499 8.253 3.439 8.128 3.322 c
+8.01 3.204 7.952 3.057 7.952 2.881 c
+7.305 2.881 l
+7.305 3.075 7.364 3.267 7.482 3.454 c
+7.606 3.638 7.768 3.785 7.966 3.896 c
+8.172 4.002 8.4 4.056 8.658 4.056 c
+9.057 4.056 9.363 3.954 9.568 3.748 c
+9.782 3.543 9.896 3.248 9.907 2.866 c
+9.907 0.852 l
+9.907 0.548 9.944 0.283 10.025 0.058 c
+10.025 0 l
+h
+8.481 0.515 m
+8.646 0.515 8.797 0.559 8.937 0.646 c
+9.084 0.735 9.19 0.845 9.26 0.985 c
+9.26 1.926 l
+8.893 1.926 l
+8.577 1.926 8.334 1.856 8.157 1.72 c
+7.981 1.591 7.893 1.404 7.893 1.161 c
+7.893 0.933 7.937 0.768 8.025 0.661 c
+8.114 0.563 8.264 0.515 8.481 0.515 c
+10.95 0.353 m
+10.95 0.47 10.983 0.566 11.054 0.646 c
+11.12 0.723 11.222 0.764 11.362 0.764 c
+11.509 0.764 11.615 0.723 11.685 0.646 c
+11.762 0.566 11.803 0.47 11.803 0.353 c
+11.803 0.243 11.762 0.151 11.685 0.073 c
+11.615 -0.004 11.509 -0.044 11.362 -0.044 c
+11.222 -0.044 11.12 -0.004 11.054 0.073 c
+10.983 0.151 10.95 0.243 10.95 0.353 c
+17.888 5.35 m
+17.888 1.544 l
+17.888 1.043 17.741 0.646 17.447 0.353 c
+17.161 0.066 16.76 -0.073 16.242 -0.073 c
+15.713 -0.073 15.305 0.062 15.022 0.338 c
+14.746 0.621 14.611 1.022 14.611 1.544 c
+14.611 5.35 l
+15.272 5.35 l
+15.272 1.573 l
+15.272 1.209 15.345 0.941 15.492 0.764 c
+15.646 0.588 15.897 0.5 16.242 0.5 c
+16.583 0.5 16.83 0.588 16.977 0.764 c
+17.132 0.941 17.212 1.209 17.212 1.573 c
+17.212 5.35 l
+h
+20.784 1.014 m
+20.784 1.161 20.729 1.282 20.622 1.382 c
+20.512 1.477 20.306 1.595 20.005 1.735 c
+19.66 1.882 19.417 2.003 19.27 2.102 c
+19.123 2.209 19.013 2.326 18.947 2.454 c
+18.877 2.58 18.844 2.738 18.844 2.925 c
+18.844 3.248 18.962 3.516 19.197 3.734 c
+19.432 3.946 19.733 4.056 20.108 4.056 c
+20.49 4.056 20.799 3.943 21.034 3.719 c
+21.269 3.491 21.387 3.204 21.387 2.851 c
+20.74 2.851 l
+20.74 3.028 20.681 3.179 20.564 3.308 c
+20.446 3.432 20.292 3.499 20.108 3.499 c
+19.91 3.499 19.758 3.443 19.652 3.337 c
+19.542 3.237 19.49 3.105 19.49 2.94 c
+19.49 2.811 19.527 2.705 19.608 2.616 c
+19.685 2.535 19.876 2.433 20.182 2.308 c
+20.66 2.12 20.99 1.933 21.167 1.749 c
+21.343 1.573 21.431 1.345 21.431 1.073 c
+21.431 0.721 21.306 0.441 21.063 0.235 c
+20.828 0.029 20.512 -0.073 20.122 -0.073 c
+19.7 -0.073 19.362 0.044 19.108 0.279 c
+18.851 0.522 18.726 0.827 18.726 1.191 c
+19.373 1.191 l
+19.38 0.962 19.45 0.786 19.579 0.661 c
+19.704 0.544 19.887 0.485 20.122 0.485 c
+20.336 0.485 20.498 0.532 20.608 0.632 c
+20.725 0.727 20.784 0.856 20.784 1.014 c
+23.694 -0.073 m
+23.195 -0.073 22.813 0.073 22.548 0.368 c
+22.283 0.661 22.151 1.095 22.151 1.675 c
+22.151 2.146 l
+22.151 2.741 22.276 3.208 22.534 3.543 c
+22.798 3.884 23.158 4.056 23.621 4.056 c
+24.08 4.056 24.423 3.902 24.65 3.601 c
+24.885 3.308 25.007 2.844 25.017 2.219 c
+25.017 1.793 l
+22.798 1.793 l
+22.798 1.705 l
+22.798 1.272 22.875 0.959 23.033 0.764 c
+23.199 0.577 23.43 0.485 23.724 0.485 c
+23.918 0.485 24.091 0.518 24.238 0.588 c
+24.385 0.665 24.521 0.783 24.65 0.941 c
+24.988 0.529 l
+24.701 0.125 24.271 -0.073 23.694 -0.073 c
+23.621 3.499 m
+23.345 3.499 23.143 3.403 23.018 3.219 c
+22.89 3.032 22.816 2.741 22.798 2.352 c
+24.371 2.352 l
+24.371 2.44 l
+24.348 2.822 24.282 3.09 24.165 3.248 c
+24.047 3.414 23.864 3.499 23.621 3.499 c
+f
+Q
+q 1 0 0 1 415.8331 276.3772 cm
+0 0 m
+0 0.166 0.052 0.302 0.162 0.412 c
+0.268 0.518 0.415 0.574 0.603 0.574 c
+0.768 0.574 0.912 0.518 1.029 0.412 c
+1.147 0.302 1.205 0.166 1.205 0 c
+1.205 -0.168 1.147 -0.305 1.029 -0.411 c
+0.912 -0.521 0.768 -0.573 0.603 -0.573 c
+0.426 -0.573 0.279 -0.521 0.162 -0.411 c
+0.052 -0.305 0 -0.168 0 0 c
+f
+Q
+420.463 275.848 -0.647 3.983 re
+420.508 280.876 m
+420.508 280.766 420.478 280.674 420.419 280.596 c
+420.36 280.527 420.265 280.493 420.14 280.493 c
+420.022 280.493 419.926 280.527 419.86 280.596 c
+419.802 280.674 419.772 280.766 419.772 280.876 c
+419.772 280.993 419.802 281.085 419.86 281.155 c
+419.926 281.232 420.022 281.273 420.14 281.273 c
+420.265 281.273 420.36 281.232 420.419 281.155 c
+420.478 281.074 420.508 280.982 420.508 280.876 c
+422.095 279.832 m
+422.11 279.391 l
+422.363 279.733 422.686 279.905 423.08 279.905 c
+423.785 279.905 424.142 279.435 424.153 278.494 c
+424.153 275.848 l
+423.506 275.848 l
+423.506 278.465 l
+423.506 278.777 423.451 278.998 423.344 279.126 c
+423.234 279.251 423.08 279.317 422.874 279.317 c
+422.716 279.317 422.569 279.262 422.433 279.156 c
+422.304 279.045 422.201 278.91 422.124 278.744 c
+422.124 275.848 l
+421.478 275.848 l
+421.478 279.832 l
+h
+427.063 276.863 m
+427.063 277.009 427.008 277.131 426.902 277.23 c
+426.791 277.325 426.586 277.443 426.284 277.583 c
+425.939 277.73 425.696 277.851 425.549 277.95 c
+425.402 278.057 425.292 278.175 425.225 278.303 c
+425.156 278.428 425.123 278.586 425.123 278.773 c
+425.123 279.097 425.24 279.365 425.476 279.582 c
+425.711 279.795 426.012 279.905 426.387 279.905 c
+426.769 279.905 427.078 279.791 427.313 279.567 c
+427.548 279.34 427.666 279.053 427.666 278.7 c
+427.019 278.7 l
+427.019 278.877 426.96 279.027 426.843 279.156 c
+426.725 279.28 426.571 279.347 426.387 279.347 c
+426.189 279.347 426.038 279.292 425.931 279.185 c
+425.821 279.086 425.769 278.954 425.769 278.788 c
+425.769 278.659 425.806 278.553 425.887 278.465 c
+425.964 278.384 426.156 278.281 426.461 278.156 c
+426.939 277.969 427.269 277.782 427.446 277.597 c
+427.621 277.421 427.71 277.194 427.71 276.922 c
+427.71 276.569 427.585 276.29 427.342 276.084 c
+427.107 275.878 426.791 275.775 426.401 275.775 c
+425.979 275.775 425.641 275.893 425.387 276.128 c
+425.13 276.371 425.005 276.675 425.005 277.039 c
+425.652 277.039 l
+425.659 276.811 425.729 276.635 425.858 276.51 c
+425.983 276.392 426.166 276.334 426.401 276.334 c
+426.615 276.334 426.777 276.381 426.887 276.481 c
+427.004 276.576 427.063 276.705 427.063 276.863 c
+429.4 280.787 m
+429.4 279.832 l
+430.003 279.832 l
+430.003 279.303 l
+429.4 279.303 l
+429.4 276.833 l
+429.4 276.675 429.422 276.558 429.474 276.481 c
+429.532 276.4 429.621 276.363 429.738 276.363 c
+429.827 276.363 429.915 276.377 430.003 276.407 c
+430.003 275.848 l
+429.856 275.801 429.701 275.775 429.547 275.775 c
+429.29 275.775 429.096 275.866 428.959 276.055 c
+428.82 276.238 428.753 276.499 428.753 276.833 c
+428.753 279.303 l
+428.151 279.303 l
+428.151 279.832 l
+428.753 279.832 l
+428.753 280.787 l
+h
+432.193 275.775 m
+431.693 275.775 431.311 275.922 431.047 276.216 c
+430.782 276.51 430.65 276.944 430.65 277.524 c
+430.65 277.994 l
+430.65 278.59 430.775 279.056 431.032 279.391 c
+431.296 279.733 431.656 279.905 432.119 279.905 c
+432.579 279.905 432.921 279.751 433.148 279.45 c
+433.384 279.156 433.505 278.692 433.516 278.068 c
+433.516 277.642 l
+431.296 277.642 l
+431.296 277.553 l
+431.296 277.12 431.373 276.807 431.531 276.612 c
+431.697 276.425 431.928 276.334 432.223 276.334 c
+432.417 276.334 432.59 276.367 432.737 276.436 c
+432.884 276.514 433.019 276.631 433.148 276.789 c
+433.487 276.377 l
+433.2 275.974 432.77 275.775 432.193 275.775 c
+432.119 279.347 m
+431.844 279.347 431.642 279.251 431.517 279.068 c
+431.388 278.88 431.315 278.59 431.296 278.2 c
+432.869 278.2 l
+432.869 278.289 l
+432.847 278.671 432.781 278.939 432.664 279.097 c
+432.546 279.262 432.362 279.347 432.119 279.347 c
+436.338 275.848 m
+436.298 275.937 436.273 276.084 436.265 276.29 c
+436.03 275.944 435.735 275.775 435.383 275.775 c
+435.019 275.775 434.736 275.87 434.53 276.069 c
+434.332 276.275 434.236 276.562 434.236 276.936 c
+434.236 277.337 434.372 277.657 434.648 277.892 c
+434.92 278.134 435.294 278.259 435.765 278.259 c
+436.25 278.259 l
+436.25 278.686 l
+436.25 278.921 436.194 279.086 436.088 279.185 c
+435.978 279.292 435.816 279.347 435.604 279.347 c
+435.405 279.347 435.243 279.288 435.118 279.17 c
+435.001 279.053 434.941 278.906 434.941 278.729 c
+434.295 278.729 l
+434.295 278.924 434.353 279.116 434.471 279.303 c
+434.596 279.486 434.758 279.633 434.956 279.744 c
+435.162 279.85 435.39 279.905 435.647 279.905 c
+436.048 279.905 436.353 279.802 436.559 279.596 c
+436.772 279.391 436.886 279.097 436.897 278.715 c
+436.897 276.701 l
+436.897 276.396 436.934 276.132 437.015 275.907 c
+437.015 275.848 l
+h
+435.471 276.363 m
+435.637 276.363 435.787 276.407 435.926 276.495 c
+436.074 276.583 436.18 276.693 436.25 276.833 c
+436.25 277.774 l
+435.882 277.774 l
+435.567 277.774 435.324 277.705 435.147 277.568 c
+434.971 277.439 434.883 277.252 434.883 277.009 c
+434.883 276.782 434.927 276.616 435.016 276.51 c
+435.103 276.411 435.254 276.363 435.471 276.363 c
+437.764 278.023 m
+437.764 278.63 437.875 279.097 438.102 279.42 c
+438.337 279.744 438.664 279.905 439.087 279.905 c
+439.469 279.905 439.766 279.747 439.984 279.435 c
+439.984 281.493 l
+440.63 281.493 l
+440.63 275.848 l
+440.042 275.848 l
+439.998 276.275 l
+439.793 275.941 439.487 275.775 439.087 275.775 c
+438.675 275.775 438.352 275.929 438.116 276.245 c
+437.881 276.569 437.764 277.024 437.764 277.612 c
+h
+438.411 277.642 m
+438.411 277.2 438.473 276.87 438.602 276.657 c
+438.738 276.452 438.958 276.348 439.263 276.348 c
+439.587 276.348 439.826 276.51 439.984 276.833 c
+439.984 278.847 l
+439.814 279.159 439.575 279.317 439.263 279.317 c
+438.958 279.317 438.738 279.214 438.602 279.008 c
+438.473 278.803 438.411 278.48 438.411 278.039 c
+h
+443.217 278.023 m
+443.217 278.601 443.353 279.056 443.629 279.391 c
+443.912 279.733 444.283 279.905 444.746 279.905 c
+445.206 279.905 445.573 279.737 445.848 279.405 c
+446.131 279.082 446.278 278.634 446.29 278.068 c
+446.29 277.642 l
+446.29 277.072 446.147 276.616 445.863 276.275 c
+445.588 275.941 445.22 275.775 444.761 275.775 c
+444.298 275.775 443.926 275.937 443.643 276.26 c
+443.368 276.591 443.225 277.032 443.217 277.583 c
+h
+443.864 277.642 m
+443.864 277.238 443.941 276.922 444.099 276.687 c
+444.265 276.452 444.485 276.334 444.761 276.334 c
+445.326 276.334 445.621 276.745 445.642 277.568 c
+445.642 278.023 l
+445.642 278.424 445.559 278.744 445.393 278.979 c
+445.235 279.222 445.018 279.347 444.746 279.347 c
+444.481 279.347 444.265 279.222 444.099 278.979 c
+443.941 278.744 443.864 278.424 443.864 278.023 c
+h
+447.421 275.848 m
+447.421 279.303 l
+446.893 279.303 l
+446.893 279.832 l
+447.421 279.832 l
+447.421 280.288 l
+447.421 280.688 447.517 281.001 447.716 281.229 c
+447.921 281.452 448.2 281.566 448.553 281.566 c
+448.689 281.566 448.821 281.545 448.95 281.508 c
+448.921 280.963 l
+448.821 280.982 448.722 280.993 448.626 280.993 c
+448.252 280.993 448.068 280.728 448.068 280.199 c
+448.068 279.832 l
+448.744 279.832 l
+448.744 279.303 l
+448.068 279.303 l
+448.068 275.848 l
+h
+451.522 275.848 m
+451.522 279.303 l
+450.993 279.303 l
+450.993 279.832 l
+451.522 279.832 l
+451.522 280.288 l
+451.522 280.688 451.618 281.001 451.816 281.229 c
+452.022 281.452 452.302 281.566 452.655 281.566 c
+452.79 281.566 452.923 281.545 453.051 281.508 c
+453.021 280.963 l
+452.923 280.982 452.823 280.993 452.728 280.993 c
+452.353 280.993 452.169 280.728 452.169 280.199 c
+452.169 279.832 l
+452.846 279.832 l
+452.846 279.303 l
+452.169 279.303 l
+452.169 275.848 l
+h
+455.638 276.201 m
+455.421 275.914 455.109 275.775 454.697 275.775 c
+454.334 275.775 454.058 275.896 453.874 276.142 c
+453.698 276.396 453.602 276.76 453.595 277.23 c
+453.595 279.832 l
+454.242 279.832 l
+454.242 277.289 l
+454.242 276.66 454.425 276.348 454.8 276.348 c
+455.201 276.348 455.477 276.525 455.624 276.878 c
+455.624 279.832 l
+456.27 279.832 l
+456.27 275.848 l
+455.653 275.848 l
+h
+457.96 275.848 -0.646 5.644 re
+459.68 275.848 -0.646 5.644 re
+462.591 275.848 m
+462.591 279.303 l
+462.076 279.303 l
+462.076 279.832 l
+462.591 279.832 l
+462.591 280.199 l
+462.598 280.629 462.712 280.963 462.928 281.198 c
+463.153 281.441 463.466 281.566 463.869 281.566 c
+464.017 281.566 464.156 281.545 464.296 281.508 c
+464.443 281.468 464.594 281.412 464.752 281.346 c
+464.634 280.772 l
+464.399 280.897 464.156 280.963 463.913 280.963 c
+463.668 280.963 463.495 280.894 463.399 280.758 c
+463.3 280.629 463.252 280.435 463.252 280.17 c
+463.252 279.832 l
+463.899 279.832 l
+463.899 279.303 l
+463.252 279.303 l
+463.252 275.848 l
+h
+465.06 275.848 -0.646 3.983 re
+466.809 275.848 -0.646 5.644 re
+469.249 275.775 m
+468.75 275.775 468.368 275.922 468.102 276.216 c
+467.838 276.51 467.706 276.944 467.706 277.524 c
+467.706 277.994 l
+467.706 278.59 467.831 279.056 468.088 279.391 c
+468.353 279.733 468.713 279.905 469.176 279.905 c
+469.635 279.905 469.977 279.751 470.205 279.45 c
+470.44 279.156 470.562 278.692 470.572 278.068 c
+470.572 277.642 l
+468.353 277.642 l
+468.353 277.553 l
+468.353 277.12 468.43 276.807 468.588 276.612 c
+468.753 276.425 468.985 276.334 469.278 276.334 c
+469.473 276.334 469.646 276.367 469.793 276.436 c
+469.941 276.514 470.076 276.631 470.205 276.789 c
+470.543 276.377 l
+470.256 275.974 469.826 275.775 469.249 275.775 c
+469.176 279.347 m
+468.9 279.347 468.698 279.251 468.573 279.068 c
+468.445 278.88 468.371 278.59 468.353 278.2 c
+469.926 278.2 l
+469.926 278.289 l
+469.904 278.671 469.837 278.939 469.72 279.097 c
+469.602 279.262 469.419 279.347 469.176 279.347 c
+475.952 277.642 m
+475.952 277.013 475.834 276.543 475.599 276.23 c
+475.372 275.926 475.055 275.775 474.644 275.775 c
+474.24 275.775 473.931 275.926 473.718 276.23 c
+473.718 274.32 l
+473.071 274.32 l
+473.071 279.832 l
+473.659 279.832 l
+473.704 279.391 l
+473.916 279.733 474.225 279.905 474.629 279.905 c
+475.07 279.905 475.397 279.751 475.614 279.45 c
+475.827 279.145 475.941 278.689 475.952 278.083 c
+h
+475.306 278.023 m
+475.306 278.465 475.235 278.788 475.1 278.994 c
+474.96 279.207 474.739 279.317 474.438 279.317 c
+474.122 279.317 473.883 279.163 473.718 278.862 c
+473.718 276.789 l
+473.883 276.484 474.122 276.334 474.438 276.334 c
+474.732 276.334 474.945 276.436 475.085 276.642 c
+475.221 276.855 475.294 277.186 475.306 277.627 c
+h
+478.833 275.848 m
+478.793 275.937 478.767 276.084 478.76 276.29 c
+478.525 275.944 478.23 275.775 477.878 275.775 c
+477.514 275.775 477.231 275.87 477.025 276.069 c
+476.827 276.275 476.731 276.562 476.731 276.936 c
+476.731 277.337 476.867 277.657 477.143 277.892 c
+477.415 278.134 477.789 278.259 478.26 278.259 c
+478.745 278.259 l
+478.745 278.686 l
+478.745 278.921 478.69 279.086 478.583 279.185 c
+478.473 279.292 478.311 279.347 478.098 279.347 c
+477.9 279.347 477.738 279.288 477.613 279.17 c
+477.496 279.053 477.436 278.906 477.436 278.729 c
+476.79 278.729 l
+476.79 278.924 476.849 279.116 476.966 279.303 c
+477.091 279.486 477.253 279.633 477.452 279.744 c
+477.658 279.85 477.885 279.905 478.142 279.905 c
+478.543 279.905 478.848 279.802 479.054 279.596 c
+479.267 279.391 479.381 279.097 479.391 278.715 c
+479.391 276.701 l
+479.391 276.396 479.428 276.132 479.509 275.907 c
+479.509 275.848 l
+h
+477.966 276.363 m
+478.132 276.363 478.282 276.407 478.421 276.495 c
+478.568 276.583 478.675 276.693 478.745 276.833 c
+478.745 277.774 l
+478.377 277.774 l
+478.061 277.774 477.819 277.705 477.642 277.568 c
+477.467 277.439 477.378 277.252 477.378 277.009 c
+477.378 276.782 477.422 276.616 477.51 276.51 c
+477.598 276.411 477.749 276.363 477.966 276.363 c
+481.244 280.787 m
+481.244 279.832 l
+481.847 279.832 l
+481.847 279.303 l
+481.244 279.303 l
+481.244 276.833 l
+481.244 276.675 481.266 276.558 481.317 276.481 c
+481.376 276.4 481.465 276.363 481.582 276.363 c
+481.67 276.363 481.758 276.377 481.847 276.407 c
+481.847 275.848 l
+481.7 275.801 481.545 275.775 481.39 275.775 c
+481.134 275.775 480.939 275.866 480.802 276.055 c
+480.663 276.238 480.597 276.499 480.597 276.833 c
+480.597 279.303 l
+479.994 279.303 l
+479.994 279.832 l
+480.597 279.832 l
+480.597 280.787 l
+h
+483.258 279.42 m
+483.511 279.744 483.831 279.905 484.213 279.905 c
+484.918 279.905 485.275 279.435 485.286 278.494 c
+485.286 275.848 l
+484.64 275.848 l
+484.64 278.465 l
+484.64 278.777 484.584 278.998 484.478 279.126 c
+484.367 279.251 484.213 279.317 484.008 279.317 c
+483.849 279.317 483.702 279.262 483.566 279.156 c
+483.437 279.045 483.335 278.91 483.258 278.744 c
+483.258 275.848 l
+482.611 275.848 l
+482.611 281.493 l
+483.258 281.493 l
+h
+486.256 274.775 m
+485.859 275.04 l
+486.094 275.363 486.215 275.698 486.227 276.039 c
+486.227 276.657 l
+486.888 276.657 l
+486.888 276.128 l
+486.888 275.87 486.822 275.625 486.697 275.378 c
+486.579 275.135 486.433 274.933 486.256 274.775 c
+490.298 280.787 m
+490.298 279.832 l
+490.901 279.832 l
+490.901 279.303 l
+490.298 279.303 l
+490.298 276.833 l
+490.298 276.675 490.321 276.558 490.372 276.481 c
+490.431 276.4 490.519 276.363 490.637 276.363 c
+490.724 276.363 490.813 276.377 490.901 276.407 c
+490.901 275.848 l
+490.755 275.801 490.6 275.775 490.445 275.775 c
+490.188 275.775 489.993 275.866 489.857 276.055 c
+489.718 276.238 489.652 276.499 489.652 276.833 c
+489.652 279.303 l
+489.049 279.303 l
+489.049 279.832 l
+489.652 279.832 l
+489.652 280.787 l
+h
+491.46 278.023 m
+491.46 278.601 491.596 279.056 491.871 279.391 c
+492.154 279.733 492.525 279.905 492.989 279.905 c
+493.448 279.905 493.815 279.737 494.09 279.405 c
+494.374 279.082 494.52 278.634 494.532 278.068 c
+494.532 277.642 l
+494.532 277.072 494.389 276.616 494.105 276.275 c
+493.83 275.941 493.462 275.775 493.003 275.775 c
+492.54 275.775 492.168 275.937 491.886 276.26 c
+491.611 276.591 491.467 277.032 491.46 277.583 c
+h
+492.106 277.642 m
+492.106 277.238 492.183 276.922 492.342 276.687 c
+492.507 276.452 492.727 276.334 493.003 276.334 c
+493.569 276.334 493.863 276.745 493.885 277.568 c
+493.885 278.023 l
+493.885 278.424 493.801 278.744 493.635 278.979 c
+493.477 279.222 493.261 279.347 492.989 279.347 c
+492.723 279.347 492.507 279.222 492.342 278.979 c
+492.183 278.744 492.106 278.424 492.106 278.023 c
+h
+499.133 275.848 m
+499.092 275.937 499.067 276.084 499.059 276.29 c
+498.824 275.944 498.53 275.775 498.177 275.775 c
+497.813 275.775 497.531 275.87 497.325 276.069 c
+497.126 276.275 497.03 276.562 497.03 276.936 c
+497.03 277.337 497.167 277.657 497.442 277.892 c
+497.714 278.134 498.089 278.259 498.559 278.259 c
+499.044 278.259 l
+499.044 278.686 l
+499.044 278.921 498.989 279.086 498.883 279.185 c
+498.772 279.292 498.611 279.347 498.398 279.347 c
+498.2 279.347 498.038 279.288 497.913 279.17 c
+497.795 279.053 497.736 278.906 497.736 278.729 c
+497.089 278.729 l
+497.089 278.924 497.148 279.116 497.265 279.303 c
+497.391 279.486 497.552 279.633 497.751 279.744 c
+497.957 279.85 498.184 279.905 498.441 279.905 c
+498.842 279.905 499.147 279.802 499.353 279.596 c
+499.566 279.391 499.68 279.097 499.692 278.715 c
+499.692 276.701 l
+499.692 276.396 499.728 276.132 499.809 275.907 c
+499.809 275.848 l
+h
+498.265 276.363 m
+498.431 276.363 498.581 276.407 498.721 276.495 c
+498.868 276.583 498.975 276.693 499.044 276.833 c
+499.044 277.774 l
+498.676 277.774 l
+498.361 277.774 498.119 277.705 497.942 277.568 c
+497.766 277.439 497.677 277.252 497.677 277.009 c
+497.677 276.782 497.722 276.616 497.81 276.51 c
+497.898 276.411 498.048 276.363 498.265 276.363 c
+500.558 278.023 m
+500.558 278.63 500.669 279.097 500.897 279.42 c
+501.132 279.744 501.458 279.905 501.882 279.905 c
+502.264 279.905 502.561 279.747 502.778 279.435 c
+502.778 281.493 l
+503.424 281.493 l
+503.424 275.848 l
+502.836 275.848 l
+502.792 276.275 l
+502.587 275.941 502.281 275.775 501.882 275.775 c
+501.47 275.775 501.146 275.929 500.911 276.245 c
+500.676 276.569 500.558 277.024 500.558 277.612 c
+h
+501.205 277.642 m
+501.205 277.2 501.267 276.87 501.396 276.657 c
+501.533 276.452 501.753 276.348 502.057 276.348 c
+502.381 276.348 502.62 276.51 502.778 276.833 c
+502.778 278.847 l
+502.609 279.159 502.37 279.317 502.057 279.317 c
+501.753 279.317 501.533 279.214 501.396 279.008 c
+501.267 278.803 501.205 278.48 501.205 278.039 c
+h
+504.292 278.023 m
+504.292 278.63 504.402 279.097 504.63 279.42 c
+504.866 279.744 505.192 279.905 505.614 279.905 c
+505.997 279.905 506.295 279.747 506.512 279.435 c
+506.512 281.493 l
+507.158 281.493 l
+507.158 275.848 l
+506.57 275.848 l
+506.526 276.275 l
+506.32 275.941 506.015 275.775 505.614 275.775 c
+505.203 275.775 504.88 275.929 504.645 276.245 c
+504.409 276.569 504.292 277.024 504.292 277.612 c
+h
+504.939 277.642 m
+504.939 277.2 505.001 276.87 505.13 276.657 c
+505.265 276.452 505.487 276.348 505.791 276.348 c
+506.115 276.348 506.354 276.51 506.512 276.833 c
+506.512 278.847 l
+506.343 279.159 506.104 279.317 505.791 279.317 c
+505.487 279.317 505.265 279.214 505.13 279.008 c
+505.001 278.803 504.939 278.48 504.939 278.039 c
+h
+511.921 275.848 m
+511.881 275.937 511.854 276.084 511.847 276.29 c
+511.612 275.944 511.318 275.775 510.965 275.775 c
+510.601 275.775 510.318 275.87 510.113 276.069 c
+509.915 276.275 509.819 276.562 509.819 276.936 c
+509.819 277.337 509.955 277.657 510.231 277.892 c
+510.503 278.134 510.877 278.259 511.347 278.259 c
+511.833 278.259 l
+511.833 278.686 l
+511.833 278.921 511.777 279.086 511.671 279.185 c
+511.561 279.292 511.399 279.347 511.185 279.347 c
+510.987 279.347 510.826 279.288 510.701 279.17 c
+510.583 279.053 510.524 278.906 510.524 278.729 c
+509.878 278.729 l
+509.878 278.924 509.936 279.116 510.054 279.303 c
+510.179 279.486 510.341 279.633 510.539 279.744 c
+510.745 279.85 510.973 279.905 511.23 279.905 c
+511.63 279.905 511.935 279.802 512.141 279.596 c
+512.354 279.391 512.469 279.097 512.479 278.715 c
+512.479 276.701 l
+512.479 276.396 512.516 276.132 512.597 275.907 c
+512.597 275.848 l
+h
+511.054 276.363 m
+511.218 276.363 511.37 276.407 511.509 276.495 c
+511.656 276.583 511.763 276.693 511.833 276.833 c
+511.833 277.774 l
+511.465 277.774 l
+511.149 277.774 510.906 277.705 510.73 277.568 c
+510.553 277.439 510.466 277.252 510.466 277.009 c
+510.466 276.782 510.51 276.616 510.598 276.51 c
+510.686 276.411 510.836 276.363 511.054 276.363 c
+514.185 275.848 -0.647 5.644 re
+515.904 275.848 -0.647 5.644 re
+f
+q 1 0 0 1 339.0603 266.9265 cm
+0 0 m
+0.213 0 0.386 0.062 0.514 0.191 c
+0.65 0.326 0.723 0.517 0.735 0.764 c
+1.352 0.764 l
+1.33 0.382 1.194 0.062 0.941 -0.192 c
+0.683 -0.437 0.371 -0.559 0 -0.559 c
+-0.493 -0.559 -0.867 -0.408 -1.133 -0.103 c
+-1.389 0.209 -1.515 0.675 -1.515 1.294 c
+-1.515 1.734 l
+-1.515 2.329 -1.389 2.786 -1.133 3.101 c
+-0.867 3.413 -0.493 3.571 0 3.571 c
+0.4 3.571 0.72 3.439 0.955 3.175 c
+1.198 2.917 1.33 2.572 1.352 2.131 c
+0.735 2.131 l
+0.712 2.425 0.639 2.645 0.514 2.792 c
+0.396 2.94 0.224 3.013 0 3.013 c
+-0.294 3.013 -0.511 2.913 -0.647 2.719 c
+-0.786 2.532 -0.86 2.223 -0.867 1.793 c
+-0.867 1.278 l
+-0.867 0.808 -0.801 0.473 -0.662 0.278 c
+-0.515 0.091 -0.294 0 0 0 c
+2.748 3.087 m
+3.002 3.41 3.322 3.571 3.704 3.571 c
+4.409 3.571 4.766 3.101 4.777 2.16 c
+4.777 -0.485 l
+4.13 -0.485 l
+4.13 2.131 l
+4.13 2.443 4.075 2.664 3.968 2.792 c
+3.858 2.917 3.704 2.983 3.498 2.983 c
+3.34 2.983 3.193 2.929 3.057 2.822 c
+2.929 2.711 2.825 2.576 2.748 2.41 c
+2.748 -0.485 l
+2.102 -0.485 l
+2.102 5.159 l
+2.748 5.159 l
+h
+7.775 -0.485 m
+7.735 -0.397 7.709 -0.25 7.702 -0.044 c
+7.467 -0.389 7.173 -0.559 6.82 -0.559 c
+6.456 -0.559 6.173 -0.464 5.967 -0.265 c
+5.769 -0.059 5.674 0.228 5.674 0.602 c
+5.674 1.003 5.809 1.323 6.085 1.558 c
+6.357 1.801 6.732 1.925 7.202 1.925 c
+7.687 1.925 l
+7.687 2.352 l
+7.687 2.587 7.632 2.752 7.526 2.851 c
+7.415 2.958 7.253 3.013 7.04 3.013 c
+6.842 3.013 6.68 2.954 6.555 2.836 c
+6.437 2.719 6.379 2.572 6.379 2.395 c
+5.732 2.395 l
+5.732 2.59 5.791 2.782 5.909 2.969 c
+6.034 3.152 6.196 3.299 6.393 3.41 c
+6.599 3.517 6.827 3.571 7.085 3.571 c
+7.485 3.571 7.79 3.469 7.996 3.262 c
+8.209 3.057 8.323 2.763 8.334 2.381 c
+8.334 0.367 l
+8.334 0.062 8.371 -0.202 8.452 -0.427 c
+8.452 -0.485 l
+h
+6.908 0.029 m
+7.073 0.029 7.224 0.073 7.364 0.161 c
+7.511 0.249 7.617 0.359 7.687 0.5 c
+7.687 1.44 l
+7.32 1.44 l
+7.004 1.44 6.761 1.371 6.585 1.234 c
+6.408 1.105 6.32 0.918 6.32 0.675 c
+6.32 0.448 6.364 0.282 6.453 0.176 c
+6.541 0.077 6.691 0.029 6.908 0.029 c
+9.951 3.498 m
+9.965 3.057 l
+10.219 3.399 10.543 3.571 10.936 3.571 c
+11.642 3.571 11.997 3.101 12.009 2.16 c
+12.009 -0.485 l
+11.362 -0.485 l
+11.362 2.131 l
+11.362 2.443 11.307 2.664 11.2 2.792 c
+11.09 2.917 10.936 2.983 10.73 2.983 c
+10.572 2.983 10.425 2.929 10.289 2.822 c
+10.16 2.711 10.057 2.576 9.98 2.41 c
+9.98 -0.485 l
+9.333 -0.485 l
+9.333 3.498 l
+h
+12.847 1.69 m
+12.847 2.308 12.957 2.77 13.184 3.087 c
+13.408 3.41 13.743 3.571 14.184 3.571 c
+14.584 3.571 14.89 3.395 15.095 3.042 c
+15.139 3.498 l
+15.727 3.498 l
+15.727 -0.53 l
+15.727 -1.018 15.599 -1.397 15.345 -1.661 c
+15.089 -1.926 14.736 -2.058 14.287 -2.058 c
+14.089 -2.058 13.868 -2.007 13.626 -1.912 c
+13.379 -1.812 13.2 -1.69 13.082 -1.544 c
+13.346 -1.103 l
+13.611 -1.368 13.909 -1.5 14.243 -1.5 c
+14.779 -1.5 15.055 -1.206 15.066 -0.618 c
+15.066 -0.088 l
+14.86 -0.405 14.559 -0.559 14.169 -0.559 c
+13.758 -0.559 13.435 -0.408 13.2 -0.103 c
+12.972 0.209 12.854 0.661 12.847 1.249 c
+h
+13.508 1.308 m
+13.508 0.866 13.57 0.536 13.699 0.323 c
+13.824 0.118 14.041 0.014 14.346 0.014 c
+14.669 0.014 14.908 0.18 15.066 0.514 c
+15.066 2.499 l
+14.898 2.822 14.659 2.983 14.346 2.983 c
+14.052 2.983 13.835 2.881 13.699 2.675 c
+13.57 2.469 13.508 2.146 13.508 1.705 c
+h
+18.109 -0.559 m
+17.609 -0.559 17.227 -0.412 16.962 -0.118 c
+16.698 0.176 16.565 0.61 16.565 1.19 c
+16.565 1.66 l
+16.565 2.256 16.691 2.723 16.947 3.057 c
+17.212 3.399 17.572 3.571 18.035 3.571 c
+18.495 3.571 18.836 3.417 19.064 3.116 c
+19.299 2.822 19.421 2.358 19.432 1.734 c
+19.432 1.308 l
+17.212 1.308 l
+17.212 1.219 l
+17.212 0.786 17.289 0.473 17.447 0.278 c
+17.613 0.091 17.844 0 18.138 0 c
+18.333 0 18.505 0.033 18.653 0.103 c
+18.8 0.18 18.935 0.297 19.064 0.455 c
+19.403 0.043 l
+19.116 -0.36 18.686 -0.559 18.109 -0.559 c
+18.035 3.013 m
+17.759 3.013 17.558 2.917 17.433 2.734 c
+17.304 2.547 17.231 2.256 17.212 1.866 c
+18.785 1.866 l
+18.785 1.955 l
+18.763 2.337 18.697 2.605 18.58 2.763 c
+18.462 2.929 18.278 3.013 18.035 3.013 c
+22.151 0.529 m
+22.151 0.675 22.096 0.797 21.99 0.897 c
+21.879 0.992 21.674 1.109 21.372 1.249 c
+21.026 1.396 20.784 1.517 20.637 1.616 c
+20.49 1.723 20.38 1.841 20.313 1.969 c
+20.244 2.094 20.211 2.252 20.211 2.439 c
+20.211 2.763 20.328 3.031 20.564 3.248 c
+20.799 3.461 21.1 3.571 21.475 3.571 c
+21.857 3.571 22.166 3.457 22.401 3.233 c
+22.636 3.006 22.754 2.719 22.754 2.366 c
+22.107 2.366 l
+22.107 2.543 22.048 2.693 21.931 2.822 c
+21.813 2.946 21.659 3.013 21.475 3.013 c
+21.277 3.013 21.126 2.958 21.019 2.851 c
+20.909 2.752 20.857 2.62 20.857 2.454 c
+20.857 2.326 20.894 2.219 20.975 2.131 c
+21.052 2.05 21.244 1.947 21.549 1.822 c
+22.026 1.635 22.357 1.448 22.534 1.263 c
+22.709 1.087 22.798 0.86 22.798 0.588 c
+22.798 0.235 22.673 -0.044 22.43 -0.25 c
+22.195 -0.456 21.879 -0.559 21.489 -0.559 c
+21.067 -0.559 20.729 -0.441 20.475 -0.206 c
+20.218 0.037 20.093 0.341 20.093 0.706 c
+20.74 0.706 l
+20.747 0.477 20.817 0.301 20.946 0.176 c
+21.071 0.058 21.254 0 21.489 0 c
+21.703 0 21.865 0.047 21.975 0.147 c
+22.092 0.242 22.151 0.371 22.151 0.529 c
+25.532 -0.485 m
+25.532 2.969 l
+25.017 2.969 l
+25.017 3.498 l
+25.532 3.498 l
+25.532 3.866 l
+25.539 4.295 25.653 4.629 25.87 4.865 c
+26.094 5.107 26.407 5.232 26.811 5.232 c
+26.958 5.232 27.097 5.211 27.237 5.174 c
+27.384 5.134 27.535 5.078 27.693 5.012 c
+27.575 4.438 l
+27.34 4.564 27.097 4.629 26.854 4.629 c
+26.609 4.629 26.436 4.56 26.341 4.424 c
+26.241 4.295 26.193 4.101 26.193 3.836 c
+26.193 3.498 l
+26.84 3.498 l
+26.84 2.969 l
+26.193 2.969 l
+26.193 -0.485 l
+h
+28.001 -0.485 -0.646 3.983 re
+29.751 -0.485 -0.647 5.644 re
+32.19 -0.559 m
+31.691 -0.559 31.309 -0.412 31.044 -0.118 c
+30.779 0.176 30.647 0.61 30.647 1.19 c
+30.647 1.66 l
+30.647 2.256 30.772 2.723 31.029 3.057 c
+31.294 3.399 31.654 3.571 32.117 3.571 c
+32.576 3.571 32.918 3.417 33.146 3.116 c
+33.381 2.822 33.503 2.358 33.514 1.734 c
+33.514 1.308 l
+31.294 1.308 l
+31.294 1.219 l
+31.294 0.786 31.371 0.473 31.529 0.278 c
+31.694 0.091 31.926 0 32.22 0 c
+32.415 0 32.587 0.033 32.734 0.103 c
+32.882 0.18 33.017 0.297 33.146 0.455 c
+33.484 0.043 l
+33.198 -0.36 32.768 -0.559 32.19 -0.559 c
+32.117 3.013 m
+31.841 3.013 31.639 2.917 31.515 2.734 c
+31.386 2.547 31.313 2.256 31.294 1.866 c
+32.867 1.866 l
+32.867 1.955 l
+32.845 2.337 32.778 2.605 32.661 2.763 c
+32.543 2.929 32.36 3.013 32.117 3.013 c
+36.233 0.529 m
+36.233 0.675 36.178 0.797 36.071 0.897 c
+35.961 0.992 35.755 1.109 35.454 1.249 c
+35.108 1.396 34.866 1.517 34.719 1.616 c
+34.572 1.723 34.461 1.841 34.395 1.969 c
+34.326 2.094 34.293 2.252 34.293 2.439 c
+34.293 2.763 34.41 3.031 34.646 3.248 c
+34.881 3.461 35.182 3.571 35.556 3.571 c
+35.939 3.571 36.248 3.457 36.483 3.233 c
+36.718 3.006 36.836 2.719 36.836 2.366 c
+36.188 2.366 l
+36.188 2.543 36.13 2.693 36.012 2.822 c
+35.895 2.946 35.741 3.013 35.556 3.013 c
+35.359 3.013 35.207 2.958 35.101 2.851 c
+34.991 2.752 34.939 2.62 34.939 2.454 c
+34.939 2.326 34.976 2.219 35.057 2.131 c
+35.134 2.05 35.325 1.947 35.631 1.822 c
+36.107 1.635 36.439 1.448 36.615 1.263 c
+36.791 1.087 36.88 0.86 36.88 0.588 c
+36.88 0.235 36.755 -0.044 36.512 -0.25 c
+36.277 -0.456 35.961 -0.559 35.571 -0.559 c
+35.149 -0.559 34.81 -0.441 34.557 -0.206 c
+34.299 0.037 34.175 0.341 34.175 0.706 c
+34.822 0.706 l
+34.829 0.477 34.899 0.301 35.027 0.176 c
+35.153 0.058 35.336 0 35.571 0 c
+35.785 0 35.946 0.047 36.057 0.147 c
+36.174 0.242 36.233 0.371 36.233 0.529 c
+39.731 -0.485 m
+39.731 2.969 l
+39.202 2.969 l
+39.202 3.498 l
+39.731 3.498 l
+39.731 3.954 l
+39.731 4.354 39.827 4.667 40.025 4.895 c
+40.231 5.119 40.51 5.232 40.863 5.232 c
+40.999 5.232 41.131 5.211 41.26 5.174 c
+41.231 4.629 l
+41.131 4.648 41.032 4.659 40.936 4.659 c
+40.562 4.659 40.378 4.394 40.378 3.866 c
+40.378 3.498 l
+41.054 3.498 l
+41.054 2.969 l
+40.378 2.969 l
+40.378 -0.485 l
+h
+43.465 2.881 m
+43.377 2.899 43.277 2.91 43.171 2.91 c
+42.837 2.91 42.601 2.726 42.465 2.366 c
+42.465 -0.485 l
+41.819 -0.485 l
+41.819 3.498 l
+42.451 3.498 l
+42.465 3.087 l
+42.642 3.41 42.885 3.571 43.2 3.571 c
+43.307 3.571 43.394 3.549 43.465 3.513 c
+h
+43.905 1.69 m
+43.905 2.267 44.042 2.723 44.317 3.057 c
+44.6 3.399 44.971 3.571 45.434 3.571 c
+45.894 3.571 46.261 3.403 46.537 3.072 c
+46.82 2.748 46.966 2.3 46.978 1.734 c
+46.978 1.308 l
+46.978 0.738 46.835 0.282 46.552 -0.059 c
+46.276 -0.393 45.908 -0.559 45.449 -0.559 c
+44.986 -0.559 44.615 -0.397 44.332 -0.074 c
+44.057 0.257 43.913 0.698 43.905 1.249 c
+h
+44.552 1.308 m
+44.552 0.904 44.63 0.588 44.788 0.353 c
+44.953 0.118 45.173 0 45.449 0 c
+46.015 0 46.309 0.411 46.331 1.234 c
+46.331 1.69 l
+46.331 2.09 46.247 2.41 46.081 2.645 c
+45.923 2.888 45.707 3.013 45.434 3.013 c
+45.17 3.013 44.953 2.888 44.788 2.645 c
+44.63 2.41 44.552 2.09 44.552 1.69 c
+h
+48.433 3.498 m
+48.448 3.131 l
+48.69 3.424 49.01 3.571 49.403 3.571 c
+49.844 3.571 50.153 3.374 50.33 2.983 c
+50.583 3.374 50.932 3.571 51.373 3.571 c
+52.108 3.571 52.483 3.108 52.505 2.19 c
+52.505 -0.485 l
+51.858 -0.485 l
+51.858 2.131 l
+51.858 2.425 51.803 2.638 51.696 2.778 c
+51.597 2.913 51.425 2.983 51.182 2.983 c
+50.983 2.983 50.822 2.903 50.696 2.748 c
+50.579 2.601 50.509 2.41 50.49 2.175 c
+50.49 -0.485 l
+49.829 -0.485 l
+49.829 2.16 l
+49.829 2.707 49.609 2.983 49.168 2.983 c
+48.834 2.983 48.599 2.822 48.462 2.499 c
+48.462 -0.485 l
+47.816 -0.485 l
+47.816 3.498 l
+h
+56.576 0 m
+56.79 0 56.962 0.062 57.091 0.191 c
+57.227 0.326 57.3 0.517 57.311 0.764 c
+57.929 0.764 l
+57.906 0.382 57.771 0.062 57.517 -0.192 c
+57.26 -0.437 56.948 -0.559 56.576 -0.559 c
+56.084 -0.559 55.709 -0.408 55.444 -0.103 c
+55.188 0.209 55.062 0.675 55.062 1.294 c
+55.062 1.734 l
+55.062 2.329 55.188 2.786 55.444 3.101 c
+55.709 3.413 56.084 3.571 56.576 3.571 c
+56.977 3.571 57.297 3.439 57.532 3.175 c
+57.775 2.917 57.906 2.572 57.929 2.131 c
+57.311 2.131 l
+57.289 2.425 57.216 2.645 57.091 2.792 c
+56.973 2.94 56.8 3.013 56.576 3.013 c
+56.283 3.013 56.065 2.913 55.93 2.719 c
+55.79 2.532 55.716 2.223 55.709 1.793 c
+55.709 1.278 l
+55.709 0.808 55.776 0.473 55.915 0.278 c
+56.061 0.091 56.283 0 56.576 0 c
+60.707 -0.133 m
+60.49 -0.42 60.177 -0.559 59.766 -0.559 c
+59.402 -0.559 59.126 -0.437 58.943 -0.192 c
+58.766 0.062 58.671 0.426 58.664 0.897 c
+58.664 3.498 l
+59.31 3.498 l
+59.31 0.955 l
+59.31 0.326 59.494 0.014 59.869 0.014 c
+60.269 0.014 60.545 0.191 60.692 0.544 c
+60.692 3.498 l
+61.339 3.498 l
+61.339 -0.485 l
+60.721 -0.485 l
+h
+63.97 2.881 m
+63.882 2.899 63.782 2.91 63.676 2.91 c
+63.342 2.91 63.107 2.726 62.97 2.366 c
+62.97 -0.485 l
+62.324 -0.485 l
+62.324 3.498 l
+62.955 3.498 l
+62.97 3.087 l
+63.147 3.41 63.389 3.571 63.705 3.571 c
+63.812 3.571 63.9 3.549 63.97 3.513 c
+h
+66.263 2.881 m
+66.174 2.899 66.076 2.91 65.969 2.91 c
+65.634 2.91 65.399 2.726 65.264 2.366 c
+65.264 -0.485 l
+64.617 -0.485 l
+64.617 3.498 l
+65.249 3.498 l
+65.264 3.087 l
+65.44 3.41 65.682 3.571 65.999 3.571 c
+66.105 3.571 66.193 3.549 66.263 3.513 c
+h
+68.262 -0.559 m
+67.762 -0.559 67.38 -0.412 67.115 -0.118 c
+66.851 0.176 66.718 0.61 66.718 1.19 c
+66.718 1.66 l
+66.718 2.256 66.843 2.723 67.101 3.057 c
+67.365 3.399 67.726 3.571 68.189 3.571 c
+68.648 3.571 68.99 3.417 69.218 3.116 c
+69.453 2.822 69.574 2.358 69.585 1.734 c
+69.585 1.308 l
+67.365 1.308 l
+67.365 1.219 l
+67.365 0.786 67.443 0.473 67.601 0.278 c
+67.766 0.091 67.998 0 68.291 0 c
+68.486 0 68.659 0.033 68.806 0.103 c
+68.952 0.18 69.089 0.297 69.218 0.455 c
+69.555 0.043 l
+69.269 -0.36 68.839 -0.559 68.262 -0.559 c
+68.189 3.013 m
+67.913 3.013 67.711 2.917 67.586 2.734 c
+67.458 2.547 67.383 2.256 67.365 1.866 c
+68.938 1.866 l
+68.938 1.955 l
+68.916 2.337 68.85 2.605 68.732 2.763 c
+68.615 2.929 68.431 3.013 68.189 3.013 c
+70.982 3.498 m
+70.996 3.057 l
+71.25 3.399 71.573 3.571 71.967 3.571 c
+72.672 3.571 73.028 3.101 73.039 2.16 c
+73.039 -0.485 l
+72.393 -0.485 l
+72.393 2.131 l
+72.393 2.443 72.337 2.664 72.231 2.792 c
+72.121 2.917 71.967 2.983 71.761 2.983 c
+71.603 2.983 71.456 2.929 71.319 2.822 c
+71.19 2.711 71.088 2.576 71.011 2.41 c
+71.011 -0.485 l
+70.364 -0.485 l
+70.364 3.498 l
+h
+74.862 4.453 m
+74.862 3.498 l
+75.464 3.498 l
+75.464 2.969 l
+74.862 2.969 l
+74.862 0.5 l
+74.862 0.341 74.884 0.224 74.936 0.147 c
+74.994 0.066 75.082 0.029 75.2 0.029 c
+75.288 0.029 75.377 0.043 75.464 0.073 c
+75.464 -0.485 l
+75.318 -0.533 75.163 -0.559 75.009 -0.559 c
+74.751 -0.559 74.556 -0.468 74.421 -0.279 c
+74.281 -0.096 74.215 0.165 74.215 0.5 c
+74.215 2.969 l
+73.613 2.969 l
+73.613 3.498 l
+74.215 3.498 l
+74.215 4.453 l
+h
+77.816 1.69 m
+77.816 2.296 77.927 2.763 78.155 3.087 c
+78.39 3.41 78.716 3.571 79.14 3.571 c
+79.522 3.571 79.819 3.413 80.036 3.101 c
+80.036 5.159 l
+80.683 5.159 l
+80.683 -0.485 l
+80.095 -0.485 l
+80.05 -0.059 l
+79.845 -0.393 79.54 -0.559 79.14 -0.559 c
+78.728 -0.559 78.404 -0.405 78.169 -0.088 c
+77.934 0.235 77.816 0.69 77.816 1.278 c
+h
+78.463 1.308 m
+78.463 0.866 78.525 0.536 78.654 0.323 c
+78.79 0.118 79.011 0.014 79.316 0.014 c
+79.639 0.014 79.878 0.176 80.036 0.5 c
+80.036 2.513 l
+79.867 2.825 79.628 2.983 79.316 2.983 c
+79.011 2.983 78.79 2.881 78.654 2.675 c
+78.525 2.469 78.463 2.146 78.463 1.705 c
+h
+82.388 -0.485 -0.647 3.983 re
+82.432 4.542 m
+82.432 4.432 82.402 4.34 82.344 4.263 c
+82.285 4.193 82.19 4.159 82.064 4.159 c
+81.947 4.159 81.851 4.193 81.785 4.263 c
+81.727 4.34 81.697 4.432 81.697 4.542 c
+81.697 4.659 81.727 4.751 81.785 4.821 c
+81.851 4.898 81.947 4.939 82.064 4.939 c
+82.19 4.939 82.285 4.898 82.344 4.821 c
+82.402 4.74 82.432 4.648 82.432 4.542 c
+85.048 2.881 m
+84.96 2.899 84.861 2.91 84.754 2.91 c
+84.42 2.91 84.185 2.726 84.048 2.366 c
+84.048 -0.485 l
+83.402 -0.485 l
+83.402 3.498 l
+84.034 3.498 l
+84.048 3.087 l
+84.225 3.41 84.468 3.571 84.784 3.571 c
+84.89 3.571 84.979 3.549 85.048 3.513 c
+h
+87.048 -0.559 m
+86.548 -0.559 86.165 -0.412 85.901 -0.118 c
+85.636 0.176 85.504 0.61 85.504 1.19 c
+85.504 1.66 l
+85.504 2.256 85.629 2.723 85.886 3.057 c
+86.151 3.399 86.51 3.571 86.974 3.571 c
+87.433 3.571 87.775 3.417 88.002 3.116 c
+88.238 2.822 88.359 2.358 88.37 1.734 c
+88.37 1.308 l
+86.151 1.308 l
+86.151 1.219 l
+86.151 0.786 86.228 0.473 86.386 0.278 c
+86.551 0.091 86.783 0 87.077 0 c
+87.271 0 87.445 0.033 87.591 0.103 c
+87.738 0.18 87.874 0.297 88.002 0.455 c
+88.341 0.043 l
+88.054 -0.36 87.624 -0.559 87.048 -0.559 c
+86.974 3.013 m
+86.699 3.013 86.496 2.917 86.371 2.734 c
+86.242 2.547 86.169 2.256 86.151 1.866 c
+87.724 1.866 l
+87.724 1.955 l
+87.701 2.337 87.636 2.605 87.518 2.763 c
+87.4 2.929 87.216 3.013 86.974 3.013 c
+90.531 0 m
+90.744 0 90.917 0.062 91.046 0.191 c
+91.181 0.326 91.255 0.517 91.266 0.764 c
+91.883 0.764 l
+91.861 0.382 91.725 0.062 91.472 -0.192 c
+91.214 -0.437 90.902 -0.559 90.531 -0.559 c
+90.038 -0.559 89.664 -0.408 89.399 -0.103 c
+89.142 0.209 89.017 0.675 89.017 1.294 c
+89.017 1.734 l
+89.017 2.329 89.142 2.786 89.399 3.101 c
+89.664 3.413 90.038 3.571 90.531 3.571 c
+90.932 3.571 91.252 3.439 91.487 3.175 c
+91.729 2.917 91.861 2.572 91.883 2.131 c
+91.266 2.131 l
+91.244 2.425 91.171 2.645 91.046 2.792 c
+90.928 2.94 90.755 3.013 90.531 3.013 c
+90.237 3.013 90.02 2.913 89.884 2.719 c
+89.745 2.532 89.671 2.223 89.664 1.793 c
+89.664 1.278 l
+89.664 0.808 89.73 0.473 89.87 0.278 c
+90.017 0.091 90.237 0 90.531 0 c
+93.486 4.453 m
+93.486 3.498 l
+94.088 3.498 l
+94.088 2.969 l
+93.486 2.969 l
+93.486 0.5 l
+93.486 0.341 93.508 0.224 93.559 0.147 c
+93.618 0.066 93.706 0.029 93.824 0.029 c
+93.912 0.029 94 0.043 94.088 0.073 c
+94.088 -0.485 l
+93.941 -0.533 93.787 -0.559 93.633 -0.559 c
+93.375 -0.559 93.18 -0.468 93.045 -0.279 c
+92.905 -0.096 92.839 0.165 92.839 0.5 c
+92.839 2.969 l
+92.236 2.969 l
+92.236 3.498 l
+92.839 3.498 l
+92.839 4.453 l
+h
+94.647 1.69 m
+94.647 2.267 94.782 2.723 95.058 3.057 c
+95.341 3.399 95.713 3.571 96.176 3.571 c
+96.635 3.571 97.002 3.403 97.278 3.072 c
+97.561 2.748 97.708 2.3 97.719 1.734 c
+97.719 1.308 l
+97.719 0.738 97.575 0.282 97.292 -0.059 c
+97.017 -0.393 96.65 -0.559 96.191 -0.559 c
+95.727 -0.559 95.356 -0.397 95.073 -0.074 c
+94.797 0.257 94.654 0.698 94.647 1.249 c
+h
+95.293 1.308 m
+95.293 0.904 95.37 0.588 95.528 0.353 c
+95.694 0.118 95.915 0 96.191 0 c
+96.756 0 97.05 0.411 97.072 1.234 c
+97.072 1.69 l
+97.072 2.09 96.987 2.41 96.822 2.645 c
+96.664 2.888 96.447 3.013 96.176 3.013 c
+95.911 3.013 95.694 2.888 95.528 2.645 c
+95.37 2.41 95.293 2.09 95.293 1.69 c
+h
+100.203 2.881 m
+100.114 2.899 100.016 2.91 99.909 2.91 c
+99.574 2.91 99.339 2.726 99.204 2.366 c
+99.204 -0.485 l
+98.557 -0.485 l
+98.557 3.498 l
+99.189 3.498 l
+99.204 3.087 l
+99.38 3.41 99.622 3.571 99.939 3.571 c
+100.045 3.571 100.133 3.549 100.203 3.513 c
+h
+102.011 0.602 m
+102.732 3.498 l
+103.422 3.498 l
+102.129 -1.044 l
+102.03 -1.386 101.886 -1.646 101.702 -1.823 c
+101.526 -1.999 101.324 -2.087 101.099 -2.087 c
+101.012 -2.087 100.897 -2.066 100.762 -2.029 c
+100.762 -1.485 l
+100.908 -1.5 l
+101.092 -1.5 101.24 -1.455 101.35 -1.368 c
+101.456 -1.279 101.544 -1.121 101.614 -0.897 c
+101.732 -0.456 l
+100.571 3.498 l
+101.276 3.498 l
+h
+105.641 1.69 m
+105.641 2.296 105.752 2.763 105.98 3.087 c
+106.215 3.41 106.542 3.571 106.965 3.571 c
+107.347 3.571 107.644 3.413 107.861 3.101 c
+107.861 5.159 l
+108.508 5.159 l
+108.508 -0.485 l
+107.92 -0.485 l
+107.876 -0.059 l
+107.67 -0.393 107.365 -0.559 106.965 -0.559 c
+106.553 -0.559 106.229 -0.405 105.994 -0.088 c
+105.759 0.235 105.641 0.69 105.641 1.278 c
+h
+106.289 1.308 m
+106.289 0.866 106.351 0.536 106.479 0.323 c
+106.616 0.118 106.836 0.014 107.141 0.014 c
+107.464 0.014 107.703 0.176 107.861 0.5 c
+107.861 2.513 l
+107.692 2.825 107.453 2.983 107.141 2.983 c
+106.836 2.983 106.616 2.881 106.479 2.675 c
+106.351 2.469 106.289 2.146 106.289 1.705 c
+h
+109.375 1.69 m
+109.375 2.267 109.511 2.723 109.787 3.057 c
+110.069 3.399 110.441 3.571 110.904 3.571 c
+111.363 3.571 111.731 3.403 112.006 3.072 c
+112.289 2.748 112.436 2.3 112.448 1.734 c
+112.448 1.308 l
+112.448 0.738 112.304 0.282 112.021 -0.059 c
+111.746 -0.393 111.378 -0.559 110.919 -0.559 c
+110.456 -0.559 110.084 -0.397 109.801 -0.074 c
+109.526 0.257 109.383 0.698 109.375 1.249 c
+h
+110.022 1.308 m
+110.022 0.904 110.099 0.588 110.257 0.353 c
+110.422 0.118 110.643 0 110.919 0 c
+111.484 0 111.779 0.411 111.8 1.234 c
+111.8 1.69 l
+111.8 2.09 111.716 2.41 111.551 2.645 c
+111.393 2.888 111.176 3.013 110.904 3.013 c
+110.639 3.013 110.422 2.888 110.257 2.645 c
+110.099 2.41 110.022 2.09 110.022 1.69 c
+h
+116.255 0.661 m
+116.857 3.498 l
+117.504 3.498 l
+116.519 -0.485 l
+116.004 -0.485 l
+115.226 2.366 l
+114.476 -0.485 l
+113.947 -0.485 l
+112.991 3.498 l
+113.623 3.498 l
+114.241 0.735 l
+114.975 3.498 l
+115.49 3.498 l
+h
+118.798 3.498 m
+118.812 3.057 l
+119.066 3.399 119.389 3.571 119.782 3.571 c
+120.488 3.571 120.845 3.101 120.855 2.16 c
+120.855 -0.485 l
+120.209 -0.485 l
+120.209 2.131 l
+120.209 2.443 120.153 2.664 120.047 2.792 c
+119.937 2.917 119.782 2.983 119.576 2.983 c
+119.418 2.983 119.272 2.929 119.135 2.822 c
+119.006 2.711 118.904 2.576 118.827 2.41 c
+118.827 -0.485 l
+118.18 -0.485 l
+118.18 3.498 l
+h
+124.251 -0.485 -0.647 3.983 re
+124.295 4.542 m
+124.295 4.432 124.265 4.34 124.207 4.263 c
+124.148 4.193 124.052 4.159 123.927 4.159 c
+123.81 4.159 123.714 4.193 123.648 4.263 c
+123.59 4.34 123.56 4.432 123.56 4.542 c
+123.56 4.659 123.59 4.751 123.648 4.821 c
+123.714 4.898 123.81 4.939 123.927 4.939 c
+124.052 4.939 124.148 4.898 124.207 4.821 c
+124.265 4.74 124.295 4.648 124.295 4.542 c
+125.882 3.498 m
+125.897 3.057 l
+126.15 3.399 126.474 3.571 126.867 3.571 c
+127.573 3.571 127.929 3.101 127.941 2.16 c
+127.941 -0.485 l
+127.293 -0.485 l
+127.293 2.131 l
+127.293 2.443 127.238 2.664 127.132 2.792 c
+127.021 2.917 126.867 2.983 126.661 2.983 c
+126.503 2.983 126.356 2.929 126.22 2.822 c
+126.092 2.711 125.989 2.576 125.911 2.41 c
+125.911 -0.485 l
+125.265 -0.485 l
+125.265 3.498 l
+h
+129.763 4.453 m
+129.763 3.498 l
+130.366 3.498 l
+130.366 2.969 l
+129.763 2.969 l
+129.763 0.5 l
+129.763 0.341 129.784 0.224 129.836 0.147 c
+129.895 0.066 129.983 0.029 130.101 0.029 c
+130.189 0.029 130.277 0.043 130.366 0.073 c
+130.366 -0.485 l
+130.218 -0.533 130.064 -0.559 129.91 -0.559 c
+129.653 -0.559 129.458 -0.468 129.322 -0.279 c
+129.182 -0.096 129.116 0.165 129.116 0.5 c
+129.116 2.969 l
+128.513 2.969 l
+128.513 3.498 l
+129.116 3.498 l
+129.116 4.453 l
+h
+130.924 1.69 m
+130.924 2.267 131.06 2.723 131.336 3.057 c
+131.619 3.399 131.99 3.571 132.452 3.571 c
+132.912 3.571 133.279 3.403 133.555 3.072 c
+133.838 2.748 133.985 2.3 133.996 1.734 c
+133.996 1.308 l
+133.996 0.738 133.853 0.282 133.57 -0.059 c
+133.294 -0.393 132.926 -0.559 132.467 -0.559 c
+132.005 -0.559 131.633 -0.397 131.351 -0.074 c
+131.075 0.257 130.931 0.698 130.924 1.249 c
+h
+131.571 1.308 m
+131.571 0.904 131.648 0.588 131.806 0.353 c
+131.972 0.118 132.192 0 132.467 0 c
+133.034 0 133.327 0.411 133.35 1.234 c
+133.35 1.69 l
+133.35 2.09 133.265 2.41 133.1 2.645 c
+132.942 2.888 132.725 3.013 132.452 3.013 c
+132.188 3.013 131.972 2.888 131.806 2.645 c
+131.648 2.41 131.571 2.09 131.571 1.69 c
+h
+136.421 1.69 m
+136.421 2.296 136.531 2.763 136.76 3.087 c
+136.995 3.41 137.322 3.571 137.744 3.571 c
+138.127 3.571 138.424 3.413 138.641 3.101 c
+138.641 5.159 l
+139.288 5.159 l
+139.288 -0.485 l
+138.7 -0.485 l
+138.656 -0.059 l
+138.45 -0.393 138.145 -0.559 137.744 -0.559 c
+137.333 -0.559 137.009 -0.405 136.774 -0.088 c
+136.539 0.235 136.421 0.69 136.421 1.278 c
+h
+137.069 1.308 m
+137.069 0.866 137.131 0.536 137.26 0.323 c
+137.395 0.118 137.616 0.014 137.921 0.014 c
+138.244 0.014 138.483 0.176 138.641 0.5 c
+138.641 2.513 l
+138.472 2.825 138.233 2.983 137.921 2.983 c
+137.616 2.983 137.395 2.881 137.26 2.675 c
+137.131 2.469 137.069 2.146 137.069 1.705 c
+h
+140.993 -0.485 -0.647 3.983 re
+141.037 4.542 m
+141.037 4.432 141.007 4.34 140.949 4.263 c
+140.89 4.193 140.795 4.159 140.67 4.159 c
+140.552 4.159 140.456 4.193 140.39 4.263 c
+140.331 4.34 140.302 4.432 140.302 4.542 c
+140.302 4.659 140.331 4.751 140.39 4.821 c
+140.456 4.898 140.552 4.939 140.67 4.939 c
+140.795 4.939 140.89 4.898 140.949 4.821 c
+141.007 4.74 141.037 4.648 141.037 4.542 c
+143.654 2.881 m
+143.565 2.899 143.466 2.91 143.359 2.91 c
+143.025 2.91 142.79 2.726 142.654 2.366 c
+142.654 -0.485 l
+142.007 -0.485 l
+142.007 3.498 l
+142.64 3.498 l
+142.654 3.087 l
+142.831 3.41 143.073 3.571 143.388 3.571 c
+143.496 3.571 143.583 3.549 143.654 3.513 c
+h
+145.653 -0.559 m
+145.152 -0.559 144.77 -0.412 144.506 -0.118 c
+144.242 0.176 144.109 0.61 144.109 1.19 c
+144.109 1.66 l
+144.109 2.256 144.234 2.723 144.491 3.057 c
+144.756 3.399 145.116 3.571 145.579 3.571 c
+146.039 3.571 146.38 3.417 146.608 3.116 c
+146.843 2.822 146.964 2.358 146.975 1.734 c
+146.975 1.308 l
+144.756 1.308 l
+144.756 1.219 l
+144.756 0.786 144.833 0.473 144.991 0.278 c
+145.156 0.091 145.388 0 145.682 0 c
+145.877 0 146.05 0.033 146.197 0.103 c
+146.343 0.18 146.48 0.297 146.608 0.455 c
+146.946 0.043 l
+146.659 -0.36 146.229 -0.559 145.653 -0.559 c
+145.579 3.013 m
+145.304 3.013 145.102 2.917 144.976 2.734 c
+144.848 2.547 144.774 2.256 144.756 1.866 c
+146.328 1.866 l
+146.328 1.955 l
+146.307 2.337 146.241 2.605 146.123 2.763 c
+146.006 2.929 145.821 3.013 145.579 3.013 c
+149.136 0 m
+149.349 0 149.522 0.062 149.651 0.191 c
+149.786 0.326 149.86 0.517 149.871 0.764 c
+150.488 0.764 l
+150.467 0.382 150.33 0.062 150.077 -0.192 c
+149.819 -0.437 149.507 -0.559 149.136 -0.559 c
+148.643 -0.559 148.269 -0.408 148.005 -0.103 c
+147.747 0.209 147.622 0.675 147.622 1.294 c
+147.622 1.734 l
+147.622 2.329 147.747 2.786 148.005 3.101 c
+148.269 3.413 148.643 3.571 149.136 3.571 c
+149.537 3.571 149.856 3.439 150.091 3.175 c
+150.334 2.917 150.467 2.572 150.488 2.131 c
+149.871 2.131 l
+149.849 2.425 149.775 2.645 149.651 2.792 c
+149.533 2.94 149.36 3.013 149.136 3.013 c
+148.842 3.013 148.626 2.913 148.489 2.719 c
+148.35 2.532 148.277 2.223 148.269 1.793 c
+148.269 1.278 l
+148.269 0.808 148.335 0.473 148.475 0.278 c
+148.622 0.091 148.842 0 149.136 0 c
+152.09 4.453 m
+152.09 3.498 l
+152.693 3.498 l
+152.693 2.969 l
+152.09 2.969 l
+152.09 0.5 l
+152.09 0.341 152.113 0.224 152.165 0.147 c
+152.223 0.066 152.311 0.029 152.429 0.029 c
+152.517 0.029 152.605 0.043 152.693 0.073 c
+152.693 -0.485 l
+152.547 -0.533 152.392 -0.559 152.238 -0.559 c
+151.98 -0.559 151.785 -0.468 151.65 -0.279 c
+151.51 -0.096 151.444 0.165 151.444 0.5 c
+151.444 2.969 l
+150.841 2.969 l
+150.841 3.498 l
+151.444 3.498 l
+151.444 4.453 l
+h
+153.252 1.69 m
+153.252 2.267 153.388 2.723 153.663 3.057 c
+153.946 3.399 154.318 3.571 154.781 3.571 c
+155.24 3.571 155.608 3.403 155.883 3.072 c
+156.166 2.748 156.313 2.3 156.324 1.734 c
+156.324 1.308 l
+156.324 0.738 156.181 0.282 155.897 -0.059 c
+155.622 -0.393 155.255 -0.559 154.795 -0.559 c
+154.332 -0.559 153.961 -0.397 153.678 -0.074 c
+153.403 0.257 153.26 0.698 153.252 1.249 c
+h
+153.898 1.308 m
+153.898 0.904 153.976 0.588 154.134 0.353 c
+154.299 0.118 154.519 0 154.795 0 c
+155.361 0 155.655 0.411 155.677 1.234 c
+155.677 1.69 l
+155.677 2.09 155.593 2.41 155.427 2.645 c
+155.269 2.888 155.053 3.013 154.781 3.013 c
+154.516 3.013 154.299 2.888 154.134 2.645 c
+153.976 2.41 153.898 2.09 153.898 1.69 c
+h
+158.808 2.881 m
+158.72 2.899 158.621 2.91 158.515 2.91 c
+158.18 2.91 157.944 2.726 157.809 2.366 c
+157.809 -0.485 l
+157.162 -0.485 l
+157.162 3.498 l
+157.794 3.498 l
+157.809 3.087 l
+157.985 3.41 158.228 3.571 158.544 3.571 c
+158.65 3.571 158.739 3.549 158.808 3.513 c
+h
+160.616 0.602 m
+161.337 3.498 l
+162.027 3.498 l
+160.734 -1.044 l
+160.634 -1.386 160.491 -1.646 160.308 -1.823 c
+160.131 -1.999 159.929 -2.087 159.705 -2.087 c
+159.616 -2.087 159.502 -2.066 159.367 -2.029 c
+159.367 -1.485 l
+159.514 -1.5 l
+159.697 -1.5 159.845 -1.455 159.955 -1.368 c
+160.061 -1.279 160.15 -1.121 160.219 -0.897 c
+160.337 -0.456 l
+159.176 3.498 l
+159.882 3.498 l
+h
+165.231 4.453 m
+165.231 3.498 l
+165.835 3.498 l
+165.835 2.969 l
+165.231 2.969 l
+165.231 0.5 l
+165.231 0.341 165.254 0.224 165.305 0.147 c
+165.364 0.066 165.453 0.029 165.57 0.029 c
+165.658 0.029 165.746 0.043 165.835 0.073 c
+165.835 -0.485 l
+165.688 -0.533 165.533 -0.559 165.378 -0.559 c
+165.121 -0.559 164.927 -0.468 164.79 -0.279 c
+164.651 -0.096 164.585 0.165 164.585 0.5 c
+164.585 2.969 l
+163.982 2.969 l
+163.982 3.498 l
+164.585 3.498 l
+164.585 4.453 l
+h
+168.245 2.881 m
+168.157 2.899 168.057 2.91 167.951 2.91 c
+167.616 2.91 167.381 2.726 167.246 2.366 c
+167.246 -0.485 l
+166.598 -0.485 l
+166.598 3.498 l
+167.231 3.498 l
+167.246 3.087 l
+167.422 3.41 167.664 3.571 167.98 3.571 c
+168.087 3.571 168.175 3.549 168.245 3.513 c
+h
+170.244 -0.559 m
+169.744 -0.559 169.362 -0.412 169.098 -0.118 c
+168.833 0.176 168.701 0.61 168.701 1.19 c
+168.701 1.66 l
+168.701 2.256 168.825 2.723 169.083 3.057 c
+169.347 3.399 169.708 3.571 170.17 3.571 c
+170.629 3.571 170.972 3.417 171.2 3.116 c
+171.435 2.822 171.556 2.358 171.567 1.734 c
+171.567 1.308 l
+169.347 1.308 l
+169.347 1.219 l
+169.347 0.786 169.424 0.473 169.582 0.278 c
+169.748 0.091 169.979 0 170.274 0 c
+170.469 0 170.641 0.033 170.788 0.103 c
+170.935 0.18 171.071 0.297 171.2 0.455 c
+171.537 0.043 l
+171.251 -0.36 170.821 -0.559 170.244 -0.559 c
+170.17 3.013 m
+169.895 3.013 169.692 2.917 169.568 2.734 c
+169.439 2.547 169.366 2.256 169.347 1.866 c
+170.92 1.866 l
+170.92 1.955 l
+170.898 2.337 170.832 2.605 170.714 2.763 c
+170.597 2.929 170.413 3.013 170.17 3.013 c
+173.772 -0.559 m
+173.272 -0.559 172.89 -0.412 172.626 -0.118 c
+172.36 0.176 172.229 0.61 172.229 1.19 c
+172.229 1.66 l
+172.229 2.256 172.353 2.723 172.611 3.057 c
+172.875 3.399 173.235 3.571 173.698 3.571 c
+174.157 3.571 174.5 3.417 174.727 3.116 c
+174.962 2.822 175.084 2.358 175.095 1.734 c
+175.095 1.308 l
+172.875 1.308 l
+172.875 1.219 l
+172.875 0.786 172.952 0.473 173.11 0.278 c
+173.276 0.091 173.507 0 173.802 0 c
+173.996 0 174.168 0.033 174.315 0.103 c
+174.463 0.18 174.598 0.297 174.727 0.455 c
+175.065 0.043 l
+174.779 -0.36 174.349 -0.559 173.772 -0.559 c
+173.698 3.013 m
+173.422 3.013 173.22 2.917 173.096 2.734 c
+172.967 2.547 172.894 2.256 172.875 1.866 c
+174.448 1.866 l
+174.448 1.955 l
+174.426 2.337 174.359 2.605 174.242 2.763 c
+174.124 2.929 173.941 3.013 173.698 3.013 c
+175.918 -0.133 m
+175.918 -0.015 175.951 0.081 176.021 0.161 c
+176.087 0.238 176.19 0.278 176.329 0.278 c
+176.476 0.278 176.583 0.238 176.653 0.161 c
+176.73 0.081 176.771 -0.015 176.771 -0.133 c
+176.771 -0.243 176.73 -0.335 176.653 -0.412 c
+176.583 -0.489 176.476 -0.53 176.329 -0.53 c
+176.19 -0.53 176.087 -0.489 176.021 -0.412 c
+175.951 -0.335 175.918 -0.243 175.918 -0.133 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 261.208 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 254.3733 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.485 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.596 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.264 13.582 -0.177 c
+h
+24.133 1.469 m
+24.033 1.477 23.931 1.488 23.823 1.5 c
+23.713 1.517 23.592 1.529 23.456 1.529 c
+23.28 1.529 23.121 1.488 22.986 1.411 c
+22.846 1.341 22.728 1.242 22.633 1.117 c
+22.545 0.989 22.475 0.841 22.427 0.676 c
+22.387 0.507 22.369 0.33 22.369 0.147 c
+22.369 -1.264 l
+21.471 -1.264 l
+21.471 0.985 l
+21.471 1.11 21.461 1.234 21.442 1.352 c
+21.432 1.477 21.417 1.595 21.398 1.705 c
+21.388 1.822 21.373 1.918 21.355 1.999 c
+21.332 2.087 21.314 2.161 21.296 2.219 c
+22.177 2.219 l
+22.185 2.168 22.196 2.117 22.207 2.057 c
+22.225 1.999 22.24 1.933 22.251 1.866 c
+22.269 1.808 22.284 1.741 22.296 1.675 c
+22.302 1.606 22.313 1.543 22.325 1.484 c
+22.339 1.484 l
+22.375 1.602 22.427 1.708 22.486 1.808 c
+22.552 1.903 22.633 1.988 22.722 2.057 c
+22.809 2.124 22.913 2.179 23.03 2.219 c
+23.155 2.256 23.302 2.278 23.471 2.278 c
+23.596 2.278 23.713 2.271 23.823 2.263 c
+23.942 2.252 24.044 2.238 24.133 2.219 c
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.029 25.518 -0.882 c
+25.371 -0.728 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.18 25.047 0.484 c
+25.047 0.816 25.091 1.095 25.18 1.323 c
+25.275 1.558 25.404 1.741 25.562 1.881 c
+25.727 2.017 25.915 2.117 26.121 2.175 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.131 c
+27.664 2.043 27.829 1.911 27.958 1.735 c
+28.094 1.565 28.193 1.359 28.252 1.117 c
+28.318 0.881 28.355 0.617 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.022 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.441 c
+26.26 -0.53 26.344 -0.599 26.444 -0.647 c
+26.539 -0.698 26.653 -0.721 26.782 -0.721 c
+26.936 -0.721 27.076 -0.688 27.194 -0.617 c
+27.318 -0.551 27.407 -0.449 27.458 -0.309 c
+28.296 -0.382 l
+28.266 -0.482 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.919 27.825 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.235 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.705 m
+26.649 1.705 26.562 1.691 26.473 1.66 c
+26.385 1.631 26.304 1.58 26.238 1.514 c
+26.169 1.444 26.109 1.356 26.061 1.249 c
+26.021 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.003 27.447 1.124 27.399 1.234 c
+27.359 1.341 27.304 1.429 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.705 26.738 1.705 c
+32.342 -0.25 m
+32.342 -0.419 32.301 -0.57 32.224 -0.706 c
+32.154 -0.834 32.052 -0.948 31.916 -1.044 c
+31.787 -1.132 31.625 -1.202 31.43 -1.249 c
+31.243 -1.297 31.027 -1.323 30.784 -1.323 c
+30.556 -1.323 30.358 -1.309 30.181 -1.279 c
+30.005 -1.249 29.847 -1.202 29.71 -1.132 c
+29.571 -1.055 29.461 -0.956 29.373 -0.838 c
+29.284 -0.721 29.215 -0.574 29.167 -0.397 c
+29.976 -0.279 l
+29.994 -0.379 30.023 -0.456 30.063 -0.515 c
+30.111 -0.574 30.17 -0.617 30.24 -0.647 c
+30.306 -0.676 30.387 -0.702 30.475 -0.721 c
+30.564 -0.732 30.666 -0.735 30.784 -0.735 c
+30.879 -0.735 30.975 -0.732 31.063 -0.721 c
+31.152 -0.702 31.229 -0.676 31.298 -0.647 c
+31.364 -0.617 31.416 -0.58 31.445 -0.53 c
+31.482 -0.482 31.504 -0.419 31.504 -0.339 c
+31.504 -0.243 31.474 -0.169 31.416 -0.118 c
+31.364 -0.07 31.298 -0.029 31.21 0 c
+31.122 0.037 31.011 0.066 30.886 0.088 c
+30.769 0.118 30.637 0.147 30.489 0.176 c
+30.35 0.213 30.211 0.253 30.063 0.294 c
+29.924 0.341 29.799 0.405 29.681 0.484 c
+29.571 0.562 29.483 0.661 29.417 0.779 c
+29.347 0.896 29.313 1.047 29.313 1.234 c
+29.313 1.389 29.344 1.532 29.402 1.66 c
+29.468 1.797 29.564 1.911 29.681 1.999 c
+29.806 2.087 29.964 2.153 30.152 2.205 c
+30.335 2.252 30.549 2.278 30.784 2.278 c
+30.967 2.278 31.144 2.256 31.313 2.219 c
+31.478 2.19 31.625 2.135 31.754 2.057 c
+31.879 1.988 31.989 1.889 32.077 1.764 c
+32.166 1.646 32.224 1.502 32.253 1.338 c
+31.46 1.264 l
+31.438 1.341 31.408 1.404 31.372 1.455 c
+31.331 1.514 31.283 1.558 31.225 1.587 c
+31.173 1.624 31.111 1.65 31.034 1.66 c
+30.953 1.668 30.872 1.675 30.784 1.675 c
+30.567 1.675 30.406 1.646 30.298 1.587 c
+30.188 1.536 30.137 1.448 30.137 1.323 c
+30.137 1.242 30.155 1.18 30.196 1.132 c
+30.244 1.08 30.306 1.043 30.387 1.014 c
+30.475 0.985 30.57 0.955 30.681 0.926 c
+30.788 0.904 30.909 0.881 31.048 0.852 c
+31.202 0.823 31.361 0.783 31.519 0.735 c
+31.673 0.683 31.813 0.621 31.931 0.544 c
+32.048 0.463 32.143 0.36 32.224 0.235 c
+32.301 0.106 32.342 -0.056 32.342 -0.25 c
+34.859 -1.323 m
+34.602 -1.323 34.374 -1.286 34.169 -1.22 c
+33.963 -1.143 33.786 -1.029 33.639 -0.882 c
+33.492 -0.728 33.375 -0.536 33.286 -0.309 c
+33.205 -0.085 33.169 0.18 33.169 0.484 c
+33.169 0.816 33.213 1.095 33.301 1.323 c
+33.396 1.558 33.525 1.741 33.683 1.881 c
+33.849 2.017 34.036 2.117 34.242 2.175 c
+34.447 2.242 34.657 2.278 34.874 2.278 c
+35.146 2.278 35.381 2.227 35.58 2.131 c
+35.785 2.043 35.95 1.911 36.079 1.735 c
+36.215 1.565 36.314 1.359 36.373 1.117 c
+36.44 0.881 36.476 0.617 36.476 0.324 c
+36.476 0.309 l
+34.109 0.309 l
+34.109 0.162 34.124 0.022 34.154 -0.103 c
+34.19 -0.231 34.246 -0.345 34.315 -0.441 c
+34.381 -0.53 34.466 -0.599 34.565 -0.647 c
+34.661 -0.698 34.774 -0.721 34.903 -0.721 c
+35.058 -0.721 35.197 -0.688 35.314 -0.617 c
+35.44 -0.551 35.528 -0.449 35.58 -0.309 c
+36.417 -0.382 l
+36.388 -0.482 36.332 -0.588 36.255 -0.706 c
+36.174 -0.816 36.072 -0.919 35.947 -1.014 c
+35.829 -1.103 35.675 -1.176 35.491 -1.235 c
+35.314 -1.294 35.102 -1.323 34.859 -1.323 c
+34.859 1.705 m
+34.771 1.705 34.682 1.691 34.595 1.66 c
+34.506 1.631 34.425 1.58 34.36 1.514 c
+34.29 1.444 34.231 1.356 34.183 1.249 c
+34.142 1.139 34.124 1.014 34.124 0.867 c
+35.594 0.867 l
+35.594 1.003 35.568 1.124 35.52 1.234 c
+35.48 1.341 35.425 1.429 35.359 1.5 c
+35.3 1.565 35.227 1.617 35.138 1.646 c
+35.05 1.683 34.955 1.705 34.859 1.705 c
+37.968 1.602 m
+37.424 1.602 l
+37.424 2.219 l
+38.012 2.219 l
+38.291 3.116 l
+38.865 3.116 l
+38.865 2.219 l
+40.099 2.219 l
+40.099 1.602 l
+38.865 1.602 l
+38.865 -0.103 l
+38.865 -0.324 l
+38.872 -0.393 38.894 -0.456 38.923 -0.515 c
+38.96 -0.566 39.015 -0.611 39.085 -0.647 c
+39.162 -0.676 39.276 -0.691 39.424 -0.691 c
+39.559 -0.691 39.695 -0.688 39.835 -0.676 c
+39.971 -0.658 40.103 -0.632 40.232 -0.603 c
+40.232 -1.205 l
+40.151 -1.216 40.074 -1.231 39.996 -1.249 c
+39.916 -1.261 39.838 -1.268 39.761 -1.279 c
+39.68 -1.286 39.592 -1.294 39.497 -1.294 c
+39.409 -1.301 39.309 -1.309 39.202 -1.309 c
+39.015 -1.309 38.853 -1.294 38.718 -1.264 c
+38.589 -1.228 38.475 -1.183 38.379 -1.132 c
+38.291 -1.085 38.218 -1.025 38.159 -0.956 c
+38.1 -0.879 38.056 -0.802 38.027 -0.721 c
+37.997 -0.632 37.975 -0.544 37.968 -0.456 c
+37.957 -0.36 37.953 -0.264 37.953 -0.177 c
+h
+46.236 -2.631 m
+46.236 3.513 l
+48.162 3.513 l
+48.162 2.896 l
+47.089 2.896 l
+47.089 -2.014 l
+48.162 -2.014 l
+48.162 -2.631 l
+h
+51.193 1.602 m
+51.193 -1.264 l
+50.297 -1.264 l
+50.297 1.602 l
+49.473 1.602 l
+49.473 2.219 l
+50.297 2.219 l
+50.297 2.484 l
+50.297 2.609 50.312 2.741 50.341 2.881 c
+50.378 3.017 50.447 3.135 50.547 3.233 c
+50.653 3.341 50.796 3.428 50.973 3.499 c
+51.149 3.564 51.374 3.601 51.649 3.601 c
+51.862 3.601 52.061 3.59 52.237 3.572 c
+52.413 3.549 52.564 3.532 52.693 3.513 c
+52.693 2.925 l
+52.564 2.944 52.421 2.958 52.267 2.969 c
+52.108 2.976 51.958 2.984 51.81 2.984 c
+51.682 2.984 51.579 2.969 51.502 2.94 c
+51.421 2.911 51.359 2.87 51.311 2.822 c
+51.26 2.77 51.226 2.708 51.208 2.631 c
+51.197 2.561 51.193 2.484 51.193 2.396 c
+51.193 2.219 l
+52.619 2.219 l
+52.619 1.602 l
+h
+55.71 -0.647 m
+56.841 -0.647 l
+56.841 -1.264 l
+53.535 -1.264 l
+53.535 -0.647 l
+54.798 -0.647 l
+54.798 1.602 l
+53.872 1.602 l
+53.872 2.219 l
+55.71 2.219 l
+h
+54.798 3.513 0.912 -0.676 re
+54.798 2.836 m
+59.774 -0.647 m
+60.905 -0.647 l
+60.905 -1.264 l
+57.599 -1.264 l
+57.599 -0.647 l
+58.863 -0.647 l
+58.863 2.896 l
+57.936 2.896 l
+57.936 3.513 l
+59.774 3.513 l
+h
+63.291 -1.323 m
+63.033 -1.323 62.806 -1.286 62.6 -1.22 c
+62.394 -1.143 62.218 -1.029 62.071 -0.882 c
+61.923 -0.728 61.807 -0.536 61.718 -0.309 c
+61.637 -0.085 61.601 0.18 61.601 0.484 c
+61.601 0.816 61.645 1.095 61.732 1.323 c
+61.828 1.558 61.957 1.741 62.115 1.881 c
+62.28 2.017 62.468 2.117 62.673 2.175 c
+62.879 2.242 63.089 2.278 63.305 2.278 c
+63.577 2.278 63.812 2.227 64.011 2.131 c
+64.217 2.043 64.382 1.911 64.51 1.735 c
+64.647 1.565 64.745 1.359 64.805 1.117 c
+64.871 0.881 64.907 0.617 64.907 0.324 c
+64.907 0.309 l
+62.541 0.309 l
+62.541 0.162 62.555 0.022 62.586 -0.103 c
+62.622 -0.231 62.677 -0.345 62.747 -0.441 c
+62.813 -0.53 62.898 -0.599 62.997 -0.647 c
+63.093 -0.698 63.206 -0.721 63.334 -0.721 c
+63.49 -0.721 63.629 -0.688 63.746 -0.617 c
+63.871 -0.551 63.96 -0.449 64.011 -0.309 c
+64.849 -0.382 l
+64.82 -0.482 64.764 -0.588 64.687 -0.706 c
+64.606 -0.816 64.504 -0.919 64.379 -1.014 c
+64.261 -1.103 64.107 -1.176 63.923 -1.235 c
+63.746 -1.294 63.533 -1.323 63.291 -1.323 c
+63.291 1.705 m
+63.203 1.705 63.114 1.691 63.026 1.66 c
+62.938 1.631 62.857 1.58 62.791 1.514 c
+62.721 1.444 62.663 1.356 62.615 1.249 c
+62.574 1.139 62.555 1.014 62.555 0.867 c
+64.026 0.867 l
+64.026 1.003 64 1.124 63.952 1.234 c
+63.912 1.341 63.856 1.429 63.791 1.5 c
+63.731 1.565 63.658 1.617 63.57 1.646 c
+63.482 1.683 63.386 1.705 63.291 1.705 c
+66.16 -2.631 m
+66.16 -2.014 l
+67.234 -2.014 l
+67.234 2.896 l
+66.16 2.896 l
+66.16 3.513 l
+68.086 3.513 l
+68.086 -2.631 l
+h
+f
+Q
+q 1 0 0 1 371.3314 238.8802 cm
+0 0 m
+-0.118 -0.147 l
+-0.452 -0.54 -0.948 -0.735 -1.602 -0.735 c
+-2.183 -0.735 -2.638 -0.544 -2.969 -0.162 c
+-3.293 0.22 -3.461 0.765 -3.469 1.47 c
+-3.469 2.514 l
+-3.469 3.267 -3.322 3.829 -3.027 4.204 c
+-2.726 4.575 -2.275 4.763 -1.675 4.763 c
+-1.168 4.763 -0.771 4.619 -0.484 4.336 c
+-0.191 4.05 -0.029 3.645 0 3.117 c
+-0.675 3.117 l
+-0.698 3.447 -0.79 3.707 -0.955 3.896 c
+-1.113 4.09 -1.348 4.189 -1.66 4.189 c
+-2.054 4.189 -2.337 4.06 -2.514 3.807 c
+-2.69 3.55 -2.786 3.15 -2.792 2.602 c
+-2.792 1.514 l
+-2.792 0.974 -2.69 0.559 -2.484 0.264 c
+-2.278 -0.022 -1.984 -0.162 -1.602 -0.162 c
+-1.242 -0.162 -0.962 -0.073 -0.764 0.103 c
+-0.675 0.191 l
+-0.675 1.426 l
+-1.646 1.426 l
+-1.646 1.999 l
+0 1.999 l
+h
+2.44 -0.735 m
+1.941 -0.735 1.558 -0.588 1.294 -0.294 c
+1.029 0 0.897 0.434 0.897 1.014 c
+0.897 1.484 l
+0.897 2.08 1.022 2.547 1.279 2.882 c
+1.544 3.223 1.904 3.395 2.367 3.395 c
+2.826 3.395 3.167 3.241 3.396 2.94 c
+3.631 2.646 3.753 2.183 3.763 1.558 c
+3.763 1.132 l
+1.544 1.132 l
+1.544 1.043 l
+1.544 0.611 1.621 0.297 1.779 0.103 c
+1.944 -0.085 2.176 -0.176 2.469 -0.176 c
+2.664 -0.176 2.837 -0.143 2.984 -0.073 c
+3.131 0.004 3.267 0.121 3.396 0.279 c
+3.734 -0.133 l
+3.447 -0.536 3.017 -0.735 2.44 -0.735 c
+2.367 2.837 m
+2.091 2.837 1.889 2.741 1.764 2.558 c
+1.636 2.371 1.562 2.08 1.544 1.691 c
+3.117 1.691 l
+3.117 1.779 l
+3.094 2.161 3.028 2.429 2.911 2.587 c
+2.793 2.753 2.61 2.837 2.367 2.837 c
+5.395 4.278 m
+5.395 3.322 l
+5.997 3.322 l
+5.997 2.793 l
+5.395 2.793 l
+5.395 0.324 l
+5.395 0.166 5.417 0.048 5.469 -0.029 c
+5.527 -0.11 5.615 -0.147 5.733 -0.147 c
+5.821 -0.147 5.91 -0.133 5.997 -0.103 c
+5.997 -0.661 l
+5.85 -0.709 5.696 -0.735 5.542 -0.735 c
+5.284 -0.735 5.089 -0.643 4.954 -0.455 c
+4.814 -0.272 4.748 -0.011 4.748 0.324 c
+4.748 2.793 l
+4.145 2.793 l
+4.145 3.322 l
+4.748 3.322 l
+4.748 4.278 l
+h
+8.658 -0.661 m
+8.658 2.793 l
+8.143 2.793 l
+8.143 3.322 l
+8.658 3.322 l
+8.658 3.69 l
+8.665 4.12 8.779 4.453 8.996 4.689 c
+9.22 4.931 9.533 5.056 9.937 5.056 c
+10.084 5.056 10.223 5.035 10.363 4.998 c
+10.51 4.958 10.66 4.902 10.819 4.836 c
+10.701 4.262 l
+10.466 4.388 10.223 4.453 9.981 4.453 c
+9.735 4.453 9.562 4.384 9.467 4.248 c
+9.367 4.12 9.319 3.925 9.319 3.66 c
+9.319 3.322 l
+9.966 3.322 l
+9.966 2.793 l
+9.319 2.793 l
+9.319 -0.661 l
+h
+11.127 -0.661 -0.646 3.983 re
+12.877 -0.661 -0.647 5.644 re
+15.317 -0.735 m
+14.817 -0.735 14.435 -0.588 14.17 -0.294 c
+13.906 0 13.773 0.434 13.773 1.014 c
+13.773 1.484 l
+13.773 2.08 13.898 2.547 14.155 2.882 c
+14.42 3.223 14.78 3.395 15.243 3.395 c
+15.703 3.395 16.044 3.241 16.272 2.94 c
+16.507 2.646 16.629 2.183 16.64 1.558 c
+16.64 1.132 l
+14.42 1.132 l
+14.42 1.043 l
+14.42 0.611 14.497 0.297 14.655 0.103 c
+14.82 -0.085 15.052 -0.176 15.346 -0.176 c
+15.541 -0.176 15.713 -0.143 15.861 -0.073 c
+16.008 0.004 16.143 0.121 16.272 0.279 c
+16.61 -0.133 l
+16.324 -0.536 15.894 -0.735 15.317 -0.735 c
+15.243 2.837 m
+14.967 2.837 14.766 2.741 14.641 2.558 c
+14.512 2.371 14.438 2.08 14.42 1.691 c
+15.993 1.691 l
+15.993 1.779 l
+15.971 2.161 15.904 2.429 15.787 2.587 c
+15.669 2.753 15.486 2.837 15.243 2.837 c
+22.019 1.132 m
+22.019 0.515 21.905 0.048 21.681 -0.264 c
+21.465 -0.58 21.141 -0.735 20.711 -0.735 c
+20.289 -0.735 19.977 -0.555 19.771 -0.191 c
+19.741 -0.661 l
+19.138 -0.661 l
+19.138 4.983 l
+19.786 4.983 l
+19.786 2.882 l
+19.998 3.223 20.307 3.395 20.711 3.395 c
+21.141 3.395 21.465 3.237 21.681 2.925 c
+21.905 2.62 22.019 2.153 22.019 1.529 c
+h
+21.373 1.514 m
+21.373 1.984 21.303 2.315 21.167 2.514 c
+21.039 2.708 20.829 2.807 20.534 2.807 c
+20.201 2.807 19.95 2.624 19.786 2.263 c
+19.786 0.382 l
+19.95 0.019 20.204 -0.162 20.549 -0.162 c
+20.843 -0.162 21.053 -0.058 21.182 0.147 c
+21.307 0.353 21.373 0.669 21.373 1.103 c
+h
+24.9 -0.661 m
+24.86 -0.573 24.835 -0.426 24.827 -0.22 c
+24.592 -0.565 24.297 -0.735 23.945 -0.735 c
+23.582 -0.735 23.298 -0.64 23.092 -0.441 c
+22.894 -0.235 22.799 0.052 22.799 0.426 c
+22.799 0.827 22.934 1.147 23.21 1.382 c
+23.482 1.625 23.857 1.749 24.328 1.749 c
+24.812 1.749 l
+24.812 2.176 l
+24.812 2.411 24.757 2.576 24.65 2.675 c
+24.54 2.782 24.378 2.837 24.166 2.837 c
+23.967 2.837 23.805 2.778 23.68 2.66 c
+23.563 2.543 23.504 2.396 23.504 2.219 c
+22.857 2.219 l
+22.857 2.414 22.916 2.606 23.034 2.793 c
+23.158 2.977 23.32 3.123 23.518 3.234 c
+23.724 3.341 23.952 3.395 24.21 3.395 c
+24.61 3.395 24.915 3.293 25.121 3.087 c
+25.334 2.882 25.448 2.587 25.459 2.205 c
+25.459 0.191 l
+25.459 -0.114 25.496 -0.378 25.577 -0.603 c
+25.577 -0.661 l
+h
+24.033 -0.147 m
+24.199 -0.147 24.349 -0.103 24.489 -0.015 c
+24.636 0.073 24.742 0.183 24.812 0.324 c
+24.812 1.264 l
+24.445 1.264 l
+24.129 1.264 23.886 1.195 23.709 1.058 c
+23.534 0.929 23.445 0.742 23.445 0.5 c
+23.445 0.272 23.489 0.106 23.578 0 c
+23.665 -0.099 23.817 -0.147 24.033 -0.147 c
+27.84 -0.176 m
+28.054 -0.176 28.226 -0.114 28.355 0.015 c
+28.49 0.151 28.565 0.342 28.575 0.588 c
+29.193 0.588 l
+29.17 0.206 29.035 -0.114 28.781 -0.368 c
+28.524 -0.613 28.212 -0.735 27.84 -0.735 c
+27.348 -0.735 26.973 -0.584 26.709 -0.279 c
+26.451 0.033 26.327 0.5 26.327 1.118 c
+26.327 1.558 l
+26.327 2.153 26.451 2.61 26.709 2.925 c
+26.973 3.237 27.348 3.395 27.84 3.395 c
+28.241 3.395 28.561 3.263 28.796 2.999 c
+29.038 2.741 29.17 2.396 29.193 1.955 c
+28.575 1.955 l
+28.553 2.249 28.48 2.469 28.355 2.616 c
+28.237 2.764 28.064 2.837 27.84 2.837 c
+27.547 2.837 27.329 2.738 27.193 2.543 c
+27.054 2.356 26.98 2.047 26.973 1.617 c
+26.973 1.103 l
+26.973 0.632 27.039 0.297 27.179 0.103 c
+27.326 -0.085 27.547 -0.176 27.84 -0.176 c
+30.942 1.161 m
+30.604 0.765 l
+30.604 -0.661 l
+29.942 -0.661 l
+29.942 4.983 l
+30.604 4.983 l
+30.604 1.602 l
+31.838 3.322 l
+32.617 3.322 l
+31.353 1.661 l
+32.779 -0.661 l
+32.029 -0.661 l
+h
+35.351 -0.661 m
+35.351 2.793 l
+34.822 2.793 l
+34.822 3.322 l
+35.351 3.322 l
+35.351 3.778 l
+35.351 4.178 35.447 4.491 35.646 4.719 c
+35.852 4.943 36.13 5.056 36.484 5.056 c
+36.619 5.056 36.752 5.035 36.88 4.998 c
+36.851 4.453 l
+36.752 4.472 36.652 4.484 36.557 4.484 c
+36.182 4.484 35.998 4.218 35.998 3.69 c
+35.998 3.322 l
+36.675 3.322 l
+36.675 2.793 l
+35.998 2.793 l
+35.998 -0.661 l
+h
+39.085 2.705 m
+38.996 2.723 38.898 2.734 38.791 2.734 c
+38.456 2.734 38.221 2.55 38.086 2.19 c
+38.086 -0.661 l
+37.439 -0.661 l
+37.439 3.322 l
+38.071 3.322 l
+38.086 2.911 l
+38.262 3.234 38.504 3.395 38.821 3.395 c
+38.927 3.395 39.015 3.373 39.085 3.337 c
+h
+39.526 1.514 m
+39.526 2.091 39.662 2.547 39.937 2.882 c
+40.22 3.223 40.592 3.395 41.055 3.395 c
+41.514 3.395 41.882 3.227 42.157 2.896 c
+42.44 2.572 42.587 2.124 42.599 1.558 c
+42.599 1.132 l
+42.599 0.563 42.455 0.106 42.171 -0.235 c
+41.896 -0.569 41.529 -0.735 41.069 -0.735 c
+40.606 -0.735 40.235 -0.573 39.952 -0.25 c
+39.677 0.081 39.534 0.522 39.526 1.073 c
+h
+40.172 1.132 m
+40.172 0.728 40.25 0.412 40.408 0.177 c
+40.573 -0.058 40.794 -0.176 41.069 -0.176 c
+41.635 -0.176 41.93 0.235 41.951 1.058 c
+41.951 1.514 l
+41.951 1.914 41.867 2.234 41.701 2.469 c
+41.543 2.712 41.327 2.837 41.055 2.837 c
+40.79 2.837 40.573 2.712 40.408 2.469 c
+40.25 2.234 40.172 1.914 40.172 1.514 c
+h
+44.053 3.322 m
+44.068 2.955 l
+44.311 3.248 44.631 3.395 45.024 3.395 c
+45.464 3.395 45.773 3.198 45.949 2.807 c
+46.203 3.198 46.552 3.395 46.993 3.395 c
+47.728 3.395 48.103 2.932 48.124 2.014 c
+48.124 -0.661 l
+47.478 -0.661 l
+47.478 1.955 l
+47.478 2.249 47.423 2.462 47.316 2.602 c
+47.218 2.738 47.044 2.807 46.802 2.807 c
+46.603 2.807 46.441 2.727 46.317 2.572 c
+46.2 2.425 46.129 2.234 46.111 1.999 c
+46.111 -0.661 l
+45.45 -0.661 l
+45.45 1.984 l
+45.45 2.532 45.229 2.807 44.789 2.807 c
+44.454 2.807 44.219 2.646 44.083 2.323 c
+44.083 -0.661 l
+43.436 -0.661 l
+43.436 3.322 l
+h
+f
+Q
+q 1 0 0 1 423.8077 239.2923 cm
+0 0 m
+0 0.087 -0.044 0.165 -0.133 0.235 c
+-0.221 0.312 -0.408 0.415 -0.691 0.544 c
+-1.125 0.72 -1.422 0.9 -1.588 1.088 c
+-1.746 1.271 -1.823 1.502 -1.823 1.778 c
+-1.823 2.119 -1.702 2.403 -1.455 2.63 c
+-1.202 2.865 -0.864 2.983 -0.441 2.983 c
+-0.011 2.983 0.338 2.869 0.602 2.645 c
+0.866 2.418 0.999 2.117 0.999 1.734 c
+-0.044 1.734 l
+-0.044 2.057 -0.184 2.219 -0.456 2.219 c
+-0.566 2.219 -0.655 2.183 -0.721 2.117 c
+-0.79 2.046 -0.824 1.947 -0.824 1.822 c
+-0.824 1.734 -0.786 1.653 -0.706 1.587 c
+-0.628 1.529 -0.449 1.433 -0.162 1.308 c
+0.268 1.15 0.565 0.974 0.735 0.779 c
+0.911 0.591 0.999 0.341 0.999 0.029 c
+0.999 -0.324 0.866 -0.611 0.602 -0.823 c
+0.338 -1.04 -0.011 -1.147 -0.441 -1.147 c
+-0.736 -1.147 -0.996 -1.092 -1.22 -0.985 c
+-1.449 -0.867 -1.625 -0.706 -1.75 -0.5 c
+-1.867 -0.294 -1.926 -0.074 -1.926 0.161 c
+-0.941 0.161 l
+-0.941 -0.026 -0.904 -0.162 -0.824 -0.25 c
+-0.736 -0.339 -0.603 -0.383 -0.427 -0.383 c
+-0.144 -0.383 0 -0.258 0 0 c
+2.866 3.881 m
+2.866 2.91 l
+3.395 2.91 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.011 2.884 -0.118 2.925 -0.177 c
+2.973 -0.235 3.057 -0.265 3.174 -0.265 c
+3.281 -0.265 3.366 -0.258 3.424 -0.235 c
+3.424 -1.044 l
+3.248 -1.11 3.057 -1.147 2.851 -1.147 c
+2.175 -1.147 1.83 -0.761 1.822 0.014 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.91 l
+1.822 2.91 l
+1.822 3.881 l
+h
+5.85 -1.073 m
+5.82 -1.015 5.791 -0.912 5.761 -0.765 c
+5.574 -1.022 5.325 -1.147 5.012 -1.147 c
+4.677 -1.147 4.398 -1.04 4.174 -0.823 c
+3.958 -0.599 3.85 -0.309 3.85 0.043 c
+3.85 0.455 3.983 0.771 4.247 0.999 c
+4.512 1.234 4.895 1.352 5.394 1.352 c
+5.718 1.352 l
+5.718 1.675 l
+5.718 1.851 5.681 1.973 5.614 2.042 c
+5.556 2.119 5.468 2.16 5.35 2.16 c
+5.093 2.16 4.968 2.006 4.968 1.705 c
+3.924 1.705 l
+3.924 2.076 4.06 2.381 4.336 2.616 c
+4.608 2.859 4.957 2.983 5.379 2.983 c
+5.82 2.983 6.158 2.865 6.393 2.63 c
+6.636 2.403 6.761 2.08 6.761 1.66 c
+6.761 -0.206 l
+6.761 -0.551 6.809 -0.82 6.908 -1.015 c
+6.908 -1.073 l
+h
+5.247 -0.324 m
+5.354 -0.324 5.446 -0.306 5.526 -0.265 c
+5.614 -0.217 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.468 0.735 l
+5.291 0.735 5.148 0.675 5.041 0.558 c
+4.942 0.448 4.895 0.301 4.895 0.118 c
+4.895 -0.177 5.012 -0.324 5.247 -0.324 c
+7.378 1.043 m
+7.378 1.69 7.496 2.175 7.731 2.499 c
+7.966 2.822 8.297 2.983 8.731 2.983 c
+9.084 2.983 9.356 2.84 9.554 2.557 c
+9.598 2.91 l
+10.539 2.91 l
+10.539 -1.073 l
+10.539 -1.58 10.395 -1.97 10.113 -2.234 c
+9.826 -2.506 9.422 -2.646 8.893 -2.646 c
+8.664 -2.646 8.429 -2.602 8.187 -2.514 c
+7.952 -2.426 7.775 -2.311 7.658 -2.176 c
+8.01 -1.455 l
+8.106 -1.563 8.234 -1.646 8.392 -1.706 c
+8.547 -1.771 8.694 -1.808 8.834 -1.808 c
+9.069 -1.808 9.234 -1.75 9.333 -1.632 c
+9.44 -1.522 9.495 -1.345 9.495 -1.103 c
+9.495 -0.75 l
+9.296 -1.015 9.04 -1.147 8.716 -1.147 c
+8.294 -1.147 7.966 -0.985 7.731 -0.662 c
+7.503 -0.331 7.386 0.139 7.378 0.749 c
+h
+8.422 0.779 m
+8.422 0.404 8.469 0.135 8.569 -0.03 c
+8.664 -0.198 8.819 -0.279 9.025 -0.279 c
+9.238 -0.279 9.396 -0.202 9.495 -0.044 c
+9.495 1.851 l
+9.385 2.017 9.231 2.102 9.025 2.102 c
+8.819 2.102 8.664 2.017 8.569 1.851 c
+8.469 1.683 8.422 1.414 8.422 1.043 c
+h
+12.39 -1.073 -1.043 3.983 re
+11.303 3.939 m
+11.303 4.093 11.351 4.222 11.45 4.321 c
+11.557 4.428 11.692 4.483 11.862 4.483 c
+12.038 4.483 12.174 4.428 12.273 4.321 c
+12.38 4.222 12.435 4.093 12.435 3.939 c
+12.435 3.77 12.38 3.634 12.273 3.528 c
+12.174 3.428 12.038 3.38 11.862 3.38 c
+11.692 3.38 11.557 3.428 11.45 3.528 c
+11.351 3.634 11.303 3.77 11.303 3.939 c
+14.154 2.91 m
+14.184 2.513 l
+14.42 2.825 14.721 2.983 15.095 2.983 c
+15.779 2.983 16.132 2.502 16.153 1.543 c
+16.153 -1.073 l
+15.11 -1.073 l
+15.11 1.469 l
+15.11 1.693 15.073 1.855 15.008 1.955 c
+14.937 2.05 14.819 2.102 14.655 2.102 c
+14.467 2.102 14.32 2.006 14.214 1.822 c
+14.214 -1.073 l
+13.17 -1.073 l
+13.17 2.91 l
+h
+16.771 1.043 m
+16.771 1.69 16.889 2.175 17.124 2.499 c
+17.359 2.822 17.69 2.983 18.123 2.983 c
+18.476 2.983 18.748 2.84 18.947 2.557 c
+18.991 2.91 l
+19.931 2.91 l
+19.931 -1.073 l
+19.931 -1.58 19.788 -1.97 19.505 -2.234 c
+19.218 -2.506 18.815 -2.646 18.285 -2.646 c
+18.057 -2.646 17.822 -2.602 17.58 -2.514 c
+17.344 -2.426 17.168 -2.311 17.05 -2.176 c
+17.404 -1.455 l
+17.499 -1.563 17.628 -1.646 17.786 -1.706 c
+17.94 -1.771 18.087 -1.808 18.226 -1.808 c
+18.461 -1.808 18.627 -1.75 18.726 -1.632 c
+18.833 -1.522 18.888 -1.345 18.888 -1.103 c
+18.888 -0.75 l
+18.69 -1.015 18.432 -1.147 18.109 -1.147 c
+17.686 -1.147 17.359 -0.985 17.124 -0.662 c
+16.896 -0.331 16.778 0.139 16.771 0.749 c
+h
+17.815 0.779 m
+17.815 0.404 17.863 0.135 17.962 -0.03 c
+18.057 -0.198 18.212 -0.279 18.418 -0.279 c
+18.63 -0.279 18.788 -0.202 18.888 -0.044 c
+18.888 1.851 l
+18.777 2.017 18.623 2.102 18.418 2.102 c
+18.212 2.102 18.057 2.017 17.962 1.851 c
+17.863 1.683 17.815 1.414 17.815 1.043 c
+h
+f
+Q
+q 1 0 0 1 448.3695 238.2189 cm
+0 0 m
+-0.04 0.088 -0.066 0.235 -0.073 0.441 c
+-0.309 0.096 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.103 0.713 -2.103 1.087 c
+-2.103 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.286 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.837 l
+-0.088 3.072 -0.143 3.237 -0.25 3.337 c
+-0.36 3.443 -0.522 3.499 -0.735 3.499 c
+-0.933 3.499 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.397 3.057 -1.397 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.267 -1.867 3.454 c
+-1.742 3.638 -1.58 3.785 -1.382 3.896 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.014 3.954 0.22 3.748 c
+0.434 3.543 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.559 -0.412 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.456 1.926 l
+-0.771 1.926 -1.014 1.856 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.235 0.563 -1.084 0.515 -0.867 0.515 c
+3.204 3.366 m
+3.116 3.385 3.017 3.395 2.911 3.395 c
+2.576 3.395 2.341 3.212 2.205 2.851 c
+2.205 0 l
+1.558 0 l
+1.558 3.983 l
+2.19 3.983 l
+2.205 3.572 l
+2.381 3.896 2.624 4.056 2.94 4.056 c
+3.046 4.056 3.135 4.035 3.204 3.998 c
+h
+5.203 -0.073 m
+4.704 -0.073 4.322 0.073 4.056 0.368 c
+3.792 0.661 3.66 1.095 3.66 1.675 c
+3.66 2.146 l
+3.66 2.741 3.785 3.208 4.042 3.543 c
+4.307 3.884 4.667 4.056 5.13 4.056 c
+5.589 4.056 5.931 3.902 6.159 3.601 c
+6.394 3.308 6.516 2.844 6.526 2.219 c
+6.526 1.793 l
+4.307 1.793 l
+4.307 1.705 l
+4.307 1.272 4.384 0.959 4.542 0.764 c
+4.707 0.577 4.939 0.485 5.232 0.485 c
+5.427 0.485 5.6 0.518 5.747 0.588 c
+5.894 0.665 6.03 0.783 6.159 0.941 c
+6.497 0.529 l
+6.21 0.125 5.78 -0.073 5.203 -0.073 c
+5.13 3.499 m
+4.854 3.499 4.652 3.403 4.527 3.219 c
+4.399 3.032 4.326 2.741 4.307 2.352 c
+5.88 2.352 l
+5.88 2.44 l
+5.857 2.822 5.791 3.09 5.674 3.248 c
+5.556 3.414 5.373 3.499 5.13 3.499 c
+9.348 0 m
+9.308 0.088 9.282 0.235 9.275 0.441 c
+9.04 0.096 8.746 -0.073 8.393 -0.073 c
+8.029 -0.073 7.746 0.022 7.54 0.22 c
+7.342 0.426 7.247 0.713 7.247 1.087 c
+7.247 1.488 7.383 1.808 7.659 2.043 c
+7.93 2.286 8.305 2.41 8.775 2.41 c
+9.261 2.41 l
+9.261 2.837 l
+9.261 3.072 9.205 3.237 9.099 3.337 c
+8.989 3.443 8.827 3.499 8.613 3.499 c
+8.415 3.499 8.253 3.439 8.129 3.322 c
+8.01 3.204 7.952 3.057 7.952 2.881 c
+7.305 2.881 l
+7.305 3.075 7.364 3.267 7.482 3.454 c
+7.607 3.638 7.769 3.785 7.967 3.896 c
+8.172 4.002 8.401 4.056 8.658 4.056 c
+9.058 4.056 9.363 3.954 9.569 3.748 c
+9.782 3.543 9.896 3.248 9.907 2.866 c
+9.907 0.852 l
+9.907 0.548 9.944 0.283 10.025 0.058 c
+10.025 0 l
+h
+8.481 0.515 m
+8.646 0.515 8.797 0.559 8.937 0.646 c
+9.084 0.735 9.19 0.845 9.261 0.985 c
+9.261 1.926 l
+8.893 1.926 l
+8.577 1.926 8.334 1.856 8.158 1.72 c
+7.981 1.591 7.894 1.404 7.894 1.161 c
+7.894 0.933 7.937 0.768 8.025 0.661 c
+8.114 0.563 8.264 0.515 8.481 0.515 c
+13.479 4.939 m
+13.479 3.983 l
+14.082 3.983 l
+14.082 3.454 l
+13.479 3.454 l
+13.479 0.985 l
+13.479 0.827 13.501 0.709 13.552 0.632 c
+13.612 0.551 13.699 0.515 13.817 0.515 c
+13.905 0.515 13.993 0.529 14.082 0.559 c
+14.082 0 l
+13.934 -0.048 13.78 -0.073 13.626 -0.073 c
+13.369 -0.073 13.174 0.018 13.038 0.206 c
+12.898 0.389 12.833 0.65 12.833 0.985 c
+12.833 3.454 l
+12.23 3.454 l
+12.23 3.983 l
+12.833 3.983 l
+12.833 4.939 l
+h
+14.64 2.175 m
+14.64 2.753 14.776 3.208 15.052 3.543 c
+15.335 3.884 15.706 4.056 16.168 4.056 c
+16.629 4.056 16.995 3.888 17.271 3.557 c
+17.554 3.233 17.701 2.786 17.712 2.219 c
+17.712 1.793 l
+17.712 1.224 17.569 0.768 17.286 0.426 c
+17.01 0.092 16.643 -0.073 16.184 -0.073 c
+15.721 -0.073 15.349 0.088 15.066 0.411 c
+14.791 0.742 14.647 1.183 14.64 1.735 c
+h
+15.287 1.793 m
+15.287 1.389 15.364 1.073 15.522 0.838 c
+15.688 0.603 15.908 0.485 16.184 0.485 c
+16.75 0.485 17.043 0.897 17.066 1.72 c
+17.066 2.175 l
+17.066 2.576 16.981 2.896 16.816 3.131 c
+16.658 3.373 16.44 3.499 16.168 3.499 c
+15.904 3.499 15.688 3.373 15.522 3.131 c
+15.364 2.896 15.287 2.576 15.287 2.175 c
+h
+23.239 1.147 m
+23.842 3.983 l
+24.488 3.983 l
+23.503 0 l
+22.989 0 l
+22.21 2.851 l
+21.46 0 l
+20.931 0 l
+19.976 3.983 l
+20.608 3.983 l
+21.225 1.22 l
+21.961 3.983 l
+22.475 3.983 l
+h
+25.032 2.175 m
+25.032 2.753 25.169 3.208 25.444 3.543 c
+25.727 3.884 26.098 4.056 26.561 4.056 c
+27.021 4.056 27.388 3.888 27.663 3.557 c
+27.947 3.233 28.093 2.786 28.105 2.219 c
+28.105 1.793 l
+28.105 1.224 27.962 0.768 27.678 0.426 c
+27.403 0.092 27.035 -0.073 26.576 -0.073 c
+26.113 -0.073 25.741 0.088 25.458 0.411 c
+25.183 0.742 25.04 1.183 25.032 1.735 c
+h
+25.679 1.793 m
+25.679 1.389 25.757 1.073 25.915 0.838 c
+26.08 0.603 26.3 0.485 26.576 0.485 c
+27.141 0.485 27.436 0.897 27.457 1.72 c
+27.457 2.175 l
+27.457 2.576 27.374 2.896 27.208 3.131 c
+27.05 3.373 26.833 3.499 26.561 3.499 c
+26.296 3.499 26.08 3.373 25.915 3.131 c
+25.757 2.896 25.679 2.576 25.679 2.175 c
+h
+30.588 3.366 m
+30.501 3.385 30.401 3.395 30.295 3.395 c
+29.961 3.395 29.725 3.212 29.589 2.851 c
+29.589 0 l
+28.942 0 l
+28.942 3.983 l
+29.574 3.983 l
+29.589 3.572 l
+29.766 3.896 30.008 4.056 30.324 4.056 c
+30.431 4.056 30.519 4.035 30.588 3.998 c
+h
+32.234 1.822 m
+31.897 1.426 l
+31.897 0 l
+31.235 0 l
+31.235 5.644 l
+31.897 5.644 l
+31.897 2.263 l
+33.132 3.983 l
+33.911 3.983 l
+32.646 2.323 l
+34.073 0 l
+33.323 0 l
+h
+35.336 0 -0.646 3.983 re
+35.38 5.027 m
+35.38 4.917 35.351 4.825 35.292 4.748 c
+35.233 4.678 35.138 4.644 35.013 4.644 c
+34.896 4.644 34.8 4.678 34.734 4.748 c
+34.675 4.825 34.646 4.917 34.646 5.027 c
+34.646 5.145 34.675 5.236 34.734 5.307 c
+34.8 5.384 34.896 5.424 35.013 5.424 c
+35.138 5.424 35.233 5.384 35.292 5.307 c
+35.351 5.226 35.38 5.134 35.38 5.027 c
+36.968 3.983 m
+36.982 3.543 l
+37.236 3.884 37.56 4.056 37.953 4.056 c
+38.659 4.056 39.015 3.586 39.026 2.645 c
+39.026 0 l
+38.379 0 l
+38.379 2.616 l
+38.379 2.929 38.324 3.15 38.218 3.278 c
+38.107 3.403 37.953 3.469 37.747 3.469 c
+37.589 3.469 37.442 3.414 37.306 3.308 c
+37.177 3.197 37.075 3.061 36.997 2.896 c
+36.997 0 l
+36.351 0 l
+36.351 3.983 l
+h
+39.864 2.175 m
+39.864 2.793 39.974 3.256 40.202 3.572 c
+40.426 3.896 40.76 4.056 41.202 4.056 c
+41.602 4.056 41.907 3.881 42.112 3.528 c
+42.156 3.983 l
+42.744 3.983 l
+42.744 -0.044 l
+42.744 -0.532 42.616 -0.912 42.362 -1.176 c
+42.106 -1.44 41.753 -1.573 41.304 -1.573 c
+41.106 -1.573 40.885 -1.521 40.643 -1.426 c
+40.396 -1.326 40.217 -1.205 40.099 -1.058 c
+40.363 -0.617 l
+40.628 -0.882 40.926 -1.014 41.26 -1.014 c
+41.797 -1.014 42.073 -0.721 42.083 -0.133 c
+42.083 0.397 l
+41.877 0.081 41.576 -0.073 41.186 -0.073 c
+40.775 -0.073 40.452 0.077 40.217 0.382 c
+39.989 0.694 39.871 1.147 39.864 1.735 c
+h
+40.525 1.793 m
+40.525 1.352 40.587 1.022 40.716 0.808 c
+40.841 0.603 41.058 0.5 41.363 0.5 c
+41.686 0.5 41.925 0.665 42.083 0.999 c
+42.083 2.984 l
+41.915 3.308 41.676 3.469 41.363 3.469 c
+41.069 3.469 40.853 3.366 40.716 3.16 c
+40.587 2.955 40.525 2.631 40.525 2.19 c
+h
+45.288 2.175 m
+45.288 2.782 45.398 3.248 45.626 3.572 c
+45.861 3.896 46.188 4.056 46.611 4.056 c
+46.993 4.056 47.29 3.898 47.507 3.586 c
+47.507 5.644 l
+48.154 5.644 l
+48.154 0 l
+47.566 0 l
+47.521 0.426 l
+47.316 0.092 47.012 -0.073 46.611 -0.073 c
+46.199 -0.073 45.875 0.081 45.64 0.397 c
+45.405 0.721 45.288 1.176 45.288 1.764 c
+h
+45.934 1.793 m
+45.934 1.352 45.996 1.022 46.125 0.808 c
+46.262 0.603 46.482 0.5 46.787 0.5 c
+47.11 0.5 47.349 0.661 47.507 0.985 c
+47.507 2.998 l
+47.338 3.31 47.099 3.469 46.787 3.469 c
+46.482 3.469 46.262 3.366 46.125 3.16 c
+45.996 2.955 45.934 2.631 45.934 2.19 c
+h
+49.859 0 -0.647 3.983 re
+49.903 5.027 m
+49.903 4.917 49.873 4.825 49.815 4.748 c
+49.757 4.678 49.661 4.644 49.536 4.644 c
+49.418 4.644 49.323 4.678 49.256 4.748 c
+49.198 4.825 49.168 4.917 49.168 5.027 c
+49.168 5.145 49.198 5.236 49.256 5.307 c
+49.323 5.384 49.418 5.424 49.536 5.424 c
+49.661 5.424 49.757 5.384 49.815 5.307 c
+49.873 5.226 49.903 5.134 49.903 5.027 c
+52.52 3.366 m
+52.431 3.385 52.332 3.395 52.225 3.395 c
+51.891 3.395 51.656 3.212 51.52 2.851 c
+51.52 0 l
+50.873 0 l
+50.873 3.983 l
+51.505 3.983 l
+51.52 3.572 l
+51.696 3.896 51.939 4.056 52.255 4.056 c
+52.362 4.056 52.45 4.035 52.52 3.998 c
+h
+54.519 -0.073 m
+54.019 -0.073 53.636 0.073 53.372 0.368 c
+53.108 0.661 52.975 1.095 52.975 1.675 c
+52.975 2.146 l
+52.975 2.741 53.1 3.208 53.358 3.543 c
+53.622 3.884 53.982 4.056 54.445 4.056 c
+54.904 4.056 55.246 3.902 55.474 3.601 c
+55.71 3.308 55.831 2.844 55.841 2.219 c
+55.841 1.793 l
+53.622 1.793 l
+53.622 1.705 l
+53.622 1.272 53.699 0.959 53.857 0.764 c
+54.023 0.577 54.254 0.485 54.548 0.485 c
+54.743 0.485 54.916 0.518 55.062 0.588 c
+55.209 0.665 55.346 0.783 55.474 0.941 c
+55.812 0.529 l
+55.525 0.125 55.095 -0.073 54.519 -0.073 c
+54.445 3.499 m
+54.17 3.499 53.967 3.403 53.842 3.219 c
+53.714 3.032 53.64 2.741 53.622 2.352 c
+55.195 2.352 l
+55.195 2.44 l
+55.172 2.822 55.107 3.09 54.989 3.248 c
+54.871 3.414 54.688 3.499 54.445 3.499 c
+58.002 0.485 m
+58.216 0.485 58.388 0.548 58.517 0.676 c
+58.653 0.812 58.727 1.003 58.737 1.249 c
+59.355 1.249 l
+59.332 0.867 59.197 0.548 58.943 0.294 c
+58.686 0.048 58.374 -0.073 58.002 -0.073 c
+57.51 -0.073 57.135 0.077 56.871 0.382 c
+56.614 0.694 56.489 1.161 56.489 1.779 c
+56.489 2.219 l
+56.489 2.815 56.614 3.271 56.871 3.586 c
+57.135 3.898 57.51 4.056 58.002 4.056 c
+58.403 4.056 58.723 3.925 58.958 3.66 c
+59.201 3.403 59.332 3.057 59.355 2.616 c
+58.737 2.616 l
+58.715 2.911 58.642 3.131 58.517 3.278 c
+58.399 3.425 58.226 3.499 58.002 3.499 c
+57.709 3.499 57.491 3.399 57.356 3.204 c
+57.216 3.017 57.142 2.708 57.135 2.278 c
+57.135 1.764 l
+57.135 1.294 57.202 0.959 57.341 0.764 c
+57.488 0.577 57.709 0.485 58.002 0.485 c
+60.957 4.939 m
+60.957 3.983 l
+61.559 3.983 l
+61.559 3.454 l
+60.957 3.454 l
+60.957 0.985 l
+60.957 0.827 60.979 0.709 61.03 0.632 c
+61.089 0.551 61.177 0.515 61.295 0.515 c
+61.383 0.515 61.472 0.529 61.559 0.559 c
+61.559 0 l
+61.412 -0.048 61.258 -0.073 61.104 -0.073 c
+60.847 -0.073 60.652 0.018 60.516 0.206 c
+60.377 0.389 60.31 0.65 60.31 0.985 c
+60.31 3.454 l
+59.708 3.454 l
+59.708 3.983 l
+60.31 3.983 l
+60.31 4.939 l
+h
+62.118 2.175 m
+62.118 2.753 62.254 3.208 62.53 3.543 c
+62.812 3.884 63.184 4.056 63.647 4.056 c
+64.106 4.056 64.474 3.888 64.749 3.557 c
+65.032 3.233 65.179 2.786 65.19 2.219 c
+65.19 1.793 l
+65.19 1.224 65.046 0.768 64.764 0.426 c
+64.489 0.092 64.121 -0.073 63.662 -0.073 c
+63.199 -0.073 62.827 0.088 62.544 0.411 c
+62.268 0.742 62.125 1.183 62.118 1.735 c
+h
+62.765 1.793 m
+62.765 1.389 62.842 1.073 63 0.838 c
+63.165 0.603 63.386 0.485 63.662 0.485 c
+64.227 0.485 64.522 0.897 64.543 1.72 c
+64.543 2.175 l
+64.543 2.576 64.458 2.896 64.294 3.131 c
+64.136 3.373 63.919 3.499 63.647 3.499 c
+63.382 3.499 63.165 3.373 63 3.131 c
+62.842 2.896 62.765 2.576 62.765 2.175 c
+h
+67.674 3.366 m
+67.586 3.385 67.487 3.395 67.38 3.395 c
+67.046 3.395 66.81 3.212 66.675 2.851 c
+66.675 0 l
+66.028 0 l
+66.028 3.983 l
+66.66 3.983 l
+66.675 3.572 l
+66.851 3.896 67.094 4.056 67.41 4.056 c
+67.516 4.056 67.604 4.035 67.674 3.998 c
+h
+69.482 1.087 m
+70.203 3.983 l
+70.893 3.983 l
+69.6 -0.559 l
+69.501 -0.9 69.357 -1.161 69.174 -1.338 c
+68.998 -1.514 68.795 -1.602 68.571 -1.602 c
+68.483 -1.602 68.369 -1.58 68.233 -1.544 c
+68.233 -1 l
+68.38 -1.014 l
+68.564 -1.014 68.711 -0.97 68.821 -0.882 c
+68.927 -0.794 69.015 -0.636 69.085 -0.412 c
+69.203 0.029 l
+68.042 3.983 l
+68.747 3.983 l
+h
+71.173 0.353 m
+71.173 0.47 71.205 0.566 71.275 0.646 c
+71.342 0.723 71.444 0.764 71.585 0.764 c
+71.731 0.764 71.838 0.723 71.907 0.646 c
+71.984 0.566 72.025 0.47 72.025 0.353 c
+72.025 0.243 71.984 0.151 71.907 0.073 c
+71.838 -0.004 71.731 -0.044 71.585 -0.044 c
+71.444 -0.044 71.342 -0.004 71.275 0.073 c
+71.205 0.151 71.173 0.243 71.173 0.353 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 232.611 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 225.772 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.807 l
+-1.896 -1.807 l
+-1.896 -1.263 l
+-2.142 -1.256 -2.359 -1.219 -2.543 -1.161 c
+-2.719 -1.102 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.514 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.662 l
+-1.907 0.662 -1.926 0.666 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.132 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.132 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.484 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.368 l
+-1.514 1.368 l
+-1.506 1.368 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.743 -0.132 0.588 c
+-0.044 0.431 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.484 -2.19 2.455 c
+-2.26 2.426 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.191 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.838 -2.439 1.779 c
+-2.41 1.721 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.395 c
+5.284 -2.314 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.219 6.034 -1.219 c
+5.829 -1.219 5.644 -1.183 5.49 -1.102 c
+5.343 -1.014 5.215 -0.897 5.108 -0.749 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.019 4.888 1.235 c
+4.946 1.449 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.919 7.107 1.97 c
+7.115 2.029 7.122 2.077 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.414 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.16 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.743 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.368 c
+5.88 1.279 5.835 1.162 5.799 1.015 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.514 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.603 l
+9.199 1.603 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.603 m
+13.053 1.603 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.603 l
+14.494 1.603 l
+14.494 -0.103 l
+14.494 -0.323 l
+14.501 -0.392 14.523 -0.455 14.552 -0.514 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.675 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.675 c
+15.599 -0.658 15.732 -0.631 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.215 15.703 -1.23 15.626 -1.249 c
+15.545 -1.26 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.3 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.263 c
+14.218 -1.227 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.024 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.631 13.604 -0.544 13.597 -0.455 c
+13.586 -0.359 13.582 -0.264 13.582 -0.176 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.942 -1.205 c
+21.737 -1.117 21.564 -0.995 21.428 -0.837 c
+21.288 -0.683 21.185 -0.496 21.12 -0.278 c
+21.049 -0.055 21.016 0.192 21.016 0.456 c
+21.016 0.75 21.049 1.008 21.12 1.235 c
+21.197 1.459 21.303 1.646 21.442 1.794 c
+21.59 1.948 21.766 2.066 21.972 2.147 c
+22.177 2.234 22.412 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.249 23.28 2.191 c
+23.456 2.132 23.607 2.047 23.736 1.941 c
+23.861 1.842 23.963 1.721 24.044 1.573 c
+24.121 1.434 24.177 1.283 24.206 1.118 c
+23.295 1.073 l
+23.265 1.25 23.196 1.389 23.089 1.5 c
+22.99 1.607 22.846 1.661 22.662 1.661 c
+22.416 1.661 22.24 1.559 22.134 1.353 c
+22.023 1.154 21.972 0.867 21.972 0.485 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.275 23.324 -0.058 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.074 -0.573 c
+24.004 -0.72 23.901 -0.852 23.765 -0.97 c
+23.636 -1.08 23.478 -1.168 23.295 -1.234 c
+23.118 -1.294 22.913 -1.323 22.677 -1.323 c
+28.384 0.485 m
+28.384 0.21 28.347 -0.04 28.281 -0.264 c
+28.212 -0.481 28.108 -0.668 27.973 -0.823 c
+27.833 -0.98 27.657 -1.102 27.443 -1.19 c
+27.227 -1.278 26.973 -1.323 26.679 -1.323 c
+26.404 -1.323 26.157 -1.278 25.944 -1.19 c
+25.739 -1.102 25.566 -0.98 25.43 -0.823 c
+25.29 -0.668 25.187 -0.481 25.121 -0.264 c
+25.051 -0.04 25.018 0.21 25.018 0.485 c
+25.018 0.739 25.047 0.975 25.106 1.191 c
+25.172 1.415 25.275 1.607 25.415 1.764 c
+25.551 1.929 25.727 2.058 25.944 2.147 c
+26.157 2.234 26.414 2.278 26.709 2.278 c
+27.021 2.278 27.281 2.234 27.487 2.147 c
+27.701 2.058 27.873 1.929 28.002 1.764 c
+28.138 1.607 28.237 1.415 28.296 1.191 c
+28.355 0.975 28.384 0.739 28.384 0.485 c
+27.429 0.485 m
+27.429 0.691 27.414 0.867 27.385 1.015 c
+27.362 1.162 27.326 1.283 27.267 1.382 c
+27.208 1.478 27.135 1.548 27.046 1.588 c
+26.959 1.636 26.848 1.661 26.724 1.661 c
+26.458 1.661 26.267 1.563 26.15 1.368 c
+26.032 1.18 25.974 0.886 25.974 0.485 c
+25.974 0.063 26.032 -0.242 26.15 -0.426 c
+26.267 -0.613 26.444 -0.706 26.679 -0.706 c
+26.804 -0.706 26.918 -0.687 27.017 -0.646 c
+27.113 -0.598 27.194 -0.525 27.252 -0.426 c
+27.318 -0.33 27.362 -0.205 27.385 -0.058 c
+27.414 0.088 27.429 0.269 27.429 0.485 c
+30.402 -1.263 m
+30.402 0.853 l
+30.402 1.019 30.394 1.154 30.387 1.264 c
+30.376 1.372 30.358 1.455 30.328 1.515 c
+30.306 1.58 30.277 1.632 30.24 1.661 c
+30.211 1.691 30.17 1.706 30.122 1.706 c
+30.063 1.706 30.009 1.676 29.961 1.617 c
+29.92 1.566 29.887 1.492 29.858 1.397 c
+29.828 1.309 29.803 1.195 29.784 1.058 c
+29.773 0.919 29.77 0.769 29.77 0.603 c
+29.77 -1.263 l
+29.02 -1.263 l
+29.02 1.47 l
+29.02 1.706 l
+29.02 1.926 l
+29.02 2.003 29.012 2.066 29.005 2.117 c
+29.005 2.22 l
+29.681 2.22 l
+29.681 2.132 l
+29.681 1.985 l
+29.689 1.926 29.696 1.867 29.696 1.808 c
+29.696 1.646 l
+29.71 1.646 l
+29.729 1.735 29.758 1.812 29.799 1.881 c
+29.836 1.96 29.88 2.029 29.931 2.087 c
+29.99 2.147 30.057 2.191 30.137 2.22 c
+30.214 2.257 30.302 2.278 30.402 2.278 c
+30.585 2.278 30.725 2.224 30.813 2.117 c
+30.909 2.018 30.979 1.86 31.019 1.646 c
+31.034 1.646 l
+31.071 1.742 31.111 1.831 31.152 1.912 c
+31.199 1.989 31.254 2.051 31.313 2.103 c
+31.372 2.161 31.438 2.205 31.519 2.234 c
+31.596 2.264 31.684 2.278 31.783 2.278 c
+31.919 2.278 32.033 2.253 32.122 2.205 c
+32.21 2.154 32.276 2.08 32.328 1.985 c
+32.386 1.885 32.423 1.757 32.445 1.603 c
+32.474 1.455 32.488 1.272 32.488 1.058 c
+32.488 -1.263 l
+31.769 -1.263 l
+31.769 0.853 l
+31.769 1.019 31.761 1.154 31.754 1.264 c
+31.742 1.372 31.725 1.455 31.695 1.515 c
+31.673 1.58 31.644 1.632 31.607 1.661 c
+31.578 1.691 31.537 1.706 31.489 1.706 c
+31.372 1.706 31.276 1.617 31.21 1.441 c
+31.152 1.272 31.122 1.015 31.122 0.662 c
+31.122 -1.263 l
+h
+34.462 -1.263 m
+34.462 0.853 l
+34.462 1.019 34.455 1.154 34.447 1.264 c
+34.437 1.372 34.418 1.455 34.389 1.515 c
+34.367 1.58 34.337 1.632 34.3 1.661 c
+34.271 1.691 34.231 1.706 34.183 1.706 c
+34.124 1.706 34.069 1.676 34.021 1.617 c
+33.98 1.566 33.948 1.492 33.918 1.397 c
+33.889 1.309 33.863 1.195 33.845 1.058 c
+33.834 0.919 33.83 0.769 33.83 0.603 c
+33.83 -1.263 l
+33.08 -1.263 l
+33.08 1.47 l
+33.08 1.706 l
+33.08 1.926 l
+33.08 2.003 33.074 2.066 33.066 2.117 c
+33.066 2.22 l
+33.742 2.22 l
+33.742 2.132 l
+33.742 1.985 l
+33.749 1.926 33.757 1.867 33.757 1.808 c
+33.757 1.646 l
+33.772 1.646 l
+33.789 1.735 33.82 1.812 33.859 1.881 c
+33.897 1.96 33.94 2.029 33.992 2.087 c
+34.051 2.147 34.117 2.191 34.198 2.22 c
+34.275 2.257 34.363 2.278 34.462 2.278 c
+34.646 2.278 34.786 2.224 34.874 2.117 c
+34.969 2.018 35.039 1.86 35.079 1.646 c
+35.094 1.646 l
+35.131 1.742 35.171 1.831 35.212 1.912 c
+35.26 1.989 35.314 2.051 35.374 2.103 c
+35.432 2.161 35.499 2.205 35.58 2.234 c
+35.657 2.264 35.744 2.278 35.844 2.278 c
+35.98 2.278 36.093 2.253 36.182 2.205 c
+36.27 2.154 36.336 2.08 36.388 1.985 c
+36.446 1.885 36.484 1.757 36.505 1.603 c
+36.535 1.455 36.55 1.272 36.55 1.058 c
+36.55 -1.263 l
+35.829 -1.263 l
+35.829 0.853 l
+35.829 1.019 35.821 1.154 35.815 1.264 c
+35.804 1.372 35.785 1.455 35.756 1.515 c
+35.734 1.58 35.704 1.632 35.667 1.661 c
+35.638 1.691 35.598 1.706 35.55 1.706 c
+35.432 1.706 35.337 1.617 35.27 1.441 c
+35.212 1.272 35.183 1.015 35.183 0.662 c
+35.183 -1.263 l
+h
+39.467 -0.646 m
+40.599 -0.646 l
+40.599 -1.263 l
+37.292 -1.263 l
+37.292 -0.646 l
+38.556 -0.646 l
+38.556 1.603 l
+37.63 1.603 l
+37.63 2.22 l
+39.467 2.22 l
+h
+38.556 3.514 0.911 -0.676 re
+38.556 2.837 m
+42.028 1.603 m
+41.485 1.603 l
+41.485 2.22 l
+42.073 2.22 l
+42.352 3.117 l
+42.925 3.117 l
+42.925 2.22 l
+44.16 2.22 l
+44.16 1.603 l
+42.925 1.603 l
+42.925 -0.103 l
+42.925 -0.323 l
+42.933 -0.392 42.954 -0.455 42.984 -0.514 c
+43.021 -0.565 43.076 -0.61 43.146 -0.646 c
+43.223 -0.675 43.337 -0.691 43.484 -0.691 c
+43.619 -0.691 43.756 -0.687 43.895 -0.675 c
+44.031 -0.658 44.164 -0.631 44.292 -0.602 c
+44.292 -1.205 l
+44.211 -1.215 44.134 -1.23 44.057 -1.249 c
+43.976 -1.26 43.899 -1.267 43.822 -1.278 c
+43.741 -1.286 43.653 -1.294 43.557 -1.294 c
+43.469 -1.3 43.37 -1.308 43.264 -1.308 c
+43.076 -1.308 42.914 -1.294 42.778 -1.263 c
+42.649 -1.227 42.536 -1.183 42.441 -1.132 c
+42.352 -1.084 42.279 -1.024 42.219 -0.955 c
+42.161 -0.878 42.117 -0.801 42.088 -0.72 c
+42.058 -0.631 42.036 -0.544 42.028 -0.455 c
+42.017 -0.359 42.013 -0.264 42.013 -0.176 c
+h
+f
+Q
+q 1 0 0 1 299.9491 211.3232 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.484 -1.323 c
+-0.779 -1.627 -1.198 -1.779 -1.734 -1.779 c
+-2.263 -1.779 -2.69 -1.58 -3.013 -1.176 c
+-3.329 -0.764 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.47 l
+-3.484 2.165 -3.322 2.712 -2.998 3.117 c
+-2.675 3.516 -2.23 3.719 -1.66 3.719 c
+-1.153 3.719 -0.756 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.691 1.926 l
+-0.72 2.367 -0.816 2.679 -0.97 2.866 c
+-1.117 3.05 -1.348 3.146 -1.66 3.146 c
+-2.036 3.146 -2.319 2.999 -2.514 2.705 c
+-2.711 2.418 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.07 -2.715 -0.485 -2.528 -0.779 c
+-2.344 -1.066 -2.08 -1.205 -1.734 -1.205 c
+-1.381 -1.205 -1.128 -1.117 -0.97 -0.941 c
+-0.816 -0.764 -0.72 -0.452 -0.691 0 c
+h
+2.455 1.661 m
+2.367 1.679 2.268 1.691 2.161 1.691 c
+1.827 1.691 1.592 1.507 1.455 1.147 c
+1.455 -1.705 l
+0.809 -1.705 l
+0.809 2.278 l
+1.441 2.278 l
+1.455 1.866 l
+1.632 2.19 1.875 2.352 2.19 2.352 c
+2.297 2.352 2.385 2.33 2.455 2.294 c
+h
+4.454 -1.779 m
+3.954 -1.779 3.572 -1.631 3.308 -1.338 c
+3.043 -1.043 2.911 -0.61 2.911 -0.029 c
+2.911 0.441 l
+2.911 1.037 3.036 1.503 3.293 1.837 c
+3.558 2.18 3.917 2.352 4.381 2.352 c
+4.84 2.352 5.182 2.198 5.409 1.897 c
+5.644 1.602 5.766 1.139 5.777 0.515 c
+5.777 0.088 l
+3.558 0.088 l
+3.558 0 l
+3.558 -0.434 3.635 -0.746 3.793 -0.941 c
+3.958 -1.128 4.189 -1.22 4.484 -1.22 c
+4.678 -1.22 4.851 -1.187 4.998 -1.117 c
+5.145 -1.04 5.281 -0.922 5.409 -0.764 c
+5.748 -1.176 l
+5.461 -1.58 5.031 -1.779 4.454 -1.779 c
+4.381 1.793 m
+4.105 1.793 3.903 1.698 3.778 1.514 c
+3.649 1.326 3.576 1.037 3.558 0.647 c
+5.13 0.647 l
+5.13 0.735 l
+5.108 1.118 5.042 1.386 4.925 1.544 c
+4.807 1.709 4.623 1.793 4.381 1.793 c
+8.599 -1.705 m
+8.559 -1.617 8.533 -1.469 8.526 -1.264 c
+8.291 -1.61 7.996 -1.779 7.643 -1.779 c
+7.28 -1.779 6.997 -1.683 6.791 -1.484 c
+6.593 -1.278 6.498 -0.992 6.498 -0.617 c
+6.498 -0.216 6.633 0.103 6.909 0.338 c
+7.181 0.58 7.556 0.706 8.026 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.456 1.532 8.349 1.631 c
+8.239 1.738 8.077 1.793 7.865 1.793 c
+7.666 1.793 7.504 1.735 7.379 1.617 c
+7.262 1.5 7.203 1.353 7.203 1.176 c
+6.556 1.176 l
+6.556 1.371 6.615 1.562 6.733 1.749 c
+6.857 1.933 7.019 2.08 7.217 2.19 c
+7.423 2.297 7.651 2.352 7.909 2.352 c
+8.309 2.352 8.614 2.249 8.819 2.043 c
+9.033 1.837 9.147 1.544 9.158 1.161 c
+9.158 -0.852 l
+9.158 -1.157 9.195 -1.422 9.276 -1.646 c
+9.276 -1.705 l
+h
+7.732 -1.191 m
+7.897 -1.191 8.048 -1.147 8.187 -1.058 c
+8.335 -0.97 8.441 -0.86 8.511 -0.721 c
+8.511 0.22 l
+8.144 0.22 l
+7.828 0.22 7.585 0.151 7.408 0.015 c
+7.232 -0.114 7.144 -0.301 7.144 -0.544 c
+7.144 -0.771 7.188 -0.937 7.277 -1.043 c
+7.364 -1.143 7.516 -1.191 7.732 -1.191 c
+11.009 3.234 m
+11.009 2.278 l
+11.612 2.278 l
+11.612 1.749 l
+11.009 1.749 l
+11.009 -0.721 l
+11.009 -0.878 11.032 -0.995 11.084 -1.073 c
+11.142 -1.153 11.231 -1.191 11.348 -1.191 c
+11.437 -1.191 11.524 -1.176 11.612 -1.147 c
+11.612 -1.705 l
+11.466 -1.753 11.311 -1.779 11.157 -1.779 c
+10.899 -1.779 10.705 -1.687 10.569 -1.5 c
+10.429 -1.315 10.363 -1.055 10.363 -0.721 c
+10.363 1.749 l
+9.76 1.749 l
+9.76 2.278 l
+10.363 2.278 l
+10.363 3.234 l
+h
+13.803 -1.779 m
+13.303 -1.779 12.921 -1.631 12.656 -1.338 c
+12.391 -1.043 12.26 -0.61 12.26 -0.029 c
+12.26 0.441 l
+12.26 1.037 12.384 1.503 12.642 1.837 c
+12.906 2.18 13.266 2.352 13.729 2.352 c
+14.188 2.352 14.531 2.198 14.758 1.897 c
+14.993 1.602 15.115 1.139 15.125 0.515 c
+15.125 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.307 -1.128 13.538 -1.22 13.832 -1.22 c
+14.027 -1.22 14.199 -1.187 14.346 -1.117 c
+14.494 -1.04 14.629 -0.922 14.758 -0.764 c
+15.096 -1.176 l
+14.81 -1.58 14.379 -1.779 13.803 -1.779 c
+13.729 1.793 m
+13.453 1.793 13.251 1.698 13.126 1.514 c
+12.998 1.326 12.925 1.037 12.906 0.647 c
+14.479 0.647 l
+14.479 0.735 l
+14.457 1.118 14.39 1.386 14.273 1.544 c
+14.155 1.709 13.972 1.793 13.729 1.793 c
+18.242 2.278 m
+18.257 1.837 l
+18.51 2.18 18.834 2.352 19.227 2.352 c
+19.932 2.352 20.289 1.881 20.299 0.941 c
+20.299 -1.705 l
+19.653 -1.705 l
+19.653 0.912 l
+19.653 1.224 19.597 1.444 19.491 1.573 c
+19.381 1.698 19.227 1.764 19.021 1.764 c
+18.863 1.764 18.716 1.709 18.58 1.602 c
+18.452 1.492 18.348 1.357 18.271 1.191 c
+18.271 -1.705 l
+17.625 -1.705 l
+17.625 2.278 l
+h
+22.695 -1.779 m
+22.196 -1.779 21.814 -1.631 21.549 -1.338 c
+21.284 -1.043 21.152 -0.61 21.152 -0.029 c
+21.152 0.441 l
+21.152 1.037 21.278 1.503 21.534 1.837 c
+21.799 2.18 22.159 2.352 22.622 2.352 c
+23.081 2.352 23.423 2.198 23.651 1.897 c
+23.886 1.602 24.008 1.139 24.019 0.515 c
+24.019 0.088 l
+21.799 0.088 l
+21.799 0 l
+21.799 -0.434 21.876 -0.746 22.034 -0.941 c
+22.2 -1.128 22.431 -1.22 22.725 -1.22 c
+22.92 -1.22 23.092 -1.187 23.239 -1.117 c
+23.387 -1.04 23.522 -0.922 23.651 -0.764 c
+23.989 -1.176 l
+23.703 -1.58 23.273 -1.779 22.695 -1.779 c
+22.622 1.793 m
+22.346 1.793 22.144 1.698 22.02 1.514 c
+21.891 1.326 21.818 1.037 21.799 0.647 c
+23.372 0.647 l
+23.372 0.735 l
+23.35 1.118 23.283 1.386 23.166 1.544 c
+23.048 1.709 22.865 1.793 22.622 1.793 c
+27.767 -0.559 m
+28.37 2.278 l
+29.016 2.278 l
+28.031 -1.705 l
+27.517 -1.705 l
+26.738 1.147 l
+25.988 -1.705 l
+25.459 -1.705 l
+24.503 2.278 l
+25.136 2.278 l
+25.753 -0.485 l
+26.488 2.278 l
+27.002 2.278 l
+h
+32.794 -1.22 m
+33.007 -1.22 33.18 -1.157 33.309 -1.029 c
+33.444 -0.893 33.518 -0.702 33.529 -0.455 c
+34.146 -0.455 l
+34.124 -0.838 33.988 -1.157 33.735 -1.411 c
+33.477 -1.658 33.165 -1.779 32.794 -1.779 c
+32.301 -1.779 31.927 -1.627 31.662 -1.323 c
+31.405 -1.01 31.28 -0.544 31.28 0.073 c
+31.28 0.515 l
+31.28 1.11 31.405 1.565 31.662 1.881 c
+31.927 2.194 32.301 2.352 32.794 2.352 c
+33.194 2.352 33.514 2.219 33.749 1.955 c
+33.992 1.698 34.124 1.353 34.146 0.912 c
+33.529 0.912 l
+33.507 1.205 33.433 1.426 33.309 1.573 c
+33.191 1.72 33.018 1.793 32.794 1.793 c
+32.5 1.793 32.283 1.694 32.147 1.5 c
+32.008 1.312 31.934 1.004 31.927 0.573 c
+31.927 0.059 l
+31.927 -0.411 31.993 -0.746 32.133 -0.941 c
+32.28 -1.128 32.5 -1.22 32.794 -1.22 c
+34.763 0.47 m
+34.763 1.047 34.9 1.503 35.175 1.837 c
+35.458 2.18 35.829 2.352 36.292 2.352 c
+36.752 2.352 37.119 2.183 37.394 1.852 c
+37.678 1.529 37.824 1.081 37.836 0.515 c
+37.836 0.088 l
+37.836 -0.482 37.693 -0.937 37.409 -1.278 c
+37.134 -1.613 36.766 -1.779 36.307 -1.779 c
+35.844 -1.779 35.472 -1.617 35.19 -1.294 c
+34.915 -0.962 34.771 -0.522 34.763 0.029 c
+h
+35.41 0.088 m
+35.41 -0.316 35.487 -0.632 35.646 -0.867 c
+35.811 -1.103 36.031 -1.22 36.307 -1.22 c
+36.873 -1.22 37.167 -0.808 37.189 0.015 c
+37.189 0.47 l
+37.189 0.871 37.105 1.191 36.939 1.426 c
+36.781 1.669 36.565 1.793 36.292 1.793 c
+36.027 1.793 35.811 1.669 35.646 1.426 c
+35.487 1.191 35.41 0.871 35.41 0.47 c
+h
+39.291 2.278 m
+39.306 1.911 l
+39.548 2.205 39.868 2.352 40.261 2.352 c
+40.702 2.352 41.011 2.153 41.187 1.764 c
+41.44 2.153 41.79 2.352 42.231 2.352 c
+42.965 2.352 43.341 1.889 43.362 0.97 c
+43.362 -1.705 l
+42.716 -1.705 l
+42.716 0.912 l
+42.716 1.205 42.661 1.419 42.554 1.558 c
+42.455 1.694 42.282 1.764 42.04 1.764 c
+41.841 1.764 41.679 1.683 41.554 1.529 c
+41.437 1.382 41.367 1.191 41.348 0.956 c
+41.348 -1.705 l
+40.687 -1.705 l
+40.687 0.941 l
+40.687 1.488 40.467 1.764 40.026 1.764 c
+39.692 1.764 39.456 1.602 39.32 1.278 c
+39.32 -1.705 l
+38.674 -1.705 l
+38.674 2.278 l
+h
+44.95 2.278 m
+44.965 1.911 l
+45.207 2.205 45.527 2.352 45.92 2.352 c
+46.361 2.352 46.67 2.153 46.846 1.764 c
+47.1 2.153 47.449 2.352 47.89 2.352 c
+48.625 2.352 48.999 1.889 49.022 0.97 c
+49.022 -1.705 l
+48.375 -1.705 l
+48.375 0.912 l
+48.375 1.205 48.32 1.419 48.213 1.558 c
+48.114 1.694 47.941 1.764 47.698 1.764 c
+47.501 1.764 47.339 1.683 47.214 1.529 c
+47.096 1.382 47.027 1.191 47.008 0.956 c
+47.008 -1.705 l
+46.346 -1.705 l
+46.346 0.941 l
+46.346 1.488 46.126 1.764 45.685 1.764 c
+45.35 1.764 45.115 1.602 44.98 1.278 c
+44.98 -1.705 l
+44.332 -1.705 l
+44.332 2.278 l
+h
+50.697 -1.705 -0.647 3.983 re
+50.742 3.322 m
+50.742 3.212 50.712 3.12 50.653 3.042 c
+50.595 2.973 50.499 2.94 50.374 2.94 c
+50.256 2.94 50.161 2.973 50.094 3.042 c
+50.036 3.12 50.007 3.212 50.007 3.322 c
+50.007 3.439 50.036 3.532 50.094 3.601 c
+50.161 3.678 50.256 3.719 50.374 3.719 c
+50.499 3.719 50.595 3.678 50.653 3.601 c
+50.712 3.52 50.742 3.429 50.742 3.322 c
+52.564 3.234 m
+52.564 2.278 l
+53.167 2.278 l
+53.167 1.749 l
+52.564 1.749 l
+52.564 -0.721 l
+52.564 -0.878 52.586 -0.995 52.637 -1.073 c
+52.696 -1.153 52.785 -1.191 52.902 -1.191 c
+52.99 -1.191 53.078 -1.176 53.167 -1.147 c
+53.167 -1.705 l
+53.02 -1.753 52.866 -1.779 52.711 -1.779 c
+52.454 -1.779 52.259 -1.687 52.124 -1.5 c
+51.983 -1.315 51.918 -1.055 51.918 -0.721 c
+51.918 1.749 l
+51.315 1.749 l
+51.315 2.278 l
+51.918 2.278 l
+51.918 3.234 l
+h
+55.945 -1.705 m
+55.945 1.749 l
+55.416 1.749 l
+55.416 2.278 l
+55.945 2.278 l
+55.945 2.734 l
+55.945 3.135 56.041 3.447 56.239 3.675 c
+56.444 3.899 56.724 4.013 57.077 4.013 c
+57.213 4.013 57.345 3.991 57.474 3.954 c
+57.444 3.41 l
+57.345 3.429 57.246 3.439 57.15 3.439 c
+56.775 3.439 56.592 3.175 56.592 2.646 c
+56.592 2.278 l
+57.267 2.278 l
+57.267 1.749 l
+56.592 1.749 l
+56.592 -1.705 l
+h
+59.679 1.661 m
+59.59 1.679 59.491 1.691 59.384 1.691 c
+59.05 1.691 58.815 1.507 58.679 1.147 c
+58.679 -1.705 l
+58.032 -1.705 l
+58.032 2.278 l
+58.664 2.278 l
+58.679 1.866 l
+58.855 2.19 59.098 2.352 59.414 2.352 c
+59.521 2.352 59.609 2.33 59.679 2.294 c
+h
+60.12 0.47 m
+60.12 1.047 60.255 1.503 60.531 1.837 c
+60.814 2.18 61.185 2.352 61.648 2.352 c
+62.108 2.352 62.475 2.183 62.75 1.852 c
+63.033 1.529 63.181 1.081 63.191 0.515 c
+63.191 0.088 l
+63.191 -0.482 63.048 -0.937 62.765 -1.278 c
+62.49 -1.613 62.122 -1.779 61.663 -1.779 c
+61.2 -1.779 60.829 -1.617 60.546 -1.294 c
+60.27 -0.962 60.126 -0.522 60.12 0.029 c
+h
+60.766 0.088 m
+60.766 -0.316 60.843 -0.632 61.001 -0.867 c
+61.167 -1.103 61.387 -1.22 61.663 -1.22 c
+62.229 -1.22 62.522 -0.808 62.545 0.015 c
+62.545 0.47 l
+62.545 0.871 62.46 1.191 62.295 1.426 c
+62.137 1.669 61.92 1.793 61.648 1.793 c
+61.383 1.793 61.167 1.669 61.001 1.426 c
+60.843 1.191 60.766 0.871 60.766 0.47 c
+h
+64.647 2.278 m
+64.662 1.911 l
+64.904 2.205 65.223 2.352 65.617 2.352 c
+66.058 2.352 66.366 2.153 66.543 1.764 c
+66.796 2.153 67.145 2.352 67.586 2.352 c
+68.321 2.352 68.697 1.889 68.718 0.97 c
+68.718 -1.705 l
+68.072 -1.705 l
+68.072 0.912 l
+68.072 1.205 68.016 1.419 67.91 1.558 c
+67.81 1.694 67.638 1.764 67.395 1.764 c
+67.197 1.764 67.035 1.683 66.91 1.529 c
+66.792 1.382 66.723 1.191 66.705 0.956 c
+66.705 -1.705 l
+66.043 -1.705 l
+66.043 0.941 l
+66.043 1.488 65.823 1.764 65.381 1.764 c
+65.047 1.764 64.812 1.602 64.676 1.278 c
+64.676 -1.705 l
+64.03 -1.705 l
+64.03 2.278 l
+h
+72.79 -1.22 m
+73.003 -1.22 73.175 -1.157 73.304 -1.029 c
+73.441 -0.893 73.514 -0.702 73.525 -0.455 c
+74.142 -0.455 l
+74.12 -0.838 73.984 -1.157 73.73 -1.411 c
+73.474 -1.658 73.161 -1.779 72.79 -1.779 c
+72.298 -1.779 71.922 -1.627 71.658 -1.323 c
+71.401 -1.01 71.276 -0.544 71.276 0.073 c
+71.276 0.515 l
+71.276 1.11 71.401 1.565 71.658 1.881 c
+71.922 2.194 72.298 2.352 72.79 2.352 c
+73.19 2.352 73.51 2.219 73.745 1.955 c
+73.988 1.698 74.12 1.353 74.142 0.912 c
+73.525 0.912 l
+73.503 1.205 73.429 1.426 73.304 1.573 c
+73.187 1.72 73.015 1.793 72.79 1.793 c
+72.496 1.793 72.279 1.694 72.143 1.5 c
+72.003 1.312 71.93 1.004 71.922 0.573 c
+71.922 0.059 l
+71.922 -0.411 71.989 -0.746 72.128 -0.941 c
+72.275 -1.128 72.496 -1.22 72.79 -1.22 c
+75.539 1.866 m
+75.793 2.19 76.112 2.352 76.494 2.352 c
+77.2 2.352 77.556 1.881 77.567 0.941 c
+77.567 -1.705 l
+76.92 -1.705 l
+76.92 0.912 l
+76.92 1.224 76.865 1.444 76.759 1.573 c
+76.649 1.698 76.494 1.764 76.288 1.764 c
+76.13 1.764 75.983 1.709 75.847 1.602 c
+75.719 1.492 75.616 1.357 75.539 1.191 c
+75.539 -1.705 l
+74.892 -1.705 l
+74.892 3.94 l
+75.539 3.94 l
+h
+80.566 -1.705 m
+80.525 -1.617 80.5 -1.469 80.492 -1.264 c
+80.257 -1.61 79.963 -1.779 79.61 -1.779 c
+79.247 -1.779 78.964 -1.683 78.758 -1.484 c
+78.559 -1.278 78.464 -0.992 78.464 -0.617 c
+78.464 -0.216 78.6 0.103 78.875 0.338 c
+79.147 0.58 79.523 0.706 79.993 0.706 c
+80.477 0.706 l
+80.477 1.132 l
+80.477 1.367 80.423 1.532 80.316 1.631 c
+80.206 1.738 80.044 1.793 79.831 1.793 c
+79.633 1.793 79.471 1.735 79.346 1.617 c
+79.228 1.5 79.17 1.353 79.17 1.176 c
+78.523 1.176 l
+78.523 1.371 78.582 1.562 78.699 1.749 c
+78.824 1.933 78.985 2.08 79.184 2.19 c
+79.39 2.297 79.618 2.352 79.875 2.352 c
+80.275 2.352 80.581 2.249 80.786 2.043 c
+81 1.837 81.113 1.544 81.125 1.161 c
+81.125 -0.852 l
+81.125 -1.157 81.161 -1.422 81.242 -1.646 c
+81.242 -1.705 l
+h
+79.698 -1.191 m
+79.864 -1.191 80.015 -1.147 80.154 -1.058 c
+80.301 -0.97 80.408 -0.86 80.477 -0.721 c
+80.477 0.22 l
+80.111 0.22 l
+79.794 0.22 79.552 0.151 79.375 0.015 c
+79.199 -0.114 79.111 -0.301 79.111 -0.544 c
+79.111 -0.771 79.155 -0.937 79.243 -1.043 c
+79.331 -1.143 79.482 -1.191 79.698 -1.191 c
+82.741 2.278 m
+82.756 1.837 l
+83.01 2.18 83.333 2.352 83.726 2.352 c
+84.431 2.352 84.788 1.881 84.799 0.941 c
+84.799 -1.705 l
+84.152 -1.705 l
+84.152 0.912 l
+84.152 1.224 84.097 1.444 83.991 1.573 c
+83.88 1.698 83.726 1.764 83.521 1.764 c
+83.363 1.764 83.215 1.709 83.079 1.602 c
+82.951 1.492 82.848 1.357 82.771 1.191 c
+82.771 -1.705 l
+82.124 -1.705 l
+82.124 2.278 l
+h
+85.637 0.47 m
+85.637 1.087 85.747 1.551 85.975 1.866 c
+86.199 2.19 86.534 2.352 86.974 2.352 c
+87.375 2.352 87.68 2.176 87.886 1.823 c
+87.93 2.278 l
+88.518 2.278 l
+88.518 -1.749 l
+88.518 -2.238 88.389 -2.616 88.136 -2.881 c
+87.878 -3.146 87.525 -3.278 87.078 -3.278 c
+86.879 -3.278 86.659 -3.227 86.416 -3.131 c
+86.17 -3.032 85.99 -2.911 85.873 -2.763 c
+86.137 -2.323 l
+86.401 -2.587 86.699 -2.72 87.033 -2.72 c
+87.57 -2.72 87.845 -2.425 87.857 -1.837 c
+87.857 -1.309 l
+87.651 -1.624 87.35 -1.779 86.96 -1.779 c
+86.548 -1.779 86.225 -1.627 85.99 -1.323 c
+85.762 -1.01 85.644 -0.559 85.637 0.029 c
+h
+86.299 0.088 m
+86.299 -0.353 86.361 -0.683 86.49 -0.897 c
+86.615 -1.103 86.831 -1.205 87.136 -1.205 c
+87.46 -1.205 87.699 -1.04 87.857 -0.706 c
+87.857 1.278 l
+87.687 1.602 87.448 1.764 87.136 1.764 c
+86.842 1.764 86.625 1.661 86.49 1.455 c
+86.361 1.249 86.299 0.926 86.299 0.485 c
+h
+90.899 -1.779 m
+90.399 -1.779 90.017 -1.631 89.753 -1.338 c
+89.488 -1.043 89.356 -0.61 89.356 -0.029 c
+89.356 0.441 l
+89.356 1.037 89.481 1.503 89.738 1.837 c
+90.002 2.18 90.363 2.352 90.826 2.352 c
+91.285 2.352 91.627 2.198 91.855 1.897 c
+92.09 1.602 92.211 1.139 92.223 0.515 c
+92.223 0.088 l
+90.002 0.088 l
+90.002 0 l
+90.002 -0.434 90.08 -0.746 90.238 -0.941 c
+90.403 -1.128 90.635 -1.22 90.929 -1.22 c
+91.124 -1.22 91.296 -1.187 91.443 -1.117 c
+91.59 -1.04 91.726 -0.922 91.855 -0.764 c
+92.192 -1.176 l
+91.906 -1.58 91.477 -1.779 90.899 -1.779 c
+90.826 1.793 m
+90.55 1.793 90.348 1.698 90.223 1.514 c
+90.095 1.326 90.021 1.037 90.002 0.647 c
+91.575 0.647 l
+91.575 0.735 l
+91.554 1.118 91.487 1.386 91.369 1.544 c
+91.252 1.709 91.068 1.793 90.826 1.793 c
+94.941 -0.691 m
+94.941 -0.544 94.887 -0.422 94.779 -0.324 c
+94.669 -0.228 94.463 -0.11 94.162 0.029 c
+93.817 0.177 93.574 0.298 93.428 0.397 c
+93.281 0.503 93.17 0.621 93.104 0.75 c
+93.034 0.875 93.001 1.033 93.001 1.22 c
+93.001 1.544 93.119 1.812 93.354 2.028 c
+93.589 2.242 93.89 2.352 94.265 2.352 c
+94.648 2.352 94.956 2.238 95.192 2.014 c
+95.427 1.786 95.544 1.5 95.544 1.147 c
+94.897 1.147 l
+94.897 1.323 94.839 1.474 94.721 1.602 c
+94.604 1.727 94.449 1.793 94.265 1.793 c
+94.067 1.793 93.916 1.738 93.81 1.631 c
+93.699 1.532 93.648 1.4 93.648 1.235 c
+93.648 1.106 93.684 1 93.765 0.912 c
+93.842 0.831 94.033 0.728 94.339 0.603 c
+94.816 0.416 95.147 0.228 95.323 0.044 c
+95.5 -0.133 95.589 -0.36 95.589 -0.632 c
+95.589 -0.985 95.463 -1.264 95.221 -1.469 c
+94.986 -1.675 94.669 -1.779 94.28 -1.779 c
+93.858 -1.779 93.52 -1.661 93.266 -1.426 c
+93.009 -1.183 92.884 -0.878 92.884 -0.515 c
+93.53 -0.515 l
+93.538 -0.742 93.607 -0.918 93.736 -1.043 c
+93.861 -1.161 94.045 -1.22 94.28 -1.22 c
+94.493 -1.22 94.655 -1.172 94.765 -1.073 c
+94.883 -0.977 94.941 -0.849 94.941 -0.691 c
+100.189 -1.705 m
+100.148 -1.617 100.123 -1.469 100.115 -1.264 c
+99.88 -1.61 99.587 -1.779 99.234 -1.779 c
+98.87 -1.779 98.587 -1.683 98.381 -1.484 c
+98.183 -1.278 98.087 -0.992 98.087 -0.617 c
+98.087 -0.216 98.224 0.103 98.498 0.338 c
+98.771 0.58 99.145 0.706 99.616 0.706 c
+100.101 0.706 l
+100.101 1.132 l
+100.101 1.367 100.046 1.532 99.939 1.631 c
+99.829 1.738 99.668 1.793 99.454 1.793 c
+99.256 1.793 99.094 1.735 98.969 1.617 c
+98.851 1.5 98.793 1.353 98.793 1.176 c
+98.145 1.176 l
+98.145 1.371 98.205 1.562 98.322 1.749 c
+98.447 1.933 98.609 2.08 98.808 2.19 c
+99.013 2.297 99.241 2.352 99.498 2.352 c
+99.899 2.352 100.204 2.249 100.41 2.043 c
+100.622 1.837 100.736 1.544 100.748 1.161 c
+100.748 -0.852 l
+100.748 -1.157 100.784 -1.422 100.865 -1.646 c
+100.865 -1.705 l
+h
+99.321 -1.191 m
+99.487 -1.191 99.637 -1.147 99.778 -1.058 c
+99.924 -0.97 100.031 -0.86 100.101 -0.721 c
+100.101 0.22 l
+99.733 0.22 l
+99.417 0.22 99.175 0.151 98.999 0.015 c
+98.822 -0.114 98.733 -0.301 98.733 -0.544 c
+98.733 -0.771 98.778 -0.937 98.866 -1.043 c
+98.954 -1.143 99.105 -1.191 99.321 -1.191 c
+101.615 0.47 m
+101.615 1.077 101.725 1.544 101.953 1.866 c
+102.188 2.19 102.515 2.352 102.938 2.352 c
+103.32 2.352 103.618 2.194 103.834 1.881 c
+103.834 3.94 l
+104.481 3.94 l
+104.481 -1.705 l
+103.893 -1.705 l
+103.849 -1.278 l
+103.643 -1.613 103.338 -1.779 102.938 -1.779 c
+102.526 -1.779 102.203 -1.624 101.968 -1.309 c
+101.732 -0.985 101.615 -0.529 101.615 0.059 c
+h
+102.261 0.088 m
+102.261 -0.353 102.324 -0.683 102.453 -0.897 c
+102.589 -1.103 102.809 -1.205 103.114 -1.205 c
+103.437 -1.205 103.676 -1.043 103.834 -0.721 c
+103.834 1.294 l
+103.666 1.606 103.427 1.764 103.114 1.764 c
+102.809 1.764 102.589 1.661 102.453 1.455 c
+102.324 1.249 102.261 0.926 102.261 0.485 c
+h
+105.349 0.47 m
+105.349 1.077 105.459 1.544 105.686 1.866 c
+105.922 2.19 106.249 2.352 106.671 2.352 c
+107.053 2.352 107.352 2.194 107.568 1.881 c
+107.568 3.94 l
+108.215 3.94 l
+108.215 -1.705 l
+107.627 -1.705 l
+107.583 -1.278 l
+107.377 -1.613 107.072 -1.779 106.671 -1.779 c
+106.259 -1.779 105.937 -1.624 105.701 -1.309 c
+105.466 -0.985 105.349 -0.529 105.349 0.059 c
+h
+105.995 0.088 m
+105.995 -0.353 106.058 -0.683 106.186 -0.897 c
+106.322 -1.103 106.542 -1.205 106.847 -1.205 c
+107.171 -1.205 107.41 -1.043 107.568 -0.721 c
+107.568 1.294 l
+107.399 1.606 107.161 1.764 106.847 1.764 c
+106.542 1.764 106.322 1.661 106.186 1.455 c
+106.058 1.249 105.995 0.926 105.995 0.485 c
+h
+110.64 -1.779 m
+110.14 -1.779 109.758 -1.631 109.494 -1.338 c
+109.229 -1.043 109.097 -0.61 109.097 -0.029 c
+109.097 0.441 l
+109.097 1.037 109.222 1.503 109.479 1.837 c
+109.744 2.18 110.103 2.352 110.567 2.352 c
+111.026 2.352 111.368 2.198 111.595 1.897 c
+111.83 1.602 111.952 1.139 111.963 0.515 c
+111.963 0.088 l
+109.744 0.088 l
+109.744 0 l
+109.744 -0.434 109.821 -0.746 109.979 -0.941 c
+110.144 -1.128 110.375 -1.22 110.669 -1.22 c
+110.864 -1.22 111.037 -1.187 111.184 -1.117 c
+111.331 -1.04 111.467 -0.922 111.595 -0.764 c
+111.934 -1.176 l
+111.647 -1.58 111.217 -1.779 110.64 -1.779 c
+110.567 1.793 m
+110.291 1.793 110.089 1.698 109.964 1.514 c
+109.835 1.326 109.762 1.037 109.744 0.647 c
+111.316 0.647 l
+111.316 0.735 l
+111.294 1.118 111.228 1.386 111.111 1.544 c
+110.993 1.709 110.809 1.793 110.567 1.793 c
+112.609 0.47 m
+112.609 1.077 112.72 1.544 112.948 1.866 c
+113.183 2.19 113.511 2.352 113.933 2.352 c
+114.315 2.352 114.612 2.194 114.829 1.881 c
+114.829 3.94 l
+115.476 3.94 l
+115.476 -1.705 l
+114.888 -1.705 l
+114.844 -1.278 l
+114.638 -1.613 114.333 -1.779 113.933 -1.779 c
+113.521 -1.779 113.197 -1.624 112.962 -1.309 c
+112.727 -0.985 112.609 -0.529 112.609 0.059 c
+h
+113.257 0.088 m
+113.257 -0.353 113.319 -0.683 113.448 -0.897 c
+113.584 -1.103 113.804 -1.205 114.109 -1.205 c
+114.432 -1.205 114.671 -1.043 114.829 -0.721 c
+114.829 1.294 l
+114.66 1.606 114.421 1.764 114.109 1.764 c
+113.804 1.764 113.584 1.661 113.448 1.455 c
+113.319 1.249 113.257 0.926 113.257 0.485 c
+h
+119.048 3.234 m
+119.048 2.278 l
+119.651 2.278 l
+119.651 1.749 l
+119.048 1.749 l
+119.048 -0.721 l
+119.048 -0.878 119.07 -0.995 119.121 -1.073 c
+119.18 -1.153 119.269 -1.191 119.386 -1.191 c
+119.474 -1.191 119.562 -1.176 119.651 -1.147 c
+119.651 -1.705 l
+119.504 -1.753 119.35 -1.779 119.194 -1.779 c
+118.938 -1.779 118.743 -1.687 118.607 -1.5 c
+118.467 -1.315 118.401 -1.055 118.401 -0.721 c
+118.401 1.749 l
+117.798 1.749 l
+117.798 2.278 l
+118.401 2.278 l
+118.401 3.234 l
+h
+120.21 0.47 m
+120.21 1.047 120.345 1.503 120.621 1.837 c
+120.904 2.18 121.274 2.352 121.738 2.352 c
+122.197 2.352 122.564 2.183 122.84 1.852 c
+123.123 1.529 123.27 1.081 123.281 0.515 c
+123.281 0.088 l
+123.281 -0.482 123.138 -0.937 122.855 -1.278 c
+122.579 -1.613 122.212 -1.779 121.752 -1.779 c
+121.29 -1.779 120.918 -1.617 120.636 -1.294 c
+120.36 -0.962 120.216 -0.522 120.21 0.029 c
+h
+120.856 0.088 m
+120.856 -0.316 120.933 -0.632 121.091 -0.867 c
+121.257 -1.103 121.477 -1.22 121.752 -1.22 c
+122.319 -1.22 122.612 -0.808 122.635 0.015 c
+122.635 0.47 l
+122.635 0.871 122.55 1.191 122.385 1.426 c
+122.227 1.669 122.01 1.793 121.738 1.793 c
+121.473 1.793 121.257 1.669 121.091 1.426 c
+120.933 1.191 120.856 0.871 120.856 0.47 c
+h
+126.691 3.234 m
+126.691 2.278 l
+127.294 2.278 l
+127.294 1.749 l
+126.691 1.749 l
+126.691 -0.721 l
+126.691 -0.878 126.714 -0.995 126.765 -1.073 c
+126.824 -1.153 126.912 -1.191 127.03 -1.191 c
+127.117 -1.191 127.206 -1.176 127.294 -1.147 c
+127.294 -1.705 l
+127.147 -1.753 126.993 -1.779 126.838 -1.779 c
+126.581 -1.779 126.386 -1.687 126.25 -1.5 c
+126.111 -1.315 126.045 -1.055 126.045 -0.721 c
+126.045 1.749 l
+125.442 1.749 l
+125.442 2.278 l
+126.045 2.278 l
+126.045 3.234 l
+h
+128.705 1.866 m
+128.958 2.19 129.278 2.352 129.66 2.352 c
+130.366 2.352 130.722 1.881 130.734 0.941 c
+130.734 -1.705 l
+130.087 -1.705 l
+130.087 0.912 l
+130.087 1.224 130.032 1.444 129.926 1.573 c
+129.815 1.698 129.66 1.764 129.455 1.764 c
+129.297 1.764 129.149 1.709 129.014 1.602 c
+128.885 1.492 128.783 1.357 128.705 1.191 c
+128.705 -1.705 l
+128.058 -1.705 l
+128.058 3.94 l
+128.705 3.94 l
+h
+133.115 -1.779 m
+132.615 -1.779 132.233 -1.631 131.969 -1.338 c
+131.703 -1.043 131.572 -0.61 131.572 -0.029 c
+131.572 0.441 l
+131.572 1.037 131.697 1.503 131.954 1.837 c
+132.218 2.18 132.578 2.352 133.041 2.352 c
+133.501 2.352 133.843 2.198 134.07 1.897 c
+134.306 1.602 134.427 1.139 134.438 0.515 c
+134.438 0.088 l
+132.218 0.088 l
+132.218 0 l
+132.218 -0.434 132.295 -0.746 132.453 -0.941 c
+132.619 -1.128 132.85 -1.22 133.145 -1.22 c
+133.339 -1.22 133.512 -1.187 133.658 -1.117 c
+133.806 -1.04 133.942 -0.922 134.07 -0.764 c
+134.408 -1.176 l
+134.122 -1.58 133.692 -1.779 133.115 -1.779 c
+133.041 1.793 m
+132.766 1.793 132.563 1.698 132.439 1.514 c
+132.31 1.326 132.237 1.037 132.218 0.647 c
+133.791 0.647 l
+133.791 0.735 l
+133.769 1.118 133.703 1.386 133.585 1.544 c
+133.467 1.709 133.284 1.793 133.041 1.793 c
+138.877 -0.691 m
+138.877 -0.544 138.822 -0.422 138.715 -0.324 c
+138.605 -0.228 138.4 -0.11 138.098 0.029 c
+137.752 0.177 137.51 0.298 137.363 0.397 c
+137.216 0.503 137.106 0.621 137.039 0.75 c
+136.97 0.875 136.937 1.033 136.937 1.22 c
+136.937 1.544 137.054 1.812 137.29 2.028 c
+137.525 2.242 137.826 2.352 138.201 2.352 c
+138.583 2.352 138.892 2.238 139.127 2.014 c
+139.362 1.786 139.48 1.5 139.48 1.147 c
+138.832 1.147 l
+138.832 1.323 138.774 1.474 138.656 1.602 c
+138.539 1.727 138.385 1.793 138.201 1.793 c
+138.003 1.793 137.851 1.738 137.745 1.631 c
+137.635 1.532 137.583 1.4 137.583 1.235 c
+137.583 1.106 137.62 1 137.701 0.912 c
+137.778 0.831 137.97 0.728 138.275 0.603 c
+138.752 0.416 139.083 0.228 139.259 0.044 c
+139.435 -0.133 139.524 -0.36 139.524 -0.632 c
+139.524 -0.985 139.399 -1.264 139.156 -1.469 c
+138.921 -1.675 138.605 -1.779 138.215 -1.779 c
+137.793 -1.779 137.455 -1.661 137.201 -1.426 c
+136.944 -1.183 136.819 -0.878 136.819 -0.515 c
+137.466 -0.515 l
+137.473 -0.742 137.543 -0.918 137.672 -1.043 c
+137.797 -1.161 137.98 -1.22 138.215 -1.22 c
+138.429 -1.22 138.591 -1.172 138.701 -1.073 c
+138.818 -0.977 138.877 -0.849 138.877 -0.691 c
+141.214 3.234 m
+141.214 2.278 l
+141.816 2.278 l
+141.816 1.749 l
+141.214 1.749 l
+141.214 -0.721 l
+141.214 -0.878 141.236 -0.995 141.288 -1.073 c
+141.346 -1.153 141.435 -1.191 141.552 -1.191 c
+141.641 -1.191 141.729 -1.176 141.816 -1.147 c
+141.816 -1.705 l
+141.67 -1.753 141.515 -1.779 141.361 -1.779 c
+141.104 -1.779 140.909 -1.687 140.773 -1.5 c
+140.634 -1.315 140.567 -1.055 140.567 -0.721 c
+140.567 1.749 l
+139.965 1.749 l
+139.965 2.278 l
+140.567 2.278 l
+140.567 3.234 l
+h
+144.625 -1.705 m
+144.584 -1.617 144.558 -1.469 144.551 -1.264 c
+144.316 -1.61 144.022 -1.779 143.669 -1.779 c
+143.305 -1.779 143.022 -1.683 142.816 -1.484 c
+142.618 -1.278 142.522 -0.992 142.522 -0.617 c
+142.522 -0.216 142.658 0.103 142.934 0.338 c
+143.206 0.58 143.58 0.706 144.051 0.706 c
+144.536 0.706 l
+144.536 1.132 l
+144.536 1.367 144.481 1.532 144.374 1.631 c
+144.264 1.738 144.102 1.793 143.889 1.793 c
+143.691 1.793 143.53 1.735 143.404 1.617 c
+143.287 1.5 143.228 1.353 143.228 1.176 c
+142.581 1.176 l
+142.581 1.371 142.64 1.562 142.757 1.749 c
+142.882 1.933 143.044 2.08 143.243 2.19 c
+143.449 2.297 143.676 2.352 143.933 2.352 c
+144.334 2.352 144.639 2.249 144.845 2.043 c
+145.058 1.837 145.172 1.544 145.182 1.161 c
+145.182 -0.852 l
+145.182 -1.157 145.22 -1.422 145.3 -1.646 c
+145.3 -1.705 l
+h
+143.757 -1.191 m
+143.923 -1.191 144.073 -1.147 144.213 -1.058 c
+144.359 -0.97 144.466 -0.86 144.536 -0.721 c
+144.536 0.22 l
+144.168 0.22 l
+143.852 0.22 143.61 0.151 143.434 0.015 c
+143.258 -0.114 143.169 -0.301 143.169 -0.544 c
+143.169 -0.771 143.213 -0.937 143.301 -1.043 c
+143.389 -1.143 143.54 -1.191 143.757 -1.191 c
+146.05 0.47 m
+146.05 1.087 146.161 1.551 146.388 1.866 c
+146.612 2.19 146.946 2.352 147.388 2.352 c
+147.788 2.352 148.093 2.176 148.299 1.823 c
+148.343 2.278 l
+148.931 2.278 l
+148.931 -1.749 l
+148.931 -2.238 148.802 -2.616 148.549 -2.881 c
+148.292 -3.146 147.939 -3.278 147.491 -3.278 c
+147.292 -3.278 147.071 -3.227 146.829 -3.131 c
+146.583 -3.032 146.403 -2.911 146.285 -2.763 c
+146.55 -2.323 l
+146.815 -2.587 147.112 -2.72 147.447 -2.72 c
+147.983 -2.72 148.259 -2.425 148.27 -1.837 c
+148.27 -1.309 l
+148.064 -1.624 147.763 -1.779 147.373 -1.779 c
+146.961 -1.779 146.638 -1.627 146.403 -1.323 c
+146.175 -1.01 146.057 -0.559 146.05 0.029 c
+h
+146.711 0.088 m
+146.711 -0.353 146.774 -0.683 146.903 -0.897 c
+147.027 -1.103 147.245 -1.205 147.549 -1.205 c
+147.873 -1.205 148.112 -1.04 148.27 -0.706 c
+148.27 1.278 l
+148.101 1.602 147.862 1.764 147.549 1.764 c
+147.256 1.764 147.038 1.661 146.903 1.455 c
+146.774 1.249 146.711 0.926 146.711 0.485 c
+h
+150.592 -1.705 -0.646 3.983 re
+150.636 3.322 m
+150.636 3.212 150.607 3.12 150.548 3.042 c
+150.489 2.973 150.394 2.94 150.269 2.94 c
+150.151 2.94 150.055 2.973 149.99 3.042 c
+149.93 3.12 149.901 3.212 149.901 3.322 c
+149.901 3.439 149.93 3.532 149.99 3.601 c
+150.055 3.678 150.151 3.719 150.269 3.719 c
+150.394 3.719 150.489 3.678 150.548 3.601 c
+150.607 3.52 150.636 3.429 150.636 3.322 c
+152.224 2.278 m
+152.238 1.837 l
+152.492 2.18 152.816 2.352 153.209 2.352 c
+153.914 2.352 154.271 1.881 154.281 0.941 c
+154.281 -1.705 l
+153.635 -1.705 l
+153.635 0.912 l
+153.635 1.224 153.579 1.444 153.473 1.573 c
+153.363 1.698 153.209 1.764 153.003 1.764 c
+152.845 1.764 152.698 1.709 152.562 1.602 c
+152.433 1.492 152.33 1.357 152.253 1.191 c
+152.253 -1.705 l
+151.607 -1.705 l
+151.607 2.278 l
+h
+155.119 0.47 m
+155.119 1.087 155.23 1.551 155.457 1.866 c
+155.682 2.19 156.016 2.352 156.457 2.352 c
+156.858 2.352 157.163 2.176 157.369 1.823 c
+157.412 2.278 l
+158 2.278 l
+158 -1.749 l
+158 -2.238 157.872 -2.616 157.618 -2.881 c
+157.361 -3.146 157.008 -3.278 156.56 -3.278 c
+156.361 -3.278 156.141 -3.227 155.898 -3.131 c
+155.652 -3.032 155.472 -2.911 155.355 -2.763 c
+155.619 -2.323 l
+155.883 -2.587 156.182 -2.72 156.516 -2.72 c
+157.053 -2.72 157.328 -2.425 157.339 -1.837 c
+157.339 -1.309 l
+157.134 -1.624 156.832 -1.779 156.442 -1.779 c
+156.031 -1.779 155.707 -1.627 155.472 -1.323 c
+155.245 -1.01 155.127 -0.559 155.119 0.029 c
+h
+155.781 0.088 m
+155.781 -0.353 155.844 -0.683 155.972 -0.897 c
+156.097 -1.103 156.314 -1.205 156.619 -1.205 c
+156.942 -1.205 157.181 -1.04 157.339 -0.706 c
+157.339 1.278 l
+157.17 1.602 156.931 1.764 156.619 1.764 c
+156.325 1.764 156.108 1.661 155.972 1.455 c
+155.844 1.249 155.781 0.926 155.781 0.485 c
+h
+162.719 -1.705 m
+162.678 -1.617 162.653 -1.469 162.645 -1.264 c
+162.41 -1.61 162.116 -1.779 161.763 -1.779 c
+161.4 -1.779 161.117 -1.683 160.911 -1.484 c
+160.712 -1.278 160.617 -0.992 160.617 -0.617 c
+160.617 -0.216 160.753 0.103 161.028 0.338 c
+161.3 0.58 161.675 0.706 162.146 0.706 c
+162.63 0.706 l
+162.63 1.132 l
+162.63 1.367 162.576 1.532 162.469 1.631 c
+162.358 1.738 162.197 1.793 161.984 1.793 c
+161.786 1.793 161.624 1.735 161.499 1.617 c
+161.381 1.5 161.323 1.353 161.323 1.176 c
+160.675 1.176 l
+160.675 1.371 160.735 1.562 160.852 1.749 c
+160.977 1.933 161.138 2.08 161.337 2.19 c
+161.543 2.297 161.77 2.352 162.028 2.352 c
+162.429 2.352 162.734 2.249 162.939 2.043 c
+163.152 1.837 163.266 1.544 163.278 1.161 c
+163.278 -0.852 l
+163.278 -1.157 163.314 -1.422 163.395 -1.646 c
+163.395 -1.705 l
+h
+161.851 -1.191 m
+162.017 -1.191 162.167 -1.147 162.308 -1.058 c
+162.454 -0.97 162.561 -0.86 162.63 -0.721 c
+162.63 0.22 l
+162.263 0.22 l
+161.947 0.22 161.705 0.151 161.528 0.015 c
+161.352 -0.114 161.263 -0.301 161.263 -0.544 c
+161.263 -0.771 161.308 -0.937 161.396 -1.043 c
+161.484 -1.143 161.635 -1.191 161.851 -1.191 c
+165.923 1.661 m
+165.835 1.679 165.736 1.691 165.629 1.691 c
+165.294 1.691 165.059 1.507 164.924 1.147 c
+164.924 -1.705 l
+164.277 -1.705 l
+164.277 2.278 l
+164.909 2.278 l
+164.924 1.866 l
+165.1 2.19 165.342 2.352 165.659 2.352 c
+165.765 2.352 165.853 2.33 165.923 2.294 c
+h
+167.922 -1.779 m
+167.422 -1.779 167.04 -1.631 166.776 -1.338 c
+166.511 -1.043 166.379 -0.61 166.379 -0.029 c
+166.379 0.441 l
+166.379 1.037 166.504 1.503 166.761 1.837 c
+167.025 2.18 167.386 2.352 167.849 2.352 c
+168.309 2.352 168.65 2.198 168.878 1.897 c
+169.113 1.602 169.234 1.139 169.246 0.515 c
+169.246 0.088 l
+167.025 0.088 l
+167.025 0 l
+167.025 -0.434 167.103 -0.746 167.261 -0.941 c
+167.426 -1.128 167.658 -1.22 167.952 -1.22 c
+168.147 -1.22 168.319 -1.187 168.466 -1.117 c
+168.613 -1.04 168.749 -0.922 168.878 -0.764 c
+169.215 -1.176 l
+168.929 -1.58 168.5 -1.779 167.922 -1.779 c
+167.849 1.793 m
+167.573 1.793 167.371 1.698 167.246 1.514 c
+167.118 1.326 167.044 1.037 167.025 0.647 c
+168.598 0.647 l
+168.598 0.735 l
+168.577 1.118 168.51 1.386 168.392 1.544 c
+168.275 1.709 168.091 1.793 167.849 1.793 c
+172.068 -1.705 m
+172.027 -1.617 172.001 -1.469 171.993 -1.264 c
+171.758 -1.61 171.465 -1.779 171.112 -1.779 c
+170.748 -1.779 170.465 -1.683 170.26 -1.484 c
+170.061 -1.278 169.965 -0.992 169.965 -0.617 c
+169.965 -0.216 170.102 0.103 170.377 0.338 c
+170.649 0.58 171.024 0.706 171.494 0.706 c
+171.979 0.706 l
+171.979 1.132 l
+171.979 1.367 171.924 1.532 171.818 1.631 c
+171.707 1.738 171.546 1.793 171.332 1.793 c
+171.134 1.793 170.973 1.735 170.848 1.617 c
+170.73 1.5 170.671 1.353 170.671 1.176 c
+170.025 1.176 l
+170.025 1.371 170.083 1.562 170.2 1.749 c
+170.326 1.933 170.487 2.08 170.686 2.19 c
+170.892 2.297 171.12 2.352 171.376 2.352 c
+171.777 2.352 172.082 2.249 172.288 2.043 c
+172.501 1.837 172.615 1.544 172.626 1.161 c
+172.626 -0.852 l
+172.626 -1.157 172.662 -1.422 172.743 -1.646 c
+172.743 -1.705 l
+h
+171.2 -1.191 m
+171.366 -1.191 171.517 -1.147 171.656 -1.058 c
+171.803 -0.97 171.91 -0.86 171.979 -0.721 c
+171.979 0.22 l
+171.612 0.22 l
+171.295 0.22 171.053 0.151 170.877 0.015 c
+170.7 -0.114 170.612 -0.301 170.612 -0.544 c
+170.612 -0.771 170.657 -0.937 170.744 -1.043 c
+170.833 -1.143 170.983 -1.191 171.2 -1.191 c
+173.67 -1.352 m
+173.67 -1.234 173.703 -1.139 173.772 -1.058 c
+173.838 -0.981 173.942 -0.941 174.081 -0.941 c
+174.228 -0.941 174.335 -0.981 174.405 -1.058 c
+174.482 -1.139 174.522 -1.234 174.522 -1.352 c
+174.522 -1.463 174.482 -1.554 174.405 -1.631 c
+174.335 -1.708 174.228 -1.749 174.081 -1.749 c
+173.942 -1.749 173.838 -1.708 173.772 -1.631 c
+173.703 -1.554 173.67 -1.463 173.67 -1.352 c
+180.784 0 m
+180.755 -0.58 180.593 -1.022 180.299 -1.323 c
+180.005 -1.627 179.586 -1.779 179.049 -1.779 c
+178.52 -1.779 178.094 -1.58 177.771 -1.176 c
+177.454 -0.764 177.3 -0.206 177.3 0.5 c
+177.3 1.47 l
+177.3 2.165 177.462 2.712 177.786 3.117 c
+178.108 3.516 178.553 3.719 179.123 3.719 c
+179.63 3.719 180.027 3.561 180.313 3.248 c
+180.597 2.944 180.755 2.502 180.784 1.926 c
+180.093 1.926 l
+180.064 2.367 179.968 2.679 179.814 2.866 c
+179.667 3.05 179.436 3.146 179.123 3.146 c
+178.748 3.146 178.465 2.999 178.27 2.705 c
+178.072 2.418 177.977 2.003 177.977 1.455 c
+177.977 0.47 l
+177.977 -0.07 178.068 -0.485 178.256 -0.779 c
+178.439 -1.066 178.704 -1.205 179.049 -1.205 c
+179.402 -1.205 179.656 -1.117 179.814 -0.941 c
+179.968 -0.764 180.064 -0.452 180.093 0 c
+h
+181.46 0.47 m
+181.46 1.047 181.596 1.503 181.871 1.837 c
+182.154 2.18 182.526 2.352 182.989 2.352 c
+183.448 2.352 183.816 2.183 184.091 1.852 c
+184.375 1.529 184.521 1.081 184.533 0.515 c
+184.533 0.088 l
+184.533 -0.482 184.389 -0.937 184.105 -1.278 c
+183.831 -1.613 183.463 -1.779 183.004 -1.779 c
+182.54 -1.779 182.169 -1.617 181.886 -1.294 c
+181.611 -0.962 181.468 -0.522 181.46 0.029 c
+h
+182.106 0.088 m
+182.106 -0.316 182.185 -0.632 182.342 -0.867 c
+182.507 -1.103 182.728 -1.22 183.004 -1.22 c
+183.569 -1.22 183.864 -0.808 183.885 0.015 c
+183.885 0.47 l
+183.885 0.871 183.801 1.191 183.635 1.426 c
+183.477 1.669 183.261 1.793 182.989 1.793 c
+182.724 1.793 182.507 1.669 182.342 1.426 c
+182.185 1.191 182.106 0.871 182.106 0.47 c
+h
+185.987 2.278 m
+186.002 1.911 l
+186.245 2.205 186.565 2.352 186.958 2.352 c
+187.398 2.352 187.708 2.153 187.884 1.764 c
+188.138 2.153 188.487 2.352 188.927 2.352 c
+189.662 2.352 190.037 1.889 190.059 0.97 c
+190.059 -1.705 l
+189.412 -1.705 l
+189.412 0.912 l
+189.412 1.205 189.357 1.419 189.25 1.558 c
+189.152 1.694 188.979 1.764 188.736 1.764 c
+188.537 1.764 188.376 1.683 188.251 1.529 c
+188.134 1.382 188.064 1.191 188.045 0.956 c
+188.045 -1.705 l
+187.384 -1.705 l
+187.384 0.941 l
+187.384 1.488 187.163 1.764 186.723 1.764 c
+186.388 1.764 186.153 1.602 186.017 1.278 c
+186.017 -1.705 l
+185.37 -1.705 l
+185.37 2.278 l
+h
+191.646 2.278 m
+191.662 1.911 l
+191.904 2.205 192.223 2.352 192.616 2.352 c
+193.058 2.352 193.366 2.153 193.543 1.764 c
+193.796 2.153 194.145 2.352 194.586 2.352 c
+195.321 2.352 195.696 1.889 195.718 0.97 c
+195.718 -1.705 l
+195.072 -1.705 l
+195.072 0.912 l
+195.072 1.205 195.016 1.419 194.91 1.558 c
+194.81 1.694 194.638 1.764 194.395 1.764 c
+194.197 1.764 194.035 1.683 193.91 1.529 c
+193.792 1.382 193.723 1.191 193.705 0.956 c
+193.705 -1.705 l
+193.043 -1.705 l
+193.043 0.941 l
+193.043 1.488 192.822 1.764 192.381 1.764 c
+192.047 1.764 191.812 1.602 191.676 1.278 c
+191.676 -1.705 l
+191.029 -1.705 l
+191.029 2.278 l
+h
+197.393 -1.705 -0.646 3.983 re
+197.438 3.322 m
+197.438 3.212 197.408 3.12 197.35 3.042 c
+197.291 2.973 197.196 2.94 197.071 2.94 c
+196.953 2.94 196.857 2.973 196.791 3.042 c
+196.732 3.12 196.703 3.212 196.703 3.322 c
+196.703 3.439 196.732 3.532 196.791 3.601 c
+196.857 3.678 196.953 3.719 197.071 3.719 c
+197.196 3.719 197.291 3.678 197.35 3.601 c
+197.408 3.52 197.438 3.429 197.438 3.322 c
+199.261 3.234 m
+199.261 2.278 l
+199.863 2.278 l
+199.863 1.749 l
+199.261 1.749 l
+199.261 -0.721 l
+199.261 -0.878 199.282 -0.995 199.334 -1.073 c
+199.392 -1.153 199.481 -1.191 199.599 -1.191 c
+199.687 -1.191 199.775 -1.176 199.863 -1.147 c
+199.863 -1.705 l
+199.716 -1.753 199.562 -1.779 199.408 -1.779 c
+199.151 -1.779 198.956 -1.687 198.82 -1.5 c
+198.68 -1.315 198.614 -1.055 198.614 -0.721 c
+198.614 1.749 l
+198.012 1.749 l
+198.012 2.278 l
+198.614 2.278 l
+198.614 3.234 l
+h
+f
+Q
+q 1 0 0 1 503.1638 213.6016 cm
+0 0 m
+0.029 -0.368 l
+0.264 -0.073 0.573 0.073 0.956 0.073 c
+1.356 0.073 1.635 -0.11 1.793 -0.47 c
+2.028 -0.11 2.356 0.073 2.778 0.073 c
+3.472 0.073 3.825 -0.412 3.836 -1.382 c
+3.836 -3.983 l
+2.807 -3.983 l
+2.807 -1.44 l
+2.807 -1.216 2.77 -1.055 2.705 -0.956 c
+2.645 -0.86 2.535 -0.808 2.381 -0.808 c
+2.182 -0.808 2.043 -0.926 1.955 -1.161 c
+1.955 -3.983 l
+0.912 -3.983 l
+0.912 -1.455 l
+0.912 -1.22 0.881 -1.055 0.823 -0.956 c
+0.764 -0.86 0.654 -0.808 0.499 -0.808 c
+0.324 -0.808 0.18 -0.904 0.073 -1.087 c
+0.073 -3.983 l
+-0.97 -3.983 l
+-0.97 0 l
+h
+6.57 -3.616 m
+6.354 -3.91 6.063 -4.057 5.703 -4.057 c
+5.34 -4.057 5.06 -3.936 4.866 -3.69 c
+4.678 -3.436 4.586 -3.069 4.586 -2.587 c
+4.586 0 l
+5.629 0 l
+5.629 -2.602 l
+5.629 -2.995 5.754 -3.19 6.012 -3.19 c
+6.247 -3.19 6.416 -3.087 6.526 -2.881 c
+6.526 0 l
+7.57 0 l
+7.57 -3.983 l
+6.6 -3.983 l
+h
+10.084 -2.911 m
+10.084 -2.822 10.04 -2.745 9.951 -2.675 c
+9.863 -2.598 9.675 -2.495 9.392 -2.367 c
+8.959 -2.19 8.661 -2.01 8.496 -1.823 c
+8.338 -1.639 8.261 -1.407 8.261 -1.132 c
+8.261 -0.79 8.382 -0.507 8.628 -0.279 c
+8.882 -0.044 9.22 0.073 9.643 0.073 c
+10.073 0.073 10.421 -0.04 10.686 -0.264 c
+10.951 -0.492 11.083 -0.794 11.083 -1.176 c
+10.04 -1.176 l
+10.04 -0.852 9.899 -0.69 9.628 -0.69 c
+9.517 -0.69 9.429 -0.727 9.363 -0.794 c
+9.294 -0.864 9.261 -0.962 9.261 -1.087 c
+9.261 -1.176 9.297 -1.257 9.378 -1.323 c
+9.455 -1.382 9.635 -1.477 9.922 -1.602 c
+10.352 -1.76 10.649 -1.937 10.819 -2.132 c
+10.994 -2.319 11.083 -2.568 11.083 -2.881 c
+11.083 -3.234 10.951 -3.52 10.686 -3.734 c
+10.421 -3.95 10.073 -4.057 9.643 -4.057 c
+9.348 -4.057 9.088 -4.002 8.864 -3.896 c
+8.636 -3.778 8.459 -3.616 8.334 -3.41 c
+8.216 -3.204 8.158 -2.984 8.158 -2.749 c
+9.143 -2.749 l
+9.143 -2.936 9.18 -3.072 9.261 -3.16 c
+9.348 -3.248 9.481 -3.293 9.658 -3.293 c
+9.94 -3.293 10.084 -3.167 10.084 -2.911 c
+12.95 0.97 m
+12.95 0 l
+13.479 0 l
+13.479 -0.794 l
+12.95 -0.794 l
+12.95 -2.764 l
+12.95 -2.921 12.968 -3.028 13.008 -3.087 c
+13.057 -3.146 13.141 -3.175 13.259 -3.175 c
+13.365 -3.175 13.45 -3.167 13.508 -3.146 c
+13.508 -3.954 l
+13.332 -4.02 13.141 -4.057 12.935 -4.057 c
+12.259 -4.057 11.913 -3.671 11.906 -2.896 c
+11.906 -0.794 l
+11.451 -0.794 l
+11.451 0 l
+11.906 0 l
+11.906 0.97 l
+h
+f
+Q
+q 1 0 0 1 468.3414 203.8415 cm
+0 0 m
+0.225 0.283 0.5 0.426 0.823 0.426 c
+1.183 0.426 1.459 0.297 1.646 0.044 c
+1.841 -0.214 1.941 -0.595 1.941 -1.103 c
+1.941 -3.63 l
+0.897 -3.63 l
+0.897 -1.118 l
+0.897 -0.882 0.857 -0.717 0.779 -0.617 c
+0.709 -0.511 0.595 -0.455 0.441 -0.455 c
+0.254 -0.455 0.107 -0.54 0 -0.706 c
+0 -3.63 l
+-1.043 -3.63 l
+-1.043 2.014 l
+0 2.014 l
+h
+4.572 -3.63 m
+4.542 -3.572 4.513 -3.469 4.484 -3.322 c
+4.296 -3.58 4.046 -3.705 3.734 -3.705 c
+3.4 -3.705 3.12 -3.597 2.896 -3.381 c
+2.679 -3.156 2.573 -2.866 2.573 -2.514 c
+2.573 -2.102 2.705 -1.786 2.97 -1.558 c
+3.234 -1.323 3.616 -1.205 4.116 -1.205 c
+4.439 -1.205 l
+4.439 -0.882 l
+4.439 -0.706 4.403 -0.584 4.337 -0.515 c
+4.278 -0.437 4.189 -0.397 4.072 -0.397 c
+3.815 -0.397 3.69 -0.551 3.69 -0.852 c
+2.646 -0.852 l
+2.646 -0.482 2.782 -0.177 3.057 0.058 c
+3.329 0.301 3.679 0.426 4.102 0.426 c
+4.542 0.426 4.881 0.309 5.116 0.073 c
+5.358 -0.154 5.483 -0.478 5.483 -0.897 c
+5.483 -2.764 l
+5.483 -3.109 5.531 -3.377 5.63 -3.572 c
+5.63 -3.63 l
+h
+3.969 -2.881 m
+4.075 -2.881 4.167 -2.863 4.248 -2.822 c
+4.337 -2.774 4.399 -2.716 4.439 -2.646 c
+4.439 -1.823 l
+4.189 -1.823 l
+4.013 -1.823 3.87 -1.881 3.763 -1.999 c
+3.664 -2.109 3.616 -2.256 3.616 -2.44 c
+3.616 -2.734 3.734 -2.881 3.969 -2.881 c
+7.482 -2.161 m
+7.982 0.353 l
+9.07 0.353 l
+7.967 -3.63 l
+6.982 -3.63 l
+5.88 0.353 l
+6.968 0.353 l
+h
+11.113 -3.705 m
+10.583 -3.705 10.165 -3.549 9.864 -3.234 c
+9.569 -2.911 9.422 -2.451 9.422 -1.852 c
+9.422 -1.544 l
+9.422 -0.919 9.559 -0.434 9.834 -0.088 c
+10.106 0.254 10.5 0.426 11.009 0.426 c
+11.51 0.426 11.881 0.264 12.127 -0.059 c
+12.381 -0.382 12.513 -0.86 12.524 -1.484 c
+12.524 -1.984 l
+10.452 -1.984 l
+10.469 -2.278 10.533 -2.495 10.643 -2.631 c
+10.76 -2.77 10.94 -2.837 11.186 -2.837 c
+11.528 -2.837 11.819 -2.72 12.054 -2.484 c
+12.465 -3.117 l
+12.337 -3.293 12.149 -3.436 11.907 -3.543 c
+11.66 -3.649 11.396 -3.705 11.113 -3.705 c
+10.466 -1.264 m
+11.495 -1.264 l
+11.495 -1.161 l
+11.495 -0.926 11.454 -0.75 11.377 -0.632 c
+11.308 -0.507 11.179 -0.441 10.995 -0.441 c
+10.819 -0.441 10.687 -0.511 10.598 -0.647 c
+10.517 -0.775 10.473 -0.981 10.466 -1.264 c
+f
+Q
+q 1 0 0 1 485.3189 200.2112 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.602 -0.074 -0.955 -0.074 c
+-1.319 -0.074 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.712 -2.102 1.087 c
+-2.102 1.488 -1.966 1.807 -1.691 2.042 c
+-1.419 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.249 3.336 c
+-0.36 3.443 -0.521 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.266 -1.866 3.453 c
+-1.741 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.29 4.056 0.015 3.954 0.221 3.748 c
+0.434 3.542 0.547 3.248 0.559 2.865 c
+0.559 0.852 l
+0.559 0.548 0.595 0.282 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.514 m
+-0.702 0.514 -0.551 0.558 -0.411 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.984 c
+-0.088 1.925 l
+-0.455 1.925 l
+-0.771 1.925 -1.014 1.855 -1.19 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.562 -1.084 0.514 -0.867 0.514 c
+3.896 3.983 m
+3.91 3.615 l
+4.152 3.91 4.472 4.056 4.865 4.056 c
+5.307 4.056 5.615 3.858 5.791 3.469 c
+6.045 3.858 6.394 4.056 6.835 4.056 c
+7.57 4.056 7.945 3.594 7.967 2.675 c
+7.967 0 l
+7.32 0 l
+7.32 2.616 l
+7.32 2.91 7.265 3.123 7.159 3.262 c
+7.059 3.399 6.887 3.469 6.644 3.469 c
+6.446 3.469 6.284 3.388 6.159 3.233 c
+6.041 3.087 5.972 2.896 5.953 2.66 c
+5.953 0 l
+5.292 0 l
+5.292 2.645 l
+5.292 3.193 5.072 3.469 4.63 3.469 c
+4.296 3.469 4.061 3.307 3.925 2.983 c
+3.925 0 l
+3.278 0 l
+3.278 3.983 l
+h
+10.363 -0.074 m
+9.864 -0.074 9.481 0.073 9.216 0.367 c
+8.952 0.661 8.819 1.095 8.819 1.675 c
+8.819 2.146 l
+8.819 2.741 8.944 3.208 9.201 3.542 c
+9.467 3.884 9.827 4.056 10.29 4.056 c
+10.749 4.056 11.09 3.902 11.318 3.601 c
+11.553 3.307 11.675 2.844 11.686 2.219 c
+11.686 1.793 l
+9.467 1.793 l
+9.467 1.705 l
+9.467 1.271 9.544 0.959 9.702 0.764 c
+9.866 0.577 10.099 0.484 10.392 0.484 c
+10.587 0.484 10.76 0.517 10.907 0.588 c
+11.054 0.665 11.19 0.783 11.318 0.941 c
+11.657 0.529 l
+11.37 0.124 10.94 -0.074 10.363 -0.074 c
+10.29 3.498 m
+10.014 3.498 9.812 3.403 9.687 3.218 c
+9.558 3.031 9.485 2.741 9.467 2.352 c
+11.04 2.352 l
+11.04 2.439 l
+11.017 2.822 10.951 3.09 10.834 3.248 c
+10.716 3.414 10.533 3.498 10.29 3.498 c
+14.406 1.014 m
+14.406 1.161 14.35 1.282 14.244 1.381 c
+14.134 1.477 13.928 1.595 13.627 1.734 c
+13.28 1.881 13.039 2.003 12.891 2.102 c
+12.744 2.208 12.634 2.326 12.568 2.454 c
+12.498 2.58 12.465 2.738 12.465 2.925 c
+12.465 3.248 12.582 3.516 12.818 3.733 c
+13.053 3.946 13.355 4.056 13.729 4.056 c
+14.111 4.056 14.42 3.943 14.655 3.719 c
+14.89 3.491 15.008 3.204 15.008 2.851 c
+14.361 2.851 l
+14.361 3.027 14.302 3.179 14.184 3.307 c
+14.067 3.432 13.913 3.498 13.729 3.498 c
+13.531 3.498 13.38 3.443 13.274 3.336 c
+13.163 3.237 13.112 3.104 13.112 2.94 c
+13.112 2.811 13.149 2.705 13.23 2.616 c
+13.307 2.535 13.498 2.433 13.802 2.308 c
+14.28 2.12 14.611 1.932 14.788 1.749 c
+14.963 1.572 15.052 1.344 15.052 1.072 c
+15.052 0.72 14.927 0.44 14.685 0.235 c
+14.45 0.029 14.134 -0.074 13.744 -0.074 c
+13.321 -0.074 12.983 0.043 12.729 0.278 c
+12.472 0.521 12.347 0.827 12.347 1.19 c
+12.994 1.19 l
+13.002 0.962 13.072 0.786 13.199 0.661 c
+13.325 0.544 13.509 0.484 13.744 0.484 c
+13.957 0.484 14.119 0.532 14.229 0.631 c
+14.346 0.727 14.406 0.856 14.406 1.014 c
+17.83 1.014 m
+17.83 1.161 17.775 1.282 17.668 1.381 c
+17.558 1.477 17.353 1.595 17.051 1.734 c
+16.706 1.881 16.463 2.003 16.316 2.102 c
+16.169 2.208 16.059 2.326 15.993 2.454 c
+15.923 2.58 15.89 2.738 15.89 2.925 c
+15.89 3.248 16.008 3.516 16.243 3.733 c
+16.478 3.946 16.779 4.056 17.154 4.056 c
+17.536 4.056 17.845 3.943 18.08 3.719 c
+18.315 3.491 18.433 3.204 18.433 2.851 c
+17.786 2.851 l
+17.786 3.027 17.727 3.179 17.61 3.307 c
+17.492 3.432 17.338 3.498 17.154 3.498 c
+16.956 3.498 16.805 3.443 16.698 3.336 c
+16.588 3.237 16.536 3.104 16.536 2.94 c
+16.536 2.811 16.573 2.705 16.654 2.616 c
+16.731 2.535 16.922 2.433 17.228 2.308 c
+17.706 2.12 18.036 1.932 18.213 1.749 c
+18.389 1.572 18.477 1.344 18.477 1.072 c
+18.477 0.72 18.352 0.44 18.109 0.235 c
+17.874 0.029 17.558 -0.074 17.168 -0.074 c
+16.746 -0.074 16.408 0.043 16.154 0.278 c
+15.898 0.521 15.772 0.827 15.772 1.19 c
+16.419 1.19 l
+16.426 0.962 16.496 0.786 16.625 0.661 c
+16.75 0.544 16.933 0.484 17.168 0.484 c
+17.382 0.484 17.544 0.532 17.654 0.631 c
+17.772 0.727 17.83 0.856 17.83 1.014 c
+21.358 0 m
+21.317 0.087 21.292 0.235 21.284 0.44 c
+21.049 0.095 20.756 -0.074 20.403 -0.074 c
+20.039 -0.074 19.755 0.022 19.549 0.22 c
+19.352 0.426 19.256 0.712 19.256 1.087 c
+19.256 1.488 19.392 1.807 19.667 2.042 c
+19.94 2.285 20.314 2.41 20.785 2.41 c
+21.27 2.41 l
+21.27 2.836 l
+21.27 3.072 21.215 3.237 21.108 3.336 c
+20.998 3.443 20.836 3.498 20.623 3.498 c
+20.424 3.498 20.263 3.439 20.137 3.322 c
+20.02 3.204 19.962 3.057 19.962 2.881 c
+19.314 2.881 l
+19.314 3.075 19.374 3.266 19.491 3.453 c
+19.616 3.638 19.778 3.785 19.977 3.895 c
+20.182 4.002 20.41 4.056 20.667 4.056 c
+21.068 4.056 21.373 3.954 21.579 3.748 c
+21.791 3.542 21.905 3.248 21.916 2.865 c
+21.916 0.852 l
+21.916 0.548 21.953 0.282 22.034 0.058 c
+22.034 0 l
+h
+20.49 0.514 m
+20.656 0.514 20.806 0.558 20.947 0.646 c
+21.093 0.735 21.2 0.845 21.27 0.984 c
+21.27 1.925 l
+20.902 1.925 l
+20.586 1.925 20.343 1.855 20.168 1.72 c
+19.991 1.591 19.902 1.404 19.902 1.161 c
+19.902 0.933 19.946 0.768 20.035 0.661 c
+20.123 0.562 20.274 0.514 20.49 0.514 c
+22.784 2.175 m
+22.784 2.792 22.894 3.256 23.121 3.571 c
+23.346 3.895 23.68 4.056 24.121 4.056 c
+24.522 4.056 24.827 3.881 25.033 3.528 c
+25.076 3.983 l
+25.664 3.983 l
+25.664 -0.044 l
+25.664 -0.533 25.536 -0.912 25.282 -1.176 c
+25.026 -1.441 24.673 -1.573 24.224 -1.573 c
+24.026 -1.573 23.805 -1.522 23.563 -1.426 c
+23.316 -1.327 23.137 -1.206 23.019 -1.058 c
+23.283 -0.618 l
+23.548 -0.882 23.846 -1.015 24.18 -1.015 c
+24.717 -1.015 24.993 -0.721 25.003 -0.133 c
+25.003 0.396 l
+24.798 0.081 24.496 -0.074 24.106 -0.074 c
+23.695 -0.074 23.372 0.077 23.137 0.382 c
+22.909 0.694 22.791 1.146 22.784 1.734 c
+h
+23.445 1.793 m
+23.445 1.352 23.507 1.022 23.636 0.808 c
+23.761 0.602 23.978 0.5 24.283 0.5 c
+24.606 0.5 24.845 0.665 25.003 0.999 c
+25.003 2.983 l
+24.835 3.307 24.596 3.469 24.283 3.469 c
+23.989 3.469 23.772 3.366 23.636 3.16 c
+23.507 2.954 23.445 2.63 23.445 2.19 c
+h
+28.046 -0.074 m
+27.546 -0.074 27.164 0.073 26.9 0.367 c
+26.635 0.661 26.502 1.095 26.502 1.675 c
+26.502 2.146 l
+26.502 2.741 26.628 3.208 26.884 3.542 c
+27.15 3.884 27.509 4.056 27.973 4.056 c
+28.432 4.056 28.773 3.902 29.001 3.601 c
+29.236 3.307 29.358 2.844 29.369 2.219 c
+29.369 1.793 l
+27.15 1.793 l
+27.15 1.705 l
+27.15 1.271 27.227 0.959 27.385 0.764 c
+27.55 0.577 27.781 0.484 28.075 0.484 c
+28.27 0.484 28.443 0.517 28.59 0.588 c
+28.737 0.665 28.873 0.783 29.001 0.941 c
+29.34 0.529 l
+29.053 0.124 28.623 -0.074 28.046 -0.074 c
+27.973 3.498 m
+27.697 3.498 27.495 3.403 27.37 3.218 c
+27.241 3.031 27.168 2.741 27.15 2.352 c
+28.722 2.352 l
+28.722 2.439 l
+28.7 2.822 28.634 3.09 28.517 3.248 c
+28.399 3.414 28.215 3.498 27.973 3.498 c
+30.883 1.514 m
+30.295 1.514 l
+30.25 5.35 l
+30.942 5.35 l
+h
+30.603 0.735 m
+30.728 0.735 30.824 0.694 30.883 0.617 c
+30.949 0.548 30.986 0.455 30.986 0.338 c
+30.986 0.228 30.949 0.135 30.883 0.058 c
+30.824 -0.008 30.728 -0.044 30.603 -0.044 c
+30.486 -0.044 30.391 -0.008 30.325 0.058 c
+30.265 0.135 30.236 0.228 30.236 0.338 c
+30.236 0.455 30.265 0.548 30.325 0.617 c
+30.391 0.694 30.486 0.735 30.603 0.735 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 170.897 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 164.0623 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.775 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.941 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.028 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.933 5.376 2.051 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.635 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.177 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.264 13.582 -0.177 c
+h
+24.22 -0.25 m
+24.22 -0.419 24.18 -0.57 24.103 -0.706 c
+24.033 -0.834 23.931 -0.948 23.794 -1.044 c
+23.666 -1.132 23.504 -1.202 23.31 -1.249 c
+23.121 -1.297 22.905 -1.323 22.662 -1.323 c
+22.435 -1.323 22.236 -1.309 22.06 -1.279 c
+21.883 -1.249 21.725 -1.202 21.59 -1.132 c
+21.45 -1.055 21.34 -0.956 21.251 -0.838 c
+21.163 -0.721 21.093 -0.574 21.045 -0.397 c
+21.854 -0.279 l
+21.872 -0.379 21.902 -0.456 21.942 -0.515 c
+21.99 -0.574 22.049 -0.617 22.119 -0.647 c
+22.185 -0.676 22.265 -0.702 22.354 -0.721 c
+22.442 -0.732 22.545 -0.735 22.662 -0.735 c
+22.758 -0.735 22.853 -0.732 22.942 -0.721 c
+23.03 -0.702 23.107 -0.676 23.177 -0.647 c
+23.243 -0.617 23.295 -0.58 23.324 -0.53 c
+23.36 -0.482 23.383 -0.419 23.383 -0.339 c
+23.383 -0.243 23.353 -0.169 23.295 -0.118 c
+23.243 -0.07 23.177 -0.029 23.089 0 c
+23.001 0.037 22.89 0.066 22.766 0.088 c
+22.647 0.118 22.516 0.147 22.369 0.176 c
+22.229 0.213 22.09 0.253 21.942 0.294 c
+21.803 0.341 21.677 0.405 21.56 0.484 c
+21.45 0.562 21.361 0.661 21.296 0.779 c
+21.226 0.897 21.193 1.047 21.193 1.234 c
+21.193 1.389 21.222 1.532 21.28 1.66 c
+21.347 1.797 21.442 1.911 21.56 1.999 c
+21.685 2.087 21.843 2.153 22.03 2.205 c
+22.215 2.252 22.427 2.278 22.662 2.278 c
+22.846 2.278 23.023 2.256 23.192 2.219 c
+23.357 2.19 23.504 2.135 23.632 2.057 c
+23.757 1.988 23.868 1.889 23.956 1.764 c
+24.044 1.646 24.103 1.502 24.133 1.338 c
+23.339 1.264 l
+23.316 1.341 23.287 1.404 23.25 1.455 c
+23.21 1.514 23.162 1.558 23.104 1.587 c
+23.052 1.624 22.99 1.65 22.913 1.66 c
+22.832 1.668 22.751 1.675 22.662 1.675 c
+22.446 1.675 22.284 1.646 22.177 1.587 c
+22.067 1.536 22.016 1.448 22.016 1.323 c
+22.016 1.242 22.034 1.18 22.074 1.132 c
+22.122 1.08 22.185 1.043 22.265 1.014 c
+22.354 0.985 22.45 0.955 22.56 0.926 c
+22.666 0.904 22.788 0.881 22.927 0.852 c
+23.081 0.823 23.239 0.783 23.397 0.735 c
+23.551 0.683 23.692 0.621 23.809 0.544 c
+23.927 0.463 24.022 0.36 24.103 0.235 c
+24.18 0.106 24.22 -0.056 24.22 -0.25 c
+25.783 1.602 m
+25.238 1.602 l
+25.238 2.219 l
+25.826 2.219 l
+26.106 3.116 l
+26.679 3.116 l
+26.679 2.219 l
+27.914 2.219 l
+27.914 1.602 l
+26.679 1.602 l
+26.679 -0.103 l
+26.679 -0.324 l
+26.686 -0.393 26.709 -0.456 26.738 -0.515 c
+26.774 -0.566 26.83 -0.611 26.9 -0.647 c
+26.977 -0.676 27.09 -0.691 27.237 -0.691 c
+27.374 -0.691 27.509 -0.688 27.649 -0.676 c
+27.785 -0.658 27.917 -0.632 28.046 -0.603 c
+28.046 -1.205 l
+27.965 -1.216 27.888 -1.231 27.811 -1.249 c
+27.73 -1.261 27.653 -1.268 27.576 -1.279 c
+27.495 -1.286 27.407 -1.294 27.312 -1.294 c
+27.223 -1.301 27.123 -1.309 27.017 -1.309 c
+26.83 -1.309 26.668 -1.294 26.532 -1.264 c
+26.404 -1.228 26.29 -1.183 26.194 -1.132 c
+26.106 -1.085 26.032 -1.025 25.974 -0.956 c
+25.915 -0.879 25.87 -0.802 25.841 -0.721 c
+25.812 -0.632 25.789 -0.544 25.783 -0.456 c
+25.772 -0.36 25.768 -0.264 25.768 -0.177 c
+h
+30.196 -1.323 m
+30.027 -1.323 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.313 -0.97 29.244 -0.864 29.196 -0.735 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.155 0.095 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.723 29.931 0.764 c
+30.096 0.801 30.273 0.827 30.46 0.837 c
+31.181 0.852 l
+31.181 1.029 l
+31.181 1.147 31.17 1.249 31.152 1.338 c
+31.129 1.425 31.096 1.492 31.048 1.543 c
+31.008 1.602 30.96 1.639 30.901 1.66 c
+30.842 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.66 c
+30.468 1.65 30.42 1.624 30.372 1.587 c
+30.331 1.558 30.298 1.506 30.269 1.44 c
+30.248 1.382 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.313 1.396 29.358 1.532 29.417 1.66 c
+29.483 1.786 29.579 1.896 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.252 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.456 l
+32.099 -0.515 32.114 -0.57 32.136 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.371 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.279 c
+32.257 -1.286 32.213 -1.294 32.166 -1.294 c
+32.114 -1.301 32.055 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.647 c
+31.283 -0.647 l
+31.214 -0.757 31.144 -0.852 31.077 -0.941 c
+31.008 -1.022 30.931 -1.087 30.842 -1.147 c
+30.755 -1.205 30.655 -1.249 30.549 -1.279 c
+30.449 -1.309 30.331 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.33 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.249 c
+30.211 0.209 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.375 30.096 -0.497 30.167 -0.574 c
+30.233 -0.654 30.331 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.617 c
+30.85 -0.57 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.262 31.137 -0.162 c
+31.166 -0.056 31.181 0.058 31.181 0.176 c
+h
+36.403 -0.25 m
+36.403 -0.419 36.362 -0.57 36.285 -0.706 c
+36.215 -0.834 36.112 -0.948 35.976 -1.044 c
+35.848 -1.132 35.686 -1.202 35.491 -1.249 c
+35.304 -1.297 35.087 -1.323 34.844 -1.323 c
+34.616 -1.323 34.418 -1.309 34.242 -1.279 c
+34.065 -1.249 33.907 -1.202 33.772 -1.132 c
+33.631 -1.055 33.521 -0.956 33.433 -0.838 c
+33.345 -0.721 33.275 -0.574 33.228 -0.397 c
+34.036 -0.279 l
+34.055 -0.379 34.084 -0.456 34.124 -0.515 c
+34.171 -0.574 34.231 -0.617 34.3 -0.647 c
+34.367 -0.676 34.447 -0.702 34.535 -0.721 c
+34.624 -0.732 34.726 -0.735 34.844 -0.735 c
+34.94 -0.735 35.035 -0.732 35.123 -0.721 c
+35.212 -0.702 35.289 -0.676 35.359 -0.647 c
+35.425 -0.617 35.476 -0.58 35.505 -0.53 c
+35.543 -0.482 35.565 -0.419 35.565 -0.339 c
+35.565 -0.243 35.535 -0.169 35.476 -0.118 c
+35.425 -0.07 35.359 -0.029 35.27 0 c
+35.183 0.037 35.073 0.066 34.948 0.088 c
+34.83 0.118 34.697 0.147 34.551 0.176 c
+34.41 0.213 34.271 0.253 34.124 0.294 c
+33.984 0.341 33.859 0.405 33.742 0.484 c
+33.631 0.562 33.544 0.661 33.477 0.779 c
+33.408 0.897 33.375 1.047 33.375 1.234 c
+33.375 1.389 33.404 1.532 33.463 1.66 c
+33.529 1.797 33.624 1.911 33.742 1.999 c
+33.867 2.087 34.025 2.153 34.212 2.205 c
+34.396 2.252 34.609 2.278 34.844 2.278 c
+35.028 2.278 35.204 2.256 35.374 2.219 c
+35.539 2.19 35.686 2.135 35.815 2.057 c
+35.939 1.988 36.05 1.889 36.138 1.764 c
+36.226 1.646 36.285 1.502 36.314 1.338 c
+35.52 1.264 l
+35.499 1.341 35.469 1.404 35.432 1.455 c
+35.392 1.514 35.345 1.558 35.285 1.587 c
+35.234 1.624 35.171 1.65 35.094 1.66 c
+35.013 1.668 34.932 1.675 34.844 1.675 c
+34.628 1.675 34.466 1.646 34.36 1.587 c
+34.249 1.536 34.198 1.448 34.198 1.323 c
+34.198 1.242 34.216 1.18 34.256 1.132 c
+34.304 1.08 34.367 1.043 34.447 1.014 c
+34.535 0.985 34.631 0.955 34.742 0.926 c
+34.848 0.904 34.969 0.881 35.109 0.852 c
+35.264 0.823 35.422 0.783 35.58 0.735 c
+35.734 0.683 35.873 0.621 35.991 0.544 c
+36.108 0.463 36.204 0.36 36.285 0.235 c
+36.362 0.106 36.403 -0.056 36.403 -0.25 c
+38.262 1.514 m
+38.379 1.786 38.53 1.984 38.718 2.102 c
+38.901 2.219 39.122 2.278 39.379 2.278 c
+39.584 2.278 39.754 2.242 39.894 2.175 c
+40.041 2.105 40.151 2.013 40.232 1.896 c
+40.32 1.778 40.378 1.635 40.408 1.469 c
+40.444 1.301 40.467 1.124 40.467 0.941 c
+40.467 -1.264 l
+39.555 -1.264 l
+39.555 0.735 l
+39.555 0.871 39.544 0.992 39.526 1.103 c
+39.515 1.209 39.489 1.297 39.453 1.367 c
+39.412 1.444 39.353 1.502 39.276 1.543 c
+39.206 1.58 39.114 1.602 38.996 1.602 c
+38.886 1.602 38.791 1.577 38.703 1.529 c
+38.615 1.477 38.534 1.411 38.468 1.323 c
+38.409 1.234 38.358 1.124 38.321 0.999 c
+38.291 0.881 38.277 0.75 38.277 0.602 c
+38.277 -1.264 l
+37.365 -1.264 l
+37.365 3.513 l
+38.277 3.513 l
+38.277 2.205 l
+38.277 2.135 38.269 2.065 38.262 1.999 c
+38.262 1.793 l
+38.262 1.735 38.254 1.679 38.248 1.631 c
+38.248 1.514 l
+h
+f
+Q
+q 1 0 0 1 414.8848 150.0096 cm
+0 0 m
+0 -2.102 l
+-0.676 -2.102 l
+-0.676 3.248 l
+1.029 3.248 l
+1.529 3.248 1.918 3.094 2.205 2.793 c
+2.488 2.5 2.631 2.106 2.631 1.617 c
+2.631 1.095 2.492 0.699 2.219 0.426 c
+1.955 0.151 1.577 0.008 1.087 0 c
+h
+0 0.574 m
+1.029 0.574 l
+1.33 0.574 1.562 0.661 1.72 0.838 c
+1.874 1.014 1.955 1.268 1.955 1.602 c
+1.955 1.926 1.87 2.183 1.706 2.382 c
+1.548 2.577 1.326 2.675 1.043 2.675 c
+0 2.675 l
+h
+5.438 -1.749 m
+5.222 -2.036 4.91 -2.175 4.498 -2.175 c
+4.135 -2.175 3.859 -2.054 3.675 -1.808 c
+3.499 -1.554 3.403 -1.19 3.395 -0.72 c
+3.395 1.881 l
+4.042 1.881 l
+4.042 -0.661 l
+4.042 -1.29 4.226 -1.602 4.601 -1.602 c
+5.002 -1.602 5.277 -1.425 5.424 -1.072 c
+5.424 1.881 l
+6.071 1.881 l
+6.071 -2.102 l
+5.453 -2.102 l
+h
+7.908 2.837 m
+7.908 1.881 l
+8.511 1.881 l
+8.511 1.353 l
+7.908 1.353 l
+7.908 -1.117 l
+7.908 -1.275 7.93 -1.392 7.982 -1.469 c
+8.04 -1.55 8.129 -1.587 8.247 -1.587 c
+8.334 -1.587 8.422 -1.573 8.511 -1.543 c
+8.511 -2.102 l
+8.364 -2.15 8.21 -2.175 8.056 -2.175 c
+7.798 -2.175 7.603 -2.084 7.468 -1.896 c
+7.327 -1.712 7.262 -1.452 7.262 -1.117 c
+7.262 1.353 l
+6.659 1.353 l
+6.659 1.881 l
+7.262 1.881 l
+7.262 2.837 l
+h
+12.083 -1.014 m
+12.803 1.881 l
+13.494 1.881 l
+12.2 -2.66 l
+12.101 -3.002 11.958 -3.262 11.774 -3.439 c
+11.597 -3.615 11.395 -3.704 11.171 -3.704 c
+11.083 -3.704 10.969 -3.682 10.834 -3.645 c
+10.834 -3.102 l
+10.98 -3.116 l
+11.164 -3.116 11.311 -3.072 11.422 -2.984 c
+11.528 -2.896 11.616 -2.738 11.686 -2.514 c
+11.803 -2.072 l
+10.643 1.881 l
+11.348 1.881 l
+h
+13.935 0.073 m
+13.935 0.651 14.071 1.106 14.346 1.441 c
+14.629 1.783 15 1.955 15.464 1.955 c
+15.923 1.955 16.291 1.786 16.565 1.455 c
+16.849 1.132 16.996 0.684 17.007 0.118 c
+17.007 -0.309 l
+17.007 -0.878 16.864 -1.334 16.581 -1.675 c
+16.305 -2.009 15.938 -2.175 15.478 -2.175 c
+15.015 -2.175 14.644 -2.013 14.361 -1.691 c
+14.086 -1.359 13.942 -0.918 13.935 -0.367 c
+h
+14.581 -0.309 m
+14.581 -0.712 14.659 -1.028 14.817 -1.263 c
+14.982 -1.499 15.202 -1.616 15.478 -1.616 c
+16.044 -1.616 16.338 -1.205 16.36 -0.382 c
+16.36 0.073 l
+16.36 0.474 16.276 0.794 16.11 1.029 c
+15.952 1.272 15.736 1.397 15.464 1.397 c
+15.199 1.397 14.982 1.272 14.817 1.029 c
+14.659 0.794 14.581 0.474 14.581 0.073 c
+h
+19.873 -1.749 m
+19.657 -2.036 19.344 -2.175 18.932 -2.175 c
+18.568 -2.175 18.293 -2.054 18.109 -1.808 c
+17.933 -1.554 17.837 -1.19 17.83 -0.72 c
+17.83 1.881 l
+18.477 1.881 l
+18.477 -0.661 l
+18.477 -1.29 18.66 -1.602 19.036 -1.602 c
+19.436 -1.602 19.711 -1.425 19.858 -1.072 c
+19.858 1.881 l
+20.505 1.881 l
+20.505 -2.102 l
+19.888 -2.102 l
+h
+23.137 1.264 m
+23.048 1.283 22.949 1.294 22.842 1.294 c
+22.508 1.294 22.273 1.11 22.137 0.75 c
+22.137 -2.102 l
+21.49 -2.102 l
+21.49 1.881 l
+22.122 1.881 l
+22.137 1.47 l
+22.313 1.794 22.556 1.955 22.872 1.955 c
+22.978 1.955 23.067 1.933 23.137 1.897 c
+h
+26.884 -1.616 m
+27.098 -1.616 27.27 -1.554 27.399 -1.425 c
+27.535 -1.29 27.609 -1.099 27.619 -0.852 c
+28.237 -0.852 l
+28.215 -1.234 28.079 -1.554 27.825 -1.808 c
+27.568 -2.054 27.256 -2.175 26.884 -2.175 c
+26.392 -2.175 26.017 -2.024 25.753 -1.72 c
+25.496 -1.407 25.371 -0.941 25.371 -0.323 c
+25.371 0.118 l
+25.371 0.713 25.496 1.169 25.753 1.484 c
+26.017 1.797 26.392 1.955 26.884 1.955 c
+27.285 1.955 27.605 1.823 27.84 1.559 c
+28.083 1.301 28.215 0.956 28.237 0.515 c
+27.619 0.515 l
+27.598 0.809 27.524 1.029 27.399 1.176 c
+27.281 1.324 27.109 1.397 26.884 1.397 c
+26.591 1.397 26.374 1.297 26.238 1.103 c
+26.098 0.915 26.025 0.607 26.017 0.177 c
+26.017 -0.338 l
+26.017 -0.808 26.084 -1.143 26.223 -1.338 c
+26.37 -1.525 26.591 -1.616 26.884 -1.616 c
+31.015 -1.749 m
+30.798 -2.036 30.486 -2.175 30.074 -2.175 c
+29.71 -2.175 29.435 -2.054 29.251 -1.808 c
+29.074 -1.554 28.979 -1.19 28.972 -0.72 c
+28.972 1.881 l
+29.619 1.881 l
+29.619 -0.661 l
+29.619 -1.29 29.803 -1.602 30.177 -1.602 c
+30.578 -1.602 30.853 -1.425 31 -1.072 c
+31 1.881 l
+31.647 1.881 l
+31.647 -2.102 l
+31.03 -2.102 l
+h
+34.279 1.264 m
+34.19 1.283 34.091 1.294 33.984 1.294 c
+33.65 1.294 33.415 1.11 33.279 0.75 c
+33.279 -2.102 l
+32.632 -2.102 l
+32.632 1.881 l
+33.264 1.881 l
+33.279 1.47 l
+33.456 1.794 33.697 1.955 34.013 1.955 c
+34.121 1.955 34.208 1.933 34.279 1.897 c
+h
+36.571 1.264 m
+36.483 1.283 36.384 1.294 36.278 1.294 c
+35.943 1.294 35.708 1.11 35.572 0.75 c
+35.572 -2.102 l
+34.925 -2.102 l
+34.925 1.881 l
+35.557 1.881 l
+35.572 1.47 l
+35.748 1.794 35.991 1.955 36.307 1.955 c
+36.413 1.955 36.502 1.933 36.571 1.897 c
+h
+38.57 -2.175 m
+38.071 -2.175 37.689 -2.028 37.424 -1.734 c
+37.159 -1.44 37.027 -1.007 37.027 -0.426 c
+37.027 0.044 l
+37.027 0.64 37.152 1.106 37.409 1.441 c
+37.674 1.783 38.034 1.955 38.497 1.955 c
+38.956 1.955 39.298 1.801 39.526 1.5 c
+39.761 1.206 39.883 0.742 39.893 0.118 c
+39.893 -0.309 l
+37.674 -0.309 l
+37.674 -0.397 l
+37.674 -0.83 37.751 -1.143 37.909 -1.338 c
+38.075 -1.525 38.306 -1.616 38.599 -1.616 c
+38.794 -1.616 38.967 -1.583 39.114 -1.514 c
+39.262 -1.437 39.397 -1.319 39.526 -1.161 c
+39.864 -1.573 l
+39.577 -1.977 39.147 -2.175 38.57 -2.175 c
+38.497 1.397 m
+38.221 1.397 38.019 1.301 37.894 1.118 c
+37.766 0.93 37.693 0.64 37.674 0.25 c
+39.247 0.25 l
+39.247 0.339 l
+39.224 0.721 39.158 0.989 39.041 1.147 c
+38.923 1.312 38.74 1.397 38.497 1.397 c
+41.29 1.881 m
+41.304 1.441 l
+41.558 1.783 41.882 1.955 42.275 1.955 c
+42.98 1.955 43.337 1.484 43.347 0.544 c
+43.347 -2.102 l
+42.701 -2.102 l
+42.701 0.515 l
+42.701 0.827 42.646 1.048 42.539 1.176 c
+42.429 1.301 42.275 1.367 42.069 1.367 c
+41.911 1.367 41.764 1.312 41.628 1.206 c
+41.499 1.095 41.396 0.96 41.319 0.794 c
+41.319 -2.102 l
+40.673 -2.102 l
+40.673 1.881 l
+h
+45.171 2.837 m
+45.171 1.881 l
+45.773 1.881 l
+45.773 1.353 l
+45.171 1.353 l
+45.171 -1.117 l
+45.171 -1.275 45.192 -1.392 45.244 -1.469 c
+45.302 -1.55 45.391 -1.587 45.508 -1.587 c
+45.597 -1.587 45.685 -1.573 45.773 -1.543 c
+45.773 -2.102 l
+45.626 -2.15 45.472 -2.175 45.317 -2.175 c
+45.06 -2.175 44.866 -2.084 44.729 -1.896 c
+44.59 -1.712 44.523 -1.452 44.523 -1.117 c
+44.523 1.353 l
+43.921 1.353 l
+43.921 1.881 l
+44.523 1.881 l
+44.523 2.837 l
+h
+49.639 -1.616 m
+49.852 -1.616 50.025 -1.554 50.154 -1.425 c
+50.289 -1.29 50.362 -1.099 50.374 -0.852 c
+50.991 -0.852 l
+50.969 -1.234 50.833 -1.554 50.58 -1.808 c
+50.322 -2.054 50.01 -2.175 49.639 -2.175 c
+49.146 -2.175 48.772 -2.024 48.507 -1.72 c
+48.25 -1.407 48.124 -0.941 48.124 -0.323 c
+48.124 0.118 l
+48.124 0.713 48.25 1.169 48.507 1.484 c
+48.772 1.797 49.146 1.955 49.639 1.955 c
+50.04 1.955 50.359 1.823 50.594 1.559 c
+50.837 1.301 50.969 0.956 50.991 0.515 c
+50.374 0.515 l
+50.352 0.809 50.278 1.029 50.154 1.176 c
+50.036 1.324 49.863 1.397 49.639 1.397 c
+49.345 1.397 49.128 1.297 48.992 1.103 c
+48.853 0.915 48.779 0.607 48.772 0.177 c
+48.772 -0.338 l
+48.772 -0.808 48.838 -1.143 48.978 -1.338 c
+49.124 -1.525 49.345 -1.616 49.639 -1.616 c
+52.388 1.47 m
+52.641 1.794 52.961 1.955 53.343 1.955 c
+54.048 1.955 54.405 1.484 54.416 0.544 c
+54.416 -2.102 l
+53.769 -2.102 l
+53.769 0.515 l
+53.769 0.827 53.714 1.048 53.608 1.176 c
+53.497 1.301 53.343 1.367 53.138 1.367 c
+52.98 1.367 52.832 1.312 52.696 1.206 c
+52.568 1.095 52.465 0.96 52.388 0.794 c
+52.388 -2.102 l
+51.741 -2.102 l
+51.741 3.543 l
+52.388 3.543 l
+h
+57.414 -2.102 m
+57.374 -2.013 57.348 -1.866 57.341 -1.66 c
+57.106 -2.006 56.812 -2.175 56.459 -2.175 c
+56.095 -2.175 55.812 -2.08 55.606 -1.881 c
+55.409 -1.675 55.313 -1.389 55.313 -1.014 c
+55.313 -0.613 55.449 -0.294 55.725 -0.058 c
+55.997 0.184 56.371 0.309 56.841 0.309 c
+57.327 0.309 l
+57.327 0.736 l
+57.327 0.971 57.271 1.135 57.165 1.235 c
+57.055 1.341 56.893 1.397 56.68 1.397 c
+56.481 1.397 56.319 1.338 56.195 1.22 c
+56.077 1.103 56.018 0.956 56.018 0.779 c
+55.371 0.779 l
+55.371 0.974 55.43 1.166 55.548 1.353 c
+55.673 1.536 55.835 1.683 56.033 1.794 c
+56.238 1.9 56.467 1.955 56.724 1.955 c
+57.125 1.955 57.429 1.852 57.635 1.646 c
+57.848 1.441 57.962 1.147 57.973 0.765 c
+57.973 -1.249 l
+57.973 -1.554 58.01 -1.818 58.091 -2.043 c
+58.091 -2.102 l
+h
+56.547 -1.587 m
+56.712 -1.587 56.863 -1.543 57.003 -1.455 c
+57.15 -1.367 57.256 -1.257 57.327 -1.117 c
+57.327 -0.176 l
+56.959 -0.176 l
+56.643 -0.176 56.4 -0.246 56.224 -0.382 c
+56.047 -0.511 55.96 -0.698 55.96 -0.941 c
+55.96 -1.168 56.003 -1.334 56.092 -1.44 c
+56.18 -1.539 56.331 -1.587 56.547 -1.587 c
+59.59 1.881 m
+59.604 1.441 l
+59.858 1.783 60.182 1.955 60.575 1.955 c
+61.281 1.955 61.637 1.484 61.648 0.544 c
+61.648 -2.102 l
+61.001 -2.102 l
+61.001 0.515 l
+61.001 0.827 60.946 1.048 60.84 1.176 c
+60.729 1.301 60.575 1.367 60.369 1.367 c
+60.211 1.367 60.064 1.312 59.928 1.206 c
+59.8 1.095 59.697 0.96 59.619 0.794 c
+59.619 -2.102 l
+58.973 -2.102 l
+58.973 1.881 l
+h
+62.486 0.073 m
+62.486 0.691 62.596 1.154 62.824 1.47 c
+63.048 1.794 63.382 1.955 63.824 1.955 c
+64.224 1.955 64.529 1.779 64.735 1.426 c
+64.778 1.881 l
+65.367 1.881 l
+65.367 -2.146 l
+65.367 -2.634 65.238 -3.013 64.984 -3.278 c
+64.728 -3.542 64.375 -3.675 63.926 -3.675 c
+63.728 -3.675 63.507 -3.623 63.265 -3.528 c
+63.018 -3.428 62.839 -3.307 62.721 -3.16 c
+62.985 -2.719 l
+63.251 -2.984 63.548 -3.116 63.882 -3.116 c
+64.419 -3.116 64.695 -2.822 64.705 -2.234 c
+64.705 -1.705 l
+64.5 -2.021 64.198 -2.175 63.808 -2.175 c
+63.397 -2.175 63.074 -2.024 62.839 -1.72 c
+62.611 -1.407 62.493 -0.955 62.486 -0.367 c
+h
+63.147 -0.309 m
+63.147 -0.75 63.21 -1.08 63.338 -1.294 c
+63.463 -1.499 63.681 -1.602 63.985 -1.602 c
+64.308 -1.602 64.547 -1.437 64.705 -1.103 c
+64.705 0.882 l
+64.537 1.206 64.298 1.367 63.985 1.367 c
+63.691 1.367 63.474 1.264 63.338 1.058 c
+63.21 0.853 63.147 0.53 63.147 0.088 c
+h
+67.748 -2.175 m
+67.249 -2.175 66.866 -2.028 66.602 -1.734 c
+66.337 -1.44 66.205 -1.007 66.205 -0.426 c
+66.205 0.044 l
+66.205 0.64 66.33 1.106 66.586 1.441 c
+66.852 1.783 67.211 1.955 67.675 1.955 c
+68.134 1.955 68.475 1.801 68.703 1.5 c
+68.938 1.206 69.06 0.742 69.071 0.118 c
+69.071 -0.309 l
+66.852 -0.309 l
+66.852 -0.397 l
+66.852 -0.83 66.929 -1.143 67.087 -1.338 c
+67.252 -1.525 67.484 -1.616 67.777 -1.616 c
+67.972 -1.616 68.145 -1.583 68.292 -1.514 c
+68.439 -1.437 68.575 -1.319 68.703 -1.161 c
+69.042 -1.573 l
+68.755 -1.977 68.325 -2.175 67.748 -2.175 c
+67.675 1.397 m
+67.399 1.397 67.197 1.301 67.072 1.118 c
+66.943 0.93 66.87 0.64 66.852 0.25 c
+68.425 0.25 l
+68.425 0.339 l
+68.402 0.721 68.336 0.989 68.219 1.147 c
+68.101 1.312 67.917 1.397 67.675 1.397 c
+71.791 -1.087 m
+71.791 -0.941 71.735 -0.819 71.629 -0.72 c
+71.519 -0.625 71.313 -0.507 71.012 -0.367 c
+70.666 -0.22 70.423 -0.099 70.276 0 c
+70.129 0.107 70.019 0.225 69.952 0.353 c
+69.883 0.478 69.85 0.636 69.85 0.823 c
+69.85 1.147 69.967 1.415 70.203 1.632 c
+70.438 1.845 70.739 1.955 71.114 1.955 c
+71.496 1.955 71.805 1.841 72.04 1.617 c
+72.275 1.389 72.393 1.103 72.393 0.75 c
+71.746 0.75 l
+71.746 0.927 71.687 1.077 71.57 1.206 c
+71.452 1.33 71.298 1.397 71.114 1.397 c
+70.916 1.397 70.765 1.341 70.658 1.235 c
+70.548 1.135 70.497 1.004 70.497 0.838 c
+70.497 0.709 70.534 0.603 70.615 0.515 c
+70.692 0.434 70.883 0.331 71.188 0.206 c
+71.666 0.019 71.996 -0.168 72.173 -0.353 c
+72.349 -0.529 72.437 -0.756 72.437 -1.028 c
+72.437 -1.381 72.312 -1.66 72.069 -1.866 c
+71.834 -2.072 71.519 -2.175 71.128 -2.175 c
+70.706 -2.175 70.368 -2.057 70.114 -1.822 c
+69.857 -1.579 69.732 -1.275 69.732 -0.911 c
+70.38 -0.911 l
+70.386 -1.139 70.457 -1.315 70.585 -1.44 c
+70.71 -1.558 70.893 -1.616 71.128 -1.616 c
+71.342 -1.616 71.504 -1.569 71.614 -1.469 c
+71.731 -1.374 71.791 -1.246 71.791 -1.087 c
+75.7 -2.102 -0.647 3.983 re
+75.745 2.926 m
+75.745 2.816 75.715 2.723 75.656 2.646 c
+75.597 2.577 75.502 2.543 75.377 2.543 c
+75.259 2.543 75.164 2.577 75.097 2.646 c
+75.039 2.723 75.01 2.816 75.01 2.926 c
+75.01 3.043 75.039 3.135 75.097 3.205 c
+75.164 3.282 75.259 3.323 75.377 3.323 c
+75.502 3.323 75.597 3.282 75.656 3.205 c
+75.715 3.124 75.745 3.032 75.745 2.926 c
+77.332 1.881 m
+77.347 1.441 l
+77.6 1.783 77.923 1.955 78.317 1.955 c
+79.022 1.955 79.379 1.484 79.39 0.544 c
+79.39 -2.102 l
+78.743 -2.102 l
+78.743 0.515 l
+78.743 0.827 78.688 1.048 78.581 1.176 c
+78.471 1.301 78.317 1.367 78.111 1.367 c
+77.952 1.367 77.806 1.312 77.67 1.206 c
+77.541 1.095 77.439 0.96 77.362 0.794 c
+77.362 -2.102 l
+76.714 -2.102 l
+76.714 1.881 l
+h
+81.212 2.837 m
+81.212 1.881 l
+81.815 1.881 l
+81.815 1.353 l
+81.212 1.353 l
+81.212 -1.117 l
+81.212 -1.275 81.235 -1.392 81.286 -1.469 c
+81.345 -1.55 81.433 -1.587 81.551 -1.587 c
+81.638 -1.587 81.727 -1.573 81.815 -1.543 c
+81.815 -2.102 l
+81.668 -2.15 81.514 -2.175 81.36 -2.175 c
+81.102 -2.175 80.907 -2.084 80.771 -1.896 c
+80.632 -1.712 80.566 -1.452 80.566 -1.117 c
+80.566 1.353 l
+79.963 1.353 l
+79.963 1.881 l
+80.566 1.881 l
+80.566 2.837 l
+h
+82.374 0.073 m
+82.374 0.651 82.509 1.106 82.785 1.441 c
+83.068 1.783 83.439 1.955 83.903 1.955 c
+84.362 1.955 84.73 1.786 85.004 1.455 c
+85.287 1.132 85.435 0.684 85.445 0.118 c
+85.445 -0.309 l
+85.445 -0.878 85.303 -1.334 85.019 -1.675 c
+84.744 -2.009 84.377 -2.175 83.917 -2.175 c
+83.454 -2.175 83.083 -2.013 82.8 -1.691 c
+82.525 -1.359 82.381 -0.918 82.374 -0.367 c
+h
+83.02 -0.309 m
+83.02 -0.712 83.097 -1.028 83.255 -1.263 c
+83.421 -1.499 83.641 -1.616 83.917 -1.616 c
+84.483 -1.616 84.777 -1.205 84.799 -0.382 c
+84.799 0.073 l
+84.799 0.474 84.715 0.794 84.549 1.029 c
+84.391 1.272 84.175 1.397 83.903 1.397 c
+83.637 1.397 83.421 1.272 83.255 1.029 c
+83.097 0.794 83.02 0.474 83.02 0.073 c
+h
+f
+Q
+q 1 0 0 1 504.5495 148.9813 cm
+0 0 m
+0 0.087 -0.044 0.165 -0.133 0.235 c
+-0.221 0.312 -0.408 0.415 -0.691 0.544 c
+-1.125 0.72 -1.422 0.9 -1.588 1.087 c
+-1.746 1.271 -1.823 1.502 -1.823 1.778 c
+-1.823 2.119 -1.702 2.403 -1.455 2.63 c
+-1.202 2.865 -0.864 2.983 -0.441 2.983 c
+-0.011 2.983 0.338 2.869 0.602 2.645 c
+0.867 2.418 0.999 2.117 0.999 1.734 c
+-0.044 1.734 l
+-0.044 2.057 -0.184 2.219 -0.456 2.219 c
+-0.566 2.219 -0.655 2.183 -0.721 2.117 c
+-0.79 2.046 -0.823 1.947 -0.823 1.822 c
+-0.823 1.734 -0.786 1.653 -0.706 1.587 c
+-0.628 1.529 -0.449 1.433 -0.162 1.308 c
+0.268 1.15 0.565 0.974 0.735 0.779 c
+0.911 0.591 0.999 0.341 0.999 0.029 c
+0.999 -0.324 0.867 -0.611 0.602 -0.823 c
+0.338 -1.04 -0.011 -1.147 -0.441 -1.147 c
+-0.736 -1.147 -0.996 -1.092 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.75 -0.5 c
+-1.867 -0.294 -1.926 -0.074 -1.926 0.161 c
+-0.941 0.161 l
+-0.941 -0.026 -0.904 -0.162 -0.823 -0.25 c
+-0.736 -0.339 -0.603 -0.383 -0.427 -0.383 c
+-0.144 -0.383 0 -0.258 0 0 c
+2.866 3.881 m
+2.866 2.91 l
+3.395 2.91 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.011 2.884 -0.118 2.925 -0.177 c
+2.973 -0.235 3.057 -0.265 3.175 -0.265 c
+3.281 -0.265 3.366 -0.258 3.424 -0.235 c
+3.424 -1.044 l
+3.248 -1.11 3.057 -1.147 2.851 -1.147 c
+2.175 -1.147 1.83 -0.761 1.822 0.014 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.91 l
+1.822 2.91 l
+1.822 3.881 l
+h
+5.85 -1.073 m
+5.82 -1.015 5.791 -0.912 5.762 -0.765 c
+5.574 -1.022 5.325 -1.147 5.012 -1.147 c
+4.677 -1.147 4.398 -1.04 4.174 -0.823 c
+3.958 -0.599 3.85 -0.31 3.85 0.043 c
+3.85 0.455 3.983 0.771 4.247 0.999 c
+4.512 1.234 4.895 1.352 5.394 1.352 c
+5.718 1.352 l
+5.718 1.675 l
+5.718 1.851 5.681 1.973 5.614 2.042 c
+5.556 2.119 5.468 2.16 5.35 2.16 c
+5.093 2.16 4.968 2.006 4.968 1.705 c
+3.925 1.705 l
+3.925 2.076 4.06 2.381 4.336 2.616 c
+4.608 2.859 4.957 2.983 5.379 2.983 c
+5.82 2.983 6.158 2.865 6.393 2.63 c
+6.636 2.403 6.761 2.08 6.761 1.66 c
+6.761 -0.206 l
+6.761 -0.551 6.809 -0.82 6.908 -1.015 c
+6.908 -1.073 l
+h
+5.247 -0.324 m
+5.354 -0.324 5.446 -0.306 5.527 -0.265 c
+5.614 -0.217 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.468 0.735 l
+5.292 0.735 5.148 0.675 5.041 0.558 c
+4.943 0.448 4.895 0.301 4.895 0.118 c
+4.895 -0.177 5.012 -0.324 5.247 -0.324 c
+9.275 0 m
+9.275 0.087 9.231 0.165 9.142 0.235 c
+9.055 0.312 8.866 0.415 8.584 0.544 c
+8.151 0.72 7.852 0.9 7.688 1.087 c
+7.53 1.271 7.453 1.502 7.453 1.778 c
+7.453 2.119 7.573 2.403 7.819 2.63 c
+8.073 2.865 8.411 2.983 8.834 2.983 c
+9.263 2.983 9.612 2.869 9.878 2.645 c
+10.142 2.418 10.275 2.117 10.275 1.734 c
+9.231 1.734 l
+9.231 2.057 9.091 2.219 8.819 2.219 c
+8.708 2.219 8.621 2.183 8.554 2.117 c
+8.484 2.046 8.452 1.947 8.452 1.822 c
+8.452 1.734 8.488 1.653 8.569 1.587 c
+8.646 1.529 8.826 1.433 9.113 1.308 c
+9.543 1.15 9.841 0.974 10.009 0.779 c
+10.186 0.591 10.275 0.341 10.275 0.029 c
+10.275 -0.324 10.142 -0.611 9.878 -0.823 c
+9.612 -1.04 9.263 -1.147 8.834 -1.147 c
+8.54 -1.147 8.279 -1.092 8.055 -0.985 c
+7.827 -0.867 7.65 -0.706 7.526 -0.5 c
+7.408 -0.294 7.349 -0.074 7.349 0.161 c
+8.334 0.161 l
+8.334 -0.026 8.371 -0.162 8.452 -0.25 c
+8.54 -0.339 8.672 -0.383 8.849 -0.383 c
+9.132 -0.383 9.275 -0.258 9.275 0 c
+11.95 2.557 m
+12.174 2.84 12.45 2.983 12.773 2.983 c
+13.134 2.983 13.409 2.855 13.596 2.601 c
+13.791 2.344 13.89 1.962 13.89 1.454 c
+13.89 -1.073 l
+12.847 -1.073 l
+12.847 1.44 l
+12.847 1.675 12.806 1.841 12.729 1.94 c
+12.66 2.046 12.546 2.102 12.391 2.102 c
+12.203 2.102 12.057 2.017 11.95 1.851 c
+11.95 -1.073 l
+10.906 -1.073 l
+10.906 4.571 l
+11.95 4.571 l
+h
+14.728 -0.545 m
+14.728 -0.379 14.78 -0.243 14.89 -0.133 c
+14.996 -0.026 15.143 0.029 15.33 0.029 c
+15.496 0.029 15.64 -0.026 15.757 -0.133 c
+15.875 -0.243 15.933 -0.379 15.933 -0.545 c
+15.933 -0.713 15.875 -0.849 15.757 -0.956 c
+15.64 -1.066 15.496 -1.118 15.33 -1.118 c
+15.154 -1.118 15.008 -1.066 14.89 -0.956 c
+14.78 -0.849 14.728 -0.713 14.728 -0.545 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 142.3 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 135.461 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.807 l
+-1.896 -1.807 l
+-1.896 -1.263 l
+-2.142 -1.256 -2.359 -1.219 -2.543 -1.161 c
+-2.719 -1.102 -2.873 -1.024 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.034 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.477 -2.234 -0.514 c
+-2.138 -0.554 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.662 l
+-1.907 0.662 -1.926 0.666 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.279 -3.219 1.426 c
+-3.289 1.573 -3.322 1.757 -3.322 1.985 c
+-3.322 2.18 -3.289 2.345 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.933 -2.645 3.003 -2.469 3.043 c
+-2.293 3.091 -2.102 3.12 -1.896 3.132 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.132 l
+-1.319 3.12 -1.128 3.091 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.621 -0.279 2.484 c
+-0.202 2.345 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.368 l
+-1.514 1.368 l
+-1.506 1.368 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.32 0.871 -0.213 0.743 -0.132 0.588 c
+-0.044 0.431 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.503 -2.113 2.484 -2.19 2.455 c
+-2.26 2.426 -2.319 2.386 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.191 c
+-2.477 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.838 -2.439 1.779 c
+-2.41 1.721 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.201 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.201 -0.837 -0.014 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.634 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.395 c
+5.284 -2.314 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.83 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.219 6.034 -1.219 c
+5.829 -1.219 5.644 -1.183 5.49 -1.102 c
+5.343 -1.014 5.215 -0.897 5.108 -0.749 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.772 4.836 1.019 4.888 1.235 c
+4.946 1.449 5.027 1.632 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.188 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.919 7.107 1.97 c
+7.115 2.029 7.122 2.077 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.993 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.414 7.938 -1.635 7.871 -1.822 c
+7.802 -2.006 7.699 -2.16 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.743 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.368 c
+5.88 1.279 5.835 1.162 5.799 1.015 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.514 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.603 l
+9.199 1.603 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.597 1.603 m
+13.053 1.603 l
+13.053 2.22 l
+13.641 2.22 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.22 l
+15.728 2.22 l
+15.728 1.603 l
+14.494 1.603 l
+14.494 -0.103 l
+14.494 -0.323 l
+14.501 -0.392 14.523 -0.455 14.552 -0.514 c
+14.589 -0.565 14.645 -0.61 14.714 -0.646 c
+14.791 -0.675 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.675 c
+15.599 -0.658 15.732 -0.631 15.861 -0.602 c
+15.861 -1.205 l
+15.78 -1.215 15.703 -1.23 15.626 -1.249 c
+15.545 -1.26 15.468 -1.267 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.3 14.938 -1.308 14.832 -1.308 c
+14.645 -1.308 14.483 -1.294 14.346 -1.263 c
+14.218 -1.227 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.024 13.788 -0.955 c
+13.729 -0.878 13.685 -0.801 13.656 -0.72 c
+13.627 -0.631 13.604 -0.544 13.597 -0.455 c
+13.586 -0.359 13.582 -0.264 13.582 -0.176 c
+h
+24.22 -0.249 m
+24.22 -0.419 24.18 -0.569 24.103 -0.706 c
+24.033 -0.833 23.931 -0.947 23.794 -1.043 c
+23.666 -1.132 23.504 -1.201 23.31 -1.249 c
+23.121 -1.296 22.905 -1.323 22.662 -1.323 c
+22.435 -1.323 22.236 -1.308 22.06 -1.278 c
+21.883 -1.249 21.725 -1.201 21.59 -1.132 c
+21.45 -1.055 21.34 -0.955 21.251 -0.837 c
+21.163 -0.72 21.093 -0.573 21.045 -0.396 c
+21.854 -0.278 l
+21.872 -0.378 21.902 -0.455 21.942 -0.514 c
+21.99 -0.573 22.049 -0.617 22.119 -0.646 c
+22.185 -0.675 22.265 -0.702 22.354 -0.72 c
+22.442 -0.731 22.545 -0.735 22.662 -0.735 c
+22.758 -0.735 22.853 -0.731 22.942 -0.72 c
+23.03 -0.702 23.107 -0.675 23.177 -0.646 c
+23.243 -0.617 23.295 -0.58 23.324 -0.529 c
+23.36 -0.481 23.383 -0.419 23.383 -0.338 c
+23.383 -0.242 23.353 -0.168 23.295 -0.118 c
+23.243 -0.07 23.177 -0.029 23.089 0 c
+23.001 0.038 22.89 0.067 22.766 0.088 c
+22.647 0.118 22.516 0.148 22.369 0.177 c
+22.229 0.214 22.09 0.254 21.942 0.294 c
+21.803 0.342 21.677 0.405 21.56 0.485 c
+21.45 0.563 21.361 0.662 21.296 0.78 c
+21.226 0.897 21.193 1.048 21.193 1.235 c
+21.193 1.389 21.222 1.532 21.28 1.661 c
+21.347 1.798 21.442 1.912 21.56 1.999 c
+21.685 2.088 21.843 2.154 22.03 2.205 c
+22.215 2.253 22.427 2.278 22.662 2.278 c
+22.846 2.278 23.023 2.257 23.192 2.22 c
+23.357 2.191 23.504 2.135 23.632 2.058 c
+23.757 1.989 23.868 1.889 23.956 1.764 c
+24.044 1.646 24.103 1.503 24.133 1.338 c
+23.339 1.264 l
+23.316 1.341 23.287 1.405 23.25 1.455 c
+23.21 1.515 23.162 1.559 23.104 1.588 c
+23.052 1.625 22.99 1.65 22.913 1.661 c
+22.832 1.669 22.751 1.676 22.662 1.676 c
+22.446 1.676 22.284 1.646 22.177 1.588 c
+22.067 1.536 22.016 1.449 22.016 1.324 c
+22.016 1.243 22.034 1.18 22.074 1.133 c
+22.122 1.081 22.185 1.044 22.265 1.015 c
+22.354 0.985 22.45 0.956 22.56 0.927 c
+22.666 0.904 22.788 0.882 22.927 0.853 c
+23.081 0.823 23.239 0.784 23.397 0.736 c
+23.551 0.684 23.692 0.622 23.809 0.545 c
+23.927 0.464 24.022 0.36 24.103 0.235 c
+24.18 0.107 24.22 -0.055 24.22 -0.249 c
+25.783 1.603 m
+25.238 1.603 l
+25.238 2.22 l
+25.826 2.22 l
+26.106 3.117 l
+26.679 3.117 l
+26.679 2.22 l
+27.914 2.22 l
+27.914 1.603 l
+26.679 1.603 l
+26.679 -0.103 l
+26.679 -0.323 l
+26.686 -0.392 26.709 -0.455 26.738 -0.514 c
+26.774 -0.565 26.83 -0.61 26.9 -0.646 c
+26.977 -0.675 27.09 -0.691 27.237 -0.691 c
+27.374 -0.691 27.509 -0.687 27.649 -0.675 c
+27.785 -0.658 27.917 -0.631 28.046 -0.602 c
+28.046 -1.205 l
+27.965 -1.215 27.888 -1.23 27.811 -1.249 c
+27.73 -1.26 27.653 -1.267 27.576 -1.278 c
+27.495 -1.286 27.407 -1.294 27.312 -1.294 c
+27.223 -1.3 27.123 -1.308 27.017 -1.308 c
+26.83 -1.308 26.668 -1.294 26.532 -1.263 c
+26.404 -1.227 26.29 -1.183 26.194 -1.132 c
+26.106 -1.084 26.032 -1.024 25.974 -0.955 c
+25.915 -0.878 25.87 -0.801 25.841 -0.72 c
+25.812 -0.631 25.789 -0.544 25.783 -0.455 c
+25.772 -0.359 25.768 -0.264 25.768 -0.176 c
+h
+30.196 -1.323 m
+30.027 -1.323 29.876 -1.3 29.741 -1.263 c
+29.612 -1.215 29.498 -1.146 29.402 -1.058 c
+29.313 -0.97 29.244 -0.863 29.196 -0.735 c
+29.145 -0.598 29.122 -0.448 29.122 -0.278 c
+29.122 -0.073 29.155 0.096 29.226 0.235 c
+29.292 0.383 29.388 0.493 29.505 0.574 c
+29.63 0.662 29.773 0.724 29.931 0.765 c
+30.096 0.802 30.273 0.827 30.46 0.838 c
+31.181 0.853 l
+31.181 1.029 l
+31.181 1.147 31.17 1.25 31.152 1.338 c
+31.129 1.426 31.096 1.492 31.048 1.544 c
+31.008 1.603 30.96 1.64 30.901 1.661 c
+30.842 1.68 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.68 30.519 1.661 c
+30.468 1.65 30.42 1.625 30.372 1.588 c
+30.331 1.559 30.298 1.507 30.269 1.441 c
+30.248 1.382 30.233 1.301 30.225 1.206 c
+29.284 1.25 l
+29.313 1.397 29.358 1.532 29.417 1.661 c
+29.483 1.786 29.579 1.897 29.696 1.985 c
+29.814 2.08 29.953 2.154 30.122 2.205 c
+30.298 2.253 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.956 c
+31.975 1.75 32.092 1.441 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.455 l
+32.099 -0.514 32.114 -0.569 32.136 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.72 c
+32.261 -0.742 32.313 -0.749 32.371 -0.749 c
+32.438 -0.749 32.507 -0.745 32.577 -0.735 c
+32.577 -1.219 l
+32.519 -1.23 32.463 -1.242 32.415 -1.249 c
+32.375 -1.26 32.334 -1.267 32.297 -1.278 c
+32.257 -1.286 32.213 -1.294 32.166 -1.294 c
+32.114 -1.3 32.055 -1.308 31.989 -1.308 c
+31.761 -1.308 31.596 -1.256 31.489 -1.146 c
+31.379 -1.028 31.316 -0.863 31.298 -0.646 c
+31.283 -0.646 l
+31.214 -0.756 31.144 -0.852 31.077 -0.941 c
+31.008 -1.021 30.931 -1.087 30.842 -1.146 c
+30.755 -1.205 30.655 -1.249 30.549 -1.278 c
+30.449 -1.308 30.331 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.339 l
+30.655 0.339 30.564 0.331 30.475 0.324 c
+30.394 0.313 30.328 0.287 30.269 0.25 c
+30.211 0.21 30.159 0.151 30.122 0.074 c
+30.082 0.004 30.063 -0.087 30.063 -0.205 c
+30.063 -0.374 30.096 -0.496 30.167 -0.573 c
+30.233 -0.654 30.331 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.668 30.755 -0.617 c
+30.85 -0.569 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.261 31.137 -0.161 c
+31.166 -0.055 31.181 0.059 31.181 0.177 c
+h
+36.403 -0.249 m
+36.403 -0.419 36.362 -0.569 36.285 -0.706 c
+36.215 -0.833 36.112 -0.947 35.976 -1.043 c
+35.848 -1.132 35.686 -1.201 35.491 -1.249 c
+35.304 -1.296 35.087 -1.323 34.844 -1.323 c
+34.616 -1.323 34.418 -1.308 34.242 -1.278 c
+34.065 -1.249 33.907 -1.201 33.772 -1.132 c
+33.631 -1.055 33.521 -0.955 33.433 -0.837 c
+33.345 -0.72 33.275 -0.573 33.228 -0.396 c
+34.036 -0.278 l
+34.055 -0.378 34.084 -0.455 34.124 -0.514 c
+34.171 -0.573 34.231 -0.617 34.3 -0.646 c
+34.367 -0.675 34.447 -0.702 34.535 -0.72 c
+34.624 -0.731 34.726 -0.735 34.844 -0.735 c
+34.94 -0.735 35.035 -0.731 35.123 -0.72 c
+35.212 -0.702 35.289 -0.675 35.359 -0.646 c
+35.425 -0.617 35.476 -0.58 35.505 -0.529 c
+35.543 -0.481 35.565 -0.419 35.565 -0.338 c
+35.565 -0.242 35.535 -0.168 35.476 -0.118 c
+35.425 -0.07 35.359 -0.029 35.27 0 c
+35.183 0.038 35.073 0.067 34.948 0.088 c
+34.83 0.118 34.697 0.148 34.551 0.177 c
+34.41 0.214 34.271 0.254 34.124 0.294 c
+33.984 0.342 33.859 0.405 33.742 0.485 c
+33.631 0.563 33.544 0.662 33.477 0.78 c
+33.408 0.897 33.375 1.048 33.375 1.235 c
+33.375 1.389 33.404 1.532 33.463 1.661 c
+33.529 1.798 33.624 1.912 33.742 1.999 c
+33.867 2.088 34.025 2.154 34.212 2.205 c
+34.396 2.253 34.609 2.278 34.844 2.278 c
+35.028 2.278 35.204 2.257 35.374 2.22 c
+35.539 2.191 35.686 2.135 35.815 2.058 c
+35.939 1.989 36.05 1.889 36.138 1.764 c
+36.226 1.646 36.285 1.503 36.314 1.338 c
+35.52 1.264 l
+35.499 1.341 35.469 1.405 35.432 1.455 c
+35.392 1.515 35.345 1.559 35.285 1.588 c
+35.234 1.625 35.171 1.65 35.094 1.661 c
+35.013 1.669 34.932 1.676 34.844 1.676 c
+34.628 1.676 34.466 1.646 34.36 1.588 c
+34.249 1.536 34.198 1.449 34.198 1.324 c
+34.198 1.243 34.216 1.18 34.256 1.133 c
+34.304 1.081 34.367 1.044 34.447 1.015 c
+34.535 0.985 34.631 0.956 34.742 0.927 c
+34.848 0.904 34.969 0.882 35.109 0.853 c
+35.264 0.823 35.422 0.784 35.58 0.736 c
+35.734 0.684 35.873 0.622 35.991 0.545 c
+36.108 0.464 36.204 0.36 36.285 0.235 c
+36.362 0.107 36.403 -0.055 36.403 -0.249 c
+38.262 1.515 m
+38.379 1.786 38.53 1.985 38.718 2.103 c
+38.901 2.22 39.122 2.278 39.379 2.278 c
+39.584 2.278 39.754 2.242 39.894 2.176 c
+40.041 2.106 40.151 2.014 40.232 1.897 c
+40.32 1.779 40.378 1.636 40.408 1.47 c
+40.444 1.301 40.467 1.125 40.467 0.941 c
+40.467 -1.263 l
+39.555 -1.263 l
+39.555 0.736 l
+39.555 0.871 39.544 0.992 39.526 1.103 c
+39.515 1.21 39.489 1.297 39.453 1.368 c
+39.412 1.445 39.353 1.503 39.276 1.544 c
+39.206 1.58 39.114 1.603 38.996 1.603 c
+38.886 1.603 38.791 1.577 38.703 1.529 c
+38.615 1.478 38.534 1.411 38.468 1.324 c
+38.409 1.235 38.358 1.125 38.321 1 c
+38.291 0.882 38.277 0.75 38.277 0.603 c
+38.277 -1.263 l
+37.365 -1.263 l
+37.365 3.514 l
+38.277 3.514 l
+38.277 2.205 l
+38.277 2.135 38.269 2.066 38.262 1.999 c
+38.262 1.794 l
+38.262 1.735 38.254 1.68 38.248 1.632 c
+38.248 1.515 l
+h
+46.354 2.22 m
+46.362 2.198 46.368 2.165 46.368 2.117 c
+46.376 2.077 46.383 2.029 46.383 1.97 c
+46.391 1.919 46.398 1.867 46.398 1.808 c
+46.398 1.646 l
+46.412 1.646 l
+46.472 1.764 46.537 1.86 46.618 1.941 c
+46.695 2.018 46.78 2.08 46.869 2.132 c
+46.956 2.191 47.044 2.228 47.133 2.249 c
+47.228 2.268 47.328 2.278 47.426 2.278 c
+47.632 2.278 47.812 2.234 47.97 2.147 c
+48.125 2.058 48.253 1.929 48.353 1.764 c
+48.459 1.607 48.536 1.415 48.588 1.191 c
+48.647 0.975 48.676 0.739 48.676 0.485 c
+48.676 0.221 48.647 -0.025 48.588 -0.249 c
+48.536 -0.467 48.459 -0.658 48.353 -0.823 c
+48.253 -0.98 48.122 -1.102 47.956 -1.19 c
+47.798 -1.278 47.611 -1.323 47.397 -1.323 c
+47.298 -1.323 47.199 -1.311 47.104 -1.294 c
+47.004 -1.271 46.912 -1.242 46.824 -1.19 c
+46.743 -1.142 46.666 -1.08 46.589 -0.999 c
+46.52 -0.922 46.46 -0.83 46.412 -0.72 c
+46.398 -0.72 l
+46.398 -0.808 l
+46.405 -0.849 46.412 -0.897 46.412 -0.955 c
+46.412 -1.117 l
+46.412 -1.294 l
+46.412 -2.63 l
+45.501 -2.63 l
+45.501 1.455 l
+45.501 1.621 45.494 1.768 45.487 1.897 c
+45.487 2.22 l
+h
+46.398 0.456 m
+46.398 0.229 46.416 0.038 46.457 -0.118 c
+46.505 -0.264 46.559 -0.382 46.618 -0.47 c
+46.684 -0.558 46.758 -0.625 46.838 -0.661 c
+46.916 -0.702 46.993 -0.72 47.074 -0.72 c
+47.17 -0.72 47.258 -0.698 47.339 -0.646 c
+47.426 -0.598 47.493 -0.529 47.544 -0.44 c
+47.603 -0.345 47.647 -0.22 47.677 -0.073 c
+47.713 0.081 47.735 0.269 47.735 0.485 c
+47.735 0.875 47.677 1.169 47.559 1.368 c
+47.449 1.563 47.295 1.661 47.089 1.661 c
+47.008 1.661 46.931 1.64 46.854 1.603 c
+46.773 1.563 46.699 1.5 46.633 1.411 c
+46.563 1.324 46.505 1.199 46.457 1.044 c
+46.416 0.886 46.398 0.691 46.398 0.456 c
+52.751 0.485 m
+52.751 0.21 52.714 -0.04 52.648 -0.264 c
+52.579 -0.481 52.476 -0.668 52.34 -0.823 c
+52.201 -0.98 52.024 -1.102 51.81 -1.19 c
+51.594 -1.278 51.34 -1.323 51.046 -1.323 c
+50.771 -1.323 50.524 -1.278 50.312 -1.19 c
+50.106 -1.102 49.933 -0.98 49.797 -0.823 c
+49.657 -0.668 49.554 -0.481 49.489 -0.264 c
+49.419 -0.04 49.385 0.21 49.385 0.485 c
+49.385 0.739 49.415 0.975 49.473 1.191 c
+49.539 1.415 49.643 1.607 49.782 1.764 c
+49.918 1.929 50.094 2.058 50.312 2.147 c
+50.524 2.234 50.782 2.278 51.076 2.278 c
+51.388 2.278 51.649 2.234 51.854 2.147 c
+52.068 2.058 52.241 1.929 52.369 1.764 c
+52.505 1.607 52.604 1.415 52.664 1.191 c
+52.722 0.975 52.751 0.739 52.751 0.485 c
+51.796 0.485 m
+51.796 0.691 51.781 0.867 51.752 1.015 c
+51.73 1.162 51.694 1.283 51.634 1.382 c
+51.575 1.478 51.502 1.548 51.414 1.588 c
+51.326 1.636 51.216 1.661 51.091 1.661 c
+50.826 1.661 50.634 1.563 50.518 1.368 c
+50.399 1.18 50.341 0.886 50.341 0.485 c
+50.341 0.063 50.399 -0.242 50.518 -0.426 c
+50.634 -0.613 50.811 -0.706 51.046 -0.706 c
+51.172 -0.706 51.285 -0.687 51.384 -0.646 c
+51.48 -0.598 51.561 -0.525 51.619 -0.426 c
+51.686 -0.33 51.73 -0.205 51.752 -0.058 c
+51.781 0.088 51.796 0.269 51.796 0.485 c
+54.475 2.22 m
+54.482 2.198 54.49 2.165 54.49 2.117 c
+54.497 2.077 54.505 2.029 54.505 1.97 c
+54.512 1.919 54.519 1.867 54.519 1.808 c
+54.519 1.646 l
+54.534 1.646 l
+54.593 1.764 54.659 1.86 54.74 1.941 c
+54.817 2.018 54.902 2.08 54.989 2.132 c
+55.077 2.191 55.166 2.228 55.254 2.249 c
+55.349 2.268 55.449 2.278 55.548 2.278 c
+55.754 2.278 55.934 2.234 56.092 2.147 c
+56.246 2.058 56.375 1.929 56.474 1.764 c
+56.581 1.607 56.658 1.415 56.71 1.191 c
+56.768 0.975 56.797 0.739 56.797 0.485 c
+56.797 0.221 56.768 -0.025 56.71 -0.249 c
+56.658 -0.467 56.581 -0.658 56.474 -0.823 c
+56.375 -0.98 56.242 -1.102 56.077 -1.19 c
+55.919 -1.278 55.731 -1.323 55.519 -1.323 c
+55.419 -1.323 55.32 -1.311 55.224 -1.294 c
+55.125 -1.271 55.033 -1.242 54.946 -1.19 c
+54.865 -1.142 54.788 -1.08 54.711 -0.999 c
+54.64 -0.922 54.582 -0.83 54.534 -0.72 c
+54.519 -0.72 l
+54.519 -0.808 l
+54.526 -0.849 54.534 -0.897 54.534 -0.955 c
+54.534 -1.117 l
+54.534 -1.294 l
+54.534 -2.63 l
+53.622 -2.63 l
+53.622 1.455 l
+53.622 1.621 53.615 1.768 53.608 1.897 c
+53.608 2.22 l
+h
+54.519 0.456 m
+54.519 0.229 54.537 0.038 54.578 -0.118 c
+54.626 -0.264 54.68 -0.382 54.74 -0.47 c
+54.806 -0.558 54.879 -0.625 54.96 -0.661 c
+55.037 -0.702 55.114 -0.72 55.195 -0.72 c
+55.291 -0.72 55.379 -0.698 55.459 -0.646 c
+55.548 -0.598 55.614 -0.529 55.665 -0.44 c
+55.725 -0.345 55.769 -0.22 55.798 -0.073 c
+55.835 0.081 55.856 0.269 55.856 0.485 c
+55.856 0.875 55.798 1.169 55.68 1.368 c
+55.57 1.563 55.416 1.661 55.21 1.661 c
+55.129 1.661 55.052 1.64 54.975 1.603 c
+54.894 1.563 54.821 1.5 54.754 1.411 c
+54.684 1.324 54.626 1.199 54.578 1.044 c
+54.537 0.886 54.519 0.691 54.519 0.456 c
+f
+Q
+q 1 0 0 1 326.4111 120.7036 cm
+0 0 m
+-1.808 0 l
+-2.219 -1.396 l
+-2.911 -1.396 l
+-1.19 3.954 l
+-0.617 3.954 l
+1.118 -1.396 l
+0.426 -1.396 l
+h
+-1.631 0.588 m
+-0.176 0.588 l
+-0.897 3.013 l
+h
+4.63 0.397 m
+4.63 -0.231 4.513 -0.702 4.278 -1.014 c
+4.05 -1.319 3.734 -1.47 3.323 -1.47 c
+2.918 -1.47 2.61 -1.319 2.396 -1.014 c
+2.396 -2.925 l
+1.75 -2.925 l
+1.75 2.587 l
+2.338 2.587 l
+2.382 2.146 l
+2.595 2.488 2.903 2.66 3.308 2.66 c
+3.749 2.66 4.075 2.506 4.293 2.205 c
+4.505 1.9 4.619 1.444 4.63 0.838 c
+h
+3.984 0.779 m
+3.984 1.22 3.913 1.544 3.778 1.749 c
+3.638 1.962 3.418 2.072 3.117 2.072 c
+2.801 2.072 2.562 1.918 2.396 1.617 c
+2.396 -0.455 l
+2.562 -0.761 2.801 -0.912 3.117 -0.912 c
+3.41 -0.912 3.624 -0.808 3.763 -0.603 c
+3.899 -0.389 3.973 -0.059 3.984 0.382 c
+h
+8.349 0.397 m
+8.349 -0.231 8.231 -0.702 7.996 -1.014 c
+7.769 -1.319 7.453 -1.47 7.041 -1.47 c
+6.637 -1.47 6.328 -1.319 6.115 -1.014 c
+6.115 -2.925 l
+5.469 -2.925 l
+5.469 2.587 l
+6.056 2.587 l
+6.101 2.146 l
+6.313 2.488 6.622 2.66 7.026 2.66 c
+7.468 2.66 7.794 2.506 8.011 2.205 c
+8.224 1.9 8.339 1.444 8.349 0.838 c
+h
+7.703 0.779 m
+7.703 1.22 7.633 1.544 7.497 1.749 c
+7.358 1.962 7.136 2.072 6.835 2.072 c
+6.519 2.072 6.28 1.918 6.115 1.617 c
+6.115 -0.455 l
+6.28 -0.761 6.519 -0.912 6.835 -0.912 c
+7.129 -0.912 7.342 -0.808 7.482 -0.603 c
+7.618 -0.389 7.691 -0.059 7.703 0.382 c
+h
+9.893 -1.396 -0.647 5.644 re
+11.994 -0.309 m
+12.715 2.587 l
+13.406 2.587 l
+12.112 -1.955 l
+12.013 -2.296 11.869 -2.558 11.686 -2.734 c
+11.51 -2.911 11.308 -2.999 11.084 -2.999 c
+10.995 -2.999 10.882 -2.977 10.745 -2.94 c
+10.745 -2.396 l
+10.892 -2.411 l
+11.076 -2.411 11.223 -2.367 11.333 -2.278 c
+11.439 -2.19 11.528 -2.032 11.597 -1.808 c
+11.715 -1.367 l
+10.554 2.587 l
+11.26 2.587 l
+h
+17.698 -0.382 m
+17.698 -0.235 17.643 -0.114 17.536 -0.015 c
+17.426 0.081 17.22 0.198 16.919 0.338 c
+16.573 0.485 16.331 0.607 16.184 0.706 c
+16.037 0.812 15.927 0.929 15.861 1.058 c
+15.79 1.183 15.757 1.341 15.757 1.529 c
+15.757 1.852 15.875 2.12 16.11 2.337 c
+16.345 2.55 16.647 2.66 17.022 2.66 c
+17.404 2.66 17.712 2.547 17.947 2.323 c
+18.183 2.095 18.3 1.808 18.3 1.455 c
+17.654 1.455 l
+17.654 1.631 17.595 1.783 17.477 1.911 c
+17.359 2.036 17.205 2.102 17.022 2.102 c
+16.823 2.102 16.673 2.047 16.566 1.94 c
+16.455 1.841 16.405 1.708 16.405 1.544 c
+16.405 1.415 16.441 1.309 16.522 1.22 c
+16.599 1.139 16.79 1.037 17.095 0.912 c
+17.573 0.724 17.904 0.536 18.08 0.353 c
+18.256 0.176 18.344 -0.052 18.344 -0.324 c
+18.344 -0.676 18.219 -0.956 17.978 -1.161 c
+17.742 -1.367 17.426 -1.47 17.037 -1.47 c
+16.613 -1.47 16.276 -1.353 16.023 -1.118 c
+15.765 -0.875 15.64 -0.569 15.64 -0.206 c
+16.287 -0.206 l
+16.295 -0.434 16.364 -0.61 16.493 -0.735 c
+16.617 -0.852 16.802 -0.912 17.037 -0.912 c
+17.249 -0.912 17.411 -0.864 17.521 -0.765 c
+17.639 -0.669 17.698 -0.54 17.698 -0.382 c
+20.035 3.543 m
+20.035 2.587 l
+20.638 2.587 l
+20.638 2.057 l
+20.035 2.057 l
+20.035 -0.412 l
+20.035 -0.569 20.057 -0.687 20.108 -0.765 c
+20.168 -0.845 20.256 -0.882 20.373 -0.882 c
+20.461 -0.882 20.55 -0.867 20.638 -0.838 c
+20.638 -1.396 l
+20.491 -1.444 20.336 -1.47 20.182 -1.47 c
+19.925 -1.47 19.73 -1.378 19.594 -1.191 c
+19.454 -1.007 19.389 -0.746 19.389 -0.412 c
+19.389 2.057 l
+18.786 2.057 l
+18.786 2.587 l
+19.389 2.587 l
+19.389 3.543 l
+h
+21.197 0.779 m
+21.197 1.356 21.332 1.812 21.608 2.146 c
+21.891 2.488 22.262 2.66 22.725 2.66 c
+23.185 2.66 23.551 2.491 23.827 2.161 c
+24.11 1.837 24.257 1.389 24.268 0.823 c
+24.268 0.397 l
+24.268 -0.173 24.125 -0.628 23.842 -0.97 c
+23.566 -1.305 23.199 -1.47 22.74 -1.47 c
+22.277 -1.47 21.905 -1.309 21.623 -0.985 c
+21.347 -0.654 21.203 -0.214 21.197 0.338 c
+h
+21.843 0.397 m
+21.843 -0.008 21.92 -0.324 22.078 -0.559 c
+22.244 -0.794 22.464 -0.912 22.74 -0.912 c
+23.306 -0.912 23.599 -0.5 23.622 0.324 c
+23.622 0.779 l
+23.622 1.18 23.537 1.5 23.372 1.735 c
+23.214 1.977 22.997 2.102 22.725 2.102 c
+22.46 2.102 22.244 1.977 22.078 1.735 c
+21.92 1.5 21.843 1.18 21.843 0.779 c
+h
+26.753 1.97 m
+26.664 1.988 26.566 1.999 26.458 1.999 c
+26.124 1.999 25.889 1.816 25.753 1.455 c
+25.753 -1.396 l
+25.106 -1.396 l
+25.106 2.587 l
+25.739 2.587 l
+25.753 2.175 l
+25.93 2.499 26.172 2.66 26.487 2.66 c
+26.595 2.66 26.683 2.639 26.753 2.602 c
+h
+28.752 -1.47 m
+28.252 -1.47 27.869 -1.323 27.605 -1.029 c
+27.341 -0.735 27.208 -0.301 27.208 0.279 c
+27.208 0.75 l
+27.208 1.345 27.333 1.812 27.59 2.146 c
+27.855 2.488 28.215 2.66 28.678 2.66 c
+29.138 2.66 29.479 2.506 29.707 2.205 c
+29.942 1.911 30.063 1.448 30.074 0.823 c
+30.074 0.397 l
+27.855 0.397 l
+27.855 0.309 l
+27.855 -0.125 27.932 -0.437 28.09 -0.632 c
+28.255 -0.819 28.487 -0.912 28.781 -0.912 c
+28.976 -0.912 29.149 -0.879 29.296 -0.808 c
+29.442 -0.731 29.579 -0.613 29.707 -0.455 c
+30.045 -0.867 l
+29.758 -1.272 29.328 -1.47 28.752 -1.47 c
+28.678 2.102 m
+28.403 2.102 28.201 2.007 28.075 1.822 c
+27.947 1.635 27.873 1.345 27.855 0.956 c
+29.428 0.956 l
+29.428 1.043 l
+29.406 1.426 29.34 1.694 29.222 1.852 c
+29.105 2.018 28.92 2.102 28.678 2.102 c
+30.721 0.779 m
+30.721 1.386 30.832 1.852 31.059 2.175 c
+31.295 2.499 31.622 2.66 32.044 2.66 c
+32.426 2.66 32.724 2.502 32.941 2.19 c
+32.941 4.248 l
+33.587 4.248 l
+33.587 -1.396 l
+32.999 -1.396 l
+32.956 -0.97 l
+32.75 -1.305 32.445 -1.47 32.044 -1.47 c
+31.632 -1.47 31.31 -1.315 31.074 -1 c
+30.839 -0.676 30.721 -0.22 30.721 0.368 c
+h
+31.368 0.397 m
+31.368 -0.044 31.43 -0.374 31.559 -0.588 c
+31.695 -0.794 31.916 -0.897 32.22 -0.897 c
+32.544 -0.897 32.783 -0.735 32.941 -0.412 c
+32.941 1.602 l
+32.772 1.914 32.533 2.072 32.22 2.072 c
+31.916 2.072 31.695 1.97 31.559 1.764 c
+31.43 1.558 31.368 1.234 31.368 0.794 c
+h
+f
+Q
+q 1 0 0 1 364.3793 120.38 cm
+0 0 m
+0 0.088 -0.044 0.166 -0.133 0.235 c
+-0.221 0.312 -0.408 0.416 -0.691 0.544 c
+-1.125 0.721 -1.422 0.9 -1.588 1.087 c
+-1.746 1.272 -1.823 1.503 -1.823 1.779 c
+-1.823 2.12 -1.702 2.404 -1.455 2.631 c
+-1.202 2.866 -0.864 2.984 -0.441 2.984 c
+-0.011 2.984 0.338 2.87 0.602 2.646 c
+0.867 2.419 0.999 2.117 0.999 1.735 c
+-0.044 1.735 l
+-0.044 2.058 -0.184 2.22 -0.456 2.22 c
+-0.566 2.22 -0.655 2.183 -0.721 2.117 c
+-0.79 2.047 -0.823 1.948 -0.823 1.823 c
+-0.823 1.735 -0.786 1.654 -0.706 1.588 c
+-0.628 1.529 -0.449 1.434 -0.162 1.309 c
+0.268 1.151 0.565 0.974 0.735 0.779 c
+0.911 0.592 0.999 0.342 0.999 0.029 c
+0.999 -0.324 0.867 -0.61 0.602 -0.823 c
+0.338 -1.04 -0.011 -1.147 -0.441 -1.147 c
+-0.736 -1.147 -0.996 -1.091 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.75 -0.5 c
+-1.867 -0.294 -1.926 -0.073 -1.926 0.162 c
+-0.941 0.162 l
+-0.941 -0.025 -0.904 -0.162 -0.823 -0.249 c
+-0.736 -0.338 -0.603 -0.382 -0.427 -0.382 c
+-0.144 -0.382 0 -0.257 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.395 2.911 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.01 2.884 -0.118 2.925 -0.176 c
+2.973 -0.235 3.057 -0.264 3.175 -0.264 c
+3.281 -0.264 3.366 -0.257 3.424 -0.235 c
+3.424 -1.043 l
+3.248 -1.109 3.057 -1.147 2.851 -1.147 c
+2.175 -1.147 1.83 -0.76 1.822 0.015 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.911 l
+1.822 2.911 l
+1.822 3.881 l
+h
+5.85 -1.072 m
+5.82 -1.014 5.791 -0.912 5.762 -0.764 c
+5.574 -1.022 5.325 -1.147 5.012 -1.147 c
+4.677 -1.147 4.398 -1.04 4.174 -0.823 c
+3.958 -0.598 3.85 -0.309 3.85 0.044 c
+3.85 0.456 3.983 0.772 4.247 1 c
+4.512 1.235 4.895 1.353 5.394 1.353 c
+5.718 1.353 l
+5.718 1.675 l
+5.718 1.852 5.681 1.974 5.614 2.043 c
+5.556 2.12 5.468 2.161 5.35 2.161 c
+5.093 2.161 4.968 2.007 4.968 1.706 c
+3.925 1.706 l
+3.925 2.076 4.06 2.381 4.336 2.616 c
+4.608 2.859 4.957 2.984 5.379 2.984 c
+5.82 2.984 6.158 2.866 6.393 2.631 c
+6.636 2.404 6.761 2.08 6.761 1.661 c
+6.761 -0.206 l
+6.761 -0.551 6.809 -0.819 6.908 -1.014 c
+6.908 -1.072 l
+h
+5.247 -0.324 m
+5.354 -0.324 5.446 -0.305 5.527 -0.264 c
+5.614 -0.216 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.468 0.735 l
+5.292 0.735 5.148 0.676 5.041 0.559 c
+4.943 0.449 4.895 0.302 4.895 0.118 c
+4.895 -0.176 5.012 -0.324 5.247 -0.324 c
+9.275 0 m
+9.275 0.088 9.231 0.166 9.142 0.235 c
+9.055 0.312 8.866 0.416 8.584 0.544 c
+8.151 0.721 7.852 0.9 7.688 1.087 c
+7.53 1.272 7.453 1.503 7.453 1.779 c
+7.453 2.12 7.573 2.404 7.819 2.631 c
+8.073 2.866 8.411 2.984 8.834 2.984 c
+9.263 2.984 9.612 2.87 9.878 2.646 c
+10.142 2.419 10.275 2.117 10.275 1.735 c
+9.231 1.735 l
+9.231 2.058 9.091 2.22 8.819 2.22 c
+8.708 2.22 8.621 2.183 8.554 2.117 c
+8.485 2.047 8.452 1.948 8.452 1.823 c
+8.452 1.735 8.488 1.654 8.569 1.588 c
+8.646 1.529 8.826 1.434 9.113 1.309 c
+9.543 1.151 9.841 0.974 10.009 0.779 c
+10.186 0.592 10.275 0.342 10.275 0.029 c
+10.275 -0.324 10.142 -0.61 9.878 -0.823 c
+9.612 -1.04 9.263 -1.147 8.834 -1.147 c
+8.54 -1.147 8.279 -1.091 8.055 -0.985 c
+7.827 -0.867 7.65 -0.706 7.526 -0.5 c
+7.408 -0.294 7.349 -0.073 7.349 0.162 c
+8.334 0.162 l
+8.334 -0.025 8.371 -0.162 8.452 -0.249 c
+8.54 -0.338 8.672 -0.382 8.849 -0.382 c
+9.132 -0.382 9.275 -0.257 9.275 0 c
+11.95 2.558 m
+12.174 2.841 12.45 2.984 12.773 2.984 c
+13.134 2.984 13.409 2.855 13.597 2.602 c
+13.791 2.344 13.89 1.962 13.89 1.455 c
+13.89 -1.072 l
+12.847 -1.072 l
+12.847 1.44 l
+12.847 1.675 12.806 1.841 12.729 1.941 c
+12.66 2.047 12.546 2.103 12.391 2.103 c
+12.203 2.103 12.057 2.018 11.95 1.852 c
+11.95 -1.072 l
+10.906 -1.072 l
+10.906 4.572 l
+11.95 4.572 l
+h
+f
+Q
+q 1 0 0 1 382.2233 119.7921 cm
+0 0 m
+0.214 0 0.387 0.063 0.515 0.191 c
+0.651 0.327 0.724 0.518 0.736 0.765 c
+1.353 0.765 l
+1.33 0.382 1.195 0.063 0.941 -0.191 c
+0.684 -0.437 0.372 -0.559 0 -0.559 c
+-0.492 -0.559 -0.867 -0.407 -1.132 -0.103 c
+-1.389 0.21 -1.514 0.676 -1.514 1.294 c
+-1.514 1.735 l
+-1.514 2.33 -1.389 2.786 -1.132 3.102 c
+-0.867 3.414 -0.492 3.572 0 3.572 c
+0.401 3.572 0.721 3.439 0.956 3.175 c
+1.198 2.918 1.33 2.573 1.353 2.132 c
+0.736 2.132 l
+0.713 2.425 0.64 2.646 0.515 2.793 c
+0.397 2.94 0.225 3.013 0 3.013 c
+-0.294 3.013 -0.511 2.914 -0.646 2.72 c
+-0.786 2.532 -0.86 2.224 -0.867 1.793 c
+-0.867 1.279 l
+-0.867 0.809 -0.801 0.474 -0.661 0.279 c
+-0.514 0.092 -0.294 0 0 0 c
+1.97 1.691 m
+1.97 2.267 2.106 2.723 2.382 3.057 c
+2.664 3.4 3.036 3.572 3.499 3.572 c
+3.958 3.572 4.326 3.403 4.601 3.072 c
+4.884 2.749 5.031 2.301 5.042 1.735 c
+5.042 1.309 l
+5.042 0.738 4.898 0.283 4.616 -0.058 c
+4.341 -0.393 3.973 -0.559 3.514 -0.559 c
+3.051 -0.559 2.679 -0.397 2.396 -0.073 c
+2.12 0.258 1.977 0.698 1.97 1.249 c
+h
+2.617 1.309 m
+2.617 0.904 2.694 0.588 2.852 0.353 c
+3.017 0.118 3.238 0 3.514 0 c
+4.079 0 4.373 0.412 4.395 1.235 c
+4.395 1.691 l
+4.395 2.091 4.31 2.411 4.146 2.646 c
+3.988 2.889 3.77 3.013 3.499 3.013 c
+3.234 3.013 3.017 2.889 2.852 2.646 c
+2.694 2.411 2.617 2.091 2.617 1.691 c
+h
+6.498 3.499 m
+6.512 3.057 l
+6.766 3.4 7.089 3.572 7.483 3.572 c
+8.188 3.572 8.544 3.102 8.555 2.161 c
+8.555 -0.484 l
+7.909 -0.484 l
+7.909 2.132 l
+7.909 2.444 7.853 2.664 7.747 2.793 c
+7.637 2.918 7.483 2.984 7.277 2.984 c
+7.119 2.984 6.972 2.929 6.835 2.822 c
+6.707 2.712 6.604 2.577 6.527 2.411 c
+6.527 -0.484 l
+5.88 -0.484 l
+5.88 3.499 l
+h
+10.378 4.454 m
+10.378 3.499 l
+10.98 3.499 l
+10.98 2.969 l
+10.378 2.969 l
+10.378 0.5 l
+10.378 0.342 10.4 0.225 10.452 0.147 c
+10.51 0.067 10.598 0.029 10.716 0.029 c
+10.804 0.029 10.892 0.044 10.98 0.073 c
+10.98 -0.484 l
+10.834 -0.532 10.679 -0.559 10.525 -0.559 c
+10.267 -0.559 10.073 -0.467 9.937 -0.279 c
+9.797 -0.095 9.731 0.166 9.731 0.5 c
+9.731 2.969 l
+9.129 2.969 l
+9.129 3.499 l
+9.731 3.499 l
+9.731 4.454 l
+h
+13.17 -0.559 m
+12.671 -0.559 12.289 -0.411 12.025 -0.118 c
+11.759 0.177 11.628 0.611 11.628 1.191 c
+11.628 1.661 l
+11.628 2.257 11.753 2.723 12.009 3.057 c
+12.274 3.4 12.634 3.572 13.097 3.572 c
+13.557 3.572 13.898 3.418 14.126 3.117 c
+14.361 2.822 14.483 2.359 14.494 1.735 c
+14.494 1.309 l
+12.274 1.309 l
+12.274 1.22 l
+12.274 0.786 12.351 0.474 12.509 0.279 c
+12.675 0.092 12.906 0 13.2 0 c
+13.395 0 13.567 0.033 13.714 0.103 c
+13.862 0.181 13.997 0.298 14.126 0.456 c
+14.464 0.044 l
+14.178 -0.36 13.748 -0.559 13.17 -0.559 c
+13.097 3.013 m
+12.821 3.013 12.619 2.918 12.495 2.734 c
+12.366 2.547 12.293 2.257 12.274 1.867 c
+13.847 1.867 l
+13.847 1.955 l
+13.825 2.338 13.758 2.606 13.641 2.764 c
+13.523 2.929 13.34 3.013 13.097 3.013 c
+15.89 3.499 m
+15.905 3.057 l
+16.158 3.4 16.482 3.572 16.875 3.572 c
+17.581 3.572 17.937 3.102 17.947 2.161 c
+17.947 -0.484 l
+17.301 -0.484 l
+17.301 2.132 l
+17.301 2.444 17.246 2.664 17.139 2.793 c
+17.029 2.918 16.875 2.984 16.669 2.984 c
+16.511 2.984 16.364 2.929 16.228 2.822 c
+16.1 2.712 15.996 2.577 15.919 2.411 c
+15.919 -0.484 l
+15.273 -0.484 l
+15.273 3.499 l
+h
+19.771 4.454 m
+19.771 3.499 l
+20.374 3.499 l
+20.374 2.969 l
+19.771 2.969 l
+19.771 0.5 l
+19.771 0.342 19.792 0.225 19.844 0.147 c
+19.903 0.067 19.991 0.029 20.108 0.029 c
+20.197 0.029 20.285 0.044 20.374 0.073 c
+20.374 -0.484 l
+20.226 -0.532 20.072 -0.559 19.917 -0.559 c
+19.66 -0.559 19.466 -0.467 19.329 -0.279 c
+19.19 -0.095 19.123 0.166 19.123 0.5 c
+19.123 2.969 l
+18.521 2.969 l
+18.521 3.499 l
+19.123 3.499 l
+19.123 4.454 l
+h
+23.563 -0.484 -0.646 3.983 re
+23.607 4.542 m
+23.607 4.432 23.578 4.341 23.518 4.262 c
+23.46 4.193 23.364 4.16 23.24 4.16 c
+23.121 4.16 23.026 4.193 22.961 4.262 c
+22.901 4.341 22.872 4.432 22.872 4.542 c
+22.872 4.659 22.901 4.752 22.961 4.821 c
+23.026 4.898 23.121 4.939 23.24 4.939 c
+23.364 4.939 23.46 4.898 23.518 4.821 c
+23.578 4.74 23.607 4.649 23.607 4.542 c
+25.195 3.499 m
+25.209 3.057 l
+25.463 3.4 25.787 3.572 26.179 3.572 c
+26.884 3.572 27.241 3.102 27.252 2.161 c
+27.252 -0.484 l
+26.606 -0.484 l
+26.606 2.132 l
+26.606 2.444 26.55 2.664 26.444 2.793 c
+26.334 2.918 26.179 2.984 25.974 2.984 c
+25.816 2.984 25.669 2.929 25.533 2.822 c
+25.404 2.712 25.301 2.577 25.224 2.411 c
+25.224 -0.484 l
+24.577 -0.484 l
+24.577 3.499 l
+h
+29.075 4.454 m
+29.075 3.499 l
+29.678 3.499 l
+29.678 2.969 l
+29.075 2.969 l
+29.075 0.5 l
+29.075 0.342 29.097 0.225 29.149 0.147 c
+29.207 0.067 29.296 0.029 29.413 0.029 c
+29.502 0.029 29.59 0.044 29.678 0.073 c
+29.678 -0.484 l
+29.531 -0.532 29.376 -0.559 29.222 -0.559 c
+28.964 -0.559 28.77 -0.467 28.634 -0.279 c
+28.494 -0.095 28.428 0.166 28.428 0.5 c
+28.428 2.969 l
+27.825 2.969 l
+27.825 3.499 l
+28.428 3.499 l
+28.428 4.454 l
+h
+30.236 1.691 m
+30.236 2.267 30.373 2.723 30.647 3.057 c
+30.931 3.4 31.302 3.572 31.765 3.572 c
+32.224 3.572 32.592 3.403 32.868 3.072 c
+33.151 2.749 33.297 2.301 33.309 1.735 c
+33.309 1.309 l
+33.309 0.738 33.165 0.283 32.883 -0.058 c
+32.607 -0.393 32.239 -0.559 31.78 -0.559 c
+31.316 -0.559 30.946 -0.397 30.662 -0.073 c
+30.387 0.258 30.244 0.698 30.236 1.249 c
+h
+30.883 1.309 m
+30.883 0.904 30.961 0.588 31.118 0.353 c
+31.283 0.118 31.504 0 31.78 0 c
+32.345 0 32.64 0.412 32.662 1.235 c
+32.662 1.691 l
+32.662 2.091 32.577 2.411 32.412 2.646 c
+32.254 2.889 32.037 3.013 31.765 3.013 c
+31.501 3.013 31.283 2.889 31.118 2.646 c
+30.961 2.411 30.883 2.091 30.883 1.691 c
+h
+f
+Q
+q 1 0 0 1 420.882 121.0564 cm
+0 0 m
+0.353 2.234 l
+1.353 2.234 l
+0.53 -1.749 l
+-0.338 -1.749 l
+-0.897 0.559 l
+-1.455 -1.749 l
+-2.323 -1.749 l
+-3.146 2.234 l
+-2.146 2.234 l
+-1.793 0 l
+-1.264 2.234 l
+-0.529 2.234 l
+h
+1.75 0.368 m
+1.75 0.974 1.889 1.448 2.176 1.793 c
+2.458 2.135 2.851 2.308 3.352 2.308 c
+3.859 2.308 4.256 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.368 c
+4.968 0.103 l
+4.968 -0.496 4.825 -0.966 4.542 -1.309 c
+4.256 -1.654 3.859 -1.823 3.352 -1.823 c
+2.841 -1.823 2.444 -1.654 2.161 -1.309 c
+1.885 -0.966 1.75 -0.492 1.75 0.118 c
+h
+2.793 0.103 m
+2.793 -0.603 2.977 -0.956 3.352 -0.956 c
+3.705 -0.956 3.896 -0.661 3.925 -0.073 c
+3.925 0.368 l
+3.925 0.727 3.873 0.999 3.778 1.176 c
+3.678 1.352 3.535 1.44 3.352 1.44 c
+3.175 1.44 3.036 1.352 2.94 1.176 c
+2.841 0.999 2.793 0.727 2.793 0.368 c
+h
+7.57 1.22 m
+7.232 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.881 c
+6.659 -1.749 l
+5.615 -1.749 l
+5.615 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.306 2.308 c
+7.423 2.308 7.515 2.286 7.585 2.249 c
+h
+9.437 -0.22 m
+9.157 -0.53 l
+9.157 -1.749 l
+8.114 -1.749 l
+8.114 3.896 l
+9.157 3.896 l
+9.157 0.852 l
+9.276 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.084 0.588 l
+11.348 -1.749 l
+10.157 -1.749 l
+h
+12.803 -1.749 -1.044 3.983 re
+11.715 3.263 m
+11.715 3.418 11.763 3.547 11.863 3.645 c
+11.969 3.752 12.104 3.807 12.274 3.807 c
+12.45 3.807 12.586 3.752 12.685 3.645 c
+12.792 3.547 12.847 3.418 12.847 3.263 c
+12.847 3.094 12.792 2.959 12.685 2.851 c
+12.586 2.753 12.45 2.705 12.274 2.705 c
+12.104 2.705 11.969 2.753 11.863 2.851 c
+11.763 2.959 11.715 3.094 11.715 3.263 c
+14.566 2.234 m
+14.596 1.837 l
+14.832 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.826 16.566 0.867 c
+16.566 -1.749 l
+15.522 -1.749 l
+15.522 0.794 l
+15.522 1.018 15.486 1.18 15.42 1.278 c
+15.35 1.374 15.232 1.426 15.067 1.426 c
+14.88 1.426 14.732 1.33 14.626 1.147 c
+14.626 -1.749 l
+13.582 -1.749 l
+13.582 2.234 l
+h
+17.184 0.368 m
+17.184 1.014 17.301 1.5 17.536 1.822 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.165 19.359 1.881 c
+19.403 2.234 l
+20.343 2.234 l
+20.343 -1.749 l
+20.343 -2.256 20.2 -2.646 19.917 -2.911 c
+19.63 -3.183 19.227 -3.322 18.697 -3.322 c
+18.47 -3.322 18.234 -3.278 17.992 -3.19 c
+17.756 -3.102 17.581 -2.988 17.463 -2.851 c
+17.816 -2.132 l
+17.911 -2.238 18.04 -2.323 18.198 -2.381 c
+18.352 -2.448 18.499 -2.485 18.639 -2.485 c
+18.874 -2.485 19.039 -2.425 19.138 -2.308 c
+19.245 -2.198 19.3 -2.021 19.3 -1.779 c
+19.3 -1.426 l
+19.102 -1.691 18.844 -1.823 18.521 -1.823 c
+18.098 -1.823 17.771 -1.661 17.536 -1.338 c
+17.309 -1.007 17.191 -0.536 17.184 0.073 c
+h
+18.227 0.103 m
+18.227 -0.272 18.275 -0.54 18.374 -0.706 c
+18.47 -0.875 18.624 -0.956 18.83 -0.956 c
+19.042 -0.956 19.2 -0.879 19.3 -0.721 c
+19.3 1.176 l
+19.19 1.341 19.035 1.426 18.83 1.426 c
+18.624 1.426 18.47 1.341 18.374 1.176 c
+18.275 1.007 18.227 0.738 18.227 0.368 c
+h
+22.695 0.368 m
+22.695 1.014 22.802 1.5 23.019 1.822 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.555 2.175 24.754 1.911 c
+24.754 3.896 l
+25.812 3.896 l
+25.812 -1.749 l
+24.856 -1.749 l
+24.812 -1.338 l
+24.596 -1.661 24.32 -1.823 23.989 -1.823 c
+23.578 -1.823 23.258 -1.668 23.033 -1.353 c
+22.817 -1.029 22.703 -0.559 22.695 0.058 c
+h
+23.739 0.103 m
+23.739 -0.291 23.776 -0.566 23.857 -0.721 c
+23.945 -0.879 24.092 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.754 -0.676 c
+24.754 1.132 l
+24.654 1.326 24.503 1.426 24.297 1.426 c
+24.099 1.426 23.96 1.345 23.871 1.191 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.749 -1.043 3.983 re
+26.576 3.263 m
+26.576 3.418 26.624 3.547 26.723 3.645 c
+26.83 3.752 26.965 3.807 27.135 3.807 c
+27.311 3.807 27.447 3.752 27.546 3.645 c
+27.653 3.547 27.708 3.418 27.708 3.263 c
+27.708 3.094 27.653 2.959 27.546 2.851 c
+27.447 2.753 27.311 2.705 27.135 2.705 c
+26.965 2.705 26.83 2.753 26.723 2.851 c
+26.624 2.959 26.576 3.094 26.576 3.263 c
+30.427 1.22 m
+30.089 1.249 l
+29.803 1.249 29.612 1.124 29.516 0.881 c
+29.516 -1.749 l
+28.472 -1.749 l
+28.472 2.234 l
+29.442 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.163 2.308 c
+30.28 2.308 30.372 2.286 30.442 2.249 c
+h
+32.5 -1.823 m
+31.97 -1.823 31.551 -1.668 31.25 -1.353 c
+30.956 -1.029 30.809 -0.569 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.946 1.448 31.221 1.793 c
+31.493 2.135 31.886 2.308 32.397 2.308 c
+32.897 2.308 33.267 2.146 33.514 1.822 c
+33.768 1.5 33.9 1.022 33.911 0.397 c
+33.911 -0.103 l
+31.838 -0.103 l
+31.856 -0.397 31.919 -0.613 32.029 -0.75 c
+32.147 -0.889 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.724 -1.411 33.536 -1.554 33.294 -1.661 c
+33.047 -1.768 32.783 -1.823 32.5 -1.823 c
+31.853 0.617 m
+32.882 0.617 l
+32.882 0.721 l
+32.882 0.956 32.841 1.132 32.764 1.249 c
+32.694 1.374 32.566 1.44 32.382 1.44 c
+32.205 1.44 32.074 1.371 31.985 1.234 c
+31.904 1.106 31.86 0.9 31.853 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.384 -0.761 36.395 -0.368 c
+37.365 -0.368 l
+37.365 -0.802 37.233 -1.154 36.968 -1.426 c
+36.704 -1.691 36.365 -1.823 35.954 -1.823 c
+35.443 -1.823 35.05 -1.668 34.778 -1.353 c
+34.514 -1.029 34.374 -0.559 34.366 0.058 c
+34.366 0.382 l
+34.366 1.007 34.499 1.484 34.763 1.808 c
+35.035 2.138 35.432 2.308 35.954 2.308 c
+36.384 2.308 36.726 2.168 36.983 1.897 c
+37.236 1.621 37.365 1.238 37.365 0.75 c
+36.395 0.75 l
+36.395 0.962 36.355 1.132 36.278 1.249 c
+36.207 1.374 36.09 1.44 35.925 1.44 c
+35.748 1.44 35.619 1.374 35.542 1.249 c
+35.461 1.12 35.418 0.871 35.41 0.5 c
+35.41 0.088 l
+35.41 -0.235 35.424 -0.463 35.455 -0.588 c
+35.491 -0.717 35.546 -0.808 35.616 -0.867 c
+35.694 -0.926 35.8 -0.956 35.939 -0.956 c
+39.173 3.204 m
+39.173 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.173 1.44 l
+39.173 -0.53 l
+39.173 -0.687 39.191 -0.794 39.232 -0.852 c
+39.28 -0.912 39.364 -0.941 39.482 -0.941 c
+39.588 -0.941 39.673 -0.933 39.731 -0.912 c
+39.731 -1.72 l
+39.555 -1.786 39.364 -1.823 39.158 -1.823 c
+38.482 -1.823 38.137 -1.437 38.129 -0.661 c
+38.129 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.368 m
+40.055 0.974 40.195 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.848 1.793 c
+43.131 1.448 43.274 0.974 43.274 0.368 c
+43.274 0.103 l
+43.274 -0.496 43.131 -0.966 42.848 -1.309 c
+42.561 -1.654 42.164 -1.823 41.657 -1.823 c
+41.146 -1.823 40.75 -1.654 40.467 -1.309 c
+40.191 -0.966 40.055 -0.492 40.055 0.118 c
+h
+41.099 0.103 m
+41.099 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.202 -0.661 42.231 -0.073 c
+42.231 0.368 l
+42.231 0.727 42.179 0.999 42.083 1.176 c
+41.984 1.352 41.841 1.44 41.657 1.44 c
+41.481 1.44 41.341 1.352 41.246 1.176 c
+41.146 0.999 41.099 0.727 41.099 0.368 c
+h
+45.876 1.22 m
+45.537 1.249 l
+45.251 1.249 45.06 1.124 44.965 0.881 c
+44.965 -1.749 l
+43.921 -1.749 l
+43.921 2.234 l
+44.891 2.234 l
+44.92 1.793 l
+45.086 2.135 45.317 2.308 45.611 2.308 c
+45.729 2.308 45.821 2.286 45.89 2.249 c
+h
+47.772 -0.015 m
+48.301 2.234 l
+49.404 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.53 -3.352 46.993 -3.352 c
+46.865 -3.352 46.721 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.485 l
+46.85 -2.485 46.971 -2.448 47.052 -2.381 c
+47.129 -2.323 47.191 -2.213 47.243 -2.058 c
+47.316 -1.793 l
+46.17 2.234 l
+47.287 2.234 l
+h
+f
+Q
+q 1 0 0 1 470.8588 118.2342 cm
+0 0 m
+-0.397 0.264 l
+-0.162 0.588 -0.04 0.922 -0.029 1.264 c
+-0.029 1.881 l
+0.632 1.881 l
+0.632 1.352 l
+0.632 1.095 0.566 0.849 0.441 0.603 c
+0.324 0.36 0.177 0.158 0 0 c
+5.233 1.073 m
+5.193 1.161 5.167 1.309 5.16 1.514 c
+4.925 1.168 4.63 0.999 4.278 0.999 c
+3.913 0.999 3.63 1.095 3.425 1.294 c
+3.227 1.5 3.131 1.786 3.131 2.161 c
+3.131 2.562 3.267 2.881 3.543 3.116 c
+3.815 3.358 4.189 3.484 4.659 3.484 c
+5.145 3.484 l
+5.145 3.91 l
+5.145 4.145 5.089 4.31 4.983 4.409 c
+4.873 4.516 4.711 4.571 4.498 4.571 c
+4.299 4.571 4.138 4.513 4.013 4.395 c
+3.896 4.278 3.836 4.131 3.836 3.954 c
+3.19 3.954 l
+3.19 4.149 3.248 4.34 3.366 4.527 c
+3.491 4.711 3.653 4.858 3.851 4.968 c
+4.057 5.075 4.285 5.13 4.542 5.13 c
+4.943 5.13 5.247 5.027 5.453 4.821 c
+5.667 4.615 5.781 4.322 5.791 3.939 c
+5.791 1.926 l
+5.791 1.621 5.828 1.356 5.909 1.132 c
+5.909 1.073 l
+h
+4.366 1.587 m
+4.532 1.587 4.682 1.631 4.821 1.72 c
+4.968 1.808 5.075 1.918 5.145 2.057 c
+5.145 2.998 l
+4.777 2.998 l
+4.461 2.998 4.219 2.929 4.042 2.793 c
+3.866 2.664 3.778 2.477 3.778 2.234 c
+3.778 2.007 3.822 1.841 3.91 1.735 c
+3.998 1.635 4.149 1.587 4.366 1.587 c
+7.408 5.056 m
+7.423 4.615 l
+7.676 4.958 8 5.13 8.393 5.13 c
+9.099 5.13 9.455 4.659 9.467 3.719 c
+9.467 1.073 l
+8.819 1.073 l
+8.819 3.69 l
+8.819 4.002 8.765 4.222 8.658 4.351 c
+8.548 4.476 8.393 4.542 8.187 4.542 c
+8.029 4.542 7.882 4.487 7.747 4.38 c
+7.618 4.27 7.515 4.135 7.437 3.969 c
+7.437 1.073 l
+6.791 1.073 l
+6.791 5.056 l
+h
+10.304 3.248 m
+10.304 3.855 10.414 4.322 10.643 4.644 c
+10.878 4.968 11.204 5.13 11.627 5.13 c
+12.009 5.13 12.307 4.972 12.524 4.659 c
+12.524 6.718 l
+13.17 6.718 l
+13.17 1.073 l
+12.582 1.073 l
+12.538 1.5 l
+12.332 1.165 12.027 0.999 11.627 0.999 c
+11.215 0.999 10.892 1.154 10.657 1.469 c
+10.422 1.793 10.304 2.249 10.304 2.837 c
+h
+10.951 2.866 m
+10.951 2.425 11.013 2.095 11.142 1.881 c
+11.278 1.675 11.499 1.573 11.803 1.573 c
+12.127 1.573 12.366 1.735 12.524 2.057 c
+12.524 4.072 l
+12.355 4.384 12.116 4.542 11.803 4.542 c
+11.499 4.542 11.278 4.439 11.142 4.233 c
+11.013 4.027 10.951 3.704 10.951 3.263 c
+h
+17.271 1.558 m
+17.485 1.558 17.658 1.621 17.786 1.749 c
+17.922 1.885 17.995 2.076 18.007 2.323 c
+18.624 2.323 l
+18.602 1.94 18.466 1.621 18.212 1.367 c
+17.955 1.12 17.643 0.999 17.271 0.999 c
+16.779 0.999 16.405 1.151 16.139 1.455 c
+15.882 1.768 15.757 2.234 15.757 2.851 c
+15.757 3.293 l
+15.757 3.888 15.882 4.343 16.139 4.659 c
+16.405 4.972 16.779 5.13 17.271 5.13 c
+17.672 5.13 17.992 4.997 18.227 4.733 c
+18.47 4.476 18.602 4.131 18.624 3.69 c
+18.007 3.69 l
+17.984 3.983 17.911 4.204 17.786 4.351 c
+17.668 4.498 17.496 4.571 17.271 4.571 c
+16.978 4.571 16.761 4.472 16.625 4.278 c
+16.486 4.09 16.411 3.782 16.405 3.351 c
+16.405 2.837 l
+16.405 2.367 16.47 2.032 16.61 1.837 c
+16.757 1.65 16.978 1.558 17.271 1.558 c
+20.079 1.073 -0.647 5.644 re
+22.519 0.999 m
+22.019 0.999 21.637 1.147 21.373 1.44 c
+21.108 1.735 20.976 2.168 20.976 2.749 c
+20.976 3.219 l
+20.976 3.815 21.101 4.281 21.358 4.615 c
+21.623 4.958 21.982 5.13 22.445 5.13 c
+22.905 5.13 23.247 4.976 23.474 4.675 c
+23.709 4.38 23.831 3.917 23.842 3.293 c
+23.842 2.866 l
+21.623 2.866 l
+21.623 2.778 l
+21.623 2.344 21.7 2.032 21.858 1.837 c
+22.023 1.65 22.254 1.558 22.549 1.558 c
+22.743 1.558 22.915 1.591 23.063 1.661 c
+23.21 1.738 23.346 1.856 23.474 2.014 c
+23.813 1.602 l
+23.526 1.198 23.096 0.999 22.519 0.999 c
+22.445 4.571 m
+22.17 4.571 21.968 4.476 21.843 4.292 c
+21.714 4.104 21.641 3.815 21.623 3.425 c
+23.195 3.425 l
+23.195 3.513 l
+23.173 3.896 23.107 4.164 22.99 4.322 c
+22.872 4.487 22.688 4.571 22.445 4.571 c
+26.664 1.073 m
+26.624 1.161 26.598 1.309 26.591 1.514 c
+26.356 1.168 26.061 0.999 25.709 0.999 c
+25.345 0.999 25.062 1.095 24.856 1.294 c
+24.658 1.5 24.562 1.786 24.562 2.161 c
+24.562 2.562 24.698 2.881 24.974 3.116 c
+25.246 3.358 25.621 3.484 26.091 3.484 c
+26.576 3.484 l
+26.576 3.91 l
+26.576 4.145 26.521 4.31 26.414 4.409 c
+26.304 4.516 26.142 4.571 25.93 4.571 c
+25.731 4.571 25.569 4.513 25.444 4.395 c
+25.327 4.278 25.267 4.131 25.267 3.954 c
+24.621 3.954 l
+24.621 4.149 24.68 4.34 24.797 4.527 c
+24.922 4.711 25.084 4.858 25.282 4.968 c
+25.488 5.075 25.716 5.13 25.973 5.13 c
+26.374 5.13 26.678 5.027 26.884 4.821 c
+27.098 4.615 27.212 4.322 27.223 3.939 c
+27.223 1.926 l
+27.223 1.621 27.26 1.356 27.341 1.132 c
+27.341 1.073 l
+h
+25.797 1.587 m
+25.963 1.587 26.113 1.631 26.252 1.72 c
+26.4 1.808 26.506 1.918 26.576 2.057 c
+26.576 2.998 l
+26.208 2.998 l
+25.893 2.998 25.65 2.929 25.473 2.793 c
+25.297 2.664 25.209 2.477 25.209 2.234 c
+25.209 2.007 25.253 1.841 25.342 1.735 c
+25.429 1.635 25.581 1.587 25.797 1.587 c
+29.868 4.439 m
+29.78 4.457 29.681 4.469 29.575 4.469 c
+29.24 4.469 29.005 4.285 28.869 3.925 c
+28.869 1.073 l
+28.222 1.073 l
+28.222 5.056 l
+28.854 5.056 l
+28.869 4.644 l
+29.045 4.968 29.288 5.13 29.604 5.13 c
+29.71 5.13 29.799 5.108 29.868 5.072 c
+h
+f
+Q
+q 1 0 0 1 504.7546 120.38 cm
+0 0 m
+0 0.088 -0.043 0.166 -0.132 0.235 c
+-0.22 0.312 -0.407 0.416 -0.691 0.544 c
+-1.124 0.721 -1.421 0.9 -1.587 1.087 c
+-1.745 1.272 -1.822 1.503 -1.822 1.779 c
+-1.822 2.12 -1.701 2.404 -1.454 2.631 c
+-1.201 2.866 -0.864 2.984 -0.44 2.984 c
+-0.01 2.984 0.339 2.87 0.603 2.646 c
+0.867 2.419 1 2.117 1 1.735 c
+-0.043 1.735 l
+-0.043 2.058 -0.183 2.22 -0.455 2.22 c
+-0.565 2.22 -0.654 2.183 -0.72 2.117 c
+-0.789 2.047 -0.823 1.948 -0.823 1.823 c
+-0.823 1.735 -0.786 1.654 -0.706 1.588 c
+-0.628 1.529 -0.448 1.434 -0.162 1.309 c
+0.269 1.151 0.566 0.974 0.736 0.779 c
+0.912 0.592 1 0.342 1 0.029 c
+1 -0.324 0.867 -0.61 0.603 -0.823 c
+0.339 -1.04 -0.01 -1.147 -0.44 -1.147 c
+-0.735 -1.147 -0.995 -1.091 -1.219 -0.985 c
+-1.448 -0.867 -1.624 -0.706 -1.749 -0.5 c
+-1.866 -0.294 -1.925 -0.073 -1.925 0.162 c
+-0.941 0.162 l
+-0.941 -0.025 -0.904 -0.162 -0.823 -0.249 c
+-0.735 -0.338 -0.602 -0.382 -0.426 -0.382 c
+-0.143 -0.382 0 -0.257 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.396 2.911 l
+3.396 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.01 2.885 -0.118 2.926 -0.176 c
+2.974 -0.235 3.057 -0.264 3.175 -0.264 c
+3.282 -0.264 3.366 -0.257 3.425 -0.235 c
+3.425 -1.043 l
+3.249 -1.109 3.057 -1.147 2.852 -1.147 c
+2.176 -1.147 1.831 -0.76 1.823 0.015 c
+1.823 2.117 l
+1.368 2.117 l
+1.368 2.911 l
+1.823 2.911 l
+1.823 3.881 l
+h
+5.85 -1.072 m
+5.821 -1.014 5.792 -0.912 5.762 -0.764 c
+5.575 -1.022 5.326 -1.147 5.012 -1.147 c
+4.678 -1.147 4.399 -1.04 4.175 -0.823 c
+3.958 -0.598 3.851 -0.309 3.851 0.044 c
+3.851 0.456 3.984 0.772 4.248 1 c
+4.513 1.235 4.896 1.353 5.395 1.353 c
+5.718 1.353 l
+5.718 1.675 l
+5.718 1.852 5.681 1.974 5.615 2.043 c
+5.557 2.12 5.469 2.161 5.351 2.161 c
+5.093 2.161 4.969 2.007 4.969 1.706 c
+3.925 1.706 l
+3.925 2.076 4.061 2.381 4.337 2.616 c
+4.609 2.859 4.958 2.984 5.38 2.984 c
+5.821 2.984 6.159 2.866 6.394 2.631 c
+6.637 2.404 6.762 2.08 6.762 1.661 c
+6.762 -0.206 l
+6.762 -0.551 6.81 -0.819 6.909 -1.014 c
+6.909 -1.072 l
+h
+5.247 -0.324 m
+5.355 -0.324 5.446 -0.305 5.527 -0.264 c
+5.615 -0.216 5.678 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.469 0.735 l
+5.292 0.735 5.149 0.676 5.042 0.559 c
+4.943 0.449 4.896 0.302 4.896 0.118 c
+4.896 -0.176 5.012 -0.324 5.247 -0.324 c
+9.276 0 m
+9.276 0.088 9.231 0.166 9.143 0.235 c
+9.055 0.312 8.867 0.416 8.584 0.544 c
+8.151 0.721 7.853 0.9 7.688 1.087 c
+7.53 1.272 7.453 1.503 7.453 1.779 c
+7.453 2.12 7.574 2.404 7.82 2.631 c
+8.073 2.866 8.412 2.984 8.834 2.984 c
+9.264 2.984 9.613 2.87 9.878 2.646 c
+10.143 2.419 10.275 2.117 10.275 1.735 c
+9.231 1.735 l
+9.231 2.058 9.091 2.22 8.819 2.22 c
+8.709 2.22 8.621 2.183 8.555 2.117 c
+8.486 2.047 8.453 1.948 8.453 1.823 c
+8.453 1.735 8.489 1.654 8.57 1.588 c
+8.647 1.529 8.827 1.434 9.114 1.309 c
+9.544 1.151 9.841 0.974 10.01 0.779 c
+10.186 0.592 10.275 0.342 10.275 0.029 c
+10.275 -0.324 10.143 -0.61 9.878 -0.823 c
+9.613 -1.04 9.264 -1.147 8.834 -1.147 c
+8.54 -1.147 8.279 -1.091 8.056 -0.985 c
+7.828 -0.867 7.651 -0.706 7.526 -0.5 c
+7.408 -0.294 7.35 -0.073 7.35 0.162 c
+8.335 0.162 l
+8.335 -0.025 8.372 -0.162 8.453 -0.249 c
+8.54 -0.338 8.673 -0.382 8.85 -0.382 c
+9.132 -0.382 9.276 -0.257 9.276 0 c
+11.951 2.558 m
+12.175 2.841 12.451 2.984 12.773 2.984 c
+13.134 2.984 13.409 2.855 13.597 2.602 c
+13.792 2.344 13.891 1.962 13.891 1.455 c
+13.891 -1.072 l
+12.848 -1.072 l
+12.848 1.44 l
+12.848 1.675 12.807 1.841 12.73 1.941 c
+12.66 2.047 12.546 2.103 12.391 2.103 c
+12.204 2.103 12.057 2.018 11.951 1.852 c
+11.951 -1.072 l
+10.907 -1.072 l
+10.907 4.572 l
+11.951 4.572 l
+h
+f
+Q
+q 1 0 0 1 519.5421 119.6604 cm
+0 0 m
+0 0.118 0.033 0.213 0.103 0.294 c
+0.169 0.371 0.272 0.411 0.412 0.411 c
+0.559 0.411 0.665 0.371 0.735 0.294 c
+0.812 0.213 0.852 0.118 0.852 0 c
+0.852 -0.111 0.812 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.111 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 113.704 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 106.8644 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.566 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+24.22 -0.25 m
+24.22 -0.419 24.18 -0.569 24.103 -0.706 c
+24.033 -0.834 23.931 -0.948 23.794 -1.043 c
+23.666 -1.132 23.504 -1.201 23.31 -1.249 c
+23.121 -1.297 22.905 -1.323 22.662 -1.323 c
+22.435 -1.323 22.236 -1.309 22.06 -1.278 c
+21.883 -1.249 21.725 -1.201 21.59 -1.132 c
+21.45 -1.055 21.34 -0.956 21.251 -0.838 c
+21.163 -0.721 21.093 -0.573 21.045 -0.397 c
+21.854 -0.279 l
+21.872 -0.378 21.902 -0.455 21.942 -0.515 c
+21.99 -0.573 22.049 -0.617 22.119 -0.646 c
+22.185 -0.676 22.265 -0.702 22.354 -0.721 c
+22.442 -0.731 22.545 -0.735 22.662 -0.735 c
+22.758 -0.735 22.853 -0.731 22.942 -0.721 c
+23.03 -0.702 23.107 -0.676 23.177 -0.646 c
+23.243 -0.617 23.295 -0.58 23.324 -0.529 c
+23.36 -0.482 23.383 -0.419 23.383 -0.338 c
+23.383 -0.243 23.353 -0.169 23.295 -0.118 c
+23.243 -0.07 23.177 -0.029 23.089 0 c
+23.001 0.037 22.89 0.066 22.766 0.088 c
+22.647 0.118 22.516 0.147 22.369 0.177 c
+22.229 0.214 22.09 0.254 21.942 0.294 c
+21.803 0.341 21.677 0.405 21.56 0.485 c
+21.45 0.563 21.361 0.661 21.296 0.779 c
+21.226 0.897 21.193 1.047 21.193 1.235 c
+21.193 1.389 21.222 1.532 21.28 1.661 c
+21.347 1.797 21.442 1.911 21.56 1.999 c
+21.685 2.087 21.843 2.153 22.03 2.205 c
+22.215 2.253 22.427 2.278 22.662 2.278 c
+22.846 2.278 23.023 2.256 23.192 2.219 c
+23.357 2.19 23.504 2.135 23.632 2.058 c
+23.757 1.988 23.868 1.889 23.956 1.764 c
+24.044 1.646 24.103 1.503 24.133 1.338 c
+23.339 1.264 l
+23.316 1.341 23.287 1.404 23.25 1.455 c
+23.21 1.514 23.162 1.558 23.104 1.588 c
+23.052 1.625 22.99 1.65 22.913 1.661 c
+22.832 1.668 22.751 1.675 22.662 1.675 c
+22.446 1.675 22.284 1.646 22.177 1.588 c
+22.067 1.536 22.016 1.448 22.016 1.323 c
+22.016 1.242 22.034 1.18 22.074 1.132 c
+22.122 1.08 22.185 1.043 22.265 1.014 c
+22.354 0.985 22.45 0.956 22.56 0.926 c
+22.666 0.904 22.788 0.882 22.927 0.852 c
+23.081 0.823 23.239 0.783 23.397 0.735 c
+23.551 0.684 23.692 0.621 23.809 0.544 c
+23.927 0.463 24.022 0.36 24.103 0.235 c
+24.18 0.106 24.22 -0.056 24.22 -0.25 c
+25.783 1.602 m
+25.238 1.602 l
+25.238 2.219 l
+25.826 2.219 l
+26.106 3.117 l
+26.679 3.117 l
+26.679 2.219 l
+27.914 2.219 l
+27.914 1.602 l
+26.679 1.602 l
+26.679 -0.103 l
+26.679 -0.324 l
+26.686 -0.393 26.709 -0.455 26.738 -0.515 c
+26.774 -0.566 26.83 -0.61 26.9 -0.646 c
+26.977 -0.676 27.09 -0.691 27.237 -0.691 c
+27.374 -0.691 27.509 -0.687 27.649 -0.676 c
+27.785 -0.658 27.917 -0.632 28.046 -0.603 c
+28.046 -1.205 l
+27.965 -1.216 27.888 -1.231 27.811 -1.249 c
+27.73 -1.261 27.653 -1.268 27.576 -1.278 c
+27.495 -1.286 27.407 -1.294 27.312 -1.294 c
+27.223 -1.301 27.123 -1.309 27.017 -1.309 c
+26.83 -1.309 26.668 -1.294 26.532 -1.264 c
+26.404 -1.228 26.29 -1.183 26.194 -1.132 c
+26.106 -1.084 26.032 -1.025 25.974 -0.956 c
+25.915 -0.879 25.87 -0.802 25.841 -0.721 c
+25.812 -0.632 25.789 -0.544 25.783 -0.455 c
+25.772 -0.36 25.768 -0.264 25.768 -0.176 c
+h
+30.196 -1.323 m
+30.027 -1.323 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.313 -0.97 29.244 -0.864 29.196 -0.735 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.155 0.096 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.724 29.931 0.765 c
+30.096 0.802 30.273 0.827 30.46 0.838 c
+31.181 0.852 l
+31.181 1.029 l
+31.181 1.147 31.17 1.249 31.152 1.338 c
+31.129 1.426 31.096 1.492 31.048 1.544 c
+31.008 1.602 30.96 1.639 30.901 1.661 c
+30.842 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.661 c
+30.468 1.65 30.42 1.625 30.372 1.588 c
+30.331 1.558 30.298 1.507 30.269 1.44 c
+30.248 1.382 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.313 1.396 29.358 1.532 29.417 1.661 c
+29.483 1.786 29.579 1.897 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.253 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.455 l
+32.099 -0.515 32.114 -0.569 32.136 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.371 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.278 c
+32.257 -1.286 32.213 -1.294 32.166 -1.294 c
+32.114 -1.301 32.055 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.646 c
+31.283 -0.646 l
+31.214 -0.757 31.144 -0.852 31.077 -0.941 c
+31.008 -1.022 30.931 -1.087 30.842 -1.147 c
+30.755 -1.205 30.655 -1.249 30.549 -1.278 c
+30.449 -1.309 30.331 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.331 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.25 c
+30.211 0.21 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.374 30.096 -0.496 30.167 -0.573 c
+30.233 -0.654 30.331 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.617 c
+30.85 -0.569 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.261 31.137 -0.162 c
+31.166 -0.056 31.181 0.059 31.181 0.177 c
+h
+33.903 1.602 m
+33.36 1.602 l
+33.36 2.219 l
+33.948 2.219 l
+34.227 3.117 l
+34.8 3.117 l
+34.8 2.219 l
+36.035 2.219 l
+36.035 1.602 l
+34.8 1.602 l
+34.8 -0.103 l
+34.8 -0.324 l
+34.807 -0.393 34.83 -0.455 34.859 -0.515 c
+34.896 -0.566 34.951 -0.61 35.021 -0.646 c
+35.098 -0.676 35.212 -0.691 35.359 -0.691 c
+35.495 -0.691 35.631 -0.687 35.771 -0.676 c
+35.906 -0.658 36.039 -0.632 36.168 -0.603 c
+36.168 -1.205 l
+36.087 -1.216 36.01 -1.231 35.932 -1.249 c
+35.852 -1.261 35.774 -1.268 35.697 -1.278 c
+35.616 -1.286 35.528 -1.294 35.432 -1.294 c
+35.345 -1.301 35.245 -1.309 35.138 -1.309 c
+34.951 -1.309 34.789 -1.294 34.653 -1.264 c
+34.525 -1.228 34.41 -1.183 34.315 -1.132 c
+34.227 -1.084 34.154 -1.025 34.094 -0.956 c
+34.036 -0.879 33.992 -0.802 33.963 -0.721 c
+33.933 -0.632 33.911 -0.544 33.903 -0.455 c
+33.893 -0.36 33.889 -0.264 33.889 -0.176 c
+h
+38.248 2.219 m
+38.248 0.264 l
+38.248 0.125 38.254 0 38.277 -0.118 c
+38.295 -0.228 38.328 -0.32 38.379 -0.397 c
+38.427 -0.478 38.486 -0.54 38.556 -0.588 c
+38.622 -0.628 38.707 -0.646 38.806 -0.646 c
+38.894 -0.646 38.975 -0.628 39.056 -0.588 c
+39.144 -0.54 39.218 -0.47 39.276 -0.382 c
+39.335 -0.287 39.379 -0.176 39.409 -0.058 c
+39.445 0.066 39.467 0.206 39.467 0.353 c
+39.467 2.219 l
+40.364 2.219 l
+40.364 -0.485 l
+40.364 -0.721 l
+40.371 -0.802 40.378 -0.879 40.378 -0.956 c
+40.378 -1.147 l
+40.386 -1.198 40.393 -1.234 40.393 -1.264 c
+39.541 -1.264 l
+39.53 -1.234 39.519 -1.198 39.511 -1.147 c
+39.511 -0.956 l
+39.511 -0.889 39.504 -0.819 39.497 -0.75 c
+39.497 -0.573 l
+39.482 -0.573 l
+39.364 -0.838 39.21 -1.029 39.027 -1.147 c
+38.85 -1.264 38.647 -1.323 38.424 -1.323 c
+38.218 -1.323 38.045 -1.286 37.909 -1.22 c
+37.77 -1.154 37.66 -1.058 37.571 -0.941 c
+37.49 -0.823 37.431 -0.687 37.394 -0.529 c
+37.365 -0.364 37.35 -0.187 37.35 0 c
+37.35 2.219 l
+h
+44.527 -0.25 m
+44.527 -0.419 44.487 -0.569 44.409 -0.706 c
+44.34 -0.834 44.237 -0.948 44.101 -1.043 c
+43.972 -1.132 43.811 -1.201 43.616 -1.249 c
+43.428 -1.297 43.212 -1.323 42.969 -1.323 c
+42.742 -1.323 42.543 -1.309 42.366 -1.278 c
+42.19 -1.249 42.032 -1.201 41.896 -1.132 c
+41.757 -1.055 41.647 -0.956 41.558 -0.838 c
+41.47 -0.721 41.4 -0.573 41.352 -0.397 c
+42.161 -0.279 l
+42.179 -0.378 42.208 -0.455 42.249 -0.515 c
+42.297 -0.573 42.356 -0.617 42.425 -0.646 c
+42.491 -0.676 42.572 -0.702 42.661 -0.721 c
+42.749 -0.731 42.852 -0.735 42.969 -0.735 c
+43.065 -0.735 43.16 -0.731 43.249 -0.721 c
+43.337 -0.702 43.414 -0.676 43.484 -0.646 c
+43.55 -0.617 43.601 -0.58 43.631 -0.529 c
+43.667 -0.482 43.69 -0.419 43.69 -0.338 c
+43.69 -0.243 43.66 -0.169 43.601 -0.118 c
+43.55 -0.07 43.484 -0.029 43.395 0 c
+43.307 0.037 43.197 0.066 43.072 0.088 c
+42.954 0.118 42.822 0.147 42.676 0.177 c
+42.536 0.214 42.396 0.254 42.249 0.294 c
+42.109 0.341 41.984 0.405 41.867 0.485 c
+41.757 0.563 41.668 0.661 41.602 0.779 c
+41.533 0.897 41.5 1.047 41.5 1.235 c
+41.5 1.389 41.529 1.532 41.587 1.661 c
+41.654 1.797 41.749 1.911 41.867 1.999 c
+41.992 2.087 42.15 2.153 42.337 2.205 c
+42.521 2.253 42.734 2.278 42.969 2.278 c
+43.153 2.278 43.33 2.256 43.499 2.219 c
+43.663 2.19 43.811 2.135 43.939 2.058 c
+44.064 1.988 44.174 1.889 44.263 1.764 c
+44.351 1.646 44.409 1.503 44.44 1.338 c
+43.646 1.264 l
+43.623 1.341 43.594 1.404 43.557 1.455 c
+43.517 1.514 43.469 1.558 43.41 1.588 c
+43.359 1.625 43.297 1.65 43.219 1.661 c
+43.139 1.668 43.058 1.675 42.969 1.675 c
+42.753 1.675 42.591 1.646 42.484 1.588 c
+42.374 1.536 42.323 1.448 42.323 1.323 c
+42.323 1.242 42.341 1.18 42.381 1.132 c
+42.429 1.08 42.491 1.043 42.572 1.014 c
+42.661 0.985 42.757 0.956 42.867 0.926 c
+42.973 0.904 43.094 0.882 43.234 0.852 c
+43.388 0.823 43.546 0.783 43.704 0.735 c
+43.858 0.684 43.998 0.621 44.116 0.544 c
+44.234 0.463 44.329 0.36 44.409 0.235 c
+44.487 0.106 44.527 -0.056 44.527 -0.25 c
+f
+Q
+q 1 0 0 1 365.7754 92.4156 cm
+0 0 m
+-0.029 -0.581 -0.191 -1.022 -0.485 -1.324 c
+-0.779 -1.628 -1.198 -1.779 -1.735 -1.779 c
+-2.263 -1.779 -2.69 -1.58 -3.013 -1.176 c
+-3.329 -0.765 -3.484 -0.206 -3.484 0.5 c
+-3.484 1.469 l
+-3.484 2.164 -3.322 2.711 -2.999 3.116 c
+-2.675 3.516 -2.23 3.719 -1.661 3.719 c
+-1.154 3.719 -0.757 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.69 1.926 l
+-0.721 2.366 -0.816 2.678 -0.97 2.866 c
+-1.118 3.05 -1.349 3.145 -1.661 3.145 c
+-2.036 3.145 -2.319 2.998 -2.514 2.705 c
+-2.712 2.418 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.071 -2.716 -0.485 -2.529 -0.779 c
+-2.344 -1.066 -2.08 -1.206 -1.735 -1.206 c
+-1.382 -1.206 -1.128 -1.118 -0.97 -0.941 c
+-0.816 -0.765 -0.721 -0.452 -0.69 0 c
+h
+1.514 -1.706 -0.646 5.644 re
+3.954 -1.779 m
+3.454 -1.779 3.072 -1.632 2.807 -1.338 c
+2.543 -1.044 2.41 -0.611 2.41 -0.03 c
+2.41 0.44 l
+2.41 1.036 2.535 1.502 2.793 1.837 c
+3.057 2.179 3.418 2.352 3.881 2.352 c
+4.34 2.352 4.682 2.198 4.91 1.896 c
+5.145 1.602 5.266 1.139 5.277 0.515 c
+5.277 0.087 l
+3.057 0.087 l
+3.057 0 l
+3.057 -0.434 3.135 -0.746 3.293 -0.941 c
+3.458 -1.129 3.69 -1.22 3.983 -1.22 c
+4.178 -1.22 4.351 -1.187 4.498 -1.118 c
+4.645 -1.04 4.781 -0.923 4.91 -0.765 c
+5.247 -1.176 l
+4.961 -1.58 4.531 -1.779 3.954 -1.779 c
+3.881 1.793 m
+3.605 1.793 3.403 1.697 3.278 1.514 c
+3.15 1.326 3.076 1.036 3.057 0.646 c
+4.63 0.646 l
+4.63 0.735 l
+4.608 1.117 4.542 1.385 4.424 1.543 c
+4.307 1.708 4.123 1.793 3.881 1.793 c
+8.099 -1.706 m
+8.058 -1.617 8.033 -1.47 8.025 -1.264 c
+7.79 -1.61 7.497 -1.779 7.144 -1.779 c
+6.78 -1.779 6.497 -1.683 6.292 -1.484 c
+6.093 -1.279 5.997 -0.992 5.997 -0.618 c
+5.997 -0.217 6.134 0.103 6.408 0.338 c
+6.681 0.58 7.056 0.706 7.526 0.706 c
+8.011 0.706 l
+8.011 1.132 l
+8.011 1.367 7.956 1.532 7.85 1.631 c
+7.739 1.738 7.578 1.793 7.364 1.793 c
+7.166 1.793 7.004 1.734 6.879 1.616 c
+6.762 1.499 6.703 1.352 6.703 1.176 c
+6.056 1.176 l
+6.056 1.371 6.115 1.562 6.232 1.749 c
+6.358 1.932 6.519 2.08 6.718 2.19 c
+6.923 2.296 7.152 2.352 7.408 2.352 c
+7.809 2.352 8.114 2.248 8.32 2.043 c
+8.533 1.837 8.646 1.543 8.658 1.161 c
+8.658 -0.853 l
+8.658 -1.158 8.694 -1.422 8.775 -1.646 c
+8.775 -1.706 l
+h
+7.232 -1.191 m
+7.397 -1.191 7.548 -1.147 7.688 -1.058 c
+7.835 -0.971 7.941 -0.86 8.011 -0.721 c
+8.011 0.22 l
+7.644 0.22 l
+7.327 0.22 7.085 0.151 6.909 0.014 c
+6.732 -0.114 6.644 -0.302 6.644 -0.544 c
+6.644 -0.772 6.688 -0.937 6.776 -1.044 c
+6.865 -1.143 7.015 -1.191 7.232 -1.191 c
+11.304 1.66 m
+11.216 1.679 11.116 1.691 11.009 1.691 c
+10.676 1.691 10.44 1.506 10.304 1.146 c
+10.304 -1.706 l
+9.658 -1.706 l
+9.658 2.278 l
+10.29 2.278 l
+10.304 1.866 l
+10.481 2.19 10.723 2.352 11.039 2.352 c
+11.146 2.352 11.233 2.329 11.304 2.293 c
+h
+f
+Q
+q 1 0 0 1 381.1066 91.7834 cm
+0 0 m
+0 0.088 -0.044 0.166 -0.133 0.235 c
+-0.221 0.312 -0.408 0.415 -0.691 0.544 c
+-1.124 0.72 -1.422 0.9 -1.588 1.087 c
+-1.746 1.271 -1.823 1.502 -1.823 1.778 c
+-1.823 2.12 -1.702 2.403 -1.455 2.631 c
+-1.201 2.866 -0.864 2.984 -0.441 2.984 c
+-0.011 2.984 0.338 2.87 0.603 2.645 c
+0.867 2.418 0.999 2.117 0.999 1.735 c
+-0.044 1.735 l
+-0.044 2.057 -0.183 2.219 -0.456 2.219 c
+-0.566 2.219 -0.654 2.183 -0.721 2.117 c
+-0.79 2.047 -0.823 1.947 -0.823 1.822 c
+-0.823 1.735 -0.786 1.654 -0.706 1.587 c
+-0.628 1.529 -0.449 1.433 -0.162 1.308 c
+0.268 1.15 0.565 0.974 0.735 0.779 c
+0.912 0.592 0.999 0.341 0.999 0.029 c
+0.999 -0.324 0.867 -0.611 0.603 -0.823 c
+0.338 -1.04 -0.011 -1.147 -0.441 -1.147 c
+-0.735 -1.147 -0.996 -1.091 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.749 -0.5 c
+-1.867 -0.294 -1.926 -0.073 -1.926 0.162 c
+-0.941 0.162 l
+-0.941 -0.026 -0.904 -0.162 -0.823 -0.25 c
+-0.735 -0.339 -0.603 -0.382 -0.426 -0.382 c
+-0.143 -0.382 0 -0.258 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.395 2.911 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.147 l
+2.866 -0.011 2.884 -0.118 2.925 -0.177 c
+2.973 -0.235 3.057 -0.264 3.175 -0.264 c
+3.281 -0.264 3.366 -0.258 3.425 -0.235 c
+3.425 -1.044 l
+3.248 -1.11 3.057 -1.147 2.851 -1.147 c
+2.175 -1.147 1.83 -0.761 1.822 0.014 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.911 l
+1.822 2.911 l
+1.822 3.881 l
+h
+5.85 -1.073 m
+5.82 -1.014 5.791 -0.912 5.762 -0.765 c
+5.575 -1.022 5.325 -1.147 5.012 -1.147 c
+4.678 -1.147 4.399 -1.04 4.174 -0.823 c
+3.958 -0.599 3.851 -0.309 3.851 0.044 c
+3.851 0.455 3.983 0.771 4.247 0.999 c
+4.513 1.234 4.895 1.352 5.394 1.352 c
+5.718 1.352 l
+5.718 1.675 l
+5.718 1.852 5.681 1.973 5.615 2.043 c
+5.556 2.12 5.468 2.161 5.35 2.161 c
+5.093 2.161 4.968 2.007 4.968 1.705 c
+3.925 1.705 l
+3.925 2.076 4.06 2.381 4.336 2.616 c
+4.608 2.859 4.957 2.984 5.38 2.984 c
+5.82 2.984 6.159 2.866 6.394 2.631 c
+6.637 2.403 6.761 2.08 6.761 1.66 c
+6.761 -0.206 l
+6.761 -0.551 6.809 -0.819 6.909 -1.014 c
+6.909 -1.073 l
+h
+5.247 -0.324 m
+5.354 -0.324 5.446 -0.305 5.527 -0.264 c
+5.615 -0.217 5.677 -0.158 5.718 -0.088 c
+5.718 0.735 l
+5.468 0.735 l
+5.292 0.735 5.149 0.676 5.041 0.559 c
+4.943 0.448 4.895 0.301 4.895 0.118 c
+4.895 -0.177 5.012 -0.324 5.247 -0.324 c
+9.275 0 m
+9.275 0.088 9.231 0.166 9.143 0.235 c
+9.055 0.312 8.867 0.415 8.584 0.544 c
+8.151 0.72 7.853 0.9 7.688 1.087 c
+7.53 1.271 7.453 1.502 7.453 1.778 c
+7.453 2.12 7.574 2.403 7.819 2.631 c
+8.073 2.866 8.411 2.984 8.834 2.984 c
+9.264 2.984 9.613 2.87 9.878 2.645 c
+10.142 2.418 10.275 2.117 10.275 1.735 c
+9.231 1.735 l
+9.231 2.057 9.091 2.219 8.819 2.219 c
+8.709 2.219 8.621 2.183 8.555 2.117 c
+8.485 2.047 8.452 1.947 8.452 1.822 c
+8.452 1.735 8.488 1.654 8.569 1.587 c
+8.646 1.529 8.827 1.433 9.113 1.308 c
+9.543 1.15 9.841 0.974 10.01 0.779 c
+10.186 0.592 10.275 0.341 10.275 0.029 c
+10.275 -0.324 10.142 -0.611 9.878 -0.823 c
+9.613 -1.04 9.264 -1.147 8.834 -1.147 c
+8.54 -1.147 8.279 -1.091 8.055 -0.985 c
+7.827 -0.867 7.651 -0.706 7.526 -0.5 c
+7.408 -0.294 7.349 -0.073 7.349 0.162 c
+8.334 0.162 l
+8.334 -0.026 8.371 -0.162 8.452 -0.25 c
+8.54 -0.339 8.673 -0.382 8.849 -0.382 c
+9.132 -0.382 9.275 -0.258 9.275 0 c
+11.95 2.558 m
+12.174 2.84 12.45 2.984 12.773 2.984 c
+13.134 2.984 13.409 2.855 13.597 2.601 c
+13.791 2.344 13.89 1.962 13.89 1.455 c
+13.89 -1.073 l
+12.847 -1.073 l
+12.847 1.44 l
+12.847 1.675 12.806 1.841 12.729 1.94 c
+12.66 2.047 12.546 2.102 12.391 2.102 c
+12.204 2.102 12.057 2.017 11.95 1.852 c
+11.95 -1.073 l
+10.907 -1.073 l
+10.907 4.571 l
+11.95 4.571 l
+h
+f
+Q
+q 1 0 0 1 400.5385 91.8568 cm
+0 0 m
+0.603 2.837 l
+1.249 2.837 l
+0.264 -1.147 l
+-0.249 -1.147 l
+-1.029 1.705 l
+-1.779 -1.147 l
+-2.308 -1.147 l
+-3.263 2.837 l
+-2.631 2.837 l
+-2.014 0.073 l
+-1.278 2.837 l
+-0.764 2.837 l
+h
+2.631 -1.147 -0.647 3.984 re
+2.675 3.881 m
+2.675 3.77 2.646 3.678 2.587 3.601 c
+2.529 3.532 2.433 3.499 2.308 3.499 c
+2.19 3.499 2.095 3.532 2.028 3.601 c
+1.97 3.678 1.941 3.77 1.941 3.881 c
+1.941 3.998 1.97 4.09 2.028 4.16 c
+2.095 4.237 2.19 4.278 2.308 4.278 c
+2.433 4.278 2.529 4.237 2.587 4.16 c
+2.646 4.079 2.675 3.987 2.675 3.881 c
+4.498 3.792 m
+4.498 2.837 l
+5.101 2.837 l
+5.101 2.308 l
+4.498 2.308 l
+4.498 -0.162 l
+4.498 -0.32 4.52 -0.437 4.571 -0.515 c
+4.63 -0.595 4.719 -0.632 4.836 -0.632 c
+4.925 -0.632 5.012 -0.617 5.101 -0.588 c
+5.101 -1.147 l
+4.954 -1.195 4.8 -1.22 4.645 -1.22 c
+4.388 -1.22 4.193 -1.128 4.057 -0.941 c
+3.917 -0.757 3.851 -0.496 3.851 -0.162 c
+3.851 2.308 l
+3.248 2.308 l
+3.248 2.837 l
+3.851 2.837 l
+3.851 3.792 l
+h
+6.512 2.425 m
+6.766 2.749 7.085 2.911 7.468 2.911 c
+8.173 2.911 8.53 2.44 8.54 1.5 c
+8.54 -1.147 l
+7.894 -1.147 l
+7.894 1.469 l
+7.894 1.782 7.838 2.003 7.732 2.132 c
+7.622 2.256 7.468 2.323 7.262 2.323 c
+7.104 2.323 6.957 2.267 6.82 2.161 c
+6.691 2.051 6.589 1.914 6.512 1.749 c
+6.512 -1.147 l
+5.866 -1.147 l
+5.866 4.498 l
+6.512 4.498 l
+h
+9.363 1.029 m
+9.363 1.606 9.5 2.061 9.775 2.396 c
+10.058 2.738 10.429 2.911 10.892 2.911 c
+11.352 2.911 11.719 2.741 11.994 2.41 c
+12.278 2.087 12.424 1.639 12.436 1.073 c
+12.436 0.646 l
+12.436 0.077 12.293 -0.378 12.009 -0.721 c
+11.734 -1.055 11.366 -1.22 10.907 -1.22 c
+10.444 -1.22 10.073 -1.058 9.789 -0.735 c
+9.514 -0.405 9.371 0.037 9.363 0.588 c
+h
+10.01 0.646 m
+10.01 0.243 10.088 -0.073 10.246 -0.309 c
+10.411 -0.544 10.631 -0.661 10.907 -0.661 c
+11.472 -0.661 11.767 -0.25 11.788 0.573 c
+11.788 1.029 l
+11.788 1.429 11.705 1.749 11.539 1.984 c
+11.381 2.227 11.164 2.352 10.892 2.352 c
+10.628 2.352 10.411 2.227 10.246 1.984 c
+10.088 1.749 10.01 1.429 10.01 1.029 c
+h
+15.302 -0.794 m
+15.085 -1.081 14.772 -1.22 14.361 -1.22 c
+13.997 -1.22 13.722 -1.099 13.538 -0.852 c
+13.361 -0.599 13.266 -0.235 13.259 0.235 c
+13.259 2.837 l
+13.905 2.837 l
+13.905 0.294 l
+13.905 -0.335 14.089 -0.647 14.464 -0.647 c
+14.865 -0.647 15.14 -0.47 15.287 -0.118 c
+15.287 2.837 l
+15.934 2.837 l
+15.934 -1.147 l
+15.316 -1.147 l
+h
+17.772 3.792 m
+17.772 2.837 l
+18.374 2.837 l
+18.374 2.308 l
+17.772 2.308 l
+17.772 -0.162 l
+17.772 -0.32 17.793 -0.437 17.845 -0.515 c
+17.903 -0.595 17.992 -0.632 18.109 -0.632 c
+18.198 -0.632 18.286 -0.617 18.374 -0.588 c
+18.374 -1.147 l
+18.227 -1.195 18.073 -1.22 17.918 -1.22 c
+17.661 -1.22 17.467 -1.128 17.33 -0.941 c
+17.191 -0.757 17.124 -0.496 17.124 -0.162 c
+17.124 2.308 l
+16.522 2.308 l
+16.522 2.837 l
+17.124 2.837 l
+17.124 3.792 l
+h
+22.901 -1.147 m
+22.861 -1.058 22.836 -0.912 22.828 -0.706 c
+22.593 -1.051 22.298 -1.22 21.946 -1.22 c
+21.582 -1.22 21.299 -1.124 21.093 -0.926 c
+20.895 -0.721 20.799 -0.434 20.799 -0.059 c
+20.799 0.341 20.935 0.661 21.211 0.897 c
+21.483 1.139 21.858 1.264 22.328 1.264 c
+22.813 1.264 l
+22.813 1.691 l
+22.813 1.926 22.758 2.091 22.651 2.19 c
+22.541 2.296 22.379 2.352 22.167 2.352 c
+21.968 2.352 21.806 2.293 21.681 2.175 c
+21.564 2.057 21.504 1.911 21.504 1.735 c
+20.858 1.735 l
+20.858 1.929 20.917 2.12 21.034 2.308 c
+21.159 2.491 21.321 2.639 21.519 2.749 c
+21.725 2.855 21.953 2.911 22.21 2.911 c
+22.611 2.911 22.915 2.807 23.121 2.602 c
+23.335 2.396 23.449 2.102 23.46 1.72 c
+23.46 -0.294 l
+23.46 -0.599 23.497 -0.864 23.578 -1.087 c
+23.578 -1.147 l
+h
+22.034 -0.632 m
+22.2 -0.632 22.35 -0.588 22.489 -0.5 c
+22.637 -0.412 22.743 -0.301 22.813 -0.162 c
+22.813 0.779 l
+22.445 0.779 l
+22.13 0.779 21.887 0.709 21.71 0.573 c
+21.534 0.445 21.446 0.257 21.446 0.015 c
+21.446 -0.214 21.49 -0.378 21.579 -0.485 c
+21.666 -0.584 21.818 -0.632 22.034 -0.632 c
+27.341 0.646 m
+27.341 0.018 27.223 -0.452 26.988 -0.765 c
+26.759 -1.07 26.443 -1.22 26.032 -1.22 c
+25.628 -1.22 25.319 -1.07 25.106 -0.765 c
+25.106 -2.675 l
+24.459 -2.675 l
+24.459 2.837 l
+25.047 2.837 l
+25.091 2.396 l
+25.305 2.738 25.613 2.911 26.017 2.911 c
+26.458 2.911 26.786 2.756 27.002 2.454 c
+27.216 2.15 27.329 1.694 27.341 1.087 c
+h
+26.693 1.029 m
+26.693 1.469 26.624 1.793 26.487 1.999 c
+26.348 2.212 26.128 2.323 25.826 2.323 c
+25.51 2.323 25.271 2.168 25.106 1.866 c
+25.106 -0.206 l
+25.271 -0.511 25.51 -0.661 25.826 -0.661 c
+26.121 -0.661 26.333 -0.559 26.473 -0.353 c
+26.609 -0.14 26.682 0.191 26.693 0.632 c
+h
+31.059 0.646 m
+31.059 0.018 30.942 -0.452 30.707 -0.765 c
+30.479 -1.07 30.163 -1.22 29.751 -1.22 c
+29.346 -1.22 29.038 -1.07 28.825 -0.765 c
+28.825 -2.675 l
+28.178 -2.675 l
+28.178 2.837 l
+28.766 2.837 l
+28.81 2.396 l
+29.024 2.738 29.332 2.911 29.736 2.911 c
+30.177 2.911 30.504 2.756 30.721 2.454 c
+30.934 2.15 31.048 1.694 31.059 1.087 c
+h
+30.412 1.029 m
+30.412 1.469 30.343 1.793 30.206 1.999 c
+30.067 2.212 29.847 2.323 29.545 2.323 c
+29.229 2.323 28.991 2.168 28.825 1.866 c
+28.825 -0.206 l
+28.991 -0.511 29.229 -0.661 29.545 -0.661 c
+29.839 -0.661 30.052 -0.559 30.192 -0.353 c
+30.328 -0.14 30.402 0.191 30.412 0.632 c
+h
+32.602 -1.147 -0.646 5.644 re
+34.705 -0.059 m
+35.424 2.837 l
+36.116 2.837 l
+34.822 -1.706 l
+34.723 -2.047 34.58 -2.308 34.396 -2.484 c
+34.219 -2.66 34.017 -2.749 33.793 -2.749 c
+33.705 -2.749 33.591 -2.727 33.456 -2.69 c
+33.456 -2.146 l
+33.602 -2.161 l
+33.786 -2.161 33.932 -2.117 34.043 -2.028 c
+34.15 -1.941 34.238 -1.783 34.308 -1.558 c
+34.425 -1.118 l
+33.264 2.837 l
+33.969 2.837 l
+h
+37.454 -1.147 -0.647 3.984 re
+37.497 3.881 m
+37.497 3.77 37.468 3.678 37.409 3.601 c
+37.35 3.532 37.255 3.499 37.13 3.499 c
+37.012 3.499 36.917 3.532 36.851 3.601 c
+36.791 3.678 36.762 3.77 36.762 3.881 c
+36.762 3.998 36.791 4.09 36.851 4.16 c
+36.917 4.237 37.012 4.278 37.13 4.278 c
+37.255 4.278 37.35 4.237 37.409 4.16 c
+37.468 4.079 37.497 3.987 37.497 3.881 c
+39.085 2.837 m
+39.1 2.396 l
+39.353 2.738 39.677 2.911 40.07 2.911 c
+40.775 2.911 41.132 2.44 41.143 1.5 c
+41.143 -1.147 l
+40.496 -1.147 l
+40.496 1.469 l
+40.496 1.782 40.441 2.003 40.334 2.132 c
+40.224 2.256 40.07 2.323 39.864 2.323 c
+39.706 2.323 39.559 2.267 39.423 2.161 c
+39.295 2.051 39.191 1.914 39.114 1.749 c
+39.114 -1.147 l
+38.468 -1.147 l
+38.468 2.837 l
+h
+41.98 1.029 m
+41.98 1.646 42.091 2.109 42.319 2.425 c
+42.543 2.749 42.877 2.911 43.318 2.911 c
+43.719 2.911 44.024 2.734 44.23 2.381 c
+44.274 2.837 l
+44.862 2.837 l
+44.862 -1.191 l
+44.862 -1.679 44.733 -2.058 44.479 -2.323 c
+44.222 -2.587 43.87 -2.72 43.421 -2.72 c
+43.222 -2.72 43.002 -2.668 42.759 -2.572 c
+42.514 -2.473 42.333 -2.352 42.216 -2.205 c
+42.48 -1.764 l
+42.745 -2.028 43.043 -2.161 43.377 -2.161 c
+43.914 -2.161 44.189 -1.866 44.201 -1.278 c
+44.201 -0.75 l
+43.995 -1.066 43.693 -1.22 43.303 -1.22 c
+42.892 -1.22 42.568 -1.07 42.333 -0.765 c
+42.106 -0.452 41.988 0 41.98 0.588 c
+h
+42.642 0.646 m
+42.642 0.206 42.705 -0.125 42.833 -0.338 c
+42.958 -0.544 43.175 -0.647 43.48 -0.647 c
+43.804 -0.647 44.043 -0.482 44.201 -0.147 c
+44.201 1.837 l
+44.031 2.161 43.792 2.323 43.48 2.323 c
+43.186 2.323 42.969 2.219 42.833 2.014 c
+42.705 1.808 42.642 1.484 42.642 1.043 c
+h
+48.242 -1.147 -0.646 3.984 re
+48.286 3.881 m
+48.286 3.77 48.257 3.678 48.199 3.601 c
+48.14 3.532 48.044 3.499 47.919 3.499 c
+47.802 3.499 47.706 3.532 47.64 3.601 c
+47.581 3.678 47.552 3.77 47.552 3.881 c
+47.552 3.998 47.581 4.09 47.64 4.16 c
+47.706 4.237 47.802 4.278 47.919 4.278 c
+48.044 4.278 48.14 4.237 48.199 4.16 c
+48.257 4.079 48.286 3.987 48.286 3.881 c
+50.109 3.792 m
+50.109 2.837 l
+50.712 2.837 l
+50.712 2.308 l
+50.109 2.308 l
+50.109 -0.162 l
+50.109 -0.32 50.131 -0.437 50.183 -0.515 c
+50.241 -0.595 50.33 -0.632 50.447 -0.632 c
+50.536 -0.632 50.624 -0.617 50.712 -0.588 c
+50.712 -1.147 l
+50.565 -1.195 50.41 -1.22 50.256 -1.22 c
+49.999 -1.22 49.805 -1.128 49.668 -0.941 c
+49.529 -0.757 49.462 -0.496 49.462 -0.162 c
+49.462 2.308 l
+48.86 2.308 l
+48.86 2.837 l
+49.462 2.837 l
+49.462 3.792 l
+h
+53.902 -1.147 -0.647 3.984 re
+53.946 3.881 m
+53.946 3.77 53.917 3.678 53.857 3.601 c
+53.799 3.532 53.703 3.499 53.578 3.499 c
+53.46 3.499 53.365 3.532 53.299 3.601 c
+53.24 3.678 53.211 3.77 53.211 3.881 c
+53.211 3.998 53.24 4.09 53.299 4.16 c
+53.365 4.237 53.46 4.278 53.578 4.278 c
+53.703 4.278 53.799 4.237 53.857 4.16 c
+53.917 4.079 53.946 3.987 53.946 3.881 c
+55.533 2.837 m
+55.548 2.396 l
+55.802 2.738 56.125 2.911 56.518 2.911 c
+57.223 2.911 57.58 2.44 57.591 1.5 c
+57.591 -1.147 l
+56.944 -1.147 l
+56.944 1.469 l
+56.944 1.782 56.889 2.003 56.782 2.132 c
+56.672 2.256 56.518 2.323 56.312 2.323 c
+56.155 2.323 56.007 2.267 55.871 2.161 c
+55.743 2.051 55.64 1.914 55.563 1.749 c
+55.563 -1.147 l
+54.916 -1.147 l
+54.916 2.837 l
+h
+59.413 3.792 m
+59.413 2.837 l
+60.016 2.837 l
+60.016 2.308 l
+59.413 2.308 l
+59.413 -0.162 l
+59.413 -0.32 59.436 -0.437 59.488 -0.515 c
+59.546 -0.595 59.634 -0.632 59.752 -0.632 c
+59.84 -0.632 59.928 -0.617 60.016 -0.588 c
+60.016 -1.147 l
+59.87 -1.195 59.715 -1.22 59.561 -1.22 c
+59.303 -1.22 59.109 -1.128 58.973 -0.941 c
+58.833 -0.757 58.767 -0.496 58.767 -0.162 c
+58.767 2.308 l
+58.164 2.308 l
+58.164 2.837 l
+58.767 2.837 l
+58.767 3.792 l
+h
+60.575 1.029 m
+60.575 1.606 60.711 2.061 60.986 2.396 c
+61.269 2.738 61.641 2.911 62.104 2.911 c
+62.563 2.911 62.931 2.741 63.206 2.41 c
+63.489 2.087 63.636 1.639 63.647 1.073 c
+63.647 0.646 l
+63.647 0.077 63.504 -0.378 63.221 -0.721 c
+62.945 -1.055 62.578 -1.22 62.118 -1.22 c
+61.655 -1.22 61.284 -1.058 61.001 -0.735 c
+60.726 -0.405 60.583 0.037 60.575 0.588 c
+h
+61.221 0.646 m
+61.221 0.243 61.299 -0.073 61.457 -0.309 c
+61.622 -0.544 61.842 -0.661 62.118 -0.661 c
+62.684 -0.661 62.978 -0.25 63 0.573 c
+63 1.029 l
+63 1.429 62.916 1.749 62.75 1.984 c
+62.592 2.227 62.376 2.352 62.104 2.352 c
+61.84 2.352 61.622 2.227 61.457 1.984 c
+61.299 1.749 61.221 1.429 61.221 1.029 c
+h
+f
+Q
+q 1 0 0 1 469.5361 92.4598 cm
+0 0 m
+0.353 2.234 l
+1.352 2.234 l
+0.529 -1.75 l
+-0.338 -1.75 l
+-0.897 0.558 l
+-1.455 -1.75 l
+-2.323 -1.75 l
+-3.146 2.234 l
+-2.146 2.234 l
+-1.793 0 l
+-1.264 2.234 l
+-0.53 2.234 l
+h
+1.749 0.367 m
+1.749 0.974 1.889 1.448 2.175 1.793 c
+2.458 2.135 2.851 2.308 3.351 2.308 c
+3.858 2.308 4.255 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.367 c
+4.968 0.103 l
+4.968 -0.497 4.825 -0.967 4.542 -1.309 c
+4.255 -1.654 3.858 -1.823 3.351 -1.823 c
+2.84 -1.823 2.444 -1.654 2.161 -1.309 c
+1.885 -0.967 1.749 -0.493 1.749 0.118 c
+h
+2.793 0.103 m
+2.793 -0.603 2.977 -0.956 3.351 -0.956 c
+3.704 -0.956 3.896 -0.662 3.925 -0.074 c
+3.925 0.367 l
+3.925 0.727 3.873 0.999 3.777 1.176 c
+3.678 1.352 3.535 1.44 3.351 1.44 c
+3.175 1.44 3.035 1.352 2.94 1.176 c
+2.84 0.999 2.793 0.727 2.793 0.367 c
+h
+7.57 1.219 m
+7.231 1.249 l
+6.945 1.249 6.755 1.124 6.659 0.881 c
+6.659 -1.75 l
+5.615 -1.75 l
+5.615 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.305 2.308 c
+7.423 2.308 7.515 2.285 7.584 2.248 c
+h
+9.437 -0.221 m
+9.157 -0.53 l
+9.157 -1.75 l
+8.114 -1.75 l
+8.114 3.895 l
+9.157 3.895 l
+9.157 0.852 l
+9.275 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.084 0.588 l
+11.347 -1.75 l
+10.157 -1.75 l
+h
+12.803 -1.75 -1.043 3.984 re
+11.715 3.262 m
+11.715 3.417 11.763 3.546 11.862 3.645 c
+11.969 3.752 12.104 3.806 12.274 3.806 c
+12.45 3.806 12.586 3.752 12.685 3.645 c
+12.792 3.546 12.847 3.417 12.847 3.262 c
+12.847 3.094 12.792 2.958 12.685 2.851 c
+12.586 2.752 12.45 2.705 12.274 2.705 c
+12.104 2.705 11.969 2.752 11.862 2.851 c
+11.763 2.958 11.715 3.094 11.715 3.262 c
+14.566 2.234 m
+14.596 1.837 l
+14.831 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.826 16.565 0.866 c
+16.565 -1.75 l
+15.522 -1.75 l
+15.522 0.793 l
+15.522 1.018 15.486 1.179 15.42 1.278 c
+15.349 1.373 15.232 1.425 15.066 1.425 c
+14.879 1.425 14.732 1.33 14.626 1.146 c
+14.626 -1.75 l
+13.581 -1.75 l
+13.581 2.234 l
+h
+17.183 0.367 m
+17.183 1.014 17.301 1.499 17.536 1.822 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.164 19.359 1.881 c
+19.403 2.234 l
+20.343 2.234 l
+20.343 -1.75 l
+20.343 -2.257 20.201 -2.646 19.917 -2.911 c
+19.63 -3.183 19.226 -3.323 18.697 -3.323 c
+18.47 -3.323 18.234 -3.278 17.992 -3.19 c
+17.756 -3.102 17.58 -2.988 17.462 -2.852 c
+17.815 -2.132 l
+17.911 -2.238 18.04 -2.323 18.198 -2.382 c
+18.352 -2.448 18.499 -2.484 18.638 -2.484 c
+18.873 -2.484 19.039 -2.426 19.138 -2.309 c
+19.245 -2.198 19.299 -2.022 19.299 -1.779 c
+19.299 -1.426 l
+19.102 -1.691 18.844 -1.823 18.52 -1.823 c
+18.098 -1.823 17.771 -1.661 17.536 -1.338 c
+17.308 -1.008 17.19 -0.537 17.183 0.073 c
+h
+18.227 0.103 m
+18.227 -0.273 18.275 -0.541 18.374 -0.706 c
+18.47 -0.875 18.624 -0.956 18.829 -0.956 c
+19.042 -0.956 19.201 -0.879 19.299 -0.721 c
+19.299 1.176 l
+19.189 1.341 19.035 1.425 18.829 1.425 c
+18.624 1.425 18.47 1.341 18.374 1.176 c
+18.275 1.007 18.227 0.738 18.227 0.367 c
+h
+22.695 0.367 m
+22.695 1.014 22.802 1.499 23.019 1.822 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.554 2.175 24.753 1.911 c
+24.753 3.895 l
+25.811 3.895 l
+25.811 -1.75 l
+24.856 -1.75 l
+24.812 -1.338 l
+24.595 -1.661 24.319 -1.823 23.989 -1.823 c
+23.577 -1.823 23.258 -1.669 23.033 -1.353 c
+22.817 -1.029 22.703 -0.559 22.695 0.058 c
+h
+23.739 0.103 m
+23.739 -0.291 23.775 -0.566 23.856 -0.721 c
+23.945 -0.879 24.091 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.753 -0.676 c
+24.753 1.132 l
+24.654 1.326 24.503 1.425 24.297 1.425 c
+24.099 1.425 23.96 1.344 23.871 1.19 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.75 -1.043 3.984 re
+26.576 3.262 m
+26.576 3.417 26.624 3.546 26.723 3.645 c
+26.829 3.752 26.965 3.806 27.135 3.806 c
+27.311 3.806 27.447 3.752 27.546 3.645 c
+27.652 3.546 27.708 3.417 27.708 3.262 c
+27.708 3.094 27.652 2.958 27.546 2.851 c
+27.447 2.752 27.311 2.705 27.135 2.705 c
+26.965 2.705 26.829 2.752 26.723 2.851 c
+26.624 2.958 26.576 3.094 26.576 3.262 c
+30.427 1.219 m
+30.089 1.249 l
+29.803 1.249 29.611 1.124 29.516 0.881 c
+29.516 -1.75 l
+28.471 -1.75 l
+28.471 2.234 l
+29.442 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.162 2.308 c
+30.28 2.308 30.372 2.285 30.441 2.248 c
+h
+32.5 -1.823 m
+31.97 -1.823 31.551 -1.669 31.25 -1.353 c
+30.956 -1.029 30.809 -0.57 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.945 1.448 31.22 1.793 c
+31.492 2.135 31.885 2.308 32.396 2.308 c
+32.897 2.308 33.267 2.146 33.514 1.822 c
+33.767 1.499 33.9 1.021 33.911 0.396 c
+33.911 -0.103 l
+31.838 -0.103 l
+31.856 -0.397 31.919 -0.614 32.029 -0.75 c
+32.147 -0.89 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.724 -1.411 33.535 -1.555 33.294 -1.661 c
+33.047 -1.768 32.783 -1.823 32.5 -1.823 c
+31.853 0.617 m
+32.882 0.617 l
+32.882 0.72 l
+32.882 0.955 32.841 1.132 32.764 1.249 c
+32.694 1.373 32.566 1.44 32.382 1.44 c
+32.205 1.44 32.074 1.371 31.985 1.234 c
+31.904 1.105 31.86 0.9 31.853 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.384 -0.761 36.394 -0.368 c
+37.365 -0.368 l
+37.365 -0.802 37.233 -1.154 36.968 -1.426 c
+36.703 -1.691 36.365 -1.823 35.954 -1.823 c
+35.443 -1.823 35.05 -1.669 34.778 -1.353 c
+34.513 -1.029 34.374 -0.559 34.366 0.058 c
+34.366 0.382 l
+34.366 1.007 34.499 1.484 34.763 1.807 c
+35.035 2.138 35.432 2.308 35.954 2.308 c
+36.384 2.308 36.726 2.167 36.982 1.896 c
+37.236 1.62 37.365 1.238 37.365 0.749 c
+36.394 0.749 l
+36.394 0.962 36.354 1.132 36.277 1.249 c
+36.207 1.373 36.09 1.44 35.924 1.44 c
+35.748 1.44 35.619 1.373 35.542 1.249 c
+35.461 1.12 35.417 0.87 35.41 0.5 c
+35.41 0.087 l
+35.41 -0.235 35.424 -0.464 35.454 -0.588 c
+35.49 -0.717 35.546 -0.809 35.615 -0.867 c
+35.693 -0.927 35.8 -0.956 35.939 -0.956 c
+39.173 3.204 m
+39.173 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.173 1.44 l
+39.173 -0.53 l
+39.173 -0.688 39.191 -0.794 39.232 -0.853 c
+39.28 -0.912 39.364 -0.941 39.482 -0.941 c
+39.588 -0.941 39.673 -0.934 39.731 -0.912 c
+39.731 -1.721 l
+39.555 -1.786 39.364 -1.823 39.158 -1.823 c
+38.482 -1.823 38.137 -1.437 38.129 -0.662 c
+38.129 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.367 m
+40.055 0.974 40.194 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.848 1.793 c
+43.131 1.448 43.274 0.974 43.274 0.367 c
+43.274 0.103 l
+43.274 -0.497 43.131 -0.967 42.848 -1.309 c
+42.561 -1.654 42.164 -1.823 41.657 -1.823 c
+41.146 -1.823 40.749 -1.654 40.466 -1.309 c
+40.191 -0.967 40.055 -0.493 40.055 0.118 c
+h
+41.098 0.103 m
+41.098 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.201 -0.662 42.231 -0.074 c
+42.231 0.367 l
+42.231 0.727 42.179 0.999 42.083 1.176 c
+41.984 1.352 41.84 1.44 41.657 1.44 c
+41.481 1.44 41.341 1.352 41.246 1.176 c
+41.146 0.999 41.098 0.727 41.098 0.367 c
+h
+45.875 1.219 m
+45.537 1.249 l
+45.25 1.249 45.06 1.124 44.965 0.881 c
+44.965 -1.75 l
+43.92 -1.75 l
+43.92 2.234 l
+44.891 2.234 l
+44.92 1.793 l
+45.086 2.135 45.317 2.308 45.611 2.308 c
+45.728 2.308 45.821 2.285 45.89 2.248 c
+h
+47.772 -0.015 m
+48.301 2.234 l
+49.403 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.529 -3.352 46.993 -3.352 c
+46.864 -3.352 46.721 -3.33 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.484 l
+46.85 -2.484 46.971 -2.448 47.051 -2.382 c
+47.129 -2.323 47.191 -2.213 47.243 -2.058 c
+47.316 -1.794 l
+46.17 2.234 l
+47.286 2.234 l
+h
+f
+Q
+q 1 0 0 1 519.5421 91.0628 cm
+0 0 m
+0 0.118 0.033 0.214 0.103 0.294 c
+0.169 0.372 0.272 0.412 0.412 0.412 c
+0.559 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.11 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 113.704 234.667 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 106.8644 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.646 -0.243 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.69 -1.999 0.69 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.142 1.278 -3.219 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.32 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.249 -2.454 2.19 c
+-2.477 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.244 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.871 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.621 6.137 1.573 c
+6.056 1.532 5.99 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.117 l
+14.494 3.117 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.455 14.552 -0.515 c
+14.589 -0.566 14.645 -0.61 14.714 -0.646 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.687 15.464 -0.676 c
+15.599 -0.658 15.732 -0.632 15.861 -0.603 c
+15.861 -1.205 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.278 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.084 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.455 c
+13.586 -0.36 13.582 -0.264 13.582 -0.176 c
+h
+24.22 -0.25 m
+24.22 -0.419 24.18 -0.569 24.103 -0.706 c
+24.033 -0.834 23.931 -0.948 23.794 -1.043 c
+23.666 -1.132 23.504 -1.201 23.31 -1.249 c
+23.121 -1.297 22.905 -1.323 22.662 -1.323 c
+22.435 -1.323 22.236 -1.309 22.06 -1.278 c
+21.883 -1.249 21.725 -1.201 21.59 -1.132 c
+21.45 -1.055 21.34 -0.956 21.251 -0.838 c
+21.163 -0.721 21.093 -0.573 21.045 -0.397 c
+21.854 -0.279 l
+21.872 -0.378 21.902 -0.455 21.942 -0.515 c
+21.99 -0.573 22.049 -0.617 22.119 -0.646 c
+22.185 -0.676 22.265 -0.702 22.354 -0.721 c
+22.442 -0.731 22.545 -0.735 22.662 -0.735 c
+22.758 -0.735 22.853 -0.731 22.942 -0.721 c
+23.03 -0.702 23.107 -0.676 23.177 -0.646 c
+23.243 -0.617 23.295 -0.58 23.324 -0.529 c
+23.36 -0.482 23.383 -0.419 23.383 -0.338 c
+23.383 -0.243 23.353 -0.169 23.295 -0.118 c
+23.243 -0.07 23.177 -0.029 23.089 0 c
+23.001 0.037 22.89 0.066 22.766 0.088 c
+22.647 0.118 22.516 0.147 22.369 0.177 c
+22.229 0.214 22.09 0.254 21.942 0.294 c
+21.803 0.341 21.677 0.405 21.56 0.485 c
+21.45 0.563 21.361 0.661 21.296 0.779 c
+21.226 0.897 21.193 1.047 21.193 1.235 c
+21.193 1.389 21.222 1.532 21.28 1.661 c
+21.347 1.797 21.442 1.911 21.56 1.999 c
+21.685 2.087 21.843 2.153 22.03 2.205 c
+22.215 2.253 22.427 2.278 22.662 2.278 c
+22.846 2.278 23.023 2.256 23.192 2.219 c
+23.357 2.19 23.504 2.135 23.632 2.058 c
+23.757 1.988 23.868 1.889 23.956 1.764 c
+24.044 1.646 24.103 1.503 24.133 1.338 c
+23.339 1.264 l
+23.316 1.341 23.287 1.404 23.25 1.455 c
+23.21 1.514 23.162 1.558 23.104 1.588 c
+23.052 1.625 22.99 1.65 22.913 1.661 c
+22.832 1.668 22.751 1.675 22.662 1.675 c
+22.446 1.675 22.284 1.646 22.177 1.588 c
+22.067 1.536 22.016 1.448 22.016 1.323 c
+22.016 1.242 22.034 1.18 22.074 1.132 c
+22.122 1.08 22.185 1.043 22.265 1.014 c
+22.354 0.985 22.45 0.956 22.56 0.926 c
+22.666 0.904 22.788 0.882 22.927 0.852 c
+23.081 0.823 23.239 0.783 23.397 0.735 c
+23.551 0.684 23.692 0.621 23.809 0.544 c
+23.927 0.463 24.022 0.36 24.103 0.235 c
+24.18 0.106 24.22 -0.056 24.22 -0.25 c
+25.783 1.602 m
+25.238 1.602 l
+25.238 2.219 l
+25.826 2.219 l
+26.106 3.117 l
+26.679 3.117 l
+26.679 2.219 l
+27.914 2.219 l
+27.914 1.602 l
+26.679 1.602 l
+26.679 -0.103 l
+26.679 -0.324 l
+26.686 -0.393 26.709 -0.455 26.738 -0.515 c
+26.774 -0.566 26.83 -0.61 26.9 -0.646 c
+26.977 -0.676 27.09 -0.691 27.237 -0.691 c
+27.374 -0.691 27.509 -0.687 27.649 -0.676 c
+27.785 -0.658 27.917 -0.632 28.046 -0.603 c
+28.046 -1.205 l
+27.965 -1.216 27.888 -1.231 27.811 -1.249 c
+27.73 -1.261 27.653 -1.268 27.576 -1.278 c
+27.495 -1.286 27.407 -1.294 27.312 -1.294 c
+27.223 -1.301 27.123 -1.309 27.017 -1.309 c
+26.83 -1.309 26.668 -1.294 26.532 -1.264 c
+26.404 -1.228 26.29 -1.183 26.194 -1.132 c
+26.106 -1.084 26.032 -1.025 25.974 -0.956 c
+25.915 -0.879 25.87 -0.802 25.841 -0.721 c
+25.812 -0.632 25.789 -0.544 25.783 -0.455 c
+25.772 -0.36 25.768 -0.264 25.768 -0.176 c
+h
+30.196 -1.323 m
+30.027 -1.323 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.313 -0.97 29.244 -0.864 29.196 -0.735 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.155 0.096 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.724 29.931 0.765 c
+30.096 0.802 30.273 0.827 30.46 0.838 c
+31.181 0.852 l
+31.181 1.029 l
+31.181 1.147 31.17 1.249 31.152 1.338 c
+31.129 1.426 31.096 1.492 31.048 1.544 c
+31.008 1.602 30.96 1.639 30.901 1.661 c
+30.842 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.661 c
+30.468 1.65 30.42 1.625 30.372 1.588 c
+30.331 1.558 30.298 1.507 30.269 1.44 c
+30.248 1.382 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.313 1.396 29.358 1.532 29.417 1.661 c
+29.483 1.786 29.579 1.897 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.253 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.455 l
+32.099 -0.515 32.114 -0.569 32.136 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.371 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.278 c
+32.257 -1.286 32.213 -1.294 32.166 -1.294 c
+32.114 -1.301 32.055 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.646 c
+31.283 -0.646 l
+31.214 -0.757 31.144 -0.852 31.077 -0.941 c
+31.008 -1.022 30.931 -1.087 30.842 -1.147 c
+30.755 -1.205 30.655 -1.249 30.549 -1.278 c
+30.449 -1.309 30.331 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.331 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.25 c
+30.211 0.21 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.374 30.096 -0.496 30.167 -0.573 c
+30.233 -0.654 30.331 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.617 c
+30.85 -0.569 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.261 31.137 -0.162 c
+31.166 -0.056 31.181 0.059 31.181 0.177 c
+h
+36.403 -0.25 m
+36.403 -0.419 36.362 -0.569 36.285 -0.706 c
+36.215 -0.834 36.112 -0.948 35.976 -1.043 c
+35.848 -1.132 35.686 -1.201 35.491 -1.249 c
+35.304 -1.297 35.087 -1.323 34.844 -1.323 c
+34.616 -1.323 34.418 -1.309 34.242 -1.278 c
+34.065 -1.249 33.907 -1.201 33.772 -1.132 c
+33.631 -1.055 33.521 -0.956 33.433 -0.838 c
+33.345 -0.721 33.275 -0.573 33.228 -0.397 c
+34.036 -0.279 l
+34.055 -0.378 34.084 -0.455 34.124 -0.515 c
+34.171 -0.573 34.231 -0.617 34.3 -0.646 c
+34.367 -0.676 34.447 -0.702 34.535 -0.721 c
+34.624 -0.731 34.726 -0.735 34.844 -0.735 c
+34.94 -0.735 35.035 -0.731 35.123 -0.721 c
+35.212 -0.702 35.289 -0.676 35.359 -0.646 c
+35.425 -0.617 35.476 -0.58 35.505 -0.529 c
+35.543 -0.482 35.565 -0.419 35.565 -0.338 c
+35.565 -0.243 35.535 -0.169 35.476 -0.118 c
+35.425 -0.07 35.359 -0.029 35.27 0 c
+35.183 0.037 35.073 0.066 34.948 0.088 c
+34.83 0.118 34.697 0.147 34.551 0.177 c
+34.41 0.214 34.271 0.254 34.124 0.294 c
+33.984 0.341 33.859 0.405 33.742 0.485 c
+33.631 0.563 33.544 0.661 33.477 0.779 c
+33.408 0.897 33.375 1.047 33.375 1.235 c
+33.375 1.389 33.404 1.532 33.463 1.661 c
+33.529 1.797 33.624 1.911 33.742 1.999 c
+33.867 2.087 34.025 2.153 34.212 2.205 c
+34.396 2.253 34.609 2.278 34.844 2.278 c
+35.028 2.278 35.204 2.256 35.374 2.219 c
+35.539 2.19 35.686 2.135 35.815 2.058 c
+35.939 1.988 36.05 1.889 36.138 1.764 c
+36.226 1.646 36.285 1.503 36.314 1.338 c
+35.52 1.264 l
+35.499 1.341 35.469 1.404 35.432 1.455 c
+35.392 1.514 35.345 1.558 35.285 1.588 c
+35.234 1.625 35.171 1.65 35.094 1.661 c
+35.013 1.668 34.932 1.675 34.844 1.675 c
+34.628 1.675 34.466 1.646 34.36 1.588 c
+34.249 1.536 34.198 1.448 34.198 1.323 c
+34.198 1.242 34.216 1.18 34.256 1.132 c
+34.304 1.08 34.367 1.043 34.447 1.014 c
+34.535 0.985 34.631 0.956 34.742 0.926 c
+34.848 0.904 34.969 0.882 35.109 0.852 c
+35.264 0.823 35.422 0.783 35.58 0.735 c
+35.734 0.684 35.873 0.621 35.991 0.544 c
+36.108 0.463 36.204 0.36 36.285 0.235 c
+36.362 0.106 36.403 -0.056 36.403 -0.25 c
+38.262 1.514 m
+38.379 1.786 38.53 1.984 38.718 2.102 c
+38.901 2.219 39.122 2.278 39.379 2.278 c
+39.584 2.278 39.754 2.242 39.894 2.176 c
+40.041 2.105 40.151 2.014 40.232 1.897 c
+40.32 1.779 40.378 1.635 40.408 1.47 c
+40.444 1.301 40.467 1.124 40.467 0.941 c
+40.467 -1.264 l
+39.555 -1.264 l
+39.555 0.735 l
+39.555 0.871 39.544 0.992 39.526 1.103 c
+39.515 1.209 39.489 1.297 39.453 1.367 c
+39.412 1.444 39.353 1.503 39.276 1.544 c
+39.206 1.58 39.114 1.602 38.996 1.602 c
+38.886 1.602 38.791 1.577 38.703 1.529 c
+38.615 1.477 38.534 1.411 38.468 1.323 c
+38.409 1.235 38.358 1.124 38.321 1 c
+38.291 0.882 38.277 0.75 38.277 0.603 c
+38.277 -1.264 l
+37.365 -1.264 l
+37.365 3.513 l
+38.277 3.513 l
+38.277 2.205 l
+38.277 2.135 38.269 2.065 38.262 1.999 c
+38.262 1.793 l
+38.262 1.735 38.254 1.679 38.248 1.631 c
+38.248 1.514 l
+h
+47.662 -1.264 m
+47.651 -1.246 47.64 -1.216 47.632 -1.176 c
+47.632 -1.128 47.625 -1.08 47.617 -1.029 c
+47.617 -0.97 47.611 -0.912 47.603 -0.852 c
+47.603 -0.691 l
+47.486 -0.926 47.342 -1.095 47.177 -1.191 c
+47.008 -1.278 46.809 -1.323 46.574 -1.323 c
+46.376 -1.323 46.2 -1.278 46.045 -1.191 c
+45.887 -1.103 45.755 -0.981 45.648 -0.823 c
+45.549 -0.658 45.472 -0.467 45.413 -0.25 c
+45.362 -0.037 45.34 0.206 45.34 0.47 c
+45.34 0.735 45.362 0.974 45.413 1.191 c
+45.472 1.415 45.549 1.606 45.648 1.764 c
+45.755 1.918 45.887 2.043 46.045 2.132 c
+46.21 2.227 46.401 2.278 46.618 2.278 c
+46.714 2.278 46.809 2.263 46.898 2.234 c
+46.993 2.213 47.089 2.179 47.177 2.132 c
+47.265 2.08 47.342 2.018 47.412 1.941 c
+47.489 1.86 47.552 1.768 47.603 1.661 c
+47.603 1.749 l
+47.603 1.897 l
+47.603 2.058 l
+47.603 2.234 l
+47.603 3.513 l
+48.5 3.513 l
+48.5 -0.5 l
+48.5 -0.676 48.504 -0.834 48.515 -0.97 c
+48.521 -1.099 48.529 -1.198 48.529 -1.264 c
+h
+47.617 0.485 m
+47.617 0.721 47.592 0.912 47.544 1.058 c
+47.504 1.213 47.449 1.338 47.382 1.426 c
+47.324 1.514 47.254 1.573 47.177 1.602 c
+47.096 1.639 47.019 1.661 46.942 1.661 c
+46.842 1.661 46.751 1.635 46.663 1.588 c
+46.582 1.548 46.516 1.477 46.457 1.382 c
+46.405 1.282 46.362 1.161 46.324 1.014 c
+46.295 0.867 46.281 0.684 46.281 0.47 c
+46.281 0.077 46.331 -0.216 46.441 -0.411 c
+46.559 -0.61 46.721 -0.706 46.927 -0.706 c
+47.004 -0.706 47.081 -0.687 47.162 -0.646 c
+47.239 -0.61 47.313 -0.544 47.382 -0.455 c
+47.449 -0.368 47.504 -0.246 47.544 -0.088 c
+47.592 0.066 47.617 0.257 47.617 0.485 c
+52.56 1.47 m
+52.461 1.477 52.359 1.488 52.251 1.5 c
+52.141 1.517 52.02 1.529 51.885 1.529 c
+51.708 1.529 51.55 1.488 51.414 1.411 c
+51.274 1.341 51.156 1.242 51.061 1.118 c
+50.973 0.989 50.903 0.842 50.855 0.676 c
+50.815 0.507 50.796 0.331 50.796 0.147 c
+50.796 -1.264 l
+49.9 -1.264 l
+49.9 0.985 l
+49.9 1.11 49.889 1.235 49.87 1.353 c
+49.859 1.477 49.845 1.595 49.826 1.706 c
+49.815 1.823 49.801 1.918 49.782 1.999 c
+49.76 2.087 49.742 2.161 49.724 2.219 c
+50.605 2.219 l
+50.613 2.168 50.624 2.117 50.634 2.058 c
+50.653 1.999 50.668 1.933 50.679 1.866 c
+50.697 1.808 50.712 1.742 50.723 1.675 c
+50.73 1.606 50.742 1.544 50.753 1.484 c
+50.767 1.484 l
+50.804 1.602 50.855 1.708 50.914 1.808 c
+50.981 1.903 51.061 1.988 51.149 2.058 c
+51.237 2.124 51.34 2.179 51.458 2.219 c
+51.583 2.256 51.73 2.278 51.899 2.278 c
+52.024 2.278 52.141 2.271 52.251 2.263 c
+52.369 2.253 52.473 2.238 52.56 2.219 c
+h
+56.812 0.485 m
+56.812 0.21 56.776 -0.04 56.71 -0.264 c
+56.639 -0.482 56.537 -0.669 56.4 -0.823 c
+56.261 -0.981 56.084 -1.103 55.871 -1.191 c
+55.654 -1.278 55.401 -1.323 55.107 -1.323 c
+54.831 -1.323 54.585 -1.278 54.372 -1.191 c
+54.166 -1.103 53.994 -0.981 53.857 -0.823 c
+53.718 -0.669 53.615 -0.482 53.549 -0.264 c
+53.479 -0.04 53.446 0.21 53.446 0.485 c
+53.446 0.738 53.475 0.974 53.535 1.191 c
+53.6 1.415 53.703 1.606 53.843 1.764 c
+53.979 1.929 54.156 2.058 54.372 2.146 c
+54.585 2.234 54.842 2.278 55.137 2.278 c
+55.449 2.278 55.71 2.234 55.916 2.146 c
+56.128 2.058 56.301 1.929 56.43 1.764 c
+56.566 1.606 56.665 1.415 56.724 1.191 c
+56.783 0.974 56.812 0.738 56.812 0.485 c
+55.856 0.485 m
+55.856 0.69 55.842 0.867 55.812 1.014 c
+55.791 1.161 55.754 1.282 55.695 1.382 c
+55.636 1.477 55.563 1.548 55.474 1.588 c
+55.386 1.635 55.276 1.661 55.151 1.661 c
+54.887 1.661 54.696 1.562 54.578 1.367 c
+54.46 1.18 54.401 0.885 54.401 0.485 c
+54.401 0.062 54.46 -0.243 54.578 -0.426 c
+54.696 -0.613 54.871 -0.706 55.107 -0.706 c
+55.232 -0.706 55.346 -0.687 55.445 -0.646 c
+55.54 -0.599 55.621 -0.526 55.68 -0.426 c
+55.746 -0.331 55.791 -0.206 55.812 -0.058 c
+55.842 0.088 55.856 0.268 55.856 0.485 c
+58.539 2.219 m
+58.547 2.198 58.554 2.165 58.554 2.117 c
+58.561 2.076 58.569 2.028 58.569 1.97 c
+58.576 1.918 58.584 1.866 58.584 1.808 c
+58.584 1.646 l
+58.598 1.646 l
+58.657 1.764 58.723 1.86 58.804 1.941 c
+58.881 2.018 58.966 2.08 59.054 2.132 c
+59.141 2.19 59.23 2.227 59.318 2.249 c
+59.414 2.267 59.513 2.278 59.612 2.278 c
+59.818 2.278 59.998 2.234 60.157 2.146 c
+60.311 2.058 60.439 1.929 60.538 1.764 c
+60.645 1.606 60.722 1.415 60.774 1.191 c
+60.832 0.974 60.862 0.738 60.862 0.485 c
+60.862 0.22 60.832 -0.025 60.774 -0.25 c
+60.722 -0.467 60.645 -0.658 60.538 -0.823 c
+60.439 -0.981 60.307 -1.103 60.141 -1.191 c
+59.983 -1.278 59.796 -1.323 59.583 -1.323 c
+59.484 -1.323 59.384 -1.311 59.289 -1.294 c
+59.189 -1.272 59.098 -1.242 59.01 -1.191 c
+58.929 -1.143 58.852 -1.08 58.775 -0.999 c
+58.705 -0.922 58.646 -0.831 58.598 -0.721 c
+58.584 -0.721 l
+58.584 -0.808 l
+58.591 -0.849 58.598 -0.897 58.598 -0.956 c
+58.598 -1.117 l
+58.598 -1.294 l
+58.598 -2.631 l
+57.687 -2.631 l
+57.687 1.455 l
+57.687 1.621 57.68 1.768 57.672 1.897 c
+57.672 2.219 l
+h
+58.584 0.455 m
+58.584 0.228 58.602 0.037 58.642 -0.118 c
+58.69 -0.264 58.745 -0.382 58.804 -0.47 c
+58.87 -0.559 58.944 -0.625 59.024 -0.661 c
+59.101 -0.702 59.179 -0.721 59.259 -0.721 c
+59.355 -0.721 59.443 -0.698 59.524 -0.646 c
+59.612 -0.599 59.679 -0.529 59.729 -0.441 c
+59.789 -0.345 59.833 -0.22 59.862 -0.073 c
+59.899 0.081 59.921 0.268 59.921 0.485 c
+59.921 0.875 59.862 1.168 59.744 1.367 c
+59.634 1.562 59.48 1.661 59.274 1.661 c
+59.193 1.661 59.116 1.639 59.039 1.602 c
+58.958 1.562 58.885 1.5 58.819 1.411 c
+58.749 1.323 58.69 1.198 58.642 1.043 c
+58.602 0.885 58.584 0.69 58.584 0.455 c
+f
+Q
+0.113 0.082 0.09 0 k
+287.665 197.991 234.667 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 292.8568 191.1528 cm
+0 0 m
+0 -0.188 -0.029 -0.353 -0.087 -0.5 c
+-0.147 -0.647 -0.243 -0.776 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.206 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.359 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.148 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.675 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.142 1.278 -3.219 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.219 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.202 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.263 -0.941 1.205 c
+-0.756 1.146 -0.595 1.066 -0.455 0.97 c
+-0.32 0.87 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.319 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.477 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.201 1.558 -2.131 1.529 c
+-2.065 1.499 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.103 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.558 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.184 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.519 -2.484 5.402 -2.396 c
+5.284 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.754 5.964 -1.86 6.064 -1.941 c
+6.159 -2.029 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.029 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.324 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.215 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.814 0.243 4.814 0.5 c
+4.814 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.244 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.188 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.969 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.129 2.164 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.993 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.636 7.871 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.5 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.499 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.225 1.62 6.137 1.573 c
+6.056 1.532 5.99 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.383 c
+6.924 -0.294 6.978 -0.177 7.019 -0.03 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.597 1.602 m
+13.053 1.602 l
+13.053 2.219 l
+13.641 2.219 l
+13.92 3.116 l
+14.494 3.116 l
+14.494 2.219 l
+15.728 2.219 l
+15.728 1.602 l
+14.494 1.602 l
+14.494 -0.103 l
+14.494 -0.324 l
+14.501 -0.393 14.523 -0.456 14.552 -0.515 c
+14.589 -0.566 14.645 -0.611 14.714 -0.647 c
+14.791 -0.676 14.905 -0.691 15.052 -0.691 c
+15.188 -0.691 15.324 -0.688 15.464 -0.676 c
+15.599 -0.659 15.732 -0.632 15.861 -0.603 c
+15.861 -1.206 l
+15.78 -1.216 15.703 -1.231 15.626 -1.249 c
+15.545 -1.261 15.468 -1.268 15.391 -1.279 c
+15.31 -1.286 15.221 -1.294 15.125 -1.294 c
+15.038 -1.301 14.938 -1.309 14.832 -1.309 c
+14.645 -1.309 14.483 -1.294 14.346 -1.264 c
+14.218 -1.228 14.104 -1.183 14.009 -1.132 c
+13.92 -1.085 13.847 -1.025 13.788 -0.956 c
+13.729 -0.879 13.685 -0.802 13.656 -0.721 c
+13.627 -0.632 13.604 -0.544 13.597 -0.456 c
+13.586 -0.36 13.582 -0.265 13.582 -0.177 c
+h
+24.133 1.469 m
+24.033 1.477 23.931 1.488 23.823 1.499 c
+23.713 1.517 23.592 1.529 23.456 1.529 c
+23.28 1.529 23.121 1.488 22.986 1.411 c
+22.846 1.341 22.728 1.242 22.633 1.117 c
+22.545 0.988 22.475 0.841 22.427 0.675 c
+22.387 0.507 22.369 0.33 22.369 0.147 c
+22.369 -1.264 l
+21.471 -1.264 l
+21.471 0.985 l
+21.471 1.109 21.461 1.234 21.442 1.352 c
+21.432 1.477 21.417 1.595 21.398 1.705 c
+21.388 1.822 21.373 1.918 21.355 1.999 c
+21.332 2.087 21.314 2.161 21.296 2.219 c
+22.177 2.219 l
+22.185 2.167 22.196 2.117 22.207 2.057 c
+22.225 1.999 22.24 1.932 22.251 1.866 c
+22.269 1.808 22.284 1.741 22.296 1.675 c
+22.302 1.606 22.313 1.543 22.325 1.484 c
+22.339 1.484 l
+22.375 1.602 22.427 1.708 22.486 1.808 c
+22.552 1.903 22.633 1.988 22.722 2.057 c
+22.809 2.124 22.913 2.179 23.03 2.219 c
+23.155 2.256 23.302 2.278 23.471 2.278 c
+23.596 2.278 23.713 2.271 23.823 2.263 c
+23.942 2.252 24.044 2.238 24.133 2.219 c
+h
+26.341 -1.264 m
+26.341 0.852 l
+26.341 1.018 26.333 1.153 26.327 1.263 c
+26.315 1.371 26.297 1.455 26.267 1.514 c
+26.246 1.579 26.216 1.631 26.179 1.66 c
+26.15 1.691 26.109 1.705 26.061 1.705 c
+26.003 1.705 25.947 1.675 25.9 1.616 c
+25.86 1.565 25.826 1.492 25.797 1.396 c
+25.768 1.308 25.742 1.194 25.724 1.058 c
+25.712 0.918 25.709 0.768 25.709 0.602 c
+25.709 -1.264 l
+24.96 -1.264 l
+24.96 1.469 l
+24.96 1.705 l
+24.96 1.926 l
+24.96 2.003 24.952 2.065 24.945 2.117 c
+24.945 2.219 l
+25.621 2.219 l
+25.621 2.131 l
+25.621 1.984 l
+25.628 1.926 25.635 1.866 25.635 1.808 c
+25.635 1.646 l
+25.65 1.646 l
+25.668 1.734 25.698 1.811 25.739 1.881 c
+25.775 1.959 25.82 2.028 25.87 2.087 c
+25.93 2.146 25.995 2.19 26.076 2.219 c
+26.154 2.256 26.242 2.278 26.341 2.278 c
+26.525 2.278 26.664 2.223 26.753 2.117 c
+26.848 2.017 26.918 1.859 26.959 1.646 c
+26.973 1.646 l
+27.01 1.741 27.05 1.83 27.09 1.911 c
+27.138 1.988 27.194 2.05 27.252 2.102 c
+27.312 2.161 27.377 2.204 27.458 2.234 c
+27.535 2.263 27.624 2.278 27.723 2.278 c
+27.859 2.278 27.973 2.252 28.06 2.204 c
+28.149 2.153 28.215 2.08 28.266 1.984 c
+28.326 1.885 28.362 1.756 28.384 1.602 c
+28.413 1.455 28.428 1.271 28.428 1.058 c
+28.428 -1.264 l
+27.708 -1.264 l
+27.708 0.852 l
+27.708 1.018 27.701 1.153 27.693 1.263 c
+27.682 1.371 27.664 1.455 27.634 1.514 c
+27.613 1.579 27.583 1.631 27.547 1.66 c
+27.517 1.691 27.476 1.705 27.429 1.705 c
+27.312 1.705 27.216 1.616 27.15 1.44 c
+27.09 1.271 27.061 1.014 27.061 0.661 c
+27.061 -1.264 l
+h
+34.051 -2.631 m
+34.051 3.513 l
+35.976 3.513 l
+35.976 2.896 l
+34.903 2.896 l
+34.903 -2.014 l
+35.976 -2.014 l
+35.976 -2.631 l
+h
+39.012 1.602 m
+39.012 -1.264 l
+38.115 -1.264 l
+38.115 1.602 l
+37.292 1.602 l
+37.292 2.219 l
+38.115 2.219 l
+38.115 2.484 l
+38.115 2.609 38.13 2.741 38.159 2.881 c
+38.196 3.017 38.266 3.135 38.365 3.233 c
+38.472 3.34 38.615 3.428 38.791 3.498 c
+38.967 3.564 39.191 3.601 39.467 3.601 c
+39.68 3.601 39.879 3.59 40.055 3.572 c
+40.232 3.549 40.382 3.532 40.511 3.513 c
+40.511 2.925 l
+40.382 2.944 40.239 2.958 40.085 2.969 c
+39.927 2.977 39.776 2.984 39.629 2.984 c
+39.501 2.984 39.397 2.969 39.32 2.94 c
+39.239 2.91 39.177 2.869 39.129 2.822 c
+39.077 2.77 39.044 2.708 39.027 2.631 c
+39.015 2.561 39.012 2.484 39.012 2.396 c
+39.012 2.219 l
+40.438 2.219 l
+40.438 1.602 l
+h
+43.528 -0.647 m
+44.66 -0.647 l
+44.66 -1.264 l
+41.352 -1.264 l
+41.352 -0.647 l
+42.616 -0.647 l
+42.616 1.602 l
+41.691 1.602 l
+41.691 2.219 l
+43.528 2.219 l
+h
+42.616 3.513 0.912 -0.676 re
+42.616 2.836 m
+47.588 -0.647 m
+48.72 -0.647 l
+48.72 -1.264 l
+45.413 -1.264 l
+45.413 -0.647 l
+46.677 -0.647 l
+46.677 2.896 l
+45.751 2.896 l
+45.751 3.513 l
+47.588 3.513 l
+h
+51.105 -1.324 m
+50.848 -1.324 50.62 -1.286 50.414 -1.22 c
+50.208 -1.143 50.032 -1.029 49.886 -0.882 c
+49.738 -0.728 49.62 -0.537 49.533 -0.309 c
+49.452 -0.085 49.415 0.18 49.415 0.484 c
+49.415 0.816 49.458 1.095 49.547 1.323 c
+49.643 1.558 49.772 1.741 49.929 1.881 c
+50.094 2.017 50.283 2.117 50.488 2.175 c
+50.694 2.242 50.903 2.278 51.12 2.278 c
+51.392 2.278 51.627 2.227 51.825 2.131 c
+52.031 2.043 52.197 1.911 52.325 1.734 c
+52.461 1.565 52.56 1.359 52.619 1.117 c
+52.685 0.881 52.722 0.617 52.722 0.323 c
+52.722 0.309 l
+50.356 0.309 l
+50.356 0.162 50.37 0.022 50.399 -0.103 c
+50.437 -0.231 50.491 -0.345 50.561 -0.441 c
+50.628 -0.53 50.712 -0.599 50.811 -0.647 c
+50.907 -0.698 51.021 -0.721 51.149 -0.721 c
+51.303 -0.721 51.443 -0.688 51.561 -0.618 c
+51.686 -0.551 51.774 -0.449 51.825 -0.309 c
+52.664 -0.383 l
+52.634 -0.482 52.579 -0.588 52.502 -0.706 c
+52.421 -0.816 52.318 -0.919 52.193 -1.014 c
+52.076 -1.103 51.921 -1.176 51.737 -1.235 c
+51.561 -1.294 51.347 -1.324 51.105 -1.324 c
+51.105 1.705 m
+51.017 1.705 50.929 1.691 50.84 1.66 c
+50.753 1.631 50.672 1.579 50.605 1.514 c
+50.536 1.444 50.477 1.356 50.429 1.249 c
+50.389 1.139 50.37 1.014 50.37 0.867 c
+51.84 0.867 l
+51.84 1.003 51.814 1.124 51.767 1.234 c
+51.727 1.341 51.671 1.429 51.605 1.499 c
+51.546 1.565 51.473 1.616 51.384 1.646 c
+51.297 1.683 51.201 1.705 51.105 1.705 c
+53.975 -2.631 m
+53.975 -2.014 l
+55.048 -2.014 l
+55.048 2.896 l
+53.975 2.896 l
+53.975 3.513 l
+55.901 3.513 l
+55.901 -2.631 l
+h
+f
+Q
+q 1 0 0 1 318.9586 177.1631 cm
+0 0 m
+-0.941 0 l
+-0.941 -2.161 l
+-1.616 -2.161 l
+-1.616 3.189 l
+-0.118 3.189 l
+0.412 3.189 0.809 3.05 1.073 2.778 c
+1.345 2.502 1.484 2.105 1.484 1.587 c
+1.484 1.253 1.411 0.962 1.264 0.72 c
+1.118 0.474 0.912 0.286 0.647 0.161 c
+1.676 -2.117 l
+1.676 -2.161 l
+0.956 -2.161 l
+h
+-0.941 0.588 m
+-0.118 0.588 l
+0.166 0.588 0.389 0.675 0.559 0.852 c
+0.724 1.036 0.809 1.282 0.809 1.587 c
+0.809 2.271 0.493 2.616 -0.132 2.616 c
+-0.941 2.616 l
+h
+3.72 -2.234 m
+3.219 -2.234 2.837 -2.087 2.573 -1.794 c
+2.309 -1.5 2.176 -1.066 2.176 -0.485 c
+2.176 -0.015 l
+2.176 0.58 2.301 1.047 2.558 1.381 c
+2.822 1.723 3.182 1.896 3.645 1.896 c
+4.105 1.896 4.447 1.741 4.675 1.44 c
+4.91 1.146 5.031 0.683 5.042 0.058 c
+5.042 -0.368 l
+2.822 -0.368 l
+2.822 -0.456 l
+2.822 -0.89 2.899 -1.202 3.057 -1.397 c
+3.223 -1.584 3.454 -1.676 3.749 -1.676 c
+3.944 -1.676 4.116 -1.643 4.263 -1.573 c
+4.41 -1.496 4.546 -1.378 4.675 -1.22 c
+5.012 -1.632 l
+4.726 -2.036 4.296 -2.234 3.72 -2.234 c
+3.645 1.337 m
+3.37 1.337 3.168 1.242 3.043 1.058 c
+2.914 0.87 2.841 0.58 2.822 0.191 c
+4.395 0.191 l
+4.395 0.278 l
+4.373 0.661 4.307 0.929 4.19 1.087 c
+4.072 1.253 3.888 1.337 3.645 1.337 c
+6.438 1.822 m
+6.453 1.454 l
+6.696 1.749 7.015 1.896 7.408 1.896 c
+7.85 1.896 8.158 1.697 8.335 1.308 c
+8.588 1.697 8.937 1.896 9.378 1.896 c
+10.113 1.896 10.488 1.433 10.51 0.514 c
+10.51 -2.161 l
+9.864 -2.161 l
+9.864 0.455 l
+9.864 0.749 9.808 0.962 9.702 1.102 c
+9.602 1.238 9.43 1.308 9.187 1.308 c
+8.989 1.308 8.827 1.227 8.702 1.072 c
+8.584 0.926 8.515 0.735 8.497 0.5 c
+8.497 -2.161 l
+7.834 -2.161 l
+7.834 0.484 l
+7.834 1.032 7.614 1.308 7.173 1.308 c
+6.839 1.308 6.604 1.146 6.468 0.823 c
+6.468 -2.161 l
+5.821 -2.161 l
+5.821 1.822 l
+h
+11.348 0.014 m
+11.348 0.592 11.484 1.047 11.759 1.381 c
+12.042 1.723 12.414 1.896 12.877 1.896 c
+13.336 1.896 13.704 1.727 13.979 1.396 c
+14.263 1.072 14.409 0.625 14.42 0.058 c
+14.42 -0.368 l
+14.42 -0.937 14.277 -1.393 13.993 -1.735 c
+13.718 -2.07 13.351 -2.234 12.892 -2.234 c
+12.428 -2.234 12.057 -2.073 11.774 -1.75 c
+11.499 -1.419 11.356 -0.977 11.348 -0.427 c
+h
+11.994 -0.368 m
+11.994 -0.772 12.072 -1.088 12.23 -1.324 c
+12.395 -1.559 12.616 -1.676 12.892 -1.676 c
+13.457 -1.676 13.752 -1.264 13.773 -0.441 c
+13.773 0.014 l
+13.773 0.415 13.689 0.735 13.523 0.97 c
+13.365 1.213 13.149 1.337 12.877 1.337 c
+12.612 1.337 12.395 1.213 12.23 0.97 c
+12.072 0.735 11.994 0.415 11.994 0.014 c
+h
+16.331 -1.176 m
+17.081 1.822 l
+17.742 1.822 l
+16.566 -2.161 l
+16.081 -2.161 l
+14.89 1.822 l
+15.552 1.822 l
+h
+19.8 -2.234 m
+19.3 -2.234 18.918 -2.087 18.653 -1.794 c
+18.389 -1.5 18.257 -1.066 18.257 -0.485 c
+18.257 -0.015 l
+18.257 0.58 18.381 1.047 18.639 1.381 c
+18.903 1.723 19.263 1.896 19.726 1.896 c
+20.185 1.896 20.528 1.741 20.756 1.44 c
+20.991 1.146 21.112 0.683 21.123 0.058 c
+21.123 -0.368 l
+18.903 -0.368 l
+18.903 -0.456 l
+18.903 -0.89 18.98 -1.202 19.138 -1.397 c
+19.304 -1.584 19.535 -1.676 19.829 -1.676 c
+20.025 -1.676 20.197 -1.643 20.343 -1.573 c
+20.491 -1.496 20.627 -1.378 20.756 -1.22 c
+21.093 -1.632 l
+20.807 -2.036 20.377 -2.234 19.8 -2.234 c
+19.726 1.337 m
+19.451 1.337 19.248 1.242 19.123 1.058 c
+18.995 0.87 18.922 0.58 18.903 0.191 c
+20.476 0.191 l
+20.476 0.278 l
+20.454 0.661 20.388 0.929 20.27 1.087 c
+20.152 1.253 19.969 1.337 19.726 1.337 c
+23.798 -2.161 m
+23.798 1.294 l
+23.283 1.294 l
+23.283 1.822 l
+23.798 1.822 l
+23.798 2.19 l
+23.805 2.62 23.919 2.954 24.137 3.189 c
+24.36 3.432 24.673 3.557 25.077 3.557 c
+25.224 3.557 25.363 3.534 25.503 3.498 c
+25.65 3.457 25.801 3.403 25.959 3.336 c
+25.841 2.763 l
+25.606 2.888 25.363 2.954 25.121 2.954 c
+24.875 2.954 24.702 2.884 24.607 2.748 c
+24.507 2.62 24.459 2.425 24.459 2.16 c
+24.459 1.822 l
+25.106 1.822 l
+25.106 1.294 l
+24.459 1.294 l
+24.459 -2.161 l
+h
+26.267 -2.161 -0.646 3.983 re
+28.017 -2.161 -0.647 5.644 re
+30.456 -2.234 m
+29.957 -2.234 29.575 -2.087 29.311 -1.794 c
+29.045 -1.5 28.914 -1.066 28.914 -0.485 c
+28.914 -0.015 l
+28.914 0.58 29.039 1.047 29.296 1.381 c
+29.56 1.723 29.92 1.896 30.383 1.896 c
+30.843 1.896 31.185 1.741 31.412 1.44 c
+31.647 1.146 31.769 0.683 31.78 0.058 c
+31.78 -0.368 l
+29.56 -0.368 l
+29.56 -0.456 l
+29.56 -0.89 29.637 -1.202 29.795 -1.397 c
+29.961 -1.584 30.192 -1.676 30.487 -1.676 c
+30.681 -1.676 30.853 -1.643 31.001 -1.573 c
+31.148 -1.496 31.283 -1.378 31.412 -1.22 c
+31.75 -1.632 l
+31.464 -2.036 31.034 -2.234 30.456 -2.234 c
+30.383 1.337 m
+30.107 1.337 29.905 1.242 29.781 1.058 c
+29.652 0.87 29.579 0.58 29.56 0.191 c
+31.133 0.191 l
+31.133 0.278 l
+31.111 0.661 31.044 0.929 30.927 1.087 c
+30.809 1.253 30.626 1.337 30.383 1.337 c
+34.572 -2.161 m
+34.572 1.294 l
+34.043 1.294 l
+34.043 1.822 l
+34.572 1.822 l
+34.572 2.278 l
+34.572 2.678 34.668 2.991 34.867 3.218 c
+35.073 3.443 35.351 3.557 35.705 3.557 c
+35.84 3.557 35.973 3.534 36.101 3.498 c
+36.072 2.954 l
+35.973 2.973 35.873 2.983 35.778 2.983 c
+35.403 2.983 35.219 2.719 35.219 2.19 c
+35.219 1.822 l
+35.896 1.822 l
+35.896 1.294 l
+35.219 1.294 l
+35.219 -2.161 l
+h
+38.306 1.205 m
+38.218 1.223 38.119 1.234 38.012 1.234 c
+37.678 1.234 37.442 1.051 37.307 0.69 c
+37.307 -2.161 l
+36.66 -2.161 l
+36.66 1.822 l
+37.292 1.822 l
+37.307 1.411 l
+37.483 1.734 37.726 1.896 38.042 1.896 c
+38.148 1.896 38.236 1.874 38.306 1.837 c
+h
+38.747 0.014 m
+38.747 0.592 38.883 1.047 39.158 1.381 c
+39.441 1.723 39.813 1.896 40.276 1.896 c
+40.735 1.896 41.103 1.727 41.378 1.396 c
+41.662 1.072 41.808 0.625 41.82 0.058 c
+41.82 -0.368 l
+41.82 -0.937 41.676 -1.393 41.393 -1.735 c
+41.117 -2.07 40.75 -2.234 40.29 -2.234 c
+39.827 -2.234 39.456 -2.073 39.173 -1.75 c
+38.898 -1.419 38.755 -0.977 38.747 -0.427 c
+h
+39.393 -0.368 m
+39.393 -0.772 39.471 -1.088 39.629 -1.324 c
+39.794 -1.559 40.015 -1.676 40.29 -1.676 c
+40.856 -1.676 41.151 -1.264 41.172 -0.441 c
+41.172 0.014 l
+41.172 0.415 41.088 0.735 40.922 0.97 c
+40.764 1.213 40.548 1.337 40.276 1.337 c
+40.012 1.337 39.794 1.213 39.629 0.97 c
+39.471 0.735 39.393 0.415 39.393 0.014 c
+h
+43.274 1.822 m
+43.289 1.454 l
+43.532 1.749 43.852 1.896 44.245 1.896 c
+44.685 1.896 44.994 1.697 45.171 1.308 c
+45.424 1.697 45.774 1.896 46.214 1.896 c
+46.949 1.896 47.324 1.433 47.346 0.514 c
+47.346 -2.161 l
+46.699 -2.161 l
+46.699 0.455 l
+46.699 0.749 46.644 0.962 46.537 1.102 c
+46.439 1.238 46.266 1.308 46.023 1.308 c
+45.824 1.308 45.663 1.227 45.538 1.072 c
+45.421 0.926 45.35 0.735 45.332 0.5 c
+45.332 -2.161 l
+44.671 -2.161 l
+44.671 0.484 l
+44.671 1.032 44.45 1.308 44.01 1.308 c
+43.675 1.308 43.44 1.146 43.304 0.823 c
+43.304 -2.161 l
+42.657 -2.161 l
+42.657 1.822 l
+h
+f
+Q
+q 1 0 0 1 371.7877 176.751 cm
+0 0 m
+0.353 2.234 l
+1.352 2.234 l
+0.529 -1.749 l
+-0.339 -1.749 l
+-0.897 0.559 l
+-1.455 -1.749 l
+-2.323 -1.749 l
+-3.146 2.234 l
+-2.147 2.234 l
+-1.794 0 l
+-1.264 2.234 l
+-0.53 2.234 l
+h
+1.749 0.368 m
+1.749 0.974 1.888 1.448 2.175 1.793 c
+2.458 2.135 2.851 2.308 3.351 2.308 c
+3.858 2.308 4.255 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.368 c
+4.968 0.103 l
+4.968 -0.496 4.825 -0.966 4.542 -1.309 c
+4.255 -1.654 3.858 -1.822 3.351 -1.822 c
+2.84 -1.822 2.443 -1.654 2.161 -1.309 c
+1.885 -0.966 1.749 -0.492 1.749 0.118 c
+h
+2.792 0.103 m
+2.792 -0.603 2.977 -0.956 3.351 -0.956 c
+3.704 -0.956 3.895 -0.661 3.924 -0.073 c
+3.924 0.368 l
+3.924 0.728 3.873 1 3.777 1.176 c
+3.678 1.353 3.534 1.44 3.351 1.44 c
+3.175 1.44 3.035 1.353 2.94 1.176 c
+2.84 1 2.792 0.728 2.792 0.368 c
+h
+7.57 1.22 m
+7.231 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.882 c
+6.659 -1.749 l
+5.614 -1.749 l
+5.614 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.305 2.308 c
+7.422 2.308 7.515 2.286 7.584 2.249 c
+h
+9.437 -0.22 m
+9.157 -0.529 l
+9.157 -1.749 l
+8.114 -1.749 l
+8.114 3.896 l
+9.157 3.896 l
+9.157 0.852 l
+9.275 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.083 0.588 l
+11.347 -1.749 l
+10.157 -1.749 l
+h
+12.803 -1.749 -1.043 3.983 re
+11.715 3.263 m
+11.715 3.418 11.763 3.547 11.862 3.645 c
+11.968 3.752 12.104 3.807 12.274 3.807 c
+12.45 3.807 12.586 3.752 12.685 3.645 c
+12.791 3.547 12.847 3.418 12.847 3.263 c
+12.847 3.094 12.791 2.959 12.685 2.851 c
+12.586 2.753 12.45 2.705 12.274 2.705 c
+12.104 2.705 11.968 2.753 11.862 2.851 c
+11.763 2.959 11.715 3.094 11.715 3.263 c
+14.566 2.234 m
+14.596 1.837 l
+14.831 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.827 16.565 0.867 c
+16.565 -1.749 l
+15.522 -1.749 l
+15.522 0.794 l
+15.522 1.018 15.486 1.18 15.419 1.278 c
+15.349 1.374 15.232 1.426 15.066 1.426 c
+14.879 1.426 14.732 1.33 14.626 1.147 c
+14.626 -1.749 l
+13.581 -1.749 l
+13.581 2.234 l
+h
+17.183 0.368 m
+17.183 1.014 17.3 1.5 17.535 1.823 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.165 19.359 1.881 c
+19.403 2.234 l
+20.344 2.234 l
+20.344 -1.749 l
+20.344 -2.256 20.2 -2.645 19.916 -2.911 c
+19.63 -3.183 19.226 -3.322 18.697 -3.322 c
+18.469 -3.322 18.233 -3.278 17.992 -3.19 c
+17.756 -3.102 17.58 -2.988 17.462 -2.851 c
+17.815 -2.132 l
+17.911 -2.238 18.039 -2.323 18.197 -2.381 c
+18.351 -2.447 18.499 -2.484 18.638 -2.484 c
+18.873 -2.484 19.039 -2.425 19.137 -2.308 c
+19.245 -2.198 19.299 -2.021 19.299 -1.779 c
+19.299 -1.426 l
+19.101 -1.691 18.844 -1.822 18.52 -1.822 c
+18.098 -1.822 17.771 -1.661 17.535 -1.338 c
+17.308 -1.007 17.19 -0.536 17.183 0.073 c
+h
+18.227 0.103 m
+18.227 -0.272 18.274 -0.54 18.374 -0.706 c
+18.469 -0.875 18.624 -0.956 18.829 -0.956 c
+19.042 -0.956 19.201 -0.878 19.299 -0.721 c
+19.299 1.176 l
+19.189 1.341 19.035 1.426 18.829 1.426 c
+18.624 1.426 18.469 1.341 18.374 1.176 c
+18.274 1.007 18.227 0.738 18.227 0.368 c
+h
+22.695 0.368 m
+22.695 1.014 22.802 1.5 23.018 1.823 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.554 2.176 24.753 1.911 c
+24.753 3.896 l
+25.811 3.896 l
+25.811 -1.749 l
+24.855 -1.749 l
+24.812 -1.338 l
+24.595 -1.661 24.319 -1.822 23.989 -1.822 c
+23.577 -1.822 23.257 -1.668 23.033 -1.352 c
+22.817 -1.029 22.702 -0.559 22.695 0.059 c
+h
+23.739 0.103 m
+23.739 -0.29 23.775 -0.565 23.856 -0.721 c
+23.945 -0.878 24.091 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.753 -0.676 c
+24.753 1.132 l
+24.654 1.326 24.503 1.426 24.297 1.426 c
+24.099 1.426 23.959 1.345 23.871 1.191 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.749 -1.043 3.983 re
+26.576 3.263 m
+26.576 3.418 26.623 3.547 26.723 3.645 c
+26.829 3.752 26.965 3.807 27.134 3.807 c
+27.311 3.807 27.446 3.752 27.546 3.645 c
+27.652 3.547 27.708 3.418 27.708 3.263 c
+27.708 3.094 27.652 2.959 27.546 2.851 c
+27.446 2.753 27.311 2.705 27.134 2.705 c
+26.965 2.705 26.829 2.753 26.723 2.851 c
+26.623 2.959 26.576 3.094 26.576 3.263 c
+30.426 1.22 m
+30.089 1.249 l
+29.802 1.249 29.611 1.124 29.516 0.882 c
+29.516 -1.749 l
+28.471 -1.749 l
+28.471 2.234 l
+29.442 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.162 2.308 c
+30.28 2.308 30.372 2.286 30.441 2.249 c
+h
+32.5 -1.822 m
+31.97 -1.822 31.551 -1.668 31.25 -1.352 c
+30.956 -1.029 30.809 -0.569 30.809 0.029 c
+30.809 0.338 l
+30.809 0.963 30.945 1.448 31.22 1.793 c
+31.492 2.135 31.885 2.308 32.396 2.308 c
+32.896 2.308 33.267 2.146 33.514 1.823 c
+33.767 1.5 33.9 1.022 33.911 0.397 c
+33.911 -0.103 l
+31.837 -0.103 l
+31.856 -0.397 31.918 -0.613 32.029 -0.75 c
+32.146 -0.889 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.234 l
+33.723 -1.411 33.535 -1.554 33.293 -1.661 c
+33.047 -1.768 32.782 -1.822 32.5 -1.822 c
+31.853 0.617 m
+32.882 0.617 l
+32.882 0.721 l
+32.882 0.956 32.841 1.132 32.764 1.249 c
+32.694 1.374 32.566 1.44 32.381 1.44 c
+32.205 1.44 32.073 1.371 31.985 1.235 c
+31.904 1.106 31.86 0.9 31.853 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.383 -0.76 36.394 -0.368 c
+37.364 -0.368 l
+37.364 -0.801 37.233 -1.153 36.968 -1.426 c
+36.703 -1.691 36.365 -1.822 35.953 -1.822 c
+35.442 -1.822 35.049 -1.668 34.777 -1.352 c
+34.513 -1.029 34.374 -0.559 34.366 0.059 c
+34.366 0.382 l
+34.366 1.007 34.498 1.484 34.763 1.808 c
+35.035 2.139 35.432 2.308 35.953 2.308 c
+36.383 2.308 36.726 2.168 36.982 1.897 c
+37.236 1.621 37.364 1.239 37.364 0.75 c
+36.394 0.75 l
+36.394 0.963 36.354 1.132 36.277 1.249 c
+36.207 1.374 36.09 1.44 35.924 1.44 c
+35.748 1.44 35.619 1.374 35.542 1.249 c
+35.461 1.121 35.417 0.871 35.409 0.5 c
+35.409 0.088 l
+35.409 -0.235 35.424 -0.463 35.454 -0.588 c
+35.49 -0.717 35.546 -0.808 35.615 -0.867 c
+35.693 -0.926 35.799 -0.956 35.939 -0.956 c
+39.172 3.204 m
+39.172 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.172 1.44 l
+39.172 -0.529 l
+39.172 -0.687 39.191 -0.794 39.232 -0.852 c
+39.28 -0.912 39.363 -0.941 39.481 -0.941 c
+39.588 -0.941 39.672 -0.933 39.731 -0.912 c
+39.731 -1.72 l
+39.555 -1.786 39.363 -1.822 39.158 -1.822 c
+38.482 -1.822 38.137 -1.437 38.129 -0.661 c
+38.129 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.368 m
+40.055 0.974 40.194 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.848 1.793 c
+43.13 1.448 43.274 0.974 43.274 0.368 c
+43.274 0.103 l
+43.274 -0.496 43.13 -0.966 42.848 -1.309 c
+42.561 -1.654 42.164 -1.822 41.657 -1.822 c
+41.146 -1.822 40.749 -1.654 40.466 -1.309 c
+40.19 -0.966 40.055 -0.492 40.055 0.118 c
+h
+41.098 0.103 m
+41.098 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.201 -0.661 42.23 -0.073 c
+42.23 0.368 l
+42.23 0.728 42.179 1 42.083 1.176 c
+41.984 1.353 41.84 1.44 41.657 1.44 c
+41.48 1.44 41.341 1.353 41.245 1.176 c
+41.146 1 41.098 0.728 41.098 0.368 c
+h
+45.875 1.22 m
+45.537 1.249 l
+45.251 1.249 45.06 1.124 44.965 0.882 c
+44.965 -1.749 l
+43.92 -1.749 l
+43.92 2.234 l
+44.89 2.234 l
+44.92 1.793 l
+45.085 2.135 45.316 2.308 45.611 2.308 c
+45.728 2.308 45.821 2.286 45.89 2.249 c
+h
+47.772 -0.015 m
+48.3 2.234 l
+49.403 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.529 -3.351 46.993 -3.351 c
+46.864 -3.351 46.721 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.484 l
+46.849 -2.484 46.97 -2.447 47.051 -2.381 c
+47.128 -2.323 47.191 -2.212 47.242 -2.057 c
+47.316 -1.793 l
+46.17 2.234 l
+47.286 2.234 l
+h
+f
+Q
+q 1 0 0 1 425.5124 175.0022 cm
+0 0 m
+-0.04 0.087 -0.066 0.235 -0.073 0.44 c
+-0.309 0.095 -0.603 -0.073 -0.956 -0.073 c
+-1.319 -0.073 -1.602 0.022 -1.808 0.22 c
+-2.007 0.426 -2.102 0.713 -2.102 1.087 c
+-2.102 1.488 -1.966 1.808 -1.691 2.043 c
+-1.419 2.285 -1.043 2.41 -0.573 2.41 c
+-0.088 2.41 l
+-0.088 2.836 l
+-0.088 3.072 -0.143 3.237 -0.25 3.337 c
+-0.36 3.443 -0.522 3.498 -0.735 3.498 c
+-0.933 3.498 -1.095 3.439 -1.22 3.322 c
+-1.338 3.204 -1.396 3.057 -1.396 2.881 c
+-2.043 2.881 l
+-2.043 3.075 -1.984 3.266 -1.866 3.454 c
+-1.742 3.638 -1.58 3.785 -1.382 3.895 c
+-1.176 4.002 -0.948 4.056 -0.691 4.056 c
+-0.291 4.056 0.015 3.954 0.22 3.748 c
+0.434 3.542 0.548 3.248 0.559 2.866 c
+0.559 0.852 l
+0.559 0.548 0.595 0.283 0.676 0.058 c
+0.676 0 l
+h
+-0.867 0.515 m
+-0.702 0.515 -0.551 0.558 -0.412 0.646 c
+-0.264 0.735 -0.158 0.845 -0.088 0.985 c
+-0.088 1.926 l
+-0.455 1.926 l
+-0.771 1.926 -1.014 1.855 -1.191 1.72 c
+-1.367 1.591 -1.455 1.404 -1.455 1.161 c
+-1.455 0.933 -1.411 0.768 -1.323 0.661 c
+-1.234 0.562 -1.084 0.515 -0.867 0.515 c
+2.175 3.983 m
+2.19 3.542 l
+2.444 3.884 2.767 4.056 3.16 4.056 c
+3.866 4.056 4.222 3.586 4.233 2.645 c
+4.233 0 l
+3.586 0 l
+3.586 2.616 l
+3.586 2.929 3.532 3.149 3.425 3.278 c
+3.314 3.403 3.16 3.468 2.955 3.468 c
+2.797 3.468 2.649 3.414 2.514 3.307 c
+2.385 3.197 2.282 3.061 2.205 2.896 c
+2.205 0 l
+1.558 0 l
+1.558 3.983 l
+h
+5.072 2.175 m
+5.072 2.782 5.182 3.248 5.409 3.572 c
+5.644 3.895 5.972 4.056 6.394 4.056 c
+6.776 4.056 7.074 3.898 7.291 3.586 c
+7.291 5.644 l
+7.938 5.644 l
+7.938 0 l
+7.349 0 l
+7.306 0.426 l
+7.1 0.091 6.795 -0.073 6.394 -0.073 c
+5.982 -0.073 5.659 0.081 5.424 0.397 c
+5.189 0.72 5.072 1.176 5.072 1.764 c
+h
+5.718 1.793 m
+5.718 1.352 5.781 1.022 5.909 0.808 c
+6.045 0.602 6.265 0.5 6.57 0.5 c
+6.894 0.5 7.133 0.661 7.291 0.985 c
+7.291 2.998 l
+7.121 3.31 6.882 3.468 6.57 3.468 c
+6.265 3.468 6.045 3.366 5.909 3.16 c
+5.781 2.954 5.718 2.631 5.718 2.19 c
+h
+12.7 0 m
+12.66 0.087 12.634 0.235 12.627 0.44 c
+12.391 0.095 12.097 -0.073 11.744 -0.073 c
+11.381 -0.073 11.098 0.022 10.892 0.22 c
+10.693 0.426 10.598 0.713 10.598 1.087 c
+10.598 1.488 10.734 1.808 11.009 2.043 c
+11.281 2.285 11.657 2.41 12.127 2.41 c
+12.612 2.41 l
+12.612 2.836 l
+12.612 3.072 12.557 3.237 12.45 3.337 c
+12.34 3.443 12.178 3.498 11.965 3.498 c
+11.767 3.498 11.605 3.439 11.48 3.322 c
+11.362 3.204 11.304 3.057 11.304 2.881 c
+10.657 2.881 l
+10.657 3.075 10.716 3.266 10.834 3.454 c
+10.958 3.638 11.12 3.785 11.318 3.895 c
+11.524 4.002 11.752 4.056 12.009 4.056 c
+12.409 4.056 12.715 3.954 12.92 3.748 c
+13.134 3.542 13.247 3.248 13.259 2.866 c
+13.259 0.852 l
+13.259 0.548 13.295 0.283 13.376 0.058 c
+13.376 0 l
+h
+11.833 0.515 m
+11.998 0.515 12.149 0.558 12.288 0.646 c
+12.436 0.735 12.542 0.845 12.612 0.985 c
+12.612 1.926 l
+12.245 1.926 l
+11.929 1.926 11.686 1.855 11.509 1.72 c
+11.333 1.591 11.245 1.404 11.245 1.161 c
+11.245 0.933 11.289 0.768 11.377 0.661 c
+11.466 0.562 11.616 0.515 11.833 0.515 c
+14.126 2.175 m
+14.126 2.782 14.236 3.248 14.464 3.572 c
+14.699 3.895 15.026 4.056 15.449 4.056 c
+15.831 4.056 16.129 3.898 16.345 3.586 c
+16.345 5.644 l
+16.992 5.644 l
+16.992 0 l
+16.405 0 l
+16.36 0.426 l
+16.154 0.091 15.85 -0.073 15.449 -0.073 c
+15.037 -0.073 14.714 0.081 14.479 0.397 c
+14.244 0.72 14.126 1.176 14.126 1.764 c
+h
+14.772 1.793 m
+14.772 1.352 14.835 1.022 14.963 0.808 c
+15.1 0.602 15.32 0.5 15.625 0.5 c
+15.948 0.5 16.187 0.661 16.345 0.985 c
+16.345 2.998 l
+16.176 3.31 15.937 3.468 15.625 3.468 c
+15.32 3.468 15.1 3.366 14.963 3.16 c
+14.835 2.954 14.772 2.631 14.772 2.19 c
+h
+17.859 2.175 m
+17.859 2.782 17.97 3.248 18.198 3.572 c
+18.433 3.895 18.759 4.056 19.183 4.056 c
+19.565 4.056 19.862 3.898 20.079 3.586 c
+20.079 5.644 l
+20.725 5.644 l
+20.725 0 l
+20.137 0 l
+20.093 0.426 l
+19.888 0.091 19.582 -0.073 19.183 -0.073 c
+18.771 -0.073 18.447 0.081 18.212 0.397 c
+17.977 0.72 17.859 1.176 17.859 1.764 c
+h
+18.506 1.793 m
+18.506 1.352 18.568 1.022 18.697 0.808 c
+18.834 0.602 19.054 0.5 19.359 0.5 c
+19.682 0.5 19.921 0.661 20.079 0.985 c
+20.079 2.998 l
+19.91 3.31 19.671 3.468 19.359 3.468 c
+19.054 3.468 18.834 3.366 18.697 3.16 c
+18.568 2.954 18.506 2.631 18.506 2.19 c
+h
+23.312 2.175 m
+23.312 2.782 23.423 3.248 23.651 3.572 c
+23.886 3.895 24.213 4.056 24.636 4.056 c
+25.018 4.056 25.315 3.898 25.533 3.586 c
+25.533 5.644 l
+26.179 5.644 l
+26.179 0 l
+25.591 0 l
+25.547 0.426 l
+25.342 0.091 25.036 -0.073 24.636 -0.073 c
+24.224 -0.073 23.9 0.081 23.665 0.397 c
+23.43 0.72 23.312 1.176 23.312 1.764 c
+h
+23.96 1.793 m
+23.96 1.352 24.022 1.022 24.151 0.808 c
+24.286 0.602 24.507 0.5 24.812 0.5 c
+25.136 0.5 25.375 0.661 25.533 0.985 c
+25.533 2.998 l
+25.363 3.31 25.124 3.468 24.812 3.468 c
+24.507 3.468 24.286 3.366 24.151 3.16 c
+24.022 2.954 23.96 2.631 23.96 2.19 c
+h
+28.604 -0.073 m
+28.105 -0.073 27.723 0.073 27.458 0.367 c
+27.193 0.661 27.061 1.095 27.061 1.675 c
+27.061 2.146 l
+27.061 2.741 27.185 3.208 27.443 3.542 c
+27.708 3.884 28.068 4.056 28.531 4.056 c
+28.99 4.056 29.332 3.902 29.56 3.601 c
+29.795 3.307 29.916 2.844 29.927 2.219 c
+29.927 1.793 l
+27.708 1.793 l
+27.708 1.705 l
+27.708 1.271 27.785 0.959 27.943 0.764 c
+28.108 0.577 28.34 0.484 28.634 0.484 c
+28.829 0.484 29.001 0.518 29.148 0.588 c
+29.296 0.665 29.431 0.783 29.56 0.941 c
+29.898 0.529 l
+29.612 0.125 29.182 -0.073 28.604 -0.073 c
+28.531 3.498 m
+28.255 3.498 28.053 3.403 27.929 3.219 c
+27.8 3.031 27.726 2.741 27.708 2.352 c
+29.281 2.352 l
+29.281 2.439 l
+29.259 2.822 29.192 3.09 29.074 3.248 c
+28.957 3.414 28.773 3.498 28.531 3.498 c
+31.412 0 -0.647 5.644 re
+33.852 -0.073 m
+33.352 -0.073 32.97 0.073 32.706 0.367 c
+32.44 0.661 32.309 1.095 32.309 1.675 c
+32.309 2.146 l
+32.309 2.741 32.434 3.208 32.691 3.542 c
+32.955 3.884 33.315 4.056 33.778 4.056 c
+34.238 4.056 34.58 3.902 34.807 3.601 c
+35.043 3.307 35.164 2.844 35.175 2.219 c
+35.175 1.793 l
+32.955 1.793 l
+32.955 1.705 l
+32.955 1.271 33.032 0.959 33.19 0.764 c
+33.356 0.577 33.587 0.484 33.882 0.484 c
+34.076 0.484 34.249 0.518 34.395 0.588 c
+34.543 0.665 34.678 0.783 34.807 0.941 c
+35.145 0.529 l
+34.859 0.125 34.429 -0.073 33.852 -0.073 c
+33.778 3.498 m
+33.503 3.498 33.3 3.403 33.176 3.219 c
+33.047 3.031 32.974 2.741 32.955 2.352 c
+34.528 2.352 l
+34.528 2.439 l
+34.506 2.822 34.44 3.09 34.322 3.248 c
+34.204 3.414 34.021 3.498 33.778 3.498 c
+36.806 4.939 m
+36.806 3.983 l
+37.409 3.983 l
+37.409 3.454 l
+36.806 3.454 l
+36.806 0.985 l
+36.806 0.827 36.828 0.709 36.88 0.632 c
+36.939 0.551 37.027 0.515 37.144 0.515 c
+37.233 0.515 37.321 0.529 37.409 0.558 c
+37.409 0 l
+37.262 -0.048 37.107 -0.073 36.953 -0.073 c
+36.696 -0.073 36.502 0.018 36.365 0.205 c
+36.226 0.389 36.16 0.65 36.16 0.985 c
+36.16 3.454 l
+35.557 3.454 l
+35.557 3.983 l
+36.16 3.983 l
+36.16 4.939 l
+h
+38.879 0 -0.646 3.983 re
+38.923 5.026 m
+38.923 4.916 38.894 4.825 38.835 4.748 c
+38.776 4.677 38.68 4.644 38.555 4.644 c
+38.438 4.644 38.343 4.677 38.277 4.748 c
+38.218 4.825 38.188 4.916 38.188 5.026 c
+38.188 5.144 38.218 5.236 38.277 5.306 c
+38.343 5.383 38.438 5.423 38.555 5.423 c
+38.68 5.423 38.776 5.383 38.835 5.306 c
+38.894 5.225 38.923 5.134 38.923 5.026 c
+39.761 2.175 m
+39.761 2.753 39.897 3.208 40.172 3.542 c
+40.456 3.884 40.826 4.056 41.29 4.056 c
+41.749 4.056 42.117 3.888 42.392 3.557 c
+42.675 3.233 42.822 2.786 42.833 2.219 c
+42.833 1.793 l
+42.833 1.224 42.69 0.768 42.407 0.426 c
+42.131 0.091 41.764 -0.073 41.304 -0.073 c
+40.841 -0.073 40.471 0.087 40.187 0.411 c
+39.912 0.742 39.768 1.183 39.761 1.734 c
+h
+40.408 1.793 m
+40.408 1.389 40.485 1.072 40.643 0.837 c
+40.808 0.602 41.028 0.484 41.304 0.484 c
+41.87 0.484 42.164 0.897 42.186 1.72 c
+42.186 2.175 l
+42.186 2.576 42.102 2.896 41.936 3.131 c
+41.778 3.373 41.562 3.498 41.29 3.498 c
+41.025 3.498 40.808 3.373 40.643 3.131 c
+40.485 2.896 40.408 2.576 40.408 2.175 c
+h
+44.288 3.983 m
+44.303 3.542 l
+44.556 3.884 44.88 4.056 45.273 4.056 c
+45.979 4.056 46.335 3.586 46.346 2.645 c
+46.346 0 l
+45.699 0 l
+45.699 2.616 l
+45.699 2.929 45.645 3.149 45.537 3.278 c
+45.427 3.403 45.273 3.468 45.067 3.468 c
+44.909 3.468 44.762 3.414 44.627 3.307 c
+44.498 3.197 44.394 3.061 44.317 2.896 c
+44.317 0 l
+43.671 0 l
+43.671 3.983 l
+h
+49.888 4.939 m
+49.888 3.983 l
+50.491 3.983 l
+50.491 3.454 l
+49.888 3.454 l
+49.888 0.985 l
+49.888 0.827 49.911 0.709 49.962 0.632 c
+50.021 0.551 50.109 0.515 50.227 0.515 c
+50.315 0.515 50.403 0.529 50.491 0.558 c
+50.491 0 l
+50.345 -0.048 50.19 -0.073 50.036 -0.073 c
+49.778 -0.073 49.584 0.018 49.447 0.205 c
+49.308 0.389 49.242 0.65 49.242 0.985 c
+49.242 3.454 l
+48.639 3.454 l
+48.639 3.983 l
+49.242 3.983 l
+49.242 4.939 l
+h
+51.05 2.175 m
+51.05 2.753 51.186 3.208 51.461 3.542 c
+51.744 3.884 52.115 4.056 52.579 4.056 c
+53.038 4.056 53.406 3.888 53.68 3.557 c
+53.964 3.233 54.111 2.786 54.122 2.219 c
+54.122 1.793 l
+54.122 1.224 53.979 0.768 53.696 0.426 c
+53.42 0.091 53.053 -0.073 52.593 -0.073 c
+52.13 -0.073 51.759 0.087 51.476 0.411 c
+51.201 0.742 51.057 1.183 51.05 1.734 c
+h
+51.696 1.793 m
+51.696 1.389 51.774 1.072 51.932 0.837 c
+52.097 0.602 52.317 0.484 52.593 0.484 c
+53.159 0.484 53.453 0.897 53.475 1.72 c
+53.475 2.175 l
+53.475 2.576 53.391 2.896 53.225 3.131 c
+53.067 3.373 52.851 3.498 52.579 3.498 c
+52.314 3.498 52.097 3.373 51.932 3.131 c
+51.774 2.896 51.696 2.576 51.696 2.175 c
+h
+f
+Q
+q 1 0 0 1 483.8532 176.0746 cm
+0 0 m
+0 0.088 -0.044 0.166 -0.133 0.235 c
+-0.221 0.312 -0.408 0.416 -0.691 0.544 c
+-1.125 0.721 -1.422 0.9 -1.588 1.088 c
+-1.746 1.272 -1.823 1.503 -1.823 1.779 c
+-1.823 2.12 -1.702 2.404 -1.455 2.631 c
+-1.202 2.866 -0.864 2.984 -0.441 2.984 c
+-0.011 2.984 0.338 2.87 0.602 2.646 c
+0.867 2.419 0.999 2.117 0.999 1.735 c
+-0.044 1.735 l
+-0.044 2.058 -0.184 2.22 -0.456 2.22 c
+-0.566 2.22 -0.655 2.183 -0.721 2.117 c
+-0.79 2.047 -0.823 1.948 -0.823 1.823 c
+-0.823 1.735 -0.786 1.654 -0.706 1.588 c
+-0.628 1.529 -0.449 1.434 -0.162 1.309 c
+0.268 1.151 0.565 0.975 0.735 0.779 c
+0.911 0.592 0.999 0.342 0.999 0.03 c
+0.999 -0.323 0.867 -0.61 0.602 -0.823 c
+0.338 -1.04 -0.011 -1.146 -0.441 -1.146 c
+-0.736 -1.146 -0.996 -1.091 -1.22 -0.985 c
+-1.448 -0.867 -1.625 -0.706 -1.75 -0.5 c
+-1.867 -0.294 -1.926 -0.073 -1.926 0.162 c
+-0.941 0.162 l
+-0.941 -0.025 -0.904 -0.162 -0.823 -0.249 c
+-0.736 -0.338 -0.603 -0.382 -0.427 -0.382 c
+-0.144 -0.382 0 -0.257 0 0 c
+2.866 3.881 m
+2.866 2.911 l
+3.395 2.911 l
+3.395 2.117 l
+2.866 2.117 l
+2.866 0.148 l
+2.866 -0.01 2.884 -0.118 2.925 -0.176 c
+2.973 -0.235 3.057 -0.264 3.175 -0.264 c
+3.281 -0.264 3.366 -0.257 3.424 -0.235 c
+3.424 -1.043 l
+3.248 -1.109 3.057 -1.146 2.851 -1.146 c
+2.175 -1.146 1.83 -0.76 1.822 0.015 c
+1.822 2.117 l
+1.367 2.117 l
+1.367 2.911 l
+1.822 2.911 l
+1.822 3.881 l
+h
+5.85 -1.072 m
+5.82 -1.014 5.791 -0.911 5.762 -0.764 c
+5.574 -1.022 5.325 -1.146 5.012 -1.146 c
+4.677 -1.146 4.398 -1.04 4.174 -0.823 c
+3.958 -0.598 3.85 -0.309 3.85 0.044 c
+3.85 0.456 3.983 0.772 4.247 1 c
+4.512 1.235 4.895 1.353 5.394 1.353 c
+5.718 1.353 l
+5.718 1.676 l
+5.718 1.852 5.681 1.974 5.614 2.043 c
+5.556 2.12 5.468 2.161 5.35 2.161 c
+5.093 2.161 4.968 2.007 4.968 1.706 c
+3.925 1.706 l
+3.925 2.076 4.06 2.382 4.336 2.617 c
+4.608 2.859 4.957 2.984 5.379 2.984 c
+5.82 2.984 6.158 2.866 6.393 2.631 c
+6.636 2.404 6.761 2.08 6.761 1.661 c
+6.761 -0.205 l
+6.761 -0.551 6.809 -0.819 6.908 -1.014 c
+6.908 -1.072 l
+h
+5.247 -0.323 m
+5.354 -0.323 5.446 -0.305 5.527 -0.264 c
+5.614 -0.216 5.677 -0.158 5.718 -0.087 c
+5.718 0.736 l
+5.468 0.736 l
+5.292 0.736 5.148 0.676 5.041 0.559 c
+4.943 0.449 4.895 0.302 4.895 0.118 c
+4.895 -0.176 5.012 -0.323 5.247 -0.323 c
+7.378 1.044 m
+7.378 1.691 7.496 2.176 7.731 2.5 c
+7.966 2.822 8.297 2.984 8.731 2.984 c
+9.084 2.984 9.356 2.841 9.554 2.558 c
+9.598 2.911 l
+10.539 2.911 l
+10.539 -1.072 l
+10.539 -1.579 10.395 -1.969 10.113 -2.234 c
+9.826 -2.506 9.422 -2.645 8.893 -2.645 c
+8.665 -2.645 8.43 -2.601 8.187 -2.514 c
+7.952 -2.425 7.775 -2.311 7.658 -2.175 c
+8.01 -1.455 l
+8.106 -1.562 8.235 -1.646 8.393 -1.705 c
+8.548 -1.77 8.694 -1.808 8.834 -1.808 c
+9.069 -1.808 9.234 -1.749 9.334 -1.631 c
+9.44 -1.521 9.495 -1.344 9.495 -1.103 c
+9.495 -0.75 l
+9.296 -1.014 9.04 -1.146 8.716 -1.146 c
+8.294 -1.146 7.966 -0.985 7.731 -0.661 c
+7.503 -0.33 7.386 0.14 7.378 0.75 c
+h
+8.422 0.779 m
+8.422 0.405 8.47 0.136 8.569 -0.029 c
+8.665 -0.198 8.819 -0.279 9.025 -0.279 c
+9.238 -0.279 9.396 -0.201 9.495 -0.044 c
+9.495 1.852 l
+9.385 2.018 9.231 2.103 9.025 2.103 c
+8.819 2.103 8.665 2.018 8.569 1.852 c
+8.47 1.683 8.422 1.415 8.422 1.044 c
+h
+12.391 -1.072 -1.044 3.983 re
+11.303 3.94 m
+11.303 4.094 11.351 4.223 11.451 4.322 c
+11.557 4.428 11.692 4.484 11.862 4.484 c
+12.038 4.484 12.174 4.428 12.273 4.322 c
+12.38 4.223 12.435 4.094 12.435 3.94 c
+12.435 3.77 12.38 3.635 12.273 3.528 c
+12.174 3.429 12.038 3.381 11.862 3.381 c
+11.692 3.381 11.557 3.429 11.451 3.528 c
+11.351 3.635 11.303 3.77 11.303 3.94 c
+14.154 2.911 m
+14.184 2.514 l
+14.42 2.826 14.721 2.984 15.095 2.984 c
+15.779 2.984 16.132 2.503 16.154 1.544 c
+16.154 -1.072 l
+15.11 -1.072 l
+15.11 1.47 l
+15.11 1.694 15.073 1.856 15.008 1.955 c
+14.938 2.051 14.82 2.103 14.655 2.103 c
+14.468 2.103 14.32 2.007 14.214 1.823 c
+14.214 -1.072 l
+13.17 -1.072 l
+13.17 2.911 l
+h
+16.772 1.044 m
+16.772 1.691 16.889 2.176 17.124 2.5 c
+17.359 2.822 17.69 2.984 18.123 2.984 c
+18.476 2.984 18.748 2.841 18.947 2.558 c
+18.991 2.911 l
+19.931 2.911 l
+19.931 -1.072 l
+19.931 -1.579 19.788 -1.969 19.505 -2.234 c
+19.218 -2.506 18.815 -2.645 18.285 -2.645 c
+18.057 -2.645 17.822 -2.601 17.58 -2.514 c
+17.344 -2.425 17.168 -2.311 17.051 -2.175 c
+17.404 -1.455 l
+17.499 -1.562 17.628 -1.646 17.786 -1.705 c
+17.94 -1.77 18.087 -1.808 18.227 -1.808 c
+18.462 -1.808 18.627 -1.749 18.726 -1.631 c
+18.833 -1.521 18.888 -1.344 18.888 -1.103 c
+18.888 -0.75 l
+18.69 -1.014 18.432 -1.146 18.109 -1.146 c
+17.686 -1.146 17.359 -0.985 17.124 -0.661 c
+16.897 -0.33 16.779 0.14 16.772 0.75 c
+h
+17.815 0.779 m
+17.815 0.405 17.863 0.136 17.962 -0.029 c
+18.057 -0.198 18.212 -0.279 18.418 -0.279 c
+18.63 -0.279 18.788 -0.201 18.888 -0.044 c
+18.888 1.852 l
+18.778 2.018 18.623 2.103 18.418 2.103 c
+18.212 2.103 18.057 2.018 17.962 1.852 c
+17.863 1.683 17.815 1.415 17.815 1.044 c
+h
+24.312 -1.072 m
+24.282 -1.014 24.253 -0.911 24.224 -0.764 c
+24.036 -1.022 23.787 -1.146 23.474 -1.146 c
+23.139 -1.146 22.86 -1.04 22.636 -0.823 c
+22.42 -0.598 22.312 -0.309 22.312 0.044 c
+22.312 0.456 22.445 0.772 22.709 1 c
+22.975 1.235 23.357 1.353 23.856 1.353 c
+24.18 1.353 l
+24.18 1.676 l
+24.18 1.852 24.143 1.974 24.076 2.043 c
+24.018 2.12 23.93 2.161 23.812 2.161 c
+23.555 2.161 23.43 2.007 23.43 1.706 c
+22.386 1.706 l
+22.386 2.076 22.522 2.382 22.798 2.617 c
+23.07 2.859 23.419 2.984 23.841 2.984 c
+24.282 2.984 24.621 2.866 24.856 2.631 c
+25.098 2.404 25.223 2.08 25.223 1.661 c
+25.223 -0.205 l
+25.223 -0.551 25.271 -0.819 25.37 -1.014 c
+25.37 -1.072 l
+h
+23.709 -0.323 m
+23.816 -0.323 23.908 -0.305 23.989 -0.264 c
+24.076 -0.216 24.139 -0.158 24.18 -0.087 c
+24.18 0.736 l
+23.93 0.736 l
+23.754 0.736 23.61 0.676 23.503 0.559 c
+23.405 0.449 23.357 0.302 23.357 0.118 c
+23.357 -0.176 23.474 -0.323 23.709 -0.323 c
+27.928 1.897 m
+27.59 1.926 l
+27.303 1.926 27.112 1.801 27.016 1.559 c
+27.016 -1.072 l
+25.973 -1.072 l
+25.973 2.911 l
+26.943 2.911 l
+26.973 2.469 l
+27.137 2.812 27.369 2.984 27.663 2.984 c
+27.781 2.984 27.873 2.962 27.943 2.926 c
+h
+30 -1.146 m
+29.471 -1.146 29.052 -0.992 28.751 -0.675 c
+28.457 -0.353 28.31 0.107 28.31 0.706 c
+28.31 1.014 l
+28.31 1.64 28.446 2.124 28.722 2.469 c
+28.994 2.812 29.387 2.984 29.898 2.984 c
+30.397 2.984 30.769 2.822 31.014 2.5 c
+31.268 2.176 31.401 1.698 31.411 1.073 c
+31.411 0.574 l
+29.339 0.574 l
+29.358 0.279 29.42 0.063 29.53 -0.073 c
+29.647 -0.213 29.828 -0.279 30.074 -0.279 c
+30.416 -0.279 30.706 -0.162 30.941 0.073 c
+31.353 -0.558 l
+31.224 -0.735 31.037 -0.878 30.794 -0.985 c
+30.548 -1.091 30.283 -1.146 30 -1.146 c
+29.354 1.294 m
+30.382 1.294 l
+30.382 1.397 l
+30.382 1.632 30.343 1.808 30.265 1.926 c
+30.195 2.051 30.067 2.117 29.883 2.117 c
+29.707 2.117 29.574 2.047 29.486 1.912 c
+29.405 1.783 29.361 1.577 29.354 1.294 c
+33.881 -1.072 m
+33.852 -1.014 33.822 -0.911 33.793 -0.764 c
+33.605 -1.022 33.356 -1.146 33.043 -1.146 c
+32.709 -1.146 32.429 -1.04 32.205 -0.823 c
+31.989 -0.598 31.882 -0.309 31.882 0.044 c
+31.882 0.456 32.014 0.772 32.279 1 c
+32.543 1.235 32.926 1.353 33.425 1.353 c
+33.749 1.353 l
+33.749 1.676 l
+33.749 1.852 33.712 1.974 33.646 2.043 c
+33.587 2.12 33.499 2.161 33.381 2.161 c
+33.124 2.161 32.999 2.007 32.999 1.706 c
+31.955 1.706 l
+31.955 2.076 32.091 2.382 32.367 2.617 c
+32.639 2.859 32.988 2.984 33.41 2.984 c
+33.852 2.984 34.189 2.866 34.424 2.631 c
+34.667 2.404 34.792 2.08 34.792 1.661 c
+34.792 -0.205 l
+34.792 -0.551 34.84 -0.819 34.939 -1.014 c
+34.939 -1.072 l
+h
+33.279 -0.323 m
+33.385 -0.323 33.477 -0.305 33.558 -0.264 c
+33.646 -0.216 33.709 -0.158 33.749 -0.087 c
+33.749 0.736 l
+33.499 0.736 l
+33.323 0.736 33.179 0.676 33.073 0.559 c
+32.973 0.449 32.926 0.302 32.926 0.118 c
+32.926 -0.176 33.043 -0.323 33.279 -0.323 c
+f
+Q
+q 1 0 0 1 519.5421 175.3549 cm
+0 0 m
+0 0.118 0.033 0.213 0.103 0.294 c
+0.169 0.371 0.272 0.411 0.412 0.411 c
+0.559 0.411 0.665 0.371 0.735 0.294 c
+0.812 0.213 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.103 -0.279 c
+0.033 -0.202 0 -0.11 0 0 c
+f
+Q
+0.793 0.801 0.129 0.016 k
+535.667 282.996 238.665 -21.457 re
+f
+0 0 0 0 k
+q 1 0 0 1 629.4581 271.0489 cm
+0 0 m
+0.794 0 l
+0.794 -1.514 l
+0 -1.514 l
+0 -3.542 l
+-1.823 -3.542 l
+-1.823 -1.514 l
+-4.924 -1.514 l
+-4.998 -0.338 l
+-1.823 5.821 l
+0 5.821 l
+h
+-3.234 0 m
+-1.823 0 l
+-1.823 3.132 l
+-1.852 3.057 l
+h
+2.253 -2.616 m
+2.253 -2.322 2.348 -2.083 2.547 -1.896 c
+2.741 -1.712 2.995 -1.616 3.31 -1.616 c
+3.612 -1.616 3.862 -1.712 4.06 -1.896 c
+4.266 -2.083 4.37 -2.322 4.37 -2.616 c
+4.37 -2.921 4.266 -3.167 4.06 -3.351 c
+3.862 -3.528 3.612 -3.615 3.31 -3.615 c
+3.006 -3.615 2.753 -3.524 2.547 -3.336 c
+2.348 -3.152 2.253 -2.91 2.253 -2.616 c
+15.621 -2.484 m
+15.258 -2.877 14.813 -3.175 14.284 -3.38 c
+13.755 -3.575 13.174 -3.675 12.549 -3.675 c
+11.469 -3.675 10.631 -3.343 10.036 -2.675 c
+9.437 -2.009 9.132 -1.04 9.124 0.235 c
+9.124 1.926 l
+9.124 3.219 9.404 4.212 9.962 4.91 c
+10.528 5.604 11.351 5.954 12.432 5.954 c
+13.45 5.954 14.214 5.696 14.724 5.189 c
+15.243 4.69 15.54 3.903 15.621 2.837 c
+13.784 2.837 l
+13.733 3.433 13.612 3.84 13.417 4.057 c
+13.218 4.27 12.91 4.381 12.49 4.381 c
+11.979 4.381 11.609 4.193 11.374 3.822 c
+11.146 3.447 11.028 2.856 11.021 2.043 c
+11.021 0.339 l
+11.021 -0.514 11.146 -1.139 11.403 -1.529 c
+11.657 -1.911 12.072 -2.102 12.652 -2.102 c
+13.024 -2.102 13.328 -2.028 13.564 -1.882 c
+13.725 -1.764 l
+13.725 -0.043 l
+12.403 -0.043 l
+12.403 1.382 l
+15.621 1.382 l
+h
+19.179 -3.542 -1.896 9.363 re
+26.759 4.248 m
+24.438 4.248 l
+24.438 -3.542 l
+22.541 -3.542 l
+22.541 4.248 l
+20.263 4.248 l
+20.263 5.821 l
+26.759 5.821 l
+h
+30.769 -3.542 m
+30.769 5.821 l
+33.664 5.821 l
+34.642 5.821 35.388 5.601 35.899 5.16 c
+36.406 4.726 36.663 4.09 36.663 3.249 c
+36.663 2.779 36.552 2.371 36.34 2.029 c
+36.134 1.683 35.844 1.434 35.472 1.279 c
+35.891 1.151 36.215 0.904 36.442 0.545 c
+36.678 0.192 36.795 -0.257 36.795 -0.793 c
+36.795 -1.697 36.546 -2.381 36.045 -2.851 c
+35.546 -3.314 34.819 -3.542 33.87 -3.542 c
+h
+32.665 0.53 m
+32.665 -1.969 l
+33.87 -1.969 l
+34.212 -1.969 34.473 -1.866 34.649 -1.66 c
+34.825 -1.448 34.914 -1.146 34.914 -0.764 c
+34.914 0.077 34.605 0.507 33.988 0.53 c
+h
+32.665 1.912 m
+33.649 1.912 l
+34.385 1.912 34.752 2.293 34.752 3.057 c
+34.752 3.477 34.664 3.782 34.487 3.969 c
+34.318 4.152 34.046 4.248 33.664 4.248 c
+32.665 4.248 l
+h
+41.198 -0.118 m
+40.257 -0.118 l
+40.257 -3.542 l
+38.376 -3.542 l
+38.376 5.821 l
+41.389 5.821 l
+42.337 5.821 43.068 5.575 43.579 5.087 c
+44.097 4.594 44.358 3.899 44.358 2.999 c
+44.358 1.754 43.906 0.882 43.006 0.383 c
+44.637 -3.453 l
+44.637 -3.542 l
+42.609 -3.542 l
+h
+40.257 1.455 m
+41.33 1.455 l
+41.712 1.455 41.996 1.577 42.183 1.823 c
+42.366 2.076 42.462 2.415 42.462 2.837 c
+42.462 3.778 42.098 4.248 41.374 4.248 c
+40.257 4.248 l
+h
+50.345 -1.631 m
+47.772 -1.631 l
+47.272 -3.542 l
+45.273 -3.542 l
+48.198 5.821 l
+49.917 5.821 l
+52.872 -3.542 l
+50.844 -3.542 l
+h
+48.184 -0.043 m
+49.933 -0.043 l
+49.051 3.293 l
+h
+60.527 -3.542 m
+58.631 -3.542 l
+55.868 2.602 l
+55.868 -3.542 l
+53.971 -3.542 l
+53.971 5.821 l
+55.868 5.821 l
+58.631 -0.323 l
+58.631 5.821 l
+60.527 5.821 l
+h
+68.63 -0.426 m
+68.578 -1.495 68.277 -2.304 67.718 -2.851 c
+67.167 -3.403 66.395 -3.675 65.396 -3.675 c
+64.327 -3.675 63.507 -3.329 62.941 -2.63 c
+62.382 -1.936 62.104 -0.941 62.104 0.353 c
+62.104 1.926 l
+62.104 3.219 62.39 4.212 62.97 4.91 c
+63.558 5.604 64.371 5.954 65.411 5.954 c
+66.428 5.954 67.204 5.663 67.733 5.087 c
+68.262 4.516 68.564 3.697 68.645 2.631 c
+66.748 2.631 l
+66.727 3.296 66.623 3.753 66.44 3.998 c
+66.253 4.252 65.91 4.381 65.411 4.381 c
+64.911 4.381 64.551 4.204 64.338 3.851 c
+64.132 3.499 64.018 2.914 63.999 2.103 c
+63.999 0.339 l
+63.999 -0.595 64.103 -1.234 64.308 -1.587 c
+64.522 -1.932 64.886 -2.102 65.396 -2.102 c
+65.885 -2.102 66.223 -1.984 66.411 -1.749 c
+66.605 -1.506 66.712 -1.065 66.733 -0.426 c
+h
+76.578 -3.542 m
+74.697 -3.542 l
+74.697 0.47 l
+71.904 0.47 l
+71.904 -3.542 l
+70.008 -3.542 l
+70.008 5.821 l
+71.904 5.821 l
+71.904 2.029 l
+74.697 2.029 l
+74.697 5.821 l
+76.578 5.821 l
+h
+80.297 -3.542 -1.896 9.363 re
+88.547 -3.542 m
+86.651 -3.542 l
+83.888 2.602 l
+83.888 -3.542 l
+81.991 -3.542 l
+81.991 5.821 l
+83.888 5.821 l
+86.651 -0.323 l
+86.651 5.821 l
+88.547 5.821 l
+h
+96.665 -2.484 m
+96.301 -2.877 95.857 -3.175 95.327 -3.38 c
+94.797 -3.575 94.217 -3.675 93.592 -3.675 c
+92.512 -3.675 91.674 -3.343 91.079 -2.675 c
+90.48 -2.009 90.175 -1.04 90.168 0.235 c
+90.168 1.926 l
+90.168 3.219 90.447 4.212 91.005 4.91 c
+91.572 5.604 92.395 5.954 93.475 5.954 c
+94.493 5.954 95.257 5.696 95.768 5.189 c
+96.287 4.69 96.584 3.903 96.665 2.837 c
+94.827 2.837 l
+94.776 3.433 94.654 3.84 94.46 4.057 c
+94.261 4.27 93.953 4.381 93.534 4.381 c
+93.023 4.381 92.652 4.193 92.416 3.822 c
+92.189 3.447 92.071 2.856 92.064 2.043 c
+92.064 0.339 l
+92.064 -0.514 92.189 -1.139 92.445 -1.529 c
+92.699 -1.911 93.114 -2.102 93.696 -2.102 c
+94.066 -2.102 94.371 -2.028 94.606 -1.882 c
+94.768 -1.764 l
+94.768 -0.043 l
+93.445 -0.043 l
+93.445 1.382 l
+96.665 1.382 l
+h
+103.83 5.821 m
+105.609 -0.955 l
+107.358 5.821 l
+109.828 5.821 l
+109.828 -3.542 l
+107.931 -3.542 l
+107.931 -1.014 l
+108.108 2.897 l
+106.241 -3.542 l
+104.948 -3.542 l
+103.081 2.897 l
+103.257 -1.014 l
+103.257 -3.542 l
+101.361 -3.542 l
+101.361 5.821 l
+h
+118.225 0.294 m
+118.225 -0.962 117.924 -1.936 117.328 -2.63 c
+116.729 -3.329 115.906 -3.675 114.859 -3.675 c
+113.808 -3.675 112.981 -3.333 112.374 -2.645 c
+111.775 -1.951 111.47 -0.984 111.463 0.25 c
+111.463 1.852 l
+111.463 3.135 111.761 4.138 112.359 4.865 c
+112.955 5.59 113.785 5.954 114.844 5.954 c
+115.88 5.954 116.7 5.594 117.298 4.881 c
+117.905 4.175 118.213 3.179 118.225 1.897 c
+h
+116.328 1.867 m
+116.328 2.708 116.203 3.337 115.961 3.749 c
+115.726 4.16 115.351 4.366 114.844 4.366 c
+114.344 4.366 113.969 4.164 113.727 3.763 c
+113.492 3.37 113.367 2.771 113.359 1.97 c
+113.359 0.294 l
+113.359 -0.521 113.48 -1.124 113.727 -1.514 c
+113.969 -1.907 114.348 -2.102 114.859 -2.102 c
+115.347 -2.102 115.711 -1.911 115.946 -1.529 c
+116.189 -1.146 116.318 -0.558 116.328 0.235 c
+h
+119.801 -3.542 m
+119.801 5.821 l
+122.285 5.821 l
+123.373 5.821 124.24 5.472 124.887 4.778 c
+125.541 4.079 125.876 3.132 125.886 1.926 c
+125.886 0.412 l
+125.886 -0.823 125.563 -1.793 124.916 -2.499 c
+124.27 -3.197 123.373 -3.542 122.227 -3.542 c
+h
+121.697 4.248 m
+121.697 -1.969 l
+122.256 -1.969 l
+122.892 -1.969 123.336 -1.804 123.593 -1.469 c
+123.846 -1.139 123.979 -0.565 123.99 0.25 c
+123.99 1.867 l
+123.99 2.749 123.865 3.359 123.623 3.705 c
+123.387 4.046 122.976 4.227 122.388 4.248 c
+h
+132.284 0.515 m
+129.344 0.515 l
+129.344 -1.969 l
+132.828 -1.969 l
+132.828 -3.542 l
+127.449 -3.542 l
+127.449 5.821 l
+132.814 5.821 l
+132.814 4.248 l
+129.344 4.248 l
+129.344 2.029 l
+132.284 2.029 l
+h
+135.985 -1.969 m
+139.307 -1.969 l
+139.307 -3.542 l
+134.088 -3.542 l
+134.088 5.821 l
+135.985 5.821 l
+h
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 252.694 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 245.8587 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.646 -0.242 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.147 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.69 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.141 1.278 -3.218 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.042 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.205 c
+-0.756 1.147 -0.595 1.066 -0.455 0.97 c
+-0.319 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.318 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.249 -2.454 2.19 c
+-2.476 2.132 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.2 1.558 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.52 -2.484 5.403 -2.396 c
+5.285 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.753 5.964 -1.86 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.214 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.206 c
+4.836 0.008 4.815 0.243 4.815 0.5 c
+4.815 0.771 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.631 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.189 2.263 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.179 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.97 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.13 2.165 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.992 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.872 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.499 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.5 6.729 1.558 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.226 1.621 6.137 1.573 c
+6.056 1.532 5.991 1.463 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.301 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.675 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.117 l
+14.498 3.117 l
+14.498 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.498 1.602 l
+14.498 -0.103 l
+14.498 -0.324 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.566 14.648 -0.61 14.718 -0.646 c
+14.795 -0.676 14.909 -0.69 15.056 -0.69 c
+15.192 -0.69 15.327 -0.687 15.468 -0.676 c
+15.603 -0.658 15.736 -0.632 15.865 -0.603 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.042 -1.301 14.942 -1.309 14.836 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.222 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.792 -0.956 c
+13.733 -0.879 13.689 -0.801 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+21.12 -1.264 m
+21.12 -0.97 l
+21.126 -0.834 21.134 -0.676 21.134 -0.5 c
+21.134 3.513 l
+22.045 3.513 l
+22.045 2.234 l
+22.045 2.072 l
+22.045 1.897 l
+22.045 1.845 22.038 1.801 22.03 1.764 c
+22.03 1.675 l
+22.045 1.675 l
+22.093 1.783 22.155 1.874 22.236 1.955 c
+22.313 2.032 22.398 2.095 22.487 2.146 c
+22.574 2.194 22.666 2.227 22.766 2.249 c
+22.861 2.267 22.961 2.278 23.059 2.278 c
+23.273 2.278 23.46 2.234 23.618 2.146 c
+23.773 2.058 23.901 1.929 24 1.764 c
+24.106 1.606 24.184 1.415 24.235 1.191 c
+24.283 0.974 24.309 0.735 24.309 0.47 c
+24.309 0.214 24.28 -0.025 24.22 -0.25 c
+24.162 -0.467 24.077 -0.658 23.971 -0.823 c
+23.861 -0.981 23.728 -1.103 23.574 -1.191 c
+23.416 -1.278 23.236 -1.323 23.03 -1.323 c
+22.931 -1.323 22.832 -1.311 22.736 -1.294 c
+22.648 -1.272 22.56 -1.242 22.471 -1.191 c
+22.383 -1.132 22.302 -1.066 22.236 -0.985 c
+22.167 -0.908 22.104 -0.808 22.045 -0.69 c
+22.03 -0.69 l
+22.03 -0.852 l
+22.03 -0.912 22.024 -0.97 22.016 -1.029 c
+22.016 -1.08 22.009 -1.128 22.001 -1.176 c
+22.001 -1.216 21.994 -1.246 21.986 -1.264 c
+h
+22.03 0.5 m
+22.03 0.264 22.049 0.066 22.09 -0.088 c
+22.137 -0.246 22.196 -0.368 22.265 -0.455 c
+22.332 -0.544 22.406 -0.61 22.487 -0.646 c
+22.564 -0.687 22.641 -0.706 22.722 -0.706 c
+22.927 -0.706 23.082 -0.61 23.192 -0.411 c
+23.31 -0.216 23.368 0.077 23.368 0.47 c
+23.368 0.684 23.346 0.867 23.31 1.014 c
+23.28 1.168 23.236 1.294 23.177 1.382 c
+23.125 1.477 23.059 1.55 22.971 1.602 c
+22.89 1.65 22.803 1.675 22.707 1.675 c
+22.626 1.675 22.549 1.654 22.471 1.617 c
+22.391 1.577 22.317 1.514 22.251 1.426 c
+22.192 1.338 22.137 1.213 22.09 1.058 c
+22.049 0.912 22.03 0.724 22.03 0.5 c
+28.193 1.47 m
+28.094 1.477 27.991 1.488 27.884 1.5 c
+27.774 1.517 27.653 1.529 27.517 1.529 c
+27.341 1.529 27.183 1.488 27.046 1.411 c
+26.907 1.342 26.789 1.242 26.693 1.118 c
+26.606 0.989 26.535 0.842 26.488 0.676 c
+26.448 0.507 26.429 0.331 26.429 0.147 c
+26.429 -1.264 l
+25.533 -1.264 l
+25.533 0.985 l
+25.533 1.11 25.521 1.235 25.503 1.353 c
+25.492 1.477 25.477 1.595 25.459 1.706 c
+25.448 1.823 25.434 1.918 25.415 1.999 c
+25.393 2.088 25.375 2.161 25.356 2.219 c
+26.238 2.219 l
+26.246 2.168 26.257 2.117 26.267 2.058 c
+26.286 1.999 26.3 1.933 26.312 1.866 c
+26.33 1.808 26.344 1.742 26.356 1.675 c
+26.363 1.606 26.375 1.544 26.385 1.484 c
+26.4 1.484 l
+26.437 1.602 26.488 1.708 26.547 1.808 c
+26.613 1.903 26.693 1.988 26.782 2.058 c
+26.87 2.124 26.973 2.179 27.09 2.219 c
+27.216 2.256 27.362 2.278 27.532 2.278 c
+27.657 2.278 27.774 2.271 27.884 2.263 c
+28.002 2.253 28.105 2.238 28.193 2.219 c
+h
+30.196 -1.323 m
+30.026 -1.323 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.314 -0.97 29.244 -0.864 29.197 -0.735 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.156 0.096 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.724 29.932 0.765 c
+30.097 0.802 30.273 0.827 30.46 0.838 c
+31.181 0.852 l
+31.181 1.029 l
+31.181 1.147 31.169 1.249 31.152 1.338 c
+31.129 1.426 31.096 1.492 31.048 1.544 c
+31.008 1.602 30.961 1.639 30.901 1.661 c
+30.843 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.661 c
+30.468 1.65 30.42 1.625 30.373 1.588 c
+30.332 1.558 30.298 1.507 30.269 1.44 c
+30.248 1.382 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.314 1.396 29.358 1.532 29.417 1.661 c
+29.483 1.786 29.579 1.897 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.253 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.455 l
+32.099 -0.515 32.114 -0.569 32.137 -0.617 c
+32.154 -0.658 32.184 -0.69 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.372 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.278 c
+32.257 -1.286 32.214 -1.294 32.166 -1.294 c
+32.114 -1.301 32.056 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.646 c
+31.283 -0.646 l
+31.214 -0.757 31.144 -0.852 31.078 -0.941 c
+31.008 -1.022 30.931 -1.087 30.843 -1.147 c
+30.755 -1.205 30.655 -1.249 30.549 -1.278 c
+30.45 -1.309 30.332 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.331 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.25 c
+30.211 0.21 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.374 30.097 -0.496 30.167 -0.573 c
+30.233 -0.654 30.332 -0.69 30.46 -0.69 c
+30.567 -0.69 30.666 -0.669 30.755 -0.617 c
+30.85 -0.569 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.261 31.137 -0.162 c
+31.166 -0.055 31.181 0.059 31.181 0.177 c
+h
+35.495 -1.264 m
+35.495 0.721 l
+35.495 1.022 35.451 1.242 35.362 1.382 c
+35.281 1.529 35.146 1.602 34.951 1.602 c
+34.841 1.602 34.738 1.577 34.643 1.529 c
+34.554 1.477 34.473 1.411 34.408 1.323 c
+34.348 1.235 34.297 1.124 34.26 1 c
+34.231 0.882 34.216 0.75 34.216 0.603 c
+34.216 -1.264 l
+33.305 -1.264 l
+33.305 1.44 l
+33.305 1.661 l
+33.305 1.749 33.297 1.826 33.29 1.897 c
+33.29 2.088 l
+33.29 2.219 l
+34.142 2.219 l
+34.15 2.19 34.157 2.146 34.157 2.088 c
+34.157 1.897 l
+34.165 1.826 34.172 1.756 34.172 1.691 c
+34.179 1.621 34.186 1.565 34.186 1.529 c
+34.202 1.529 l
+34.319 1.793 34.47 1.984 34.657 2.102 c
+34.841 2.219 35.061 2.278 35.318 2.278 c
+35.503 2.278 35.664 2.249 35.804 2.19 c
+35.939 2.132 36.054 2.043 36.141 1.926 c
+36.23 1.808 36.293 1.665 36.332 1.5 c
+36.38 1.342 36.407 1.154 36.407 0.941 c
+36.407 -1.264 l
+h
+38.923 -1.323 m
+38.637 -1.323 38.394 -1.282 38.188 -1.205 c
+37.982 -1.117 37.81 -0.996 37.674 -0.838 c
+37.535 -0.684 37.431 -0.496 37.365 -0.279 c
+37.296 -0.055 37.263 0.191 37.263 0.455 c
+37.263 0.75 37.296 1.007 37.365 1.235 c
+37.442 1.459 37.549 1.646 37.689 1.793 c
+37.836 1.947 38.012 2.065 38.218 2.146 c
+38.424 2.234 38.659 2.278 38.923 2.278 c
+39.148 2.278 39.35 2.249 39.526 2.19 c
+39.702 2.132 39.854 2.047 39.981 1.941 c
+40.107 1.841 40.21 1.72 40.291 1.573 c
+40.368 1.433 40.423 1.282 40.452 1.118 c
+39.541 1.073 l
+39.511 1.249 39.441 1.389 39.335 1.5 c
+39.235 1.606 39.092 1.661 38.909 1.661 c
+38.662 1.661 38.487 1.558 38.379 1.353 c
+38.269 1.154 38.218 0.867 38.218 0.485 c
+38.218 -0.309 38.453 -0.706 38.923 -0.706 c
+39.089 -0.706 39.232 -0.654 39.35 -0.544 c
+39.467 -0.437 39.541 -0.276 39.57 -0.058 c
+40.482 -0.103 l
+40.452 -0.272 40.397 -0.426 40.32 -0.573 c
+40.25 -0.721 40.147 -0.852 40.012 -0.97 c
+39.883 -1.08 39.725 -1.168 39.541 -1.234 c
+39.364 -1.294 39.158 -1.323 38.923 -1.323 c
+42.323 1.514 m
+42.441 1.786 42.591 1.984 42.778 2.102 c
+42.962 2.219 43.183 2.278 43.44 2.278 c
+43.646 2.278 43.815 2.242 43.954 2.176 c
+44.101 2.105 44.211 2.014 44.292 1.897 c
+44.38 1.779 44.44 1.635 44.469 1.47 c
+44.505 1.301 44.527 1.124 44.527 0.941 c
+44.527 -1.264 l
+43.616 -1.264 l
+43.616 0.735 l
+43.616 0.871 43.605 0.992 43.586 1.103 c
+43.576 1.209 43.55 1.297 43.513 1.367 c
+43.473 1.444 43.414 1.503 43.337 1.544 c
+43.267 1.58 43.175 1.602 43.058 1.602 c
+42.948 1.602 42.852 1.577 42.763 1.529 c
+42.676 1.477 42.595 1.411 42.528 1.323 c
+42.47 1.235 42.418 1.124 42.381 1 c
+42.352 0.882 42.337 0.75 42.337 0.603 c
+42.337 -1.264 l
+41.426 -1.264 l
+41.426 3.513 l
+42.337 3.513 l
+42.337 2.205 l
+42.337 2.135 42.329 2.065 42.323 1.999 c
+42.323 1.793 l
+42.323 1.735 42.315 1.679 42.308 1.631 c
+42.308 1.514 l
+h
+50.297 -2.631 m
+50.297 3.513 l
+52.222 3.513 l
+52.222 2.896 l
+51.149 2.896 l
+51.149 -2.014 l
+52.222 -2.014 l
+52.222 -2.631 l
+h
+54.2 0.838 1.866 -0.794 re
+54.2 0.044 m
+58.628 -1.323 m
+58.458 -1.323 58.308 -1.301 58.172 -1.264 c
+58.044 -1.216 57.93 -1.147 57.834 -1.058 c
+57.745 -0.97 57.676 -0.864 57.628 -0.735 c
+57.576 -0.599 57.554 -0.449 57.554 -0.279 c
+57.554 -0.073 57.587 0.096 57.657 0.235 c
+57.724 0.382 57.819 0.492 57.936 0.573 c
+58.062 0.661 58.204 0.724 58.363 0.765 c
+58.528 0.802 58.705 0.827 58.892 0.838 c
+59.613 0.852 l
+59.613 1.029 l
+59.613 1.147 59.602 1.249 59.583 1.338 c
+59.561 1.426 59.528 1.492 59.48 1.544 c
+59.44 1.602 59.392 1.639 59.333 1.661 c
+59.274 1.679 59.208 1.691 59.142 1.691 c
+59.072 1.691 59.01 1.679 58.951 1.661 c
+58.9 1.65 58.852 1.625 58.804 1.588 c
+58.763 1.558 58.73 1.507 58.701 1.44 c
+58.679 1.382 58.664 1.301 58.657 1.205 c
+57.716 1.249 l
+57.745 1.396 57.79 1.532 57.849 1.661 c
+57.915 1.786 58.01 1.897 58.127 1.984 c
+58.245 2.08 58.385 2.153 58.554 2.205 c
+58.73 2.253 58.936 2.278 59.172 2.278 c
+59.613 2.278 59.943 2.168 60.171 1.955 c
+60.406 1.749 60.523 1.44 60.523 1.029 c
+60.523 -0.235 l
+60.523 -0.455 l
+60.531 -0.515 60.546 -0.569 60.568 -0.617 c
+60.586 -0.658 60.616 -0.69 60.656 -0.721 c
+60.693 -0.742 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.735 c
+61.009 -1.22 l
+60.95 -1.231 60.895 -1.242 60.847 -1.249 c
+60.807 -1.261 60.766 -1.268 60.729 -1.278 c
+60.689 -1.286 60.645 -1.294 60.597 -1.294 c
+60.546 -1.301 60.487 -1.309 60.421 -1.309 c
+60.193 -1.309 60.028 -1.257 59.921 -1.147 c
+59.811 -1.029 59.748 -0.864 59.73 -0.646 c
+59.715 -0.646 l
+59.646 -0.757 59.576 -0.852 59.509 -0.941 c
+59.44 -1.022 59.363 -1.087 59.274 -1.147 c
+59.186 -1.205 59.087 -1.249 58.981 -1.278 c
+58.881 -1.309 58.763 -1.323 58.628 -1.323 c
+59.613 0.353 m
+59.186 0.338 l
+59.087 0.338 58.995 0.331 58.907 0.324 c
+58.826 0.312 58.76 0.287 58.701 0.25 c
+58.642 0.21 58.591 0.151 58.554 0.073 c
+58.514 0.004 58.495 -0.088 58.495 -0.206 c
+58.495 -0.374 58.528 -0.496 58.598 -0.573 c
+58.664 -0.654 58.763 -0.69 58.892 -0.69 c
+58.998 -0.69 59.098 -0.669 59.186 -0.617 c
+59.282 -0.569 59.363 -0.507 59.421 -0.426 c
+59.488 -0.349 59.538 -0.261 59.569 -0.162 c
+59.598 -0.055 59.613 0.059 59.613 0.177 c
+h
+62.1 -2.631 m
+62.1 -2.014 l
+63.174 -2.014 l
+63.174 2.896 l
+62.1 2.896 l
+62.1 3.513 l
+64.026 3.513 l
+64.026 -2.631 l
+h
+f
+Q
+q 1 0 0 1 541.9542 230.2781 cm
+0 0 m
+2.103 0 l
+2.103 -0.574 l
+-0.675 -0.574 l
+-0.675 4.777 l
+0 4.777 l
+h
+3.514 -0.574 -0.647 3.984 re
+3.558 4.453 m
+3.558 4.343 3.528 4.251 3.469 4.174 c
+3.41 4.104 3.315 4.072 3.19 4.072 c
+3.073 4.072 2.977 4.104 2.911 4.174 c
+2.852 4.251 2.822 4.343 2.822 4.453 c
+2.822 4.571 2.852 4.663 2.911 4.733 c
+2.977 4.81 3.073 4.85 3.19 4.85 c
+3.315 4.85 3.41 4.81 3.469 4.733 c
+3.528 4.652 3.558 4.56 3.558 4.453 c
+6.468 0.44 m
+6.468 0.588 6.413 0.708 6.306 0.808 c
+6.196 0.903 5.991 1.021 5.689 1.161 c
+5.343 1.308 5.101 1.429 4.954 1.529 c
+4.807 1.635 4.697 1.753 4.63 1.881 c
+4.561 2.006 4.528 2.164 4.528 2.352 c
+4.528 2.675 4.645 2.943 4.881 3.16 c
+5.116 3.373 5.417 3.484 5.792 3.484 c
+6.174 3.484 6.483 3.37 6.718 3.145 c
+6.953 2.917 7.071 2.63 7.071 2.278 c
+6.423 2.278 l
+6.423 2.454 6.365 2.605 6.247 2.734 c
+6.13 2.859 5.976 2.925 5.792 2.925 c
+5.594 2.925 5.442 2.869 5.336 2.763 c
+5.226 2.664 5.174 2.532 5.174 2.366 c
+5.174 2.237 5.211 2.131 5.292 2.042 c
+5.369 1.961 5.561 1.859 5.866 1.734 c
+6.343 1.547 6.674 1.359 6.851 1.176 c
+7.026 0.999 7.115 0.771 7.115 0.5 c
+7.115 0.147 6.99 -0.133 6.747 -0.339 c
+6.512 -0.545 6.196 -0.647 5.806 -0.647 c
+5.384 -0.647 5.046 -0.53 4.792 -0.294 c
+4.535 -0.052 4.41 0.253 4.41 0.617 c
+5.056 0.617 l
+5.064 0.389 5.134 0.213 5.263 0.087 c
+5.388 -0.03 5.571 -0.088 5.806 -0.088 c
+6.02 -0.088 6.182 -0.04 6.292 0.058 c
+6.409 0.154 6.468 0.282 6.468 0.44 c
+8.805 4.365 m
+8.805 3.41 l
+9.407 3.41 l
+9.407 2.881 l
+8.805 2.881 l
+8.805 0.411 l
+8.805 0.253 8.827 0.135 8.879 0.058 c
+8.937 -0.023 9.025 -0.059 9.143 -0.059 c
+9.232 -0.059 9.32 -0.044 9.407 -0.015 c
+9.407 -0.574 l
+9.261 -0.622 9.106 -0.647 8.952 -0.647 c
+8.695 -0.647 8.5 -0.555 8.364 -0.368 c
+8.225 -0.184 8.158 0.077 8.158 0.411 c
+8.158 2.881 l
+7.556 2.881 l
+7.556 3.41 l
+8.158 3.41 l
+8.158 4.365 l
+h
+13.935 -0.574 m
+13.895 -0.485 13.869 -0.339 13.862 -0.133 c
+13.627 -0.478 13.332 -0.647 12.979 -0.647 c
+12.616 -0.647 12.333 -0.551 12.127 -0.353 c
+11.929 -0.148 11.833 0.139 11.833 0.514 c
+11.833 0.914 11.969 1.234 12.245 1.469 c
+12.517 1.712 12.891 1.837 13.361 1.837 c
+13.847 1.837 l
+13.847 2.263 l
+13.847 2.499 13.792 2.664 13.685 2.763 c
+13.575 2.869 13.413 2.925 13.201 2.925 c
+13.002 2.925 12.84 2.865 12.715 2.748 c
+12.597 2.63 12.538 2.484 12.538 2.308 c
+11.892 2.308 l
+11.892 2.502 11.95 2.693 12.068 2.881 c
+12.193 3.064 12.355 3.212 12.553 3.322 c
+12.759 3.428 12.987 3.484 13.244 3.484 c
+13.645 3.484 13.949 3.38 14.155 3.175 c
+14.369 2.969 14.483 2.675 14.494 2.293 c
+14.494 0.278 l
+14.494 -0.026 14.531 -0.291 14.612 -0.515 c
+14.612 -0.574 l
+h
+13.068 -0.059 m
+13.233 -0.059 13.384 -0.015 13.523 0.073 c
+13.671 0.161 13.777 0.272 13.847 0.411 c
+13.847 1.352 l
+13.479 1.352 l
+13.164 1.352 12.921 1.282 12.744 1.146 c
+12.568 1.018 12.48 0.83 12.48 0.588 c
+12.48 0.359 12.524 0.195 12.613 0.087 c
+12.7 -0.011 12.851 -0.059 13.068 -0.059 c
+16.199 -0.574 -0.646 5.644 re
+17.918 -0.574 -0.646 5.644 re
+21.358 -0.574 -0.646 5.644 re
+22.24 1.602 m
+22.24 2.179 22.376 2.634 22.651 2.969 c
+22.934 3.31 23.306 3.484 23.769 3.484 c
+24.228 3.484 24.596 3.314 24.871 2.983 c
+25.154 2.66 25.301 2.212 25.312 1.646 c
+25.312 1.219 l
+25.312 0.65 25.169 0.195 24.885 -0.148 c
+24.611 -0.482 24.243 -0.647 23.784 -0.647 c
+23.32 -0.647 22.949 -0.485 22.666 -0.162 c
+22.391 0.168 22.248 0.61 22.24 1.161 c
+h
+22.886 1.219 m
+22.886 0.816 22.964 0.5 23.122 0.264 c
+23.287 0.029 23.508 -0.088 23.784 -0.088 c
+24.349 -0.088 24.644 0.323 24.665 1.146 c
+24.665 1.602 l
+24.665 2.002 24.581 2.322 24.415 2.557 c
+24.257 2.8 24.041 2.925 23.769 2.925 c
+23.504 2.925 23.287 2.8 23.122 2.557 c
+22.964 2.322 22.886 2.002 22.886 1.602 c
+h
+27.532 -0.088 m
+27.745 -0.088 27.917 -0.026 28.046 0.103 c
+28.182 0.238 28.255 0.43 28.266 0.675 c
+28.884 0.675 l
+28.862 0.294 28.726 -0.026 28.472 -0.279 c
+28.216 -0.526 27.903 -0.647 27.532 -0.647 c
+27.04 -0.647 26.664 -0.497 26.4 -0.192 c
+26.142 0.12 26.018 0.588 26.018 1.205 c
+26.018 1.646 l
+26.018 2.241 26.142 2.697 26.4 3.013 c
+26.664 3.326 27.04 3.484 27.532 3.484 c
+27.932 3.484 28.252 3.351 28.487 3.087 c
+28.729 2.829 28.862 2.484 28.884 2.042 c
+28.266 2.042 l
+28.245 2.337 28.171 2.557 28.046 2.705 c
+27.929 2.851 27.756 2.925 27.532 2.925 c
+27.237 2.925 27.021 2.825 26.884 2.63 c
+26.745 2.443 26.672 2.135 26.664 1.705 c
+26.664 1.19 l
+26.664 0.72 26.73 0.386 26.87 0.191 c
+27.017 0.003 27.237 -0.088 27.532 -0.088 c
+31.677 -0.574 m
+31.636 -0.485 31.611 -0.339 31.603 -0.133 c
+31.368 -0.478 31.075 -0.647 30.722 -0.647 c
+30.358 -0.647 30.075 -0.551 29.868 -0.353 c
+29.67 -0.148 29.575 0.139 29.575 0.514 c
+29.575 0.914 29.71 1.234 29.986 1.469 c
+30.258 1.712 30.633 1.837 31.104 1.837 c
+31.588 1.837 l
+31.588 2.263 l
+31.588 2.499 31.534 2.664 31.427 2.763 c
+31.316 2.869 31.155 2.925 30.942 2.925 c
+30.743 2.925 30.582 2.865 30.456 2.748 c
+30.339 2.63 30.281 2.484 30.281 2.308 c
+29.633 2.308 l
+29.633 2.502 29.693 2.693 29.81 2.881 c
+29.935 3.064 30.097 3.212 30.295 3.322 c
+30.501 3.428 30.728 3.484 30.986 3.484 c
+31.387 3.484 31.692 3.38 31.898 3.175 c
+32.11 2.969 32.224 2.675 32.235 2.293 c
+32.235 0.278 l
+32.235 -0.026 32.272 -0.291 32.353 -0.515 c
+32.353 -0.574 l
+h
+30.809 -0.059 m
+30.975 -0.059 31.125 -0.015 31.266 0.073 c
+31.412 0.161 31.519 0.272 31.588 0.411 c
+31.588 1.352 l
+31.221 1.352 l
+30.905 1.352 30.662 1.282 30.487 1.146 c
+30.31 1.018 30.221 0.83 30.221 0.588 c
+30.221 0.359 30.265 0.195 30.354 0.087 c
+30.442 -0.011 30.593 -0.059 30.809 -0.059 c
+33.94 -0.574 -0.646 5.644 re
+39.555 1.219 m
+39.555 0.602 39.441 0.135 39.218 -0.177 c
+39 -0.493 38.678 -0.647 38.248 -0.647 c
+37.824 -0.647 37.512 -0.468 37.307 -0.103 c
+37.277 -0.574 l
+36.675 -0.574 l
+36.675 5.071 l
+37.321 5.071 l
+37.321 2.969 l
+37.535 3.31 37.843 3.484 38.248 3.484 c
+38.678 3.484 39 3.326 39.218 3.013 c
+39.441 2.707 39.555 2.241 39.555 1.616 c
+h
+38.909 1.602 m
+38.909 2.072 38.838 2.403 38.703 2.601 c
+38.574 2.796 38.365 2.896 38.071 2.896 c
+37.737 2.896 37.487 2.711 37.321 2.352 c
+37.321 0.47 l
+37.487 0.106 37.741 -0.074 38.086 -0.074 c
+38.379 -0.074 38.589 0.029 38.718 0.235 c
+38.842 0.44 38.909 0.756 38.909 1.19 c
+h
+42.04 2.792 m
+41.951 2.811 41.853 2.822 41.745 2.822 c
+41.411 2.822 41.176 2.638 41.04 2.278 c
+41.04 -0.574 l
+40.393 -0.574 l
+40.393 3.41 l
+41.026 3.41 l
+41.04 2.998 l
+41.217 3.322 41.459 3.484 41.775 3.484 c
+41.882 3.484 41.97 3.461 42.04 3.424 c
+h
+44.583 -0.574 m
+44.542 -0.485 44.517 -0.339 44.509 -0.133 c
+44.274 -0.478 43.98 -0.647 43.627 -0.647 c
+43.264 -0.647 42.981 -0.551 42.774 -0.353 c
+42.576 -0.148 42.481 0.139 42.481 0.514 c
+42.481 0.914 42.616 1.234 42.892 1.469 c
+43.164 1.712 43.539 1.837 44.01 1.837 c
+44.494 1.837 l
+44.494 2.263 l
+44.494 2.499 44.44 2.664 44.332 2.763 c
+44.222 2.869 44.06 2.925 43.848 2.925 c
+43.649 2.925 43.488 2.865 43.362 2.748 c
+43.245 2.63 43.187 2.484 43.187 2.308 c
+42.539 2.308 l
+42.539 2.502 42.599 2.693 42.716 2.881 c
+42.84 3.064 43.002 3.212 43.201 3.322 c
+43.407 3.428 43.634 3.484 43.892 3.484 c
+44.292 3.484 44.598 3.38 44.803 3.175 c
+45.016 2.969 45.13 2.675 45.141 2.293 c
+45.141 0.278 l
+45.141 -0.026 45.178 -0.291 45.259 -0.515 c
+45.259 -0.574 l
+h
+43.715 -0.059 m
+43.881 -0.059 44.031 -0.015 44.171 0.073 c
+44.318 0.161 44.425 0.272 44.494 0.411 c
+44.494 1.352 l
+44.127 1.352 l
+43.811 1.352 43.569 1.282 43.392 1.146 c
+43.216 1.018 43.127 0.83 43.127 0.588 c
+43.127 0.359 43.172 0.195 43.26 0.087 c
+43.347 -0.011 43.499 -0.059 43.715 -0.059 c
+46.758 3.41 m
+46.773 2.969 l
+47.027 3.31 47.349 3.484 47.743 3.484 c
+48.448 3.484 48.805 3.013 48.816 2.072 c
+48.816 -0.574 l
+48.169 -0.574 l
+48.169 2.042 l
+48.169 2.355 48.114 2.576 48.008 2.705 c
+47.897 2.829 47.743 2.896 47.537 2.896 c
+47.379 2.896 47.232 2.84 47.096 2.734 c
+46.967 2.624 46.865 2.487 46.788 2.322 c
+46.788 -0.574 l
+46.14 -0.574 l
+46.14 3.41 l
+h
+51.168 -0.088 m
+51.381 -0.088 51.553 -0.026 51.682 0.103 c
+51.818 0.238 51.892 0.43 51.902 0.675 c
+52.52 0.675 l
+52.498 0.294 52.362 -0.026 52.109 -0.279 c
+51.852 -0.526 51.538 -0.647 51.168 -0.647 c
+50.676 -0.647 50.3 -0.497 50.036 -0.192 c
+49.778 0.12 49.654 0.588 49.654 1.205 c
+49.654 1.646 l
+49.654 2.241 49.778 2.697 50.036 3.013 c
+50.3 3.326 50.676 3.484 51.168 3.484 c
+51.569 3.484 51.888 3.351 52.124 3.087 c
+52.365 2.829 52.498 2.484 52.52 2.042 c
+51.902 2.042 l
+51.881 2.337 51.807 2.557 51.682 2.705 c
+51.565 2.851 51.392 2.925 51.168 2.925 c
+50.873 2.925 50.657 2.825 50.521 2.63 c
+50.381 2.443 50.308 2.135 50.3 1.705 c
+50.3 1.19 l
+50.3 0.72 50.366 0.386 50.506 0.191 c
+50.653 0.003 50.873 -0.088 51.168 -0.088 c
+53.917 2.998 m
+54.17 3.322 54.49 3.484 54.871 3.484 c
+55.577 3.484 55.934 3.013 55.945 2.072 c
+55.945 -0.574 l
+55.299 -0.574 l
+55.299 2.042 l
+55.299 2.355 55.243 2.576 55.137 2.705 c
+55.027 2.829 54.871 2.896 54.666 2.896 c
+54.508 2.896 54.361 2.84 54.225 2.734 c
+54.096 2.624 53.994 2.487 53.917 2.322 c
+53.917 -0.574 l
+53.269 -0.574 l
+53.269 5.071 l
+53.917 5.071 l
+h
+58.326 -0.647 m
+57.826 -0.647 57.444 -0.5 57.18 -0.206 c
+56.915 0.087 56.783 0.521 56.783 1.102 c
+56.783 1.572 l
+56.783 2.167 56.908 2.634 57.165 2.969 c
+57.429 3.31 57.79 3.484 58.252 3.484 c
+58.713 3.484 59.054 3.329 59.282 3.027 c
+59.517 2.734 59.638 2.271 59.65 1.646 c
+59.65 1.219 l
+57.429 1.219 l
+57.429 1.132 l
+57.429 0.698 57.506 0.386 57.664 0.191 c
+57.83 0.003 58.062 -0.088 58.356 -0.088 c
+58.551 -0.088 58.723 -0.056 58.87 0.014 c
+59.017 0.091 59.153 0.209 59.282 0.367 c
+59.619 -0.044 l
+59.333 -0.449 58.904 -0.647 58.326 -0.647 c
+58.252 2.925 m
+57.977 2.925 57.775 2.829 57.65 2.645 c
+57.522 2.458 57.448 2.167 57.429 1.778 c
+59.002 1.778 l
+59.002 1.866 l
+58.981 2.248 58.914 2.516 58.796 2.675 c
+58.679 2.84 58.495 2.925 58.252 2.925 c
+62.368 0.44 m
+62.368 0.588 62.314 0.708 62.206 0.808 c
+62.096 0.903 61.89 1.021 61.589 1.161 c
+61.244 1.308 61.001 1.429 60.855 1.529 c
+60.708 1.635 60.597 1.753 60.531 1.881 c
+60.461 2.006 60.428 2.164 60.428 2.352 c
+60.428 2.675 60.546 2.943 60.781 3.16 c
+61.016 3.373 61.317 3.484 61.692 3.484 c
+62.075 3.484 62.383 3.37 62.618 3.145 c
+62.854 2.917 62.971 2.63 62.971 2.278 c
+62.324 2.278 l
+62.324 2.454 62.266 2.605 62.148 2.734 c
+62.031 2.859 61.876 2.925 61.692 2.925 c
+61.494 2.925 61.343 2.869 61.237 2.763 c
+61.126 2.664 61.075 2.532 61.075 2.366 c
+61.075 2.237 61.111 2.131 61.192 2.042 c
+61.269 1.961 61.46 1.859 61.766 1.734 c
+62.243 1.547 62.574 1.359 62.75 1.176 c
+62.927 0.999 63.016 0.771 63.016 0.5 c
+63.016 0.147 62.89 -0.133 62.648 -0.339 c
+62.412 -0.545 62.096 -0.647 61.707 -0.647 c
+61.284 -0.647 60.946 -0.53 60.693 -0.294 c
+60.436 -0.052 60.311 0.253 60.311 0.617 c
+60.957 0.617 l
+60.965 0.389 61.034 0.213 61.163 0.087 c
+61.288 -0.03 61.472 -0.088 61.707 -0.088 c
+61.92 -0.088 62.082 -0.04 62.192 0.058 c
+62.31 0.154 62.368 0.282 62.368 0.44 c
+66.278 -0.574 -0.646 3.984 re
+66.322 4.453 m
+66.322 4.343 66.293 4.251 66.235 4.174 c
+66.175 4.104 66.08 4.072 65.955 4.072 c
+65.838 4.072 65.742 4.104 65.676 4.174 c
+65.617 4.251 65.587 4.343 65.587 4.453 c
+65.587 4.571 65.617 4.663 65.676 4.733 c
+65.742 4.81 65.838 4.85 65.955 4.85 c
+66.08 4.85 66.175 4.81 66.235 4.733 c
+66.293 4.652 66.322 4.56 66.322 4.453 c
+67.91 3.41 m
+67.924 2.969 l
+68.178 3.31 68.502 3.484 68.895 3.484 c
+69.601 3.484 69.957 3.013 69.967 2.072 c
+69.967 -0.574 l
+69.321 -0.574 l
+69.321 2.042 l
+69.321 2.355 69.266 2.576 69.159 2.705 c
+69.049 2.829 68.895 2.896 68.689 2.896 c
+68.531 2.896 68.384 2.84 68.248 2.734 c
+68.12 2.624 68.016 2.487 67.939 2.322 c
+67.939 -0.574 l
+67.293 -0.574 l
+67.293 3.41 l
+h
+74.304 2.792 m
+74.216 2.811 74.116 2.822 74.01 2.822 c
+73.676 2.822 73.441 2.638 73.304 2.278 c
+73.304 -0.574 l
+72.658 -0.574 l
+72.658 3.41 l
+73.29 3.41 l
+73.304 2.998 l
+73.481 3.322 73.724 3.484 74.039 3.484 c
+74.146 3.484 74.235 3.461 74.304 3.424 c
+h
+76.303 -0.647 m
+75.803 -0.647 75.421 -0.5 75.157 -0.206 c
+74.892 0.087 74.76 0.521 74.76 1.102 c
+74.76 1.572 l
+74.76 2.167 74.885 2.634 75.142 2.969 c
+75.407 3.31 75.766 3.484 76.23 3.484 c
+76.689 3.484 77.031 3.329 77.258 3.027 c
+77.493 2.734 77.615 2.271 77.626 1.646 c
+77.626 1.219 l
+75.407 1.219 l
+75.407 1.132 l
+75.407 0.698 75.484 0.386 75.642 0.191 c
+75.807 0.003 76.038 -0.088 76.333 -0.088 c
+76.527 -0.088 76.7 -0.056 76.847 0.014 c
+76.994 0.091 77.13 0.209 77.258 0.367 c
+77.597 -0.044 l
+77.31 -0.449 76.88 -0.647 76.303 -0.647 c
+76.23 2.925 m
+75.954 2.925 75.752 2.829 75.627 2.645 c
+75.498 2.458 75.425 2.167 75.407 1.778 c
+76.979 1.778 l
+76.979 1.866 l
+76.957 2.248 76.891 2.516 76.774 2.675 c
+76.656 2.84 76.472 2.925 76.23 2.925 c
+81.286 1.219 m
+81.286 0.591 81.169 0.12 80.934 -0.192 c
+80.705 -0.497 80.389 -0.647 79.978 -0.647 c
+79.573 -0.647 79.265 -0.497 79.052 -0.192 c
+79.052 -2.103 l
+78.405 -2.103 l
+78.405 3.41 l
+78.993 3.41 l
+79.037 2.969 l
+79.251 3.31 79.559 3.484 79.963 3.484 c
+80.404 3.484 80.731 3.329 80.948 3.027 c
+81.161 2.722 81.275 2.267 81.286 1.66 c
+h
+80.639 1.602 m
+80.639 2.042 80.57 2.366 80.433 2.572 c
+80.294 2.785 80.074 2.896 79.772 2.896 c
+79.456 2.896 79.217 2.741 79.052 2.439 c
+79.052 0.367 l
+79.217 0.062 79.456 -0.088 79.772 -0.088 c
+80.066 -0.088 80.279 0.014 80.419 0.22 c
+80.555 0.433 80.628 0.764 80.639 1.205 c
+h
+81.992 1.602 m
+81.992 2.179 82.128 2.634 82.403 2.969 c
+82.686 3.31 83.057 3.484 83.521 3.484 c
+83.98 3.484 84.348 3.314 84.622 2.983 c
+84.906 2.66 85.053 2.212 85.064 1.646 c
+85.064 1.219 l
+85.064 0.65 84.921 0.195 84.637 -0.148 c
+84.362 -0.482 83.994 -0.647 83.535 -0.647 c
+83.072 -0.647 82.701 -0.485 82.418 -0.162 c
+82.143 0.168 81.999 0.61 81.992 1.161 c
+h
+82.638 1.219 m
+82.638 0.816 82.715 0.5 82.873 0.264 c
+83.039 0.029 83.259 -0.088 83.535 -0.088 c
+84.101 -0.088 84.395 0.323 84.417 1.146 c
+84.417 1.602 l
+84.417 2.002 84.333 2.322 84.167 2.557 c
+84.009 2.8 83.793 2.925 83.521 2.925 c
+83.255 2.925 83.039 2.8 82.873 2.557 c
+82.715 2.322 82.638 2.002 82.638 1.602 c
+h
+87.842 0.44 m
+87.842 0.588 87.787 0.708 87.68 0.808 c
+87.57 0.903 87.365 1.021 87.063 1.161 c
+86.717 1.308 86.475 1.429 86.328 1.529 c
+86.181 1.635 86.071 1.753 86.004 1.881 c
+85.935 2.006 85.902 2.164 85.902 2.352 c
+85.902 2.675 86.019 2.943 86.255 3.16 c
+86.49 3.373 86.791 3.484 87.166 3.484 c
+87.548 3.484 87.857 3.37 88.092 3.145 c
+88.327 2.917 88.445 2.63 88.445 2.278 c
+87.797 2.278 l
+87.797 2.454 87.739 2.605 87.621 2.734 c
+87.504 2.859 87.35 2.925 87.166 2.925 c
+86.968 2.925 86.816 2.869 86.71 2.763 c
+86.6 2.664 86.548 2.532 86.548 2.366 c
+86.548 2.237 86.585 2.131 86.666 2.042 c
+86.743 1.961 86.935 1.859 87.24 1.734 c
+87.717 1.547 88.048 1.359 88.224 1.176 c
+88.4 0.999 88.489 0.771 88.489 0.5 c
+88.489 0.147 88.364 -0.133 88.121 -0.339 c
+87.886 -0.545 87.57 -0.647 87.18 -0.647 c
+86.758 -0.647 86.42 -0.53 86.166 -0.294 c
+85.909 -0.052 85.784 0.253 85.784 0.617 c
+86.43 0.617 l
+86.438 0.389 86.508 0.213 86.636 0.087 c
+86.762 -0.03 86.945 -0.088 87.18 -0.088 c
+87.394 -0.088 87.556 -0.04 87.666 0.058 c
+87.783 0.154 87.842 0.282 87.842 0.44 c
+90.032 -0.574 -0.646 3.984 re
+90.076 4.453 m
+90.076 4.343 90.047 4.251 89.988 4.174 c
+89.929 4.104 89.834 4.072 89.709 4.072 c
+89.591 4.072 89.495 4.104 89.43 4.174 c
+89.37 4.251 89.341 4.343 89.341 4.453 c
+89.341 4.571 89.37 4.663 89.43 4.733 c
+89.495 4.81 89.591 4.85 89.709 4.85 c
+89.834 4.85 89.929 4.81 89.988 4.733 c
+90.047 4.652 90.076 4.56 90.076 4.453 c
+91.899 4.365 m
+91.899 3.41 l
+92.501 3.41 l
+92.501 2.881 l
+91.899 2.881 l
+91.899 0.411 l
+91.899 0.253 91.921 0.135 91.972 0.058 c
+92.031 -0.023 92.119 -0.059 92.237 -0.059 c
+92.325 -0.059 92.414 -0.044 92.501 -0.015 c
+92.501 -0.574 l
+92.354 -0.622 92.2 -0.647 92.046 -0.647 c
+91.789 -0.647 91.594 -0.555 91.458 -0.368 c
+91.319 -0.184 91.252 0.077 91.252 0.411 c
+91.252 2.881 l
+90.65 2.881 l
+90.65 3.41 l
+91.252 3.41 l
+91.252 4.365 l
+h
+93.06 1.602 m
+93.06 2.179 93.196 2.634 93.472 2.969 c
+93.755 3.31 94.126 3.484 94.589 3.484 c
+95.048 3.484 95.415 3.314 95.691 2.983 c
+95.974 2.66 96.121 2.212 96.132 1.646 c
+96.132 1.219 l
+96.132 0.65 95.988 0.195 95.706 -0.148 c
+95.43 -0.482 95.063 -0.647 94.604 -0.647 c
+94.141 -0.647 93.769 -0.485 93.486 -0.162 c
+93.21 0.168 93.067 0.61 93.06 1.161 c
+h
+93.707 1.219 m
+93.707 0.816 93.784 0.5 93.942 0.264 c
+94.107 0.029 94.328 -0.088 94.604 -0.088 c
+95.169 -0.088 95.463 0.323 95.485 1.146 c
+95.485 1.602 l
+95.485 2.002 95.401 2.322 95.236 2.557 c
+95.078 2.8 94.86 2.925 94.589 2.925 c
+94.324 2.925 94.107 2.8 93.942 2.557 c
+93.784 2.322 93.707 2.002 93.707 1.602 c
+h
+98.616 2.792 m
+98.528 2.811 98.429 2.822 98.322 2.822 c
+97.988 2.822 97.753 2.638 97.617 2.278 c
+97.617 -0.574 l
+96.97 -0.574 l
+96.97 3.41 l
+97.602 3.41 l
+97.617 2.998 l
+97.793 3.322 98.035 3.484 98.352 3.484 c
+98.459 3.484 98.546 3.461 98.616 3.424 c
+h
+100.424 0.514 m
+101.145 3.41 l
+101.835 3.41 l
+100.542 -1.133 l
+100.443 -1.474 100.3 -1.735 100.115 -1.912 c
+99.94 -2.087 99.737 -2.176 99.513 -2.176 c
+99.425 -2.176 99.311 -2.154 99.175 -2.117 c
+99.175 -1.573 l
+99.321 -1.588 l
+99.506 -1.588 99.653 -1.544 99.763 -1.455 c
+99.87 -1.368 99.957 -1.21 100.027 -0.985 c
+100.145 -0.545 l
+98.984 3.41 l
+99.689 3.41 l
+h
+102.114 -0.221 m
+102.114 -0.103 102.147 -0.008 102.218 0.073 c
+102.284 0.151 102.386 0.191 102.527 0.191 c
+102.673 0.191 102.78 0.151 102.849 0.073 c
+102.927 -0.008 102.967 -0.103 102.967 -0.221 c
+102.967 -0.331 102.927 -0.423 102.849 -0.5 c
+102.78 -0.578 102.673 -0.618 102.527 -0.618 c
+102.386 -0.618 102.284 -0.578 102.218 -0.5 c
+102.147 -0.423 102.114 -0.331 102.114 -0.221 c
+106.892 1.117 m
+106.965 0.514 l
+107.068 1.043 l
+107.921 4.777 l
+108.48 4.777 l
+109.317 1.043 l
+109.42 0.5 l
+109.494 1.117 l
+110.155 4.777 l
+110.831 4.777 l
+109.758 -0.574 l
+109.156 -0.574 l
+108.258 3.322 l
+108.2 3.645 l
+108.156 3.322 l
+107.23 -0.574 l
+106.612 -0.574 l
+105.554 4.777 l
+106.23 4.777 l
+h
+112.213 -0.574 -0.647 3.984 re
+112.257 4.453 m
+112.257 4.343 112.227 4.251 112.169 4.174 c
+112.11 4.104 112.015 4.072 111.89 4.072 c
+111.772 4.072 111.676 4.104 111.61 4.174 c
+111.551 4.251 111.522 4.343 111.522 4.453 c
+111.522 4.571 111.551 4.663 111.61 4.733 c
+111.676 4.81 111.772 4.85 111.89 4.85 c
+112.015 4.85 112.11 4.81 112.169 4.733 c
+112.227 4.652 112.257 4.56 112.257 4.453 c
+114.08 4.365 m
+114.08 3.41 l
+114.683 3.41 l
+114.683 2.881 l
+114.08 2.881 l
+114.08 0.411 l
+114.08 0.253 114.101 0.135 114.153 0.058 c
+114.212 -0.023 114.3 -0.059 114.417 -0.059 c
+114.506 -0.059 114.594 -0.044 114.683 -0.015 c
+114.683 -0.574 l
+114.535 -0.622 114.381 -0.647 114.226 -0.647 c
+113.97 -0.647 113.775 -0.555 113.638 -0.368 c
+113.499 -0.184 113.432 0.077 113.432 0.411 c
+113.432 2.881 l
+112.83 2.881 l
+112.83 3.41 l
+113.432 3.41 l
+113.432 4.365 l
+h
+116.094 2.998 m
+116.347 3.322 116.667 3.484 117.049 3.484 c
+117.754 3.484 118.111 3.013 118.122 2.072 c
+118.122 -0.574 l
+117.475 -0.574 l
+117.475 2.042 l
+117.475 2.355 117.42 2.576 117.313 2.705 c
+117.203 2.829 117.049 2.896 116.843 2.896 c
+116.685 2.896 116.538 2.84 116.402 2.734 c
+116.274 2.624 116.171 2.487 116.094 2.322 c
+116.094 -0.574 l
+115.447 -0.574 l
+115.447 5.071 l
+116.094 5.071 l
+h
+f
+Q
+664.516 231.572 -1.794 0.866 re
+667.264 229.704 m
+667.234 229.764 667.205 229.866 667.176 230.013 c
+666.989 229.756 666.739 229.631 666.426 229.631 c
+666.091 229.631 665.813 229.737 665.588 229.955 c
+665.372 230.178 665.264 230.469 665.264 230.822 c
+665.264 231.233 665.397 231.549 665.661 231.777 c
+665.927 232.012 666.309 232.13 666.808 232.13 c
+667.132 232.13 l
+667.132 232.453 l
+667.132 232.63 667.095 232.75 667.028 232.821 c
+666.97 232.898 666.882 232.939 666.764 232.939 c
+666.507 232.939 666.382 232.784 666.382 232.482 c
+665.339 232.482 l
+665.339 232.854 665.474 233.159 665.75 233.394 c
+666.022 233.637 666.371 233.762 666.793 233.762 c
+667.234 233.762 667.573 233.644 667.808 233.409 c
+668.05 233.18 668.175 232.858 668.175 232.438 c
+668.175 230.572 l
+668.175 230.226 668.223 229.958 668.322 229.764 c
+668.322 229.704 l
+h
+666.661 230.454 m
+666.768 230.454 666.86 230.473 666.941 230.513 c
+667.028 230.56 667.091 230.62 667.132 230.689 c
+667.132 231.512 l
+666.882 231.512 l
+666.706 231.512 666.562 231.454 666.455 231.336 c
+666.357 231.225 666.309 231.079 666.309 230.895 c
+666.309 230.601 666.426 230.454 666.661 230.454 c
+f
+q 1 0 0 1 669.0717 230.0571 cm
+0 0 m
+0 0.118 0.034 0.214 0.104 0.294 c
+0.169 0.372 0.272 0.412 0.412 0.412 c
+0.559 0.412 0.665 0.372 0.736 0.294 c
+0.813 0.214 0.853 0.118 0.853 0 c
+0.853 -0.11 0.813 -0.202 0.736 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.104 -0.279 c
+0.034 -0.202 0 -0.11 0 0 c
+0 2.822 m
+0 2.94 0.034 3.036 0.104 3.117 c
+0.169 3.194 0.272 3.234 0.412 3.234 c
+0.559 3.234 0.665 3.194 0.736 3.117 c
+0.813 3.036 0.853 2.94 0.853 2.822 c
+0.853 2.712 0.813 2.62 0.736 2.543 c
+0.665 2.462 0.559 2.425 0.412 2.425 c
+0.272 2.425 0.169 2.462 0.104 2.543 c
+0.034 2.62 0 2.712 0 2.822 c
+5.38 0.661 m
+5.38 0.809 5.325 0.929 5.218 1.029 c
+5.108 1.124 4.902 1.242 4.601 1.382 c
+4.256 1.529 4.013 1.65 3.866 1.75 c
+3.719 1.856 3.609 1.974 3.543 2.103 c
+3.473 2.227 3.44 2.385 3.44 2.573 c
+3.44 2.896 3.558 3.164 3.793 3.381 c
+4.028 3.594 4.329 3.705 4.704 3.705 c
+5.087 3.705 5.395 3.591 5.63 3.366 c
+5.866 3.138 5.983 2.851 5.983 2.499 c
+5.336 2.499 l
+5.336 2.675 5.278 2.826 5.16 2.955 c
+5.042 3.08 4.888 3.146 4.704 3.146 c
+4.505 3.146 4.355 3.09 4.248 2.984 c
+4.138 2.885 4.087 2.753 4.087 2.587 c
+4.087 2.458 4.123 2.352 4.204 2.263 c
+4.281 2.183 4.472 2.08 4.777 1.955 c
+5.255 1.768 5.586 1.58 5.762 1.397 c
+5.939 1.22 6.027 0.992 6.027 0.721 c
+6.027 0.368 5.902 0.088 5.66 -0.118 c
+5.424 -0.324 5.108 -0.426 4.719 -0.426 c
+4.296 -0.426 3.958 -0.309 3.705 -0.073 c
+3.447 0.169 3.323 0.474 3.323 0.838 c
+3.969 0.838 l
+3.977 0.611 4.046 0.434 4.175 0.309 c
+4.3 0.191 4.484 0.133 4.719 0.133 c
+4.932 0.133 5.093 0.181 5.204 0.279 c
+5.322 0.375 5.38 0.503 5.38 0.661 c
+7.512 3.219 m
+7.765 3.543 8.085 3.705 8.467 3.705 c
+9.172 3.705 9.529 3.234 9.54 2.294 c
+9.54 -0.353 l
+8.893 -0.353 l
+8.893 2.263 l
+8.893 2.576 8.838 2.797 8.732 2.926 c
+8.621 3.05 8.467 3.117 8.262 3.117 c
+8.104 3.117 7.956 3.061 7.82 2.955 c
+7.691 2.845 7.589 2.708 7.512 2.543 c
+7.512 -0.353 l
+6.865 -0.353 l
+6.865 5.292 l
+7.512 5.292 l
+h
+10.363 1.823 m
+10.363 2.4 10.499 2.855 10.774 3.19 c
+11.057 3.532 11.429 3.705 11.892 3.705 c
+12.351 3.705 12.719 3.535 12.994 3.204 c
+13.278 2.881 13.424 2.433 13.436 1.867 c
+13.436 1.44 l
+13.436 0.871 13.292 0.416 13.009 0.073 c
+12.734 -0.261 12.366 -0.426 11.907 -0.426 c
+11.443 -0.426 11.073 -0.264 10.789 0.059 c
+10.514 0.389 10.371 0.831 10.363 1.382 c
+h
+11.009 1.44 m
+11.009 1.037 11.088 0.721 11.245 0.485 c
+11.41 0.25 11.631 0.133 11.907 0.133 c
+12.472 0.133 12.767 0.544 12.788 1.367 c
+12.788 1.823 l
+12.788 2.223 12.704 2.543 12.538 2.778 c
+12.38 3.021 12.164 3.146 11.892 3.146 c
+11.628 3.146 11.41 3.021 11.245 2.778 c
+11.088 2.543 11.009 2.223 11.009 1.823 c
+h
+17.242 0.794 m
+17.845 3.631 l
+18.492 3.631 l
+17.507 -0.353 l
+16.993 -0.353 l
+16.214 2.499 l
+15.464 -0.353 l
+14.934 -0.353 l
+13.979 3.631 l
+14.612 3.631 l
+15.229 0.867 l
+15.963 3.631 l
+16.478 3.631 l
+h
+22.93 -0.353 m
+22.89 -0.264 22.865 -0.118 22.857 0.088 c
+22.622 -0.257 22.328 -0.426 21.976 -0.426 c
+21.612 -0.426 21.328 -0.33 21.122 -0.132 c
+20.925 0.073 20.829 0.36 20.829 0.735 c
+20.829 1.135 20.965 1.455 21.24 1.691 c
+21.513 1.933 21.887 2.058 22.358 2.058 c
+22.843 2.058 l
+22.843 2.484 l
+22.843 2.72 22.788 2.885 22.681 2.984 c
+22.571 3.09 22.409 3.146 22.196 3.146 c
+21.997 3.146 21.836 3.087 21.71 2.969 c
+21.593 2.851 21.534 2.705 21.534 2.529 c
+20.887 2.529 l
+20.887 2.723 20.947 2.914 21.064 3.102 c
+21.189 3.285 21.351 3.433 21.55 3.543 c
+21.755 3.649 21.983 3.705 22.24 3.705 c
+22.641 3.705 22.946 3.601 23.152 3.396 c
+23.364 3.19 23.478 2.896 23.489 2.514 c
+23.489 0.5 l
+23.489 0.195 23.526 -0.07 23.607 -0.294 c
+23.607 -0.353 l
+h
+22.063 0.162 m
+22.229 0.162 22.379 0.206 22.519 0.294 c
+22.666 0.382 22.772 0.493 22.843 0.632 c
+22.843 1.573 l
+22.475 1.573 l
+22.159 1.573 21.916 1.503 21.741 1.367 c
+21.564 1.239 21.475 1.051 21.475 0.809 c
+21.475 0.58 21.519 0.416 21.608 0.309 c
+21.696 0.21 21.847 0.162 22.063 0.162 c
+25.195 -0.353 -0.647 5.644 re
+26.915 -0.353 -0.647 5.644 re
+32.529 1.44 m
+32.529 0.823 32.415 0.357 32.191 0.044 c
+31.975 -0.272 31.651 -0.426 31.221 -0.426 c
+30.799 -0.426 30.487 -0.246 30.281 0.118 c
+30.251 -0.353 l
+29.648 -0.353 l
+29.648 5.292 l
+30.295 5.292 l
+30.295 3.19 l
+30.508 3.532 30.817 3.705 31.221 3.705 c
+31.651 3.705 31.975 3.547 32.191 3.234 c
+32.415 2.929 32.529 2.462 32.529 1.837 c
+h
+31.883 1.823 m
+31.883 2.294 31.813 2.624 31.677 2.822 c
+31.549 3.017 31.339 3.117 31.044 3.117 c
+30.71 3.117 30.46 2.932 30.295 2.573 c
+30.295 0.691 l
+30.46 0.327 30.714 0.147 31.06 0.147 c
+31.353 0.147 31.563 0.25 31.692 0.456 c
+31.817 0.661 31.883 0.977 31.883 1.411 c
+h
+35.013 3.013 m
+34.925 3.032 34.826 3.043 34.72 3.043 c
+34.385 3.043 34.15 2.859 34.014 2.499 c
+34.014 -0.353 l
+33.367 -0.353 l
+33.367 3.631 l
+33.999 3.631 l
+34.014 3.219 l
+34.19 3.543 34.433 3.705 34.749 3.705 c
+34.855 3.705 34.944 3.682 35.013 3.645 c
+h
+37.556 -0.353 m
+37.516 -0.264 37.49 -0.118 37.483 0.088 c
+37.248 -0.257 36.954 -0.426 36.601 -0.426 c
+36.237 -0.426 35.954 -0.33 35.748 -0.132 c
+35.55 0.073 35.455 0.36 35.455 0.735 c
+35.455 1.135 35.59 1.455 35.866 1.691 c
+36.138 1.933 36.513 2.058 36.983 2.058 c
+37.468 2.058 l
+37.468 2.484 l
+37.468 2.72 37.413 2.885 37.307 2.984 c
+37.196 3.09 37.035 3.146 36.822 3.146 c
+36.623 3.146 36.461 3.087 36.336 2.969 c
+36.218 2.851 36.16 2.705 36.16 2.529 c
+35.513 2.529 l
+35.513 2.723 35.572 2.914 35.69 3.102 c
+35.815 3.285 35.977 3.433 36.174 3.543 c
+36.38 3.649 36.608 3.705 36.866 3.705 c
+37.266 3.705 37.571 3.601 37.777 3.396 c
+37.99 3.19 38.104 2.896 38.115 2.514 c
+38.115 0.5 l
+38.115 0.195 38.152 -0.07 38.233 -0.294 c
+38.233 -0.353 l
+h
+36.689 0.162 m
+36.854 0.162 37.005 0.206 37.145 0.294 c
+37.292 0.382 37.398 0.493 37.468 0.632 c
+37.468 1.573 l
+37.101 1.573 l
+36.785 1.573 36.542 1.503 36.366 1.367 c
+36.189 1.239 36.101 1.051 36.101 0.809 c
+36.101 0.58 36.145 0.416 36.234 0.309 c
+36.322 0.21 36.472 0.162 36.689 0.162 c
+39.732 3.631 m
+39.746 3.19 l
+40 3.532 40.324 3.705 40.717 3.705 c
+41.423 3.705 41.778 3.234 41.789 2.294 c
+41.789 -0.353 l
+41.143 -0.353 l
+41.143 2.263 l
+41.143 2.576 41.088 2.797 40.981 2.926 c
+40.871 3.05 40.717 3.117 40.511 3.117 c
+40.353 3.117 40.206 3.061 40.07 2.955 c
+39.941 2.845 39.838 2.708 39.761 2.543 c
+39.761 -0.353 l
+39.114 -0.353 l
+39.114 3.631 l
+h
+44.141 0.133 m
+44.355 0.133 44.527 0.195 44.656 0.324 c
+44.792 0.459 44.866 0.651 44.876 0.897 c
+45.494 0.897 l
+45.472 0.515 45.336 0.195 45.082 -0.058 c
+44.825 -0.305 44.513 -0.426 44.141 -0.426 c
+43.649 -0.426 43.274 -0.276 43.01 0.029 c
+42.753 0.341 42.628 0.809 42.628 1.426 c
+42.628 1.867 l
+42.628 2.462 42.753 2.918 43.01 3.234 c
+43.274 3.547 43.649 3.705 44.141 3.705 c
+44.542 3.705 44.862 3.572 45.097 3.308 c
+45.34 3.05 45.472 2.705 45.494 2.263 c
+44.876 2.263 l
+44.854 2.558 44.781 2.778 44.656 2.926 c
+44.538 3.072 44.365 3.146 44.141 3.146 c
+43.848 3.146 43.631 3.046 43.495 2.851 c
+43.355 2.664 43.281 2.356 43.274 1.926 c
+43.274 1.411 l
+43.274 0.941 43.341 0.607 43.48 0.412 c
+43.627 0.224 43.848 0.133 44.141 0.133 c
+46.89 3.219 m
+47.144 3.543 47.463 3.705 47.846 3.705 c
+48.552 3.705 48.908 3.234 48.918 2.294 c
+48.918 -0.353 l
+48.272 -0.353 l
+48.272 2.263 l
+48.272 2.576 48.217 2.797 48.11 2.926 c
+48 3.05 47.846 3.117 47.64 3.117 c
+47.482 3.117 47.335 3.061 47.199 2.955 c
+47.071 2.845 46.967 2.708 46.89 2.543 c
+46.89 -0.353 l
+46.244 -0.353 l
+46.244 5.292 l
+46.89 5.292 l
+h
+51.3 -0.426 m
+50.8 -0.426 50.418 -0.279 50.154 0.015 c
+49.889 0.309 49.757 0.742 49.757 1.323 c
+49.757 1.793 l
+49.757 2.389 49.882 2.855 50.139 3.19 c
+50.403 3.532 50.763 3.705 51.226 3.705 c
+51.686 3.705 52.028 3.55 52.255 3.248 c
+52.49 2.955 52.612 2.492 52.623 1.867 c
+52.623 1.44 l
+50.403 1.44 l
+50.403 1.353 l
+50.403 0.919 50.48 0.607 50.638 0.412 c
+50.804 0.224 51.035 0.133 51.33 0.133 c
+51.524 0.133 51.696 0.166 51.844 0.235 c
+51.991 0.312 52.126 0.43 52.255 0.588 c
+52.594 0.177 l
+52.307 -0.228 51.877 -0.426 51.3 -0.426 c
+51.226 3.146 m
+50.95 3.146 50.749 3.05 50.624 2.866 c
+50.495 2.679 50.422 2.389 50.403 1.999 c
+51.976 1.999 l
+51.976 2.087 l
+51.954 2.469 51.888 2.738 51.771 2.896 c
+51.653 3.061 51.469 3.146 51.226 3.146 c
+55.342 0.661 m
+55.342 0.809 55.287 0.929 55.181 1.029 c
+55.07 1.124 54.865 1.242 54.563 1.382 c
+54.218 1.529 53.975 1.65 53.828 1.75 c
+53.681 1.856 53.571 1.974 53.505 2.103 c
+53.435 2.227 53.402 2.385 53.402 2.573 c
+53.402 2.896 53.52 3.164 53.755 3.381 c
+53.99 3.594 54.291 3.705 54.666 3.705 c
+55.048 3.705 55.357 3.591 55.592 3.366 c
+55.827 3.138 55.945 2.851 55.945 2.499 c
+55.299 2.499 l
+55.299 2.675 55.239 2.826 55.122 2.955 c
+55.004 3.08 54.85 3.146 54.666 3.146 c
+54.468 3.146 54.317 3.09 54.21 2.984 c
+54.1 2.885 54.048 2.753 54.048 2.587 c
+54.048 2.458 54.086 2.352 54.166 2.263 c
+54.243 2.183 54.435 2.08 54.74 1.955 c
+55.218 1.768 55.548 1.58 55.725 1.397 c
+55.901 1.22 55.989 0.992 55.989 0.721 c
+55.989 0.368 55.864 0.088 55.621 -0.118 c
+55.386 -0.324 55.07 -0.426 54.68 -0.426 c
+54.258 -0.426 53.92 -0.309 53.666 -0.073 c
+53.41 0.169 53.284 0.474 53.284 0.838 c
+53.931 0.838 l
+53.938 0.611 54.008 0.434 54.137 0.309 c
+54.262 0.191 54.445 0.133 54.68 0.133 c
+54.894 0.133 55.056 0.181 55.166 0.279 c
+55.284 0.375 55.342 0.503 55.342 0.661 c
+58.532 1.823 m
+58.532 2.458 58.62 3.061 58.796 3.631 c
+58.973 4.197 59.216 4.692 59.532 5.116 c
+59.727 5.38 59.914 5.571 60.09 5.689 c
+60.222 5.233 l
+59.928 4.958 59.686 4.534 59.502 3.969 c
+59.315 3.399 59.212 2.768 59.193 2.072 c
+59.193 1.779 l
+59.193 0.915 59.311 0.151 59.546 -0.515 c
+59.73 -1.014 59.958 -1.396 60.222 -1.66 c
+60.09 -2.088 l
+59.862 -1.929 59.638 -1.679 59.414 -1.338 c
+58.826 -0.455 58.532 0.595 58.532 1.823 c
+63.883 0.794 m
+64.485 3.631 l
+65.132 3.631 l
+64.147 -0.353 l
+63.633 -0.353 l
+62.854 2.499 l
+62.104 -0.353 l
+61.574 -0.353 l
+60.619 3.631 l
+61.252 3.631 l
+61.869 0.867 l
+62.603 3.631 l
+63.118 3.631 l
+h
+66.513 -0.353 -0.646 3.984 re
+66.557 4.675 m
+66.557 4.564 66.528 4.472 66.47 4.395 c
+66.411 4.326 66.316 4.293 66.19 4.293 c
+66.073 4.293 65.977 4.326 65.911 4.395 c
+65.852 4.472 65.823 4.564 65.823 4.675 c
+65.823 4.792 65.852 4.884 65.911 4.954 c
+65.977 5.031 66.073 5.072 66.19 5.072 c
+66.316 5.072 66.411 5.031 66.47 4.954 c
+66.528 4.873 66.557 4.781 66.557 4.675 c
+68.38 4.586 m
+68.38 3.631 l
+68.983 3.631 l
+68.983 3.102 l
+68.38 3.102 l
+68.38 0.632 l
+68.38 0.474 68.402 0.357 68.454 0.279 c
+68.512 0.198 68.601 0.162 68.718 0.162 c
+68.807 0.162 68.895 0.177 68.983 0.206 c
+68.983 -0.353 l
+68.836 -0.401 68.681 -0.426 68.527 -0.426 c
+68.27 -0.426 68.076 -0.334 67.939 -0.147 c
+67.8 0.037 67.733 0.298 67.733 0.632 c
+67.733 3.102 l
+67.131 3.102 l
+67.131 3.631 l
+67.733 3.631 l
+67.733 4.586 l
+h
+70.394 3.219 m
+70.648 3.543 70.968 3.705 71.349 3.705 c
+72.055 3.705 72.412 3.234 72.423 2.294 c
+72.423 -0.353 l
+71.776 -0.353 l
+71.776 2.263 l
+71.776 2.576 71.721 2.797 71.614 2.926 c
+71.504 3.05 71.349 3.117 71.143 3.117 c
+70.985 3.117 70.839 3.061 70.703 2.955 c
+70.574 2.845 70.471 2.708 70.394 2.543 c
+70.394 -0.353 l
+69.747 -0.353 l
+69.747 5.292 l
+70.394 5.292 l
+h
+76.744 3.013 m
+76.656 3.032 76.556 3.043 76.45 3.043 c
+76.115 3.043 75.88 2.859 75.745 2.499 c
+75.745 -0.353 l
+75.097 -0.353 l
+75.097 3.631 l
+75.729 3.631 l
+75.745 3.219 l
+75.92 3.543 76.163 3.705 76.479 3.705 c
+76.586 3.705 76.674 3.682 76.744 3.645 c
+h
+78.743 -0.426 m
+78.243 -0.426 77.861 -0.279 77.597 0.015 c
+77.332 0.309 77.2 0.742 77.2 1.323 c
+77.2 1.793 l
+77.2 2.389 77.325 2.855 77.582 3.19 c
+77.846 3.532 78.206 3.705 78.669 3.705 c
+79.129 3.705 79.471 3.55 79.698 3.248 c
+79.934 2.955 80.055 2.492 80.066 1.867 c
+80.066 1.44 l
+77.846 1.44 l
+77.846 1.353 l
+77.846 0.919 77.923 0.607 78.081 0.412 c
+78.247 0.224 78.478 0.133 78.773 0.133 c
+78.968 0.133 79.14 0.166 79.287 0.235 c
+79.434 0.312 79.57 0.43 79.698 0.588 c
+80.036 0.177 l
+79.75 -0.228 79.32 -0.426 78.743 -0.426 c
+78.669 3.146 m
+78.394 3.146 78.192 3.05 78.067 2.866 c
+77.938 2.679 77.865 2.389 77.846 1.999 c
+79.419 1.999 l
+79.419 2.087 l
+79.397 2.469 79.331 2.738 79.213 2.896 c
+79.095 3.061 78.912 3.146 78.669 3.146 c
+81.462 3.631 m
+81.477 3.263 l
+81.72 3.557 82.039 3.705 82.432 3.705 c
+82.873 3.705 83.182 3.506 83.359 3.117 c
+83.612 3.506 83.961 3.705 84.402 3.705 c
+85.137 3.705 85.512 3.241 85.534 2.323 c
+85.534 -0.353 l
+84.888 -0.353 l
+84.888 2.263 l
+84.888 2.558 84.832 2.77 84.726 2.911 c
+84.626 3.046 84.454 3.117 84.211 3.117 c
+84.013 3.117 83.851 3.036 83.726 2.881 c
+83.608 2.734 83.539 2.543 83.521 2.308 c
+83.521 -0.353 l
+82.858 -0.353 l
+82.858 2.294 l
+82.858 2.841 82.638 3.117 82.197 3.117 c
+81.863 3.117 81.628 2.955 81.492 2.631 c
+81.492 -0.353 l
+80.845 -0.353 l
+80.845 3.631 l
+h
+86.372 1.823 m
+86.372 2.4 86.508 2.855 86.783 3.19 c
+87.066 3.532 87.438 3.705 87.901 3.705 c
+88.36 3.705 88.728 3.535 89.003 3.204 c
+89.286 2.881 89.433 2.433 89.444 1.867 c
+89.444 1.44 l
+89.444 0.871 89.301 0.416 89.017 0.073 c
+88.742 -0.261 88.375 -0.426 87.915 -0.426 c
+87.452 -0.426 87.081 -0.264 86.798 0.059 c
+86.523 0.389 86.38 0.831 86.372 1.382 c
+h
+87.018 1.44 m
+87.018 1.037 87.096 0.721 87.254 0.485 c
+87.419 0.25 87.639 0.133 87.915 0.133 c
+88.481 0.133 88.776 0.544 88.797 1.367 c
+88.797 1.823 l
+88.797 2.223 88.713 2.543 88.547 2.778 c
+88.389 3.021 88.173 3.146 87.901 3.146 c
+87.636 3.146 87.419 3.021 87.254 2.778 c
+87.096 2.543 87.018 2.223 87.018 1.823 c
+h
+91.134 4.586 m
+91.134 3.631 l
+91.737 3.631 l
+91.737 3.102 l
+91.134 3.102 l
+91.134 0.632 l
+91.134 0.474 91.157 0.357 91.208 0.279 c
+91.267 0.198 91.355 0.162 91.473 0.162 c
+91.56 0.162 91.649 0.177 91.737 0.206 c
+91.737 -0.353 l
+91.59 -0.401 91.436 -0.426 91.282 -0.426 c
+91.024 -0.426 90.829 -0.334 90.694 -0.147 c
+90.554 0.037 90.488 0.298 90.488 0.632 c
+90.488 3.102 l
+89.885 3.102 l
+89.885 3.631 l
+90.488 3.631 l
+90.488 4.586 l
+h
+93.927 -0.426 m
+93.428 -0.426 93.046 -0.279 92.78 0.015 c
+92.516 0.309 92.383 0.742 92.383 1.323 c
+92.383 1.793 l
+92.383 2.389 92.509 2.855 92.766 3.19 c
+93.031 3.532 93.391 3.705 93.854 3.705 c
+94.313 3.705 94.655 3.55 94.883 3.248 c
+95.118 2.955 95.24 2.492 95.25 1.867 c
+95.25 1.44 l
+93.031 1.44 l
+93.031 1.353 l
+93.031 0.919 93.108 0.607 93.266 0.412 c
+93.431 0.224 93.663 0.133 93.956 0.133 c
+94.151 0.133 94.324 0.166 94.471 0.235 c
+94.618 0.312 94.754 0.43 94.883 0.588 c
+95.221 0.177 l
+94.934 -0.228 94.504 -0.426 93.927 -0.426 c
+93.854 3.146 m
+93.578 3.146 93.376 3.05 93.251 2.866 c
+93.123 2.679 93.049 2.389 93.031 1.999 c
+94.604 1.999 l
+94.604 2.087 l
+94.581 2.469 94.515 2.738 94.398 2.896 c
+94.28 3.061 94.097 3.146 93.854 3.146 c
+97.426 1.779 m
+97.426 0.691 97.179 -0.276 96.691 -1.117 c
+96.426 -1.565 96.15 -1.889 95.868 -2.088 c
+95.75 -1.66 l
+96.051 -1.367 96.298 -0.914 96.485 -0.309 c
+96.68 0.298 96.779 0.963 96.779 1.691 c
+96.779 1.823 l
+96.779 2.753 96.624 3.587 96.323 4.322 c
+96.154 4.723 95.963 5.042 95.75 5.278 c
+95.868 5.689 l
+96.14 5.501 96.404 5.203 96.661 4.792 c
+97.168 3.94 97.426 2.932 97.426 1.779 c
+98.469 0 m
+98.469 0.118 98.502 0.214 98.573 0.294 c
+98.638 0.372 98.741 0.412 98.881 0.412 c
+99.028 0.412 99.134 0.372 99.204 0.294 c
+99.282 0.214 99.321 0.118 99.321 0 c
+99.321 -0.11 99.282 -0.202 99.204 -0.279 c
+99.134 -0.357 99.028 -0.397 98.881 -0.397 c
+98.741 -0.397 98.638 -0.357 98.573 -0.279 c
+98.502 -0.202 98.469 -0.11 98.469 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 224.097 238.665 -12.895 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 217.2583 cm
+0 0 m
+0 -0.188 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.647 -0.242 -0.776 -0.367 -0.882 c
+-0.496 -0.992 -0.658 -1.081 -0.852 -1.147 c
+-1.051 -1.206 -1.278 -1.243 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.264 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.162 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.927 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.214 -3.484 -0.015 c
+-2.66 0.132 l
+-2.642 0.033 -2.616 -0.059 -2.587 -0.148 c
+-2.55 -0.228 -2.506 -0.302 -2.454 -0.368 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.675 c
+-1.977 0.683 -1.992 0.691 -1.999 0.691 c
+-2.167 0.727 -2.329 0.771 -2.484 0.823 c
+-2.642 0.881 -2.786 0.959 -2.91 1.058 c
+-3.039 1.153 -3.141 1.278 -3.218 1.425 c
+-3.289 1.573 -3.322 1.756 -3.322 1.984 c
+-3.322 2.179 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.836 c
+-2.8 2.932 -2.645 3.002 -2.469 3.042 c
+-2.293 3.09 -2.102 3.119 -1.896 3.131 c
+-1.896 3.557 l
+-1.543 3.557 l
+-1.543 3.131 l
+-1.319 3.119 -1.128 3.09 -0.97 3.042 c
+-0.804 2.991 -0.669 2.917 -0.558 2.822 c
+-0.44 2.734 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.252 -1.213 2.458 -1.543 2.499 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.359 -1.469 1.352 c
+-1.294 1.311 -1.117 1.263 -0.941 1.205 c
+-0.756 1.146 -0.595 1.066 -0.455 0.97 c
+-0.319 0.87 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.454 c
+-2.26 2.425 -2.318 2.385 -2.366 2.337 c
+-2.406 2.296 -2.436 2.248 -2.454 2.19 c
+-2.476 2.131 -2.484 2.065 -2.484 1.999 c
+-2.484 1.911 -2.469 1.837 -2.439 1.778 c
+-2.41 1.72 -2.373 1.668 -2.322 1.631 c
+-2.263 1.591 -2.2 1.558 -2.131 1.529 c
+-2.065 1.499 -1.984 1.469 -1.896 1.44 c
+h
+-0.837 -0.015 m
+-0.837 0.091 -0.86 0.176 -0.897 0.235 c
+-0.926 0.301 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.529 -1.448 0.558 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.53 -1.028 -0.441 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.015 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.52 -2.484 5.403 -2.396 c
+5.285 -2.315 5.185 -2.22 5.108 -2.103 c
+5.039 -1.985 4.991 -1.856 4.961 -1.72 c
+5.858 -1.617 l
+5.895 -1.754 5.964 -1.86 6.064 -1.941 c
+6.159 -2.029 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.058 6.681 -2.029 c
+6.758 -1.999 6.828 -1.945 6.887 -1.867 c
+6.945 -1.797 6.99 -1.706 7.019 -1.588 c
+7.056 -1.47 7.078 -1.324 7.078 -1.147 c
+7.078 -0.956 l
+7.078 -0.89 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.073 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.214 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.412 4.888 -0.206 c
+4.836 0.008 4.815 0.243 4.815 0.5 c
+4.815 0.771 4.836 1.018 4.888 1.234 c
+4.946 1.448 5.027 1.631 5.137 1.778 c
+5.245 1.932 5.376 2.05 5.534 2.131 c
+5.689 2.219 5.876 2.263 6.093 2.263 c
+6.189 2.263 6.288 2.252 6.387 2.234 c
+6.483 2.212 6.571 2.179 6.652 2.131 c
+6.739 2.08 6.817 2.017 6.887 1.94 c
+6.964 1.859 7.026 1.768 7.078 1.66 c
+7.092 1.66 l
+7.092 1.808 l
+7.1 1.866 7.107 1.918 7.107 1.969 c
+7.115 2.028 7.122 2.076 7.122 2.117 c
+7.13 2.164 7.14 2.198 7.151 2.219 c
+8.004 2.219 l
+7.992 2.138 7.982 2.028 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.162 l
+7.975 -1.415 7.938 -1.636 7.872 -1.823 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.404 7.258 -2.5 7.063 -2.558 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.529 m
+7.092 0.742 7.067 0.918 7.019 1.058 c
+6.978 1.205 6.924 1.323 6.857 1.411 c
+6.799 1.499 6.729 1.558 6.652 1.587 c
+6.571 1.624 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.226 1.62 6.137 1.573 c
+6.056 1.532 5.991 1.462 5.931 1.367 c
+5.88 1.278 5.835 1.161 5.799 1.014 c
+5.77 0.874 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.339 c
+6.049 -0.515 6.211 -0.603 6.417 -0.603 c
+6.483 -0.603 6.556 -0.588 6.637 -0.559 c
+6.725 -0.522 6.799 -0.463 6.857 -0.383 c
+6.924 -0.294 6.978 -0.177 7.019 -0.03 c
+7.067 0.118 7.092 0.301 7.092 0.529 c
+11.036 -0.647 m
+12.168 -0.647 l
+12.168 -1.264 l
+8.86 -1.264 l
+8.86 -0.647 l
+10.124 -0.647 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.219 l
+11.036 2.219 l
+h
+10.124 3.513 0.912 -0.676 re
+10.124 2.836 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.219 l
+13.644 2.219 l
+13.924 3.116 l
+14.498 3.116 l
+14.498 2.219 l
+15.732 2.219 l
+15.732 1.602 l
+14.498 1.602 l
+14.498 -0.103 l
+14.498 -0.324 l
+14.504 -0.393 14.527 -0.456 14.556 -0.515 c
+14.593 -0.566 14.648 -0.611 14.718 -0.647 c
+14.795 -0.676 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.688 15.468 -0.676 c
+15.603 -0.659 15.736 -0.632 15.865 -0.603 c
+15.865 -1.206 l
+15.784 -1.216 15.707 -1.231 15.629 -1.249 c
+15.549 -1.261 15.471 -1.268 15.394 -1.279 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.042 -1.301 14.942 -1.309 14.836 -1.309 c
+14.648 -1.309 14.486 -1.294 14.35 -1.264 c
+14.222 -1.228 14.107 -1.183 14.012 -1.132 c
+13.924 -1.085 13.85 -1.025 13.792 -0.956 c
+13.733 -0.879 13.689 -0.802 13.66 -0.721 c
+13.63 -0.632 13.608 -0.544 13.6 -0.456 c
+13.59 -0.36 13.586 -0.265 13.586 -0.177 c
+h
+21.12 -1.264 m
+21.12 -0.971 l
+21.126 -0.834 21.134 -0.676 21.134 -0.5 c
+21.134 3.513 l
+22.045 3.513 l
+22.045 2.234 l
+22.045 2.072 l
+22.045 1.896 l
+22.045 1.845 22.038 1.801 22.03 1.764 c
+22.03 1.675 l
+22.045 1.675 l
+22.093 1.782 22.155 1.874 22.236 1.955 c
+22.313 2.032 22.398 2.094 22.487 2.146 c
+22.574 2.194 22.666 2.227 22.766 2.248 c
+22.861 2.267 22.961 2.278 23.059 2.278 c
+23.273 2.278 23.46 2.234 23.618 2.146 c
+23.773 2.057 23.901 1.929 24 1.764 c
+24.106 1.606 24.184 1.415 24.235 1.19 c
+24.283 0.974 24.309 0.735 24.309 0.47 c
+24.309 0.213 24.28 -0.026 24.22 -0.25 c
+24.162 -0.467 24.077 -0.659 23.971 -0.823 c
+23.861 -0.981 23.728 -1.103 23.574 -1.191 c
+23.416 -1.279 23.236 -1.324 23.03 -1.324 c
+22.931 -1.324 22.832 -1.312 22.736 -1.294 c
+22.648 -1.272 22.56 -1.243 22.471 -1.191 c
+22.383 -1.132 22.302 -1.066 22.236 -0.985 c
+22.167 -0.908 22.104 -0.809 22.045 -0.691 c
+22.03 -0.691 l
+22.03 -0.853 l
+22.03 -0.912 22.024 -0.971 22.016 -1.029 c
+22.016 -1.081 22.009 -1.129 22.001 -1.176 c
+22.001 -1.216 21.994 -1.246 21.986 -1.264 c
+h
+22.03 0.5 m
+22.03 0.264 22.049 0.066 22.09 -0.088 c
+22.137 -0.246 22.196 -0.368 22.265 -0.456 c
+22.332 -0.544 22.406 -0.611 22.487 -0.647 c
+22.564 -0.688 22.641 -0.706 22.722 -0.706 c
+22.927 -0.706 23.082 -0.611 23.192 -0.412 c
+23.31 -0.217 23.368 0.077 23.368 0.47 c
+23.368 0.683 23.346 0.867 23.31 1.014 c
+23.28 1.168 23.236 1.294 23.177 1.381 c
+23.125 1.477 23.059 1.55 22.971 1.602 c
+22.89 1.65 22.803 1.675 22.707 1.675 c
+22.626 1.675 22.549 1.654 22.471 1.616 c
+22.391 1.576 22.317 1.514 22.251 1.425 c
+22.192 1.338 22.137 1.213 22.09 1.058 c
+22.049 0.911 22.03 0.723 22.03 0.5 c
+28.193 1.469 m
+28.094 1.477 27.991 1.488 27.884 1.499 c
+27.774 1.517 27.653 1.529 27.517 1.529 c
+27.341 1.529 27.183 1.488 27.046 1.411 c
+26.907 1.341 26.789 1.242 26.693 1.117 c
+26.606 0.988 26.535 0.841 26.488 0.675 c
+26.448 0.507 26.429 0.33 26.429 0.147 c
+26.429 -1.264 l
+25.533 -1.264 l
+25.533 0.985 l
+25.533 1.109 25.521 1.234 25.503 1.352 c
+25.492 1.477 25.477 1.595 25.459 1.705 c
+25.448 1.822 25.434 1.918 25.415 1.999 c
+25.393 2.087 25.375 2.161 25.356 2.219 c
+26.238 2.219 l
+26.246 2.167 26.257 2.117 26.267 2.057 c
+26.286 1.999 26.3 1.932 26.312 1.866 c
+26.33 1.808 26.344 1.741 26.356 1.675 c
+26.363 1.606 26.375 1.543 26.385 1.484 c
+26.4 1.484 l
+26.437 1.602 26.488 1.708 26.547 1.808 c
+26.613 1.903 26.693 1.988 26.782 2.057 c
+26.87 2.124 26.973 2.179 27.09 2.219 c
+27.216 2.256 27.362 2.278 27.532 2.278 c
+27.657 2.278 27.774 2.271 27.884 2.263 c
+28.002 2.252 28.105 2.238 28.193 2.219 c
+h
+30.196 -1.324 m
+30.026 -1.324 29.876 -1.301 29.741 -1.264 c
+29.612 -1.216 29.498 -1.147 29.402 -1.058 c
+29.314 -0.971 29.244 -0.864 29.197 -0.736 c
+29.145 -0.599 29.122 -0.449 29.122 -0.279 c
+29.122 -0.073 29.156 0.095 29.226 0.235 c
+29.292 0.382 29.388 0.492 29.505 0.573 c
+29.63 0.661 29.773 0.723 29.932 0.764 c
+30.097 0.801 30.273 0.827 30.46 0.837 c
+31.181 0.852 l
+31.181 1.028 l
+31.181 1.146 31.169 1.249 31.152 1.338 c
+31.129 1.425 31.096 1.492 31.048 1.543 c
+31.008 1.602 30.961 1.639 30.901 1.66 c
+30.843 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.66 c
+30.468 1.65 30.42 1.624 30.373 1.587 c
+30.332 1.558 30.298 1.506 30.269 1.44 c
+30.248 1.381 30.233 1.301 30.225 1.205 c
+29.284 1.249 l
+29.314 1.396 29.358 1.532 29.417 1.66 c
+29.483 1.786 29.579 1.896 29.696 1.984 c
+29.814 2.08 29.953 2.153 30.122 2.204 c
+30.298 2.252 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.167 31.74 1.955 c
+31.975 1.749 32.092 1.44 32.092 1.028 c
+32.092 -0.235 l
+32.092 -0.456 l
+32.099 -0.515 32.114 -0.57 32.137 -0.618 c
+32.154 -0.659 32.184 -0.691 32.224 -0.721 c
+32.261 -0.742 32.313 -0.75 32.372 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.736 c
+32.577 -1.22 l
+32.519 -1.231 32.463 -1.243 32.415 -1.249 c
+32.375 -1.261 32.334 -1.268 32.297 -1.279 c
+32.257 -1.286 32.214 -1.294 32.166 -1.294 c
+32.114 -1.301 32.056 -1.309 31.989 -1.309 c
+31.761 -1.309 31.596 -1.257 31.489 -1.147 c
+31.379 -1.029 31.316 -0.864 31.298 -0.647 c
+31.283 -0.647 l
+31.214 -0.757 31.144 -0.853 31.078 -0.941 c
+31.008 -1.022 30.931 -1.088 30.843 -1.147 c
+30.755 -1.206 30.655 -1.249 30.549 -1.279 c
+30.45 -1.309 30.332 -1.324 30.196 -1.324 c
+31.181 0.353 m
+30.755 0.338 l
+30.655 0.338 30.564 0.33 30.475 0.323 c
+30.394 0.312 30.328 0.286 30.269 0.249 c
+30.211 0.209 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.088 30.063 -0.206 c
+30.063 -0.375 30.097 -0.497 30.167 -0.574 c
+30.233 -0.655 30.332 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.618 c
+30.85 -0.57 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.262 31.137 -0.162 c
+31.166 -0.055 31.181 0.058 31.181 0.176 c
+h
+35.495 -1.264 m
+35.495 0.72 l
+35.495 1.022 35.451 1.242 35.362 1.381 c
+35.281 1.529 35.146 1.602 34.951 1.602 c
+34.841 1.602 34.738 1.576 34.643 1.529 c
+34.554 1.477 34.473 1.411 34.408 1.323 c
+34.348 1.234 34.297 1.124 34.26 0.999 c
+34.231 0.881 34.216 0.75 34.216 0.602 c
+34.216 -1.264 l
+33.305 -1.264 l
+33.305 1.44 l
+33.305 1.66 l
+33.305 1.749 33.297 1.826 33.29 1.896 c
+33.29 2.087 l
+33.29 2.219 l
+34.142 2.219 l
+34.15 2.19 34.157 2.146 34.157 2.087 c
+34.157 1.896 l
+34.165 1.826 34.172 1.756 34.172 1.691 c
+34.179 1.62 34.186 1.565 34.186 1.529 c
+34.202 1.529 l
+34.319 1.793 34.47 1.984 34.657 2.102 c
+34.841 2.219 35.061 2.278 35.318 2.278 c
+35.503 2.278 35.664 2.248 35.804 2.19 c
+35.939 2.131 36.054 2.043 36.141 1.926 c
+36.23 1.808 36.293 1.664 36.332 1.499 c
+36.38 1.341 36.407 1.153 36.407 0.941 c
+36.407 -1.264 l
+h
+38.923 -1.324 m
+38.637 -1.324 38.394 -1.283 38.188 -1.206 c
+37.982 -1.118 37.81 -0.996 37.674 -0.838 c
+37.535 -0.684 37.431 -0.497 37.365 -0.279 c
+37.296 -0.055 37.263 0.191 37.263 0.455 c
+37.263 0.75 37.296 1.007 37.365 1.234 c
+37.442 1.458 37.549 1.646 37.689 1.793 c
+37.836 1.947 38.012 2.065 38.218 2.146 c
+38.424 2.234 38.659 2.278 38.923 2.278 c
+39.148 2.278 39.35 2.248 39.526 2.19 c
+39.702 2.131 39.854 2.046 39.981 1.94 c
+40.107 1.841 40.21 1.72 40.291 1.573 c
+40.368 1.433 40.423 1.282 40.452 1.117 c
+39.541 1.072 l
+39.511 1.249 39.441 1.389 39.335 1.499 c
+39.235 1.606 39.092 1.66 38.909 1.66 c
+38.662 1.66 38.487 1.558 38.379 1.352 c
+38.269 1.153 38.218 0.867 38.218 0.484 c
+38.218 -0.309 38.453 -0.706 38.923 -0.706 c
+39.089 -0.706 39.232 -0.655 39.35 -0.544 c
+39.467 -0.437 39.541 -0.276 39.57 -0.059 c
+40.482 -0.103 l
+40.452 -0.272 40.397 -0.426 40.32 -0.574 c
+40.25 -0.721 40.147 -0.853 40.012 -0.971 c
+39.883 -1.081 39.725 -1.168 39.541 -1.235 c
+39.364 -1.294 39.158 -1.324 38.923 -1.324 c
+42.323 1.514 m
+42.441 1.786 42.591 1.984 42.778 2.102 c
+42.962 2.219 43.183 2.278 43.44 2.278 c
+43.646 2.278 43.815 2.242 43.954 2.175 c
+44.101 2.105 44.211 2.013 44.292 1.896 c
+44.38 1.778 44.44 1.635 44.469 1.469 c
+44.505 1.301 44.527 1.124 44.527 0.941 c
+44.527 -1.264 l
+43.616 -1.264 l
+43.616 0.735 l
+43.616 0.87 43.605 0.992 43.586 1.103 c
+43.576 1.209 43.55 1.297 43.513 1.367 c
+43.473 1.444 43.414 1.502 43.337 1.543 c
+43.267 1.58 43.175 1.602 43.058 1.602 c
+42.948 1.602 42.852 1.576 42.763 1.529 c
+42.676 1.477 42.595 1.411 42.528 1.323 c
+42.47 1.234 42.418 1.124 42.381 0.999 c
+42.352 0.881 42.337 0.75 42.337 0.602 c
+42.337 -1.264 l
+41.426 -1.264 l
+41.426 3.513 l
+42.337 3.513 l
+42.337 2.204 l
+42.337 2.135 42.329 2.065 42.323 1.999 c
+42.323 1.793 l
+42.323 1.734 42.315 1.679 42.308 1.631 c
+42.308 1.514 l
+h
+50.297 -2.631 m
+50.297 3.513 l
+52.222 3.513 l
+52.222 2.896 l
+51.149 2.896 l
+51.149 -2.014 l
+52.222 -2.014 l
+52.222 -2.631 l
+h
+55.802 -1.264 m
+55.802 0.72 l
+55.802 1.022 55.758 1.242 55.669 1.381 c
+55.588 1.529 55.453 1.602 55.258 1.602 c
+55.147 1.602 55.044 1.576 54.95 1.529 c
+54.861 1.477 54.78 1.411 54.714 1.323 c
+54.655 1.234 54.603 1.124 54.567 0.999 c
+54.537 0.881 54.522 0.75 54.522 0.602 c
+54.522 -1.264 l
+53.612 -1.264 l
+53.612 1.44 l
+53.612 1.66 l
+53.612 1.749 53.604 1.826 53.597 1.896 c
+53.597 2.087 l
+53.597 2.219 l
+54.449 2.219 l
+54.457 2.19 54.464 2.146 54.464 2.087 c
+54.464 1.896 l
+54.472 1.826 54.479 1.756 54.479 1.691 c
+54.486 1.62 54.493 1.565 54.493 1.529 c
+54.508 1.529 l
+54.626 1.793 54.776 1.984 54.964 2.102 c
+55.147 2.219 55.368 2.278 55.625 2.278 c
+55.809 2.278 55.97 2.248 56.11 2.19 c
+56.246 2.131 56.361 2.043 56.448 1.926 c
+56.536 1.808 56.599 1.664 56.639 1.499 c
+56.687 1.341 56.713 1.153 56.713 0.941 c
+56.713 -1.264 l
+h
+58.628 -1.324 m
+58.458 -1.324 58.308 -1.301 58.172 -1.264 c
+58.044 -1.216 57.93 -1.147 57.834 -1.058 c
+57.745 -0.971 57.676 -0.864 57.628 -0.736 c
+57.576 -0.599 57.554 -0.449 57.554 -0.279 c
+57.554 -0.073 57.587 0.095 57.657 0.235 c
+57.724 0.382 57.819 0.492 57.936 0.573 c
+58.062 0.661 58.204 0.723 58.363 0.764 c
+58.528 0.801 58.705 0.827 58.892 0.837 c
+59.613 0.852 l
+59.613 1.028 l
+59.613 1.146 59.602 1.249 59.583 1.338 c
+59.561 1.425 59.528 1.492 59.48 1.543 c
+59.44 1.602 59.392 1.639 59.333 1.66 c
+59.274 1.679 59.208 1.691 59.142 1.691 c
+59.072 1.691 59.01 1.679 58.951 1.66 c
+58.9 1.65 58.852 1.624 58.804 1.587 c
+58.763 1.558 58.73 1.506 58.701 1.44 c
+58.679 1.381 58.664 1.301 58.657 1.205 c
+57.716 1.249 l
+57.745 1.396 57.79 1.532 57.849 1.66 c
+57.915 1.786 58.01 1.896 58.127 1.984 c
+58.245 2.08 58.385 2.153 58.554 2.204 c
+58.73 2.252 58.936 2.278 59.172 2.278 c
+59.613 2.278 59.943 2.167 60.171 1.955 c
+60.406 1.749 60.523 1.44 60.523 1.028 c
+60.523 -0.235 l
+60.523 -0.456 l
+60.531 -0.515 60.546 -0.57 60.568 -0.618 c
+60.586 -0.659 60.616 -0.691 60.656 -0.721 c
+60.693 -0.742 60.744 -0.75 60.803 -0.75 c
+60.869 -0.75 60.939 -0.746 61.009 -0.736 c
+61.009 -1.22 l
+60.95 -1.231 60.895 -1.243 60.847 -1.249 c
+60.807 -1.261 60.766 -1.268 60.729 -1.279 c
+60.689 -1.286 60.645 -1.294 60.597 -1.294 c
+60.546 -1.301 60.487 -1.309 60.421 -1.309 c
+60.193 -1.309 60.028 -1.257 59.921 -1.147 c
+59.811 -1.029 59.748 -0.864 59.73 -0.647 c
+59.715 -0.647 l
+59.646 -0.757 59.576 -0.853 59.509 -0.941 c
+59.44 -1.022 59.363 -1.088 59.274 -1.147 c
+59.186 -1.206 59.087 -1.249 58.981 -1.279 c
+58.881 -1.309 58.763 -1.324 58.628 -1.324 c
+59.613 0.353 m
+59.186 0.338 l
+59.087 0.338 58.995 0.33 58.907 0.323 c
+58.826 0.312 58.76 0.286 58.701 0.249 c
+58.642 0.209 58.591 0.151 58.554 0.073 c
+58.514 0.004 58.495 -0.088 58.495 -0.206 c
+58.495 -0.375 58.528 -0.497 58.598 -0.574 c
+58.664 -0.655 58.763 -0.691 58.892 -0.691 c
+58.998 -0.691 59.098 -0.669 59.186 -0.618 c
+59.282 -0.57 59.363 -0.507 59.421 -0.426 c
+59.488 -0.349 59.538 -0.262 59.569 -0.162 c
+59.598 -0.055 59.613 0.058 59.613 0.176 c
+h
+62.894 -1.264 m
+62.894 0.852 l
+62.894 1.018 62.887 1.153 62.879 1.263 c
+62.869 1.371 62.85 1.455 62.821 1.514 c
+62.798 1.58 62.769 1.631 62.732 1.66 c
+62.703 1.691 62.663 1.705 62.615 1.705 c
+62.555 1.705 62.501 1.675 62.453 1.616 c
+62.412 1.565 62.38 1.492 62.35 1.396 c
+62.32 1.308 62.295 1.194 62.277 1.058 c
+62.266 0.918 62.262 0.768 62.262 0.602 c
+62.262 -1.264 l
+61.512 -1.264 l
+61.512 1.469 l
+61.512 1.705 l
+61.512 1.926 l
+61.512 2.003 61.505 2.065 61.497 2.117 c
+61.497 2.219 l
+62.173 2.219 l
+62.173 2.131 l
+62.173 1.984 l
+62.181 1.926 62.189 1.866 62.189 1.808 c
+62.189 1.646 l
+62.203 1.646 l
+62.221 1.734 62.251 1.811 62.291 1.881 c
+62.328 1.959 62.372 2.028 62.424 2.087 c
+62.482 2.146 62.549 2.19 62.63 2.219 c
+62.707 2.256 62.794 2.278 62.894 2.278 c
+63.078 2.278 63.218 2.223 63.305 2.117 c
+63.401 2.017 63.471 1.859 63.511 1.646 c
+63.526 1.646 l
+63.563 1.741 63.603 1.83 63.644 1.911 c
+63.691 1.988 63.746 2.05 63.806 2.102 c
+63.864 2.161 63.93 2.204 64.011 2.234 c
+64.088 2.263 64.176 2.278 64.276 2.278 c
+64.411 2.278 64.525 2.252 64.614 2.204 c
+64.702 2.153 64.768 2.08 64.82 1.984 c
+64.878 1.885 64.915 1.756 64.937 1.602 c
+64.967 1.455 64.982 1.271 64.982 1.058 c
+64.982 -1.264 l
+64.261 -1.264 l
+64.261 0.852 l
+64.261 1.018 64.253 1.153 64.246 1.263 c
+64.236 1.371 64.217 1.455 64.188 1.514 c
+64.165 1.58 64.136 1.631 64.099 1.66 c
+64.07 1.691 64.03 1.705 63.982 1.705 c
+63.864 1.705 63.769 1.616 63.702 1.44 c
+63.644 1.271 63.614 1.014 63.614 0.661 c
+63.614 -1.264 l
+h
+67.351 -1.324 m
+67.094 -1.324 66.867 -1.286 66.661 -1.22 c
+66.455 -1.143 66.278 -1.029 66.131 -0.882 c
+65.984 -0.728 65.867 -0.537 65.778 -0.309 c
+65.698 -0.085 65.661 0.18 65.661 0.484 c
+65.661 0.816 65.705 1.095 65.793 1.323 c
+65.888 1.558 66.017 1.741 66.175 1.881 c
+66.341 2.017 66.528 2.117 66.734 2.175 c
+66.94 2.242 67.149 2.278 67.366 2.278 c
+67.638 2.278 67.873 2.227 68.072 2.131 c
+68.278 2.043 68.443 1.911 68.571 1.734 c
+68.708 1.565 68.807 1.359 68.865 1.117 c
+68.932 0.881 68.968 0.617 68.968 0.323 c
+68.968 0.309 l
+66.602 0.309 l
+66.602 0.162 66.617 0.022 66.646 -0.103 c
+66.682 -0.231 66.738 -0.345 66.808 -0.441 c
+66.873 -0.53 66.958 -0.599 67.058 -0.647 c
+67.153 -0.698 67.267 -0.721 67.396 -0.721 c
+67.55 -0.721 67.689 -0.688 67.808 -0.618 c
+67.932 -0.551 68.02 -0.449 68.072 -0.309 c
+68.909 -0.383 l
+68.88 -0.482 68.825 -0.588 68.748 -0.706 c
+68.667 -0.816 68.564 -0.919 68.439 -1.014 c
+68.321 -1.103 68.167 -1.176 67.983 -1.235 c
+67.808 -1.294 67.594 -1.324 67.351 -1.324 c
+67.351 1.705 m
+67.263 1.705 67.175 1.691 67.087 1.66 c
+66.999 1.631 66.918 1.58 66.852 1.514 c
+66.782 1.444 66.723 1.356 66.675 1.249 c
+66.634 1.139 66.617 1.014 66.617 0.867 c
+68.086 0.867 l
+68.086 1.003 68.061 1.124 68.013 1.234 c
+67.972 1.341 67.918 1.429 67.851 1.499 c
+67.792 1.565 67.719 1.616 67.631 1.646 c
+67.542 1.683 67.447 1.705 67.351 1.705 c
+70.221 -2.631 m
+70.221 -2.014 l
+71.295 -2.014 l
+71.295 2.896 l
+70.221 2.896 l
+70.221 3.513 l
+72.147 3.513 l
+72.147 -2.631 l
+h
+f
+Q
+q 1 0 0 1 626.5183 202.8085 cm
+0 0 m
+-0.029 -0.58 -0.191 -1.022 -0.485 -1.323 c
+-0.779 -1.627 -1.198 -1.778 -1.735 -1.778 c
+-2.263 -1.778 -2.69 -1.579 -3.013 -1.176 c
+-3.329 -0.764 -3.484 -0.205 -3.484 0.5 c
+-3.484 1.47 l
+-3.484 2.165 -3.322 2.712 -2.999 3.117 c
+-2.676 3.517 -2.231 3.719 -1.661 3.719 c
+-1.154 3.719 -0.757 3.561 -0.47 3.248 c
+-0.187 2.944 -0.029 2.502 0 1.926 c
+-0.691 1.926 l
+-0.721 2.367 -0.816 2.679 -0.97 2.866 c
+-1.118 3.051 -1.349 3.146 -1.661 3.146 c
+-2.036 3.146 -2.319 2.999 -2.514 2.705 c
+-2.712 2.419 -2.807 2.003 -2.807 1.455 c
+-2.807 0.47 l
+-2.807 -0.07 -2.716 -0.484 -2.529 -0.779 c
+-2.344 -1.065 -2.08 -1.205 -1.735 -1.205 c
+-1.382 -1.205 -1.128 -1.117 -0.97 -0.941 c
+-0.816 -0.764 -0.721 -0.452 -0.691 0 c
+h
+2.454 1.661 m
+2.367 1.679 2.267 1.691 2.161 1.691 c
+1.826 1.691 1.591 1.507 1.455 1.147 c
+1.455 -1.705 l
+0.808 -1.705 l
+0.808 2.278 l
+1.44 2.278 l
+1.455 1.867 l
+1.631 2.19 1.874 2.352 2.19 2.352 c
+2.296 2.352 2.385 2.33 2.454 2.294 c
+h
+4.453 -1.778 m
+3.954 -1.778 3.572 -1.631 3.308 -1.338 c
+3.042 -1.043 2.911 -0.61 2.911 -0.029 c
+2.911 0.441 l
+2.911 1.037 3.036 1.503 3.293 1.837 c
+3.557 2.18 3.917 2.352 4.38 2.352 c
+4.839 2.352 5.182 2.198 5.409 1.897 c
+5.644 1.602 5.766 1.139 5.777 0.515 c
+5.777 0.088 l
+3.557 0.088 l
+3.557 0 l
+3.557 -0.434 3.634 -0.746 3.792 -0.941 c
+3.958 -1.128 4.189 -1.22 4.484 -1.22 c
+4.678 -1.22 4.85 -1.186 4.997 -1.117 c
+5.145 -1.04 5.28 -0.922 5.409 -0.764 c
+5.747 -1.176 l
+5.461 -1.579 5.031 -1.778 4.453 -1.778 c
+4.38 1.794 m
+4.104 1.794 3.902 1.698 3.778 1.515 c
+3.649 1.326 3.576 1.037 3.557 0.647 c
+5.13 0.647 l
+5.13 0.736 l
+5.108 1.118 5.041 1.386 4.924 1.544 c
+4.806 1.709 4.623 1.794 4.38 1.794 c
+8.599 -1.705 m
+8.559 -1.616 8.532 -1.469 8.525 -1.263 c
+8.29 -1.61 7.996 -1.778 7.643 -1.778 c
+7.279 -1.778 6.996 -1.683 6.791 -1.484 c
+6.593 -1.278 6.497 -0.992 6.497 -0.617 c
+6.497 -0.216 6.633 0.103 6.909 0.339 c
+7.181 0.581 7.555 0.706 8.025 0.706 c
+8.511 0.706 l
+8.511 1.132 l
+8.511 1.367 8.455 1.532 8.349 1.632 c
+8.239 1.738 8.077 1.794 7.864 1.794 c
+7.665 1.794 7.504 1.735 7.379 1.617 c
+7.262 1.5 7.202 1.353 7.202 1.176 c
+6.556 1.176 l
+6.556 1.371 6.614 1.562 6.732 1.75 c
+6.857 1.933 7.019 2.08 7.217 2.19 c
+7.423 2.297 7.651 2.352 7.908 2.352 c
+8.309 2.352 8.613 2.249 8.819 2.043 c
+9.033 1.837 9.147 1.544 9.157 1.162 c
+9.157 -0.852 l
+9.157 -1.157 9.194 -1.421 9.275 -1.646 c
+9.275 -1.705 l
+h
+7.732 -1.19 m
+7.897 -1.19 8.048 -1.146 8.187 -1.058 c
+8.334 -0.97 8.441 -0.86 8.511 -0.72 c
+8.511 0.221 l
+8.143 0.221 l
+7.827 0.221 7.584 0.151 7.408 0.015 c
+7.231 -0.114 7.144 -0.301 7.144 -0.544 c
+7.144 -0.771 7.188 -0.937 7.276 -1.043 c
+7.364 -1.143 7.515 -1.19 7.732 -1.19 c
+11.009 3.234 m
+11.009 2.278 l
+11.612 2.278 l
+11.612 1.75 l
+11.009 1.75 l
+11.009 -0.72 l
+11.009 -0.878 11.032 -0.995 11.083 -1.072 c
+11.142 -1.153 11.23 -1.19 11.347 -1.19 c
+11.436 -1.19 11.524 -1.176 11.612 -1.146 c
+11.612 -1.705 l
+11.465 -1.753 11.31 -1.778 11.156 -1.778 c
+10.899 -1.778 10.705 -1.687 10.568 -1.499 c
+10.429 -1.315 10.363 -1.055 10.363 -0.72 c
+10.363 1.75 l
+9.76 1.75 l
+9.76 2.278 l
+10.363 2.278 l
+10.363 3.234 l
+h
+13.802 -1.778 m
+13.303 -1.778 12.92 -1.631 12.656 -1.338 c
+12.391 -1.043 12.259 -0.61 12.259 -0.029 c
+12.259 0.441 l
+12.259 1.037 12.384 1.503 12.641 1.837 c
+12.906 2.18 13.266 2.352 13.729 2.352 c
+14.188 2.352 14.53 2.198 14.757 1.897 c
+14.992 1.602 15.114 1.139 15.125 0.515 c
+15.125 0.088 l
+12.906 0.088 l
+12.906 0 l
+12.906 -0.434 12.983 -0.746 13.141 -0.941 c
+13.306 -1.128 13.538 -1.22 13.832 -1.22 c
+14.026 -1.22 14.199 -1.186 14.346 -1.117 c
+14.493 -1.04 14.629 -0.922 14.757 -0.764 c
+15.096 -1.176 l
+14.809 -1.579 14.379 -1.778 13.802 -1.778 c
+13.729 1.794 m
+13.453 1.794 13.251 1.698 13.126 1.515 c
+12.997 1.326 12.924 1.037 12.906 0.647 c
+14.479 0.647 l
+14.479 0.736 l
+14.456 1.118 14.39 1.386 14.273 1.544 c
+14.155 1.709 13.972 1.794 13.729 1.794 c
+18.242 2.278 m
+18.256 1.837 l
+18.51 2.18 18.834 2.352 19.226 2.352 c
+19.931 2.352 20.288 1.881 20.299 0.941 c
+20.299 -1.705 l
+19.653 -1.705 l
+19.653 0.912 l
+19.653 1.224 19.597 1.444 19.491 1.573 c
+19.381 1.698 19.226 1.764 19.021 1.764 c
+18.863 1.764 18.715 1.709 18.58 1.602 c
+18.451 1.492 18.348 1.357 18.271 1.191 c
+18.271 -1.705 l
+17.624 -1.705 l
+17.624 2.278 l
+h
+22.695 -1.778 m
+22.196 -1.778 21.813 -1.631 21.549 -1.338 c
+21.284 -1.043 21.151 -0.61 21.151 -0.029 c
+21.151 0.441 l
+21.151 1.037 21.277 1.503 21.534 1.837 c
+21.799 2.18 22.159 2.352 22.622 2.352 c
+23.081 2.352 23.422 2.198 23.651 1.897 c
+23.886 1.602 24.008 1.139 24.018 0.515 c
+24.018 0.088 l
+21.799 0.088 l
+21.799 0 l
+21.799 -0.434 21.876 -0.746 22.034 -0.941 c
+22.2 -1.128 22.431 -1.22 22.724 -1.22 c
+22.919 -1.22 23.092 -1.186 23.239 -1.117 c
+23.386 -1.04 23.522 -0.922 23.651 -0.764 c
+23.989 -1.176 l
+23.702 -1.579 23.272 -1.778 22.695 -1.778 c
+22.622 1.794 m
+22.346 1.794 22.144 1.698 22.019 1.515 c
+21.891 1.326 21.817 1.037 21.799 0.647 c
+23.372 0.647 l
+23.372 0.736 l
+23.349 1.118 23.283 1.386 23.166 1.544 c
+23.048 1.709 22.865 1.794 22.622 1.794 c
+27.767 -0.558 m
+28.369 2.278 l
+29.016 2.278 l
+28.031 -1.705 l
+27.517 -1.705 l
+26.738 1.147 l
+25.988 -1.705 l
+25.458 -1.705 l
+24.503 2.278 l
+25.136 2.278 l
+25.753 -0.484 l
+26.487 2.278 l
+27.002 2.278 l
+h
+34.293 0.088 m
+34.293 -0.529 34.179 -0.995 33.955 -1.308 c
+33.738 -1.624 33.415 -1.778 32.984 -1.778 c
+32.562 -1.778 32.249 -1.598 32.043 -1.234 c
+32.014 -1.705 l
+31.412 -1.705 l
+31.412 3.94 l
+32.058 3.94 l
+32.058 1.837 l
+32.272 2.18 32.581 2.352 32.984 2.352 c
+33.415 2.352 33.738 2.194 33.955 1.881 c
+34.179 1.577 34.293 1.11 34.293 0.485 c
+h
+33.646 0.47 m
+33.646 0.941 33.576 1.272 33.44 1.47 c
+33.312 1.665 33.102 1.764 32.808 1.764 c
+32.474 1.764 32.224 1.58 32.058 1.22 c
+32.058 -0.661 l
+32.224 -1.025 32.477 -1.205 32.823 -1.205 c
+33.117 -1.205 33.327 -1.103 33.455 -0.897 c
+33.58 -0.691 33.646 -0.374 33.646 0.059 c
+h
+36.777 1.661 m
+36.689 1.679 36.589 1.691 36.483 1.691 c
+36.149 1.691 35.914 1.507 35.777 1.147 c
+35.777 -1.705 l
+35.131 -1.705 l
+35.131 2.278 l
+35.763 2.278 l
+35.777 1.867 l
+35.954 2.19 36.197 2.352 36.512 2.352 c
+36.619 2.352 36.708 2.33 36.777 2.294 c
+h
+39.32 -1.705 m
+39.28 -1.616 39.254 -1.469 39.247 -1.263 c
+39.011 -1.61 38.717 -1.778 38.364 -1.778 c
+38 -1.778 37.718 -1.683 37.512 -1.484 c
+37.313 -1.278 37.217 -0.992 37.217 -0.617 c
+37.217 -0.216 37.354 0.103 37.63 0.339 c
+37.901 0.581 38.276 0.706 38.746 0.706 c
+39.232 0.706 l
+39.232 1.132 l
+39.232 1.367 39.176 1.532 39.07 1.632 c
+38.96 1.738 38.798 1.794 38.585 1.794 c
+38.387 1.794 38.225 1.735 38.1 1.617 c
+37.982 1.5 37.923 1.353 37.923 1.176 c
+37.277 1.176 l
+37.277 1.371 37.335 1.562 37.453 1.75 c
+37.578 1.933 37.74 2.08 37.938 2.19 c
+38.144 2.297 38.372 2.352 38.629 2.352 c
+39.029 2.352 39.334 2.249 39.54 2.043 c
+39.754 1.837 39.868 1.544 39.879 1.162 c
+39.879 -0.852 l
+39.879 -1.157 39.916 -1.421 39.996 -1.646 c
+39.996 -1.705 l
+h
+38.453 -1.19 m
+38.618 -1.19 38.769 -1.146 38.908 -1.058 c
+39.056 -0.97 39.162 -0.86 39.232 -0.72 c
+39.232 0.221 l
+38.864 0.221 l
+38.549 0.221 38.306 0.151 38.129 0.015 c
+37.953 -0.114 37.865 -0.301 37.865 -0.544 c
+37.865 -0.771 37.909 -0.937 37.997 -1.043 c
+38.085 -1.143 38.235 -1.19 38.453 -1.19 c
+41.495 2.278 m
+41.51 1.837 l
+41.763 2.18 42.087 2.352 42.48 2.352 c
+43.185 2.352 43.542 1.881 43.553 0.941 c
+43.553 -1.705 l
+42.906 -1.705 l
+42.906 0.912 l
+42.906 1.224 42.852 1.444 42.744 1.573 c
+42.634 1.698 42.48 1.764 42.274 1.764 c
+42.117 1.764 41.969 1.709 41.834 1.602 c
+41.705 1.492 41.602 1.357 41.525 1.191 c
+41.525 -1.705 l
+40.878 -1.705 l
+40.878 2.278 l
+h
+45.905 -1.22 m
+46.118 -1.22 46.291 -1.157 46.42 -1.028 c
+46.555 -0.893 46.629 -0.702 46.64 -0.455 c
+47.257 -0.455 l
+47.235 -0.837 47.099 -1.157 46.846 -1.411 c
+46.588 -1.657 46.276 -1.778 45.905 -1.778 c
+45.412 -1.778 45.038 -1.627 44.773 -1.323 c
+44.516 -1.01 44.391 -0.544 44.391 0.073 c
+44.391 0.515 l
+44.391 1.11 44.516 1.565 44.773 1.881 c
+45.038 2.194 45.412 2.352 45.905 2.352 c
+46.306 2.352 46.625 2.22 46.86 1.955 c
+47.103 1.698 47.235 1.353 47.257 0.912 c
+46.64 0.912 l
+46.618 1.206 46.545 1.426 46.42 1.573 c
+46.302 1.72 46.129 1.794 45.905 1.794 c
+45.611 1.794 45.394 1.694 45.258 1.5 c
+45.119 1.312 45.045 1.004 45.038 0.574 c
+45.038 0.059 l
+45.038 -0.411 45.104 -0.746 45.244 -0.941 c
+45.391 -1.128 45.611 -1.22 45.905 -1.22 c
+48.654 1.867 m
+48.907 2.19 49.227 2.352 49.609 2.352 c
+50.314 2.352 50.671 1.881 50.682 0.941 c
+50.682 -1.705 l
+50.035 -1.705 l
+50.035 0.912 l
+50.035 1.224 49.98 1.444 49.874 1.573 c
+49.763 1.698 49.609 1.764 49.404 1.764 c
+49.246 1.764 49.098 1.709 48.963 1.602 c
+48.834 1.492 48.731 1.357 48.654 1.191 c
+48.654 -1.705 l
+48.007 -1.705 l
+48.007 3.94 l
+48.654 3.94 l
+h
+51.652 -2.778 m
+51.255 -2.514 l
+51.49 -2.19 51.612 -1.855 51.623 -1.514 c
+51.623 -0.897 l
+52.284 -0.897 l
+52.284 -1.425 l
+52.284 -1.683 52.219 -1.929 52.093 -2.175 c
+51.976 -2.418 51.829 -2.62 51.652 -2.778 c
+56.489 1.661 m
+56.4 1.679 56.301 1.691 56.194 1.691 c
+55.86 1.691 55.625 1.507 55.488 1.147 c
+55.488 -1.705 l
+54.842 -1.705 l
+54.842 2.278 l
+55.474 2.278 l
+55.488 1.867 l
+55.665 2.19 55.908 2.352 56.224 2.352 c
+56.33 2.352 56.419 2.33 56.489 2.294 c
+h
+58.488 -1.778 m
+57.988 -1.778 57.605 -1.631 57.341 -1.338 c
+57.077 -1.043 56.944 -0.61 56.944 -0.029 c
+56.944 0.441 l
+56.944 1.037 57.069 1.503 57.326 1.837 c
+57.591 2.18 57.951 2.352 58.414 2.352 c
+58.873 2.352 59.215 2.198 59.442 1.897 c
+59.678 1.602 59.799 1.139 59.81 0.515 c
+59.81 0.088 l
+57.591 0.088 l
+57.591 0 l
+57.591 -0.434 57.668 -0.746 57.826 -0.941 c
+57.991 -1.128 58.223 -1.22 58.517 -1.22 c
+58.711 -1.22 58.885 -1.186 59.031 -1.117 c
+59.178 -1.04 59.315 -0.922 59.442 -0.764 c
+59.781 -1.176 l
+59.494 -1.579 59.064 -1.778 58.488 -1.778 c
+58.414 1.794 m
+58.139 1.794 57.936 1.698 57.811 1.515 c
+57.682 1.326 57.609 1.037 57.591 0.647 c
+59.164 0.647 l
+59.164 0.736 l
+59.141 1.118 59.076 1.386 58.958 1.544 c
+58.84 1.709 58.657 1.794 58.414 1.794 c
+60.884 -1.705 m
+60.884 1.75 l
+60.354 1.75 l
+60.354 2.278 l
+60.884 2.278 l
+60.884 2.735 l
+60.884 3.135 60.979 3.447 61.177 3.675 c
+61.383 3.899 61.663 4.013 62.015 4.013 c
+62.151 4.013 62.283 3.992 62.412 3.954 c
+62.382 3.41 l
+62.283 3.429 62.185 3.44 62.089 3.44 c
+61.714 3.44 61.53 3.175 61.53 2.646 c
+61.53 2.278 l
+62.206 2.278 l
+62.206 1.75 l
+61.53 1.75 l
+61.53 -1.705 l
+h
+64.308 -1.778 m
+63.808 -1.778 63.427 -1.631 63.162 -1.338 c
+62.897 -1.043 62.765 -0.61 62.765 -0.029 c
+62.765 0.441 l
+62.765 1.037 62.89 1.503 63.147 1.837 c
+63.411 2.18 63.772 2.352 64.235 2.352 c
+64.695 2.352 65.036 2.198 65.264 1.897 c
+65.499 1.602 65.62 1.139 65.632 0.515 c
+65.632 0.088 l
+63.411 0.088 l
+63.411 0 l
+63.411 -0.434 63.489 -0.746 63.647 -0.941 c
+63.812 -1.128 64.044 -1.22 64.338 -1.22 c
+64.533 -1.22 64.705 -1.186 64.852 -1.117 c
+64.999 -1.04 65.135 -0.922 65.264 -0.764 c
+65.601 -1.176 l
+65.315 -1.579 64.886 -1.778 64.308 -1.778 c
+64.235 1.794 m
+63.959 1.794 63.757 1.698 63.633 1.515 c
+63.504 1.326 63.43 1.037 63.411 0.647 c
+64.984 0.647 l
+64.984 0.736 l
+64.963 1.118 64.896 1.386 64.778 1.544 c
+64.661 1.709 64.477 1.794 64.235 1.794 c
+68.057 1.661 m
+67.968 1.679 67.869 1.691 67.762 1.691 c
+67.428 1.691 67.193 1.507 67.057 1.147 c
+67.057 -1.705 l
+66.411 -1.705 l
+66.411 2.278 l
+67.043 2.278 l
+67.057 1.867 l
+67.234 2.19 67.476 2.352 67.792 2.352 c
+67.899 2.352 67.987 2.33 68.057 2.294 c
+h
+70.056 -1.778 m
+69.555 -1.778 69.173 -1.631 68.909 -1.338 c
+68.645 -1.043 68.512 -0.61 68.512 -0.029 c
+68.512 0.441 l
+68.512 1.037 68.637 1.503 68.894 1.837 c
+69.159 2.18 69.519 2.352 69.982 2.352 c
+70.442 2.352 70.783 2.198 71.011 1.897 c
+71.246 1.602 71.367 1.139 71.379 0.515 c
+71.379 0.088 l
+69.159 0.088 l
+69.159 0 l
+69.159 -0.434 69.236 -0.746 69.395 -0.941 c
+69.559 -1.128 69.791 -1.22 70.085 -1.22 c
+70.28 -1.22 70.453 -1.186 70.6 -1.117 c
+70.746 -1.04 70.883 -0.922 71.011 -0.764 c
+71.349 -1.176 l
+71.062 -1.579 70.633 -1.778 70.056 -1.778 c
+69.982 1.794 m
+69.707 1.794 69.505 1.698 69.38 1.515 c
+69.251 1.326 69.177 1.037 69.159 0.647 c
+70.731 0.647 l
+70.731 0.736 l
+70.71 1.118 70.644 1.386 70.526 1.544 c
+70.409 1.709 70.224 1.794 69.982 1.794 c
+72.775 2.278 m
+72.79 1.837 l
+73.043 2.18 73.366 2.352 73.76 2.352 c
+74.465 2.352 74.822 1.881 74.833 0.941 c
+74.833 -1.705 l
+74.186 -1.705 l
+74.186 0.912 l
+74.186 1.224 74.131 1.444 74.024 1.573 c
+73.914 1.698 73.76 1.764 73.554 1.764 c
+73.396 1.764 73.249 1.709 73.113 1.602 c
+72.984 1.492 72.882 1.357 72.805 1.191 c
+72.805 -1.705 l
+72.157 -1.705 l
+72.157 2.278 l
+h
+77.185 -1.22 m
+77.397 -1.22 77.57 -1.157 77.699 -1.028 c
+77.835 -0.893 77.908 -0.702 77.919 -0.455 c
+78.537 -0.455 l
+78.515 -0.837 78.379 -1.157 78.126 -1.411 c
+77.868 -1.657 77.555 -1.778 77.185 -1.778 c
+76.692 -1.778 76.317 -1.627 76.053 -1.323 c
+75.795 -1.01 75.67 -0.544 75.67 0.073 c
+75.67 0.515 l
+75.67 1.11 75.795 1.565 76.053 1.881 c
+76.317 2.194 76.692 2.352 77.185 2.352 c
+77.586 2.352 77.904 2.22 78.14 1.955 c
+78.382 1.698 78.515 1.353 78.537 0.912 c
+77.919 0.912 l
+77.898 1.206 77.825 1.426 77.699 1.573 c
+77.582 1.72 77.409 1.794 77.185 1.794 c
+76.89 1.794 76.674 1.694 76.538 1.5 c
+76.398 1.312 76.325 1.004 76.317 0.574 c
+76.317 0.059 l
+76.317 -0.411 76.383 -0.746 76.523 -0.941 c
+76.67 -1.128 76.89 -1.22 77.185 -1.22 c
+79.992 -1.705 -0.646 3.983 re
+80.036 3.323 m
+80.036 3.212 80.007 3.12 79.948 3.043 c
+79.889 2.973 79.793 2.94 79.668 2.94 c
+79.551 2.94 79.456 2.973 79.39 3.043 c
+79.331 3.12 79.301 3.212 79.301 3.323 c
+79.301 3.44 79.331 3.532 79.39 3.601 c
+79.456 3.678 79.551 3.719 79.668 3.719 c
+79.793 3.719 79.889 3.678 79.948 3.601 c
+80.007 3.521 80.036 3.429 80.036 3.323 c
+81.624 2.278 m
+81.638 1.837 l
+81.892 2.18 82.215 2.352 82.608 2.352 c
+83.314 2.352 83.67 1.881 83.682 0.941 c
+83.682 -1.705 l
+83.035 -1.705 l
+83.035 0.912 l
+83.035 1.224 82.98 1.444 82.873 1.573 c
+82.763 1.698 82.608 1.764 82.403 1.764 c
+82.245 1.764 82.098 1.709 81.962 1.602 c
+81.833 1.492 81.73 1.357 81.653 1.191 c
+81.653 -1.705 l
+81.006 -1.705 l
+81.006 2.278 l
+h
+84.52 0.47 m
+84.52 1.088 84.63 1.551 84.857 1.867 c
+85.081 2.19 85.416 2.352 85.857 2.352 c
+86.257 2.352 86.563 2.176 86.768 1.823 c
+86.812 2.278 l
+87.4 2.278 l
+87.4 -1.749 l
+87.4 -2.238 87.272 -2.616 87.018 -2.881 c
+86.762 -3.145 86.409 -3.278 85.96 -3.278 c
+85.761 -3.278 85.541 -3.226 85.299 -3.131 c
+85.052 -3.031 84.873 -2.91 84.755 -2.763 c
+85.019 -2.322 l
+85.284 -2.587 85.582 -2.719 85.916 -2.719 c
+86.452 -2.719 86.728 -2.425 86.739 -1.837 c
+86.739 -1.308 l
+86.533 -1.624 86.232 -1.778 85.842 -1.778 c
+85.43 -1.778 85.108 -1.627 84.873 -1.323 c
+84.645 -1.01 84.527 -0.558 84.52 0.03 c
+h
+85.181 0.088 m
+85.181 -0.353 85.243 -0.683 85.372 -0.897 c
+85.497 -1.103 85.714 -1.205 86.018 -1.205 c
+86.342 -1.205 86.581 -1.04 86.739 -0.706 c
+86.739 1.279 l
+86.57 1.602 86.332 1.764 86.018 1.764 c
+85.725 1.764 85.508 1.661 85.372 1.455 c
+85.243 1.249 85.181 0.927 85.181 0.485 c
+h
+90.928 3.234 m
+90.928 2.278 l
+91.531 2.278 l
+91.531 1.75 l
+90.928 1.75 l
+90.928 -0.72 l
+90.928 -0.878 90.951 -0.995 91.001 -1.072 c
+91.061 -1.153 91.149 -1.19 91.267 -1.19 c
+91.354 -1.19 91.443 -1.176 91.531 -1.146 c
+91.531 -1.705 l
+91.384 -1.753 91.23 -1.778 91.075 -1.778 c
+90.818 -1.778 90.623 -1.687 90.487 -1.499 c
+90.348 -1.315 90.282 -1.055 90.282 -0.72 c
+90.282 1.75 l
+89.679 1.75 l
+89.679 2.278 l
+90.282 2.278 l
+90.282 3.234 l
+h
+92.942 1.867 m
+93.195 2.19 93.515 2.352 93.897 2.352 c
+94.603 2.352 94.959 1.881 94.97 0.941 c
+94.97 -1.705 l
+94.324 -1.705 l
+94.324 0.912 l
+94.324 1.224 94.269 1.444 94.162 1.573 c
+94.052 1.698 93.897 1.764 93.692 1.764 c
+93.534 1.764 93.387 1.709 93.251 1.602 c
+93.122 1.492 93.019 1.357 92.942 1.191 c
+92.942 -1.705 l
+92.295 -1.705 l
+92.295 3.94 l
+92.942 3.94 l
+h
+97.351 -1.778 m
+96.852 -1.778 96.47 -1.631 96.206 -1.338 c
+95.94 -1.043 95.809 -0.61 95.809 -0.029 c
+95.809 0.441 l
+95.809 1.037 95.934 1.503 96.191 1.837 c
+96.455 2.18 96.815 2.352 97.278 2.352 c
+97.737 2.352 98.08 2.198 98.307 1.897 c
+98.542 1.602 98.664 1.139 98.675 0.515 c
+98.675 0.088 l
+96.455 0.088 l
+96.455 0 l
+96.455 -0.434 96.532 -0.746 96.69 -0.941 c
+96.856 -1.128 97.087 -1.22 97.382 -1.22 c
+97.576 -1.22 97.748 -1.186 97.895 -1.117 c
+98.043 -1.04 98.178 -0.922 98.307 -0.764 c
+98.645 -1.176 l
+98.359 -1.579 97.929 -1.778 97.351 -1.778 c
+97.278 1.794 m
+97.002 1.794 96.8 1.698 96.676 1.515 c
+96.547 1.326 96.474 1.037 96.455 0.647 c
+98.028 0.647 l
+98.028 0.736 l
+98.006 1.118 97.939 1.386 97.822 1.544 c
+97.704 1.709 97.521 1.794 97.278 1.794 c
+102.556 -1.22 m
+102.768 -1.22 102.941 -1.157 103.069 -1.028 c
+103.206 -0.893 103.279 -0.702 103.29 -0.455 c
+103.907 -0.455 l
+103.886 -0.837 103.749 -1.157 103.496 -1.411 c
+103.239 -1.657 102.926 -1.778 102.556 -1.778 c
+102.063 -1.778 101.688 -1.627 101.423 -1.323 c
+101.166 -1.01 101.041 -0.544 101.041 0.073 c
+101.041 0.515 l
+101.041 1.11 101.166 1.565 101.423 1.881 c
+101.688 2.194 102.063 2.352 102.556 2.352 c
+102.955 2.352 103.275 2.22 103.51 1.955 c
+103.753 1.698 103.886 1.353 103.907 0.912 c
+103.29 0.912 l
+103.268 1.206 103.194 1.426 103.069 1.573 c
+102.952 1.72 102.779 1.794 102.556 1.794 c
+102.261 1.794 102.045 1.694 101.908 1.5 c
+101.769 1.312 101.696 1.004 101.688 0.574 c
+101.688 0.059 l
+101.688 -0.411 101.754 -0.746 101.893 -0.941 c
+102.041 -1.128 102.261 -1.22 102.556 -1.22 c
+106.685 -1.352 m
+106.469 -1.639 106.157 -1.778 105.745 -1.778 c
+105.382 -1.778 105.106 -1.657 104.922 -1.411 c
+104.746 -1.157 104.65 -0.793 104.642 -0.323 c
+104.642 2.278 l
+105.289 2.278 l
+105.289 -0.264 l
+105.289 -0.893 105.473 -1.205 105.848 -1.205 c
+106.248 -1.205 106.524 -1.028 106.671 -0.675 c
+106.671 2.278 l
+107.318 2.278 l
+107.318 -1.705 l
+106.701 -1.705 l
+h
+109.949 1.661 m
+109.86 1.679 109.762 1.691 109.654 1.691 c
+109.32 1.691 109.085 1.507 108.949 1.147 c
+108.949 -1.705 l
+108.303 -1.705 l
+108.303 2.278 l
+108.935 2.278 l
+108.949 1.867 l
+109.126 2.19 109.368 2.352 109.685 2.352 c
+109.791 2.352 109.879 2.33 109.949 2.294 c
+h
+112.241 1.661 m
+112.154 1.679 112.054 1.691 111.948 1.691 c
+111.613 1.691 111.378 1.507 111.242 1.147 c
+111.242 -1.705 l
+110.595 -1.705 l
+110.595 2.278 l
+111.227 2.278 l
+111.242 1.867 l
+111.418 2.19 111.661 2.352 111.977 2.352 c
+112.083 2.352 112.172 2.33 112.241 2.294 c
+h
+114.24 -1.778 m
+113.741 -1.778 113.359 -1.631 113.095 -1.338 c
+112.829 -1.043 112.698 -0.61 112.698 -0.029 c
+112.698 0.441 l
+112.698 1.037 112.823 1.503 113.08 1.837 c
+113.344 2.18 113.704 2.352 114.167 2.352 c
+114.627 2.352 114.969 2.198 115.196 1.897 c
+115.431 1.602 115.553 1.139 115.564 0.515 c
+115.564 0.088 l
+113.344 0.088 l
+113.344 0 l
+113.344 -0.434 113.421 -0.746 113.579 -0.941 c
+113.745 -1.128 113.976 -1.22 114.271 -1.22 c
+114.465 -1.22 114.638 -1.186 114.785 -1.117 c
+114.932 -1.04 115.067 -0.922 115.196 -0.764 c
+115.534 -1.176 l
+115.248 -1.579 114.818 -1.778 114.24 -1.778 c
+114.167 1.794 m
+113.891 1.794 113.69 1.698 113.565 1.515 c
+113.436 1.326 113.363 1.037 113.344 0.647 c
+114.917 0.647 l
+114.917 0.736 l
+114.895 1.118 114.828 1.386 114.711 1.544 c
+114.593 1.709 114.41 1.794 114.167 1.794 c
+116.96 2.278 m
+116.975 1.837 l
+117.228 2.18 117.552 2.352 117.945 2.352 c
+118.651 2.352 119.007 1.881 119.019 0.941 c
+119.019 -1.705 l
+118.371 -1.705 l
+118.371 0.912 l
+118.371 1.224 118.317 1.444 118.209 1.573 c
+118.099 1.698 117.945 1.764 117.739 1.764 c
+117.581 1.764 117.434 1.709 117.298 1.602 c
+117.17 1.492 117.067 1.357 116.989 1.191 c
+116.989 -1.705 l
+116.343 -1.705 l
+116.343 2.278 l
+h
+120.841 3.234 m
+120.841 2.278 l
+121.444 2.278 l
+121.444 1.75 l
+120.841 1.75 l
+120.841 -0.72 l
+120.841 -0.878 120.863 -0.995 120.914 -1.072 c
+120.973 -1.153 121.061 -1.19 121.178 -1.19 c
+121.267 -1.19 121.355 -1.176 121.444 -1.146 c
+121.444 -1.705 l
+121.296 -1.753 121.142 -1.778 120.987 -1.778 c
+120.731 -1.778 120.536 -1.687 120.4 -1.499 c
+120.26 -1.315 120.194 -1.055 120.194 -0.72 c
+120.194 1.75 l
+119.591 1.75 l
+119.591 2.278 l
+120.194 2.278 l
+120.194 3.234 l
+h
+f
+Q
+q 1 0 0 1 754.1503 201.1039 cm
+0 0 m
+-1.088 0 l
+-1.088 2.293 l
+-2.676 2.293 l
+-2.676 0 l
+-3.763 0 l
+-3.763 5.35 l
+-2.676 5.35 l
+-2.676 3.189 l
+-1.088 3.189 l
+-1.088 5.35 l
+0 5.35 l
+h
+3.616 2.323 m
+1.94 2.323 l
+1.94 0.897 l
+3.925 0.897 l
+3.925 0 l
+0.852 0 l
+0.852 5.35 l
+3.925 5.35 l
+3.925 4.453 l
+1.94 4.453 l
+1.94 3.189 l
+3.616 3.189 l
+h
+7.1 1.103 m
+5.629 1.103 l
+5.336 0 l
+4.204 0 l
+5.865 5.35 l
+6.865 5.35 l
+8.54 0 l
+7.393 0 l
+h
+5.865 1.999 m
+6.865 1.999 l
+6.364 3.91 l
+h
+9.039 0 m
+9.039 5.35 l
+10.466 5.35 l
+11.083 5.35 11.576 5.148 11.95 4.748 c
+12.322 4.355 12.513 3.815 12.523 3.131 c
+12.523 2.263 l
+12.523 1.558 12.336 1.003 11.965 0.602 c
+11.59 0.199 11.083 0 10.437 0 c
+h
+10.127 4.453 m
+10.127 0.897 l
+10.451 0.897 l
+10.811 0.897 11.068 0.989 11.216 1.176 c
+11.362 1.371 11.436 1.698 11.436 2.161 c
+11.436 3.102 l
+11.436 3.601 11.366 3.946 11.23 4.145 c
+11.09 4.34 10.855 4.442 10.524 4.453 c
+h
+f
+Q
+q 1 0 0 1 767.5407 201.4567 cm
+0 0 m
+0 0.118 0.033 0.213 0.104 0.294 c
+0.169 0.371 0.272 0.411 0.412 0.411 c
+0.559 0.411 0.665 0.371 0.735 0.294 c
+0.813 0.213 0.852 0.118 0.852 0 c
+0.852 -0.11 0.813 -0.202 0.735 -0.279 c
+0.665 -0.357 0.559 -0.397 0.412 -0.397 c
+0.272 -0.397 0.169 -0.357 0.104 -0.279 c
+0.033 -0.202 0 -0.11 0 0 c
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 195.5 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 188.6608 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.646 -0.242 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.263 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.141 1.279 -3.218 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.319 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.318 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.476 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.2 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.52 -2.484 5.403 -2.396 c
+5.285 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.214 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.815 0.243 4.815 0.5 c
+4.815 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.189 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.029 7.122 2.076 7.122 2.117 c
+7.13 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.992 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.872 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.226 1.621 6.137 1.573 c
+6.056 1.532 5.991 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.498 3.117 l
+14.498 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.498 1.602 l
+14.498 -0.103 l
+14.498 -0.323 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.675 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.675 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.042 -1.301 14.942 -1.308 14.836 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.263 c
+14.222 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.792 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.677 -1.323 m
+22.391 -1.323 22.148 -1.282 21.943 -1.205 c
+21.737 -1.117 21.564 -0.995 21.428 -0.837 c
+21.288 -0.683 21.185 -0.496 21.12 -0.279 c
+21.049 -0.055 21.016 0.191 21.016 0.456 c
+21.016 0.75 21.049 1.008 21.12 1.235 c
+21.197 1.459 21.303 1.646 21.442 1.794 c
+21.59 1.948 21.766 2.066 21.972 2.147 c
+22.178 2.234 22.413 2.278 22.677 2.278 c
+22.901 2.278 23.104 2.249 23.28 2.19 c
+23.456 2.132 23.607 2.047 23.736 1.941 c
+23.861 1.841 23.963 1.72 24.044 1.573 c
+24.122 1.434 24.177 1.283 24.206 1.118 c
+23.295 1.073 l
+23.265 1.249 23.196 1.389 23.089 1.5 c
+22.99 1.606 22.847 1.661 22.662 1.661 c
+22.417 1.661 22.24 1.559 22.134 1.353 c
+22.024 1.154 21.972 0.867 21.972 0.485 c
+21.972 -0.309 22.207 -0.706 22.677 -0.706 c
+22.843 -0.706 22.986 -0.654 23.104 -0.544 c
+23.221 -0.437 23.295 -0.276 23.324 -0.058 c
+24.235 -0.103 l
+24.206 -0.272 24.151 -0.426 24.073 -0.573 c
+24.004 -0.72 23.901 -0.852 23.765 -0.97 c
+23.636 -1.08 23.478 -1.168 23.295 -1.234 c
+23.119 -1.294 22.913 -1.323 22.677 -1.323 c
+26.076 1.515 m
+26.194 1.786 26.344 1.985 26.532 2.103 c
+26.716 2.22 26.936 2.278 27.194 2.278 c
+27.399 2.278 27.568 2.242 27.708 2.176 c
+27.855 2.106 27.965 2.014 28.046 1.897 c
+28.135 1.779 28.193 1.636 28.222 1.47 c
+28.259 1.301 28.281 1.125 28.281 0.941 c
+28.281 -1.263 l
+27.37 -1.263 l
+27.37 0.736 l
+27.37 0.871 27.359 0.992 27.341 1.103 c
+27.329 1.209 27.304 1.297 27.267 1.367 c
+27.227 1.444 27.168 1.503 27.09 1.544 c
+27.021 1.58 26.929 1.602 26.811 1.602 c
+26.701 1.602 26.606 1.577 26.518 1.529 c
+26.429 1.478 26.348 1.411 26.282 1.324 c
+26.223 1.235 26.172 1.125 26.136 1 c
+26.106 0.882 26.091 0.75 26.091 0.603 c
+26.091 -1.263 l
+25.18 -1.263 l
+25.18 3.514 l
+26.091 3.514 l
+26.091 2.205 l
+26.091 2.135 26.084 2.066 26.076 1.999 c
+26.076 1.794 l
+26.076 1.735 26.069 1.679 26.061 1.632 c
+26.061 1.515 l
+h
+30.799 -1.323 m
+30.541 -1.323 30.313 -1.286 30.107 -1.22 c
+29.902 -1.143 29.725 -1.028 29.579 -0.881 c
+29.432 -0.727 29.314 -0.536 29.226 -0.309 c
+29.145 -0.085 29.108 0.181 29.108 0.485 c
+29.108 0.816 29.153 1.095 29.24 1.324 c
+29.336 1.559 29.465 1.742 29.623 1.881 c
+29.788 2.018 29.976 2.117 30.181 2.176 c
+30.387 2.242 30.597 2.278 30.813 2.278 c
+31.085 2.278 31.32 2.227 31.518 2.132 c
+31.725 2.043 31.89 1.912 32.019 1.735 c
+32.154 1.565 32.254 1.36 32.313 1.118 c
+32.378 0.882 32.415 0.618 32.415 0.324 c
+32.415 0.309 l
+30.049 0.309 l
+30.049 0.162 30.063 0.023 30.093 -0.103 c
+30.13 -0.231 30.185 -0.345 30.255 -0.44 c
+30.321 -0.529 30.406 -0.598 30.504 -0.646 c
+30.6 -0.698 30.714 -0.72 30.843 -0.72 c
+30.997 -0.72 31.137 -0.687 31.254 -0.617 c
+31.379 -0.551 31.468 -0.448 31.518 -0.309 c
+32.357 -0.382 l
+32.328 -0.481 32.272 -0.588 32.195 -0.706 c
+32.114 -0.816 32.011 -0.918 31.886 -1.014 c
+31.769 -1.103 31.615 -1.176 31.431 -1.234 c
+31.254 -1.294 31.041 -1.323 30.799 -1.323 c
+30.799 1.706 m
+30.71 1.706 30.622 1.691 30.534 1.661 c
+30.446 1.632 30.365 1.58 30.298 1.515 c
+30.229 1.444 30.17 1.357 30.122 1.249 c
+30.082 1.139 30.063 1.014 30.063 0.867 c
+31.534 0.867 l
+31.534 1.004 31.508 1.125 31.46 1.235 c
+31.42 1.341 31.364 1.43 31.298 1.5 c
+31.239 1.565 31.166 1.617 31.078 1.646 c
+30.99 1.683 30.894 1.706 30.799 1.706 c
+34.863 -1.323 m
+34.576 -1.323 34.333 -1.282 34.128 -1.205 c
+33.922 -1.117 33.749 -0.995 33.614 -0.837 c
+33.473 -0.683 33.371 -0.496 33.305 -0.279 c
+33.235 -0.055 33.201 0.191 33.201 0.456 c
+33.201 0.75 33.235 1.008 33.305 1.235 c
+33.382 1.459 33.488 1.646 33.628 1.794 c
+33.775 1.948 33.951 2.066 34.157 2.147 c
+34.363 2.234 34.599 2.278 34.863 2.278 c
+35.087 2.278 35.289 2.249 35.466 2.19 c
+35.642 2.132 35.792 2.047 35.921 1.941 c
+36.046 1.841 36.149 1.72 36.23 1.573 c
+36.307 1.434 36.362 1.283 36.392 1.118 c
+35.48 1.073 l
+35.451 1.249 35.381 1.389 35.274 1.5 c
+35.175 1.606 35.032 1.661 34.848 1.661 c
+34.602 1.661 34.425 1.559 34.319 1.353 c
+34.209 1.154 34.157 0.867 34.157 0.485 c
+34.157 -0.309 34.393 -0.706 34.863 -0.706 c
+35.028 -0.706 35.171 -0.654 35.289 -0.544 c
+35.407 -0.437 35.48 -0.276 35.509 -0.058 c
+36.421 -0.103 l
+36.392 -0.272 36.336 -0.426 36.259 -0.573 c
+36.189 -0.72 36.087 -0.852 35.95 -0.97 c
+35.822 -1.08 35.664 -1.168 35.48 -1.234 c
+35.304 -1.294 35.098 -1.323 34.863 -1.323 c
+39.688 -1.263 m
+38.761 0.309 l
+38.365 0.044 l
+38.365 -1.263 l
+37.469 -1.263 l
+37.469 3.514 l
+38.365 3.514 l
+38.365 0.779 l
+39.615 2.22 l
+40.584 2.22 l
+39.364 0.853 l
+40.673 -1.263 l
+h
+44.631 0.485 m
+44.631 0.21 44.594 -0.04 44.527 -0.264 c
+44.457 -0.481 44.355 -0.669 44.219 -0.823 c
+44.079 -0.981 43.902 -1.103 43.69 -1.19 c
+43.473 -1.278 43.219 -1.323 42.925 -1.323 c
+42.649 -1.323 42.404 -1.278 42.19 -1.19 c
+41.984 -1.103 41.812 -0.981 41.676 -0.823 c
+41.536 -0.669 41.433 -0.481 41.367 -0.264 c
+41.297 -0.04 41.265 0.21 41.265 0.485 c
+41.265 0.738 41.294 0.974 41.352 1.191 c
+41.419 1.415 41.521 1.606 41.662 1.764 c
+41.797 1.929 41.974 2.058 42.19 2.147 c
+42.404 2.234 42.661 2.278 42.955 2.278 c
+43.267 2.278 43.528 2.234 43.734 2.147 c
+43.947 2.058 44.12 1.929 44.249 1.764 c
+44.384 1.606 44.484 1.415 44.542 1.191 c
+44.601 0.974 44.631 0.738 44.631 0.485 c
+43.675 0.485 m
+43.675 0.691 43.661 0.867 43.631 1.014 c
+43.609 1.162 43.572 1.283 43.513 1.382 c
+43.455 1.478 43.381 1.548 43.293 1.588 c
+43.204 1.636 43.094 1.661 42.969 1.661 c
+42.705 1.661 42.514 1.562 42.396 1.367 c
+42.279 1.18 42.219 0.886 42.219 0.485 c
+42.219 0.063 42.279 -0.243 42.396 -0.426 c
+42.514 -0.613 42.69 -0.706 42.925 -0.706 c
+43.05 -0.706 43.164 -0.687 43.264 -0.646 c
+43.359 -0.598 43.44 -0.525 43.499 -0.426 c
+43.565 -0.33 43.609 -0.205 43.631 -0.058 c
+43.661 0.088 43.675 0.268 43.675 0.485 c
+46.368 2.22 m
+46.368 0.265 l
+46.368 0.125 46.376 0 46.398 -0.118 c
+46.416 -0.228 46.449 -0.32 46.501 -0.397 c
+46.549 -0.478 46.607 -0.54 46.678 -0.588 c
+46.743 -0.628 46.828 -0.646 46.927 -0.646 c
+47.015 -0.646 47.096 -0.628 47.177 -0.588 c
+47.266 -0.54 47.339 -0.47 47.397 -0.382 c
+47.457 -0.286 47.501 -0.176 47.53 -0.058 c
+47.567 0.067 47.588 0.206 47.588 0.353 c
+47.588 2.22 l
+48.485 2.22 l
+48.485 -0.484 l
+48.485 -0.72 l
+48.492 -0.801 48.5 -0.878 48.5 -0.955 c
+48.5 -1.146 l
+48.507 -1.198 48.515 -1.234 48.515 -1.263 c
+47.662 -1.263 l
+47.651 -1.234 47.64 -1.198 47.632 -1.146 c
+47.632 -0.955 l
+47.632 -0.889 47.625 -0.819 47.618 -0.75 c
+47.618 -0.573 l
+47.603 -0.573 l
+47.486 -0.837 47.331 -1.028 47.148 -1.146 c
+46.971 -1.263 46.769 -1.323 46.545 -1.323 c
+46.339 -1.323 46.167 -1.286 46.03 -1.22 c
+45.891 -1.153 45.78 -1.058 45.693 -0.941 c
+45.612 -0.823 45.552 -0.687 45.516 -0.529 c
+45.487 -0.363 45.472 -0.187 45.472 0 c
+45.472 2.22 l
+h
+50.15 1.602 m
+49.606 1.602 l
+49.606 2.22 l
+50.194 2.22 l
+50.474 3.117 l
+51.046 3.117 l
+51.046 2.22 l
+52.282 2.22 l
+52.282 1.602 l
+51.046 1.602 l
+51.046 -0.103 l
+51.046 -0.323 l
+51.054 -0.393 51.076 -0.455 51.106 -0.515 c
+51.142 -0.565 51.197 -0.61 51.267 -0.646 c
+51.345 -0.675 51.458 -0.691 51.605 -0.691 c
+51.741 -0.691 51.877 -0.687 52.016 -0.675 c
+52.153 -0.658 52.285 -0.632 52.413 -0.602 c
+52.413 -1.205 l
+52.332 -1.216 52.255 -1.23 52.178 -1.249 c
+52.097 -1.261 52.02 -1.267 51.943 -1.278 c
+51.862 -1.286 51.775 -1.294 51.679 -1.294 c
+51.59 -1.301 51.491 -1.308 51.384 -1.308 c
+51.197 -1.308 51.035 -1.294 50.9 -1.263 c
+50.771 -1.227 50.657 -1.183 50.561 -1.132 c
+50.474 -1.084 50.4 -1.025 50.341 -0.955 c
+50.283 -0.878 50.238 -0.801 50.208 -0.72 c
+50.179 -0.632 50.157 -0.544 50.15 -0.455 c
+50.139 -0.36 50.135 -0.264 50.135 -0.176 c
+h
+58.422 -2.631 m
+58.422 3.514 l
+60.347 3.514 l
+60.347 2.896 l
+59.274 2.896 l
+59.274 -2.013 l
+60.347 -2.013 l
+60.347 -2.631 l
+h
+62.32 0.838 1.867 -0.794 re
+62.32 0.044 m
+65.793 -1.263 m
+65.793 -0.97 l
+65.801 -0.833 65.808 -0.675 65.808 -0.5 c
+65.808 3.514 l
+66.719 3.514 l
+66.719 2.234 l
+66.719 2.072 l
+66.719 1.897 l
+66.719 1.845 66.712 1.801 66.705 1.764 c
+66.705 1.676 l
+66.719 1.676 l
+66.767 1.783 66.829 1.874 66.91 1.955 c
+66.987 2.032 67.072 2.095 67.16 2.147 c
+67.249 2.194 67.34 2.227 67.44 2.249 c
+67.535 2.267 67.634 2.278 67.733 2.278 c
+67.947 2.278 68.134 2.234 68.292 2.147 c
+68.446 2.058 68.575 1.929 68.674 1.764 c
+68.781 1.606 68.858 1.415 68.909 1.191 c
+68.957 0.974 68.983 0.736 68.983 0.47 c
+68.983 0.214 68.953 -0.025 68.895 -0.249 c
+68.836 -0.467 68.751 -0.658 68.645 -0.823 c
+68.535 -0.981 68.402 -1.103 68.248 -1.19 c
+68.09 -1.278 67.91 -1.323 67.704 -1.323 c
+67.605 -1.323 67.506 -1.311 67.411 -1.294 c
+67.322 -1.271 67.234 -1.242 67.145 -1.19 c
+67.058 -1.132 66.977 -1.066 66.91 -0.985 c
+66.84 -0.908 66.778 -0.808 66.719 -0.691 c
+66.705 -0.691 l
+66.705 -0.852 l
+66.705 -0.911 66.697 -0.97 66.69 -1.028 c
+66.69 -1.08 66.682 -1.128 66.675 -1.176 c
+66.675 -1.216 66.668 -1.246 66.661 -1.263 c
+h
+66.705 0.5 m
+66.705 0.265 66.723 0.067 66.763 -0.087 c
+66.811 -0.246 66.87 -0.367 66.94 -0.455 c
+67.006 -0.544 67.079 -0.61 67.16 -0.646 c
+67.237 -0.687 67.315 -0.706 67.396 -0.706 c
+67.602 -0.706 67.756 -0.61 67.866 -0.411 c
+67.983 -0.216 68.043 0.077 68.043 0.47 c
+68.043 0.684 68.02 0.867 67.983 1.014 c
+67.954 1.168 67.91 1.294 67.851 1.382 c
+67.8 1.478 67.733 1.551 67.646 1.602 c
+67.565 1.65 67.476 1.676 67.38 1.676 c
+67.3 1.676 67.222 1.654 67.145 1.617 c
+67.064 1.577 66.991 1.515 66.925 1.426 c
+66.867 1.338 66.811 1.213 66.763 1.058 c
+66.723 0.912 66.705 0.724 66.705 0.5 c
+70.221 -2.631 m
+70.221 -2.013 l
+71.295 -2.013 l
+71.295 2.896 l
+70.221 2.896 l
+70.221 3.514 l
+72.147 3.514 l
+72.147 -2.631 l
+h
+78.729 -2.631 m
+78.729 3.514 l
+80.654 3.514 l
+80.654 2.896 l
+79.581 2.896 l
+79.581 -2.013 l
+80.654 -2.013 l
+80.654 -2.631 l
+h
+84.23 -1.263 m
+84.23 0.721 l
+84.23 1.022 84.186 1.243 84.097 1.382 c
+84.017 1.529 83.88 1.602 83.685 1.602 c
+83.575 1.602 83.473 1.577 83.377 1.529 c
+83.289 1.478 83.208 1.411 83.142 1.324 c
+83.083 1.235 83.031 1.125 82.995 1 c
+82.966 0.882 82.951 0.75 82.951 0.603 c
+82.951 -1.263 l
+82.039 -1.263 l
+82.039 1.441 l
+82.039 1.661 l
+82.039 1.75 82.032 1.827 82.025 1.897 c
+82.025 2.087 l
+82.025 2.22 l
+82.877 2.22 l
+82.885 2.19 82.892 2.147 82.892 2.087 c
+82.892 1.897 l
+82.899 1.827 82.906 1.756 82.906 1.691 c
+82.914 1.621 82.922 1.565 82.922 1.529 c
+82.937 1.529 l
+83.054 1.794 83.205 1.985 83.392 2.103 c
+83.575 2.22 83.796 2.278 84.053 2.278 c
+84.237 2.278 84.398 2.249 84.539 2.19 c
+84.674 2.132 84.788 2.043 84.876 1.926 c
+84.965 1.808 85.027 1.665 85.067 1.5 c
+85.115 1.341 85.141 1.154 85.141 0.941 c
+85.141 -1.263 l
+h
+87.055 -1.323 m
+86.887 -1.323 86.736 -1.301 86.6 -1.263 c
+86.471 -1.216 86.357 -1.146 86.262 -1.058 c
+86.174 -0.97 86.104 -0.864 86.056 -0.735 c
+86.004 -0.598 85.983 -0.448 85.983 -0.279 c
+85.983 -0.073 86.016 0.096 86.085 0.235 c
+86.152 0.383 86.247 0.493 86.365 0.574 c
+86.49 0.661 86.633 0.724 86.791 0.765 c
+86.956 0.802 87.132 0.827 87.32 0.838 c
+88.04 0.853 l
+88.04 1.029 l
+88.04 1.147 88.03 1.249 88.011 1.338 c
+87.989 1.426 87.955 1.492 87.908 1.544 c
+87.868 1.602 87.82 1.639 87.761 1.661 c
+87.702 1.679 87.636 1.691 87.57 1.691 c
+87.5 1.691 87.438 1.679 87.379 1.661 c
+87.328 1.65 87.28 1.625 87.232 1.588 c
+87.192 1.559 87.159 1.507 87.129 1.441 c
+87.107 1.382 87.093 1.301 87.085 1.206 c
+86.144 1.249 l
+86.174 1.397 86.218 1.532 86.276 1.661 c
+86.343 1.786 86.438 1.897 86.556 1.985 c
+86.673 2.08 86.813 2.153 86.982 2.205 c
+87.159 2.253 87.365 2.278 87.6 2.278 c
+88.04 2.278 88.371 2.168 88.599 1.955 c
+88.834 1.75 88.952 1.441 88.952 1.029 c
+88.952 -0.235 l
+88.952 -0.455 l
+88.959 -0.515 88.974 -0.569 88.996 -0.617 c
+89.014 -0.658 89.044 -0.691 89.084 -0.72 c
+89.121 -0.742 89.172 -0.75 89.231 -0.75 c
+89.297 -0.75 89.366 -0.746 89.437 -0.735 c
+89.437 -1.22 l
+89.378 -1.23 89.323 -1.242 89.275 -1.249 c
+89.235 -1.261 89.194 -1.267 89.158 -1.278 c
+89.117 -1.286 89.073 -1.294 89.025 -1.294 c
+88.974 -1.301 88.915 -1.308 88.849 -1.308 c
+88.62 -1.308 88.456 -1.257 88.349 -1.146 c
+88.239 -1.028 88.176 -0.864 88.158 -0.646 c
+88.143 -0.646 l
+88.073 -0.756 88.003 -0.852 87.938 -0.941 c
+87.868 -1.022 87.791 -1.087 87.702 -1.146 c
+87.614 -1.205 87.515 -1.249 87.408 -1.278 c
+87.309 -1.308 87.192 -1.323 87.055 -1.323 c
+88.04 0.353 m
+87.614 0.339 l
+87.515 0.339 87.423 0.331 87.334 0.324 c
+87.254 0.312 87.188 0.287 87.129 0.25 c
+87.07 0.21 87.018 0.151 86.982 0.073 c
+86.941 0.004 86.923 -0.087 86.923 -0.205 c
+86.923 -0.374 86.956 -0.496 87.026 -0.573 c
+87.093 -0.654 87.192 -0.691 87.32 -0.691 c
+87.427 -0.691 87.525 -0.669 87.614 -0.617 c
+87.71 -0.569 87.791 -0.507 87.849 -0.426 c
+87.915 -0.349 87.967 -0.261 87.996 -0.162 c
+88.026 -0.055 88.04 0.059 88.04 0.177 c
+h
+91.322 -1.263 m
+91.322 0.853 l
+91.322 1.018 91.315 1.154 91.307 1.264 c
+91.296 1.371 91.278 1.455 91.248 1.515 c
+91.226 1.58 91.197 1.632 91.16 1.661 c
+91.13 1.691 91.091 1.706 91.043 1.706 c
+90.984 1.706 90.929 1.676 90.881 1.617 c
+90.841 1.565 90.808 1.492 90.778 1.397 c
+90.748 1.309 90.723 1.195 90.704 1.058 c
+90.694 0.919 90.69 0.769 90.69 0.603 c
+90.69 -1.263 l
+89.94 -1.263 l
+89.94 1.47 l
+89.94 1.706 l
+89.94 1.926 l
+89.94 2.003 89.933 2.066 89.925 2.117 c
+89.925 2.22 l
+90.602 2.22 l
+90.602 2.132 l
+90.602 1.985 l
+90.609 1.926 90.617 1.867 90.617 1.808 c
+90.617 1.646 l
+90.631 1.646 l
+90.65 1.735 90.679 1.812 90.719 1.881 c
+90.756 1.959 90.8 2.029 90.852 2.087 c
+90.91 2.147 90.976 2.19 91.057 2.22 c
+91.134 2.257 91.223 2.278 91.322 2.278 c
+91.506 2.278 91.645 2.224 91.733 2.117 c
+91.829 2.018 91.899 1.86 91.939 1.646 c
+91.953 1.646 l
+91.991 1.742 92.032 1.831 92.071 1.912 c
+92.119 1.989 92.175 2.051 92.233 2.103 c
+92.292 2.161 92.358 2.205 92.439 2.234 c
+92.516 2.264 92.604 2.278 92.703 2.278 c
+92.84 2.278 92.954 2.253 93.042 2.205 c
+93.129 2.153 93.196 2.08 93.247 1.985 c
+93.306 1.885 93.343 1.756 93.365 1.602 c
+93.395 1.455 93.409 1.272 93.409 1.058 c
+93.409 -1.263 l
+92.689 -1.263 l
+92.689 0.853 l
+92.689 1.018 92.682 1.154 92.674 1.264 c
+92.663 1.371 92.645 1.455 92.616 1.515 c
+92.593 1.58 92.564 1.632 92.527 1.661 c
+92.498 1.691 92.458 1.706 92.41 1.706 c
+92.292 1.706 92.196 1.617 92.13 1.441 c
+92.071 1.272 92.042 1.014 92.042 0.661 c
+92.042 -1.263 l
+h
+95.783 -1.323 m
+95.525 -1.323 95.298 -1.286 95.092 -1.22 c
+94.887 -1.143 94.71 -1.028 94.563 -0.881 c
+94.416 -0.727 94.299 -0.536 94.21 -0.309 c
+94.129 -0.085 94.093 0.181 94.093 0.485 c
+94.093 0.816 94.137 1.095 94.225 1.324 c
+94.32 1.559 94.449 1.742 94.607 1.881 c
+94.773 2.018 94.96 2.117 95.166 2.176 c
+95.371 2.242 95.581 2.278 95.797 2.278 c
+96.069 2.278 96.304 2.227 96.503 2.132 c
+96.709 2.043 96.875 1.912 97.003 1.735 c
+97.139 1.565 97.239 1.36 97.297 1.118 c
+97.363 0.882 97.4 0.618 97.4 0.324 c
+97.4 0.309 l
+95.034 0.309 l
+95.034 0.162 95.049 0.023 95.078 -0.103 c
+95.114 -0.231 95.169 -0.345 95.24 -0.44 c
+95.305 -0.529 95.39 -0.598 95.489 -0.646 c
+95.585 -0.698 95.699 -0.72 95.828 -0.72 c
+95.982 -0.72 96.121 -0.687 96.239 -0.617 c
+96.364 -0.551 96.452 -0.448 96.503 -0.309 c
+97.341 -0.382 l
+97.312 -0.481 97.256 -0.588 97.179 -0.706 c
+97.098 -0.816 96.996 -0.918 96.871 -1.014 c
+96.753 -1.103 96.599 -1.176 96.415 -1.234 c
+96.239 -1.294 96.026 -1.323 95.783 -1.323 c
+95.783 1.706 m
+95.695 1.706 95.606 1.691 95.519 1.661 c
+95.43 1.632 95.35 1.58 95.284 1.515 c
+95.213 1.444 95.155 1.357 95.107 1.249 c
+95.066 1.139 95.049 1.014 95.049 0.867 c
+96.518 0.867 l
+96.518 1.004 96.493 1.125 96.445 1.235 c
+96.404 1.341 96.349 1.43 96.283 1.5 c
+96.224 1.565 96.15 1.617 96.063 1.646 c
+95.974 1.683 95.878 1.706 95.783 1.706 c
+98.653 -2.631 m
+98.653 -2.013 l
+99.726 -2.013 l
+99.726 2.896 l
+98.653 2.896 l
+98.653 3.514 l
+100.578 3.514 l
+100.578 -2.631 l
+h
+f
+Q
+q 1 0 0 1 545.9966 173.8592 cm
+0 0 m
+0 0.264 -0.073 0.463 -0.22 0.603 c
+-0.36 0.75 -0.617 0.889 -0.999 1.029 c
+-1.374 1.165 -1.66 1.309 -1.866 1.455 c
+-2.065 1.602 -2.212 1.768 -2.308 1.955 c
+-2.406 2.15 -2.454 2.37 -2.454 2.616 c
+-2.454 3.035 -2.315 3.385 -2.028 3.66 c
+-1.745 3.932 -1.378 4.072 -0.926 4.072 c
+-0.613 4.072 -0.334 3.998 -0.088 3.851 c
+0.154 3.711 0.342 3.516 0.47 3.263 c
+0.607 3.017 0.676 2.749 0.676 2.454 c
+0 2.454 l
+0 2.786 -0.081 3.042 -0.235 3.219 c
+-0.393 3.403 -0.625 3.499 -0.926 3.499 c
+-1.19 3.499 -1.404 3.418 -1.558 3.263 c
+-1.705 3.116 -1.778 2.903 -1.778 2.631 c
+-1.778 2.404 -1.701 2.212 -1.543 2.057 c
+-1.378 1.911 -1.124 1.771 -0.779 1.646 c
+-0.261 1.477 0.11 1.268 0.339 1.014 c
+0.574 0.757 0.691 0.426 0.691 0.015 c
+0.691 -0.426 0.548 -0.779 0.264 -1.043 c
+-0.022 -1.301 -0.404 -1.426 -0.881 -1.426 c
+-1.198 -1.426 -1.484 -1.357 -1.749 -1.22 c
+-2.013 -1.084 -2.227 -0.893 -2.381 -0.647 c
+-2.528 -0.405 -2.601 -0.118 -2.601 0.206 c
+-1.926 0.206 l
+-1.926 -0.129 -1.833 -0.389 -1.646 -0.573 c
+-1.462 -0.761 -1.205 -0.852 -0.881 -0.852 c
+-0.588 -0.852 -0.367 -0.779 -0.22 -0.632 c
+-0.073 -0.478 0 -0.264 0 0 c
+4.439 -0.206 m
+5.042 2.631 l
+5.689 2.631 l
+4.704 -1.353 l
+4.189 -1.353 l
+3.41 1.5 l
+2.66 -1.353 l
+2.132 -1.353 l
+1.176 2.631 l
+1.808 2.631 l
+2.425 -0.133 l
+3.161 2.631 l
+3.675 2.631 l
+h
+7.071 -1.353 -0.647 3.984 re
+7.115 3.675 m
+7.115 3.564 7.085 3.472 7.026 3.395 c
+6.967 3.326 6.872 3.293 6.747 3.293 c
+6.629 3.293 6.534 3.326 6.468 3.395 c
+6.409 3.472 6.379 3.564 6.379 3.675 c
+6.379 3.792 6.409 3.884 6.468 3.954 c
+6.534 4.031 6.629 4.072 6.747 4.072 c
+6.872 4.072 6.967 4.031 7.026 3.954 c
+7.085 3.873 7.115 3.781 7.115 3.675 c
+8.937 3.586 m
+8.937 2.631 l
+9.54 2.631 l
+9.54 2.102 l
+8.937 2.102 l
+8.937 -0.368 l
+8.937 -0.526 8.96 -0.643 9.01 -0.721 c
+9.07 -0.801 9.158 -0.838 9.276 -0.838 c
+9.363 -0.838 9.452 -0.823 9.54 -0.794 c
+9.54 -1.353 l
+9.393 -1.4 9.239 -1.426 9.084 -1.426 c
+8.827 -1.426 8.632 -1.334 8.496 -1.147 c
+8.357 -0.963 8.291 -0.702 8.291 -0.368 c
+8.291 2.102 l
+7.688 2.102 l
+7.688 2.631 l
+8.291 2.631 l
+8.291 3.586 l
+h
+11.686 -0.867 m
+11.899 -0.867 12.072 -0.805 12.201 -0.676 c
+12.337 -0.54 12.41 -0.349 12.421 -0.103 c
+13.039 -0.103 l
+13.016 -0.485 12.881 -0.805 12.627 -1.058 c
+12.37 -1.305 12.057 -1.426 11.686 -1.426 c
+11.194 -1.426 10.818 -1.276 10.554 -0.97 c
+10.297 -0.658 10.172 -0.191 10.172 0.426 c
+10.172 0.867 l
+10.172 1.463 10.297 1.918 10.554 2.234 c
+10.818 2.547 11.194 2.705 11.686 2.705 c
+12.087 2.705 12.406 2.572 12.642 2.308 c
+12.884 2.051 13.016 1.705 13.039 1.264 c
+12.421 1.264 l
+12.399 1.558 12.326 1.779 12.201 1.926 c
+12.083 2.072 11.91 2.146 11.686 2.146 c
+11.392 2.146 11.175 2.047 11.04 1.852 c
+10.899 1.664 10.826 1.356 10.818 0.926 c
+10.818 0.411 l
+10.818 -0.059 10.885 -0.393 11.025 -0.588 c
+11.171 -0.775 11.392 -0.867 11.686 -0.867 c
+14.435 2.219 m
+14.689 2.543 15.008 2.705 15.391 2.705 c
+16.096 2.705 16.452 2.234 16.463 1.294 c
+16.463 -1.353 l
+15.817 -1.353 l
+15.817 1.264 l
+15.817 1.577 15.761 1.797 15.655 1.926 c
+15.545 2.051 15.391 2.117 15.185 2.117 c
+15.026 2.117 14.88 2.061 14.743 1.955 c
+14.614 1.845 14.512 1.708 14.435 1.544 c
+14.435 -1.353 l
+13.787 -1.353 l
+13.787 4.292 l
+14.435 4.292 l
+h
+f
+Q
+q 1 0 0 1 567.9281 174.2562 cm
+0 0 m
+0.353 2.234 l
+1.352 2.234 l
+0.529 -1.75 l
+-0.339 -1.75 l
+-0.897 0.559 l
+-1.455 -1.75 l
+-2.323 -1.75 l
+-3.146 2.234 l
+-2.147 2.234 l
+-1.794 0 l
+-1.264 2.234 l
+-0.53 2.234 l
+h
+1.749 0.367 m
+1.749 0.974 1.889 1.448 2.175 1.793 c
+2.458 2.135 2.851 2.308 3.351 2.308 c
+3.858 2.308 4.255 2.135 4.542 1.793 c
+4.825 1.448 4.968 0.974 4.968 0.367 c
+4.968 0.103 l
+4.968 -0.497 4.825 -0.967 4.542 -1.309 c
+4.255 -1.654 3.858 -1.823 3.351 -1.823 c
+2.84 -1.823 2.443 -1.654 2.161 -1.309 c
+1.885 -0.967 1.749 -0.493 1.749 0.118 c
+h
+2.792 0.103 m
+2.792 -0.603 2.977 -0.956 3.351 -0.956 c
+3.704 -0.956 3.895 -0.661 3.925 -0.073 c
+3.925 0.367 l
+3.925 0.727 3.873 0.999 3.777 1.176 c
+3.678 1.352 3.535 1.44 3.351 1.44 c
+3.175 1.44 3.035 1.352 2.94 1.176 c
+2.84 0.999 2.792 0.727 2.792 0.367 c
+h
+7.57 1.22 m
+7.231 1.249 l
+6.945 1.249 6.754 1.124 6.659 0.881 c
+6.659 -1.75 l
+5.614 -1.75 l
+5.614 2.234 l
+6.585 2.234 l
+6.614 1.793 l
+6.78 2.135 7.011 2.308 7.305 2.308 c
+7.422 2.308 7.515 2.285 7.584 2.248 c
+h
+9.437 -0.221 m
+9.157 -0.53 l
+9.157 -1.75 l
+8.114 -1.75 l
+8.114 3.895 l
+9.157 3.895 l
+9.157 0.852 l
+9.275 1.043 l
+9.995 2.234 l
+11.245 2.234 l
+10.083 0.588 l
+11.347 -1.75 l
+10.157 -1.75 l
+h
+12.802 -1.75 -1.043 3.984 re
+11.715 3.263 m
+11.715 3.418 11.763 3.546 11.862 3.645 c
+11.968 3.752 12.104 3.807 12.274 3.807 c
+12.45 3.807 12.586 3.752 12.685 3.645 c
+12.791 3.546 12.847 3.418 12.847 3.263 c
+12.847 3.094 12.791 2.958 12.685 2.851 c
+12.586 2.753 12.45 2.705 12.274 2.705 c
+12.104 2.705 11.968 2.753 11.862 2.851 c
+11.763 2.958 11.715 3.094 11.715 3.263 c
+14.566 2.234 m
+14.596 1.837 l
+14.831 2.15 15.133 2.308 15.507 2.308 c
+16.191 2.308 16.544 1.826 16.565 0.867 c
+16.565 -1.75 l
+15.522 -1.75 l
+15.522 0.794 l
+15.522 1.018 15.485 1.18 15.419 1.278 c
+15.349 1.374 15.232 1.425 15.066 1.425 c
+14.879 1.425 14.732 1.33 14.626 1.147 c
+14.626 -1.75 l
+13.581 -1.75 l
+13.581 2.234 l
+h
+17.183 0.367 m
+17.183 1.014 17.3 1.5 17.535 1.822 c
+17.771 2.146 18.102 2.308 18.535 2.308 c
+18.888 2.308 19.16 2.165 19.359 1.881 c
+19.403 2.234 l
+20.344 2.234 l
+20.344 -1.75 l
+20.344 -2.257 20.2 -2.646 19.917 -2.911 c
+19.63 -3.183 19.226 -3.322 18.697 -3.322 c
+18.47 -3.322 18.234 -3.278 17.992 -3.19 c
+17.756 -3.102 17.58 -2.988 17.462 -2.851 c
+17.815 -2.132 l
+17.911 -2.238 18.039 -2.323 18.197 -2.381 c
+18.352 -2.448 18.499 -2.484 18.638 -2.484 c
+18.873 -2.484 19.039 -2.425 19.137 -2.308 c
+19.245 -2.198 19.299 -2.022 19.299 -1.779 c
+19.299 -1.426 l
+19.101 -1.691 18.844 -1.823 18.52 -1.823 c
+18.098 -1.823 17.771 -1.661 17.535 -1.338 c
+17.308 -1.008 17.19 -0.537 17.183 0.073 c
+h
+18.227 0.103 m
+18.227 -0.272 18.274 -0.54 18.374 -0.706 c
+18.47 -0.875 18.624 -0.956 18.829 -0.956 c
+19.042 -0.956 19.2 -0.879 19.299 -0.721 c
+19.299 1.176 l
+19.189 1.341 19.035 1.425 18.829 1.425 c
+18.624 1.425 18.47 1.341 18.374 1.176 c
+18.274 1.007 18.227 0.738 18.227 0.367 c
+h
+22.695 0.367 m
+22.695 1.014 22.802 1.5 23.018 1.822 c
+23.243 2.146 23.566 2.308 23.989 2.308 c
+24.301 2.308 24.554 2.175 24.753 1.911 c
+24.753 3.895 l
+25.811 3.895 l
+25.811 -1.75 l
+24.856 -1.75 l
+24.812 -1.338 l
+24.595 -1.661 24.319 -1.823 23.989 -1.823 c
+23.577 -1.823 23.257 -1.669 23.033 -1.353 c
+22.817 -1.029 22.703 -0.559 22.695 0.058 c
+h
+23.739 0.103 m
+23.739 -0.291 23.775 -0.566 23.856 -0.721 c
+23.945 -0.879 24.091 -0.956 24.297 -0.956 c
+24.503 -0.956 24.654 -0.864 24.753 -0.676 c
+24.753 1.132 l
+24.654 1.326 24.503 1.425 24.297 1.425 c
+24.099 1.425 23.959 1.344 23.871 1.19 c
+23.783 1.043 23.739 0.771 23.739 0.382 c
+h
+27.663 -1.75 -1.043 3.984 re
+26.576 3.263 m
+26.576 3.418 26.624 3.546 26.723 3.645 c
+26.829 3.752 26.965 3.807 27.134 3.807 c
+27.311 3.807 27.446 3.752 27.546 3.645 c
+27.652 3.546 27.708 3.418 27.708 3.263 c
+27.708 3.094 27.652 2.958 27.546 2.851 c
+27.446 2.753 27.311 2.705 27.134 2.705 c
+26.965 2.705 26.829 2.753 26.723 2.851 c
+26.624 2.958 26.576 3.094 26.576 3.263 c
+30.426 1.22 m
+30.089 1.249 l
+29.802 1.249 29.611 1.124 29.516 0.881 c
+29.516 -1.75 l
+28.471 -1.75 l
+28.471 2.234 l
+29.442 2.234 l
+29.471 1.793 l
+29.637 2.135 29.868 2.308 30.162 2.308 c
+30.28 2.308 30.372 2.285 30.441 2.248 c
+h
+32.5 -1.823 m
+31.97 -1.823 31.551 -1.669 31.249 -1.353 c
+30.956 -1.029 30.809 -0.57 30.809 0.029 c
+30.809 0.338 l
+30.809 0.962 30.945 1.448 31.22 1.793 c
+31.492 2.135 31.885 2.308 32.396 2.308 c
+32.896 2.308 33.267 2.146 33.514 1.822 c
+33.767 1.5 33.9 1.022 33.911 0.397 c
+33.911 -0.103 l
+31.837 -0.103 l
+31.856 -0.397 31.918 -0.614 32.029 -0.75 c
+32.147 -0.89 32.327 -0.956 32.573 -0.956 c
+32.915 -0.956 33.205 -0.838 33.44 -0.603 c
+33.852 -1.235 l
+33.723 -1.411 33.535 -1.555 33.293 -1.661 c
+33.047 -1.768 32.782 -1.823 32.5 -1.823 c
+31.852 0.617 m
+32.882 0.617 l
+32.882 0.72 l
+32.882 0.955 32.841 1.132 32.764 1.249 c
+32.694 1.374 32.566 1.44 32.382 1.44 c
+32.205 1.44 32.073 1.371 31.985 1.234 c
+31.904 1.106 31.86 0.9 31.852 0.617 c
+35.939 -0.956 m
+36.233 -0.956 36.383 -0.761 36.394 -0.368 c
+37.364 -0.368 l
+37.364 -0.802 37.233 -1.154 36.968 -1.426 c
+36.703 -1.691 36.365 -1.823 35.953 -1.823 c
+35.442 -1.823 35.05 -1.669 34.777 -1.353 c
+34.513 -1.029 34.374 -0.559 34.366 0.058 c
+34.366 0.382 l
+34.366 1.007 34.499 1.484 34.763 1.808 c
+35.035 2.138 35.432 2.308 35.953 2.308 c
+36.383 2.308 36.726 2.167 36.982 1.896 c
+37.236 1.62 37.364 1.238 37.364 0.75 c
+36.394 0.75 l
+36.394 0.962 36.354 1.132 36.277 1.249 c
+36.207 1.374 36.09 1.44 35.924 1.44 c
+35.748 1.44 35.619 1.374 35.542 1.249 c
+35.461 1.12 35.417 0.871 35.409 0.5 c
+35.409 0.088 l
+35.409 -0.235 35.424 -0.463 35.454 -0.588 c
+35.49 -0.717 35.546 -0.809 35.615 -0.867 c
+35.693 -0.927 35.799 -0.956 35.939 -0.956 c
+39.172 3.204 m
+39.172 2.234 l
+39.702 2.234 l
+39.702 1.44 l
+39.172 1.44 l
+39.172 -0.53 l
+39.172 -0.688 39.191 -0.794 39.232 -0.852 c
+39.28 -0.912 39.363 -0.941 39.481 -0.941 c
+39.588 -0.941 39.673 -0.933 39.731 -0.912 c
+39.731 -1.72 l
+39.555 -1.786 39.363 -1.823 39.158 -1.823 c
+38.482 -1.823 38.137 -1.437 38.129 -0.661 c
+38.129 1.44 l
+37.674 1.44 l
+37.674 2.234 l
+38.129 2.234 l
+38.129 3.204 l
+h
+40.055 0.367 m
+40.055 0.974 40.194 1.448 40.481 1.793 c
+40.764 2.135 41.157 2.308 41.657 2.308 c
+42.164 2.308 42.561 2.135 42.848 1.793 c
+43.13 1.448 43.274 0.974 43.274 0.367 c
+43.274 0.103 l
+43.274 -0.497 43.13 -0.967 42.848 -1.309 c
+42.561 -1.654 42.164 -1.823 41.657 -1.823 c
+41.146 -1.823 40.749 -1.654 40.466 -1.309 c
+40.19 -0.967 40.055 -0.493 40.055 0.118 c
+h
+41.098 0.103 m
+41.098 -0.603 41.282 -0.956 41.657 -0.956 c
+42.01 -0.956 42.201 -0.661 42.23 -0.073 c
+42.23 0.367 l
+42.23 0.727 42.179 0.999 42.083 1.176 c
+41.984 1.352 41.84 1.44 41.657 1.44 c
+41.48 1.44 41.341 1.352 41.245 1.176 c
+41.146 0.999 41.098 0.727 41.098 0.367 c
+h
+45.875 1.22 m
+45.537 1.249 l
+45.25 1.249 45.059 1.124 44.964 0.881 c
+44.964 -1.75 l
+43.92 -1.75 l
+43.92 2.234 l
+44.89 2.234 l
+44.92 1.793 l
+45.085 2.135 45.317 2.308 45.611 2.308 c
+45.728 2.308 45.821 2.285 45.89 2.248 c
+h
+47.772 -0.015 m
+48.3 2.234 l
+49.403 2.234 l
+48.095 -2.352 l
+47.897 -3.017 47.529 -3.352 46.993 -3.352 c
+46.864 -3.352 46.721 -3.329 46.567 -3.293 c
+46.567 -2.469 l
+46.684 -2.484 l
+46.85 -2.484 46.97 -2.448 47.051 -2.381 c
+47.128 -2.323 47.191 -2.213 47.242 -2.058 c
+47.316 -1.793 l
+46.17 2.234 l
+47.286 2.234 l
+h
+f
+Q
+q 1 0 0 1 620.4617 177.4453 cm
+0 0 m
+0 -0.955 l
+0.603 -0.955 l
+0.603 -1.484 l
+0 -1.484 l
+0 -3.954 l
+0 -4.112 0.023 -4.23 0.074 -4.307 c
+0.133 -4.388 0.221 -4.424 0.339 -4.424 c
+0.427 -4.424 0.515 -4.409 0.603 -4.38 c
+0.603 -4.939 l
+0.456 -4.986 0.302 -5.012 0.148 -5.012 c
+-0.11 -5.012 -0.305 -4.92 -0.44 -4.733 c
+-0.58 -4.549 -0.646 -4.288 -0.646 -3.954 c
+-0.646 -1.484 l
+-1.249 -1.484 l
+-1.249 -0.955 l
+-0.646 -0.955 l
+-0.646 0 l
+h
+1.162 -2.763 m
+1.162 -2.186 1.297 -1.73 1.573 -1.396 c
+1.856 -1.055 2.228 -0.881 2.691 -0.881 c
+3.15 -0.881 3.517 -1.051 3.793 -1.381 c
+4.075 -1.705 4.223 -2.153 4.233 -2.719 c
+4.233 -3.145 l
+4.233 -3.715 4.09 -4.17 3.807 -4.512 c
+3.532 -4.847 3.165 -5.012 2.705 -5.012 c
+2.242 -5.012 1.871 -4.85 1.588 -4.527 c
+1.312 -4.197 1.169 -3.755 1.162 -3.204 c
+h
+1.808 -3.145 m
+1.808 -3.549 1.885 -3.866 2.043 -4.101 c
+2.209 -4.336 2.429 -4.453 2.705 -4.453 c
+3.271 -4.453 3.565 -4.041 3.587 -3.218 c
+3.587 -2.763 l
+3.587 -2.362 3.502 -2.042 3.337 -1.807 c
+3.179 -1.565 2.962 -1.44 2.691 -1.44 c
+2.426 -1.44 2.209 -1.565 2.043 -1.807 c
+1.885 -2.042 1.808 -2.362 1.808 -2.763 c
+h
+7.644 0 m
+7.644 -0.955 l
+8.247 -0.955 l
+8.247 -1.484 l
+7.644 -1.484 l
+7.644 -3.954 l
+7.644 -4.112 7.666 -4.23 7.718 -4.307 c
+7.776 -4.388 7.865 -4.424 7.982 -4.424 c
+8.071 -4.424 8.158 -4.409 8.247 -4.38 c
+8.247 -4.939 l
+8.1 -4.986 7.946 -5.012 7.791 -5.012 c
+7.533 -5.012 7.339 -4.92 7.203 -4.733 c
+7.063 -4.549 6.997 -4.288 6.997 -3.954 c
+6.997 -1.484 l
+6.394 -1.484 l
+6.394 -0.955 l
+6.997 -0.955 l
+6.997 0 l
+h
+9.658 -1.367 m
+9.912 -1.043 10.231 -0.881 10.613 -0.881 c
+11.319 -0.881 11.676 -1.352 11.686 -2.293 c
+11.686 -4.939 l
+11.04 -4.939 l
+11.04 -2.322 l
+11.04 -2.009 10.984 -1.789 10.878 -1.66 c
+10.768 -1.535 10.613 -1.469 10.407 -1.469 c
+10.249 -1.469 10.103 -1.525 9.966 -1.631 c
+9.838 -1.741 9.735 -1.878 9.658 -2.042 c
+9.658 -4.939 l
+9.011 -4.939 l
+9.011 0.706 l
+9.658 0.706 l
+h
+14.068 -5.012 m
+13.567 -5.012 13.185 -4.865 12.921 -4.571 c
+12.657 -4.277 12.524 -3.844 12.524 -3.262 c
+12.524 -2.792 l
+12.524 -2.198 12.649 -1.73 12.906 -1.396 c
+13.17 -1.055 13.531 -0.881 13.994 -0.881 c
+14.454 -0.881 14.795 -1.036 15.023 -1.337 c
+15.258 -1.631 15.379 -2.094 15.391 -2.719 c
+15.391 -3.145 l
+13.17 -3.145 l
+13.17 -3.233 l
+13.17 -3.667 13.248 -3.979 13.406 -4.174 c
+13.571 -4.361 13.803 -4.453 14.097 -4.453 c
+14.292 -4.453 14.464 -4.421 14.612 -4.351 c
+14.758 -4.274 14.894 -4.156 15.023 -3.998 c
+15.361 -4.409 l
+15.074 -4.814 14.645 -5.012 14.068 -5.012 c
+13.994 -1.44 m
+13.718 -1.44 13.517 -1.535 13.391 -1.72 c
+13.263 -1.907 13.189 -2.198 13.17 -2.587 c
+14.743 -2.587 l
+14.743 -2.499 l
+14.722 -2.117 14.656 -1.848 14.538 -1.69 c
+14.421 -1.525 14.236 -1.44 13.994 -1.44 c
+19.83 -3.924 m
+19.83 -3.777 19.774 -3.656 19.668 -3.557 c
+19.558 -3.461 19.352 -3.343 19.05 -3.204 c
+18.705 -3.057 18.462 -2.936 18.315 -2.836 c
+18.169 -2.73 18.058 -2.612 17.992 -2.484 c
+17.922 -2.358 17.889 -2.2 17.889 -2.013 c
+17.889 -1.69 18.007 -1.421 18.242 -1.205 c
+18.477 -0.992 18.778 -0.881 19.154 -0.881 c
+19.535 -0.881 19.844 -0.995 20.079 -1.219 c
+20.314 -1.448 20.432 -1.734 20.432 -2.087 c
+19.786 -2.087 l
+19.786 -1.911 19.726 -1.76 19.609 -1.631 c
+19.491 -1.506 19.337 -1.44 19.154 -1.44 c
+18.955 -1.44 18.805 -1.495 18.697 -1.602 c
+18.587 -1.701 18.536 -1.834 18.536 -1.999 c
+18.536 -2.127 18.573 -2.234 18.654 -2.322 c
+18.731 -2.403 18.922 -2.506 19.227 -2.63 c
+19.705 -2.818 20.035 -3.006 20.212 -3.189 c
+20.388 -3.366 20.476 -3.594 20.476 -3.866 c
+20.476 -4.218 20.351 -4.498 20.108 -4.704 c
+19.873 -4.909 19.558 -5.012 19.168 -5.012 c
+18.745 -5.012 18.407 -4.895 18.153 -4.659 c
+17.897 -4.417 17.772 -4.112 17.772 -3.748 c
+18.419 -3.748 l
+18.425 -3.976 18.496 -4.152 18.624 -4.277 c
+18.749 -4.394 18.932 -4.453 19.168 -4.453 c
+19.381 -4.453 19.543 -4.405 19.653 -4.307 c
+19.771 -4.211 19.83 -4.082 19.83 -3.924 c
+24.195 -3.145 m
+24.195 -3.773 24.077 -4.244 23.842 -4.556 c
+23.614 -4.862 23.298 -5.012 22.887 -5.012 c
+22.483 -5.012 22.174 -4.862 21.961 -4.556 c
+21.961 -6.468 l
+21.314 -6.468 l
+21.314 -0.955 l
+21.902 -0.955 l
+21.947 -1.396 l
+22.159 -1.055 22.468 -0.881 22.872 -0.881 c
+23.313 -0.881 23.64 -1.036 23.857 -1.337 c
+24.07 -1.643 24.185 -2.098 24.195 -2.705 c
+h
+23.549 -2.763 m
+23.549 -2.322 23.479 -1.999 23.343 -1.793 c
+23.203 -1.58 22.982 -1.469 22.681 -1.469 c
+22.365 -1.469 22.126 -1.624 21.961 -1.925 c
+21.961 -3.998 l
+22.126 -4.303 22.365 -4.453 22.681 -4.453 c
+22.975 -4.453 23.188 -4.351 23.328 -4.145 c
+23.464 -3.931 23.537 -3.601 23.549 -3.16 c
+h
+26.458 -5.012 m
+25.959 -5.012 25.577 -4.865 25.313 -4.571 c
+25.047 -4.277 24.916 -3.844 24.916 -3.262 c
+24.916 -2.792 l
+24.916 -2.198 25.041 -1.73 25.297 -1.396 c
+25.562 -1.055 25.922 -0.881 26.385 -0.881 c
+26.845 -0.881 27.187 -1.036 27.414 -1.337 c
+27.649 -1.631 27.771 -2.094 27.782 -2.719 c
+27.782 -3.145 l
+25.562 -3.145 l
+25.562 -3.233 l
+25.562 -3.667 25.639 -3.979 25.797 -4.174 c
+25.963 -4.361 26.194 -4.453 26.488 -4.453 c
+26.683 -4.453 26.855 -4.421 27.003 -4.351 c
+27.15 -4.274 27.285 -4.156 27.414 -3.998 c
+27.752 -4.409 l
+27.466 -4.814 27.036 -5.012 26.458 -5.012 c
+26.385 -1.44 m
+26.109 -1.44 25.908 -1.535 25.783 -1.72 c
+25.654 -1.907 25.581 -2.198 25.562 -2.587 c
+27.135 -2.587 l
+27.135 -2.499 l
+27.113 -2.117 27.046 -1.848 26.929 -1.69 c
+26.811 -1.525 26.628 -1.44 26.385 -1.44 c
+29.943 -4.453 m
+30.155 -4.453 30.329 -4.391 30.456 -4.262 c
+30.593 -4.126 30.666 -3.935 30.678 -3.689 c
+31.295 -3.689 l
+31.273 -4.072 31.137 -4.391 30.884 -4.644 c
+30.626 -4.891 30.313 -5.012 29.943 -5.012 c
+29.45 -5.012 29.076 -4.862 28.81 -4.556 c
+28.553 -4.244 28.428 -3.777 28.428 -3.16 c
+28.428 -2.719 l
+28.428 -2.123 28.553 -1.668 28.81 -1.352 c
+29.076 -1.04 29.45 -0.881 29.943 -0.881 c
+30.343 -0.881 30.662 -1.014 30.898 -1.278 c
+31.14 -1.535 31.273 -1.881 31.295 -2.322 c
+30.678 -2.322 l
+30.655 -2.028 30.582 -1.807 30.456 -1.66 c
+30.339 -1.514 30.167 -1.44 29.943 -1.44 c
+29.648 -1.44 29.432 -1.539 29.296 -1.734 c
+29.156 -1.922 29.083 -2.23 29.076 -2.66 c
+29.076 -3.175 l
+29.076 -3.645 29.141 -3.979 29.281 -4.174 c
+29.428 -4.361 29.648 -4.453 29.943 -4.453 c
+32.75 -4.939 -0.647 3.984 re
+32.794 0.088 m
+32.794 -0.022 32.765 -0.114 32.706 -0.191 c
+32.647 -0.261 32.551 -0.294 32.426 -0.294 c
+32.309 -0.294 32.214 -0.261 32.147 -0.191 c
+32.089 -0.114 32.06 -0.022 32.06 0.088 c
+32.06 0.206 32.089 0.298 32.147 0.368 c
+32.214 0.445 32.309 0.485 32.426 0.485 c
+32.551 0.485 32.647 0.445 32.706 0.368 c
+32.765 0.287 32.794 0.195 32.794 0.088 c
+33.941 -4.939 m
+33.941 -1.484 l
+33.426 -1.484 l
+33.426 -0.955 l
+33.941 -0.955 l
+33.941 -0.588 l
+33.948 -0.158 34.062 0.177 34.279 0.412 c
+34.503 0.655 34.815 0.78 35.219 0.78 c
+35.366 0.78 35.506 0.757 35.646 0.721 c
+35.792 0.68 35.944 0.625 36.101 0.559 c
+35.983 -0.014 l
+35.748 0.111 35.506 0.177 35.264 0.177 c
+35.017 0.177 34.845 0.107 34.749 -0.029 c
+34.649 -0.158 34.602 -0.353 34.602 -0.617 c
+34.602 -0.955 l
+35.249 -0.955 l
+35.249 -1.484 l
+34.602 -1.484 l
+34.602 -4.939 l
+h
+36.41 -4.939 -0.647 3.984 re
+38.88 -5.012 m
+38.379 -5.012 37.997 -4.865 37.733 -4.571 c
+37.469 -4.277 37.336 -3.844 37.336 -3.262 c
+37.336 -2.792 l
+37.336 -2.198 37.461 -1.73 37.718 -1.396 c
+37.982 -1.055 38.343 -0.881 38.806 -0.881 c
+39.266 -0.881 39.607 -1.036 39.835 -1.337 c
+40.07 -1.631 40.191 -2.094 40.203 -2.719 c
+40.203 -3.145 l
+37.982 -3.145 l
+37.982 -3.233 l
+37.982 -3.667 38.06 -3.979 38.218 -4.174 c
+38.383 -4.361 38.615 -4.453 38.909 -4.453 c
+39.104 -4.453 39.276 -4.421 39.424 -4.351 c
+39.57 -4.274 39.707 -4.156 39.835 -3.998 c
+40.173 -4.409 l
+39.886 -4.814 39.457 -5.012 38.88 -5.012 c
+38.806 -1.44 m
+38.531 -1.44 38.329 -1.535 38.203 -1.72 c
+38.075 -1.907 38.001 -2.198 37.982 -2.587 c
+39.555 -2.587 l
+39.555 -2.499 l
+39.534 -2.117 39.468 -1.848 39.35 -1.69 c
+39.233 -1.525 39.048 -1.44 38.806 -1.44 c
+40.849 -2.763 m
+40.849 -2.157 40.96 -1.69 41.188 -1.367 c
+41.423 -1.043 41.749 -0.881 42.172 -0.881 c
+42.554 -0.881 42.852 -1.04 43.069 -1.352 c
+43.069 0.706 l
+43.715 0.706 l
+43.715 -4.939 l
+43.127 -4.939 l
+43.083 -4.512 l
+42.878 -4.847 42.572 -5.012 42.172 -5.012 c
+41.76 -5.012 41.437 -4.858 41.202 -4.542 c
+40.966 -4.218 40.849 -3.763 40.849 -3.175 c
+h
+41.496 -3.145 m
+41.496 -3.586 41.558 -3.917 41.687 -4.13 c
+41.823 -4.336 42.044 -4.438 42.348 -4.438 c
+42.672 -4.438 42.911 -4.277 43.069 -3.954 c
+43.069 -1.94 l
+42.9 -1.628 42.661 -1.469 42.348 -1.469 c
+42.044 -1.469 41.823 -1.572 41.687 -1.778 c
+41.558 -1.984 41.496 -2.308 41.496 -2.748 c
+h
+49.315 -3.145 m
+49.315 -3.763 49.202 -4.23 48.978 -4.542 c
+48.76 -4.858 48.438 -5.012 48.008 -5.012 c
+47.585 -5.012 47.272 -4.832 47.067 -4.469 c
+47.037 -4.939 l
+46.435 -4.939 l
+46.435 0.706 l
+47.081 0.706 l
+47.081 -1.396 l
+47.295 -1.055 47.603 -0.881 48.008 -0.881 c
+48.438 -0.881 48.76 -1.04 48.978 -1.352 c
+49.202 -1.657 49.315 -2.123 49.315 -2.748 c
+h
+48.669 -2.763 m
+48.669 -2.293 48.6 -1.962 48.463 -1.764 c
+48.334 -1.569 48.125 -1.469 47.831 -1.469 c
+47.497 -1.469 47.247 -1.653 47.081 -2.013 c
+47.081 -3.895 l
+47.247 -4.259 47.501 -4.438 47.846 -4.438 c
+48.14 -4.438 48.349 -4.336 48.478 -4.13 c
+48.603 -3.924 48.669 -3.609 48.669 -3.175 c
+h
+51.8 -1.572 m
+51.712 -1.554 51.613 -1.543 51.505 -1.543 c
+51.172 -1.543 50.936 -1.727 50.8 -2.087 c
+50.8 -4.939 l
+50.154 -4.939 l
+50.154 -0.955 l
+50.786 -0.955 l
+50.8 -1.367 l
+50.977 -1.043 51.22 -0.881 51.536 -0.881 c
+51.642 -0.881 51.73 -0.904 51.8 -0.941 c
+h
+54.343 -4.939 m
+54.302 -4.85 54.277 -4.704 54.269 -4.498 c
+54.034 -4.843 53.74 -5.012 53.387 -5.012 c
+53.024 -5.012 52.741 -4.916 52.535 -4.718 c
+52.336 -4.512 52.241 -4.226 52.241 -3.85 c
+52.241 -3.451 52.377 -3.131 52.652 -2.896 c
+52.924 -2.653 53.3 -2.528 53.77 -2.528 c
+54.254 -2.528 l
+54.254 -2.102 l
+54.254 -1.866 54.2 -1.701 54.093 -1.602 c
+53.982 -1.495 53.821 -1.44 53.608 -1.44 c
+53.41 -1.44 53.248 -1.499 53.123 -1.616 c
+53.005 -1.734 52.947 -1.881 52.947 -2.057 c
+52.299 -2.057 l
+52.299 -1.863 52.359 -1.672 52.476 -1.484 c
+52.602 -1.3 52.762 -1.153 52.961 -1.043 c
+53.167 -0.937 53.395 -0.881 53.652 -0.881 c
+54.053 -0.881 54.358 -0.984 54.563 -1.19 c
+54.776 -1.396 54.89 -1.69 54.902 -2.072 c
+54.902 -4.086 l
+54.902 -4.391 54.938 -4.656 55.019 -4.88 c
+55.019 -4.939 l
+h
+53.475 -4.424 m
+53.641 -4.424 53.792 -4.38 53.932 -4.292 c
+54.078 -4.203 54.185 -4.093 54.254 -3.954 c
+54.254 -3.013 l
+53.888 -3.013 l
+53.571 -3.013 53.329 -3.083 53.152 -3.218 c
+52.976 -3.347 52.887 -3.534 52.887 -3.777 c
+52.887 -4.005 52.932 -4.17 53.02 -4.277 c
+53.109 -4.376 53.259 -4.424 53.475 -4.424 c
+56.519 -0.955 m
+56.533 -1.396 l
+56.787 -1.055 57.11 -0.881 57.503 -0.881 c
+58.208 -0.881 58.565 -1.352 58.576 -2.293 c
+58.576 -4.939 l
+57.93 -4.939 l
+57.93 -2.322 l
+57.93 -2.009 57.874 -1.789 57.768 -1.66 c
+57.658 -1.535 57.503 -1.469 57.298 -1.469 c
+57.14 -1.469 56.992 -1.525 56.857 -1.631 c
+56.728 -1.741 56.625 -1.878 56.548 -2.042 c
+56.548 -4.939 l
+55.901 -4.939 l
+55.901 -0.955 l
+h
+60.928 -4.453 m
+61.142 -4.453 61.314 -4.391 61.443 -4.262 c
+61.579 -4.126 61.652 -3.935 61.663 -3.689 c
+62.281 -3.689 l
+62.258 -4.072 62.123 -4.391 61.869 -4.644 c
+61.612 -4.891 61.3 -5.012 60.928 -5.012 c
+60.436 -5.012 60.061 -4.862 59.796 -4.556 c
+59.539 -4.244 59.414 -3.777 59.414 -3.16 c
+59.414 -2.719 l
+59.414 -2.123 59.539 -1.668 59.796 -1.352 c
+60.061 -1.04 60.436 -0.881 60.928 -0.881 c
+61.329 -0.881 61.649 -1.014 61.884 -1.278 c
+62.126 -1.535 62.258 -1.881 62.281 -2.322 c
+61.663 -2.322 l
+61.641 -2.028 61.568 -1.807 61.443 -1.66 c
+61.325 -1.514 61.152 -1.44 60.928 -1.44 c
+60.634 -1.44 60.417 -1.539 60.282 -1.734 c
+60.141 -1.922 60.068 -2.23 60.061 -2.66 c
+60.061 -3.175 l
+60.061 -3.645 60.127 -3.979 60.267 -4.174 c
+60.413 -4.361 60.634 -4.453 60.928 -4.453 c
+63.677 -1.367 m
+63.931 -1.043 64.25 -0.881 64.633 -0.881 c
+65.338 -0.881 65.694 -1.352 65.705 -2.293 c
+65.705 -4.939 l
+65.059 -4.939 l
+65.059 -2.322 l
+65.059 -2.009 65.003 -1.789 64.897 -1.66 c
+64.787 -1.535 64.633 -1.469 64.427 -1.469 c
+64.269 -1.469 64.122 -1.525 63.985 -1.631 c
+63.857 -1.741 63.754 -1.878 63.677 -2.042 c
+63.677 -4.939 l
+63.03 -4.939 l
+63.03 0.706 l
+63.677 0.706 l
+h
+66.705 -4.586 m
+66.705 -4.469 66.738 -4.373 66.808 -4.292 c
+66.873 -4.215 66.977 -4.174 67.116 -4.174 c
+67.263 -4.174 67.37 -4.215 67.44 -4.292 c
+67.517 -4.373 67.557 -4.469 67.557 -4.586 c
+67.557 -4.696 67.517 -4.787 67.44 -4.865 c
+67.37 -4.943 67.263 -4.982 67.116 -4.982 c
+66.977 -4.982 66.873 -4.943 66.808 -4.865 c
+66.738 -4.787 66.705 -4.696 66.705 -4.586 c
+71.482 -3.248 m
+71.556 -3.85 l
+71.658 -3.322 l
+72.511 0.412 l
+73.069 0.412 l
+73.907 -3.322 l
+74.01 -3.866 l
+74.083 -3.248 l
+74.746 0.412 l
+75.421 0.412 l
+74.349 -4.939 l
+73.746 -4.939 l
+72.849 -1.043 l
+72.79 -0.72 l
+72.747 -1.043 l
+71.82 -4.939 l
+71.203 -4.939 l
+70.144 0.412 l
+70.821 0.412 l
+h
+76.803 -4.939 -0.646 3.984 re
+76.847 0.088 m
+76.847 -0.022 76.818 -0.114 76.759 -0.191 c
+76.7 -0.261 76.604 -0.294 76.479 -0.294 c
+76.362 -0.294 76.267 -0.261 76.2 -0.191 c
+76.142 -0.114 76.112 -0.022 76.112 0.088 c
+76.112 0.206 76.142 0.298 76.2 0.368 c
+76.267 0.445 76.362 0.485 76.479 0.485 c
+76.604 0.485 76.7 0.445 76.759 0.368 c
+76.818 0.287 76.847 0.195 76.847 0.088 c
+78.669 0 m
+78.669 -0.955 l
+79.272 -0.955 l
+79.272 -1.484 l
+78.669 -1.484 l
+78.669 -3.954 l
+78.669 -4.112 78.692 -4.23 78.744 -4.307 c
+78.802 -4.388 78.891 -4.424 79.008 -4.424 c
+79.096 -4.424 79.184 -4.409 79.272 -4.38 c
+79.272 -4.939 l
+79.126 -4.986 78.971 -5.012 78.817 -5.012 c
+78.559 -5.012 78.365 -4.92 78.229 -4.733 c
+78.089 -4.549 78.023 -4.288 78.023 -3.954 c
+78.023 -1.484 l
+77.42 -1.484 l
+77.42 -0.955 l
+78.023 -0.955 l
+78.023 0 l
+h
+80.683 -1.367 m
+80.938 -1.043 81.256 -0.881 81.639 -0.881 c
+82.345 -0.881 82.701 -1.352 82.712 -2.293 c
+82.712 -4.939 l
+82.065 -4.939 l
+82.065 -2.322 l
+82.065 -2.009 82.01 -1.789 81.904 -1.66 c
+81.794 -1.535 81.639 -1.469 81.433 -1.469 c
+81.275 -1.469 81.128 -1.525 80.992 -1.631 c
+80.864 -1.741 80.761 -1.878 80.683 -2.042 c
+80.683 -4.939 l
+80.037 -4.939 l
+80.037 0.706 l
+80.683 0.706 l
+h
+f
+Q
+707.613 174.374 -1.793 0.867 re
+711.582 174.374 m
+711.582 173.727 711.478 173.242 711.273 172.918 c
+711.067 172.595 710.744 172.433 710.302 172.433 c
+709.957 172.433 709.678 172.587 709.465 172.903 c
+709.436 172.506 l
+708.48 172.506 l
+708.48 178.151 l
+709.523 178.151 l
+709.523 176.167 l
+709.718 176.431 709.972 176.564 710.288 176.564 c
+710.729 176.564 711.052 176.402 711.258 176.078 c
+711.464 175.756 711.57 175.285 711.582 174.667 c
+h
+710.538 174.623 m
+710.538 175.043 710.498 175.322 710.42 175.461 c
+710.34 175.608 710.2 175.681 709.994 175.681 c
+709.777 175.681 709.619 175.583 709.523 175.388 c
+709.523 173.58 l
+709.612 173.393 709.774 173.3 710.009 173.3 c
+710.204 173.3 710.34 173.363 710.42 173.491 c
+710.498 173.616 710.538 173.874 710.538 174.256 c
+h
+f
+q 1 0 0 1 712.3608 172.8592 cm
+0 0 m
+0 0.118 0.033 0.214 0.102 0.294 c
+0.169 0.372 0.272 0.412 0.411 0.412 c
+0.559 0.412 0.665 0.372 0.735 0.294 c
+0.812 0.214 0.852 0.118 0.852 0 c
+0.852 -0.11 0.812 -0.201 0.735 -0.278 c
+0.665 -0.357 0.559 -0.396 0.411 -0.396 c
+0.272 -0.396 0.169 -0.357 0.102 -0.278 c
+0.033 -0.201 0 -0.11 0 0 c
+0 2.822 m
+0 2.94 0.033 3.036 0.102 3.117 c
+0.169 3.194 0.272 3.234 0.411 3.234 c
+0.559 3.234 0.665 3.194 0.735 3.117 c
+0.812 3.036 0.852 2.94 0.852 2.822 c
+0.852 2.712 0.812 2.621 0.735 2.544 c
+0.665 2.463 0.559 2.426 0.411 2.426 c
+0.272 2.426 0.169 2.463 0.102 2.544 c
+0.033 2.621 0 2.712 0 2.822 c
+6.879 0.309 m
+6.761 0.162 l
+6.427 -0.231 5.931 -0.426 5.277 -0.426 c
+4.696 -0.426 4.241 -0.235 3.91 0.148 c
+3.586 0.53 3.418 1.073 3.41 1.779 c
+3.41 2.822 l
+3.41 3.576 3.557 4.138 3.851 4.513 c
+4.152 4.884 4.604 5.072 5.203 5.072 c
+5.71 5.072 6.107 4.929 6.394 4.645 c
+6.688 4.358 6.849 3.955 6.879 3.425 c
+6.203 3.425 l
+6.181 3.756 6.089 4.017 5.924 4.204 c
+5.766 4.399 5.531 4.499 5.218 4.499 c
+4.825 4.499 4.542 4.37 4.366 4.116 c
+4.189 3.859 4.094 3.458 4.087 2.911 c
+4.087 1.823 l
+4.087 1.283 4.189 0.867 4.395 0.574 c
+4.601 0.287 4.895 0.148 5.277 0.148 c
+5.637 0.148 5.916 0.235 6.115 0.412 c
+6.203 0.5 l
+6.203 1.735 l
+5.232 1.735 l
+5.232 2.309 l
+6.879 2.309 l
+h
+8.599 -0.353 -0.647 3.984 re
+8.643 4.675 m
+8.643 4.564 8.613 4.472 8.555 4.395 c
+8.496 4.326 8.401 4.293 8.276 4.293 c
+8.158 4.293 8.062 4.326 7.996 4.395 c
+7.937 4.472 7.908 4.564 7.908 4.675 c
+7.908 4.792 7.937 4.884 7.996 4.954 c
+8.062 5.031 8.158 5.072 8.276 5.072 c
+8.401 5.072 8.496 5.031 8.555 4.954 c
+8.613 4.873 8.643 4.781 8.643 4.675 c
+10.466 4.586 m
+10.466 3.631 l
+11.069 3.631 l
+11.069 3.102 l
+10.466 3.102 l
+10.466 0.632 l
+10.466 0.474 10.487 0.357 10.539 0.279 c
+10.598 0.198 10.686 0.162 10.803 0.162 c
+10.892 0.162 10.98 0.177 11.069 0.206 c
+11.069 -0.353 l
+10.921 -0.4 10.767 -0.426 10.612 -0.426 c
+10.356 -0.426 10.161 -0.334 10.024 -0.147 c
+9.885 0.037 9.818 0.298 9.818 0.632 c
+9.818 3.102 l
+9.216 3.102 l
+9.216 3.631 l
+9.818 3.631 l
+9.818 4.586 l
+h
+16.521 0.794 m
+17.124 3.631 l
+17.771 3.631 l
+16.786 -0.353 l
+16.272 -0.353 l
+15.493 2.5 l
+14.743 -0.353 l
+14.214 -0.353 l
+13.259 3.631 l
+13.891 3.631 l
+14.508 0.867 l
+15.243 3.631 l
+15.757 3.631 l
+h
+19.152 -0.353 -0.646 3.984 re
+19.197 4.675 m
+19.197 4.564 19.168 4.472 19.108 4.395 c
+19.05 4.326 18.954 4.293 18.83 4.293 c
+18.712 4.293 18.616 4.326 18.55 4.395 c
+18.491 4.472 18.462 4.564 18.462 4.675 c
+18.462 4.792 18.491 4.884 18.55 4.954 c
+18.616 5.031 18.712 5.072 18.83 5.072 c
+18.954 5.072 19.05 5.031 19.108 4.954 c
+19.168 4.873 19.197 4.781 19.197 4.675 c
+20.872 -0.353 -0.646 5.644 re
+22.593 -0.353 -0.647 5.644 re
+26.708 0.133 m
+26.921 0.133 27.094 0.195 27.222 0.324 c
+27.359 0.46 27.432 0.651 27.443 0.897 c
+28.06 0.897 l
+28.039 0.515 27.902 0.195 27.649 -0.058 c
+27.391 -0.305 27.079 -0.426 26.708 -0.426 c
+26.216 -0.426 25.841 -0.276 25.576 0.03 c
+25.319 0.342 25.194 0.809 25.194 1.426 c
+25.194 1.867 l
+25.194 2.463 25.319 2.918 25.576 3.234 c
+25.841 3.547 26.216 3.705 26.708 3.705 c
+27.108 3.705 27.428 3.572 27.663 3.308 c
+27.906 3.051 28.039 2.705 28.06 2.264 c
+27.443 2.264 l
+27.421 2.558 27.347 2.779 27.222 2.926 c
+27.104 3.072 26.932 3.146 26.708 3.146 c
+26.414 3.146 26.198 3.047 26.061 2.852 c
+25.922 2.664 25.849 2.356 25.841 1.926 c
+25.841 1.411 l
+25.841 0.941 25.907 0.607 26.046 0.412 c
+26.194 0.225 26.414 0.133 26.708 0.133 c
+30.456 3.014 m
+30.368 3.032 30.269 3.043 30.162 3.043 c
+29.828 3.043 29.593 2.859 29.456 2.5 c
+29.456 -0.353 l
+28.81 -0.353 l
+28.81 3.631 l
+29.442 3.631 l
+29.456 3.219 l
+29.633 3.543 29.876 3.705 30.192 3.705 c
+30.298 3.705 30.387 3.682 30.456 3.645 c
+h
+32.456 -0.426 m
+31.956 -0.426 31.573 -0.278 31.309 0.015 c
+31.044 0.309 30.912 0.742 30.912 1.324 c
+30.912 1.794 l
+30.912 2.389 31.037 2.856 31.295 3.19 c
+31.559 3.532 31.919 3.705 32.382 3.705 c
+32.841 3.705 33.183 3.55 33.411 3.249 c
+33.646 2.955 33.767 2.492 33.778 1.867 c
+33.778 1.441 l
+31.559 1.441 l
+31.559 1.353 l
+31.559 0.919 31.636 0.607 31.794 0.412 c
+31.96 0.225 32.191 0.133 32.485 0.133 c
+32.679 0.133 32.852 0.166 32.999 0.235 c
+33.146 0.312 33.282 0.43 33.411 0.588 c
+33.749 0.177 l
+33.462 -0.228 33.032 -0.426 32.456 -0.426 c
+32.382 3.146 m
+32.106 3.146 31.904 3.051 31.779 2.866 c
+31.65 2.679 31.577 2.389 31.559 1.999 c
+33.132 1.999 l
+33.132 2.087 l
+33.109 2.469 33.043 2.738 32.926 2.897 c
+32.808 3.061 32.625 3.146 32.382 3.146 c
+36.6 -0.353 m
+36.56 -0.264 36.535 -0.118 36.527 0.088 c
+36.292 -0.257 35.998 -0.426 35.646 -0.426 c
+35.281 -0.426 34.998 -0.33 34.792 -0.132 c
+34.594 0.074 34.499 0.36 34.499 0.736 c
+34.499 1.135 34.634 1.455 34.91 1.691 c
+35.182 1.933 35.557 2.058 36.027 2.058 c
+36.512 2.058 l
+36.512 2.484 l
+36.512 2.72 36.457 2.885 36.351 2.984 c
+36.24 3.091 36.079 3.146 35.866 3.146 c
+35.667 3.146 35.505 3.087 35.38 2.97 c
+35.263 2.852 35.204 2.705 35.204 2.529 c
+34.557 2.529 l
+34.557 2.723 34.616 2.914 34.734 3.102 c
+34.859 3.286 35.021 3.433 35.218 3.543 c
+35.424 3.649 35.652 3.705 35.91 3.705 c
+36.311 3.705 36.615 3.602 36.821 3.396 c
+37.034 3.19 37.148 2.897 37.159 2.514 c
+37.159 0.5 l
+37.159 0.195 37.196 -0.07 37.277 -0.294 c
+37.277 -0.353 l
+h
+35.733 0.162 m
+35.899 0.162 36.049 0.206 36.189 0.294 c
+36.336 0.383 36.442 0.493 36.512 0.632 c
+36.512 1.573 l
+36.145 1.573 l
+35.829 1.573 35.586 1.503 35.41 1.368 c
+35.233 1.239 35.145 1.052 35.145 0.809 c
+35.145 0.581 35.189 0.416 35.278 0.309 c
+35.366 0.21 35.517 0.162 35.733 0.162 c
+39.011 4.586 m
+39.011 3.631 l
+39.614 3.631 l
+39.614 3.102 l
+39.011 3.102 l
+39.011 0.632 l
+39.011 0.474 39.033 0.357 39.085 0.279 c
+39.143 0.198 39.232 0.162 39.349 0.162 c
+39.438 0.162 39.526 0.177 39.614 0.206 c
+39.614 -0.353 l
+39.467 -0.4 39.313 -0.426 39.158 -0.426 c
+38.901 -0.426 38.706 -0.334 38.57 -0.147 c
+38.431 0.037 38.364 0.298 38.364 0.632 c
+38.364 3.102 l
+37.762 3.102 l
+37.762 3.631 l
+38.364 3.631 l
+38.364 4.586 l
+h
+41.804 -0.426 m
+41.304 -0.426 40.922 -0.278 40.658 0.015 c
+40.392 0.309 40.261 0.742 40.261 1.324 c
+40.261 1.794 l
+40.261 2.389 40.386 2.856 40.643 3.19 c
+40.907 3.532 41.267 3.705 41.73 3.705 c
+42.19 3.705 42.532 3.55 42.759 3.249 c
+42.995 2.955 43.116 2.492 43.127 1.867 c
+43.127 1.441 l
+40.907 1.441 l
+40.907 1.353 l
+40.907 0.919 40.984 0.607 41.142 0.412 c
+41.308 0.225 41.539 0.133 41.834 0.133 c
+42.028 0.133 42.201 0.166 42.348 0.235 c
+42.495 0.312 42.63 0.43 42.759 0.588 c
+43.097 0.177 l
+42.811 -0.228 42.381 -0.426 41.804 -0.426 c
+41.73 3.146 m
+41.455 3.146 41.253 3.051 41.128 2.866 c
+40.999 2.679 40.926 2.389 40.907 1.999 c
+42.48 1.999 l
+42.48 2.087 l
+42.458 2.469 42.392 2.738 42.274 2.897 c
+42.156 3.061 41.973 3.146 41.73 3.146 c
+46.478 4.586 m
+46.478 3.631 l
+47.081 3.631 l
+47.081 3.102 l
+46.478 3.102 l
+46.478 0.632 l
+46.478 0.474 46.501 0.357 46.551 0.279 c
+46.611 0.198 46.699 0.162 46.817 0.162 c
+46.904 0.162 46.993 0.177 47.081 0.206 c
+47.081 -0.353 l
+46.934 -0.4 46.78 -0.426 46.625 -0.426 c
+46.368 -0.426 46.173 -0.334 46.037 -0.147 c
+45.898 0.037 45.832 0.298 45.832 0.632 c
+45.832 3.102 l
+45.229 3.102 l
+45.229 3.631 l
+45.832 3.631 l
+45.832 4.586 l
+h
+48.492 3.219 m
+48.745 3.543 49.065 3.705 49.447 3.705 c
+50.153 3.705 50.509 3.234 50.52 2.294 c
+50.52 -0.353 l
+49.874 -0.353 l
+49.874 2.264 l
+49.874 2.577 49.819 2.797 49.712 2.926 c
+49.602 3.051 49.447 3.117 49.242 3.117 c
+49.084 3.117 48.937 3.061 48.801 2.955 c
+48.672 2.845 48.569 2.708 48.492 2.544 c
+48.492 -0.353 l
+47.845 -0.353 l
+47.845 5.292 l
+48.492 5.292 l
+h
+52.901 -0.426 m
+52.402 -0.426 52.02 -0.278 51.756 0.015 c
+51.49 0.309 51.359 0.742 51.359 1.324 c
+51.359 1.794 l
+51.359 2.389 51.484 2.856 51.741 3.19 c
+52.005 3.532 52.365 3.705 52.828 3.705 c
+53.287 3.705 53.63 3.55 53.857 3.249 c
+54.092 2.955 54.214 2.492 54.225 1.867 c
+54.225 1.441 l
+52.005 1.441 l
+52.005 1.353 l
+52.005 0.919 52.082 0.607 52.24 0.412 c
+52.406 0.225 52.637 0.133 52.932 0.133 c
+53.126 0.133 53.298 0.166 53.445 0.235 c
+53.593 0.312 53.728 0.43 53.857 0.588 c
+54.195 0.177 l
+53.909 -0.228 53.479 -0.426 52.901 -0.426 c
+52.828 3.146 m
+52.552 3.146 52.35 3.051 52.226 2.866 c
+52.097 2.679 52.024 2.389 52.005 1.999 c
+53.578 1.999 l
+53.578 2.087 l
+53.556 2.469 53.489 2.738 53.372 2.897 c
+53.254 3.061 53.071 3.146 52.828 3.146 c
+f
+Q
+q 1 0 0 1 663.6041 164.1141 cm
+0 0 m
+0 0.147 -0.056 0.268 -0.162 0.367 c
+-0.272 0.463 -0.478 0.58 -0.779 0.72 c
+-1.124 0.866 -1.367 0.988 -1.515 1.087 c
+-1.661 1.194 -1.771 1.311 -1.837 1.44 c
+-1.908 1.565 -1.941 1.723 -1.941 1.911 c
+-1.941 2.234 -1.823 2.502 -1.588 2.719 c
+-1.353 2.932 -1.051 3.042 -0.676 3.042 c
+-0.294 3.042 0.014 2.929 0.249 2.705 c
+0.484 2.476 0.602 2.19 0.602 1.837 c
+-0.044 1.837 l
+-0.044 2.013 -0.104 2.164 -0.221 2.293 c
+-0.339 2.418 -0.493 2.484 -0.676 2.484 c
+-0.875 2.484 -1.025 2.429 -1.132 2.322 c
+-1.242 2.223 -1.294 2.09 -1.294 1.925 c
+-1.294 1.797 -1.257 1.69 -1.176 1.602 c
+-1.099 1.521 -0.908 1.418 -0.603 1.294 c
+-0.125 1.105 0.206 0.918 0.382 0.735 c
+0.559 0.558 0.646 0.33 0.646 0.058 c
+0.646 -0.294 0.522 -0.574 0.279 -0.78 c
+0.044 -0.985 -0.272 -1.088 -0.661 -1.088 c
+-1.084 -1.088 -1.422 -0.971 -1.675 -0.736 c
+-1.933 -0.493 -2.058 -0.188 -2.058 0.176 c
+-1.411 0.176 l
+-1.404 -0.052 -1.334 -0.229 -1.205 -0.353 c
+-1.081 -0.47 -0.897 -0.53 -0.661 -0.53 c
+-0.449 -0.53 -0.287 -0.482 -0.177 -0.383 c
+-0.059 -0.287 0 -0.158 0 0 c
+4.365 0.779 m
+4.365 0.151 4.247 -0.32 4.012 -0.632 c
+3.785 -0.938 3.468 -1.088 3.057 -1.088 c
+2.653 -1.088 2.344 -0.938 2.131 -0.632 c
+2.131 -2.544 l
+1.484 -2.544 l
+1.484 2.969 l
+2.072 2.969 l
+2.117 2.528 l
+2.329 2.869 2.639 3.042 3.042 3.042 c
+3.484 3.042 3.811 2.888 4.027 2.587 c
+4.241 2.281 4.355 1.826 4.365 1.219 c
+h
+3.719 1.161 m
+3.719 1.602 3.649 1.925 3.513 2.131 c
+3.373 2.344 3.152 2.454 2.851 2.454 c
+2.535 2.454 2.296 2.3 2.131 1.999 c
+2.131 -0.074 l
+2.296 -0.379 2.535 -0.53 2.851 -0.53 c
+3.146 -0.53 3.358 -0.427 3.499 -0.221 c
+3.634 -0.008 3.707 0.323 3.719 0.764 c
+h
+6.629 -1.088 m
+6.129 -1.088 5.747 -0.941 5.483 -0.647 c
+5.218 -0.353 5.086 0.08 5.086 0.661 c
+5.086 1.132 l
+5.086 1.726 5.211 2.194 5.468 2.528 c
+5.733 2.869 6.092 3.042 6.556 3.042 c
+7.015 3.042 7.357 2.888 7.584 2.587 c
+7.819 2.293 7.941 1.83 7.952 1.205 c
+7.952 0.779 l
+5.733 0.779 l
+5.733 0.69 l
+5.733 0.257 5.81 -0.056 5.968 -0.25 c
+6.133 -0.437 6.364 -0.53 6.659 -0.53 c
+6.853 -0.53 7.026 -0.497 7.173 -0.427 c
+7.32 -0.35 7.456 -0.232 7.584 -0.074 c
+7.923 -0.485 l
+7.636 -0.89 7.206 -1.088 6.629 -1.088 c
+6.556 2.484 m
+6.28 2.484 6.078 2.389 5.953 2.204 c
+5.824 2.017 5.751 1.726 5.733 1.337 c
+7.305 1.337 l
+7.305 1.425 l
+7.283 1.807 7.217 2.076 7.1 2.234 c
+6.982 2.399 6.798 2.484 6.556 2.484 c
+10.113 -0.53 m
+10.326 -0.53 10.499 -0.468 10.628 -0.339 c
+10.763 -0.202 10.836 -0.011 10.848 0.235 c
+11.465 0.235 l
+11.443 -0.148 11.307 -0.468 11.054 -0.721 c
+10.796 -0.967 10.484 -1.088 10.113 -1.088 c
+9.62 -1.088 9.246 -0.938 8.981 -0.632 c
+8.723 -0.32 8.598 0.147 8.598 0.764 c
+8.598 1.205 l
+8.598 1.801 8.723 2.256 8.981 2.572 c
+9.246 2.884 9.62 3.042 10.113 3.042 c
+10.514 3.042 10.833 2.91 11.068 2.645 c
+11.31 2.389 11.443 2.042 11.465 1.602 c
+10.848 1.602 l
+10.826 1.896 10.753 2.117 10.628 2.263 c
+10.51 2.41 10.337 2.484 10.113 2.484 c
+9.818 2.484 9.602 2.385 9.466 2.19 c
+9.326 2.002 9.253 1.693 9.246 1.263 c
+9.246 0.749 l
+9.246 0.278 9.311 -0.056 9.452 -0.25 c
+9.598 -0.437 9.818 -0.53 10.113 -0.53 c
+12.92 -1.015 -0.646 3.984 re
+12.964 4.012 m
+12.964 3.902 12.935 3.81 12.876 3.733 c
+12.818 3.663 12.722 3.63 12.596 3.63 c
+12.479 3.63 12.384 3.663 12.318 3.733 c
+12.259 3.81 12.23 3.902 12.23 4.012 c
+12.23 4.13 12.259 4.222 12.318 4.292 c
+12.384 4.369 12.479 4.409 12.596 4.409 c
+12.722 4.409 12.818 4.369 12.876 4.292 c
+12.935 4.211 12.964 4.119 12.964 4.012 c
+14.111 -1.015 m
+14.111 2.439 l
+13.596 2.439 l
+13.596 2.969 l
+14.111 2.969 l
+14.111 3.336 l
+14.119 3.766 14.232 4.101 14.449 4.336 c
+14.674 4.579 14.986 4.704 15.389 4.704 c
+15.536 4.704 15.676 4.681 15.816 4.644 c
+15.963 4.604 16.114 4.548 16.272 4.483 c
+16.154 3.91 l
+15.919 4.035 15.676 4.101 15.434 4.101 c
+15.187 4.101 15.015 4.031 14.919 3.895 c
+14.82 3.766 14.772 3.571 14.772 3.307 c
+14.772 2.969 l
+15.419 2.969 l
+15.419 2.439 l
+14.772 2.439 l
+14.772 -1.015 l
+h
+16.581 -1.015 -0.647 3.984 re
+19.05 -1.088 m
+18.55 -1.088 18.167 -0.941 17.903 -0.647 c
+17.639 -0.353 17.506 0.08 17.506 0.661 c
+17.506 1.132 l
+17.506 1.726 17.631 2.194 17.888 2.528 c
+18.153 2.869 18.514 3.042 18.977 3.042 c
+19.436 3.042 19.777 2.888 20.005 2.587 c
+20.24 2.293 20.361 1.83 20.373 1.205 c
+20.373 0.779 l
+18.153 0.779 l
+18.153 0.69 l
+18.153 0.257 18.231 -0.056 18.389 -0.25 c
+18.553 -0.437 18.786 -0.53 19.079 -0.53 c
+19.274 -0.53 19.447 -0.497 19.594 -0.427 c
+19.74 -0.35 19.877 -0.232 20.005 -0.074 c
+20.343 -0.485 l
+20.057 -0.89 19.627 -1.088 19.05 -1.088 c
+18.977 2.484 m
+18.701 2.484 18.499 2.389 18.374 2.204 c
+18.245 2.017 18.171 1.726 18.153 1.337 c
+19.726 1.337 l
+19.726 1.425 l
+19.704 1.807 19.638 2.076 19.52 2.234 c
+19.403 2.399 19.219 2.484 18.977 2.484 c
+21.02 1.161 m
+21.02 1.767 21.13 2.234 21.358 2.557 c
+21.593 2.881 21.92 3.042 22.343 3.042 c
+22.724 3.042 23.022 2.884 23.239 2.572 c
+23.239 4.629 l
+23.885 4.629 l
+23.885 -1.015 l
+23.297 -1.015 l
+23.254 -0.588 l
+23.048 -0.923 22.743 -1.088 22.343 -1.088 c
+21.93 -1.088 21.608 -0.934 21.373 -0.618 c
+21.137 -0.294 21.02 0.161 21.02 0.749 c
+h
+21.666 0.779 m
+21.666 0.338 21.729 0.007 21.857 -0.206 c
+21.993 -0.412 22.214 -0.515 22.518 -0.515 c
+22.842 -0.515 23.081 -0.353 23.239 -0.03 c
+23.239 1.984 l
+23.07 2.296 22.831 2.454 22.518 2.454 c
+22.214 2.454 21.993 2.352 21.857 2.146 c
+21.729 1.94 21.666 1.616 21.666 1.176 c
+h
+29.487 0.779 m
+29.487 0.161 29.372 -0.306 29.148 -0.618 c
+28.931 -0.934 28.608 -1.088 28.178 -1.088 c
+27.756 -1.088 27.443 -0.908 27.237 -0.545 c
+27.208 -1.015 l
+26.605 -1.015 l
+26.605 4.629 l
+27.252 4.629 l
+27.252 2.528 l
+27.465 2.869 27.773 3.042 28.178 3.042 c
+28.608 3.042 28.931 2.884 29.148 2.572 c
+29.372 2.267 29.487 1.801 29.487 1.176 c
+h
+28.839 1.161 m
+28.839 1.631 28.77 1.961 28.633 2.16 c
+28.505 2.355 28.296 2.454 28.001 2.454 c
+27.667 2.454 27.417 2.271 27.252 1.911 c
+27.252 0.029 l
+27.417 -0.335 27.671 -0.515 28.016 -0.515 c
+28.311 -0.515 28.519 -0.412 28.648 -0.206 c
+28.773 0 28.839 0.315 28.839 0.749 c
+h
+31.97 2.352 m
+31.882 2.37 31.783 2.381 31.677 2.381 c
+31.342 2.381 31.106 2.197 30.971 1.837 c
+30.971 -1.015 l
+30.324 -1.015 l
+30.324 2.969 l
+30.956 2.969 l
+30.971 2.557 l
+31.147 2.881 31.39 3.042 31.706 3.042 c
+31.812 3.042 31.9 3.02 31.97 2.983 c
+h
+34.513 -1.015 m
+34.472 -0.927 34.447 -0.78 34.439 -0.574 c
+34.204 -0.919 33.911 -1.088 33.558 -1.088 c
+33.194 -1.088 32.911 -0.992 32.705 -0.794 c
+32.507 -0.588 32.411 -0.302 32.411 0.073 c
+32.411 0.473 32.548 0.793 32.822 1.028 c
+33.095 1.271 33.47 1.396 33.94 1.396 c
+34.425 1.396 l
+34.425 1.822 l
+34.425 2.057 34.37 2.223 34.264 2.322 c
+34.154 2.429 33.992 2.484 33.778 2.484 c
+33.58 2.484 33.418 2.425 33.293 2.308 c
+33.175 2.19 33.117 2.042 33.117 1.866 c
+32.47 1.866 l
+32.47 2.061 32.529 2.252 32.646 2.439 c
+32.772 2.624 32.933 2.77 33.132 2.881 c
+33.337 2.987 33.566 3.042 33.822 3.042 c
+34.223 3.042 34.528 2.94 34.734 2.734 c
+34.947 2.528 35.06 2.234 35.072 1.851 c
+35.072 -0.162 l
+35.072 -0.468 35.108 -0.732 35.189 -0.956 c
+35.189 -1.015 l
+h
+33.646 -0.5 m
+33.811 -0.5 33.962 -0.456 34.102 -0.368 c
+34.248 -0.279 34.355 -0.169 34.425 -0.03 c
+34.425 0.911 l
+34.058 0.911 l
+33.741 0.911 33.499 0.841 33.323 0.706 c
+33.146 0.577 33.057 0.389 33.057 0.147 c
+33.057 -0.081 33.102 -0.246 33.19 -0.353 c
+33.279 -0.452 33.429 -0.5 33.646 -0.5 c
+36.689 2.969 m
+36.703 2.528 l
+36.957 2.869 37.281 3.042 37.674 3.042 c
+38.379 3.042 38.736 2.572 38.746 1.631 c
+38.746 -1.015 l
+38.1 -1.015 l
+38.1 1.602 l
+38.1 1.914 38.044 2.135 37.938 2.263 c
+37.828 2.389 37.674 2.454 37.468 2.454 c
+37.31 2.454 37.163 2.399 37.026 2.293 c
+36.898 2.183 36.795 2.046 36.718 1.881 c
+36.718 -1.015 l
+36.072 -1.015 l
+36.072 2.969 l
+h
+41.098 -0.53 m
+41.312 -0.53 41.485 -0.468 41.613 -0.339 c
+41.749 -0.202 41.822 -0.011 41.834 0.235 c
+42.451 0.235 l
+42.428 -0.148 42.293 -0.468 42.039 -0.721 c
+41.782 -0.967 41.47 -1.088 41.098 -1.088 c
+40.606 -1.088 40.231 -0.938 39.966 -0.632 c
+39.71 -0.32 39.584 0.147 39.584 0.764 c
+39.584 1.205 l
+39.584 1.801 39.71 2.256 39.966 2.572 c
+40.231 2.884 40.606 3.042 41.098 3.042 c
+41.499 3.042 41.819 2.91 42.054 2.645 c
+42.297 2.389 42.428 2.042 42.451 1.602 c
+41.834 1.602 l
+41.811 1.896 41.738 2.117 41.613 2.263 c
+41.495 2.41 41.323 2.484 41.098 2.484 c
+40.805 2.484 40.587 2.385 40.452 2.19 c
+40.312 2.002 40.238 1.693 40.231 1.263 c
+40.231 0.749 l
+40.231 0.278 40.297 -0.056 40.437 -0.25 c
+40.583 -0.437 40.805 -0.53 41.098 -0.53 c
+43.847 2.557 m
+44.101 2.881 44.421 3.042 44.803 3.042 c
+45.508 3.042 45.865 2.572 45.875 1.631 c
+45.875 -1.015 l
+45.229 -1.015 l
+45.229 1.602 l
+45.229 1.914 45.173 2.135 45.067 2.263 c
+44.957 2.389 44.803 2.454 44.597 2.454 c
+44.439 2.454 44.292 2.399 44.155 2.293 c
+44.027 2.183 43.924 2.046 43.847 1.881 c
+43.847 -1.015 l
+43.201 -1.015 l
+43.201 4.629 l
+43.847 4.629 l
+h
+49.256 -1.015 -0.646 3.984 re
+49.3 4.012 m
+49.3 3.902 49.271 3.81 49.212 3.733 c
+49.154 3.663 49.058 3.63 48.932 3.63 c
+48.815 3.63 48.72 3.663 48.654 3.733 c
+48.595 3.81 48.566 3.902 48.566 4.012 c
+48.566 4.13 48.595 4.222 48.654 4.292 c
+48.72 4.369 48.815 4.409 48.932 4.409 c
+49.058 4.409 49.154 4.369 49.212 4.292 c
+49.271 4.211 49.3 4.119 49.3 4.012 c
+50.565 -1.015 m
+50.565 2.439 l
+50.035 2.439 l
+50.035 2.969 l
+50.565 2.969 l
+50.565 3.424 l
+50.565 3.825 50.66 4.137 50.858 4.365 c
+51.064 4.589 51.344 4.704 51.696 4.704 c
+51.833 4.704 51.965 4.681 52.093 4.644 c
+52.064 4.101 l
+51.965 4.119 51.866 4.13 51.77 4.13 c
+51.395 4.13 51.211 3.865 51.211 3.336 c
+51.211 2.969 l
+51.887 2.969 l
+51.887 2.439 l
+51.211 2.439 l
+51.211 -1.015 l
+h
+55.077 -1.015 -0.647 3.984 re
+55.122 4.012 m
+55.122 3.902 55.091 3.81 55.033 3.733 c
+54.974 3.663 54.879 3.63 54.754 3.63 c
+54.636 3.63 54.54 3.663 54.474 3.733 c
+54.416 3.81 54.386 3.902 54.386 4.012 c
+54.386 4.13 54.416 4.222 54.474 4.292 c
+54.54 4.369 54.636 4.409 54.754 4.409 c
+54.879 4.409 54.974 4.369 55.033 4.292 c
+55.091 4.211 55.122 4.119 55.122 4.012 c
+56.944 3.924 m
+56.944 2.969 l
+57.547 2.969 l
+57.547 2.439 l
+56.944 2.439 l
+56.944 -0.03 l
+56.944 -0.188 56.966 -0.306 57.017 -0.383 c
+57.077 -0.464 57.164 -0.5 57.282 -0.5 c
+57.37 -0.5 57.458 -0.485 57.547 -0.456 c
+57.547 -1.015 l
+57.399 -1.062 57.245 -1.088 57.091 -1.088 c
+56.834 -1.088 56.639 -0.996 56.503 -0.809 c
+56.363 -0.626 56.298 -0.364 56.298 -0.03 c
+56.298 2.439 l
+55.695 2.439 l
+55.695 2.969 l
+56.298 2.969 l
+56.298 3.924 l
+h
+59.899 1.161 m
+59.899 1.767 60.009 2.234 60.236 2.557 c
+60.472 2.881 60.799 3.042 61.221 3.042 c
+61.603 3.042 61.902 2.884 62.118 2.572 c
+62.118 4.629 l
+62.765 4.629 l
+62.765 -1.015 l
+62.177 -1.015 l
+62.133 -0.588 l
+61.927 -0.923 61.622 -1.088 61.221 -1.088 c
+60.809 -1.088 60.487 -0.934 60.252 -0.618 c
+60.016 -0.294 59.899 0.161 59.899 0.749 c
+h
+60.545 0.779 m
+60.545 0.338 60.608 0.007 60.736 -0.206 c
+60.872 -0.412 61.093 -0.515 61.397 -0.515 c
+61.721 -0.515 61.96 -0.353 62.118 -0.03 c
+62.118 1.984 l
+61.949 2.296 61.711 2.454 61.397 2.454 c
+61.093 2.454 60.872 2.352 60.736 2.146 c
+60.608 1.94 60.545 1.616 60.545 1.176 c
+h
+63.632 1.161 m
+63.632 1.738 63.768 2.194 64.044 2.528 c
+64.327 2.869 64.697 3.042 65.16 3.042 c
+65.62 3.042 65.987 2.873 66.263 2.543 c
+66.546 2.219 66.693 1.77 66.704 1.205 c
+66.704 0.779 l
+66.704 0.209 66.561 -0.246 66.278 -0.588 c
+66.002 -0.923 65.634 -1.088 65.175 -1.088 c
+64.713 -1.088 64.341 -0.927 64.059 -0.603 c
+63.783 -0.273 63.639 0.168 63.632 0.72 c
+h
+64.279 0.779 m
+64.279 0.374 64.356 0.058 64.514 -0.177 c
+64.68 -0.412 64.9 -0.53 65.175 -0.53 c
+65.742 -0.53 66.035 -0.118 66.058 0.706 c
+66.058 1.161 l
+66.058 1.562 65.973 1.881 65.808 2.117 c
+65.649 2.358 65.433 2.484 65.16 2.484 c
+64.896 2.484 64.68 2.358 64.514 2.117 c
+64.356 1.881 64.279 1.562 64.279 1.161 c
+h
+68.967 -1.088 m
+68.468 -1.088 68.086 -0.941 67.822 -0.647 c
+67.556 -0.353 67.425 0.08 67.425 0.661 c
+67.425 1.132 l
+67.425 1.726 67.55 2.194 67.807 2.528 c
+68.071 2.869 68.431 3.042 68.894 3.042 c
+69.353 3.042 69.696 2.888 69.923 2.587 c
+70.158 2.293 70.28 1.83 70.291 1.205 c
+70.291 0.779 l
+68.071 0.779 l
+68.071 0.69 l
+68.071 0.257 68.148 -0.056 68.306 -0.25 c
+68.472 -0.437 68.703 -0.53 68.998 -0.53 c
+69.192 -0.53 69.364 -0.497 69.511 -0.427 c
+69.659 -0.35 69.794 -0.232 69.923 -0.074 c
+70.261 -0.485 l
+69.975 -0.89 69.545 -1.088 68.967 -1.088 c
+68.894 2.484 m
+68.618 2.484 68.416 2.389 68.292 2.204 c
+68.163 2.017 68.09 1.726 68.071 1.337 c
+69.644 1.337 l
+69.644 1.425 l
+69.622 1.807 69.555 2.076 69.438 2.234 c
+69.32 2.399 69.137 2.484 68.894 2.484 c
+73.01 0 m
+73.01 0.147 72.955 0.268 72.848 0.367 c
+72.738 0.463 72.532 0.58 72.231 0.72 c
+71.886 0.866 71.643 0.988 71.496 1.087 c
+71.349 1.194 71.238 1.311 71.172 1.44 c
+71.103 1.565 71.07 1.723 71.07 1.911 c
+71.07 2.234 71.188 2.502 71.423 2.719 c
+71.658 2.932 71.959 3.042 72.333 3.042 c
+72.716 3.042 73.025 2.929 73.26 2.705 c
+73.495 2.476 73.613 2.19 73.613 1.837 c
+72.966 1.837 l
+72.966 2.013 72.907 2.164 72.79 2.293 c
+72.672 2.418 72.518 2.484 72.333 2.484 c
+72.136 2.484 71.984 2.429 71.878 2.322 c
+71.768 2.223 71.716 2.09 71.716 1.925 c
+71.716 1.797 71.753 1.69 71.834 1.602 c
+71.911 1.521 72.102 1.418 72.408 1.294 c
+72.885 1.105 73.216 0.918 73.392 0.735 c
+73.569 0.558 73.657 0.33 73.657 0.058 c
+73.657 -0.294 73.532 -0.574 73.289 -0.78 c
+73.054 -0.985 72.738 -1.088 72.348 -1.088 c
+71.926 -1.088 71.588 -0.971 71.334 -0.736 c
+71.078 -0.493 70.952 -0.188 70.952 0.176 c
+71.599 0.176 l
+71.606 -0.052 71.676 -0.229 71.805 -0.353 c
+71.93 -0.47 72.113 -0.53 72.348 -0.53 c
+72.562 -0.53 72.724 -0.482 72.834 -0.383 c
+72.951 -0.287 73.01 -0.158 73.01 0 c
+76.832 2.969 m
+76.846 2.528 l
+77.1 2.869 77.424 3.042 77.817 3.042 c
+78.523 3.042 78.879 2.572 78.889 1.631 c
+78.889 -1.015 l
+78.243 -1.015 l
+78.243 1.602 l
+78.243 1.914 78.188 2.135 78.081 2.263 c
+77.971 2.389 77.817 2.454 77.611 2.454 c
+77.453 2.454 77.306 2.399 77.17 2.293 c
+77.041 2.183 76.938 2.046 76.861 1.881 c
+76.861 -1.015 l
+76.214 -1.015 l
+76.214 2.969 l
+h
+79.728 1.161 m
+79.728 1.738 79.863 2.194 80.139 2.528 c
+80.422 2.869 80.794 3.042 81.256 3.042 c
+81.715 3.042 82.083 2.873 82.359 2.543 c
+82.642 2.219 82.789 1.77 82.799 1.205 c
+82.799 0.779 l
+82.799 0.209 82.656 -0.246 82.373 -0.588 c
+82.097 -0.923 81.73 -1.088 81.27 -1.088 c
+80.808 -1.088 80.437 -0.927 80.154 -0.603 c
+79.878 -0.273 79.735 0.168 79.728 0.72 c
+h
+80.374 0.779 m
+80.374 0.374 80.451 0.058 80.609 -0.177 c
+80.775 -0.412 80.996 -0.53 81.27 -0.53 c
+81.837 -0.53 82.131 -0.118 82.153 0.706 c
+82.153 1.161 l
+82.153 1.562 82.068 1.881 81.903 2.117 c
+81.745 2.358 81.528 2.484 81.256 2.484 c
+80.992 2.484 80.775 2.358 80.609 2.117 c
+80.451 1.881 80.374 1.562 80.374 1.161 c
+h
+84.49 3.924 m
+84.49 2.969 l
+85.093 2.969 l
+85.093 2.439 l
+84.49 2.439 l
+84.49 -0.03 l
+84.49 -0.188 84.512 -0.306 84.563 -0.383 c
+84.622 -0.464 84.711 -0.5 84.828 -0.5 c
+84.916 -0.5 85.004 -0.485 85.093 -0.456 c
+85.093 -1.015 l
+84.946 -1.062 84.792 -1.088 84.637 -1.088 c
+84.38 -1.088 84.185 -0.996 84.049 -0.809 c
+83.909 -0.626 83.843 -0.364 83.843 -0.03 c
+83.843 2.439 l
+83.24 2.439 l
+83.24 2.969 l
+83.843 2.969 l
+83.843 3.924 l
+h
+89.002 -1.088 m
+88.503 -1.088 88.121 -0.941 87.856 -0.647 c
+87.591 -0.353 87.46 0.08 87.46 0.661 c
+87.46 1.132 l
+87.46 1.726 87.584 2.194 87.841 2.528 c
+88.106 2.869 88.466 3.042 88.929 3.042 c
+89.388 3.042 89.731 2.888 89.958 2.587 c
+90.193 2.293 90.315 1.83 90.325 1.205 c
+90.325 0.779 l
+88.106 0.779 l
+88.106 0.69 l
+88.106 0.257 88.183 -0.056 88.341 -0.25 c
+88.507 -0.437 88.738 -0.53 89.031 -0.53 c
+89.227 -0.53 89.399 -0.497 89.546 -0.427 c
+89.694 -0.35 89.829 -0.232 89.958 -0.074 c
+90.296 -0.485 l
+90.01 -0.89 89.579 -1.088 89.002 -1.088 c
+88.929 2.484 m
+88.653 2.484 88.451 2.389 88.326 2.204 c
+88.198 2.017 88.125 1.726 88.106 1.337 c
+89.679 1.337 l
+89.679 1.425 l
+89.657 1.807 89.59 2.076 89.473 2.234 c
+89.355 2.399 89.172 2.484 88.929 2.484 c
+92.251 1.514 m
+92.942 2.969 l
+93.692 2.969 l
+92.604 0.999 l
+93.721 -1.015 l
+92.971 -1.015 l
+92.266 0.47 l
+91.56 -1.015 l
+90.81 -1.015 l
+91.913 0.999 l
+90.84 2.969 l
+91.589 2.969 l
+h
+95.117 -1.015 -0.646 3.984 re
+95.161 4.012 m
+95.161 3.902 95.132 3.81 95.073 3.733 c
+95.015 3.663 94.919 3.63 94.794 3.63 c
+94.676 3.63 94.581 3.663 94.515 3.733 c
+94.456 3.81 94.427 3.902 94.427 4.012 c
+94.427 4.13 94.456 4.222 94.515 4.292 c
+94.581 4.369 94.676 4.409 94.794 4.409 c
+94.919 4.409 95.015 4.369 95.073 4.292 c
+95.132 4.211 95.161 4.119 95.161 4.012 c
+98.072 0 m
+98.072 0.147 98.017 0.268 97.91 0.367 c
+97.8 0.463 97.594 0.58 97.293 0.72 c
+96.948 0.866 96.705 0.988 96.557 1.087 c
+96.411 1.194 96.301 1.311 96.235 1.44 c
+96.164 1.565 96.131 1.723 96.131 1.911 c
+96.131 2.234 96.249 2.502 96.484 2.719 c
+96.719 2.932 97.021 3.042 97.396 3.042 c
+97.778 3.042 98.086 2.929 98.321 2.705 c
+98.557 2.476 98.674 2.19 98.674 1.837 c
+98.028 1.837 l
+98.028 2.013 97.969 2.164 97.851 2.293 c
+97.733 2.418 97.579 2.484 97.396 2.484 c
+97.197 2.484 97.047 2.429 96.94 2.322 c
+96.83 2.223 96.779 2.09 96.779 1.925 c
+96.779 1.797 96.815 1.69 96.896 1.602 c
+96.973 1.521 97.164 1.418 97.469 1.294 c
+97.947 1.105 98.278 0.918 98.454 0.735 c
+98.631 0.558 98.718 0.33 98.718 0.058 c
+98.718 -0.294 98.594 -0.574 98.351 -0.78 c
+98.116 -0.985 97.8 -1.088 97.411 -1.088 c
+96.988 -1.088 96.65 -0.971 96.397 -0.736 c
+96.139 -0.493 96.014 -0.188 96.014 0.176 c
+96.661 0.176 l
+96.668 -0.052 96.738 -0.229 96.867 -0.353 c
+96.991 -0.47 97.176 -0.53 97.411 -0.53 c
+97.623 -0.53 97.785 -0.482 97.895 -0.383 c
+98.013 -0.287 98.072 -0.158 98.072 0 c
+100.409 3.924 m
+100.409 2.969 l
+101.012 2.969 l
+101.012 2.439 l
+100.409 2.439 l
+100.409 -0.03 l
+100.409 -0.188 100.431 -0.306 100.482 -0.383 c
+100.542 -0.464 100.63 -0.5 100.747 -0.5 c
+100.835 -0.5 100.923 -0.485 101.012 -0.456 c
+101.012 -1.015 l
+100.865 -1.062 100.711 -1.088 100.556 -1.088 c
+100.299 -1.088 100.104 -0.996 99.968 -0.809 c
+99.828 -0.626 99.763 -0.364 99.763 -0.03 c
+99.763 2.439 l
+99.159 2.439 l
+99.159 2.969 l
+99.763 2.969 l
+99.763 3.924 l
+h
+101.82 -0.662 m
+101.82 -0.545 101.853 -0.449 101.923 -0.368 c
+101.989 -0.291 102.092 -0.25 102.232 -0.25 c
+102.379 -0.25 102.485 -0.291 102.555 -0.368 c
+102.633 -0.449 102.672 -0.545 102.672 -0.662 c
+102.672 -0.772 102.633 -0.864 102.555 -0.941 c
+102.485 -1.019 102.379 -1.058 102.232 -1.058 c
+102.092 -1.058 101.989 -1.019 101.923 -0.941 c
+101.853 -0.864 101.82 -0.772 101.82 -0.662 c
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 157.87 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 151.0312 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.646 -0.242 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.263 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.141 1.279 -3.218 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.319 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.318 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.476 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.2 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.52 -2.484 5.403 -2.396 c
+5.285 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.214 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.815 0.243 4.815 0.5 c
+4.815 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.189 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.029 7.122 2.076 7.122 2.117 c
+7.13 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.992 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.872 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.226 1.621 6.137 1.573 c
+6.056 1.532 5.991 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.498 3.117 l
+14.498 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.498 1.602 l
+14.498 -0.103 l
+14.498 -0.323 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.675 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.675 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.042 -1.301 14.942 -1.308 14.836 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.263 c
+14.222 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.792 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+22.281 -1.263 m
+22.281 0.853 l
+22.281 1.018 22.273 1.154 22.265 1.264 c
+22.255 1.371 22.236 1.455 22.207 1.515 c
+22.185 1.58 22.155 1.632 22.119 1.661 c
+22.09 1.691 22.049 1.706 22.001 1.706 c
+21.943 1.706 21.887 1.676 21.839 1.617 c
+21.799 1.565 21.766 1.492 21.737 1.397 c
+21.708 1.309 21.681 1.195 21.663 1.058 c
+21.652 0.919 21.648 0.769 21.648 0.603 c
+21.648 -1.263 l
+20.898 -1.263 l
+20.898 1.47 l
+20.898 1.706 l
+20.898 1.926 l
+20.898 2.003 20.891 2.066 20.884 2.117 c
+20.884 2.22 l
+21.56 2.22 l
+21.56 2.132 l
+21.56 1.985 l
+21.567 1.926 21.575 1.867 21.575 1.808 c
+21.575 1.646 l
+21.59 1.646 l
+21.608 1.735 21.637 1.812 21.677 1.881 c
+21.714 1.959 21.758 2.029 21.81 2.088 c
+21.868 2.147 21.935 2.19 22.016 2.22 c
+22.093 2.257 22.182 2.278 22.281 2.278 c
+22.464 2.278 22.604 2.224 22.692 2.117 c
+22.787 2.018 22.857 1.86 22.898 1.646 c
+22.913 1.646 l
+22.949 1.742 22.99 1.831 23.03 1.912 c
+23.078 1.989 23.133 2.051 23.192 2.103 c
+23.25 2.161 23.317 2.205 23.397 2.234 c
+23.474 2.264 23.563 2.278 23.662 2.278 c
+23.798 2.278 23.912 2.253 24 2.205 c
+24.089 2.153 24.154 2.08 24.206 1.985 c
+24.264 1.885 24.301 1.756 24.324 1.602 c
+24.353 1.455 24.368 1.272 24.368 1.058 c
+24.368 -1.263 l
+23.647 -1.263 l
+23.647 0.853 l
+23.647 1.018 23.64 1.154 23.632 1.264 c
+23.622 1.371 23.603 1.455 23.574 1.515 c
+23.552 1.58 23.522 1.632 23.486 1.661 c
+23.456 1.691 23.416 1.706 23.368 1.706 c
+23.25 1.706 23.155 1.617 23.089 1.441 c
+23.03 1.272 23.001 1.014 23.001 0.661 c
+23.001 -1.263 l
+h
+26.738 -1.323 m
+26.481 -1.323 26.253 -1.286 26.047 -1.22 c
+25.841 -1.143 25.665 -1.028 25.518 -0.881 c
+25.371 -0.727 25.253 -0.536 25.165 -0.309 c
+25.084 -0.085 25.047 0.181 25.047 0.485 c
+25.047 0.816 25.091 1.095 25.18 1.324 c
+25.276 1.559 25.404 1.742 25.562 1.881 c
+25.727 2.018 25.915 2.117 26.121 2.176 c
+26.327 2.242 26.535 2.278 26.753 2.278 c
+27.025 2.278 27.26 2.227 27.458 2.132 c
+27.664 2.043 27.829 1.912 27.958 1.735 c
+28.094 1.565 28.193 1.36 28.252 1.118 c
+28.318 0.882 28.355 0.618 28.355 0.324 c
+28.355 0.309 l
+25.988 0.309 l
+25.988 0.162 26.003 0.023 26.032 -0.103 c
+26.069 -0.231 26.124 -0.345 26.194 -0.44 c
+26.26 -0.529 26.344 -0.598 26.444 -0.646 c
+26.539 -0.698 26.653 -0.72 26.782 -0.72 c
+26.936 -0.72 27.076 -0.687 27.194 -0.617 c
+27.318 -0.551 27.407 -0.448 27.458 -0.309 c
+28.297 -0.382 l
+28.266 -0.481 28.212 -0.588 28.135 -0.706 c
+28.054 -0.816 27.95 -0.918 27.826 -1.014 c
+27.708 -1.103 27.553 -1.176 27.37 -1.234 c
+27.194 -1.294 26.98 -1.323 26.738 -1.323 c
+26.738 1.706 m
+26.65 1.706 26.562 1.691 26.473 1.661 c
+26.385 1.632 26.304 1.58 26.238 1.515 c
+26.169 1.444 26.109 1.357 26.061 1.249 c
+26.022 1.139 26.003 1.014 26.003 0.867 c
+27.472 0.867 l
+27.472 1.004 27.447 1.125 27.399 1.235 c
+27.359 1.341 27.304 1.43 27.237 1.5 c
+27.179 1.565 27.106 1.617 27.017 1.646 c
+26.929 1.683 26.834 1.706 26.738 1.706 c
+32.254 1.47 m
+32.154 1.478 32.052 1.488 31.945 1.5 c
+31.835 1.518 31.713 1.529 31.578 1.529 c
+31.401 1.529 31.243 1.488 31.107 1.411 c
+30.967 1.341 30.85 1.243 30.755 1.118 c
+30.666 0.989 30.597 0.842 30.549 0.676 c
+30.508 0.507 30.49 0.331 30.49 0.148 c
+30.49 -1.263 l
+29.593 -1.263 l
+29.593 0.985 l
+29.593 1.11 29.582 1.235 29.564 1.353 c
+29.552 1.478 29.538 1.596 29.519 1.706 c
+29.509 1.823 29.494 1.918 29.475 1.999 c
+29.454 2.088 29.435 2.161 29.417 2.22 c
+30.298 2.22 l
+30.306 2.168 30.317 2.117 30.328 2.058 c
+30.346 1.999 30.361 1.933 30.373 1.867 c
+30.391 1.808 30.406 1.742 30.416 1.676 c
+30.423 1.606 30.435 1.544 30.446 1.484 c
+30.46 1.484 l
+30.497 1.602 30.549 1.709 30.608 1.808 c
+30.674 1.904 30.755 1.989 30.843 2.058 c
+30.931 2.124 31.034 2.18 31.152 2.22 c
+31.276 2.257 31.424 2.278 31.592 2.278 c
+31.717 2.278 31.835 2.271 31.945 2.264 c
+32.062 2.253 32.166 2.238 32.254 2.22 c
+h
+34.834 -2.66 m
+34.616 -2.66 34.425 -2.635 34.26 -2.587 c
+34.091 -2.547 33.951 -2.484 33.834 -2.396 c
+33.716 -2.315 33.617 -2.219 33.54 -2.102 c
+33.471 -1.984 33.423 -1.855 33.392 -1.72 c
+34.29 -1.616 l
+34.327 -1.753 34.396 -1.859 34.495 -1.94 c
+34.591 -2.028 34.716 -2.072 34.863 -2.072 c
+34.951 -2.072 35.032 -2.057 35.113 -2.028 c
+35.19 -1.999 35.26 -1.944 35.318 -1.866 c
+35.377 -1.797 35.422 -1.705 35.451 -1.587 c
+35.487 -1.469 35.509 -1.323 35.509 -1.146 c
+35.509 -0.955 l
+35.509 -0.889 35.513 -0.831 35.524 -0.779 c
+35.524 -0.588 l
+35.509 -0.588 l
+35.41 -0.816 35.267 -0.977 35.083 -1.072 c
+34.896 -1.172 34.69 -1.22 34.466 -1.22 c
+34.26 -1.22 34.076 -1.183 33.922 -1.103 c
+33.775 -1.014 33.646 -0.897 33.54 -0.75 c
+33.44 -0.595 33.367 -0.411 33.319 -0.205 c
+33.268 0.008 33.246 0.243 33.246 0.5 c
+33.246 0.772 33.268 1.018 33.319 1.235 c
+33.378 1.448 33.459 1.632 33.569 1.779 c
+33.676 1.933 33.808 2.051 33.966 2.132 c
+34.121 2.22 34.308 2.264 34.525 2.264 c
+34.62 2.264 34.72 2.253 34.819 2.234 c
+34.915 2.213 35.002 2.18 35.083 2.132 c
+35.171 2.08 35.249 2.018 35.318 1.941 c
+35.395 1.86 35.458 1.768 35.509 1.661 c
+35.524 1.661 l
+35.524 1.808 l
+35.532 1.867 35.539 1.918 35.539 1.97 c
+35.547 2.029 35.553 2.076 35.553 2.117 c
+35.561 2.165 35.572 2.198 35.583 2.22 c
+36.436 2.22 l
+36.424 2.139 36.413 2.029 36.407 1.881 c
+36.407 1.411 l
+36.407 -1.161 l
+36.407 -1.415 36.37 -1.635 36.303 -1.822 c
+36.234 -2.007 36.131 -2.161 35.995 -2.278 c
+35.855 -2.403 35.69 -2.499 35.495 -2.557 c
+35.297 -2.624 35.076 -2.66 34.834 -2.66 c
+35.524 0.53 m
+35.524 0.742 35.499 0.919 35.451 1.058 c
+35.41 1.206 35.355 1.324 35.289 1.411 c
+35.231 1.5 35.16 1.559 35.083 1.588 c
+35.002 1.625 34.925 1.646 34.848 1.646 c
+34.749 1.646 34.657 1.621 34.568 1.573 c
+34.488 1.532 34.422 1.463 34.363 1.367 c
+34.312 1.279 34.267 1.162 34.231 1.014 c
+34.202 0.875 34.186 0.706 34.186 0.5 c
+34.186 0.125 34.246 -0.154 34.363 -0.338 c
+34.481 -0.515 34.643 -0.602 34.848 -0.602 c
+34.915 -0.602 34.988 -0.588 35.069 -0.558 c
+35.156 -0.521 35.231 -0.463 35.289 -0.382 c
+35.355 -0.294 35.41 -0.176 35.451 -0.029 c
+35.499 0.118 35.524 0.302 35.524 0.53 c
+38.923 -1.323 m
+38.666 -1.323 38.439 -1.286 38.233 -1.22 c
+38.027 -1.143 37.851 -1.028 37.704 -0.881 c
+37.556 -0.727 37.439 -0.536 37.35 -0.309 c
+37.27 -0.085 37.234 0.181 37.234 0.485 c
+37.234 0.816 37.277 1.095 37.365 1.324 c
+37.461 1.559 37.589 1.742 37.747 1.881 c
+37.913 2.018 38.1 2.117 38.306 2.176 c
+38.512 2.242 38.722 2.278 38.938 2.278 c
+39.21 2.278 39.445 2.227 39.644 2.132 c
+39.85 2.043 40.015 1.912 40.143 1.735 c
+40.28 1.565 40.378 1.36 40.438 1.118 c
+40.504 0.882 40.54 0.618 40.54 0.324 c
+40.54 0.309 l
+38.174 0.309 l
+38.174 0.162 38.188 0.023 38.218 -0.103 c
+38.254 -0.231 38.31 -0.345 38.379 -0.44 c
+38.446 -0.529 38.53 -0.598 38.63 -0.646 c
+38.725 -0.698 38.839 -0.72 38.967 -0.72 c
+39.122 -0.72 39.262 -0.687 39.379 -0.617 c
+39.504 -0.551 39.592 -0.448 39.644 -0.309 c
+40.482 -0.382 l
+40.452 -0.481 40.397 -0.588 40.32 -0.706 c
+40.239 -0.816 40.136 -0.918 40.012 -1.014 c
+39.894 -1.103 39.74 -1.176 39.555 -1.234 c
+39.379 -1.294 39.166 -1.323 38.923 -1.323 c
+38.923 1.706 m
+38.836 1.706 38.747 1.691 38.659 1.661 c
+38.57 1.632 38.489 1.58 38.424 1.515 c
+38.354 1.444 38.295 1.357 38.248 1.249 c
+38.207 1.139 38.188 1.014 38.188 0.867 c
+39.659 0.867 l
+39.659 1.004 39.632 1.125 39.585 1.235 c
+39.545 1.341 39.489 1.43 39.424 1.5 c
+39.364 1.565 39.291 1.617 39.203 1.646 c
+39.115 1.683 39.019 1.706 38.923 1.706 c
+46.236 -2.631 m
+46.236 3.514 l
+48.162 3.514 l
+48.162 2.896 l
+47.089 2.896 l
+47.089 -2.013 l
+48.162 -2.013 l
+48.162 -2.631 l
+h
+51.193 1.602 m
+51.193 -1.263 l
+50.297 -1.263 l
+50.297 1.602 l
+49.473 1.602 l
+49.473 2.22 l
+50.297 2.22 l
+50.297 2.484 l
+50.297 2.61 50.312 2.741 50.341 2.881 c
+50.378 3.017 50.447 3.135 50.547 3.234 c
+50.653 3.341 50.796 3.429 50.973 3.499 c
+51.149 3.564 51.374 3.601 51.649 3.601 c
+51.862 3.601 52.06 3.591 52.237 3.572 c
+52.413 3.55 52.564 3.532 52.693 3.514 c
+52.693 2.926 l
+52.564 2.944 52.421 2.959 52.267 2.97 c
+52.109 2.977 51.958 2.984 51.811 2.984 c
+51.682 2.984 51.58 2.97 51.502 2.94 c
+51.422 2.911 51.359 2.87 51.311 2.822 c
+51.26 2.771 51.226 2.708 51.208 2.631 c
+51.197 2.562 51.193 2.484 51.193 2.396 c
+51.193 2.22 l
+52.619 2.22 l
+52.619 1.602 l
+h
+56.625 1.47 m
+56.525 1.478 56.423 1.488 56.316 1.5 c
+56.205 1.518 56.085 1.529 55.949 1.529 c
+55.773 1.529 55.615 1.488 55.478 1.411 c
+55.339 1.341 55.221 1.243 55.125 1.118 c
+55.037 0.989 54.967 0.842 54.919 0.676 c
+54.879 0.507 54.861 0.331 54.861 0.148 c
+54.861 -1.263 l
+53.965 -1.263 l
+53.965 0.985 l
+53.965 1.11 53.953 1.235 53.934 1.353 c
+53.924 1.478 53.909 1.596 53.891 1.706 c
+53.88 1.823 53.865 1.918 53.847 1.999 c
+53.824 2.088 53.807 2.161 53.788 2.22 c
+54.67 2.22 l
+54.677 2.168 54.688 2.117 54.699 2.058 c
+54.717 1.999 54.732 1.933 54.744 1.867 c
+54.761 1.808 54.776 1.742 54.788 1.676 c
+54.794 1.606 54.806 1.544 54.817 1.484 c
+54.832 1.484 l
+54.869 1.602 54.919 1.709 54.979 1.808 c
+55.044 1.904 55.125 1.989 55.214 2.058 c
+55.302 2.124 55.405 2.18 55.522 2.22 c
+55.648 2.257 55.794 2.278 55.964 2.278 c
+56.088 2.278 56.205 2.271 56.316 2.264 c
+56.434 2.253 56.536 2.238 56.625 2.22 c
+h
+60.876 0.485 m
+60.876 0.21 60.839 -0.04 60.774 -0.264 c
+60.704 -0.481 60.601 -0.669 60.465 -0.823 c
+60.325 -0.981 60.149 -1.103 59.935 -1.19 c
+59.719 -1.278 59.465 -1.323 59.172 -1.323 c
+58.896 -1.323 58.649 -1.278 58.437 -1.19 c
+58.231 -1.103 58.058 -0.981 57.922 -0.823 c
+57.782 -0.669 57.68 -0.481 57.614 -0.264 c
+57.543 -0.04 57.51 0.21 57.51 0.485 c
+57.51 0.738 57.539 0.974 57.599 1.191 c
+57.664 1.415 57.768 1.606 57.907 1.764 c
+58.044 1.929 58.219 2.058 58.437 2.147 c
+58.649 2.234 58.907 2.278 59.201 2.278 c
+59.513 2.278 59.774 2.234 59.98 2.147 c
+60.193 2.058 60.365 1.929 60.494 1.764 c
+60.631 1.606 60.729 1.415 60.789 1.191 c
+60.847 0.974 60.876 0.738 60.876 0.485 c
+59.921 0.485 m
+59.921 0.691 59.906 0.867 59.877 1.014 c
+59.855 1.162 59.818 1.283 59.76 1.382 c
+59.7 1.478 59.627 1.548 59.538 1.588 c
+59.451 1.636 59.341 1.661 59.216 1.661 c
+58.951 1.661 58.76 1.562 58.642 1.367 c
+58.524 1.18 58.466 0.886 58.466 0.485 c
+58.466 0.063 58.524 -0.243 58.642 -0.426 c
+58.76 -0.613 58.936 -0.706 59.172 -0.706 c
+59.297 -0.706 59.411 -0.687 59.509 -0.646 c
+59.605 -0.598 59.686 -0.525 59.745 -0.426 c
+59.811 -0.33 59.855 -0.205 59.877 -0.058 c
+59.906 0.088 59.921 0.268 59.921 0.485 c
+62.894 -1.263 m
+62.894 0.853 l
+62.894 1.018 62.887 1.154 62.879 1.264 c
+62.869 1.371 62.85 1.455 62.821 1.515 c
+62.798 1.58 62.769 1.632 62.732 1.661 c
+62.703 1.691 62.663 1.706 62.615 1.706 c
+62.555 1.706 62.501 1.676 62.453 1.617 c
+62.412 1.565 62.38 1.492 62.35 1.397 c
+62.32 1.309 62.295 1.195 62.277 1.058 c
+62.266 0.919 62.262 0.769 62.262 0.603 c
+62.262 -1.263 l
+61.512 -1.263 l
+61.512 1.47 l
+61.512 1.706 l
+61.512 1.926 l
+61.512 2.003 61.505 2.066 61.497 2.117 c
+61.497 2.22 l
+62.173 2.22 l
+62.173 2.132 l
+62.173 1.985 l
+62.181 1.926 62.189 1.867 62.189 1.808 c
+62.189 1.646 l
+62.203 1.646 l
+62.221 1.735 62.251 1.812 62.291 1.881 c
+62.328 1.959 62.372 2.029 62.424 2.088 c
+62.482 2.147 62.549 2.19 62.63 2.22 c
+62.707 2.257 62.794 2.278 62.894 2.278 c
+63.078 2.278 63.218 2.224 63.305 2.117 c
+63.401 2.018 63.471 1.86 63.511 1.646 c
+63.526 1.646 l
+63.563 1.742 63.603 1.831 63.644 1.912 c
+63.691 1.989 63.746 2.051 63.806 2.103 c
+63.864 2.161 63.93 2.205 64.011 2.234 c
+64.088 2.264 64.176 2.278 64.276 2.278 c
+64.411 2.278 64.525 2.253 64.614 2.205 c
+64.702 2.153 64.768 2.08 64.82 1.985 c
+64.878 1.885 64.915 1.756 64.937 1.602 c
+64.967 1.455 64.982 1.272 64.982 1.058 c
+64.982 -1.263 l
+64.261 -1.263 l
+64.261 0.853 l
+64.261 1.018 64.253 1.154 64.246 1.264 c
+64.236 1.371 64.217 1.455 64.188 1.515 c
+64.165 1.58 64.136 1.632 64.099 1.661 c
+64.07 1.691 64.03 1.706 63.982 1.706 c
+63.864 1.706 63.769 1.617 63.702 1.441 c
+63.644 1.272 63.614 1.014 63.614 0.661 c
+63.614 -1.263 l
+h
+72.044 -1.263 m
+72.044 0.721 l
+72.044 1.022 72 1.243 71.912 1.382 c
+71.831 1.529 71.695 1.602 71.5 1.602 c
+71.39 1.602 71.287 1.577 71.191 1.529 c
+71.103 1.478 71.022 1.411 70.956 1.324 c
+70.898 1.235 70.846 1.125 70.81 1 c
+70.78 0.882 70.765 0.75 70.765 0.603 c
+70.765 -1.263 l
+69.854 -1.263 l
+69.854 1.441 l
+69.854 1.661 l
+69.854 1.75 69.846 1.827 69.84 1.897 c
+69.84 2.088 l
+69.84 2.22 l
+70.692 2.22 l
+70.699 2.19 70.707 2.147 70.707 2.088 c
+70.707 1.897 l
+70.714 1.827 70.721 1.756 70.721 1.691 c
+70.729 1.621 70.736 1.565 70.736 1.529 c
+70.75 1.529 l
+70.868 1.794 71.019 1.985 71.206 2.103 c
+71.39 2.22 71.61 2.278 71.868 2.278 c
+72.051 2.278 72.213 2.249 72.353 2.19 c
+72.489 2.132 72.602 2.043 72.691 1.926 c
+72.779 1.808 72.841 1.665 72.882 1.5 c
+72.93 1.341 72.955 1.154 72.955 0.941 c
+72.955 -1.263 l
+h
+74.873 -1.323 m
+74.705 -1.323 74.554 -1.301 74.418 -1.263 c
+74.289 -1.216 74.175 -1.146 74.079 -1.058 c
+73.992 -0.97 73.922 -0.864 73.874 -0.735 c
+73.823 -0.598 73.801 -0.448 73.801 -0.279 c
+73.801 -0.073 73.834 0.096 73.904 0.235 c
+73.969 0.383 74.065 0.493 74.183 0.574 c
+74.308 0.661 74.451 0.724 74.609 0.765 c
+74.775 0.802 74.951 0.827 75.138 0.838 c
+75.858 0.853 l
+75.858 1.029 l
+75.858 1.147 75.847 1.249 75.829 1.338 c
+75.807 1.426 75.774 1.492 75.726 1.544 c
+75.685 1.602 75.638 1.639 75.579 1.661 c
+75.521 1.679 75.454 1.691 75.388 1.691 c
+75.318 1.691 75.255 1.679 75.197 1.661 c
+75.145 1.65 75.098 1.625 75.05 1.588 c
+75.01 1.559 74.977 1.507 74.947 1.441 c
+74.925 1.382 74.91 1.301 74.903 1.206 c
+73.962 1.249 l
+73.992 1.397 74.036 1.532 74.094 1.661 c
+74.16 1.786 74.256 1.897 74.374 1.985 c
+74.492 2.08 74.631 2.153 74.8 2.205 c
+74.977 2.253 75.182 2.278 75.417 2.278 c
+75.858 2.278 76.19 2.168 76.417 1.955 c
+76.652 1.75 76.77 1.441 76.77 1.029 c
+76.77 -0.235 l
+76.77 -0.455 l
+76.778 -0.515 76.792 -0.569 76.814 -0.617 c
+76.832 -0.658 76.861 -0.691 76.902 -0.72 c
+76.939 -0.742 76.99 -0.75 77.049 -0.75 c
+77.115 -0.75 77.185 -0.746 77.254 -0.735 c
+77.254 -1.22 l
+77.196 -1.23 77.141 -1.242 77.094 -1.249 c
+77.053 -1.261 77.013 -1.267 76.976 -1.278 c
+76.936 -1.286 76.891 -1.294 76.843 -1.294 c
+76.792 -1.301 76.733 -1.308 76.667 -1.308 c
+76.439 -1.308 76.274 -1.257 76.167 -1.146 c
+76.057 -1.028 75.995 -0.864 75.976 -0.646 c
+75.961 -0.646 l
+75.891 -0.756 75.822 -0.852 75.756 -0.941 c
+75.685 -1.022 75.608 -1.087 75.521 -1.146 c
+75.432 -1.205 75.333 -1.249 75.226 -1.278 c
+75.127 -1.308 75.01 -1.323 74.873 -1.323 c
+75.858 0.353 m
+75.432 0.339 l
+75.333 0.339 75.241 0.331 75.153 0.324 c
+75.072 0.312 75.006 0.287 74.947 0.25 c
+74.889 0.21 74.837 0.151 74.8 0.073 c
+74.76 0.004 74.742 -0.087 74.742 -0.205 c
+74.742 -0.374 74.775 -0.496 74.844 -0.573 c
+74.91 -0.654 75.01 -0.691 75.138 -0.691 c
+75.245 -0.691 75.344 -0.669 75.432 -0.617 c
+75.528 -0.569 75.608 -0.507 75.667 -0.426 c
+75.733 -0.349 75.785 -0.261 75.814 -0.162 c
+75.843 -0.055 75.858 0.059 75.858 0.177 c
+h
+79.14 -1.263 m
+79.14 0.853 l
+79.14 1.018 79.133 1.154 79.126 1.264 c
+79.114 1.371 79.096 1.455 79.066 1.515 c
+79.045 1.58 79.016 1.632 78.978 1.661 c
+78.949 1.691 78.908 1.706 78.861 1.706 c
+78.802 1.706 78.746 1.676 78.699 1.617 c
+78.659 1.565 78.626 1.492 78.596 1.397 c
+78.567 1.309 78.541 1.195 78.523 1.058 c
+78.511 0.919 78.508 0.769 78.508 0.603 c
+78.508 -1.263 l
+77.759 -1.263 l
+77.759 1.47 l
+77.759 1.706 l
+77.759 1.926 l
+77.759 2.003 77.751 2.066 77.744 2.117 c
+77.744 2.22 l
+78.42 2.22 l
+78.42 2.132 l
+78.42 1.985 l
+78.428 1.926 78.434 1.867 78.434 1.808 c
+78.434 1.646 l
+78.449 1.646 l
+78.468 1.735 78.497 1.812 78.538 1.881 c
+78.574 1.959 78.619 2.029 78.669 2.088 c
+78.729 2.147 78.794 2.19 78.875 2.22 c
+78.952 2.257 79.041 2.278 79.14 2.278 c
+79.324 2.278 79.463 2.224 79.552 2.117 c
+79.647 2.018 79.717 1.86 79.758 1.646 c
+79.772 1.646 l
+79.809 1.742 79.849 1.831 79.889 1.912 c
+79.937 1.989 79.993 2.051 80.051 2.103 c
+80.111 2.161 80.176 2.205 80.257 2.234 c
+80.334 2.264 80.423 2.278 80.522 2.278 c
+80.658 2.278 80.772 2.253 80.859 2.205 c
+80.948 2.153 81.015 2.08 81.065 1.985 c
+81.125 1.885 81.161 1.756 81.183 1.602 c
+81.213 1.455 81.227 1.272 81.227 1.058 c
+81.227 -1.263 l
+80.508 -1.263 l
+80.508 0.853 l
+80.508 1.018 80.5 1.154 80.492 1.264 c
+80.481 1.371 80.463 1.455 80.433 1.515 c
+80.412 1.58 80.382 1.632 80.346 1.661 c
+80.316 1.691 80.275 1.706 80.228 1.706 c
+80.111 1.706 80.015 1.617 79.949 1.441 c
+79.889 1.272 79.86 1.014 79.86 0.661 c
+79.86 -1.263 l
+h
+83.598 -1.323 m
+83.34 -1.323 83.112 -1.286 82.906 -1.22 c
+82.701 -1.143 82.524 -1.028 82.378 -0.881 c
+82.231 -0.727 82.113 -0.536 82.025 -0.309 c
+81.944 -0.085 81.907 0.181 81.907 0.485 c
+81.907 0.816 81.952 1.095 82.039 1.324 c
+82.135 1.559 82.264 1.742 82.422 1.881 c
+82.587 2.018 82.775 2.117 82.98 2.176 c
+83.186 2.242 83.396 2.278 83.612 2.278 c
+83.884 2.278 84.119 2.227 84.318 2.132 c
+84.523 2.043 84.689 1.912 84.818 1.735 c
+84.953 1.565 85.053 1.36 85.112 1.118 c
+85.177 0.882 85.214 0.618 85.214 0.324 c
+85.214 0.309 l
+82.848 0.309 l
+82.848 0.162 82.862 0.023 82.892 -0.103 c
+82.929 -0.231 82.984 -0.345 83.054 -0.44 c
+83.12 -0.529 83.205 -0.598 83.303 -0.646 c
+83.399 -0.698 83.513 -0.72 83.642 -0.72 c
+83.796 -0.72 83.936 -0.687 84.053 -0.617 c
+84.178 -0.551 84.267 -0.448 84.318 -0.309 c
+85.156 -0.382 l
+85.127 -0.481 85.071 -0.588 84.994 -0.706 c
+84.913 -0.816 84.81 -0.918 84.685 -1.014 c
+84.568 -1.103 84.414 -1.176 84.23 -1.234 c
+84.053 -1.294 83.84 -1.323 83.598 -1.323 c
+83.598 1.706 m
+83.509 1.706 83.421 1.691 83.333 1.661 c
+83.245 1.632 83.164 1.58 83.097 1.515 c
+83.028 1.444 82.969 1.357 82.922 1.249 c
+82.881 1.139 82.862 1.014 82.862 0.867 c
+84.333 0.867 l
+84.333 1.004 84.307 1.125 84.259 1.235 c
+84.219 1.341 84.163 1.43 84.097 1.5 c
+84.038 1.565 83.965 1.617 83.877 1.646 c
+83.789 1.683 83.693 1.706 83.598 1.706 c
+86.467 -2.631 m
+86.467 -2.013 l
+87.541 -2.013 l
+87.541 2.896 l
+86.467 2.896 l
+86.467 3.514 l
+88.393 3.514 l
+88.393 -2.631 l
+h
+f
+Q
+q 1 0 0 1 546.3644 140.2277 cm
+0 0 m
+0.676 0 l
+0.676 -3.792 l
+0.676 -4.303 0.544 -4.704 0.279 -4.998 c
+0.022 -5.284 -0.324 -5.424 -0.765 -5.424 c
+-1.228 -5.424 -1.584 -5.288 -1.837 -5.012 c
+-2.084 -4.74 -2.205 -4.358 -2.205 -3.865 c
+-1.529 -3.865 l
+-1.529 -4.182 -1.467 -4.424 -1.338 -4.601 c
+-1.201 -4.77 -1.01 -4.85 -0.765 -4.85 c
+-0.54 -4.85 -0.36 -4.759 -0.221 -4.571 c
+-0.073 -4.388 0 -4.123 0 -3.778 c
+h
+1.573 -3.175 m
+1.573 -2.598 1.708 -2.142 1.984 -1.808 c
+2.267 -1.467 2.639 -1.294 3.102 -1.294 c
+3.561 -1.294 3.929 -1.463 4.204 -1.793 c
+4.486 -2.117 4.634 -2.565 4.644 -3.131 c
+4.644 -3.557 l
+4.644 -4.127 4.501 -4.582 4.218 -4.924 c
+3.943 -5.259 3.576 -5.424 3.116 -5.424 c
+2.653 -5.424 2.282 -5.262 1.999 -4.939 c
+1.723 -4.609 1.58 -4.167 1.573 -3.616 c
+h
+2.219 -3.557 m
+2.219 -3.961 2.296 -4.278 2.454 -4.513 c
+2.62 -4.748 2.84 -4.865 3.116 -4.865 c
+3.682 -4.865 3.976 -4.453 3.998 -3.63 c
+3.998 -3.175 l
+3.998 -2.774 3.913 -2.454 3.748 -2.219 c
+3.59 -1.977 3.374 -1.852 3.102 -1.852 c
+2.836 -1.852 2.62 -1.977 2.454 -2.219 c
+2.296 -2.454 2.219 -2.774 2.219 -3.175 c
+h
+6.188 -5.351 -0.647 3.984 re
+6.232 -0.324 m
+6.232 -0.434 6.203 -0.526 6.144 -0.603 c
+6.086 -0.673 5.99 -0.706 5.865 -0.706 c
+5.747 -0.706 5.652 -0.673 5.585 -0.603 c
+5.527 -0.526 5.498 -0.434 5.498 -0.324 c
+5.498 -0.206 5.527 -0.114 5.585 -0.044 c
+5.652 0.033 5.747 0.073 5.865 0.073 c
+5.99 0.073 6.086 0.033 6.144 -0.044 c
+6.203 -0.125 6.232 -0.217 6.232 -0.324 c
+7.819 -1.367 m
+7.835 -1.808 l
+8.088 -1.467 8.411 -1.294 8.804 -1.294 c
+9.51 -1.294 9.866 -1.764 9.878 -2.705 c
+9.878 -5.351 l
+9.231 -5.351 l
+9.231 -2.734 l
+9.231 -2.421 9.176 -2.201 9.069 -2.072 c
+8.959 -1.947 8.804 -1.881 8.598 -1.881 c
+8.441 -1.881 8.294 -1.937 8.158 -2.043 c
+8.029 -2.153 7.927 -2.29 7.85 -2.454 c
+7.85 -5.351 l
+7.202 -5.351 l
+7.202 -1.367 l
+h
+14.508 -4.336 m
+14.508 -4.189 14.453 -4.068 14.346 -3.969 c
+14.236 -3.873 14.03 -3.755 13.729 -3.616 c
+13.383 -3.469 13.141 -3.348 12.993 -3.248 c
+12.847 -3.142 12.737 -3.024 12.671 -2.896 c
+12.6 -2.77 12.567 -2.612 12.567 -2.425 c
+12.567 -2.102 12.685 -1.833 12.92 -1.617 c
+13.155 -1.404 13.457 -1.294 13.832 -1.294 c
+14.214 -1.294 14.522 -1.407 14.757 -1.631 c
+14.993 -1.86 15.11 -2.146 15.11 -2.499 c
+14.464 -2.499 l
+14.464 -2.323 14.405 -2.172 14.287 -2.043 c
+14.169 -1.918 14.015 -1.852 13.832 -1.852 c
+13.633 -1.852 13.483 -1.907 13.376 -2.014 c
+13.265 -2.113 13.215 -2.246 13.215 -2.411 c
+13.215 -2.539 13.251 -2.646 13.332 -2.734 c
+13.409 -2.815 13.6 -2.918 13.905 -3.042 c
+14.383 -3.23 14.713 -3.418 14.89 -3.601 c
+15.066 -3.778 15.154 -4.006 15.154 -4.278 c
+15.154 -4.63 15.029 -4.91 14.787 -5.116 c
+14.552 -5.321 14.236 -5.424 13.847 -5.424 c
+13.423 -5.424 13.086 -5.307 12.832 -5.072 c
+12.575 -4.829 12.45 -4.524 12.45 -4.16 c
+13.097 -4.16 l
+13.104 -4.388 13.174 -4.564 13.302 -4.689 c
+13.427 -4.806 13.612 -4.865 13.847 -4.865 c
+14.059 -4.865 14.221 -4.818 14.331 -4.719 c
+14.449 -4.623 14.508 -4.494 14.508 -4.336 c
+18.873 -3.557 m
+18.873 -4.185 18.755 -4.656 18.52 -4.968 c
+18.293 -5.274 17.977 -5.424 17.565 -5.424 c
+17.161 -5.424 16.852 -5.274 16.639 -4.968 c
+16.639 -6.88 l
+15.993 -6.88 l
+15.993 -1.367 l
+16.581 -1.367 l
+16.625 -1.808 l
+16.837 -1.467 17.146 -1.294 17.55 -1.294 c
+17.992 -1.294 18.319 -1.448 18.535 -1.749 c
+18.749 -2.055 18.863 -2.51 18.873 -3.117 c
+h
+18.227 -3.175 m
+18.227 -2.734 18.157 -2.411 18.021 -2.205 c
+17.882 -1.992 17.66 -1.881 17.359 -1.881 c
+17.043 -1.881 16.804 -2.036 16.639 -2.337 c
+16.639 -4.41 l
+16.804 -4.715 17.043 -4.865 17.359 -4.865 c
+17.653 -4.865 17.867 -4.763 18.006 -4.557 c
+18.142 -4.343 18.216 -4.013 18.227 -3.572 c
+h
+21.138 -5.424 m
+20.637 -5.424 20.255 -5.277 19.991 -4.983 c
+19.726 -4.689 19.594 -4.256 19.594 -3.675 c
+19.594 -3.204 l
+19.594 -2.61 19.719 -2.142 19.976 -1.808 c
+20.24 -1.467 20.6 -1.294 21.063 -1.294 c
+21.523 -1.294 21.865 -1.448 22.092 -1.749 c
+22.327 -2.043 22.449 -2.506 22.46 -3.131 c
+22.46 -3.557 l
+20.24 -3.557 l
+20.24 -3.645 l
+20.24 -4.079 20.317 -4.391 20.475 -4.586 c
+20.641 -4.773 20.872 -4.865 21.167 -4.865 c
+21.361 -4.865 21.534 -4.833 21.681 -4.763 c
+21.828 -4.686 21.963 -4.568 22.092 -4.41 c
+22.431 -4.821 l
+22.144 -5.226 21.714 -5.424 21.138 -5.424 c
+21.063 -1.852 m
+20.788 -1.852 20.586 -1.947 20.461 -2.132 c
+20.332 -2.319 20.259 -2.61 20.24 -2.999 c
+21.813 -2.999 l
+21.813 -2.911 l
+21.791 -2.529 21.725 -2.26 21.608 -2.102 c
+21.49 -1.937 21.306 -1.852 21.063 -1.852 c
+24.621 -4.865 m
+24.834 -4.865 25.007 -4.803 25.136 -4.675 c
+25.271 -4.538 25.344 -4.347 25.356 -4.101 c
+25.973 -4.101 l
+25.951 -4.484 25.815 -4.803 25.562 -5.056 c
+25.304 -5.303 24.992 -5.424 24.621 -5.424 c
+24.128 -5.424 23.754 -5.274 23.489 -4.968 c
+23.232 -4.656 23.106 -4.189 23.106 -3.572 c
+23.106 -3.131 l
+23.106 -2.535 23.232 -2.08 23.489 -1.764 c
+23.754 -1.452 24.128 -1.294 24.621 -1.294 c
+25.021 -1.294 25.341 -1.426 25.576 -1.691 c
+25.819 -1.947 25.951 -2.294 25.973 -2.734 c
+25.356 -2.734 l
+25.334 -2.44 25.26 -2.219 25.136 -2.072 c
+25.018 -1.926 24.845 -1.852 24.621 -1.852 c
+24.327 -1.852 24.11 -1.951 23.974 -2.146 c
+23.835 -2.334 23.761 -2.643 23.754 -3.072 c
+23.754 -3.587 l
+23.754 -4.057 23.82 -4.391 23.96 -4.586 c
+24.106 -4.773 24.327 -4.865 24.621 -4.865 c
+27.428 -5.351 -0.646 3.984 re
+27.472 -0.324 m
+27.472 -0.434 27.443 -0.526 27.384 -0.603 c
+27.326 -0.673 27.23 -0.706 27.105 -0.706 c
+26.987 -0.706 26.892 -0.673 26.825 -0.603 c
+26.767 -0.526 26.738 -0.434 26.738 -0.324 c
+26.738 -0.206 26.767 -0.114 26.825 -0.044 c
+26.892 0.033 26.987 0.073 27.105 0.073 c
+27.23 0.073 27.326 0.033 27.384 -0.044 c
+27.443 -0.125 27.472 -0.217 27.472 -0.324 c
+28.619 -5.351 m
+28.619 -1.897 l
+28.105 -1.897 l
+28.105 -1.367 l
+28.619 -1.367 l
+28.619 -1 l
+28.627 -0.57 28.741 -0.235 28.957 0 c
+29.181 0.243 29.493 0.368 29.898 0.368 c
+30.044 0.368 30.185 0.345 30.324 0.309 c
+30.471 0.268 30.622 0.213 30.78 0.147 c
+30.662 -0.426 l
+30.427 -0.301 30.185 -0.235 29.942 -0.235 c
+29.695 -0.235 29.523 -0.305 29.427 -0.441 c
+29.328 -0.57 29.281 -0.765 29.281 -1.029 c
+29.281 -1.367 l
+29.927 -1.367 l
+29.927 -1.897 l
+29.281 -1.897 l
+29.281 -5.351 l
+h
+31.089 -5.351 -0.647 3.984 re
+33.558 -5.424 m
+33.058 -5.424 32.676 -5.277 32.411 -4.983 c
+32.147 -4.689 32.014 -4.256 32.014 -3.675 c
+32.014 -3.204 l
+32.014 -2.61 32.139 -2.142 32.396 -1.808 c
+32.662 -1.467 33.021 -1.294 33.485 -1.294 c
+33.944 -1.294 34.285 -1.448 34.513 -1.749 c
+34.748 -2.043 34.869 -2.506 34.881 -3.131 c
+34.881 -3.557 l
+32.662 -3.557 l
+32.662 -3.645 l
+32.662 -4.079 32.739 -4.391 32.897 -4.586 c
+33.061 -4.773 33.293 -4.865 33.587 -4.865 c
+33.782 -4.865 33.955 -4.833 34.102 -4.763 c
+34.249 -4.686 34.385 -4.568 34.513 -4.41 c
+34.852 -4.821 l
+34.565 -5.226 34.135 -5.424 33.558 -5.424 c
+33.485 -1.852 m
+33.209 -1.852 33.007 -1.947 32.882 -2.132 c
+32.753 -2.319 32.679 -2.61 32.662 -2.999 c
+34.233 -2.999 l
+34.233 -2.911 l
+34.212 -2.529 34.146 -2.26 34.028 -2.102 c
+33.911 -1.937 33.726 -1.852 33.485 -1.852 c
+35.527 -3.175 m
+35.527 -2.569 35.638 -2.102 35.866 -1.779 c
+36.101 -1.455 36.428 -1.294 36.851 -1.294 c
+37.233 -1.294 37.53 -1.452 37.747 -1.764 c
+37.747 0.294 l
+38.393 0.294 l
+38.393 -5.351 l
+37.805 -5.351 l
+37.761 -4.924 l
+37.556 -5.259 37.25 -5.424 36.851 -5.424 c
+36.439 -5.424 36.115 -5.27 35.88 -4.954 c
+35.645 -4.63 35.527 -4.175 35.527 -3.587 c
+h
+36.174 -3.557 m
+36.174 -3.998 36.236 -4.329 36.365 -4.542 c
+36.502 -4.748 36.722 -4.85 37.027 -4.85 c
+37.35 -4.85 37.589 -4.689 37.747 -4.366 c
+37.747 -2.352 l
+37.578 -2.04 37.339 -1.881 37.027 -1.881 c
+36.722 -1.881 36.502 -1.984 36.365 -2.19 c
+36.236 -2.396 36.174 -2.72 36.174 -3.16 c
+h
+f
+Q
+q 1 0 0 1 588.8294 140.2861 cm
+0 0 m
+-0.382 0 l
+-0.382 -5.835 l
+0 -5.835 l
+0 -6.659 l
+-1.425 -6.659 l
+-1.425 0.823 l
+0 0.823 l
+h
+0.765 -5.409 m
+0.765 -2.219 l
+0.279 -2.219 l
+0.279 -1.425 l
+0.765 -1.425 l
+0.765 -1.072 l
+0.765 -0.631 0.875 -0.294 1.103 -0.058 c
+1.338 0.184 1.654 0.31 2.058 0.31 c
+2.183 0.31 2.341 0.283 2.529 0.235 c
+2.529 -0.588 l
+2.459 -0.569 2.374 -0.558 2.278 -0.558 c
+1.962 -0.558 1.808 -0.742 1.808 -1.102 c
+1.808 -1.425 l
+2.426 -1.425 l
+2.426 -2.219 l
+1.808 -2.219 l
+1.808 -5.409 l
+h
+4.954 -2.439 m
+4.616 -2.41 l
+4.329 -2.41 4.138 -2.535 4.042 -2.778 c
+4.042 -5.409 l
+2.999 -5.409 l
+2.999 -1.425 l
+3.969 -1.425 l
+3.998 -1.866 l
+4.164 -1.525 4.395 -1.352 4.69 -1.352 c
+4.807 -1.352 4.898 -1.374 4.969 -1.411 c
+h
+5.248 -3.293 m
+5.248 -2.686 5.388 -2.212 5.675 -1.866 c
+5.958 -1.525 6.35 -1.352 6.85 -1.352 c
+7.358 -1.352 7.755 -1.525 8.04 -1.866 c
+8.324 -2.212 8.467 -2.686 8.467 -3.293 c
+8.467 -3.557 l
+8.467 -4.156 8.324 -4.627 8.04 -4.968 c
+7.755 -5.313 7.358 -5.483 6.85 -5.483 c
+6.34 -5.483 5.943 -5.313 5.659 -4.968 c
+5.384 -4.627 5.248 -4.152 5.248 -3.542 c
+h
+6.292 -3.557 m
+6.292 -4.262 6.475 -4.615 6.85 -4.615 c
+7.203 -4.615 7.394 -4.321 7.423 -3.733 c
+7.423 -3.293 l
+7.423 -2.932 7.372 -2.66 7.277 -2.484 c
+7.177 -2.308 7.034 -2.219 6.85 -2.219 c
+6.674 -2.219 6.534 -2.308 6.438 -2.484 c
+6.34 -2.66 6.292 -2.932 6.292 -3.293 c
+h
+10.084 -1.425 m
+10.113 -1.793 l
+10.348 -1.499 10.658 -1.352 11.04 -1.352 c
+11.44 -1.352 11.719 -1.535 11.877 -1.896 c
+12.112 -1.535 12.439 -1.352 12.862 -1.352 c
+13.557 -1.352 13.91 -1.837 13.92 -2.807 c
+13.92 -5.409 l
+12.892 -5.409 l
+12.892 -2.865 l
+12.892 -2.642 12.855 -2.48 12.788 -2.381 c
+12.73 -2.285 12.62 -2.234 12.465 -2.234 c
+12.267 -2.234 12.127 -2.352 12.039 -2.587 c
+12.039 -5.409 l
+10.995 -5.409 l
+10.995 -2.881 l
+10.995 -2.645 10.966 -2.48 10.907 -2.381 c
+10.849 -2.285 10.739 -2.234 10.583 -2.234 c
+10.407 -2.234 10.264 -2.329 10.157 -2.513 c
+10.157 -5.409 l
+9.114 -5.409 l
+9.114 -1.425 l
+h
+17.39 -1.425 m
+17.419 -1.822 l
+17.654 -1.51 17.955 -1.352 18.33 -1.352 c
+19.013 -1.352 19.366 -1.833 19.389 -2.792 c
+19.389 -5.409 l
+18.344 -5.409 l
+18.344 -2.865 l
+18.344 -2.642 18.308 -2.48 18.242 -2.381 c
+18.172 -2.285 18.055 -2.234 17.889 -2.234 c
+17.702 -2.234 17.555 -2.329 17.448 -2.513 c
+17.448 -5.409 l
+16.405 -5.409 l
+16.405 -1.425 l
+h
+22.02 -5.409 m
+21.99 -5.35 21.961 -5.247 21.932 -5.1 c
+21.744 -5.357 21.494 -5.483 21.182 -5.483 c
+20.848 -5.483 20.568 -5.375 20.344 -5.159 c
+20.127 -4.935 20.021 -4.644 20.021 -4.292 c
+20.021 -3.881 20.153 -3.564 20.418 -3.336 c
+20.682 -3.101 21.064 -2.983 21.564 -2.983 c
+21.887 -2.983 l
+21.887 -2.66 l
+21.887 -2.484 21.851 -2.362 21.785 -2.293 c
+21.725 -2.215 21.637 -2.175 21.519 -2.175 c
+21.263 -2.175 21.137 -2.329 21.137 -2.63 c
+20.094 -2.63 l
+20.094 -2.26 20.23 -1.955 20.505 -1.72 c
+20.777 -1.477 21.126 -1.352 21.55 -1.352 c
+21.99 -1.352 22.328 -1.469 22.564 -1.705 c
+22.806 -1.932 22.93 -2.256 22.93 -2.675 c
+22.93 -4.542 l
+22.93 -4.887 22.979 -5.155 23.078 -5.35 c
+23.078 -5.409 l
+h
+21.417 -4.659 m
+21.523 -4.659 21.615 -4.641 21.696 -4.6 c
+21.785 -4.552 21.847 -4.494 21.887 -4.424 c
+21.887 -3.601 l
+21.637 -3.601 l
+21.461 -3.601 21.318 -3.659 21.211 -3.777 c
+21.112 -3.887 21.064 -4.035 21.064 -4.218 c
+21.064 -4.512 21.182 -4.659 21.417 -4.659 c
+24.651 -1.425 m
+24.68 -1.793 l
+24.916 -1.499 25.224 -1.352 25.606 -1.352 c
+26.007 -1.352 26.286 -1.535 26.444 -1.896 c
+26.679 -1.535 27.006 -1.352 27.429 -1.352 c
+28.123 -1.352 28.476 -1.837 28.487 -2.807 c
+28.487 -5.409 l
+27.458 -5.409 l
+27.458 -2.865 l
+27.458 -2.642 27.422 -2.48 27.356 -2.381 c
+27.296 -2.285 27.186 -2.234 27.032 -2.234 c
+26.834 -2.234 26.693 -2.352 26.606 -2.587 c
+26.606 -5.409 l
+25.562 -5.409 l
+25.562 -2.881 l
+25.562 -2.645 25.533 -2.48 25.474 -2.381 c
+25.415 -2.285 25.305 -2.234 25.151 -2.234 c
+24.974 -2.234 24.831 -2.329 24.725 -2.513 c
+24.725 -5.409 l
+23.68 -5.409 l
+23.68 -1.425 l
+h
+30.869 -5.483 m
+30.339 -5.483 29.92 -5.328 29.619 -5.012 c
+29.325 -4.689 29.178 -4.23 29.178 -3.63 c
+29.178 -3.322 l
+29.178 -2.697 29.314 -2.212 29.59 -1.866 c
+29.862 -1.525 30.255 -1.352 30.766 -1.352 c
+31.266 -1.352 31.636 -1.514 31.883 -1.837 c
+32.137 -2.16 32.268 -2.638 32.28 -3.262 c
+32.28 -3.763 l
+30.207 -3.763 l
+30.225 -4.056 30.288 -4.274 30.398 -4.409 c
+30.516 -4.549 30.695 -4.615 30.942 -4.615 c
+31.283 -4.615 31.574 -4.498 31.809 -4.262 c
+32.22 -4.895 l
+32.092 -5.071 31.905 -5.215 31.662 -5.321 c
+31.416 -5.427 31.152 -5.483 30.869 -5.483 c
+30.221 -3.042 m
+31.25 -3.042 l
+31.25 -2.94 l
+31.25 -2.705 31.21 -2.528 31.133 -2.41 c
+31.063 -2.285 30.934 -2.219 30.751 -2.219 c
+30.574 -2.219 30.442 -2.289 30.354 -2.425 c
+30.273 -2.553 30.229 -2.759 30.221 -3.042 c
+32.617 0.823 m
+34.044 0.823 l
+34.044 -6.659 l
+32.617 -6.659 l
+32.617 -5.835 l
+33 -5.835 l
+33 0 l
+32.617 0 l
+h
+f
+Q
+q 1 0 0 1 628.3846 136.6708 cm
+0 0 m
+0 -0.618 -0.114 -1.085 -0.338 -1.397 c
+-0.555 -1.713 -0.878 -1.867 -1.308 -1.867 c
+-1.731 -1.867 -2.043 -1.687 -2.248 -1.324 c
+-2.278 -1.794 l
+-2.88 -1.794 l
+-2.88 3.85 l
+-2.234 3.85 l
+-2.234 1.749 l
+-2.021 2.09 -1.712 2.263 -1.308 2.263 c
+-0.878 2.263 -0.555 2.105 -0.338 1.793 c
+-0.114 1.488 0 1.022 0 0.397 c
+h
+-0.646 0.382 m
+-0.646 0.852 -0.716 1.183 -0.852 1.381 c
+-0.981 1.576 -1.19 1.675 -1.484 1.675 c
+-1.818 1.675 -2.069 1.492 -2.234 1.132 c
+-2.234 -0.75 l
+-2.069 -1.114 -1.815 -1.294 -1.469 -1.294 c
+-1.176 -1.294 -0.966 -1.191 -0.837 -0.985 c
+-0.712 -0.779 -0.646 -0.464 -0.646 -0.03 c
+h
+2.485 1.573 m
+2.396 1.591 2.297 1.602 2.19 1.602 c
+1.856 1.602 1.621 1.418 1.484 1.058 c
+1.484 -1.794 l
+0.838 -1.794 l
+0.838 2.19 l
+1.47 2.19 l
+1.484 1.778 l
+1.661 2.102 1.904 2.263 2.22 2.263 c
+2.326 2.263 2.415 2.241 2.485 2.204 c
+h
+5.027 -1.794 m
+4.987 -1.706 4.962 -1.559 4.954 -1.353 c
+4.719 -1.698 4.424 -1.867 4.072 -1.867 c
+3.708 -1.867 3.425 -1.771 3.219 -1.573 c
+3.021 -1.367 2.926 -1.081 2.926 -0.706 c
+2.926 -0.306 3.061 0.014 3.337 0.249 c
+3.609 0.492 3.984 0.617 4.454 0.617 c
+4.939 0.617 l
+4.939 1.043 l
+4.939 1.278 4.884 1.444 4.777 1.543 c
+4.667 1.65 4.505 1.705 4.293 1.705 c
+4.094 1.705 3.932 1.646 3.807 1.529 c
+3.69 1.411 3.631 1.263 3.631 1.087 c
+2.984 1.087 l
+2.984 1.282 3.043 1.473 3.161 1.66 c
+3.286 1.845 3.447 1.992 3.645 2.102 c
+3.851 2.208 4.079 2.263 4.337 2.263 c
+4.738 2.263 5.042 2.161 5.247 1.955 c
+5.461 1.749 5.575 1.455 5.586 1.072 c
+5.586 -0.941 l
+5.586 -1.246 5.623 -1.511 5.704 -1.735 c
+5.704 -1.794 l
+h
+4.16 -1.279 m
+4.326 -1.279 4.476 -1.235 4.616 -1.147 c
+4.763 -1.058 4.869 -0.948 4.939 -0.809 c
+4.939 0.132 l
+4.572 0.132 l
+4.256 0.132 4.013 0.062 3.836 -0.073 c
+3.66 -0.202 3.572 -0.389 3.572 -0.632 c
+3.572 -0.86 3.616 -1.025 3.705 -1.132 c
+3.793 -1.231 3.944 -1.279 4.16 -1.279 c
+7.203 2.19 m
+7.217 1.749 l
+7.471 2.09 7.795 2.263 8.187 2.263 c
+8.893 2.263 9.249 1.793 9.261 0.852 c
+9.261 -1.794 l
+8.614 -1.794 l
+8.614 0.823 l
+8.614 1.135 8.559 1.356 8.453 1.484 c
+8.343 1.61 8.187 1.675 7.982 1.675 c
+7.824 1.675 7.676 1.62 7.541 1.514 c
+7.412 1.404 7.31 1.267 7.232 1.103 c
+7.232 -1.794 l
+6.585 -1.794 l
+6.585 2.19 l
+h
+11.612 -1.309 m
+11.826 -1.309 11.998 -1.246 12.127 -1.118 c
+12.263 -0.981 12.337 -0.79 12.347 -0.544 c
+12.965 -0.544 l
+12.943 -0.927 12.807 -1.246 12.553 -1.5 c
+12.296 -1.746 11.984 -1.867 11.612 -1.867 c
+11.121 -1.867 10.745 -1.717 10.481 -1.411 c
+10.224 -1.099 10.099 -0.632 10.099 -0.015 c
+10.099 0.426 l
+10.099 1.022 10.224 1.477 10.481 1.793 c
+10.745 2.105 11.121 2.263 11.612 2.263 c
+12.013 2.263 12.333 2.131 12.568 1.866 c
+12.811 1.61 12.943 1.263 12.965 0.823 c
+12.347 0.823 l
+12.326 1.117 12.252 1.338 12.127 1.484 c
+12.01 1.631 11.836 1.705 11.612 1.705 c
+11.319 1.705 11.102 1.606 10.966 1.411 c
+10.826 1.223 10.753 0.914 10.745 0.484 c
+10.745 -0.03 l
+10.745 -0.5 10.812 -0.834 10.951 -1.029 c
+11.098 -1.216 11.319 -1.309 11.612 -1.309 c
+14.361 1.778 m
+14.615 2.102 14.934 2.263 15.317 2.263 c
+16.023 2.263 16.378 1.793 16.39 0.852 c
+16.39 -1.794 l
+15.743 -1.794 l
+15.743 0.823 l
+15.743 1.135 15.688 1.356 15.582 1.484 c
+15.471 1.61 15.317 1.675 15.111 1.675 c
+14.953 1.675 14.806 1.62 14.67 1.514 c
+14.541 1.404 14.438 1.267 14.361 1.103 c
+14.361 -1.794 l
+13.714 -1.794 l
+13.714 3.85 l
+14.361 3.85 l
+h
+19.771 -1.794 -0.647 3.984 re
+19.815 3.233 m
+19.815 3.123 19.786 3.031 19.726 2.954 c
+19.668 2.884 19.572 2.851 19.447 2.851 c
+19.329 2.851 19.234 2.884 19.168 2.954 c
+19.109 3.031 19.08 3.123 19.08 3.233 c
+19.08 3.351 19.109 3.443 19.168 3.513 c
+19.234 3.59 19.329 3.63 19.447 3.63 c
+19.572 3.63 19.668 3.59 19.726 3.513 c
+19.786 3.432 19.815 3.34 19.815 3.233 c
+21.402 2.19 m
+21.417 1.749 l
+21.671 2.09 21.994 2.263 22.387 2.263 c
+23.092 2.263 23.449 1.793 23.46 0.852 c
+23.46 -1.794 l
+22.813 -1.794 l
+22.813 0.823 l
+22.813 1.135 22.758 1.356 22.651 1.484 c
+22.541 1.61 22.387 1.675 22.181 1.675 c
+22.023 1.675 21.876 1.62 21.741 1.514 c
+21.612 1.404 21.509 1.267 21.432 1.103 c
+21.432 -1.794 l
+20.785 -1.794 l
+20.785 2.19 l
+h
+25.282 3.145 m
+25.282 2.19 l
+25.885 2.19 l
+25.885 1.66 l
+25.282 1.66 l
+25.282 -0.809 l
+25.282 -0.967 25.305 -1.085 25.356 -1.162 c
+25.415 -1.243 25.503 -1.279 25.621 -1.279 c
+25.709 -1.279 25.797 -1.264 25.885 -1.235 c
+25.885 -1.794 l
+25.739 -1.841 25.584 -1.867 25.43 -1.867 c
+25.172 -1.867 24.978 -1.775 24.842 -1.588 c
+24.702 -1.405 24.636 -1.143 24.636 -0.809 c
+24.636 1.66 l
+24.033 1.66 l
+24.033 2.19 l
+24.636 2.19 l
+24.636 3.145 l
+h
+26.444 0.382 m
+26.444 0.959 26.58 1.415 26.855 1.749 c
+27.138 2.09 27.51 2.263 27.973 2.263 c
+28.432 2.263 28.8 2.094 29.076 1.764 c
+29.358 1.44 29.505 0.992 29.516 0.426 c
+29.516 0 l
+29.516 -0.57 29.373 -1.025 29.09 -1.367 c
+28.814 -1.702 28.447 -1.867 27.987 -1.867 c
+27.524 -1.867 27.154 -1.706 26.87 -1.382 c
+26.595 -1.052 26.452 -0.611 26.444 -0.059 c
+h
+27.091 0 m
+27.091 -0.405 27.168 -0.721 27.326 -0.956 c
+27.491 -1.191 27.711 -1.309 27.987 -1.309 c
+28.553 -1.309 28.847 -0.897 28.869 -0.073 c
+28.869 0.382 l
+28.869 0.783 28.785 1.103 28.619 1.338 c
+28.461 1.579 28.245 1.705 27.973 1.705 c
+27.708 1.705 27.491 1.579 27.326 1.338 c
+27.168 1.103 27.091 0.783 27.091 0.382 c
+h
+33.161 -0.706 m
+33.882 2.19 l
+34.572 2.19 l
+33.279 -2.352 l
+33.18 -2.694 33.037 -2.955 32.853 -3.131 c
+32.677 -3.308 32.474 -3.396 32.25 -3.396 c
+32.162 -3.396 32.048 -3.373 31.912 -3.337 c
+31.912 -2.793 l
+32.059 -2.808 l
+32.243 -2.808 32.39 -2.764 32.5 -2.675 c
+32.606 -2.587 32.695 -2.429 32.764 -2.205 c
+32.882 -1.764 l
+31.721 2.19 l
+32.426 2.19 l
+h
+35.013 0.382 m
+35.013 0.959 35.15 1.415 35.425 1.749 c
+35.708 2.09 36.079 2.263 36.542 2.263 c
+37.001 2.263 37.369 2.094 37.645 1.764 c
+37.928 1.44 38.075 0.992 38.086 0.426 c
+38.086 0 l
+38.086 -0.57 37.942 -1.025 37.66 -1.367 c
+37.384 -1.702 37.016 -1.867 36.557 -1.867 c
+36.094 -1.867 35.723 -1.706 35.44 -1.382 c
+35.164 -1.052 35.021 -0.611 35.013 -0.059 c
+h
+35.661 0 m
+35.661 -0.405 35.738 -0.721 35.896 -0.956 c
+36.06 -1.191 36.282 -1.309 36.557 -1.309 c
+37.123 -1.309 37.417 -0.897 37.439 -0.073 c
+37.439 0.382 l
+37.439 0.783 37.354 1.103 37.189 1.338 c
+37.031 1.579 36.814 1.705 36.542 1.705 c
+36.278 1.705 36.06 1.579 35.896 1.338 c
+35.738 1.103 35.661 0.783 35.661 0.382 c
+h
+40.952 -1.441 m
+40.735 -1.727 40.423 -1.867 40.012 -1.867 c
+39.648 -1.867 39.372 -1.746 39.188 -1.5 c
+39.012 -1.246 38.917 -0.882 38.909 -0.412 c
+38.909 2.19 l
+39.555 2.19 l
+39.555 -0.353 l
+39.555 -0.981 39.74 -1.294 40.114 -1.294 c
+40.515 -1.294 40.791 -1.118 40.937 -0.765 c
+40.937 2.19 l
+41.583 2.19 l
+41.583 -1.794 l
+40.966 -1.794 l
+h
+44.215 1.573 m
+44.127 1.591 44.028 1.602 43.921 1.602 c
+43.586 1.602 43.351 1.418 43.216 1.058 c
+43.216 -1.794 l
+42.568 -1.794 l
+42.568 2.19 l
+43.201 2.19 l
+43.216 1.778 l
+43.392 2.102 43.634 2.263 43.95 2.263 c
+44.057 2.263 44.145 2.241 44.215 2.204 c
+h
+47.964 -1.309 m
+48.176 -1.309 48.349 -1.246 48.478 -1.118 c
+48.614 -0.981 48.687 -0.79 48.698 -0.544 c
+49.315 -0.544 l
+49.294 -0.927 49.157 -1.246 48.904 -1.5 c
+48.647 -1.746 48.334 -1.867 47.964 -1.867 c
+47.471 -1.867 47.096 -1.717 46.832 -1.411 c
+46.574 -1.099 46.449 -0.632 46.449 -0.015 c
+46.449 0.426 l
+46.449 1.022 46.574 1.477 46.832 1.793 c
+47.096 2.105 47.471 2.263 47.964 2.263 c
+48.363 2.263 48.683 2.131 48.918 1.866 c
+49.161 1.61 49.294 1.263 49.315 0.823 c
+48.698 0.823 l
+48.677 1.117 48.602 1.338 48.478 1.484 c
+48.361 1.631 48.188 1.705 47.964 1.705 c
+47.669 1.705 47.453 1.606 47.316 1.411 c
+47.177 1.223 47.104 0.914 47.096 0.484 c
+47.096 -0.03 l
+47.096 -0.5 47.162 -0.834 47.302 -1.029 c
+47.449 -1.216 47.669 -1.309 47.964 -1.309 c
+52.093 -1.441 m
+51.877 -1.727 51.565 -1.867 51.153 -1.867 c
+50.79 -1.867 50.514 -1.746 50.33 -1.5 c
+50.154 -1.246 50.058 -0.882 50.05 -0.412 c
+50.05 2.19 l
+50.697 2.19 l
+50.697 -0.353 l
+50.697 -0.981 50.881 -1.294 51.256 -1.294 c
+51.656 -1.294 51.932 -1.118 52.079 -0.765 c
+52.079 2.19 l
+52.726 2.19 l
+52.726 -1.794 l
+52.109 -1.794 l
+h
+55.357 1.573 m
+55.268 1.591 55.17 1.602 55.063 1.602 c
+54.729 1.602 54.493 1.418 54.358 1.058 c
+54.358 -1.794 l
+53.711 -1.794 l
+53.711 2.19 l
+54.343 2.19 l
+54.358 1.778 l
+54.534 2.102 54.776 2.263 55.093 2.263 c
+55.199 2.263 55.287 2.241 55.357 2.204 c
+h
+57.65 1.573 m
+57.562 1.591 57.462 1.602 57.356 1.602 c
+57.022 1.602 56.787 1.418 56.65 1.058 c
+56.65 -1.794 l
+56.004 -1.794 l
+56.004 2.19 l
+56.635 2.19 l
+56.65 1.778 l
+56.827 2.102 57.069 2.263 57.385 2.263 c
+57.492 2.263 57.58 2.241 57.65 2.204 c
+h
+59.65 -1.867 m
+59.149 -1.867 58.767 -1.72 58.503 -1.426 c
+58.238 -1.132 58.106 -0.699 58.106 -0.118 c
+58.106 0.353 l
+58.106 0.947 58.231 1.415 58.488 1.749 c
+58.752 2.09 59.112 2.263 59.575 2.263 c
+60.035 2.263 60.377 2.109 60.604 1.808 c
+60.84 1.514 60.961 1.051 60.972 0.426 c
+60.972 0 l
+58.752 0 l
+58.752 -0.088 l
+58.752 -0.522 58.83 -0.834 58.987 -1.029 c
+59.153 -1.216 59.384 -1.309 59.679 -1.309 c
+59.873 -1.309 60.046 -1.276 60.193 -1.206 c
+60.34 -1.129 60.476 -1.011 60.604 -0.853 c
+60.943 -1.264 l
+60.656 -1.669 60.226 -1.867 59.65 -1.867 c
+59.575 1.705 m
+59.3 1.705 59.098 1.61 58.973 1.425 c
+58.844 1.238 58.771 0.947 58.752 0.558 c
+60.325 0.558 l
+60.325 0.646 l
+60.303 1.028 60.237 1.297 60.12 1.455 c
+60.002 1.62 59.818 1.705 59.575 1.705 c
+62.368 2.19 m
+62.383 1.749 l
+62.636 2.09 62.96 2.263 63.353 2.263 c
+64.059 2.263 64.415 1.793 64.427 0.852 c
+64.427 -1.794 l
+63.779 -1.794 l
+63.779 0.823 l
+63.779 1.135 63.725 1.356 63.617 1.484 c
+63.507 1.61 63.353 1.675 63.147 1.675 c
+62.989 1.675 62.842 1.62 62.707 1.514 c
+62.578 1.404 62.475 1.267 62.397 1.103 c
+62.397 -1.794 l
+61.751 -1.794 l
+61.751 2.19 l
+h
+66.249 3.145 m
+66.249 2.19 l
+66.852 2.19 l
+66.852 1.66 l
+66.249 1.66 l
+66.249 -0.809 l
+66.249 -0.967 66.271 -1.085 66.322 -1.162 c
+66.381 -1.243 66.47 -1.279 66.587 -1.279 c
+66.675 -1.279 66.763 -1.264 66.852 -1.235 c
+66.852 -1.794 l
+66.705 -1.841 66.551 -1.867 66.396 -1.867 c
+66.139 -1.867 65.944 -1.775 65.808 -1.588 c
+65.668 -1.405 65.603 -1.143 65.603 -0.809 c
+65.603 1.66 l
+64.999 1.66 l
+64.999 2.19 l
+65.603 2.19 l
+65.603 3.145 l
+h
+72.217 0 m
+72.217 -0.618 72.103 -1.085 71.879 -1.397 c
+71.662 -1.713 71.338 -1.867 70.908 -1.867 c
+70.486 -1.867 70.174 -1.687 69.968 -1.324 c
+69.938 -1.794 l
+69.335 -1.794 l
+69.335 3.85 l
+69.983 3.85 l
+69.983 1.749 l
+70.196 2.09 70.505 2.263 70.908 2.263 c
+71.338 2.263 71.662 2.105 71.879 1.793 c
+72.103 1.488 72.217 1.022 72.217 0.397 c
+h
+71.57 0.382 m
+71.57 0.852 71.5 1.183 71.365 1.381 c
+71.236 1.576 71.026 1.675 70.732 1.675 c
+70.397 1.675 70.148 1.492 69.983 1.132 c
+69.983 -0.75 l
+70.148 -1.114 70.401 -1.294 70.746 -1.294 c
+71.041 -1.294 71.251 -1.191 71.379 -0.985 c
+71.504 -0.779 71.57 -0.464 71.57 -0.03 c
+h
+74.701 1.573 m
+74.613 1.591 74.513 1.602 74.407 1.602 c
+74.073 1.602 73.838 1.418 73.701 1.058 c
+73.701 -1.794 l
+73.055 -1.794 l
+73.055 2.19 l
+73.686 2.19 l
+73.701 1.778 l
+73.878 2.102 74.12 2.263 74.436 2.263 c
+74.543 2.263 74.631 2.241 74.701 2.204 c
+h
+77.244 -1.794 m
+77.204 -1.706 77.177 -1.559 77.171 -1.353 c
+76.936 -1.698 76.641 -1.867 76.288 -1.867 c
+75.924 -1.867 75.642 -1.771 75.436 -1.573 c
+75.238 -1.367 75.142 -1.081 75.142 -0.706 c
+75.142 -0.306 75.278 0.014 75.554 0.249 c
+75.826 0.492 76.2 0.617 76.67 0.617 c
+77.156 0.617 l
+77.156 1.043 l
+77.156 1.278 77.1 1.444 76.994 1.543 c
+76.884 1.65 76.722 1.705 76.508 1.705 c
+76.311 1.705 76.149 1.646 76.024 1.529 c
+75.906 1.411 75.847 1.263 75.847 1.087 c
+75.201 1.087 l
+75.201 1.282 75.259 1.473 75.377 1.66 c
+75.502 1.845 75.664 1.992 75.862 2.102 c
+76.068 2.208 76.296 2.263 76.553 2.263 c
+76.953 2.263 77.258 2.161 77.464 1.955 c
+77.678 1.749 77.792 1.455 77.802 1.072 c
+77.802 -0.941 l
+77.802 -1.246 77.84 -1.511 77.92 -1.735 c
+77.92 -1.794 l
+h
+76.377 -1.279 m
+76.542 -1.279 76.693 -1.235 76.832 -1.147 c
+76.979 -1.058 77.086 -0.948 77.156 -0.809 c
+77.156 0.132 l
+76.788 0.132 l
+76.472 0.132 76.23 0.062 76.053 -0.073 c
+75.877 -0.202 75.789 -0.389 75.789 -0.632 c
+75.789 -0.86 75.833 -1.025 75.921 -1.132 c
+76.009 -1.231 76.159 -1.279 76.377 -1.279 c
+79.419 2.19 m
+79.434 1.749 l
+79.687 2.09 80.011 2.263 80.404 2.263 c
+81.11 2.263 81.466 1.793 81.477 0.852 c
+81.477 -1.794 l
+80.83 -1.794 l
+80.83 0.823 l
+80.83 1.135 80.776 1.356 80.668 1.484 c
+80.558 1.61 80.404 1.675 80.198 1.675 c
+80.04 1.675 79.893 1.62 79.758 1.514 c
+79.629 1.404 79.526 1.267 79.448 1.103 c
+79.448 -1.794 l
+78.802 -1.794 l
+78.802 2.19 l
+h
+83.829 -1.309 m
+84.042 -1.309 84.215 -1.246 84.344 -1.118 c
+84.479 -0.981 84.553 -0.79 84.564 -0.544 c
+85.181 -0.544 l
+85.16 -0.927 85.023 -1.246 84.77 -1.5 c
+84.512 -1.746 84.2 -1.867 83.829 -1.867 c
+83.336 -1.867 82.962 -1.717 82.698 -1.411 c
+82.44 -1.099 82.315 -0.632 82.315 -0.015 c
+82.315 0.426 l
+82.315 1.022 82.44 1.477 82.698 1.793 c
+82.962 2.105 83.336 2.263 83.829 2.263 c
+84.23 2.263 84.549 2.131 84.784 1.866 c
+85.027 1.61 85.16 1.263 85.181 0.823 c
+84.564 0.823 l
+84.542 1.117 84.468 1.338 84.344 1.484 c
+84.226 1.631 84.053 1.705 83.829 1.705 c
+83.535 1.705 83.318 1.606 83.182 1.411 c
+83.043 1.223 82.969 0.914 82.962 0.484 c
+82.962 -0.03 l
+82.962 -0.5 83.028 -0.834 83.168 -1.029 c
+83.315 -1.216 83.535 -1.309 83.829 -1.309 c
+86.578 1.778 m
+86.831 2.102 87.151 2.263 87.533 2.263 c
+88.239 2.263 88.595 1.793 88.606 0.852 c
+88.606 -1.794 l
+87.959 -1.794 l
+87.959 0.823 l
+87.959 1.135 87.905 1.356 87.797 1.484 c
+87.687 1.61 87.533 1.675 87.327 1.675 c
+87.169 1.675 87.022 1.62 86.887 1.514 c
+86.758 1.404 86.655 1.267 86.578 1.103 c
+86.578 -1.794 l
+85.931 -1.794 l
+85.931 3.85 l
+86.578 3.85 l
+h
+91.267 0.382 m
+91.267 1.018 91.355 1.62 91.531 2.19 c
+91.708 2.755 91.951 3.252 92.266 3.675 c
+92.462 3.939 92.649 4.13 92.825 4.247 c
+92.957 3.792 l
+92.663 3.516 92.421 3.094 92.237 2.528 c
+92.049 1.959 91.947 1.326 91.928 0.632 c
+91.928 0.338 l
+91.928 -0.526 92.046 -1.29 92.281 -1.955 c
+92.464 -2.455 92.693 -2.837 92.957 -3.102 c
+92.825 -3.528 l
+92.597 -3.37 92.373 -3.12 92.148 -2.778 c
+91.56 -1.897 91.267 -0.846 91.267 0.382 c
+94.5 3.145 m
+94.5 2.19 l
+95.103 2.19 l
+95.103 1.66 l
+94.5 1.66 l
+94.5 -0.809 l
+94.5 -0.967 94.523 -1.085 94.574 -1.162 c
+94.633 -1.243 94.721 -1.279 94.839 -1.279 c
+94.927 -1.279 95.015 -1.264 95.103 -1.235 c
+95.103 -1.794 l
+94.956 -1.841 94.802 -1.867 94.648 -1.867 c
+94.39 -1.867 94.195 -1.775 94.06 -1.588 c
+93.92 -1.405 93.854 -1.143 93.854 -0.809 c
+93.854 1.66 l
+93.251 1.66 l
+93.251 2.19 l
+93.854 2.19 l
+93.854 3.145 l
+h
+96.514 1.778 m
+96.768 2.102 97.087 2.263 97.47 2.263 c
+98.176 2.263 98.532 1.793 98.542 0.852 c
+98.542 -1.794 l
+97.896 -1.794 l
+97.896 0.823 l
+97.896 1.135 97.841 1.356 97.734 1.484 c
+97.624 1.61 97.47 1.675 97.264 1.675 c
+97.106 1.675 96.959 1.62 96.823 1.514 c
+96.695 1.404 96.591 1.267 96.514 1.103 c
+96.514 -1.794 l
+95.868 -1.794 l
+95.868 3.85 l
+96.514 3.85 l
+h
+100.924 -1.867 m
+100.424 -1.867 100.042 -1.72 99.778 -1.426 c
+99.513 -1.132 99.381 -0.699 99.381 -0.118 c
+99.381 0.353 l
+99.381 0.947 99.506 1.415 99.763 1.749 c
+100.027 2.09 100.387 2.263 100.85 2.263 c
+101.31 2.263 101.652 2.109 101.879 1.808 c
+102.114 1.514 102.236 1.051 102.247 0.426 c
+102.247 0 l
+100.027 0 l
+100.027 -0.088 l
+100.027 -0.522 100.104 -0.834 100.262 -1.029 c
+100.428 -1.216 100.659 -1.309 100.954 -1.309 c
+101.148 -1.309 101.32 -1.276 101.468 -1.206 c
+101.615 -1.129 101.75 -1.011 101.879 -0.853 c
+102.218 -1.264 l
+101.931 -1.669 101.501 -1.867 100.924 -1.867 c
+100.85 1.705 m
+100.575 1.705 100.373 1.61 100.248 1.425 c
+100.119 1.238 100.046 0.947 100.027 0.558 c
+101.6 0.558 l
+101.6 0.646 l
+101.578 1.028 101.512 1.297 101.395 1.455 c
+101.277 1.62 101.093 1.705 100.85 1.705 c
+104.613 0.382 m
+104.613 0.959 104.75 1.415 105.025 1.749 c
+105.308 2.09 105.679 2.263 106.142 2.263 c
+106.602 2.263 106.969 2.094 107.244 1.764 c
+107.527 1.44 107.674 0.992 107.685 0.426 c
+107.685 0 l
+107.685 -0.57 107.543 -1.025 107.259 -1.367 c
+106.984 -1.702 106.616 -1.867 106.157 -1.867 c
+105.694 -1.867 105.322 -1.706 105.04 -1.382 c
+104.765 -1.052 104.621 -0.611 104.613 -0.059 c
+h
+105.26 0 m
+105.26 -0.405 105.337 -0.721 105.496 -0.956 c
+105.661 -1.191 105.881 -1.309 106.157 -1.309 c
+106.723 -1.309 107.017 -0.897 107.039 -0.073 c
+107.039 0.382 l
+107.039 0.783 106.955 1.103 106.789 1.338 c
+106.631 1.579 106.415 1.705 106.142 1.705 c
+105.877 1.705 105.661 1.579 105.496 1.338 c
+105.337 1.103 105.26 0.783 105.26 0.382 c
+h
+109.141 2.19 m
+109.156 1.749 l
+109.409 2.09 109.733 2.263 110.126 2.263 c
+110.831 2.263 111.188 1.793 111.198 0.852 c
+111.198 -1.794 l
+110.552 -1.794 l
+110.552 0.823 l
+110.552 1.135 110.496 1.356 110.39 1.484 c
+110.28 1.61 110.126 1.675 109.92 1.675 c
+109.762 1.675 109.615 1.62 109.479 1.514 c
+109.351 1.404 109.247 1.267 109.17 1.103 c
+109.17 -1.794 l
+108.524 -1.794 l
+108.524 2.19 l
+h
+113.594 -1.867 m
+113.095 -1.867 112.713 -1.72 112.448 -1.426 c
+112.183 -1.132 112.052 -0.699 112.052 -0.118 c
+112.052 0.353 l
+112.052 0.947 112.177 1.415 112.433 1.749 c
+112.698 2.09 113.058 2.263 113.521 2.263 c
+113.98 2.263 114.322 2.109 114.55 1.808 c
+114.785 1.514 114.907 1.051 114.918 0.426 c
+114.918 0 l
+112.698 0 l
+112.698 -0.088 l
+112.698 -0.522 112.775 -0.834 112.933 -1.029 c
+113.099 -1.216 113.33 -1.309 113.624 -1.309 c
+113.819 -1.309 113.991 -1.276 114.138 -1.206 c
+114.286 -1.129 114.421 -1.011 114.55 -0.853 c
+114.888 -1.264 l
+114.602 -1.669 114.172 -1.867 113.594 -1.867 c
+113.521 1.705 m
+113.245 1.705 113.043 1.61 112.919 1.425 c
+112.79 1.238 112.717 0.947 112.698 0.558 c
+114.271 0.558 l
+114.271 0.646 l
+114.249 1.028 114.182 1.297 114.065 1.455 c
+113.947 1.62 113.764 1.705 113.521 1.705 c
+118.504 -0.706 m
+119.225 2.19 l
+119.915 2.19 l
+118.622 -2.352 l
+118.523 -2.694 118.379 -2.955 118.195 -3.131 c
+118.019 -3.308 117.817 -3.396 117.592 -3.396 c
+117.505 -3.396 117.391 -3.373 117.255 -3.337 c
+117.255 -2.793 l
+117.401 -2.808 l
+117.586 -2.808 117.733 -2.764 117.843 -2.675 c
+117.949 -2.587 118.037 -2.429 118.107 -2.205 c
+118.225 -1.764 l
+117.064 2.19 l
+117.769 2.19 l
+h
+120.356 0.382 m
+120.356 0.959 120.492 1.415 120.767 1.749 c
+121.051 2.09 121.422 2.263 121.885 2.263 c
+122.344 2.263 122.712 2.094 122.988 1.764 c
+123.271 1.44 123.418 0.992 123.428 0.426 c
+123.428 0 l
+123.428 -0.57 123.285 -1.025 123.002 -1.367 c
+122.726 -1.702 122.359 -1.867 121.899 -1.867 c
+121.436 -1.867 121.066 -1.706 120.783 -1.382 c
+120.507 -1.052 120.364 -0.611 120.356 -0.059 c
+h
+121.003 0 m
+121.003 -0.405 121.08 -0.721 121.238 -0.956 c
+121.403 -1.191 121.624 -1.309 121.899 -1.309 c
+122.465 -1.309 122.76 -0.897 122.782 -0.073 c
+122.782 0.382 l
+122.782 0.783 122.697 1.103 122.531 1.338 c
+122.373 1.579 122.157 1.705 121.885 1.705 c
+121.621 1.705 121.403 1.579 121.238 1.338 c
+121.08 1.103 121.003 0.783 121.003 0.382 c
+h
+126.294 -1.441 m
+126.078 -1.727 125.766 -1.867 125.354 -1.867 c
+124.99 -1.867 124.715 -1.746 124.53 -1.5 c
+124.354 -1.246 124.259 -0.882 124.251 -0.412 c
+124.251 2.19 l
+124.898 2.19 l
+124.898 -0.353 l
+124.898 -0.981 125.082 -1.294 125.457 -1.294 c
+125.858 -1.294 126.132 -1.118 126.28 -0.765 c
+126.28 2.19 l
+126.926 2.19 l
+126.926 -1.794 l
+126.309 -1.794 l
+h
+131.674 -1.794 m
+131.634 -1.706 131.609 -1.559 131.601 -1.353 c
+131.366 -1.698 131.071 -1.867 130.719 -1.867 c
+130.355 -1.867 130.072 -1.771 129.866 -1.573 c
+129.668 -1.367 129.573 -1.081 129.573 -0.706 c
+129.573 -0.306 129.708 0.014 129.984 0.249 c
+130.256 0.492 130.631 0.617 131.102 0.617 c
+131.586 0.617 l
+131.586 1.043 l
+131.586 1.278 131.531 1.444 131.424 1.543 c
+131.314 1.65 131.152 1.705 130.94 1.705 c
+130.741 1.705 130.579 1.646 130.454 1.529 c
+130.337 1.411 130.278 1.263 130.278 1.087 c
+129.631 1.087 l
+129.631 1.282 129.69 1.473 129.808 1.66 c
+129.933 1.845 130.094 1.992 130.292 2.102 c
+130.498 2.208 130.726 2.263 130.984 2.263 c
+131.384 2.263 131.689 2.161 131.895 1.955 c
+132.108 1.749 132.222 1.455 132.233 1.072 c
+132.233 -0.941 l
+132.233 -1.246 132.27 -1.511 132.351 -1.735 c
+132.351 -1.794 l
+h
+130.807 -1.279 m
+130.973 -1.279 131.123 -1.235 131.263 -1.147 c
+131.41 -1.058 131.516 -0.948 131.586 -0.809 c
+131.586 0.132 l
+131.219 0.132 l
+130.903 0.132 130.66 0.062 130.483 -0.073 c
+130.307 -0.202 130.219 -0.389 130.219 -0.632 c
+130.219 -0.86 130.263 -1.025 130.352 -1.132 c
+130.44 -1.231 130.591 -1.279 130.807 -1.279 c
+134.879 1.573 m
+134.791 1.591 134.691 1.602 134.585 1.602 c
+134.25 1.602 134.015 1.418 133.88 1.058 c
+133.88 -1.794 l
+133.232 -1.794 l
+133.232 2.19 l
+133.864 2.19 l
+133.88 1.778 l
+134.055 2.102 134.298 2.263 134.614 2.263 c
+134.721 2.263 134.809 2.241 134.879 2.204 c
+h
+136.878 -1.867 m
+136.378 -1.867 135.996 -1.72 135.732 -1.426 c
+135.466 -1.132 135.335 -0.699 135.335 -0.118 c
+135.335 0.353 l
+135.335 0.947 135.46 1.415 135.717 1.749 c
+135.981 2.09 136.341 2.263 136.804 2.263 c
+137.263 2.263 137.606 2.109 137.833 1.808 c
+138.069 1.514 138.19 1.051 138.201 0.426 c
+138.201 0 l
+135.981 0 l
+135.981 -0.088 l
+135.981 -0.522 136.058 -0.834 136.216 -1.029 c
+136.382 -1.216 136.613 -1.309 136.908 -1.309 c
+137.102 -1.309 137.275 -1.276 137.421 -1.206 c
+137.569 -1.129 137.705 -1.011 137.833 -0.853 c
+138.171 -1.264 l
+137.885 -1.669 137.455 -1.867 136.878 -1.867 c
+136.804 1.705 m
+136.529 1.705 136.326 1.61 136.202 1.425 c
+136.073 1.238 136 0.947 135.981 0.558 c
+137.554 0.558 l
+137.554 0.646 l
+137.532 1.028 137.466 1.297 137.348 1.455 c
+137.23 1.62 137.047 1.705 136.804 1.705 c
+f
+Q
+q 1 0 0 1 727.8236 127.6454 cm
+0 0 m
+0 0.577 0.136 1.033 0.412 1.367 c
+0.695 1.708 1.066 1.881 1.529 1.881 c
+1.989 1.881 2.356 1.712 2.631 1.382 c
+2.914 1.058 3.061 0.61 3.072 0.044 c
+3.072 -0.382 l
+3.072 -0.952 2.93 -1.407 2.646 -1.749 c
+2.371 -2.084 2.003 -2.249 1.544 -2.249 c
+1.081 -2.249 0.709 -2.087 0.427 -1.764 c
+0.151 -1.434 0.008 -0.992 0 -0.441 c
+h
+0.647 -0.382 m
+0.647 -0.786 0.724 -1.103 0.883 -1.338 c
+1.048 -1.573 1.268 -1.691 1.544 -1.691 c
+2.11 -1.691 2.404 -1.278 2.426 -0.455 c
+2.426 0 l
+2.426 0.401 2.342 0.721 2.176 0.956 c
+2.018 1.198 1.802 1.323 1.529 1.323 c
+1.264 1.323 1.048 1.198 0.883 0.956 c
+0.724 0.721 0.647 0.401 0.647 0 c
+h
+4.528 1.808 m
+4.543 1.367 l
+4.796 1.708 5.12 1.881 5.513 1.881 c
+6.218 1.881 6.575 1.411 6.585 0.47 c
+6.585 -2.176 l
+5.939 -2.176 l
+5.939 0.441 l
+5.939 0.754 5.883 0.974 5.777 1.103 c
+5.667 1.228 5.513 1.294 5.307 1.294 c
+5.149 1.294 5.002 1.238 4.866 1.132 c
+4.738 1.022 4.634 0.885 4.557 0.721 c
+4.557 -2.176 l
+3.911 -2.176 l
+3.911 1.808 l
+h
+10.658 -1.691 m
+10.87 -1.691 11.043 -1.628 11.171 -1.5 c
+11.308 -1.363 11.381 -1.172 11.392 -0.926 c
+12.01 -0.926 l
+11.988 -1.309 11.852 -1.628 11.598 -1.881 c
+11.341 -2.128 11.028 -2.249 10.658 -2.249 c
+10.165 -2.249 9.79 -2.099 9.525 -1.793 c
+9.268 -1.481 9.143 -1.014 9.143 -0.397 c
+9.143 0.044 l
+9.143 0.64 9.268 1.095 9.525 1.411 c
+9.79 1.723 10.165 1.881 10.658 1.881 c
+11.057 1.881 11.377 1.749 11.612 1.484 c
+11.855 1.228 11.988 0.881 12.01 0.441 c
+11.392 0.441 l
+11.37 0.735 11.296 0.956 11.171 1.103 c
+11.054 1.249 10.882 1.323 10.658 1.323 c
+10.363 1.323 10.147 1.224 10.01 1.029 c
+9.871 0.841 9.798 0.532 9.79 0.103 c
+9.79 -0.412 l
+9.79 -0.882 9.856 -1.216 9.995 -1.411 c
+10.143 -1.598 10.363 -1.691 10.658 -1.691 c
+14.787 -1.823 m
+14.571 -2.109 14.259 -2.249 13.847 -2.249 c
+13.484 -2.249 13.208 -2.128 13.024 -1.881 c
+12.848 -1.628 12.752 -1.264 12.744 -0.794 c
+12.744 1.808 l
+13.391 1.808 l
+13.391 -0.735 l
+13.391 -1.363 13.575 -1.675 13.95 -1.675 c
+14.35 -1.675 14.626 -1.5 14.773 -1.147 c
+14.773 1.808 l
+15.42 1.808 l
+15.42 -2.176 l
+14.803 -2.176 l
+h
+18.051 1.191 m
+17.963 1.209 17.864 1.22 17.756 1.22 c
+17.423 1.22 17.187 1.036 17.051 0.676 c
+17.051 -2.176 l
+16.405 -2.176 l
+16.405 1.808 l
+17.037 1.808 l
+17.051 1.396 l
+17.228 1.72 17.471 1.881 17.787 1.881 c
+17.893 1.881 17.981 1.859 18.051 1.822 c
+h
+20.344 1.191 m
+20.256 1.209 20.156 1.22 20.05 1.22 c
+19.715 1.22 19.48 1.036 19.344 0.676 c
+19.344 -2.176 l
+18.697 -2.176 l
+18.697 1.808 l
+19.329 1.808 l
+19.344 1.396 l
+19.52 1.72 19.763 1.881 20.079 1.881 c
+20.185 1.881 20.274 1.859 20.344 1.822 c
+h
+22.343 -2.249 m
+21.843 -2.249 21.461 -2.102 21.197 -1.808 c
+20.931 -1.514 20.8 -1.081 20.8 -0.5 c
+20.8 -0.029 l
+20.8 0.565 20.925 1.033 21.182 1.367 c
+21.446 1.708 21.806 1.881 22.269 1.881 c
+22.729 1.881 23.071 1.727 23.298 1.426 c
+23.534 1.132 23.655 0.669 23.666 0.044 c
+23.666 -0.382 l
+21.446 -0.382 l
+21.446 -0.47 l
+21.446 -0.904 21.523 -1.216 21.681 -1.411 c
+21.847 -1.598 22.078 -1.691 22.373 -1.691 c
+22.567 -1.691 22.74 -1.658 22.887 -1.588 c
+23.034 -1.511 23.17 -1.393 23.298 -1.235 c
+23.636 -1.646 l
+23.35 -2.051 22.92 -2.249 22.343 -2.249 c
+22.269 1.323 m
+21.994 1.323 21.792 1.228 21.667 1.043 c
+21.538 0.856 21.465 0.565 21.446 0.176 c
+23.019 0.176 l
+23.019 0.264 l
+22.997 0.646 22.931 0.915 22.813 1.073 c
+22.695 1.238 22.512 1.323 22.269 1.323 c
+25.062 1.808 m
+25.077 1.367 l
+25.33 1.708 25.654 1.881 26.047 1.881 c
+26.753 1.881 27.109 1.411 27.121 0.47 c
+27.121 -2.176 l
+26.473 -2.176 l
+26.473 0.441 l
+26.473 0.754 26.419 0.974 26.312 1.103 c
+26.201 1.228 26.047 1.294 25.841 1.294 c
+25.683 1.294 25.536 1.238 25.4 1.132 c
+25.272 1.022 25.169 0.885 25.091 0.721 c
+25.091 -2.176 l
+24.445 -2.176 l
+24.445 1.808 l
+h
+28.796 -2.176 -0.647 5.644 re
+30.662 2.763 m
+30.662 1.808 l
+31.266 1.808 l
+31.266 1.278 l
+30.662 1.278 l
+30.662 -1.191 l
+30.662 -1.349 30.685 -1.467 30.736 -1.544 c
+30.795 -1.625 30.884 -1.661 31.001 -1.661 c
+31.089 -1.661 31.177 -1.646 31.266 -1.617 c
+31.266 -2.176 l
+31.119 -2.223 30.964 -2.249 30.809 -2.249 c
+30.552 -2.249 30.358 -2.157 30.221 -1.97 c
+30.082 -1.786 30.016 -1.525 30.016 -1.191 c
+30.016 1.278 l
+29.413 1.278 l
+29.413 1.808 l
+30.016 1.808 l
+30.016 2.763 l
+h
+33.118 -1.087 m
+33.837 1.808 l
+34.529 1.808 l
+33.235 -2.734 l
+33.136 -3.076 32.993 -3.337 32.808 -3.513 c
+32.632 -3.69 32.43 -3.778 32.206 -3.778 c
+32.118 -3.778 32.004 -3.755 31.868 -3.719 c
+31.868 -3.175 l
+32.015 -3.19 l
+32.199 -3.19 32.345 -3.146 32.456 -3.057 c
+32.563 -2.969 32.65 -2.811 32.721 -2.587 c
+32.838 -2.146 l
+31.677 1.808 l
+32.382 1.808 l
+h
+36.557 -0.044 m
+36.557 -1.132 36.311 -2.099 35.823 -2.94 c
+35.557 -3.389 35.282 -3.711 34.999 -3.91 c
+34.882 -3.484 l
+35.183 -3.19 35.429 -2.738 35.616 -2.132 c
+35.811 -1.525 35.91 -0.86 35.91 -0.133 c
+35.91 0 l
+35.91 0.929 35.756 1.764 35.455 2.499 c
+35.285 2.899 35.094 3.219 34.882 3.454 c
+34.999 3.865 l
+35.271 3.678 35.536 3.381 35.792 2.969 c
+36.299 2.117 36.557 1.11 36.557 -0.044 c
+37.6 -1.823 m
+37.6 -1.706 37.633 -1.61 37.704 -1.529 c
+37.77 -1.452 37.872 -1.411 38.013 -1.411 c
+38.159 -1.411 38.266 -1.452 38.335 -1.529 c
+38.413 -1.61 38.453 -1.706 38.453 -1.823 c
+38.453 -1.933 38.413 -2.024 38.335 -2.102 c
+38.266 -2.18 38.159 -2.219 38.013 -2.219 c
+37.872 -2.219 37.77 -2.18 37.704 -2.102 c
+37.633 -2.024 37.6 -1.933 37.6 -1.823 c
+f
+Q
+0.113 0.082 0.09 0 k
+535.667 120.241 238.665 -12.898 re
+f
+0.906 0.785 0.617 0.969 k
+q 1 0 0 1 540.8555 113.4016 cm
+0 0 m
+0 -0.187 -0.029 -0.353 -0.088 -0.5 c
+-0.147 -0.646 -0.242 -0.775 -0.367 -0.881 c
+-0.496 -0.992 -0.658 -1.08 -0.852 -1.146 c
+-1.051 -1.205 -1.278 -1.242 -1.543 -1.249 c
+-1.543 -1.808 l
+-1.896 -1.808 l
+-1.896 -1.263 l
+-2.142 -1.257 -2.358 -1.22 -2.543 -1.161 c
+-2.719 -1.103 -2.873 -1.025 -2.998 -0.926 c
+-3.127 -0.819 -3.23 -0.691 -3.307 -0.544 c
+-3.388 -0.389 -3.447 -0.213 -3.484 -0.014 c
+-2.66 0.133 l
+-2.642 0.033 -2.616 -0.058 -2.587 -0.147 c
+-2.55 -0.228 -2.506 -0.301 -2.454 -0.367 c
+-2.396 -0.426 -2.322 -0.478 -2.234 -0.515 c
+-2.138 -0.555 -2.024 -0.58 -1.896 -0.588 c
+-1.896 0.661 l
+-1.907 0.661 -1.926 0.665 -1.955 0.676 c
+-1.977 0.684 -1.992 0.691 -1.999 0.691 c
+-2.167 0.728 -2.329 0.772 -2.484 0.823 c
+-2.642 0.882 -2.786 0.96 -2.91 1.058 c
+-3.039 1.154 -3.141 1.279 -3.218 1.426 c
+-3.289 1.573 -3.322 1.756 -3.322 1.985 c
+-3.322 2.18 -3.289 2.344 -3.218 2.484 c
+-3.152 2.631 -3.054 2.749 -2.925 2.837 c
+-2.8 2.932 -2.645 3.003 -2.469 3.043 c
+-2.293 3.09 -2.102 3.12 -1.896 3.131 c
+-1.896 3.558 l
+-1.543 3.558 l
+-1.543 3.131 l
+-1.319 3.12 -1.128 3.09 -0.97 3.043 c
+-0.804 2.992 -0.669 2.918 -0.558 2.822 c
+-0.44 2.735 -0.349 2.62 -0.279 2.484 c
+-0.201 2.344 -0.143 2.183 -0.103 1.999 c
+-0.941 1.881 l
+-1.01 2.253 -1.213 2.459 -1.543 2.5 c
+-1.543 1.367 l
+-1.514 1.367 l
+-1.506 1.367 -1.492 1.36 -1.469 1.353 c
+-1.294 1.312 -1.117 1.264 -0.941 1.206 c
+-0.756 1.147 -0.595 1.066 -0.455 0.971 c
+-0.319 0.871 -0.213 0.742 -0.132 0.588 c
+-0.044 0.43 0 0.235 0 0 c
+-1.896 2.514 m
+-2.013 2.502 -2.113 2.484 -2.19 2.455 c
+-2.26 2.425 -2.318 2.385 -2.366 2.338 c
+-2.406 2.297 -2.436 2.249 -2.454 2.19 c
+-2.476 2.132 -2.484 2.066 -2.484 1.999 c
+-2.484 1.912 -2.469 1.837 -2.439 1.779 c
+-2.41 1.72 -2.373 1.669 -2.322 1.632 c
+-2.263 1.592 -2.2 1.559 -2.131 1.529 c
+-2.065 1.5 -1.984 1.47 -1.896 1.441 c
+h
+-0.837 -0.014 m
+-0.837 0.092 -0.86 0.177 -0.897 0.235 c
+-0.926 0.302 -0.977 0.357 -1.043 0.397 c
+-1.102 0.434 -1.176 0.47 -1.263 0.5 c
+-1.352 0.53 -1.448 0.559 -1.543 0.588 c
+-1.543 -0.588 l
+-1.319 -0.58 -1.146 -0.529 -1.028 -0.44 c
+-0.904 -0.345 -0.837 -0.202 -0.837 -0.014 c
+6.402 -2.66 m
+6.185 -2.66 5.993 -2.635 5.829 -2.587 c
+5.659 -2.547 5.52 -2.484 5.403 -2.396 c
+5.285 -2.315 5.185 -2.219 5.108 -2.102 c
+5.039 -1.984 4.991 -1.855 4.961 -1.72 c
+5.858 -1.616 l
+5.895 -1.753 5.964 -1.859 6.064 -1.94 c
+6.159 -2.028 6.284 -2.072 6.431 -2.072 c
+6.519 -2.072 6.6 -2.057 6.681 -2.028 c
+6.758 -1.999 6.828 -1.944 6.887 -1.866 c
+6.945 -1.797 6.99 -1.705 7.019 -1.587 c
+7.056 -1.469 7.078 -1.323 7.078 -1.146 c
+7.078 -0.955 l
+7.078 -0.889 7.082 -0.831 7.092 -0.779 c
+7.092 -0.588 l
+7.078 -0.588 l
+6.978 -0.816 6.835 -0.977 6.652 -1.072 c
+6.464 -1.172 6.259 -1.22 6.034 -1.22 c
+5.829 -1.22 5.644 -1.183 5.49 -1.103 c
+5.343 -1.014 5.214 -0.897 5.108 -0.75 c
+5.009 -0.595 4.935 -0.411 4.888 -0.205 c
+4.836 0.008 4.815 0.243 4.815 0.5 c
+4.815 0.772 4.836 1.018 4.888 1.235 c
+4.946 1.448 5.027 1.632 5.137 1.779 c
+5.245 1.933 5.376 2.051 5.534 2.132 c
+5.689 2.22 5.876 2.264 6.093 2.264 c
+6.189 2.264 6.288 2.253 6.387 2.234 c
+6.483 2.213 6.571 2.18 6.652 2.132 c
+6.739 2.08 6.817 2.018 6.887 1.941 c
+6.964 1.86 7.026 1.768 7.078 1.661 c
+7.092 1.661 l
+7.092 1.808 l
+7.1 1.867 7.107 1.918 7.107 1.97 c
+7.115 2.029 7.122 2.076 7.122 2.117 c
+7.13 2.165 7.14 2.198 7.151 2.22 c
+8.004 2.22 l
+7.992 2.139 7.982 2.029 7.975 1.881 c
+7.975 1.411 l
+7.975 -1.161 l
+7.975 -1.415 7.938 -1.635 7.872 -1.822 c
+7.802 -2.007 7.699 -2.161 7.563 -2.278 c
+7.423 -2.403 7.258 -2.499 7.063 -2.557 c
+6.865 -2.624 6.644 -2.66 6.402 -2.66 c
+7.092 0.53 m
+7.092 0.742 7.067 0.919 7.019 1.058 c
+6.978 1.206 6.924 1.324 6.857 1.411 c
+6.799 1.5 6.729 1.559 6.652 1.588 c
+6.571 1.625 6.494 1.646 6.417 1.646 c
+6.317 1.646 6.226 1.621 6.137 1.573 c
+6.056 1.532 5.991 1.463 5.931 1.367 c
+5.88 1.279 5.835 1.162 5.799 1.014 c
+5.77 0.875 5.755 0.706 5.755 0.5 c
+5.755 0.125 5.814 -0.154 5.931 -0.338 c
+6.049 -0.515 6.211 -0.602 6.417 -0.602 c
+6.483 -0.602 6.556 -0.588 6.637 -0.558 c
+6.725 -0.521 6.799 -0.463 6.857 -0.382 c
+6.924 -0.294 6.978 -0.176 7.019 -0.029 c
+7.067 0.118 7.092 0.302 7.092 0.53 c
+11.036 -0.646 m
+12.168 -0.646 l
+12.168 -1.263 l
+8.86 -1.263 l
+8.86 -0.646 l
+10.124 -0.646 l
+10.124 1.602 l
+9.199 1.602 l
+9.199 2.22 l
+11.036 2.22 l
+h
+10.124 3.514 0.912 -0.676 re
+10.124 2.837 m
+13.6 1.602 m
+13.057 1.602 l
+13.057 2.22 l
+13.644 2.22 l
+13.924 3.117 l
+14.498 3.117 l
+14.498 2.22 l
+15.732 2.22 l
+15.732 1.602 l
+14.498 1.602 l
+14.498 -0.103 l
+14.498 -0.323 l
+14.504 -0.393 14.527 -0.455 14.556 -0.515 c
+14.593 -0.565 14.648 -0.61 14.718 -0.646 c
+14.795 -0.675 14.909 -0.691 15.056 -0.691 c
+15.192 -0.691 15.327 -0.687 15.468 -0.675 c
+15.603 -0.658 15.736 -0.632 15.865 -0.602 c
+15.865 -1.205 l
+15.784 -1.216 15.707 -1.23 15.629 -1.249 c
+15.549 -1.261 15.471 -1.267 15.394 -1.278 c
+15.313 -1.286 15.225 -1.294 15.129 -1.294 c
+15.042 -1.301 14.942 -1.308 14.836 -1.308 c
+14.648 -1.308 14.486 -1.294 14.35 -1.263 c
+14.222 -1.227 14.107 -1.183 14.012 -1.132 c
+13.924 -1.084 13.85 -1.025 13.792 -0.955 c
+13.733 -0.878 13.689 -0.801 13.66 -0.72 c
+13.63 -0.632 13.608 -0.544 13.6 -0.455 c
+13.59 -0.36 13.586 -0.264 13.586 -0.176 c
+h
+21.12 -1.263 m
+21.12 -0.97 l
+21.126 -0.833 21.134 -0.675 21.134 -0.5 c
+21.134 3.514 l
+22.045 3.514 l
+22.045 2.234 l
+22.045 2.072 l
+22.045 1.897 l
+22.045 1.845 22.038 1.801 22.03 1.764 c
+22.03 1.676 l
+22.045 1.676 l
+22.093 1.783 22.155 1.874 22.236 1.955 c
+22.313 2.032 22.398 2.095 22.487 2.147 c
+22.574 2.194 22.666 2.227 22.766 2.249 c
+22.861 2.267 22.961 2.278 23.059 2.278 c
+23.273 2.278 23.46 2.234 23.618 2.147 c
+23.773 2.058 23.901 1.929 24 1.764 c
+24.106 1.606 24.184 1.415 24.235 1.191 c
+24.283 0.974 24.309 0.736 24.309 0.47 c
+24.309 0.214 24.28 -0.025 24.22 -0.249 c
+24.162 -0.467 24.077 -0.658 23.971 -0.823 c
+23.861 -0.981 23.728 -1.103 23.574 -1.19 c
+23.416 -1.278 23.236 -1.323 23.03 -1.323 c
+22.931 -1.323 22.832 -1.311 22.736 -1.294 c
+22.648 -1.271 22.56 -1.242 22.471 -1.19 c
+22.383 -1.132 22.302 -1.066 22.236 -0.985 c
+22.167 -0.908 22.104 -0.808 22.045 -0.691 c
+22.03 -0.691 l
+22.03 -0.852 l
+22.03 -0.911 22.024 -0.97 22.016 -1.028 c
+22.016 -1.08 22.009 -1.128 22.001 -1.176 c
+22.001 -1.216 21.994 -1.246 21.986 -1.263 c
+h
+22.03 0.5 m
+22.03 0.265 22.049 0.067 22.09 -0.087 c
+22.137 -0.246 22.196 -0.367 22.265 -0.455 c
+22.332 -0.544 22.406 -0.61 22.487 -0.646 c
+22.564 -0.687 22.641 -0.706 22.722 -0.706 c
+22.927 -0.706 23.082 -0.61 23.192 -0.411 c
+23.31 -0.216 23.368 0.077 23.368 0.47 c
+23.368 0.684 23.346 0.867 23.31 1.014 c
+23.28 1.168 23.236 1.294 23.177 1.382 c
+23.125 1.478 23.059 1.551 22.971 1.602 c
+22.89 1.65 22.803 1.676 22.707 1.676 c
+22.626 1.676 22.549 1.654 22.471 1.617 c
+22.391 1.577 22.317 1.515 22.251 1.426 c
+22.192 1.338 22.137 1.213 22.09 1.058 c
+22.049 0.912 22.03 0.724 22.03 0.5 c
+28.193 1.47 m
+28.094 1.478 27.991 1.488 27.884 1.5 c
+27.774 1.518 27.653 1.529 27.517 1.529 c
+27.341 1.529 27.183 1.488 27.046 1.411 c
+26.907 1.341 26.789 1.243 26.693 1.118 c
+26.606 0.989 26.535 0.842 26.488 0.676 c
+26.448 0.507 26.429 0.331 26.429 0.148 c
+26.429 -1.263 l
+25.533 -1.263 l
+25.533 0.985 l
+25.533 1.11 25.521 1.235 25.503 1.353 c
+25.492 1.478 25.477 1.595 25.459 1.706 c
+25.448 1.823 25.434 1.918 25.415 1.999 c
+25.393 2.087 25.375 2.161 25.356 2.22 c
+26.238 2.22 l
+26.246 2.168 26.257 2.117 26.267 2.058 c
+26.286 1.999 26.3 1.933 26.312 1.867 c
+26.33 1.808 26.344 1.742 26.356 1.676 c
+26.363 1.606 26.375 1.544 26.385 1.484 c
+26.4 1.484 l
+26.437 1.602 26.488 1.709 26.547 1.808 c
+26.613 1.904 26.693 1.989 26.782 2.058 c
+26.87 2.124 26.973 2.18 27.09 2.22 c
+27.216 2.257 27.362 2.278 27.532 2.278 c
+27.657 2.278 27.774 2.271 27.884 2.264 c
+28.002 2.253 28.105 2.238 28.193 2.22 c
+h
+30.196 -1.323 m
+30.026 -1.323 29.876 -1.301 29.741 -1.263 c
+29.612 -1.216 29.498 -1.146 29.402 -1.058 c
+29.314 -0.97 29.244 -0.864 29.197 -0.735 c
+29.145 -0.598 29.122 -0.448 29.122 -0.279 c
+29.122 -0.073 29.156 0.096 29.226 0.235 c
+29.292 0.383 29.388 0.493 29.505 0.574 c
+29.63 0.661 29.773 0.724 29.932 0.765 c
+30.097 0.801 30.273 0.827 30.46 0.838 c
+31.181 0.853 l
+31.181 1.029 l
+31.181 1.147 31.169 1.249 31.152 1.338 c
+31.129 1.426 31.096 1.492 31.048 1.544 c
+31.008 1.602 30.961 1.639 30.901 1.661 c
+30.843 1.679 30.776 1.691 30.71 1.691 c
+30.641 1.691 30.578 1.679 30.519 1.661 c
+30.468 1.65 30.42 1.625 30.373 1.588 c
+30.332 1.559 30.298 1.507 30.269 1.441 c
+30.248 1.382 30.233 1.301 30.225 1.206 c
+29.284 1.249 l
+29.314 1.397 29.358 1.532 29.417 1.661 c
+29.483 1.786 29.579 1.897 29.696 1.985 c
+29.814 2.08 29.953 2.153 30.122 2.205 c
+30.298 2.253 30.504 2.278 30.74 2.278 c
+31.181 2.278 31.511 2.168 31.74 1.955 c
+31.975 1.75 32.092 1.441 32.092 1.029 c
+32.092 -0.235 l
+32.092 -0.455 l
+32.099 -0.515 32.114 -0.569 32.137 -0.617 c
+32.154 -0.658 32.184 -0.691 32.224 -0.72 c
+32.261 -0.742 32.313 -0.75 32.372 -0.75 c
+32.438 -0.75 32.507 -0.746 32.577 -0.735 c
+32.577 -1.22 l
+32.519 -1.23 32.463 -1.242 32.415 -1.249 c
+32.375 -1.261 32.334 -1.267 32.297 -1.278 c
+32.257 -1.286 32.214 -1.294 32.166 -1.294 c
+32.114 -1.301 32.056 -1.308 31.989 -1.308 c
+31.761 -1.308 31.596 -1.257 31.489 -1.146 c
+31.379 -1.028 31.316 -0.864 31.298 -0.646 c
+31.283 -0.646 l
+31.214 -0.756 31.144 -0.852 31.078 -0.941 c
+31.008 -1.022 30.931 -1.087 30.843 -1.146 c
+30.755 -1.205 30.655 -1.249 30.549 -1.278 c
+30.45 -1.308 30.332 -1.323 30.196 -1.323 c
+31.181 0.353 m
+30.755 0.339 l
+30.655 0.339 30.564 0.331 30.475 0.324 c
+30.394 0.312 30.328 0.287 30.269 0.25 c
+30.211 0.21 30.159 0.151 30.122 0.073 c
+30.082 0.004 30.063 -0.087 30.063 -0.205 c
+30.063 -0.374 30.097 -0.496 30.167 -0.573 c
+30.233 -0.654 30.332 -0.691 30.46 -0.691 c
+30.567 -0.691 30.666 -0.669 30.755 -0.617 c
+30.85 -0.569 30.931 -0.507 30.99 -0.426 c
+31.056 -0.349 31.107 -0.261 31.137 -0.162 c
+31.166 -0.055 31.181 0.059 31.181 0.177 c
+h
+35.495 -1.263 m
+35.495 0.721 l
+35.495 1.022 35.451 1.243 35.362 1.382 c
+35.281 1.529 35.146 1.602 34.951 1.602 c
+34.841 1.602 34.738 1.577 34.643 1.529 c
+34.554 1.478 34.473 1.411 34.408 1.324 c
+34.348 1.235 34.297 1.125 34.26 1 c
+34.231 0.882 34.216 0.75 34.216 0.603 c
+34.216 -1.263 l
+33.305 -1.263 l
+33.305 1.441 l
+33.305 1.661 l
+33.305 1.75 33.297 1.827 33.29 1.897 c
+33.29 2.087 l
+33.29 2.22 l
+34.142 2.22 l
+34.15 2.19 34.157 2.147 34.157 2.087 c
+34.157 1.897 l
+34.165 1.827 34.172 1.756 34.172 1.691 c
+34.179 1.621 34.186 1.565 34.186 1.529 c
+34.202 1.529 l
+34.319 1.794 34.47 1.985 34.657 2.103 c
+34.841 2.22 35.061 2.278 35.318 2.278 c
+35.503 2.278 35.664 2.249 35.804 2.19 c
+35.939 2.132 36.054 2.043 36.141 1.926 c
+36.23 1.808 36.293 1.665 36.332 1.5 c
+36.38 1.341 36.407 1.154 36.407 0.941 c
+36.407 -1.263 l
+h
+38.923 -1.323 m
+38.637 -1.323 38.394 -1.282 38.188 -1.205 c
+37.982 -1.117 37.81 -0.995 37.674 -0.837 c
+37.535 -0.683 37.431 -0.496 37.365 -0.279 c
+37.296 -0.055 37.263 0.191 37.263 0.456 c
+37.263 0.75 37.296 1.008 37.365 1.235 c
+37.442 1.459 37.549 1.646 37.689 1.794 c
+37.836 1.948 38.012 2.066 38.218 2.147 c
+38.424 2.234 38.659 2.278 38.923 2.278 c
+39.148 2.278 39.35 2.249 39.526 2.19 c
+39.702 2.132 39.854 2.047 39.981 1.941 c
+40.107 1.841 40.21 1.72 40.291 1.573 c
+40.368 1.434 40.423 1.283 40.452 1.118 c
+39.541 1.073 l
+39.511 1.249 39.441 1.389 39.335 1.5 c
+39.235 1.606 39.092 1.661 38.909 1.661 c
+38.662 1.661 38.487 1.559 38.379 1.353 c
+38.269 1.154 38.218 0.867 38.218 0.485 c
+38.218 -0.309 38.453 -0.706 38.923 -0.706 c
+39.089 -0.706 39.232 -0.654 39.35 -0.544 c
+39.467 -0.437 39.541 -0.276 39.57 -0.058 c
+40.482 -0.103 l
+40.452 -0.272 40.397 -0.426 40.32 -0.573 c
+40.25 -0.72 40.147 -0.852 40.012 -0.97 c
+39.883 -1.08 39.725 -1.168 39.541 -1.234 c
+39.364 -1.294 39.158 -1.323 38.923 -1.323 c
+42.323 1.515 m
+42.441 1.786 42.591 1.985 42.778 2.103 c
+42.962 2.22 43.183 2.278 43.44 2.278 c
+43.646 2.278 43.815 2.242 43.954 2.176 c
+44.101 2.106 44.211 2.014 44.292 1.897 c
+44.38 1.779 44.44 1.636 44.469 1.47 c
+44.505 1.301 44.527 1.125 44.527 0.941 c
+44.527 -1.263 l
+43.616 -1.263 l
+43.616 0.736 l
+43.616 0.871 43.605 0.992 43.586 1.103 c
+43.576 1.209 43.55 1.297 43.513 1.367 c
+43.473 1.444 43.414 1.503 43.337 1.544 c
+43.267 1.58 43.175 1.602 43.058 1.602 c
+42.948 1.602 42.852 1.577 42.763 1.529 c
+42.676 1.478 42.595 1.411 42.528 1.324 c
+42.47 1.235 42.418 1.125 42.381 1 c
+42.352 0.882 42.337 0.75 42.337 0.603 c
+42.337 -1.263 l
+41.426 -1.263 l
+41.426 3.514 l
+42.337 3.514 l
+42.337 2.205 l
+42.337 2.135 42.329 2.066 42.323 1.999 c
+42.323 1.794 l
+42.323 1.735 42.315 1.679 42.308 1.632 c
+42.308 1.515 l
+h
+50.135 0.838 1.867 -0.794 re
+50.135 0.044 m
+55.787 -1.263 m
+55.776 -1.246 55.765 -1.216 55.758 -1.176 c
+55.758 -1.128 55.75 -1.08 55.743 -1.028 c
+55.743 -0.97 55.735 -0.911 55.728 -0.852 c
+55.728 -0.691 l
+55.611 -0.926 55.467 -1.095 55.302 -1.19 c
+55.133 -1.278 54.935 -1.323 54.699 -1.323 c
+54.501 -1.323 54.324 -1.278 54.17 -1.19 c
+54.012 -1.103 53.88 -0.981 53.774 -0.823 c
+53.674 -0.658 53.597 -0.467 53.538 -0.249 c
+53.487 -0.037 53.464 0.206 53.464 0.47 c
+53.464 0.736 53.487 0.974 53.538 1.191 c
+53.597 1.415 53.674 1.606 53.774 1.764 c
+53.88 1.918 54.012 2.043 54.17 2.132 c
+54.335 2.227 54.526 2.278 54.744 2.278 c
+54.839 2.278 54.935 2.264 55.023 2.234 c
+55.118 2.213 55.214 2.18 55.302 2.132 c
+55.39 2.08 55.467 2.018 55.538 1.941 c
+55.615 1.86 55.677 1.768 55.728 1.661 c
+55.728 1.75 l
+55.728 1.897 l
+55.728 2.058 l
+55.728 2.234 l
+55.728 3.514 l
+56.625 3.514 l
+56.625 -0.5 l
+56.625 -0.675 56.629 -0.833 56.639 -0.97 c
+56.647 -1.099 56.654 -1.198 56.654 -1.263 c
+h
+55.743 0.485 m
+55.743 0.721 55.717 0.912 55.669 1.058 c
+55.629 1.213 55.574 1.338 55.507 1.426 c
+55.449 1.515 55.379 1.573 55.302 1.602 c
+55.221 1.639 55.144 1.661 55.067 1.661 c
+54.967 1.661 54.875 1.636 54.788 1.588 c
+54.707 1.548 54.64 1.478 54.582 1.382 c
+54.53 1.283 54.486 1.162 54.449 1.014 c
+54.42 0.867 54.405 0.684 54.405 0.47 c
+54.405 0.077 54.457 -0.216 54.567 -0.411 c
+54.684 -0.61 54.846 -0.706 55.052 -0.706 c
+55.129 -0.706 55.206 -0.687 55.287 -0.646 c
+55.364 -0.61 55.438 -0.544 55.507 -0.455 c
+55.574 -0.367 55.629 -0.246 55.669 -0.087 c
+55.717 0.067 55.743 0.258 55.743 0.485 c
+62.482 -2.631 m
+62.482 3.514 l
+64.408 3.514 l
+64.408 2.896 l
+63.335 2.896 l
+63.335 -2.013 l
+64.408 -2.013 l
+64.408 -2.631 l
+h
+67.983 -1.263 m
+67.983 0.721 l
+67.983 1.022 67.939 1.243 67.851 1.382 c
+67.77 1.529 67.634 1.602 67.44 1.602 c
+67.33 1.602 67.226 1.577 67.131 1.529 c
+67.043 1.478 66.962 1.411 66.896 1.324 c
+66.837 1.235 66.786 1.125 66.748 1 c
+66.719 0.882 66.705 0.75 66.705 0.603 c
+66.705 -1.263 l
+65.793 -1.263 l
+65.793 1.441 l
+65.793 1.661 l
+65.793 1.75 65.786 1.827 65.778 1.897 c
+65.778 2.087 l
+65.778 2.22 l
+66.632 2.22 l
+66.638 2.19 66.646 2.147 66.646 2.087 c
+66.646 1.897 l
+66.653 1.827 66.661 1.756 66.661 1.691 c
+66.668 1.621 66.675 1.565 66.675 1.529 c
+66.69 1.529 l
+66.808 1.794 66.958 1.985 67.145 2.103 c
+67.33 2.22 67.55 2.278 67.808 2.278 c
+67.991 2.278 68.153 2.249 68.292 2.19 c
+68.428 2.132 68.542 2.043 68.63 1.926 c
+68.718 1.808 68.781 1.665 68.822 1.5 c
+68.869 1.341 68.895 1.154 68.895 0.941 c
+68.895 -1.263 l
+h
+70.81 -1.323 m
+70.64 -1.323 70.49 -1.301 70.354 -1.263 c
+70.225 -1.216 70.111 -1.146 70.015 -1.058 c
+69.927 -0.97 69.857 -0.864 69.809 -0.735 c
+69.759 -0.598 69.736 -0.448 69.736 -0.279 c
+69.736 -0.073 69.769 0.096 69.84 0.235 c
+69.905 0.383 70.001 0.493 70.119 0.574 c
+70.243 0.661 70.387 0.724 70.545 0.765 c
+70.71 0.801 70.887 0.827 71.074 0.838 c
+71.794 0.853 l
+71.794 1.029 l
+71.794 1.147 71.783 1.249 71.765 1.338 c
+71.743 1.426 71.71 1.492 71.662 1.544 c
+71.621 1.602 71.573 1.639 71.515 1.661 c
+71.456 1.679 71.39 1.691 71.324 1.691 c
+71.254 1.691 71.191 1.679 71.133 1.661 c
+71.081 1.65 71.033 1.625 70.985 1.588 c
+70.945 1.559 70.912 1.507 70.883 1.441 c
+70.861 1.382 70.846 1.301 70.839 1.206 c
+69.898 1.249 l
+69.927 1.397 69.971 1.532 70.031 1.661 c
+70.096 1.786 70.192 1.897 70.31 1.985 c
+70.428 2.08 70.567 2.153 70.736 2.205 c
+70.912 2.253 71.118 2.278 71.353 2.278 c
+71.794 2.278 72.125 2.168 72.353 1.955 c
+72.588 1.75 72.706 1.441 72.706 1.029 c
+72.706 -0.235 l
+72.706 -0.455 l
+72.713 -0.515 72.728 -0.569 72.749 -0.617 c
+72.768 -0.658 72.797 -0.691 72.838 -0.72 c
+72.874 -0.742 72.926 -0.75 72.984 -0.75 c
+73.051 -0.75 73.121 -0.746 73.19 -0.735 c
+73.19 -1.22 l
+73.132 -1.23 73.077 -1.242 73.029 -1.249 c
+72.988 -1.261 72.948 -1.267 72.911 -1.278 c
+72.871 -1.286 72.826 -1.294 72.779 -1.294 c
+72.728 -1.301 72.668 -1.308 72.602 -1.308 c
+72.375 -1.308 72.209 -1.257 72.103 -1.146 c
+71.993 -1.028 71.93 -0.864 71.912 -0.646 c
+71.897 -0.646 l
+71.827 -0.756 71.758 -0.852 71.691 -0.941 c
+71.621 -1.022 71.544 -1.087 71.456 -1.146 c
+71.368 -1.205 71.269 -1.249 71.162 -1.278 c
+71.063 -1.308 70.945 -1.323 70.81 -1.323 c
+71.794 0.353 m
+71.368 0.339 l
+71.269 0.339 71.177 0.331 71.089 0.324 c
+71.008 0.312 70.942 0.287 70.883 0.25 c
+70.825 0.21 70.773 0.151 70.736 0.073 c
+70.696 0.004 70.677 -0.087 70.677 -0.205 c
+70.677 -0.374 70.71 -0.496 70.78 -0.573 c
+70.846 -0.654 70.945 -0.691 71.074 -0.691 c
+71.18 -0.691 71.28 -0.669 71.368 -0.617 c
+71.463 -0.569 71.544 -0.507 71.603 -0.426 c
+71.669 -0.349 71.721 -0.261 71.75 -0.162 c
+71.779 -0.055 71.794 0.059 71.794 0.177 c
+h
+75.079 -1.263 m
+75.079 0.853 l
+75.079 1.018 75.072 1.154 75.064 1.264 c
+75.054 1.371 75.035 1.455 75.006 1.515 c
+74.984 1.58 74.954 1.632 74.918 1.661 c
+74.889 1.691 74.848 1.706 74.8 1.706 c
+74.742 1.706 74.686 1.676 74.638 1.617 c
+74.598 1.565 74.565 1.492 74.536 1.397 c
+74.507 1.309 74.48 1.195 74.462 1.058 c
+74.451 0.919 74.447 0.769 74.447 0.603 c
+74.447 -1.263 l
+73.698 -1.263 l
+73.698 1.47 l
+73.698 1.706 l
+73.698 1.926 l
+73.698 2.003 73.69 2.066 73.683 2.117 c
+73.683 2.22 l
+74.359 2.22 l
+74.359 2.132 l
+74.359 1.985 l
+74.366 1.926 74.374 1.867 74.374 1.808 c
+74.374 1.646 l
+74.389 1.646 l
+74.407 1.735 74.436 1.812 74.476 1.881 c
+74.513 1.959 74.557 2.029 74.609 2.087 c
+74.667 2.147 74.734 2.19 74.815 2.22 c
+74.892 2.257 74.98 2.278 75.079 2.278 c
+75.263 2.278 75.403 2.224 75.491 2.117 c
+75.586 2.018 75.656 1.86 75.697 1.646 c
+75.712 1.646 l
+75.748 1.742 75.789 1.831 75.829 1.912 c
+75.877 1.989 75.932 2.051 75.991 2.103 c
+76.049 2.161 76.116 2.205 76.196 2.234 c
+76.274 2.264 76.362 2.278 76.461 2.278 c
+76.597 2.278 76.711 2.253 76.799 2.205 c
+76.888 2.153 76.953 2.08 77.005 1.985 c
+77.063 1.885 77.1 1.756 77.123 1.602 c
+77.152 1.455 77.167 1.272 77.167 1.058 c
+77.167 -1.263 l
+76.446 -1.263 l
+76.446 0.853 l
+76.446 1.018 76.439 1.154 76.431 1.264 c
+76.421 1.371 76.402 1.455 76.373 1.515 c
+76.351 1.58 76.321 1.632 76.285 1.661 c
+76.255 1.691 76.215 1.706 76.167 1.706 c
+76.049 1.706 75.954 1.617 75.888 1.441 c
+75.829 1.272 75.8 1.014 75.8 0.661 c
+75.8 -1.263 l
+h
+79.537 -1.323 m
+79.28 -1.323 79.052 -1.286 78.846 -1.22 c
+78.64 -1.143 78.464 -1.028 78.317 -0.881 c
+78.17 -0.727 78.052 -0.536 77.964 -0.309 c
+77.883 -0.085 77.846 0.181 77.846 0.485 c
+77.846 0.816 77.89 1.095 77.979 1.324 c
+78.075 1.559 78.203 1.742 78.361 1.881 c
+78.526 2.018 78.714 2.117 78.92 2.176 c
+79.126 2.242 79.334 2.278 79.552 2.278 c
+79.824 2.278 80.059 2.227 80.257 2.132 c
+80.463 2.043 80.628 1.912 80.757 1.735 c
+80.893 1.565 80.992 1.36 81.051 1.118 c
+81.117 0.882 81.154 0.618 81.154 0.324 c
+81.154 0.309 l
+78.787 0.309 l
+78.787 0.162 78.802 0.023 78.831 -0.103 c
+78.868 -0.231 78.923 -0.345 78.993 -0.44 c
+79.059 -0.529 79.143 -0.598 79.243 -0.646 c
+79.338 -0.698 79.452 -0.72 79.581 -0.72 c
+79.735 -0.72 79.875 -0.687 79.993 -0.617 c
+80.117 -0.551 80.206 -0.448 80.257 -0.309 c
+81.095 -0.382 l
+81.065 -0.481 81.011 -0.588 80.934 -0.706 c
+80.853 -0.816 80.749 -0.918 80.624 -1.014 c
+80.508 -1.103 80.352 -1.176 80.169 -1.234 c
+79.993 -1.294 79.779 -1.323 79.537 -1.323 c
+79.537 1.706 m
+79.448 1.706 79.361 1.691 79.272 1.661 c
+79.184 1.632 79.103 1.58 79.037 1.515 c
+78.968 1.444 78.908 1.357 78.861 1.249 c
+78.821 1.139 78.802 1.014 78.802 0.867 c
+80.272 0.867 l
+80.272 1.004 80.246 1.125 80.198 1.235 c
+80.158 1.341 80.103 1.43 80.037 1.5 c
+79.978 1.565 79.905 1.617 79.816 1.646 c
+79.728 1.683 79.633 1.706 79.537 1.706 c
+82.407 -2.631 m
+82.407 -2.013 l
+83.48 -2.013 l
+83.48 2.896 l
+82.407 2.896 l
+82.407 3.514 l
+84.333 3.514 l
+84.333 -2.631 l
+h
+f
+Q
+q 1 0 0 1 545.482 99.4081 cm
+0 0 m
+-0.941 0 l
+-0.941 -2.161 l
+-1.616 -2.161 l
+-1.616 3.19 l
+-0.118 3.19 l
+0.412 3.19 0.809 3.05 1.073 2.778 c
+1.345 2.502 1.484 2.106 1.484 1.588 c
+1.484 1.253 1.411 0.963 1.264 0.721 c
+1.118 0.474 0.912 0.287 0.647 0.162 c
+1.676 -2.117 l
+1.676 -2.161 l
+0.956 -2.161 l
+h
+-0.941 0.588 m
+-0.118 0.588 l
+0.166 0.588 0.389 0.676 0.559 0.853 c
+0.724 1.037 0.809 1.283 0.809 1.588 c
+0.809 2.271 0.493 2.617 -0.132 2.617 c
+-0.941 2.617 l
+h
+3.719 -2.234 m
+3.219 -2.234 2.837 -2.087 2.573 -1.793 c
+2.308 -1.499 2.176 -1.066 2.176 -0.484 c
+2.176 -0.014 l
+2.176 0.58 2.301 1.048 2.558 1.382 c
+2.822 1.723 3.183 1.897 3.645 1.897 c
+4.105 1.897 4.447 1.742 4.675 1.441 c
+4.91 1.147 5.031 0.684 5.042 0.059 c
+5.042 -0.367 l
+2.822 -0.367 l
+2.822 -0.455 l
+2.822 -0.889 2.899 -1.201 3.057 -1.396 c
+3.223 -1.583 3.454 -1.675 3.749 -1.675 c
+3.944 -1.675 4.116 -1.643 4.263 -1.573 c
+4.41 -1.496 4.546 -1.378 4.675 -1.22 c
+5.012 -1.631 l
+4.726 -2.036 4.296 -2.234 3.719 -2.234 c
+3.645 1.338 m
+3.37 1.338 3.168 1.243 3.043 1.058 c
+2.914 0.871 2.841 0.58 2.822 0.191 c
+4.395 0.191 l
+4.395 0.279 l
+4.374 0.661 4.307 0.93 4.189 1.088 c
+4.072 1.253 3.888 1.338 3.645 1.338 c
+6.438 1.823 m
+6.454 1.455 l
+6.696 1.75 7.015 1.897 7.408 1.897 c
+7.85 1.897 8.158 1.698 8.335 1.309 c
+8.588 1.698 8.937 1.897 9.378 1.897 c
+10.113 1.897 10.488 1.434 10.51 0.515 c
+10.51 -2.161 l
+9.864 -2.161 l
+9.864 0.456 l
+9.864 0.75 9.808 0.963 9.702 1.103 c
+9.602 1.239 9.43 1.309 9.187 1.309 c
+8.989 1.309 8.827 1.228 8.702 1.073 c
+8.584 0.927 8.515 0.736 8.497 0.5 c
+8.497 -2.161 l
+7.834 -2.161 l
+7.834 0.485 l
+7.834 1.033 7.614 1.309 7.173 1.309 c
+6.839 1.309 6.604 1.147 6.468 0.823 c
+6.468 -2.161 l
+5.821 -2.161 l
+5.821 1.823 l
+h
+11.348 0.015 m
+11.348 0.592 11.484 1.048 11.759 1.382 c
+12.042 1.723 12.414 1.897 12.877 1.897 c
+13.336 1.897 13.704 1.727 13.979 1.397 c
+14.263 1.073 14.409 0.625 14.42 0.059 c
+14.42 -0.367 l
+14.42 -0.937 14.277 -1.392 13.994 -1.734 c
+13.718 -2.069 13.351 -2.234 12.891 -2.234 c
+12.428 -2.234 12.057 -2.072 11.774 -1.749 c
+11.499 -1.419 11.356 -0.977 11.348 -0.426 c
+h
+11.994 -0.367 m
+11.994 -0.771 12.072 -1.087 12.23 -1.323 c
+12.395 -1.558 12.616 -1.675 12.891 -1.675 c
+13.457 -1.675 13.752 -1.263 13.773 -0.44 c
+13.773 0.015 l
+13.773 0.416 13.689 0.736 13.523 0.971 c
+13.365 1.213 13.149 1.338 12.877 1.338 c
+12.613 1.338 12.395 1.213 12.23 0.971 c
+12.072 0.736 11.994 0.416 11.994 0.015 c
+h
+16.331 -1.176 m
+17.081 1.823 l
+17.742 1.823 l
+16.566 -2.161 l
+16.081 -2.161 l
+14.89 1.823 l
+15.552 1.823 l
+h
+19.8 -2.234 m
+19.3 -2.234 18.918 -2.087 18.653 -1.793 c
+18.389 -1.499 18.257 -1.066 18.257 -0.484 c
+18.257 -0.014 l
+18.257 0.58 18.381 1.048 18.639 1.382 c
+18.903 1.723 19.264 1.897 19.726 1.897 c
+20.185 1.897 20.528 1.742 20.756 1.441 c
+20.991 1.147 21.112 0.684 21.122 0.059 c
+21.122 -0.367 l
+18.903 -0.367 l
+18.903 -0.455 l
+18.903 -0.889 18.98 -1.201 19.138 -1.396 c
+19.304 -1.583 19.535 -1.675 19.829 -1.675 c
+20.024 -1.675 20.197 -1.643 20.344 -1.573 c
+20.491 -1.496 20.627 -1.378 20.756 -1.22 c
+21.093 -1.631 l
+20.807 -2.036 20.377 -2.234 19.8 -2.234 c
+19.726 1.338 m
+19.451 1.338 19.248 1.243 19.123 1.058 c
+18.995 0.871 18.922 0.58 18.903 0.191 c
+20.476 0.191 l
+20.476 0.279 l
+20.455 0.661 20.388 0.93 20.27 1.088 c
+20.153 1.253 19.969 1.338 19.726 1.338 c
+25.562 -1.146 m
+25.562 -0.999 25.507 -0.878 25.4 -0.779 c
+25.29 -0.683 25.084 -0.565 24.783 -0.426 c
+24.438 -0.279 24.195 -0.158 24.048 -0.058 c
+23.901 0.048 23.79 0.166 23.724 0.294 c
+23.655 0.42 23.622 0.578 23.622 0.765 c
+23.622 1.088 23.74 1.357 23.975 1.573 c
+24.21 1.786 24.511 1.897 24.885 1.897 c
+25.268 1.897 25.577 1.783 25.812 1.559 c
+26.047 1.33 26.165 1.044 26.165 0.691 c
+25.518 0.691 l
+25.518 0.867 25.459 1.018 25.342 1.147 c
+25.224 1.272 25.07 1.338 24.885 1.338 c
+24.688 1.338 24.536 1.283 24.43 1.176 c
+24.32 1.077 24.268 0.945 24.268 0.779 c
+24.268 0.651 24.305 0.544 24.386 0.456 c
+24.463 0.375 24.654 0.272 24.96 0.148 c
+25.437 -0.04 25.768 -0.228 25.944 -0.411 c
+26.121 -0.588 26.209 -0.816 26.209 -1.087 c
+26.209 -1.44 26.084 -1.72 25.841 -1.926 c
+25.606 -2.131 25.29 -2.234 24.9 -2.234 c
+24.478 -2.234 24.14 -2.117 23.886 -1.881 c
+23.63 -1.639 23.504 -1.334 23.504 -0.97 c
+24.151 -0.97 l
+24.158 -1.198 24.228 -1.374 24.357 -1.499 c
+24.482 -1.616 24.665 -1.675 24.9 -1.675 c
+25.114 -1.675 25.276 -1.627 25.386 -1.529 c
+25.503 -1.433 25.562 -1.304 25.562 -1.146 c
+28.472 -2.234 m
+27.973 -2.234 27.59 -2.087 27.326 -1.793 c
+27.061 -1.499 26.929 -1.066 26.929 -0.484 c
+26.929 -0.014 l
+26.929 0.58 27.054 1.048 27.312 1.382 c
+27.576 1.723 27.936 1.897 28.399 1.897 c
+28.858 1.897 29.2 1.742 29.428 1.441 c
+29.663 1.147 29.785 0.684 29.795 0.059 c
+29.795 -0.367 l
+27.576 -0.367 l
+27.576 -0.455 l
+27.576 -0.889 27.653 -1.201 27.811 -1.396 c
+27.977 -1.583 28.208 -1.675 28.502 -1.675 c
+28.696 -1.675 28.869 -1.643 29.016 -1.573 c
+29.163 -1.496 29.299 -1.378 29.428 -1.22 c
+29.766 -1.631 l
+29.479 -2.036 29.049 -2.234 28.472 -2.234 c
+28.399 1.338 m
+28.123 1.338 27.921 1.243 27.796 1.058 c
+27.668 0.871 27.594 0.58 27.576 0.191 c
+29.149 0.191 l
+29.149 0.279 l
+29.126 0.661 29.06 0.93 28.943 1.088 c
+28.825 1.253 28.642 1.338 28.399 1.338 c
+31.28 -2.161 -0.646 5.644 re
+33.72 -2.234 m
+33.22 -2.234 32.838 -2.087 32.573 -1.793 c
+32.309 -1.499 32.176 -1.066 32.176 -0.484 c
+32.176 -0.014 l
+32.176 0.58 32.301 1.048 32.559 1.382 c
+32.823 1.723 33.184 1.897 33.647 1.897 c
+34.106 1.897 34.448 1.742 34.676 1.441 c
+34.911 1.147 35.032 0.684 35.043 0.059 c
+35.043 -0.367 l
+32.823 -0.367 l
+32.823 -0.455 l
+32.823 -0.889 32.901 -1.201 33.059 -1.396 c
+33.224 -1.583 33.456 -1.675 33.749 -1.675 c
+33.944 -1.675 34.117 -1.643 34.264 -1.573 c
+34.41 -1.496 34.547 -1.378 34.676 -1.22 c
+35.013 -1.631 l
+34.726 -2.036 34.297 -2.234 33.72 -2.234 c
+33.647 1.338 m
+33.371 1.338 33.169 1.243 33.043 1.058 c
+32.916 0.871 32.842 0.58 32.823 0.191 c
+34.396 0.191 l
+34.396 0.279 l
+34.374 0.661 34.308 0.93 34.19 1.088 c
+34.073 1.253 33.889 1.338 33.647 1.338 c
+37.203 -1.675 m
+37.417 -1.675 37.589 -1.613 37.718 -1.484 c
+37.854 -1.348 37.928 -1.157 37.938 -0.911 c
+38.556 -0.911 l
+38.534 -1.294 38.398 -1.613 38.144 -1.866 c
+37.887 -2.113 37.575 -2.234 37.203 -2.234 c
+36.711 -2.234 36.336 -2.084 36.072 -1.778 c
+35.815 -1.466 35.69 -0.999 35.69 -0.382 c
+35.69 0.059 l
+35.69 0.655 35.815 1.11 36.072 1.426 c
+36.336 1.738 36.711 1.897 37.203 1.897 c
+37.604 1.897 37.924 1.764 38.159 1.5 c
+38.402 1.243 38.534 0.897 38.556 0.456 c
+37.938 0.456 l
+37.917 0.75 37.843 0.971 37.718 1.118 c
+37.6 1.264 37.427 1.338 37.203 1.338 c
+36.91 1.338 36.693 1.239 36.557 1.044 c
+36.417 0.856 36.344 0.548 36.336 0.118 c
+36.336 -0.397 l
+36.336 -0.867 36.403 -1.201 36.542 -1.396 c
+36.689 -1.583 36.91 -1.675 37.203 -1.675 c
+40.158 2.778 m
+40.158 1.823 l
+40.76 1.823 l
+40.76 1.294 l
+40.158 1.294 l
+40.158 -1.176 l
+40.158 -1.334 40.18 -1.452 40.232 -1.529 c
+40.29 -1.61 40.378 -1.646 40.496 -1.646 c
+40.584 -1.646 40.673 -1.631 40.76 -1.602 c
+40.76 -2.161 l
+40.614 -2.208 40.459 -2.234 40.305 -2.234 c
+40.048 -2.234 39.854 -2.142 39.717 -1.955 c
+39.578 -1.771 39.511 -1.51 39.511 -1.176 c
+39.511 1.294 l
+38.909 1.294 l
+38.909 1.823 l
+39.511 1.823 l
+39.511 2.778 l
+h
+42.951 -2.234 m
+42.451 -2.234 42.069 -2.087 41.805 -1.793 c
+41.54 -1.499 41.408 -1.066 41.408 -0.484 c
+41.408 -0.014 l
+41.408 0.58 41.533 1.048 41.79 1.382 c
+42.054 1.723 42.414 1.897 42.877 1.897 c
+43.337 1.897 43.679 1.742 43.906 1.441 c
+44.141 1.147 44.263 0.684 44.274 0.059 c
+44.274 -0.367 l
+42.054 -0.367 l
+42.054 -0.455 l
+42.054 -0.889 42.131 -1.201 42.289 -1.396 c
+42.455 -1.583 42.686 -1.675 42.981 -1.675 c
+43.175 -1.675 43.347 -1.643 43.495 -1.573 c
+43.642 -1.496 43.777 -1.378 43.906 -1.22 c
+44.245 -1.631 l
+43.958 -2.036 43.528 -2.234 42.951 -2.234 c
+42.877 1.338 m
+42.601 1.338 42.4 1.243 42.275 1.058 c
+42.146 0.871 42.073 0.58 42.054 0.191 c
+43.627 0.191 l
+43.627 0.279 l
+43.605 0.661 43.539 0.93 43.422 1.088 c
+43.304 1.253 43.12 1.338 42.877 1.338 c
+44.92 0.015 m
+44.92 0.621 45.031 1.088 45.259 1.411 c
+45.494 1.735 45.821 1.897 46.244 1.897 c
+46.626 1.897 46.923 1.738 47.141 1.426 c
+47.141 3.484 l
+47.787 3.484 l
+47.787 -2.161 l
+47.199 -2.161 l
+47.155 -1.734 l
+46.95 -2.069 46.644 -2.234 46.244 -2.234 c
+45.832 -2.234 45.508 -2.08 45.273 -1.764 c
+45.038 -1.44 44.92 -0.985 44.92 -0.397 c
+h
+45.568 -0.367 m
+45.568 -0.808 45.63 -1.139 45.759 -1.352 c
+45.894 -1.558 46.115 -1.66 46.42 -1.66 c
+46.744 -1.66 46.982 -1.499 47.141 -1.176 c
+47.141 0.838 l
+46.971 1.151 46.732 1.309 46.42 1.309 c
+46.115 1.309 45.894 1.206 45.759 1 c
+45.63 0.794 45.568 0.47 45.568 0.03 c
+h
+53.387 -0.367 m
+53.387 -0.985 53.273 -1.452 53.049 -1.764 c
+52.833 -2.08 52.509 -2.234 52.079 -2.234 c
+51.657 -2.234 51.344 -2.054 51.139 -1.691 c
+51.109 -2.161 l
+50.506 -2.161 l
+50.506 3.484 l
+51.153 3.484 l
+51.153 1.382 l
+51.366 1.723 51.675 1.897 52.079 1.897 c
+52.509 1.897 52.833 1.738 53.049 1.426 c
+53.273 1.121 53.387 0.655 53.387 0.03 c
+h
+52.741 0.015 m
+52.741 0.485 52.671 0.816 52.535 1.014 c
+52.406 1.209 52.197 1.309 51.902 1.309 c
+51.569 1.309 51.318 1.125 51.153 0.765 c
+51.153 -1.117 l
+51.318 -1.481 51.572 -1.66 51.918 -1.66 c
+52.211 -1.66 52.421 -1.558 52.55 -1.352 c
+52.675 -1.146 52.741 -0.831 52.741 -0.397 c
+h
+55.872 1.206 m
+55.783 1.224 55.684 1.235 55.577 1.235 c
+55.243 1.235 55.008 1.051 54.871 0.691 c
+54.871 -2.161 l
+54.225 -2.161 l
+54.225 1.823 l
+54.857 1.823 l
+54.871 1.411 l
+55.048 1.735 55.291 1.897 55.607 1.897 c
+55.713 1.897 55.802 1.874 55.872 1.837 c
+h
+58.414 -2.161 m
+58.374 -2.072 58.348 -1.926 58.341 -1.72 c
+58.106 -2.065 57.811 -2.234 57.458 -2.234 c
+57.095 -2.234 56.812 -2.138 56.606 -1.94 c
+56.408 -1.734 56.313 -1.448 56.313 -1.072 c
+56.313 -0.673 56.448 -0.353 56.724 -0.118 c
+56.996 0.125 57.371 0.25 57.841 0.25 c
+58.326 0.25 l
+58.326 0.676 l
+58.326 0.912 58.271 1.077 58.164 1.176 c
+58.054 1.283 57.892 1.338 57.68 1.338 c
+57.481 1.338 57.319 1.279 57.194 1.162 c
+57.077 1.044 57.018 0.897 57.018 0.721 c
+56.371 0.721 l
+56.371 0.915 56.43 1.106 56.548 1.294 c
+56.673 1.478 56.834 1.625 57.032 1.735 c
+57.238 1.841 57.466 1.897 57.724 1.897 c
+58.124 1.897 58.429 1.794 58.634 1.588 c
+58.848 1.382 58.962 1.088 58.973 0.706 c
+58.973 -1.308 l
+58.973 -1.613 59.01 -1.878 59.091 -2.102 c
+59.091 -2.161 l
+h
+57.547 -1.646 m
+57.713 -1.646 57.863 -1.602 58.003 -1.514 c
+58.15 -1.425 58.256 -1.315 58.326 -1.176 c
+58.326 -0.235 l
+57.959 -0.235 l
+57.643 -0.235 57.4 -0.305 57.223 -0.44 c
+57.047 -0.569 56.959 -0.756 56.959 -0.999 c
+56.959 -1.227 57.003 -1.392 57.092 -1.499 c
+57.18 -1.598 57.331 -1.646 57.547 -1.646 c
+60.59 1.823 m
+60.604 1.382 l
+60.858 1.723 61.181 1.897 61.574 1.897 c
+62.28 1.897 62.636 1.426 62.648 0.485 c
+62.648 -2.161 l
+62.001 -2.161 l
+62.001 0.456 l
+62.001 0.769 61.946 0.989 61.84 1.118 c
+61.729 1.243 61.574 1.309 61.369 1.309 c
+61.211 1.309 61.064 1.253 60.928 1.147 c
+60.799 1.037 60.697 0.9 60.619 0.736 c
+60.619 -2.161 l
+59.972 -2.161 l
+59.972 1.823 l
+h
+64.999 -1.675 m
+65.213 -1.675 65.385 -1.613 65.514 -1.484 c
+65.65 -1.348 65.724 -1.157 65.734 -0.911 c
+66.352 -0.911 l
+66.33 -1.294 66.194 -1.613 65.94 -1.866 c
+65.683 -2.113 65.371 -2.234 64.999 -2.234 c
+64.508 -2.234 64.132 -2.084 63.868 -1.778 c
+63.611 -1.466 63.486 -0.999 63.486 -0.382 c
+63.486 0.059 l
+63.486 0.655 63.611 1.11 63.868 1.426 c
+64.132 1.738 64.508 1.897 64.999 1.897 c
+65.4 1.897 65.72 1.764 65.955 1.5 c
+66.198 1.243 66.33 0.897 66.352 0.456 c
+65.734 0.456 l
+65.713 0.75 65.639 0.971 65.514 1.118 c
+65.396 1.264 65.223 1.338 64.999 1.338 c
+64.706 1.338 64.489 1.239 64.353 1.044 c
+64.213 0.856 64.14 0.548 64.132 0.118 c
+64.132 -0.397 l
+64.132 -0.867 64.199 -1.201 64.338 -1.396 c
+64.485 -1.583 64.706 -1.675 64.999 -1.675 c
+67.748 1.411 m
+68.001 1.735 68.321 1.897 68.704 1.897 c
+69.41 1.897 69.766 1.426 69.777 0.485 c
+69.777 -2.161 l
+69.13 -2.161 l
+69.13 0.456 l
+69.13 0.769 69.075 0.989 68.969 1.118 c
+68.858 1.243 68.704 1.309 68.498 1.309 c
+68.34 1.309 68.193 1.253 68.057 1.147 c
+67.928 1.037 67.825 0.9 67.748 0.736 c
+67.748 -2.161 l
+67.101 -2.161 l
+67.101 3.484 l
+67.748 3.484 l
+h
+70.746 -3.233 m
+70.35 -2.969 l
+70.586 -2.645 70.707 -2.311 70.717 -1.969 c
+70.717 -1.352 l
+71.379 -1.352 l
+71.379 -1.881 l
+71.379 -2.138 71.313 -2.385 71.188 -2.631 c
+71.07 -2.873 70.923 -3.075 70.746 -3.233 c
+74.642 -2.161 -0.646 3.984 re
+74.686 2.866 m
+74.686 2.756 74.657 2.664 74.598 2.587 c
+74.54 2.517 74.444 2.484 74.318 2.484 c
+74.201 2.484 74.106 2.517 74.039 2.587 c
+73.981 2.664 73.952 2.756 73.952 2.866 c
+73.952 2.984 73.981 3.076 74.039 3.146 c
+74.106 3.223 74.201 3.263 74.318 3.263 c
+74.444 3.263 74.54 3.223 74.598 3.146 c
+74.657 3.065 74.686 2.973 74.686 2.866 c
+75.951 -2.161 m
+75.951 1.294 l
+75.421 1.294 l
+75.421 1.823 l
+75.951 1.823 l
+75.951 2.278 l
+75.951 2.679 76.046 2.992 76.244 3.219 c
+76.45 3.443 76.73 3.558 77.082 3.558 c
+77.218 3.558 77.35 3.535 77.479 3.499 c
+77.449 2.955 l
+77.35 2.973 77.252 2.984 77.156 2.984 c
+76.781 2.984 76.597 2.72 76.597 2.19 c
+76.597 1.823 l
+77.273 1.823 l
+77.273 1.294 l
+76.597 1.294 l
+76.597 -2.161 l
+h
+80.463 -2.161 -0.647 3.984 re
+80.507 2.866 m
+80.507 2.756 80.477 2.664 80.419 2.587 c
+80.36 2.517 80.265 2.484 80.14 2.484 c
+80.022 2.484 79.926 2.517 79.86 2.587 c
+79.801 2.664 79.772 2.756 79.772 2.866 c
+79.772 2.984 79.801 3.076 79.86 3.146 c
+79.926 3.223 80.022 3.263 80.14 3.263 c
+80.265 3.263 80.36 3.223 80.419 3.146 c
+80.477 3.065 80.507 2.973 80.507 2.866 c
+82.33 2.778 m
+82.33 1.823 l
+82.933 1.823 l
+82.933 1.294 l
+82.33 1.294 l
+82.33 -1.176 l
+82.33 -1.334 82.351 -1.452 82.403 -1.529 c
+82.462 -1.61 82.55 -1.646 82.667 -1.646 c
+82.756 -1.646 82.844 -1.631 82.933 -1.602 c
+82.933 -2.161 l
+82.785 -2.208 82.631 -2.234 82.477 -2.234 c
+82.22 -2.234 82.025 -2.142 81.889 -1.955 c
+81.749 -1.771 81.683 -1.51 81.683 -1.176 c
+81.683 1.294 l
+81.081 1.294 l
+81.081 1.823 l
+81.683 1.823 l
+81.683 2.778 l
+h
+86.122 -2.161 -0.646 3.984 re
+86.166 2.866 m
+86.166 2.756 86.137 2.664 86.078 2.587 c
+86.019 2.517 85.923 2.484 85.798 2.484 c
+85.681 2.484 85.586 2.517 85.52 2.587 c
+85.461 2.664 85.431 2.756 85.431 2.866 c
+85.431 2.984 85.461 3.076 85.52 3.146 c
+85.586 3.223 85.681 3.263 85.798 3.263 c
+85.923 3.263 86.019 3.223 86.078 3.146 c
+86.137 3.065 86.166 2.973 86.166 2.866 c
+89.077 -1.146 m
+89.077 -0.999 89.021 -0.878 88.915 -0.779 c
+88.805 -0.683 88.599 -0.565 88.298 -0.426 c
+87.953 -0.279 87.71 -0.158 87.562 -0.058 c
+87.415 0.048 87.305 0.166 87.24 0.294 c
+87.17 0.42 87.136 0.578 87.136 0.765 c
+87.136 1.088 87.254 1.357 87.489 1.573 c
+87.724 1.786 88.026 1.897 88.4 1.897 c
+88.782 1.897 89.091 1.783 89.326 1.559 c
+89.561 1.33 89.679 1.044 89.679 0.691 c
+89.033 0.691 l
+89.033 0.867 88.973 1.018 88.856 1.147 c
+88.738 1.272 88.584 1.338 88.4 1.338 c
+88.202 1.338 88.051 1.283 87.945 1.176 c
+87.835 1.077 87.783 0.945 87.783 0.779 c
+87.783 0.651 87.82 0.544 87.901 0.456 c
+87.978 0.375 88.169 0.272 88.474 0.148 c
+88.952 -0.04 89.283 -0.228 89.459 -0.411 c
+89.636 -0.588 89.723 -0.816 89.723 -1.087 c
+89.723 -1.44 89.599 -1.72 89.356 -1.926 c
+89.121 -2.131 88.805 -2.234 88.415 -2.234 c
+87.992 -2.234 87.654 -2.117 87.401 -1.881 c
+87.143 -1.639 87.018 -1.334 87.018 -0.97 c
+87.666 -0.97 l
+87.673 -1.198 87.743 -1.374 87.872 -1.499 c
+87.996 -1.616 88.18 -1.675 88.415 -1.675 c
+88.628 -1.675 88.79 -1.627 88.9 -1.529 c
+89.017 -1.433 89.077 -1.304 89.077 -1.146 c
+94.324 -2.161 m
+94.284 -2.072 94.258 -1.926 94.251 -1.72 c
+94.016 -2.065 93.721 -2.234 93.368 -2.234 c
+93.005 -2.234 92.722 -2.138 92.516 -1.94 c
+92.318 -1.734 92.223 -1.448 92.223 -1.072 c
+92.223 -0.673 92.358 -0.353 92.634 -0.118 c
+92.906 0.125 93.281 0.25 93.751 0.25 c
+94.236 0.25 l
+94.236 0.676 l
+94.236 0.912 94.181 1.077 94.074 1.176 c
+93.964 1.283 93.802 1.338 93.59 1.338 c
+93.391 1.338 93.229 1.279 93.104 1.162 c
+92.986 1.044 92.928 0.897 92.928 0.721 c
+92.281 0.721 l
+92.281 0.915 92.34 1.106 92.458 1.294 c
+92.582 1.478 92.744 1.625 92.942 1.735 c
+93.148 1.841 93.376 1.897 93.634 1.897 c
+94.034 1.897 94.339 1.794 94.544 1.588 c
+94.758 1.382 94.872 1.088 94.883 0.706 c
+94.883 -1.308 l
+94.883 -1.613 94.92 -1.878 95.001 -2.102 c
+95.001 -2.161 l
+h
+93.457 -1.646 m
+93.622 -1.646 93.773 -1.602 93.912 -1.514 c
+94.06 -1.425 94.166 -1.315 94.236 -1.176 c
+94.236 -0.235 l
+93.869 -0.235 l
+93.553 -0.235 93.31 -0.305 93.133 -0.44 c
+92.957 -0.569 92.869 -0.756 92.869 -0.999 c
+92.869 -1.227 92.913 -1.392 93.002 -1.499 c
+93.089 -1.598 93.24 -1.646 93.457 -1.646 c
+96.588 -2.161 -0.646 5.644 re
+99.248 1.206 m
+99.161 1.224 99.061 1.235 98.955 1.235 c
+98.62 1.235 98.384 1.051 98.249 0.691 c
+98.249 -2.161 l
+97.602 -2.161 l
+97.602 1.823 l
+98.234 1.823 l
+98.249 1.411 l
+98.425 1.735 98.668 1.897 98.984 1.897 c
+99.09 1.897 99.178 1.874 99.248 1.837 c
+h
+101.247 -2.234 m
+100.748 -2.234 100.366 -2.087 100.101 -1.793 c
+99.836 -1.499 99.704 -1.066 99.704 -0.484 c
+99.704 -0.014 l
+99.704 0.58 99.829 1.048 100.086 1.382 c
+100.351 1.723 100.711 1.897 101.174 1.897 c
+101.633 1.897 101.975 1.742 102.203 1.441 c
+102.438 1.147 102.559 0.684 102.571 0.059 c
+102.571 -0.367 l
+100.351 -0.367 l
+100.351 -0.455 l
+100.351 -0.889 100.428 -1.201 100.586 -1.396 c
+100.751 -1.583 100.983 -1.675 101.277 -1.675 c
+101.472 -1.675 101.644 -1.643 101.791 -1.573 c
+101.939 -1.496 102.074 -1.378 102.203 -1.22 c
+102.541 -1.631 l
+102.255 -2.036 101.825 -2.234 101.247 -2.234 c
+101.174 1.338 m
+100.898 1.338 100.696 1.243 100.572 1.058 c
+100.443 0.871 100.369 0.58 100.351 0.191 c
+101.923 0.191 l
+101.923 0.279 l
+101.902 0.661 101.835 0.93 101.717 1.088 c
+101.6 1.253 101.416 1.338 101.174 1.338 c
+105.393 -2.161 m
+105.352 -2.072 105.326 -1.926 105.319 -1.72 c
+105.083 -2.065 104.79 -2.234 104.437 -2.234 c
+104.073 -2.234 103.79 -2.138 103.585 -1.94 c
+103.386 -1.734 103.29 -1.448 103.29 -1.072 c
+103.29 -0.673 103.427 -0.353 103.702 -0.118 c
+103.974 0.125 104.349 0.25 104.819 0.25 c
+105.305 0.25 l
+105.305 0.676 l
+105.305 0.912 105.249 1.077 105.143 1.176 c
+105.033 1.283 104.871 1.338 104.657 1.338 c
+104.459 1.338 104.298 1.279 104.173 1.162 c
+104.055 1.044 103.996 0.897 103.996 0.721 c
+103.35 0.721 l
+103.35 0.915 103.408 1.106 103.526 1.294 c
+103.651 1.478 103.813 1.625 104.011 1.735 c
+104.217 1.841 104.445 1.897 104.701 1.897 c
+105.102 1.897 105.407 1.794 105.613 1.588 c
+105.827 1.382 105.94 1.088 105.951 0.706 c
+105.951 -1.308 l
+105.951 -1.613 105.987 -1.878 106.068 -2.102 c
+106.068 -2.161 l
+h
+104.526 -1.646 m
+104.69 -1.646 104.842 -1.602 104.981 -1.514 c
+105.128 -1.425 105.235 -1.315 105.305 -1.176 c
+105.305 -0.235 l
+104.937 -0.235 l
+104.621 -0.235 104.378 -0.305 104.202 -0.44 c
+104.025 -0.569 103.938 -0.756 103.938 -0.999 c
+103.938 -1.227 103.982 -1.392 104.069 -1.499 c
+104.158 -1.598 104.308 -1.646 104.526 -1.646 c
+106.818 0.015 m
+106.818 0.621 106.928 1.088 107.157 1.411 c
+107.392 1.735 107.718 1.897 108.141 1.897 c
+108.524 1.897 108.821 1.738 109.038 1.426 c
+109.038 3.484 l
+109.685 3.484 l
+109.685 -2.161 l
+109.097 -2.161 l
+109.052 -1.734 l
+108.846 -2.069 108.542 -2.234 108.141 -2.234 c
+107.73 -2.234 107.406 -2.08 107.171 -1.764 c
+106.936 -1.44 106.818 -0.985 106.818 -0.397 c
+h
+107.465 -0.367 m
+107.465 -0.808 107.527 -1.139 107.656 -1.352 c
+107.792 -1.558 108.013 -1.66 108.318 -1.66 c
+108.641 -1.66 108.88 -1.499 109.038 -1.176 c
+109.038 0.838 l
+108.869 1.151 108.63 1.309 108.318 1.309 c
+108.013 1.309 107.792 1.206 107.656 1 c
+107.527 0.794 107.465 0.47 107.465 0.03 c
+h
+111.772 -1.072 m
+112.492 1.823 l
+113.183 1.823 l
+111.89 -2.719 l
+111.79 -3.061 111.647 -3.322 111.464 -3.498 c
+111.287 -3.675 111.084 -3.763 110.86 -3.763 c
+110.772 -3.763 110.658 -3.74 110.523 -3.704 c
+110.523 -3.16 l
+110.67 -3.175 l
+110.853 -3.175 111.001 -3.131 111.111 -3.042 c
+111.217 -2.954 111.305 -2.796 111.375 -2.572 c
+111.493 -2.131 l
+110.332 1.823 l
+111.037 1.823 l
+h
+116.152 1.823 m
+116.167 1.455 l
+116.41 1.75 116.729 1.897 117.122 1.897 c
+117.563 1.897 117.872 1.698 118.049 1.309 c
+118.302 1.698 118.651 1.897 119.092 1.897 c
+119.827 1.897 120.202 1.434 120.224 0.515 c
+120.224 -2.161 l
+119.577 -2.161 l
+119.577 0.456 l
+119.577 0.75 119.522 0.963 119.416 1.103 c
+119.316 1.239 119.144 1.309 118.901 1.309 c
+118.703 1.309 118.541 1.228 118.416 1.073 c
+118.298 0.927 118.228 0.736 118.211 0.5 c
+118.211 -2.161 l
+117.548 -2.161 l
+117.548 0.485 l
+117.548 1.033 117.328 1.309 116.887 1.309 c
+116.553 1.309 116.318 1.147 116.181 0.823 c
+116.181 -2.161 l
+115.535 -2.161 l
+115.535 1.823 l
+h
+122.62 -2.234 m
+122.12 -2.234 121.738 -2.087 121.473 -1.793 c
+121.209 -1.499 121.076 -1.066 121.076 -0.484 c
+121.076 -0.014 l
+121.076 0.58 121.201 1.048 121.459 1.382 c
+121.723 1.723 122.084 1.897 122.546 1.897 c
+123.005 1.897 123.348 1.742 123.576 1.441 c
+123.811 1.147 123.932 0.684 123.942 0.059 c
+123.942 -0.367 l
+121.723 -0.367 l
+121.723 -0.455 l
+121.723 -0.889 121.8 -1.201 121.958 -1.396 c
+122.124 -1.583 122.355 -1.675 122.649 -1.675 c
+122.844 -1.675 123.017 -1.643 123.164 -1.573 c
+123.31 -1.496 123.447 -1.378 123.576 -1.22 c
+123.913 -1.631 l
+123.626 -2.036 123.196 -2.234 122.62 -2.234 c
+122.546 1.338 m
+122.271 1.338 122.068 1.243 121.943 1.058 c
+121.815 0.871 121.742 0.58 121.723 0.191 c
+123.296 0.191 l
+123.296 0.279 l
+123.274 0.661 123.208 0.93 123.09 1.088 c
+122.973 1.253 122.789 1.338 122.546 1.338 c
+126.368 1.206 m
+126.28 1.224 126.18 1.235 126.074 1.235 c
+125.74 1.235 125.505 1.051 125.369 0.691 c
+125.369 -2.161 l
+124.721 -2.161 l
+124.721 1.823 l
+125.354 1.823 l
+125.369 1.411 l
+125.544 1.735 125.787 1.897 126.103 1.897 c
+126.211 1.897 126.298 1.874 126.368 1.837 c
+h
+126.809 0.015 m
+126.809 0.632 126.919 1.095 127.148 1.411 c
+127.371 1.735 127.705 1.897 128.147 1.897 c
+128.547 1.897 128.852 1.72 129.058 1.367 c
+129.102 1.823 l
+129.69 1.823 l
+129.69 -2.204 l
+129.69 -2.693 129.561 -3.072 129.307 -3.337 c
+129.051 -3.601 128.698 -3.733 128.249 -3.733 c
+128.052 -3.733 127.831 -3.682 127.588 -3.586 c
+127.342 -3.487 127.162 -3.366 127.044 -3.219 c
+127.308 -2.778 l
+127.574 -3.042 127.871 -3.175 128.206 -3.175 c
+128.742 -3.175 129.018 -2.881 129.029 -2.293 c
+129.029 -1.764 l
+128.823 -2.08 128.522 -2.234 128.132 -2.234 c
+127.72 -2.234 127.397 -2.084 127.162 -1.778 c
+126.934 -1.466 126.816 -1.014 126.809 -0.426 c
+h
+127.47 -0.367 m
+127.47 -0.808 127.533 -1.139 127.661 -1.352 c
+127.786 -1.558 128.004 -1.66 128.308 -1.66 c
+128.632 -1.66 128.871 -1.496 129.029 -1.161 c
+129.029 0.823 l
+128.86 1.147 128.621 1.309 128.308 1.309 c
+128.014 1.309 127.798 1.206 127.661 1 c
+127.533 0.794 127.47 0.47 127.47 0.03 c
+h
+132.071 -2.234 m
+131.572 -2.234 131.189 -2.087 130.925 -1.793 c
+130.66 -1.499 130.528 -1.066 130.528 -0.484 c
+130.528 -0.014 l
+130.528 0.58 130.653 1.048 130.911 1.382 c
+131.175 1.723 131.535 1.897 131.998 1.897 c
+132.457 1.897 132.799 1.742 133.027 1.441 c
+133.262 1.147 133.383 0.684 133.394 0.059 c
+133.394 -0.367 l
+131.175 -0.367 l
+131.175 -0.455 l
+131.175 -0.889 131.252 -1.201 131.41 -1.396 c
+131.576 -1.583 131.807 -1.675 132.101 -1.675 c
+132.295 -1.675 132.468 -1.643 132.615 -1.573 c
+132.762 -1.496 132.898 -1.378 133.027 -1.22 c
+133.365 -1.631 l
+133.078 -2.036 132.648 -2.234 132.071 -2.234 c
+131.998 1.338 m
+131.722 1.338 131.52 1.243 131.395 1.058 c
+131.266 0.871 131.193 0.58 131.175 0.191 c
+132.748 0.191 l
+132.748 0.279 l
+132.725 0.661 132.659 0.93 132.542 1.088 c
+132.424 1.253 132.241 1.338 131.998 1.338 c
+134.041 0.015 m
+134.041 0.621 134.151 1.088 134.379 1.411 c
+134.614 1.735 134.942 1.897 135.364 1.897 c
+135.746 1.897 136.044 1.738 136.26 1.426 c
+136.26 3.484 l
+136.908 3.484 l
+136.908 -2.161 l
+136.32 -2.161 l
+136.276 -1.734 l
+136.07 -2.069 135.765 -2.234 135.364 -2.234 c
+134.952 -2.234 134.629 -2.08 134.394 -1.764 c
+134.159 -1.44 134.041 -0.985 134.041 -0.397 c
+h
+134.688 -0.367 m
+134.688 -0.808 134.751 -1.139 134.879 -1.352 c
+135.015 -1.558 135.235 -1.66 135.54 -1.66 c
+135.863 -1.66 136.102 -1.499 136.26 -1.176 c
+136.26 0.838 l
+136.091 1.151 135.853 1.309 135.54 1.309 c
+135.235 1.309 135.015 1.206 134.879 1 c
+134.751 0.794 134.688 0.47 134.688 0.03 c
+h
+140.332 -2.161 -0.646 3.984 re
+140.376 2.866 m
+140.376 2.756 140.347 2.664 140.288 2.587 c
+140.229 2.517 140.133 2.484 140.008 2.484 c
+139.891 2.484 139.796 2.517 139.73 2.587 c
+139.671 2.664 139.642 2.756 139.642 2.866 c
+139.642 2.984 139.671 3.076 139.73 3.146 c
+139.796 3.223 139.891 3.263 140.008 3.263 c
+140.133 3.263 140.229 3.223 140.288 3.146 c
+140.347 3.065 140.376 2.973 140.376 2.866 c
+141.964 1.823 m
+141.978 1.382 l
+142.232 1.723 142.555 1.897 142.948 1.897 c
+143.654 1.897 144.01 1.426 144.022 0.485 c
+144.022 -2.161 l
+143.375 -2.161 l
+143.375 0.456 l
+143.375 0.769 143.32 0.989 143.214 1.118 c
+143.103 1.243 142.948 1.309 142.743 1.309 c
+142.585 1.309 142.438 1.253 142.302 1.147 c
+142.173 1.037 142.07 0.9 141.993 0.736 c
+141.993 -2.161 l
+141.346 -2.161 l
+141.346 1.823 l
+h
+145.845 2.778 m
+145.845 1.823 l
+146.447 1.823 l
+146.447 1.294 l
+145.845 1.294 l
+145.845 -1.176 l
+145.845 -1.334 145.866 -1.452 145.918 -1.529 c
+145.976 -1.61 146.065 -1.646 146.182 -1.646 c
+146.271 -1.646 146.358 -1.631 146.447 -1.602 c
+146.447 -2.161 l
+146.3 -2.208 146.146 -2.234 145.992 -2.234 c
+145.734 -2.234 145.539 -2.142 145.404 -1.955 c
+145.263 -1.771 145.198 -1.51 145.198 -1.176 c
+145.198 1.294 l
+144.594 1.294 l
+144.594 1.823 l
+145.198 1.823 l
+145.198 2.778 l
+h
+147.006 0.015 m
+147.006 0.592 147.142 1.048 147.417 1.382 c
+147.7 1.723 148.071 1.897 148.534 1.897 c
+148.993 1.897 149.361 1.727 149.637 1.397 c
+149.92 1.073 150.067 0.625 150.078 0.059 c
+150.078 -0.367 l
+150.078 -0.937 149.934 -1.392 149.651 -1.734 c
+149.375 -2.069 149.008 -2.234 148.549 -2.234 c
+148.086 -2.234 147.715 -2.072 147.432 -1.749 c
+147.156 -1.419 147.013 -0.977 147.006 -0.426 c
+h
+147.652 -0.367 m
+147.652 -0.771 147.729 -1.087 147.887 -1.323 c
+148.053 -1.558 148.274 -1.675 148.549 -1.675 c
+149.115 -1.675 149.409 -1.263 149.431 -0.44 c
+149.431 0.015 l
+149.431 0.416 149.346 0.736 149.181 0.971 c
+149.023 1.213 148.806 1.338 148.534 1.338 c
+148.27 1.338 148.053 1.213 147.887 0.971 c
+147.729 0.736 147.652 0.416 147.652 0.015 c
+h
+154.678 -2.161 m
+154.638 -2.072 154.612 -1.926 154.605 -1.72 c
+154.37 -2.065 154.076 -2.234 153.723 -2.234 c
+153.359 -2.234 153.076 -2.138 152.87 -1.94 c
+152.672 -1.734 152.577 -1.448 152.577 -1.072 c
+152.577 -0.673 152.712 -0.353 152.988 -0.118 c
+153.26 0.125 153.635 0.25 154.105 0.25 c
+154.59 0.25 l
+154.59 0.676 l
+154.59 0.912 154.535 1.077 154.429 1.176 c
+154.318 1.283 154.157 1.338 153.944 1.338 c
+153.745 1.338 153.583 1.279 153.458 1.162 c
+153.341 1.044 153.282 0.897 153.282 0.721 c
+152.635 0.721 l
+152.635 0.915 152.694 1.106 152.812 1.294 c
+152.937 1.478 153.099 1.625 153.296 1.735 c
+153.502 1.841 153.73 1.897 153.988 1.897 c
+154.389 1.897 154.693 1.794 154.899 1.588 c
+155.112 1.382 155.226 1.088 155.237 0.706 c
+155.237 -1.308 l
+155.237 -1.613 155.274 -1.878 155.355 -2.102 c
+155.355 -2.161 l
+h
+153.811 -1.646 m
+153.977 -1.646 154.127 -1.602 154.267 -1.514 c
+154.414 -1.425 154.52 -1.315 154.59 -1.176 c
+154.59 -0.235 l
+154.223 -0.235 l
+153.907 -0.235 153.664 -0.305 153.488 -0.44 c
+153.311 -0.569 153.223 -0.756 153.223 -0.999 c
+153.223 -1.227 153.267 -1.392 153.356 -1.499 c
+153.444 -1.598 153.595 -1.646 153.811 -1.646 c
+156.854 1.823 m
+156.868 1.382 l
+157.122 1.723 157.446 1.897 157.839 1.897 c
+158.545 1.897 158.901 1.426 158.912 0.485 c
+158.912 -2.161 l
+158.265 -2.161 l
+158.265 0.456 l
+158.265 0.769 158.21 0.989 158.104 1.118 c
+157.993 1.243 157.839 1.309 157.633 1.309 c
+157.475 1.309 157.328 1.253 157.192 1.147 c
+157.063 1.037 156.961 0.9 156.883 0.736 c
+156.883 -2.161 l
+156.236 -2.161 l
+156.236 1.823 l
+h
+160.97 -1.072 m
+161.69 1.823 l
+162.381 1.823 l
+161.088 -2.719 l
+160.988 -3.061 160.845 -3.322 160.661 -3.498 c
+160.484 -3.675 160.282 -3.763 160.058 -3.763 c
+159.97 -3.763 159.856 -3.74 159.721 -3.704 c
+159.721 -3.16 l
+159.867 -3.175 l
+160.051 -3.175 160.198 -3.131 160.309 -3.042 c
+160.415 -2.954 160.503 -2.796 160.573 -2.572 c
+160.691 -2.131 l
+159.529 1.823 l
+160.234 1.823 l
+h
+164.6 0.015 m
+164.6 0.592 164.737 1.048 165.012 1.382 c
+165.295 1.723 165.666 1.897 166.129 1.897 c
+166.588 1.897 166.956 1.727 167.232 1.397 c
+167.515 1.073 167.661 0.625 167.673 0.059 c
+167.673 -0.367 l
+167.673 -0.937 167.529 -1.392 167.247 -1.734 c
+166.971 -2.069 166.603 -2.234 166.144 -2.234 c
+165.681 -2.234 165.31 -2.072 165.026 -1.749 c
+164.751 -1.419 164.608 -0.977 164.6 -0.426 c
+h
+165.247 -0.367 m
+165.247 -0.771 165.325 -1.087 165.483 -1.323 c
+165.647 -1.558 165.868 -1.675 166.144 -1.675 c
+166.709 -1.675 167.004 -1.263 167.025 -0.44 c
+167.025 0.015 l
+167.025 0.416 166.941 0.736 166.776 0.971 c
+166.618 1.213 166.401 1.338 166.129 1.338 c
+165.865 1.338 165.647 1.213 165.483 0.971 c
+165.325 0.736 165.247 0.416 165.247 0.015 c
+h
+169.363 2.778 m
+169.363 1.823 l
+169.965 1.823 l
+169.965 1.294 l
+169.363 1.294 l
+169.363 -1.176 l
+169.363 -1.334 169.385 -1.452 169.437 -1.529 c
+169.495 -1.61 169.583 -1.646 169.701 -1.646 c
+169.789 -1.646 169.877 -1.631 169.965 -1.602 c
+169.965 -2.161 l
+169.819 -2.208 169.664 -2.234 169.51 -2.234 c
+169.252 -2.234 169.057 -2.142 168.922 -1.955 c
+168.782 -1.771 168.716 -1.51 168.716 -1.176 c
+168.716 1.294 l
+168.113 1.294 l
+168.113 1.823 l
+168.716 1.823 l
+168.716 2.778 l
+h
+171.376 1.411 m
+171.63 1.735 171.95 1.897 172.332 1.897 c
+173.038 1.897 173.394 1.426 173.405 0.485 c
+173.405 -2.161 l
+172.758 -2.161 l
+172.758 0.456 l
+172.758 0.769 172.703 0.989 172.596 1.118 c
+172.487 1.243 172.332 1.309 172.126 1.309 c
+171.968 1.309 171.821 1.253 171.685 1.147 c
+171.557 1.037 171.454 0.9 171.376 0.736 c
+171.376 -2.161 l
+170.73 -2.161 l
+170.73 3.484 l
+171.376 3.484 l
+h
+175.787 -2.234 m
+175.286 -2.234 174.904 -2.087 174.64 -1.793 c
+174.375 -1.499 174.243 -1.066 174.243 -0.484 c
+174.243 -0.014 l
+174.243 0.58 174.368 1.048 174.625 1.382 c
+174.89 1.723 175.249 1.897 175.713 1.897 c
+176.172 1.897 176.514 1.742 176.741 1.441 c
+176.977 1.147 177.098 0.684 177.109 0.059 c
+177.109 -0.367 l
+174.89 -0.367 l
+174.89 -0.455 l
+174.89 -0.889 174.967 -1.201 175.125 -1.396 c
+175.29 -1.583 175.521 -1.675 175.816 -1.675 c
+176.01 -1.675 176.184 -1.643 176.33 -1.573 c
+176.477 -1.496 176.613 -1.378 176.741 -1.22 c
+177.08 -1.631 l
+176.793 -2.036 176.363 -2.234 175.787 -2.234 c
+175.713 1.338 m
+175.438 1.338 175.235 1.243 175.11 1.058 c
+174.981 0.871 174.908 0.58 174.89 0.191 c
+176.462 0.191 l
+176.462 0.279 l
+176.44 0.661 176.375 0.93 176.257 1.088 c
+176.139 1.253 175.955 1.338 175.713 1.338 c
+179.534 1.206 m
+179.446 1.224 179.347 1.235 179.241 1.235 c
+178.906 1.235 178.671 1.051 178.535 0.691 c
+178.535 -2.161 l
+177.888 -2.161 l
+177.888 1.823 l
+178.52 1.823 l
+178.535 1.411 l
+178.711 1.735 178.954 1.897 179.27 1.897 c
+179.376 1.897 179.465 1.874 179.534 1.837 c
+h
+179.77 -1.808 m
+179.77 -1.691 179.803 -1.595 179.872 -1.514 c
+179.939 -1.437 180.042 -1.396 180.182 -1.396 c
+180.328 -1.396 180.435 -1.437 180.504 -1.514 c
+180.582 -1.595 180.622 -1.691 180.622 -1.808 c
+180.622 -1.918 180.582 -2.009 180.504 -2.087 c
+180.435 -2.165 180.328 -2.204 180.182 -2.204 c
+180.042 -2.204 179.939 -2.165 179.872 -2.087 c
+179.803 -2.009 179.77 -1.918 179.77 -1.808 c
+f
+Q
+730.676 99.115 -1.794 0.867 re
+731.587 97.247 m
+731.587 102.598 l
+733.013 102.598 l
+733.63 102.598 734.123 102.396 734.497 101.995 c
+734.869 101.602 735.06 101.062 735.071 100.379 c
+735.071 99.512 l
+735.071 98.806 734.883 98.251 734.512 97.85 c
+734.137 97.446 733.63 97.247 732.984 97.247 c
+h
+732.675 101.702 m
+732.675 98.145 l
+732.998 98.145 l
+733.358 98.145 733.616 98.236 733.763 98.423 c
+733.909 98.618 733.983 98.945 733.983 99.408 c
+733.983 100.349 l
+733.983 100.849 733.913 101.195 733.778 101.393 c
+733.637 101.588 733.402 101.69 733.072 101.702 c
+h
+f
+738.32 97.247 -0.647 3.984 re
+738.364 102.275 m
+738.364 102.164 738.334 102.072 738.275 101.995 c
+738.216 101.926 738.121 101.893 737.996 101.893 c
+737.878 101.893 737.782 101.926 737.716 101.995 c
+737.658 102.072 737.628 102.164 737.628 102.275 c
+737.628 102.392 737.658 102.484 737.716 102.554 c
+737.782 102.631 737.878 102.672 737.996 102.672 c
+738.121 102.672 738.216 102.631 738.275 102.554 c
+738.334 102.473 738.364 102.381 738.364 102.275 c
+739.951 101.231 m
+739.966 100.79 l
+740.219 101.132 740.542 101.305 740.936 101.305 c
+741.641 101.305 741.998 100.834 742.009 99.894 c
+742.009 97.247 l
+741.362 97.247 l
+741.362 99.864 l
+741.362 100.177 741.307 100.397 741.2 100.526 c
+741.09 100.651 740.936 100.717 740.73 100.717 c
+740.572 100.717 740.425 100.661 740.288 100.555 c
+740.161 100.445 740.057 100.308 739.98 100.144 c
+739.98 97.247 l
+739.334 97.247 l
+739.334 101.231 l
+h
+744.919 98.262 m
+744.919 98.409 744.864 98.53 744.757 98.629 c
+744.647 98.725 744.442 98.843 744.14 98.982 c
+743.795 99.129 743.552 99.25 743.405 99.35 c
+743.258 99.456 743.148 99.574 743.081 99.703 c
+743.012 99.828 742.979 99.986 742.979 100.173 c
+742.979 100.497 743.097 100.765 743.332 100.981 c
+743.567 101.195 743.868 101.305 744.243 101.305 c
+744.625 101.305 744.934 101.191 745.169 100.967 c
+745.404 100.738 745.522 100.452 745.522 100.1 c
+744.875 100.1 l
+744.875 100.275 744.816 100.426 744.699 100.555 c
+744.581 100.68 744.427 100.746 744.243 100.746 c
+744.045 100.746 743.894 100.691 743.787 100.584 c
+743.677 100.485 743.625 100.353 743.625 100.187 c
+743.625 100.059 743.662 99.952 743.743 99.864 c
+743.82 99.783 744.011 99.68 744.317 99.556 c
+744.795 99.368 745.125 99.18 745.302 98.997 c
+745.478 98.82 745.566 98.592 745.566 98.321 c
+745.566 97.968 745.441 97.688 745.198 97.482 c
+744.963 97.277 744.647 97.174 744.257 97.174 c
+743.835 97.174 743.497 97.291 743.243 97.527 c
+742.987 97.769 742.861 98.074 742.861 98.438 c
+743.508 98.438 l
+743.515 98.211 743.585 98.034 743.714 97.91 c
+743.839 97.792 744.022 97.733 744.257 97.733 c
+744.471 97.733 744.633 97.781 744.743 97.879 c
+744.86 97.975 744.919 98.104 744.919 98.262 c
+747.257 102.186 m
+747.257 101.231 l
+747.859 101.231 l
+747.859 100.702 l
+747.257 100.702 l
+747.257 98.232 l
+747.257 98.074 747.278 97.957 747.33 97.879 c
+747.388 97.799 747.477 97.762 747.594 97.762 c
+747.683 97.762 747.771 97.777 747.859 97.806 c
+747.859 97.247 l
+747.712 97.2 747.557 97.174 747.403 97.174 c
+747.146 97.174 746.952 97.266 746.815 97.453 c
+746.676 97.637 746.609 97.898 746.609 98.232 c
+746.609 100.702 l
+746.007 100.702 l
+746.007 101.231 l
+746.609 101.231 l
+746.609 102.186 l
+h
+750.049 97.174 m
+749.549 97.174 749.167 97.322 748.903 97.615 c
+748.638 97.91 748.506 98.342 748.506 98.924 c
+748.506 99.394 l
+748.506 99.989 748.631 100.456 748.888 100.79 c
+749.152 101.132 749.512 101.305 749.975 101.305 c
+750.435 101.305 750.777 101.15 751.004 100.849 c
+751.24 100.555 751.361 100.092 751.372 99.467 c
+751.372 99.041 l
+749.152 99.041 l
+749.152 98.953 l
+749.152 98.519 749.229 98.207 749.387 98.012 c
+749.553 97.825 749.784 97.733 750.079 97.733 c
+750.273 97.733 750.446 97.766 750.593 97.835 c
+750.74 97.912 750.876 98.03 751.004 98.188 c
+751.342 97.777 l
+751.056 97.372 750.626 97.174 750.049 97.174 c
+749.975 100.746 m
+749.7 100.746 749.498 100.651 749.373 100.466 c
+749.244 100.279 749.171 99.989 749.152 99.599 c
+750.725 99.599 l
+750.725 99.688 l
+750.703 100.069 750.637 100.339 750.519 100.497 c
+750.401 100.661 750.218 100.746 749.975 100.746 c
+754.194 97.247 m
+754.154 97.336 754.128 97.482 754.121 97.688 c
+753.886 97.343 753.591 97.174 753.239 97.174 c
+752.875 97.174 752.592 97.27 752.386 97.468 c
+752.188 97.674 752.092 97.96 752.092 98.336 c
+752.092 98.735 752.228 99.055 752.504 99.291 c
+752.776 99.533 753.15 99.658 753.621 99.658 c
+754.106 99.658 l
+754.106 100.085 l
+754.106 100.32 754.051 100.485 753.944 100.584 c
+753.834 100.691 753.672 100.746 753.459 100.746 c
+753.261 100.746 753.099 100.688 752.974 100.57 c
+752.857 100.452 752.797 100.305 752.797 100.129 c
+752.151 100.129 l
+752.151 100.323 752.209 100.514 752.327 100.702 c
+752.452 100.886 752.614 101.033 752.813 101.143 c
+753.019 101.249 753.246 101.305 753.503 101.305 c
+753.904 101.305 754.209 101.202 754.415 100.996 c
+754.628 100.79 754.742 100.497 754.752 100.114 c
+754.752 98.1 l
+754.752 97.795 754.79 97.53 754.87 97.307 c
+754.87 97.247 l
+h
+753.327 97.762 m
+753.493 97.762 753.643 97.806 753.782 97.894 c
+753.929 97.983 754.036 98.093 754.106 98.232 c
+754.106 99.173 l
+753.738 99.173 l
+753.422 99.173 753.18 99.103 753.003 98.968 c
+752.828 98.839 752.739 98.652 752.739 98.409 c
+752.739 98.181 752.783 98.016 752.871 97.91 c
+752.959 97.81 753.11 97.762 753.327 97.762 c
+755.62 99.423 m
+755.62 100.029 755.731 100.497 755.958 100.819 c
+756.194 101.143 756.52 101.305 756.943 101.305 c
+757.325 101.305 757.622 101.147 757.84 100.834 c
+757.84 102.892 l
+758.486 102.892 l
+758.486 97.247 l
+757.898 97.247 l
+757.854 97.674 l
+757.649 97.339 757.343 97.174 756.943 97.174 c
+756.531 97.174 756.208 97.328 755.972 97.644 c
+755.737 97.968 755.62 98.423 755.62 99.011 c
+h
+756.267 99.041 m
+756.267 98.6 756.329 98.269 756.458 98.056 c
+756.594 97.85 756.814 97.748 757.119 97.748 c
+757.443 97.748 757.682 97.91 757.84 98.232 c
+757.84 100.246 l
+757.67 100.559 757.432 100.717 757.119 100.717 c
+756.814 100.717 756.594 100.614 756.458 100.408 c
+756.329 100.202 756.267 99.878 756.267 99.438 c
+h
+761.073 99.423 m
+761.073 100 761.21 100.456 761.485 100.79 c
+761.768 101.132 762.139 101.305 762.602 101.305 c
+763.061 101.305 763.429 101.135 763.704 100.805 c
+763.988 100.482 764.134 100.033 764.146 99.467 c
+764.146 99.041 l
+764.146 98.471 764.002 98.016 763.719 97.674 c
+763.444 97.339 763.076 97.174 762.617 97.174 c
+762.154 97.174 761.782 97.336 761.499 97.659 c
+761.224 97.989 761.081 98.431 761.073 98.982 c
+h
+761.72 99.041 m
+761.72 98.637 761.797 98.321 761.956 98.085 c
+762.12 97.85 762.341 97.733 762.617 97.733 c
+763.182 97.733 763.477 98.145 763.498 98.968 c
+763.498 99.423 l
+763.498 99.824 763.415 100.144 763.249 100.379 c
+763.091 100.621 762.874 100.746 762.602 100.746 c
+762.338 100.746 762.12 100.621 761.956 100.379 c
+761.797 100.144 761.72 99.824 761.72 99.423 c
+h
+765.277 97.247 m
+765.277 100.702 l
+764.748 100.702 l
+764.748 101.231 l
+765.277 101.231 l
+765.277 101.687 l
+765.277 102.087 765.373 102.4 765.571 102.627 c
+765.777 102.851 766.056 102.966 766.409 102.966 c
+766.545 102.966 766.677 102.943 766.806 102.907 c
+766.777 102.363 l
+766.677 102.381 766.578 102.392 766.482 102.392 c
+766.108 102.392 765.924 102.128 765.924 101.598 c
+765.924 101.231 l
+766.6 101.231 l
+766.6 100.702 l
+765.924 100.702 l
+765.924 97.247 l
+h
+f
+714.551 89.707 -1.793 0.867 re
+715.271 89.957 m
+715.271 90.604 715.378 91.089 715.594 91.412 c
+715.819 91.735 716.142 91.897 716.565 91.897 c
+716.877 91.897 717.13 91.765 717.329 91.5 c
+717.329 93.484 l
+718.387 93.484 l
+718.387 87.84 l
+717.432 87.84 l
+717.388 88.252 l
+717.171 87.928 716.895 87.766 716.565 87.766 c
+716.153 87.766 715.833 87.921 715.609 88.237 c
+715.393 88.56 715.279 89.031 715.271 89.648 c
+h
+716.315 89.692 m
+716.315 89.299 716.351 89.023 716.432 88.869 c
+716.521 88.711 716.667 88.634 716.873 88.634 c
+717.079 88.634 717.23 88.726 717.329 88.913 c
+717.329 90.721 l
+717.23 90.916 717.079 91.015 716.873 91.015 c
+716.675 91.015 716.535 90.934 716.447 90.78 c
+716.359 90.633 716.315 90.361 716.315 89.972 c
+h
+f
+q 1 0 0 1 721.2686 87.8399 cm
+0 0 m
+0 3.454 l
+-0.53 3.454 l
+-0.53 3.984 l
+0 3.984 l
+0 4.439 l
+0 4.84 0.095 5.152 0.293 5.38 c
+0.5 5.604 0.779 5.719 1.132 5.719 c
+1.267 5.719 1.4 5.696 1.529 5.659 c
+1.499 5.116 l
+1.4 5.134 1.301 5.145 1.205 5.145 c
+0.831 5.145 0.646 4.881 0.646 4.351 c
+0.646 3.984 l
+1.323 3.984 l
+1.323 3.454 l
+0.646 3.454 l
+0.646 0 l
+h
+1.955 2.176 m
+1.955 2.753 2.09 3.209 2.366 3.543 c
+2.649 3.884 3.021 4.057 3.484 4.057 c
+3.943 4.057 4.31 3.888 4.586 3.558 c
+4.868 3.234 5.016 2.786 5.026 2.22 c
+5.026 1.794 l
+5.026 1.224 4.883 0.769 4.6 0.427 c
+4.325 0.092 3.958 -0.073 3.498 -0.073 c
+3.035 -0.073 2.664 0.088 2.381 0.412 c
+2.105 0.742 1.962 1.183 1.955 1.735 c
+h
+2.601 1.794 m
+2.601 1.389 2.678 1.073 2.836 0.838 c
+3.002 0.603 3.222 0.485 3.498 0.485 c
+4.064 0.485 4.358 0.897 4.38 1.721 c
+4.38 2.176 l
+4.38 2.577 4.295 2.897 4.13 3.132 c
+3.972 3.373 3.755 3.499 3.484 3.499 c
+3.219 3.499 3.002 3.373 2.836 3.132 c
+2.678 2.897 2.601 2.577 2.601 2.176 c
+h
+7.511 3.367 m
+7.422 3.385 7.324 3.396 7.217 3.396 c
+6.882 3.396 6.647 3.212 6.512 2.852 c
+6.512 0 l
+5.865 0 l
+5.865 3.984 l
+6.497 3.984 l
+6.512 3.572 l
+6.688 3.896 6.93 4.057 7.247 4.057 c
+7.353 4.057 7.441 4.035 7.511 3.998 c
+h
+9.466 0.485 m
+9.679 0.485 9.851 0.548 9.98 0.676 c
+10.117 0.813 10.19 1.004 10.2 1.25 c
+10.818 1.25 l
+10.796 0.867 10.66 0.548 10.406 0.294 c
+10.15 0.048 9.837 -0.073 9.466 -0.073 c
+8.974 -0.073 8.598 0.077 8.334 0.383 c
+8.077 0.695 7.952 1.162 7.952 1.779 c
+7.952 2.22 l
+7.952 2.816 8.077 3.271 8.334 3.587 c
+8.598 3.899 8.974 4.057 9.466 4.057 c
+9.866 4.057 10.186 3.925 10.422 3.66 c
+10.664 3.404 10.796 3.057 10.818 2.617 c
+10.2 2.617 l
+10.179 2.911 10.105 3.132 9.98 3.278 c
+9.863 3.425 9.69 3.499 9.466 3.499 c
+9.172 3.499 8.955 3.4 8.819 3.205 c
+8.679 3.017 8.606 2.708 8.598 2.278 c
+8.598 1.764 l
+8.598 1.294 8.665 0.96 8.804 0.765 c
+8.951 0.578 9.172 0.485 9.466 0.485 c
+12.993 -0.073 m
+12.494 -0.073 12.112 0.074 11.847 0.368 c
+11.582 0.662 11.451 1.095 11.451 1.676 c
+11.451 2.147 l
+11.451 2.741 11.575 3.209 11.833 3.543 c
+12.097 3.884 12.457 4.057 12.92 4.057 c
+13.379 4.057 13.722 3.903 13.949 3.602 c
+14.184 3.308 14.306 2.845 14.316 2.22 c
+14.316 1.794 l
+12.097 1.794 l
+12.097 1.706 l
+12.097 1.272 12.174 0.96 12.332 0.765 c
+12.498 0.578 12.729 0.485 13.023 0.485 c
+13.218 0.485 13.39 0.518 13.537 0.588 c
+13.685 0.665 13.82 0.783 13.949 0.941 c
+14.287 0.53 l
+14.001 0.125 13.57 -0.073 12.993 -0.073 c
+12.92 3.499 m
+12.644 3.499 12.442 3.404 12.317 3.219 c
+12.189 3.032 12.116 2.741 12.097 2.352 c
+13.67 2.352 l
+13.67 2.44 l
+13.648 2.822 13.581 3.091 13.464 3.249 c
+13.346 3.414 13.163 3.499 12.92 3.499 c
+17.036 1.015 m
+17.036 1.162 16.981 1.283 16.874 1.382 c
+16.764 1.478 16.558 1.595 16.257 1.735 c
+15.912 1.881 15.669 2.003 15.522 2.103 c
+15.374 2.209 15.264 2.326 15.199 2.455 c
+15.129 2.58 15.096 2.738 15.096 2.926 c
+15.096 3.249 15.214 3.517 15.449 3.734 c
+15.684 3.947 15.985 4.057 16.359 4.057 c
+16.742 4.057 17.051 3.944 17.286 3.72 c
+17.521 3.491 17.639 3.205 17.639 2.852 c
+16.992 2.852 l
+16.992 3.028 16.933 3.179 16.816 3.308 c
+16.698 3.433 16.544 3.499 16.359 3.499 c
+16.161 3.499 16.01 3.444 15.904 3.337 c
+15.794 3.238 15.742 3.105 15.742 2.94 c
+15.742 2.812 15.779 2.705 15.86 2.617 c
+15.937 2.536 16.128 2.433 16.433 2.309 c
+16.911 2.12 17.242 1.933 17.418 1.75 c
+17.595 1.573 17.683 1.345 17.683 1.073 c
+17.683 0.721 17.558 0.441 17.315 0.235 c
+17.08 0.03 16.764 -0.073 16.375 -0.073 c
+15.952 -0.073 15.613 0.044 15.36 0.279 c
+15.103 0.522 14.978 0.827 14.978 1.191 c
+15.625 1.191 l
+15.632 0.963 15.702 0.786 15.831 0.662 c
+15.956 0.545 16.139 0.485 16.375 0.485 c
+16.588 0.485 16.749 0.533 16.86 0.632 c
+16.978 0.728 17.036 0.857 17.036 1.015 c
+20.108 2.176 m
+20.108 2.782 20.218 3.249 20.446 3.572 c
+20.681 3.896 21.009 4.057 21.431 4.057 c
+21.813 4.057 22.111 3.899 22.327 3.587 c
+22.327 5.644 l
+22.975 5.644 l
+22.975 0 l
+22.387 0 l
+22.343 0.427 l
+22.137 0.092 21.832 -0.073 21.431 -0.073 c
+21.019 -0.073 20.696 0.081 20.461 0.397 c
+20.226 0.721 20.108 1.176 20.108 1.764 c
+h
+20.755 1.794 m
+20.755 1.353 20.818 1.022 20.945 0.809 c
+21.082 0.603 21.302 0.5 21.607 0.5 c
+21.93 0.5 22.169 0.662 22.327 0.985 c
+22.327 2.999 l
+22.158 3.311 21.92 3.469 21.607 3.469 c
+21.302 3.469 21.082 3.367 20.945 3.161 c
+20.818 2.955 20.755 2.631 20.755 2.191 c
+h
+25.4 -0.073 m
+24.899 -0.073 24.518 0.074 24.253 0.368 c
+23.989 0.662 23.856 1.095 23.856 1.676 c
+23.856 2.147 l
+23.856 2.741 23.981 3.209 24.238 3.543 c
+24.503 3.884 24.863 4.057 25.327 4.057 c
+25.786 4.057 26.127 3.903 26.355 3.602 c
+26.59 3.308 26.711 2.845 26.723 2.22 c
+26.723 1.794 l
+24.503 1.794 l
+24.503 1.706 l
+24.503 1.272 24.581 0.96 24.739 0.765 c
+24.903 0.578 25.135 0.485 25.429 0.485 c
+25.624 0.485 25.797 0.518 25.944 0.588 c
+26.09 0.665 26.227 0.783 26.355 0.941 c
+26.693 0.53 l
+26.406 0.125 25.977 -0.073 25.4 -0.073 c
+25.327 3.499 m
+25.051 3.499 24.849 3.404 24.724 3.219 c
+24.595 3.032 24.521 2.741 24.503 2.352 c
+26.075 2.352 l
+26.075 2.44 l
+26.054 2.822 25.988 3.091 25.87 3.249 c
+25.753 3.414 25.568 3.499 25.327 3.499 c
+28.207 0 -0.646 5.644 re
+30.647 -0.073 m
+30.148 -0.073 29.765 0.074 29.501 0.368 c
+29.236 0.662 29.104 1.095 29.104 1.676 c
+29.104 2.147 l
+29.104 2.741 29.229 3.209 29.486 3.543 c
+29.751 3.884 30.111 4.057 30.574 4.057 c
+31.033 4.057 31.375 3.903 31.602 3.602 c
+31.837 3.308 31.959 2.845 31.97 2.22 c
+31.97 1.794 l
+29.751 1.794 l
+29.751 1.706 l
+29.751 1.272 29.828 0.96 29.986 0.765 c
+30.152 0.578 30.383 0.485 30.677 0.485 c
+30.871 0.485 31.044 0.518 31.191 0.588 c
+31.338 0.665 31.474 0.783 31.602 0.941 c
+31.941 0.53 l
+31.654 0.125 31.224 -0.073 30.647 -0.073 c
+30.574 3.499 m
+30.298 3.499 30.096 3.404 29.971 3.219 c
+29.842 3.032 29.769 2.741 29.751 2.352 c
+31.324 2.352 l
+31.324 2.44 l
+31.301 2.822 31.235 3.091 31.118 3.249 c
+31 3.414 30.817 3.499 30.574 3.499 c
+33.601 4.939 m
+33.601 3.984 l
+34.204 3.984 l
+34.204 3.454 l
+33.601 3.454 l
+33.601 0.985 l
+33.601 0.827 33.624 0.709 33.676 0.632 c
+33.734 0.551 33.822 0.515 33.94 0.515 c
+34.028 0.515 34.116 0.53 34.204 0.559 c
+34.204 0 l
+34.058 -0.047 33.903 -0.073 33.749 -0.073 c
+33.491 -0.073 33.297 0.019 33.161 0.206 c
+33.021 0.389 32.955 0.651 32.955 0.985 c
+32.955 3.454 l
+32.352 3.454 l
+32.352 3.984 l
+32.955 3.984 l
+32.955 4.939 l
+h
+35.675 0 -0.647 3.984 re
+35.718 5.027 m
+35.718 4.917 35.689 4.825 35.63 4.748 c
+35.571 4.678 35.476 4.645 35.351 4.645 c
+35.234 4.645 35.138 4.678 35.072 4.748 c
+35.012 4.825 34.983 4.917 34.983 5.027 c
+34.983 5.145 35.012 5.237 35.072 5.307 c
+35.138 5.384 35.234 5.424 35.351 5.424 c
+35.476 5.424 35.571 5.384 35.63 5.307 c
+35.689 5.226 35.718 5.134 35.718 5.027 c
+36.556 2.176 m
+36.556 2.753 36.693 3.209 36.968 3.543 c
+37.25 3.884 37.622 4.057 38.085 4.057 c
+38.544 4.057 38.912 3.888 39.187 3.558 c
+39.471 3.234 39.617 2.786 39.629 2.22 c
+39.629 1.794 l
+39.629 1.224 39.485 0.769 39.202 0.427 c
+38.927 0.092 38.559 -0.073 38.1 -0.073 c
+37.637 -0.073 37.266 0.088 36.982 0.412 c
+36.707 0.742 36.564 1.183 36.556 1.735 c
+h
+37.203 1.794 m
+37.203 1.389 37.281 1.073 37.439 0.838 c
+37.603 0.603 37.824 0.485 38.1 0.485 c
+38.665 0.485 38.96 0.897 38.981 1.721 c
+38.981 2.176 l
+38.981 2.577 38.897 2.897 38.732 3.132 c
+38.574 3.373 38.357 3.499 38.085 3.499 c
+37.821 3.499 37.603 3.373 37.439 3.132 c
+37.281 2.897 37.203 2.577 37.203 2.176 c
+h
+41.084 3.984 m
+41.098 3.543 l
+41.352 3.884 41.676 4.057 42.068 4.057 c
+42.773 4.057 43.13 3.587 43.141 2.646 c
+43.141 0 l
+42.495 0 l
+42.495 2.617 l
+42.495 2.929 42.44 3.15 42.333 3.278 c
+42.223 3.404 42.068 3.469 41.863 3.469 c
+41.705 3.469 41.557 3.414 41.422 3.308 c
+41.293 3.198 41.19 3.061 41.113 2.897 c
+41.113 0 l
+40.466 0 l
+40.466 3.984 l
+h
+44.155 0.353 m
+44.155 0.47 44.188 0.566 44.259 0.647 c
+44.325 0.724 44.427 0.765 44.568 0.765 c
+44.714 0.765 44.821 0.724 44.89 0.647 c
+44.968 0.566 45.008 0.47 45.008 0.353 c
+45.008 0.243 44.968 0.151 44.89 0.074 c
+44.821 -0.004 44.714 -0.043 44.568 -0.043 c
+44.427 -0.043 44.325 -0.004 44.259 0.074 c
+44.188 0.151 44.155 0.243 44.155 0.353 c
+f
+Q
+ endstream endobj 295 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 297 0 obj <</BBox[325.823 554.164 757.387 480.746]/Group 298 0 R/Length 128/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>/Shading<</Sh0 64 0 R>>>>/Subtype/Form>>stream
+q
+325.823 554.164 431.564 -73.418 re
+W n
+q
+0 g
+/GS0 gs
+431.5641174 0 0 431.5641174 325.8230896 517.4552612 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 298 0 obj <</I false/K false/S/Transparency/Type/Group>> endobj 296 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 299 0 R/Type/ExtGState/ca 1.0/op false>> endobj 299 0 obj <</BC 300 0 R/G 301 0 R/S/Luminosity/Type/Mask>> endobj 300 0 obj [0.0] endobj 301 0 obj <</BBox[325.823 554.164 757.387 480.746]/Group 302 0 R/Length 92/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 12 0 R>>/XObject<</Fm0 303 0 R>>>>/Subtype/Form>>stream
+0 g
+/GS0 gs
+325.823 554.164 431.564 -73.418 re
+f
+q
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 TL/Fm0 Do
+Q
+ endstream endobj 302 0 obj <</CS/DeviceGray/I false/K false/S/Transparency/Type/Group>> endobj 303 0 obj <</BBox[325.823 554.164 757.388 480.746]/Group 304 0 R/Length 128/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 113 0 R>>/ExtGState<</GS0 12 0 R>>/Shading<</Sh0 127 0 R>>>>/Subtype/Form>>stream
+q
+325.823 554.164 431.564 -73.418 re
+W n
+q
+0 g
+/GS0 gs
+431.5641174 0 0 431.5641174 325.8227539 517.4550781 cm
+BX /Sh0 sh EX Q
+Q
+ endstream endobj 304 0 obj <</CS/DeviceCMYK/I true/K false/S/Transparency/Type/Group>> endobj 6 0 obj [5 0 R] endobj 305 0 obj <</CreationDate(D:20161031172420Z)/Creator(Adobe Illustrator CC 2015.3 \(Macintosh\))/ModDate(D:20161031172420Z)/Producer(Adobe PDF library 15.00)/Title(Untitled-2)>> endobj xref 0 306 0000000000 65535 f
+0000000016 00000 n
+0000000144 00000 n
+0000052539 00000 n
+0000000000 00000 f
+0001829223 00000 n
+0007345734 00000 n
+0000052596 00000 n
+0000052949 00000 n
+0005664025 00000 n
+0005664166 00000 n
+0001829413 00000 n
+0001821855 00000 n
+0005665528 00000 n
+0005664232 00000 n
+0000053303 00000 n
+0000053445 00000 n
+0000055549 00000 n
+0000053511 00000 n
+0000054988 00000 n
+0000055036 00000 n
+0001577808 00000 n
+0001825132 00000 n
+0001825248 00000 n
+0001825363 00000 n
+0001825486 00000 n
+0001825609 00000 n
+0001825732 00000 n
+0001577870 00000 n
+0001578205 00000 n
+0001578681 00000 n
+0001584621 00000 n
+0001596870 00000 n
+0001602617 00000 n
+0001616838 00000 n
+0001627887 00000 n
+0001628196 00000 n
+0001637380 00000 n
+0001647988 00000 n
+0001657309 00000 n
+0001660863 00000 n
+0001666195 00000 n
+0001669141 00000 n
+0001670268 00000 n
+0001679870 00000 n
+0001684168 00000 n
+0001688506 00000 n
+0001700981 00000 n
+0001705017 00000 n
+0001710819 00000 n
+0001717241 00000 n
+0001731952 00000 n
+0001741049 00000 n
+0001758297 00000 n
+0001772218 00000 n
+0001777518 00000 n
+0001777876 00000 n
+0001779807 00000 n
+0001786388 00000 n
+0001792684 00000 n
+0001803132 00000 n
+0001809040 00000 n
+0001814611 00000 n
+0001824567 00000 n
+0001824630 00000 n
+0001824504 00000 n
+0001824441 00000 n
+0001824378 00000 n
+0001824315 00000 n
+0001824252 00000 n
+0001824189 00000 n
+0001824126 00000 n
+0001824063 00000 n
+0001824000 00000 n
+0001823937 00000 n
+0001823874 00000 n
+0001823811 00000 n
+0001823748 00000 n
+0001823685 00000 n
+0001823622 00000 n
+0001823559 00000 n
+0001823496 00000 n
+0001823433 00000 n
+0001823370 00000 n
+0001823307 00000 n
+0001823244 00000 n
+0001823181 00000 n
+0001823118 00000 n
+0001823055 00000 n
+0001822992 00000 n
+0001822929 00000 n
+0001822346 00000 n
+0001822553 00000 n
+0001822409 00000 n
+0001822283 00000 n
+0001822220 00000 n
+0001822157 00000 n
+0001822094 00000 n
+0001822031 00000 n
+0001821968 00000 n
+0001821791 00000 n
+0001822716 00000 n
+0001822854 00000 n
+0001824778 00000 n
+0001824894 00000 n
+0001825023 00000 n
+0001827884 00000 n
+0001825848 00000 n
+0001825914 00000 n
+0001825937 00000 n
+0001826264 00000 n
+0001826342 00000 n
+0001826705 00000 n
+0001826928 00000 n
+0001826782 00000 n
+0001826991 00000 n
+0001827358 00000 n
+0001827746 00000 n
+0001827129 00000 n
+0001827205 00000 n
+0001827282 00000 n
+0001827801 00000 n
+0001827950 00000 n
+0001827973 00000 n
+0001828275 00000 n
+0001828353 00000 n
+0001828719 00000 n
+0001828796 00000 n
+0001828942 00000 n
+0001829058 00000 n
+0001829138 00000 n
+0001829295 00000 n
+0001829327 00000 n
+0001829482 00000 n
+0001833966 00000 n
+0001835264 00000 n
+0001847598 00000 n
+0001877099 00000 n
+0001899615 00000 n
+0001922108 00000 n
+0001944924 00000 n
+0001967003 00000 n
+0001989331 00000 n
+0002012637 00000 n
+0002035364 00000 n
+0002056686 00000 n
+0002078809 00000 n
+0002101782 00000 n
+0002136210 00000 n
+0002158624 00000 n
+0002181711 00000 n
+0002204289 00000 n
+0002228492 00000 n
+0002250164 00000 n
+0002272697 00000 n
+0002294933 00000 n
+0002318562 00000 n
+0002339903 00000 n
+0002362514 00000 n
+0002426019 00000 n
+0002449289 00000 n
+0002471861 00000 n
+0002494425 00000 n
+0002516757 00000 n
+0002539012 00000 n
+0002561573 00000 n
+0002583980 00000 n
+0002607446 00000 n
+0002630408 00000 n
+0002653946 00000 n
+0002695995 00000 n
+0002718800 00000 n
+0002741052 00000 n
+0002763140 00000 n
+0002784387 00000 n
+0002806152 00000 n
+0002827702 00000 n
+0002849139 00000 n
+0002870613 00000 n
+0002891878 00000 n
+0002914033 00000 n
+0002956912 00000 n
+0002978248 00000 n
+0002999119 00000 n
+0003020747 00000 n
+0003042038 00000 n
+0003064132 00000 n
+0003086377 00000 n
+0003108223 00000 n
+0003130683 00000 n
+0003152299 00000 n
+0003170763 00000 n
+0003233578 00000 n
+0003255689 00000 n
+0003277269 00000 n
+0003299242 00000 n
+0003321203 00000 n
+0003342098 00000 n
+0003363411 00000 n
+0003386193 00000 n
+0003409378 00000 n
+0003432490 00000 n
+0003453518 00000 n
+0003495238 00000 n
+0003510301 00000 n
+0003567696 00000 n
+0003615863 00000 n
+0003650891 00000 n
+0003669632 00000 n
+0003673380 00000 n
+0003683855 00000 n
+0003704357 00000 n
+0003718623 00000 n
+0003733633 00000 n
+0003759731 00000 n
+0003784054 00000 n
+0003806935 00000 n
+0003829767 00000 n
+0003852352 00000 n
+0003876992 00000 n
+0003900151 00000 n
+0003922783 00000 n
+0003945034 00000 n
+0003968047 00000 n
+0003991391 00000 n
+0004015741 00000 n
+0004039233 00000 n
+0004062214 00000 n
+0004085294 00000 n
+0004107633 00000 n
+0004133573 00000 n
+0004156970 00000 n
+0004181160 00000 n
+0004205488 00000 n
+0004229069 00000 n
+0004252246 00000 n
+0004276651 00000 n
+0004300732 00000 n
+0004323009 00000 n
+0004346653 00000 n
+0004369083 00000 n
+0004398651 00000 n
+0004422686 00000 n
+0004445807 00000 n
+0004468467 00000 n
+0004490778 00000 n
+0004512245 00000 n
+0004535999 00000 n
+0004558483 00000 n
+0004582152 00000 n
+0004605460 00000 n
+0004628178 00000 n
+0004657082 00000 n
+0004679662 00000 n
+0004703617 00000 n
+0004726684 00000 n
+0004749769 00000 n
+0004772895 00000 n
+0004796243 00000 n
+0004818968 00000 n
+0004840801 00000 n
+0004864877 00000 n
+0004887603 00000 n
+0004916892 00000 n
+0004940435 00000 n
+0004962612 00000 n
+0004986831 00000 n
+0005010044 00000 n
+0005032928 00000 n
+0005056580 00000 n
+0005078840 00000 n
+0005102970 00000 n
+0005124736 00000 n
+0005148071 00000 n
+0005177059 00000 n
+0005200432 00000 n
+0005223606 00000 n
+0005246594 00000 n
+0005269811 00000 n
+0005292409 00000 n
+0005314358 00000 n
+0005337995 00000 n
+0005361090 00000 n
+0005383650 00000 n
+0005407255 00000 n
+0005436020 00000 n
+0005458512 00000 n
+0005482512 00000 n
+0005507899 00000 n
+0005530123 00000 n
+0005551770 00000 n
+0005574745 00000 n
+0005597605 00000 n
+0005619438 00000 n
+0005642322 00000 n
+0007344240 00000 n
+0007344705 00000 n
+0007344303 00000 n
+0007344641 00000 n
+0007344822 00000 n
+0007344888 00000 n
+0007344911 00000 n
+0007345213 00000 n
+0007345291 00000 n
+0007345657 00000 n
+0007345757 00000 n
+trailer <</Size 306/Root 1 0 R/Info 305 0 R/ID[<303169ECE1024C918EE9BAFAA71271A8><267E8E7C61CE467AA831715E34FC8183>]>> startxref 7345941 %%EOF \ No newline at end of file
diff --git a/spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml b/spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml
new file mode 100644
index 00000000000..0bab94a7c2e
--- /dev/null
+++ b/spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml
@@ -0,0 +1,10 @@
+before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+
+rspec:
+ script:
+ - bundle exec rspec
diff --git a/spec/fixtures/patchfiles/0001-A-commit-from-a-patch.patch b/spec/fixtures/patchfiles/0001-A-commit-from-a-patch.patch
new file mode 100644
index 00000000000..cc38682a0ab
--- /dev/null
+++ b/spec/fixtures/patchfiles/0001-A-commit-from-a-patch.patch
@@ -0,0 +1,19 @@
+From 3fee0042e610fb3563e4379e316704cb1210f3de Mon Sep 17 00:00:00 2001
+From: Patch User <patchuser@gitlab.org>
+Date: Thu, 18 Oct 2018 13:40:35 +0200
+Subject: [PATCH] A commit from a patch
+
+---
+ README | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/README b/README
+index 3742e48..e40a3b9 100644
+--- a/README
++++ b/README
+@@ -1 +1,3 @@
+ Sample repo for testing gitlab features
++
++This was applied in a patch!
+--
+2.19.1
diff --git a/spec/fixtures/patchfiles/0001-This-does-not-apply-to-the-feature-branch.patch b/spec/fixtures/patchfiles/0001-This-does-not-apply-to-the-feature-branch.patch
new file mode 100644
index 00000000000..905002ae898
--- /dev/null
+++ b/spec/fixtures/patchfiles/0001-This-does-not-apply-to-the-feature-branch.patch
@@ -0,0 +1,23 @@
+From 00c68c2b4f954370ce82a1162bc29c13f524897e Mon Sep 17 00:00:00 2001
+From: Patch User <patchuser@gitlab.org>
+Date: Mon, 22 Oct 2018 11:05:48 +0200
+Subject: [PATCH] This does not apply to the `feature` branch
+
+---
+ files/ruby/feature.rb | 5 +++++
+ 1 file changed, 5 insertions(+)
+ create mode 100644 files/ruby/feature.rb
+
+diff --git a/files/ruby/feature.rb b/files/ruby/feature.rb
+new file mode 100644
+index 0000000..fef26e4
+--- /dev/null
++++ b/files/ruby/feature.rb
+@@ -0,0 +1,5 @@
++class Feature
++ def bar
++ puts 'foo'
++ end
++end
+--
+2.19.1
diff --git a/spec/fixtures/security-reports/feature-branch.zip b/spec/fixtures/security-reports/feature-branch.zip
new file mode 100644
index 00000000000..730ce3dc5f8
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch.zip
Binary files differ
diff --git a/spec/fixtures/security-reports/feature-branch/gl-container-scanning-report.json b/spec/fixtures/security-reports/feature-branch/gl-container-scanning-report.json
new file mode 100644
index 00000000000..9840382df6f
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch/gl-container-scanning-report.json
@@ -0,0 +1,18 @@
+{
+ "image": "registry.gitlab.com/bikebilly/auto-devops-10-6/feature-branch:e7315ba964febb11bac8f5cd6ec433db8a3a1583",
+ "unapproved": [
+ "CVE-2017-15650"
+ ],
+ "vulnerabilities": [
+ {
+ "featurename": "musl",
+ "featureversion": "1.1.14-r15",
+ "vulnerability": "CVE-2017-15650",
+ "namespace": "alpine:v3.4",
+ "description": "",
+ "link": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-15650",
+ "severity": "Medium",
+ "fixedby": "1.1.14-r16"
+ }
+ ]
+}
diff --git a/spec/fixtures/security-reports/feature-branch/gl-dast-report.json b/spec/fixtures/security-reports/feature-branch/gl-dast-report.json
new file mode 100644
index 00000000000..3a308bf047e
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch/gl-dast-report.json
@@ -0,0 +1,40 @@
+{
+ "site": {
+ "alerts": [
+ {
+ "sourceid": "3",
+ "wascid": "15",
+ "cweid": "16",
+ "reference": "<p>http://msdn.microsoft.com/en-us/library/ie/gg622941%28v=vs.85%29.aspx</p><p>https://www.owasp.org/index.php/List_of_useful_HTTP_headers</p>",
+ "otherinfo": "<p>This issue still applies to error type pages (401, 403, 500, etc) as those pages are often still affected by injection issues, in which case there is still concern for browsers sniffing pages away from their actual content type.</p><p>At \"High\" threshold this scanner will not alert on client or server error responses.</p>",
+ "solution": "<p>Ensure that the application/web server sets the Content-Type header appropriately, and that it sets the X-Content-Type-Options header to 'nosniff' for all web pages.</p><p>If possible, ensure that the end user uses a standards-compliant and modern web browser that does not perform MIME-sniffing at all, or that can be directed by the web application/web server to not perform MIME-sniffing.</p>",
+ "count": "2",
+ "pluginid": "10021",
+ "alert": "X-Content-Type-Options Header Missing",
+ "name": "X-Content-Type-Options Header Missing",
+ "riskcode": "1",
+ "confidence": "2",
+ "riskdesc": "Low (Medium)",
+ "desc": "<p>The Anti-MIME-Sniffing header X-Content-Type-Options was not set to 'nosniff'. This allows older versions of Internet Explorer and Chrome to perform MIME-sniffing on the response body, potentially causing the response body to be interpreted and displayed as a content type other than the declared content type. Current (early 2014) and legacy versions of Firefox will use the declared content type (if one is set), rather than performing MIME-sniffing.</p>",
+ "instances": [
+ {
+ "param": "X-Content-Type-Options",
+ "method": "GET",
+ "uri": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io"
+ },
+ {
+ "param": "X-Content-Type-Options",
+ "method": "GET",
+ "uri": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io/"
+ }
+ ]
+ }
+ ],
+ "@ssl": "false",
+ "@port": "80",
+ "@host": "bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io",
+ "@name": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io"
+ },
+ "@generated": "Fri, 13 Apr 2018 09:22:01",
+ "@version": "2.7.0"
+}
diff --git a/spec/fixtures/security-reports/feature-branch/gl-dependency-scanning-report.json b/spec/fixtures/security-reports/feature-branch/gl-dependency-scanning-report.json
new file mode 100644
index 00000000000..4b47e259c0f
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch/gl-dependency-scanning-report.json
@@ -0,0 +1,46 @@
+[
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2012-4387",
+ "url": "http://struts.apache.org/docs/s2-011.html",
+ "message": "Long parameter name DoS for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ },
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2013-1966",
+ "url": "http://struts.apache.org/docs/s2-014.html",
+ "message": "Remote command execution due to flaw in the includeParams attribute of URL and Anchor tags for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ },
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2013-2115",
+ "url": "http://struts.apache.org/docs/s2-014.html",
+ "message": "Remote command execution due to flaw in the includeParams attribute of URL and Anchor tags for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ },
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2013-2134",
+ "url": "http://struts.apache.org/docs/s2-015.html",
+ "message": "Arbitrary OGNL code execution via unsanitized wildcard matching for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ }
+]
diff --git a/spec/fixtures/security-reports/feature-branch/gl-license-management-report.json b/spec/fixtures/security-reports/feature-branch/gl-license-management-report.json
new file mode 100644
index 00000000000..c1d20fa02fa
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch/gl-license-management-report.json
@@ -0,0 +1,242 @@
+{
+ "licenses": [
+ {
+ "count": 13,
+ "name": "MIT"
+ },
+ {
+ "count": 2,
+ "name": "New BSD"
+ },
+ {
+ "count": 1,
+ "name": "LGPL"
+ }
+ ],
+ "dependencies": [
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "bundler",
+ "url": "http://bundler.io",
+ "description": "The best way to manage your application's dependencies",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "concurrent-ruby",
+ "url": "http://www.concurrent-ruby.com",
+ "description": "Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "connection_pool",
+ "url": "https://github.com/mperham/connection_pool",
+ "description": "Generic connection pool for Ruby",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "mini_portile2",
+ "url": "http://github.com/flavorjones/mini_portile",
+ "description": "Simplistic port-like solution for developers",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "mustermann",
+ "url": "https://github.com/sinatra/mustermann",
+ "description": "Your personal string matching expert.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "nokogiri",
+ "url": "http://nokogiri.org",
+ "description": "Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "New BSD",
+ "url": "http://opensource.org/licenses/BSD-3-Clause"
+ },
+ "dependency": {
+ "name": "pg",
+ "url": "https://bitbucket.org/ged/ruby-pg",
+ "description": "Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "New BSD",
+ "url": "http://opensource.org/licenses/BSD-3-Clause"
+ },
+ "dependency": {
+ "name": "puma",
+ "url": "http://puma.io",
+ "description": "Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for Ruby/Rack applications",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "rack",
+ "url": "https://rack.github.io/",
+ "description": "a modular Ruby webserver interface",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "rack-protection",
+ "url": "http://github.com/sinatra/sinatra/tree/master/rack-protection",
+ "description": "Protect against typical web attacks, works with all Rack apps, including Rails.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "redis",
+ "url": "https://github.com/redis/redis-rb",
+ "description": "A Ruby client library for Redis",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "LGPL",
+ "url": "http://www.gnu.org/licenses/lgpl.txt"
+ },
+ "dependency": {
+ "name": "sidekiq",
+ "url": "http://sidekiq.org",
+ "description": "Simple, efficient background processing for Ruby",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "sinatra",
+ "url": "http://www.sinatrarb.com/",
+ "description": "Classy web-development dressed in a DSL",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "slim",
+ "url": "http://slim-lang.com/",
+ "description": "Slim is a template language.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "temple",
+ "url": "https://github.com/judofyr/temple",
+ "description": "Template compilation framework in Ruby",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "tilt",
+ "url": "http://github.com/rtomayko/tilt/",
+ "description": "Generic interface to multiple Ruby template engines",
+ "pathes": [
+ "."
+ ]
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/security-reports/feature-branch/gl-sast-report.json b/spec/fixtures/security-reports/feature-branch/gl-sast-report.json
new file mode 100644
index 00000000000..a85b9be8b5f
--- /dev/null
+++ b/spec/fixtures/security-reports/feature-branch/gl-sast-report.json
@@ -0,0 +1,944 @@
+[
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:52865813c884a507be1f152d654245af34aba8a391626d01f1ab6d3f52ec8779:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 1,
+ "end_line": 1
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 1,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "name": "Predictable pseudorandom number generator",
+ "message": "Predictable pseudorandom number generator",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:47:PREDICTABLE_RANDOM",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 47,
+ "end_line": 47,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "generateSecretToken2"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-PREDICTABLE_RANDOM",
+ "value": "PREDICTABLE_RANDOM",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 47,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "name": "Predictable pseudorandom number generator",
+ "message": "Predictable pseudorandom number generator",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:41:PREDICTABLE_RANDOM",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 41,
+ "end_line": 41,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "generateSecretToken1"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-PREDICTABLE_RANDOM",
+ "value": "PREDICTABLE_RANDOM",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 41,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:cb203b465dffb0cb3a8e8bd8910b84b93b0a5995a938e4b903dbb0cd6ffa1254:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 11,
+ "end_line": 11
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 11,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:a7173c43ae66bd07466632d819d450e0071e02dbf782763640d1092981f9631b:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 12,
+ "end_line": 12
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 12,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:017017b77deb0b8369b6065947833eeea752a92ec8a700db590fece3e934cf0d:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 13,
+ "end_line": 13
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 13,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:45fc8c53aea7b84f06bc4e590cc667678d6073c4c8a1d471177ca2146fb22db2:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 14,
+ "end_line": 14
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 14,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Pickle library appears to be in use, possible security issue.",
+ "cve": "python/imports/imports-aliases.py:5f200d47291e7bbd8352db23019b85453ca048dd98ea0c291260fa7d009963a4:B301",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 15,
+ "end_line": 15
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B301",
+ "value": "B301"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 15,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "name": "ECB mode is insecure",
+ "message": "ECB mode is insecure",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:29:ECB_MODE",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 29,
+ "end_line": 29,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "insecureCypher"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-ECB_MODE",
+ "value": "ECB_MODE",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#ECB_MODE"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 29,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#ECB_MODE",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "name": "Cipher with no integrity",
+ "message": "Cipher with no integrity",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:29:CIPHER_INTEGRITY",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 29,
+ "end_line": 29,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "insecureCypher"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-CIPHER_INTEGRITY",
+ "value": "CIPHER_INTEGRITY",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#CIPHER_INTEGRITY"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 29,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#CIPHER_INTEGRITY",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:63dd4d626855555b816985d82c4614a790462a0a3ada89dc58eb97f9c50f3077:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 14,
+ "end_line": 14
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 14,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:4ad6d4c40a8c263fc265f3384724014e0a4f8dd6200af83e51ff120420038031:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 10,
+ "end_line": 10
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 10,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-aliases.py:2c3e1fa1e54c3c6646e8bcfaee2518153c6799b77587ff8d9a7b0631f6d34785:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 1,
+ "end_line": 1
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 1,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports.py:af58d07f6ad519ef5287fcae65bf1a6999448a1a3a8bc1ac2a11daa80d0b96bf:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports.py",
+ "start_line": 2,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports.py",
+ "line": 2,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports.py:8de9bc98029d212db530785a5f6780cfa663548746ff228ab8fa96c5bb82f089:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports.py",
+ "start_line": 4,
+ "end_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports.py",
+ "line": 4,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:97c30f1d76d2a88913e3ce9ae74087874d740f87de8af697a9c455f01119f633:B106",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 22,
+ "end_line": 22
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B106",
+ "value": "B106",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b106_hardcoded_password_funcarg.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 22,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b106_hardcoded_password_funcarg.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'root'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:7431c73a0bc16d94ece2a2e75ef38f302574d42c37ac0c3c38ad0b3bf8a59f10:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 5,
+ "end_line": 5
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 5,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: ''",
+ "cve": "python/hardcoded/hardcoded-passwords.py:d2d1857c27caedd49c57bfbcdc23afcc92bd66a22701fcdc632869aab4ca73ee:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 9,
+ "end_line": 9
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 9,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'ajklawejrkl42348swfgkg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:fb3866215a61393a5c9c32a3b60e2058171a23219c353f722cbd3567acab21d2:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 13,
+ "end_line": 13
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 13,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:63c62a8b7e1e5224439bd26b28030585ac48741e28ca64561a6071080c560a5f:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 23,
+ "end_line": 23
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 23,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:4311b06d08df8fa58229b341c531da8e1a31ec4520597bdff920cd5c098d86f9:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 24,
+ "end_line": 24
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 24,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports-function.py:5858400c2f39047787702de44d03361ef8d954c9d14bd54ee1c2bef9e6a7df93:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-function.py",
+ "start_line": 4,
+ "end_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-function.py",
+ "line": 4,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports-function.py:dbda3cf4190279d30e0aad7dd137eca11272b0b225e8af4e8bf39682da67d956:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-function.py",
+ "start_line": 2,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-function.py",
+ "line": 2,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-from.py:eb8a0db9cd1a8c1ab39a77e6025021b1261cc2a0b026b2f4a11fca4e0636d8dd:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 7,
+ "end_line": 7
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 7,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "subprocess call with shell=True seems safe, but may be changed in the future, consider rewriting without shell",
+ "cve": "python/imports/imports-aliases.py:f99f9721e27537fbcb6699a4cf39c6740d6234d2c6f06cfc2d9ea977313c483d:B602",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 9,
+ "end_line": 9
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B602",
+ "value": "B602",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b602_subprocess_popen_with_shell_equals_true.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 9,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b602_subprocess_popen_with_shell_equals_true.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports-from.py:332a12ab1146698f614a905ce6a6a5401497a12281aef200e80522711c69dcf4:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 6,
+ "end_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 6,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-from.py:0a48de4a3d5348853a03666cb574697e3982998355e7a095a798bd02a5947276:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 1,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 1,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports-aliases.py:51b71661dff994bde3529639a727a678c8f5c4c96f00d300913f6d5be1bbdf26:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 7,
+ "end_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 7,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with loads module.",
+ "cve": "python/imports/imports-aliases.py:6ff02aeb3149c01ab68484d794a94f58d5d3e3bb0d58557ef4153644ea68ea54:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 6,
+ "end_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 6,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120)",
+ "cve": "c/subdir/utils.c:b466873101951fe96e1332f6728eb7010acbbd5dfc3b65d7d53571d091a06d9e:CWE-119!/CWE-120",
+ "confidence": "Low",
+ "solution": "Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "c/subdir/utils.c",
+ "start_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-119",
+ "value": "119",
+ "url": "https://cwe.mitre.org/data/definitions/119.html"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "c/subdir/utils.c",
+ "line": 4,
+ "url": "https://cwe.mitre.org/data/definitions/119.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362)",
+ "cve": "c/subdir/utils.c:bab681140fcc8fc3085b6bba74081b44ea145c1c98b5e70cf19ace2417d30770:CWE-362",
+ "confidence": "Low",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "c/subdir/utils.c",
+ "start_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-362",
+ "value": "362",
+ "url": "https://cwe.mitre.org/data/definitions/362.html"
+ }
+ ],
+ "file": "c/subdir/utils.c",
+ "line": 8,
+ "url": "https://cwe.mitre.org/data/definitions/362.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120)",
+ "cve": "cplusplus/src/hello.cpp:c8c6dd0afdae6814194cf0930b719f757ab7b379cf8f261e7f4f9f2f323a818a:CWE-119!/CWE-120",
+ "confidence": "Low",
+ "solution": "Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "cplusplus/src/hello.cpp",
+ "start_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-119",
+ "value": "119",
+ "url": "https://cwe.mitre.org/data/definitions/119.html"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "cplusplus/src/hello.cpp",
+ "line": 6,
+ "url": "https://cwe.mitre.org/data/definitions/119.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120)",
+ "cve": "cplusplus/src/hello.cpp:331c04062c4fe0c7c486f66f59e82ad146ab33cdd76ae757ca41f392d568cbd0:CWE-120",
+ "confidence": "Low",
+ "solution": "Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused)",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "cplusplus/src/hello.cpp",
+ "start_line": 7
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "cplusplus/src/hello.cpp",
+ "line": 7,
+ "url": "https://cwe.mitre.org/data/definitions/120.html",
+ "tool": "flawfinder"
+ }
+]
diff --git a/spec/fixtures/security-reports/master.zip b/spec/fixtures/security-reports/master.zip
new file mode 100644
index 00000000000..4684aecb738
--- /dev/null
+++ b/spec/fixtures/security-reports/master.zip
Binary files differ
diff --git a/spec/fixtures/security-reports/master/gl-container-scanning-report.json b/spec/fixtures/security-reports/master/gl-container-scanning-report.json
new file mode 100644
index 00000000000..500c19e3abb
--- /dev/null
+++ b/spec/fixtures/security-reports/master/gl-container-scanning-report.json
@@ -0,0 +1,18 @@
+{
+ "image": "registry.gitlab.com/bikebilly/auto-devops-10-6/feature-branch:e7315ba964febb11bac8f5cd6ec433db8a3a1583",
+ "unapproved": [
+ "CVE-2017-15651"
+ ],
+ "vulnerabilities": [
+ {
+ "featurename": "musl",
+ "featureversion": "1.1.14-r15",
+ "vulnerability": "CVE-2017-15651",
+ "namespace": "alpine:v3.4",
+ "description": "",
+ "link": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-15651",
+ "severity": "Medium",
+ "fixedby": "1.1.14-r16"
+ }
+ ]
+}
diff --git a/spec/fixtures/security-reports/master/gl-dast-report.json b/spec/fixtures/security-reports/master/gl-dast-report.json
new file mode 100644
index 00000000000..3a308bf047e
--- /dev/null
+++ b/spec/fixtures/security-reports/master/gl-dast-report.json
@@ -0,0 +1,40 @@
+{
+ "site": {
+ "alerts": [
+ {
+ "sourceid": "3",
+ "wascid": "15",
+ "cweid": "16",
+ "reference": "<p>http://msdn.microsoft.com/en-us/library/ie/gg622941%28v=vs.85%29.aspx</p><p>https://www.owasp.org/index.php/List_of_useful_HTTP_headers</p>",
+ "otherinfo": "<p>This issue still applies to error type pages (401, 403, 500, etc) as those pages are often still affected by injection issues, in which case there is still concern for browsers sniffing pages away from their actual content type.</p><p>At \"High\" threshold this scanner will not alert on client or server error responses.</p>",
+ "solution": "<p>Ensure that the application/web server sets the Content-Type header appropriately, and that it sets the X-Content-Type-Options header to 'nosniff' for all web pages.</p><p>If possible, ensure that the end user uses a standards-compliant and modern web browser that does not perform MIME-sniffing at all, or that can be directed by the web application/web server to not perform MIME-sniffing.</p>",
+ "count": "2",
+ "pluginid": "10021",
+ "alert": "X-Content-Type-Options Header Missing",
+ "name": "X-Content-Type-Options Header Missing",
+ "riskcode": "1",
+ "confidence": "2",
+ "riskdesc": "Low (Medium)",
+ "desc": "<p>The Anti-MIME-Sniffing header X-Content-Type-Options was not set to 'nosniff'. This allows older versions of Internet Explorer and Chrome to perform MIME-sniffing on the response body, potentially causing the response body to be interpreted and displayed as a content type other than the declared content type. Current (early 2014) and legacy versions of Firefox will use the declared content type (if one is set), rather than performing MIME-sniffing.</p>",
+ "instances": [
+ {
+ "param": "X-Content-Type-Options",
+ "method": "GET",
+ "uri": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io"
+ },
+ {
+ "param": "X-Content-Type-Options",
+ "method": "GET",
+ "uri": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io/"
+ }
+ ]
+ }
+ ],
+ "@ssl": "false",
+ "@port": "80",
+ "@host": "bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io",
+ "@name": "http://bikebilly-spring-auto-devops-review-feature-br-3y2gpb.35.192.176.43.xip.io"
+ },
+ "@generated": "Fri, 13 Apr 2018 09:22:01",
+ "@version": "2.7.0"
+}
diff --git a/spec/fixtures/security-reports/master/gl-dependency-scanning-report.json b/spec/fixtures/security-reports/master/gl-dependency-scanning-report.json
new file mode 100644
index 00000000000..b4e4e8e7dd5
--- /dev/null
+++ b/spec/fixtures/security-reports/master/gl-dependency-scanning-report.json
@@ -0,0 +1,35 @@
+[
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2012-4386",
+ "url": "http://struts.apache.org/docs/s2-010.html",
+ "message": "CSRF protection bypass for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ },
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2012-4387",
+ "url": "http://struts.apache.org/docs/s2-011.html",
+ "message": "Long parameter name DoS for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ },
+ {
+ "priority": "Unknown",
+ "file": "pom.xml",
+ "cve": "CVE-2013-1966",
+ "url": "http://struts.apache.org/docs/s2-014.html",
+ "message": "Remote command execution due to flaw in the includeParams attribute of URL and Anchor tags for org.apache.struts/struts2-core",
+ "tools": [
+ "gemnasium"
+ ],
+ "tool": "gemnasium"
+ }
+]
diff --git a/spec/fixtures/security-reports/master/gl-license-management-report.json b/spec/fixtures/security-reports/master/gl-license-management-report.json
new file mode 100644
index 00000000000..fe91e4fb7ee
--- /dev/null
+++ b/spec/fixtures/security-reports/master/gl-license-management-report.json
@@ -0,0 +1,150 @@
+{
+ "licenses": [
+ {
+ "count": 10,
+ "name": "MIT"
+ }
+ ],
+ "dependencies": [
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "mini_portile2",
+ "url": "http://github.com/flavorjones/mini_portile",
+ "description": "Simplistic port-like solution for developers",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "mustermann",
+ "url": "https://github.com/sinatra/mustermann",
+ "description": "Your personal string matching expert.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "nokogiri",
+ "url": "http://nokogiri.org",
+ "description": "Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "rack",
+ "url": "https://rack.github.io/",
+ "description": "a modular Ruby webserver interface",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "rack-protection",
+ "url": "http://github.com/sinatra/sinatra/tree/master/rack-protection",
+ "description": "Protect against typical web attacks, works with all Rack apps, including Rails.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "redis",
+ "url": "https://github.com/redis/redis-rb",
+ "description": "A Ruby client library for Redis",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "sinatra",
+ "url": "http://www.sinatrarb.com/",
+ "description": "Classy web-development dressed in a DSL",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "slim",
+ "url": "http://slim-lang.com/",
+ "description": "Slim is a template language.",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "temple",
+ "url": "https://github.com/judofyr/temple",
+ "description": "Template compilation framework in Ruby",
+ "pathes": [
+ "."
+ ]
+ }
+ },
+ {
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/mit-license"
+ },
+ "dependency": {
+ "name": "tilt",
+ "url": "http://github.com/rtomayko/tilt/",
+ "description": "Generic interface to multiple Ruby template engines",
+ "pathes": [
+ "."
+ ]
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/security-reports/master/gl-sast-report.json b/spec/fixtures/security-reports/master/gl-sast-report.json
new file mode 100644
index 00000000000..a85b9be8b5f
--- /dev/null
+++ b/spec/fixtures/security-reports/master/gl-sast-report.json
@@ -0,0 +1,944 @@
+[
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:52865813c884a507be1f152d654245af34aba8a391626d01f1ab6d3f52ec8779:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 1,
+ "end_line": 1
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 1,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "name": "Predictable pseudorandom number generator",
+ "message": "Predictable pseudorandom number generator",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:47:PREDICTABLE_RANDOM",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 47,
+ "end_line": 47,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "generateSecretToken2"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-PREDICTABLE_RANDOM",
+ "value": "PREDICTABLE_RANDOM",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 47,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "name": "Predictable pseudorandom number generator",
+ "message": "Predictable pseudorandom number generator",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:41:PREDICTABLE_RANDOM",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 41,
+ "end_line": 41,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "generateSecretToken1"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-PREDICTABLE_RANDOM",
+ "value": "PREDICTABLE_RANDOM",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 41,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:cb203b465dffb0cb3a8e8bd8910b84b93b0a5995a938e4b903dbb0cd6ffa1254:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 11,
+ "end_line": 11
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 11,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:a7173c43ae66bd07466632d819d450e0071e02dbf782763640d1092981f9631b:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 12,
+ "end_line": 12
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 12,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:017017b77deb0b8369b6065947833eeea752a92ec8a700db590fece3e934cf0d:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 13,
+ "end_line": 13
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 13,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Use of insecure MD2, MD4, or MD5 hash function.",
+ "cve": "python/imports/imports-aliases.py:45fc8c53aea7b84f06bc4e590cc667678d6073c4c8a1d471177ca2146fb22db2:B303",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 14,
+ "end_line": 14
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B303",
+ "value": "B303"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 14,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Pickle library appears to be in use, possible security issue.",
+ "cve": "python/imports/imports-aliases.py:5f200d47291e7bbd8352db23019b85453ca048dd98ea0c291260fa7d009963a4:B301",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 15,
+ "end_line": 15
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B301",
+ "value": "B301"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/imports/imports-aliases.py",
+ "line": 15,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "name": "ECB mode is insecure",
+ "message": "ECB mode is insecure",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:29:ECB_MODE",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 29,
+ "end_line": 29,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "insecureCypher"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-ECB_MODE",
+ "value": "ECB_MODE",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#ECB_MODE"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 29,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#ECB_MODE",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "name": "Cipher with no integrity",
+ "message": "Cipher with no integrity",
+ "cve": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy:29:CIPHER_INTEGRITY",
+ "severity": "Medium",
+ "confidence": "High",
+ "scanner": {
+ "id": "find_sec_bugs",
+ "name": "Find Security Bugs"
+ },
+ "location": {
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "start_line": 29,
+ "end_line": 29,
+ "class": "com.gitlab.security_products.tests.App",
+ "method": "insecureCypher"
+ },
+ "identifiers": [
+ {
+ "type": "find_sec_bugs_type",
+ "name": "Find Security Bugs-CIPHER_INTEGRITY",
+ "value": "CIPHER_INTEGRITY",
+ "url": "https://find-sec-bugs.github.io/bugs.htm#CIPHER_INTEGRITY"
+ }
+ ],
+ "priority": "Medium",
+ "file": "groovy/src/main/java/com/gitlab/security_products/tests/App.groovy",
+ "line": 29,
+ "url": "https://find-sec-bugs.github.io/bugs.htm#CIPHER_INTEGRITY",
+ "tool": "find_sec_bugs"
+ },
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:63dd4d626855555b816985d82c4614a790462a0a3ada89dc58eb97f9c50f3077:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 14,
+ "end_line": 14
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 14,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Probable insecure usage of temp file/directory.",
+ "cve": "python/hardcoded/hardcoded-tmp.py:4ad6d4c40a8c263fc265f3384724014e0a4f8dd6200af83e51ff120420038031:B108",
+ "severity": "Medium",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 10,
+ "end_line": 10
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B108",
+ "value": "B108",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
+ }
+ ],
+ "priority": "Medium",
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "line": 10,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-aliases.py:2c3e1fa1e54c3c6646e8bcfaee2518153c6799b77587ff8d9a7b0631f6d34785:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 1,
+ "end_line": 1
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 1,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports.py:af58d07f6ad519ef5287fcae65bf1a6999448a1a3a8bc1ac2a11daa80d0b96bf:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports.py",
+ "start_line": 2,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports.py",
+ "line": 2,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports.py:8de9bc98029d212db530785a5f6780cfa663548746ff228ab8fa96c5bb82f089:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports.py",
+ "start_line": 4,
+ "end_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports.py",
+ "line": 4,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:97c30f1d76d2a88913e3ce9ae74087874d740f87de8af697a9c455f01119f633:B106",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 22,
+ "end_line": 22
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B106",
+ "value": "B106",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b106_hardcoded_password_funcarg.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 22,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b106_hardcoded_password_funcarg.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'root'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:7431c73a0bc16d94ece2a2e75ef38f302574d42c37ac0c3c38ad0b3bf8a59f10:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 5,
+ "end_line": 5
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 5,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: ''",
+ "cve": "python/hardcoded/hardcoded-passwords.py:d2d1857c27caedd49c57bfbcdc23afcc92bd66a22701fcdc632869aab4ca73ee:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 9,
+ "end_line": 9
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 9,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'ajklawejrkl42348swfgkg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:fb3866215a61393a5c9c32a3b60e2058171a23219c353f722cbd3567acab21d2:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 13,
+ "end_line": 13
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 13,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:63c62a8b7e1e5224439bd26b28030585ac48741e28ca64561a6071080c560a5f:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 23,
+ "end_line": 23
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 23,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Possible hardcoded password: 'blerg'",
+ "cve": "python/hardcoded/hardcoded-passwords.py:4311b06d08df8fa58229b341c531da8e1a31ec4520597bdff920cd5c098d86f9:B105",
+ "severity": "Low",
+ "confidence": "Medium",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "start_line": 24,
+ "end_line": 24
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B105",
+ "value": "B105",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/hardcoded/hardcoded-passwords.py",
+ "line": 24,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b105_hardcoded_password_string.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports-function.py:5858400c2f39047787702de44d03361ef8d954c9d14bd54ee1c2bef9e6a7df93:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-function.py",
+ "start_line": 4,
+ "end_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-function.py",
+ "line": 4,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports-function.py:dbda3cf4190279d30e0aad7dd137eca11272b0b225e8af4e8bf39682da67d956:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-function.py",
+ "start_line": 2,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-function.py",
+ "line": 2,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-from.py:eb8a0db9cd1a8c1ab39a77e6025021b1261cc2a0b026b2f4a11fca4e0636d8dd:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 7,
+ "end_line": 7
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 7,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "subprocess call with shell=True seems safe, but may be changed in the future, consider rewriting without shell",
+ "cve": "python/imports/imports-aliases.py:f99f9721e27537fbcb6699a4cf39c6740d6234d2c6f06cfc2d9ea977313c483d:B602",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 9,
+ "end_line": 9
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B602",
+ "value": "B602",
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b602_subprocess_popen_with_shell_equals_true.html"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 9,
+ "url": "https://docs.openstack.org/bandit/latest/plugins/b602_subprocess_popen_with_shell_equals_true.html",
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with subprocess module.",
+ "cve": "python/imports/imports-from.py:332a12ab1146698f614a905ce6a6a5401497a12281aef200e80522711c69dcf4:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 6,
+ "end_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 6,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with Popen module.",
+ "cve": "python/imports/imports-from.py:0a48de4a3d5348853a03666cb574697e3982998355e7a095a798bd02a5947276:B404",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-from.py",
+ "start_line": 1,
+ "end_line": 2
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B404",
+ "value": "B404"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-from.py",
+ "line": 1,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with pickle module.",
+ "cve": "python/imports/imports-aliases.py:51b71661dff994bde3529639a727a678c8f5c4c96f00d300913f6d5be1bbdf26:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 7,
+ "end_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 7,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Consider possible security implications associated with loads module.",
+ "cve": "python/imports/imports-aliases.py:6ff02aeb3149c01ab68484d794a94f58d5d3e3bb0d58557ef4153644ea68ea54:B403",
+ "severity": "Low",
+ "confidence": "High",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "python/imports/imports-aliases.py",
+ "start_line": 6,
+ "end_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B403",
+ "value": "B403"
+ }
+ ],
+ "priority": "Low",
+ "file": "python/imports/imports-aliases.py",
+ "line": 6,
+ "tool": "bandit"
+ },
+ {
+ "category": "sast",
+ "message": "Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120)",
+ "cve": "c/subdir/utils.c:b466873101951fe96e1332f6728eb7010acbbd5dfc3b65d7d53571d091a06d9e:CWE-119!/CWE-120",
+ "confidence": "Low",
+ "solution": "Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "c/subdir/utils.c",
+ "start_line": 4
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-119",
+ "value": "119",
+ "url": "https://cwe.mitre.org/data/definitions/119.html"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "c/subdir/utils.c",
+ "line": 4,
+ "url": "https://cwe.mitre.org/data/definitions/119.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362)",
+ "cve": "c/subdir/utils.c:bab681140fcc8fc3085b6bba74081b44ea145c1c98b5e70cf19ace2417d30770:CWE-362",
+ "confidence": "Low",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "c/subdir/utils.c",
+ "start_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-362",
+ "value": "362",
+ "url": "https://cwe.mitre.org/data/definitions/362.html"
+ }
+ ],
+ "file": "c/subdir/utils.c",
+ "line": 8,
+ "url": "https://cwe.mitre.org/data/definitions/362.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120)",
+ "cve": "cplusplus/src/hello.cpp:c8c6dd0afdae6814194cf0930b719f757ab7b379cf8f261e7f4f9f2f323a818a:CWE-119!/CWE-120",
+ "confidence": "Low",
+ "solution": "Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "cplusplus/src/hello.cpp",
+ "start_line": 6
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-119",
+ "value": "119",
+ "url": "https://cwe.mitre.org/data/definitions/119.html"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "cplusplus/src/hello.cpp",
+ "line": 6,
+ "url": "https://cwe.mitre.org/data/definitions/119.html",
+ "tool": "flawfinder"
+ },
+ {
+ "category": "sast",
+ "message": "Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120)",
+ "cve": "cplusplus/src/hello.cpp:331c04062c4fe0c7c486f66f59e82ad146ab33cdd76ae757ca41f392d568cbd0:CWE-120",
+ "confidence": "Low",
+ "solution": "Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused)",
+ "scanner": {
+ "id": "flawfinder",
+ "name": "Flawfinder"
+ },
+ "location": {
+ "file": "cplusplus/src/hello.cpp",
+ "start_line": 7
+ },
+ "identifiers": [
+ {
+ "type": "cwe",
+ "name": "CWE-120",
+ "value": "120",
+ "url": "https://cwe.mitre.org/data/definitions/120.html"
+ }
+ ],
+ "file": "cplusplus/src/hello.cpp",
+ "line": 7,
+ "url": "https://cwe.mitre.org/data/definitions/120.html",
+ "tool": "flawfinder"
+ }
+]
diff --git a/spec/fixtures/ssh_host_example_key.pub b/spec/fixtures/ssh_host_example_key.pub
index 6bac42b3ad0..d43315ddae8 100644
--- a/spec/fixtures/ssh_host_example_key.pub
+++ b/spec/fixtures/ssh_host_example_key.pub
@@ -1 +1 @@
-random content
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuRkAgwaap/pXThwCpjX8Wd5tR36Tqx3sW2sVVHs3UKB7kd+xNknw7e4qpuEATv56xHrhKm2+ye/JidTuQ/1EwFhjaz7I5wTslfVawQpeH1ZqAGmvdO/xTw+l7fgEFVlGVx9y0HV3m52y2C9yw82qmg+BohbTVgPtjjutpFc+CwLQxLTnTrRhZf5udQgz+YlwLv+Y0kDx6+DWWOl8N9+TWuGyFKBln79CyBgFcK5NFmF48kYn8W+r7rmawfw9XbuF1aa+6JF+6cNR1mCEonyrRLdXP+vWcxpLKYfejB0NmA1y+W9M/K53AcIHA5zlRQ49tFh0P22eh/Gl8JQ6yyuin foo@bar.mynet
diff --git a/spec/fixtures/trace/sample_trace b/spec/fixtures/trace/sample_trace
index 7bfe3f83b7b..3d8beb0dec2 100644
--- a/spec/fixtures/trace/sample_trace
+++ b/spec/fixtures/trace/sample_trace
@@ -2334,12 +2334,12 @@ Boards::Lists::MoveService
keeps position of lists when list type is closed
when list type is set to label
keeps position of lists when new position is nil
- keeps position of lists when new positon is equal to old position
- keeps position of lists when new positon is negative
- keeps position of lists when new positon is equal to number of labels lists
- keeps position of lists when new positon is greater than number of labels lists
- increments position of intermediate lists when new positon is equal to first position
- decrements position of intermediate lists when new positon is equal to last position
+ keeps position of lists when new position is equal to old position
+ keeps position of lists when new position is negative
+ keeps position of lists when new position is equal to number of labels lists
+ keeps position of lists when new position is greater than number of labels lists
+ increments position of intermediate lists when new position is equal to first position
+ decrements position of intermediate lists when new position is equal to last position
decrements position of intermediate lists when new position is greater than old position
increments position of intermediate lists when new position is lower than old position
when board parent is a group
@@ -2347,12 +2347,12 @@ Boards::Lists::MoveService
keeps position of lists when list type is closed
when list type is set to label
keeps position of lists when new position is nil
- keeps position of lists when new positon is equal to old position
- keeps position of lists when new positon is negative
- keeps position of lists when new positon is equal to number of labels lists
- keeps position of lists when new positon is greater than number of labels lists
- increments position of intermediate lists when new positon is equal to first position
- decrements position of intermediate lists when new positon is equal to last position
+ keeps position of lists when new position is equal to old position
+ keeps position of lists when new position is negative
+ keeps position of lists when new position is equal to number of labels lists
+ keeps position of lists when new position is greater than number of labels lists
+ increments position of intermediate lists when new position is equal to first position
+ decrements position of intermediate lists when new position is equal to last position
decrements position of intermediate lists when new position is greater than old position
increments position of intermediate lists when new position is lower than old position
diff --git a/spec/fixtures/valid.po b/spec/fixtures/valid.po
index e43fd5fea15..dbe2f952bad 100644
--- a/spec/fixtures/valid.po
+++ b/spec/fixtures/valid.po
@@ -790,9 +790,6 @@ msgstr "Establezca una contraseña en su cuenta para actualizar o enviar a trav
msgid "Set up CI"
msgstr "Configurar CI"
-msgid "Set up Koding"
-msgstr "Configurar Koding"
-
msgid "Set up auto deploy"
msgstr "Configurar auto despliegue"
diff --git a/spec/graphql/types/permission_types/project_spec.rb b/spec/graphql/types/permission_types/project_spec.rb
index 89eecef096e..927153adc5b 100644
--- a/spec/graphql/types/permission_types/project_spec.rb
+++ b/spec/graphql/types/permission_types/project_spec.rb
@@ -10,7 +10,7 @@ describe Types::PermissionTypes::Project do
:read_commit_status, :request_access, :create_pipeline, :create_pipeline_schedule,
:create_merge_request_from, :create_wiki, :push_code, :create_deployment, :push_to_delete_protected_branch,
:admin_wiki, :admin_project, :update_pages, :admin_remote_mirror, :create_label,
- :update_wiki, :destroy_wiki, :create_pages, :destroy_pages
+ :update_wiki, :destroy_wiki, :create_pages, :destroy_pages, :read_pages_content
]
expect(described_class).to have_graphql_fields(expected_permissions)
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 14297a1a544..4135f31e051 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -3,48 +3,66 @@ require 'spec_helper'
describe ApplicationHelper do
describe 'current_controller?' do
- it 'returns true when controller matches argument' do
+ before do
stub_controller_name('foo')
+ end
- expect(helper.current_controller?(:foo)).to eq true
+ it 'returns true when controller matches argument' do
+ expect(helper.current_controller?(:foo)).to be_truthy
end
it 'returns false when controller does not match argument' do
- stub_controller_name('foo')
-
- expect(helper.current_controller?(:bar)).to eq false
+ expect(helper.current_controller?(:bar)).to be_falsey
end
it 'takes any number of arguments' do
- stub_controller_name('foo')
+ expect(helper.current_controller?(:baz, :bar)).to be_falsey
+ expect(helper.current_controller?(:baz, :bar, :foo)).to be_truthy
+ end
- expect(helper.current_controller?(:baz, :bar)).to eq false
- expect(helper.current_controller?(:baz, :bar, :foo)).to eq true
+ context 'when namespaced' do
+ before do
+ stub_controller_path('bar/foo')
+ end
+
+ it 'returns true when controller matches argument' do
+ expect(helper.current_controller?(:foo)).to be_truthy
+ end
+
+ it 'returns true when controller and namespace matches argument in path notation' do
+ expect(helper.current_controller?('bar/foo')).to be_truthy
+ end
+
+ it 'returns false when namespace doesnt match' do
+ expect(helper.current_controller?('foo/foo')).to be_falsey
+ end
end
def stub_controller_name(value)
allow(helper.controller).to receive(:controller_name).and_return(value)
end
+
+ def stub_controller_path(value)
+ allow(helper.controller).to receive(:controller_path).and_return(value)
+ end
end
describe 'current_action?' do
- it 'returns true when action matches' do
+ before do
stub_action_name('foo')
+ end
- expect(helper.current_action?(:foo)).to eq true
+ it 'returns true when action matches' do
+ expect(helper.current_action?(:foo)).to be_truthy
end
it 'returns false when action does not match' do
- stub_action_name('foo')
-
- expect(helper.current_action?(:bar)).to eq false
+ expect(helper.current_action?(:bar)).to be_falsey
end
it 'takes any number of arguments' do
- stub_action_name('foo')
-
- expect(helper.current_action?(:baz, :bar)).to eq false
- expect(helper.current_action?(:baz, :bar, :foo)).to eq true
+ expect(helper.current_action?(:baz, :bar)).to be_falsey
+ expect(helper.current_action?(:baz, :bar, :foo)).to be_truthy
end
def stub_action_name(value)
@@ -100,8 +118,7 @@ describe ApplicationHelper do
end
it 'accepts a custom html_class' do
- expect(element(html_class: 'custom_class').attr('class'))
- .to eq 'js-timeago custom_class'
+ expect(element(html_class: 'custom_class').attr('class')).to eq 'js-timeago custom_class'
end
it 'accepts a custom tooltip placement' do
@@ -114,6 +131,7 @@ describe ApplicationHelper do
it 'add class for the short format' do
timeago_element = element(short_format: 'short')
+
expect(timeago_element.attr('class')).to eq 'js-short-timeago'
expect(timeago_element.next_element).to eq nil
end
@@ -128,11 +146,9 @@ describe ApplicationHelper do
context 'when alternate support url is specified' do
let(:alternate_url) { 'http://company.example.com/getting-help' }
- before do
+ it 'returns the alternate support url' do
stub_application_setting(help_page_support_url: alternate_url)
- end
- it 'returns the alternate support url' do
expect(helper.support_url).to eq(alternate_url)
end
end
@@ -155,9 +171,10 @@ describe ApplicationHelper do
describe '#autocomplete_data_sources' do
let(:project) { create(:project) }
let(:noteable_type) { Issue }
+
it 'returns paths for autocomplete_sources_controller' do
sources = helper.autocomplete_data_sources(project, noteable_type)
- expect(sources.keys).to match_array([:members, :issues, :mergeRequests, :labels, :milestones, :commands])
+ expect(sources.keys).to match_array([:members, :issues, :mergeRequests, :labels, :milestones, :commands, :snippets])
sources.keys.each do |key|
expect(sources[key]).not_to be_nil
end
diff --git a/spec/helpers/auth_helper_spec.rb b/spec/helpers/auth_helper_spec.rb
index 120b23e66ac..f0c2e4768ec 100644
--- a/spec/helpers/auth_helper_spec.rb
+++ b/spec/helpers/auth_helper_spec.rb
@@ -42,6 +42,16 @@ describe AuthHelper do
end
end
+ describe 'form_based_auth_provider_has_active_class?' do
+ it 'selects main LDAP server' do
+ allow(helper).to receive(:auth_providers) { [:twitter, :ldapprimary, :ldapsecondary, :kerberos] }
+ expect(helper.form_based_auth_provider_has_active_class?(:twitter)).to be(false)
+ expect(helper.form_based_auth_provider_has_active_class?(:ldapprimary)).to be(true)
+ expect(helper.form_based_auth_provider_has_active_class?(:ldapsecondary)).to be(false)
+ expect(helper.form_based_auth_provider_has_active_class?(:kerberos)).to be(false)
+ end
+ end
+
describe 'enabled_button_based_providers' do
before do
allow(helper).to receive(:auth_providers) { [:twitter, :github] }
diff --git a/spec/helpers/auto_devops_helper_spec.rb b/spec/helpers/auto_devops_helper_spec.rb
index 1950c2b129b..75c30dbfe48 100644
--- a/spec/helpers/auto_devops_helper_spec.rb
+++ b/spec/helpers/auto_devops_helper_spec.rb
@@ -16,7 +16,15 @@ describe AutoDevopsHelper do
subject { helper.show_auto_devops_callout?(project) }
- context 'when all conditions are met' do
+ context 'when auto devops is implicitly enabled' do
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when auto devops is not implicitly enabled' do
+ before do
+ Gitlab::CurrentSettings.update!(auto_devops_enabled: false)
+ end
+
it { is_expected.to eq(true) }
end
diff --git a/spec/helpers/avatars_helper_spec.rb b/spec/helpers/avatars_helper_spec.rb
index 55ee87163f9..aa0442ab847 100644
--- a/spec/helpers/avatars_helper_spec.rb
+++ b/spec/helpers/avatars_helper_spec.rb
@@ -32,18 +32,6 @@ describe AvatarsHelper do
end
end
- context 'when providing a project path' do
- it_behaves_like 'resource with a default avatar', 'project' do
- let(:resource) { create(:project, name: 'foo') }
- let(:helper_args) { [resource.full_path] }
- end
-
- it_behaves_like 'resource with a custom avatar', 'project' do
- let(:resource) { create(:project, :public, avatar: File.open(uploaded_image_temp_path)) }
- let(:helper_args) { [resource.full_path] }
- end
- end
-
context 'when providing a group' do
it_behaves_like 'resource with a default avatar', 'group' do
let(:resource) { create(:group, name: 'foo') }
@@ -55,18 +43,6 @@ describe AvatarsHelper do
let(:helper_args) { [resource] }
end
end
-
- context 'when providing a group path' do
- it_behaves_like 'resource with a default avatar', 'group' do
- let(:resource) { create(:group, name: 'foo') }
- let(:helper_args) { [resource.full_path] }
- end
-
- it_behaves_like 'resource with a custom avatar', 'group' do
- let(:resource) { create(:group, avatar: File.open(uploaded_image_temp_path)) }
- let(:helper_args) { [resource.full_path] }
- end
- end
end
describe '#avatar_icon_for' do
diff --git a/spec/helpers/blob_helper_spec.rb b/spec/helpers/blob_helper_spec.rb
index 1c216b3fe97..f709f152c92 100644
--- a/spec/helpers/blob_helper_spec.rb
+++ b/spec/helpers/blob_helper_spec.rb
@@ -3,63 +3,13 @@ require 'spec_helper'
describe BlobHelper do
include TreeHelper
- let(:blob_name) { 'test.lisp' }
- let(:no_context_content) { ":type \"assem\"))" }
- let(:blob_content) { "(make-pathname :defaults name\n#{no_context_content}" }
- let(:split_content) { blob_content.split("\n") }
- let(:multiline_content) do
- %q(
- def test(input):
- """This is line 1 of a multi-line comment.
- This is line 2.
- """
- )
- end
-
describe '#highlight' do
- it 'returns plaintext for unknown lexer context' do
- result = helper.highlight(blob_name, no_context_content)
- expect(result).to eq(%[<pre class="code highlight"><code><span id="LC1" class="line" lang="">:type "assem"))</span></code></pre>])
+ it 'wraps highlighted content' do
+ expect(helper.highlight('test.rb', '52')).to eq(%q[<pre class="code highlight"><code><span id="LC1" class="line" lang="ruby"><span class="mi">52</span></span></code></pre>])
end
- it 'returns plaintext for long blobs' do
- stub_const('Blob::MAXIMUM_TEXT_HIGHLIGHT_SIZE', 1)
- result = helper.highlight(blob_name, blob_content)
-
- expect(result).to eq(%[<pre class="code highlight"><code><span id="LC1" class="line" lang="">(make-pathname :defaults name</span>\n<span id="LC2" class="line" lang="">:type "assem"))</span></code></pre>])
- end
-
- it 'highlights single block' do
- expected = %Q[<pre class="code highlight"><code><span id="LC1" class="line" lang="common_lisp"><span class="p">(</span><span class="nb">make-pathname</span> <span class="ss">:defaults</span> <span class="nv">name</span></span>
-<span id="LC2" class="line" lang="common_lisp"><span class="ss">:type</span> <span class="s">"assem"</span><span class="p">))</span></span></code></pre>]
-
- expect(helper.highlight(blob_name, blob_content)).to eq(expected)
- end
-
- it 'highlights multi-line comments' do
- result = helper.highlight(blob_name, multiline_content)
- html = Nokogiri::HTML(result)
- lines = html.search('.s')
- expect(lines.count).to eq(3)
- expect(lines[0].text).to eq('"""This is line 1 of a multi-line comment.')
- expect(lines[1].text).to eq(' This is line 2.')
- expect(lines[2].text).to eq(' """')
- end
-
- context 'diff highlighting' do
- let(:blob_name) { 'test.diff' }
- let(:blob_content) { "+aaa\n+bbb\n- ccc\n ddd\n"}
- let(:expected) do
- %q(<pre class="code highlight"><code><span id="LC1" class="line" lang="diff"><span class="gi">+aaa</span></span>
-<span id="LC2" class="line" lang="diff"><span class="gi">+bbb</span></span>
-<span id="LC3" class="line" lang="diff"><span class="gd">- ccc</span></span>
-<span id="LC4" class="line" lang="diff"> ddd</span></code></pre>)
- end
-
- it 'highlights each line properly' do
- result = helper.highlight(blob_name, blob_content)
- expect(result).to eq(expected)
- end
+ it 'handles plain version' do
+ expect(helper.highlight('test.rb', '52', plain: true)).to eq(%q[<pre class="code highlight"><code><span id="LC1" class="line" lang="">52</span></code></pre>])
end
end
diff --git a/spec/helpers/button_helper_spec.rb b/spec/helpers/button_helper_spec.rb
index 630f3eff258..eebae1d7290 100644
--- a/spec/helpers/button_helper_spec.rb
+++ b/spec/helpers/button_helper_spec.rb
@@ -40,12 +40,24 @@ describe ButtonHelper do
end
context 'when user has no personal access tokens' do
- it 'has a personal access token text on the dropdown description ' do
+ it 'has a personal access token text on the dropdown description' do
description = element.search('.dropdown-menu-inner-content').first
expect(description.inner_text).to eq 'Create a personal access token on your account to pull or push via HTTP.'
end
end
+
+ context 'when user has personal access tokens' do
+ before do
+ create(:personal_access_token, user: user)
+ end
+
+ it 'does not have a personal access token text on the dropdown description' do
+ description = element.search('.dropdown-menu-inner-content').first
+
+ expect(description).to be_nil
+ end
+ end
end
context 'when user is ldap user' do
@@ -79,6 +91,18 @@ describe ButtonHelper do
end
end
+ context 'without an ssh key on the user and user_show_add_ssh_key_message unset' do
+ before do
+ stub_application_setting(user_show_add_ssh_key_message: false)
+ end
+
+ it 'there is no warning on the dropdown description' do
+ description = element.search('.dropdown-menu-inner-content').first
+
+ expect(description).to be_nil
+ end
+ end
+
context 'with an ssh key on the user' do
before do
create(:key, user: user)
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 4b6c7c33e5b..9c0e55739d6 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -37,7 +37,7 @@ describe CommitsHelper do
.not_to include('onmouseover="alert(1)"')
end
- it 'escapes the commiter name' do
+ it 'escapes the committer name' do
user = build_stubbed(:user, name: 'Foo <script>alert("XSS")</script>')
commit = double(committer: user, committer_name: '', committer_email: '')
diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb
index fccde8b7eba..8d0679e5699 100644
--- a/spec/helpers/events_helper_spec.rb
+++ b/spec/helpers/events_helper_spec.rb
@@ -2,18 +2,18 @@ require 'spec_helper'
describe EventsHelper do
describe '#event_commit_title' do
- let(:message) { "foo & bar " + "A" * 70 + "\n" + "B" * 80 }
+ let(:message) { 'foo & bar ' + 'A' * 70 + '\n' + 'B' * 80 }
subject { helper.event_commit_title(message) }
- it "returns the first line, truncated to 70 chars" do
+ it 'returns the first line, truncated to 70 chars' do
is_expected.to eq(message[0..66] + "...")
end
- it "is not html-safe" do
+ it 'is not html-safe' do
is_expected.not_to be_a(ActiveSupport::SafeBuffer)
end
- it "handles empty strings" do
+ it 'handles empty strings' do
expect(helper.event_commit_title("")).to eq("")
end
@@ -22,7 +22,66 @@ describe EventsHelper do
end
it 'does not escape HTML entities' do
- expect(helper.event_commit_title("foo & bar")).to eq("foo & bar")
+ expect(helper.event_commit_title('foo & bar')).to eq('foo & bar')
+ end
+ end
+
+ describe '#event_feed_url' do
+ let(:event) { create(:event) }
+ let(:project) { create(:project, :public, :repository) }
+
+ context 'issue' do
+ before do
+ event.target = create(:issue)
+ end
+
+ it 'returns the project issue url' do
+ expect(helper.event_feed_url(event)).to eq(project_issue_url(event.project, event.target))
+ end
+
+ it 'contains the project issue IID link' do
+ expect(helper.event_feed_title(event)).to include("##{event.target.iid}")
+ end
+ end
+
+ context 'merge request' do
+ before do
+ event.target = create(:merge_request)
+ end
+
+ it 'returns the project merge request url' do
+ expect(helper.event_feed_url(event)).to eq(project_merge_request_url(event.project, event.target))
+ end
+
+ it 'contains the project merge request IID link' do
+ expect(helper.event_feed_title(event)).to include("!#{event.target.iid}")
+ end
+ end
+
+ it 'returns project commit url' do
+ event.target = create(:note_on_commit, project: project)
+
+ expect(helper.event_feed_url(event)).to eq(project_commit_url(event.project, event.note_target))
+ end
+
+ it 'returns event note target url' do
+ event.target = create(:note)
+
+ expect(helper.event_feed_url(event)).to eq(event_note_target_url(event))
+ end
+
+ it 'returns project url' do
+ event.project = project
+ event.action = 1
+
+ expect(helper.event_feed_url(event)).to eq(project_url(event.project))
+ end
+
+ it 'returns push event feed url' do
+ event = create(:push_event)
+ create(:push_event_payload, event: event, action: :pushed)
+
+ expect(helper.event_feed_url(event)).to eq(push_event_feed_url(event))
end
end
end
diff --git a/spec/helpers/icons_helper_spec.rb b/spec/helpers/icons_helper_spec.rb
index 82f588d1a08..4b40d523287 100644
--- a/spec/helpers/icons_helper_spec.rb
+++ b/spec/helpers/icons_helper_spec.rb
@@ -80,6 +80,26 @@ describe IconsHelper do
end
end
+ describe 'audit icon' do
+ it 'returns right icon name for standard auth' do
+ icon_name = 'standard'
+ expect(audit_icon(icon_name).to_s)
+ .to eq '<i class="fa fa-key"></i>'
+ end
+
+ it 'returns right icon name for two-factor auth' do
+ icon_name = 'two-factor'
+ expect(audit_icon(icon_name).to_s)
+ .to eq '<i class="fa fa-key"></i>'
+ end
+
+ it 'returns right icon name for google_oauth2 auth' do
+ icon_name = 'google_oauth2'
+ expect(audit_icon(icon_name).to_s)
+ .to eq '<i class="fa fa-google"></i>'
+ end
+ end
+
describe 'file_type_icon_class' do
it 'returns folder class' do
expect(file_type_icon_class('folder', 0, 'folder_name')).to eq 'folder'
diff --git a/spec/helpers/import_helper_spec.rb b/spec/helpers/import_helper_spec.rb
index 033155617c6..cb0ea4e26ba 100644
--- a/spec/helpers/import_helper_spec.rb
+++ b/spec/helpers/import_helper_spec.rb
@@ -1,6 +1,16 @@
require 'rails_helper'
describe ImportHelper do
+ describe '#sanitize_project_name' do
+ it 'removes whitespace' do
+ expect(helper.sanitize_project_name('my test repo')).to eq('my-test-repo')
+ end
+
+ it 'removes disallowed characters' do
+ expect(helper.sanitize_project_name('Test&me$over*h_ere')).to eq('Test-me-over-h_ere')
+ end
+ end
+
describe '#import_project_target' do
let(:user) { create(:user) }
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index f76ed4bfda4..4af98bc3678 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -184,7 +184,7 @@ describe IssuablesHelper do
issuableRef: "##{issue.iid}",
markdownPreviewPath: "/#{@project.full_path}/preview_markdown",
markdownDocsPath: '/help/user/markdown',
- markdownVersion: 11,
+ markdownVersion: CacheMarkdownField::CACHE_COMMONMARK_VERSION,
issuableTemplates: [],
projectPath: @project.path,
projectNamespace: @project.namespace.path,
diff --git a/spec/helpers/labels_helper_spec.rb b/spec/helpers/labels_helper_spec.rb
index a2cda58e5d2..c04f679bcf0 100644
--- a/spec/helpers/labels_helper_spec.rb
+++ b/spec/helpers/labels_helper_spec.rb
@@ -211,4 +211,29 @@ describe LabelsHelper do
end
end
end
+
+ describe 'labels_filter_path' do
+ let(:group) { create(:group) }
+ let(:project) { create(:project) }
+
+ it 'links to the dashboard labels page' do
+ expect(labels_filter_path).to eq(dashboard_labels_path)
+ end
+
+ it 'links to the group labels page' do
+ assign(:group, group)
+
+ expect(helper.labels_filter_path).to eq(group_labels_path(group))
+ end
+
+ it 'links to the project labels page' do
+ assign(:project, project)
+
+ expect(helper.labels_filter_path).to eq(project_labels_path(project))
+ end
+
+ it 'supports json format' do
+ expect(labels_filter_path(format: :json)).to eq(dashboard_labels_path(format: :json))
+ end
+ end
end
diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb
index 597648b064d..a0c0af94fa5 100644
--- a/spec/helpers/markup_helper_spec.rb
+++ b/spec/helpers/markup_helper_spec.rb
@@ -25,17 +25,17 @@ describe MarkupHelper do
let(:actual) { "#{merge_request.to_reference} -> #{commit.to_reference} -> #{issue.to_reference}" }
it "links to the merge request" do
- expected = project_merge_request_path(project, merge_request)
+ expected = urls.project_merge_request_path(project, merge_request)
expect(helper.markdown(actual)).to match(expected)
end
it "links to the commit" do
- expected = project_commit_path(project, commit)
+ expected = urls.project_commit_path(project, commit)
expect(helper.markdown(actual)).to match(expected)
end
it "links to the issue" do
- expected = project_issue_path(project, issue)
+ expected = urls.project_issue_path(project, issue)
expect(helper.markdown(actual)).to match(expected)
end
end
@@ -46,7 +46,7 @@ describe MarkupHelper do
let(:second_issue) { create(:issue, project: second_project) }
it 'links to the issue' do
- expected = project_issue_path(second_project, second_issue)
+ expected = urls.project_issue_path(second_project, second_issue)
expect(markdown(actual, project: second_project)).to match(expected)
end
end
@@ -93,7 +93,7 @@ describe MarkupHelper do
# First issue link
expect(doc.css('a')[1].attr('href'))
- .to eq project_issue_path(project, issues[0])
+ .to eq urls.project_issue_path(project, issues[0])
expect(doc.css('a')[1].text).to eq issues[0].to_reference
# Internal commit link
@@ -102,7 +102,7 @@ describe MarkupHelper do
# Second issue link
expect(doc.css('a')[3].attr('href'))
- .to eq project_issue_path(project, issues[1])
+ .to eq urls.project_issue_path(project, issues[1])
expect(doc.css('a')[3].text).to eq issues[1].to_reference
# Trailing commit link
@@ -128,7 +128,7 @@ describe MarkupHelper do
# First issue link
expect(doc.css('a')[1].attr('href'))
- .to eq project_issue_path(project, issues[0])
+ .to eq urls.project_issue_path(project, issues[0])
expect(doc.css('a')[1].text).to eq issues[0].to_reference
# Internal commit link
@@ -137,7 +137,7 @@ describe MarkupHelper do
# Second issue link
expect(doc.css('a')[3].attr('href'))
- .to eq project_issue_path(project, issues[1])
+ .to eq urls.project_issue_path(project, issues[1])
expect(doc.css('a')[3].text).to eq issues[1].to_reference
# Trailing commit link
@@ -183,7 +183,7 @@ describe MarkupHelper do
doc = Nokogiri::HTML.parse(rendered)
expect(doc.css('a')[0].attr('href'))
- .to eq project_issue_path(project, issue)
+ .to eq urls.project_issue_path(project, issue)
expect(doc.css('a')[0].text).to eq issue.to_reference
wrapped = helper.link_to_html(rendered, link)
@@ -207,6 +207,17 @@ describe MarkupHelper do
expect(helper).to receive(:markdown_unsafe).with('wiki content',
pipeline: :wiki, project: project, project_wiki: @wiki, page_slug: "nested/page",
+ issuable_state_filter_enabled: true)
+
+ helper.render_wiki_content(@wiki)
+ end
+
+ it 'uses Wiki pipeline for markdown files with RedCarpet if feature disabled' do
+ stub_feature_flags(commonmark_for_repositories: false)
+ allow(@wiki).to receive(:format).and_return(:markdown)
+
+ expect(helper).to receive(:markdown_unsafe).with('wiki content',
+ pipeline: :wiki, project: project, project_wiki: @wiki, page_slug: "nested/page",
issuable_state_filter_enabled: true, markdown_engine: :redcarpet)
helper.render_wiki_content(@wiki)
@@ -259,10 +270,18 @@ describe MarkupHelper do
expect(helper.markup('foo.md', content, rendered: '<p>NOEL</p>')).to eq('<p>NOEL</p>')
end
- it 'defaults to Redcarpet' do
- expect(helper).to receive(:markdown_unsafe).with(content, hash_including(markdown_engine: :redcarpet)).and_return('NOEL')
+ it 'defaults to CommonMark' do
+ expect(helper.markup('foo.md', 'x^2')).to include('x^2')
+ end
- expect(helper.markup('foo.md', content)).to eq('NOEL')
+ it 'honors markdown_engine for RedCarpet' do
+ expect(helper.markup('foo.md', 'x^2', { markdown_engine: :redcarpet })).to include('x<sup>2</sup>')
+ end
+
+ it 'uses RedCarpet if feature disabled' do
+ stub_feature_flags(commonmark_for_repositories: false)
+
+ expect(helper.markup('foo.md', 'x^2', { markdown_engine: :redcarpet })).to include('x<sup>2</sup>')
end
end
@@ -320,11 +339,25 @@ describe MarkupHelper do
expect(first_line_in_markdown(object, attribute, 150, project: project)).to eq(expected)
end
- it 'preserves data-src for lazy images' do
- object = create_object("![ImageTest](/uploads/test.png)")
- image_url = "data-src=\".*/uploads/test.png\""
+ context 'when images are allowed' do
+ it 'preserves data-src for lazy images' do
+ object = create_object("![ImageTest](/uploads/test.png)")
+ image_url = "data-src=\".*/uploads/test.png\""
+ text = first_line_in_markdown(object, attribute, 150, project: project, allow_images: true)
+
+ expect(text).to match(image_url)
+ expect(text).to match('<a')
+ end
+ end
+
+ context 'when images are not allowed' do
+ it 'removes any images' do
+ object = create_object("![ImageTest](/uploads/test.png)")
+ text = first_line_in_markdown(object, attribute, 150, project: project)
- expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(image_url)
+ expect(text).not_to match('<img')
+ expect(text).not_to match('<a')
+ end
end
context 'labels formatting' do
@@ -414,4 +447,8 @@ describe MarkupHelper do
expect(helper.cross_project_reference(project, issue)).to include(project.full_path)
end
end
+
+ def urls
+ Gitlab::Routing.url_helpers
+ end
end
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 234690e742b..7ccbdcd1332 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -50,9 +50,12 @@ describe NamespacesHelper do
end
it 'selects the new group by default' do
+ # Ensure we don't select a group with the same name
+ create(:group, name: 'new-group', path: 'another-path')
+
allow(helper).to receive(:current_user).and_return(user)
- options = helper.namespaces_options(:extra_group, display_path: true, extra_group: build(:group, name: 'new-group'))
+ options = helper.namespaces_options(:extra_group, display_path: true, extra_group: build(:group, name: 'new-group', path: 'new-group'))
expect(options).to include(user_group.name)
expect(options).not_to include(admin_group.name)
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index 363ebc88afd..c112c8ed633 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -2,6 +2,13 @@ require 'spec_helper'
describe PreferencesHelper do
describe '#dashboard_choices' do
+ let(:user) { build(:user) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ allow(helper).to receive(:can?).and_return(false)
+ end
+
it 'raises an exception when defined choices may be missing' do
expect(User).to receive(:dashboards).and_return(foo: 'foo')
expect { helper.dashboard_choices }.to raise_error(RuntimeError)
diff --git a/spec/helpers/profiles_helper_spec.rb b/spec/helpers/profiles_helper_spec.rb
index c1d0614c79e..8e336469c27 100644
--- a/spec/helpers/profiles_helper_spec.rb
+++ b/spec/helpers/profiles_helper_spec.rb
@@ -1,6 +1,40 @@
require 'rails_helper'
describe ProfilesHelper do
+ describe '#commit_email_select_options' do
+ it 'returns an array with private commit email along with all the verified emails' do
+ user = create(:user)
+ create(:email, user: user)
+ confirmed_email1 = create(:email, :confirmed, user: user)
+ confirmed_email2 = create(:email, :confirmed, user: user)
+
+ private_email = user.private_commit_email
+
+ emails = [
+ ["Use a private email - #{private_email}", Gitlab::PrivateCommitEmail::TOKEN],
+ user.email,
+ confirmed_email1.email,
+ confirmed_email2.email
+ ]
+
+ expect(helper.commit_email_select_options(user)).to match_array(emails)
+ end
+ end
+
+ describe '#selected_commit_email' do
+ let(:user) { create(:user) }
+
+ it 'returns main email when commit email attribute is nil' do
+ expect(helper.selected_commit_email(user)).to eq(user.email)
+ end
+
+ it 'returns DB stored commit_email' do
+ user.update(commit_email: Gitlab::PrivateCommitEmail::TOKEN)
+
+ expect(helper.selected_commit_email(user)).to eq(Gitlab::PrivateCommitEmail::TOKEN)
+ end
+ end
+
describe '#email_provider_label' do
it "returns nil for users without external email" do
user = create(:user)
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index cbd4ff0fb4a..976b6c312b4 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -470,4 +470,16 @@ describe ProjectsHelper do
end
end
end
+
+ describe '#legacy_render_context' do
+ it 'returns the redcarpet engine' do
+ params = { legacy_render: '1' }
+
+ expect(helper.legacy_render_context(params)).to include(markdown_engine: :redcarpet)
+ end
+
+ it 'returns nothing' do
+ expect(helper.legacy_render_context({})).to be_empty
+ end
+ end
end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 8bfd520528f..4945749f524 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -135,5 +135,40 @@ describe SearchHelper do
expect(search_filter_input_options('')[:data]['base-endpoint']).to eq("/groups#{group_path(@group)}")
end
end
+
+ context 'dashboard' do
+ it 'does not include group-id and project-id' do
+ expect(search_filter_input_options('')[:data]['project-id']).to eq(nil)
+ expect(search_filter_input_options('')[:data]['group-id']).to eq(nil)
+ end
+
+ it 'includes dashboard base-endpoint' do
+ expect(search_filter_input_options('')[:data]['base-endpoint']).to eq("/dashboard")
+ end
+ end
+ end
+
+ describe 'search_history_storage_prefix' do
+ context 'project' do
+ it 'returns project full_path' do
+ @project = create(:project, :repository)
+
+ expect(search_history_storage_prefix).to eq(@project.full_path)
+ end
+ end
+
+ context 'group' do
+ it 'returns group full_path' do
+ @group = create(:group, :nested, name: 'group-name')
+
+ expect(search_history_storage_prefix).to eq(@group.full_path)
+ end
+ end
+
+ context 'dashboard' do
+ it 'returns dashboard' do
+ expect(search_history_storage_prefix).to eq("dashboard")
+ end
+ end
end
end
diff --git a/spec/helpers/storage_health_helper_spec.rb b/spec/helpers/storage_health_helper_spec.rb
deleted file mode 100644
index 874498e6338..00000000000
--- a/spec/helpers/storage_health_helper_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'spec_helper'
-
-describe StorageHealthHelper do
- describe '#failing_storage_health_message' do
- let(:health) do
- Gitlab::Git::Storage::Health.new(
- "<script>alert('storage name');)</script>",
- []
- )
- end
-
- it 'escapes storage names' do
- escaped_storage_name = '&lt;script&gt;alert(&#39;storage name&#39;);)&lt;/script&gt;'
-
- result = helper.failing_storage_health_message(health)
-
- expect(result).to include(escaped_storage_name)
- end
- end
-end
diff --git a/spec/helpers/submodule_helper_spec.rb b/spec/helpers/submodule_helper_spec.rb
index a64f8a11ef2..8662cadc7a0 100644
--- a/spec/helpers/submodule_helper_spec.rb
+++ b/spec/helpers/submodule_helper_spec.rb
@@ -162,42 +162,77 @@ describe SubmoduleHelper do
end
context 'submodules with relative links' do
- let(:group) { create(:group, name: "Master Project", path: "master-project") }
+ let(:group) { create(:group, name: "top group", path: "top-group") }
let(:project) { create(:project, group: group) }
- let(:commit_id) { sample_commit[:id] }
+ let(:repo) { double(:repo, project: project) }
+
+ def expect_relative_link_to_resolve_to(relative_path, expected_path)
+ allow(repo).to receive(:submodule_url_for).and_return(relative_path)
+
+ result = submodule_links(submodule_item)
+
+ expect(result).to eq([expected_path, "#{expected_path}/tree/#{submodule_item.id}"])
+ end
- it 'one level down' do
- result = relative_self_links('../test.git', commit_id, project)
- expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
+ it 'handles project under same group' do
+ expect_relative_link_to_resolve_to('../test.git', "/#{group.path}/test")
end
- it 'with trailing whitespace' do
- result = relative_self_links('../test.git ', commit_id, project)
- expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
+ it 'handles trailing whitespace' do
+ expect_relative_link_to_resolve_to('../test.git ', "/#{group.path}/test")
end
- it 'two levels down' do
- result = relative_self_links('../../test.git', commit_id, project)
- expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
+ it 'handles project under another top group' do
+ expect_relative_link_to_resolve_to('../../baz/test.git ', "/baz/test")
+ end
+
+ context 'repo path resolves to be located at root (namespace absent)' do
+ it 'returns nil' do
+ allow(repo).to receive(:submodule_url_for).and_return('../../test.git')
+
+ result = submodule_links(submodule_item)
+
+ expect(result).to eq([nil, nil])
+ end
end
- it 'one level down with namespace and repo' do
- result = relative_self_links('../foobar/test.git', commit_id, project)
- expect(result).to eq(["/foobar/test", "/foobar/test/tree/#{commit_id}"])
+ context 'repo path resolves to be located underneath current project path' do
+ it 'returns nil because it is not possible to have repo nested under another repo' do
+ allow(repo).to receive(:submodule_url_for).and_return('./test.git')
+
+ result = submodule_links(submodule_item)
+
+ expect(result).to eq([nil, nil])
+ end
end
- it 'two levels down with namespace and repo' do
- result = relative_self_links('../foobar/baz/test.git', commit_id, project)
- expect(result).to eq(["/baz/test", "/baz/test/tree/#{commit_id}"])
+ context 'subgroup' do
+ let(:sub_group) { create(:group, parent: group, name: "sub group", path: "sub-group") }
+ let(:sub_project) { create(:project, group: sub_group) }
+
+ context 'project in sub group' do
+ let(:project) { sub_project }
+
+ it "handles referencing ancestor group's project" do
+ expect_relative_link_to_resolve_to('../../../top-group/test.git', "/#{group.path}/test")
+ end
+ end
+
+ it "handles referencing descendent group's project" do
+ expect_relative_link_to_resolve_to('../sub-group/test.git', "/top-group/sub-group/test")
+ end
+
+ it "handles referencing another top group's project" do
+ expect_relative_link_to_resolve_to('../../frontend/css/test.git', "/frontend/css/test")
+ end
end
context 'personal project' do
let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) }
- it 'one level down with personal project' do
- result = relative_self_links('../test.git', commit_id, project)
- expect(result).to eq(["/#{user.username}/test", "/#{user.username}/test/tree/#{commit_id}"])
+ it 'handles referencing another personal project' do
+ expect_relative_link_to_resolve_to('../test.git', "/#{user.username}/test")
end
end
end
diff --git a/spec/helpers/tab_helper_spec.rb b/spec/helpers/tab_helper_spec.rb
index b473c0a7416..9abf63d4bd4 100644
--- a/spec/helpers/tab_helper_spec.rb
+++ b/spec/helpers/tab_helper_spec.rb
@@ -9,31 +9,71 @@ describe TabHelper do
allow(self).to receive(:action_name).and_return('foo')
end
- it "captures block output" do
- expect(nav_link { "Testing Blocks" }).to match(/Testing Blocks/)
+ context 'with the content of the li' do
+ it "captures block output" do
+ expect(nav_link { "Testing Blocks" }).to match(/Testing Blocks/)
+ end
end
- it "performs checks on the current controller" do
- expect(nav_link(controller: :foo)).to match(/<li class="active">/)
- expect(nav_link(controller: :bar)).not_to match(/active/)
- expect(nav_link(controller: [:foo, :bar])).to match(/active/)
- end
+ context 'with controller param' do
+ it "performs checks on the current controller" do
+ expect(nav_link(controller: :foo)).to match(/<li class="active">/)
+ expect(nav_link(controller: :bar)).not_to match(/active/)
+ expect(nav_link(controller: [:foo, :bar])).to match(/active/)
+ end
+
+ context 'with action param' do
+ it "performs checks on both controller and action when both are present" do
+ expect(nav_link(controller: :bar, action: :foo)).not_to match(/active/)
+ expect(nav_link(controller: :foo, action: :bar)).not_to match(/active/)
+ expect(nav_link(controller: :foo, action: :foo)).to match(/active/)
+ end
+ end
+
+ context 'with namespace in path notation' do
+ before do
+ allow(controller).to receive(:controller_path).and_return('bar/foo')
+ end
- it "performs checks on the current action" do
- expect(nav_link(action: :foo)).to match(/<li class="active">/)
- expect(nav_link(action: :bar)).not_to match(/active/)
- expect(nav_link(action: [:foo, :bar])).to match(/active/)
+ it 'performs checks on both controller and namespace' do
+ expect(nav_link(controller: 'foo/foo')).not_to match(/active/)
+ expect(nav_link(controller: 'bar/foo')).to match(/active/)
+ end
+
+ context 'with action param' do
+ it "performs checks on both namespace, controller and action when they are all present" do
+ expect(nav_link(controller: 'foo/foo', action: :foo)).not_to match(/active/)
+ expect(nav_link(controller: 'bar/foo', action: :bar)).not_to match(/active/)
+ expect(nav_link(controller: 'bar/foo', action: :foo)).to match(/active/)
+ end
+ end
+ end
end
- it "performs checks on both controller and action when both are present" do
- expect(nav_link(controller: :bar, action: :foo)).not_to match(/active/)
- expect(nav_link(controller: :foo, action: :bar)).not_to match(/active/)
- expect(nav_link(controller: :foo, action: :foo)).to match(/active/)
+ context 'with action param' do
+ it "performs checks on the current action" do
+ expect(nav_link(action: :foo)).to match(/<li class="active">/)
+ expect(nav_link(action: :bar)).not_to match(/active/)
+ expect(nav_link(action: [:foo, :bar])).to match(/active/)
+ end
end
- it "accepts a path shorthand" do
- expect(nav_link(path: 'foo#bar')).not_to match(/active/)
- expect(nav_link(path: 'foo#foo')).to match(/active/)
+ context 'with path param' do
+ it "accepts a path shorthand" do
+ expect(nav_link(path: 'foo#bar')).not_to match(/active/)
+ expect(nav_link(path: 'foo#foo')).to match(/active/)
+ end
+
+ context 'with namespace' do
+ before do
+ allow(controller).to receive(:controller_path).and_return('bar/foo')
+ end
+
+ it 'accepts a path shorthand with namespace' do
+ expect(nav_link(path: 'bar/foo#foo')).to match(/active/)
+ expect(nav_link(path: 'foo/foo#foo')).not_to match(/active/)
+ end
+ end
end
it "passes extra html options to the list element" do
diff --git a/spec/helpers/time_helper_spec.rb b/spec/helpers/time_helper_spec.rb
index 0b371d69ecf..8bf378549fe 100644
--- a/spec/helpers/time_helper_spec.rb
+++ b/spec/helpers/time_helper_spec.rb
@@ -20,18 +20,19 @@ describe TimeHelper do
end
describe "#duration_in_numbers" do
- it "returns minutes and seconds" do
- durations_and_expectations = {
- 100 => "01:40",
- 121 => "02:01",
- 3721 => "01:02:01",
- 0 => "00:00",
- 42 => "00:42"
- }
+ using RSpec::Parameterized::TableSyntax
- durations_and_expectations.each do |duration, expectation|
- expect(duration_in_numbers(duration)).to eq(expectation)
- end
+ where(:duration, :formatted_string) do
+ 0 | "00:00"
+ 1.second | "00:01"
+ 42.seconds | "00:42"
+ 2.minutes + 1.second | "02:01"
+ 3.hours + 2.minutes + 1.second | "03:02:01"
+ 30.hours | "30:00:00"
+ end
+
+ with_them do
+ it { expect(duration_in_numbers(duration)).to eq formatted_string }
end
end
end
diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb
index ffdf6561a53..ab4566e261b 100644
--- a/spec/helpers/tree_helper_spec.rb
+++ b/spec/helpers/tree_helper_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe TreeHelper do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
- let(:sha) { 'ce369011c189f62c815f5971d096b26759bab0d1' }
+ let(:sha) { 'c1c67abbaf91f624347bb3ae96eabe3a1b742478' }
describe '.render_tree' do
before do
@@ -32,6 +32,49 @@ describe TreeHelper do
end
end
+ describe '.fast_project_blob_path' do
+ it 'generates the same path as project_blob_path' do
+ blob_path = repository.tree(sha, 'with space').entries.first.path
+ fast_path = fast_project_blob_path(project, blob_path)
+ std_path = project_blob_path(project, blob_path)
+
+ expect(fast_path).to eq(std_path)
+ end
+
+ it 'generates the same path with encoded file names' do
+ tree = repository.tree(sha, 'encoding')
+ blob_path = tree.entries.find { |entry| entry.path == 'encoding/テスト.txt' }.path
+ fast_path = fast_project_blob_path(project, blob_path)
+ std_path = project_blob_path(project, blob_path)
+
+ expect(fast_path).to eq(std_path)
+ end
+
+ it 'respects a configured relative URL' do
+ allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
+ blob_path = repository.tree(sha, '').entries.first.path
+ fast_path = fast_project_blob_path(project, blob_path)
+
+ expect(fast_path).to start_with('/gitlab/root')
+ end
+ end
+
+ describe '.fast_project_tree_path' do
+ let(:tree_path) { repository.tree(sha, 'with space').path }
+ let(:fast_path) { fast_project_tree_path(project, tree_path) }
+ let(:std_path) { project_tree_path(project, tree_path) }
+
+ it 'generates the same path as project_tree_path' do
+ expect(fast_path).to eq(std_path)
+ end
+
+ it 'respects a configured relative URL' do
+ allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
+
+ expect(fast_path).to start_with('/gitlab/root')
+ end
+ end
+
describe 'flatten_tree' do
let(:tree) { repository.tree(sha, 'files') }
let(:root_path) { 'files' }
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index b079802cb81..34d9115a1f6 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -42,6 +42,30 @@ describe UsersHelper do
end
end
+ describe '#user_internal_regex_data' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:user_default_external, :user_default_internal_regex, :result) do
+ false | nil | { user_internal_regex_pattern: nil, user_internal_regex_options: nil }
+ false | '' | { user_internal_regex_pattern: nil, user_internal_regex_options: nil }
+ false | 'mockRegexPattern' | { user_internal_regex_pattern: nil, user_internal_regex_options: nil }
+ true | nil | { user_internal_regex_pattern: nil, user_internal_regex_options: nil }
+ true | '' | { user_internal_regex_pattern: nil, user_internal_regex_options: nil }
+ true | 'mockRegexPattern' | { user_internal_regex_pattern: 'mockRegexPattern', user_internal_regex_options: 'gi' }
+ end
+
+ with_them do
+ before do
+ stub_application_setting(user_default_external: user_default_external)
+ stub_application_setting(user_default_internal_regex: user_default_internal_regex)
+ end
+
+ subject { helper.user_internal_regex_data }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
describe '#current_user_menu_items' do
subject(:items) { helper.current_user_menu_items }
diff --git a/spec/helpers/visibility_level_helper_spec.rb b/spec/helpers/visibility_level_helper_spec.rb
index a3be222b7bd..e565ac8c530 100644
--- a/spec/helpers/visibility_level_helper_spec.rb
+++ b/spec/helpers/visibility_level_helper_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe VisibilityLevelHelper do
+ include ProjectForksHelper
+
let(:project) { build(:project) }
let(:group) { build(:group) }
let(:personal_snippet) { build(:personal_snippet) }
@@ -83,13 +85,13 @@ describe VisibilityLevelHelper do
describe "disallowed_visibility_level?" do
describe "forks" do
- let(:project) { create(:project, :internal) }
- let(:fork_project) { create(:project, forked_from_project: project) }
+ let(:project) { create(:project, :internal) }
+ let(:forked_project) { fork_project(project) }
it "disallows levels" do
- expect(disallowed_visibility_level?(fork_project, Gitlab::VisibilityLevel::PUBLIC)).to be_truthy
- expect(disallowed_visibility_level?(fork_project, Gitlab::VisibilityLevel::INTERNAL)).to be_falsey
- expect(disallowed_visibility_level?(fork_project, Gitlab::VisibilityLevel::PRIVATE)).to be_falsey
+ expect(disallowed_visibility_level?(forked_project, Gitlab::VisibilityLevel::PUBLIC)).to be_truthy
+ expect(disallowed_visibility_level?(forked_project, Gitlab::VisibilityLevel::INTERNAL)).to be_falsey
+ expect(disallowed_visibility_level?(forked_project, Gitlab::VisibilityLevel::PRIVATE)).to be_falsey
end
end
diff --git a/spec/javascripts/.eslintrc.yml b/spec/javascripts/.eslintrc.yml
index 5525c9f5bd0..b863156b57c 100644
--- a/spec/javascripts/.eslintrc.yml
+++ b/spec/javascripts/.eslintrc.yml
@@ -35,3 +35,5 @@ rules:
- error
- ignore:
- 'fixtures/blob'
+ # Temporarily disabled to facilitate an upgrade to eslint-plugin-jasmine
+ jasmine/prefer-toHaveBeenCalledWith: off
diff --git a/spec/javascripts/ajax_loading_spinner_spec.js b/spec/javascripts/ajax_loading_spinner_spec.js
index 261375d3a0e..9389fc94f17 100644
--- a/spec/javascripts/ajax_loading_spinner_spec.js
+++ b/spec/javascripts/ajax_loading_spinner_spec.js
@@ -10,8 +10,8 @@ describe('Ajax Loading Spinner', () => {
AjaxLoadingSpinner.init();
});
- it('change current icon with spinner icon and disable link while waiting ajax response', (done) => {
- spyOn($, 'ajax').and.callFake((req) => {
+ it('change current icon with spinner icon and disable link while waiting ajax response', done => {
+ spyOn($, 'ajax').and.callFake(req => {
const xhr = new XMLHttpRequest();
const ajaxLoadingSpinner = document.querySelector('.js-ajax-loading-spinner');
const icon = ajaxLoadingSpinner.querySelector('i');
@@ -33,8 +33,8 @@ describe('Ajax Loading Spinner', () => {
document.querySelector('.js-ajax-loading-spinner').click();
});
- it('use original icon again and enabled the link after complete the ajax request', (done) => {
- spyOn($, 'ajax').and.callFake((req) => {
+ it('use original icon again and enabled the link after complete the ajax request', done => {
+ spyOn($, 'ajax').and.callFake(req => {
const xhr = new XMLHttpRequest();
const ajaxLoadingSpinner = document.querySelector('.js-ajax-loading-spinner');
@@ -42,6 +42,7 @@ describe('Ajax Loading Spinner', () => {
req.complete({});
const icon = ajaxLoadingSpinner.querySelector('i');
+
expect(icon).toHaveClass('fa-trash-o');
expect(icon).not.toHaveClass('fa-spinner');
expect(icon).not.toHaveClass('fa-spin');
diff --git a/spec/javascripts/api_spec.js b/spec/javascripts/api_spec.js
index 54cb6d84109..091edf13cfe 100644
--- a/spec/javascripts/api_spec.js
+++ b/spec/javascripts/api_spec.js
@@ -250,71 +250,45 @@ describe('Api', () => {
});
});
- describe('licenseText', () => {
- it('fetches a license text', done => {
- const licenseKey = "driver's license";
- const data = { unused: 'option' };
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/licenses/${licenseKey}`;
+ describe('issueTemplate', () => {
+ it('fetches an issue template', done => {
+ const namespace = 'some namespace';
+ const project = 'some project';
+ const templateKey = ' template #%?.key ';
+ const templateType = 'template type';
+ const expectedUrl = `${dummyUrlRoot}/${namespace}/${project}/templates/${templateType}/${encodeURIComponent(
+ templateKey,
+ )}`;
mock.onGet(expectedUrl).reply(200, 'test');
- Api.licenseText(licenseKey, data, response => {
+ Api.issueTemplate(namespace, project, templateKey, templateType, (error, response) => {
expect(response).toBe('test');
done();
});
});
});
- describe('gitignoreText', () => {
- it('fetches a gitignore text', done => {
- const gitignoreKey = 'ignore git';
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/gitignores/${gitignoreKey}`;
- mock.onGet(expectedUrl).reply(200, 'test');
-
- Api.gitignoreText(gitignoreKey, response => {
- expect(response).toBe('test');
- done();
- });
- });
- });
+ describe('projectTemplates', () => {
+ it('fetches a list of templates', done => {
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses`;
- describe('gitlabCiYml', () => {
- it('fetches a .gitlab-ci.yml', done => {
- const gitlabCiYmlKey = 'Y CI ML';
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/gitlab_ci_ymls/${gitlabCiYmlKey}`;
mock.onGet(expectedUrl).reply(200, 'test');
- Api.gitlabCiYml(gitlabCiYmlKey, response => {
+ Api.projectTemplates('gitlab-org/gitlab-ce', 'licenses', {}, response => {
expect(response).toBe('test');
done();
});
});
});
- describe('dockerfileYml', () => {
- it('fetches a Dockerfile', done => {
- const dockerfileYmlKey = 'a giant whale';
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/dockerfiles/${dockerfileYmlKey}`;
- mock.onGet(expectedUrl).reply(200, 'test');
-
- Api.dockerfileYml(dockerfileYmlKey, response => {
- expect(response).toBe('test');
- done();
- });
- });
- });
+ describe('projectTemplate', () => {
+ it('fetches a single template', done => {
+ const data = { unused: 'option' };
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses/test%20license`;
- describe('issueTemplate', () => {
- it('fetches an issue template', done => {
- const namespace = 'some namespace';
- const project = 'some project';
- const templateKey = ' template #%?.key ';
- const templateType = 'template type';
- const expectedUrl = `${dummyUrlRoot}/${namespace}/${project}/templates/${templateType}/${encodeURIComponent(
- templateKey,
- )}`;
mock.onGet(expectedUrl).reply(200, 'test');
- Api.issueTemplate(namespace, project, templateKey, templateType, (error, response) => {
+ Api.projectTemplate('gitlab-org/gitlab-ce', 'licenses', 'test license', data, response => {
expect(response).toBe('test');
done();
});
diff --git a/spec/javascripts/avatar_helper_spec.js b/spec/javascripts/avatar_helper_spec.js
index b2f80678ae7..c1ef08e0f1b 100644
--- a/spec/javascripts/avatar_helper_spec.js
+++ b/spec/javascripts/avatar_helper_spec.js
@@ -21,7 +21,7 @@ describe('avatar_helper', () => {
it(`wraps around if id is bigger than ${IDENTICON_BG_COUNT}`, () => {
expect(getIdenticonBackgroundClass(IDENTICON_BG_COUNT + 4)).toEqual('bg5');
- expect(getIdenticonBackgroundClass((IDENTICON_BG_COUNT * 5) + 6)).toEqual('bg7');
+ expect(getIdenticonBackgroundClass(IDENTICON_BG_COUNT * 5 + 6)).toEqual('bg7');
});
});
diff --git a/spec/javascripts/awards_handler_spec.js b/spec/javascripts/awards_handler_spec.js
index ada26b37f4a..ce5d2022441 100644
--- a/spec/javascripts/awards_handler_spec.js
+++ b/spec/javascripts/awards_handler_spec.js
@@ -1,382 +1,400 @@
-/* eslint-disable no-var, one-var, one-var-declaration-per-line, no-unused-expressions, no-unused-vars, prefer-template, max-len */
-
import $ from 'jquery';
import Cookies from 'js-cookie';
import loadAwardsHandler from '~/awards_handler';
-
import '~/lib/utils/common_utils';
-(function() {
- var awardsHandler, lazyAssert, urlRoot, openAndWaitForEmojiMenu;
+window.gl = window.gl || {};
+window.gon = window.gon || {};
- awardsHandler = null;
+let openAndWaitForEmojiMenu;
+let awardsHandler = null;
+const urlRoot = gon.relative_url_root;
- window.gl || (window.gl = {});
+const lazyAssert = function(done, assertFn) {
+ setTimeout(function() {
+ assertFn();
+ done();
+ // Maybe jasmine.clock here?
+ }, 333);
+};
- window.gon || (window.gon = {});
+describe('AwardsHandler', function() {
+ preloadFixtures('snippets/show.html.raw');
+ beforeEach(function(done) {
+ loadFixtures('snippets/show.html.raw');
+ loadAwardsHandler(true)
+ .then(obj => {
+ awardsHandler = obj;
+ spyOn(awardsHandler, 'postEmoji').and.callFake((button, url, emoji, cb) => cb());
+ done();
+ })
+ .catch(fail);
- urlRoot = gon.relative_url_root;
+ let isEmojiMenuBuilt = false;
+ openAndWaitForEmojiMenu = function() {
+ return new Promise(resolve => {
+ if (isEmojiMenuBuilt) {
+ resolve();
+ } else {
+ $('.js-add-award')
+ .eq(0)
+ .click();
+ const $menu = $('.emoji-menu');
+ $menu.one('build-emoji-menu-finish', () => {
+ isEmojiMenuBuilt = true;
+ resolve();
+ });
+ }
+ });
+ };
+ });
- lazyAssert = function(done, assertFn) {
- return setTimeout(function() {
- assertFn();
- return done();
- // Maybe jasmine.clock here?
- }, 333);
- };
+ afterEach(function() {
+ // restore original url root value
+ gon.relative_url_root = urlRoot;
- describe('AwardsHandler', function() {
- preloadFixtures('snippets/show.html.raw');
- beforeEach(function(done) {
- loadFixtures('snippets/show.html.raw');
- loadAwardsHandler(true)
- .then(obj => {
- awardsHandler = obj;
- spyOn(awardsHandler, 'postEmoji').and.callFake((button, url, emoji, cb) => cb());
- done();
- })
- .catch(fail);
+ // Undo what we did to the shared <body>
+ $('body').removeAttr('data-page');
- let isEmojiMenuBuilt = false;
- openAndWaitForEmojiMenu = function() {
- return new Promise((resolve, reject) => {
- if (isEmojiMenuBuilt) {
- resolve();
- } else {
- $('.js-add-award')
- .eq(0)
- .click();
- const $menu = $('.emoji-menu');
- $menu.one('build-emoji-menu-finish', () => {
- isEmojiMenuBuilt = true;
- resolve();
- });
- }
- });
- };
- });
- afterEach(function() {
- // restore original url root value
- gon.relative_url_root = urlRoot;
+ awardsHandler.destroy();
+ });
- // Undo what we did to the shared <body>
- $('body').removeAttr('data-page');
+ describe('::showEmojiMenu', function() {
+ it('should show emoji menu when Add emoji button clicked', function(done) {
+ $('.js-add-award')
+ .eq(0)
+ .click();
+ lazyAssert(done, function() {
+ const $emojiMenu = $('.emoji-menu');
- awardsHandler.destroy();
- });
- describe('::showEmojiMenu', function() {
- it('should show emoji menu when Add emoji button clicked', function(done) {
- $('.js-add-award')
- .eq(0)
- .click();
- return lazyAssert(done, function() {
- var $emojiMenu;
- $emojiMenu = $('.emoji-menu');
- expect($emojiMenu.length).toBe(1);
- expect($emojiMenu.hasClass('is-visible')).toBe(true);
- expect($emojiMenu.find('.js-emoji-menu-search').length).toBe(1);
- return expect($('.js-awards-block.current').length).toBe(1);
- });
- });
- it('should also show emoji menu for the smiley icon in notes', function(done) {
- $('.js-add-award.note-action-button').click();
- return lazyAssert(done, function() {
- var $emojiMenu = $('.emoji-menu');
- return expect($emojiMenu.length).toBe(1);
- });
- });
- it('should remove emoji menu when body is clicked', function(done) {
- $('.js-add-award')
- .eq(0)
- .click();
- return lazyAssert(done, function() {
- var $emojiMenu;
- $emojiMenu = $('.emoji-menu');
- $('body').click();
- expect($emojiMenu.length).toBe(1);
- expect($emojiMenu.hasClass('is-visible')).toBe(false);
- return expect($('.js-awards-block.current').length).toBe(0);
- });
- });
- it('should not remove emoji menu when search is clicked', function(done) {
- $('.js-add-award')
- .eq(0)
- .click();
- return lazyAssert(done, function() {
- var $emojiMenu;
- $emojiMenu = $('.emoji-menu');
- $('.emoji-search').click();
- expect($emojiMenu.length).toBe(1);
- expect($emojiMenu.hasClass('is-visible')).toBe(true);
- return expect($('.js-awards-block.current').length).toBe(1);
- });
+ expect($emojiMenu.length).toBe(1);
+ expect($emojiMenu.hasClass('is-visible')).toBe(true);
+ expect($emojiMenu.find('.js-emoji-menu-search').length).toBe(1);
+ expect($('.js-awards-block.current').length).toBe(1);
});
});
- describe('::addAwardToEmojiBar', function() {
- it('should add emoji to votes block', function() {
- var $emojiButton, $votesBlock;
- $votesBlock = $('.js-awards-block').eq(0);
- awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
- $emojiButton = $votesBlock.find('[data-name=heart]');
- expect($emojiButton.length).toBe(1);
- expect($emojiButton.next('.js-counter').text()).toBe('1');
- return expect($votesBlock.hasClass('hidden')).toBe(false);
- });
- it('should remove the emoji when we click again', function() {
- var $emojiButton, $votesBlock;
- $votesBlock = $('.js-awards-block').eq(0);
- awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
- awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
- $emojiButton = $votesBlock.find('[data-name=heart]');
- return expect($emojiButton.length).toBe(0);
- });
- return it('should decrement the emoji counter', function() {
- var $emojiButton, $votesBlock;
- $votesBlock = $('.js-awards-block').eq(0);
- awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
- $emojiButton = $votesBlock.find('[data-name=heart]');
- $emojiButton.next('.js-counter').text(5);
- awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
- expect($emojiButton.length).toBe(1);
- return expect($emojiButton.next('.js-counter').text()).toBe('4');
+ it('should also show emoji menu for the smiley icon in notes', function(done) {
+ $('.js-add-award.note-action-button').click();
+ lazyAssert(done, function() {
+ const $emojiMenu = $('.emoji-menu');
+
+ expect($emojiMenu.length).toBe(1);
});
});
- describe('::userAuthored', function() {
- it('should update tooltip to user authored title', function() {
- var $thumbsUpEmoji, $votesBlock;
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'sam');
- awardsHandler.userAuthored($thumbsUpEmoji);
- return expect($thumbsUpEmoji.data('originalTitle')).toBe(
- 'You cannot vote on your own issue, MR and note',
- );
- });
- it('should restore tooltip back to initial vote list', function() {
- var $thumbsUpEmoji, $votesBlock;
- jasmine.clock().install();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'sam');
- awardsHandler.userAuthored($thumbsUpEmoji);
- jasmine.clock().tick(2801);
- jasmine.clock().uninstall();
- return expect($thumbsUpEmoji.data('originalTitle')).toBe('sam');
+
+ it('should remove emoji menu when body is clicked', function(done) {
+ $('.js-add-award')
+ .eq(0)
+ .click();
+ lazyAssert(done, function() {
+ const $emojiMenu = $('.emoji-menu');
+ $('body').click();
+
+ expect($emojiMenu.length).toBe(1);
+ expect($emojiMenu.hasClass('is-visible')).toBe(false);
+ expect($('.js-awards-block.current').length).toBe(0);
});
});
- describe('::getAwardUrl', function() {
- return it('returns the url for request', function() {
- return expect(awardsHandler.getAwardUrl()).toBe(
- 'http://test.host/snippets/1/toggle_award_emoji',
- );
+
+ it('should not remove emoji menu when search is clicked', function(done) {
+ $('.js-add-award')
+ .eq(0)
+ .click();
+ lazyAssert(done, function() {
+ const $emojiMenu = $('.emoji-menu');
+ $('.emoji-search').click();
+
+ expect($emojiMenu.length).toBe(1);
+ expect($emojiMenu.hasClass('is-visible')).toBe(true);
+ expect($('.js-awards-block.current').length).toBe(1);
});
});
- describe('::addAward and ::checkMutuality', function() {
- return it('should handle :+1: and :-1: mutuality', function() {
- var $thumbsDownEmoji, $thumbsUpEmoji, $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsDownEmoji = $votesBlock.find('[data-name=thumbsdown]').parent();
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- expect($thumbsUpEmoji.hasClass('active')).toBe(true);
- expect($thumbsDownEmoji.hasClass('active')).toBe(false);
- $thumbsUpEmoji.tooltip();
- $thumbsDownEmoji.tooltip();
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsdown', true);
- expect($thumbsUpEmoji.hasClass('active')).toBe(false);
- return expect($thumbsDownEmoji.hasClass('active')).toBe(true);
- });
+ });
+
+ describe('::addAwardToEmojiBar', function() {
+ it('should add emoji to votes block', function() {
+ const $votesBlock = $('.js-awards-block').eq(0);
+ awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
+ const $emojiButton = $votesBlock.find('[data-name=heart]');
+
+ expect($emojiButton.length).toBe(1);
+ expect($emojiButton.next('.js-counter').text()).toBe('1');
+ expect($votesBlock.hasClass('hidden')).toBe(false);
});
- describe('::removeEmoji', function() {
- return it('should remove emoji', function() {
- var $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- awardsHandler.addAward($votesBlock, awardUrl, 'fire', false);
- expect($votesBlock.find('[data-name=fire]').length).toBe(1);
- awardsHandler.removeEmoji($votesBlock.find('[data-name=fire]').closest('button'));
- return expect($votesBlock.find('[data-name=fire]').length).toBe(0);
- });
+
+ it('should remove the emoji when we click again', function() {
+ const $votesBlock = $('.js-awards-block').eq(0);
+ awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
+ awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
+ const $emojiButton = $votesBlock.find('[data-name=heart]');
+
+ expect($emojiButton.length).toBe(0);
});
- describe('::addYouToUserList', function() {
- it('should prepend "You" to the award tooltip', function() {
- var $thumbsUpEmoji, $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'sam, jerry, max, and andy');
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- return expect($thumbsUpEmoji.data('originalTitle')).toBe('You, sam, jerry, max, and andy');
- });
- return it('handles the special case where "You" is not cleanly comma seperated', function() {
- var $thumbsUpEmoji, $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'sam');
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- return expect($thumbsUpEmoji.data('originalTitle')).toBe('You and sam');
- });
+
+ it('should decrement the emoji counter', function() {
+ const $votesBlock = $('.js-awards-block').eq(0);
+ awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
+ const $emojiButton = $votesBlock.find('[data-name=heart]');
+ $emojiButton.next('.js-counter').text(5);
+ awardsHandler.addAwardToEmojiBar($votesBlock, 'heart', false);
+
+ expect($emojiButton.length).toBe(1);
+ expect($emojiButton.next('.js-counter').text()).toBe('4');
});
- describe('::removeYouToUserList', function() {
- it('removes "You" from the front of the tooltip', function() {
- var $thumbsUpEmoji, $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'You, sam, jerry, max, and andy');
- $thumbsUpEmoji.addClass('active');
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- return expect($thumbsUpEmoji.data('originalTitle')).toBe('sam, jerry, max, and andy');
- });
- return it('handles the special case where "You" is not cleanly comma seperated', function() {
- var $thumbsUpEmoji, $votesBlock, awardUrl;
- awardUrl = awardsHandler.getAwardUrl();
- $votesBlock = $('.js-awards-block').eq(0);
- $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
- $thumbsUpEmoji.attr('data-title', 'You and sam');
- $thumbsUpEmoji.addClass('active');
- awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- return expect($thumbsUpEmoji.data('originalTitle')).toBe('sam');
- });
+ });
+
+ describe('::userAuthored', function() {
+ it('should update tooltip to user authored title', function() {
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'sam');
+ awardsHandler.userAuthored($thumbsUpEmoji);
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe(
+ 'You cannot vote on your own issue, MR and note',
+ );
});
- describe('::searchEmojis', () => {
- it('should filter the emoji', function(done) {
- return openAndWaitForEmojiMenu()
- .then(() => {
- expect($('[data-name=angel]').is(':visible')).toBe(true);
- expect($('[data-name=anger]').is(':visible')).toBe(true);
- awardsHandler.searchEmojis('ali');
- expect($('[data-name=angel]').is(':visible')).toBe(false);
- expect($('[data-name=anger]').is(':visible')).toBe(false);
- expect($('[data-name=alien]').is(':visible')).toBe(true);
- expect($('.js-emoji-menu-search').val()).toBe('ali');
- })
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
- });
- });
- it('should clear the search when searching for nothing', function(done) {
- return openAndWaitForEmojiMenu()
- .then(() => {
- awardsHandler.searchEmojis('ali');
- expect($('[data-name=angel]').is(':visible')).toBe(false);
- expect($('[data-name=anger]').is(':visible')).toBe(false);
- expect($('[data-name=alien]').is(':visible')).toBe(true);
- awardsHandler.searchEmojis('');
- expect($('[data-name=angel]').is(':visible')).toBe(true);
- expect($('[data-name=anger]').is(':visible')).toBe(true);
- expect($('[data-name=alien]').is(':visible')).toBe(true);
- expect($('.js-emoji-menu-search').val()).toBe('');
- })
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
- });
+
+ it('should restore tooltip back to initial vote list', function() {
+ jasmine.clock().install();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'sam');
+ awardsHandler.userAuthored($thumbsUpEmoji);
+ jasmine.clock().tick(2801);
+ jasmine.clock().uninstall();
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe('sam');
+ });
+ });
+
+ describe('::getAwardUrl', function() {
+ it('returns the url for request', function() {
+ expect(awardsHandler.getAwardUrl()).toBe('http://test.host/snippets/1/toggle_award_emoji');
+ });
+ });
+
+ describe('::addAward and ::checkMutuality', function() {
+ it('should handle :+1: and :-1: mutuality', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ const $thumbsDownEmoji = $votesBlock.find('[data-name=thumbsdown]').parent();
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
+
+ expect($thumbsUpEmoji.hasClass('active')).toBe(true);
+ expect($thumbsDownEmoji.hasClass('active')).toBe(false);
+ $thumbsUpEmoji.tooltip();
+ $thumbsDownEmoji.tooltip();
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsdown', true);
+
+ expect($thumbsUpEmoji.hasClass('active')).toBe(false);
+ expect($thumbsDownEmoji.hasClass('active')).toBe(true);
+ });
+ });
+
+ describe('::removeEmoji', function() {
+ it('should remove emoji', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ awardsHandler.addAward($votesBlock, awardUrl, 'fire', false);
+
+ expect($votesBlock.find('[data-name=fire]').length).toBe(1);
+ awardsHandler.removeEmoji($votesBlock.find('[data-name=fire]').closest('button'));
+
+ expect($votesBlock.find('[data-name=fire]').length).toBe(0);
+ });
+ });
+
+ describe('::addYouToUserList', function() {
+ it('should prepend "You" to the award tooltip', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'sam, jerry, max, and andy');
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
+ $thumbsUpEmoji.tooltip();
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe('You, sam, jerry, max, and andy');
+ });
+
+ it('handles the special case where "You" is not cleanly comma separated', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'sam');
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
+ $thumbsUpEmoji.tooltip();
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe('You and sam');
+ });
+ });
+
+ describe('::removeYouToUserList', function() {
+ it('removes "You" from the front of the tooltip', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'You, sam, jerry, max, and andy');
+ $thumbsUpEmoji.addClass('active');
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
+ $thumbsUpEmoji.tooltip();
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe('sam, jerry, max, and andy');
+ });
+
+ it('handles the special case where "You" is not cleanly comma separated', function() {
+ const awardUrl = awardsHandler.getAwardUrl();
+ const $votesBlock = $('.js-awards-block').eq(0);
+ const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
+ $thumbsUpEmoji.attr('data-title', 'You and sam');
+ $thumbsUpEmoji.addClass('active');
+ awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
+ $thumbsUpEmoji.tooltip();
+
+ expect($thumbsUpEmoji.data('originalTitle')).toBe('sam');
+ });
+ });
+
+ describe('::searchEmojis', () => {
+ it('should filter the emoji', function(done) {
+ openAndWaitForEmojiMenu()
+ .then(() => {
+ expect($('[data-name=angel]').is(':visible')).toBe(true);
+ expect($('[data-name=anger]').is(':visible')).toBe(true);
+ awardsHandler.searchEmojis('ali');
+
+ expect($('[data-name=angel]').is(':visible')).toBe(false);
+ expect($('[data-name=anger]').is(':visible')).toBe(false);
+ expect($('[data-name=alien]').is(':visible')).toBe(true);
+ expect($('.js-emoji-menu-search').val()).toBe('ali');
+ })
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ });
+ });
+
+ it('should clear the search when searching for nothing', function(done) {
+ openAndWaitForEmojiMenu()
+ .then(() => {
+ awardsHandler.searchEmojis('ali');
+
+ expect($('[data-name=angel]').is(':visible')).toBe(false);
+ expect($('[data-name=anger]').is(':visible')).toBe(false);
+ expect($('[data-name=alien]').is(':visible')).toBe(true);
+ awardsHandler.searchEmojis('');
+
+ expect($('[data-name=angel]').is(':visible')).toBe(true);
+ expect($('[data-name=anger]').is(':visible')).toBe(true);
+ expect($('[data-name=alien]').is(':visible')).toBe(true);
+ expect($('.js-emoji-menu-search').val()).toBe('');
+ })
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ });
+ });
+ });
+
+ describe('emoji menu', function() {
+ const emojiSelector = '[data-name="sunglasses"]';
+ const openEmojiMenuAndAddEmoji = function() {
+ return openAndWaitForEmojiMenu().then(() => {
+ const $menu = $('.emoji-menu');
+ const $block = $('.js-awards-block');
+ const $emoji = $menu.find(`.emoji-menu-list:not(.frequent-emojis) ${emojiSelector}`);
+
+ expect($emoji.length).toBe(1);
+ expect($block.find(emojiSelector).length).toBe(0);
+ $emoji.click();
+
+ expect($menu.hasClass('.is-visible')).toBe(false);
+ expect($block.find(emojiSelector).length).toBe(1);
});
+ };
+
+ it('should add selected emoji to awards block', function(done) {
+ openEmojiMenuAndAddEmoji()
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ });
});
- describe('emoji menu', function() {
- const emojiSelector = '[data-name="sunglasses"]';
- const openEmojiMenuAndAddEmoji = function() {
- return openAndWaitForEmojiMenu().then(() => {
- const $menu = $('.emoji-menu');
+ it('should remove already selected emoji', function(done) {
+ openEmojiMenuAndAddEmoji()
+ .then(() => {
+ $('.js-add-award')
+ .eq(0)
+ .click();
const $block = $('.js-awards-block');
- const $emoji = $menu.find('.emoji-menu-list:not(.frequent-emojis) ' + emojiSelector);
+ const $emoji = $('.emoji-menu').find(
+ `.emoji-menu-list:not(.frequent-emojis) ${emojiSelector}`,
+ );
+ $emoji.click();
- expect($emoji.length).toBe(1);
expect($block.find(emojiSelector).length).toBe(0);
- $emoji.click();
- expect($menu.hasClass('.is-visible')).toBe(false);
- expect($block.find(emojiSelector).length).toBe(1);
+ })
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
});
- };
- it('should add selected emoji to awards block', function(done) {
- return openEmojiMenuAndAddEmoji()
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
- });
- });
- it('should remove already selected emoji', function(done) {
- return openEmojiMenuAndAddEmoji()
- .then(() => {
- $('.js-add-award')
- .eq(0)
- .click();
- const $block = $('.js-awards-block');
- const $emoji = $('.emoji-menu').find(
- `.emoji-menu-list:not(.frequent-emojis) ${emojiSelector}`,
- );
- $emoji.click();
- expect($block.find(emojiSelector).length).toBe(0);
- })
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
- });
- });
});
+ });
- describe('frequently used emojis', function() {
- beforeEach(() => {
- // Clear it out
- Cookies.set('frequently_used_emojis', '');
- });
+ describe('frequently used emojis', function() {
+ beforeEach(() => {
+ // Clear it out
+ Cookies.set('frequently_used_emojis', '');
+ });
- it('shouldn\'t have any "Frequently used" heading if no frequently used emojis', function(done) {
- return openAndWaitForEmojiMenu()
- .then(() => {
- const emojiMenu = document.querySelector('.emoji-menu');
- Array.prototype.forEach.call(emojiMenu.querySelectorAll('.emoji-menu-title'), title => {
- expect(title.textContent.trim().toLowerCase()).not.toBe('frequently used');
- });
- })
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ it('shouldn\'t have any "Frequently used" heading if no frequently used emojis', function(done) {
+ return openAndWaitForEmojiMenu()
+ .then(() => {
+ const emojiMenu = document.querySelector('.emoji-menu');
+ Array.prototype.forEach.call(emojiMenu.querySelectorAll('.emoji-menu-title'), title => {
+ expect(title.textContent.trim().toLowerCase()).not.toBe('frequently used');
});
- });
+ })
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ });
+ });
- it('should have any frequently used section when there are frequently used emojis', function(done) {
- awardsHandler.addEmojiToFrequentlyUsedList('8ball');
-
- return openAndWaitForEmojiMenu()
- .then(() => {
- const emojiMenu = document.querySelector('.emoji-menu');
- const hasFrequentlyUsedHeading = Array.prototype.some.call(
- emojiMenu.querySelectorAll('.emoji-menu-title'),
- title => title.textContent.trim().toLowerCase() === 'frequently used',
- );
-
- expect(hasFrequentlyUsedHeading).toBe(true);
- })
- .then(done)
- .catch(err => {
- done.fail(`Failed to open and build emoji menu: ${err.message}`);
- });
- });
+ it('should have any frequently used section when there are frequently used emojis', function(done) {
+ awardsHandler.addEmojiToFrequentlyUsedList('8ball');
- it('should disregard invalid frequently used emoji that are being attempted to be added', function() {
- awardsHandler.addEmojiToFrequentlyUsedList('8ball');
- awardsHandler.addEmojiToFrequentlyUsedList('invalid_emoji');
- awardsHandler.addEmojiToFrequentlyUsedList('grinning');
+ return openAndWaitForEmojiMenu()
+ .then(() => {
+ const emojiMenu = document.querySelector('.emoji-menu');
+ const hasFrequentlyUsedHeading = Array.prototype.some.call(
+ emojiMenu.querySelectorAll('.emoji-menu-title'),
+ title => title.textContent.trim().toLowerCase() === 'frequently used',
+ );
- expect(awardsHandler.getFrequentlyUsedEmojis()).toEqual(['8ball', 'grinning']);
- });
+ expect(hasFrequentlyUsedHeading).toBe(true);
+ })
+ .then(done)
+ .catch(err => {
+ done.fail(`Failed to open and build emoji menu: ${err.message}`);
+ });
+ });
- it('should disregard invalid frequently used emoji already set in cookie', function() {
- Cookies.set('frequently_used_emojis', '8ball,invalid_emoji,grinning');
+ it('should disregard invalid frequently used emoji that are being attempted to be added', function() {
+ awardsHandler.addEmojiToFrequentlyUsedList('8ball');
+ awardsHandler.addEmojiToFrequentlyUsedList('invalid_emoji');
+ awardsHandler.addEmojiToFrequentlyUsedList('grinning');
- expect(awardsHandler.getFrequentlyUsedEmojis()).toEqual(['8ball', 'grinning']);
- });
+ expect(awardsHandler.getFrequentlyUsedEmojis()).toEqual(['8ball', 'grinning']);
+ });
+
+ it('should disregard invalid frequently used emoji already set in cookie', function() {
+ Cookies.set('frequently_used_emojis', '8ball,invalid_emoji,grinning');
+
+ expect(awardsHandler.getFrequentlyUsedEmojis()).toEqual(['8ball', 'grinning']);
});
});
-}.call(window));
+});
diff --git a/spec/javascripts/badges/components/badge_form_spec.js b/spec/javascripts/badges/components/badge_form_spec.js
index dd21ec279cb..651ac3ba3f9 100644
--- a/spec/javascripts/badges/components/badge_form_spec.js
+++ b/spec/javascripts/badges/components/badge_form_spec.js
@@ -1,21 +1,31 @@
import Vue from 'vue';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
import store from '~/badges/store';
+import createEmptyBadge from '~/badges/empty_badge';
import BadgeForm from '~/badges/components/badge_form.vue';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createDummyBadge } from '../dummy_badge';
+import { DUMMY_IMAGE_URL, TEST_HOST } from '../../test_constants';
+
+// avoid preview background process
+BadgeForm.methods.debouncedPreview = () => {};
describe('BadgeForm component', () => {
const Component = Vue.extend(BadgeForm);
+ let axiosMock;
let vm;
beforeEach(() => {
setFixtures(`
<div id="dummy-element"></div>
`);
+
+ axiosMock = new MockAdapter(axios);
});
afterEach(() => {
vm.$destroy();
+ axiosMock.restore();
});
describe('methods', () => {
@@ -38,93 +48,92 @@ describe('BadgeForm component', () => {
expect(vm.stopEditing).toHaveBeenCalled();
});
});
+ });
- describe('onSubmit', () => {
- describe('if isEditing is true', () => {
- beforeEach(() => {
- spyOn(vm, 'saveBadge').and.returnValue(Promise.resolve());
- store.replaceState({
- ...store.state,
- isSaving: false,
- badgeInEditForm: createDummyBadge(),
- });
- vm.isEditing = true;
- });
-
- it('returns immediately if imageUrl is empty', () => {
- store.state.badgeInEditForm.imageUrl = '';
-
- vm.onSubmit();
-
- expect(vm.saveBadge).not.toHaveBeenCalled();
- });
+ const sharedSubmitTests = submitAction => {
+ const imageUrlSelector = '#badge-image-url';
+ const findImageUrlElement = () => vm.$el.querySelector(imageUrlSelector);
+ const linkUrlSelector = '#badge-link-url';
+ const findLinkUrlElement = () => vm.$el.querySelector(linkUrlSelector);
+ const setValue = (inputElementSelector, url) => {
+ const inputElement = vm.$el.querySelector(inputElementSelector);
+ inputElement.value = url;
+ inputElement.dispatchEvent(new Event('input'));
+ };
+ const submitForm = () => {
+ const submitButton = vm.$el.querySelector('button[type="submit"]');
+ submitButton.click();
+ };
+ const expectInvalidInput = inputElementSelector => {
+ const inputElement = vm.$el.querySelector(inputElementSelector);
+
+ expect(inputElement).toBeMatchedBy(':invalid');
+ const feedbackElement = vm.$el.querySelector(`${inputElementSelector} + .invalid-feedback`);
+
+ expect(feedbackElement).toBeVisible();
+ };
- it('returns immediately if linkUrl is empty', () => {
- store.state.badgeInEditForm.linkUrl = '';
+ beforeEach(() => {
+ spyOn(vm, submitAction).and.returnValue(Promise.resolve());
+ store.replaceState({
+ ...store.state,
+ badgeInAddForm: createEmptyBadge(),
+ badgeInEditForm: createEmptyBadge(),
+ isSaving: false,
+ });
- vm.onSubmit();
+ setValue(linkUrlSelector, `${TEST_HOST}/link/url`);
+ setValue(imageUrlSelector, `${window.location.origin}${DUMMY_IMAGE_URL}`);
+ });
- expect(vm.saveBadge).not.toHaveBeenCalled();
- });
+ it('returns immediately if imageUrl is empty', () => {
+ setValue(imageUrlSelector, '');
- it('returns immediately if isSaving is true', () => {
- store.state.isSaving = true;
+ submitForm();
- vm.onSubmit();
+ expectInvalidInput(imageUrlSelector);
- expect(vm.saveBadge).not.toHaveBeenCalled();
- });
+ expect(vm[submitAction]).not.toHaveBeenCalled();
+ });
- it('calls saveBadge', () => {
- vm.onSubmit();
+ it('returns immediately if imageUrl is malformed', () => {
+ setValue(imageUrlSelector, 'not-a-url');
- expect(vm.saveBadge).toHaveBeenCalled();
- });
- });
+ submitForm();
- describe('if isEditing is false', () => {
- beforeEach(() => {
- spyOn(vm, 'addBadge').and.returnValue(Promise.resolve());
- store.replaceState({
- ...store.state,
- isSaving: false,
- badgeInAddForm: createDummyBadge(),
- });
- vm.isEditing = false;
- });
+ expectInvalidInput(imageUrlSelector);
- it('returns immediately if imageUrl is empty', () => {
- store.state.badgeInAddForm.imageUrl = '';
+ expect(vm[submitAction]).not.toHaveBeenCalled();
+ });
- vm.onSubmit();
+ it('returns immediately if linkUrl is empty', () => {
+ setValue(linkUrlSelector, '');
- expect(vm.addBadge).not.toHaveBeenCalled();
- });
+ submitForm();
- it('returns immediately if linkUrl is empty', () => {
- store.state.badgeInAddForm.linkUrl = '';
+ expectInvalidInput(linkUrlSelector);
- vm.onSubmit();
+ expect(vm[submitAction]).not.toHaveBeenCalled();
+ });
- expect(vm.addBadge).not.toHaveBeenCalled();
- });
+ it('returns immediately if linkUrl is malformed', () => {
+ setValue(linkUrlSelector, 'not-a-url');
- it('returns immediately if isSaving is true', () => {
- store.state.isSaving = true;
+ submitForm();
- vm.onSubmit();
+ expectInvalidInput(linkUrlSelector);
- expect(vm.addBadge).not.toHaveBeenCalled();
- });
+ expect(vm[submitAction]).not.toHaveBeenCalled();
+ });
- it('calls addBadge', () => {
- vm.onSubmit();
+ it(`calls ${submitAction}`, () => {
+ submitForm();
- expect(vm.addBadge).toHaveBeenCalled();
- });
- });
+ expect(findImageUrlElement()).toBeMatchedBy(':valid');
+ expect(findLinkUrlElement()).toBeMatchedBy(':valid');
+ expect(vm[submitAction]).toHaveBeenCalled();
});
- });
+ };
describe('if isEditing is false', () => {
beforeEach(() => {
@@ -138,12 +147,17 @@ describe('BadgeForm component', () => {
});
it('renders one button', () => {
- const buttons = vm.$el.querySelectorAll('.row-content-block button');
+ expect(vm.$el.querySelector('.row-content-block')).toBeNull();
+ const buttons = vm.$el.querySelectorAll('.form-group:last-of-type button');
+
expect(buttons.length).toBe(1);
const buttonAddElement = buttons[0];
+
expect(buttonAddElement).toBeVisible();
expect(buttonAddElement).toHaveText('Add badge');
});
+
+ sharedSubmitTests('addBadge');
});
describe('if isEditing is true', () => {
@@ -159,13 +173,18 @@ describe('BadgeForm component', () => {
it('renders two buttons', () => {
const buttons = vm.$el.querySelectorAll('.row-content-block button');
+
expect(buttons.length).toBe(2);
const buttonSaveElement = buttons[0];
+
expect(buttonSaveElement).toBeVisible();
expect(buttonSaveElement).toHaveText('Save changes');
const buttonCancelElement = buttons[1];
+
expect(buttonCancelElement).toBeVisible();
expect(buttonCancelElement).toHaveText('Cancel');
});
+
+ sharedSubmitTests('saveBadge');
});
});
diff --git a/spec/javascripts/badges/components/badge_list_row_spec.js b/spec/javascripts/badges/components/badge_list_row_spec.js
index 21bd00d82f0..a5b47cc5f32 100644
--- a/spec/javascripts/badges/components/badge_list_row_spec.js
+++ b/spec/javascripts/badges/components/badge_list_row_spec.js
@@ -34,6 +34,7 @@ describe('BadgeListRow component', () => {
it('renders the badge', () => {
const badgeElement = vm.$el.querySelector('.project-badge');
+
expect(badgeElement).not.toBeNull();
expect(badgeElement.getAttribute('src')).toBe(badge.renderedImageUrl);
});
@@ -48,11 +49,14 @@ describe('BadgeListRow component', () => {
it('shows edit and delete buttons', () => {
const buttons = vm.$el.querySelectorAll('.table-button-footer button');
+
expect(buttons).toHaveLength(2);
const buttonEditElement = buttons[0];
+
expect(buttonEditElement).toBeVisible();
expect(buttonEditElement).toHaveSpriteIcon('pencil');
const buttonDeleteElement = buttons[1];
+
expect(buttonDeleteElement).toBeVisible();
expect(buttonDeleteElement).toHaveSpriteIcon('remove');
});
@@ -91,6 +95,7 @@ describe('BadgeListRow component', () => {
it('hides edit and delete buttons', () => {
const buttons = vm.$el.querySelectorAll('.table-button-footer button');
+
expect(buttons).toHaveLength(0);
});
});
diff --git a/spec/javascripts/badges/components/badge_list_spec.js b/spec/javascripts/badges/components/badge_list_spec.js
index 02e59ae0843..536671db377 100644
--- a/spec/javascripts/badges/components/badge_list_spec.js
+++ b/spec/javascripts/badges/components/badge_list_spec.js
@@ -34,11 +34,13 @@ describe('BadgeList component', () => {
it('renders a header with the badge count', () => {
const header = vm.$el.querySelector('.card-header');
+
expect(header).toHaveText(new RegExp(`Your badges\\s+${numberOfDummyBadges}`));
});
it('renders a row for each badge', () => {
const rows = vm.$el.querySelectorAll('.gl-responsive-table-row');
+
expect(rows).toHaveLength(numberOfDummyBadges);
});
@@ -59,6 +61,7 @@ describe('BadgeList component', () => {
Vue.nextTick()
.then(() => {
const loadingIcon = vm.$el.querySelector('.fa-spinner');
+
expect(loadingIcon).toBeVisible();
})
.then(done)
diff --git a/spec/javascripts/badges/components/badge_settings_spec.js b/spec/javascripts/badges/components/badge_settings_spec.js
index 59367c85125..aca26b736ca 100644
--- a/spec/javascripts/badges/components/badge_settings_spec.js
+++ b/spec/javascripts/badges/components/badge_settings_spec.js
@@ -38,6 +38,7 @@ describe('BadgeSettings component', () => {
$(modal).on('shown.bs.modal', () => {
expect(modal).toContainText('Delete badge?');
const badgeElement = modal.querySelector('img.project-badge');
+
expect(badgeElement).not.toBe(null);
expect(badgeElement.getAttribute('src')).toBe(badge.renderedImageUrl);
@@ -53,14 +54,17 @@ describe('BadgeSettings component', () => {
it('displays a form to add a badge', () => {
const form = vm.$el.querySelector('form:nth-of-type(2)');
+
expect(form).not.toBe(null);
const button = form.querySelector('.btn-success');
+
expect(button).not.toBe(null);
expect(button).toHaveText(/Add badge/);
});
it('displays badge list', () => {
const badgeListElement = vm.$el.querySelector('.card');
+
expect(badgeListElement).not.toBe(null);
expect(badgeListElement).toBeVisible();
expect(badgeListElement).toContainText('Your badges');
@@ -77,17 +81,21 @@ describe('BadgeSettings component', () => {
it('displays a form to edit a badge', () => {
const form = vm.$el.querySelector('form:nth-of-type(1)');
+
expect(form).not.toBe(null);
const submitButton = form.querySelector('.btn-success');
+
expect(submitButton).not.toBe(null);
expect(submitButton).toHaveText(/Save changes/);
const cancelButton = form.querySelector('.btn-cancel');
+
expect(cancelButton).not.toBe(null);
expect(cancelButton).toHaveText(/Cancel/);
});
it('displays no badge list', () => {
const badgeListElement = vm.$el.querySelector('.card');
+
expect(badgeListElement).toBeHidden();
});
});
@@ -102,6 +110,7 @@ describe('BadgeSettings component', () => {
deleteButton.click();
const badge = store.state.badgeInModal;
+
expect(vm.deleteBadge).toHaveBeenCalledWith(badge);
});
});
diff --git a/spec/javascripts/badges/components/badge_spec.js b/spec/javascripts/badges/components/badge_spec.js
index fd1ecc9cdd8..29805408bcf 100644
--- a/spec/javascripts/badges/components/badge_spec.js
+++ b/spec/javascripts/badges/components/badge_spec.js
@@ -107,6 +107,7 @@ describe('Badge component', () => {
expect(vm.isLoading).toBe(false);
expect(vm.hasError).toBe(false);
const { badgeImage, loadingIcon, reloadButton } = findElements();
+
expect(badgeImage).toBeVisible();
expect(loadingIcon).toBeHidden();
expect(reloadButton).toBeHidden();
@@ -119,6 +120,7 @@ describe('Badge component', () => {
Vue.nextTick()
.then(() => {
const { badgeImage, loadingIcon, reloadButton } = findElements();
+
expect(badgeImage).toBeHidden();
expect(loadingIcon).toBeVisible();
expect(reloadButton).toBeHidden();
@@ -134,6 +136,7 @@ describe('Badge component', () => {
Vue.nextTick()
.then(() => {
const { badgeImage, loadingIcon, reloadButton } = findElements();
+
expect(badgeImage).toBeHidden();
expect(loadingIcon).toBeHidden();
expect(reloadButton).toBeVisible();
diff --git a/spec/javascripts/badges/dummy_badge.js b/spec/javascripts/badges/dummy_badge.js
index 6aaff21c503..f0cdaddbd33 100644
--- a/spec/javascripts/badges/dummy_badge.js
+++ b/spec/javascripts/badges/dummy_badge.js
@@ -1,8 +1,9 @@
+import _ from 'underscore';
import { PROJECT_BADGE } from '~/badges/constants';
import { DUMMY_IMAGE_URL, TEST_HOST } from 'spec/test_constants';
export const createDummyBadge = () => {
- const id = Math.floor(1000 * Math.random());
+ const id = _.uniqueId();
return {
id,
imageUrl: `${TEST_HOST}/badges/${id}/image/url`,
diff --git a/spec/javascripts/badges/store/actions_spec.js b/spec/javascripts/badges/store/actions_spec.js
index bb6263c6de4..2623465ebd6 100644
--- a/spec/javascripts/badges/store/actions_spec.js
+++ b/spec/javascripts/badges/store/actions_spec.js
@@ -94,6 +94,7 @@ describe('Badges store actions', () => {
link_url: badgeInAddForm.linkUrl,
}),
);
+
expect(dispatch.calls.allArgs()).toEqual([['requestNewBadge']]);
dispatch.calls.reset();
return [200, dummyResponse];
@@ -117,6 +118,7 @@ describe('Badges store actions', () => {
link_url: badgeInAddForm.linkUrl,
}),
);
+
expect(dispatch.calls.allArgs()).toEqual([['requestNewBadge']]);
dispatch.calls.reset();
return [500, ''];
@@ -296,6 +298,7 @@ describe('Badges store actions', () => {
.loadBadges({ state, dispatch }, dummyData)
.then(() => {
const badges = dummyReponse.map(transformBackendBadge);
+
expect(dispatch.calls.allArgs()).toEqual([['receiveLoadBadges', badges]]);
})
.then(done)
@@ -416,6 +419,7 @@ describe('Badges store actions', () => {
.then(() => {
expect(axios.get.calls.count()).toBe(1);
const url = axios.get.calls.argsFor(0)[0];
+
expect(url).toMatch(`^${dummyEndpointUrl}/render?`);
expect(url).toMatch('\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&');
expect(url).toMatch('&image_url=%26make-sandwhich%3Dtrue$');
@@ -436,6 +440,7 @@ describe('Badges store actions', () => {
.renderBadge({ state, dispatch })
.then(() => {
const renderedBadge = transformBackendBadge(dummyReponse);
+
expect(dispatch.calls.allArgs()).toEqual([['receiveRenderedBadge', renderedBadge]]);
})
.then(done)
@@ -525,6 +530,7 @@ describe('Badges store actions', () => {
link_url: badgeInEditForm.linkUrl,
}),
);
+
expect(dispatch.calls.allArgs()).toEqual([['requestUpdatedBadge']]);
dispatch.calls.reset();
return [200, dummyResponse];
@@ -548,6 +554,7 @@ describe('Badges store actions', () => {
link_url: badgeInEditForm.linkUrl,
}),
);
+
expect(dispatch.calls.allArgs()).toEqual([['requestUpdatedBadge']]);
dispatch.calls.reset();
return [500, ''];
diff --git a/spec/javascripts/behaviors/autosize_spec.js b/spec/javascripts/behaviors/autosize_spec.js
index c411c5174fb..59abae479d4 100644
--- a/spec/javascripts/behaviors/autosize_spec.js
+++ b/spec/javascripts/behaviors/autosize_spec.js
@@ -12,6 +12,7 @@ describe('Autosize behavior', () => {
it('does not overwrite the resize property', () => {
load();
+
expect($('textarea')).toHaveCss({
resize: 'vertical',
});
diff --git a/spec/javascripts/behaviors/bind_in_out_spec.js b/spec/javascripts/behaviors/bind_in_out_spec.js
index 5ff66167718..0c214f5886a 100644
--- a/spec/javascripts/behaviors/bind_in_out_spec.js
+++ b/spec/javascripts/behaviors/bind_in_out_spec.js
@@ -1,60 +1,60 @@
import BindInOut from '~/behaviors/bind_in_out';
import ClassSpecHelper from '../helpers/class_spec_helper';
-describe('BindInOut', function () {
- describe('constructor', function () {
- beforeEach(function () {
+describe('BindInOut', function() {
+ describe('constructor', function() {
+ beforeEach(function() {
this.in = {};
this.out = {};
this.bindInOut = new BindInOut(this.in, this.out);
});
- it('should set .in', function () {
+ it('should set .in', function() {
expect(this.bindInOut.in).toBe(this.in);
});
- it('should set .out', function () {
+ it('should set .out', function() {
expect(this.bindInOut.out).toBe(this.out);
});
- it('should set .eventWrapper', function () {
+ it('should set .eventWrapper', function() {
expect(this.bindInOut.eventWrapper).toEqual({});
});
- describe('if .in is an input', function () {
- beforeEach(function () {
+ describe('if .in is an input', function() {
+ beforeEach(function() {
this.bindInOut = new BindInOut({ tagName: 'INPUT' });
});
- it('should set .eventType to keyup ', function () {
+ it('should set .eventType to keyup ', function() {
expect(this.bindInOut.eventType).toEqual('keyup');
});
});
- describe('if .in is a textarea', function () {
- beforeEach(function () {
+ describe('if .in is a textarea', function() {
+ beforeEach(function() {
this.bindInOut = new BindInOut({ tagName: 'TEXTAREA' });
});
- it('should set .eventType to keyup ', function () {
+ it('should set .eventType to keyup ', function() {
expect(this.bindInOut.eventType).toEqual('keyup');
});
});
- describe('if .in is not an input or textarea', function () {
- beforeEach(function () {
+ describe('if .in is not an input or textarea', function() {
+ beforeEach(function() {
this.bindInOut = new BindInOut({ tagName: 'SELECT' });
});
- it('should set .eventType to change ', function () {
+ it('should set .eventType to change ', function() {
expect(this.bindInOut.eventType).toEqual('change');
});
});
});
- describe('addEvents', function () {
- beforeEach(function () {
+ describe('addEvents', function() {
+ beforeEach(function() {
this.in = jasmine.createSpyObj('in', ['addEventListener']);
this.bindInOut = new BindInOut(this.in);
@@ -62,25 +62,24 @@ describe('BindInOut', function () {
this.addEvents = this.bindInOut.addEvents();
});
- it('should set .eventWrapper.updateOut', function () {
+ it('should set .eventWrapper.updateOut', function() {
expect(this.bindInOut.eventWrapper.updateOut).toEqual(jasmine.any(Function));
});
- it('should call .addEventListener', function () {
- expect(this.in.addEventListener)
- .toHaveBeenCalledWith(
- this.bindInOut.eventType,
- this.bindInOut.eventWrapper.updateOut,
- );
+ it('should call .addEventListener', function() {
+ expect(this.in.addEventListener).toHaveBeenCalledWith(
+ this.bindInOut.eventType,
+ this.bindInOut.eventWrapper.updateOut,
+ );
});
- it('should return the instance', function () {
+ it('should return the instance', function() {
expect(this.addEvents).toBe(this.bindInOut);
});
});
- describe('updateOut', function () {
- beforeEach(function () {
+ describe('updateOut', function() {
+ beforeEach(function() {
this.in = { value: 'the-value' };
this.out = { textContent: 'not-the-value' };
@@ -89,17 +88,17 @@ describe('BindInOut', function () {
this.updateOut = this.bindInOut.updateOut();
});
- it('should set .out.textContent to .in.value', function () {
+ it('should set .out.textContent to .in.value', function() {
expect(this.out.textContent).toBe(this.in.value);
});
- it('should return the instance', function () {
+ it('should return the instance', function() {
expect(this.updateOut).toBe(this.bindInOut);
});
});
- describe('removeEvents', function () {
- beforeEach(function () {
+ describe('removeEvents', function() {
+ beforeEach(function() {
this.in = jasmine.createSpyObj('in', ['removeEventListener']);
this.updateOut = () => {};
@@ -109,21 +108,20 @@ describe('BindInOut', function () {
this.removeEvents = this.bindInOut.removeEvents();
});
- it('should call .removeEventListener', function () {
- expect(this.in.removeEventListener)
- .toHaveBeenCalledWith(
- this.bindInOut.eventType,
- this.updateOut,
- );
+ it('should call .removeEventListener', function() {
+ expect(this.in.removeEventListener).toHaveBeenCalledWith(
+ this.bindInOut.eventType,
+ this.updateOut,
+ );
});
- it('should return the instance', function () {
+ it('should return the instance', function() {
expect(this.removeEvents).toBe(this.bindInOut);
});
});
- describe('initAll', function () {
- beforeEach(function () {
+ describe('initAll', function() {
+ beforeEach(function() {
this.ins = [0, 1, 2];
this.instances = [];
@@ -136,43 +134,47 @@ describe('BindInOut', function () {
ClassSpecHelper.itShouldBeAStaticMethod(BindInOut, 'initAll');
- it('should call .querySelectorAll', function () {
+ it('should call .querySelectorAll', function() {
expect(document.querySelectorAll).toHaveBeenCalledWith('*[data-bind-in]');
});
- it('should call .map', function () {
+ it('should call .map', function() {
expect(Array.prototype.map).toHaveBeenCalledWith(jasmine.any(Function));
});
- it('should call .init for each element', function () {
+ it('should call .init for each element', function() {
expect(BindInOut.init.calls.count()).toEqual(3);
});
- it('should return an array of instances', function () {
+ it('should return an array of instances', function() {
expect(this.initAll).toEqual(jasmine.any(Array));
});
});
- describe('init', function () {
- beforeEach(function () {
- spyOn(BindInOut.prototype, 'addEvents').and.callFake(function () { return this; });
- spyOn(BindInOut.prototype, 'updateOut').and.callFake(function () { return this; });
+ describe('init', function() {
+ beforeEach(function() {
+ spyOn(BindInOut.prototype, 'addEvents').and.callFake(function() {
+ return this;
+ });
+ spyOn(BindInOut.prototype, 'updateOut').and.callFake(function() {
+ return this;
+ });
this.init = BindInOut.init({}, {});
});
ClassSpecHelper.itShouldBeAStaticMethod(BindInOut, 'init');
- it('should call .addEvents', function () {
+ it('should call .addEvents', function() {
expect(BindInOut.prototype.addEvents).toHaveBeenCalled();
});
- it('should call .updateOut', function () {
+ it('should call .updateOut', function() {
expect(BindInOut.prototype.updateOut).toHaveBeenCalled();
});
- describe('if no anOut is provided', function () {
- beforeEach(function () {
+ describe('if no anOut is provided', function() {
+ beforeEach(function() {
this.anIn = { dataset: { bindIn: 'the-data-bind-in' } };
spyOn(document, 'querySelector');
@@ -180,9 +182,10 @@ describe('BindInOut', function () {
BindInOut.init(this.anIn);
});
- it('should call .querySelector', function () {
- expect(document.querySelector)
- .toHaveBeenCalledWith(`*[data-bind-out="${this.anIn.dataset.bindIn}"]`);
+ it('should call .querySelector', function() {
+ expect(document.querySelector).toHaveBeenCalledWith(
+ `*[data-bind-out="${this.anIn.dataset.bindIn}"]`,
+ );
});
});
});
diff --git a/spec/javascripts/behaviors/copy_as_gfm_spec.js b/spec/javascripts/behaviors/copy_as_gfm_spec.js
index c2db81c6ce4..cf8c1b77861 100644
--- a/spec/javascripts/behaviors/copy_as_gfm_spec.js
+++ b/spec/javascripts/behaviors/copy_as_gfm_spec.js
@@ -29,6 +29,7 @@ describe('CopyAsGFM', () => {
it('wraps pasted code when not already in code tags', () => {
spyOn(window.gl.utils, 'insertText').and.callFake((el, textFunc) => {
const insertedText = textFunc('This is code: ', '');
+
expect(insertedText).toEqual('`code`');
});
@@ -38,6 +39,7 @@ describe('CopyAsGFM', () => {
it('does not wrap pasted code when already in code tags', () => {
spyOn(window.gl.utils, 'insertText').and.callFake((el, textFunc) => {
const insertedText = textFunc('This is code: `', '`');
+
expect(insertedText).toEqual('code');
});
@@ -54,7 +56,7 @@ describe('CopyAsGFM', () => {
const fragment = document.createDocumentFragment();
const node = document.createElement('div');
node.innerHTML = html;
- Array.from(node.childNodes).forEach((item) => fragment.appendChild(item));
+ Array.from(node.childNodes).forEach(item => fragment.appendChild(item));
return fragment;
},
}),
@@ -86,6 +88,7 @@ describe('CopyAsGFM', () => {
simulateCopy();
const expectedGFM = '- List Item1\n- List Item2';
+
expect(clipboardData.setData).toHaveBeenCalledWith('text/x-gfm', expectedGFM);
});
@@ -95,6 +98,7 @@ describe('CopyAsGFM', () => {
simulateCopy();
const expectedGFM = '1. List Item1\n1. List Item2';
+
expect(clipboardData.setData).toHaveBeenCalledWith('text/x-gfm', expectedGFM);
});
});
diff --git a/spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js b/spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js
index f96f20ed4a5..f656b97fec2 100644
--- a/spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js
+++ b/spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js
@@ -13,7 +13,7 @@ describe('Unicode Support Map', () => {
spyOn(JSON, 'stringify').and.returnValue(stringSupportMap);
});
- describe('if isLocalStorageAvailable is `true`', function () {
+ describe('if isLocalStorageAvailable is `true`', function() {
beforeEach(() => {
AccessorUtilities.isLocalStorageAccessSafe.and.returnValue(true);
@@ -36,7 +36,7 @@ describe('Unicode Support Map', () => {
});
});
- describe('if isLocalStorageAvailable is `false`', function () {
+ describe('if isLocalStorageAvailable is `false`', function() {
beforeEach(() => {
AccessorUtilities.isLocalStorageAccessSafe.and.returnValue(false);
diff --git a/spec/javascripts/behaviors/markdown/highlight_current_user_spec.js b/spec/javascripts/behaviors/markdown/highlight_current_user_spec.js
new file mode 100644
index 00000000000..3305ddc412d
--- /dev/null
+++ b/spec/javascripts/behaviors/markdown/highlight_current_user_spec.js
@@ -0,0 +1,55 @@
+import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user';
+
+describe('highlightCurrentUser', () => {
+ let rootElement;
+ let elements;
+
+ beforeEach(() => {
+ setFixtures(`
+ <div id="dummy-root-element">
+ <div data-user="1">@first</div>
+ <div data-user="2">@second</div>
+ </div>
+ `);
+ rootElement = document.getElementById('dummy-root-element');
+ elements = rootElement.querySelectorAll('[data-user]');
+ });
+
+ describe('without current user', () => {
+ beforeEach(() => {
+ window.gon = window.gon || {};
+ window.gon.current_user_id = null;
+ });
+
+ afterEach(() => {
+ delete window.gon.current_user_id;
+ });
+
+ it('does not highlight the user', () => {
+ const initialHtml = rootElement.outerHTML;
+
+ highlightCurrentUser(elements);
+
+ expect(rootElement.outerHTML).toBe(initialHtml);
+ });
+ });
+
+ describe('with current user', () => {
+ beforeEach(() => {
+ window.gon = window.gon || {};
+ window.gon.current_user_id = 2;
+ });
+
+ afterEach(() => {
+ delete window.gon.current_user_id;
+ });
+
+ it('highlights current user', () => {
+ highlightCurrentUser(elements);
+
+ expect(elements.length).toBe(2);
+ expect(elements[0]).not.toHaveClass('current-user');
+ expect(elements[1]).toHaveClass('current-user');
+ });
+ });
+});
diff --git a/spec/javascripts/behaviors/quick_submit_spec.js b/spec/javascripts/behaviors/quick_submit_spec.js
index d8aa5c636da..681463aab66 100644
--- a/spec/javascripts/behaviors/quick_submit_spec.js
+++ b/spec/javascripts/behaviors/quick_submit_spec.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import '~/behaviors/quick_submit';
-describe('Quick Submit behavior', function () {
+describe('Quick Submit behavior', function() {
const keydownEvent = (options = { keyCode: 13, metaKey: true }) => $.Event('keydown', options);
preloadFixtures('snippets/show.html.raw');
@@ -30,6 +30,7 @@ describe('Quick Submit behavior', function () {
keyCode: 32,
}),
);
+
expect(this.spies.submit).not.toHaveBeenTriggered();
});
@@ -40,6 +41,7 @@ describe('Quick Submit behavior', function () {
metaKey: false,
}),
);
+
expect(this.spies.submit).not.toHaveBeenTriggered();
});
@@ -49,6 +51,7 @@ describe('Quick Submit behavior', function () {
repeat: true,
}),
);
+
expect(this.spies.submit).not.toHaveBeenTriggered();
});
@@ -58,12 +61,14 @@ describe('Quick Submit behavior', function () {
expect(submitButton).toBeDisabled();
});
+
it('disables button of type submit', () => {
const submitButton = $('.js-quick-submit input[type=submit]');
this.textarea.trigger(keydownEvent());
expect(submitButton).toBeDisabled();
});
+
it('only clicks one submit', () => {
const existingSubmit = $('.js-quick-submit input[type=submit]');
// Add an extra submit button
@@ -84,7 +89,8 @@ describe('Quick Submit behavior', function () {
describe('In Macintosh', () => {
it('responds to Meta+Enter', () => {
this.textarea.trigger(keydownEvent());
- return expect(this.spies.submit).toHaveBeenTriggered();
+
+ expect(this.spies.submit).toHaveBeenTriggered();
});
it('excludes other modifier keys', () => {
@@ -103,13 +109,15 @@ describe('Quick Submit behavior', function () {
shiftKey: true,
}),
);
- return expect(this.spies.submit).not.toHaveBeenTriggered();
+
+ expect(this.spies.submit).not.toHaveBeenTriggered();
});
});
} else {
it('responds to Ctrl+Enter', () => {
this.textarea.trigger(keydownEvent());
- return expect(this.spies.submit).toHaveBeenTriggered();
+
+ expect(this.spies.submit).toHaveBeenTriggered();
});
it('excludes other modifier keys', () => {
@@ -128,7 +136,8 @@ describe('Quick Submit behavior', function () {
shiftKey: true,
}),
);
- return expect(this.spies.submit).not.toHaveBeenTriggered();
+
+ expect(this.spies.submit).not.toHaveBeenTriggered();
});
}
});
diff --git a/spec/javascripts/behaviors/requires_input_spec.js b/spec/javascripts/behaviors/requires_input_spec.js
index a434949b9da..1bde2bb3024 100644
--- a/spec/javascripts/behaviors/requires_input_spec.js
+++ b/spec/javascripts/behaviors/requires_input_spec.js
@@ -12,33 +12,51 @@ describe('requiresInput', () => {
it('disables submit when any field is required', () => {
$('.js-requires-input').requiresInput();
+
expect(submitButton).toBeDisabled();
});
it('enables submit when no field is required', () => {
$('*[required=required]').prop('required', false);
$('.js-requires-input').requiresInput();
+
expect(submitButton).not.toBeDisabled();
});
it('enables submit when all required fields are pre-filled', () => {
$('*[required=required]').remove();
$('.js-requires-input').requiresInput();
+
expect($('.submit')).not.toBeDisabled();
});
it('enables submit when all required fields receive input', () => {
$('.js-requires-input').requiresInput();
- $('#required1').val('input1').change();
+ $('#required1')
+ .val('input1')
+ .change();
+
expect(submitButton).toBeDisabled();
- $('#optional1').val('input1').change();
+ $('#optional1')
+ .val('input1')
+ .change();
+
expect(submitButton).toBeDisabled();
- $('#required2').val('input2').change();
- $('#required3').val('input3').change();
- $('#required4').val('input4').change();
- $('#required5').val('1').change();
+ $('#required2')
+ .val('input2')
+ .change();
+ $('#required3')
+ .val('input3')
+ .change();
+ $('#required4')
+ .val('input4')
+ .change();
+ $('#required5')
+ .val('1')
+ .change();
+
expect($('.submit')).not.toBeDisabled();
});
});
diff --git a/spec/javascripts/behaviors/secret_values_spec.js b/spec/javascripts/behaviors/secret_values_spec.js
index 95122fcf30f..5aaab093c0c 100644
--- a/spec/javascripts/behaviors/secret_values_spec.js
+++ b/spec/javascripts/behaviors/secret_values_spec.js
@@ -36,12 +36,7 @@ function setupSecretFixture(
placeholderClass = 'js-secret-value-placeholder',
) {
const wrapper = document.createElement('div');
- wrapper.innerHTML = generateFixtureMarkup(
- secrets,
- isRevealed,
- valueClass,
- placeholderClass,
- );
+ wrapper.innerHTML = generateFixtureMarkup(secrets, isRevealed, valueClass, placeholderClass);
const secretValues = new SecretValues({
container: wrapper.querySelector('.js-secret-container'),
@@ -127,11 +122,12 @@ describe('setupSecretValues', () => {
const placeholders = wrapper.querySelectorAll('.js-secret-value-placeholder');
expect(values.length).toEqual(3);
- values.forEach((value) => {
+ values.forEach(value => {
expect(value.classList.contains('hide')).toEqual(true);
});
+
expect(placeholders.length).toEqual(3);
- placeholders.forEach((placeholder) => {
+ placeholders.forEach(placeholder => {
expect(placeholder.classList.contains('hide')).toEqual(false);
});
});
@@ -145,22 +141,24 @@ describe('setupSecretValues', () => {
revealButton.click();
expect(values.length).toEqual(3);
- values.forEach((value) => {
+ values.forEach(value => {
expect(value.classList.contains('hide')).toEqual(false);
});
+
expect(placeholders.length).toEqual(3);
- placeholders.forEach((placeholder) => {
+ placeholders.forEach(placeholder => {
expect(placeholder.classList.contains('hide')).toEqual(true);
});
revealButton.click();
expect(values.length).toEqual(3);
- values.forEach((value) => {
+ values.forEach(value => {
expect(value.classList.contains('hide')).toEqual(true);
});
+
expect(placeholders.length).toEqual(3);
- placeholders.forEach((placeholder) => {
+ placeholders.forEach(placeholder => {
expect(placeholder.classList.contains('hide')).toEqual(false);
});
});
@@ -172,7 +170,9 @@ describe('setupSecretValues', () => {
it('should toggle values and placeholders', () => {
const wrapper = setupSecretFixture(secrets, false);
// Insert the new dynamic row
- wrapper.querySelector('.js-secret-container').insertAdjacentHTML('afterbegin', generateValueMarkup('foobarbazdynamic'));
+ wrapper
+ .querySelector('.js-secret-container')
+ .insertAdjacentHTML('afterbegin', generateValueMarkup('foobarbazdynamic'));
const revealButton = wrapper.querySelector('.js-secret-value-reveal-button');
const values = wrapper.querySelectorAll('.js-secret-value');
@@ -181,22 +181,24 @@ describe('setupSecretValues', () => {
revealButton.click();
expect(values.length).toEqual(4);
- values.forEach((value) => {
+ values.forEach(value => {
expect(value.classList.contains('hide')).toEqual(false);
});
+
expect(placeholders.length).toEqual(4);
- placeholders.forEach((placeholder) => {
+ placeholders.forEach(placeholder => {
expect(placeholder.classList.contains('hide')).toEqual(true);
});
revealButton.click();
expect(values.length).toEqual(4);
- values.forEach((value) => {
+ values.forEach(value => {
expect(value.classList.contains('hide')).toEqual(true);
});
+
expect(placeholders.length).toEqual(4);
- placeholders.forEach((placeholder) => {
+ placeholders.forEach(placeholder => {
expect(placeholder.classList.contains('hide')).toEqual(false);
});
});
diff --git a/spec/javascripts/shortcuts_issuable_spec.js b/spec/javascripts/behaviors/shortcuts/shortcuts_issuable_spec.js
index a4753ab7cde..bc25549cbed 100644
--- a/spec/javascripts/shortcuts_issuable_spec.js
+++ b/spec/javascripts/behaviors/shortcuts/shortcuts_issuable_spec.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import initCopyAsGFM from '~/behaviors/markdown/copy_as_gfm';
-import ShortcutsIssuable from '~/shortcuts_issuable';
+import ShortcutsIssuable from '~/behaviors/shortcuts/shortcuts_issuable';
initCopyAsGFM();
@@ -57,9 +57,11 @@ describe('ShortcutsIssuable', function() {
it('leaves existing input intact', () => {
$(FORM_SELECTOR).val('This text was already here.');
+
expect($(FORM_SELECTOR).val()).toBe('This text was already here.');
ShortcutsIssuable.replyWithSelectedText(true);
+
expect($(FORM_SELECTOR).val()).toBe('This text was already here.\n\n> Selected text.\n\n');
});
@@ -70,6 +72,7 @@ describe('ShortcutsIssuable', function() {
});
ShortcutsIssuable.replyWithSelectedText(true);
+
expect(triggered).toBe(true);
});
diff --git a/spec/javascripts/blob/3d_viewer/mesh_object_spec.js b/spec/javascripts/blob/3d_viewer/mesh_object_spec.js
index 7651792be2e..60be285039f 100644
--- a/spec/javascripts/blob/3d_viewer/mesh_object_spec.js
+++ b/spec/javascripts/blob/3d_viewer/mesh_object_spec.js
@@ -1,21 +1,15 @@
-import {
- BoxGeometry,
-} from 'three/build/three.module';
+import { BoxGeometry } from 'three/build/three.module';
import MeshObject from '~/blob/3d_viewer/mesh_object';
describe('Mesh object', () => {
it('defaults to non-wireframe material', () => {
- const object = new MeshObject(
- new BoxGeometry(10, 10, 10),
- );
+ const object = new MeshObject(new BoxGeometry(10, 10, 10));
expect(object.material.wireframe).toBeFalsy();
});
it('changes to wirefame material', () => {
- const object = new MeshObject(
- new BoxGeometry(10, 10, 10),
- );
+ const object = new MeshObject(new BoxGeometry(10, 10, 10));
object.changeMaterial('wireframe');
@@ -23,18 +17,14 @@ describe('Mesh object', () => {
});
it('scales object down', () => {
- const object = new MeshObject(
- new BoxGeometry(10, 10, 10),
- );
+ const object = new MeshObject(new BoxGeometry(10, 10, 10));
const { radius } = object.geometry.boundingSphere;
expect(radius).not.toBeGreaterThan(4);
});
it('does not scale object down', () => {
- const object = new MeshObject(
- new BoxGeometry(1, 1, 1),
- );
+ const object = new MeshObject(new BoxGeometry(1, 1, 1));
const { radius } = object.geometry.boundingSphere;
expect(radius).toBeLessThan(1);
diff --git a/spec/javascripts/blob/balsamiq/balsamiq_viewer_integration_spec.js b/spec/javascripts/blob/balsamiq/balsamiq_viewer_integration_spec.js
index c726fa8e428..5f027f59fcf 100644
--- a/spec/javascripts/blob/balsamiq/balsamiq_viewer_integration_spec.js
+++ b/spec/javascripts/blob/balsamiq/balsamiq_viewer_integration_spec.js
@@ -16,10 +16,13 @@ describe('Balsamiq integration spec', () => {
});
describe('successful response', () => {
- beforeEach((done) => {
+ beforeEach(done => {
endpoint = bmprPath;
- balsamiqViewer.loadFile(endpoint).then(done).catch(done.fail);
+ balsamiqViewer
+ .loadFile(endpoint)
+ .then(done)
+ .catch(done.fail);
});
it('does not show loading icon', () => {
@@ -32,10 +35,13 @@ describe('Balsamiq integration spec', () => {
});
describe('error getting file', () => {
- beforeEach((done) => {
+ beforeEach(done => {
endpoint = 'invalid/path/to/file.bmpr';
- balsamiqViewer.loadFile(endpoint).then(done.fail, null).catch(done);
+ balsamiqViewer
+ .loadFile(endpoint)
+ .then(done.fail, null)
+ .catch(done);
});
it('does not show loading icon', () => {
diff --git a/spec/javascripts/blob/balsamiq/balsamiq_viewer_spec.js b/spec/javascripts/blob/balsamiq/balsamiq_viewer_spec.js
index cb0f2ba686d..fd73fb4bfcc 100644
--- a/spec/javascripts/blob/balsamiq/balsamiq_viewer_spec.js
+++ b/spec/javascripts/blob/balsamiq/balsamiq_viewer_spec.js
@@ -18,10 +18,6 @@ describe('BalsamiqViewer', () => {
});
});
- describe('fileLoaded', () => {
-
- });
-
describe('loadFile', () => {
let xhr;
let loadFile;
@@ -64,12 +60,16 @@ describe('BalsamiqViewer', () => {
viewer = jasmine.createSpyObj('viewer', ['appendChild']);
previews = [document.createElement('ul'), document.createElement('ul')];
- balsamiqViewer = jasmine.createSpyObj('balsamiqViewer', ['initDatabase', 'getPreviews', 'renderPreview']);
+ balsamiqViewer = jasmine.createSpyObj('balsamiqViewer', [
+ 'initDatabase',
+ 'getPreviews',
+ 'renderPreview',
+ ]);
balsamiqViewer.viewer = viewer;
balsamiqViewer.getPreviews.and.returnValue(previews);
balsamiqViewer.renderPreview.and.callFake(preview => preview);
- viewer.appendChild.and.callFake((containerElement) => {
+ viewer.appendChild.and.callFake(containerElement => {
container = containerElement;
});
@@ -198,7 +198,9 @@ describe('BalsamiqViewer', () => {
});
it('should call database.exec', () => {
- expect(database.exec).toHaveBeenCalledWith(`SELECT * FROM resources WHERE id = '${resourceID}'`);
+ expect(database.exec).toHaveBeenCalledWith(
+ `SELECT * FROM resources WHERE id = '${resourceID}'`,
+ );
});
it('should return the selected resource', () => {
@@ -281,7 +283,7 @@ describe('BalsamiqViewer', () => {
expect(BalsamiqViewer.parseTitle).toHaveBeenCalledWith(resource);
});
- it('should return the template string', function () {
+ it('should return the template string', function() {
expect(renderTemplate.replace(/\s/g, '')).toEqual(template.replace(/\s/g, ''));
});
});
diff --git a/spec/javascripts/blob/blob_file_dropzone_spec.js b/spec/javascripts/blob/blob_file_dropzone_spec.js
index 346f795c3f5..432d8a65b0a 100644
--- a/spec/javascripts/blob/blob_file_dropzone_spec.js
+++ b/spec/javascripts/blob/blob_file_dropzone_spec.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import BlobFileDropzone from '~/blob/blob_file_dropzone';
-describe('BlobFileDropzone', function () {
+describe('BlobFileDropzone', function() {
preloadFixtures('blob/show.html.raw');
beforeEach(() => {
diff --git a/spec/javascripts/blob/blob_fork_suggestion_spec.js b/spec/javascripts/blob/blob_fork_suggestion_spec.js
index d1ab0a32f85..9b81b7e6f92 100644
--- a/spec/javascripts/blob/blob_fork_suggestion_spec.js
+++ b/spec/javascripts/blob/blob_fork_suggestion_spec.js
@@ -16,8 +16,7 @@ describe('BlobForkSuggestion', () => {
cancelButtons: cancelButton,
suggestionSections: suggestionSection,
actionTextPieces: actionTextPiece,
- })
- .init();
+ }).init();
});
afterEach(() => {
@@ -26,6 +25,7 @@ describe('BlobForkSuggestion', () => {
it('showSuggestionSection', () => {
blobForkSuggestion.showSuggestionSection('/foo', 'foo');
+
expect(suggestionSection.classList.contains('hidden')).toEqual(false);
expect(forkButton.getAttribute('href')).toEqual('/foo');
expect(actionTextPiece.textContent).toEqual('foo');
@@ -33,6 +33,7 @@ describe('BlobForkSuggestion', () => {
it('hideSuggestionSection', () => {
blobForkSuggestion.hideSuggestionSection();
+
expect(suggestionSection.classList.contains('hidden')).toEqual(true);
});
});
diff --git a/spec/javascripts/blob/notebook/index_spec.js b/spec/javascripts/blob/notebook/index_spec.js
index 80c09a544d6..28d3b2f5ea3 100644
--- a/spec/javascripts/blob/notebook/index_spec.js
+++ b/spec/javascripts/blob/notebook/index_spec.js
@@ -12,29 +12,27 @@ describe('iPython notebook renderer', () => {
it('shows loading icon', () => {
renderNotebook();
- expect(
- document.querySelector('.loading'),
- ).not.toBeNull();
+ expect(document.querySelector('.loading')).not.toBeNull();
});
describe('successful response', () => {
let mock;
- beforeEach((done) => {
+ beforeEach(done => {
mock = new MockAdapter(axios);
mock.onGet('/test').reply(200, {
- cells: [{
- cell_type: 'markdown',
- source: ['# test'],
- }, {
- cell_type: 'code',
- execution_count: 1,
- source: [
- 'def test(str)',
- ' return str',
- ],
- outputs: [],
- }],
+ cells: [
+ {
+ cell_type: 'markdown',
+ source: ['# test'],
+ },
+ {
+ cell_type: 'code',
+ execution_count: 1,
+ source: ['def test(str)', ' return str'],
+ outputs: [],
+ },
+ ],
});
renderNotebook();
@@ -49,35 +47,23 @@ describe('iPython notebook renderer', () => {
});
it('does not show loading icon', () => {
- expect(
- document.querySelector('.loading'),
- ).toBeNull();
+ expect(document.querySelector('.loading')).toBeNull();
});
it('renders the notebook', () => {
- expect(
- document.querySelector('.md'),
- ).not.toBeNull();
+ expect(document.querySelector('.md')).not.toBeNull();
});
it('renders the markdown cell', () => {
- expect(
- document.querySelector('h1'),
- ).not.toBeNull();
+ expect(document.querySelector('h1')).not.toBeNull();
- expect(
- document.querySelector('h1').textContent.trim(),
- ).toBe('test');
+ expect(document.querySelector('h1').textContent.trim()).toBe('test');
});
it('highlights code', () => {
- expect(
- document.querySelector('.token'),
- ).not.toBeNull();
+ expect(document.querySelector('.token')).not.toBeNull();
- expect(
- document.querySelector('.language-python'),
- ).not.toBeNull();
+ expect(document.querySelector('.language-python')).not.toBeNull();
});
});
@@ -86,12 +72,10 @@ describe('iPython notebook renderer', () => {
beforeEach(done => {
mock = new MockAdapter(axios);
- mock
- .onGet('/test')
- .reply(() =>
- // eslint-disable-next-line prefer-promise-reject-errors
- Promise.reject({ status: 200, data: '{ "cells": [{"cell_type": "markdown"} }' }),
- );
+ mock.onGet('/test').reply(() =>
+ // eslint-disable-next-line prefer-promise-reject-errors
+ Promise.reject({ status: 200, data: '{ "cells": [{"cell_type": "markdown"} }' }),
+ );
renderNotebook();
@@ -105,22 +89,20 @@ describe('iPython notebook renderer', () => {
});
it('does not show loading icon', () => {
- expect(
- document.querySelector('.loading'),
- ).toBeNull();
+ expect(document.querySelector('.loading')).toBeNull();
});
it('shows error message', () => {
- expect(
- document.querySelector('.md').textContent.trim(),
- ).toBe('An error occurred whilst parsing the file.');
+ expect(document.querySelector('.md').textContent.trim()).toBe(
+ 'An error occurred whilst parsing the file.',
+ );
});
});
describe('error getting file', () => {
let mock;
- beforeEach((done) => {
+ beforeEach(done => {
mock = new MockAdapter(axios);
mock.onGet('/test').reply(500, '');
@@ -136,15 +118,13 @@ describe('iPython notebook renderer', () => {
});
it('does not show loading icon', () => {
- expect(
- document.querySelector('.loading'),
- ).toBeNull();
+ expect(document.querySelector('.loading')).toBeNull();
});
it('shows error message', () => {
- expect(
- document.querySelector('.md').textContent.trim(),
- ).toBe('An error occurred whilst loading the file. Please try again later.');
+ expect(document.querySelector('.md').textContent.trim()).toBe(
+ 'An error occurred whilst loading the file. Please try again later.',
+ );
});
});
});
diff --git a/spec/javascripts/blob/pdf/index_spec.js b/spec/javascripts/blob/pdf/index_spec.js
index bbe2500f8e3..be917a0613f 100644
--- a/spec/javascripts/blob/pdf/index_spec.js
+++ b/spec/javascripts/blob/pdf/index_spec.js
@@ -5,7 +5,7 @@ describe('PDF renderer', () => {
let viewer;
let app;
- const checkLoaded = (done) => {
+ const checkLoaded = done => {
if (app.loading) {
setTimeout(() => {
checkLoaded(done);
@@ -26,39 +26,31 @@ describe('PDF renderer', () => {
it('shows loading icon', () => {
renderPDF();
- expect(
- document.querySelector('.loading'),
- ).not.toBeNull();
+ expect(document.querySelector('.loading')).not.toBeNull();
});
describe('successful response', () => {
- beforeEach((done) => {
+ beforeEach(done => {
app = renderPDF();
checkLoaded(done);
});
it('does not show loading icon', () => {
- expect(
- document.querySelector('.loading'),
- ).toBeNull();
+ expect(document.querySelector('.loading')).toBeNull();
});
it('renders the PDF', () => {
- expect(
- document.querySelector('.pdf-viewer'),
- ).not.toBeNull();
+ expect(document.querySelector('.pdf-viewer')).not.toBeNull();
});
it('renders the PDF page', () => {
- expect(
- document.querySelector('.pdf-page'),
- ).not.toBeNull();
+ expect(document.querySelector('.pdf-page')).not.toBeNull();
});
});
describe('error getting file', () => {
- beforeEach((done) => {
+ beforeEach(done => {
viewer.dataset.endpoint = 'invalid/path/to/file.pdf';
app = renderPDF();
@@ -66,15 +58,13 @@ describe('PDF renderer', () => {
});
it('does not show loading icon', () => {
- expect(
- document.querySelector('.loading'),
- ).toBeNull();
+ expect(document.querySelector('.loading')).toBeNull();
});
it('shows error message', () => {
- expect(
- document.querySelector('.md').textContent.trim(),
- ).toBe('An error occurred whilst loading the file. Please try again later.');
+ expect(document.querySelector('.md').textContent.trim()).toBe(
+ 'An error occurred whilst loading the file. Please try again later.',
+ );
});
});
});
diff --git a/spec/javascripts/blob/sketch/index_spec.js b/spec/javascripts/blob/sketch/index_spec.js
index e062a068a92..2b1e81e9cbc 100644
--- a/spec/javascripts/blob/sketch/index_spec.js
+++ b/spec/javascripts/blob/sketch/index_spec.js
@@ -4,15 +4,13 @@ import SketchLoader from '~/blob/sketch';
describe('Sketch viewer', () => {
const generateZipFileArrayBuffer = (zipFile, resolve, done) => {
- zipFile
- .generateAsync({ type: 'arrayBuffer' })
- .then((content) => {
- resolve(content);
-
- setTimeout(() => {
- done();
- }, 100);
- });
+ zipFile.generateAsync({ type: 'arrayBuffer' }).then(content => {
+ resolve(content);
+
+ setTimeout(() => {
+ done();
+ }, 100);
+ });
};
preloadFixtures('static/sketch_viewer.html.raw');
@@ -22,60 +20,63 @@ describe('Sketch viewer', () => {
});
describe('with error message', () => {
- beforeEach((done) => {
- spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(() => new Promise((resolve, reject) => {
- reject();
-
- setTimeout(() => {
- done();
- });
- }));
+ beforeEach(done => {
+ spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(
+ () =>
+ new Promise((resolve, reject) => {
+ reject();
+
+ setTimeout(() => {
+ done();
+ });
+ }),
+ );
new SketchLoader(document.getElementById('js-sketch-viewer'));
});
it('renders error message', () => {
- expect(
- document.querySelector('#js-sketch-viewer p'),
- ).not.toBeNull();
+ expect(document.querySelector('#js-sketch-viewer p')).not.toBeNull();
- expect(
- document.querySelector('#js-sketch-viewer p').textContent.trim(),
- ).toContain('Cannot show preview.');
+ expect(document.querySelector('#js-sketch-viewer p').textContent.trim()).toContain(
+ 'Cannot show preview.',
+ );
});
it('removes render the loading icon', () => {
- expect(
- document.querySelector('.js-loading-icon'),
- ).toBeNull();
+ expect(document.querySelector('.js-loading-icon')).toBeNull();
});
});
describe('success', () => {
- beforeEach((done) => {
- spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(() => new Promise((resolve) => {
- const zipFile = new JSZip();
- zipFile.folder('previews')
- .file('preview.png', 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA1JREFUeNoBAgD9/wAAAAIAAVMrnDAAAAAASUVORK5CYII=', {
- base64: true,
- });
-
- generateZipFileArrayBuffer(zipFile, resolve, done);
- }));
+ beforeEach(done => {
+ spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(
+ () =>
+ new Promise(resolve => {
+ const zipFile = new JSZip();
+ zipFile
+ .folder('previews')
+ .file(
+ 'preview.png',
+ 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA1JREFUeNoBAgD9/wAAAAIAAVMrnDAAAAAASUVORK5CYII=',
+ {
+ base64: true,
+ },
+ );
+
+ generateZipFileArrayBuffer(zipFile, resolve, done);
+ }),
+ );
new SketchLoader(document.getElementById('js-sketch-viewer'));
});
it('does not render error message', () => {
- expect(
- document.querySelector('#js-sketch-viewer p'),
- ).toBeNull();
+ expect(document.querySelector('#js-sketch-viewer p')).toBeNull();
});
it('removes render the loading icon', () => {
- expect(
- document.querySelector('.js-loading-icon'),
- ).toBeNull();
+ expect(document.querySelector('.js-loading-icon')).toBeNull();
});
it('renders preview img', () => {
@@ -95,24 +96,25 @@ describe('Sketch viewer', () => {
});
describe('incorrect file', () => {
- beforeEach((done) => {
- spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(() => new Promise((resolve) => {
- const zipFile = new JSZip();
+ beforeEach(done => {
+ spyOn(SketchLoader.prototype, 'getZipFile').and.callFake(
+ () =>
+ new Promise(resolve => {
+ const zipFile = new JSZip();
- generateZipFileArrayBuffer(zipFile, resolve, done);
- }));
+ generateZipFileArrayBuffer(zipFile, resolve, done);
+ }),
+ );
new SketchLoader(document.getElementById('js-sketch-viewer'));
});
it('renders error message', () => {
- expect(
- document.querySelector('#js-sketch-viewer p'),
- ).not.toBeNull();
+ expect(document.querySelector('#js-sketch-viewer p')).not.toBeNull();
- expect(
- document.querySelector('#js-sketch-viewer p').textContent.trim(),
- ).toContain('Cannot show preview.');
+ expect(document.querySelector('#js-sketch-viewer p').textContent.trim()).toContain(
+ 'Cannot show preview.',
+ );
});
});
});
diff --git a/spec/javascripts/blob/viewer/index_spec.js b/spec/javascripts/blob/viewer/index_spec.js
index 8b79624d9f4..93a942fe8d4 100644
--- a/spec/javascripts/blob/viewer/index_spec.js
+++ b/spec/javascripts/blob/viewer/index_spec.js
@@ -35,12 +35,13 @@ describe('Blob viewer', () => {
window.location.hash = '';
});
- it('loads source file after switching views', (done) => {
+ it('loads source file after switching views', done => {
document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
setTimeout(() => {
expect(
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
+ document
+ .querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
.classList.contains('hidden'),
).toBeFalsy();
@@ -48,14 +49,15 @@ describe('Blob viewer', () => {
});
});
- it('loads source file when line number is in hash', (done) => {
+ it('loads source file when line number is in hash', done => {
window.location.hash = '#L1';
new BlobViewer();
setTimeout(() => {
expect(
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
+ document
+ .querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]')
.classList.contains('hidden'),
).toBeFalsy();
@@ -63,12 +65,13 @@ describe('Blob viewer', () => {
});
});
- it('doesnt reload file if already loaded', (done) => {
- const asyncClick = () => new Promise((resolve) => {
- document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
+ it('doesnt reload file if already loaded', done => {
+ const asyncClick = () =>
+ new Promise(resolve => {
+ document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
- setTimeout(resolve);
- });
+ setTimeout(resolve);
+ });
asyncClick()
.then(() => asyncClick())
@@ -93,15 +96,13 @@ describe('Blob viewer', () => {
});
it('disabled on load', () => {
- expect(
- copyButton.classList.contains('disabled'),
- ).toBeTruthy();
+ expect(copyButton.classList.contains('disabled')).toBeTruthy();
});
it('has tooltip when disabled', () => {
- expect(
- copyButton.getAttribute('data-original-title'),
- ).toBe('Switch to the source to copy it to the clipboard');
+ expect(copyButton.getAttribute('data-original-title')).toBe(
+ 'Switch to the source to copy it to the clipboard',
+ );
});
it('is blurred when clicked and disabled', () => {
@@ -121,25 +122,21 @@ describe('Blob viewer', () => {
expect(copyButton.blur).not.toHaveBeenCalled();
});
- it('enables after switching to simple view', (done) => {
+ it('enables after switching to simple view', done => {
document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
setTimeout(() => {
- expect(
- copyButton.classList.contains('disabled'),
- ).toBeFalsy();
+ expect(copyButton.classList.contains('disabled')).toBeFalsy();
done();
});
});
- it('updates tooltip after switching to simple view', (done) => {
+ it('updates tooltip after switching to simple view', done => {
document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
setTimeout(() => {
- expect(
- copyButton.getAttribute('data-original-title'),
- ).toBe('Copy source to clipboard');
+ expect(copyButton.getAttribute('data-original-title')).toBe('Copy source to clipboard');
done();
});
@@ -162,9 +159,8 @@ describe('Blob viewer', () => {
blob.switchToViewer('simple');
- expect(
- simpleBtn.classList.contains('active'),
- ).toBeTruthy();
+ expect(simpleBtn.classList.contains('active')).toBeTruthy();
+
expect(simpleBtn.blur).toHaveBeenCalled();
});
diff --git a/spec/javascripts/boards/board_blank_state_spec.js b/spec/javascripts/boards/board_blank_state_spec.js
index 89a4fae4b59..8e2a947b0dd 100644
--- a/spec/javascripts/boards/board_blank_state_spec.js
+++ b/spec/javascripts/boards/board_blank_state_spec.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import BoardBlankState from '~/boards/components/board_blank_state.vue';
import { mockBoardService } from './mock_data';
@@ -7,29 +7,35 @@ describe('Boards blank state', () => {
let vm;
let fail = false;
- beforeEach((done) => {
+ beforeEach(done => {
const Comp = Vue.extend(BoardBlankState);
- gl.issueBoards.BoardsStore.create();
+ boardsStore.create();
gl.boardService = mockBoardService();
- spyOn(gl.boardService, 'generateDefaultLists').and.callFake(() => new Promise((resolve, reject) => {
- if (fail) {
- reject();
- } else {
- resolve({
- data: [{
- id: 1,
- title: 'To Do',
- label: { id: 1 },
- }, {
- id: 2,
- title: 'Doing',
- label: { id: 2 },
- }],
- });
- }
- }));
+ spyOn(gl.boardService, 'generateDefaultLists').and.callFake(
+ () =>
+ new Promise((resolve, reject) => {
+ if (fail) {
+ reject();
+ } else {
+ resolve({
+ data: [
+ {
+ id: 1,
+ title: 'To Do',
+ label: { id: 1 },
+ },
+ {
+ id: 2,
+ title: 'Doing',
+ label: { id: 2 },
+ },
+ ],
+ });
+ }
+ }),
+ );
vm = new Comp();
@@ -40,49 +46,47 @@ describe('Boards blank state', () => {
});
it('renders pre-defined labels', () => {
- expect(
- vm.$el.querySelectorAll('.board-blank-state-list li').length,
- ).toBe(2);
+ expect(vm.$el.querySelectorAll('.board-blank-state-list li').length).toBe(2);
- expect(
- vm.$el.querySelectorAll('.board-blank-state-list li')[0].textContent.trim(),
- ).toEqual('To Do');
+ expect(vm.$el.querySelectorAll('.board-blank-state-list li')[0].textContent.trim()).toEqual(
+ 'To Do',
+ );
- expect(
- vm.$el.querySelectorAll('.board-blank-state-list li')[1].textContent.trim(),
- ).toEqual('Doing');
+ expect(vm.$el.querySelectorAll('.board-blank-state-list li')[1].textContent.trim()).toEqual(
+ 'Doing',
+ );
});
- it('clears blank state', (done) => {
+ it('clears blank state', done => {
vm.$el.querySelector('.btn-default').click();
setTimeout(() => {
- expect(gl.issueBoards.BoardsStore.welcomeIsHidden()).toBeTruthy();
+ expect(boardsStore.welcomeIsHidden()).toBeTruthy();
done();
});
});
- it('creates pre-defined labels', (done) => {
- vm.$el.querySelector('.btn-create').click();
+ it('creates pre-defined labels', done => {
+ vm.$el.querySelector('.btn-success').click();
setTimeout(() => {
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
- expect(gl.issueBoards.BoardsStore.state.lists[0].title).toEqual('To Do');
- expect(gl.issueBoards.BoardsStore.state.lists[1].title).toEqual('Doing');
+ expect(boardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists[0].title).toEqual('To Do');
+ expect(boardsStore.state.lists[1].title).toEqual('Doing');
done();
});
});
- it('resets the store if request fails', (done) => {
+ it('resets the store if request fails', done => {
fail = true;
- vm.$el.querySelector('.btn-create').click();
+ vm.$el.querySelector('.btn-success').click();
setTimeout(() => {
- expect(gl.issueBoards.BoardsStore.welcomeIsHidden()).toBeFalsy();
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+ expect(boardsStore.welcomeIsHidden()).toBeFalsy();
+ expect(boardsStore.state.lists.length).toBe(1);
done();
});
diff --git a/spec/javascripts/boards/board_card_spec.js b/spec/javascripts/boards/board_card_spec.js
index ad263791cd4..e1017130bed 100644
--- a/spec/javascripts/boards/board_card_spec.js
+++ b/spec/javascripts/boards/board_card_spec.js
@@ -10,7 +10,7 @@ import eventHub from '~/boards/eventhub';
import '~/vue_shared/models/label';
import '~/vue_shared/models/assignee';
import '~/boards/models/list';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import boardCard from '~/boards/components/board_card.vue';
import { listObj, boardsMockInterceptor, mockBoardService } from './mock_data';
@@ -18,13 +18,13 @@ describe('Board card', () => {
let vm;
let mock;
- beforeEach((done) => {
+ beforeEach(done => {
mock = new MockAdapter(axios);
mock.onAny().reply(boardsMockInterceptor);
gl.boardService = mockBoardService();
- gl.issueBoards.BoardsStore.create();
- gl.issueBoards.BoardsStore.detail.issue = {};
+ boardsStore.create();
+ boardsStore.detail.issue = {};
const BoardCardComp = Vue.extend(boardCard);
const list = new List(listObj);
@@ -62,7 +62,7 @@ describe('Board card', () => {
});
it('returns true when detailIssue is equal to card issue', () => {
- gl.issueBoards.BoardsStore.detail.issue = vm.issue;
+ boardsStore.detail.issue = vm.issue;
expect(vm.issueDetailVisible).toBe(true);
});
@@ -71,7 +71,7 @@ describe('Board card', () => {
expect(vm.$el.classList.contains('user-can-drag')).toBe(true);
});
- it('does not add user-can-drag class disabled', (done) => {
+ it('does not add user-can-drag class disabled', done => {
vm.disabled = true;
setTimeout(() => {
@@ -84,7 +84,7 @@ describe('Board card', () => {
expect(vm.$el.classList.contains('is-disabled')).toBe(false);
});
- it('adds disabled class is disabled is true', (done) => {
+ it('adds disabled class is disabled is true', done => {
vm.disabled = true;
setTimeout(() => {
@@ -96,8 +96,23 @@ describe('Board card', () => {
describe('mouse events', () => {
const triggerEvent = (eventName, el = vm.$el) => {
const event = document.createEvent('MouseEvents');
- event.initMouseEvent(eventName, true, true, window, 1, 0, 0, 0, 0, false, false,
- false, false, 0, null);
+ event.initMouseEvent(
+ eventName,
+ true,
+ true,
+ window,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ false,
+ false,
+ false,
+ false,
+ 0,
+ null,
+ );
el.dispatchEvent(event);
};
@@ -119,33 +134,35 @@ describe('Board card', () => {
});
it('does not set detail issue if showDetail is false', () => {
- expect(gl.issueBoards.BoardsStore.detail.issue).toEqual({});
+ expect(boardsStore.detail.issue).toEqual({});
});
it('does not set detail issue if link is clicked', () => {
triggerEvent('mouseup', vm.$el.querySelector('a'));
- expect(gl.issueBoards.BoardsStore.detail.issue).toEqual({});
+ expect(boardsStore.detail.issue).toEqual({});
});
it('does not set detail issue if button is clicked', () => {
triggerEvent('mouseup', vm.$el.querySelector('button'));
- expect(gl.issueBoards.BoardsStore.detail.issue).toEqual({});
+ expect(boardsStore.detail.issue).toEqual({});
});
- it('does not set detail issue if img is clicked', (done) => {
- vm.issue.assignees = [new ListAssignee({
- id: 1,
- name: 'testing 123',
- username: 'test',
- avatar: 'test_image',
- })];
+ it('does not set detail issue if img is clicked', done => {
+ vm.issue.assignees = [
+ new ListAssignee({
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ avatar: 'test_image',
+ }),
+ ];
Vue.nextTick(() => {
triggerEvent('mouseup', vm.$el.querySelector('img'));
- expect(gl.issueBoards.BoardsStore.detail.issue).toEqual({});
+ expect(boardsStore.detail.issue).toEqual({});
done();
});
@@ -154,7 +171,7 @@ describe('Board card', () => {
it('does not set detail issue if showDetail is false after mouseup', () => {
triggerEvent('mouseup');
- expect(gl.issueBoards.BoardsStore.detail.issue).toEqual({});
+ expect(boardsStore.detail.issue).toEqual({});
});
it('sets detail issue to card issue on mouse up', () => {
@@ -164,10 +181,10 @@ describe('Board card', () => {
triggerEvent('mouseup');
expect(eventHub.$emit).toHaveBeenCalledWith('newDetailIssue', vm.issue);
- expect(gl.issueBoards.BoardsStore.detail.list).toEqual(vm.list);
+ expect(boardsStore.detail.list).toEqual(vm.list);
});
- it('adds active class if detail issue is set', (done) => {
+ it('adds active class if detail issue is set', done => {
vm.detailIssue.issue = vm.issue;
Vue.nextTick()
@@ -181,7 +198,7 @@ describe('Board card', () => {
it('resets detail issue to empty if already set', () => {
spyOn(eventHub, '$emit');
- gl.issueBoards.BoardsStore.detail.issue = vm.issue;
+ boardsStore.detail.issue = vm.issue;
triggerEvent('mousedown');
triggerEvent('mouseup');
diff --git a/spec/javascripts/boards/board_list_spec.js b/spec/javascripts/boards/board_list_spec.js
index de261d36c61..2642c8b1bdb 100644
--- a/spec/javascripts/boards/board_list_spec.js
+++ b/spec/javascripts/boards/board_list_spec.js
@@ -1,15 +1,15 @@
/* global List */
/* global ListIssue */
+
import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import Sortable from 'sortablejs';
import BoardList from '~/boards/components/board_list.vue';
import eventHub from '~/boards/eventhub';
-import '~/boards/mixins/sortable_default_options';
import '~/boards/models/issue';
import '~/boards/models/list';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import { listObj, boardsMockInterceptor, mockBoardService } from './mock_data';
window.Sortable = Sortable;
@@ -18,15 +18,14 @@ describe('Board list component', () => {
let mock;
let component;
- beforeEach((done) => {
+ beforeEach(done => {
const el = document.createElement('div');
document.body.appendChild(el);
mock = new MockAdapter(axios);
mock.onAny().reply(boardsMockInterceptor);
gl.boardService = mockBoardService();
- gl.issueBoards.BoardsStore.create();
- gl.IssueBoardsApp = new Vue();
+ boardsStore.create();
const BoardListComp = Vue.extend(BoardList);
const list = new List(listObj);
@@ -63,122 +62,102 @@ describe('Board list component', () => {
});
it('renders component', () => {
- expect(
- component.$el.classList.contains('board-list-component'),
- ).toBe(true);
+ expect(component.$el.classList.contains('board-list-component')).toBe(true);
});
- it('renders loading icon', (done) => {
+ it('renders loading icon', done => {
component.loading = true;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-list-loading'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-list-loading')).not.toBeNull();
done();
});
});
it('renders issues', () => {
- expect(
- component.$el.querySelectorAll('.board-card').length,
- ).toBe(1);
+ expect(component.$el.querySelectorAll('.board-card').length).toBe(1);
});
it('sets data attribute with issue id', () => {
- expect(
- component.$el.querySelector('.board-card').getAttribute('data-issue-id'),
- ).toBe('1');
+ expect(component.$el.querySelector('.board-card').getAttribute('data-issue-id')).toBe('1');
});
- it('shows new issue form', (done) => {
+ it('shows new issue form', done => {
component.toggleForm();
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-new-issue-form'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-new-issue-form')).not.toBeNull();
- expect(
- component.$el.querySelector('.is-smaller'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.is-smaller')).not.toBeNull();
done();
});
});
- it('shows new issue form after eventhub event', (done) => {
+ it('shows new issue form after eventhub event', done => {
eventHub.$emit(`hide-issue-form-${component.list.id}`);
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-new-issue-form'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-new-issue-form')).not.toBeNull();
- expect(
- component.$el.querySelector('.is-smaller'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.is-smaller')).not.toBeNull();
done();
});
});
- it('does not show new issue form for closed list', (done) => {
+ it('does not show new issue form for closed list', done => {
component.list.type = 'closed';
component.toggleForm();
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-new-issue-form'),
- ).toBeNull();
+ expect(component.$el.querySelector('.board-new-issue-form')).toBeNull();
done();
});
});
- it('shows count list item', (done) => {
+ it('shows count list item', done => {
component.showCount = true;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-list-count'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-list-count')).not.toBeNull();
- expect(
- component.$el.querySelector('.board-list-count').textContent.trim(),
- ).toBe('Showing all issues');
+ expect(component.$el.querySelector('.board-list-count').textContent.trim()).toBe(
+ 'Showing all issues',
+ );
done();
});
});
- it('sets data attribute with invalid id', (done) => {
+ it('sets data attribute with invalid id', done => {
component.showCount = true;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-list-count').getAttribute('data-issue-id'),
- ).toBe('-1');
+ expect(component.$el.querySelector('.board-list-count').getAttribute('data-issue-id')).toBe(
+ '-1',
+ );
done();
});
});
- it('shows how many more issues to load', (done) => {
+ it('shows how many more issues to load', done => {
component.showCount = true;
component.list.issuesSize = 20;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-list-count').textContent.trim(),
- ).toBe('Showing 1 of 20 issues');
+ expect(component.$el.querySelector('.board-list-count').textContent.trim()).toBe(
+ 'Showing 1 of 20 issues',
+ );
done();
});
});
- it('loads more issues after scrolling', (done) => {
+ it('loads more issues after scrolling', done => {
spyOn(component.list, 'nextPage');
component.$refs.list.style.height = '100px';
component.$refs.list.style.overflow = 'scroll';
@@ -200,14 +179,23 @@ describe('Board list component', () => {
});
});
- it('shows loading more spinner', (done) => {
+ it('does not load issues if already loading', () => {
+ component.list.nextPage = spyOn(component.list, 'nextPage').and.returnValue(
+ new Promise(() => {}),
+ );
+
+ component.onScroll();
+ component.onScroll();
+
+ expect(component.list.nextPage).toHaveBeenCalledTimes(1);
+ });
+
+ it('shows loading more spinner', done => {
component.showCount = true;
component.list.loadingMore = true;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.board-list-count .fa-spinner'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-list-count .fa-spinner')).not.toBeNull();
done();
});
diff --git a/spec/javascripts/boards/board_new_issue_spec.js b/spec/javascripts/boards/board_new_issue_spec.js
index ee37821ad08..721d0b8172d 100644
--- a/spec/javascripts/boards/board_new_issue_spec.js
+++ b/spec/javascripts/boards/board_new_issue_spec.js
@@ -4,6 +4,7 @@ import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import boardNewIssue from '~/boards/components/board_new_issue.vue';
+import boardsStore from '~/boards/stores/boards_store';
import '~/boards/models/list';
import { listObj, boardsMockInterceptor, mockBoardService } from './mock_data';
@@ -27,7 +28,7 @@ describe('Issue boards new issue form', () => {
return vm.submit(dummySubmitEvent);
};
- beforeEach((done) => {
+ beforeEach(done => {
setFixtures('<div class="test-container"></div>');
const BoardNewIssueComp = Vue.extend(boardNewIssue);
@@ -36,8 +37,7 @@ describe('Issue boards new issue form', () => {
mock.onAny().reply(boardsMockInterceptor);
gl.boardService = mockBoardService();
- gl.issueBoards.BoardsStore.create();
- gl.IssueBoardsApp = new Vue();
+ boardsStore.create();
list = new List(listObj);
@@ -60,7 +60,7 @@ describe('Issue boards new issue form', () => {
mock.restore();
});
- it('calls submit if submit button is clicked', (done) => {
+ it('calls submit if submit button is clicked', done => {
spyOn(vm, 'submit').and.callFake(e => e.preventDefault());
vm.title = 'Testing Title';
@@ -69,7 +69,6 @@ describe('Issue boards new issue form', () => {
vm.$el.querySelector('.btn-success').click();
expect(vm.submit.calls.count()).toBe(1);
- expect(vm.$refs['submit-button']).toBe(vm.$el.querySelector('.btn-success'));
})
.then(done)
.catch(done.fail);
@@ -79,7 +78,7 @@ describe('Issue boards new issue form', () => {
expect(vm.$el.querySelector('.btn-success').disabled).toBe(true);
});
- it('enables submit button if title is not empty', (done) => {
+ it('enables submit button if title is not empty', done => {
vm.title = 'Testing Title';
Vue.nextTick()
@@ -91,7 +90,7 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('clears title after clicking cancel', (done) => {
+ it('clears title after clicking cancel', done => {
vm.$el.querySelector('.btn-default').click();
Vue.nextTick()
@@ -102,7 +101,7 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('does not create new issue if title is empty', (done) => {
+ it('does not create new issue if title is empty', done => {
submitIssue()
.then(() => {
expect(list.newIssue).not.toHaveBeenCalled();
@@ -112,7 +111,7 @@ describe('Issue boards new issue form', () => {
});
describe('submit success', () => {
- it('creates new issue', (done) => {
+ it('creates new issue', done => {
vm.title = 'submit title';
Vue.nextTick()
@@ -124,7 +123,7 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('enables button after submit', (done) => {
+ it('enables button after submit', done => {
vm.title = 'submit issue';
Vue.nextTick()
@@ -136,7 +135,7 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('clears title after submit', (done) => {
+ it('clears title after submit', done => {
vm.title = 'submit issue';
Vue.nextTick()
@@ -148,26 +147,26 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('sets detail issue after submit', (done) => {
- expect(gl.issueBoards.BoardsStore.detail.issue.title).toBe(undefined);
+ it('sets detail issue after submit', done => {
+ expect(boardsStore.detail.issue.title).toBe(undefined);
vm.title = 'submit issue';
Vue.nextTick()
.then(submitIssue)
.then(() => {
- expect(gl.issueBoards.BoardsStore.detail.issue.title).toBe('submit issue');
+ expect(boardsStore.detail.issue.title).toBe('submit issue');
})
.then(done)
.catch(done.fail);
});
- it('sets detail list after submit', (done) => {
+ it('sets detail list after submit', done => {
vm.title = 'submit issue';
Vue.nextTick()
.then(submitIssue)
.then(() => {
- expect(gl.issueBoards.BoardsStore.detail.list.id).toBe(list.id);
+ expect(boardsStore.detail.list.id).toBe(list.id);
})
.then(done)
.catch(done.fail);
@@ -180,7 +179,7 @@ describe('Issue boards new issue form', () => {
vm.title = 'error';
});
- it('removes issue', (done) => {
+ it('removes issue', done => {
Vue.nextTick()
.then(submitIssue)
.then(() => {
@@ -190,7 +189,7 @@ describe('Issue boards new issue form', () => {
.catch(done.fail);
});
- it('shows error', (done) => {
+ it('shows error', done => {
Vue.nextTick()
.then(submitIssue)
.then(() => {
diff --git a/spec/javascripts/boards/boards_store_spec.js b/spec/javascripts/boards/boards_store_spec.js
index 1ee6f4cf680..54f1edfb1f9 100644
--- a/spec/javascripts/boards/boards_store_spec.js
+++ b/spec/javascripts/boards/boards_store_spec.js
@@ -1,4 +1,4 @@
-/* eslint-disable comma-dangle, no-unused-vars */
+/* eslint-disable no-unused-vars */
/* global ListIssue */
import Vue from 'vue';
@@ -11,7 +11,7 @@ import '~/vue_shared/models/assignee';
import '~/boards/models/issue';
import '~/boards/models/list';
import '~/boards/services/board_service';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import { listObj, listObjDuplicate, boardsMockInterceptor, mockBoardService } from './mock_data';
describe('Store', () => {
@@ -21,15 +21,18 @@ describe('Store', () => {
mock = new MockAdapter(axios);
mock.onAny().reply(boardsMockInterceptor);
gl.boardService = mockBoardService();
- gl.issueBoards.BoardsStore.create();
+ boardsStore.create();
- spyOn(gl.boardService, 'moveIssue').and.callFake(() => new Promise((resolve) => {
- resolve();
- }));
+ spyOn(gl.boardService, 'moveIssue').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve();
+ }),
+ );
Cookies.set('issue_board_welcome_hidden', 'false', {
expires: 365 * 10,
- path: ''
+ path: '',
});
});
@@ -38,35 +41,35 @@ describe('Store', () => {
});
it('starts with a blank state', () => {
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(0);
+ expect(boardsStore.state.lists.length).toBe(0);
});
describe('lists', () => {
it('creates new list without persisting to DB', () => {
- gl.issueBoards.BoardsStore.addList(listObj);
+ boardsStore.addList(listObj);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+ expect(boardsStore.state.lists.length).toBe(1);
});
it('finds list by ID', () => {
- gl.issueBoards.BoardsStore.addList(listObj);
- const list = gl.issueBoards.BoardsStore.findList('id', listObj.id);
+ boardsStore.addList(listObj);
+ const list = boardsStore.findList('id', listObj.id);
expect(list.id).toBe(listObj.id);
});
it('finds list by type', () => {
- gl.issueBoards.BoardsStore.addList(listObj);
- const list = gl.issueBoards.BoardsStore.findList('type', 'label');
+ boardsStore.addList(listObj);
+ const list = boardsStore.findList('type', 'label');
expect(list).toBeDefined();
});
- it('gets issue when new list added', (done) => {
- gl.issueBoards.BoardsStore.addList(listObj);
- const list = gl.issueBoards.BoardsStore.findList('id', listObj.id);
+ it('gets issue when new list added', done => {
+ boardsStore.addList(listObj);
+ const list = boardsStore.findList('id', listObj.id);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+ expect(boardsStore.state.lists.length).toBe(1);
setTimeout(() => {
expect(list.issues.length).toBe(1);
@@ -75,21 +78,23 @@ describe('Store', () => {
}, 0);
});
- it('persists new list', (done) => {
- gl.issueBoards.BoardsStore.new({
+ it('persists new list', done => {
+ boardsStore.new({
title: 'Test',
list_type: 'label',
label: {
id: 1,
title: 'Testing',
color: 'red',
- description: 'testing;'
- }
+ description: 'testing;',
+ },
});
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+
+ expect(boardsStore.state.lists.length).toBe(1);
setTimeout(() => {
- const list = gl.issueBoards.BoardsStore.findList('id', listObj.id);
+ const list = boardsStore.findList('id', listObj.id);
+
expect(list).toBeDefined();
expect(list.id).toBe(listObj.id);
expect(list.position).toBe(0);
@@ -98,61 +103,63 @@ describe('Store', () => {
});
it('check for blank state adding', () => {
- expect(gl.issueBoards.BoardsStore.shouldAddBlankState()).toBe(true);
+ expect(boardsStore.shouldAddBlankState()).toBe(true);
});
it('check for blank state not adding', () => {
- gl.issueBoards.BoardsStore.addList(listObj);
- expect(gl.issueBoards.BoardsStore.shouldAddBlankState()).toBe(false);
+ boardsStore.addList(listObj);
+
+ expect(boardsStore.shouldAddBlankState()).toBe(false);
});
it('check for blank state adding when closed list exist', () => {
- gl.issueBoards.BoardsStore.addList({
- list_type: 'closed'
+ boardsStore.addList({
+ list_type: 'closed',
});
- expect(gl.issueBoards.BoardsStore.shouldAddBlankState()).toBe(true);
+ expect(boardsStore.shouldAddBlankState()).toBe(true);
});
it('adds the blank state', () => {
- gl.issueBoards.BoardsStore.addBlankState();
+ boardsStore.addBlankState();
+
+ const list = boardsStore.findList('type', 'blank', 'blank');
- const list = gl.issueBoards.BoardsStore.findList('type', 'blank', 'blank');
expect(list).toBeDefined();
});
it('removes list from state', () => {
- gl.issueBoards.BoardsStore.addList(listObj);
+ boardsStore.addList(listObj);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+ expect(boardsStore.state.lists.length).toBe(1);
- gl.issueBoards.BoardsStore.removeList(listObj.id, 'label');
+ boardsStore.removeList(listObj.id, 'label');
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(0);
+ expect(boardsStore.state.lists.length).toBe(0);
});
it('moves the position of lists', () => {
- const listOne = gl.issueBoards.BoardsStore.addList(listObj);
- const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+ const listOne = boardsStore.addList(listObj);
+ const listTwo = boardsStore.addList(listObjDuplicate);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists.length).toBe(2);
- gl.issueBoards.BoardsStore.moveList(listOne, [listObjDuplicate.id, listObj.id]);
+ boardsStore.moveList(listOne, [listObjDuplicate.id, listObj.id]);
expect(listOne.position).toBe(1);
});
- it('moves an issue from one list to another', (done) => {
- const listOne = gl.issueBoards.BoardsStore.addList(listObj);
- const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+ it('moves an issue from one list to another', done => {
+ const listOne = boardsStore.addList(listObj);
+ const listTwo = boardsStore.addList(listObjDuplicate);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists.length).toBe(2);
setTimeout(() => {
expect(listOne.issues.length).toBe(1);
expect(listTwo.issues.length).toBe(1);
- gl.issueBoards.BoardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(1));
+ boardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(1));
expect(listOne.issues.length).toBe(0);
expect(listTwo.issues.length).toBe(1);
@@ -161,20 +168,20 @@ describe('Store', () => {
}, 0);
});
- it('moves an issue from backlog to a list', (done) => {
- const backlog = gl.issueBoards.BoardsStore.addList({
+ it('moves an issue from backlog to a list', done => {
+ const backlog = boardsStore.addList({
...listObj,
list_type: 'backlog',
});
- const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+ const listTwo = boardsStore.addList(listObjDuplicate);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists.length).toBe(2);
setTimeout(() => {
expect(backlog.issues.length).toBe(1);
expect(listTwo.issues.length).toBe(1);
- gl.issueBoards.BoardsStore.moveIssueToList(backlog, listTwo, backlog.findIssue(1));
+ boardsStore.moveIssueToList(backlog, listTwo, backlog.findIssue(1));
expect(backlog.issues.length).toBe(0);
expect(listTwo.issues.length).toBe(1);
@@ -183,11 +190,11 @@ describe('Store', () => {
}, 0);
});
- it('moves issue to top of another list', (done) => {
- const listOne = gl.issueBoards.BoardsStore.addList(listObj);
- const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+ it('moves issue to top of another list', done => {
+ const listOne = boardsStore.addList(listObj);
+ const listTwo = boardsStore.addList(listObjDuplicate);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists.length).toBe(2);
setTimeout(() => {
listOne.issues[0].id = 2;
@@ -195,7 +202,7 @@ describe('Store', () => {
expect(listOne.issues.length).toBe(1);
expect(listTwo.issues.length).toBe(1);
- gl.issueBoards.BoardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(2), 0);
+ boardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(2), 0);
expect(listOne.issues.length).toBe(0);
expect(listTwo.issues.length).toBe(2);
@@ -206,11 +213,11 @@ describe('Store', () => {
}, 0);
});
- it('moves issue to bottom of another list', (done) => {
- const listOne = gl.issueBoards.BoardsStore.addList(listObj);
- const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+ it('moves issue to bottom of another list', done => {
+ const listOne = boardsStore.addList(listObj);
+ const listTwo = boardsStore.addList(listObjDuplicate);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+ expect(boardsStore.state.lists.length).toBe(2);
setTimeout(() => {
listOne.issues[0].id = 2;
@@ -218,7 +225,7 @@ describe('Store', () => {
expect(listOne.issues.length).toBe(1);
expect(listTwo.issues.length).toBe(1);
- gl.issueBoards.BoardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(2), 1);
+ boardsStore.moveIssueToList(listOne, listTwo, listOne.findIssue(2), 1);
expect(listOne.issues.length).toBe(0);
expect(listTwo.issues.length).toBe(2);
@@ -229,7 +236,7 @@ describe('Store', () => {
}, 0);
});
- it('moves issue in list', (done) => {
+ it('moves issue in list', done => {
const issue = new ListIssue({
title: 'Testing',
id: 2,
@@ -238,14 +245,14 @@ describe('Store', () => {
labels: [],
assignees: [],
});
- const list = gl.issueBoards.BoardsStore.addList(listObj);
+ const list = boardsStore.addList(listObj);
setTimeout(() => {
list.addIssue(issue);
expect(list.issues.length).toBe(2);
- gl.issueBoards.BoardsStore.moveIssueInList(list, issue, 0, 1, [1, 2]);
+ boardsStore.moveIssueInList(list, issue, 0, 1, [1, 2]);
expect(list.issues[0].id).toBe(2);
expect(gl.boardService.moveIssue).toHaveBeenCalledWith(2, null, null, 1, null);
diff --git a/spec/javascripts/boards/components/board_spec.js b/spec/javascripts/boards/components/board_spec.js
index 19346e305cf..dee7841c088 100644
--- a/spec/javascripts/boards/components/board_spec.js
+++ b/spec/javascripts/boards/components/board_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import '~/boards/services/board_service';
-import '~/boards/components/board';
+import Board from '~/boards/components/board';
import '~/boards/models/list';
import { mockBoardService } from '../mock_data';
@@ -8,7 +8,7 @@ describe('Board component', () => {
let vm;
let el;
- beforeEach((done) => {
+ beforeEach(done => {
loadFixtures('boards/show.html.raw');
el = document.createElement('div');
@@ -21,7 +21,7 @@ describe('Board component', () => {
boardId: 1,
});
- vm = new gl.issueBoards.Board({
+ vm = new Board({
propsData: {
boardId: '1',
disabled: false,
@@ -50,56 +50,46 @@ describe('Board component', () => {
});
it('board is expandable when list type is backlog', () => {
- expect(
- vm.$el.classList.contains('is-expandable'),
- ).toBe(true);
+ expect(vm.$el.classList.contains('is-expandable')).toBe(true);
});
- it('board is expandable when list type is closed', (done) => {
+ it('board is expandable when list type is closed', done => {
vm.list.type = 'closed';
Vue.nextTick(() => {
- expect(
- vm.$el.classList.contains('is-expandable'),
- ).toBe(true);
+ expect(vm.$el.classList.contains('is-expandable')).toBe(true);
done();
});
});
- it('board is not expandable when list type is label', (done) => {
+ it('board is not expandable when list type is label', done => {
vm.list.type = 'label';
vm.list.isExpandable = false;
Vue.nextTick(() => {
- expect(
- vm.$el.classList.contains('is-expandable'),
- ).toBe(false);
+ expect(vm.$el.classList.contains('is-expandable')).toBe(false);
done();
});
});
- it('collapses when clicking header', (done) => {
+ it('collapses when clicking header', done => {
vm.$el.querySelector('.board-header').click();
Vue.nextTick(() => {
- expect(
- vm.$el.classList.contains('is-collapsed'),
- ).toBe(true);
+ expect(vm.$el.classList.contains('is-collapsed')).toBe(true);
done();
});
});
- it('created sets isExpanded to true from localStorage', (done) => {
+ it('created sets isExpanded to true from localStorage', done => {
vm.$el.querySelector('.board-header').click();
return Vue.nextTick()
.then(() => {
- expect(
- vm.$el.classList.contains('is-collapsed'),
- ).toBe(true);
+ expect(vm.$el.classList.contains('is-collapsed')).toBe(true);
// call created manually
vm.$options.created[0].call(vm);
@@ -107,11 +97,10 @@ describe('Board component', () => {
return Vue.nextTick();
})
.then(() => {
- expect(
- vm.$el.classList.contains('is-collapsed'),
- ).toBe(true);
+ expect(vm.$el.classList.contains('is-collapsed')).toBe(true);
done();
- });
+ })
+ .catch(done.fail);
});
});
diff --git a/spec/javascripts/boards/components/issue_due_date_spec.js b/spec/javascripts/boards/components/issue_due_date_spec.js
new file mode 100644
index 00000000000..9e49330c052
--- /dev/null
+++ b/spec/javascripts/boards/components/issue_due_date_spec.js
@@ -0,0 +1,64 @@
+import Vue from 'vue';
+import dateFormat from 'dateformat';
+import IssueDueDate from '~/boards/components/issue_due_date.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Issue Due Date component', () => {
+ let vm;
+ let date;
+ const Component = Vue.extend(IssueDueDate);
+ const createComponent = (dueDate = new Date()) =>
+ mountComponent(Component, { date: dateFormat(dueDate, 'yyyy-mm-dd', true) });
+
+ beforeEach(() => {
+ date = new Date();
+ vm = createComponent();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('should render "Today" if the due date is today', () => {
+ const timeContainer = vm.$el.querySelector('time');
+
+ expect(timeContainer.textContent.trim()).toEqual('Today');
+ });
+
+ it('should render "Yesterday" if the due date is yesterday', () => {
+ date.setDate(date.getDate() - 1);
+ vm = createComponent(date);
+
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual('Yesterday');
+ });
+
+ it('should render "Tomorrow" if the due date is one day from now', () => {
+ date.setDate(date.getDate() + 1);
+ vm = createComponent(date);
+
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual('Tomorrow');
+ });
+
+ it('should render day of the week if due date is one week away', () => {
+ date.setDate(date.getDate() + 5);
+ vm = createComponent(date);
+
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual(dateFormat(date, 'dddd', true));
+ });
+
+ it('should render month and day for other dates', () => {
+ date.setDate(date.getDate() + 17);
+ vm = createComponent(date);
+
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual(
+ dateFormat(date, 'mmm d', true),
+ );
+ });
+
+ it('should contain the correct `.text-danger` css class for overdue issue', () => {
+ date.setDate(date.getDate() - 17);
+ vm = createComponent(date);
+
+ expect(vm.$el.querySelector('time').classList.contains('text-danger')).toEqual(true);
+ });
+});
diff --git a/spec/javascripts/boards/components/issue_time_estimate_spec.js b/spec/javascripts/boards/components/issue_time_estimate_spec.js
new file mode 100644
index 00000000000..ba65d3287da
--- /dev/null
+++ b/spec/javascripts/boards/components/issue_time_estimate_spec.js
@@ -0,0 +1,40 @@
+import Vue from 'vue';
+import IssueTimeEstimate from '~/boards/components/issue_time_estimate.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Issue Tine Estimate component', () => {
+ let vm;
+
+ beforeEach(() => {
+ const Component = Vue.extend(IssueTimeEstimate);
+ vm = mountComponent(Component, {
+ estimate: 374460,
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders the correct time estimate', () => {
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual('2w 3d 1m');
+ });
+
+ it('renders expanded time estimate in tooltip', () => {
+ expect(vm.$el.querySelector('.js-issue-time-estimate').textContent).toContain(
+ '2 weeks 3 days 1 minute',
+ );
+ });
+
+ it('prevents tooltip xss', done => {
+ const alertSpy = spyOn(window, 'alert');
+ vm.estimate = 'Foo <script>alert("XSS")</script>';
+
+ vm.$nextTick(() => {
+ expect(alertSpy).not.toHaveBeenCalled();
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual('0m');
+ expect(vm.$el.querySelector('.js-issue-time-estimate').textContent).toContain('0m');
+ done();
+ });
+ });
+});
diff --git a/spec/javascripts/boards/issue_card_spec.js b/spec/javascripts/boards/issue_card_spec.js
index b6c61e7bad7..6eda5047dd0 100644
--- a/spec/javascripts/boards/issue_card_spec.js
+++ b/spec/javascripts/boards/issue_card_spec.js
@@ -8,7 +8,6 @@ import '~/vue_shared/models/label';
import '~/vue_shared/models/assignee';
import '~/boards/models/issue';
import '~/boards/models/list';
-import '~/boards/stores/boards_store';
import IssueCardInner from '~/boards/components/issue_card_inner.vue';
import { listObj } from './mock_data';
@@ -118,11 +117,9 @@ describe('Issue card component', () => {
});
it('sets title', () => {
- expect(
- component.$el
- .querySelector('.board-card-assignee img')
- .getAttribute('data-original-title'),
- ).toContain(`Assigned to ${user.name}`);
+ expect(component.$el.querySelector('.js-assignee-tooltip').textContent).toContain(
+ `${user.name}`,
+ );
});
it('sets users path', () => {
@@ -155,7 +152,7 @@ describe('Issue card component', () => {
it('displays defaults avatar if users avatar is null', () => {
expect(component.$el.querySelector('.board-card-assignee img')).not.toBeNull();
expect(component.$el.querySelector('.board-card-assignee img').getAttribute('src')).toBe(
- 'default_avatar?width=20',
+ 'default_avatar?width=24',
);
});
});
@@ -164,7 +161,6 @@ describe('Issue card component', () => {
describe('multiple assignees', () => {
beforeEach(done => {
component.issue.assignees = [
- user,
new ListAssignee({
id: 2,
name: 'user2',
@@ -188,11 +184,11 @@ describe('Issue card component', () => {
Vue.nextTick(() => done());
});
- it('renders all four assignees', () => {
- expect(component.$el.querySelectorAll('.board-card-assignee .avatar').length).toEqual(4);
+ it('renders all three assignees', () => {
+ expect(component.$el.querySelectorAll('.board-card-assignee .avatar').length).toEqual(3);
});
- describe('more than four assignees', () => {
+ describe('more than three assignees', () => {
beforeEach(done => {
component.issue.assignees.push(
new ListAssignee({
@@ -208,12 +204,12 @@ describe('Issue card component', () => {
it('renders more avatar counter', () => {
expect(
- component.$el.querySelector('.board-card-assignee .avatar-counter').innerText,
+ component.$el.querySelector('.board-card-assignee .avatar-counter').innerText.trim(),
).toEqual('+2');
});
- it('renders three assignees', () => {
- expect(component.$el.querySelectorAll('.board-card-assignee .avatar').length).toEqual(3);
+ it('renders two assignees', () => {
+ expect(component.$el.querySelectorAll('.board-card-assignee .avatar').length).toEqual(2);
});
it('renders 99+ avatar counter', done => {
@@ -229,7 +225,7 @@ describe('Issue card component', () => {
Vue.nextTick(() => {
expect(
- component.$el.querySelector('.board-card-assignee .avatar-counter').innerText,
+ component.$el.querySelector('.board-card-assignee .avatar-counter').innerText.trim(),
).toEqual('99+');
done();
});
diff --git a/spec/javascripts/boards/issue_spec.js b/spec/javascripts/boards/issue_spec.js
index db68096e3bd..437ab4bb3df 100644
--- a/spec/javascripts/boards/issue_spec.js
+++ b/spec/javascripts/boards/issue_spec.js
@@ -1,4 +1,3 @@
-/* eslint-disable comma-dangle */
/* global ListIssue */
import Vue from 'vue';
@@ -7,7 +6,7 @@ import '~/vue_shared/models/assignee';
import '~/boards/models/issue';
import '~/boards/models/list';
import '~/boards/services/board_service';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import { mockBoardService } from './mock_data';
describe('Issue model', () => {
@@ -15,25 +14,29 @@ describe('Issue model', () => {
beforeEach(() => {
gl.boardService = mockBoardService();
- gl.issueBoards.BoardsStore.create();
+ boardsStore.create();
issue = new ListIssue({
title: 'Testing',
id: 1,
iid: 1,
confidential: false,
- labels: [{
- id: 1,
- title: 'test',
- color: 'red',
- description: 'testing'
- }],
- assignees: [{
- id: 1,
- name: 'name',
- username: 'username',
- avatar_url: 'http://avatar_url',
- }],
+ labels: [
+ {
+ id: 1,
+ title: 'test',
+ color: 'red',
+ description: 'testing',
+ },
+ ],
+ assignees: [
+ {
+ id: 1,
+ name: 'name',
+ username: 'username',
+ avatar_url: 'http://avatar_url',
+ },
+ ],
});
});
@@ -46,8 +49,9 @@ describe('Issue model', () => {
id: 2,
title: 'bug',
color: 'blue',
- description: 'bugs!'
+ description: 'bugs!',
});
+
expect(issue.labels.length).toBe(2);
});
@@ -56,7 +60,7 @@ describe('Issue model', () => {
id: 2,
title: 'test',
color: 'blue',
- description: 'bugs!'
+ description: 'bugs!',
});
expect(issue.labels.length).toBe(1);
@@ -64,12 +68,14 @@ describe('Issue model', () => {
it('finds label', () => {
const label = issue.findLabel(issue.labels[0]);
+
expect(label).toBeDefined();
});
it('removes label', () => {
const label = issue.findLabel(issue.labels[0]);
issue.removeLabel(label);
+
expect(issue.labels.length).toBe(0);
});
@@ -78,11 +84,13 @@ describe('Issue model', () => {
id: 2,
title: 'bug',
color: 'blue',
- description: 'bugs!'
+ description: 'bugs!',
});
+
expect(issue.labels.length).toBe(2);
issue.removeLabels([issue.labels[0], issue.labels[1]]);
+
expect(issue.labels.length).toBe(0);
});
@@ -99,17 +107,20 @@ describe('Issue model', () => {
it('finds assignee', () => {
const assignee = issue.findAssignee(issue.assignees[0]);
+
expect(assignee).toBeDefined();
});
it('removes assignee', () => {
const assignee = issue.findAssignee(issue.assignees[0]);
issue.removeAssignee(assignee);
+
expect(issue.assignees.length).toBe(0);
});
it('removes all assignees', () => {
issue.removeAllAssignees();
+
expect(issue.assignees.length).toBe(0);
});
@@ -132,6 +143,7 @@ describe('Issue model', () => {
it('updates data', () => {
issue.updateData({ subscribed: true });
+
expect(issue.subscribed).toBe(true);
});
@@ -150,7 +162,7 @@ describe('Issue model', () => {
});
describe('update', () => {
- it('passes assignee ids when there are assignees', (done) => {
+ it('passes assignee ids when there are assignees', done => {
spyOn(Vue.http, 'patch').and.callFake((url, data) => {
expect(data.issue.assignee_ids).toEqual([1]);
done();
@@ -159,7 +171,7 @@ describe('Issue model', () => {
issue.update('url');
});
- it('passes assignee ids of [0] when there are no assignees', (done) => {
+ it('passes assignee ids of [0] when there are no assignees', done => {
spyOn(Vue.http, 'patch').and.callFake((url, data) => {
expect(data.issue.assignee_ids).toEqual([0]);
done();
diff --git a/spec/javascripts/boards/list_spec.js b/spec/javascripts/boards/list_spec.js
index ac8bbb8f2a8..0d462a6f872 100644
--- a/spec/javascripts/boards/list_spec.js
+++ b/spec/javascripts/boards/list_spec.js
@@ -1,4 +1,3 @@
-/* eslint-disable comma-dangle */
/* global List */
/* global ListIssue */
@@ -10,7 +9,7 @@ import '~/vue_shared/models/assignee';
import '~/boards/models/issue';
import '~/boards/models/list';
import '~/boards/services/board_service';
-import '~/boards/stores/boards_store';
+import boardsStore from '~/boards/stores/boards_store';
import { listObj, listObjDuplicate, boardsMockInterceptor, mockBoardService } from './mock_data';
describe('List model', () => {
@@ -23,7 +22,7 @@ describe('List model', () => {
gl.boardService = mockBoardService({
bulkUpdatePath: '/test/issue-boards/board/1/lists',
});
- gl.issueBoards.BoardsStore.create();
+ boardsStore.create();
list = new List(listObj);
});
@@ -32,21 +31,21 @@ describe('List model', () => {
mock.restore();
});
- it('gets issues when created', (done) => {
+ it('gets issues when created', done => {
setTimeout(() => {
expect(list.issues.length).toBe(1);
done();
}, 0);
});
- it('saves list and returns ID', (done) => {
+ it('saves list and returns ID', done => {
list = new List({
title: 'test',
label: {
id: _.random(10000),
title: 'test',
- color: 'red'
- }
+ color: 'red',
+ },
});
list.save();
@@ -58,31 +57,35 @@ describe('List model', () => {
}, 0);
});
- it('destroys the list', (done) => {
- gl.issueBoards.BoardsStore.addList(listObj);
- list = gl.issueBoards.BoardsStore.findList('id', listObj.id);
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(1);
+ it('destroys the list', done => {
+ boardsStore.addList(listObj);
+ list = boardsStore.findList('id', listObj.id);
+
+ expect(boardsStore.state.lists.length).toBe(1);
list.destroy();
setTimeout(() => {
- expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(0);
+ expect(boardsStore.state.lists.length).toBe(0);
done();
}, 0);
});
- it('gets issue from list', (done) => {
+ it('gets issue from list', done => {
setTimeout(() => {
const issue = list.findIssue(1);
+
expect(issue).toBeDefined();
done();
}, 0);
});
- it('removes issue', (done) => {
+ it('removes issue', done => {
setTimeout(() => {
const issue = list.findIssue(1);
+
expect(list.issues.length).toBe(1);
list.removeIssue(issue);
+
expect(list.issues.length).toBe(0);
done();
}, 0);
@@ -106,8 +109,13 @@ describe('List model', () => {
listDup.updateIssueLabel(issue, list);
- expect(gl.boardService.moveIssue)
- .toHaveBeenCalledWith(issue.id, list.id, listDup.id, undefined, undefined);
+ expect(gl.boardService.moveIssue).toHaveBeenCalledWith(
+ issue.id,
+ list.id,
+ listDup.id,
+ undefined,
+ undefined,
+ );
});
describe('page number', () => {
@@ -117,14 +125,16 @@ describe('List model', () => {
it('increase page number if current issue count is more than the page size', () => {
for (let i = 0; i < 30; i += 1) {
- list.issues.push(new ListIssue({
- title: 'Testing',
- id: _.random(10000) + i,
- iid: _.random(10000) + i,
- confidential: false,
- labels: [list.label],
- assignees: [],
- }));
+ list.issues.push(
+ new ListIssue({
+ title: 'Testing',
+ id: _.random(10000) + i,
+ iid: _.random(10000) + i,
+ confidential: false,
+ labels: [list.label],
+ assignees: [],
+ }),
+ );
}
list.issuesSize = 50;
@@ -137,13 +147,15 @@ describe('List model', () => {
});
it('does not increase page number if issue count is less than the page size', () => {
- list.issues.push(new ListIssue({
- title: 'Testing',
- id: _.random(10000),
- confidential: false,
- labels: [list.label],
- assignees: [],
- }));
+ list.issues.push(
+ new ListIssue({
+ title: 'Testing',
+ id: _.random(10000),
+ confidential: false,
+ labels: [list.label],
+ assignees: [],
+ }),
+ );
list.issuesSize = 2;
list.nextPage();
@@ -155,21 +167,25 @@ describe('List model', () => {
describe('newIssue', () => {
beforeEach(() => {
- spyOn(gl.boardService, 'newIssue').and.returnValue(Promise.resolve({
- data: {
- id: 42,
- },
- }));
+ spyOn(gl.boardService, 'newIssue').and.returnValue(
+ Promise.resolve({
+ data: {
+ id: 42,
+ },
+ }),
+ );
});
- it('adds new issue to top of list', (done) => {
- list.issues.push(new ListIssue({
- title: 'Testing',
- id: _.random(10000),
- confidential: false,
- labels: [list.label],
- assignees: [],
- }));
+ it('adds new issue to top of list', done => {
+ list.issues.push(
+ new ListIssue({
+ title: 'Testing',
+ id: _.random(10000),
+ confidential: false,
+ labels: [list.label],
+ assignees: [],
+ }),
+ );
const dummyIssue = new ListIssue({
title: 'new issue',
id: _.random(10000),
@@ -178,7 +194,8 @@ describe('List model', () => {
assignees: [],
});
- list.newIssue(dummyIssue)
+ list
+ .newIssue(dummyIssue)
.then(() => {
expect(list.issues.length).toBe(2);
expect(list.issues[0]).toBe(dummyIssue);
diff --git a/spec/javascripts/boards/mock_data.js b/spec/javascripts/boards/mock_data.js
index 81f1a97112f..c28e41ec175 100644
--- a/spec/javascripts/boards/mock_data.js
+++ b/spec/javascripts/boards/mock_data.js
@@ -1,4 +1,5 @@
-/* global BoardService */
+import BoardService from '~/boards/services/board_service';
+
export const listObj = {
id: 300,
position: 0,
@@ -27,7 +28,7 @@ export const listObjDuplicate = {
export const BoardsMockData = {
GET: {
- '/test/-/boards/1/lists/300/issues?id=300&page=1&=': {
+ '/test/-/boards/1/lists/300/issues?id=300&page=1': {
issues: [
{
title: 'Testing',
diff --git a/spec/javascripts/boards/modal_store_spec.js b/spec/javascripts/boards/modal_store_spec.js
index a234c81fadf..3257a3fb8a3 100644
--- a/spec/javascripts/boards/modal_store_spec.js
+++ b/spec/javascripts/boards/modal_store_spec.js
@@ -11,7 +11,7 @@ describe('Modal store', () => {
let issue2;
beforeEach(() => {
- // Setup default state
+ // Set up default state
Store.store.issues = [];
Store.store.selectedIssues = [];
diff --git a/spec/javascripts/boards/utils/query_data_spec.js b/spec/javascripts/boards/utils/query_data_spec.js
deleted file mode 100644
index 922215ffc1d..00000000000
--- a/spec/javascripts/boards/utils/query_data_spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import queryData from '~/boards/utils/query_data';
-
-describe('queryData', () => {
- it('parses path for label with trailing +', () => {
- expect(
- queryData('label_name[]=label%2B', {}),
- ).toEqual({
- label_name: ['label+'],
- });
- });
-
- it('parses path for milestone with trailing +', () => {
- expect(
- queryData('milestone_title=A%2B', {}),
- ).toEqual({
- milestone_title: 'A+',
- });
- });
-
- it('parses path for search terms with spaces', () => {
- expect(
- queryData('search=two+words', {}),
- ).toEqual({
- search: 'two words',
- });
- });
-});
diff --git a/spec/javascripts/bootstrap_jquery_spec.js b/spec/javascripts/bootstrap_jquery_spec.js
index 052465d8d88..35340a3bc42 100644
--- a/spec/javascripts/bootstrap_jquery_spec.js
+++ b/spec/javascripts/bootstrap_jquery_spec.js
@@ -3,41 +3,45 @@
import $ from 'jquery';
import '~/commons/bootstrap';
-(function() {
- describe('Bootstrap jQuery extensions', function() {
- describe('disable', function() {
- beforeEach(function() {
- return setFixtures('<input type="text" />');
- });
- it('adds the disabled attribute', function() {
- var $input;
- $input = $('input').first();
- $input.disable();
- return expect($input).toHaveAttr('disabled', 'disabled');
- });
- return it('adds the disabled class', function() {
- var $input;
- $input = $('input').first();
- $input.disable();
- return expect($input).toHaveClass('disabled');
- });
+describe('Bootstrap jQuery extensions', function() {
+ describe('disable', function() {
+ beforeEach(function() {
+ return setFixtures('<input type="text" />');
});
- return describe('enable', function() {
- beforeEach(function() {
- return setFixtures('<input type="text" disabled="disabled" class="disabled" />');
- });
- it('removes the disabled attribute', function() {
- var $input;
- $input = $('input').first();
- $input.enable();
- return expect($input).not.toHaveAttr('disabled');
- });
- return it('removes the disabled class', function() {
- var $input;
- $input = $('input').first();
- $input.enable();
- return expect($input).not.toHaveClass('disabled');
- });
+
+ it('adds the disabled attribute', function() {
+ var $input;
+ $input = $('input').first();
+ $input.disable();
+
+ expect($input).toHaveAttr('disabled', 'disabled');
+ });
+ return it('adds the disabled class', function() {
+ var $input;
+ $input = $('input').first();
+ $input.disable();
+
+ expect($input).toHaveClass('disabled');
+ });
+ });
+ return describe('enable', function() {
+ beforeEach(function() {
+ return setFixtures('<input type="text" disabled="disabled" class="disabled" />');
+ });
+
+ it('removes the disabled attribute', function() {
+ var $input;
+ $input = $('input').first();
+ $input.enable();
+
+ expect($input).not.toHaveAttr('disabled');
+ });
+ return it('removes the disabled class', function() {
+ var $input;
+ $input = $('input').first();
+ $input.enable();
+
+ expect($input).not.toHaveClass('disabled');
});
});
-}).call(window);
+});
diff --git a/spec/javascripts/bootstrap_linked_tabs_spec.js b/spec/javascripts/bootstrap_linked_tabs_spec.js
index 6f679369289..c3e3d78ff63 100644
--- a/spec/javascripts/bootstrap_linked_tabs_spec.js
+++ b/spec/javascripts/bootstrap_linked_tabs_spec.js
@@ -1,60 +1,67 @@
import LinkedTabs from '~/lib/utils/bootstrap_linked_tabs';
-(() => {
- describe('Linked Tabs', () => {
- preloadFixtures('static/linked_tabs.html.raw');
+describe('Linked Tabs', () => {
+ preloadFixtures('static/linked_tabs.html.raw');
+ beforeEach(() => {
+ loadFixtures('static/linked_tabs.html.raw');
+ });
+
+ describe('when is initialized', () => {
beforeEach(() => {
- loadFixtures('static/linked_tabs.html.raw');
+ spyOn(window.history, 'replaceState').and.callFake(function() {});
});
- describe('when is initialized', () => {
- beforeEach(() => {
- spyOn(window.history, 'replaceState').and.callFake(function () {});
+ it('should activate the tab correspondent to the given action', () => {
+ // eslint-disable-next-line no-new
+ new LinkedTabs({
+ action: 'tab1',
+ defaultAction: 'tab1',
+ parentEl: '.linked-tabs',
});
- it('should activate the tab correspondent to the given action', () => {
- const linkedTabs = new LinkedTabs({ // eslint-disable-line
- action: 'tab1',
- defaultAction: 'tab1',
- parentEl: '.linked-tabs',
- });
+ expect(document.querySelector('#tab1').classList).toContain('active');
+ });
- expect(document.querySelector('#tab1').classList).toContain('active');
+ it('should active the default tab action when the action is show', () => {
+ // eslint-disable-next-line no-new
+ new LinkedTabs({
+ action: 'show',
+ defaultAction: 'tab1',
+ parentEl: '.linked-tabs',
});
- it('should active the default tab action when the action is show', () => {
- const linkedTabs = new LinkedTabs({ // eslint-disable-line
- action: 'show',
- defaultAction: 'tab1',
- parentEl: '.linked-tabs',
- });
-
- expect(document.querySelector('#tab1').classList).toContain('active');
- });
+ expect(document.querySelector('#tab1').classList).toContain('active');
});
+ });
- describe('on click', () => {
- it('should change the url according to the clicked tab', () => {
- const historySpy = spyOn(window.history, 'replaceState').and.callFake(() => {});
+ describe('on click', () => {
+ it('should change the url according to the clicked tab', () => {
+ const historySpy = spyOn(window.history, 'replaceState').and.callFake(() => {});
- const linkedTabs = new LinkedTabs({
- action: 'show',
- defaultAction: 'tab1',
- parentEl: '.linked-tabs',
- });
+ const linkedTabs = new LinkedTabs({
+ action: 'show',
+ defaultAction: 'tab1',
+ parentEl: '.linked-tabs',
+ });
- const secondTab = document.querySelector('.linked-tabs li:nth-child(2) a');
- const newState = secondTab.getAttribute('href') + linkedTabs.currentLocation.search + linkedTabs.currentLocation.hash;
+ const secondTab = document.querySelector('.linked-tabs li:nth-child(2) a');
+ const newState =
+ secondTab.getAttribute('href') +
+ linkedTabs.currentLocation.search +
+ linkedTabs.currentLocation.hash;
- secondTab.click();
+ secondTab.click();
- if (historySpy) {
- expect(historySpy).toHaveBeenCalledWith({
+ if (historySpy) {
+ expect(historySpy).toHaveBeenCalledWith(
+ {
url: newState,
- }, document.title, newState);
- }
- });
+ },
+ document.title,
+ newState,
+ );
+ }
});
});
-})();
+});
diff --git a/spec/javascripts/breakpoints_spec.js b/spec/javascripts/breakpoints_spec.js
index b1b5d36c1fb..5ee777fee3f 100644
--- a/spec/javascripts/breakpoints_spec.js
+++ b/spec/javascripts/breakpoints_spec.js
@@ -1,9 +1,7 @@
-import bp, {
- breakpoints,
-} from '~/breakpoints';
+import bp, { breakpoints } from '~/breakpoints';
describe('breakpoints', () => {
- Object.keys(breakpoints).forEach((key) => {
+ Object.keys(breakpoints).forEach(key => {
const size = breakpoints[key];
it(`returns ${key} when larger than ${size}`, () => {
diff --git a/spec/javascripts/ci_variable_list/ajax_variable_list_spec.js b/spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
index ee457a9c48c..1fc0e206d5e 100644
--- a/spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
+++ b/spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
@@ -24,7 +24,7 @@ describe('AjaxFormVariableList', () => {
mock = new MockAdapter(axios);
const ajaxVariableListEl = document.querySelector('.js-ci-variable-list-section');
- saveButton = ajaxVariableListEl.querySelector('.js-secret-variables-save-button');
+ saveButton = ajaxVariableListEl.querySelector('.js-ci-variables-save-button');
errorBox = container.querySelector('.js-ci-variable-error-box');
ajaxVariableList = new AjaxFormVariableList({
container,
@@ -43,8 +43,8 @@ describe('AjaxFormVariableList', () => {
});
describe('onSaveClicked', () => {
- it('shows loading spinner while waiting for the request', (done) => {
- const loadingIcon = saveButton.querySelector('.js-secret-variables-save-loading-icon');
+ it('shows loading spinner while waiting for the request', done => {
+ const loadingIcon = saveButton.querySelector('.js-ci-variables-save-loading-icon');
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(() => {
expect(loadingIcon.classList.contains(HIDE_CLASS)).toEqual(false);
@@ -54,7 +54,8 @@ describe('AjaxFormVariableList', () => {
expect(loadingIcon.classList.contains(HIDE_CLASS)).toEqual(true);
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(loadingIcon.classList.contains(HIDE_CLASS)).toEqual(true);
})
@@ -62,27 +63,30 @@ describe('AjaxFormVariableList', () => {
.catch(done.fail);
});
- it('calls `updateRowsWithPersistedVariables` with the persisted variables', (done) => {
+ it('calls `updateRowsWithPersistedVariables` with the persisted variables', done => {
const variablesResponse = [{ id: 1, key: 'foo', value: 'bar' }];
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(200, {
variables: variablesResponse,
});
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
- expect(ajaxVariableList.updateRowsWithPersistedVariables)
- .toHaveBeenCalledWith(variablesResponse);
+ expect(ajaxVariableList.updateRowsWithPersistedVariables).toHaveBeenCalledWith(
+ variablesResponse,
+ );
})
.then(done)
.catch(done.fail);
});
- it('hides any previous error box', (done) => {
+ it('hides any previous error box', done => {
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(200);
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(true);
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(true);
})
@@ -90,14 +94,15 @@ describe('AjaxFormVariableList', () => {
.catch(done.fail);
});
- it('disables remove buttons while waiting for the request', (done) => {
+ it('disables remove buttons while waiting for the request', done => {
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(() => {
expect(ajaxVariableList.variableList.toggleEnableRow).toHaveBeenCalledWith(false);
return [200, {}];
});
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(ajaxVariableList.variableList.toggleEnableRow).toHaveBeenCalledWith(true);
})
@@ -105,7 +110,7 @@ describe('AjaxFormVariableList', () => {
.catch(done.fail);
});
- it('hides secret values', (done) => {
+ it('hides secret values', done => {
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(200, {});
const row = container.querySelector('.js-row:first-child');
@@ -118,7 +123,8 @@ describe('AjaxFormVariableList', () => {
expect(valuePlaceholder.classList.contains(HIDE_CLASS)).toBe(true);
expect(valueInput.classList.contains(HIDE_CLASS)).toBe(false);
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(valuePlaceholder.classList.contains(HIDE_CLASS)).toBe(false);
expect(valueInput.classList.contains(HIDE_CLASS)).toBe(true);
@@ -127,29 +133,31 @@ describe('AjaxFormVariableList', () => {
.catch(done.fail);
});
- it('shows error box with validation errors', (done) => {
+ it('shows error box with validation errors', done => {
const validationError = 'some validation error';
- mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(400, [
- validationError,
- ]);
+ mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(400, [validationError]);
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(true);
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(false);
- expect(errorBox.textContent.trim().replace(/\n+\s+/m, ' ')).toEqual(`Validation failed ${validationError}`);
+ expect(errorBox.textContent.trim().replace(/\n+\s+/m, ' ')).toEqual(
+ `Validation failed ${validationError}`,
+ );
})
.then(done)
.catch(done.fail);
});
- it('shows flash message when request fails', (done) => {
+ it('shows flash message when request fails', done => {
mock.onPatch(VARIABLE_PATCH_ENDPOINT).reply(500);
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(true);
- ajaxVariableList.onSaveClicked()
+ ajaxVariableList
+ .onSaveClicked()
.then(() => {
expect(errorBox.classList.contains(HIDE_CLASS)).toEqual(true);
})
@@ -164,7 +172,7 @@ describe('AjaxFormVariableList', () => {
container = document.querySelector('.js-ci-variable-list-section');
const ajaxVariableListEl = document.querySelector('.js-ci-variable-list-section');
- saveButton = ajaxVariableListEl.querySelector('.js-secret-variables-save-button');
+ saveButton = ajaxVariableListEl.querySelector('.js-ci-variables-save-button');
errorBox = container.querySelector('.js-ci-variable-error-box');
ajaxVariableList = new AjaxFormVariableList({
container,
@@ -200,11 +208,13 @@ describe('AjaxFormVariableList', () => {
expect(idInput.value).toEqual('');
- ajaxVariableList.updateRowsWithPersistedVariables([{
- id: 3,
- key: 'foo',
- value: 'bar',
- }]);
+ ajaxVariableList.updateRowsWithPersistedVariables([
+ {
+ id: 3,
+ key: 'foo',
+ value: 'bar',
+ },
+ ]);
expect(idInput.value).toEqual('3');
expect(row.dataset.isPersisted).toEqual('true');
diff --git a/spec/javascripts/ci_variable_list/ci_variable_list_spec.js b/spec/javascripts/ci_variable_list/ci_variable_list_spec.js
index 2fa50975f0f..30b15011def 100644
--- a/spec/javascripts/ci_variable_list/ci_variable_list_spec.js
+++ b/spec/javascripts/ci_variable_list/ci_variable_list_spec.js
@@ -33,7 +33,8 @@ describe('VariableList', () => {
it('should add another row when editing the last rows key input', () => {
const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-key')
+ $row
+ .find('.js-ci-variable-input-key')
.val('foo')
.trigger('input');
@@ -41,12 +42,14 @@ describe('VariableList', () => {
// Check for the correct default in the new row
const $keyInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
+
expect($keyInput.val()).toBe('');
});
it('should add another row when editing the last rows value textarea', () => {
const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-value')
+ $row
+ .find('.js-ci-variable-input-value')
.val('foo')
.trigger('input');
@@ -54,18 +57,21 @@ describe('VariableList', () => {
// Check for the correct default in the new row
const $valueInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
+
expect($valueInput.val()).toBe('');
});
it('should remove empty row after blurring', () => {
const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-key')
+ $row
+ .find('.js-ci-variable-input-key')
.val('foo')
.trigger('input');
expect($wrapper.find('.js-row').length).toBe(2);
- $row.find('.js-ci-variable-input-key')
+ $row
+ .find('.js-ci-variable-input-key')
.val('')
.trigger('input')
.trigger('blur');
@@ -119,7 +125,7 @@ describe('VariableList', () => {
variableList.init();
});
- it('should add another row when editing the last rows protected checkbox', (done) => {
+ it('should add another row when editing the last rows protected checkbox', done => {
const $row = $wrapper.find('.js-row:last-child');
$row.find('.ci-variable-protected-item .js-project-feature-toggle').click();
@@ -128,7 +134,10 @@ describe('VariableList', () => {
expect($wrapper.find('.js-row').length).toBe(2);
// Check for the correct default in the new row
- const $protectedInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-protected');
+ const $protectedInput = $wrapper
+ .find('.js-row:last-child')
+ .find('.js-ci-variable-input-protected');
+
expect($protectedInput.val()).toBe('false');
})
.then(done)
@@ -166,6 +175,7 @@ describe('VariableList', () => {
it('should enable all remove buttons', () => {
variableList.toggleEnableRow(false);
+
expect($wrapper.find('.js-row-remove-button[disabled]').length).toBe(3);
variableList.toggleEnableRow(true);
@@ -175,6 +185,7 @@ describe('VariableList', () => {
it('should enable all key inputs', () => {
variableList.toggleEnableRow(false);
+
expect($wrapper.find('.js-ci-variable-input-key[disabled]').length).toBe(3);
variableList.toggleEnableRow(true);
@@ -200,7 +211,8 @@ describe('VariableList', () => {
const $inputValue = $row.find('.js-ci-variable-input-value');
const $placeholder = $row.find('.js-secret-value-placeholder');
- $row.find('.js-ci-variable-input-value')
+ $row
+ .find('.js-ci-variable-input-value')
.val('foo')
.trigger('input');
diff --git a/spec/javascripts/ci_variable_list/native_form_variable_list_spec.js b/spec/javascripts/ci_variable_list/native_form_variable_list_spec.js
index 94a0c999d66..997d0d54d79 100644
--- a/spec/javascripts/ci_variable_list/native_form_variable_list_spec.js
+++ b/spec/javascripts/ci_variable_list/native_form_variable_list_spec.js
@@ -19,8 +19,14 @@ describe('NativeFormVariableList', () => {
describe('onFormSubmit', () => {
it('should clear out the `name` attribute on the inputs for the last empty row on form submission (avoid BE validation)', () => {
const $row = $wrapper.find('.js-row');
- expect($row.find('.js-ci-variable-input-key').attr('name')).toBe('schedule[variables_attributes][][key]');
- expect($row.find('.js-ci-variable-input-value').attr('name')).toBe('schedule[variables_attributes][][secret_value]');
+
+ expect($row.find('.js-ci-variable-input-key').attr('name')).toBe(
+ 'schedule[variables_attributes][][key]',
+ );
+
+ expect($row.find('.js-ci-variable-input-value').attr('name')).toBe(
+ 'schedule[variables_attributes][][secret_value]',
+ );
$wrapper.closest('form').trigger('trigger-submit');
diff --git a/spec/javascripts/close_reopen_report_toggle_spec.js b/spec/javascripts/close_reopen_report_toggle_spec.js
index 925e959c85a..04a7ae7f429 100644
--- a/spec/javascripts/close_reopen_report_toggle_spec.js
+++ b/spec/javascripts/close_reopen_report_toggle_spec.js
@@ -1,3 +1,5 @@
+/* eslint-disable jasmine/no-unsafe-spy */
+
import CloseReopenReportToggle from '~/close_reopen_report_toggle';
import DropLab from '~/droplab/drop_lab';
@@ -8,7 +10,7 @@ describe('CloseReopenReportToggle', () => {
const button = {};
let commentTypeToggle;
- beforeEach(function () {
+ beforeEach(function() {
commentTypeToggle = new CloseReopenReportToggle({
dropdownTrigger,
dropdownList,
@@ -16,15 +18,15 @@ describe('CloseReopenReportToggle', () => {
});
});
- it('sets .dropdownTrigger', function () {
+ it('sets .dropdownTrigger', function() {
expect(commentTypeToggle.dropdownTrigger).toBe(dropdownTrigger);
});
- it('sets .dropdownList', function () {
+ it('sets .dropdownList', function() {
expect(commentTypeToggle.dropdownList).toBe(dropdownList);
});
- it('sets .button', function () {
+ it('sets .button', function() {
expect(commentTypeToggle.button).toBe(button);
});
});
diff --git a/spec/javascripts/clusters/clusters_bundle_spec.js b/spec/javascripts/clusters/clusters_bundle_spec.js
index d0e0b214509..880b469284b 100644
--- a/spec/javascripts/clusters/clusters_bundle_spec.js
+++ b/spec/javascripts/clusters/clusters_bundle_spec.js
@@ -21,21 +21,21 @@ describe('Clusters', () => {
});
describe('toggle', () => {
- it('should update the button and the input field on click', (done) => {
- const toggleButton = document.querySelector('.js-cluster-enable-toggle-area .js-project-feature-toggle');
- const toggleInput = document.querySelector('.js-cluster-enable-toggle-area .js-project-feature-toggle-input');
+ it('should update the button and the input field on click', done => {
+ const toggleButton = document.querySelector(
+ '.js-cluster-enable-toggle-area .js-project-feature-toggle',
+ );
+ const toggleInput = document.querySelector(
+ '.js-cluster-enable-toggle-area .js-project-feature-toggle-input',
+ );
toggleButton.click();
getSetTimeoutPromise()
.then(() => {
- expect(
- toggleButton.classList,
- ).not.toContain('is-checked');
+ expect(toggleButton.classList).not.toContain('is-checked');
- expect(
- toggleInput.getAttribute('value'),
- ).toEqual('false');
+ expect(toggleInput.getAttribute('value')).toEqual('false');
})
.then(done)
.catch(done.fail);
@@ -46,29 +46,21 @@ describe('Clusters', () => {
it('should update token field type', () => {
cluster.showTokenButton.click();
- expect(
- cluster.tokenField.getAttribute('type'),
- ).toEqual('text');
+ expect(cluster.tokenField.getAttribute('type')).toEqual('text');
cluster.showTokenButton.click();
- expect(
- cluster.tokenField.getAttribute('type'),
- ).toEqual('password');
+ expect(cluster.tokenField.getAttribute('type')).toEqual('password');
});
it('should update show token button text', () => {
cluster.showTokenButton.click();
- expect(
- cluster.showTokenButton.textContent,
- ).toEqual('Hide');
+ expect(cluster.showTokenButton.textContent).toEqual('Hide');
cluster.showTokenButton.click();
- expect(
- cluster.showTokenButton.textContent,
- ).toEqual('Show');
+ expect(cluster.showTokenButton.textContent).toEqual('Show');
});
});
@@ -86,37 +78,50 @@ describe('Clusters', () => {
});
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
+
expect(flashMessage).toBeNull();
});
it('shows an alert when something gets newly installed', () => {
- cluster.checkForNewInstalls({
- ...INITIAL_APP_MAP,
- helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
- }, {
- ...INITIAL_APP_MAP,
- helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
- });
+ cluster.checkForNewInstalls(
+ {
+ ...INITIAL_APP_MAP,
+ helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
+ },
+ {
+ ...INITIAL_APP_MAP,
+ helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
+ },
+ );
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
+
expect(flashMessage).not.toBeNull();
- expect(flashMessage.textContent.trim()).toEqual('Helm Tiller was successfully installed on your Kubernetes cluster');
+ expect(flashMessage.textContent.trim()).toEqual(
+ 'Helm Tiller was successfully installed on your Kubernetes cluster',
+ );
});
it('shows an alert when multiple things gets newly installed', () => {
- cluster.checkForNewInstalls({
- ...INITIAL_APP_MAP,
- helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
- ingress: { status: APPLICATION_STATUS.INSTALLABLE, title: 'Ingress' },
- }, {
- ...INITIAL_APP_MAP,
- helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
- ingress: { status: APPLICATION_STATUS.INSTALLED, title: 'Ingress' },
- });
+ cluster.checkForNewInstalls(
+ {
+ ...INITIAL_APP_MAP,
+ helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
+ ingress: { status: APPLICATION_STATUS.INSTALLABLE, title: 'Ingress' },
+ },
+ {
+ ...INITIAL_APP_MAP,
+ helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
+ ingress: { status: APPLICATION_STATUS.INSTALLED, title: 'Ingress' },
+ },
+ );
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
+
expect(flashMessage).not.toBeNull();
- expect(flashMessage.textContent.trim()).toEqual('Helm Tiller, Ingress was successfully installed on your Kubernetes cluster');
+ expect(flashMessage.textContent.trim()).toEqual(
+ 'Helm Tiller, Ingress was successfully installed on your Kubernetes cluster',
+ );
});
});
@@ -125,29 +130,21 @@ describe('Clusters', () => {
it('should show the creating container', () => {
cluster.updateContainer(null, 'creating');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeFalsy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeTruthy();
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeFalsy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeTruthy();
});
it('should continue to show `creating` banner with subsequent updates of the same status', () => {
cluster.updateContainer('creating', 'creating');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeFalsy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeTruthy();
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeFalsy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeTruthy();
});
});
@@ -155,29 +152,21 @@ describe('Clusters', () => {
it('should show the success container and fresh the page', () => {
cluster.updateContainer(null, 'created');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeFalsy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeTruthy();
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeFalsy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeTruthy();
});
it('should not show a banner when status is already `created`', () => {
cluster.updateContainer('created', 'created');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeTruthy();
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeTruthy();
});
});
@@ -185,40 +174,31 @@ describe('Clusters', () => {
it('should show the error container', () => {
cluster.updateContainer(null, 'errored', 'this is an error');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeFalsy();
-
- expect(
- cluster.errorReasonContainer.textContent,
- ).toContain('this is an error');
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeFalsy();
+
+ expect(cluster.errorReasonContainer.textContent).toContain('this is an error');
});
it('should show `error` banner when previously `creating`', () => {
cluster.updateContainer('creating', 'errored');
- expect(
- cluster.creatingContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.successContainer.classList.contains('hidden'),
- ).toBeTruthy();
- expect(
- cluster.errorContainer.classList.contains('hidden'),
- ).toBeFalsy();
+ expect(cluster.creatingContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.successContainer.classList.contains('hidden')).toBeTruthy();
+
+ expect(cluster.errorContainer.classList.contains('hidden')).toBeFalsy();
});
});
});
describe('installApplication', () => {
- it('tries to install helm', (done) => {
+ it('tries to install helm', done => {
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
+
expect(cluster.store.state.applications.helm.requestStatus).toEqual(null);
cluster.installApplication({ id: 'helm' });
@@ -236,8 +216,9 @@ describe('Clusters', () => {
.catch(done.fail);
});
- it('tries to install ingress', (done) => {
+ it('tries to install ingress', done => {
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
+
expect(cluster.store.state.applications.ingress.requestStatus).toEqual(null);
cluster.installApplication({ id: 'ingress' });
@@ -255,8 +236,9 @@ describe('Clusters', () => {
.catch(done.fail);
});
- it('tries to install runner', (done) => {
+ it('tries to install runner', done => {
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
+
expect(cluster.store.state.applications.runner.requestStatus).toEqual(null);
cluster.installApplication({ id: 'runner' });
@@ -274,26 +256,35 @@ describe('Clusters', () => {
.catch(done.fail);
});
- it('tries to install jupyter', (done) => {
+ it('tries to install jupyter', done => {
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
+
expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(null);
- cluster.installApplication({ id: 'jupyter', params: { hostname: cluster.store.state.applications.jupyter.hostname } });
+ cluster.installApplication({
+ id: 'jupyter',
+ params: { hostname: cluster.store.state.applications.jupyter.hostname },
+ });
expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(REQUEST_LOADING);
expect(cluster.store.state.applications.jupyter.requestReason).toEqual(null);
- expect(cluster.service.installApplication).toHaveBeenCalledWith('jupyter', { hostname: cluster.store.state.applications.jupyter.hostname });
+ expect(cluster.service.installApplication).toHaveBeenCalledWith('jupyter', {
+ hostname: cluster.store.state.applications.jupyter.hostname,
+ });
getSetTimeoutPromise()
- .then(() => {
- expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(REQUEST_SUCCESS);
- expect(cluster.store.state.applications.jupyter.requestReason).toEqual(null);
- })
- .then(done)
- .catch(done.fail);
+ .then(() => {
+ expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(REQUEST_SUCCESS);
+ expect(cluster.store.state.applications.jupyter.requestReason).toEqual(null);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('sets error request status when the request fails', (done) => {
- spyOn(cluster.service, 'installApplication').and.returnValue(Promise.reject(new Error('STUBBED ERROR')));
+ it('sets error request status when the request fails', done => {
+ spyOn(cluster.service, 'installApplication').and.returnValue(
+ Promise.reject(new Error('STUBBED ERROR')),
+ );
+
expect(cluster.store.state.applications.helm.requestStatus).toEqual(null);
cluster.installApplication({ id: 'helm' });
diff --git a/spec/javascripts/clusters/components/application_row_spec.js b/spec/javascripts/clusters/components/application_row_spec.js
index 9da5c248371..45d56514930 100644
--- a/spec/javascripts/clusters/components/application_row_spec.js
+++ b/spec/javascripts/clusters/components/application_row_spec.js
@@ -112,6 +112,17 @@ describe('Application Row', () => {
expect(vm.installButtonDisabled).toEqual(true);
});
+ it('has disabled "Installed" when APPLICATION_STATUS.UPDATING', () => {
+ vm = mountComponent(ApplicationRow, {
+ ...DEFAULT_APPLICATION_STATE,
+ status: APPLICATION_STATUS.UPDATING,
+ });
+
+ expect(vm.installButtonLabel).toEqual('Installed');
+ expect(vm.installButtonLoading).toEqual(false);
+ expect(vm.installButtonDisabled).toEqual(true);
+ });
+
it('has enabled "Install" when APPLICATION_STATUS.ERROR', () => {
vm = mountComponent(ApplicationRow, {
...DEFAULT_APPLICATION_STATE,
@@ -215,7 +226,9 @@ describe('Application Row', () => {
status: null,
requestStatus: null,
});
- const generalErrorMessage = vm.$el.querySelector('.js-cluster-application-general-error-message');
+ const generalErrorMessage = vm.$el.querySelector(
+ '.js-cluster-application-general-error-message',
+ );
expect(generalErrorMessage).toBeNull();
});
@@ -227,10 +240,17 @@ describe('Application Row', () => {
status: APPLICATION_STATUS.ERROR,
statusReason,
});
- const generalErrorMessage = vm.$el.querySelector('.js-cluster-application-general-error-message');
- const statusErrorMessage = vm.$el.querySelector('.js-cluster-application-status-error-message');
+ const generalErrorMessage = vm.$el.querySelector(
+ '.js-cluster-application-general-error-message',
+ );
+ const statusErrorMessage = vm.$el.querySelector(
+ '.js-cluster-application-status-error-message',
+ );
+
+ expect(generalErrorMessage.textContent.trim()).toEqual(
+ `Something went wrong while installing ${DEFAULT_APPLICATION_STATE.title}`,
+ );
- expect(generalErrorMessage.textContent.trim()).toEqual(`Something went wrong while installing ${DEFAULT_APPLICATION_STATE.title}`);
expect(statusErrorMessage.textContent.trim()).toEqual(statusReason);
});
@@ -242,10 +262,17 @@ describe('Application Row', () => {
requestStatus: REQUEST_FAILURE,
requestReason,
});
- const generalErrorMessage = vm.$el.querySelector('.js-cluster-application-general-error-message');
- const requestErrorMessage = vm.$el.querySelector('.js-cluster-application-request-error-message');
+ const generalErrorMessage = vm.$el.querySelector(
+ '.js-cluster-application-general-error-message',
+ );
+ const requestErrorMessage = vm.$el.querySelector(
+ '.js-cluster-application-request-error-message',
+ );
+
+ expect(generalErrorMessage.textContent.trim()).toEqual(
+ `Something went wrong while installing ${DEFAULT_APPLICATION_STATE.title}`,
+ );
- expect(generalErrorMessage.textContent.trim()).toEqual(`Something went wrong while installing ${DEFAULT_APPLICATION_STATE.title}`);
expect(requestErrorMessage.textContent.trim()).toEqual(requestReason);
});
});
diff --git a/spec/javascripts/clusters/components/applications_spec.js b/spec/javascripts/clusters/components/applications_spec.js
index a70138c7eee..0e2cc13fa52 100644
--- a/spec/javascripts/clusters/components/applications_spec.js
+++ b/spec/javascripts/clusters/components/applications_spec.js
@@ -23,6 +23,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub' },
+ knative: { title: 'Knative' },
},
});
});
@@ -46,6 +47,10 @@ describe('Applications', () => {
it('renders a row for Jupyter', () => {
expect(vm.$el.querySelector('.js-cluster-application-row-jupyter')).not.toBe(null);
});
+
+ it('renders a row for Knative', () => {
+ expect(vm.$el.querySelector('.js-cluster-application-row-knative')).not.toBe(null);
+ });
});
describe('Ingress application', () => {
@@ -63,6 +68,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '' },
+ knative: { title: 'Knative', hostname: '' },
},
});
@@ -86,6 +92,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '' },
+ knative: { title: 'Knative', hostname: '' },
},
});
@@ -105,6 +112,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '' },
+ knative: { title: 'Knative', hostname: '' },
},
});
@@ -123,6 +131,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
+ knative: { title: 'Knative', hostname: '', status: 'installable' },
},
});
@@ -139,6 +148,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
+ knative: { title: 'Knative', hostname: '', status: 'installable' },
},
});
@@ -155,6 +165,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', status: 'installed', hostname: '' },
+ knative: { title: 'Knative', status: 'installed', hostname: '' },
},
});
@@ -171,6 +182,7 @@ describe('Applications', () => {
runner: { title: 'GitLab Runner' },
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', status: 'not_installable' },
+ knative: { title: 'Knative' },
},
});
});
diff --git a/spec/javascripts/clusters/services/mock_data.js b/spec/javascripts/clusters/services/mock_data.js
index c7c1412e1c6..73abf6504c0 100644
--- a/spec/javascripts/clusters/services/mock_data.js
+++ b/spec/javascripts/clusters/services/mock_data.js
@@ -6,67 +6,88 @@ const CLUSTERS_MOCK_DATA = {
data: {
status: 'errored',
status_reason: 'Failed to request to CloudPlatform.',
- applications: [{
- name: 'helm',
- status: APPLICATION_STATUS.INSTALLABLE,
- status_reason: null,
- }, {
- name: 'ingress',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- external_ip: null,
- }, {
- name: 'runner',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: null,
- },
- {
- name: 'prometheus',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- }, {
- name: 'jupyter',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: 'Cannot connect',
- }],
+ applications: [
+ {
+ name: 'helm',
+ status: APPLICATION_STATUS.INSTALLABLE,
+ status_reason: null,
+ },
+ {
+ name: 'ingress',
+ status: APPLICATION_STATUS.ERROR,
+ status_reason: 'Cannot connect',
+ external_ip: null,
+ },
+ {
+ name: 'runner',
+ status: APPLICATION_STATUS.INSTALLING,
+ status_reason: null,
+ },
+ {
+ name: 'prometheus',
+ status: APPLICATION_STATUS.ERROR,
+ status_reason: 'Cannot connect',
+ },
+ {
+ name: 'jupyter',
+ status: APPLICATION_STATUS.INSTALLING,
+ status_reason: 'Cannot connect',
+ },
+ {
+ name: 'knative',
+ status: APPLICATION_STATUS.INSTALLING,
+ status_reason: 'Cannot connect',
+ },
+ ],
},
},
'/gitlab-org/gitlab-shell/clusters/2/status.json': {
data: {
status: 'errored',
status_reason: 'Failed to request to CloudPlatform.',
- applications: [{
- name: 'helm',
- status: APPLICATION_STATUS.INSTALLED,
- status_reason: null,
- }, {
- name: 'ingress',
- status: APPLICATION_STATUS.INSTALLED,
- status_reason: 'Cannot connect',
- external_ip: '1.1.1.1',
- }, {
- name: 'runner',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: null,
- },
- {
- name: 'prometheus',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- }, {
- name: 'jupyter',
- status: APPLICATION_STATUS.INSTALLABLE,
- status_reason: 'Cannot connect',
- }],
+ applications: [
+ {
+ name: 'helm',
+ status: APPLICATION_STATUS.INSTALLED,
+ status_reason: null,
+ },
+ {
+ name: 'ingress',
+ status: APPLICATION_STATUS.INSTALLED,
+ status_reason: 'Cannot connect',
+ external_ip: '1.1.1.1',
+ },
+ {
+ name: 'runner',
+ status: APPLICATION_STATUS.INSTALLING,
+ status_reason: null,
+ },
+ {
+ name: 'prometheus',
+ status: APPLICATION_STATUS.ERROR,
+ status_reason: 'Cannot connect',
+ },
+ {
+ name: 'jupyter',
+ status: APPLICATION_STATUS.INSTALLABLE,
+ status_reason: 'Cannot connect',
+ },
+ {
+ name: 'knative',
+ status: APPLICATION_STATUS.INSTALLABLE,
+ status_reason: 'Cannot connect',
+ },
+ ],
},
},
},
POST: {
- '/gitlab-org/gitlab-shell/clusters/1/applications/helm': { },
- '/gitlab-org/gitlab-shell/clusters/1/applications/ingress': { },
- '/gitlab-org/gitlab-shell/clusters/1/applications/runner': { },
- '/gitlab-org/gitlab-shell/clusters/1/applications/prometheus': { },
- '/gitlab-org/gitlab-shell/clusters/1/applications/jupyter': { },
+ '/gitlab-org/gitlab-shell/clusters/1/applications/helm': {},
+ '/gitlab-org/gitlab-shell/clusters/1/applications/ingress': {},
+ '/gitlab-org/gitlab-shell/clusters/1/applications/runner': {},
+ '/gitlab-org/gitlab-shell/clusters/1/applications/prometheus': {},
+ '/gitlab-org/gitlab-shell/clusters/1/applications/jupyter': {},
+ '/gitlab-org/gitlab-shell/clusters/1/applications/knative': {},
},
};
@@ -81,7 +102,4 @@ const DEFAULT_APPLICATION_STATE = {
requestReason: null,
};
-export {
- CLUSTERS_MOCK_DATA,
- DEFAULT_APPLICATION_STATE,
-};
+export { CLUSTERS_MOCK_DATA, DEFAULT_APPLICATION_STATE };
diff --git a/spec/javascripts/clusters/stores/clusters_store_spec.js b/spec/javascripts/clusters/stores/clusters_store_spec.js
index 104a064bdd3..34ed36afa5b 100644
--- a/spec/javascripts/clusters/stores/clusters_store_spec.js
+++ b/spec/javascripts/clusters/stores/clusters_store_spec.js
@@ -53,7 +53,8 @@ describe('Clusters Store', () => {
describe('updateStateFromServer', () => {
it('should store new polling data from server', () => {
- const mockResponseData = CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/1/status.json'].data;
+ const mockResponseData =
+ CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/1/status.json'].data;
store.updateStateFromServer(mockResponseData);
expect(store.state).toEqual({
@@ -99,18 +100,27 @@ describe('Clusters Store', () => {
requestReason: null,
hostname: '',
},
+ knative: {
+ title: 'Knative',
+ status: mockResponseData.applications[5].status,
+ statusReason: mockResponseData.applications[5].status_reason,
+ requestStatus: null,
+ requestReason: null,
+ hostname: null,
+ },
},
});
});
it('sets default hostname for jupyter when ingress has a ip address', () => {
- const mockResponseData = CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data;
+ const mockResponseData =
+ CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data;
store.updateStateFromServer(mockResponseData);
- expect(
- store.state.applications.jupyter.hostname,
- ).toEqual(`jupyter.${store.state.applications.ingress.externalIp}.nip.io`);
+ expect(store.state.applications.jupyter.hostname).toEqual(
+ `jupyter.${store.state.applications.ingress.externalIp}.nip.io`,
+ );
});
});
});
diff --git a/spec/javascripts/collapsed_sidebar_todo_spec.js b/spec/javascripts/collapsed_sidebar_todo_spec.js
index 8427e8a0ba7..dc5737558c0 100644
--- a/spec/javascripts/collapsed_sidebar_todo_spec.js
+++ b/spec/javascripts/collapsed_sidebar_todo_spec.js
@@ -18,10 +18,8 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
new Sidebar();
loadFixtures(fixtureName);
- document.querySelector('.js-right-sidebar')
- .classList.toggle('right-sidebar-expanded');
- document.querySelector('.js-right-sidebar')
- .classList.toggle('right-sidebar-collapsed');
+ document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-expanded');
+ document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-collapsed');
mock = new MockAdapter(axios);
@@ -44,13 +42,13 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
});
it('shows add todo button', () => {
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon'),
- ).not.toBeNull();
+ expect(document.querySelector('.js-issuable-todo.sidebar-collapsed-icon')).not.toBeNull();
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-plus-square'),
- ).not.toBeNull();
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon svg use')
+ .getAttribute('xlink:href'),
+ ).toContain('todo-add');
expect(
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
@@ -63,7 +61,7 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
).toBe('Add todo');
});
- it('toggle todo state', (done) => {
+ it('toggle todo state', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
setTimeout(() => {
@@ -72,14 +70,16 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
).not.toBeNull();
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-check-square'),
- ).not.toBeNull();
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon svg.todo-undone use')
+ .getAttribute('xlink:href'),
+ ).toContain('todo-done');
done();
});
});
- it('toggle todo state of expanded todo toggle', (done) => {
+ it('toggle todo state of expanded todo toggle', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
setTimeout(() => {
@@ -91,19 +91,21 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
});
});
- it('toggles todo button tooltip', (done) => {
+ it('toggles todo button tooltip', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
setTimeout(() => {
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('data-original-title'),
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
+ .getAttribute('data-original-title'),
).toBe('Mark todo as done');
done();
});
});
- it('marks todo as done', (done) => {
+ it('marks todo as done', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
timeoutPromise()
@@ -128,25 +130,29 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
.catch(done.fail);
});
- it('updates aria-label to mark todo as done', (done) => {
+ it('updates aria-label to mark todo as done', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
setTimeout(() => {
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
+ .getAttribute('aria-label'),
).toBe('Mark todo as done');
done();
});
});
- it('updates aria-label to add todo', (done) => {
+ it('updates aria-label to add todo', done => {
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
timeoutPromise()
.then(() => {
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
+ .getAttribute('aria-label'),
).toBe('Mark todo as done');
document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
@@ -154,7 +160,9 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
.then(timeoutPromise)
.then(() => {
expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
+ document
+ .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
+ .getAttribute('aria-label'),
).toBe('Add todo');
})
.then(done)
diff --git a/spec/javascripts/comment_type_toggle_spec.js b/spec/javascripts/comment_type_toggle_spec.js
index 0ba709298c5..8b1217a000f 100644
--- a/spec/javascripts/comment_type_toggle_spec.js
+++ b/spec/javascripts/comment_type_toggle_spec.js
@@ -1,9 +1,9 @@
import CommentTypeToggle from '~/comment_type_toggle';
import InputSetter from '~/droplab/plugins/input_setter';
-describe('CommentTypeToggle', function () {
- describe('class constructor', function () {
- beforeEach(function () {
+describe('CommentTypeToggle', function() {
+ describe('class constructor', function() {
+ beforeEach(function() {
this.dropdownTrigger = {};
this.dropdownList = {};
this.noteTypeInput = {};
@@ -19,33 +19,33 @@ describe('CommentTypeToggle', function () {
});
});
- it('should set .dropdownTrigger', function () {
+ it('should set .dropdownTrigger', function() {
expect(this.commentTypeToggle.dropdownTrigger).toBe(this.dropdownTrigger);
});
- it('should set .dropdownList', function () {
+ it('should set .dropdownList', function() {
expect(this.commentTypeToggle.dropdownList).toBe(this.dropdownList);
});
- it('should set .noteTypeInput', function () {
+ it('should set .noteTypeInput', function() {
expect(this.commentTypeToggle.noteTypeInput).toBe(this.noteTypeInput);
});
- it('should set .submitButton', function () {
+ it('should set .submitButton', function() {
expect(this.commentTypeToggle.submitButton).toBe(this.submitButton);
});
- it('should set .closeButton', function () {
+ it('should set .closeButton', function() {
expect(this.commentTypeToggle.closeButton).toBe(this.closeButton);
});
- it('should set .reopenButton', function () {
+ it('should set .reopenButton', function() {
expect(this.commentTypeToggle.reopenButton).toBe(this.reopenButton);
});
});
- describe('initDroplab', function () {
- beforeEach(function () {
+ describe('initDroplab', function() {
+ beforeEach(function() {
this.commentTypeToggle = {
dropdownTrigger: {},
dropdownList: {},
@@ -58,25 +58,27 @@ describe('CommentTypeToggle', function () {
this.droplab = jasmine.createSpyObj('droplab', ['init']);
- this.droplabConstructor = spyOnDependency(CommentTypeToggle, 'DropLab').and.returnValue(this.droplab);
+ this.droplabConstructor = spyOnDependency(CommentTypeToggle, 'DropLab').and.returnValue(
+ this.droplab,
+ );
spyOn(this.commentTypeToggle, 'setConfig').and.returnValue(this.config);
CommentTypeToggle.prototype.initDroplab.call(this.commentTypeToggle);
});
- it('should instantiate a DropLab instance', function () {
+ it('should instantiate a DropLab instance', function() {
expect(this.droplabConstructor).toHaveBeenCalled();
});
- it('should set .droplab', function () {
+ it('should set .droplab', function() {
expect(this.commentTypeToggle.droplab).toBe(this.droplab);
});
- it('should call .setConfig', function () {
+ it('should call .setConfig', function() {
expect(this.commentTypeToggle.setConfig).toHaveBeenCalled();
});
- it('should call DropLab.prototype.init', function () {
+ it('should call DropLab.prototype.init', function() {
expect(this.droplab.init).toHaveBeenCalledWith(
this.commentTypeToggle.dropdownTrigger,
this.commentTypeToggle.dropdownList,
@@ -86,9 +88,9 @@ describe('CommentTypeToggle', function () {
});
});
- describe('setConfig', function () {
- describe('if no .closeButton is provided', function () {
- beforeEach(function () {
+ describe('setConfig', function() {
+ describe('if no .closeButton is provided', function() {
+ beforeEach(function() {
this.commentTypeToggle = {
dropdownTrigger: {},
dropdownList: {},
@@ -100,28 +102,33 @@ describe('CommentTypeToggle', function () {
this.setConfig = CommentTypeToggle.prototype.setConfig.call(this.commentTypeToggle);
});
- it('should not add .closeButton related InputSetter config', function () {
+ it('should not add .closeButton related InputSetter config', function() {
expect(this.setConfig).toEqual({
- InputSetter: [{
- input: this.commentTypeToggle.noteTypeInput,
- valueAttribute: 'data-value',
- }, {
- input: this.commentTypeToggle.submitButton,
- valueAttribute: 'data-submit-text',
- }, {
- input: this.commentTypeToggle.reopenButton,
- valueAttribute: 'data-reopen-text',
- }, {
- input: this.commentTypeToggle.reopenButton,
- valueAttribute: 'data-reopen-text',
- inputAttribute: 'data-alternative-text',
- }],
+ InputSetter: [
+ {
+ input: this.commentTypeToggle.noteTypeInput,
+ valueAttribute: 'data-value',
+ },
+ {
+ input: this.commentTypeToggle.submitButton,
+ valueAttribute: 'data-submit-text',
+ },
+ {
+ input: this.commentTypeToggle.reopenButton,
+ valueAttribute: 'data-reopen-text',
+ },
+ {
+ input: this.commentTypeToggle.reopenButton,
+ valueAttribute: 'data-reopen-text',
+ inputAttribute: 'data-alternative-text',
+ },
+ ],
});
});
});
- describe('if no .reopenButton is provided', function () {
- beforeEach(function () {
+ describe('if no .reopenButton is provided', function() {
+ beforeEach(function() {
this.commentTypeToggle = {
dropdownTrigger: {},
dropdownList: {},
@@ -133,22 +140,27 @@ describe('CommentTypeToggle', function () {
this.setConfig = CommentTypeToggle.prototype.setConfig.call(this.commentTypeToggle);
});
- it('should not add .reopenButton related InputSetter config', function () {
+ it('should not add .reopenButton related InputSetter config', function() {
expect(this.setConfig).toEqual({
- InputSetter: [{
- input: this.commentTypeToggle.noteTypeInput,
- valueAttribute: 'data-value',
- }, {
- input: this.commentTypeToggle.submitButton,
- valueAttribute: 'data-submit-text',
- }, {
- input: this.commentTypeToggle.closeButton,
- valueAttribute: 'data-close-text',
- }, {
- input: this.commentTypeToggle.closeButton,
- valueAttribute: 'data-close-text',
- inputAttribute: 'data-alternative-text',
- }],
+ InputSetter: [
+ {
+ input: this.commentTypeToggle.noteTypeInput,
+ valueAttribute: 'data-value',
+ },
+ {
+ input: this.commentTypeToggle.submitButton,
+ valueAttribute: 'data-submit-text',
+ },
+ {
+ input: this.commentTypeToggle.closeButton,
+ valueAttribute: 'data-close-text',
+ },
+ {
+ input: this.commentTypeToggle.closeButton,
+ valueAttribute: 'data-close-text',
+ inputAttribute: 'data-alternative-text',
+ },
+ ],
});
});
});
diff --git a/spec/javascripts/commit/commit_pipeline_status_component_spec.js b/spec/javascripts/commit/commit_pipeline_status_component_spec.js
index d3776d0c3cf..f6b36e88a5f 100644
--- a/spec/javascripts/commit/commit_pipeline_status_component_spec.js
+++ b/spec/javascripts/commit/commit_pipeline_status_component_spec.js
@@ -22,19 +22,22 @@ describe('Commit pipeline status component', () => {
Component = Vue.extend(commitPipelineStatus);
});
- describe('While polling pipeline data succesfully', () => {
+ describe('While polling pipeline data successfully', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
mock.onGet('/dummy/endpoint').reply(() => {
- const res = Promise.resolve([200, {
- pipelines: [
- {
- details: {
- status: mockCiStatus,
+ const res = Promise.resolve([
+ 200,
+ {
+ pipelines: [
+ {
+ details: {
+ status: mockCiStatus,
+ },
},
- },
- ],
- }]);
+ ],
+ },
+ ]);
return res;
});
vm = mountComponent(Component, {
@@ -48,7 +51,7 @@ describe('Commit pipeline status component', () => {
mock.restore();
});
- it('shows the loading icon when polling is starting', (done) => {
+ it('shows the loading icon when polling is starting', done => {
expect(vm.$el.querySelector('.loading-container')).not.toBe(null);
setTimeout(() => {
expect(vm.$el.querySelector('.loading-container')).toBe(null);
@@ -56,23 +59,25 @@ describe('Commit pipeline status component', () => {
});
});
- it('contains a ciStatus when the polling is succesful ', (done) => {
+ it('contains a ciStatus when the polling is successful ', done => {
setTimeout(() => {
expect(vm.ciStatus).toEqual(mockCiStatus);
done();
});
});
- it('contains a ci-status icon when polling is succesful', (done) => {
+ it('contains a ci-status icon when polling is successful', done => {
setTimeout(() => {
expect(vm.$el.querySelector('.ci-status-icon')).not.toBe(null);
- expect(vm.$el.querySelector('.ci-status-icon').classList).toContain(`ci-status-icon-${mockCiStatus.group}`);
+ expect(vm.$el.querySelector('.ci-status-icon').classList).toContain(
+ `ci-status-icon-${mockCiStatus.group}`,
+ );
done();
});
});
});
- describe('When polling data was not succesful', () => {
+ describe('When polling data was not successful', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
mock.onGet('/dummy/endpoint').reply(502, {});
@@ -89,7 +94,7 @@ describe('Commit pipeline status component', () => {
mock.restore();
});
- it('calls an errorCallback', (done) => {
+ it('calls an errorCallback', done => {
spyOn(vm, 'errorCallback').and.callThrough();
vm.$mount();
setTimeout(() => {
diff --git a/spec/javascripts/commit/pipelines/pipelines_spec.js b/spec/javascripts/commit/pipelines/pipelines_spec.js
index a18e09da50a..04c8ab44405 100644
--- a/spec/javascripts/commit/pipelines/pipelines_spec.js
+++ b/spec/javascripts/commit/pipelines/pipelines_spec.js
@@ -4,7 +4,7 @@ import axios from '~/lib/utils/axios_utils';
import pipelinesTable from '~/commit/pipelines/pipelines_table.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-describe('Pipelines table in Commits and Merge requests', function () {
+describe('Pipelines table in Commits and Merge requests', function() {
const jsonFixtureName = 'pipelines/pipelines.json';
let pipeline;
let PipelinesTable;
@@ -29,7 +29,7 @@ describe('Pipelines table in Commits and Merge requests', function () {
describe('successful request', () => {
describe('without pipelines', () => {
- beforeEach(function () {
+ beforeEach(function() {
mock.onGet('endpoint.json').reply(200, []);
vm = mountComponent(PipelinesTable, {
@@ -41,7 +41,7 @@ describe('Pipelines table in Commits and Merge requests', function () {
});
});
- it('should render the empty state', function (done) {
+ it('should render the empty state', function(done) {
setTimeout(() => {
expect(vm.$el.querySelector('.empty-state')).toBeDefined();
expect(vm.$el.querySelector('.realtime-loading')).toBe(null);
@@ -63,7 +63,7 @@ describe('Pipelines table in Commits and Merge requests', function () {
});
});
- it('should render a table with the received pipelines', (done) => {
+ it('should render a table with the received pipelines', done => {
setTimeout(() => {
expect(vm.$el.querySelectorAll('.ci-table .commit').length).toEqual(1);
expect(vm.$el.querySelector('.realtime-loading')).toBe(null);
@@ -72,6 +72,29 @@ describe('Pipelines table in Commits and Merge requests', function () {
done();
}, 0);
});
+
+ describe('with pagination', () => {
+ it('should make an API request when using pagination', done => {
+ setTimeout(() => {
+ spyOn(vm, 'updateContent');
+
+ vm.store.state.pageInfo = {
+ page: 1,
+ total: 10,
+ perPage: 2,
+ nextPage: 2,
+ totalPages: 5,
+ };
+
+ vm.$nextTick(() => {
+ vm.$el.querySelector('.js-next-button a').click();
+
+ expect(vm.updateContent).toHaveBeenCalledWith({ page: '2' });
+ done();
+ });
+ });
+ });
+ });
});
describe('pipeline badge counts', () => {
@@ -79,11 +102,11 @@ describe('Pipelines table in Commits and Merge requests', function () {
mock.onGet('endpoint.json').reply(200, [pipeline]);
});
- it('should receive update-pipelines-count event', (done) => {
+ it('should receive update-pipelines-count event', done => {
const element = document.createElement('div');
document.body.appendChild(element);
- element.addEventListener('update-pipelines-count', (event) => {
+ element.addEventListener('update-pipelines-count', event => {
expect(event.detail.pipelines).toEqual([pipeline]);
done();
});
@@ -114,7 +137,7 @@ describe('Pipelines table in Commits and Merge requests', function () {
});
});
- it('should render error state', function (done) {
+ it('should render error state', function(done) {
setTimeout(() => {
expect(vm.$el.querySelector('.js-pipelines-error-state')).toBeDefined();
expect(vm.$el.querySelector('.realtime-loading')).toBe(null);
diff --git a/spec/javascripts/commit_merge_requests_spec.js b/spec/javascripts/commit_merge_requests_spec.js
index 3466ef51ea8..82968e028d1 100644
--- a/spec/javascripts/commit_merge_requests_spec.js
+++ b/spec/javascripts/commit_merge_requests_spec.js
@@ -3,11 +3,16 @@ import * as CommitMergeRequests from '~/commit_merge_requests';
describe('CommitMergeRequests', () => {
describe('createContent', () => {
it('should return created content', () => {
- const content1 = CommitMergeRequests.createContent([{ iid: 1, path: '/path1', title: 'foo' }, { iid: 2, path: '/path2', title: 'baz' }])[0];
+ const content1 = CommitMergeRequests.createContent([
+ { iid: 1, path: '/path1', title: 'foo' },
+ { iid: 2, path: '/path2', title: 'baz' },
+ ])[0];
+
expect(content1.tagName).toEqual('SPAN');
expect(content1.childElementCount).toEqual(4);
const content2 = CommitMergeRequests.createContent([])[0];
+
expect(content2.tagName).toEqual('SPAN');
expect(content2.childElementCount).toEqual(0);
expect(content2.innerText).toEqual('No related merge requests found');
@@ -26,6 +31,7 @@ describe('CommitMergeRequests', () => {
describe('createHeader', () => {
it('should return created header', () => {
const header = CommitMergeRequests.createHeader(0, 1)[0];
+
expect(header.tagName).toEqual('SPAN');
expect(header.innerText).toEqual('1 merge request');
});
@@ -34,6 +40,7 @@ describe('CommitMergeRequests', () => {
describe('createItem', () => {
it('should return created item', () => {
const item = CommitMergeRequests.createItem({ iid: 1, path: '/path', title: 'foo' })[0];
+
expect(item.tagName).toEqual('SPAN');
expect(item.childElementCount).toEqual(2);
expect(item.children[0].tagName).toEqual('A');
@@ -44,6 +51,7 @@ describe('CommitMergeRequests', () => {
describe('createLink', () => {
it('should return created link', () => {
const link = CommitMergeRequests.createLink({ iid: 1, path: '/path', title: 'foo' })[0];
+
expect(link.tagName).toEqual('A');
expect(link.href).toMatch(/\/path$/);
expect(link.innerText).toEqual('!1');
@@ -53,6 +61,7 @@ describe('CommitMergeRequests', () => {
describe('createTitle', () => {
it('should return created title', () => {
const title = CommitMergeRequests.createTitle({ iid: 1, path: '/path', title: 'foo' })[0];
+
expect(title.tagName).toEqual('SPAN');
expect(title.innerText).toEqual('foo');
});
diff --git a/spec/javascripts/create_item_dropdown_spec.js b/spec/javascripts/create_item_dropdown_spec.js
index ee26122be12..9cf72d7c55b 100644
--- a/spec/javascripts/create_item_dropdown_spec.js
+++ b/spec/javascripts/create_item_dropdown_spec.js
@@ -1,19 +1,23 @@
import $ from 'jquery';
import CreateItemDropdown from '~/create_item_dropdown';
-const DROPDOWN_ITEM_DATA = [{
- title: 'one',
- id: 'one',
- text: 'one',
-}, {
- title: 'two',
- id: 'two',
- text: 'two',
-}, {
- title: 'three',
- id: 'three',
- text: 'three',
-}];
+const DROPDOWN_ITEM_DATA = [
+ {
+ title: 'one',
+ id: 'one',
+ text: 'one',
+ },
+ {
+ title: 'two',
+ id: 'two',
+ text: 'two',
+ },
+ {
+ title: 'three',
+ id: 'three',
+ text: 'three',
+ },
+];
describe('CreateItemDropdown', () => {
preloadFixtures('static/create_item_dropdown.html.raw');
@@ -23,7 +27,8 @@ describe('CreateItemDropdown', () => {
function createItemAndClearInput(text) {
// Filter for the new item
- $wrapperEl.find('.dropdown-input-field')
+ $wrapperEl
+ .find('.dropdown-input-field')
.val(text)
.trigger('input');
@@ -32,7 +37,8 @@ describe('CreateItemDropdown', () => {
$createButton.click();
// Clear out the filter
- $wrapperEl.find('.dropdown-input-field')
+ $wrapperEl
+ .find('.dropdown-input-field')
.val('')
.trigger('input');
}
@@ -63,6 +69,7 @@ describe('CreateItemDropdown', () => {
$('.js-dropdown-menu-toggle').click();
const $itemEls = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length);
});
});
@@ -84,7 +91,8 @@ describe('CreateItemDropdown', () => {
$('.js-dropdown-menu-toggle').click();
// Filter for the new item
- $wrapperEl.find('.dropdown-input-field')
+ $wrapperEl
+ .find('.dropdown-input-field')
.val(NEW_ITEM_TEXT)
.trigger('input');
});
@@ -106,6 +114,7 @@ describe('CreateItemDropdown', () => {
createItemAndClearInput(NEW_ITEM_TEXT);
const $itemEls = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length);
expect($($itemEls.get(DROPDOWN_ITEM_DATA.length)).text()).toEqual(NEW_ITEM_TEXT);
});
@@ -114,6 +123,7 @@ describe('CreateItemDropdown', () => {
createItemAndClearInput(DROPDOWN_ITEM_DATA[0].text);
const $itemEls = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length);
});
});
@@ -137,16 +147,16 @@ describe('CreateItemDropdown', () => {
$('.js-dropdown-menu-toggle').click();
// Filter for an item
- filterInput
- .val('one')
- .trigger('input');
+ filterInput.val('one').trigger('input');
const $itemElsAfterFilter = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemElsAfterFilter.length).toEqual(1);
createItemDropdown.clearDropdown();
const $itemElsAfterClear = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemElsAfterClear.length).toEqual(0);
expect(filterInput.val()).toEqual('');
});
@@ -176,6 +186,7 @@ describe('CreateItemDropdown', () => {
createItemAndClearInput('new-item');
const $itemEls = $wrapperEl.find('.js-dropdown-content a');
+
expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length);
expect($($itemEls[3]).text()).toEqual('new-item-text');
expect($wrapperEl.find('.dropdown-toggle-text').text()).toEqual('new-item-title');
diff --git a/spec/javascripts/create_merge_request_dropdown_spec.js b/spec/javascripts/create_merge_request_dropdown_spec.js
index b229765a8c5..00fe3f451f5 100644
--- a/spec/javascripts/create_merge_request_dropdown_spec.js
+++ b/spec/javascripts/create_merge_request_dropdown_spec.js
@@ -59,6 +59,7 @@ describe('CreateMergeRequestDropdown', () => {
expect(dropdown.createBranchPath).toBe(
`${TEST_HOST}/branches?branch_name=contains%23hash&issue=42`,
);
+
expect(dropdown.createMrPath).toBe(
`${TEST_HOST}/create_merge_request?branch_name=contains%23hash&ref=master`,
);
diff --git a/spec/javascripts/cycle_analytics/banner_spec.js b/spec/javascripts/cycle_analytics/banner_spec.js
index 2815bdba0c2..3ce2c3c4f06 100644
--- a/spec/javascripts/cycle_analytics/banner_spec.js
+++ b/spec/javascripts/cycle_analytics/banner_spec.js
@@ -17,19 +17,20 @@ describe('Cycle analytics banner', () => {
});
it('should render cycle analytics information', () => {
- expect(
- vm.$el.querySelector('h4').textContent.trim(),
- ).toEqual('Introducing Cycle Analytics');
+ expect(vm.$el.querySelector('h4').textContent.trim()).toEqual('Introducing Cycle Analytics');
expect(
- vm.$el.querySelector('p').textContent.trim().replace(/[\r\n]+/g, ' '),
- ).toContain('Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.');
- expect(
- vm.$el.querySelector('a').textContent.trim(),
- ).toEqual('Read more');
- expect(
- vm.$el.querySelector('a').getAttribute('href'),
- ).toEqual('path');
+ vm.$el
+ .querySelector('p')
+ .textContent.trim()
+ .replace(/[\r\n]+/g, ' '),
+ ).toContain(
+ 'Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.',
+ );
+
+ expect(vm.$el.querySelector('a').textContent.trim()).toEqual('Read more');
+
+ expect(vm.$el.querySelector('a').getAttribute('href')).toEqual('path');
});
it('should emit an event when close button is clicked', () => {
diff --git a/spec/javascripts/datetime_utility_spec.js b/spec/javascripts/datetime_utility_spec.js
deleted file mode 100644
index 492171684dc..00000000000
--- a/spec/javascripts/datetime_utility_spec.js
+++ /dev/null
@@ -1,170 +0,0 @@
-import * as datetimeUtility from '~/lib/utils/datetime_utility';
-
-describe('Date time utils', () => {
- describe('timeFor', () => {
- it('returns `past due` when in past', () => {
- const date = new Date();
- date.setFullYear(date.getFullYear() - 1);
-
- expect(
- datetimeUtility.timeFor(date),
- ).toBe('Past due');
- });
-
- it('returns remaining time when in the future', () => {
- const date = new Date();
- date.setFullYear(date.getFullYear() + 1);
-
- // Add a day to prevent a transient error. If date is even 1 second
- // short of a full year, timeFor will return '11 months remaining'
- date.setDate(date.getDate() + 1);
-
- expect(
- datetimeUtility.timeFor(date),
- ).toBe('1 year remaining');
- });
- });
-
- describe('get day name', () => {
- it('should return Sunday', () => {
- const day = datetimeUtility.getDayName(new Date('07/17/2016'));
- expect(day).toBe('Sunday');
- });
-
- it('should return Monday', () => {
- const day = datetimeUtility.getDayName(new Date('07/18/2016'));
- expect(day).toBe('Monday');
- });
-
- it('should return Tuesday', () => {
- const day = datetimeUtility.getDayName(new Date('07/19/2016'));
- expect(day).toBe('Tuesday');
- });
-
- it('should return Wednesday', () => {
- const day = datetimeUtility.getDayName(new Date('07/20/2016'));
- expect(day).toBe('Wednesday');
- });
-
- it('should return Thursday', () => {
- const day = datetimeUtility.getDayName(new Date('07/21/2016'));
- expect(day).toBe('Thursday');
- });
-
- it('should return Friday', () => {
- const day = datetimeUtility.getDayName(new Date('07/22/2016'));
- expect(day).toBe('Friday');
- });
-
- it('should return Saturday', () => {
- const day = datetimeUtility.getDayName(new Date('07/23/2016'));
- expect(day).toBe('Saturday');
- });
- });
-
- describe('get day difference', () => {
- it('should return 7', () => {
- const firstDay = new Date('07/01/2016');
- const secondDay = new Date('07/08/2016');
- const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
- expect(difference).toBe(7);
- });
-
- it('should return 31', () => {
- const firstDay = new Date('07/01/2016');
- const secondDay = new Date('08/01/2016');
- const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
- expect(difference).toBe(31);
- });
-
- it('should return 365', () => {
- const firstDay = new Date('07/02/2015');
- const secondDay = new Date('07/01/2016');
- const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
- expect(difference).toBe(365);
- });
- });
-});
-
-describe('timeIntervalInWords', () => {
- it('should return string with number of minutes and seconds', () => {
- expect(datetimeUtility.timeIntervalInWords(9.54)).toEqual('9 seconds');
- expect(datetimeUtility.timeIntervalInWords(1)).toEqual('1 second');
- expect(datetimeUtility.timeIntervalInWords(200)).toEqual('3 minutes 20 seconds');
- expect(datetimeUtility.timeIntervalInWords(6008)).toEqual('100 minutes 8 seconds');
- });
-});
-
-describe('dateInWords', () => {
- const date = new Date('07/01/2016');
-
- it('should return date in words', () => {
- expect(datetimeUtility.dateInWords(date)).toEqual('July 1, 2016');
- });
-
- it('should return abbreviated month name', () => {
- expect(datetimeUtility.dateInWords(date, true)).toEqual('Jul 1, 2016');
- });
-
- it('should return date in words without year', () => {
- expect(datetimeUtility.dateInWords(date, true, true)).toEqual('Jul 1');
- });
-});
-
-describe('monthInWords', () => {
- const date = new Date('2017-01-20');
-
- it('returns month name from provided date', () => {
- expect(datetimeUtility.monthInWords(date)).toBe('January');
- });
-
- it('returns abbreviated month name from provided date', () => {
- expect(datetimeUtility.monthInWords(date, true)).toBe('Jan');
- });
-});
-
-describe('totalDaysInMonth', () => {
- it('returns number of days in a month for given date', () => {
- // 1st Feb, 2016 (leap year)
- expect(datetimeUtility.totalDaysInMonth(new Date(2016, 1, 1))).toBe(29);
-
- // 1st Feb, 2017
- expect(datetimeUtility.totalDaysInMonth(new Date(2017, 1, 1))).toBe(28);
-
- // 1st Jan, 2017
- expect(datetimeUtility.totalDaysInMonth(new Date(2017, 0, 1))).toBe(31);
- });
-});
-
-describe('getSundays', () => {
- it('returns array of dates representing all Sundays of the month', () => {
- // December, 2017 (it has 5 Sundays)
- const dateOfSundays = [3, 10, 17, 24, 31];
- const sundays = datetimeUtility.getSundays(new Date(2017, 11, 1));
-
- expect(sundays.length).toBe(5);
- sundays.forEach((sunday, index) => {
- expect(sunday.getDate()).toBe(dateOfSundays[index]);
- });
- });
-});
-
-describe('getTimeframeWindowFrom', () => {
- it('returns array of date objects upto provided length start with provided startDate', () => {
- const startDate = new Date(2018, 0, 1);
- const mockTimeframe = [
- new Date(2018, 0, 1),
- new Date(2018, 1, 1),
- new Date(2018, 2, 1),
- new Date(2018, 3, 1),
- new Date(2018, 4, 31),
- ];
- const timeframe = datetimeUtility.getTimeframeWindowFrom(startDate, 5);
- expect(timeframe.length).toBe(5);
- timeframe.forEach((timeframeItem, index) => {
- expect(timeframeItem.getFullYear() === mockTimeframe[index].getFullYear()).toBe(true);
- expect(timeframeItem.getMonth() === mockTimeframe[index].getMonth()).toBe(true);
- expect(timeframeItem.getDate() === mockTimeframe[index].getDate()).toBeTruthy();
- });
- });
-});
diff --git a/spec/javascripts/deploy_keys/components/app_spec.js b/spec/javascripts/deploy_keys/components/app_spec.js
index 183d7cf2d41..f81c0cb7124 100644
--- a/spec/javascripts/deploy_keys/components/app_spec.js
+++ b/spec/javascripts/deploy_keys/components/app_spec.js
@@ -10,8 +10,8 @@ describe('Deploy keys app component', () => {
let vm;
let mock;
- beforeEach((done) => {
- // setup axios mock before component
+ beforeEach(done => {
+ // set up axios mock before component
mock = new MockAdapter(axios);
mock.onGet(`${TEST_HOST}/dummy/`).replyOnce(200, data);
@@ -60,6 +60,7 @@ describe('Deploy keys app component', () => {
expect(textContent('.js-deployKeys-tab-available_project_keys')).toContain(
'Privately accessible deploy keys',
);
+
expect(textContent('.js-deployKeys-tab-public_keys')).toContain(
'Publicly accessible deploy keys',
);
@@ -67,9 +68,11 @@ describe('Deploy keys app component', () => {
expect(textContent('.js-deployKeys-tab-enabled_keys .badge')).toBe(
`${vm.store.keys.enabled_keys.length}`,
);
+
expect(textContent('.js-deployKeys-tab-available_project_keys .badge')).toBe(
`${vm.store.keys.available_project_keys.length}`,
);
+
expect(textContent('.js-deployKeys-tab-public_keys .badge')).toBe(
`${vm.store.keys.public_keys.length}`,
);
diff --git a/spec/javascripts/deploy_keys/components/key_spec.js b/spec/javascripts/deploy_keys/components/key_spec.js
index d1de9d132b8..7117dc4a9ee 100644
--- a/spec/javascripts/deploy_keys/components/key_spec.js
+++ b/spec/javascripts/deploy_keys/components/key_spec.js
@@ -82,6 +82,7 @@ describe('Deploy keys key', () => {
it('shows expandable button if more than two projects', () => {
const labels = vm.$el.querySelectorAll('.deploy-project-label');
+
expect(labels.length).toBe(2);
expect(labels[1].textContent).toContain('others');
expect(labels[1].getAttribute('data-original-title')).toContain('Expand');
@@ -93,6 +94,7 @@ describe('Deploy keys key', () => {
Vue.nextTick(() => {
const labels = vm.$el.querySelectorAll('.deploy-project-label');
+
expect(labels.length).toBe(length);
expect(labels[1].textContent).not.toContain(`+${length} others`);
expect(labels[1].getAttribute('data-original-title')).not.toContain('Expand');
@@ -105,6 +107,7 @@ describe('Deploy keys key', () => {
Vue.nextTick(() => {
const labels = vm.$el.querySelectorAll('.deploy-project-label');
+
expect(labels.length).toBe(2);
expect(labels[1].textContent).toContain(
vm.deployKey.deploy_keys_projects[1].project.full_name,
diff --git a/spec/javascripts/diff_comments_store_spec.js b/spec/javascripts/diff_comments_store_spec.js
index d6fc6b56b82..a6d363ce88e 100644
--- a/spec/javascripts/diff_comments_store_spec.js
+++ b/spec/javascripts/diff_comments_store_spec.js
@@ -1,4 +1,4 @@
-/* eslint-disable jasmine/no-global-setup, dot-notation, jasmine/no-expect-in-setup-teardown, max-len */
+/* eslint-disable jasmine/no-global-setup, dot-notation, jasmine/no-expect-in-setup-teardown */
/* global CommentsStore */
import '~/diff_notes/models/discussion';
@@ -26,6 +26,7 @@ describe('New discussion', () => {
it('creates new discussion', () => {
expect(Object.keys(CommentsStore.state).length).toBe(0);
createDiscussion();
+
expect(Object.keys(CommentsStore.state).length).toBe(1);
});
@@ -34,6 +35,7 @@ describe('New discussion', () => {
createDiscussion(2);
const discussion = CommentsStore.state['a'];
+
expect(Object.keys(discussion.notes).length).toBe(2);
});
});
@@ -46,6 +48,7 @@ describe('Get note', () => {
it('gets note by ID', () => {
const note = CommentsStore.get('a', 1);
+
expect(note).toBeDefined();
expect(note.id).toBe(1);
});
@@ -59,17 +62,20 @@ describe('Delete discussion', () => {
it('deletes discussion by ID', () => {
CommentsStore.delete('a', 1);
+
expect(Object.keys(CommentsStore.state).length).toBe(0);
});
it('deletes discussion when no more notes', () => {
createDiscussion();
createDiscussion(2);
+
expect(Object.keys(CommentsStore.state).length).toBe(1);
expect(Object.keys(CommentsStore.state['a'].notes).length).toBe(2);
CommentsStore.delete('a', 1);
CommentsStore.delete('a', 2);
+
expect(Object.keys(CommentsStore.state).length).toBe(0);
});
});
@@ -84,6 +90,7 @@ describe('Update note', () => {
CommentsStore.update('a', 1, false, 'test');
const note = CommentsStore.get('a', 1);
+
expect(note.resolved).toBe(false);
});
});
@@ -96,6 +103,7 @@ describe('Discussion resolved', () => {
it('is resolved with single note', () => {
const discussion = CommentsStore.state['a'];
+
expect(discussion.isResolved()).toBe(true);
});
@@ -118,6 +126,7 @@ describe('Discussion resolved', () => {
createDiscussion(2, false);
discussion.resolveAllNotes();
+
expect(discussion.isResolved()).toBe(true);
});
@@ -126,6 +135,7 @@ describe('Discussion resolved', () => {
createDiscussion(2);
discussion.unResolveAllNotes();
+
expect(discussion.isResolved()).toBe(false);
});
});
diff --git a/spec/javascripts/diffs/components/app_spec.js b/spec/javascripts/diffs/components/app_spec.js
index 7237274eb43..3c9b5ee0176 100644
--- a/spec/javascripts/diffs/components/app_spec.js
+++ b/spec/javascripts/diffs/components/app_spec.js
@@ -1 +1,82 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
+import Vue from 'vue';
+import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { TEST_HOST } from 'spec/test_constants';
+import App from '~/diffs/components/app.vue';
+import createDiffsStore from '../create_diffs_store';
+import getDiffWithCommit from '../mock_data/diff_with_commit';
+
+describe('diffs/components/app', () => {
+ const oldMrTabs = window.mrTabs;
+ const Component = Vue.extend(App);
+
+ let vm;
+
+ beforeEach(() => {
+ // setup globals (needed for component to mount :/)
+ window.mrTabs = jasmine.createSpyObj('mrTabs', ['resetViewContainer']);
+
+ // setup component
+ const store = createDiffsStore();
+ store.state.diffs.isLoading = false;
+
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: {
+ endpoint: `${TEST_HOST}/diff/endpoint`,
+ projectPath: 'namespace/project',
+ currentUser: {},
+ },
+ });
+ });
+
+ afterEach(() => {
+ // reset globals
+ window.mrTabs = oldMrTabs;
+
+ // reset component
+ vm.$destroy();
+ });
+
+ it('does not show commit info', () => {
+ expect(vm.$el).not.toContainElement('.blob-commit-info');
+ });
+
+ it('shows comments message, with commit', done => {
+ vm.$store.state.diffs.commit = getDiffWithCommit().commit;
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toContainText('Only comments from the following commit are shown below');
+ expect(vm.$el).toContainElement('.blob-commit-info');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('shows comments message, with old mergeRequestDiff', done => {
+ vm.$store.state.diffs.mergeRequestDiff = { latest: false };
+ vm.$store.state.diffs.targetBranch = 'master';
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toContainText(
+ "Not all comments are displayed because you're viewing an old version of the diff.",
+ );
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('shows comments message, with startVersion', done => {
+ vm.$store.state.diffs.startVersion = 'test';
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toContainText(
+ "Not all comments are displayed because you're comparing two versions of the diff.",
+ );
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+});
diff --git a/spec/javascripts/diffs/components/changed_files_spec.js b/spec/javascripts/diffs/components/changed_files_spec.js
deleted file mode 100644
index f737e8fa38e..00000000000
--- a/spec/javascripts/diffs/components/changed_files_spec.js
+++ /dev/null
@@ -1,105 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import { mountComponentWithStore } from 'spec/helpers';
-import diffsModule from '~/diffs/store/modules';
-import changedFiles from '~/diffs/components/changed_files.vue';
-
-describe('ChangedFiles', () => {
- const Component = Vue.extend(changedFiles);
- const store = new Vuex.Store({
- modules: {
- diffs: diffsModule,
- },
- });
-
- let vm;
-
- beforeEach(() => {
- setFixtures(`
- <div id="dummy-element"></div>
- <div class="js-tabs-affix"></div>
- `);
-
- const props = {
- diffFiles: [
- {
- addedLines: 10,
- removedLines: 20,
- blob: {
- path: 'some/code.txt',
- },
- filePath: 'some/code.txt',
- },
- ],
- };
-
- vm = mountComponentWithStore(Component, { props, store });
- });
-
- describe('with single file added', () => {
- it('shows files changes', () => {
- expect(vm.$el).toContainText('1 changed file');
- });
-
- it('shows file additions and deletions', () => {
- expect(vm.$el).toContainText('10 additions');
- expect(vm.$el).toContainText('20 deletions');
- });
- });
-
- describe('diff view mode buttons', () => {
- let inlineButton;
- let parallelButton;
-
- beforeEach(() => {
- inlineButton = vm.$el.querySelector('.js-inline-diff-button');
- parallelButton = vm.$el.querySelector('.js-parallel-diff-button');
- });
-
- it('should have Inline and Side-by-side buttons', () => {
- expect(inlineButton).toBeDefined();
- expect(parallelButton).toBeDefined();
- });
-
- it('should add active class to Inline button', done => {
- vm.$store.state.diffs.diffViewType = 'inline';
-
- vm.$nextTick(() => {
- expect(inlineButton.classList.contains('active')).toEqual(true);
- expect(parallelButton.classList.contains('active')).toEqual(false);
-
- done();
- });
- });
-
- it('should toggle active state of buttons when diff view type changed', done => {
- vm.$store.state.diffs.diffViewType = 'parallel';
-
- vm.$nextTick(() => {
- expect(inlineButton.classList.contains('active')).toEqual(false);
- expect(parallelButton.classList.contains('active')).toEqual(true);
-
- done();
- });
- });
-
- describe('clicking them', () => {
- it('should toggle the diff view type', done => {
- parallelButton.click();
-
- vm.$nextTick(() => {
- expect(inlineButton.classList.contains('active')).toEqual(false);
- expect(parallelButton.classList.contains('active')).toEqual(true);
-
- inlineButton.click();
-
- vm.$nextTick(() => {
- expect(inlineButton.classList.contains('active')).toEqual(true);
- expect(parallelButton.classList.contains('active')).toEqual(false);
- done();
- });
- });
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/commit_item_spec.js b/spec/javascripts/diffs/components/commit_item_spec.js
new file mode 100644
index 00000000000..8b2ca6506c4
--- /dev/null
+++ b/spec/javascripts/diffs/components/commit_item_spec.js
@@ -0,0 +1,164 @@
+import Vue from 'vue';
+import { TEST_HOST } from 'spec/test_constants';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import { trimText } from 'spec/helpers/vue_component_helper';
+import { getTimeago } from '~/lib/utils/datetime_utility';
+import CommitItem from '~/diffs/components/commit_item.vue';
+import getDiffWithCommit from '../mock_data/diff_with_commit';
+
+const TEST_AUTHOR_NAME = 'test';
+const TEST_AUTHOR_EMAIL = 'test+test@gitlab.com';
+const TEST_AUTHOR_GRAVATAR = `${TEST_HOST}/avatar/test?s=36`;
+const TEST_SIGNATURE_HTML = '<a>Legit commit</a>';
+const TEST_PIPELINE_STATUS_PATH = `${TEST_HOST}/pipeline/status`;
+
+const getTitleElement = vm => vm.$el.querySelector('.commit-row-message.item-title');
+const getDescElement = vm => vm.$el.querySelector('pre.commit-row-description');
+const getDescExpandElement = vm =>
+ vm.$el.querySelector('.commit-content .text-expander.js-toggle-button');
+const getShaElement = vm => vm.$el.querySelector('.commit-sha-group');
+const getAvatarElement = vm => vm.$el.querySelector('.user-avatar-link');
+const getCommitterElement = vm => vm.$el.querySelector('.commiter');
+const getCommitActionsElement = vm => vm.$el.querySelector('.commit-actions');
+
+describe('diffs/components/commit_item', () => {
+ const Component = Vue.extend(CommitItem);
+ const timeago = getTimeago();
+ const { commit } = getDiffWithCommit();
+
+ let vm;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ commit: getDiffWithCommit().commit,
+ });
+ });
+
+ it('renders commit title', () => {
+ const titleElement = getTitleElement(vm);
+
+ expect(titleElement).toHaveAttr('href', commit.commit_url);
+ expect(titleElement).toHaveText(commit.title_html);
+ });
+
+ it('renders commit description', () => {
+ const descElement = getDescElement(vm);
+ const descExpandElement = getDescExpandElement(vm);
+
+ const expected = commit.description_html.replace(/&#x000A;/g, '');
+
+ expect(trimText(descElement.innerHTML)).toEqual(trimText(expected));
+ expect(descExpandElement).not.toBeNull();
+ });
+
+ it('renders commit sha', () => {
+ const shaElement = getShaElement(vm);
+ const labelElement = shaElement.querySelector('.label');
+ const buttonElement = shaElement.querySelector('button');
+
+ expect(labelElement.textContent).toEqual(commit.short_id);
+ expect(buttonElement).toHaveData('clipboard-text', commit.id);
+ });
+
+ it('renders author avatar', () => {
+ const avatarElement = getAvatarElement(vm);
+ const imgElement = avatarElement.querySelector('img');
+
+ expect(avatarElement).toHaveAttr('href', commit.author.web_url);
+ expect(imgElement).toHaveClass('s36');
+ expect(imgElement).toHaveAttr('alt', commit.author.name);
+ expect(imgElement).toHaveAttr('src', commit.author.avatar_url);
+ });
+
+ it('renders committer text', () => {
+ const committerElement = getCommitterElement(vm);
+ const nameElement = committerElement.querySelector('a');
+
+ const expectTimeText = timeago.format(commit.authored_date);
+ const expectedText = `${commit.author.name} authored ${expectTimeText}`;
+
+ expect(trimText(committerElement.textContent)).toEqual(expectedText);
+ expect(nameElement).toHaveAttr('href', commit.author.web_url);
+ expect(nameElement).toHaveText(commit.author.name);
+ });
+
+ describe('without commit description', () => {
+ beforeEach(done => {
+ vm.commit.description_html = '';
+
+ vm.$nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('hides description', () => {
+ const descElement = getDescElement(vm);
+ const descExpandElement = getDescExpandElement(vm);
+
+ expect(descElement).toBeNull();
+ expect(descExpandElement).toBeNull();
+ });
+ });
+
+ describe('with no matching user', () => {
+ beforeEach(done => {
+ vm.commit.author = null;
+ vm.commit.author_email = TEST_AUTHOR_EMAIL;
+ vm.commit.author_name = TEST_AUTHOR_NAME;
+ vm.commit.author_gravatar_url = TEST_AUTHOR_GRAVATAR;
+
+ vm.$nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('renders author avatar', () => {
+ const avatarElement = getAvatarElement(vm);
+ const imgElement = avatarElement.querySelector('img');
+
+ expect(avatarElement).toHaveAttr('href', `mailto:${TEST_AUTHOR_EMAIL}`);
+ expect(imgElement).toHaveAttr('alt', TEST_AUTHOR_NAME);
+ expect(imgElement).toHaveAttr('src', TEST_AUTHOR_GRAVATAR);
+ });
+
+ it('renders committer text', () => {
+ const committerElement = getCommitterElement(vm);
+ const nameElement = committerElement.querySelector('a');
+
+ expect(nameElement).toHaveAttr('href', `mailto:${TEST_AUTHOR_EMAIL}`);
+ expect(nameElement).toHaveText(TEST_AUTHOR_NAME);
+ });
+ });
+
+ describe('with signature', () => {
+ beforeEach(done => {
+ vm.commit.signature_html = TEST_SIGNATURE_HTML;
+
+ vm.$nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('renders signature html', () => {
+ const actionsElement = getCommitActionsElement(vm);
+
+ expect(actionsElement).toContainHtml(TEST_SIGNATURE_HTML);
+ });
+ });
+
+ describe('with pipeline status', () => {
+ beforeEach(done => {
+ vm.commit.pipeline_status_path = TEST_PIPELINE_STATUS_PATH;
+
+ vm.$nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('renders pipeline status', () => {
+ const actionsElement = getCommitActionsElement(vm);
+
+ expect(actionsElement).toContainElement('.ci-status-link');
+ });
+ });
+});
diff --git a/spec/javascripts/diffs/components/commit_widget_spec.js b/spec/javascripts/diffs/components/commit_widget_spec.js
new file mode 100644
index 00000000000..2b60bd232ed
--- /dev/null
+++ b/spec/javascripts/diffs/components/commit_widget_spec.js
@@ -0,0 +1,24 @@
+import Vue from 'vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import CommitWidget from '~/diffs/components/commit_widget.vue';
+import getDiffWithCommit from '../mock_data/diff_with_commit';
+
+describe('diffs/components/commit_widget', () => {
+ const Component = Vue.extend(CommitWidget);
+ const { commit } = getDiffWithCommit();
+
+ let vm;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ commit: getDiffWithCommit().commit,
+ });
+ });
+
+ it('renders commit item', () => {
+ const commitElement = vm.$el.querySelector('li.commit');
+
+ expect(commitElement).not.toBeNull();
+ expect(commitElement).toContainText(commit.short_id);
+ });
+});
diff --git a/spec/javascripts/diffs/components/compare_versions_spec.js b/spec/javascripts/diffs/components/compare_versions_spec.js
index 7237274eb43..d9d7f61785f 100644
--- a/spec/javascripts/diffs/components/compare_versions_spec.js
+++ b/spec/javascripts/diffs/components/compare_versions_spec.js
@@ -1 +1,125 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
+import Vue from 'vue';
+import CompareVersionsComponent from '~/diffs/components/compare_versions.vue';
+import store from '~/mr_notes/stores';
+import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import diffsMockData from '../mock_data/merge_request_diffs';
+
+describe('CompareVersions', () => {
+ let vm;
+ const targetBranch = { branchName: 'tmp-wine-dev', versionIndex: -1 };
+
+ beforeEach(() => {
+ vm = createComponentWithStore(Vue.extend(CompareVersionsComponent), store, {
+ mergeRequestDiffs: diffsMockData,
+ mergeRequestDiff: diffsMockData[0],
+ targetBranch,
+ }).$mount();
+ });
+
+ describe('template', () => {
+ it('should render Tree List toggle button with correct attribute values', () => {
+ const treeListBtn = vm.$el.querySelector('.js-toggle-tree-list');
+
+ expect(treeListBtn).not.toBeNull();
+ expect(treeListBtn.dataset.originalTitle).toBe('Toggle file browser');
+ expect(treeListBtn.querySelectorAll('svg use').length).not.toBe(0);
+ expect(treeListBtn.querySelector('svg use').getAttribute('xlink:href')).toContain(
+ '#hamburger',
+ );
+ });
+
+ it('should render comparison dropdowns with correct values', () => {
+ const sourceDropdown = vm.$el.querySelector('.mr-version-dropdown');
+ const targetDropdown = vm.$el.querySelector('.mr-version-compare-dropdown');
+
+ expect(sourceDropdown).not.toBeNull();
+ expect(targetDropdown).not.toBeNull();
+ expect(sourceDropdown.querySelector('a span').innerHTML).toContain('latest version');
+ expect(targetDropdown.querySelector('a span').innerHTML).toContain(targetBranch.branchName);
+ });
+
+ it('should not render comparison dropdowns if no mergeRequestDiffs are specified', () => {
+ vm.mergeRequestDiffs = [];
+
+ vm.$nextTick(() => {
+ const sourceDropdown = vm.$el.querySelector('.mr-version-dropdown');
+ const targetDropdown = vm.$el.querySelector('.mr-version-compare-dropdown');
+
+ expect(sourceDropdown).toBeNull();
+ expect(targetDropdown).toBeNull();
+ });
+ });
+
+ it('should render whitespace toggle button with correct attributes', () => {
+ const whitespaceBtn = vm.$el.querySelector('.qa-toggle-whitespace');
+ const href = vm.toggleWhitespacePath;
+
+ expect(whitespaceBtn).not.toBeNull();
+ expect(whitespaceBtn.getAttribute('href')).toEqual(href);
+ expect(whitespaceBtn.innerHTML).toContain('Hide whitespace changes');
+ });
+
+ it('should render view types buttons with correct values', () => {
+ const inlineBtn = vm.$el.querySelector('#inline-diff-btn');
+ const parallelBtn = vm.$el.querySelector('#parallel-diff-btn');
+
+ expect(inlineBtn).not.toBeNull();
+ expect(parallelBtn).not.toBeNull();
+ expect(inlineBtn.dataset.viewType).toEqual('inline');
+ expect(parallelBtn.dataset.viewType).toEqual('parallel');
+ expect(inlineBtn.innerHTML).toContain('Inline');
+ expect(parallelBtn.innerHTML).toContain('Side-by-side');
+ });
+ });
+
+ describe('setInlineDiffViewType', () => {
+ it('should persist the view type in the url', () => {
+ const viewTypeBtn = vm.$el.querySelector('#inline-diff-btn');
+ viewTypeBtn.click();
+
+ expect(window.location.toString()).toContain('?view=inline');
+ });
+ });
+
+ describe('setParallelDiffViewType', () => {
+ it('should persist the view type in the url', () => {
+ const viewTypeBtn = vm.$el.querySelector('#parallel-diff-btn');
+ viewTypeBtn.click();
+
+ expect(window.location.toString()).toContain('?view=parallel');
+ });
+ });
+
+ describe('comparableDiffs', () => {
+ it('should not contain the first item in the mergeRequestDiffs property', () => {
+ const { comparableDiffs } = vm;
+ const comparableDiffsMock = diffsMockData.slice(1);
+
+ expect(comparableDiffs).toEqual(comparableDiffsMock);
+ });
+ });
+
+ describe('isWhitespaceVisible', () => {
+ const originalHref = window.location.href;
+
+ afterEach(() => {
+ window.history.replaceState({}, null, originalHref);
+ });
+
+ it('should return "true" when no "w" flag is present in the URL (default)', () => {
+ expect(vm.isWhitespaceVisible()).toBe(true);
+ });
+
+ it('should return "false" when the flag is set to "1" in the URL', () => {
+ window.history.replaceState({}, null, '?w=1');
+
+ expect(vm.isWhitespaceVisible()).toBe(false);
+ });
+
+ it('should return "true" when the flag is set to "0" in the URL', () => {
+ window.history.replaceState({}, null, '?w=0');
+
+ expect(vm.isWhitespaceVisible()).toBe(true);
+ });
+ });
+});
diff --git a/spec/javascripts/diffs/components/diff_content_spec.js b/spec/javascripts/diffs/components/diff_content_spec.js
index dea600a783a..c25f6167163 100644
--- a/spec/javascripts/diffs/components/diff_content_spec.js
+++ b/spec/javascripts/diffs/components/diff_content_spec.js
@@ -1,20 +1,28 @@
import Vue from 'vue';
import DiffContentComponent from '~/diffs/components/diff_content.vue';
-import store from '~/mr_notes/stores';
+import { createStore } from '~/mr_notes/stores';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import { GREEN_BOX_IMAGE_URL, RED_BOX_IMAGE_URL } from 'spec/test_constants';
+import '~/behaviors/markdown/render_gfm';
import diffFileMockData from '../mock_data/diff_file';
+import discussionsMockData from '../mock_data/diff_discussions';
describe('DiffContent', () => {
const Component = Vue.extend(DiffContentComponent);
let vm;
- const getDiffFileMock = () => Object.assign({}, diffFileMockData);
beforeEach(() => {
+ const store = createStore();
+ store.state.notes.noteableData = {
+ current_user: {
+ can_create_note: false,
+ },
+ };
+
vm = mountComponentWithStore(Component, {
store,
props: {
- diffFile: getDiffFileMock(),
+ diffFile: JSON.parse(JSON.stringify(diffFileMockData)),
},
});
});
@@ -43,25 +51,61 @@ describe('DiffContent', () => {
describe('Non-Text diffs', () => {
beforeEach(() => {
- vm.diffFile.text = false;
+ vm.diffFile.viewer.name = 'image';
});
describe('image diff', () => {
- beforeEach(() => {
- vm.diffFile.newPath = GREEN_BOX_IMAGE_URL;
- vm.diffFile.newSha = 'DEF';
- vm.diffFile.oldPath = RED_BOX_IMAGE_URL;
- vm.diffFile.oldSha = 'ABC';
- vm.diffFile.viewPath = '';
+ beforeEach(done => {
+ vm.diffFile.new_path = GREEN_BOX_IMAGE_URL;
+ vm.diffFile.new_sha = 'DEF';
+ vm.diffFile.old_path = RED_BOX_IMAGE_URL;
+ vm.diffFile.old_sha = 'ABC';
+ vm.diffFile.view_path = '';
+ vm.diffFile.discussions = [{ ...discussionsMockData }];
+ vm.$store.state.diffs.commentForms.push({
+ fileHash: vm.diffFile.file_hash,
+ x: 10,
+ y: 20,
+ width: 100,
+ height: 200,
+ });
+
+ vm.$nextTick(done);
});
- it('should have image diff view in place', done => {
- vm.$nextTick(() => {
- expect(vm.$el.querySelectorAll('.js-diff-inline-view').length).toEqual(0);
+ it('should have image diff view in place', () => {
+ expect(vm.$el.querySelectorAll('.js-diff-inline-view').length).toEqual(0);
- expect(vm.$el.querySelectorAll('.diff-viewer .image').length).toEqual(1);
+ expect(vm.$el.querySelectorAll('.diff-viewer .image').length).toEqual(1);
+ });
- done();
+ it('renders image diff overlay', () => {
+ expect(vm.$el.querySelector('.image-diff-overlay')).not.toBe(null);
+ });
+
+ it('renders diff file discussions', () => {
+ expect(vm.$el.querySelectorAll('.discussion .note.timeline-entry').length).toEqual(5);
+ });
+
+ describe('handleSaveNote', () => {
+ it('dispatches handleSaveNote', () => {
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.handleSaveNote('test');
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/saveDiffDiscussion', {
+ note: 'test',
+ formData: {
+ noteableData: jasmine.anything(),
+ noteableType: jasmine.anything(),
+ diffFile: vm.diffFile,
+ positionType: 'image',
+ x: 10,
+ y: 20,
+ width: 100,
+ height: 200,
+ },
+ });
});
});
});
@@ -69,10 +113,10 @@ describe('DiffContent', () => {
describe('file diff', () => {
it('should have download buttons in place', done => {
const el = vm.$el;
- vm.diffFile.newPath = 'test.abc';
- vm.diffFile.newSha = 'DEF';
- vm.diffFile.oldPath = 'test.abc';
- vm.diffFile.oldSha = 'ABC';
+ vm.diffFile.new_path = 'test.abc';
+ vm.diffFile.new_sha = 'DEF';
+ vm.diffFile.old_path = 'test.abc';
+ vm.diffFile.old_sha = 'ABC';
vm.$nextTick(() => {
expect(el.querySelectorAll('.js-diff-inline-view').length).toEqual(0);
diff --git a/spec/javascripts/diffs/components/diff_discussions_spec.js b/spec/javascripts/diffs/components/diff_discussions_spec.js
index 270f363825f..0bc9da5ad0f 100644
--- a/spec/javascripts/diffs/components/diff_discussions_spec.js
+++ b/spec/javascripts/diffs/components/diff_discussions_spec.js
@@ -1,24 +1,90 @@
import Vue from 'vue';
import DiffDiscussions from '~/diffs/components/diff_discussions.vue';
-import store from '~/mr_notes/stores';
+import { createStore } from '~/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import '~/behaviors/markdown/render_gfm';
import discussionsMockData from '../mock_data/diff_discussions';
describe('DiffDiscussions', () => {
- let component;
+ let vm;
const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)];
- beforeEach(() => {
- component = createComponentWithStore(Vue.extend(DiffDiscussions), store, {
+ function createComponent(props = {}) {
+ const store = createStore();
+
+ vm = createComponentWithStore(Vue.extend(DiffDiscussions), store, {
discussions: getDiscussionsMockData(),
+ ...props,
}).$mount();
+ }
+
+ afterEach(() => {
+ vm.$destroy();
});
describe('template', () => {
it('should have notes list', () => {
- const { $el } = component;
+ createComponent();
+
+ expect(vm.$el.querySelectorAll('.discussion .note.timeline-entry').length).toEqual(5);
+ });
+ });
+
+ describe('image commenting', () => {
+ it('renders collapsible discussion button', () => {
+ createComponent({ shouldCollapseDiscussions: true });
+
+ expect(vm.$el.querySelector('.js-diff-notes-toggle')).not.toBe(null);
+ expect(vm.$el.querySelector('.js-diff-notes-toggle svg')).not.toBe(null);
+ expect(vm.$el.querySelector('.js-diff-notes-toggle').classList).toContain(
+ 'diff-notes-collapse',
+ );
+ });
+
+ it('dispatches toggleDiscussion when clicking collapse button', () => {
+ createComponent({ shouldCollapseDiscussions: true });
+
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelector('.js-diff-notes-toggle').click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('toggleDiscussion', {
+ discussionId: vm.discussions[0].id,
+ });
+ });
+
+ it('renders expand button when discussion is collapsed', done => {
+ createComponent({ shouldCollapseDiscussions: true });
+
+ vm.discussions[0].expanded = false;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.js-diff-notes-toggle').textContent.trim()).toBe('1');
+ expect(vm.$el.querySelector('.js-diff-notes-toggle').className).toContain(
+ 'btn-transparent badge badge-pill',
+ );
+
+ done();
+ });
+ });
+
+ it('hides discussion when collapsed', done => {
+ createComponent({ shouldCollapseDiscussions: true });
+
+ vm.discussions[0].expanded = false;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.note-discussion').style.display).toBe('none');
+
+ done();
+ });
+ });
+
+ it('renders badge on avatar', () => {
+ createComponent({ renderAvatarBadge: true, discussions: [{ ...discussionsMockData }] });
- expect($el.querySelectorAll('.discussion .note.timeline-entry').length).toEqual(5);
+ expect(vm.$el.querySelector('.user-avatar-link .badge-pill')).not.toBe(null);
+ expect(vm.$el.querySelector('.user-avatar-link .badge-pill').textContent.trim()).toBe('1');
});
});
});
diff --git a/spec/javascripts/diffs/components/diff_file_header_spec.js b/spec/javascripts/diffs/components/diff_file_header_spec.js
index 92b2004c4d7..9530b50c729 100644
--- a/spec/javascripts/diffs/components/diff_file_header_spec.js
+++ b/spec/javascripts/diffs/components/diff_file_header_spec.js
@@ -3,9 +3,10 @@ import Vuex from 'vuex';
import diffsModule from '~/diffs/store/modules';
import notesModule from '~/notes/stores/modules';
import DiffFileHeader from '~/diffs/components/diff_file_header.vue';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+Vue.use(Vuex);
+
const discussionFixture = 'merge_requests/diff_discussion.json';
describe('diff_file_header', () => {
@@ -16,15 +17,15 @@ describe('diff_file_header', () => {
const store = new Vuex.Store({
modules: {
- diffs: diffsModule,
- notes: notesModule,
+ diffs: diffsModule(),
+ notes: notesModule(),
},
});
beforeEach(() => {
- const diffFile = convertObjectPropsToCamelCase(diffDiscussionMock.diff_file, { deep: true });
+ const diffFile = diffDiscussionMock.diff_file;
props = {
- diffFile,
+ diffFile: { ...diffFile },
canCurrentUserFork: false,
};
});
@@ -58,19 +59,19 @@ describe('diff_file_header', () => {
describe('titleLink', () => {
beforeEach(() => {
+ props.discussionPath = 'link://to/discussion';
Object.assign(props.diffFile, {
- fileHash: 'badc0ffee',
- submoduleLink: 'link://to/submodule',
- submoduleTreeUrl: 'some://tree/url',
+ submodule_link: 'link://to/submodule',
+ submodule_tree_url: 'some://tree/url',
});
});
- it('returns the fileHash for files', () => {
+ it('returns the discussionPath for files', () => {
props.diffFile.submodule = false;
vm = mountComponentWithStore(Component, { props, store });
- expect(vm.titleLink).toBe(`#${props.diffFile.fileHash}`);
+ expect(vm.titleLink).toBe(props.discussionPath);
});
it('returns the submoduleTreeUrl for submodules', () => {
@@ -78,18 +79,26 @@ describe('diff_file_header', () => {
vm = mountComponentWithStore(Component, { props, store });
- expect(vm.titleLink).toBe(props.diffFile.submoduleTreeUrl);
+ expect(vm.titleLink).toBe(props.diffFile.submodule_tree_url);
});
it('returns the submoduleLink for submodules without submoduleTreeUrl', () => {
Object.assign(props.diffFile, {
submodule: true,
- submoduleTreeUrl: null,
+ submodule_tree_url: null,
});
vm = mountComponentWithStore(Component, { props, store });
- expect(vm.titleLink).toBe(props.diffFile.submoduleLink);
+ expect(vm.titleLink).toBe(props.diffFile.submodule_link);
+ });
+
+ it('sets the correct path to the discussion', () => {
+ props.discussionPath = 'link://to/discussion';
+ vm = mountComponentWithStore(Component, { props, store });
+ const href = vm.$el.querySelector('.js-title-wrapper').getAttribute('href');
+
+ expect(href).toBe(vm.discussionPath);
});
});
@@ -97,7 +106,7 @@ describe('diff_file_header', () => {
beforeEach(() => {
Object.assign(props.diffFile, {
blob: { id: 'b10b1db10b1d' },
- filePath: 'path/to/file',
+ file_path: 'path/to/file',
});
});
@@ -106,7 +115,7 @@ describe('diff_file_header', () => {
vm = mountComponentWithStore(Component, { props, store });
- expect(vm.filePath).toBe(props.diffFile.filePath);
+ expect(vm.filePath).toBe(props.diffFile.file_path);
});
it('appends the truncated blob id for submodules', () => {
@@ -115,14 +124,14 @@ describe('diff_file_header', () => {
vm = mountComponentWithStore(Component, { props, store });
expect(vm.filePath).toBe(
- `${props.diffFile.filePath} @ ${props.diffFile.blob.id.substr(0, 8)}`,
+ `${props.diffFile.file_path} @ ${props.diffFile.blob.id.substr(0, 8)}`,
);
});
});
describe('titleTag', () => {
it('returns a link tag if fileHash is set', () => {
- props.diffFile.fileHash = 'some hash';
+ props.diffFile.file_hash = 'some hash';
vm = mountComponentWithStore(Component, { props, store });
@@ -130,7 +139,7 @@ describe('diff_file_header', () => {
});
it('returns a span tag if fileHash is not set', () => {
- props.diffFile.fileHash = null;
+ props.diffFile.file_hash = null;
vm = mountComponentWithStore(Component, { props, store });
@@ -141,8 +150,8 @@ describe('diff_file_header', () => {
describe('isUsingLfs', () => {
beforeEach(() => {
Object.assign(props.diffFile, {
- storedExternally: true,
- externalStorage: 'lfs',
+ stored_externally: true,
+ external_storage: 'lfs',
});
});
@@ -153,7 +162,7 @@ describe('diff_file_header', () => {
});
it('returns false if file is not stored externally', () => {
- props.diffFile.storedExternally = false;
+ props.diffFile.stored_externally = false;
vm = mountComponentWithStore(Component, { props, store });
@@ -161,7 +170,7 @@ describe('diff_file_header', () => {
});
it('returns false if file is not stored in LFS', () => {
- props.diffFile.externalStorage = 'not lfs';
+ props.diffFile.external_storage = 'not lfs';
vm = mountComponentWithStore(Component, { props, store });
@@ -190,7 +199,7 @@ describe('diff_file_header', () => {
describe('viewFileButtonText', () => {
it('contains the truncated content SHA', () => {
const dummySha = 'deebd00f is no SHA';
- props.diffFile.contentSha = dummySha;
+ props.diffFile.content_sha = dummySha;
vm = mountComponentWithStore(Component, { props, store });
@@ -202,7 +211,7 @@ describe('diff_file_header', () => {
describe('viewReplacedFileButtonText', () => {
it('contains the truncated base SHA', () => {
const dummySha = 'deadabba sings no more';
- props.diffFile.diffRefs.baseSha = dummySha;
+ props.diffFile.diff_refs.base_sha = dummySha;
vm = mountComponentWithStore(Component, { props, store });
@@ -261,6 +270,7 @@ describe('diff_file_header', () => {
it('displays an file icon in the title', () => {
vm = mountComponentWithStore(Component, { props, store });
+
expect(vm.$el.querySelector('svg.js-file-icon use').getAttribute('xlink:href')).toContain(
'ruby',
);
@@ -270,32 +280,32 @@ describe('diff_file_header', () => {
const filePaths = () => vm.$el.querySelectorAll('.file-title-name');
it('displays the path of a added file', () => {
- props.diffFile.renamedFile = false;
+ props.diffFile.renamed_file = false;
vm = mountComponentWithStore(Component, { props, store });
expect(filePaths()).toHaveLength(1);
- expect(filePaths()[0]).toHaveText(props.diffFile.filePath);
+ expect(filePaths()[0]).toHaveText(props.diffFile.file_path);
});
it('displays path for deleted file', () => {
- props.diffFile.renamedFile = false;
- props.diffFile.deletedFile = true;
+ props.diffFile.renamed_file = false;
+ props.diffFile.deleted_file = true;
vm = mountComponentWithStore(Component, { props, store });
expect(filePaths()).toHaveLength(1);
- expect(filePaths()[0]).toHaveText(`${props.diffFile.filePath} deleted`);
+ expect(filePaths()[0]).toHaveText(`${props.diffFile.file_path} deleted`);
});
it('displays old and new path if the file was renamed', () => {
- props.diffFile.renamedFile = true;
+ props.diffFile.renamed_file = true;
vm = mountComponentWithStore(Component, { props, store });
expect(filePaths()).toHaveLength(2);
- expect(filePaths()[0]).toHaveText(props.diffFile.oldPath);
- expect(filePaths()[1]).toHaveText(props.diffFile.newPath);
+ expect(filePaths()[0]).toHaveText(props.diffFile.old_path);
+ expect(filePaths()[1]).toHaveText(props.diffFile.new_path);
});
});
@@ -303,28 +313,33 @@ describe('diff_file_header', () => {
vm = mountComponentWithStore(Component, { props, store });
const button = vm.$el.querySelector('.btn-clipboard');
+
expect(button).not.toBe(null);
- expect(button.dataset.clipboardText).toBe('{"text":"files/ruby/popen.rb","gfm":"`files/ruby/popen.rb`"}');
+ expect(button.dataset.clipboardText).toBe(
+ '{"text":"files/ruby/popen.rb","gfm":"`files/ruby/popen.rb`"}',
+ );
});
describe('file mode', () => {
it('it displays old and new file mode if it changed', () => {
- props.diffFile.modeChanged = true;
+ props.diffFile.mode_changed = true;
vm = mountComponentWithStore(Component, { props, store });
const { fileMode } = vm.$refs;
+
expect(fileMode).not.toBe(undefined);
- expect(fileMode).toContainText(props.diffFile.aMode);
- expect(fileMode).toContainText(props.diffFile.bMode);
+ expect(fileMode).toContainText(props.diffFile.a_mode);
+ expect(fileMode).toContainText(props.diffFile.b_mode);
});
it('does not display the file mode if it has not changed', () => {
- props.diffFile.modeChanged = false;
+ props.diffFile.mode_changed = false;
vm = mountComponentWithStore(Component, { props, store });
const { fileMode } = vm.$refs;
+
expect(fileMode).toBe(undefined);
});
});
@@ -334,8 +349,8 @@ describe('diff_file_header', () => {
it('displays the LFS label for files stored in LFS', () => {
Object.assign(props.diffFile, {
- storedExternally: true,
- externalStorage: 'lfs',
+ stored_externally: true,
+ external_storage: 'lfs',
});
vm = mountComponentWithStore(Component, { props, store });
@@ -345,7 +360,7 @@ describe('diff_file_header', () => {
});
it('does not display the LFS label for files stored in repository', () => {
- props.diffFile.storedExternally = false;
+ props.diffFile.stored_externally = false;
vm = mountComponentWithStore(Component, { props, store });
@@ -362,7 +377,7 @@ describe('diff_file_header', () => {
it('should show edit button when file is editable', () => {
props.addMergeRequestButtons = true;
- props.diffFile.editPath = '/';
+ props.diffFile.edit_path = '/';
vm = mountComponentWithStore(Component, { props, store });
expect(vm.$el.querySelector('.js-edit-blob')).toContainText('Edit');
@@ -370,8 +385,8 @@ describe('diff_file_header', () => {
it('should not show edit button when file is deleted', () => {
props.addMergeRequestButtons = true;
- props.diffFile.deletedFile = true;
- props.diffFile.editPath = '/';
+ props.diffFile.deleted_file = true;
+ props.diffFile.edit_path = '/';
vm = mountComponentWithStore(Component, { props, store });
expect(vm.$el.querySelector('.js-edit-blob')).toEqual(null);
@@ -381,7 +396,7 @@ describe('diff_file_header', () => {
describe('addMergeRequestButtons', () => {
beforeEach(() => {
props.addMergeRequestButtons = true;
- props.diffFile.editPath = '';
+ props.diffFile.edit_path = '';
});
describe('view on environment button', () => {
@@ -389,8 +404,8 @@ describe('diff_file_header', () => {
const title = 'url.title';
it('displays link to external url', () => {
- props.diffFile.externalUrl = url;
- props.diffFile.formattedExternalUrl = title;
+ props.diffFile.external_url = url;
+ props.diffFile.formatted_external_url = title;
vm = mountComponentWithStore(Component, { props, store });
@@ -399,8 +414,8 @@ describe('diff_file_header', () => {
});
it('hides link if no external url', () => {
- props.diffFile.externalUrl = '';
- props.diffFile.formattedExternalUrl = title;
+ props.diffFile.external_url = '';
+ props.diffFile.formattedExternal_url = title;
vm = mountComponentWithStore(Component, { props, store });
@@ -418,11 +433,11 @@ describe('diff_file_header', () => {
path: 'lib/base.js',
name: 'base.js',
mode: '100644',
- readableText: true,
+ readable_text: true,
icon: 'file-text-o',
};
propsCopy.addMergeRequestButtons = true;
- propsCopy.diffFile.deletedFile = true;
+ propsCopy.diffFile.deleted_file = true;
vm = mountComponentWithStore(Component, {
props: propsCopy,
@@ -443,20 +458,21 @@ describe('diff_file_header', () => {
path: 'lib/base.js',
name: 'base.js',
mode: '100644',
- readableText: true,
+ readable_text: true,
icon: 'file-text-o',
};
propsCopy.addMergeRequestButtons = true;
- propsCopy.diffFile.deletedFile = true;
+ propsCopy.diffFile.deleted_file = true;
const discussionGetter = () => [diffDiscussionMock];
- notesModule.getters.discussions = discussionGetter;
+ const notesModuleMock = notesModule();
+ notesModuleMock.getters.discussions = discussionGetter;
vm = mountComponentWithStore(Component, {
props: propsCopy,
store: new Vuex.Store({
modules: {
- diffs: diffsModule,
- notes: notesModule,
+ diffs: diffsModule(),
+ notes: notesModuleMock,
},
}),
});
diff --git a/spec/javascripts/diffs/components/diff_file_spec.js b/spec/javascripts/diffs/components/diff_file_spec.js
index 7a4616ec8eb..51bb4807960 100644
--- a/spec/javascripts/diffs/components/diff_file_spec.js
+++ b/spec/javascripts/diffs/components/diff_file_spec.js
@@ -6,11 +6,10 @@ import diffFileMockData from '../mock_data/diff_file';
describe('DiffFile', () => {
let vm;
- const getDiffFileMock = () => Object.assign({}, diffFileMockData);
beforeEach(() => {
vm = createComponentWithStore(Vue.extend(DiffFileComponent), store, {
- file: getDiffFileMock(),
+ file: JSON.parse(JSON.stringify(diffFileMockData)),
canCurrentUserFork: false,
}).$mount();
});
@@ -18,15 +17,22 @@ describe('DiffFile', () => {
describe('template', () => {
it('should render component with file header, file content components', () => {
const el = vm.$el;
- const { fileHash, filePath } = diffFileMockData;
+ const { file_hash, file_path } = vm.file;
- expect(el.id).toEqual(fileHash);
+ expect(el.id).toEqual(file_hash);
expect(el.classList.contains('diff-file')).toEqual(true);
+
expect(el.querySelectorAll('.diff-content.hidden').length).toEqual(0);
expect(el.querySelector('.js-file-title')).toBeDefined();
- expect(el.querySelector('.file-title-name').innerText.indexOf(filePath) > -1).toEqual(true);
+ expect(el.querySelector('.file-title-name').innerText.indexOf(file_path)).toBeGreaterThan(-1);
expect(el.querySelector('.js-syntax-highlight')).toBeDefined();
- expect(el.querySelectorAll('.line_content').length > 5).toEqual(true);
+
+ expect(vm.file.renderIt).toEqual(false);
+ vm.file.renderIt = true;
+
+ vm.$nextTick(() => {
+ expect(el.querySelectorAll('.line_content').length).toBeGreaterThan(5);
+ });
});
describe('collapsed', () => {
@@ -34,6 +40,7 @@ describe('DiffFile', () => {
expect(vm.$el.querySelectorAll('.diff-content').length).toEqual(1);
expect(vm.file.collapsed).toEqual(false);
vm.file.collapsed = true;
+ vm.file.renderIt = true;
vm.$nextTick(() => {
expect(vm.$el.querySelectorAll('.diff-content').length).toEqual(0);
@@ -43,6 +50,20 @@ describe('DiffFile', () => {
});
it('should have collapsed text and link', done => {
+ vm.file.renderIt = true;
+ vm.file.collapsed = false;
+ vm.file.highlighted_diff_lines = null;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.innerText).toContain('This diff is collapsed');
+ expect(vm.$el.querySelectorAll('.js-click-to-expand').length).toEqual(1);
+
+ done();
+ });
+ });
+
+ it('should have collapsed text and link even before rendered', done => {
+ vm.file.renderIt = false;
vm.file.collapsed = true;
vm.$nextTick(() => {
@@ -69,20 +90,43 @@ describe('DiffFile', () => {
describe('too large diff', () => {
it('should have too large warning and blob link', done => {
const BLOB_LINK = '/file/view/path';
- vm.file.tooLarge = true;
- vm.file.viewPath = BLOB_LINK;
+ vm.file.too_large = true;
+ vm.file.view_path = BLOB_LINK;
vm.$nextTick(() => {
expect(vm.$el.innerText).toContain(
'This source diff could not be displayed because it is too large',
);
+
expect(vm.$el.querySelector('.js-too-large-diff')).toBeDefined();
- expect(vm.$el.querySelector('.js-too-large-diff a').href.indexOf(BLOB_LINK) > -1).toEqual(
- true,
- );
+ expect(
+ vm.$el.querySelector('.js-too-large-diff a').href.indexOf(BLOB_LINK),
+ ).toBeGreaterThan(-1);
done();
});
});
});
+
+ describe('watch collapsed', () => {
+ it('calls handleLoadCollapsedDiff if collapsed changed & file has no lines', done => {
+ spyOn(vm, 'handleLoadCollapsedDiff');
+
+ vm.file.highlighted_diff_lines = undefined;
+ vm.file.parallel_diff_lines = [];
+ vm.file.collapsed = true;
+
+ vm.$nextTick()
+ .then(() => {
+ vm.file.collapsed = false;
+
+ return vm.$nextTick();
+ })
+ .then(() => {
+ expect(vm.handleLoadCollapsedDiff).toHaveBeenCalled();
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
});
diff --git a/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js b/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js
index 0085a16815a..ad2605a5c5c 100644
--- a/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js
+++ b/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js
@@ -23,6 +23,7 @@ describe('DiffGutterAvatars', () => {
it('should return false when all discussions are not expanded', () => {
component.discussions[0].expanded = false;
+
expect(component.discussionsExpanded).toEqual(false);
});
});
@@ -56,6 +57,7 @@ describe('DiffGutterAvatars', () => {
it('should return empty string if there is no discussion', () => {
component.discussions = [];
+
expect(component.moreText).toEqual('');
});
});
diff --git a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
index a1a37b342b7..038db8eaa7c 100644
--- a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
+++ b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
@@ -6,61 +6,65 @@ import discussionsMockData from '../mock_data/diff_discussions';
import diffFileMockData from '../mock_data/diff_file';
describe('DiffLineGutterContent', () => {
- const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)];
const getDiffFileMock = () => Object.assign({}, diffFileMockData);
const createComponent = (options = {}) => {
const cmp = Vue.extend(DiffLineGutterContent);
const props = Object.assign({}, options);
- props.fileHash = getDiffFileMock().fileHash;
+ props.line = {
+ line_code: 'LC_42',
+ type: 'new',
+ old_line: null,
+ new_line: 1,
+ discussions: [{ ...discussionsMockData }],
+ text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
+ rich_text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
+ meta_data: null,
+ };
+ props.fileHash = getDiffFileMock().file_hash;
props.contextLinesPath = '/context/lines/path';
return createComponentWithStore(cmp, store, props).$mount();
};
- const setDiscussions = component => {
- component.$store.dispatch('setInitialNotes', getDiscussionsMockData());
- };
-
- const resetDiscussions = component => {
- component.$store.dispatch('setInitialNotes', []);
- };
describe('computed', () => {
describe('lineHref', () => {
it('should prepend # to lineCode', () => {
const lineCode = 'LC_42';
- const component = createComponent({ lineCode });
+ const component = createComponent();
+
expect(component.lineHref).toEqual(`#${lineCode}`);
});
it('should return # if there is no lineCode', () => {
- const component = createComponent({ lineCode: null });
+ const component = createComponent();
+ component.line.line_code = '';
+
expect(component.lineHref).toEqual('#');
});
});
describe('discussions, hasDiscussions, shouldShowAvatarsOnGutter', () => {
it('should return empty array when there is no discussion', () => {
- const component = createComponent({ lineCode: 'LC_42' });
- expect(component.discussions).toEqual([]);
+ const component = createComponent();
+ component.line.discussions = [];
+
expect(component.hasDiscussions).toEqual(false);
expect(component.shouldShowAvatarsOnGutter).toEqual(false);
});
it('should return discussions for the given lineCode', () => {
- const { lineCode } = getDiffFileMock().highlightedDiffLines[1];
- const component = createComponent({
- lineCode,
+ const cmp = Vue.extend(DiffLineGutterContent);
+ const props = {
+ line: getDiffFileMock().highlighted_diff_lines[1],
+ fileHash: getDiffFileMock().file_hash,
showCommentButton: true,
- discussions: getDiscussionsMockData(),
- });
+ contextLinesPath: '/context/lines/path',
+ };
+ props.line.discussions = [Object.assign({}, discussionsMockData)];
+ const component = createComponentWithStore(cmp, store, props).$mount();
- setDiscussions(component);
-
- expect(component.discussions).toEqual(getDiscussionsMockData());
expect(component.hasDiscussions).toEqual(true);
expect(component.shouldShowAvatarsOnGutter).toEqual(true);
-
- resetDiscussions(component);
});
});
});
@@ -94,19 +98,17 @@ describe('DiffLineGutterContent', () => {
const component = createComponent({ lineNumber, lineCode });
const link = component.$el.querySelector('a');
- expect(link.href.indexOf(`#${lineCode}`) > -1).toEqual(true);
+ expect(link.href.indexOf(`#${lineCode}`)).toBeGreaterThan(-1);
expect(link.dataset.linenumber).toEqual(lineNumber.toString());
});
it('should render user avatars', () => {
const component = createComponent({
showCommentButton: true,
- lineCode: getDiffFileMock().highlightedDiffLines[1].lineCode,
+ lineCode: getDiffFileMock().highlighted_diff_lines[1].line_code,
});
- setDiscussions(component);
- expect(component.$el.querySelector('.diff-comment-avatar-holders')).toBeDefined();
- resetDiscussions(component);
+ expect(component.$el.querySelector('.diff-comment-avatar-holders')).not.toBe(null);
});
});
});
diff --git a/spec/javascripts/diffs/components/diff_line_note_form_spec.js b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
index 6fe5fdaf7f9..81b66cf7c9b 100644
--- a/spec/javascripts/diffs/components/diff_line_note_form_spec.js
+++ b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
@@ -13,10 +13,10 @@ describe('DiffLineNoteForm', () => {
beforeEach(() => {
diffFile = getDiffFileMock();
- diffLines = diffFile.highlightedDiffLines;
+ diffLines = diffFile.highlighted_diff_lines;
component = createComponentWithStore(Vue.extend(DiffLineNoteForm), store, {
- diffFileHash: diffFile.fileHash,
+ diffFileHash: diffFile.file_hash,
diffLines,
line: diffLines[0],
noteTargetLine: diffLines[0],
@@ -36,6 +36,7 @@ describe('DiffLineNoteForm', () => {
spyOn(window, 'confirm').and.returnValue(false);
component.handleCancelCommentForm(true, true);
+
expect(window.confirm).toHaveBeenCalled();
});
@@ -43,9 +44,11 @@ describe('DiffLineNoteForm', () => {
spyOn(window, 'confirm').and.returnValue(false);
component.handleCancelCommentForm(true, false);
+
expect(window.confirm).not.toHaveBeenCalled();
component.handleCancelCommentForm(false, true);
+
expect(window.confirm).not.toHaveBeenCalled();
});
@@ -58,8 +61,9 @@ describe('DiffLineNoteForm', () => {
expect(window.confirm).not.toHaveBeenCalled();
component.$nextTick(() => {
expect(component.cancelCommentForm).toHaveBeenCalledWith({
- lineCode: diffLines[0].lineCode,
+ lineCode: diffLines[0].line_code,
});
+
expect(component.resetAutoSave).toHaveBeenCalled();
done();
@@ -69,22 +73,21 @@ describe('DiffLineNoteForm', () => {
describe('saveNoteForm', () => {
it('should call saveNote action with proper params', done => {
- let isPromiseCalled = false;
- const formDataSpy = spyOnDependency(DiffLineNoteForm, 'getNoteFormData').and.returnValue({
- postData: 1,
- });
- const saveNoteSpy = spyOn(component, 'saveNote').and.returnValue(
- new Promise(() => {
- isPromiseCalled = true;
- done();
- }),
+ const saveDiffDiscussionSpy = spyOn(component, 'saveDiffDiscussion').and.returnValue(
+ Promise.resolve(),
);
-
- component.handleSaveNote('note body');
-
- expect(formDataSpy).toHaveBeenCalled();
- expect(saveNoteSpy).toHaveBeenCalled();
- expect(isPromiseCalled).toEqual(true);
+ spyOnProperty(component, 'formData').and.returnValue('formData');
+
+ component
+ .handleSaveNote('note body')
+ .then(() => {
+ expect(saveDiffDiscussionSpy).toHaveBeenCalledWith({
+ note: 'note body',
+ formData: 'formData',
+ });
+ })
+ .then(done)
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/diffs/components/file_row_stats_spec.js b/spec/javascripts/diffs/components/file_row_stats_spec.js
new file mode 100644
index 00000000000..a8a7f3f1d82
--- /dev/null
+++ b/spec/javascripts/diffs/components/file_row_stats_spec.js
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+import FileRowStats from '~/diffs/components/file_row_stats.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+describe('Diff file row stats', () => {
+ let Component;
+ let vm;
+
+ beforeAll(() => {
+ Component = Vue.extend(FileRowStats);
+ });
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ file: {
+ addedLines: 20,
+ removedLines: 10,
+ },
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders added lines count', () => {
+ expect(vm.$el.querySelector('.cgreen').textContent).toContain('+20');
+ });
+
+ it('renders removed lines count', () => {
+ expect(vm.$el.querySelector('.cred').textContent).toContain('-10');
+ });
+});
diff --git a/spec/javascripts/diffs/components/image_diff_overlay_spec.js b/spec/javascripts/diffs/components/image_diff_overlay_spec.js
new file mode 100644
index 00000000000..d76ab745fe1
--- /dev/null
+++ b/spec/javascripts/diffs/components/image_diff_overlay_spec.js
@@ -0,0 +1,146 @@
+import Vue from 'vue';
+import ImageDiffOverlay from '~/diffs/components/image_diff_overlay.vue';
+import { createStore } from '~/mr_notes/stores';
+import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { imageDiffDiscussions } from '../mock_data/diff_discussions';
+
+describe('Diffs image diff overlay component', () => {
+ const dimensions = {
+ width: 100,
+ height: 200,
+ };
+ let Component;
+ let vm;
+
+ function createComponent(props = {}, extendStore = () => {}) {
+ const store = createStore();
+
+ extendStore(store);
+
+ vm = createComponentWithStore(Component, store, {
+ discussions: [...imageDiffDiscussions],
+ fileHash: 'ABC',
+ ...props,
+ });
+ }
+
+ beforeAll(() => {
+ Component = Vue.extend(ImageDiffOverlay);
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders comment badges', () => {
+ createComponent();
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelectorAll('.js-image-badge').length).toBe(2);
+ });
+
+ it('renders index of discussion in badge', () => {
+ createComponent();
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelectorAll('.js-image-badge')[0].textContent.trim()).toBe('1');
+ expect(vm.$el.querySelectorAll('.js-image-badge')[1].textContent.trim()).toBe('2');
+ });
+
+ it('renders icon when showCommentIcon is true', () => {
+ createComponent({ showCommentIcon: true });
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelector('.js-image-badge svg')).not.toBe(null);
+ });
+
+ it('sets badge comment positions', () => {
+ createComponent();
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelectorAll('.js-image-badge')[0].style.left).toBe('10px');
+ expect(vm.$el.querySelectorAll('.js-image-badge')[0].style.top).toBe('10px');
+
+ expect(vm.$el.querySelectorAll('.js-image-badge')[1].style.left).toBe('5px');
+ expect(vm.$el.querySelectorAll('.js-image-badge')[1].style.top).toBe('5px');
+ });
+
+ it('renders single badge for discussion object', () => {
+ createComponent({
+ discussions: {
+ ...imageDiffDiscussions[0],
+ },
+ });
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelectorAll('.js-image-badge').length).toBe(1);
+ });
+
+ it('dispatches openDiffFileCommentForm when clicking overlay', () => {
+ createComponent({ canComment: true });
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelector('.js-add-image-diff-note-button').click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/openDiffFileCommentForm', {
+ fileHash: 'ABC',
+ x: 0,
+ y: 0,
+ width: 100,
+ height: 200,
+ });
+ });
+
+ describe('toggle discussion', () => {
+ it('disables buttons when shouldToggleDiscussion is false', () => {
+ createComponent({ shouldToggleDiscussion: false });
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ expect(vm.$el.querySelector('.js-image-badge').hasAttribute('disabled')).toBe(true);
+ });
+
+ it('dispatches toggleDiscussion when clicking image badge', () => {
+ createComponent();
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelector('.js-image-badge').click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('toggleDiscussion', { discussionId: '1' });
+ });
+ });
+
+ describe('comment form', () => {
+ beforeEach(() => {
+ createComponent({}, store => {
+ store.state.diffs.commentForms.push({
+ fileHash: 'ABC',
+ x: 20,
+ y: 10,
+ });
+ });
+ spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
+ vm.$mount();
+ });
+
+ it('renders comment form badge', () => {
+ expect(vm.$el.querySelector('.comment-indicator')).not.toBe(null);
+ });
+
+ it('sets comment form badge position', () => {
+ expect(vm.$el.querySelector('.comment-indicator').style.left).toBe('20px');
+ expect(vm.$el.querySelector('.comment-indicator').style.top).toBe('10px');
+ });
+ });
+});
diff --git a/spec/javascripts/diffs/components/inline_diff_view_spec.js b/spec/javascripts/diffs/components/inline_diff_view_spec.js
index b02328dd359..2316ee29106 100644
--- a/spec/javascripts/diffs/components/inline_diff_view_spec.js
+++ b/spec/javascripts/diffs/components/inline_diff_view_spec.js
@@ -1,4 +1,5 @@
import Vue from 'vue';
+import '~/behaviors/markdown/render_gfm';
import InlineDiffView from '~/diffs/components/inline_diff_view.vue';
import store from '~/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
@@ -10,14 +11,16 @@ describe('InlineDiffView', () => {
const getDiffFileMock = () => Object.assign({}, diffFileMockData);
const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)];
- beforeEach(() => {
+ beforeEach(done => {
const diffFile = getDiffFileMock();
store.dispatch('diffs/setInlineDiffViewType');
component = createComponentWithStore(Vue.extend(InlineDiffView), store, {
diffFile,
- diffLines: diffFile.highlightedDiffLines,
+ diffLines: diffFile.highlighted_diff_lines,
}).$mount();
+
+ Vue.nextTick(done);
});
describe('template', () => {
@@ -27,17 +30,17 @@ describe('InlineDiffView', () => {
expect(el.querySelectorAll('tr.line_holder').length).toEqual(6);
expect(el.querySelectorAll('tr.line_holder.new').length).toEqual(2);
expect(el.querySelectorAll('tr.line_holder.match').length).toEqual(1);
- expect(el.textContent.indexOf('Bad dates') > -1).toEqual(true);
+ expect(el.textContent.indexOf('Bad dates')).toBeGreaterThan(-1);
});
it('should render discussions', done => {
const el = component.$el;
- component.$store.dispatch('setInitialNotes', getDiscussionsMockData());
+ component.diffLines[1].discussions = getDiscussionsMockData();
Vue.nextTick(() => {
expect(el.querySelectorAll('.notes_holder').length).toEqual(1);
expect(el.querySelectorAll('.notes_holder .note-discussion li').length).toEqual(5);
- expect(el.innerText.indexOf('comment 5') > -1).toEqual(true);
+ expect(el.innerText.indexOf('comment 5')).toBeGreaterThan(-1);
component.$store.dispatch('setInitialNotes', []);
done();
diff --git a/spec/javascripts/diffs/components/parallel_diff_view_spec.js b/spec/javascripts/diffs/components/parallel_diff_view_spec.js
index 165e4b69b6c..6f6b1c41915 100644
--- a/spec/javascripts/diffs/components/parallel_diff_view_spec.js
+++ b/spec/javascripts/diffs/components/parallel_diff_view_spec.js
@@ -14,15 +14,15 @@ describe('ParallelDiffView', () => {
component = createComponentWithStore(Vue.extend(ParallelDiffView), store, {
diffFile,
- diffLines: diffFile.parallelDiffLines,
+ diffLines: diffFile.parallel_diff_lines,
}).$mount();
});
- describe('computed', () => {
- describe('parallelDiffLines', () => {
+ describe('assigned', () => {
+ describe('diffLines', () => {
it('should normalize lines for empty cells', () => {
- expect(component.parallelDiffLines[0].left.type).toEqual(constants.EMPTY_CELL_TYPE);
- expect(component.parallelDiffLines[1].left.type).toEqual(constants.EMPTY_CELL_TYPE);
+ expect(component.diffLines[0].left.type).toEqual(constants.EMPTY_CELL_TYPE);
+ expect(component.diffLines[1].left.type).toEqual(constants.EMPTY_CELL_TYPE);
});
});
});
diff --git a/spec/javascripts/diffs/components/tree_list_spec.js b/spec/javascripts/diffs/components/tree_list_spec.js
new file mode 100644
index 00000000000..a0b380adfd6
--- /dev/null
+++ b/spec/javascripts/diffs/components/tree_list_spec.js
@@ -0,0 +1,188 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import TreeList from '~/diffs/components/tree_list.vue';
+import createStore from '~/diffs/store/modules';
+import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+
+describe('Diffs tree list component', () => {
+ let Component;
+ let vm;
+
+ beforeAll(() => {
+ Component = Vue.extend(TreeList);
+ });
+
+ beforeEach(() => {
+ Vue.use(Vuex);
+
+ const store = new Vuex.Store({
+ modules: {
+ diffs: createStore(),
+ },
+ });
+
+ // Setup initial state
+ store.state.diffs.addedLines = 10;
+ store.state.diffs.removedLines = 20;
+ store.state.diffs.diffFiles.push('test');
+
+ vm = mountComponentWithStore(Component, { store });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders diff stats', () => {
+ expect(vm.$el.textContent).toContain('1 changed file');
+ expect(vm.$el.textContent).toContain('10 additions');
+ expect(vm.$el.textContent).toContain('20 deletions');
+ });
+
+ it('renders empty text', () => {
+ expect(vm.$el.textContent).toContain('No files found');
+ });
+
+ describe('with files', () => {
+ beforeEach(done => {
+ Object.assign(vm.$store.state.diffs.treeEntries, {
+ 'index.js': {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'index.js',
+ name: 'index.js',
+ path: 'app/index.js',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ },
+ app: {
+ key: 'app',
+ path: 'app',
+ name: 'app',
+ type: 'tree',
+ tree: [],
+ },
+ });
+ vm.$store.state.diffs.tree = [
+ vm.$store.state.diffs.treeEntries['index.js'],
+ vm.$store.state.diffs.treeEntries.app,
+ ];
+
+ vm.$nextTick(done);
+ });
+
+ it('renders tree', () => {
+ expect(vm.$el.querySelectorAll('.file-row').length).toBe(2);
+ expect(vm.$el.querySelectorAll('.file-row')[0].textContent).toContain('index.js');
+ expect(vm.$el.querySelectorAll('.file-row')[1].textContent).toContain('app');
+ });
+
+ it('filters tree list to blobs matching search', done => {
+ vm.search = 'app/index';
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelectorAll('.file-row').length).toBe(1);
+ expect(vm.$el.querySelectorAll('.file-row')[0].textContent).toContain('index.js');
+
+ done();
+ });
+ });
+
+ it('calls toggleTreeOpen when clicking folder', () => {
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelectorAll('.file-row')[1].click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/toggleTreeOpen', 'app');
+ });
+
+ it('calls scrollToFile when clicking blob', () => {
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelector('.file-row').click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/scrollToFile', 'app/index.js');
+ });
+
+ it('renders as file list when renderTreeList is false', done => {
+ vm.renderTreeList = false;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelectorAll('.file-row').length).toBe(1);
+
+ done();
+ });
+ });
+
+ it('renders file paths when renderTreeList is false', done => {
+ vm.renderTreeList = false;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.file-row').textContent).toContain('app/index.js');
+
+ done();
+ });
+ });
+
+ it('hides render buttons when input is focused', done => {
+ const focusEvent = new Event('focus');
+
+ vm.$el.querySelector('.form-control').dispatchEvent(focusEvent);
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.tree-list-view-toggle').style.display).toBe('none');
+
+ done();
+ });
+ });
+
+ it('shows render buttons when input is blurred', done => {
+ const blurEvent = new Event('blur');
+ vm.focusSearch = true;
+
+ vm.$nextTick()
+ .then(() => {
+ vm.$el.querySelector('.form-control').dispatchEvent(blurEvent);
+ })
+ .then(vm.$nextTick)
+ .then(() => {
+ expect(vm.$el.querySelector('.tree-list-view-toggle').style.display).not.toBe('none');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('clearSearch', () => {
+ it('resets search', () => {
+ vm.search = 'test';
+
+ vm.$el.querySelector('.tree-list-clear-icon').click();
+
+ expect(vm.search).toBe('');
+ });
+ });
+
+ describe('toggleRenderTreeList', () => {
+ it('updates renderTreeList', () => {
+ expect(vm.renderTreeList).toBe(true);
+
+ vm.toggleRenderTreeList(false);
+
+ expect(vm.renderTreeList).toBe(false);
+ });
+ });
+
+ describe('toggleFocusSearch', () => {
+ it('updates focusSearch', () => {
+ expect(vm.focusSearch).toBe(false);
+
+ vm.toggleFocusSearch(true);
+
+ expect(vm.focusSearch).toBe(true);
+ });
+ });
+});
diff --git a/spec/javascripts/diffs/create_diffs_store.js b/spec/javascripts/diffs/create_diffs_store.js
new file mode 100644
index 00000000000..aacde99964c
--- /dev/null
+++ b/spec/javascripts/diffs/create_diffs_store.js
@@ -0,0 +1,15 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import diffsModule from '~/diffs/store/modules';
+import notesModule from '~/notes/stores/modules';
+
+Vue.use(Vuex);
+
+export default function createDiffsStore() {
+ return new Vuex.Store({
+ modules: {
+ diffs: diffsModule(),
+ notes: notesModule(),
+ },
+ });
+}
diff --git a/spec/javascripts/diffs/mock_data/diff_discussions.js b/spec/javascripts/diffs/mock_data/diff_discussions.js
index 41d0dfd8939..5ffe5a366ba 100644
--- a/spec/javascripts/diffs/mock_data/diff_discussions.js
+++ b/spec/javascripts/diffs/mock_data/diff_discussions.js
@@ -2,21 +2,19 @@ export default {
id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
reply_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
position: {
- formatter: {
- old_line: null,
- new_line: 2,
- old_path: 'CHANGELOG',
- new_path: 'CHANGELOG',
- base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- },
+ old_line: null,
+ new_line: 2,
+ old_path: 'CHANGELOG',
+ new_path: 'CHANGELOG',
+ base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
+ start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
+ head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
},
line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
expanded: true,
notes: [
{
- id: 1749,
+ id: '1749',
type: 'DiffNote',
attachment: null,
author: {
@@ -68,7 +66,7 @@ export default {
'/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
},
{
- id: 1753,
+ id: '1753',
type: 'DiffNote',
attachment: null,
author: {
@@ -120,7 +118,7 @@ export default {
'/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
},
{
- id: 1754,
+ id: '1754',
type: 'DiffNote',
attachment: null,
author: {
@@ -162,7 +160,7 @@ export default {
'/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
},
{
- id: 1755,
+ id: '1755',
type: 'DiffNote',
attachment: null,
author: {
@@ -204,7 +202,7 @@ export default {
'/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
},
{
- id: 1756,
+ id: '1756',
type: 'DiffNote',
attachment: null,
author: {
@@ -494,3 +492,24 @@ export default {
image_diff_html:
'<div class="image js-replaced-image" data="">\n<div class="two-up view">\n<div class="wrap">\n<div class="frame deleted">\n<img alt="CHANGELOG" src="http://localhost:3000/gitlab-org/gitlab-test/raw/e63f41fe459e62e1228fcef60d7189127aeba95a/CHANGELOG" />\n</div>\n<p class="image-info hide">\n<span class="meta-filesize">22.3 KB</span>\n|\n<strong>W:</strong>\n<span class="meta-width"></span>\n|\n<strong>H:</strong>\n<span class="meta-height"></span>\n</p>\n</div>\n<div class="wrap">\n<div class="added frame js-image-frame" data-note-type="DiffNote" data-position="{&quot;base_sha&quot;:&quot;e63f41fe459e62e1228fcef60d7189127aeba95a&quot;,&quot;start_sha&quot;:&quot;d9eaefe5a676b820c57ff18cf5b68316025f7962&quot;,&quot;head_sha&quot;:&quot;c48ee0d1bf3b30453f5b32250ce03134beaa6d13&quot;,&quot;old_path&quot;:&quot;CHANGELOG&quot;,&quot;new_path&quot;:&quot;CHANGELOG&quot;,&quot;position_type&quot;:&quot;text&quot;,&quot;old_line&quot;:null,&quot;new_line&quot;:2}">\n<img alt="CHANGELOG" draggable="false" src="http://localhost:3000/gitlab-org/gitlab-test/raw/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG" />\n</div>\n\n<p class="image-info hide">\n<span class="meta-filesize">22.3 KB</span>\n|\n<strong>W:</strong>\n<span class="meta-width"></span>\n|\n<strong>H:</strong>\n<span class="meta-height"></span>\n</p>\n</div>\n</div>\n<div class="swipe view hide">\n<div class="swipe-frame">\n<div class="frame deleted">\n<img alt="CHANGELOG" src="http://localhost:3000/gitlab-org/gitlab-test/raw/e63f41fe459e62e1228fcef60d7189127aeba95a/CHANGELOG" />\n</div>\n<div class="swipe-wrap">\n<div class="added frame js-image-frame" data-note-type="DiffNote" data-position="{&quot;base_sha&quot;:&quot;e63f41fe459e62e1228fcef60d7189127aeba95a&quot;,&quot;start_sha&quot;:&quot;d9eaefe5a676b820c57ff18cf5b68316025f7962&quot;,&quot;head_sha&quot;:&quot;c48ee0d1bf3b30453f5b32250ce03134beaa6d13&quot;,&quot;old_path&quot;:&quot;CHANGELOG&quot;,&quot;new_path&quot;:&quot;CHANGELOG&quot;,&quot;position_type&quot;:&quot;text&quot;,&quot;old_line&quot;:null,&quot;new_line&quot;:2}">\n<img alt="CHANGELOG" draggable="false" src="http://localhost:3000/gitlab-org/gitlab-test/raw/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG" />\n</div>\n\n</div>\n<span class="swipe-bar">\n<span class="top-handle"></span>\n<span class="bottom-handle"></span>\n</span>\n</div>\n</div>\n<div class="onion-skin view hide">\n<div class="onion-skin-frame">\n<div class="frame deleted">\n<img alt="CHANGELOG" src="http://localhost:3000/gitlab-org/gitlab-test/raw/e63f41fe459e62e1228fcef60d7189127aeba95a/CHANGELOG" />\n</div>\n<div class="added frame js-image-frame" data-note-type="DiffNote" data-position="{&quot;base_sha&quot;:&quot;e63f41fe459e62e1228fcef60d7189127aeba95a&quot;,&quot;start_sha&quot;:&quot;d9eaefe5a676b820c57ff18cf5b68316025f7962&quot;,&quot;head_sha&quot;:&quot;c48ee0d1bf3b30453f5b32250ce03134beaa6d13&quot;,&quot;old_path&quot;:&quot;CHANGELOG&quot;,&quot;new_path&quot;:&quot;CHANGELOG&quot;,&quot;position_type&quot;:&quot;text&quot;,&quot;old_line&quot;:null,&quot;new_line&quot;:2}">\n<img alt="CHANGELOG" draggable="false" src="http://localhost:3000/gitlab-org/gitlab-test/raw/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG" />\n</div>\n\n<div class="controls">\n<div class="transparent"></div>\n<div class="drag-track">\n<div class="dragger" style="left: 0px;"></div>\n</div>\n<div class="opaque"></div>\n</div>\n</div>\n</div>\n</div>\n<div class="view-modes hide">\n<ul class="view-modes-menu">\n<li class="two-up" data-mode="two-up">2-up</li>\n<li class="swipe" data-mode="swipe">Swipe</li>\n<li class="onion-skin" data-mode="onion-skin">Onion skin</li>\n</ul>\n</div>\n',
};
+
+export const imageDiffDiscussions = [
+ {
+ id: '1',
+ position: {
+ x: 10,
+ y: 10,
+ width: 100,
+ height: 200,
+ },
+ },
+ {
+ id: '2',
+ position: {
+ x: 5,
+ y: 5,
+ width: 100,
+ height: 200,
+ },
+ },
+];
diff --git a/spec/javascripts/diffs/mock_data/diff_file.js b/spec/javascripts/diffs/mock_data/diff_file.js
index d3bf9525924..031c9842f2f 100644
--- a/spec/javascripts/diffs/mock_data/diff_file.js
+++ b/spec/javascripts/diffs/mock_data/diff_file.js
@@ -1,119 +1,130 @@
export default {
submodule: false,
- submoduleLink: null,
+ submodule_link: null,
blob: {
id: '9e10516ca50788acf18c518a231914a21e5f16f7',
path: 'CHANGELOG',
name: 'CHANGELOG',
mode: '100644',
- readableText: true,
+ readable_text: true,
icon: 'file-text-o',
},
- blobPath: 'CHANGELOG',
- blobName: 'CHANGELOG',
- blobIcon: '<i aria-hidden="true" data-hidden="true" class="fa fa-file-text-o fa-fw"></i>',
- fileHash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a',
- filePath: 'CHANGELOG',
- newFile: false,
- deletedFile: false,
- renamedFile: false,
- oldPath: 'CHANGELOG',
- newPath: 'CHANGELOG',
- modeChanged: false,
- aMode: '100644',
- bMode: '100644',
+ blob_path: 'CHANGELOG',
+ blob_name: 'CHANGELOG',
+ blob_icon: '<i aria-hidden="true" data-hidden="true" class="fa fa-file-text-o fa-fw"></i>',
+ file_hash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a',
+ file_path: 'CHANGELOG',
+ new_file: false,
+ deleted_file: false,
+ renamed_file: false,
+ old_path: 'CHANGELOG',
+ new_path: 'CHANGELOG',
+ mode_changed: false,
+ a_mode: '100644',
+ b_mode: '100644',
text: true,
- addedLines: 2,
- removedLines: 0,
- diffRefs: {
- baseSha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- startSha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- headSha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
+ viewer: {
+ name: 'text',
},
- contentSha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- storedExternally: null,
- externalStorage: null,
- oldPathHtml: ['CHANGELOG', 'CHANGELOG'],
- newPathHtml: 'CHANGELOG',
- editPath: '/gitlab-org/gitlab-test/edit/spooky-stuff/CHANGELOG',
- viewPath: '/gitlab-org/gitlab-test/blob/spooky-stuff/CHANGELOG',
- replacedViewPath: null,
+ added_lines: 2,
+ removed_lines: 0,
+ diff_refs: {
+ base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
+ start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
+ head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
+ },
+ content_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
+ stored_externally: null,
+ external_storage: null,
+ old_path_html: 'CHANGELOG',
+ new_path_html: 'CHANGELOG',
+ edit_path: '/gitlab-org/gitlab-test/edit/spooky-stuff/CHANGELOG',
+ view_path: '/gitlab-org/gitlab-test/blob/spooky-stuff/CHANGELOG',
+ replaced_view_path: null,
collapsed: false,
- tooLarge: false,
- contextLinesPath:
+ renderIt: false,
+ too_large: false,
+ context_lines_path:
'/gitlab-org/gitlab-test/blob/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG/diff',
- highlightedDiffLines: [
+ highlighted_diff_lines: [
{
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
type: 'new',
- oldLine: null,
- newLine: 1,
+ old_line: null,
+ new_line: 1,
+ discussions: [],
text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- richText: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- metaData: null,
+ rich_text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
+ meta_data: null,
},
{
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
type: 'new',
- oldLine: null,
- newLine: 2,
+ old_line: null,
+ new_line: 2,
+ discussions: [],
text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- richText: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- metaData: null,
+ rich_text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
+ meta_data: null,
},
{
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
type: null,
- oldLine: 1,
- newLine: 3,
+ old_line: 1,
+ new_line: 3,
+ discussions: [],
text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- richText: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- metaData: null,
+ rich_text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
+ meta_data: null,
},
{
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
type: null,
- oldLine: 2,
- newLine: 4,
+ old_line: 2,
+ new_line: 4,
+ discussions: [],
text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- richText: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- metaData: null,
+ rich_text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
+ meta_data: null,
},
{
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
type: null,
- oldLine: 3,
- newLine: 5,
+ old_line: 3,
+ new_line: 5,
+ discussions: [],
text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- richText: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- metaData: null,
+ rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
+ meta_data: null,
},
{
- lineCode: null,
+ line_code: null,
type: 'match',
- oldLine: null,
- newLine: null,
+ old_line: null,
+ new_line: null,
+ discussions: [],
text: '',
- richText: '',
- metaData: {
- oldPos: 3,
- newPos: 5,
+ rich_text: '',
+ meta_data: {
+ old_pos: 3,
+ new_pos: 5,
},
},
],
- parallelDiffLines: [
+ parallel_diff_lines: [
{
left: {
type: 'empty-cell',
},
right: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
type: 'new',
- oldLine: null,
- newLine: 1,
+ old_line: null,
+ new_line: 1,
+ discussions: [],
text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- richText: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- metaData: null,
+ rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
+ meta_data: null,
},
},
{
@@ -121,100 +132,110 @@ export default {
type: 'empty-cell',
},
right: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
type: 'new',
- oldLine: null,
- newLine: 2,
+ old_line: null,
+ new_line: 2,
+ discussions: [],
text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- richText: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- metaData: null,
+ rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
+ meta_data: null,
},
},
{
left: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
+ line_Code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
type: null,
- oldLine: 1,
- newLine: 3,
+ old_line: 1,
+ new_line: 3,
+ discussions: [],
text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- richText: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- metaData: null,
+ rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
+ meta_data: null,
},
right: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
type: null,
- oldLine: 1,
- newLine: 3,
+ old_line: 1,
+ new_line: 3,
+ discussions: [],
text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- richText: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- metaData: null,
+ rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
+ meta_data: null,
},
},
{
left: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
type: null,
- oldLine: 2,
- newLine: 4,
+ old_line: 2,
+ new_line: 4,
+ discussions: [],
text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- richText: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- metaData: null,
+ rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
+ meta_data: null,
},
right: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
type: null,
- oldLine: 2,
- newLine: 4,
+ old_line: 2,
+ new_line: 4,
+ discussions: [],
text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- richText: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- metaData: null,
+ rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
+ meta_data: null,
},
},
{
left: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
type: null,
- oldLine: 3,
- newLine: 5,
+ old_line: 3,
+ new_line: 5,
+ discussions: [],
text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- richText: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- metaData: null,
+ rich_text: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
+ meta_data: null,
},
right: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
type: null,
- oldLine: 3,
- newLine: 5,
+ old_line: 3,
+ new_line: 5,
+ discussions: [],
text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- richText: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- metaData: null,
+ rich_text: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
+ meta_data: null,
},
},
{
left: {
- lineCode: null,
+ line_code: null,
type: 'match',
- oldLine: null,
- newLine: null,
+ old_line: null,
+ new_line: null,
+ discussions: [],
text: '',
- richText: '',
- metaData: {
- oldPos: 3,
- newPos: 5,
+ rich_text: '',
+ meta_data: {
+ old_pos: 3,
+ new_pos: 5,
},
},
right: {
- lineCode: null,
+ line_code: null,
type: 'match',
- oldLine: null,
- newLine: null,
+ old_line: null,
+ new_line: null,
+ discussions: [],
text: '',
- richText: '',
- metaData: {
- oldPos: 3,
- newPos: 5,
+ rich_text: '',
+ meta_data: {
+ old_pos: 3,
+ new_pos: 5,
},
},
},
],
+ discussions: [],
};
diff --git a/spec/javascripts/diffs/mock_data/diff_with_commit.js b/spec/javascripts/diffs/mock_data/diff_with_commit.js
new file mode 100644
index 00000000000..d646294ee84
--- /dev/null
+++ b/spec/javascripts/diffs/mock_data/diff_with_commit.js
@@ -0,0 +1,7 @@
+const FIXTURE = 'merge_request_diffs/with_commit.json';
+
+preloadFixtures(FIXTURE);
+
+export default function getDiffWithCommit() {
+ return getJSONFixture(FIXTURE);
+}
diff --git a/spec/javascripts/diffs/mock_data/merge_request_diffs.js b/spec/javascripts/diffs/mock_data/merge_request_diffs.js
new file mode 100644
index 00000000000..d72ad7818dd
--- /dev/null
+++ b/spec/javascripts/diffs/mock_data/merge_request_diffs.js
@@ -0,0 +1,42 @@
+export default [
+ {
+ versionIndex: 4,
+ createdAt: '2018-10-23T11:49:16.611Z',
+ commitsCount: 4,
+ latest: true,
+ shortCommitSha: 'de7a8f7f',
+ versionPath: '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37',
+ comparePath:
+ '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37&start_sha=de7a8f7f20c3ea2e0bef3ba01cfd41c21f6b4995',
+ },
+ {
+ versionIndex: 3,
+ createdAt: '2018-10-23T11:46:40.617Z',
+ commitsCount: 3,
+ latest: false,
+ shortCommitSha: 'e78fc18f',
+ versionPath: '/gnuwget/wget2/merge_requests/6/diffs?diff_id=36',
+ comparePath:
+ '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37&start_sha=e78fc18fa37acb2185c59ca94d4a964464feb50e',
+ },
+ {
+ versionIndex: 2,
+ createdAt: '2018-10-04T09:57:39.648Z',
+ commitsCount: 2,
+ latest: false,
+ shortCommitSha: '48da7e7e',
+ versionPath: '/gnuwget/wget2/merge_requests/6/diffs?diff_id=35',
+ comparePath:
+ '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37&start_sha=48da7e7e9a99d41c852578bd9cb541ca4d864b3e',
+ },
+ {
+ versionIndex: 1,
+ createdAt: '2018-09-25T20:30:39.493Z',
+ commitsCount: 1,
+ latest: false,
+ shortCommitSha: '47bac2ed',
+ versionPath: '/gnuwget/wget2/merge_requests/6/diffs?diff_id=20',
+ comparePath:
+ '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37&start_sha=47bac2ed972c5bee344c1cea159a22cd7f711dc0',
+ },
+];
diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js
index c1560dac1a0..acd95a3dd8b 100644
--- a/spec/javascripts/diffs/store/actions_spec.js
+++ b/spec/javascripts/diffs/store/actions_spec.js
@@ -5,19 +5,58 @@ import {
INLINE_DIFF_VIEW_TYPE,
PARALLEL_DIFF_VIEW_TYPE,
} from '~/diffs/constants';
-import * as actions from '~/diffs/store/actions';
+import actions, {
+ setBaseConfig,
+ fetchDiffFiles,
+ assignDiscussionsToDiff,
+ removeDiscussionsFromDiff,
+ startRenderDiffsQueue,
+ setInlineDiffViewType,
+ setParallelDiffViewType,
+ showCommentForm,
+ cancelCommentForm,
+ loadMoreLines,
+ scrollToLineIfNeededInline,
+ scrollToLineIfNeededParallel,
+ loadCollapsedDiff,
+ expandAllFiles,
+ toggleFileDiscussions,
+ saveDiffDiscussion,
+ toggleTreeOpen,
+ scrollToFile,
+ toggleShowTreeList,
+} from '~/diffs/store/actions';
import * as types from '~/diffs/store/mutation_types';
import axios from '~/lib/utils/axios_utils';
import testAction from '../../helpers/vuex_action_helper';
describe('DiffsStoreActions', () => {
+ const originalMethods = {
+ requestAnimationFrame: global.requestAnimationFrame,
+ requestIdleCallback: global.requestIdleCallback,
+ };
+
+ beforeEach(() => {
+ ['requestAnimationFrame', 'requestIdleCallback'].forEach(method => {
+ global[method] = cb => {
+ cb();
+ };
+ });
+ });
+
+ afterEach(() => {
+ ['requestAnimationFrame', 'requestIdleCallback'].forEach(method => {
+ global[method] = originalMethods[method];
+ });
+ });
+
describe('setBaseConfig', () => {
it('should set given endpoint and project path', done => {
const endpoint = '/diffs/set/endpoint';
const projectPath = '/root/project';
testAction(
- actions.setBaseConfig,
+ setBaseConfig,
{ endpoint, projectPath },
{ endpoint: '', projectPath: '' },
[{ type: types.SET_BASE_CONFIG, payload: { endpoint, projectPath } }],
@@ -35,7 +74,7 @@ describe('DiffsStoreActions', () => {
mock.onGet(endpoint).reply(200, res);
testAction(
- actions.fetchDiffFiles,
+ fetchDiffFiles,
{},
{ endpoint },
[
@@ -53,10 +92,190 @@ describe('DiffsStoreActions', () => {
});
});
+ describe('assignDiscussionsToDiff', () => {
+ it('should merge discussions into diffs', done => {
+ const state = {
+ diffFiles: [
+ {
+ file_hash: 'ABC',
+ parallel_diff_lines: [
+ {
+ left: {
+ line_code: 'ABC_1_1',
+ discussions: [],
+ },
+ right: {
+ line_code: 'ABC_1_1',
+ discussions: [],
+ },
+ },
+ ],
+ highlighted_diff_lines: [
+ {
+ line_code: 'ABC_1_1',
+ discussions: [],
+ old_line: 5,
+ new_line: null,
+ },
+ ],
+ diff_refs: {
+ base_sha: 'abc',
+ head_sha: 'def',
+ start_sha: 'ghi',
+ },
+ new_path: 'file1',
+ old_path: 'file2',
+ },
+ ],
+ };
+
+ const diffPosition = {
+ base_sha: 'abc',
+ head_sha: 'def',
+ start_sha: 'ghi',
+ new_line: null,
+ new_path: 'file1',
+ old_line: 5,
+ old_path: 'file2',
+ };
+
+ const singleDiscussion = {
+ line_code: 'ABC_1_1',
+ diff_discussion: {},
+ diff_file: {
+ file_hash: 'ABC',
+ },
+ file_hash: 'ABC',
+ resolvable: true,
+ position: diffPosition,
+ original_position: diffPosition,
+ };
+
+ const discussions = [singleDiscussion];
+
+ testAction(
+ assignDiscussionsToDiff,
+ discussions,
+ state,
+ [
+ {
+ type: types.SET_LINE_DISCUSSIONS_FOR_FILE,
+ payload: {
+ discussion: singleDiscussion,
+ diffPositionByLineCode: {
+ ABC_1_1: {
+ base_sha: 'abc',
+ head_sha: 'def',
+ start_sha: 'ghi',
+ new_line: null,
+ new_path: 'file1',
+ old_line: 5,
+ old_path: 'file2',
+ line_code: 'ABC_1_1',
+ position_type: 'text',
+ },
+ },
+ },
+ },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('removeDiscussionsFromDiff', () => {
+ it('should remove discussions from diffs', done => {
+ const state = {
+ diffFiles: [
+ {
+ file_hash: 'ABC',
+ parallel_diff_lines: [
+ {
+ left: {
+ line_code: 'ABC_1_1',
+ discussions: [
+ {
+ id: 1,
+ },
+ ],
+ },
+ right: {
+ line_code: 'ABC_1_1',
+ discussions: [],
+ },
+ },
+ ],
+ highlighted_diff_lines: [
+ {
+ line_code: 'ABC_1_1',
+ discussions: [],
+ },
+ ],
+ },
+ ],
+ };
+ const singleDiscussion = {
+ id: '1',
+ file_hash: 'ABC',
+ line_code: 'ABC_1_1',
+ };
+
+ testAction(
+ removeDiscussionsFromDiff,
+ singleDiscussion,
+ state,
+ [
+ {
+ type: types.REMOVE_LINE_DISCUSSIONS_FOR_FILE,
+ payload: {
+ id: '1',
+ fileHash: 'ABC',
+ lineCode: 'ABC_1_1',
+ },
+ },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('startRenderDiffsQueue', () => {
+ it('should set all files to RENDER_FILE', () => {
+ const state = {
+ diffFiles: [
+ {
+ id: 1,
+ renderIt: false,
+ collapsed: false,
+ },
+ {
+ id: 2,
+ renderIt: false,
+ collapsed: false,
+ },
+ ],
+ };
+
+ const pseudoCommit = (commitType, file) => {
+ expect(commitType).toBe(types.RENDER_FILE);
+ Object.assign(file, {
+ renderIt: true,
+ });
+ };
+
+ startRenderDiffsQueue({ state, commit: pseudoCommit });
+
+ expect(state.diffFiles[0].renderIt).toBe(true);
+ expect(state.diffFiles[1].renderIt).toBe(true);
+ });
+ });
+
describe('setInlineDiffViewType', () => {
it('should set diff view type to inline and also set the cookie properly', done => {
testAction(
- actions.setInlineDiffViewType,
+ setInlineDiffViewType,
null,
{},
[{ type: types.SET_DIFF_VIEW_TYPE, payload: INLINE_DIFF_VIEW_TYPE }],
@@ -74,7 +293,7 @@ describe('DiffsStoreActions', () => {
describe('setParallelDiffViewType', () => {
it('should set diff view type to parallel and also set the cookie properly', done => {
testAction(
- actions.setParallelDiffViewType,
+ setParallelDiffViewType,
null,
{},
[{ type: types.SET_DIFF_VIEW_TYPE, payload: PARALLEL_DIFF_VIEW_TYPE }],
@@ -94,7 +313,7 @@ describe('DiffsStoreActions', () => {
const payload = { lineCode: 'lineCode' };
testAction(
- actions.showCommentForm,
+ showCommentForm,
payload,
{},
[{ type: types.ADD_COMMENT_FORM_LINE, payload }],
@@ -109,7 +328,7 @@ describe('DiffsStoreActions', () => {
const payload = { lineCode: 'lineCode' };
testAction(
- actions.cancelCommentForm,
+ cancelCommentForm,
payload,
{},
[{ type: types.REMOVE_COMMENT_FORM_LINE, payload }],
@@ -131,7 +350,7 @@ describe('DiffsStoreActions', () => {
mock.onGet(endpoint).reply(200, contextLines);
testAction(
- actions.loadMoreLines,
+ loadMoreLines,
options,
{},
[
@@ -157,7 +376,7 @@ describe('DiffsStoreActions', () => {
mock.onGet(file.loadCollapsedDiffUrl).reply(200, data);
testAction(
- actions.loadCollapsedDiff,
+ loadCollapsedDiff,
file,
{},
[
@@ -178,7 +397,7 @@ describe('DiffsStoreActions', () => {
describe('expandAllFiles', () => {
it('should change the collapsed prop from the diffFiles', done => {
testAction(
- actions.expandAllFiles,
+ expandAllFiles,
null,
{},
[
@@ -197,42 +416,275 @@ describe('DiffsStoreActions', () => {
const getters = {
getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ id: 1 }]),
diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(true),
- diffHasAllCollpasedDiscussions: jasmine.createSpy().and.returnValue(false),
+ diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(false),
};
const dispatch = jasmine.createSpy('dispatch');
- actions.toggleFileDiscussions({ getters, dispatch });
+ toggleFileDiscussions({ getters, dispatch });
- expect(dispatch).toHaveBeenCalledWith('collapseDiscussion', { discussionId: 1 }, { root: true });
+ expect(dispatch).toHaveBeenCalledWith(
+ 'collapseDiscussion',
+ { discussionId: 1 },
+ { root: true },
+ );
});
it('should dispatch expandDiscussion when all discussions are collapsed', () => {
const getters = {
getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ id: 1 }]),
diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(false),
- diffHasAllCollpasedDiscussions: jasmine.createSpy().and.returnValue(true),
+ diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(true),
};
const dispatch = jasmine.createSpy();
- actions.toggleFileDiscussions({ getters, dispatch });
+ toggleFileDiscussions({ getters, dispatch });
- expect(dispatch).toHaveBeenCalledWith('expandDiscussion', { discussionId: 1 }, { root: true });
+ expect(dispatch).toHaveBeenCalledWith(
+ 'expandDiscussion',
+ { discussionId: 1 },
+ { root: true },
+ );
});
it('should dispatch expandDiscussion when some discussions are collapsed and others are expanded for the collapsed discussion', () => {
const getters = {
getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ expanded: false, id: 1 }]),
diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(false),
- diffHasAllCollpasedDiscussions: jasmine.createSpy().and.returnValue(false),
+ diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(false),
};
const dispatch = jasmine.createSpy();
- actions.toggleFileDiscussions({ getters, dispatch });
+ toggleFileDiscussions({ getters, dispatch });
+
+ expect(dispatch).toHaveBeenCalledWith(
+ 'expandDiscussion',
+ { discussionId: 1 },
+ { root: true },
+ );
+ });
+ });
+
+ describe('scrollToLineIfNeededInline', () => {
+ const lineMock = {
+ lineCode: 'ABC_123',
+ };
+
+ it('should not call handleLocationHash when there is not hash', () => {
+ window.location.hash = '';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededInline({}, lineMock);
+
+ expect(handleLocationHashSpy).not.toHaveBeenCalled();
+ });
+
+ it('should not call handleLocationHash when the hash does not match any line', () => {
+ window.location.hash = 'XYZ_456';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededInline({}, lineMock);
+
+ expect(handleLocationHashSpy).not.toHaveBeenCalled();
+ });
+
+ it('should call handleLocationHash only when the hash matches a line', () => {
+ window.location.hash = 'ABC_123';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededInline(
+ {},
+ {
+ lineCode: 'ABC_456',
+ },
+ );
+ scrollToLineIfNeededInline({}, lineMock);
+ scrollToLineIfNeededInline(
+ {},
+ {
+ lineCode: 'XYZ_456',
+ },
+ );
+
+ expect(handleLocationHashSpy).toHaveBeenCalled();
+ expect(handleLocationHashSpy).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('scrollToLineIfNeededParallel', () => {
+ const lineMock = {
+ left: null,
+ right: {
+ lineCode: 'ABC_123',
+ },
+ };
+
+ it('should not call handleLocationHash when there is not hash', () => {
+ window.location.hash = '';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededParallel({}, lineMock);
+
+ expect(handleLocationHashSpy).not.toHaveBeenCalled();
+ });
+
+ it('should not call handleLocationHash when the hash does not match any line', () => {
+ window.location.hash = 'XYZ_456';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededParallel({}, lineMock);
+
+ expect(handleLocationHashSpy).not.toHaveBeenCalled();
+ });
+
+ it('should call handleLocationHash only when the hash matches a line', () => {
+ window.location.hash = 'ABC_123';
+
+ const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
+
+ scrollToLineIfNeededParallel(
+ {},
+ {
+ left: null,
+ right: {
+ lineCode: 'ABC_456',
+ },
+ },
+ );
+ scrollToLineIfNeededParallel({}, lineMock);
+ scrollToLineIfNeededParallel(
+ {},
+ {
+ left: null,
+ right: {
+ lineCode: 'XYZ_456',
+ },
+ },
+ );
+
+ expect(handleLocationHashSpy).toHaveBeenCalled();
+ expect(handleLocationHashSpy).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('saveDiffDiscussion', () => {
+ beforeEach(() => {
+ spyOnDependency(actions, 'getNoteFormData').and.returnValue('testData');
+ });
+
+ it('dispatches actions', done => {
+ const dispatch = jasmine.createSpy('dispatch').and.callFake(name => {
+ switch (name) {
+ case 'saveNote':
+ return Promise.resolve({
+ discussion: 'test',
+ });
+ case 'updateDiscussion':
+ return Promise.resolve('discussion');
+ default:
+ return Promise.resolve({});
+ }
+ });
+
+ saveDiffDiscussion({ dispatch }, { note: {}, formData: {} })
+ .then(() => {
+ expect(dispatch.calls.argsFor(0)).toEqual(['saveNote', 'testData', { root: true }]);
+ expect(dispatch.calls.argsFor(1)).toEqual(['updateDiscussion', 'test', { root: true }]);
+ expect(dispatch.calls.argsFor(2)).toEqual(['assignDiscussionsToDiff', ['discussion']]);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('toggleTreeOpen', () => {
+ it('commits TOGGLE_FOLDER_OPEN', done => {
+ testAction(
+ toggleTreeOpen,
+ 'path',
+ {},
+ [{ type: types.TOGGLE_FOLDER_OPEN, payload: 'path' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('scrollToFile', () => {
+ let commit;
+
+ beforeEach(() => {
+ commit = jasmine.createSpy();
+ jasmine.clock().install();
+ });
+
+ afterEach(() => {
+ jasmine.clock().uninstall();
+ });
+
+ it('updates location hash', () => {
+ const state = {
+ treeEntries: {
+ path: {
+ fileHash: 'test',
+ },
+ },
+ };
+
+ scrollToFile({ state, commit }, 'path');
+
+ expect(document.location.hash).toBe('#test');
+ });
+
+ it('commits UPDATE_CURRENT_DIFF_FILE_ID', () => {
+ const state = {
+ treeEntries: {
+ path: {
+ fileHash: 'test',
+ },
+ },
+ };
+
+ scrollToFile({ state, commit }, 'path');
+
+ expect(commit).toHaveBeenCalledWith(types.UPDATE_CURRENT_DIFF_FILE_ID, 'test');
+ });
+
+ it('resets currentDiffId after timeout', () => {
+ const state = {
+ treeEntries: {
+ path: {
+ fileHash: 'test',
+ },
+ },
+ };
+
+ scrollToFile({ state, commit }, 'path');
+
+ jasmine.clock().tick(1000);
+
+ expect(commit.calls.argsFor(1)).toEqual([types.UPDATE_CURRENT_DIFF_FILE_ID, '']);
+ });
+ });
+
+ describe('toggleShowTreeList', () => {
+ it('commits toggle', done => {
+ testAction(toggleShowTreeList, null, {}, [{ type: types.TOGGLE_SHOW_TREE_LIST }], [], done);
+ });
+
+ it('updates localStorage', () => {
+ spyOn(localStorage, 'setItem');
+
+ toggleShowTreeList({ commit() {}, state: { showTreeList: true } });
- expect(dispatch).toHaveBeenCalledWith('expandDiscussion', { discussionId: 1 }, { root: true });
+ expect(localStorage.setItem).toHaveBeenCalledWith('mr_tree_show', true);
});
});
});
diff --git a/spec/javascripts/diffs/store/getters_spec.js b/spec/javascripts/diffs/store/getters_spec.js
index a59b26b2634..eef95c823fb 100644
--- a/spec/javascripts/diffs/store/getters_spec.js
+++ b/spec/javascripts/diffs/store/getters_spec.js
@@ -49,15 +49,17 @@ describe('Diffs Module Getters', () => {
});
});
- describe('areAllFilesCollapsed', () => {
+ describe('hasCollapsedFile', () => {
it('returns true when all files are collapsed', () => {
localState.diffFiles = [{ collapsed: true }, { collapsed: true }];
- expect(getters.areAllFilesCollapsed(localState)).toEqual(true);
+
+ expect(getters.hasCollapsedFile(localState)).toEqual(true);
});
- it('returns false when at least one file is not collapsed', () => {
+ it('returns true when at least one file is collapsed', () => {
localState.diffFiles = [{ collapsed: false }, { collapsed: true }];
- expect(getters.areAllFilesCollapsed(localState)).toEqual(false);
+
+ expect(getters.hasCollapsedFile(localState)).toEqual(true);
});
});
@@ -104,13 +106,13 @@ describe('Diffs Module Getters', () => {
});
});
- describe('diffHasAllCollpasedDiscussions', () => {
+ describe('diffHasAllCollapsedDiscussions', () => {
it('returns true when all discussions are collapsed', () => {
discussionMock.diff_file.file_hash = diffFileMock.fileHash;
discussionMock.expanded = false;
expect(
- getters.diffHasAllCollpasedDiscussions(localState, {
+ getters.diffHasAllCollapsedDiscussions(localState, {
getDiffFileDiscussions: () => [discussionMock],
})(diffFileMock),
).toEqual(true);
@@ -118,7 +120,7 @@ describe('Diffs Module Getters', () => {
it('returns false when there are no discussions', () => {
expect(
- getters.diffHasAllCollpasedDiscussions(localState, {
+ getters.diffHasAllCollapsedDiscussions(localState, {
getDiffFileDiscussions: () => [],
})(diffFileMock),
).toEqual(false);
@@ -128,7 +130,7 @@ describe('Diffs Module Getters', () => {
discussionMock1.expanded = false;
expect(
- getters.diffHasAllCollpasedDiscussions(localState, {
+ getters.diffHasAllCollapsedDiscussions(localState, {
getDiffFileDiscussions: () => [discussionMock, discussionMock1],
})(diffFileMock),
).toEqual(false);
@@ -184,107 +186,80 @@ describe('Diffs Module Getters', () => {
});
});
- describe('singleDiscussionByLineCode', () => {
- it('returns found discussion per line Code', () => {
- const discussionsMock = {};
- discussionsMock.ABC = discussionMock;
-
- expect(
- getters.singleDiscussionByLineCode(localState, {}, null, {
- discussionsByLineCode: () => discussionsMock,
- })('DEF'),
- ).toEqual([]);
- });
-
- it('returns empty array when no discussions match', () => {
- expect(
- getters.singleDiscussionByLineCode(localState, {}, null, {
- discussionsByLineCode: () => {},
- })('DEF'),
- ).toEqual([]);
- });
- });
-
describe('shouldRenderParallelCommentRow', () => {
let line;
beforeEach(() => {
line = {};
+ discussionMock.expanded = true;
+
line.left = {
- lineCode: 'ABC',
+ line_code: 'ABC',
+ discussions: [discussionMock],
};
line.right = {
- lineCode: 'DEF',
+ line_code: 'DEF',
+ discussions: [discussionMock1],
};
});
it('returns true when discussion is expanded', () => {
- discussionMock.expanded = true;
-
- expect(
- getters.shouldRenderParallelCommentRow(localState, {
- singleDiscussionByLineCode: () => [discussionMock],
- })(line),
- ).toEqual(true);
+ expect(getters.shouldRenderParallelCommentRow(localState)(line)).toEqual(true);
});
it('returns false when no discussion was found', () => {
+ line.left.discussions = [];
+ line.right.discussions = [];
+
localState.diffLineCommentForms.ABC = false;
localState.diffLineCommentForms.DEF = false;
- expect(
- getters.shouldRenderParallelCommentRow(localState, {
- singleDiscussionByLineCode: () => [],
- })(line),
- ).toEqual(false);
+ expect(getters.shouldRenderParallelCommentRow(localState)(line)).toEqual(false);
});
it('returns true when discussionForm was found', () => {
localState.diffLineCommentForms.ABC = {};
- expect(
- getters.shouldRenderParallelCommentRow(localState, {
- singleDiscussionByLineCode: () => [discussionMock],
- })(line),
- ).toEqual(true);
+ expect(getters.shouldRenderParallelCommentRow(localState)(line)).toEqual(true);
});
});
describe('shouldRenderInlineCommentRow', () => {
+ let line;
+
+ beforeEach(() => {
+ discussionMock.expanded = true;
+
+ line = {
+ lineCode: 'ABC',
+ discussions: [discussionMock],
+ };
+ });
+
it('returns true when diffLineCommentForms has form', () => {
localState.diffLineCommentForms.ABC = {};
- expect(
- getters.shouldRenderInlineCommentRow(localState)({
- lineCode: 'ABC',
- }),
- ).toEqual(true);
+ expect(getters.shouldRenderInlineCommentRow(localState)(line)).toEqual(true);
});
it('returns false when no line discussions were found', () => {
- expect(
- getters.shouldRenderInlineCommentRow(localState, {
- singleDiscussionByLineCode: () => [],
- })('DEF'),
- ).toEqual(false);
+ line.discussions = [];
+
+ expect(getters.shouldRenderInlineCommentRow(localState)(line)).toEqual(false);
});
it('returns true if all found discussions are expanded', () => {
discussionMock.expanded = true;
- expect(
- getters.shouldRenderInlineCommentRow(localState, {
- singleDiscussionByLineCode: () => [discussionMock],
- })('ABC'),
- ).toEqual(true);
+ expect(getters.shouldRenderInlineCommentRow(localState)(line)).toEqual(true);
});
});
describe('getDiffFileDiscussions', () => {
it('returns an array with discussions when fileHash matches and the discussion belongs to a diff', () => {
- discussionMock.diff_file.file_hash = diffFileMock.fileHash;
+ discussionMock.diff_file.file_hash = diffFileMock.file_hash;
expect(
getters.getDiffFileDiscussions(localState, {}, {}, { discussions: [discussionMock] })(
@@ -304,10 +279,10 @@ describe('Diffs Module Getters', () => {
describe('getDiffFileByHash', () => {
it('returns file by hash', () => {
const fileA = {
- fileHash: '123',
+ file_hash: '123',
};
const fileB = {
- fileHash: '456',
+ file_hash: '456',
};
localState.diffFiles = [fileA, fileB];
@@ -316,7 +291,35 @@ describe('Diffs Module Getters', () => {
it('returns null if no matching file is found', () => {
localState.diffFiles = [];
+
expect(getters.getDiffFileByHash(localState)('123')).toBeUndefined();
});
});
+
+ describe('allBlobs', () => {
+ it('returns an array of blobs', () => {
+ localState.treeEntries = {
+ file: {
+ type: 'blob',
+ },
+ tree: {
+ type: 'tree',
+ },
+ };
+
+ expect(getters.allBlobs(localState)).toEqual([
+ {
+ type: 'blob',
+ },
+ ]);
+ });
+ });
+
+ describe('diffFilesLength', () => {
+ it('returns length of diff files', () => {
+ localState.diffFiles.push('test', 'test 2');
+
+ expect(getters.diffFilesLength(localState)).toBe(2);
+ });
+ });
});
diff --git a/spec/javascripts/diffs/store/mutations_spec.js b/spec/javascripts/diffs/store/mutations_spec.js
index 1af49f4985c..598d723c940 100644
--- a/spec/javascripts/diffs/store/mutations_spec.js
+++ b/spec/javascripts/diffs/store/mutations_spec.js
@@ -1,6 +1,8 @@
+import createState from '~/diffs/store/modules/diff_state';
import mutations from '~/diffs/store/mutations';
import * as types from '~/diffs/store/mutation_types';
import { INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
+import diffFileMockData from '../mock_data/diff_file';
describe('DiffsStoreMutations', () => {
describe('SET_BASE_CONFIG', () => {
@@ -10,6 +12,7 @@ describe('DiffsStoreMutations', () => {
const projectPath = '/root/project';
mutations[types.SET_BASE_CONFIG](state, { endpoint, projectPath });
+
expect(state.endpoint).toEqual(endpoint);
expect(state.projectPath).toEqual(projectPath);
});
@@ -20,15 +23,34 @@ describe('DiffsStoreMutations', () => {
const state = {};
mutations[types.SET_LOADING](state, false);
+
expect(state.isLoading).toEqual(false);
});
});
+ describe('SET_DIFF_DATA', () => {
+ it('should set diff data type properly', () => {
+ const state = {};
+ const diffMock = {
+ diff_files: [diffFileMockData],
+ };
+
+ mutations[types.SET_DIFF_DATA](state, diffMock);
+
+ const firstLine = state.diffFiles[0].parallel_diff_lines[0];
+
+ expect(firstLine.right.text).toBeUndefined();
+ expect(state.diffFiles[0].renderIt).toEqual(true);
+ expect(state.diffFiles[0].collapsed).toEqual(false);
+ });
+ });
+
describe('SET_DIFF_VIEW_TYPE', () => {
it('should set diff view type properly', () => {
const state = {};
mutations[types.SET_DIFF_VIEW_TYPE](state, INLINE_DIFF_VIEW_TYPE);
+
expect(state.diffViewType).toEqual(INLINE_DIFF_VIEW_TYPE);
});
});
@@ -39,6 +61,7 @@ describe('DiffsStoreMutations', () => {
const lineCode = 'FDE';
mutations[types.ADD_COMMENT_FORM_LINE](state, { lineCode });
+
expect(state.diffLineCommentForms[lineCode]).toBeTruthy();
});
});
@@ -49,9 +72,11 @@ describe('DiffsStoreMutations', () => {
const lineCode = 'FDE';
mutations[types.ADD_COMMENT_FORM_LINE](state, { lineCode });
+
expect(state.diffLineCommentForms[lineCode]).toBeTruthy();
mutations[types.REMOVE_COMMENT_FORM_LINE](state, { lineCode });
+
expect(state.diffLineCommentForms[lineCode]).toBeUndefined();
});
});
@@ -64,6 +89,7 @@ describe('DiffsStoreMutations', () => {
const state = { expandAllFiles: true, diffFiles: [diffFile] };
mutations[types.EXPAND_ALL_FILES](state);
+
expect(state.diffFiles[0].collapsed).toEqual(false);
});
});
@@ -72,19 +98,19 @@ describe('DiffsStoreMutations', () => {
it('should call utils.addContextLines with proper params', () => {
const options = {
lineNumbers: { oldLineNumber: 1, newLineNumber: 2 },
- contextLines: [{ oldLine: 1 }],
+ contextLines: [{ old_line: 1, new_line: 1, line_code: 'ff9200_1_1', discussions: [] }],
fileHash: 'ff9200',
params: {
bottom: true,
},
};
const diffFile = {
- fileHash: options.fileHash,
- highlightedDiffLines: [],
- parallelDiffLines: [],
+ file_hash: options.fileHash,
+ highlighted_diff_lines: [],
+ parallel_diff_lines: [],
};
const state = { diffFiles: [diffFile] };
- const lines = [{ oldLine: 1 }];
+ const lines = [{ old_line: 1, new_line: 1 }];
const findDiffFileSpy = spyOnDependency(mutations, 'findDiffFile').and.returnValue(diffFile);
const removeMatchLineSpy = spyOnDependency(mutations, 'removeMatchLine');
@@ -99,14 +125,16 @@ describe('DiffsStoreMutations', () => {
options.lineNumbers,
options.params.bottom,
);
+
expect(lineRefSpy).toHaveBeenCalledWith(
options.contextLines,
options.lineNumbers,
options.params.bottom,
);
+
expect(addContextLinesSpy).toHaveBeenCalledWith({
- inlineLines: diffFile.highlightedDiffLines,
- parallelLines: diffFile.parallelDiffLines,
+ inlineLines: diffFile.highlighted_diff_lines,
+ parallelLines: diffFile.parallel_diff_lines,
contextLines: options.contextLines,
bottom: options.params.bottom,
lineNumbers: options.lineNumbers,
@@ -116,19 +144,243 @@ describe('DiffsStoreMutations', () => {
describe('ADD_COLLAPSED_DIFFS', () => {
it('should update the state with the given data for the given file hash', () => {
- const spy = spyOnDependency(mutations, 'convertObjectPropsToCamelCase').and.callThrough();
-
const fileHash = 123;
- const state = { diffFiles: [{}, { fileHash, existingField: 0 }] };
- const file = { fileHash };
- const data = { diff_files: [{ file_hash: fileHash, extra_field: 1, existingField: 1 }] };
+ const state = { diffFiles: [{}, { file_hash: fileHash, existing_field: 0 }] };
+ const data = { diff_files: [{ file_hash: fileHash, extra_field: 1, existing_field: 1 }] };
+
+ mutations[types.ADD_COLLAPSED_DIFFS](state, { file: state.diffFiles[1], data });
+
+ expect(state.diffFiles[1].file_hash).toEqual(fileHash);
+ expect(state.diffFiles[1].existing_field).toEqual(1);
+ expect(state.diffFiles[1].extra_field).toEqual(1);
+ });
+ });
+
+ describe('SET_LINE_DISCUSSIONS_FOR_FILE', () => {
+ it('should add discussions to the given line', () => {
+ const diffPosition = {
+ base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
+ new_line: null,
+ new_path: '500-lines-4.txt',
+ old_line: 5,
+ old_path: '500-lines-4.txt',
+ start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ };
+
+ const state = {
+ latestDiff: true,
+ diffFiles: [
+ {
+ file_hash: 'ABC',
+ parallel_diff_lines: [
+ {
+ left: {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ right: {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ },
+ ],
+ highlighted_diff_lines: [
+ {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ ],
+ },
+ ],
+ };
+ const discussion = {
+ id: 1,
+ line_code: 'ABC_1',
+ diff_discussion: true,
+ resolvable: true,
+ original_position: diffPosition,
+ position: diffPosition,
+ diff_file: {
+ file_hash: state.diffFiles[0].file_hash,
+ },
+ };
+
+ const diffPositionByLineCode = {
+ ABC_1: diffPosition,
+ };
+
+ mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
+ discussion,
+ diffPositionByLineCode,
+ });
+
+ expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
+ expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
+ expect(state.diffFiles[0].parallel_diff_lines[0].right.discussions).toEqual([]);
+
+ expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
+ expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
+ });
+
+ it('should add legacy discussions to the given line', () => {
+ const diffPosition = {
+ base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
+ new_line: null,
+ new_path: '500-lines-4.txt',
+ old_line: 5,
+ old_path: '500-lines-4.txt',
+ start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ line_code: 'ABC_1',
+ };
+
+ const state = {
+ latestDiff: true,
+ diffFiles: [
+ {
+ file_hash: 'ABC',
+ parallel_diff_lines: [
+ {
+ left: {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ right: {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ },
+ ],
+ highlighted_diff_lines: [
+ {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ ],
+ },
+ ],
+ };
+ const discussion = {
+ id: 1,
+ line_code: 'ABC_1',
+ diff_discussion: true,
+ active: true,
+ diff_file: {
+ file_hash: state.diffFiles[0].file_hash,
+ },
+ };
+
+ const diffPositionByLineCode = {
+ ABC_1: diffPosition,
+ };
+
+ mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
+ discussion,
+ diffPositionByLineCode,
+ });
+
+ expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
+ expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
+
+ expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
+ expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
+ });
+ });
+
+ describe('REMOVE_LINE_DISCUSSIONS', () => {
+ it('should remove the existing discussions on the given line', () => {
+ const state = {
+ diffFiles: [
+ {
+ file_hash: 'ABC',
+ parallel_diff_lines: [
+ {
+ left: {
+ line_code: 'ABC_1',
+ discussions: [
+ {
+ id: 1,
+ line_code: 'ABC_1',
+ },
+ {
+ id: 2,
+ line_code: 'ABC_1',
+ },
+ ],
+ },
+ right: {
+ line_code: 'ABC_1',
+ discussions: [],
+ },
+ },
+ ],
+ highlighted_diff_lines: [
+ {
+ line_code: 'ABC_1',
+ discussions: [
+ {
+ id: 1,
+ line_code: 'ABC_1',
+ },
+ {
+ id: 2,
+ line_code: 'ABC_1',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ };
+
+ mutations[types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, {
+ fileHash: 'ABC',
+ lineCode: 'ABC_1',
+ });
+
+ expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(0);
+ expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(0);
+ });
+ });
+
+ describe('TOGGLE_FOLDER_OPEN', () => {
+ it('toggles entry opened prop', () => {
+ const state = {
+ treeEntries: {
+ path: {
+ opened: false,
+ },
+ },
+ };
+
+ mutations[types.TOGGLE_FOLDER_OPEN](state, 'path');
+
+ expect(state.treeEntries.path.opened).toBe(true);
+ });
+ });
+
+ describe('TOGGLE_SHOW_TREE_LIST', () => {
+ it('toggles showTreeList', () => {
+ const state = createState();
+
+ mutations[types.TOGGLE_SHOW_TREE_LIST](state);
+
+ expect(state.showTreeList).toBe(false, 'Failed to toggle showTreeList to false');
+
+ mutations[types.TOGGLE_SHOW_TREE_LIST](state);
+
+ expect(state.showTreeList).toBe(true, 'Failed to toggle showTreeList to true');
+ });
+ });
+
+ describe('UPDATE_CURRENT_DIFF_FILE_ID', () => {
+ it('updates currentDiffFileId', () => {
+ const state = createState();
- mutations[types.ADD_COLLAPSED_DIFFS](state, { file, data });
- expect(spy).toHaveBeenCalledWith(data, { deep: true });
+ mutations[types.UPDATE_CURRENT_DIFF_FILE_ID](state, 'somefileid');
- expect(state.diffFiles[1].fileHash).toEqual(fileHash);
- expect(state.diffFiles[1].existingField).toEqual(1);
- expect(state.diffFiles[1].extraField).toEqual(1);
+ expect(state.currentDiffFileId).toBe('somefileid');
});
});
});
diff --git a/spec/javascripts/diffs/store/utils_spec.js b/spec/javascripts/diffs/store/utils_spec.js
index 32136d9ebff..d4ef17c5ef8 100644
--- a/spec/javascripts/diffs/store/utils_spec.js
+++ b/spec/javascripts/diffs/store/utils_spec.js
@@ -3,6 +3,7 @@ import {
LINE_POSITION_LEFT,
LINE_POSITION_RIGHT,
TEXT_DIFF_POSITION_TYPE,
+ LEGACY_DIFF_NOTE_TYPE,
DIFF_NOTE_TYPE,
NEW_LINE_TYPE,
OLD_LINE_TYPE,
@@ -17,7 +18,7 @@ const getDiffFileMock = () => Object.assign({}, diffFileMockData);
describe('DiffsStoreUtils', () => {
describe('findDiffFile', () => {
- const files = [{ fileHash: 1, name: 'one' }];
+ const files = [{ file_hash: 1, name: 'one' }];
it('should return correct file', () => {
expect(utils.findDiffFile(files, 1).name).toEqual('one');
@@ -40,13 +41,13 @@ describe('DiffsStoreUtils', () => {
describe('findIndexInInlineLines', () => {
it('should return correct index for given line numbers', () => {
- expectSet(utils.findIndexInInlineLines, getDiffFileMock().highlightedDiffLines);
+ expectSet(utils.findIndexInInlineLines, getDiffFileMock().highlighted_diff_lines);
});
});
describe('findIndexInParallelLines', () => {
it('should return correct index for given line numbers', () => {
- expectSet(utils.findIndexInParallelLines, getDiffFileMock().parallelDiffLines, {});
+ expectSet(utils.findIndexInParallelLines, getDiffFileMock().parallel_diff_lines, {});
});
});
});
@@ -55,42 +56,52 @@ describe('DiffsStoreUtils', () => {
it('should remove match line properly by regarding the bottom parameter', () => {
const diffFile = getDiffFileMock();
const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
- const inlineIndex = utils.findIndexInInlineLines(diffFile.highlightedDiffLines, lineNumbers);
- const parallelIndex = utils.findIndexInParallelLines(diffFile.parallelDiffLines, lineNumbers);
- const atInlineIndex = diffFile.highlightedDiffLines[inlineIndex];
- const atParallelIndex = diffFile.parallelDiffLines[parallelIndex];
+ const inlineIndex = utils.findIndexInInlineLines(
+ diffFile.highlighted_diff_lines,
+ lineNumbers,
+ );
+ const parallelIndex = utils.findIndexInParallelLines(
+ diffFile.parallel_diff_lines,
+ lineNumbers,
+ );
+ const atInlineIndex = diffFile.highlighted_diff_lines[inlineIndex];
+ const atParallelIndex = diffFile.parallel_diff_lines[parallelIndex];
utils.removeMatchLine(diffFile, lineNumbers, false);
- expect(diffFile.highlightedDiffLines[inlineIndex]).not.toEqual(atInlineIndex);
- expect(diffFile.parallelDiffLines[parallelIndex]).not.toEqual(atParallelIndex);
+
+ expect(diffFile.highlighted_diff_lines[inlineIndex]).not.toEqual(atInlineIndex);
+ expect(diffFile.parallel_diff_lines[parallelIndex]).not.toEqual(atParallelIndex);
utils.removeMatchLine(diffFile, lineNumbers, true);
- expect(diffFile.highlightedDiffLines[inlineIndex + 1]).not.toEqual(atInlineIndex);
- expect(diffFile.parallelDiffLines[parallelIndex + 1]).not.toEqual(atParallelIndex);
+
+ expect(diffFile.highlighted_diff_lines[inlineIndex + 1]).not.toEqual(atInlineIndex);
+ expect(diffFile.parallel_diff_lines[parallelIndex + 1]).not.toEqual(atParallelIndex);
});
});
describe('addContextLines', () => {
it('should add context lines properly with bottom parameter', () => {
const diffFile = getDiffFileMock();
- const inlineLines = diffFile.highlightedDiffLines;
- const parallelLines = diffFile.parallelDiffLines;
+ const inlineLines = diffFile.highlighted_diff_lines;
+ const parallelLines = diffFile.parallel_diff_lines;
const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
const contextLines = [{ lineNumber: 42 }];
const options = { inlineLines, parallelLines, contextLines, lineNumbers, bottom: true };
- const inlineIndex = utils.findIndexInInlineLines(diffFile.highlightedDiffLines, lineNumbers);
- const parallelIndex = utils.findIndexInParallelLines(diffFile.parallelDiffLines, lineNumbers);
+ const inlineIndex = utils.findIndexInInlineLines(inlineLines, lineNumbers);
+ const parallelIndex = utils.findIndexInParallelLines(parallelLines, lineNumbers);
const normalizedParallelLine = {
left: options.contextLines[0],
right: options.contextLines[0],
};
utils.addContextLines(options);
+
expect(inlineLines[inlineLines.length - 1]).toEqual(contextLines[0]);
expect(parallelLines[parallelLines.length - 1]).toEqual(normalizedParallelLine);
delete options.bottom;
utils.addContextLines(options);
+
expect(inlineLines[inlineIndex]).toEqual(contextLines[0]);
expect(parallelLines[parallelIndex]).toEqual(normalizedParallelLine);
});
@@ -107,40 +118,100 @@ describe('DiffsStoreUtils', () => {
noteableType: MERGE_REQUEST_NOTEABLE_TYPE,
diffFile,
noteTargetLine: {
- lineCode: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- metaData: null,
- newLine: 3,
- oldLine: 1,
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
+ meta_data: null,
+ new_line: 3,
+ old_line: 1,
},
diffViewType: PARALLEL_DIFF_VIEW_TYPE,
linePosition: LINE_POSITION_LEFT,
};
const position = JSON.stringify({
- base_sha: diffFile.diffRefs.baseSha,
- start_sha: diffFile.diffRefs.startSha,
- head_sha: diffFile.diffRefs.headSha,
- old_path: diffFile.oldPath,
- new_path: diffFile.newPath,
+ base_sha: diffFile.diff_refs.base_sha,
+ start_sha: diffFile.diff_refs.start_sha,
+ head_sha: diffFile.diff_refs.head_sha,
+ old_path: diffFile.old_path,
+ new_path: diffFile.new_path,
position_type: TEXT_DIFF_POSITION_TYPE,
- old_line: options.noteTargetLine.oldLine,
- new_line: options.noteTargetLine.newLine,
+ old_line: options.noteTargetLine.old_line,
+ new_line: options.noteTargetLine.new_line,
});
const postData = {
view: options.diffViewType,
line_type: options.linePosition === LINE_POSITION_RIGHT ? NEW_LINE_TYPE : OLD_LINE_TYPE,
- merge_request_diff_head_sha: diffFile.diffRefs.headSha,
+ merge_request_diff_head_sha: diffFile.diff_refs.head_sha,
in_reply_to_discussion_id: '',
note_project_id: '',
target_type: options.noteableType,
target_id: options.noteableData.id,
+ return_discussion: true,
note: {
noteable_type: options.noteableType,
noteable_id: options.noteableData.id,
commit_id: '',
type: DIFF_NOTE_TYPE,
- line_code: options.noteTargetLine.lineCode,
+ line_code: options.noteTargetLine.line_code,
+ note: options.note,
+ position,
+ },
+ };
+
+ expect(utils.getNoteFormData(options)).toEqual({
+ endpoint: options.noteableData.create_note_path,
+ data: postData,
+ });
+ });
+
+ it('should create legacy note form data', () => {
+ const diffFile = getDiffFileMock();
+ delete diffFile.diff_refs.start_sha;
+ delete diffFile.diff_refs.head_sha;
+
+ noteableDataMock.targetType = MERGE_REQUEST_NOTEABLE_TYPE;
+
+ const options = {
+ note: 'Hello world!',
+ noteableData: noteableDataMock,
+ noteableType: MERGE_REQUEST_NOTEABLE_TYPE,
+ diffFile,
+ noteTargetLine: {
+ line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
+ meta_data: null,
+ new_line: 3,
+ old_line: 1,
+ },
+ diffViewType: PARALLEL_DIFF_VIEW_TYPE,
+ linePosition: LINE_POSITION_LEFT,
+ };
+
+ const position = JSON.stringify({
+ base_sha: diffFile.diff_refs.base_sha,
+ start_sha: undefined,
+ head_sha: undefined,
+ old_path: diffFile.old_path,
+ new_path: diffFile.new_path,
+ position_type: TEXT_DIFF_POSITION_TYPE,
+ old_line: options.noteTargetLine.old_line,
+ new_line: options.noteTargetLine.new_line,
+ });
+
+ const postData = {
+ view: options.diffViewType,
+ line_type: options.linePosition === LINE_POSITION_RIGHT ? NEW_LINE_TYPE : OLD_LINE_TYPE,
+ merge_request_diff_head_sha: undefined,
+ in_reply_to_discussion_id: '',
+ note_project_id: '',
+ target_type: options.noteableType,
+ target_id: options.noteableData.id,
+ return_discussion: true,
+ note: {
+ noteable_type: options.noteableType,
+ noteable_id: options.noteableData.id,
+ commit_id: '',
+ type: LEGACY_DIFF_NOTE_TYPE,
+ line_code: options.noteTargetLine.line_code,
note: options.note,
position,
},
@@ -160,51 +231,332 @@ describe('DiffsStoreUtils', () => {
const lines = [{ type: null }, { type: MATCH_LINE_TYPE }];
const linesWithReferences = utils.addLineReferences(lines, lineNumbers, true);
- expect(linesWithReferences[0].oldLine).toEqual(lineNumbers.oldLineNumber + 1);
- expect(linesWithReferences[0].newLine).toEqual(lineNumbers.newLineNumber + 1);
- expect(linesWithReferences[1].metaData.oldPos).toEqual(4);
- expect(linesWithReferences[1].metaData.newPos).toEqual(5);
+ expect(linesWithReferences[0].old_line).toEqual(lineNumbers.oldLineNumber + 1);
+ expect(linesWithReferences[0].new_line).toEqual(lineNumbers.newLineNumber + 1);
+ expect(linesWithReferences[1].meta_data.old_pos).toEqual(4);
+ expect(linesWithReferences[1].meta_data.new_pos).toEqual(5);
});
it('should add correct line references when bottom falsy', () => {
const lines = [{ type: null }, { type: MATCH_LINE_TYPE }, { type: null }];
const linesWithReferences = utils.addLineReferences(lines, lineNumbers);
- expect(linesWithReferences[0].oldLine).toEqual(0);
- expect(linesWithReferences[0].newLine).toEqual(1);
- expect(linesWithReferences[1].metaData.oldPos).toEqual(2);
- expect(linesWithReferences[1].metaData.newPos).toEqual(3);
+ expect(linesWithReferences[0].old_line).toEqual(0);
+ expect(linesWithReferences[0].new_line).toEqual(1);
+ expect(linesWithReferences[1].meta_data.old_pos).toEqual(2);
+ expect(linesWithReferences[1].meta_data.new_pos).toEqual(3);
});
});
describe('trimFirstCharOfLineContent', () => {
it('trims the line when it starts with a space', () => {
- expect(utils.trimFirstCharOfLineContent({ richText: ' diff' })).toEqual({ richText: 'diff' });
+ expect(utils.trimFirstCharOfLineContent({ rich_text: ' diff' })).toEqual({
+ discussions: [],
+ rich_text: 'diff',
+ });
});
it('trims the line when it starts with a +', () => {
- expect(utils.trimFirstCharOfLineContent({ richText: '+diff' })).toEqual({ richText: 'diff' });
+ expect(utils.trimFirstCharOfLineContent({ rich_text: '+diff' })).toEqual({
+ discussions: [],
+ rich_text: 'diff',
+ });
});
it('trims the line when it starts with a -', () => {
- expect(utils.trimFirstCharOfLineContent({ richText: '-diff' })).toEqual({ richText: 'diff' });
+ expect(utils.trimFirstCharOfLineContent({ rich_text: '-diff' })).toEqual({
+ discussions: [],
+ rich_text: 'diff',
+ });
});
it('does not trims the line when it starts with a letter', () => {
- expect(utils.trimFirstCharOfLineContent({ richText: 'diff' })).toEqual({ richText: 'diff' });
+ expect(utils.trimFirstCharOfLineContent({ rich_text: 'diff' })).toEqual({
+ discussions: [],
+ rich_text: 'diff',
+ });
});
it('does not modify the provided object', () => {
const lineObj = {
- richText: ' diff',
+ discussions: [],
+ rich_text: ' diff',
};
utils.trimFirstCharOfLineContent(lineObj);
- expect(lineObj).toEqual({ richText: ' diff' });
+
+ expect(lineObj).toEqual({ discussions: [], rich_text: ' diff' });
});
it('handles a undefined or null parameter', () => {
- expect(utils.trimFirstCharOfLineContent()).toEqual({});
+ expect(utils.trimFirstCharOfLineContent()).toEqual({ discussions: [] });
+ });
+ });
+
+ describe('prepareDiffData', () => {
+ it('sets the renderIt and collapsed attribute on files', () => {
+ const preparedDiff = { diff_files: [getDiffFileMock()] };
+ utils.prepareDiffData(preparedDiff);
+
+ const firstParallelDiffLine = preparedDiff.diff_files[0].parallel_diff_lines[2];
+
+ expect(firstParallelDiffLine.left.discussions.length).toBe(0);
+ expect(firstParallelDiffLine.left).not.toHaveAttr('text');
+ expect(firstParallelDiffLine.right.discussions.length).toBe(0);
+ expect(firstParallelDiffLine.right).not.toHaveAttr('text');
+ const firstParallelChar = firstParallelDiffLine.right.rich_text.charAt(0);
+
+ expect(firstParallelChar).not.toBe(' ');
+ expect(firstParallelChar).not.toBe('+');
+ expect(firstParallelChar).not.toBe('-');
+
+ const checkLine = preparedDiff.diff_files[0].highlighted_diff_lines[0];
+
+ expect(checkLine.discussions.length).toBe(0);
+ expect(checkLine).not.toHaveAttr('text');
+ const firstChar = checkLine.rich_text.charAt(0);
+
+ expect(firstChar).not.toBe(' ');
+ expect(firstChar).not.toBe('+');
+ expect(firstChar).not.toBe('-');
+
+ expect(preparedDiff.diff_files[0].renderIt).toBeTruthy();
+ expect(preparedDiff.diff_files[0].collapsed).toBeFalsy();
+ });
+ });
+
+ describe('isDiscussionApplicableToLine', () => {
+ const diffPosition = {
+ baseSha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ headSha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
+ newLine: null,
+ newPath: '500-lines-4.txt',
+ oldLine: 5,
+ oldPath: '500-lines-4.txt',
+ startSha: 'ed13df29948c41ba367caa757ab3ec4892509910',
+ };
+
+ const wrongDiffPosition = {
+ baseSha: 'wrong',
+ headSha: 'wrong',
+ newLine: null,
+ newPath: '500-lines-4.txt',
+ oldLine: 5,
+ oldPath: '500-lines-4.txt',
+ startSha: 'wrong',
+ };
+
+ const discussions = {
+ upToDateDiscussion1: {
+ original_position: diffPosition,
+ position: wrongDiffPosition,
+ },
+ outDatedDiscussion1: {
+ original_position: wrongDiffPosition,
+ position: wrongDiffPosition,
+ },
+ };
+
+ it('returns true when the discussion is up to date', () => {
+ expect(
+ utils.isDiscussionApplicableToLine({
+ discussion: discussions.upToDateDiscussion1,
+ diffPosition,
+ latestDiff: true,
+ }),
+ ).toBe(true);
+ });
+
+ it('returns false when the discussion is not up to date', () => {
+ expect(
+ utils.isDiscussionApplicableToLine({
+ discussion: discussions.outDatedDiscussion1,
+ diffPosition,
+ latestDiff: true,
+ }),
+ ).toBe(false);
+ });
+
+ it('returns true when line codes match and discussion does not contain position and is not active', () => {
+ const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: false };
+ delete discussion.original_position;
+ delete discussion.position;
+
+ expect(
+ utils.isDiscussionApplicableToLine({
+ discussion,
+ diffPosition: {
+ ...diffPosition,
+ lineCode: 'ABC_1',
+ },
+ latestDiff: true,
+ }),
+ ).toBe(false);
+ });
+
+ it('returns true when line codes match and discussion does not contain position and is active', () => {
+ const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: true };
+ delete discussion.original_position;
+ delete discussion.position;
+
+ expect(
+ utils.isDiscussionApplicableToLine({
+ discussion,
+ diffPosition: {
+ ...diffPosition,
+ line_code: 'ABC_1',
+ },
+ latestDiff: true,
+ }),
+ ).toBe(true);
+ });
+
+ it('returns false when not latest diff', () => {
+ const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: true };
+ delete discussion.original_position;
+ delete discussion.position;
+
+ expect(
+ utils.isDiscussionApplicableToLine({
+ discussion,
+ diffPosition: {
+ ...diffPosition,
+ lineCode: 'ABC_1',
+ },
+ latestDiff: false,
+ }),
+ ).toBe(false);
+ });
+ });
+
+ describe('generateTreeList', () => {
+ let files;
+
+ beforeAll(() => {
+ files = [
+ {
+ new_path: 'app/index.js',
+ deleted_file: false,
+ new_file: false,
+ removed_lines: 10,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'app/test/index.js',
+ deleted_file: false,
+ new_file: true,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'app/test/filepathneedstruncating.js',
+ deleted_file: false,
+ new_file: true,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'package.json',
+ deleted_file: true,
+ new_file: false,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ ];
+ });
+
+ it('creates a tree of files', () => {
+ const { tree } = utils.generateTreeList(files);
+
+ expect(tree).toEqual([
+ {
+ key: 'app',
+ path: 'app',
+ name: 'app',
+ type: 'tree',
+ tree: [
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/index.js',
+ name: 'index.js',
+ path: 'app/index.js',
+ removedLines: 10,
+ tempFile: false,
+ type: 'blob',
+ tree: [],
+ },
+ {
+ key: 'app/test',
+ path: 'app/test',
+ name: 'test',
+ type: 'tree',
+ opened: true,
+ tree: [
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/test/index.js',
+ name: 'index.js',
+ path: 'app/test/index.js',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ tree: [],
+ },
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/test/filepathneedstruncating.js',
+ name: 'filepathneedstruncating.js',
+ path: 'app/test/filepathneedstruncating.js',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ tree: [],
+ },
+ ],
+ },
+ ],
+ opened: true,
+ },
+ {
+ key: 'package.json',
+ path: 'package.json',
+ name: 'package.json',
+ type: 'blob',
+ changed: true,
+ tempFile: false,
+ deleted: true,
+ fileHash: 'test',
+ addedLines: 0,
+ removedLines: 0,
+ tree: [],
+ },
+ ]);
+ });
+
+ it('creates flat list of blobs & folders', () => {
+ const { treeEntries } = utils.generateTreeList(files);
+
+ expect(Object.keys(treeEntries)).toEqual([
+ 'app',
+ 'app/index.js',
+ 'app/test',
+ 'app/test/index.js',
+ 'app/test/filepathneedstruncating.js',
+ 'package.json',
+ ]);
});
});
});
diff --git a/spec/javascripts/dirty_submit/dirty_submit_collection_spec.js b/spec/javascripts/dirty_submit/dirty_submit_collection_spec.js
new file mode 100644
index 00000000000..08ffc44605f
--- /dev/null
+++ b/spec/javascripts/dirty_submit/dirty_submit_collection_spec.js
@@ -0,0 +1,29 @@
+import DirtySubmitCollection from '~/dirty_submit/dirty_submit_collection';
+import { setInput, createForm } from './helper';
+
+describe('DirtySubmitCollection', () => {
+ it('disables submits until there are changes', done => {
+ const testElementsCollection = [createForm(), createForm()];
+ const forms = testElementsCollection.map(testElements => testElements.form);
+
+ new DirtySubmitCollection(forms); // eslint-disable-line no-new
+
+ testElementsCollection.forEach(testElements => {
+ const { input, submit } = testElements;
+ const originalValue = input.value;
+
+ expect(submit.disabled).toBe(true);
+
+ return setInput(input, `${originalValue} changes`)
+ .then(() => {
+ expect(submit.disabled).toBe(false);
+ })
+ .then(() => setInput(input, originalValue))
+ .then(() => {
+ expect(submit.disabled).toBe(true);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+});
diff --git a/spec/javascripts/dirty_submit/dirty_submit_factory_spec.js b/spec/javascripts/dirty_submit/dirty_submit_factory_spec.js
new file mode 100644
index 00000000000..40843a68582
--- /dev/null
+++ b/spec/javascripts/dirty_submit/dirty_submit_factory_spec.js
@@ -0,0 +1,18 @@
+import dirtySubmitFactory from '~/dirty_submit/dirty_submit_factory';
+import DirtySubmitForm from '~/dirty_submit/dirty_submit_form';
+import DirtySubmitCollection from '~/dirty_submit/dirty_submit_collection';
+import { createForm } from './helper';
+
+describe('DirtySubmitCollection', () => {
+ it('returns a DirtySubmitForm instance for single form elements', () => {
+ const { form } = createForm();
+
+ expect(dirtySubmitFactory(form) instanceof DirtySubmitForm).toBe(true);
+ });
+
+ it('returns a DirtySubmitCollection instance for a collection of form elements', () => {
+ const forms = [createForm().form, createForm().form];
+
+ expect(dirtySubmitFactory(forms) instanceof DirtySubmitCollection).toBe(true);
+ });
+});
diff --git a/spec/javascripts/dirty_submit/dirty_submit_form_spec.js b/spec/javascripts/dirty_submit/dirty_submit_form_spec.js
new file mode 100644
index 00000000000..093fec97951
--- /dev/null
+++ b/spec/javascripts/dirty_submit/dirty_submit_form_spec.js
@@ -0,0 +1,36 @@
+import DirtySubmitForm from '~/dirty_submit/dirty_submit_form';
+import { setInput, createForm } from './helper';
+
+function expectToToggleDisableOnDirtyUpdate(submit, input) {
+ const originalValue = input.value;
+
+ expect(submit.disabled).toBe(true);
+
+ return setInput(input, `${originalValue} changes`)
+ .then(() => expect(submit.disabled).toBe(false))
+ .then(() => setInput(input, originalValue))
+ .then(() => expect(submit.disabled).toBe(true));
+}
+
+describe('DirtySubmitForm', () => {
+ it('disables submit until there are changes', done => {
+ const { form, input, submit } = createForm();
+
+ new DirtySubmitForm(form); // eslint-disable-line no-new
+
+ return expectToToggleDisableOnDirtyUpdate(submit, input)
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('disables submit until there are changes when initializing with a falsy value', done => {
+ const { form, input, submit } = createForm();
+ input.value = '';
+
+ new DirtySubmitForm(form); // eslint-disable-line no-new
+
+ return expectToToggleDisableOnDirtyUpdate(submit, input)
+ .then(done)
+ .catch(done.fail);
+ });
+});
diff --git a/spec/javascripts/dirty_submit/helper.js b/spec/javascripts/dirty_submit/helper.js
new file mode 100644
index 00000000000..6d1e643553c
--- /dev/null
+++ b/spec/javascripts/dirty_submit/helper.js
@@ -0,0 +1,31 @@
+import DirtySubmitForm from '~/dirty_submit/dirty_submit_form';
+import setTimeoutPromiseHelper from '../helpers/set_timeout_promise_helper';
+
+export function setInput(element, value) {
+ element.value = value;
+
+ element.dispatchEvent(
+ new Event('input', {
+ bubbles: true,
+ cancelable: true,
+ }),
+ );
+
+ return setTimeoutPromiseHelper(DirtySubmitForm.THROTTLE_DURATION);
+}
+
+export function createForm() {
+ const form = document.createElement('form');
+ form.innerHTML = `
+ <input type="text" value="original" class="js-input" name="input" />
+ <button type="submit" class="js-dirty-submit"></button>
+ `;
+ const input = form.querySelector('.js-input');
+ const submit = form.querySelector('.js-dirty-submit');
+
+ return {
+ form,
+ input,
+ submit,
+ };
+}
diff --git a/spec/javascripts/droplab/drop_down_spec.js b/spec/javascripts/droplab/drop_down_spec.js
index 896a04a1a07..18ab03653f4 100644
--- a/spec/javascripts/droplab/drop_down_spec.js
+++ b/spec/javascripts/droplab/drop_down_spec.js
@@ -2,9 +2,9 @@ import DropDown from '~/droplab/drop_down';
import utils from '~/droplab/utils';
import { SELECTED_CLASS } from '~/droplab/constants';
-describe('DropLab DropDown', function () {
- describe('class constructor', function () {
- beforeEach(function () {
+describe('DropLab DropDown', function() {
+ describe('class constructor', function() {
+ beforeEach(function() {
spyOn(DropDown.prototype, 'getItems');
spyOn(DropDown.prototype, 'initTemplateString');
spyOn(DropDown.prototype, 'addEvents');
@@ -13,32 +13,32 @@ describe('DropLab DropDown', function () {
this.dropdown = new DropDown(this.list);
});
- it('sets the .hidden property to true', function () {
+ it('sets the .hidden property to true', function() {
expect(this.dropdown.hidden).toBe(true);
});
- it('sets the .list property', function () {
+ it('sets the .list property', function() {
expect(this.dropdown.list).toBe(this.list);
});
- it('calls .getItems', function () {
+ it('calls .getItems', function() {
expect(DropDown.prototype.getItems).toHaveBeenCalled();
});
- it('calls .initTemplateString', function () {
+ it('calls .initTemplateString', function() {
expect(DropDown.prototype.initTemplateString).toHaveBeenCalled();
});
- it('calls .addEvents', function () {
+ it('calls .addEvents', function() {
expect(DropDown.prototype.addEvents).toHaveBeenCalled();
});
- it('sets the .initialState property to the .list.innerHTML', function () {
+ it('sets the .initialState property to the .list.innerHTML', function() {
expect(this.dropdown.initialState).toBe(this.list.innerHTML);
});
- describe('if the list argument is a string', function () {
- beforeEach(function () {
+ describe('if the list argument is a string', function() {
+ beforeEach(function() {
this.element = {};
this.selector = '.selector';
@@ -47,18 +47,18 @@ describe('DropLab DropDown', function () {
this.dropdown = new DropDown(this.selector);
});
- it('calls .querySelector with the selector string', function () {
+ it('calls .querySelector with the selector string', function() {
expect(Document.prototype.querySelector).toHaveBeenCalledWith(this.selector);
});
- it('sets the .list property element', function () {
+ it('sets the .list property element', function() {
expect(this.dropdown.list).toBe(this.element);
});
});
});
- describe('getItems', function () {
- beforeEach(function () {
+ describe('getItems', function() {
+ beforeEach(function() {
this.list = { querySelectorAll: () => {} };
this.dropdown = { list: this.list };
this.nodeList = [];
@@ -68,37 +68,37 @@ describe('DropLab DropDown', function () {
this.getItems = DropDown.prototype.getItems.call(this.dropdown);
});
- it('calls .querySelectorAll with a list item query', function () {
+ it('calls .querySelectorAll with a list item query', function() {
expect(this.list.querySelectorAll).toHaveBeenCalledWith('li');
});
- it('sets the .items property to the returned list items', function () {
+ it('sets the .items property to the returned list items', function() {
expect(this.dropdown.items).toEqual(jasmine.any(Array));
});
- it('returns the .items', function () {
+ it('returns the .items', function() {
expect(this.getItems).toEqual(jasmine.any(Array));
});
});
- describe('initTemplateString', function () {
- beforeEach(function () {
+ describe('initTemplateString', function() {
+ beforeEach(function() {
this.items = [{ outerHTML: '<a></a>' }, { outerHTML: '<img>' }];
this.dropdown = { items: this.items };
DropDown.prototype.initTemplateString.call(this.dropdown);
});
- it('should set .templateString to the last items .outerHTML', function () {
+ it('should set .templateString to the last items .outerHTML', function() {
expect(this.dropdown.templateString).toBe(this.items[1].outerHTML);
});
- it('should not set .templateString to a non-last items .outerHTML', function () {
+ it('should not set .templateString to a non-last items .outerHTML', function() {
expect(this.dropdown.templateString).not.toBe(this.items[0].outerHTML);
});
- describe('if .items is not set', function () {
- beforeEach(function () {
+ describe('if .items is not set', function() {
+ beforeEach(function() {
this.dropdown = { getItems: () => {} };
spyOn(this.dropdown, 'getItems').and.returnValue([]);
@@ -106,26 +106,26 @@ describe('DropLab DropDown', function () {
DropDown.prototype.initTemplateString.call(this.dropdown);
});
- it('should call .getItems', function () {
+ it('should call .getItems', function() {
expect(this.dropdown.getItems).toHaveBeenCalled();
});
});
- describe('if items array is empty', function () {
- beforeEach(function () {
+ describe('if items array is empty', function() {
+ beforeEach(function() {
this.dropdown = { items: [] };
DropDown.prototype.initTemplateString.call(this.dropdown);
});
- it('should set .templateString to an empty string', function () {
+ it('should set .templateString to an empty string', function() {
expect(this.dropdown.templateString).toBe('');
});
});
});
- describe('clickEvent', function () {
- beforeEach(function () {
+ describe('clickEvent', function() {
+ beforeEach(function() {
this.classList = jasmine.createSpyObj('classList', ['contains']);
this.list = { dispatchEvent: () => {} };
this.dropdown = {
@@ -143,7 +143,7 @@ describe('DropLab DropDown', function () {
};
this.customEvent = {};
this.dummyListItem = document.createElement('li');
- spyOn(this.event.target, 'closest').and.callFake((selector) => {
+ spyOn(this.event.target, 'closest').and.callFake(selector => {
if (selector === 'li') {
return this.dummyListItem;
}
@@ -159,51 +159,51 @@ describe('DropLab DropDown', function () {
this.classList.contains.and.returnValue(false);
});
- it('should call event.target.closest', function () {
+ it('should call event.target.closest', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.event.target.closest).toHaveBeenCalledWith('.droplab-item-ignore');
expect(this.event.target.closest).toHaveBeenCalledWith('li');
});
- it('should call addSelectedClass', function () {
+ it('should call addSelectedClass', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.dropdown.addSelectedClass).toHaveBeenCalledWith(this.dummyListItem);
});
- it('should call .preventDefault', function () {
+ it('should call .preventDefault', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.event.preventDefault).toHaveBeenCalled();
});
- it('should call .hide', function () {
+ it('should call .hide', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.dropdown.hide).toHaveBeenCalled();
});
- it('should construct CustomEvent', function () {
+ it('should construct CustomEvent', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(window.CustomEvent).toHaveBeenCalledWith('click.dl', jasmine.any(Object));
});
- it('should call .dispatchEvent with the customEvent', function () {
+ it('should call .dispatchEvent with the customEvent', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.list.dispatchEvent).toHaveBeenCalledWith(this.customEvent);
});
- describe('if the target is a UL element', function () {
- beforeEach(function () {
+ describe('if the target is a UL element', function() {
+ beforeEach(function() {
this.event.target = document.createElement('ul');
spyOn(this.event.target, 'closest');
});
- it('should return immediately', function () {
+ it('should return immediately', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.event.target.closest).not.toHaveBeenCalled();
@@ -211,8 +211,8 @@ describe('DropLab DropDown', function () {
});
});
- describe('if the target has the droplab-item-ignore class', function () {
- beforeEach(function () {
+ describe('if the target has the droplab-item-ignore class', function() {
+ beforeEach(function() {
this.ignoredButton = document.createElement('button');
this.ignoredButton.classList.add('droplab-item-ignore');
this.event.target = this.ignoredButton;
@@ -220,7 +220,7 @@ describe('DropLab DropDown', function () {
spyOn(this.ignoredButton, 'closest').and.callThrough();
});
- it('does not select element', function () {
+ it('does not select element', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.ignoredButton.closest.calls.count()).toBe(1);
@@ -229,13 +229,13 @@ describe('DropLab DropDown', function () {
});
});
- describe('if no selected element exists', function () {
- beforeEach(function () {
+ describe('if no selected element exists', function() {
+ beforeEach(function() {
this.event.preventDefault.calls.reset();
this.dummyListItem = null;
});
- it('should return before .preventDefault is called', function () {
+ it('should return before .preventDefault is called', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.event.preventDefault).not.toHaveBeenCalled();
@@ -244,12 +244,12 @@ describe('DropLab DropDown', function () {
});
describe('if hideOnClick is false', () => {
- beforeEach(function () {
+ beforeEach(function() {
this.dropdown.hideOnClick = false;
this.dropdown.hide.calls.reset();
});
- it('should not call .hide', function () {
+ it('should not call .hide', function() {
DropDown.prototype.clickEvent.call(this.dropdown, this.event);
expect(this.dropdown.hide).not.toHaveBeenCalled();
@@ -257,8 +257,8 @@ describe('DropLab DropDown', function () {
});
});
- describe('addSelectedClass', function () {
- beforeEach(function () {
+ describe('addSelectedClass', function() {
+ beforeEach(function() {
this.items = Array(4).forEach((item, i) => {
this.items[i] = { classList: { add: () => {} } };
spyOn(this.items[i].classList, 'add');
@@ -272,17 +272,17 @@ describe('DropLab DropDown', function () {
DropDown.prototype.addSelectedClass.call(this.dropdown, this.selected);
});
- it('should call .removeSelectedClasses', function () {
+ it('should call .removeSelectedClasses', function() {
expect(this.dropdown.removeSelectedClasses).toHaveBeenCalled();
});
- it('should call .classList.add', function () {
+ it('should call .classList.add', function() {
expect(this.selected.classList.add).toHaveBeenCalledWith(SELECTED_CLASS);
});
});
- describe('removeSelectedClasses', function () {
- beforeEach(function () {
+ describe('removeSelectedClasses', function() {
+ beforeEach(function() {
this.items = Array(4);
this.items.forEach((item, i) => {
this.items[i] = { classList: { add: () => {} } };
@@ -293,14 +293,14 @@ describe('DropLab DropDown', function () {
DropDown.prototype.removeSelectedClasses.call(this.dropdown);
});
- it('should call .classList.remove for all items', function () {
+ it('should call .classList.remove for all items', function() {
this.items.forEach((item, i) => {
expect(this.items[i].classList.add).toHaveBeenCalledWith(SELECTED_CLASS);
});
});
- describe('if .items is not set', function () {
- beforeEach(function () {
+ describe('if .items is not set', function() {
+ beforeEach(function() {
this.dropdown = { getItems: () => {} };
spyOn(this.dropdown, 'getItems').and.returnValue([]);
@@ -308,14 +308,14 @@ describe('DropLab DropDown', function () {
DropDown.prototype.removeSelectedClasses.call(this.dropdown);
});
- it('should call .getItems', function () {
+ it('should call .getItems', function() {
expect(this.dropdown.getItems).toHaveBeenCalled();
});
});
});
- describe('addEvents', function () {
- beforeEach(function () {
+ describe('addEvents', function() {
+ beforeEach(function() {
this.list = {
addEventListener: () => {},
querySelectorAll: () => [],
@@ -328,7 +328,7 @@ describe('DropLab DropDown', function () {
};
});
- it('should call .addEventListener', function () {
+ it('should call .addEventListener', function() {
spyOn(this.list, 'addEventListener');
DropDown.prototype.addEvents.call(this.dropdown);
@@ -338,8 +338,8 @@ describe('DropLab DropDown', function () {
});
});
- describe('setData', function () {
- beforeEach(function () {
+ describe('setData', function() {
+ beforeEach(function() {
this.dropdown = { render: () => {} };
this.data = ['data'];
@@ -348,17 +348,17 @@ describe('DropLab DropDown', function () {
DropDown.prototype.setData.call(this.dropdown, this.data);
});
- it('should set .data', function () {
+ it('should set .data', function() {
expect(this.dropdown.data).toBe(this.data);
});
- it('should call .render with the .data', function () {
+ it('should call .render with the .data', function() {
expect(this.dropdown.render).toHaveBeenCalledWith(this.data);
});
});
- describe('addData', function () {
- beforeEach(function () {
+ describe('addData', function() {
+ beforeEach(function() {
this.dropdown = { render: () => {}, data: ['data1'] };
this.data = ['data2'];
@@ -368,20 +368,20 @@ describe('DropLab DropDown', function () {
DropDown.prototype.addData.call(this.dropdown, this.data);
});
- it('should call .concat with data', function () {
+ it('should call .concat with data', function() {
expect(Array.prototype.concat).toHaveBeenCalledWith(this.data);
});
- it('should set .data with concatination', function () {
+ it('should set .data with concatination', function() {
expect(this.dropdown.data).toEqual(['data1', 'data2']);
});
- it('should call .render with the .data', function () {
+ it('should call .render with the .data', function() {
expect(this.dropdown.render).toHaveBeenCalledWith(['data1', 'data2']);
});
- describe('if .data is undefined', function () {
- beforeEach(function () {
+ describe('if .data is undefined', function() {
+ beforeEach(function() {
this.dropdown = { render: () => {}, data: undefined };
this.data = ['data2'];
@@ -390,14 +390,14 @@ describe('DropLab DropDown', function () {
DropDown.prototype.addData.call(this.dropdown, this.data);
});
- it('should set .data with concatination', function () {
+ it('should set .data with concatination', function() {
expect(this.dropdown.data).toEqual(['data2']);
});
});
});
- describe('render', function () {
- beforeEach(function () {
+ describe('render', function() {
+ beforeEach(function() {
this.list = { querySelector: () => {}, dispatchEvent: () => {} };
this.dropdown = { renderChildren: () => {}, list: this.list };
this.renderableList = {};
@@ -413,45 +413,45 @@ describe('DropLab DropDown', function () {
DropDown.prototype.render.call(this.dropdown, this.data);
});
- it('should call .map', function () {
+ it('should call .map', function() {
expect(this.data.map).toHaveBeenCalledWith(jasmine.any(Function));
});
- it('should call .renderChildren for each data item', function () {
+ it('should call .renderChildren for each data item', function() {
expect(this.dropdown.renderChildren.calls.count()).toBe(this.data.length);
});
- it('sets the renderableList .innerHTML', function () {
+ it('sets the renderableList .innerHTML', function() {
expect(this.renderableList.innerHTML).toBe('01');
});
- it('should call render.dl', function () {
+ it('should call render.dl', function() {
expect(window.CustomEvent).toHaveBeenCalledWith('render.dl', jasmine.any(Object));
});
- it('should call dispatchEvent with the customEvent', function () {
+ it('should call dispatchEvent with the customEvent', function() {
expect(this.list.dispatchEvent).toHaveBeenCalledWith(this.customEvent);
});
- describe('if no data argument is passed', function () {
- beforeEach(function () {
+ describe('if no data argument is passed', function() {
+ beforeEach(function() {
this.data.map.calls.reset();
this.dropdown.renderChildren.calls.reset();
DropDown.prototype.render.call(this.dropdown, undefined);
});
- it('should not call .map', function () {
+ it('should not call .map', function() {
expect(this.data.map).not.toHaveBeenCalled();
});
- it('should not call .renderChildren', function () {
+ it('should not call .renderChildren', function() {
expect(this.dropdown.renderChildren).not.toHaveBeenCalled();
});
});
- describe('if no dynamic list is present', function () {
- beforeEach(function () {
+ describe('if no dynamic list is present', function() {
+ beforeEach(function() {
this.list = { querySelector: () => {}, dispatchEvent: () => {} };
this.dropdown = { renderChildren: () => {}, list: this.list };
this.data = [0, 1];
@@ -463,14 +463,14 @@ describe('DropLab DropDown', function () {
DropDown.prototype.render.call(this.dropdown, this.data);
});
- it('sets the .list .innerHTML', function () {
+ it('sets the .list .innerHTML', function() {
expect(this.list.innerHTML).toBe('01');
});
});
});
- describe('renderChildren', function () {
- beforeEach(function () {
+ describe('renderChildren', function() {
+ beforeEach(function() {
this.templateString = 'templateString';
this.dropdown = { templateString: this.templateString };
this.data = { droplab_hidden: true };
@@ -484,44 +484,44 @@ describe('DropLab DropDown', function () {
this.renderChildren = DropDown.prototype.renderChildren.call(this.dropdown, this.data);
});
- it('should call utils.t with .templateString and data', function () {
+ it('should call utils.t with .templateString and data', function() {
expect(utils.template).toHaveBeenCalledWith(this.templateString, this.data);
});
- it('should call document.createElement', function () {
+ it('should call document.createElement', function() {
expect(document.createElement).toHaveBeenCalledWith('div');
});
- it('should set the templates .innerHTML to the HTML', function () {
+ it('should set the templates .innerHTML to the HTML', function() {
expect(this.template.innerHTML).toBe(this.html);
});
- it('should call .setImagesSrc with the template', function () {
+ it('should call .setImagesSrc with the template', function() {
expect(DropDown.setImagesSrc).toHaveBeenCalledWith(this.template);
});
- it('should set the template display to none', function () {
+ it('should set the template display to none', function() {
expect(this.template.firstChild.style.display).toBe('none');
});
- it('should return the templates .firstChild.outerHTML', function () {
+ it('should return the templates .firstChild.outerHTML', function() {
expect(this.renderChildren).toBe(this.template.firstChild.outerHTML);
});
- describe('if droplab_hidden is false', function () {
- beforeEach(function () {
+ describe('if droplab_hidden is false', function() {
+ beforeEach(function() {
this.data = { droplab_hidden: false };
this.renderChildren = DropDown.prototype.renderChildren.call(this.dropdown, this.data);
});
- it('should set the template display to block', function () {
+ it('should set the template display to block', function() {
expect(this.template.firstChild.style.display).toBe('block');
});
});
});
- describe('setImagesSrc', function () {
- beforeEach(function () {
+ describe('setImagesSrc', function() {
+ beforeEach(function() {
this.template = { querySelectorAll: () => {} };
spyOn(this.template, 'querySelectorAll').and.returnValue([]);
@@ -529,64 +529,64 @@ describe('DropLab DropDown', function () {
DropDown.setImagesSrc(this.template);
});
- it('should call .querySelectorAll', function () {
+ it('should call .querySelectorAll', function() {
expect(this.template.querySelectorAll).toHaveBeenCalledWith('img[data-src]');
});
});
- describe('show', function () {
- beforeEach(function () {
+ describe('show', function() {
+ beforeEach(function() {
this.list = { style: {} };
this.dropdown = { list: this.list, hidden: true };
DropDown.prototype.show.call(this.dropdown);
});
- it('it should set .list display to block', function () {
+ it('it should set .list display to block', function() {
expect(this.list.style.display).toBe('block');
});
- it('it should set .hidden to false', function () {
+ it('it should set .hidden to false', function() {
expect(this.dropdown.hidden).toBe(false);
});
- describe('if .hidden is false', function () {
- beforeEach(function () {
+ describe('if .hidden is false', function() {
+ beforeEach(function() {
this.list = { style: {} };
this.dropdown = { list: this.list, hidden: false };
this.show = DropDown.prototype.show.call(this.dropdown);
});
- it('should return undefined', function () {
+ it('should return undefined', function() {
expect(this.show).toEqual(undefined);
});
- it('should not set .list display to block', function () {
+ it('should not set .list display to block', function() {
expect(this.list.style.display).not.toEqual('block');
});
});
});
- describe('hide', function () {
- beforeEach(function () {
+ describe('hide', function() {
+ beforeEach(function() {
this.list = { style: {} };
this.dropdown = { list: this.list };
DropDown.prototype.hide.call(this.dropdown);
});
- it('it should set .list display to none', function () {
+ it('it should set .list display to none', function() {
expect(this.list.style.display).toBe('none');
});
- it('it should set .hidden to true', function () {
+ it('it should set .hidden to true', function() {
expect(this.dropdown.hidden).toBe(true);
});
});
- describe('toggle', function () {
- beforeEach(function () {
+ describe('toggle', function() {
+ beforeEach(function() {
this.hidden = true;
this.dropdown = { hidden: this.hidden, show: () => {}, hide: () => {} };
@@ -596,12 +596,12 @@ describe('DropLab DropDown', function () {
DropDown.prototype.toggle.call(this.dropdown);
});
- it('should call .show', function () {
+ it('should call .show', function() {
expect(this.dropdown.show).toHaveBeenCalled();
});
- describe('if .hidden is false', function () {
- beforeEach(function () {
+ describe('if .hidden is false', function() {
+ beforeEach(function() {
this.hidden = false;
this.dropdown = { hidden: this.hidden, show: () => {}, hide: () => {} };
@@ -611,14 +611,14 @@ describe('DropLab DropDown', function () {
DropDown.prototype.toggle.call(this.dropdown);
});
- it('should call .hide', function () {
+ it('should call .hide', function() {
expect(this.dropdown.hide).toHaveBeenCalled();
});
});
});
- describe('destroy', function () {
- beforeEach(function () {
+ describe('destroy', function() {
+ beforeEach(function() {
this.list = { removeEventListener: () => {} };
this.eventWrapper = { clickEvent: 'clickEvent' };
this.dropdown = { list: this.list, hide: () => {}, eventWrapper: this.eventWrapper };
@@ -629,12 +629,15 @@ describe('DropLab DropDown', function () {
DropDown.prototype.destroy.call(this.dropdown);
});
- it('it should call .hide', function () {
+ it('it should call .hide', function() {
expect(this.dropdown.hide).toHaveBeenCalled();
});
- it('it should call .removeEventListener', function () {
- expect(this.list.removeEventListener).toHaveBeenCalledWith('click', this.eventWrapper.clickEvent);
+ it('it should call .removeEventListener', function() {
+ expect(this.list.removeEventListener).toHaveBeenCalledWith(
+ 'click',
+ this.eventWrapper.clickEvent,
+ );
});
});
});
diff --git a/spec/javascripts/droplab/hook_spec.js b/spec/javascripts/droplab/hook_spec.js
index 5eed1db2750..40470436f19 100644
--- a/spec/javascripts/droplab/hook_spec.js
+++ b/spec/javascripts/droplab/hook_spec.js
@@ -1,8 +1,8 @@
import Hook from '~/droplab/hook';
-describe('Hook', function () {
- describe('class constructor', function () {
- beforeEach(function () {
+describe('Hook', function() {
+ describe('class constructor', function() {
+ beforeEach(function() {
this.trigger = { id: 'id' };
this.list = {};
this.plugins = {};
@@ -14,58 +14,58 @@ describe('Hook', function () {
this.hook = new Hook(this.trigger, this.list, this.plugins, this.config);
});
- it('should set .trigger', function () {
+ it('should set .trigger', function() {
expect(this.hook.trigger).toBe(this.trigger);
});
- it('should set .list', function () {
+ it('should set .list', function() {
expect(this.hook.list).toBe(this.dropdown);
});
- it('should call DropDown constructor', function () {
+ it('should call DropDown constructor', function() {
expect(this.dropdownConstructor).toHaveBeenCalledWith(this.list, this.config);
});
- it('should set .type', function () {
+ it('should set .type', function() {
expect(this.hook.type).toBe('Hook');
});
- it('should set .event', function () {
+ it('should set .event', function() {
expect(this.hook.event).toBe('click');
});
- it('should set .plugins', function () {
+ it('should set .plugins', function() {
expect(this.hook.plugins).toBe(this.plugins);
});
- it('should set .config', function () {
+ it('should set .config', function() {
expect(this.hook.config).toBe(this.config);
});
- it('should set .id', function () {
+ it('should set .id', function() {
expect(this.hook.id).toBe(this.trigger.id);
});
- describe('if config argument is undefined', function () {
- beforeEach(function () {
+ describe('if config argument is undefined', function() {
+ beforeEach(function() {
this.config = undefined;
this.hook = new Hook(this.trigger, this.list, this.plugins, this.config);
});
- it('should set .config to an empty object', function () {
+ it('should set .config to an empty object', function() {
expect(this.hook.config).toEqual({});
});
});
- describe('if plugins argument is undefined', function () {
- beforeEach(function () {
+ describe('if plugins argument is undefined', function() {
+ beforeEach(function() {
this.plugins = undefined;
this.hook = new Hook(this.trigger, this.list, this.plugins, this.config);
});
- it('should set .plugins to an empty array', function () {
+ it('should set .plugins to an empty array', function() {
expect(this.hook.plugins).toEqual([]);
});
});
diff --git a/spec/javascripts/droplab/plugins/ajax_filter_spec.js b/spec/javascripts/droplab/plugins/ajax_filter_spec.js
index 8155d98b543..5dbe50af07f 100644
--- a/spec/javascripts/droplab/plugins/ajax_filter_spec.js
+++ b/spec/javascripts/droplab/plugins/ajax_filter_spec.js
@@ -38,8 +38,8 @@ describe('AjaxFilter', () => {
dummyList.list.appendChild(dynamicList);
});
- it('calls onLoadingFinished after loading data', (done) => {
- ajaxSpy = (url) => {
+ it('calls onLoadingFinished after loading data', done => {
+ ajaxSpy = url => {
expect(url).toBe('dummy endpoint?dummy search key=');
return Promise.resolve(dummyData);
};
@@ -52,16 +52,16 @@ describe('AjaxFilter', () => {
.catch(done.fail);
});
- it('does not call onLoadingFinished if Ajax call fails', (done) => {
+ it('does not call onLoadingFinished if Ajax call fails', done => {
const dummyError = new Error('My dummy is sick! :-(');
- ajaxSpy = (url) => {
+ ajaxSpy = url => {
expect(url).toBe('dummy endpoint?dummy search key=');
return Promise.reject(dummyError);
};
AjaxFilter.trigger()
.then(done.fail)
- .catch((error) => {
+ .catch(error => {
expect(error).toBe(dummyError);
expect(dummyConfig.onLoadingFinished.calls.count()).toBe(0);
})
diff --git a/spec/javascripts/droplab/plugins/ajax_spec.js b/spec/javascripts/droplab/plugins/ajax_spec.js
index 085f25764fe..2f492d00c0a 100644
--- a/spec/javascripts/droplab/plugins/ajax_spec.js
+++ b/spec/javascripts/droplab/plugins/ajax_spec.js
@@ -8,6 +8,7 @@ describe('Ajax', () => {
describe('is not configured', () => {
it('passes the data through', () => {
const data = ['data'];
+
expect(Ajax.preprocessing(config, data)).toEqual(data);
});
});
@@ -22,13 +23,17 @@ describe('Ajax', () => {
it('calls preprocessing', () => {
Ajax.preprocessing(config, []);
+
expect(config.preprocessing.calls.count()).toBe(1);
});
it('overrides AjaxCache', () => {
- spyOn(AjaxCache, 'override').and.callFake((endpoint, results) => expect(results).toEqual(processedArray));
+ spyOn(AjaxCache, 'override').and.callFake((endpoint, results) => {
+ expect(results).toEqual(processedArray);
+ });
Ajax.preprocessing(config, []);
+
expect(AjaxCache.override.calls.count()).toBe(1);
});
});
diff --git a/spec/javascripts/droplab/plugins/input_setter_spec.js b/spec/javascripts/droplab/plugins/input_setter_spec.js
index bd625f4ae80..711e0486bff 100644
--- a/spec/javascripts/droplab/plugins/input_setter_spec.js
+++ b/spec/javascripts/droplab/plugins/input_setter_spec.js
@@ -1,10 +1,8 @@
-/* eslint-disable */
-
import InputSetter from '~/droplab/plugins/input_setter';
-describe('InputSetter', function () {
- describe('init', function () {
- beforeEach(function () {
+describe('InputSetter', function() {
+ describe('init', function() {
+ beforeEach(function() {
this.config = { InputSetter: {} };
this.hook = { config: this.config };
this.inputSetter = jasmine.createSpyObj('inputSetter', ['addEvents']);
@@ -12,60 +10,62 @@ describe('InputSetter', function () {
InputSetter.init.call(this.inputSetter, this.hook);
});
- it('should set .hook', function () {
+ it('should set .hook', function() {
expect(this.inputSetter.hook).toBe(this.hook);
});
- it('should set .config', function () {
+ it('should set .config', function() {
expect(this.inputSetter.config).toBe(this.config.InputSetter);
});
- it('should set .eventWrapper', function () {
+ it('should set .eventWrapper', function() {
expect(this.inputSetter.eventWrapper).toEqual({});
});
- it('should call .addEvents', function () {
+ it('should call .addEvents', function() {
expect(this.inputSetter.addEvents).toHaveBeenCalled();
});
- describe('if config.InputSetter is not set', function () {
- beforeEach(function () {
+ describe('if config.InputSetter is not set', function() {
+ beforeEach(function() {
this.config = { InputSetter: undefined };
this.hook = { config: this.config };
InputSetter.init.call(this.inputSetter, this.hook);
});
- it('should set .config to an empty object', function () {
+ it('should set .config to an empty object', function() {
expect(this.inputSetter.config).toEqual({});
});
- it('should set hook.config to an empty object', function () {
+ it('should set hook.config to an empty object', function() {
expect(this.hook.config.InputSetter).toEqual({});
});
- })
+ });
});
- describe('addEvents', function () {
- beforeEach(function () {
+ describe('addEvents', function() {
+ beforeEach(function() {
this.hook = { list: { list: jasmine.createSpyObj('list', ['addEventListener']) } };
this.inputSetter = { eventWrapper: {}, hook: this.hook, setInputs: () => {} };
InputSetter.addEvents.call(this.inputSetter);
});
- it('should set .eventWrapper.setInputs', function () {
+ it('should set .eventWrapper.setInputs', function() {
expect(this.inputSetter.eventWrapper.setInputs).toEqual(jasmine.any(Function));
});
- it('should call .addEventListener', function () {
- expect(this.hook.list.list.addEventListener)
- .toHaveBeenCalledWith('click.dl', this.inputSetter.eventWrapper.setInputs);
+ it('should call .addEventListener', function() {
+ expect(this.hook.list.list.addEventListener).toHaveBeenCalledWith(
+ 'click.dl',
+ this.inputSetter.eventWrapper.setInputs,
+ );
});
});
- describe('removeEvents', function () {
- beforeEach(function () {
+ describe('removeEvents', function() {
+ beforeEach(function() {
this.hook = { list: { list: jasmine.createSpyObj('list', ['removeEventListener']) } };
this.eventWrapper = jasmine.createSpyObj('eventWrapper', ['setInputs']);
this.inputSetter = { eventWrapper: this.eventWrapper, hook: this.hook };
@@ -73,14 +73,16 @@ describe('InputSetter', function () {
InputSetter.removeEvents.call(this.inputSetter);
});
- it('should call .removeEventListener', function () {
- expect(this.hook.list.list.removeEventListener)
- .toHaveBeenCalledWith('click.dl', this.eventWrapper.setInputs);
+ it('should call .removeEventListener', function() {
+ expect(this.hook.list.list.removeEventListener).toHaveBeenCalledWith(
+ 'click.dl',
+ this.eventWrapper.setInputs,
+ );
});
});
- describe('setInputs', function () {
- beforeEach(function () {
+ describe('setInputs', function() {
+ beforeEach(function() {
this.event = { detail: { selected: {} } };
this.config = [0, 1];
this.inputSetter = { config: this.config, setInput: () => {} };
@@ -90,7 +92,7 @@ describe('InputSetter', function () {
InputSetter.setInputs.call(this.inputSetter, this.event);
});
- it('should call .setInput for each config element', function () {
+ it('should call .setInput for each config element', function() {
const allArgs = this.inputSetter.setInput.calls.allArgs();
expect(allArgs.length).toEqual(2);
@@ -101,21 +103,21 @@ describe('InputSetter', function () {
});
});
- describe('if config isnt an array', function () {
- beforeEach(function () {
+ describe('if config isnt an array', function() {
+ beforeEach(function() {
this.inputSetter = { config: {}, setInput: () => {} };
InputSetter.setInputs.call(this.inputSetter, this.event);
});
- it('should set .config to an array with .config as the first element', function () {
+ it('should set .config to an array with .config as the first element', function() {
expect(this.inputSetter.config).toEqual([{}]);
});
});
});
- describe('setInput', function () {
- beforeEach(function () {
+ describe('setInput', function() {
+ beforeEach(function() {
this.selectedItem = { getAttribute: () => {} };
this.input = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
this.config = { valueAttribute: {}, input: this.input };
@@ -128,20 +130,20 @@ describe('InputSetter', function () {
InputSetter.setInput.call(this.inputSetter, this.config, this.selectedItem);
});
- it('should call .getAttribute', function () {
+ it('should call .getAttribute', function() {
expect(this.selectedItem.getAttribute).toHaveBeenCalledWith(this.config.valueAttribute);
});
- it('should call .hasAttribute', function () {
+ it('should call .hasAttribute', function() {
expect(this.input.hasAttribute).toHaveBeenCalledWith(undefined);
});
- it('should set the value of the input', function () {
+ it('should set the value of the input', function() {
expect(this.input.value).toBe(this.newValue);
});
- describe('if no config.input is provided', function () {
- beforeEach(function () {
+ describe('if no config.input is provided', function() {
+ beforeEach(function() {
this.config = { valueAttribute: {} };
this.trigger = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
this.inputSetter = { hook: { trigger: this.trigger } };
@@ -149,26 +151,26 @@ describe('InputSetter', function () {
InputSetter.setInput.call(this.inputSetter, this.config, this.selectedItem);
});
- it('should set the value of the hook.trigger', function () {
+ it('should set the value of the hook.trigger', function() {
expect(this.trigger.value).toBe(this.newValue);
});
});
- describe('if the input tag is not INPUT', function () {
- beforeEach(function () {
+ describe('if the input tag is not INPUT', function() {
+ beforeEach(function() {
this.input = { textContent: 'oldValue', tagName: 'SPAN', hasAttribute: () => {} };
this.config = { valueAttribute: {}, input: this.input };
InputSetter.setInput.call(this.inputSetter, this.config, this.selectedItem);
});
- it('should set the textContent of the input', function () {
+ it('should set the textContent of the input', function() {
expect(this.input.textContent).toBe(this.newValue);
});
});
- describe('if there is an inputAttribute', function () {
- beforeEach(function () {
+ describe('if there is an inputAttribute', function() {
+ beforeEach(function() {
this.selectedItem = { getAttribute: () => {} };
this.input = { id: 'oldValue', hasAttribute: () => {}, setAttribute: () => {} };
this.inputSetter = { hook: { trigger: {} } };
@@ -187,25 +189,25 @@ describe('InputSetter', function () {
InputSetter.setInput.call(this.inputSetter, this.config, this.selectedItem);
});
- it('should call setAttribute', function () {
+ it('should call setAttribute', function() {
expect(this.input.setAttribute).toHaveBeenCalledWith(this.inputAttribute, this.newValue);
});
- it('should not set the value or textContent of the input', function () {
+ it('should not set the value or textContent of the input', function() {
expect(this.input.value).not.toBe('newValue');
expect(this.input.textContent).not.toBe('newValue');
});
});
});
- describe('destroy', function () {
- beforeEach(function () {
+ describe('destroy', function() {
+ beforeEach(function() {
this.inputSetter = jasmine.createSpyObj('inputSetter', ['removeEvents']);
InputSetter.destroy.call(this.inputSetter);
});
- it('should call .removeEvents', function () {
+ it('should call .removeEvents', function() {
expect(this.inputSetter.removeEvents).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/dropzone_input_spec.js b/spec/javascripts/dropzone_input_spec.js
new file mode 100644
index 00000000000..326b2c029fb
--- /dev/null
+++ b/spec/javascripts/dropzone_input_spec.js
@@ -0,0 +1,66 @@
+import $ from 'jquery';
+import dropzoneInput from '~/dropzone_input';
+import { TEST_HOST } from 'spec/test_constants';
+
+const TEST_FILE = {
+ upload: {},
+};
+const TEST_UPLOAD_PATH = `${TEST_HOST}/upload/file`;
+const TEST_ERROR_MESSAGE = 'A big error occurred!';
+const TEMPLATE = `<form class="gfm-form" data-uploads-path="${TEST_UPLOAD_PATH}">
+ <textarea class="js-gfm-input"></textarea>
+ <div class="uploading-error-message"></div>
+</form>`;
+
+describe('dropzone_input', () => {
+ let form;
+ let dropzone;
+ let xhr;
+ let oldXMLHttpRequest;
+
+ beforeEach(() => {
+ form = $(TEMPLATE);
+
+ dropzone = dropzoneInput(form);
+
+ xhr = jasmine.createSpyObj(Object.keys(XMLHttpRequest.prototype));
+ oldXMLHttpRequest = window.XMLHttpRequest;
+ window.XMLHttpRequest = () => xhr;
+ });
+
+ afterEach(() => {
+ window.XMLHttpRequest = oldXMLHttpRequest;
+ });
+
+ it('shows error message, when AJAX fails with json', () => {
+ xhr = {
+ ...xhr,
+ statusCode: 400,
+ readyState: 4,
+ responseText: JSON.stringify({ message: TEST_ERROR_MESSAGE }),
+ getResponseHeader: () => 'application/json',
+ };
+
+ dropzone.processFile(TEST_FILE);
+
+ xhr.onload();
+
+ expect(form.find('.uploading-error-message').text()).toEqual(TEST_ERROR_MESSAGE);
+ });
+
+ it('shows error message, when AJAX fails with text', () => {
+ xhr = {
+ ...xhr,
+ statusCode: 400,
+ readyState: 4,
+ responseText: TEST_ERROR_MESSAGE,
+ getResponseHeader: () => 'text/plain',
+ };
+
+ dropzone.processFile(TEST_FILE);
+
+ xhr.onload();
+
+ expect(form.find('.uploading-error-message').text()).toEqual(TEST_ERROR_MESSAGE);
+ });
+});
diff --git a/spec/javascripts/emoji_spec.js b/spec/javascripts/emoji_spec.js
index 124d91f4477..3db4d9800f1 100644
--- a/spec/javascripts/emoji_spec.js
+++ b/spec/javascripts/emoji_spec.js
@@ -140,6 +140,7 @@ describe('gl_emoji', () => {
},
);
});
+
it('bomb emoji with sprite fallback', () => {
const emojiKey = 'bomb';
const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, {
@@ -195,24 +196,31 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isFlagEmoji('')).toBeFalsy();
});
+
it('should detect flag_ac', () => {
expect(isFlagEmoji('🇦🇨')).toBeTruthy();
});
+
it('should detect flag_us', () => {
expect(isFlagEmoji('🇺🇸')).toBeTruthy();
});
+
it('should detect flag_zw', () => {
expect(isFlagEmoji('🇿🇼')).toBeTruthy();
});
+
it('should not detect flags', () => {
expect(isFlagEmoji('🎏')).toBeFalsy();
});
+
it('should not detect triangular_flag_on_post', () => {
expect(isFlagEmoji('🚩')).toBeFalsy();
});
+
it('should not detect single letter', () => {
expect(isFlagEmoji('🇦')).toBeFalsy();
});
+
it('should not detect >2 letters', () => {
expect(isFlagEmoji('🇦🇧🇨')).toBeFalsy();
});
@@ -222,15 +230,19 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isRainbowFlagEmoji('')).toBeFalsy();
});
+
it('should detect rainbow_flag', () => {
expect(isRainbowFlagEmoji('🏳🌈')).toBeTruthy();
});
- it('should not detect flag_white on its\' own', () => {
+
+ it("should not detect flag_white on its' own", () => {
expect(isRainbowFlagEmoji('🏳')).toBeFalsy();
});
- it('should not detect rainbow on its\' own', () => {
+
+ it("should not detect rainbow on its' own", () => {
expect(isRainbowFlagEmoji('🌈')).toBeFalsy();
});
+
it('should not detect flag_white with something else', () => {
expect(isRainbowFlagEmoji('🏳🔵')).toBeFalsy();
});
@@ -240,15 +252,19 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isKeycapEmoji('')).toBeFalsy();
});
+
it('should detect one(keycap)', () => {
expect(isKeycapEmoji('1️⃣')).toBeTruthy();
});
+
it('should detect nine(keycap)', () => {
expect(isKeycapEmoji('9️⃣')).toBeTruthy();
});
+
it('should not detect ten(keycap)', () => {
expect(isKeycapEmoji('🔟')).toBeFalsy();
});
+
it('should not detect hash(keycap)', () => {
expect(isKeycapEmoji('#⃣')).toBeFalsy();
});
@@ -258,24 +274,31 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isSkinToneComboEmoji('')).toBeFalsy();
});
+
it('should detect hand_splayed_tone5', () => {
expect(isSkinToneComboEmoji('🖐🏿')).toBeTruthy();
});
+
it('should not detect hand_splayed', () => {
expect(isSkinToneComboEmoji('🖐')).toBeFalsy();
});
+
it('should detect lifter_tone1', () => {
expect(isSkinToneComboEmoji('🏋🏻')).toBeTruthy();
});
+
it('should not detect lifter', () => {
expect(isSkinToneComboEmoji('🏋')).toBeFalsy();
});
+
it('should detect rowboat_tone4', () => {
expect(isSkinToneComboEmoji('🚣🏾')).toBeTruthy();
});
+
it('should not detect rowboat', () => {
expect(isSkinToneComboEmoji('🚣')).toBeFalsy();
});
+
it('should not detect individual tone emoji', () => {
expect(isSkinToneComboEmoji('🏻')).toBeFalsy();
});
@@ -285,9 +308,11 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isHorceRacingSkinToneComboEmoji('')).toBeFalsy();
});
+
it('should detect horse_racing_tone2', () => {
expect(isHorceRacingSkinToneComboEmoji('🏇🏼')).toBeTruthy();
});
+
it('should not detect horse_racing', () => {
expect(isHorceRacingSkinToneComboEmoji('🏇')).toBeFalsy();
});
@@ -297,36 +322,47 @@ describe('gl_emoji', () => {
it('should gracefully handle empty string', () => {
expect(isPersonZwjEmoji('')).toBeFalsy();
});
+
it('should detect couple_mm', () => {
expect(isPersonZwjEmoji('👨‍❤️‍👨')).toBeTruthy();
});
+
it('should not detect couple_with_heart', () => {
expect(isPersonZwjEmoji('💑')).toBeFalsy();
});
+
it('should not detect couplekiss', () => {
expect(isPersonZwjEmoji('💏')).toBeFalsy();
});
+
it('should detect family_mmb', () => {
expect(isPersonZwjEmoji('👨‍👨‍👦')).toBeTruthy();
});
+
it('should detect family_mwgb', () => {
expect(isPersonZwjEmoji('👨‍👩‍👧‍👦')).toBeTruthy();
});
+
it('should not detect family', () => {
expect(isPersonZwjEmoji('👪')).toBeFalsy();
});
+
it('should detect kiss_ww', () => {
expect(isPersonZwjEmoji('👩‍❤️‍💋‍👩')).toBeTruthy();
});
+
it('should not detect girl', () => {
expect(isPersonZwjEmoji('👧')).toBeFalsy();
});
+
it('should not detect girl_tone5', () => {
expect(isPersonZwjEmoji('👧🏿')).toBeFalsy();
});
+
it('should not detect man', () => {
expect(isPersonZwjEmoji('👨')).toBeFalsy();
});
+
it('should not detect woman', () => {
expect(isPersonZwjEmoji('👩')).toBeFalsy();
});
@@ -334,21 +370,17 @@ describe('gl_emoji', () => {
describe('isEmojiUnicodeSupported', () => {
it('should gracefully handle empty string with unicode support', () => {
- const isSupported = isEmojiUnicodeSupported(
- { '1.0': true },
- '',
- '1.0',
- );
+ const isSupported = isEmojiUnicodeSupported({ '1.0': true }, '', '1.0');
+
expect(isSupported).toBeTruthy();
});
+
it('should gracefully handle empty string without unicode support', () => {
- const isSupported = isEmojiUnicodeSupported(
- {},
- '',
- '1.0',
- );
+ const isSupported = isEmojiUnicodeSupported({}, '', '1.0');
+
expect(isSupported).toBeFalsy();
});
+
it('bomb(6.0) with 6.0 support', () => {
const emojiKey = 'bomb';
const unicodeSupportMap = Object.assign({}, emptySupportMap, {
@@ -359,6 +391,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeTruthy();
});
@@ -370,6 +403,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeFalsy();
});
@@ -383,6 +417,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeFalsy();
});
@@ -408,6 +443,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeFalsy();
});
@@ -425,6 +461,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeTruthy();
});
@@ -442,6 +479,7 @@ describe('gl_emoji', () => {
emojiFixtureMap[emojiKey].moji,
emojiFixtureMap[emojiKey].unicodeVersion,
);
+
expect(isSupported).toBeFalsy();
});
});
diff --git a/spec/javascripts/environments/emtpy_state_spec.js b/spec/javascripts/environments/emtpy_state_spec.js
index 10a19af4175..1f986d49bc7 100644
--- a/spec/javascripts/environments/emtpy_state_spec.js
+++ b/spec/javascripts/environments/emtpy_state_spec.js
@@ -1,4 +1,3 @@
-
import Vue from 'vue';
import emptyState from '~/environments/components/empty_state.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
@@ -25,13 +24,13 @@ describe('environments empty state', () => {
});
it('renders empty state and new environment button', () => {
- expect(
- vm.$el.querySelector('.js-blank-state-title').textContent.trim(),
- ).toEqual('You don\'t have any environments right now.');
+ expect(vm.$el.querySelector('.js-blank-state-title').textContent.trim()).toEqual(
+ "You don't have any environments right now",
+ );
- expect(
- vm.$el.querySelector('.js-new-environment-button').getAttribute('href'),
- ).toEqual('foo');
+ expect(vm.$el.querySelector('.js-new-environment-button').getAttribute('href')).toEqual(
+ 'foo',
+ );
});
});
@@ -45,13 +44,11 @@ describe('environments empty state', () => {
});
it('renders empty state without new button', () => {
- expect(
- vm.$el.querySelector('.js-blank-state-title').textContent.trim(),
- ).toEqual('You don\'t have any environments right now.');
+ expect(vm.$el.querySelector('.js-blank-state-title').textContent.trim()).toEqual(
+ "You don't have any environments right now",
+ );
- expect(
- vm.$el.querySelector('.js-new-environment-button'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.js-new-environment-button')).toBeNull();
});
});
});
diff --git a/spec/javascripts/environments/environment_actions_spec.js b/spec/javascripts/environments/environment_actions_spec.js
index ea40a1fcd4b..787df757d32 100644
--- a/spec/javascripts/environments/environment_actions_spec.js
+++ b/spec/javascripts/environments/environment_actions_spec.js
@@ -1,15 +1,19 @@
import Vue from 'vue';
-import actionsComp from '~/environments/components/environment_actions.vue';
+import eventHub from '~/environments/event_hub';
+import EnvironmentActions from '~/environments/components/environment_actions.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import { TEST_HOST } from 'spec/test_constants';
-describe('Actions Component', () => {
- let ActionsComponent;
- let actionsMock;
- let component;
+describe('EnvironmentActions Component', () => {
+ const Component = Vue.extend(EnvironmentActions);
+ let vm;
- beforeEach(() => {
- ActionsComponent = Vue.extend(actionsComp);
+ afterEach(() => {
+ vm.$destroy();
+ });
- actionsMock = [
+ describe('manual actions', () => {
+ const actions = [
{
name: 'bar',
play_path: 'https://gitlab.com/play',
@@ -25,38 +29,89 @@ describe('Actions Component', () => {
},
];
- component = new ActionsComponent({
- propsData: {
- actions: actionsMock,
- },
- }).$mount();
- });
+ beforeEach(() => {
+ vm = mountComponent(Component, { actions });
+ });
+
+ it('should render a dropdown button with icon and title attribute', () => {
+ expect(vm.$el.querySelector('.fa-caret-down')).toBeDefined();
+ expect(vm.$el.querySelector('.dropdown-new').getAttribute('data-original-title')).toEqual(
+ 'Deploy to...',
+ );
- describe('computed', () => {
- it('title', () => {
- expect(component.title).toEqual('Deploy to...');
+ expect(vm.$el.querySelector('.dropdown-new').getAttribute('aria-label')).toEqual(
+ 'Deploy to...',
+ );
});
- });
- it('should render a dropdown button with icon and title attribute', () => {
- expect(component.$el.querySelector('.fa-caret-down')).toBeDefined();
- expect(component.$el.querySelector('.dropdown-new').getAttribute('data-original-title')).toEqual('Deploy to...');
- expect(component.$el.querySelector('.dropdown-new').getAttribute('aria-label')).toEqual('Deploy to...');
- });
+ it('should render a dropdown with the provided list of actions', () => {
+ expect(vm.$el.querySelectorAll('.dropdown-menu li').length).toEqual(actions.length);
+ });
+
+ it("should render a disabled action when it's not playable", () => {
+ expect(
+ vm.$el.querySelector('.dropdown-menu li:last-child button').getAttribute('disabled'),
+ ).toEqual('disabled');
- it('should render a dropdown with the provided list of actions', () => {
- expect(
- component.$el.querySelectorAll('.dropdown-menu li').length,
- ).toEqual(actionsMock.length);
+ expect(
+ vm.$el.querySelector('.dropdown-menu li:last-child button').classList.contains('disabled'),
+ ).toEqual(true);
+ });
});
- it('should render a disabled action when it\'s not playable', () => {
- expect(
- component.$el.querySelector('.dropdown-menu li:last-child button').getAttribute('disabled'),
- ).toEqual('disabled');
+ describe('scheduled jobs', () => {
+ const scheduledJobAction = {
+ name: 'scheduled action',
+ playPath: `${TEST_HOST}/scheduled/job/action`,
+ playable: true,
+ scheduledAt: '2063-04-05T00:42:00Z',
+ };
+ const expiredJobAction = {
+ name: 'expired action',
+ playPath: `${TEST_HOST}/expired/job/action`,
+ playable: true,
+ scheduledAt: '2018-10-05T08:23:00Z',
+ };
+ const findDropdownItem = action => {
+ const buttons = vm.$el.querySelectorAll('.dropdown-menu li button');
+ return Array.prototype.find.call(buttons, element =>
+ element.innerText.trim().startsWith(action.name),
+ );
+ };
+
+ beforeEach(() => {
+ spyOn(Date, 'now').and.callFake(() => new Date('2063-04-04T00:42:00Z').getTime());
+ vm = mountComponent(Component, { actions: [scheduledJobAction, expiredJobAction] });
+ });
- expect(
- component.$el.querySelector('.dropdown-menu li:last-child button').classList.contains('disabled'),
- ).toEqual(true);
+ it('emits postAction event after confirming', () => {
+ const emitSpy = jasmine.createSpy('emit');
+ eventHub.$on('postAction', emitSpy);
+ spyOn(window, 'confirm').and.callFake(() => true);
+
+ findDropdownItem(scheduledJobAction).click();
+
+ expect(window.confirm).toHaveBeenCalled();
+ expect(emitSpy).toHaveBeenCalledWith({ endpoint: scheduledJobAction.playPath });
+ });
+
+ it('does not emit postAction event if confirmation is cancelled', () => {
+ const emitSpy = jasmine.createSpy('emit');
+ eventHub.$on('postAction', emitSpy);
+ spyOn(window, 'confirm').and.callFake(() => false);
+
+ findDropdownItem(scheduledJobAction).click();
+
+ expect(window.confirm).toHaveBeenCalled();
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('displays the remaining time in the dropdown', () => {
+ expect(findDropdownItem(scheduledJobAction)).toContainText('24:00:00');
+ });
+
+ it('displays 00:00:00 for expired jobs in the dropdown', () => {
+ expect(findDropdownItem(expiredJobAction)).toContainText('00:00:00');
+ });
});
});
diff --git a/spec/javascripts/environments/environment_item_spec.js b/spec/javascripts/environments/environment_item_spec.js
index 0b933dda431..7618c2f50ce 100644
--- a/spec/javascripts/environments/environment_item_spec.js
+++ b/spec/javascripts/environments/environment_item_spec.js
@@ -38,7 +38,9 @@ describe('Environment item', () => {
});
it('Should render the number of children in a badge', () => {
- expect(component.$el.querySelector('.folder-name .badge').textContent).toContain(mockItem.size);
+ expect(component.$el.querySelector('.folder-name .badge').textContent).toContain(
+ mockItem.size,
+ );
});
});
@@ -68,7 +70,8 @@ describe('Environment item', () => {
username: 'root',
id: 1,
state: 'active',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
web_url: 'http://localhost:3000/root',
},
commit: {
@@ -84,7 +87,8 @@ describe('Environment item', () => {
username: 'root',
id: 1,
state: 'active',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
web_url: 'http://localhost:3000/root',
},
commit_path: '/root/ci-folders/tree/500aabcb17c97bdcf2d0c410b70cb8556f0362dd',
@@ -121,18 +125,18 @@ describe('Environment item', () => {
});
it('should render environment name', () => {
- expect(component.$el.querySelector('.environment-name').textContent).toContain(environment.name);
+ expect(component.$el.querySelector('.environment-name').textContent).toContain(
+ environment.name,
+ );
});
describe('With deployment', () => {
it('should render deployment internal id', () => {
- expect(
- component.$el.querySelector('.deployment-column span').textContent,
- ).toContain(environment.last_deployment.iid);
+ expect(component.$el.querySelector('.deployment-column span').textContent).toContain(
+ environment.last_deployment.iid,
+ );
- expect(
- component.$el.querySelector('.deployment-column span').textContent,
- ).toContain('#');
+ expect(component.$el.querySelector('.deployment-column span').textContent).toContain('#');
});
it('should render last deployment date', () => {
@@ -156,56 +160,46 @@ describe('Environment item', () => {
describe('With build url', () => {
it('Should link to build url provided', () => {
- expect(
- component.$el.querySelector('.build-link').getAttribute('href'),
- ).toEqual(environment.last_deployment.deployable.build_path);
+ expect(component.$el.querySelector('.build-link').getAttribute('href')).toEqual(
+ environment.last_deployment.deployable.build_path,
+ );
});
it('Should render deployable name and id', () => {
- expect(
- component.$el.querySelector('.build-link').getAttribute('href'),
- ).toEqual(environment.last_deployment.deployable.build_path);
+ expect(component.$el.querySelector('.build-link').getAttribute('href')).toEqual(
+ environment.last_deployment.deployable.build_path,
+ );
});
});
describe('With commit information', () => {
it('should render commit component', () => {
- expect(
- component.$el.querySelector('.js-commit-component'),
- ).toBeDefined();
+ expect(component.$el.querySelector('.js-commit-component')).toBeDefined();
});
});
});
describe('With manual actions', () => {
it('Should render actions component', () => {
- expect(
- component.$el.querySelector('.js-manual-actions-container'),
- ).toBeDefined();
+ expect(component.$el.querySelector('.js-manual-actions-container')).toBeDefined();
});
});
describe('With external URL', () => {
it('should render external url component', () => {
- expect(
- component.$el.querySelector('.js-external-url-container'),
- ).toBeDefined();
+ expect(component.$el.querySelector('.js-external-url-container')).toBeDefined();
});
});
describe('With stop action', () => {
it('Should render stop action component', () => {
- expect(
- component.$el.querySelector('.js-stop-component-container'),
- ).toBeDefined();
+ expect(component.$el.querySelector('.js-stop-component-container')).toBeDefined();
});
});
describe('With retry action', () => {
it('Should render rollback component', () => {
- expect(
- component.$el.querySelector('.js-rollback-component-container'),
- ).toBeDefined();
+ expect(component.$el.querySelector('.js-rollback-component-container')).toBeDefined();
});
});
});
diff --git a/spec/javascripts/environments/environments_app_spec.js b/spec/javascripts/environments/environments_app_spec.js
index 6968fbc7ce7..e2d81eb454a 100644
--- a/spec/javascripts/environments/environments_app_spec.js
+++ b/spec/javascripts/environments/environments_app_spec.js
@@ -31,9 +31,9 @@ describe('Environment', () => {
mock.restore();
});
- describe('successfull request', () => {
+ describe('successful request', () => {
describe('without environments', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet(mockData.endpoint).reply(200, { environments: [] });
component = mountComponent(EnvironmentsComponent, mockData);
@@ -44,30 +44,34 @@ describe('Environment', () => {
});
it('should render the empty state', () => {
- expect(
- component.$el.querySelector('.js-new-environment-button').textContent,
- ).toContain('New environment');
+ expect(component.$el.querySelector('.js-new-environment-button').textContent).toContain(
+ 'New environment',
+ );
- expect(
- component.$el.querySelector('.js-blank-state-title').textContent,
- ).toContain('You don\'t have any environments right now.');
+ expect(component.$el.querySelector('.js-blank-state-title').textContent).toContain(
+ "You don't have any environments right now",
+ );
});
});
describe('with paginated environments', () => {
- beforeEach((done) => {
- mock.onGet(mockData.endpoint).reply(200, {
- environments: [environment],
- stopped_count: 1,
- available_count: 0,
- }, {
- 'X-nExt-pAge': '2',
- 'x-page': '1',
- 'X-Per-Page': '1',
- 'X-Prev-Page': '',
- 'X-TOTAL': '37',
- 'X-Total-Pages': '2',
- });
+ beforeEach(done => {
+ mock.onGet(mockData.endpoint).reply(
+ 200,
+ {
+ environments: [environment],
+ stopped_count: 1,
+ available_count: 0,
+ },
+ {
+ 'X-nExt-pAge': '2',
+ 'x-page': '1',
+ 'X-Per-Page': '1',
+ 'X-Prev-Page': '',
+ 'X-TOTAL': '37',
+ 'X-Total-Pages': '2',
+ },
+ );
component = mountComponent(EnvironmentsComponent, mockData);
@@ -78,28 +82,27 @@ describe('Environment', () => {
it('should render a table with environments', () => {
expect(component.$el.querySelectorAll('table')).not.toBeNull();
- expect(
- component.$el.querySelector('.environment-name').textContent.trim(),
- ).toEqual(environment.name);
+ expect(component.$el.querySelector('.environment-name').textContent.trim()).toEqual(
+ environment.name,
+ );
});
describe('pagination', () => {
it('should render pagination', () => {
- expect(
- component.$el.querySelectorAll('.gl-pagination li').length,
- ).toEqual(5);
+ expect(component.$el.querySelectorAll('.gl-pagination li').length).toEqual(5);
});
- it('should make an API request when page is clicked', (done) => {
+ it('should make an API request when page is clicked', done => {
spyOn(component, 'updateContent');
setTimeout(() => {
component.$el.querySelector('.gl-pagination li:nth-child(5) a').click();
+
expect(component.updateContent).toHaveBeenCalledWith({ scope: 'available', page: '2' });
done();
}, 0);
});
- it('should make an API request when using tabs', (done) => {
+ it('should make an API request when using tabs', done => {
setTimeout(() => {
spyOn(component, 'updateContent');
component.$el.querySelector('.js-environments-tab-stopped').click();
@@ -113,7 +116,7 @@ describe('Environment', () => {
});
describe('unsuccessfull request', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet(mockData.endpoint).reply(500, {});
component = mountComponent(EnvironmentsComponent, mockData);
@@ -124,15 +127,16 @@ describe('Environment', () => {
});
it('should render empty state', () => {
- expect(
- component.$el.querySelector('.js-blank-state-title').textContent,
- ).toContain('You don\'t have any environments right now.');
+ expect(component.$el.querySelector('.js-blank-state-title').textContent).toContain(
+ "You don't have any environments right now",
+ );
});
});
describe('expandable folders', () => {
beforeEach(() => {
- mock.onGet(mockData.endpoint).reply(200,
+ mock.onGet(mockData.endpoint).reply(
+ 200,
{
environments: [folder],
stopped_count: 0,
@@ -153,23 +157,18 @@ describe('Environment', () => {
component = mountComponent(EnvironmentsComponent, mockData);
});
- it('should open a closed folder', (done) => {
+ it('should open a closed folder', done => {
setTimeout(() => {
component.$el.querySelector('.folder-name').click();
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.folder-icon i.fa-caret-right').getAttribute('style'),
- ).toContain('display: none');
- expect(
- component.$el.querySelector('.folder-icon i.fa-caret-down').getAttribute('style'),
- ).not.toContain('display: none');
+ expect(component.$el.querySelector('.folder-icon.ic-chevron-right')).toBe(null);
done();
});
}, 0);
});
- it('should close an opened folder', (done) => {
+ it('should close an opened folder', done => {
setTimeout(() => {
// open folder
component.$el.querySelector('.folder-name').click();
@@ -179,19 +178,14 @@ describe('Environment', () => {
component.$el.querySelector('.folder-name').click();
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.folder-icon i.fa-caret-down').getAttribute('style'),
- ).toContain('display: none');
- expect(
- component.$el.querySelector('.folder-icon i.fa-caret-right').getAttribute('style'),
- ).not.toContain('display: none');
+ expect(component.$el.querySelector('.folder-icon.ic-chevron-down')).toBe(null);
done();
});
});
}, 0);
});
- it('should show children environments and a button to show all environments', (done) => {
+ it('should show children environments and a button to show all environments', done => {
setTimeout(() => {
// open folder
component.$el.querySelector('.folder-name').click();
@@ -200,7 +194,9 @@ describe('Environment', () => {
// wait for next async request
setTimeout(() => {
expect(component.$el.querySelectorAll('.js-child-row').length).toEqual(1);
- expect(component.$el.querySelector('.text-center > a.btn').textContent).toContain('Show all');
+ expect(component.$el.querySelector('.text-center > a.btn').textContent).toContain(
+ 'Show all',
+ );
done();
});
});
@@ -210,7 +206,8 @@ describe('Environment', () => {
describe('methods', () => {
beforeEach(() => {
- mock.onGet(mockData.endpoint).reply(200,
+ mock.onGet(mockData.endpoint).reply(
+ 200,
{
environments: [],
stopped_count: 0,
@@ -224,8 +221,9 @@ describe('Environment', () => {
});
describe('updateContent', () => {
- it('should set given parameters', (done) => {
- component.updateContent({ scope: 'stopped', page: '3' })
+ it('should set given parameters', done => {
+ component
+ .updateContent({ scope: 'stopped', page: '3' })
.then(() => {
expect(component.page).toEqual('3');
expect(component.scope).toEqual('stopped');
diff --git a/spec/javascripts/environments/environments_store_spec.js b/spec/javascripts/environments/environments_store_spec.js
index f2c6ec24dd7..c3d16f10d72 100644
--- a/spec/javascripts/environments/environments_store_spec.js
+++ b/spec/javascripts/environments/environments_store_spec.js
@@ -17,23 +17,27 @@ describe('Store', () => {
it('should store environments', () => {
store.storeEnvironments(serverData);
+
expect(store.state.environments.length).toEqual(serverData.length);
expect(store.state.environments[0]).toEqual(environmentsList[0]);
});
it('should store available count', () => {
store.storeAvailableCount(2);
+
expect(store.state.availableCounter).toEqual(2);
});
it('should store stopped count', () => {
store.storeStoppedCount(2);
+
expect(store.state.stoppedCounter).toEqual(2);
});
describe('store environments', () => {
it('should store environments', () => {
store.storeEnvironments(serverData);
+
expect(store.state.environments.length).toEqual(serverData.length);
});
@@ -45,6 +49,7 @@ describe('Store', () => {
};
store.storeEnvironments([environment]);
+
expect(store.state.environments[0].isFolder).toEqual(true);
expect(store.state.environments[0].folderName).toEqual('bar');
});
@@ -61,17 +66,20 @@ describe('Store', () => {
};
store.storeEnvironments([environment]);
+
expect(store.state.environments[0].last_deployment).toEqual({});
expect(store.state.environments[0].isStoppable).toEqual(true);
});
it('should store latest.name when the environment is not a folder', () => {
store.storeEnvironments(serverData);
+
expect(store.state.environments[0].name).toEqual(serverData[0].latest.name);
});
it('should store root level name when environment is a folder', () => {
store.storeEnvironments(serverData);
+
expect(store.state.environments[1].folderName).toEqual(serverData[1].name);
});
});
@@ -81,9 +89,11 @@ describe('Store', () => {
store.storeEnvironments(serverData);
store.toggleFolder(store.state.environments[1]);
+
expect(store.state.environments[1].isOpen).toEqual(true);
store.toggleFolder(store.state.environments[1]);
+
expect(store.state.environments[1].isOpen).toEqual(false);
});
@@ -91,9 +101,11 @@ describe('Store', () => {
store.storeEnvironments(serverData);
store.toggleFolder(store.state.environments[1]);
+
expect(store.state.environments[1].isOpen).toEqual(true);
store.storeEnvironments(serverData);
+
expect(store.state.environments[1].isOpen).toEqual(true);
});
});
@@ -116,6 +128,7 @@ describe('Store', () => {
expect(store.state.environments[1].children.length).toEqual(serverData.length);
// poll
store.storeEnvironments(serverData);
+
expect(store.state.environments[1].children.length).toEqual(serverData.length);
});
});
@@ -141,6 +154,7 @@ describe('Store', () => {
};
store.setPagination(pagination);
+
expect(store.state.paginationInformation).toEqual(expectedResult);
});
});
@@ -150,6 +164,7 @@ describe('Store', () => {
store.storeEnvironments(serverData);
store.toggleFolder(store.state.environments[1]);
+
expect(store.getOpenFolders()[0]).toEqual(store.state.environments[1]);
});
});
diff --git a/spec/javascripts/environments/folder/environments_folder_view_spec.js b/spec/javascripts/environments/folder/environments_folder_view_spec.js
index 51d4213c38f..7f0a9475d5f 100644
--- a/spec/javascripts/environments/folder/environments_folder_view_spec.js
+++ b/spec/javascripts/environments/folder/environments_folder_view_spec.js
@@ -30,39 +30,43 @@ describe('Environments Folder View', () => {
component.$destroy();
});
- describe('successfull request', () => {
+ describe('successful request', () => {
beforeEach(() => {
- mock.onGet(mockData.endpoint).reply(200, {
- environments: environmentsList,
- stopped_count: 1,
- available_count: 0,
- }, {
- 'X-nExt-pAge': '2',
- 'x-page': '1',
- 'X-Per-Page': '2',
- 'X-Prev-Page': '',
- 'X-TOTAL': '20',
- 'X-Total-Pages': '10',
- });
+ mock.onGet(mockData.endpoint).reply(
+ 200,
+ {
+ environments: environmentsList,
+ stopped_count: 1,
+ available_count: 0,
+ },
+ {
+ 'X-nExt-pAge': '2',
+ 'x-page': '1',
+ 'X-Per-Page': '2',
+ 'X-Prev-Page': '',
+ 'X-TOTAL': '20',
+ 'X-Total-Pages': '10',
+ },
+ );
component = mountComponent(Component, mockData);
});
- it('should render a table with environments', (done) => {
+ it('should render a table with environments', done => {
setTimeout(() => {
expect(component.$el.querySelectorAll('table')).not.toBeNull();
- expect(
- component.$el.querySelector('.environment-name').textContent.trim(),
- ).toEqual(environmentsList[0].name);
+ expect(component.$el.querySelector('.environment-name').textContent.trim()).toEqual(
+ environmentsList[0].name,
+ );
done();
}, 0);
});
- it('should render available tab with count', (done) => {
+ it('should render available tab with count', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('.js-environments-tab-available').textContent,
- ).toContain('Available');
+ expect(component.$el.querySelector('.js-environments-tab-available').textContent).toContain(
+ 'Available',
+ );
expect(
component.$el.querySelector('.js-environments-tab-available .badge').textContent,
@@ -71,11 +75,11 @@ describe('Environments Folder View', () => {
}, 0);
});
- it('should render stopped tab with count', (done) => {
+ it('should render stopped tab with count', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('.js-environments-tab-stopped').textContent,
- ).toContain('Stopped');
+ expect(component.$el.querySelector('.js-environments-tab-stopped').textContent).toContain(
+ 'Stopped',
+ );
expect(
component.$el.querySelector('.js-environments-tab-stopped .badge').textContent,
@@ -84,36 +88,37 @@ describe('Environments Folder View', () => {
}, 0);
});
- it('should render parent folder name', (done) => {
+ it('should render parent folder name', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('.js-folder-name').textContent.trim(),
- ).toContain('Environments / review');
+ expect(component.$el.querySelector('.js-folder-name').textContent.trim()).toContain(
+ 'Environments / review',
+ );
done();
}, 0);
});
describe('pagination', () => {
- it('should render pagination', (done) => {
+ it('should render pagination', done => {
setTimeout(() => {
- expect(
- component.$el.querySelectorAll('.gl-pagination'),
- ).not.toBeNull();
+ expect(component.$el.querySelectorAll('.gl-pagination')).not.toBeNull();
done();
}, 0);
});
- it('should make an API request when changing page', (done) => {
+ it('should make an API request when changing page', done => {
spyOn(component, 'updateContent');
setTimeout(() => {
component.$el.querySelector('.gl-pagination .js-last-button a').click();
- expect(component.updateContent).toHaveBeenCalledWith({ scope: component.scope, page: '10' });
+ expect(component.updateContent).toHaveBeenCalledWith({
+ scope: component.scope,
+ page: '10',
+ });
done();
}, 0);
});
- it('should make an API request when using tabs', (done) => {
+ it('should make an API request when using tabs', done => {
setTimeout(() => {
spyOn(component, 'updateContent');
component.$el.querySelector('.js-environments-tab-stopped').click();
@@ -134,20 +139,18 @@ describe('Environments Folder View', () => {
component = mountComponent(Component, mockData);
});
- it('should not render a table', (done) => {
+ it('should not render a table', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('table'),
- ).toBe(null);
+ expect(component.$el.querySelector('table')).toBe(null);
done();
}, 0);
});
- it('should render available tab with count 0', (done) => {
+ it('should render available tab with count 0', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('.js-environments-tab-available').textContent,
- ).toContain('Available');
+ expect(component.$el.querySelector('.js-environments-tab-available').textContent).toContain(
+ 'Available',
+ );
expect(
component.$el.querySelector('.js-environments-tab-available .badge').textContent,
@@ -156,11 +159,11 @@ describe('Environments Folder View', () => {
}, 0);
});
- it('should render stopped tab with count 0', (done) => {
+ it('should render stopped tab with count 0', done => {
setTimeout(() => {
- expect(
- component.$el.querySelector('.js-environments-tab-stopped').textContent,
- ).toContain('Stopped');
+ expect(component.$el.querySelector('.js-environments-tab-stopped').textContent).toContain(
+ 'Stopped',
+ );
expect(
component.$el.querySelector('.js-environments-tab-stopped .badge').textContent,
@@ -181,8 +184,9 @@ describe('Environments Folder View', () => {
});
describe('updateContent', () => {
- it('should set given parameters', (done) => {
- component.updateContent({ scope: 'stopped', page: '4' })
+ it('should set given parameters', done => {
+ component
+ .updateContent({ scope: 'stopped', page: '4' })
.then(() => {
expect(component.page).toEqual('4');
expect(component.scope).toEqual('stopped');
diff --git a/spec/javascripts/feature_highlight/feature_highlight_helper_spec.js b/spec/javascripts/feature_highlight/feature_highlight_helper_spec.js
index 2ab6a0077b5..e5795d4cbb1 100644
--- a/spec/javascripts/feature_highlight/feature_highlight_helper_spec.js
+++ b/spec/javascripts/feature_highlight/feature_highlight_helper_spec.js
@@ -1,11 +1,7 @@
import $ from 'jquery';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
-import {
- getSelector,
- dismiss,
- inserted,
-} from '~/feature_highlight/feature_highlight_helper';
+import { getSelector, dismiss, inserted } from '~/feature_highlight/feature_highlight_helper';
import { togglePopover } from '~/shared/popover';
import getSetTimeoutPromise from 'spec/helpers/set_timeout_promise_helper';
@@ -14,7 +10,10 @@ describe('feature highlight helper', () => {
describe('getSelector', () => {
it('returns js-feature-highlight selector', () => {
const highlightId = 'highlightId';
- expect(getSelector(highlightId)).toEqual(`.js-feature-highlight[data-highlight=${highlightId}]`);
+
+ expect(getSelector(highlightId)).toEqual(
+ `.js-feature-highlight[data-highlight=${highlightId}]`,
+ );
});
});
@@ -37,7 +36,7 @@ describe('feature highlight helper', () => {
mock.restore();
});
- it('calls persistent dismissal endpoint', (done) => {
+ it('calls persistent dismissal endpoint', done => {
const spy = jasmine.createSpy('dismiss-endpoint-hit');
mock.onPost('/-/callouts/dismiss').reply(spy);
@@ -59,7 +58,7 @@ describe('feature highlight helper', () => {
});
describe('inserted', () => {
- it('registers click event callback', (done) => {
+ it('registers click event callback', done => {
const context = {
getAttribute: () => 'popoverId',
dataset: {
@@ -67,7 +66,7 @@ describe('feature highlight helper', () => {
},
};
- spyOn($.fn, 'on').and.callFake((event) => {
+ spyOn($.fn, 'on').and.callFake(event => {
expect(event).toEqual('click');
done();
});
diff --git a/spec/javascripts/feature_highlight/feature_highlight_spec.js b/spec/javascripts/feature_highlight/feature_highlight_spec.js
index ec46d4f905a..0a9fba789c3 100644
--- a/spec/javascripts/feature_highlight/feature_highlight_spec.js
+++ b/spec/javascripts/feature_highlight/feature_highlight_spec.js
@@ -50,7 +50,7 @@ describe('feature highlight', () => {
expect(toggleSpy).toHaveBeenCalledWith(jasmine.any(Object), true);
});
- it('setup debounced mouseleave', (done) => {
+ it('setup debounced mouseleave', done => {
const toggleSpy = spyOn(popover.togglePopover, 'call');
$(selector).trigger('mouseleave');
@@ -63,7 +63,10 @@ describe('feature highlight', () => {
it('setup show.bs.popover', () => {
$(selector).trigger('show.bs.popover');
- expect(window.addEventListener).toHaveBeenCalledWith('scroll', jasmine.any(Function), { once: true });
+
+ expect(window.addEventListener).toHaveBeenCalledWith('scroll', jasmine.any(Function), {
+ once: true,
+ });
});
it('removes disabled attribute', () => {
@@ -73,6 +76,7 @@ describe('feature highlight', () => {
it('displays popover', () => {
expect(document.querySelector(selector).getAttribute('aria-describedby')).toBeFalsy();
$(selector).trigger('mouseenter');
+
expect(document.querySelector(selector).getAttribute('aria-describedby')).toBeTruthy();
});
diff --git a/spec/javascripts/filtered_search/components/recent_searches_dropdown_content_spec.js b/spec/javascripts/filtered_search/components/recent_searches_dropdown_content_spec.js
index d926663fac0..d1742dcedfa 100644
--- a/spec/javascripts/filtered_search/components/recent_searches_dropdown_content_spec.js
+++ b/spec/javascripts/filtered_search/components/recent_searches_dropdown_content_spec.js
@@ -1,9 +1,9 @@
import Vue from 'vue';
import eventHub from '~/filtered_search/event_hub';
import RecentSearchesDropdownContent from '~/filtered_search/components/recent_searches_dropdown_content.vue';
-import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
+import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
-const createComponent = (propsData) => {
+const createComponent = propsData => {
const Component = Vue.extend(RecentSearchesDropdownContent);
return new Component({
@@ -18,14 +18,11 @@ const trimMarkupWhitespace = text => text.replace(/(\n|\s)+/gm, ' ').trim();
describe('RecentSearchesDropdownContent', () => {
const propsDataWithoutItems = {
items: [],
- allowedKeys: FilteredSearchTokenKeys.getKeys(),
+ allowedKeys: IssuableFilteredSearchTokenKeys.getKeys(),
};
const propsDataWithItems = {
- items: [
- 'foo',
- 'author:@root label:~foo bar',
- ],
- allowedKeys: FilteredSearchTokenKeys.getKeys(),
+ items: ['foo', 'author:@root label:~foo bar'],
+ allowedKeys: IssuableFilteredSearchTokenKeys.getKeys(),
};
let vm;
@@ -47,6 +44,7 @@ describe('RecentSearchesDropdownContent', () => {
expect(el.querySelector('.dropdown-info-note')).toBeDefined();
const items = el.querySelectorAll('.filtered-search-history-dropdown-item');
+
expect(items.length).toEqual(propsDataWithoutItems.items.length);
});
});
@@ -65,17 +63,27 @@ describe('RecentSearchesDropdownContent', () => {
it('should render recent search items', () => {
const items = el.querySelectorAll('.filtered-search-history-dropdown-item');
+
expect(items.length).toEqual(propsDataWithItems.items.length);
- expect(trimMarkupWhitespace(items[0].querySelector('.filtered-search-history-dropdown-search-token').textContent)).toEqual('foo');
+ expect(
+ trimMarkupWhitespace(
+ items[0].querySelector('.filtered-search-history-dropdown-search-token').textContent,
+ ),
+ ).toEqual('foo');
const item1Tokens = items[1].querySelectorAll('.filtered-search-history-dropdown-token');
+
expect(item1Tokens.length).toEqual(2);
expect(item1Tokens[0].querySelector('.name').textContent).toEqual('author:');
expect(item1Tokens[0].querySelector('.value').textContent).toEqual('@root');
expect(item1Tokens[1].querySelector('.name').textContent).toEqual('label:');
expect(item1Tokens[1].querySelector('.value').textContent).toEqual('~foo');
- expect(trimMarkupWhitespace(items[1].querySelector('.filtered-search-history-dropdown-search-token').textContent)).toEqual('bar');
+ expect(
+ trimMarkupWhitespace(
+ items[1].querySelector('.filtered-search-history-dropdown-search-token').textContent,
+ ),
+ ).toEqual('bar');
});
});
@@ -132,12 +140,14 @@ describe('RecentSearchesDropdownContent', () => {
it('with items', () => {
vm = createComponent(propsDataWithItems);
const { hasItems } = vm;
+
expect(hasItems).toEqual(true);
});
it('with no items', () => {
vm = createComponent(propsDataWithoutItems);
const { hasItems } = vm;
+
expect(hasItems).toEqual(false);
});
});
@@ -161,6 +171,7 @@ describe('RecentSearchesDropdownContent', () => {
it('emits event', () => {
expect(onRecentSearchesItemSelectedSpy).not.toHaveBeenCalled();
vm.onItemActivated('something');
+
expect(onRecentSearchesItemSelectedSpy).toHaveBeenCalledWith('something');
});
});
@@ -182,6 +193,7 @@ describe('RecentSearchesDropdownContent', () => {
it('emits event', () => {
expect(onRequestClearRecentSearchesSpy).not.toHaveBeenCalled();
vm.onRequestClearRecentSearches({ stopPropagation: () => {} });
+
expect(onRequestClearRecentSearchesSpy).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/filtered_search/dropdown_user_spec.js b/spec/javascripts/filtered_search/dropdown_user_spec.js
index c37a964975d..e8fcc8592eb 100644
--- a/spec/javascripts/filtered_search/dropdown_user_spec.js
+++ b/spec/javascripts/filtered_search/dropdown_user_spec.js
@@ -1,7 +1,7 @@
import DropdownUtils from '~/filtered_search/dropdown_utils';
import DropdownUser from '~/filtered_search/dropdown_user';
import FilteredSearchTokenizer from '~/filtered_search/filtered_search_tokenizer';
-import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
+import IssuableFilteredTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
describe('Dropdown User', () => {
describe('getSearchInput', () => {
@@ -14,7 +14,7 @@ describe('Dropdown User', () => {
spyOn(DropdownUtils, 'getSearchInput').and.callFake(() => {});
dropdownUser = new DropdownUser({
- tokenKeys: FilteredSearchTokenKeys,
+ tokenKeys: IssuableFilteredTokenKeys,
});
});
@@ -28,14 +28,14 @@ describe('Dropdown User', () => {
it('should not return the single quote found in value', () => {
spyOn(FilteredSearchTokenizer, 'processTokens').and.returnValue({
- lastToken: '\'larry boy',
+ lastToken: "'larry boy",
});
expect(dropdownUser.getSearchInput()).toBe('larry boy');
});
});
- describe('config AjaxFilter\'s endpoint', () => {
+ describe("config AjaxFilter's endpoint", () => {
beforeEach(() => {
spyOn(DropdownUser.prototype, 'bindEvents').and.callFake(() => {});
spyOn(DropdownUser.prototype, 'getProjectId').and.callFake(() => {});
@@ -88,10 +88,12 @@ describe('Dropdown User', () => {
});
});
- const findCurrentUserElement = () => authorFilterDropdownElement.querySelector('.js-current-user');
+ const findCurrentUserElement = () =>
+ authorFilterDropdownElement.querySelector('.js-current-user');
it('hides the current user from dropdown', () => {
const currentUserElement = findCurrentUserElement();
+
expect(currentUserElement).not.toBe(null);
dropdown.hideCurrentUser();
@@ -102,6 +104,7 @@ describe('Dropdown User', () => {
it('does nothing if no user is logged in', () => {
const currentUserElement = findCurrentUserElement();
currentUserElement.parentNode.removeChild(currentUserElement);
+
expect(findCurrentUserElement()).toBe(null);
dropdown.hideCurrentUser();
diff --git a/spec/javascripts/filtered_search/dropdown_utils_spec.js b/spec/javascripts/filtered_search/dropdown_utils_spec.js
index 3d6dec19eca..6605b0a30d7 100644
--- a/spec/javascripts/filtered_search/dropdown_utils_spec.js
+++ b/spec/javascripts/filtered_search/dropdown_utils_spec.js
@@ -1,6 +1,6 @@
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchDropdownManager from '~/filtered_search/filtered_search_dropdown_manager';
-import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
+import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
import FilteredSearchSpecHelper from '../helpers/filtered_search_spec_helper';
describe('Dropdown Utils', () => {
@@ -10,25 +10,30 @@ describe('Dropdown Utils', () => {
describe('getEscapedText', () => {
it('should return same word when it has no space', () => {
const escaped = DropdownUtils.getEscapedText('textWithoutSpace');
+
expect(escaped).toBe('textWithoutSpace');
});
it('should escape with double quotes', () => {
let escaped = DropdownUtils.getEscapedText('text with space');
+
expect(escaped).toBe('"text with space"');
- escaped = DropdownUtils.getEscapedText('won\'t fix');
+ escaped = DropdownUtils.getEscapedText("won't fix");
+
expect(escaped).toBe('"won\'t fix"');
});
it('should escape with single quotes', () => {
const escaped = DropdownUtils.getEscapedText('won"t fix');
- expect(escaped).toBe('\'won"t fix\'');
+
+ expect(escaped).toBe("'won\"t fix'");
});
it('should escape with single quotes by default', () => {
const escaped = DropdownUtils.getEscapedText('won"t\' fix');
- expect(escaped).toBe('\'won"t\' fix\'');
+
+ expect(escaped).toBe("'won\"t' fix'");
});
});
@@ -50,6 +55,7 @@ describe('Dropdown Utils', () => {
input.value = 'roo';
const updatedItem = DropdownUtils.filterWithSymbol('@', input, item);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -57,6 +63,7 @@ describe('Dropdown Utils', () => {
input.value = '@roo';
const updatedItem = DropdownUtils.filterWithSymbol('@', input, item);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -69,6 +76,7 @@ describe('Dropdown Utils', () => {
input.value = '"';
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -76,6 +84,7 @@ describe('Dropdown Utils', () => {
input.value = '~"';
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -83,6 +92,7 @@ describe('Dropdown Utils', () => {
input.value = '"community con';
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -90,34 +100,39 @@ describe('Dropdown Utils', () => {
input.value = '~"community con';
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
it('should filter with single quote', () => {
- input.value = '\'';
+ input.value = "'";
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
it('should filter with single quote and symbol', () => {
- input.value = '~\'';
+ input.value = "~'";
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
it('should filter with single quote and multiple words', () => {
- input.value = '\'community con';
+ input.value = "'community con";
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
it('should filter with single quote, symbol and multiple words', () => {
- input.value = '~\'community con';
+ input.value = "~'community con";
const updatedItem = DropdownUtils.filterWithSymbol('~', input, multipleWordItem);
+
expect(updatedItem.droplab_hidden).toBe(false);
});
});
@@ -137,7 +152,7 @@ describe('Dropdown Utils', () => {
`);
input = document.getElementById('test');
- allowedKeys = FilteredSearchTokenKeys.getKeys();
+ allowedKeys = IssuableFilteredSearchTokenKeys.getKeys();
});
function config() {
@@ -152,17 +167,20 @@ describe('Dropdown Utils', () => {
let updatedItem = DropdownUtils.filterHint(config(), {
hint: 'label',
});
+
expect(updatedItem.droplab_hidden).toBe(false);
input.value = 'o';
updatedItem = DropdownUtils.filterHint(config(), {
hint: 'label',
});
+
expect(updatedItem.droplab_hidden).toBe(true);
});
it('should return droplab_hidden false when item has no hint', () => {
const updatedItem = DropdownUtils.filterHint(config(), {}, '');
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -172,6 +190,7 @@ describe('Dropdown Utils', () => {
hint: 'label',
type: 'array',
});
+
expect(updatedItem.droplab_hidden).toBe(false);
});
@@ -180,12 +199,14 @@ describe('Dropdown Utils', () => {
let updatedItem = DropdownUtils.filterHint(config(), {
hint: 'milestone',
});
+
expect(updatedItem.droplab_hidden).toBe(true);
updatedItem = DropdownUtils.filterHint(config(), {
hint: 'milestone',
type: 'string',
});
+
expect(updatedItem.droplab_hidden).toBe(true);
});
});
@@ -205,6 +226,7 @@ describe('Dropdown Utils', () => {
};
const updated = DropdownUtils.mergeDuplicateLabels(dataMap, newLabel);
+
expect(updated[newLabel.title]).toEqual(newLabel);
});
@@ -215,6 +237,7 @@ describe('Dropdown Utils', () => {
};
const updated = DropdownUtils.mergeDuplicateLabels(dataMap, duplicate);
+
expect(updated.label.multipleColors).toEqual([dataMap.label.color, duplicate.color]);
});
});
@@ -222,39 +245,64 @@ describe('Dropdown Utils', () => {
describe('duplicateLabelColor', () => {
it('should linear-gradient 2 colors', () => {
const gradient = DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000']);
- expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 50%, #000000 50%, #000000 100%)');
+
+ expect(gradient).toEqual(
+ 'linear-gradient(#FFFFFF 0%, #FFFFFF 50%, #000000 50%, #000000 100%)',
+ );
});
it('should linear-gradient 3 colors', () => {
const gradient = DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333']);
- expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 33%, #000000 33%, #000000 66%, #333333 66%, #333333 100%)');
+
+ expect(gradient).toEqual(
+ 'linear-gradient(#FFFFFF 0%, #FFFFFF 33%, #000000 33%, #000000 66%, #333333 66%, #333333 100%)',
+ );
});
it('should linear-gradient 4 colors', () => {
- const gradient = DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333', '#DDDDDD']);
- expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 25%, #000000 25%, #000000 50%, #333333 50%, #333333 75%, #DDDDDD 75%, #DDDDDD 100%)');
+ const gradient = DropdownUtils.duplicateLabelColor([
+ '#FFFFFF',
+ '#000000',
+ '#333333',
+ '#DDDDDD',
+ ]);
+
+ expect(gradient).toEqual(
+ 'linear-gradient(#FFFFFF 0%, #FFFFFF 25%, #000000 25%, #000000 50%, #333333 50%, #333333 75%, #DDDDDD 75%, #DDDDDD 100%)',
+ );
});
it('should not linear-gradient more than 4 colors', () => {
- const gradient = DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333', '#DDDDDD', '#EEEEEE']);
- expect(gradient.indexOf('#EEEEEE') === -1).toEqual(true);
+ const gradient = DropdownUtils.duplicateLabelColor([
+ '#FFFFFF',
+ '#000000',
+ '#333333',
+ '#DDDDDD',
+ '#EEEEEE',
+ ]);
+
+ expect(gradient.indexOf('#EEEEEE')).toBe(-1);
});
});
describe('duplicateLabelPreprocessing', () => {
it('should set preprocessed to true', () => {
const results = DropdownUtils.duplicateLabelPreprocessing([]);
+
expect(results.preprocessed).toEqual(true);
});
it('should not mutate existing data if there are no duplicates', () => {
- const data = [{
- title: 'label1',
- color: '#FFFFFF',
- }, {
- title: 'label2',
- color: '#000000',
- }];
+ const data = [
+ {
+ title: 'label1',
+ color: '#FFFFFF',
+ },
+ {
+ title: 'label2',
+ color: '#000000',
+ },
+ ];
const results = DropdownUtils.duplicateLabelPreprocessing(data);
expect(results.length).toEqual(2);
@@ -263,13 +311,16 @@ describe('Dropdown Utils', () => {
});
describe('duplicate labels', () => {
- const data = [{
- title: 'label',
- color: '#FFFFFF',
- }, {
- title: 'label',
- color: '#000000',
- }];
+ const data = [
+ {
+ title: 'label',
+ color: '#FFFFFF',
+ },
+ {
+ title: 'label',
+ color: '#000000',
+ },
+ ];
const results = DropdownUtils.duplicateLabelPreprocessing(data);
it('should merge duplicate labels', () => {
@@ -288,25 +339,28 @@ describe('Dropdown Utils', () => {
describe('setDataValueIfSelected', () => {
beforeEach(() => {
- spyOn(FilteredSearchDropdownManager, 'addWordToInput')
- .and.callFake(() => {});
+ spyOn(FilteredSearchDropdownManager, 'addWordToInput').and.callFake(() => {});
});
it('calls addWordToInput when dataValue exists', () => {
const selected = {
getAttribute: () => 'value',
+ hasAttribute: () => false,
};
DropdownUtils.setDataValueIfSelected(null, selected);
+
expect(FilteredSearchDropdownManager.addWordToInput.calls.count()).toEqual(1);
});
it('returns true when dataValue exists', () => {
const selected = {
getAttribute: () => 'value',
+ hasAttribute: () => false,
};
const result = DropdownUtils.setDataValueIfSelected(null, selected);
+
expect(result).toBe(true);
});
@@ -316,6 +370,7 @@ describe('Dropdown Utils', () => {
};
const result = DropdownUtils.setDataValueIfSelected(null, selected);
+
expect(result).toBe(false);
});
});
diff --git a/spec/javascripts/filtered_search/filtered_search_manager_spec.js b/spec/javascripts/filtered_search/filtered_search_manager_spec.js
index 8fcee36beb8..e076120f5cc 100644
--- a/spec/javascripts/filtered_search/filtered_search_manager_spec.js
+++ b/spec/javascripts/filtered_search/filtered_search_manager_spec.js
@@ -1,7 +1,7 @@
import RecentSearchesService from '~/filtered_search/services/recent_searches_service';
import RecentSearchesServiceError from '~/filtered_search/services/recent_searches_service_error';
import RecentSearchesRoot from '~/filtered_search/recent_searches_root';
-import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
+import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
import '~/lib/utils/common_utils';
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchVisualTokens from '~/filtered_search/filtered_search_visual_tokens';
@@ -9,7 +9,7 @@ import FilteredSearchDropdownManager from '~/filtered_search/filtered_search_dro
import FilteredSearchManager from '~/filtered_search/filtered_search_manager';
import FilteredSearchSpecHelper from '../helpers/filtered_search_spec_helper';
-describe('Filtered Search Manager', function () {
+describe('Filtered Search Manager', function() {
let input;
let manager;
let tokensContainer;
@@ -86,7 +86,7 @@ describe('Filtered Search Manager', function () {
expect(RecentSearchesService.isAvailable).toHaveBeenCalled();
expect(RecentSearchesStoreSpy).toHaveBeenCalledWith({
isLocalStorageAvailable,
- allowedKeys: FilteredSearchTokenKeys.getKeys(),
+ allowedKeys: IssuableFilteredSearchTokenKeys.getKeys(),
});
});
});
@@ -97,7 +97,9 @@ describe('Filtered Search Manager', function () {
});
it('should not instantiate Flash if an RecentSearchesServiceError is caught', () => {
- spyOn(RecentSearchesService.prototype, 'fetch').and.callFake(() => Promise.reject(new RecentSearchesServiceError()));
+ spyOn(RecentSearchesService.prototype, 'fetch').and.callFake(() =>
+ Promise.reject(new RecentSearchesServiceError()),
+ );
spyOn(window, 'Flash');
manager.setup();
@@ -134,6 +136,7 @@ describe('Filtered Search Manager', function () {
};
manager.searchState(e);
+
expect(FilteredSearchManager.prototype.search).not.toHaveBeenCalled();
});
@@ -149,6 +152,7 @@ describe('Filtered Search Manager', function () {
};
manager.searchState(e);
+
expect(FilteredSearchManager.prototype.search).toHaveBeenCalledWith('opened');
});
});
@@ -160,10 +164,10 @@ describe('Filtered Search Manager', function () {
initializeManager();
});
- it('should search with a single word', (done) => {
+ it('should search with a single word', done => {
input.value = 'searchTerm';
- spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake((url) => {
+ spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake(url => {
expect(url).toEqual(`${defaultParams}&search=searchTerm`);
done();
});
@@ -171,10 +175,10 @@ describe('Filtered Search Manager', function () {
manager.search();
});
- it('should search with multiple words', (done) => {
+ it('should search with multiple words', done => {
input.value = 'awesome search terms';
- spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake((url) => {
+ spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake(url => {
expect(url).toEqual(`${defaultParams}&search=awesome+search+terms`);
done();
});
@@ -182,24 +186,26 @@ describe('Filtered Search Manager', function () {
manager.search();
});
- it('should search with special characters', (done) => {
+ it('should search with special characters', done => {
input.value = '~!@#$%^&*()_+{}:<>,.?/';
- spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake((url) => {
- expect(url).toEqual(`${defaultParams}&search=~!%40%23%24%25%5E%26*()_%2B%7B%7D%3A%3C%3E%2C.%3F%2F`);
+ spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake(url => {
+ expect(url).toEqual(
+ `${defaultParams}&search=~!%40%23%24%25%5E%26*()_%2B%7B%7D%3A%3C%3E%2C.%3F%2F`,
+ );
done();
});
manager.search();
});
- it('removes duplicated tokens', (done) => {
+ it('removes duplicated tokens', done => {
tokensContainer.innerHTML = FilteredSearchSpecHelper.createTokensContainerHTML(`
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('label', '~bug')}
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('label', '~bug')}
`);
- spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake((url) => {
+ spyOnDependency(FilteredSearchManager, 'visitUrl').and.callFake(url => {
expect(url).toEqual(`${defaultParams}&label_name[]=bug`);
done();
});
@@ -304,6 +310,7 @@ describe('Filtered Search Manager', function () {
);
tokensContainer.querySelector('.js-visual-token .remove-token').click();
+
expect(tokensContainer.querySelector('.js-visual-token')).toEqual(null);
});
@@ -437,12 +444,18 @@ describe('Filtered Search Manager', function () {
it('toggles on focus', () => {
input.focus();
- expect(document.querySelector('.filtered-search-box').classList.contains('focus')).toEqual(true);
+
+ expect(document.querySelector('.filtered-search-box').classList.contains('focus')).toEqual(
+ true,
+ );
});
it('toggles on blur', () => {
input.blur();
- expect(document.querySelector('.filtered-search-box').classList.contains('focus')).toEqual(false);
+
+ expect(document.querySelector('.filtered-search-box').classList.contains('focus')).toEqual(
+ false,
+ );
});
});
@@ -454,9 +467,12 @@ describe('Filtered Search Manager', function () {
});
it('correctly modifies params when custom modifier is passed', () => {
- const modifedParams = manager.getAllParams.call({
- modifyUrlParams: paramsArr => paramsArr.reverse(),
- }, [].concat(this.paramsArr));
+ const modifedParams = manager.getAllParams.call(
+ {
+ modifyUrlParams: paramsArr => paramsArr.reverse(),
+ },
+ [].concat(this.paramsArr),
+ );
expect(modifedParams[0]).toBe(this.paramsArr[1]);
});
diff --git a/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js b/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js
index 68158cf52e4..d1fea18dea8 100644
--- a/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js
+++ b/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js
@@ -1,26 +1,39 @@
import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
describe('Filtered Search Token Keys', () => {
- describe('get', () => {
- let tokenKeys;
-
- beforeEach(() => {
- tokenKeys = FilteredSearchTokenKeys.get();
- });
+ const tokenKeys = [
+ {
+ key: 'author',
+ type: 'string',
+ param: 'username',
+ symbol: '@',
+ icon: 'pencil',
+ tag: '@author',
+ },
+ ];
+
+ const conditions = [
+ {
+ url: 'assignee_id=0',
+ tokenKey: 'assignee',
+ value: 'none',
+ },
+ ];
+ describe('get', () => {
it('should return tokenKeys', () => {
- expect(tokenKeys !== null).toBe(true);
+ expect(new FilteredSearchTokenKeys().get()).not.toBeNull();
});
it('should return tokenKeys as an array', () => {
- expect(tokenKeys instanceof Array).toBe(true);
+ expect(new FilteredSearchTokenKeys().get() instanceof Array).toBe(true);
});
});
describe('getKeys', () => {
it('should return keys', () => {
- const getKeys = FilteredSearchTokenKeys.getKeys();
- const keys = FilteredSearchTokenKeys.get().map(i => i.key);
+ const getKeys = new FilteredSearchTokenKeys(tokenKeys).getKeys();
+ const keys = new FilteredSearchTokenKeys(tokenKeys).get().map(i => i.key);
keys.forEach((key, i) => {
expect(key).toEqual(getKeys[i]);
@@ -29,89 +42,99 @@ describe('Filtered Search Token Keys', () => {
});
describe('getConditions', () => {
- let conditions;
-
- beforeEach(() => {
- conditions = FilteredSearchTokenKeys.getConditions();
- });
-
it('should return conditions', () => {
- expect(conditions !== null).toBe(true);
+ expect(new FilteredSearchTokenKeys().getConditions()).not.toBeNull();
});
it('should return conditions as an array', () => {
- expect(conditions instanceof Array).toBe(true);
+ expect(new FilteredSearchTokenKeys().getConditions() instanceof Array).toBe(true);
});
});
describe('searchByKey', () => {
it('should return null when key not found', () => {
- const tokenKey = FilteredSearchTokenKeys.searchByKey('notakey');
- expect(tokenKey === null).toBe(true);
+ const tokenKey = new FilteredSearchTokenKeys(tokenKeys).searchByKey('notakey');
+
+ expect(tokenKey).toBeNull();
});
it('should return tokenKey when found by key', () => {
- const tokenKeys = FilteredSearchTokenKeys.get();
- const result = FilteredSearchTokenKeys.searchByKey(tokenKeys[0].key);
+ const result = new FilteredSearchTokenKeys(tokenKeys).searchByKey(tokenKeys[0].key);
+
expect(result).toEqual(tokenKeys[0]);
});
});
describe('searchBySymbol', () => {
it('should return null when symbol not found', () => {
- const tokenKey = FilteredSearchTokenKeys.searchBySymbol('notasymbol');
- expect(tokenKey === null).toBe(true);
+ const tokenKey = new FilteredSearchTokenKeys(tokenKeys).searchBySymbol('notasymbol');
+
+ expect(tokenKey).toBeNull();
});
it('should return tokenKey when found by symbol', () => {
- const tokenKeys = FilteredSearchTokenKeys.get();
- const result = FilteredSearchTokenKeys.searchBySymbol(tokenKeys[0].symbol);
+ const result = new FilteredSearchTokenKeys(tokenKeys).searchBySymbol(tokenKeys[0].symbol);
+
expect(result).toEqual(tokenKeys[0]);
});
});
describe('searchByKeyParam', () => {
it('should return null when key param not found', () => {
- const tokenKey = FilteredSearchTokenKeys.searchByKeyParam('notakeyparam');
- expect(tokenKey === null).toBe(true);
+ const tokenKey = new FilteredSearchTokenKeys(tokenKeys).searchByKeyParam('notakeyparam');
+
+ expect(tokenKey).toBeNull();
});
it('should return tokenKey when found by key param', () => {
- const tokenKeys = FilteredSearchTokenKeys.get();
- const result = FilteredSearchTokenKeys.searchByKeyParam(`${tokenKeys[0].key}_${tokenKeys[0].param}`);
+ const result = new FilteredSearchTokenKeys(tokenKeys).searchByKeyParam(
+ `${tokenKeys[0].key}_${tokenKeys[0].param}`,
+ );
+
expect(result).toEqual(tokenKeys[0]);
});
it('should return alternative tokenKey when found by key param', () => {
- const tokenKeys = FilteredSearchTokenKeys.getAlternatives();
- const result = FilteredSearchTokenKeys.searchByKeyParam(`${tokenKeys[0].key}_${tokenKeys[0].param}`);
+ const result = new FilteredSearchTokenKeys(tokenKeys).searchByKeyParam(
+ `${tokenKeys[0].key}_${tokenKeys[0].param}`,
+ );
+
expect(result).toEqual(tokenKeys[0]);
});
});
describe('searchByConditionUrl', () => {
it('should return null when condition url not found', () => {
- const condition = FilteredSearchTokenKeys.searchByConditionUrl(null);
- expect(condition === null).toBe(true);
+ const condition = new FilteredSearchTokenKeys([], [], conditions).searchByConditionUrl(null);
+
+ expect(condition).toBeNull();
});
it('should return condition when found by url', () => {
- const conditions = FilteredSearchTokenKeys.getConditions();
- const result = FilteredSearchTokenKeys.searchByConditionUrl(conditions[0].url);
+ const result = new FilteredSearchTokenKeys([], [], conditions).searchByConditionUrl(
+ conditions[0].url,
+ );
+
expect(result).toBe(conditions[0]);
});
});
describe('searchByConditionKeyValue', () => {
it('should return null when condition tokenKey and value not found', () => {
- const condition = FilteredSearchTokenKeys.searchByConditionKeyValue(null, null);
- expect(condition === null).toBe(true);
+ const condition = new FilteredSearchTokenKeys([], [], conditions).searchByConditionKeyValue(
+ null,
+ null,
+ );
+
+ expect(condition).toBeNull();
});
it('should return condition when found by tokenKey and value', () => {
- const conditions = FilteredSearchTokenKeys.getConditions();
- const result = FilteredSearchTokenKeys
- .searchByConditionKeyValue(conditions[0].tokenKey, conditions[0].value);
+ const result = new FilteredSearchTokenKeys([], [], conditions).searchByConditionKeyValue(
+ conditions[0].tokenKey,
+ conditions[0].value,
+ );
+
expect(result).toEqual(conditions[0]);
});
});
diff --git a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js
index 465f5f79931..dec03e5ab93 100644
--- a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js
+++ b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js
@@ -1,20 +1,24 @@
-import FilteredSearchTokenKeys from '~/filtered_search/filtered_search_token_keys';
+import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
import FilteredSearchTokenizer from '~/filtered_search/filtered_search_tokenizer';
describe('Filtered Search Tokenizer', () => {
- const allowedKeys = FilteredSearchTokenKeys.getKeys();
+ const allowedKeys = IssuableFilteredSearchTokenKeys.getKeys();
describe('processTokens', () => {
it('returns for input containing only search value', () => {
const results = FilteredSearchTokenizer.processTokens('searchTerm', allowedKeys);
+
expect(results.searchToken).toBe('searchTerm');
expect(results.tokens.length).toBe(0);
expect(results.lastToken).toBe(results.searchToken);
});
it('returns for input containing only tokens', () => {
- const results = FilteredSearchTokenizer
- .processTokens('author:@root label:~"Very Important" milestone:%v1.0 assignee:none', allowedKeys);
+ const results = FilteredSearchTokenizer.processTokens(
+ 'author:@root label:~"Very Important" milestone:%v1.0 assignee:none',
+ allowedKeys,
+ );
+
expect(results.searchToken).toBe('');
expect(results.tokens.length).toBe(4);
expect(results.tokens[3]).toBe(results.lastToken);
@@ -37,8 +41,11 @@ describe('Filtered Search Tokenizer', () => {
});
it('returns for input starting with search value and ending with tokens', () => {
- const results = FilteredSearchTokenizer
- .processTokens('searchTerm anotherSearchTerm milestone:none', allowedKeys);
+ const results = FilteredSearchTokenizer.processTokens(
+ 'searchTerm anotherSearchTerm milestone:none',
+ allowedKeys,
+ );
+
expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
expect(results.tokens.length).toBe(1);
expect(results.tokens[0]).toBe(results.lastToken);
@@ -48,8 +55,10 @@ describe('Filtered Search Tokenizer', () => {
});
it('returns for input starting with tokens and ending with search value', () => {
- const results = FilteredSearchTokenizer
- .processTokens('assignee:@user searchTerm', allowedKeys);
+ const results = FilteredSearchTokenizer.processTokens(
+ 'assignee:@user searchTerm',
+ allowedKeys,
+ );
expect(results.searchToken).toBe('searchTerm');
expect(results.tokens.length).toBe(1);
@@ -60,8 +69,10 @@ describe('Filtered Search Tokenizer', () => {
});
it('returns for input containing search value wrapped between tokens', () => {
- const results = FilteredSearchTokenizer
- .processTokens('author:@root label:~"Won\'t fix" searchTerm anotherSearchTerm milestone:none', allowedKeys);
+ const results = FilteredSearchTokenizer.processTokens(
+ 'author:@root label:~"Won\'t fix" searchTerm anotherSearchTerm milestone:none',
+ allowedKeys,
+ );
expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
expect(results.tokens.length).toBe(3);
@@ -81,8 +92,11 @@ describe('Filtered Search Tokenizer', () => {
});
it('returns for input containing search value in between tokens', () => {
- const results = FilteredSearchTokenizer
- .processTokens('author:@root searchTerm assignee:none anotherSearchTerm label:~Doing', allowedKeys);
+ const results = FilteredSearchTokenizer.processTokens(
+ 'author:@root searchTerm assignee:none anotherSearchTerm label:~Doing',
+ allowedKeys,
+ );
+
expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
expect(results.tokens.length).toBe(3);
expect(results.tokens[2]).toBe(results.lastToken);
@@ -102,6 +116,7 @@ describe('Filtered Search Tokenizer', () => {
it('returns search value for invalid tokens', () => {
const results = FilteredSearchTokenizer.processTokens('fake:token', allowedKeys);
+
expect(results.lastToken).toBe('fake:token');
expect(results.searchToken).toBe('fake:token');
expect(results.tokens.length).toEqual(0);
@@ -109,6 +124,7 @@ describe('Filtered Search Tokenizer', () => {
it('returns search value and token for mix of valid and invalid tokens', () => {
const results = FilteredSearchTokenizer.processTokens('label:real fake:token', allowedKeys);
+
expect(results.tokens.length).toEqual(1);
expect(results.tokens[0].key).toBe('label');
expect(results.tokens[0].value).toBe('real');
@@ -119,12 +135,14 @@ describe('Filtered Search Tokenizer', () => {
it('returns search value for invalid symbols', () => {
const results = FilteredSearchTokenizer.processTokens('std::includes', allowedKeys);
+
expect(results.lastToken).toBe('std::includes');
expect(results.searchToken).toBe('std::includes');
});
it('removes duplicated values', () => {
const results = FilteredSearchTokenizer.processTokens('label:~foo label:~foo', allowedKeys);
+
expect(results.tokens.length).toBe(1);
expect(results.tokens[0].key).toBe('label');
expect(results.tokens[0].value).toBe('foo');
diff --git a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js
index 756a654765b..4f561df7943 100644
--- a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js
+++ b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js
@@ -9,7 +9,7 @@ import FilteredSearchSpecHelper from '../helpers/filtered_search_spec_helper';
describe('Filtered Search Visual Tokens', () => {
const subject = FilteredSearchVisualTokens;
- const findElements = (tokenElement) => {
+ const findElements = tokenElement => {
const tokenNameElement = tokenElement.querySelector('.name');
const tokenValueContainer = tokenElement.querySelector('.value-container');
const tokenValueElement = tokenValueContainer.querySelector('.value');
@@ -34,8 +34,7 @@ describe('Filtered Search Visual Tokens', () => {
describe('getLastVisualTokenBeforeInput', () => {
it('returns when there are no visual tokens', () => {
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
expect(lastVisualToken).toEqual(null);
expect(isLastVisualTokenValid).toEqual(true);
@@ -47,8 +46,7 @@ describe('Filtered Search Visual Tokens', () => {
bugLabelToken.outerHTML,
);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
expect(lastVisualToken).toEqual(document.querySelector('.filtered-search-token'));
expect(isLastVisualTokenValid).toEqual(true);
@@ -59,8 +57,7 @@ describe('Filtered Search Visual Tokens', () => {
FilteredSearchSpecHelper.createNameFilterVisualTokenHTML('Author'),
);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
expect(lastVisualToken).toEqual(document.querySelector('.filtered-search-token'));
expect(isLastVisualTokenValid).toEqual(false);
@@ -73,8 +70,7 @@ describe('Filtered Search Visual Tokens', () => {
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('author', '@root')}
`);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
const items = document.querySelectorAll('.tokens-container .js-visual-token');
expect(lastVisualToken.isEqualNode(items[items.length - 1])).toEqual(true);
@@ -88,8 +84,7 @@ describe('Filtered Search Visual Tokens', () => {
${FilteredSearchSpecHelper.createNameFilterVisualTokenHTML('assignee')}
`);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
const items = document.querySelectorAll('.tokens-container .js-visual-token');
expect(lastVisualToken.isEqualNode(items[items.length - 1])).toEqual(true);
@@ -105,8 +100,7 @@ describe('Filtered Search Visual Tokens', () => {
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('author', '@root')}
`);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
expect(lastVisualToken).toEqual(document.querySelector('.filtered-search-token'));
expect(isLastVisualTokenValid).toEqual(true);
@@ -119,8 +113,7 @@ describe('Filtered Search Visual Tokens', () => {
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('author', '@root')}
`);
- const { lastVisualToken, isLastVisualTokenValid }
- = subject.getLastVisualTokenBeforeInput();
+ const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
expect(lastVisualToken).toEqual(document.querySelector('.filtered-search-token'));
expect(isLastVisualTokenValid).toEqual(false);
@@ -131,6 +124,7 @@ describe('Filtered Search Visual Tokens', () => {
describe('getEndpointWithQueryParams', () => {
it('returns `endpoint` string as is when second param `endpointQueryParams` is undefined, null or empty string', () => {
const endpoint = 'foo/bar/labels.json';
+
expect(subject.getEndpointWithQueryParams(endpoint)).toBe(endpoint);
expect(subject.getEndpointWithQueryParams(endpoint, null)).toBe(endpoint);
expect(subject.getEndpointWithQueryParams(endpoint, '')).toBe(endpoint);
@@ -141,8 +135,13 @@ describe('Filtered Search Visual Tokens', () => {
const singleQueryParams = '{"foo":"true"}';
const multipleQueryParams = '{"foo":"true","bar":"true"}';
- expect(subject.getEndpointWithQueryParams(endpoint, singleQueryParams)).toBe(`${endpoint}?foo=true`);
- expect(subject.getEndpointWithQueryParams(endpoint, multipleQueryParams)).toBe(`${endpoint}?foo=true&bar=true`);
+ expect(subject.getEndpointWithQueryParams(endpoint, singleQueryParams)).toBe(
+ `${endpoint}?foo=true`,
+ );
+
+ expect(subject.getEndpointWithQueryParams(endpoint, multipleQueryParams)).toBe(
+ `${endpoint}?foo=true&bar=true`,
+ );
});
});
@@ -161,6 +160,7 @@ describe('Filtered Search Visual Tokens', () => {
`);
const selected = tokensContainer.querySelector('.js-visual-token .selected');
+
expect(selected.classList.contains('selected')).toEqual(true);
subject.unselectTokens();
@@ -240,13 +240,17 @@ describe('Filtered Search Visual Tokens', () => {
beforeEach(() => {
setFixtures(`
<div class="test-area">
- ${subject.createVisualTokenElementHTML()}
+ ${subject.createVisualTokenElementHTML('custom-token')}
</div>
`);
tokenElement = document.querySelector('.test-area').firstElementChild;
});
+ it('should add class name to token element', () => {
+ expect(document.querySelector('.test-area .custom-token')).toBeDefined();
+ });
+
it('contains name div', () => {
expect(tokenElement.querySelector('.name')).toEqual(jasmine.anything());
});
@@ -269,7 +273,9 @@ describe('Filtered Search Visual Tokens', () => {
describe('remove token', () => {
it('contains remove-token button', () => {
- expect(tokenElement.querySelector('.value-container .remove-token')).toEqual(jasmine.anything());
+ expect(tokenElement.querySelector('.value-container .remove-token')).toEqual(
+ jasmine.anything(),
+ );
});
it('contains fa-close icon', () => {
@@ -280,7 +286,7 @@ describe('Filtered Search Visual Tokens', () => {
describe('addVisualTokenElement', () => {
it('renders search visual tokens', () => {
- subject.addVisualTokenElement('search term', null, true);
+ subject.addVisualTokenElement('search term', null, { isSearchTerm: true });
const token = tokensContainer.querySelector('.js-visual-token');
expect(token.classList.contains('filtered-search-term')).toEqual(true);
@@ -307,7 +313,9 @@ describe('Filtered Search Visual Tokens', () => {
});
it('inserts visual token before input', () => {
- tokensContainer.appendChild(FilteredSearchSpecHelper.createFilterVisualToken('assignee', '@root'));
+ tokensContainer.appendChild(
+ FilteredSearchSpecHelper.createFilterVisualToken('assignee', '@root'),
+ );
subject.addVisualTokenElement('label', 'Frontend');
const tokens = tokensContainer.querySelectorAll('.js-visual-token');
@@ -546,7 +554,7 @@ describe('Filtered Search Visual Tokens', () => {
token = document.querySelector('.js-visual-token');
});
- it('tokenize\'s existing input', () => {
+ it("tokenize's existing input", () => {
input.value = 'some text';
spyOn(subject, 'tokenizeInput').and.callThrough();
@@ -619,7 +627,7 @@ describe('Filtered Search Visual Tokens', () => {
expect(subject.getLastVisualTokenBeforeInput).not.toHaveBeenCalled();
});
- it('tokenize\'s input', () => {
+ it("tokenize's input", () => {
tokensContainer.innerHTML = `
${FilteredSearchSpecHelper.createNameFilterVisualTokenHTML('label')}
${FilteredSearchSpecHelper.createInputHTML()}
@@ -671,13 +679,17 @@ describe('Filtered Search Visual Tokens', () => {
subject.moveInputToTheRight();
const token = tokensContainer.children[1];
+
expect(token.querySelector('.value').innerText).toEqual('~bug');
});
});
describe('renderVisualTokenValue', () => {
const keywordToken = FilteredSearchSpecHelper.createFilterVisualToken('search');
- const milestoneToken = FilteredSearchSpecHelper.createFilterVisualToken('milestone', 'upcoming');
+ const milestoneToken = FilteredSearchSpecHelper.createFilterVisualToken(
+ 'milestone',
+ 'upcoming',
+ );
let updateLabelTokenColorSpy;
let updateUserTokenAppearanceSpy;
@@ -698,8 +710,9 @@ describe('Filtered Search Visual Tokens', () => {
});
it('renders a author token value element', () => {
- const { tokenNameElement, tokenValueContainer, tokenValueElement } =
- findElements(authorToken);
+ const { tokenNameElement, tokenValueContainer, tokenValueElement } = findElements(
+ authorToken,
+ );
const tokenName = tokenNameElement.innerText;
const tokenValue = 'new value';
@@ -708,13 +721,15 @@ describe('Filtered Search Visual Tokens', () => {
expect(tokenValueElement.innerText).toBe(tokenValue);
expect(updateUserTokenAppearanceSpy.calls.count()).toBe(1);
const expectedArgs = [tokenValueContainer, tokenValueElement, tokenValue];
+
expect(updateUserTokenAppearanceSpy.calls.argsFor(0)).toEqual(expectedArgs);
expect(updateLabelTokenColorSpy.calls.count()).toBe(0);
});
it('renders a label token value element', () => {
- const { tokenNameElement, tokenValueContainer, tokenValueElement } =
- findElements(bugLabelToken);
+ const { tokenNameElement, tokenValueContainer, tokenValueElement } = findElements(
+ bugLabelToken,
+ );
const tokenName = tokenNameElement.innerText;
const tokenValue = 'new value';
@@ -723,6 +738,7 @@ describe('Filtered Search Visual Tokens', () => {
expect(tokenValueElement.innerText).toBe(tokenValue);
expect(updateLabelTokenColorSpy.calls.count()).toBe(1);
const expectedArgs = [tokenValueContainer, tokenValue];
+
expect(updateLabelTokenColorSpy.calls.argsFor(0)).toEqual(expectedArgs);
expect(updateUserTokenAppearanceSpy.calls.count()).toBe(0);
});
@@ -738,6 +754,50 @@ describe('Filtered Search Visual Tokens', () => {
expect(updateLabelTokenColorSpy.calls.count()).toBe(0);
expect(updateUserTokenAppearanceSpy.calls.count()).toBe(0);
});
+
+ it('does not update user token appearance for `none` filter', () => {
+ const { tokenNameElement } = findElements(authorToken);
+
+ const tokenName = tokenNameElement.innerText;
+ const tokenValue = 'none';
+
+ subject.renderVisualTokenValue(authorToken, tokenName, tokenValue);
+
+ expect(updateUserTokenAppearanceSpy.calls.count()).toBe(0);
+ });
+
+ it('does not update user token appearance for `any` filter', () => {
+ const { tokenNameElement } = findElements(authorToken);
+
+ const tokenName = tokenNameElement.innerText;
+ const tokenValue = 'any';
+
+ subject.renderVisualTokenValue(authorToken, tokenName, tokenValue);
+
+ expect(updateUserTokenAppearanceSpy.calls.count()).toBe(0);
+ });
+
+ it('does not update label token color for `none` filter', () => {
+ const { tokenNameElement } = findElements(bugLabelToken);
+
+ const tokenName = tokenNameElement.innerText;
+ const tokenValue = 'none';
+
+ subject.renderVisualTokenValue(bugLabelToken, tokenName, tokenValue);
+
+ expect(updateLabelTokenColorSpy.calls.count()).toBe(0);
+ });
+
+ it('does not update label token color for `any` filter', () => {
+ const { tokenNameElement } = findElements(bugLabelToken);
+
+ const tokenName = tokenNameElement.innerText;
+ const tokenValue = 'any';
+
+ subject.renderVisualTokenValue(bugLabelToken, tokenName, tokenValue);
+
+ expect(updateLabelTokenColorSpy.calls.count()).toBe(0);
+ });
});
describe('updateUserTokenAppearance', () => {
@@ -747,96 +807,90 @@ describe('Filtered Search Visual Tokens', () => {
spyOn(UsersCache, 'retrieve').and.callFake(username => usersCacheSpy(username));
});
- it('ignores special value "none"', (done) => {
- usersCacheSpy = (username) => {
- expect(username).toBe('none');
- done.fail('Should not resolve "none"!');
- };
- const { tokenValueContainer, tokenValueElement } = findElements(authorToken);
-
- subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, 'none')
- .then(done)
- .catch(done.fail);
- });
-
- it('ignores error if UsersCache throws', (done) => {
+ it('ignores error if UsersCache throws', done => {
spyOn(window, 'Flash');
const dummyError = new Error('Earth rotated backwards');
const { tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
- usersCacheSpy = (username) => {
+ usersCacheSpy = username => {
expect(`@${username}`).toBe(tokenValue);
return Promise.reject(dummyError);
};
- subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(window.Flash.calls.count()).toBe(0);
- })
- .then(done)
- .catch(done.fail);
+ subject
+ .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
+ .then(() => {
+ expect(window.Flash.calls.count()).toBe(0);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('does nothing if user cannot be found', (done) => {
+ it('does nothing if user cannot be found', done => {
const { tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
- usersCacheSpy = (username) => {
+ usersCacheSpy = username => {
expect(`@${username}`).toBe(tokenValue);
return Promise.resolve(undefined);
};
- subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueElement.innerText).toBe(tokenValue);
- })
- .then(done)
- .catch(done.fail);
+ subject
+ .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
+ .then(() => {
+ expect(tokenValueElement.innerText).toBe(tokenValue);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('replaces author token with avatar and display name', (done) => {
+ it('replaces author token with avatar and display name', done => {
const dummyUser = {
name: 'Important Person',
avatar_url: 'https://host.invalid/mypics/avatar.png',
};
const { tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
- usersCacheSpy = (username) => {
+ usersCacheSpy = username => {
expect(`@${username}`).toBe(tokenValue);
return Promise.resolve(dummyUser);
};
- subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue);
- expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
- const avatar = tokenValueElement.querySelector('img.avatar');
- expect(avatar.src).toBe(dummyUser.avatar_url);
- expect(avatar.alt).toBe('');
- })
- .then(done)
- .catch(done.fail);
+ subject
+ .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
+ .then(() => {
+ expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue);
+ expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
+ const avatar = tokenValueElement.querySelector('img.avatar');
+
+ expect(avatar.src).toBe(dummyUser.avatar_url);
+ expect(avatar.alt).toBe('');
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('escapes user name when creating token', (done) => {
+ it('escapes user name when creating token', done => {
const dummyUser = {
name: '<script>',
avatar_url: `${gl.TEST_HOST}/mypics/avatar.png`,
};
const { tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
- usersCacheSpy = (username) => {
+ usersCacheSpy = username => {
expect(`@${username}`).toBe(tokenValue);
return Promise.resolve(dummyUser);
};
- subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
- tokenValueElement.querySelector('.avatar').remove();
- expect(tokenValueElement.innerHTML.trim()).toBe(_.escape(dummyUser.name));
- })
- .then(done)
- .catch(done.fail);
+ subject
+ .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
+ .then(() => {
+ expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
+ tokenValueElement.querySelector('.avatar').remove();
+
+ expect(tokenValueElement.innerHTML.trim()).toBe(_.escape(dummyUser.name));
+ })
+ .then(done)
+ .catch(done.fail);
});
});
@@ -850,23 +904,31 @@ describe('Filtered Search Visual Tokens', () => {
it('should set backgroundColor', () => {
const originalBackgroundColor = bugLabelToken.style.backgroundColor;
const token = subject.setTokenStyle(bugLabelToken, 'blue', 'white');
+
expect(token.style.backgroundColor).toEqual('blue');
expect(token.style.backgroundColor).not.toEqual(originalBackgroundColor);
});
it('should not set backgroundColor when it is a linear-gradient', () => {
- const token = subject.setTokenStyle(bugLabelToken, 'linear-gradient(135deg, red, blue)', 'white');
+ const token = subject.setTokenStyle(
+ bugLabelToken,
+ 'linear-gradient(135deg, red, blue)',
+ 'white',
+ );
+
expect(token.style.backgroundColor).toEqual(bugLabelToken.style.backgroundColor);
});
it('should set textColor', () => {
const token = subject.setTokenStyle(bugLabelToken, 'white', 'black');
+
expect(token.style.color).toEqual('black');
expect(token.style.color).not.toEqual(originalTextColor);
});
it('should add inverted class when textColor is #FFFFFF', () => {
const token = subject.setTokenStyle(bugLabelToken, 'black', '#FFFFFF');
+
expect(token.style.color).toEqual('rgb(255, 255, 255)');
expect(token.style.color).not.toEqual(originalTextColor);
expect(token.querySelector('.remove-token').classList.contains('inverted')).toEqual(true);
@@ -890,14 +952,17 @@ describe('Filtered Search Visual Tokens', () => {
describe('not preprocessed before', () => {
it('returns preprocessed labels', () => {
let labels = [];
+
expect(labels.preprocessed).not.toEqual(true);
labels = FilteredSearchVisualTokens.preprocessLabel(endpoint, labels);
+
expect(labels.preprocessed).toEqual(true);
});
it('overrides AjaxCache with preprocessed results', () => {
spyOn(AjaxCache, 'override').and.callFake(() => {});
FilteredSearchVisualTokens.preprocessLabel(endpoint, []);
+
expect(AjaxCache.override.calls.count()).toEqual(1);
});
});
@@ -915,8 +980,14 @@ describe('Filtered Search Visual Tokens', () => {
labelData = getJSONFixture(jsonFixtureName);
});
- const missingLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '~doesnotexist');
- const spaceLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '~"some space"');
+ const missingLabelToken = FilteredSearchSpecHelper.createFilterVisualToken(
+ 'label',
+ '~doesnotexist',
+ );
+ const spaceLabelToken = FilteredSearchSpecHelper.createFilterVisualToken(
+ 'label',
+ '~"some space"',
+ );
beforeEach(() => {
tokensContainer.innerHTML = FilteredSearchSpecHelper.createTokensContainerHTML(`
@@ -928,11 +999,11 @@ describe('Filtered Search Visual Tokens', () => {
const filteredSearchInput = document.querySelector('.filtered-search');
filteredSearchInput.dataset.baseEndpoint = dummyEndpoint;
- AjaxCache.internalStorage = { };
+ AjaxCache.internalStorage = {};
AjaxCache.internalStorage[`${dummyEndpoint}/labels.json`] = labelData;
});
- const parseColor = (color) => {
+ const parseColor = color => {
const dummyElement = document.createElement('div');
dummyElement.style.color = color;
return dummyElement.style.color;
@@ -944,16 +1015,16 @@ describe('Filtered Search Visual Tokens', () => {
expect(tokenValueContainer.style.color).toBe(parseColor(label.text_color));
};
- const findLabel = tokenValue => labelData.find(
- label => tokenValue === `~${DropdownUtils.getEscapedText(label.title)}`,
- );
+ const findLabel = tokenValue =>
+ labelData.find(label => tokenValue === `~${DropdownUtils.getEscapedText(label.title)}`);
- it('updates the color of a label token', (done) => {
+ it('updates the color of a label token', done => {
const { tokenValueContainer, tokenValueElement } = findElements(bugLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
- subject.updateLabelTokenColor(tokenValueContainer, tokenValue)
+ subject
+ .updateLabelTokenColor(tokenValueContainer, tokenValue)
.then(() => {
expectValueContainerStyle(tokenValueContainer, matchingLabel);
})
@@ -961,12 +1032,13 @@ describe('Filtered Search Visual Tokens', () => {
.catch(done.fail);
});
- it('updates the color of a label token with spaces', (done) => {
+ it('updates the color of a label token with spaces', done => {
const { tokenValueContainer, tokenValueElement } = findElements(spaceLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
- subject.updateLabelTokenColor(tokenValueContainer, tokenValue)
+ subject
+ .updateLabelTokenColor(tokenValueContainer, tokenValue)
.then(() => {
expectValueContainerStyle(tokenValueContainer, matchingLabel);
})
@@ -974,13 +1046,15 @@ describe('Filtered Search Visual Tokens', () => {
.catch(done.fail);
});
- it('does not change color of a missing label', (done) => {
+ it('does not change color of a missing label', done => {
const { tokenValueContainer, tokenValueElement } = findElements(missingLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
+
expect(matchingLabel).toBe(undefined);
- subject.updateLabelTokenColor(tokenValueContainer, tokenValue)
+ subject
+ .updateLabelTokenColor(tokenValueContainer, tokenValue)
.then(() => {
expect(tokenValueContainer.getAttribute('style')).toBe(null);
})
diff --git a/spec/javascripts/filtered_search/recent_searches_root_spec.js b/spec/javascripts/filtered_search/recent_searches_root_spec.js
index d063fcf4f2d..70dd4e9570d 100644
--- a/spec/javascripts/filtered_search/recent_searches_root_spec.js
+++ b/spec/javascripts/filtered_search/recent_searches_root_spec.js
@@ -14,7 +14,7 @@ describe('RecentSearchesRoot', () => {
},
};
- VueSpy = spyOnDependency(RecentSearchesRoot, 'Vue').and.callFake((options) => {
+ VueSpy = spyOnDependency(RecentSearchesRoot, 'Vue').and.callFake(options => {
({ data, template } = options);
});
diff --git a/spec/javascripts/filtered_search/services/recent_searches_service_spec.js b/spec/javascripts/filtered_search/services/recent_searches_service_spec.js
index c293c0afa97..188f83eca16 100644
--- a/spec/javascripts/filtered_search/services/recent_searches_service_spec.js
+++ b/spec/javascripts/filtered_search/services/recent_searches_service_spec.js
@@ -15,48 +15,49 @@ describe('RecentSearchesService', () => {
spyOn(RecentSearchesService, 'isAvailable').and.returnValue(true);
});
- it('should default to empty array', (done) => {
+ it('should default to empty array', done => {
const fetchItemsPromise = service.fetch();
fetchItemsPromise
- .then((items) => {
+ .then(items => {
expect(items).toEqual([]);
})
.then(done)
.catch(done.fail);
});
- it('should reject when unable to parse', (done) => {
+ it('should reject when unable to parse', done => {
window.localStorage.setItem(service.localStorageKey, 'fail');
const fetchItemsPromise = service.fetch();
fetchItemsPromise
.then(done.fail)
- .catch((error) => {
+ .catch(error => {
expect(error).toEqual(jasmine.any(SyntaxError));
})
.then(done)
.catch(done.fail);
});
- it('should reject when service is unavailable', (done) => {
+ it('should reject when service is unavailable', done => {
RecentSearchesService.isAvailable.and.returnValue(false);
- service.fetch()
+ service
+ .fetch()
.then(done.fail)
- .catch((error) => {
+ .catch(error => {
expect(error).toEqual(jasmine.any(Error));
})
.then(done)
.catch(done.fail);
});
- it('should return items from localStorage', (done) => {
+ it('should return items from localStorage', done => {
window.localStorage.setItem(service.localStorageKey, '["foo", "bar"]');
const fetchItemsPromise = service.fetch();
fetchItemsPromise
- .then((items) => {
+ .then(items => {
expect(items).toEqual(['foo', 'bar']);
})
.then(done)
@@ -70,10 +71,11 @@ describe('RecentSearchesService', () => {
spyOn(window.localStorage, 'getItem');
});
- it('should not call .getItem', (done) => {
- RecentSearchesService.prototype.fetch()
+ it('should not call .getItem', done => {
+ RecentSearchesService.prototype
+ .fetch()
.then(done.fail)
- .catch((err) => {
+ .catch(err => {
expect(err).toEqual(new RecentSearchesServiceError());
expect(window.localStorage.getItem).not.toHaveBeenCalled();
})
@@ -92,6 +94,7 @@ describe('RecentSearchesService', () => {
const items = ['foo', 'bar'];
service.save(items);
const newLocalStorageValue = window.localStorage.getItem(service.localStorageKey);
+
expect(JSON.parse(newLocalStorageValue)).toEqual(items);
});
});
diff --git a/spec/javascripts/filtered_search/stores/recent_searches_store_spec.js b/spec/javascripts/filtered_search/stores/recent_searches_store_spec.js
index 1eebc6f2367..56bb82ae941 100644
--- a/spec/javascripts/filtered_search/stores/recent_searches_store_spec.js
+++ b/spec/javascripts/filtered_search/stores/recent_searches_store_spec.js
@@ -38,14 +38,8 @@ describe('RecentSearchesStore', () => {
describe('setRecentSearches', () => {
it('should override list', () => {
- store.setRecentSearches([
- 'foo',
- 'bar',
- ]);
- store.setRecentSearches([
- 'baz',
- 'qux',
- ]);
+ store.setRecentSearches(['foo', 'bar']);
+ store.setRecentSearches(['baz', 'qux']);
expect(store.state.recentSearches).toEqual(['baz', 'qux']);
});
diff --git a/spec/javascripts/fixtures/admin_users.rb b/spec/javascripts/fixtures/admin_users.rb
new file mode 100644
index 00000000000..9989ac4fff2
--- /dev/null
+++ b/spec/javascripts/fixtures/admin_users.rb
@@ -0,0 +1,29 @@
+require 'spec_helper'
+
+describe Admin::UsersController, '(JavaScript fixtures)', type: :controller do
+ include StubENV
+ include JavaScriptFixturesHelpers
+
+ let(:admin) { create(:admin) }
+
+ before do
+ stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
+ sign_in(admin)
+ end
+
+ render_views
+
+ before(:all) do
+ clean_frontend_fixtures('admin/users')
+ end
+
+ it 'admin/users/new_with_internal_user_regex.html.raw' do |example|
+ stub_application_setting(user_default_external: true)
+ stub_application_setting(user_default_internal_regex: '^(?:(?!\.ext@).)*$\r?')
+
+ get :new
+
+ expect(response).to be_success
+ store_frontend_fixture(response, example.description)
+ end
+end
diff --git a/spec/javascripts/fixtures/application_settings.rb b/spec/javascripts/fixtures/application_settings.rb
new file mode 100644
index 00000000000..a9d3043f73d
--- /dev/null
+++ b/spec/javascripts/fixtures/application_settings.rb
@@ -0,0 +1,34 @@
+require 'spec_helper'
+
+describe Admin::ApplicationSettingsController, '(JavaScript fixtures)', type: :controller do
+ include StubENV
+ include JavaScriptFixturesHelpers
+
+ let(:admin) { create(:admin) }
+ let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
+ let(:project) { create(:project_empty_repo, namespace: namespace, path: 'application-settings') }
+
+ before do
+ stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
+ sign_in(admin)
+ end
+
+ render_views
+
+ before(:all) do
+ clean_frontend_fixtures('application_settings/')
+ end
+
+ after do
+ remove_repository(project)
+ end
+
+ it 'application_settings/accounts_and_limit.html.raw' do |example|
+ stub_application_setting(user_default_external: false)
+
+ get :show
+
+ expect(response).to be_success
+ store_frontend_fixture(response, example.description)
+ end
+end
diff --git a/spec/javascripts/fixtures/groups.rb b/spec/javascripts/fixtures/groups.rb
index a2035ceae15..b42f442557c 100644
--- a/spec/javascripts/fixtures/groups.rb
+++ b/spec/javascripts/fixtures/groups.rb
@@ -17,6 +17,16 @@ describe 'Groups (JavaScript fixtures)', type: :controller do
sign_in(admin)
end
+ describe GroupsController, '(JavaScript fixtures)', type: :controller do
+ it 'groups/edit.html.raw' do |example|
+ get :edit,
+ id: group
+
+ expect(response).to be_success
+ store_frontend_fixture(response, example.description)
+ end
+ end
+
describe Groups::Settings::CiCdController, '(JavaScript fixtures)', type: :controller do
it 'groups/ci_cd_settings.html.raw' do |example|
get :show,
diff --git a/spec/javascripts/fixtures/jobs.rb b/spec/javascripts/fixtures/jobs.rb
index 6d5c6d5334f..82d7a5e394e 100644
--- a/spec/javascripts/fixtures/jobs.rb
+++ b/spec/javascripts/fixtures/jobs.rb
@@ -5,16 +5,24 @@ describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do
let(:admin) { create(:admin) }
let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
- let(:project) { create(:project_empty_repo, namespace: namespace, path: 'builds-project') }
- let(:pipeline) { create(:ci_empty_pipeline, project: project) }
+ let(:project) { create(:project, :repository, namespace: namespace, path: 'builds-project') }
+ let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.id) }
let!(:build_with_artifacts) { create(:ci_build, :success, :artifacts, :trace_artifact, pipeline: pipeline, stage: 'test', artifacts_expire_at: Time.now + 18.months) }
let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline, stage: 'build') }
let!(:pending_build) { create(:ci_build, :pending, pipeline: pipeline, stage: 'deploy') }
+ let!(:delayed_job) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline,
+ name: 'delayed job',
+ stage: 'test',
+ commands: 'test')
+ end
render_views
before(:all) do
clean_frontend_fixtures('builds/')
+ clean_frontend_fixtures('jobs/')
end
before do
@@ -34,4 +42,15 @@ describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do
expect(response).to be_success
store_frontend_fixture(response, example.description)
end
+
+ it 'jobs/delayed.json' do |example|
+ get :show,
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ id: delayed_job.to_param,
+ format: :json
+
+ expect(response).to be_success
+ store_frontend_fixture(response, example.description)
+ end
end
diff --git a/spec/javascripts/fixtures/merge_requests_diffs.rb b/spec/javascripts/fixtures/merge_requests_diffs.rb
index ddce00bc0fe..afe34b834b0 100644
--- a/spec/javascripts/fixtures/merge_requests_diffs.rb
+++ b/spec/javascripts/fixtures/merge_requests_diffs.rb
@@ -9,6 +9,7 @@ describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type
let(:project) { create(:project, :repository, namespace: namespace, path: 'merge-requests-project') }
let(:merge_request) { create(:merge_request, :with_diffs, source_project: project, target_project: project, description: '- [ ] Task List Item') }
let(:path) { "files/ruby/popen.rb" }
+ let(:selected_commit) { merge_request.all_commits[0] }
let(:position) do
Gitlab::Diff::Position.new(
old_path: path,
@@ -33,6 +34,14 @@ describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type
remove_repository(project)
end
+ it 'merge_request_diffs/with_commit.json' do |example|
+ # Create a user that matches the selected commit author
+ # This is so that the "author" information will be populated
+ create(:user, email: selected_commit.author_email, name: selected_commit.author_name)
+
+ render_merge_request(example.description, merge_request, commit_id: selected_commit.sha)
+ end
+
it 'merge_request_diffs/inline_changes_tab_with_comments.json' do |example|
create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request)
create(:note_on_merge_request, author: admin, project: project, noteable: merge_request)
@@ -47,13 +56,14 @@ describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type
private
- def render_merge_request(fixture_file_name, merge_request, view: 'inline')
+ def render_merge_request(fixture_file_name, merge_request, view: 'inline', **extra_params)
get :show,
namespace_id: project.namespace.to_param,
project_id: project,
id: merge_request.to_param,
format: :json,
- view: view
+ view: view,
+ **extra_params
expect(response).to be_success
store_frontend_fixture(response, fixture_file_name)
diff --git a/spec/javascripts/fixtures/projects.rb b/spec/javascripts/fixtures/projects.rb
index 57c78182abc..d98f7f55b20 100644
--- a/spec/javascripts/fixtures/projects.rb
+++ b/spec/javascripts/fixtures/projects.rb
@@ -6,6 +6,7 @@ describe 'Projects (JavaScript fixtures)', type: :controller do
let(:admin) { create(:admin) }
let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
let(:project) { create(:project, namespace: namespace, path: 'builds-project') }
+ let(:project_with_repo) { create(:project, :repository, description: 'Code and stuff') }
let(:project_variable_populated) { create(:project, namespace: namespace, path: 'builds-project2') }
let!(:variable1) { create(:ci_variable, project: project_variable_populated) }
let!(:variable2) { create(:ci_variable, project: project_variable_populated) }
@@ -35,6 +36,15 @@ describe 'Projects (JavaScript fixtures)', type: :controller do
store_frontend_fixture(response, example.description)
end
+ it 'projects/overview.html.raw' do |example|
+ get :show,
+ namespace_id: project_with_repo.namespace.to_param,
+ id: project_with_repo
+
+ expect(response).to be_success
+ store_frontend_fixture(response, example.description)
+ end
+
it 'projects/edit.html.raw' do |example|
get :edit,
namespace_id: project.namespace.to_param,
diff --git a/spec/javascripts/flash_spec.js b/spec/javascripts/flash_spec.js
index 7198dbd4cf2..aecab331ead 100644
--- a/spec/javascripts/flash_spec.js
+++ b/spec/javascripts/flash_spec.js
@@ -1,9 +1,4 @@
-import flash, {
- createFlashEl,
- createAction,
- hideFlash,
- removeFlashClickListener,
-} from '~/flash';
+import flash, { createFlashEl, createAction, hideFlash, removeFlashClickListener } from '~/flash';
describe('Flash', () => {
describe('createFlashEl', () => {
@@ -20,28 +15,23 @@ describe('Flash', () => {
it('creates flash element with type', () => {
el.innerHTML = createFlashEl('testing', 'alert');
- expect(
- el.querySelector('.flash-alert'),
- ).not.toBeNull();
+ expect(el.querySelector('.flash-alert')).not.toBeNull();
});
it('escapes text', () => {
el.innerHTML = createFlashEl('<script>alert("a");</script>', 'alert');
- expect(
- el.querySelector('.flash-text').textContent.trim(),
- ).toBe('<script>alert("a");</script>');
+ expect(el.querySelector('.flash-text').textContent.trim()).toBe(
+ '<script>alert("a");</script>',
+ );
});
it('adds container classes when inside content wrapper', () => {
el.innerHTML = createFlashEl('testing', 'alert', true);
- expect(
- el.querySelector('.flash-text').classList.contains('container-fluid'),
- ).toBeTruthy();
- expect(
- el.querySelector('.flash-text').classList.contains('container-limited'),
- ).toBeTruthy();
+ expect(el.querySelector('.flash-text').classList.contains('container-fluid')).toBeTruthy();
+
+ expect(el.querySelector('.flash-text').classList.contains('container-limited')).toBeTruthy();
});
});
@@ -56,28 +46,23 @@ describe('Flash', () => {
it('sets transition style', () => {
hideFlash(el);
- expect(
- el.style.transition,
- ).toBe('opacity 0.3s');
+ expect(el.style['transition-property']).toBe('opacity');
+
+ expect(el.style['transition-duration']).toBe('0.3s');
});
it('sets opacity style', () => {
hideFlash(el);
- expect(
- el.style.opacity,
- ).toBe('0');
+ expect(el.style.opacity).toBe('0');
});
it('does not set styles when fadeTransition is false', () => {
hideFlash(el, false);
- expect(
- el.style.opacity,
- ).toBe('');
- expect(
- el.style.transition,
- ).toBe('');
+ expect(el.style.opacity).toBe('');
+
+ expect(el.style.transition).toBe('');
});
it('removes element after transitionend', () => {
@@ -86,9 +71,7 @@ describe('Flash', () => {
hideFlash(el);
el.dispatchEvent(new Event('transitionend'));
- expect(
- document.querySelector('.js-testing'),
- ).toBeNull();
+ expect(document.querySelector('.js-testing')).toBeNull();
});
it('calls event listener callback once', () => {
@@ -100,9 +83,7 @@ describe('Flash', () => {
el.dispatchEvent(new Event('transitionend'));
el.dispatchEvent(new Event('transitionend'));
- expect(
- el.remove.calls.count(),
- ).toBe(1);
+ expect(el.remove.calls.count()).toBe(1);
});
});
@@ -119,9 +100,7 @@ describe('Flash', () => {
title: 'test',
});
- expect(
- el.querySelector('.flash-action').href,
- ).toContain('testing');
+ expect(el.querySelector('.flash-action').href).toContain('testing');
});
it('uses hash as href when no href is present', () => {
@@ -129,9 +108,7 @@ describe('Flash', () => {
title: 'test',
});
- expect(
- el.querySelector('.flash-action').href,
- ).toContain('#');
+ expect(el.querySelector('.flash-action').href).toContain('#');
});
it('adds role when no href is present', () => {
@@ -139,9 +116,7 @@ describe('Flash', () => {
title: 'test',
});
- expect(
- el.querySelector('.flash-action').getAttribute('role'),
- ).toBe('button');
+ expect(el.querySelector('.flash-action').getAttribute('role')).toBe('button');
});
it('escapes the title text', () => {
@@ -149,9 +124,9 @@ describe('Flash', () => {
title: '<script>alert("a")</script>',
});
- expect(
- el.querySelector('.flash-action').textContent.trim(),
- ).toBe('<script>alert("a")</script>');
+ expect(el.querySelector('.flash-action').textContent.trim()).toBe(
+ '<script>alert("a")</script>',
+ );
});
});
@@ -160,12 +135,9 @@ describe('Flash', () => {
it('does not add to the DOM', () => {
const flashEl = flash('testing');
- expect(
- flashEl,
- ).toBeNull();
- expect(
- document.querySelector('.flash-alert'),
- ).toBeNull();
+ expect(flashEl).toBeNull();
+
+ expect(document.querySelector('.flash-alert')).toBeNull();
});
});
@@ -185,42 +157,30 @@ describe('Flash', () => {
it('adds flash element into container', () => {
flash('test', 'alert', document, null, false, true);
- expect(
- document.querySelector('.flash-alert'),
- ).not.toBeNull();
+ expect(document.querySelector('.flash-alert')).not.toBeNull();
- expect(
- document.body.className,
- ).toContain('flash-shown');
+ expect(document.body.className).toContain('flash-shown');
});
it('adds flash into specified parent', () => {
- flash(
- 'test',
- 'alert',
- document.querySelector('.content-wrapper'),
- );
+ flash('test', 'alert', document.querySelector('.content-wrapper'));
- expect(
- document.querySelector('.content-wrapper .flash-alert'),
- ).not.toBeNull();
+ expect(document.querySelector('.content-wrapper .flash-alert')).not.toBeNull();
});
it('adds container classes when inside content-wrapper', () => {
flash('test');
- expect(
- document.querySelector('.flash-text').className,
- ).toBe('flash-text container-fluid container-limited');
+ expect(document.querySelector('.flash-text').className).toBe(
+ 'flash-text container-fluid container-limited limit-container-width',
+ );
});
it('does not add container when outside of content-wrapper', () => {
document.querySelector('.content-wrapper').className = 'js-content-wrapper';
flash('test');
- expect(
- document.querySelector('.flash-text').className.trim(),
- ).toBe('flash-text');
+ expect(document.querySelector('.flash-text').className.trim()).toContain('flash-text');
});
it('removes element after clicking', () => {
@@ -228,29 +188,18 @@ describe('Flash', () => {
document.querySelector('.flash-alert').click();
- expect(
- document.querySelector('.flash-alert'),
- ).toBeNull();
+ expect(document.querySelector('.flash-alert')).toBeNull();
- expect(
- document.body.className,
- ).not.toContain('flash-shown');
+ expect(document.body.className).not.toContain('flash-shown');
});
describe('with actionConfig', () => {
it('adds action link', () => {
- flash(
- 'test',
- 'alert',
- document,
- {
- title: 'test',
- },
- );
-
- expect(
- document.querySelector('.flash-action'),
- ).not.toBeNull();
+ flash('test', 'alert', document, {
+ title: 'test',
+ });
+
+ expect(document.querySelector('.flash-action')).not.toBeNull();
});
it('calls actionConfig clickHandler on click', () => {
@@ -259,18 +208,11 @@ describe('Flash', () => {
clickHandler: jasmine.createSpy('actionConfig'),
};
- flash(
- 'test',
- 'alert',
- document,
- actionConfig,
- );
+ flash('test', 'alert', document, actionConfig);
document.querySelector('.flash-action').click();
- expect(
- actionConfig.clickHandler,
- ).toHaveBeenCalled();
+ expect(actionConfig.clickHandler).toHaveBeenCalled();
});
});
});
@@ -281,7 +223,7 @@ describe('Flash', () => {
document.body.innerHTML += '<div class="flash-container"><div class="flash"></div></div>';
});
- it('removes global flash on click', (done) => {
+ it('removes global flash on click', done => {
const flashEl = document.querySelector('.flash');
removeFlashClickListener(flashEl, false);
diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js
index eb9330f5e5b..7ef44f29c5b 100644
--- a/spec/javascripts/fly_out_nav_spec.js
+++ b/spec/javascripts/fly_out_nav_spec.js
@@ -45,9 +45,7 @@ describe('Fly out sidebar navigation', () => {
height: 100,
};
- expect(
- calculateTop(boundingRect, 100),
- ).toBe(100);
+ expect(calculateTop(boundingRect, 100)).toBe(100);
});
it('returns boundingRect - bottomOverflow', () => {
@@ -56,27 +54,22 @@ describe('Fly out sidebar navigation', () => {
height: 100,
};
- expect(
- calculateTop(boundingRect, 100),
- ).toBe(window.innerHeight - 50);
+ expect(calculateTop(boundingRect, 100)).toBe(window.innerHeight - 50);
});
});
describe('getHideSubItemsInterval', () => {
beforeEach(() => {
- el.innerHTML = '<div class="sidebar-sub-level-items" style="position: fixed; top: 0; left: 100px; height: 150px;"></div>';
+ el.innerHTML =
+ '<div class="sidebar-sub-level-items" style="position: fixed; top: 0; left: 100px; height: 150px;"></div>';
});
it('returns 0 if currentOpenMenu is nil', () => {
- expect(
- getHideSubItemsInterval(),
- ).toBe(0);
+ expect(getHideSubItemsInterval()).toBe(0);
});
it('returns 0 if mousePos is empty', () => {
- expect(
- getHideSubItemsInterval(),
- ).toBe(0);
+ expect(getHideSubItemsInterval()).toBe(0);
});
it('returns 0 when mouse above sub-items', () => {
@@ -90,9 +83,7 @@ describe('Fly out sidebar navigation', () => {
clientY: el.getBoundingClientRect().top - 50,
});
- expect(
- getHideSubItemsInterval(),
- ).toBe(0);
+ expect(getHideSubItemsInterval()).toBe(0);
});
it('returns 0 when mouse is below sub-items', () => {
@@ -105,12 +96,10 @@ describe('Fly out sidebar navigation', () => {
});
documentMouseMove({
clientX: el.getBoundingClientRect().left,
- clientY: (el.getBoundingClientRect().top - subItems.getBoundingClientRect().height) + 50,
+ clientY: el.getBoundingClientRect().top - subItems.getBoundingClientRect().height + 50,
});
- expect(
- getHideSubItemsInterval(),
- ).toBe(0);
+ expect(getHideSubItemsInterval()).toBe(0);
});
it('returns 300 when mouse is moved towards sub-items', () => {
@@ -124,9 +113,7 @@ describe('Fly out sidebar navigation', () => {
clientY: el.getBoundingClientRect().top + 10,
});
- expect(
- getHideSubItemsInterval(),
- ).toBe(300);
+ expect(getHideSubItemsInterval()).toBe(300);
});
});
@@ -138,9 +125,7 @@ describe('Fly out sidebar navigation', () => {
it('removes is-over class if currentOpenMenu is null', () => {
mouseLeaveTopItem(el);
- expect(
- el.classList.remove,
- ).toHaveBeenCalledWith('is-over');
+ expect(el.classList.remove).toHaveBeenCalledWith('is-over');
});
it('removes is-over class if currentOpenMenu is null & there are sub-items', () => {
@@ -148,9 +133,7 @@ describe('Fly out sidebar navigation', () => {
mouseLeaveTopItem(el);
- expect(
- el.classList.remove,
- ).toHaveBeenCalledWith('is-over');
+ expect(el.classList.remove).toHaveBeenCalledWith('is-over');
});
it('does not remove is-over class if currentOpenMenu is the passed in sub-items', () => {
@@ -159,34 +142,29 @@ describe('Fly out sidebar navigation', () => {
setOpenMenu(el.querySelector('.sidebar-sub-level-items'));
mouseLeaveTopItem(el);
- expect(
- el.classList.remove,
- ).not.toHaveBeenCalled();
+ expect(el.classList.remove).not.toHaveBeenCalled();
});
});
describe('mouseEnterTopItems', () => {
beforeEach(() => {
- el.innerHTML = '<div class="sidebar-sub-level-items" style="position: absolute; top: 0; left: 100px; height: 200px;"></div>';
+ el.innerHTML =
+ '<div class="sidebar-sub-level-items" style="position: absolute; top: 0; left: 100px; height: 200px;"></div>';
});
- it('shows sub-items after 0ms if no menu is open', (done) => {
+ it('shows sub-items after 0ms if no menu is open', done => {
mouseEnterTopItems(el);
- expect(
- getHideSubItemsInterval(),
- ).toBe(0);
+ expect(getHideSubItemsInterval()).toBe(0);
setTimeout(() => {
- expect(
- el.querySelector('.sidebar-sub-level-items').style.display,
- ).toBe('block');
+ expect(el.querySelector('.sidebar-sub-level-items').style.display).toBe('block');
done();
});
});
- it('shows sub-items after 300ms if a menu is currently open', (done) => {
+ it('shows sub-items after 300ms if a menu is currently open', done => {
documentMouseMove({
clientX: el.getBoundingClientRect().left,
clientY: el.getBoundingClientRect().top,
@@ -201,14 +179,10 @@ describe('Fly out sidebar navigation', () => {
mouseEnterTopItems(el, 0);
- expect(
- getHideSubItemsInterval(),
- ).toBe(300);
+ expect(getHideSubItemsInterval()).toBe(300);
setTimeout(() => {
- expect(
- el.querySelector('.sidebar-sub-level-items').style.display,
- ).toBe('block');
+ expect(el.querySelector('.sidebar-sub-level-items').style.display).toBe('block');
done();
});
@@ -225,9 +199,7 @@ describe('Fly out sidebar navigation', () => {
showSubLevelItems(el);
- expect(
- el.classList.add,
- ).toHaveBeenCalledWith('is-over');
+ expect(el.classList.add).toHaveBeenCalledWith('is-over');
});
it('does not show sub-items on mobile', () => {
@@ -235,17 +207,13 @@ describe('Fly out sidebar navigation', () => {
showSubLevelItems(el);
- expect(
- el.querySelector('.sidebar-sub-level-items').style.display,
- ).not.toBe('block');
+ expect(el.querySelector('.sidebar-sub-level-items').style.display).not.toBe('block');
});
it('shows sub-items', () => {
showSubLevelItems(el);
- expect(
- el.querySelector('.sidebar-sub-level-items').style.display,
- ).toBe('block');
+ expect(el.querySelector('.sidebar-sub-level-items').style.display).toBe('block');
});
it('shows collapsed only sub-items if icon only sidebar', () => {
@@ -258,9 +226,7 @@ describe('Fly out sidebar navigation', () => {
showSubLevelItems(el);
- expect(
- el.querySelector('.sidebar-sub-level-items').style.display,
- ).toBe('block');
+ expect(el.querySelector('.sidebar-sub-level-items').style.display).toBe('block');
});
it('does not show collapsed only sub-items if icon only sidebar', () => {
@@ -269,9 +235,7 @@ describe('Fly out sidebar navigation', () => {
showSubLevelItems(el);
- expect(
- subItems.style.display,
- ).not.toBe('block');
+ expect(subItems.style.display).not.toBe('block');
});
it('sets transform of sub-items', () => {
@@ -285,9 +249,10 @@ describe('Fly out sidebar navigation', () => {
setSidebar(sidebar);
showSubLevelItems(el);
- expect(
- subItems.style.transform,
- ).toBe(`translate3d(200px, ${Math.floor(el.getBoundingClientRect().top) - getHeaderHeight()}px, 0px)`);
+ expect(subItems.style.transform).toBe(
+ `translate3d(200px, ${Math.floor(el.getBoundingClientRect().top) -
+ getHeaderHeight()}px, 0px)`,
+ );
});
it('sets is-above when element is above', () => {
@@ -299,33 +264,25 @@ describe('Fly out sidebar navigation', () => {
showSubLevelItems(el);
- expect(
- subItems.classList.add,
- ).toHaveBeenCalledWith('is-above');
+ expect(subItems.classList.add).toHaveBeenCalledWith('is-above');
});
});
describe('canShowSubItems', () => {
it('returns true if on desktop size', () => {
- expect(
- canShowSubItems(),
- ).toBeTruthy();
+ expect(canShowSubItems()).toBeTruthy();
});
it('returns false if on mobile size', () => {
breakpointSize = 'xs';
- expect(
- canShowSubItems(),
- ).toBeFalsy();
+ expect(canShowSubItems()).toBeFalsy();
});
});
describe('canShowActiveSubItems', () => {
it('returns true by default', () => {
- expect(
- canShowActiveSubItems(el),
- ).toBeTruthy();
+ expect(canShowActiveSubItems(el)).toBeTruthy();
});
it('returns false when active & expanded sidebar', () => {
@@ -334,9 +291,7 @@ describe('Fly out sidebar navigation', () => {
setSidebar(sidebar);
- expect(
- canShowActiveSubItems(el),
- ).toBeFalsy();
+ expect(canShowActiveSubItems(el)).toBeFalsy();
});
it('returns true when active & collapsed sidebar', () => {
@@ -346,9 +301,7 @@ describe('Fly out sidebar navigation', () => {
setSidebar(sidebar);
- expect(
- canShowActiveSubItems(el),
- ).toBeTruthy();
+ expect(canShowActiveSubItems(el)).toBeTruthy();
});
});
@@ -362,18 +315,14 @@ describe('Fly out sidebar navigation', () => {
it('hides subMenu if element is not hovered', () => {
subItemsMouseLeave(el);
- expect(
- getOpenMenu(),
- ).toBeNull();
+ expect(getOpenMenu()).toBeNull();
});
it('does not hide subMenu if element is hovered', () => {
el.classList.add('is-over');
subItemsMouseLeave(el);
- expect(
- getOpenMenu(),
- ).not.toBeNull();
+ expect(getOpenMenu()).not.toBeNull();
});
});
});
diff --git a/spec/javascripts/frequent_items/components/app_spec.js b/spec/javascripts/frequent_items/components/app_spec.js
index 834f919524d..b1cc4d8dc8d 100644
--- a/spec/javascripts/frequent_items/components/app_spec.js
+++ b/spec/javascripts/frequent_items/components/app_spec.js
@@ -232,8 +232,7 @@ describe('Frequent Items App Component', () => {
expect(vm.$el.querySelectorAll('.frequent-items-list-container li').length).toBe(1);
vm.$store.dispatch('setSearchQuery', 'gitlab');
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelector('.loading-animation')).toBeDefined();
})
diff --git a/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js b/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js
index 201aca77b10..7deed985219 100644
--- a/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js
+++ b/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js
@@ -30,9 +30,11 @@ describe('FrequentItemsListItemComponent', () => {
describe('hasAvatar', () => {
it('should return `true` or `false` if whether avatar is present or not', () => {
vm.avatarUrl = 'path/to/avatar.png';
+
expect(vm.hasAvatar).toBe(true);
vm.avatarUrl = null;
+
expect(vm.hasAvatar).toBe(false);
});
});
@@ -40,11 +42,13 @@ describe('FrequentItemsListItemComponent', () => {
describe('highlightedItemName', () => {
it('should enclose part of project name in <b> & </b> which matches with `matcher` prop', () => {
vm.matcher = 'lab';
+
expect(vm.highlightedItemName).toContain('<b>Lab</b>');
});
it('should return project name as it is if `matcher` is not available', () => {
vm.matcher = null;
+
expect(vm.highlightedItemName).toBe(mockProject.name);
});
});
@@ -52,11 +56,13 @@ describe('FrequentItemsListItemComponent', () => {
describe('truncatedNamespace', () => {
it('should truncate project name from namespace string', () => {
vm.namespace = 'platform / nokia-3310';
+
expect(vm.truncatedNamespace).toBe('platform');
});
it('should truncate namespace string from the middle if it includes more than two groups in path', () => {
vm.namespace = 'platform / hardware / broadcom / Wifi Group / Mobile Chipset / nokia-3310';
+
expect(vm.truncatedNamespace).toBe('platform / ... / Mobile Chipset');
});
});
diff --git a/spec/javascripts/frequent_items/components/frequent_items_list_spec.js b/spec/javascripts/frequent_items/components/frequent_items_list_spec.js
index 3003b7ee000..8518a681a26 100644
--- a/spec/javascripts/frequent_items/components/frequent_items_list_spec.js
+++ b/spec/javascripts/frequent_items/components/frequent_items_list_spec.js
@@ -30,9 +30,11 @@ describe('FrequentItemsListComponent', () => {
describe('isListEmpty', () => {
it('should return `true` or `false` representing whether if `items` is empty or not with projects', () => {
vm.items = [];
+
expect(vm.isListEmpty).toBe(true);
vm.items = mockFrequentProjects;
+
expect(vm.isListEmpty).toBe(false);
});
});
@@ -40,9 +42,11 @@ describe('FrequentItemsListComponent', () => {
describe('fetched item messages', () => {
it('should return appropriate empty list message based on value of `localStorageFailed` prop with projects', () => {
vm.isFetchFailed = true;
+
expect(vm.listEmptyMessage).toBe('This feature requires browser localStorage support');
vm.isFetchFailed = false;
+
expect(vm.listEmptyMessage).toBe('Projects you visit often will appear here');
});
});
@@ -51,9 +55,11 @@ describe('FrequentItemsListComponent', () => {
it('should return appropriate empty list message based on value of `searchFailed` prop with projects', () => {
vm.hasSearchQuery = true;
vm.isFetchFailed = true;
+
expect(vm.listEmptyMessage).toBe('Something went wrong on our end.');
vm.isFetchFailed = false;
+
expect(vm.listEmptyMessage).toBe('Sorry, no projects matched your search');
});
});
diff --git a/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js b/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js
index 6a11038e70a..d564292f1ba 100644
--- a/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js
+++ b/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js
@@ -26,6 +26,7 @@ describe('FrequentItemsSearchInputComponent', () => {
spyOn(vm.$refs.search, 'focus');
vm.setFocus();
+
expect(vm.$refs.search.focus).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/gfm_auto_complete_spec.js b/spec/javascripts/gfm_auto_complete_spec.js
index 1cb20a1e7ff..6f414c8ccf1 100644
--- a/spec/javascripts/gfm_auto_complete_spec.js
+++ b/spec/javascripts/gfm_auto_complete_spec.js
@@ -6,39 +6,38 @@ import GfmAutoComplete from '~/gfm_auto_complete';
import 'vendor/jquery.caret';
import 'vendor/jquery.atwho';
-describe('GfmAutoComplete', function () {
+describe('GfmAutoComplete', function() {
const gfmAutoCompleteCallbacks = GfmAutoComplete.prototype.getDefaultCallbacks.call({
fetchData: () => {},
});
- describe('DefaultOptions.sorter', function () {
- describe('assets loading', function () {
- beforeEach(function () {
+ describe('DefaultOptions.sorter', function() {
+ describe('assets loading', function() {
+ beforeEach(function() {
spyOn(GfmAutoComplete, 'isLoading').and.returnValue(true);
this.atwhoInstance = { setting: {} };
this.items = [];
- this.sorterValue = gfmAutoCompleteCallbacks.sorter
- .call(this.atwhoInstance, '', this.items);
+ this.sorterValue = gfmAutoCompleteCallbacks.sorter.call(this.atwhoInstance, '', this.items);
});
- it('should disable highlightFirst', function () {
+ it('should disable highlightFirst', function() {
expect(this.atwhoInstance.setting.highlightFirst).toBe(false);
});
- it('should return the passed unfiltered items', function () {
+ it('should return the passed unfiltered items', function() {
expect(this.sorterValue).toEqual(this.items);
});
});
- describe('assets finished loading', function () {
- beforeEach(function () {
+ describe('assets finished loading', function() {
+ beforeEach(function() {
spyOn(GfmAutoComplete, 'isLoading').and.returnValue(false);
spyOn($.fn.atwho.default.callbacks, 'sorter');
});
- it('should enable highlightFirst if alwaysHighlightFirst is set', function () {
+ it('should enable highlightFirst if alwaysHighlightFirst is set', function() {
const atwhoInstance = { setting: { alwaysHighlightFirst: true } };
gfmAutoCompleteCallbacks.sorter.call(atwhoInstance);
@@ -46,7 +45,7 @@ describe('GfmAutoComplete', function () {
expect(atwhoInstance.setting.highlightFirst).toBe(true);
});
- it('should enable highlightFirst if a query is present', function () {
+ it('should enable highlightFirst if a query is present', function() {
const atwhoInstance = { setting: {} };
gfmAutoCompleteCallbacks.sorter.call(atwhoInstance, 'query');
@@ -54,7 +53,7 @@ describe('GfmAutoComplete', function () {
expect(atwhoInstance.setting.highlightFirst).toBe(true);
});
- it('should call the default atwho sorter', function () {
+ it('should call the default atwho sorter', function() {
const atwhoInstance = { setting: {} };
const query = 'query';
@@ -69,9 +68,8 @@ describe('GfmAutoComplete', function () {
});
describe('DefaultOptions.beforeInsert', () => {
- const beforeInsert = (context, value) => (
- gfmAutoCompleteCallbacks.beforeInsert.call(context, value)
- );
+ const beforeInsert = (context, value) =>
+ gfmAutoCompleteCallbacks.beforeInsert.call(context, value);
const atwhoInstance = { setting: { skipSpecialCharacterTest: false } };
@@ -98,29 +96,51 @@ describe('GfmAutoComplete', function () {
});
});
- describe('DefaultOptions.matcher', function () {
- const defaultMatcher = (context, flag, subtext) => (
- gfmAutoCompleteCallbacks.matcher.call(context, flag, subtext)
- );
+ describe('DefaultOptions.matcher', function() {
+ const defaultMatcher = (context, flag, subtext) =>
+ gfmAutoCompleteCallbacks.matcher.call(context, flag, subtext);
- const flagsUseDefaultMatcher = ['@', '#', '!', '~', '%'];
+ const flagsUseDefaultMatcher = ['@', '#', '!', '~', '%', '$'];
const otherFlags = ['/', ':'];
const flags = flagsUseDefaultMatcher.concat(otherFlags);
- const flagsHash = flags.reduce((hash, el) => { hash[el] = null; return hash; }, {});
+ const flagsHash = flags.reduce((hash, el) => {
+ hash[el] = null;
+ return hash;
+ }, {});
const atwhoInstance = { setting: {}, app: { controllers: flagsHash } };
const minLen = 1;
const maxLen = 20;
const argumentSize = [minLen, maxLen / 2, maxLen];
- const allowedSymbols = ['', 'a', 'n', 'z', 'A', 'Z', 'N', '0', '5', '9', 'А', 'а', 'Я', 'я', '.', '\'', '+', '-', '_'];
+ const allowedSymbols = [
+ '',
+ 'a',
+ 'n',
+ 'z',
+ 'A',
+ 'Z',
+ 'N',
+ '0',
+ '5',
+ '9',
+ 'А',
+ 'а',
+ 'Я',
+ 'я',
+ '.',
+ "'",
+ '+',
+ '-',
+ '_',
+ ];
const jointAllowedSymbols = allowedSymbols.join('');
describe('should match regular symbols', () => {
- flagsUseDefaultMatcher.forEach((flag) => {
- allowedSymbols.forEach((symbol) => {
- argumentSize.forEach((size) => {
+ flagsUseDefaultMatcher.forEach(flag => {
+ allowedSymbols.forEach(symbol => {
+ argumentSize.forEach(size => {
const query = new Array(size + 1).join(symbol);
const subtext = flag + query;
@@ -142,16 +162,16 @@ describe('GfmAutoComplete', function () {
const shouldNotBeFollowedBy = flags.concat(['\x00', '\x10', '\x3f', '\n', ' ']);
const shouldNotBePrependedBy = ['`'];
- flagsUseDefaultMatcher.forEach((atSign) => {
- shouldNotBeFollowedBy.forEach((followedSymbol) => {
+ flagsUseDefaultMatcher.forEach(atSign => {
+ shouldNotBeFollowedBy.forEach(followedSymbol => {
const seq = atSign + followedSymbol;
- it(`should not match "${seq}"`, () => {
+ it(`should not match ${JSON.stringify(seq)}`, () => {
expect(defaultMatcher(atwhoInstance, atSign, seq)).toBe(null);
});
});
- shouldNotBePrependedBy.forEach((prependedSymbol) => {
+ shouldNotBePrependedBy.forEach(prependedSymbol => {
const seq = prependedSymbol + atSign;
it(`should not match "${seq}"`, () => {
@@ -162,28 +182,26 @@ describe('GfmAutoComplete', function () {
});
});
- describe('isLoading', function () {
- it('should be true with loading data object item', function () {
+ describe('isLoading', function() {
+ it('should be true with loading data object item', function() {
expect(GfmAutoComplete.isLoading({ name: 'loading' })).toBe(true);
});
- it('should be true with loading data array', function () {
+ it('should be true with loading data array', function() {
expect(GfmAutoComplete.isLoading(['loading'])).toBe(true);
});
- it('should be true with loading data object array', function () {
+ it('should be true with loading data object array', function() {
expect(GfmAutoComplete.isLoading([{ name: 'loading' }])).toBe(true);
});
- it('should be false with actual array data', function () {
- expect(GfmAutoComplete.isLoading([
- { title: 'Foo' },
- { title: 'Bar' },
- { title: 'Qux' },
- ])).toBe(false);
+ it('should be false with actual array data', function() {
+ expect(
+ GfmAutoComplete.isLoading([{ title: 'Foo' }, { title: 'Bar' }, { title: 'Qux' }]),
+ ).toBe(false);
});
- it('should be false with actual data item', function () {
+ it('should be false with actual data item', function() {
expect(GfmAutoComplete.isLoading({ title: 'Foo' })).toBe(false);
});
});
diff --git a/spec/javascripts/gl_dropdown_spec.js b/spec/javascripts/gl_dropdown_spec.js
index af58dff7da7..85083653db8 100644
--- a/spec/javascripts/gl_dropdown_spec.js
+++ b/spec/javascripts/gl_dropdown_spec.js
@@ -1,4 +1,4 @@
-/* eslint-disable comma-dangle, no-param-reassign */
+/* eslint-disable no-param-reassign */
import $ from 'jquery';
import GLDropdown from '~/gl_dropdown';
@@ -8,7 +8,8 @@ describe('glDropdown', function describeDropdown() {
preloadFixtures('static/gl_dropdown.html.raw');
loadJSONFixtures('projects.json');
- const NON_SELECTABLE_CLASSES = '.divider, .separator, .dropdown-header, .dropdown-menu-empty-item';
+ const NON_SELECTABLE_CLASSES =
+ '.divider, .separator, .dropdown-header, .dropdown-menu-empty-item';
const SEARCH_INPUT_SELECTOR = '.dropdown-input-field';
const ITEM_SELECTOR = `.dropdown-content li:not(${NON_SELECTABLE_CLASSES})`;
const FOCUSED_ITEM_SELECTOR = `${ITEM_SELECTOR} a.is-focused`;
@@ -17,7 +18,7 @@ describe('glDropdown', function describeDropdown() {
DOWN: 40,
UP: 38,
ENTER: 13,
- ESC: 27
+ ESC: 27,
};
let remoteCallback;
@@ -28,7 +29,7 @@ describe('glDropdown', function describeDropdown() {
$('body').trigger({
type: 'keydown',
which: ARROW_KEYS[direction],
- keyCode: ARROW_KEYS[direction]
+ keyCode: ARROW_KEYS[direction],
});
i += 1;
if (i <= steps) {
@@ -43,17 +44,23 @@ describe('glDropdown', function describeDropdown() {
};
function initDropDown(hasRemote, isFilterable, extraOpts = {}) {
- const options = Object.assign({
- selectable: true,
- filterable: isFilterable,
- data: hasRemote ? remoteMock.bind({}, this.projectsData) : this.projectsData,
- search: {
- fields: ['name']
+ const options = Object.assign(
+ {
+ selectable: true,
+ filterable: isFilterable,
+ data: hasRemote ? remoteMock.bind({}, this.projectsData) : this.projectsData,
+ search: {
+ fields: ['name'],
+ },
+ text: project => project.name_with_namespace || project.name,
+ id: project => project.id,
},
- text: project => (project.name_with_namespace || project.name),
- id: project => project.id,
- }, extraOpts);
- this.dropdownButtonElement = $('#js-project-dropdown', this.dropdownContainerElement).glDropdown(options);
+ extraOpts,
+ );
+ this.dropdownButtonElement = $(
+ '#js-project-dropdown',
+ this.dropdownContainerElement,
+ ).glDropdown(options);
}
beforeEach(() => {
@@ -70,8 +77,10 @@ describe('glDropdown', function describeDropdown() {
it('should open on click', () => {
initDropDown.call(this, false);
+
expect(this.dropdownContainerElement).not.toHaveClass('show');
this.dropdownButtonElement.click();
+
expect(this.dropdownContainerElement).toHaveClass('show');
});
@@ -82,9 +91,7 @@ describe('glDropdown', function describeDropdown() {
this.dropdownButtonElement.click();
- expect(
- $('.dropdown-content li:first-child').text(),
- ).toBe('<script>alert("testing");</script>');
+ expect($('.dropdown-content li:first-child').text()).toBe('<script>alert("testing");</script>');
});
it('should output HTML when highlighting', () => {
@@ -97,13 +104,11 @@ describe('glDropdown', function describeDropdown() {
this.dropdownButtonElement.click();
- expect(
- $('.dropdown-content li:first-child').text(),
- ).toBe('testing');
+ expect($('.dropdown-content li:first-child').text()).toBe('testing');
- expect(
- $('.dropdown-content li:first-child a').html(),
- ).toBe('<b>t</b><b>e</b><b>s</b><b>t</b>ing');
+ expect($('.dropdown-content li:first-child a').html()).toBe(
+ '<b>t</b><b>e</b><b>s</b><b>t</b>ing',
+ );
});
describe('that is open', () => {
@@ -114,21 +119,28 @@ describe('glDropdown', function describeDropdown() {
it('should select a following item on DOWN keypress', () => {
expect($(FOCUSED_ITEM_SELECTOR, this.$dropdownMenuElement).length).toBe(0);
- const randomIndex = (Math.floor(Math.random() * (this.projectsData.length - 1)) + 0);
+ const randomIndex = Math.floor(Math.random() * (this.projectsData.length - 1)) + 0;
navigateWithKeys('down', randomIndex, () => {
expect($(FOCUSED_ITEM_SELECTOR, this.$dropdownMenuElement).length).toBe(1);
- expect($(`${ITEM_SELECTOR}:eq(${randomIndex}) a`, this.$dropdownMenuElement)).toHaveClass('is-focused');
+ expect($(`${ITEM_SELECTOR}:eq(${randomIndex}) a`, this.$dropdownMenuElement)).toHaveClass(
+ 'is-focused',
+ );
});
});
it('should select a previous item on UP keypress', () => {
expect($(FOCUSED_ITEM_SELECTOR, this.$dropdownMenuElement).length).toBe(0);
- navigateWithKeys('down', (this.projectsData.length - 1), () => {
+ navigateWithKeys('down', this.projectsData.length - 1, () => {
expect($(FOCUSED_ITEM_SELECTOR, this.$dropdownMenuElement).length).toBe(1);
- const randomIndex = (Math.floor(Math.random() * (this.projectsData.length - 2)) + 0);
+ const randomIndex = Math.floor(Math.random() * (this.projectsData.length - 2)) + 0;
navigateWithKeys('up', randomIndex, () => {
expect($(FOCUSED_ITEM_SELECTOR, this.$dropdownMenuElement).length).toBe(1);
- expect($(`${ITEM_SELECTOR}:eq(${((this.projectsData.length - 2) - randomIndex)}) a`, this.$dropdownMenuElement)).toHaveClass('is-focused');
+ expect(
+ $(
+ `${ITEM_SELECTOR}:eq(${this.projectsData.length - 2 - randomIndex}) a`,
+ this.$dropdownMenuElement,
+ ),
+ ).toHaveClass('is-focused');
});
});
});
@@ -141,9 +153,12 @@ describe('glDropdown', function describeDropdown() {
navigateWithKeys('enter', null, () => {
expect(this.dropdownContainerElement).not.toHaveClass('show');
const link = $(`${ITEM_SELECTOR}:eq(${randomIndex}) a`, this.$dropdownMenuElement);
+
expect(link).toHaveClass('is-active');
const linkedLocation = link.attr('href');
- if (linkedLocation && linkedLocation !== '#') expect(visitUrl).toHaveBeenCalledWith(linkedLocation);
+ if (linkedLocation && linkedLocation !== '#') {
+ expect(visitUrl).toHaveBeenCalledWith(linkedLocation);
+ }
});
});
});
@@ -153,8 +168,9 @@ describe('glDropdown', function describeDropdown() {
this.dropdownContainerElement.trigger({
type: 'keyup',
which: ARROW_KEYS.ESC,
- keyCode: ARROW_KEYS.ESC
+ keyCode: ARROW_KEYS.ESC,
});
+
expect(this.dropdownContainerElement).not.toHaveClass('show');
});
});
@@ -168,19 +184,22 @@ describe('glDropdown', function describeDropdown() {
it('should show loading indicator while search results are being fetched by backend', () => {
const dropdownMenu = document.querySelector('.dropdown-menu');
- expect(dropdownMenu.className.indexOf('is-loading') !== -1).toEqual(true);
+ expect(dropdownMenu.className.indexOf('is-loading')).not.toBe(-1);
remoteCallback();
- expect(dropdownMenu.className.indexOf('is-loading') !== -1).toEqual(false);
+
+ expect(dropdownMenu.className.indexOf('is-loading')).toBe(-1);
});
it('should not focus search input while remote task is not complete', () => {
expect($(document.activeElement)).not.toEqual($(SEARCH_INPUT_SELECTOR));
remoteCallback();
+
expect($(document.activeElement)).toEqual($(SEARCH_INPUT_SELECTOR));
});
it('should focus search input after remote task is complete', () => {
remoteCallback();
+
expect($(document.activeElement)).toEqual($(SEARCH_INPUT_SELECTOR));
});
@@ -189,10 +208,11 @@ describe('glDropdown', function describeDropdown() {
this.dropdownContainerElement.trigger({
type: 'keyup',
which: ARROW_KEYS.ESC,
- keyCode: ARROW_KEYS.ESC
+ keyCode: ARROW_KEYS.ESC,
});
this.dropdownButtonElement.click();
this.dropdownContainerElement.trigger('transitionend');
+
expect($(document.activeElement)).toEqual($(SEARCH_INPUT_SELECTOR));
});
});
@@ -202,6 +222,7 @@ describe('glDropdown', function describeDropdown() {
initDropDown.call(this, false, true);
this.dropdownButtonElement.click();
this.dropdownContainerElement.trigger('transitionend');
+
expect($(document.activeElement)).toEqual($(SEARCH_INPUT_SELECTOR));
});
});
@@ -213,11 +234,11 @@ describe('glDropdown', function describeDropdown() {
.trigger('focus')
.val('g')
.trigger('input');
+
expect($searchInput.val()).toEqual('g');
this.dropdownButtonElement.trigger('hidden.bs.dropdown');
- $searchInput
- .trigger('blur')
- .trigger('focus');
+ $searchInput.trigger('blur').trigger('focus');
+
expect($searchInput.val()).toEqual('g');
});
@@ -226,31 +247,31 @@ describe('glDropdown', function describeDropdown() {
let dropdown;
beforeEach(() => {
- const dropdownOptions = {
-
- };
+ const dropdownOptions = {};
const $dropdownDiv = $('<div />');
$dropdownDiv.glDropdown(dropdownOptions);
dropdown = $dropdownDiv.data('glDropdown');
});
it('marks items without ID as active', () => {
- const dummyData = { };
+ const dummyData = {};
const html = dropdown.renderItem(dummyData, null, null);
const link = html.querySelector('a');
+
expect(link).toHaveClass('is-active');
});
it('does not mark items with ID as active', () => {
const dummyData = {
- id: 'ea'
+ id: 'ea',
};
const html = dropdown.renderItem(dummyData, null, null);
const link = html.querySelector('a');
+
expect(link).not.toHaveClass('is-active');
});
});
@@ -271,13 +292,14 @@ describe('glDropdown', function describeDropdown() {
// select item the first time
this.dropdownButtonElement.click();
$item.click();
+
expect($item).toHaveClass('is-active');
// select item the second time
this.dropdownButtonElement.click();
$item.click();
+
expect($item).toHaveClass('is-active');
expect($('.dropdown-toggle-text')).toHaveText(this.projectsData[0].id.toString());
});
});
-
diff --git a/spec/javascripts/gl_field_errors_spec.js b/spec/javascripts/gl_field_errors_spec.js
index 21c462cd040..b463c9afbee 100644
--- a/spec/javascripts/gl_field_errors_spec.js
+++ b/spec/javascripts/gl_field_errors_spec.js
@@ -19,6 +19,7 @@ describe('GL Style Field Errors', function() {
expect(this.$form.length).toBe(1);
expect(this.fieldErrors).toBeDefined();
const { inputs } = this.fieldErrors.state;
+
expect(inputs.length).toBe(4);
});
@@ -28,29 +29,50 @@ describe('GL Style Field Errors', function() {
expect(customErrorElem.length).toBe(1);
- const customErrors = this.fieldErrors.state.inputs.filter((input) => {
+ const customErrors = this.fieldErrors.state.inputs.filter(input => {
return input.inputElement.hasClass(customErrorFlag);
});
+
expect(customErrors.length).toBe(0);
});
it('should not show any errors before submit attempt', function() {
- this.$form.find('.email').val('not-a-valid-email').keyup();
- this.$form.find('.text-required').val('').keyup();
- this.$form.find('.alphanumberic').val('?---*').keyup();
+ this.$form
+ .find('.email')
+ .val('not-a-valid-email')
+ .keyup();
+ this.$form
+ .find('.text-required')
+ .val('')
+ .keyup();
+ this.$form
+ .find('.alphanumberic')
+ .val('?---*')
+ .keyup();
const errorsShown = this.$form.find('.gl-field-error-outline');
+
expect(errorsShown.length).toBe(0);
});
it('should show errors when input valid is submitted', function() {
- this.$form.find('.email').val('not-a-valid-email').keyup();
- this.$form.find('.text-required').val('').keyup();
- this.$form.find('.alphanumberic').val('?---*').keyup();
+ this.$form
+ .find('.email')
+ .val('not-a-valid-email')
+ .keyup();
+ this.$form
+ .find('.text-required')
+ .val('')
+ .keyup();
+ this.$form
+ .find('.alphanumberic')
+ .val('?---*')
+ .keyup();
this.$form.submit();
const errorsShown = this.$form.find('.gl-field-error-outline');
+
expect(errorsShown.length).toBe(4);
});
@@ -68,30 +90,35 @@ describe('GL Style Field Errors', function() {
// Then invalid input
emailInputElement.val('not-a-valid-email').keyup();
+
expect(emailInputElement).toHaveClass('gl-field-error-outline');
expect(fieldState.empty).toBe(false);
expect(fieldState.valid).toBe(false);
// Then valid input
emailInputElement.val('email@gitlab.com').keyup();
+
expect(emailInputElement).not.toHaveClass('gl-field-error-outline');
expect(fieldState.empty).toBe(false);
expect(fieldState.valid).toBe(true);
// Then invalid input
emailInputElement.val('not-a-valid-email').keyup();
+
expect(emailInputElement).toHaveClass('gl-field-error-outline');
expect(fieldState.empty).toBe(false);
expect(fieldState.valid).toBe(false);
// Then empty input
emailInputElement.val('').keyup();
+
expect(emailInputElement).toHaveClass('gl-field-error-outline');
expect(fieldState.empty).toBe(true);
expect(fieldState.valid).toBe(false);
// Then valid input
emailInputElement.val('email@gitlab.com').keyup();
+
expect(emailInputElement).not.toHaveClass('gl-field-error-outline');
expect(fieldState.empty).toBe(false);
expect(fieldState.valid).toBe(true);
diff --git a/spec/javascripts/gl_form_spec.js b/spec/javascripts/gl_form_spec.js
index 74383f901b2..69b3dae743a 100644
--- a/spec/javascripts/gl_form_spec.js
+++ b/spec/javascripts/gl_form_spec.js
@@ -5,8 +5,8 @@ import '~/lib/utils/text_utility';
import '~/lib/utils/common_utils';
describe('GLForm', () => {
- describe('when instantiated', function () {
- beforeEach((done) => {
+ describe('when instantiated', function() {
+ beforeEach(done => {
this.form = $('<form class="gfm-form"><textarea class="js-gfm-input"></form>');
this.textarea = this.form.find('textarea');
spyOn($.prototype, 'off').and.returnValue(this.textarea);
@@ -23,7 +23,7 @@ describe('GLForm', () => {
});
describe('setupAutosize', () => {
- beforeEach((done) => {
+ beforeEach(done => {
this.glForm.setupAutosize();
setTimeout(() => {
done();
@@ -101,6 +101,7 @@ describe('GLForm', () => {
spyOn($.prototype, 'outerHeight').and.returnValue(200);
spyOn($.prototype, 'data').and.returnValue(200);
spyOn(autosize, 'destroy');
+
expect(this.glForm.destroyAutosize()).toBeUndefined();
expect(autosize.destroy).not.toHaveBeenCalled();
});
diff --git a/spec/javascripts/gpg_badges_spec.js b/spec/javascripts/gpg_badges_spec.js
index 78330dd9633..e73f6d3909e 100644
--- a/spec/javascripts/gpg_badges_spec.js
+++ b/spec/javascripts/gpg_badges_spec.js
@@ -69,6 +69,7 @@ describe('GpgBadges', () => {
.then(() => {
expect(document.querySelector('.js-loading-gpg-badge:empty')).toBe(null);
const spinners = document.querySelectorAll('.js-loading-gpg-badge i.fa.fa-spinner.fa-spin');
+
expect(spinners.length).toBe(1);
done();
})
@@ -82,6 +83,7 @@ describe('GpgBadges', () => {
.then(() => {
expect(document.querySelector('.js-loading-gpg-badge')).toBe(null);
const parentContainer = document.querySelector('.parent-container');
+
expect(parentContainer.innerHTML.trim()).toEqual(dummyBadgeHtml);
done();
})
diff --git a/spec/javascripts/graphs/stat_graph_contributors_graph_spec.js b/spec/javascripts/graphs/stat_graph_contributors_graph_spec.js
index d8a8c8cc260..563d134ca81 100644
--- a/spec/javascripts/graphs/stat_graph_contributors_graph_spec.js
+++ b/spec/javascripts/graphs/stat_graph_contributors_graph_spec.js
@@ -1,99 +1,119 @@
-/* eslint-disable quotes, jasmine/no-suite-dupes, vars-on-top, no-var */
+/* eslint-disable jasmine/no-suite-dupes, vars-on-top, no-var */
+
import { scaleLinear, scaleTime } from 'd3-scale';
import { timeParse } from 'd3-time-format';
-import { ContributorsGraph, ContributorsMasterGraph } from '~/pages/projects/graphs/show/stat_graph_contributors_graph';
+import {
+ ContributorsGraph,
+ ContributorsMasterGraph,
+} from '~/pages/projects/graphs/show/stat_graph_contributors_graph';
const d3 = { scaleLinear, scaleTime, timeParse };
-describe("ContributorsGraph", function () {
- describe("#set_x_domain", function () {
- it("set the x_domain", function () {
+describe('ContributorsGraph', function() {
+ describe('#set_x_domain', function() {
+ it('set the x_domain', function() {
ContributorsGraph.set_x_domain(20);
+
expect(ContributorsGraph.prototype.x_domain).toEqual(20);
});
});
- describe("#set_y_domain", function () {
- it("sets the y_domain", function () {
+ describe('#set_y_domain', function() {
+ it('sets the y_domain', function() {
ContributorsGraph.set_y_domain([{ commits: 30 }]);
+
expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30]);
});
});
- describe("#init_x_domain", function () {
- it("sets the initial x_domain", function () {
- ContributorsGraph.init_x_domain([{ date: "2013-01-31" }, { date: "2012-01-31" }]);
- expect(ContributorsGraph.prototype.x_domain).toEqual(["2012-01-31", "2013-01-31"]);
+ describe('#init_x_domain', function() {
+ it('sets the initial x_domain', function() {
+ ContributorsGraph.init_x_domain([{ date: '2013-01-31' }, { date: '2012-01-31' }]);
+
+ expect(ContributorsGraph.prototype.x_domain).toEqual(['2012-01-31', '2013-01-31']);
});
});
- describe("#init_y_domain", function () {
- it("sets the initial y_domain", function () {
+ describe('#init_y_domain', function() {
+ it('sets the initial y_domain', function() {
ContributorsGraph.init_y_domain([{ commits: 30 }]);
+
expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30]);
});
});
- describe("#init_domain", function () {
- it("calls init_x_domain and init_y_domain", function () {
- spyOn(ContributorsGraph, "init_x_domain");
- spyOn(ContributorsGraph, "init_y_domain");
+ describe('#init_domain', function() {
+ it('calls init_x_domain and init_y_domain', function() {
+ spyOn(ContributorsGraph, 'init_x_domain');
+ spyOn(ContributorsGraph, 'init_y_domain');
ContributorsGraph.init_domain();
+
expect(ContributorsGraph.init_x_domain).toHaveBeenCalled();
expect(ContributorsGraph.init_y_domain).toHaveBeenCalled();
});
});
- describe("#set_dates", function () {
- it("sets the dates", function () {
- ContributorsGraph.set_dates("2013-12-01");
- expect(ContributorsGraph.prototype.dates).toEqual("2013-12-01");
+ describe('#set_dates', function() {
+ it('sets the dates', function() {
+ ContributorsGraph.set_dates('2013-12-01');
+
+ expect(ContributorsGraph.prototype.dates).toEqual('2013-12-01');
});
});
- describe("#set_x_domain", function () {
- it("sets the instance's x domain using the prototype's x_domain", function () {
+ describe('#set_x_domain', function() {
+ it("sets the instance's x domain using the prototype's x_domain", function() {
ContributorsGraph.prototype.x_domain = 20;
var instance = new ContributorsGraph();
- instance.x = d3.scaleTime().range([0, 100]).clamp(true);
+ instance.x = d3
+ .scaleTime()
+ .range([0, 100])
+ .clamp(true);
spyOn(instance.x, 'domain');
instance.set_x_domain();
+
expect(instance.x.domain).toHaveBeenCalledWith(20);
});
});
- describe("#set_y_domain", function () {
- it("sets the instance's y domain using the prototype's y_domain", function () {
+ describe('#set_y_domain', function() {
+ it("sets the instance's y domain using the prototype's y_domain", function() {
ContributorsGraph.prototype.y_domain = 30;
var instance = new ContributorsGraph();
- instance.y = d3.scaleLinear().range([100, 0]).nice();
+ instance.y = d3
+ .scaleLinear()
+ .range([100, 0])
+ .nice();
spyOn(instance.y, 'domain');
instance.set_y_domain();
+
expect(instance.y.domain).toHaveBeenCalledWith(30);
});
});
- describe("#set_domain", function () {
- it("calls set_x_domain and set_y_domain", function () {
+ describe('#set_domain', function() {
+ it('calls set_x_domain and set_y_domain', function() {
var instance = new ContributorsGraph();
spyOn(instance, 'set_x_domain');
spyOn(instance, 'set_y_domain');
instance.set_domain();
+
expect(instance.set_x_domain).toHaveBeenCalled();
expect(instance.set_y_domain).toHaveBeenCalled();
});
});
- describe("#set_data", function () {
- it("sets the data", function () {
+ describe('#set_data', function() {
+ it('sets the data', function() {
var instance = new ContributorsGraph();
- instance.set_data("20");
- expect(instance.data).toEqual("20");
+ instance.set_data('20');
+
+ expect(instance.data).toEqual('20');
});
});
});
-describe("ContributorsMasterGraph", function () {
+describe('ContributorsMasterGraph', function() {
// TODO: fix or remove
// describe("#process_dates", function () {
// it("gets and parses dates", function () {
@@ -109,21 +129,23 @@ describe("ContributorsMasterGraph", function () {
// });
// });
- describe("#get_dates", function () {
- it("plucks the date field from data collection", function () {
+ describe('#get_dates', function() {
+ it('plucks the date field from data collection', function() {
var graph = new ContributorsMasterGraph();
- var data = [{ date: "2013-01-01" }, { date: "2012-12-15" }];
- expect(graph.get_dates(data)).toEqual(["2013-01-01", "2012-12-15"]);
+ var data = [{ date: '2013-01-01' }, { date: '2012-12-15' }];
+
+ expect(graph.get_dates(data)).toEqual(['2013-01-01', '2012-12-15']);
});
});
- describe("#parse_dates", function () {
- it("parses the dates", function () {
+ describe('#parse_dates', function() {
+ it('parses the dates', function() {
var graph = new ContributorsMasterGraph();
- var parseDate = d3.timeParse("%Y-%m-%d");
- var data = [{ date: "2013-01-01" }, { date: "2012-12-15" }];
+ var parseDate = d3.timeParse('%Y-%m-%d');
+ var data = [{ date: '2013-01-01' }, { date: '2012-12-15' }];
var correct = [{ date: parseDate(data[0].date) }, { date: parseDate(data[1].date) }];
graph.parse_dates(data);
+
expect(data).toEqual(correct);
});
});
diff --git a/spec/javascripts/graphs/stat_graph_contributors_spec.js b/spec/javascripts/graphs/stat_graph_contributors_spec.js
index e03114c1cc5..2ebb6845a8b 100644
--- a/spec/javascripts/graphs/stat_graph_contributors_spec.js
+++ b/spec/javascripts/graphs/stat_graph_contributors_spec.js
@@ -20,7 +20,9 @@ describe('ContributorsStatGraph', () => {
graph.change_date_header();
- expect(document.getElementById('date_header').innerText).toBe('31. Januar 2012 – 31. Januar 2013');
+ expect(document.getElementById('date_header').innerText).toBe(
+ '31. Januar 2012 – 31. Januar 2013',
+ );
});
});
});
diff --git a/spec/javascripts/graphs/stat_graph_contributors_util_spec.js b/spec/javascripts/graphs/stat_graph_contributors_util_spec.js
index 22a9afe1a9d..511b660c671 100644
--- a/spec/javascripts/graphs/stat_graph_contributors_util_spec.js
+++ b/spec/javascripts/graphs/stat_graph_contributors_util_spec.js
@@ -1,57 +1,86 @@
-/* eslint-disable quotes, no-var, camelcase, object-property-newline, comma-dangle, max-len, vars-on-top, quote-props */
+/* eslint-disable no-var, camelcase, vars-on-top */
import ContributorsStatGraphUtil from '~/pages/projects/graphs/show/stat_graph_contributors_util';
-describe("ContributorsStatGraphUtil", function () {
- describe("#parse_log", function () {
- it("returns a correctly parsed log", function () {
+describe('ContributorsStatGraphUtil', function() {
+ describe('#parse_log', function() {
+ it('returns a correctly parsed log', function() {
var fake_log = [
- { author_email: "karlo@email.com", author_name: "Karlo Soriano", date: "2013-05-09", additions: 471 },
- { author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 6, deletions: 1 },
- { author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 19, deletions: 3 },
- { author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 29, deletions: 3 }
+ {
+ author_email: 'karlo@email.com',
+ author_name: 'Karlo Soriano',
+ date: '2013-05-09',
+ additions: 471,
+ },
+ {
+ author_email: 'dzaporozhets@email.com',
+ author_name: 'Dmitriy Zaporozhets',
+ date: '2013-05-08',
+ additions: 6,
+ deletions: 1,
+ },
+ {
+ author_email: 'dzaporozhets@email.com',
+ author_name: 'Dmitriy Zaporozhets',
+ date: '2013-05-08',
+ additions: 19,
+ deletions: 3,
+ },
+ {
+ author_email: 'dzaporozhets@email.com',
+ author_name: 'Dmitriy Zaporozhets',
+ date: '2013-05-08',
+ additions: 29,
+ deletions: 3,
+ },
];
var correct_parsed_log = {
total: [
- { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 },
- { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
+ { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
+ { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
],
by_author: [
{
- author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 }
+ author_name: 'Karlo Soriano',
+ author_email: 'karlo@email.com',
+ '2013-05-09': { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
},
{
- author_name: "Dmitriy Zaporozhets", author_email: "dzaporozhets@email.com",
- "2013-05-08": { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
- }
- ]
+ author_name: 'Dmitriy Zaporozhets',
+ author_email: 'dzaporozhets@email.com',
+ '2013-05-08': { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
+ },
+ ],
};
+
expect(ContributorsStatGraphUtil.parse_log(fake_log)).toEqual(correct_parsed_log);
});
});
- describe("#store_data", function () {
- var fake_entry = { author: "Karlo Soriano", date: "2013-05-09", additions: 471 };
+ describe('#store_data', function() {
+ var fake_entry = { author: 'Karlo Soriano', date: '2013-05-09', additions: 471 };
var fake_total = {};
var fake_by_author = {};
- it("calls #store_commits", function () {
+ it('calls #store_commits', function() {
spyOn(ContributorsStatGraphUtil, 'store_commits');
ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author);
+
expect(ContributorsStatGraphUtil.store_commits).toHaveBeenCalled();
});
- it("calls #store_additions", function () {
+ it('calls #store_additions', function() {
spyOn(ContributorsStatGraphUtil, 'store_additions');
ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author);
+
expect(ContributorsStatGraphUtil.store_additions).toHaveBeenCalled();
});
- it("calls #store_deletions", function () {
+ it('calls #store_deletions', function() {
spyOn(ContributorsStatGraphUtil, 'store_deletions');
ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author);
+
expect(ContributorsStatGraphUtil.store_deletions).toHaveBeenCalled();
});
});
@@ -68,16 +97,18 @@ describe("ContributorsStatGraphUtil", function () {
// });
// });
- describe("#add", function () {
- it("adds 1 to current test_field in collection", function () {
+ describe('#add', function() {
+ it('adds 1 to current test_field in collection', function() {
var fake_collection = { test_field: 10 };
- ContributorsStatGraphUtil.add(fake_collection, "test_field", 1);
+ ContributorsStatGraphUtil.add(fake_collection, 'test_field', 1);
+
expect(fake_collection.test_field).toEqual(11);
});
- it("inits and adds 1 if test_field in collection is not defined", function () {
+ it('inits and adds 1 if test_field in collection is not defined', function() {
var fake_collection = {};
- ContributorsStatGraphUtil.add(fake_collection, "test_field", 1);
+ ContributorsStatGraphUtil.add(fake_collection, 'test_field', 1);
+
expect(fake_collection.test_field).toEqual(1);
});
});
@@ -106,111 +137,161 @@ describe("ContributorsStatGraphUtil", function () {
// });
// });
- describe("#add_date", function () {
- it("adds a date field to the collection", function () {
- var fake_date = "2013-10-02";
+ describe('#add_date', function() {
+ it('adds a date field to the collection', function() {
+ var fake_date = '2013-10-02';
var fake_collection = {};
ContributorsStatGraphUtil.add_date(fake_date, fake_collection);
- expect(fake_collection[fake_date].date).toEqual("2013-10-02");
+
+ expect(fake_collection[fake_date].date).toEqual('2013-10-02');
});
});
- describe("#add_author", function () {
- it("adds an author field to the collection", function () {
- var fake_author = { author_name: "Author", author_email: 'fake@email.com' };
+ describe('#add_author', function() {
+ it('adds an author field to the collection', function() {
+ var fake_author = { author_name: 'Author', author_email: 'fake@email.com' };
var fake_author_collection = {};
var fake_email_collection = {};
- ContributorsStatGraphUtil.add_author(fake_author, fake_author_collection, fake_email_collection);
- expect(fake_author_collection[fake_author.author_name].author_name).toEqual("Author");
- expect(fake_email_collection[fake_author.author_email].author_name).toEqual("Author");
+ ContributorsStatGraphUtil.add_author(
+ fake_author,
+ fake_author_collection,
+ fake_email_collection,
+ );
+
+ expect(fake_author_collection[fake_author.author_name].author_name).toEqual('Author');
+ expect(fake_email_collection[fake_author.author_email].author_name).toEqual('Author');
});
});
- describe("#get_total_data", function () {
- it("returns the collection sorted via specified field", function () {
+ describe('#get_total_data', function() {
+ it('returns the collection sorted via specified field', function() {
var fake_parsed_log = {
total: [
- { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 },
- { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
+ { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
+ { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
],
by_author: [
{
- author: "Karlo Soriano",
- "2013-05-09": { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 }
+ author: 'Karlo Soriano',
+ '2013-05-09': { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
},
{
- author: "Dmitriy Zaporozhets",
- "2013-05-08": { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
- }
- ]
+ author: 'Dmitriy Zaporozhets',
+ '2013-05-08': { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
+ },
+ ],
};
var correct_total_data = [
- { date: "2013-05-08", commits: 3 },
- { date: "2013-05-09", commits: 1 }
+ { date: '2013-05-08', commits: 3 },
+ { date: '2013-05-09', commits: 1 },
];
- expect(ContributorsStatGraphUtil.get_total_data(fake_parsed_log, "commits")).toEqual(correct_total_data);
+
+ expect(ContributorsStatGraphUtil.get_total_data(fake_parsed_log, 'commits')).toEqual(
+ correct_total_data,
+ );
});
});
- describe("#pick_field", function () {
- it("returns the collection with only the specified field and date", function () {
+ describe('#pick_field', function() {
+ it('returns the collection with only the specified field and date', function() {
var fake_parsed_log_total = [
- { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 },
- { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
+ { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
+ { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
];
- ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits");
- var correct_pick_field_data = [{ date: "2013-05-09", commits: 1 }, { date: "2013-05-08", commits: 3 }];
- expect(ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits")).toEqual(correct_pick_field_data);
+ ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, 'commits');
+ var correct_pick_field_data = [
+ { date: '2013-05-09', commits: 1 },
+ { date: '2013-05-08', commits: 3 },
+ ];
+
+ expect(ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, 'commits')).toEqual(
+ correct_pick_field_data,
+ );
});
});
- describe("#get_author_data", function () {
- it("returns the log by author sorted by specified field", function () {
+ describe('#get_author_data', function() {
+ it('returns the log by author sorted by specified field', function() {
var fake_parsed_log = {
total: [
- { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 },
- { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
+ { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
+ { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
],
by_author: [
{
- author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 }
+ author_name: 'Karlo Soriano',
+ author_email: 'karlo@email.com',
+ '2013-05-09': { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
},
{
- author_name: "Dmitriy Zaporozhets", author_email: "dzaporozhets@email.com",
- "2013-05-08": { date: "2013-05-08", additions: 54, deletions: 7, commits: 3 }
- }
- ]
+ author_name: 'Dmitriy Zaporozhets',
+ author_email: 'dzaporozhets@email.com',
+ '2013-05-08': { date: '2013-05-08', additions: 54, deletions: 7, commits: 3 },
+ },
+ ],
};
var correct_author_data = [
- { author_name: "Dmitriy Zaporozhets", author_email: "dzaporozhets@email.com", dates: { "2013-05-08": 3 }, deletions: 7, additions: 54, "commits": 3 },
- { author_name: "Karlo Soriano", author_email: "karlo@email.com", dates: { "2013-05-09": 1 }, deletions: 0, additions: 471, commits: 1 }
+ {
+ author_name: 'Dmitriy Zaporozhets',
+ author_email: 'dzaporozhets@email.com',
+ dates: { '2013-05-08': 3 },
+ deletions: 7,
+ additions: 54,
+ commits: 3,
+ },
+ {
+ author_name: 'Karlo Soriano',
+ author_email: 'karlo@email.com',
+ dates: { '2013-05-09': 1 },
+ deletions: 0,
+ additions: 471,
+ commits: 1,
+ },
];
- expect(ContributorsStatGraphUtil.get_author_data(fake_parsed_log, "commits")).toEqual(correct_author_data);
+
+ expect(ContributorsStatGraphUtil.get_author_data(fake_parsed_log, 'commits')).toEqual(
+ correct_author_data,
+ );
});
});
- describe("#parse_log_entry", function () {
- it("adds the corresponding info from the log entry to the author", function () {
- var fake_log_entry = { author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": { date: "2013-05-09", additions: 471, deletions: 0, commits: 1 }
+ describe('#parse_log_entry', function() {
+ it('adds the corresponding info from the log entry to the author', function() {
+ var fake_log_entry = {
+ author_name: 'Karlo Soriano',
+ author_email: 'karlo@email.com',
+ '2013-05-09': { date: '2013-05-09', additions: 471, deletions: 0, commits: 1 },
+ };
+ var correct_parsed_log = {
+ author_name: 'Karlo Soriano',
+ author_email: 'karlo@email.com',
+ dates: { '2013-05-09': 1 },
+ deletions: 0,
+ additions: 471,
+ commits: 1,
};
- var correct_parsed_log = { author_name: "Karlo Soriano", author_email: "karlo@email.com", dates: { "2013-05-09": 1 }, deletions: 0, additions: 471, commits: 1 };
- expect(ContributorsStatGraphUtil.parse_log_entry(fake_log_entry, 'commits', null)).toEqual(correct_parsed_log);
+
+ expect(ContributorsStatGraphUtil.parse_log_entry(fake_log_entry, 'commits', null)).toEqual(
+ correct_parsed_log,
+ );
});
});
- describe("#in_range", function () {
- var date = "2013-05-09";
- it("returns true if date_range is null", function () {
+ describe('#in_range', function() {
+ var date = '2013-05-09';
+ it('returns true if date_range is null', function() {
expect(ContributorsStatGraphUtil.in_range(date, null)).toEqual(true);
});
- it("returns true if date is in range", function () {
- var date_range = [new Date("2013-01-01"), new Date("2013-12-12")];
+
+ it('returns true if date is in range', function() {
+ var date_range = [new Date('2013-01-01'), new Date('2013-12-12')];
+
expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(true);
});
- it("returns false if date is not in range", function () {
- var date_range = [new Date("1999-12-01"), new Date("2000-12-01")];
+
+ it('returns false if date is not in range', function() {
+ var date_range = [new Date('1999-12-01'), new Date('2000-12-01')];
+
expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(false);
});
});
diff --git a/spec/javascripts/groups/components/app_spec.js b/spec/javascripts/groups/components/app_spec.js
index 03d4b472b87..d832441dc93 100644
--- a/spec/javascripts/groups/components/app_spec.js
+++ b/spec/javascripts/groups/components/app_spec.js
@@ -9,9 +9,14 @@ import GroupsStore from '~/groups/store/groups_store';
import GroupsService from '~/groups/service/groups_service';
import {
- mockEndpoint, mockGroups, mockSearchedGroups,
- mockRawPageInfo, mockParentGroupItem, mockRawChildren,
- mockChildren, mockPageInfo,
+ mockEndpoint,
+ mockGroups,
+ mockSearchedGroups,
+ mockRawPageInfo,
+ mockParentGroupItem,
+ mockRawChildren,
+ mockChildren,
+ mockPageInfo,
} from '../mock_data';
const createComponent = (hideProjects = false) => {
@@ -19,6 +24,8 @@ const createComponent = (hideProjects = false) => {
const store = new GroupsStore(false);
const service = new GroupsService(mockEndpoint);
+ store.state.pageInfo = mockPageInfo;
+
return new Component({
propsData: {
store,
@@ -28,22 +35,23 @@ const createComponent = (hideProjects = false) => {
});
};
-const returnServicePromise = (data, failed) => new Promise((resolve, reject) => {
- if (failed) {
- reject(data);
- } else {
- resolve({
- json() {
- return data;
- },
- });
- }
-});
+const returnServicePromise = (data, failed) =>
+ new Promise((resolve, reject) => {
+ if (failed) {
+ reject(data);
+ } else {
+ resolve({
+ json() {
+ return data;
+ },
+ });
+ }
+ });
describe('AppComponent', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
Vue.component('group-folder', groupFolderComponent);
Vue.component('group-item', groupItemComponent);
@@ -68,6 +76,7 @@ describe('AppComponent', () => {
spyOn(vm.store, 'getGroups');
const { groups } = vm;
+
expect(vm.store.getGroups).toHaveBeenCalled();
expect(groups).not.toBeDefined();
});
@@ -78,6 +87,7 @@ describe('AppComponent', () => {
spyOn(vm.store, 'getPaginationInfo');
const { pageInfo } = vm;
+
expect(vm.store.getPaginationInfo).toHaveBeenCalled();
expect(pageInfo).not.toBeDefined();
});
@@ -94,7 +104,7 @@ describe('AppComponent', () => {
});
describe('fetchGroups', () => {
- it('should call `getGroups` with all the params provided', (done) => {
+ it('should call `getGroups` with all the params provided', done => {
spyOn(vm.service, 'getGroups').and.returnValue(returnServicePromise(mockGroups));
vm.fetchGroups({
@@ -110,8 +120,10 @@ describe('AppComponent', () => {
}, 0);
});
- it('should set headers to store for building pagination info when called with `updatePagination`', (done) => {
- spyOn(vm.service, 'getGroups').and.returnValue(returnServicePromise({ headers: mockRawPageInfo }));
+ it('should set headers to store for building pagination info when called with `updatePagination`', done => {
+ spyOn(vm.service, 'getGroups').and.returnValue(
+ returnServicePromise({ headers: mockRawPageInfo }),
+ );
spyOn(vm, 'updatePagination');
vm.fetchGroups({ updatePagination: true });
@@ -122,7 +134,7 @@ describe('AppComponent', () => {
}, 0);
});
- it('should show flash error when request fails', (done) => {
+ it('should show flash error when request fails', done => {
spyOn(vm.service, 'getGroups').and.returnValue(returnServicePromise(null, true));
spyOn($, 'scrollTo');
spyOn(window, 'Flash');
@@ -138,12 +150,13 @@ describe('AppComponent', () => {
});
describe('fetchAllGroups', () => {
- it('should fetch default set of groups', (done) => {
+ it('should fetch default set of groups', done => {
spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockGroups));
spyOn(vm, 'updatePagination').and.callThrough();
spyOn(vm, 'updateGroups').and.callThrough();
vm.fetchAllGroups();
+
expect(vm.isLoading).toBe(true);
expect(vm.fetchGroups).toHaveBeenCalled();
setTimeout(() => {
@@ -153,11 +166,12 @@ describe('AppComponent', () => {
}, 0);
});
- it('should fetch matching set of groups when app is loaded with search query', (done) => {
+ it('should fetch matching set of groups when app is loaded with search query', done => {
spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockSearchedGroups));
spyOn(vm, 'updateGroups').and.callThrough();
vm.fetchAllGroups();
+
expect(vm.fetchGroups).toHaveBeenCalledWith({
page: null,
filterGroupsBy: null,
@@ -173,7 +187,7 @@ describe('AppComponent', () => {
});
describe('fetchPage', () => {
- it('should fetch groups for provided page details and update window state', (done) => {
+ it('should fetch groups for provided page details and update window state', done => {
spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockGroups));
spyOn(vm, 'updateGroups').and.callThrough();
const mergeUrlParams = spyOnDependency(appComponent, 'mergeUrlParams').and.callThrough();
@@ -181,6 +195,7 @@ describe('AppComponent', () => {
spyOn($, 'scrollTo');
vm.fetchPage(2, null, null, true);
+
expect(vm.isLoading).toBe(true);
expect(vm.fetchGroups).toHaveBeenCalledWith({
page: 2,
@@ -193,9 +208,14 @@ describe('AppComponent', () => {
expect(vm.isLoading).toBe(false);
expect($.scrollTo).toHaveBeenCalledWith(0);
expect(mergeUrlParams).toHaveBeenCalledWith({ page: 2 }, jasmine.any(String));
- expect(window.history.replaceState).toHaveBeenCalledWith({
- page: jasmine.any(String),
- }, jasmine.any(String), jasmine.any(String));
+ expect(window.history.replaceState).toHaveBeenCalledWith(
+ {
+ page: jasmine.any(String),
+ },
+ jasmine.any(String),
+ jasmine.any(String),
+ );
+
expect(vm.updateGroups).toHaveBeenCalled();
done();
}, 0);
@@ -211,11 +231,12 @@ describe('AppComponent', () => {
groupItem.isChildrenLoading = false;
});
- it('should fetch children of given group and expand it if group is collapsed and children are not loaded', (done) => {
+ it('should fetch children of given group and expand it if group is collapsed and children are not loaded', done => {
spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockRawChildren));
spyOn(vm.store, 'setGroupChildren');
vm.toggleChildren(groupItem);
+
expect(groupItem.isChildrenLoading).toBe(true);
expect(vm.fetchGroups).toHaveBeenCalledWith({
parentId: groupItem.id,
@@ -231,6 +252,7 @@ describe('AppComponent', () => {
groupItem.children = mockRawChildren;
vm.toggleChildren(groupItem);
+
expect(vm.fetchGroups).not.toHaveBeenCalled();
expect(groupItem.isOpen).toBe(true);
});
@@ -240,14 +262,16 @@ describe('AppComponent', () => {
groupItem.isOpen = true;
vm.toggleChildren(groupItem);
+
expect(vm.fetchGroups).not.toHaveBeenCalled();
expect(groupItem.isOpen).toBe(false);
});
- it('should set `isChildrenLoading` back to `false` if load request fails', (done) => {
+ it('should set `isChildrenLoading` back to `false` if load request fails', done => {
spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise({}, true));
vm.toggleChildren(groupItem);
+
expect(groupItem.isChildrenLoading).toBe(true);
setTimeout(() => {
expect(groupItem.isChildrenLoading).toBe(false);
@@ -259,20 +283,26 @@ describe('AppComponent', () => {
describe('showLeaveGroupModal', () => {
it('caches candidate group (as props) which is to be left', () => {
const group = Object.assign({}, mockParentGroupItem);
+
expect(vm.targetGroup).toBe(null);
expect(vm.targetParentGroup).toBe(null);
vm.showLeaveGroupModal(group, mockParentGroupItem);
+
expect(vm.targetGroup).not.toBe(null);
expect(vm.targetParentGroup).not.toBe(null);
});
it('updates props which show modal confirmation dialog', () => {
const group = Object.assign({}, mockParentGroupItem);
+
expect(vm.showModal).toBe(false);
expect(vm.groupLeaveConfirmationMessage).toBe('');
vm.showLeaveGroupModal(group, mockParentGroupItem);
+
expect(vm.showModal).toBe(true);
- expect(vm.groupLeaveConfirmationMessage).toBe(`Are you sure you want to leave the "${group.fullName}" group?`);
+ expect(vm.groupLeaveConfirmationMessage).toBe(
+ `Are you sure you want to leave the "${group.fullName}" group?`,
+ );
});
});
@@ -280,8 +310,10 @@ describe('AppComponent', () => {
it('hides modal confirmation which is shown before leaving the group', () => {
const group = Object.assign({}, mockParentGroupItem);
vm.showLeaveGroupModal(group, mockParentGroupItem);
+
expect(vm.showModal).toBe(true);
vm.hideLeaveGroupModal();
+
expect(vm.showModal).toBe(false);
});
});
@@ -299,7 +331,7 @@ describe('AppComponent', () => {
vm.targetParentGroup = groupItem;
});
- it('hides modal confirmation leave group and remove group item from tree', (done) => {
+ it('hides modal confirmation leave group and remove group item from tree', done => {
const notice = `You left the "${childGroupItem.fullName}" group.`;
spyOn(vm.service, 'leaveGroup').and.returnValue(returnServicePromise({ notice }));
spyOn(vm.store, 'removeGroup').and.callThrough();
@@ -307,6 +339,7 @@ describe('AppComponent', () => {
spyOn($, 'scrollTo');
vm.leaveGroup();
+
expect(vm.showModal).toBe(false);
expect(vm.targetGroup.isBeingRemoved).toBe(true);
expect(vm.service.leaveGroup).toHaveBeenCalledWith(vm.targetGroup.leavePath);
@@ -318,13 +351,16 @@ describe('AppComponent', () => {
}, 0);
});
- it('should show error flash message if request failed to leave group', (done) => {
+ it('should show error flash message if request failed to leave group', done => {
const message = 'An error occurred. Please try again.';
- spyOn(vm.service, 'leaveGroup').and.returnValue(returnServicePromise({ status: 500 }, true));
+ spyOn(vm.service, 'leaveGroup').and.returnValue(
+ returnServicePromise({ status: 500 }, true),
+ );
spyOn(vm.store, 'removeGroup').and.callThrough();
spyOn(window, 'Flash');
vm.leaveGroup();
+
expect(vm.targetGroup.isBeingRemoved).toBe(true);
expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath);
setTimeout(() => {
@@ -335,13 +371,16 @@ describe('AppComponent', () => {
}, 0);
});
- it('should show appropriate error flash message if request forbids to leave group', (done) => {
+ it('should show appropriate error flash message if request forbids to leave group', done => {
const message = 'Failed to leave the group. Please make sure you are not the only owner.';
- spyOn(vm.service, 'leaveGroup').and.returnValue(returnServicePromise({ status: 403 }, true));
+ spyOn(vm.service, 'leaveGroup').and.returnValue(
+ returnServicePromise({ status: 403 }, true),
+ );
spyOn(vm.store, 'removeGroup').and.callThrough();
spyOn(window, 'Flash');
vm.leaveGroup(childGroupItem, groupItem);
+
expect(vm.targetGroup.isBeingRemoved).toBe(true);
expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath);
setTimeout(() => {
@@ -358,6 +397,7 @@ describe('AppComponent', () => {
spyOn(vm.store, 'setPaginationInfo');
vm.updatePagination(mockRawPageInfo);
+
expect(vm.store.setPaginationInfo).toHaveBeenCalledWith(mockRawPageInfo);
});
});
@@ -367,6 +407,7 @@ describe('AppComponent', () => {
spyOn(vm.store, 'setGroups');
vm.updateGroups(mockGroups);
+
expect(vm.store.setGroups).toHaveBeenCalledWith(mockGroups);
});
@@ -374,21 +415,24 @@ describe('AppComponent', () => {
spyOn(vm.store, 'setSearchedGroups');
vm.updateGroups(mockGroups, true);
+
expect(vm.store.setSearchedGroups).toHaveBeenCalledWith(mockGroups);
});
it('should set `isSearchEmpty` prop based on groups count', () => {
vm.updateGroups(mockGroups);
+
expect(vm.isSearchEmpty).toBe(false);
vm.updateGroups([]);
+
expect(vm.isSearchEmpty).toBe(true);
});
});
});
describe('created', () => {
- it('should bind event listeners on eventHub', (done) => {
+ it('should bind event listeners on eventHub', done => {
spyOn(eventHub, '$on');
const newVm = createComponent();
@@ -405,21 +449,21 @@ describe('AppComponent', () => {
});
});
- it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `false`', (done) => {
+ it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `false`', done => {
const newVm = createComponent();
newVm.$mount();
Vue.nextTick(() => {
- expect(newVm.searchEmptyMessage).toBe('Sorry, no groups or projects matched your search');
+ expect(newVm.searchEmptyMessage).toBe('No groups or projects matched your search');
newVm.$destroy();
done();
});
});
- it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `true`', (done) => {
+ it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `true`', done => {
const newVm = createComponent(true);
newVm.$mount();
Vue.nextTick(() => {
- expect(newVm.searchEmptyMessage).toBe('Sorry, no groups matched your search');
+ expect(newVm.searchEmptyMessage).toBe('No groups matched your search');
newVm.$destroy();
done();
});
@@ -427,7 +471,7 @@ describe('AppComponent', () => {
});
describe('beforeDestroy', () => {
- it('should unbind event listeners on eventHub', (done) => {
+ it('should unbind event listeners on eventHub', done => {
spyOn(eventHub, '$off');
const newVm = createComponent();
@@ -454,7 +498,7 @@ describe('AppComponent', () => {
vm.$destroy();
});
- it('should render loading icon', (done) => {
+ it('should render loading icon', done => {
vm.isLoading = true;
Vue.nextTick(() => {
expect(vm.$el.querySelector('.loading-animation')).toBeDefined();
@@ -463,21 +507,21 @@ describe('AppComponent', () => {
});
});
- it('should render groups tree', (done) => {
+ it('should render groups tree', done => {
vm.store.state.groups = [mockParentGroupItem];
vm.isLoading = false;
- vm.store.state.pageInfo = mockPageInfo;
Vue.nextTick(() => {
expect(vm.$el.querySelector('.groups-list-tree-container')).toBeDefined();
done();
});
});
- it('renders modal confirmation dialog', (done) => {
+ it('renders modal confirmation dialog', done => {
vm.groupLeaveConfirmationMessage = 'Are you sure you want to leave the "foo" group?';
vm.showModal = true;
Vue.nextTick(() => {
const modalDialogEl = vm.$el.querySelector('.modal');
+
expect(modalDialogEl).not.toBe(null);
expect(modalDialogEl.querySelector('.modal-title').innerText.trim()).toBe('Are you sure?');
expect(modalDialogEl.querySelector('.btn.btn-warning').innerText.trim()).toBe('Leave');
diff --git a/spec/javascripts/groups/components/group_folder_spec.js b/spec/javascripts/groups/components/group_folder_spec.js
index 4eb198595fb..fdfd1b82bd8 100644
--- a/spec/javascripts/groups/components/group_folder_spec.js
+++ b/spec/javascripts/groups/components/group_folder_spec.js
@@ -18,7 +18,7 @@ const createComponent = (groups = mockGroups, parentGroup = mockParentGroupItem)
describe('GroupFolderComponent', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
Vue.component('group-item', groupItemComponent);
vm = createComponent();
@@ -59,6 +59,7 @@ describe('GroupFolderComponent', () => {
const newVm = createComponent(mockGroups, parentGroup);
newVm.$mount();
+
expect(newVm.$el.querySelector('li.group-row a.has-more-items')).toBeDefined();
newVm.$destroy();
});
diff --git a/spec/javascripts/groups/components/group_item_spec.js b/spec/javascripts/groups/components/group_item_spec.js
index d0cac5efc40..4d6d0c895b6 100644
--- a/spec/javascripts/groups/components/group_item_spec.js
+++ b/spec/javascripts/groups/components/group_item_spec.js
@@ -17,7 +17,7 @@ const createComponent = (group = mockParentGroupItem, parentGroup = mockChildren
describe('GroupItemComponent', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
Vue.component('group-folder', groupFolderComponent);
vm = createComponent();
@@ -44,8 +44,8 @@ describe('GroupItemComponent', () => {
const { rowClass } = vm;
expect(Object.keys(rowClass).length).toBe(classes.length);
- Object.keys(rowClass).forEach((className) => {
- expect(classes.indexOf(className) > -1).toBeTruthy();
+ Object.keys(rowClass).forEach(className => {
+ expect(classes.indexOf(className)).toBeGreaterThan(-1);
});
});
});
@@ -57,11 +57,13 @@ describe('GroupItemComponent', () => {
group.childrenCount = 5;
newVm = createComponent(group);
+
expect(newVm.hasChildren).toBeTruthy();
newVm.$destroy();
group.childrenCount = 0;
newVm = createComponent(group);
+
expect(newVm.hasChildren).toBeFalsy();
newVm.$destroy();
});
@@ -74,11 +76,13 @@ describe('GroupItemComponent', () => {
group.avatarUrl = null;
newVm = createComponent(group);
+
expect(newVm.hasAvatar).toBeFalsy();
newVm.$destroy();
group.avatarUrl = '/uploads/group_avatar.png';
newVm = createComponent(group);
+
expect(newVm.hasAvatar).toBeTruthy();
newVm.$destroy();
});
@@ -91,11 +95,13 @@ describe('GroupItemComponent', () => {
group.type = 'group';
newVm = createComponent(group);
+
expect(newVm.isGroup).toBeTruthy();
newVm.$destroy();
group.type = 'project';
newVm = createComponent(group);
+
expect(newVm.isGroup).toBeFalsy();
newVm.$destroy();
});
@@ -127,10 +133,11 @@ describe('GroupItemComponent', () => {
spyOn(eventHub, '$emit');
vm.onClickRowGroup(event);
+
expect(eventHub.$emit).toHaveBeenCalledWith('toggleChildren', vm.group);
});
- it('should navigate page to group homepage if group does not have any children present', (done) => {
+ it('should navigate page to group homepage if group does not have any children present', done => {
const group = Object.assign({}, mockParentGroupItem);
group.childrenCount = 0;
const newVm = createComponent(group);
diff --git a/spec/javascripts/groups/components/groups_spec.js b/spec/javascripts/groups/components/groups_spec.js
index 793c4909d89..6ba4fe23a69 100644
--- a/spec/javascripts/groups/components/groups_spec.js
+++ b/spec/javascripts/groups/components/groups_spec.js
@@ -21,7 +21,7 @@ const createComponent = (searchEmpty = false) => {
describe('GroupsComponent', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
Vue.component('group-folder', groupFolderComponent);
Vue.component('group-item', groupItemComponent);
@@ -42,23 +42,30 @@ describe('GroupsComponent', () => {
spyOn(eventHub, '$emit').and.stub();
vm.change(2);
- expect(eventHub.$emit).toHaveBeenCalledWith('fetchPage', 2, jasmine.any(Object), jasmine.any(Object), jasmine.any(Object));
+
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'fetchPage',
+ 2,
+ jasmine.any(Object),
+ jasmine.any(Object),
+ jasmine.any(Object),
+ );
});
});
});
describe('template', () => {
- it('should render component template correctly', (done) => {
+ it('should render component template correctly', done => {
Vue.nextTick(() => {
expect(vm.$el.querySelector('.groups-list-tree-container')).toBeDefined();
expect(vm.$el.querySelector('.group-list-tree')).toBeDefined();
expect(vm.$el.querySelector('.gl-pagination')).toBeDefined();
- expect(vm.$el.querySelectorAll('.has-no-search-results').length === 0).toBeTruthy();
+ expect(vm.$el.querySelectorAll('.has-no-search-results').length).toBe(0);
done();
});
});
- it('should render empty search message when `searchEmpty` is `true`', (done) => {
+ it('should render empty search message when `searchEmpty` is `true`', done => {
vm.searchEmpty = true;
Vue.nextTick(() => {
expect(vm.$el.querySelector('.has-no-search-results')).toBeDefined();
diff --git a/spec/javascripts/groups/components/item_actions_spec.js b/spec/javascripts/groups/components/item_actions_spec.js
index 15fd37ebcd2..3f66e7fd6f2 100644
--- a/spec/javascripts/groups/components/item_actions_spec.js
+++ b/spec/javascripts/groups/components/item_actions_spec.js
@@ -30,7 +30,12 @@ describe('ItemActionsComponent', () => {
it('emits `showLeaveGroupModal` event with `group` and `parentGroup` props', () => {
spyOn(eventHub, '$emit');
vm.onLeaveGroup();
- expect(eventHub.$emit).toHaveBeenCalledWith('showLeaveGroupModal', vm.group, vm.parentGroup);
+
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'showLeaveGroupModal',
+ vm.group,
+ vm.parentGroup,
+ );
});
});
});
@@ -46,6 +51,7 @@ describe('ItemActionsComponent', () => {
const newVm = createComponent(group);
const editBtn = newVm.$el.querySelector('a.edit-group');
+
expect(editBtn).toBeDefined();
expect(editBtn.classList.contains('no-expand')).toBeTruthy();
expect(editBtn.getAttribute('href')).toBe(group.editPath);
@@ -63,6 +69,7 @@ describe('ItemActionsComponent', () => {
const newVm = createComponent(group);
const leaveBtn = newVm.$el.querySelector('a.leave-group');
+
expect(leaveBtn).toBeDefined();
expect(leaveBtn.classList.contains('no-expand')).toBeTruthy();
expect(leaveBtn.getAttribute('href')).toBe(group.leavePath);
diff --git a/spec/javascripts/groups/components/item_caret_spec.js b/spec/javascripts/groups/components/item_caret_spec.js
index 36f838a104f..6e430dbcdb2 100644
--- a/spec/javascripts/groups/components/item_caret_spec.js
+++ b/spec/javascripts/groups/components/item_caret_spec.js
@@ -16,6 +16,7 @@ describe('ItemCaretComponent', () => {
describe('template', () => {
it('should render component template correctly', () => {
const vm = createComponent();
+
expect(vm.$el.classList.contains('folder-caret')).toBeTruthy();
expect(vm.$el.querySelectorAll('svg').length).toBe(1);
vm.$destroy();
@@ -23,12 +24,14 @@ describe('ItemCaretComponent', () => {
it('should render caret down icon if `isGroupOpen` prop is `true`', () => {
const vm = createComponent(true);
+
expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('angle-down');
vm.$destroy();
});
it('should render caret right icon if `isGroupOpen` prop is `false`', () => {
const vm = createComponent();
+
expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('angle-right');
vm.$destroy();
});
diff --git a/spec/javascripts/groups/components/item_stats_spec.js b/spec/javascripts/groups/components/item_stats_spec.js
index ee7ee18259e..00d6a4817d7 100644
--- a/spec/javascripts/groups/components/item_stats_spec.js
+++ b/spec/javascripts/groups/components/item_stats_spec.js
@@ -22,9 +22,10 @@ describe('ItemStatsComponent', () => {
describe('computed', () => {
describe('visibilityIcon', () => {
it('should return icon class based on `item.visibility` value', () => {
- Object.keys(VISIBILITY_TYPE_ICON).forEach((visibility) => {
+ Object.keys(VISIBILITY_TYPE_ICON).forEach(visibility => {
const item = Object.assign({}, mockParentGroupItem, { visibility });
const vm = createComponent(item);
+
expect(vm.visibilityIcon).toBe(VISIBILITY_TYPE_ICON[visibility]);
vm.$destroy();
});
@@ -33,24 +34,26 @@ describe('ItemStatsComponent', () => {
describe('visibilityTooltip', () => {
it('should return tooltip string for Group based on `item.visibility` value', () => {
- Object.keys(GROUP_VISIBILITY_TYPE).forEach((visibility) => {
+ Object.keys(GROUP_VISIBILITY_TYPE).forEach(visibility => {
const item = Object.assign({}, mockParentGroupItem, {
visibility,
type: ITEM_TYPE.GROUP,
});
const vm = createComponent(item);
+
expect(vm.visibilityTooltip).toBe(GROUP_VISIBILITY_TYPE[visibility]);
vm.$destroy();
});
});
it('should return tooltip string for Project based on `item.visibility` value', () => {
- Object.keys(PROJECT_VISIBILITY_TYPE).forEach((visibility) => {
+ Object.keys(PROJECT_VISIBILITY_TYPE).forEach(visibility => {
const item = Object.assign({}, mockParentGroupItem, {
visibility,
type: ITEM_TYPE.PROJECT,
});
const vm = createComponent(item);
+
expect(vm.visibilityTooltip).toBe(PROJECT_VISIBILITY_TYPE[visibility]);
vm.$destroy();
});
@@ -64,11 +67,13 @@ describe('ItemStatsComponent', () => {
item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.PROJECT });
vm = createComponent(item);
+
expect(vm.isProject).toBeTruthy();
vm.$destroy();
item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.GROUP });
vm = createComponent(item);
+
expect(vm.isProject).toBeFalsy();
vm.$destroy();
});
@@ -81,11 +86,13 @@ describe('ItemStatsComponent', () => {
item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.GROUP });
vm = createComponent(item);
+
expect(vm.isGroup).toBeTruthy();
vm.$destroy();
item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.PROJECT });
vm = createComponent(item);
+
expect(vm.isGroup).toBeFalsy();
vm.$destroy();
});
@@ -105,9 +112,10 @@ describe('ItemStatsComponent', () => {
const vm = createComponent();
const visibilityIconEl = vm.$el.querySelector('.item-visibility');
+
expect(visibilityIconEl).not.toBe(null);
expect(visibilityIconEl.dataset.originalTitle).toBe(vm.visibilityTooltip);
- expect(visibilityIconEl.querySelectorAll('svg').length > 0).toBeTruthy();
+ expect(visibilityIconEl.querySelectorAll('svg').length).toBeGreaterThan(0);
vm.$destroy();
});
@@ -120,10 +128,11 @@ describe('ItemStatsComponent', () => {
const vm = createComponent(item);
const projectStarIconEl = vm.$el.querySelector('.project-stars');
- expect(projectStarIconEl).not.toBe(null);
- expect(projectStarIconEl.querySelectorAll('svg').length > 0).toBeTruthy();
- expect(projectStarIconEl.querySelectorAll('.stat-value').length > 0).toBeTruthy();
- expect(vm.$el.querySelectorAll('.last-updated').length > 0).toBeTruthy();
+
+ expect(projectStarIconEl).not.toBeNull();
+ expect(projectStarIconEl.querySelectorAll('svg').length).toBeGreaterThan(0);
+ expect(projectStarIconEl.querySelectorAll('.stat-value').length).toBeGreaterThan(0);
+ expect(vm.$el.querySelectorAll('.last-updated').length).toBeGreaterThan(0);
vm.$destroy();
});
diff --git a/spec/javascripts/groups/components/item_stats_value_spec.js b/spec/javascripts/groups/components/item_stats_value_spec.js
index 5e35ae4d36c..ea8edcf49cd 100644
--- a/spec/javascripts/groups/components/item_stats_value_spec.js
+++ b/spec/javascripts/groups/components/item_stats_value_spec.js
@@ -29,11 +29,13 @@ describe('ItemStatsValueComponent', () => {
describe('isValuePresent', () => {
it('returns true if non-empty `value` is present', () => {
vm = createComponent(Object.assign({}, itemConfig, { value: 10 }));
+
expect(vm.isValuePresent).toBeTruthy();
});
it('returns false if empty `value` is present', () => {
vm = createComponent(itemConfig);
+
expect(vm.isValuePresent).toBeFalsy();
});
@@ -57,8 +59,8 @@ describe('ItemStatsValueComponent', () => {
it('renders component element correctly', () => {
expect(vm.$el.classList.contains('number-subgroups')).toBeTruthy();
- expect(vm.$el.querySelectorAll('svg').length > 0).toBeTruthy();
- expect(vm.$el.querySelectorAll('.stat-value').length > 0).toBeTruthy();
+ expect(vm.$el.querySelectorAll('svg').length).toBeGreaterThan(0);
+ expect(vm.$el.querySelectorAll('.stat-value').length).toBeGreaterThan(0);
});
it('renders element tooltip correctly', () => {
diff --git a/spec/javascripts/groups/components/item_type_icon_spec.js b/spec/javascripts/groups/components/item_type_icon_spec.js
index 24380689b29..73108512222 100644
--- a/spec/javascripts/groups/components/item_type_icon_spec.js
+++ b/spec/javascripts/groups/components/item_type_icon_spec.js
@@ -18,6 +18,7 @@ describe('ItemTypeIconComponent', () => {
it('should render component template correctly', () => {
const vm = createComponent();
vm.$mount();
+
expect(vm.$el.classList.contains('item-type-icon')).toBeTruthy();
vm.$destroy();
});
@@ -27,11 +28,13 @@ describe('ItemTypeIconComponent', () => {
vm = createComponent(ITEM_TYPE.GROUP, true);
vm.$mount();
+
expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('folder-open');
vm.$destroy();
vm = createComponent(ITEM_TYPE.GROUP);
vm.$mount();
+
expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('folder');
vm.$destroy();
});
@@ -41,11 +44,13 @@ describe('ItemTypeIconComponent', () => {
vm = createComponent(ITEM_TYPE.PROJECT);
vm.$mount();
+
expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('bookmark');
vm.$destroy();
vm = createComponent(ITEM_TYPE.GROUP);
vm.$mount();
+
expect(vm.$el.querySelector('use').getAttribute('xlink:href')).not.toContain('bookmark');
vm.$destroy();
});
diff --git a/spec/javascripts/groups/mock_data.js b/spec/javascripts/groups/mock_data.js
index 8bf6417487d..2fdc844f3d9 100644
--- a/spec/javascripts/groups/mock_data.js
+++ b/spec/javascripts/groups/mock_data.js
@@ -340,7 +340,8 @@ export const mockSearchedGroups = [
{
id: 17,
name: 'v4.4',
- description: 'Voluptatem qui ea error aperiam veritatis doloremque consequatur temporibus.',
+ description:
+ 'Voluptatem qui ea error aperiam veritatis doloremque consequatur temporibus.',
visibility: 'public',
full_name: 'platform / hardware / bsp / kernel / common / v4.4',
relative_path: '/platform/hardware/bsp/kernel/common/v4.4',
diff --git a/spec/javascripts/groups/service/groups_service_spec.js b/spec/javascripts/groups/service/groups_service_spec.js
index 20bb63687f7..339e5131615 100644
--- a/spec/javascripts/groups/service/groups_service_spec.js
+++ b/spec/javascripts/groups/service/groups_service_spec.js
@@ -24,9 +24,11 @@ describe('GroupsService', () => {
};
service.getGroups(55, 2, 'git', 'created_asc', true);
+
expect(service.groups.get).toHaveBeenCalledWith({ parent_id: 55 });
service.getGroups(null, 2, 'git', 'created_asc', true);
+
expect(service.groups.get).toHaveBeenCalledWith(queryParams);
});
});
@@ -36,6 +38,7 @@ describe('GroupsService', () => {
spyOn(Vue.http, 'delete').and.stub();
service.leaveGroup(mockParentGroupItem.leavePath);
+
expect(Vue.http.delete).toHaveBeenCalledWith(mockParentGroupItem.leavePath);
});
});
diff --git a/spec/javascripts/groups/store/groups_store_spec.js b/spec/javascripts/groups/store/groups_store_spec.js
index d74f38f476e..38de4b89f31 100644
--- a/spec/javascripts/groups/store/groups_store_spec.js
+++ b/spec/javascripts/groups/store/groups_store_spec.js
@@ -1,7 +1,9 @@
import GroupsStore from '~/groups/store/groups_store';
import {
- mockGroups, mockSearchedGroups,
- mockParentGroupItem, mockRawChildren,
+ mockGroups,
+ mockSearchedGroups,
+ mockParentGroupItem,
+ mockRawChildren,
mockRawPageInfo,
} from '../mock_data';
@@ -11,12 +13,14 @@ describe('ProjectsStore', () => {
let store;
store = new GroupsStore();
+
expect(Object.keys(store.state).length).toBe(2);
expect(Array.isArray(store.state.groups)).toBeTruthy();
expect(Object.keys(store.state.pageInfo).length).toBe(0);
expect(store.hideProjects).not.toBeDefined();
store = new GroupsStore(true);
+
expect(store.hideProjects).toBeTruthy();
});
});
@@ -27,9 +31,10 @@ describe('ProjectsStore', () => {
spyOn(store, 'formatGroupItem').and.callThrough();
store.setGroups(mockGroups);
+
expect(store.state.groups.length).toBe(mockGroups.length);
expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object));
- expect(Object.keys(store.state.groups[0]).indexOf('fullName') > -1).toBeTruthy();
+ expect(Object.keys(store.state.groups[0]).indexOf('fullName')).toBeGreaterThan(-1);
});
});
@@ -39,10 +44,13 @@ describe('ProjectsStore', () => {
spyOn(store, 'formatGroupItem').and.callThrough();
store.setSearchedGroups(mockSearchedGroups);
+
expect(store.state.groups.length).toBe(mockSearchedGroups.length);
expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object));
- expect(Object.keys(store.state.groups[0]).indexOf('fullName') > -1).toBeTruthy();
- expect(Object.keys(store.state.groups[0].children[0]).indexOf('fullName') > -1).toBeTruthy();
+ expect(Object.keys(store.state.groups[0]).indexOf('fullName')).toBeGreaterThan(-1);
+ expect(Object.keys(store.state.groups[0].children[0]).indexOf('fullName')).toBeGreaterThan(
+ -1,
+ );
});
});
@@ -52,9 +60,10 @@ describe('ProjectsStore', () => {
spyOn(store, 'formatGroupItem').and.callThrough();
store.setGroupChildren(mockParentGroupItem, mockRawChildren);
+
expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object));
expect(mockParentGroupItem.children.length).toBe(1);
- expect(Object.keys(mockParentGroupItem.children[0]).indexOf('fullName') > -1).toBeTruthy();
+ expect(Object.keys(mockParentGroupItem.children[0]).indexOf('fullName')).toBeGreaterThan(-1);
expect(mockParentGroupItem.isOpen).toBeTruthy();
expect(mockParentGroupItem.isChildrenLoading).toBeFalsy();
});
@@ -65,6 +74,7 @@ describe('ProjectsStore', () => {
const store = new GroupsStore();
store.setPaginationInfo(mockRawPageInfo);
+
expect(store.state.pageInfo.perPage).toBe(10);
expect(store.state.pageInfo.page).toBe(10);
expect(store.state.pageInfo.total).toBe(10);
@@ -81,14 +91,16 @@ describe('ProjectsStore', () => {
store = new GroupsStore();
updatedGroupItem = store.formatGroupItem(mockRawChildren[0]);
- expect(Object.keys(updatedGroupItem).indexOf('fullName') > -1).toBeTruthy();
+
+ expect(Object.keys(updatedGroupItem).indexOf('fullName')).toBeGreaterThan(-1);
expect(updatedGroupItem.childrenCount).toBe(mockRawChildren[0].children_count);
expect(updatedGroupItem.isChildrenLoading).toBe(false);
expect(updatedGroupItem.isBeingRemoved).toBe(false);
store = new GroupsStore(true);
updatedGroupItem = store.formatGroupItem(mockRawChildren[0]);
- expect(Object.keys(updatedGroupItem).indexOf('fullName') > -1).toBeTruthy();
+
+ expect(Object.keys(updatedGroupItem).indexOf('fullName')).toBeGreaterThan(-1);
expect(updatedGroupItem.childrenCount).toBe(mockRawChildren[0].subgroup_count);
});
});
@@ -104,6 +116,7 @@ describe('ProjectsStore', () => {
const childItem = store.state.groups[0].children[0];
store.removeGroup(childItem, store.state.groups[0]);
+
expect(store.state.groups[0].children.length).toBe(0);
});
});
diff --git a/spec/javascripts/header_spec.js b/spec/javascripts/header_spec.js
index 16ac438f7ac..2fe34e5a76f 100644
--- a/spec/javascripts/header_spec.js
+++ b/spec/javascripts/header_spec.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import initTodoToggle from '~/header';
-describe('Header', function () {
+describe('Header', function() {
const todosPendingCount = '.todos-count';
const fixtureTemplate = 'issues/open-issue.html.raw';
@@ -21,16 +21,19 @@ describe('Header', function () {
it('should update todos-count after receiving the todo:toggle event', () => {
triggerToggle('5');
+
expect($(todosPendingCount).text()).toEqual('5');
});
it('should hide todos-count when it is 0', () => {
triggerToggle('0');
+
expect(isTodosCountHidden()).toEqual(true);
});
it('should show todos-count when it is more than 0', () => {
triggerToggle('10');
+
expect(isTodosCountHidden()).toEqual(false);
});
diff --git a/spec/javascripts/helpers/class_spec_helper_spec.js b/spec/javascripts/helpers/class_spec_helper_spec.js
index fa104ae5bcd..f6268b0fb6d 100644
--- a/spec/javascripts/helpers/class_spec_helper_spec.js
+++ b/spec/javascripts/helpers/class_spec_helper_spec.js
@@ -2,11 +2,13 @@
import './class_spec_helper';
-describe('ClassSpecHelper', function () {
+describe('ClassSpecHelper', function() {
describe('itShouldBeAStaticMethod', () => {
beforeEach(() => {
class TestClass {
- instanceMethod() { this.prop = 'val'; }
+ instanceMethod() {
+ this.prop = 'val';
+ }
static staticMethod() {}
}
diff --git a/spec/javascripts/helpers/locale_helper.js b/spec/javascripts/helpers/locale_helper.js
index 99e6ce61234..80047b06003 100644
--- a/spec/javascripts/helpers/locale_helper.js
+++ b/spec/javascripts/helpers/locale_helper.js
@@ -1,6 +1,6 @@
/* eslint-disable import/prefer-default-export */
-export const setLanguage = (languageCode) => {
+export const setLanguage = languageCode => {
const htmlElement = document.querySelector('html');
if (languageCode) {
diff --git a/spec/javascripts/helpers/set_timeout_promise_helper.js b/spec/javascripts/helpers/set_timeout_promise_helper.js
index 1478073413c..47087619187 100644
--- a/spec/javascripts/helpers/set_timeout_promise_helper.js
+++ b/spec/javascripts/helpers/set_timeout_promise_helper.js
@@ -1,3 +1,4 @@
-export default (time = 0) => new Promise((resolve) => {
- setTimeout(resolve, time);
-});
+export default (time = 0) =>
+ new Promise(resolve => {
+ setTimeout(resolve, time);
+ });
diff --git a/spec/javascripts/helpers/user_mock_data_helper.js b/spec/javascripts/helpers/user_mock_data_helper.js
index f6c3ce5aecc..6999fa1f8a1 100644
--- a/spec/javascripts/helpers/user_mock_data_helper.js
+++ b/spec/javascripts/helpers/user_mock_data_helper.js
@@ -2,14 +2,12 @@ export default {
createNumberRandomUsers(numberUsers) {
const users = [];
for (let i = 0; i < numberUsers; i += 1) {
- users.push(
- {
- avatar: 'https://gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- id: (i + 1),
- name: `GitLab User ${i}`,
- username: `gitlab${i}`,
- },
- );
+ users.push({
+ avatar: 'https://gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: i + 1,
+ name: `GitLab User ${i}`,
+ username: `gitlab${i}`,
+ });
}
return users;
},
diff --git a/spec/javascripts/helpers/vue_mount_component_helper.js b/spec/javascripts/helpers/vue_mount_component_helper.js
index 1057f0aca3e..6848c95d95d 100644
--- a/spec/javascripts/helpers/vue_mount_component_helper.js
+++ b/spec/javascripts/helpers/vue_mount_component_helper.js
@@ -1,3 +1,5 @@
+import Vue from 'vue';
+
const mountComponent = (Component, props = {}, el = null) =>
new Component({
propsData: props,
@@ -25,4 +27,12 @@ export const mountComponentWithSlots = (Component, { props, slots }) => {
return component.$mount();
};
+/**
+ * Mount a component with the given render method.
+ *
+ * This helps with inserting slots that need to be compiled.
+ */
+export const mountComponentWithRender = (render, el = null) =>
+ mountComponent(Vue.extend({ render }), {}, el);
+
export default mountComponent;
diff --git a/spec/javascripts/helpers/vue_resource_helper.js b/spec/javascripts/helpers/vue_resource_helper.js
index 70b7ec4e574..0f58af09933 100644
--- a/spec/javascripts/helpers/vue_resource_helper.js
+++ b/spec/javascripts/helpers/vue_resource_helper.js
@@ -1,10 +1,11 @@
// eslint-disable-next-line import/prefer-default-export
export const headersInterceptor = (request, next) => {
- next((response) => {
+ next(response => {
const headers = {};
response.headers.forEach((value, key) => {
headers[key] = value;
});
+ // eslint-disable-next-line no-param-reassign
response.headers = headers;
});
};
diff --git a/spec/javascripts/ide/components/branches/item_spec.js b/spec/javascripts/ide/components/branches/item_spec.js
index 8b756c8f168..36b6736bfd4 100644
--- a/spec/javascripts/ide/components/branches/item_spec.js
+++ b/spec/javascripts/ide/components/branches/item_spec.js
@@ -29,13 +29,16 @@ describe('IDE branch item', () => {
it('renders branch name and timeago', () => {
const timeText = getTimeago().format(TEST_BRANCH.committedDate);
+
expect(vm.$el).toContainText(TEST_BRANCH.name);
expect(vm.$el.querySelector('time')).toHaveText(timeText);
expect(vm.$el.querySelector('.ic-mobile-issue-close')).toBe(null);
});
it('renders link to branch', () => {
- const expectedHref = router.resolve(`/project/${TEST_PROJECT_ID}/edit/${TEST_BRANCH.name}`).href;
+ const expectedHref = router.resolve(`/project/${TEST_PROJECT_ID}/edit/${TEST_BRANCH.name}`)
+ .href;
+
expect(vm.$el).toMatch('a');
expect(vm.$el).toHaveAttr('href', expectedHref);
});
diff --git a/spec/javascripts/ide/components/branches/search_list_spec.js b/spec/javascripts/ide/components/branches/search_list_spec.js
index c3f84ba1c24..72a3c2d5dcd 100644
--- a/spec/javascripts/ide/components/branches/search_list_spec.js
+++ b/spec/javascripts/ide/components/branches/search_list_spec.js
@@ -62,8 +62,9 @@ describe('IDE branches search list', () => {
});
it('renders list', () => {
- const elementText = Array.from(vm.$el.querySelectorAll('li strong'))
- .map(x => x.textContent.trim());
+ const elementText = Array.from(vm.$el.querySelectorAll('li strong')).map(x =>
+ x.textContent.trim(),
+ );
expect(elementText).toEqual(testBranches.map(x => x.name));
});
diff --git a/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js b/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
index 41d8bfff7e7..bf48d7bfdad 100644
--- a/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
+++ b/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
@@ -30,11 +30,7 @@ describe('Multi-file editor commit sidebar list item', () => {
});
it('renders file path', () => {
- expect(vm.$el.querySelector('.multi-file-commit-list-path').textContent.trim()).toBe(f.path);
- });
-
- it('renders actionn button', () => {
- expect(vm.$el.querySelector('.multi-file-discard-btn')).not.toBeNull();
+ expect(vm.$el.querySelector('.multi-file-commit-list-path').textContent).toContain(f.path);
});
it('opens a closed file in the editor when clicking the file path', done => {
diff --git a/spec/javascripts/ide/components/commit_sidebar/message_field_spec.js b/spec/javascripts/ide/components/commit_sidebar/message_field_spec.js
index 942cc19f46d..af67991eadd 100644
--- a/spec/javascripts/ide/components/commit_sidebar/message_field_spec.js
+++ b/spec/javascripts/ide/components/commit_sidebar/message_field_spec.js
@@ -36,8 +36,7 @@ describe('IDE commit message field', () => {
it('removed is-focused class on blur', done => {
vm.$el.querySelector('textarea').focus();
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelector('.is-focused')).not.toBeNull();
@@ -70,12 +69,12 @@ describe('IDE commit message field', () => {
it('does not highlight less than 50 characters', done => {
vm.text = 'text less than 50 chars';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelector('.highlights span').textContent).toContain(
'text less than 50 chars',
);
+
expect(vm.$el.querySelector('mark').style.display).toBe('none');
})
.then(done)
@@ -86,12 +85,12 @@ describe('IDE commit message field', () => {
vm.text =
'text less than 50 chars that should not highlighted. text more than 50 should be highlighted';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelector('.highlights span').textContent).toContain(
'text less than 50 chars that should not highlighte',
);
+
expect(vm.$el.querySelector('mark').style.display).not.toBe('none');
expect(vm.$el.querySelector('mark').textContent).toBe(
'd. text more than 50 should be highlighted',
@@ -106,8 +105,7 @@ describe('IDE commit message field', () => {
it('does not highlight body text less tan 72 characters', done => {
vm.text = 'subject line\nbody content';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelectorAll('.highlights span').length).toBe(2);
expect(vm.$el.querySelectorAll('mark')[1].style.display).toBe('none');
@@ -120,8 +118,7 @@ describe('IDE commit message field', () => {
vm.text =
'subject line\nbody content that will be highlighted when it is more than 72 characters in length';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelectorAll('.highlights span').length).toBe(2);
expect(vm.$el.querySelectorAll('mark')[1].style.display).not.toBe('none');
@@ -135,8 +132,7 @@ describe('IDE commit message field', () => {
vm.text =
'text less than 50 chars that should not highlighted\nbody content that will be highlighted when it is more than 72 characters in length';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.$el.querySelectorAll('.highlights span').length).toBe(2);
expect(vm.$el.querySelectorAll('mark').length).toBe(2);
@@ -154,8 +150,7 @@ describe('IDE commit message field', () => {
it('updates transform of highlights', done => {
vm.text = 'subject line\n\n\n\n\n\n\n\n\n\n\nbody content';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$el.querySelector('textarea').scrollTo(0, 50);
diff --git a/spec/javascripts/ide/components/commit_sidebar/stage_button_spec.js b/spec/javascripts/ide/components/commit_sidebar/stage_button_spec.js
index a5b906da8a1..e09ccbe2a63 100644
--- a/spec/javascripts/ide/components/commit_sidebar/stage_button_spec.js
+++ b/spec/javascripts/ide/components/commit_sidebar/stage_button_spec.js
@@ -29,7 +29,7 @@ describe('IDE stage file button', () => {
});
it('renders button to discard & stage', () => {
- expect(vm.$el.querySelectorAll('.btn').length).toBe(2);
+ expect(vm.$el.querySelectorAll('.btn-blank').length).toBe(2);
});
it('calls store with stage button', () => {
@@ -39,7 +39,7 @@ describe('IDE stage file button', () => {
});
it('calls store with discard button', () => {
- vm.$el.querySelector('.dropdown-menu button').click();
+ vm.$el.querySelector('.btn-danger').click();
expect(vm.discardFileChanges).toHaveBeenCalledWith(f.path);
});
diff --git a/spec/javascripts/ide/components/file_finder/index_spec.js b/spec/javascripts/ide/components/file_finder/index_spec.js
index 4f208e946d2..4d934f92f72 100644
--- a/spec/javascripts/ide/components/file_finder/index_spec.js
+++ b/spec/javascripts/ide/components/file_finder/index_spec.js
@@ -85,8 +85,7 @@ describe('IDE File finder item spec', () => {
it('clear button resets searchText', done => {
vm.searchText = 'index';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$el.querySelector('.dropdown-input-clear').click();
})
@@ -102,8 +101,7 @@ describe('IDE File finder item spec', () => {
spyOn(vm.$refs.searchInput, 'focus');
vm.searchText = 'index';
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$el.querySelector('.dropdown-input-clear').click();
})
@@ -178,8 +176,7 @@ describe('IDE File finder item spec', () => {
vm.searchText = 'test';
vm.$store.state.fileFindVisible = true;
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$store.state.fileFindVisible = false;
})
diff --git a/spec/javascripts/ide/components/file_row_extra_spec.js b/spec/javascripts/ide/components/file_row_extra_spec.js
new file mode 100644
index 00000000000..c93a939ad71
--- /dev/null
+++ b/spec/javascripts/ide/components/file_row_extra_spec.js
@@ -0,0 +1,159 @@
+import Vue from 'vue';
+import { createStore } from '~/ide/stores';
+import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import FileRowExtra from '~/ide/components/file_row_extra.vue';
+import { file, resetStore } from '../helpers';
+
+describe('IDE extra file row component', () => {
+ let Component;
+ let vm;
+ let unstagedFilesCount = 0;
+ let stagedFilesCount = 0;
+ let changesCount = 0;
+
+ beforeAll(() => {
+ Component = Vue.extend(FileRowExtra);
+ });
+
+ beforeEach(() => {
+ vm = createComponentWithStore(Component, createStore(), {
+ file: {
+ ...file('test'),
+ },
+ mouseOver: false,
+ });
+
+ spyOnProperty(vm, 'getUnstagedFilesCountForPath').and.returnValue(() => unstagedFilesCount);
+ spyOnProperty(vm, 'getStagedFilesCountForPath').and.returnValue(() => stagedFilesCount);
+ spyOnProperty(vm, 'getChangesInFolder').and.returnValue(() => changesCount);
+
+ vm.$mount();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ resetStore(vm.$store);
+
+ stagedFilesCount = 0;
+ unstagedFilesCount = 0;
+ changesCount = 0;
+ });
+
+ describe('folderChangesTooltip', () => {
+ it('returns undefined when changes count is 0', () => {
+ expect(vm.folderChangesTooltip).toBe(undefined);
+ });
+
+ it('returns unstaged changes text', () => {
+ changesCount = 1;
+ unstagedFilesCount = 1;
+
+ expect(vm.folderChangesTooltip).toBe('1 unstaged change');
+ });
+
+ it('returns staged changes text', () => {
+ changesCount = 1;
+ stagedFilesCount = 1;
+
+ expect(vm.folderChangesTooltip).toBe('1 staged change');
+ });
+
+ it('returns staged and unstaged changes text', () => {
+ changesCount = 1;
+ stagedFilesCount = 1;
+ unstagedFilesCount = 1;
+
+ expect(vm.folderChangesTooltip).toBe('1 unstaged and 1 staged changes');
+ });
+ });
+
+ describe('show tree changes count', () => {
+ it('does not show for blobs', () => {
+ vm.file.type = 'blob';
+
+ expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);
+ });
+
+ it('does not show when changes count is 0', () => {
+ vm.file.type = 'tree';
+
+ expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);
+ });
+
+ it('does not show when tree is open', done => {
+ vm.file.type = 'tree';
+ vm.file.opened = true;
+ changesCount = 1;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);
+
+ done();
+ });
+ });
+
+ it('shows for trees with changes', done => {
+ vm.file.type = 'tree';
+ vm.file.opened = false;
+ changesCount = 1;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.ide-tree-changes')).not.toBe(null);
+
+ done();
+ });
+ });
+ });
+
+ describe('changes file icon', () => {
+ it('hides when file is not changed', () => {
+ expect(vm.$el.querySelector('.file-changed-icon')).toBe(null);
+ });
+
+ it('shows when file is changed', done => {
+ vm.file.changed = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);
+
+ done();
+ });
+ });
+
+ it('shows when file is staged', done => {
+ vm.file.staged = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);
+
+ done();
+ });
+ });
+
+ it('shows when file is a tempFile', done => {
+ vm.file.tempFile = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);
+
+ done();
+ });
+ });
+ });
+
+ describe('merge request icon', () => {
+ it('hides when not a merge request change', () => {
+ expect(vm.$el.querySelector('.ic-git-merge')).toBe(null);
+ });
+
+ it('shows when a merge request change', done => {
+ vm.file.mrChange = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.ic-git-merge')).not.toBe(null);
+
+ done();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/ide/components/file_templates/bar_spec.js b/spec/javascripts/ide/components/file_templates/bar_spec.js
new file mode 100644
index 00000000000..a688f7f69a6
--- /dev/null
+++ b/spec/javascripts/ide/components/file_templates/bar_spec.js
@@ -0,0 +1,117 @@
+import Vue from 'vue';
+import { createStore } from '~/ide/stores';
+import Bar from '~/ide/components/file_templates/bar.vue';
+import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { resetStore, file } from '../../helpers';
+
+describe('IDE file templates bar component', () => {
+ let Component;
+ let vm;
+
+ beforeAll(() => {
+ Component = Vue.extend(Bar);
+ });
+
+ beforeEach(() => {
+ const store = createStore();
+
+ store.state.openFiles.push({
+ ...file('file'),
+ opened: true,
+ active: true,
+ });
+
+ vm = mountComponentWithStore(Component, { store });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ resetStore(vm.$store);
+ });
+
+ describe('template type dropdown', () => {
+ it('renders dropdown component', () => {
+ expect(vm.$el.querySelector('.dropdown').textContent).toContain('Choose a type');
+ });
+
+ it('calls setSelectedTemplateType when clicking item', () => {
+ spyOn(vm, 'setSelectedTemplateType').and.stub();
+
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ expect(vm.setSelectedTemplateType).toHaveBeenCalledWith({
+ name: '.gitlab-ci.yml',
+ key: 'gitlab_ci_ymls',
+ });
+ });
+ });
+
+ describe('template dropdown', () => {
+ beforeEach(done => {
+ vm.$store.state.fileTemplates.templates = [
+ {
+ name: 'test',
+ },
+ ];
+ vm.$store.state.fileTemplates.selectedTemplateType = {
+ name: '.gitlab-ci.yml',
+ key: 'gitlab_ci_ymls',
+ };
+
+ vm.$nextTick(done);
+ });
+
+ it('renders dropdown component', () => {
+ expect(vm.$el.querySelectorAll('.dropdown')[1].textContent).toContain('Choose a template');
+ });
+
+ it('calls fetchTemplate on click', () => {
+ spyOn(vm, 'fetchTemplate').and.stub();
+
+ vm.$el
+ .querySelectorAll('.dropdown-content')[1]
+ .querySelector('button')
+ .click();
+
+ expect(vm.fetchTemplate).toHaveBeenCalledWith({
+ name: 'test',
+ });
+ });
+ });
+
+ it('shows undo button if updateSuccess is true', done => {
+ vm.$store.state.fileTemplates.updateSuccess = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.btn-default').style.display).not.toBe('none');
+
+ done();
+ });
+ });
+
+ it('calls undoFileTemplate when clicking undo button', () => {
+ spyOn(vm, 'undoFileTemplate').and.stub();
+
+ vm.$el.querySelector('.btn-default').click();
+
+ expect(vm.undoFileTemplate).toHaveBeenCalled();
+ });
+
+ it('calls setSelectedTemplateType if activeFile name matches a template', done => {
+ const fileName = '.gitlab-ci.yml';
+
+ spyOn(vm, 'setSelectedTemplateType');
+ vm.$store.state.openFiles[0].name = fileName;
+
+ vm.setInitialType();
+
+ vm.$nextTick(() => {
+ expect(vm.setSelectedTemplateType).toHaveBeenCalledWith({
+ name: fileName,
+ key: 'gitlab_ci_ymls',
+ });
+
+ done();
+ });
+ });
+});
diff --git a/spec/javascripts/ide/components/file_templates/dropdown_spec.js b/spec/javascripts/ide/components/file_templates/dropdown_spec.js
new file mode 100644
index 00000000000..898796f4fa0
--- /dev/null
+++ b/spec/javascripts/ide/components/file_templates/dropdown_spec.js
@@ -0,0 +1,201 @@
+import $ from 'jquery';
+import Vue from 'vue';
+import { createStore } from '~/ide/stores';
+import Dropdown from '~/ide/components/file_templates/dropdown.vue';
+import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { resetStore } from '../../helpers';
+
+describe('IDE file templates dropdown component', () => {
+ let Component;
+ let vm;
+
+ beforeAll(() => {
+ Component = Vue.extend(Dropdown);
+ });
+
+ beforeEach(() => {
+ const store = createStore();
+
+ vm = createComponentWithStore(Component, store, {
+ label: 'Test',
+ }).$mount();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ resetStore(vm.$store);
+ });
+
+ describe('async', () => {
+ beforeEach(() => {
+ vm.isAsyncData = true;
+ });
+
+ it('calls async store method on Bootstrap dropdown event', () => {
+ spyOn(vm, 'fetchTemplateTypes').and.stub();
+
+ $(vm.$el).trigger('show.bs.dropdown');
+
+ expect(vm.fetchTemplateTypes).toHaveBeenCalled();
+ });
+
+ it('renders templates when async', done => {
+ vm.$store.state.fileTemplates.templates = [
+ {
+ name: 'test',
+ },
+ ];
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.dropdown-content').textContent).toContain('test');
+
+ done();
+ });
+ });
+
+ it('renders loading icon when isLoading is true', done => {
+ vm.$store.state.fileTemplates.isLoading = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.loading-container')).not.toBe(null);
+
+ done();
+ });
+ });
+
+ it('searches template data', () => {
+ vm.$store.state.fileTemplates.templates = [
+ {
+ name: 'test',
+ },
+ ];
+ vm.searchable = true;
+ vm.search = 'hello';
+
+ expect(vm.outputData).toEqual([]);
+ });
+
+ it('does not filter data is searchable is false', () => {
+ vm.$store.state.fileTemplates.templates = [
+ {
+ name: 'test',
+ },
+ ];
+ vm.search = 'hello';
+
+ expect(vm.outputData).toEqual([
+ {
+ name: 'test',
+ },
+ ]);
+ });
+
+ it('calls clickItem on click', done => {
+ spyOn(vm, 'clickItem').and.stub();
+
+ vm.$store.state.fileTemplates.templates = [
+ {
+ name: 'test',
+ },
+ ];
+
+ vm.$nextTick(() => {
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ expect(vm.clickItem).toHaveBeenCalledWith({
+ name: 'test',
+ });
+
+ done();
+ });
+ });
+
+ it('renders input when searchable is true', done => {
+ vm.searchable = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.dropdown-input')).not.toBe(null);
+
+ done();
+ });
+ });
+
+ it('does not render input when searchable is true & showLoading is true', done => {
+ vm.searchable = true;
+ vm.$store.state.fileTemplates.isLoading = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.dropdown-input')).toBe(null);
+
+ done();
+ });
+ });
+ });
+
+ describe('sync', () => {
+ beforeEach(done => {
+ vm.data = [
+ {
+ name: 'test sync',
+ },
+ ];
+
+ vm.$nextTick(done);
+ });
+
+ it('renders props data', () => {
+ expect(vm.$el.querySelector('.dropdown-content').textContent).toContain('test sync');
+ });
+
+ it('renders input when searchable is true', done => {
+ vm.searchable = true;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.dropdown-input')).not.toBe(null);
+
+ done();
+ });
+ });
+
+ it('calls clickItem on click', done => {
+ spyOn(vm, 'clickItem').and.stub();
+
+ vm.$nextTick(() => {
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ expect(vm.clickItem).toHaveBeenCalledWith({
+ name: 'test sync',
+ });
+
+ done();
+ });
+ });
+
+ it('searches template data', () => {
+ vm.searchable = true;
+ vm.search = 'hello';
+
+ expect(vm.outputData).toEqual([]);
+ });
+
+ it('does not filter data is searchable is false', () => {
+ vm.search = 'hello';
+
+ expect(vm.outputData).toEqual([
+ {
+ name: 'test sync',
+ },
+ ]);
+ });
+
+ it('renders dropdown title', done => {
+ vm.title = 'Test title';
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.dropdown-title').textContent).toContain('Test title');
+
+ done();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/ide/components/ide_spec.js b/spec/javascripts/ide/components/ide_spec.js
index 49b8e934cdd..c02a1ad246c 100644
--- a/spec/javascripts/ide/components/ide_spec.js
+++ b/spec/javascripts/ide/components/ide_spec.js
@@ -84,8 +84,7 @@ describe('ide component', () => {
it('calls toggleFileFinder on `t` key press', done => {
Mousetrap.trigger('t');
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.toggleFileFinder).toHaveBeenCalled();
})
@@ -96,8 +95,7 @@ describe('ide component', () => {
it('calls toggleFileFinder on `command+p` key press', done => {
Mousetrap.trigger('command+p');
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.toggleFileFinder).toHaveBeenCalled();
})
@@ -108,8 +106,7 @@ describe('ide component', () => {
it('calls toggleFileFinder on `ctrl+p` key press', done => {
Mousetrap.trigger('ctrl+p');
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
expect(vm.toggleFileFinder).toHaveBeenCalled();
})
diff --git a/spec/javascripts/ide/components/ide_status_bar_spec.js b/spec/javascripts/ide/components/ide_status_bar_spec.js
index 0e93c5193a1..ab032b4cb98 100644
--- a/spec/javascripts/ide/components/ide_status_bar_spec.js
+++ b/spec/javascripts/ide/components/ide_status_bar_spec.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import store from '~/ide/stores';
import ideStatusBar from '~/ide/components/ide_status_bar.vue';
+import { rightSidebarViews } from '~/ide/constants';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import { resetStore } from '../helpers';
import { projectData } from '../mock_data';
@@ -49,9 +50,11 @@ describe('ideStatusBar', () => {
expect(vm.commitAgeUpdate).not.toHaveBeenCalled();
jasmine.clock().tick(1100);
+
expect(vm.commitAgeUpdate.calls.count()).toEqual(1);
jasmine.clock().tick(1000);
+
expect(vm.commitAgeUpdate.calls.count()).toEqual(2);
});
});
@@ -64,7 +67,7 @@ describe('ideStatusBar', () => {
describe('pipeline status', () => {
it('opens right sidebar on clicking icon', done => {
- spyOn(vm, 'setRightPane');
+ spyOn(vm, 'openRightPane');
Vue.set(vm.$store.state.pipelines, 'latestPipeline', {
details: {
status: {
@@ -75,12 +78,11 @@ describe('ideStatusBar', () => {
},
});
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$el.querySelector('.ide-status-pipeline button').click();
- expect(vm.setRightPane).toHaveBeenCalledWith('pipelines-list');
+ expect(vm.openRightPane).toHaveBeenCalledWith(rightSidebarViews.pipelines);
})
.then(done)
.catch(done.fail);
diff --git a/spec/javascripts/ide/components/jobs/detail_spec.js b/spec/javascripts/ide/components/jobs/detail_spec.js
index 8f8d4b9709e..a4e6b81acba 100644
--- a/spec/javascripts/ide/components/jobs/detail_spec.js
+++ b/spec/javascripts/ide/components/jobs/detail_spec.js
@@ -109,8 +109,7 @@ describe('IDE jobs detail view', () => {
vm.scrollPos = 1;
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => vm.$el.querySelector('.btn-scroll').click())
.then(() => vm.$nextTick())
.then(() => {
diff --git a/spec/javascripts/ide/components/merge_requests/item_spec.js b/spec/javascripts/ide/components/merge_requests/item_spec.js
index 750948cae3c..155a247defb 100644
--- a/spec/javascripts/ide/components/merge_requests/item_spec.js
+++ b/spec/javascripts/ide/components/merge_requests/item_spec.js
@@ -29,7 +29,10 @@ describe('IDE merge request item', () => {
});
it('renders link with href', () => {
- const expectedHref = router.resolve(`/project/${vm.item.projectPathWithNamespace}/merge_requests/${vm.item.iid}`).href;
+ const expectedHref = router.resolve(
+ `/project/${vm.item.projectPathWithNamespace}/merge_requests/${vm.item.iid}`,
+ ).href;
+
expect(vm.$el).toMatch('a');
expect(vm.$el).toHaveAttr('href', expectedHref);
});
diff --git a/spec/javascripts/ide/components/merge_requests/list_spec.js b/spec/javascripts/ide/components/merge_requests/list_spec.js
index c761315444c..55e4f46d9ca 100644
--- a/spec/javascripts/ide/components/merge_requests/list_spec.js
+++ b/spec/javascripts/ide/components/merge_requests/list_spec.js
@@ -118,8 +118,9 @@ describe('IDE merge requests list', () => {
vm.$nextTick()
.then(() => {
const expectedSearchTypes = vm.$options.searchTypes.map(x => x.label);
- const renderedSearchTypes = Array.from(vm.$el.querySelectorAll('li'))
- .map(x => x.textContent.trim());
+ const renderedSearchTypes = Array.from(vm.$el.querySelectorAll('li')).map(x =>
+ x.textContent.trim(),
+ );
expect(renderedSearchTypes).toEqual(expectedSearchTypes);
})
diff --git a/spec/javascripts/ide/components/new_dropdown/index_spec.js b/spec/javascripts/ide/components/new_dropdown/index_spec.js
index 8a8cbd2cee4..83e530f0a6a 100644
--- a/spec/javascripts/ide/components/new_dropdown/index_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/index_spec.js
@@ -36,6 +36,7 @@ describe('new dropdown component', () => {
it('renders new file, upload and new directory links', () => {
const buttons = vm.$el.querySelectorAll('.dropdown-menu button');
+
expect(buttons[0].textContent.trim()).toBe('New file');
expect(buttons[1].textContent.trim()).toBe('Upload file');
expect(buttons[2].textContent.trim()).toBe('New directory');
diff --git a/spec/javascripts/ide/components/new_dropdown/upload_spec.js b/spec/javascripts/ide/components/new_dropdown/upload_spec.js
index 9c76500cfe5..878e17ac805 100644
--- a/spec/javascripts/ide/components/new_dropdown/upload_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/upload_spec.js
@@ -21,23 +21,29 @@ describe('new dropdown upload', () => {
vm.$destroy();
});
- describe('readFile', () => {
- beforeEach(() => {
- spyOn(FileReader.prototype, 'readAsText');
- spyOn(FileReader.prototype, 'readAsDataURL');
- });
+ describe('openFile', () => {
+ it('calls for each file', () => {
+ const files = ['test', 'test2', 'test3'];
- it('calls readAsText for text files', () => {
- const file = {
- type: 'text/html',
- };
+ spyOn(vm, 'readFile');
+ spyOnProperty(vm.$refs.fileUpload, 'files').and.returnValue(files);
- vm.readFile(file);
+ vm.openFile();
+
+ expect(vm.readFile.calls.count()).toBe(3);
- expect(FileReader.prototype.readAsText).toHaveBeenCalledWith(file);
+ files.forEach((file, i) => {
+ expect(vm.readFile.calls.argsFor(i)).toEqual([file]);
+ });
+ });
+ });
+
+ describe('readFile', () => {
+ beforeEach(() => {
+ spyOn(FileReader.prototype, 'readAsDataURL');
});
- it('calls readAsDataURL for non-text files', () => {
+ it('calls readAsDataURL for all files', () => {
const file = {
type: 'images/png',
};
@@ -49,32 +55,37 @@ describe('new dropdown upload', () => {
});
describe('createFile', () => {
- const target = {
- result: 'content',
+ const textTarget = {
+ result: 'base64,cGxhaW4gdGV4dA==',
};
const binaryTarget = {
- result: 'base64,base64content',
+ result: 'base64,w4I=',
+ };
+ const textFile = {
+ name: 'textFile',
+ type: 'text/plain',
};
- const file = {
- name: 'file',
+ const binaryFile = {
+ name: 'binaryFile',
+ type: 'image/png',
};
- it('creates new file', () => {
- vm.createFile(target, file, true);
+ it('creates file in plain text (without encoding) if the file content is plain text', () => {
+ vm.createFile(textTarget, textFile);
expect(vm.$emit).toHaveBeenCalledWith('create', {
- name: file.name,
+ name: textFile.name,
type: 'blob',
- content: target.result,
+ content: 'plain text',
base64: false,
});
});
it('splits content on base64 if binary', () => {
- vm.createFile(binaryTarget, file, false);
+ vm.createFile(binaryTarget, binaryFile);
expect(vm.$emit).toHaveBeenCalledWith('create', {
- name: file.name,
+ name: binaryFile.name,
type: 'blob',
content: binaryTarget.result.split('base64,')[1],
base64: true,
diff --git a/spec/javascripts/ide/components/panes/right_spec.js b/spec/javascripts/ide/components/panes/right_spec.js
index c75975d2af6..4899f850cf4 100644
--- a/spec/javascripts/ide/components/panes/right_spec.js
+++ b/spec/javascripts/ide/components/panes/right_spec.js
@@ -25,7 +25,8 @@ describe('IDE right pane', () => {
describe('active', () => {
it('renders merge request button as active', done => {
- vm.$store.state.rightPane = rightSidebarViews.mergeRequestInfo;
+ vm.$store.state.rightPane.isOpen = true;
+ vm.$store.state.rightPane.currentView = rightSidebarViews.mergeRequestInfo.name;
vm.$store.state.currentMergeRequestId = '123';
vm.$store.state.currentProjectId = 'gitlab-ce';
vm.$store.state.currentMergeRequestId = 1;
@@ -41,20 +42,21 @@ describe('IDE right pane', () => {
},
};
- vm.$nextTick(() => {
- expect(vm.$el.querySelector('.ide-sidebar-link.active')).not.toBe(null);
- expect(
- vm.$el.querySelector('.ide-sidebar-link.active').getAttribute('data-original-title'),
- ).toBe('Merge Request');
-
- done();
- });
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.ide-sidebar-link.active')).not.toBe(null);
+ expect(
+ vm.$el.querySelector('.ide-sidebar-link.active').getAttribute('data-original-title'),
+ ).toBe('Merge Request');
+ })
+ .then(done)
+ .catch(done.fail);
});
});
describe('click', () => {
beforeEach(() => {
- spyOn(vm, 'setRightPane');
+ spyOn(vm, 'open');
});
it('sets view to merge request', done => {
@@ -63,7 +65,7 @@ describe('IDE right pane', () => {
vm.$nextTick(() => {
vm.$el.querySelector('.ide-sidebar-link').click();
- expect(vm.setRightPane).toHaveBeenCalledWith(rightSidebarViews.mergeRequestInfo);
+ expect(vm.open).toHaveBeenCalledWith(rightSidebarViews.mergeRequestInfo);
done();
});
diff --git a/spec/javascripts/ide/components/preview/clientside_spec.js b/spec/javascripts/ide/components/preview/clientside_spec.js
index d6983f5a3b8..b9bf5c51ffe 100644
--- a/spec/javascripts/ide/components/preview/clientside_spec.js
+++ b/spec/javascripts/ide/components/preview/clientside_spec.js
@@ -59,8 +59,7 @@ describe('IDE clientside preview', () => {
}),
);
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => vm.initPreview())
.then(vm.$nextTick)
.then(done)
diff --git a/spec/javascripts/ide/components/repo_commit_section_spec.js b/spec/javascripts/ide/components/repo_commit_section_spec.js
index 30cd92b2ca4..6c726c1e154 100644
--- a/spec/javascripts/ide/components/repo_commit_section_spec.js
+++ b/spec/javascripts/ide/components/repo_commit_section_spec.js
@@ -103,65 +103,6 @@ describe('RepoCommitSection', () => {
});
});
- it('adds changed files into staged files', done => {
- vm.$el.querySelector('.multi-file-discard-btn .btn').click();
- vm
- .$nextTick()
- .then(() => vm.$el.querySelector('.multi-file-discard-btn .btn').click())
- .then(vm.$nextTick)
- .then(() => {
- expect(vm.$el.querySelector('.ide-commit-list-container').textContent).toContain(
- 'No changes',
- );
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('stages a single file', done => {
- vm.$el.querySelector('.multi-file-discard-btn .btn').click();
-
- Vue.nextTick(() => {
- expect(
- vm.$el
- .querySelector('.ide-commit-list-container')
- .querySelectorAll('.multi-file-commit-list > li').length,
- ).toBe(1);
-
- done();
- });
- });
-
- it('discards a single file', done => {
- vm.$el.querySelector('.multi-file-discard-btn .dropdown-menu button').click();
-
- Vue.nextTick(() => {
- expect(vm.$el.querySelector('.ide-commit-list-container').textContent).not.toContain('file1');
- expect(
- vm.$el
- .querySelector('.ide-commit-list-container')
- .querySelectorAll('.multi-file-commit-list > li').length,
- ).toBe(1);
-
- done();
- });
- });
-
- it('unstages a single file', done => {
- vm.$el
- .querySelectorAll('.multi-file-discard-btn')[2]
- .querySelector('.btn')
- .click();
-
- Vue.nextTick(() => {
- expect(
- vm.$el.querySelectorAll('.ide-commit-list-container')[1].querySelectorAll('li').length,
- ).toBe(1);
-
- done();
- });
- });
-
describe('mounted', () => {
it('opens last opened file', () => {
expect(store.state.openFiles.length).toBe(1);
diff --git a/spec/javascripts/ide/components/repo_editor_spec.js b/spec/javascripts/ide/components/repo_editor_spec.js
index 0e2e246defd..002b5a005b8 100644
--- a/spec/javascripts/ide/components/repo_editor_spec.js
+++ b/spec/javascripts/ide/components/repo_editor_spec.js
@@ -52,6 +52,7 @@ describe('RepoEditor', () => {
it('renders only an edit tab', done => {
Vue.nextTick(() => {
const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+
expect(tabs.length).toBe(1);
expect(tabs[0].textContent.trim()).toBe('Edit');
@@ -72,6 +73,7 @@ describe('RepoEditor', () => {
it('renders an Edit and a Preview Tab', done => {
Vue.nextTick(() => {
const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+
expect(tabs.length).toBe(2);
expect(tabs[0].textContent.trim()).toBe('Edit');
expect(tabs[1].textContent.trim()).toBe('Preview Markdown');
@@ -109,6 +111,7 @@ describe('RepoEditor', () => {
it('renders an Edit and a Preview Tab', done => {
Vue.nextTick(() => {
const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+
expect(tabs.length).toBe(2);
expect(tabs[0].textContent.trim()).toBe('Review');
expect(tabs[1].textContent.trim()).toBe('Preview Markdown');
@@ -122,8 +125,7 @@ describe('RepoEditor', () => {
vm.file.path = `${vm.file.path}.md`;
vm.$store.state.entries[vm.file.path] = vm.file;
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$el.querySelectorAll('.ide-mode-tabs .nav-links a')[1].click();
})
@@ -294,8 +296,7 @@ describe('RepoEditor', () => {
it('calls updateDimensions when panelResizing is false', done => {
vm.$store.state.panelResizing = true;
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.$store.state.panelResizing = false;
})
@@ -319,8 +320,8 @@ describe('RepoEditor', () => {
});
});
- it('calls updateDimensions when rightPane is updated', done => {
- vm.$store.state.rightPane = 'testing';
+ it('calls updateDimensions when rightPane is opened', done => {
+ vm.$store.state.rightPane.isOpen = true;
vm.$nextTick(() => {
expect(vm.editor.updateDimensions).toHaveBeenCalled();
@@ -363,8 +364,7 @@ describe('RepoEditor', () => {
vm.file.pending = true;
- vm
- .$nextTick()
+ vm.$nextTick()
.then(() => {
vm.file = file('testing');
diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js
deleted file mode 100644
index f99d1f9890a..00000000000
--- a/spec/javascripts/ide/components/repo_file_spec.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import Vue from 'vue';
-import store from '~/ide/stores';
-import repoFile from '~/ide/components/repo_file.vue';
-import router from '~/ide/ide_router';
-import { createComponentWithStore } from '../../helpers/vue_mount_component_helper';
-import { file } from '../helpers';
-
-describe('RepoFile', () => {
- let vm;
-
- function createComponent(propsData) {
- const RepoFile = Vue.extend(repoFile);
-
- vm = createComponentWithStore(RepoFile, store, propsData);
-
- vm.$mount();
- }
-
- afterEach(() => {
- vm.$destroy();
- });
-
- it('renders link, icon and name', () => {
- createComponent({
- file: file('t4'),
- level: 0,
- });
-
- const name = vm.$el.querySelector('.ide-file-name');
-
- expect(name.href).toMatch('');
- expect(name.textContent.trim()).toEqual(vm.file.name);
- });
-
- it('fires clickFile when the link is clicked', done => {
- spyOn(router, 'push');
- createComponent({
- file: file('t3'),
- level: 0,
- });
-
- vm.$el.querySelector('.file-name').click();
-
- setTimeout(() => {
- expect(router.push).toHaveBeenCalledWith(`/project${vm.file.url}`);
-
- done();
- });
- });
-
- describe('folder', () => {
- it('renders changes count inside folder', () => {
- const f = {
- ...file('folder'),
- path: 'testing',
- type: 'tree',
- branchId: 'master',
- projectId: 'project',
- };
-
- store.state.changedFiles.push({
- ...file('fileName'),
- path: 'testing/fileName',
- });
-
- createComponent({
- file: f,
- level: 0,
- });
-
- const treeChangesEl = vm.$el.querySelector('.ide-tree-changes');
-
- expect(treeChangesEl).not.toBeNull();
- expect(treeChangesEl.textContent).toContain('1');
- });
-
- it('renders action dropdown', done => {
- createComponent({
- file: {
- ...file('t4'),
- type: 'tree',
- branchId: 'master',
- projectId: 'project',
- },
- level: 0,
- });
-
- setTimeout(() => {
- expect(vm.$el.querySelector('.ide-new-btn')).not.toBeNull();
-
- done();
- });
- });
- });
-
- describe('locked file', () => {
- let f;
-
- beforeEach(() => {
- f = file('locked file');
- f.file_lock = {
- user: {
- name: 'testuser',
- updated_at: new Date(),
- },
- };
-
- createComponent({
- file: f,
- level: 0,
- });
- });
-
- it('renders lock icon', () => {
- expect(vm.$el.querySelector('.file-status-icon')).not.toBeNull();
- });
-
- it('renders a tooltip', () => {
- expect(
- vm.$el.querySelector('.ide-file-name span:nth-child(2)').dataset.originalTitle,
- ).toContain('Locked by testuser');
- });
- });
-});
diff --git a/spec/javascripts/ide/components/repo_loading_file_spec.js b/spec/javascripts/ide/components/repo_loading_file_spec.js
deleted file mode 100644
index 7c20b8302f9..00000000000
--- a/spec/javascripts/ide/components/repo_loading_file_spec.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import Vue from 'vue';
-import store from '~/ide/stores';
-import repoLoadingFile from '~/ide/components/repo_loading_file.vue';
-import { resetStore } from '../helpers';
-
-describe('RepoLoadingFile', () => {
- let vm;
-
- function createComponent() {
- const RepoLoadingFile = Vue.extend(repoLoadingFile);
-
- return new RepoLoadingFile({
- store,
- }).$mount();
- }
-
- function assertLines(lines) {
- lines.forEach((line, n) => {
- const index = n + 1;
- expect(line.classList.contains(`skeleton-line-${index}`)).toBeTruthy();
- });
- }
-
- function assertColumns(columns) {
- columns.forEach(column => {
- const container = column.querySelector('.animation-container');
- const lines = [...container.querySelectorAll(':scope > div')];
-
- expect(container).toBeTruthy();
- expect(lines.length).toEqual(3);
- assertLines(lines);
- });
- }
-
- afterEach(() => {
- vm.$destroy();
-
- resetStore(vm.$store);
- });
-
- it('renders 3 columns of animated LoC', () => {
- vm = createComponent();
- const columns = [...vm.$el.querySelectorAll('td')];
-
- expect(columns.length).toEqual(3);
- assertColumns(columns);
- });
-
- it('renders 1 column of animated LoC if isMini', done => {
- vm = createComponent();
- vm.$store.state.leftPanelCollapsed = true;
- vm.$store.state.openFiles.push('test');
-
- vm.$nextTick(() => {
- const columns = [...vm.$el.querySelectorAll('td')];
-
- expect(columns.length).toEqual(1);
- assertColumns(columns);
-
- done();
- });
- });
-});
diff --git a/spec/javascripts/ide/components/repo_tab_spec.js b/spec/javascripts/ide/components/repo_tab_spec.js
index 278a0753322..3b52f279bf2 100644
--- a/spec/javascripts/ide/components/repo_tab_spec.js
+++ b/spec/javascripts/ide/components/repo_tab_spec.js
@@ -93,13 +93,13 @@ describe('RepoTab', () => {
Vue.nextTick()
.then(() => {
- expect(vm.$el.querySelector('.ide-file-modified')).toBeNull();
+ expect(vm.$el.querySelector('.file-modified')).toBeNull();
vm.$el.dispatchEvent(new Event('mouseout'));
})
.then(Vue.nextTick)
.then(() => {
- expect(vm.$el.querySelector('.ide-file-modified')).not.toBeNull();
+ expect(vm.$el.querySelector('.file-modified')).not.toBeNull();
done();
})
diff --git a/spec/javascripts/ide/components/shared/tokened_input_spec.js b/spec/javascripts/ide/components/shared/tokened_input_spec.js
index 09940fe8c6a..b09bf760543 100644
--- a/spec/javascripts/ide/components/shared/tokened_input_spec.js
+++ b/spec/javascripts/ide/components/shared/tokened_input_spec.js
@@ -44,8 +44,7 @@ describe('IDE shared/TokenedInput', () => {
});
it('renders tokens', () => {
- const renderedTokens = getTokenElements(vm)
- .map(x => x.textContent.trim());
+ const renderedTokens = getTokenElements(vm).map(x => x.textContent.trim());
expect(renderedTokens).toEqual(TEST_TOKENS.map(x => x.label));
});
@@ -85,10 +84,12 @@ describe('IDE shared/TokenedInput', () => {
vm.value = '';
vm.onBackspace();
+
expect(vm.$emit).not.toHaveBeenCalled();
expect(vm.backspaceCount).toEqual(1);
vm.onBackspace();
+
expect(vm.$emit).toHaveBeenCalledWith('removeToken', TEST_TOKENS[TEST_TOKENS.length - 1]);
expect(vm.backspaceCount).toEqual(0);
});
diff --git a/spec/javascripts/ide/helpers.js b/spec/javascripts/ide/helpers.js
index c11c482fef8..7e107747346 100644
--- a/spec/javascripts/ide/helpers.js
+++ b/spec/javascripts/ide/helpers.js
@@ -5,6 +5,8 @@ import commitState from '~/ide/stores/modules/commit/state';
import mergeRequestsState from '~/ide/stores/modules/merge_requests/state';
import pipelinesState from '~/ide/stores/modules/pipelines/state';
import branchesState from '~/ide/stores/modules/branches/state';
+import fileTemplatesState from '~/ide/stores/modules/file_templates/state';
+import paneState from '~/ide/stores/modules/pane/state';
export const resetStore = store => {
const newState = {
@@ -13,6 +15,8 @@ export const resetStore = store => {
mergeRequests: mergeRequestsState(),
pipelines: pipelinesState(),
branches: branchesState(),
+ fileTemplates: fileTemplatesState(),
+ rightPane: paneState(),
};
store.replaceState(newState);
};
diff --git a/spec/javascripts/ide/stores/actions/file_spec.js b/spec/javascripts/ide/stores/actions/file_spec.js
index 72eb20bdc87..1ca811e996b 100644
--- a/spec/javascripts/ide/stores/actions/file_spec.js
+++ b/spec/javascripts/ide/stores/actions/file_spec.js
@@ -352,10 +352,22 @@ describe('IDE store file actions', () => {
it('calls also getBaseRawFileData service method', done => {
spyOn(service, 'getBaseRawFileData').and.returnValue(Promise.resolve('baseraw'));
+ store.state.currentProjectId = 'gitlab-org/gitlab-ce';
+ store.state.currentMergeRequestId = '1';
+ store.state.projects = {
+ 'gitlab-org/gitlab-ce': {
+ mergeRequests: {
+ 1: {
+ baseCommitSha: 'SHA',
+ },
+ },
+ },
+ };
+
tmpFile.mrChange = { new_file: false };
store
- .dispatch('getRawFileData', { path: tmpFile.path, baseSha: 'SHA' })
+ .dispatch('getRawFileData', { path: tmpFile.path })
.then(() => {
expect(service.getBaseRawFileData).toHaveBeenCalledWith(tmpFile, 'SHA');
expect(tmpFile.baseRaw).toBe('baseraw');
@@ -392,10 +404,7 @@ describe('IDE store file actions', () => {
const dispatch = jasmine.createSpy('dispatch');
actions
- .getRawFileData(
- { state: store.state, commit() {}, dispatch },
- { path: tmpFile.path, baseSha: tmpFile.baseSha },
- )
+ .getRawFileData({ state: store.state, commit() {}, dispatch }, { path: tmpFile.path })
.then(done.fail)
.catch(() => {
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
@@ -404,7 +413,6 @@ describe('IDE store file actions', () => {
actionText: 'Please try again',
actionPayload: {
path: tmpFile.path,
- baseSha: tmpFile.baseSha,
},
});
@@ -684,21 +692,6 @@ describe('IDE store file actions', () => {
.then(done)
.catch(done.fail);
});
-
- it('calls scrollToTab', done => {
- const scrollToTabSpy = jasmine.createSpy('scrollToTab');
- const oldScrollToTab = store._actions.scrollToTab; // eslint-disable-line
- store._actions.scrollToTab = [scrollToTabSpy]; // eslint-disable-line
-
- store
- .dispatch('openPendingTab', { file: f, keyPrefix: 'pending' })
- .then(() => {
- expect(scrollToTabSpy).toHaveBeenCalled();
- store._actions.scrollToTab = oldScrollToTab; // eslint-disable-line
- })
- .then(done)
- .catch(done.fail);
- });
});
describe('removePendingTab', () => {
diff --git a/spec/javascripts/ide/stores/actions/merge_request_spec.js b/spec/javascripts/ide/stores/actions/merge_request_spec.js
index 8564f04ce8a..3a4e0d7507f 100644
--- a/spec/javascripts/ide/stores/actions/merge_request_spec.js
+++ b/spec/javascripts/ide/stores/actions/merge_request_spec.js
@@ -262,7 +262,7 @@ describe('IDE store merge request actions', () => {
bar: {},
};
- spyOn(store, 'dispatch').and.callFake((type) => {
+ spyOn(store, 'dispatch').and.callFake(type => {
switch (type) {
case 'getMergeRequestData':
return Promise.resolve(testMergeRequest);
@@ -280,14 +280,20 @@ describe('IDE store merge request actions', () => {
expect(store.dispatch.calls.allArgs()).toEqual([
['getMergeRequestData', mr],
['setCurrentBranchId', testMergeRequest.source_branch],
- ['getBranchData', {
- projectId: mr.projectId,
- branchId: testMergeRequest.source_branch,
- }],
- ['getFiles', {
- projectId: mr.projectId,
- branchId: testMergeRequest.source_branch,
- }],
+ [
+ 'getBranchData',
+ {
+ projectId: mr.projectId,
+ branchId: testMergeRequest.source_branch,
+ },
+ ],
+ [
+ 'getFiles',
+ {
+ projectId: mr.projectId,
+ branchId: testMergeRequest.source_branch,
+ },
+ ],
['getMergeRequestVersions', mr],
['getMergeRequestChanges', mr],
]);
@@ -297,20 +303,21 @@ describe('IDE store merge request actions', () => {
});
it('updates activity bar view and gets file data, if changes are found', done => {
- testMergeRequestChanges.changes = [
- { new_path: 'foo' },
- { new_path: 'bar' },
- ];
+ testMergeRequestChanges.changes = [{ new_path: 'foo' }, { new_path: 'bar' }];
openMergeRequest(store, mr)
.then(() => {
- expect(store.dispatch).toHaveBeenCalledWith('updateActivityBarView', activityBarViews.review);
+ expect(store.dispatch).toHaveBeenCalledWith(
+ 'updateActivityBarView',
+ activityBarViews.review,
+ );
testMergeRequestChanges.changes.forEach((change, i) => {
expect(store.dispatch).toHaveBeenCalledWith('setFileMrChange', {
file: store.state.entries[change.new_path],
mrChange: change,
});
+
expect(store.dispatch).toHaveBeenCalledWith('getFileData', {
path: change.new_path,
makeFileActive: i === 0,
@@ -334,7 +341,6 @@ describe('IDE store merge request actions', () => {
})
.then(done)
.catch(done.fail);
-
});
});
});
diff --git a/spec/javascripts/ide/stores/actions/project_spec.js b/spec/javascripts/ide/stores/actions/project_spec.js
index 667e3e0a7ef..7d8c9edd965 100644
--- a/spec/javascripts/ide/stores/actions/project_spec.js
+++ b/spec/javascripts/ide/stores/actions/project_spec.js
@@ -270,7 +270,10 @@ describe('IDE store project actions', () => {
it('does not handle tree entry action, if entry is pending', done => {
openBranch(store, { ...branch, basePath: 'foo/bar-pending' })
.then(() => {
- expect(store.dispatch).not.toHaveBeenCalledWith('handleTreeEntryAction', jasmine.anything());
+ expect(store.dispatch).not.toHaveBeenCalledWith(
+ 'handleTreeEntryAction',
+ jasmine.anything(),
+ );
})
.then(done)
.catch(done.fail);
diff --git a/spec/javascripts/ide/stores/actions/tree_spec.js b/spec/javascripts/ide/stores/actions/tree_spec.js
index 9f098eded08..d47c60dc581 100644
--- a/spec/javascripts/ide/stores/actions/tree_spec.js
+++ b/spec/javascripts/ide/stores/actions/tree_spec.js
@@ -71,6 +71,7 @@ describe('Multi-file store tree actions', () => {
.dispatch('getFiles', basicCallParameters)
.then(() => {
projectTree = store.state.trees['abcproject/master'];
+
expect(projectTree.tree.length).toBe(2);
expect(projectTree.tree[0].type).toBe('tree');
expect(projectTree.tree[0].tree[1].name).toBe('fileinfolder.js');
diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js
index d84f1717a61..df291ade3f7 100644
--- a/spec/javascripts/ide/stores/actions_spec.js
+++ b/spec/javascripts/ide/stores/actions_spec.js
@@ -279,8 +279,6 @@ describe('Multi-file store actions', () => {
});
});
- describe('popHistoryState', () => {});
-
describe('scrollToTab', () => {
it('focuses the current active element', done => {
document.body.innerHTML +=
@@ -305,7 +303,11 @@ describe('Multi-file store actions', () => {
describe('stageAllChanges', () => {
it('adds all files from changedFiles to stagedFiles', done => {
- store.state.changedFiles.push(file(), file('new'));
+ const openFile = { ...file(), path: 'test' };
+
+ store.state.openFiles.push(openFile);
+ store.state.stagedFiles.push(openFile);
+ store.state.changedFiles.push(openFile, file('new'));
testAction(
stageAllChanges,
@@ -316,7 +318,12 @@ describe('Multi-file store actions', () => {
{ type: types.STAGE_CHANGE, payload: store.state.changedFiles[0].path },
{ type: types.STAGE_CHANGE, payload: store.state.changedFiles[1].path },
],
- [],
+ [
+ {
+ type: 'openPendingTab',
+ payload: { file: openFile, keyPrefix: 'staged' },
+ },
+ ],
done,
);
});
@@ -324,7 +331,11 @@ describe('Multi-file store actions', () => {
describe('unstageAllChanges', () => {
it('removes all files from stagedFiles after unstaging', done => {
- store.state.stagedFiles.push(file(), file('new'));
+ const openFile = { ...file(), path: 'test' };
+
+ store.state.openFiles.push(openFile);
+ store.state.changedFiles.push(openFile);
+ store.state.stagedFiles.push(openFile, file('new'));
testAction(
unstageAllChanges,
@@ -334,7 +345,12 @@ describe('Multi-file store actions', () => {
{ type: types.UNSTAGE_CHANGE, payload: store.state.stagedFiles[0].path },
{ type: types.UNSTAGE_CHANGE, payload: store.state.stagedFiles[1].path },
],
- [],
+ [
+ {
+ type: 'openPendingTab',
+ payload: { file: openFile, keyPrefix: 'unstaged' },
+ },
+ ],
done,
);
});
diff --git a/spec/javascripts/ide/stores/modules/branches/actions_spec.js b/spec/javascripts/ide/stores/modules/branches/actions_spec.js
index 010f56af03b..2b3eac282f6 100644
--- a/spec/javascripts/ide/stores/modules/branches/actions_spec.js
+++ b/spec/javascripts/ide/stores/modules/branches/actions_spec.js
@@ -60,7 +60,6 @@ describe('IDE branches actions', () => {
describe('receiveBranchesError', () => {
it('should should commit error', done => {
-
testAction(
receiveBranchesError,
{ search: TEST_SEARCH },
diff --git a/spec/javascripts/ide/stores/modules/commit/actions_spec.js b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
index 24a7d76f30b..06b8b452319 100644
--- a/spec/javascripts/ide/stores/modules/commit/actions_spec.js
+++ b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
@@ -184,7 +184,7 @@ describe('IDE commit module actions', () => {
branch,
})
.then(() => {
- expect(f.lastCommit.message).toBe(data.message);
+ expect(f.lastCommitSha).toBe(data.id);
})
.then(done)
.catch(done.fail);
@@ -266,19 +266,21 @@ describe('IDE commit module actions', () => {
});
describe('success', () => {
+ const COMMIT_RESPONSE = {
+ id: '123456',
+ short_id: '123',
+ message: 'test message',
+ committed_date: 'date',
+ stats: {
+ additions: '1',
+ deletions: '2',
+ },
+ };
+
beforeEach(() => {
spyOn(service, 'commit').and.returnValue(
Promise.resolve({
- data: {
- id: '123456',
- short_id: '123',
- message: 'test message',
- committed_date: 'date',
- stats: {
- additions: '1',
- deletions: '2',
- },
- },
+ data: COMMIT_RESPONSE,
}),
);
});
@@ -352,8 +354,8 @@ describe('IDE commit module actions', () => {
store
.dispatch('commit/commitChanges')
.then(() => {
- expect(store.state.entries[store.state.openFiles[0].path].lastCommit.message).toBe(
- 'test message',
+ expect(store.state.entries[store.state.openFiles[0].path].lastCommitSha).toBe(
+ COMMIT_RESPONSE.id,
);
done();
diff --git a/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js b/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js
new file mode 100644
index 00000000000..734233100ab
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js
@@ -0,0 +1,441 @@
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import createState from '~/ide/stores/modules/file_templates/state';
+import * as actions from '~/ide/stores/modules/file_templates/actions';
+import * as types from '~/ide/stores/modules/file_templates/mutation_types';
+import testAction from 'spec/helpers/vuex_action_helper';
+
+describe('IDE file templates actions', () => {
+ let state;
+ let mock;
+
+ beforeEach(() => {
+ state = createState();
+
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('requestTemplateTypes', () => {
+ it('commits REQUEST_TEMPLATE_TYPES', done => {
+ testAction(
+ actions.requestTemplateTypes,
+ null,
+ state,
+ [{ type: types.REQUEST_TEMPLATE_TYPES }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveTemplateTypesError', () => {
+ it('commits RECEIVE_TEMPLATE_TYPES_ERROR and dispatches setErrorMessage', done => {
+ testAction(
+ actions.receiveTemplateTypesError,
+ null,
+ state,
+ [{ type: types.RECEIVE_TEMPLATE_TYPES_ERROR }],
+ [
+ {
+ type: 'setErrorMessage',
+ payload: {
+ action: jasmine.any(Function),
+ actionText: 'Please try again',
+ text: 'Error loading template types.',
+ },
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('receiveTemplateTypesSuccess', () => {
+ it('commits RECEIVE_TEMPLATE_TYPES_SUCCESS', done => {
+ testAction(
+ actions.receiveTemplateTypesSuccess,
+ 'test',
+ state,
+ [{ type: types.RECEIVE_TEMPLATE_TYPES_SUCCESS, payload: 'test' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('fetchTemplateTypes', () => {
+ describe('success', () => {
+ let nextPage;
+
+ beforeEach(() => {
+ mock.onGet(/api\/(.*)\/templates\/licenses/).replyOnce(() => [
+ 200,
+ [
+ {
+ name: 'MIT',
+ },
+ ],
+ { 'X-NEXT-PAGE': nextPage },
+ ]);
+ });
+
+ it('rejects if selectedTemplateType is empty', done => {
+ const dispatch = jasmine.createSpy('dispatch');
+
+ actions
+ .fetchTemplateTypes({ dispatch, state })
+ .then(done.fail)
+ .catch(() => {
+ expect(dispatch).not.toHaveBeenCalled();
+
+ done();
+ });
+ });
+
+ it('dispatches actions', done => {
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplateTypes,
+ null,
+ state,
+ [],
+ [
+ {
+ type: 'requestTemplateTypes',
+ },
+ {
+ type: 'receiveTemplateTypesSuccess',
+ payload: [
+ {
+ name: 'MIT',
+ },
+ ],
+ },
+ ],
+ done,
+ );
+ });
+
+ it('dispatches actions for next page', done => {
+ nextPage = '2';
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplateTypes,
+ null,
+ state,
+ [],
+ [
+ {
+ type: 'requestTemplateTypes',
+ },
+ {
+ type: 'receiveTemplateTypesSuccess',
+ payload: [
+ {
+ name: 'MIT',
+ },
+ ],
+ },
+ {
+ type: 'fetchTemplateTypes',
+ payload: 2,
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(/api\/(.*)\/templates\/licenses/).replyOnce(500);
+ });
+
+ it('dispatches actions', done => {
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplateTypes,
+ null,
+ state,
+ [],
+ [
+ {
+ type: 'requestTemplateTypes',
+ },
+ {
+ type: 'receiveTemplateTypesError',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('setSelectedTemplateType', () => {
+ it('commits SET_SELECTED_TEMPLATE_TYPE', () => {
+ const commit = jasmine.createSpy('commit');
+ const options = {
+ commit,
+ dispatch() {},
+ rootGetters: {
+ activeFile: {
+ name: 'test',
+ prevPath: '',
+ },
+ },
+ };
+
+ actions.setSelectedTemplateType(options, { name: 'test' });
+
+ expect(commit).toHaveBeenCalledWith(types.SET_SELECTED_TEMPLATE_TYPE, { name: 'test' });
+ });
+
+ it('dispatches discardFileChanges if prevPath matches templates name', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const options = {
+ commit() {},
+ dispatch,
+ rootGetters: {
+ activeFile: {
+ name: 'test',
+ path: 'test',
+ prevPath: 'test',
+ },
+ },
+ };
+
+ actions.setSelectedTemplateType(options, { name: 'test' });
+
+ expect(dispatch).toHaveBeenCalledWith('discardFileChanges', 'test', { root: true });
+ });
+
+ it('dispatches renameEntry if file name doesnt match', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const options = {
+ commit() {},
+ dispatch,
+ rootGetters: {
+ activeFile: {
+ name: 'oldtest',
+ path: 'oldtest',
+ prevPath: '',
+ },
+ },
+ };
+
+ actions.setSelectedTemplateType(options, { name: 'test' });
+
+ expect(dispatch).toHaveBeenCalledWith(
+ 'renameEntry',
+ {
+ path: 'oldtest',
+ name: 'test',
+ },
+ { root: true },
+ );
+ });
+ });
+
+ describe('receiveTemplateError', () => {
+ it('dispatches setErrorMessage', done => {
+ testAction(
+ actions.receiveTemplateError,
+ 'test',
+ state,
+ [],
+ [
+ {
+ type: 'setErrorMessage',
+ payload: {
+ action: jasmine.any(Function),
+ actionText: 'Please try again',
+ text: 'Error loading template.',
+ actionPayload: 'test',
+ },
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('fetchTemplate', () => {
+ describe('success', () => {
+ beforeEach(() => {
+ mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(200, {
+ content: 'MIT content',
+ });
+ mock.onGet(/api\/(.*)\/templates\/licenses\/testing/).replyOnce(200, {
+ content: 'testing content',
+ });
+ });
+
+ it('dispatches setFileTemplate if template already has content', done => {
+ const template = {
+ content: 'already has content',
+ };
+
+ testAction(
+ actions.fetchTemplate,
+ template,
+ state,
+ [],
+ [{ type: 'setFileTemplate', payload: template }],
+ done,
+ );
+ });
+
+ it('dispatches success', done => {
+ const template = {
+ key: 'mit',
+ };
+
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplate,
+ template,
+ state,
+ [],
+ [{ type: 'setFileTemplate', payload: { content: 'MIT content' } }],
+ done,
+ );
+ });
+
+ it('dispatches success and uses name key for API call', done => {
+ const template = {
+ name: 'testing',
+ };
+
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplate,
+ template,
+ state,
+ [],
+ [{ type: 'setFileTemplate', payload: { content: 'testing content' } }],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(500);
+ });
+
+ it('dispatches error', done => {
+ const template = {
+ name: 'testing',
+ };
+
+ state.selectedTemplateType = {
+ key: 'licenses',
+ };
+
+ testAction(
+ actions.fetchTemplate,
+ template,
+ state,
+ [],
+ [{ type: 'receiveTemplateError', payload: template }],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('setFileTemplate', () => {
+ it('dispatches changeFileContent', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const commit = jasmine.createSpy('commit');
+ const rootGetters = {
+ activeFile: { path: 'test' },
+ };
+
+ actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' });
+
+ expect(dispatch).toHaveBeenCalledWith(
+ 'changeFileContent',
+ { path: 'test', content: 'content' },
+ { root: true },
+ );
+ });
+
+ it('commits SET_UPDATE_SUCCESS', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const commit = jasmine.createSpy('commit');
+ const rootGetters = {
+ activeFile: { path: 'test' },
+ };
+
+ actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' });
+
+ expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', true);
+ });
+ });
+
+ describe('undoFileTemplate', () => {
+ it('dispatches changeFileContent', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const commit = jasmine.createSpy('commit');
+ const rootGetters = {
+ activeFile: { path: 'test', raw: 'raw content' },
+ };
+
+ actions.undoFileTemplate({ dispatch, commit, rootGetters });
+
+ expect(dispatch).toHaveBeenCalledWith(
+ 'changeFileContent',
+ { path: 'test', content: 'raw content' },
+ { root: true },
+ );
+ });
+
+ it('commits SET_UPDATE_SUCCESS', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const commit = jasmine.createSpy('commit');
+ const rootGetters = {
+ activeFile: { path: 'test', raw: 'raw content' },
+ };
+
+ actions.undoFileTemplate({ dispatch, commit, rootGetters });
+
+ expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', false);
+ });
+
+ it('dispatches discardFileChanges if file has prevPath', () => {
+ const dispatch = jasmine.createSpy('dispatch');
+ const rootGetters = {
+ activeFile: { path: 'test', prevPath: 'newtest', raw: 'raw content' },
+ };
+
+ actions.undoFileTemplate({ dispatch, commit() {}, rootGetters });
+
+ expect(dispatch.calls.mostRecent().args).toEqual([
+ 'discardFileChanges',
+ 'test',
+ { root: true },
+ ]);
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/file_templates/getters_spec.js b/spec/javascripts/ide/stores/modules/file_templates/getters_spec.js
new file mode 100644
index 00000000000..17cb457881f
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/file_templates/getters_spec.js
@@ -0,0 +1,59 @@
+import createState from '~/ide/stores/state';
+import { activityBarViews } from '~/ide/constants';
+import * as getters from '~/ide/stores/modules/file_templates/getters';
+
+describe('IDE file templates getters', () => {
+ describe('templateTypes', () => {
+ it('returns list of template types', () => {
+ expect(getters.templateTypes().length).toBe(4);
+ });
+ });
+
+ describe('showFileTemplatesBar', () => {
+ let rootState;
+
+ beforeEach(() => {
+ rootState = createState();
+ });
+
+ it('returns true if template is found and currentActivityView is edit', () => {
+ rootState.currentActivityView = activityBarViews.edit;
+
+ expect(
+ getters.showFileTemplatesBar(
+ null,
+ {
+ templateTypes: getters.templateTypes(),
+ },
+ rootState,
+ )('LICENSE'),
+ ).toBe(true);
+ });
+
+ it('returns false if template is found and currentActivityView is not edit', () => {
+ rootState.currentActivityView = activityBarViews.commit;
+
+ expect(
+ getters.showFileTemplatesBar(
+ null,
+ {
+ templateTypes: getters.templateTypes(),
+ },
+ rootState,
+ )('LICENSE'),
+ ).toBe(false);
+ });
+
+ it('returns undefined if not found', () => {
+ expect(
+ getters.showFileTemplatesBar(
+ null,
+ {
+ templateTypes: getters.templateTypes(),
+ },
+ rootState,
+ )('test'),
+ ).toBe(undefined);
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/file_templates/mutations_spec.js b/spec/javascripts/ide/stores/modules/file_templates/mutations_spec.js
new file mode 100644
index 00000000000..8e0e3ae99a1
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/file_templates/mutations_spec.js
@@ -0,0 +1,69 @@
+import createState from '~/ide/stores/modules/file_templates/state';
+import * as types from '~/ide/stores/modules/file_templates/mutation_types';
+import mutations from '~/ide/stores/modules/file_templates/mutations';
+
+describe('IDE file templates mutations', () => {
+ let state;
+
+ beforeEach(() => {
+ state = createState();
+ });
+
+ describe(types.REQUEST_TEMPLATE_TYPES, () => {
+ it('sets isLoading', () => {
+ mutations[types.REQUEST_TEMPLATE_TYPES](state);
+
+ expect(state.isLoading).toBe(true);
+ });
+ });
+
+ describe(types.RECEIVE_TEMPLATE_TYPES_ERROR, () => {
+ it('sets isLoading', () => {
+ state.isLoading = true;
+
+ mutations[types.RECEIVE_TEMPLATE_TYPES_ERROR](state);
+
+ expect(state.isLoading).toBe(false);
+ });
+ });
+
+ describe(types.RECEIVE_TEMPLATE_TYPES_SUCCESS, () => {
+ it('sets isLoading to false', () => {
+ state.isLoading = true;
+
+ mutations[types.RECEIVE_TEMPLATE_TYPES_SUCCESS](state, []);
+
+ expect(state.isLoading).toBe(false);
+ });
+
+ it('sets templates', () => {
+ mutations[types.RECEIVE_TEMPLATE_TYPES_SUCCESS](state, ['test']);
+
+ expect(state.templates).toEqual(['test']);
+ });
+ });
+
+ describe(types.SET_SELECTED_TEMPLATE_TYPE, () => {
+ it('sets selectedTemplateType', () => {
+ mutations[types.SET_SELECTED_TEMPLATE_TYPE](state, 'type');
+
+ expect(state.selectedTemplateType).toBe('type');
+ });
+
+ it('clears templates', () => {
+ state.templates = ['test'];
+
+ mutations[types.SET_SELECTED_TEMPLATE_TYPE](state, 'type');
+
+ expect(state.templates).toEqual([]);
+ });
+ });
+
+ describe(types.SET_UPDATE_SUCCESS, () => {
+ it('sets updateSuccess', () => {
+ mutations[types.SET_UPDATE_SUCCESS](state, true);
+
+ expect(state.updateSuccess).toBe(true);
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/pane/actions_spec.js b/spec/javascripts/ide/stores/modules/pane/actions_spec.js
new file mode 100644
index 00000000000..799bc89a0c3
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/pane/actions_spec.js
@@ -0,0 +1,66 @@
+import * as actions from '~/ide/stores/modules/pane/actions';
+import * as types from '~/ide/stores/modules/pane/mutation_types';
+import testAction from 'spec/helpers/vuex_action_helper';
+
+describe('IDE pane module actions', () => {
+ const TEST_VIEW = { name: 'test' };
+ const TEST_VIEW_KEEP_ALIVE = { name: 'test-keep-alive', keepAlive: true };
+
+ describe('toggleOpen', () => {
+ it('dispatches open if closed', done => {
+ testAction(
+ actions.toggleOpen,
+ TEST_VIEW,
+ { isOpen: false },
+ [],
+ [{ type: 'open', payload: TEST_VIEW }],
+ done,
+ );
+ });
+
+ it('dispatches close if opened', done => {
+ testAction(actions.toggleOpen, TEST_VIEW, { isOpen: true }, [], [{ type: 'close' }], done);
+ });
+ });
+
+ describe('open', () => {
+ it('commits SET_OPEN', done => {
+ testAction(actions.open, null, {}, [{ type: types.SET_OPEN, payload: true }], [], done);
+ });
+
+ it('commits SET_CURRENT_VIEW if view is given', done => {
+ testAction(
+ actions.open,
+ TEST_VIEW,
+ {},
+ [
+ { type: types.SET_OPEN, payload: true },
+ { type: types.SET_CURRENT_VIEW, payload: TEST_VIEW.name },
+ ],
+ [],
+ done,
+ );
+ });
+
+ it('commits KEEP_ALIVE_VIEW if keepAlive is true', done => {
+ testAction(
+ actions.open,
+ TEST_VIEW_KEEP_ALIVE,
+ {},
+ [
+ { type: types.SET_OPEN, payload: true },
+ { type: types.SET_CURRENT_VIEW, payload: TEST_VIEW_KEEP_ALIVE.name },
+ { type: types.KEEP_ALIVE_VIEW, payload: TEST_VIEW_KEEP_ALIVE.name },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('close', () => {
+ it('commits SET_OPEN', done => {
+ testAction(actions.close, null, {}, [{ type: types.SET_OPEN, payload: false }], [], done);
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/pane/getters_spec.js b/spec/javascripts/ide/stores/modules/pane/getters_spec.js
new file mode 100644
index 00000000000..8a213323de0
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/pane/getters_spec.js
@@ -0,0 +1,55 @@
+import * as getters from '~/ide/stores/modules/pane/getters';
+import state from '~/ide/stores/modules/pane/state';
+
+describe('IDE pane module getters', () => {
+ const TEST_VIEW = 'test-view';
+ const TEST_KEEP_ALIVE_VIEWS = {
+ [TEST_VIEW]: true,
+ };
+
+ describe('isActiveView', () => {
+ it('returns true if given view matches currentView', () => {
+ const result = getters.isActiveView({ currentView: 'A' })('A');
+
+ expect(result).toBe(true);
+ });
+
+ it('returns false if given view does not match currentView', () => {
+ const result = getters.isActiveView({ currentView: 'A' })('B');
+
+ expect(result).toBe(false);
+ });
+ });
+
+ describe('isAliveView', () => {
+ it('returns true if given view is in keepAliveViews', () => {
+ const result = getters.isAliveView({ keepAliveViews: TEST_KEEP_ALIVE_VIEWS }, {})(TEST_VIEW);
+
+ expect(result).toBe(true);
+ });
+
+ it('returns true if given view is active view and open', () => {
+ const result = getters.isAliveView(
+ { ...state(), isOpen: true },
+ { isActiveView: () => true },
+ )(TEST_VIEW);
+
+ expect(result).toBe(true);
+ });
+
+ it('returns false if given view is active view and closed', () => {
+ const result = getters.isAliveView(state(), { isActiveView: () => true })(TEST_VIEW);
+
+ expect(result).toBe(false);
+ });
+
+ it('returns false if given view is not activeView', () => {
+ const result = getters.isAliveView(
+ { ...state(), isOpen: true },
+ { isActiveView: () => false },
+ )(TEST_VIEW);
+
+ expect(result).toBe(false);
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/pane/mutations_spec.js b/spec/javascripts/ide/stores/modules/pane/mutations_spec.js
new file mode 100644
index 00000000000..b5fcd35912e
--- /dev/null
+++ b/spec/javascripts/ide/stores/modules/pane/mutations_spec.js
@@ -0,0 +1,42 @@
+import state from '~/ide/stores/modules/pane/state';
+import mutations from '~/ide/stores/modules/pane/mutations';
+import * as types from '~/ide/stores/modules/pane/mutation_types';
+
+describe('IDE pane module mutations', () => {
+ const TEST_VIEW = 'test-view';
+ let mockedState;
+
+ beforeEach(() => {
+ mockedState = state();
+ });
+
+ describe('SET_OPEN', () => {
+ it('sets isOpen', () => {
+ mockedState.isOpen = false;
+
+ mutations[types.SET_OPEN](mockedState, true);
+
+ expect(mockedState.isOpen).toBe(true);
+ });
+ });
+
+ describe('SET_CURRENT_VIEW', () => {
+ it('sets currentView', () => {
+ mockedState.currentView = null;
+
+ mutations[types.SET_CURRENT_VIEW](mockedState, TEST_VIEW);
+
+ expect(mockedState.currentView).toEqual(TEST_VIEW);
+ });
+ });
+
+ describe('KEEP_ALIVE_VIEW', () => {
+ it('adds entry to keepAliveViews', () => {
+ mutations[types.KEEP_ALIVE_VIEW](mockedState, TEST_VIEW);
+
+ expect(mockedState.keepAliveViews).toEqual({
+ [TEST_VIEW]: true,
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js b/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js
index 91edb388791..c9c09ee9afe 100644
--- a/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js
+++ b/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js
@@ -77,7 +77,7 @@ describe('IDE pipelines actions', () => {
{
type: 'setErrorMessage',
payload: {
- text: 'An error occured whilst fetching the latest pipline.',
+ text: 'An error occured whilst fetching the latest pipeline.',
action: jasmine.any(Function),
actionText: 'Please try again',
actionPayload: null,
@@ -315,29 +315,29 @@ describe('IDE pipelines actions', () => {
'job',
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: 'job' }],
- [{ type: 'setRightPane', payload: 'jobs-detail' }],
+ [{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }],
done,
);
});
- it('dispatches setRightPane as pipeline when job is null', done => {
+ it('dispatches rightPane/open as pipeline when job is null', done => {
testAction(
setDetailJob,
null,
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: null }],
- [{ type: 'setRightPane', payload: rightSidebarViews.pipelines }],
+ [{ type: 'rightPane/open', payload: rightSidebarViews.pipelines }],
done,
);
});
- it('dispatches setRightPane as job', done => {
+ it('dispatches rightPane/open as job', done => {
testAction(
setDetailJob,
'job',
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: 'job' }],
- [{ type: 'setRightPane', payload: rightSidebarViews.jobsDetail }],
+ [{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }],
done,
);
});
diff --git a/spec/javascripts/ide/stores/mutations/merge_request_spec.js b/spec/javascripts/ide/stores/mutations/merge_request_spec.js
index f724bf464f5..e30ca22022f 100644
--- a/spec/javascripts/ide/stores/mutations/merge_request_spec.js
+++ b/spec/javascripts/ide/stores/mutations/merge_request_spec.js
@@ -45,6 +45,7 @@ describe('IDE store merge request mutations', () => {
});
const newMr = localState.projects.abcproject.mergeRequests[1];
+
expect(newMr.changes.diff).toBe('abc');
});
});
@@ -58,6 +59,7 @@ describe('IDE store merge request mutations', () => {
});
const newMr = localState.projects.abcproject.mergeRequests[1];
+
expect(newMr.versions.length).toBe(1);
expect(newMr.versions[0].id).toBe(123);
});
diff --git a/spec/javascripts/ide/stores/mutations_spec.js b/spec/javascripts/ide/stores/mutations_spec.js
index 1e836dbc3f9..41dd3d3c67f 100644
--- a/spec/javascripts/ide/stores/mutations_spec.js
+++ b/spec/javascripts/ide/stores/mutations_spec.js
@@ -213,6 +213,33 @@ describe('Multi-file store mutations', () => {
expect(localState.changedFiles).toEqual([localState.entries.filePath]);
});
+
+ it('does not add tempFile into changedFiles', () => {
+ localState.entries.filePath = {
+ deleted: false,
+ type: 'blob',
+ tempFile: true,
+ };
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.changedFiles).toEqual([]);
+ });
+
+ it('removes tempFile from changedFiles when deleted', () => {
+ localState.entries.filePath = {
+ path: 'filePath',
+ deleted: false,
+ type: 'blob',
+ tempFile: true,
+ };
+
+ localState.changedFiles.push({ ...localState.entries.filePath });
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.changedFiles).toEqual([]);
+ });
});
describe('UPDATE_FILE_AFTER_COMMIT', () => {
@@ -312,5 +339,13 @@ describe('Multi-file store mutations', () => {
expect(localState.entries.parentPath.tree.length).toBe(1);
});
+
+ it('adds to openFiles if previously opened', () => {
+ localState.entries.oldPath.opened = true;
+
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.openFiles).toEqual([localState.entries.newPath]);
+ });
});
});
diff --git a/spec/javascripts/image_diff/helpers/badge_helper_spec.js b/spec/javascripts/image_diff/helpers/badge_helper_spec.js
index ce3add1fd90..8ea05203d00 100644
--- a/spec/javascripts/image_diff/helpers/badge_helper_spec.js
+++ b/spec/javascripts/image_diff/helpers/badge_helper_spec.js
@@ -90,6 +90,7 @@ describe('badge helper', () => {
it('should create icon comment button', () => {
const iconEl = buttonEl.querySelector('svg');
+
expect(iconEl).toBeDefined();
});
});
diff --git a/spec/javascripts/image_diff/helpers/comment_indicator_helper_spec.js b/spec/javascripts/image_diff/helpers/comment_indicator_helper_spec.js
index a284b981d2a..8e3e7f1222e 100644
--- a/spec/javascripts/image_diff/helpers/comment_indicator_helper_spec.js
+++ b/spec/javascripts/image_diff/helpers/comment_indicator_helper_spec.js
@@ -29,10 +29,12 @@ describe('commentIndicatorHelper', () => {
it('should contain image-comment-dark svg', () => {
const svgEl = buttonEl.querySelector('svg');
+
expect(svgEl).toBeDefined();
const svgLink = svgEl.querySelector('use').getAttribute('xlink:href');
- expect(svgLink.indexOf('image-comment-dark') !== -1).toEqual(true);
+
+ expect(svgLink.indexOf('image-comment-dark')).not.toBe(-1);
});
});
});
@@ -40,6 +42,7 @@ describe('commentIndicatorHelper', () => {
describe('removeCommentIndicator', () => {
it('should return removed false if there is no comment-indicator', () => {
const result = commentIndicatorHelper.removeCommentIndicator(containerEl);
+
expect(result.removed).toEqual(false);
});
@@ -84,6 +87,7 @@ describe('commentIndicatorHelper', () => {
it('should set commentIndicator coordinates', () => {
const commentIndicatorEl = containerEl.querySelector('.comment-indicator');
+
expect(commentIndicatorEl.style.left).toEqual(`${coordinate.x}px`);
expect(commentIndicatorEl.style.top).toEqual(`${coordinate.y}px`);
});
@@ -96,6 +100,7 @@ describe('commentIndicatorHelper', () => {
it('should addCommentIndicator', () => {
const buttonEl = containerEl.querySelector('.comment-indicator');
+
expect(buttonEl).toBeDefined();
expect(buttonEl.style.left).toEqual(`${coordinate.x}px`);
expect(buttonEl.style.top).toEqual(`${coordinate.y}px`);
diff --git a/spec/javascripts/image_diff/helpers/dom_helper_spec.js b/spec/javascripts/image_diff/helpers/dom_helper_spec.js
index 8dde924e8ae..ffe712af2dd 100644
--- a/spec/javascripts/image_diff/helpers/dom_helper_spec.js
+++ b/spec/javascripts/image_diff/helpers/dom_helper_spec.js
@@ -92,6 +92,7 @@ describe('domHelper', () => {
it('should force formEl to display none', () => {
const formEl = element.querySelector('.discussion-form');
+
expect(formEl.style.display).toEqual('none');
});
});
@@ -111,6 +112,7 @@ describe('domHelper', () => {
it('should force formEl to display block', () => {
const formEl = element.querySelector('.discussion-form');
+
expect(formEl.style.display).toEqual('block');
});
});
diff --git a/spec/javascripts/image_diff/helpers/utils_helper_spec.js b/spec/javascripts/image_diff/helpers/utils_helper_spec.js
index 31949c39d9c..6f62ee3f93b 100644
--- a/spec/javascripts/image_diff/helpers/utils_helper_spec.js
+++ b/spec/javascripts/image_diff/helpers/utils_helper_spec.js
@@ -5,13 +5,7 @@ import ImageBadge from '~/image_diff/image_badge';
import * as mockData from '../mock_data';
describe('utilsHelper', () => {
- const {
- noteId,
- discussionId,
- image,
- imageProperties,
- imageMeta,
- } = mockData;
+ const { noteId, discussionId, image, imageProperties, imageMeta } = mockData;
describe('resizeCoordinatesToImageElement', () => {
let result;
@@ -57,6 +51,7 @@ describe('utilsHelper', () => {
it('should return actual image properties', () => {
const { actual } = result;
+
expect(actual.x).toEqual(imageMeta.x);
expect(actual.y).toEqual(imageMeta.y);
expect(actual.width).toEqual(imageMeta.width);
@@ -65,6 +60,7 @@ describe('utilsHelper', () => {
it('should return browser image properties', () => {
const { browser } = result;
+
expect(browser.x).toBeDefined();
expect(browser.y).toBeDefined();
expect(browser.width).toBeDefined();
@@ -106,6 +102,7 @@ describe('utilsHelper', () => {
const result = utilsHelper.getTargetSelection(event);
const { browser } = result;
+
expect(browser.x).toEqual(event.offsetX);
expect(browser.y).toEqual(event.offsetY);
expect(browser.width).toEqual(imageProperties.width);
@@ -117,6 +114,7 @@ describe('utilsHelper', () => {
const result = utilsHelper.getTargetSelection(event);
const { actual } = result;
+
expect(actual.x).toEqual(100);
expect(actual.y).toEqual(100);
expect(actual.width).toEqual(imageProperties.naturalWidth);
@@ -127,24 +125,28 @@ describe('utilsHelper', () => {
it('should return x = 0 if x < 0', () => {
const event = generateEvent(-5, 50);
const result = utilsHelper.getTargetSelection(event);
+
expect(result.browser.x).toEqual(0);
});
it('should return x = width if x > width', () => {
const event = generateEvent(1000, 50);
const result = utilsHelper.getTargetSelection(event);
+
expect(result.browser.x).toEqual(imageProperties.width);
});
it('should return y = 0 if y < 0', () => {
const event = generateEvent(50, -10);
const result = utilsHelper.getTargetSelection(event);
+
expect(result.browser.y).toEqual(0);
});
it('should return y = height if y > height', () => {
const event = generateEvent(50, 1000);
const result = utilsHelper.getTargetSelection(event);
+
expect(result.browser.y).toEqual(imageProperties.height);
});
});
@@ -178,6 +180,7 @@ describe('utilsHelper', () => {
`;
const imageDiff = utilsHelper.initImageDiff(fileEl, true, false);
+
expect(ImageDiff.prototype.init).toHaveBeenCalled();
expect(imageDiff.canCreateNote).toEqual(true);
expect(imageDiff.renderCommentBadge).toEqual(false);
@@ -191,6 +194,7 @@ describe('utilsHelper', () => {
`;
const replacedImageDiff = utilsHelper.initImageDiff(fileEl, false, true);
+
expect(ReplacedImageDiff.prototype.init).toHaveBeenCalled();
expect(replacedImageDiff.canCreateNote).toEqual(false);
expect(replacedImageDiff.renderCommentBadge).toEqual(true);
diff --git a/spec/javascripts/image_diff/image_badge_spec.js b/spec/javascripts/image_diff/image_badge_spec.js
index 87f98fc0926..2b23dce5d30 100644
--- a/spec/javascripts/image_diff/image_badge_spec.js
+++ b/spec/javascripts/image_diff/image_badge_spec.js
@@ -10,11 +10,14 @@ describe('ImageBadge', () => {
};
it('should save actual property', () => {
- const imageBadge = new ImageBadge(Object.assign({}, options, {
- actual: imageMeta,
- }));
+ const imageBadge = new ImageBadge(
+ Object.assign({}, options, {
+ actual: imageMeta,
+ }),
+ );
const { actual } = imageBadge;
+
expect(actual.x).toEqual(imageMeta.x);
expect(actual.y).toEqual(imageMeta.y);
expect(actual.width).toEqual(imageMeta.width);
@@ -22,11 +25,14 @@ describe('ImageBadge', () => {
});
it('should save browser property', () => {
- const imageBadge = new ImageBadge(Object.assign({}, options, {
- browser: imageMeta,
- }));
+ const imageBadge = new ImageBadge(
+ Object.assign({}, options, {
+ browser: imageMeta,
+ }),
+ );
const { browser } = imageBadge;
+
expect(browser.x).toEqual(imageMeta.x);
expect(browser.y).toEqual(imageMeta.y);
expect(browser.width).toEqual(imageMeta.width);
@@ -35,11 +41,13 @@ describe('ImageBadge', () => {
it('should save noteId', () => {
const imageBadge = new ImageBadge(options);
+
expect(imageBadge.noteId).toEqual(noteId);
});
it('should save discussionId', () => {
const imageBadge = new ImageBadge(options);
+
expect(imageBadge.discussionId).toEqual(discussionId);
});
@@ -52,6 +60,7 @@ describe('ImageBadge', () => {
it('should return defaultimageMeta if actual property is not provided', () => {
const { actual } = imageBadge;
+
expect(actual.x).toEqual(0);
expect(actual.y).toEqual(0);
expect(actual.width).toEqual(0);
@@ -60,6 +69,7 @@ describe('ImageBadge', () => {
it('should return defaultimageMeta if browser property is not provided', () => {
const { browser } = imageBadge;
+
expect(browser.x).toEqual(0);
expect(browser.y).toEqual(0);
expect(browser.width).toEqual(0);
@@ -73,9 +83,11 @@ describe('ImageBadge', () => {
});
it('should generate browser property', () => {
- const imageBadge = new ImageBadge(Object.assign({}, options, {
- imageEl: document.createElement('img'),
- }));
+ const imageBadge = new ImageBadge(
+ Object.assign({}, options, {
+ imageEl: document.createElement('img'),
+ }),
+ );
expect(imageDiffHelper.resizeCoordinatesToImageElement).toHaveBeenCalled();
expect(imageBadge.browser).toEqual(true);
diff --git a/spec/javascripts/image_diff/image_diff_spec.js b/spec/javascripts/image_diff/image_diff_spec.js
index 346282328c7..21e7b8e2e9b 100644
--- a/spec/javascripts/image_diff/image_diff_spec.js
+++ b/spec/javascripts/image_diff/image_diff_spec.js
@@ -117,23 +117,15 @@ describe('ImageDiff', () => {
it('should register click event delegation to js-diff-notes-toggle', () => {
element.querySelector('.js-diff-notes-toggle').click();
+
expect(imageDiffHelper.toggleCollapsed).toHaveBeenCalled();
});
it('should register click event delegation to comment-indicator', () => {
element.querySelector('.comment-indicator').click();
- expect(imageDiffHelper.commentIndicatorOnClick).toHaveBeenCalled();
- });
- });
- describe('image loaded', () => {
- beforeEach(() => {
- spyOn(imageUtility, 'isImageLoaded').and.returnValue(true);
- imageDiff = new ImageDiff(element);
- imageDiff.imageEl = imageEl;
+ expect(imageDiffHelper.commentIndicatorOnClick).toHaveBeenCalled();
});
-
- it('should renderBadges', () => {});
});
describe('image not loaded', () => {
@@ -147,6 +139,7 @@ describe('ImageDiff', () => {
it('should registers load eventListener', () => {
const loadEvent = new Event('load');
imageEl.dispatchEvent(loadEvent);
+
expect(imageDiff.renderBadges).toHaveBeenCalled();
});
});
@@ -164,24 +157,28 @@ describe('ImageDiff', () => {
it('should register click.imageDiff event', () => {
const event = new CustomEvent('click.imageDiff');
element.dispatchEvent(event);
+
expect(imageDiff.imageClicked).toHaveBeenCalled();
});
it('should register blur.imageDiff event', () => {
const event = new CustomEvent('blur.imageDiff');
element.dispatchEvent(event);
+
expect(imageDiffHelper.removeCommentIndicator).toHaveBeenCalled();
});
it('should register addBadge.imageDiff event', () => {
const event = new CustomEvent('addBadge.imageDiff');
element.dispatchEvent(event);
+
expect(imageDiff.addBadge).toHaveBeenCalled();
});
it('should register removeBadge.imageDiff event', () => {
const event = new CustomEvent('removeBadge.imageDiff');
element.dispatchEvent(event);
+
expect(imageDiff.removeBadge).toHaveBeenCalled();
});
});
@@ -197,6 +194,7 @@ describe('ImageDiff', () => {
it('should not register click.imageDiff event', () => {
const event = new CustomEvent('click.imageDiff');
element.dispatchEvent(event);
+
expect(imageDiff.imageClicked).not.toHaveBeenCalled();
});
});
@@ -240,6 +238,7 @@ describe('ImageDiff', () => {
it('should call renderBadge for each discussionEl', () => {
const discussionEls = element.querySelectorAll('.note-container .discussion-notes .notes');
+
expect(imageDiff.renderBadge.calls.count()).toEqual(discussionEls.length);
});
});
@@ -336,6 +335,7 @@ describe('ImageDiff', () => {
describe('cascade badge count', () => {
it('should update next imageBadgeEl value', () => {
const imageBadgeEls = imageDiff.imageFrameEl.querySelectorAll('.badge');
+
expect(imageBadgeEls[0].innerText).toEqual('1');
expect(imageBadgeEls[1].innerText).toEqual('2');
expect(imageBadgeEls.length).toEqual(2);
diff --git a/spec/javascripts/image_diff/init_discussion_tab_spec.js b/spec/javascripts/image_diff/init_discussion_tab_spec.js
index 7c447d6f70d..7cacc45ab62 100644
--- a/spec/javascripts/image_diff/init_discussion_tab_spec.js
+++ b/spec/javascripts/image_diff/init_discussion_tab_spec.js
@@ -11,7 +11,7 @@ describe('initDiscussionTab', () => {
`);
});
- it('should pass canCreateNote as false to initImageDiff', (done) => {
+ it('should pass canCreateNote as false to initImageDiff', done => {
spyOn(imageDiffHelper, 'initImageDiff').and.callFake((diffFileEl, canCreateNote) => {
expect(canCreateNote).toEqual(false);
done();
@@ -20,11 +20,13 @@ describe('initDiscussionTab', () => {
initDiscussionTab();
});
- it('should pass renderCommentBadge as true to initImageDiff', (done) => {
- spyOn(imageDiffHelper, 'initImageDiff').and.callFake((diffFileEl, canCreateNote, renderCommentBadge) => {
- expect(renderCommentBadge).toEqual(true);
- done();
- });
+ it('should pass renderCommentBadge as true to initImageDiff', done => {
+ spyOn(imageDiffHelper, 'initImageDiff').and.callFake(
+ (diffFileEl, canCreateNote, renderCommentBadge) => {
+ expect(renderCommentBadge).toEqual(true);
+ done();
+ },
+ );
initDiscussionTab();
});
@@ -32,6 +34,7 @@ describe('initDiscussionTab', () => {
it('should call initImageDiff for each diffFileEls', () => {
spyOn(imageDiffHelper, 'initImageDiff').and.callFake(() => {});
initDiscussionTab();
+
expect(imageDiffHelper.initImageDiff.calls.count()).toEqual(2);
});
});
diff --git a/spec/javascripts/image_diff/replaced_image_diff_spec.js b/spec/javascripts/image_diff/replaced_image_diff_spec.js
index 5f8cd7c531a..62e7c8b6c6a 100644
--- a/spec/javascripts/image_diff/replaced_image_diff_spec.js
+++ b/spec/javascripts/image_diff/replaced_image_diff_spec.js
@@ -37,16 +37,28 @@ describe('ReplacedImageDiff', () => {
function setupImageFrameEls() {
replacedImageDiff.imageFrameEls = [];
- replacedImageDiff.imageFrameEls[viewTypes.TWO_UP] = element.querySelector('.two-up .js-image-frame');
- replacedImageDiff.imageFrameEls[viewTypes.SWIPE] = element.querySelector('.swipe .js-image-frame');
- replacedImageDiff.imageFrameEls[viewTypes.ONION_SKIN] = element.querySelector('.onion-skin .js-image-frame');
+ replacedImageDiff.imageFrameEls[viewTypes.TWO_UP] = element.querySelector(
+ '.two-up .js-image-frame',
+ );
+ replacedImageDiff.imageFrameEls[viewTypes.SWIPE] = element.querySelector(
+ '.swipe .js-image-frame',
+ );
+ replacedImageDiff.imageFrameEls[viewTypes.ONION_SKIN] = element.querySelector(
+ '.onion-skin .js-image-frame',
+ );
}
function setupViewModesEls() {
replacedImageDiff.viewModesEls = [];
- replacedImageDiff.viewModesEls[viewTypes.TWO_UP] = element.querySelector('.view-modes-menu .two-up');
- replacedImageDiff.viewModesEls[viewTypes.SWIPE] = element.querySelector('.view-modes-menu .swipe');
- replacedImageDiff.viewModesEls[viewTypes.ONION_SKIN] = element.querySelector('.view-modes-menu .onion-skin');
+ replacedImageDiff.viewModesEls[viewTypes.TWO_UP] = element.querySelector(
+ '.view-modes-menu .two-up',
+ );
+ replacedImageDiff.viewModesEls[viewTypes.SWIPE] = element.querySelector(
+ '.view-modes-menu .swipe',
+ );
+ replacedImageDiff.viewModesEls[viewTypes.ONION_SKIN] = element.querySelector(
+ '.view-modes-menu .onion-skin',
+ );
}
function setupImageEls() {
@@ -58,6 +70,7 @@ describe('ReplacedImageDiff', () => {
it('should extend ImageDiff', () => {
replacedImageDiff = new ReplacedImageDiff(element);
+
expect(replacedImageDiff instanceof ImageDiff).toEqual(true);
});
@@ -72,18 +85,36 @@ describe('ReplacedImageDiff', () => {
it('should set imageFrameEls', () => {
const { imageFrameEls } = replacedImageDiff;
+
expect(imageFrameEls).toBeDefined();
- expect(imageFrameEls[viewTypes.TWO_UP]).toEqual(element.querySelector('.two-up .js-image-frame'));
- expect(imageFrameEls[viewTypes.SWIPE]).toEqual(element.querySelector('.swipe .js-image-frame'));
- expect(imageFrameEls[viewTypes.ONION_SKIN]).toEqual(element.querySelector('.onion-skin .js-image-frame'));
+ expect(imageFrameEls[viewTypes.TWO_UP]).toEqual(
+ element.querySelector('.two-up .js-image-frame'),
+ );
+
+ expect(imageFrameEls[viewTypes.SWIPE]).toEqual(
+ element.querySelector('.swipe .js-image-frame'),
+ );
+
+ expect(imageFrameEls[viewTypes.ONION_SKIN]).toEqual(
+ element.querySelector('.onion-skin .js-image-frame'),
+ );
});
it('should set viewModesEls', () => {
const { viewModesEls } = replacedImageDiff;
+
expect(viewModesEls).toBeDefined();
- expect(viewModesEls[viewTypes.TWO_UP]).toEqual(element.querySelector('.view-modes-menu .two-up'));
- expect(viewModesEls[viewTypes.SWIPE]).toEqual(element.querySelector('.view-modes-menu .swipe'));
- expect(viewModesEls[viewTypes.ONION_SKIN]).toEqual(element.querySelector('.view-modes-menu .onion-skin'));
+ expect(viewModesEls[viewTypes.TWO_UP]).toEqual(
+ element.querySelector('.view-modes-menu .two-up'),
+ );
+
+ expect(viewModesEls[viewTypes.SWIPE]).toEqual(
+ element.querySelector('.view-modes-menu .swipe'),
+ );
+
+ expect(viewModesEls[viewTypes.ONION_SKIN]).toEqual(
+ element.querySelector('.view-modes-menu .onion-skin'),
+ );
});
it('should generateImageEls', () => {
@@ -97,6 +128,7 @@ describe('ReplacedImageDiff', () => {
describe('currentView', () => {
it('should set currentView', () => {
replacedImageDiff.init(viewTypes.ONION_SKIN);
+
expect(replacedImageDiff.currentView).toEqual(viewTypes.ONION_SKIN);
});
@@ -121,6 +153,7 @@ describe('ReplacedImageDiff', () => {
it('should set imageEls', () => {
replacedImageDiff.generateImageEls();
const { imageEls } = replacedImageDiff;
+
expect(imageEls).toBeDefined();
expect(imageEls[viewTypes.TWO_UP]).toEqual(element.querySelector('.two-up img'));
expect(imageEls[viewTypes.SWIPE]).toEqual(element.querySelector('.swipe img'));
@@ -138,11 +171,12 @@ describe('ReplacedImageDiff', () => {
it('should call super.bindEvents', () => {
replacedImageDiff.bindEvents();
+
expect(ImageDiff.prototype.bindEvents).toHaveBeenCalled();
});
- it('should register click eventlistener to 2-up view mode', (done) => {
- spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake((viewMode) => {
+ it('should register click eventlistener to 2-up view mode', done => {
+ spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake(viewMode => {
expect(viewMode).toEqual(viewTypes.TWO_UP);
done();
});
@@ -151,8 +185,8 @@ describe('ReplacedImageDiff', () => {
replacedImageDiff.viewModesEls[viewTypes.TWO_UP].click();
});
- it('should register click eventlistener to swipe view mode', (done) => {
- spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake((viewMode) => {
+ it('should register click eventlistener to swipe view mode', done => {
+ spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake(viewMode => {
expect(viewMode).toEqual(viewTypes.SWIPE);
done();
});
@@ -161,8 +195,8 @@ describe('ReplacedImageDiff', () => {
replacedImageDiff.viewModesEls[viewTypes.SWIPE].click();
});
- it('should register click eventlistener to onion skin view mode', (done) => {
- spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake((viewMode) => {
+ it('should register click eventlistener to onion skin view mode', done => {
+ spyOn(ReplacedImageDiff.prototype, 'changeView').and.callFake(viewMode => {
expect(viewMode).toEqual(viewTypes.SWIPE);
done();
});
@@ -184,6 +218,7 @@ describe('ReplacedImageDiff', () => {
expect(replacedImageDiff.imageEl).toEqual(element.querySelector('.two-up img'));
replacedImageDiff.currentView = viewTypes.SWIPE;
+
expect(replacedImageDiff.imageEl).toEqual(element.querySelector('.swipe img'));
});
});
@@ -196,10 +231,15 @@ describe('ReplacedImageDiff', () => {
});
it('should return imageFrameEl based on currentView', () => {
- expect(replacedImageDiff.imageFrameEl).toEqual(element.querySelector('.two-up .js-image-frame'));
+ expect(replacedImageDiff.imageFrameEl).toEqual(
+ element.querySelector('.two-up .js-image-frame'),
+ );
replacedImageDiff.currentView = viewTypes.ONION_SKIN;
- expect(replacedImageDiff.imageFrameEl).toEqual(element.querySelector('.onion-skin .js-image-frame'));
+
+ expect(replacedImageDiff.imageFrameEl).toEqual(
+ element.querySelector('.onion-skin .js-image-frame'),
+ );
});
});
});
@@ -248,6 +288,7 @@ describe('ReplacedImageDiff', () => {
it('should call renderNewView', () => {
jasmine.clock().tick(251);
+
expect(replacedImageDiff.renderNewView).toHaveBeenCalled();
});
});
@@ -284,7 +325,7 @@ describe('ReplacedImageDiff', () => {
setupImageFrameEls();
});
- it('should pass showCommentIndicator normalized indicator values', (done) => {
+ it('should pass showCommentIndicator normalized indicator values', done => {
spyOn(imageDiffHelper, 'showCommentIndicator').and.callFake(() => {});
spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement').and.callFake((imageEl, meta) => {
expect(meta.x).toEqual(indicator.x);
@@ -296,15 +337,17 @@ describe('ReplacedImageDiff', () => {
replacedImageDiff.renderNewView(indicator);
});
- it('should call showCommentIndicator', (done) => {
+ it('should call showCommentIndicator', done => {
const normalized = {
normalized: true,
};
spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement').and.returnValue(normalized);
- spyOn(imageDiffHelper, 'showCommentIndicator').and.callFake((imageFrameEl, normalizedIndicator) => {
- expect(normalizedIndicator).toEqual(normalized);
- done();
- });
+ spyOn(imageDiffHelper, 'showCommentIndicator').and.callFake(
+ (imageFrameEl, normalizedIndicator) => {
+ expect(normalizedIndicator).toEqual(normalized);
+ done();
+ },
+ );
replacedImageDiff.renderNewView(indicator);
});
});
diff --git a/spec/javascripts/importer_status_spec.js b/spec/javascripts/importer_status_spec.js
index 63cdb3d5114..e7f195ed57c 100644
--- a/spec/javascripts/importer_status_spec.js
+++ b/spec/javascripts/importer_status_spec.js
@@ -35,38 +35,43 @@ describe('Importer Status', () => {
});
});
- it('sets table row to active after post request', (done) => {
+ it('sets table row to active after post request', done => {
mock.onPost(importUrl).reply(200, {
id: 1,
full_path: '/full_path',
});
- instance.addToImport({
- currentTarget: document.querySelector('.js-add-to-import'),
- })
- .then(() => {
- expect(document.querySelector('tr').classList.contains('table-active')).toEqual(true);
- done();
- })
- .catch(done.fail);
+ instance
+ .addToImport({
+ currentTarget: document.querySelector('.js-add-to-import'),
+ })
+ .then(() => {
+ expect(document.querySelector('tr').classList.contains('table-active')).toEqual(true);
+ done();
+ })
+ .catch(done.fail);
});
- it('shows error message after failed POST request', (done) => {
+ it('shows error message after failed POST request', done => {
appendSetFixtures('<div class="flash-container"></div>');
mock.onPost(importUrl).reply(422, {
errors: 'You forgot your lunch',
});
- instance.addToImport({
- currentTarget: document.querySelector('.js-add-to-import'),
- })
- .then(() => {
- const flashMessage = document.querySelector('.flash-text');
- expect(flashMessage.textContent.trim()).toEqual('An error occurred while importing project: You forgot your lunch');
- done();
- })
- .catch(done.fail);
+ instance
+ .addToImport({
+ currentTarget: document.querySelector('.js-add-to-import'),
+ })
+ .then(() => {
+ const flashMessage = document.querySelector('.flash-text');
+
+ expect(flashMessage.textContent.trim()).toEqual(
+ 'An error occurred while importing project: You forgot your lunch',
+ );
+ done();
+ })
+ .catch(done.fail);
});
});
@@ -92,14 +97,17 @@ describe('Importer Status', () => {
});
function setupMock(importStatus) {
- mock.onGet(jobsUrl).reply(200, [{
- id: 1,
- import_status: importStatus,
- }]);
+ mock.onGet(jobsUrl).reply(200, [
+ {
+ id: 1,
+ import_status: importStatus,
+ },
+ ]);
}
function expectJobStatus(done, status) {
- instance.autoUpdate()
+ instance
+ .autoUpdate()
.then(() => {
expect(document.querySelector('#project_1').innerText.trim()).toEqual(status);
done();
@@ -107,22 +115,22 @@ describe('Importer Status', () => {
.catch(done.fail);
}
- it('sets the job status to done', (done) => {
+ it('sets the job status to done', done => {
setupMock('finished');
expectJobStatus(done, 'Done');
});
- it('sets the job status to scheduled', (done) => {
+ it('sets the job status to scheduled', done => {
setupMock('scheduled');
expectJobStatus(done, 'Scheduled');
});
- it('sets the job status to started', (done) => {
+ it('sets the job status to started', done => {
setupMock('started');
expectJobStatus(done, 'Started');
});
- it('sets the job status to custom status', (done) => {
+ it('sets the job status to custom status', done => {
setupMock('custom status');
expectJobStatus(done, 'custom status');
});
diff --git a/spec/javascripts/integrations/integration_settings_form_spec.js b/spec/javascripts/integrations/integration_settings_form_spec.js
index e07343810d2..4f4c9a7b463 100644
--- a/spec/javascripts/integrations/integration_settings_form_spec.js
+++ b/spec/javascripts/integrations/integration_settings_form_spec.js
@@ -68,21 +68,27 @@ describe('IntegrationSettingsForm', () => {
integrationSettingsForm.canTestService = true;
integrationSettingsForm.toggleSubmitBtnLabel(true);
- expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Test settings and save changes');
+
+ expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual(
+ 'Test settings and save changes',
+ );
});
it('should set Save button label to "Save changes" when either serviceActive or canTestService (or both) is `false`', () => {
integrationSettingsForm.canTestService = false;
integrationSettingsForm.toggleSubmitBtnLabel(false);
+
expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');
integrationSettingsForm.toggleSubmitBtnLabel(true);
+
expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');
integrationSettingsForm.canTestService = true;
integrationSettingsForm.toggleSubmitBtnLabel(false);
+
expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');
});
});
@@ -127,8 +133,9 @@ describe('IntegrationSettingsForm', () => {
mock.restore();
});
- it('should make an ajax request with provided `formData`', (done) => {
- integrationSettingsForm.testSettings(formData)
+ it('should make an ajax request with provided `formData`', done => {
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
expect(axios.put).toHaveBeenCalledWith(integrationSettingsForm.testEndPoint, formData);
@@ -137,7 +144,7 @@ describe('IntegrationSettingsForm', () => {
.catch(done.fail);
});
- it('should show error Flash with `Save anyway` action if ajax request responds with error in test', (done) => {
+ it('should show error Flash with `Save anyway` action if ajax request responds with error in test', done => {
const errorMessage = 'Test failed.';
mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
error: true,
@@ -146,19 +153,32 @@ describe('IntegrationSettingsForm', () => {
test_failed: true,
});
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
const $flashContainer = $('.flash-container');
- expect($flashContainer.find('.flash-text').text().trim()).toEqual('Test failed. some error');
+
+ expect(
+ $flashContainer
+ .find('.flash-text')
+ .text()
+ .trim(),
+ ).toEqual('Test failed. some error');
+
expect($flashContainer.find('.flash-action')).toBeDefined();
- expect($flashContainer.find('.flash-action').text().trim()).toEqual('Save anyway');
+ expect(
+ $flashContainer
+ .find('.flash-action')
+ .text()
+ .trim(),
+ ).toEqual('Save anyway');
done();
})
.catch(done.fail);
});
- it('should not show error Flash with `Save anyway` action if ajax request responds with error in validation', (done) => {
+ it('should not show error Flash with `Save anyway` action if ajax request responds with error in validation', done => {
const errorMessage = 'Validations failed.';
mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
error: true,
@@ -167,26 +187,40 @@ describe('IntegrationSettingsForm', () => {
test_failed: false,
});
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
const $flashContainer = $('.flash-container');
- expect($flashContainer.find('.flash-text').text().trim()).toEqual('Validations failed. some error');
+
+ expect(
+ $flashContainer
+ .find('.flash-text')
+ .text()
+ .trim(),
+ ).toEqual('Validations failed. some error');
+
expect($flashContainer.find('.flash-action')).toBeDefined();
- expect($flashContainer.find('.flash-action').text().trim()).toEqual('');
+ expect(
+ $flashContainer
+ .find('.flash-action')
+ .text()
+ .trim(),
+ ).toEqual('');
done();
})
.catch(done.fail);
});
- it('should submit form if ajax request responds without any error in test', (done) => {
+ it('should submit form if ajax request responds without any error in test', done => {
spyOn(integrationSettingsForm.$form, 'submit');
mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
error: false,
});
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
expect(integrationSettingsForm.$form.submit).toHaveBeenCalled();
@@ -195,7 +229,7 @@ describe('IntegrationSettingsForm', () => {
.catch(done.fail);
});
- it('should submit form when clicked on `Save anyway` action of error Flash', (done) => {
+ it('should submit form when clicked on `Save anyway` action of error Flash', done => {
spyOn(integrationSettingsForm.$form, 'submit');
const errorMessage = 'Test failed.';
@@ -205,9 +239,11 @@ describe('IntegrationSettingsForm', () => {
test_failed: true,
});
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
const $flashAction = $('.flash-container .flash-action');
+
expect($flashAction).toBeDefined();
$flashAction.get(0).click();
@@ -220,26 +256,32 @@ describe('IntegrationSettingsForm', () => {
.catch(done.fail);
});
- it('should show error Flash if ajax request failed', (done) => {
+ it('should show error Flash if ajax request failed', done => {
const errorMessage = 'Something went wrong on our end.';
mock.onPut(integrationSettingsForm.testEndPoint).networkError();
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
- expect($('.flash-container .flash-text').text().trim()).toEqual(errorMessage);
+ expect(
+ $('.flash-container .flash-text')
+ .text()
+ .trim(),
+ ).toEqual(errorMessage);
done();
})
.catch(done.fail);
});
- it('should always call `toggleSubmitBtnState` with `false` once request is completed', (done) => {
+ it('should always call `toggleSubmitBtnState` with `false` once request is completed', done => {
mock.onPut(integrationSettingsForm.testEndPoint).networkError();
spyOn(integrationSettingsForm, 'toggleSubmitBtnState');
- integrationSettingsForm.testSettings(formData)
+ integrationSettingsForm
+ .testSettings(formData)
.then(() => {
expect(integrationSettingsForm.toggleSubmitBtnState).toHaveBeenCalledWith(false);
diff --git a/spec/javascripts/issuable_spec.js b/spec/javascripts/issuable_spec.js
index 57bf746f080..25543053eba 100644
--- a/spec/javascripts/issuable_spec.js
+++ b/spec/javascripts/issuable_spec.js
@@ -8,6 +8,7 @@ describe('Issuable', () => {
describe('initBulkUpdate', () => {
it('should not set bulkUpdateSidebar', () => {
Issuable = new IssuableIndex('issue_');
+
expect(Issuable.bulkUpdateSidebar).not.toBeDefined();
});
@@ -17,6 +18,7 @@ describe('Issuable', () => {
document.body.appendChild(element);
Issuable = new IssuableIndex('issue_');
+
expect(Issuable.bulkUpdateSidebar).toBeDefined();
});
});
@@ -47,7 +49,7 @@ describe('Issuable', () => {
mock.restore();
});
- it('should send request to reset email token', (done) => {
+ it('should send request to reset email token', done => {
spyOn(axios, 'put').and.callThrough();
document.querySelector('.incoming-email-token-reset').click();
@@ -60,4 +62,3 @@ describe('Issuable', () => {
});
});
});
-
diff --git a/spec/javascripts/issue_show/components/app_spec.js b/spec/javascripts/issue_show/components/app_spec.js
index 36328382448..2bd1b3996dc 100644
--- a/spec/javascripts/issue_show/components/app_spec.js
+++ b/spec/javascripts/issue_show/components/app_spec.js
@@ -11,10 +11,7 @@ function formatText(text) {
return text.trim().replace(/\s\s+/g, ' ');
}
-const REALTIME_REQUEST_STACK = [
- issueShowData.initialRequest,
- issueShowData.secondRequest,
-];
+const REALTIME_REQUEST_STACK = [issueShowData.initialRequest, issueShowData.secondRequest];
describe('Issuable output', () => {
let mock;
@@ -23,7 +20,7 @@ describe('Issuable output', () => {
document.body.innerHTML = '<span id="task_status"></span>';
- beforeEach((done) => {
+ beforeEach(done => {
spyOn(eventHub, '$emit');
const IssuableDescriptionComponent = Vue.extend(issuableApp);
@@ -64,65 +61,67 @@ describe('Issuable output', () => {
vm.$destroy();
});
- it('should render a title/description/edited and update title/description/edited on update', (done) => {
+ it('should render a title/description/edited and update title/description/edited on update', done => {
let editedText;
Vue.nextTick()
- .then(() => {
- editedText = vm.$el.querySelector('.edited-text');
- })
- .then(() => {
- expect(document.querySelector('title').innerText).toContain('this is a title (#1)');
- expect(vm.$el.querySelector('.title').innerHTML).toContain('<p>this is a title</p>');
- expect(vm.$el.querySelector('.wiki').innerHTML).toContain('<p>this is a description!</p>');
- expect(vm.$el.querySelector('.js-task-list-field').value).toContain('this is a description');
- expect(formatText(editedText.innerText)).toMatch(/Edited[\s\S]+?by Some User/);
- expect(editedText.querySelector('.author-link').href).toMatch(/\/some_user$/);
- expect(editedText.querySelector('time')).toBeTruthy();
- })
- .then(() => {
- vm.poll.makeRequest();
- })
- .then(() => new Promise(resolve => setTimeout(resolve)))
- .then(() => {
- expect(document.querySelector('title').innerText).toContain('2 (#1)');
- expect(vm.$el.querySelector('.title').innerHTML).toContain('<p>2</p>');
- expect(vm.$el.querySelector('.wiki').innerHTML).toContain('<p>42</p>');
- expect(vm.$el.querySelector('.js-task-list-field').value).toContain('42');
- expect(vm.$el.querySelector('.edited-text')).toBeTruthy();
- expect(formatText(vm.$el.querySelector('.edited-text').innerText)).toMatch(/Edited[\s\S]+?by Other User/);
- expect(editedText.querySelector('.author-link').href).toMatch(/\/other_user$/);
- expect(editedText.querySelector('time')).toBeTruthy();
- })
- .then(done)
- .catch(done.fail);
+ .then(() => {
+ editedText = vm.$el.querySelector('.edited-text');
+ })
+ .then(() => {
+ expect(document.querySelector('title').innerText).toContain('this is a title (#1)');
+ expect(vm.$el.querySelector('.title').innerHTML).toContain('<p>this is a title</p>');
+ expect(vm.$el.querySelector('.wiki').innerHTML).toContain('<p>this is a description!</p>');
+ expect(vm.$el.querySelector('.js-task-list-field').value).toContain(
+ 'this is a description',
+ );
+
+ expect(formatText(editedText.innerText)).toMatch(/Edited[\s\S]+?by Some User/);
+ expect(editedText.querySelector('.author-link').href).toMatch(/\/some_user$/);
+ expect(editedText.querySelector('time')).toBeTruthy();
+ })
+ .then(() => {
+ vm.poll.makeRequest();
+ })
+ .then(() => new Promise(resolve => setTimeout(resolve)))
+ .then(() => {
+ expect(document.querySelector('title').innerText).toContain('2 (#1)');
+ expect(vm.$el.querySelector('.title').innerHTML).toContain('<p>2</p>');
+ expect(vm.$el.querySelector('.wiki').innerHTML).toContain('<p>42</p>');
+ expect(vm.$el.querySelector('.js-task-list-field').value).toContain('42');
+ expect(vm.$el.querySelector('.edited-text')).toBeTruthy();
+ expect(formatText(vm.$el.querySelector('.edited-text').innerText)).toMatch(
+ /Edited[\s\S]+?by Other User/,
+ );
+
+ expect(editedText.querySelector('.author-link').href).toMatch(/\/other_user$/);
+ expect(editedText.querySelector('time')).toBeTruthy();
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('shows actions if permissions are correct', (done) => {
+ it('shows actions if permissions are correct', done => {
vm.showForm = true;
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.btn')).not.toBeNull();
done();
});
});
- it('does not show actions if permissions are incorrect', (done) => {
+ it('does not show actions if permissions are incorrect', done => {
vm.showForm = true;
vm.canUpdate = false;
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.btn')).toBeNull();
done();
});
});
- it('does not update formState if form is already open', (done) => {
+ it('does not update formState if form is already open', done => {
vm.openForm();
vm.state.titleText = 'testing 123';
@@ -130,25 +129,26 @@ describe('Issuable output', () => {
vm.openForm();
Vue.nextTick(() => {
- expect(
- vm.store.formState.title,
- ).not.toBe('testing 123');
+ expect(vm.store.formState.title).not.toBe('testing 123');
done();
});
});
describe('updateIssuable', () => {
- it('fetches new data after update', (done) => {
+ it('fetches new data after update', done => {
spyOn(vm.service, 'getData').and.callThrough();
- spyOn(vm.service, 'updateIssuable').and.callFake(() => new Promise((resolve) => {
- resolve({
- data: {
- confidential: false,
- web_url: window.location.pathname,
- },
- });
- }));
+ spyOn(vm.service, 'updateIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ confidential: false,
+ web_url: window.location.pathname,
+ },
+ });
+ }),
+ );
vm.updateIssuable()
.then(() => {
@@ -158,10 +158,13 @@ describe('Issuable output', () => {
.catch(done.fail);
});
- it('correctly updates issuable data', (done) => {
- spyOn(vm.service, 'updateIssuable').and.callFake(() => new Promise((resolve) => {
- resolve();
- }));
+ it('correctly updates issuable data', done => {
+ spyOn(vm.service, 'updateIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve();
+ }),
+ );
vm.updateIssuable()
.then(() => {
@@ -172,16 +175,19 @@ describe('Issuable output', () => {
.catch(done.fail);
});
- it('does not redirect if issue has not moved', (done) => {
+ it('does not redirect if issue has not moved', done => {
const visitUrl = spyOnDependency(issuableApp, 'visitUrl');
- spyOn(vm.service, 'updateIssuable').and.callFake(() => new Promise((resolve) => {
- resolve({
- data: {
- web_url: window.location.pathname,
- confidential: vm.isConfidential,
- },
- });
- }));
+ spyOn(vm.service, 'updateIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ web_url: window.location.pathname,
+ confidential: vm.isConfidential,
+ },
+ });
+ }),
+ );
vm.updateIssuable();
@@ -191,16 +197,19 @@ describe('Issuable output', () => {
});
});
- it('redirects if returned web_url has changed', (done) => {
+ it('redirects if returned web_url has changed', done => {
const visitUrl = spyOnDependency(issuableApp, 'visitUrl');
- spyOn(vm.service, 'updateIssuable').and.callFake(() => new Promise((resolve) => {
- resolve({
- data: {
- web_url: '/testing-issue-move',
- confidential: vm.isConfidential,
- },
- });
- }));
+ spyOn(vm.service, 'updateIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ web_url: '/testing-issue-move',
+ confidential: vm.isConfidential,
+ },
+ });
+ }),
+ );
vm.updateIssuable();
@@ -211,7 +220,7 @@ describe('Issuable output', () => {
});
describe('shows dialog when issue has unsaved changed', () => {
- it('confirms on title change', (done) => {
+ it('confirms on title change', done => {
vm.showForm = true;
vm.state.titleText = 'title has changed';
const e = { returnValue: null };
@@ -222,7 +231,7 @@ describe('Issuable output', () => {
});
});
- it('confirms on description change', (done) => {
+ it('confirms on description change', done => {
vm.showForm = true;
vm.state.descriptionText = 'description has changed';
const e = { returnValue: null };
@@ -233,7 +242,7 @@ describe('Issuable output', () => {
});
});
- it('does nothing when nothing has changed', (done) => {
+ it('does nothing when nothing has changed', done => {
const e = { returnValue: null };
vm.handleBeforeUnloadEvent(e);
Vue.nextTick(() => {
@@ -246,39 +255,36 @@ describe('Issuable output', () => {
describe('error when updating', () => {
beforeEach(() => {
spyOn(window, 'Flash').and.callThrough();
- spyOn(vm.service, 'updateIssuable').and.callFake(() => new Promise((resolve, reject) => {
- reject();
- }));
+ spyOn(vm.service, 'updateIssuable').and.callFake(
+ () =>
+ new Promise((resolve, reject) => {
+ reject();
+ }),
+ );
});
- it('closes form on error', (done) => {
+ it('closes form on error', done => {
vm.updateIssuable();
setTimeout(() => {
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('close.form');
- expect(
- window.Flash,
- ).toHaveBeenCalledWith('Error updating issue');
+ expect(eventHub.$emit).toHaveBeenCalledWith('close.form');
+
+ expect(window.Flash).toHaveBeenCalledWith('Error updating issue');
done();
});
});
- it('returns the correct error message for issuableType', (done) => {
+ it('returns the correct error message for issuableType', done => {
vm.issuableType = 'merge request';
Vue.nextTick(() => {
vm.updateIssuable();
setTimeout(() => {
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('close.form');
- expect(
- window.Flash,
- ).toHaveBeenCalledWith('Error updating merge request');
+ expect(eventHub.$emit).toHaveBeenCalledWith('close.form');
+
+ expect(window.Flash).toHaveBeenCalledWith('Error updating merge request');
done();
});
@@ -287,16 +293,18 @@ describe('Issuable output', () => {
});
});
- it('opens recaptcha modal if update rejected as spam', (done) => {
+ it('opens recaptcha modal if update rejected as spam', done => {
function mockScriptSrc() {
- const recaptchaChild = vm.$children
- .find(child => child.$options._componentTag === 'recaptcha-modal'); // eslint-disable-line no-underscore-dangle
+ const recaptchaChild = vm.$children.find(
+ // eslint-disable-next-line no-underscore-dangle
+ child => child.$options._componentTag === 'recaptcha-modal',
+ );
recaptchaChild.scriptSrc = '//scriptsrc';
}
let modal;
- const promise = new Promise((resolve) => {
+ const promise = new Promise(resolve => {
resolve({
data: {
recaptcha_html: '<div class="g-recaptcha">recaptcha_html</div>',
@@ -332,15 +340,18 @@ describe('Issuable output', () => {
});
describe('deleteIssuable', () => {
- it('changes URL when deleted', (done) => {
+ it('changes URL when deleted', done => {
const visitUrl = spyOnDependency(issuableApp, 'visitUrl');
- spyOn(vm.service, 'deleteIssuable').and.callFake(() => new Promise((resolve) => {
- resolve({
- data: {
- web_url: '/test',
- },
- });
- }));
+ spyOn(vm.service, 'deleteIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ web_url: '/test',
+ },
+ });
+ }),
+ );
vm.deleteIssuable();
@@ -350,42 +361,43 @@ describe('Issuable output', () => {
});
});
- it('stops polling when deleting', (done) => {
+ it('stops polling when deleting', done => {
spyOnDependency(issuableApp, 'visitUrl');
spyOn(vm.poll, 'stop').and.callThrough();
- spyOn(vm.service, 'deleteIssuable').and.callFake(() => new Promise((resolve) => {
- resolve({
- data: {
- web_url: '/test',
- },
- });
- }));
+ spyOn(vm.service, 'deleteIssuable').and.callFake(
+ () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ web_url: '/test',
+ },
+ });
+ }),
+ );
vm.deleteIssuable();
setTimeout(() => {
- expect(
- vm.poll.stop,
- ).toHaveBeenCalledWith();
+ expect(vm.poll.stop).toHaveBeenCalledWith();
done();
});
});
- it('closes form on error', (done) => {
+ it('closes form on error', done => {
spyOn(window, 'Flash').and.callThrough();
- spyOn(vm.service, 'deleteIssuable').and.callFake(() => new Promise((resolve, reject) => {
- reject();
- }));
+ spyOn(vm.service, 'deleteIssuable').and.callFake(
+ () =>
+ new Promise((resolve, reject) => {
+ reject();
+ }),
+ );
vm.deleteIssuable();
setTimeout(() => {
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('close.form');
- expect(
- window.Flash,
- ).toHaveBeenCalledWith('Error deleting issue');
+ expect(eventHub.$emit).toHaveBeenCalledWith('close.form');
+
+ expect(window.Flash).toHaveBeenCalledWith('Error deleting issue');
done();
});
@@ -393,7 +405,7 @@ describe('Issuable output', () => {
});
describe('open form', () => {
- it('shows locked warning if form is open & data is different', (done) => {
+ it('shows locked warning if form is open & data is different', done => {
vm.$nextTick()
.then(() => {
vm.openForm();
@@ -422,6 +434,7 @@ describe('Issuable output', () => {
it('should render if showInlineEditButton', () => {
vm.showInlineEditButton = true;
+
expect(vm.$el.querySelector('.title-container .note-action-button')).toBeDefined();
});
});
diff --git a/spec/javascripts/issue_show/components/description_spec.js b/spec/javascripts/issue_show/components/description_spec.js
index 889c8545faa..463f3c89926 100644
--- a/spec/javascripts/issue_show/components/description_spec.js
+++ b/spec/javascripts/issue_show/components/description_spec.js
@@ -33,7 +33,7 @@ describe('Description component', () => {
vm.$destroy();
});
- it('animates description changes', (done) => {
+ it('animates description changes', done => {
vm.descriptionHtml = 'changed';
Vue.nextTick(() => {
@@ -51,10 +51,12 @@ describe('Description component', () => {
});
});
- it('opens recaptcha dialog if update rejected as spam', (done) => {
+ it('opens recaptcha dialog if update rejected as spam', done => {
let modal;
- const recaptchaChild = vm.$children
- .find(child => child.$options._componentTag === 'recaptcha-modal'); // eslint-disable-line no-underscore-dangle
+ const recaptchaChild = vm.$children.find(
+ // eslint-disable-next-line no-underscore-dangle
+ child => child.$options._componentTag === 'recaptcha-modal',
+ );
recaptchaChild.scriptSrc = '//scriptsrc';
@@ -84,13 +86,16 @@ describe('Description component', () => {
let TaskList;
beforeEach(() => {
- vm = mountComponent(DescriptionComponent, Object.assign({}, props, {
- issuableType: 'issuableType',
- }));
+ vm = mountComponent(
+ DescriptionComponent,
+ Object.assign({}, props, {
+ issuableType: 'issuableType',
+ }),
+ );
TaskList = spyOnDependency(Description, 'TaskList');
});
- it('re-inits the TaskList when description changed', (done) => {
+ it('re-inits the TaskList when description changed', done => {
vm.descriptionHtml = 'changed';
setTimeout(() => {
@@ -99,7 +104,7 @@ describe('Description component', () => {
});
});
- it('does not re-init the TaskList when canUpdate is false', (done) => {
+ it('does not re-init the TaskList when canUpdate is false', done => {
vm.canUpdate = false;
vm.descriptionHtml = 'changed';
@@ -109,7 +114,7 @@ describe('Description component', () => {
});
});
- it('calls with issuableType dataType', (done) => {
+ it('calls with issuableType dataType', done => {
vm.descriptionHtml = 'changed';
setTimeout(() => {
@@ -125,44 +130,42 @@ describe('Description component', () => {
});
describe('taskStatus', () => {
- it('adds full taskStatus', (done) => {
+ it('adds full taskStatus', done => {
vm.taskStatus = '1 of 1';
setTimeout(() => {
- expect(
- document.querySelector('.issuable-meta #task_status').textContent.trim(),
- ).toBe('1 of 1');
+ expect(document.querySelector('.issuable-meta #task_status').textContent.trim()).toBe(
+ '1 of 1',
+ );
done();
});
});
- it('adds short taskStatus', (done) => {
+ it('adds short taskStatus', done => {
vm.taskStatus = '1 of 1';
setTimeout(() => {
- expect(
- document.querySelector('.issuable-meta #task_status_short').textContent.trim(),
- ).toBe('1/1 task');
+ expect(document.querySelector('.issuable-meta #task_status_short').textContent.trim()).toBe(
+ '1/1 task',
+ );
done();
});
});
- it('clears task status text when no tasks are present', (done) => {
+ it('clears task status text when no tasks are present', done => {
vm.taskStatus = '0 of 0';
setTimeout(() => {
- expect(
- document.querySelector('.issuable-meta #task_status').textContent.trim(),
- ).toBe('');
+ expect(document.querySelector('.issuable-meta #task_status').textContent.trim()).toBe('');
done();
});
});
});
- it('applies syntax highlighting and math when description changed', (done) => {
+ it('applies syntax highlighting and math when description changed', done => {
spyOn(vm, 'renderGFM').and.callThrough();
spyOn($.prototype, 'renderGFM').and.callThrough();
vm.descriptionHtml = 'changed';
diff --git a/spec/javascripts/issue_show/components/edit_actions_spec.js b/spec/javascripts/issue_show/components/edit_actions_spec.js
index d779ab7bb31..d92c54ea83f 100644
--- a/spec/javascripts/issue_show/components/edit_actions_spec.js
+++ b/spec/javascripts/issue_show/components/edit_actions_spec.js
@@ -6,7 +6,7 @@ import Store from '~/issue_show/stores';
describe('Edit Actions components', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
const Component = Vue.extend(editActions);
const store = new Store({
titleHtml: '',
@@ -21,6 +21,7 @@ describe('Edit Actions components', () => {
propsData: {
canDestroy: true,
formState: store.formState,
+ issuableType: 'issue',
},
}).$mount();
@@ -28,40 +29,32 @@ describe('Edit Actions components', () => {
});
it('renders all buttons as enabled', () => {
- expect(
- vm.$el.querySelectorAll('.disabled').length,
- ).toBe(0);
+ expect(vm.$el.querySelectorAll('.disabled').length).toBe(0);
- expect(
- vm.$el.querySelectorAll('[disabled]').length,
- ).toBe(0);
+ expect(vm.$el.querySelectorAll('[disabled]').length).toBe(0);
});
- it('does not render delete button if canUpdate is false', (done) => {
+ it('does not render delete button if canUpdate is false', done => {
vm.canDestroy = false;
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn-danger'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.btn-danger')).toBeNull();
done();
});
});
- it('disables submit button when title is blank', (done) => {
+ it('disables submit button when title is blank', done => {
vm.formState.title = '';
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn-save').getAttribute('disabled'),
- ).toBe('disabled');
+ expect(vm.$el.querySelector('.btn-success').getAttribute('disabled')).toBe('disabled');
done();
});
});
- it('should not show delete button if showDeleteButton is false', (done) => {
+ it('should not show delete button if showDeleteButton is false', done => {
vm.showDeleteButton = false;
Vue.nextTick(() => {
@@ -72,32 +65,26 @@ describe('Edit Actions components', () => {
describe('updateIssuable', () => {
it('sends update.issauble event when clicking save button', () => {
- vm.$el.querySelector('.btn-save').click();
+ vm.$el.querySelector('.btn-success').click();
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('update.issuable');
+ expect(eventHub.$emit).toHaveBeenCalledWith('update.issuable');
});
- it('shows loading icon after clicking save button', (done) => {
- vm.$el.querySelector('.btn-save').click();
+ it('shows loading icon after clicking save button', done => {
+ vm.$el.querySelector('.btn-success').click();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn-save .fa'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.btn-success .fa')).not.toBeNull();
done();
});
});
- it('disabled button after clicking save button', (done) => {
- vm.$el.querySelector('.btn-save').click();
+ it('disabled button after clicking save button', done => {
+ vm.$el.querySelector('.btn-success').click();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn-save').getAttribute('disabled'),
- ).toBe('disabled');
+ expect(vm.$el.querySelector('.btn-success').getAttribute('disabled')).toBe('disabled');
done();
});
@@ -108,9 +95,7 @@ describe('Edit Actions components', () => {
it('emits close.form when clicking cancel', () => {
vm.$el.querySelector('.btn-default').click();
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('close.form');
+ expect(eventHub.$emit).toHaveBeenCalledWith('close.form');
});
});
@@ -119,35 +104,28 @@ describe('Edit Actions components', () => {
spyOn(window, 'confirm').and.returnValue(true);
vm.$el.querySelector('.btn-danger').click();
- expect(
- eventHub.$emit,
- ).toHaveBeenCalledWith('delete.issuable');
+ expect(eventHub.$emit).toHaveBeenCalledWith('delete.issuable');
});
- it('shows loading icon after clicking delete button', (done) => {
+ it('shows loading icon after clicking delete button', done => {
spyOn(window, 'confirm').and.returnValue(true);
vm.$el.querySelector('.btn-danger').click();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.btn-danger .fa'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.btn-danger .fa')).not.toBeNull();
done();
});
});
- it('does no actions when confirm is false', (done) => {
+ it('does no actions when confirm is false', done => {
spyOn(window, 'confirm').and.returnValue(false);
vm.$el.querySelector('.btn-danger').click();
Vue.nextTick(() => {
- expect(
- eventHub.$emit,
- ).not.toHaveBeenCalledWith('delete.issuable');
- expect(
- vm.$el.querySelector('.btn-danger .fa'),
- ).toBeNull();
+ expect(eventHub.$emit).not.toHaveBeenCalledWith('delete.issuable');
+
+ expect(vm.$el.querySelector('.btn-danger .fa')).toBeNull();
done();
});
diff --git a/spec/javascripts/issue_show/components/fields/description_spec.js b/spec/javascripts/issue_show/components/fields/description_spec.js
index 299f88e7778..2c3efc8d4d4 100644
--- a/spec/javascripts/issue_show/components/fields/description_spec.js
+++ b/spec/javascripts/issue_show/components/fields/description_spec.js
@@ -8,7 +8,7 @@ describe('Description field component', () => {
let vm;
let store;
- beforeEach((done) => {
+ beforeEach(done => {
const Component = Vue.extend(descriptionField);
const el = document.createElement('div');
store = new Store({
@@ -35,42 +35,32 @@ describe('Description field component', () => {
});
it('renders markdown field with description', () => {
- expect(
- vm.$el.querySelector('.md-area textarea').value,
- ).toBe('test');
+ expect(vm.$el.querySelector('.md-area textarea').value).toBe('test');
});
- it('renders markdown field with a markdown description', (done) => {
+ it('renders markdown field with a markdown description', done => {
store.formState.description = '**test**';
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.md-area textarea').value,
- ).toBe('**test**');
+ expect(vm.$el.querySelector('.md-area textarea').value).toBe('**test**');
done();
});
});
it('focuses field when mounted', () => {
- expect(
- document.activeElement,
- ).toBe(vm.$refs.textarea);
+ expect(document.activeElement).toBe(vm.$refs.textarea);
});
it('triggers update with meta+enter', () => {
vm.$el.querySelector('.md-area textarea').dispatchEvent(keyboardDownEvent(13, true));
- expect(
- eventHub.$emit,
- ).toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalled();
});
it('triggers update with ctrl+enter', () => {
vm.$el.querySelector('.md-area textarea').dispatchEvent(keyboardDownEvent(13, false, true));
- expect(
- eventHub.$emit,
- ).toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/issue_show/components/fields/description_template_spec.js b/spec/javascripts/issue_show/components/fields/description_template_spec.js
index 30441faf844..8d77a620d76 100644
--- a/spec/javascripts/issue_show/components/fields/description_template_spec.js
+++ b/spec/javascripts/issue_show/components/fields/description_template_spec.js
@@ -5,7 +5,7 @@ describe('Issue description template component', () => {
let vm;
let formState;
- beforeEach((done) => {
+ beforeEach(done => {
const Component = Vue.extend(descriptionTemplate);
formState = {
description: 'test',
@@ -24,24 +24,20 @@ describe('Issue description template component', () => {
});
it('renders templates as JSON array in data attribute', () => {
- expect(
- vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data'),
- ).toBe('[{"name":"test"}]');
+ expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
+ '[{"name":"test"}]',
+ );
});
it('updates formState when changing template', () => {
vm.issuableTemplate.editor.setValue('test new template');
- expect(
- formState.description,
- ).toBe('test new template');
+ expect(formState.description).toBe('test new template');
});
it('returns formState description with editor getValue', () => {
formState.description = 'testing new template';
- expect(
- vm.issuableTemplate.editor.getValue(),
- ).toBe('testing new template');
+ expect(vm.issuableTemplate.editor.getValue()).toBe('testing new template');
});
});
diff --git a/spec/javascripts/issue_show/components/fields/title_spec.js b/spec/javascripts/issue_show/components/fields/title_spec.js
index a03b462689f..4b96a1feb29 100644
--- a/spec/javascripts/issue_show/components/fields/title_spec.js
+++ b/spec/javascripts/issue_show/components/fields/title_spec.js
@@ -27,24 +27,18 @@ describe('Title field component', () => {
});
it('renders form control with formState title', () => {
- expect(
- vm.$el.querySelector('.form-control').value,
- ).toBe('test');
+ expect(vm.$el.querySelector('.form-control').value).toBe('test');
});
it('triggers update with meta+enter', () => {
vm.$el.querySelector('.form-control').dispatchEvent(keyboardDownEvent(13, true));
- expect(
- eventHub.$emit,
- ).toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalled();
});
it('triggers update with ctrl+enter', () => {
vm.$el.querySelector('.form-control').dispatchEvent(keyboardDownEvent(13, false, true));
- expect(
- eventHub.$emit,
- ).toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/issue_show/components/form_spec.js b/spec/javascripts/issue_show/components/form_spec.js
index 50ce019c32a..523954013cf 100644
--- a/spec/javascripts/issue_show/components/form_spec.js
+++ b/spec/javascripts/issue_show/components/form_spec.js
@@ -4,7 +4,7 @@ import formComponent from '~/issue_show/components/form.vue';
describe('Inline edit form component', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
const Component = Vue.extend(formComponent);
vm = new Component({
@@ -15,6 +15,7 @@ describe('Inline edit form component', () => {
description: 'a',
lockedWarningVisible: false,
},
+ issuableType: 'issue',
markdownPreviewPath: '/',
markdownDocsPath: '/',
projectPath: '/',
@@ -26,36 +27,28 @@ describe('Inline edit form component', () => {
});
it('does not render template selector if no templates exist', () => {
- expect(
- vm.$el.querySelector('.js-issuable-selector-wrap'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.js-issuable-selector-wrap')).toBeNull();
});
- it('renders template selector when templates exists', (done) => {
+ it('renders template selector when templates exists', done => {
vm.issuableTemplates = ['test'];
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.js-issuable-selector-wrap'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
done();
});
});
it('hides locked warning by default', () => {
- expect(
- vm.$el.querySelector('.alert'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.alert')).toBeNull();
});
- it('shows locked warning if formState is different', (done) => {
+ it('shows locked warning if formState is different', done => {
vm.formState.lockedWarningVisible = true;
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.alert'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.alert')).not.toBeNull();
done();
});
diff --git a/spec/javascripts/issue_show/components/title_spec.js b/spec/javascripts/issue_show/components/title_spec.js
index 5370f4e1fea..9754c8a6755 100644
--- a/spec/javascripts/issue_show/components/title_spec.js
+++ b/spec/javascripts/issue_show/components/title_spec.js
@@ -25,25 +25,21 @@ describe('Title component', () => {
});
it('renders title HTML', () => {
- expect(
- vm.$el.querySelector('.title').innerHTML.trim(),
- ).toBe('Testing <img>');
+ expect(vm.$el.querySelector('.title').innerHTML.trim()).toBe('Testing <img>');
});
- it('updates page title when changing titleHtml', (done) => {
+ it('updates page title when changing titleHtml', done => {
spyOn(vm, 'setPageTitle');
vm.titleHtml = 'test';
Vue.nextTick(() => {
- expect(
- vm.setPageTitle,
- ).toHaveBeenCalled();
+ expect(vm.setPageTitle).toHaveBeenCalled();
done();
});
});
- it('animates title changes', (done) => {
+ it('animates title changes', done => {
vm.titleHtml = 'test';
Vue.nextTick(() => {
@@ -61,14 +57,12 @@ describe('Title component', () => {
});
});
- it('updates page title after changing title', (done) => {
+ it('updates page title after changing title', done => {
vm.titleHtml = 'changed';
vm.titleText = 'changed';
Vue.nextTick(() => {
- expect(
- document.querySelector('title').textContent.trim(),
- ).toContain('changed');
+ expect(document.querySelector('title').textContent.trim()).toContain('changed');
done();
});
@@ -86,12 +80,14 @@ describe('Title component', () => {
it('should not show if canUpdate is false', () => {
vm.showInlineEditButton = true;
vm.canUpdate = false;
+
expect(vm.$el.querySelector('.btn-edit')).toBeNull();
});
it('should show if showInlineEditButton and canUpdate', () => {
vm.showInlineEditButton = true;
vm.canUpdate = true;
+
expect(vm.$el.querySelector('.btn-edit')).toBeDefined();
});
@@ -101,6 +97,7 @@ describe('Title component', () => {
Vue.nextTick(() => {
vm.$el.querySelector('.btn-edit').click();
+
expect(eventHub.$emit).toHaveBeenCalledWith('open.form');
});
});
diff --git a/spec/javascripts/issue_show/index_spec.js b/spec/javascripts/issue_show/index_spec.js
new file mode 100644
index 00000000000..fa0b426c06c
--- /dev/null
+++ b/spec/javascripts/issue_show/index_spec.js
@@ -0,0 +1,19 @@
+import initIssueableApp from '~/issue_show';
+
+describe('Issue show index', () => {
+ describe('initIssueableApp', () => {
+ it('should initialize app with no potential XSS attack', () => {
+ const d = document.createElement('div');
+ d.id = 'js-issuable-app-initial-data';
+ d.innerHTML = JSON.stringify({
+ initialDescriptionHtml: '&lt;img src=x onerror=alert(1)&gt;',
+ });
+ document.body.appendChild(d);
+
+ const alertSpy = spyOn(window, 'alert');
+ initIssueableApp();
+
+ expect(alertSpy).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/javascripts/issue_spec.js b/spec/javascripts/issue_spec.js
index e12419b835d..7be495d1d35 100644
--- a/spec/javascripts/issue_spec.js
+++ b/spec/javascripts/issue_spec.js
@@ -1,4 +1,4 @@
-/* eslint-disable one-var, one-var-declaration-per-line, no-use-before-define, comma-dangle */
+/* eslint-disable one-var, no-use-before-define */
import $ from 'jquery';
import MockAdapter from 'axios-mock-adapter';
@@ -15,6 +15,7 @@ describe('Issue', function() {
function expectErrorMessage() {
const $flashMessage = $('div.flash-alert');
+
expect($flashMessage).toExist();
expect($flashMessage).toBeVisible();
expect($flashMessage).toHaveText('Unable to update this issue at this time.');
@@ -23,6 +24,7 @@ describe('Issue', function() {
function expectIssueState(isIssueOpen) {
expectVisibility($boxClosed, !isIssueOpen);
expectVisibility($boxOpen, isIssueOpen);
+
expect($btn).toHaveText(isIssueOpen ? 'Close issue' : 'Reopen issue');
}
@@ -32,6 +34,7 @@ describe('Issue', function() {
}
const $available = Issue.$btnNewBranch.find('.available');
+
expect($available).toHaveText('New branch');
if (!isPending && canCreate) {
@@ -41,6 +44,7 @@ describe('Issue', function() {
}
const $unavailable = Issue.$btnNewBranch.find('.unavailable');
+
expect($unavailable).toHaveText('New branch unavailable');
if (!isPending && !canCreate) {
@@ -60,19 +64,22 @@ describe('Issue', function() {
function findElements(isIssueInitiallyOpen) {
$boxClosed = $('div.status-box-issue-closed');
+
expect($boxClosed).toExist();
expect($boxClosed).toHaveText('Closed');
$boxOpen = $('div.status-box-open');
+
expect($boxOpen).toExist();
expect($boxOpen).toHaveText('Open');
$btn = $('.js-issuable-close-button');
+
expect($btn).toExist();
expect($btn).toHaveText(isIssueInitiallyOpen ? 'Close issue' : 'Reopen issue');
}
- [true, false].forEach((isIssueInitiallyOpen) => {
+ [true, false].forEach(isIssueInitiallyOpen => {
describe(`with ${isIssueInitiallyOpen ? 'open' : 'closed'} issue`, function() {
const action = isIssueInitiallyOpen ? 'close' : 'reopen';
let mock;
@@ -127,7 +134,7 @@ describe('Issue', function() {
it(`${action}s the issue`, function(done) {
mockCloseButtonResponseSuccess(this.$triggeredButton.attr('href'), {
- id: 34
+ id: 34,
});
mockCanCreateBranch(!isIssueInitiallyOpen);
@@ -135,6 +142,7 @@ describe('Issue', function() {
setTimeout(() => {
expectIssueState(!isIssueInitiallyOpen);
+
expect(this.$triggeredButton.get(0).getAttribute('disabled')).toBeNull();
expect(this.$projectIssuesCounter.text()).toBe(isIssueInitiallyOpen ? '1,000' : '1,002');
expectNewBranchButtonState(false, !isIssueInitiallyOpen);
@@ -145,7 +153,7 @@ describe('Issue', function() {
it(`fails to ${action} the issue if saved:false`, function(done) {
mockCloseButtonResponseSuccess(this.$triggeredButton.attr('href'), {
- saved: false
+ saved: false,
});
mockCanCreateBranch(isIssueInitiallyOpen);
@@ -153,8 +161,10 @@ describe('Issue', function() {
setTimeout(() => {
expectIssueState(isIssueInitiallyOpen);
+
expect(this.$triggeredButton.get(0).getAttribute('disabled')).toBeNull();
expectErrorMessage();
+
expect(this.$projectIssuesCounter.text()).toBe('1,001');
expectNewBranchButtonState(false, isIssueInitiallyOpen);
@@ -170,8 +180,10 @@ describe('Issue', function() {
setTimeout(() => {
expectIssueState(isIssueInitiallyOpen);
+
expect(this.$triggeredButton.get(0).getAttribute('disabled')).toBeNull();
expectErrorMessage();
+
expect(this.$projectIssuesCounter.text()).toBe('1,001');
expectNewBranchButtonState(false, isIssueInitiallyOpen);
diff --git a/spec/javascripts/job_spec.js b/spec/javascripts/job_spec.js
deleted file mode 100644
index 2fcb5566ebc..00000000000
--- a/spec/javascripts/job_spec.js
+++ /dev/null
@@ -1,314 +0,0 @@
-import $ from 'jquery';
-import MockAdapter from 'axios-mock-adapter';
-import axios from '~/lib/utils/axios_utils';
-import { numberToHumanSize } from '~/lib/utils/number_utils';
-import '~/lib/utils/datetime_utility';
-import Job from '~/job';
-import '~/breakpoints';
-import waitForPromises from 'spec/helpers/wait_for_promises';
-
-describe('Job', () => {
- const JOB_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/-/jobs/1`;
- let mock;
- let response;
- let job;
-
- preloadFixtures('builds/build-with-artifacts.html.raw');
-
- beforeEach(() => {
- loadFixtures('builds/build-with-artifacts.html.raw');
-
- spyOnDependency(Job, 'visitUrl');
-
- response = {};
-
- mock = new MockAdapter(axios);
-
- mock.onGet(new RegExp(`${JOB_URL}/trace.json?(.*)`)).reply(() => [200, response]);
- });
-
- afterEach(() => {
- mock.restore();
-
- clearTimeout(job.timeout);
- });
-
- describe('class constructor', () => {
- beforeEach(() => {
- jasmine.clock().install();
- });
-
- afterEach(() => {
- jasmine.clock().uninstall();
- });
-
- describe('setup', () => {
- beforeEach(function (done) {
- job = new Job();
-
- waitForPromises()
- .then(done)
- .catch(done.fail);
- });
-
- it('copies build options', function () {
- expect(job.pagePath).toBe(JOB_URL);
- expect(job.buildStatus).toBe('success');
- expect(job.buildStage).toBe('test');
- expect(job.state).toBe('');
- });
-
- it('only shows the jobs matching the current stage', () => {
- expect($('.build-job[data-stage="build"]').is(':visible')).toBe(false);
- expect($('.build-job[data-stage="test"]').is(':visible')).toBe(true);
- expect($('.build-job[data-stage="deploy"]').is(':visible')).toBe(false);
- });
-
- it('selects the current stage in the build dropdown menu', () => {
- expect($('.stage-selection').text()).toBe('test');
- });
-
- it('updates the jobs when the build dropdown changes', () => {
- $('.stage-item:contains("build")').click();
-
- expect($('.stage-selection').text()).toBe('build');
- expect($('.build-job[data-stage="build"]').is(':visible')).toBe(true);
- expect($('.build-job[data-stage="test"]').is(':visible')).toBe(false);
- expect($('.build-job[data-stage="deploy"]').is(':visible')).toBe(false);
- });
- });
-
- describe('running build', () => {
- it('updates the build trace on an interval', function (done) {
- response = {
- html: '<span>Update<span>',
- status: 'running',
- state: 'newstate',
- append: true,
- complete: false,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect($('#build-trace .js-build-output').text()).toMatch(/Update/);
- expect(job.state).toBe('newstate');
-
- response = {
- html: '<span>More</span>',
- status: 'running',
- state: 'finalstate',
- append: true,
- complete: true,
- };
- })
- .then(() => jasmine.clock().tick(4001))
- .then(waitForPromises)
- .then(() => {
- expect($('#build-trace .js-build-output').text()).toMatch(/UpdateMore/);
- expect(job.state).toBe('finalstate');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('replaces the entire build trace', (done) => {
- response = {
- html: '<span>Update<span>',
- status: 'running',
- append: false,
- complete: false,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect($('#build-trace .js-build-output').text()).toMatch(/Update/);
-
- response = {
- html: '<span>Different</span>',
- status: 'running',
- append: false,
- };
- })
- .then(() => jasmine.clock().tick(4001))
- .then(waitForPromises)
- .then(() => {
- expect($('#build-trace .js-build-output').text()).not.toMatch(/Update/);
- expect($('#build-trace .js-build-output').text()).toMatch(/Different/);
- })
- .then(done)
- .catch(done.fail);
- });
- });
-
- describe('truncated information', () => {
- describe('when size is less than total', () => {
- it('shows information about truncated log', (done) => {
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size: 50,
- total: 100,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect(document.querySelector('.js-truncated-info').classList).not.toContain('hidden');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('shows the size in KiB', (done) => {
- const size = 50;
-
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size,
- total: 100,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect(
- document.querySelector('.js-truncated-info-size').textContent.trim(),
- ).toEqual(`${numberToHumanSize(size)}`);
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('shows incremented size', (done) => {
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size: 50,
- total: 100,
- complete: false,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect(
- document.querySelector('.js-truncated-info-size').textContent.trim(),
- ).toEqual(`${numberToHumanSize(50)}`);
-
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: true,
- size: 10,
- total: 100,
- complete: true,
- };
- })
- .then(() => jasmine.clock().tick(4001))
- .then(waitForPromises)
- .then(() => {
- expect(
- document.querySelector('.js-truncated-info-size').textContent.trim(),
- ).toEqual(`${numberToHumanSize(60)}`);
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('renders the raw link', () => {
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size: 50,
- total: 100,
- };
-
- job = new Job();
-
- expect(
- document.querySelector('.js-raw-link').textContent.trim(),
- ).toContain('Complete Raw');
- });
- });
-
- describe('when size is equal than total', () => {
- it('does not show the trunctated information', (done) => {
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size: 100,
- total: 100,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(() => {
- expect(document.querySelector('.js-truncated-info').classList).toContain('hidden');
- })
- .then(done)
- .catch(done.fail);
- });
- });
- });
-
- describe('output trace', () => {
- beforeEach((done) => {
- response = {
- html: '<span>Update</span>',
- status: 'success',
- append: false,
- size: 50,
- total: 100,
- };
-
- job = new Job();
-
- waitForPromises()
- .then(done)
- .catch(done.fail);
- });
-
- it('should render trace controls', () => {
- const controllers = document.querySelector('.controllers');
-
- expect(controllers.querySelector('.js-raw-link-controller')).not.toBeNull();
- expect(controllers.querySelector('.js-scroll-up')).not.toBeNull();
- expect(controllers.querySelector('.js-scroll-down')).not.toBeNull();
- });
-
- it('should render received output', () => {
- expect(
- document.querySelector('.js-build-output').innerHTML,
- ).toEqual('<span>Update</span>');
- });
- });
- });
-
- describe('getBuildTrace', () => {
- it('should request build trace with state parameter', (done) => {
- spyOn(axios, 'get').and.callThrough();
- job = new Job();
-
- setTimeout(() => {
- expect(axios.get).toHaveBeenCalledWith(
- `${JOB_URL}/trace.json`, { params: { state: '' } },
- );
- done();
- }, 0);
- });
- });
-});
diff --git a/spec/javascripts/jobs/components/artifacts_block_spec.js b/spec/javascripts/jobs/components/artifacts_block_spec.js
new file mode 100644
index 00000000000..2fa7ff653fe
--- /dev/null
+++ b/spec/javascripts/jobs/components/artifacts_block_spec.js
@@ -0,0 +1,120 @@
+import Vue from 'vue';
+import { getTimeago } from '~/lib/utils/datetime_utility';
+import component from '~/jobs/components/artifacts_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Artifacts block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const expireAt = '2018-08-14T09:38:49.157Z';
+ const timeago = getTimeago();
+ const formatedDate = timeago.format(expireAt);
+
+ const expiredArtifact = {
+ expire_at: expireAt,
+ expired: true,
+ };
+
+ const nonExpiredArtifact = {
+ download_path: '/gitlab-org/gitlab-ce/-/jobs/98314558/artifacts/download',
+ browse_path: '/gitlab-org/gitlab-ce/-/jobs/98314558/artifacts/browse',
+ keep_path: '/gitlab-org/gitlab-ce/-/jobs/98314558/artifacts/keep',
+ expire_at: expireAt,
+ expired: false,
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with expired artifacts', () => {
+ it('renders expired artifact date and info', () => {
+ vm = mountComponent(Component, {
+ artifact: expiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-artifacts-removed')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-artifacts-will-be-removed')).toBeNull();
+ expect(vm.$el.textContent).toContain(formatedDate);
+ expect(vm.$el.querySelector('.js-artifacts-removed').textContent.trim()).toEqual(
+ 'The artifacts were removed',
+ );
+ });
+ });
+
+ describe('with artifacts that will expire', () => {
+ it('renders will expire artifact date and info', () => {
+ vm = mountComponent(Component, {
+ artifact: nonExpiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-artifacts-removed')).toBeNull();
+ expect(vm.$el.querySelector('.js-artifacts-will-be-removed')).not.toBeNull();
+ expect(vm.$el.textContent).toContain(formatedDate);
+ expect(vm.$el.querySelector('.js-artifacts-will-be-removed').textContent.trim()).toEqual(
+ 'The artifacts will be removed in',
+ );
+ });
+ });
+
+ describe('with keep path', () => {
+ it('renders the keep button', () => {
+ vm = mountComponent(Component, {
+ artifact: nonExpiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-keep-artifacts')).not.toBeNull();
+ });
+ });
+
+ describe('without keep path', () => {
+ it('does not render the keep button', () => {
+ vm = mountComponent(Component, {
+ artifact: expiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-keep-artifacts')).toBeNull();
+ });
+ });
+
+ describe('with download path', () => {
+ it('renders the download button', () => {
+ vm = mountComponent(Component, {
+ artifact: nonExpiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-download-artifacts')).not.toBeNull();
+ });
+ });
+
+ describe('without download path', () => {
+ it('does not render the keep button', () => {
+ vm = mountComponent(Component, {
+ artifact: expiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-download-artifacts')).toBeNull();
+ });
+ });
+
+ describe('with browse path', () => {
+ it('does not render the browse button', () => {
+ vm = mountComponent(Component, {
+ artifact: nonExpiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-browse-artifacts')).not.toBeNull();
+ });
+ });
+
+ describe('without browse path', () => {
+ it('does not render the browse button', () => {
+ vm = mountComponent(Component, {
+ artifact: expiredArtifact,
+ });
+
+ expect(vm.$el.querySelector('.js-browse-artifacts')).toBeNull();
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/commit_block_spec.js b/spec/javascripts/jobs/components/commit_block_spec.js
new file mode 100644
index 00000000000..98eba3ac976
--- /dev/null
+++ b/spec/javascripts/jobs/components/commit_block_spec.js
@@ -0,0 +1,88 @@
+import Vue from 'vue';
+import component from '~/jobs/components/commit_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Commit block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const props = {
+ commit: {
+ short_id: '1f0fb84f',
+ commit_path: 'commit/1f0fb84fb6770d74d97eee58118fd3909cd4f48c',
+ title: 'Update README.md',
+ },
+ mergeRequest: {
+ iid: '!21244',
+ path: 'merge_requests/21244',
+ },
+ isLastBlock: true,
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('pipeline short sha', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ ...props,
+ });
+ });
+
+ it('renders pipeline short sha link', () => {
+ expect(vm.$el.querySelector('.js-commit-sha').getAttribute('href')).toEqual(
+ props.commit.commit_path,
+ );
+
+ expect(vm.$el.querySelector('.js-commit-sha').textContent.trim()).toEqual(
+ props.commit.short_id,
+ );
+ });
+
+ it('renders clipboard button', () => {
+ expect(vm.$el.querySelector('button').getAttribute('data-clipboard-text')).toEqual(
+ props.commit.short_id,
+ );
+ });
+ });
+
+ describe('with merge request', () => {
+ it('renders merge request link and reference', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ });
+
+ expect(vm.$el.querySelector('.js-link-commit').getAttribute('href')).toEqual(
+ props.mergeRequest.path,
+ );
+
+ expect(vm.$el.querySelector('.js-link-commit').textContent.trim()).toEqual(
+ `!${props.mergeRequest.iid}`,
+ );
+ });
+ });
+
+ describe('without merge request', () => {
+ it('does not render merge request', () => {
+ const copyProps = Object.assign({}, props);
+ delete copyProps.mergeRequest;
+
+ vm = mountComponent(Component, {
+ ...copyProps,
+ });
+
+ expect(vm.$el.querySelector('.js-link-commit')).toBeNull();
+ });
+ });
+
+ describe('git commit title', () => {
+ it('renders git commit title', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ });
+
+ expect(vm.$el.textContent).toContain(props.commit.title);
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/empty_state_spec.js b/spec/javascripts/jobs/components/empty_state_spec.js
new file mode 100644
index 00000000000..a2df79bdda0
--- /dev/null
+++ b/spec/javascripts/jobs/components/empty_state_spec.js
@@ -0,0 +1,93 @@
+import Vue from 'vue';
+import component from '~/jobs/components/empty_state.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Empty State', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const props = {
+ illustrationPath: 'illustrations/pending_job_empty.svg',
+ illustrationSizeClass: 'svg-430',
+ title: 'This job has not started yet',
+ };
+
+ const content = 'This job is in pending state and is waiting to be picked by a runner';
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('renders image and title', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ ...props,
+ content,
+ });
+ });
+
+ it('renders img with provided path and size', () => {
+ expect(vm.$el.querySelector('img').getAttribute('src')).toEqual(props.illustrationPath);
+ expect(vm.$el.querySelector('.svg-content').classList).toContain(props.illustrationSizeClass);
+ });
+
+ it('renders provided title', () => {
+ expect(vm.$el.querySelector('.js-job-empty-state-title').textContent.trim()).toEqual(
+ props.title,
+ );
+ });
+ });
+
+ describe('with content', () => {
+ it('renders content', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ content,
+ });
+
+ expect(vm.$el.querySelector('.js-job-empty-state-content').textContent.trim()).toEqual(
+ content,
+ );
+ });
+ });
+
+ describe('without content', () => {
+ it('does not render content', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ });
+
+ expect(vm.$el.querySelector('.js-job-empty-state-content')).toBeNull();
+ });
+ });
+
+ describe('with action', () => {
+ it('renders action', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ content,
+ action: {
+ path: 'runner',
+ button_title: 'Check runner',
+ method: 'post',
+ },
+ });
+
+ expect(vm.$el.querySelector('.js-job-empty-state-action').getAttribute('href')).toEqual(
+ 'runner',
+ );
+ });
+ });
+
+ describe('without action', () => {
+ it('does not render action', () => {
+ vm = mountComponent(Component, {
+ ...props,
+ content,
+ action: null,
+ });
+
+ expect(vm.$el.querySelector('.js-job-empty-state-action')).toBeNull();
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/environments_block_spec.js b/spec/javascripts/jobs/components/environments_block_spec.js
new file mode 100644
index 00000000000..0866ddd21d8
--- /dev/null
+++ b/spec/javascripts/jobs/components/environments_block_spec.js
@@ -0,0 +1,149 @@
+import Vue from 'vue';
+import component from '~/jobs/components/environments_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Environments block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+ const status = {
+ group: 'success',
+ icon: 'status_success',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ };
+
+ const environment = {
+ environment_path: '/environment',
+ name: 'environment',
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with last deployment', () => {
+ it('renders info for most recent deployment', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'last',
+ environment,
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'This job is the most recent deployment to environment.',
+ );
+ });
+ });
+
+ describe('with out of date deployment', () => {
+ describe('with last deployment', () => {
+ it('renders info for out date and most recent', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'out_of_date',
+ environment: Object.assign({}, environment, {
+ last_deployment: { iid: 'deployment', deployable: { build_path: 'bar' } },
+ }),
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'This job is an out-of-date deployment to environment. View the most recent deployment #deployment.',
+ );
+
+ expect(vm.$el.querySelector('.js-job-deployment-link').getAttribute('href')).toEqual('bar');
+ });
+ });
+
+ describe('without last deployment', () => {
+ it('renders info about out of date deployment', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'out_of_date',
+ environment,
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'This job is an out-of-date deployment to environment.',
+ );
+ });
+ });
+ });
+
+ describe('with failed deployment', () => {
+ it('renders info about failed deployment', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'failed',
+ environment,
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'The deployment of this job to environment did not succeed.',
+ );
+ });
+ });
+
+ describe('creating deployment', () => {
+ describe('with last deployment', () => {
+ it('renders info about creating deployment and overriding latest deployment', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'creating',
+ environment: Object.assign({}, environment, {
+ last_deployment: {
+ iid: 'deployment',
+ deployable: { build_path: 'foo' },
+ },
+ }),
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'This job is creating a deployment to environment and will overwrite the latest deployment.',
+ );
+
+ expect(vm.$el.querySelector('.js-job-deployment-link').getAttribute('href')).toEqual('foo');
+ });
+ });
+
+ describe('without last deployment', () => {
+ it('renders info about failed deployment', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'creating',
+ environment,
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.textContent.trim()).toEqual(
+ 'This job is creating a deployment to environment.',
+ );
+ });
+ });
+
+ describe('without environment', () => {
+ it('does not render environment link', () => {
+ vm = mountComponent(Component, {
+ deploymentStatus: {
+ status: 'creating',
+ environment: null,
+ },
+ iconStatus: status,
+ });
+
+ expect(vm.$el.querySelector('.js-environment-link')).toBeNull();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/erased_block_spec.js b/spec/javascripts/jobs/components/erased_block_spec.js
new file mode 100644
index 00000000000..8e0433d3fb7
--- /dev/null
+++ b/spec/javascripts/jobs/components/erased_block_spec.js
@@ -0,0 +1,56 @@
+import Vue from 'vue';
+import { getTimeago } from '~/lib/utils/datetime_utility';
+import component from '~/jobs/components/erased_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Erased block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const erasedAt = '2016-11-07T11:11:16.525Z';
+ const timeago = getTimeago();
+ const formatedDate = timeago.format(erasedAt);
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with job erased by user', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ user: {
+ username: 'root',
+ web_url: 'gitlab.com/root',
+ },
+ erasedAt,
+ });
+ });
+
+ it('renders username and link', () => {
+ expect(vm.$el.querySelector('a').getAttribute('href')).toEqual('gitlab.com/root');
+
+ expect(vm.$el.textContent).toContain('Job has been erased by');
+ expect(vm.$el.textContent).toContain('root');
+ });
+
+ it('renders erasedAt', () => {
+ expect(vm.$el.textContent).toContain(formatedDate);
+ });
+ });
+
+ describe('with erased job', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ erasedAt,
+ });
+ });
+
+ it('renders username and link', () => {
+ expect(vm.$el.textContent).toContain('Job has been erased');
+ });
+
+ it('renders erasedAt', () => {
+ expect(vm.$el.textContent).toContain(formatedDate);
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/job_app_spec.js b/spec/javascripts/jobs/components/job_app_spec.js
new file mode 100644
index 00000000000..fcf3780f0ea
--- /dev/null
+++ b/spec/javascripts/jobs/components/job_app_spec.js
@@ -0,0 +1,639 @@
+import Vue from 'vue';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import jobApp from '~/jobs/components/job_app.vue';
+import createStore from '~/jobs/store';
+import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { resetStore } from '../store/helpers';
+import job from '../mock_data';
+
+describe('Job App ', () => {
+ const delayedJobFixture = getJSONFixture('jobs/delayed.json');
+ const Component = Vue.extend(jobApp);
+ let store;
+ let vm;
+ let mock;
+
+ const props = {
+ endpoint: `${gl.TEST_HOST}jobs/123.json`,
+ runnerHelpUrl: 'help/runner',
+ runnerSettingsUrl: 'settings/ci-cd/runners',
+ terminalPath: 'jobs/123/terminal',
+ pagePath: `${gl.TEST_HOST}jobs/123`,
+ logState:
+ 'eyJvZmZzZXQiOjE3NDUxLCJuX29wZW5fdGFncyI6MCwiZmdfY29sb3IiOm51bGwsImJnX2NvbG9yIjpudWxsLCJzdHlsZV9tYXNrIjowfQ%3D%3D',
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ store = createStore();
+ });
+
+ afterEach(() => {
+ resetStore(store);
+ vm.$destroy();
+ mock.restore();
+ });
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ mock.onGet(props.endpoint).reply(200, job, {});
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {});
+ vm = mountComponentWithStore(Component, { props, store });
+ });
+
+ it('renders loading icon', done => {
+ expect(vm.$el.querySelector('.js-job-loading')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-job-sidebar')).toBeNull();
+ expect(vm.$el.querySelector('.js-job-content')).toBeNull();
+
+ setTimeout(() => {
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with successful request', () => {
+ beforeEach(() => {
+ mock.onGet(`${props.pagePath}/trace.json`).replyOnce(200, {});
+ });
+
+ describe('Header section', () => {
+ describe('job callout message', () => {
+ it('should not render the reason when reason is absent', done => {
+ mock.onGet(props.endpoint).replyOnce(200, job);
+ vm = mountComponentWithStore(Component, { props, store });
+
+ setTimeout(() => {
+ expect(vm.shouldRenderCalloutMessage).toBe(false);
+
+ done();
+ }, 0);
+ });
+
+ it('should render the reason when reason is present', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ callout_message: 'There is an unknown failure, please try again',
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, { props, store });
+ setTimeout(() => {
+ expect(vm.shouldRenderCalloutMessage).toBe(true);
+ done();
+ }, 0);
+ });
+ });
+
+ describe('triggered job', () => {
+ beforeEach(() => {
+ mock
+ .onGet(props.endpoint)
+ .replyOnce(200, Object.assign({}, job, { started: '2017-05-24T10:59:52.000+01:00' }));
+ vm = mountComponentWithStore(Component, { props, store });
+ });
+
+ it('should render provided job information', done => {
+ setTimeout(() => {
+ expect(
+ vm.$el
+ .querySelector('.header-main-content')
+ .textContent.replace(/\s+/g, ' ')
+ .trim(),
+ ).toContain('passed Job #4757 triggered 1 year ago by Root');
+ done();
+ }, 0);
+ });
+
+ it('should render new issue link', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual(
+ job.new_issue_path,
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('created job', () => {
+ it('should render created key', done => {
+ mock.onGet(props.endpoint).replyOnce(200, job);
+ vm = mountComponentWithStore(Component, { props, store });
+
+ setTimeout(() => {
+ expect(
+ vm.$el
+ .querySelector('.header-main-content')
+ .textContent.replace(/\s+/g, ' ')
+ .trim(),
+ ).toContain('passed Job #4757 created 3 weeks ago by Root');
+ done();
+ }, 0);
+ });
+ });
+ });
+
+ describe('stuck block', () => {
+ describe('without active runners availabl', () => {
+ it('renders stuck block when there are no runners', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ status: {
+ group: 'pending',
+ icon: 'status_pending',
+ label: 'pending',
+ text: 'pending',
+ details_path: 'path',
+ },
+ stuck: true,
+ runners: {
+ available: false,
+ online: false,
+ },
+ tags: [],
+ }),
+ );
+ vm = mountComponentWithStore(Component, { props, store });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-stuck')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(
+ "This job is stuck, because you don't have any active runners that can run this job.",
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('when available runners can not run specified tag', () => {
+ it('renders tags in stuck block when there are no runners', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ status: {
+ group: 'pending',
+ icon: 'status_pending',
+ label: 'pending',
+ text: 'pending',
+ details_path: 'path',
+ },
+ stuck: true,
+ runners: {
+ available: false,
+ online: false,
+ },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]);
+ expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(
+ "This job is stuck, because you don't have any active runners online with any of these tags assigned to them:",
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('when runners are offline and build has tags', () => {
+ it('renders message about job being stuck because of no runners with the specified tags', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ status: {
+ group: 'pending',
+ icon: 'status_pending',
+ label: 'pending',
+ text: 'pending',
+ details_path: 'path',
+ },
+ stuck: true,
+ runners: {
+ available: true,
+ online: true,
+ },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]);
+ expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(
+ "This job is stuck, because you don't have any active runners online with any of these tags assigned to them:",
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ it('does not renders stuck block when there are no runners', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ runners: { available: true },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-stuck')).toBeNull();
+
+ done();
+ }, 0);
+ });
+ });
+
+ describe('environments block', () => {
+ it('renders environment block when job has environment', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ deployment_status: {
+ environment: {
+ environment_path: '/path',
+ name: 'foo',
+ },
+ },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-environment')).not.toBeNull();
+
+ done();
+ }, 0);
+ });
+
+ it('does not render environment block when job has environment', done => {
+ mock.onGet(props.endpoint).replyOnce(200, job);
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-environment')).toBeNull();
+ done();
+ }, 0);
+ });
+ });
+
+ describe('erased block', () => {
+ it('renders erased block when `erased` is true', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ erased_by: {
+ username: 'root',
+ web_url: 'gitlab.com/root',
+ },
+ erased_at: '2016-11-07T11:11:16.525Z',
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-erased-block')).not.toBeNull();
+
+ done();
+ }, 0);
+ });
+
+ it('does not render erased block when `erased` is false', done => {
+ mock.onGet(props.endpoint).replyOnce(200, Object.assign({}, job, { erased_at: null }));
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-erased-block')).toBeNull();
+
+ done();
+ }, 0);
+ });
+ });
+
+ describe('empty states block', () => {
+ it('renders empty state when job does not have trace and is not running', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ has_trace: false,
+ status: {
+ group: 'pending',
+ icon: 'status_pending',
+ label: 'pending',
+ text: 'pending',
+ details_path: 'path',
+ illustration: {
+ image: 'path',
+ size: '340',
+ title: 'Empty State',
+ content: 'This is an empty state',
+ },
+ action: {
+ button_title: 'Retry job',
+ method: 'post',
+ path: '/path',
+ },
+ },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull();
+
+ done();
+ }, 0);
+ });
+
+ it('does not render empty state when job does not have trace but it is running', done => {
+ mock.onGet(props.endpoint).replyOnce(
+ 200,
+ Object.assign({}, job, {
+ has_trace: false,
+ status: {
+ group: 'running',
+ icon: 'status_running',
+ label: 'running',
+ text: 'running',
+ details_path: 'path',
+ },
+ }),
+ );
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull();
+
+ done();
+ }, 0);
+ });
+
+ it('does not render empty state when job has trace but it is not running', done => {
+ mock.onGet(props.endpoint).replyOnce(200, Object.assign({}, job, { has_trace: true }));
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull();
+
+ done();
+ }, 0);
+ });
+
+ it('displays remaining time for a delayed job', done => {
+ const oneHourInMilliseconds = 3600000;
+ spyOn(Date, 'now').and.callFake(
+ () => new Date(delayedJobFixture.scheduled_at).getTime() - oneHourInMilliseconds,
+ );
+ mock.onGet(props.endpoint).replyOnce(200, { ...delayedJobFixture });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ store.subscribeAction(action => {
+ if (action.type !== 'receiveJobSuccess') {
+ return;
+ }
+
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull();
+
+ const title = vm.$el.querySelector('.js-job-empty-state-title');
+
+ expect(title).toContainText('01:00:00');
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+ });
+ });
+
+ describe('archived job', () => {
+ beforeEach(() => {
+ mock.onGet(props.endpoint).reply(200, Object.assign({}, job, { archived: true }), {});
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+ });
+
+ it('renders warning about job being archived', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-archived-job ')).not.toBeNull();
+ done();
+ }, 0);
+ });
+ });
+
+ describe('non-archived job', () => {
+ beforeEach(() => {
+ mock.onGet(props.endpoint).reply(200, job, {});
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+ });
+
+ it('does not warning about job being archived', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-archived-job ')).toBeNull();
+ done();
+ }, 0);
+ });
+ });
+
+ describe('trace output', () => {
+ beforeEach(() => {
+ mock.onGet(props.endpoint).reply(200, job, {});
+ });
+
+ describe('with append flag', () => {
+ it('appends the log content to the existing one', done => {
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {
+ html: '<span>More<span>',
+ status: 'running',
+ state: 'newstate',
+ append: true,
+ complete: true,
+ });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ vm.$store.state.trace = 'Update';
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain('Update');
+
+ done();
+ }, 0);
+ });
+ });
+
+ describe('without append flag', () => {
+ it('replaces the trace', done => {
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {
+ html: '<span>Different<span>',
+ status: 'running',
+ append: false,
+ complete: true,
+ });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+ vm.$store.state.trace = 'Update';
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).not.toContain(
+ 'Update',
+ );
+
+ expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain('Different');
+ done();
+ }, 0);
+ });
+ });
+
+ describe('truncated information', () => {
+ describe('when size is less than total', () => {
+ it('shows information about truncated log', done => {
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {
+ html: '<span>Update</span>',
+ status: 'success',
+ append: false,
+ size: 50,
+ total: 100,
+ complete: true,
+ });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).toContain(
+ '50 bytes',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('when size is equal than total', () => {
+ it('does not show the truncated information', done => {
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {
+ html: '<span>Update</span>',
+ status: 'success',
+ append: false,
+ size: 100,
+ total: 100,
+ complete: true,
+ });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).not.toContain(
+ '50 bytes',
+ );
+ done();
+ }, 0);
+ });
+ });
+ });
+
+ describe('trace controls', () => {
+ beforeEach(() => {
+ mock.onGet(`${props.pagePath}/trace.json`).reply(200, {
+ html: '<span>Update</span>',
+ status: 'success',
+ append: false,
+ size: 50,
+ total: 100,
+ complete: true,
+ });
+
+ vm = mountComponentWithStore(Component, {
+ props,
+ store,
+ });
+ });
+
+ it('should render scroll buttons', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-scroll-top')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-scroll-bottom')).not.toBeNull();
+ done();
+ }, 0);
+ });
+
+ it('should render link to raw ouput', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-raw-link-controller')).not.toBeNull();
+ done();
+ }, 0);
+ });
+
+ it('should render link to erase job', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-erase-link')).not.toBeNull();
+ done();
+ }, 0);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/job_container_item_spec.js b/spec/javascripts/jobs/components/job_container_item_spec.js
new file mode 100644
index 00000000000..2d108f1ad7f
--- /dev/null
+++ b/spec/javascripts/jobs/components/job_container_item_spec.js
@@ -0,0 +1,99 @@
+import Vue from 'vue';
+import JobContainerItem from '~/jobs/components/job_container_item.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import job from '../mock_data';
+
+describe('JobContainerItem', () => {
+ const delayedJobFixture = getJSONFixture('jobs/delayed.json');
+ const Component = Vue.extend(JobContainerItem);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ const sharedTests = () => {
+ it('displays a status icon', () => {
+ expect(vm.$el).toHaveSpriteIcon(job.status.icon);
+ });
+
+ it('displays the job name', () => {
+ expect(vm.$el).toContainText(job.name);
+ });
+
+ it('displays a link to the job', () => {
+ const link = vm.$el.querySelector('.js-job-link');
+
+ expect(link.href).toBe(job.status.details_path);
+ });
+ };
+
+ describe('when a job is not active and not retied', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ job,
+ isActive: false,
+ });
+ });
+
+ sharedTests();
+ });
+
+ describe('when a job is active', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ job,
+ isActive: true,
+ });
+ });
+
+ sharedTests();
+
+ it('displays an arrow', () => {
+ expect(vm.$el).toHaveSpriteIcon('arrow-right');
+ });
+ });
+
+ describe('when a job is retried', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ job: {
+ ...job,
+ retried: true,
+ },
+ isActive: false,
+ });
+ });
+
+ sharedTests();
+
+ it('displays an icon', () => {
+ expect(vm.$el).toHaveSpriteIcon('retry');
+ });
+ });
+
+ describe('for delayed job', () => {
+ beforeEach(() => {
+ const remainingMilliseconds = 1337000;
+ spyOn(Date, 'now').and.callFake(
+ () => new Date(delayedJobFixture.scheduled_at).getTime() - remainingMilliseconds,
+ );
+ });
+
+ it('displays remaining time in tooltip', done => {
+ vm = mountComponent(Component, {
+ job: delayedJobFixture,
+ isActive: false,
+ });
+
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.js-job-link').getAttribute('data-original-title')).toEqual(
+ 'delayed job - delayed manual action (00:22:17)',
+ );
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/job_log_controllers_spec.js b/spec/javascripts/jobs/components/job_log_controllers_spec.js
new file mode 100644
index 00000000000..d527c6708fc
--- /dev/null
+++ b/spec/javascripts/jobs/components/job_log_controllers_spec.js
@@ -0,0 +1,208 @@
+import Vue from 'vue';
+import component from '~/jobs/components/job_log_controllers.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Job log controllers', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ const props = {
+ rawPath: '/raw',
+ erasePath: '/erase',
+ size: 511952,
+ isScrollTopDisabled: false,
+ isScrollBottomDisabled: false,
+ isScrollingDown: true,
+ isTraceSizeVisible: true,
+ };
+
+ describe('Truncate information', () => {
+ describe('with isTraceSizeVisible', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, props);
+ });
+
+ it('renders size information', () => {
+ expect(vm.$el.querySelector('.js-truncated-info').textContent).toContain('499.95 KiB');
+ });
+
+ it('renders link to raw trace', () => {
+ expect(vm.$el.querySelector('.js-raw-link').getAttribute('href')).toEqual('/raw');
+ });
+ });
+ });
+
+ describe('links section', () => {
+ describe('with raw trace path', () => {
+ it('renders raw trace link', () => {
+ vm = mountComponent(Component, props);
+
+ expect(vm.$el.querySelector('.js-raw-link-controller').getAttribute('href')).toEqual(
+ '/raw',
+ );
+ });
+ });
+
+ describe('without raw trace path', () => {
+ it('does not render raw trace link', () => {
+ vm = mountComponent(Component, {
+ erasePath: '/erase',
+ size: 511952,
+ isScrollTopDisabled: true,
+ isScrollBottomDisabled: true,
+ isScrollingDown: false,
+ isTraceSizeVisible: true,
+ });
+
+ expect(vm.$el.querySelector('.js-raw-link-controller')).toBeNull();
+ });
+ });
+
+ describe('when is erasable', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, props);
+ });
+
+ it('renders erase job link', () => {
+ expect(vm.$el.querySelector('.js-erase-link')).not.toBeNull();
+ });
+ });
+
+ describe('when it is not erasable', () => {
+ it('does not render erase button', () => {
+ vm = mountComponent(Component, {
+ rawPath: '/raw',
+ size: 511952,
+ isScrollTopDisabled: true,
+ isScrollBottomDisabled: true,
+ isScrollingDown: false,
+ isTraceSizeVisible: true,
+ });
+
+ expect(vm.$el.querySelector('.js-erase-link')).toBeNull();
+ });
+ });
+ });
+
+ describe('scroll buttons', () => {
+ describe('scroll top button', () => {
+ describe('when user can scroll top', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, props);
+ });
+
+ it('renders enabled scroll top button', () => {
+ expect(vm.$el.querySelector('.js-scroll-top').getAttribute('disabled')).toBeNull();
+ });
+
+ it('emits scrollJobLogTop event on click', () => {
+ spyOn(vm, '$emit');
+ vm.$el.querySelector('.js-scroll-top').click();
+
+ expect(vm.$emit).toHaveBeenCalledWith('scrollJobLogTop');
+ });
+ });
+
+ describe('when user can not scroll top', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ rawPath: '/raw',
+ erasePath: '/erase',
+ size: 511952,
+ isScrollTopDisabled: true,
+ isScrollBottomDisabled: false,
+ isScrollingDown: false,
+ isTraceSizeVisible: true,
+ });
+ });
+
+ it('renders disabled scroll top button', () => {
+ expect(vm.$el.querySelector('.js-scroll-top').getAttribute('disabled')).toEqual(
+ 'disabled',
+ );
+ });
+
+ it('does not emit scrollJobLogTop event on click', () => {
+ spyOn(vm, '$emit');
+ vm.$el.querySelector('.js-scroll-top').click();
+
+ expect(vm.$emit).not.toHaveBeenCalledWith('scrollJobLogTop');
+ });
+ });
+ });
+
+ describe('scroll bottom button', () => {
+ describe('when user can scroll bottom', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, props);
+ });
+
+ it('renders enabled scroll bottom button', () => {
+ expect(vm.$el.querySelector('.js-scroll-bottom').getAttribute('disabled')).toBeNull();
+ });
+
+ it('emits scrollJobLogBottom event on click', () => {
+ spyOn(vm, '$emit');
+ vm.$el.querySelector('.js-scroll-bottom').click();
+
+ expect(vm.$emit).toHaveBeenCalledWith('scrollJobLogBottom');
+ });
+ });
+
+ describe('when user can not scroll bottom', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ rawPath: '/raw',
+ erasePath: '/erase',
+ size: 511952,
+ isScrollTopDisabled: false,
+ isScrollBottomDisabled: true,
+ isScrollingDown: false,
+ isTraceSizeVisible: true,
+ });
+ });
+
+ it('renders disabled scroll bottom button', () => {
+ expect(vm.$el.querySelector('.js-scroll-bottom').getAttribute('disabled')).toEqual(
+ 'disabled',
+ );
+ });
+
+ it('does not emit scrollJobLogBottom event on click', () => {
+ spyOn(vm, '$emit');
+ vm.$el.querySelector('.js-scroll-bottom').click();
+
+ expect(vm.$emit).not.toHaveBeenCalledWith('scrollJobLogBottom');
+ });
+ });
+
+ describe('while isScrollingDown is true', () => {
+ it('renders animate class for the scroll down button', () => {
+ vm = mountComponent(Component, props);
+
+ expect(vm.$el.querySelector('.js-scroll-bottom').className).toContain('animate');
+ });
+ });
+
+ describe('while isScrollingDown is false', () => {
+ it('does not render animate class for the scroll down button', () => {
+ vm = mountComponent(Component, {
+ rawPath: '/raw',
+ erasePath: '/erase',
+ size: 511952,
+ isScrollTopDisabled: true,
+ isScrollBottomDisabled: false,
+ isScrollingDown: false,
+ isTraceSizeVisible: true,
+ });
+
+ expect(vm.$el.querySelector('.js-scroll-bottom').className).not.toContain('animate');
+ });
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/job_log_spec.js b/spec/javascripts/jobs/components/job_log_spec.js
new file mode 100644
index 00000000000..dc0f77ceb80
--- /dev/null
+++ b/spec/javascripts/jobs/components/job_log_spec.js
@@ -0,0 +1,65 @@
+import Vue from 'vue';
+import component from '~/jobs/components/job_log.vue';
+import createStore from '~/jobs/store';
+import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
+import { resetStore } from '../store/helpers';
+
+describe('Job Log', () => {
+ const Component = Vue.extend(component);
+ let store;
+ let vm;
+
+ const trace =
+ 'Running with gitlab-runner 11.1.0 (081978aa)<br> on docker-auto-scale-com d5ae8d25<br>Using Docker executor with image dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.4-golang-1.9-git-2.18-chrome-67.0-node-8.x-yarn-1.2-postgresql-9.6-graphicsmagick-1.3.29 ...<br>';
+
+ beforeEach(() => {
+ store = createStore();
+ });
+
+ afterEach(() => {
+ resetStore(store);
+ vm.$destroy();
+ });
+
+ it('renders provided trace', () => {
+ vm = mountComponentWithStore(Component, {
+ props: {
+ trace,
+ isComplete: true,
+ },
+ store,
+ });
+
+ expect(vm.$el.querySelector('code').textContent).toContain(
+ 'Running with gitlab-runner 11.1.0 (081978aa)',
+ );
+ });
+
+ describe('while receiving trace', () => {
+ it('renders animation', () => {
+ vm = mountComponentWithStore(Component, {
+ props: {
+ trace,
+ isComplete: false,
+ },
+ store,
+ });
+
+ expect(vm.$el.querySelector('.js-log-animation')).not.toBeNull();
+ });
+ });
+
+ describe('when build trace has finishes', () => {
+ it('does not render animation', () => {
+ vm = mountComponentWithStore(Component, {
+ props: {
+ trace,
+ isComplete: true,
+ },
+ store,
+ });
+
+ expect(vm.$el.querySelector('.js-log-animation')).toBeNull();
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/jobs_container_spec.js b/spec/javascripts/jobs/components/jobs_container_spec.js
new file mode 100644
index 00000000000..fa3a2c4c266
--- /dev/null
+++ b/spec/javascripts/jobs/components/jobs_container_spec.js
@@ -0,0 +1,131 @@
+import Vue from 'vue';
+import component from '~/jobs/components/jobs_container.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Jobs List block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const retried = {
+ status: {
+ details_path: '/gitlab-org/gitlab-ce/pipelines/28029444',
+ group: 'success',
+ has_details: true,
+ icon: 'status_success',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ },
+ id: 233432756,
+ tooltip: 'build - passed',
+ retried: true,
+ };
+
+ const active = {
+ name: 'test',
+ status: {
+ details_path: '/gitlab-org/gitlab-ce/pipelines/28029444',
+ group: 'success',
+ has_details: true,
+ icon: 'status_success',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ },
+ id: 2322756,
+ tooltip: 'build - passed',
+ active: true,
+ };
+
+ const job = {
+ name: 'build',
+ status: {
+ details_path: '/gitlab-org/gitlab-ce/pipelines/28029444',
+ group: 'success',
+ has_details: true,
+ icon: 'status_success',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ },
+ id: 232153,
+ tooltip: 'build - passed',
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders list of jobs', () => {
+ vm = mountComponent(Component, {
+ jobs: [job, retried, active],
+ jobId: 12313,
+ });
+
+ expect(vm.$el.querySelectorAll('a').length).toEqual(3);
+ });
+
+ it('renders arrow right when job id matches `jobId`', () => {
+ vm = mountComponent(Component, {
+ jobs: [active],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('a .js-arrow-right')).not.toBeNull();
+ });
+
+ it('does not render arrow right when job is not active', () => {
+ vm = mountComponent(Component, {
+ jobs: [job],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('a .js-arrow-right')).toBeNull();
+ });
+
+ it('renders job name when present', () => {
+ vm = mountComponent(Component, {
+ jobs: [job],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('a').textContent.trim()).toContain(job.name);
+ expect(vm.$el.querySelector('a').textContent.trim()).not.toContain(job.id);
+ });
+
+ it('renders job id when job name is not available', () => {
+ vm = mountComponent(Component, {
+ jobs: [retried],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('a').textContent.trim()).toContain(retried.id);
+ });
+
+ it('links to the job page', () => {
+ vm = mountComponent(Component, {
+ jobs: [job],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('a').getAttribute('href')).toEqual(job.status.details_path);
+ });
+
+ it('renders retry icon when job was retried', () => {
+ vm = mountComponent(Component, {
+ jobs: [retried],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('.js-retry-icon')).not.toBeNull();
+ });
+
+ it('does not render retry icon when job was not retried', () => {
+ vm = mountComponent(Component, {
+ jobs: [job],
+ jobId: active.id,
+ });
+
+ expect(vm.$el.querySelector('.js-retry-icon')).toBeNull();
+ });
+});
diff --git a/spec/javascripts/jobs/sidebar_detail_row_spec.js b/spec/javascripts/jobs/components/sidebar_detail_row_spec.js
index e6bfb0c4adc..42d11266dad 100644
--- a/spec/javascripts/jobs/sidebar_detail_row_spec.js
+++ b/spec/javascripts/jobs/components/sidebar_detail_row_spec.js
@@ -33,9 +33,9 @@ describe('Sidebar detail row', () => {
});
it('should render provided title and value', () => {
- expect(
- vm.$el.textContent.replace(/\s+/g, ' ').trim(),
- ).toEqual('this is the title: this is the value');
+ expect(vm.$el.textContent.replace(/\s+/g, ' ').trim()).toEqual(
+ 'this is the title: this is the value',
+ );
});
describe('when helpUrl not provided', () => {
diff --git a/spec/javascripts/jobs/components/sidebar_spec.js b/spec/javascripts/jobs/components/sidebar_spec.js
new file mode 100644
index 00000000000..424092d2d88
--- /dev/null
+++ b/spec/javascripts/jobs/components/sidebar_spec.js
@@ -0,0 +1,189 @@
+import Vue from 'vue';
+import sidebarDetailsBlock from '~/jobs/components/sidebar.vue';
+import createStore from '~/jobs/store';
+import job, { stages, jobsInStage } from '../mock_data';
+import { mountComponentWithStore } from '../../helpers/vue_mount_component_helper';
+import { trimText } from '../../helpers/vue_component_helper';
+
+describe('Sidebar details block', () => {
+ const SidebarComponent = Vue.extend(sidebarDetailsBlock);
+ let vm;
+ let store;
+
+ beforeEach(() => {
+ store = createStore();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('when there is no retry path retry', () => {
+ it('should not render a retry button', () => {
+ const copy = Object.assign({}, job);
+ delete copy.retry_path;
+
+ store.dispatch('receiveJobSuccess', copy);
+ vm = mountComponentWithStore(SidebarComponent, {
+ store,
+ });
+
+ expect(vm.$el.querySelector('.js-retry-job')).toBeNull();
+ });
+ });
+
+ describe('without terminal path', () => {
+ it('does not render terminal link', () => {
+ store.dispatch('receiveJobSuccess', job);
+ vm = mountComponentWithStore(SidebarComponent, { store });
+
+ expect(vm.$el.querySelector('.js-terminal-link')).toBeNull();
+ });
+ });
+
+ describe('with terminal path', () => {
+ it('renders terminal link', () => {
+ store.dispatch(
+ 'receiveJobSuccess',
+ Object.assign({}, job, { terminal_path: 'job/43123/terminal' }),
+ );
+ vm = mountComponentWithStore(SidebarComponent, {
+ store,
+ });
+
+ expect(vm.$el.querySelector('.js-terminal-link')).not.toBeNull();
+ });
+ });
+
+ beforeEach(() => {
+ store.dispatch('receiveJobSuccess', job);
+ vm = mountComponentWithStore(SidebarComponent, { store });
+ });
+
+ describe('actions', () => {
+ it('should render link to new issue', () => {
+ expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual(
+ job.new_issue_path,
+ );
+
+ expect(vm.$el.querySelector('.js-new-issue').textContent.trim()).toEqual('New issue');
+ });
+
+ it('should render link to retry job', () => {
+ expect(vm.$el.querySelector('.js-retry-job').getAttribute('href')).toEqual(job.retry_path);
+ });
+
+ it('should render link to cancel job', () => {
+ expect(vm.$el.querySelector('.js-cancel-job').getAttribute('href')).toEqual(job.cancel_path);
+ });
+ });
+
+ describe('information', () => {
+ it('should render merge request link', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-mr').textContent)).toEqual('Merge Request: !2');
+
+ expect(vm.$el.querySelector('.js-job-mr a').getAttribute('href')).toEqual(
+ job.merge_request.path,
+ );
+ });
+
+ it('should render job duration', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-duration').textContent)).toEqual(
+ 'Duration: 6 seconds',
+ );
+ });
+
+ it('should render erased date', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-erased').textContent)).toEqual(
+ 'Erased: 3 weeks ago',
+ );
+ });
+
+ it('should render finished date', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-finished').textContent)).toEqual(
+ 'Finished: 3 weeks ago',
+ );
+ });
+
+ it('should render queued date', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-queued').textContent)).toEqual(
+ 'Queued: 9 seconds',
+ );
+ });
+
+ it('should render runner ID', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-runner').textContent)).toEqual(
+ 'Runner: local ci runner (#1)',
+ );
+ });
+
+ it('should render timeout information', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-timeout').textContent)).toEqual(
+ 'Timeout: 1m 40s (from runner)',
+ );
+ });
+
+ it('should render coverage', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-coverage').textContent)).toEqual(
+ 'Coverage: 20%',
+ );
+ });
+
+ it('should render tags', () => {
+ expect(trimText(vm.$el.querySelector('.js-job-tags').textContent)).toEqual('Tags: tag');
+ });
+ });
+
+ describe('stages dropdown', () => {
+ beforeEach(() => {
+ store.dispatch('receiveJobSuccess', job);
+ });
+
+ describe('while fetching stages', () => {
+ it('it does not render dropdown', () => {
+ store.dispatch('requestStages');
+ vm = mountComponentWithStore(SidebarComponent, { store });
+
+ expect(vm.$el.querySelector('.js-selected-stage')).toBeNull();
+ });
+ });
+
+ describe('with stages', () => {
+ beforeEach(() => {
+ store.dispatch('receiveStagesSuccess', stages);
+ vm = mountComponentWithStore(SidebarComponent, { store });
+ });
+
+ it('renders value provided as selectedStage as selected', () => {
+ expect(vm.$el.querySelector('.js-selected-stage').textContent.trim()).toEqual(
+ vm.selectedStage,
+ );
+ });
+ });
+
+ describe('without jobs for stages', () => {
+ beforeEach(() => {
+ store.dispatch('receiveJobSuccess', job);
+ store.dispatch('receiveStagesSuccess', stages);
+ vm = mountComponentWithStore(SidebarComponent, { store });
+ });
+
+ it('does not render job container', () => {
+ expect(vm.$el.querySelector('.js-jobs-container')).toBeNull();
+ });
+ });
+
+ describe('with jobs for stages', () => {
+ beforeEach(() => {
+ store.dispatch('receiveJobSuccess', job);
+ store.dispatch('receiveStagesSuccess', stages);
+ store.dispatch('receiveJobsForStageSuccess', jobsInStage.latest_statuses);
+ vm = mountComponentWithStore(SidebarComponent, { store });
+ });
+
+ it('renders list of jobs', () => {
+ expect(vm.$el.querySelector('.js-jobs-container')).not.toBeNull();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/components/stages_dropdown_spec.js b/spec/javascripts/jobs/components/stages_dropdown_spec.js
new file mode 100644
index 00000000000..9c731ae2f68
--- /dev/null
+++ b/spec/javascripts/jobs/components/stages_dropdown_spec.js
@@ -0,0 +1,59 @@
+import Vue from 'vue';
+import component from '~/jobs/components/stages_dropdown.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Stages Dropdown', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ pipeline: {
+ id: 28029444,
+ details: {
+ status: {
+ details_path: '/gitlab-org/gitlab-ce/pipelines/28029444',
+ group: 'success',
+ has_details: true,
+ icon: 'status_success',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ },
+ },
+ path: 'pipeline/28029444',
+ },
+ stages: [
+ {
+ name: 'build',
+ },
+ {
+ name: 'test',
+ },
+ ],
+ selectedStage: 'deploy',
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders pipeline status', () => {
+ expect(vm.$el.querySelector('.js-ci-status-icon-success')).not.toBeNull();
+ });
+
+ it('renders pipeline link', () => {
+ expect(vm.$el.querySelector('.js-pipeline-path').getAttribute('href')).toEqual(
+ 'pipeline/28029444',
+ );
+ });
+
+ it('renders dropdown with stages', () => {
+ expect(vm.$el.querySelector('.dropdown .js-stage-item').textContent).toContain('build');
+ });
+
+ it('rendes selected stage', () => {
+ expect(vm.$el.querySelector('.dropdown .js-selected-stage').textContent).toContain('deploy');
+ });
+});
diff --git a/spec/javascripts/jobs/stuck_block_spec.js b/spec/javascripts/jobs/components/stuck_block_spec.js
index 4e2108dfdfb..c320793b2be 100644
--- a/spec/javascripts/jobs/stuck_block_spec.js
+++ b/spec/javascripts/jobs/components/stuck_block_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import component from '~/jobs/components/stuck_block.vue';
-import mountComponent from '../helpers/vue_mount_component_helper';
+import mountComponent from '../../helpers/vue_mount_component_helper';
describe('Stuck Block Job component', () => {
const Component = Vue.extend(component);
diff --git a/spec/javascripts/jobs/components/trigger_block_spec.js b/spec/javascripts/jobs/components/trigger_block_spec.js
new file mode 100644
index 00000000000..7254851a9e7
--- /dev/null
+++ b/spec/javascripts/jobs/components/trigger_block_spec.js
@@ -0,0 +1,76 @@
+import Vue from 'vue';
+import component from '~/jobs/components/trigger_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Trigger block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with short token', () => {
+ it('renders short token', () => {
+ vm = mountComponent(Component, {
+ trigger: {
+ short_token: '0a666b2',
+ },
+ });
+
+ expect(vm.$el.querySelector('.js-short-token').textContent).toContain('0a666b2');
+ });
+ });
+
+ describe('without short token', () => {
+ it('does not render short token', () => {
+ vm = mountComponent(Component, { trigger: {} });
+
+ expect(vm.$el.querySelector('.js-short-token')).toBeNull();
+ });
+ });
+
+ describe('with variables', () => {
+ describe('reveal variables', () => {
+ it('reveals variables on click', done => {
+ vm = mountComponent(Component, {
+ trigger: {
+ short_token: 'bd7e',
+ variables: [
+ { key: 'UPLOAD_TO_GCS', value: 'false', public: false },
+ { key: 'UPLOAD_TO_S3', value: 'true', public: false },
+ ],
+ },
+ });
+
+ vm.$el.querySelector('.js-reveal-variables').click();
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.js-build-variables')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-build-variables').textContent).toContain(
+ 'UPLOAD_TO_GCS',
+ );
+
+ expect(vm.$el.querySelector('.js-build-variables').textContent).toContain('false');
+ expect(vm.$el.querySelector('.js-build-variables').textContent).toContain(
+ 'UPLOAD_TO_S3',
+ );
+
+ expect(vm.$el.querySelector('.js-build-variables').textContent).toContain('true');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+ });
+
+ describe('without variables', () => {
+ it('does not render variables', () => {
+ vm = mountComponent(Component, { trigger: {} });
+
+ expect(vm.$el.querySelector('.js-reveal-variables')).toBeNull();
+ expect(vm.$el.querySelector('.js-build-variables')).toBeNull();
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/header_spec.js b/spec/javascripts/jobs/header_spec.js
deleted file mode 100644
index e21e2c6d6e3..00000000000
--- a/spec/javascripts/jobs/header_spec.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import Vue from 'vue';
-import headerComponent from '~/jobs/components/header.vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
-
-describe('Job details header', () => {
- let HeaderComponent;
- let vm;
- let props;
-
- beforeEach(() => {
- HeaderComponent = Vue.extend(headerComponent);
-
- const threeWeeksAgo = new Date();
- threeWeeksAgo.setDate(threeWeeksAgo.getDate() - 21);
-
- const twoDaysAgo = new Date();
- twoDaysAgo.setDate(twoDaysAgo.getDate() - 2);
-
- props = {
- job: {
- status: {
- group: 'failed',
- icon: 'status_failed',
- label: 'failed',
- text: 'failed',
- details_path: 'path',
- },
- id: 123,
- created_at: threeWeeksAgo.toISOString(),
- user: {
- web_url: 'path',
- name: 'Foo',
- username: 'foobar',
- email: 'foo@bar.com',
- avatar_url: 'link',
- },
- started: twoDaysAgo.toISOString(),
- new_issue_path: 'path',
- },
- isLoading: false,
- };
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- describe('job reason', () => {
- it('should not render the reason when reason is absent', () => {
- vm = mountComponent(HeaderComponent, props);
-
- expect(vm.shouldRenderReason).toBe(false);
- });
-
- it('should render the reason when reason is present', () => {
- props.job.callout_message = 'There is an unknown failure, please try again';
-
- vm = mountComponent(HeaderComponent, props);
-
- expect(vm.shouldRenderReason).toBe(true);
- });
- });
-
- describe('triggered job', () => {
- beforeEach(() => {
- vm = mountComponent(HeaderComponent, props);
- });
-
- it('should render provided job information', () => {
- expect(
- vm.$el
- .querySelector('.header-main-content')
- .textContent.replace(/\s+/g, ' ')
- .trim(),
- ).toEqual('failed Job #123 triggered 2 days ago by Foo');
- });
-
- it('should render new issue link', () => {
- expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual(
- props.job.new_issue_path,
- );
- });
- });
-
- describe('created job', () => {
- it('should render created key', () => {
- props.job.started = false;
- vm = mountComponent(HeaderComponent, props);
-
- expect(
- vm.$el
- .querySelector('.header-main-content')
- .textContent.replace(/\s+/g, ' ')
- .trim(),
- ).toEqual('failed Job #123 created 3 weeks ago by Foo');
- });
- });
-});
diff --git a/spec/javascripts/jobs/job_details_mediator_spec.js b/spec/javascripts/jobs/job_details_mediator_spec.js
deleted file mode 100644
index ca5c9cf87e4..00000000000
--- a/spec/javascripts/jobs/job_details_mediator_spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import axios from '~/lib/utils/axios_utils';
-import JobMediator from '~/jobs/job_details_mediator';
-import job from './mock_data';
-
-describe('JobMediator', () => {
- let mediator;
- let mock;
-
- beforeEach(() => {
- mediator = new JobMediator({ endpoint: 'jobs/40291672.json' });
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('should set defaults', () => {
- expect(mediator.store).toBeDefined();
- expect(mediator.service).toBeDefined();
- expect(mediator.options).toEqual({ endpoint: 'jobs/40291672.json' });
- expect(mediator.state.isLoading).toEqual(false);
- });
-
- describe('request and store data', () => {
- beforeEach(() => {
- mock.onGet().reply(200, job, {});
- });
-
- it('should store received data', (done) => {
- mediator.fetchJob();
- setTimeout(() => {
- expect(mediator.store.state.job).toEqual(job);
- done();
- }, 0);
- });
- });
-});
diff --git a/spec/javascripts/jobs/job_store_spec.js b/spec/javascripts/jobs/job_store_spec.js
deleted file mode 100644
index d00faf29d1e..00000000000
--- a/spec/javascripts/jobs/job_store_spec.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import JobStore from '~/jobs/stores/job_store';
-import job from './mock_data';
-
-describe('Job Store', () => {
- let store;
-
- beforeEach(() => {
- store = new JobStore();
- });
-
- it('should set defaults', () => {
- expect(store.state.job).toEqual({});
- });
-
- describe('storeJob', () => {
- it('should store empty object if none is provided', () => {
- store.storeJob();
- expect(store.state.job).toEqual({});
- });
-
- it('should store provided argument', () => {
- store.storeJob(job);
- expect(store.state.job).toEqual(job);
- });
- });
-});
diff --git a/spec/javascripts/jobs/mixins/delayed_job_mixin_spec.js b/spec/javascripts/jobs/mixins/delayed_job_mixin_spec.js
new file mode 100644
index 00000000000..48a6b80b365
--- /dev/null
+++ b/spec/javascripts/jobs/mixins/delayed_job_mixin_spec.js
@@ -0,0 +1,93 @@
+import Vue from 'vue';
+import delayedJobMixin from '~/jobs/mixins/delayed_job_mixin';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+describe('DelayedJobMixin', () => {
+ const delayedJobFixture = getJSONFixture('jobs/delayed.json');
+ const dummyComponent = Vue.extend({
+ mixins: [delayedJobMixin],
+ props: {
+ job: {
+ type: Object,
+ required: true,
+ },
+ },
+ template: '<div>{{ remainingTime }}</div>',
+ });
+
+ let vm;
+
+ beforeEach(() => {
+ jasmine.clock().install();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ jasmine.clock().uninstall();
+ });
+
+ describe('if job is empty object', () => {
+ beforeEach(() => {
+ vm = mountComponent(dummyComponent, {
+ job: {},
+ });
+ });
+
+ it('sets remaining time to 00:00:00', () => {
+ expect(vm.$el.innerText).toBe('00:00:00');
+ });
+
+ describe('after mounting', () => {
+ beforeEach(done => {
+ Vue.nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('doe not update remaining time', () => {
+ expect(vm.$el.innerText).toBe('00:00:00');
+ });
+ });
+ });
+
+ describe('if job is delayed job', () => {
+ let remainingTimeInMilliseconds = 42000;
+
+ beforeEach(() => {
+ spyOn(Date, 'now').and.callFake(
+ () => new Date(delayedJobFixture.scheduled_at).getTime() - remainingTimeInMilliseconds,
+ );
+ vm = mountComponent(dummyComponent, {
+ job: delayedJobFixture,
+ });
+ });
+
+ it('sets remaining time to 00:00:00', () => {
+ expect(vm.$el.innerText).toBe('00:00:00');
+ });
+
+ describe('after mounting', () => {
+ beforeEach(done => {
+ Vue.nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('sets remaining time', () => {
+ expect(vm.$el.innerText).toBe('00:00:42');
+ });
+
+ it('updates remaining time', done => {
+ remainingTimeInMilliseconds = 41000;
+ jasmine.clock().tick(1000);
+
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el.innerText).toBe('00:00:41');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/mock_data.js b/spec/javascripts/jobs/mock_data.js
index 8fdd9b309b7..0398f184c0a 100644
--- a/spec/javascripts/jobs/mock_data.js
+++ b/spec/javascripts/jobs/mock_data.js
@@ -1,3 +1,5 @@
+import { TEST_HOST } from 'spec/test_constants';
+
const threeWeeksAgo = new Date();
threeWeeksAgo.setDate(threeWeeksAgo.getDate() - 21);
@@ -19,8 +21,9 @@ export default {
label: 'passed',
group: 'success',
has_details: true,
- details_path: '/root/ci-mock/-/jobs/4757',
- favicon: '/assets/ci_favicons/favicon_status_success-308b4fc054cdd1b68d0865e6cfb7b02e92e3472f201507418f8eddb74ac11a59.png',
+ details_path: `${TEST_HOST}/root/ci-mock/-/jobs/4757`,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-308b4fc054cdd1b68d0865e6cfb7b02e92e3472f201507418f8eddb74ac11a59.png',
action: {
icon: 'retry',
title: 'Retry',
@@ -30,6 +33,7 @@ export default {
},
coverage: 20,
erased_at: threeWeeksAgo.toISOString(),
+ erased: false,
duration: 6.785563,
tags: ['tag'],
user: {
@@ -37,7 +41,8 @@ export default {
username: 'root',
id: 1,
state: 'active',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
web_url: 'http://localhost:3000/root',
},
erase_path: '/root/ci-mock/-/jobs/4757/erase',
@@ -54,7 +59,8 @@ export default {
username: 'root',
id: 1,
state: 'active',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
web_url: 'http://localhost:3000/root',
},
active: false,
@@ -78,7 +84,8 @@ export default {
group: 'success',
has_details: true,
details_path: '/root/ci-mock/pipelines/140',
- favicon: '/assets/ci_favicons/favicon_status_success-308b4fc054cdd1b68d0865e6cfb7b02e92e3472f201507418f8eddb74ac11a59.png',
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-308b4fc054cdd1b68d0865e6cfb7b02e92e3472f201507418f8eddb74ac11a59.png',
},
duration: 6,
finished_at: '2017-06-01T17:32:00.042Z',
@@ -107,11 +114,14 @@ export default {
username: 'root',
id: 1,
state: 'active',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
web_url: 'http://localhost:3000/root',
},
- author_gravatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
- commit_url: 'http://localhost:3000/root/ci-mock/commit/c58647773a6b5faf066d4ad6ff2c9fbba5f180f6',
+ author_gravatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ commit_url:
+ 'http://localhost:3000/root/ci-mock/commit/c58647773a6b5faf066d4ad6ff2c9fbba5f180f6',
commit_path: '/root/ci-mock/commit/c58647773a6b5faf066d4ad6ff2c9fbba5f180f6',
},
},
@@ -124,4 +134,1031 @@ export default {
path: '/root/ci-mock/merge_requests/2',
},
raw_path: '/root/ci-mock/builds/4757/raw',
+ has_trace: true,
+};
+
+export const stages = [
+ {
+ name: 'build',
+ title: 'build: running',
+ groups: [
+ {
+ name: 'build:linux',
+ size: 1,
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/1180',
+ illustration: {
+ image: 'illustrations/pending_job_empty.svg',
+ size: 'svg-430',
+ title: 'This job has not started yet',
+ content: 'This job is in pending state and is waiting to be picked by a runner',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/1180/cancel',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 1180,
+ name: 'build:linux',
+ started: false,
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/1180',
+ cancel_path: '/gitlab-org/gitlab-shell/-/jobs/1180/cancel',
+ playable: false,
+ created_at: '2018-09-28T11:09:57.229Z',
+ updated_at: '2018-09-28T11:09:57.503Z',
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/1180',
+ illustration: {
+ image: 'illustrations/pending_job_empty.svg',
+ size: 'svg-430',
+ title: 'This job has not started yet',
+ content: 'This job is in pending state and is waiting to be picked by a runner',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/1180/cancel',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'build:osx',
+ size: 1,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/444',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/444/retry',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 444,
+ name: 'build:osx',
+ started: '2018-05-18T05:32:20.655Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/444',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/444/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.364Z',
+ updated_at: '2018-05-18T15:32:54.364Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/444',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/444/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ ],
+ status: {
+ icon: 'status_running',
+ text: 'running',
+ label: 'running',
+ group: 'running',
+ tooltip: 'running',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/pipelines/27#build',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_running-9c635b2419a8e1ec991c993061b89cc5aefc0743bb238ecd0c381e7741a70e8c.png',
+ },
+ path: '/gitlab-org/gitlab-shell/pipelines/27#build',
+ dropdown_path: '/gitlab-org/gitlab-shell/pipelines/27/stage.json?stage=build',
+ },
+ {
+ name: 'test',
+ title: 'test: passed with warnings',
+ groups: [
+ {
+ name: 'jenkins',
+ size: 1,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: null,
+ group: 'success',
+ tooltip: null,
+ has_details: false,
+ details_path: null,
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ jobs: [
+ {
+ id: 459,
+ name: 'jenkins',
+ started: '2018-05-18T09:32:20.658Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/459',
+ playable: false,
+ created_at: '2018-05-18T15:32:55.330Z',
+ updated_at: '2018-05-18T15:32:55.330Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: null,
+ group: 'success',
+ tooltip: null,
+ has_details: false,
+ details_path: null,
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ },
+ ],
+ },
+ {
+ name: 'rspec:linux',
+ size: 3,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: false,
+ details_path: null,
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ jobs: [
+ {
+ id: 445,
+ name: 'rspec:linux 0 3',
+ started: '2018-05-18T07:32:20.655Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/445',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/445/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.425Z',
+ updated_at: '2018-05-18T15:32:54.425Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/445',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/445/retry',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 446,
+ name: 'rspec:linux 1 3',
+ started: '2018-05-18T07:32:20.655Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/446',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/446/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.506Z',
+ updated_at: '2018-05-18T15:32:54.506Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/446',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/446/retry',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 447,
+ name: 'rspec:linux 2 3',
+ started: '2018-05-18T07:32:20.656Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/447',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/447/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.572Z',
+ updated_at: '2018-05-18T15:32:54.572Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/447',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/447/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'rspec:osx',
+ size: 1,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/452',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/452/retry',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 452,
+ name: 'rspec:osx',
+ started: '2018-05-18T07:32:20.657Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/452',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/452/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.920Z',
+ updated_at: '2018-05-18T15:32:54.920Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/452',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/452/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'rspec:windows',
+ size: 3,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: false,
+ details_path: null,
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ jobs: [
+ {
+ id: 448,
+ name: 'rspec:windows 0 3',
+ started: '2018-05-18T07:32:20.656Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/448',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/448/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.639Z',
+ updated_at: '2018-05-18T15:32:54.639Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/448',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/448/retry',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 449,
+ name: 'rspec:windows 1 3',
+ started: '2018-05-18T07:32:20.656Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/449',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/449/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.703Z',
+ updated_at: '2018-05-18T15:32:54.703Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/449',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/449/retry',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 451,
+ name: 'rspec:windows 2 3',
+ started: '2018-05-18T07:32:20.657Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/451',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/451/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.853Z',
+ updated_at: '2018-05-18T15:32:54.853Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/451',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/451/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'spinach:linux',
+ size: 1,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/453',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/453/retry',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 453,
+ name: 'spinach:linux',
+ started: '2018-05-18T07:32:20.657Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/453',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/453/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.993Z',
+ updated_at: '2018-05-18T15:32:54.993Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/453',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/453/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'spinach:osx',
+ size: 1,
+ status: {
+ icon: 'status_warning',
+ text: 'failed',
+ label: 'failed (allowed to fail)',
+ group: 'failed_with_warnings',
+ tooltip: 'failed - (unknown failure) (allowed to fail)',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/454',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/454/retry',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 454,
+ name: 'spinach:osx',
+ started: '2018-05-18T07:32:20.657Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/454',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/454/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:55.053Z',
+ updated_at: '2018-05-18T15:32:55.053Z',
+ status: {
+ icon: 'status_warning',
+ text: 'failed',
+ label: 'failed (allowed to fail)',
+ group: 'failed_with_warnings',
+ tooltip: 'failed - (unknown failure) (allowed to fail)',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/454',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/454/retry',
+ method: 'post',
+ },
+ },
+ callout_message: 'There is an unknown failure, please try again',
+ recoverable: true,
+ },
+ ],
+ },
+ ],
+ status: {
+ icon: 'status_warning',
+ text: 'passed',
+ label: 'passed with warnings',
+ group: 'success_with_warnings',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/pipelines/27#test',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ path: '/gitlab-org/gitlab-shell/pipelines/27#test',
+ dropdown_path: '/gitlab-org/gitlab-shell/pipelines/27/stage.json?stage=test',
+ },
+ {
+ name: 'deploy',
+ title: 'deploy: running',
+ groups: [
+ {
+ name: 'production',
+ size: 1,
+ status: {
+ icon: 'status_created',
+ text: 'created',
+ label: 'created',
+ group: 'created',
+ tooltip: 'created',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/457',
+ illustration: {
+ image: 'illustrations/job_not_triggered.svg',
+ size: 'svg-306',
+ title: 'This job has not been triggered yet',
+ content:
+ 'This job depends on upstream jobs that need to succeed in order for this job to be triggered',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_created-4b975aa976d24e5a3ea7cd9a5713e6ce2cd9afd08b910415e96675de35f64955.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/457/cancel',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 457,
+ name: 'production',
+ started: false,
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/457',
+ cancel_path: '/gitlab-org/gitlab-shell/-/jobs/457/cancel',
+ playable: false,
+ created_at: '2018-05-18T15:32:55.259Z',
+ updated_at: '2018-09-28T11:09:57.454Z',
+ status: {
+ icon: 'status_created',
+ text: 'created',
+ label: 'created',
+ group: 'created',
+ tooltip: 'created',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/457',
+ illustration: {
+ image: 'illustrations/job_not_triggered.svg',
+ size: 'svg-306',
+ title: 'This job has not been triggered yet',
+ content:
+ 'This job depends on upstream jobs that need to succeed in order for this job to be triggered',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_created-4b975aa976d24e5a3ea7cd9a5713e6ce2cd9afd08b910415e96675de35f64955.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/457/cancel',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'staging',
+ size: 1,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/455',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/455/retry',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 455,
+ name: 'staging',
+ started: '2018-05-18T09:32:20.658Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/455',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/455/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:55.119Z',
+ updated_at: '2018-05-18T15:32:55.119Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/455',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/455/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: 'stop staging',
+ size: 1,
+ status: {
+ icon: 'status_created',
+ text: 'created',
+ label: 'created',
+ group: 'created',
+ tooltip: 'created',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/456',
+ illustration: {
+ image: 'illustrations/job_not_triggered.svg',
+ size: 'svg-306',
+ title: 'This job has not been triggered yet',
+ content:
+ 'This job depends on upstream jobs that need to succeed in order for this job to be triggered',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_created-4b975aa976d24e5a3ea7cd9a5713e6ce2cd9afd08b910415e96675de35f64955.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/456/cancel',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 456,
+ name: 'stop staging',
+ started: false,
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/456',
+ cancel_path: '/gitlab-org/gitlab-shell/-/jobs/456/cancel',
+ playable: false,
+ created_at: '2018-05-18T15:32:55.205Z',
+ updated_at: '2018-09-28T11:09:57.396Z',
+ status: {
+ icon: 'status_created',
+ text: 'created',
+ label: 'created',
+ group: 'created',
+ tooltip: 'created',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/456',
+ illustration: {
+ image: 'illustrations/job_not_triggered.svg',
+ size: 'svg-306',
+ title: 'This job has not been triggered yet',
+ content:
+ 'This job depends on upstream jobs that need to succeed in order for this job to be triggered',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_created-4b975aa976d24e5a3ea7cd9a5713e6ce2cd9afd08b910415e96675de35f64955.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/456/cancel',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ ],
+ status: {
+ icon: 'status_running',
+ text: 'running',
+ label: 'running',
+ group: 'running',
+ tooltip: 'running',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/pipelines/27#deploy',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_running-9c635b2419a8e1ec991c993061b89cc5aefc0743bb238ecd0c381e7741a70e8c.png',
+ },
+ path: '/gitlab-org/gitlab-shell/pipelines/27#deploy',
+ dropdown_path: '/gitlab-org/gitlab-shell/pipelines/27/stage.json?stage=deploy',
+ },
+ {
+ name: 'notify',
+ title: 'notify: manual action',
+ groups: [
+ {
+ name: 'slack',
+ size: 1,
+ status: {
+ icon: 'status_manual',
+ text: 'manual',
+ label: 'manual play action',
+ group: 'manual',
+ tooltip: 'manual action',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/458',
+ illustration: {
+ image: 'illustrations/manual_action.svg',
+ size: 'svg-394',
+ title: 'This job requires a manual action',
+ content:
+ 'This job depends on a user to trigger its process. Often they are used to deploy code to production environments',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png',
+ action: {
+ icon: 'play',
+ title: 'Play',
+ path: '/gitlab-org/gitlab-shell/-/jobs/458/play',
+ method: 'post',
+ },
+ },
+ jobs: [
+ {
+ id: 458,
+ name: 'slack',
+ started: null,
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/458',
+ play_path: '/gitlab-org/gitlab-shell/-/jobs/458/play',
+ playable: true,
+ created_at: '2018-05-18T15:32:55.303Z',
+ updated_at: '2018-05-18T15:34:08.535Z',
+ status: {
+ icon: 'status_manual',
+ text: 'manual',
+ label: 'manual play action',
+ group: 'manual',
+ tooltip: 'manual action',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/458',
+ illustration: {
+ image: 'illustrations/manual_action.svg',
+ size: 'svg-394',
+ title: 'This job requires a manual action',
+ content:
+ 'This job depends on a user to trigger its process. Often they are used to deploy code to production environments',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png',
+ action: {
+ icon: 'play',
+ title: 'Play',
+ path: '/gitlab-org/gitlab-shell/-/jobs/458/play',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ },
+ ],
+ status: {
+ icon: 'status_manual',
+ text: 'manual',
+ label: 'manual action',
+ group: 'manual',
+ tooltip: 'manual action',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/pipelines/27#notify',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png',
+ },
+ path: '/gitlab-org/gitlab-shell/pipelines/27#notify',
+ dropdown_path: '/gitlab-org/gitlab-shell/pipelines/27/stage.json?stage=notify',
+ },
+];
+
+export const jobsInStage = {
+ name: 'build',
+ title: 'build: running',
+ latest_statuses: [
+ {
+ id: 1180,
+ name: 'build:linux',
+ started: false,
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/1180',
+ cancel_path: '/gitlab-org/gitlab-shell/-/jobs/1180/cancel',
+ playable: false,
+ created_at: '2018-09-28T11:09:57.229Z',
+ updated_at: '2018-09-28T11:09:57.503Z',
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/1180',
+ illustration: {
+ image: 'illustrations/pending_job_empty.svg',
+ size: 'svg-430',
+ title: 'This job has not started yet',
+ content: 'This job is in pending state and is waiting to be picked by a runner',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ action: {
+ icon: 'cancel',
+ title: 'Cancel',
+ path: '/gitlab-org/gitlab-shell/-/jobs/1180/cancel',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 444,
+ name: 'build:osx',
+ started: '2018-05-18T05:32:20.655Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/444',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/444/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.364Z',
+ updated_at: '2018-05-18T15:32:54.364Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/444',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/444/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ retried: [
+ {
+ id: 443,
+ name: 'build:linux',
+ started: '2018-05-18T06:32:20.655Z',
+ build_path: '/gitlab-org/gitlab-shell/-/jobs/443',
+ retry_path: '/gitlab-org/gitlab-shell/-/jobs/443/retry',
+ playable: false,
+ created_at: '2018-05-18T15:32:54.296Z',
+ updated_at: '2018-05-18T15:32:54.296Z',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed (retried)',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/-/jobs/443',
+ illustration: {
+ image: 'illustrations/skipped-job_empty.svg',
+ size: 'svg-430',
+ title: 'This job does not have a trace.',
+ },
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/gitlab-org/gitlab-shell/-/jobs/443/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ status: {
+ icon: 'status_running',
+ text: 'running',
+ label: 'running',
+ group: 'running',
+ tooltip: 'running',
+ has_details: true,
+ details_path: '/gitlab-org/gitlab-shell/pipelines/27#build',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_running-9c635b2419a8e1ec991c993061b89cc5aefc0743bb238ecd0c381e7741a70e8c.png',
+ },
+ path: '/gitlab-org/gitlab-shell/pipelines/27#build',
+ dropdown_path: '/gitlab-org/gitlab-shell/pipelines/27/stage.json?stage=build',
};
diff --git a/spec/javascripts/jobs/sidebar_details_block_spec.js b/spec/javascripts/jobs/sidebar_details_block_spec.js
deleted file mode 100644
index 21ef5650b80..00000000000
--- a/spec/javascripts/jobs/sidebar_details_block_spec.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import Vue from 'vue';
-import sidebarDetailsBlock from '~/jobs/components/sidebar_details_block.vue';
-import job from './mock_data';
-import mountComponent from '../helpers/vue_mount_component_helper';
-
-describe('Sidebar details block', () => {
- let SidebarComponent;
- let vm;
-
- function trimWhitespace(element) {
- return element.textContent.replace(/\s+/g, ' ').trim();
- }
-
- beforeEach(() => {
- SidebarComponent = Vue.extend(sidebarDetailsBlock);
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- describe('when it is loading', () => {
- it('should render a loading spinner', () => {
- vm = mountComponent(SidebarComponent, {
- job: {},
- isLoading: true,
- });
- expect(vm.$el.querySelector('.fa-spinner')).toBeDefined();
- });
- });
-
- describe('when there is no retry path retry', () => {
- it('should not render a retry button', () => {
- vm = mountComponent(SidebarComponent, {
- job: {},
- isLoading: false,
- });
-
- expect(vm.$el.querySelector('.js-retry-job')).toBeNull();
- });
- });
-
- describe('without terminal path', () => {
- it('does not render terminal link', () => {
- vm = mountComponent(SidebarComponent, {
- job,
- isLoading: false,
- });
-
- expect(vm.$el.querySelector('.js-terminal-link')).toBeNull();
- });
- });
-
- describe('with terminal path', () => {
- it('renders terminal link', () => {
- vm = mountComponent(SidebarComponent, {
- job,
- isLoading: false,
- terminalPath: 'job/43123/terminal',
- });
-
- expect(vm.$el.querySelector('.js-terminal-link')).not.toBeNull();
- });
- });
-
- beforeEach(() => {
- vm = mountComponent(SidebarComponent, {
- job,
- isLoading: false,
- });
- });
-
- describe('actions', () => {
- it('should render link to new issue', () => {
- expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual(
- job.new_issue_path,
- );
- expect(vm.$el.querySelector('.js-new-issue').textContent.trim()).toEqual('New issue');
- });
-
- it('should render link to retry job', () => {
- expect(vm.$el.querySelector('.js-retry-job').getAttribute('href')).toEqual(job.retry_path);
- });
-
- it('should render link to cancel job', () => {
- expect(vm.$el.querySelector('.js-cancel-job').getAttribute('href')).toEqual(job.cancel_path);
- });
- });
-
- describe('information', () => {
- it('should render merge request link', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-mr'))).toEqual('Merge Request: !2');
-
- expect(vm.$el.querySelector('.js-job-mr a').getAttribute('href')).toEqual(
- job.merge_request.path,
- );
- });
-
- it('should render job duration', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-duration'))).toEqual(
- 'Duration: 6 seconds',
- );
- });
-
- it('should render erased date', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-erased'))).toEqual('Erased: 3 weeks ago');
- });
-
- it('should render finished date', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-finished'))).toEqual(
- 'Finished: 3 weeks ago',
- );
- });
-
- it('should render queued date', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-queued'))).toEqual('Queued: 9 seconds');
- });
-
- it('should render runner ID', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-runner'))).toEqual(
- 'Runner: local ci runner (#1)',
- );
- });
-
- it('should render timeout information', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-timeout'))).toEqual(
- 'Timeout: 1m 40s (from runner)',
- );
- });
-
- it('should render coverage', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-coverage'))).toEqual('Coverage: 20%');
- });
-
- it('should render tags', () => {
- expect(trimWhitespace(vm.$el.querySelector('.js-job-tags'))).toEqual('Tags: tag');
- });
- });
-});
diff --git a/spec/javascripts/jobs/store/actions_spec.js b/spec/javascripts/jobs/store/actions_spec.js
new file mode 100644
index 00000000000..77b44995b12
--- /dev/null
+++ b/spec/javascripts/jobs/store/actions_spec.js
@@ -0,0 +1,512 @@
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import {
+ setJobEndpoint,
+ setTraceOptions,
+ clearEtagPoll,
+ stopPolling,
+ requestJob,
+ fetchJob,
+ receiveJobSuccess,
+ receiveJobError,
+ scrollTop,
+ scrollBottom,
+ requestTrace,
+ fetchTrace,
+ stopPollingTrace,
+ receiveTraceSuccess,
+ receiveTraceError,
+ requestStages,
+ fetchStages,
+ receiveStagesSuccess,
+ receiveStagesError,
+ requestJobsForStage,
+ fetchJobsForStage,
+ receiveJobsForStageSuccess,
+ receiveJobsForStageError,
+ hideSidebar,
+ showSidebar,
+ toggleSidebar,
+} from '~/jobs/store/actions';
+import state from '~/jobs/store/state';
+import * as types from '~/jobs/store/mutation_types';
+import testAction from 'spec/helpers/vuex_action_helper';
+import { TEST_HOST } from 'spec/test_constants';
+
+describe('Job State actions', () => {
+ let mockedState;
+
+ beforeEach(() => {
+ mockedState = state();
+ });
+
+ describe('setJobEndpoint', () => {
+ it('should commit SET_JOB_ENDPOINT mutation', done => {
+ testAction(
+ setJobEndpoint,
+ 'job/872324.json',
+ mockedState,
+ [{ type: types.SET_JOB_ENDPOINT, payload: 'job/872324.json' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('setTraceOptions', () => {
+ it('should commit SET_TRACE_OPTIONS mutation', done => {
+ testAction(
+ setTraceOptions,
+ { pagePath: 'job/872324/trace.json' },
+ mockedState,
+ [{ type: types.SET_TRACE_OPTIONS, payload: { pagePath: 'job/872324/trace.json' } }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('hideSidebar', () => {
+ it('should commit HIDE_SIDEBAR mutation', done => {
+ testAction(hideSidebar, null, mockedState, [{ type: types.HIDE_SIDEBAR }], [], done);
+ });
+ });
+
+ describe('showSidebar', () => {
+ it('should commit HIDE_SIDEBAR mutation', done => {
+ testAction(showSidebar, null, mockedState, [{ type: types.SHOW_SIDEBAR }], [], done);
+ });
+ });
+
+ describe('toggleSidebar', () => {
+ describe('when isSidebarOpen is true', () => {
+ it('should dispatch hideSidebar', done => {
+ testAction(toggleSidebar, null, mockedState, [], [{ type: 'hideSidebar' }], done);
+ });
+ });
+
+ describe('when isSidebarOpen is false', () => {
+ it('should dispatch showSidebar', done => {
+ mockedState.isSidebarOpen = false;
+
+ testAction(toggleSidebar, null, mockedState, [], [{ type: 'showSidebar' }], done);
+ });
+ });
+ });
+
+ describe('requestJob', () => {
+ it('should commit REQUEST_JOB mutation', done => {
+ testAction(requestJob, null, mockedState, [{ type: types.REQUEST_JOB }], [], done);
+ });
+ });
+
+ describe('fetchJob', () => {
+ let mock;
+
+ beforeEach(() => {
+ mockedState.jobEndpoint = `${TEST_HOST}/endpoint.json`;
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ stopPolling();
+ clearEtagPoll();
+ });
+
+ describe('success', () => {
+ it('dispatches requestJob and receiveJobSuccess ', done => {
+ mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, { id: 121212, name: 'karma' });
+
+ testAction(
+ fetchJob,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestJob',
+ },
+ {
+ payload: { id: 121212, name: 'karma' },
+ type: 'receiveJobSuccess',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
+ });
+
+ it('dispatches requestJob and receiveJobError ', done => {
+ testAction(
+ fetchJob,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestJob',
+ },
+ {
+ type: 'receiveJobError',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('receiveJobSuccess', () => {
+ it('should commit RECEIVE_JOB_SUCCESS mutation', done => {
+ testAction(
+ receiveJobSuccess,
+ { id: 121232132 },
+ mockedState,
+ [{ type: types.RECEIVE_JOB_SUCCESS, payload: { id: 121232132 } }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveJobError', () => {
+ it('should commit RECEIVE_JOB_ERROR mutation', done => {
+ testAction(receiveJobError, null, mockedState, [{ type: types.RECEIVE_JOB_ERROR }], [], done);
+ });
+ });
+
+ describe('scrollTop', () => {
+ it('should dispatch toggleScrollButtons action', done => {
+ testAction(scrollTop, null, mockedState, [], [{ type: 'toggleScrollButtons' }], done);
+ });
+ });
+
+ describe('scrollBottom', () => {
+ it('should dispatch toggleScrollButtons action', done => {
+ testAction(scrollBottom, null, mockedState, [], [{ type: 'toggleScrollButtons' }], done);
+ });
+ });
+
+ describe('requestTrace', () => {
+ it('should commit REQUEST_TRACE mutation', done => {
+ testAction(requestTrace, null, mockedState, [{ type: types.REQUEST_TRACE }], [], done);
+ });
+ });
+
+ describe('fetchTrace', () => {
+ let mock;
+
+ beforeEach(() => {
+ mockedState.traceEndpoint = `${TEST_HOST}/endpoint`;
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ stopPolling();
+ clearEtagPoll();
+ });
+
+ describe('success', () => {
+ it('dispatches requestTrace, receiveTraceSuccess and stopPollingTrace when job is complete', done => {
+ mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, {
+ html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
+ complete: true,
+ });
+
+ testAction(
+ fetchTrace,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'toggleScrollisInBottom',
+ payload: true,
+ },
+ {
+ payload: {
+ html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
+ complete: true,
+ },
+ type: 'receiveTraceSuccess',
+ },
+ {
+ type: 'stopPollingTrace',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(`${TEST_HOST}/endpoint/trace.json`).reply(500);
+ });
+
+ it('dispatches requestTrace and receiveTraceError ', done => {
+ testAction(
+ fetchTrace,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'receiveTraceError',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('stopPollingTrace', () => {
+ it('should commit STOP_POLLING_TRACE mutation ', done => {
+ testAction(
+ stopPollingTrace,
+ null,
+ mockedState,
+ [{ type: types.STOP_POLLING_TRACE }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveTraceSuccess', () => {
+ it('should commit RECEIVE_TRACE_SUCCESS mutation ', done => {
+ testAction(
+ receiveTraceSuccess,
+ 'hello world',
+ mockedState,
+ [{ type: types.RECEIVE_TRACE_SUCCESS, payload: 'hello world' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveTraceError', () => {
+ it('should commit RECEIVE_TRACE_ERROR mutation ', done => {
+ testAction(
+ receiveTraceError,
+ null,
+ mockedState,
+ [{ type: types.RECEIVE_TRACE_ERROR }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('requestStages', () => {
+ it('should commit REQUEST_STAGES mutation ', done => {
+ testAction(requestStages, null, mockedState, [{ type: types.REQUEST_STAGES }], [], done);
+ });
+ });
+
+ describe('fetchStages', () => {
+ let mock;
+
+ beforeEach(() => {
+ mockedState.job.pipeline = {
+ path: `${TEST_HOST}/endpoint`,
+ };
+ mockedState.selectedStage = 'deploy';
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('success', () => {
+ it('dispatches requestStages and receiveStagesSuccess, fetchJobsForStage ', done => {
+ mock
+ .onGet(`${TEST_HOST}/endpoint.json`)
+ .replyOnce(200, { details: { stages: [{ name: 'build' }, { name: 'deploy' }] } });
+
+ testAction(
+ fetchStages,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestStages',
+ },
+ {
+ payload: [{ name: 'build' }, { name: 'deploy' }],
+ type: 'receiveStagesSuccess',
+ },
+ {
+ payload: { name: 'deploy' },
+ type: 'fetchJobsForStage',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
+ });
+
+ it('dispatches requestStages and receiveStagesError ', done => {
+ testAction(
+ fetchStages,
+ null,
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestStages',
+ },
+ {
+ type: 'receiveStagesError',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('receiveStagesSuccess', () => {
+ it('should commit RECEIVE_STAGES_SUCCESS mutation ', done => {
+ testAction(
+ receiveStagesSuccess,
+ {},
+ mockedState,
+ [{ type: types.RECEIVE_STAGES_SUCCESS, payload: {} }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveStagesError', () => {
+ it('should commit RECEIVE_STAGES_ERROR mutation ', done => {
+ testAction(
+ receiveStagesError,
+ null,
+ mockedState,
+ [{ type: types.RECEIVE_STAGES_ERROR }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('requestJobsForStage', () => {
+ it('should commit REQUEST_JOBS_FOR_STAGE mutation ', done => {
+ testAction(
+ requestJobsForStage,
+ { name: 'deploy' },
+ mockedState,
+ [{ type: types.REQUEST_JOBS_FOR_STAGE, payload: { name: 'deploy' } }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('fetchJobsForStage', () => {
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('success', () => {
+ it('dispatches requestJobsForStage and receiveJobsForStageSuccess ', done => {
+ mock
+ .onGet(`${TEST_HOST}/jobs.json`)
+ .replyOnce(200, { latest_statuses: [{ id: 121212, name: 'build' }], retried: [] });
+
+ testAction(
+ fetchJobsForStage,
+ { dropdown_path: `${TEST_HOST}/jobs.json` },
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestJobsForStage',
+ payload: { dropdown_path: `${TEST_HOST}/jobs.json` },
+ },
+ {
+ payload: [{ id: 121212, name: 'build' }],
+ type: 'receiveJobsForStageSuccess',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(`${TEST_HOST}/jobs.json`).reply(500);
+ });
+
+ it('dispatches requestJobsForStage and receiveJobsForStageError', done => {
+ testAction(
+ fetchJobsForStage,
+ { dropdown_path: `${TEST_HOST}/jobs.json` },
+ mockedState,
+ [],
+ [
+ {
+ type: 'requestJobsForStage',
+ payload: { dropdown_path: `${TEST_HOST}/jobs.json` },
+ },
+ {
+ type: 'receiveJobsForStageError',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('receiveJobsForStageSuccess', () => {
+ it('should commit RECEIVE_JOBS_FOR_STAGE_SUCCESS mutation ', done => {
+ testAction(
+ receiveJobsForStageSuccess,
+ [{ id: 121212, name: 'karma' }],
+ mockedState,
+ [{ type: types.RECEIVE_JOBS_FOR_STAGE_SUCCESS, payload: [{ id: 121212, name: 'karma' }] }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveJobsForStageError', () => {
+ it('should commit RECEIVE_JOBS_FOR_STAGE_ERROR mutation ', done => {
+ testAction(
+ receiveJobsForStageError,
+ null,
+ mockedState,
+ [{ type: types.RECEIVE_JOBS_FOR_STAGE_ERROR }],
+ [],
+ done,
+ );
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/store/getters_spec.js b/spec/javascripts/jobs/store/getters_spec.js
new file mode 100644
index 00000000000..4195d9d3680
--- /dev/null
+++ b/spec/javascripts/jobs/store/getters_spec.js
@@ -0,0 +1,212 @@
+import * as getters from '~/jobs/store/getters';
+import state from '~/jobs/store/state';
+
+describe('Job Store Getters', () => {
+ let localState;
+
+ beforeEach(() => {
+ localState = state();
+ });
+
+ describe('headerActions', () => {
+ describe('with new issue path', () => {
+ it('returns an array with action to create a new issue', () => {
+ localState.job.new_issue_path = 'issues/new';
+
+ expect(getters.headerActions(localState)).toEqual([
+ {
+ label: 'New issue',
+ path: localState.job.new_issue_path,
+ cssClass:
+ 'js-new-issue btn btn-success btn-inverted d-none d-md-block d-lg-block d-xl-block',
+ type: 'link',
+ },
+ ]);
+ });
+ });
+
+ describe('without new issue path', () => {
+ it('returns an empty array', () => {
+ expect(getters.headerActions(localState)).toEqual([]);
+ });
+ });
+ });
+
+ describe('headerTime', () => {
+ describe('when the job has started key', () => {
+ it('returns started key', () => {
+ const started = '2018-08-31T16:20:49.023Z';
+ localState.job.started = started;
+
+ expect(getters.headerTime(localState)).toEqual(started);
+ });
+ });
+
+ describe('when the job does not have started key', () => {
+ it('returns created_at key', () => {
+ const created = '2018-08-31T16:20:49.023Z';
+ localState.job.created_at = created;
+
+ expect(getters.headerTime(localState)).toEqual(created);
+ });
+ });
+ });
+
+ describe('shouldRenderCalloutMessage', () => {
+ describe('with status and callout message', () => {
+ it('returns true', () => {
+ localState.job.callout_message = 'Callout message';
+ localState.job.status = { icon: 'passed' };
+
+ expect(getters.shouldRenderCalloutMessage(localState)).toEqual(true);
+ });
+ });
+
+ describe('without status & with callout message', () => {
+ it('returns false', () => {
+ localState.job.callout_message = 'Callout message';
+
+ expect(getters.shouldRenderCalloutMessage(localState)).toEqual(false);
+ });
+ });
+
+ describe('with status & without callout message', () => {
+ it('returns false', () => {
+ localState.job.status = { icon: 'passed' };
+
+ expect(getters.shouldRenderCalloutMessage(localState)).toEqual(false);
+ });
+ });
+ });
+
+ describe('shouldRenderTriggeredLabel', () => {
+ describe('when started equals null', () => {
+ it('returns false', () => {
+ localState.job.started = null;
+
+ expect(getters.shouldRenderTriggeredLabel(localState)).toEqual(false);
+ });
+ });
+
+ describe('when started equals string', () => {
+ it('returns true', () => {
+ localState.job.started = '2018-08-31T16:20:49.023Z';
+
+ expect(getters.shouldRenderTriggeredLabel(localState)).toEqual(true);
+ });
+ });
+ });
+
+ describe('hasEnvironment', () => {
+ describe('without `deployment_status`', () => {
+ it('returns false', () => {
+ expect(getters.hasEnvironment(localState)).toEqual(false);
+ });
+ });
+
+ describe('with an empty object for `deployment_status`', () => {
+ it('returns false', () => {
+ localState.job.deployment_status = {};
+
+ expect(getters.hasEnvironment(localState)).toEqual(false);
+ });
+ });
+
+ describe('when `deployment_status` is defined and not empty', () => {
+ it('returns true', () => {
+ localState.job.deployment_status = {
+ status: 'creating',
+ environment: {
+ last_deployment: {},
+ },
+ };
+
+ expect(getters.hasEnvironment(localState)).toEqual(true);
+ });
+ });
+ });
+
+ describe('hasTrace', () => {
+ describe('when has_trace is true', () => {
+ it('returns true', () => {
+ localState.job.has_trace = true;
+ localState.job.status = {};
+
+ expect(getters.hasTrace(localState)).toEqual(true);
+ });
+ });
+
+ describe('when job is running', () => {
+ it('returns true', () => {
+ localState.job.has_trace = false;
+ localState.job.status = { group: 'running' };
+
+ expect(getters.hasTrace(localState)).toEqual(true);
+ });
+ });
+
+ describe('when has_trace is false and job is not running', () => {
+ it('returns false', () => {
+ localState.job.has_trace = false;
+ localState.job.status = { group: 'pending' };
+
+ expect(getters.hasTrace(localState)).toEqual(false);
+ });
+ });
+ });
+
+ describe('emptyStateIllustration', () => {
+ describe('with defined illustration', () => {
+ it('returns the state illustration object', () => {
+ localState.job.status = {
+ illustration: {
+ path: 'foo',
+ },
+ };
+
+ expect(getters.emptyStateIllustration(localState)).toEqual({ path: 'foo' });
+ });
+ });
+
+ describe('when illustration is not defined', () => {
+ it('returns an empty object', () => {
+ expect(getters.emptyStateIllustration(localState)).toEqual({});
+ });
+ });
+ });
+
+ describe('hasRunnersForProject', () => {
+ describe('with available and offline runners', () => {
+ it('returns true', () => {
+ localState.job.runners = {
+ available: true,
+ online: false,
+ };
+
+ expect(getters.hasRunnersForProject(localState)).toEqual(true);
+ });
+ });
+
+ describe('with non available runners', () => {
+ it('returns false', () => {
+ localState.job.runners = {
+ available: false,
+ online: false,
+ };
+
+ expect(getters.hasRunnersForProject(localState)).toEqual(false);
+ });
+ });
+
+ describe('with online runners', () => {
+ it('returns false', () => {
+ localState.job.runners = {
+ available: false,
+ online: true,
+ };
+
+ expect(getters.hasRunnersForProject(localState)).toEqual(false);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/jobs/store/helpers.js b/spec/javascripts/jobs/store/helpers.js
new file mode 100644
index 00000000000..81a769b4a6e
--- /dev/null
+++ b/spec/javascripts/jobs/store/helpers.js
@@ -0,0 +1,6 @@
+import state from '~/jobs/store/state';
+
+// eslint-disable-next-line import/prefer-default-export
+export const resetStore = store => {
+ store.replaceState(state());
+};
diff --git a/spec/javascripts/jobs/store/mutations_spec.js b/spec/javascripts/jobs/store/mutations_spec.js
new file mode 100644
index 00000000000..d7908efcf13
--- /dev/null
+++ b/spec/javascripts/jobs/store/mutations_spec.js
@@ -0,0 +1,230 @@
+import state from '~/jobs/store/state';
+import mutations from '~/jobs/store/mutations';
+import * as types from '~/jobs/store/mutation_types';
+
+describe('Jobs Store Mutations', () => {
+ let stateCopy;
+
+ const html =
+ 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- : Writing /builds/ab89e95b0fa0b9272ea0c797b76908f24d36992630e9325273a4ce3.png<br>I';
+
+ beforeEach(() => {
+ stateCopy = state();
+ });
+
+ describe('SET_JOB_ENDPOINT', () => {
+ it('should set jobEndpoint', () => {
+ mutations[types.SET_JOB_ENDPOINT](stateCopy, 'job/21312321.json');
+
+ expect(stateCopy.jobEndpoint).toEqual('job/21312321.json');
+ });
+ });
+
+ describe('HIDE_SIDEBAR', () => {
+ it('should set isSidebarOpen to false', () => {
+ mutations[types.HIDE_SIDEBAR](stateCopy);
+
+ expect(stateCopy.isSidebarOpen).toEqual(false);
+ });
+ });
+
+ describe('SHOW_SIDEBAR', () => {
+ it('should set isSidebarOpen to true', () => {
+ mutations[types.SHOW_SIDEBAR](stateCopy);
+
+ expect(stateCopy.isSidebarOpen).toEqual(true);
+ });
+ });
+
+ describe('RECEIVE_TRACE_SUCCESS', () => {
+ describe('when trace has state', () => {
+ it('sets traceState', () => {
+ const stateLog =
+ 'eyJvZmZzZXQiOjczNDQ1MSwibl9vcGVuX3RhZ3MiOjAsImZnX2NvbG9yIjpudWxsLCJiZ19jb2xvciI6bnVsbCwic3R5bGVfbWFzayI6MH0=';
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ state: stateLog,
+ });
+
+ expect(stateCopy.traceState).toEqual(stateLog);
+ });
+ });
+
+ describe('when traceSize is smaller than the total size', () => {
+ it('sets isTraceSizeVisible to true', () => {
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, { total: 51184600, size: 1231 });
+
+ expect(stateCopy.isTraceSizeVisible).toEqual(true);
+ });
+ });
+
+ describe('when traceSize is bigger than the total size', () => {
+ it('sets isTraceSizeVisible to false', () => {
+ const copy = Object.assign({}, stateCopy, { traceSize: 5118460, size: 2321312 });
+
+ mutations[types.RECEIVE_TRACE_SUCCESS](copy, { total: 511846 });
+
+ expect(copy.isTraceSizeVisible).toEqual(false);
+ });
+ });
+
+ it('sets trace, trace size and isTraceComplete', () => {
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ append: true,
+ html,
+ size: 511846,
+ complete: true,
+ });
+
+ expect(stateCopy.trace).toEqual(html);
+ expect(stateCopy.traceSize).toEqual(511846);
+ expect(stateCopy.isTraceComplete).toEqual(true);
+ });
+ });
+
+ describe('STOP_POLLING_TRACE', () => {
+ it('sets isTraceComplete to true', () => {
+ mutations[types.STOP_POLLING_TRACE](stateCopy);
+
+ expect(stateCopy.isTraceComplete).toEqual(true);
+ });
+ });
+
+ describe('RECEIVE_TRACE_ERROR', () => {
+ it('resets trace state and sets error to true', () => {
+ mutations[types.RECEIVE_TRACE_ERROR](stateCopy);
+
+ expect(stateCopy.isTraceComplete).toEqual(true);
+ });
+ });
+
+ describe('REQUEST_JOB', () => {
+ it('sets isLoading to true', () => {
+ mutations[types.REQUEST_JOB](stateCopy);
+
+ expect(stateCopy.isLoading).toEqual(true);
+ });
+ });
+
+ describe('RECEIVE_JOB_SUCCESS', () => {
+ it('sets is loading to false', () => {
+ mutations[types.RECEIVE_JOB_SUCCESS](stateCopy, { id: 1312321 });
+
+ expect(stateCopy.isLoading).toEqual(false);
+ });
+
+ it('sets hasError to false', () => {
+ mutations[types.RECEIVE_JOB_SUCCESS](stateCopy, { id: 1312321 });
+
+ expect(stateCopy.hasError).toEqual(false);
+ });
+
+ it('sets job data', () => {
+ mutations[types.RECEIVE_JOB_SUCCESS](stateCopy, { id: 1312321 });
+
+ expect(stateCopy.job).toEqual({ id: 1312321 });
+ });
+
+ it('sets selectedStage when the selectedStage is empty', () => {
+ expect(stateCopy.selectedStage).toEqual('');
+ mutations[types.RECEIVE_JOB_SUCCESS](stateCopy, { id: 1312321, stage: 'deploy' });
+
+ expect(stateCopy.selectedStage).toEqual('deploy');
+ });
+
+ it('does not set selectedStage when the selectedStage is not More', () => {
+ stateCopy.selectedStage = 'notify';
+
+ expect(stateCopy.selectedStage).toEqual('notify');
+ mutations[types.RECEIVE_JOB_SUCCESS](stateCopy, { id: 1312321, stage: 'deploy' });
+
+ expect(stateCopy.selectedStage).toEqual('notify');
+ });
+ });
+
+ describe('RECEIVE_JOB_ERROR', () => {
+ it('resets job data', () => {
+ mutations[types.RECEIVE_JOB_ERROR](stateCopy);
+
+ expect(stateCopy.isLoading).toEqual(false);
+ expect(stateCopy.job).toEqual({});
+ });
+ });
+
+ describe('REQUEST_STAGES', () => {
+ it('sets isLoadingStages to true', () => {
+ mutations[types.REQUEST_STAGES](stateCopy);
+
+ expect(stateCopy.isLoadingStages).toEqual(true);
+ });
+ });
+
+ describe('RECEIVE_STAGES_SUCCESS', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_STAGES_SUCCESS](stateCopy, [{ name: 'build' }]);
+ });
+
+ it('sets isLoadingStages to false', () => {
+ expect(stateCopy.isLoadingStages).toEqual(false);
+ });
+
+ it('sets stages', () => {
+ expect(stateCopy.stages).toEqual([{ name: 'build' }]);
+ });
+ });
+
+ describe('RECEIVE_STAGES_ERROR', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_STAGES_ERROR](stateCopy);
+ });
+
+ it('sets isLoadingStages to false', () => {
+ expect(stateCopy.isLoadingStages).toEqual(false);
+ });
+
+ it('resets stages', () => {
+ expect(stateCopy.stages).toEqual([]);
+ });
+ });
+
+ describe('REQUEST_JOBS_FOR_STAGE', () => {
+ it('sets isLoadingStages to true', () => {
+ mutations[types.REQUEST_JOBS_FOR_STAGE](stateCopy, { name: 'deploy' });
+
+ expect(stateCopy.isLoadingJobs).toEqual(true);
+ });
+
+ it('sets selectedStage', () => {
+ mutations[types.REQUEST_JOBS_FOR_STAGE](stateCopy, { name: 'deploy' });
+
+ expect(stateCopy.selectedStage).toEqual('deploy');
+ });
+ });
+
+ describe('RECEIVE_JOBS_FOR_STAGE_SUCCESS', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_JOBS_FOR_STAGE_SUCCESS](stateCopy, [{ name: 'karma' }]);
+ });
+
+ it('sets isLoadingJobs to false', () => {
+ expect(stateCopy.isLoadingJobs).toEqual(false);
+ });
+
+ it('sets jobs', () => {
+ expect(stateCopy.jobs).toEqual([{ name: 'karma' }]);
+ });
+ });
+
+ describe('RECEIVE_JOBS_FOR_STAGE_ERROR', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_JOBS_FOR_STAGE_ERROR](stateCopy);
+ });
+
+ it('sets isLoadingJobs to false', () => {
+ expect(stateCopy.isLoadingJobs).toEqual(false);
+ });
+
+ it('resets jobs', () => {
+ expect(stateCopy.jobs).toEqual([]);
+ });
+ });
+});
diff --git a/spec/javascripts/labels_issue_sidebar_spec.js b/spec/javascripts/labels_issue_sidebar_spec.js
index 5aafb6ad8f0..e5678ee5379 100644
--- a/spec/javascripts/labels_issue_sidebar_spec.js
+++ b/spec/javascripts/labels_issue_sidebar_spec.js
@@ -12,88 +12,106 @@ import '~/api';
import '~/create_label';
import '~/users_select';
-(() => {
- let saveLabelCount = 0;
- let mock;
+let saveLabelCount = 0;
+let mock;
- describe('Issue dropdown sidebar', () => {
- preloadFixtures('static/issue_sidebar_label.html.raw');
+describe('Issue dropdown sidebar', () => {
+ preloadFixtures('static/issue_sidebar_label.html.raw');
- beforeEach(() => {
- loadFixtures('static/issue_sidebar_label.html.raw');
+ beforeEach(() => {
+ loadFixtures('static/issue_sidebar_label.html.raw');
- mock = new MockAdapter(axios);
+ mock = new MockAdapter(axios);
- new IssuableContext('{"id":1,"name":"Administrator","username":"root"}');
- new LabelsSelect();
+ new IssuableContext('{"id":1,"name":"Administrator","username":"root"}');
+ new LabelsSelect();
- mock.onGet('/root/test/labels.json').reply(() => {
- const labels = Array(10).fill().map((_, i) => ({
+ mock.onGet('/root/test/labels.json').reply(() => {
+ const labels = Array(10)
+ .fill()
+ .map((_, i) => ({
id: i,
title: `test ${i}`,
color: '#5CB85C',
}));
- return [200, labels];
- });
+ return [200, labels];
+ });
- mock.onPut('/root/test/issues/2.json').reply(() => {
- const labels = Array(saveLabelCount).fill().map((_, i) => ({
+ mock.onPut('/root/test/issues/2.json').reply(() => {
+ const labels = Array(saveLabelCount)
+ .fill()
+ .map((_, i) => ({
id: i,
title: `test ${i}`,
color: '#5CB85C',
}));
- return [200, { labels }];
- });
- });
-
- afterEach(() => {
- mock.restore();
+ return [200, { labels }];
});
+ });
- it('changes collapsed tooltip when changing labels when less than 5', (done) => {
- saveLabelCount = 5;
- $('.edit-link').get(0).click();
-
- setTimeout(() => {
- expect($('.dropdown-content a').length).toBe(10);
-
- $('.dropdown-content a').each(function (i) {
- if (i < saveLabelCount) {
- $(this).get(0).click();
- }
- });
-
- $('.edit-link').get(0).click();
+ afterEach(() => {
+ mock.restore();
+ });
- setTimeout(() => {
- expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe('test 0, test 1, test 2, test 3, test 4');
- done();
- }, 0);
- }, 0);
- });
+ it('changes collapsed tooltip when changing labels when less than 5', done => {
+ saveLabelCount = 5;
+ $('.edit-link')
+ .get(0)
+ .click();
+
+ setTimeout(() => {
+ expect($('.dropdown-content a').length).toBe(10);
+
+ $('.dropdown-content a').each(function(i) {
+ if (i < saveLabelCount) {
+ $(this)
+ .get(0)
+ .click();
+ }
+ });
- it('changes collapsed tooltip when changing labels when more than 5', (done) => {
- saveLabelCount = 6;
- $('.edit-link').get(0).click();
+ $('.edit-link')
+ .get(0)
+ .click();
setTimeout(() => {
- expect($('.dropdown-content a').length).toBe(10);
+ expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe(
+ 'test 0, test 1, test 2, test 3, test 4',
+ );
+ done();
+ }, 0);
+ }, 0);
+ });
- $('.dropdown-content a').each(function (i) {
- if (i < saveLabelCount) {
- $(this).get(0).click();
- }
- });
+ it('changes collapsed tooltip when changing labels when more than 5', done => {
+ saveLabelCount = 6;
+ $('.edit-link')
+ .get(0)
+ .click();
+
+ setTimeout(() => {
+ expect($('.dropdown-content a').length).toBe(10);
+
+ $('.dropdown-content a').each(function(i) {
+ if (i < saveLabelCount) {
+ $(this)
+ .get(0)
+ .click();
+ }
+ });
- $('.edit-link').get(0).click();
+ $('.edit-link')
+ .get(0)
+ .click();
- setTimeout(() => {
- expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe('test 0, test 1, test 2, test 3, test 4, and 1 more');
- done();
- }, 0);
+ setTimeout(() => {
+ expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe(
+ 'test 0, test 1, test 2, test 3, test 4, and 1 more',
+ );
+ done();
}, 0);
- });
+ }, 0);
});
-})();
+});
diff --git a/spec/javascripts/labels_select_spec.js b/spec/javascripts/labels_select_spec.js
index 386e00bfd0c..acfdc885032 100644
--- a/spec/javascripts/labels_select_spec.js
+++ b/spec/javascripts/labels_select_spec.js
@@ -19,10 +19,12 @@ describe('LabelsSelect', () => {
let $labelEl;
beforeEach(() => {
- $labelEl = $(LabelsSelect.getLabelTemplate({
- labels: mockLabels,
- issueUpdateURL: mockUrl,
- }));
+ $labelEl = $(
+ LabelsSelect.getLabelTemplate({
+ labels: mockLabels,
+ issueUpdateURL: mockUrl,
+ }),
+ );
});
it('generated label item template has correct label URL', () => {
@@ -38,7 +40,9 @@ describe('LabelsSelect', () => {
});
it('generated label item template has correct label styles', () => {
- expect($labelEl.find('span.label').attr('style')).toBe(`background-color: ${label.color}; color: ${label.text_color};`);
+ expect($labelEl.find('span.label').attr('style')).toBe(
+ `background-color: ${label.color}; color: ${label.text_color};`,
+ );
});
it('generated label item has a badge class', () => {
diff --git a/spec/javascripts/landing_spec.js b/spec/javascripts/landing_spec.js
index 7916073190a..2fe5a47b63e 100644
--- a/spec/javascripts/landing_spec.js
+++ b/spec/javascripts/landing_spec.js
@@ -1,9 +1,9 @@
import Landing from '~/landing';
import Cookies from 'js-cookie';
-describe('Landing', function () {
- describe('class constructor', function () {
- beforeEach(function () {
+describe('Landing', function() {
+ describe('class constructor', function() {
+ beforeEach(function() {
this.landingElement = {};
this.dismissButton = {};
this.cookieName = 'cookie_name';
@@ -11,25 +11,25 @@ describe('Landing', function () {
this.landing = new Landing(this.landingElement, this.dismissButton, this.cookieName);
});
- it('should set .landing', function () {
+ it('should set .landing', function() {
expect(this.landing.landingElement).toBe(this.landingElement);
});
- it('should set .cookieName', function () {
+ it('should set .cookieName', function() {
expect(this.landing.cookieName).toBe(this.cookieName);
});
- it('should set .dismissButton', function () {
+ it('should set .dismissButton', function() {
expect(this.landing.dismissButton).toBe(this.dismissButton);
});
- it('should set .eventWrapper', function () {
+ it('should set .eventWrapper', function() {
expect(this.landing.eventWrapper).toEqual({});
});
});
- describe('toggle', function () {
- beforeEach(function () {
+ describe('toggle', function() {
+ beforeEach(function() {
this.isDismissed = false;
this.landingElement = { classList: jasmine.createSpyObj('classList', ['toggle']) };
this.landing = {
@@ -44,20 +44,20 @@ describe('Landing', function () {
Landing.prototype.toggle.call(this.landing);
});
- it('should call .isDismissed', function () {
+ it('should call .isDismissed', function() {
expect(this.landing.isDismissed).toHaveBeenCalled();
});
- it('should call .classList.toggle', function () {
+ it('should call .classList.toggle', function() {
expect(this.landingElement.classList.toggle).toHaveBeenCalledWith('hidden', this.isDismissed);
});
- it('should call .addEvents', function () {
+ it('should call .addEvents', function() {
expect(this.landing.addEvents).toHaveBeenCalled();
});
- describe('if isDismissed is true', function () {
- beforeEach(function () {
+ describe('if isDismissed is true', function() {
+ beforeEach(function() {
this.isDismissed = true;
this.landingElement = { classList: jasmine.createSpyObj('classList', ['toggle']) };
this.landing = {
@@ -74,14 +74,14 @@ describe('Landing', function () {
Landing.prototype.toggle.call(this.landing);
});
- it('should not call .addEvents', function () {
+ it('should not call .addEvents', function() {
expect(this.landing.addEvents).not.toHaveBeenCalled();
});
});
});
- describe('addEvents', function () {
- beforeEach(function () {
+ describe('addEvents', function() {
+ beforeEach(function() {
this.dismissButton = jasmine.createSpyObj('dismissButton', ['addEventListener']);
this.eventWrapper = {};
this.landing = {
@@ -93,17 +93,20 @@ describe('Landing', function () {
Landing.prototype.addEvents.call(this.landing);
});
- it('should set .eventWrapper.dismissLanding', function () {
+ it('should set .eventWrapper.dismissLanding', function() {
expect(this.eventWrapper.dismissLanding).toEqual(jasmine.any(Function));
});
- it('should call .addEventListener', function () {
- expect(this.dismissButton.addEventListener).toHaveBeenCalledWith('click', this.eventWrapper.dismissLanding);
+ it('should call .addEventListener', function() {
+ expect(this.dismissButton.addEventListener).toHaveBeenCalledWith(
+ 'click',
+ this.eventWrapper.dismissLanding,
+ );
});
});
- describe('removeEvents', function () {
- beforeEach(function () {
+ describe('removeEvents', function() {
+ beforeEach(function() {
this.dismissButton = jasmine.createSpyObj('dismissButton', ['removeEventListener']);
this.eventWrapper = { dismissLanding: () => {} };
this.landing = {
@@ -114,13 +117,16 @@ describe('Landing', function () {
Landing.prototype.removeEvents.call(this.landing);
});
- it('should call .removeEventListener', function () {
- expect(this.dismissButton.removeEventListener).toHaveBeenCalledWith('click', this.eventWrapper.dismissLanding);
+ it('should call .removeEventListener', function() {
+ expect(this.dismissButton.removeEventListener).toHaveBeenCalledWith(
+ 'click',
+ this.eventWrapper.dismissLanding,
+ );
});
});
- describe('dismissLanding', function () {
- beforeEach(function () {
+ describe('dismissLanding', function() {
+ beforeEach(function() {
this.landingElement = { classList: jasmine.createSpyObj('classList', ['add']) };
this.cookieName = 'cookie_name';
this.landing = { landingElement: this.landingElement, cookieName: this.cookieName };
@@ -130,17 +136,17 @@ describe('Landing', function () {
Landing.prototype.dismissLanding.call(this.landing);
});
- it('should call .classList.add', function () {
+ it('should call .classList.add', function() {
expect(this.landingElement.classList.add).toHaveBeenCalledWith('hidden');
});
- it('should call Cookies.set', function () {
+ it('should call Cookies.set', function() {
expect(Cookies.set).toHaveBeenCalledWith(this.cookieName, 'true', { expires: 365 });
});
});
- describe('isDismissed', function () {
- beforeEach(function () {
+ describe('isDismissed', function() {
+ beforeEach(function() {
this.cookieName = 'cookie_name';
this.landing = { cookieName: this.cookieName };
@@ -149,11 +155,11 @@ describe('Landing', function () {
this.isDismissed = Landing.prototype.isDismissed.call(this.landing);
});
- it('should call Cookies.get', function () {
+ it('should call Cookies.get', function() {
expect(Cookies.get).toHaveBeenCalledWith(this.cookieName);
});
- it('should return a boolean', function () {
+ it('should return a boolean', function() {
expect(typeof this.isDismissed).toEqual('boolean');
});
});
diff --git a/spec/javascripts/lazy_loader_spec.js b/spec/javascripts/lazy_loader_spec.js
index 1d81e4e2d1a..eac4756e8a9 100644
--- a/spec/javascripts/lazy_loader_spec.js
+++ b/spec/javascripts/lazy_loader_spec.js
@@ -1,57 +1,214 @@
import LazyLoader from '~/lazy_loader';
+import { TEST_HOST } from './test_constants';
let lazyLoader = null;
-describe('LazyLoader', function () {
+const execImmediately = callback => {
+ callback();
+};
+
+describe('LazyLoader', function() {
preloadFixtures('issues/issue_with_comment.html.raw');
- beforeEach(function () {
- loadFixtures('issues/issue_with_comment.html.raw');
- lazyLoader = new LazyLoader({
- observerNode: 'body',
+ describe('with IntersectionObserver disabled', () => {
+ beforeEach(function() {
+ loadFixtures('issues/issue_with_comment.html.raw');
+
+ lazyLoader = new LazyLoader({
+ observerNode: 'foobar',
+ });
+
+ spyOn(LazyLoader, 'supportsIntersectionObserver').and.callFake(() => false);
+
+ spyOn(LazyLoader, 'loadImage').and.callThrough();
+
+ spyOn(window, 'requestAnimationFrame').and.callFake(execImmediately);
+ spyOn(window, 'requestIdleCallback').and.callFake(execImmediately);
+
+ // Doing everything that happens normally in onload
+ lazyLoader.register();
+ });
+
+ afterEach(() => {
+ lazyLoader.unregister();
+ });
+
+ it('should copy value from data-src to src for img 1', function(done) {
+ const img = document.querySelectorAll('img[data-src]')[0];
+ const originalDataSrc = img.getAttribute('data-src');
+ img.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
+ expect(img.getAttribute('src')).toBe(originalDataSrc);
+ expect(img).toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
+ });
+
+ it('should lazy load dynamically added data-src images', function(done) {
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.className = 'lazy';
+ newImg.setAttribute('data-src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
+ expect(newImg.getAttribute('src')).toBe(testPath);
+ expect(newImg).toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
+ });
+
+ it('should not alter normal images', function(done) {
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.setAttribute('src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).not.toHaveBeenCalled();
+ expect(newImg).not.toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
+ });
+
+ it('should not load dynamically added pictures if content observer is turned off', done => {
+ lazyLoader.stopContentObserver();
+
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.className = 'lazy';
+ newImg.setAttribute('data-src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).not.toHaveBeenCalled();
+ expect(newImg).not.toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
+ });
+
+ it('should load dynamically added pictures if content observer is turned off and on again', done => {
+ lazyLoader.stopContentObserver();
+ lazyLoader.startContentObserver();
+
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.className = 'lazy';
+ newImg.setAttribute('data-src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
+ expect(newImg).toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
});
- // Doing everything that happens normally in onload
- lazyLoader.loadCheck();
});
- describe('behavior', function () {
- it('should copy value from data-src to src for img 1', function (done) {
+
+ describe('with IntersectionObserver enabled', () => {
+ beforeEach(function() {
+ loadFixtures('issues/issue_with_comment.html.raw');
+
+ lazyLoader = new LazyLoader({
+ observerNode: 'foobar',
+ });
+
+ spyOn(LazyLoader, 'loadImage').and.callThrough();
+
+ spyOn(window, 'requestAnimationFrame').and.callFake(execImmediately);
+ spyOn(window, 'requestIdleCallback').and.callFake(execImmediately);
+
+ // Doing everything that happens normally in onload
+ lazyLoader.register();
+ });
+
+ afterEach(() => {
+ lazyLoader.unregister();
+ });
+
+ it('should copy value from data-src to src for img 1', function(done) {
const img = document.querySelectorAll('img[data-src]')[0];
const originalDataSrc = img.getAttribute('data-src');
img.scrollIntoView();
setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
expect(img.getAttribute('src')).toBe(originalDataSrc);
- expect(document.getElementsByClassName('js-lazy-loaded').length).toBeGreaterThan(0);
+ expect(img).toHaveClass('js-lazy-loaded');
done();
- }, 100);
+ }, 50);
});
- it('should lazy load dynamically added data-src images', function (done) {
+ it('should lazy load dynamically added data-src images', function(done) {
const newImg = document.createElement('img');
- const testPath = '/img/testimg.png';
+ const testPath = `${TEST_HOST}/img/testimg.png`;
newImg.className = 'lazy';
newImg.setAttribute('data-src', testPath);
document.body.appendChild(newImg);
newImg.scrollIntoView();
setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
expect(newImg.getAttribute('src')).toBe(testPath);
- expect(document.getElementsByClassName('js-lazy-loaded').length).toBeGreaterThan(0);
+ expect(newImg).toHaveClass('js-lazy-loaded');
done();
- }, 100);
+ }, 50);
});
- it('should not alter normal images', function (done) {
+ it('should not alter normal images', function(done) {
const newImg = document.createElement('img');
- const testPath = '/img/testimg.png';
+ const testPath = `${TEST_HOST}/img/testimg.png`;
newImg.setAttribute('src', testPath);
document.body.appendChild(newImg);
newImg.scrollIntoView();
setTimeout(() => {
+ expect(LazyLoader.loadImage).not.toHaveBeenCalled();
expect(newImg).not.toHaveClass('js-lazy-loaded');
done();
- }, 100);
+ }, 50);
+ });
+
+ it('should not load dynamically added pictures if content observer is turned off', done => {
+ lazyLoader.stopContentObserver();
+
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.className = 'lazy';
+ newImg.setAttribute('data-src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).not.toHaveBeenCalled();
+ expect(newImg).not.toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
+ });
+
+ it('should load dynamically added pictures if content observer is turned off and on again', done => {
+ lazyLoader.stopContentObserver();
+ lazyLoader.startContentObserver();
+
+ const newImg = document.createElement('img');
+ const testPath = `${TEST_HOST}/img/testimg.png`;
+ newImg.className = 'lazy';
+ newImg.setAttribute('data-src', testPath);
+ document.body.appendChild(newImg);
+ newImg.scrollIntoView();
+
+ setTimeout(() => {
+ expect(LazyLoader.loadImage).toHaveBeenCalled();
+ expect(newImg).toHaveClass('js-lazy-loaded');
+ done();
+ }, 50);
});
});
});
diff --git a/spec/javascripts/lib/utils/accessor_spec.js b/spec/javascripts/lib/utils/accessor_spec.js
index b768d6f2a68..0045330e470 100644
--- a/spec/javascripts/lib/utils/accessor_spec.js
+++ b/spec/javascripts/lib/utils/accessor_spec.js
@@ -13,7 +13,11 @@ describe('AccessorUtilities', () => {
});
it('should return `false` if access throws an error', () => {
- base = { get testProp() { throw testError; } };
+ base = {
+ get testProp() {
+ throw testError;
+ },
+ };
expect(AccessorUtilities.isPropertyAccessSafe(base, 'testProp')).toBe(false);
});
@@ -35,7 +39,9 @@ describe('AccessorUtilities', () => {
});
it('should return `false` if calling throws an error', () => {
- base.func = () => { throw new Error('test error'); };
+ base.func = () => {
+ throw new Error('test error');
+ };
expect(AccessorUtilities.isFunctionCallSafe(base, 'func')).toBe(false);
});
@@ -58,7 +64,9 @@ describe('AccessorUtilities', () => {
});
it('should return `false` if access to .setItem isnt safe', () => {
- window.localStorage.setItem.and.callFake(() => { throw testError; });
+ window.localStorage.setItem.and.callFake(() => {
+ throw testError;
+ });
expect(AccessorUtilities.isLocalStorageAccessSafe()).toBe(false);
});
diff --git a/spec/javascripts/lib/utils/ajax_cache_spec.js b/spec/javascripts/lib/utils/ajax_cache_spec.js
index 7603400b55e..dc0b04173bf 100644
--- a/spec/javascripts/lib/utils/ajax_cache_spec.js
+++ b/spec/javascripts/lib/utils/ajax_cache_spec.js
@@ -9,8 +9,8 @@ describe('AjaxCache', () => {
};
beforeEach(() => {
- AjaxCache.internalStorage = { };
- AjaxCache.pendingRequests = { };
+ AjaxCache.internalStorage = {};
+ AjaxCache.pendingRequests = {};
});
describe('get', () => {
@@ -59,7 +59,7 @@ describe('AjaxCache', () => {
it('does nothing if cache is empty', () => {
AjaxCache.remove(dummyEndpoint);
- expect(AjaxCache.internalStorage).toEqual({ });
+ expect(AjaxCache.internalStorage).toEqual({});
});
it('does nothing if cache contains no matching data', () => {
@@ -75,7 +75,7 @@ describe('AjaxCache', () => {
AjaxCache.remove(dummyEndpoint);
- expect(AjaxCache.internalStorage).toEqual({ });
+ expect(AjaxCache.internalStorage).toEqual({});
});
});
@@ -101,61 +101,61 @@ describe('AjaxCache', () => {
mock.restore();
});
- it('stores and returns data from Ajax call if cache is empty', (done) => {
+ it('stores and returns data from Ajax call if cache is empty', done => {
mock.onGet(dummyEndpoint).reply(200, dummyResponse);
AjaxCache.retrieve(dummyEndpoint)
- .then((data) => {
- expect(data).toEqual(dummyResponse);
- expect(AjaxCache.internalStorage[dummyEndpoint]).toEqual(dummyResponse);
- })
- .then(done)
- .catch(fail);
+ .then(data => {
+ expect(data).toEqual(dummyResponse);
+ expect(AjaxCache.internalStorage[dummyEndpoint]).toEqual(dummyResponse);
+ })
+ .then(done)
+ .catch(fail);
});
- it('makes no Ajax call if request is pending', (done) => {
+ it('makes no Ajax call if request is pending', done => {
mock.onGet(dummyEndpoint).reply(200, dummyResponse);
AjaxCache.retrieve(dummyEndpoint)
- .then(done)
- .catch(fail);
+ .then(done)
+ .catch(fail);
AjaxCache.retrieve(dummyEndpoint)
- .then(done)
- .catch(fail);
+ .then(done)
+ .catch(fail);
expect(axios.get.calls.count()).toBe(1);
});
- it('returns undefined if Ajax call fails and cache is empty', (done) => {
+ it('returns undefined if Ajax call fails and cache is empty', done => {
const errorMessage = 'Network Error';
mock.onGet(dummyEndpoint).networkError();
AjaxCache.retrieve(dummyEndpoint)
- .then(data => fail(`Received unexpected data: ${JSON.stringify(data)}`))
- .catch((error) => {
- expect(error.message).toBe(`${dummyEndpoint}: ${errorMessage}`);
- expect(error.textStatus).toBe(errorMessage);
- done();
- })
- .catch(fail);
+ .then(data => fail(`Received unexpected data: ${JSON.stringify(data)}`))
+ .catch(error => {
+ expect(error.message).toBe(`${dummyEndpoint}: ${errorMessage}`);
+ expect(error.textStatus).toBe(errorMessage);
+ done();
+ })
+ .catch(fail);
});
- it('makes no Ajax call if matching data exists', (done) => {
+ it('makes no Ajax call if matching data exists', done => {
AjaxCache.internalStorage[dummyEndpoint] = dummyResponse;
mock.onGet(dummyEndpoint).reply(() => {
fail(new Error('expected no Ajax call!'));
});
AjaxCache.retrieve(dummyEndpoint)
- .then((data) => {
- expect(data).toBe(dummyResponse);
- })
- .then(done)
- .catch(fail);
+ .then(data => {
+ expect(data).toBe(dummyResponse);
+ })
+ .then(done)
+ .catch(fail);
});
- it('makes Ajax call even if matching data exists when forceRequest parameter is provided', (done) => {
+ it('makes Ajax call even if matching data exists when forceRequest parameter is provided', done => {
const oldDummyResponse = {
important: 'old dummy data',
};
@@ -166,7 +166,7 @@ describe('AjaxCache', () => {
// Call without forceRetrieve param
AjaxCache.retrieve(dummyEndpoint)
- .then((data) => {
+ .then(data => {
expect(data).toBe(oldDummyResponse);
})
.then(done)
@@ -174,7 +174,7 @@ describe('AjaxCache', () => {
// Call with forceRetrieve param
AjaxCache.retrieve(dummyEndpoint, true)
- .then((data) => {
+ .then(data => {
expect(data).toEqual(dummyResponse);
})
.then(done)
diff --git a/spec/javascripts/lib/utils/common_utils_spec.js b/spec/javascripts/lib/utils/common_utils_spec.js
index 71b26a315af..0fb90c3b78c 100644
--- a/spec/javascripts/lib/utils/common_utils_spec.js
+++ b/spec/javascripts/lib/utils/common_utils_spec.js
@@ -1,4 +1,3 @@
-/* eslint-disable promise/catch-or-return */
import axios from '~/lib/utils/axios_utils';
import * as commonUtils from '~/lib/utils/common_utils';
import MockAdapter from 'axios-mock-adapter';
@@ -9,6 +8,7 @@ describe('common_utils', () => {
it('returns an anchor tag with url', () => {
expect(commonUtils.parseUrl('/some/absolute/url').pathname).toContain('some/absolute/url');
});
+
it('url is escaped', () => {
// IE11 will return a relative pathname while other browsers will return a full pathname.
// parseUrl uses an anchor element for parsing an url. With relative urls, the anchor
@@ -29,24 +29,39 @@ describe('common_utils', () => {
});
});
- describe('getUrlParamsArray', () => {
- it('should return params array', () => {
- expect(commonUtils.getUrlParamsArray() instanceof Array).toBe(true);
+ describe('urlParamsToArray', () => {
+ it('returns empty array for empty querystring', () => {
+ expect(commonUtils.urlParamsToArray('')).toEqual([]);
+ });
+
+ it('should decode params', () => {
+ expect(commonUtils.urlParamsToArray('?label_name%5B%5D=test')[0]).toBe('label_name[]=test');
});
it('should remove the question mark from the search params', () => {
- const paramsArray = commonUtils.getUrlParamsArray();
- expect(paramsArray[0][0] !== '?').toBe(true);
+ const paramsArray = commonUtils.urlParamsToArray('?test=thing');
+
+ expect(paramsArray[0][0]).not.toBe('?');
});
+ });
- it('should decode params', () => {
- window.history.pushState('', '', '?label_name%5B%5D=test');
+ describe('urlParamsToObject', () => {
+ it('parses path for label with trailing +', () => {
+ expect(commonUtils.urlParamsToObject('label_name[]=label%2B', {})).toEqual({
+ label_name: ['label+'],
+ });
+ });
- expect(
- commonUtils.getUrlParamsArray()[0],
- ).toBe('label_name[]=test');
+ it('parses path for milestone with trailing +', () => {
+ expect(commonUtils.urlParamsToObject('milestone_title=A%2B', {})).toEqual({
+ milestone_title: 'A+',
+ });
+ });
- window.history.pushState('', '', '?');
+ it('parses path for search terms with spaces', () => {
+ expect(commonUtils.urlParamsToObject('search=two+words', {})).toEqual({
+ search: 'two words',
+ });
});
});
@@ -99,6 +114,7 @@ describe('common_utils', () => {
commonUtils.handleLocationHash();
expectGetElementIdToHaveBeenCalledWith('test');
+
expect(window.scrollY).toBe(document.getElementById('test').offsetTop);
document.getElementById('parent').remove();
@@ -117,6 +133,7 @@ describe('common_utils', () => {
expectGetElementIdToHaveBeenCalledWith('test');
expectGetElementIdToHaveBeenCalledWith('user-content-test');
+
expect(window.scrollY).toBe(document.getElementById('user-content-test').offsetTop);
document.getElementById('parent').remove();
@@ -137,6 +154,7 @@ describe('common_utils', () => {
expectGetElementIdToHaveBeenCalledWith('test');
expectGetElementIdToHaveBeenCalledWith('user-content-test');
+
expect(window.scrollY).toBe(document.getElementById('user-content-test').offsetTop - 50);
expect(window.scrollBy).toHaveBeenCalledWith(0, -50);
@@ -161,7 +179,11 @@ describe('common_utils', () => {
describe('parseQueryStringIntoObject', () => {
it('should return object with query parameters', () => {
- expect(commonUtils.parseQueryStringIntoObject('scope=all&page=2')).toEqual({ scope: 'all', page: '2' });
+ expect(commonUtils.parseQueryStringIntoObject('scope=all&page=2')).toEqual({
+ scope: 'all',
+ page: '2',
+ });
+
expect(commonUtils.parseQueryStringIntoObject('scope=all')).toEqual({ scope: 'all' });
expect(commonUtils.parseQueryStringIntoObject()).toEqual({});
});
@@ -185,7 +207,9 @@ describe('common_utils', () => {
describe('buildUrlWithCurrentLocation', () => {
it('should build an url with current location and given parameters', () => {
expect(commonUtils.buildUrlWithCurrentLocation()).toEqual(window.location.pathname);
- expect(commonUtils.buildUrlWithCurrentLocation('?page=2')).toEqual(`${window.location.pathname}?page=2`);
+ expect(commonUtils.buildUrlWithCurrentLocation('?page=2')).toEqual(
+ `${window.location.pathname}?page=2`,
+ );
});
});
@@ -200,20 +224,24 @@ describe('common_utils', () => {
it('should return valid parameter', () => {
const value = commonUtils.getParameterByName('scope');
+
expect(commonUtils.getParameterByName('p')).toEqual('2');
expect(value).toBe('all');
});
it('should return invalid parameter', () => {
const value = commonUtils.getParameterByName('fakeParameter');
+
expect(value).toBe(null);
});
it('should return valid paramentes if URL is provided', () => {
let value = commonUtils.getParameterByName('foo', 'http://cocteau.twins/?foo=bar');
+
expect(value).toBe('bar');
value = commonUtils.getParameterByName('manan', 'http://cocteau.twins/?foo=bar&manan=canchu');
+
expect(value).toBe('canchu');
});
});
@@ -236,21 +264,24 @@ describe('common_utils', () => {
});
describe('normalizeCRLFHeaders', () => {
- beforeEach(function () {
- this.CLRFHeaders = 'a-header: a-value\nAnother-Header: ANOTHER-VALUE\nLaSt-HeAdEr: last-VALUE';
+ beforeEach(function() {
+ this.CLRFHeaders =
+ 'a-header: a-value\nAnother-Header: ANOTHER-VALUE\nLaSt-HeAdEr: last-VALUE';
spyOn(String.prototype, 'split').and.callThrough();
this.normalizeCRLFHeaders = commonUtils.normalizeCRLFHeaders(this.CLRFHeaders);
});
- it('should split by newline', function () {
+ it('should split by newline', function() {
expect(String.prototype.split).toHaveBeenCalledWith('\n');
});
- it('should split by colon+space for each header', function () {
- expect(String.prototype.split.calls.allArgs().filter(args => args[0] === ': ').length).toBe(3);
+ it('should split by colon+space for each header', function() {
+ expect(String.prototype.split.calls.allArgs().filter(args => args[0] === ': ').length).toBe(
+ 3,
+ );
});
- it('should return a normalized headers object', function () {
+ it('should return a normalized headers object', function() {
expect(this.normalizeCRLFHeaders).toEqual({
'A-HEADER': 'a-value',
'ANOTHER-HEADER': 'ANOTHER-VALUE',
@@ -329,66 +360,80 @@ describe('common_utils', () => {
spyOn(window, 'setTimeout').and.callFake(cb => origSetTimeout(cb, 0));
});
- it('solves the promise from the callback', (done) => {
+ it('solves the promise from the callback', done => {
const expectedResponseValue = 'Success!';
- commonUtils.backOff((next, stop) => (
- new Promise((resolve) => {
- resolve(expectedResponseValue);
- }).then((resp) => {
- stop(resp);
+ commonUtils
+ .backOff((next, stop) =>
+ new Promise(resolve => {
+ resolve(expectedResponseValue);
+ })
+ .then(resp => {
+ stop(resp);
+ })
+ .catch(done.fail),
+ )
+ .then(respBackoff => {
+ expect(respBackoff).toBe(expectedResponseValue);
+ done();
})
- )).then((respBackoff) => {
- expect(respBackoff).toBe(expectedResponseValue);
- done();
- });
+ .catch(done.fail);
});
- it('catches the rejected promise from the callback ', (done) => {
+ it('catches the rejected promise from the callback ', done => {
const errorMessage = 'Mistakes were made!';
- commonUtils.backOff((next, stop) => {
- new Promise((resolve, reject) => {
- reject(new Error(errorMessage));
- }).then((resp) => {
- stop(resp);
- }).catch(err => stop(err));
- }).catch((errBackoffResp) => {
- expect(errBackoffResp instanceof Error).toBe(true);
- expect(errBackoffResp.message).toBe(errorMessage);
- done();
- });
+ commonUtils
+ .backOff((next, stop) => {
+ new Promise((resolve, reject) => {
+ reject(new Error(errorMessage));
+ })
+ .then(resp => {
+ stop(resp);
+ })
+ .catch(err => stop(err));
+ })
+ .catch(errBackoffResp => {
+ expect(errBackoffResp instanceof Error).toBe(true);
+ expect(errBackoffResp.message).toBe(errorMessage);
+ done();
+ });
});
- it('solves the promise correctly after retrying a third time', (done) => {
+ it('solves the promise correctly after retrying a third time', done => {
let numberOfCalls = 1;
const expectedResponseValue = 'Success!';
- commonUtils.backOff((next, stop) => (
- Promise.resolve(expectedResponseValue)
- .then((resp) => {
- if (numberOfCalls < 3) {
- numberOfCalls += 1;
- next();
- } else {
- stop(resp);
- }
- })
- )).then((respBackoff) => {
+ commonUtils
+ .backOff((next, stop) =>
+ Promise.resolve(expectedResponseValue)
+ .then(resp => {
+ if (numberOfCalls < 3) {
+ numberOfCalls += 1;
+ next();
+ } else {
+ stop(resp);
+ }
+ })
+ .catch(done.fail),
+ )
+ .then(respBackoff => {
+ const timeouts = window.setTimeout.calls.allArgs().map(([, timeout]) => timeout);
+
+ expect(timeouts).toEqual([2000, 4000]);
+ expect(respBackoff).toBe(expectedResponseValue);
+ done();
+ })
+ .catch(done.fail);
+ });
+
+ it('rejects the backOff promise after timing out', done => {
+ commonUtils.backOff(next => next(), 64000).catch(errBackoffResp => {
const timeouts = window.setTimeout.calls.allArgs().map(([, timeout]) => timeout);
- expect(timeouts).toEqual([2000, 4000]);
- expect(respBackoff).toBe(expectedResponseValue);
+
+ expect(timeouts).toEqual([2000, 4000, 8000, 16000, 32000, 32000]);
+ expect(errBackoffResp instanceof Error).toBe(true);
+ expect(errBackoffResp.message).toBe('BACKOFF_TIMEOUT');
done();
});
});
-
- it('rejects the backOff promise after timing out', (done) => {
- commonUtils.backOff(next => next(), 64000)
- .catch((errBackoffResp) => {
- const timeouts = window.setTimeout.calls.allArgs().map(([, timeout]) => timeout);
- expect(timeouts).toEqual([2000, 4000, 8000, 16000, 32000, 32000]);
- expect(errBackoffResp instanceof Error).toBe(true);
- expect(errBackoffResp.message).toBe('BACKOFF_TIMEOUT');
- done();
- });
- });
});
describe('setFavicon', () => {
@@ -403,6 +448,7 @@ describe('common_utils', () => {
afterEach(() => {
document.body.removeChild(document.getElementById('favicon'));
});
+
it('should set page favicon to provided favicon', () => {
const faviconPath = '//custom_favicon';
commonUtils.setFavicon(faviconPath);
@@ -427,16 +473,20 @@ describe('common_utils', () => {
const favicon = document.getElementById('favicon');
favicon.setAttribute('href', 'new/favicon');
commonUtils.resetFavicon();
+
expect(document.getElementById('favicon').getAttribute('href')).toEqual('default/favicon');
});
});
describe('createOverlayIcon', () => {
- it('should return the favicon with the overlay', (done) => {
- commonUtils.createOverlayIcon(faviconDataUrl, overlayDataUrl).then((url) => {
- expect(url).toEqual(faviconWithOverlayDataUrl);
- done();
- });
+ it('should return the favicon with the overlay', done => {
+ commonUtils
+ .createOverlayIcon(faviconDataUrl, overlayDataUrl)
+ .then(url => {
+ expect(url).toEqual(faviconWithOverlayDataUrl);
+ done();
+ })
+ .catch(done.fail);
});
});
@@ -452,11 +502,16 @@ describe('common_utils', () => {
document.body.removeChild(document.getElementById('favicon'));
});
- it('should set page favicon to provided favicon overlay', (done) => {
- commonUtils.setFaviconOverlay(overlayDataUrl).then(() => {
- expect(document.getElementById('favicon').getAttribute('href')).toEqual(faviconWithOverlayDataUrl);
- done();
- });
+ it('should set page favicon to provided favicon overlay', done => {
+ commonUtils
+ .setFaviconOverlay(overlayDataUrl)
+ .then(() => {
+ expect(document.getElementById('favicon').getAttribute('href')).toEqual(
+ faviconWithOverlayDataUrl,
+ );
+ done();
+ })
+ .catch(done.fail);
});
});
@@ -478,28 +533,27 @@ describe('common_utils', () => {
document.body.removeChild(document.getElementById('favicon'));
});
- it('should reset favicon in case of error', (done) => {
- mock.onGet(BUILD_URL).networkError();
+ it('should reset favicon in case of error', done => {
+ mock.onGet(BUILD_URL).replyOnce(500);
- commonUtils.setCiStatusFavicon(BUILD_URL)
- .then(() => {
- const favicon = document.getElementById('favicon');
- expect(favicon.getAttribute('href')).toEqual(faviconDataUrl);
- done();
- })
- // Error is already caught in catch() block of setCiStatusFavicon,
- // It won't throw another error for us to catch
- .catch(done.fail);
+ commonUtils.setCiStatusFavicon(BUILD_URL).catch(() => {
+ const favicon = document.getElementById('favicon');
+
+ expect(favicon.getAttribute('href')).toEqual(faviconDataUrl);
+ done();
+ });
});
- it('should set page favicon to CI status favicon based on provided status', (done) => {
+ it('should set page favicon to CI status favicon based on provided status', done => {
mock.onGet(BUILD_URL).reply(200, {
favicon: overlayDataUrl,
});
- commonUtils.setCiStatusFavicon(BUILD_URL)
+ commonUtils
+ .setCiStatusFavicon(BUILD_URL)
.then(() => {
const favicon = document.getElementById('favicon');
+
expect(favicon.getAttribute('href')).toEqual(faviconWithOverlayDataUrl);
done();
})
@@ -521,11 +575,15 @@ describe('common_utils', () => {
});
it('should return the svg for a linked icon', () => {
- expect(commonUtils.spriteIcon('test')).toEqual('<svg ><use xlink:href="icons.svg#test" /></svg>');
+ expect(commonUtils.spriteIcon('test')).toEqual(
+ '<svg ><use xlink:href="icons.svg#test" /></svg>',
+ );
});
it('should set svg className when passed', () => {
- expect(commonUtils.spriteIcon('test', 'fa fa-test')).toEqual('<svg class="fa fa-test"><use xlink:href="icons.svg#test" /></svg>');
+ expect(commonUtils.spriteIcon('test', 'fa fa-test')).toEqual(
+ '<svg class="fa fa-test"><use xlink:href="icons.svg#test" /></svg>',
+ );
});
});
@@ -545,7 +603,7 @@ describe('common_utils', () => {
const convertedObj = commonUtils.convertObjectPropsToCamelCase(mockObj);
- Object.keys(convertedObj).forEach((prop) => {
+ Object.keys(convertedObj).forEach(prop => {
expect(snakeRegEx.test(prop)).toBeFalsy();
expect(convertedObj[prop]).toBe(mockObj[mappings[prop]]);
});
@@ -564,9 +622,7 @@ describe('common_utils', () => {
},
};
- expect(
- commonUtils.convertObjectPropsToCamelCase(obj),
- ).toEqual({
+ expect(commonUtils.convertObjectPropsToCamelCase(obj)).toEqual({
snakeKey: {
child_snake_key: 'value',
},
@@ -581,9 +637,7 @@ describe('common_utils', () => {
},
};
- expect(
- commonUtils.convertObjectPropsToCamelCase(obj, { deep: true }),
- ).toEqual({
+ expect(commonUtils.convertObjectPropsToCamelCase(obj, { deep: true })).toEqual({
snakeKey: {
childSnakeKey: 'value',
},
@@ -597,9 +651,7 @@ describe('common_utils', () => {
},
];
- expect(
- commonUtils.convertObjectPropsToCamelCase(arr, { deep: true }),
- ).toEqual([
+ expect(commonUtils.convertObjectPropsToCamelCase(arr, { deep: true })).toEqual([
{
childSnakeKey: 'value',
},
@@ -615,9 +667,7 @@ describe('common_utils', () => {
],
];
- expect(
- commonUtils.convertObjectPropsToCamelCase(arr, { deep: true }),
- ).toEqual([
+ expect(commonUtils.convertObjectPropsToCamelCase(arr, { deep: true })).toEqual([
[
{
childSnakeKey: 'value',
diff --git a/spec/javascripts/lib/utils/csrf_token_spec.js b/spec/javascripts/lib/utils/csrf_token_spec.js
index 81a39a97a84..867bee34ee5 100644
--- a/spec/javascripts/lib/utils/csrf_token_spec.js
+++ b/spec/javascripts/lib/utils/csrf_token_spec.js
@@ -1,9 +1,10 @@
import csrf from '~/lib/utils/csrf';
-describe('csrf', function () {
+describe('csrf', function() {
beforeEach(() => {
this.tokenKey = 'X-CSRF-Token';
- this.token = 'pH1cvjnP9grx2oKlhWEDvUZnJ8x2eXsIs1qzyHkF3DugSG5yTxR76CWeEZRhML2D1IeVB7NEW0t5l/axE4iJpQ==';
+ this.token =
+ 'pH1cvjnP9grx2oKlhWEDvUZnJ8x2eXsIs1qzyHkF3DugSG5yTxR76CWeEZRhML2D1IeVB7NEW0t5l/axE4iJpQ==';
});
it('returns the correct headerKey', () => {
diff --git a/spec/javascripts/lib/utils/datefix_spec.js b/spec/javascripts/lib/utils/datefix_spec.js
deleted file mode 100644
index a9f3abcf2a4..00000000000
--- a/spec/javascripts/lib/utils/datefix_spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { pad, pikadayToString } from '~/lib/utils/datefix';
-
-describe('datefix', () => {
- describe('pad', () => {
- it('should add a 0 when length is smaller than 2', () => {
- expect(pad(2)).toEqual('02');
- });
-
- it('should not add a zero when lenght matches the default', () => {
- expect(pad(12)).toEqual('12');
- });
-
- it('should add a 0 when lenght is smaller than the provided', () => {
- expect(pad(12, 3)).toEqual('012');
- });
- });
-
- describe('parsePikadayDate', () => {
- // removed because of https://gitlab.com/gitlab-org/gitlab-ce/issues/39834
- });
-
- describe('pikadayToString', () => {
- it('should format a UTC date into yyyy-mm-dd format', () => {
- expect(pikadayToString(new Date('2020-01-29:00:00'))).toEqual('2020-01-29');
- });
- });
-});
diff --git a/spec/javascripts/lib/utils/datetime_utility_spec.js b/spec/javascripts/lib/utils/datetime_utility_spec.js
new file mode 100644
index 00000000000..bebe76f76c5
--- /dev/null
+++ b/spec/javascripts/lib/utils/datetime_utility_spec.js
@@ -0,0 +1,378 @@
+import * as datetimeUtility from '~/lib/utils/datetime_utility';
+
+describe('Date time utils', () => {
+ describe('timeFor', () => {
+ it('returns `past due` when in past', () => {
+ const date = new Date();
+ date.setFullYear(date.getFullYear() - 1);
+
+ expect(datetimeUtility.timeFor(date)).toBe('Past due');
+ });
+
+ it('returns remaining time when in the future', () => {
+ const date = new Date();
+ date.setFullYear(date.getFullYear() + 1);
+
+ // Add a day to prevent a transient error. If date is even 1 second
+ // short of a full year, timeFor will return '11 months remaining'
+ date.setDate(date.getDate() + 1);
+
+ expect(datetimeUtility.timeFor(date)).toBe('1 year remaining');
+ });
+ });
+
+ describe('get day name', () => {
+ it('should return Sunday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/17/2016'));
+
+ expect(day).toBe('Sunday');
+ });
+
+ it('should return Monday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/18/2016'));
+
+ expect(day).toBe('Monday');
+ });
+
+ it('should return Tuesday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/19/2016'));
+
+ expect(day).toBe('Tuesday');
+ });
+
+ it('should return Wednesday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/20/2016'));
+
+ expect(day).toBe('Wednesday');
+ });
+
+ it('should return Thursday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/21/2016'));
+
+ expect(day).toBe('Thursday');
+ });
+
+ it('should return Friday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/22/2016'));
+
+ expect(day).toBe('Friday');
+ });
+
+ it('should return Saturday', () => {
+ const day = datetimeUtility.getDayName(new Date('07/23/2016'));
+
+ expect(day).toBe('Saturday');
+ });
+ });
+
+ describe('get day difference', () => {
+ it('should return 7', () => {
+ const firstDay = new Date('07/01/2016');
+ const secondDay = new Date('07/08/2016');
+ const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
+
+ expect(difference).toBe(7);
+ });
+
+ it('should return 31', () => {
+ const firstDay = new Date('07/01/2016');
+ const secondDay = new Date('08/01/2016');
+ const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
+
+ expect(difference).toBe(31);
+ });
+
+ it('should return 365', () => {
+ const firstDay = new Date('07/02/2015');
+ const secondDay = new Date('07/01/2016');
+ const difference = datetimeUtility.getDayDifference(firstDay, secondDay);
+
+ expect(difference).toBe(365);
+ });
+ });
+});
+
+describe('timeIntervalInWords', () => {
+ it('should return string with number of minutes and seconds', () => {
+ expect(datetimeUtility.timeIntervalInWords(9.54)).toEqual('9 seconds');
+ expect(datetimeUtility.timeIntervalInWords(1)).toEqual('1 second');
+ expect(datetimeUtility.timeIntervalInWords(200)).toEqual('3 minutes 20 seconds');
+ expect(datetimeUtility.timeIntervalInWords(6008)).toEqual('100 minutes 8 seconds');
+ });
+});
+
+describe('dateInWords', () => {
+ const date = new Date('07/01/2016');
+
+ it('should return date in words', () => {
+ expect(datetimeUtility.dateInWords(date)).toEqual('July 1, 2016');
+ });
+
+ it('should return abbreviated month name', () => {
+ expect(datetimeUtility.dateInWords(date, true)).toEqual('Jul 1, 2016');
+ });
+
+ it('should return date in words without year', () => {
+ expect(datetimeUtility.dateInWords(date, true, true)).toEqual('Jul 1');
+ });
+});
+
+describe('monthInWords', () => {
+ const date = new Date('2017-01-20');
+
+ it('returns month name from provided date', () => {
+ expect(datetimeUtility.monthInWords(date)).toBe('January');
+ });
+
+ it('returns abbreviated month name from provided date', () => {
+ expect(datetimeUtility.monthInWords(date, true)).toBe('Jan');
+ });
+});
+
+describe('totalDaysInMonth', () => {
+ it('returns number of days in a month for given date', () => {
+ // 1st Feb, 2016 (leap year)
+ expect(datetimeUtility.totalDaysInMonth(new Date(2016, 1, 1))).toBe(29);
+
+ // 1st Feb, 2017
+ expect(datetimeUtility.totalDaysInMonth(new Date(2017, 1, 1))).toBe(28);
+
+ // 1st Jan, 2017
+ expect(datetimeUtility.totalDaysInMonth(new Date(2017, 0, 1))).toBe(31);
+ });
+});
+
+describe('getSundays', () => {
+ it('returns array of dates representing all Sundays of the month', () => {
+ // December, 2017 (it has 5 Sundays)
+ const dateOfSundays = [3, 10, 17, 24, 31];
+ const sundays = datetimeUtility.getSundays(new Date(2017, 11, 1));
+
+ expect(sundays.length).toBe(5);
+ sundays.forEach((sunday, index) => {
+ expect(sunday.getDate()).toBe(dateOfSundays[index]);
+ });
+ });
+});
+
+describe('getTimeframeWindowFrom', () => {
+ it('returns array of date objects upto provided length start with provided startDate', () => {
+ const startDate = new Date(2018, 0, 1);
+ const mockTimeframe = [
+ new Date(2018, 0, 1),
+ new Date(2018, 1, 1),
+ new Date(2018, 2, 1),
+ new Date(2018, 3, 1),
+ new Date(2018, 4, 31),
+ ];
+ const timeframe = datetimeUtility.getTimeframeWindowFrom(startDate, 5);
+
+ expect(timeframe.length).toBe(5);
+ timeframe.forEach((timeframeItem, index) => {
+ expect(timeframeItem.getFullYear()).toBe(mockTimeframe[index].getFullYear());
+ expect(timeframeItem.getMonth()).toBe(mockTimeframe[index].getMonth());
+ expect(timeframeItem.getDate()).toBe(mockTimeframe[index].getDate());
+ });
+ });
+});
+
+describe('formatTime', () => {
+ const expectedTimestamps = [
+ [0, '00:00:00'],
+ [1000, '00:00:01'],
+ [42000, '00:00:42'],
+ [121000, '00:02:01'],
+ [10921000, '03:02:01'],
+ [108000000, '30:00:00'],
+ ];
+
+ expectedTimestamps.forEach(([milliseconds, expectedTimestamp]) => {
+ it(`formats ${milliseconds}ms as ${expectedTimestamp}`, () => {
+ expect(datetimeUtility.formatTime(milliseconds)).toBe(expectedTimestamp);
+ });
+ });
+});
+
+describe('datefix', () => {
+ describe('pad', () => {
+ it('should add a 0 when length is smaller than 2', () => {
+ expect(datetimeUtility.pad(2)).toEqual('02');
+ });
+
+ it('should not add a zero when length matches the default', () => {
+ expect(datetimeUtility.pad(12)).toEqual('12');
+ });
+
+ it('should add a 0 when length is smaller than the provided', () => {
+ expect(datetimeUtility.pad(12, 3)).toEqual('012');
+ });
+ });
+
+ describe('parsePikadayDate', () => {
+ // removed because of https://gitlab.com/gitlab-org/gitlab-ce/issues/39834
+ });
+
+ describe('pikadayToString', () => {
+ it('should format a UTC date into yyyy-mm-dd format', () => {
+ expect(datetimeUtility.pikadayToString(new Date('2020-01-29:00:00'))).toEqual('2020-01-29');
+ });
+ });
+});
+
+describe('prettyTime methods', () => {
+ const assertTimeUnits = (obj, minutes, hours, days, weeks) => {
+ expect(obj.minutes).toBe(minutes);
+ expect(obj.hours).toBe(hours);
+ expect(obj.days).toBe(days);
+ expect(obj.weeks).toBe(weeks);
+ };
+
+ describe('parseSeconds', () => {
+ it('should correctly parse a negative value', () => {
+ const zeroSeconds = datetimeUtility.parseSeconds(-1000);
+
+ assertTimeUnits(zeroSeconds, 16, 0, 0, 0);
+ });
+
+ it('should correctly parse a zero value', () => {
+ const zeroSeconds = datetimeUtility.parseSeconds(0);
+
+ assertTimeUnits(zeroSeconds, 0, 0, 0, 0);
+ });
+
+ it('should correctly parse a small non-zero second values', () => {
+ const subOneMinute = datetimeUtility.parseSeconds(10);
+ const aboveOneMinute = datetimeUtility.parseSeconds(100);
+ const manyMinutes = datetimeUtility.parseSeconds(1000);
+
+ assertTimeUnits(subOneMinute, 0, 0, 0, 0);
+ assertTimeUnits(aboveOneMinute, 1, 0, 0, 0);
+ assertTimeUnits(manyMinutes, 16, 0, 0, 0);
+ });
+
+ it('should correctly parse large second values', () => {
+ const aboveOneHour = datetimeUtility.parseSeconds(4800);
+ const aboveOneDay = datetimeUtility.parseSeconds(110000);
+ const aboveOneWeek = datetimeUtility.parseSeconds(25000000);
+
+ assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
+ assertTimeUnits(aboveOneDay, 33, 6, 3, 0);
+ assertTimeUnits(aboveOneWeek, 26, 0, 3, 173);
+ });
+
+ it('should correctly accept a custom param for hoursPerDay', () => {
+ const config = { hoursPerDay: 24 };
+
+ const aboveOneHour = datetimeUtility.parseSeconds(4800, config);
+ const aboveOneDay = datetimeUtility.parseSeconds(110000, config);
+ const aboveOneWeek = datetimeUtility.parseSeconds(25000000, config);
+
+ assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
+ assertTimeUnits(aboveOneDay, 33, 6, 1, 0);
+ assertTimeUnits(aboveOneWeek, 26, 8, 4, 57);
+ });
+
+ it('should correctly accept a custom param for daysPerWeek', () => {
+ const config = { daysPerWeek: 7 };
+
+ const aboveOneHour = datetimeUtility.parseSeconds(4800, config);
+ const aboveOneDay = datetimeUtility.parseSeconds(110000, config);
+ const aboveOneWeek = datetimeUtility.parseSeconds(25000000, config);
+
+ assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
+ assertTimeUnits(aboveOneDay, 33, 6, 3, 0);
+ assertTimeUnits(aboveOneWeek, 26, 0, 0, 124);
+ });
+
+ it('should correctly accept custom params for daysPerWeek and hoursPerDay', () => {
+ const config = { daysPerWeek: 55, hoursPerDay: 14 };
+
+ const aboveOneHour = datetimeUtility.parseSeconds(4800, config);
+ const aboveOneDay = datetimeUtility.parseSeconds(110000, config);
+ const aboveOneWeek = datetimeUtility.parseSeconds(25000000, config);
+
+ assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
+ assertTimeUnits(aboveOneDay, 33, 2, 2, 0);
+ assertTimeUnits(aboveOneWeek, 26, 0, 1, 9);
+ });
+ });
+
+ describe('stringifyTime', () => {
+ it('should stringify values with all non-zero units', () => {
+ const timeObject = {
+ weeks: 1,
+ days: 4,
+ hours: 7,
+ minutes: 20,
+ };
+
+ const timeString = datetimeUtility.stringifyTime(timeObject);
+
+ expect(timeString).toBe('1w 4d 7h 20m');
+ });
+
+ it('should stringify values with some non-zero units', () => {
+ const timeObject = {
+ weeks: 0,
+ days: 4,
+ hours: 0,
+ minutes: 20,
+ };
+
+ const timeString = datetimeUtility.stringifyTime(timeObject);
+
+ expect(timeString).toBe('4d 20m');
+ });
+
+ it('should stringify values with no non-zero units', () => {
+ const timeObject = {
+ weeks: 0,
+ days: 0,
+ hours: 0,
+ minutes: 0,
+ };
+
+ const timeString = datetimeUtility.stringifyTime(timeObject);
+
+ expect(timeString).toBe('0m');
+ });
+
+ it('should return non-condensed representation of time object', () => {
+ const timeObject = { weeks: 1, days: 0, hours: 1, minutes: 0 };
+
+ expect(datetimeUtility.stringifyTime(timeObject, true)).toEqual('1 week 1 hour');
+ });
+ });
+
+ describe('abbreviateTime', () => {
+ it('should abbreviate stringified times for weeks', () => {
+ const fullTimeString = '1w 3d 4h 5m';
+
+ expect(datetimeUtility.abbreviateTime(fullTimeString)).toBe('1w');
+ });
+
+ it('should abbreviate stringified times for non-weeks', () => {
+ const fullTimeString = '0w 3d 4h 5m';
+
+ expect(datetimeUtility.abbreviateTime(fullTimeString)).toBe('3d');
+ });
+ });
+});
+
+describe('calculateRemainingMilliseconds', () => {
+ beforeEach(() => {
+ spyOn(Date, 'now').and.callFake(() => new Date('2063-04-04T00:42:00Z').getTime());
+ });
+
+ it('calculates the remaining time for a given end date', () => {
+ const milliseconds = datetimeUtility.calculateRemainingMilliseconds('2063-04-04T01:44:03Z');
+
+ expect(milliseconds).toBe(3723000);
+ });
+
+ it('returns 0 if the end date has passed', () => {
+ const milliseconds = datetimeUtility.calculateRemainingMilliseconds('2063-04-03T00:00:00Z');
+
+ expect(milliseconds).toBe(0);
+ });
+});
diff --git a/spec/javascripts/lib/utils/dom_utils_spec.js b/spec/javascripts/lib/utils/dom_utils_spec.js
index 867bf5912d1..1fb2e4584a0 100644
--- a/spec/javascripts/lib/utils/dom_utils_spec.js
+++ b/spec/javascripts/lib/utils/dom_utils_spec.js
@@ -18,6 +18,7 @@ describe('DOM Utils', () => {
it('adds class if element exists', () => {
const childElement = parentElement.querySelector('.child');
+
expect(childElement).not.toBe(null);
addClassIfElementExists(childElement, className);
@@ -27,6 +28,7 @@ describe('DOM Utils', () => {
it('does not throw if element does not exist', () => {
const childElement = parentElement.querySelector('.other-child');
+
expect(childElement).toBe(null);
addClassIfElementExists(childElement, className);
diff --git a/spec/javascripts/lib/utils/mock_data.js b/spec/javascripts/lib/utils/mock_data.js
index fd0d62b751f..c466b0cd1ed 100644
--- a/spec/javascripts/lib/utils/mock_data.js
+++ b/spec/javascripts/lib/utils/mock_data.js
@@ -1,5 +1,8 @@
-export const faviconDataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACcFBMVEX////iQyniQyniQyniQyniQyniQyniQyniQynhRiriQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniRCniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQynhQiniQiniQiniQinhQinpUSjqUSjqTyjqTyjqTyjlSCniRCniQynjRCjqTyjsZSjrWyj8oib9kSb8pyb9pib8oyb8fyb3ZSb4Zib8fCb8oyb8oyb8oyb8pCb8cSbiQyn7bCb8cib8oyb8oSb8bSbtVSjpTij8nyb8oyb8oyb8lCb2Yyf3ZCf8mCb8oyb8oyb8oyb8iib8bSbiRCn8gyb8oyb8eCbpTinrUSj8oyb8oyb8oyb8pSb8bib4Zif0YCf8byb8oyb8oyb8oyb7oib8oyb8nCbjRSn9bib8ayb8nib8oyb8oyb8oyb8kSbpTyjpTyj8jib8oyb8oyb8oyb8fib0Xyf2ZSb8gCb8oyb6pSb8oyb8dib+cCbgQCnjRSn8cCb8oib8oyb8oyb8oybqUCjnSyn8bCb8oyb8oyb8oyb8myb2YyfyXyf8oyb8oyb8hibhQSn+bib8iSb8oyb8qCb+fSbmSSnqTyj8oib9pCb1YifxXyf7pSb8oCb8pCb+mCb0fCf8pSb7hSXvcSjiQyniQinqTyj9kCb9bib9byb+cCbqUSjiRCnsVCj+cSb8pib8bCb8bSbgQCn7bCb8bibjRSn8oyb8ayb8oib8aib8pCbjRCn8pybhQinhQSn8pSb7ayb7aSb6aib8eib///8IbM+7AAAAr3RSTlMBA3NtX2vT698HGQcRLwWLiXnv++3V+eEd/R8HE2V/Y5HjyefdFw99YWfJ+/3nwQP78/HvX1VTQ/kdA2HzbQXj9fX79/3DGf379/33T/v99/f7ba33+/f1+9/18/v59V339flzF/H9+fX3/fMhBwOh9/v5/fmvBV/z+fP3Awnp9/f38+UFgff7+/37+4c77/f7/flFz/f59dFr7/v98Wnr+/f3I5/197EDBU1ZAwUD8/kLUwAAAAFiS0dEAIgFHUgAAAAHdElNRQfhBQoLHiBV6/1lAAACHUlEQVQ4y41TZXsTQRCe4FAIUigN7m7FXY+iLRQKBG2x4g7BjhZ3Le7uMoEkFJprwyQk0CC/iZnNhUZaHt4vt6/szO7cHcD/wFKjZrJWq3YMq1M3eVc9rFzXR2yQkuA3RGxkjZLGiEk9miA2tURJs1RsnhhokYYtzaU13WZDbBVnW1sjo43J2vI6tZ0lLtFeAh1M0lECneI7dGYtrUtk3RUVIKaEJR25qw27yT0s3W0qEHuPlB4RradivXo7GX36xnbo51SQ+fWHARmCgYMGDxkaxbD3SssYPmIkwKgPLrfA87EETTg/fVaSa/SYsQDjSsd7DcGEsr+BieVKmaRNBsjUtClTfUI900y/5Mt05c8oJQKYSURZ2UqYFa0w283M588JEM2BuRwI5EqT8nmmXzZf4l8XsGNfCIv4QcHFklhiBpaqAsuC4tghj+ySyOdjeJYrP7RCCuR/E5tWAqxaLcmCNSyujdxjHZdbn8UHoA0bN/GoNm8hjQJb/ZzYpo6w3TB27JRduxxqrA7YzbWCezixN8RD2Oc2/Ptlfx7o5uT1A4XMiwzj4HfEikNe7+Ew0ZGjeuW70eEYaeHjxomTiKd++E4XnKGz8d+HDufOB3Ky3RcwdNF1qZiKLyf/B44r2tWf15wV143cwI2qfi8dbtKtX6Hbd+6G74EDqkTm/QcPH/0ufFyNLXjy9NnzF9Xb8BJevYY38C+8fZcg/AF3QTYemVkCwwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wNS0xMFQxMTozMDozMiswMjowMMzup8UAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMTBUMTE6MzA6MzIrMDI6MDC9sx95AAAAAElFTkSuQmCC';
+export const faviconDataUrl =
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACcFBMVEX////iQyniQyniQyniQyniQyniQyniQyniQynhRiriQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniRCniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQyniQynhQiniQiniQiniQinhQinpUSjqUSjqTyjqTyjqTyjlSCniRCniQynjRCjqTyjsZSjrWyj8oib9kSb8pyb9pib8oyb8fyb3ZSb4Zib8fCb8oyb8oyb8oyb8pCb8cSbiQyn7bCb8cib8oyb8oSb8bSbtVSjpTij8nyb8oyb8oyb8lCb2Yyf3ZCf8mCb8oyb8oyb8oyb8iib8bSbiRCn8gyb8oyb8eCbpTinrUSj8oyb8oyb8oyb8pSb8bib4Zif0YCf8byb8oyb8oyb8oyb7oib8oyb8nCbjRSn9bib8ayb8nib8oyb8oyb8oyb8kSbpTyjpTyj8jib8oyb8oyb8oyb8fib0Xyf2ZSb8gCb8oyb6pSb8oyb8dib+cCbgQCnjRSn8cCb8oib8oyb8oyb8oybqUCjnSyn8bCb8oyb8oyb8oyb8myb2YyfyXyf8oyb8oyb8hibhQSn+bib8iSb8oyb8qCb+fSbmSSnqTyj8oib9pCb1YifxXyf7pSb8oCb8pCb+mCb0fCf8pSb7hSXvcSjiQyniQinqTyj9kCb9bib9byb+cCbqUSjiRCnsVCj+cSb8pib8bCb8bSbgQCn7bCb8bibjRSn8oyb8ayb8oib8aib8pCbjRCn8pybhQinhQSn8pSb7ayb7aSb6aib8eib///8IbM+7AAAAr3RSTlMBA3NtX2vT698HGQcRLwWLiXnv++3V+eEd/R8HE2V/Y5HjyefdFw99YWfJ+/3nwQP78/HvX1VTQ/kdA2HzbQXj9fX79/3DGf379/33T/v99/f7ba33+/f1+9/18/v59V339flzF/H9+fX3/fMhBwOh9/v5/fmvBV/z+fP3Awnp9/f38+UFgff7+/37+4c77/f7/flFz/f59dFr7/v98Wnr+/f3I5/197EDBU1ZAwUD8/kLUwAAAAFiS0dEAIgFHUgAAAAHdElNRQfhBQoLHiBV6/1lAAACHUlEQVQ4y41TZXsTQRCe4FAIUigN7m7FXY+iLRQKBG2x4g7BjhZ3Le7uMoEkFJprwyQk0CC/iZnNhUZaHt4vt6/szO7cHcD/wFKjZrJWq3YMq1M3eVc9rFzXR2yQkuA3RGxkjZLGiEk9miA2tURJs1RsnhhokYYtzaU13WZDbBVnW1sjo43J2vI6tZ0lLtFeAh1M0lECneI7dGYtrUtk3RUVIKaEJR25qw27yT0s3W0qEHuPlB4RradivXo7GX36xnbo51SQ+fWHARmCgYMGDxkaxbD3SssYPmIkwKgPLrfA87EETTg/fVaSa/SYsQDjSsd7DcGEsr+BieVKmaRNBsjUtClTfUI900y/5Mt05c8oJQKYSURZ2UqYFa0w283M588JEM2BuRwI5EqT8nmmXzZf4l8XsGNfCIv4QcHFklhiBpaqAsuC4tghj+ySyOdjeJYrP7RCCuR/E5tWAqxaLcmCNSyujdxjHZdbn8UHoA0bN/GoNm8hjQJb/ZzYpo6w3TB27JRduxxqrA7YzbWCezixN8RD2Oc2/Ptlfx7o5uT1A4XMiwzj4HfEikNe7+Ew0ZGjeuW70eEYaeHjxomTiKd++E4XnKGz8d+HDufOB3Ky3RcwdNF1qZiKLyf/B44r2tWf15wV143cwI2qfi8dbtKtX6Hbd+6G74EDqkTm/QcPH/0ufFyNLXjy9NnzF9Xb8BJevYY38C+8fZcg/AF3QTYemVkCwwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wNS0xMFQxMTozMDozMiswMjowMMzup8UAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMTBUMTE6MzA6MzIrMDI6MDC9sx95AAAAAElFTkSuQmCC';
-export const overlayDataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA85JREFUWAntVllIVGEUPv/9b46O41KplYN7PeRkti8TjQlhCUGh3MmeQugpIsGKAi2soIcIooiohxYKK2daqDAlIpIiWwxtQaJcaHE0d5tMrbn37z9XRqfR0TvVW56Hudf//uec72zfEWBCJjIwkYGJDPzvGSD/KgExN3Oi2Q+2DJgSDYQEMwItVGH1iZGmJw/Si1y+/PwVAMYYib22MYc/8hVQFgKDEfYoId0KYzagAQebsos/ewMZoeB9wdffcTYpQSaCTWHKoqSQaDk7zkIt0+aCUR8BelEHrf3dUNv9AcqbnsHtT5UKB/hTASh0SLYjnjb/CIDRJi0XiFAaJOpCD8zLpdb4NB66b1OfelthX815dtdRRfiti2aAXLvVLiMQ6olGyztGDkSo4JGGXk8/QFdGpYzpHG2GBQTDhtgVhPEaVbbVpvI6GJz22rv4TcAfrYI1x7Rj5MWWAppomKFVVb2302SFzUkZHAbkG+0b1+Gh77yNYjrmqnWTrLBLRxdvBWv8qlFujH/kYjJYyvLkj71t78zAUvzMAMnHhpN4zf9UREJhd8omyssxu1IgazQDwDnHUcNuH6vhPIE1fmuBzHt74Hn7W89jWGtcAjoaIDOFrdcMYJBkgOCoaRF0Lj0oglddDbCj6tRvKjphEpgjkzEQs2YAKsNxMzjn3nKurhzK+Ly7xe28ua8TwgMMcHJZnvvT0BPtEEKM4tDJ+C8GvIIk4ylINIXVZ0EUKJxYuh3mhCeokbudl6TtVc88dfBdLwbyaWB6zQCYQJpBYSrDGQxBQ/ZWRM2B+VNmQnVnHWx7elyNuL2/R336co7KyJR8CL9oLgEuFlREevWUkEl6uGwpVEG4FBm0OEf9N10NMgPlvWYAuNVwsWDKvcUNYsHUWTCZ13ysyFEXe6TO6aC8CUr9IiK+A05TQrc8yjwmxARHeeMAPlfQJw+AQRwu0YhL/GDXi9NwufG+S8dYkuYMqIb4SsWthotlNMOUCOM6r+G9cqXxPmd1dqrBav/o1zJy2l5/NUjJA/VORwYuFnOUaTQcPs9wMqwV++Xv8oADxKAcZ8nLPr8AoGW+xR6HSqYk3GodAz2QNj0V+Gr26dT9ASNH5239Pf0gktVNWZca8ZvfAFBprWS6hSu1pqt++Y0PD+WIwDAhIWQGtzvSHDbcodfFUFB9hg1Gjs5LXqIdFL+acFBl+FddqYwdxsWC3I70OvgfUaA65zhq2O2c8VxYcyIGFTVlXegYtvCXANCQZJMobjVcLMjtSK/IcEgyOOe8Ve5w7ryKDefp2P3+C/5ohv8HZmVLAAAAAElFTkSuQmCC';
+export const overlayDataUrl =
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA85JREFUWAntVllIVGEUPv/9b46O41KplYN7PeRkti8TjQlhCUGh3MmeQugpIsGKAi2soIcIooiohxYKK2daqDAlIpIiWwxtQaJcaHE0d5tMrbn37z9XRqfR0TvVW56Hudf//uec72zfEWBCJjIwkYGJDPzvGSD/KgExN3Oi2Q+2DJgSDYQEMwItVGH1iZGmJw/Si1y+/PwVAMYYib22MYc/8hVQFgKDEfYoId0KYzagAQebsos/ewMZoeB9wdffcTYpQSaCTWHKoqSQaDk7zkIt0+aCUR8BelEHrf3dUNv9AcqbnsHtT5UKB/hTASh0SLYjnjb/CIDRJi0XiFAaJOpCD8zLpdb4NB66b1OfelthX815dtdRRfiti2aAXLvVLiMQ6olGyztGDkSo4JGGXk8/QFdGpYzpHG2GBQTDhtgVhPEaVbbVpvI6GJz22rv4TcAfrYI1x7Rj5MWWAppomKFVVb2302SFzUkZHAbkG+0b1+Gh77yNYjrmqnWTrLBLRxdvBWv8qlFujH/kYjJYyvLkj71t78zAUvzMAMnHhpN4zf9UREJhd8omyssxu1IgazQDwDnHUcNuH6vhPIE1fmuBzHt74Hn7W89jWGtcAjoaIDOFrdcMYJBkgOCoaRF0Lj0oglddDbCj6tRvKjphEpgjkzEQs2YAKsNxMzjn3nKurhzK+Ly7xe28ua8TwgMMcHJZnvvT0BPtEEKM4tDJ+C8GvIIk4ylINIXVZ0EUKJxYuh3mhCeokbudl6TtVc88dfBdLwbyaWB6zQCYQJpBYSrDGQxBQ/ZWRM2B+VNmQnVnHWx7elyNuL2/R336co7KyJR8CL9oLgEuFlREevWUkEl6uGwpVEG4FBm0OEf9N10NMgPlvWYAuNVwsWDKvcUNYsHUWTCZ13ysyFEXe6TO6aC8CUr9IiK+A05TQrc8yjwmxARHeeMAPlfQJw+AQRwu0YhL/GDXi9NwufG+S8dYkuYMqIb4SsWthotlNMOUCOM6r+G9cqXxPmd1dqrBav/o1zJy2l5/NUjJA/VORwYuFnOUaTQcPs9wMqwV++Xv8oADxKAcZ8nLPr8AoGW+xR6HSqYk3GodAz2QNj0V+Gr26dT9ASNH5239Pf0gktVNWZca8ZvfAFBprWS6hSu1pqt++Y0PD+WIwDAhIWQGtzvSHDbcodfFUFB9hg1Gjs5LXqIdFL+acFBl+FddqYwdxsWC3I70OvgfUaA65zhq2O2c8VxYcyIGFTVlXegYtvCXANCQZJMobjVcLMjtSK/IcEgyOOe8Ve5w7ryKDefp2P3+C/5ohv8HZmVLAAAAAElFTkSuQmCC';
-export const faviconWithOverlayDataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGt0lEQVRYR8WWf3DT5R3H35/vN0lDiCztSuiPAEnTFhSOUamIzFGokwMH55g0E845yjbP6+4qIoiHY6JjnHLeRI6h9jgQpQcD3ImH2u00eHBwjGthKLI1TSm26S8oKYVS0vT7/X52z7ckTUhqC/yx55/kks/zeb+ez6/nIWYm/B8XJQB4SGq6lL+CJA47vvRtvWs2D0nNl/Kf0qBZxx6u23arv0QAAIHivK8BynB4ffa7BgDQXJx/ngGnw+uThgTwP5ZnMocoJAxVxZDVZ+0L5n5WF75TkMafjLdJxpSg2E+gqW1X7zk3rbpaifhLiEBgTv4mEFbpBoTyu01DoDj/dQAv9rvjtdnp/k3Yx9rgAMV5QYCsAAwAgg6vL/1OTy/2BYrzzwLIBWACuNHhrXPG+otGoKaw0JA58kqGJtOFfgPS8yWT4sz88nzj7UIIfz+wd0mRdEZPLMnp2V/8R0+JrhLbBYFHJvwWzBUxYgqYNzhG+zfEhm24MIE5ectBtP0W+y0Or29FcoDifHFSRxwAcMrh9c0YrmisXaA4r0V0U8xvopgDDq9PpCQ+Ag0/zbEbNUNbMiG9fTwkDTsKHpJa2t1Zmiw1AqLg+tMZ+R6WVVtnZ2qP6Ib+FIjh05G3lsDrB4xjUIbRDeM+WZLJYZ4B1rKMzKPm/fdyzs9qg6WT225IMnPcuYjxbPZhn57qaA00zc4/QYT7b1b/wAZmDYSLjsN1WcmiM+6jXz7JTCs1aNPASBjrtrCGOXVBLK9ph72772bc0REZcsQlkEVoOxblhaFBH0Bxi6GBWFNC8gpV0XqYSe/hI85R9o1zxr/QaZbdbmuW9oRzljRrzBRkW9JhMaTgYugKzl35DlXNJ/Fp43FImoZnz7T0ln7bLihM0g85N627vkWPgLrbvYyCvAP1+rRIWETA5QsyQlcJYOCbMRasWpALtljwSsFyeJxFYsoNWqdN1y/ildM78Y/WGjxx8TL+ol3oluy8VupKe7cfoNLdCJkdqEUPOmBJ5ksJoae91mBps5lQ6pkIm20MPiz6A3KsmcNukDe/3Ye3zh3A77Q2XqcGjslLz88i/nB8pkpSoL8nAFSTBpUN4qSxS5KB5jOGUOniCebmzFQcevSN2xKP+Fp7ajt21f8TOxU/5i45JZFS6XwcTB9HxZgUnGTRNgk31x5jet+aGU7jWw+UweOcPeyTxxoqrGL25+UwdjehSvnmOVIqcz4C8y8GAABcQwjnYI5NheikhQWT+EZmDh2ev/l7cz4U2cGmYyg78TYqVH87Kbtd1wFY4hsVQAt14zu2RiDaTUZMf/BHWD35STx37wDv94k1dLeh7MRmvDZ1GR5Inxg17dX6MPnjZfh5X6tGSqXrV2B8ACIx98UNGOlV4CxCuA6zqIeq9FQ8c68bhx7ZiIK06CQdVF+Il3y1Hq03gnDfk4Uj8zbH2T51dCPOtlW39Q+iPTl2VSMfwKPiKw8aTuhgpl1Zdqxzj8PphRWwm21xZjv9VcgYkYb52dP132PFbSYr/la0DpNtrrg9a2oqsKfB2zlwG+4nSe1z7QDjaQBi2Eh6J4QRwimYt43LwOsuB2oX7YLVMCLqTAya3xx/EwZJxtYHy3WhyMkHExebXz3zAbbXfdo7AFBRaMAz1Ypa6XoaoPejKRGteZm6D3SlWVdOcOHo/Lfj2u9aXw+WHNmA00G/DiFEO0Jd+meyk0fIf/+vLfik6Xhj4qN0v7i5HCY1bBQPk+ij9GSzNbzYNdH03kMrscARfzvHQgiBocSFTVHVCrW+u+WrpK9iCIgS1rRK93oG/1GkRJVIup8KMNs1Sw/1rUtALD36ZzRca8XeJDmPtRc18vDn5SCJViYHENY3IZTK3JkE7RAYtpdkp3bAaJeOzN+CsSMTX+wqa7ih9sbVSLI2WV3znihAJYXZPThA7M6KQoM2MniyhUxTioxTpKLMadjx8Jqh5k3S//8d9GOh92XWmP/aXLKvfHgA0ZTklL0jj9m6UR6L5+9bjFWTPLcFIWbCY1+8pHb0drWybJ4aWLQrODyAWJndzoyylNyGg0hL+bV7Ll4rKIWB5CFBxMlLj21SL4W6QjDQjwOL9n4tNt0+AADPfo+UqgXPHJLSJrkso7F6ylLMy56OFMmYACIKblvtQext8Iqp0swyLYiI3zEAbs6Ml3cXv/p3Y+ryq5KcnSKb1Jmj75P7X0Rm/UV0tvO86r/WIhORwszvkmHEehH2WMo7ikDUQUWhoaIG+NNc96Os8eMEmklE2Qy2ANTO0OrA+CwFOFBfsq8pWZ7+B25aDBxvPp+QAAAAAElFTkSuQmCC';
+export const faviconWithOverlayDataUrl =
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGtElEQVRYR8WXf3CT9R3H35/nSdIQIktrCf0RStI0FYRjVBAccxTq5MDBKUoz4ZyjbPO87q4yBsPDMdExTjlvIsdQexyI0oMBeuKhdjsNHhwcMgpjIlublLIm/UlJKZSSJs/z/e6+T5v0CQ22wB/7/pPck8/383l9fj6fEOec8H88NAjAS1LwknsFSVLU8WXd1rtm85LUeKnwGQKzjj3s33azvsEAAEIlnn8ByHL4/Pa7BgAQLCm8QOBOh88vDQkQeMxjMkcQEYKqYsyJWWPhgs/80TsFafzROJtkNIXFfYI0pfXqPeennjqlxPUNikBoTuEmEF+lCRBV3G0aQiWFrwH8d30AWJubGdiEfZzdGqDEEwbICnADQGGHry7zTr0X94IlnnMACggwAWh0+PxOvb5EBGqmTTNkj7ySxWS62C+g5Usm1Zn95YXG24UQ+r5n75Li6Ux4LBkyc7/4t5YSLSr6Lgg9UvBLcKocMEYKON/gGB3YoA/bcGFCczzLQdieLE9bHL66FakBSjzCU0cSAHDa4at7aLhG9XLBEk8zAVnxZxyIEhBy+PwFgwAafpxvNzK5NZUhrX28JA07Cl6SmtvcOUwm4ZAouHj7ad+jMrN1dqb3iG7oS4EYPh2etQS+XiesC8TQ3ZD3yZJsHuUPgbMcI+ej5v3ncv5PasNlk1p7JJnzJL+I0/O5h+u0VCdqIDi78AQRHuirft3hYJzQPvawPydVdPI+/OnTnNNKBjYVXHRa8rFFGeb4w1he0wZ7d/84IXTEhxzxUsgitB2LPFGwvgGUfLSeZUpEXqEqrIdz0nr4iHOUfeOccb/tNMtutzWHPeWcJc0aMxm5lkxYDGloj1zB+Sv/RXXTSXzaeBwSY3j+bHNv2bdtMYCbpHtRkNFd36xFQN3tXkZhvgP1fdPi5kMEXL4oIXKVAA58M8aCVQs84BYLXi5aDq+zGJTqYr+i4PV2vHxmJ/7WUoOn2i/jz6yhW7JjrdSV8U4fQFV+I2Q4UIsedMCSSlcsgp72WtnSajOhzDsBNtsYfFD8e+Rbs4fdIG98uw9vnj+AX7FWvk4NHZOXXphF/INx2SpJIU2L8L4GDAoMwlP9kWSg6awcKVs83tyUnY5Dj75+W8bjutae3o5d9X/HTiWAuUtOS6RUOR8Hp48TxjgU/AMSeKJ1Ej/tMWXG1sxwGt98sBxe5+xhe64XVLiK2Z9XwNgdRLXyzQsC4ENwelIHAFxDBOdh1qdCdNLCoon8RnY+HZ6/+TtzPhTZweAxlJ94C5VqoI2U3a7rACzJjQqgBd24CGscos1kxPQZ38fqSU/jhQkDvN9lrKG7FeUnNuPVKcvwYOb4hGgvi2HSx8vwRKyJkVLl+hk43gdBAcfADBD1cA4RXIdZ1EN1Zjqem+DGoUc2oigjMUlvaV8YL/1qPVpuhOG+JwdH5m1Okn3m6Eacaz3V2jeI9uTbVYY6AKOSKw8MX0MBg2lXjh3r3Hk4s7ASdrMtSWxnoBpZIzIwP3e69lxv3Gay4q/F6zDJ5kq6s6amEnsafJ0Db8P9JKkx1w5wPJuY36IToojgNMzb8rLwmsuB2kW7YDWMSCgTg+YXx9+AQZKxdUaFZiju+a2Mi8uvnH0f2/2f9g4AVE4z4LlTilrlehag9xIpEam4jO4DXfdaV97nwtH5byW137VYD5Yc2YAz4YAGIYx2RLq0z1Sex8l//fUWfBI83jh4Kd1PEuAwqVGjWEwSS+nJJmt0sWu86d0frMQCR/LbWQ8hDAxlXMgUV69Q67ubv0q5FUNAlHKmVLnXE/gfREpUiaQHqAizXbO0UN98BMTSo39Cw7UW7E2Rc728qJGHP68ASbQyNYCQTkAUzCSwQ+CwvSjnsQPGLOnI/C0YO3Lwxq5yhhtqb1KNpGqT1TXvigJU0jh33xpAf7NymoGNDJ9sJtPkYuNkqTh7KnY8vGaoeZPy93+GA1joe4kzzv/SVLqvYngA/dFgVfnlb8tjtm6Ux+I39y/Gqone24IQM+GxL15UO3q7WrhsnhJatCs8PAC9md3OrPK0goaDyEj7uXsuXi0qg4HkIUGE52XHNqmXIl0RGOiHoUV7xb+v5K14SC39At79Ximdhc8ekjImuiyjsXryUszLnY40yThIhSi4bbUHsbfBJ6ZKE5dpQdz4HQOgf2a8tLvklY+M6cuvSnJummxSZ46+X+7biMzaRnSu84IauNYsE5HCOX+HDCPWi7DrKW8/BTcVZ2UN8Me57kc5448TaCYR5XJwC0BtHMwPjs/SgAP1pfuCqSL8Pxhr/wunLWAOAAAAAElFTkSuQmCC';
diff --git a/spec/javascripts/shortcuts_dashboard_navigation_spec.js b/spec/javascripts/lib/utils/navigation_utility_spec.js
index 7cb201e01d8..be620e4a27c 100644
--- a/spec/javascripts/shortcuts_dashboard_navigation_spec.js
+++ b/spec/javascripts/lib/utils/navigation_utility_spec.js
@@ -1,4 +1,4 @@
-import findAndFollowLink from '~/shortcuts_dashboard_navigation';
+import findAndFollowLink from '~/lib/utils/navigation_utility';
describe('findAndFollowLink', () => {
it('visits a link when the selector exists', () => {
diff --git a/spec/javascripts/lib/utils/number_utility_spec.js b/spec/javascripts/lib/utils/number_utility_spec.js
index fcf27f6805f..94c6214c86a 100644
--- a/spec/javascripts/lib/utils/number_utility_spec.js
+++ b/spec/javascripts/lib/utils/number_utility_spec.js
@@ -1,4 +1,10 @@
-import { formatRelevantDigits, bytesToKiB, bytesToMiB, bytesToGiB, numberToHumanSize } from '~/lib/utils/number_utils';
+import {
+ formatRelevantDigits,
+ bytesToKiB,
+ bytesToMiB,
+ bytesToGiB,
+ numberToHumanSize,
+} from '~/lib/utils/number_utils';
describe('Number Utils', () => {
describe('formatRelevantDigits', () => {
@@ -10,6 +16,7 @@ describe('Number Utils', () => {
const formattedNumber = formatRelevantDigits('1000.1234567');
const rightFromDecimal = formattedNumber.split('.')[1];
const leftFromDecimal = formattedNumber.split('.')[0];
+
expect(rightFromDecimal.length).toBe(4);
expect(leftFromDecimal.length).toBe(4);
});
@@ -18,6 +25,7 @@ describe('Number Utils', () => {
const formattedNumber = formatRelevantDigits('0.1234567');
const rightFromDecimal = formattedNumber.split('.')[1];
const leftFromDecimal = formattedNumber.split('.')[0];
+
expect(rightFromDecimal.length).toBe(3);
expect(leftFromDecimal.length).toBe(1);
});
@@ -26,6 +34,7 @@ describe('Number Utils', () => {
const formattedNumber = formatRelevantDigits('10.1234567');
const rightFromDecimal = formattedNumber.split('.')[1];
const leftFromDecimal = formattedNumber.split('.')[0];
+
expect(rightFromDecimal.length).toBe(2);
expect(leftFromDecimal.length).toBe(2);
});
@@ -34,6 +43,7 @@ describe('Number Utils', () => {
const formattedNumber = formatRelevantDigits('100.1234567');
const rightFromDecimal = formattedNumber.split('.')[1];
const leftFromDecimal = formattedNumber.split('.')[0];
+
expect(rightFromDecimal.length).toBe(1);
expect(leftFromDecimal.length).toBe(3);
});
diff --git a/spec/javascripts/lib/utils/poll_spec.js b/spec/javascripts/lib/utils/poll_spec.js
index 523f4997bc0..d0da659c3d7 100644
--- a/spec/javascripts/lib/utils/poll_spec.js
+++ b/spec/javascripts/lib/utils/poll_spec.js
@@ -1,3 +1,5 @@
+/* eslint-disable jasmine/no-unsafe-spy */
+
import Poll from '~/lib/utils/poll';
import { successCodes } from '~/lib/utils/http_status';
@@ -45,7 +47,7 @@ describe('Poll', () => {
service.fetch.calls.reset();
});
- it('calls the success callback when no header for interval is provided', (done) => {
+ it('calls the success callback when no header for interval is provided', done => {
mockServiceCall(service, { status: 200 });
setup();
@@ -57,7 +59,7 @@ describe('Poll', () => {
});
});
- it('calls the error callback when the http request returns an error', (done) => {
+ it('calls the error callback when the http request returns an error', done => {
mockServiceCall(service, { status: 500 }, true);
setup();
@@ -69,7 +71,7 @@ describe('Poll', () => {
});
});
- it('skips the error callback when request is aborted', (done) => {
+ it('skips the error callback when request is aborted', done => {
mockServiceCall(service, { status: 0 }, true);
setup();
@@ -82,19 +84,21 @@ describe('Poll', () => {
});
});
- it('should call the success callback when the interval header is -1', (done) => {
+ it('should call the success callback when the interval header is -1', done => {
mockServiceCall(service, { status: 200, headers: { 'poll-interval': -1 } });
- setup().then(() => {
- expect(callbacks.success).toHaveBeenCalled();
- expect(callbacks.error).not.toHaveBeenCalled();
+ setup()
+ .then(() => {
+ expect(callbacks.success).toHaveBeenCalled();
+ expect(callbacks.error).not.toHaveBeenCalled();
- done();
- }).catch(done.fail);
+ done();
+ })
+ .catch(done.fail);
});
describe('for 2xx status code', () => {
successCodes.forEach(httpCode => {
- it(`starts polling when http status is ${httpCode} and interval header is provided`, (done) => {
+ it(`starts polling when http status is ${httpCode} and interval header is provided`, done => {
mockServiceCall(service, { status: httpCode, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -122,7 +126,7 @@ describe('Poll', () => {
});
describe('stop', () => {
- it('stops polling when method is called', (done) => {
+ it('stops polling when method is called', done => {
mockServiceCall(service, { status: 200, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -150,7 +154,7 @@ describe('Poll', () => {
});
describe('restart', () => {
- it('should restart polling when its called', (done) => {
+ it('should restart polling when its called', done => {
mockServiceCall(service, { status: 200, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
diff --git a/spec/javascripts/lib/utils/sticky_spec.js b/spec/javascripts/lib/utils/sticky_spec.js
index b87c836654d..1b1e7da1ed3 100644
--- a/spec/javascripts/lib/utils/sticky_spec.js
+++ b/spec/javascripts/lib/utils/sticky_spec.js
@@ -22,25 +22,19 @@ describe('sticky', () => {
isSticky(el, 0, el.offsetTop);
isSticky(el, 0, el.offsetTop);
- expect(
- el.classList.contains('is-stuck'),
- ).toBeTruthy();
+ expect(el.classList.contains('is-stuck')).toBeTruthy();
});
it('adds is-stuck class', () => {
isSticky(el, 0, el.offsetTop);
- expect(
- el.classList.contains('is-stuck'),
- ).toBeTruthy();
+ expect(el.classList.contains('is-stuck')).toBeTruthy();
});
it('inserts placeholder element', () => {
isSticky(el, 0, el.offsetTop, true);
- expect(
- document.querySelector('.sticky-placeholder'),
- ).not.toBeNull();
+ expect(document.querySelector('.sticky-placeholder')).not.toBeNull();
});
});
@@ -51,29 +45,22 @@ describe('sticky', () => {
isSticky(el, 0, el.offsetTop);
isSticky(el, 0, 0);
- expect(
- el.classList.remove,
- ).toHaveBeenCalledWith('is-stuck');
- expect(
- el.classList.contains('is-stuck'),
- ).toBeFalsy();
+ expect(el.classList.remove).toHaveBeenCalledWith('is-stuck');
+
+ expect(el.classList.contains('is-stuck')).toBeFalsy();
});
it('does not add is-stuck class', () => {
isSticky(el, 0, 0);
- expect(
- el.classList.contains('is-stuck'),
- ).toBeFalsy();
+ expect(el.classList.contains('is-stuck')).toBeFalsy();
});
it('removes placeholder', () => {
isSticky(el, 0, el.offsetTop, true);
isSticky(el, 0, 0, true);
- expect(
- document.querySelector('.sticky-placeholder'),
- ).toBeNull();
+ expect(document.querySelector('.sticky-placeholder')).toBeNull();
});
});
});
diff --git a/spec/javascripts/lib/utils/text_markdown_spec.js b/spec/javascripts/lib/utils/text_markdown_spec.js
index ca0e7c395a0..f71d27eb4e4 100644
--- a/spec/javascripts/lib/utils/text_markdown_spec.js
+++ b/spec/javascripts/lib/utils/text_markdown_spec.js
@@ -21,7 +21,14 @@ describe('init markdown', () => {
textArea.selectionStart = 0;
textArea.selectionEnd = 0;
- insertMarkdownText(textArea, textArea.value, '*', null, '', false);
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag: '*',
+ blockTag: null,
+ selected: '',
+ wrap: false,
+ });
expect(textArea.value).toEqual(`${initialValue}* `);
});
@@ -32,7 +39,14 @@ describe('init markdown', () => {
textArea.value = initialValue;
textArea.setSelectionRange(initialValue.length, initialValue.length);
- insertMarkdownText(textArea, textArea.value, '*', null, '', false);
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag: '*',
+ blockTag: null,
+ selected: '',
+ wrap: false,
+ });
expect(textArea.value).toEqual(`${initialValue}\n* `);
});
@@ -43,7 +57,14 @@ describe('init markdown', () => {
textArea.value = initialValue;
textArea.setSelectionRange(initialValue.length, initialValue.length);
- insertMarkdownText(textArea, textArea.value, '*', null, '', false);
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag: '*',
+ blockTag: null,
+ selected: '',
+ wrap: false,
+ });
expect(textArea.value).toEqual(`${initialValue}* `);
});
@@ -54,9 +75,153 @@ describe('init markdown', () => {
textArea.value = initialValue;
textArea.setSelectionRange(initialValue.length, initialValue.length);
- insertMarkdownText(textArea, textArea.value, '*', null, '', false);
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag: '*',
+ blockTag: null,
+ selected: '',
+ wrap: false,
+ });
expect(textArea.value).toEqual(`${initialValue}* `);
});
+
+ it('places the cursor inside the tags', () => {
+ const start = 'lorem ';
+ const end = ' ipsum';
+ const tag = '*';
+
+ textArea.value = `${start}${end}`;
+ textArea.setSelectionRange(start.length, start.length);
+
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag,
+ blockTag: null,
+ selected: '',
+ wrap: true,
+ });
+
+ expect(textArea.value).toEqual(`${start}**${end}`);
+
+ // cursor placement should be between tags
+ expect(textArea.selectionStart).toBe(start.length + tag.length);
+ });
+ });
+
+ describe('with selection', () => {
+ const text = 'initial selected value';
+ const selected = 'selected';
+ beforeEach(() => {
+ textArea.value = text;
+ const selectedIndex = text.indexOf(selected);
+ textArea.setSelectionRange(selectedIndex, selectedIndex + selected.length);
+ });
+
+ it('applies the tag to the selected value', () => {
+ const selectedIndex = text.indexOf(selected);
+ const tag = '*';
+
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag,
+ blockTag: null,
+ selected,
+ wrap: true,
+ });
+
+ expect(textArea.value).toEqual(text.replace(selected, `*${selected}*`));
+
+ // cursor placement should be after selection + 2 tag lengths
+ expect(textArea.selectionStart).toBe(selectedIndex + selected.length + 2 * tag.length);
+ });
+
+ it('replaces the placeholder in the tag', () => {
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag: '[{text}](url)',
+ blockTag: null,
+ selected,
+ wrap: false,
+ });
+
+ expect(textArea.value).toEqual(text.replace(selected, `[${selected}](url)`));
+ });
+
+ describe('and text to be selected', () => {
+ const tag = '[{text}](url)';
+ const select = 'url';
+
+ it('selects the text', () => {
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag,
+ blockTag: null,
+ selected,
+ wrap: false,
+ select,
+ });
+
+ const expectedText = text.replace(selected, `[${selected}](url)`);
+
+ expect(textArea.value).toEqual(expectedText);
+ expect(textArea.selectionStart).toEqual(expectedText.indexOf(select));
+ expect(textArea.selectionEnd).toEqual(expectedText.indexOf(select) + select.length);
+ });
+
+ it('selects the right text when multiple tags are present', () => {
+ const initialValue = `${tag} ${tag} ${selected}`;
+ textArea.value = initialValue;
+ const selectedIndex = initialValue.indexOf(selected);
+ textArea.setSelectionRange(selectedIndex, selectedIndex + selected.length);
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag,
+ blockTag: null,
+ selected,
+ wrap: false,
+ select,
+ });
+
+ const expectedText = initialValue.replace(selected, `[${selected}](url)`);
+
+ expect(textArea.value).toEqual(expectedText);
+ expect(textArea.selectionStart).toEqual(expectedText.lastIndexOf(select));
+ expect(textArea.selectionEnd).toEqual(expectedText.lastIndexOf(select) + select.length);
+ });
+
+ it('should support selected urls', () => {
+ const expectedUrl = 'http://www.gitlab.com';
+ const expectedSelectionText = 'text';
+ const expectedText = `text [${expectedSelectionText}](${expectedUrl}) text`;
+ const initialValue = `text ${expectedUrl} text`;
+
+ textArea.value = initialValue;
+ const selectedIndex = initialValue.indexOf(expectedUrl);
+ textArea.setSelectionRange(selectedIndex, selectedIndex + expectedUrl.length);
+
+ insertMarkdownText({
+ textArea,
+ text: textArea.value,
+ tag,
+ blockTag: null,
+ selected: expectedUrl,
+ wrap: false,
+ select,
+ });
+
+ expect(textArea.value).toEqual(expectedText);
+ expect(textArea.selectionStart).toEqual(expectedText.indexOf(expectedSelectionText, 1));
+ expect(textArea.selectionEnd).toEqual(
+ expectedText.indexOf(expectedSelectionText, 1) + expectedSelectionText.length,
+ );
+ });
+ });
});
});
diff --git a/spec/javascripts/lib/utils/text_utility_spec.js b/spec/javascripts/lib/utils/text_utility_spec.js
index d60485b1308..92ebfc38722 100644
--- a/spec/javascripts/lib/utils/text_utility_spec.js
+++ b/spec/javascripts/lib/utils/text_utility_spec.js
@@ -63,6 +63,12 @@ describe('text_utility', () => {
});
});
+ describe('slugifyWithHyphens', () => {
+ it('should replaces whitespaces with hyphens and convert to lower case', () => {
+ expect(textUtils.slugifyWithHyphens('My Input String')).toEqual('my-input-string');
+ });
+ });
+
describe('stripHtml', () => {
it('replaces html tag with the default replacement', () => {
expect(textUtils.stripHtml('This is a text with <p>html</p>.')).toEqual(
@@ -114,7 +120,7 @@ describe('text_utility', () => {
});
describe('getFirstCharacterCapitalized', () => {
- it('returns the first character captialized, if first character is alphabetic', () => {
+ it('returns the first character capitalized, if first character is alphabetic', () => {
expect(textUtils.getFirstCharacterCapitalized('loremIpsumDolar')).toEqual('L');
expect(textUtils.getFirstCharacterCapitalized('Sit amit !')).toEqual('S');
});
diff --git a/spec/javascripts/lib/utils/users_cache_spec.js b/spec/javascripts/lib/utils/users_cache_spec.js
index 50371c8c5f6..6adc19bdd51 100644
--- a/spec/javascripts/lib/utils/users_cache_spec.js
+++ b/spec/javascripts/lib/utils/users_cache_spec.js
@@ -6,12 +6,12 @@ describe('UsersCache', () => {
const dummyUser = 'has a farm';
beforeEach(() => {
- UsersCache.internalStorage = { };
+ UsersCache.internalStorage = {};
});
describe('get', () => {
it('returns undefined for empty cache', () => {
- expect(UsersCache.internalStorage).toEqual({ });
+ expect(UsersCache.internalStorage).toEqual({});
const user = UsersCache.get(dummyUsername);
@@ -37,7 +37,7 @@ describe('UsersCache', () => {
describe('hasData', () => {
it('returns false for empty cache', () => {
- expect(UsersCache.internalStorage).toEqual({ });
+ expect(UsersCache.internalStorage).toEqual({});
expect(UsersCache.hasData(dummyUsername)).toBe(false);
});
@@ -57,11 +57,11 @@ describe('UsersCache', () => {
describe('remove', () => {
it('does nothing if cache is empty', () => {
- expect(UsersCache.internalStorage).toEqual({ });
+ expect(UsersCache.internalStorage).toEqual({});
UsersCache.remove(dummyUsername);
- expect(UsersCache.internalStorage).toEqual({ });
+ expect(UsersCache.internalStorage).toEqual({});
});
it('does nothing if cache contains no matching data', () => {
@@ -77,7 +77,7 @@ describe('UsersCache', () => {
UsersCache.remove(dummyUsername);
- expect(UsersCache.internalStorage).toEqual({ });
+ expect(UsersCache.internalStorage).toEqual({});
});
});
@@ -88,7 +88,7 @@ describe('UsersCache', () => {
spyOn(Api, 'users').and.callFake((query, options) => apiSpy(query, options));
});
- it('stores and returns data from API call if cache is empty', (done) => {
+ it('stores and returns data from API call if cache is empty', done => {
apiSpy = (query, options) => {
expect(query).toBe('');
expect(options).toEqual({ username: dummyUsername });
@@ -98,15 +98,15 @@ describe('UsersCache', () => {
};
UsersCache.retrieve(dummyUsername)
- .then((user) => {
- expect(user).toBe(dummyUser);
- expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ .then(user => {
+ expect(user).toBe(dummyUser);
+ expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('returns undefined if Ajax call fails and cache is empty', (done) => {
+ it('returns undefined if Ajax call fails and cache is empty', done => {
const dummyError = new Error('server exploded');
apiSpy = (query, options) => {
expect(query).toBe('');
@@ -115,24 +115,24 @@ describe('UsersCache', () => {
};
UsersCache.retrieve(dummyUsername)
- .then(user => fail(`Received unexpected user: ${JSON.stringify(user)}`))
- .catch((error) => {
- expect(error).toBe(dummyError);
- })
- .then(done)
- .catch(done.fail);
+ .then(user => fail(`Received unexpected user: ${JSON.stringify(user)}`))
+ .catch(error => {
+ expect(error).toBe(dummyError);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('makes no Ajax call if matching data exists', (done) => {
+ it('makes no Ajax call if matching data exists', done => {
UsersCache.internalStorage[dummyUsername] = dummyUser;
apiSpy = () => fail(new Error('expected no Ajax call!'));
UsersCache.retrieve(dummyUsername)
- .then((user) => {
- expect(user).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ .then(user => {
+ expect(user).toBe(dummyUser);
+ })
+ .then(done)
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/line_highlighter_spec.js b/spec/javascripts/line_highlighter_spec.js
index 8cf0017f4d8..4eea364bd69 100644
--- a/spec/javascripts/line_highlighter_spec.js
+++ b/spec/javascripts/line_highlighter_spec.js
@@ -1,226 +1,265 @@
-/* eslint-disable no-var, quotes, prefer-template, no-else-return, dot-notation, no-return-assign, comma-dangle, no-new, one-var, one-var-declaration-per-line, no-underscore-dangle, max-len */
+/* eslint-disable no-var, prefer-template, no-else-return, dot-notation, no-return-assign, no-new, no-underscore-dangle */
import $ from 'jquery';
import LineHighlighter from '~/line_highlighter';
-(function() {
- describe('LineHighlighter', function() {
- var clickLine;
- preloadFixtures('static/line_highlighter.html.raw');
- clickLine = function(number, eventData = {}) {
- if ($.isEmptyObject(eventData)) {
- return $("#L" + number).click();
- } else {
- const e = $.Event('click', eventData);
- return $("#L" + number).trigger(e);
+describe('LineHighlighter', function() {
+ var clickLine;
+ preloadFixtures('static/line_highlighter.html.raw');
+ clickLine = function(number, eventData = {}) {
+ if ($.isEmptyObject(eventData)) {
+ return $('#L' + number).click();
+ } else {
+ const e = $.Event('click', eventData);
+ return $('#L' + number).trigger(e);
+ }
+ };
+ beforeEach(function() {
+ loadFixtures('static/line_highlighter.html.raw');
+ this['class'] = new LineHighlighter();
+ this.css = this['class'].highlightLineClass;
+ return (this.spies = {
+ __setLocationHash__: spyOn(this['class'], '__setLocationHash__').and.callFake(function() {}),
+ });
+ });
+
+ describe('behavior', function() {
+ it('highlights one line given in the URL hash', function() {
+ new LineHighlighter({ hash: '#L13' });
+
+ expect($('#LC13')).toHaveClass(this.css);
+ });
+
+ it('highlights one line given in the URL hash with given CSS class name', function() {
+ const hiliter = new LineHighlighter({ hash: '#L13', highlightLineClass: 'hilite' });
+
+ expect(hiliter.highlightLineClass).toBe('hilite');
+ expect($('#LC13')).toHaveClass('hilite');
+ expect($('#LC13')).not.toHaveClass('hll');
+ });
+
+ it('highlights a range of lines given in the URL hash', function() {
+ var line;
+ new LineHighlighter({ hash: '#L5-25' });
+
+ expect($('.' + this.css).length).toBe(21);
+ for (line = 5; line <= 25; line += 1) {
+ expect($('#LC' + line)).toHaveClass(this.css);
}
- };
- beforeEach(function() {
- loadFixtures('static/line_highlighter.html.raw');
- this["class"] = new LineHighlighter();
- this.css = this["class"].highlightLineClass;
- return this.spies = {
- __setLocationHash__: spyOn(this["class"], '__setLocationHash__').and.callFake(function() {})
+ });
+
+ it('scrolls to the first highlighted line on initial load', function() {
+ var spy;
+ spy = spyOn($, 'scrollTo');
+ new LineHighlighter({ hash: '#L5-25' });
+
+ expect(spy).toHaveBeenCalledWith('#L5', jasmine.anything());
+ });
+
+ it('discards click events', function() {
+ var spy;
+ spy = spyOnEvent('a[data-line-number]', 'click');
+ clickLine(13);
+
+ expect(spy).toHaveBeenPrevented();
+ });
+
+ it('handles garbage input from the hash', function() {
+ var func;
+ func = function() {
+ return new LineHighlighter({ fileHolderSelector: '#blob-content-holder' });
};
+
+ expect(func).not.toThrow();
});
- describe('behavior', function() {
- it('highlights one line given in the URL hash', function() {
- new LineHighlighter({ hash: '#L13' });
- return expect($('#LC13')).toHaveClass(this.css);
- });
- it('highlights one line given in the URL hash with given CSS class name', function() {
- const hiliter = new LineHighlighter({ hash: '#L13', highlightLineClass: 'hilite' });
- expect(hiliter.highlightLineClass).toBe('hilite');
- expect($('#LC13')).toHaveClass('hilite');
- expect($('#LC13')).not.toHaveClass('hll');
- });
- it('highlights a range of lines given in the URL hash', function() {
- var line, results;
- new LineHighlighter({ hash: '#L5-25' });
- expect($("." + this.css).length).toBe(21);
- results = [];
- for (line = 5; line <= 25; line += 1) {
- results.push(expect($("#LC" + line)).toHaveClass(this.css));
- }
- return results;
+ });
+
+ describe('clickHandler', function() {
+ it('handles clicking on a child icon element', function() {
+ var spy;
+ spy = spyOn(this['class'], 'setHash').and.callThrough();
+ $('#L13 i')
+ .mousedown()
+ .click();
+
+ expect(spy).toHaveBeenCalledWith(13);
+ expect($('#LC13')).toHaveClass(this.css);
+ });
+
+ describe('without shiftKey', function() {
+ it('highlights one line when clicked', function() {
+ clickLine(13);
+
+ expect($('#LC13')).toHaveClass(this.css);
});
- it('scrolls to the first highlighted line on initial load', function() {
- var spy;
- spy = spyOn($, 'scrollTo');
- new LineHighlighter({ hash: '#L5-25' });
- return expect(spy).toHaveBeenCalledWith('#L5', jasmine.anything());
+
+ it('unhighlights previously highlighted lines', function() {
+ clickLine(13);
+ clickLine(20);
+
+ expect($('#LC13')).not.toHaveClass(this.css);
+ expect($('#LC20')).toHaveClass(this.css);
});
- it('discards click events', function() {
+
+ it('sets the hash', function() {
var spy;
- spy = spyOnEvent('a[data-line-number]', 'click');
+ spy = spyOn(this['class'], 'setHash').and.callThrough();
clickLine(13);
- return expect(spy).toHaveBeenPrevented();
- });
- it('handles garbage input from the hash', function() {
- var func;
- func = function() {
- return new LineHighlighter({ fileHolderSelector: '#blob-content-holder' });
- };
- return expect(func).not.toThrow();
+
+ expect(spy).toHaveBeenCalledWith(13);
});
});
- describe('clickHandler', function() {
- it('handles clicking on a child icon element', function() {
+
+ describe('with shiftKey', function() {
+ it('sets the hash', function() {
var spy;
- spy = spyOn(this["class"], 'setHash').and.callThrough();
- $('#L13 i').mousedown().click();
+ spy = spyOn(this['class'], 'setHash').and.callThrough();
+ clickLine(13);
+ clickLine(20, {
+ shiftKey: true,
+ });
+
expect(spy).toHaveBeenCalledWith(13);
- return expect($('#LC13')).toHaveClass(this.css);
+ expect(spy).toHaveBeenCalledWith(13, 20);
});
- describe('without shiftKey', function() {
- it('highlights one line when clicked', function() {
- clickLine(13);
- return expect($('#LC13')).toHaveClass(this.css);
- });
- it('unhighlights previously highlighted lines', function() {
- clickLine(13);
- clickLine(20);
- expect($('#LC13')).not.toHaveClass(this.css);
- return expect($('#LC20')).toHaveClass(this.css);
- });
- return it('sets the hash', function() {
- var spy;
- spy = spyOn(this["class"], 'setHash').and.callThrough();
- clickLine(13);
- return expect(spy).toHaveBeenCalledWith(13);
+
+ describe('without existing highlight', function() {
+ it('highlights the clicked line', function() {
+ clickLine(13, {
+ shiftKey: true,
+ });
+
+ expect($('#LC13')).toHaveClass(this.css);
+ expect($('.' + this.css).length).toBe(1);
});
- });
- return describe('with shiftKey', function() {
+
it('sets the hash', function() {
var spy;
- spy = spyOn(this["class"], 'setHash').and.callThrough();
- clickLine(13);
- clickLine(20, {
- shiftKey: true
+ spy = spyOn(this['class'], 'setHash');
+ clickLine(13, {
+ shiftKey: true,
});
+
expect(spy).toHaveBeenCalledWith(13);
- return expect(spy).toHaveBeenCalledWith(13, 20);
});
- describe('without existing highlight', function() {
- it('highlights the clicked line', function() {
- clickLine(13, {
- shiftKey: true
- });
- expect($('#LC13')).toHaveClass(this.css);
- return expect($("." + this.css).length).toBe(1);
+ });
+
+ describe('with existing single-line highlight', function() {
+ it('uses existing line as last line when target is lesser', function() {
+ var line;
+ clickLine(20);
+ clickLine(15, {
+ shiftKey: true,
});
- return it('sets the hash', function() {
- var spy;
- spy = spyOn(this["class"], 'setHash');
- clickLine(13, {
- shiftKey: true
- });
- return expect(spy).toHaveBeenCalledWith(13);
+
+ expect($('.' + this.css).length).toBe(6);
+ for (line = 15; line <= 20; line += 1) {
+ expect($('#LC' + line)).toHaveClass(this.css);
+ }
+ });
+
+ it('uses existing line as first line when target is greater', function() {
+ var line;
+ clickLine(5);
+ clickLine(10, {
+ shiftKey: true,
});
+
+ expect($('.' + this.css).length).toBe(6);
+ for (line = 5; line <= 10; line += 1) {
+ expect($('#LC' + line)).toHaveClass(this.css);
+ }
});
- describe('with existing single-line highlight', function() {
- it('uses existing line as last line when target is lesser', function() {
- var line, results;
- clickLine(20);
- clickLine(15, {
- shiftKey: true
- });
- expect($("." + this.css).length).toBe(6);
- results = [];
- for (line = 15; line <= 20; line += 1) {
- results.push(expect($("#LC" + line)).toHaveClass(this.css));
- }
- return results;
+ });
+
+ describe('with existing multi-line highlight', function() {
+ beforeEach(function() {
+ clickLine(10, {
+ shiftKey: true,
});
- return it('uses existing line as first line when target is greater', function() {
- var line, results;
- clickLine(5);
- clickLine(10, {
- shiftKey: true
- });
- expect($("." + this.css).length).toBe(6);
- results = [];
- for (line = 5; line <= 10; line += 1) {
- results.push(expect($("#LC" + line)).toHaveClass(this.css));
- }
- return results;
+ clickLine(13, {
+ shiftKey: true,
});
});
- return describe('with existing multi-line highlight', function() {
- beforeEach(function() {
- clickLine(10, {
- shiftKey: true
- });
- return clickLine(13, {
- shiftKey: true
- });
- });
- it('uses target as first line when it is less than existing first line', function() {
- var line, results;
- clickLine(5, {
- shiftKey: true
- });
- expect($("." + this.css).length).toBe(6);
- results = [];
- for (line = 5; line <= 10; line += 1) {
- results.push(expect($("#LC" + line)).toHaveClass(this.css));
- }
- return results;
+
+ it('uses target as first line when it is less than existing first line', function() {
+ var line;
+ clickLine(5, {
+ shiftKey: true,
});
- return it('uses target as last line when it is greater than existing first line', function() {
- var line, results;
- clickLine(15, {
- shiftKey: true
- });
- expect($("." + this.css).length).toBe(6);
- results = [];
- for (line = 10; line <= 15; line += 1) {
- results.push(expect($("#LC" + line)).toHaveClass(this.css));
- }
- return results;
+
+ expect($('.' + this.css).length).toBe(6);
+ for (line = 5; line <= 10; line += 1) {
+ expect($('#LC' + line)).toHaveClass(this.css);
+ }
+ });
+
+ it('uses target as last line when it is greater than existing first line', function() {
+ var line;
+ clickLine(15, {
+ shiftKey: true,
});
+
+ expect($('.' + this.css).length).toBe(6);
+ for (line = 10; line <= 15; line += 1) {
+ expect($('#LC' + line)).toHaveClass(this.css);
+ }
});
});
});
- describe('hashToRange', function() {
- beforeEach(function() {
- return this.subject = this["class"].hashToRange;
- });
- it('extracts a single line number from the hash', function() {
- return expect(this.subject('#L5')).toEqual([5, null]);
- });
- it('extracts a range of line numbers from the hash', function() {
- return expect(this.subject('#L5-15')).toEqual([5, 15]);
- });
- return it('returns [null, null] when the hash is not a line number', function() {
- return expect(this.subject('#foo')).toEqual([null, null]);
- });
+ });
+
+ describe('hashToRange', function() {
+ beforeEach(function() {
+ this.subject = this['class'].hashToRange;
});
- describe('highlightLine', function() {
- beforeEach(function() {
- return this.subject = this["class"].highlightLine;
- });
- it('highlights the specified line', function() {
- this.subject(13);
- return expect($('#LC13')).toHaveClass(this.css);
- });
- return it('accepts a String-based number', function() {
- this.subject('13');
- return expect($('#LC13')).toHaveClass(this.css);
- });
+
+ it('extracts a single line number from the hash', function() {
+ expect(this.subject('#L5')).toEqual([5, null]);
});
- return describe('setHash', function() {
- beforeEach(function() {
- return this.subject = this["class"].setHash;
- });
- it('sets the location hash for a single line', function() {
- this.subject(5);
- return expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5');
- });
- return it('sets the location hash for a range', function() {
- this.subject(5, 15);
- return expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5-15');
- });
+
+ it('extracts a range of line numbers from the hash', function() {
+ expect(this.subject('#L5-15')).toEqual([5, 15]);
+ });
+
+ it('returns [null, null] when the hash is not a line number', function() {
+ expect(this.subject('#foo')).toEqual([null, null]);
+ });
+ });
+
+ describe('highlightLine', function() {
+ beforeEach(function() {
+ this.subject = this['class'].highlightLine;
+ });
+
+ it('highlights the specified line', function() {
+ this.subject(13);
+
+ expect($('#LC13')).toHaveClass(this.css);
+ });
+
+ it('accepts a String-based number', function() {
+ this.subject('13');
+
+ expect($('#LC13')).toHaveClass(this.css);
+ });
+ });
+
+ describe('setHash', function() {
+ beforeEach(function() {
+ this.subject = this['class'].setHash;
+ });
+
+ it('sets the location hash for a single line', function() {
+ this.subject(5);
+
+ expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5');
+ });
+
+ it('sets the location hash for a range', function() {
+ this.subject(5, 15);
+
+ expect(this.spies.__setLocationHash__).toHaveBeenCalledWith('#L5-15');
});
});
-}).call(window);
+});
diff --git a/spec/javascripts/locale/ensure_single_line_spec.js b/spec/javascripts/locale/ensure_single_line_spec.js
new file mode 100644
index 00000000000..20b04cab9c8
--- /dev/null
+++ b/spec/javascripts/locale/ensure_single_line_spec.js
@@ -0,0 +1,38 @@
+import ensureSingleLine from '~/locale/ensure_single_line';
+
+describe('locale', () => {
+ describe('ensureSingleLine', () => {
+ it('should remove newlines at the start of the string', () => {
+ const result = 'Test';
+
+ expect(ensureSingleLine(`\n${result}`)).toBe(result);
+ expect(ensureSingleLine(`\t\n\t${result}`)).toBe(result);
+ expect(ensureSingleLine(`\r\n${result}`)).toBe(result);
+ expect(ensureSingleLine(`\r\n ${result}`)).toBe(result);
+ expect(ensureSingleLine(`\r ${result}`)).toBe(result);
+ expect(ensureSingleLine(` \n ${result}`)).toBe(result);
+ });
+
+ it('should remove newlines at the end of the string', () => {
+ const result = 'Test';
+
+ expect(ensureSingleLine(`${result}\n`)).toBe(result);
+ expect(ensureSingleLine(`${result}\t\n\t`)).toBe(result);
+ expect(ensureSingleLine(`${result}\r\n`)).toBe(result);
+ expect(ensureSingleLine(`${result}\r`)).toBe(result);
+ expect(ensureSingleLine(`${result} \r`)).toBe(result);
+ expect(ensureSingleLine(`${result} \r\n `)).toBe(result);
+ });
+
+ it('should replace newlines in the middle of the string with a single space', () => {
+ const result = 'Test';
+
+ expect(ensureSingleLine(`${result}\n${result}`)).toBe(`${result} ${result}`);
+ expect(ensureSingleLine(`${result}\t\n\t${result}`)).toBe(`${result} ${result}`);
+ expect(ensureSingleLine(`${result}\r\n${result}`)).toBe(`${result} ${result}`);
+ expect(ensureSingleLine(`${result}\r${result}`)).toBe(`${result} ${result}`);
+ expect(ensureSingleLine(`${result} \r${result}`)).toBe(`${result} ${result}`);
+ expect(ensureSingleLine(`${result} \r\n ${result}`)).toBe(`${result} ${result}`);
+ });
+ });
+});
diff --git a/spec/javascripts/merge_request_spec.js b/spec/javascripts/merge_request_spec.js
index 7502f1fa2e1..1cb49b49ca7 100644
--- a/spec/javascripts/merge_request_spec.js
+++ b/spec/javascripts/merge_request_spec.js
@@ -7,123 +7,122 @@ import MergeRequest from '~/merge_request';
import CloseReopenReportToggle from '~/close_reopen_report_toggle';
import IssuablesHelper from '~/helpers/issuables_helper';
-(function() {
- describe('MergeRequest', function() {
- describe('task lists', function() {
- let mock;
+describe('MergeRequest', function() {
+ describe('task lists', function() {
+ let mock;
- preloadFixtures('merge_requests/merge_request_with_task_list.html.raw');
- beforeEach(function() {
- loadFixtures('merge_requests/merge_request_with_task_list.html.raw');
+ preloadFixtures('merge_requests/merge_request_with_task_list.html.raw');
+ beforeEach(function() {
+ loadFixtures('merge_requests/merge_request_with_task_list.html.raw');
- spyOn(axios, 'patch').and.callThrough();
- mock = new MockAdapter(axios);
+ spyOn(axios, 'patch').and.callThrough();
+ mock = new MockAdapter(axios);
- mock
- .onPatch(`${gl.TEST_HOST}/frontend-fixtures/merge-requests-project/merge_requests/1.json`)
- .reply(200, {});
+ mock
+ .onPatch(`${gl.TEST_HOST}/frontend-fixtures/merge-requests-project/merge_requests/1.json`)
+ .reply(200, {});
- return (this.merge = new MergeRequest());
- });
+ return (this.merge = new MergeRequest());
+ });
- afterEach(() => {
- mock.restore();
- });
+ afterEach(() => {
+ mock.restore();
+ });
- it('modifies the Markdown field', function() {
- spyOn($, 'ajax').and.stub();
- const changeEvent = document.createEvent('HTMLEvents');
- changeEvent.initEvent('change', true, true);
- $('input[type=checkbox]')
- .attr('checked', true)[0]
- .dispatchEvent(changeEvent);
- return expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
- });
+ it('modifies the Markdown field', function() {
+ spyOn($, 'ajax').and.stub();
+ const changeEvent = document.createEvent('HTMLEvents');
+ changeEvent.initEvent('change', true, true);
+ $('input[type=checkbox]')
+ .attr('checked', true)[0]
+ .dispatchEvent(changeEvent);
- it('submits an ajax request on tasklist:changed', done => {
- $('.js-task-list-field').trigger('tasklist:changed');
-
- setTimeout(() => {
- expect(axios.patch).toHaveBeenCalledWith(
- `${gl.TEST_HOST}/frontend-fixtures/merge-requests-project/merge_requests/1.json`,
- {
- merge_request: { description: '- [ ] Task List Item' },
- },
- );
- done();
- });
- });
+ expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
});
- describe('class constructor', () => {
- beforeEach(() => {
- spyOn($, 'ajax').and.stub();
+ it('submits an ajax request on tasklist:changed', done => {
+ $('.js-task-list-field').trigger('tasklist:changed');
+
+ setTimeout(() => {
+ expect(axios.patch).toHaveBeenCalledWith(
+ `${gl.TEST_HOST}/frontend-fixtures/merge-requests-project/merge_requests/1.json`,
+ {
+ merge_request: { description: '- [ ] Task List Item' },
+ },
+ );
+ done();
});
+ });
+ });
- it('calls .initCloseReopenReport', () => {
- spyOn(IssuablesHelper, 'initCloseReopenReport');
+ describe('class constructor', () => {
+ beforeEach(() => {
+ spyOn($, 'ajax').and.stub();
+ });
- new MergeRequest(); // eslint-disable-line no-new
+ it('calls .initCloseReopenReport', () => {
+ spyOn(IssuablesHelper, 'initCloseReopenReport');
- expect(IssuablesHelper.initCloseReopenReport).toHaveBeenCalled();
- });
+ new MergeRequest(); // eslint-disable-line no-new
- it('calls .initDroplab', () => {
- const container = jasmine.createSpyObj('container', ['querySelector']);
- const dropdownTrigger = {};
- const dropdownList = {};
- const button = {};
+ expect(IssuablesHelper.initCloseReopenReport).toHaveBeenCalled();
+ });
+
+ it('calls .initDroplab', () => {
+ const container = jasmine.createSpyObj('container', ['querySelector']);
+ const dropdownTrigger = {};
+ const dropdownList = {};
+ const button = {};
+
+ spyOn(CloseReopenReportToggle.prototype, 'initDroplab');
+ spyOn(document, 'querySelector').and.returnValue(container);
+ container.querySelector.and.returnValues(dropdownTrigger, dropdownList, button);
- spyOn(CloseReopenReportToggle.prototype, 'initDroplab');
- spyOn(document, 'querySelector').and.returnValue(container);
- container.querySelector.and.returnValues(dropdownTrigger, dropdownList, button);
+ new MergeRequest(); // eslint-disable-line no-new
+
+ expect(document.querySelector).toHaveBeenCalledWith('.js-issuable-close-dropdown');
+ expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-toggle');
+ expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-menu');
+ expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-button');
+ expect(CloseReopenReportToggle.prototype.initDroplab).toHaveBeenCalled();
+ });
+ });
+ describe('hideCloseButton', () => {
+ describe('merge request of another user', () => {
+ beforeEach(() => {
+ loadFixtures('merge_requests/merge_request_with_task_list.html.raw');
+ this.el = document.querySelector('.js-issuable-actions');
new MergeRequest(); // eslint-disable-line no-new
+ MergeRequest.hideCloseButton();
+ });
- expect(document.querySelector).toHaveBeenCalledWith('.js-issuable-close-dropdown');
- expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-toggle');
- expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-menu');
- expect(container.querySelector).toHaveBeenCalledWith('.js-issuable-close-button');
- expect(CloseReopenReportToggle.prototype.initDroplab).toHaveBeenCalled();
+ it('hides the dropdown close item and selects the next item', () => {
+ const closeItem = this.el.querySelector('li.close-item');
+ const smallCloseItem = this.el.querySelector('.js-close-item');
+ const reportItem = this.el.querySelector('li.report-item');
+
+ expect(closeItem).toHaveClass('hidden');
+ expect(smallCloseItem).toHaveClass('hidden');
+ expect(reportItem).toHaveClass('droplab-item-selected');
+ expect(reportItem).not.toHaveClass('hidden');
});
});
- describe('hideCloseButton', () => {
- describe('merge request of another user', () => {
- beforeEach(() => {
- loadFixtures('merge_requests/merge_request_with_task_list.html.raw');
- this.el = document.querySelector('.js-issuable-actions');
- new MergeRequest(); // eslint-disable-line no-new
- MergeRequest.hideCloseButton();
- });
-
- it('hides the dropdown close item and selects the next item', () => {
- const closeItem = this.el.querySelector('li.close-item');
- const smallCloseItem = this.el.querySelector('.js-close-item');
- const reportItem = this.el.querySelector('li.report-item');
-
- expect(closeItem).toHaveClass('hidden');
- expect(smallCloseItem).toHaveClass('hidden');
- expect(reportItem).toHaveClass('droplab-item-selected');
- expect(reportItem).not.toHaveClass('hidden');
- });
+ describe('merge request of current_user', () => {
+ beforeEach(() => {
+ loadFixtures('merge_requests/merge_request_of_current_user.html.raw');
+ this.el = document.querySelector('.js-issuable-actions');
+ MergeRequest.hideCloseButton();
});
- describe('merge request of current_user', () => {
- beforeEach(() => {
- loadFixtures('merge_requests/merge_request_of_current_user.html.raw');
- this.el = document.querySelector('.js-issuable-actions');
- MergeRequest.hideCloseButton();
- });
-
- it('hides the close button', () => {
- const closeButton = this.el.querySelector('.btn-close');
- const smallCloseItem = this.el.querySelector('.js-close-item');
+ it('hides the close button', () => {
+ const closeButton = this.el.querySelector('.btn-close');
+ const smallCloseItem = this.el.querySelector('.js-close-item');
- expect(closeButton).toHaveClass('hidden');
- expect(smallCloseItem).toHaveClass('hidden');
- });
+ expect(closeButton).toHaveClass('hidden');
+ expect(smallCloseItem).toHaveClass('hidden');
});
});
});
-}.call(window));
+});
diff --git a/spec/javascripts/merge_request_tabs_spec.js b/spec/javascripts/merge_request_tabs_spec.js
index 7251ce19a90..7714197c821 100644
--- a/spec/javascripts/merge_request_tabs_spec.js
+++ b/spec/javascripts/merge_request_tabs_spec.js
@@ -224,6 +224,14 @@ describe('MergeRequestTabs', function() {
expect($('.content-wrapper')).not.toContainElement('.container-limited');
});
+ it('does not add container-limited when fluid layout is prefered', function() {
+ $('.content-wrapper .container-fluid').removeClass('container-limited');
+
+ this.class.expandViewContainer(false);
+
+ expect($('.content-wrapper')).not.toContainElement('.container-limited');
+ });
+
it('does remove container-limited from breadcrumbs', function() {
$('.container-limited').addClass('breadcrumbs');
this.class.expandViewContainer();
diff --git a/spec/javascripts/mini_pipeline_graph_dropdown_spec.js b/spec/javascripts/mini_pipeline_graph_dropdown_spec.js
index 1879424c629..092ca9e1dab 100644
--- a/spec/javascripts/mini_pipeline_graph_dropdown_spec.js
+++ b/spec/javascripts/mini_pipeline_graph_dropdown_spec.js
@@ -39,10 +39,9 @@ describe('Mini Pipeline Graph Dropdown', () => {
});
it('should call getBuildsList', () => {
- const getBuildsListSpy = spyOn(
- MiniPipelineGraph.prototype,
- 'getBuildsList',
- ).and.callFake(function () {});
+ const getBuildsListSpy = spyOn(MiniPipelineGraph.prototype, 'getBuildsList').and.callFake(
+ function() {},
+ );
new MiniPipelineGraph({ container: '.js-builds-dropdown-tests' }).bindEvents();
@@ -61,10 +60,11 @@ describe('Mini Pipeline Graph Dropdown', () => {
new MiniPipelineGraph({ container: '.js-builds-dropdown-tests' }).bindEvents();
document.querySelector('.js-builds-dropdown-button').click();
+
expect(ajaxSpy.calls.allArgs()[0][0]).toEqual('foobar');
});
- it('should not close when user uses cmd/ctrl + click', (done) => {
+ it('should not close when user uses cmd/ctrl + click', done => {
mock.onGet('foobar').reply(200, {
html: `<li>
<a class="mini-pipeline-graph-dropdown-item" href="#">
@@ -90,7 +90,7 @@ describe('Mini Pipeline Graph Dropdown', () => {
.catch(done.fail);
});
- it('should close the dropdown when request returns an error', (done) => {
+ it('should close the dropdown when request returns an error', done => {
mock.onGet('foobar').networkError();
new MiniPipelineGraph({ container: '.js-builds-dropdown-tests' }).bindEvents();
diff --git a/spec/javascripts/monitoring/dashboard_spec.js b/spec/javascripts/monitoring/dashboard_spec.js
index 997163c7602..565b87de248 100644
--- a/spec/javascripts/monitoring/dashboard_spec.js
+++ b/spec/javascripts/monitoring/dashboard_spec.js
@@ -4,28 +4,33 @@ import Dashboard from '~/monitoring/components/dashboard.vue';
import axios from '~/lib/utils/axios_utils';
import { metricsGroupsAPIResponse, mockApiEndpoint, environmentData } from './mock_data';
+const propsData = {
+ hasMetrics: false,
+ documentationPath: '/path/to/docs',
+ settingsPath: '/path/to/settings',
+ clustersPath: '/path/to/clusters',
+ tagsPath: '/path/to/tags',
+ projectPath: '/path/to/project',
+ metricsEndpoint: mockApiEndpoint,
+ deploymentEndpoint: null,
+ emptyGettingStartedSvgPath: '/path/to/getting-started.svg',
+ emptyLoadingSvgPath: '/path/to/loading.svg',
+ emptyNoDataSvgPath: '/path/to/no-data.svg',
+ emptyUnableToConnectSvgPath: '/path/to/unable-to-connect.svg',
+ environmentsEndpoint: '/root/hello-prometheus/environments/35',
+ currentEnvironmentName: 'production',
+};
+
+export default propsData;
+
describe('Dashboard', () => {
let DashboardComponent;
- const propsData = {
- hasMetrics: false,
- documentationPath: '/path/to/docs',
- settingsPath: '/path/to/settings',
- clustersPath: '/path/to/clusters',
- tagsPath: '/path/to/tags',
- projectPath: '/path/to/project',
- metricsEndpoint: mockApiEndpoint,
- deploymentEndpoint: null,
- emptyGettingStartedSvgPath: '/path/to/getting-started.svg',
- emptyLoadingSvgPath: '/path/to/loading.svg',
- emptyNoDataSvgPath: '/path/to/no-data.svg',
- emptyUnableToConnectSvgPath: '/path/to/unable-to-connect.svg',
- environmentsEndpoint: '/root/hello-prometheus/environments/35',
- currentEnvironmentName: 'production',
- };
-
beforeEach(() => {
- setFixtures('<div class="prometheus-graphs"></div>');
+ setFixtures(`
+ <div class="prometheus-graphs"></div>
+ <div class="nav-sidebar"></div>
+ `);
DashboardComponent = Vue.extend(Dashboard);
});
@@ -102,11 +107,28 @@ describe('Dashboard', () => {
setTimeout(() => {
const dropdownMenuEnvironments = component.$el.querySelectorAll('.dropdown-menu ul li a');
+
expect(dropdownMenuEnvironments.length).toEqual(component.store.environmentsData.length);
done();
});
});
+ it('hides the dropdown list when there is no environments', done => {
+ const component = new DashboardComponent({
+ el: document.querySelector('.prometheus-graphs'),
+ propsData: { ...propsData, hasMetrics: true, showPanels: false },
+ });
+
+ component.store.storeEnvironmentsData([]);
+
+ setTimeout(() => {
+ const dropdownMenuEnvironments = component.$el.querySelectorAll('.dropdown-menu ul');
+
+ expect(dropdownMenuEnvironments.length).toEqual(0);
+ done();
+ });
+ });
+
it('renders the dropdown with a single is-active element', done => {
const component = new DashboardComponent({
el: document.querySelector('.prometheus-graphs'),
@@ -119,6 +141,7 @@ describe('Dashboard', () => {
const dropdownIsActiveElement = component.$el.querySelectorAll(
'.dropdown-menu ul li a.is-active',
);
+
expect(dropdownIsActiveElement.length).toEqual(1);
expect(dropdownIsActiveElement[0].textContent.trim()).toEqual(
component.currentEnvironmentName,
@@ -127,4 +150,41 @@ describe('Dashboard', () => {
});
});
});
+
+ describe('when the window resizes', () => {
+ let mock;
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(mockApiEndpoint).reply(200, metricsGroupsAPIResponse);
+ jasmine.clock().install();
+ });
+
+ afterEach(() => {
+ mock.restore();
+ jasmine.clock().uninstall();
+ });
+
+ it('rerenders the dashboard when the sidebar is resized', done => {
+ const component = new DashboardComponent({
+ el: document.querySelector('.prometheus-graphs'),
+ propsData: { ...propsData, hasMetrics: true, showPanels: false },
+ });
+
+ expect(component.forceRedraw).toEqual(0);
+
+ const navSidebarEl = document.querySelector('.nav-sidebar');
+ navSidebarEl.classList.add('nav-sidebar-collapsed');
+
+ Vue.nextTick()
+ .then(() => {
+ jasmine.clock().tick(1000);
+ return Vue.nextTick();
+ })
+ .then(() => {
+ expect(component.forceRedraw).toEqual(component.elWidth);
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
});
diff --git a/spec/javascripts/monitoring/dashboard_state_spec.js b/spec/javascripts/monitoring/dashboard_state_spec.js
index b4c5f4baa78..6b2be83aa8c 100644
--- a/spec/javascripts/monitoring/dashboard_state_spec.js
+++ b/spec/javascripts/monitoring/dashboard_state_spec.js
@@ -56,9 +56,17 @@ describe('EmptyState', () => {
});
expect(component.$el.querySelector('svg')).toBeDefined();
- expect(getTextFromNode(component, '.state-title')).toEqual(component.states.gettingStarted.title);
- expect(getTextFromNode(component, '.state-description')).toEqual(component.states.gettingStarted.description);
- expect(getTextFromNode(component, '.btn-success')).toEqual(component.states.gettingStarted.buttonText);
+ expect(getTextFromNode(component, '.state-title')).toEqual(
+ component.states.gettingStarted.title,
+ );
+
+ expect(getTextFromNode(component, '.state-description')).toEqual(
+ component.states.gettingStarted.description,
+ );
+
+ expect(getTextFromNode(component, '.btn-success')).toEqual(
+ component.states.gettingStarted.buttonText,
+ );
});
it('should show the loading state', () => {
@@ -68,7 +76,10 @@ describe('EmptyState', () => {
expect(component.$el.querySelector('svg')).toBeDefined();
expect(getTextFromNode(component, '.state-title')).toEqual(component.states.loading.title);
- expect(getTextFromNode(component, '.state-description')).toEqual(component.states.loading.description);
+ expect(getTextFromNode(component, '.state-description')).toEqual(
+ component.states.loading.description,
+ );
+
expect(getTextFromNode(component, '.btn-success')).toEqual(component.states.loading.buttonText);
});
@@ -78,8 +89,13 @@ describe('EmptyState', () => {
});
expect(component.$el.querySelector('svg')).toBeDefined();
- expect(getTextFromNode(component, '.state-title')).toEqual(component.states.unableToConnect.title);
+ expect(getTextFromNode(component, '.state-title')).toEqual(
+ component.states.unableToConnect.title,
+ );
+
expect(component.$el.querySelector('.state-description a')).toBeDefined();
- expect(getTextFromNode(component, '.btn-success')).toEqual(component.states.unableToConnect.buttonText);
+ expect(getTextFromNode(component, '.btn-success')).toEqual(
+ component.states.unableToConnect.buttonText,
+ );
});
});
diff --git a/spec/javascripts/monitoring/graph/deployment_spec.js b/spec/javascripts/monitoring/graph/deployment_spec.js
index d07db871d69..7d39c4345d2 100644
--- a/spec/javascripts/monitoring/graph/deployment_spec.js
+++ b/spec/javascripts/monitoring/graph/deployment_spec.js
@@ -2,7 +2,7 @@ import Vue from 'vue';
import GraphDeployment from '~/monitoring/components/graph/deployment.vue';
import { deploymentData } from '../mock_data';
-const createComponent = (propsData) => {
+const createComponent = propsData => {
const Component = Vue.extend(GraphDeployment);
return new Component({
@@ -33,9 +33,7 @@ describe('MonitoringDeployment', () => {
graphHeightOffset: 120,
});
- expect(
- component.transformDeploymentGroup({ xPos: 16 }),
- ).toContain('translate(11, 20)');
+ expect(component.transformDeploymentGroup({ xPos: 16 })).toContain('translate(11, 20)');
});
describe('Computed props', () => {
diff --git a/spec/javascripts/monitoring/graph/flag_spec.js b/spec/javascripts/monitoring/graph/flag_spec.js
index 19278312b6d..038bfffd44f 100644
--- a/spec/javascripts/monitoring/graph/flag_spec.js
+++ b/spec/javascripts/monitoring/graph/flag_spec.js
@@ -2,7 +2,7 @@ import Vue from 'vue';
import GraphFlag from '~/monitoring/components/graph/flag.vue';
import { deploymentData } from '../mock_data';
-const createComponent = (propsData) => {
+const createComponent = propsData => {
const Component = Vue.extend(GraphFlag);
return new Component({
@@ -35,7 +35,7 @@ const defaultValuesComponent = {
unitOfDisplay: 'ms',
currentDataIndex: 0,
legendTitle: 'Average',
- currentCoordinates: [],
+ currentCoordinates: {},
};
const deploymentFlagData = {
@@ -51,8 +51,7 @@ describe('GraphFlag', () => {
it('has a line at the currentXCoordinate', () => {
component = createComponent(defaultValuesComponent);
- expect(component.$el.style.left)
- .toEqual(`${70 + component.currentXCoordinate}px`);
+ expect(component.$el.style.left).toEqual(`${70 + component.currentXCoordinate}px`);
});
describe('Deployment flag', () => {
@@ -62,9 +61,7 @@ describe('GraphFlag', () => {
deploymentFlagData,
});
- expect(
- deploymentFlagComponent.$el.querySelector('.popover-title'),
- ).toContainText('Deployed');
+ expect(deploymentFlagComponent.$el.querySelector('.popover-title')).toContainText('Deployed');
});
it('contains the ref when a tag is available', () => {
@@ -78,13 +75,13 @@ describe('GraphFlag', () => {
},
});
- expect(
- deploymentFlagComponent.$el.querySelector('.deploy-meta-content'),
- ).toContainText('f5bcd1d9');
+ expect(deploymentFlagComponent.$el.querySelector('.deploy-meta-content')).toContainText(
+ 'f5bcd1d9',
+ );
- expect(
- deploymentFlagComponent.$el.querySelector('.deploy-meta-content'),
- ).toContainText('1.0');
+ expect(deploymentFlagComponent.$el.querySelector('.deploy-meta-content')).toContainText(
+ '1.0',
+ );
});
it('does not contain the ref when a tag is unavailable', () => {
@@ -98,13 +95,13 @@ describe('GraphFlag', () => {
},
});
- expect(
- deploymentFlagComponent.$el.querySelector('.deploy-meta-content'),
- ).toContainText('f5bcd1d9');
+ expect(deploymentFlagComponent.$el.querySelector('.deploy-meta-content')).toContainText(
+ 'f5bcd1d9',
+ );
- expect(
- deploymentFlagComponent.$el.querySelector('.deploy-meta-content'),
- ).not.toContainText('1.0');
+ expect(deploymentFlagComponent.$el.querySelector('.deploy-meta-content')).not.toContainText(
+ '1.0',
+ );
});
});
diff --git a/spec/javascripts/monitoring/graph/legend_spec.js b/spec/javascripts/monitoring/graph/legend_spec.js
index abcc51aa077..9209e77dcf4 100644
--- a/spec/javascripts/monitoring/graph/legend_spec.js
+++ b/spec/javascripts/monitoring/graph/legend_spec.js
@@ -8,7 +8,7 @@ const convertedMetrics = convertDatesMultipleSeries(singleRowMetricsMultipleSeri
const defaultValuesComponent = {};
-const timeSeries = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
+const { timeSeries } = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
defaultValuesComponent.timeSeries = timeSeries;
diff --git a/spec/javascripts/monitoring/graph/track_info_spec.js b/spec/javascripts/monitoring/graph/track_info_spec.js
index d3121d553f9..ce93ae28842 100644
--- a/spec/javascripts/monitoring/graph/track_info_spec.js
+++ b/spec/javascripts/monitoring/graph/track_info_spec.js
@@ -5,7 +5,7 @@ import createTimeSeries from '~/monitoring/utils/multiple_time_series';
import { singleRowMetricsMultipleSeries, convertDatesMultipleSeries } from '../mock_data';
const convertedMetrics = convertDatesMultipleSeries(singleRowMetricsMultipleSeries);
-const timeSeries = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
+const { timeSeries } = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
describe('TrackInfo component', () => {
let vm;
diff --git a/spec/javascripts/monitoring/graph/track_line_spec.js b/spec/javascripts/monitoring/graph/track_line_spec.js
index 27602a861eb..2a4f89ddf6e 100644
--- a/spec/javascripts/monitoring/graph/track_line_spec.js
+++ b/spec/javascripts/monitoring/graph/track_line_spec.js
@@ -5,7 +5,7 @@ import createTimeSeries from '~/monitoring/utils/multiple_time_series';
import { singleRowMetricsMultipleSeries, convertDatesMultipleSeries } from '../mock_data';
const convertedMetrics = convertDatesMultipleSeries(singleRowMetricsMultipleSeries);
-const timeSeries = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
+const { timeSeries } = createTimeSeries(convertedMetrics[0].queries, 500, 300, 120);
describe('TrackLine component', () => {
let vm;
diff --git a/spec/javascripts/monitoring/graph_path_spec.js b/spec/javascripts/monitoring/graph_path_spec.js
index 2515e2ad897..fd167b83d51 100644
--- a/spec/javascripts/monitoring/graph_path_spec.js
+++ b/spec/javascripts/monitoring/graph_path_spec.js
@@ -3,7 +3,7 @@ import GraphPath from '~/monitoring/components/graph/path.vue';
import createTimeSeries from '~/monitoring/utils/multiple_time_series';
import { singleRowMetricsMultipleSeries, convertDatesMultipleSeries } from './mock_data';
-const createComponent = (propsData) => {
+const createComponent = propsData => {
const Component = Vue.extend(GraphPath);
return new Component({
@@ -13,7 +13,7 @@ const createComponent = (propsData) => {
const convertedMetrics = convertDatesMultipleSeries(singleRowMetricsMultipleSeries);
-const timeSeries = createTimeSeries(convertedMetrics[0].queries, 428, 272, 120);
+const { timeSeries } = createTimeSeries(convertedMetrics[0].queries, 428, 272, 120);
const firstTimeSeries = timeSeries[0];
describe('Monitoring Paths', () => {
@@ -45,9 +45,11 @@ describe('Monitoring Paths', () => {
});
component.lineStyle = 'dashed';
+
expect(component.strokeDashArray).toBe('3, 1');
component.lineStyle = 'dotted';
+
expect(component.strokeDashArray).toBe('1, 1');
});
});
diff --git a/spec/javascripts/monitoring/graph_spec.js b/spec/javascripts/monitoring/graph_spec.js
index a46a387a534..4cc18afdf24 100644
--- a/spec/javascripts/monitoring/graph_spec.js
+++ b/spec/javascripts/monitoring/graph_spec.js
@@ -1,7 +1,6 @@
import Vue from 'vue';
import Graph from '~/monitoring/components/graph.vue';
import MonitoringMixins from '~/monitoring/mixins/monitoring_mixins';
-import eventHub from '~/monitoring/event_hub';
import {
deploymentData,
convertDatesMultipleSeries,
@@ -50,6 +49,7 @@ describe('Graph', () => {
});
const transformedHeight = `${component.graphHeight - 100}`;
+
expect(component.axisTransform.indexOf(transformedHeight)).not.toEqual(-1);
});
@@ -63,29 +63,13 @@ describe('Graph', () => {
});
const viewBoxArray = component.outerViewBox.split(' ');
+
expect(typeof component.outerViewBox).toEqual('string');
expect(viewBoxArray[2]).toEqual(component.graphWidth.toString());
expect(viewBoxArray[3]).toEqual((component.graphHeight - 50).toString());
});
});
- it('sends an event to the eventhub when it has finished resizing', done => {
- const component = createComponent({
- graphData: convertedMetrics[1],
- updateAspectRatio: false,
- deploymentData,
- tagsPath,
- projectPath,
- });
- spyOn(eventHub, '$emit');
-
- component.updateAspectRatio = true;
- Vue.nextTick(() => {
- expect(eventHub.$emit).toHaveBeenCalled();
- done();
- });
- });
-
it('has a title for the y-axis and the chart legend that comes from the backend', () => {
const component = createComponent({
graphData: convertedMetrics[1],
@@ -113,7 +97,11 @@ describe('Graph', () => {
projectPath,
});
+ // simulate moving mouse over data series
+ component.seriesUnderMouse = component.timeSeries;
+
component.positionFlag();
+
expect(component.currentData).toBe(component.timeSeries[0].values[10]);
});
});
diff --git a/spec/javascripts/monitoring/mock_data.js b/spec/javascripts/monitoring/mock_data.js
index e4c98a3bcb5..6c833b17f98 100644
--- a/spec/javascripts/monitoring/mock_data.js
+++ b/spec/javascripts/monitoring/mock_data.js
@@ -8,6 +8,7 @@ export const metricsGroupsAPIResponse = {
priority: 1,
metrics: [
{
+ id: 5,
title: 'Memory usage',
weight: 1,
queries: [
diff --git a/spec/javascripts/monitoring/monitoring_store_spec.js b/spec/javascripts/monitoring/monitoring_store_spec.js
index ccdf4eda563..bf68c911549 100644
--- a/spec/javascripts/monitoring/monitoring_store_spec.js
+++ b/spec/javascripts/monitoring/monitoring_store_spec.js
@@ -1,7 +1,7 @@
import MonitoringStore from '~/monitoring/stores/monitoring_store';
import MonitoringMock, { deploymentData, environmentData } from './mock_data';
-describe('MonitoringStore', function () {
+describe('MonitoringStore', function() {
this.store = new MonitoringStore();
this.store.storeMetrics(MonitoringMock.data);
@@ -17,6 +17,7 @@ describe('MonitoringStore', function () {
it('contains deployment data', () => {
this.store.storeDeploymentData(deploymentData);
+
expect(this.store.deploymentData).toBeDefined();
expect(this.store.deploymentData.length).toEqual(3);
expect(typeof this.store.deploymentData[0]).toEqual('object');
@@ -24,6 +25,7 @@ describe('MonitoringStore', function () {
it('only stores environment data that contains deployments', () => {
this.store.storeEnvironmentsData(environmentData);
+
expect(this.store.environmentsData.length).toEqual(2);
});
});
diff --git a/spec/javascripts/monitoring/utils/multiple_time_series_spec.js b/spec/javascripts/monitoring/utils/multiple_time_series_spec.js
index 99584c75287..8937b7d9680 100644
--- a/spec/javascripts/monitoring/utils/multiple_time_series_spec.js
+++ b/spec/javascripts/monitoring/utils/multiple_time_series_spec.js
@@ -2,7 +2,7 @@ import createTimeSeries from '~/monitoring/utils/multiple_time_series';
import { convertDatesMultipleSeries, singleRowMetricsMultipleSeries } from '../mock_data';
const convertedMetrics = convertDatesMultipleSeries(singleRowMetricsMultipleSeries);
-const timeSeries = createTimeSeries(convertedMetrics[0].queries, 428, 272, 120);
+const { timeSeries } = createTimeSeries(convertedMetrics[0].queries, 428, 272, 120);
const firstTimeSeries = timeSeries[0];
describe('Multiple time series', () => {
diff --git a/spec/javascripts/new_branch_spec.js b/spec/javascripts/new_branch_spec.js
index 122e5bc58b2..1d7b885e64f 100644
--- a/spec/javascripts/new_branch_spec.js
+++ b/spec/javascripts/new_branch_spec.js
@@ -1,168 +1,199 @@
-/* eslint-disable one-var, no-var, one-var-declaration-per-line, no-return-assign, quotes, max-len */
-
import $ from 'jquery';
import NewBranchForm from '~/new_branch_form';
-(function() {
- describe('Branch', function() {
- return describe('create a new branch', function() {
- var expectToHaveError, fillNameWith;
- preloadFixtures('branches/new_branch.html.raw');
- fillNameWith = function(value) {
- return $('.js-branch-name').val(value).trigger('blur');
- };
- expectToHaveError = function(error) {
- return expect($('.js-branch-name-error span').text()).toEqual(error);
- };
- beforeEach(function() {
- loadFixtures('branches/new_branch.html.raw');
- $('form').on('submit', function(e) {
- return e.preventDefault();
- });
- return this.form = new NewBranchForm($('.js-create-branch-form'), []);
- });
- it("can't start with a dot", function() {
- fillNameWith('.foo');
- return expectToHaveError("can't start with '.'");
- });
- it("can't start with a slash", function() {
- fillNameWith('/foo');
- return expectToHaveError("can't start with '/'");
- });
- it("can't have two consecutive dots", function() {
- fillNameWith('foo..bar');
- return expectToHaveError("can't contain '..'");
- });
- it("can't have spaces anywhere", function() {
- fillNameWith(' foo');
- expectToHaveError("can't contain spaces");
- fillNameWith('foo bar');
- expectToHaveError("can't contain spaces");
- fillNameWith('foo ');
- return expectToHaveError("can't contain spaces");
- });
- it("can't have ~ anywhere", function() {
- fillNameWith('~foo');
- expectToHaveError("can't contain '~'");
- fillNameWith('foo~bar');
- expectToHaveError("can't contain '~'");
- fillNameWith('foo~');
- return expectToHaveError("can't contain '~'");
- });
- it("can't have tilde anwhere", function() {
- fillNameWith('~foo');
- expectToHaveError("can't contain '~'");
- fillNameWith('foo~bar');
- expectToHaveError("can't contain '~'");
- fillNameWith('foo~');
- return expectToHaveError("can't contain '~'");
- });
- it("can't have caret anywhere", function() {
- fillNameWith('^foo');
- expectToHaveError("can't contain '^'");
- fillNameWith('foo^bar');
- expectToHaveError("can't contain '^'");
- fillNameWith('foo^');
- return expectToHaveError("can't contain '^'");
- });
- it("can't have : anywhere", function() {
- fillNameWith(':foo');
- expectToHaveError("can't contain ':'");
- fillNameWith('foo:bar');
- expectToHaveError("can't contain ':'");
- fillNameWith(':foo');
- return expectToHaveError("can't contain ':'");
- });
- it("can't have question mark anywhere", function() {
- fillNameWith('?foo');
- expectToHaveError("can't contain '?'");
- fillNameWith('foo?bar');
- expectToHaveError("can't contain '?'");
- fillNameWith('foo?');
- return expectToHaveError("can't contain '?'");
- });
- it("can't have asterisk anywhere", function() {
- fillNameWith('*foo');
- expectToHaveError("can't contain '*'");
- fillNameWith('foo*bar');
- expectToHaveError("can't contain '*'");
- fillNameWith('foo*');
- return expectToHaveError("can't contain '*'");
- });
- it("can't have open bracket anywhere", function() {
- fillNameWith('[foo');
- expectToHaveError("can't contain '['");
- fillNameWith('foo[bar');
- expectToHaveError("can't contain '['");
- fillNameWith('foo[');
- return expectToHaveError("can't contain '['");
- });
- it("can't have a backslash anywhere", function() {
- fillNameWith('\\foo');
- expectToHaveError("can't contain '\\'");
- fillNameWith('foo\\bar');
- expectToHaveError("can't contain '\\'");
- fillNameWith('foo\\');
- return expectToHaveError("can't contain '\\'");
- });
- it("can't contain a sequence @{ anywhere", function() {
- fillNameWith('@{foo');
- expectToHaveError("can't contain '@{'");
- fillNameWith('foo@{bar');
- expectToHaveError("can't contain '@{'");
- fillNameWith('foo@{');
- return expectToHaveError("can't contain '@{'");
- });
- it("can't have consecutive slashes", function() {
- fillNameWith('foo//bar');
- return expectToHaveError("can't contain consecutive slashes");
- });
- it("can't end with a slash", function() {
- fillNameWith('foo/');
- return expectToHaveError("can't end in '/'");
- });
- it("can't end with a dot", function() {
- fillNameWith('foo.');
- return expectToHaveError("can't end in '.'");
- });
- it("can't end with .lock", function() {
- fillNameWith('foo.lock');
- return expectToHaveError("can't end in '.lock'");
- });
- it("can't be the single character @", function() {
- fillNameWith('@');
- return expectToHaveError("can't be '@'");
- });
- it("concatenates all error messages", function() {
- fillNameWith('/foo bar?~.');
- return expectToHaveError("can't start with '/', can't contain spaces, '?', '~', can't end in '.'");
- });
- it("doesn't duplicate error messages", function() {
- fillNameWith('?foo?bar?zoo?');
- return expectToHaveError("can't contain '?'");
- });
- it("removes the error message when is a valid name", function() {
- fillNameWith('foo?bar');
- expect($('.js-branch-name-error span').length).toEqual(1);
- fillNameWith('foobar');
- return expect($('.js-branch-name-error span').length).toEqual(0);
- });
- it("can have dashes anywhere", function() {
- fillNameWith('-foo-bar-zoo-');
- return expect($('.js-branch-name-error span').length).toEqual(0);
- });
- it("can have underscores anywhere", function() {
- fillNameWith('_foo_bar_zoo_');
- return expect($('.js-branch-name-error span').length).toEqual(0);
- });
- it("can have numbers anywhere", function() {
- fillNameWith('1foo2bar3zoo4');
- return expect($('.js-branch-name-error span').length).toEqual(0);
- });
- return it("can be only letters", function() {
- fillNameWith('foo');
- return expect($('.js-branch-name-error span').length).toEqual(0);
+describe('Branch', function() {
+ describe('create a new branch', function() {
+ preloadFixtures('branches/new_branch.html.raw');
+
+ function fillNameWith(value) {
+ $('.js-branch-name')
+ .val(value)
+ .trigger('blur');
+ }
+
+ function expectToHaveError(error) {
+ expect($('.js-branch-name-error span').text()).toEqual(error);
+ }
+
+ beforeEach(function() {
+ loadFixtures('branches/new_branch.html.raw');
+ $('form').on('submit', function(e) {
+ return e.preventDefault();
});
+ this.form = new NewBranchForm($('.js-create-branch-form'), []);
+ });
+
+ it("can't start with a dot", function() {
+ fillNameWith('.foo');
+ expectToHaveError("can't start with '.'");
+ });
+
+ it("can't start with a slash", function() {
+ fillNameWith('/foo');
+ expectToHaveError("can't start with '/'");
+ });
+
+ it("can't have two consecutive dots", function() {
+ fillNameWith('foo..bar');
+ expectToHaveError("can't contain '..'");
+ });
+
+ it("can't have spaces anywhere", function() {
+ fillNameWith(' foo');
+ expectToHaveError("can't contain spaces");
+ fillNameWith('foo bar');
+ expectToHaveError("can't contain spaces");
+ fillNameWith('foo ');
+ expectToHaveError("can't contain spaces");
+ });
+
+ it("can't have ~ anywhere", function() {
+ fillNameWith('~foo');
+ expectToHaveError("can't contain '~'");
+ fillNameWith('foo~bar');
+ expectToHaveError("can't contain '~'");
+ fillNameWith('foo~');
+ expectToHaveError("can't contain '~'");
+ });
+
+ it("can't have tilde anwhere", function() {
+ fillNameWith('~foo');
+ expectToHaveError("can't contain '~'");
+ fillNameWith('foo~bar');
+ expectToHaveError("can't contain '~'");
+ fillNameWith('foo~');
+ expectToHaveError("can't contain '~'");
+ });
+
+ it("can't have caret anywhere", function() {
+ fillNameWith('^foo');
+ expectToHaveError("can't contain '^'");
+ fillNameWith('foo^bar');
+ expectToHaveError("can't contain '^'");
+ fillNameWith('foo^');
+ expectToHaveError("can't contain '^'");
+ });
+
+ it("can't have : anywhere", function() {
+ fillNameWith(':foo');
+ expectToHaveError("can't contain ':'");
+ fillNameWith('foo:bar');
+ expectToHaveError("can't contain ':'");
+ fillNameWith(':foo');
+ expectToHaveError("can't contain ':'");
+ });
+
+ it("can't have question mark anywhere", function() {
+ fillNameWith('?foo');
+ expectToHaveError("can't contain '?'");
+ fillNameWith('foo?bar');
+ expectToHaveError("can't contain '?'");
+ fillNameWith('foo?');
+ expectToHaveError("can't contain '?'");
+ });
+
+ it("can't have asterisk anywhere", function() {
+ fillNameWith('*foo');
+ expectToHaveError("can't contain '*'");
+ fillNameWith('foo*bar');
+ expectToHaveError("can't contain '*'");
+ fillNameWith('foo*');
+ expectToHaveError("can't contain '*'");
+ });
+
+ it("can't have open bracket anywhere", function() {
+ fillNameWith('[foo');
+ expectToHaveError("can't contain '['");
+ fillNameWith('foo[bar');
+ expectToHaveError("can't contain '['");
+ fillNameWith('foo[');
+ expectToHaveError("can't contain '['");
+ });
+
+ it("can't have a backslash anywhere", function() {
+ fillNameWith('\\foo');
+ expectToHaveError("can't contain '\\'");
+ fillNameWith('foo\\bar');
+ expectToHaveError("can't contain '\\'");
+ fillNameWith('foo\\');
+ expectToHaveError("can't contain '\\'");
+ });
+
+ it("can't contain a sequence @{ anywhere", function() {
+ fillNameWith('@{foo');
+ expectToHaveError("can't contain '@{'");
+ fillNameWith('foo@{bar');
+ expectToHaveError("can't contain '@{'");
+ fillNameWith('foo@{');
+ expectToHaveError("can't contain '@{'");
+ });
+
+ it("can't have consecutive slashes", function() {
+ fillNameWith('foo//bar');
+ expectToHaveError("can't contain consecutive slashes");
+ });
+
+ it("can't end with a slash", function() {
+ fillNameWith('foo/');
+ expectToHaveError("can't end in '/'");
+ });
+
+ it("can't end with a dot", function() {
+ fillNameWith('foo.');
+ expectToHaveError("can't end in '.'");
+ });
+
+ it("can't end with .lock", function() {
+ fillNameWith('foo.lock');
+ expectToHaveError("can't end in '.lock'");
+ });
+
+ it("can't be the single character @", function() {
+ fillNameWith('@');
+ expectToHaveError("can't be '@'");
+ });
+
+ it('concatenates all error messages', function() {
+ fillNameWith('/foo bar?~.');
+ expectToHaveError("can't start with '/', can't contain spaces, '?', '~', can't end in '.'");
+ });
+
+ it("doesn't duplicate error messages", function() {
+ fillNameWith('?foo?bar?zoo?');
+ expectToHaveError("can't contain '?'");
+ });
+
+ it('removes the error message when is a valid name', function() {
+ fillNameWith('foo?bar');
+
+ expect($('.js-branch-name-error span').length).toEqual(1);
+ fillNameWith('foobar');
+
+ expect($('.js-branch-name-error span').length).toEqual(0);
+ });
+
+ it('can have dashes anywhere', function() {
+ fillNameWith('-foo-bar-zoo-');
+
+ expect($('.js-branch-name-error span').length).toEqual(0);
+ });
+
+ it('can have underscores anywhere', function() {
+ fillNameWith('_foo_bar_zoo_');
+
+ expect($('.js-branch-name-error span').length).toEqual(0);
+ });
+
+ it('can have numbers anywhere', function() {
+ fillNameWith('1foo2bar3zoo4');
+
+ expect($('.js-branch-name-error span').length).toEqual(0);
+ });
+
+ it('can be only letters', function() {
+ fillNameWith('foo');
+
+ expect($('.js-branch-name-error span').length).toEqual(0);
});
});
-}).call(window);
+});
diff --git a/spec/javascripts/notebook/cells/code_spec.js b/spec/javascripts/notebook/cells/code_spec.js
index 0c432d73f67..4659b83d1b6 100644
--- a/spec/javascripts/notebook/cells/code_spec.js
+++ b/spec/javascripts/notebook/cells/code_spec.js
@@ -12,7 +12,7 @@ describe('Code component', () => {
});
describe('without output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
cell: json.cells[0],
@@ -31,7 +31,7 @@ describe('Code component', () => {
});
describe('with output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
cell: json.cells[2],
diff --git a/spec/javascripts/notebook/cells/markdown_spec.js b/spec/javascripts/notebook/cells/markdown_spec.js
index 0b1b11de1fd..540fc8a21f1 100644
--- a/spec/javascripts/notebook/cells/markdown_spec.js
+++ b/spec/javascripts/notebook/cells/markdown_spec.js
@@ -11,7 +11,7 @@ describe('Markdown component', () => {
let cell;
let json;
- beforeEach((done) => {
+ beforeEach(done => {
json = getJSONFixture('blob/notebook/basic.json');
// eslint-disable-next-line prefer-destructuring
@@ -34,18 +34,18 @@ describe('Markdown component', () => {
});
it('does not render the markdown text', () => {
- expect(
- vm.$el.querySelector('.markdown').innerHTML.trim(),
- ).not.toEqual(cell.source.join(''));
+ expect(vm.$el.querySelector('.markdown').innerHTML.trim()).not.toEqual(cell.source.join(''));
});
it('renders the markdown HTML', () => {
expect(vm.$el.querySelector('.markdown h1')).not.toBeNull();
});
- it('sanitizes output', (done) => {
+ it('sanitizes output', done => {
Object.assign(cell, {
- source: ['[XSS](data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+Cg==)\n'],
+ source: [
+ '[XSS](data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+Cg==)\n',
+ ],
});
Vue.nextTick(() => {
@@ -60,7 +60,7 @@ describe('Markdown component', () => {
json = getJSONFixture('blob/notebook/math.json');
});
- it('renders multi-line katex', (done) => {
+ it('renders multi-line katex', done => {
vm = new Component({
propsData: {
cell: json.cells[0],
@@ -68,15 +68,13 @@ describe('Markdown component', () => {
}).$mount();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.katex'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.katex')).not.toBeNull();
done();
});
});
- it('renders inline katex', (done) => {
+ it('renders inline katex', done => {
vm = new Component({
propsData: {
cell: json.cells[1],
@@ -84,15 +82,13 @@ describe('Markdown component', () => {
}).$mount();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('p:first-child .katex'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('p:first-child .katex')).not.toBeNull();
done();
});
});
- it('renders multiple inline katex', (done) => {
+ it('renders multiple inline katex', done => {
vm = new Component({
propsData: {
cell: json.cells[1],
@@ -100,9 +96,7 @@ describe('Markdown component', () => {
}).$mount();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelectorAll('p:nth-child(2) .katex').length,
- ).toBe(4);
+ expect(vm.$el.querySelectorAll('p:nth-child(2) .katex').length).toBe(4);
done();
});
diff --git a/spec/javascripts/notebook/cells/output/html_sanitize_tests.js b/spec/javascripts/notebook/cells/output/html_sanitize_tests.js
index d587573fc9e..74c48f04367 100644
--- a/spec/javascripts/notebook/cells/output/html_sanitize_tests.js
+++ b/spec/javascripts/notebook/cells/output/html_sanitize_tests.js
@@ -28,7 +28,8 @@ export default {
output: '<a>foo</a>',
},
'protocol-based JS injection: long UTF-8 encoding without semicolons': {
- input: '<a href=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>foo</a>',
+ input:
+ '<a href=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>foo</a>',
output: '<a>foo</a>',
},
'protocol-based JS injection: hex encoding': {
@@ -40,7 +41,8 @@ export default {
output: '<a>foo</a>',
},
'protocol-based JS injection: hex encoding without semicolons': {
- input: '<a href=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>foo</a>',
+ input:
+ '<a href=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>foo</a>',
output: '<a>foo</a>',
},
'protocol-based JS injection: null char': {
@@ -48,7 +50,7 @@ export default {
output: '<a>foo</a>',
},
'protocol-based JS injection: invalid URL char': {
- input: '<img src=java\script:alert("XSS")>', // eslint-disable-line no-useless-escape
+ input: '<img src=javascript:alert("XSS")>',
output: '<img>',
},
'protocol-based JS injection: Unicode': {
diff --git a/spec/javascripts/notebook/cells/output/html_spec.js b/spec/javascripts/notebook/cells/output/html_spec.js
index 9c5385f2922..bea62f54634 100644
--- a/spec/javascripts/notebook/cells/output/html_spec.js
+++ b/spec/javascripts/notebook/cells/output/html_spec.js
@@ -14,7 +14,7 @@ describe('html output cell', () => {
}
describe('sanitizes output', () => {
- Object.keys(sanitizeTests).forEach((key) => {
+ Object.keys(sanitizeTests).forEach(key => {
it(key, () => {
const test = sanitizeTests[key];
const vm = createComponent(test.input);
diff --git a/spec/javascripts/notebook/cells/output/index_spec.js b/spec/javascripts/notebook/cells/output/index_spec.js
index dbf79f85c7c..feab7ad4212 100644
--- a/spec/javascripts/notebook/cells/output/index_spec.js
+++ b/spec/javascripts/notebook/cells/output/index_spec.js
@@ -7,7 +7,7 @@ describe('Output component', () => {
let vm;
let json;
- const createComponent = (output) => {
+ const createComponent = output => {
vm = new Component({
propsData: {
output,
@@ -22,7 +22,7 @@ describe('Output component', () => {
});
describe('text output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
createComponent(json.cells[2].outputs[0]);
setTimeout(() => {
@@ -40,7 +40,7 @@ describe('Output component', () => {
});
describe('image output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
createComponent(json.cells[3].outputs[0]);
setTimeout(() => {
@@ -58,7 +58,7 @@ describe('Output component', () => {
});
describe('html output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
createComponent(json.cells[4].outputs[0]);
setTimeout(() => {
@@ -77,7 +77,7 @@ describe('Output component', () => {
});
describe('svg output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
createComponent(json.cells[5].outputs[0]);
setTimeout(() => {
@@ -95,7 +95,7 @@ describe('Output component', () => {
});
describe('default to plain text', () => {
- beforeEach((done) => {
+ beforeEach(done => {
createComponent(json.cells[6].outputs[0]);
setTimeout(() => {
@@ -112,7 +112,7 @@ describe('Output component', () => {
expect(vm.$el.querySelector('.prompt span')).not.toBeNull();
});
- it('renders as plain text when doesn\'t recognise other types', (done) => {
+ it("renders as plain text when doesn't recognise other types", done => {
createComponent(json.cells[7].outputs[0]);
setTimeout(() => {
diff --git a/spec/javascripts/notebook/cells/prompt_spec.js b/spec/javascripts/notebook/cells/prompt_spec.js
index 207fa433a59..cbbcb1e68e3 100644
--- a/spec/javascripts/notebook/cells/prompt_spec.js
+++ b/spec/javascripts/notebook/cells/prompt_spec.js
@@ -7,7 +7,7 @@ describe('Prompt component', () => {
let vm;
describe('input', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
type: 'In',
@@ -31,7 +31,7 @@ describe('Prompt component', () => {
});
describe('output', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
type: 'Out',
diff --git a/spec/javascripts/notebook/index_spec.js b/spec/javascripts/notebook/index_spec.js
index bd63ab35426..2e2ea5ad8af 100644
--- a/spec/javascripts/notebook/index_spec.js
+++ b/spec/javascripts/notebook/index_spec.js
@@ -14,7 +14,7 @@ describe('Notebook component', () => {
});
describe('without JSON', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
notebook: {},
@@ -33,7 +33,7 @@ describe('Notebook component', () => {
});
describe('with JSON', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
notebook: json,
@@ -65,7 +65,7 @@ describe('Notebook component', () => {
});
describe('with worksheets', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
notebook: jsonWithWorksheet,
@@ -80,7 +80,9 @@ describe('Notebook component', () => {
});
it('renders cells', () => {
- expect(vm.$el.querySelectorAll('.cell').length).toBe(jsonWithWorksheet.worksheets[0].cells.length);
+ expect(vm.$el.querySelectorAll('.cell').length).toBe(
+ jsonWithWorksheet.worksheets[0].cells.length,
+ );
});
it('renders markdown cell', () => {
diff --git a/spec/javascripts/notes/components/comment_form_spec.js b/spec/javascripts/notes/components/comment_form_spec.js
index 155c91dcc46..3c57fe51352 100644
--- a/spec/javascripts/notes/components/comment_form_spec.js
+++ b/spec/javascripts/notes/components/comment_form_spec.js
@@ -51,6 +51,7 @@ describe('issue_comment_form component', () => {
spyOn(vm, 'stopPolling');
vm.handleSave();
+
expect(vm.isSubmitting).toEqual(true);
expect(vm.note).toEqual('');
expect(vm.saveNote).toHaveBeenCalled();
@@ -77,10 +78,14 @@ describe('issue_comment_form component', () => {
vm.handleSave();
Vue.nextTick()
- .then(() => expect(actionButton.disabled).toBeTruthy())
+ .then(() => {
+ expect(actionButton.disabled).toBeTruthy();
+ })
.then(saveNotePromise)
.then(Vue.nextTick)
- .then(() => expect(actionButton.disabled).toBeFalsy())
+ .then(() => {
+ expect(actionButton.disabled).toBeFalsy();
+ })
.then(done)
.catch(done.fail);
});
@@ -121,6 +126,7 @@ describe('issue_comment_form component', () => {
it('should link to markdown docs', () => {
const { markdownDocsPath } = notesDataMock;
+
expect(vm.$el.querySelector(`a[href="${markdownDocsPath}"]`).textContent.trim()).toEqual(
'Markdown',
);
@@ -128,6 +134,7 @@ describe('issue_comment_form component', () => {
it('should link to quick actions docs', () => {
const { quickActionsDocsPath } = notesDataMock;
+
expect(
vm.$el.querySelector(`a[href="${quickActionsDocsPath}"]`).textContent.trim(),
).toEqual('quick actions');
@@ -215,6 +222,7 @@ describe('issue_comment_form component', () => {
expect(vm.$el.querySelector('.btn-comment-and-close').textContent.trim()).toEqual(
'Comment & close issue',
);
+
expect(vm.$el.querySelector('.js-note-discard')).toBeDefined();
done();
});
diff --git a/spec/javascripts/notes/components/diff_with_note_spec.js b/spec/javascripts/notes/components/diff_with_note_spec.js
index 239d7950907..95461396f10 100644
--- a/spec/javascripts/notes/components/diff_with_note_spec.js
+++ b/spec/javascripts/notes/components/diff_with_note_spec.js
@@ -1,7 +1,6 @@
import Vue from 'vue';
import DiffWithNote from '~/notes/components/diff_with_note.vue';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import createStore from '~/notes/stores';
+import { createStore } from '~/mr_notes/stores';
import { mountComponentWithStore } from 'spec/helpers';
const discussionFixture = 'merge_requests/diff_discussion.json';
@@ -11,7 +10,7 @@ describe('diff_with_note', () => {
let store;
let vm;
const diffDiscussionMock = getJSONFixture(discussionFixture)[0];
- const diffDiscussion = convertObjectPropsToCamelCase(diffDiscussionMock);
+ const diffDiscussion = diffDiscussionMock;
const Component = Vue.extend(DiffWithNote);
const props = {
discussion: diffDiscussion,
@@ -65,7 +64,7 @@ describe('diff_with_note', () => {
describe('image diff', () => {
beforeEach(() => {
const imageDiffDiscussionMock = getJSONFixture(imageDiscussionFixture)[0];
- props.discussion = convertObjectPropsToCamelCase(imageDiffDiscussionMock);
+ props.discussion = imageDiffDiscussionMock;
});
it('shows image diff', () => {
diff --git a/spec/javascripts/notes/components/discussion_filter_spec.js b/spec/javascripts/notes/components/discussion_filter_spec.js
new file mode 100644
index 00000000000..9070d968cfd
--- /dev/null
+++ b/spec/javascripts/notes/components/discussion_filter_spec.js
@@ -0,0 +1,86 @@
+import Vue from 'vue';
+import createStore from '~/notes/stores';
+import DiscussionFilter from '~/notes/components/discussion_filter.vue';
+import { mountComponentWithStore } from '../../helpers/vue_mount_component_helper';
+import { discussionFiltersMock, discussionMock } from '../mock_data';
+
+describe('DiscussionFilter component', () => {
+ let vm;
+ let store;
+
+ beforeEach(() => {
+ store = createStore();
+
+ const discussions = [
+ {
+ ...discussionMock,
+ id: discussionMock.id,
+ notes: [{ ...discussionMock.notes[0], resolvable: true, resolved: true }],
+ },
+ ];
+ const Component = Vue.extend(DiscussionFilter);
+ const selectedValue = discussionFiltersMock[0].value;
+
+ store.state.discussions = discussions;
+ vm = mountComponentWithStore(Component, {
+ el: null,
+ store,
+ props: {
+ filters: discussionFiltersMock,
+ selectedValue,
+ },
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders the all filters', () => {
+ expect(vm.$el.querySelectorAll('.dropdown-menu li').length).toEqual(
+ discussionFiltersMock.length,
+ );
+ });
+
+ it('renders the default selected item', () => {
+ expect(vm.$el.querySelector('#discussion-filter-dropdown').textContent.trim()).toEqual(
+ discussionFiltersMock[0].title,
+ );
+ });
+
+ it('updates to the selected item', () => {
+ const filterItem = vm.$el.querySelector('.dropdown-menu li:last-child button');
+ filterItem.click();
+
+ expect(vm.currentFilter.title).toEqual(filterItem.textContent.trim());
+ });
+
+ it('only updates when selected filter changes', () => {
+ const filterItem = vm.$el.querySelector('.dropdown-menu li:first-child button');
+
+ spyOn(vm, 'filterDiscussion');
+ filterItem.click();
+
+ expect(vm.filterDiscussion).not.toHaveBeenCalled();
+ });
+
+ it('disables commenting when "Show history only" filter is applied', () => {
+ const filterItem = vm.$el.querySelector('.dropdown-menu li:last-child button');
+ filterItem.click();
+
+ expect(vm.$store.state.commentsDisabled).toBe(true);
+ });
+
+ it('enables commenting when "Show history only" filter is not applied', () => {
+ const filterItem = vm.$el.querySelector('.dropdown-menu li:first-child button');
+ filterItem.click();
+
+ expect(vm.$store.state.commentsDisabled).toBe(false);
+ });
+
+ it('renders a dropdown divider for the default filter', () => {
+ const defaultFilter = vm.$el.querySelector('.dropdown-menu li:first-child');
+
+ expect(defaultFilter.lastChild.classList).toContain('dropdown-divider');
+ });
+});
diff --git a/spec/javascripts/notes/components/note_actions_spec.js b/spec/javascripts/notes/components/note_actions_spec.js
index 52cc42cb53d..f6c854e6def 100644
--- a/spec/javascripts/notes/components/note_actions_spec.js
+++ b/spec/javascripts/notes/components/note_actions_spec.js
@@ -28,7 +28,7 @@ describe('issue_note_actions component', () => {
canEdit: true,
canAwardEmoji: true,
canReportAsAbuse: true,
- noteId: 539,
+ noteId: '539',
noteUrl: 'https://localhost:3000/group/project/merge_requests/1#note_1',
reportAbusePath:
'/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-ce%2Fissues%2F7%23note_539&user_id=26',
@@ -55,10 +55,24 @@ describe('issue_note_actions component', () => {
expect(vm.$el.querySelector('.js-note-edit')).toBeDefined();
});
- it('should be possible to report as abuse', () => {
+ it('should be possible to report abuse to GitLab', () => {
expect(vm.$el.querySelector(`a[href="${props.reportAbusePath}"]`)).toBeDefined();
});
+ it('should be possible to copy link to a note', () => {
+ expect(vm.$el.querySelector('.js-btn-copy-note-link')).not.toBeNull();
+ });
+
+ it('should not show copy link action when `noteUrl` prop is empty', done => {
+ vm.noteUrl = '';
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.js-btn-copy-note-link')).toBeNull();
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
it('should be possible to delete comment', () => {
expect(vm.$el.querySelector('.js-note-delete')).toBeDefined();
});
@@ -77,7 +91,7 @@ describe('issue_note_actions component', () => {
canEdit: false,
canAwardEmoji: false,
canReportAsAbuse: false,
- noteId: 539,
+ noteId: '539',
noteUrl: 'https://localhost:3000/group/project/merge_requests/1#note_1',
reportAbusePath:
'/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-ce%2Fissues%2F7%23note_539&user_id=26',
diff --git a/spec/javascripts/notes/components/note_app_spec.js b/spec/javascripts/notes/components/note_app_spec.js
index 7eb4d3aed29..0081f42c330 100644
--- a/spec/javascripts/notes/components/note_app_spec.js
+++ b/spec/javascripts/notes/components/note_app_spec.js
@@ -121,6 +121,13 @@ describe('note_app', () => {
).toEqual('Write a comment or drag your files here…');
});
+ it('should not render form when commenting is disabled', () => {
+ store.state.commentsDisabled = true;
+ vm = mountComponent();
+
+ expect(vm.$el.querySelector('.js-main-target-form')).toEqual(null);
+ });
+
it('should render form comment button as disabled', () => {
expect(vm.$el.querySelector('.js-note-new-discussion').getAttribute('disabled')).toEqual(
'disabled',
@@ -223,6 +230,7 @@ describe('note_app', () => {
it('should render markdown docs url', () => {
const { markdownDocsPath } = mockData.notesDataMock;
+
expect(vm.$el.querySelector(`a[href="${markdownDocsPath}"]`).textContent.trim()).toEqual(
'Markdown',
);
@@ -230,6 +238,7 @@ describe('note_app', () => {
it('should render quick action docs url', () => {
const { quickActionsDocsPath } = mockData.notesDataMock;
+
expect(vm.$el.querySelector(`a[href="${quickActionsDocsPath}"]`).textContent.trim()).toEqual(
'quick actions',
);
diff --git a/spec/javascripts/notes/components/note_awards_list_spec.js b/spec/javascripts/notes/components/note_awards_list_spec.js
index 9d98ba219da..6a6a810acff 100644
--- a/spec/javascripts/notes/components/note_awards_list_spec.js
+++ b/spec/javascripts/notes/components/note_awards_list_spec.js
@@ -30,7 +30,7 @@ describe('note_awards_list component', () => {
propsData: {
awards: awardsMock,
noteAuthorId: 2,
- noteId: 545,
+ noteId: '545',
canAwardEmoji: true,
toggleAwardPath: '/gitlab-org/gitlab-ce/notes/545/toggle_award_emoji',
},
@@ -70,7 +70,7 @@ describe('note_awards_list component', () => {
propsData: {
awards: awardsMock,
noteAuthorId: 2,
- noteId: 545,
+ noteId: '545',
canAwardEmoji: false,
toggleAwardPath: '/gitlab-org/gitlab-ce/notes/545/toggle_award_emoji',
},
diff --git a/spec/javascripts/notes/components/note_form_spec.js b/spec/javascripts/notes/components/note_form_spec.js
index 95d400ab3df..5db20fd285f 100644
--- a/spec/javascripts/notes/components/note_form_spec.js
+++ b/spec/javascripts/notes/components/note_form_spec.js
@@ -19,7 +19,7 @@ describe('issue_note_form component', () => {
props = {
isEditing: false,
noteBody: 'Magni suscipit eius consectetur enim et ex et commodi.',
- noteId: 545,
+ noteId: '545',
};
vm = new Component({
@@ -32,6 +32,22 @@ describe('issue_note_form component', () => {
vm.$destroy();
});
+ describe('noteHash', () => {
+ it('returns note hash string based on `noteId`', () => {
+ expect(vm.noteHash).toBe(`#note_${props.noteId}`);
+ });
+
+ it('return note hash as `#` when `noteId` is empty', done => {
+ vm.noteId = '';
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.noteHash).toBe('#');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
describe('conflicts editing', () => {
it('should show conflict message if note changes outside the component', done => {
vm.isEditing = true;
@@ -60,6 +76,7 @@ describe('issue_note_form component', () => {
it('should link to markdown docs', () => {
const { markdownDocsPath } = notesDataMock;
+
expect(vm.$el.querySelector(`a[href="${markdownDocsPath}"]`).textContent.trim()).toEqual(
'Markdown',
);
@@ -84,6 +101,7 @@ describe('issue_note_form component', () => {
expect(vm.handleUpdate).toHaveBeenCalled();
});
+
it('should save note when ctrl+enter is pressed', () => {
spyOn(vm, 'handleUpdate').and.callThrough();
vm.$el.querySelector('textarea').value = 'Foo';
diff --git a/spec/javascripts/notes/components/note_header_spec.js b/spec/javascripts/notes/components/note_header_spec.js
index a3c6bf78988..379780f43a0 100644
--- a/spec/javascripts/notes/components/note_header_spec.js
+++ b/spec/javascripts/notes/components/note_header_spec.js
@@ -33,7 +33,7 @@ describe('note_header component', () => {
},
createdAt: '2017-08-02T10:51:58.559Z',
includeToggle: false,
- noteId: 1394,
+ noteId: '1394',
expanded: true,
},
}).$mount();
@@ -47,6 +47,16 @@ describe('note_header component', () => {
it('should render timestamp link', () => {
expect(vm.$el.querySelector('a[href="#note_1394"]')).toBeDefined();
});
+
+ it('should not render user information when prop `author` is empty object', done => {
+ vm.author = {};
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('.note-header-author-name')).toBeNull();
+ })
+ .then(done)
+ .catch(done.fail);
+ });
});
describe('discussion', () => {
@@ -66,7 +76,7 @@ describe('note_header component', () => {
},
createdAt: '2017-08-02T10:51:58.559Z',
includeToggle: true,
- noteId: 1395,
+ noteId: '1395',
expanded: true,
},
}).$mount();
diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js
index 2a01bd85520..81cb3e1f74d 100644
--- a/spec/javascripts/notes/components/noteable_discussion_spec.js
+++ b/spec/javascripts/notes/components/noteable_discussion_spec.js
@@ -3,6 +3,7 @@ import createStore from '~/notes/stores';
import noteableDiscussion from '~/notes/components/noteable_discussion.vue';
import '~/behaviors/markdown/render_gfm';
import { noteableDataMock, discussionMock, notesDataMock } from '../mock_data';
+import mockDiffFile from '../../diffs/mock_data/diff_file';
const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
@@ -33,9 +34,20 @@ describe('noteable_discussion component', () => {
expect(vm.$el.querySelector('.user-avatar-link')).not.toBeNull();
});
+ it('should not render discussion header for non diff discussions', () => {
+ expect(vm.$el.querySelector('.discussion-header')).toBeNull();
+ });
+
it('should render discussion header', () => {
- expect(vm.$el.querySelector('.discussion-header')).not.toBeNull();
- expect(vm.$el.querySelector('.notes').children.length).toEqual(discussionMock.notes.length);
+ const discussion = { ...discussionMock };
+ discussion.diff_file = mockDiffFile;
+ discussion.diff_discussion = true;
+ const diffDiscussionVm = new Component({
+ store,
+ propsData: { discussion },
+ }).$mount();
+
+ expect(diffDiscussionVm.$el.querySelector('.discussion-header')).not.toBeNull();
});
describe('actions', () => {
@@ -133,4 +145,27 @@ describe('noteable_discussion component', () => {
});
});
});
+
+ describe('componentData', () => {
+ it('should return first note object for placeholder note', () => {
+ const data = {
+ isPlaceholderNote: true,
+ notes: [{ body: 'hello world!' }],
+ };
+
+ const note = vm.componentData(data);
+
+ expect(note).toEqual(data.notes[0]);
+ });
+
+ it('should return given note for nonplaceholder notes', () => {
+ const data = {
+ notes: [{ id: 12 }],
+ };
+
+ const note = vm.componentData(data);
+
+ expect(note).toEqual(data);
+ });
+ });
});
diff --git a/spec/javascripts/notes/components/noteable_note_spec.js b/spec/javascripts/notes/components/noteable_note_spec.js
index a31d17cacbb..8ade6fc2ced 100644
--- a/spec/javascripts/notes/components/noteable_note_spec.js
+++ b/spec/javascripts/notes/components/noteable_note_spec.js
@@ -36,6 +36,7 @@ describe('issue_note', () => {
it('should render note header content', () => {
const el = vm.$el.querySelector('.note-header .note-header-author-name');
+
expect(el.textContent.trim()).toEqual(note.author.name);
});
diff --git a/spec/javascripts/notes/components/toggle_replies_widget_spec.js b/spec/javascripts/notes/components/toggle_replies_widget_spec.js
new file mode 100644
index 00000000000..2ead8cc6e6a
--- /dev/null
+++ b/spec/javascripts/notes/components/toggle_replies_widget_spec.js
@@ -0,0 +1,78 @@
+import Vue from 'vue';
+import toggleRepliesWidget from '~/notes/components/toggle_replies_widget.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import { note } from '../mock_data';
+
+const deepCloneObject = obj => JSON.parse(JSON.stringify(obj));
+
+describe('toggle replies widget for notes', () => {
+ let vm;
+ let ToggleRepliesWidget;
+ const noteFromOtherUser = deepCloneObject(note);
+ noteFromOtherUser.author.username = 'fatihacet';
+
+ const noteFromAnotherUser = deepCloneObject(note);
+ noteFromAnotherUser.author.username = 'mgreiling';
+ noteFromAnotherUser.author.name = 'Mike Greiling';
+
+ const replies = [note, note, note, noteFromOtherUser, noteFromAnotherUser];
+
+ beforeEach(() => {
+ ToggleRepliesWidget = Vue.extend(toggleRepliesWidget);
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('collapsed state', () => {
+ beforeEach(() => {
+ vm = mountComponent(ToggleRepliesWidget, {
+ replies,
+ collapsed: true,
+ });
+ });
+
+ it('should render the collapsed', () => {
+ const vmTextContent = vm.$el.textContent.replace(/\s\s+/g, ' ');
+
+ expect(vm.$el.classList.contains('collapsed')).toEqual(true);
+ expect(vm.$el.querySelectorAll('.user-avatar-link').length).toEqual(3);
+ expect(vm.$el.querySelector('time')).not.toBeNull();
+ expect(vmTextContent).toContain('5 replies');
+ expect(vmTextContent).toContain(`Last reply by ${noteFromAnotherUser.author.name}`);
+ });
+
+ it('should emit toggle event when the replies text clicked', () => {
+ const spy = spyOn(vm, '$emit');
+
+ vm.$el.querySelector('.js-replies-text').click();
+
+ expect(spy).toHaveBeenCalledWith('toggle');
+ });
+ });
+
+ describe('expanded state', () => {
+ beforeEach(() => {
+ vm = mountComponent(ToggleRepliesWidget, {
+ replies,
+ collapsed: false,
+ });
+ });
+
+ it('should render expanded state', () => {
+ const vmTextContent = vm.$el.textContent.replace(/\s\s+/g, ' ');
+
+ expect(vm.$el.querySelector('.collapse-replies-btn')).not.toBeNull();
+ expect(vmTextContent).toContain('Collapse replies');
+ });
+
+ it('should emit toggle event when the collapse replies text called', () => {
+ const spy = spyOn(vm, '$emit');
+
+ vm.$el.querySelector('.js-collapse-replies').click();
+
+ expect(spy).toHaveBeenCalledWith('toggle');
+ });
+ });
+});
diff --git a/spec/javascripts/notes/helpers.js b/spec/javascripts/notes/helpers.js
index a7663710a56..3f349b40ba5 100644
--- a/spec/javascripts/notes/helpers.js
+++ b/spec/javascripts/notes/helpers.js
@@ -1,5 +1,5 @@
// eslint-disable-next-line import/prefer-default-export
-export const resetStore = (store) => {
+export const resetStore = store => {
store.replaceState({
notes: [],
targetNoteHash: null,
diff --git a/spec/javascripts/notes/mock_data.js b/spec/javascripts/notes/mock_data.js
index 67f6a9629d9..ad0e793b915 100644
--- a/spec/javascripts/notes/mock_data.js
+++ b/spec/javascripts/notes/mock_data.js
@@ -66,7 +66,7 @@ export const individualNote = {
individual_note: true,
notes: [
{
- id: 1390,
+ id: '1390',
attachment: {
url: null,
filename: null,
@@ -111,7 +111,7 @@ export const individualNote = {
};
export const note = {
- id: 546,
+ id: '546',
attachment: {
url: null,
filename: null,
@@ -174,7 +174,7 @@ export const discussionMock = {
expanded: true,
notes: [
{
- id: 1395,
+ id: '1395',
attachment: {
url: null,
filename: null,
@@ -211,7 +211,7 @@ export const discussionMock = {
path: '/gitlab-org/gitlab-ce/notes/1395',
},
{
- id: 1396,
+ id: '1396',
attachment: {
url: null,
filename: null,
@@ -257,7 +257,7 @@ export const discussionMock = {
path: '/gitlab-org/gitlab-ce/notes/1396',
},
{
- id: 1437,
+ id: '1437',
attachment: {
url: null,
filename: null,
@@ -308,7 +308,7 @@ export const discussionMock = {
};
export const loggedOutnoteableData = {
- id: 98,
+ id: '98',
iid: 26,
author_id: 1,
description: '',
@@ -358,7 +358,7 @@ export const collapseNotesMock = [
individual_note: true,
notes: [
{
- id: 1390,
+ id: '1390',
attachment: null,
author: {
id: 1,
@@ -393,7 +393,7 @@ export const collapseNotesMock = [
individual_note: true,
notes: [
{
- id: 1391,
+ id: '1391',
attachment: null,
author: {
id: 1,
@@ -433,7 +433,7 @@ export const INDIVIDUAL_NOTE_RESPONSE_MAP = {
expanded: true,
notes: [
{
- id: 1390,
+ id: '1390',
attachment: {
url: null,
filename: null,
@@ -495,7 +495,7 @@ export const INDIVIDUAL_NOTE_RESPONSE_MAP = {
expanded: true,
notes: [
{
- id: 1391,
+ id: '1391',
attachment: {
url: null,
filename: null,
@@ -544,7 +544,7 @@ export const INDIVIDUAL_NOTE_RESPONSE_MAP = {
'/gitlab-org/gitlab-ce/notes/1471': {
commands_changes: null,
valid: true,
- id: 1471,
+ id: '1471',
attachment: null,
author: {
id: 1,
@@ -600,7 +600,7 @@ export const DISCUSSION_NOTE_RESPONSE_MAP = {
expanded: true,
notes: [
{
- id: 1471,
+ id: '1471',
attachment: {
url: null,
filename: null,
@@ -671,7 +671,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 901,
+ id: '901',
type: null,
attachment: null,
author: {
@@ -718,7 +718,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 902,
+ id: '902',
type: null,
attachment: null,
author: {
@@ -765,7 +765,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 903,
+ id: '903',
type: null,
attachment: null,
author: {
@@ -809,7 +809,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 904,
+ id: '904',
type: null,
attachment: null,
author: {
@@ -854,7 +854,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 905,
+ id: '905',
type: null,
attachment: null,
author: {
@@ -898,7 +898,7 @@ export const notesWithDescriptionChanges = [
expanded: true,
notes: [
{
- id: 906,
+ id: '906',
type: null,
attachment: null,
author: {
@@ -945,7 +945,7 @@ export const collapsedSystemNotes = [
expanded: true,
notes: [
{
- id: 901,
+ id: '901',
type: null,
attachment: null,
author: {
@@ -992,7 +992,7 @@ export const collapsedSystemNotes = [
expanded: true,
notes: [
{
- id: 902,
+ id: '902',
type: null,
attachment: null,
author: {
@@ -1039,7 +1039,7 @@ export const collapsedSystemNotes = [
expanded: true,
notes: [
{
- id: 904,
+ id: '904',
type: null,
attachment: null,
author: {
@@ -1084,7 +1084,7 @@ export const collapsedSystemNotes = [
expanded: true,
notes: [
{
- id: 905,
+ id: '905',
type: null,
attachment: null,
author: {
@@ -1104,7 +1104,7 @@ export const collapsedSystemNotes = [
resolvable: false,
noteable_iid: 12,
note: 'changed the description',
- note_html: '\n <p dir="auto">changed the description 2 times within 1 minute </p>',
+ note_html: ' <p dir="auto">changed the description 2 times within 1 minute </p>',
current_user: { can_edit: false, can_award_emoji: true },
resolved: false,
resolved_by: null,
@@ -1129,7 +1129,7 @@ export const collapsedSystemNotes = [
expanded: true,
notes: [
{
- id: 906,
+ id: '906',
type: null,
attachment: null,
author: {
@@ -1177,10 +1177,8 @@ export const discussion1 = {
file_path: 'about.md',
},
position: {
- formatter: {
- new_line: 50,
- old_line: null,
- },
+ new_line: 50,
+ old_line: null,
},
notes: [
{
@@ -1197,10 +1195,8 @@ export const resolvedDiscussion1 = {
file_path: 'about.md',
},
position: {
- formatter: {
- new_line: 50,
- old_line: null,
- },
+ new_line: 50,
+ old_line: null,
},
notes: [
{
@@ -1217,10 +1213,8 @@ export const discussion2 = {
file_path: 'README.md',
},
position: {
- formatter: {
- new_line: null,
- old_line: 20,
- },
+ new_line: null,
+ old_line: 20,
},
notes: [
{
@@ -1237,10 +1231,8 @@ export const discussion3 = {
file_path: 'README.md',
},
position: {
- formatter: {
- new_line: 21,
- old_line: null,
- },
+ new_line: 21,
+ old_line: null,
},
notes: [
{
@@ -1252,3 +1244,18 @@ export const discussion3 = {
export const unresolvableDiscussion = {
resolvable: false,
};
+
+export const discussionFiltersMock = [
+ {
+ title: 'Show all activity',
+ value: 0,
+ },
+ {
+ title: 'Show comments only',
+ value: 1,
+ },
+ {
+ title: 'Show system notes only',
+ value: 2,
+ },
+];
diff --git a/spec/javascripts/notes/stores/actions_spec.js b/spec/javascripts/notes/stores/actions_spec.js
index b66e8e1ceb3..fcdd834e4a0 100644
--- a/spec/javascripts/notes/stores/actions_spec.js
+++ b/spec/javascripts/notes/stores/actions_spec.js
@@ -3,6 +3,7 @@ import _ from 'underscore';
import { headersInterceptor } from 'spec/helpers/vue_resource_helper';
import * as actions from '~/notes/stores/actions';
import createStore from '~/notes/stores';
+import mrWidgetEventHub from '~/vue_merge_request_widget/event_hub';
import testAction from '../../helpers/vuex_action_helper';
import { resetStore } from '../helpers';
import {
@@ -317,4 +318,211 @@ describe('Actions Notes Store', () => {
);
});
});
+
+ describe('deleteNote', () => {
+ const interceptor = (request, next) => {
+ next(
+ request.respondWith(JSON.stringify({}), {
+ status: 200,
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ Vue.http.interceptors.push(interceptor);
+ });
+
+ afterEach(() => {
+ Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
+ });
+
+ it('commits DELETE_NOTE and dispatches updateMergeRequestWidget', done => {
+ const note = { path: `${gl.TEST_HOST}`, id: 1 };
+
+ testAction(
+ actions.deleteNote,
+ note,
+ store.state,
+ [
+ {
+ type: 'DELETE_NOTE',
+ payload: note,
+ },
+ ],
+ [
+ {
+ type: 'updateMergeRequestWidget',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('createNewNote', () => {
+ describe('success', () => {
+ const res = {
+ id: 1,
+ valid: true,
+ };
+ const interceptor = (request, next) => {
+ next(
+ request.respondWith(JSON.stringify(res), {
+ status: 200,
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ Vue.http.interceptors.push(interceptor);
+ });
+
+ afterEach(() => {
+ Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
+ });
+
+ it('commits ADD_NEW_NOTE and dispatches updateMergeRequestWidget', done => {
+ testAction(
+ actions.createNewNote,
+ { endpoint: `${gl.TEST_HOST}`, data: {} },
+ store.state,
+ [
+ {
+ type: 'ADD_NEW_NOTE',
+ payload: res,
+ },
+ ],
+ [
+ {
+ type: 'updateMergeRequestWidget',
+ },
+ {
+ type: 'startTaskList',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('error', () => {
+ const res = {
+ errors: ['error'],
+ };
+ const interceptor = (request, next) => {
+ next(
+ request.respondWith(JSON.stringify(res), {
+ status: 200,
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ Vue.http.interceptors.push(interceptor);
+ });
+
+ afterEach(() => {
+ Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
+ });
+
+ it('does not commit ADD_NEW_NOTE or dispatch updateMergeRequestWidget', done => {
+ testAction(
+ actions.createNewNote,
+ { endpoint: `${gl.TEST_HOST}`, data: {} },
+ store.state,
+ [],
+ [],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('toggleResolveNote', () => {
+ const res = {
+ resolved: true,
+ };
+ const interceptor = (request, next) => {
+ next(
+ request.respondWith(JSON.stringify(res), {
+ status: 200,
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ Vue.http.interceptors.push(interceptor);
+ });
+
+ afterEach(() => {
+ Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
+ });
+
+ describe('as note', () => {
+ it('commits UPDATE_NOTE and dispatches updateMergeRequestWidget', done => {
+ testAction(
+ actions.toggleResolveNote,
+ { endpoint: `${gl.TEST_HOST}`, isResolved: true, discussion: false },
+ store.state,
+ [
+ {
+ type: 'UPDATE_NOTE',
+ payload: res,
+ },
+ ],
+ [
+ {
+ type: 'updateMergeRequestWidget',
+ },
+ ],
+ done,
+ );
+ });
+ });
+
+ describe('as discussion', () => {
+ it('commits UPDATE_DISCUSSION and dispatches updateMergeRequestWidget', done => {
+ testAction(
+ actions.toggleResolveNote,
+ { endpoint: `${gl.TEST_HOST}`, isResolved: true, discussion: true },
+ store.state,
+ [
+ {
+ type: 'UPDATE_DISCUSSION',
+ payload: res,
+ },
+ ],
+ [
+ {
+ type: 'updateMergeRequestWidget',
+ },
+ ],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('updateMergeRequestWidget', () => {
+ it('calls mrWidget checkStatus', () => {
+ spyOn(mrWidgetEventHub, '$emit');
+
+ actions.updateMergeRequestWidget();
+
+ expect(mrWidgetEventHub.$emit).toHaveBeenCalledWith('mr.discussion.updated');
+ });
+ });
+
+ describe('setCommentsDisabled', () => {
+ it('should set comments disabled state', done => {
+ testAction(
+ actions.setCommentsDisabled,
+ true,
+ null,
+ [{ type: 'DISABLE_COMMENTS', payload: true }],
+ [],
+ done,
+ );
+ });
+ });
});
diff --git a/spec/javascripts/notes/stores/collapse_utils_spec.js b/spec/javascripts/notes/stores/collapse_utils_spec.js
index 06a6aab932a..8ede9319088 100644
--- a/spec/javascripts/notes/stores/collapse_utils_spec.js
+++ b/spec/javascripts/notes/stores/collapse_utils_spec.js
@@ -4,10 +4,7 @@ import {
getTimeDifferenceMinutes,
collapseSystemNotes,
} from '~/notes/stores/collapse_utils';
-import {
- notesWithDescriptionChanges,
- collapsedSystemNotes,
-} from '../mock_data';
+import { notesWithDescriptionChanges, collapsedSystemNotes } from '../mock_data';
describe('Collapse utils', () => {
const mockSystemNote = {
@@ -22,14 +19,18 @@ describe('Collapse utils', () => {
});
it('returns false when a system note is not a description type', () => {
- expect(isDescriptionSystemNote(Object.assign({}, mockSystemNote, { note: 'foo' }))).toEqual(false);
+ expect(isDescriptionSystemNote(Object.assign({}, mockSystemNote, { note: 'foo' }))).toEqual(
+ false,
+ );
});
it('changes the description to contain the number of changed times', () => {
const changedNote = changeDescriptionNote(mockSystemNote, 3, 5);
expect(changedNote.times_updated).toEqual(3);
- expect(changedNote.note_html.trim()).toContain('<p dir="auto">changed the description 3 times within 5 minutes </p>');
+ expect(changedNote.note_html.trim()).toContain(
+ '<p dir="auto">changed the description 3 times within 5 minutes </p>',
+ );
});
it('gets the time difference between two notes', () => {
diff --git a/spec/javascripts/notes/stores/getters_spec.js b/spec/javascripts/notes/stores/getters_spec.js
index 7f8ede51508..f853f9ff088 100644
--- a/spec/javascripts/notes/stores/getters_spec.js
+++ b/spec/javascripts/notes/stores/getters_spec.js
@@ -205,6 +205,7 @@ describe('Getters Notes Store', () => {
'123',
'456',
]);
+
expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(undefined)).toEqual([
'123',
'456',
diff --git a/spec/javascripts/notes/stores/mutation_spec.js b/spec/javascripts/notes/stores/mutation_spec.js
index a15ff1a5888..461de5a3106 100644
--- a/spec/javascripts/notes/stores/mutation_spec.js
+++ b/spec/javascripts/notes/stores/mutation_spec.js
@@ -1,3 +1,4 @@
+import Vue from 'vue';
import mutations from '~/notes/stores/mutations';
import {
note,
@@ -29,11 +30,13 @@ describe('Notes Store mutations', () => {
expect(state).toEqual({
discussions: [noteData],
});
+
expect(state.discussions.length).toBe(1);
});
it('should not add the same note to the notes array', () => {
mutations.ADD_NEW_NOTE(state, note);
+
expect(state.discussions.length).toBe(1);
});
});
@@ -75,7 +78,7 @@ describe('Notes Store mutations', () => {
});
describe('COLLAPSE_DISCUSSION', () => {
- it('should collpase an expanded discussion', () => {
+ it('should collapse an expanded discussion', () => {
const discussion = Object.assign({}, discussionMock, { expanded: true });
const state = {
@@ -105,6 +108,7 @@ describe('Notes Store mutations', () => {
};
mutations.SET_NOTES_DATA(state, notesDataMock);
+
expect(state.notesData).toEqual(notesDataMock);
});
});
@@ -116,6 +120,7 @@ describe('Notes Store mutations', () => {
};
mutations.SET_NOTEABLE_DATA(state, noteableDataMock);
+
expect(state.noteableData).toEqual(noteableDataMock);
});
});
@@ -127,6 +132,7 @@ describe('Notes Store mutations', () => {
};
mutations.SET_USER_DATA(state, userDataMock);
+
expect(state.userData).toEqual(userDataMock);
});
});
@@ -150,11 +156,47 @@ describe('Notes Store mutations', () => {
};
mutations.SET_INITIAL_DISCUSSIONS(state, [note, legacyNote]);
+
expect(state.discussions[0].id).toEqual(note.id);
expect(state.discussions[1].notes[0].note).toBe(legacyNote.notes[0].note);
expect(state.discussions[2].notes[0].note).toBe(legacyNote.notes[1].note);
expect(state.discussions.length).toEqual(3);
});
+
+ it('adds truncated_diff_lines if discussion is a diffFile', () => {
+ const state = {
+ discussions: [],
+ };
+
+ mutations.SET_INITIAL_DISCUSSIONS(state, [
+ {
+ ...note,
+ diff_file: {
+ file_hash: 'a',
+ },
+ truncated_diff_lines: ['a'],
+ },
+ ]);
+
+ expect(state.discussions[0].truncated_diff_lines).toEqual(['a']);
+ });
+
+ it('adds empty truncated_diff_lines when not in discussion', () => {
+ const state = {
+ discussions: [],
+ };
+
+ mutations.SET_INITIAL_DISCUSSIONS(state, [
+ {
+ ...note,
+ diff_file: {
+ file_hash: 'a',
+ },
+ },
+ ]);
+
+ expect(state.discussions[0].truncated_diff_lines).toEqual([]);
+ });
});
describe('SET_LAST_FETCHED_AT', () => {
@@ -164,6 +206,7 @@ describe('Notes Store mutations', () => {
};
mutations.SET_LAST_FETCHED_AT(state, 'timestamp');
+
expect(state.lastFetchedAt).toEqual('timestamp');
});
});
@@ -175,6 +218,7 @@ describe('Notes Store mutations', () => {
};
mutations.SET_TARGET_NOTE_HASH(state, 'hash');
+
expect(state.targetNoteHash).toEqual('hash');
});
});
@@ -185,6 +229,7 @@ describe('Notes Store mutations', () => {
discussions: [],
};
mutations.SHOW_PLACEHOLDER_NOTE(state, note);
+
expect(state.discussions[0].isPlaceholderNote).toEqual(true);
});
});
@@ -225,6 +270,7 @@ describe('Notes Store mutations', () => {
awardName: 'bath_tone3',
};
mutations.TOGGLE_AWARD(state, data);
+
expect(state.discussions[0].award_emoji.length).toEqual(2);
});
});
@@ -280,6 +326,7 @@ describe('Notes Store mutations', () => {
};
mutations.CLOSE_ISSUE(state);
+
expect(state.noteableData.state).toEqual('closed');
});
});
@@ -297,6 +344,7 @@ describe('Notes Store mutations', () => {
};
mutations.REOPEN_ISSUE(state);
+
expect(state.noteableData.state).toEqual('reopened');
});
});
@@ -314,6 +362,7 @@ describe('Notes Store mutations', () => {
};
mutations.TOGGLE_STATE_BUTTON_LOADING(state, true);
+
expect(state.isToggleStateButtonLoading).toEqual(true);
});
@@ -329,18 +378,63 @@ describe('Notes Store mutations', () => {
};
mutations.TOGGLE_STATE_BUTTON_LOADING(state, false);
+
expect(state.isToggleStateButtonLoading).toEqual(false);
});
});
- describe('SET_NOTES_FETCHING_STATE', () => {
+ describe('SET_NOTES_FETCHED_STATE', () => {
it('should set the given state', () => {
const state = {
isNotesFetched: false,
};
mutations.SET_NOTES_FETCHED_STATE(state, true);
+
expect(state.isNotesFetched).toEqual(true);
});
});
+
+ describe('SET_DISCUSSION_DIFF_LINES', () => {
+ it('sets truncated_diff_lines', () => {
+ const state = {
+ discussions: [
+ {
+ id: 1,
+ },
+ ],
+ };
+
+ mutations.SET_DISCUSSION_DIFF_LINES(state, { discussionId: 1, diffLines: ['test'] });
+
+ expect(state.discussions[0].truncated_diff_lines).toEqual(['test']);
+ });
+
+ it('keeps reactivity of discussion', () => {
+ const state = {};
+ Vue.set(state, 'discussions', [
+ {
+ id: 1,
+ expanded: false,
+ },
+ ]);
+ const discussion = state.discussions[0];
+
+ mutations.SET_DISCUSSION_DIFF_LINES(state, { discussionId: 1, diffLines: ['test'] });
+
+ discussion.expanded = true;
+
+ expect(state.discussions[0].expanded).toBe(true);
+ });
+ });
+
+ describe('DISABLE_COMMENTS', () => {
+ it('should set comments disabled state', () => {
+ const state = {};
+
+ mutations.DISABLE_COMMENTS(state, true);
+
+ expect(state.commentsDisabled).toEqual(true);
+ });
+ });
});
diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js
index faeedae40e9..694f581150f 100644
--- a/spec/javascripts/notes_spec.js
+++ b/spec/javascripts/notes_spec.js
@@ -10,1011 +10,1024 @@ import '~/behaviors/markdown/render_gfm';
import Notes from '~/notes';
import timeoutPromise from './helpers/set_timeout_promise_helper';
-(function() {
- window.gon || (window.gon = {});
- window.gl = window.gl || {};
- gl.utils = gl.utils || {};
-
- const htmlEscape = comment => {
- const escapedString = comment.replace(/["&'<>]/g, a => {
- const escapedToken = {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&quot;',
- "'": '&#x27;',
- '`': '&#x60;',
- }[a];
-
- return escapedToken;
- });
-
- return escapedString;
- };
-
- describe('Notes', function() {
- const FLASH_TYPE_ALERT = 'alert';
- const NOTES_POST_PATH = /(.*)\/notes\?html=true$/;
- var fixture = 'snippets/show.html.raw';
- preloadFixtures(fixture);
+window.gon || (window.gon = {});
+window.gl = window.gl || {};
+gl.utils = gl.utils || {};
+
+const htmlEscape = comment => {
+ const escapedString = comment.replace(/["&'<>]/g, a => {
+ const escapedToken = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '`': '&#x60;',
+ }[a];
+
+ return escapedToken;
+ });
- beforeEach(function() {
- loadFixtures(fixture);
- gl.utils.disableButtonIfEmptyField = _.noop;
- window.project_uploads_path = 'http://test.host/uploads';
- $('body').attr('data-page', 'projects:merge_requets:show');
- });
+ return escapedString;
+};
- afterEach(() => {
- // Undo what we did to the shared <body>
- $('body').removeAttr('data-page');
- });
+describe('Notes', function() {
+ const FLASH_TYPE_ALERT = 'alert';
+ const NOTES_POST_PATH = /(.*)\/notes\?html=true$/;
+ var fixture = 'snippets/show.html.raw';
+ preloadFixtures(fixture);
- describe('addBinding', () => {
- it('calls postComment when comment button is clicked', () => {
- spyOn(Notes.prototype, 'postComment');
- this.notes = new Notes('', []);
+ beforeEach(function() {
+ loadFixtures(fixture);
+ gl.utils.disableButtonIfEmptyField = _.noop;
+ window.project_uploads_path = 'http://test.host/uploads';
+ $('body').attr('data-page', 'projects:merge_requets:show');
+ });
- $('.js-comment-button').click();
+ afterEach(() => {
+ // Undo what we did to the shared <body>
+ $('body').removeAttr('data-page');
+ });
- expect(Notes.prototype.postComment).toHaveBeenCalled();
- });
+ describe('addBinding', () => {
+ it('calls postComment when comment button is clicked', () => {
+ spyOn(Notes.prototype, 'postComment');
+ this.notes = new Notes('', []);
+
+ $('.js-comment-button').click();
+
+ expect(Notes.prototype.postComment).toHaveBeenCalled();
});
+ });
- describe('task lists', function() {
- let mock;
+ describe('task lists', function() {
+ let mock;
- beforeEach(function() {
- spyOn(axios, 'patch').and.callFake(() => new Promise(() => {}));
- mock = new MockAdapter(axios);
- mock.onAny().reply(200, {});
+ beforeEach(function() {
+ spyOn(axios, 'patch').and.callFake(() => new Promise(() => {}));
+ mock = new MockAdapter(axios);
+ mock.onAny().reply(200, {});
- $('.js-comment-button').on('click', function(e) {
- e.preventDefault();
- });
- this.notes = new Notes('', []);
+ $('.js-comment-button').on('click', function(e) {
+ e.preventDefault();
});
+ this.notes = new Notes('', []);
+ });
- afterEach(() => {
- mock.restore();
- });
+ afterEach(() => {
+ mock.restore();
+ });
- it('modifies the Markdown field', function() {
- const changeEvent = document.createEvent('HTMLEvents');
- changeEvent.initEvent('change', true, true);
- $('input[type=checkbox]')
- .attr('checked', true)[0]
- .dispatchEvent(changeEvent);
+ it('modifies the Markdown field', function() {
+ const changeEvent = document.createEvent('HTMLEvents');
+ changeEvent.initEvent('change', true, true);
+ $('input[type=checkbox]')
+ .attr('checked', true)[0]
+ .dispatchEvent(changeEvent);
- expect($('.js-task-list-field.original-task-list').val()).toBe('- [x] Task List Item');
- });
+ expect($('.js-task-list-field.original-task-list').val()).toBe('- [x] Task List Item');
+ });
- it('submits an ajax request on tasklist:changed', function(done) {
- $('.js-task-list-container').trigger('tasklist:changed');
+ it('submits an ajax request on tasklist:changed', function(done) {
+ $('.js-task-list-container').trigger('tasklist:changed');
- setTimeout(() => {
- expect(axios.patch).toHaveBeenCalled();
- done();
- });
+ setTimeout(() => {
+ expect(axios.patch).toHaveBeenCalled();
+ done();
});
});
+ });
- describe('comments', function() {
- var textarea = '.js-note-text';
+ describe('comments', function() {
+ var textarea = '.js-note-text';
- beforeEach(function() {
- this.notes = new Notes('', []);
+ beforeEach(function() {
+ this.notes = new Notes('', []);
- this.autoSizeSpy = spyOnEvent($(textarea), 'autosize:update');
- spyOn(this.notes, 'renderNote').and.stub();
+ this.autoSizeSpy = spyOnEvent($(textarea), 'autosize:update');
+ spyOn(this.notes, 'renderNote').and.stub();
- $(textarea).data('autosave', {
- reset: function() {},
- });
+ $(textarea).data('autosave', {
+ reset: function() {},
+ });
- $('.js-comment-button').on('click', e => {
- const $form = $(this);
- e.preventDefault();
- this.notes.addNote($form);
- this.notes.reenableTargetFormSubmitButton(e);
- this.notes.resetMainTargetForm(e);
- });
+ $('.js-comment-button').on('click', e => {
+ const $form = $(this);
+ e.preventDefault();
+ this.notes.addNote($form);
+ this.notes.reenableTargetFormSubmitButton(e);
+ this.notes.resetMainTargetForm(e);
});
+ });
- it('autosizes after comment submission', function() {
- $(textarea).text('This is an example comment note');
- expect(this.autoSizeSpy).not.toHaveBeenTriggered();
+ it('autosizes after comment submission', function() {
+ $(textarea).text('This is an example comment note');
- $('.js-comment-button').click();
- expect(this.autoSizeSpy).toHaveBeenTriggered();
- });
+ expect(this.autoSizeSpy).not.toHaveBeenTriggered();
- it('should not place escaped text in the comment box in case of error', function() {
- const deferred = $.Deferred();
- spyOn($, 'ajax').and.returnValue(deferred.promise());
- $(textarea).text('A comment with `markup`.');
+ $('.js-comment-button').click();
- deferred.reject();
- $('.js-comment-button').click();
- expect($(textarea).val()).toEqual('A comment with `markup`.');
- });
+ expect(this.autoSizeSpy).toHaveBeenTriggered();
});
- describe('updateNote', () => {
- let sampleComment;
- let noteEntity;
- let $form;
- let $notesContainer;
- let mock;
+ it('should not place escaped text in the comment box in case of error', function() {
+ const deferred = $.Deferred();
+ spyOn($, 'ajax').and.returnValue(deferred.promise());
+ $(textarea).text('A comment with `markup`.');
- beforeEach(() => {
- this.notes = new Notes('', []);
- window.gon.current_username = 'root';
- window.gon.current_user_fullname = 'Administrator';
- sampleComment = 'foo';
- noteEntity = {
- id: 1234,
- html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
- <div class="note-text">${sampleComment}</div>
- </li>`,
- note: sampleComment,
- valid: true,
- };
- $form = $('form.js-main-target-form');
- $notesContainer = $('ul.main-notes-list');
- $form.find('textarea.js-note-text').val(sampleComment);
+ deferred.reject();
+ $('.js-comment-button').click();
- mock = new MockAdapter(axios);
- mock.onPost(NOTES_POST_PATH).reply(200, noteEntity);
- });
+ expect($(textarea).val()).toEqual('A comment with `markup`.');
+ });
+ });
- afterEach(() => {
- mock.restore();
- });
+ describe('updateNote', () => {
+ let sampleComment;
+ let noteEntity;
+ let $form;
+ let $notesContainer;
+ let mock;
+
+ beforeEach(() => {
+ this.notes = new Notes('', []);
+ window.gon.current_username = 'root';
+ window.gon.current_user_fullname = 'Administrator';
+ sampleComment = 'foo';
+ noteEntity = {
+ id: 1234,
+ html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
+ <div class="note-text">${sampleComment}</div>
+ </li>`,
+ note: sampleComment,
+ valid: true,
+ };
+ $form = $('form.js-main-target-form');
+ $notesContainer = $('ul.main-notes-list');
+ $form.find('textarea.js-note-text').val(sampleComment);
+
+ mock = new MockAdapter(axios);
+ mock.onPost(NOTES_POST_PATH).reply(200, noteEntity);
+ });
- it('updates note and resets edit form', done => {
- spyOn(this.notes, 'revertNoteEditForm');
- spyOn(this.notes, 'setupNewNote');
+ afterEach(() => {
+ mock.restore();
+ });
- $('.js-comment-button').click();
+ it('updates note and resets edit form', done => {
+ spyOn(this.notes, 'revertNoteEditForm');
+ spyOn(this.notes, 'setupNewNote');
- setTimeout(() => {
- const $targetNote = $notesContainer.find(`#note_${noteEntity.id}`);
- const updatedNote = Object.assign({}, noteEntity);
- updatedNote.note = 'bar';
- this.notes.updateNote(updatedNote, $targetNote);
+ $('.js-comment-button').click();
- expect(this.notes.revertNoteEditForm).toHaveBeenCalledWith($targetNote);
- expect(this.notes.setupNewNote).toHaveBeenCalled();
+ setTimeout(() => {
+ const $targetNote = $notesContainer.find(`#note_${noteEntity.id}`);
+ const updatedNote = Object.assign({}, noteEntity);
+ updatedNote.note = 'bar';
+ this.notes.updateNote(updatedNote, $targetNote);
- done();
- });
+ expect(this.notes.revertNoteEditForm).toHaveBeenCalledWith($targetNote);
+ expect(this.notes.setupNewNote).toHaveBeenCalled();
+
+ done();
});
});
+ });
- describe('updateNoteTargetSelector', () => {
- const hash = 'note_foo';
- let $note;
+ describe('updateNoteTargetSelector', () => {
+ const hash = 'note_foo';
+ let $note;
- beforeEach(() => {
- $note = $(`<div id="${hash}"></div>`);
- spyOn($note, 'filter').and.callThrough();
- spyOn($note, 'toggleClass').and.callThrough();
- });
+ beforeEach(() => {
+ $note = $(`<div id="${hash}"></div>`);
+ spyOn($note, 'filter').and.callThrough();
+ spyOn($note, 'toggleClass').and.callThrough();
+ });
- it('sets target when hash matches', () => {
- spyOnDependency(Notes, 'getLocationHash').and.returnValue(hash);
+ it('sets target when hash matches', () => {
+ spyOnDependency(Notes, 'getLocationHash').and.returnValue(hash);
- Notes.updateNoteTargetSelector($note);
+ Notes.updateNoteTargetSelector($note);
- expect($note.filter).toHaveBeenCalledWith(`#${hash}`);
- expect($note.toggleClass).toHaveBeenCalledWith('target', true);
- });
+ expect($note.filter).toHaveBeenCalledWith(`#${hash}`);
+ expect($note.toggleClass).toHaveBeenCalledWith('target', true);
+ });
- it('unsets target when hash does not match', () => {
- spyOnDependency(Notes, 'getLocationHash').and.returnValue('note_doesnotexist');
+ it('unsets target when hash does not match', () => {
+ spyOnDependency(Notes, 'getLocationHash').and.returnValue('note_doesnotexist');
- Notes.updateNoteTargetSelector($note);
+ Notes.updateNoteTargetSelector($note);
- expect($note.toggleClass).toHaveBeenCalledWith('target', false);
- });
+ expect($note.toggleClass).toHaveBeenCalledWith('target', false);
+ });
- it('unsets target when there is not a hash fragment anymore', () => {
- spyOnDependency(Notes, 'getLocationHash').and.returnValue(null);
+ it('unsets target when there is not a hash fragment anymore', () => {
+ spyOnDependency(Notes, 'getLocationHash').and.returnValue(null);
- Notes.updateNoteTargetSelector($note);
+ Notes.updateNoteTargetSelector($note);
- expect($note.toggleClass).toHaveBeenCalledWith('target', false);
- });
+ expect($note.toggleClass).toHaveBeenCalledWith('target', false);
});
+ });
- describe('renderNote', () => {
- let notes;
- let note;
- let $notesList;
+ describe('renderNote', () => {
+ let notes;
+ let note;
+ let $notesList;
- beforeEach(() => {
- note = {
- id: 1,
- valid: true,
- note: 'heya',
- html: '<div>heya</div>',
- };
- $notesList = jasmine.createSpyObj('$notesList', ['find', 'append']);
-
- notes = jasmine.createSpyObj('notes', [
- 'setupNewNote',
- 'refresh',
- 'collapseLongCommitList',
- 'updateNotesCount',
- 'putConflictEditWarningInPlace',
- ]);
- notes.taskList = jasmine.createSpyObj('tasklist', ['init']);
- notes.note_ids = [];
- notes.updatedNotesTrackingMap = {};
-
- spyOn(Notes, 'isNewNote').and.callThrough();
- spyOn(Notes, 'isUpdatedNote').and.callThrough();
- spyOn(Notes, 'animateAppendNote').and.callThrough();
- spyOn(Notes, 'animateUpdateNote').and.callThrough();
+ beforeEach(() => {
+ note = {
+ id: 1,
+ valid: true,
+ note: 'heya',
+ html: '<div>heya</div>',
+ };
+ $notesList = jasmine.createSpyObj('$notesList', ['find', 'append']);
+
+ notes = jasmine.createSpyObj('notes', [
+ 'setupNewNote',
+ 'refresh',
+ 'collapseLongCommitList',
+ 'updateNotesCount',
+ 'putConflictEditWarningInPlace',
+ ]);
+ notes.taskList = jasmine.createSpyObj('tasklist', ['init']);
+ notes.note_ids = [];
+ notes.updatedNotesTrackingMap = {};
+
+ spyOn(Notes, 'isNewNote').and.callThrough();
+ spyOn(Notes, 'isUpdatedNote').and.callThrough();
+ spyOn(Notes, 'animateAppendNote').and.callThrough();
+ spyOn(Notes, 'animateUpdateNote').and.callThrough();
+ });
+
+ describe('when adding note', () => {
+ it('should call .animateAppendNote', () => {
+ Notes.isNewNote.and.returnValue(true);
+ Notes.prototype.renderNote.call(notes, note, null, $notesList);
+
+ expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, $notesList);
});
+ });
- describe('when adding note', () => {
- it('should call .animateAppendNote', () => {
- Notes.isNewNote.and.returnValue(true);
- Notes.prototype.renderNote.call(notes, note, null, $notesList);
+ describe('when note was edited', () => {
+ it('should call .animateUpdateNote', () => {
+ Notes.isNewNote.and.returnValue(false);
+ Notes.isUpdatedNote.and.returnValue(true);
+ const $note = $('<div>');
+ $notesList.find.and.returnValue($note);
+ const $newNote = $(note.html);
+ Notes.animateUpdateNote.and.returnValue($newNote);
- expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, $notesList);
- });
+ Notes.prototype.renderNote.call(notes, note, null, $notesList);
+
+ expect(Notes.animateUpdateNote).toHaveBeenCalledWith(note.html, $note);
+ expect(notes.setupNewNote).toHaveBeenCalledWith($newNote);
});
- describe('when note was edited', () => {
- it('should call .animateUpdateNote', () => {
+ describe('while editing', () => {
+ it('should update textarea if nothing has been touched', () => {
Notes.isNewNote.and.returnValue(false);
Notes.isUpdatedNote.and.returnValue(true);
- const $note = $('<div>');
+ const $note = $(`<div class="is-editing">
+ <div class="original-note-content">initial</div>
+ <textarea class="js-note-text">initial</textarea>
+ </div>`);
$notesList.find.and.returnValue($note);
- const $newNote = $(note.html);
- Notes.animateUpdateNote.and.returnValue($newNote);
-
Notes.prototype.renderNote.call(notes, note, null, $notesList);
- expect(Notes.animateUpdateNote).toHaveBeenCalledWith(note.html, $note);
- expect(notes.setupNewNote).toHaveBeenCalledWith($newNote);
+ expect($note.find('.js-note-text').val()).toEqual(note.note);
});
- describe('while editing', () => {
- it('should update textarea if nothing has been touched', () => {
- Notes.isNewNote.and.returnValue(false);
- Notes.isUpdatedNote.and.returnValue(true);
- const $note = $(`<div class="is-editing">
- <div class="original-note-content">initial</div>
- <textarea class="js-note-text">initial</textarea>
- </div>`);
- $notesList.find.and.returnValue($note);
- Notes.prototype.renderNote.call(notes, note, null, $notesList);
-
- expect($note.find('.js-note-text').val()).toEqual(note.note);
- });
-
- it('should call .putConflictEditWarningInPlace', () => {
- Notes.isNewNote.and.returnValue(false);
- Notes.isUpdatedNote.and.returnValue(true);
- const $note = $(`<div class="is-editing">
- <div class="original-note-content">initial</div>
- <textarea class="js-note-text">different</textarea>
- </div>`);
- $notesList.find.and.returnValue($note);
- Notes.prototype.renderNote.call(notes, note, null, $notesList);
-
- expect(notes.putConflictEditWarningInPlace).toHaveBeenCalledWith(note, $note);
- });
+ it('should call .putConflictEditWarningInPlace', () => {
+ Notes.isNewNote.and.returnValue(false);
+ Notes.isUpdatedNote.and.returnValue(true);
+ const $note = $(`<div class="is-editing">
+ <div class="original-note-content">initial</div>
+ <textarea class="js-note-text">different</textarea>
+ </div>`);
+ $notesList.find.and.returnValue($note);
+ Notes.prototype.renderNote.call(notes, note, null, $notesList);
+
+ expect(notes.putConflictEditWarningInPlace).toHaveBeenCalledWith(note, $note);
});
});
});
+ });
- describe('isUpdatedNote', () => {
- it('should consider same note text as the same', () => {
- const result = Notes.isUpdatedNote(
- {
- note: 'initial',
- },
- $(`<div>
- <div class="original-note-content">initial</div>
- </div>`),
- );
+ describe('isUpdatedNote', () => {
+ it('should consider same note text as the same', () => {
+ const result = Notes.isUpdatedNote(
+ {
+ note: 'initial',
+ },
+ $(`<div>
+ <div class="original-note-content">initial</div>
+ </div>`),
+ );
- expect(result).toEqual(false);
- });
+ expect(result).toEqual(false);
+ });
- it('should consider same note with trailing newline as the same', () => {
- const result = Notes.isUpdatedNote(
- {
- note: 'initial\n',
- },
- $(`<div>
- <div class="original-note-content">initial\n</div>
- </div>`),
- );
+ it('should consider same note with trailing newline as the same', () => {
+ const result = Notes.isUpdatedNote(
+ {
+ note: 'initial\n',
+ },
+ $(`<div>
+ <div class="original-note-content">initial\n</div>
+ </div>`),
+ );
- expect(result).toEqual(false);
- });
+ expect(result).toEqual(false);
+ });
- it('should consider different notes as different', () => {
- const result = Notes.isUpdatedNote(
- {
- note: 'foo',
- },
- $(`<div>
- <div class="original-note-content">bar</div>
- </div>`),
- );
+ it('should consider different notes as different', () => {
+ const result = Notes.isUpdatedNote(
+ {
+ note: 'foo',
+ },
+ $(`<div>
+ <div class="original-note-content">bar</div>
+ </div>`),
+ );
- expect(result).toEqual(true);
- });
+ expect(result).toEqual(true);
+ });
+ });
+
+ describe('renderDiscussionNote', () => {
+ let discussionContainer;
+ let note;
+ let notes;
+ let $form;
+ let row;
+
+ beforeEach(() => {
+ note = {
+ html: '<li></li>',
+ discussion_html: '<div></div>',
+ discussion_id: 1,
+ discussion_resolvable: false,
+ diff_discussion_html: false,
+ };
+ $form = jasmine.createSpyObj('$form', ['closest', 'find']);
+ $form.length = 1;
+ row = jasmine.createSpyObj('row', ['prevAll', 'first', 'find']);
+
+ notes = jasmine.createSpyObj('notes', ['isParallelView', 'updateNotesCount']);
+ notes.note_ids = [];
+
+ spyOn(Notes, 'isNewNote');
+ spyOn(Notes, 'animateAppendNote');
+ Notes.isNewNote.and.returnValue(true);
+ notes.isParallelView.and.returnValue(false);
+ row.prevAll.and.returnValue(row);
+ row.first.and.returnValue(row);
+ row.find.and.returnValue(row);
});
- describe('renderDiscussionNote', () => {
- let discussionContainer;
- let note;
- let notes;
- let $form;
- let row;
+ describe('Discussion root note', () => {
+ let body;
beforeEach(() => {
- note = {
- html: '<li></li>',
- discussion_html: '<div></div>',
- discussion_id: 1,
- discussion_resolvable: false,
- diff_discussion_html: false,
- };
- $form = jasmine.createSpyObj('$form', ['closest', 'find']);
- $form.length = 1;
- row = jasmine.createSpyObj('row', ['prevAll', 'first', 'find']);
-
- notes = jasmine.createSpyObj('notes', ['isParallelView', 'updateNotesCount']);
- notes.note_ids = [];
+ body = jasmine.createSpyObj('body', ['attr']);
+ discussionContainer = { length: 0 };
- spyOn(Notes, 'isNewNote');
- spyOn(Notes, 'animateAppendNote');
- Notes.isNewNote.and.returnValue(true);
- notes.isParallelView.and.returnValue(false);
- row.prevAll.and.returnValue(row);
- row.first.and.returnValue(row);
- row.find.and.returnValue(row);
+ $form.closest.and.returnValues(row, $form);
+ $form.find.and.returnValues(discussionContainer);
+ body.attr.and.returnValue('');
});
- describe('Discussion root note', () => {
- let body;
-
- beforeEach(() => {
- body = jasmine.createSpyObj('body', ['attr']);
- discussionContainer = { length: 0 };
+ it('should call Notes.animateAppendNote', () => {
+ Notes.prototype.renderDiscussionNote.call(notes, note, $form);
- $form.closest.and.returnValues(row, $form);
- $form.find.and.returnValues(discussionContainer);
- body.attr.and.returnValue('');
- });
-
- it('should call Notes.animateAppendNote', () => {
- Notes.prototype.renderDiscussionNote.call(notes, note, $form);
-
- expect(Notes.animateAppendNote).toHaveBeenCalledWith(
- note.discussion_html,
- $('.main-notes-list'),
- );
- });
+ expect(Notes.animateAppendNote).toHaveBeenCalledWith(
+ note.discussion_html,
+ $('.main-notes-list'),
+ );
+ });
- it('should append to row selected with line_code', () => {
- $form.length = 0;
- note.discussion_line_code = 'line_code';
- note.diff_discussion_html = '<tr></tr>';
+ it('should append to row selected with line_code', () => {
+ $form.length = 0;
+ note.discussion_line_code = 'line_code';
+ note.diff_discussion_html = '<tr></tr>';
- const line = document.createElement('div');
- line.id = note.discussion_line_code;
- document.body.appendChild(line);
+ const line = document.createElement('div');
+ line.id = note.discussion_line_code;
+ document.body.appendChild(line);
- $form.closest.and.returnValues($form);
+ $form.closest.and.returnValues($form);
- Notes.prototype.renderDiscussionNote.call(notes, note, $form);
+ Notes.prototype.renderDiscussionNote.call(notes, note, $form);
- expect(line.nextSibling.outerHTML).toEqual(note.diff_discussion_html);
- });
+ expect(line.nextSibling.outerHTML).toEqual(note.diff_discussion_html);
});
+ });
- describe('Discussion sub note', () => {
- beforeEach(() => {
- discussionContainer = { length: 1 };
+ describe('Discussion sub note', () => {
+ beforeEach(() => {
+ discussionContainer = { length: 1 };
- $form.closest.and.returnValues(row, $form);
- $form.find.and.returnValues(discussionContainer);
+ $form.closest.and.returnValues(row, $form);
+ $form.find.and.returnValues(discussionContainer);
- Notes.prototype.renderDiscussionNote.call(notes, note, $form);
- });
+ Notes.prototype.renderDiscussionNote.call(notes, note, $form);
+ });
- it('should call Notes.animateAppendNote', () => {
- expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, discussionContainer);
- });
+ it('should call Notes.animateAppendNote', () => {
+ expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, discussionContainer);
});
});
+ });
- describe('animateAppendNote', () => {
- let noteHTML;
- let $notesList;
- let $resultantNote;
+ describe('animateAppendNote', () => {
+ let noteHTML;
+ let $notesList;
+ let $resultantNote;
- beforeEach(() => {
- noteHTML = '<div></div>';
- $notesList = jasmine.createSpyObj('$notesList', ['append']);
+ beforeEach(() => {
+ noteHTML = '<div></div>';
+ $notesList = jasmine.createSpyObj('$notesList', ['append']);
- $resultantNote = Notes.animateAppendNote(noteHTML, $notesList);
- });
+ $resultantNote = Notes.animateAppendNote(noteHTML, $notesList);
+ });
- it('should have `fade-in-full` class', () => {
- expect($resultantNote.hasClass('fade-in-full')).toEqual(true);
- });
+ it('should have `fade-in-full` class', () => {
+ expect($resultantNote.hasClass('fade-in-full')).toEqual(true);
+ });
- it('should append note to the notes list', () => {
- expect($notesList.append).toHaveBeenCalledWith($resultantNote);
- });
+ it('should append note to the notes list', () => {
+ expect($notesList.append).toHaveBeenCalledWith($resultantNote);
});
+ });
- describe('animateUpdateNote', () => {
- let noteHTML;
- let $note;
- let $updatedNote;
+ describe('animateUpdateNote', () => {
+ let noteHTML;
+ let $note;
+ let $updatedNote;
- beforeEach(() => {
- noteHTML = '<div></div>';
- $note = jasmine.createSpyObj('$note', ['replaceWith']);
+ beforeEach(() => {
+ noteHTML = '<div></div>';
+ $note = jasmine.createSpyObj('$note', ['replaceWith']);
- $updatedNote = Notes.animateUpdateNote(noteHTML, $note);
- });
+ $updatedNote = Notes.animateUpdateNote(noteHTML, $note);
+ });
- it('should have `fade-in` class', () => {
- expect($updatedNote.hasClass('fade-in')).toEqual(true);
- });
+ it('should have `fade-in` class', () => {
+ expect($updatedNote.hasClass('fade-in')).toEqual(true);
+ });
- it('should call replaceWith on $note', () => {
- expect($note.replaceWith).toHaveBeenCalledWith($updatedNote);
- });
+ it('should call replaceWith on $note', () => {
+ expect($note.replaceWith).toHaveBeenCalledWith($updatedNote);
});
+ });
- describe('putEditFormInPlace', () => {
- it('should call GLForm with GFM parameter passed through', () => {
- const notes = new Notes('', []);
- const $el = $(`
- <div>
- <form></form>
- </div>
- `);
+ describe('putEditFormInPlace', () => {
+ it('should call GLForm with GFM parameter passed through', () => {
+ const notes = new Notes('', []);
+ const $el = $(`
+ <div>
+ <form></form>
+ </div>
+ `);
- notes.putEditFormInPlace($el);
+ notes.putEditFormInPlace($el);
- expect(notes.glForm.enableGFM).toBeTruthy();
- });
+ expect(notes.glForm.enableGFM).toBeTruthy();
});
+ });
- describe('postComment & updateComment', () => {
- const sampleComment = 'foo';
- const updatedComment = 'bar';
- const note = {
- id: 1234,
- html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
- <div class="note-text">${sampleComment}</div>
- </li>`,
- note: sampleComment,
- valid: true,
- };
- let $form;
- let $notesContainer;
- let mock;
+ describe('postComment & updateComment', () => {
+ const sampleComment = 'foo';
+ const updatedComment = 'bar';
+ const note = {
+ id: 1234,
+ html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
+ <div class="note-text">${sampleComment}</div>
+ </li>`,
+ note: sampleComment,
+ valid: true,
+ };
+ let $form;
+ let $notesContainer;
+ let mock;
+
+ function mockNotesPost() {
+ mock.onPost(NOTES_POST_PATH).reply(200, note);
+ }
+
+ function mockNotesPostError() {
+ mock.onPost(NOTES_POST_PATH).networkError();
+ }
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+
+ this.notes = new Notes('', []);
+ window.gon.current_username = 'root';
+ window.gon.current_user_fullname = 'Administrator';
+ $form = $('form.js-main-target-form');
+ $notesContainer = $('ul.main-notes-list');
+ $form.find('textarea.js-note-text').val(sampleComment);
+ });
- function mockNotesPost() {
- mock.onPost(NOTES_POST_PATH).reply(200, note);
- }
+ afterEach(() => {
+ mock.restore();
+ });
- function mockNotesPostError() {
- mock.onPost(NOTES_POST_PATH).networkError();
- }
+ it('should show placeholder note while new comment is being posted', () => {
+ mockNotesPost();
- beforeEach(() => {
- mock = new MockAdapter(axios);
-
- this.notes = new Notes('', []);
- window.gon.current_username = 'root';
- window.gon.current_user_fullname = 'Administrator';
- $form = $('form.js-main-target-form');
- $notesContainer = $('ul.main-notes-list');
- $form.find('textarea.js-note-text').val(sampleComment);
- });
+ $('.js-comment-button').click();
- afterEach(() => {
- mock.restore();
- });
+ expect($notesContainer.find('.note.being-posted').length).toBeGreaterThan(0);
+ });
- it('should show placeholder note while new comment is being posted', () => {
- mockNotesPost();
+ it('should remove placeholder note when new comment is done posting', done => {
+ mockNotesPost();
- $('.js-comment-button').click();
- expect($notesContainer.find('.note.being-posted').length > 0).toEqual(true);
- });
+ $('.js-comment-button').click();
- it('should remove placeholder note when new comment is done posting', done => {
- mockNotesPost();
+ setTimeout(() => {
+ expect($notesContainer.find('.note.being-posted').length).toEqual(0);
- $('.js-comment-button').click();
+ done();
+ });
+ });
- setTimeout(() => {
- expect($notesContainer.find('.note.being-posted').length).toEqual(0);
+ describe('postComment', () => {
+ it('disables the submit button', done => {
+ const $submitButton = $form.find('.js-comment-submit-button');
- done();
+ expect($submitButton).not.toBeDisabled();
+ const dummyEvent = {
+ preventDefault() {},
+ target: $submitButton,
+ };
+ mock.onPost(NOTES_POST_PATH).replyOnce(() => {
+ expect($submitButton).toBeDisabled();
+ return [200, note];
});
- });
- describe('postComment', () => {
- it('disables the submit button', done => {
- const $submitButton = $form.find('.js-comment-submit-button');
- expect($submitButton).not.toBeDisabled();
- const dummyEvent = {
- preventDefault() {},
- target: $submitButton,
- };
- mock.onPost(NOTES_POST_PATH).replyOnce(() => {
- expect($submitButton).toBeDisabled();
- return [200, note];
- });
-
- this.notes
- .postComment(dummyEvent)
- .then(() => {
- expect($submitButton).not.toBeDisabled();
- })
- .then(done)
- .catch(done.fail);
- });
+ this.notes
+ .postComment(dummyEvent)
+ .then(() => {
+ expect($submitButton).not.toBeDisabled();
+ })
+ .then(done)
+ .catch(done.fail);
});
+ });
- it('should show actual note element when new comment is done posting', done => {
- mockNotesPost();
+ it('should show actual note element when new comment is done posting', done => {
+ mockNotesPost();
- $('.js-comment-button').click();
+ $('.js-comment-button').click();
- setTimeout(() => {
- expect($notesContainer.find(`#note_${note.id}`).length > 0).toEqual(true);
+ setTimeout(() => {
+ expect($notesContainer.find(`#note_${note.id}`).length).toBeGreaterThan(0);
- done();
- });
+ done();
});
+ });
- it('should reset Form when new comment is done posting', done => {
- mockNotesPost();
+ it('should reset Form when new comment is done posting', done => {
+ mockNotesPost();
- $('.js-comment-button').click();
+ $('.js-comment-button').click();
- setTimeout(() => {
- expect($form.find('textarea.js-note-text').val()).toEqual('');
+ setTimeout(() => {
+ expect($form.find('textarea.js-note-text').val()).toEqual('');
- done();
- });
+ done();
});
+ });
- it('should show flash error message when new comment failed to be posted', done => {
- mockNotesPostError();
+ it('should show flash error message when new comment failed to be posted', done => {
+ mockNotesPostError();
- $('.js-comment-button').click();
+ $('.js-comment-button').click();
- setTimeout(() => {
- expect(
- $notesContainer
- .parent()
- .find('.flash-container .flash-text')
- .is(':visible'),
- ).toEqual(true);
+ setTimeout(() => {
+ expect(
+ $notesContainer
+ .parent()
+ .find('.flash-container .flash-text')
+ .is(':visible'),
+ ).toEqual(true);
- done();
- });
+ done();
});
+ });
- it('should show flash error message when comment failed to be updated', done => {
- mockNotesPost();
+ it('should show flash error message when comment failed to be updated', done => {
+ mockNotesPost();
- $('.js-comment-button').click();
+ $('.js-comment-button').click();
- timeoutPromise()
- .then(() => {
- const $noteEl = $notesContainer.find(`#note_${note.id}`);
- $noteEl.find('.js-note-edit').click();
- $noteEl.find('textarea.js-note-text').val(updatedComment);
+ timeoutPromise()
+ .then(() => {
+ const $noteEl = $notesContainer.find(`#note_${note.id}`);
+ $noteEl.find('.js-note-edit').click();
+ $noteEl.find('textarea.js-note-text').val(updatedComment);
- mock.restore();
+ mock.restore();
- mockNotesPostError();
+ mockNotesPostError();
- $noteEl.find('.js-comment-save-button').click();
- })
- .then(timeoutPromise)
- .then(() => {
- const $updatedNoteEl = $notesContainer.find(`#note_${note.id}`);
- expect($updatedNoteEl.hasClass('.being-posted')).toEqual(false); // Remove being-posted visuals
- expect(
- $updatedNoteEl
- .find('.note-text')
- .text()
- .trim(),
- ).toEqual(sampleComment); // See if comment reverted back to original
- expect($('.flash-container').is(':visible')).toEqual(true); // Flash error message shown
-
- done();
- })
- .catch(done.fail);
- });
+ $noteEl.find('.js-comment-save-button').click();
+ })
+ .then(timeoutPromise)
+ .then(() => {
+ const $updatedNoteEl = $notesContainer.find(`#note_${note.id}`);
+
+ expect($updatedNoteEl.hasClass('.being-posted')).toEqual(false); // Remove being-posted visuals
+ expect(
+ $updatedNoteEl
+ .find('.note-text')
+ .text()
+ .trim(),
+ ).toEqual(sampleComment); // See if comment reverted back to original
+
+ expect($('.flash-container').is(':visible')).toEqual(true); // Flash error message shown
+
+ done();
+ })
+ .catch(done.fail);
});
+ });
- describe('postComment with Slash commands', () => {
- const sampleComment = '/assign @root\n/award :100:';
- const note = {
- commands_changes: {
- assignee_id: 1,
- emoji_award: '100',
- },
- errors: {
- commands_only: ['Commands applied'],
+ describe('postComment with Slash commands', () => {
+ const sampleComment = '/assign @root\n/award :100:';
+ const note = {
+ commands_changes: {
+ assignee_id: 1,
+ emoji_award: '100',
+ },
+ errors: {
+ commands_only: ['Commands applied'],
+ },
+ valid: false,
+ };
+ let $form;
+ let $notesContainer;
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onPost(NOTES_POST_PATH).reply(200, note);
+
+ this.notes = new Notes('', []);
+ window.gon.current_username = 'root';
+ window.gon.current_user_fullname = 'Administrator';
+ gl.awardsHandler = {
+ addAwardToEmojiBar: () => {},
+ scrollToAwards: () => {},
+ };
+ gl.GfmAutoComplete = {
+ dataSources: {
+ commands: '/root/test-project/autocomplete_sources/commands',
},
- valid: false,
};
- let $form;
- let $notesContainer;
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onPost(NOTES_POST_PATH).reply(200, note);
-
- this.notes = new Notes('', []);
- window.gon.current_username = 'root';
- window.gon.current_user_fullname = 'Administrator';
- gl.awardsHandler = {
- addAwardToEmojiBar: () => {},
- scrollToAwards: () => {},
- };
- gl.GfmAutoComplete = {
- dataSources: {
- commands: '/root/test-project/autocomplete_sources/commands',
- },
- };
- $form = $('form.js-main-target-form');
- $notesContainer = $('ul.main-notes-list');
- $form.find('textarea.js-note-text').val(sampleComment);
- });
+ $form = $('form.js-main-target-form');
+ $notesContainer = $('ul.main-notes-list');
+ $form.find('textarea.js-note-text').val(sampleComment);
+ });
- afterEach(() => {
- mock.restore();
- });
+ afterEach(() => {
+ mock.restore();
+ });
- it('should remove slash command placeholder when comment with slash commands is done posting', done => {
- spyOn(gl.awardsHandler, 'addAwardToEmojiBar').and.callThrough();
- $('.js-comment-button').click();
+ it('should remove slash command placeholder when comment with slash commands is done posting', done => {
+ spyOn(gl.awardsHandler, 'addAwardToEmojiBar').and.callThrough();
+ $('.js-comment-button').click();
- expect($notesContainer.find('.system-note.being-posted').length).toEqual(1); // Placeholder shown
+ expect($notesContainer.find('.system-note.being-posted').length).toEqual(1); // Placeholder shown
- setTimeout(() => {
- expect($notesContainer.find('.system-note.being-posted').length).toEqual(0); // Placeholder removed
- done();
- });
+ setTimeout(() => {
+ expect($notesContainer.find('.system-note.being-posted').length).toEqual(0); // Placeholder removed
+ done();
});
});
+ });
- describe('update comment with script tags', () => {
- const sampleComment = '<script></script>';
- const updatedComment = '<script></script>';
- const note = {
- id: 1234,
- html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
- <div class="note-text">${sampleComment}</div>
- </li>`,
- note: sampleComment,
- valid: true,
- };
- let $form;
- let $notesContainer;
- let mock;
+ describe('update comment with script tags', () => {
+ const sampleComment = '<script></script>';
+ const updatedComment = '<script></script>';
+ const note = {
+ id: 1234,
+ html: `<li class="note note-row-1234 timeline-entry" id="note_1234">
+ <div class="note-text">${sampleComment}</div>
+ </li>`,
+ note: sampleComment,
+ valid: true,
+ };
+ let $form;
+ let $notesContainer;
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onPost(NOTES_POST_PATH).reply(200, note);
+
+ this.notes = new Notes('', []);
+ window.gon.current_username = 'root';
+ window.gon.current_user_fullname = 'Administrator';
+ $form = $('form.js-main-target-form');
+ $notesContainer = $('ul.main-notes-list');
+ $form.find('textarea.js-note-text').html(sampleComment);
+ });
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onPost(NOTES_POST_PATH).reply(200, note);
-
- this.notes = new Notes('', []);
- window.gon.current_username = 'root';
- window.gon.current_user_fullname = 'Administrator';
- $form = $('form.js-main-target-form');
- $notesContainer = $('ul.main-notes-list');
- $form.find('textarea.js-note-text').html(sampleComment);
- });
+ afterEach(() => {
+ mock.restore();
+ });
- afterEach(() => {
- mock.restore();
- });
+ it('should not render a script tag', done => {
+ $('.js-comment-button').click();
- it('should not render a script tag', done => {
- $('.js-comment-button').click();
+ setTimeout(() => {
+ const $noteEl = $notesContainer.find(`#note_${note.id}`);
+ $noteEl.find('.js-note-edit').click();
+ $noteEl.find('textarea.js-note-text').html(updatedComment);
+ $noteEl.find('.js-comment-save-button').click();
- setTimeout(() => {
- const $noteEl = $notesContainer.find(`#note_${note.id}`);
- $noteEl.find('.js-note-edit').click();
- $noteEl.find('textarea.js-note-text').html(updatedComment);
- $noteEl.find('.js-comment-save-button').click();
+ const $updatedNoteEl = $notesContainer
+ .find(`#note_${note.id}`)
+ .find('.js-task-list-container');
- const $updatedNoteEl = $notesContainer
- .find(`#note_${note.id}`)
- .find('.js-task-list-container');
- expect(
- $updatedNoteEl
- .find('.note-text')
- .text()
- .trim(),
- ).toEqual('');
+ expect(
+ $updatedNoteEl
+ .find('.note-text')
+ .text()
+ .trim(),
+ ).toEqual('');
- done();
- });
+ done();
});
});
+ });
- describe('getFormData', () => {
- let $form;
- let sampleComment;
+ describe('getFormData', () => {
+ let $form;
+ let sampleComment;
- beforeEach(() => {
- this.notes = new Notes('', []);
+ beforeEach(() => {
+ this.notes = new Notes('', []);
- $form = $('form');
- sampleComment = 'foobar';
- });
+ $form = $('form');
+ sampleComment = 'foobar';
+ });
- it('should return form metadata object from form reference', () => {
- $form.find('textarea.js-note-text').val(sampleComment);
- const { formData, formContent, formAction } = this.notes.getFormData($form);
+ it('should return form metadata object from form reference', () => {
+ $form.find('textarea.js-note-text').val(sampleComment);
+ const { formData, formContent, formAction } = this.notes.getFormData($form);
- expect(formData.indexOf(sampleComment) > -1).toBe(true);
- expect(formContent).toEqual(sampleComment);
- expect(formAction).toEqual($form.attr('action'));
- });
+ expect(formData.indexOf(sampleComment)).toBeGreaterThan(-1);
+ expect(formContent).toEqual(sampleComment);
+ expect(formAction).toEqual($form.attr('action'));
+ });
- it('should return form metadata with sanitized formContent from form reference', () => {
- spyOn(_, 'escape').and.callFake(htmlEscape);
+ it('should return form metadata with sanitized formContent from form reference', () => {
+ spyOn(_, 'escape').and.callFake(htmlEscape);
- sampleComment = '<script>alert("Boom!");</script>';
- $form.find('textarea.js-note-text').val(sampleComment);
+ sampleComment = '<script>alert("Boom!");</script>';
+ $form.find('textarea.js-note-text').val(sampleComment);
- const { formContent } = this.notes.getFormData($form);
+ const { formContent } = this.notes.getFormData($form);
- expect(_.escape).toHaveBeenCalledWith(sampleComment);
- expect(formContent).toEqual('&lt;script&gt;alert(&quot;Boom!&quot;);&lt;/script&gt;');
- });
+ expect(_.escape).toHaveBeenCalledWith(sampleComment);
+ expect(formContent).toEqual('&lt;script&gt;alert(&quot;Boom!&quot;);&lt;/script&gt;');
});
+ });
- describe('hasQuickActions', () => {
- beforeEach(() => {
- this.notes = new Notes('', []);
- });
+ describe('hasQuickActions', () => {
+ beforeEach(() => {
+ this.notes = new Notes('', []);
+ });
- it('should return true when comment begins with a quick action', () => {
- const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign Merging this';
- const hasQuickActions = this.notes.hasQuickActions(sampleComment);
+ it('should return true when comment begins with a quick action', () => {
+ const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign Merging this';
+ const hasQuickActions = this.notes.hasQuickActions(sampleComment);
- expect(hasQuickActions).toBeTruthy();
- });
+ expect(hasQuickActions).toBeTruthy();
+ });
- it('should return false when comment does NOT begin with a quick action', () => {
- const sampleComment = 'Hey, /unassign Merging this';
- const hasQuickActions = this.notes.hasQuickActions(sampleComment);
+ it('should return false when comment does NOT begin with a quick action', () => {
+ const sampleComment = 'Hey, /unassign Merging this';
+ const hasQuickActions = this.notes.hasQuickActions(sampleComment);
- expect(hasQuickActions).toBeFalsy();
- });
+ expect(hasQuickActions).toBeFalsy();
+ });
- it('should return false when comment does NOT have any quick actions', () => {
- const sampleComment = 'Looking good, Awesome!';
- const hasQuickActions = this.notes.hasQuickActions(sampleComment);
+ it('should return false when comment does NOT have any quick actions', () => {
+ const sampleComment = 'Looking good, Awesome!';
+ const hasQuickActions = this.notes.hasQuickActions(sampleComment);
- expect(hasQuickActions).toBeFalsy();
- });
+ expect(hasQuickActions).toBeFalsy();
});
+ });
- describe('stripQuickActions', () => {
- it('should strip quick actions from the comment which begins with a quick action', () => {
- this.notes = new Notes();
- const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign Merging this';
- const stripedComment = this.notes.stripQuickActions(sampleComment);
+ describe('stripQuickActions', () => {
+ it('should strip quick actions from the comment which begins with a quick action', () => {
+ this.notes = new Notes();
+ const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign Merging this';
+ const stripedComment = this.notes.stripQuickActions(sampleComment);
- expect(stripedComment).toBe('');
- });
+ expect(stripedComment).toBe('');
+ });
- it('should strip quick actions from the comment but leaves plain comment if it is present', () => {
- this.notes = new Notes();
- const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign\nMerging this';
- const stripedComment = this.notes.stripQuickActions(sampleComment);
+ it('should strip quick actions from the comment but leaves plain comment if it is present', () => {
+ this.notes = new Notes();
+ const sampleComment = '/wip\n/milestone %1.0\n/merge\n/unassign\nMerging this';
+ const stripedComment = this.notes.stripQuickActions(sampleComment);
- expect(stripedComment).toBe('Merging this');
- });
+ expect(stripedComment).toBe('Merging this');
+ });
- it('should NOT strip string that has slashes within', () => {
- this.notes = new Notes();
- const sampleComment = 'http://127.0.0.1:3000/root/gitlab-shell/issues/1';
- const stripedComment = this.notes.stripQuickActions(sampleComment);
+ it('should NOT strip string that has slashes within', () => {
+ this.notes = new Notes();
+ const sampleComment = 'http://127.0.0.1:3000/root/gitlab-shell/issues/1';
+ const stripedComment = this.notes.stripQuickActions(sampleComment);
- expect(stripedComment).toBe(sampleComment);
- });
+ expect(stripedComment).toBe(sampleComment);
});
+ });
- describe('getQuickActionDescription', () => {
- const availableQuickActions = [
- { name: 'close', description: 'Close this issue', params: [] },
- { name: 'title', description: 'Change title', params: [{}] },
- { name: 'estimate', description: 'Set time estimate', params: [{}] },
- ];
+ describe('getQuickActionDescription', () => {
+ const availableQuickActions = [
+ { name: 'close', description: 'Close this issue', params: [] },
+ { name: 'title', description: 'Change title', params: [{}] },
+ { name: 'estimate', description: 'Set time estimate', params: [{}] },
+ ];
- beforeEach(() => {
- this.notes = new Notes();
- });
+ beforeEach(() => {
+ this.notes = new Notes();
+ });
- it('should return executing quick action description when note has single quick action', () => {
- const sampleComment = '/close';
- expect(this.notes.getQuickActionDescription(sampleComment, availableQuickActions)).toBe(
- 'Applying command to close this issue',
- );
- });
+ it('should return executing quick action description when note has single quick action', () => {
+ const sampleComment = '/close';
- it('should return generic multiple quick action description when note has multiple quick actions', () => {
- const sampleComment = '/close\n/title [Duplicate] Issue foobar';
- expect(this.notes.getQuickActionDescription(sampleComment, availableQuickActions)).toBe(
- 'Applying multiple commands',
- );
- });
+ expect(this.notes.getQuickActionDescription(sampleComment, availableQuickActions)).toBe(
+ 'Applying command to close this issue',
+ );
+ });
- it('should return generic quick action description when available quick actions list is not populated', () => {
- const sampleComment = '/close\n/title [Duplicate] Issue foobar';
- expect(this.notes.getQuickActionDescription(sampleComment)).toBe('Applying command');
- });
+ it('should return generic multiple quick action description when note has multiple quick actions', () => {
+ const sampleComment = '/close\n/title [Duplicate] Issue foobar';
+
+ expect(this.notes.getQuickActionDescription(sampleComment, availableQuickActions)).toBe(
+ 'Applying multiple commands',
+ );
});
- describe('createPlaceholderNote', () => {
- const sampleComment = 'foobar';
- const uniqueId = 'b1234-a4567';
- const currentUsername = 'root';
- const currentUserFullname = 'Administrator';
- const currentUserAvatar = 'avatar_url';
+ it('should return generic quick action description when available quick actions list is not populated', () => {
+ const sampleComment = '/close\n/title [Duplicate] Issue foobar';
- beforeEach(() => {
- this.notes = new Notes('', []);
- });
+ expect(this.notes.getQuickActionDescription(sampleComment)).toBe('Applying command');
+ });
+ });
- it('should return constructed placeholder element for regular note based on form contents', () => {
- const $tempNote = this.notes.createPlaceholderNote({
- formContent: sampleComment,
- uniqueId,
- isDiscussionNote: false,
- currentUsername,
- currentUserFullname,
- currentUserAvatar,
- });
- const $tempNoteHeader = $tempNote.find('.note-header');
-
- expect($tempNote.prop('nodeName')).toEqual('LI');
- expect($tempNote.attr('id')).toEqual(uniqueId);
- expect($tempNote.hasClass('being-posted')).toBeTruthy();
- expect($tempNote.hasClass('fade-in-half')).toBeTruthy();
- $tempNote.find('.timeline-icon > a, .note-header-info > a').each(function() {
- expect($(this).attr('href')).toEqual(`/${currentUsername}`);
- });
- expect($tempNote.find('.timeline-icon .avatar').attr('src')).toEqual(currentUserAvatar);
- expect($tempNote.find('.timeline-content').hasClass('discussion')).toBeFalsy();
- expect(
- $tempNoteHeader
- .find('.d-none.d-sm-inline-block')
- .text()
- .trim(),
- ).toEqual(currentUserFullname);
- expect(
- $tempNoteHeader
- .find('.note-headline-light')
- .text()
- .trim(),
- ).toEqual(`@${currentUsername}`);
- expect(
- $tempNote
- .find('.note-body .note-text p')
- .text()
- .trim(),
- ).toEqual(sampleComment);
- });
+ describe('createPlaceholderNote', () => {
+ const sampleComment = 'foobar';
+ const uniqueId = 'b1234-a4567';
+ const currentUsername = 'root';
+ const currentUserFullname = 'Administrator';
+ const currentUserAvatar = 'avatar_url';
- it('should return constructed placeholder element for discussion note based on form contents', () => {
- const $tempNote = this.notes.createPlaceholderNote({
- formContent: sampleComment,
- uniqueId,
- isDiscussionNote: true,
- currentUsername,
- currentUserFullname,
- });
+ beforeEach(() => {
+ this.notes = new Notes('', []);
+ });
- expect($tempNote.prop('nodeName')).toEqual('LI');
- expect($tempNote.find('.timeline-content').hasClass('discussion')).toBeTruthy();
- });
+ it('should return constructed placeholder element for regular note based on form contents', () => {
+ const $tempNote = this.notes.createPlaceholderNote({
+ formContent: sampleComment,
+ uniqueId,
+ isDiscussionNote: false,
+ currentUsername,
+ currentUserFullname,
+ currentUserAvatar,
+ });
+ const $tempNoteHeader = $tempNote.find('.note-header');
+
+ expect($tempNote.prop('nodeName')).toEqual('LI');
+ expect($tempNote.attr('id')).toEqual(uniqueId);
+ expect($tempNote.hasClass('being-posted')).toBeTruthy();
+ expect($tempNote.hasClass('fade-in-half')).toBeTruthy();
+ $tempNote.find('.timeline-icon > a, .note-header-info > a').each(function() {
+ expect($(this).attr('href')).toEqual(`/${currentUsername}`);
+ });
+
+ expect($tempNote.find('.timeline-icon .avatar').attr('src')).toEqual(currentUserAvatar);
+ expect($tempNote.find('.timeline-content').hasClass('discussion')).toBeFalsy();
+ expect(
+ $tempNoteHeader
+ .find('.d-none.d-sm-inline-block')
+ .text()
+ .trim(),
+ ).toEqual(currentUserFullname);
+
+ expect(
+ $tempNoteHeader
+ .find('.note-headline-light')
+ .text()
+ .trim(),
+ ).toEqual(`@${currentUsername}`);
+
+ expect(
+ $tempNote
+ .find('.note-body .note-text p')
+ .text()
+ .trim(),
+ ).toEqual(sampleComment);
+ });
- it('should return a escaped user name', () => {
- const currentUserFullnameXSS = 'Foo <script>alert("XSS")</script>';
- const $tempNote = this.notes.createPlaceholderNote({
- formContent: sampleComment,
- uniqueId,
- isDiscussionNote: false,
- currentUsername,
- currentUserFullname: currentUserFullnameXSS,
- currentUserAvatar,
- });
- const $tempNoteHeader = $tempNote.find('.note-header');
- expect(
- $tempNoteHeader
- .find('.d-none.d-sm-inline-block')
- .text()
- .trim(),
- ).toEqual('Foo &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;');
+ it('should return constructed placeholder element for discussion note based on form contents', () => {
+ const $tempNote = this.notes.createPlaceholderNote({
+ formContent: sampleComment,
+ uniqueId,
+ isDiscussionNote: true,
+ currentUsername,
+ currentUserFullname,
});
+
+ expect($tempNote.prop('nodeName')).toEqual('LI');
+ expect($tempNote.find('.timeline-content').hasClass('discussion')).toBeTruthy();
});
- describe('createPlaceholderSystemNote', () => {
- const sampleCommandDescription = 'Applying command to close this issue';
- const uniqueId = 'b1234-a4567';
+ it('should return a escaped user name', () => {
+ const currentUserFullnameXSS = 'Foo <script>alert("XSS")</script>';
+ const $tempNote = this.notes.createPlaceholderNote({
+ formContent: sampleComment,
+ uniqueId,
+ isDiscussionNote: false,
+ currentUsername,
+ currentUserFullname: currentUserFullnameXSS,
+ currentUserAvatar,
+ });
+ const $tempNoteHeader = $tempNote.find('.note-header');
+
+ expect(
+ $tempNoteHeader
+ .find('.d-none.d-sm-inline-block')
+ .text()
+ .trim(),
+ ).toEqual('Foo &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;');
+ });
+ });
- beforeEach(() => {
- this.notes = new Notes('', []);
- spyOn(_, 'escape').and.callFake(htmlEscape);
- });
+ describe('createPlaceholderSystemNote', () => {
+ const sampleCommandDescription = 'Applying command to close this issue';
+ const uniqueId = 'b1234-a4567';
- it('should return constructed placeholder element for system note based on form contents', () => {
- const $tempNote = this.notes.createPlaceholderSystemNote({
- formContent: sampleCommandDescription,
- uniqueId,
- });
+ beforeEach(() => {
+ this.notes = new Notes('', []);
+ spyOn(_, 'escape').and.callFake(htmlEscape);
+ });
- expect($tempNote.prop('nodeName')).toEqual('LI');
- expect($tempNote.attr('id')).toEqual(uniqueId);
- expect($tempNote.hasClass('being-posted')).toBeTruthy();
- expect($tempNote.hasClass('fade-in-half')).toBeTruthy();
- expect(
- $tempNote
- .find('.timeline-content i')
- .text()
- .trim(),
- ).toEqual(sampleCommandDescription);
- });
+ it('should return constructed placeholder element for system note based on form contents', () => {
+ const $tempNote = this.notes.createPlaceholderSystemNote({
+ formContent: sampleCommandDescription,
+ uniqueId,
+ });
+
+ expect($tempNote.prop('nodeName')).toEqual('LI');
+ expect($tempNote.attr('id')).toEqual(uniqueId);
+ expect($tempNote.hasClass('being-posted')).toBeTruthy();
+ expect($tempNote.hasClass('fade-in-half')).toBeTruthy();
+ expect(
+ $tempNote
+ .find('.timeline-content i')
+ .text()
+ .trim(),
+ ).toEqual(sampleCommandDescription);
});
+ });
- describe('appendFlash', () => {
- beforeEach(() => {
- this.notes = new Notes();
- });
+ describe('appendFlash', () => {
+ beforeEach(() => {
+ this.notes = new Notes();
+ });
- it('shows a flash message', () => {
- this.notes.addFlash('Error message', FLASH_TYPE_ALERT, this.notes.parentTimeline.get(0));
+ it('shows a flash message', () => {
+ this.notes.addFlash('Error message', FLASH_TYPE_ALERT, this.notes.parentTimeline.get(0));
- expect($('.flash-alert').is(':visible')).toBeTruthy();
- });
+ expect($('.flash-alert').is(':visible')).toBeTruthy();
});
+ });
- describe('clearFlash', () => {
- beforeEach(() => {
- $(document).off('ajax:success');
- this.notes = new Notes();
- });
+ describe('clearFlash', () => {
+ beforeEach(() => {
+ $(document).off('ajax:success');
+ this.notes = new Notes();
+ });
- it('hides visible flash message', () => {
- this.notes.addFlash('Error message 1', FLASH_TYPE_ALERT, this.notes.parentTimeline.get(0));
+ it('hides visible flash message', () => {
+ this.notes.addFlash('Error message 1', FLASH_TYPE_ALERT, this.notes.parentTimeline.get(0));
- this.notes.clearFlash();
+ this.notes.clearFlash();
- expect($('.flash-alert').is(':visible')).toBeFalsy();
- });
+ expect($('.flash-alert').is(':visible')).toBeFalsy();
});
});
-}.call(window));
+});
diff --git a/spec/javascripts/oauth_remember_me_spec.js b/spec/javascripts/oauth_remember_me_spec.js
index 8816fe6defb..2caa266b85f 100644
--- a/spec/javascripts/oauth_remember_me_spec.js
+++ b/spec/javascripts/oauth_remember_me_spec.js
@@ -13,8 +13,13 @@ describe('OAuthRememberMe', () => {
it('adds the "remember_me" query parameter to all OAuth login buttons', () => {
$('#oauth-container #remember_me').click();
- expect($('#oauth-container .oauth-login.twitter').attr('href')).toBe('http://example.com/?remember_me=1');
- expect($('#oauth-container .oauth-login.github').attr('href')).toBe('http://example.com/?remember_me=1');
+ expect($('#oauth-container .oauth-login.twitter').attr('href')).toBe(
+ 'http://example.com/?remember_me=1',
+ );
+
+ expect($('#oauth-container .oauth-login.github').attr('href')).toBe(
+ 'http://example.com/?remember_me=1',
+ );
});
it('removes the "remember_me" query parameter from all OAuth login buttons', () => {
diff --git a/spec/javascripts/pager_spec.js b/spec/javascripts/pager_spec.js
index 04f2e7ef4f9..93efc139254 100644
--- a/spec/javascripts/pager_spec.js
+++ b/spec/javascripts/pager_spec.js
@@ -30,6 +30,7 @@ describe('pager', () => {
const href = `${gl.TEST_HOST}/some_list.json`;
setFixtures(`<div class="content_list" data-href="${href}"></div>`);
Pager.init();
+
expect(Pager.url).toBe(href);
});
@@ -37,12 +38,14 @@ describe('pager', () => {
const href = `${gl.TEST_HOST}/some_list`;
spyOnDependency(Pager, 'removeParams').and.returnValue(href);
Pager.init();
+
expect(Pager.url).toBe(href);
});
it('should get initial offset from query parameter', () => {
window.history.replaceState({}, null, '?offset=100');
Pager.init();
+
expect(Pager.offset).toBe(100);
});
@@ -51,6 +54,7 @@ describe('pager', () => {
const href = `${gl.TEST_HOST}/some_list?filter=test`;
const removeParams = spyOnDependency(Pager, 'removeParams').and.returnValue(href);
Pager.init();
+
expect(removeParams).toHaveBeenCalledWith(['limit', 'offset']);
expect(Pager.url).toEqual(href);
});
@@ -132,6 +136,7 @@ describe('pager', () => {
offset: 100,
},
});
+
expect(url).toBe('/some_list');
done();
diff --git a/spec/javascripts/pages/admin/abuse_reports/abuse_reports_spec.js b/spec/javascripts/pages/admin/abuse_reports/abuse_reports_spec.js
index b0dc6ccc3d4..23d07056925 100644
--- a/spec/javascripts/pages/admin/abuse_reports/abuse_reports_spec.js
+++ b/spec/javascripts/pages/admin/abuse_reports/abuse_reports_spec.js
@@ -8,14 +8,15 @@ describe('Abuse Reports', () => {
let $messages;
- const assertMaxLength = $message => expect($message.text().length).toEqual(MAX_MESSAGE_LENGTH);
- const findMessage = searchText => $messages.filter(
- (index, element) => element.innerText.indexOf(searchText) > -1,
- ).first();
+ const assertMaxLength = $message => {
+ expect($message.text().length).toEqual(MAX_MESSAGE_LENGTH);
+ };
+ const findMessage = searchText =>
+ $messages.filter((index, element) => element.innerText.indexOf(searchText) > -1).first();
preloadFixtures(FIXTURE);
- beforeEach(function () {
+ beforeEach(function() {
loadFixtures(FIXTURE);
this.abuseReports = new AbuseReports();
$messages = $('.abuse-reports .message');
@@ -23,18 +24,21 @@ describe('Abuse Reports', () => {
it('should truncate long messages', () => {
const $longMessage = findMessage('LONG MESSAGE');
+
expect($longMessage.data('originalMessage')).toEqual(jasmine.anything());
assertMaxLength($longMessage);
});
it('should not truncate short messages', () => {
const $shortMessage = findMessage('SHORT MESSAGE');
+
expect($shortMessage.data('originalMessage')).not.toEqual(jasmine.anything());
});
it('should allow clicking a truncated message to expand and collapse the full message', () => {
const $longMessage = findMessage('LONG MESSAGE');
$longMessage.click();
+
expect($longMessage.data('originalMessage').length).toEqual($longMessage.text().length);
$longMessage.click();
assertMaxLength($longMessage);
diff --git a/spec/javascripts/pages/admin/application_settings/account_and_limits_spec.js b/spec/javascripts/pages/admin/application_settings/account_and_limits_spec.js
new file mode 100644
index 00000000000..561bd2c96cb
--- /dev/null
+++ b/spec/javascripts/pages/admin/application_settings/account_and_limits_spec.js
@@ -0,0 +1,36 @@
+import $ from 'jquery';
+import initUserInternalRegexPlaceholder, {
+ PLACEHOLDER_USER_EXTERNAL_DEFAULT_FALSE,
+ PLACEHOLDER_USER_EXTERNAL_DEFAULT_TRUE,
+} from '~/pages/admin/application_settings/account_and_limits';
+
+describe('AccountAndLimits', () => {
+ const FIXTURE = 'application_settings/accounts_and_limit.html.raw';
+ let $userDefaultExternal;
+ let $userInternalRegex;
+ preloadFixtures(FIXTURE);
+
+ beforeEach(() => {
+ loadFixtures(FIXTURE);
+ initUserInternalRegexPlaceholder();
+ $userDefaultExternal = $('#application_setting_user_default_external');
+ $userInternalRegex = document.querySelector('#application_setting_user_default_internal_regex');
+ });
+
+ describe('Changing of userInternalRegex when userDefaultExternal', () => {
+ it('is unchecked', () => {
+ expect($userDefaultExternal.prop('checked')).toBeFalsy();
+ expect($userInternalRegex.placeholder).toEqual(PLACEHOLDER_USER_EXTERNAL_DEFAULT_FALSE);
+ expect($userInternalRegex.readOnly).toBeTruthy();
+ });
+
+ it('is checked', done => {
+ if (!$userDefaultExternal.prop('checked')) $userDefaultExternal.click();
+
+ expect($userDefaultExternal.prop('checked')).toBeTruthy();
+ expect($userInternalRegex.placeholder).toEqual(PLACEHOLDER_USER_EXTERNAL_DEFAULT_TRUE);
+ expect($userInternalRegex.readOnly).toBeFalsy();
+ done();
+ });
+ });
+});
diff --git a/spec/javascripts/pages/admin/jobs/index/components/stop_jobs_modal_spec.js b/spec/javascripts/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
index b69e5f9a3a0..6bfb3f5ca21 100644
--- a/spec/javascripts/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
+++ b/spec/javascripts/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
@@ -21,10 +21,10 @@ describe('stop_jobs_modal.vue', () => {
});
describe('onSubmit', () => {
- it('stops jobs and redirects to overview page', (done) => {
+ it('stops jobs and redirects to overview page', done => {
const responseURL = `${gl.TEST_HOST}/stop_jobs_modal.vue/jobs`;
const redirectSpy = spyOnDependency(stopJobsModal, 'redirectTo');
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(props.url);
return Promise.resolve({
request: {
@@ -34,24 +34,24 @@ describe('stop_jobs_modal.vue', () => {
});
vm.onSubmit()
- .then(() => {
- expect(redirectSpy).toHaveBeenCalledWith(responseURL);
- })
- .then(done)
- .catch(done.fail);
+ .then(() => {
+ expect(redirectSpy).toHaveBeenCalledWith(responseURL);
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('displays error if stopping jobs failed', (done) => {
+ it('displays error if stopping jobs failed', done => {
const dummyError = new Error('stopping jobs failed');
const redirectSpy = spyOnDependency(stopJobsModal, 'redirectTo');
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(props.url);
return Promise.reject(dummyError);
});
vm.onSubmit()
.then(done.fail)
- .catch((error) => {
+ .catch(error => {
expect(error).toBe(dummyError);
expect(redirectSpy).not.toHaveBeenCalled();
})
diff --git a/spec/javascripts/pages/admin/users/new/index_spec.js b/spec/javascripts/pages/admin/users/new/index_spec.js
new file mode 100644
index 00000000000..5a849f34bc3
--- /dev/null
+++ b/spec/javascripts/pages/admin/users/new/index_spec.js
@@ -0,0 +1,43 @@
+import $ from 'jquery';
+import UserInternalRegexHandler from '~/pages/admin/users/new/index';
+
+describe('UserInternalRegexHandler', () => {
+ const FIXTURE = 'admin/users/new_with_internal_user_regex.html.raw';
+ let $userExternal;
+ let $userEmail;
+ let $warningMessage;
+
+ preloadFixtures(FIXTURE);
+
+ beforeEach(() => {
+ loadFixtures(FIXTURE);
+ // eslint-disable-next-line no-new
+ new UserInternalRegexHandler();
+ $userExternal = $('#user_external');
+ $userEmail = $('#user_email');
+ $warningMessage = $('#warning_external_automatically_set');
+ if (!$userExternal.prop('checked')) $userExternal.prop('checked', 'checked');
+ });
+
+ describe('Behaviour of userExternal checkbox when', () => {
+ it('matches email as internal', done => {
+ expect($warningMessage.hasClass('hidden')).toBeTruthy();
+
+ $userEmail.val('test@').trigger('input');
+
+ expect($userExternal.prop('checked')).toBeFalsy();
+ expect($warningMessage.hasClass('hidden')).toBeFalsy();
+ done();
+ });
+
+ it('matches email as external', done => {
+ expect($warningMessage.hasClass('hidden')).toBeTruthy();
+
+ $userEmail.val('test.ext@').trigger('input');
+
+ expect($userExternal.prop('checked')).toBeTruthy();
+ expect($warningMessage.hasClass('hidden')).toBeTruthy();
+ done();
+ });
+ });
+});
diff --git a/spec/javascripts/pages/labels/components/promote_label_modal_spec.js b/spec/javascripts/pages/labels/components/promote_label_modal_spec.js
index a24f8204fe1..08a8362797b 100644
--- a/spec/javascripts/pages/labels/components/promote_label_modal_spec.js
+++ b/spec/javascripts/pages/labels/components/promote_label_modal_spec.js
@@ -25,7 +25,11 @@ describe('Promote label modal', () => {
});
it('contains the proper description', () => {
- expect(vm.text).toContain(`Promoting ${labelMockData.labelTitle} will make it available for all projects inside ${labelMockData.groupName}`);
+ expect(vm.text).toContain(
+ `Promoting ${labelMockData.labelTitle} will make it available for all projects inside ${
+ labelMockData.groupName
+ }`,
+ );
});
it('contains a label span with the color', () => {
@@ -48,11 +52,14 @@ describe('Promote label modal', () => {
vm.$destroy();
});
- it('redirects when a label is promoted', (done) => {
+ it('redirects when a label is promoted', done => {
const responseURL = `${gl.TEST_HOST}/dummy/endpoint`;
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(labelMockData.url);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestStarted', labelMockData.url);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'promoteLabelModal.requestStarted',
+ labelMockData.url,
+ );
return Promise.resolve({
request: {
responseURL,
@@ -62,25 +69,34 @@ describe('Promote label modal', () => {
vm.onSubmit()
.then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', { labelUrl: labelMockData.url, successful: true });
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
+ labelUrl: labelMockData.url,
+ successful: true,
+ });
})
.then(done)
.catch(done.fail);
});
- it('displays an error if promoting a label failed', (done) => {
+ it('displays an error if promoting a label failed', done => {
const dummyError = new Error('promoting label failed');
dummyError.response = { status: 500 };
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(labelMockData.url);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestStarted', labelMockData.url);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'promoteLabelModal.requestStarted',
+ labelMockData.url,
+ );
return Promise.reject(dummyError);
});
vm.onSubmit()
- .catch((error) => {
+ .catch(error => {
expect(error).toBe(dummyError);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', { labelUrl: labelMockData.url, successful: false });
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
+ labelUrl: labelMockData.url,
+ successful: false,
+ });
})
.then(done)
.catch(done.fail);
diff --git a/spec/javascripts/pages/milestones/shared/components/delete_milestone_modal_spec.js b/spec/javascripts/pages/milestones/shared/components/delete_milestone_modal_spec.js
index 94401beb5c9..fe293083e4c 100644
--- a/spec/javascripts/pages/milestones/shared/components/delete_milestone_modal_spec.js
+++ b/spec/javascripts/pages/milestones/shared/components/delete_milestone_modal_spec.js
@@ -27,11 +27,14 @@ describe('delete_milestone_modal.vue', () => {
spyOn(eventHub, '$emit');
});
- it('deletes milestone and redirects to overview page', (done) => {
+ it('deletes milestone and redirects to overview page', done => {
const responseURL = `${gl.TEST_HOST}/delete_milestone_modal.vue/milestoneOverview`;
- spyOn(axios, 'delete').and.callFake((url) => {
+ spyOn(axios, 'delete').and.callFake(url => {
expect(url).toBe(props.milestoneUrl);
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestStarted', props.milestoneUrl);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'deleteMilestoneModal.requestStarted',
+ props.milestoneUrl,
+ );
eventHub.$emit.calls.reset();
return Promise.resolve({
request: {
@@ -42,30 +45,39 @@ describe('delete_milestone_modal.vue', () => {
const redirectSpy = spyOnDependency(deleteMilestoneModal, 'redirectTo');
vm.onSubmit()
- .then(() => {
- expect(redirectSpy).toHaveBeenCalledWith(responseURL);
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', { milestoneUrl: props.milestoneUrl, successful: true });
- })
- .then(done)
- .catch(done.fail);
+ .then(() => {
+ expect(redirectSpy).toHaveBeenCalledWith(responseURL);
+ expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
+ milestoneUrl: props.milestoneUrl,
+ successful: true,
+ });
+ })
+ .then(done)
+ .catch(done.fail);
});
- it('displays error if deleting milestone failed', (done) => {
+ it('displays error if deleting milestone failed', done => {
const dummyError = new Error('deleting milestone failed');
dummyError.response = { status: 418 };
- spyOn(axios, 'delete').and.callFake((url) => {
+ spyOn(axios, 'delete').and.callFake(url => {
expect(url).toBe(props.milestoneUrl);
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestStarted', props.milestoneUrl);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'deleteMilestoneModal.requestStarted',
+ props.milestoneUrl,
+ );
eventHub.$emit.calls.reset();
return Promise.reject(dummyError);
});
const redirectSpy = spyOnDependency(deleteMilestoneModal, 'redirectTo');
vm.onSubmit()
- .catch((error) => {
+ .catch(error => {
expect(error).toBe(dummyError);
expect(redirectSpy).not.toHaveBeenCalled();
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', { milestoneUrl: props.milestoneUrl, successful: false });
+ expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
+ milestoneUrl: props.milestoneUrl,
+ successful: false,
+ });
})
.then(done)
.catch(done.fail);
@@ -81,7 +93,8 @@ describe('delete_milestone_modal.vue', () => {
});
it('contains neither issue nor milestone count', () => {
- vm = mountComponent(Component, { ...props,
+ vm = mountComponent(Component, {
+ ...props,
issueCount: 0,
mergeRequestCount: 0,
});
diff --git a/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js b/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js
index 8b220423637..2ac73ef3024 100644
--- a/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js
+++ b/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js
@@ -23,7 +23,11 @@ describe('Promote milestone modal', () => {
});
it('contains the proper description', () => {
- expect(vm.text).toContain(`Promoting ${milestoneMockData.milestoneTitle} will make it available for all projects inside ${milestoneMockData.groupName}.`);
+ expect(vm.text).toContain(
+ `Promoting ${
+ milestoneMockData.milestoneTitle
+ } will make it available for all projects inside ${milestoneMockData.groupName}.`,
+ );
});
it('contains the correct title', () => {
@@ -43,11 +47,14 @@ describe('Promote milestone modal', () => {
vm.$destroy();
});
- it('redirects when a milestone is promoted', (done) => {
+ it('redirects when a milestone is promoted', done => {
const responseURL = `${gl.TEST_HOST}/dummy/endpoint`;
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(milestoneMockData.url);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestStarted', milestoneMockData.url);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'promoteMilestoneModal.requestStarted',
+ milestoneMockData.url,
+ );
return Promise.resolve({
request: {
responseURL,
@@ -57,25 +64,34 @@ describe('Promote milestone modal', () => {
vm.onSubmit()
.then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', { milestoneUrl: milestoneMockData.url, successful: true });
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', {
+ milestoneUrl: milestoneMockData.url,
+ successful: true,
+ });
})
.then(done)
.catch(done.fail);
});
- it('displays an error if promoting a milestone failed', (done) => {
+ it('displays an error if promoting a milestone failed', done => {
const dummyError = new Error('promoting milestone failed');
dummyError.response = { status: 500 };
- spyOn(axios, 'post').and.callFake((url) => {
+ spyOn(axios, 'post').and.callFake(url => {
expect(url).toBe(milestoneMockData.url);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestStarted', milestoneMockData.url);
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ 'promoteMilestoneModal.requestStarted',
+ milestoneMockData.url,
+ );
return Promise.reject(dummyError);
});
vm.onSubmit()
- .catch((error) => {
+ .catch(error => {
expect(error).toBe(dummyError);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', { milestoneUrl: milestoneMockData.url, successful: false });
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', {
+ milestoneUrl: milestoneMockData.url,
+ successful: false,
+ });
})
.then(done)
.catch(done.fail);
diff --git a/spec/javascripts/pages/profiles/show/emoji_menu_spec.js b/spec/javascripts/pages/profiles/show/emoji_menu_spec.js
index b70368fc92f..864bda65736 100644
--- a/spec/javascripts/pages/profiles/show/emoji_menu_spec.js
+++ b/spec/javascripts/pages/profiles/show/emoji_menu_spec.js
@@ -81,6 +81,7 @@ describe('EmojiMenu', () => {
'mouseenter focus',
jasmine.anything(),
);
+
expect(emojiMenu.registerEventListener).toHaveBeenCalledWith(
'on',
jasmine.anything(),
@@ -107,6 +108,7 @@ describe('EmojiMenu', () => {
it('renders the menu with custom menu class', () => {
const menuElement = () =>
document.body.querySelector(`.emoji-menu.${dummyMenuClass} .emoji-menu-content`);
+
expect(menuElement()).toBe(null);
emojiMenu.createEmojiMenu();
diff --git a/spec/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js b/spec/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
index 4655e29eed0..b20bc96f9be 100644
--- a/spec/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
+++ b/spec/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
@@ -19,10 +19,10 @@ window.gl.pipelineScheduleFieldErrors = {
updateFormValidityState: () => {},
};
-describe('Interval Pattern Input Component', function () {
- describe('when prop initialCronInterval is passed (edit)', function () {
- describe('when prop initialCronInterval is custom', function () {
- beforeEach(function () {
+describe('Interval Pattern Input Component', function() {
+ describe('when prop initialCronInterval is passed (edit)', function() {
+ describe('when prop initialCronInterval is custom', function() {
+ beforeEach(function() {
this.initialCronInterval = '1 2 3 4 5';
this.intervalPatternComponent = new IntervalPatternInputComponent({
propsData: {
@@ -31,15 +31,15 @@ describe('Interval Pattern Input Component', function () {
}).$mount();
});
- it('is initialized as a Vue component', function () {
+ it('is initialized as a Vue component', function() {
expect(this.intervalPatternComponent).toBeDefined();
});
- it('prop initialCronInterval is set', function () {
+ it('prop initialCronInterval is set', function() {
expect(this.intervalPatternComponent.initialCronInterval).toBe(this.initialCronInterval);
});
- it('sets isEditable to true', function (done) {
+ it('sets isEditable to true', function(done) {
Vue.nextTick(() => {
expect(this.intervalPatternComponent.isEditable).toBe(true);
done();
@@ -47,8 +47,8 @@ describe('Interval Pattern Input Component', function () {
});
});
- describe('when prop initialCronInterval is preset', function () {
- beforeEach(function () {
+ describe('when prop initialCronInterval is preset', function() {
+ beforeEach(function() {
this.intervalPatternComponent = new IntervalPatternInputComponent({
propsData: {
inputNameAttribute,
@@ -57,11 +57,11 @@ describe('Interval Pattern Input Component', function () {
}).$mount();
});
- it('is initialized as a Vue component', function () {
+ it('is initialized as a Vue component', function() {
expect(this.intervalPatternComponent).toBeDefined();
});
- it('sets isEditable to false', function (done) {
+ it('sets isEditable to false', function(done) {
Vue.nextTick(() => {
expect(this.intervalPatternComponent.isEditable).toBe(false);
done();
@@ -70,8 +70,8 @@ describe('Interval Pattern Input Component', function () {
});
});
- describe('when prop initialCronInterval is not passed (new)', function () {
- beforeEach(function () {
+ describe('when prop initialCronInterval is not passed (new)', function() {
+ beforeEach(function() {
this.intervalPatternComponent = new IntervalPatternInputComponent({
propsData: {
inputNameAttribute,
@@ -79,16 +79,17 @@ describe('Interval Pattern Input Component', function () {
}).$mount();
});
- it('is initialized as a Vue component', function () {
+ it('is initialized as a Vue component', function() {
expect(this.intervalPatternComponent).toBeDefined();
});
- it('prop initialCronInterval is set', function () {
+ it('prop initialCronInterval is set', function() {
const defaultInitialCronInterval = '';
+
expect(this.intervalPatternComponent.initialCronInterval).toBe(defaultInitialCronInterval);
});
- it('sets isEditable to true', function (done) {
+ it('sets isEditable to true', function(done) {
Vue.nextTick(() => {
expect(this.intervalPatternComponent.isEditable).toBe(true);
done();
@@ -96,8 +97,8 @@ describe('Interval Pattern Input Component', function () {
});
});
- describe('User Actions', function () {
- beforeEach(function () {
+ describe('User Actions', function() {
+ beforeEach(function() {
// For an unknown reason, some browsers do not propagate click events
// on radio buttons in a way Vue can register. So, we have to mount
// to a fixture.
@@ -111,66 +112,79 @@ describe('Interval Pattern Input Component', function () {
}).$mount('#my-mount');
});
- it('cronInterval is updated when everyday preset interval is selected', function (done) {
+ it('cronInterval is updated when everyday preset interval is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-day').click();
Vue.nextTick(() => {
expect(this.intervalPatternComponent.cronInterval).toBe(cronIntervalPresets.everyDay);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(cronIntervalPresets.everyDay);
+ expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(
+ cronIntervalPresets.everyDay,
+ );
done();
});
});
- it('cronInterval is updated when everyweek preset interval is selected', function (done) {
+ it('cronInterval is updated when everyweek preset interval is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-week').click();
Vue.nextTick(() => {
expect(this.intervalPatternComponent.cronInterval).toBe(cronIntervalPresets.everyWeek);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(cronIntervalPresets.everyWeek);
+ expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(
+ cronIntervalPresets.everyWeek,
+ );
done();
});
});
- it('cronInterval is updated when everymonth preset interval is selected', function (done) {
+ it('cronInterval is updated when everymonth preset interval is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-month').click();
Vue.nextTick(() => {
expect(this.intervalPatternComponent.cronInterval).toBe(cronIntervalPresets.everyMonth);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(cronIntervalPresets.everyMonth);
+ expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(
+ cronIntervalPresets.everyMonth,
+ );
done();
});
});
- it('only a space is added to cronInterval (trimmed later) when custom radio is selected', function (done) {
+ it('only a space is added to cronInterval (trimmed later) when custom radio is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-month').click();
this.intervalPatternComponent.$el.querySelector('#custom').click();
Vue.nextTick(() => {
const intervalWithSpaceAppended = `${cronIntervalPresets.everyMonth} `;
+
expect(this.intervalPatternComponent.cronInterval).toBe(intervalWithSpaceAppended);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(intervalWithSpaceAppended);
+ expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').value).toBe(
+ intervalWithSpaceAppended,
+ );
done();
});
});
- it('text input is disabled when preset interval is selected', function (done) {
+ it('text input is disabled when preset interval is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-month').click();
Vue.nextTick(() => {
expect(this.intervalPatternComponent.isEditable).toBe(false);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').disabled).toBe(true);
+ expect(
+ this.intervalPatternComponent.$el.querySelector('.cron-interval-input').disabled,
+ ).toBe(true);
done();
});
});
- it('text input is enabled when custom is selected', function (done) {
+ it('text input is enabled when custom is selected', function(done) {
this.intervalPatternComponent.$el.querySelector('#every-month').click();
this.intervalPatternComponent.$el.querySelector('#custom').click();
Vue.nextTick(() => {
expect(this.intervalPatternComponent.isEditable).toBe(true);
- expect(this.intervalPatternComponent.$el.querySelector('.cron-interval-input').disabled).toBe(false);
+ expect(
+ this.intervalPatternComponent.$el.querySelector('.cron-interval-input').disabled,
+ ).toBe(false);
done();
});
});
diff --git a/spec/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js b/spec/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
index fb7d2763b49..ea809e1f170 100644
--- a/spec/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
+++ b/spec/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
@@ -6,7 +6,7 @@ const PipelineSchedulesCalloutComponent = Vue.extend(PipelineSchedulesCallout);
const cookieKey = 'pipeline_schedules_callout_dismissed';
const docsUrl = 'help/ci/scheduled_pipelines';
-describe('Pipeline Schedule Callout', function () {
+describe('Pipeline Schedule Callout', function() {
beforeEach(() => {
setFixtures(`
<div id='pipeline-schedules-callout' data-docs-url=${docsUrl}></div>
@@ -76,7 +76,7 @@ describe('Pipeline Schedule Callout', function () {
expect(this.calloutComponent.$el.outerHTML).toContain(docsUrl);
});
- it('updates calloutDismissed when close button is clicked', (done) => {
+ it('updates calloutDismissed when close button is clicked', done => {
this.calloutComponent.$el.querySelector('#dismiss-callout-btn').click();
Vue.nextTick(() => {
@@ -85,7 +85,7 @@ describe('Pipeline Schedule Callout', function () {
});
});
- it('#dismissCallout updates calloutDismissed', (done) => {
+ it('#dismissCallout updates calloutDismissed', done => {
this.calloutComponent.dismissCallout();
Vue.nextTick(() => {
@@ -94,7 +94,7 @@ describe('Pipeline Schedule Callout', function () {
});
});
- it('is hidden when close button is clicked', (done) => {
+ it('is hidden when close button is clicked', done => {
this.calloutComponent.$el.querySelector('#dismiss-callout-btn').click();
Vue.nextTick(() => {
diff --git a/spec/javascripts/pdf/index_spec.js b/spec/javascripts/pdf/index_spec.js
index 69230bb0937..699cf4871aa 100644
--- a/spec/javascripts/pdf/index_spec.js
+++ b/spec/javascripts/pdf/index_spec.js
@@ -11,7 +11,7 @@ const Component = Vue.extend(PDFLab);
describe('PDF component', () => {
let vm;
- const checkLoaded = (done) => {
+ const checkLoaded = done => {
if (vm.loading) {
setTimeout(() => {
checkLoaded(done);
@@ -22,7 +22,7 @@ describe('PDF component', () => {
};
describe('without PDF data', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
pdf: '',
@@ -40,7 +40,7 @@ describe('PDF component', () => {
});
describe('with PDF data', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Component({
propsData: {
pdf,
diff --git a/spec/javascripts/pdf/page_spec.js b/spec/javascripts/pdf/page_spec.js
index ff1bfd7f650..ef967210b65 100644
--- a/spec/javascripts/pdf/page_spec.js
+++ b/spec/javascripts/pdf/page_spec.js
@@ -3,53 +3,46 @@ import pdfjsLib from 'vendor/pdf';
import workerSrc from 'vendor/pdf.worker.min';
import PageComponent from '~/pdf/page/index.vue';
-import testPDF from '../fixtures/blob/pdf/test.pdf';
-
-const Component = Vue.extend(PageComponent);
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import testPDF from 'spec/fixtures/blob/pdf/test.pdf';
describe('Page component', () => {
+ const Component = Vue.extend(PageComponent);
let vm;
let testPage;
- pdfjsLib.PDFJS.workerSrc = workerSrc;
-
- const checkRendered = (done) => {
- if (vm.rendering) {
- setTimeout(() => {
- checkRendered(done);
- }, 100);
- } else {
- done();
- }
- };
- beforeEach((done) => {
- pdfjsLib.getDocument(testPDF)
+ beforeEach(done => {
+ pdfjsLib.PDFJS.workerSrc = workerSrc;
+ pdfjsLib
+ .getDocument(testPDF)
.then(pdf => pdf.getPage(1))
- .then((page) => {
+ .then(page => {
testPage = page;
- done();
})
- .catch((error) => {
- done.fail(error);
- });
+ .then(done)
+ .catch(done.fail);
});
- describe('render', () => {
- beforeEach((done) => {
- vm = new Component({
- propsData: {
- page: testPage,
- number: 1,
- },
- });
-
- vm.$mount();
+ afterEach(() => {
+ vm.$destroy();
+ });
- checkRendered(done);
+ it('renders the page when mounting', done => {
+ const promise = Promise.resolve();
+ spyOn(testPage, 'render').and.callFake(() => promise);
+ vm = mountComponent(Component, {
+ page: testPage,
+ number: 1,
});
- it('renders first page', () => {
- expect(vm.$el.tagName).toBeDefined();
- });
+ expect(vm.rendering).toBe(true);
+
+ promise
+ .then(() => {
+ expect(testPage.render).toHaveBeenCalledWith(vm.renderContext);
+ expect(vm.rendering).toBe(false);
+ })
+ .then(done)
+ .catch(done.fail);
});
});
diff --git a/spec/javascripts/performance_bar/components/detailed_metric_spec.js b/spec/javascripts/performance_bar/components/detailed_metric_spec.js
index c4611dc7662..a3b93280b4b 100644
--- a/spec/javascripts/performance_bar/components/detailed_metric_spec.js
+++ b/spec/javascripts/performance_bar/components/detailed_metric_spec.js
@@ -54,11 +54,9 @@ describe('detailedMetric', () => {
});
it('adds a modal with a table of the details', () => {
- vm.$el
- .querySelectorAll('.performance-bar-modal td strong')
- .forEach((duration, index) => {
- expect(duration.innerText).toContain(requestDetails[index].duration);
- });
+ vm.$el.querySelectorAll('.performance-bar-modal td strong').forEach((duration, index) => {
+ expect(duration.innerText).toContain(requestDetails[index].duration);
+ });
vm.$el
.querySelectorAll('.performance-bar-modal td:nth-child(2)')
diff --git a/spec/javascripts/performance_bar/components/request_selector_spec.js b/spec/javascripts/performance_bar/components/request_selector_spec.js
index 6108a29f8c4..a272e03c0e1 100644
--- a/spec/javascripts/performance_bar/components/request_selector_spec.js
+++ b/spec/javascripts/performance_bar/components/request_selector_spec.js
@@ -11,8 +11,7 @@ describe('request selector', () => {
},
{
id: '789',
- url:
- 'https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/1.json?serializer=widget',
+ url: 'https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/1.json?serializer=widget',
},
];
diff --git a/spec/javascripts/performance_bar/index_spec.js b/spec/javascripts/performance_bar/index_spec.js
index 1784bd64adb..1444d1bb3cb 100644
--- a/spec/javascripts/performance_bar/index_spec.js
+++ b/spec/javascripts/performance_bar/index_spec.js
@@ -63,10 +63,7 @@ describe('performance bar wrapper', () => {
it('adds the request immediately', () => {
vm.loadRequestDetails('123', 'https://gitlab.com/');
- expect(vm.store.addRequest).toHaveBeenCalledWith(
- '123',
- 'https://gitlab.com/',
- );
+ expect(vm.store.addRequest).toHaveBeenCalledWith('123', 'https://gitlab.com/');
});
it('makes an HTTP request for the request details', () => {
diff --git a/spec/javascripts/performance_bar/services/performance_bar_service_spec.js b/spec/javascripts/performance_bar/services/performance_bar_service_spec.js
new file mode 100644
index 00000000000..cfec4b779e4
--- /dev/null
+++ b/spec/javascripts/performance_bar/services/performance_bar_service_spec.js
@@ -0,0 +1,68 @@
+import PerformanceBarService from '~/performance_bar/services/performance_bar_service';
+
+describe('PerformanceBarService', () => {
+ describe('callbackParams', () => {
+ describe('fireCallback', () => {
+ function fireCallback(response, peekUrl) {
+ return PerformanceBarService.callbackParams(response, peekUrl)[0];
+ }
+
+ it('returns false when the request URL is the peek URL', () => {
+ expect(
+ fireCallback({ headers: { 'x-request-id': '123' }, url: '/peek' }, '/peek'),
+ ).toBeFalsy();
+ });
+
+ it('returns false when there is no request ID', () => {
+ expect(fireCallback({ headers: {}, url: '/request' }, '/peek')).toBeFalsy();
+ });
+
+ it('returns false when the request is an API request', () => {
+ expect(
+ fireCallback({ headers: { 'x-request-id': '123' }, url: '/api/' }, '/peek'),
+ ).toBeFalsy();
+ });
+
+ it('returns false when the response is from the cache', () => {
+ expect(
+ fireCallback(
+ { headers: { 'x-request-id': '123', 'x-gitlab-from-cache': 'true' }, url: '/request' },
+ '/peek',
+ ),
+ ).toBeFalsy();
+ });
+
+ it('returns true when all conditions are met', () => {
+ expect(
+ fireCallback({ headers: { 'x-request-id': '123' }, url: '/request' }, '/peek'),
+ ).toBeTruthy();
+ });
+ });
+
+ describe('requestId', () => {
+ function requestId(response, peekUrl) {
+ return PerformanceBarService.callbackParams(response, peekUrl)[1];
+ }
+
+ it('gets the request ID from the headers', () => {
+ expect(requestId({ headers: { 'x-request-id': '123' } }, '/peek')).toEqual('123');
+ });
+ });
+
+ describe('requestUrl', () => {
+ function requestUrl(response, peekUrl) {
+ return PerformanceBarService.callbackParams(response, peekUrl)[2];
+ }
+
+ it('gets the request URL from the response object', () => {
+ expect(requestUrl({ headers: {}, url: '/request' }, '/peek')).toEqual('/request');
+ });
+
+ it('gets the request URL from response.config if present', () => {
+ expect(
+ requestUrl({ headers: {}, config: { url: '/config-url' }, url: '/request' }, '/peek'),
+ ).toEqual('/config-url');
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/pipelines/blank_state_spec.js b/spec/javascripts/pipelines/blank_state_spec.js
index b7a9b60d85c..033bd5ccb73 100644
--- a/spec/javascripts/pipelines/blank_state_spec.js
+++ b/spec/javascripts/pipelines/blank_state_spec.js
@@ -9,12 +9,10 @@ describe('Pipelines Blank State', () => {
beforeEach(() => {
Component = Vue.extend(component);
- vm = mountComponent(Component,
- {
- svgPath: 'foo',
- message: 'Blank State',
- },
- );
+ vm = mountComponent(Component, {
+ svgPath: 'foo',
+ message: 'Blank State',
+ });
});
it('should render svg', () => {
@@ -22,8 +20,6 @@ describe('Pipelines Blank State', () => {
});
it('should render message', () => {
- expect(
- vm.$el.querySelector('h4').textContent.trim(),
- ).toEqual('Blank State');
+ expect(vm.$el.querySelector('h4').textContent.trim()).toEqual('Blank State');
});
});
diff --git a/spec/javascripts/pipelines/empty_state_spec.js b/spec/javascripts/pipelines/empty_state_spec.js
index 1e41a7bfe7c..f12950b8fce 100644
--- a/spec/javascripts/pipelines/empty_state_spec.js
+++ b/spec/javascripts/pipelines/empty_state_spec.js
@@ -24,20 +24,35 @@ describe('Pipelines Empty State', () => {
expect(component.$el.querySelector('.svg-content svg')).toBeDefined();
});
- it('should render emtpy state information', () => {
+ it('should render empty state information', () => {
expect(component.$el.querySelector('h4').textContent).toContain('Build with confidence');
expect(
- component.$el.querySelector('p').innerHTML.trim().replace(/\n+\s+/m, ' ').replace(/\s\s+/g, ' '),
+ component.$el
+ .querySelector('p')
+ .innerHTML.trim()
+ .replace(/\n+\s+/m, ' ')
+ .replace(/\s\s+/g, ' '),
).toContain('Continuous Integration can help catch bugs by running your tests automatically,');
expect(
- component.$el.querySelector('p').innerHTML.trim().replace(/\n+\s+/m, ' ').replace(/\s\s+/g, ' '),
- ).toContain('while Continuous Deployment can help you deliver code to your product environment');
+ component.$el
+ .querySelector('p')
+ .innerHTML.trim()
+ .replace(/\n+\s+/m, ' ')
+ .replace(/\s\s+/g, ' '),
+ ).toContain(
+ 'while Continuous Deployment can help you deliver code to your product environment',
+ );
});
it('should render a link with provided help path', () => {
- expect(component.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual('foo');
- expect(component.$el.querySelector('.js-get-started-pipelines').textContent).toContain('Get started with Pipelines');
+ expect(component.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual(
+ 'foo',
+ );
+
+ expect(component.$el.querySelector('.js-get-started-pipelines').textContent).toContain(
+ 'Get started with Pipelines',
+ );
});
});
diff --git a/spec/javascripts/pipelines/graph/action_component_spec.js b/spec/javascripts/pipelines/graph/action_component_spec.js
index 568e679abe9..3d2232ff239 100644
--- a/spec/javascripts/pipelines/graph/action_component_spec.js
+++ b/spec/javascripts/pipelines/graph/action_component_spec.js
@@ -35,12 +35,13 @@ describe('pipeline graph action component', () => {
it('should update bootstrap tooltip when title changes', done => {
component.tooltipText = 'changed';
- component.$nextTick()
- .then(() => {
- expect(component.$el.getAttribute('data-original-title')).toBe('changed');
- })
- .then(done)
- .catch(done.fail);
+ component
+ .$nextTick()
+ .then(() => {
+ expect(component.$el.getAttribute('data-original-title')).toBe('changed');
+ })
+ .then(done)
+ .catch(done.fail);
});
it('should render an svg', () => {
@@ -49,12 +50,13 @@ describe('pipeline graph action component', () => {
});
describe('on click', () => {
- it('emits `pipelineActionRequestComplete` after a successfull request', done => {
+ it('emits `pipelineActionRequestComplete` after a successful request', done => {
spyOn(component, '$emit');
component.$el.click();
- component.$nextTick()
+ component
+ .$nextTick()
.then(() => {
expect(component.$emit).toHaveBeenCalledWith('pipelineActionRequestComplete');
})
diff --git a/spec/javascripts/pipelines/graph/graph_component_spec.js b/spec/javascripts/pipelines/graph/graph_component_spec.js
index b6fa4272c8b..96a2d5f62fa 100644
--- a/spec/javascripts/pipelines/graph/graph_component_spec.js
+++ b/spec/javascripts/pipelines/graph/graph_component_spec.js
@@ -40,7 +40,9 @@ describe('graph component', () => {
).toEqual(true);
expect(
- component.$el.querySelector('.stage-column:nth-child(2) .build:nth-child(1)').classList.contains('left-connector'),
+ component.$el
+ .querySelector('.stage-column:nth-child(2) .build:nth-child(1)')
+ .classList.contains('left-connector'),
).toEqual(true);
expect(component.$el.querySelector('loading-icon')).toBe(null);
@@ -56,7 +58,9 @@ describe('graph component', () => {
pipeline: graphJSON,
});
- expect(component.$el.querySelector('.stage-column:nth-child(2) .stage-name').textContent.trim()).toEqual('Deploy &lt;img src=x onerror=alert(document.domain)&gt;');
+ expect(
+ component.$el.querySelector('.stage-column:nth-child(2) .stage-name').textContent.trim(),
+ ).toEqual('Deploy &lt;img src=x onerror=alert(document.domain)&gt;');
});
});
});
diff --git a/spec/javascripts/pipelines/graph/dropdown_job_component_spec.js b/spec/javascripts/pipelines/graph/job_group_dropdown_spec.js
index ff584396d61..24631cc1c89 100644
--- a/spec/javascripts/pipelines/graph/dropdown_job_component_spec.js
+++ b/spec/javascripts/pipelines/graph/job_group_dropdown_spec.js
@@ -1,12 +1,12 @@
import Vue from 'vue';
-import component from '~/pipelines/components/graph/dropdown_job_component.vue';
+import JobGroupDropdown from '~/pipelines/components/graph/job_group_dropdown.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-describe('dropdown job component', () => {
- const Component = Vue.extend(component);
+describe('job group dropdown component', () => {
+ const Component = Vue.extend(JobGroupDropdown);
let vm;
- const mock = {
+ const group = {
jobs: [
{
id: 4256,
@@ -71,23 +71,15 @@ describe('dropdown job component', () => {
});
beforeEach(() => {
- vm = mountComponent(Component, { job: mock });
+ vm = mountComponent(Component, { group });
});
- it('renders button with job name and size', () => {
- expect(vm.$el.querySelector('button').textContent).toContain(mock.name);
- expect(vm.$el.querySelector('button').textContent).toContain(mock.size);
+ it('renders button with group name and size', () => {
+ expect(vm.$el.querySelector('button').textContent).toContain(group.name);
+ expect(vm.$el.querySelector('button').textContent).toContain(group.size);
});
it('renders dropdown with jobs', () => {
- expect(vm.$el.querySelectorAll('.scrollable-menu>ul>li').length).toEqual(mock.jobs.length);
- });
-
- it('escapes tooltip title', () => {
- expect(
- vm.$el.querySelector('.js-pipeline-graph-job-link').getAttribute('data-original-title'),
- ).toEqual(
- '&lt;img src=x onerror=alert(document.domain)&gt; - passed',
- );
+ expect(vm.$el.querySelectorAll('.scrollable-menu>ul>li').length).toEqual(group.jobs.length);
});
});
diff --git a/spec/javascripts/pipelines/graph/job_component_spec.js b/spec/javascripts/pipelines/graph/job_item_spec.js
index 215ce1e81b5..88e1789184d 100644
--- a/spec/javascripts/pipelines/graph/job_component_spec.js
+++ b/spec/javascripts/pipelines/graph/job_item_spec.js
@@ -1,11 +1,12 @@
import Vue from 'vue';
-import jobComponent from '~/pipelines/components/graph/job_component.vue';
+import JobItem from '~/pipelines/components/graph/job_item.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-describe('pipeline graph job component', () => {
- const JobComponent = Vue.extend(jobComponent);
+describe('pipeline graph job item', () => {
+ const JobComponent = Vue.extend(JobItem);
let component;
+ const delayedJobFixture = getJSONFixture('jobs/delayed.json');
const mockJob = {
id: 4256,
name: 'test',
@@ -31,7 +32,7 @@ describe('pipeline graph job component', () => {
});
describe('name with link', () => {
- it('should render the job name and status with a link', (done) => {
+ it('should render the job name and status with a link', done => {
component = mountComponent(JobComponent, { job: mockJob });
Vue.nextTick(() => {
@@ -39,15 +40,15 @@ describe('pipeline graph job component', () => {
expect(link.getAttribute('href')).toEqual(mockJob.status.details_path);
- expect(
- link.getAttribute('data-original-title'),
- ).toEqual(`${mockJob.name} - ${mockJob.status.label}`);
+ expect(link.getAttribute('data-original-title')).toEqual(
+ `${mockJob.name} - ${mockJob.status.label}`,
+ );
expect(component.$el.querySelector('.js-status-icon-success')).toBeDefined();
- expect(
- component.$el.querySelector('.ci-status-text').textContent.trim(),
- ).toEqual(mockJob.name);
+ expect(component.$el.querySelector('.ci-status-text').textContent.trim()).toEqual(
+ mockJob.name,
+ );
done();
});
@@ -74,9 +75,9 @@ describe('pipeline graph job component', () => {
expect(component.$el.querySelector('.js-status-icon-success')).toBeDefined();
expect(component.$el.querySelector('a')).toBeNull();
- expect(
- component.$el.querySelector('.ci-status-text').textContent.trim(),
- ).toEqual(mockJob.name);
+ expect(component.$el.querySelector('.ci-status-text').textContent.trim()).toEqual(
+ mockJob.name,
+ );
});
});
@@ -95,9 +96,7 @@ describe('pipeline graph job component', () => {
cssClassJobName: 'css-class-job-name',
});
- expect(
- component.$el.querySelector('a').classList.contains('css-class-job-name'),
- ).toBe(true);
+ expect(component.$el.querySelector('a').classList.contains('css-class-job-name')).toBe(true);
});
describe('status label', () => {
@@ -112,7 +111,11 @@ describe('pipeline graph job component', () => {
},
});
- expect(component.$el.querySelector('.js-job-component-tooltip').getAttribute('data-original-title')).toEqual('test');
+ expect(
+ component.$el
+ .querySelector('.js-job-component-tooltip')
+ .getAttribute('data-original-title'),
+ ).toEqual('test');
});
it('should not render status label when it is provided', () => {
@@ -128,19 +131,21 @@ describe('pipeline graph job component', () => {
},
});
- expect(component.$el.querySelector('.js-job-component-tooltip').getAttribute('data-original-title')).toEqual('test - success');
+ expect(
+ component.$el
+ .querySelector('.js-job-component-tooltip')
+ .getAttribute('data-original-title'),
+ ).toEqual('test - success');
});
});
describe('tooltip placement', () => {
- const tooltipBoundary = 'a[data-boundary="viewport"]';
-
it('does not set tooltip boundary by default', () => {
component = mountComponent(JobComponent, {
job: mockJob,
});
- expect(component.$el.querySelector(tooltipBoundary)).toBeNull();
+ expect(component.tooltipBoundary).toBeNull();
});
it('sets tooltip boundary to viewport for small dropdowns', () => {
@@ -149,7 +154,7 @@ describe('pipeline graph job component', () => {
dropdownLength: 1,
});
- expect(component.$el.querySelector(tooltipBoundary)).not.toBeNull();
+ expect(component.tooltipBoundary).toEqual('viewport');
});
it('does not set tooltip boundary for large lists', () => {
@@ -158,27 +163,33 @@ describe('pipeline graph job component', () => {
dropdownLength: 7,
});
- expect(component.$el.querySelector(tooltipBoundary)).toBeNull();
+ expect(component.tooltipBoundary).toBeNull();
});
});
- describe('tooltipText', () => {
- it('escapes job name', () => {
+ describe('for delayed job', () => {
+ beforeEach(() => {
+ const fifteenMinutesInMilliseconds = 900000;
+ spyOn(Date, 'now').and.callFake(
+ () => new Date(delayedJobFixture.scheduled_at).getTime() - fifteenMinutesInMilliseconds,
+ );
+ });
+
+ it('displays remaining time in tooltip', done => {
component = mountComponent(JobComponent, {
- job: {
- id: 4259,
- name: '<img src=x onerror=alert(document.domain)>',
- status: {
- icon: 'status_success',
- label: 'success',
- tooltip: 'failed',
- },
- },
+ job: delayedJobFixture,
});
- expect(
- component.$el.querySelector('.js-job-component-tooltip').getAttribute('data-original-title'),
- ).toEqual('&lt;img src=x onerror=alert(document.domain)&gt; - failed');
+ Vue.nextTick()
+ .then(() => {
+ expect(
+ component.$el
+ .querySelector('.js-pipeline-graph-job-link')
+ .getAttribute('data-original-title'),
+ ).toEqual('delayed job - delayed manual action (00:15:00)');
+ })
+ .then(done)
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/pipelines/graph/stage_column_component_spec.js b/spec/javascripts/pipelines/graph/stage_column_component_spec.js
index f6e6bd3132e..d0b8f877d6f 100644
--- a/spec/javascripts/pipelines/graph/stage_column_component_spec.js
+++ b/spec/javascripts/pipelines/graph/stage_column_component_spec.js
@@ -25,17 +25,16 @@ describe('stage column component', () => {
};
beforeEach(() => {
-
- const mockJobs = [];
+ const mockGroups = [];
for (let i = 0; i < 3; i += 1) {
const mockedJob = Object.assign({}, mockJob);
mockedJob.id += i;
- mockJobs.push(mockedJob);
+ mockGroups.push(mockedJob);
}
component = mountComponent(StageColumnComponent, {
title: 'foo',
- jobs: mockJobs,
+ groups: mockGroups,
});
});
@@ -43,14 +42,14 @@ describe('stage column component', () => {
expect(component.$el.querySelector('.stage-name').textContent.trim()).toEqual('foo');
});
- it('should render the provided jobs', () => {
+ it('should render the provided groups', () => {
expect(component.$el.querySelectorAll('.builds-container > ul > li').length).toEqual(3);
});
describe('jobId', () => {
it('escapes job name', () => {
component = mountComponent(StageColumnComponent, {
- jobs: [
+ groups: [
{
id: 4259,
name: '<img src=x onerror=alert(document.domain)>',
@@ -64,9 +63,9 @@ describe('stage column component', () => {
title: 'test',
});
- expect(
- component.$el.querySelector('.builds-container li').getAttribute('id'),
- ).toEqual('ci-badge-&lt;img src=x onerror=alert(document.domain)&gt;');
+ expect(component.$el.querySelector('.builds-container li').getAttribute('id')).toEqual(
+ 'ci-badge-&lt;img src=x onerror=alert(document.domain)&gt;',
+ );
});
});
});
diff --git a/spec/javascripts/pipelines/header_component_spec.js b/spec/javascripts/pipelines/header_component_spec.js
index 034d3b4957d..556a0976b29 100644
--- a/spec/javascripts/pipelines/header_component_spec.js
+++ b/spec/javascripts/pipelines/header_component_spec.js
@@ -47,13 +47,16 @@ describe('Pipeline details header', () => {
it('should render provided pipeline info', () => {
expect(
- vm.$el.querySelector('.header-main-content').textContent.replace(/\s+/g, ' ').trim(),
- ).toEqual('failed Pipeline #123 triggered 3 weeks ago by Foo');
+ vm.$el
+ .querySelector('.header-main-content')
+ .textContent.replace(/\s+/g, ' ')
+ .trim(),
+ ).toContain('failed Pipeline #123 triggered 3 weeks ago by Foo');
});
describe('action buttons', () => {
it('should call postAction when button action is clicked', () => {
- eventHub.$on('headerPostAction', (action) => {
+ eventHub.$on('headerPostAction', action => {
expect(action.path).toEqual('path');
});
diff --git a/spec/javascripts/pipelines/nav_controls_spec.js b/spec/javascripts/pipelines/nav_controls_spec.js
index d6232f5c567..7806cdf1477 100644
--- a/spec/javascripts/pipelines/nav_controls_spec.js
+++ b/spec/javascripts/pipelines/nav_controls_spec.js
@@ -24,7 +24,9 @@ describe('Pipelines Nav Controls', () => {
component = mountComponent(NavControlsComponent, mockData);
expect(component.$el.querySelector('.js-run-pipeline').textContent).toContain('Run Pipeline');
- expect(component.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(mockData.newPipelinePath);
+ expect(component.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(
+ mockData.newPipelinePath,
+ );
});
it('should not render link to create pipeline if no path is provided', () => {
@@ -50,7 +52,9 @@ describe('Pipelines Nav Controls', () => {
component = mountComponent(NavControlsComponent, mockData);
expect(component.$el.querySelector('.js-ci-lint').textContent.trim()).toContain('CI Lint');
- expect(component.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(mockData.ciLintPath);
+ expect(component.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(
+ mockData.ciLintPath,
+ );
});
describe('Reset Runners Cache', () => {
@@ -65,7 +69,9 @@ describe('Pipelines Nav Controls', () => {
});
it('should render button for resetting runner caches', () => {
- expect(component.$el.querySelector('.js-clear-cache').textContent.trim()).toContain('Clear Runner Caches');
+ expect(component.$el.querySelector('.js-clear-cache').textContent.trim()).toContain(
+ 'Clear Runner Caches',
+ );
});
it('should emit postAction event when reset runner cache button is clicked', () => {
diff --git a/spec/javascripts/pipelines/pipeline_store_spec.js b/spec/javascripts/pipelines/pipeline_store_spec.js
index ab2287cc344..1d5754d1f05 100644
--- a/spec/javascripts/pipelines/pipeline_store_spec.js
+++ b/spec/javascripts/pipelines/pipeline_store_spec.js
@@ -20,6 +20,7 @@ describe('Pipeline Store', () => {
it('should store received object', () => {
store.storePipeline({ foo: 'bar' });
+
expect(store.state.pipeline).toEqual({ foo: 'bar' });
});
});
diff --git a/spec/javascripts/pipelines/pipeline_url_spec.js b/spec/javascripts/pipelines/pipeline_url_spec.js
index ddd580ae8b7..d6c44f4c976 100644
--- a/spec/javascripts/pipelines/pipeline_url_spec.js
+++ b/spec/javascripts/pipelines/pipeline_url_spec.js
@@ -38,6 +38,7 @@ describe('Pipeline Url Component', () => {
expect(component.$el.querySelector('.js-pipeline-url-link').getAttribute('href')).toEqual(
'foo',
);
+
expect(component.$el.querySelector('.js-pipeline-url-link span').textContent).toEqual('#1');
});
@@ -62,11 +63,15 @@ describe('Pipeline Url Component', () => {
}).$mount();
const image = component.$el.querySelector('.js-pipeline-url-user img');
+ const tooltip = component.$el.querySelector(
+ '.js-pipeline-url-user .js-user-avatar-image-toolip',
+ );
expect(component.$el.querySelector('.js-pipeline-url-user').getAttribute('href')).toEqual(
mockData.pipeline.user.web_url,
);
- expect(image.getAttribute('data-original-title')).toEqual(mockData.pipeline.user.name);
+
+ expect(tooltip.textContent.trim()).toEqual(mockData.pipeline.user.name);
expect(image.getAttribute('src')).toEqual(`${mockData.pipeline.user.avatar_url}?width=20`);
});
@@ -105,6 +110,7 @@ describe('Pipeline Url Component', () => {
expect(component.$el.querySelector('.js-pipeline-url-yaml').textContent).toContain(
'yaml invalid',
);
+
expect(component.$el.querySelector('.js-pipeline-url-stuck').textContent).toContain('stuck');
});
diff --git a/spec/javascripts/pipelines/pipelines_actions_spec.js b/spec/javascripts/pipelines/pipelines_actions_spec.js
index 72fb0a8f9ef..a7dcd532f4f 100644
--- a/spec/javascripts/pipelines/pipelines_actions_spec.js
+++ b/spec/javascripts/pipelines/pipelines_actions_spec.js
@@ -1,46 +1,104 @@
import Vue from 'vue';
-import pipelinesActionsComp from '~/pipelines/components/pipelines_actions.vue';
+import eventHub from '~/pipelines/event_hub';
+import PipelinesActions from '~/pipelines/components/pipelines_actions.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import { TEST_HOST } from 'spec/test_constants';
describe('Pipelines Actions dropdown', () => {
- let component;
- let actions;
- let ActionsComponent;
+ const Component = Vue.extend(PipelinesActions);
+ let vm;
- beforeEach(() => {
- ActionsComponent = Vue.extend(pipelinesActionsComp);
+ afterEach(() => {
+ vm.$destroy();
+ });
- actions = [
+ describe('manual actions', () => {
+ const actions = [
{
name: 'stop_review',
- path: '/root/review-app/builds/1893/play',
+ path: `${TEST_HOST}/root/review-app/builds/1893/play`,
},
{
name: 'foo',
- path: '#',
+ path: `${TEST_HOST}/disabled/pipeline/action`,
playable: false,
},
];
- component = new ActionsComponent({
- propsData: {
- actions,
- },
- }).$mount();
- });
+ beforeEach(() => {
+ vm = mountComponent(Component, { actions });
+ });
+
+ it('renders a dropdown with the provided actions', () => {
+ const dropdownItems = vm.$el.querySelectorAll('.dropdown-menu li');
- it('should render a dropdown with the provided actions', () => {
- expect(
- component.$el.querySelectorAll('.dropdown-menu li').length,
- ).toEqual(actions.length);
+ expect(dropdownItems.length).toEqual(actions.length);
+ });
+
+ it("renders a disabled action when it's not playable", () => {
+ const dropdownItem = vm.$el.querySelector('.dropdown-menu li:last-child button');
+
+ expect(dropdownItem).toBeDisabled();
+ });
});
- it('should render a disabled action when it\'s not playable', () => {
- expect(
- component.$el.querySelector('.dropdown-menu li:last-child button').getAttribute('disabled'),
- ).toEqual('disabled');
+ describe('scheduled jobs', () => {
+ const scheduledJobAction = {
+ name: 'scheduled action',
+ path: `${TEST_HOST}/scheduled/job/action`,
+ playable: true,
+ scheduled_at: '2063-04-05T00:42:00Z',
+ };
+ const expiredJobAction = {
+ name: 'expired action',
+ path: `${TEST_HOST}/expired/job/action`,
+ playable: true,
+ scheduled_at: '2018-10-05T08:23:00Z',
+ };
+ const findDropdownItem = action => {
+ const buttons = vm.$el.querySelectorAll('.dropdown-menu li button');
+ return Array.prototype.find.call(buttons, element =>
+ element.innerText.trim().startsWith(action.name),
+ );
+ };
+
+ beforeEach(done => {
+ spyOn(Date, 'now').and.callFake(() => new Date('2063-04-04T00:42:00Z').getTime());
+ vm = mountComponent(Component, { actions: [scheduledJobAction, expiredJobAction] });
+
+ Vue.nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('emits postAction event after confirming', () => {
+ const emitSpy = jasmine.createSpy('emit');
+ eventHub.$on('postAction', emitSpy);
+ spyOn(window, 'confirm').and.callFake(() => true);
+
+ findDropdownItem(scheduledJobAction).click();
+
+ expect(window.confirm).toHaveBeenCalled();
+ expect(emitSpy).toHaveBeenCalledWith(scheduledJobAction.path);
+ });
+
+ it('does not emit postAction event if confirmation is cancelled', () => {
+ const emitSpy = jasmine.createSpy('emit');
+ eventHub.$on('postAction', emitSpy);
+ spyOn(window, 'confirm').and.callFake(() => false);
+
+ findDropdownItem(scheduledJobAction).click();
+
+ expect(window.confirm).toHaveBeenCalled();
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('displays the remaining time in the dropdown', () => {
+ expect(findDropdownItem(scheduledJobAction)).toContainText('24:00:00');
+ });
- expect(
- component.$el.querySelector('.dropdown-menu li:last-child button').classList.contains('disabled'),
- ).toEqual(true);
+ it('displays 00:00:00 for expired jobs in the dropdown', () => {
+ expect(findDropdownItem(expiredJobAction)).toContainText('00:00:00');
+ });
});
});
diff --git a/spec/javascripts/pipelines/pipelines_artifacts_spec.js b/spec/javascripts/pipelines/pipelines_artifacts_spec.js
index a8a8e3e2cff..7705d5a19bf 100644
--- a/spec/javascripts/pipelines/pipelines_artifacts_spec.js
+++ b/spec/javascripts/pipelines/pipelines_artifacts_spec.js
@@ -23,18 +23,16 @@ describe('Pipelines Artifacts dropdown', () => {
});
it('should render a dropdown with the provided artifacts', () => {
- expect(
- component.$el.querySelectorAll('.dropdown-menu li').length,
- ).toEqual(artifacts.length);
+ expect(component.$el.querySelectorAll('.dropdown-menu li').length).toEqual(artifacts.length);
});
it('should render a link with the provided path', () => {
- expect(
- component.$el.querySelector('.dropdown-menu li a').getAttribute('href'),
- ).toEqual(artifacts[0].path);
+ expect(component.$el.querySelector('.dropdown-menu li a').getAttribute('href')).toEqual(
+ artifacts[0].path,
+ );
- expect(
- component.$el.querySelector('.dropdown-menu li a').textContent,
- ).toContain(artifacts[0].name);
+ expect(component.$el.querySelector('.dropdown-menu li a').textContent).toContain(
+ artifacts[0].name,
+ );
});
});
diff --git a/spec/javascripts/pipelines/pipelines_spec.js b/spec/javascripts/pipelines/pipelines_spec.js
index 50141bd99b4..97ded16db69 100644
--- a/spec/javascripts/pipelines/pipelines_spec.js
+++ b/spec/javascripts/pipelines/pipelines_spec.js
@@ -52,7 +52,7 @@ describe('Pipelines', () => {
describe('With permission', () => {
describe('With pipelines in main tab', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, pipelines);
vm = mountComponent(PipelinesComponent, {
@@ -72,7 +72,9 @@ describe('Pipelines', () => {
});
it('renders Run Pipeline link', () => {
- expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
+ expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(
+ paths.newPipelinePath,
+ );
});
it('renders CI Lint link', () => {
@@ -80,18 +82,20 @@ describe('Pipelines', () => {
});
it('renders Clear Runner Cache button', () => {
- expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
+ expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual(
+ 'Clear Runner Caches',
+ );
});
it('renders pipelines table', () => {
- expect(
- vm.$el.querySelectorAll('.gl-responsive-table-row').length,
- ).toEqual(pipelines.pipelines.length + 1);
+ expect(vm.$el.querySelectorAll('.gl-responsive-table-row').length).toEqual(
+ pipelines.pipelines.length + 1,
+ );
});
});
describe('Without pipelines on main tab with CI', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, {
pipelines: [],
count: {
@@ -118,7 +122,9 @@ describe('Pipelines', () => {
});
it('renders Run Pipeline link', () => {
- expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
+ expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(
+ paths.newPipelinePath,
+ );
});
it('renders CI Lint link', () => {
@@ -126,16 +132,20 @@ describe('Pipelines', () => {
});
it('renders Clear Runner Cache button', () => {
- expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
+ expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual(
+ 'Clear Runner Caches',
+ );
});
it('renders tab empty state', () => {
- expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual('There are currently no pipelines.');
+ expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual(
+ 'There are currently no pipelines.',
+ );
});
});
describe('Without pipelines nor CI', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, {
pipelines: [],
count: {
@@ -158,8 +168,13 @@ describe('Pipelines', () => {
});
it('renders empty state', () => {
- expect(vm.$el.querySelector('.js-empty-state h4').textContent.trim()).toEqual('Build with confidence');
- expect(vm.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual(paths.helpPagePath);
+ expect(vm.$el.querySelector('.js-empty-state h4').textContent.trim()).toEqual(
+ 'Build with confidence',
+ );
+
+ expect(vm.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual(
+ paths.helpPagePath,
+ );
});
it('does not render tabs nor buttons', () => {
@@ -171,7 +186,7 @@ describe('Pipelines', () => {
});
describe('When API returns error', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(500, {});
vm = mountComponent(PipelinesComponent, {
store: new Store(),
@@ -190,20 +205,27 @@ describe('Pipelines', () => {
});
it('renders buttons', () => {
- expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
+ expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(
+ paths.newPipelinePath,
+ );
+
expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath);
- expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
+ expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual(
+ 'Clear Runner Caches',
+ );
});
it('renders error state', () => {
- expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain('There was an error fetching the pipelines.');
+ expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain(
+ 'There was an error fetching the pipelines.',
+ );
});
});
});
describe('Without permission', () => {
describe('With pipelines in main tab', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, pipelines);
vm = mountComponent(PipelinesComponent, {
@@ -229,14 +251,14 @@ describe('Pipelines', () => {
});
it('renders pipelines table', () => {
- expect(
- vm.$el.querySelectorAll('.gl-responsive-table-row').length,
- ).toEqual(pipelines.pipelines.length + 1);
+ expect(vm.$el.querySelectorAll('.gl-responsive-table-row').length).toEqual(
+ pipelines.pipelines.length + 1,
+ );
});
});
describe('Without pipelines on main tab with CI', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, {
pipelines: [],
count: {
@@ -270,12 +292,14 @@ describe('Pipelines', () => {
});
it('renders tab empty state', () => {
- expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual('There are currently no pipelines.');
+ expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual(
+ 'There are currently no pipelines.',
+ );
});
});
describe('Without pipelines nor CI', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(200, {
pipelines: [],
count: {
@@ -299,7 +323,10 @@ describe('Pipelines', () => {
});
it('renders empty state without button to set CI', () => {
- expect(vm.$el.querySelector('.js-empty-state').textContent.trim()).toEqual('This project is not currently set up to run pipelines.');
+ expect(vm.$el.querySelector('.js-empty-state').textContent.trim()).toEqual(
+ 'This project is not currently set up to run pipelines.',
+ );
+
expect(vm.$el.querySelector('.js-get-started-pipelines')).toBeNull();
});
@@ -312,7 +339,7 @@ describe('Pipelines', () => {
});
describe('When API returns error', () => {
- beforeEach((done) => {
+ beforeEach(done => {
mock.onGet('twitter/flight/pipelines.json').reply(500, {});
vm = mountComponent(PipelinesComponent, {
@@ -338,12 +365,14 @@ describe('Pipelines', () => {
});
it('renders error state', () => {
- expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain('There was an error fetching the pipelines.');
+ expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain(
+ 'There was an error fetching the pipelines.',
+ );
});
});
});
- describe('successfull request', () => {
+ describe('successful request', () => {
describe('with pipelines', () => {
beforeEach(() => {
mock.onGet('twitter/flight/pipelines.json').reply(200, pipelines);
@@ -356,41 +385,44 @@ describe('Pipelines', () => {
});
});
- it('should render table', (done) => {
+ it('should render table', done => {
setTimeout(() => {
expect(vm.$el.querySelector('.table-holder')).toBeDefined();
- expect(
- vm.$el.querySelectorAll('.gl-responsive-table-row').length,
- ).toEqual(pipelines.pipelines.length + 1);
+ expect(vm.$el.querySelectorAll('.gl-responsive-table-row').length).toEqual(
+ pipelines.pipelines.length + 1,
+ );
done();
});
});
- it('should render navigation tabs', (done) => {
+ it('should render navigation tabs', done => {
setTimeout(() => {
- expect(
- vm.$el.querySelector('.js-pipelines-tab-pending').textContent.trim(),
- ).toContain('Pending');
- expect(
- vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim(),
- ).toContain('All');
- expect(
- vm.$el.querySelector('.js-pipelines-tab-running').textContent.trim(),
- ).toContain('Running');
- expect(
- vm.$el.querySelector('.js-pipelines-tab-finished').textContent.trim(),
- ).toContain('Finished');
- expect(
- vm.$el.querySelector('.js-pipelines-tab-branches').textContent.trim(),
- ).toContain('Branches');
- expect(
- vm.$el.querySelector('.js-pipelines-tab-tags').textContent.trim(),
- ).toContain('Tags');
+ expect(vm.$el.querySelector('.js-pipelines-tab-pending').textContent.trim()).toContain(
+ 'Pending',
+ );
+
+ expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All');
+
+ expect(vm.$el.querySelector('.js-pipelines-tab-running').textContent.trim()).toContain(
+ 'Running',
+ );
+
+ expect(vm.$el.querySelector('.js-pipelines-tab-finished').textContent.trim()).toContain(
+ 'Finished',
+ );
+
+ expect(vm.$el.querySelector('.js-pipelines-tab-branches').textContent.trim()).toContain(
+ 'Branches',
+ );
+
+ expect(vm.$el.querySelector('.js-pipelines-tab-tags').textContent.trim()).toContain(
+ 'Tags',
+ );
done();
});
});
- it('should make an API request when using tabs', (done) => {
+ it('should make an API request when using tabs', done => {
setTimeout(() => {
spyOn(vm, 'updateContent');
vm.$el.querySelector('.js-pipelines-tab-finished').click();
@@ -401,7 +433,7 @@ describe('Pipelines', () => {
});
describe('with pagination', () => {
- it('should make an API request when using pagination', (done) => {
+ it('should make an API request when using pagination', done => {
setTimeout(() => {
spyOn(vm, 'updateContent');
// Mock pagination
@@ -415,6 +447,7 @@ describe('Pipelines', () => {
vm.$nextTick(() => {
vm.$el.querySelector('.js-next-button a').click();
+
expect(vm.updateContent).toHaveBeenCalledWith({ scope: 'all', page: '2' });
done();
@@ -504,7 +537,7 @@ describe('Pipelines', () => {
});
describe('emptyTabMessage', () => {
- it('returns message with scope', (done) => {
+ it('returns message with scope', done => {
vm.scope = 'pending';
vm.$nextTick(() => {
@@ -523,7 +556,7 @@ describe('Pipelines', () => {
expect(vm.stateToRender).toEqual('loading');
});
- it('returns error state when app has error', (done) => {
+ it('returns error state when app has error', done => {
vm.hasError = true;
vm.isLoading = false;
@@ -533,7 +566,7 @@ describe('Pipelines', () => {
});
});
- it('returns table list when app has pipelines', (done) => {
+ it('returns table list when app has pipelines', done => {
vm.isLoading = false;
vm.hasError = false;
vm.state.pipelines = pipelines.pipelines;
@@ -545,7 +578,7 @@ describe('Pipelines', () => {
});
});
- it('returns empty tab when app does not have pipelines but project has pipelines', (done) => {
+ it('returns empty tab when app does not have pipelines but project has pipelines', done => {
vm.state.count.all = 10;
vm.isLoading = false;
@@ -556,7 +589,7 @@ describe('Pipelines', () => {
});
});
- it('returns empty tab when project has CI', (done) => {
+ it('returns empty tab when project has CI', done => {
vm.isLoading = false;
vm.$nextTick(() => {
expect(vm.stateToRender).toEqual('emptyTab');
@@ -565,7 +598,7 @@ describe('Pipelines', () => {
});
});
- it('returns empty state when project does not have pipelines nor CI', (done) => {
+ it('returns empty state when project does not have pipelines nor CI', done => {
vm.isLoading = false;
vm.hasGitlabCi = false;
vm.$nextTick(() => {
@@ -577,7 +610,7 @@ describe('Pipelines', () => {
});
describe('shouldRenderTabs', () => {
- it('returns true when state is loading & has already made the first request', (done) => {
+ it('returns true when state is loading & has already made the first request', done => {
vm.isLoading = true;
vm.hasMadeRequest = true;
@@ -588,7 +621,7 @@ describe('Pipelines', () => {
});
});
- it('returns true when state is tableList & has already made the first request', (done) => {
+ it('returns true when state is tableList & has already made the first request', done => {
vm.isLoading = false;
vm.state.pipelines = pipelines.pipelines;
vm.hasMadeRequest = true;
@@ -600,7 +633,7 @@ describe('Pipelines', () => {
});
});
- it('returns true when state is error & has already made the first request', (done) => {
+ it('returns true when state is error & has already made the first request', done => {
vm.isLoading = false;
vm.hasError = true;
vm.hasMadeRequest = true;
@@ -612,7 +645,7 @@ describe('Pipelines', () => {
});
});
- it('returns true when state is empty tab & has already made the first request', (done) => {
+ it('returns true when state is empty tab & has already made the first request', done => {
vm.isLoading = false;
vm.state.count.all = 10;
vm.hasMadeRequest = true;
@@ -624,7 +657,7 @@ describe('Pipelines', () => {
});
});
- it('returns false when has not made first request', (done) => {
+ it('returns false when has not made first request', done => {
vm.hasMadeRequest = false;
vm.$nextTick(() => {
@@ -634,7 +667,7 @@ describe('Pipelines', () => {
});
});
- it('returns false when state is emtpy state', (done) => {
+ it('returns false when state is empty state', done => {
vm.isLoading = false;
vm.hasMadeRequest = true;
vm.hasGitlabCi = false;
@@ -648,7 +681,7 @@ describe('Pipelines', () => {
});
describe('shouldRenderButtons', () => {
- it('returns true when it has paths & has made the first request', (done) => {
+ it('returns true when it has paths & has made the first request', done => {
vm.hasMadeRequest = true;
vm.$nextTick(() => {
@@ -658,7 +691,7 @@ describe('Pipelines', () => {
});
});
- it('returns false when it has not made the first request', (done) => {
+ it('returns false when it has not made the first request', done => {
vm.hasMadeRequest = false;
vm.$nextTick(() => {
@@ -675,19 +708,24 @@ describe('Pipelines', () => {
const copyPipeline = Object.assign({}, pipelineWithStages);
copyPipeline.id += 1;
mock
- .onGet('twitter/flight/pipelines.json').reply(200, {
- pipelines: [pipelineWithStages],
- count: {
- all: 1,
- finished: 1,
- pending: 0,
- running: 0,
+ .onGet('twitter/flight/pipelines.json')
+ .reply(
+ 200,
+ {
+ pipelines: [pipelineWithStages],
+ count: {
+ all: 1,
+ finished: 1,
+ pending: 0,
+ running: 0,
+ },
},
- }, {
- 'POLL-INTERVAL': 100,
- })
+ {
+ 'POLL-INTERVAL': 100,
+ },
+ )
.onGet(pipelineWithStages.details.stages[0].dropdown_path)
- .reply(200, stageReply);
+ .reply(200, stageReply);
vm = mountComponent(PipelinesComponent, {
store: new Store(),
@@ -698,7 +736,7 @@ describe('Pipelines', () => {
});
describe('when a request is being made', () => {
- it('stops polling, cancels the request, fetches pipelines & restarts polling', (done) => {
+ it('stops polling, cancels the request, fetches pipelines & restarts polling', done => {
spyOn(vm.poll, 'stop');
spyOn(vm.poll, 'restart');
spyOn(vm, 'getPipelines').and.returnValue(Promise.resolve());
@@ -706,7 +744,8 @@ describe('Pipelines', () => {
setTimeout(() => {
vm.isMakingRequest = true;
- return vm.$nextTick()
+ return vm
+ .$nextTick()
.then(() => {
vm.$el.querySelector('.js-builds-dropdown-button').click();
})
@@ -719,13 +758,14 @@ describe('Pipelines', () => {
expect(vm.poll.restart).toHaveBeenCalled();
done();
}, 0);
- });
+ })
+ .catch(done.fail);
}, 0);
});
});
describe('when no request is being made', () => {
- it('stops polling, fetches pipelines & restarts polling', (done) => {
+ it('stops polling, fetches pipelines & restarts polling', done => {
spyOn(vm.poll, 'stop');
spyOn(vm.poll, 'restart');
spyOn(vm, 'getPipelines').and.returnValue(Promise.resolve());
diff --git a/spec/javascripts/pipelines/pipelines_store_spec.js b/spec/javascripts/pipelines/pipelines_store_spec.js
index 10ff0c6bb84..ce21f788ed5 100644
--- a/spec/javascripts/pipelines/pipelines_store_spec.js
+++ b/spec/javascripts/pipelines/pipelines_store_spec.js
@@ -16,12 +16,14 @@ describe('Pipelines Store', () => {
describe('storePipelines', () => {
it('should use the default parameter if none is provided', () => {
store.storePipelines();
+
expect(store.state.pipelines).toEqual([]);
});
it('should store the provided array', () => {
const array = [{ id: 1, status: 'running' }, { id: 2, status: 'success' }];
store.storePipelines(array);
+
expect(store.state.pipelines).toEqual(array);
});
});
@@ -29,6 +31,7 @@ describe('Pipelines Store', () => {
describe('storeCount', () => {
it('should use the default parameter if none is provided', () => {
store.storeCount();
+
expect(store.state.count).toEqual({});
});
@@ -43,6 +46,7 @@ describe('Pipelines Store', () => {
describe('storePagination', () => {
it('should use the default parameter if none is provided', () => {
store.storePagination();
+
expect(store.state.pageInfo).toEqual({});
});
@@ -66,6 +70,7 @@ describe('Pipelines Store', () => {
};
store.storePagination(pagination);
+
expect(store.state.pageInfo).toEqual(expectedResult);
});
});
diff --git a/spec/javascripts/pipelines/pipelines_table_row_spec.js b/spec/javascripts/pipelines/pipelines_table_row_spec.js
index 03ffc122795..4c575536f0e 100644
--- a/spec/javascripts/pipelines/pipelines_table_row_spec.js
+++ b/spec/javascripts/pipelines/pipelines_table_row_spec.js
@@ -37,6 +37,7 @@ describe('Pipelines Table Row', () => {
it('should render a table row', () => {
component = buildComponent(pipeline);
+
expect(component.$el.getAttribute('class')).toContain('gl-responsive-table-row');
});
@@ -85,8 +86,8 @@ describe('Pipelines Table Row', () => {
expect(
component.$el
- .querySelector('.table-section:nth-child(2) img')
- .getAttribute('data-original-title'),
+ .querySelector('.table-section:nth-child(2) .js-user-avatar-image-toolip')
+ .textContent.trim(),
).toEqual(pipeline.user.name);
});
});
@@ -97,6 +98,7 @@ describe('Pipelines Table Row', () => {
component = buildComponent(pipeline);
const commitLink = component.$el.querySelector('.branch-commit .commit-sha');
+
expect(commitLink.getAttribute('href')).toEqual(pipeline.commit.commit_path);
});
@@ -110,8 +112,8 @@ describe('Pipelines Table Row', () => {
const commitAuthorLink = commitAuthorElement.getAttribute('href');
const commitAuthorName = commitAuthorElement
- .querySelector('img.avatar')
- .getAttribute('data-original-title');
+ .querySelector('.js-user-avatar-image-toolip')
+ .textContent.trim();
return { commitAuthorElement, commitAuthorLink, commitAuthorName };
};
@@ -158,8 +160,13 @@ describe('Pipelines Table Row', () => {
});
describe('actions column', () => {
+ const scheduledJobAction = {
+ name: 'some scheduled job',
+ };
+
beforeEach(() => {
const withActions = Object.assign({}, pipeline);
+ withActions.details.scheduled_actions = [scheduledJobAction];
withActions.flags.cancelable = true;
withActions.flags.retryable = true;
withActions.cancel_path = '/cancel';
@@ -171,6 +178,9 @@ describe('Pipelines Table Row', () => {
it('should render the provided actions', () => {
expect(component.$el.querySelector('.js-pipelines-retry-button')).not.toBeNull();
expect(component.$el.querySelector('.js-pipelines-cancel-button')).not.toBeNull();
+ const dropdownMenu = component.$el.querySelectorAll('.dropdown-menu');
+
+ expect(dropdownMenu).toContainText(scheduledJobAction.name);
});
it('emits `retryPipeline` event when retry button is clicked and toggles loading', () => {
@@ -179,6 +189,7 @@ describe('Pipelines Table Row', () => {
});
component.$el.querySelector('.js-pipelines-retry-button').click();
+
expect(component.isRetrying).toEqual(true);
});
@@ -193,7 +204,8 @@ describe('Pipelines Table Row', () => {
it('renders a loading icon when `cancelingPipeline` matches pipeline id', done => {
component.cancelingPipeline = pipeline.id;
- component.$nextTick()
+ component
+ .$nextTick()
.then(() => {
expect(component.isCancelling).toEqual(true);
})
diff --git a/spec/javascripts/pipelines/pipelines_table_spec.js b/spec/javascripts/pipelines/pipelines_table_spec.js
index d21ba35e96d..5c3387190ab 100644
--- a/spec/javascripts/pipelines/pipelines_table_spec.js
+++ b/spec/javascripts/pipelines/pipelines_table_spec.js
@@ -38,10 +38,21 @@ describe('Pipelines Table', () => {
});
it('should render table head with correct columns', () => {
- expect(component.$el.querySelector('.table-section.js-pipeline-status').textContent.trim()).toEqual('Status');
- expect(component.$el.querySelector('.table-section.js-pipeline-info').textContent.trim()).toEqual('Pipeline');
- expect(component.$el.querySelector('.table-section.js-pipeline-commit').textContent.trim()).toEqual('Commit');
- expect(component.$el.querySelector('.table-section.js-pipeline-stages').textContent.trim()).toEqual('Stages');
+ expect(
+ component.$el.querySelector('.table-section.js-pipeline-status').textContent.trim(),
+ ).toEqual('Status');
+
+ expect(
+ component.$el.querySelector('.table-section.js-pipeline-info').textContent.trim(),
+ ).toEqual('Pipeline');
+
+ expect(
+ component.$el.querySelector('.table-section.js-pipeline-commit').textContent.trim(),
+ ).toEqual('Commit');
+
+ expect(
+ component.$el.querySelector('.table-section.js-pipeline-stages').textContent.trim(),
+ ).toEqual('Stages');
});
});
@@ -54,6 +65,7 @@ describe('Pipelines Table', () => {
viewType: 'root',
},
}).$mount();
+
expect(component.$el.querySelectorAll('.commit.gl-responsive-table-row').length).toEqual(0);
});
});
diff --git a/spec/javascripts/pipelines/stage_spec.js b/spec/javascripts/pipelines/stage_spec.js
index 3f6789759ae..3c8b8032de8 100644
--- a/spec/javascripts/pipelines/stage_spec.js
+++ b/spec/javascripts/pipelines/stage_spec.js
@@ -40,7 +40,7 @@ describe('Pipelines stage component', () => {
expect(component.$el.querySelector('button').getAttribute('data-toggle')).toEqual('dropdown');
});
- describe('with successfull request', () => {
+ describe('with successful request', () => {
beforeEach(() => {
mock.onGet('path.json').reply(200, stageReply);
});
@@ -53,6 +53,7 @@ describe('Pipelines stage component', () => {
expect(
component.$el.querySelector('.js-builds-dropdown-container ul').textContent.trim(),
).toContain(stageReply.latest_statuses[0].name);
+
expect(eventHub.$emit).toHaveBeenCalledWith('clickedDropdown');
done();
}, 0);
@@ -119,12 +120,13 @@ describe('Pipelines stage component', () => {
setTimeout(() => {
component.$el.querySelector('.js-ci-action').click();
- component.$nextTick()
- .then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('refreshPipelinesTable');
- })
- .then(done)
- .catch(done.fail);
+ component
+ .$nextTick()
+ .then(() => {
+ expect(eventHub.$emit).toHaveBeenCalledWith('refreshPipelinesTable');
+ })
+ .then(done)
+ .catch(done.fail);
}, 0);
});
});
diff --git a/spec/javascripts/pipelines_spec.js b/spec/javascripts/pipelines_spec.js
index c08a73851be..6b86f9ea437 100644
--- a/spec/javascripts/pipelines_spec.js
+++ b/spec/javascripts/pipelines_spec.js
@@ -12,6 +12,8 @@ describe('Pipelines', () => {
});
it('should create a `Pipelines` instance without options', () => {
- expect(() => { new Pipelines(); }).not.toThrow(); //eslint-disable-line
+ expect(() => {
+ new Pipelines(); // eslint-disable-line no-new
+ }).not.toThrow();
});
});
diff --git a/spec/javascripts/polyfills/element_spec.js b/spec/javascripts/polyfills/element_spec.js
index ecaaf1907ea..d35df595c72 100644
--- a/spec/javascripts/polyfills/element_spec.js
+++ b/spec/javascripts/polyfills/element_spec.js
@@ -1,6 +1,6 @@
import '~/commons/polyfills/element';
-describe('Element polyfills', function () {
+describe('Element polyfills', function() {
beforeEach(() => {
this.element = document.createElement('ul');
});
diff --git a/spec/javascripts/pretty_time_spec.js b/spec/javascripts/pretty_time_spec.js
deleted file mode 100644
index 084ffe08917..00000000000
--- a/spec/javascripts/pretty_time_spec.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { parseSeconds, abbreviateTime, stringifyTime } from '~/lib/utils/pretty_time';
-
-function assertTimeUnits(obj, minutes, hours, days, weeks) {
- expect(obj.minutes).toBe(minutes);
- expect(obj.hours).toBe(hours);
- expect(obj.days).toBe(days);
- expect(obj.weeks).toBe(weeks);
-}
-
-describe('prettyTime methods', () => {
- describe('parseSeconds', () => {
- it('should correctly parse a negative value', () => {
- const zeroSeconds = parseSeconds(-1000);
-
- assertTimeUnits(zeroSeconds, 16, 0, 0, 0);
- });
-
- it('should correctly parse a zero value', () => {
- const zeroSeconds = parseSeconds(0);
-
- assertTimeUnits(zeroSeconds, 0, 0, 0, 0);
- });
-
- it('should correctly parse a small non-zero second values', () => {
- const subOneMinute = parseSeconds(10);
- const aboveOneMinute = parseSeconds(100);
- const manyMinutes = parseSeconds(1000);
-
- assertTimeUnits(subOneMinute, 0, 0, 0, 0);
- assertTimeUnits(aboveOneMinute, 1, 0, 0, 0);
- assertTimeUnits(manyMinutes, 16, 0, 0, 0);
- });
-
- it('should correctly parse large second values', () => {
- const aboveOneHour = parseSeconds(4800);
- const aboveOneDay = parseSeconds(110000);
- const aboveOneWeek = parseSeconds(25000000);
-
- assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
- assertTimeUnits(aboveOneDay, 33, 6, 3, 0);
- assertTimeUnits(aboveOneWeek, 26, 0, 3, 173);
- });
-
- it('should correctly accept a custom param for hoursPerDay', () => {
- const config = { hoursPerDay: 24 };
-
- const aboveOneHour = parseSeconds(4800, config);
- const aboveOneDay = parseSeconds(110000, config);
- const aboveOneWeek = parseSeconds(25000000, config);
-
- assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
- assertTimeUnits(aboveOneDay, 33, 6, 1, 0);
- assertTimeUnits(aboveOneWeek, 26, 8, 4, 57);
- });
-
- it('should correctly accept a custom param for daysPerWeek', () => {
- const config = { daysPerWeek: 7 };
-
- const aboveOneHour = parseSeconds(4800, config);
- const aboveOneDay = parseSeconds(110000, config);
- const aboveOneWeek = parseSeconds(25000000, config);
-
- assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
- assertTimeUnits(aboveOneDay, 33, 6, 3, 0);
- assertTimeUnits(aboveOneWeek, 26, 0, 0, 124);
- });
-
- it('should correctly accept custom params for daysPerWeek and hoursPerDay', () => {
- const config = { daysPerWeek: 55, hoursPerDay: 14 };
-
- const aboveOneHour = parseSeconds(4800, config);
- const aboveOneDay = parseSeconds(110000, config);
- const aboveOneWeek = parseSeconds(25000000, config);
-
- assertTimeUnits(aboveOneHour, 20, 1, 0, 0);
- assertTimeUnits(aboveOneDay, 33, 2, 2, 0);
- assertTimeUnits(aboveOneWeek, 26, 0, 1, 9);
- });
- });
-
- describe('stringifyTime', () => {
- it('should stringify values with all non-zero units', () => {
- const timeObject = {
- weeks: 1,
- days: 4,
- hours: 7,
- minutes: 20,
- };
-
- const timeString = stringifyTime(timeObject);
-
- expect(timeString).toBe('1w 4d 7h 20m');
- });
-
- it('should stringify values with some non-zero units', () => {
- const timeObject = {
- weeks: 0,
- days: 4,
- hours: 0,
- minutes: 20,
- };
-
- const timeString = stringifyTime(timeObject);
-
- expect(timeString).toBe('4d 20m');
- });
-
- it('should stringify values with no non-zero units', () => {
- const timeObject = {
- weeks: 0,
- days: 0,
- hours: 0,
- minutes: 0,
- };
-
- const timeString = stringifyTime(timeObject);
-
- expect(timeString).toBe('0m');
- });
- });
-
- describe('abbreviateTime', () => {
- it('should abbreviate stringified times for weeks', () => {
- const fullTimeString = '1w 3d 4h 5m';
- expect(abbreviateTime(fullTimeString)).toBe('1w');
- });
-
- it('should abbreviate stringified times for non-weeks', () => {
- const fullTimeString = '0w 3d 4h 5m';
- expect(abbreviateTime(fullTimeString)).toBe('3d');
- });
- });
-});
diff --git a/spec/javascripts/profile/account/components/delete_account_modal_spec.js b/spec/javascripts/profile/account/components/delete_account_modal_spec.js
index a0939ff5c20..d5f5cabc63e 100644
--- a/spec/javascripts/profile/account/components/delete_account_modal_spec.js
+++ b/spec/javascripts/profile/account/components/delete_account_modal_spec.js
@@ -28,7 +28,7 @@ describe('DeleteAccountModal component', () => {
};
describe('with password confirmation', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = mountComponent(Component, {
actionUrl,
confirmWithPassword: true,
@@ -42,7 +42,7 @@ describe('DeleteAccountModal component', () => {
.catch(done.fail);
});
- it('does not accept empty password', (done) => {
+ it('does not accept empty password', done => {
const { form, input, submitButton } = findElements();
spyOn(form, 'submit');
input.value = '';
@@ -53,13 +53,14 @@ describe('DeleteAccountModal component', () => {
expect(vm.enteredPassword).toBe(input.value);
expect(submitButton).toHaveAttr('disabled', 'disabled');
submitButton.click();
+
expect(form.submit).not.toHaveBeenCalled();
})
.then(done)
.catch(done.fail);
});
- it('submits form with password', (done) => {
+ it('submits form with password', done => {
const { form, input, submitButton } = findElements();
spyOn(form, 'submit');
input.value = 'anything';
@@ -70,6 +71,7 @@ describe('DeleteAccountModal component', () => {
expect(vm.enteredPassword).toBe(input.value);
expect(submitButton).not.toHaveAttr('disabled', 'disabled');
submitButton.click();
+
expect(form.submit).toHaveBeenCalled();
})
.then(done)
@@ -78,7 +80,7 @@ describe('DeleteAccountModal component', () => {
});
describe('with username confirmation', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm = mountComponent(Component, {
actionUrl,
confirmWithPassword: false,
@@ -92,7 +94,7 @@ describe('DeleteAccountModal component', () => {
.catch(done.fail);
});
- it('does not accept wrong username', (done) => {
+ it('does not accept wrong username', done => {
const { form, input, submitButton } = findElements();
spyOn(form, 'submit');
input.value = 'this is wrong';
@@ -103,13 +105,14 @@ describe('DeleteAccountModal component', () => {
expect(vm.enteredUsername).toBe(input.value);
expect(submitButton).toHaveAttr('disabled', 'disabled');
submitButton.click();
+
expect(form.submit).not.toHaveBeenCalled();
})
.then(done)
.catch(done.fail);
});
- it('submits form with correct username', (done) => {
+ it('submits form with correct username', done => {
const { form, input, submitButton } = findElements();
spyOn(form, 'submit');
input.value = username;
@@ -120,6 +123,7 @@ describe('DeleteAccountModal component', () => {
expect(vm.enteredUsername).toBe(input.value);
expect(submitButton).not.toHaveAttr('disabled', 'disabled');
submitButton.click();
+
expect(form.submit).toHaveBeenCalled();
})
.then(done)
diff --git a/spec/javascripts/profile/account/components/update_username_spec.js b/spec/javascripts/profile/account/components/update_username_spec.js
index 5311499fb73..cc07a5f6e43 100644
--- a/spec/javascripts/profile/account/components/update_username_spec.js
+++ b/spec/javascripts/profile/account/components/update_username_spec.js
@@ -113,6 +113,7 @@ describe('UpdateUsername component', () => {
Vue.nextTick()
.then(() => {
confirmModalBtn.click();
+
expect(axios.put).toHaveBeenCalledWith(actionUrl, { user: { username: newUsername } });
})
.then(done)
@@ -131,8 +132,7 @@ describe('UpdateUsername component', () => {
vm.newUsername = newUsername;
- vm
- .onConfirm()
+ vm.onConfirm()
.then(() => {
expect(vm.username).toBe(newUsername);
expect(vm.newUsername).toBe(newUsername);
@@ -157,8 +157,7 @@ describe('UpdateUsername component', () => {
const invalidUsername = 'anything.git';
vm.newUsername = invalidUsername;
- vm
- .onConfirm()
+ vm.onConfirm()
.then(() => done.fail('Expected onConfirm to throw!'))
.catch(() => {
expect(vm.username).toBe(username);
diff --git a/spec/javascripts/project_select_combo_button_spec.js b/spec/javascripts/project_select_combo_button_spec.js
index 1b65f767f96..109a5000f5d 100644
--- a/spec/javascripts/project_select_combo_button_spec.js
+++ b/spec/javascripts/project_select_combo_button_spec.js
@@ -3,10 +3,10 @@ import ProjectSelectComboButton from '~/project_select_combo_button';
const fixturePath = 'static/project_select_combo_button.html.raw';
-describe('Project Select Combo Button', function () {
+describe('Project Select Combo Button', function() {
preloadFixtures(fixturePath);
- beforeEach(function () {
+ beforeEach(function() {
this.defaults = {
label: 'Select project to create issue',
groupId: 12345,
@@ -28,43 +28,44 @@ describe('Project Select Combo Button', function () {
this.projectSelectInput = document.querySelector('.project-item-select');
});
- describe('on page load when localStorage is empty', function () {
- beforeEach(function () {
+ describe('on page load when localStorage is empty', function() {
+ beforeEach(function() {
this.comboButton = new ProjectSelectComboButton(this.projectSelectInput);
});
- it('newItemBtn href is null', function () {
+ it('newItemBtn href is null', function() {
expect(this.newItemBtn.getAttribute('href')).toBe('');
});
- it('newItemBtn text is the plain default label', function () {
+ it('newItemBtn text is the plain default label', function() {
expect(this.newItemBtn.textContent).toBe(this.defaults.label);
});
});
- describe('on page load when localStorage is filled', function () {
- beforeEach(function () {
- window.localStorage
- .setItem(this.defaults.localStorageKey, JSON.stringify(this.defaults.projectMeta));
+ describe('on page load when localStorage is filled', function() {
+ beforeEach(function() {
+ window.localStorage.setItem(
+ this.defaults.localStorageKey,
+ JSON.stringify(this.defaults.projectMeta),
+ );
this.comboButton = new ProjectSelectComboButton(this.projectSelectInput);
});
- it('newItemBtn href is correctly set', function () {
+ it('newItemBtn href is correctly set', function() {
expect(this.newItemBtn.getAttribute('href')).toBe(this.defaults.projectMeta.url);
});
- it('newItemBtn text is the cached label', function () {
- expect(this.newItemBtn.textContent)
- .toBe(`New issue in ${this.defaults.projectMeta.name}`);
+ it('newItemBtn text is the cached label', function() {
+ expect(this.newItemBtn.textContent).toBe(`New issue in ${this.defaults.projectMeta.name}`);
});
- afterEach(function () {
+ afterEach(function() {
window.localStorage.clear();
});
});
- describe('after selecting a new project', function () {
- beforeEach(function () {
+ describe('after selecting a new project', function() {
+ beforeEach(function() {
this.comboButton = new ProjectSelectComboButton(this.projectSelectInput);
// mock the effect of selecting an item from the projects dropdown (select2)
@@ -73,23 +74,21 @@ describe('Project Select Combo Button', function () {
.trigger('change');
});
- it('newItemBtn href is correctly set', function () {
- expect(this.newItemBtn.getAttribute('href'))
- .toBe('http://myothercoolproject.com/issues/new');
+ it('newItemBtn href is correctly set', function() {
+ expect(this.newItemBtn.getAttribute('href')).toBe('http://myothercoolproject.com/issues/new');
});
- it('newItemBtn text is the selected project label', function () {
- expect(this.newItemBtn.textContent)
- .toBe(`New issue in ${this.defaults.newProjectMeta.name}`);
+ it('newItemBtn text is the selected project label', function() {
+ expect(this.newItemBtn.textContent).toBe(`New issue in ${this.defaults.newProjectMeta.name}`);
});
- afterEach(function () {
+ afterEach(function() {
window.localStorage.clear();
});
});
- describe('deriveTextVariants', function () {
- beforeEach(function () {
+ describe('deriveTextVariants', function() {
+ beforeEach(function() {
this.mockExecutionContext = {
resourceType: '',
resourceLabel: '',
@@ -100,7 +99,7 @@ describe('Project Select Combo Button', function () {
this.method = this.comboButton.deriveTextVariants.bind(this.mockExecutionContext);
});
- it('correctly derives test variants for merge requests', function () {
+ it('correctly derives test variants for merge requests', function() {
this.mockExecutionContext.resourceType = 'merge_requests';
this.mockExecutionContext.resourceLabel = 'New merge request';
@@ -111,7 +110,7 @@ describe('Project Select Combo Button', function () {
expect(returnedVariants.presetTextSuffix).toBe('merge request');
});
- it('correctly derives text variants for issues', function () {
+ it('correctly derives text variants for issues', function() {
this.mockExecutionContext.resourceType = 'issues';
this.mockExecutionContext.resourceLabel = 'New issue';
@@ -123,4 +122,3 @@ describe('Project Select Combo Button', function () {
});
});
});
-
diff --git a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_machine_type_dropdown_spec.js b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_machine_type_dropdown_spec.js
index 21805ef0b28..fdecb823cd2 100644
--- a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_machine_type_dropdown_spec.js
+++ b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_machine_type_dropdown_spec.js
@@ -90,14 +90,20 @@ describe('GkeMachineTypeDropdown', () => {
expect(vm.$el.querySelector('input').value).toBe('');
vm.$store.commit(SET_MACHINE_TYPES, gapiMachineTypesResponseMock.items);
- return vm.$nextTick().then(() => {
- vm.$el.querySelector('.dropdown-content button').click();
-
- return vm.$nextTick().then(() => {
- expect(vm.$el.querySelector('input').value).toBe(selectedMachineTypeMock);
- done();
- });
- });
+ return vm
+ .$nextTick()
+ .then(() => {
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ return vm
+ .$nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('input').value).toBe(selectedMachineTypeMock);
+ done();
+ })
+ .catch(done.fail);
+ })
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_project_id_dropdown_spec.js b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_project_id_dropdown_spec.js
index d4fcb2dc8ff..030662b4d90 100644
--- a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_project_id_dropdown_spec.js
+++ b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_project_id_dropdown_spec.js
@@ -48,45 +48,61 @@ describe('GkeProjectIdDropdown', () => {
it('returns project billing validation text', () => {
vm.setIsValidatingProjectBilling(true);
+
expect(vm.toggleText).toBe(LABELS.VALIDATING_PROJECT_BILLING);
});
it('returns default toggle text', done =>
- vm.$nextTick().then(() => {
- vm.setItem(emptyProjectMock);
+ vm
+ .$nextTick()
+ .then(() => {
+ vm.setItem(emptyProjectMock);
- expect(vm.toggleText).toBe(LABELS.DEFAULT);
- done();
- }));
+ expect(vm.toggleText).toBe(LABELS.DEFAULT);
+ done();
+ })
+ .catch(done.fail));
it('returns project name if project selected', done =>
- vm.$nextTick().then(() => {
- expect(vm.toggleText).toBe(selectedProjectMock.name);
- done();
- }));
+ vm
+ .$nextTick()
+ .then(() => {
+ expect(vm.toggleText).toBe(selectedProjectMock.name);
+ done();
+ })
+ .catch(done.fail));
it('returns empty toggle text', done =>
- vm.$nextTick().then(() => {
- vm.$store.commit(SET_PROJECTS, null);
- vm.setItem(emptyProjectMock);
+ vm
+ .$nextTick()
+ .then(() => {
+ vm.$store.commit(SET_PROJECTS, null);
+ vm.setItem(emptyProjectMock);
- expect(vm.toggleText).toBe(LABELS.EMPTY);
- done();
- }));
+ expect(vm.toggleText).toBe(LABELS.EMPTY);
+ done();
+ })
+ .catch(done.fail));
});
describe('selectItem', () => {
it('reflects new value when dropdown item is clicked', done => {
expect(vm.$el.querySelector('input').value).toBe('');
- return vm.$nextTick().then(() => {
- vm.$el.querySelector('.dropdown-content button').click();
-
- return vm.$nextTick().then(() => {
- expect(vm.$el.querySelector('input').value).toBe(selectedProjectMock.projectId);
- done();
- });
- });
+ return vm
+ .$nextTick()
+ .then(() => {
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ return vm
+ .$nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('input').value).toBe(selectedProjectMock.projectId);
+ done();
+ })
+ .catch(done.fail);
+ })
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown_spec.js b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown_spec.js
index 89a4a7ea2ce..95186e19ca1 100644
--- a/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown_spec.js
+++ b/spec/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown_spec.js
@@ -75,14 +75,20 @@ describe('GkeZoneDropdown', () => {
expect(vm.$el.querySelector('input').value).toBe('');
vm.$store.commit(SET_ZONES, gapiZonesResponseMock.items);
- return vm.$nextTick().then(() => {
- vm.$el.querySelector('.dropdown-content button').click();
-
- return vm.$nextTick().then(() => {
- expect(vm.$el.querySelector('input').value).toBe(selectedZoneMock);
- done();
- });
- });
+ return vm
+ .$nextTick()
+ .then(() => {
+ vm.$el.querySelector('.dropdown-content button').click();
+
+ return vm
+ .$nextTick()
+ .then(() => {
+ expect(vm.$el.querySelector('input').value).toBe(selectedZoneMock);
+ done();
+ })
+ .catch(done.fail);
+ })
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/projects/project_new_spec.js b/spec/javascripts/projects/project_new_spec.js
index 84515d2bf97..b61e0ac872f 100644
--- a/spec/javascripts/projects/project_new_spec.js
+++ b/spec/javascripts/projects/project_new_spec.js
@@ -4,12 +4,14 @@ import projectNew from '~/projects/project_new';
describe('New Project', () => {
let $projectImportUrl;
let $projectPath;
+ let $projectName;
beforeEach(() => {
setFixtures(`
<div class='toggle-import-form'>
<div class='import-url-data'>
<input id="project_import_url" />
+ <input id="project_name" />
<input id="project_path" />
</div>
</div>
@@ -17,6 +19,7 @@ describe('New Project', () => {
$projectImportUrl = $('#project_import_url');
$projectPath = $('#project_path');
+ $projectName = $('#project_name');
});
describe('deriveProjectPathFromUrl', () => {
@@ -24,7 +27,10 @@ describe('New Project', () => {
beforeEach(() => {
projectNew.bindEvents();
- $projectPath.val('').keyup().val(dummyImportUrl);
+ $projectPath
+ .val('')
+ .keyup()
+ .val(dummyImportUrl);
});
it('does not change project path for disabled $projectImportUrl', () => {
@@ -129,4 +135,31 @@ describe('New Project', () => {
});
});
});
+
+ describe('deriveSlugFromProjectName', () => {
+ beforeEach(() => {
+ projectNew.bindEvents();
+ $projectName.val('').keyup();
+ });
+
+ it('converts project name to lower case and dash-limited slug', () => {
+ const dummyProjectName = 'My Awesome Project';
+
+ $projectName.val(dummyProjectName);
+
+ projectNew.onProjectNameChange($projectName, $projectPath);
+
+ expect($projectPath.val()).toEqual('my-awesome-project');
+ });
+
+ it('does not add additional dashes in the slug if the project name already contains dashes', () => {
+ const dummyProjectName = 'My-Dash-Delimited Awesome Project';
+
+ $projectName.val(dummyProjectName);
+
+ projectNew.onProjectNameChange($projectName, $projectPath);
+
+ expect($projectPath.val()).toEqual('my-dash-delimited-awesome-project');
+ });
+ });
});
diff --git a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js
index 955ec6a531c..94e2f959d46 100644
--- a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js
+++ b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js
@@ -85,9 +85,17 @@ describe('PrometheusMetrics', () => {
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy();
expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBeFalsy();
- expect(prometheusMetrics.$monitoredMetricsCount.text()).toEqual('3 exporters with 12 metrics were found');
+ expect(prometheusMetrics.$monitoredMetricsCount.text()).toEqual(
+ '3 exporters with 12 metrics were found',
+ );
+
expect($metricsListLi.length).toEqual(metrics.length);
- expect($metricsListLi.first().find('.badge').text()).toEqual(`${metrics[0].active_metrics}`);
+ expect(
+ $metricsListLi
+ .first()
+ .find('.badge')
+ .text(),
+ ).toEqual(`${metrics[0].active_metrics}`);
});
it('should show missing environment variables list', () => {
@@ -129,7 +137,7 @@ describe('PrometheusMetrics', () => {
mock.restore();
});
- it('should show loader animation while response is being loaded and hide it when request is complete', (done) => {
+ it('should show loader animation while response is being loaded and hide it when request is complete', done => {
mockSuccess();
prometheusMetrics.loadActiveMetrics();
@@ -143,7 +151,7 @@ describe('PrometheusMetrics', () => {
});
});
- it('should show empty state if response failed to load', (done) => {
+ it('should show empty state if response failed to load', done => {
mockError();
prometheusMetrics.loadActiveMetrics();
@@ -155,7 +163,7 @@ describe('PrometheusMetrics', () => {
});
});
- it('should populate metrics list once response is loaded', (done) => {
+ it('should populate metrics list once response is loaded', done => {
spyOn(prometheusMetrics, 'populateActiveMetrics');
mockSuccess();
diff --git a/spec/javascripts/raven/raven_config_spec.js b/spec/javascripts/raven/raven_config_spec.js
index c82658b9262..5cc59cc28d3 100644
--- a/spec/javascripts/raven/raven_config_spec.js
+++ b/spec/javascripts/raven/raven_config_spec.js
@@ -133,7 +133,7 @@ describe('RavenConfig', () => {
RavenConfig.setUser.call(ravenConfig);
});
- it('should call .setUserContext', function () {
+ it('should call .setUserContext', function() {
expect(Raven.setUserContext).toHaveBeenCalledWith({
id: ravenConfig.options.currentUserId,
});
diff --git a/spec/javascripts/read_more_spec.js b/spec/javascripts/read_more_spec.js
new file mode 100644
index 00000000000..b1af0f80a50
--- /dev/null
+++ b/spec/javascripts/read_more_spec.js
@@ -0,0 +1,23 @@
+import initReadMore from '~/read_more';
+
+describe('Read more click-to-expand functionality', () => {
+ const fixtureName = 'projects/overview.html.raw';
+
+ preloadFixtures(fixtureName);
+
+ beforeEach(() => {
+ loadFixtures(fixtureName);
+ });
+
+ describe('expands target element', () => {
+ it('adds "is-expanded" class to target element', () => {
+ const target = document.querySelector('.read-more-container');
+ const trigger = document.querySelector('.js-read-more-trigger');
+ initReadMore();
+
+ trigger.click();
+
+ expect(target.classList.contains('is-expanded')).toEqual(true);
+ });
+ });
+});
diff --git a/spec/javascripts/registry/components/app_spec.js b/spec/javascripts/registry/components/app_spec.js
index cf1d0625397..92ff960277a 100644
--- a/spec/javascripts/registry/components/app_spec.js
+++ b/spec/javascripts/registry/components/app_spec.js
@@ -18,9 +18,11 @@ describe('Registry List', () => {
describe('with data', () => {
const interceptor = (request, next) => {
- next(request.respondWith(JSON.stringify(reposServerResponse), {
- status: 200,
- }));
+ next(
+ request.respondWith(JSON.stringify(reposServerResponse), {
+ status: 200,
+ }),
+ );
};
beforeEach(() => {
@@ -32,21 +34,21 @@ describe('Registry List', () => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
});
- it('should render a list of repos', (done) => {
+ it('should render a list of repos', done => {
setTimeout(() => {
expect(vm.$store.state.repos.length).toEqual(reposServerResponse.length);
Vue.nextTick(() => {
- expect(
- vm.$el.querySelectorAll('.container-image').length,
- ).toEqual(reposServerResponse.length);
+ expect(vm.$el.querySelectorAll('.container-image').length).toEqual(
+ reposServerResponse.length,
+ );
done();
});
}, 0);
});
describe('delete repository', () => {
- it('should be possible to delete a repo', (done) => {
+ it('should be possible to delete a repo', done => {
setTimeout(() => {
Vue.nextTick(() => {
expect(vm.$el.querySelector('.container-image-head .js-remove-repo')).toBeDefined();
@@ -57,12 +59,14 @@ describe('Registry List', () => {
});
describe('toggle repository', () => {
- it('should open the container', (done) => {
+ it('should open the container', done => {
setTimeout(() => {
Vue.nextTick(() => {
vm.$el.querySelector('.js-toggle-repo').click();
Vue.nextTick(() => {
- expect(vm.$el.querySelector('.js-toggle-repo i').className).toEqual('fa fa-chevron-up');
+ expect(vm.$el.querySelector('.js-toggle-repo i').className).toEqual(
+ 'fa fa-chevron-up',
+ );
done();
});
});
@@ -73,9 +77,11 @@ describe('Registry List', () => {
describe('without data', () => {
const interceptor = (request, next) => {
- next(request.respondWith(JSON.stringify([]), {
- status: 200,
- }));
+ next(
+ request.respondWith(JSON.stringify([]), {
+ status: 200,
+ }),
+ );
};
beforeEach(() => {
@@ -87,11 +93,16 @@ describe('Registry List', () => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
});
- it('should render empty message', (done) => {
+ it('should render empty message', done => {
setTimeout(() => {
expect(
- vm.$el.querySelector('p').textContent.trim().replace(/[\r\n]+/g, ' '),
- ).toEqual('No container images stored for this project. Add one by following the instructions above.');
+ vm.$el
+ .querySelector('p')
+ .textContent.trim()
+ .replace(/[\r\n]+/g, ' '),
+ ).toEqual(
+ 'No container images stored for this project. Add one by following the instructions above.',
+ );
done();
}, 0);
});
@@ -99,9 +110,11 @@ describe('Registry List', () => {
describe('while loading data', () => {
const interceptor = (request, next) => {
- next(request.respondWith(JSON.stringify(reposServerResponse), {
- status: 200,
- }));
+ next(
+ request.respondWith(JSON.stringify(reposServerResponse), {
+ status: 200,
+ }),
+ );
};
beforeEach(() => {
@@ -113,7 +126,7 @@ describe('Registry List', () => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor);
});
- it('should render a loading spinner', (done) => {
+ it('should render a loading spinner', done => {
Vue.nextTick(() => {
expect(vm.$el.querySelector('.fa-spinner')).not.toBe(null);
done();
diff --git a/spec/javascripts/registry/components/collapsible_container_spec.js b/spec/javascripts/registry/components/collapsible_container_spec.js
index 5891921318a..256a242f784 100644
--- a/spec/javascripts/registry/components/collapsible_container_spec.js
+++ b/spec/javascripts/registry/components/collapsible_container_spec.js
@@ -24,26 +24,32 @@ describe('collapsible registry container', () => {
describe('toggle', () => {
it('should be closed by default', () => {
expect(vm.$el.querySelector('.container-image-tags')).toBe(null);
- expect(vm.$el.querySelector('.container-image-head i').className).toEqual('fa fa-chevron-right');
+ expect(vm.$el.querySelector('.container-image-head i').className).toEqual(
+ 'fa fa-chevron-right',
+ );
});
- it('should be open when user clicks on closed repo', (done) => {
+ it('should be open when user clicks on closed repo', done => {
vm.$el.querySelector('.js-toggle-repo').click();
Vue.nextTick(() => {
expect(vm.$el.querySelector('.container-image-tags')).toBeDefined();
- expect(vm.$el.querySelector('.container-image-head i').className).toEqual('fa fa-chevron-up');
+ expect(vm.$el.querySelector('.container-image-head i').className).toEqual(
+ 'fa fa-chevron-up',
+ );
done();
});
});
- it('should be closed when the user clicks on an opened repo', (done) => {
+ it('should be closed when the user clicks on an opened repo', done => {
vm.$el.querySelector('.js-toggle-repo').click();
Vue.nextTick(() => {
vm.$el.querySelector('.js-toggle-repo').click();
Vue.nextTick(() => {
expect(vm.$el.querySelector('.container-image-tags')).toBe(null);
- expect(vm.$el.querySelector('.container-image-head i').className).toEqual('fa fa-chevron-right');
+ expect(vm.$el.querySelector('.container-image-head i').className).toEqual(
+ 'fa fa-chevron-right',
+ );
done();
});
});
diff --git a/spec/javascripts/registry/components/table_registry_spec.js b/spec/javascripts/registry/components/table_registry_spec.js
index 6aa61afc445..7f5252a7d6c 100644
--- a/spec/javascripts/registry/components/table_registry_spec.js
+++ b/spec/javascripts/registry/components/table_registry_spec.js
@@ -22,13 +22,15 @@ describe('table registry', () => {
});
it('should render a table with the registry list', () => {
- expect(
- vm.$el.querySelectorAll('table tbody tr').length,
- ).toEqual(repoPropsData.list.length);
+ expect(vm.$el.querySelectorAll('table tbody tr').length).toEqual(repoPropsData.list.length);
});
it('should render registry tag', () => {
- const textRendered = vm.$el.querySelector('.table tbody tr').textContent.trim().replace(/\s\s+/g, ' ');
+ const textRendered = vm.$el
+ .querySelector('.table tbody tr')
+ .textContent.trim()
+ .replace(/\s\s+/g, ' ');
+
expect(textRendered).toContain(repoPropsData.list[0].tag);
expect(textRendered).toContain(repoPropsData.list[0].shortRevision);
expect(textRendered).toContain(repoPropsData.list[0].layers);
@@ -36,9 +38,7 @@ describe('table registry', () => {
});
it('should be possible to delete a registry', () => {
- expect(
- vm.$el.querySelector('.table tbody tr .js-delete-registry'),
- ).toBeDefined();
+ expect(vm.$el.querySelector('.table tbody tr .js-delete-registry')).toBeDefined();
});
describe('pagination', () => {
diff --git a/spec/javascripts/registry/getters_spec.js b/spec/javascripts/registry/getters_spec.js
index 3d989541881..839aa718997 100644
--- a/spec/javascripts/registry/getters_spec.js
+++ b/spec/javascripts/registry/getters_spec.js
@@ -7,25 +7,28 @@ describe('Getters Registry Store', () => {
state = {
isLoading: false,
endpoint: '/root/empty-project/container_registry.json',
- repos: [{
- canDelete: true,
- destroyPath: 'bar',
- id: '134',
- isLoading: false,
- list: [],
- location: 'foo',
- name: 'gitlab-org/omnibus-gitlab/foo',
- tagsPath: 'foo',
- }, {
- canDelete: true,
- destroyPath: 'bar',
- id: '123',
- isLoading: false,
- list: [],
- location: 'foo',
- name: 'gitlab-org/omnibus-gitlab',
- tagsPath: 'foo',
- }],
+ repos: [
+ {
+ canDelete: true,
+ destroyPath: 'bar',
+ id: '134',
+ isLoading: false,
+ list: [],
+ location: 'foo',
+ name: 'gitlab-org/omnibus-gitlab/foo',
+ tagsPath: 'foo',
+ },
+ {
+ canDelete: true,
+ destroyPath: 'bar',
+ id: '123',
+ isLoading: false,
+ list: [],
+ location: 'foo',
+ name: 'gitlab-org/omnibus-gitlab',
+ tagsPath: 'foo',
+ },
+ ],
};
});
diff --git a/spec/javascripts/registry/mock_data.js b/spec/javascripts/registry/mock_data.js
index 6bffb47be55..22db203e77f 100644
--- a/spec/javascripts/registry/mock_data.js
+++ b/spec/javascripts/registry/mock_data.js
@@ -40,7 +40,8 @@ export const registryServerResponse = [
layers: 19,
location: 'location',
created_at: 1505828744434,
- }];
+ },
+];
export const parsedReposServerResponse = [
{
diff --git a/spec/javascripts/registry/stores/mutations_spec.js b/spec/javascripts/registry/stores/mutations_spec.js
index 2e4c0659daa..e19fe7a27cf 100644
--- a/spec/javascripts/registry/stores/mutations_spec.js
+++ b/spec/javascripts/registry/stores/mutations_spec.js
@@ -18,6 +18,7 @@ describe('Mutations Registry Store', () => {
it('should set the main endpoint', () => {
const expectedState = Object.assign({}, mockState, { endpoint: 'foo' });
mutations[types.SET_MAIN_ENDPOINT](mockState, 'foo');
+
expect(mockState).toEqual(expectedState);
});
});
@@ -25,6 +26,7 @@ describe('Mutations Registry Store', () => {
describe('SET_REPOS_LIST', () => {
it('should set a parsed repository list', () => {
mutations[types.SET_REPOS_LIST](mockState, reposServerResponse);
+
expect(mockState.repos).toEqual(parsedReposServerResponse);
});
});
@@ -32,6 +34,7 @@ describe('Mutations Registry Store', () => {
describe('TOGGLE_MAIN_LOADING', () => {
it('should set a parsed repository list', () => {
mutations[types.TOGGLE_MAIN_LOADING](mockState);
+
expect(mockState.isLoading).toEqual(true);
});
});
@@ -75,6 +78,7 @@ describe('Mutations Registry Store', () => {
});
mutations[types.TOGGLE_REGISTRY_LIST_LOADING](mockState, mockState.repos[0]);
+
expect(mockState.repos[0].isLoading).toEqual(true);
});
});
diff --git a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
index 333cefe5f8a..69767d9cf1c 100644
--- a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
+++ b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
@@ -42,6 +42,7 @@ describe('Grouped Test Reports App', () => {
expect(vm.$el.textContent).toContain(
'rspec:pg found no changed test results out of 8 total tests',
);
+
expect(vm.$el.textContent).toContain(
'java ant found no changed test results out of 3 total tests',
);
@@ -88,6 +89,7 @@ describe('Grouped Test Reports App', () => {
expect(vm.$el.textContent).toContain(
'rspec:pg found 2 failed test results out of 8 total tests',
);
+
expect(vm.$el.textContent).toContain('New');
expect(vm.$el.textContent).toContain(
'java ant found no changed test results out of 3 total tests',
@@ -115,6 +117,7 @@ describe('Grouped Test Reports App', () => {
expect(vm.$el.textContent).toContain(
'rspec:pg found 1 failed test result and 2 fixed test results out of 8 total tests',
);
+
expect(vm.$el.textContent).toContain('New');
expect(vm.$el.textContent).toContain(
' java ant found 1 failed test result out of 3 total tests',
@@ -148,10 +151,11 @@ describe('Grouped Test Reports App', () => {
it('renders resolved failures', done => {
setTimeout(() => {
- expect(vm.$el.querySelector('.js-mr-code-resolved-issues').textContent).toContain(
+ expect(vm.$el.querySelector('.report-block-container').textContent).toContain(
resolvedFailures.suites[0].resolved_failures[0].name,
);
- expect(vm.$el.querySelector('.js-mr-code-resolved-issues').textContent).toContain(
+
+ expect(vm.$el.querySelector('.report-block-container').textContent).toContain(
resolvedFailures.suites[0].resolved_failures[1].name,
);
done();
diff --git a/spec/javascripts/reports/components/modal_spec.js b/spec/javascripts/reports/components/modal_spec.js
index 3a567c40eca..6b8471381de 100644
--- a/spec/javascripts/reports/components/modal_spec.js
+++ b/spec/javascripts/reports/components/modal_spec.js
@@ -27,12 +27,19 @@ describe('Grouped Test Reports Modal', () => {
});
it('renders code block', () => {
- expect(vm.$el.querySelector('code').textContent).toEqual(modalDataStructure.system_output.value);
+ expect(vm.$el.querySelector('code').textContent).toEqual(
+ modalDataStructure.system_output.value,
+ );
});
it('renders link', () => {
- expect(vm.$el.querySelector('.js-modal-link').getAttribute('href')).toEqual(modalDataStructure.class.value);
- expect(trimText(vm.$el.querySelector('.js-modal-link').textContent)).toEqual(modalDataStructure.class.value);
+ expect(vm.$el.querySelector('.js-modal-link').getAttribute('href')).toEqual(
+ modalDataStructure.class.value,
+ );
+
+ expect(trimText(vm.$el.querySelector('.js-modal-link').textContent)).toEqual(
+ modalDataStructure.class.value,
+ );
});
it('renders miliseconds', () => {
@@ -40,6 +47,8 @@ describe('Grouped Test Reports Modal', () => {
});
it('render title', () => {
- expect(trimText(vm.$el.querySelector('.modal-title').textContent)).toEqual('Test#sum when a is 1 and b is 2 returns summary');
+ expect(trimText(vm.$el.querySelector('.modal-title').textContent)).toEqual(
+ 'Test#sum when a is 1 and b is 2 returns summary',
+ );
});
});
diff --git a/spec/javascripts/reports/components/report_link_spec.js b/spec/javascripts/reports/components/report_link_spec.js
index cd6911e2f59..f879899e9c5 100644
--- a/spec/javascripts/reports/components/report_link_spec.js
+++ b/spec/javascripts/reports/components/report_link_spec.js
@@ -45,8 +45,7 @@ describe('report link', () => {
vm = mountComponent(Component, {
issue: {
path: 'Gemfile.lock',
- urlPath:
- 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
+ urlPath: 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
line: 22,
},
});
@@ -60,8 +59,7 @@ describe('report link', () => {
vm = mountComponent(Component, {
issue: {
path: 'Gemfile.lock',
- urlPath:
- 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
+ urlPath: 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
},
});
diff --git a/spec/javascripts/reports/components/report_section_spec.js b/spec/javascripts/reports/components/report_section_spec.js
index 6f6eb161d14..b02af8baaec 100644
--- a/spec/javascripts/reports/components/report_section_spec.js
+++ b/spec/javascripts/reports/components/report_section_spec.js
@@ -86,6 +86,7 @@ describe('Report section', () => {
});
});
});
+
describe('when it is loading', () => {
it('should render loading indicator', () => {
vm = mountComponent(ReportSection, {
@@ -96,6 +97,7 @@ describe('Report section', () => {
successText: 'Code quality improved on 1 point and degraded on 1 point',
hasIssues: false,
});
+
expect(vm.$el.textContent.trim()).toEqual('Loading codeclimate report');
});
});
@@ -118,7 +120,7 @@ describe('Report section', () => {
'Code quality improved on 1 point and degraded on 1 point',
);
- expect(vm.$el.querySelectorAll('.js-mr-code-resolved-issues li').length).toEqual(
+ expect(vm.$el.querySelectorAll('.report-block-container li').length).toEqual(
resolvedIssues.length,
);
});
@@ -168,6 +170,7 @@ describe('Report section', () => {
successText: 'Code quality improved on 1 point and degraded on 1 point',
hasIssues: false,
});
+
expect(vm.$el.textContent.trim()).toEqual('Failed to load codeclimate report');
});
});
diff --git a/spec/javascripts/reports/components/test_issue_body_spec.js b/spec/javascripts/reports/components/test_issue_body_spec.js
index 0ea81f714e7..32baf904ad7 100644
--- a/spec/javascripts/reports/components/test_issue_body_spec.js
+++ b/spec/javascripts/reports/components/test_issue_body_spec.js
@@ -29,6 +29,7 @@ describe('Test Issue body', () => {
spyOn(vm, 'openModal');
vm.$el.querySelector('button').click();
+
expect(vm.openModal).toHaveBeenCalledWith({
issue: commonProps.issue,
});
diff --git a/spec/javascripts/reports/store/mutations_spec.js b/spec/javascripts/reports/store/mutations_spec.js
index 7d19b16efb9..9446cd454ab 100644
--- a/spec/javascripts/reports/store/mutations_spec.js
+++ b/spec/javascripts/reports/store/mutations_spec.js
@@ -13,6 +13,7 @@ describe('Reports Store Mutations', () => {
describe('SET_ENDPOINT', () => {
it('should set endpoint', () => {
mutations[types.SET_ENDPOINT](stateCopy, 'endpoint.json');
+
expect(stateCopy.endpoint).toEqual('endpoint.json');
});
});
@@ -20,6 +21,7 @@ describe('Reports Store Mutations', () => {
describe('REQUEST_REPORTS', () => {
it('should set isLoading to true', () => {
mutations[types.REQUEST_REPORTS](stateCopy);
+
expect(stateCopy.isLoading).toEqual(true);
});
});
diff --git a/spec/javascripts/right_sidebar_spec.js b/spec/javascripts/right_sidebar_spec.js
index 6d49536a712..992e17978c1 100644
--- a/spec/javascripts/right_sidebar_spec.js
+++ b/spec/javascripts/right_sidebar_spec.js
@@ -1,124 +1,87 @@
-/* eslint-disable no-var, one-var, one-var-declaration-per-line, no-return-assign, vars-on-top, max-len */
-
import $ from 'jquery';
import MockAdapter from 'axios-mock-adapter';
import '~/commons/bootstrap';
import axios from '~/lib/utils/axios_utils';
import Sidebar from '~/right_sidebar';
-(function() {
- var $aside, $icon, $labelsIcon, $page, $toggle, assertSidebarState;
-
- $aside = null;
-
- $toggle = null;
-
- $icon = null;
-
- $page = null;
-
- $labelsIcon = null;
-
- assertSidebarState = function(state) {
- var shouldBeCollapsed, shouldBeExpanded;
- shouldBeExpanded = state === 'expanded';
- shouldBeCollapsed = state === 'collapsed';
- expect($aside.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
- expect($page.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
- expect($icon.hasClass('fa-angle-double-right')).toBe(shouldBeExpanded);
- expect($aside.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
- expect($page.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
- return expect($icon.hasClass('fa-angle-double-left')).toBe(shouldBeCollapsed);
- };
-
- describe('RightSidebar', function() {
- describe('fixture tests', () => {
- var fixtureName = 'issues/open-issue.html.raw';
- preloadFixtures(fixtureName);
- loadJSONFixtures('todos/todos.json');
- let mock;
-
- beforeEach(function() {
- loadFixtures(fixtureName);
- mock = new MockAdapter(axios);
- new Sidebar(); // eslint-disable-line no-new
- $aside = $('.right-sidebar');
- $page = $('.layout-page');
- $icon = $aside.find('i');
- $toggle = $aside.find('.js-sidebar-toggle');
- return $labelsIcon = $aside.find('.sidebar-collapsed-icon');
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('should expand/collapse the sidebar when arrow is clicked', function() {
- assertSidebarState('expanded');
- $toggle.click();
- assertSidebarState('collapsed');
- $toggle.click();
- assertSidebarState('expanded');
- });
- it('should float over the page and when sidebar icons clicked', function() {
- $labelsIcon.click();
- return assertSidebarState('expanded');
- });
- it('should collapse when the icon arrow clicked while it is floating on page', function() {
- $labelsIcon.click();
- assertSidebarState('expanded');
- $toggle.click();
- return assertSidebarState('collapsed');
- });
-
- it('should broadcast todo:toggle event when add todo clicked', function(done) {
- var todos = getJSONFixture('todos/todos.json');
- mock.onPost(/(.*)\/todos$/).reply(200, todos);
-
- var todoToggleSpy = spyOnEvent(document, 'todo:toggle');
-
- $('.issuable-sidebar-header .js-issuable-todo').click();
+let $aside = null;
+let $toggle = null;
+let $icon = null;
+let $page = null;
+let $labelsIcon = null;
+
+const assertSidebarState = function(state) {
+ const shouldBeExpanded = state === 'expanded';
+ const shouldBeCollapsed = state === 'collapsed';
+ expect($aside.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
+ expect($page.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
+ expect($icon.hasClass('fa-angle-double-right')).toBe(shouldBeExpanded);
+ expect($aside.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
+ expect($page.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
+ expect($icon.hasClass('fa-angle-double-left')).toBe(shouldBeCollapsed);
+};
+
+describe('RightSidebar', function() {
+ describe('fixture tests', () => {
+ const fixtureName = 'issues/open-issue.html.raw';
+ preloadFixtures(fixtureName);
+ loadJSONFixtures('todos/todos.json');
+ let mock;
+
+ beforeEach(function() {
+ loadFixtures(fixtureName);
+ mock = new MockAdapter(axios);
+ new Sidebar(); // eslint-disable-line no-new
+ $aside = $('.right-sidebar');
+ $page = $('.layout-page');
+ $icon = $aside.find('i');
+ $toggle = $aside.find('.js-sidebar-toggle');
+ $labelsIcon = $aside.find('.sidebar-collapsed-icon');
+ });
- setTimeout(() => {
- expect(todoToggleSpy.calls.count()).toEqual(1);
+ afterEach(() => {
+ mock.restore();
+ });
- done();
- });
- });
+ it('should expand/collapse the sidebar when arrow is clicked', function() {
+ assertSidebarState('expanded');
+ $toggle.click();
+ assertSidebarState('collapsed');
+ $toggle.click();
+ assertSidebarState('expanded');
+ });
- it('should not hide collapsed icons', () => {
- [].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), (el) => {
- expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy();
- });
- });
+ it('should float over the page and when sidebar icons clicked', function() {
+ $labelsIcon.click();
+ assertSidebarState('expanded');
});
- describe('sidebarToggleClicked', () => {
- const event = jasmine.createSpyObj('event', ['preventDefault']);
+ it('should collapse when the icon arrow clicked while it is floating on page', function() {
+ $labelsIcon.click();
+ assertSidebarState('expanded');
+ $toggle.click();
+ assertSidebarState('collapsed');
+ });
- beforeEach(() => {
- spyOn($.fn, 'hasClass').and.returnValue(false);
- });
+ it('should broadcast todo:toggle event when add todo clicked', function(done) {
+ const todos = getJSONFixture('todos/todos.json');
+ mock.onPost(/(.*)\/todos$/).reply(200, todos);
- afterEach(() => {
- gl.lazyLoader = undefined;
- });
+ const todoToggleSpy = spyOnEvent(document, 'todo:toggle');
- it('calls loadCheck if lazyLoader is set', () => {
- gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']);
+ $('.issuable-sidebar-header .js-issuable-todo').click();
- Sidebar.prototype.sidebarToggleClicked(event);
+ setTimeout(() => {
+ expect(todoToggleSpy.calls.count()).toEqual(1);
- expect(gl.lazyLoader.loadCheck).toHaveBeenCalled();
+ done();
});
+ });
- it('does not throw if lazyLoader is not defined', () => {
- gl.lazyLoader = undefined;
-
- const toggle = Sidebar.prototype.sidebarToggleClicked.bind(null, event);
-
- expect(toggle).not.toThrow();
+ it('should not hide collapsed icons', () => {
+ [].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), el => {
+ expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy();
});
});
});
-}).call(window);
+});
diff --git a/spec/javascripts/search_autocomplete_spec.js b/spec/javascripts/search_autocomplete_spec.js
index 86c001678c5..7a4ca587313 100644
--- a/spec/javascripts/search_autocomplete_spec.js
+++ b/spec/javascripts/search_autocomplete_spec.js
@@ -1,8 +1,8 @@
-/* eslint-disable max-len, no-var, one-var, one-var-declaration-per-line, no-unused-expressions, consistent-return, no-param-reassign, default-case, no-return-assign, object-shorthand, prefer-template, vars-on-top, max-len */
+/* eslint-disable no-var, one-var, no-unused-expressions, consistent-return, no-param-reassign, default-case, no-return-assign, object-shorthand, vars-on-top */
import $ from 'jquery';
import '~/gl_dropdown';
-import SearchAutocomplete from '~/search_autocomplete';
+import initSearchAutocomplete from '~/search_autocomplete';
import '~/lib/utils/common_utils';
describe('Search autocomplete dropdown', () => {
@@ -109,15 +109,17 @@ describe('Search autocomplete dropdown', () => {
assertLinks = function(list, issuesPath, mrsPath) {
if (issuesPath) {
- const issuesAssignedToMeLink = `a[href="${issuesPath}/?assignee_id=${userId}"]`;
- const issuesIHaveCreatedLink = `a[href="${issuesPath}/?author_id=${userId}"]`;
+ const issuesAssignedToMeLink = `a[href="${issuesPath}/?assignee_username=${userName}"]`;
+ const issuesIHaveCreatedLink = `a[href="${issuesPath}/?author_username=${userName}"]`;
+
expect(list.find(issuesAssignedToMeLink).length).toBe(1);
expect(list.find(issuesAssignedToMeLink).text()).toBe('Issues assigned to me');
expect(list.find(issuesIHaveCreatedLink).length).toBe(1);
expect(list.find(issuesIHaveCreatedLink).text()).toBe("Issues I've created");
}
- const mrsAssignedToMeLink = `a[href="${mrsPath}/?assignee_id=${userId}"]`;
- const mrsIHaveCreatedLink = `a[href="${mrsPath}/?author_id=${userId}"]`;
+ const mrsAssignedToMeLink = `a[href="${mrsPath}/?assignee_username=${userName}"]`;
+ const mrsIHaveCreatedLink = `a[href="${mrsPath}/?author_username=${userName}"]`;
+
expect(list.find(mrsAssignedToMeLink).length).toBe(1);
expect(list.find(mrsAssignedToMeLink).text()).toBe('Merge requests assigned to me');
expect(list.find(mrsIHaveCreatedLink).length).toBe(1);
@@ -132,7 +134,7 @@ describe('Search autocomplete dropdown', () => {
window.gon.current_user_id = userId;
window.gon.current_username = userName;
- return (widget = new SearchAutocomplete());
+ return (widget = initSearchAutocomplete());
});
afterEach(function() {
@@ -140,6 +142,7 @@ describe('Search autocomplete dropdown', () => {
removeBodyAttributes();
window.gon = {};
});
+
it('should show Dashboard specific dropdown menu', function() {
var list;
addBodyAttributes();
@@ -148,6 +151,7 @@ describe('Search autocomplete dropdown', () => {
list = widget.wrap.find('.dropdown-menu').find('ul');
return assertLinks(list, dashboardIssuesPath, dashboardMRsPath);
});
+
it('should show Group specific dropdown menu', function() {
var list;
addBodyAttributes('group');
@@ -156,6 +160,7 @@ describe('Search autocomplete dropdown', () => {
list = widget.wrap.find('.dropdown-menu').find('ul');
return assertLinks(list, groupIssuesPath, groupMRsPath);
});
+
it('should show Project specific dropdown menu', function() {
var list;
addBodyAttributes('project');
@@ -164,6 +169,7 @@ describe('Search autocomplete dropdown', () => {
list = widget.wrap.find('.dropdown-menu').find('ul');
return assertLinks(list, projectIssuesPath, projectMRsPath);
});
+
it('should show only Project mergeRequest dropdown menu items when project issues are disabled', function() {
addBodyAttributes('project');
disableProjectIssues();
@@ -172,6 +178,7 @@ describe('Search autocomplete dropdown', () => {
const list = widget.wrap.find('.dropdown-menu').find('ul');
assertLinks(list, null, projectMRsPath);
});
+
it('should not show category related menu if there is text in the input', function() {
var link, list;
addBodyAttributes('project');
@@ -179,9 +186,11 @@ describe('Search autocomplete dropdown', () => {
widget.searchInput.val('help');
widget.searchInput.triggerHandler('focus');
list = widget.wrap.find('.dropdown-menu').find('ul');
- link = "a[href='" + projectIssuesPath + '/?assignee_id=' + userId + "']";
- return expect(list.find(link).length).toBe(0);
+ link = `a[href='${projectIssuesPath}/?assignee_username=${userName}']`;
+
+ expect(list.find(link).length).toBe(0);
});
+
it('should not submit the search form when selecting an autocomplete row with the keyboard', function() {
var ENTER = 13;
var DOWN = 40;
diff --git a/spec/javascripts/search_spec.js b/spec/javascripts/search_spec.js
index 522851c584b..40bdbac7451 100644
--- a/spec/javascripts/search_spec.js
+++ b/spec/javascripts/search_spec.js
@@ -5,7 +5,7 @@ import Search from '~/pages/search/show/search';
describe('Search', () => {
const fixturePath = 'search/show.html.raw';
const searchTerm = 'some search';
- const fillDropdownInput = (dropdownSelector) => {
+ const fillDropdownInput = dropdownSelector => {
const dropdownElement = document.querySelector(dropdownSelector).parentNode;
const inputElement = dropdownElement.querySelector('.dropdown-input-field');
inputElement.value = searchTerm;
@@ -19,8 +19,8 @@ describe('Search', () => {
new Search(); // eslint-disable-line no-new
});
- it('requests groups from backend when filtering', (done) => {
- spyOn(Api, 'groups').and.callFake((term) => {
+ it('requests groups from backend when filtering', done => {
+ spyOn(Api, 'groups').and.callFake(term => {
expect(term).toBe(searchTerm);
done();
});
@@ -29,8 +29,8 @@ describe('Search', () => {
$(inputElement).trigger('input');
});
- it('requests projects from backend when filtering', (done) => {
- spyOn(Api, 'projects').and.callFake((term) => {
+ it('requests projects from backend when filtering', done => {
+ spyOn(Api, 'projects').and.callFake(term => {
expect(term).toBe(searchTerm);
done();
});
diff --git a/spec/javascripts/settings_panels_spec.js b/spec/javascripts/settings_panels_spec.js
index c1a69bd7018..3b681a9ff28 100644
--- a/spec/javascripts/settings_panels_spec.js
+++ b/spec/javascripts/settings_panels_spec.js
@@ -1,10 +1,11 @@
+import $ from 'jquery';
import initSettingsPanels from '~/settings_panels';
describe('Settings Panels', () => {
- preloadFixtures('projects/ci_cd_settings.html.raw');
+ preloadFixtures('groups/edit.html.raw');
beforeEach(() => {
- loadFixtures('projects/ci_cd_settings.html.raw');
+ loadFixtures('groups/edit.html.raw');
});
describe('initSettingsPane', () => {
@@ -13,17 +14,32 @@ describe('Settings Panels', () => {
});
it('should expand linked hash fragment panel', () => {
- window.location.hash = '#autodevops-settings';
+ window.location.hash = '#js-general-settings';
- const pipelineSettingsPanel = document.querySelector('#autodevops-settings');
+ const panel = document.querySelector('#js-general-settings');
// Our test environment automatically expands everything so we need to clear that out first
- pipelineSettingsPanel.classList.remove('expanded');
+ panel.classList.remove('expanded');
- expect(pipelineSettingsPanel.classList.contains('expanded')).toBe(false);
+ expect(panel.classList.contains('expanded')).toBe(false);
initSettingsPanels();
- expect(pipelineSettingsPanel.classList.contains('expanded')).toBe(true);
+ expect(panel.classList.contains('expanded')).toBe(true);
});
});
+
+ it('does not change the text content of triggers', () => {
+ const panel = document.querySelector('#js-general-settings');
+ const trigger = panel.querySelector('.js-settings-toggle-trigger-only');
+ const originalText = trigger.textContent;
+
+ initSettingsPanels();
+
+ expect(panel.classList.contains('expanded')).toBe(true);
+
+ $(trigger).click();
+
+ expect(panel.classList.contains('expanded')).toBe(false);
+ expect(trigger.textContent).toEqual(originalText);
+ });
});
diff --git a/spec/javascripts/shared/popover_spec.js b/spec/javascripts/shared/popover_spec.js
index 1d574c9424b..85bde075b77 100644
--- a/spec/javascripts/shared/popover_spec.js
+++ b/spec/javascripts/shared/popover_spec.js
@@ -1,9 +1,5 @@
import $ from 'jquery';
-import {
- togglePopover,
- mouseleave,
- mouseenter,
-} from '~/shared/popover';
+import { togglePopover, mouseleave, mouseenter } from '~/shared/popover';
describe('popover', () => {
describe('togglePopover', () => {
@@ -26,14 +22,14 @@ describe('popover', () => {
expect(togglePopover.call(context, true)).toEqual(false);
});
- it('shows popover', (done) => {
+ it('shows popover', done => {
const context = {
hasClass: () => false,
popover: () => {},
toggleClass: () => {},
};
- spyOn(context, 'popover').and.callFake((method) => {
+ spyOn(context, 'popover').and.callFake(method => {
expect(method).toEqual('show');
done();
});
@@ -41,7 +37,7 @@ describe('popover', () => {
togglePopover.call(context, true);
});
- it('adds disable-animation and js-popover-show class', (done) => {
+ it('adds disable-animation and js-popover-show class', done => {
const context = {
hasClass: () => false,
popover: () => {},
@@ -77,14 +73,14 @@ describe('popover', () => {
expect(togglePopover.call(context, false)).toEqual(false);
});
- it('hides popover', (done) => {
+ it('hides popover', done => {
const context = {
hasClass: () => true,
popover: () => {},
toggleClass: () => {},
};
- spyOn(context, 'popover').and.callFake((method) => {
+ spyOn(context, 'popover').and.callFake(method => {
expect(method).toEqual('hide');
done();
});
@@ -92,7 +88,7 @@ describe('popover', () => {
togglePopover.call(context, false);
});
- it('removes disable-animation and js-popover-show class', (done) => {
+ it('removes disable-animation and js-popover-show class', done => {
const context = {
hasClass: () => true,
popover: () => {},
@@ -116,9 +112,12 @@ describe('popover', () => {
length: 0,
};
- spyOn($.fn, 'init').and.callFake(selector => (selector === '.popover:hover' ? fakeJquery : $.fn));
+ spyOn($.fn, 'init').and.callFake(
+ selector => (selector === '.popover:hover' ? fakeJquery : $.fn),
+ );
spyOn(togglePopover, 'call');
mouseleave();
+
expect(togglePopover.call).toHaveBeenCalledWith(jasmine.any(Object), false);
});
@@ -127,9 +126,12 @@ describe('popover', () => {
length: 1,
};
- spyOn($.fn, 'init').and.callFake(selector => (selector === '.popover:hover' ? fakeJquery : $.fn));
+ spyOn($.fn, 'init').and.callFake(
+ selector => (selector === '.popover:hover' ? fakeJquery : $.fn),
+ );
spyOn(togglePopover, 'call');
mouseleave();
+
expect(togglePopover.call).not.toHaveBeenCalledWith(false);
});
});
@@ -140,12 +142,13 @@ describe('popover', () => {
it('shows popover', () => {
spyOn(togglePopover, 'call').and.returnValue(false);
mouseenter.call(context);
+
expect(togglePopover.call).toHaveBeenCalledWith(jasmine.any(Object), true);
});
- it('registers mouseleave event if popover is showed', (done) => {
+ it('registers mouseleave event if popover is showed', done => {
spyOn(togglePopover, 'call').and.returnValue(true);
- spyOn($.fn, 'on').and.callFake((eventName) => {
+ spyOn($.fn, 'on').and.callFake(eventName => {
expect(eventName).toEqual('mouseleave');
done();
});
@@ -156,6 +159,7 @@ describe('popover', () => {
spyOn(togglePopover, 'call').and.returnValue(false);
const spy = spyOn($.fn, 'on').and.callFake(() => {});
mouseenter.call(context);
+
expect(spy).not.toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/shortcuts_spec.js b/spec/javascripts/shortcuts_spec.js
index 94cded7ee37..3ca6ecaa938 100644
--- a/spec/javascripts/shortcuts_spec.js
+++ b/spec/javascripts/shortcuts_spec.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import Shortcuts from '~/shortcuts';
+import Shortcuts from '~/behaviors/shortcuts/shortcuts';
describe('Shortcuts', () => {
const fixtureName = 'snippets/show.html.raw';
diff --git a/spec/javascripts/sidebar/assignees_spec.js b/spec/javascripts/sidebar/assignees_spec.js
index 843e7002180..eced4925489 100644
--- a/spec/javascripts/sidebar/assignees_spec.js
+++ b/spec/javascripts/sidebar/assignees_spec.js
@@ -22,6 +22,7 @@ describe('Assignee component', () => {
}).$mount();
const collapsed = component.$el.querySelector('.sidebar-collapsed-icon');
+
expect(collapsed.childElementCount).toEqual(1);
expect(collapsed.children[0].getAttribute('aria-label')).toEqual('No Assignee');
expect(collapsed.children[0].classList.contains('fa')).toEqual(true);
@@ -67,6 +68,7 @@ describe('Assignee component', () => {
spyOn(component, '$emit');
component.$el.querySelector('.assign-yourself .btn-link').click();
+
expect(component.$emit).toHaveBeenCalledWith('assign-self');
});
});
@@ -76,18 +78,20 @@ describe('Assignee component', () => {
component = new AssigneeComponent({
propsData: {
rootPath: 'http://localhost:3000',
- users: [
- UsersMock.user,
- ],
+ users: [UsersMock.user],
editable: false,
},
}).$mount();
const collapsed = component.$el.querySelector('.sidebar-collapsed-icon');
const assignee = collapsed.children[0];
+
expect(collapsed.childElementCount).toEqual(1);
expect(assignee.querySelector('.avatar').getAttribute('src')).toEqual(UsersMock.user.avatar);
- expect(assignee.querySelector('.avatar').getAttribute('alt')).toEqual(`${UsersMock.user.name}'s avatar`);
+ expect(assignee.querySelector('.avatar').getAttribute('alt')).toEqual(
+ `${UsersMock.user.name}'s avatar`,
+ );
+
expect(assignee.querySelector('.author').innerText.trim()).toEqual(UsersMock.user.name);
});
@@ -95,34 +99,38 @@ describe('Assignee component', () => {
component = new AssigneeComponent({
propsData: {
rootPath: 'http://localhost:3000/',
- users: [
- UsersMock.user,
- ],
+ users: [UsersMock.user],
editable: true,
},
}).$mount();
expect(component.$el.querySelector('.author-link')).not.toBeNull();
// The image
- expect(component.$el.querySelector('.author-link img').getAttribute('src')).toEqual(UsersMock.user.avatar);
+ expect(component.$el.querySelector('.author-link img').getAttribute('src')).toEqual(
+ UsersMock.user.avatar,
+ );
// Author name
- expect(component.$el.querySelector('.author-link .author').innerText.trim()).toEqual(UsersMock.user.name);
+ expect(component.$el.querySelector('.author-link .author').innerText.trim()).toEqual(
+ UsersMock.user.name,
+ );
// Username
- expect(component.$el.querySelector('.author-link .username').innerText.trim()).toEqual(`@${UsersMock.user.username}`);
+ expect(component.$el.querySelector('.author-link .username').innerText.trim()).toEqual(
+ `@${UsersMock.user.username}`,
+ );
});
it('has the root url present in the assigneeUrl method', () => {
component = new AssigneeComponent({
propsData: {
rootPath: 'http://localhost:3000/',
- users: [
- UsersMock.user,
- ],
+ users: [UsersMock.user],
editable: true,
},
}).$mount();
- expect(component.assigneeUrl(UsersMock.user).indexOf('http://localhost:3000/')).not.toEqual(-1);
+ expect(component.assigneeUrl(UsersMock.user).indexOf('http://localhost:3000/')).not.toEqual(
+ -1,
+ );
});
});
@@ -138,16 +146,25 @@ describe('Assignee component', () => {
}).$mount();
const collapsed = component.$el.querySelector('.sidebar-collapsed-icon');
+
expect(collapsed.childElementCount).toEqual(2);
const first = collapsed.children[0];
+
expect(first.querySelector('.avatar').getAttribute('src')).toEqual(users[0].avatar);
- expect(first.querySelector('.avatar').getAttribute('alt')).toEqual(`${users[0].name}'s avatar`);
+ expect(first.querySelector('.avatar').getAttribute('alt')).toEqual(
+ `${users[0].name}'s avatar`,
+ );
+
expect(first.querySelector('.author').innerText.trim()).toEqual(users[0].name);
const second = collapsed.children[1];
+
expect(second.querySelector('.avatar').getAttribute('src')).toEqual(users[1].avatar);
- expect(second.querySelector('.avatar').getAttribute('alt')).toEqual(`${users[1].name}'s avatar`);
+ expect(second.querySelector('.avatar').getAttribute('alt')).toEqual(
+ `${users[1].name}'s avatar`,
+ );
+
expect(second.querySelector('.author').innerText.trim()).toEqual(users[1].name);
});
@@ -162,14 +179,20 @@ describe('Assignee component', () => {
}).$mount();
const collapsed = component.$el.querySelector('.sidebar-collapsed-icon');
+
expect(collapsed.childElementCount).toEqual(2);
const first = collapsed.children[0];
+
expect(first.querySelector('.avatar').getAttribute('src')).toEqual(users[0].avatar);
- expect(first.querySelector('.avatar').getAttribute('alt')).toEqual(`${users[0].name}'s avatar`);
+ expect(first.querySelector('.avatar').getAttribute('alt')).toEqual(
+ `${users[0].name}'s avatar`,
+ );
+
expect(first.querySelector('.author').innerText.trim()).toEqual(users[0].name);
const second = collapsed.children[1];
+
expect(second.querySelector('.avatar-counter').innerText.trim()).toEqual('+2');
});
@@ -187,7 +210,7 @@ describe('Assignee component', () => {
expect(component.$el.querySelector('.user-list-more')).toBe(null);
});
- it('Shows the "show-less" assignees label', (done) => {
+ it('Shows the "show-less" assignees label', done => {
const users = UsersMockHelper.createNumberRandomUsers(6);
component = new AssigneeComponent({
propsData: {
@@ -197,20 +220,26 @@ describe('Assignee component', () => {
},
}).$mount();
- expect(component.$el.querySelectorAll('.user-item').length).toEqual(component.defaultRenderCount);
+ expect(component.$el.querySelectorAll('.user-item').length).toEqual(
+ component.defaultRenderCount,
+ );
+
expect(component.$el.querySelector('.user-list-more')).not.toBe(null);
const usersLabelExpectation = users.length - component.defaultRenderCount;
- expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim())
- .not.toBe(`+${usersLabelExpectation} more`);
+
+ expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim()).not.toBe(
+ `+${usersLabelExpectation} more`,
+ );
component.toggleShowLess();
Vue.nextTick(() => {
- expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim())
- .toBe('- show less');
+ expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim()).toBe(
+ '- show less',
+ );
done();
});
});
- it('Shows the "show-less" when "n+ more " label is clicked', (done) => {
+ it('Shows the "show-less" when "n+ more " label is clicked', done => {
const users = UsersMockHelper.createNumberRandomUsers(6);
component = new AssigneeComponent({
propsData: {
@@ -222,8 +251,9 @@ describe('Assignee component', () => {
component.$el.querySelector('.user-list-more .btn-link').click();
Vue.nextTick(() => {
- expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim())
- .toBe('- show less');
+ expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim()).toBe(
+ '- show less',
+ );
done();
});
});
@@ -254,16 +284,18 @@ describe('Assignee component', () => {
});
it('shows "+1 more" label', () => {
- expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim())
- .toBe('+ 1 more');
+ expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim()).toBe(
+ '+ 1 more',
+ );
});
- it('shows "show less" label', (done) => {
+ it('shows "show less" label', done => {
component.toggleShowLess();
Vue.nextTick(() => {
- expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim())
- .toBe('- show less');
+ expect(component.$el.querySelector('.user-list-more .btn-link').innerText.trim()).toBe(
+ '- show less',
+ );
done();
});
});
diff --git a/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js b/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
index 9dff52a9d49..4c3dd713589 100644
--- a/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
+++ b/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
@@ -8,7 +8,12 @@ describe('Issuable Time Tracker', () => {
let initialData;
let vm;
- const initTimeTrackingComponent = opts => {
+ const initTimeTrackingComponent = ({
+ timeEstimate,
+ timeSpent,
+ timeEstimateHumanReadable,
+ timeSpentHumanReadable,
+ }) => {
setFixtures(`
<div>
<div id="mock-container"></div>
@@ -16,10 +21,10 @@ describe('Issuable Time Tracker', () => {
`);
initialData = {
- time_estimate: opts.timeEstimate,
- time_spent: opts.timeSpent,
- human_time_estimate: opts.timeEstimateHumanReadable,
- human_time_spent: opts.timeSpentHumanReadable,
+ timeEstimate,
+ timeSpent,
+ humanTimeEstimate: timeEstimateHumanReadable,
+ humanTimeSpent: timeSpentHumanReadable,
rootPath: '/',
};
@@ -43,8 +48,8 @@ describe('Issuable Time Tracker', () => {
describe('Initialization', () => {
beforeEach(() => {
initTimeTrackingComponent({
- timeEstimate: 100000,
- timeSpent: 5000,
+ timeEstimate: 10000, // 2h 46m
+ timeSpent: 5000, // 1h 23m
timeEstimateHumanReadable: '2h 46m',
timeSpentHumanReadable: '1h 23m',
});
@@ -56,14 +61,14 @@ describe('Issuable Time Tracker', () => {
it('should correctly set timeEstimate', done => {
Vue.nextTick(() => {
- expect(vm.timeEstimate).toBe(initialData.time_estimate);
+ expect(vm.timeEstimate).toBe(initialData.timeEstimate);
done();
});
});
it('should correctly set time_spent', done => {
Vue.nextTick(() => {
- expect(vm.timeSpent).toBe(initialData.time_spent);
+ expect(vm.timeSpent).toBe(initialData.timeSpent);
done();
});
});
@@ -74,8 +79,8 @@ describe('Issuable Time Tracker', () => {
describe('Comparison pane', () => {
beforeEach(() => {
initTimeTrackingComponent({
- timeEstimate: 100000,
- timeSpent: 5000,
+ timeEstimate: 100000, // 1d 3h
+ timeSpent: 5000, // 1h 23m
timeEstimateHumanReadable: '',
timeSpentHumanReadable: '',
});
@@ -85,6 +90,7 @@ describe('Issuable Time Tracker', () => {
Vue.nextTick(() => {
expect(vm.showComparisonState).toBe(true);
const $comparisonPane = vm.$el.querySelector('.time-tracking-comparison-pane');
+
expect($comparisonPane).toBeVisible();
done();
});
@@ -93,23 +99,29 @@ describe('Issuable Time Tracker', () => {
describe('Remaining meter', () => {
it('should display the remaining meter with the correct width', done => {
Vue.nextTick(() => {
- expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[value="5"]')).not.toBeNull();
+ expect(
+ vm.$el.querySelector('.time-tracking-comparison-pane .progress[value="5"]'),
+ ).not.toBeNull();
done();
});
});
it('should display the remaining meter with the correct background color when within estimate', done => {
Vue.nextTick(() => {
- expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="primary"]')).not.toBeNull();
+ expect(
+ vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="primary"]'),
+ ).not.toBeNull();
done();
});
});
it('should display the remaining meter with the correct background color when over estimate', done => {
- vm.time_estimate = 100000;
- vm.time_spent = 20000000;
+ vm.timeEstimate = 10000; // 2h 46m
+ vm.timeSpent = 20000000; // 231 days
Vue.nextTick(() => {
- expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="danger"]')).not.toBeNull();
+ expect(
+ vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="danger"]'),
+ ).not.toBeNull();
done();
});
});
@@ -119,7 +131,7 @@ describe('Issuable Time Tracker', () => {
describe('Estimate only pane', () => {
beforeEach(() => {
initTimeTrackingComponent({
- timeEstimate: 100000,
+ timeEstimate: 10000, // 2h 46m
timeSpent: 0,
timeEstimateHumanReadable: '2h 46m',
timeSpentHumanReadable: '',
@@ -142,7 +154,7 @@ describe('Issuable Time Tracker', () => {
beforeEach(() => {
initTimeTrackingComponent({
timeEstimate: 0,
- timeSpent: 5000,
+ timeSpent: 5000, // 1h 23m
timeEstimateHumanReadable: '2h 46m',
timeSpentHumanReadable: '1h 23m',
});
diff --git a/spec/javascripts/sidebar/confidential_edit_buttons_spec.js b/spec/javascripts/sidebar/confidential_edit_buttons_spec.js
index 482be466aad..32da9f83112 100644
--- a/spec/javascripts/sidebar/confidential_edit_buttons_spec.js
+++ b/spec/javascripts/sidebar/confidential_edit_buttons_spec.js
@@ -7,8 +7,8 @@ describe('Edit Form Buttons', () => {
beforeEach(() => {
const Component = Vue.extend(editFormButtons);
- const toggleForm = () => { };
- const updateConfidentialAttribute = () => { };
+ const toggleForm = () => {};
+ const updateConfidentialAttribute = () => {};
vm1 = new Component({
propsData: {
@@ -28,12 +28,8 @@ describe('Edit Form Buttons', () => {
});
it('renders on or off text based on confidentiality', () => {
- expect(
- vm1.$el.innerHTML.includes('Turn Off'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Turn Off')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('Turn On'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('Turn On')).toBe(true);
});
});
diff --git a/spec/javascripts/sidebar/confidential_edit_form_buttons_spec.js b/spec/javascripts/sidebar/confidential_edit_form_buttons_spec.js
index 724f5126945..369088cb258 100644
--- a/spec/javascripts/sidebar/confidential_edit_form_buttons_spec.js
+++ b/spec/javascripts/sidebar/confidential_edit_form_buttons_spec.js
@@ -7,8 +7,8 @@ describe('Edit Form Dropdown', () => {
beforeEach(() => {
const Component = Vue.extend(editForm);
- const toggleForm = () => { };
- const updateConfidentialAttribute = () => { };
+ const toggleForm = () => {};
+ const updateConfidentialAttribute = () => {};
vm1 = new Component({
propsData: {
@@ -28,12 +28,8 @@ describe('Edit Form Dropdown', () => {
});
it('renders on the appropriate warning text', () => {
- expect(
- vm1.$el.innerHTML.includes('You are going to turn off the confidentiality.'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('You are going to turn off the confidentiality.')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('You are going to turn on the confidentiality.'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('You are going to turn on the confidentiality.')).toBe(true);
});
});
diff --git a/spec/javascripts/sidebar/confidential_issue_sidebar_spec.js b/spec/javascripts/sidebar/confidential_issue_sidebar_spec.js
index 6110d5d89ac..486a7241e33 100644
--- a/spec/javascripts/sidebar/confidential_issue_sidebar_spec.js
+++ b/spec/javascripts/sidebar/confidential_issue_sidebar_spec.js
@@ -29,20 +29,14 @@ describe('Confidential Issue Sidebar Block', () => {
});
it('shows if confidential and/or editable', () => {
- expect(
- vm1.$el.innerHTML.includes('Edit'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Edit')).toBe(true);
- expect(
- vm1.$el.innerHTML.includes('This issue is confidential'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('This issue is confidential')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('Not confidential'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('Not confidential')).toBe(true);
});
- it('displays the edit form when editable', (done) => {
+ it('displays the edit form when editable', done => {
expect(vm1.edit).toBe(false);
vm1.$el.querySelector('.confidential-edit').click();
@@ -50,17 +44,15 @@ describe('Confidential Issue Sidebar Block', () => {
expect(vm1.edit).toBe(true);
setTimeout(() => {
- expect(
- vm1.$el
- .innerHTML
- .includes('You are going to turn off the confidentiality.'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('You are going to turn off the confidentiality.')).toBe(
+ true,
+ );
done();
});
});
- it('displays the edit form when opened from collapsed state', (done) => {
+ it('displays the edit form when opened from collapsed state', done => {
expect(vm1.edit).toBe(false);
vm1.$el.querySelector('.sidebar-collapsed-icon').click();
@@ -68,11 +60,9 @@ describe('Confidential Issue Sidebar Block', () => {
expect(vm1.edit).toBe(true);
setTimeout(() => {
- expect(
- vm1.$el
- .innerHTML
- .includes('You are going to turn off the confidentiality.'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('You are going to turn off the confidentiality.')).toBe(
+ true,
+ );
done();
});
diff --git a/spec/javascripts/sidebar/lock/edit_form_buttons_spec.js b/spec/javascripts/sidebar/lock/edit_form_buttons_spec.js
index deeea669de8..330f59f08b2 100644
--- a/spec/javascripts/sidebar/lock/edit_form_buttons_spec.js
+++ b/spec/javascripts/sidebar/lock/edit_form_buttons_spec.js
@@ -8,8 +8,8 @@ describe('EditFormButtons', () => {
beforeEach(() => {
const Component = Vue.extend(editFormButtons);
- const toggleForm = () => { };
- const updateLockedAttribute = () => { };
+ const toggleForm = () => {};
+ const updateLockedAttribute = () => {};
vm1 = mountComponent(Component, {
isLocked: true,
@@ -25,12 +25,8 @@ describe('EditFormButtons', () => {
});
it('renders unlock or lock text based on locked state', () => {
- expect(
- vm1.$el.innerHTML.includes('Unlock'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Unlock')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('Lock'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('Lock')).toBe(true);
});
});
diff --git a/spec/javascripts/sidebar/lock/edit_form_spec.js b/spec/javascripts/sidebar/lock/edit_form_spec.js
index 7abd6997a18..ec10a999a40 100644
--- a/spec/javascripts/sidebar/lock/edit_form_spec.js
+++ b/spec/javascripts/sidebar/lock/edit_form_spec.js
@@ -7,8 +7,8 @@ describe('EditForm', () => {
beforeEach(() => {
const Component = Vue.extend(editForm);
- const toggleForm = () => { };
- const updateLockedAttribute = () => { };
+ const toggleForm = () => {};
+ const updateLockedAttribute = () => {};
vm1 = new Component({
propsData: {
@@ -30,12 +30,8 @@ describe('EditForm', () => {
});
it('renders on the appropriate warning text', () => {
- expect(
- vm1.$el.innerHTML.includes('Unlock this issue?'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Unlock this issue?')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('Lock this merge request?'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('Lock this merge request?')).toBe(true);
});
});
diff --git a/spec/javascripts/sidebar/lock/lock_issue_sidebar_spec.js b/spec/javascripts/sidebar/lock/lock_issue_sidebar_spec.js
index 9abc3daf221..ca882032bdf 100644
--- a/spec/javascripts/sidebar/lock/lock_issue_sidebar_spec.js
+++ b/spec/javascripts/sidebar/lock/lock_issue_sidebar_spec.js
@@ -38,20 +38,14 @@ describe('LockIssueSidebar', () => {
});
it('shows if locked and/or editable', () => {
- expect(
- vm1.$el.innerHTML.includes('Edit'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Edit')).toBe(true);
- expect(
- vm1.$el.innerHTML.includes('Locked'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Locked')).toBe(true);
- expect(
- vm2.$el.innerHTML.includes('Unlocked'),
- ).toBe(true);
+ expect(vm2.$el.innerHTML.includes('Unlocked')).toBe(true);
});
- it('displays the edit form when editable', (done) => {
+ it('displays the edit form when editable', done => {
expect(vm1.isLockDialogOpen).toBe(false);
vm1.$el.querySelector('.lock-edit').click();
@@ -59,17 +53,13 @@ describe('LockIssueSidebar', () => {
expect(vm1.isLockDialogOpen).toBe(true);
vm1.$nextTick(() => {
- expect(
- vm1.$el
- .innerHTML
- .includes('Unlock this issue?'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Unlock this issue?')).toBe(true);
done();
});
});
- it('displays the edit form when opened from collapsed state', (done) => {
+ it('displays the edit form when opened from collapsed state', done => {
expect(vm1.isLockDialogOpen).toBe(false);
vm1.$el.querySelector('.sidebar-collapsed-icon').click();
@@ -77,11 +67,7 @@ describe('LockIssueSidebar', () => {
expect(vm1.isLockDialogOpen).toBe(true);
setTimeout(() => {
- expect(
- vm1.$el
- .innerHTML
- .includes('Unlock this issue?'),
- ).toBe(true);
+ expect(vm1.$el.innerHTML.includes('Unlock this issue?')).toBe(true);
done();
});
diff --git a/spec/javascripts/sidebar/participants_spec.js b/spec/javascripts/sidebar/participants_spec.js
index e796ddee62f..eb360fd256a 100644
--- a/spec/javascripts/sidebar/participants_spec.js
+++ b/spec/javascripts/sidebar/participants_spec.js
@@ -11,13 +11,9 @@ const PARTICIPANT = {
avatar_url: 'gravatar.com/avatar/xxx',
};
-const PARTICIPANT_LIST = [
- PARTICIPANT,
- { ...PARTICIPANT, id: 2 },
- { ...PARTICIPANT, id: 3 },
-];
+const PARTICIPANT_LIST = [PARTICIPANT, { ...PARTICIPANT, id: 2 }, { ...PARTICIPANT, id: 3 }];
-describe('Participants', function () {
+describe('Participants', function() {
let vm;
let Participants;
@@ -69,7 +65,7 @@ describe('Participants', function () {
expect(vm.$el.querySelector('.js-participants-expanded-loading-icon')).toBeDefined();
});
- it('when only showing visible participants, shows an avatar only for each participant under the limit', (done) => {
+ it('when only showing visible participants, shows an avatar only for each participant under the limit', done => {
const numberOfLessParticipants = 2;
vm = mountComponent(Participants, {
loading: false,
@@ -88,7 +84,7 @@ describe('Participants', function () {
.catch(done.fail);
});
- it('when only showing all participants, each has an avatar', (done) => {
+ it('when only showing all participants, each has an avatar', done => {
const numberOfLessParticipants = 2;
vm = mountComponent(Participants, {
loading: false,
@@ -120,7 +116,7 @@ describe('Participants', function () {
expect(moreParticipantLink).toBeNull();
});
- it('when too many participants, has more participants link to show more', (done) => {
+ it('when too many participants, has more participants link to show more', done => {
vm = mountComponent(Participants, {
loading: false,
participants: PARTICIPANT_LIST,
@@ -138,7 +134,7 @@ describe('Participants', function () {
.catch(done.fail);
});
- it('when too many participants and already showing them, has more participants link to show less', (done) => {
+ it('when too many participants and already showing them, has more participants link to show less', done => {
vm = mountComponent(Participants, {
loading: false,
participants: PARTICIPANT_LIST,
@@ -182,6 +178,7 @@ describe('Participants', function () {
const participantsIconEl = vm.$el.querySelector('.sidebar-collapsed-icon');
participantsIconEl.click();
+
expect(vm.$emit).toHaveBeenCalledWith('toggleSidebar');
});
});
diff --git a/spec/javascripts/sidebar/sidebar_assignees_spec.js b/spec/javascripts/sidebar/sidebar_assignees_spec.js
index ebaaa6e806b..3f0f67d71ca 100644
--- a/spec/javascripts/sidebar/sidebar_assignees_spec.js
+++ b/spec/javascripts/sidebar/sidebar_assignees_spec.js
@@ -24,10 +24,14 @@ describe('sidebar assignees', () => {
const SidebarAssigneeComponent = Vue.extend(SidebarAssignees);
sidebarAssigneesEl = document.querySelector('#js-vue-sidebar-assignees');
- vm = mountComponent(SidebarAssigneeComponent, {
- mediator,
- field: sidebarAssigneesEl.dataset.field,
- }, sidebarAssigneesEl);
+ vm = mountComponent(
+ SidebarAssigneeComponent,
+ {
+ mediator,
+ field: sidebarAssigneesEl.dataset.field,
+ },
+ sidebarAssigneesEl,
+ );
});
afterEach(() => {
@@ -39,6 +43,7 @@ describe('sidebar assignees', () => {
it('calls the mediator when saves the assignees', () => {
vm.saveAssignees();
+
expect(mediator.saveAssignees).toHaveBeenCalled();
});
@@ -49,8 +54,9 @@ describe('sidebar assignees', () => {
expect(mediator.store.assignees.length).toEqual(1);
});
- it('hides assignees until fetched', (done) => {
+ it('hides assignees until fetched', done => {
const currentAssignee = sidebarAssigneesEl.querySelector('.value');
+
expect(currentAssignee).toBe(null);
vm.store.isFetching.assignees = false;
diff --git a/spec/javascripts/sidebar/sidebar_mediator_spec.js b/spec/javascripts/sidebar/sidebar_mediator_spec.js
index da950258a94..2d853970fc4 100644
--- a/spec/javascripts/sidebar/sidebar_mediator_spec.js
+++ b/spec/javascripts/sidebar/sidebar_mediator_spec.js
@@ -25,20 +25,23 @@ describe('Sidebar mediator', function() {
expect(this.mediator.store.assignees[0]).toEqual(Mock.mediator.currentUser);
});
- it('saves assignees', (done) => {
- this.mediator.saveAssignees('issue[assignee_ids]')
- .then((resp) => {
+ it('saves assignees', done => {
+ this.mediator
+ .saveAssignees('issue[assignee_ids]')
+ .then(resp => {
expect(resp.status).toEqual(200);
done();
})
.catch(done.fail);
});
- it('fetches the data', (done) => {
- const mockData = Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar'];
+ it('fetches the data', done => {
+ const mockData =
+ Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar'];
spyOn(this.mediator, 'processFetchedData').and.callThrough();
- this.mediator.fetch()
+ this.mediator
+ .fetch()
.then(() => {
expect(this.mediator.processFetchedData).toHaveBeenCalledWith(mockData);
})
@@ -47,7 +50,8 @@ describe('Sidebar mediator', function() {
});
it('processes fetched data', () => {
- const mockData = Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar'];
+ const mockData =
+ Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar'];
this.mediator.processFetchedData(mockData);
expect(this.mediator.store.assignees).toEqual(mockData.assignees);
@@ -68,12 +72,13 @@ describe('Sidebar mediator', function() {
expect(this.mediator.store.setMoveToProjectId).toHaveBeenCalledWith(projectId);
});
- it('fetches autocomplete projects', (done) => {
+ it('fetches autocomplete projects', done => {
const searchTerm = 'foo';
spyOn(this.mediator.service, 'getProjectsAutocomplete').and.callThrough();
spyOn(this.mediator.store, 'setAutocompleteProjects').and.callThrough();
- this.mediator.fetchAutocompleteProjects(searchTerm)
+ this.mediator
+ .fetchAutocompleteProjects(searchTerm)
.then(() => {
expect(this.mediator.service.getProjectsAutocomplete).toHaveBeenCalledWith(searchTerm);
expect(this.mediator.store.setAutocompleteProjects).toHaveBeenCalled();
@@ -82,13 +87,14 @@ describe('Sidebar mediator', function() {
.catch(done.fail);
});
- it('moves issue', (done) => {
+ it('moves issue', done => {
const moveToProjectId = 7;
this.mediator.store.setMoveToProjectId(moveToProjectId);
spyOn(this.mediator.service, 'moveIssue').and.callThrough();
const visitUrl = spyOnDependency(SidebarMediator, 'visitUrl');
- this.mediator.moveIssue()
+ this.mediator
+ .moveIssue()
.then(() => {
expect(this.mediator.service.moveIssue).toHaveBeenCalledWith(moveToProjectId);
expect(visitUrl).toHaveBeenCalledWith('/root/some-project/issues/5');
@@ -97,11 +103,12 @@ describe('Sidebar mediator', function() {
.catch(done.fail);
});
- it('toggle subscription', (done) => {
+ it('toggle subscription', done => {
this.mediator.store.setSubscribedState(false);
spyOn(this.mediator.service, 'toggleSubscription').and.callThrough();
- this.mediator.toggleSubscription()
+ this.mediator
+ .toggleSubscription()
.then(() => {
expect(this.mediator.service.toggleSubscription).toHaveBeenCalled();
expect(this.mediator.store.subscribed).toEqual(true);
diff --git a/spec/javascripts/sidebar/sidebar_move_issue_spec.js b/spec/javascripts/sidebar/sidebar_move_issue_spec.js
index 8f35b9ca437..230e0a933a9 100644
--- a/spec/javascripts/sidebar/sidebar_move_issue_spec.js
+++ b/spec/javascripts/sidebar/sidebar_move_issue_spec.js
@@ -7,7 +7,7 @@ import SidebarService from '~/sidebar/services/sidebar_service';
import SidebarMoveIssue from '~/sidebar/lib/sidebar_move_issue';
import Mock from './mock_data';
-describe('SidebarMoveIssue', function () {
+describe('SidebarMoveIssue', function() {
beforeEach(() => {
Vue.http.interceptors.push(Mock.sidebarMockInterceptor);
this.mediator = new SidebarMediator(Mock.mediator);
@@ -72,11 +72,13 @@ describe('SidebarMoveIssue', function () {
expect($.fn.glDropdown).toHaveBeenCalled();
});
- it('escapes html from project name', (done) => {
+ it('escapes html from project name', done => {
this.$toggleButton.dropdown('toggle');
setTimeout(() => {
- expect(this.$content.find('.js-move-issue-dropdown-item')[1].innerHTML.trim()).toEqual('&lt;img src=x onerror=alert(document.domain)&gt; foo / bar');
+ expect(this.$content.find('.js-move-issue-dropdown-item')[1].innerHTML.trim()).toEqual(
+ '&lt;img src=x onerror=alert(document.domain)&gt; foo / bar',
+ );
done();
});
});
@@ -94,7 +96,7 @@ describe('SidebarMoveIssue', function () {
expect(this.$confirmButton.hasClass('is-loading')).toBe(true);
});
- it('should remove loading state from confirm button on failure', (done) => {
+ it('should remove loading state from confirm button on failure', done => {
spyOn(window, 'Flash');
spyOn(this.mediator, 'moveIssue').and.returnValue(Promise.reject());
this.mediator.setMoveToProjectId(7);
@@ -121,7 +123,7 @@ describe('SidebarMoveIssue', function () {
});
});
- it('should set moveToProjectId on dropdown item "No project" click', (done) => {
+ it('should set moveToProjectId on dropdown item "No project" click', done => {
spyOn(this.mediator, 'setMoveToProjectId');
// Open the dropdown
@@ -129,7 +131,10 @@ describe('SidebarMoveIssue', function () {
// Wait for the autocomplete request to finish
setTimeout(() => {
- this.$content.find('.js-move-issue-dropdown-item').eq(0).trigger('click');
+ this.$content
+ .find('.js-move-issue-dropdown-item')
+ .eq(0)
+ .trigger('click');
expect(this.mediator.setMoveToProjectId).toHaveBeenCalledWith(0);
expect(this.$confirmButton.prop('disabled')).toBeTruthy();
@@ -137,7 +142,7 @@ describe('SidebarMoveIssue', function () {
}, 0);
});
- it('should set moveToProjectId on dropdown item click', (done) => {
+ it('should set moveToProjectId on dropdown item click', done => {
spyOn(this.mediator, 'setMoveToProjectId');
// Open the dropdown
@@ -145,7 +150,10 @@ describe('SidebarMoveIssue', function () {
// Wait for the autocomplete request to finish
setTimeout(() => {
- this.$content.find('.js-move-issue-dropdown-item').eq(1).trigger('click');
+ this.$content
+ .find('.js-move-issue-dropdown-item')
+ .eq(1)
+ .trigger('click');
expect(this.mediator.setMoveToProjectId).toHaveBeenCalledWith(20);
expect(this.$confirmButton.attr('disabled')).toBe(undefined);
diff --git a/spec/javascripts/sidebar/sidebar_store_spec.js b/spec/javascripts/sidebar/sidebar_store_spec.js
index 08b112a54ba..85ff70fffbd 100644
--- a/spec/javascripts/sidebar/sidebar_store_spec.js
+++ b/spec/javascripts/sidebar/sidebar_store_spec.js
@@ -25,20 +25,17 @@ const PARTICIPANT = {
avatar_url: 'gravatar.com/avatar/xxx',
};
-const PARTICIPANT_LIST = [
- PARTICIPANT,
- { ...PARTICIPANT, id: 2 },
- { ...PARTICIPANT, id: 3 },
-];
+const PARTICIPANT_LIST = [PARTICIPANT, { ...PARTICIPANT, id: 2 }, { ...PARTICIPANT, id: 3 }];
-describe('Sidebar store', function () {
+describe('Sidebar store', function() {
beforeEach(() => {
this.store = new SidebarStore({
currentUser: {
id: 1,
name: 'Administrator',
username: 'root',
- avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ avatar_url:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
},
editable: true,
rootPath: '/',
@@ -56,11 +53,13 @@ describe('Sidebar store', function () {
it('adds a new assignee', () => {
this.store.addAssignee(ASSIGNEE);
+
expect(this.store.assignees.length).toEqual(1);
});
it('removes an assignee', () => {
this.store.removeAssignee(ASSIGNEE);
+
expect(this.store.assignees.length).toEqual(0);
});
@@ -69,14 +68,17 @@ describe('Sidebar store', function () {
this.store.addAssignee(ASSIGNEE);
foundAssignee = this.store.findAssignee(ASSIGNEE);
+
expect(foundAssignee).toBeDefined();
expect(foundAssignee).toEqual(ASSIGNEE);
foundAssignee = this.store.findAssignee(ANOTHER_ASSINEE);
+
expect(foundAssignee).toBeUndefined();
});
it('removes all assignees', () => {
this.store.removeAllAssignees();
+
expect(this.store.assignees.length).toEqual(0);
});
@@ -108,6 +110,7 @@ describe('Sidebar store', function () {
};
this.store.setAssigneeData(users);
+
expect(this.store.isFetching.assignees).toBe(false);
expect(this.store.assignees.length).toEqual(3);
});
@@ -128,6 +131,7 @@ describe('Sidebar store', function () {
it('set time tracking data', () => {
this.store.setTimeTrackingData(Mock.time);
+
expect(this.store.timeEstimate).toEqual(Mock.time.time_estimate);
expect(this.store.totalTimeSpent).toEqual(Mock.time.total_time_spent);
expect(this.store.humanTimeEstimate).toEqual(Mock.time.human_time_estimate);
diff --git a/spec/javascripts/sidebar/sidebar_subscriptions_spec.js b/spec/javascripts/sidebar/sidebar_subscriptions_spec.js
index 9e437084224..88f64244237 100644
--- a/spec/javascripts/sidebar/sidebar_subscriptions_spec.js
+++ b/spec/javascripts/sidebar/sidebar_subscriptions_spec.js
@@ -6,13 +6,13 @@ import SidebarStore from '~/sidebar/stores/sidebar_store';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
import Mock from './mock_data';
-describe('Sidebar Subscriptions', function () {
+describe('Sidebar Subscriptions', function() {
let vm;
let SidebarSubscriptions;
beforeEach(() => {
SidebarSubscriptions = Vue.extend(sidebarSubscriptions);
- // Setup the stores, services, etc
+ // Set up the stores, services, etc
// eslint-disable-next-line no-new
new SidebarMediator(Mock.mediator);
});
diff --git a/spec/javascripts/sidebar/subscriptions_spec.js b/spec/javascripts/sidebar/subscriptions_spec.js
index f0a53e573c3..32728e58b06 100644
--- a/spec/javascripts/sidebar/subscriptions_spec.js
+++ b/spec/javascripts/sidebar/subscriptions_spec.js
@@ -3,7 +3,7 @@ import subscriptions from '~/sidebar/components/subscriptions/subscriptions.vue'
import eventHub from '~/sidebar/event_hub';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-describe('Subscriptions', function () {
+describe('Subscriptions', function() {
let vm;
let Subscriptions;
@@ -22,7 +22,9 @@ describe('Subscriptions', function () {
});
expect(vm.$refs.toggleButton.isLoading).toBe(true);
- expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).toHaveClass('is-loading');
+ expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).toHaveClass(
+ 'is-loading',
+ );
});
it('is toggled "off" when currently not subscribed', () => {
@@ -30,7 +32,9 @@ describe('Subscriptions', function () {
subscribed: false,
});
- expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).not.toHaveClass('is-checked');
+ expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).not.toHaveClass(
+ 'is-checked',
+ );
});
it('is toggled "on" when currently subscribed', () => {
@@ -38,7 +42,9 @@ describe('Subscriptions', function () {
subscribed: true,
});
- expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).toHaveClass('is-checked');
+ expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).toHaveClass(
+ 'is-checked',
+ );
});
it('toggleSubscription method emits `toggleSubscription` event on eventHub and Component', () => {
@@ -47,6 +53,7 @@ describe('Subscriptions', function () {
spyOn(vm, '$emit');
vm.toggleSubscription();
+
expect(eventHub.$emit).toHaveBeenCalledWith('toggleSubscription', jasmine.any(Object));
expect(vm.$emit).toHaveBeenCalledWith('toggleSubscription', jasmine.any(Object));
});
@@ -56,6 +63,7 @@ describe('Subscriptions', function () {
spyOn(vm, '$emit');
vm.onClickCollapsedIcon();
+
expect(vm.$emit).toHaveBeenCalledWith('toggleSidebar');
});
});
diff --git a/spec/javascripts/sidebar/todo_spec.js b/spec/javascripts/sidebar/todo_spec.js
index a929b804a29..657e88ecb96 100644
--- a/spec/javascripts/sidebar/todo_spec.js
+++ b/spec/javascripts/sidebar/todo_spec.js
@@ -42,7 +42,9 @@ describe('SidebarTodo', () => {
vm.collapsed = true;
Vue.nextTick()
.then(() => {
- expect(vm.buttonClasses).toBe('btn-blank btn-todo sidebar-collapsed-icon dont-change-state');
+ expect(vm.buttonClasses).toBe(
+ 'btn-blank btn-todo sidebar-collapsed-icon dont-change-state',
+ );
})
.then(done)
.catch(done.fail);
@@ -103,6 +105,7 @@ describe('SidebarTodo', () => {
it('emits `toggleTodo` event on component', () => {
spyOn(vm, '$emit');
vm.handleButtonClick();
+
expect(vm.$emit).toHaveBeenCalledWith('toggleTodo');
});
});
@@ -118,16 +121,18 @@ describe('SidebarTodo', () => {
container: 'body',
boundary: 'viewport',
};
+
expect(vm.$el.nodeName).toBe('BUTTON');
const elDataAttrs = vm.$el.dataset;
- Object.keys(elDataAttrs).forEach((attr) => {
+ Object.keys(elDataAttrs).forEach(attr => {
expect(elDataAttrs[attr]).toBe(dataAttributes[attr]);
});
});
it('renders button label element when `collapsed` prop is `false`', () => {
const buttonLabelEl = vm.$el.querySelector('span.issuable-todo-inner');
+
expect(buttonLabelEl).not.toBeNull();
expect(buttonLabelEl.innerText.trim()).toBe('Mark todo as done');
});
@@ -137,8 +142,11 @@ describe('SidebarTodo', () => {
Vue.nextTick()
.then(() => {
const buttonIconEl = vm.$el.querySelector('svg');
+
expect(buttonIconEl).not.toBeNull();
- expect(buttonIconEl.querySelector('use').getAttribute('xlink:href')).toContain('todo-done');
+ expect(buttonIconEl.querySelector('use').getAttribute('xlink:href')).toContain(
+ 'todo-done',
+ );
})
.then(done)
.catch(done.fail);
@@ -149,6 +157,7 @@ describe('SidebarTodo', () => {
Vue.nextTick()
.then(() => {
const loadingEl = vm.$el.querySelector('span.loading-container');
+
expect(loadingEl).not.toBeNull();
})
.then(done)
diff --git a/spec/javascripts/signin_tabs_memoizer_spec.js b/spec/javascripts/signin_tabs_memoizer_spec.js
index 9d3905fa1d8..b688a299052 100644
--- a/spec/javascripts/signin_tabs_memoizer_spec.js
+++ b/spec/javascripts/signin_tabs_memoizer_spec.js
@@ -1,164 +1,170 @@
import AccessorUtilities from '~/lib/utils/accessor';
import SigninTabsMemoizer from '~/pages/sessions/new/signin_tabs_memoizer';
-(() => {
- describe('SigninTabsMemoizer', () => {
- const fixtureTemplate = 'static/signin_tabs.html.raw';
- const tabSelector = 'ul.new-session-tabs';
- const currentTabKey = 'current_signin_tab';
- let memo;
-
- function createMemoizer() {
- memo = new SigninTabsMemoizer({
- currentTabKey,
- tabSelector,
- });
- return memo;
- }
+describe('SigninTabsMemoizer', () => {
+ const fixtureTemplate = 'static/signin_tabs.html.raw';
+ const tabSelector = 'ul.new-session-tabs';
+ const currentTabKey = 'current_signin_tab';
+ let memo;
+
+ function createMemoizer() {
+ memo = new SigninTabsMemoizer({
+ currentTabKey,
+ tabSelector,
+ });
+ return memo;
+ }
- preloadFixtures(fixtureTemplate);
+ preloadFixtures(fixtureTemplate);
- beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ beforeEach(() => {
+ loadFixtures(fixtureTemplate);
- spyOn(AccessorUtilities, 'isLocalStorageAccessSafe').and.returnValue(true);
- });
+ spyOn(AccessorUtilities, 'isLocalStorageAccessSafe').and.returnValue(true);
+ });
- it('does nothing if no tab was previously selected', () => {
- createMemoizer();
+ it('does nothing if no tab was previously selected', () => {
+ createMemoizer();
- expect(document.querySelector(`${tabSelector} > li.active a`).getAttribute('href')).toEqual('#ldap');
- });
+ expect(document.querySelector(`${tabSelector} > li.active a`).getAttribute('href')).toEqual(
+ '#ldap',
+ );
+ });
- it('shows last selected tab on boot', () => {
- createMemoizer().saveData('#ldap');
- const fakeTab = {
- click: () => {},
- };
- spyOn(document, 'querySelector').and.returnValue(fakeTab);
- spyOn(fakeTab, 'click');
+ it('shows last selected tab on boot', () => {
+ createMemoizer().saveData('#ldap');
+ const fakeTab = {
+ click: () => {},
+ };
+ spyOn(document, 'querySelector').and.returnValue(fakeTab);
+ spyOn(fakeTab, 'click');
- memo.bootstrap();
+ memo.bootstrap();
- // verify that triggers click on the last selected tab
- expect(document.querySelector).toHaveBeenCalledWith(`${tabSelector} a[href="#ldap"]`);
- expect(fakeTab.click).toHaveBeenCalled();
- });
+ // verify that triggers click on the last selected tab
+ expect(document.querySelector).toHaveBeenCalledWith(`${tabSelector} a[href="#ldap"]`);
+ expect(fakeTab.click).toHaveBeenCalled();
+ });
- it('clicks the first tab if value in local storage is bad', () => {
- createMemoizer().saveData('#bogus');
- const fakeTab = {
- click: () => {},
- };
- spyOn(document, 'querySelector').and.callFake(selector => (selector === `${tabSelector} a[href="#bogus"]` ? null : fakeTab));
- spyOn(fakeTab, 'click');
+ it('clicks the first tab if value in local storage is bad', () => {
+ createMemoizer().saveData('#bogus');
+ const fakeTab = {
+ click: () => {},
+ };
+ spyOn(document, 'querySelector').and.callFake(
+ selector => (selector === `${tabSelector} a[href="#bogus"]` ? null : fakeTab),
+ );
+ spyOn(fakeTab, 'click');
+
+ memo.bootstrap();
+
+ // verify that triggers click on stored selector and fallback
+ expect(document.querySelector.calls.allArgs()).toEqual([
+ ['ul.new-session-tabs a[href="#bogus"]'],
+ ['ul.new-session-tabs a'],
+ ]);
+
+ expect(fakeTab.click).toHaveBeenCalled();
+ });
- memo.bootstrap();
+ it('saves last selected tab on change', () => {
+ createMemoizer();
- // verify that triggers click on stored selector and fallback
- expect(document.querySelector.calls.allArgs()).toEqual([['ul.new-session-tabs a[href="#bogus"]'], ['ul.new-session-tabs a']]);
- expect(fakeTab.click).toHaveBeenCalled();
- });
+ document.querySelector('a[href="#login-pane"]').click();
- it('saves last selected tab on change', () => {
- createMemoizer();
+ expect(memo.readData()).toEqual('#login-pane');
+ });
- document.querySelector('a[href="#login-pane"]').click();
+ it('overrides last selected tab with hash tag when given', () => {
+ window.location.hash = '#ldap';
+ createMemoizer();
- expect(memo.readData()).toEqual('#login-pane');
- });
+ expect(memo.readData()).toEqual('#ldap');
+ });
- it('overrides last selected tab with hash tag when given', () => {
- window.location.hash = '#ldap';
- createMemoizer();
+ describe('class constructor', () => {
+ beforeEach(() => {
+ memo = createMemoizer();
+ });
- expect(memo.readData()).toEqual('#ldap');
+ it('should set .isLocalStorageAvailable', () => {
+ expect(AccessorUtilities.isLocalStorageAccessSafe).toHaveBeenCalled();
+ expect(memo.isLocalStorageAvailable).toBe(true);
});
+ });
- describe('class constructor', () => {
- beforeEach(() => {
- memo = createMemoizer();
- });
+ describe('saveData', () => {
+ beforeEach(() => {
+ memo = {
+ currentTabKey,
+ };
- it('should set .isLocalStorageAvailable', () => {
- expect(AccessorUtilities.isLocalStorageAccessSafe).toHaveBeenCalled();
- expect(memo.isLocalStorageAvailable).toBe(true);
- });
+ spyOn(localStorage, 'setItem');
});
- describe('saveData', () => {
- beforeEach(() => {
- memo = {
- currentTabKey,
- };
+ describe('if .isLocalStorageAvailable is `false`', () => {
+ beforeEach(function() {
+ memo.isLocalStorageAvailable = false;
- spyOn(localStorage, 'setItem');
+ SigninTabsMemoizer.prototype.saveData.call(memo);
});
- describe('if .isLocalStorageAvailable is `false`', () => {
- beforeEach(function () {
- memo.isLocalStorageAvailable = false;
-
- SigninTabsMemoizer.prototype.saveData.call(memo);
- });
-
- it('should not call .setItem', () => {
- expect(localStorage.setItem).not.toHaveBeenCalled();
- });
+ it('should not call .setItem', () => {
+ expect(localStorage.setItem).not.toHaveBeenCalled();
});
+ });
- describe('if .isLocalStorageAvailable is `true`', () => {
- const value = 'value';
+ describe('if .isLocalStorageAvailable is `true`', () => {
+ const value = 'value';
- beforeEach(function () {
- memo.isLocalStorageAvailable = true;
+ beforeEach(function() {
+ memo.isLocalStorageAvailable = true;
- SigninTabsMemoizer.prototype.saveData.call(memo, value);
- });
+ SigninTabsMemoizer.prototype.saveData.call(memo, value);
+ });
- it('should call .setItem', () => {
- expect(localStorage.setItem).toHaveBeenCalledWith(currentTabKey, value);
- });
+ it('should call .setItem', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(currentTabKey, value);
});
});
+ });
- describe('readData', () => {
- const itemValue = 'itemValue';
- let readData;
+ describe('readData', () => {
+ const itemValue = 'itemValue';
+ let readData;
- beforeEach(() => {
- memo = {
- currentTabKey,
- };
+ beforeEach(() => {
+ memo = {
+ currentTabKey,
+ };
- spyOn(localStorage, 'getItem').and.returnValue(itemValue);
- });
+ spyOn(localStorage, 'getItem').and.returnValue(itemValue);
+ });
- describe('if .isLocalStorageAvailable is `false`', () => {
- beforeEach(function () {
- memo.isLocalStorageAvailable = false;
+ describe('if .isLocalStorageAvailable is `false`', () => {
+ beforeEach(function() {
+ memo.isLocalStorageAvailable = false;
- readData = SigninTabsMemoizer.prototype.readData.call(memo);
- });
+ readData = SigninTabsMemoizer.prototype.readData.call(memo);
+ });
- it('should not call .getItem and should return `null`', () => {
- expect(localStorage.getItem).not.toHaveBeenCalled();
- expect(readData).toBe(null);
- });
+ it('should not call .getItem and should return `null`', () => {
+ expect(localStorage.getItem).not.toHaveBeenCalled();
+ expect(readData).toBe(null);
});
+ });
- describe('if .isLocalStorageAvailable is `true`', () => {
- beforeEach(function () {
- memo.isLocalStorageAvailable = true;
+ describe('if .isLocalStorageAvailable is `true`', () => {
+ beforeEach(function() {
+ memo.isLocalStorageAvailable = true;
- readData = SigninTabsMemoizer.prototype.readData.call(memo);
- });
+ readData = SigninTabsMemoizer.prototype.readData.call(memo);
+ });
- it('should call .getItem and return the localStorage value', () => {
- expect(window.localStorage.getItem).toHaveBeenCalledWith(currentTabKey);
- expect(readData).toBe(itemValue);
- });
+ it('should call .getItem and return the localStorage value', () => {
+ expect(window.localStorage.getItem).toHaveBeenCalledWith(currentTabKey);
+ expect(readData).toBe(itemValue);
});
});
});
-})();
+});
diff --git a/spec/javascripts/smart_interval_spec.js b/spec/javascripts/smart_interval_spec.js
index d9b6dd1d487..c2c2a965e1d 100644
--- a/spec/javascripts/smart_interval_spec.js
+++ b/spec/javascripts/smart_interval_spec.js
@@ -3,7 +3,7 @@ import _ from 'underscore';
import SmartInterval from '~/smart_interval';
import waitForPromises from 'spec/helpers/wait_for_promises';
-describe('SmartInterval', function () {
+describe('SmartInterval', function() {
const DEFAULT_MAX_INTERVAL = 100;
const DEFAULT_STARTING_INTERVAL = 5;
const DEFAULT_SHORT_TIMEOUT = 75;
@@ -35,8 +35,8 @@ describe('SmartInterval', function () {
jasmine.clock().uninstall();
});
- describe('Increment Interval', function () {
- it('should increment the interval delay', (done) => {
+ describe('Increment Interval', function() {
+ it('should increment the interval delay', done => {
const smartInterval = createDefaultSmartInterval();
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -45,8 +45,8 @@ describe('SmartInterval', function () {
.then(() => {
const intervalConfig = smartInterval.cfg;
const iterationCount = 4;
- const maxIntervalAfterIterations = intervalConfig.startingInterval *
- (intervalConfig.incrementByFactorOf ** iterationCount);
+ const maxIntervalAfterIterations =
+ intervalConfig.startingInterval * intervalConfig.incrementByFactorOf ** iterationCount;
const currentInterval = smartInterval.getCurrentInterval();
// Provide some flexibility for performance of testing environment
@@ -57,7 +57,7 @@ describe('SmartInterval', function () {
.catch(done.fail);
});
- it('should not increment past maxInterval', (done) => {
+ it('should not increment past maxInterval', done => {
const smartInterval = createDefaultSmartInterval({ maxInterval: DEFAULT_STARTING_INTERVAL });
jasmine.clock().tick(DEFAULT_STARTING_INTERVAL);
@@ -66,6 +66,7 @@ describe('SmartInterval', function () {
waitForPromises()
.then(() => {
const currentInterval = smartInterval.getCurrentInterval();
+
expect(currentInterval).toBe(smartInterval.cfg.maxInterval);
})
.then(done)
@@ -82,6 +83,7 @@ describe('SmartInterval', function () {
waitForPromises()
.then(() => {
const oneInterval = smartInterval.cfg.startingInterval * DEFAULT_INCREMENT_FACTOR;
+
expect(smartInterval.getCurrentInterval()).toEqual(oneInterval);
})
.then(done)
@@ -89,12 +91,12 @@ describe('SmartInterval', function () {
});
});
- describe('Public methods', function () {
- beforeEach(function () {
+ describe('Public methods', function() {
+ beforeEach(function() {
this.smartInterval = createDefaultSmartInterval();
});
- it('should cancel an interval', function (done) {
+ it('should cancel an interval', function(done) {
const interval = this.smartInterval;
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -114,7 +116,7 @@ describe('SmartInterval', function () {
.catch(done.fail);
});
- it('should resume an interval', function (done) {
+ it('should resume an interval', function(done) {
const interval = this.smartInterval;
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -126,6 +128,7 @@ describe('SmartInterval', function () {
waitForPromises()
.then(() => {
const { intervalId } = interval.state;
+
expect(intervalId).toBeTruthy();
})
.then(done)
@@ -133,15 +136,15 @@ describe('SmartInterval', function () {
});
});
- describe('DOM Events', function () {
- beforeEach(function () {
+ describe('DOM Events', function() {
+ beforeEach(function() {
// This ensures DOM and DOM events are initialized for these specs.
setFixtures('<div></div>');
this.smartInterval = createDefaultSmartInterval();
});
- it('should pause when page is not visible', function (done) {
+ it('should pause when page is not visible', function(done) {
const interval = this.smartInterval;
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -168,8 +171,10 @@ describe('SmartInterval', function () {
waitForPromises()
.then(() => {
expect(interval.state.intervalId).toBeTruthy();
- expect(interval.getCurrentInterval() >= DEFAULT_STARTING_INTERVAL &&
- interval.getCurrentInterval() <= DEFAULT_MAX_INTERVAL).toBeTruthy();
+ expect(
+ interval.getCurrentInterval() >= DEFAULT_STARTING_INTERVAL &&
+ interval.getCurrentInterval() <= DEFAULT_MAX_INTERVAL,
+ ).toBeTruthy();
// simulates triggering of visibilitychange event
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
@@ -181,7 +186,7 @@ describe('SmartInterval', function () {
.catch(done.fail);
});
- it('should resume when page is becomes visible at the previous interval', function (done) {
+ it('should resume when page is becomes visible at the previous interval', function(done) {
const interval = this.smartInterval;
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -204,7 +209,7 @@ describe('SmartInterval', function () {
.catch(done.fail);
});
- it('should cancel on page unload', function (done) {
+ it('should cancel on page unload', function(done) {
const interval = this.smartInterval;
jasmine.clock().tick(DEFAULT_SHORT_TIMEOUT);
@@ -212,6 +217,7 @@ describe('SmartInterval', function () {
waitForPromises()
.then(() => {
$(document).triggerHandler('beforeunload');
+
expect(interval.state.intervalId).toBeUndefined();
expect(interval.getCurrentInterval()).toBe(interval.cfg.startingInterval);
})
@@ -219,8 +225,9 @@ describe('SmartInterval', function () {
.catch(done.fail);
});
- it('should execute callback before first interval', function () {
+ it('should execute callback before first interval', function() {
const interval = createDefaultSmartInterval({ immediateExecution: true });
+
expect(interval.cfg.immediateExecution).toBeFalsy();
});
});
diff --git a/spec/javascripts/syntax_highlight_spec.js b/spec/javascripts/syntax_highlight_spec.js
index 1c3dac3584e..5438368ccbe 100644
--- a/spec/javascripts/syntax_highlight_spec.js
+++ b/spec/javascripts/syntax_highlight_spec.js
@@ -1,4 +1,4 @@
-/* eslint-disable no-var, no-return-assign, quotes */
+/* eslint-disable no-var, no-return-assign */
import $ from 'jquery';
import syntaxHighlight from '~/syntax_highlight';
@@ -9,35 +9,44 @@ describe('Syntax Highlighter', function() {
if (window.gon == null) {
window.gon = {};
}
- return window.gon.user_color_scheme = value;
+ return (window.gon.user_color_scheme = value);
};
describe('on a js-syntax-highlight element', function() {
beforeEach(function() {
return setFixtures('<div class="js-syntax-highlight"></div>');
});
- return it('applies syntax highlighting', function() {
+
+ it('applies syntax highlighting', function() {
stubUserColorScheme('monokai');
syntaxHighlight($('.js-syntax-highlight'));
- return expect($('.js-syntax-highlight')).toHaveClass('monokai');
+
+ expect($('.js-syntax-highlight')).toHaveClass('monokai');
});
});
- return describe('on a parent element', function() {
+
+ describe('on a parent element', function() {
beforeEach(function() {
- return setFixtures("<div class=\"parent\">\n <div class=\"js-syntax-highlight\"></div>\n <div class=\"foo\"></div>\n <div class=\"js-syntax-highlight\"></div>\n</div>");
+ return setFixtures(
+ '<div class="parent">\n <div class="js-syntax-highlight"></div>\n <div class="foo"></div>\n <div class="js-syntax-highlight"></div>\n</div>',
+ );
});
+
it('applies highlighting to all applicable children', function() {
stubUserColorScheme('monokai');
syntaxHighlight($('.parent'));
+
expect($('.parent, .foo')).not.toHaveClass('monokai');
- return expect($('.monokai').length).toBe(2);
+ expect($('.monokai').length).toBe(2);
});
- return it('prevents an infinite loop when no matches exist', function() {
+
+ it('prevents an infinite loop when no matches exist', function() {
var highlight;
setFixtures('<div></div>');
highlight = function() {
return syntaxHighlight($('div'));
};
- return expect(highlight).not.toThrow();
+
+ expect(highlight).not.toThrow();
});
});
});
diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js
index 4452c470b82..96c0844f83c 100644
--- a/spec/javascripts/test_bundle.js
+++ b/spec/javascripts/test_bundle.js
@@ -41,8 +41,8 @@ jasmine.getJSONFixtures().fixturesPath = FIXTURES_PATH;
beforeAll(() => {
jasmine.addMatchers(
jasmineDiff(jasmine, {
- colors: true,
- inline: true,
+ colors: window.__karma__.config.color,
+ inline: window.__karma__.config.color,
}),
);
jasmine.addMatchers(customMatchers);
diff --git a/spec/javascripts/todos_spec.js b/spec/javascripts/todos_spec.js
index e74f4bdef7e..69e43274250 100644
--- a/spec/javascripts/todos_spec.js
+++ b/spec/javascripts/todos_spec.js
@@ -14,10 +14,10 @@ describe('Todos', () => {
});
describe('goToTodoUrl', () => {
- it('opens the todo url', (done) => {
+ it('opens the todo url', done => {
const todoLink = todoItem.dataset.url;
- spyOnDependency(Todos, 'visitUrl').and.callFake((url) => {
+ spyOnDependency(Todos, 'visitUrl').and.callFake(url => {
expect(url).toEqual(todoLink);
done();
});
diff --git a/spec/javascripts/toggle_buttons_spec.js b/spec/javascripts/toggle_buttons_spec.js
index 17d0b94ebe0..09756ff76ec 100644
--- a/spec/javascripts/toggle_buttons_spec.js
+++ b/spec/javascripts/toggle_buttons_spec.js
@@ -24,11 +24,14 @@ describe('ToggleButtons', () => {
it('should initialize as checked', () => {
const wrapper = setupFixture(true);
- expect(wrapper.querySelector('.js-project-feature-toggle').classList.contains('is-checked')).toEqual(true);
+ expect(
+ wrapper.querySelector('.js-project-feature-toggle').classList.contains('is-checked'),
+ ).toEqual(true);
+
expect(wrapper.querySelector('.js-project-feature-toggle-input').value).toEqual('true');
});
- it('should toggle to unchecked when clicked', (done) => {
+ it('should toggle to unchecked when clicked', done => {
const wrapper = setupFixture(true);
const toggleButton = wrapper.querySelector('.js-project-feature-toggle');
@@ -48,11 +51,14 @@ describe('ToggleButtons', () => {
it('should initialize as unchecked', () => {
const wrapper = setupFixture(false);
- expect(wrapper.querySelector('.js-project-feature-toggle').classList.contains('is-checked')).toEqual(false);
+ expect(
+ wrapper.querySelector('.js-project-feature-toggle').classList.contains('is-checked'),
+ ).toEqual(false);
+
expect(wrapper.querySelector('.js-project-feature-toggle-input').value).toEqual('false');
});
- it('should toggle to checked when clicked', (done) => {
+ it('should toggle to checked when clicked', done => {
const wrapper = setupFixture(false);
const toggleButton = wrapper.querySelector('.js-project-feature-toggle');
@@ -68,7 +74,7 @@ describe('ToggleButtons', () => {
});
});
- it('should emit `trigger-change` event', (done) => {
+ it('should emit `trigger-change` event', done => {
const changeSpy = jasmine.createSpy('changeEventHandler');
const wrapper = setupFixture(false);
const toggleButton = wrapper.querySelector('.js-project-feature-toggle');
@@ -87,7 +93,7 @@ describe('ToggleButtons', () => {
});
describe('clickCallback', () => {
- it('should show loading indicator while waiting', (done) => {
+ it('should show loading indicator while waiting', done => {
const isChecked = true;
const clickCallback = (newValue, toggleButton) => {
const input = toggleButton.querySelector('.js-project-feature-toggle-input');
diff --git a/spec/javascripts/u2f/authenticate_spec.js b/spec/javascripts/u2f/authenticate_spec.js
index 57e0caa692c..ddb09811dda 100644
--- a/spec/javascripts/u2f/authenticate_spec.js
+++ b/spec/javascripts/u2f/authenticate_spec.js
@@ -3,7 +3,7 @@ import U2FAuthenticate from '~/u2f/authenticate';
import 'vendor/u2f';
import MockU2FDevice from './mock_u2f_device';
-describe('U2FAuthenticate', function () {
+describe('U2FAuthenticate', function() {
preloadFixtures('u2f/authenticate.html.raw');
beforeEach(() => {
@@ -32,30 +32,40 @@ describe('U2FAuthenticate', function () {
window.u2f = this.oldu2f;
});
- it('falls back to normal 2fa', (done) => {
- this.component.start().then(() => {
- expect(this.component.switchToFallbackUI).toHaveBeenCalled();
- done();
- }).catch(done.fail);
+ it('falls back to normal 2fa', done => {
+ this.component
+ .start()
+ .then(() => {
+ expect(this.component.switchToFallbackUI).toHaveBeenCalled();
+ done();
+ })
+ .catch(done.fail);
});
});
describe('with u2f available', () => {
- beforeEach((done) => {
+ beforeEach(done => {
// bypass automatic form submission within renderAuthenticated
spyOn(this.component, 'renderAuthenticated').and.returnValue(true);
this.u2fDevice = new MockU2FDevice();
- this.component.start().then(done).catch(done.fail);
+ this.component
+ .start()
+ .then(done)
+ .catch(done.fail);
});
it('allows authenticating via a U2F device', () => {
const inProgressMessage = this.container.find('p');
+
expect(inProgressMessage.text()).toContain('Trying to communicate with your device');
this.u2fDevice.respondToAuthenticateRequest({
deviceData: 'this is data from the device',
});
- expect(this.component.renderAuthenticated).toHaveBeenCalledWith('{"deviceData":"this is data from the device"}');
+
+ expect(this.component.renderAuthenticated).toHaveBeenCalledWith(
+ '{"deviceData":"this is data from the device"}',
+ );
});
describe('errors', () => {
@@ -66,7 +76,8 @@ describe('U2FAuthenticate', function () {
errorCode: 'error!',
});
const errorMessage = this.container.find('p');
- return expect(errorMessage.text()).toContain('There was a problem communicating with your device');
+
+ expect(errorMessage.text()).toContain('There was a problem communicating with your device');
});
return it('allows retrying authentication after an error', () => {
let setupButton = this.container.find('#js-login-u2f-device');
@@ -81,7 +92,10 @@ describe('U2FAuthenticate', function () {
this.u2fDevice.respondToAuthenticateRequest({
deviceData: 'this is data from the device',
});
- expect(this.component.renderAuthenticated).toHaveBeenCalledWith('{"deviceData":"this is data from the device"}');
+
+ expect(this.component.renderAuthenticated).toHaveBeenCalledWith(
+ '{"deviceData":"this is data from the device"}',
+ );
});
});
});
diff --git a/spec/javascripts/u2f/mock_u2f_device.js b/spec/javascripts/u2f/mock_u2f_device.js
index 012a1cefbbf..26ddd8ade61 100644
--- a/spec/javascripts/u2f/mock_u2f_device.js
+++ b/spec/javascripts/u2f/mock_u2f_device.js
@@ -1,18 +1,18 @@
-/* eslint-disable wrap-iife, no-unused-expressions, no-return-assign, no-param-reassign */
+/* eslint-disable no-unused-expressions, no-return-assign, no-param-reassign */
export default class MockU2FDevice {
constructor() {
this.respondToAuthenticateRequest = this.respondToAuthenticateRequest.bind(this);
this.respondToRegisterRequest = this.respondToRegisterRequest.bind(this);
window.u2f || (window.u2f = {});
- window.u2f.register = (function (_this) {
- return function (appId, registerRequests, signRequests, callback) {
- return _this.registerCallback = callback;
+ window.u2f.register = (function(_this) {
+ return function(appId, registerRequests, signRequests, callback) {
+ return (_this.registerCallback = callback);
};
})(this);
- window.u2f.sign = (function (_this) {
- return function (appId, challenges, signRequests, callback) {
- return _this.authenticateCallback = callback;
+ window.u2f.sign = (function(_this) {
+ return function(appId, challenges, signRequests, callback) {
+ return (_this.authenticateCallback = callback);
};
})(this);
}
diff --git a/spec/javascripts/u2f/register_spec.js b/spec/javascripts/u2f/register_spec.js
index d9383314891..261db3d66d7 100644
--- a/spec/javascripts/u2f/register_spec.js
+++ b/spec/javascripts/u2f/register_spec.js
@@ -3,41 +3,48 @@ import U2FRegister from '~/u2f/register';
import 'vendor/u2f';
import MockU2FDevice from './mock_u2f_device';
-describe('U2FRegister', function () {
+describe('U2FRegister', function() {
preloadFixtures('u2f/register.html.raw');
- beforeEach((done) => {
+ beforeEach(done => {
loadFixtures('u2f/register.html.raw');
this.u2fDevice = new MockU2FDevice();
this.container = $('#js-register-u2f');
this.component = new U2FRegister(this.container, $('#js-register-u2f-templates'), {}, 'token');
- this.component.start().then(done).catch(done.fail);
+ this.component
+ .start()
+ .then(done)
+ .catch(done.fail);
});
it('allows registering a U2F device', () => {
const setupButton = this.container.find('#js-setup-u2f-device');
- expect(setupButton.text()).toBe('Setup new U2F device');
+
+ expect(setupButton.text()).toBe('Set up new U2F device');
setupButton.trigger('click');
const inProgressMessage = this.container.children('p');
+
expect(inProgressMessage.text()).toContain('Trying to communicate with your device');
this.u2fDevice.respondToRegisterRequest({
deviceData: 'this is data from the device',
});
const registeredMessage = this.container.find('p');
const deviceResponse = this.container.find('#js-device-response');
+
expect(registeredMessage.text()).toContain('Your device was successfully set up!');
- return expect(deviceResponse.val()).toBe('{"deviceData":"this is data from the device"}');
+ expect(deviceResponse.val()).toBe('{"deviceData":"this is data from the device"}');
});
- return describe('errors', () => {
- it('doesn\'t allow the same device to be registered twice (for the same user', () => {
+ describe('errors', () => {
+ it("doesn't allow the same device to be registered twice (for the same user", () => {
const setupButton = this.container.find('#js-setup-u2f-device');
setupButton.trigger('click');
this.u2fDevice.respondToRegisterRequest({
errorCode: 4,
});
const errorMessage = this.container.find('p');
- return expect(errorMessage.text()).toContain('already been registered with us');
+
+ expect(errorMessage.text()).toContain('already been registered with us');
});
it('displays an error message for other errors', () => {
@@ -47,10 +54,11 @@ describe('U2FRegister', function () {
errorCode: 'error!',
});
const errorMessage = this.container.find('p');
- return expect(errorMessage.text()).toContain('There was a problem communicating with your device');
+
+ expect(errorMessage.text()).toContain('There was a problem communicating with your device');
});
- return it('allows retrying registration after an error', () => {
+ it('allows retrying registration after an error', () => {
let setupButton = this.container.find('#js-setup-u2f-device');
setupButton.trigger('click');
this.u2fDevice.respondToRegisterRequest({
@@ -64,7 +72,8 @@ describe('U2FRegister', function () {
deviceData: 'this is data from the device',
});
const registeredMessage = this.container.find('p');
- return expect(registeredMessage.text()).toContain('Your device was successfully set up!');
+
+ expect(registeredMessage.text()).toContain('Your device was successfully set up!');
});
});
});
diff --git a/spec/javascripts/u2f/util_spec.js b/spec/javascripts/u2f/util_spec.js
index 4187183236f..32cd6891384 100644
--- a/spec/javascripts/u2f/util_spec.js
+++ b/spec/javascripts/u2f/util_spec.js
@@ -3,42 +3,58 @@ import { canInjectU2fApi } from '~/u2f/util';
describe('U2F Utils', () => {
describe('canInjectU2fApi', () => {
it('returns false for Chrome < 41', () => {
- const userAgent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.28 Safari/537.36';
+ const userAgent =
+ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.28 Safari/537.36';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
it('returns true for Chrome >= 41', () => {
- const userAgent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36';
+ const userAgent =
+ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36';
+
expect(canInjectU2fApi(userAgent)).toBe(true);
});
it('returns false for Opera < 40', () => {
- const userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25';
+ const userAgent =
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
it('returns true for Opera >= 40', () => {
- const userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 OPR/43.0.2442.991';
+ const userAgent =
+ 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 OPR/43.0.2442.991';
+
expect(canInjectU2fApi(userAgent)).toBe(true);
});
it('returns false for Safari', () => {
- const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4';
+ const userAgent =
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
it('returns false for Chrome on Android', () => {
- const userAgent = 'Mozilla/5.0 (Linux; Android 7.0; VS988 Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3145.0 Mobile Safari/537.36';
+ const userAgent =
+ 'Mozilla/5.0 (Linux; Android 7.0; VS988 Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3145.0 Mobile Safari/537.36';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
it('returns false for Chrome on iOS', () => {
- const userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1';
+ const userAgent =
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
it('returns false for Safari on iOS', () => {
- const userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A356 Safari/604.1';
+ const userAgent =
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A356 Safari/604.1';
+
expect(canInjectU2fApi(userAgent)).toBe(false);
});
});
diff --git a/spec/javascripts/version_check_image_spec.js b/spec/javascripts/version_check_image_spec.js
index 5f963e8c11e..0e69fcc4c5f 100644
--- a/spec/javascripts/version_check_image_spec.js
+++ b/spec/javascripts/version_check_image_spec.js
@@ -2,17 +2,19 @@ import $ from 'jquery';
import VersionCheckImage from '~/version_check_image';
import ClassSpecHelper from './helpers/class_spec_helper';
-describe('VersionCheckImage', function () {
- describe('bindErrorEvent', function () {
+describe('VersionCheckImage', function() {
+ describe('bindErrorEvent', function() {
ClassSpecHelper.itShouldBeAStaticMethod(VersionCheckImage, 'bindErrorEvent');
- beforeEach(function () {
+ beforeEach(function() {
this.imageElement = $('<div></div>');
});
- it('registers an error event', function () {
+ it('registers an error event', function() {
spyOn($.prototype, 'on');
- spyOn($.prototype, 'off').and.callFake(function () { return this; });
+ spyOn($.prototype, 'off').and.callFake(function() {
+ return this;
+ });
VersionCheckImage.bindErrorEvent(this.imageElement);
@@ -20,7 +22,7 @@ describe('VersionCheckImage', function () {
expect($.prototype.on).toHaveBeenCalledWith('error', jasmine.any(Function));
});
- it('hides the imageElement on error', function () {
+ it('hides the imageElement on error', function() {
spyOn($.prototype, 'hide');
VersionCheckImage.bindErrorEvent(this.imageElement);
diff --git a/spec/javascripts/vue_mr_widget/components/deployment_spec.js b/spec/javascripts/vue_mr_widget/components/deployment_spec.js
index 50c2b0e2bd0..056b4df8fdc 100644
--- a/spec/javascripts/vue_mr_widget/components/deployment_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/deployment_spec.js
@@ -2,43 +2,52 @@ import Vue from 'vue';
import deploymentComponent from '~/vue_merge_request_widget/components/deployment.vue';
import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service';
import { getTimeago } from '~/lib/utils/datetime_utility';
+import mountComponent from '../../helpers/vue_mount_component_helper';
-const deploymentMockData = {
- id: 15,
- name: 'review/diplo',
- url: '/root/acets-review-apps/environments/15',
- stop_url: '/root/acets-review-apps/environments/15/stop',
- metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
- metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
- external_url: 'http://diplo.',
- external_url_formatted: 'diplo.',
- deployed_at: '2017-03-22T22:44:42.258Z',
- deployed_at_formatted: 'Mar 22, 2017 10:44pm',
-};
-const createComponent = () => {
+describe('Deployment component', () => {
const Component = Vue.extend(deploymentComponent);
+ const deploymentMockData = {
+ id: 15,
+ name: 'review/diplo',
+ url: '/root/review-apps/environments/15',
+ stop_url: '/root/review-apps/environments/15/stop',
+ metrics_url: '/root/review-apps/environments/15/deployments/1/metrics',
+ metrics_monitoring_url: '/root/review-apps/environments/15/metrics',
+ external_url: 'http://gitlab.com.',
+ external_url_formatted: 'gitlab',
+ deployed_at: '2017-03-22T22:44:42.258Z',
+ deployed_at_formatted: 'Mar 22, 2017 10:44pm',
+ changes: [
+ {
+ path: 'index.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
+ },
+ {
+ path: 'imgs/gallery.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
+ },
+ {
+ path: 'about/',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
+ },
+ ],
+ };
- return new Component({
- el: document.createElement('div'),
- propsData: { deployment: { ...deploymentMockData } },
- });
-};
-
-describe('Deployment component', () => {
let vm;
- beforeEach(() => {
- vm = createComponent();
- });
-
afterEach(() => {
vm.$destroy();
});
- describe('computed', () => {
+ describe('', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true });
+ });
+
describe('deployTimeago', () => {
it('return formatted date', () => {
const readable = getTimeago().format(deploymentMockData.deployed_at);
+
expect(vm.deployTimeago).toEqual(readable);
});
});
@@ -96,24 +105,23 @@ describe('Deployment component', () => {
expect(vm.hasDeploymentMeta).toEqual(false);
});
});
- });
- describe('methods', () => {
describe('stopEnvironment', () => {
const url = '/foo/bar';
- const returnPromise = () => new Promise((resolve) => {
- resolve({
- data: {
- redirect_url: url,
- },
+ const returnPromise = () =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ redirect_url: url,
+ },
+ });
});
- });
const mockStopEnvironment = () => {
vm.stopEnvironment(deploymentMockData);
return vm;
};
- it('should show a confirm dialog and call service.stopEnvironment when confirmed', (done) => {
+ it('should show a confirm dialog and call service.stopEnvironment when confirmed', done => {
spyOn(window, 'confirm').and.returnValue(true);
spyOn(MRWidgetService, 'stopEnvironment').and.returnValue(returnPromise(true));
const visitUrl = spyOnDependency(deploymentComponent, 'visitUrl').and.returnValue(true);
@@ -136,36 +144,113 @@ describe('Deployment component', () => {
expect(MRWidgetService.stopEnvironment).not.toHaveBeenCalled();
});
});
- });
-
- describe('template', () => {
- let el;
-
- beforeEach(() => {
- vm = createComponent(deploymentMockData);
- el = vm.$el;
- });
it('renders deployment name', () => {
- expect(el.querySelector('.js-deploy-meta').getAttribute('href')).toEqual(deploymentMockData.url);
- expect(el.querySelector('.js-deploy-meta').innerText).toContain(deploymentMockData.name);
+ expect(vm.$el.querySelector('.js-deploy-meta').getAttribute('href')).toEqual(
+ deploymentMockData.url,
+ );
+
+ expect(vm.$el.querySelector('.js-deploy-meta').innerText).toContain(deploymentMockData.name);
});
it('renders external URL', () => {
- expect(el.querySelector('.js-deploy-url').getAttribute('href')).toEqual(deploymentMockData.external_url);
- expect(el.querySelector('.js-deploy-url').innerText).toContain('View app');
+ expect(vm.$el.querySelector('.js-deploy-url').getAttribute('href')).toEqual(
+ deploymentMockData.external_url,
+ );
+
+ expect(vm.$el.querySelector('.js-deploy-url').innerText).toContain('View app');
});
it('renders stop button', () => {
- expect(el.querySelector('.btn')).not.toBeNull();
+ expect(vm.$el.querySelector('.btn')).not.toBeNull();
});
it('renders deployment time', () => {
- expect(el.querySelector('.js-deploy-time').innerText).toContain(vm.deployTimeago);
+ expect(vm.$el.querySelector('.js-deploy-time').innerText).toContain(vm.deployTimeago);
});
it('renders metrics component', () => {
- expect(el.querySelector('.js-mr-memory-usage')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-mr-memory-usage')).not.toBeNull();
+ });
+ });
+
+ describe('with showMetrics enabled', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true });
+ });
+
+ it('shows metrics', () => {
+ expect(vm.$el).toContainElement('.js-mr-memory-usage');
+ });
+ });
+
+ describe('with showMetrics disabled', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: false });
+ });
+
+ it('hides metrics', () => {
+ expect(vm.$el).not.toContainElement('.js-mr-memory-usage');
+ });
+ });
+
+ describe('without changes', () => {
+ beforeEach(() => {
+ delete deploymentMockData.changes;
+
+ vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true });
+ });
+
+ it('renders the link to the review app without dropdown', () => {
+ expect(vm.$el.querySelector('.js-mr-wigdet-deployment-dropdown')).toBeNull();
+ expect(vm.$el.querySelector('.js-deploy-url-feature-flag')).not.toBeNull();
+ });
+ });
+
+ describe('deployment status', () => {
+ describe('running', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ deployment: Object.assign({}, deploymentMockData, { status: 'running' }),
+ showMetrics: true,
+ });
+ });
+
+ it('renders information about running deployment', () => {
+ expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain('Deploying to');
+ });
+
+ it('renders disabled stop button', () => {
+ expect(vm.$el.querySelector('.js-stop-env').getAttribute('disabled')).toBe('disabled');
+ });
+ });
+
+ describe('success', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ deployment: Object.assign({}, deploymentMockData, { status: 'success' }),
+ showMetrics: true,
+ });
+ });
+
+ it('renders information about finished deployment', () => {
+ expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain('Deployed to');
+ });
+ });
+
+ describe('failed', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ deployment: Object.assign({}, deploymentMockData, { status: 'failed' }),
+ showMetrics: true,
+ });
+ });
+
+ it('renders information about finished deployment', () => {
+ expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain(
+ 'Failed to deploy to',
+ );
+ });
});
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js
index 00f4f2d7c39..b69082082ba 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js
@@ -13,9 +13,9 @@ describe('MrWidgetAuthor', () => {
name: 'Administrator',
username: 'root',
webUrl: 'http://localhost:3000/root',
- avatarUrl: 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ avatarUrl:
+ 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
},
-
});
});
@@ -28,9 +28,9 @@ describe('MrWidgetAuthor', () => {
});
it('renders image with avatar url', () => {
- expect(
- vm.$el.querySelector('img').getAttribute('src'),
- ).toEqual('http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon');
+ expect(vm.$el.querySelector('img').getAttribute('src')).toEqual(
+ 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ );
});
it('renders author name', () => {
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js
index 10143402acf..787f44e478d 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js
@@ -14,7 +14,8 @@ describe('MrWidgetAuthorTime', () => {
name: 'Administrator',
username: 'root',
webUrl: 'http://localhost:3000/root',
- avatarUrl: 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ avatarUrl:
+ 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
},
dateTitle: '2017-03-23T23:02:00.807Z',
dateReadable: '12 hours ago',
@@ -34,7 +35,10 @@ describe('MrWidgetAuthorTime', () => {
});
it('renders provided time', () => {
- expect(vm.$el.querySelector('time').getAttribute('data-original-title')).toEqual('2017-03-23T23:02:00.807Z');
+ expect(vm.$el.querySelector('time').getAttribute('data-original-title')).toEqual(
+ '2017-03-23T23:02:00.807Z',
+ );
+
expect(vm.$el.querySelector('time').textContent.trim()).toEqual('12 hours ago');
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js
index 8ac2f26979b..02c476f2871 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js
@@ -41,11 +41,12 @@ describe('MRWidgetHeader', () => {
statusPath: 'abc',
},
});
+
expect(vm.shouldShowCommitsBehindText).toEqual(false);
});
});
- describe('commitsText', () => {
+ describe('commitsBehindText', () => {
it('returns singular when there is one commit', () => {
vm = mountComponent(Component, {
mr: {
@@ -53,11 +54,14 @@ describe('MRWidgetHeader', () => {
sourceBranch: 'mr-widget-refactor',
sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">Link</a>',
targetBranch: 'master',
+ targetBranchPath: '/foo/bar/master',
statusPath: 'abc',
},
});
- expect(vm.commitsText).toEqual('1 commit behind');
+ expect(vm.commitsBehindText).toEqual(
+ 'The source branch is <a href="/foo/bar/master">1 commit behind</a> the target branch',
+ );
});
it('returns plural when there is more than one commit', () => {
@@ -67,11 +71,14 @@ describe('MRWidgetHeader', () => {
sourceBranch: 'mr-widget-refactor',
sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">Link</a>',
targetBranch: 'master',
+ targetBranchPath: '/foo/bar/master',
statusPath: 'abc',
},
});
- expect(vm.commitsText).toEqual('2 commits behind');
+ expect(vm.commitsBehindText).toEqual(
+ 'The source branch is <a href="/foo/bar/master">2 commits behind</a> the target branch',
+ );
});
});
});
@@ -112,28 +119,31 @@ describe('MRWidgetHeader', () => {
});
describe('with an open merge request', () => {
+ const mrDefaultOptions = {
+ iid: 1,
+ divergedCommitsCount: 12,
+ sourceBranch: 'mr-widget-refactor',
+ sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>',
+ sourceBranchRemoved: false,
+ targetBranchPath: 'foo/bar/commits-path',
+ targetBranchTreePath: 'foo/bar/tree/path',
+ targetBranch: 'master',
+ isOpen: true,
+ canPushToSourceBranch: true,
+ emailPatchesPath: '/mr/email-patches',
+ plainDiffPath: '/mr/plainDiffPath',
+ statusPath: 'abc',
+ sourceProjectFullPath: 'root/gitlab-ce',
+ targetProjectFullPath: 'gitlab-org/gitlab-ce',
+ };
+
afterEach(() => {
vm.$destroy();
});
beforeEach(() => {
vm = mountComponent(Component, {
- mr: {
- iid: 1,
- divergedCommitsCount: 12,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>',
- sourceBranchRemoved: false,
- targetBranchPath: 'foo/bar/commits-path',
- targetBranchTreePath: 'foo/bar/tree/path',
- targetBranch: 'master',
- isOpen: true,
- emailPatchesPath: '/mr/email-patches',
- plainDiffPath: '/mr/plainDiffPath',
- statusPath: 'abc',
- sourceProjectFullPath: 'root/gitlab-ce',
- targetProjectFullPath: 'gitlab-org/gitlab-ce',
- },
+ mr: Object.assign({}, mrDefaultOptions),
});
});
@@ -149,11 +159,22 @@ describe('MRWidgetHeader', () => {
const button = vm.$el.querySelector('.js-web-ide');
expect(button.textContent.trim()).toEqual('Open in Web IDE');
+ expect(button.classList.contains('disabled')).toBe(false);
expect(button.getAttribute('href')).toEqual(
'/-/ide/project/root/gitlab-ce/merge_requests/1?target_project=gitlab-org%2Fgitlab-ce',
);
});
+ it('renders web ide button in disabled state with no href', () => {
+ const mr = Object.assign({}, mrDefaultOptions, { canPushToSourceBranch: false });
+ vm = mountComponent(Component, { mr });
+
+ const link = vm.$el.querySelector('.js-web-ide');
+
+ expect(link.classList.contains('disabled')).toBe(true);
+ expect(link.getAttribute('href')).toBeNull();
+ });
+
it('renders web ide button with blank query string if target & source project branch', done => {
vm.mr.targetProjectFullPath = 'root/gitlab-ce';
@@ -280,8 +301,17 @@ describe('MRWidgetHeader', () => {
});
it('renders diverged commits info', () => {
- expect(vm.$el.querySelector('.diverged-commits-count').textContent).toMatch(
- /(mr-widget-refactor[\s\S]+?is 12 commits behind[\s\S]+?master)/,
+ expect(vm.$el.querySelector('.diverged-commits-count').textContent).toEqual(
+ 'The source branch is 12 commits behind the target branch',
+ );
+
+ expect(vm.$el.querySelector('.diverged-commits-count a').textContent).toEqual(
+ '12 commits behind',
+ );
+
+ expect(vm.$el.querySelector('.diverged-commits-count a')).toHaveAttr(
+ 'href',
+ vm.mr.targetBranchPath,
);
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js
index 91e81a0675a..4baaea9745a 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js
@@ -128,16 +128,10 @@ describe('MemoryUsage', () => {
describe('computeGraphData', () => {
it('should populate sparkline graph', () => {
vm.computeGraphData(metrics, deployment_time);
- const {
- hasMetrics,
- memoryMetrics,
- deploymentTime,
- memoryFrom,
- memoryTo,
- } = vm;
+ const { hasMetrics, memoryMetrics, deploymentTime, memoryFrom, memoryTo } = vm;
expect(hasMetrics).toBeTruthy();
- expect(memoryMetrics.length > 0).toBeTruthy();
+ expect(memoryMetrics.length).toBeGreaterThan(0);
expect(deploymentTime).toEqual(deployment_time);
expect(memoryFrom).toEqual('9.13');
expect(memoryTo).toEqual('4.28');
@@ -153,18 +147,13 @@ describe('MemoryUsage', () => {
});
it('should load metrics data using MRWidgetService', done => {
- spyOn(MRWidgetService, 'fetchMetrics').and.returnValue(
- returnServicePromise(true),
- );
+ spyOn(MRWidgetService, 'fetchMetrics').and.returnValue(returnServicePromise(true));
spyOn(vm, 'computeGraphData');
vm.loadMetrics();
setTimeout(() => {
expect(MRWidgetService.fetchMetrics).toHaveBeenCalledWith(url);
- expect(vm.computeGraphData).toHaveBeenCalledWith(
- metrics,
- deployment_time,
- );
+ expect(vm.computeGraphData).toHaveBeenCalledWith(metrics, deployment_time);
done();
}, 333);
});
@@ -183,15 +172,11 @@ describe('MemoryUsage', () => {
vm.loadFailed = false;
Vue.nextTick(() => {
- expect(
- el.querySelector('.js-usage-info.usage-info-loading'),
- ).toBeDefined();
- expect(
- el.querySelector('.js-usage-info .usage-info-load-spinner'),
- ).toBeDefined();
- expect(el.querySelector('.js-usage-info').innerText).toContain(
- messages.loadingMetrics,
- );
+ expect(el.querySelector('.js-usage-info.usage-info-loading')).toBeDefined();
+
+ expect(el.querySelector('.js-usage-info .usage-info-load-spinner')).toBeDefined();
+
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadingMetrics);
done();
});
});
@@ -203,9 +188,7 @@ describe('MemoryUsage', () => {
Vue.nextTick(() => {
expect(el.querySelector('.memory-graph-container')).toBeDefined();
- expect(el.querySelector('.js-usage-info').innerText).toContain(
- messages.hasMetrics,
- );
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.hasMetrics);
done();
});
});
@@ -216,12 +199,9 @@ describe('MemoryUsage', () => {
vm.loadFailed = true;
Vue.nextTick(() => {
- expect(
- el.querySelector('.js-usage-info.usage-info-failed'),
- ).toBeDefined();
- expect(el.querySelector('.js-usage-info').innerText).toContain(
- messages.loadFailed,
- );
+ expect(el.querySelector('.js-usage-info.usage-info-failed')).toBeDefined();
+
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadFailed);
done();
});
});
@@ -232,12 +212,9 @@ describe('MemoryUsage', () => {
vm.loadFailed = false;
Vue.nextTick(() => {
- expect(
- el.querySelector('.js-usage-info.usage-info-unavailable'),
- ).toBeDefined();
- expect(el.querySelector('.js-usage-info').innerText).toContain(
- messages.metricsUnavailable,
- );
+ expect(el.querySelector('.js-usage-info.usage-info-unavailable')).toBeDefined();
+
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.metricsUnavailable);
done();
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js
index 367c499daaf..2c554f3f3ab 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js
@@ -23,15 +23,23 @@ describe('MRWidgetMergeHelp', () => {
it('renders missing branch information', () => {
expect(
- vm.$el.textContent.trim().replace(/[\r\n]+/g, ' ').replace(/\s\s+/g, ' '),
+ vm.$el.textContent
+ .trim()
+ .replace(/[\r\n]+/g, ' ')
+ .replace(/\s\s+/g, ' '),
).toEqual(
'If the this-is-not-the-branch-you-are-looking-for branch exists in your local repository, you can merge this merge request manually using the command line',
);
});
it('renders button to open help modal', () => {
- expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-target')).toEqual('#modal_merge_info');
- expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-toggle')).toEqual('modal');
+ expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-target')).toEqual(
+ '#modal_merge_info',
+ );
+
+ expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-toggle')).toEqual(
+ 'modal',
+ );
});
});
@@ -42,15 +50,21 @@ describe('MRWidgetMergeHelp', () => {
it('renders information about how to merge manually', () => {
expect(
- vm.$el.textContent.trim().replace(/[\r\n]+/g, ' ').replace(/\s\s+/g, ' '),
- ).toEqual(
- 'You can merge this merge request manually using the command line',
- );
+ vm.$el.textContent
+ .trim()
+ .replace(/[\r\n]+/g, ' ')
+ .replace(/\s\s+/g, ' '),
+ ).toEqual('You can merge this merge request manually using the command line');
});
it('renders element to open a modal', () => {
- expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-target')).toEqual('#modal_merge_info');
- expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-toggle')).toEqual('modal');
+ expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-target')).toEqual(
+ '#modal_merge_info',
+ );
+
+ expect(vm.$el.querySelector('.js-open-modal-help').getAttribute('data-toggle')).toEqual(
+ 'modal',
+ );
});
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
index ea8007d2029..d905bbe4040 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
@@ -22,6 +22,7 @@ describe('MRWidgetPipeline', () => {
pipeline: mockData.pipeline,
ciStatus: 'success',
hasCi: true,
+ troubleshootingDocsPath: 'help',
});
expect(vm.hasPipeline).toEqual(true);
@@ -30,6 +31,7 @@ describe('MRWidgetPipeline', () => {
it('should return false when there is no pipeline', () => {
vm = mountComponent(Component, {
pipeline: {},
+ troubleshootingDocsPath: 'help',
});
expect(vm.hasPipeline).toEqual(false);
@@ -42,6 +44,7 @@ describe('MRWidgetPipeline', () => {
pipeline: mockData.pipeline,
hasCi: true,
ciStatus: 'success',
+ troubleshootingDocsPath: 'help',
});
expect(vm.hasCIError).toEqual(false);
@@ -52,6 +55,7 @@ describe('MRWidgetPipeline', () => {
pipeline: mockData.pipeline,
hasCi: true,
ciStatus: null,
+ troubleshootingDocsPath: 'help',
});
expect(vm.hasCIError).toEqual(true);
@@ -65,11 +69,12 @@ describe('MRWidgetPipeline', () => {
pipeline: mockData.pipeline,
hasCi: true,
ciStatus: null,
+ troubleshootingDocsPath: 'help',
});
- expect(
- vm.$el.querySelector('.media-body').textContent.trim(),
- ).toEqual('Could not connect to the CI server. Please check your settings and try again');
+ expect(vm.$el.querySelector('.media-body').textContent.trim()).toContain(
+ 'Could not retrieve the pipeline status. For troubleshooting steps, read the documentation.',
+ );
});
describe('with a pipeline', () => {
@@ -78,38 +83,41 @@ describe('MRWidgetPipeline', () => {
pipeline: mockData.pipeline,
hasCi: true,
ciStatus: 'success',
+ troubleshootingDocsPath: 'help',
});
});
it('should render pipeline ID', () => {
- expect(
- vm.$el.querySelector('.pipeline-id').textContent.trim(),
- ).toEqual(`#${mockData.pipeline.id}`);
+ expect(vm.$el.querySelector('.pipeline-id').textContent.trim()).toEqual(
+ `#${mockData.pipeline.id}`,
+ );
});
it('should render pipeline status and commit id', () => {
- expect(
- vm.$el.querySelector('.media-body').textContent.trim(),
- ).toContain(mockData.pipeline.details.status.label);
+ expect(vm.$el.querySelector('.media-body').textContent.trim()).toContain(
+ mockData.pipeline.details.status.label,
+ );
- expect(
- vm.$el.querySelector('.js-commit-link').textContent.trim(),
- ).toEqual(mockData.pipeline.commit.short_id);
+ expect(vm.$el.querySelector('.js-commit-link').textContent.trim()).toEqual(
+ mockData.pipeline.commit.short_id,
+ );
- expect(
- vm.$el.querySelector('.js-commit-link').getAttribute('href'),
- ).toEqual(mockData.pipeline.commit.commit_path);
+ expect(vm.$el.querySelector('.js-commit-link').getAttribute('href')).toEqual(
+ mockData.pipeline.commit.commit_path,
+ );
});
it('should render pipeline graph', () => {
expect(vm.$el.querySelector('.mr-widget-pipeline-graph')).toBeDefined();
- expect(vm.$el.querySelectorAll('.stage-container').length).toEqual(mockData.pipeline.details.stages.length);
+ expect(vm.$el.querySelectorAll('.stage-container').length).toEqual(
+ mockData.pipeline.details.stages.length,
+ );
});
it('should render coverage information', () => {
- expect(
- vm.$el.querySelector('.media-body').textContent,
- ).toContain(`Coverage ${mockData.pipeline.coverage}`);
+ expect(vm.$el.querySelector('.media-body').textContent).toContain(
+ `Coverage ${mockData.pipeline.coverage}`,
+ );
});
});
@@ -122,34 +130,35 @@ describe('MRWidgetPipeline', () => {
pipeline: mockCopy.pipeline,
hasCi: true,
ciStatus: 'success',
+ troubleshootingDocsPath: 'help',
});
});
it('should render pipeline ID', () => {
- expect(
- vm.$el.querySelector('.pipeline-id').textContent.trim(),
- ).toEqual(`#${mockData.pipeline.id}`);
+ expect(vm.$el.querySelector('.pipeline-id').textContent.trim()).toEqual(
+ `#${mockData.pipeline.id}`,
+ );
});
it('should render pipeline status', () => {
- expect(
- vm.$el.querySelector('.media-body').textContent.trim(),
- ).toContain(mockData.pipeline.details.status.label);
+ expect(vm.$el.querySelector('.media-body').textContent.trim()).toContain(
+ mockData.pipeline.details.status.label,
+ );
- expect(
- vm.$el.querySelector('.js-commit-link'),
- ).toBeNull();
+ expect(vm.$el.querySelector('.js-commit-link')).toBeNull();
});
it('should render pipeline graph', () => {
expect(vm.$el.querySelector('.mr-widget-pipeline-graph')).toBeDefined();
- expect(vm.$el.querySelectorAll('.stage-container').length).toEqual(mockData.pipeline.details.stages.length);
+ expect(vm.$el.querySelectorAll('.stage-container').length).toEqual(
+ mockData.pipeline.details.stages.length,
+ );
});
it('should render coverage information', () => {
- expect(
- vm.$el.querySelector('.media-body').textContent,
- ).toContain(`Coverage ${mockData.pipeline.coverage}`);
+ expect(vm.$el.querySelector('.media-body').textContent).toContain(
+ `Coverage ${mockData.pipeline.coverage}`,
+ );
});
});
@@ -162,11 +171,10 @@ describe('MRWidgetPipeline', () => {
pipeline: mockCopy.pipeline,
hasCi: true,
ciStatus: 'success',
+ troubleshootingDocsPath: 'help',
});
- expect(
- vm.$el.querySelector('.media-body').textContent,
- ).not.toContain('Coverage');
+ expect(vm.$el.querySelector('.media-body').textContent).not.toContain('Coverage');
});
});
@@ -179,6 +187,7 @@ describe('MRWidgetPipeline', () => {
pipeline: mockCopy.pipeline,
hasCi: true,
ciStatus: 'success',
+ troubleshootingDocsPath: 'help',
});
expect(vm.$el.querySelector('.js-mini-pipeline-graph')).toEqual(null);
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js
index b453d180a40..14d6e8d7556 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js
@@ -39,13 +39,16 @@ describe('Merge request widget rebase component', () => {
});
it('it should render rebase button and warning message', () => {
- const text = vm.$el.querySelector('.rebase-state-find-class-convention span').textContent.trim();
+ const text = vm.$el
+ .querySelector('.rebase-state-find-class-convention span')
+ .textContent.trim();
+
expect(text).toContain('Fast-forward merge is not possible.');
expect(text).toContain('Rebase the source branch onto the target branch or merge target');
expect(text).toContain('branch into source branch to allow this merge request to be merged.');
});
- it('it should render error message when it fails', (done) => {
+ it('it should render error message when it fails', done => {
vm.rebasingError = 'Something went wrong!';
Vue.nextTick(() => {
@@ -68,7 +71,9 @@ describe('Merge request widget rebase component', () => {
service: {},
});
- const text = vm.$el.querySelector('.rebase-state-find-class-convention span').textContent.trim();
+ const text = vm.$el
+ .querySelector('.rebase-state-find-class-convention span')
+ .textContent.trim();
expect(text).toContain('Fast-forward merge is not possible.');
expect(text).toContain('Rebase the source branch onto');
@@ -78,7 +83,7 @@ describe('Merge request widget rebase component', () => {
});
describe('methods', () => {
- it('checkRebaseStatus', (done) => {
+ it('checkRebaseStatus', done => {
spyOn(eventHub, '$emit');
vm = mountComponent(Component, {
mr: {},
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js
index 5de6ac4079d..7a5d0efdea5 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js
@@ -5,7 +5,7 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper';
describe('MRWidgetRelatedLinks', () => {
let vm;
- const createComponent = (data) => {
+ const createComponent = data => {
const Component = Vue.extend(relatedLinksComponent);
return mountComponent(Component, data);
@@ -19,16 +19,19 @@ describe('MRWidgetRelatedLinks', () => {
describe('closesText', () => {
it('returns Closes text for open merge request', () => {
vm = createComponent({ state: 'open', relatedLinks: {} });
+
expect(vm.closesText).toEqual('Closes');
});
it('returns correct text for closed merge request', () => {
vm = createComponent({ state: 'closed', relatedLinks: {} });
+
expect(vm.closesText).toEqual('Did not close');
});
it('returns correct tense for merged request', () => {
vm = createComponent({ state: 'merged', relatedLinks: {} });
+
expect(vm.closesText).toEqual('Closed');
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js
index 0b25500caf4..a0a336ae604 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js
@@ -17,6 +17,7 @@ describe('MR widget status icon component', () => {
describe('while loading', () => {
it('renders loading icon', () => {
vm = mountComponent(Component, { status: 'loading' });
+
expect(vm.$el.querySelector('.mr-widget-icon i').classList).toContain('fa-spinner');
});
});
@@ -24,6 +25,7 @@ describe('MR widget status icon component', () => {
describe('with status icon', () => {
it('renders ci status icon', () => {
vm = mountComponent(Component, { status: 'failed' });
+
expect(vm.$el.querySelector('.js-ci-status-icon-failed')).not.toBeNull();
});
});
@@ -31,6 +33,7 @@ describe('MR widget status icon component', () => {
describe('with disabled button', () => {
it('renders a disabled button', () => {
vm = mountComponent(Component, { status: 'failed', showDisabledButton: true });
+
expect(vm.$el.querySelector('.js-disabled-merge-button').textContent.trim()).toEqual('Merge');
});
});
@@ -38,6 +41,7 @@ describe('MR widget status icon component', () => {
describe('without disabled button', () => {
it('does not render a disabled button', () => {
vm = mountComponent(Component, { status: 'failed' });
+
expect(vm.$el.querySelector('.js-disabled-merge-button')).toBeNull();
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js b/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js
new file mode 100644
index 00000000000..68a65bd21c6
--- /dev/null
+++ b/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js
@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import component from '~/vue_merge_request_widget/components/review_app_link.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('review app link', () => {
+ const Component = Vue.extend(component);
+ const props = {
+ link: '/review',
+ cssClass: 'js-link',
+ };
+ let vm;
+ let el;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, props);
+ el = vm.$el;
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders provided link as href attribute', () => {
+ expect(el.getAttribute('href')).toEqual(props.link);
+ });
+
+ it('renders provided cssClass as class attribute', () => {
+ expect(el.getAttribute('class')).toEqual(props.cssClass);
+ });
+
+ it('renders View app text', () => {
+ expect(el.textContent.trim()).toEqual('View app');
+ });
+
+ it('renders svg icon', () => {
+ expect(el.querySelector('svg')).not.toBeNull();
+ });
+});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js
index e818f87b4c8..b90f5881a4d 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js
@@ -24,8 +24,8 @@ describe('MRWidgetArchived', () => {
});
it('renders information', () => {
- expect(
- vm.$el.querySelector('.bold').textContent.trim(),
- ).toEqual('This project is archived, write access has been disabled');
+ expect(vm.$el.querySelector('.bold').textContent.trim()).toEqual(
+ 'This project is archived, write access has been disabled',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js
index d069dc3fcc6..eb4fa0df727 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js
@@ -30,7 +30,7 @@ describe('MRWidgetAutoMergeFailed', () => {
expect(vm.$el.querySelector('button').textContent.trim()).toEqual('Refresh');
});
- it('emits event and shows loading icon when button is clicked', (done) => {
+ it('emits event and shows loading icon when button is clicked', done => {
spyOn(eventHub, '$emit');
vm.$el.querySelector('button').click();
@@ -38,9 +38,7 @@ describe('MRWidgetAutoMergeFailed', () => {
Vue.nextTick(() => {
expect(vm.$el.querySelector('button').getAttribute('disabled')).toEqual('disabled');
- expect(
- vm.$el.querySelector('button i').classList,
- ).toContain('fa-spinner');
+ expect(vm.$el.querySelector('button i').classList).toContain('fa-spinner');
done();
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js
index 658612aad3c..7da27bb8890 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js
@@ -24,6 +24,8 @@ describe('MRWidgetChecking', () => {
});
it('renders information about merging', () => {
- expect(vm.$el.querySelector('.media-body').textContent.trim()).toEqual('Checking ability to merge automatically');
+ expect(vm.$el.querySelector('.media-body').textContent.trim()).toEqual(
+ 'Checking ability to merge automatically',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js
index 0e3c134d3ac..9523e7d5474 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js
@@ -7,23 +7,26 @@ describe('MRWidgetClosed', () => {
beforeEach(() => {
const Component = Vue.extend(closedComponent);
- vm = mountComponent(Component, { mr: {
- metrics: {
- mergedBy: {},
- closedBy: {
- name: 'Administrator',
- username: 'root',
- webUrl: 'http://localhost:3000/root',
- avatarUrl: 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ vm = mountComponent(Component, {
+ mr: {
+ metrics: {
+ mergedBy: {},
+ closedBy: {
+ name: 'Administrator',
+ username: 'root',
+ webUrl: 'http://localhost:3000/root',
+ avatarUrl:
+ 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ },
+ mergedAt: 'Jan 24, 2018 1:02pm GMT+0000',
+ closedAt: 'Jan 24, 2018 1:02pm GMT+0000',
+ readableMergedAt: '',
+ readableClosedAt: 'less than a minute ago',
},
- mergedAt: 'Jan 24, 2018 1:02pm GMT+0000',
- closedAt: 'Jan 24, 2018 1:02pm GMT+0000',
- readableMergedAt: '',
- readableClosedAt: 'less than a minute ago',
+ targetBranchPath: '/twitter/flight/commits/so_long_jquery',
+ targetBranch: 'so_long_jquery',
},
- targetBranchPath: '/twitter/flight/commits/so_long_jquery',
- targetBranch: 'so_long_jquery',
- } });
+ });
});
afterEach(() => {
@@ -36,23 +39,31 @@ describe('MRWidgetClosed', () => {
it('renders closed by information with author and time', () => {
expect(
- vm.$el.querySelector('.js-mr-widget-author').textContent.trim().replace(/\s\s+/g, ' '),
- ).toContain(
- 'Closed by Administrator less than a minute ago',
- );
+ vm.$el
+ .querySelector('.js-mr-widget-author')
+ .textContent.trim()
+ .replace(/\s\s+/g, ' '),
+ ).toContain('Closed by Administrator less than a minute ago');
});
it('links to the user that closed the MR', () => {
- expect(vm.$el.querySelector('.author-link').getAttribute('href')).toEqual('http://localhost:3000/root');
+ expect(vm.$el.querySelector('.author-link').getAttribute('href')).toEqual(
+ 'http://localhost:3000/root',
+ );
});
it('renders information about the changes not being merged', () => {
expect(
- vm.$el.querySelector('.mr-info-list').textContent.trim().replace(/\s\s+/g, ' '),
+ vm.$el
+ .querySelector('.mr-info-list')
+ .textContent.trim()
+ .replace(/\s\s+/g, ' '),
).toContain('The changes were not merged into so_long_jquery');
});
it('renders link for target branch', () => {
- expect(vm.$el.querySelector('.label-branch').getAttribute('href')).toEqual('/twitter/flight/commits/so_long_jquery');
+ expect(vm.$el.querySelector('.label-branch').getAttribute('href')).toEqual(
+ '/twitter/flight/commits/so_long_jquery',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
index 3d05dbfa305..f9cd5c8bd3c 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
@@ -59,7 +59,9 @@ describe('MRWidgetConflicts', () => {
});
it('should show proper message', () => {
- expect(vm.$el.textContent.trim().replace(/\s\s+/g, ' ')).toContain('ask someone with write access');
+ expect(vm.$el.textContent.trim().replace(/\s\s+/g, ' ')).toContain(
+ 'ask someone with write access',
+ );
});
it('should not have action buttons', () => {
@@ -79,9 +81,9 @@ describe('MRWidgetConflicts', () => {
});
it('should tell you to rebase locally', () => {
- expect(
- removeBreakLine(vm.$el.textContent).trim(),
- ).toContain('Fast-forward merge is not possible. To merge this request, first rebase locally.');
+ expect(removeBreakLine(vm.$el.textContent).trim()).toContain(
+ 'Fast-forward merge is not possible. To merge this request, first rebase locally.',
+ );
});
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js
index 8de99fd3c96..3229ddd5e27 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js
@@ -43,6 +43,7 @@ describe('MRWidgetFailedToMerge', () => {
expect(vm.timerText).toEqual('Refreshing in 10 seconds to show the updated status...');
vm.timer = 1;
+
expect(vm.timerText).toEqual('Refreshing in a second to show the updated status...');
});
});
@@ -73,6 +74,7 @@ describe('MRWidgetFailedToMerge', () => {
expect(vm.isRefreshing).toEqual(false);
vm.refresh();
+
expect(vm.isRefreshing).toEqual(true);
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
expect(eventHub.$emit).toHaveBeenCalledWith('EnablePolling');
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merge_when_pipeline_succeeds_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merge_when_pipeline_succeeds_spec.js
index d47815a5b5a..d46ad0acc9b 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merge_when_pipeline_succeeds_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merge_when_pipeline_succeeds_spec.js
@@ -42,22 +42,27 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
it('should return false when user id is not the same with who set the MWPS', () => {
vm.mr.mergeUserId = 2;
+
expect(vm.canRemoveSourceBranch).toBeFalsy();
vm.mr.currentUserId = 2;
+
expect(vm.canRemoveSourceBranch).toBeTruthy();
vm.mr.currentUserId = 3;
+
expect(vm.canRemoveSourceBranch).toBeFalsy();
});
it('should return false when shouldRemoveSourceBranch set to false', () => {
vm.mr.shouldRemoveSourceBranch = true;
+
expect(vm.canRemoveSourceBranch).toBeFalsy();
});
it('should return false if user is not able to remove the source branch', () => {
vm.mr.canRemoveSourceBranch = false;
+
expect(vm.canRemoveSourceBranch).toBeFalsy();
});
});
@@ -65,15 +70,17 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
describe('methods', () => {
describe('cancelAutomaticMerge', () => {
- it('should set flag and call service then tell main component to update the widget with data', (done) => {
+ it('should set flag and call service then tell main component to update the widget with data', done => {
const mrObj = {
is_new_mr_data: true,
};
- spyOn(vm.service, 'cancelAutomaticMerge').and.returnValue(new Promise((resolve) => {
- resolve({
- data: mrObj,
- });
- }));
+ spyOn(vm.service, 'cancelAutomaticMerge').and.returnValue(
+ new Promise(resolve => {
+ resolve({
+ data: mrObj,
+ });
+ }),
+ );
vm.cancelAutomaticMerge();
setTimeout(() => {
@@ -85,12 +92,14 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
});
describe('removeSourceBranch', () => {
- it('should set flag and call service then request main component to update the widget', (done) => {
- spyOn(vm.service, 'merge').and.returnValue(Promise.resolve({
- data: {
- status: 'merge_when_pipeline_succeeds',
- },
- }));
+ it('should set flag and call service then request main component to update the widget', done => {
+ spyOn(vm.service, 'merge').and.returnValue(
+ Promise.resolve({
+ data: {
+ status: 'merge_when_pipeline_succeeds',
+ },
+ }),
+ );
vm.removeSourceBranch();
setTimeout(() => {
@@ -113,13 +122,19 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
expect(vm.$el.innerText).toContain('The changes will be merged into');
expect(vm.$el.innerText).toContain(targetBranch);
expect(vm.$el.innerText).toContain('The source branch will not be removed');
- expect(vm.$el.querySelector('.js-cancel-auto-merge').innerText).toContain('Cancel automatic merge');
+ expect(vm.$el.querySelector('.js-cancel-auto-merge').innerText).toContain(
+ 'Cancel automatic merge',
+ );
+
expect(vm.$el.querySelector('.js-cancel-auto-merge').getAttribute('disabled')).toBeFalsy();
- expect(vm.$el.querySelector('.js-remove-source-branch').innerText).toContain('Remove source branch');
+ expect(vm.$el.querySelector('.js-remove-source-branch').innerText).toContain(
+ 'Remove source branch',
+ );
+
expect(vm.$el.querySelector('.js-remove-source-branch').getAttribute('disabled')).toBeFalsy();
});
- it('should disable cancel auto merge button when the action is in progress', (done) => {
+ it('should disable cancel auto merge button when the action is in progress', done => {
vm.isCancellingAutoMerge = true;
Vue.nextTick(() => {
@@ -128,18 +143,19 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
});
});
- it('should show source branch will be removed text when it source branch set to remove', (done) => {
+ it('should show source branch will be removed text when it source branch set to remove', done => {
vm.mr.shouldRemoveSourceBranch = true;
Vue.nextTick(() => {
const normalizedText = vm.$el.innerText.replace(/\s+/g, ' ');
+
expect(normalizedText).toContain('The source branch will be removed');
expect(normalizedText).not.toContain('The source branch will not be removed');
done();
});
});
- it('should not show remove source branch button when user not able to remove source branch', (done) => {
+ it('should not show remove source branch button when user not able to remove source branch', done => {
vm.mr.currentUserId = 4;
Vue.nextTick(() => {
@@ -148,11 +164,13 @@ describe('MRWidgetMergeWhenPipelineSucceeds', () => {
});
});
- it('should disable remove source branch button when the action is in progress', (done) => {
+ it('should disable remove source branch button when the action is in progress', done => {
vm.isRemovingSourceBranch = true;
Vue.nextTick(() => {
- expect(vm.$el.querySelector('.js-remove-source-branch').getAttribute('disabled')).toBeTruthy();
+ expect(
+ vm.$el.querySelector('.js-remove-source-branch').getAttribute('disabled'),
+ ).toBeTruthy();
done();
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js
index efa5c878678..da5cb752c6f 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js
@@ -30,7 +30,8 @@ describe('MRWidgetMerged', () => {
name: 'Administrator',
username: 'root',
webUrl: 'http://localhost:3000/root',
- avatarUrl: 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ avatarUrl:
+ 'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
},
mergedAt: 'Jan 24, 2018 1:02pm GMT+0000',
readableMergedAt: '',
@@ -41,7 +42,8 @@ describe('MRWidgetMerged', () => {
updatedAt: 'mergedUpdatedAt',
shortMergeCommitSha: '958c0475',
mergeCommitSha: '958c047516e182dfc52317f721f696e8a1ee85ed',
- mergeCommitPath: 'http://localhost:3000/root/nautilus/commit/f7ce827c314c9340b075657fd61c789fb01cf74d',
+ mergeCommitPath:
+ 'http://localhost:3000/root/nautilus/commit/f7ce827c314c9340b075657fd61c789fb01cf74d',
sourceBranch: 'bar',
targetBranch,
};
@@ -63,23 +65,27 @@ describe('MRWidgetMerged', () => {
describe('shouldShowRemoveSourceBranch', () => {
it('returns true when sourceBranchRemoved is false', () => {
vm.mr.sourceBranchRemoved = false;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(true);
});
- it('returns false wehn sourceBranchRemoved is true', () => {
+ it('returns false when sourceBranchRemoved is true', () => {
vm.mr.sourceBranchRemoved = true;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(false);
});
it('returns false when canRemoveSourceBranch is false', () => {
vm.mr.sourceBranchRemoved = false;
vm.mr.canRemoveSourceBranch = false;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(false);
});
it('returns false when is making request', () => {
vm.mr.canRemoveSourceBranch = true;
vm.isMakingRequest = true;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(false);
});
@@ -87,6 +93,7 @@ describe('MRWidgetMerged', () => {
vm.mr.isRemovingSourceBranch = true;
vm.mr.canRemoveSourceBranch = true;
vm.isMakingRequest = true;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(false);
});
});
@@ -94,17 +101,21 @@ describe('MRWidgetMerged', () => {
describe('shouldShowSourceBranchRemoving', () => {
it('should correct value when fields changed', () => {
vm.mr.sourceBranchRemoved = false;
+
expect(vm.shouldShowSourceBranchRemoving).toEqual(false);
vm.mr.sourceBranchRemoved = true;
+
expect(vm.shouldShowRemoveSourceBranch).toEqual(false);
vm.mr.sourceBranchRemoved = false;
vm.isMakingRequest = true;
+
expect(vm.shouldShowSourceBranchRemoving).toEqual(true);
vm.isMakingRequest = false;
vm.mr.isRemovingSourceBranch = true;
+
expect(vm.shouldShowSourceBranchRemoving).toEqual(true);
});
});
@@ -112,18 +123,21 @@ describe('MRWidgetMerged', () => {
describe('methods', () => {
describe('removeSourceBranch', () => {
- it('should set flag and call service then request main component to update the widget', (done) => {
- spyOn(vm.service, 'removeSourceBranch').and.returnValue(new Promise((resolve) => {
- resolve({
- data: {
- message: 'Branch was removed',
- },
- });
- }));
+ it('should set flag and call service then request main component to update the widget', done => {
+ spyOn(vm.service, 'removeSourceBranch').and.returnValue(
+ new Promise(resolve => {
+ resolve({
+ data: {
+ message: 'Branch was removed',
+ },
+ });
+ }),
+ );
vm.removeSourceBranch();
setTimeout(() => {
const args = eventHub.$emit.calls.argsFor(0);
+
expect(vm.isMakingRequest).toEqual(true);
expect(args[0]).toEqual('MRWidgetUpdateRequested');
expect(args[1]).not.toThrow();
@@ -154,7 +168,19 @@ describe('MRWidgetMerged', () => {
it('shows button to copy commit SHA to clipboard', () => {
expect(selectors.copyMergeShaButton).toExist();
- expect(selectors.copyMergeShaButton.getAttribute('data-clipboard-text')).toBe(vm.mr.mergeCommitSha);
+ expect(selectors.copyMergeShaButton.getAttribute('data-clipboard-text')).toBe(
+ vm.mr.mergeCommitSha,
+ );
+ });
+
+ it('hides button to copy commit SHA if SHA does not exist', done => {
+ vm.mr.mergeCommitSha = null;
+
+ Vue.nextTick(() => {
+ expect(selectors.copyMergeShaButton).not.toExist();
+ expect(vm.$el.querySelector('.mr-info-list').innerText).not.toContain('with');
+ done();
+ });
});
it('shows merge commit SHA link', () => {
@@ -163,7 +189,7 @@ describe('MRWidgetMerged', () => {
expect(selectors.mergeCommitShaLink.href).toBe(vm.mr.mergeCommitPath);
});
- it('should not show source branch removed text', (done) => {
+ it('should not show source branch removed text', done => {
vm.mr.sourceBranchRemoved = false;
Vue.nextTick(() => {
@@ -173,7 +199,7 @@ describe('MRWidgetMerged', () => {
});
});
- it('should show source branch removing text', (done) => {
+ it('should show source branch removing text', done => {
vm.mr.isRemovingSourceBranch = true;
vm.mr.sourceBranchRemoved = false;
@@ -186,8 +212,8 @@ describe('MRWidgetMerged', () => {
});
it('should use mergedEvent mergedAt as tooltip title', () => {
- expect(
- vm.$el.querySelector('time').getAttribute('data-original-title'),
- ).toBe('Jan 24, 2018 1:02pm GMT+0000');
+ expect(vm.$el.querySelector('time').getAttribute('data-original-title')).toBe(
+ 'Jan 24, 2018 1:02pm GMT+0000',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js
index d2d219e4bdb..57773d1648a 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js
@@ -7,10 +7,12 @@ describe('MRWidgetMerging', () => {
beforeEach(() => {
const Component = Vue.extend(mergingComponent);
- vm = mountComponent(Component, { mr: {
- targetBranchPath: '/branch-path',
- targetBranch: 'branch',
- } });
+ vm = mountComponent(Component, {
+ mr: {
+ targetBranchPath: '/branch-path',
+ targetBranch: 'branch',
+ },
+ });
});
afterEach(() => {
@@ -19,16 +21,23 @@ describe('MRWidgetMerging', () => {
it('renders information about merge request being merged', () => {
expect(
- vm.$el.querySelector('.media-body').textContent.trim().replace(/\s\s+/g, ' ').replace(/[\r\n]+/g, ' '),
+ vm.$el
+ .querySelector('.media-body')
+ .textContent.trim()
+ .replace(/\s\s+/g, ' ')
+ .replace(/[\r\n]+/g, ' '),
).toContain('This merge request is in the process of being merged');
});
it('renders branch information', () => {
expect(
- vm.$el.querySelector('.mr-info-list').textContent.trim().replace(/\s\s+/g, ' ').replace(/[\r\n]+/g, ' '),
+ vm.$el
+ .querySelector('.mr-info-list')
+ .textContent.trim()
+ .replace(/\s\s+/g, ' ')
+ .replace(/[\r\n]+/g, ' '),
).toEqual('The changes will be merged into branch');
- expect(
- vm.$el.querySelector('a').getAttribute('href'),
- ).toEqual('/branch-path');
+
+ expect(vm.$el.querySelector('a').getAttribute('href')).toEqual('/branch-path');
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js
index 34f76b39b28..096301837c4 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js
@@ -20,6 +20,7 @@ describe('MRWidgetMissingBranch', () => {
expect(vm.missingBranchName).toEqual('source');
vm.mr.sourceBranchRemoved = false;
+
expect(vm.missingBranchName).toEqual('target');
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js
index 9f8b96c118b..6b95ca3460b 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js
@@ -19,6 +19,8 @@ describe('MRWidgetNotAllowed', () => {
it('renders informative text', () => {
expect(vm.$el.innerText).toContain('Ready to be merged automatically.');
- expect(vm.$el.innerText).toContain('Ask someone with write access to this repository to merge this request');
+ expect(vm.$el.innerText).toContain(
+ 'Ask someone with write access to this repository to merge this request',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
index 2a762c9336e..babb8cea0ab 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
@@ -15,7 +15,10 @@ describe('NothingToMerge', () => {
it('should have correct elements', () => {
expect(vm.$el.classList.contains('mr-widget-body')).toBeTruthy();
expect(vm.$el.querySelector('a').href).toContain(newBlobPath);
- expect(vm.$el.innerText).toContain('Currently there are no changes in this merge request\'s source branch');
+ expect(vm.$el.innerText).toContain(
+ "Currently there are no changes in this merge request's source branch",
+ );
+
expect(vm.$el.innerText).toContain('Please push new commits or use a different branch.');
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js
index ab096a56918..477041fa383 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js
@@ -19,8 +19,8 @@ describe('MRWidgetPipelineBlocked', () => {
});
it('renders information text', () => {
- expect(
- removeBreakLine(vm.$el.textContent).trim(),
- ).toContain('Pipeline blocked. The pipeline for this merge request requires a manual action to proceed');
+ expect(removeBreakLine(vm.$el.textContent).trim()).toContain(
+ 'Pipeline blocked. The pipeline for this merge request requires a manual action to proceed',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js
index 5573d7c5c93..f7523a01963 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js
@@ -11,9 +11,9 @@ describe('PipelineFailed', () => {
it('should have correct elements', () => {
expect(vm.$el.classList.contains('mr-widget-body')).toBeTruthy();
expect(vm.$el.querySelector('button').getAttribute('disabled')).toBeTruthy();
- expect(
- removeBreakLine(vm.$el.innerText).trim(),
- ).toContain('The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure');
+ expect(removeBreakLine(vm.$el.innerText).trim()).toContain(
+ 'The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure',
+ );
});
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
index 81c16593eb4..2119a3b927a 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -76,11 +76,13 @@ describe('ReadyToMerge', () => {
describe('shouldShowMergeWhenPipelineSucceedsText', () => {
it('should return true with active pipeline', () => {
vm.mr.isPipelineActive = true;
+
expect(vm.shouldShowMergeWhenPipelineSucceedsText).toBeTruthy();
});
it('should return false with inactive pipeline', () => {
vm.mr.isPipelineActive = false;
+
expect(vm.shouldShowMergeWhenPipelineSucceedsText).toBeFalsy();
});
});
@@ -95,6 +97,7 @@ describe('ReadyToMerge', () => {
it('should return message without description', () => {
vm.useCommitMessageWithDescription = true;
+
expect(vm.commitMessageLinkTitle).toEqual(withoutDesc);
});
});
@@ -102,11 +105,13 @@ describe('ReadyToMerge', () => {
describe('status', () => {
it('defaults to success', () => {
vm.mr.pipeline = true;
+
expect(vm.status).toEqual('success');
});
it('returns failed when MR has CI but also has an unknown status', () => {
vm.mr.hasCI = true;
+
expect(vm.status).toEqual('failed');
});
@@ -117,12 +122,14 @@ describe('ReadyToMerge', () => {
it('returns pending when pipeline is active', () => {
vm.mr.pipeline = {};
vm.mr.isPipelineActive = true;
+
expect(vm.status).toEqual('pending');
});
it('returns failed when pipeline is failed', () => {
vm.mr.pipeline = {};
vm.mr.isPipelineFailed = true;
+
expect(vm.status).toEqual('failed');
});
});
@@ -138,17 +145,20 @@ describe('ReadyToMerge', () => {
it('returns success class for success status', () => {
vm.mr.pipeline = true;
+
expect(vm.mergeButtonClass).toEqual(defaultClass);
});
it('returns info class for pending status', () => {
vm.mr.pipeline = {};
vm.mr.isPipelineActive = true;
+
expect(vm.mergeButtonClass).toEqual(inActionClass);
});
it('returns failed class for failed status', () => {
vm.mr.hasCI = true;
+
expect(vm.mergeButtonClass).toEqual(failedClass);
});
});
@@ -160,22 +170,26 @@ describe('ReadyToMerge', () => {
it('shows tick for success status', () => {
vm.mr.pipeline = true;
+
expect(vm.iconClass).toEqual('success');
});
it('shows tick for pending status', () => {
vm.mr.pipeline = {};
vm.mr.isPipelineActive = true;
+
expect(vm.iconClass).toEqual('success');
});
it('shows warning icon for failed status', () => {
vm.mr.hasCI = true;
+
expect(vm.iconClass).toEqual('warning');
});
it('shows warning icon for merge not allowed', () => {
vm.mr.hasCI = true;
+
expect(vm.iconClass).toEqual('warning');
});
});
@@ -187,12 +201,14 @@ describe('ReadyToMerge', () => {
it('should return Merge in progress', () => {
vm.isMergingImmediately = true;
+
expect(vm.mergeButtonText).toEqual('Merge in progress');
});
it('should return Merge when pipeline succeeds', () => {
vm.isMergingImmediately = false;
vm.mr.isPipelineActive = true;
+
expect(vm.mergeButtonText).toEqual('Merge when pipeline succeeds');
});
});
@@ -204,12 +220,14 @@ describe('ReadyToMerge', () => {
it('should return true when pipeline active', () => {
vm.mr.isPipelineActive = true;
+
expect(vm.shouldShowMergeOptionsDropdown).toBeTruthy();
});
it('should return false when pipeline active but only merge when pipeline succeeds set in project options', () => {
vm.mr.isPipelineActive = true;
vm.mr.onlyAllowMergeIfPipelineSucceeds = true;
+
expect(vm.shouldShowMergeOptionsDropdown).toBeFalsy();
});
});
@@ -217,24 +235,28 @@ describe('ReadyToMerge', () => {
describe('isMergeButtonDisabled', () => {
it('should return false with initial data', () => {
vm.mr.isMergeAllowed = true;
+
expect(vm.isMergeButtonDisabled).toBeFalsy();
});
it('should return true when there is no commit message', () => {
vm.mr.isMergeAllowed = true;
vm.commitMessage = '';
+
expect(vm.isMergeButtonDisabled).toBeTruthy();
});
it('should return true if merge is not allowed', () => {
vm.mr.isMergeAllowed = false;
vm.mr.onlyAllowMergeIfPipelineSucceeds = true;
+
expect(vm.isMergeButtonDisabled).toBeTruthy();
});
it('should return true when the vm instance is making request', () => {
vm.mr.isMergeAllowed = true;
vm.isMakingRequest = true;
+
expect(vm.isMergeButtonDisabled).toBeTruthy();
});
});
@@ -245,24 +267,28 @@ describe('ReadyToMerge', () => {
it('should return false when an external pipeline is running and required to succeed', () => {
vm.mr.isMergeAllowed = false;
vm.mr.isPipelineActive = false;
+
expect(vm.shouldShowMergeControls()).toBeFalsy();
});
it('should return true when the build succeeded or build not required to succeed', () => {
vm.mr.isMergeAllowed = true;
vm.mr.isPipelineActive = false;
+
expect(vm.shouldShowMergeControls()).toBeTruthy();
});
it('should return true when showing the MWPS button and a pipeline is running that needs to be successful', () => {
vm.mr.isMergeAllowed = false;
vm.mr.isPipelineActive = true;
+
expect(vm.shouldShowMergeControls()).toBeTruthy();
});
it('should return true when showing the MWPS button but not required for the pipeline to succeed', () => {
vm.mr.isMergeAllowed = true;
vm.mr.isPipelineActive = true;
+
expect(vm.shouldShowMergeControls()).toBeTruthy();
});
});
@@ -272,9 +298,11 @@ describe('ReadyToMerge', () => {
expect(vm.useCommitMessageWithDescription).toBeFalsy();
expect(vm.commitMessage).toEqual(commitMessage);
vm.updateCommitMessage();
+
expect(vm.useCommitMessageWithDescription).toBeTruthy();
expect(vm.commitMessage).toEqual(commitMessageWithDescription);
vm.updateCommitMessage();
+
expect(vm.useCommitMessageWithDescription).toBeFalsy();
expect(vm.commitMessage).toEqual(commitMessage);
});
@@ -284,20 +312,22 @@ describe('ReadyToMerge', () => {
it('should toggle showCommitMessageEditor flag', () => {
expect(vm.showCommitMessageEditor).toBeFalsy();
vm.toggleCommitMessageEditor();
+
expect(vm.showCommitMessageEditor).toBeTruthy();
});
});
describe('handleMergeButtonClick', () => {
- const returnPromise = status => new Promise((resolve) => {
- resolve({
- data: {
- status,
- },
+ const returnPromise = status =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ status,
+ },
+ });
});
- });
- it('should handle merge when pipeline succeeds', (done) => {
+ it('should handle merge when pipeline succeeds', done => {
spyOn(eventHub, '$emit');
spyOn(vm.service, 'merge').and.returnValue(returnPromise('merge_when_pipeline_succeeds'));
vm.removeSourceBranch = false;
@@ -309,6 +339,7 @@ describe('ReadyToMerge', () => {
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
const params = vm.service.merge.calls.argsFor(0)[0];
+
expect(params.sha).toEqual(vm.mr.sha);
expect(params.commit_message).toEqual(vm.mr.commitMessage);
expect(params.should_remove_source_branch).toBeFalsy();
@@ -317,7 +348,7 @@ describe('ReadyToMerge', () => {
}, 333);
});
- it('should handle merge failed', (done) => {
+ it('should handle merge failed', done => {
spyOn(eventHub, '$emit');
spyOn(vm.service, 'merge').and.returnValue(returnPromise('failed'));
vm.handleMergeButtonClick(false, true);
@@ -328,13 +359,14 @@ describe('ReadyToMerge', () => {
expect(eventHub.$emit).toHaveBeenCalledWith('FailedToMerge', undefined);
const params = vm.service.merge.calls.argsFor(0)[0];
+
expect(params.should_remove_source_branch).toBeTruthy();
expect(params.merge_when_pipeline_succeeds).toBeFalsy();
done();
}, 333);
});
- it('should handle merge action accepted case', (done) => {
+ it('should handle merge action accepted case', done => {
spyOn(vm.service, 'merge').and.returnValue(returnPromise('success'));
spyOn(vm, 'initiateMergePolling');
vm.handleMergeButtonClick();
@@ -345,6 +377,7 @@ describe('ReadyToMerge', () => {
expect(vm.initiateMergePolling).toHaveBeenCalled();
const params = vm.service.merge.calls.argsFor(0)[0];
+
expect(params.should_remove_source_branch).toBeTruthy();
expect(params.merge_when_pipeline_succeeds).toBeFalsy();
done();
@@ -356,25 +389,27 @@ describe('ReadyToMerge', () => {
it('should call simplePoll', () => {
const simplePoll = spyOnDependency(ReadyToMerge, 'simplePoll');
vm.initiateMergePolling();
+
expect(simplePoll).toHaveBeenCalled();
});
});
describe('handleMergePolling', () => {
- const returnPromise = state => new Promise((resolve) => {
- resolve({
- data: {
- state,
- source_branch_exists: true,
- },
+ const returnPromise = state =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ state,
+ source_branch_exists: true,
+ },
+ });
});
- });
beforeEach(() => {
loadFixtures('merge_requests/merge_request_of_current_user.html.raw');
});
- it('should call start and stop polling when MR merged', (done) => {
+ it('should call start and stop polling when MR merged', done => {
spyOn(eventHub, '$emit');
spyOn(vm.service, 'poll').and.returnValue(returnPromise('merged'));
spyOn(vm, 'initiateRemoveSourceBranchPolling');
@@ -382,7 +417,14 @@ describe('ReadyToMerge', () => {
let cpc = false; // continuePollingCalled
let spc = false; // stopPollingCalled
- vm.handleMergePolling(() => { cpc = true; }, () => { spc = true; });
+ vm.handleMergePolling(
+ () => {
+ cpc = true;
+ },
+ () => {
+ spc = true;
+ },
+ );
setTimeout(() => {
expect(vm.service.poll).toHaveBeenCalled();
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
@@ -395,7 +437,7 @@ describe('ReadyToMerge', () => {
}, 333);
});
- it('updates status box', (done) => {
+ it('updates status box', done => {
spyOn(vm.service, 'poll').and.returnValue(returnPromise('merged'));
spyOn(vm, 'initiateRemoveSourceBranchPolling');
@@ -403,6 +445,7 @@ describe('ReadyToMerge', () => {
setTimeout(() => {
const statusBox = document.querySelector('.status-box');
+
expect(statusBox.classList.contains('status-box-mr-merged')).toBeTruthy();
expect(statusBox.textContent).toContain('Merged');
@@ -410,7 +453,7 @@ describe('ReadyToMerge', () => {
});
});
- it('hides close button', (done) => {
+ it('hides close button', done => {
spyOn(vm.service, 'poll').and.returnValue(returnPromise('merged'));
spyOn(vm, 'initiateRemoveSourceBranchPolling');
@@ -423,7 +466,7 @@ describe('ReadyToMerge', () => {
});
});
- it('updates merge request count badge', (done) => {
+ it('updates merge request count badge', done => {
spyOn(vm.service, 'poll').and.returnValue(returnPromise('merged'));
spyOn(vm, 'initiateRemoveSourceBranchPolling');
@@ -436,14 +479,21 @@ describe('ReadyToMerge', () => {
});
});
- it('should continue polling until MR is merged', (done) => {
+ it('should continue polling until MR is merged', done => {
spyOn(vm.service, 'poll').and.returnValue(returnPromise('some_other_state'));
spyOn(vm, 'initiateRemoveSourceBranchPolling');
let cpc = false; // continuePollingCalled
let spc = false; // stopPollingCalled
- vm.handleMergePolling(() => { cpc = true; }, () => { spc = true; });
+ vm.handleMergePolling(
+ () => {
+ cpc = true;
+ },
+ () => {
+ spc = true;
+ },
+ );
setTimeout(() => {
expect(cpc).toBeTruthy();
expect(spc).toBeFalsy();
@@ -459,35 +509,46 @@ describe('ReadyToMerge', () => {
const simplePoll = spyOnDependency(ReadyToMerge, 'simplePoll');
vm.initiateRemoveSourceBranchPolling();
+
expect(eventHub.$emit).toHaveBeenCalledWith('SetBranchRemoveFlag', [true]);
expect(simplePoll).toHaveBeenCalled();
});
});
describe('handleRemoveBranchPolling', () => {
- const returnPromise = state => new Promise((resolve) => {
- resolve({
- data: {
- source_branch_exists: state,
- },
+ const returnPromise = state =>
+ new Promise(resolve => {
+ resolve({
+ data: {
+ source_branch_exists: state,
+ },
+ });
});
- });
- it('should call start and stop polling when MR merged', (done) => {
+ it('should call start and stop polling when MR merged', done => {
spyOn(eventHub, '$emit');
spyOn(vm.service, 'poll').and.returnValue(returnPromise(false));
let cpc = false; // continuePollingCalled
let spc = false; // stopPollingCalled
- vm.handleRemoveBranchPolling(() => { cpc = true; }, () => { spc = true; });
+ vm.handleRemoveBranchPolling(
+ () => {
+ cpc = true;
+ },
+ () => {
+ spc = true;
+ },
+ );
setTimeout(() => {
expect(vm.service.poll).toHaveBeenCalled();
const args = eventHub.$emit.calls.argsFor(0);
+
expect(args[0]).toEqual('MRWidgetUpdateRequested');
expect(args[1]).toBeDefined();
args[1]();
+
expect(eventHub.$emit).toHaveBeenCalledWith('SetBranchRemoveFlag', [false]);
expect(cpc).toBeFalsy();
@@ -497,13 +558,20 @@ describe('ReadyToMerge', () => {
}, 333);
});
- it('should continue polling until MR is merged', (done) => {
+ it('should continue polling until MR is merged', done => {
spyOn(vm.service, 'poll').and.returnValue(returnPromise(true));
let cpc = false; // continuePollingCalled
let spc = false; // stopPollingCalled
- vm.handleRemoveBranchPolling(() => { cpc = true; }, () => { spc = true; });
+ vm.handleRemoveBranchPolling(
+ () => {
+ cpc = true;
+ },
+ () => {
+ spc = true;
+ },
+ );
setTimeout(() => {
expect(cpc).toBeTruthy();
expect(spc).toBeFalsy();
@@ -518,6 +586,7 @@ describe('ReadyToMerge', () => {
describe('when user can merge but cannot delete branch', () => {
it('should be disabled in the rendered output', () => {
const checkboxElement = vm.$el.querySelector('#remove-source-branch-input');
+
expect(checkboxElement).toBeNull();
});
});
@@ -537,6 +606,7 @@ describe('ReadyToMerge', () => {
it('should be enabled in rendered output', () => {
const checkboxElement = customVm.$el.querySelector('#remove-source-branch-input');
+
expect(checkboxElement).not.toBeNull();
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js
index abf642c166a..36f8c7a9683 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js
@@ -18,8 +18,8 @@ describe('ShaMismatch', () => {
it('should render information message', () => {
expect(vm.$el.querySelector('button').disabled).toEqual(true);
- expect(
- removeBreakLine(vm.$el.textContent).trim(),
- ).toContain('The source branch HEAD has recently changed. Please reload the page and review the changes before merging');
+ expect(removeBreakLine(vm.$el.textContent).trim()).toContain(
+ 'The source branch HEAD has recently changed. Please reload the page and review the changes before merging',
+ );
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js
index d797f1266df..bd64d7b2926 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js
@@ -12,13 +12,18 @@ describe('UnresolvedDiscussions', () => {
describe('with discussions path', () => {
beforeEach(() => {
- vm = mountComponent(Component, { mr: {
- createIssueToResolveDiscussionsPath: gl.TEST_HOST,
- } });
+ vm = mountComponent(Component, {
+ mr: {
+ createIssueToResolveDiscussionsPath: gl.TEST_HOST,
+ },
+ });
});
it('should have correct elements', () => {
- expect(vm.$el.innerText).toContain('There are unresolved discussions. Please resolve these discussions');
+ expect(vm.$el.innerText).toContain(
+ 'There are unresolved discussions. Please resolve these discussions',
+ );
+
expect(vm.$el.innerText).toContain('Create an issue to resolve them later');
expect(vm.$el.querySelector('.js-create-issue').getAttribute('href')).toEqual(gl.TEST_HOST);
});
@@ -30,7 +35,10 @@ describe('UnresolvedDiscussions', () => {
});
it('should not show create issue link if user cannot create issue', () => {
- expect(vm.$el.innerText).toContain('There are unresolved discussions. Please resolve these discussions');
+ expect(vm.$el.innerText).toContain(
+ 'There are unresolved discussions. Please resolve these discussions',
+ );
+
expect(vm.$el.querySelector('.js-create-issue')).toEqual(null);
});
});
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_wip_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_wip_spec.js
index cea603368bf..88937df2f7b 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_wip_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_wip_spec.js
@@ -33,6 +33,7 @@ describe('Wip', () => {
describe('data', () => {
it('should have default data', () => {
const vm = createComponent();
+
expect(vm.isMakingRequest).toBeFalsy();
});
});
@@ -43,22 +44,27 @@ describe('Wip', () => {
};
describe('removeWIP', () => {
- it('should make a request to service and handle response', (done) => {
+ it('should make a request to service and handle response', done => {
const vm = createComponent();
spyOn(window, 'Flash').and.returnValue(true);
spyOn(eventHub, '$emit');
- spyOn(vm.service, 'removeWIP').and.returnValue(new Promise((resolve) => {
- resolve({
- data: mrObj,
- });
- }));
+ spyOn(vm.service, 'removeWIP').and.returnValue(
+ new Promise(resolve => {
+ resolve({
+ data: mrObj,
+ });
+ }),
+ );
vm.removeWIP();
setTimeout(() => {
expect(vm.isMakingRequest).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('UpdateWidgetData', mrObj);
- expect(window.Flash).toHaveBeenCalledWith('The merge request can now be merged.', 'notice');
+ expect(window.Flash).toHaveBeenCalledWith(
+ 'The merge request can now be merged.',
+ 'notice',
+ );
done();
}, 333);
});
@@ -82,7 +88,7 @@ describe('Wip', () => {
expect(el.querySelector('.js-remove-wip').innerText).toContain('Resolve WIP status');
});
- it('should not show removeWIP button is user cannot update MR', (done) => {
+ it('should not show removeWIP button is user cannot update MR', done => {
vm.mr.removeWIPPath = '';
Vue.nextTick(() => {
diff --git a/spec/javascripts/vue_mr_widget/mock_data.js b/spec/javascripts/vue_mr_widget/mock_data.js
index 7fd1a2350f7..17554c4fe42 100644
--- a/spec/javascripts/vue_mr_widget/mock_data.js
+++ b/spec/javascripts/vue_mr_widget/mock_data.js
@@ -218,5 +218,7 @@ export default {
diverged_commits_count: 0,
only_allow_merge_if_pipeline_succeeds: false,
commit_change_content_path: '/root/acets-app/merge_requests/22/commit_change_content',
- merge_commit_path: 'http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775',
+ merge_commit_path:
+ 'http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775',
+ troubleshooting_docs_path: 'help',
};
diff --git a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
index 6342ea00436..f72bf627c10 100644
--- a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
@@ -7,11 +7,12 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper';
import mockData from './mock_data';
import { faviconDataUrl, overlayDataUrl, faviconWithOverlayDataUrl } from '../lib/utils/mock_data';
-const returnPromise = data => new Promise((resolve) => {
- resolve({
- data,
+const returnPromise = data =>
+ new Promise(resolve => {
+ resolve({
+ data,
+ });
});
-});
describe('mrWidgetOptions', () => {
let vm;
@@ -27,6 +28,10 @@ describe('mrWidgetOptions', () => {
});
});
+ afterEach(() => {
+ vm.$destroy();
+ });
+
describe('data', () => {
it('should instantiate Store and Service', () => {
expect(vm.mr).toBeDefined();
@@ -42,6 +47,7 @@ describe('mrWidgetOptions', () => {
it('should return conflicts component', () => {
vm.mr.state = 'conflicts';
+
expect(vm.componentName).toEqual('mr-widget-conflicts');
});
});
@@ -53,6 +59,7 @@ describe('mrWidgetOptions', () => {
it('should return true for a state which requires help widget', () => {
vm.mr.state = 'conflicts';
+
expect(vm.shouldRenderMergeHelp).toBeTruthy();
});
});
@@ -78,6 +85,7 @@ describe('mrWidgetOptions', () => {
it('should return true if there is relatedLinks in MR', () => {
Vue.set(vm.mr, 'relatedLinks', {});
+
expect(vm.shouldRenderRelatedLinks).toBeTruthy();
});
});
@@ -128,7 +136,7 @@ describe('mrWidgetOptions', () => {
describe('methods', () => {
describe('checkStatus', () => {
- it('should tell service to check status', (done) => {
+ it('should tell service to check status', done => {
spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
spyOn(vm.mr, 'setData');
spyOn(vm, 'handleNotification');
@@ -178,10 +186,10 @@ describe('mrWidgetOptions', () => {
});
describe('fetchDeployments', () => {
- it('should fetch deployments', (done) => {
+ it('should fetch deployments', done => {
spyOn(vm.service, 'fetchDeployments').and.returnValue(returnPromise([{ id: 1 }]));
- vm.fetchDeployments();
+ vm.fetchPreMergeDeployments();
setTimeout(() => {
expect(vm.service.fetchDeployments).toHaveBeenCalled();
@@ -193,7 +201,7 @@ describe('mrWidgetOptions', () => {
});
describe('fetchActionsContent', () => {
- it('should fetch content of Cherry Pick and Revert modals', (done) => {
+ it('should fetch content of Cherry Pick and Revert modals', done => {
spyOn(vm.service, 'fetchMergeActionsContent').and.returnValue(returnPromise('hello world'));
vm.fetchActionsContent();
@@ -219,18 +227,23 @@ describe('mrWidgetOptions', () => {
vm.bindEventHubListeners();
eventHub.$emit('SetBranchRemoveFlag', ['flag']);
+
expect(vm.mr.isRemovingSourceBranch).toEqual('flag');
eventHub.$emit('FailedToMerge');
+
expect(vm.mr.state).toEqual('failedToMerge');
eventHub.$emit('UpdateWidgetData', mockData);
+
expect(vm.mr.setData).toHaveBeenCalledWith(mockData);
eventHub.$emit('EnablePolling');
+
expect(vm.resumePolling).toHaveBeenCalled();
eventHub.$emit('DisablePolling');
+
expect(vm.stopPolling).toHaveBeenCalled();
const listenersWithServiceRequest = {
@@ -239,7 +252,7 @@ describe('mrWidgetOptions', () => {
};
const allArgs = eventHub.$on.calls.allArgs();
- allArgs.forEach((params) => {
+ allArgs.forEach(params => {
const eventName = params[0];
const callback = params[1];
@@ -249,22 +262,12 @@ describe('mrWidgetOptions', () => {
});
listenersWithServiceRequest.MRWidgetUpdateRequested();
+
expect(vm.checkStatus).toHaveBeenCalled();
listenersWithServiceRequest.FetchActionsContent();
- expect(vm.fetchActionsContent).toHaveBeenCalled();
- });
- });
- describe('handleMounted', () => {
- it('should call required methods to do the initial kick-off', () => {
- spyOn(vm, 'initDeploymentsPolling');
- spyOn(vm, 'setFaviconHelper');
-
- vm.handleMounted();
-
- expect(vm.setFaviconHelper).toHaveBeenCalled();
- expect(vm.initDeploymentsPolling).toHaveBeenCalled();
+ expect(vm.fetchActionsContent).toHaveBeenCalled();
});
});
@@ -284,13 +287,14 @@ describe('mrWidgetOptions', () => {
document.body.removeChild(document.getElementById('favicon'));
});
- it('should call setFavicon method', (done) => {
+ it('should call setFavicon method', done => {
vm.mr.ciStatusFaviconPath = overlayDataUrl;
- vm.setFaviconHelper().then(() => {
- expect(faviconElement.getAttribute('href')).toEqual(faviconWithOverlayDataUrl);
- done();
- })
- .catch(done.fail);
+ vm.setFaviconHelper()
+ .then(() => {
+ expect(faviconElement.getAttribute('href')).toEqual(faviconWithOverlayDataUrl);
+ done();
+ })
+ .catch(done.fail);
});
it('should not call setFavicon when there is no ciStatusFaviconPath', () => {
@@ -348,6 +352,7 @@ describe('mrWidgetOptions', () => {
spyOn(vm.pollingInterval, 'resume');
vm.resumePolling();
+
expect(vm.pollingInterval.resume).toHaveBeenCalled();
});
});
@@ -357,13 +362,14 @@ describe('mrWidgetOptions', () => {
spyOn(vm.pollingInterval, 'stopTimer');
vm.stopPolling();
+
expect(vm.pollingInterval.stopTimer).toHaveBeenCalled();
});
});
});
describe('rendering relatedLinks', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.mr.relatedLinks = {
assignToMe: null,
closing: `
@@ -380,7 +386,7 @@ describe('mrWidgetOptions', () => {
expect(vm.$el.querySelector('.close-related-link')).toBeDefined();
});
- it('does not render if state is nothingToMerge', (done) => {
+ it('does not render if state is nothingToMerge', done => {
vm.mr.state = stateKey.nothingToMerge;
Vue.nextTick(() => {
expect(vm.$el.querySelector('.close-related-link')).toBeNull();
@@ -390,7 +396,7 @@ describe('mrWidgetOptions', () => {
});
describe('rendering source branch removal status', () => {
- it('renders when user cannot remove branch and branch should be removed', (done) => {
+ it('renders when user cannot remove branch and branch should be removed', done => {
vm.mr.canRemoveSourceBranch = false;
vm.mr.shouldRemoveSourceBranch = true;
vm.mr.state = 'readyToMerge';
@@ -407,7 +413,7 @@ describe('mrWidgetOptions', () => {
});
});
- it('does not render in merged state', (done) => {
+ it('does not render in merged state', done => {
vm.mr.canRemoveSourceBranch = false;
vm.mr.shouldRemoveSourceBranch = true;
vm.mr.state = 'merged';
@@ -422,6 +428,20 @@ describe('mrWidgetOptions', () => {
});
describe('rendering deployments', () => {
+ const changes = [
+ {
+ path: 'index.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
+ },
+ {
+ path: 'imgs/gallery.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
+ },
+ {
+ path: 'about/',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
+ },
+ ];
const deploymentMockData = {
id: 15,
name: 'review/diplo',
@@ -433,15 +453,20 @@ describe('mrWidgetOptions', () => {
external_url_formatted: 'diplo.',
deployed_at: '2017-03-22T22:44:42.258Z',
deployed_at_formatted: 'Mar 22, 2017 10:44pm',
+ changes,
+ status: 'success',
};
- beforeEach((done) => {
- vm.mr.deployments.push({
- ...deploymentMockData,
- }, {
- ...deploymentMockData,
- id: deploymentMockData.id + 1,
- });
+ beforeEach(done => {
+ vm.mr.deployments.push(
+ {
+ ...deploymentMockData,
+ },
+ {
+ ...deploymentMockData,
+ id: deploymentMockData.id + 1,
+ },
+ );
vm.$nextTick(done);
});
@@ -449,5 +474,201 @@ describe('mrWidgetOptions', () => {
it('renders multiple deployments', () => {
expect(vm.$el.querySelectorAll('.deploy-heading').length).toBe(2);
});
+
+ it('renders dropdpown with multiple file changes', () => {
+ expect(
+ vm.$el
+ .querySelector('.js-mr-wigdet-deployment-dropdown')
+ .querySelectorAll('.js-filtered-dropdown-result').length,
+ ).toEqual(changes.length);
+ });
+ });
+
+ describe('pipeline for target branch after merge', () => {
+ describe('with information for target branch pipeline', () => {
+ beforeEach(done => {
+ vm.mr.state = 'merged';
+ vm.mr.mergePipeline = {
+ id: 127,
+ user: {
+ id: 1,
+ name: 'Administrator',
+ username: 'root',
+ state: 'active',
+ avatar_url: null,
+ web_url: 'http://localhost:3000/root',
+ status_tooltip_html: null,
+ path: '/root',
+ },
+ active: true,
+ coverage: null,
+ source: 'push',
+ created_at: '2018-10-22T11:41:35.186Z',
+ updated_at: '2018-10-22T11:41:35.433Z',
+ path: '/root/ci-web-terminal/pipelines/127',
+ flags: {
+ latest: true,
+ stuck: true,
+ auto_devops: false,
+ yaml_errors: false,
+ retryable: false,
+ cancelable: true,
+ failure_reason: false,
+ },
+ details: {
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/root/ci-web-terminal/pipelines/127',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ },
+ duration: null,
+ finished_at: null,
+ stages: [
+ {
+ name: 'test',
+ title: 'test: pending',
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/root/ci-web-terminal/pipelines/127#test',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ },
+ path: '/root/ci-web-terminal/pipelines/127#test',
+ dropdown_path: '/root/ci-web-terminal/pipelines/127/stage.json?stage=test',
+ },
+ ],
+ artifacts: [],
+ manual_actions: [],
+ scheduled_actions: [],
+ },
+ ref: {
+ name: 'master',
+ path: '/root/ci-web-terminal/commits/master',
+ tag: false,
+ branch: true,
+ },
+ commit: {
+ id: 'aa1939133d373c94879becb79d91828a892ee319',
+ short_id: 'aa193913',
+ title: "Merge branch 'master-test' into 'master'",
+ created_at: '2018-10-22T11:41:33.000Z',
+ parent_ids: [
+ '4622f4dd792468993003caf2e3be978798cbe096',
+ '76598df914cdfe87132d0c3c40f80db9fa9396a4',
+ ],
+ message:
+ "Merge branch 'master-test' into 'master'\n\nUpdate .gitlab-ci.yml\n\nSee merge request root/ci-web-terminal!1",
+ author_name: 'Administrator',
+ author_email: 'admin@example.com',
+ authored_date: '2018-10-22T11:41:33.000Z',
+ committer_name: 'Administrator',
+ committer_email: 'admin@example.com',
+ committed_date: '2018-10-22T11:41:33.000Z',
+ author: {
+ id: 1,
+ name: 'Administrator',
+ username: 'root',
+ state: 'active',
+ avatar_url: null,
+ web_url: 'http://localhost:3000/root',
+ status_tooltip_html: null,
+ path: '/root',
+ },
+ author_gravatar_url: null,
+ commit_url:
+ 'http://localhost:3000/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
+ commit_path: '/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
+ },
+ cancel_path: '/root/ci-web-terminal/pipelines/127/cancel',
+ };
+ vm.$nextTick(done);
+ });
+
+ it('renders pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).not.toBeNull();
+ });
+
+ describe('with post merge deployments', () => {
+ beforeEach(done => {
+ vm.mr.postMergeDeployments = [
+ {
+ id: 15,
+ name: 'review/diplo',
+ url: '/root/acets-review-apps/environments/15',
+ stop_url: '/root/acets-review-apps/environments/15/stop',
+ metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
+ metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
+ external_url: 'http://diplo.',
+ external_url_formatted: 'diplo.',
+ deployed_at: '2017-03-22T22:44:42.258Z',
+ deployed_at_formatted: 'Mar 22, 2017 10:44pm',
+ changes: [
+ {
+ path: 'index.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
+ },
+ {
+ path: 'imgs/gallery.html',
+ external_url:
+ 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
+ },
+ {
+ path: 'about/',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
+ },
+ ],
+ status: 'success',
+ },
+ ];
+
+ vm.$nextTick(done);
+ });
+
+ it('renders post deployment information', () => {
+ expect(vm.$el.querySelector('.js-post-deployment')).not.toBeNull();
+ });
+ });
+ });
+
+ describe('without information for target branch pipeline', () => {
+ beforeEach(done => {
+ vm.mr.state = 'merged';
+
+ vm.$nextTick(done);
+ });
+
+ it('does not render pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
+ });
+ });
+
+ describe('when state is not merged', () => {
+ beforeEach(done => {
+ vm.mr.state = 'archived';
+
+ vm.$nextTick(done);
+ });
+
+ it('does not render pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
+ });
+
+ it('does not render post deployment information', () => {
+ expect(vm.$el.querySelector('.js-post-deployment')).toBeNull();
+ });
+ });
});
});
diff --git a/spec/javascripts/vue_mr_widget/stores/get_state_key_spec.js b/spec/javascripts/vue_mr_widget/stores/get_state_key_spec.js
index 179e42a7cc4..9d34bdd1084 100644
--- a/spec/javascripts/vue_mr_widget/stores/get_state_key_spec.js
+++ b/spec/javascripts/vue_mr_widget/stores/get_state_key_spec.js
@@ -20,46 +20,60 @@ describe('getStateKey', () => {
work_in_progress: false,
};
const bound = getStateKey.bind(context, data);
+
expect(bound()).toEqual(null);
context.canBeMerged = true;
+
expect(bound()).toEqual('readyToMerge');
context.canMerge = false;
+
expect(bound()).toEqual('notAllowedToMerge');
context.mergeWhenPipelineSucceeds = true;
+
expect(bound()).toEqual('mergeWhenPipelineSucceeds');
context.hasSHAChanged = true;
+
expect(bound()).toEqual('shaMismatch');
context.isPipelineBlocked = true;
+
expect(bound()).toEqual('pipelineBlocked');
context.hasMergeableDiscussionsState = true;
+
expect(bound()).toEqual('unresolvedDiscussions');
context.onlyAllowMergeIfPipelineSucceeds = true;
context.isPipelineFailed = true;
+
expect(bound()).toEqual('pipelineFailed');
data.work_in_progress = true;
+
expect(bound()).toEqual('workInProgress');
data.has_conflicts = true;
+
expect(bound()).toEqual('conflicts');
context.mergeStatus = 'unchecked';
+
expect(bound()).toEqual('checking');
data.commits_count = 0;
+
expect(bound()).toEqual('nothingToMerge');
data.branch_missing = true;
+
expect(bound()).toEqual('missingBranch');
data.project_archived = true;
+
expect(bound()).toEqual('archived');
});
});
diff --git a/spec/javascripts/vue_mr_widget/stores/mr_widget_store_spec.js b/spec/javascripts/vue_mr_widget/stores/mr_widget_store_spec.js
index 33d052aceb2..f5079147f60 100644
--- a/spec/javascripts/vue_mr_widget/stores/mr_widget_store_spec.js
+++ b/spec/javascripts/vue_mr_widget/stores/mr_widget_store_spec.js
@@ -12,32 +12,38 @@ describe('MergeRequestStore', () => {
it('should set hasSHAChanged when the diff SHA changes', () => {
store.setData({ ...mockData, diff_head_sha: 'a-different-string' });
+
expect(store.hasSHAChanged).toBe(true);
});
it('should not set hasSHAChanged when other data changes', () => {
store.setData({ ...mockData, work_in_progress: !mockData.work_in_progress });
+
expect(store.hasSHAChanged).toBe(false);
});
describe('isPipelinePassing', () => {
it('is true when the CI status is `success`', () => {
store.setData({ ...mockData, ci_status: 'success' });
+
expect(store.isPipelinePassing).toBe(true);
});
it('is true when the CI status is `success_with_warnings`', () => {
store.setData({ ...mockData, ci_status: 'success_with_warnings' });
+
expect(store.isPipelinePassing).toBe(true);
});
it('is false when the CI status is `failed`', () => {
store.setData({ ...mockData, ci_status: 'failed' });
+
expect(store.isPipelinePassing).toBe(false);
});
it('is false when the CI status is anything except `success`', () => {
store.setData({ ...mockData, ci_status: 'foobarbaz' });
+
expect(store.isPipelinePassing).toBe(false);
});
});
@@ -45,11 +51,13 @@ describe('MergeRequestStore', () => {
describe('isPipelineSkipped', () => {
it('should set isPipelineSkipped=true when the CI status is `skipped`', () => {
store.setData({ ...mockData, ci_status: 'skipped' });
+
expect(store.isPipelineSkipped).toBe(true);
});
it('should set isPipelineSkipped=false when the CI status is anything except `skipped`', () => {
store.setData({ ...mockData, ci_status: 'foobarbaz' });
+
expect(store.isPipelineSkipped).toBe(false);
});
});
@@ -57,11 +65,13 @@ describe('MergeRequestStore', () => {
describe('isNothingToMergeState', () => {
it('returns true when nothingToMerge', () => {
store.state = stateKey.nothingToMerge;
+
expect(store.isNothingToMergeState).toEqual(true);
});
it('returns false when not nothingToMerge', () => {
store.state = 'state';
+
expect(store.isNothingToMergeState).toEqual(false);
});
});
diff --git a/spec/javascripts/vue_shared/components/bar_chart_spec.js b/spec/javascripts/vue_shared/components/bar_chart_spec.js
index 7e91cd6f63f..8f753876e44 100644
--- a/spec/javascripts/vue_shared/components/bar_chart_spec.js
+++ b/spec/javascripts/vue_shared/components/bar_chart_spec.js
@@ -71,12 +71,6 @@ describe('Bar chart component', () => {
expect(barChart.xAxisLocation).toEqual('translate(100, 250)');
});
- it('Contains a total of 4 ticks across the y axis', () => {
- const ticks = barChart.$el.querySelector('.y-axis').querySelectorAll('.tick').length;
-
- expect(ticks).toEqual(4);
- });
-
it('rotates the x axis labels a total of 90 degress (CCW)', () => {
const xAxisLabel = barChart.$el.querySelector('.x-axis').querySelectorAll('text')[0];
diff --git a/spec/javascripts/ide/components/changed_file_icon_spec.js b/spec/javascripts/vue_shared/components/changed_file_icon_spec.js
index 7308219f705..5b1038840c7 100644
--- a/spec/javascripts/ide/components/changed_file_icon_spec.js
+++ b/spec/javascripts/vue_shared/components/changed_file_icon_spec.js
@@ -1,8 +1,8 @@
import Vue from 'vue';
-import changedFileIcon from '~/ide/components/changed_file_icon.vue';
+import changedFileIcon from '~/vue_shared/components/changed_file_icon.vue';
import createComponent from 'spec/helpers/vue_mount_component_helper';
-describe('IDE changed file icon', () => {
+describe('Changed file icon', () => {
let vm;
beforeEach(() => {
@@ -33,14 +33,14 @@ describe('IDE changed file icon', () => {
});
describe('changedIconClass', () => {
- it('includes ide-file-modified when not a temp file', () => {
- expect(vm.changedIconClass).toContain('ide-file-modified');
+ it('includes file-modified when not a temp file', () => {
+ expect(vm.changedIconClass).toContain('file-modified');
});
- it('includes ide-file-addition when a temp file', () => {
+ it('includes file-addition when a temp file', () => {
vm.file.tempFile = true;
- expect(vm.changedIconClass).toContain('ide-file-addition');
+ expect(vm.changedIconClass).toContain('file-addition');
});
});
});
diff --git a/spec/javascripts/vue_shared/components/ci_badge_link_spec.js b/spec/javascripts/vue_shared/components/ci_badge_link_spec.js
index 668742ebaee..4b0b7ba66e5 100644
--- a/spec/javascripts/vue_shared/components/ci_badge_link_spec.js
+++ b/spec/javascripts/vue_shared/components/ci_badge_link_spec.js
@@ -81,11 +81,12 @@ describe('CI Badge Link Component', () => {
});
it('should render each status badge', () => {
- Object.keys(statuses).map((status) => {
+ Object.keys(statuses).map(status => {
vm = mountComponent(CIBadge, { status: statuses[status] });
+
expect(vm.$el.getAttribute('href')).toEqual(statuses[status].details_path);
expect(vm.$el.textContent.trim()).toEqual(statuses[status].text);
- expect(vm.$el.getAttribute('class')).toEqual(`ci-status ci-${statuses[status].group}`);
+ expect(vm.$el.getAttribute('class')).toContain(`ci-status ci-${statuses[status].group}`);
expect(vm.$el.querySelector('svg')).toBeDefined();
return vm;
});
@@ -93,6 +94,7 @@ describe('CI Badge Link Component', () => {
it('should not render label', () => {
vm = mountComponent(CIBadge, { status: statuses.canceled, showText: false });
+
expect(vm.$el.textContent.trim()).toEqual('');
});
});
diff --git a/spec/javascripts/vue_shared/components/clipboard_button_spec.js b/spec/javascripts/vue_shared/components/clipboard_button_spec.js
index ea525b1e44f..fd17349d48f 100644
--- a/spec/javascripts/vue_shared/components/clipboard_button_spec.js
+++ b/spec/javascripts/vue_shared/components/clipboard_button_spec.js
@@ -27,8 +27,6 @@ describe('clipboard button', () => {
it('should have a tooltip with default values', () => {
expect(vm.$el.getAttribute('data-original-title')).toEqual('Copy this value into Clipboard!');
- expect(vm.$el.getAttribute('data-placement')).toEqual('top');
- expect(vm.$el.getAttribute('data-container')).toEqual(null);
});
it('should render provided classname', () => {
@@ -44,6 +42,7 @@ describe('clipboard button', () => {
title: 'Copy this value into Clipboard!',
cssClass: 'btn-danger',
});
+
expect(vm.$el.getAttribute('data-clipboard-text')).toEqual(
'{"text":"copy me","gfm":"`path/to/file`"}',
);
diff --git a/spec/javascripts/vue_shared/components/commit_spec.js b/spec/javascripts/vue_shared/components/commit_spec.js
index 7189e8cfcfa..18fcdf7ede1 100644
--- a/spec/javascripts/vue_shared/components/commit_spec.js
+++ b/spec/javascripts/vue_shared/components/commit_spec.js
@@ -78,6 +78,7 @@ describe('Commit component', () => {
expect(component.$el.querySelector('.commit-sha').getAttribute('href')).toEqual(
props.commitUrl,
);
+
expect(component.$el.querySelector('.commit-sha').textContent).toContain(props.shortSha);
});
@@ -97,9 +98,10 @@ describe('Commit component', () => {
it('Should render the author avatar with title and alt attributes', () => {
expect(
component.$el
- .querySelector('.commit-title .avatar-image-container img')
- .getAttribute('data-original-title'),
+ .querySelector('.commit-title .avatar-image-container .js-user-avatar-image-toolip')
+ .textContent.trim(),
).toContain(props.author.username);
+
expect(
component.$el
.querySelector('.commit-title .avatar-image-container img')
@@ -112,6 +114,7 @@ describe('Commit component', () => {
expect(component.$el.querySelector('a.commit-row-message').getAttribute('href')).toEqual(
props.commitUrl,
);
+
expect(component.$el.querySelector('a.commit-row-message').textContent).toContain(
props.title,
);
diff --git a/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js b/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js
index e2c34508b0d..4da8c6196b1 100644
--- a/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js
+++ b/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js
@@ -47,7 +47,7 @@ describe('ContentViewer', () => {
});
setTimeout(() => {
- expect(vm.$el.querySelector('.image_file img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
+ expect(vm.$el.querySelector('img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
done();
});
diff --git a/spec/javascripts/vue_shared/components/deprecated_modal_spec.js b/spec/javascripts/vue_shared/components/deprecated_modal_spec.js
index 59d4e549a91..be75be92158 100644
--- a/spec/javascripts/vue_shared/components/deprecated_modal_spec.js
+++ b/spec/javascripts/vue_shared/components/deprecated_modal_spec.js
@@ -47,7 +47,7 @@ describe('DeprecatedModal', () => {
});
});
- it('works with data-toggle="modal"', (done) => {
+ it('works with data-toggle="modal"', done => {
setFixtures(`
<button id="modal-button" data-toggle="modal" data-target="#my-modal"></button>
<div id="modal-container"></div>
@@ -55,9 +55,13 @@ describe('DeprecatedModal', () => {
const modalContainer = document.getElementById('modal-container');
const modalButton = document.getElementById('modal-button');
- vm = mountComponent(modalComponent, {
- id: 'my-modal',
- }, modalContainer);
+ vm = mountComponent(
+ modalComponent,
+ {
+ id: 'my-modal',
+ },
+ modalContainer,
+ );
const modalElement = vm.$el.querySelector('#my-modal');
$(modalElement).on('shown.bs.modal', () => done());
diff --git a/spec/javascripts/vue_shared/components/diff_viewer/diff_viewer_spec.js b/spec/javascripts/vue_shared/components/diff_viewer/diff_viewer_spec.js
index 71d9145bf22..67a3a2e08bc 100644
--- a/spec/javascripts/vue_shared/components/diff_viewer/diff_viewer_spec.js
+++ b/spec/javascripts/vue_shared/components/diff_viewer/diff_viewer_spec.js
@@ -30,11 +30,11 @@ describe('DiffViewer', () => {
});
setTimeout(() => {
- expect(vm.$el.querySelector('.deleted .image_file img').getAttribute('src')).toBe(
+ expect(vm.$el.querySelector('.deleted img').getAttribute('src')).toBe(
`//raw/DEF/${RED_BOX_IMAGE_URL}`,
);
- expect(vm.$el.querySelector('.added .image_file img').getAttribute('src')).toBe(
+ expect(vm.$el.querySelector('.added img').getAttribute('src')).toBe(
`//raw/ABC/${GREEN_BOX_IMAGE_URL}`,
);
@@ -55,6 +55,7 @@ describe('DiffViewer', () => {
expect(vm.$el.querySelector('.deleted .file-info').textContent.trim()).toContain(
'testold.abc',
);
+
expect(vm.$el.querySelector('.deleted .btn.btn-default').textContent.trim()).toContain(
'Download',
);
diff --git a/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js b/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
index dde49b4a5d7..7f2e246d656 100644
--- a/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
+++ b/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
@@ -52,17 +52,15 @@ describe('ImageDiffViewer', () => {
});
setTimeout(() => {
- expect(vm.$el.querySelector('.added .image_file img').getAttribute('src')).toBe(
- GREEN_BOX_IMAGE_URL,
- );
- expect(vm.$el.querySelector('.deleted .image_file img').getAttribute('src')).toBe(
- RED_BOX_IMAGE_URL,
- );
+ expect(vm.$el.querySelector('.added img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
+
+ expect(vm.$el.querySelector('.deleted img').getAttribute('src')).toBe(RED_BOX_IMAGE_URL);
expect(vm.$el.querySelector('.view-modes-menu li.active').textContent.trim()).toBe('2-up');
expect(vm.$el.querySelector('.view-modes-menu li:nth-child(2)').textContent.trim()).toBe(
'Swipe',
);
+
expect(vm.$el.querySelector('.view-modes-menu li:nth-child(3)').textContent.trim()).toBe(
'Onion skin',
);
@@ -79,9 +77,7 @@ describe('ImageDiffViewer', () => {
});
setTimeout(() => {
- expect(vm.$el.querySelector('.added .image_file img').getAttribute('src')).toBe(
- GREEN_BOX_IMAGE_URL,
- );
+ expect(vm.$el.querySelector('.added img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
done();
});
@@ -95,9 +91,27 @@ describe('ImageDiffViewer', () => {
});
setTimeout(() => {
- expect(vm.$el.querySelector('.deleted .image_file img').getAttribute('src')).toBe(
- RED_BOX_IMAGE_URL,
- );
+ expect(vm.$el.querySelector('.deleted img').getAttribute('src')).toBe(RED_BOX_IMAGE_URL);
+
+ done();
+ });
+ });
+
+ it('renders image diff for renamed', done => {
+ vm = new Vue({
+ components: {
+ imageDiffViewer,
+ },
+ template: `
+ <image-diff-viewer diff-mode="renamed" new-path="${GREEN_BOX_IMAGE_URL}" old-path="">
+ <span slot="image-overlay" class="overlay">test</span>
+ </image-diff-viewer>
+ `,
+ }).$mount();
+
+ setTimeout(() => {
+ expect(vm.$el.querySelector('img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL);
+ expect(vm.$el.querySelector('.overlay')).not.toBe(null);
done();
});
diff --git a/spec/javascripts/vue_shared/components/dropdown/dropdown_button_spec.js b/spec/javascripts/vue_shared/components/dropdown/dropdown_button_spec.js
index 2796cd088c6..2fc4943de30 100644
--- a/spec/javascripts/vue_shared/components/dropdown/dropdown_button_spec.js
+++ b/spec/javascripts/vue_shared/components/dropdown/dropdown_button_spec.js
@@ -55,6 +55,7 @@ describe('DropdownButtonComponent', () => {
it('renders dropdown toggle text element', () => {
const dropdownToggleTextEl = vm.$el.querySelector('.dropdown-toggle-text');
+
expect(dropdownToggleTextEl).not.toBeNull();
expect(dropdownToggleTextEl.innerText.trim()).toBe(defaultLabel);
});
@@ -67,9 +68,12 @@ describe('DropdownButtonComponent', () => {
});
it('renders slot, if default slot exists', () => {
- vm = createComponent({}, {
- default: ['Lorem Ipsum Dolar'],
- });
+ vm = createComponent(
+ {},
+ {
+ default: ['Lorem Ipsum Dolar'],
+ },
+ );
expect(vm.$el).not.toContainElement('.dropdown-toggle-text');
expect(vm.$el).toHaveText('Lorem Ipsum Dolar');
diff --git a/spec/javascripts/vue_shared/components/expand_button_spec.js b/spec/javascripts/vue_shared/components/expand_button_spec.js
index 98fee9a74a5..2af4abc299a 100644
--- a/spec/javascripts/vue_shared/components/expand_button_spec.js
+++ b/spec/javascripts/vue_shared/components/expand_button_spec.js
@@ -18,7 +18,7 @@ describe('expand button', () => {
vm.$destroy();
});
- it('renders a collpased button', () => {
+ it('renders a collapsed button', () => {
expect(vm.$children[0].iconTestClass).toEqual('ic-ellipsis_h');
});
diff --git a/spec/javascripts/vue_shared/components/file_icon_spec.js b/spec/javascripts/vue_shared/components/file_icon_spec.js
index 1c666fc6c55..34c9b35e02a 100644
--- a/spec/javascripts/vue_shared/components/file_icon_spec.js
+++ b/spec/javascripts/vue_shared/components/file_icon_spec.js
@@ -28,7 +28,9 @@ describe('File Icon component', () => {
fileName: 'test.js',
});
- expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(`${gon.sprite_file_icons}#javascript`);
+ expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(
+ `${gon.sprite_file_icons}#javascript`,
+ );
});
it('should render a image icon based on file ending', () => {
@@ -36,7 +38,9 @@ describe('File Icon component', () => {
fileName: 'test.png',
});
- expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(`${gon.sprite_file_icons}#image`);
+ expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(
+ `${gon.sprite_file_icons}#image`,
+ );
});
it('should render a webpack icon based on file namer', () => {
@@ -44,7 +48,9 @@ describe('File Icon component', () => {
fileName: 'webpack.js',
});
- expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(`${gon.sprite_file_icons}#webpack`);
+ expect(vm.$el.firstChild.firstChild.getAttribute('xlink:href')).toBe(
+ `${gon.sprite_file_icons}#webpack`,
+ );
});
it('should render a standard folder icon', () => {
@@ -53,7 +59,9 @@ describe('File Icon component', () => {
folder: true,
});
- expect(vm.$el.querySelector('span > svg > use').getAttribute('xlink:href')).toBe(`${gon.sprite_file_icons}#folder`);
+ expect(vm.$el.querySelector('span > svg > use').getAttribute('xlink:href')).toBe(
+ `${gon.sprite_file_icons}#folder`,
+ );
});
it('should render a loading icon', () => {
@@ -62,9 +70,12 @@ describe('File Icon component', () => {
loading: true,
});
- expect(
- vm.$el.querySelector('i').getAttribute('class'),
- ).toEqual('fa fa-spin fa-spinner fa-1x');
+ const { classList } = vm.$el.querySelector('i');
+
+ expect(classList.contains('fa')).toEqual(true);
+ expect(classList.contains('fa-spin')).toEqual(true);
+ expect(classList.contains('fa-spinner')).toEqual(true);
+ expect(classList.contains('fa-1x')).toEqual(true);
});
it('should add a special class and a size class', () => {
@@ -77,6 +88,7 @@ describe('File Icon component', () => {
const { classList } = vm.$el.firstChild;
const containsSizeClass = classList.contains('s120');
const containsCustomClass = classList.contains('extraclasses');
+
expect(containsSizeClass).toBe(true);
expect(containsCustomClass).toBe(true);
});
diff --git a/spec/javascripts/vue_shared/components/file_row_spec.js b/spec/javascripts/vue_shared/components/file_row_spec.js
new file mode 100644
index 00000000000..67752c1c455
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/file_row_spec.js
@@ -0,0 +1,110 @@
+import Vue from 'vue';
+import FileRow from '~/vue_shared/components/file_row.vue';
+import { file } from 'spec/ide/helpers';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('RepoFile', () => {
+ let vm;
+
+ function createComponent(propsData) {
+ const FileRowComponent = Vue.extend(FileRow);
+
+ vm = mountComponent(FileRowComponent, propsData);
+ }
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders name', () => {
+ createComponent({
+ file: file('t4'),
+ level: 0,
+ });
+
+ const name = vm.$el.querySelector('.file-row-name');
+
+ expect(name.textContent.trim()).toEqual(vm.file.name);
+ });
+
+ it('emits toggleTreeOpen on click', () => {
+ createComponent({
+ file: {
+ ...file('t3'),
+ type: 'tree',
+ },
+ level: 0,
+ });
+ spyOn(vm, '$emit').and.stub();
+
+ vm.$el.querySelector('.file-row').click();
+
+ expect(vm.$emit).toHaveBeenCalledWith('toggleTreeOpen', vm.file.path);
+ });
+
+ it('calls scrollIntoView if made active', done => {
+ createComponent({
+ file: {
+ ...file(),
+ type: 'blob',
+ active: false,
+ },
+ level: 0,
+ });
+
+ spyOn(vm, 'scrollIntoView').and.stub();
+
+ vm.file.active = true;
+
+ vm.$nextTick(() => {
+ expect(vm.scrollIntoView).toHaveBeenCalled();
+
+ done();
+ });
+ });
+
+ it('indents row based on level', () => {
+ createComponent({
+ file: file('t4'),
+ level: 2,
+ });
+
+ expect(vm.$el.querySelector('.file-row-name').style.marginLeft).toBe('32px');
+ });
+
+ describe('outputText', () => {
+ beforeEach(done => {
+ createComponent({
+ file: {
+ ...file(),
+ path: 'app/assets/index.js',
+ },
+ level: 0,
+ });
+
+ vm.displayTextKey = 'path';
+
+ vm.$nextTick(done);
+ });
+
+ it('returns text if truncateStart is 0', done => {
+ vm.truncateStart = 0;
+
+ vm.$nextTick(() => {
+ expect(vm.outputText).toBe('app/assets/index.js');
+
+ done();
+ });
+ });
+
+ it('returns text truncated at start', done => {
+ vm.truncateStart = 5;
+
+ vm.$nextTick(() => {
+ expect(vm.outputText).toBe('...ssets/index.js');
+
+ done();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/filtered_search_dropdown_spec.js b/spec/javascripts/vue_shared/components/filtered_search_dropdown_spec.js
new file mode 100644
index 00000000000..b84b5ae67a8
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/filtered_search_dropdown_spec.js
@@ -0,0 +1,91 @@
+import Vue from 'vue';
+import component from '~/vue_shared/components/filtered_search_dropdown.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+describe('Filtered search dropdown', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with an empty array of items', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ items: [],
+ filterKey: '',
+ });
+ });
+
+ it('renders empty list', () => {
+ expect(vm.$el.querySelectorAll('.js-filtered-dropdown-result').length).toEqual(0);
+ });
+
+ it('renders filter input', () => {
+ expect(vm.$el.querySelector('.js-filtered-dropdown-input')).not.toBeNull();
+ });
+ });
+
+ describe('when visible numbers is less than the items length', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ items: [{ title: 'One' }, { title: 'Two' }, { title: 'Three' }],
+ visibleItems: 2,
+ filterKey: 'title',
+ });
+ });
+
+ it('it renders only the maximum number provided', () => {
+ expect(vm.$el.querySelectorAll('.js-filtered-dropdown-result').length).toEqual(2);
+ });
+ });
+
+ describe('when visible number is bigger than the items length', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ items: [{ title: 'One' }, { title: 'Two' }, { title: 'Three' }],
+ filterKey: 'title',
+ });
+ });
+
+ it('it renders the full list of items the maximum number provided', () => {
+ expect(vm.$el.querySelectorAll('.js-filtered-dropdown-result').length).toEqual(3);
+ });
+ });
+
+ describe('while filtering', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ items: [
+ { title: 'One' },
+ { title: 'Two/three' },
+ { title: 'Three four' },
+ { title: 'Five' },
+ ],
+ filterKey: 'title',
+ });
+ });
+
+ it('updates the results to match the typed value', done => {
+ vm.$el.querySelector('.js-filtered-dropdown-input').value = 'three';
+ vm.$el.querySelector('.js-filtered-dropdown-input').dispatchEvent(new Event('input'));
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelectorAll('.js-filtered-dropdown-result').length).toEqual(2);
+ done();
+ });
+ });
+
+ describe('when no value matches the typed one', () => {
+ it('does not render any result', done => {
+ vm.$el.querySelector('.js-filtered-dropdown-input').value = 'six';
+ vm.$el.querySelector('.js-filtered-dropdown-input').dispatchEvent(new Event('input'));
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelectorAll('.js-filtered-dropdown-result').length).toEqual(0);
+ done();
+ });
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/gl_countdown_spec.js b/spec/javascripts/vue_shared/components/gl_countdown_spec.js
new file mode 100644
index 00000000000..929ffe219f4
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/gl_countdown_spec.js
@@ -0,0 +1,77 @@
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import Vue from 'vue';
+import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
+
+describe('GlCountdown', () => {
+ const Component = Vue.extend(GlCountdown);
+ let vm;
+ let now = '2000-01-01T00:00:00Z';
+
+ beforeEach(() => {
+ spyOn(Date, 'now').and.callFake(() => new Date(now).getTime());
+ jasmine.clock().install();
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ jasmine.clock().uninstall();
+ });
+
+ describe('when there is time remaining', () => {
+ beforeEach(done => {
+ vm = mountComponent(Component, {
+ endDateString: '2000-01-01T01:02:03Z',
+ });
+
+ Vue.nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('displays remaining time', () => {
+ expect(vm.$el).toContainText('01:02:03');
+ });
+
+ it('updates remaining time', done => {
+ now = '2000-01-01T00:00:01Z';
+ jasmine.clock().tick(1000);
+
+ Vue.nextTick()
+ .then(() => {
+ expect(vm.$el).toContainText('01:02:02');
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+
+ describe('when there is no time remaining', () => {
+ beforeEach(done => {
+ vm = mountComponent(Component, {
+ endDateString: '1900-01-01T00:00:00Z',
+ });
+
+ Vue.nextTick()
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('displays 00:00:00', () => {
+ expect(vm.$el).toContainText('00:00:00');
+ });
+ });
+
+ describe('when an invalid date is passed', () => {
+ it('throws a validation error', () => {
+ spyOn(Vue.config, 'warnHandler').and.stub();
+ vm = mountComponent(Component, {
+ endDateString: 'this is invalid',
+ });
+
+ expect(Vue.config.warnHandler).toHaveBeenCalledTimes(1);
+ const [errorMessage] = Vue.config.warnHandler.calls.argsFor(0);
+
+ expect(errorMessage).toMatch(/^Invalid prop: .* "endDateString"/);
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/gl_modal_spec.js b/spec/javascripts/vue_shared/components/gl_modal_spec.js
index 263824a102a..19af8b5d2f7 100644
--- a/spec/javascripts/vue_shared/components/gl_modal_spec.js
+++ b/spec/javascripts/vue_shared/components/gl_modal_spec.js
@@ -48,6 +48,7 @@ describe('GlModal', () => {
it('sets the modal title', () => {
const modalTitle = vm.$el.querySelector('.modal-title');
+
expect(modalTitle.innerHTML.trim()).toBe(props.headerTitleText);
});
});
@@ -63,6 +64,7 @@ describe('GlModal', () => {
it('sets the primary button class', () => {
const primaryButton = vm.$el.querySelector('.modal-footer button:last-of-type');
+
expect(primaryButton).toHaveClass(`btn-${props.footerPrimaryButtonVariant}`);
});
});
@@ -78,6 +80,7 @@ describe('GlModal', () => {
it('sets the primary button text', () => {
const primaryButton = vm.$el.querySelector('.modal-footer button:last-of-type');
+
expect(primaryButton.innerHTML.trim()).toBe(props.footerPrimaryButtonText);
});
});
@@ -173,6 +176,7 @@ describe('GlModal', () => {
it('sets the modal body', () => {
const modalBody = vm.$el.querySelector('.modal-body');
+
expect(modalBody.innerHTML).toBe(slotContent);
});
});
@@ -184,6 +188,7 @@ describe('GlModal', () => {
it('sets the modal header', () => {
const modalHeader = vm.$el.querySelector('.modal-header');
+
expect(modalHeader.innerHTML).toBe(slotContent);
});
});
@@ -195,6 +200,7 @@ describe('GlModal', () => {
it('sets the modal title', () => {
const modalTitle = vm.$el.querySelector('.modal-title');
+
expect(modalTitle.innerHTML).toBe(slotContent);
});
});
@@ -206,6 +212,7 @@ describe('GlModal', () => {
it('sets the modal footer', () => {
const modalFooter = vm.$el.querySelector('.modal-footer');
+
expect(modalFooter.innerHTML).toBe(slotContent);
});
});
diff --git a/spec/javascripts/vue_shared/components/header_ci_component_spec.js b/spec/javascripts/vue_shared/components/header_ci_component_spec.js
index f17818c17c7..7a741bdc067 100644
--- a/spec/javascripts/vue_shared/components/header_ci_component_spec.js
+++ b/spec/javascripts/vue_shared/components/header_ci_component_spec.js
@@ -59,9 +59,9 @@ describe('Header CI Component', () => {
it('should render status badge', () => {
expect(vm.$el.querySelector('.ci-failed')).toBeDefined();
expect(vm.$el.querySelector('.ci-status-icon-failed svg')).toBeDefined();
- expect(
- vm.$el.querySelector('.ci-failed').getAttribute('href'),
- ).toEqual(props.status.details_path);
+ expect(vm.$el.querySelector('.ci-failed').getAttribute('href')).toEqual(
+ props.status.details_path,
+ );
});
it('should render item name and id', () => {
@@ -73,7 +73,7 @@ describe('Header CI Component', () => {
});
it('should render user icon and name', () => {
- expect(vm.$el.querySelector('.js-user-link').textContent.trim()).toEqual(props.user.name);
+ expect(vm.$el.querySelector('.js-user-link').innerText.trim()).toContain(props.user.name);
});
it('should render provided actions', () => {
@@ -84,7 +84,7 @@ describe('Header CI Component', () => {
expect(vm.$el.querySelector('.link').getAttribute('href')).toEqual(props.actions[0].path);
});
- it('should show loading icon', (done) => {
+ it('should show loading icon', done => {
vm.actions[0].isLoading = true;
Vue.nextTick(() => {
@@ -94,7 +94,7 @@ describe('Header CI Component', () => {
});
it('should render sidebar toggle button', () => {
- expect(vm.$el.querySelector('.js-sidebar-build-toggle')).toBeDefined();
+ expect(vm.$el.querySelector('.js-sidebar-build-toggle')).not.toBeNull();
});
});
diff --git a/spec/javascripts/vue_shared/components/icon_spec.js b/spec/javascripts/vue_shared/components/icon_spec.js
index 01f4649339e..45eef2ad737 100644
--- a/spec/javascripts/vue_shared/components/icon_spec.js
+++ b/spec/javascripts/vue_shared/components/icon_spec.js
@@ -2,11 +2,11 @@ import Vue from 'vue';
import Icon from '~/vue_shared/components/icon.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-describe('Sprite Icon Component', function () {
- describe('Initialization', function () {
+describe('Sprite Icon Component', function() {
+ describe('Initialization', function() {
let icon;
- beforeEach(function () {
+ beforeEach(function() {
const IconComponent = Vue.extend(Icon);
icon = mountComponent(IconComponent, {
@@ -21,20 +21,20 @@ describe('Sprite Icon Component', function () {
icon.$destroy();
});
- it('should return a defined Vue component', function () {
+ it('should return a defined Vue component', function() {
expect(icon).toBeDefined();
});
- it('should have <svg> as a child element', function () {
+ it('should have <svg> as a child element', function() {
expect(icon.$el.tagName).toBe('svg');
});
- it('should have <use> as a child element with the correct href', function () {
+ it('should have <use> as a child element with the correct href', function() {
expect(icon.$el.firstChild.tagName).toBe('use');
expect(icon.$el.firstChild.getAttribute('xlink:href')).toBe(`${gon.sprite_icons}#commit`);
});
- it('should properly compute iconSizeClass', function () {
+ it('should properly compute iconSizeClass', function() {
expect(icon.iconSizeClass).toBe('s32');
});
@@ -44,10 +44,11 @@ describe('Sprite Icon Component', function () {
expect(icon.$options.props.size.validator(9001)).toBeFalsy();
});
- it('should properly render img css', function () {
+ it('should properly render img css', function() {
const { classList } = icon.$el;
const containsSizeClass = classList.contains('s32');
const containsCustomClass = classList.contains('extraclasses');
+
expect(containsSizeClass).toBe(true);
expect(containsCustomClass).toBe(true);
});
diff --git a/spec/javascripts/vue_shared/components/identicon_spec.js b/spec/javascripts/vue_shared/components/identicon_spec.js
index 0719800c682..0b3dbb61c96 100644
--- a/spec/javascripts/vue_shared/components/identicon_spec.js
+++ b/spec/javascripts/vue_shared/components/identicon_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import identiconComponent from '~/vue_shared/components/identicon.vue';
-const createComponent = (sizeClass) => {
+const createComponent = sizeClass => {
const Component = Vue.extend(identiconComponent);
return new Component({
diff --git a/spec/javascripts/vue_shared/components/issue/issue_warning_spec.js b/spec/javascripts/vue_shared/components/issue/issue_warning_spec.js
index e6ed77dbb52..aa7d6ea2e34 100644
--- a/spec/javascripts/vue_shared/components/issue/issue_warning_spec.js
+++ b/spec/javascripts/vue_shared/components/issue/issue_warning_spec.js
@@ -6,7 +6,10 @@ const IssueWarning = Vue.extend(issueWarning);
function formatWarning(string) {
// Replace newlines with a space then replace multiple spaces with one space
- return string.trim().replace(/\n/g, ' ').replace(/\s\s+/g, ' ');
+ return string
+ .trim()
+ .replace(/\n/g, ' ')
+ .replace(/\s\s+/g, ' ');
}
describe('Issue Warning Component', () => {
@@ -17,7 +20,9 @@ describe('Issue Warning Component', () => {
});
expect(vm.$el.querySelector('.icon use').href.baseVal).toMatch(/lock$/);
- expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual('This issue is locked. Only project members can comment.');
+ expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual(
+ 'This issue is locked. Only project members can comment.',
+ );
});
});
@@ -28,7 +33,9 @@ describe('Issue Warning Component', () => {
});
expect(vm.$el.querySelector('.icon use').href.baseVal).toMatch(/eye-slash$/);
- expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual('This is a confidential issue. Your comment will not be visible to the public.');
+ expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual(
+ 'This is a confidential issue. Your comment will not be visible to the public.',
+ );
});
});
@@ -40,7 +47,9 @@ describe('Issue Warning Component', () => {
});
expect(vm.$el.querySelector('.icon')).toBeFalsy();
- expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual('This issue is confidential and locked. People without permission will never get a notification and won\'t be able to comment.');
+ expect(formatWarning(vm.$el.querySelector('span').textContent)).toEqual(
+ "This issue is confidential and locked. People without permission will never get a notification and won't be able to comment.",
+ );
});
});
});
diff --git a/spec/javascripts/vue_shared/components/loading_button_spec.js b/spec/javascripts/vue_shared/components/loading_button_spec.js
index 51c19cd4080..db89d4a934c 100644
--- a/spec/javascripts/vue_shared/components/loading_button_spec.js
+++ b/spec/javascripts/vue_shared/components/loading_button_spec.js
@@ -4,7 +4,7 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper';
const LABEL = 'Hello';
-describe('LoadingButton', function () {
+describe('LoadingButton', function() {
let vm;
let LoadingButton;
@@ -69,6 +69,7 @@ describe('LoadingButton', function () {
describe('container class', () => {
it('should default to btn btn-align-content', () => {
vm = mountComponent(LoadingButton, {});
+
expect(vm.$el.classList.contains('btn')).toEqual(true);
expect(vm.$el.classList.contains('btn-align-content')).toEqual(true);
});
@@ -77,6 +78,7 @@ describe('LoadingButton', function () {
vm = mountComponent(LoadingButton, {
containerClass: 'test-class',
});
+
expect(vm.$el.classList.contains('btn')).toEqual(false);
expect(vm.$el.classList.contains('btn-align-content')).toEqual(false);
expect(vm.$el.classList.contains('test-class')).toEqual(true);
diff --git a/spec/javascripts/vue_shared/components/loading_icon_spec.js b/spec/javascripts/vue_shared/components/loading_icon_spec.js
deleted file mode 100644
index 5cd3466f501..00000000000
--- a/spec/javascripts/vue_shared/components/loading_icon_spec.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import Vue from 'vue';
-import loadingIcon from '~/vue_shared/components/loading_icon.vue';
-
-describe('Loading Icon Component', () => {
- let LoadingIconComponent;
-
- beforeEach(() => {
- LoadingIconComponent = Vue.extend(loadingIcon);
- });
-
- it('should render a spinner font awesome icon', () => {
- const component = new LoadingIconComponent().$mount();
-
- expect(
- component.$el.querySelector('i').getAttribute('class'),
- ).toEqual('fa fa-spin fa-spinner fa-1x');
-
- expect(component.$el.tagName).toEqual('DIV');
- expect(component.$el.classList).toContain('text-center');
- expect(component.$el.classList).toContain('loading-container');
- });
-
- it('should render accessibility attributes', () => {
- const component = new LoadingIconComponent().$mount();
-
- const icon = component.$el.querySelector('i');
- expect(icon.getAttribute('aria-hidden')).toEqual('true');
- expect(icon.getAttribute('aria-label')).toEqual('Loading');
- });
-
- it('should render the provided label', () => {
- const component = new LoadingIconComponent({
- propsData: {
- label: 'This is a loading icon',
- },
- }).$mount();
-
- expect(
- component.$el.querySelector('i').getAttribute('aria-label'),
- ).toEqual('This is a loading icon');
- });
-
- it('should render the provided size', () => {
- const component = new LoadingIconComponent({
- propsData: {
- size: '2',
- },
- }).$mount();
-
- expect(
- component.$el.querySelector('i').classList.contains('fa-2x'),
- ).toEqual(true);
- });
-});
diff --git a/spec/javascripts/vue_shared/components/markdown/field_spec.js b/spec/javascripts/vue_shared/components/markdown/field_spec.js
index 69034975422..abb17440c0e 100644
--- a/spec/javascripts/vue_shared/components/markdown/field_spec.js
+++ b/spec/javascripts/vue_shared/components/markdown/field_spec.js
@@ -11,7 +11,7 @@ function assertMarkdownTabs(isWrite, writeLink, previewLink, vm) {
describe('Markdown field component', () => {
let vm;
- beforeEach((done) => {
+ beforeEach(done => {
vm = new Vue({
components: {
fieldComponent,
@@ -39,9 +39,7 @@ describe('Markdown field component', () => {
describe('mounted', () => {
it('renders textarea inside backdrop', () => {
- expect(
- vm.$el.querySelector('.zen-backdrop textarea'),
- ).not.toBeNull();
+ expect(vm.$el.querySelector('.zen-backdrop textarea')).not.toBeNull();
});
describe('markdown preview', () => {
@@ -49,73 +47,70 @@ describe('Markdown field component', () => {
let writeLink;
beforeEach(() => {
- spyOn(Vue.http, 'post').and.callFake(() => new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- json() {
- return {
- body: '<p>markdown preview</p>',
- };
- },
- });
- });
- }));
+ spyOn(Vue.http, 'post').and.callFake(
+ () =>
+ new Promise(resolve => {
+ setTimeout(() => {
+ resolve({
+ json() {
+ return {
+ body: '<p>markdown preview</p>',
+ };
+ },
+ });
+ });
+ }),
+ );
previewLink = vm.$el.querySelector('.nav-links .js-preview-link');
writeLink = vm.$el.querySelector('.nav-links .js-write-link');
});
- it('sets preview link as active', (done) => {
+ it('sets preview link as active', done => {
previewLink.click();
Vue.nextTick(() => {
- expect(
- previewLink.parentNode.classList.contains('active'),
- ).toBeTruthy();
+ expect(previewLink.parentNode.classList.contains('active')).toBeTruthy();
done();
});
});
- it('shows preview loading text', (done) => {
+ it('shows preview loading text', done => {
previewLink.click();
Vue.nextTick(() => {
- expect(
- vm.$el.querySelector('.md-preview').textContent.trim(),
- ).toContain('Loading...');
+ expect(vm.$el.querySelector('.md-preview').textContent.trim()).toContain('Loading...');
done();
});
});
- it('renders markdown preview', (done) => {
+ it('renders markdown preview', done => {
previewLink.click();
setTimeout(() => {
- expect(
- vm.$el.querySelector('.md-preview').innerHTML,
- ).toContain('<p>markdown preview</p>');
+ expect(vm.$el.querySelector('.md-preview').innerHTML).toContain(
+ '<p>markdown preview</p>',
+ );
done();
});
});
- it('renders GFM with jQuery', (done) => {
+ it('renders GFM with jQuery', done => {
spyOn($.fn, 'renderGFM');
previewLink.click();
setTimeout(() => {
- expect(
- $.fn.renderGFM,
- ).toHaveBeenCalled();
+ expect($.fn.renderGFM).toHaveBeenCalled();
done();
}, 0);
});
- it('clicking already active write or preview link does nothing', (done) => {
+ it('clicking already active write or preview link does nothing', done => {
writeLink.click();
Vue.nextTick()
.then(() => assertMarkdownTabs(true, writeLink, previewLink, vm))
@@ -134,46 +129,40 @@ describe('Markdown field component', () => {
});
describe('markdown buttons', () => {
- it('converts single words', (done) => {
+ it('converts single words', done => {
const textarea = vm.$el.querySelector('textarea');
textarea.setSelectionRange(0, 7);
vm.$el.querySelector('.js-md').click();
Vue.nextTick(() => {
- expect(
- textarea.value,
- ).toContain('**testing**');
+ expect(textarea.value).toContain('**testing**');
done();
});
});
- it('converts a line', (done) => {
+ it('converts a line', done => {
const textarea = vm.$el.querySelector('textarea');
textarea.setSelectionRange(0, 0);
- vm.$el.querySelectorAll('.js-md')[4].click();
+ vm.$el.querySelectorAll('.js-md')[5].click();
Vue.nextTick(() => {
- expect(
- textarea.value,
- ).toContain('* testing');
+ expect(textarea.value).toContain('* testing');
done();
});
});
- it('converts multiple lines', (done) => {
+ it('converts multiple lines', done => {
const textarea = vm.$el.querySelector('textarea');
textarea.setSelectionRange(0, 50);
- vm.$el.querySelectorAll('.js-md')[4].click();
+ vm.$el.querySelectorAll('.js-md')[5].click();
Vue.nextTick(() => {
- expect(
- textarea.value,
- ).toContain('* testing\n* 123');
+ expect(textarea.value).toContain('* testing\n* 123');
done();
});
diff --git a/spec/javascripts/vue_shared/components/markdown/header_spec.js b/spec/javascripts/vue_shared/components/markdown/header_spec.js
index 488575df401..59613faa49f 100644
--- a/spec/javascripts/vue_shared/components/markdown/header_spec.js
+++ b/spec/javascripts/vue_shared/components/markdown/header_spec.js
@@ -17,8 +17,24 @@ describe('Markdown field header component', () => {
Vue.nextTick(done);
});
- it('renders markdown buttons', () => {
- expect(vm.$el.querySelectorAll('.js-md').length).toBe(7);
+ it('renders markdown header buttons', () => {
+ const buttons = [
+ 'Add bold text',
+ 'Add italic text',
+ 'Insert a quote',
+ 'Insert code',
+ 'Add a link',
+ 'Add a bullet list',
+ 'Add a numbered list',
+ 'Add a task list',
+ 'Add a table',
+ 'Go full screen',
+ ];
+ const elements = vm.$el.querySelectorAll('.toolbar-btn');
+
+ elements.forEach((buttonEl, index) => {
+ expect(buttonEl.getAttribute('data-original-title')).toBe(buttons[index]);
+ });
});
it('renders `write` link as active when previewMarkdown is false', () => {
@@ -51,14 +67,16 @@ describe('Markdown field header component', () => {
spyOn(vm, '$emit');
$(document).triggerHandler('markdown-preview:show', [
- $('<form><div class="js-vue-markdown-field"><textarea class="markdown-area"></textarea></div></form>'),
+ $(
+ '<form><div class="js-vue-markdown-field"><textarea class="markdown-area"></textarea></div></form>',
+ ),
]);
expect(vm.$emit).not.toHaveBeenCalled();
});
it('blurs preview link after click', done => {
- const link = vm.$el.querySelector('li:nth-child(2) a');
+ const link = vm.$el.querySelector('li:nth-child(2) button');
spyOn(HTMLElement.prototype, 'blur');
link.click();
@@ -69,4 +87,10 @@ describe('Markdown field header component', () => {
done();
});
});
+
+ it('renders markdown table template', () => {
+ expect(vm.mdTable).toEqual(
+ '| header | header |\n| ------ | ------ |\n| cell | cell |\n| cell | cell |',
+ );
+ });
});
diff --git a/spec/javascripts/vue_shared/components/markdown/toolbar_spec.js b/spec/javascripts/vue_shared/components/markdown/toolbar_spec.js
index 3e708f865c8..e6c7abd9d3b 100644
--- a/spec/javascripts/vue_shared/components/markdown/toolbar_spec.js
+++ b/spec/javascripts/vue_shared/components/markdown/toolbar_spec.js
@@ -25,9 +25,12 @@ describe('toolbar', () => {
describe('user cannot attach file', () => {
beforeEach(() => {
- vm = mountComponent(Toolbar, Object.assign({}, props, {
- canAttachFile: false,
- }));
+ vm = mountComponent(
+ Toolbar,
+ Object.assign({}, props, {
+ canAttachFile: false,
+ }),
+ );
});
it('should not render uploading-container', () => {
diff --git a/spec/javascripts/vue_shared/components/memory_graph_spec.js b/spec/javascripts/vue_shared/components/memory_graph_spec.js
index 65d8ed39ade..78c3ae3ddb3 100644
--- a/spec/javascripts/vue_shared/components/memory_graph_spec.js
+++ b/spec/javascripts/vue_shared/components/memory_graph_spec.js
@@ -52,8 +52,9 @@ describe('MemoryGraph', () => {
it('should show human readable median value based on provided median timestamp', () => {
vm.deploymentTime = mockMedian;
const formattedMedian = vm.getFormattedMedian;
- expect(formattedMedian.indexOf('Deployed') > -1).toBeTruthy();
- expect(formattedMedian.indexOf('ago') > -1).toBeTruthy();
+
+ expect(formattedMedian.indexOf('Deployed')).toBeGreaterThan(-1);
+ expect(formattedMedian.indexOf('ago')).toBeGreaterThan(-1);
});
});
});
@@ -62,6 +63,7 @@ describe('MemoryGraph', () => {
describe('getMedianMetricIndex', () => {
it('should return index of closest metric timestamp to that of median', () => {
const matchingIndex = vm.getMedianMetricIndex(mockMedian, mockMetrics);
+
expect(matchingIndex).toBe(mockMedianIndex);
});
});
@@ -69,6 +71,7 @@ describe('MemoryGraph', () => {
describe('getGraphPlotValues', () => {
it('should return Object containing values to plot graph', () => {
const plotValues = vm.getGraphPlotValues(mockMedian, mockMetrics);
+
expect(plotValues.pathD).toBeDefined();
expect(Array.isArray(plotValues.pathD)).toBeTruthy();
@@ -90,7 +93,7 @@ describe('MemoryGraph', () => {
expect(el.querySelector('svg')).toBeDefined();
});
- it('should render graph when renderGraph is called internally', (done) => {
+ it('should render graph when renderGraph is called internally', done => {
const { pathD, pathViewBox, dotX, dotY } = vm.getGraphPlotValues(mockMedian, mockMetrics);
vm.height = defaultHeight;
vm.width = defaultWidth;
@@ -101,16 +104,21 @@ describe('MemoryGraph', () => {
Vue.nextTick(() => {
const svgEl = el.querySelector('svg');
+
expect(svgEl).toBeDefined();
expect(svgEl.getAttribute('height')).toBe(defaultHeight);
expect(svgEl.getAttribute('width')).toBe(defaultWidth);
const pathEl = el.querySelector('path');
+
expect(pathEl).toBeDefined();
expect(pathEl.getAttribute('d')).toBe(`M ${pathD}`);
- expect(pathEl.getAttribute('viewBox')).toBe(`0 0 ${pathViewBox.lineWidth} ${pathViewBox.diff}`);
+ expect(pathEl.getAttribute('viewBox')).toBe(
+ `0 0 ${pathViewBox.lineWidth} ${pathViewBox.diff}`,
+ );
const circleEl = el.querySelector('circle');
+
expect(circleEl).toBeDefined();
expect(circleEl.getAttribute('r')).toBe('1.5');
expect(circleEl.getAttribute('transform')).toBe('translate(0 -1)');
diff --git a/spec/javascripts/vue_shared/components/navigation_tabs_spec.js b/spec/javascripts/vue_shared/components/navigation_tabs_spec.js
index 09fda95d7d3..462bfc10664 100644
--- a/spec/javascripts/vue_shared/components/navigation_tabs_spec.js
+++ b/spec/javascripts/vue_shared/components/navigation_tabs_spec.js
@@ -46,7 +46,9 @@ describe('navigation tabs component', () => {
it('should render badge', () => {
expect(vm.$el.querySelector('.js-pipelines-tab-all .badge').textContent.trim()).toEqual('1');
- expect(vm.$el.querySelector('.js-pipelines-tab-pending .badge').textContent.trim()).toEqual('0');
+ expect(vm.$el.querySelector('.js-pipelines-tab-pending .badge').textContent.trim()).toEqual(
+ '0',
+ );
});
it('should not render badge', () => {
@@ -56,6 +58,7 @@ describe('navigation tabs component', () => {
it('should trigger onTabClick', () => {
spyOn(vm, '$emit');
vm.$el.querySelector('.js-pipelines-tab-pending').click();
+
expect(vm.$emit).toHaveBeenCalledWith('onChangeTab', 'pending');
});
});
diff --git a/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js b/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
index db665fdaad3..45f131194ca 100644
--- a/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
+++ b/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
@@ -26,6 +26,7 @@ describe('issue placeholder system note component', () => {
expect(vm.$el.querySelector('.user-avatar-link').getAttribute('href')).toEqual(
userDataMock.path,
);
+
expect(vm.$el.querySelector('.user-avatar-link img').getAttribute('src')).toEqual(
`${userDataMock.avatar_url}?width=40`,
);
@@ -37,6 +38,7 @@ describe('issue placeholder system note component', () => {
expect(vm.$el.querySelector('.note-header-info a').getAttribute('href')).toEqual(
userDataMock.path,
);
+
expect(
vm.$el.querySelector('.note-header-info .note-headline-light').textContent.trim(),
).toEqual(`@${userDataMock.username}`);
diff --git a/spec/javascripts/vue_shared/components/notes/placeholder_system_note_spec.js b/spec/javascripts/vue_shared/components/notes/placeholder_system_note_spec.js
index 262571efcb8..6013e85811a 100644
--- a/spec/javascripts/vue_shared/components/notes/placeholder_system_note_spec.js
+++ b/spec/javascripts/vue_shared/components/notes/placeholder_system_note_spec.js
@@ -20,6 +20,8 @@ describe('placeholder system note component', () => {
});
expect(vm.$el.tagName).toEqual('LI');
- expect(vm.$el.querySelector('.timeline-content em').textContent.trim()).toEqual('This is a placeholder');
+ expect(vm.$el.querySelector('.timeline-content em').textContent.trim()).toEqual(
+ 'This is a placeholder',
+ );
});
});
diff --git a/spec/javascripts/vue_shared/components/notes/system_note_spec.js b/spec/javascripts/vue_shared/components/notes/system_note_spec.js
index 2a6015fe35f..adcb1c858aa 100644
--- a/spec/javascripts/vue_shared/components/notes/system_note_spec.js
+++ b/spec/javascripts/vue_shared/components/notes/system_note_spec.js
@@ -9,7 +9,7 @@ describe('system note component', () => {
beforeEach(() => {
props = {
note: {
- id: 1424,
+ id: '1424',
author: {
id: 1,
name: 'Root',
diff --git a/spec/javascripts/vue_shared/components/pagination_links_spec.js b/spec/javascripts/vue_shared/components/pagination_links_spec.js
new file mode 100644
index 00000000000..d0cb3731050
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/pagination_links_spec.js
@@ -0,0 +1,59 @@
+import Vue from 'vue';
+import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
+import { s__ } from '~/locale';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Pagination links component', () => {
+ const paginationLinksComponent = Vue.extend(PaginationLinks);
+ const change = page => page;
+ const pageInfo = {
+ page: 3,
+ perPage: 5,
+ total: 30,
+ };
+ const translations = {
+ firstText: s__('Pagination|« First'),
+ prevText: s__('Pagination|Prev'),
+ nextText: s__('Pagination|Next'),
+ lastText: s__('Pagination|Last »'),
+ };
+
+ let paginationLinks;
+ let glPagination;
+ let destinationComponent;
+
+ beforeEach(() => {
+ paginationLinks = mountComponent(paginationLinksComponent, {
+ change,
+ pageInfo,
+ });
+ [glPagination] = paginationLinks.$children;
+ [destinationComponent] = glPagination.$children;
+ });
+
+ afterEach(() => {
+ paginationLinks.$destroy();
+ });
+
+ it('should provide translated text to GitLab UI pagination', () => {
+ Object.entries(translations).forEach(entry => {
+ expect(destinationComponent[entry[0]]).toBe(entry[1]);
+ });
+ });
+
+ it('should pass change to GitLab UI pagination', () => {
+ expect(Object.is(glPagination.change, change)).toBe(true);
+ });
+
+ it('should pass page from pageInfo to GitLab UI pagination', () => {
+ expect(destinationComponent.value).toBe(pageInfo.page);
+ });
+
+ it('should pass per page from pageInfo to GitLab UI pagination', () => {
+ expect(destinationComponent.perPage).toBe(pageInfo.perPage);
+ });
+
+ it('should pass total items from pageInfo to GitLab UI pagination', () => {
+ expect(destinationComponent.totalRows).toBe(pageInfo.total);
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/panel_resizer_spec.js b/spec/javascripts/vue_shared/components/panel_resizer_spec.js
index f1e62069462..49a580be06b 100644
--- a/spec/javascripts/vue_shared/components/panel_resizer_spec.js
+++ b/spec/javascripts/vue_shared/components/panel_resizer_spec.js
@@ -8,8 +8,23 @@ describe('Panel Resizer component', () => {
const triggerEvent = (eventName, el = vm.$el, clientX = 0) => {
const event = document.createEvent('MouseEvents');
- event.initMouseEvent(eventName, true, true, window, 1, clientX, 0, clientX, 0, false, false,
- false, false, 0, null);
+ event.initMouseEvent(
+ eventName,
+ true,
+ true,
+ window,
+ 1,
+ clientX,
+ 0,
+ clientX,
+ 0,
+ false,
+ false,
+ false,
+ false,
+ 0,
+ null,
+ );
el.dispatchEvent(event);
};
@@ -53,7 +68,13 @@ describe('Panel Resizer component', () => {
triggerEvent('mousedown', vm.$el);
triggerEvent('mousemove', document);
triggerEvent('mouseup', document);
- expect(vm.$emit.calls.allArgs()).toEqual([['resize-start', 100], ['update:size', 100], ['resize-end', 100]]);
+
+ expect(vm.$emit.calls.allArgs()).toEqual([
+ ['resize-start', 100],
+ ['update:size', 100],
+ ['resize-end', 100],
+ ]);
+
expect(vm.size).toBe(100);
});
});
diff --git a/spec/javascripts/vue_shared/components/pikaday_spec.js b/spec/javascripts/vue_shared/components/pikaday_spec.js
index b349e2a2a81..61f05e7a230 100644
--- a/spec/javascripts/vue_shared/components/pikaday_spec.js
+++ b/spec/javascripts/vue_shared/components/pikaday_spec.js
@@ -24,6 +24,7 @@ describe('datePicker', () => {
vm.$on('hidePicker', hidePicker);
vm.$el.querySelector('.dropdown-menu-toggle').click();
+
expect(hidePicker).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/collapsed_calendar_icon_spec.js b/spec/javascripts/vue_shared/components/sidebar/collapsed_calendar_icon_spec.js
index 8c296af6652..6bff1521695 100644
--- a/spec/javascripts/vue_shared/components/sidebar/collapsed_calendar_icon_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/collapsed_calendar_icon_spec.js
@@ -30,6 +30,7 @@ describe('collapsedCalendarIcon', () => {
vm.$on('click', click);
vm.$el.click();
+
expect(click).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js b/spec/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js
index 9d60f9c758f..c507a97d37e 100644
--- a/spec/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js
@@ -11,36 +11,22 @@ describe('collapsedGroupedDatePicker', () => {
});
});
- it('should render toggle sidebar if showToggleSidebar', (done) => {
- expect(vm.$el.querySelector('.issuable-sidebar-header')).toBeDefined();
-
- vm.showToggleSidebar = false;
- Vue.nextTick(() => {
- expect(vm.$el.querySelector('.issuable-sidebar-header')).toBeNull();
- done();
- });
- });
-
describe('toggleCollapse events', () => {
- beforeEach((done) => {
+ beforeEach(done => {
spyOn(vm, 'toggleSidebar');
vm.minDate = new Date('07/17/2016');
Vue.nextTick(done);
});
- it('should emit when sidebar is toggled', () => {
- vm.$el.querySelector('.gutter-toggle').click();
- expect(vm.toggleSidebar).toHaveBeenCalled();
- });
-
it('should emit when collapsed-calendar-icon is clicked', () => {
vm.$el.querySelector('.sidebar-collapsed-icon').click();
+
expect(vm.toggleSidebar).toHaveBeenCalled();
});
});
describe('minDate and maxDate', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.minDate = new Date('07/17/2016');
vm.maxDate = new Date('07/17/2017');
Vue.nextTick(done);
@@ -48,6 +34,7 @@ describe('collapsedGroupedDatePicker', () => {
it('should render both collapsed-calendar-icon', () => {
const icons = vm.$el.querySelectorAll('.sidebar-collapsed-icon');
+
expect(icons.length).toEqual(2);
expect(icons[0].innerText.trim()).toEqual('Jul 17 2016');
expect(icons[1].innerText.trim()).toEqual('Jul 17 2017');
@@ -55,26 +42,28 @@ describe('collapsedGroupedDatePicker', () => {
});
describe('minDate', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.minDate = new Date('07/17/2016');
Vue.nextTick(done);
});
it('should render minDate in collapsed-calendar-icon', () => {
const icons = vm.$el.querySelectorAll('.sidebar-collapsed-icon');
+
expect(icons.length).toEqual(1);
expect(icons[0].innerText.trim()).toEqual('From Jul 17 2016');
});
});
describe('maxDate', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.maxDate = new Date('07/17/2017');
Vue.nextTick(done);
});
it('should render maxDate in collapsed-calendar-icon', () => {
const icons = vm.$el.querySelectorAll('.sidebar-collapsed-icon');
+
expect(icons.length).toEqual(1);
expect(icons[0].innerText.trim()).toEqual('Until Jul 17 2017');
});
@@ -83,8 +72,15 @@ describe('collapsedGroupedDatePicker', () => {
describe('no dates', () => {
it('should render None', () => {
const icons = vm.$el.querySelectorAll('.sidebar-collapsed-icon');
+
expect(icons.length).toEqual(1);
expect(icons[0].innerText.trim()).toEqual('None');
});
+
+ it('should have tooltip as `Start and due date`', () => {
+ const icons = vm.$el.querySelectorAll('.sidebar-collapsed-icon');
+
+ expect(icons[0].dataset.originalTitle).toBe('Start and due date');
+ });
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/date_picker_spec.js b/spec/javascripts/vue_shared/components/sidebar/date_picker_spec.js
index 8840a5a9dbf..805ba7b9947 100644
--- a/spec/javascripts/vue_shared/components/sidebar/date_picker_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/date_picker_spec.js
@@ -17,6 +17,7 @@ describe('sidebarDatePicker', () => {
vm.$on('toggleCollapse', toggleCollapse);
vm.$el.querySelector('.issuable-sidebar-header .gutter-toggle').click();
+
expect(toggleCollapse).toHaveBeenCalled();
});
@@ -40,7 +41,7 @@ describe('sidebarDatePicker', () => {
expect(vm.$el.querySelector('.value-content span').innerText.trim()).toEqual('None');
});
- it('should render date-picker when editing', (done) => {
+ it('should render date-picker when editing', done => {
vm.editing = true;
Vue.nextTick(() => {
expect(vm.$el.querySelector('.pika-label')).toBeDefined();
@@ -49,7 +50,7 @@ describe('sidebarDatePicker', () => {
});
describe('editable', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.editable = true;
Vue.nextTick(done);
});
@@ -58,17 +59,18 @@ describe('sidebarDatePicker', () => {
expect(vm.$el.querySelector('.title .btn-blank').innerText.trim()).toEqual('Edit');
});
- it('should enable editing when edit button is clicked', (done) => {
+ it('should enable editing when edit button is clicked', done => {
vm.isLoading = false;
Vue.nextTick(() => {
vm.$el.querySelector('.title .btn-blank').click();
+
expect(vm.editing).toEqual(true);
done();
});
});
});
- it('should render date if selectedDate', (done) => {
+ it('should render date if selectedDate', done => {
vm.selectedDate = new Date('07/07/2017');
Vue.nextTick(() => {
expect(vm.$el.querySelector('.value-content strong').innerText.trim()).toEqual('Jul 7, 2017');
@@ -77,7 +79,7 @@ describe('sidebarDatePicker', () => {
});
describe('selectedDate and editable', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.selectedDate = new Date('07/07/2017');
vm.editable = true;
Vue.nextTick(done);
@@ -92,12 +94,13 @@ describe('sidebarDatePicker', () => {
vm.$on('saveDate', saveDate);
vm.$el.querySelector('.value-content .btn-blank').click();
+
expect(saveDate).toHaveBeenCalled();
});
});
describe('showToggleSidebar', () => {
- beforeEach((done) => {
+ beforeEach(done => {
vm.showToggleSidebar = true;
Vue.nextTick(done);
});
@@ -111,6 +114,7 @@ describe('sidebarDatePicker', () => {
vm.$on('toggleCollapse', toggleCollapse);
vm.$el.querySelector('.title .gutter-toggle').click();
+
expect(toggleCollapse).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/base_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/base_spec.js
index e8685ab48be..c44b04009ca 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/base_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/base_spec.js
@@ -33,6 +33,7 @@ describe('BaseComponent', () => {
it('returns correct string when showCreate prop is `false`', () => {
const mockConfigNonEditable = Object.assign({}, mockConfig, { showCreate: false });
const vmNonEditable = createComponent(mockConfigNonEditable);
+
expect(vmNonEditable.hiddenInputName).toBe('label_id[]');
vmNonEditable.$destroy();
});
@@ -46,6 +47,7 @@ describe('BaseComponent', () => {
it('return `Create group label` when `isProject` prop is false', () => {
const mockConfigGroup = Object.assign({}, mockConfig, { isProject: false });
const vmGroup = createComponent(mockConfigGroup);
+
expect(vmGroup.createLabelTitle).toBe('Create group label');
vmGroup.$destroy();
});
@@ -59,6 +61,7 @@ describe('BaseComponent', () => {
it('return `Manage group labels` when `isProject` prop is false', () => {
const mockConfigGroup = Object.assign({}, mockConfig, { isProject: false });
const vmGroup = createComponent(mockConfigGroup);
+
expect(vmGroup.manageLabelsTitle).toBe('Manage group labels');
vmGroup.$destroy();
});
@@ -70,6 +73,7 @@ describe('BaseComponent', () => {
it('emits onLabelClick event with label and list of labels as params', () => {
spyOn(vm, '$emit');
vm.handleClick(mockLabels[0]);
+
expect(vm.$emit).toHaveBeenCalledWith('onLabelClick', mockLabels[0]);
});
});
@@ -78,6 +82,7 @@ describe('BaseComponent', () => {
it('emits toggleCollapse event on component', () => {
spyOn(vm, '$emit');
vm.handleCollapsedValueClick();
+
expect(vm.$emit).toHaveBeenCalledWith('toggleCollapse');
});
});
@@ -86,6 +91,7 @@ describe('BaseComponent', () => {
it('emits onDropdownClose event on component', () => {
spyOn(vm, '$emit');
vm.handleDropdownHidden();
+
expect(vm.$emit).toHaveBeenCalledWith('onDropdownClose');
});
});
@@ -114,6 +120,7 @@ describe('BaseComponent', () => {
it('renders `.dropdown-menu` element', () => {
const dropdownMenuEl = vm.$el.querySelector('.dropdown-menu');
+
expect(dropdownMenuEl).not.toBeNull();
expect(dropdownMenuEl.querySelector('.dropdown-page-one')).not.toBeNull();
expect(dropdownMenuEl.querySelector('.dropdown-content')).not.toBeNull();
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_button_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_button_spec.js
index f25c70db125..5cf6afebd7e 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_button_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_button_spec.js
@@ -34,6 +34,7 @@ describe('DropdownButtonComponent', () => {
it('returns text as `Label` when `labels` prop is empty array', () => {
const mockEmptyLabels = Object.assign({}, componentConfig, { labels: [] });
const vmEmptyLabels = createComponent(mockEmptyLabels);
+
expect(vmEmptyLabels.dropdownToggleText).toBe('Label');
vmEmptyLabels.$destroy();
});
@@ -43,6 +44,7 @@ describe('DropdownButtonComponent', () => {
labels: mockLabels.concat(mockLabels),
});
const vmMoreLabels = createComponent(mockMoreLabels);
+
expect(vmMoreLabels.dropdownToggleText).toBe('Foo Label +1 more');
vmMoreLabels.$destroy();
});
@@ -69,12 +71,14 @@ describe('DropdownButtonComponent', () => {
it('renders dropdown toggle text element', () => {
const dropdownToggleTextEl = vm.$el.querySelector('.dropdown-toggle-text');
+
expect(dropdownToggleTextEl).not.toBeNull();
expect(dropdownToggleTextEl.innerText.trim()).toBe('Foo Label');
});
it('renders dropdown button icon', () => {
const dropdownIconEl = vm.$el.querySelector('i.fa');
+
expect(dropdownIconEl).not.toBeNull();
expect(dropdownIconEl.classList.contains('fa-chevron-down')).toBe(true);
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js
index ce559fe0335..b8f32f96332 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js
@@ -6,7 +6,7 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper';
import { mockSuggestedColors } from './mock_data';
-const createComponent = (headerTitle) => {
+const createComponent = headerTitle => {
const Component = Vue.extend(dropdownCreateLabelComponent);
return mountComponent(Component, {
@@ -38,13 +38,17 @@ describe('DropdownCreateLabelComponent', () => {
});
it('renders `Go back` button on component header', () => {
- const backButtonEl = vm.$el.querySelector('.dropdown-title button.dropdown-title-button.dropdown-menu-back');
+ const backButtonEl = vm.$el.querySelector(
+ '.dropdown-title button.dropdown-title-button.dropdown-menu-back',
+ );
+
expect(backButtonEl).not.toBe(null);
expect(backButtonEl.querySelector('.fa-arrow-left')).not.toBe(null);
});
it('renders component header element as `Create new label` when `headerTitle` prop is not provided', () => {
const headerEl = vm.$el.querySelector('.dropdown-title');
+
expect(headerEl.innerText.trim()).toContain('Create new label');
});
@@ -52,12 +56,16 @@ describe('DropdownCreateLabelComponent', () => {
const headerTitle = 'Create project label';
const vmWithHeaderTitle = createComponent(headerTitle);
const headerEl = vmWithHeaderTitle.$el.querySelector('.dropdown-title');
+
expect(headerEl.innerText.trim()).toContain(headerTitle);
vmWithHeaderTitle.$destroy();
});
it('renders `Close` button on component header', () => {
- const closeButtonEl = vm.$el.querySelector('.dropdown-title button.dropdown-title-button.dropdown-menu-close');
+ const closeButtonEl = vm.$el.querySelector(
+ '.dropdown-title button.dropdown-title-button.dropdown-menu-close',
+ );
+
expect(closeButtonEl).not.toBe(null);
expect(closeButtonEl.querySelector('.fa-times.dropdown-menu-close-icon')).not.toBe(null);
});
@@ -69,23 +77,29 @@ describe('DropdownCreateLabelComponent', () => {
it('renders suggested colors list elements', () => {
const colorsListContainerEl = vm.$el.querySelector('.suggest-colors.suggest-colors-dropdown');
+
expect(colorsListContainerEl).not.toBe(null);
expect(colorsListContainerEl.querySelectorAll('a').length).toBe(mockSuggestedColors.length);
const colorItemEl = colorsListContainerEl.querySelectorAll('a')[0];
+
expect(colorItemEl.dataset.color).toBe(vm.suggestedColors[0]);
expect(colorItemEl.getAttribute('style')).toBe('background-color: rgb(0, 51, 204);');
});
it('renders color input element', () => {
expect(vm.$el.querySelector('.dropdown-label-color-input')).not.toBe(null);
- expect(vm.$el.querySelector('.dropdown-label-color-preview.js-dropdown-label-color-preview')).not.toBe(null);
+ expect(
+ vm.$el.querySelector('.dropdown-label-color-preview.js-dropdown-label-color-preview'),
+ ).not.toBe(null);
+
expect(vm.$el.querySelector('input#new_label_color.default-dropdown-input')).not.toBe(null);
});
it('renders component action buttons', () => {
const createBtnEl = vm.$el.querySelector('button.js-new-label-btn');
const cancelBtnEl = vm.$el.querySelector('button.js-cancel-label-btn');
+
expect(createBtnEl).not.toBe(null);
expect(createBtnEl.innerText.trim()).toBe('Create');
expect(cancelBtnEl.innerText.trim()).toBe('Cancel');
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_footer_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_footer_spec.js
index debeab25bd6..3711e9dac8c 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_footer_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_footer_spec.js
@@ -36,19 +36,24 @@ describe('DropdownFooterComponent', () => {
describe('template', () => {
it('renders link element with `Create new label` when `createLabelTitle` prop is not provided', () => {
const createLabelEl = vm.$el.querySelector('.dropdown-footer-list .dropdown-toggle-page');
+
expect(createLabelEl).not.toBeNull();
expect(createLabelEl.innerText.trim()).toBe('Create new label');
});
it('renders link element with value of `createLabelTitle` prop', () => {
const vmWithCreateLabelTitle = createComponent(mockConfig.labelsWebUrl, createLabelTitle);
- const createLabelEl = vmWithCreateLabelTitle.$el.querySelector('.dropdown-footer-list .dropdown-toggle-page');
+ const createLabelEl = vmWithCreateLabelTitle.$el.querySelector(
+ '.dropdown-footer-list .dropdown-toggle-page',
+ );
+
expect(createLabelEl.innerText.trim()).toBe(createLabelTitle);
vmWithCreateLabelTitle.$destroy();
});
it('renders link element with `Manage labels` when `manageLabelsTitle` prop is not provided', () => {
const manageLabelsEl = vm.$el.querySelector('.dropdown-footer-list .dropdown-external-link');
+
expect(manageLabelsEl).not.toBeNull();
expect(manageLabelsEl.getAttribute('href')).toBe(vm.labelsWebUrl);
expect(manageLabelsEl.innerText.trim()).toBe('Manage labels');
@@ -60,7 +65,10 @@ describe('DropdownFooterComponent', () => {
createLabelTitle,
manageLabelsTitle,
);
- const manageLabelsEl = vmWithManageLabelsTitle.$el.querySelector('.dropdown-footer-list .dropdown-external-link');
+ const manageLabelsEl = vmWithManageLabelsTitle.$el.querySelector(
+ '.dropdown-footer-list .dropdown-external-link',
+ );
+
expect(manageLabelsEl.innerText.trim()).toBe(manageLabelsTitle);
vmWithManageLabelsTitle.$destroy();
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_header_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_header_spec.js
index cdf234bb0c4..115e21e4f9f 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_header_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_header_spec.js
@@ -24,11 +24,15 @@ describe('DropdownHeaderComponent', () => {
describe('template', () => {
it('renders header text element', () => {
const headerEl = vm.$el.querySelector('.dropdown-title span');
+
expect(headerEl.innerText.trim()).toBe('Assign labels');
});
it('renders `Close` button element', () => {
- const closeBtnEl = vm.$el.querySelector('.dropdown-title button.dropdown-title-button.dropdown-menu-close');
+ const closeBtnEl = vm.$el.querySelector(
+ '.dropdown-title button.dropdown-title-button.dropdown-menu-close',
+ );
+
expect(closeBtnEl).not.toBeNull();
expect(closeBtnEl.querySelector('.fa-times.dropdown-menu-close-icon')).not.toBeNull();
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_search_input_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_search_input_spec.js
index 57608d957e7..c30e619e76b 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_search_input_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_search_input_spec.js
@@ -24,6 +24,7 @@ describe('DropdownSearchInputComponent', () => {
describe('template', () => {
it('renders input element with type `search`', () => {
const inputEl = vm.$el.querySelector('input.dropdown-input-field');
+
expect(inputEl).not.toBeNull();
expect(inputEl.getAttribute('type')).toBe('search');
});
@@ -33,7 +34,9 @@ describe('DropdownSearchInputComponent', () => {
});
it('renders clear search icon element', () => {
- expect(vm.$el.querySelector('.fa-times.dropdown-input-clear.js-dropdown-input-clear')).not.toBeNull();
+ expect(
+ vm.$el.querySelector('.fa-times.dropdown-input-clear.js-dropdown-input-clear'),
+ ).not.toBeNull();
});
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
index 7c3d2711f65..6c84d2e167c 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
@@ -35,6 +35,7 @@ describe('DropdownTitleComponent', () => {
it('renders `Edit` button element', () => {
const editBtnEl = vm.$el.querySelector('button.edit-link.js-sidebar-dropdown-toggle');
+
expect(editBtnEl).not.toBeNull();
expect(editBtnEl.innerText.trim()).toBe('Edit');
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js
index da74595bcdc..804b33422bd 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js
@@ -29,12 +29,14 @@ describe('DropdownValueCollapsedComponent', () => {
describe('labelsList', () => {
it('returns empty text when `labels` prop is empty array', () => {
const vmEmptyLabels = createComponent([]);
+
expect(vmEmptyLabels.labelsList).toBe('');
vmEmptyLabels.$destroy();
});
it('returns labels names separated by coma when `labels` prop has more than one item', () => {
const vmMoreLabels = createComponent(mockLabels.concat(mockLabels));
+
expect(vmMoreLabels.labelsList).toBe('Foo Label, Foo Label');
vmMoreLabels.$destroy();
});
@@ -46,7 +48,10 @@ describe('DropdownValueCollapsedComponent', () => {
}
const vmMoreLabels = createComponent(mockMoreLabels);
- expect(vmMoreLabels.labelsList).toBe('Foo Label, Foo Label, Foo Label, Foo Label, Foo Label, and 2 more');
+
+ expect(vmMoreLabels.labelsList).toBe(
+ 'Foo Label, Foo Label, Foo Label, Foo Label, Foo Label, and 2 more',
+ );
vmMoreLabels.$destroy();
});
@@ -61,6 +66,7 @@ describe('DropdownValueCollapsedComponent', () => {
it('emits onValueClick event on component', () => {
spyOn(vm, '$emit');
vm.handleClick();
+
expect(vm.$emit).toHaveBeenCalledWith('onValueClick');
});
});
diff --git a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_spec.js b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_spec.js
index 370a296bd8f..3fff781594f 100644
--- a/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_spec.js
+++ b/spec/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_spec.js
@@ -33,6 +33,7 @@ describe('DropdownValueComponent', () => {
describe('isEmpty', () => {
it('returns true if `labels` prop is empty', () => {
const vmEmptyLabels = createComponent([]);
+
expect(vmEmptyLabels.isEmpty).toBe(true);
vmEmptyLabels.$destroy();
});
@@ -46,9 +47,11 @@ describe('DropdownValueComponent', () => {
describe('methods', () => {
describe('labelFilterUrl', () => {
it('returns URL string starting with labelFilterBasePath and encoded label.title', () => {
- expect(vm.labelFilterUrl({
- title: 'Foo bar',
- })).toBe('/gitlab-org/my-project/issues?label_name[]=Foo%20bar');
+ expect(
+ vm.labelFilterUrl({
+ title: 'Foo bar',
+ }),
+ ).toBe('/gitlab-org/my-project/issues?label_name[]=Foo%20bar');
});
});
@@ -68,21 +71,29 @@ describe('DropdownValueComponent', () => {
describe('template', () => {
it('renders component container element with classes `hide-collapsed value issuable-show-labels`', () => {
- expect(vm.$el.classList.contains('hide-collapsed', 'value', 'issuable-show-labels')).toBe(true);
+ expect(vm.$el.classList.contains('hide-collapsed', 'value', 'issuable-show-labels')).toBe(
+ true,
+ );
});
it('render slot content inside component when `labels` prop is empty', () => {
const vmEmptyLabels = createComponent([]);
- expect(vmEmptyLabels.$el.querySelector('.text-secondary').innerText.trim()).toBe(mockConfig.emptyValueText);
+
+ expect(vmEmptyLabels.$el.querySelector('.text-secondary').innerText.trim()).toBe(
+ mockConfig.emptyValueText,
+ );
vmEmptyLabels.$destroy();
});
it('renders label element with filter URL', () => {
- expect(vm.$el.querySelector('a').getAttribute('href')).toBe('/gitlab-org/my-project/issues?label_name[]=Foo%20Label');
+ expect(vm.$el.querySelector('a').getAttribute('href')).toBe(
+ '/gitlab-org/my-project/issues?label_name[]=Foo%20Label',
+ );
});
it('renders label element with tooltip and styles based on label details', () => {
const labelEl = vm.$el.querySelector('a span.badge.color-label');
+
expect(labelEl).not.toBeNull();
expect(labelEl.dataset.placement).toBe('bottom');
expect(labelEl.dataset.container).toBe('body');
diff --git a/spec/javascripts/vue_shared/components/skeleton_loading_container_spec.js b/spec/javascripts/vue_shared/components/skeleton_loading_container_spec.js
deleted file mode 100644
index 34487885cf0..00000000000
--- a/spec/javascripts/vue_shared/components/skeleton_loading_container_spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import Vue from 'vue';
-import skeletonLoadingContainer from '~/vue_shared/components/skeleton_loading_container.vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
-
-describe('Skeleton loading container', () => {
- let vm;
-
- beforeEach(() => {
- const component = Vue.extend(skeletonLoadingContainer);
- vm = mountComponent(component);
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- it('renders 3 skeleton lines by default', () => {
- expect(vm.$el.querySelector('.skeleton-line-3')).not.toBeNull();
- });
-
- it('renders in full mode by default', () => {
- expect(vm.$el.classList.contains('animation-container-small')).toBeFalsy();
- });
-
- describe('small', () => {
- beforeEach((done) => {
- vm.small = true;
-
- Vue.nextTick(done);
- });
-
- it('renders in small mode', () => {
- expect(vm.$el.classList.contains('animation-container-small')).toBeTruthy();
- });
- });
-
- describe('lines', () => {
- beforeEach((done) => {
- vm.lines = 5;
-
- Vue.nextTick(done);
- });
-
- it('renders 5 lines', () => {
- expect(vm.$el.querySelector('.skeleton-line-5')).not.toBeNull();
- expect(vm.$el.querySelector('.skeleton-line-6')).toBeNull();
- });
- });
-});
diff --git a/spec/javascripts/vue_shared/components/smart_virtual_list_spec.js b/spec/javascripts/vue_shared/components/smart_virtual_list_spec.js
new file mode 100644
index 00000000000..e723fead65e
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/smart_virtual_list_spec.js
@@ -0,0 +1,83 @@
+import Vue from 'vue';
+import SmartVirtualScrollList from '~/vue_shared/components/smart_virtual_list.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+describe('Toggle Button', () => {
+ let vm;
+
+ const createComponent = ({ length, remain }) => {
+ const smartListProperties = {
+ rtag: 'section',
+ wtag: 'ul',
+ wclass: 'test-class',
+ // Size in pixels does not matter for our tests here
+ size: 35,
+ length,
+ remain,
+ };
+
+ const Component = Vue.extend({
+ components: {
+ SmartVirtualScrollList,
+ },
+ smartListProperties,
+ items: Array(length).fill(1),
+ template: `
+ <smart-virtual-scroll-list v-bind="$options.smartListProperties">
+ <li v-for="(val, key) in $options.items" :key="key">{{ key + 1 }}</li>
+ </smart-virtual-scroll-list>`,
+ });
+
+ return mountComponent(Component);
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('if the list is shorter than the maximum shown elements', () => {
+ const listLength = 10;
+
+ beforeEach(() => {
+ vm = createComponent({ length: listLength, remain: 20 });
+ });
+
+ it('renders without the vue-virtual-scroll-list component', () => {
+ expect(vm.$el.classList).not.toContain('js-virtual-list');
+ expect(vm.$el.classList).toContain('js-plain-element');
+ });
+
+ it('renders list with provided tags and classes for the wrapper elements', () => {
+ expect(vm.$el.tagName).toEqual('SECTION');
+ expect(vm.$el.firstChild.tagName).toEqual('UL');
+ expect(vm.$el.firstChild.classList).toContain('test-class');
+ });
+
+ it('renders all children list elements', () => {
+ expect(vm.$el.querySelectorAll('li').length).toEqual(listLength);
+ });
+ });
+
+ describe('if the list is longer than the maximum shown elements', () => {
+ const maxItemsShown = 20;
+
+ beforeEach(() => {
+ vm = createComponent({ length: 1000, remain: maxItemsShown });
+ });
+
+ it('uses the vue-virtual-scroll-list component', () => {
+ expect(vm.$el.classList).toContain('js-virtual-list');
+ expect(vm.$el.classList).not.toContain('js-plain-element');
+ });
+
+ it('renders list with provided tags and classes for the wrapper elements', () => {
+ expect(vm.$el.tagName).toEqual('SECTION');
+ expect(vm.$el.firstChild.tagName).toEqual('UL');
+ expect(vm.$el.firstChild.classList).toContain('test-class');
+ });
+
+ it('renders at max twice the maximum shown elements', () => {
+ expect(vm.$el.querySelectorAll('li').length).toBeLessThanOrEqual(2 * maxItemsShown);
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/stacked_progress_bar_spec.js b/spec/javascripts/vue_shared/components/stacked_progress_bar_spec.js
index 076d940961d..073d111989c 100644
--- a/spec/javascripts/vue_shared/components/stacked_progress_bar_spec.js
+++ b/spec/javascripts/vue_shared/components/stacked_progress_bar_spec.js
@@ -4,16 +4,20 @@ import stackedProgressBarComponent from '~/vue_shared/components/stacked_progres
import mountComponent from 'spec/helpers/vue_mount_component_helper';
-const createComponent = (config) => {
+const createComponent = config => {
const Component = Vue.extend(stackedProgressBarComponent);
- const defaultConfig = Object.assign({}, {
- successLabel: 'Synced',
- failureLabel: 'Failed',
- neutralLabel: 'Out of sync',
- successCount: 25,
- failureCount: 10,
- totalCount: 5000,
- }, config);
+ const defaultConfig = Object.assign(
+ {},
+ {
+ successLabel: 'Synced',
+ failureLabel: 'Failed',
+ neutralLabel: 'Out of sync',
+ successCount: 25,
+ failureCount: 10,
+ totalCount: 5000,
+ },
+ config,
+ );
return mountComponent(Component, defaultConfig);
};
@@ -44,7 +48,11 @@ describe('StackedProgressBarComponent', () => {
});
it('returns percentage with decimal place from provided count based on `totalCount`', () => {
- expect(vm.getPercent(10)).toBe(0.2);
+ expect(vm.getPercent(67)).toBe(1.3);
+ });
+
+ it('returns percentage as `< 1` from provided count based on `totalCount` when evaluated value is less than 1', () => {
+ expect(vm.getPercent(10)).toBe('< 1');
});
});
@@ -68,6 +76,7 @@ describe('StackedProgressBarComponent', () => {
it('renders empty state when count is unavailable', () => {
const vmX = createComponent({ totalCount: 0, successCount: 0, failureCount: 0 });
+
expect(vmX.$el.querySelectorAll('.status-unavailable').length).not.toBe(0);
vmX.$destroy();
});
diff --git a/spec/javascripts/vue_shared/components/table_pagination_spec.js b/spec/javascripts/vue_shared/components/table_pagination_spec.js
index c36b607a34e..0dcb712e720 100644
--- a/spec/javascripts/vue_shared/components/table_pagination_spec.js
+++ b/spec/javascripts/vue_shared/components/table_pagination_spec.js
@@ -5,13 +5,13 @@ describe('Pagination component', () => {
let component;
let PaginationComponent;
let spy;
- let mountComponet;
+ let mountComponent;
beforeEach(() => {
spy = jasmine.createSpy('spy');
PaginationComponent = Vue.extend(paginationComp);
- mountComponet = function (props) {
+ mountComponent = function(props) {
return new PaginationComponent({
propsData: props,
}).$mount();
@@ -20,7 +20,7 @@ describe('Pagination component', () => {
describe('render', () => {
it('should not render anything', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 1,
page: 1,
@@ -37,7 +37,7 @@ describe('Pagination component', () => {
describe('prev button', () => {
it('should be disabled and non clickable', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 2,
page: 1,
@@ -59,7 +59,7 @@ describe('Pagination component', () => {
});
it('should be enabled and clickable', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 3,
page: 2,
@@ -72,13 +72,14 @@ describe('Pagination component', () => {
});
component.$el.querySelector('.js-previous-button a').click();
+
expect(spy).toHaveBeenCalledWith(1);
});
});
describe('first button', () => {
it('should call the change callback with the first page', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 3,
page: 2,
@@ -102,7 +103,7 @@ describe('Pagination component', () => {
describe('last button', () => {
it('should call the change callback with the last page', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 3,
page: 2,
@@ -126,7 +127,7 @@ describe('Pagination component', () => {
describe('next button', () => {
it('should be disabled and non clickable', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 5,
page: 5,
@@ -138,9 +139,7 @@ describe('Pagination component', () => {
change: spy,
});
- expect(
- component.$el.querySelector('.js-next-button').textContent.trim(),
- ).toEqual('Next');
+ expect(component.$el.querySelector('.js-next-button').textContent.trim()).toEqual('Next');
component.$el.querySelector('.js-next-button a').click();
@@ -148,7 +147,7 @@ describe('Pagination component', () => {
});
it('should be enabled and clickable', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 4,
page: 3,
@@ -168,7 +167,7 @@ describe('Pagination component', () => {
describe('numbered buttons', () => {
it('should render 5 pages', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 4,
page: 3,
@@ -185,7 +184,7 @@ describe('Pagination component', () => {
});
it('should render the spread operator', () => {
- component = mountComponet({
+ component = mountComponent({
pageInfo: {
nextPage: 4,
page: 3,
diff --git a/spec/javascripts/vue_shared/components/time_ago_tooltip_spec.js b/spec/javascripts/vue_shared/components/time_ago_tooltip_spec.js
index b4fb568f1d4..745571d0a97 100644
--- a/spec/javascripts/vue_shared/components/time_ago_tooltip_spec.js
+++ b/spec/javascripts/vue_shared/components/time_ago_tooltip_spec.js
@@ -22,9 +22,10 @@ describe('Time ago with tooltip component', () => {
}).$mount();
expect(vm.$el.tagName).toEqual('TIME');
- expect(
- vm.$el.getAttribute('data-original-title'),
- ).toEqual(formatDate('2017-05-08T14:57:39.781Z'));
+ expect(vm.$el.getAttribute('data-original-title')).toEqual(
+ formatDate('2017-05-08T14:57:39.781Z'),
+ );
+
expect(vm.$el.getAttribute('data-placement')).toEqual('top');
const timeago = getTimeago();
diff --git a/spec/javascripts/vue_shared/components/toggle_button_spec.js b/spec/javascripts/vue_shared/components/toggle_button_spec.js
index 71952cc39e0..444ca451534 100644
--- a/spec/javascripts/vue_shared/components/toggle_button_spec.js
+++ b/spec/javascripts/vue_shared/components/toggle_button_spec.js
@@ -51,9 +51,11 @@ describe('Toggle Button', () => {
it('sets aria-label representing toggle state', () => {
vm.value = true;
+
expect(vm.ariaLabel).toEqual('Toggle Status: ON');
vm.value = false;
+
expect(vm.ariaLabel).toEqual('Toggle Status: OFF');
});
diff --git a/spec/javascripts/vue_shared/components/tooltip_on_truncate_spec.js b/spec/javascripts/vue_shared/components/tooltip_on_truncate_spec.js
new file mode 100644
index 00000000000..997d84dcc42
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/tooltip_on_truncate_spec.js
@@ -0,0 +1,156 @@
+import { mountComponentWithRender } from 'spec/helpers/vue_mount_component_helper';
+import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+
+const TEST_TITLE = 'lorem-ipsum-dolar-sit-amit-consectur-adipiscing-elit-sed-do';
+const CLASS_SHOW_TOOLTIP = 'js-show-tooltip';
+const STYLE_TRUNCATED = {
+ display: 'inline-block',
+ 'max-width': '20px',
+};
+const STYLE_NORMAL = {
+ display: 'inline-block',
+ 'max-width': '1000px',
+};
+
+function mountTooltipOnTruncate(options, createChildren) {
+ return mountComponentWithRender(h => h(TooltipOnTruncate, options, createChildren(h)), '#app');
+}
+
+describe('TooltipOnTruncate component', () => {
+ let vm;
+
+ beforeEach(() => {
+ const el = document.createElement('div');
+ el.id = 'app';
+ document.body.appendChild(el);
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('with default target', () => {
+ it('renders tooltip if truncated', done => {
+ const options = {
+ style: STYLE_TRUNCATED,
+ props: {
+ title: TEST_TITLE,
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, () => [TEST_TITLE]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
+ expect(vm.$el).toHaveData('original-title', TEST_TITLE);
+ expect(vm.$el).toHaveData('placement', 'top');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('does not render tooltip if normal', done => {
+ const options = {
+ style: STYLE_NORMAL,
+ props: {
+ title: TEST_TITLE,
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, () => [TEST_TITLE]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).not.toHaveClass(CLASS_SHOW_TOOLTIP);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('with child target', () => {
+ it('renders tooltip if truncated', done => {
+ const options = {
+ style: STYLE_NORMAL,
+ props: {
+ title: TEST_TITLE,
+ truncateTarget: 'child',
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_TRUNCATED }, TEST_TITLE)]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('does not render tooltip if normal', done => {
+ const options = {
+ props: {
+ title: TEST_TITLE,
+ truncateTarget: 'child',
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_NORMAL }, TEST_TITLE)]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).not.toHaveClass(CLASS_SHOW_TOOLTIP);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('with fn target', () => {
+ it('renders tooltip if truncated', done => {
+ const options = {
+ style: STYLE_NORMAL,
+ props: {
+ title: TEST_TITLE,
+ truncateTarget: el => el.childNodes[1],
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, h => [
+ h('a', { style: STYLE_NORMAL }, TEST_TITLE),
+ h('span', { style: STYLE_TRUNCATED }, TEST_TITLE),
+ ]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('placement', () => {
+ it('sets data-placement when tooltip is rendered', done => {
+ const options = {
+ props: {
+ title: TEST_TITLE,
+ truncateTarget: 'child',
+ placement: 'bottom',
+ },
+ };
+
+ vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_TRUNCATED }, TEST_TITLE)]);
+
+ vm.$nextTick()
+ .then(() => {
+ expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
+ expect(vm.$el).toHaveData('placement', options.props.placement);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
index dc7652c77f7..5c4aa7cf844 100644
--- a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
+++ b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import { placeholderImage } from '~/lazy_loader';
import userAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import mountComponent, { mountComponentWithSlots } from 'spec/helpers/vue_mount_component_helper';
const DEFAULT_PROPS = {
size: 99,
@@ -32,18 +32,12 @@ describe('User Avatar Image Component', function() {
});
it('should have <img> as a child element', function() {
- expect(vm.$el.tagName).toBe('IMG');
- expect(vm.$el.getAttribute('src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
- expect(vm.$el.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
- expect(vm.$el.getAttribute('alt')).toBe(DEFAULT_PROPS.imgAlt);
- });
-
- it('should properly compute tooltipContainer', function() {
- expect(vm.tooltipContainer).toBe('body');
- });
+ const imageElement = vm.$el.querySelector('img');
- it('should properly render tooltipContainer', function() {
- expect(vm.$el.getAttribute('data-container')).toBe('body');
+ expect(imageElement).not.toBe(null);
+ expect(imageElement.getAttribute('src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
+ expect(imageElement.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
+ expect(imageElement.getAttribute('alt')).toBe(DEFAULT_PROPS.imgAlt);
});
it('should properly compute avatarSizeClass', function() {
@@ -51,7 +45,7 @@ describe('User Avatar Image Component', function() {
});
it('should properly render img css', function() {
- const { classList } = vm.$el;
+ const { classList } = vm.$el.querySelector('img');
const containsAvatar = classList.contains('avatar');
const containsSizeClass = classList.contains('s99');
const containsCustomClass = classList.contains(DEFAULT_PROPS.cssClasses);
@@ -73,12 +67,41 @@ describe('User Avatar Image Component', function() {
});
it('should add lazy attributes', function() {
- const { classList } = vm.$el;
- const lazyClass = classList.contains('lazy');
+ const imageElement = vm.$el.querySelector('img');
+ const lazyClass = imageElement.classList.contains('lazy');
expect(lazyClass).toBe(true);
- expect(vm.$el.getAttribute('src')).toBe(placeholderImage);
- expect(vm.$el.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
+ expect(imageElement.getAttribute('src')).toBe(placeholderImage);
+ expect(imageElement.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
+ });
+ });
+
+ describe('dynamic tooltip content', () => {
+ const props = DEFAULT_PROPS;
+ const slots = {
+ default: ['Action!'],
+ };
+
+ beforeEach(() => {
+ vm = mountComponentWithSlots(UserAvatarImage, { props, slots }).$mount();
+ });
+
+ it('renders the tooltip slot', () => {
+ expect(vm.$el.querySelector('.js-user-avatar-image-toolip')).not.toBe(null);
+ });
+
+ it('renders the tooltip content', () => {
+ expect(vm.$el.querySelector('.js-user-avatar-image-toolip').textContent).toContain(
+ slots.default[0],
+ );
+ });
+
+ it('does not render tooltip data attributes for on avatar image', () => {
+ const avatarImg = vm.$el.querySelector('img');
+
+ expect(avatarImg.dataset.originalTitle).not.toBeDefined();
+ expect(avatarImg.dataset.placement).not.toBeDefined();
+ expect(avatarImg.dataset.container).not.toBeDefined();
});
});
});
diff --git a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_link_spec.js b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_link_spec.js
index 4c5c242cbb3..0151ad23ba2 100644
--- a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_link_spec.js
+++ b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_link_spec.js
@@ -2,8 +2,8 @@ import _ from 'underscore';
import Vue from 'vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-describe('User Avatar Link Component', function () {
- beforeEach(function () {
+describe('User Avatar Link Component', function() {
+ beforeEach(function() {
this.propsData = {
linkHref: 'myavatarurl.com',
imgSize: 99,
@@ -24,67 +24,80 @@ describe('User Avatar Link Component', function () {
[this.userAvatarImage] = this.userAvatarLink.$children;
});
- it('should return a defined Vue component', function () {
+ it('should return a defined Vue component', function() {
expect(this.userAvatarLink).toBeDefined();
});
- it('should have user-avatar-image registered as child component', function () {
+ it('should have user-avatar-image registered as child component', function() {
expect(this.userAvatarLink.$options.components.userAvatarImage).toBeDefined();
});
- it('user-avatar-link should have user-avatar-image as child component', function () {
+ it('user-avatar-link should have user-avatar-image as child component', function() {
expect(this.userAvatarImage).toBeDefined();
});
- it('should render <a> as a child element', function () {
+ it('should render <a> as a child element', function() {
expect(this.userAvatarLink.$el.tagName).toBe('A');
});
- it('should have <img> as a child element', function () {
+ it('should have <img> as a child element', function() {
expect(this.userAvatarLink.$el.querySelector('img')).not.toBeNull();
});
- it('should return neccessary props as defined', function () {
+ it('should return necessary props as defined', function() {
_.each(this.propsData, (val, key) => {
expect(this.userAvatarLink[key]).toBeDefined();
});
});
- describe('no username', function () {
- beforeEach(function (done) {
+ describe('no username', function() {
+ beforeEach(function(done) {
this.userAvatarLink.username = '';
Vue.nextTick(done);
});
- it('should only render image tag in link', function () {
+ it('should only render image tag in link', function() {
const childElements = this.userAvatarLink.$el.childNodes;
- expect(childElements[0].tagName).toBe('IMG');
+
+ expect(this.userAvatarLink.$el.querySelector('img')).not.toBe('null');
// Vue will render the hidden component as <!---->
expect(childElements[1].tagName).toBeUndefined();
});
- it('should render avatar image tooltip', function () {
- expect(this.userAvatarLink.$el.querySelector('img').dataset.originalTitle).toEqual(this.propsData.tooltipText);
+ it('should render avatar image tooltip', function() {
+ expect(this.userAvatarLink.shouldShowUsername).toBe(false);
+ expect(this.userAvatarLink.avatarTooltipText).toEqual(this.propsData.tooltipText);
});
});
- describe('username', function () {
- it('should not render avatar image tooltip', function () {
- expect(this.userAvatarLink.$el.querySelector('img').dataset.originalTitle).toEqual('');
+ describe('username', function() {
+ it('should not render avatar image tooltip', function() {
+ expect(
+ this.userAvatarLink.$el.querySelector('.js-user-avatar-image-toolip').innerText.trim(),
+ ).toEqual('');
});
- it('should render username prop in <span>', function () {
- expect(this.userAvatarLink.$el.querySelector('span').innerText.trim()).toEqual(this.propsData.username);
+ it('should render username prop in <span>', function() {
+ expect(
+ this.userAvatarLink.$el.querySelector('.js-user-avatar-link-username').innerText.trim(),
+ ).toEqual(this.propsData.username);
});
- it('should render text tooltip for <span>', function () {
- expect(this.userAvatarLink.$el.querySelector('span').dataset.originalTitle).toEqual(this.propsData.tooltipText);
+ it('should render text tooltip for <span>', function() {
+ expect(
+ this.userAvatarLink.$el.querySelector('.js-user-avatar-link-username').dataset
+ .originalTitle,
+ ).toEqual(this.propsData.tooltipText);
});
- it('should render text tooltip placement for <span>', function () {
- expect(this.userAvatarLink.$el.querySelector('span').getAttribute('tooltip-placement')).toEqual(this.propsData.tooltipPlacement);
+ it('should render text tooltip placement for <span>', function() {
+ expect(
+ this.userAvatarLink.$el
+ .querySelector('.js-user-avatar-link-username')
+ .getAttribute('tooltip-placement'),
+ ).toEqual(this.propsData.tooltipPlacement);
});
});
});
diff --git a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_svg_spec.js b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_svg_spec.js
index b8d639ffbec..9152fa8e12f 100644
--- a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_svg_spec.js
+++ b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_svg_spec.js
@@ -4,9 +4,9 @@ import avatarSvg from 'icons/_icon_random.svg';
const UserAvatarSvgComponent = Vue.extend(UserAvatarSvg);
-describe('User Avatar Svg Component', function () {
- describe('Initialization', function () {
- beforeEach(function () {
+describe('User Avatar Svg Component', function() {
+ describe('Initialization', function() {
+ beforeEach(function() {
this.propsData = {
size: 99,
svg: avatarSvg,
@@ -17,11 +17,11 @@ describe('User Avatar Svg Component', function () {
}).$mount();
});
- it('should return a defined Vue component', function () {
+ it('should return a defined Vue component', function() {
expect(this.userAvatarSvg).toBeDefined();
});
- it('should have <svg> as a child element', function () {
+ it('should have <svg> as a child element', function() {
expect(this.userAvatarSvg.$el.tagName).toEqual('svg');
expect(this.userAvatarSvg.$el.innerHTML).toContain('<path');
});
diff --git a/spec/javascripts/vue_shared/directives/tooltip_spec.js b/spec/javascripts/vue_shared/directives/tooltip_spec.js
index 4a644913e44..1d516a280b0 100644
--- a/spec/javascripts/vue_shared/directives/tooltip_spec.js
+++ b/spec/javascripts/vue_shared/directives/tooltip_spec.js
@@ -13,24 +13,45 @@ describe('Tooltip directive', () => {
describe('with a single tooltip', () => {
beforeEach(() => {
- const SomeComponent = Vue.extend({
+ setFixtures('<div id="dummy-element"></div>');
+ vm = new Vue({
+ el: '#dummy-element',
directives: {
tooltip,
},
- template: `
- <div
- v-tooltip
- title="foo">
- </div>
- `,
+ data() {
+ return {
+ tooltip: 'some text',
+ };
+ },
+ template: '<div v-tooltip :title="tooltip"></div>',
});
-
- vm = new SomeComponent().$mount();
});
it('should have tooltip plugin applied', () => {
expect($(vm.$el).data('bs.tooltip')).toBeDefined();
});
+
+ it('displays the title as tooltip', () => {
+ $(vm.$el).tooltip('show');
+ const tooltipElement = document.querySelector('.tooltip-inner');
+
+ expect(tooltipElement.innerText).toContain('some text');
+ });
+
+ it('updates a visible tooltip', done => {
+ $(vm.$el).tooltip('show');
+ const tooltipElement = document.querySelector('.tooltip-inner');
+
+ vm.tooltip = 'other text';
+
+ Vue.nextTick()
+ .then(() => {
+ expect(tooltipElement).toContainText('other text');
+ done();
+ })
+ .catch(done.fail);
+ });
});
describe('with multiple tooltips', () => {
@@ -58,7 +79,11 @@ describe('Tooltip directive', () => {
});
it('should have tooltip plugin applied to all instances', () => {
- expect($(vm.$el).find('.js-look-for-tooltip').data('bs.tooltip')).toBeDefined();
+ expect(
+ $(vm.$el)
+ .find('.js-look-for-tooltip')
+ .data('bs.tooltip'),
+ ).toBeDefined();
});
});
});
diff --git a/spec/javascripts/vue_shared/translate_spec.js b/spec/javascripts/vue_shared/translate_spec.js
index cbb3cbdff46..adb5ff682f0 100644
--- a/spec/javascripts/vue_shared/translate_spec.js
+++ b/spec/javascripts/vue_shared/translate_spec.js
@@ -1,88 +1,249 @@
import Vue from 'vue';
-import Translate from '~/vue_shared/translate';
+import Jed from 'jed';
-Vue.use(Translate);
+import locale from '~/locale';
+import Translate from '~/vue_shared/translate';
+import { trimText } from 'spec/helpers/vue_component_helper';
describe('Vue translate filter', () => {
let el;
+ const createTranslationMock = (key, ...translations) => {
+ const fakeLocale = new Jed({
+ domain: 'app',
+ locale_data: {
+ app: {
+ '': {
+ domain: 'app',
+ lang: 'vo',
+ plural_forms: 'nplurals=2; plural=(n != 1);',
+ },
+ [key]: translations,
+ },
+ },
+ });
+
+ // eslint-disable-next-line no-underscore-dangle
+ locale.__Rewire__('locale', fakeLocale);
+ };
+
+ afterEach(() => {
+ // eslint-disable-next-line no-underscore-dangle
+ locale.__ResetDependency__('locale');
+ });
+
beforeEach(() => {
+ Vue.use(Translate);
+
el = document.createElement('div');
document.body.appendChild(el);
});
- it('translate single text', (done) => {
- const comp = new Vue({
+ it('translate singular text (`__`)', done => {
+ const key = 'singular';
+ const translation = 'singular_translated';
+ createTranslationMock(key, translation);
+
+ const vm = new Vue({
+ el,
+ template: `
+ <span>
+ {{ __('${key}') }}
+ </span>
+ `,
+ }).$mount();
+
+ Vue.nextTick(() => {
+ expect(trimText(vm.$el.textContent)).toBe(translation);
+
+ done();
+ });
+ });
+
+ it('translate plural text (`n__`) without any substituting text', done => {
+ const key = 'plural';
+ const translationPlural = 'plural_multiple translation';
+ createTranslationMock(key, 'plural_singular translation', translationPlural);
+
+ const vm = new Vue({
el,
template: `
<span>
- {{ __('testing') }}
+ {{ n__('${key}', 'plurals', 2) }}
</span>
`,
}).$mount();
Vue.nextTick(() => {
- expect(
- comp.$el.textContent.trim(),
- ).toBe('testing');
+ expect(trimText(vm.$el.textContent)).toBe(translationPlural);
done();
});
});
- it('translate plural text with single count', (done) => {
- const comp = new Vue({
+ describe('translate plural text (`n__`) with substituting %d', () => {
+ const key = '%d day';
+
+ beforeEach(() => {
+ createTranslationMock(key, '%d singular translated', '%d plural translated');
+ });
+
+ it('and n === 1', done => {
+ const vm = new Vue({
+ el,
+ template: `
+ <span>
+ {{ n__('${key}', '%d days', 1) }}
+ </span>
+ `,
+ }).$mount();
+
+ Vue.nextTick(() => {
+ expect(trimText(vm.$el.textContent)).toBe('1 singular translated');
+
+ done();
+ });
+ });
+
+ it('and n > 1', done => {
+ const vm = new Vue({
+ el,
+ template: `
+ <span>
+ {{ n__('${key}', '%d days', 2) }}
+ </span>
+ `,
+ }).$mount();
+
+ Vue.nextTick(() => {
+ expect(trimText(vm.$el.textContent)).toBe('2 plural translated');
+
+ done();
+ });
+ });
+ });
+
+ describe('translates text with context `s__`', () => {
+ const key = 'Context|Foobar';
+ const translation = 'Context|Foobar translated';
+ const expectation = 'Foobar translated';
+
+ beforeEach(() => {
+ createTranslationMock(key, translation);
+ });
+
+ it('and using two parameters', done => {
+ const vm = new Vue({
+ el,
+ template: `
+ <span>
+ {{ s__('Context', 'Foobar') }}
+ </span>
+ `,
+ }).$mount();
+
+ Vue.nextTick(() => {
+ expect(trimText(vm.$el.textContent)).toBe(expectation);
+
+ done();
+ });
+ });
+
+ it('and using the pipe syntax', done => {
+ const vm = new Vue({
+ el,
+ template: `
+ <span>
+ {{ s__('${key}') }}
+ </span>
+ `,
+ }).$mount();
+
+ Vue.nextTick(() => {
+ expect(trimText(vm.$el.textContent)).toBe(expectation);
+
+ done();
+ });
+ });
+ });
+
+ it('translate multi line text', done => {
+ const translation = 'multiline string translated';
+ createTranslationMock('multiline string', translation);
+
+ const vm = new Vue({
el,
template: `
<span>
- {{ n__('%d day', '%d days', 1) }}
+ {{ __(\`
+ multiline
+ string
+ \`) }}
</span>
`,
}).$mount();
Vue.nextTick(() => {
- expect(
- comp.$el.textContent.trim(),
- ).toBe('1 day');
+ expect(trimText(vm.$el.textContent)).toBe(translation);
done();
});
});
- it('translate plural text with multiple count', (done) => {
- const comp = new Vue({
+ it('translate pluralized multi line text', done => {
+ const translation = 'multiline string plural';
+
+ createTranslationMock('multiline string', 'multiline string singular', translation);
+
+ const vm = new Vue({
el,
template: `
<span>
- {{ n__('%d day', '%d days', 2) }}
+ {{ n__(
+ \`
+ multiline
+ string
+ \`,
+ \`
+ multiline
+ strings
+ \`,
+ 2
+ ) }}
</span>
`,
}).$mount();
Vue.nextTick(() => {
- expect(
- comp.$el.textContent.trim(),
- ).toBe('2 days');
+ expect(trimText(vm.$el.textContent)).toBe(translation);
done();
});
});
- it('translate plural without replacing any text', (done) => {
- const comp = new Vue({
+ it('translate pluralized multi line text with context', done => {
+ const translation = 'multiline string with context';
+
+ createTranslationMock('Context| multiline string', translation);
+
+ const vm = new Vue({
el,
template: `
<span>
- {{ n__('day', 'days', 2) }}
+ {{ s__(
+ \`
+ Context|
+ multiline
+ string
+ \`
+ ) }}
</span>
`,
}).$mount();
Vue.nextTick(() => {
- expect(
- comp.$el.textContent.trim(),
- ).toBe('days');
+ expect(trimText(vm.$el.textContent)).toBe(translation);
done();
});
diff --git a/spec/javascripts/zen_mode_spec.js b/spec/javascripts/zen_mode_spec.js
index bdeebe0de75..e5f1e6ae937 100644
--- a/spec/javascripts/zen_mode_spec.js
+++ b/spec/javascripts/zen_mode_spec.js
@@ -46,12 +46,14 @@ describe('ZenMode', () => {
it('should not call dropzone if element is not dropzone valid', () => {
$('.div-dropzone').addClass('js-invalid-dropzone');
exitZen();
+
expect(dropzoneForElementSpy.calls.count()).toEqual(0);
});
it('should call dropzone if element is dropzone valid', () => {
$('.div-dropzone').removeClass('js-invalid-dropzone');
exitZen();
+
expect(dropzoneForElementSpy.calls.count()).toEqual(2);
});
});
@@ -60,12 +62,14 @@ describe('ZenMode', () => {
it('pauses Mousetrap', () => {
const mouseTrapPauseSpy = spyOn(Mousetrap, 'pause');
enterZen();
+
expect(mouseTrapPauseSpy).toHaveBeenCalled();
});
it('removes textarea styling', () => {
$('.notes-form textarea').attr('style', 'height: 400px');
enterZen();
+
expect($('.notes-form textarea')).not.toHaveAttr('style');
});
});
@@ -75,6 +79,7 @@ describe('ZenMode', () => {
it('exits on Escape', () => {
escapeKeydown();
+
expect($('.notes-form .zen-backdrop')).not.toHaveClass('fullscreen');
});
});
@@ -85,12 +90,14 @@ describe('ZenMode', () => {
it('unpauses Mousetrap', () => {
const mouseTrapUnpauseSpy = spyOn(Mousetrap, 'unpause');
exitZen();
+
expect(mouseTrapUnpauseSpy).toHaveBeenCalled();
});
it('restores the scroll position', () => {
spyOn(zen, 'scrollTo');
exitZen();
+
expect(zen.scrollTo).toHaveBeenCalled();
});
});
diff --git a/spec/lib/api/helpers/custom_validators_spec.rb b/spec/lib/api/helpers/custom_validators_spec.rb
new file mode 100644
index 00000000000..41e6fb47b11
--- /dev/null
+++ b/spec/lib/api/helpers/custom_validators_spec.rb
@@ -0,0 +1,64 @@
+require 'spec_helper'
+
+describe API::Helpers::CustomValidators do
+ let(:scope) do
+ Struct.new(:opts) do
+ def full_name(attr_name)
+ attr_name
+ end
+ end
+ end
+
+ describe API::Helpers::CustomValidators::Absence do
+ subject do
+ described_class.new(['test'], {}, false, scope.new)
+ end
+
+ context 'empty param' do
+ it 'does not raise a validation error' do
+ expect_no_validation_error({})
+ end
+ end
+
+ context 'invalid parameters' do
+ it 'should raise a validation error' do
+ expect_validation_error({ 'test' => 'some_value' })
+ end
+ end
+ end
+
+ describe API::Helpers::CustomValidators::IntegerNoneAny do
+ subject do
+ described_class.new(['test'], {}, false, scope.new)
+ end
+
+ context 'valid parameters' do
+ it 'does not raise a validation error' do
+ expect_no_validation_error({ 'test' => 2 })
+ expect_no_validation_error({ 'test' => 100 })
+ expect_no_validation_error({ 'test' => 'None' })
+ expect_no_validation_error({ 'test' => 'Any' })
+ expect_no_validation_error({ 'test' => 'none' })
+ expect_no_validation_error({ 'test' => 'any' })
+ end
+ end
+
+ context 'invalid parameters' do
+ it 'should raise a validation error' do
+ expect_validation_error({ 'test' => 'some_other_string' })
+ end
+ end
+ end
+
+ def expect_no_validation_error(params)
+ expect { validate_test_param!(params) }.not_to raise_error
+ end
+
+ def expect_validation_error(params)
+ expect { validate_test_param!(params) }.to raise_error(Grape::Exceptions::Validation)
+ end
+
+ def validate_test_param!(params)
+ subject.validate_param!('test', params)
+ end
+end
diff --git a/spec/lib/api/helpers/pagination_spec.rb b/spec/lib/api/helpers/pagination_spec.rb
index c73c6023b60..0a7682d906b 100644
--- a/spec/lib/api/helpers/pagination_spec.rb
+++ b/spec/lib/api/helpers/pagination_spec.rb
@@ -189,9 +189,9 @@ describe API::Helpers::Pagination do
it 'it returns the right link to the next page' do
allow(subject).to receive(:params)
.and_return({ pagination: 'keyset', ks_prev_id: projects[3].id, ks_prev_name: projects[3].name, per_page: 2 })
+
expect_header('X-Per-Page', '2')
expect_header('X-Next-Page', "#{value}?ks_prev_id=#{projects[6].id}&ks_prev_name=#{projects[6].name}&pagination=keyset&per_page=2")
-
expect_header('Link', anything) do |_key, val|
expect(val).to include('rel="next"')
end
diff --git a/spec/lib/backup/manager_spec.rb b/spec/lib/backup/manager_spec.rb
index ca319679e80..9633caac788 100644
--- a/spec/lib/backup/manager_spec.rb
+++ b/spec/lib/backup/manager_spec.rb
@@ -11,10 +11,6 @@ describe Backup::Manager do
allow(progress).to receive(:puts)
allow(progress).to receive(:print)
- allow_any_instance_of(String).to receive(:color) do |string, _color|
- string
- end
-
@old_progress = $progress # rubocop:disable Style/GlobalVars
$progress = progress # rubocop:disable Style/GlobalVars
end
diff --git a/spec/lib/backup/repository_spec.rb b/spec/lib/backup/repository_spec.rb
index c5a854b5660..fdeea814bb2 100644
--- a/spec/lib/backup/repository_spec.rb
+++ b/spec/lib/backup/repository_spec.rb
@@ -11,10 +11,6 @@ describe Backup::Repository do
allow(FileUtils).to receive(:mkdir_p).and_return(true)
allow(FileUtils).to receive(:mv).and_return(true)
- allow_any_instance_of(String).to receive(:color) do |string, _color|
- string
- end
-
allow_any_instance_of(described_class).to receive(:progress).and_return(progress)
end
diff --git a/spec/lib/banzai/cross_project_reference_spec.rb b/spec/lib/banzai/cross_project_reference_spec.rb
index aadfe7637dd..ba995e16be7 100644
--- a/spec/lib/banzai/cross_project_reference_spec.rb
+++ b/spec/lib/banzai/cross_project_reference_spec.rb
@@ -1,16 +1,21 @@
require 'spec_helper'
describe Banzai::CrossProjectReference do
- include described_class
+ let(:including_class) { Class.new.include(described_class).new }
+
+ before do
+ allow(including_class).to receive(:context).and_return({})
+ allow(including_class).to receive(:parent_from_ref).and_call_original
+ end
describe '#parent_from_ref' do
context 'when no project was referenced' do
it 'returns the project from context' do
project = double
- allow(self).to receive(:context).and_return({ project: project })
+ allow(including_class).to receive(:context).and_return({ project: project })
- expect(parent_from_ref(nil)).to eq project
+ expect(including_class.parent_from_ref(nil)).to eq project
end
end
@@ -18,15 +23,15 @@ describe Banzai::CrossProjectReference do
it 'returns the group from context' do
group = double
- allow(self).to receive(:context).and_return({ group: group })
+ allow(including_class).to receive(:context).and_return({ group: group })
- expect(parent_from_ref(nil)).to eq group
+ expect(including_class.parent_from_ref(nil)).to eq group
end
end
context 'when referenced project does not exist' do
it 'returns nil' do
- expect(parent_from_ref('invalid/reference')).to be_nil
+ expect(including_class.parent_from_ref('invalid/reference')).to be_nil
end
end
@@ -37,7 +42,7 @@ describe Banzai::CrossProjectReference do
expect(Project).to receive(:find_by_full_path)
.with('cross/reference').and_return(project2)
- expect(parent_from_ref('cross/reference')).to eq project2
+ expect(including_class.parent_from_ref('cross/reference')).to eq project2
end
end
end
diff --git a/spec/lib/banzai/filter/autolink_filter_spec.rb b/spec/lib/banzai/filter/autolink_filter_spec.rb
index a50329473ad..7a457403b51 100644
--- a/spec/lib/banzai/filter/autolink_filter_spec.rb
+++ b/spec/lib/banzai/filter/autolink_filter_spec.rb
@@ -76,7 +76,7 @@ describe Banzai::Filter::AutolinkFilter do
expect(doc.at_css('a')['href']).to eq link
end
- it 'autolinks multiple occurences of smb' do
+ it 'autolinks multiple occurrences of smb' do
link1 = 'smb:///Volumes/shared/foo.pdf'
link2 = 'smb:///Volumes/shared/bar.pdf'
diff --git a/spec/lib/banzai/filter/commit_range_reference_filter_spec.rb b/spec/lib/banzai/filter/commit_range_reference_filter_spec.rb
index e1af5a15371..cbff2fdab14 100644
--- a/spec/lib/banzai/filter/commit_range_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/commit_range_reference_filter_spec.rb
@@ -60,6 +60,7 @@ describe Banzai::Filter::CommitRangeReferenceFilter do
exp = act = "See #{commit1.id.reverse}...#{commit2.id}"
allow(project.repository).to receive(:commit).with(commit1.id.reverse)
+ allow(project.repository).to receive(:commit).with(commit2.id)
expect(reference_filter(act).to_html).to eq exp
end
diff --git a/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb b/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb
index d9018a7e4fe..a0270d93d50 100644
--- a/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb
@@ -79,13 +79,9 @@ describe Banzai::Filter::ExternalIssueReferenceFilter do
expect(link).to eq helper.url_for_issue(issue_id, project, only_path: true)
end
- context 'with RequestStore enabled' do
+ context 'with RequestStore enabled', :request_store do
let(:reference_filter) { HTML::Pipeline.new([described_class]) }
- before do
- allow(RequestStore).to receive(:active?).and_return(true)
- end
-
it 'queries the collection on the first call' do
expect_any_instance_of(Project).to receive(:default_issues_tracker?).once.and_call_original
expect_any_instance_of(Project).to receive(:external_issue_reference_pattern).once.and_call_original
@@ -105,15 +101,24 @@ describe Banzai::Filter::ExternalIssueReferenceFilter do
context "redmine project" do
let(:project) { create(:redmine_project) }
- let(:issue) { ExternalIssue.new("#123", project) }
- let(:reference) { issue.to_reference }
before do
- project.issues_enabled = false
- project.save!
+ project.update!(issues_enabled: false)
end
- it_behaves_like "external issue tracker"
+ context "with a hash prefix" do
+ let(:issue) { ExternalIssue.new("#123", project) }
+ let(:reference) { issue.to_reference }
+
+ it_behaves_like "external issue tracker"
+ end
+
+ context "with a single-letter prefix" do
+ let(:issue) { ExternalIssue.new("T-123", project) }
+ let(:reference) { issue.to_reference }
+
+ it_behaves_like "external issue tracker"
+ end
end
context "jira project" do
@@ -126,6 +131,15 @@ describe Banzai::Filter::ExternalIssueReferenceFilter do
it_behaves_like "external issue tracker"
end
+ context "with a single-letter prefix" do
+ let(:issue) { ExternalIssue.new("J-123", project) }
+
+ it "ignores reference" do
+ exp = act = "Issue #{reference}"
+ expect(filter(act).to_html).to eq exp
+ end
+ end
+
context "with wrong markdown" do
let(:issue) { ExternalIssue.new("#123", project) }
diff --git a/spec/lib/banzai/filter/markdown_filter_spec.rb b/spec/lib/banzai/filter/markdown_filter_spec.rb
index a515d07b072..cf49249756a 100644
--- a/spec/lib/banzai/filter/markdown_filter_spec.rb
+++ b/spec/lib/banzai/filter/markdown_filter_spec.rb
@@ -40,6 +40,12 @@ describe Banzai::Filter::MarkdownFilter do
expect(result).to start_with("<pre><code>")
end
+
+ it 'works with utf8 chars in language' do
+ result = filter("```日\nsome code\n```")
+
+ expect(result).to start_with("<pre><code lang=\"日\">")
+ end
end
context 'using Redcarpet' do
@@ -60,4 +66,21 @@ describe Banzai::Filter::MarkdownFilter do
end
end
end
+
+ describe 'footnotes in tables' do
+ it 'processes footnotes in table cells' do
+ text = <<-MD.strip_heredoc
+ | Column1 |
+ | --------- |
+ | foot [^1] |
+
+ [^1]: a footnote
+ MD
+
+ result = filter(text)
+
+ expect(result).to include('<td>foot <sup')
+ expect(result).to include('<section class="footnotes">')
+ end
+ end
end
diff --git a/spec/lib/banzai/filter/relative_link_filter_spec.rb b/spec/lib/banzai/filter/relative_link_filter_spec.rb
index ba8dc68ceda..415ded05e6e 100644
--- a/spec/lib/banzai/filter/relative_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/relative_link_filter_spec.rb
@@ -83,6 +83,11 @@ describe Banzai::Filter::RelativeLinkFilter do
expect { filter(act) }.not_to raise_error
end
+ it 'does not raise an exception with a space in the path' do
+ act = link("/uploads/d18213acd3732630991986120e167e3d/Landscape_8.jpg \nBut here's some more unexpected text :smile:)")
+ expect { filter(act) }.not_to raise_error
+ end
+
it 'ignores ref if commit is passed' do
doc = filter(link('non/existent.file'), commit: project.commit('empty-branch') )
expect(doc.at_css('a')['href'])
@@ -221,7 +226,7 @@ describe Banzai::Filter::RelativeLinkFilter do
let(:ref) {'mark#\'@],+;-._/#@!$&()+down'}
it 'correctly escapes the ref' do
- # Adressable won't escape the '#', so we do this manually
+ # Addressable won't escape the '#', so we do this manually
ref_escaped = 'mark%23\'@%5D,+;-._/%23@!$&()+down'
# Stub this method so the branch doesn't actually need to be in the repo
diff --git a/spec/lib/banzai/filter/spaced_link_filter_spec.rb b/spec/lib/banzai/filter/spaced_link_filter_spec.rb
new file mode 100644
index 00000000000..1ad7f3ff567
--- /dev/null
+++ b/spec/lib/banzai/filter/spaced_link_filter_spec.rb
@@ -0,0 +1,96 @@
+require 'spec_helper'
+
+describe Banzai::Filter::SpacedLinkFilter do
+ include FilterSpecHelper
+
+ let(:link) { '[example](page slug)' }
+ let(:image) { '![example](img test.jpg)' }
+
+ context 'when a link is detected' do
+ it 'converts slug with spaces to a link' do
+ doc = filter("See #{link}")
+
+ expect(doc.at_css('a').text).to eq 'example'
+ expect(doc.at_css('a')['href']).to eq 'page%20slug'
+ expect(doc.at_css('a')['title']).to be_nil
+ expect(doc.at_css('p')).to be_nil
+ end
+
+ it 'converts slug with spaces and a title to a link' do
+ link = '[example](page slug "title")'
+ doc = filter("See #{link}")
+
+ expect(doc.at_css('a').text).to eq 'example'
+ expect(doc.at_css('a')['href']).to eq 'page%20slug'
+ expect(doc.at_css('a')['title']).to eq 'title'
+ expect(doc.at_css('p')).to be_nil
+ end
+
+ it 'does nothing when markdown_engine is redcarpet' do
+ exp = act = link
+ expect(filter(act, markdown_engine: :redcarpet).to_html).to eq exp
+ end
+
+ it 'does nothing with empty text' do
+ link = '[](page slug)'
+ doc = filter("See #{link}")
+
+ expect(doc.at_css('a')).to be_nil
+ end
+
+ it 'does nothing with an empty slug' do
+ link = '[example]()'
+ doc = filter("See #{link}")
+
+ expect(doc.at_css('a')).to be_nil
+ end
+ end
+
+ context 'when an image is detected' do
+ it 'converts slug with spaces to an iamge' do
+ doc = filter("See #{image}")
+
+ expect(doc.at_css('img')['src']).to eq 'img%20test.jpg'
+ expect(doc.at_css('img')['alt']).to eq 'example'
+ expect(doc.at_css('p')).to be_nil
+ end
+
+ it 'converts slug with spaces and a title to an image' do
+ image = '![example](img test.jpg "title")'
+ doc = filter("See #{image}")
+
+ expect(doc.at_css('img')['src']).to eq 'img%20test.jpg'
+ expect(doc.at_css('img')['alt']).to eq 'example'
+ expect(doc.at_css('img')['title']).to eq 'title'
+ expect(doc.at_css('p')).to be_nil
+ end
+ end
+
+ it 'converts multiple URLs' do
+ link1 = '[first](slug one)'
+ link2 = '[second](http://example.com/slug two)'
+ doc = filter("See #{link1} and #{image} and #{link2}")
+
+ found_links = doc.css('a')
+
+ expect(found_links.size).to eq(2)
+ expect(found_links[0].text).to eq 'first'
+ expect(found_links[0]['href']).to eq 'slug%20one'
+ expect(found_links[1].text).to eq 'second'
+ expect(found_links[1]['href']).to eq 'http://example.com/slug%20two'
+
+ found_images = doc.css('img')
+
+ expect(found_images.size).to eq(1)
+ expect(found_images[0]['src']).to eq 'img%20test.jpg'
+ expect(found_images[0]['alt']).to eq 'example'
+ end
+
+ described_class::IGNORE_PARENTS.each do |elem|
+ it "ignores valid links contained inside '#{elem}' element" do
+ exp = act = "<#{elem}>See #{link}</#{elem}>"
+
+ expect(filter(act).to_html).to eq exp
+ end
+ end
+end
diff --git a/spec/lib/banzai/filter/wiki_link_filter_spec.rb b/spec/lib/banzai/filter/wiki_link_filter_spec.rb
index 50d053011b3..b9059b85fdc 100644
--- a/spec/lib/banzai/filter/wiki_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/wiki_link_filter_spec.rb
@@ -7,6 +7,7 @@ describe Banzai::Filter::WikiLinkFilter do
let(:project) { build_stubbed(:project, :public, name: "wiki_link_project", namespace: namespace) }
let(:user) { double }
let(:wiki) { ProjectWiki.new(project, user) }
+ let(:repository_upload_folder) { Wikis::CreateAttachmentService::ATTACHMENT_PATH }
it "doesn't rewrite absolute links" do
filtered_link = filter("<a href='http://example.com:8000/'>Link</a>", project_wiki: wiki).children[0]
@@ -20,6 +21,45 @@ describe Banzai::Filter::WikiLinkFilter do
expect(filtered_link.attribute('href').value).to eq('/uploads/a.test')
end
+ describe "when links point to the #{Wikis::CreateAttachmentService::ATTACHMENT_PATH} folder" do
+ context 'with an "a" html tag' do
+ it 'rewrites links' do
+ filtered_link = filter("<a href='#{repository_upload_folder}/a.test'>Link</a>", project_wiki: wiki).children[0]
+
+ expect(filtered_link.attribute('href').value).to eq("#{wiki.wiki_base_path}/#{repository_upload_folder}/a.test")
+ end
+ end
+
+ context 'with "img" html tag' do
+ let(:path) { "#{wiki.wiki_base_path}/#{repository_upload_folder}/a.jpg" }
+
+ context 'inside an "a" html tag' do
+ it 'rewrites links' do
+ filtered_elements = filter("<a href='#{repository_upload_folder}/a.jpg'><img src='#{repository_upload_folder}/a.jpg'>example</img></a>", project_wiki: wiki)
+
+ expect(filtered_elements.search('img').first.attribute('src').value).to eq(path)
+ expect(filtered_elements.search('a').first.attribute('href').value).to eq(path)
+ end
+ end
+
+ context 'outside an "a" html tag' do
+ it 'rewrites links' do
+ filtered_link = filter("<img src='#{repository_upload_folder}/a.jpg'>example</img>", project_wiki: wiki).children[0]
+
+ expect(filtered_link.attribute('src').value).to eq(path)
+ end
+ end
+ end
+
+ context 'with "video" html tag' do
+ it 'rewrites links' do
+ filtered_link = filter("<video src='#{repository_upload_folder}/a.mp4'></video>", project_wiki: wiki).children[0]
+
+ expect(filtered_link.attribute('src').value).to eq("#{wiki.wiki_base_path}/#{repository_upload_folder}/a.mp4")
+ end
+ end
+ end
+
describe "invalid links" do
invalid_links = ["http://:8080", "http://", "http://:8080/path"]
diff --git a/spec/lib/banzai/pipeline/gfm_pipeline_spec.rb b/spec/lib/banzai/pipeline/gfm_pipeline_spec.rb
index 75413596431..df24cef0b8b 100644
--- a/spec/lib/banzai/pipeline/gfm_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/gfm_pipeline_spec.rb
@@ -87,4 +87,22 @@ describe Banzai::Pipeline::GfmPipeline do
end
end
end
+
+ describe 'markdown link or image urls having spaces' do
+ let(:project) { create(:project, :public) }
+
+ it 'rewrites links with spaces in url' do
+ markdown = "[Link to Page](page slug)"
+ output = described_class.to_html(markdown, project: project)
+
+ expect(output).to include("href=\"page%20slug\"")
+ end
+
+ it 'rewrites images with spaces in url' do
+ markdown = "![My Image](test image.png)"
+ output = described_class.to_html(markdown, project: project)
+
+ expect(output).to include("src=\"test%20image.png\"")
+ end
+ end
end
diff --git a/spec/lib/banzai/pipeline/wiki_pipeline_spec.rb b/spec/lib/banzai/pipeline/wiki_pipeline_spec.rb
index 88ae4c1e07a..64ca3ec345d 100644
--- a/spec/lib/banzai/pipeline/wiki_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/wiki_pipeline_spec.rb
@@ -121,6 +121,13 @@ describe Banzai::Pipeline::WikiPipeline do
expect(output).to include("href=\"#{relative_url_root}/wiki_link_ns/wiki_link_project/wikis/page\"")
end
+ it 'rewrites non-file links (with spaces) to be at the scope of the wiki root' do
+ markdown = "[Link to Page](page slug)"
+ output = described_class.to_html(markdown, project: project, project_wiki: project_wiki, page_slug: page.slug)
+
+ expect(output).to include("href=\"#{relative_url_root}/wiki_link_ns/wiki_link_project/wikis/page%20slug\"")
+ end
+
it "rewrites file links to be at the scope of the current directory" do
markdown = "[Link to Page](page.md)"
output = described_class.to_html(markdown, project: project, project_wiki: project_wiki, page_slug: page.slug)
@@ -134,6 +141,13 @@ describe Banzai::Pipeline::WikiPipeline do
expect(output).to include("href=\"#{relative_url_root}/wiki_link_ns/wiki_link_project/wikis/start-page#title\"")
end
+
+ it 'rewrites links (with spaces) with anchor' do
+ markdown = '[Link to Header](start page#title)'
+ output = described_class.to_html(markdown, project: project, project_wiki: project_wiki, page_slug: page.slug)
+
+ expect(output).to include("href=\"#{relative_url_root}/wiki_link_ns/wiki_link_project/wikis/start%20page#title\"")
+ end
end
describe "when creating root links" do
@@ -164,4 +178,25 @@ describe Banzai::Pipeline::WikiPipeline do
end
end
end
+
+ describe 'videos' do
+ let(:namespace) { create(:namespace, name: "wiki_link_ns") }
+ let(:project) { create(:project, :public, name: "wiki_link_project", namespace: namespace) }
+ let(:project_wiki) { ProjectWiki.new(project, double(:user)) }
+ let(:page) { build(:wiki_page, wiki: project_wiki, page: OpenStruct.new(url_path: 'nested/twice/start-page')) }
+
+ it 'generates video html structure' do
+ markdown = "![video_file](video_file_name.mp4)"
+ output = described_class.to_html(markdown, project: project, project_wiki: project_wiki, page_slug: page.slug)
+
+ expect(output).to include('<video src="/wiki_link_ns/wiki_link_project/wikis/nested/twice/video_file_name.mp4"')
+ end
+
+ it 'rewrites and replaces video links names with white spaces to %20' do
+ markdown = "![video file](video file name.mp4)"
+ output = described_class.to_html(markdown, project: project, project_wiki: project_wiki, page_slug: page.slug)
+
+ expect(output).to include('<video src="/wiki_link_ns/wiki_link_project/wikis/nested/twice/video%20file%20name.mp4"')
+ end
+ end
end
diff --git a/spec/lib/banzai/reference_parser/base_parser_spec.rb b/spec/lib/banzai/reference_parser/base_parser_spec.rb
index 4e6e8eca38a..c6e9fc414a1 100644
--- a/spec/lib/banzai/reference_parser/base_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/base_parser_spec.rb
@@ -263,11 +263,10 @@ describe Banzai::ReferenceParser::BaseParser do
end
end
- context 'with RequestStore enabled' do
+ context 'with RequestStore enabled', :request_store do
before do
cache = Hash.new { |hash, key| hash[key] = {} }
- allow(RequestStore).to receive(:active?).and_return(true)
allow(subject).to receive(:collection_cache).and_return(cache)
end
diff --git a/spec/lib/banzai/reference_parser/commit_parser_spec.rb b/spec/lib/banzai/reference_parser/commit_parser_spec.rb
index cca53a8b9b9..f558dea209f 100644
--- a/spec/lib/banzai/reference_parser/commit_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/commit_parser_spec.rb
@@ -120,4 +120,22 @@ describe Banzai::ReferenceParser::CommitParser do
expect(subject.find_commits(project, %w{123})).to eq([])
end
end
+
+ context 'when checking commits on another projects' do
+ let(:control_links) do
+ [commit_link]
+ end
+
+ let(:actual_links) do
+ control_links + [commit_link, commit_link]
+ end
+
+ def commit_link
+ project = create(:project, :repository, :public)
+
+ Nokogiri::HTML.fragment(%Q{<a data-commit="#{project.commit.id}" data-project="#{project.id}"></a>}).children[0]
+ end
+
+ it_behaves_like 'no project N+1 queries'
+ end
end
diff --git a/spec/lib/bitbucket_server/client_spec.rb b/spec/lib/bitbucket_server/client_spec.rb
index f926ae963a4..5de0a9a65b5 100644
--- a/spec/lib/bitbucket_server/client_spec.rb
+++ b/spec/lib/bitbucket_server/client_spec.rb
@@ -13,7 +13,7 @@ describe BitbucketServer::Client do
let(:path) { "/projects/#{project}/repos/#{repo_slug}/pull-requests?state=ALL" }
it 'requests a collection' do
- expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :pull_request)
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :pull_request, page_offset: 0, limit: nil)
subject.pull_requests(project, repo_slug)
end
@@ -29,7 +29,7 @@ describe BitbucketServer::Client do
let(:path) { "/projects/#{project}/repos/#{repo_slug}/pull-requests/1/activities" }
it 'requests a collection' do
- expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :activity)
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :activity, page_offset: 0, limit: nil)
subject.activities(project, repo_slug, 1)
end
@@ -52,10 +52,16 @@ describe BitbucketServer::Client do
let(:path) { "/repos" }
it 'requests a collection' do
- expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :repo)
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :repo, page_offset: 0, limit: nil)
subject.repos
end
+
+ it 'requests a collection with an offset and limit' do
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :repo, page_offset: 10, limit: 25)
+
+ subject.repos(page_offset: 10, limit: 25)
+ end
end
describe '#create_branch' do
diff --git a/spec/lib/bitbucket_server/collection_spec.rb b/spec/lib/bitbucket_server/collection_spec.rb
new file mode 100644
index 00000000000..ddd02bac88a
--- /dev/null
+++ b/spec/lib/bitbucket_server/collection_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe BitbucketServer::Collection do
+ let(:connection) { instance_double(BitbucketServer::Connection) }
+ let(:page) { 1 }
+ let(:paginator) { BitbucketServer::Paginator.new(connection, 'http://more-data', :pull_request, page_offset: page) }
+
+ subject { described_class.new(paginator) }
+
+ describe '#current_page' do
+ it 'returns 1' do
+ expect(subject.current_page).to eq(1)
+ end
+ end
+
+ describe '#prev_page' do
+ it 'returns nil' do
+ expect(subject.prev_page).to be_nil
+ end
+ end
+
+ describe '#next_page' do
+ it 'returns 2' do
+ expect(subject.next_page).to eq(2)
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/paginator_spec.rb b/spec/lib/bitbucket_server/paginator_spec.rb
index 2de50eba3c4..d268d4f23cf 100644
--- a/spec/lib/bitbucket_server/paginator_spec.rb
+++ b/spec/lib/bitbucket_server/paginator_spec.rb
@@ -20,6 +20,16 @@ describe BitbucketServer::Paginator do
expect { paginator.items }.to raise_error(StopIteration)
end
+ it 'obeys limits' do
+ limited = described_class.new(connection, 'http://more-data', :pull_request, page_offset: 0, limit: 1)
+ allow(limited).to receive(:fetch_next_page).and_return(first_page)
+
+ expect(limited.has_next_page?).to be_truthy
+ expect(limited.items).to match(['item_1'])
+ expect(limited.has_next_page?).to be_truthy
+ expect { limited.items }.to raise_error(StopIteration)
+ end
+
it 'calls the connection with different offsets' do
expect(connection).to receive(:get).with('http://more-data', start: 0, limit: BitbucketServer::Paginator::PAGE_LENGTH).and_return(page_attrs)
diff --git a/spec/lib/container_registry/blob_spec.rb b/spec/lib/container_registry/blob_spec.rb
index c73faa55513..d3fff5bad42 100644
--- a/spec/lib/container_registry/blob_spec.rb
+++ b/spec/lib/container_registry/blob_spec.rb
@@ -64,7 +64,7 @@ describe ContainerRegistry::Blob do
.to_return(status: 200)
end
- it 'returns true when blob has been successfuly deleted' do
+ it 'returns true when blob has been successfully deleted' do
expect(blob.delete).to be_truthy
end
end
diff --git a/spec/lib/event_filter_spec.rb b/spec/lib/event_filter_spec.rb
index 87ae6b6cf01..30016da6828 100644
--- a/spec/lib/event_filter_spec.rb
+++ b/spec/lib/event_filter_spec.rb
@@ -1,58 +1,119 @@
require 'spec_helper'
describe EventFilter do
+ describe 'FILTERS' do
+ it 'returns a definite list of filters' do
+ expect(described_class::FILTERS).to eq(%w[all push merged issue comments team])
+ end
+ end
+
+ describe '#filter' do
+ it 'returns "all" if given filter is nil' do
+ expect(described_class.new(nil).filter).to eq(described_class::ALL)
+ end
+
+ it 'returns "all" if given filter is ""' do
+ expect(described_class.new('').filter).to eq(described_class::ALL)
+ end
+
+ it 'returns "all" if given filter is "foo"' do
+ expect(described_class.new('foo').filter).to eq('all')
+ end
+ end
+
describe '#apply_filter' do
- let(:source_user) { create(:user) }
- let!(:public_project) { create(:project, :public) }
+ set(:public_project) { create(:project, :public) }
+
+ set(:push_event) { create(:push_event, project: public_project) }
+ set(:merged_event) { create(:event, :merged, project: public_project, target: public_project) }
+ set(:created_event) { create(:event, :created, project: public_project, target: public_project) }
+ set(:updated_event) { create(:event, :updated, project: public_project, target: public_project) }
+ set(:closed_event) { create(:event, :closed, project: public_project, target: public_project) }
+ set(:reopened_event) { create(:event, :reopened, project: public_project, target: public_project) }
+ set(:comments_event) { create(:event, :commented, project: public_project, target: public_project) }
+ set(:joined_event) { create(:event, :joined, project: public_project, target: public_project) }
+ set(:left_event) { create(:event, :left, project: public_project, target: public_project) }
- let!(:push_event) { create(:push_event, project: public_project, author: source_user) }
- let!(:merged_event) { create(:event, :merged, project: public_project, target: public_project, author: source_user) }
- let!(:created_event) { create(:event, :created, project: public_project, target: public_project, author: source_user) }
- let!(:updated_event) { create(:event, :updated, project: public_project, target: public_project, author: source_user) }
- let!(:closed_event) { create(:event, :closed, project: public_project, target: public_project, author: source_user) }
- let!(:reopened_event) { create(:event, :reopened, project: public_project, target: public_project, author: source_user) }
- let!(:comments_event) { create(:event, :commented, project: public_project, target: public_project, author: source_user) }
- let!(:joined_event) { create(:event, :joined, project: public_project, target: public_project, author: source_user) }
- let!(:left_event) { create(:event, :left, project: public_project, target: public_project, author: source_user) }
+ let(:filtered_events) { described_class.new(filter).apply_filter(Event.all) }
- it 'applies push filter' do
- events = described_class.new(described_class.push).apply_filter(Event.all)
- expect(events).to contain_exactly(push_event)
+ context 'with the "push" filter' do
+ let(:filter) { described_class::PUSH }
+
+ it 'filters push events only' do
+ expect(filtered_events).to contain_exactly(push_event)
+ end
end
- it 'applies merged filter' do
- events = described_class.new(described_class.merged).apply_filter(Event.all)
- expect(events).to contain_exactly(merged_event)
+ context 'with the "merged" filter' do
+ let(:filter) { described_class::MERGED }
+
+ it 'filters merged events only' do
+ expect(filtered_events).to contain_exactly(merged_event)
+ end
end
- it 'applies issue filter' do
- events = described_class.new(described_class.issue).apply_filter(Event.all)
- expect(events).to contain_exactly(created_event, updated_event, closed_event, reopened_event)
+ context 'with the "issue" filter' do
+ let(:filter) { described_class::ISSUE }
+
+ it 'filters issue events only' do
+ expect(filtered_events).to contain_exactly(created_event, updated_event, closed_event, reopened_event)
+ end
end
- it 'applies comments filter' do
- events = described_class.new(described_class.comments).apply_filter(Event.all)
- expect(events).to contain_exactly(comments_event)
+ context 'with the "comments" filter' do
+ let(:filter) { described_class::COMMENTS }
+
+ it 'filters comment events only' do
+ expect(filtered_events).to contain_exactly(comments_event)
+ end
end
- it 'applies team filter' do
- events = described_class.new(described_class.team).apply_filter(Event.all)
- expect(events).to contain_exactly(joined_event, left_event)
+ context 'with the "team" filter' do
+ let(:filter) { described_class::TEAM }
+
+ it 'filters team events only' do
+ expect(filtered_events).to contain_exactly(joined_event, left_event)
+ end
end
- it 'applies all filter' do
- events = described_class.new(described_class.all).apply_filter(Event.all)
- expect(events).to contain_exactly(push_event, merged_event, created_event, updated_event, closed_event, reopened_event, comments_event, joined_event, left_event)
+ context 'with the "all" filter' do
+ let(:filter) { described_class::ALL }
+
+ it 'returns all events' do
+ expect(filtered_events).to eq(Event.all)
+ end
+ end
+
+ context 'with an unknown filter' do
+ let(:filter) { 'foo' }
+
+ it 'returns all events' do
+ expect(filtered_events).to eq(Event.all)
+ end
+ end
+
+ context 'with a nil filter' do
+ let(:filter) { nil }
+
+ it 'returns all events' do
+ expect(filtered_events).to eq(Event.all)
+ end
+ end
+ end
+
+ describe '#active?' do
+ let(:event_filter) { described_class.new(described_class::TEAM) }
+
+ it 'returns false if filter does not include the given key' do
+ expect(event_filter.active?('foo')).to eq(false)
end
- it 'applies no filter' do
- events = described_class.new(nil).apply_filter(Event.all)
- expect(events).to contain_exactly(push_event, merged_event, created_event, updated_event, closed_event, reopened_event, comments_event, joined_event, left_event)
+ it 'returns false if the given key is nil' do
+ expect(event_filter.active?(nil)).to eq(false)
end
- it 'applies unknown filter' do
- events = described_class.new('').apply_filter(Event.all)
- expect(events).to contain_exactly(push_event, merged_event, created_event, updated_event, closed_event, reopened_event, comments_event, joined_event, left_event)
+ it 'returns true if filter does not include the given key' do
+ expect(event_filter.active?(described_class::TEAM)).to eq(true)
end
end
end
diff --git a/spec/lib/feature_spec.rb b/spec/lib/feature_spec.rb
index f313e675654..9d56c62ae57 100644
--- a/spec/lib/feature_spec.rb
+++ b/spec/lib/feature_spec.rb
@@ -1,6 +1,13 @@
require 'spec_helper'
describe Feature do
+ before do
+ # We mock all calls to .enabled? to return true in order to force all
+ # specs to run the feature flag gated behavior, but here we need a clean
+ # behavior from the class
+ allow(described_class).to receive(:enabled?).and_call_original
+ end
+
describe '.get' do
let(:feature) { double(:feature) }
let(:key) { 'my_feature' }
@@ -84,7 +91,11 @@ describe Feature do
end
describe '.flipper' do
- shared_examples 'a memoized Flipper instance' do
+ before do
+ described_class.instance_variable_set(:@flipper, nil)
+ end
+
+ context 'when request store is inactive' do
it 'memoizes the Flipper instance' do
expect(Flipper).to receive(:new).once.and_call_original
@@ -94,16 +105,81 @@ describe Feature do
end
end
- context 'when request store is inactive' do
- before do
+ context 'when request store is active', :request_store do
+ it 'memoizes the Flipper instance' do
+ expect(Flipper).to receive(:new).once.and_call_original
+
+ described_class.flipper
described_class.instance_variable_set(:@flipper, nil)
+ described_class.flipper
end
+ end
+ end
+
+ describe '.enabled?' do
+ it 'returns false for undefined feature' do
+ expect(described_class.enabled?(:some_random_feature_flag)).to be_falsey
+ end
+
+ it 'returns true for undefined feature with default_enabled' do
+ expect(described_class.enabled?(:some_random_feature_flag, default_enabled: true)).to be_truthy
+ end
- it_behaves_like 'a memoized Flipper instance'
+ it 'returns false for existing disabled feature in the database' do
+ described_class.disable(:disabled_feature_flag)
+
+ expect(described_class.enabled?(:disabled_feature_flag)).to be_falsey
end
- context 'when request store is inactive', :request_store do
- it_behaves_like 'a memoized Flipper instance'
+ it 'returns true for existing enabled feature in the database' do
+ described_class.enable(:enabled_feature_flag)
+
+ expect(described_class.enabled?(:enabled_feature_flag)).to be_truthy
+ end
+
+ context 'with an individual actor' do
+ CustomActor = Struct.new(:flipper_id)
+
+ let(:actor) { CustomActor.new(flipper_id: 'CustomActor:5') }
+ let(:another_actor) { CustomActor.new(flipper_id: 'CustomActor:10') }
+
+ before do
+ described_class.enable(:enabled_feature_flag, actor)
+ end
+
+ it 'returns true when same actor is informed' do
+ expect(described_class.enabled?(:enabled_feature_flag, actor)).to be_truthy
+ end
+
+ it 'returns false when different actor is informed' do
+ expect(described_class.enabled?(:enabled_feature_flag, another_actor)).to be_falsey
+ end
+
+ it 'returns false when no actor is informed' do
+ expect(described_class.enabled?(:enabled_feature_flag)).to be_falsey
+ end
+ end
+ end
+
+ describe '.disable?' do
+ it 'returns true for undefined feature' do
+ expect(described_class.disabled?(:some_random_feature_flag)).to be_truthy
+ end
+
+ it 'returns false for undefined feature with default_enabled' do
+ expect(described_class.disabled?(:some_random_feature_flag, default_enabled: true)).to be_falsey
+ end
+
+ it 'returns true for existing disabled feature in the database' do
+ described_class.disable(:disabled_feature_flag)
+
+ expect(described_class.disabled?(:disabled_feature_flag)).to be_truthy
+ end
+
+ it 'returns false for existing enabled feature in the database' do
+ described_class.enable(:enabled_feature_flag)
+
+ expect(described_class.disabled?(:enabled_feature_flag)).to be_falsey
end
end
end
diff --git a/spec/lib/forever_spec.rb b/spec/lib/forever_spec.rb
index cf40c467c72..494c0561975 100644
--- a/spec/lib/forever_spec.rb
+++ b/spec/lib/forever_spec.rb
@@ -7,6 +7,7 @@ describe Forever do
context 'when using PostgreSQL' do
it 'should return Postgresql future date' do
allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
+
expect(subject).to eq(described_class::POSTGRESQL_DATE)
end
end
@@ -14,6 +15,7 @@ describe Forever do
context 'when using MySQL' do
it 'should return MySQL future date' do
allow(Gitlab::Database).to receive(:postgresql?).and_return(false)
+
expect(subject).to eq(described_class::MYSQL_DATE)
end
end
diff --git a/spec/lib/gitaly/server_spec.rb b/spec/lib/gitaly/server_spec.rb
index 09bf21b5946..292ab870dad 100644
--- a/spec/lib/gitaly/server_spec.rb
+++ b/spec/lib/gitaly/server_spec.rb
@@ -26,9 +26,7 @@ describe Gitaly::Server do
end
end
- context 'when the storage is not readable' do
- let(:server) { described_class.new('broken') }
-
+ context 'when the storage is not readable', :broken_storage do
it 'returns false' do
expect(server).not_to be_readable
end
@@ -42,9 +40,7 @@ describe Gitaly::Server do
end
end
- context 'when the storage is not writeable' do
- let(:server) { described_class.new('broken') }
-
+ context 'when the storage is not writeable', :broken_storage do
it 'returns false' do
expect(server).not_to be_writeable
end
diff --git a/spec/lib/gitlab/auth/ldap/access_spec.rb b/spec/lib/gitlab/auth/ldap/access_spec.rb
index eff21985108..662f899180b 100644
--- a/spec/lib/gitlab/auth/ldap/access_spec.rb
+++ b/spec/lib/gitlab/auth/ldap/access_spec.rb
@@ -3,51 +3,61 @@ require 'spec_helper'
describe Gitlab::Auth::LDAP::Access do
include LdapHelpers
- let(:access) { described_class.new user }
let(:user) { create(:omniauth_user) }
+ subject(:access) { described_class.new(user) }
+
describe '.allowed?' do
- it 'updates the users `last_credential_check_at' do
+ before do
allow(access).to receive(:update_user)
- expect(access).to receive(:allowed?) { true }
- expect(described_class).to receive(:open).and_yield(access)
+ allow(access).to receive(:allowed?).and_return(true)
+ allow(described_class).to receive(:open).and_yield(access)
+ end
+ it "updates the user's `last_credential_check_at`" do
expect { described_class.allowed?(user) }
.to change { user.last_credential_check_at }
end
- end
- describe '#find_ldap_user' do
- it 'finds a user by dn first' do
- expect(Gitlab::Auth::LDAP::Person).to receive(:find_by_dn).and_return(:ldap_user)
+ it "does not update user's `last_credential_check_at` when in a read-only GitLab instance" do
+ allow(Gitlab::Database).to receive(:read_only?).and_return(true)
- access.find_ldap_user
+ expect { described_class.allowed?(user) }
+ .not_to change { user.last_credential_check_at }
end
end
describe '#allowed?' do
- subject { access.allowed? }
-
context 'when the user cannot be found' do
before do
- allow(Gitlab::Auth::LDAP::Person).to receive(:find_by_dn).and_return(nil)
- allow(Gitlab::Auth::LDAP::Person).to receive(:find_by_email).and_return(nil)
+ stub_ldap_person_find_by_dn(nil)
+ stub_ldap_person_find_by_email(user.email, nil)
end
- it { is_expected.to be_falsey }
+ it 'returns false' do
+ expect(access.allowed?).to be_falsey
+ end
it 'blocks user in GitLab' do
- expect(access).to receive(:block_user).with(user, 'does not exist anymore')
+ access.allowed?
+
+ expect(user).to be_blocked
+ expect(user).to be_ldap_blocked
+ end
+
+ it 'logs the reason' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ "LDAP account \"123456\" does not exist anymore, " \
+ "blocking GitLab user \"#{user.name}\" (#{user.email})"
+ )
access.allowed?
end
end
context 'when the user is found' do
- let(:ldap_user) { Gitlab::Auth::LDAP::Person.new(Net::LDAP::Entry.new, 'ldapmain') }
-
before do
- allow(Gitlab::Auth::LDAP::Person).to receive(:find_by_dn).and_return(ldap_user)
+ stub_ldap_person_find_by_dn(Net::LDAP::Entry.new)
end
context 'and the user is disabled via active directory' do
@@ -55,10 +65,22 @@ describe Gitlab::Auth::LDAP::Access do
allow(Gitlab::Auth::LDAP::Person).to receive(:disabled_via_active_directory?).and_return(true)
end
- it { is_expected.to be_falsey }
+ it 'returns false' do
+ expect(access.allowed?).to be_falsey
+ end
it 'blocks user in GitLab' do
- expect(access).to receive(:block_user).with(user, 'is disabled in Active Directory')
+ access.allowed?
+
+ expect(user).to be_blocked
+ expect(user).to be_ldap_blocked
+ end
+
+ it 'logs the reason' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ "LDAP account \"123456\" is disabled in Active Directory, " \
+ "blocking GitLab user \"#{user.name}\" (#{user.email})"
+ )
access.allowed?
end
@@ -92,7 +114,17 @@ describe Gitlab::Auth::LDAP::Access do
end
it 'unblocks user in GitLab' do
- expect(access).to receive(:unblock_user).with(user, 'is not disabled anymore')
+ access.allowed?
+
+ expect(user).not_to be_blocked
+ expect(user).not_to be_ldap_blocked
+ end
+
+ it 'logs the reason' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ "LDAP account \"123456\" is not disabled anymore, " \
+ "unblocking GitLab user \"#{user.name}\" (#{user.email})"
+ )
access.allowed?
end
@@ -105,18 +137,32 @@ describe Gitlab::Auth::LDAP::Access do
allow_any_instance_of(Gitlab::Auth::LDAP::Config).to receive(:active_directory).and_return(false)
end
- it { is_expected.to be_truthy }
+ it 'returns true' do
+ expect(access.allowed?).to be_truthy
+ end
context 'when user cannot be found' do
before do
- allow(Gitlab::Auth::LDAP::Person).to receive(:find_by_dn).and_return(nil)
- allow(Gitlab::Auth::LDAP::Person).to receive(:find_by_email).and_return(nil)
+ stub_ldap_person_find_by_dn(nil)
+ stub_ldap_person_find_by_email(user.email, nil)
end
- it { is_expected.to be_falsey }
+ it 'returns false' do
+ expect(access.allowed?).to be_falsey
+ end
it 'blocks user in GitLab' do
- expect(access).to receive(:block_user).with(user, 'does not exist anymore')
+ access.allowed?
+
+ expect(user).to be_blocked
+ expect(user).to be_ldap_blocked
+ end
+
+ it 'logs the reason' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ "LDAP account \"123456\" does not exist anymore, " \
+ "blocking GitLab user \"#{user.name}\" (#{user.email})"
+ )
access.allowed?
end
@@ -128,7 +174,17 @@ describe Gitlab::Auth::LDAP::Access do
end
it 'unblocks the user if it exists' do
- expect(access).to receive(:unblock_user).with(user, 'is available again')
+ access.allowed?
+
+ expect(user).not_to be_blocked
+ expect(user).not_to be_ldap_blocked
+ end
+
+ it 'logs the reason' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ "LDAP account \"123456\" is available again, " \
+ "unblocking GitLab user \"#{user.name}\" (#{user.email})"
+ )
access.allowed?
end
@@ -152,46 +208,4 @@ describe Gitlab::Auth::LDAP::Access do
end
end
end
-
- describe '#block_user' do
- before do
- user.activate
- allow(Gitlab::AppLogger).to receive(:info)
-
- access.block_user user, 'reason'
- end
-
- it 'blocks the user' do
- expect(user).to be_blocked
- expect(user).to be_ldap_blocked
- end
-
- it 'logs the reason' do
- expect(Gitlab::AppLogger).to have_received(:info).with(
- "LDAP account \"123456\" reason, " \
- "blocking Gitlab user \"#{user.name}\" (#{user.email})"
- )
- end
- end
-
- describe '#unblock_user' do
- before do
- user.ldap_block
- allow(Gitlab::AppLogger).to receive(:info)
-
- access.unblock_user user, 'reason'
- end
-
- it 'activates the user' do
- expect(user).not_to be_blocked
- expect(user).not_to be_ldap_blocked
- end
-
- it 'logs the reason' do
- Gitlab::AppLogger.info(
- "LDAP account \"123456\" reason, " \
- "unblocking Gitlab user \"#{user.name}\" (#{user.email})"
- )
- end
- end
end
diff --git a/spec/lib/gitlab/auth/o_auth/provider_spec.rb b/spec/lib/gitlab/auth/o_auth/provider_spec.rb
index fc35d430917..80d702cf9dc 100644
--- a/spec/lib/gitlab/auth/o_auth/provider_spec.rb
+++ b/spec/lib/gitlab/auth/o_auth/provider_spec.rb
@@ -1,6 +1,48 @@
require 'spec_helper'
describe Gitlab::Auth::OAuth::Provider do
+ describe '.enabled?' do
+ before do
+ allow(described_class).to receive(:providers).and_return([:ldapmain, :google_oauth2])
+ end
+
+ context 'when OmniAuth is disabled' do
+ before do
+ allow(Gitlab::Auth).to receive(:omniauth_enabled?).and_return(false)
+ end
+
+ it 'allows database auth' do
+ expect(described_class.enabled?('database')).to be_truthy
+ end
+
+ it 'allows LDAP auth' do
+ expect(described_class.enabled?('ldapmain')).to be_truthy
+ end
+
+ it 'does not allow other OmniAuth providers' do
+ expect(described_class.enabled?('google_oauth2')).to be_falsey
+ end
+ end
+
+ context 'when OmniAuth is enabled' do
+ before do
+ allow(Gitlab::Auth).to receive(:omniauth_enabled?).and_return(true)
+ end
+
+ it 'allows database auth' do
+ expect(described_class.enabled?('database')).to be_truthy
+ end
+
+ it 'allows LDAP auth' do
+ expect(described_class.enabled?('ldapmain')).to be_truthy
+ end
+
+ it 'allows other OmniAuth providers' do
+ expect(described_class.enabled?('google_oauth2')).to be_truthy
+ end
+ end
+ end
+
describe '#config_for' do
context 'for an LDAP provider' do
context 'when the provider exists' do
diff --git a/spec/lib/gitlab/auth/saml/auth_hash_spec.rb b/spec/lib/gitlab/auth/saml/auth_hash_spec.rb
index 76f49e778fb..3620e1afe25 100644
--- a/spec/lib/gitlab/auth/saml/auth_hash_spec.rb
+++ b/spec/lib/gitlab/auth/saml/auth_hash_spec.rb
@@ -82,6 +82,17 @@ describe Gitlab::Auth::Saml::AuthHash do
end
end
+ context 'with SAML 2.0 response_object' do
+ before do
+ auth_hash_data[:extra][:response_object] = { document:
+ saml_xml(File.read('spec/fixtures/authentication/saml2_response.xml')) }
+ end
+
+ it 'can extract authn_context' do
+ expect(saml_auth_hash.authn_context).to eq 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'
+ end
+ end
+
context 'without response_object' do
it 'returns an empty string' do
expect(saml_auth_hash.authn_context).to be_nil
diff --git a/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb b/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb
index e1c4f9cfea7..5076996474f 100644
--- a/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb
+++ b/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb
@@ -118,7 +118,7 @@ describe Gitlab::BackgroundMigration::CreateForkNetworkMembershipsRange, :migrat
expect(fork_network_members.count).to eq(12)
end
- it 'knows when not all memberships withing a batch have been created' do
+ it 'knows when not all memberships within a batch have been created' do
expect(migration.missing_members?(8, 10)).to be_truthy
end
end
diff --git a/spec/lib/gitlab/background_migration/create_gpg_key_subkeys_from_gpg_keys_spec.rb b/spec/lib/gitlab/background_migration/create_gpg_key_subkeys_from_gpg_keys_spec.rb
index 26d48cc8201..f92acf61682 100644
--- a/spec/lib/gitlab/background_migration/create_gpg_key_subkeys_from_gpg_keys_spec.rb
+++ b/spec/lib/gitlab/background_migration/create_gpg_key_subkeys_from_gpg_keys_spec.rb
@@ -5,7 +5,7 @@ describe Gitlab::BackgroundMigration::CreateGpgKeySubkeysFromGpgKeys, :migration
let!(:gpg_key) { create(:gpg_key, key: GpgHelpers::User3.public_key) }
before do
- GpgKeySubkey.destroy_all
+ GpgKeySubkey.destroy_all # rubocop: disable DestroyAll
end
it 'generate the subkeys' do
diff --git a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
index 0735ebd6dcb..5dce3fcbcb6 100644
--- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
+++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits, :migration, schema: 20171114162227 do
+ include GitHelpers
+
let(:merge_request_diffs) { table(:merge_request_diffs) }
let(:merge_requests) { table(:merge_requests) }
@@ -9,11 +11,7 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits, :m
let(:merge_request) { merge_requests.create!(iid: 1, target_project_id: project.id, source_project_id: project.id, target_branch: 'feature', source_branch: 'master').becomes(MergeRequest) }
let(:merge_request_diff) { MergeRequest.find(merge_request.id).create_merge_request_diff }
let(:updated_merge_request_diff) { MergeRequestDiff.find(merge_request_diff.id) }
- let(:rugged) do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
- end
+ let(:rugged) { rugged_repo(project.repository) }
before do
allow_any_instance_of(MergeRequestDiff)
diff --git a/spec/lib/gitlab/background_migration/digest_column_spec.rb b/spec/lib/gitlab/background_migration/digest_column_spec.rb
new file mode 100644
index 00000000000..3e107ac3027
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/digest_column_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::DigestColumn, :migration, schema: 20180913142237 do
+ let(:personal_access_tokens) { table(:personal_access_tokens) }
+ let(:users) { table(:users) }
+
+ subject { described_class.new }
+
+ describe '#perform' do
+ context 'token is not yet hashed' do
+ before do
+ users.create(id: 1, email: 'user@example.com', projects_limit: 10)
+ personal_access_tokens.create!(id: 1, user_id: 1, name: 'pat-01', token: 'token-01')
+ end
+
+ it 'saves token digest' do
+ expect { subject.perform(PersonalAccessToken, :token, :token_digest, 1, 2) }.to(
+ change { PersonalAccessToken.find(1).token_digest }.from(nil).to(Gitlab::CryptoHelper.sha256('token-01')))
+ end
+
+ it 'erases token' do
+ expect { subject.perform(PersonalAccessToken, :token, :token_digest, 1, 2) }.to(
+ change { PersonalAccessToken.find(1).token }.from('token-01').to(nil))
+ end
+ end
+
+ context 'token is already hashed' do
+ before do
+ users.create(id: 1, email: 'user@example.com', projects_limit: 10)
+ personal_access_tokens.create!(id: 1, user_id: 1, name: 'pat-01', token_digest: 'token-digest-01')
+ end
+
+ it 'does not change existing token digest' do
+ expect { subject.perform(PersonalAccessToken, :token, :token_digest, 1, 2) }.not_to(
+ change { PersonalAccessToken.find(1).token_digest })
+ end
+
+ it 'leaves token empty' do
+ expect { subject.perform(PersonalAccessToken, :token, :token_digest, 1, 2) }.not_to(
+ change { PersonalAccessToken.find(1).token }.from(nil))
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/encrypt_columns_spec.rb b/spec/lib/gitlab/background_migration/encrypt_columns_spec.rb
new file mode 100644
index 00000000000..2a869446753
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/encrypt_columns_spec.rb
@@ -0,0 +1,69 @@
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::EncryptColumns, :migration, schema: 20180910115836 do
+ let(:model) { Gitlab::BackgroundMigration::Models::EncryptColumns::WebHook }
+ let(:web_hooks) { table(:web_hooks) }
+
+ let(:plaintext_attrs) do
+ {
+ 'encrypted_token' => nil,
+ 'encrypted_url' => nil,
+ 'token' => 'secret',
+ 'url' => 'http://example.com?access_token=secret'
+ }
+ end
+
+ let(:encrypted_attrs) do
+ {
+ 'encrypted_token' => be_present,
+ 'encrypted_url' => be_present,
+ 'token' => nil,
+ 'url' => nil
+ }
+ end
+
+ describe '#perform' do
+ it 'encrypts columns for the specified range' do
+ hooks = web_hooks.create([plaintext_attrs] * 5).sort_by(&:id)
+
+ # Encrypt all but the first and last rows
+ subject.perform(model, [:token, :url], hooks[1].id, hooks[3].id)
+
+ hooks = web_hooks.where(id: hooks.map(&:id)).order(:id)
+
+ aggregate_failures do
+ expect(hooks[0]).to have_attributes(plaintext_attrs)
+ expect(hooks[1]).to have_attributes(encrypted_attrs)
+ expect(hooks[2]).to have_attributes(encrypted_attrs)
+ expect(hooks[3]).to have_attributes(encrypted_attrs)
+ expect(hooks[4]).to have_attributes(plaintext_attrs)
+ end
+ end
+
+ it 'acquires an exclusive lock for the update' do
+ relation = double('relation', each: nil)
+
+ expect(model).to receive(:where) { relation }
+ expect(relation).to receive(:lock) { relation }
+
+ subject.perform(model, [:token, :url], 1, 1)
+ end
+
+ it 'skips already-encrypted columns' do
+ values = {
+ 'encrypted_token' => 'known encrypted token',
+ 'encrypted_url' => 'known encrypted url',
+ 'token' => 'token',
+ 'url' => 'url'
+ }
+
+ hook = web_hooks.create(values)
+
+ subject.perform(model, [:token, :url], hook.id, hook.id)
+
+ hook.reload
+
+ expect(hook).to have_attributes(values)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb b/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb
new file mode 100644
index 00000000000..2d1505dacfe
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb
@@ -0,0 +1,156 @@
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::MigrateLegacyArtifacts, :migration, schema: 20180816161409 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:pipelines) { table(:ci_pipelines) }
+ let(:jobs) { table(:ci_builds) }
+ let(:job_artifacts) { table(:ci_job_artifacts) }
+
+ subject { described_class.new.perform(*range) }
+
+ context 'when a pipeline exists' do
+ let!(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
+ let!(:project) { projects.create!(name: 'gitlab', path: 'gitlab-ce', namespace_id: namespace.id) }
+ let!(:pipeline) { pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a') }
+
+ context 'when a legacy artifacts exists' do
+ let(:artifacts_expire_at) { 1.day.since.to_s }
+ let(:file_store) { ::ObjectStorage::Store::REMOTE }
+
+ let!(:job) do
+ jobs.create!(
+ commit_id: pipeline.id,
+ project_id: project.id,
+ status: :success,
+ **artifacts_archive_attributes,
+ **artifacts_metadata_attributes)
+ end
+
+ let(:artifacts_archive_attributes) do
+ {
+ artifacts_file: 'archive.zip',
+ artifacts_file_store: file_store,
+ artifacts_size: 123,
+ artifacts_expire_at: artifacts_expire_at
+ }
+ end
+
+ let(:artifacts_metadata_attributes) do
+ {
+ artifacts_metadata: 'metadata.gz',
+ artifacts_metadata_store: file_store
+ }
+ end
+
+ it 'has legacy artifacts' do
+ expect(jobs.pluck('artifacts_file, artifacts_file_store, artifacts_size, artifacts_expire_at')).to eq([artifacts_archive_attributes.values])
+ expect(jobs.pluck('artifacts_metadata, artifacts_metadata_store')).to eq([artifacts_metadata_attributes.values])
+ end
+
+ it 'does not have new artifacts yet' do
+ expect(job_artifacts.count).to be_zero
+ end
+
+ context 'when the record exists inside of the range of a background migration' do
+ let(:range) { [job.id, job.id] }
+
+ it 'migrates a legacy artifact to ci_job_artifacts table' do
+ expect { subject }.to change { job_artifacts.count }.by(2)
+
+ expect(job_artifacts.order(:id).pluck('project_id, job_id, file_type, file_store, size, expire_at, file, file_sha256, file_location'))
+ .to eq([[project.id,
+ job.id,
+ described_class::ARCHIVE_FILE_TYPE,
+ file_store,
+ artifacts_archive_attributes[:artifacts_size],
+ artifacts_expire_at,
+ 'archive.zip',
+ nil,
+ described_class::LEGACY_PATH_FILE_LOCATION],
+ [project.id,
+ job.id,
+ described_class::METADATA_FILE_TYPE,
+ file_store,
+ nil,
+ artifacts_expire_at,
+ 'metadata.gz',
+ nil,
+ described_class::LEGACY_PATH_FILE_LOCATION]])
+
+ expect(jobs.pluck('artifacts_file, artifacts_file_store, artifacts_size, artifacts_expire_at')).to eq([[nil, nil, nil, artifacts_expire_at]])
+ expect(jobs.pluck('artifacts_metadata, artifacts_metadata_store')).to eq([[nil, nil]])
+ end
+
+ context 'when file_store is nil' do
+ let(:file_store) { nil }
+
+ it 'has nullified file_store in all legacy artifacts' do
+ expect(jobs.pluck('artifacts_file_store, artifacts_metadata_store')).to eq([[nil, nil]])
+ end
+
+ it 'fills file_store by the value of local file store' do
+ subject
+
+ expect(job_artifacts.pluck('file_store')).to all(eq(::ObjectStorage::Store::LOCAL))
+ end
+ end
+
+ context 'when new artifacts has already existed' do
+ context 'when only archive.zip existed' do
+ before do
+ job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: described_class::ARCHIVE_FILE_TYPE, size: 999, file: 'archive.zip')
+ end
+
+ it 'had archive.zip already' do
+ expect(job_artifacts.exists?(job_id: job.id, file_type: described_class::ARCHIVE_FILE_TYPE)).to be_truthy
+ end
+
+ it 'migrates metadata' do
+ expect { subject }.to change { job_artifacts.count }.by(1)
+
+ expect(job_artifacts.exists?(job_id: job.id, file_type: described_class::METADATA_FILE_TYPE)).to be_truthy
+ end
+ end
+
+ context 'when both archive and metadata existed' do
+ before do
+ job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: described_class::ARCHIVE_FILE_TYPE, size: 999, file: 'archive.zip')
+ job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: described_class::METADATA_FILE_TYPE, size: 999, file: 'metadata.zip')
+ end
+
+ it 'does not migrate' do
+ expect { subject }.not_to change { job_artifacts.count }
+ end
+ end
+ end
+ end
+
+ context 'when the record exists outside of the range of a background migration' do
+ let(:range) { [job.id + 1, job.id + 1] }
+
+ it 'does not migrate' do
+ expect { subject }.not_to change { job_artifacts.count }
+ end
+ end
+ end
+
+ context 'when the job does not have legacy artifacts' do
+ let!(:job) { jobs.create!(commit_id: pipeline.id, project_id: project.id, status: :success) }
+
+ it 'does not have the legacy artifacts in database' do
+ expect(jobs.count).to eq(1)
+ expect(jobs.pluck('artifacts_file, artifacts_file_store, artifacts_size, artifacts_expire_at')).to eq([[nil, nil, nil, nil]])
+ expect(jobs.pluck('artifacts_metadata, artifacts_metadata_store')).to eq([[nil, nil]])
+ end
+
+ context 'when the record exists inside of the range of a background migration' do
+ let(:range) { [job.id, job.id] }
+
+ it 'does not migrate' do
+ expect { subject }.not_to change { job_artifacts.count }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb b/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb
new file mode 100644
index 00000000000..4f1b01eed41
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::PopulateClusterKubernetesNamespaceTable, :migration, schema: 20181022173835 do
+ let(:migration) { described_class.new }
+ let(:clusters) { create_list(:cluster, 10, :project, :provided_by_gcp) }
+
+ before do
+ clusters
+ end
+
+ shared_examples 'consistent kubernetes namespace attributes' do
+ it 'should populate namespace and service account information' do
+ subject
+
+ clusters_with_namespace.each do |cluster|
+ project = cluster.project
+ cluster_project = cluster.cluster_projects.first
+ namespace = "#{project.path}-#{project.id}"
+ kubernetes_namespace = cluster.reload.kubernetes_namespace
+
+ expect(kubernetes_namespace).to be_present
+ expect(kubernetes_namespace.cluster_project).to eq(cluster_project)
+ expect(kubernetes_namespace.project).to eq(cluster_project.project)
+ expect(kubernetes_namespace.cluster).to eq(cluster_project.cluster)
+ expect(kubernetes_namespace.namespace).to eq(namespace)
+ expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account")
+ end
+ end
+ end
+
+ subject { migration.perform }
+
+ context 'when no Clusters::Project has a Clusters::KubernetesNamespace' do
+ let(:cluster_projects) { Clusters::Project.all }
+
+ it 'should create a Clusters::KubernetesNamespace per Clusters::Project' do
+ expect do
+ subject
+ end.to change(Clusters::KubernetesNamespace, :count).by(cluster_projects.count)
+ end
+
+ it_behaves_like 'consistent kubernetes namespace attributes' do
+ let(:clusters_with_namespace) { clusters }
+ end
+ end
+
+ context 'when every Clusters::Project has Clusters::KubernetesNamespace' do
+ before do
+ clusters.each do |cluster|
+ create(:cluster_kubernetes_namespace,
+ cluster_project: cluster.cluster_projects.first,
+ cluster: cluster,
+ project: cluster.project)
+ end
+ end
+
+ it 'should not create any Clusters::KubernetesNamespace' do
+ expect do
+ subject
+ end.not_to change(Clusters::KubernetesNamespace, :count)
+ end
+ end
+
+ context 'when only some Clusters::Project have Clusters::KubernetesNamespace related' do
+ let(:with_kubernetes_namespace) { clusters.first(6) }
+ let(:with_no_kubernetes_namespace) { clusters.last(4) }
+
+ before do
+ with_kubernetes_namespace.each do |cluster|
+ create(:cluster_kubernetes_namespace,
+ cluster_project: cluster.cluster_projects.first,
+ cluster: cluster,
+ project: cluster.project)
+ end
+ end
+
+ it 'creates limited number of Clusters::KubernetesNamespace' do
+ expect do
+ subject
+ end.to change(Clusters::KubernetesNamespace, :count).by(with_no_kubernetes_namespace.count)
+ end
+
+ it 'should not modify clusters with Clusters::KubernetesNamespace' do
+ subject
+
+ with_kubernetes_namespace.each do |cluster|
+ expect(cluster.kubernetes_namespaces.count).to eq(1)
+ end
+ end
+
+ it_behaves_like 'consistent kubernetes namespace attributes' do
+ let(:clusters_with_namespace) { with_no_kubernetes_namespace }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb b/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb
new file mode 100644
index 00000000000..c7b272cd6ca
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::PopulateExternalPipelineSource, :migration, schema: 20180916011959 do
+ let(:migration) { described_class.new }
+
+ let!(:internal_pipeline) { create(:ci_pipeline, source: :web) }
+ let(:pipelines) { [internal_pipeline, unknown_pipeline].map(&:id) }
+
+ let!(:unknown_pipeline) do
+ build(:ci_pipeline, source: :unknown)
+ .tap { |pipeline| pipeline.save(validate: false) }
+ end
+
+ subject { migration.perform(pipelines.min, pipelines.max) }
+
+ shared_examples 'no changes' do
+ it 'does not change the pipeline source' do
+ expect { subject }.not_to change { unknown_pipeline.reload.source }
+ end
+ end
+
+ context 'when unknown pipeline is external' do
+ before do
+ create(:generic_commit_status, pipeline: unknown_pipeline)
+ end
+
+ it 'populates the pipeline source' do
+ subject
+
+ expect(unknown_pipeline.reload.source).to eq('external')
+ end
+
+ it 'can be repeated without effect' do
+ subject
+
+ expect { subject }.not_to change { unknown_pipeline.reload.source }
+ end
+ end
+
+ context 'when unknown pipeline has just a build' do
+ before do
+ create(:ci_build, pipeline: unknown_pipeline)
+ end
+
+ it_behaves_like 'no changes'
+ end
+
+ context 'when unknown pipeline has no statuses' do
+ it_behaves_like 'no changes'
+ end
+
+ context 'when unknown pipeline has a build and a status' do
+ before do
+ create(:generic_commit_status, pipeline: unknown_pipeline)
+ create(:ci_build, pipeline: unknown_pipeline)
+ end
+
+ it_behaves_like 'no changes'
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/redact_links_spec.rb b/spec/lib/gitlab/background_migration/redact_links_spec.rb
new file mode 100644
index 00000000000..a40e68069cc
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/redact_links_spec.rb
@@ -0,0 +1,96 @@
+require 'spec_helper'
+
+describe Gitlab::BackgroundMigration::RedactLinks, :migration, schema: 20181014121030 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:issues) { table(:issues) }
+ let(:notes) { table(:notes) }
+ let(:snippets) { table(:snippets) }
+ let(:users) { table(:users) }
+ let(:merge_requests) { table(:merge_requests) }
+ let(:namespace) { namespaces.create(name: 'gitlab', path: 'gitlab-org') }
+ let(:project) { projects.create(namespace_id: namespace.id, name: 'foo') }
+ let(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') }
+
+ def create_merge_request(id, params)
+ params.merge!(id: id,
+ target_project_id: project.id,
+ target_branch: 'master',
+ source_project_id: project.id,
+ source_branch: 'mr name',
+ title: "mr name#{id}")
+
+ merge_requests.create(params)
+ end
+
+ def create_issue(id, params)
+ params.merge!(id: id, title: "issue#{id}", project_id: project.id)
+
+ issues.create(params)
+ end
+
+ def create_note(id, params)
+ params[:id] = id
+
+ notes.create(params)
+ end
+
+ def create_snippet(id, params)
+ params.merge!(id: id, author_id: user.id)
+
+ snippets.create(params)
+ end
+
+ def create_resource(model, id, params)
+ send("create_#{model.name.underscore}", id, params)
+ end
+
+ shared_examples_for 'redactable resource' do
+ it 'updates only matching texts' do
+ matching_text = 'some text /sent_notifications/00000000000000000000000000000000/unsubscribe more text'
+ redacted_text = 'some text /sent_notifications/REDACTED/unsubscribe more text'
+ create_resource(model, 1, { field => matching_text })
+ create_resource(model, 2, { field => 'not matching text' })
+ create_resource(model, 3, { field => matching_text })
+ create_resource(model, 4, { field => redacted_text })
+ create_resource(model, 5, { field => matching_text })
+
+ expected = { field => 'some text /sent_notifications/REDACTED/unsubscribe more text',
+ "#{field}_html" => nil }
+ expect_any_instance_of("Gitlab::BackgroundMigration::RedactLinks::#{model}".constantize).to receive(:update_columns).with(expected).and_call_original
+
+ subject.perform(model, field, 2, 4)
+
+ expect(model.where(field => matching_text).pluck(:id)).to eq [1, 5]
+ expect(model.find(3).reload[field]).to eq redacted_text
+ end
+ end
+
+ context 'resource is Issue' do
+ it_behaves_like 'redactable resource' do
+ let(:model) { Issue }
+ let(:field) { :description }
+ end
+ end
+
+ context 'resource is Merge Request' do
+ it_behaves_like 'redactable resource' do
+ let(:model) { MergeRequest }
+ let(:field) { :description }
+ end
+ end
+
+ context 'resource is Note' do
+ it_behaves_like 'redactable resource' do
+ let(:model) { Note }
+ let(:field) { :note }
+ end
+ end
+
+ context 'resource is Snippet' do
+ it_behaves_like 'redactable resource' do
+ let(:model) { Snippet }
+ let(:field) { :description }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/bare_repository_import/importer_spec.rb b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
index 6e21c846c0a..3c63e601abc 100644
--- a/spec/lib/gitlab/bare_repository_import/importer_spec.rb
+++ b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
@@ -10,9 +10,6 @@ describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
subject(:importer) { described_class.new(admin, bare_repository) }
before do
- @rainbow = Rainbow.enabled
- Rainbow.enabled = false
-
allow(described_class).to receive(:log)
end
@@ -20,7 +17,6 @@ describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
FileUtils.rm_rf(base_dir)
TestEnv.clean_test_path
ensure_seeds
- Rainbow.enabled = @rainbow
end
shared_examples 'importing a repository' do
diff --git a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb
index ed6fa3d229f..e2bee22cf1f 100644
--- a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb
+++ b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb
@@ -11,7 +11,7 @@ describe Gitlab::BitbucketImport::ProjectCreator do
owner: "asd",
full_name: 'Vim repo',
visibility_level: Gitlab::VisibilityLevel::PRIVATE,
- clone_url: 'ssh://git@bitbucket.org/asd/vim.git',
+ clone_url: 'http://bitbucket.org/asd/vim.git',
has_wiki?: false)
end
@@ -32,7 +32,7 @@ describe Gitlab::BitbucketImport::ProjectCreator do
project_creator = described_class.new(repo, 'vim', namespace, user, access_params)
project = project_creator.execute
- expect(project.import_url).to eq("ssh://git@bitbucket.org/asd/vim.git")
+ expect(project.import_url).to eq("http://bitbucket.org/asd/vim.git")
expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
end
end
diff --git a/spec/lib/gitlab/blob_helper_spec.rb b/spec/lib/gitlab/blob_helper_spec.rb
new file mode 100644
index 00000000000..0b56f8687c3
--- /dev/null
+++ b/spec/lib/gitlab/blob_helper_spec.rb
@@ -0,0 +1,125 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::BlobHelper do
+ include FakeBlobHelpers
+
+ let(:project) { create(:project) }
+ let(:blob) { fake_blob(path: 'file.txt') }
+ let(:large_blob) { fake_blob(path: 'test.pdf', size: 2.megabytes, binary: true) }
+
+ describe '#extname' do
+ it 'returns the extension' do
+ expect(blob.extname).to eq('.txt')
+ end
+ end
+
+ describe '#known_extension?' do
+ it 'returns true' do
+ expect(blob.known_extension?).to be_truthy
+ end
+ end
+
+ describe '#viewable' do
+ it 'returns true' do
+ expect(blob.viewable?).to be_truthy
+ end
+
+ it 'returns false' do
+ expect(large_blob.viewable?).to be_falsey
+ end
+ end
+
+ describe '#large?' do
+ it 'returns false' do
+ expect(blob.large?).to be_falsey
+ end
+
+ it 'returns true' do
+ expect(large_blob.large?).to be_truthy
+ end
+ end
+
+ describe '#binary?' do
+ it 'returns true' do
+ expect(large_blob.binary?).to be_truthy
+ end
+
+ it 'returns false' do
+ expect(blob.binary?).to be_falsey
+ end
+ end
+
+ describe '#text?' do
+ it 'returns true' do
+ expect(blob.text?).to be_truthy
+ end
+
+ it 'returns false' do
+ expect(large_blob.text?).to be_falsey
+ end
+ end
+
+ describe '#image?' do
+ it 'returns false' do
+ expect(blob.image?).to be_falsey
+ end
+ end
+
+ describe '#mime_type' do
+ it 'returns text/plain' do
+ expect(blob.mime_type).to eq('text/plain')
+ end
+
+ it 'returns application/pdf' do
+ expect(large_blob.mime_type).to eq('application/pdf')
+ end
+ end
+
+ describe '#binary_mime_type?' do
+ it 'returns false' do
+ expect(blob.binary_mime_type?).to be_falsey
+ end
+ end
+
+ describe '#lines' do
+ it 'returns the payload in an Array' do
+ expect(blob.lines).to eq(['foo'])
+ end
+ end
+
+ describe '#content_type' do
+ it 'returns text/plain' do
+ expect(blob.content_type).to eq('text/plain; charset=utf-8')
+ end
+
+ it 'returns text/plain' do
+ expect(large_blob.content_type).to eq('application/pdf')
+ end
+ end
+
+ describe '#encoded_newlines_re' do
+ it 'returns a regular expression' do
+ expect(blob.encoded_newlines_re).to eq(/\r\n|\r|\n/)
+ end
+ end
+
+ describe '#ruby_encoding' do
+ it 'returns UTF-8' do
+ expect(blob.ruby_encoding).to eq('UTF-8')
+ end
+ end
+
+ describe '#encoding' do
+ it 'returns UTF-8' do
+ expect(blob.ruby_encoding).to eq('UTF-8')
+ end
+ end
+
+ describe '#empty?' do
+ it 'returns false' do
+ expect(blob.empty?).to be_falsey
+ end
+ end
+end
diff --git a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
index 18658588a40..e5999a1c509 100644
--- a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
+++ b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
@@ -49,8 +49,6 @@ describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do
end
it 'only connects to redis twice' do
- # Stub circuitbreaker so it doesn't count the redis connections in there
- stub_circuit_breaker(project_without_status)
expect(Gitlab::Redis::Cache).to receive(:with).exactly(2).and_call_original
described_class.load_in_batch_for_projects([project_without_status])
@@ -284,6 +282,21 @@ describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do
expect(pipeline_status.status).to eq(status)
expect(pipeline_status.ref).to eq(ref)
end
+
+ context 'when status is empty string' do
+ before do
+ Gitlab::Redis::Cache.with do |redis|
+ redis.mapped_hmset(cache_key,
+ { sha: sha, status: '', ref: ref })
+ end
+ end
+
+ it 'reads the status as nil' do
+ pipeline_status.load_from_cache
+
+ expect(pipeline_status.status).to eq(nil)
+ end
+ end
end
describe '#has_cache?' do
@@ -302,13 +315,4 @@ describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do
end
end
end
-
- def stub_circuit_breaker(project)
- fake_circuitbreaker = double
- allow(fake_circuitbreaker).to receive(:perform).and_yield
- allow(project.repository.raw_repository)
- .to receive(:circuit_breaker).and_return(fake_circuitbreaker)
- allow(project.repository)
- .to receive(:circuit_breaker).and_return(fake_circuitbreaker)
- end
end
diff --git a/spec/lib/gitlab/checks/change_access_spec.rb b/spec/lib/gitlab/checks/change_access_spec.rb
index 4df426c54ae..81804ba5c76 100644
--- a/spec/lib/gitlab/checks/change_access_spec.rb
+++ b/spec/lib/gitlab/checks/change_access_spec.rb
@@ -10,13 +10,16 @@ describe Gitlab::Checks::ChangeAccess do
let(:ref) { 'refs/heads/master' }
let(:changes) { { oldrev: oldrev, newrev: newrev, ref: ref } }
let(:protocol) { 'ssh' }
+ let(:timeout) { Gitlab::GitAccess::INTERNAL_TIMEOUT }
+ let(:logger) { Gitlab::Checks::TimedLogger.new(timeout: timeout) }
subject(:change_access) do
described_class.new(
changes,
project: project,
user_access: user_access,
- protocol: protocol
+ protocol: protocol,
+ logger: logger
)
end
@@ -30,6 +33,19 @@ describe Gitlab::Checks::ChangeAccess do
end
end
+ context 'when time limit was reached' do
+ it 'raises a TimeoutError' do
+ logger = Gitlab::Checks::TimedLogger.new(start_time: timeout.ago, timeout: timeout)
+ access = described_class.new(changes,
+ project: project,
+ user_access: user_access,
+ protocol: protocol,
+ logger: logger)
+
+ expect { access.exec }.to raise_error(Gitlab::Checks::TimedLogger::TimeoutError)
+ end
+ end
+
context 'when the user is not allowed to push to the repo' do
it 'raises an error' do
expect(user_access).to receive(:can_do_action?).with(:push_code).and_return(false)
diff --git a/spec/lib/gitlab/checks/lfs_integrity_spec.rb b/spec/lib/gitlab/checks/lfs_integrity_spec.rb
index ec22e3a198e..887ea8fc1e0 100644
--- a/spec/lib/gitlab/checks/lfs_integrity_spec.rb
+++ b/spec/lib/gitlab/checks/lfs_integrity_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe Gitlab::Checks::LfsIntegrity do
include ProjectForksHelper
+ let!(:time_left) { 50 }
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:newrev) do
@@ -15,7 +16,7 @@ describe Gitlab::Checks::LfsIntegrity do
operations.commit_tree('8856a329dd38ca86dfb9ce5aa58a16d88cc119bd', "New LFS objects")
end
- subject { described_class.new(project, newrev) }
+ subject { described_class.new(project, newrev, time_left) }
describe '#objects_missing?' do
let(:blob_object) { repository.blob_at_branch('lfs', 'files/lfs/lfs_object.iso') }
@@ -67,7 +68,7 @@ describe Gitlab::Checks::LfsIntegrity do
expect(subject.objects_missing?).to be_truthy
end
- it 'is false parent project already conatins LFS objects for the fork' do
+ it 'is false parent project already contains LFS objects for the fork' do
lfs_object = create(:lfs_object, oid: blob_object.lfs_oid)
create(:lfs_objects_project, project: parent_project, lfs_object: lfs_object)
diff --git a/spec/lib/gitlab/checks/timed_logger_spec.rb b/spec/lib/gitlab/checks/timed_logger_spec.rb
new file mode 100644
index 00000000000..0ed3940c038
--- /dev/null
+++ b/spec/lib/gitlab/checks/timed_logger_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Checks::TimedLogger do
+ let!(:timeout) { 50.seconds }
+ let!(:start) { Time.now }
+ let!(:ref) { "bar" }
+ let!(:logger) { described_class.new(start_time: start, timeout: timeout) }
+ let!(:log_messages) do
+ {
+ foo: "Foo message..."
+ }
+ end
+
+ before do
+ logger.append_message("Checking ref: #{ref}")
+ end
+
+ describe '#log_timed' do
+ it 'logs message' do
+ Timecop.freeze(start + 30.seconds) do
+ logger.log_timed(log_messages[:foo], start) { bar_check }
+ end
+
+ expect(logger.full_message).to eq("Checking ref: bar\nFoo message... (30000.0ms)")
+ end
+
+ context 'when time limit was reached' do
+ it 'cancels action' do
+ Timecop.freeze(start + 50.seconds) do
+ expect do
+ logger.log_timed(log_messages[:foo], start) do
+ bar_check
+ end
+ end.to raise_error(described_class::TimeoutError)
+ end
+
+ expect(logger.full_message).to eq("Checking ref: bar\nFoo message... (cancelled)")
+ end
+
+ it 'cancels action with time elapsed if work was performed' do
+ Timecop.freeze(start + 30.seconds) do
+ expect do
+ logger.log_timed(log_messages[:foo], start) do
+ grpc_check
+ end
+ end.to raise_error(described_class::TimeoutError)
+
+ expect(logger.full_message).to eq("Checking ref: bar\nFoo message... (cancelled after 30000.0ms)")
+ end
+ end
+ end
+ end
+
+ def bar_check
+ 2 + 2
+ end
+
+ def grpc_check
+ raise GRPC::DeadlineExceeded
+ end
+end
diff --git a/spec/lib/gitlab/ci/ansi2html_spec.rb b/spec/lib/gitlab/ci/ansi2html_spec.rb
index 7549e9941b6..5a5c071c639 100644
--- a/spec/lib/gitlab/ci/ansi2html_spec.rb
+++ b/spec/lib/gitlab/ci/ansi2html_spec.rb
@@ -7,7 +7,7 @@ describe Gitlab::Ci::Ansi2html do
expect(convert_html("Hello")).to eq('Hello')
end
- it "strips non-color-changing controll sequences" do
+ it "strips non-color-changing control sequences" do
expect(convert_html("Hello \e[2Kworld")).to eq('Hello world')
end
diff --git a/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb b/spec/lib/gitlab/ci/build/artifacts/adapters/gzip_stream_spec.rb
index 384329dda18..987c6b37aaa 100644
--- a/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb
+++ b/spec/lib/gitlab/ci/build/artifacts/adapters/gzip_stream_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Ci::Build::Artifacts::GzipFileAdapter do
+describe Gitlab::Ci::Build::Artifacts::Adapters::GzipStream do
describe '#initialize' do
context 'when stream is passed' do
let(:stream) { File.open(expand_fixture_path('junit/junit.xml.gz'), 'rb') }
diff --git a/spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb b/spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb
new file mode 100644
index 00000000000..ec2dd724b45
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Build::Artifacts::Adapters::RawStream do
+ describe '#initialize' do
+ context 'when stream is passed' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml'), 'rb') }
+
+ it 'initialized' do
+ expect { described_class.new(stream) }.not_to raise_error
+ end
+ end
+
+ context 'when stream is not passed' do
+ let(:stream) { nil }
+
+ it 'raises an error' do
+ expect { described_class.new(stream) }.to raise_error(described_class::InvalidStreamError)
+ end
+ end
+ end
+
+ describe '#each_blob' do
+ let(:adapter) { described_class.new(stream) }
+
+ context 'when file is not empty' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml'), 'rb') }
+
+ it 'iterates content' do
+ expect { |b| adapter.each_blob(&b) }
+ .to yield_with_args(fixture_file('junit/junit.xml'), 'raw')
+ end
+ end
+
+ context 'when file is empty' do
+ let(:stream) { Tempfile.new }
+
+ after do
+ stream.unlink
+ end
+
+ it 'does not iterate content' do
+ expect { |b| adapter.each_blob(&b) }
+ .not_to yield_control
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb b/spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb
index e327399d82d..a9a4af1f455 100644
--- a/spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb
+++ b/spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb
@@ -112,4 +112,34 @@ describe Gitlab::Ci::Build::Artifacts::Metadata do
end
end
end
+
+ context 'generated metadata' do
+ let(:tmpfile) { Tempfile.new('test-metadata') }
+ let(:generator) { CiArtifactMetadataGenerator.new(tmpfile) }
+ let(:entry_count) { 5 }
+
+ before do
+ tmpfile.binmode
+
+ (1..entry_count).each do |index|
+ generator.add_entry("public/test-#{index}.txt")
+ end
+
+ generator.write
+ end
+
+ after do
+ File.unlink(tmpfile.path)
+ end
+
+ describe '#find_entries!' do
+ it 'reads expected number of entries' do
+ stream = File.open(tmpfile.path)
+
+ metadata = described_class.new(stream, 'public', { recursive: true })
+
+ expect(metadata.find_entries!.count).to eq entry_count
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/build/policy/changes_spec.rb b/spec/lib/gitlab/ci/build/policy/changes_spec.rb
new file mode 100644
index 00000000000..523d00c1272
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/policy/changes_spec.rb
@@ -0,0 +1,119 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Build::Policy::Changes do
+ set(:project) { create(:project) }
+
+ describe '#satisfied_by?' do
+ describe 'paths matching matching' do
+ let(:pipeline) do
+ build(:ci_empty_pipeline, project: project,
+ ref: 'master',
+ source: :push,
+ sha: '1234abcd',
+ before_sha: '0123aabb')
+ end
+
+ let(:ci_build) do
+ build(:ci_build, pipeline: pipeline, project: project, ref: 'master')
+ end
+
+ let(:seed) { double('build seed', to_resource: ci_build) }
+
+ before do
+ allow(pipeline).to receive(:modified_paths) do
+ %w[some/modified/ruby/file.rb some/other_file.txt some/.dir/file]
+ end
+ end
+
+ it 'is satisfied by matching literal path' do
+ policy = described_class.new(%w[some/other_file.txt])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is satisfied by matching simple pattern' do
+ policy = described_class.new(%w[some/*.txt])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is satisfied by matching recusive pattern' do
+ policy = described_class.new(%w[some/**/*.rb])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is satisfied by matching a pattern with a dot' do
+ policy = described_class.new(%w[some/*/file])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is satisfied by matching a pattern with a glob' do
+ policy = described_class.new(%w[some/**/*.{rb,txt}])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is not satisfied when pattern does not match path' do
+ policy = described_class.new(%w[some/*.rb])
+
+ expect(policy).not_to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is not satisfied when pattern does not match' do
+ policy = described_class.new(%w[invalid/*.md])
+
+ expect(policy).not_to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is not satified when pattern with glob does not match' do
+ policy = described_class.new(%w[invalid/*.{md,rake}])
+
+ expect(policy).not_to be_satisfied_by(pipeline, seed)
+ end
+
+ context 'when pipelines does not run for a branch update' do
+ before do
+ pipeline.before_sha = Gitlab::Git::BLANK_SHA
+ end
+
+ it 'is always satisfied' do
+ policy = described_class.new(%w[invalid/*])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+ end
+ end
+
+ describe 'gitaly integration' do
+ set(:project) { create(:project, :repository) }
+
+ let(:pipeline) do
+ create(:ci_empty_pipeline, project: project,
+ ref: 'master',
+ source: :push,
+ sha: '498214d',
+ before_sha: '281d3a7')
+ end
+
+ let(:build) do
+ create(:ci_build, pipeline: pipeline, project: project, ref: 'master')
+ end
+
+ let(:seed) { double('build seed', to_resource: build) }
+
+ it 'is satisfied by changes introduced by a push' do
+ policy = described_class.new(['with space/*.md'])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
+ it 'is not satisfied by changes that are not in the push' do
+ policy = described_class.new(%w[files/js/commit.js])
+
+ expect(policy).not_to be_satisfied_by(pipeline, seed)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/build/policy/refs_spec.rb b/spec/lib/gitlab/ci/build/policy/refs_spec.rb
index 7211187e511..553fc0fb9bf 100644
--- a/spec/lib/gitlab/ci/build/policy/refs_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/refs_spec.rb
@@ -16,7 +16,7 @@ describe Gitlab::Ci::Build::Policy::Refs do
end
end
- context 'when maching tags' do
+ context 'when matching tags' do
context 'when pipeline runs for a tag' do
let(:pipeline) do
build_stubbed(:ci_pipeline, ref: 'feature', tag: true)
@@ -56,10 +56,10 @@ describe Gitlab::Ci::Build::Policy::Refs do
end
end
- context 'when maching a source' do
+ context 'when matching a source' do
let(:pipeline) { build_stubbed(:ci_pipeline, source: :push) }
- it 'is satisifed when provided source keyword matches' do
+ it 'is satisfied when provided source keyword matches' do
expect(described_class.new(%w[pushes]))
.to be_satisfied_by(pipeline)
end
diff --git a/spec/lib/gitlab/ci/build/policy/variables_spec.rb b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
index 2ce858836e3..c2c0742efc3 100644
--- a/spec/lib/gitlab/ci/build/policy/variables_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
@@ -24,7 +24,7 @@ describe Gitlab::Ci::Build::Policy::Variables do
expect(policy).to be_satisfied_by(pipeline, seed)
end
- it 'is not satisfied by an overriden empty variable' do
+ it 'is not satisfied by an overridden empty variable' do
policy = described_class.new(['$CI_PROJECT_NAME'])
expect(policy).not_to be_satisfied_by(pipeline, seed)
@@ -54,7 +54,7 @@ describe Gitlab::Ci::Build::Policy::Variables do
expect(policy).not_to be_satisfied_by(pipeline, seed)
end
- it 'allows to evaluate regular secret variables' do
+ it 'allows to evaluate regular CI variables' do
create(:ci_variable, project: project, key: 'SECRET', value: 'my secret')
policy = described_class.new(["$SECRET == 'my secret'"])
diff --git a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
index d48aac15f28..bd1f2c92844 100644
--- a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
@@ -8,7 +8,7 @@ describe Gitlab::Ci::Config::Entry::Artifacts do
let(:config) { { paths: %w[public/] } }
describe '#value' do
- it 'returns artifacs configuration' do
+ it 'returns artifacts configuration' do
expect(entry.value).to eq config
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/global_spec.rb b/spec/lib/gitlab/ci/config/entry/global_spec.rb
index 1860ed79bfd..7c18514934e 100644
--- a/spec/lib/gitlab/ci/config/entry/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/global_spec.rb
@@ -219,7 +219,7 @@ describe Gitlab::Ci::Config::Entry::Global do
##
# When nodes are specified but not defined, we assume that
- # configuration is valid, and we asume that entry is simply undefined,
+ # configuration is valid, and we assume that entry is simply undefined,
# despite the fact, that key is present. See issue #18775 for more
# details.
#
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb
index 6769f64f950..57d4577a90c 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -10,7 +10,7 @@ describe Gitlab::Ci::Config::Entry::Job do
let(:result) do
%i[before_script script stage type after_script cache
image services only except variables artifacts
- environment coverage]
+ environment coverage retry]
end
it { is_expected.to match_array result }
@@ -38,6 +38,14 @@ describe Gitlab::Ci::Config::Entry::Job do
expect(entry.errors).to include "job name can't be blank"
end
end
+
+ context 'when delayed job' do
+ context 'when start_in is specified' do
+ let(:config) { { script: 'echo', when: 'delayed', start_in: '1 day' } }
+
+ it { expect(entry).to be_valid }
+ end
+ end
end
context 'when entry value is not correct' do
@@ -81,49 +89,107 @@ describe Gitlab::Ci::Config::Entry::Job do
end
end
- context 'when retry value is not correct' do
+ context 'when extends key is not a string' do
+ let(:config) { { extends: 123 } }
+
+ it 'returns error about wrong value type' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include "job extends should be a string"
+ end
+ end
+
+ context 'when parallel value is not correct' do
context 'when it is not a numeric value' do
- let(:config) { { retry: true } }
+ let(:config) { { parallel: true } }
it 'returns error about invalid type' do
expect(entry).not_to be_valid
- expect(entry.errors).to include 'job retry is not a number'
+ expect(entry.errors).to include 'job parallel is not a number'
end
end
- context 'when it is lower than zero' do
- let(:config) { { retry: -1 } }
+ context 'when it is lower than two' do
+ let(:config) { { parallel: 1 } }
it 'returns error about value too low' do
expect(entry).not_to be_valid
expect(entry.errors)
- .to include 'job retry must be greater than or equal to 0'
+ .to include 'job parallel must be greater than or equal to 2'
+ end
+ end
+
+ context 'when it is bigger than 50' do
+ let(:config) { { parallel: 51 } }
+
+ it 'returns error about value too high' do
+ expect(entry).not_to be_valid
+ expect(entry.errors)
+ .to include 'job parallel must be less than or equal to 50'
end
end
context 'when it is not an integer' do
- let(:config) { { retry: 1.5 } }
+ let(:config) { { parallel: 1.5 } }
it 'returns error about wrong value' do
expect(entry).not_to be_valid
- expect(entry.errors).to include 'job retry must be an integer'
+ expect(entry.errors).to include 'job parallel must be an integer'
end
end
+ end
- context 'when the value is too high' do
- let(:config) { { retry: 10 } }
+ context 'when delayed job' do
+ context 'when start_in is specified' do
+ let(:config) { { script: 'echo', when: 'delayed', start_in: '1 day' } }
- it 'returns error about value too high' do
+ it 'returns error about invalid type' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'when start_in is empty' do
+ let(:config) { { when: 'delayed', start_in: nil } }
+
+ it 'returns error about invalid type' do
expect(entry).not_to be_valid
- expect(entry.errors).to include 'job retry must be less than or equal to 2'
+ expect(entry.errors).to include 'job start in should be a duration'
+ end
+ end
+
+ context 'when start_in is not formatted as a duration' do
+ let(:config) { { when: 'delayed', start_in: 'test' } }
+
+ it 'returns error about invalid type' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'job start in should be a duration'
+ end
+ end
+
+ context 'when start_in is longer than one day' do
+ let(:config) { { when: 'delayed', start_in: '2 days' } }
+
+ it 'returns error about exceeding the limit' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'job start in should not exceed the limit'
end
end
end
+
+ context 'when start_in specified without delayed specification' do
+ let(:config) { { start_in: '1 day' } }
+
+ it 'returns error about invalid type' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'job start in must be blank'
+ end
+ end
end
end
describe '#relevant?' do
it 'is a relevant entry' do
+ entry = described_class.new({ script: 'rspec' }, name: :rspec)
+
expect(entry).to be_relevant
end
end
@@ -226,6 +292,24 @@ describe Gitlab::Ci::Config::Entry::Job do
end
end
+ describe '#delayed?' do
+ context 'when job is a delayed' do
+ let(:config) { { script: 'deploy', when: 'delayed' } }
+
+ it 'is a delayed' do
+ expect(entry).to be_delayed
+ end
+ end
+
+ context 'when job is not a delayed' do
+ let(:config) { { script: 'deploy' } }
+
+ it 'is not a delayed' do
+ expect(entry).not_to be_delayed
+ end
+ end
+ end
+
describe '#ignored?' do
context 'when job is a manual action' do
context 'when it is not specified if job is allowed to fail' do
diff --git a/spec/lib/gitlab/ci/config/entry/policy_spec.rb b/spec/lib/gitlab/ci/config/entry/policy_spec.rb
index 83d39b82068..83001b7fdd8 100644
--- a/spec/lib/gitlab/ci/config/entry/policy_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/policy_spec.rb
@@ -1,4 +1,5 @@
-require 'spec_helper'
+require 'fast_spec_helper'
+require_dependency 'active_model'
describe Gitlab::Ci::Config::Entry::Policy do
let(:entry) { described_class.new(config) }
@@ -57,7 +58,7 @@ describe Gitlab::Ci::Config::Entry::Policy do
end
context 'when using complex policy' do
- context 'when specifiying refs policy' do
+ context 'when specifying refs policy' do
let(:config) { { refs: ['master'] } }
it 'is a correct configuraton' do
@@ -124,6 +125,23 @@ describe Gitlab::Ci::Config::Entry::Policy do
end
end
+ context 'when specifying a valid changes policy' do
+ let(:config) { { changes: %w[some/* paths/**/*.rb] } }
+
+ it 'is a correct configuraton' do
+ expect(entry).to be_valid
+ expect(entry.value).to eq(config)
+ end
+ end
+
+ context 'when changes policy is invalid' do
+ let(:config) { { changes: [1, 2] } }
+
+ it 'returns errors' do
+ expect(entry.errors).to include /changes should be an array of strings/
+ end
+ end
+
context 'when specifying unknown policy' do
let(:config) { { refs: ['master'], invalid: :something } }
diff --git a/spec/lib/gitlab/ci/config/entry/reports_spec.rb b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
index b3a3a6bee1d..38943138cbf 100644
--- a/spec/lib/gitlab/ci/config/entry/reports_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
@@ -3,27 +3,56 @@ require 'spec_helper'
describe Gitlab::Ci::Config::Entry::Reports do
let(:entry) { described_class.new(config) }
+ describe 'validates ALLOWED_KEYS' do
+ let(:artifact_file_types) { Ci::JobArtifact.file_types }
+
+ described_class::ALLOWED_KEYS.each do |keyword, _|
+ it "expects #{keyword} to be an artifact file_type" do
+ expect(artifact_file_types).to include(keyword)
+ end
+ end
+ end
+
describe 'validation' do
context 'when entry config value is correct' do
- let(:config) { { junit: %w[junit.xml] } }
+ using RSpec::Parameterized::TableSyntax
- describe '#value' do
- it 'returns artifacs configuration' do
- expect(entry.value).to eq config
+ shared_examples 'a valid entry' do |keyword, file|
+ describe '#value' do
+ it 'returns artifacts configuration' do
+ expect(entry.value).to eq({ "#{keyword}": [file] } )
+ end
end
- end
- describe '#valid?' do
- it 'is valid' do
- expect(entry).to be_valid
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
end
end
- context 'when value is not array' do
- let(:config) { { junit: 'junit.xml' } }
+ where(:keyword, :file) do
+ :junit | 'junit.xml'
+ :codequality | 'gl-code-quality-report.json'
+ :sast | 'gl-sast-report.json'
+ :dependency_scanning | 'gl-dependency-scanning-report.json'
+ :container_scanning | 'gl-container-scanning-report.json'
+ :dast | 'gl-dast-report.json'
+ :license_management | 'gl-license-management-report.json'
+ :performance | 'performance.json'
+ end
+
+ with_them do
+ context 'when value is an array' do
+ let(:config) { { "#{keyword}": [file] } }
- it 'converts to array' do
- expect(entry.value).to eq({ junit: ['junit.xml'] } )
+ it_behaves_like 'a valid entry', params[:keyword], params[:file]
+ end
+
+ context 'when value is not array' do
+ let(:config) { { "#{keyword}": file } }
+
+ it_behaves_like 'a valid entry', params[:keyword], params[:file]
end
end
end
@@ -31,11 +60,13 @@ describe Gitlab::Ci::Config::Entry::Reports do
context 'when entry value is not correct' do
describe '#errors' do
context 'when value of attribute is invalid' do
- let(:config) { { junit: 10 } }
+ where(key: described_class::ALLOWED_KEYS) do
+ let(:config) { { "#{key}": 10 } }
- it 'reports error' do
- expect(entry.errors)
- .to include 'reports junit should be an array of strings or a string'
+ it 'reports error' do
+ expect(entry.errors)
+ .to include "reports #{key} should be an array of strings or a string"
+ end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/retry_spec.rb b/spec/lib/gitlab/ci/config/entry/retry_spec.rb
new file mode 100644
index 00000000000..164a9ed4c3d
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/entry/retry_spec.rb
@@ -0,0 +1,236 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::Entry::Retry do
+ let(:entry) { described_class.new(config) }
+
+ shared_context 'when retry value is a numeric', :numeric do
+ let(:config) { max }
+ let(:max) {}
+ end
+
+ shared_context 'when retry value is a hash', :hash do
+ let(:config) { { max: max, when: public_send(:when) }.compact }
+ let(:when) {}
+ let(:max) {}
+ end
+
+ describe '#value' do
+ subject(:value) { entry.value }
+
+ context 'when retry value is a numeric', :numeric do
+ let(:max) { 2 }
+
+ it 'is returned as a hash with max key' do
+ expect(value).to eq(max: 2)
+ end
+ end
+
+ context 'when retry value is a hash', :hash do
+ context 'and `when` is a string' do
+ let(:when) { 'unknown_failure' }
+
+ it 'returns when wrapped in an array' do
+ expect(value).to eq(when: ['unknown_failure'])
+ end
+ end
+
+ context 'and `when` is an array' do
+ let(:when) { %w[unknown_failure runner_system_failure] }
+
+ it 'returns when as it was passed' do
+ expect(value).to eq(when: %w[unknown_failure runner_system_failure])
+ end
+ end
+ end
+ end
+
+ describe 'validation' do
+ context 'when retry value is correct' do
+ context 'when it is a numeric', :numeric do
+ let(:max) { 2 }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'when it is a hash', :hash do
+ context 'with max' do
+ let(:max) { 2 }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'with string when' do
+ let(:when) { 'unknown_failure' }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'with string when always' do
+ let(:when) { 'always' }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'with array when' do
+ let(:when) { %w[unknown_failure runner_system_failure] }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ # Those values are documented at `doc/ci/yaml/README.md`. If any of
+ # those values gets invalid, documentation must be updated. To make
+ # sure this is catched, check explicitly that all of the documented
+ # values are valid. If they are not it means the documentation and this
+ # array must be updated.
+ RETRY_WHEN_IN_DOCUMENTATION = %w[
+ always
+ unknown_failure
+ script_failure
+ api_failure
+ stuck_or_timeout_failure
+ runner_system_failure
+ missing_dependency_failure
+ runner_unsupported
+ ].freeze
+
+ RETRY_WHEN_IN_DOCUMENTATION.each do |reason|
+ context "with when from documentation `#{reason}`" do
+ let(:when) { reason }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+
+ ::Ci::Build.failure_reasons.each_key do |reason|
+ context "with when from CommitStatus.failure_reasons `#{reason}`" do
+ let(:when) { reason }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+ end
+ end
+
+ context 'when retry value is not correct' do
+ context 'when it is not a numeric nor an array' do
+ let(:config) { true }
+
+ it 'returns error about invalid type' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry config has to be either an integer or a hash'
+ end
+ end
+
+ context 'when it is a numeric', :numeric do
+ context 'when it is lower than zero' do
+ let(:max) { -1 }
+
+ it 'returns error about value too low' do
+ expect(entry).not_to be_valid
+ expect(entry.errors)
+ .to include 'retry config must be greater than or equal to 0'
+ end
+ end
+
+ context 'when it is not an integer' do
+ let(:max) { 1.5 }
+
+ it 'returns error about wrong value' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry config has to be either an integer or a hash'
+ end
+ end
+
+ context 'when the value is too high' do
+ let(:max) { 10 }
+
+ it 'returns error about value too high' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry config must be less than or equal to 2'
+ end
+ end
+ end
+
+ context 'when it is a hash', :hash do
+ context 'with unknown keys' do
+ let(:config) { { max: 2, unknown_key: :something, one_more: :key } }
+
+ it 'returns error about the unknown key' do
+ expect(entry).not_to be_valid
+ expect(entry.errors)
+ .to include 'retry config contains unknown keys: unknown_key, one_more'
+ end
+ end
+
+ context 'with max lower than zero' do
+ let(:max) { -1 }
+
+ it 'returns error about value too low' do
+ expect(entry).not_to be_valid
+ expect(entry.errors)
+ .to include 'retry max must be greater than or equal to 0'
+ end
+ end
+
+ context 'with max not an integer' do
+ let(:max) { 1.5 }
+
+ it 'returns error about wrong value' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry max must be an integer'
+ end
+ end
+
+ context 'iwth max too high' do
+ let(:max) { 10 }
+
+ it 'returns error about value too high' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry max must be less than or equal to 2'
+ end
+ end
+
+ context 'with when in wrong format' do
+ let(:when) { true }
+
+ it 'returns error about the wrong format' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry when should be an array of strings or a string'
+ end
+ end
+
+ context 'with an unknown when string' do
+ let(:when) { 'unknown_reason' }
+
+ it 'returns error about the wrong format' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry when is not included in the list'
+ end
+ end
+
+ context 'with an unknown failure reason in a when array' do
+ let(:when) { %w[unknown_reason runner_system_failure] }
+
+ it 'returns error about the wrong format' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include 'retry when contains unknown values: unknown_reason'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/extendable/entry_spec.rb b/spec/lib/gitlab/ci/config/extendable/entry_spec.rb
new file mode 100644
index 00000000000..0a148375d11
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/extendable/entry_spec.rb
@@ -0,0 +1,227 @@
+require 'fast_spec_helper'
+
+describe Gitlab::Ci::Config::Extendable::Entry do
+ describe '.new' do
+ context 'when entry key is not included in the context hash' do
+ it 'raises error' do
+ expect { described_class.new(:test, something: 'something') }
+ .to raise_error StandardError, 'Invalid entry key!'
+ end
+ end
+ end
+
+ describe '#value' do
+ it 'reads a hash value from the context' do
+ entry = described_class.new(:test, test: 'something')
+
+ expect(entry.value).to eq 'something'
+ end
+ end
+
+ describe '#extensible?' do
+ context 'when entry has inheritance defined' do
+ it 'is extensible' do
+ entry = described_class.new(:test, test: { extends: 'something' })
+
+ expect(entry).to be_extensible
+ end
+ end
+
+ context 'when entry does not have inheritance specified' do
+ it 'is not extensible' do
+ entry = described_class.new(:test, test: { script: 'something' })
+
+ expect(entry).not_to be_extensible
+ end
+ end
+
+ context 'when entry value is not a hash' do
+ it 'is not extensible' do
+ entry = described_class.new(:test, test: 'something')
+
+ expect(entry).not_to be_extensible
+ end
+ end
+ end
+
+ describe '#extends_key' do
+ context 'when entry is extensible' do
+ it 'returns symbolized extends key value' do
+ entry = described_class.new(:test, test: { extends: 'something' })
+
+ expect(entry.extends_key).to eq :something
+ end
+ end
+
+ context 'when entry is not extensible' do
+ it 'returns nil' do
+ entry = described_class.new(:test, test: 'something')
+
+ expect(entry.extends_key).to be_nil
+ end
+ end
+ end
+
+ describe '#ancestors' do
+ let(:parent) do
+ described_class.new(:test, test: { extends: 'something' })
+ end
+
+ let(:child) do
+ described_class.new(:job, { job: { script: 'something' } }, parent)
+ end
+
+ it 'returns ancestors keys' do
+ expect(child.ancestors).to eq [:test]
+ end
+ end
+
+ describe '#base_hash!' do
+ subject { described_class.new(:test, hash) }
+
+ context 'when base hash is not extensible' do
+ let(:hash) do
+ {
+ template: { script: 'rspec' },
+ test: { extends: 'template' }
+ }
+ end
+
+ it 'returns unchanged base hash' do
+ expect(subject.base_hash!).to eq(script: 'rspec')
+ end
+ end
+
+ context 'when base hash is extensible too' do
+ let(:hash) do
+ {
+ first: { script: 'rspec' },
+ second: { extends: 'first' },
+ test: { extends: 'second' }
+ }
+ end
+
+ it 'extends the base hash first' do
+ expect(subject.base_hash!).to eq(extends: 'first', script: 'rspec')
+ end
+
+ it 'mutates original context' do
+ subject.base_hash!
+
+ expect(hash.fetch(:second)).to eq(extends: 'first', script: 'rspec')
+ end
+ end
+ end
+
+ describe '#extend!' do
+ subject { described_class.new(:test, hash) }
+
+ context 'when extending a non-hash value' do
+ let(:hash) do
+ {
+ first: 'my value',
+ test: { extends: 'first' }
+ }
+ end
+
+ it 'raises an error' do
+ expect { subject.extend! }
+ .to raise_error(described_class::InvalidExtensionError,
+ /invalid base hash/)
+ end
+ end
+
+ context 'when extending unknown key' do
+ let(:hash) do
+ { test: { extends: 'something' } }
+ end
+
+ it 'raises an error' do
+ expect { subject.extend! }
+ .to raise_error(described_class::InvalidExtensionError,
+ /unknown key/)
+ end
+ end
+
+ context 'when extending a hash correctly' do
+ let(:hash) do
+ {
+ first: { script: 'my value' },
+ second: { extends: 'first' },
+ test: { extends: 'second' }
+ }
+ end
+
+ let(:result) do
+ {
+ first: { script: 'my value' },
+ second: { extends: 'first', script: 'my value' },
+ test: { extends: 'second', script: 'my value' }
+ }
+ end
+
+ it 'returns extended part of the hash' do
+ expect(subject.extend!).to eq result[:test]
+ end
+
+ it 'mutates original context' do
+ subject.extend!
+
+ expect(hash).to eq result
+ end
+ end
+
+ context 'when hash is not extensible' do
+ let(:hash) do
+ {
+ first: { script: 'my value' },
+ second: { extends: 'first' },
+ test: { value: 'something' }
+ }
+ end
+
+ it 'returns original key value' do
+ expect(subject.extend!).to eq(value: 'something')
+ end
+
+ it 'does not mutate orignal context' do
+ original = hash.deep_dup
+
+ subject.extend!
+
+ expect(hash).to eq original
+ end
+ end
+
+ context 'when circular depenency gets detected' do
+ let(:hash) do
+ { test: { extends: 'test' } }
+ end
+
+ it 'raises an error' do
+ expect { subject.extend! }
+ .to raise_error(described_class::CircularDependencyError,
+ /circular dependency detected/)
+ end
+ end
+
+ context 'when nesting level is too deep' do
+ before do
+ stub_const("#{described_class}::MAX_NESTING_LEVELS", 0)
+ end
+
+ let(:hash) do
+ {
+ first: { script: 'my value' },
+ second: { extends: 'first' },
+ test: { extends: 'second' }
+ }
+ end
+
+ it 'raises an error' do
+ expect { subject.extend! }
+ .to raise_error(described_class::NestingTooDeepError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/extendable_spec.rb b/spec/lib/gitlab/ci/config/extendable_spec.rb
new file mode 100644
index 00000000000..90213f6603d
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/extendable_spec.rb
@@ -0,0 +1,228 @@
+require 'fast_spec_helper'
+
+describe Gitlab::Ci::Config::Extendable do
+ subject { described_class.new(hash) }
+
+ describe '#each' do
+ context 'when there is extendable entry in the hash' do
+ let(:test) do
+ { extends: 'something', only: %w[master] }
+ end
+
+ let(:hash) do
+ { something: { script: 'ls' }, test: test }
+ end
+
+ it 'yields control' do
+ expect { |b| subject.each(&b) }.to yield_control
+ end
+ end
+ end
+
+ describe '#to_hash' do
+ context 'when hash does not contain extensions' do
+ let(:hash) do
+ {
+ test: { script: 'test' },
+ production: {
+ script: 'deploy',
+ only: { variables: %w[$SOMETHING] }
+ }
+ }
+ end
+
+ it 'does not modify the hash' do
+ expect(subject.to_hash).to eq hash
+ end
+ end
+
+ context 'when hash has a single simple extension' do
+ let(:hash) do
+ {
+ something: {
+ script: 'deploy',
+ only: { variables: %w[$SOMETHING] }
+ },
+
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: { refs: %w[master] }
+ }
+ }
+ end
+
+ it 'extends a hash with a deep reverse merge' do
+ expect(subject.to_hash).to eq(
+ something: {
+ script: 'deploy',
+ only: { variables: %w[$SOMETHING] }
+ },
+
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: {
+ refs: %w[master],
+ variables: %w[$SOMETHING]
+ }
+ }
+ )
+ end
+ end
+
+ context 'when a hash uses recursive extensions' do
+ let(:hash) do
+ {
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: { refs: %w[master] }
+ },
+
+ build: {
+ extends: 'something',
+ stage: 'build'
+ },
+
+ deploy: {
+ stage: 'deploy',
+ extends: '.first'
+ },
+
+ something: {
+ extends: '.first',
+ script: 'exec',
+ only: { variables: %w[$SOMETHING] }
+ },
+
+ '.first': {
+ script: 'run',
+ only: { kubernetes: 'active' }
+ }
+ }
+ end
+
+ it 'extends a hash with a deep reverse merge' do
+ expect(subject.to_hash).to eq(
+ '.first': {
+ script: 'run',
+ only: { kubernetes: 'active' }
+ },
+
+ something: {
+ extends: '.first',
+ script: 'exec',
+ only: {
+ kubernetes: 'active',
+ variables: %w[$SOMETHING]
+ }
+ },
+
+ deploy: {
+ script: 'run',
+ stage: 'deploy',
+ only: { kubernetes: 'active' },
+ extends: '.first'
+ },
+
+ build: {
+ extends: 'something',
+ script: 'exec',
+ stage: 'build',
+ only: {
+ kubernetes: 'active',
+ variables: %w[$SOMETHING]
+ }
+ },
+
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: {
+ refs: %w[master],
+ variables: %w[$SOMETHING],
+ kubernetes: 'active'
+ }
+ }
+ )
+ end
+ end
+
+ context 'when nested circular dependecy has been detected' do
+ let(:hash) do
+ {
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: { refs: %w[master] }
+ },
+
+ something: {
+ extends: '.first',
+ script: 'deploy',
+ only: { variables: %w[$SOMETHING] }
+ },
+
+ '.first': {
+ extends: 'something',
+ script: 'run',
+ only: { kubernetes: 'active' }
+ }
+ }
+ end
+
+ it 'raises an error about circular dependency' do
+ expect { subject.to_hash }
+ .to raise_error(described_class::Entry::CircularDependencyError)
+ end
+ end
+
+ context 'when circular dependecy to self has been detected' do
+ let(:hash) do
+ {
+ test: {
+ extends: 'test',
+ script: 'ls',
+ only: { refs: %w[master] }
+ }
+ }
+ end
+
+ it 'raises an error about circular dependency' do
+ expect { subject.to_hash }
+ .to raise_error(described_class::Entry::CircularDependencyError)
+ end
+ end
+
+ context 'when invalid extends value is specified' do
+ let(:hash) do
+ { something: { extends: 1, script: 'ls' } }
+ end
+
+ it 'raises an error about invalid extension' do
+ expect { subject.to_hash }
+ .to raise_error(described_class::Entry::InvalidExtensionError)
+ end
+ end
+
+ context 'when extensible entry has non-hash inheritance defined' do
+ let(:hash) do
+ {
+ test: {
+ extends: 'something',
+ script: 'ls',
+ only: { refs: %w[master] }
+ },
+
+ something: 'some text'
+ }
+ end
+
+ it 'raises an error about invalid base' do
+ expect { subject.to_hash }
+ .to raise_error(described_class::Entry::InvalidExtensionError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/external/file/base_spec.rb b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
new file mode 100644
index 00000000000..2e92d5204d6
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+describe Gitlab::Ci::Config::External::File::Base do
+ subject { described_class.new(location) }
+
+ before do
+ allow_any_instance_of(described_class)
+ .to receive(:content).and_return('key: value')
+ end
+
+ describe '#valid?' do
+ context 'when location is not a YAML file' do
+ let(:location) { 'some/file.txt' }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when location has not a valid naming scheme' do
+ let(:location) { 'some/file/.yml' }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when location is a valid .yml extension' do
+ let(:location) { 'some/file/config.yml' }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when location is a valid .yaml extension' do
+ let(:location) { 'some/file/config.yaml' }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when there are YAML syntax errors' do
+ let(:location) { 'some/file/config.yml' }
+
+ before do
+ allow_any_instance_of(described_class)
+ .to receive(:content).and_return('invalid_syntax')
+ end
+
+ it 'is not a valid file' do
+ expect(subject).not_to be_valid
+ expect(subject.error_message).to match /does not have valid YAML syntax/
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/external/file/local_spec.rb b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
new file mode 100644
index 00000000000..2708d8d5b6b
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::External::File::Local do
+ let(:project) { create(:project, :repository) }
+ let(:local_file) { described_class.new(location, { project: project, sha: '12345' }) }
+
+ describe '#valid?' do
+ context 'when is a valid local path' do
+ let(:location) { '/lib/gitlab/ci/templates/existent-file.yml' }
+
+ before do
+ allow_any_instance_of(described_class).to receive(:fetch_local_content).and_return("image: 'ruby2:2'")
+ end
+
+ it 'should return true' do
+ expect(local_file.valid?).to be_truthy
+ end
+ end
+
+ context 'when is not a valid local path' do
+ let(:location) { '/lib/gitlab/ci/templates/non-existent-file.yml' }
+
+ it 'should return false' do
+ expect(local_file.valid?).to be_falsy
+ end
+ end
+
+ context 'when is not a yaml file' do
+ let(:location) { '/config/application.rb' }
+
+ it 'should return false' do
+ expect(local_file.valid?).to be_falsy
+ end
+ end
+ end
+
+ describe '#content' do
+ context 'with a a valid file' do
+ let(:local_file_content) do
+ <<~HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+ HEREDOC
+ end
+ let(:location) { '/lib/gitlab/ci/templates/existent-file.yml' }
+
+ before do
+ allow_any_instance_of(described_class).to receive(:fetch_local_content).and_return(local_file_content)
+ end
+
+ it 'should return the content of the file' do
+ expect(local_file.content).to eq(local_file_content)
+ end
+ end
+
+ context 'with an invalid file' do
+ let(:location) { '/lib/gitlab/ci/templates/non-existent-file.yml' }
+
+ it 'should be nil' do
+ expect(local_file.content).to be_nil
+ end
+ end
+ end
+
+ describe '#error_message' do
+ let(:location) { '/lib/gitlab/ci/templates/non-existent-file.yml' }
+
+ it 'should return an error message' do
+ expect(local_file.error_message).to eq("Local file `#{location}` does not exist!")
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
new file mode 100644
index 00000000000..7c1a1c38736
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
@@ -0,0 +1,157 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::External::File::Remote do
+ let(:remote_file) { described_class.new(location) }
+ let(:location) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:remote_file_content) do
+ <<~HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+ HEREDOC
+ end
+
+ describe "#valid?" do
+ context 'when is a valid remote url' do
+ before do
+ WebMock.stub_request(:get, location).to_return(body: remote_file_content)
+ end
+
+ it 'should return true' do
+ expect(remote_file.valid?).to be_truthy
+ end
+ end
+
+ context 'with an irregular url' do
+ let(:location) { 'not-valid://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it 'should return false' do
+ expect(remote_file.valid?).to be_falsy
+ end
+ end
+
+ context 'with a timeout' do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).and_raise(Timeout::Error)
+ end
+
+ it 'should be falsy' do
+ expect(remote_file.valid?).to be_falsy
+ end
+ end
+
+ context 'when is not a yaml file' do
+ let(:location) { 'https://asdasdasdaj48ggerexample.com' }
+
+ it 'should be falsy' do
+ expect(remote_file.valid?).to be_falsy
+ end
+ end
+
+ context 'with an internal url' do
+ let(:location) { 'http://localhost:8080' }
+
+ it 'should be falsy' do
+ expect(remote_file.valid?).to be_falsy
+ end
+ end
+ end
+
+ describe "#content" do
+ context 'with a valid remote file' do
+ before do
+ WebMock.stub_request(:get, location).to_return(body: remote_file_content)
+ end
+
+ it 'should return the content of the file' do
+ expect(remote_file.content).to eql(remote_file_content)
+ end
+ end
+
+ context 'with a timeout' do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).and_raise(Timeout::Error)
+ end
+
+ it 'should be falsy' do
+ expect(remote_file.content).to be_falsy
+ end
+ end
+
+ context 'with an invalid remote url' do
+ let(:location) { 'https://asdasdasdaj48ggerexample.com' }
+
+ before do
+ WebMock.stub_request(:get, location).to_raise(SocketError.new('Some HTTP error'))
+ end
+
+ it 'should be nil' do
+ expect(remote_file.content).to be_nil
+ end
+ end
+
+ context 'with an internal url' do
+ let(:location) { 'http://localhost:8080' }
+
+ it 'should be nil' do
+ expect(remote_file.content).to be_nil
+ end
+ end
+ end
+
+ describe "#error_message" do
+ subject { remote_file.error_message }
+
+ context 'when remote file location is not valid' do
+ let(:location) { 'not-valid://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it 'returns an error message describing invalid address' do
+ expect(subject).to match /does not have a valid address!/
+ end
+ end
+
+ context 'when timeout error has been raised' do
+ before do
+ WebMock.stub_request(:get, location).to_timeout
+ end
+
+ it 'should returns error message about a timeout' do
+ expect(subject).to match /could not be fetched because of a timeout error!/
+ end
+ end
+
+ context 'when HTTP error has been raised' do
+ before do
+ WebMock.stub_request(:get, location).to_raise(Gitlab::HTTP::Error)
+ end
+
+ it 'should returns error message about a HTTP error' do
+ expect(subject).to match /could not be fetched because of HTTP error!/
+ end
+ end
+
+ context 'when response has 404 status' do
+ before do
+ WebMock.stub_request(:get, location).to_return(body: remote_file_content, status: 404)
+ end
+
+ it 'should returns error message about a timeout' do
+ expect(subject).to match /could not be fetched because of HTTP code `404` error!/
+ end
+ end
+
+ context 'when the URL is blocked' do
+ let(:location) { 'http://127.0.0.1/some/path/to/config.yaml' }
+
+ it 'should include details about blocked URL' do
+ expect(subject).to eq "Remote file could not be fetched because URL '#{location}' " \
+ 'is blocked: Requests to localhost are not allowed!'
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
new file mode 100644
index 00000000000..5b236fe99f1
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::External::Mapper do
+ let(:project) { create(:project, :repository) }
+ let(:file_content) do
+ <<~HEREDOC
+ image: 'ruby:2.2'
+ HEREDOC
+ end
+
+ describe '#process' do
+ subject { described_class.new(values, project, '123456').process }
+
+ context "when 'include' keyword is defined as string" do
+ context 'when the string is a local file' do
+ let(:values) do
+ {
+ include: '/lib/gitlab/ci/templates/non-existent-file.yml',
+ image: 'ruby:2.2'
+ }
+ end
+
+ it 'returns an array' do
+ expect(subject).to be_an(Array)
+ end
+
+ it 'returns File instances' do
+ expect(subject.first)
+ .to be_an_instance_of(Gitlab::Ci::Config::External::File::Local)
+ end
+ end
+
+ context 'when the string is a remote file' do
+ let(:remote_url) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:values) do
+ {
+ include: remote_url,
+ image: 'ruby:2.2'
+ }
+ end
+
+ before do
+ WebMock.stub_request(:get, remote_url).to_return(body: file_content)
+ end
+
+ it 'returns an array' do
+ expect(subject).to be_an(Array)
+ end
+
+ it 'returns File instances' do
+ expect(subject.first)
+ .to be_an_instance_of(Gitlab::Ci::Config::External::File::Remote)
+ end
+ end
+ end
+
+ context "when 'include' is defined as an array" do
+ let(:remote_url) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:values) do
+ {
+ include:
+ [
+ remote_url,
+ '/lib/gitlab/ci/templates/template.yml'
+ ],
+ image: 'ruby:2.2'
+ }
+ end
+
+ before do
+ WebMock.stub_request(:get, remote_url).to_return(body: file_content)
+ end
+
+ it 'returns an array' do
+ expect(subject).to be_an(Array)
+ end
+
+ it 'returns Files instances' do
+ expect(subject).to all(respond_to(:valid?))
+ expect(subject).to all(respond_to(:content))
+ end
+ end
+
+ context "when 'include' is not defined" do
+ let(:values) do
+ {
+ image: 'ruby:2.2'
+ }
+ end
+
+ it 'returns an empty array' do
+ expect(subject).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
new file mode 100644
index 00000000000..1a05f716247
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -0,0 +1,190 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::External::Processor do
+ let(:project) { create(:project, :repository) }
+ let(:processor) { described_class.new(values, project, '12345') }
+
+ describe "#perform" do
+ context 'when no external files defined' do
+ let(:values) { { image: 'ruby:2.2' } }
+
+ it 'should return the same values' do
+ expect(processor.perform).to eq(values)
+ end
+ end
+
+ context 'when an invalid local file is defined' do
+ let(:values) { { include: '/lib/gitlab/ci/templates/non-existent-file.yml', image: 'ruby:2.2' } }
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(
+ described_class::IncludeError,
+ "Local file `/lib/gitlab/ci/templates/non-existent-file.yml` does not exist!"
+ )
+ end
+ end
+
+ context 'when an invalid remote file is defined' do
+ let(:remote_file) { 'http://doesntexist.com/.gitlab-ci-1.yml' }
+ let(:values) { { include: remote_file, image: 'ruby:2.2' } }
+
+ before do
+ WebMock.stub_request(:get, remote_file).to_raise(SocketError.new('Some HTTP error'))
+ end
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(
+ described_class::IncludeError,
+ "Remote file `#{remote_file}` could not be fetched because of a socket error!"
+ )
+ end
+ end
+
+ context 'with a valid remote external file is defined' do
+ let(:remote_file) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:values) { { include: remote_file, image: 'ruby:2.2' } }
+ let(:external_file_content) do
+ <<-HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+
+ rspec:
+ script:
+ - bundle exec rspec
+
+ rubocop:
+ script:
+ - bundle exec rubocop
+ HEREDOC
+ end
+
+ before do
+ WebMock.stub_request(:get, remote_file).to_return(body: external_file_content)
+ end
+
+ it 'should append the file to the values' do
+ output = processor.perform
+ expect(output.keys).to match_array([:image, :before_script, :rspec, :rubocop])
+ end
+
+ it "should remove the 'include' keyword" do
+ expect(processor.perform[:include]).to be_nil
+ end
+ end
+
+ context 'with a valid local external file is defined' do
+ let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'ruby:2.2' } }
+ let(:local_file_content) do
+ <<-HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+ HEREDOC
+ end
+
+ before do
+ allow_any_instance_of(Gitlab::Ci::Config::External::File::Local)
+ .to receive(:fetch_local_content).and_return(local_file_content)
+ end
+
+ it 'should append the file to the values' do
+ output = processor.perform
+ expect(output.keys).to match_array([:image, :before_script])
+ end
+
+ it "should remove the 'include' keyword" do
+ expect(processor.perform[:include]).to be_nil
+ end
+ end
+
+ context 'with multiple external files are defined' do
+ let(:remote_file) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:external_files) do
+ [
+ '/spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml',
+ remote_file
+ ]
+ end
+ let(:values) do
+ {
+ include: external_files,
+ image: 'ruby:2.2'
+ }
+ end
+
+ let(:remote_file_content) do
+ <<-HEREDOC
+ stages:
+ - build
+ - review
+ - cleanup
+ HEREDOC
+ end
+
+ before do
+ local_file_content = File.read(Rails.root.join('spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml'))
+
+ allow_any_instance_of(Gitlab::Ci::Config::External::File::Local)
+ .to receive(:fetch_local_content).and_return(local_file_content)
+
+ WebMock.stub_request(:get, remote_file).to_return(body: remote_file_content)
+ end
+
+ it 'should append the files to the values' do
+ expect(processor.perform.keys).to match_array([:image, :stages, :before_script, :rspec])
+ end
+
+ it "should remove the 'include' keyword" do
+ expect(processor.perform[:include]).to be_nil
+ end
+ end
+
+ context 'when external files are defined but not valid' do
+ let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'ruby:2.2' } }
+
+ let(:local_file_content) { 'invalid content file ////' }
+
+ before do
+ allow_any_instance_of(Gitlab::Ci::Config::External::File::Local)
+ .to receive(:fetch_local_content).and_return(local_file_content)
+ end
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(
+ described_class::IncludeError,
+ "Included file `/lib/gitlab/ci/templates/template.yml` does not have valid YAML syntax!"
+ )
+ end
+ end
+
+ context "when both external files and values defined the same key" do
+ let(:remote_file) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:values) do
+ {
+ include: remote_file,
+ image: 'ruby:2.2'
+ }
+ end
+
+ let(:remote_file_content) do
+ <<~HEREDOC
+ image: php:5-fpm-alpine
+ HEREDOC
+ end
+
+ it 'should take precedence' do
+ WebMock.stub_request(:get, remote_file).to_return(body: remote_file_content)
+ expect(processor.perform[:image]).to eq('ruby:2.2')
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/normalizer_spec.rb b/spec/lib/gitlab/ci/config/normalizer_spec.rb
new file mode 100644
index 00000000000..97926695b6e
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/normalizer_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+describe Gitlab::Ci::Config::Normalizer do
+ let(:job_name) { :rspec }
+ let(:job_config) { { script: 'rspec', parallel: 5, name: 'rspec' } }
+ let(:config) { { job_name => job_config } }
+
+ describe '.normalize_jobs' do
+ subject { described_class.new(config).normalize_jobs }
+
+ it 'does not have original job' do
+ is_expected.not_to include(job_name)
+ end
+
+ it 'has parallelized jobs' do
+ job_names = [:"rspec 1/5", :"rspec 2/5", :"rspec 3/5", :"rspec 4/5", :"rspec 5/5"]
+
+ is_expected.to include(*job_names)
+ end
+
+ it 'sets job instance in options' do
+ expect(subject.values).to all(include(:instance))
+ end
+
+ it 'parallelizes jobs with original config' do
+ original_config = config[job_name].except(:name)
+ configs = subject.values.map { |config| config.except(:name, :instance) }
+
+ expect(configs).to all(eq(original_config))
+ end
+
+ context 'when the job is not parallelized' do
+ let(:job_config) { { script: 'rspec', name: 'rspec' } }
+
+ it 'returns the same hash' do
+ is_expected.to eq(config)
+ end
+ end
+
+ context 'when there is a job with a slash in it' do
+ let(:job_name) { :"rspec 35/2" }
+
+ it 'properly parallelizes job names' do
+ job_names = [:"rspec 35/2 1/5", :"rspec 35/2 2/5", :"rspec 35/2 3/5", :"rspec 35/2 4/5", :"rspec 35/2 5/5"]
+
+ is_expected.to include(*job_names)
+ end
+ end
+
+ context 'when jobs depend on parallelized jobs' do
+ let(:config) { { job_name => job_config, other_job: { script: 'echo 1', dependencies: [job_name.to_s] } } }
+
+ it 'parallelizes dependencies' do
+ job_names = ["rspec 1/5", "rspec 2/5", "rspec 3/5", "rspec 4/5", "rspec 5/5"]
+
+ expect(subject[:other_job][:dependencies]).to include(*job_names)
+ end
+
+ it 'does not include original job name in dependencies' do
+ expect(subject[:other_job][:dependencies]).not_to include(job_name)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb
index 2e204da307d..975e11e8cc1 100644
--- a/spec/lib/gitlab/ci/config_spec.rb
+++ b/spec/lib/gitlab/ci/config_spec.rb
@@ -42,6 +42,36 @@ describe Gitlab::Ci::Config do
end
end
+ context 'when using extendable hash' do
+ let(:yml) do
+ <<-EOS
+ image: ruby:2.2
+
+ rspec:
+ script: rspec
+
+ test:
+ extends: rspec
+ image: ruby:alpine
+ EOS
+ end
+
+ it 'correctly extends the hash' do
+ hash = {
+ image: 'ruby:2.2',
+ rspec: { script: 'rspec' },
+ test: {
+ extends: 'rspec',
+ image: 'ruby:alpine',
+ script: 'rspec'
+ }
+ }
+
+ expect(config).to be_valid
+ expect(config.to_hash).to eq hash
+ end
+ end
+
context 'when config is invalid' do
context 'when yml is incorrect' do
let(:yml) { '// invalid' }
@@ -49,7 +79,7 @@ describe Gitlab::Ci::Config do
describe '.new' do
it 'raises error' do
expect { config }.to raise_error(
- ::Gitlab::Ci::Config::Loader::FormatError,
+ described_class::ConfigError,
/Invalid configuration format/
)
end
@@ -75,5 +105,254 @@ describe Gitlab::Ci::Config do
end
end
end
+
+ context 'when invalid extended hash has been provided' do
+ let(:yml) do
+ <<-EOS
+ test:
+ extends: test
+ script: rspec
+ EOS
+ end
+
+ it 'raises an error' do
+ expect { config }.to raise_error(
+ described_class::ConfigError, /circular dependency detected/
+ )
+ end
+ end
+ end
+
+ context "when using 'include' directive" do
+ let(:project) { create(:project, :repository) }
+ let(:remote_location) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+ let(:local_location) { 'spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml' }
+
+ let(:remote_file_content) do
+ <<~HEREDOC
+ variables:
+ AUTO_DEVOPS_DOMAIN: domain.example.com
+ POSTGRES_USER: user
+ POSTGRES_PASSWORD: testing-password
+ POSTGRES_ENABLED: "true"
+ POSTGRES_DB: $CI_ENVIRONMENT_SLUG
+ HEREDOC
+ end
+
+ let(:local_file_content) do
+ File.read(Rails.root.join(local_location))
+ end
+
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{local_location}
+ - #{remote_location}
+
+ image: ruby:2.2
+ HEREDOC
+ end
+
+ let(:config) do
+ described_class.new(gitlab_ci_yml, project: project, sha: '12345')
+ end
+
+ before do
+ WebMock.stub_request(:get, remote_location)
+ .to_return(body: remote_file_content)
+
+ allow(project.repository)
+ .to receive(:blob_data_at).and_return(local_file_content)
+ end
+
+ context "when gitlab_ci_yml has valid 'include' defined" do
+ it 'should return a composed hash' do
+ before_script_values = [
+ "apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs", "ruby -v",
+ "which ruby",
+ "gem install bundler --no-ri --no-rdoc",
+ "bundle install --jobs $(nproc) \"${FLAGS[@]}\""
+ ]
+ variables = {
+ AUTO_DEVOPS_DOMAIN: "domain.example.com",
+ POSTGRES_USER: "user",
+ POSTGRES_PASSWORD: "testing-password",
+ POSTGRES_ENABLED: "true",
+ POSTGRES_DB: "$CI_ENVIRONMENT_SLUG"
+ }
+ composed_hash = {
+ before_script: before_script_values,
+ image: "ruby:2.2",
+ rspec: { script: ["bundle exec rspec"] },
+ variables: variables
+ }
+
+ expect(config.to_hash).to eq(composed_hash)
+ end
+ end
+
+ context "when gitlab_ci.yml has invalid 'include' defined" do
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include: invalid
+ HEREDOC
+ end
+
+ it 'raises error YamlProcessor validationError' do
+ expect { config }.to raise_error(
+ described_class::ConfigError,
+ "Included file `invalid` does not have YAML extension!"
+ )
+ end
+ end
+
+ describe 'external file version' do
+ context 'when external local file SHA is defined' do
+ it 'is using a defined value' do
+ expect(project.repository).to receive(:blob_data_at)
+ .with('eeff1122', local_location)
+
+ described_class.new(gitlab_ci_yml, project: project, sha: 'eeff1122')
+ end
+ end
+
+ context 'when external local file SHA is not defined' do
+ it 'is using latest SHA on the default branch' do
+ expect(project.repository).to receive(:root_ref_sha)
+
+ described_class.new(gitlab_ci_yml, project: project)
+ end
+ end
+ end
+
+ context "when both external files and gitlab_ci.yml defined the same key" do
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{remote_location}
+
+ image: ruby:2.2
+ HEREDOC
+ end
+
+ let(:remote_file_content) do
+ <<~HEREDOC
+ image: php:5-fpm-alpine
+ HEREDOC
+ end
+
+ it 'should take precedence' do
+ expect(config.to_hash).to eq({ image: 'ruby:2.2' })
+ end
+ end
+
+ context "when both external files and gitlab_ci.yml define a dictionary of distinct variables" do
+ let(:remote_file_content) do
+ <<~HEREDOC
+ variables:
+ A: 'alpha'
+ B: 'beta'
+ HEREDOC
+ end
+
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{remote_location}
+
+ variables:
+ C: 'gamma'
+ D: 'delta'
+ HEREDOC
+ end
+
+ it 'should merge the variables dictionaries' do
+ expect(config.to_hash).to eq({ variables: { A: 'alpha', B: 'beta', C: 'gamma', D: 'delta' } })
+ end
+ end
+
+ context "when both external files and gitlab_ci.yml define a dictionary of overlapping variables" do
+ let(:remote_file_content) do
+ <<~HEREDOC
+ variables:
+ A: 'alpha'
+ B: 'beta'
+ C: 'omnicron'
+ HEREDOC
+ end
+
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{remote_location}
+
+ variables:
+ C: 'gamma'
+ D: 'delta'
+ HEREDOC
+ end
+
+ it 'later declarations should take precedence' do
+ expect(config.to_hash).to eq({ variables: { A: 'alpha', B: 'beta', C: 'gamma', D: 'delta' } })
+ end
+ end
+
+ context 'when both external files and gitlab_ci.yml define a job' do
+ let(:remote_file_content) do
+ <<~HEREDOC
+ job1:
+ script:
+ - echo 'hello from remote file'
+ HEREDOC
+ end
+
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{remote_location}
+
+ job1:
+ variables:
+ VARIABLE_DEFINED_IN_MAIN_FILE: 'some value'
+ HEREDOC
+ end
+
+ it 'merges the jobs' do
+ expect(config.to_hash).to eq({
+ job1: {
+ script: ["echo 'hello from remote file'"],
+ variables: {
+ VARIABLE_DEFINED_IN_MAIN_FILE: 'some value'
+ }
+ }
+ })
+ end
+
+ context 'when the script key is in both' do
+ let(:gitlab_ci_yml) do
+ <<~HEREDOC
+ include:
+ - #{remote_location}
+
+ job1:
+ script:
+ - echo 'hello from main file'
+ variables:
+ VARIABLE_DEFINED_IN_MAIN_FILE: 'some value'
+ HEREDOC
+ end
+
+ it 'uses the script from the gitlab_ci.yml' do
+ expect(config.to_hash).to eq({
+ job1: {
+ script: ["echo 'hello from main file'"],
+ variables: {
+ VARIABLE_DEFINED_IN_MAIN_FILE: 'some value'
+ }
+ }
+ })
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/parsers/junit_spec.rb b/spec/lib/gitlab/ci/parsers/test/junit_spec.rb
index f7ec86f5385..a49402c7398 100644
--- a/spec/lib/gitlab/ci/parsers/junit_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/test/junit_spec.rb
@@ -1,6 +1,6 @@
-require 'spec_helper'
+require 'fast_spec_helper'
-describe Gitlab::Ci::Parsers::Junit do
+describe Gitlab::Ci::Parsers::Test::Junit do
describe '#parse!' do
subject { described_class.new.parse!(junit, test_suite) }
@@ -8,21 +8,35 @@ describe Gitlab::Ci::Parsers::Junit do
let(:test_cases) { flattened_test_cases(test_suite) }
context 'when data is JUnit style XML' do
- context 'when there are no test cases' do
+ context 'when there are no <testcases> in <testsuite>' do
let(:junit) do
<<-EOF.strip_heredoc
<testsuite></testsuite>
EOF
end
- it 'raises an error and does not add any test cases' do
- expect { subject }.to raise_error(described_class::JunitParserError)
+ it 'ignores the case' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases.count).to eq(0)
+ end
+ end
+
+ context 'when there are no <testcases> in <testsuites>' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuites><testsuite /></testsuites>
+ EOF
+ end
+
+ it 'ignores the case' do
+ expect { subject }.not_to raise_error
expect(test_cases.count).to eq(0)
end
end
- context 'when there is a test case' do
+ context 'when there is only one <testcase> in <testsuite>' do
let(:junit) do
<<-EOF.strip_heredoc
<testsuite>
@@ -40,6 +54,46 @@ describe Gitlab::Ci::Parsers::Junit do
end
end
+ context 'when there is only one <testsuite> in <testsuites>' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuites>
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ </testsuite>
+ </testsuites>
+ EOF
+ end
+
+ it 'parses XML and adds a test case to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ end
+ end
+
+ context 'PHPUnit' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuites>
+ <testsuite name="Project Test Suite" tests="1" assertions="1" failures="0" errors="0" time="1.376748">
+ <testsuite name="XXX\\FrontEnd\\WebBundle\\Tests\\Controller\\LogControllerTest" file="/Users/mcfedr/projects/xxx/server/tests/XXX/FrontEnd/WebBundle/Tests/Controller/LogControllerTest.php" tests="1" assertions="1" failures="0" errors="0" time="1.376748">
+ <testcase name="testIndexAction" class="XXX\\FrontEnd\\WebBundle\\Tests\\Controller\\LogControllerTest" file="/Users/mcfedr/projects/xxx/server/tests/XXX/FrontEnd/WebBundle/Tests/Controller/LogControllerTest.php" line="9" assertions="1" time="1.376748"/>
+ </testsuite>
+ </testsuite>
+ </testsuites>
+ EOF
+ end
+
+ it 'parses XML and adds a test case to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases.count).to eq(1)
+ end
+ end
+
context 'when there are two test cases' do
let(:junit) do
<<-EOF.strip_heredoc
diff --git a/spec/lib/gitlab/ci/parsers_spec.rb b/spec/lib/gitlab/ci/parsers/test_spec.rb
index 2fa83c4abae..0b85b432677 100644
--- a/spec/lib/gitlab/ci/parsers_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/test_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Ci::Parsers do
+describe Gitlab::Ci::Parsers::Test do
describe '.fabricate!' do
subject { described_class.fabricate!(file_type) }
@@ -16,7 +16,7 @@ describe Gitlab::Ci::Parsers do
let(:file_type) { 'undefined' }
it 'raises an error' do
- expect { subject }.to raise_error(NameError)
+ expect { subject }.to raise_error(Gitlab::Ci::Parsers::Test::ParserNotFoundError)
end
end
end
diff --git a/spec/lib/gitlab/ci/status/build/factory_spec.rb b/spec/lib/gitlab/ci/status/build/factory_spec.rb
index d53a7d468e3..b379b08ad62 100644
--- a/spec/lib/gitlab/ci/status/build/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/factory_spec.rb
@@ -88,7 +88,7 @@ describe Gitlab::Ci::Status::Build::Factory do
expect(status.icon).to eq 'status_failed'
expect(status.favicon).to eq 'favicon_status_failed'
expect(status.label).to eq 'failed'
- expect(status.status_tooltip).to eq 'failed <br> (unknown failure)'
+ expect(status.status_tooltip).to eq 'failed - (unknown failure)'
expect(status).to have_details
expect(status).to have_action
end
@@ -319,4 +319,53 @@ describe Gitlab::Ci::Status::Build::Factory do
end
end
end
+
+ context 'when build is a delayed action' do
+ let(:build) { create(:ci_build, :scheduled) }
+
+ it 'matches correct core status' do
+ expect(factory.core_status).to be_a Gitlab::Ci::Status::Scheduled
+ end
+
+ it 'matches correct extended statuses' do
+ expect(factory.extended_statuses)
+ .to eq [Gitlab::Ci::Status::Build::Scheduled,
+ Gitlab::Ci::Status::Build::Unschedule,
+ Gitlab::Ci::Status::Build::Action]
+ end
+
+ it 'fabricates action detailed status' do
+ expect(status).to be_a Gitlab::Ci::Status::Build::Action
+ end
+
+ it 'fabricates status with correct details' do
+ expect(status.text).to eq 'delayed'
+ expect(status.group).to eq 'scheduled'
+ expect(status.icon).to eq 'status_scheduled'
+ expect(status.favicon).to eq 'favicon_status_scheduled'
+ expect(status.illustration).to include(:image, :size, :title, :content)
+ expect(status.label).to include 'unschedule action'
+ expect(status).to have_details
+ expect(status.action_path).to include 'unschedule'
+ end
+
+ context 'when user has ability to play action' do
+ it 'fabricates status that has action' do
+ expect(status).to have_action
+ end
+ end
+
+ context 'when user does not have ability to play action' do
+ before do
+ allow(build.project).to receive(:empty_repo?).and_return(false)
+
+ create(:protected_branch, :no_one_can_push,
+ name: build.ref, project: build.project)
+ end
+
+ it 'fabricates status that has no action' do
+ expect(status).not_to have_action
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
index bfaa508785e..af03d5a1308 100644
--- a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
@@ -76,7 +76,7 @@ describe Gitlab::Ci::Status::Build::FailedAllowed do
let(:status) { described_class.new(build_status) }
it 'does override badge_tooltip' do
- expect(status.badge_tooltip).to eq('failed <br> (unknown failure)')
+ expect(status.badge_tooltip).to eq('failed - (unknown failure)')
end
end
@@ -87,7 +87,7 @@ describe Gitlab::Ci::Status::Build::FailedAllowed do
let(:status) { described_class.new(build_status) }
it 'does override status_tooltip' do
- expect(status.status_tooltip).to eq 'failed <br> (unknown failure) (allowed to fail)'
+ expect(status.status_tooltip).to eq 'failed - (unknown failure) (allowed to fail)'
end
end
diff --git a/spec/lib/gitlab/ci/status/build/failed_spec.rb b/spec/lib/gitlab/ci/status/build/failed_spec.rb
index b6676b40fd3..e424270f7c5 100644
--- a/spec/lib/gitlab/ci/status/build/failed_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/failed_spec.rb
@@ -52,7 +52,7 @@ describe Gitlab::Ci::Status::Build::Failed do
let(:status) { Gitlab::Ci::Status::Failed.new(build, user) }
it 'does override badge_tooltip' do
- expect(subject.badge_tooltip).to eq 'failed <br> (script failure)'
+ expect(subject.badge_tooltip).to eq 'failed - (script failure)'
end
end
@@ -61,7 +61,7 @@ describe Gitlab::Ci::Status::Build::Failed do
let(:status) { Gitlab::Ci::Status::Failed.new(build, user) }
it 'does override status_tooltip' do
- expect(subject.status_tooltip).to eq 'failed <br> (script failure)'
+ expect(subject.status_tooltip).to eq 'failed - (script failure)'
end
end
diff --git a/spec/lib/gitlab/ci/status/build/retried_spec.rb b/spec/lib/gitlab/ci/status/build/retried_spec.rb
index ee9acaf1c21..76c2fb01e3f 100644
--- a/spec/lib/gitlab/ci/status/build/retried_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/retried_spec.rb
@@ -66,7 +66,7 @@ describe Gitlab::Ci::Status::Build::Retried do
let(:status) { Gitlab::Ci::Status::Build::Failed.new(failed_status) }
it 'does override status_tooltip' do
- expect(subject.status_tooltip).to eq 'failed <br> (unknown failure) (retried)'
+ expect(subject.status_tooltip).to eq 'failed - (unknown failure) (retried)'
end
end
diff --git a/spec/lib/gitlab/ci/status/build/scheduled_spec.rb b/spec/lib/gitlab/ci/status/build/scheduled_spec.rb
new file mode 100644
index 00000000000..68b87fea75d
--- /dev/null
+++ b/spec/lib/gitlab/ci/status/build/scheduled_spec.rb
@@ -0,0 +1,44 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Status::Build::Scheduled do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :stubbed_repository) }
+ let(:build) { create(:ci_build, :scheduled, project: project) }
+ let(:status) { Gitlab::Ci::Status::Core.new(build, user) }
+
+ subject { described_class.new(status) }
+
+ describe '#illustration' do
+ it { expect(subject.illustration).to include(:image, :size, :title) }
+ end
+
+ describe '#status_tooltip' do
+ let(:build) { create(:ci_build, scheduled_at: 1.minute.since, project: project) }
+
+ it 'has a placeholder for the remaining time' do
+ expect(subject.status_tooltip).to include('%{remainingTime}')
+ end
+ end
+
+ describe '.matches?' do
+ subject { described_class.matches?(build, user) }
+
+ context 'when build is scheduled and scheduled_at is present' do
+ let(:build) { create(:ci_build, :expired_scheduled, project: project) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when build is scheduled' do
+ let(:build) { create(:ci_build, status: :scheduled, project: project) }
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when scheduled_at is present' do
+ let(:build) { create(:ci_build, scheduled_at: 1.minute.since, project: project) }
+
+ it { is_expected.to be_falsy }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/status/build/unschedule_spec.rb b/spec/lib/gitlab/ci/status/build/unschedule_spec.rb
new file mode 100644
index 00000000000..ed046d66ca5
--- /dev/null
+++ b/spec/lib/gitlab/ci/status/build/unschedule_spec.rb
@@ -0,0 +1,94 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Status::Build::Unschedule do
+ let(:status) { double('core status') }
+ let(:user) { double('user') }
+
+ subject do
+ described_class.new(status)
+ end
+
+ describe '#label' do
+ it { expect(subject.label).to eq 'unschedule action' }
+ end
+
+ describe 'action details' do
+ let(:user) { create(:user) }
+ let(:build) { create(:ci_build) }
+ let(:status) { Gitlab::Ci::Status::Core.new(build, user) }
+
+ describe '#has_action?' do
+ context 'when user is allowed to update build' do
+ before do
+ stub_not_protect_default_branch
+
+ build.project.add_developer(user)
+ end
+
+ it { is_expected.to have_action }
+ end
+
+ context 'when user is not allowed to update build' do
+ it { is_expected.not_to have_action }
+ end
+ end
+
+ describe '#action_path' do
+ it { expect(subject.action_path).to include "#{build.id}/unschedule" }
+ end
+
+ describe '#action_icon' do
+ it { expect(subject.action_icon).to eq 'time-out' }
+ end
+
+ describe '#action_title' do
+ it { expect(subject.action_title).to eq 'Unschedule' }
+ end
+
+ describe '#action_button_title' do
+ it { expect(subject.action_button_title).to eq 'Unschedule job' }
+ end
+ end
+
+ describe '.matches?' do
+ subject { described_class.matches?(build, user) }
+
+ context 'when build is scheduled' do
+ context 'when build unschedules an delayed job' do
+ let(:build) { create(:ci_build, :scheduled) }
+
+ it 'is a correct match' do
+ expect(subject).to be true
+ end
+ end
+
+ context 'when build unschedules an normal job' do
+ let(:build) { create(:ci_build) }
+
+ it 'does not match' do
+ expect(subject).to be false
+ end
+ end
+ end
+ end
+
+ describe '#status_tooltip' do
+ it 'does not override status status_tooltip' do
+ expect(status).to receive(:status_tooltip)
+
+ subject.status_tooltip
+ end
+ end
+
+ describe '#badge_tooltip' do
+ let(:user) { create(:user) }
+ let(:build) { create(:ci_build, :playable) }
+ let(:status) { Gitlab::Ci::Status::Core.new(build, user) }
+
+ it 'does not override status badge_tooltip' do
+ expect(status).to receive(:badge_tooltip)
+
+ subject.badge_tooltip
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/status/pipeline/delayed_spec.rb b/spec/lib/gitlab/ci/status/pipeline/delayed_spec.rb
new file mode 100644
index 00000000000..f89712d2b03
--- /dev/null
+++ b/spec/lib/gitlab/ci/status/pipeline/delayed_spec.rb
@@ -0,0 +1,42 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Status::Pipeline::Delayed do
+ let(:pipeline) { double('pipeline') }
+
+ subject do
+ described_class.new(pipeline)
+ end
+
+ describe '#text' do
+ it 'overrides status text' do
+ expect(subject.text).to eq 'delayed'
+ end
+ end
+
+ describe '#label' do
+ it 'overrides status label' do
+ expect(subject.label).to eq 'waiting for delayed job'
+ end
+ end
+
+ describe '.matches?' do
+ let(:user) { double('user') }
+ subject { described_class.matches?(pipeline, user) }
+
+ context 'when pipeline is scheduled' do
+ let(:pipeline) { create(:ci_pipeline, :scheduled) }
+
+ it 'is a correct match' do
+ expect(subject).to be true
+ end
+ end
+
+ context 'when pipeline is not scheduled' do
+ let(:pipeline) { create(:ci_pipeline, :success) }
+
+ it 'does not match' do
+ expect(subject).to be false
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb b/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
index defb3fdc0df..466087a0e31 100644
--- a/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
@@ -11,8 +11,7 @@ describe Gitlab::Ci::Status::Pipeline::Factory do
end
context 'when pipeline has a core status' do
- (HasStatus::AVAILABLE_STATUSES - [HasStatus::BLOCKED_STATUS])
- .each do |simple_status|
+ (HasStatus::AVAILABLE_STATUSES - HasStatus::BLOCKED_STATUS).each do |simple_status|
context "when core status is #{simple_status}" do
let(:pipeline) { create(:ci_pipeline, status: simple_status) }
@@ -61,6 +60,27 @@ describe Gitlab::Ci::Status::Pipeline::Factory do
.to include "pipelines/#{pipeline.id}"
end
end
+
+ context "when core status is scheduled" do
+ let(:pipeline) { create(:ci_pipeline, status: :scheduled) }
+
+ it "matches scheduled core status" do
+ expect(factory.core_status)
+ .to be_a Gitlab::Ci::Status::Scheduled
+ end
+
+ it 'matches a correct extended statuses' do
+ expect(factory.extended_statuses)
+ .to eq [Gitlab::Ci::Status::Pipeline::Delayed]
+ end
+
+ it 'extends core status with common pipeline methods' do
+ expect(status).to have_details
+ expect(status).not_to have_action
+ expect(status.details_path)
+ .to include "pipelines/#{pipeline.id}"
+ end
+ end
end
context 'when pipeline has warnings' do
diff --git a/spec/lib/gitlab/ci/status/scheduled_spec.rb b/spec/lib/gitlab/ci/status/scheduled_spec.rb
new file mode 100644
index 00000000000..b8ca3caa1f7
--- /dev/null
+++ b/spec/lib/gitlab/ci/status/scheduled_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Status::Scheduled do
+ subject do
+ described_class.new(double('subject'), double('user'))
+ end
+
+ describe '#text' do
+ it { expect(subject.text).to eq 'delayed' }
+ end
+
+ describe '#label' do
+ it { expect(subject.label).to eq 'delayed' }
+ end
+
+ describe '#icon' do
+ it { expect(subject.icon).to eq 'status_scheduled' }
+ end
+
+ describe '#favicon' do
+ it { expect(subject.favicon).to eq 'favicon_status_scheduled' }
+ end
+
+ describe '#group' do
+ it { expect(subject.group).to eq 'scheduled' }
+ end
+end
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
new file mode 100644
index 00000000000..0dd74399a47
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe "CI YML Templates" do
+ Gitlab::Template::GitlabCiYmlTemplate.all.each do |template|
+ it "#{template.name} should be valid" do
+ expect { Gitlab::Ci::YamlProcessor.new(template.content) }.not_to raise_error
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/variables/collection/item_spec.rb b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
index 46874662edd..e1e0582cd11 100644
--- a/spec/lib/gitlab/ci/variables/collection/item_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
@@ -36,7 +36,7 @@ describe Gitlab::Ci::Variables::Collection::Item do
shared_examples 'raises error for invalid type' do
it do
expect { described_class.new(key: variable_key, value: variable_value) }
- .to raise_error ArgumentError, /`value` must be of type String, while it was:/
+ .to raise_error ArgumentError, /`#{variable_key}` must be of type String, while it was:/
end
end
@@ -46,7 +46,7 @@ describe Gitlab::Ci::Variables::Collection::Item do
let(:variable_value) { nil }
let(:expected_value) { nil }
- it_behaves_like 'creates variable'
+ it_behaves_like 'raises error for invalid type'
end
context "when it's an empty string" do
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index e73cdc54a15..441e8214181 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -53,11 +53,11 @@ module Gitlab
describe 'retry entry' do
context 'when retry count is specified' do
let(:config) do
- YAML.dump(rspec: { script: 'rspec', retry: 1 })
+ YAML.dump(rspec: { script: 'rspec', retry: { max: 1 } })
end
it 'includes retry count in build options attribute' do
- expect(subject[:options]).to include(retry: 1)
+ expect(subject[:options]).to include(retry: { max: 1 })
end
end
@@ -121,6 +121,21 @@ module Gitlab
end
end
end
+
+ describe 'delayed job entry' do
+ context 'when delayed is defined' do
+ let(:config) do
+ YAML.dump(rspec: { script: 'rollout 10%',
+ when: 'delayed',
+ start_in: '1 day' })
+ end
+
+ it 'has the attributes' do
+ expect(subject[:when]).to eq 'delayed'
+ expect(subject[:options][:start_in]).to eq '1 day'
+ end
+ end
+ end
end
describe '#stages_attributes' do
@@ -562,6 +577,58 @@ module Gitlab
end
end
+ context 'when using `extends`' do
+ let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config) }
+
+ subject { config_processor.builds.first }
+
+ context 'when using simple `extends`' do
+ let(:config) do
+ <<~YAML
+ .template:
+ script: test
+
+ rspec:
+ extends: .template
+ image: ruby:alpine
+ YAML
+ end
+
+ it 'correctly extends rspec job' do
+ expect(config_processor.builds).to be_one
+ expect(subject.dig(:commands)).to eq 'test'
+ expect(subject.dig(:options, :image, :name)).to eq 'ruby:alpine'
+ end
+ end
+
+ context 'when using recursive `extends`' do
+ let(:config) do
+ <<~YAML
+ rspec:
+ extends: .test
+ script: rspec
+ when: always
+
+ .template:
+ before_script:
+ - bundle install
+
+ .test:
+ extends: .template
+ script: test
+ image: image:test
+ YAML
+ end
+
+ it 'correctly extends rspec job' do
+ expect(config_processor.builds).to be_one
+ expect(subject.dig(:commands)).to eq "bundle install\nrspec"
+ expect(subject.dig(:options, :image, :name)).to eq 'image:test'
+ expect(subject.dig(:when)).to eq 'always'
+ end
+ end
+ end
+
describe "When" do
%w(on_success on_failure always).each do |when_state|
it "returns #{when_state} when defined" do
@@ -578,6 +645,33 @@ module Gitlab
end
end
+ describe 'Parallel' do
+ context 'when job is parallelized' do
+ let(:parallel) { 5 }
+
+ let(:config) do
+ YAML.dump(rspec: { script: 'rspec',
+ parallel: parallel })
+ end
+
+ it 'returns parallelized jobs' do
+ config_processor = Gitlab::Ci::YamlProcessor.new(config)
+ builds = config_processor.stage_builds_attributes('test')
+ build_options = builds.map { |build| build[:options] }
+
+ expect(builds.size).to eq(5)
+ expect(build_options).to all(include(:instance, parallel: parallel))
+ end
+
+ it 'does not have the original job' do
+ config_processor = Gitlab::Ci::YamlProcessor.new(config)
+ builds = config_processor.stage_builds_attributes('test')
+
+ expect(builds).not_to include(:rspec)
+ end
+ end
+ end
+
describe 'cache' do
context 'when cache definition has unknown keys' do
it 'raises relevant validation error' do
@@ -1208,7 +1302,7 @@ module Gitlab
config = YAML.dump({ rspec: { script: "test", when: 1 } })
expect do
Gitlab::Ci::YamlProcessor.new(config)
- end.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError, "jobs:rspec when should be on_success, on_failure, always or manual")
+ end.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError, "jobs:rspec when should be on_success, on_failure, always, manual or delayed")
end
it "returns errors if job artifacts:name is not an a string" do
@@ -1302,24 +1396,28 @@ module Gitlab
end.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError, "jobs:rspec dependencies should be an array of strings")
end
- it 'returns errors if pipeline variables expression is invalid' do
+ it 'returns errors if pipeline variables expression policy is invalid' do
config = YAML.dump({ rspec: { script: 'test', only: { variables: ['== null'] } } })
expect { Gitlab::Ci::YamlProcessor.new(config) }
.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError,
'jobs:rspec:only variables invalid expression syntax')
end
- end
- describe "Validate configuration templates" do
- templates = Dir.glob("#{Rails.root.join('vendor/gitlab-ci-yml')}/**/*.gitlab-ci.yml")
+ it 'returns errors if pipeline changes policy is invalid' do
+ config = YAML.dump({ rspec: { script: 'test', only: { changes: [1] } } })
- templates.each do |file|
- it "does not return errors for #{file}" do
- file = File.read(file)
+ expect { Gitlab::Ci::YamlProcessor.new(config) }
+ .to raise_error(Gitlab::Ci::YamlProcessor::ValidationError,
+ 'jobs:rspec:only changes should be an array of strings')
+ end
- expect { Gitlab::Ci::YamlProcessor.new(file) }.not_to raise_error
- end
+ it 'returns errors if extended hash configuration is invalid' do
+ config = YAML.dump({ rspec: { extends: 'something', script: 'test' } })
+
+ expect { Gitlab::Ci::YamlProcessor.new(config) }
+ .to raise_error(Gitlab::Ci::YamlProcessor::ValidationError,
+ 'rspec: unknown key in `extends`')
end
end
diff --git a/spec/lib/gitlab/cleanup/project_uploads_spec.rb b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
index 37b38776775..bf130b8fabd 100644
--- a/spec/lib/gitlab/cleanup/project_uploads_spec.rb
+++ b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
@@ -132,7 +132,6 @@ describe Gitlab::Cleanup::ProjectUploads do
let!(:path) { File.join(FileUploader.root, orphaned.model.full_path, orphaned.path) }
before do
- stub_feature_flags(import_export_object_storage: true)
stub_uploads_object_storage(FileUploader)
FileUtils.mkdir_p(File.dirname(path))
@@ -156,7 +155,6 @@ describe Gitlab::Cleanup::ProjectUploads do
let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', 'wrong', orphaned.path) }
before do
- stub_feature_flags(import_export_object_storage: true)
stub_uploads_object_storage(FileUploader)
FileUtils.mkdir_p(File.dirname(path))
@@ -244,9 +242,11 @@ describe Gitlab::Cleanup::ProjectUploads do
orphaned1 = create(:upload, :personal_snippet_upload, :with_file)
orphaned2 = create(:upload, :namespace_upload, :with_file)
orphaned3 = create(:upload, :attachment_upload, :with_file)
+ orphaned4 = create(:upload, :favicon_upload, :with_file)
paths << orphaned1.absolute_path
paths << orphaned2.absolute_path
paths << orphaned3.absolute_path
+ paths << orphaned4.absolute_path
Upload.delete_all
expect(logger).not_to receive(:info).with(/move|fix/i)
diff --git a/spec/lib/gitlab/closing_issue_extractor_spec.rb b/spec/lib/gitlab/closing_issue_extractor_spec.rb
index 1f35d1e4880..44568f2a653 100644
--- a/spec/lib/gitlab/closing_issue_extractor_spec.rb
+++ b/spec/lib/gitlab/closing_issue_extractor_spec.rb
@@ -338,6 +338,13 @@ describe Gitlab::ClosingIssueExtractor do
end
end
+ context "with an invalid keyword such as suffix insted of fix" do
+ it do
+ message = "suffix #{reference}"
+ expect(subject.closed_by_message(message)).to eq([])
+ end
+ end
+
context 'with multiple references' do
let(:other_issue) { create(:issue, project: project) }
let(:third_issue) { create(:issue, project: project) }
diff --git a/spec/lib/gitlab/conflict/file_spec.rb b/spec/lib/gitlab/conflict/file_spec.rb
index 5b343920429..a955ce54e85 100644
--- a/spec/lib/gitlab/conflict/file_spec.rb
+++ b/spec/lib/gitlab/conflict/file_spec.rb
@@ -1,9 +1,11 @@
require 'spec_helper'
describe Gitlab::Conflict::File do
+ include GitHelpers
+
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
- let(:rugged) { Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged } }
+ let(:rugged) { rugged_repo(repository) }
let(:their_commit) { rugged.branches['conflict-start'].target }
let(:our_commit) { rugged.branches['conflict-resolvable'].target }
let(:merge_request) { create(:merge_request, source_branch: 'conflict-resolvable', target_branch: 'conflict-start', source_project: project) }
@@ -69,10 +71,6 @@ describe Gitlab::Conflict::File do
CGI.unescapeHTML(ActionView::Base.full_sanitizer.sanitize(html)).delete("\n")
end
- it 'modifies the existing lines' do
- expect { conflict_file.highlight_lines! }.to change { conflict_file.lines.map(&:instance_variables) }
- end
-
it 'is called implicitly when rich_text is accessed on a line' do
expect(conflict_file).to receive(:highlight_lines!).once.and_call_original
@@ -269,11 +267,6 @@ FILE
it 'includes the full content of the conflict' do
expect(conflict_file.as_json(full_content: true)).to have_key(:content)
end
-
- it 'includes the detected language of the conflict file' do
- expect(conflict_file.as_json(full_content: true)[:blob_ace_mode])
- .to eq('ruby')
- end
end
end
end
diff --git a/spec/lib/gitlab/contributions_calendar_spec.rb b/spec/lib/gitlab/contributions_calendar_spec.rb
index 2c63f3b0455..6d29044ffd5 100644
--- a/spec/lib/gitlab/contributions_calendar_spec.rb
+++ b/spec/lib/gitlab/contributions_calendar_spec.rb
@@ -62,13 +62,16 @@ describe Gitlab::ContributionsCalendar do
expect(calendar.activity_dates).to eq(last_week => 2, today => 1)
end
- it "only shows private events to authorized users" do
- create_event(private_project, today)
- create_event(feature_project, today)
+ context "when the user has opted-in for private contributions" do
+ it "shows private and public events to all users" do
+ user.update_column(:include_private_contributions, true)
+ create_event(private_project, today)
+ create_event(public_project, today)
- expect(calendar.activity_dates[today]).to eq(0)
- expect(calendar(user).activity_dates[today]).to eq(0)
- expect(calendar(contributor).activity_dates[today]).to eq(2)
+ expect(calendar.activity_dates[today]).to eq(1)
+ expect(calendar(user).activity_dates[today]).to eq(1)
+ expect(calendar(contributor).activity_dates[today]).to eq(2)
+ end
end
it "counts the diff notes on merge request" do
@@ -128,7 +131,7 @@ describe Gitlab::ContributionsCalendar do
e3 = create_event(feature_project, today)
create_event(public_project, last_week)
- expect(calendar.events_by_date(today)).to contain_exactly(e1)
+ expect(calendar.events_by_date(today)).to contain_exactly(e1, e3)
expect(calendar(contributor).events_by_date(today)).to contain_exactly(e1, e2, e3)
end
diff --git a/spec/lib/gitlab/cross_project_access/check_info_spec.rb b/spec/lib/gitlab/cross_project_access/check_info_spec.rb
index bc9dbf2bece..239fa364f5e 100644
--- a/spec/lib/gitlab/cross_project_access/check_info_spec.rb
+++ b/spec/lib/gitlab/cross_project_access/check_info_spec.rb
@@ -50,7 +50,7 @@ describe Gitlab::CrossProjectAccess::CheckInfo do
expect(info.should_run?(dummy_controller)).to be_truthy
end
- it 'returns the the oposite of #should_skip? when the check is a skip' do
+ it 'returns the the opposite of #should_skip? when the check is a skip' do
info = described_class.new({}, nil, nil, true)
expect(info).to receive(:should_skip?).with(dummy_controller).and_return(false)
@@ -101,7 +101,7 @@ describe Gitlab::CrossProjectAccess::CheckInfo do
expect(info.should_skip?(dummy_controller)).to be_truthy
end
- it 'returns the the oposite of #should_run? when the check is not a skip' do
+ it 'returns the the opposite of #should_run? when the check is not a skip' do
info = described_class.new({}, nil, nil, false)
expect(info).to receive(:should_run?).with(dummy_controller).and_return(false)
diff --git a/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb b/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
index 2e67c1c7f78..f8009709ce2 100644
--- a/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
@@ -44,15 +44,15 @@ describe Gitlab::CycleAnalytics::StageSummary do
describe "#deploys" do
it "finds the number of deploys made created after the 'from date'" do
- Timecop.freeze(5.days.ago) { create(:deployment, project: project) }
- Timecop.freeze(5.days.from_now) { create(:deployment, project: project) }
+ Timecop.freeze(5.days.ago) { create(:deployment, :success, project: project) }
+ Timecop.freeze(5.days.from_now) { create(:deployment, :success, project: project) }
expect(subject.third[:value]).to eq(1)
end
it "doesn't find commits from other projects" do
Timecop.freeze(5.days.from_now) do
- create(:deployment, project: create(:project, :repository))
+ create(:deployment, :success, project: create(:project, :repository))
end
expect(subject.third[:value]).to eq(0)
diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb
index ee91decafad..14fe196a986 100644
--- a/spec/lib/gitlab/data_builder/build_spec.rb
+++ b/spec/lib/gitlab/data_builder/build_spec.rb
@@ -15,6 +15,7 @@ describe Gitlab::DataBuilder::Build do
it { expect(data[:build_id]).to eq(build.id) }
it { expect(data[:build_status]).to eq(build.status) }
it { expect(data[:build_allow_failure]).to eq(false) }
+ it { expect(data[:build_failure_reason]).to eq(build.failure_reason) }
it { expect(data[:project_id]).to eq(build.project.id) }
it { expect(data[:project_name]).to eq(build.project.full_name) }
diff --git a/spec/lib/gitlab/data_builder/pipeline_spec.rb b/spec/lib/gitlab/data_builder/pipeline_spec.rb
index 9ca960502c8..98f1696badb 100644
--- a/spec/lib/gitlab/data_builder/pipeline_spec.rb
+++ b/spec/lib/gitlab/data_builder/pipeline_spec.rb
@@ -6,10 +6,10 @@ describe Gitlab::DataBuilder::Pipeline do
let(:pipeline) do
create(:ci_pipeline,
- project: project,
- status: 'success',
- sha: project.commit.sha,
- ref: project.default_branch)
+ project: project,
+ status: 'success',
+ sha: project.commit.sha,
+ ref: project.default_branch)
end
let!(:build) { create(:ci_build, pipeline: pipeline) }
@@ -20,18 +20,35 @@ describe Gitlab::DataBuilder::Pipeline do
let(:build_data) { data[:builds].first }
let(:project_data) { data[:project] }
- it { expect(attributes).to be_a(Hash) }
- it { expect(attributes[:ref]).to eq(pipeline.ref) }
- it { expect(attributes[:sha]).to eq(pipeline.sha) }
- it { expect(attributes[:tag]).to eq(pipeline.tag) }
- it { expect(attributes[:id]).to eq(pipeline.id) }
- it { expect(attributes[:status]).to eq(pipeline.status) }
- it { expect(attributes[:detailed_status]).to eq('passed') }
+ it 'has correct attributes' do
+ expect(attributes).to be_a(Hash)
+ expect(attributes[:ref]).to eq(pipeline.ref)
+ expect(attributes[:sha]).to eq(pipeline.sha)
+ expect(attributes[:tag]).to eq(pipeline.tag)
+ expect(attributes[:id]).to eq(pipeline.id)
+ expect(attributes[:status]).to eq(pipeline.status)
+ expect(attributes[:detailed_status]).to eq('passed')
+ expect(build_data).to be_a(Hash)
+ expect(build_data[:id]).to eq(build.id)
+ expect(build_data[:status]).to eq(build.status)
+ expect(project_data).to eq(project.hook_attrs(backward: false))
+ end
- it { expect(build_data).to be_a(Hash) }
- it { expect(build_data[:id]).to eq(build.id) }
- it { expect(build_data[:status]).to eq(build.status) }
+ context 'pipeline without variables' do
+ it 'has empty variables hash' do
+ expect(attributes[:variables]).to be_a(Array)
+ expect(attributes[:variables]).to be_empty()
+ end
+ end
- it { expect(project_data).to eq(project.hook_attrs(backward: false)) }
+ context 'pipeline with variables' do
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+ let(:data) { described_class.build(pipeline) }
+ let(:attributes) { data[:object_attributes] }
+ let!(:pipeline_variable) { create(:ci_pipeline_variable, pipeline: pipeline, key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1') }
+
+ it { expect(attributes[:variables]).to be_a(Array) }
+ it { expect(attributes[:variables]).to contain_exactly({ key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1' }) }
+ end
end
end
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index eb7148ff108..23f27939dd2 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -48,10 +48,10 @@ describe Gitlab::Database::MigrationHelpers do
allow(model).to receive(:transaction_open?).and_return(false)
end
- context 'using PostgreSQL' do
+ context 'using PostgreSQL', :postgresql do
before do
allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
- allow(model).to receive(:disable_statement_timeout)
+ allow(model).to receive(:disable_statement_timeout).and_call_original
end
it 'creates the index concurrently' do
@@ -114,12 +114,12 @@ describe Gitlab::Database::MigrationHelpers do
before do
allow(model).to receive(:transaction_open?).and_return(false)
allow(model).to receive(:index_exists?).and_return(true)
+ allow(model).to receive(:disable_statement_timeout).and_call_original
end
context 'using PostgreSQL' do
before do
allow(model).to receive(:supports_drop_index_concurrently?).and_return(true)
- allow(model).to receive(:disable_statement_timeout)
end
describe 'by column name' do
@@ -162,7 +162,7 @@ describe Gitlab::Database::MigrationHelpers do
context 'using MySQL' do
it 'removes an index' do
- expect(Gitlab::Database).to receive(:postgresql?).and_return(false)
+ expect(Gitlab::Database).to receive(:postgresql?).and_return(false).twice
expect(model).to receive(:remove_index)
.with(:users, { column: :foo })
@@ -224,21 +224,26 @@ describe Gitlab::Database::MigrationHelpers do
context 'using PostgreSQL' do
before do
+ allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
allow(Gitlab::Database).to receive(:mysql?).and_return(false)
end
it 'creates a concurrent foreign key and validates it' do
- expect(model).to receive(:disable_statement_timeout)
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:execute).with(/statement_timeout/)
expect(model).to receive(:execute).ordered.with(/NOT VALID/)
expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).with(/RESET ALL/)
model.add_concurrent_foreign_key(:projects, :users, column: :user_id)
end
it 'appends a valid ON DELETE statement' do
- expect(model).to receive(:disable_statement_timeout)
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:execute).with(/statement_timeout/)
expect(model).to receive(:execute).with(/ON DELETE SET NULL/)
expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).with(/RESET ALL/)
model.add_concurrent_foreign_key(:projects, :users,
column: :user_id,
@@ -291,13 +296,68 @@ describe Gitlab::Database::MigrationHelpers do
describe '#disable_statement_timeout' do
context 'using PostgreSQL' do
- it 'disables statement timeouts' do
+ it 'disables statement timeouts to current transaction only' do
expect(Gitlab::Database).to receive(:postgresql?).and_return(true)
- expect(model).to receive(:execute).with('SET statement_timeout TO 0')
+ expect(model).to receive(:execute).with('SET LOCAL statement_timeout TO 0')
model.disable_statement_timeout
end
+
+ # this specs runs without an enclosing transaction (:delete truncation method for db_cleaner)
+ context 'with real environment', :postgresql, :delete do
+ before do
+ model.execute("SET statement_timeout TO '20000'")
+ end
+
+ after do
+ model.execute('RESET ALL')
+ end
+
+ it 'defines statement to 0 only for current transaction' do
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('20s')
+
+ model.connection.transaction do
+ model.disable_statement_timeout
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('0')
+ end
+
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('20s')
+ end
+ end
+
+ context 'when passing a blocks' do
+ it 'disables statement timeouts on session level and executes the block' do
+ expect(Gitlab::Database).to receive(:postgresql?).and_return(true)
+ expect(model).to receive(:execute).with('SET statement_timeout TO 0')
+ expect(model).to receive(:execute).with('RESET ALL')
+
+ expect { |block| model.disable_statement_timeout(&block) }.to yield_control
+ end
+
+ # this specs runs without an enclosing transaction (:delete truncation method for db_cleaner)
+ context 'with real environment', :postgresql, :delete do
+ before do
+ model.execute("SET statement_timeout TO '20000'")
+ end
+
+ after do
+ model.execute('RESET ALL')
+ end
+
+ it 'defines statement to 0 for any code run inside the block' do
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('20s')
+
+ model.disable_statement_timeout do
+ model.connection.transaction do
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('0')
+ end
+
+ expect(model.execute('SHOW statement_timeout').first['statement_timeout']).to eq('0')
+ end
+ end
+ end
+ end
end
context 'using MySQL' do
@@ -308,6 +368,16 @@ describe Gitlab::Database::MigrationHelpers do
model.disable_statement_timeout
end
+
+ context 'when passing a blocks' do
+ it 'executes the block of code' do
+ expect(Gitlab::Database).to receive(:postgresql?).and_return(false)
+
+ expect(model).not_to receive(:execute)
+
+ expect { |block| model.disable_statement_timeout(&block) }.to yield_control
+ end
+ end
end
end
@@ -1268,7 +1338,12 @@ describe Gitlab::Database::MigrationHelpers do
end
describe '#index_exists_by_name?' do
- it 'returns true if an index exists' do
+ # TODO: remove rails5-only after removing rails4 tests
+ # rails 4 can not handle multiple indexes on the same column set if
+ # index was added by 't.index' - t.index is used by default in schema.rb in
+ # rails 5. Let's run this test only in rails 5 env:
+ # see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_113602758
+ it 'returns true if an index exists', :rails5 do
expect(model.index_exists_by_name?(:projects, 'index_projects_on_path'))
.to be_truthy
end
diff --git a/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb b/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
index cc7cb3f23fd..248cca25a2c 100644
--- a/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
+++ b/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
@@ -20,7 +20,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameBase, :delete
end
describe "#remove_last_ocurrence" do
- it "removes only the last occurance of a string" do
+ it "removes only the last occurrence of a string" do
input = "this/is/a-word-to-replace/namespace/with/a-word-to-replace"
expect(subject.remove_last_occurrence(input, "a-word-to-replace"))
diff --git a/spec/lib/gitlab/database/subquery_spec.rb b/spec/lib/gitlab/database/subquery_spec.rb
new file mode 100644
index 00000000000..70380e02f16
--- /dev/null
+++ b/spec/lib/gitlab/database/subquery_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Subquery do
+ describe '.self_join' do
+ set(:project) { create(:project) }
+
+ it 'allows you to delete_all rows with WHERE and LIMIT' do
+ events = create_list(:event, 8, project: project)
+
+ expect do
+ described_class.self_join(Event.where('id < ?', events[5]).recent.limit(2)).delete_all
+ end.to change { Event.count }.by(-2)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/file_collection/commit_spec.rb b/spec/lib/gitlab/diff/file_collection/commit_spec.rb
new file mode 100644
index 00000000000..6d1b66deb6a
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_collection/commit_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Diff::FileCollection::Commit do
+ let(:project) { create(:project, :repository) }
+
+ it_behaves_like 'diff statistics' do
+ let(:collection_default_args) do
+ { diff_options: {} }
+ end
+ let(:diffable) { project.commit }
+ let(:stub_path) { 'bar/branch-test.txt' }
+ end
+end
diff --git a/spec/lib/gitlab/diff/file_collection/compare_spec.rb b/spec/lib/gitlab/diff/file_collection/compare_spec.rb
new file mode 100644
index 00000000000..f330f299ac1
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_collection/compare_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Diff::FileCollection::Compare do
+ include RepoHelpers
+
+ let(:project) { create(:project, :repository) }
+ let(:commit) { project.commit }
+ let(:start_commit) { sample_image_commit }
+ let(:head_commit) { sample_commit }
+ let(:raw_compare) do
+ Gitlab::Git::Compare.new(project.repository.raw_repository,
+ start_commit.id,
+ head_commit.id)
+ end
+
+ it_behaves_like 'diff statistics' do
+ let(:collection_default_args) do
+ {
+ project: diffable.project,
+ diff_options: {},
+ diff_refs: diffable.diff_refs
+ }
+ end
+ let(:diffable) { Compare.new(raw_compare, project) }
+ let(:stub_path) { '.gitignore' }
+ end
+end
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb
index 79287021981..4578da70bfc 100644
--- a/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb
@@ -29,6 +29,14 @@ describe Gitlab::Diff::FileCollection::MergeRequestDiff do
expect(mr_diff.cache_key).not_to eq(key)
end
+ it_behaves_like 'diff statistics' do
+ let(:collection_default_args) do
+ { diff_options: {} }
+ end
+ let(:diffable) { merge_request.merge_request_diff }
+ let(:stub_path) { '.gitignore' }
+ end
+
shared_examples 'initializes a DiffCollection' do
it 'returns a valid instance of a DiffCollection' do
expect(diff_files).to be_a(Gitlab::Git::DiffCollection)
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
index ebeb05d6e02..3417896e259 100644
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -41,6 +41,52 @@ describe Gitlab::Diff::File do
end
end
+ describe '#unfold_diff_lines' do
+ let(:unfolded_lines) { double('expanded-lines') }
+ let(:unfolder) { instance_double(Gitlab::Diff::LinesUnfolder) }
+ let(:position) { instance_double(Gitlab::Diff::Position, old_line: 10) }
+
+ before do
+ allow(Gitlab::Diff::LinesUnfolder).to receive(:new) { unfolder }
+ end
+
+ context 'when unfold required' do
+ before do
+ allow(unfolder).to receive(:unfold_required?) { true }
+ allow(unfolder).to receive(:unfolded_diff_lines) { unfolded_lines }
+ end
+
+ it 'changes @unfolded to true' do
+ diff_file.unfold_diff_lines(position)
+
+ expect(diff_file).to be_unfolded
+ end
+
+ it 'updates @diff_lines' do
+ diff_file.unfold_diff_lines(position)
+
+ expect(diff_file.diff_lines).to eq(unfolded_lines)
+ end
+ end
+
+ context 'when unfold not required' do
+ before do
+ allow(unfolder).to receive(:unfold_required?) { false }
+ end
+
+ it 'keeps @unfolded false' do
+ diff_file.unfold_diff_lines(position)
+
+ expect(diff_file).not_to be_unfolded
+ end
+
+ it 'does not update @diff_lines' do
+ expect { diff_file.unfold_diff_lines(position) }
+ .not_to change(diff_file, :diff_lines)
+ end
+ end
+ end
+
describe '#mode_changed?' do
it { expect(diff_file.mode_changed?).to be_falsey }
end
@@ -186,6 +232,70 @@ describe Gitlab::Diff::File do
end
end
+ context 'diff file stats' do
+ let(:diff_file) do
+ described_class.new(diff,
+ diff_refs: commit.diff_refs,
+ repository: project.repository,
+ stats: stats)
+ end
+
+ let(:raw_diff) do
+ <<~EOS
+ --- a/files/ruby/popen.rb
+ +++ b/files/ruby/popen.rb
+ @@ -6,12 +6,18 @@ module Popen
+
+ def popen(cmd, path=nil)
+ unless cmd.is_a?(Array)
+ - raise "System commands must be given as an array of strings"
+ + raise RuntimeError, "System commands must be given as an array of strings"
+ + # foobar
+ end
+ EOS
+ end
+
+ describe '#added_lines' do
+ context 'when stats argument given' do
+ let(:stats) { double(Gitaly::DiffStats, additions: 10, deletions: 15) }
+
+ it 'returns added lines from stats' do
+ expect(diff_file.added_lines).to eq(stats.additions)
+ end
+ end
+
+ context 'when stats argument not given' do
+ let(:stats) { nil }
+
+ it 'returns added lines by parsing raw diff' do
+ allow(diff_file).to receive(:raw_diff) { raw_diff }
+
+ expect(diff_file.added_lines).to eq(2)
+ end
+ end
+ end
+
+ describe '#removed_lines' do
+ context 'when stats argument given' do
+ let(:stats) { double(Gitaly::DiffStats, additions: 10, deletions: 15) }
+
+ it 'returns removed lines from stats' do
+ expect(diff_file.removed_lines).to eq(stats.deletions)
+ end
+ end
+
+ context 'when stats argument not given' do
+ let(:stats) { nil }
+
+ it 'returns removed lines by parsing raw diff' do
+ allow(diff_file).to receive(:raw_diff) { raw_diff }
+
+ expect(diff_file.removed_lines).to eq(1)
+ end
+ end
+ end
+ end
+
describe '#simple_viewer' do
context 'when the file is not diffable' do
before do
diff --git a/spec/lib/gitlab/diff/highlight_cache_spec.rb b/spec/lib/gitlab/diff/highlight_cache_spec.rb
new file mode 100644
index 00000000000..bfcfed4231f
--- /dev/null
+++ b/spec/lib/gitlab/diff/highlight_cache_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Diff::HighlightCache do
+ let(:merge_request) { create(:merge_request_with_diffs) }
+
+ subject(:cache) { described_class.new(merge_request.diffs, backend: backend) }
+
+ describe '#decorate' do
+ let(:backend) { double('backend').as_null_object }
+
+ # Manually creates a Diff::File object to avoid triggering the cache on
+ # the FileCollection::MergeRequestDiff
+ let(:diff_file) do
+ diffs = merge_request.diffs
+ raw_diff = diffs.diffable.raw_diffs(diffs.diff_options.merge(paths: ['CHANGELOG'])).first
+ Gitlab::Diff::File.new(raw_diff,
+ repository: diffs.project.repository,
+ diff_refs: diffs.diff_refs,
+ fallback_diff_refs: diffs.fallback_diff_refs)
+ end
+
+ it 'does not calculate highlighting when reading from cache' do
+ cache.write_if_empty
+ cache.decorate(diff_file)
+
+ expect_any_instance_of(Gitlab::Diff::Highlight).not_to receive(:highlight)
+
+ diff_file.highlighted_diff_lines
+ end
+
+ it 'assigns highlighted diff lines to the DiffFile' do
+ cache.write_if_empty
+ cache.decorate(diff_file)
+
+ expect(diff_file.highlighted_diff_lines.size).to be > 5
+ end
+
+ it 'submits a single reading from the cache' do
+ cache.decorate(diff_file)
+ cache.decorate(diff_file)
+
+ expect(backend).to have_received(:read).with(cache.key).once
+ end
+ end
+
+ describe '#write_if_empty' do
+ let(:backend) { double('backend', read: {}).as_null_object }
+
+ it 'submits a single writing to the cache' do
+ cache.write_if_empty
+ cache.write_if_empty
+
+ expect(backend).to have_received(:write).with(cache.key,
+ hash_including('CHANGELOG-false-false-false'),
+ expires_in: 1.week).once
+ end
+ end
+
+ describe '#clear' do
+ let(:backend) { double('backend').as_null_object }
+
+ it 'clears cache' do
+ cache.clear
+
+ expect(backend).to have_received(:delete).with(cache.key)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/highlight_spec.rb b/spec/lib/gitlab/diff/highlight_spec.rb
index 7c9e8c8d04e..5d0a603d11d 100644
--- a/spec/lib/gitlab/diff/highlight_spec.rb
+++ b/spec/lib/gitlab/diff/highlight_spec.rb
@@ -8,6 +8,20 @@ describe Gitlab::Diff::Highlight do
let(:diff) { commit.raw_diffs.first }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
+ shared_examples 'without inline diffs' do
+ let(:code) { '<h2 onmouseover="alert(2)">Test</h2>' }
+
+ before do
+ allow(Gitlab::Diff::InlineDiff).to receive(:for_lines).and_return([])
+ allow_any_instance_of(Gitlab::Diff::Line).to receive(:text).and_return(code)
+ end
+
+ it 'returns html escaped diff text' do
+ expect(subject[1].rich_text).to eq html_escape(code)
+ expect(subject[1].rich_text).to be_html_safe
+ end
+ end
+
describe '#highlight' do
context "with a diff file" do
let(:subject) { described_class.new(diff_file, repository: project.repository).highlight }
@@ -24,19 +38,29 @@ describe Gitlab::Diff::Highlight do
it 'highlights and marks unchanged lines' do
code = %Q{ <span id="LC7" class="line" lang="ruby"> <span class="k">def</span> <span class="nf">popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span></span>\n}
- expect(subject[2].text).to eq(code)
+ expect(subject[2].rich_text).to eq(code)
end
it 'highlights and marks removed lines' do
code = %Q{-<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="s2">"System commands must be given as an array of strings"</span></span>\n}
- expect(subject[4].text).to eq(code)
+ expect(subject[4].rich_text).to eq(code)
end
it 'highlights and marks added lines' do
code = %Q{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left">RuntimeError</span></span><span class="p"><span class="idiff">,</span></span><span class="idiff right"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
- expect(subject[5].text).to eq(code)
+ expect(subject[5].rich_text).to eq(code)
+ end
+
+ context 'when no diff_refs' do
+ before do
+ allow(diff_file).to receive(:diff_refs).and_return(nil)
+ end
+
+ context 'when no inline diffs' do
+ it_behaves_like 'without inline diffs'
+ end
end
end
@@ -69,8 +93,8 @@ describe Gitlab::Diff::Highlight do
it 'marks added lines' do
code = %q{+ raise <span class="idiff left right">RuntimeError, </span>&quot;System commands must be given as an array of strings&quot;}
- expect(subject[5].text).to eq(code)
- expect(subject[5].text).to be_html_safe
+ expect(subject[5].rich_text).to eq(code)
+ expect(subject[5].rich_text).to be_html_safe
end
context 'when the inline diff marker has an invalid range' do
@@ -93,6 +117,10 @@ describe Gitlab::Diff::Highlight do
expect { subject }. to raise_exception(RangeError)
end
end
+
+ context 'when no inline diffs' do
+ it_behaves_like 'without inline diffs'
+ end
end
end
end
diff --git a/spec/lib/gitlab/diff/line_spec.rb b/spec/lib/gitlab/diff/line_spec.rb
new file mode 100644
index 00000000000..76d411973c7
--- /dev/null
+++ b/spec/lib/gitlab/diff/line_spec.rb
@@ -0,0 +1,22 @@
+describe Gitlab::Diff::Line do
+ describe '.init_from_hash' do
+ it 'round-trips correctly with to_hash' do
+ line = described_class.new('<input>', 'match', 0, 0, 1,
+ parent_file: double(:file),
+ line_code: double(:line_code),
+ rich_text: '&lt;input&gt;')
+
+ expect(described_class.init_from_hash(line.to_hash).to_hash)
+ .to eq(line.to_hash)
+ end
+ end
+
+ context "when setting rich text" do
+ it 'escapes any HTML special characters in the diff chunk header' do
+ subject = described_class.new("<input>", "", 0, 0, 0)
+ line = subject.as_json
+
+ expect(line[:rich_text]).to eq("&lt;input&gt;")
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/lines_unfolder_spec.rb b/spec/lib/gitlab/diff/lines_unfolder_spec.rb
new file mode 100644
index 00000000000..8e00c8e0e30
--- /dev/null
+++ b/spec/lib/gitlab/diff/lines_unfolder_spec.rb
@@ -0,0 +1,750 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Diff::LinesUnfolder do
+ let(:raw_diff) do
+ <<-DIFF.strip_heredoc
+ @@ -7,9 +7,6 @@
+ "tags": ["devel", "development", "nightly"],
+ "desktop-file-name-prefix": "(Development) ",
+ "finish-args": [
+ - "--share=ipc", "--socket=x11",
+ - "--socket=wayland",
+ - "--talk-name=org.gnome.OnlineAccounts",
+ "--talk-name=org.freedesktop.Tracker1",
+ "--filesystem=home",
+ "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*",
+ @@ -62,7 +59,7 @@
+ },
+ {
+ "name": "gnome-desktop",
+ - "config-opts": ["--disable-debug-tools", "--disable-udev"],
+ + "config-opts": ["--disable-debug-tools", "--disable-"],
+ "sources": [
+ {
+ "type": "git",
+ @@ -83,11 +80,6 @@
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "nautilus",
+ - "config-opts": [
+ - "-Denable-desktop=false",
+ - "-Denable-selinux=false",
+ - "--libdir=/app/lib"
+ - ],
+ "sources": [
+ {
+ "type": "git",
+ DIFF
+ end
+
+ let(:raw_old_blob) do
+ <<-BLOB.strip_heredoc
+ {
+ "app-id": "org.gnome.Nautilus",
+ "runtime": "org.gnome.Platform",
+ "runtime-version": "master",
+ "sdk": "org.gnome.Sdk",
+ "command": "nautilus",
+ "tags": ["devel", "development", "nightly"],
+ "desktop-file-name-prefix": "(Development) ",
+ "finish-args": [
+ "--share=ipc", "--socket=x11",
+ "--socket=wayland",
+ "--talk-name=org.gnome.OnlineAccounts",
+ "--talk-name=org.freedesktop.Tracker1",
+ "--filesystem=home",
+ "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*",
+ "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro",
+ "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
+ ],
+ "cleanup": [ "/include", "/share/bash-completion" ],
+ "modules": [
+ {
+ "name": "exiv2",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://exiv2.org/builds/exiv2-0.26-trunk.tar.gz",
+ "sha256": "c75e3c4a0811bf700d92c82319373b7a825a2331c12b8b37d41eb58e4f18eafb"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "cp -f /usr/share/gnu-config/config.sub ./config/",
+ "cp -f /usr/share/gnu-config/config.guess ./config/"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "gexiv2",
+ "config-opts": [ "--disable-introspection" ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://git.gnome.org/browse/gexiv2"
+ }
+ ]
+ },
+ {
+ "name": "tracker",
+ "cleanup": [ "/bin", "/etc", "/libexec" ],
+ "config-opts": [ "--disable-miner-apps", "--disable-static",
+ "--disable-tracker-extract", "--disable-tracker-needle",
+ "--disable-tracker-preferences", "--disable-artwork",
+ "--disable-tracker-writeback", "--disable-miner-user-guides",
+ "--with-bash-completion-dir=no" ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://git.gnome.org/browse/tracker"
+ }
+ ]
+ },
+ {
+ "name": "gnome-desktop",
+ "config-opts": ["--disable-debug-tools", "--disable-udev"],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://git.gnome.org/browse/gnome-desktop"
+ }
+ ]
+ },
+ {
+ "name": "gnome-autoar",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://git.gnome.org/browse/gnome-autoar"
+ }
+ ]
+ },
+ {
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "nautilus",
+ "config-opts": [
+ "-Denable-desktop=false",
+ "-Denable-selinux=false",
+ "--libdir=/app/lib"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/nautilus.git"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "app-id": "foo",
+ "runtime": "foo",
+ "runtime-version": "foo",
+ "sdk": "foo",
+ "command": "foo",
+ "tags": ["foo", "bar", "kux"],
+ "desktop-file-name-prefix": "(Foo) ",
+ {
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "nautilus",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/nautilus.git"
+ }
+ ]
+ }
+ },
+ {
+ "app-id": "foo",
+ "runtime": "foo",
+ "runtime-version": "foo",
+ "sdk": "foo",
+ "command": "foo",
+ "tags": ["foo", "bar", "kux"],
+ "desktop-file-name-prefix": "(Foo) ",
+ {
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "nautilus",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/nautilus.git"
+ }
+ ]
+ }
+ }
+ BLOB
+ end
+
+ let(:project) { create(:project) }
+
+ let(:old_blob) { Gitlab::Git::Blob.new(data: raw_old_blob) }
+
+ let(:diff) do
+ Gitlab::Git::Diff.new(diff: raw_diff,
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ a_mode: "100644",
+ b_mode: "100644",
+ new_file: false,
+ renamed_file: false,
+ deleted_file: false,
+ too_large: false)
+ end
+
+ let(:diff_file) do
+ Gitlab::Diff::File.new(diff, repository: project.repository)
+ end
+
+ before do
+ allow(old_blob).to receive(:load_all_data!)
+ allow(diff_file).to receive(:old_blob) { old_blob }
+ end
+
+ subject { described_class.new(diff_file, position) }
+
+ context 'position requires a middle expansion and new match lines' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 43,
+ new_line: 40)
+ end
+
+ context 'blob lines' do
+ let(:expected_blob_lines) do
+ [[40, 40, " \"config-opts\": [ \"--disable-introspection\" ],"],
+ [41, 41, " \"sources\": ["],
+ [42, 42, " {"],
+ [43, 43, " \"type\": \"git\","],
+ [44, 44, " \"url\": \"https://git.gnome.org/browse/gexiv2\""],
+ [45, 45, " }"],
+ [46, 46, " ]"]]
+ end
+
+ it 'returns the extracted blob lines correctly' do
+ extracted_lines = subject.blob_lines
+
+ expect(extracted_lines.size).to eq(7)
+
+ extracted_lines.each_with_index do |line, i|
+ expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i])
+ end
+ end
+ end
+
+ context 'diff lines' do
+ let(:expected_diff_lines) do
+ [[7, 7, "@@ -7,9 +7,6 @@"],
+ [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"],
+ [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","],
+ [9, 9, " \"finish-args\": ["],
+ [10, 10, "- \"--share=ipc\", \"--socket=x11\","],
+ [11, 10, "- \"--socket=wayland\","],
+ [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","],
+ [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","],
+ [14, 11, " \"--filesystem=home\","],
+ [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","],
+
+ # New match line
+ [40, 37, "@@ -40,7+37,7 @@"],
+
+ # Injected blob lines
+ [40, 37, " \"config-opts\": [ \"--disable-introspection\" ],"],
+ [41, 38, " \"sources\": ["],
+ [42, 39, " {"],
+ [43, 40, " \"type\": \"git\","], # comment
+ [44, 41, " \"url\": \"https://git.gnome.org/browse/gexiv2\""],
+ [45, 42, " }"],
+ [46, 43, " ]"],
+ # end
+
+ # Second match line
+ [62, 59, "@@ -62,7+59,7 @@"],
+
+ [62, 59, " },"],
+ [63, 60, " {"],
+ [64, 61, " \"name\": \"gnome-desktop\","],
+ [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"],
+ [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"],
+ [66, 63, " \"sources\": ["],
+ [67, 64, " {"],
+ [68, 65, " \"type\": \"git\","],
+ [83, 80, "@@ -83,11 +80,6 @@"],
+ [83, 80, " \"buildsystem\": \"meson\","],
+ [84, 81, " \"builddir\": true,"],
+ [85, 82, " \"name\": \"nautilus\","],
+ [86, 83, "- \"config-opts\": ["],
+ [87, 83, "- \"-Denable-desktop=false\","],
+ [88, 83, "- \"-Denable-selinux=false\","],
+ [89, 83, "- \"--libdir=/app/lib\""],
+ [90, 83, "- ],"],
+ [91, 83, " \"sources\": ["],
+ [92, 84, " {"],
+ [93, 85, " \"type\": \"git\","]]
+ end
+
+ it 'return merge of blob lines with diff lines correctly' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ expected_diff_lines.each_with_index do |expected_line, i|
+ line = new_diff_lines[i]
+
+ expect([line.old_pos, line.new_pos, line.text])
+ .to eq([expected_line[0], expected_line[1], expected_line[2]])
+ end
+ end
+
+ it 'merged lines have correct line codes' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ new_diff_lines.each_with_index do |line, i|
+ old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1]
+
+ unless line.type == 'match'
+ expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos))
+ end
+ end
+ end
+ end
+ end
+
+ context 'position requires a middle expansion and no top match line' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 16,
+ new_line: 17)
+ end
+
+ context 'blob lines' do
+ let(:expected_blob_lines) do
+ [[16, 16, " \"--filesystem=xdg-run/dconf\", \"--filesystem=~/.config/dconf:ro\","],
+ [17, 17, " \"--talk-name=ca.desrt.dconf\", \"--env=DCONF_USER_CONFIG_DIR=.config/dconf\""],
+ [18, 18, " ],"],
+ [19, 19, " \"cleanup\": [ \"/include\", \"/share/bash-completion\" ],"]]
+ end
+
+ it 'returns the extracted blob lines correctly' do
+ extracted_lines = subject.blob_lines
+
+ expect(extracted_lines.size).to eq(4)
+
+ extracted_lines.each_with_index do |line, i|
+ expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i])
+ end
+ end
+ end
+
+ context 'diff lines' do
+ let(:expected_diff_lines) do
+ [[7, 7, "@@ -7,9 +7,6 @@"],
+ [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"],
+ [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","],
+ [9, 9, " \"finish-args\": ["],
+ [10, 10, "- \"--share=ipc\", \"--socket=x11\","],
+ [11, 10, "- \"--socket=wayland\","],
+ [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","],
+ [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","],
+ [14, 11, " \"--filesystem=home\","],
+ [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","],
+ # No new match needed
+
+ # Injected blob lines
+ [16, 13, " \"--filesystem=xdg-run/dconf\", \"--filesystem=~/.config/dconf:ro\","],
+ [17, 14, " \"--talk-name=ca.desrt.dconf\", \"--env=DCONF_USER_CONFIG_DIR=.config/dconf\""],
+ [18, 15, " ],"],
+ [19, 16, " \"cleanup\": [ \"/include\", \"/share/bash-completion\" ],"],
+ # end
+
+ # Second match line
+ [62, 59, "@@ -62,4+59,4 @@"],
+
+ [62, 59, " },"],
+ [63, 60, " {"],
+ [64, 61, " \"name\": \"gnome-desktop\","],
+ [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"],
+ [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"],
+ [66, 63, " \"sources\": ["],
+ [67, 64, " {"],
+ [68, 65, " \"type\": \"git\","],
+ [83, 80, "@@ -83,11 +80,6 @@"],
+ [83, 80, " \"buildsystem\": \"meson\","],
+ [84, 81, " \"builddir\": true,"],
+ [85, 82, " \"name\": \"nautilus\","],
+ [86, 83, "- \"config-opts\": ["],
+ [87, 83, "- \"-Denable-desktop=false\","],
+ [88, 83, "- \"-Denable-selinux=false\","],
+ [89, 83, "- \"--libdir=/app/lib\""],
+ [90, 83, "- ],"],
+ [91, 83, " \"sources\": ["],
+ [92, 84, " {"],
+ [93, 85, " \"type\": \"git\","]]
+ end
+
+ it 'return merge of blob lines with diff lines correctly' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ expected_diff_lines.each_with_index do |expected_line, i|
+ line = new_diff_lines[i]
+
+ expect([line.old_pos, line.new_pos, line.text])
+ .to eq([expected_line[0], expected_line[1], expected_line[2]])
+ end
+ end
+
+ it 'merged lines have correct line codes' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ new_diff_lines.each_with_index do |line, i|
+ old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1]
+
+ unless line.type == 'match'
+ expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos))
+ end
+ end
+ end
+ end
+ end
+
+ context 'position requires a middle expansion and no bottom match line' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 82,
+ new_line: 79)
+ end
+
+ context 'blob lines' do
+ let(:expected_blob_lines) do
+ [[79, 79, " }"],
+ [80, 80, " ]"],
+ [81, 81, " },"],
+ [82, 82, " {"]]
+ end
+
+ it 'returns the extracted blob lines correctly' do
+ extracted_lines = subject.blob_lines
+
+ expect(extracted_lines.size).to eq(4)
+
+ extracted_lines.each_with_index do |line, i|
+ expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i])
+ end
+ end
+ end
+
+ context 'diff lines' do
+ let(:expected_diff_lines) do
+ [[7, 7, "@@ -7,9 +7,6 @@"],
+ [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"],
+ [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","],
+ [9, 9, " \"finish-args\": ["],
+ [10, 10, "- \"--share=ipc\", \"--socket=x11\","],
+ [11, 10, "- \"--socket=wayland\","],
+ [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","],
+ [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","],
+ [14, 11, " \"--filesystem=home\","],
+ [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","],
+ [62, 59, "@@ -62,7 +59,7 @@"],
+ [62, 59, " },"],
+ [63, 60, " {"],
+ [64, 61, " \"name\": \"gnome-desktop\","],
+ [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"],
+ [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"],
+ [66, 63, " \"sources\": ["],
+ [67, 64, " {"],
+ [68, 65, " \"type\": \"git\","],
+
+ # New top match line
+ [79, 76, "@@ -79,4+76,4 @@"],
+
+ # Injected blob lines
+ [79, 76, " }"],
+ [80, 77, " ]"],
+ [81, 78, " },"],
+ [82, 79, " {"],
+ # end
+
+ # No new second match line
+ [83, 80, " \"buildsystem\": \"meson\","],
+ [84, 81, " \"builddir\": true,"],
+ [85, 82, " \"name\": \"nautilus\","],
+ [86, 83, "- \"config-opts\": ["],
+ [87, 83, "- \"-Denable-desktop=false\","],
+ [88, 83, "- \"-Denable-selinux=false\","],
+ [89, 83, "- \"--libdir=/app/lib\""],
+ [90, 83, "- ],"],
+ [91, 83, " \"sources\": ["],
+ [92, 84, " {"],
+ [93, 85, " \"type\": \"git\","]]
+ end
+
+ it 'return merge of blob lines with diff lines correctly' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ expected_diff_lines.each_with_index do |expected_line, i|
+ line = new_diff_lines[i]
+
+ expect([line.old_pos, line.new_pos, line.text])
+ .to eq([expected_line[0], expected_line[1], expected_line[2]])
+ end
+ end
+
+ it 'merged lines have correct line codes' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ new_diff_lines.each_with_index do |line, i|
+ old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1]
+
+ unless line.type == 'match'
+ expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos))
+ end
+ end
+ end
+ end
+ end
+
+ context 'position requires a short top expansion' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 6,
+ new_line: 6)
+ end
+
+ context 'blob lines' do
+ let(:expected_blob_lines) do
+ [[3, 3, " \"runtime\": \"org.gnome.Platform\","],
+ [4, 4, " \"runtime-version\": \"master\","],
+ [5, 5, " \"sdk\": \"org.gnome.Sdk\","],
+ [6, 6, " \"command\": \"nautilus\","]]
+ end
+
+ it 'returns the extracted blob lines correctly' do
+ extracted_lines = subject.blob_lines
+
+ expect(extracted_lines.size).to eq(4)
+
+ extracted_lines.each_with_index do |line, i|
+ expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i])
+ end
+ end
+ end
+
+ context 'diff lines' do
+ let(:expected_diff_lines) do
+ # New match line
+ [[3, 3, "@@ -3,4+3,4 @@"],
+
+ # Injected blob lines
+ [3, 3, " \"runtime\": \"org.gnome.Platform\","],
+ [4, 4, " \"runtime-version\": \"master\","],
+ [5, 5, " \"sdk\": \"org.gnome.Sdk\","],
+ [6, 6, " \"command\": \"nautilus\","],
+ # end
+ [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"],
+ [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","],
+ [9, 9, " \"finish-args\": ["],
+ [10, 10, "- \"--share=ipc\", \"--socket=x11\","],
+ [11, 10, "- \"--socket=wayland\","],
+ [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","],
+ [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","],
+ [14, 11, " \"--filesystem=home\","],
+ [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","],
+ [62, 59, "@@ -62,7 +59,7 @@"],
+ [62, 59, " },"],
+ [63, 60, " {"],
+ [64, 61, " \"name\": \"gnome-desktop\","],
+ [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"],
+ [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"],
+ [66, 63, " \"sources\": ["],
+ [67, 64, " {"],
+ [68, 65, " \"type\": \"git\","],
+ [83, 80, "@@ -83,11 +80,6 @@"],
+ [83, 80, " \"buildsystem\": \"meson\","],
+ [84, 81, " \"builddir\": true,"],
+ [85, 82, " \"name\": \"nautilus\","],
+ [86, 83, "- \"config-opts\": ["],
+ [87, 83, "- \"-Denable-desktop=false\","],
+ [88, 83, "- \"-Denable-selinux=false\","],
+ [89, 83, "- \"--libdir=/app/lib\""],
+ [90, 83, "- ],"],
+ [91, 83, " \"sources\": ["],
+ [92, 84, " {"],
+ [93, 85, " \"type\": \"git\","]]
+ end
+
+ it 'return merge of blob lines with diff lines correctly' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ expected_diff_lines.each_with_index do |expected_line, i|
+ line = new_diff_lines[i]
+
+ expect([line.old_pos, line.new_pos, line.text])
+ .to eq([expected_line[0], expected_line[1], expected_line[2]])
+ end
+ end
+
+ it 'merged lines have correct line codes' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ new_diff_lines.each_with_index do |line, i|
+ old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1]
+
+ unless line.type == 'match'
+ expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos))
+ end
+ end
+ end
+ end
+ end
+
+ context 'position sits between two match lines (no expasion needed)' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 64,
+ new_line: 61)
+ end
+
+ context 'diff lines' do
+ it 'returns nil' do
+ expect(subject.unfolded_diff_lines).to be_nil
+ end
+ end
+ end
+
+ context 'position requires bottom expansion and new match lines' do
+ let(:position) do
+ Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19",
+ head_sha: "1487062132228de836236c522fe52fed4980a46c",
+ old_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ new_path: "build-aux/flatpak/org.gnome.Nautilus.json",
+ position_type: "text",
+ old_line: 107,
+ new_line: 99)
+ end
+
+ context 'blob lines' do
+ let(:expected_blob_lines) do
+ [[104, 104, " \"sdk\": \"foo\","],
+ [105, 105, " \"command\": \"foo\","],
+ [106, 106, " \"tags\": [\"foo\", \"bar\", \"kux\"],"],
+ [107, 107, " \"desktop-file-name-prefix\": \"(Foo) \","],
+ [108, 108, " {"],
+ [109, 109, " \"buildsystem\": \"meson\","],
+ [110, 110, " \"builddir\": true,"]]
+ end
+
+ it 'returns the extracted blob lines correctly' do
+ extracted_lines = subject.blob_lines
+
+ expect(extracted_lines.size).to eq(7)
+
+ extracted_lines.each_with_index do |line, i|
+ expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i])
+ end
+ end
+ end
+
+ context 'diff lines' do
+ let(:expected_diff_lines) do
+ [[7, 7, "@@ -7,9 +7,6 @@"],
+ [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"],
+ [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","],
+ [9, 9, " \"finish-args\": ["],
+ [10, 10, "- \"--share=ipc\", \"--socket=x11\","],
+ [11, 10, "- \"--socket=wayland\","],
+ [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","],
+ [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","],
+ [14, 11, " \"--filesystem=home\","],
+ [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","],
+ [62, 59, "@@ -62,7 +59,7 @@"],
+ [62, 59, " },"],
+ [63, 60, " {"],
+ [64, 61, " \"name\": \"gnome-desktop\","],
+ [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"],
+ [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"],
+ [66, 63, " \"sources\": ["],
+ [67, 64, " {"],
+ [68, 65, " \"type\": \"git\","],
+ [83, 80, "@@ -83,11 +80,6 @@"],
+ [83, 80, " \"buildsystem\": \"meson\","],
+ [84, 81, " \"builddir\": true,"],
+ [85, 82, " \"name\": \"nautilus\","],
+ [86, 83, "- \"config-opts\": ["],
+ [87, 83, "- \"-Denable-desktop=false\","],
+ [88, 83, "- \"-Denable-selinux=false\","],
+ [89, 83, "- \"--libdir=/app/lib\""],
+ [90, 83, "- ],"],
+ [91, 83, " \"sources\": ["],
+ [92, 84, " {"],
+ [93, 85, " \"type\": \"git\","],
+ # New match line
+ [104, 96, "@@ -104,7+96,7 @@"],
+
+ # Injected blob lines
+ [104, 96, " \"sdk\": \"foo\","],
+ [105, 97, " \"command\": \"foo\","],
+ [106, 98, " \"tags\": [\"foo\", \"bar\", \"kux\"],"],
+ [107, 99, " \"desktop-file-name-prefix\": \"(Foo) \","],
+ [108, 100, " {"],
+ [109, 101, " \"buildsystem\": \"meson\","],
+ [110, 102, " \"builddir\": true,"]]
+ # end
+ end
+
+ it 'return merge of blob lines with diff lines correctly' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ expected_diff_lines.each_with_index do |expected_line, i|
+ line = new_diff_lines[i]
+
+ expect([line.old_pos, line.new_pos, line.text])
+ .to eq([expected_line[0], expected_line[1], expected_line[2]])
+ end
+ end
+
+ it 'merged lines have correct line codes' do
+ new_diff_lines = subject.unfolded_diff_lines
+
+ new_diff_lines.each_with_index do |line, i|
+ old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1]
+
+ unless line.type == 'match'
+ expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos))
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/position_spec.rb b/spec/lib/gitlab/diff/position_spec.rb
index 677eb373d22..cc4faf6f10b 100644
--- a/spec/lib/gitlab/diff/position_spec.rb
+++ b/spec/lib/gitlab/diff/position_spec.rb
@@ -5,6 +5,34 @@ describe Gitlab::Diff::Position do
let(:project) { create(:project, :repository) }
+ let(:args_for_img) do
+ {
+ old_path: "files/any.img",
+ new_path: "files/any.img",
+ base_sha: nil,
+ head_sha: nil,
+ start_sha: nil,
+ width: 100,
+ height: 100,
+ x: 1,
+ y: 100,
+ position_type: "image"
+ }
+ end
+
+ let(:args_for_text) do
+ {
+ old_path: "files/ruby/popen.rb",
+ new_path: "files/ruby/popen.rb",
+ old_line: nil,
+ new_line: 14,
+ base_sha: nil,
+ head_sha: nil,
+ start_sha: nil,
+ position_type: "text"
+ }
+ end
+
describe "position for an added text file" do
let(:commit) { project.commit("2ea1f3dec713d940208fb5ce4a38765ecb5d3f73") }
@@ -529,53 +557,49 @@ describe Gitlab::Diff::Position do
end
end
+ describe "#as_json" do
+ shared_examples "diff position json" do
+ let(:diff_position) { described_class.new(args) }
+
+ it "returns the position as JSON" do
+ expect(diff_position.as_json).to eq(args.stringify_keys)
+ end
+ end
+
+ context "for text position" do
+ let(:args) { args_for_text }
+
+ it_behaves_like "diff position json"
+ end
+
+ context "for image position" do
+ let(:args) { args_for_img }
+
+ it_behaves_like "diff position json"
+ end
+ end
+
describe "#to_json" do
shared_examples "diff position json" do
+ let(:diff_position) { described_class.new(args) }
+
it "returns the position as JSON" do
- expect(JSON.parse(diff_position.to_json)).to eq(hash.stringify_keys)
+ expect(JSON.parse(diff_position.to_json)).to eq(args.stringify_keys)
end
it "works when nested under another hash" do
- expect(JSON.parse(JSON.generate(pos: diff_position))).to eq('pos' => hash.stringify_keys)
+ expect(JSON.parse(JSON.generate(pos: diff_position))).to eq('pos' => args.stringify_keys)
end
end
- context "for text positon" do
- let(:hash) do
- {
- old_path: "files/ruby/popen.rb",
- new_path: "files/ruby/popen.rb",
- old_line: nil,
- new_line: 14,
- base_sha: nil,
- head_sha: nil,
- start_sha: nil,
- position_type: "text"
- }
- end
-
- let(:diff_position) { described_class.new(hash) }
+ context "for text position" do
+ let(:args) { args_for_text }
it_behaves_like "diff position json"
end
- context "for image positon" do
- let(:hash) do
- {
- old_path: "files/any.img",
- new_path: "files/any.img",
- base_sha: nil,
- head_sha: nil,
- start_sha: nil,
- width: 100,
- height: 100,
- x: 1,
- y: 100,
- position_type: "image"
- }
- end
-
- let(:diff_position) { described_class.new(hash) }
+ context "for image position" do
+ let(:args) { args_for_img }
it_behaves_like "diff position json"
end
diff --git a/spec/lib/gitlab/diff/position_tracer_spec.rb b/spec/lib/gitlab/diff/position_tracer_spec.rb
index ddc4f6c5b5c..a2eed07ca55 100644
--- a/spec/lib/gitlab/diff/position_tracer_spec.rb
+++ b/spec/lib/gitlab/diff/position_tracer_spec.rb
@@ -43,7 +43,7 @@ describe Gitlab::Diff::PositionTracer do
#
# In any case, all of this means that the tests below will be extremely
# (excessively, unjustifiably) thorough for scenarios where "the file was
- # created in the old diff" and then drop off to comparitively lackluster
+ # created in the old diff" and then drop off to comparatively lackluster
# testing of other scenarios.
#
# I did still try to cover most of the obvious and potentially tricky
diff --git a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
index 154ab4b3856..1d75e8cb5da 100644
--- a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Gitlab::Email::Handler::CreateIssueHandler do
diff --git a/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb b/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
index 43c6280f251..f276f1a8ddf 100644
--- a/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Gitlab::Email::Handler::CreateMergeRequestHandler do
@@ -91,5 +93,74 @@ describe Gitlab::Email::Handler::CreateMergeRequestHandler do
end
end
end
+
+ context 'when the email contains patch attachments' do
+ let(:email_raw) { fixture_file("emails/valid_merge_request_with_patch.eml") }
+
+ it 'creates the source branch and applies the patches' do
+ receiver.execute
+
+ branch = project.repository.find_branch('new-branch-with-a-patch')
+
+ expect(branch).not_to be_nil
+ expect(branch.dereferenced_target.message).to include('A commit from a patch')
+ end
+
+ it 'creates the merge request' do
+ expect { receiver.execute }
+ .to change { project.merge_requests.where(source_branch: 'new-branch-with-a-patch').size }.by(1)
+ end
+
+ it 'does not mention the patches in the created merge request' do
+ receiver.execute
+
+ merge_request = project.merge_requests.find_by!(source_branch: 'new-branch-with-a-patch')
+
+ expect(merge_request.description).not_to include('0001-A-commit-from-a-patch.patch')
+ end
+
+ context 'when the patch could not be applied' do
+ let(:email_raw) { fixture_file("emails/merge_request_with_conflicting_patch.eml") }
+
+ it 'raises an error' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::InvalidAttachment)
+ end
+ end
+
+ context 'when specifying the target branch using quick actions' do
+ let(:email_raw) { fixture_file('emails/merge_request_with_patch_and_target_branch.eml') }
+
+ it 'creates the merge request with the correct target branch' do
+ receiver.execute
+
+ merge_request = project.merge_requests.find_by!(source_branch: 'new-branch-with-a-patch')
+
+ expect(merge_request.target_branch).to eq('with-codeowners')
+ end
+
+ it 'based the merge request of the target_branch' do
+ receiver.execute
+
+ merge_request = project.merge_requests.find_by!(source_branch: 'new-branch-with-a-patch')
+
+ expect(merge_request.diff_base_commit).to eq(project.repository.commit('with-codeowners'))
+ end
+ end
+ end
+ end
+
+ describe '#patch_attachments' do
+ let(:email_raw) { fixture_file('emails/merge_request_multiple_patches.eml') }
+ let(:mail) { Mail::Message.new(email_raw) }
+ subject(:handler) { described_class.new(mail, mail_key) }
+
+ it 'orders attachments ending in `.patch` by name' do
+ expected_filenames = ["0001-A-commit-from-a-patch.patch",
+ "0002-This-does-not-apply-to-the-feature-branch.patch"]
+
+ attachments = handler.__send__(:patch_attachments).map(&:filename)
+
+ expect(attachments).to eq(expected_filenames)
+ end
end
end
diff --git a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
index 950a7dd7d6c..b1f48c15c21 100644
--- a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Gitlab::Email::Handler::CreateNoteHandler do
diff --git a/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb b/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
index ce160e11de2..b8660b133ec 100644
--- a/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Gitlab::Email::Handler::UnsubscribeHandler do
diff --git a/spec/lib/gitlab/email/handler_spec.rb b/spec/lib/gitlab/email/handler_spec.rb
index cedbfcc0d18..c651765dc0f 100644
--- a/spec/lib/gitlab/email/handler_spec.rb
+++ b/spec/lib/gitlab/email/handler_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Gitlab::Email::Handler do
@@ -40,7 +42,7 @@ describe Gitlab::Email::Handler do
end
def ce_handlers
- @ce_handlers ||= Gitlab::Email::Handler::HANDLERS.reject do |handler|
+ @ce_handlers ||= Gitlab::Email::Handler.handlers.reject do |handler|
handler.name.start_with?('Gitlab::Email::Handler::EE::')
end
end
diff --git a/spec/lib/gitlab/encoding_helper_spec.rb b/spec/lib/gitlab/encoding_helper_spec.rb
index e68c9850f6b..a5bf2f2b3df 100644
--- a/spec/lib/gitlab/encoding_helper_spec.rb
+++ b/spec/lib/gitlab/encoding_helper_spec.rb
@@ -1,3 +1,4 @@
+# coding: utf-8
require "spec_helper"
describe Gitlab::EncodingHelper do
@@ -187,4 +188,15 @@ describe Gitlab::EncodingHelper do
end
end
end
+
+ describe '#binary_stringio' do
+ it 'does not mutate the original string encoding' do
+ test = 'my-test'
+
+ io_stream = ext_class.binary_stringio(test)
+
+ expect(io_stream.external_encoding.name).to eq('ASCII-8BIT')
+ expect(test.encoding.name).to eq('UTF-8')
+ end
+ end
end
diff --git a/spec/lib/gitlab/favicon_spec.rb b/spec/lib/gitlab/favicon_spec.rb
index 68abcb3520a..49a423191bb 100644
--- a/spec/lib/gitlab/favicon_spec.rb
+++ b/spec/lib/gitlab/favicon_spec.rb
@@ -58,6 +58,7 @@ RSpec.describe Gitlab::Favicon, :request_store do
favicon_status_not_found
favicon_status_pending
favicon_status_running
+ favicon_status_scheduled
favicon_status_skipped
favicon_status_success
favicon_status_warning
diff --git a/spec/lib/gitlab/file_detector_spec.rb b/spec/lib/gitlab/file_detector_spec.rb
index 8e524f9b05a..4ba9094b24e 100644
--- a/spec/lib/gitlab/file_detector_spec.rb
+++ b/spec/lib/gitlab/file_detector_spec.rb
@@ -15,7 +15,20 @@ describe Gitlab::FileDetector do
describe '.type_of' do
it 'returns the type of a README file' do
- expect(described_class.type_of('README.md')).to eq(:readme)
+ filenames = Gitlab::MarkupHelper::PLAIN_FILENAMES + Gitlab::MarkupHelper::PLAIN_FILENAMES.map(&:upcase)
+ extensions = Gitlab::MarkupHelper::EXTENSIONS + Gitlab::MarkupHelper::EXTENSIONS.map(&:upcase)
+
+ filenames.each do |filename|
+ expect(described_class.type_of(filename)).to eq(:readme)
+
+ extensions.each do |extname|
+ expect(described_class.type_of("#{filename}.#{extname}")).to eq(:readme)
+ end
+ end
+ end
+
+ it 'returns nil for a README.rb file' do
+ expect(described_class.type_of('README.rb')).to be_nil
end
it 'returns nil for a README file in a directory' do
@@ -29,11 +42,15 @@ describe Gitlab::FileDetector do
end
it 'returns the type of a license file' do
- %w(LICENSE LICENCE COPYING).each do |file|
+ %w(LICENSE LICENCE COPYING UNLICENSE UNLICENCE).each do |file|
expect(described_class.type_of(file)).to eq(:license)
end
end
+ it 'returns nil for an UNCOPYING file' do
+ expect(described_class.type_of('UNCOPYING')).to be_nil
+ end
+
it 'returns the type of a version file' do
expect(described_class.type_of('VERSION')).to eq(:version)
end
@@ -42,10 +59,6 @@ describe Gitlab::FileDetector do
expect(described_class.type_of('.gitignore')).to eq(:gitignore)
end
- it 'returns the type of a Koding config file' do
- expect(described_class.type_of('.koding.yml')).to eq(:koding)
- end
-
it 'returns the type of a GitLab CI config file' do
expect(described_class.type_of('.gitlab-ci.yml')).to eq(:gitlab_ci)
end
diff --git a/spec/lib/gitlab/file_markdown_link_builder_spec.rb b/spec/lib/gitlab/file_markdown_link_builder_spec.rb
new file mode 100644
index 00000000000..feb2776c5d0
--- /dev/null
+++ b/spec/lib/gitlab/file_markdown_link_builder_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+require 'rails_helper'
+
+describe Gitlab::FileMarkdownLinkBuilder do
+ let(:custom_class) do
+ Class.new do
+ include Gitlab::FileMarkdownLinkBuilder
+ end.new
+ end
+
+ before do
+ allow(custom_class).to receive(:filename).and_return(filename)
+ end
+
+ describe 'markdown_link' do
+ let(:url) { "/uploads/#{filename}"}
+
+ before do
+ allow(custom_class).to receive(:secure_url).and_return(url)
+ end
+
+ context 'when file name has the character ]' do
+ let(:filename) { 'd]k.png' }
+
+ it 'escapes the character' do
+ expect(custom_class.markdown_link).to eq '![d\\]k](/uploads/d]k.png)'
+ end
+ end
+
+ context 'when file is an image or video' do
+ let(:filename) { 'dk.png' }
+
+ it 'returns preview markdown link' do
+ expect(custom_class.markdown_link).to eq '![dk](/uploads/dk.png)'
+ end
+ end
+
+ context 'when file is not an image or video' do
+ let(:filename) { 'dk.zip' }
+
+ it 'returns markdown link' do
+ expect(custom_class.markdown_link).to eq '[dk.zip](/uploads/dk.zip)'
+ end
+ end
+
+ context 'when file name is blank' do
+ let(:filename) { nil }
+
+ it 'returns nil' do
+ expect(custom_class.markdown_link).to eq nil
+ end
+ end
+ end
+
+ describe 'mardown_name' do
+ context 'when file is an image or video' do
+ let(:filename) { 'dk.png' }
+
+ it 'retrieves the name without the extension' do
+ expect(custom_class.markdown_name).to eq 'dk'
+ end
+ end
+
+ context 'when file is not an image or video' do
+ let(:filename) { 'dk.zip' }
+
+ it 'retrieves the name with the extesion' do
+ expect(custom_class.markdown_name).to eq 'dk.zip'
+ end
+ end
+
+ context 'when file name is blank' do
+ let(:filename) { nil }
+
+ it 'returns nil' do
+ expect(custom_class.markdown_name).to eq nil
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/file_type_detection_spec.rb b/spec/lib/gitlab/file_type_detection_spec.rb
new file mode 100644
index 00000000000..5e9b8988cc8
--- /dev/null
+++ b/spec/lib/gitlab/file_type_detection_spec.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+require 'rails_helper'
+
+describe Gitlab::FileTypeDetection do
+ def upload_fixture(filename)
+ fixture_file_upload(File.join('spec', 'fixtures', filename))
+ end
+
+ describe '#image_or_video?' do
+ context 'when class is an uploader' do
+ let(:uploader) do
+ example_uploader = Class.new(CarrierWave::Uploader::Base) do
+ include Gitlab::FileTypeDetection
+
+ storage :file
+ end
+
+ example_uploader.new
+ end
+
+ it 'returns true for an image file' do
+ uploader.store!(upload_fixture('dk.png'))
+
+ expect(uploader).to be_image_or_video
+ end
+
+ it 'returns true for a video file' do
+ uploader.store!(upload_fixture('video_sample.mp4'))
+
+ expect(uploader).to be_image_or_video
+ end
+
+ it 'returns false for other extensions' do
+ uploader.store!(upload_fixture('doc_sample.txt'))
+
+ expect(uploader).not_to be_image_or_video
+ end
+
+ it 'returns false if filename is blank' do
+ uploader.store!(upload_fixture('dk.png'))
+
+ allow(uploader).to receive(:filename).and_return(nil)
+
+ expect(uploader).not_to be_image_or_video
+ end
+ end
+
+ context 'when class is a regular class' do
+ let(:custom_class) do
+ custom_class = Class.new do
+ include Gitlab::FileTypeDetection
+ end
+
+ custom_class.new
+ end
+
+ it 'returns true for an image file' do
+ allow(custom_class).to receive(:filename).and_return('dk.png')
+
+ expect(custom_class).to be_image_or_video
+ end
+
+ it 'returns true for a video file' do
+ allow(custom_class).to receive(:filename).and_return('video_sample.mp4')
+
+ expect(custom_class).to be_image_or_video
+ end
+
+ it 'returns false for other extensions' do
+ allow(custom_class).to receive(:filename).and_return('doc_sample.txt')
+
+ expect(custom_class).not_to be_image_or_video
+ end
+
+ it 'returns false if filename is blank' do
+ allow(custom_class).to receive(:filename).and_return(nil)
+
+ expect(custom_class).not_to be_image_or_video
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
index ca067a29174..134bd5657e7 100644
--- a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
@@ -17,7 +17,7 @@ describe Gitlab::Git::AttributesAtRefParser, :seed_helper do
end
it 'handles missing blobs' do
- expect { described_class.new(repository, 'non-existant-branch') }.not_to raise_error
+ expect { described_class.new(repository, 'non-existent-branch') }.not_to raise_error
end
describe '#attributes' do
diff --git a/spec/lib/gitlab/git/attributes_parser_spec.rb b/spec/lib/gitlab/git/attributes_parser_spec.rb
index 18ebfef38f0..f431d4e2a53 100644
--- a/spec/lib/gitlab/git/attributes_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_parser_spec.rb
@@ -94,7 +94,7 @@ describe Gitlab::Git::AttributesParser, :seed_helper do
# It's a bit hard to test for something _not_ being processed. As such we'll
# just test the number of entries.
it 'ignores any comments and empty lines' do
- expect(subject.patterns.length).to eq(10)
+ expect(subject.patterns.length).to eq(12)
end
end
@@ -126,7 +126,7 @@ describe Gitlab::Git::AttributesParser, :seed_helper do
describe '#each_line' do
it 'iterates over every line in the attributes file' do
- args = [String] * 14 # the number of lines in the file
+ args = [String] * 16 # the number of lines in the file
expect { |b| subject.each_line(&b) }.to yield_successive_args(*args)
end
diff --git a/spec/lib/gitlab/git/blob_snippet_spec.rb b/spec/lib/gitlab/git/blob_snippet_spec.rb
deleted file mode 100644
index 6effec8295c..00000000000
--- a/spec/lib/gitlab/git/blob_snippet_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# encoding: UTF-8
-
-require "spec_helper"
-
-describe Gitlab::Git::BlobSnippet, :seed_helper do
- describe '#data' do
- context 'empty lines' do
- let(:snippet) { Gitlab::Git::BlobSnippet.new('master', nil, nil, nil) }
-
- it { expect(snippet.data).to be_nil }
- end
-
- context 'present lines' do
- let(:snippet) { Gitlab::Git::BlobSnippet.new('master', %w(wow much), 1, 'wow.rb') }
-
- it { expect(snippet.data).to eq("wow\nmuch") }
- end
- end
-end
diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb
index ea49502ae2e..b243f0dacae 100644
--- a/spec/lib/gitlab/git/blob_spec.rb
+++ b/spec/lib/gitlab/git/blob_spec.rb
@@ -4,6 +4,9 @@ require "spec_helper"
describe Gitlab::Git::Blob, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+ let(:rugged) do
+ Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
+ end
describe 'initialize' do
let(:blob) { Gitlab::Git::Blob.new(name: 'test') }
@@ -139,9 +142,7 @@ describe Gitlab::Git::Blob, :seed_helper do
it 'limits the size of a large file' do
blob_size = Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE + 1
buffer = Array.new(blob_size, 0)
- rugged_blob = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- Rugged::Blob.from_buffer(repository.rugged, buffer.join(''))
- end
+ rugged_blob = Rugged::Blob.from_buffer(rugged, buffer.join(''))
blob = Gitlab::Git::Blob.raw(repository, rugged_blob)
expect(blob.size).to eq(blob_size)
@@ -156,9 +157,7 @@ describe Gitlab::Git::Blob, :seed_helper do
context 'when sha references a tree' do
it 'returns nil' do
- tree = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.rev_parse('master^{tree}')
- end
+ tree = rugged.rev_parse('master^{tree}')
blob = Gitlab::Git::Blob.raw(repository, tree.oid)
@@ -262,11 +261,7 @@ describe Gitlab::Git::Blob, :seed_helper do
end
describe '.batch_lfs_pointers' do
- let(:tree_object) do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.rev_parse('master^{tree}')
- end
- end
+ let(:tree_object) { rugged.rev_parse('master^{tree}') }
let(:non_lfs_blob) do
Gitlab::Git::Blob.find(
diff --git a/spec/lib/gitlab/git/branch_spec.rb b/spec/lib/gitlab/git/branch_spec.rb
index 79ccbb79966..0df282d0ae3 100644
--- a/spec/lib/gitlab/git/branch_spec.rb
+++ b/spec/lib/gitlab/git/branch_spec.rb
@@ -3,9 +3,7 @@ require "spec_helper"
describe Gitlab::Git::Branch, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:rugged) do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged
- end
+ Rugged::Repository.new(File.join(TestEnv.repos_path, repository.relative_path))
end
subject { repository.branches }
@@ -74,9 +72,7 @@ describe Gitlab::Git::Branch, :seed_helper do
Gitlab::Git.committer_hash(email: user.email, name: user.name)
end
let(:params) do
- parents = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- [repository.rugged.head.target]
- end
+ parents = [rugged.head.target]
tree = parents.first.tree
{
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index 2718a3c5e49..6be35eee0fd 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -1,19 +1,17 @@
require "spec_helper"
describe Gitlab::Git::Commit, :seed_helper do
+ include GitHelpers
+
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
- let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
- let(:rugged_commit) do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.lookup(SeedRepo::Commit::ID)
- end
+ let(:rugged_repo) do
+ Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
end
+ let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
+ let(:rugged_commit) { rugged_repo.lookup(SeedRepo::Commit::ID) }
+
describe "Commit info" do
before do
- repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
- end
-
@committer = {
email: 'mike@smith.com',
name: "Mike Smith",
@@ -26,12 +24,12 @@ describe Gitlab::Git::Commit, :seed_helper do
time: Time.now
}
- @parents = [repo.head.target]
+ @parents = [rugged_repo.head.target]
@gitlab_parents = @parents.map { |c| described_class.find(repository, c.oid) }
@tree = @parents.first.tree
sha = Rugged::Commit.create(
- repo,
+ rugged_repo,
author: @author,
committer: @committer,
tree: @tree,
@@ -40,7 +38,7 @@ describe Gitlab::Git::Commit, :seed_helper do
update_ref: "HEAD"
)
- @raw_commit = repo.lookup(sha)
+ @raw_commit = rugged_repo.lookup(sha)
@commit = described_class.find(repository, sha)
end
@@ -61,10 +59,7 @@ describe Gitlab::Git::Commit, :seed_helper do
after do
# Erase the new commit so other tests get the original repo
- repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
- end
- repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
+ rugged_repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
end
end
@@ -99,7 +94,7 @@ describe Gitlab::Git::Commit, :seed_helper do
context 'body_size less than threshold' do
let(:body_size) { 123 }
- it 'fetches commit message seperately' do
+ it 'fetches commit message separately' do
expect(described_class).to receive(:get_message).with(repository, id)
commit.safe_message
@@ -120,9 +115,7 @@ describe Gitlab::Git::Commit, :seed_helper do
describe '.find' do
it "should return first head commit if without params" do
expect(described_class.last(repository).id).to eq(
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.head.target.oid
- end
+ rugged_repo.head.target.oid
)
end
diff --git a/spec/lib/gitlab/git/committer_with_hooks_spec.rb b/spec/lib/gitlab/git/committer_with_hooks_spec.rb
deleted file mode 100644
index c7626058acd..00000000000
--- a/spec/lib/gitlab/git/committer_with_hooks_spec.rb
+++ /dev/null
@@ -1,156 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::CommitterWithHooks, :seed_helper do
- # TODO https://gitlab.com/gitlab-org/gitaly/issues/1234
- skip 'needs to be moved to gitaly-ruby test suite' do
- shared_examples 'calling wiki hooks' do
- let(:project) { create(:project) }
- let(:user) { project.owner }
- let(:project_wiki) { ProjectWiki.new(project, user) }
- let(:wiki) { project_wiki.wiki }
- let(:options) do
- {
- id: user.id,
- username: user.username,
- name: user.name,
- email: user.email,
- message: 'commit message'
- }
- end
-
- subject { described_class.new(wiki, options) }
-
- before do
- project_wiki.create_page('home', 'test content')
- end
-
- shared_examples 'failing pre-receive hook' do
- before do
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('pre-receive').and_return([false, ''])
- expect_any_instance_of(Gitlab::Git::HooksService).not_to receive(:run_hook).with('update')
- expect_any_instance_of(Gitlab::Git::HooksService).not_to receive(:run_hook).with('post-receive')
- end
-
- it 'raises exception' do
- expect { subject.commit }.to raise_error(Gitlab::Git::Wiki::OperationError)
- end
-
- it 'does not create a new commit inside the repository' do
- current_rev = find_current_rev
-
- expect { subject.commit }.to raise_error(Gitlab::Git::Wiki::OperationError)
-
- expect(current_rev).to eq find_current_rev
- end
- end
-
- shared_examples 'failing update hook' do
- before do
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('pre-receive').and_return([true, ''])
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('update').and_return([false, ''])
- expect_any_instance_of(Gitlab::Git::HooksService).not_to receive(:run_hook).with('post-receive')
- end
-
- it 'raises exception' do
- expect { subject.commit }.to raise_error(Gitlab::Git::Wiki::OperationError)
- end
-
- it 'does not create a new commit inside the repository' do
- current_rev = find_current_rev
-
- expect { subject.commit }.to raise_error(Gitlab::Git::Wiki::OperationError)
-
- expect(current_rev).to eq find_current_rev
- end
- end
-
- shared_examples 'failing post-receive hook' do
- before do
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('pre-receive').and_return([true, ''])
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('update').and_return([true, ''])
- expect_any_instance_of(Gitlab::Git::HooksService).to receive(:run_hook).with('post-receive').and_return([false, ''])
- end
-
- it 'does not raise exception' do
- expect { subject.commit }.not_to raise_error
- end
-
- it 'creates the commit' do
- current_rev = find_current_rev
-
- subject.commit
-
- expect(current_rev).not_to eq find_current_rev
- end
- end
-
- shared_examples 'when hooks call succceeds' do
- let(:hook) { double(:hook) }
-
- it 'calls the three hooks' do
- expect(Gitlab::Git::Hook).to receive(:new).exactly(3).times.and_return(hook)
- expect(hook).to receive(:trigger).exactly(3).times.and_return([true, nil])
-
- subject.commit
- end
-
- it 'creates the commit' do
- current_rev = find_current_rev
-
- subject.commit
-
- expect(current_rev).not_to eq find_current_rev
- end
- end
-
- context 'when creating a page' do
- before do
- project_wiki.create_page('index', 'test content')
- end
-
- it_behaves_like 'failing pre-receive hook'
- it_behaves_like 'failing update hook'
- it_behaves_like 'failing post-receive hook'
- it_behaves_like 'when hooks call succceeds'
- end
-
- context 'when updating a page' do
- before do
- project_wiki.update_page(find_page('home'), content: 'some other content', format: :markdown)
- end
-
- it_behaves_like 'failing pre-receive hook'
- it_behaves_like 'failing update hook'
- it_behaves_like 'failing post-receive hook'
- it_behaves_like 'when hooks call succceeds'
- end
-
- context 'when deleting a page' do
- before do
- project_wiki.delete_page(find_page('home'))
- end
-
- it_behaves_like 'failing pre-receive hook'
- it_behaves_like 'failing update hook'
- it_behaves_like 'failing post-receive hook'
- it_behaves_like 'when hooks call succceeds'
- end
-
- def find_current_rev
- wiki.gollum_wiki.repo.commits.first&.sha
- end
-
- def find_page(name)
- wiki.page(title: name)
- end
- end
-
- context 'when Gitaly is enabled' do
- it_behaves_like 'calling wiki hooks'
- end
-
- context 'when Gitaly is disabled', :disable_gitaly do
- it_behaves_like 'calling wiki hooks'
- end
- end
-end
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 87d9fcee39e..8a4415506c4 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -2,12 +2,24 @@ require "spec_helper"
describe Gitlab::Git::Diff, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+ let(:gitaly_diff) do
+ Gitlab::GitalyClient::Diff.new(
+ from_path: '.gitmodules',
+ to_path: '.gitmodules',
+ old_mode: 0100644,
+ new_mode: 0100644,
+ from_id: '0792c58905eff3432b721f8c4a64363d8e28d9ae',
+ to_id: 'efd587ccb47caf5f31fc954edb21f0a713d9ecc3',
+ overflow_marker: false,
+ collapsed: false,
+ too_large: false,
+ patch: "@@ -4,3 +4,6 @@\n [submodule \"gitlab-shell\"]\n \tpath = gitlab-shell\n \turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n"
+ )
+ end
before do
@raw_diff_hash = {
diff: <<EOT.gsub(/^ {8}/, "").sub(/\n$/, ""),
- --- a/.gitmodules
- +++ b/.gitmodules
@@ -4,3 +4,6 @@
[submodule "gitlab-shell"]
\tpath = gitlab-shell
@@ -26,12 +38,6 @@ EOT
deleted_file: false,
too_large: false
}
-
- # TODO use a Gitaly diff object instead
- @rugged_diff = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.diff("5937ac0a7beb003549fc5fd26fc247adbce4a52e^", "5937ac0a7beb003549fc5fd26fc247adbce4a52e", paths:
- [".gitmodules"]).patches.first
- end
end
describe '.new' do
@@ -58,9 +64,22 @@ EOT
end
end
- context 'using a Rugged::Patch' do
+ context 'using a GitalyClient::Diff' do
+ let(:gitaly_diff) do
+ Gitlab::GitalyClient::Diff.new(
+ to_path: ".gitmodules",
+ from_path: ".gitmodules",
+ old_mode: 0100644,
+ new_mode: 0100644,
+ from_id: '357406f3075a57708d0163752905cc1576fceacc',
+ to_id: '8e5177d718c561d36efde08bad36b43687ee6bf0',
+ patch: raw_patch
+ )
+ end
+ let(:diff) { described_class.new(gitaly_diff) }
+
context 'with a small diff' do
- let(:diff) { described_class.new(@rugged_diff) }
+ let(:raw_patch) { @raw_diff_hash[:diff] }
it 'initializes the diff' do
expect(diff.to_hash).to eq(@raw_diff_hash)
@@ -72,28 +91,20 @@ EOT
end
context 'using a diff that is too large' do
- it 'prunes the diff' do
- expect_any_instance_of(String).to receive(:bytesize)
- .and_return(1024 * 1024 * 1024)
-
- diff = described_class.new(@rugged_diff)
+ let(:raw_patch) { 'a' * 204800 }
+ it 'prunes the diff' do
expect(diff.diff).to be_empty
expect(diff).to be_too_large
end
end
context 'using a collapsable diff that is too large' do
- before do
- # The patch total size is 200, with lines between 21 and 54.
- # This is a quick-and-dirty way to test this. Ideally, a new patch is
- # added to the test repo with a size that falls between the real limits.
- stub_const("#{described_class}::SIZE_LIMIT", 150)
- stub_const("#{described_class}::COLLAPSE_LIMIT", 100)
- end
+ let(:raw_patch) { 'a' * 204800 }
it 'prunes the diff as a large diff instead of as a collapsed diff' do
- diff = described_class.new(@rugged_diff, expanded: false)
+ gitaly_diff.too_large = true
+ diff = described_class.new(gitaly_diff, expanded: false)
expect(diff.diff).to be_empty
expect(diff).to be_too_large
@@ -101,54 +112,6 @@ EOT
end
end
- context 'using a large binary diff' do
- it 'does not prune the diff' do
- expect_any_instance_of(Rugged::Diff::Delta).to receive(:binary?)
- .and_return(true)
-
- diff = described_class.new(@rugged_diff)
-
- expect(diff.diff).not_to be_empty
- end
- end
- end
-
- context 'using a GitalyClient::Diff' do
- let(:diff) do
- described_class.new(
- Gitlab::GitalyClient::Diff.new(
- to_path: ".gitmodules",
- from_path: ".gitmodules",
- old_mode: 0100644,
- new_mode: 0100644,
- from_id: '357406f3075a57708d0163752905cc1576fceacc',
- to_id: '8e5177d718c561d36efde08bad36b43687ee6bf0',
- patch: raw_patch
- )
- )
- end
-
- context 'with a small diff' do
- let(:raw_patch) { @raw_diff_hash[:diff] }
-
- it 'initializes the diff' do
- expect(diff.to_hash).to eq(@raw_diff_hash)
- end
-
- it 'does not prune the diff' do
- expect(diff).not_to be_too_large
- end
- end
-
- context 'using a diff that is too large' do
- let(:raw_patch) { 'a' * 204800 }
-
- it 'prunes the diff' do
- expect(diff.diff).to be_empty
- expect(diff).to be_too_large
- end
- end
-
context 'when the patch passed is not UTF-8-encoded' do
let(:raw_patch) { @raw_diff_hash[:diff].encode(Encoding::ASCII_8BIT) }
@@ -259,31 +222,37 @@ EOT
end
it 'leave non-binary diffs as-is' do
- diff = described_class.new(@rugged_diff)
+ diff = described_class.new(gitaly_diff)
expect(diff.json_safe_diff).to eq(diff.diff)
end
end
describe '#submodule?' do
- before do
- # TODO use a Gitaly diff object instead
- rugged_commit = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.rev_parse('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
- end
-
- @diffs = rugged_commit.parents[0].diff(rugged_commit).patches
+ let(:gitaly_submodule_diff) do
+ Gitlab::GitalyClient::Diff.new(
+ from_path: 'gitlab-grack',
+ to_path: 'gitlab-grack',
+ old_mode: 0,
+ new_mode: 57344,
+ from_id: '0000000000000000000000000000000000000000',
+ to_id: '645f6c4c82fd3f5e06f67134450a570b795e55a6',
+ overflow_marker: false,
+ collapsed: false,
+ too_large: false,
+ patch: "@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n"
+ )
end
- it { expect(described_class.new(@diffs[0]).submodule?).to eq(false) }
- it { expect(described_class.new(@diffs[1]).submodule?).to eq(true) }
+ it { expect(described_class.new(gitaly_diff).submodule?).to eq(false) }
+ it { expect(described_class.new(gitaly_submodule_diff).submodule?).to eq(true) }
end
describe '#line_count' do
it 'returns the correct number of lines' do
- diff = described_class.new(@rugged_diff)
+ diff = described_class.new(gitaly_diff)
- expect(diff.line_count).to eq(9)
+ expect(diff.line_count).to eq(7)
end
end
diff --git a/spec/lib/gitlab/git/diff_stats_collection_spec.rb b/spec/lib/gitlab/git/diff_stats_collection_spec.rb
new file mode 100644
index 00000000000..b07690ef39c
--- /dev/null
+++ b/spec/lib/gitlab/git/diff_stats_collection_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+describe Gitlab::Git::DiffStatsCollection do
+ let(:stats_a) do
+ double(Gitaly::DiffStats, additions: 10, deletions: 15, path: 'foo')
+ end
+
+ let(:stats_b) do
+ double(Gitaly::DiffStats, additions: 5, deletions: 1, path: 'bar')
+ end
+
+ let(:diff_stats) { [stats_a, stats_b] }
+ let(:collection) { described_class.new(diff_stats) }
+
+ describe '#find_by_path' do
+ it 'returns stats by path when found' do
+ expect(collection.find_by_path('foo')).to eq(stats_a)
+ end
+
+ it 'returns nil when stats is not found by path' do
+ expect(collection.find_by_path('no-file')).to be_nil
+ end
+ end
+
+ describe '#paths' do
+ it 'returns only modified paths' do
+ expect(collection.paths).to eq %w[foo bar]
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/gitlab_projects_spec.rb b/spec/lib/gitlab/git/gitlab_projects_spec.rb
deleted file mode 100644
index f5d8503c30c..00000000000
--- a/spec/lib/gitlab/git/gitlab_projects_spec.rb
+++ /dev/null
@@ -1,321 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::GitlabProjects do
- after do
- TestEnv.clean_test_path
- end
-
- around do |example|
- # TODO move this spec to gitaly-ruby. GitlabProjects is not used in gitlab-ce
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- let(:project) { create(:project, :repository) }
-
- if $VERBOSE
- let(:logger) { Logger.new(STDOUT) }
- else
- let(:logger) { double('logger').as_null_object }
- end
-
- let(:tmp_repos_path) { TestEnv.repos_path }
- let(:repo_name) { project.disk_path + '.git' }
- let(:tmp_repo_path) { File.join(tmp_repos_path, repo_name) }
- let(:gl_projects) { build_gitlab_projects(TestEnv::REPOS_STORAGE, repo_name) }
-
- describe '#initialize' do
- it { expect(gl_projects.shard_path).to eq(tmp_repos_path) }
- it { expect(gl_projects.repository_relative_path).to eq(repo_name) }
- it { expect(gl_projects.repository_absolute_path).to eq(File.join(tmp_repos_path, repo_name)) }
- it { expect(gl_projects.logger).to eq(logger) }
- end
-
- describe '#push_branches' do
- let(:remote_name) { 'remote-name' }
- let(:branch_name) { 'master' }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} push -- #{remote_name} #{branch_name}) }
- let(:force) { false }
-
- subject { gl_projects.push_branches(remote_name, 600, force, [branch_name]) }
-
- it 'executes the command' do
- stub_spawn(cmd, 600, tmp_repo_path, success: true)
-
- is_expected.to be_truthy
- end
-
- it 'fails' do
- stub_spawn(cmd, 600, tmp_repo_path, success: false)
-
- is_expected.to be_falsy
- end
-
- context 'with --force' do
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} push --force -- #{remote_name} #{branch_name}) }
- let(:force) { true }
-
- it 'executes the command' do
- stub_spawn(cmd, 600, tmp_repo_path, success: true)
-
- is_expected.to be_truthy
- end
- end
- end
-
- describe '#fetch_remote' do
- let(:remote_name) { 'remote-name' }
- let(:branch_name) { 'master' }
- let(:force) { false }
- let(:prune) { true }
- let(:tags) { true }
- let(:args) { { force: force, tags: tags, prune: prune }.merge(extra_args) }
- let(:extra_args) { {} }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} fetch #{remote_name} --quiet --prune --tags) }
-
- subject { gl_projects.fetch_remote(remote_name, 600, args) }
-
- def stub_tempfile(name, filename, opts = {})
- chmod = opts.delete(:chmod)
- file = StringIO.new
-
- allow(file).to receive(:close!)
- allow(file).to receive(:path).and_return(name)
-
- expect(Tempfile).to receive(:new).with(filename).and_return(file)
- expect(file).to receive(:chmod).with(chmod) if chmod
-
- file
- end
-
- context 'with default args' do
- it 'executes the command' do
- stub_spawn(cmd, 600, tmp_repo_path, {}, success: true)
-
- is_expected.to be_truthy
- end
-
- it 'fails' do
- stub_spawn(cmd, 600, tmp_repo_path, {}, success: false)
-
- is_expected.to be_falsy
- end
- end
-
- context 'with --force' do
- let(:force) { true }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} fetch #{remote_name} --quiet --prune --force --tags) }
-
- it 'executes the command with forced option' do
- stub_spawn(cmd, 600, tmp_repo_path, {}, success: true)
-
- is_expected.to be_truthy
- end
- end
-
- context 'with --no-tags' do
- let(:tags) { false }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} fetch #{remote_name} --quiet --prune --no-tags) }
-
- it 'executes the command' do
- stub_spawn(cmd, 600, tmp_repo_path, {}, success: true)
-
- is_expected.to be_truthy
- end
- end
-
- context 'with no prune' do
- let(:prune) { false }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} fetch #{remote_name} --quiet --tags) }
-
- it 'executes the command' do
- stub_spawn(cmd, 600, tmp_repo_path, {}, success: true)
-
- is_expected.to be_truthy
- end
- end
-
- describe 'with an SSH key' do
- let(:extra_args) { { ssh_key: 'SSH KEY' } }
-
- it 'sets GIT_SSH to a custom script' do
- script = stub_tempfile('scriptFile', 'gitlab-shell-ssh-wrapper', chmod: 0o755)
- key = stub_tempfile('/tmp files/keyFile', 'gitlab-shell-key-file', chmod: 0o400)
-
- stub_spawn(cmd, 600, tmp_repo_path, { 'GIT_SSH' => 'scriptFile' }, success: true)
-
- is_expected.to be_truthy
-
- expect(script.string).to eq("#!/bin/sh\nexec ssh '-oIdentityFile=\"/tmp files/keyFile\"' '-oIdentitiesOnly=\"yes\"' \"$@\"")
- expect(key.string).to eq('SSH KEY')
- end
- end
-
- describe 'with known_hosts data' do
- let(:extra_args) { { known_hosts: 'KNOWN HOSTS' } }
-
- it 'sets GIT_SSH to a custom script' do
- script = stub_tempfile('scriptFile', 'gitlab-shell-ssh-wrapper', chmod: 0o755)
- key = stub_tempfile('/tmp files/knownHosts', 'gitlab-shell-known-hosts', chmod: 0o400)
-
- stub_spawn(cmd, 600, tmp_repo_path, { 'GIT_SSH' => 'scriptFile' }, success: true)
-
- is_expected.to be_truthy
-
- expect(script.string).to eq("#!/bin/sh\nexec ssh '-oStrictHostKeyChecking=\"yes\"' '-oUserKnownHostsFile=\"/tmp files/knownHosts\"' \"$@\"")
- expect(key.string).to eq('KNOWN HOSTS')
- end
- end
- end
-
- describe '#import_project' do
- let(:project) { create(:project) }
- let(:import_url) { TestEnv.factory_repo_path_bare }
- let(:cmd) { %W(#{Gitlab.config.git.bin_path} clone --bare -- #{import_url} #{tmp_repo_path}) }
- let(:timeout) { 600 }
-
- subject { gl_projects.import_project(import_url, timeout) }
-
- shared_examples 'importing repository' do
- context 'success import' do
- it 'imports a repo' do
- expect(File.exist?(File.join(tmp_repo_path, 'HEAD'))).to be_falsy
-
- is_expected.to be_truthy
-
- expect(File.exist?(File.join(tmp_repo_path, 'HEAD'))).to be_truthy
- end
- end
-
- context 'already exists' do
- it "doesn't import" do
- FileUtils.mkdir_p(tmp_repo_path)
-
- is_expected.to be_falsy
- end
- end
- end
-
- describe 'logging' do
- it 'imports a repo' do
- message = "Importing project from <#{import_url}> to <#{tmp_repo_path}>."
- expect(logger).to receive(:info).with(message)
-
- subject
- end
- end
-
- context 'timeout' do
- it 'does not import a repo' do
- stub_spawn_timeout(cmd, timeout, nil)
-
- message = "Importing project from <#{import_url}> to <#{tmp_repo_path}> failed."
- expect(logger).to receive(:error).with(message)
-
- is_expected.to be_falsy
-
- expect(gl_projects.output).to eq("Timed out\n")
- expect(File.exist?(File.join(tmp_repo_path, 'HEAD'))).to be_falsy
- end
- end
-
- it_behaves_like 'importing repository'
- end
-
- describe '#fork_repository' do
- let(:dest_repos) { TestEnv::REPOS_STORAGE }
- let(:dest_repos_path) { tmp_repos_path }
- let(:dest_repo_name) { File.join('@hashed', 'aa', 'bb', 'xyz.git') }
- let(:dest_repo) { File.join(dest_repos_path, dest_repo_name) }
-
- subject { gl_projects.fork_repository(dest_repos, dest_repo_name) }
-
- before do
- FileUtils.mkdir_p(dest_repos_path)
- end
-
- after do
- FileUtils.rm_rf(dest_repos_path)
- end
-
- shared_examples 'forking a repository' do
- it 'forks the repository' do
- is_expected.to be_truthy
-
- expect(File.exist?(dest_repo)).to be_truthy
- expect(File.exist?(File.join(dest_repo, 'hooks', 'pre-receive'))).to be_truthy
- expect(File.exist?(File.join(dest_repo, 'hooks', 'post-receive'))).to be_truthy
- end
-
- it 'does not fork if a project of the same name already exists' do
- # create a fake project at the intended destination
- FileUtils.mkdir_p(dest_repo)
-
- is_expected.to be_falsy
- end
- end
-
- it_behaves_like 'forking a repository'
-
- # We seem to be stuck to having only one working Gitaly storage in tests, changing
- # that is not very straight-forward so I'm leaving this test here for now till
- # https://gitlab.com/gitlab-org/gitlab-ce/issues/41393 is fixed.
- context 'different storages' do
- let(:dest_repos) { 'alternative' }
- let(:dest_repos_path) { File.join(File.dirname(tmp_repos_path), dest_repos) }
-
- before do
- stub_storage_settings(dest_repos => { 'path' => dest_repos_path })
- end
-
- it 'forks the repo' do
- is_expected.to be_truthy
-
- expect(File.exist?(dest_repo)).to be_truthy
- expect(File.exist?(File.join(dest_repo, 'hooks', 'pre-receive'))).to be_truthy
- expect(File.exist?(File.join(dest_repo, 'hooks', 'post-receive'))).to be_truthy
- end
- end
-
- describe 'log messages' do
- describe 'successful fork' do
- it do
- message = "Forking repository from <#{tmp_repo_path}> to <#{dest_repo}>."
- expect(logger).to receive(:info).with(message)
-
- subject
- end
- end
-
- describe 'failed fork due existing destination' do
- it do
- FileUtils.mkdir_p(dest_repo)
- message = "fork-repository failed: destination repository <#{dest_repo}> already exists."
- expect(logger).to receive(:error).with(message)
-
- subject
- end
- end
- end
- end
-
- def build_gitlab_projects(*args)
- described_class.new(
- *args,
- global_hooks_path: Gitlab.config.gitlab_shell.hooks_path,
- logger: logger
- )
- end
-
- def stub_spawn(*args, success: true)
- exitstatus = success ? 0 : nil
- expect(gl_projects).to receive(:popen_with_timeout).with(*args)
- .and_return(["output", exitstatus])
- end
-
- def stub_spawn_timeout(*args)
- expect(gl_projects).to receive(:popen_with_timeout).with(*args)
- .and_raise(Timeout::Error)
- end
-end
diff --git a/spec/lib/gitlab/git/hook_env_spec.rb b/spec/lib/gitlab/git/hook_env_spec.rb
index e6aa5ad8c90..5e49ea6da7a 100644
--- a/spec/lib/gitlab/git/hook_env_spec.rb
+++ b/spec/lib/gitlab/git/hook_env_spec.rb
@@ -4,11 +4,7 @@ describe Gitlab::Git::HookEnv do
let(:gl_repository) { 'project-123' }
describe ".set" do
- context 'with RequestStore.store disabled' do
- before do
- allow(RequestStore).to receive(:active?).and_return(false)
- end
-
+ context 'with RequestStore disabled' do
it 'does not store anything' do
described_class.set(gl_repository, GIT_OBJECT_DIRECTORY_RELATIVE: 'foo')
@@ -16,11 +12,7 @@ describe Gitlab::Git::HookEnv do
end
end
- context 'with RequestStore.store enabled' do
- before do
- allow(RequestStore).to receive(:active?).and_return(true)
- end
-
+ context 'with RequestStore enabled', :request_store do
it 'whitelist some `GIT_*` variables and stores them using RequestStore' do
described_class.set(
gl_repository,
@@ -41,9 +33,8 @@ describe Gitlab::Git::HookEnv do
end
describe ".all" do
- context 'with RequestStore.store enabled' do
+ context 'with RequestStore enabled', :request_store do
before do
- allow(RequestStore).to receive(:active?).and_return(true)
described_class.set(
gl_repository,
GIT_OBJECT_DIRECTORY_RELATIVE: 'foo',
@@ -60,7 +51,7 @@ describe Gitlab::Git::HookEnv do
end
describe ".to_env_hash" do
- context 'with RequestStore.store enabled' do
+ context 'with RequestStore enabled', :request_store do
using RSpec::Parameterized::TableSyntax
let(:key) { 'GIT_OBJECT_DIRECTORY_RELATIVE' }
@@ -76,7 +67,6 @@ describe Gitlab::Git::HookEnv do
with_them do
before do
- allow(RequestStore).to receive(:active?).and_return(true)
described_class.set(gl_repository, key.to_sym => input)
end
@@ -92,7 +82,7 @@ describe Gitlab::Git::HookEnv do
end
describe 'thread-safety' do
- context 'with RequestStore.store enabled' do
+ context 'with RequestStore enabled', :request_store do
before do
allow(RequestStore).to receive(:active?).and_return(true)
described_class.set(gl_repository, GIT_OBJECT_DIRECTORY_RELATIVE: 'foo')
diff --git a/spec/lib/gitlab/git/hook_spec.rb b/spec/lib/gitlab/git/hook_spec.rb
deleted file mode 100644
index a45c8510b15..00000000000
--- a/spec/lib/gitlab/git/hook_spec.rb
+++ /dev/null
@@ -1,111 +0,0 @@
-require 'spec_helper'
-require 'fileutils'
-
-describe Gitlab::Git::Hook do
- before do
- # We need this because in the spec/spec_helper.rb we define it like this:
- # allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
- allow_any_instance_of(described_class).to receive(:trigger).and_call_original
- end
-
- around do |example|
- # TODO move hook tests to gitaly-ruby. Hook will disappear from gitlab-ce
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- describe "#trigger" do
- set(:project) { create(:project, :repository) }
- let(:repository) { project.repository.raw_repository }
- let(:repo_path) { repository.path }
- let(:hooks_dir) { File.join(repo_path, 'hooks') }
- let(:user) { create(:user) }
- let(:gl_id) { Gitlab::GlId.gl_id(user) }
- let(:gl_username) { user.username }
-
- def create_hook(name)
- FileUtils.mkdir_p(hooks_dir)
- hook_path = File.join(hooks_dir, name)
- File.open(hook_path, 'w', 0755) do |f|
- f.write(<<~HOOK)
- #!/bin/sh
- exit 0
- HOOK
- end
- end
-
- def create_failing_hook(name)
- FileUtils.mkdir_p(hooks_dir)
- hook_path = File.join(hooks_dir, name)
- File.open(hook_path, 'w', 0755) do |f|
- f.write(<<~HOOK)
- #!/bin/sh
- echo 'regular message from the hook'
- echo 'error message from the hook' 1>&2
- echo 'error message from the hook line 2' 1>&2
- exit 1
- HOOK
- end
- end
-
- ['pre-receive', 'post-receive', 'update'].each do |hook_name|
- context "when triggering a #{hook_name} hook" do
- context "when the hook is successful" do
- let(:hook_path) { File.join(hooks_dir, hook_name) }
- let(:gl_repository) { Gitlab::GlRepository.gl_repository(project, false) }
- let(:env) do
- {
- 'GL_ID' => gl_id,
- 'GL_USERNAME' => gl_username,
- 'PWD' => repo_path,
- 'GL_PROTOCOL' => 'web',
- 'GL_REPOSITORY' => gl_repository
- }
- end
-
- it "returns success with no errors" do
- create_hook(hook_name)
- hook = described_class.new(hook_name, repository)
- blank = Gitlab::Git::BLANK_SHA
- ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
-
- if hook_name != 'update'
- expect(Open3).to receive(:popen3)
- .with(env, hook_path, chdir: repo_path).and_call_original
- end
-
- status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
- expect(status).to be true
- expect(errors).to be_blank
- end
- end
-
- context "when the hook is unsuccessful" do
- it "returns failure with errors" do
- create_failing_hook(hook_name)
- hook = described_class.new(hook_name, repository)
- blank = Gitlab::Git::BLANK_SHA
- ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
-
- status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
- expect(status).to be false
- expect(errors).to eq("error message from the hook\nerror message from the hook line 2\n")
- end
- end
- end
- end
-
- context "when the hook doesn't exist" do
- it "returns success with no errors" do
- hook = described_class.new('unknown_hook', repository)
- blank = Gitlab::Git::BLANK_SHA
- ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
-
- status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
- expect(status).to be true
- expect(errors).to be_nil
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git/hooks_service_spec.rb b/spec/lib/gitlab/git/hooks_service_spec.rb
deleted file mode 100644
index 55ffced36ac..00000000000
--- a/spec/lib/gitlab/git/hooks_service_spec.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::HooksService, :seed_helper do
- let(:gl_id) { 'user-456' }
- let(:gl_username) { 'janedoe' }
- let(:user) { Gitlab::Git::User.new(gl_username, 'Jane Doe', 'janedoe@example.com', gl_id) }
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, 'project-123') }
- let(:service) { described_class.new }
- let(:blankrev) { Gitlab::Git::BLANK_SHA }
- let(:oldrev) { SeedRepo::Commit::PARENT_ID }
- let(:newrev) { SeedRepo::Commit::ID }
- let(:ref) { 'refs/heads/feature' }
-
- describe '#execute' do
- context 'when receive hooks were successful' do
- let(:hook) { double(:hook) }
-
- it 'calls all three hooks' do
- expect(Gitlab::Git::Hook).to receive(:new).exactly(3).times.and_return(hook)
- expect(hook).to receive(:trigger).with(gl_id, gl_username, blankrev, newrev, ref)
- .exactly(3).times.and_return([true, nil])
-
- service.execute(user, repository, blankrev, newrev, ref) { }
- end
- end
-
- context 'when pre-receive hook failed' do
- it 'does not call post-receive hook' do
- expect(service).to receive(:run_hook).with('pre-receive').and_return([false, 'hello world'])
- expect(service).not_to receive(:run_hook).with('post-receive')
-
- expect do
- service.execute(user, repository, blankrev, newrev, ref)
- end.to raise_error(Gitlab::Git::PreReceiveError, 'hello world')
- end
- end
-
- context 'when update hook failed' do
- it 'does not call post-receive hook' do
- expect(service).to receive(:run_hook).with('pre-receive').and_return([true, nil])
- expect(service).to receive(:run_hook).with('update').and_return([false, 'hello world'])
- expect(service).not_to receive(:run_hook).with('post-receive')
-
- expect do
- service.execute(user, repository, blankrev, newrev, ref)
- end.to raise_error(Gitlab::Git::PreReceiveError, 'hello world')
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git/index_spec.rb b/spec/lib/gitlab/git/index_spec.rb
deleted file mode 100644
index c4edd6961e1..00000000000
--- a/spec/lib/gitlab/git/index_spec.rb
+++ /dev/null
@@ -1,239 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Index, :seed_helper do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
- let(:index) { described_class.new(repository) }
-
- before do
- index.read_tree(lookup('master').tree)
- end
-
- around do |example|
- # TODO move these specs to gitaly-ruby. The Index class will disappear from gitlab-ce
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- describe '#create' do
- let(:options) do
- {
- content: 'Lorem ipsum...',
- file_path: 'documents/story.txt'
- }
- end
-
- context 'when no file at that path exists' do
- it 'creates the file in the index' do
- index.create(options)
-
- entry = index.get(options[:file_path])
-
- expect(entry).not_to be_nil
- expect(lookup(entry[:oid]).content).to eq(options[:content])
- end
- end
-
- context 'when a file at that path exists' do
- before do
- options[:file_path] = 'files/executables/ls'
- end
-
- it 'raises an error' do
- expect { index.create(options) }.to raise_error('A file with this name already exists')
- end
- end
-
- context 'when content is in base64' do
- before do
- options[:content] = Base64.encode64(options[:content])
- options[:encoding] = 'base64'
- end
-
- it 'decodes base64' do
- index.create(options)
-
- entry = index.get(options[:file_path])
- expect(lookup(entry[:oid]).content).to eq(Base64.decode64(options[:content]))
- end
- end
-
- context 'when content contains CRLF' do
- before do
- repository.autocrlf = :input
- options[:content] = "Hello,\r\nWorld"
- end
-
- it 'converts to LF' do
- index.create(options)
-
- entry = index.get(options[:file_path])
- expect(lookup(entry[:oid]).content).to eq("Hello,\nWorld")
- end
- end
- end
-
- describe '#create_dir' do
- let(:options) do
- {
- file_path: 'newdir'
- }
- end
-
- context 'when no file or dir at that path exists' do
- it 'creates the dir in the index' do
- index.create_dir(options)
-
- entry = index.get(options[:file_path] + '/.gitkeep')
-
- expect(entry).not_to be_nil
- end
- end
-
- context 'when a file at that path exists' do
- before do
- options[:file_path] = 'files/executables/ls'
- end
-
- it 'raises an error' do
- expect { index.create_dir(options) }.to raise_error('A file with this name already exists')
- end
- end
-
- context 'when a directory at that path exists' do
- before do
- options[:file_path] = 'files/executables'
- end
-
- it 'raises an error' do
- expect { index.create_dir(options) }.to raise_error('A directory with this name already exists')
- end
- end
- end
-
- describe '#update' do
- let(:options) do
- {
- content: 'Lorem ipsum...',
- file_path: 'README.md'
- }
- end
-
- context 'when no file at that path exists' do
- before do
- options[:file_path] = 'documents/story.txt'
- end
-
- it 'raises an error' do
- expect { index.update(options) }.to raise_error("A file with this name doesn't exist")
- end
- end
-
- context 'when a file at that path exists' do
- it 'updates the file in the index' do
- index.update(options)
-
- entry = index.get(options[:file_path])
-
- expect(lookup(entry[:oid]).content).to eq(options[:content])
- end
-
- it 'preserves file mode' do
- options[:file_path] = 'files/executables/ls'
-
- index.update(options)
-
- entry = index.get(options[:file_path])
-
- expect(entry[:mode]).to eq(0100755)
- end
- end
- end
-
- describe '#move' do
- let(:options) do
- {
- content: 'Lorem ipsum...',
- previous_path: 'README.md',
- file_path: 'NEWREADME.md'
- }
- end
-
- context 'when no file at that path exists' do
- it 'raises an error' do
- options[:previous_path] = 'documents/story.txt'
-
- expect { index.move(options) }.to raise_error("A file with this name doesn't exist")
- end
- end
-
- context 'when a file at the new path already exists' do
- it 'raises an error' do
- options[:file_path] = 'CHANGELOG'
-
- expect { index.move(options) }.to raise_error("A file with this name already exists")
- end
- end
-
- context 'when a file at that path exists' do
- it 'removes the old file in the index' do
- index.move(options)
-
- entry = index.get(options[:previous_path])
-
- expect(entry).to be_nil
- end
-
- it 'creates the new file in the index' do
- index.move(options)
-
- entry = index.get(options[:file_path])
-
- expect(entry).not_to be_nil
- expect(lookup(entry[:oid]).content).to eq(options[:content])
- end
-
- it 'preserves file mode' do
- options[:previous_path] = 'files/executables/ls'
-
- index.move(options)
-
- entry = index.get(options[:file_path])
-
- expect(entry[:mode]).to eq(0100755)
- end
- end
- end
-
- describe '#delete' do
- let(:options) do
- {
- file_path: 'README.md'
- }
- end
-
- context 'when no file at that path exists' do
- before do
- options[:file_path] = 'documents/story.txt'
- end
-
- it 'raises an error' do
- expect { index.delete(options) }.to raise_error("A file with this name doesn't exist")
- end
- end
-
- context 'when a file at that path exists' do
- it 'removes the file in the index' do
- index.delete(options)
-
- entry = index.get(options[:file_path])
-
- expect(entry).to be_nil
- end
- end
- end
-
- def lookup(revision)
- repository.rugged.rev_parse(revision)
- end
-end
diff --git a/spec/lib/gitlab/git/lfs_changes_spec.rb b/spec/lib/gitlab/git/lfs_changes_spec.rb
index c5e7ab959b2..d035df7e0c2 100644
--- a/spec/lib/gitlab/git/lfs_changes_spec.rb
+++ b/spec/lib/gitlab/git/lfs_changes_spec.rb
@@ -15,5 +15,9 @@ describe Gitlab::Git::LfsChanges do
it 'limits new_objects using object_limit' do
expect(subject.new_pointers(object_limit: 1)).to eq([])
end
+
+ it 'times out if given a small dynamic timeout' do
+ expect { subject.new_pointers(dynamic_timeout: 0.001) }.to raise_error(GRPC::DeadlineExceeded)
+ end
end
end
diff --git a/spec/lib/gitlab/git/patches/collection_spec.rb b/spec/lib/gitlab/git/patches/collection_spec.rb
new file mode 100644
index 00000000000..080be141c59
--- /dev/null
+++ b/spec/lib/gitlab/git/patches/collection_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Gitlab::Git::Patches::Collection do
+ let(:patches_folder) { Rails.root.join('spec/fixtures/patchfiles') }
+ let(:patch_content1) do
+ File.read(File.join(patches_folder, "0001-This-does-not-apply-to-the-feature-branch.patch"))
+ end
+ let(:patch_content2) do
+ File.read(File.join(patches_folder, "0001-A-commit-from-a-patch.patch"))
+ end
+
+ subject(:collection) { described_class.new([patch_content1, patch_content2]) }
+
+ describe '#size' do
+ it 'combines the size of the patches' do
+ expect(collection.size).to eq(549.bytes + 424.bytes)
+ end
+ end
+
+ describe '#valid_size?' do
+ it 'is not valid if the total size is bigger than 2MB' do
+ expect(collection).to receive(:size).and_return(2500.kilobytes)
+
+ expect(collection).not_to be_valid_size
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/patches/commit_patches_spec.rb b/spec/lib/gitlab/git/patches/commit_patches_spec.rb
new file mode 100644
index 00000000000..760112155ce
--- /dev/null
+++ b/spec/lib/gitlab/git/patches/commit_patches_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Gitlab::Git::Patches::CommitPatches do
+ describe '#commit' do
+ let(:patches) do
+ patches_folder = Rails.root.join('spec/fixtures/patchfiles')
+ content_1 = File.read(File.join(patches_folder, "0001-This-does-not-apply-to-the-feature-branch.patch"))
+ content_2 = File.read(File.join(patches_folder, "0001-A-commit-from-a-patch.patch"))
+
+ Gitlab::Git::Patches::Collection.new([content_1, content_2])
+ end
+ let(:user) { build(:user) }
+ let(:branch_name) { 'branch-with-patches' }
+ let(:repository) { create(:project, :repository).repository }
+
+ subject(:commit_patches) do
+ described_class.new(user, repository, branch_name, patches)
+ end
+
+ it 'applies the patches' do
+ new_rev = commit_patches.commit
+
+ expect(repository.commit(new_rev)).not_to be_nil
+ end
+
+ it 'updates the branch cache' do
+ expect(repository).to receive(:after_create_branch)
+
+ commit_patches.commit
+ end
+
+ context 'when the repository does not exist' do
+ let(:repository) { create(:project).repository }
+
+ it 'raises the correct error' do
+ expect { commit_patches.commit }.to raise_error(Gitlab::Git::Repository::NoRepository)
+ end
+ end
+
+ context 'when the patch does not apply' do
+ let(:branch_name) { 'feature' }
+
+ it 'raises the correct error' do
+ expect { commit_patches.commit }.to raise_error(Gitlab::Git::CommandError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/patches/patch_spec.rb b/spec/lib/gitlab/git/patches/patch_spec.rb
new file mode 100644
index 00000000000..7466e853b65
--- /dev/null
+++ b/spec/lib/gitlab/git/patches/patch_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Gitlab::Git::Patches::Patch do
+ let(:patches_folder) { Rails.root.join('spec/fixtures/patchfiles') }
+ let(:patch_content) do
+ File.read(File.join(patches_folder, "0001-This-does-not-apply-to-the-feature-branch.patch"))
+ end
+ let(:patch) { described_class.new(patch_content) }
+
+ describe '#size' do
+ it 'is correct' do
+ expect(patch.size).to eq(549.bytes)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/popen_spec.rb b/spec/lib/gitlab/git/popen_spec.rb
deleted file mode 100644
index 074e66d2a5d..00000000000
--- a/spec/lib/gitlab/git/popen_spec.rb
+++ /dev/null
@@ -1,179 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::Git::Popen' do
- let(:path) { Rails.root.join('tmp').to_s }
- let(:test_string) { 'The quick brown fox jumped over the lazy dog' }
- # The pipe buffer is typically 64K. This string is about 440K.
- let(:spew_command) { ['bash', '-c', "for i in {1..10000}; do echo '#{test_string}' 1>&2; done"] }
-
- let(:klass) do
- Class.new(Object) do
- include Gitlab::Git::Popen
- end
- end
-
- context 'popen' do
- context 'zero status' do
- let(:result) { klass.new.popen(%w(ls), path) }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to be_zero }
- it { expect(output).to include('tests') }
- end
-
- context 'non-zero status' do
- let(:result) { klass.new.popen(%w(cat NOTHING), path) }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to eq(1) }
- it { expect(output).to include('No such file or directory') }
- end
-
- context 'unsafe string command' do
- it 'raises an error when it gets called with a string argument' do
- expect { klass.new.popen('ls', path) }.to raise_error(RuntimeError)
- end
- end
-
- context 'with custom options' do
- let(:vars) { { 'foobar' => 123, 'PWD' => path } }
- let(:options) { { chdir: path } }
-
- it 'calls popen3 with the provided environment variables' do
- expect(Open3).to receive(:popen3).with(vars, 'ls', options)
-
- klass.new.popen(%w(ls), path, { 'foobar' => 123 })
- end
- end
-
- context 'use stdin' do
- let(:result) { klass.new.popen(%w[cat], path) { |stdin| stdin.write 'hello' } }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to be_zero }
- it { expect(output).to eq('hello') }
- end
-
- context 'with lazy block' do
- it 'yields a lazy io' do
- expect_lazy_io = lambda do |io|
- expect(io).to be_a Enumerator::Lazy
- expect(io.inspect).to include('#<IO:fd')
- end
-
- klass.new.popen(%w[ls], path, lazy_block: expect_lazy_io)
- end
-
- it "doesn't wait for process exit" do
- Timeout.timeout(2) do
- klass.new.popen(%w[yes], path, lazy_block: ->(io) {})
- end
- end
- end
-
- context 'with a process that writes a lot of data to stderr' do
- it 'returns zero' do
- output, status = klass.new.popen(spew_command, path)
-
- expect(output).to include(test_string)
- expect(status).to eq(0)
- end
- end
- end
-
- context 'popen_with_timeout' do
- let(:timeout) { 1.second }
-
- context 'no timeout' do
- context 'zero status' do
- let(:result) { klass.new.popen_with_timeout(%w(ls), timeout, path) }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to be_zero }
- it { expect(output).to include('tests') }
- end
-
- context 'multi-line string' do
- let(:test_string) { "this is 1 line\n2nd line\n3rd line\n" }
- let(:result) { klass.new.popen_with_timeout(['echo', test_string], timeout, path) }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to be_zero }
- # echo adds its own line
- it { expect(output).to eq(test_string + "\n") }
- end
-
- context 'non-zero status' do
- let(:result) { klass.new.popen_with_timeout(%w(cat NOTHING), timeout, path) }
- let(:output) { result.first }
- let(:status) { result.last }
-
- it { expect(status).to eq(1) }
- it { expect(output).to include('No such file or directory') }
- end
-
- context 'unsafe string command' do
- it 'raises an error when it gets called with a string argument' do
- expect { klass.new.popen_with_timeout('ls', timeout, path) }.to raise_error(RuntimeError)
- end
- end
- end
-
- context 'timeout' do
- context 'timeout' do
- it "raises a Timeout::Error" do
- expect { klass.new.popen_with_timeout(%w(sleep 1000), timeout, path) }.to raise_error(Timeout::Error)
- end
-
- it "handles processes that do not shutdown correctly" do
- expect { klass.new.popen_with_timeout(['bash', '-c', "trap -- '' SIGTERM; sleep 1000"], timeout, path) }.to raise_error(Timeout::Error)
- end
-
- it 'handles process that writes a lot of data to stderr' do
- output, status = klass.new.popen_with_timeout(spew_command, timeout, path)
-
- expect(output).to include(test_string)
- expect(status).to eq(0)
- end
- end
-
- context 'timeout period' do
- let(:time_taken) do
- begin
- start = Time.now
- klass.new.popen_with_timeout(%w(sleep 1000), timeout, path)
- rescue
- Time.now - start
- end
- end
-
- it { expect(time_taken).to be >= timeout }
- end
-
- context 'clean up' do
- let(:instance) { klass.new }
-
- it 'kills the child process' do
- expect(instance).to receive(:kill_process_group_for_pid).and_wrap_original do |m, *args|
- # is the PID, and it should not be running at this point
- m.call(*args)
-
- pid = args.first
- begin
- Process.getpgid(pid)
- raise "The child process should have been killed"
- rescue Errno::ESRCH
- end
- end
-
- expect { instance.popen_with_timeout(['bash', '-c', "trap -- '' SIGTERM; sleep 1000"], timeout, path) }.to raise_error(Timeout::Error)
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git/push_spec.rb b/spec/lib/gitlab/git/push_spec.rb
new file mode 100644
index 00000000000..566c8209504
--- /dev/null
+++ b/spec/lib/gitlab/git/push_spec.rb
@@ -0,0 +1,166 @@
+require 'spec_helper'
+
+describe Gitlab::Git::Push do
+ set(:project) { create(:project, :repository) }
+
+ let(:oldrev) { project.commit('HEAD~2').id }
+ let(:newrev) { project.commit.id }
+ let(:ref) { 'refs/heads/some-branch' }
+
+ subject { described_class.new(project, oldrev, newrev, ref) }
+
+ describe '#branch_name' do
+ context 'when it is a branch push' do
+ let(:ref) { 'refs/heads/my-branch' }
+
+ it 'returns branch name' do
+ expect(subject.branch_name).to eq 'my-branch'
+ end
+ end
+
+ context 'when it is a tag push' do
+ let(:ref) { 'refs/tags/my-branch' }
+
+ it 'returns nil' do
+ expect(subject.branch_name).to be_nil
+ end
+ end
+ end
+
+ describe '#branch_push?' do
+ context 'when pushing a branch ref' do
+ let(:ref) { 'refs/heads/my-branch' }
+
+ it { is_expected.to be_branch_push }
+ end
+
+ context 'when it is a tag push' do
+ let(:ref) { 'refs/tags/my-tag' }
+
+ it { is_expected.not_to be_branch_push }
+ end
+ end
+
+ describe '#branch_updated?' do
+ context 'when it is a branch push with correct old and new revisions' do
+ it { is_expected.to be_branch_updated }
+ end
+
+ context 'when it is not a branch push' do
+ let(:ref) { 'refs/tags/my-tag' }
+
+ it { is_expected.not_to be_branch_updated }
+ end
+
+ context 'when old revision is blank' do
+ let(:oldrev) { Gitlab::Git::BLANK_SHA }
+
+ it { is_expected.not_to be_branch_updated }
+ end
+
+ context 'when it is not a branch push' do
+ let(:newrev) { Gitlab::Git::BLANK_SHA }
+
+ it { is_expected.not_to be_branch_updated }
+ end
+
+ context 'when oldrev is nil' do
+ let(:oldrev) { nil }
+
+ it { is_expected.not_to be_branch_updated }
+ end
+ end
+
+ describe '#force_push?' do
+ context 'when old revision is an ancestor of the new revision' do
+ let(:oldrev) { 'HEAD~3' }
+ let(:newrev) { 'HEAD~1' }
+
+ it { is_expected.not_to be_force_push }
+ end
+
+ context 'when old revision is not an ancestor of the new revision' do
+ let(:oldrev) { 'HEAD~3' }
+ let(:newrev) { '123456' }
+
+ it { is_expected.to be_force_push }
+ end
+ end
+
+ describe '#branch_added?' do
+ context 'when old revision is defined' do
+ it { is_expected.not_to be_branch_added }
+ end
+
+ context 'when old revision is not defined' do
+ let(:oldrev) { Gitlab::Git::BLANK_SHA }
+
+ it { is_expected.to be_branch_added }
+ end
+ end
+
+ describe '#branch_removed?' do
+ context 'when new revision is defined' do
+ it { is_expected.not_to be_branch_removed }
+ end
+
+ context 'when new revision is not defined' do
+ let(:newrev) { Gitlab::Git::BLANK_SHA }
+
+ it { is_expected.to be_branch_removed }
+ end
+ end
+
+ describe '#modified_paths' do
+ context 'when a push is a branch update' do
+ let(:newrev) { '498214d' }
+ let(:oldrev) { '281d3a7' }
+
+ it 'returns modified paths' do
+ expect(subject.modified_paths).to eq ['bar/branch-test.txt',
+ 'files/js/commit.coffee',
+ 'with space/README.md']
+ end
+ end
+
+ context 'when a push is not a branch update' do
+ let(:oldrev) { Gitlab::Git::BLANK_SHA }
+
+ it 'raises an error' do
+ expect { subject.modified_paths }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
+ describe '#oldrev' do
+ context 'when a valid oldrev is provided' do
+ it 'returns oldrev' do
+ expect(subject.oldrev).to eq oldrev
+ end
+ end
+
+ context 'when a nil valud is provided' do
+ let(:oldrev) { nil }
+
+ it 'returns blank SHA' do
+ expect(subject.oldrev).to eq Gitlab::Git::BLANK_SHA
+ end
+ end
+ end
+
+ describe '#newrev' do
+ context 'when valid newrev is provided' do
+ it 'returns newrev' do
+ expect(subject.newrev).to eq newrev
+ end
+ end
+
+ context 'when a nil valud is provided' do
+ let(:newrev) { nil }
+
+ it 'returns blank SHA' do
+ expect(subject.newrev).to eq Gitlab::Git::BLANK_SHA
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 35a6fc94753..1fe73c12fc0 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -19,7 +19,10 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
+ let(:mutable_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+ let(:repository_path) { File.join(TestEnv.repos_path, repository.relative_path) }
+ let(:repository_rugged) { Rugged::Repository.new(repository_path) }
let(:storage_path) { TestEnv.repos_path }
let(:user) { build(:user) }
@@ -71,7 +74,6 @@ describe Gitlab::Git::Repository, :seed_helper do
describe "Respond to" do
subject { repository }
- it { is_expected.to respond_to(:rugged) }
it { is_expected.to respond_to(:root_ref) }
it { is_expected.to respond_to(:tags) }
end
@@ -91,57 +93,6 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- describe "#rugged" do
- describe 'when storage is broken', :broken_storage do
- it 'raises a storage exception when storage is not available' do
- broken_repo = described_class.new('broken', 'a/path.git', '')
-
- expect { broken_repo.rugged }.to raise_error(Gitlab::Git::Storage::Inaccessible)
- end
- end
-
- it 'raises a no repository exception when there is no repo' do
- broken_repo = described_class.new('default', 'a/path.git', '')
-
- expect do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access { broken_repo.rugged }
- end.to raise_error(Gitlab::Git::Repository::NoRepository)
- end
-
- describe 'alternates keyword argument' do
- context 'with no Git env stored' do
- before do
- allow(Gitlab::Git::HookEnv).to receive(:all).and_return({})
- end
-
- it "is passed an empty array" do
- expect(Rugged::Repository).to receive(:new).with(repository_path, alternates: [])
-
- repository_rugged
- end
- end
-
- context 'with absolute and relative Git object dir envvars stored' do
- before do
- allow(Gitlab::Git::HookEnv).to receive(:all).and_return({
- 'GIT_OBJECT_DIRECTORY_RELATIVE' => './objects/foo',
- 'GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE' => ['./objects/bar', './objects/baz'],
- 'GIT_OBJECT_DIRECTORY' => 'ignored',
- 'GIT_ALTERNATE_OBJECT_DIRECTORIES' => %w[ignored ignored],
- 'GIT_OTHER' => 'another_env'
- })
- end
-
- it "is passed the relative object dir envvars after being converted to absolute ones" do
- alternates = %w[foo bar baz].map { |d| File.join(repository_path, './objects', d) }
- expect(Rugged::Repository).to receive(:new).with(repository_path, alternates: alternates)
-
- repository_rugged
- end
- end
- end
- end
-
describe '#branch_names' do
subject { repository.branch_names }
@@ -284,7 +235,6 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#submodule_url_for' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:ref) { 'master' }
def submodule_url(path)
@@ -322,21 +272,12 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#commit_count' do
- shared_examples 'simple commit counting' do
- it { expect(repository.commit_count("master")).to eq(25) }
- it { expect(repository.commit_count("feature")).to eq(9) }
- it { expect(repository.commit_count("does-not-exist")).to eq(0) }
- end
+ it { expect(repository.commit_count("master")).to eq(25) }
+ it { expect(repository.commit_count("feature")).to eq(9) }
+ it { expect(repository.commit_count("does-not-exist")).to eq(0) }
- context 'when Gitaly commit_count feature is enabled' do
- it_behaves_like 'simple commit counting'
- it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::CommitService, :commit_count do
- subject { repository.commit_count('master') }
- end
- end
-
- context 'when Gitaly commit_count feature is disabled', :skip_gitaly_mock do
- it_behaves_like 'simple commit counting'
+ it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::CommitService, :commit_count do
+ subject { repository.commit_count('master') }
end
end
@@ -345,7 +286,7 @@ describe Gitlab::Git::Repository, :seed_helper do
it { expect(repository.has_local_branches?).to eq(true) }
context 'mutable' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+ let(:repository) { mutable_repository }
after do
ensure_seeds
@@ -378,118 +319,82 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe "#delete_branch" do
- shared_examples "deleting a branch" do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+ let(:repository) { mutable_repository }
- after do
- ensure_seeds
- end
-
- it "removes the branch from the repo" do
- branch_name = "to-be-deleted-soon"
-
- repository.create_branch(branch_name)
- expect(repository_rugged.branches[branch_name]).not_to be_nil
+ after do
+ ensure_seeds
+ end
- repository.delete_branch(branch_name)
- expect(repository_rugged.branches[branch_name]).to be_nil
- end
+ it "removes the branch from the repo" do
+ branch_name = "to-be-deleted-soon"
- context "when branch does not exist" do
- it "raises a DeleteBranchError exception" do
- expect { repository.delete_branch("this-branch-does-not-exist") }.to raise_error(Gitlab::Git::Repository::DeleteBranchError)
- end
- end
- end
+ repository.create_branch(branch_name)
+ expect(repository_rugged.branches[branch_name]).not_to be_nil
- context "when Gitaly delete_branch is enabled" do
- it_behaves_like "deleting a branch"
+ repository.delete_branch(branch_name)
+ expect(repository_rugged.branches[branch_name]).to be_nil
end
- context "when Gitaly delete_branch is disabled", :skip_gitaly_mock do
- it_behaves_like "deleting a branch"
+ context "when branch does not exist" do
+ it "raises a DeleteBranchError exception" do
+ expect { repository.delete_branch("this-branch-does-not-exist") }.to raise_error(Gitlab::Git::Repository::DeleteBranchError)
+ end
end
end
describe "#create_branch" do
- shared_examples 'creating a branch' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-
- after do
- ensure_seeds
- end
+ let(:repository) { mutable_repository }
- it "should create a new branch" do
- expect(repository.create_branch('new_branch', 'master')).not_to be_nil
- end
-
- it "should create a new branch with the right name" do
- expect(repository.create_branch('another_branch', 'master').name).to eq('another_branch')
- end
+ after do
+ ensure_seeds
+ end
- it "should fail if we create an existing branch" do
- repository.create_branch('duplicated_branch', 'master')
- expect {repository.create_branch('duplicated_branch', 'master')}.to raise_error("Branch duplicated_branch already exists")
- end
+ it "should create a new branch" do
+ expect(repository.create_branch('new_branch', 'master')).not_to be_nil
+ end
- it "should fail if we create a branch from a non existing ref" do
- expect {repository.create_branch('branch_based_in_wrong_ref', 'master_2_the_revenge')}.to raise_error("Invalid reference master_2_the_revenge")
- end
+ it "should create a new branch with the right name" do
+ expect(repository.create_branch('another_branch', 'master').name).to eq('another_branch')
end
- context 'when Gitaly create_branch feature is enabled' do
- it_behaves_like 'creating a branch'
+ it "should fail if we create an existing branch" do
+ repository.create_branch('duplicated_branch', 'master')
+ expect {repository.create_branch('duplicated_branch', 'master')}.to raise_error("Branch duplicated_branch already exists")
end
- context 'when Gitaly create_branch feature is disabled', :skip_gitaly_mock do
- it_behaves_like 'creating a branch'
+ it "should fail if we create a branch from a non existing ref" do
+ expect {repository.create_branch('branch_based_in_wrong_ref', 'master_2_the_revenge')}.to raise_error("Invalid reference master_2_the_revenge")
end
end
describe '#delete_refs' do
- shared_examples 'deleting refs' do
- let(:repo) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-
- def repo_rugged
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repo.rugged
- end
- end
+ let(:repository) { mutable_repository }
- after do
- ensure_seeds
- end
-
- it 'deletes the ref' do
- repo.delete_refs('refs/heads/feature')
-
- expect(repo_rugged.references['refs/heads/feature']).to be_nil
- end
+ after do
+ ensure_seeds
+ end
- it 'deletes all refs' do
- refs = %w[refs/heads/wip refs/tags/v1.1.0]
- repo.delete_refs(*refs)
+ it 'deletes the ref' do
+ repository.delete_refs('refs/heads/feature')
- refs.each do |ref|
- expect(repo_rugged.references[ref]).to be_nil
- end
- end
+ expect(repository_rugged.references['refs/heads/feature']).to be_nil
+ end
- it 'does not fail when deleting an empty list of refs' do
- expect { repo.delete_refs(*[]) }.not_to raise_error
- end
+ it 'deletes all refs' do
+ refs = %w[refs/heads/wip refs/tags/v1.1.0]
+ repository.delete_refs(*refs)
- it 'raises an error if it failed' do
- expect { repo.delete_refs('refs\heads\fix') }.to raise_error(Gitlab::Git::Repository::GitError)
+ refs.each do |ref|
+ expect(repository_rugged.references[ref]).to be_nil
end
end
- context 'when Gitaly delete_refs feature is enabled' do
- it_behaves_like 'deleting refs'
+ it 'does not fail when deleting an empty list of refs' do
+ expect { repository.delete_refs(*[]) }.not_to raise_error
end
- context 'when Gitaly delete_refs feature is disabled', :disable_gitaly do
- it_behaves_like 'deleting refs'
+ it 'raises an error if it failed' do
+ expect { repository.delete_refs('refs\heads\fix') }.to raise_error(Gitlab::Git::Repository::GitError)
end
end
@@ -542,44 +447,84 @@ describe Gitlab::Git::Repository, :seed_helper do
Gitlab::Shell.new.remove_repository('default', 'my_project')
end
- shared_examples 'repository mirror fecthing' do
- it 'fetches a repository as a mirror remote' do
+ it 'fetches a repository as a mirror remote' do
+ subject
+
+ expect(refs(new_repository_path)).to eq(refs(repository_path))
+ end
+
+ context 'with keep-around refs' do
+ let(:sha) { SeedRepo::Commit::ID }
+ let(:keep_around_ref) { "refs/keep-around/#{sha}" }
+ let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" }
+
+ before do
+ repository_rugged.references.create(keep_around_ref, sha, force: true)
+ repository_rugged.references.create(tmp_ref, sha, force: true)
+ end
+
+ it 'includes the temporary and keep-around refs' do
subject
- expect(refs(new_repository_path)).to eq(refs(repository_path))
+ expect(refs(new_repository_path)).to include(keep_around_ref)
+ expect(refs(new_repository_path)).to include(tmp_ref)
end
+ end
- context 'with keep-around refs' do
- let(:sha) { SeedRepo::Commit::ID }
- let(:keep_around_ref) { "refs/keep-around/#{sha}" }
- let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" }
+ def new_repository_path
+ File.join(TestEnv.repos_path, new_repository.relative_path)
+ end
+ end
- before do
- repository_rugged.references.create(keep_around_ref, sha, force: true)
- repository_rugged.references.create(tmp_ref, sha, force: true)
- end
+ describe '#fetch_remote' do
+ it 'delegates to the gitaly RepositoryService' do
+ ssh_auth = double(:ssh_auth)
+ expected_opts = {
+ ssh_auth: ssh_auth,
+ forced: true,
+ no_tags: true,
+ timeout: described_class::GITLAB_PROJECTS_TIMEOUT,
+ prune: false
+ }
- it 'includes the temporary and keep-around refs' do
- subject
+ expect(repository.gitaly_repository_client).to receive(:fetch_remote).with('remote-name', expected_opts)
- expect(refs(new_repository_path)).to include(keep_around_ref)
- expect(refs(new_repository_path)).to include(tmp_ref)
- end
- end
+ repository.fetch_remote('remote-name', ssh_auth: ssh_auth, forced: true, no_tags: true, prune: false)
end
- context 'with gitaly enabled' do
- it_behaves_like 'repository mirror fecthing'
+ it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RepositoryService, :fetch_remote do
+ subject { repository.fetch_remote('remote-name') }
end
+ end
- context 'with gitaly enabled', :skip_gitaly_mock do
- it_behaves_like 'repository mirror fecthing'
+ describe '#find_remote_root_ref' do
+ it 'gets the remote root ref from GitalyClient' do
+ expect_any_instance_of(Gitlab::GitalyClient::RemoteService)
+ .to receive(:find_remote_root_ref).and_call_original
+
+ expect(repository.find_remote_root_ref('origin')).to eq 'master'
end
- def new_repository_path
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- new_repository.path
- end
+ it 'returns UTF-8' do
+ expect(repository.find_remote_root_ref('origin')).to be_utf8
+ end
+
+ it 'returns nil when remote name is nil' do
+ expect_any_instance_of(Gitlab::GitalyClient::RemoteService)
+ .not_to receive(:find_remote_root_ref)
+
+ expect(repository.find_remote_root_ref(nil)).to be_nil
+ end
+
+ it 'returns nil when remote name is empty' do
+ expect_any_instance_of(Gitlab::GitalyClient::RemoteService)
+ .not_to receive(:find_remote_root_ref)
+
+ expect(repository.find_remote_root_ref('')).to be_nil
+ end
+
+ it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RemoteService, :find_remote_root_ref do
+ subject { repository.find_remote_root_ref('origin') }
end
end
@@ -595,18 +540,16 @@ describe Gitlab::Git::Repository, :seed_helper do
Gitlab::Git::Commit.find(repository, @rename_commit_id)
end
- before(:context) do
+ before do
# Add new commits so that there's a renamed file in the commit history
- repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
- @commit_with_old_name_id = new_commit_edit_old_file(repo).oid
- @rename_commit_id = new_commit_move_file(repo).oid
- @commit_with_new_name_id = new_commit_edit_new_file(repo).oid
+ @commit_with_old_name_id = new_commit_edit_old_file(repository_rugged).oid
+ @rename_commit_id = new_commit_move_file(repository_rugged).oid
+ @commit_with_new_name_id = new_commit_edit_new_file(repository_rugged).oid
end
- after(:context) do
+ after do
# Erase our commits so other tests get the original repo
- repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
- repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
+ repository_rugged.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
end
context "where 'follow' == true" do
@@ -887,25 +830,15 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#merge_base' do
- shared_examples '#merge_base' do
- where(:from, :to, :result) do
- '570e7b2abdd848b95f2f578043fc23bd6f6fd24d' | '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d'
- '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d'
- '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | 'foobar' | nil
- 'foobar' | '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | nil
- end
-
- with_them do
- it { expect(repository.merge_base(from, to)).to eq(result) }
- end
+ where(:from, :to, :result) do
+ '570e7b2abdd848b95f2f578043fc23bd6f6fd24d' | '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d'
+ '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d' | '570e7b2abdd848b95f2f578043fc23bd6f6fd24d'
+ '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | 'foobar' | nil
+ 'foobar' | '40f4a7a617393735a95a0bb67b08385bc1e7c66d' | nil
end
- context 'with gitaly' do
- it_behaves_like '#merge_base'
- end
-
- context 'without gitaly', :skip_gitaly_mock do
- it_behaves_like '#merge_base'
+ with_them do
+ it { expect(repository.merge_base(from, to)).to eq(result) }
end
end
@@ -997,54 +930,6 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- describe '#autocrlf' do
- before(:all) do
- @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- @repo.rugged.config['core.autocrlf'] = true
- end
-
- around do |example|
- # OK because autocrlf is only used in gitaly-ruby
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- it 'return the value of the autocrlf option' do
- expect(@repo.autocrlf).to be(true)
- end
-
- after(:all) do
- @repo.rugged.config.delete('core.autocrlf')
- end
- end
-
- describe '#autocrlf=' do
- before(:all) do
- @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- @repo.rugged.config['core.autocrlf'] = false
- end
-
- around do |example|
- # OK because autocrlf= is only used in gitaly-ruby
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- it 'should set the autocrlf option to the provided option' do
- @repo.autocrlf = :input
-
- File.open(File.join(SEED_STORAGE_PATH, TEST_MUTABLE_REPO_PATH, 'config')) do |config_file|
- expect(config_file.read).to match('autocrlf = input')
- end
- end
-
- after(:all) do
- @repo.rugged.config.delete('core.autocrlf')
- end
- end
-
describe '#find_branch' do
it 'should return a Branch for master' do
branch = repository.find_branch('master')
@@ -1086,12 +971,10 @@ describe Gitlab::Git::Repository, :seed_helper do
subject { repository.branches }
context 'with local and remote branches' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
+ let(:repository) { mutable_repository }
before do
- create_remote_branch(repository, 'joe', 'remote_branch', 'master')
+ create_remote_branch('joe', 'remote_branch', 'master')
repository.create_branch('local_branch', 'master')
end
@@ -1114,12 +997,10 @@ describe Gitlab::Git::Repository, :seed_helper do
end
context 'with local and remote branches' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
+ let(:repository) { mutable_repository }
before do
- create_remote_branch(repository, 'joe', 'remote_branch', 'master')
+ create_remote_branch('joe', 'remote_branch', 'master')
repository.create_branch('local_branch', 'master')
end
@@ -1144,57 +1025,95 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#merged_branch_names' do
- shared_examples 'finding merged branch names' do
- context 'when branch names are passed' do
- it 'only returns the names we are asking' do
- names = repository.merged_branch_names(%w[merge-test])
+ context 'when branch names are passed' do
+ it 'only returns the names we are asking' do
+ names = repository.merged_branch_names(%w[merge-test])
- expect(names).to contain_exactly('merge-test')
- end
+ expect(names).to contain_exactly('merge-test')
+ end
- it 'does not return unmerged branch names' do
- names = repository.merged_branch_names(%w[feature])
+ it 'does not return unmerged branch names' do
+ names = repository.merged_branch_names(%w[feature])
- expect(names).to be_empty
- end
+ expect(names).to be_empty
end
+ end
- context 'when no root ref is available' do
- it 'returns empty list' do
- project = create(:project, :empty_repo)
+ context 'when no root ref is available' do
+ it 'returns empty list' do
+ project = create(:project, :empty_repo)
- names = project.repository.merged_branch_names(%w[feature])
+ names = project.repository.merged_branch_names(%w[feature])
- expect(names).to be_empty
- end
+ expect(names).to be_empty
end
+ end
- context 'when no branch names are specified' do
- before do
- repository.create_branch('identical', 'master')
- end
+ context 'when no branch names are specified' do
+ before do
+ repository.create_branch('identical', 'master')
+ end
- after do
- ensure_seeds
- end
+ after do
+ ensure_seeds
+ end
- it 'returns all merged branch names except for identical one' do
- names = repository.merged_branch_names
+ it 'returns all merged branch names except for identical one' do
+ names = repository.merged_branch_names
- expect(names).to include('merge-test')
- expect(names).to include('fix-mode')
- expect(names).not_to include('feature')
- expect(names).not_to include('identical')
- end
+ expect(names).to include('merge-test')
+ expect(names).to include('fix-mode')
+ expect(names).not_to include('feature')
+ expect(names).not_to include('identical')
end
end
+ end
+
+ describe '#diff_stats' do
+ let(:left_commit_id) { 'feature' }
+ let(:right_commit_id) { 'master' }
- context 'when Gitaly merged_branch_names feature is enabled' do
- it_behaves_like 'finding merged branch names'
+ it 'returns a DiffStatsCollection' do
+ collection = repository.diff_stats(left_commit_id, right_commit_id)
+
+ expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
+ expect(collection).to be_a(Enumerable)
+ end
+
+ it 'yields Gitaly::DiffStats objects' do
+ collection = repository.diff_stats(left_commit_id, right_commit_id)
+
+ expect(collection.to_a).to all(be_a(Gitaly::DiffStats))
+ end
+
+ it 'returns no Gitaly::DiffStats when SHAs are invalid' do
+ collection = repository.diff_stats('foo', 'bar')
+
+ expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
+ expect(collection).to be_a(Enumerable)
+ expect(collection.to_a).to be_empty
end
- context 'when Gitaly merged_branch_names feature is disabled', :disable_gitaly do
- it_behaves_like 'finding merged branch names'
+ it 'returns no Gitaly::DiffStats when there is a nil SHA' do
+ expect_any_instance_of(Gitlab::GitalyClient::CommitService)
+ .not_to receive(:diff_stats)
+
+ collection = repository.diff_stats(nil, 'master')
+
+ expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
+ expect(collection).to be_a(Enumerable)
+ expect(collection.to_a).to be_empty
+ end
+
+ it 'returns no Gitaly::DiffStats when there is a BLANK_SHA' do
+ expect_any_instance_of(Gitlab::GitalyClient::CommitService)
+ .not_to receive(:diff_stats)
+
+ collection = repository.diff_stats(Gitlab::Git::BLANK_SHA, 'master')
+
+ expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
+ expect(collection).to be_a(Enumerable)
+ expect(collection.to_a).to be_empty
end
end
@@ -1310,99 +1229,97 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- describe '#ref_exists?' do
- shared_examples 'checks the existence of refs' do
- it 'returns true for an existing tag' do
- expect(repository.ref_exists?('refs/heads/master')).to eq(true)
- end
+ describe '#gitattribute' do
+ let(:repository) { Gitlab::Git::Repository.new('default', TEST_GITATTRIBUTES_REPO_PATH, '') }
- it 'returns false for a non-existing tag' do
- expect(repository.ref_exists?('refs/tags/THIS_TAG_DOES_NOT_EXIST')).to eq(false)
- end
-
- it 'raises an ArgumentError for an empty string' do
- expect { repository.ref_exists?('') }.to raise_error(ArgumentError)
- end
+ after do
+ ensure_seeds
+ end
- it 'raises an ArgumentError for an invalid ref' do
- expect { repository.ref_exists?('INVALID') }.to raise_error(ArgumentError)
- end
+ it 'returns matching language attribute' do
+ expect(repository.gitattribute("custom-highlighting/test.gitlab-custom", 'gitlab-language')).to eq('ruby')
end
- context 'when Gitaly ref_exists feature is enabled' do
- it_behaves_like 'checks the existence of refs'
+ it 'returns matching language attribute with additional options' do
+ expect(repository.gitattribute("custom-highlighting/test.gitlab-cgi", 'gitlab-language')).to eq('erb?parent=json')
end
- context 'when Gitaly ref_exists feature is disabled', :skip_gitaly_mock do
- it_behaves_like 'checks the existence of refs'
+ it 'returns nil if nothing matches' do
+ expect(repository.gitattribute("report.xslt", 'gitlab-language')).to eq(nil)
end
- end
- describe '#tag_exists?' do
- shared_examples 'checks the existence of tags' do
- it 'returns true for an existing tag' do
- tag = repository.tag_names.first
+ context 'without gitattributes file' do
+ let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
- expect(repository.tag_exists?(tag)).to eq(true)
+ it 'returns nil' do
+ expect(repository.gitattribute("README.md", 'gitlab-language')).to eq(nil)
end
+ end
+ end
- it 'returns false for a non-existing tag' do
- expect(repository.tag_exists?('v9000')).to eq(false)
- end
+ describe '#ref_exists?' do
+ it 'returns true for an existing tag' do
+ expect(repository.ref_exists?('refs/heads/master')).to eq(true)
end
- context 'when Gitaly ref_exists_tags feature is enabled' do
- it_behaves_like 'checks the existence of tags'
+ it 'returns false for a non-existing tag' do
+ expect(repository.ref_exists?('refs/tags/THIS_TAG_DOES_NOT_EXIST')).to eq(false)
end
- context 'when Gitaly ref_exists_tags feature is disabled', :skip_gitaly_mock do
- it_behaves_like 'checks the existence of tags'
+ it 'raises an ArgumentError for an empty string' do
+ expect { repository.ref_exists?('') }.to raise_error(ArgumentError)
+ end
+
+ it 'raises an ArgumentError for an invalid ref' do
+ expect { repository.ref_exists?('INVALID') }.to raise_error(ArgumentError)
end
end
- describe '#branch_exists?' do
- shared_examples 'checks the existence of branches' do
- it 'returns true for an existing branch' do
- expect(repository.branch_exists?('master')).to eq(true)
- end
+ describe '#tag_exists?' do
+ it 'returns true for an existing tag' do
+ tag = repository.tag_names.first
- it 'returns false for a non-existing branch' do
- expect(repository.branch_exists?('kittens')).to eq(false)
- end
+ expect(repository.tag_exists?(tag)).to eq(true)
+ end
- it 'returns false when using an invalid branch name' do
- expect(repository.branch_exists?('.bla')).to eq(false)
- end
+ it 'returns false for a non-existing tag' do
+ expect(repository.tag_exists?('v9000')).to eq(false)
+ end
+ end
+
+ describe '#branch_exists?' do
+ it 'returns true for an existing branch' do
+ expect(repository.branch_exists?('master')).to eq(true)
end
- context 'when Gitaly ref_exists_branches feature is enabled' do
- it_behaves_like 'checks the existence of branches'
+ it 'returns false for a non-existing branch' do
+ expect(repository.branch_exists?('kittens')).to eq(false)
end
- context 'when Gitaly ref_exists_branches feature is disabled', :skip_gitaly_mock do
- it_behaves_like 'checks the existence of branches'
+ it 'returns false when using an invalid branch name' do
+ expect(repository.branch_exists?('.bla')).to eq(false)
end
end
describe '#local_branches' do
- before(:all) do
- @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
+ let(:repository) { mutable_repository }
+
+ before do
+ create_remote_branch('joe', 'remote_branch', 'master')
+ repository.create_branch('local_branch', 'master')
end
- after(:all) do
+ after do
ensure_seeds
end
it 'returns the local branches' do
- create_remote_branch(@repo, 'joe', 'remote_branch', 'master')
- @repo.create_branch('local_branch', 'master')
-
- expect(@repo.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false)
- expect(@repo.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true)
+ expect(repository.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false)
+ expect(repository.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true)
end
it 'returns a Branch with UTF-8 fields' do
- branches = @repo.local_branches.to_a
+ branches = repository.local_branches.to_a
expect(branches.size).to be > 0
branches.each do |branch|
expect(branch.name).to be_utf8
@@ -1413,11 +1330,11 @@ describe Gitlab::Git::Repository, :seed_helper do
it 'gets the branches from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::RefService).to receive(:local_branches)
.and_return([])
- @repo.local_branches
+ repository.local_branches
end
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :local_branches do
- subject { @repo.local_branches }
+ subject { repository.local_branches }
end
end
@@ -1471,56 +1388,9 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- describe '#with_repo_branch_commit' do
- context 'when comparing with the same repository' do
- let(:start_repository) { repository }
-
- context 'when the branch exists' do
- let(:start_branch_name) { 'master' }
-
- it 'yields the commit' do
- expect { |b| repository.with_repo_branch_commit(start_repository, start_branch_name, &b) }
- .to yield_with_args(an_instance_of(Gitlab::Git::Commit))
- end
- end
-
- context 'when the branch does not exist' do
- let(:start_branch_name) { 'definitely-not-master' }
-
- it 'yields nil' do
- expect { |b| repository.with_repo_branch_commit(start_repository, start_branch_name, &b) }
- .to yield_with_args(nil)
- end
- end
- end
-
- context 'when comparing with another repository' do
- let(:start_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-
- context 'when the branch exists' do
- let(:start_branch_name) { 'master' }
-
- it 'yields the commit' do
- expect { |b| repository.with_repo_branch_commit(start_repository, start_branch_name, &b) }
- .to yield_with_args(an_instance_of(Gitlab::Git::Commit))
- end
- end
-
- context 'when the branch does not exist' do
- let(:start_branch_name) { 'definitely-not-master' }
-
- it 'yields nil' do
- expect { |b| repository.with_repo_branch_commit(start_repository, start_branch_name, &b) }
- .to yield_with_args(nil)
- end
- end
- end
- end
-
describe '#fetch_source_branch!' do
let(:local_ref) { 'refs/merge-requests/1/head' }
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
- let(:source_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+ let(:source_repository) { mutable_repository }
after do
ensure_seeds
@@ -1529,7 +1399,8 @@ describe Gitlab::Git::Repository, :seed_helper do
context 'when the branch exists' do
context 'when the commit does not exist locally' do
let(:source_branch) { 'new-branch-for-fetch-source-branch' }
- let(:source_rugged) { Gitlab::GitalyClient::StorageSettings.allow_disk_access { source_repository.rugged } }
+ let(:source_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
+ let(:source_rugged) { Rugged::Repository.new(source_path) }
let(:new_oid) { new_commit_edit_old_file(source_rugged).oid }
before do
@@ -1567,29 +1438,19 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#rm_branch' do
- shared_examples "user deleting a branch" do
- let(:project) { create(:project, :repository) }
- let(:repository) { project.repository.raw }
- let(:branch_name) { "to-be-deleted-soon" }
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository.raw }
+ let(:branch_name) { "to-be-deleted-soon" }
- before do
- project.add_developer(user)
- repository.create_branch(branch_name)
- end
-
- it "removes the branch from the repo" do
- repository.rm_branch(branch_name, user: user)
-
- expect(repository_rugged.branches[branch_name]).to be_nil
- end
+ before do
+ project.add_developer(user)
+ repository.create_branch(branch_name)
end
- context "when Gitaly user_delete_branch is enabled" do
- it_behaves_like "user deleting a branch"
- end
+ it "removes the branch from the repo" do
+ repository.rm_branch(branch_name, user: user)
- context "when Gitaly user_delete_branch is disabled", :skip_gitaly_mock do
- it_behaves_like "user deleting a branch"
+ expect(repository_rugged.branches[branch_name]).to be_nil
end
end
@@ -1651,8 +1512,7 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#set_config' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
- let(:rugged) { repository_rugged }
+ let(:repository) { mutable_repository }
let(:entries) do
{
'test.foo1' => 'bla bla',
@@ -1664,19 +1524,18 @@ describe Gitlab::Git::Repository, :seed_helper do
it 'can set config settings' do
expect(repository.set_config(entries)).to be_nil
- expect(rugged.config['test.foo1']).to eq('bla bla')
- expect(rugged.config['test.foo2']).to eq('1234')
- expect(rugged.config['test.foo3']).to eq('true')
+ expect(repository_rugged.config['test.foo1']).to eq('bla bla')
+ expect(repository_rugged.config['test.foo2']).to eq('1234')
+ expect(repository_rugged.config['test.foo3']).to eq('true')
end
after do
- entries.keys.each { |k| rugged.config.delete(k) }
+ entries.keys.each { |k| repository_rugged.config.delete(k) }
end
end
describe '#delete_config' do
- let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
- let(:rugged) { repository_rugged }
+ let(:repository) { mutable_repository }
let(:entries) do
{
'test.foo1' => 'bla bla',
@@ -1687,21 +1546,19 @@ describe Gitlab::Git::Repository, :seed_helper do
it 'can delete config settings' do
entries.each do |key, value|
- rugged.config[key] = value
+ repository_rugged.config[key] = value
end
expect(repository.delete_config(*%w[does.not.exist test.foo1 test.foo2])).to be_nil
- config_keys = rugged.config.each_key.to_a
+ config_keys = repository_rugged.config.each_key.to_a
expect(config_keys).not_to include('test.foo1')
expect(config_keys).not_to include('test.foo2')
end
end
describe '#merge' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
+ let(:repository) { mutable_repository }
let(:source_sha) { '913c66a37b4a45b9769037c55c2d238bd0942d2e' }
let(:target_branch) { 'test-merge-target-branch' }
@@ -1713,46 +1570,34 @@ describe Gitlab::Git::Repository, :seed_helper do
ensure_seeds
end
- shared_examples '#merge' do
- it 'can perform a merge' do
- merge_commit_id = nil
- result = repository.merge(user, source_sha, target_branch, 'Test merge') do |commit_id|
- merge_commit_id = commit_id
- end
-
- expect(result.newrev).to eq(merge_commit_id)
- expect(result.repo_created).to eq(false)
- expect(result.branch_created).to eq(false)
+ it 'can perform a merge' do
+ merge_commit_id = nil
+ result = repository.merge(user, source_sha, target_branch, 'Test merge') do |commit_id|
+ merge_commit_id = commit_id
end
- it 'returns nil if there was a concurrent branch update' do
- concurrent_update_id = '33f3729a45c02fc67d00adb1b8bca394b0e761d9'
- result = repository.merge(user, source_sha, target_branch, 'Test merge') do
- # This ref update should make the merge fail
- repository.write_ref(Gitlab::Git::BRANCH_REF_PREFIX + target_branch, concurrent_update_id)
- end
-
- # This 'nil' signals that the merge was not applied
- expect(result).to be_nil
+ expect(result.newrev).to eq(merge_commit_id)
+ expect(result.repo_created).to eq(false)
+ expect(result.branch_created).to eq(false)
+ end
- # Our concurrent ref update should not have been undone
- expect(repository.find_branch(target_branch).target).to eq(concurrent_update_id)
+ it 'returns nil if there was a concurrent branch update' do
+ concurrent_update_id = '33f3729a45c02fc67d00adb1b8bca394b0e761d9'
+ result = repository.merge(user, source_sha, target_branch, 'Test merge') do
+ # This ref update should make the merge fail
+ repository.write_ref(Gitlab::Git::BRANCH_REF_PREFIX + target_branch, concurrent_update_id)
end
- end
- context 'with gitaly' do
- it_behaves_like '#merge'
- end
+ # This 'nil' signals that the merge was not applied
+ expect(result).to be_nil
- context 'without gitaly', :skip_gitaly_mock do
- it_behaves_like '#merge'
+ # Our concurrent ref update should not have been undone
+ expect(repository.find_branch(target_branch).target).to eq(concurrent_update_id)
end
end
describe '#ff_merge' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
+ let(:repository) { mutable_repository }
let(:branch_head) { '6d394385cf567f80a8fd85055db1ab4c5295806f' }
let(:source_sha) { 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660' }
let(:target_branch) { 'test-ff-target-branch' }
@@ -1815,9 +1660,7 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe '#delete_all_refs_except' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
+ let(:repository) { mutable_repository }
before do
repository.write_ref("refs/delete/a", "0b4bc9a49b562e85de7cc9e834518ea6828729b9")
@@ -1841,12 +1684,7 @@ describe Gitlab::Git::Repository, :seed_helper do
end
describe 'remotes' do
- let(:repository) do
- Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
- end
- let(:rugged) do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged }
- end
+ let(:repository) { mutable_repository }
let(:remote_name) { 'my-remote' }
let(:url) { 'http://my-repo.git' }
@@ -1857,88 +1695,47 @@ describe Gitlab::Git::Repository, :seed_helper do
describe '#add_remote' do
let(:mirror_refmap) { '+refs/*:refs/*' }
- shared_examples 'add_remote' do
- it 'added the remote' do
- begin
- rugged.remotes.delete(remote_name)
- rescue Rugged::ConfigError
- end
-
- repository.add_remote(remote_name, url, mirror_refmap: mirror_refmap)
-
- expect(rugged.remotes[remote_name]).not_to be_nil
- expect(rugged.config["remote.#{remote_name}.mirror"]).to eq('true')
- expect(rugged.config["remote.#{remote_name}.prune"]).to eq('true')
- expect(rugged.config["remote.#{remote_name}.fetch"]).to eq(mirror_refmap)
+ it 'added the remote' do
+ begin
+ repository_rugged.remotes.delete(remote_name)
+ rescue Rugged::ConfigError
end
- end
- context 'using Gitaly' do
- it_behaves_like 'add_remote'
- end
+ repository.add_remote(remote_name, url, mirror_refmap: mirror_refmap)
- context 'with Gitaly disabled', :disable_gitaly do
- it_behaves_like 'add_remote'
+ expect(repository_rugged.remotes[remote_name]).not_to be_nil
+ expect(repository_rugged.config["remote.#{remote_name}.mirror"]).to eq('true')
+ expect(repository_rugged.config["remote.#{remote_name}.prune"]).to eq('true')
+ expect(repository_rugged.config["remote.#{remote_name}.fetch"]).to eq(mirror_refmap)
end
end
describe '#remove_remote' do
- shared_examples 'remove_remote' do
- it 'removes the remote' do
- rugged.remotes.create(remote_name, url)
-
- repository.remove_remote(remote_name)
-
- expect(rugged.remotes[remote_name]).to be_nil
- end
- end
-
- context 'using Gitaly' do
- it_behaves_like 'remove_remote'
- end
-
- context 'with Gitaly disabled', :disable_gitaly do
- it_behaves_like 'remove_remote'
- end
- end
- end
+ it 'removes the remote' do
+ repository_rugged.remotes.create(remote_name, url)
- describe '#gitlab_projects' do
- subject { repository.gitlab_projects }
+ repository.remove_remote(remote_name)
- it do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- expect(subject.shard_path).to eq(storage_path)
+ expect(repository_rugged.remotes[remote_name]).to be_nil
end
end
- it { expect(subject.repository_relative_path).to eq(repository.relative_path) }
end
describe '#bundle_to_disk' do
- shared_examples 'bundling to disk' do
- let(:save_path) { File.join(Dir.tmpdir, "repo-#{SecureRandom.hex}.bundle") }
+ let(:save_path) { File.join(Dir.tmpdir, "repo-#{SecureRandom.hex}.bundle") }
- after do
- FileUtils.rm_rf(save_path)
- end
-
- it 'saves a bundle to disk' do
- repository.bundle_to_disk(save_path)
-
- success = system(
- *%W(#{Gitlab.config.git.bin_path} -C #{repository_path} bundle verify #{save_path}),
- [:out, :err] => '/dev/null'
- )
- expect(success).to be true
- end
+ after do
+ FileUtils.rm_rf(save_path)
end
- context 'when Gitaly bundle_to_disk feature is enabled' do
- it_behaves_like 'bundling to disk'
- end
+ it 'saves a bundle to disk' do
+ repository.bundle_to_disk(save_path)
- context 'when Gitaly bundle_to_disk feature is disabled', :disable_gitaly do
- it_behaves_like 'bundling to disk'
+ success = system(
+ *%W(#{Gitlab.config.git.bin_path} -C #{repository_path} bundle verify #{save_path}),
+ [:out, :err] => '/dev/null'
+ )
+ expect(success).to be true
end
end
@@ -1975,7 +1772,7 @@ describe Gitlab::Git::Repository, :seed_helper do
describe '#checksum' do
it 'calculates the checksum for non-empty repo' do
- expect(repository.checksum).to eq '4be7d24ce7e8d845502d599b72d567d23e6a40c0'
+ expect(repository.checksum).to eq '51d0a9662681f93e1fee547a6b7ba2bcaf716059'
end
it 'returns 0000000000000000000000000000000000000000 for an empty repo' do
@@ -2013,138 +1810,41 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- context 'gitlab_projects commands' do
- let(:gitlab_projects) { repository.gitlab_projects }
- let(:timeout) { Gitlab.config.gitlab_shell.git_timeout }
+ describe '#clean_stale_repository_files' do
+ let(:worktree_path) { File.join(repository_path, 'worktrees', 'delete-me') }
- describe '#push_remote_branches' do
- subject do
- repository.push_remote_branches('downstream-remote', ['master'])
- end
+ it 'cleans up the files' do
+ create_worktree = %W[git -C #{repository_path} worktree add --detach #{worktree_path} master]
+ raise 'preparation failed' unless system(*create_worktree, err: '/dev/null')
- it 'executes the command' do
- expect(gitlab_projects).to receive(:push_branches)
- .with('downstream-remote', timeout, true, ['master'])
- .and_return(true)
+ FileUtils.touch(worktree_path, mtime: Time.now - 8.hours)
+ # git rev-list --all will fail in git 2.16 if HEAD is pointing to a non-existent object,
+ # but the HEAD must be 40 characters long or git will ignore it.
+ File.write(File.join(worktree_path, 'HEAD'), Gitlab::Git::BLANK_SHA)
- is_expected.to be_truthy
- end
+ # git 2.16 fails with "fatal: bad object HEAD"
+ expect(rev_list_all).to be false
- it 'raises an error if the command fails' do
- allow(gitlab_projects).to receive(:output) { 'error' }
- expect(gitlab_projects).to receive(:push_branches)
- .with('downstream-remote', timeout, true, ['master'])
- .and_return(false)
+ repository.clean_stale_repository_files
- expect { subject }.to raise_error(Gitlab::Git::CommandError, 'error')
- end
+ expect(rev_list_all).to be true
+ expect(File.exist?(worktree_path)).to be_falsey
end
- describe '#delete_remote_branches' do
- subject do
- repository.delete_remote_branches('downstream-remote', ['master'])
- end
-
- it 'executes the command' do
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(true)
-
- is_expected.to be_truthy
- end
-
- it 'raises an error if the command fails' do
- allow(gitlab_projects).to receive(:output) { 'error' }
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(false)
-
- expect { subject }.to raise_error(Gitlab::Git::CommandError, 'error')
- end
+ def rev_list_all
+ system(*%W[git -C #{repository_path} rev-list --all], out: '/dev/null', err: '/dev/null')
end
- describe '#delete_remote_branches' do
- subject do
- repository.delete_remote_branches('downstream-remote', ['master'])
- end
-
- it 'executes the command' do
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(true)
+ it 'increments a counter upon an error' do
+ expect(repository.gitaly_repository_client).to receive(:cleanup).and_raise(Gitlab::Git::CommandError)
- is_expected.to be_truthy
- end
+ counter = double(:counter)
- it 'raises an error if the command fails' do
- allow(gitlab_projects).to receive(:output) { 'error' }
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(false)
+ expect(counter).to receive(:increment)
+ expect(Gitlab::Metrics).to receive(:counter).with(:failed_repository_cleanup_total,
+ 'Number of failed repository cleanup events').and_return(counter)
- expect { subject }.to raise_error(Gitlab::Git::CommandError, 'error')
- end
- end
-
- describe '#clean_stale_repository_files' do
- let(:worktree_path) { File.join(repository_path, 'worktrees', 'delete-me') }
-
- it 'cleans up the files' do
- create_worktree = %W[git -C #{repository_path} worktree add --detach #{worktree_path} master]
- raise 'preparation failed' unless system(*create_worktree, err: '/dev/null')
-
- FileUtils.touch(worktree_path, mtime: Time.now - 8.hours)
- # git rev-list --all will fail in git 2.16 if HEAD is pointing to a non-existent object,
- # but the HEAD must be 40 characters long or git will ignore it.
- File.write(File.join(worktree_path, 'HEAD'), Gitlab::Git::BLANK_SHA)
-
- # git 2.16 fails with "fatal: bad object HEAD"
- expect(rev_list_all).to be false
-
- repository.clean_stale_repository_files
-
- expect(rev_list_all).to be true
- expect(File.exist?(worktree_path)).to be_falsey
- end
-
- def rev_list_all
- system(*%W[git -C #{repository_path} rev-list --all], out: '/dev/null', err: '/dev/null')
- end
-
- it 'increments a counter upon an error' do
- expect(repository.gitaly_repository_client).to receive(:cleanup).and_raise(Gitlab::Git::CommandError)
-
- counter = double(:counter)
-
- expect(counter).to receive(:increment)
- expect(Gitlab::Metrics).to receive(:counter).with(:failed_repository_cleanup_total,
- 'Number of failed repository cleanup events').and_return(counter)
-
- repository.clean_stale_repository_files
- end
- end
-
- describe '#delete_remote_branches' do
- subject do
- repository.delete_remote_branches('downstream-remote', ['master'])
- end
-
- it 'executes the command' do
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(true)
-
- is_expected.to be_truthy
- end
-
- it 'raises an error if the command fails' do
- allow(gitlab_projects).to receive(:output) { 'error' }
- expect(gitlab_projects).to receive(:delete_remote_branches)
- .with('downstream-remote', ['master'])
- .and_return(false)
-
- expect { subject }.to raise_error(Gitlab::Git::CommandError, 'error')
- end
+ repository.clean_stale_repository_files
end
end
@@ -2187,13 +1887,11 @@ describe Gitlab::Git::Repository, :seed_helper do
end
context 'when the diff contains a rename' do
- let(:repo) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged }
- let(:end_sha) { new_commit_move_file(repo).oid }
+ let(:end_sha) { new_commit_move_file(repository_rugged).oid }
after do
# Erase our commits so other tests get the original repo
- repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
- repo.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
+ repository_rugged.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
end
it 'does not include the renamed file in the sparse checkout' do
@@ -2240,10 +1938,9 @@ describe Gitlab::Git::Repository, :seed_helper do
end
end
- def create_remote_branch(repository, remote_name, branch_name, source_branch_name)
+ def create_remote_branch(remote_name, branch_name, source_branch_name)
source_branch = repository.branches.find { |branch| branch.name == source_branch_name }
- rugged = repository_rugged
- rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
+ repository_rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
end
# Build the options hash that's passed to Rugged::Commit#create
@@ -2321,16 +2018,4 @@ describe Gitlab::Git::Repository, :seed_helper do
line.split("\t").last
end
end
-
- def repository_rugged
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged
- end
- end
-
- def repository_path
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.path
- end
- end
end
diff --git a/spec/lib/gitlab/git/storage/checker_spec.rb b/spec/lib/gitlab/git/storage/checker_spec.rb
deleted file mode 100644
index d74c3bcb04c..00000000000
--- a/spec/lib/gitlab/git/storage/checker_spec.rb
+++ /dev/null
@@ -1,132 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::Checker, :clean_gitlab_redis_shared_state do
- let(:storage_name) { 'default' }
- let(:hostname) { Gitlab::Environment.hostname }
- let(:cache_key) { "storage_accessible:#{storage_name}:#{hostname}" }
-
- subject(:checker) { described_class.new(storage_name) }
-
- def value_from_redis(name)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.hmget(cache_key, name)
- end.first
- end
-
- def set_in_redis(name, value)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.hmset(cache_key, name, value)
- end.first
- end
-
- describe '.check_all' do
- it 'calls a check for each storage' do
- fake_checker_default = double
- fake_checker_broken = double
- fake_logger = fake_logger
-
- expect(described_class).to receive(:new).with('default', fake_logger) { fake_checker_default }
- expect(described_class).to receive(:new).with('broken', fake_logger) { fake_checker_broken }
- expect(fake_checker_default).to receive(:check_with_lease)
- expect(fake_checker_broken).to receive(:check_with_lease)
-
- described_class.check_all(fake_logger)
- end
-
- context 'with broken storage', :broken_storage do
- it 'returns the results' do
- expected_result = [
- { storage: 'default', success: true },
- { storage: 'broken', success: false }
- ]
-
- expect(described_class.check_all).to eq(expected_result)
- end
- end
- end
-
- describe '#initialize' do
- it 'assigns the settings' do
- expect(checker.hostname).to eq(hostname)
- expect(checker.storage).to eq('default')
- expect(checker.storage_path).to eq(TestEnv.repos_path)
- end
- end
-
- describe '#check_with_lease' do
- it 'only allows one check at a time' do
- expect(checker).to receive(:check).once { sleep 1 }
-
- thread = Thread.new { checker.check_with_lease }
- checker.check_with_lease
- thread.join
- end
-
- it 'returns a result hash' do
- expect(checker.check_with_lease).to eq(storage: 'default', success: true)
- end
- end
-
- describe '#check' do
- it 'tracks that the storage was accessible' do
- set_in_redis(:failure_count, 10)
- set_in_redis(:last_failure, Time.now.to_f)
-
- checker.check
-
- expect(value_from_redis(:failure_count).to_i).to eq(0)
- expect(value_from_redis(:last_failure)).to be_empty
- expect(value_from_redis(:first_failure)).to be_empty
- end
-
- it 'calls the check with the correct arguments' do
- stub_application_setting(circuitbreaker_storage_timeout: 30,
- circuitbreaker_access_retries: 3)
-
- expect(Gitlab::Git::Storage::ForkedStorageCheck)
- .to receive(:storage_available?).with(TestEnv.repos_path, 30, 3)
- .and_call_original
-
- checker.check
- end
-
- it 'returns `true`' do
- expect(checker.check).to eq(true)
- end
-
- it 'maintains known storage keys' do
- Timecop.freeze do
- # Insert an old key to expire
- old_entry = Time.now.to_i - 3.days.to_i
- Gitlab::Git::Storage.redis.with do |redis|
- redis.zadd(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, old_entry, 'to_be_removed')
- end
-
- checker.check
-
- known_keys = Gitlab::Git::Storage.redis.with do |redis|
- redis.zrange(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, 0, -1)
- end
-
- expect(known_keys).to contain_exactly(cache_key)
- end
- end
-
- context 'the storage is not available', :broken_storage do
- let(:storage_name) { 'broken' }
-
- it 'tracks that the storage was inaccessible' do
- Timecop.freeze do
- expect { checker.check }.to change { value_from_redis(:failure_count).to_i }.by(1)
-
- expect(value_from_redis(:last_failure)).not_to be_empty
- expect(value_from_redis(:first_failure)).not_to be_empty
- end
- end
-
- it 'returns `false`' do
- expect(checker.check).to eq(false)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git/storage/circuit_breaker_spec.rb b/spec/lib/gitlab/git/storage/circuit_breaker_spec.rb
deleted file mode 100644
index 210b90bfba9..00000000000
--- a/spec/lib/gitlab/git/storage/circuit_breaker_spec.rb
+++ /dev/null
@@ -1,187 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::CircuitBreaker, :broken_storage do
- let(:storage_name) { 'default' }
- let(:circuit_breaker) { described_class.new(storage_name, hostname) }
- let(:hostname) { Gitlab::Environment.hostname }
- let(:cache_key) { "storage_accessible:#{storage_name}:#{hostname}" }
-
- def set_in_redis(name, value)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.zadd(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, 0, cache_key)
- redis.hmset(cache_key, name, value)
- end.first
- end
-
- before do
- # Override test-settings for the circuitbreaker with something more realistic
- # for these specs.
- stub_storage_settings('default' => {
- 'path' => TestEnv.repos_path
- },
- 'broken' => {
- 'path' => 'tmp/tests/non-existent-repositories'
- },
- 'nopath' => { 'path' => nil }
- )
- end
-
- describe '.for_storage', :request_store do
- it 'only builds a single circuitbreaker per storage' do
- expect(described_class).to receive(:new).once.and_call_original
-
- breaker = described_class.for_storage('default')
-
- expect(breaker).to be_a(described_class)
- expect(described_class.for_storage('default')).to eq(breaker)
- end
-
- it 'returns a broken circuit breaker for an unknown storage' do
- expect(described_class.for_storage('unknown').circuit_broken?).to be_truthy
- end
-
- it 'returns a broken circuit breaker when the path is not set' do
- expect(described_class.for_storage('nopath').circuit_broken?).to be_truthy
- end
- end
-
- describe '#initialize' do
- it 'assigns the settings' do
- expect(circuit_breaker.hostname).to eq(hostname)
- expect(circuit_breaker.storage).to eq('default')
- end
- end
-
- context 'circuitbreaker settings' do
- before do
- stub_application_setting(circuitbreaker_failure_count_threshold: 0,
- circuitbreaker_failure_wait_time: 1,
- circuitbreaker_failure_reset_time: 2,
- circuitbreaker_storage_timeout: 3,
- circuitbreaker_access_retries: 4,
- circuitbreaker_backoff_threshold: 5)
- end
-
- describe '#failure_count_threshold' do
- it 'reads the value from settings' do
- expect(circuit_breaker.failure_count_threshold).to eq(0)
- end
- end
-
- describe '#check_interval' do
- it 'reads the value from settings' do
- expect(circuit_breaker.check_interval).to eq(1)
- end
- end
-
- describe '#failure_reset_time' do
- it 'reads the value from settings' do
- expect(circuit_breaker.failure_reset_time).to eq(2)
- end
- end
-
- describe '#storage_timeout' do
- it 'reads the value from settings' do
- expect(circuit_breaker.storage_timeout).to eq(3)
- end
- end
-
- describe '#access_retries' do
- it 'reads the value from settings' do
- expect(circuit_breaker.access_retries).to eq(4)
- end
- end
- end
-
- describe '#perform' do
- it 'raises the correct exception when the circuit is open' do
- set_in_redis(:last_failure, 1.day.ago.to_f)
- set_in_redis(:failure_count, 999)
-
- expect { |b| circuit_breaker.perform(&b) }
- .to raise_error do |exception|
- expect(exception).to be_kind_of(Gitlab::Git::Storage::CircuitOpen)
- expect(exception.retry_after).to eq(1800)
- end
- end
-
- it 'yields the block' do
- expect { |b| circuit_breaker.perform(&b) }
- .to yield_control
- end
-
- it 'checks if the storage is available' do
- expect(circuit_breaker).to receive(:check_storage_accessible!)
- .and_call_original
-
- circuit_breaker.perform { 'hello world' }
- end
-
- it 'returns the value of the block' do
- result = circuit_breaker.perform { 'return value' }
-
- expect(result).to eq('return value')
- end
-
- it 'raises possible errors' do
- expect { circuit_breaker.perform { raise Rugged::OSError.new('Broken') } }
- .to raise_error(Rugged::OSError)
- end
-
- context 'with the feature disabled' do
- before do
- stub_feature_flags(git_storage_circuit_breaker: false)
- end
-
- it 'returns the block without checking accessibility' do
- expect(circuit_breaker).not_to receive(:check_storage_accessible!)
-
- result = circuit_breaker.perform { 'hello' }
-
- expect(result).to eq('hello')
- end
-
- it 'allows enabling the feature using an ENV var' do
- stub_env('GIT_STORAGE_CIRCUIT_BREAKER', 'true')
- expect(circuit_breaker).to receive(:check_storage_accessible!)
-
- result = circuit_breaker.perform { 'hello' }
-
- expect(result).to eq('hello')
- end
- end
- end
-
- describe '#circuit_broken?' do
- it 'is working when there is no last failure' do
- set_in_redis(:last_failure, nil)
- set_in_redis(:failure_count, 0)
-
- expect(circuit_breaker.circuit_broken?).to be_falsey
- end
-
- it 'is broken when there are too many failures' do
- set_in_redis(:last_failure, 1.day.ago.to_f)
- set_in_redis(:failure_count, 200)
-
- expect(circuit_breaker.circuit_broken?).to be_truthy
- end
- end
-
- describe '#last_failure' do
- it 'returns the last failure time' do
- time = Time.parse("2017-05-26 17:52:30")
- set_in_redis(:last_failure, time.to_i)
-
- expect(circuit_breaker.last_failure).to eq(time)
- end
- end
-
- describe '#failure_count' do
- it 'returns the failure count' do
- set_in_redis(:failure_count, 7)
-
- expect(circuit_breaker.failure_count).to eq(7)
- end
- end
-end
diff --git a/spec/lib/gitlab/git/storage/failure_info_spec.rb b/spec/lib/gitlab/git/storage/failure_info_spec.rb
deleted file mode 100644
index bae88fdda86..00000000000
--- a/spec/lib/gitlab/git/storage/failure_info_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::FailureInfo, :broken_storage do
- let(:storage_name) { 'default' }
- let(:hostname) { Gitlab::Environment.hostname }
- let(:cache_key) { "storage_accessible:#{storage_name}:#{hostname}" }
-
- def value_from_redis(name)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.hmget(cache_key, name)
- end.first
- end
-
- def set_in_redis(name, value)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.zadd(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, 0, cache_key)
- redis.hmset(cache_key, name, value)
- end.first
- end
-
- describe '.reset_all!' do
- it 'clears all entries form redis' do
- set_in_redis(:failure_count, 10)
-
- described_class.reset_all!
-
- key_exists = Gitlab::Git::Storage.redis.with { |redis| redis.exists(cache_key) }
-
- expect(key_exists).to be_falsey
- end
-
- it 'does not break when there are no keys in redis' do
- expect { described_class.reset_all! }.not_to raise_error
- end
- end
-
- describe '.load' do
- it 'loads failure information for a storage on a host' do
- first_failure = Time.parse("2017-11-14 17:52:30")
- last_failure = Time.parse("2017-11-14 18:54:37")
- failure_count = 11
-
- set_in_redis(:first_failure, first_failure.to_i)
- set_in_redis(:last_failure, last_failure.to_i)
- set_in_redis(:failure_count, failure_count.to_i)
-
- info = described_class.load(cache_key)
-
- expect(info.first_failure).to eq(first_failure)
- expect(info.last_failure).to eq(last_failure)
- expect(info.failure_count).to eq(failure_count)
- end
- end
-
- describe '#no_failures?' do
- it 'is true when there are no failures' do
- info = described_class.new(nil, nil, 0)
-
- expect(info.no_failures?).to be_truthy
- end
-
- it 'is false when there are failures' do
- info = described_class.new(Time.parse("2017-11-14 17:52:30"),
- Time.parse("2017-11-14 18:54:37"),
- 20)
-
- expect(info.no_failures?).to be_falsy
- end
- end
-end
diff --git a/spec/lib/gitlab/git/storage/forked_storage_check_spec.rb b/spec/lib/gitlab/git/storage/forked_storage_check_spec.rb
deleted file mode 100644
index 39a5d020bb4..00000000000
--- a/spec/lib/gitlab/git/storage/forked_storage_check_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::ForkedStorageCheck, broken_storage: true, skip_database_cleaner: true do
- let(:existing_path) do
- existing_path = TestEnv.repos_path
- FileUtils.mkdir_p(existing_path)
- existing_path
- end
-
- describe '.storage_accessible?' do
- it 'detects when a storage is not available' do
- expect(described_class.storage_available?('/non/existant/path')).to be_falsey
- end
-
- it 'detects when a storage is available' do
- expect(described_class.storage_available?(existing_path)).to be_truthy
- end
-
- it 'returns false when the check takes to long' do
- # We're forking a process here that takes too long
- # It will be killed it's parent process will be killed by it's parent
- # and waited for inside `Gitlab::Git::Storage::ForkedStorageCheck.timeout_check`
- allow(described_class).to receive(:check_filesystem_in_process) do
- Process.spawn("sleep 10")
- end
- result = true
-
- runtime = Benchmark.realtime do
- result = described_class.storage_available?(existing_path, 0.5)
- end
-
- expect(result).to be_falsey
- expect(runtime).to be < 1.0
- end
-
- it 'will try the specified amount of times before failing' do
- allow(described_class).to receive(:check_filesystem_in_process) do
- Process.spawn("sleep 10")
- end
-
- expect(Process).to receive(:spawn).with('sleep 10').twice
- .and_call_original
-
- runtime = Benchmark.realtime do
- described_class.storage_available?(existing_path, 0.5, 2)
- end
-
- expect(runtime).to be < 1.0
- end
-
- describe 'when using paths with spaces' do
- let(:test_dir) { Rails.root.join('tmp', 'tests', 'storage_check') }
- let(:path_with_spaces) { File.join(test_dir, 'path with spaces') }
-
- around do |example|
- FileUtils.mkdir_p(path_with_spaces)
- example.run
- FileUtils.rm_r(test_dir)
- end
-
- it 'works for paths with spaces' do
- expect(described_class.storage_available?(path_with_spaces)).to be_truthy
- end
-
- it 'works for a realpath with spaces' do
- symlink_location = File.join(test_dir, 'a symlink')
- FileUtils.ln_s(path_with_spaces, symlink_location)
-
- expect(described_class.storage_available?(symlink_location)).to be_truthy
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git/storage/health_spec.rb b/spec/lib/gitlab/git/storage/health_spec.rb
deleted file mode 100644
index bb670fc5d94..00000000000
--- a/spec/lib/gitlab/git/storage/health_spec.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::Health, broken_storage: true do
- let(:host1_key) { 'storage_accessible:broken:web01' }
- let(:host2_key) { 'storage_accessible:default:kiq01' }
-
- def set_in_redis(cache_key, value)
- Gitlab::Git::Storage.redis.with do |redis|
- redis.zadd(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, 0, cache_key)
- redis.hmset(cache_key, :failure_count, value)
- end.first
- end
-
- describe '.for_failing_storages' do
- it 'only includes health status for failures' do
- set_in_redis(host1_key, 10)
- set_in_redis(host2_key, 0)
-
- expect(described_class.for_failing_storages.map(&:storage_name))
- .to contain_exactly('broken')
- end
- end
-
- describe '.for_all_storages' do
- it 'loads health status for all configured storages' do
- healths = described_class.for_all_storages
-
- expect(healths.map(&:storage_name)).to contain_exactly('default', 'broken')
- end
- end
-
- describe '#failing_info' do
- it 'only contains storages that have failures' do
- health = described_class.new('broken', [{ name: host1_key, failure_count: 0 },
- { name: host2_key, failure_count: 3 }])
-
- expect(health.failing_info).to contain_exactly({ name: host2_key, failure_count: 3 })
- end
- end
-
- describe '#total_failures' do
- it 'sums up all the failures' do
- health = described_class.new('broken', [{ name: host1_key, failure_count: 2 },
- { name: host2_key, failure_count: 3 }])
-
- expect(health.total_failures).to eq(5)
- end
- end
-
- describe '#failing_on_hosts' do
- it 'collects only the failing hostnames' do
- health = described_class.new('broken', [{ name: host1_key, failure_count: 2 },
- { name: host2_key, failure_count: 0 }])
-
- expect(health.failing_on_hosts).to contain_exactly('web01')
- end
- end
-end
diff --git a/spec/lib/gitlab/git/storage/null_circuit_breaker_spec.rb b/spec/lib/gitlab/git/storage/null_circuit_breaker_spec.rb
deleted file mode 100644
index 93ad20011de..00000000000
--- a/spec/lib/gitlab/git/storage/null_circuit_breaker_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Git::Storage::NullCircuitBreaker do
- let(:storage) { 'default' }
- let(:hostname) { 'localhost' }
- let(:error) { nil }
-
- subject(:breaker) { described_class.new(storage, hostname, error: error) }
-
- context 'with an error' do
- let(:error) { Gitlab::Git::Storage::Misconfiguration.new('error') }
-
- describe '#perform' do
- it { expect { breaker.perform { 'ok' } }.to raise_error(error) }
- end
-
- describe '#circuit_broken?' do
- it { expect(breaker.circuit_broken?).to be_truthy }
- end
-
- describe '#last_failure' do
- it { Timecop.freeze { expect(breaker.last_failure).to eq(Time.now) } }
- end
-
- describe '#failure_count' do
- it { expect(breaker.failure_count).to eq(breaker.failure_count_threshold) }
- end
-
- describe '#failure_info' do
- it { expect(breaker.failure_info.no_failures?).to be_falsy }
- end
- end
-
- context 'not broken' do
- describe '#perform' do
- it { expect(breaker.perform { 'ok' }).to eq('ok') }
- end
-
- describe '#circuit_broken?' do
- it { expect(breaker.circuit_broken?).to be_falsy }
- end
-
- describe '#last_failure' do
- it { expect(breaker.last_failure).to be_nil }
- end
-
- describe '#failure_count' do
- it { expect(breaker.failure_count).to eq(0) }
- end
-
- describe '#failure_info' do
- it { expect(breaker.failure_info.no_failures?).to be_truthy }
- end
- end
-
- describe '#failure_count_threshold' do
- before do
- stub_application_setting(circuitbreaker_failure_count_threshold: 1)
- end
-
- it { expect(breaker.failure_count_threshold).to eq(1) }
- end
-
- it 'implements the CircuitBreaker interface' do
- ours = described_class.public_instance_methods
- theirs = Gitlab::Git::Storage::CircuitBreaker.public_instance_methods
-
- expect(theirs - ours).to be_empty
- end
-end
diff --git a/spec/lib/gitlab/git/tag_spec.rb b/spec/lib/gitlab/git/tag_spec.rb
index 2d9db576a6c..c5bad062c2a 100644
--- a/spec/lib/gitlab/git/tag_spec.rb
+++ b/spec/lib/gitlab/git/tag_spec.rb
@@ -68,7 +68,7 @@ describe Gitlab::Git::Tag, :seed_helper do
context 'message_size less than threshold' do
let(:message_size) { 123 }
- it 'fetches tag message seperately' do
+ it 'fetches tag message separately' do
expect(described_class).to receive(:get_message).with(repository, gitaly_tag.id)
tag.message
diff --git a/spec/lib/gitlab/git/user_spec.rb b/spec/lib/gitlab/git/user_spec.rb
index 99d850e1df9..d9d338206f8 100644
--- a/spec/lib/gitlab/git/user_spec.rb
+++ b/spec/lib/gitlab/git/user_spec.rb
@@ -22,10 +22,19 @@ describe Gitlab::Git::User do
end
describe '.from_gitlab' do
- let(:user) { build(:user) }
- subject { described_class.from_gitlab(user) }
+ context 'when no commit_email has been set' do
+ let(:user) { build(:user, email: 'alice@example.com', commit_email: nil) }
+ subject { described_class.from_gitlab(user) }
- it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-')) }
+ it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-')) }
+ end
+
+ context 'when commit_email has been set' do
+ let(:user) { build(:user, email: 'alice@example.com', commit_email: 'bob@example.com') }
+ subject { described_class.from_gitlab(user) }
+
+ it { expect(subject).to eq(described_class.new(user.username, user.name, user.commit_email, 'user-')) }
+ end
end
describe '#==' do
diff --git a/spec/lib/gitlab/git/wiki_spec.rb b/spec/lib/gitlab/git/wiki_spec.rb
index c5666e4ec61..ded5d7576df 100644
--- a/spec/lib/gitlab/git/wiki_spec.rb
+++ b/spec/lib/gitlab/git/wiki_spec.rb
@@ -1,10 +1,13 @@
require 'spec_helper'
describe Gitlab::Git::Wiki do
+ using RSpec::Parameterized::TableSyntax
+
let(:project) { create(:project) }
let(:user) { project.owner }
let(:project_wiki) { ProjectWiki.new(project, user) }
- subject { project_wiki.wiki }
+
+ subject(:wiki) { project_wiki.wiki }
describe '#pages' do
before do
@@ -64,8 +67,44 @@ describe Gitlab::Git::Wiki do
end
end
- def create_page(name, content)
- subject.write_page(name, :markdown, content, commit_details(name))
+ describe '#preview_slug' do
+ where(:title, :format, :expected_slug) do
+ 'The Best Thing' | :markdown | 'The-Best-Thing'
+ 'The Best Thing' | :md | 'The-Best-Thing'
+ 'The Best Thing' | :txt | 'The-Best-Thing'
+ 'A Subject/Title Here' | :txt | 'A-Subject/Title-Here'
+ 'A subject' | :txt | 'A-subject'
+ 'A 1/B 2/C 3' | :txt | 'A-1/B-2/C-3'
+ 'subject/title' | :txt | 'subject/title'
+ 'subject/title.md' | :txt | 'subject/title.md'
+ 'foo<bar>+baz' | :txt | 'foo-bar--baz'
+ 'foo%2Fbar' | :txt | 'foo%2Fbar'
+ '' | :markdown | '.md'
+ '' | :md | '.md'
+ '' | :txt | '.txt'
+ end
+
+ with_them do
+ subject { wiki.preview_slug(title, format) }
+
+ let(:gitaly_slug) { wiki.pages.first }
+
+ it { is_expected.to eq(expected_slug) }
+
+ it 'matches the slug generated by gitaly' do
+ skip('Gitaly cannot generate a slug for an empty title') unless title.present?
+
+ create_page(title, 'content', format: format)
+
+ gitaly_slug = wiki.pages.first.url_path
+
+ is_expected.to eq(gitaly_slug)
+ end
+ end
+ end
+
+ def create_page(name, content, format: :markdown)
+ wiki.write_page(name, format, content, commit_details(name))
end
def commit_details(name)
@@ -73,7 +112,7 @@ describe Gitlab::Git::Wiki do
end
def destroy_page(title, dir = '')
- page = subject.page(title: title, dir: dir)
+ page = wiki.page(title: title, dir: dir)
project_wiki.delete_page(page, "test commit")
end
end
diff --git a/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb b/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb
new file mode 100644
index 00000000000..bcf4814edb6
--- /dev/null
+++ b/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe Gitlab::Git::WrapsGitalyErrors do
+ subject(:wrapper) do
+ klazz = Class.new { include Gitlab::Git::WrapsGitalyErrors }
+ klazz.new
+ end
+
+ describe "#wrapped_gitaly_errors" do
+ mapping = {
+ GRPC::NotFound => Gitlab::Git::Repository::NoRepository,
+ GRPC::InvalidArgument => ArgumentError,
+ GRPC::BadStatus => Gitlab::Git::CommandError
+ }
+
+ mapping.each do |grpc_error, error|
+ it "wraps #{grpc_error} in a #{error}" do
+ expect { wrapper.wrapped_gitaly_errors { raise grpc_error.new('wrapped') } }
+ .to raise_error(error)
+ end
+ end
+
+ it 'does not swallow other errors' do
+ expect { wrapper.wrapped_gitaly_errors { raise 'raised' } }
+ .to raise_error(RuntimeError)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
index dbd64c4bec0..a417ef77c9e 100644
--- a/spec/lib/gitlab/git_access_spec.rb
+++ b/spec/lib/gitlab/git_access_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe Gitlab::GitAccess do
include TermsHelper
+ include GitHelpers
let(:user) { create(:user) }
@@ -736,21 +737,19 @@ describe Gitlab::GitAccess do
def merge_into_protected_branch
@protected_branch_merge_commit ||= begin
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.add_branch(user, unprotected_branch, 'feature')
- rugged = project.repository.rugged
- target_branch = rugged.rev_parse('feature')
- source_branch = project.repository.create_file(
- user,
- 'filename',
- 'This is the file content',
- message: 'This is a good commit message',
- branch_name: unprotected_branch)
- author = { email: "email@example.com", time: Time.now, name: "Example Git User" }
-
- merge_index = rugged.merge_commits(target_branch, source_branch)
- Rugged::Commit.create(rugged, author: author, committer: author, message: "commit message", parents: [target_branch, source_branch], tree: merge_index.write_tree(rugged))
- end
+ project.repository.add_branch(user, unprotected_branch, 'feature')
+ rugged = rugged_repo(project.repository)
+ target_branch = rugged.rev_parse('feature')
+ source_branch = project.repository.create_file(
+ user,
+ 'filename',
+ 'This is the file content',
+ message: 'This is a good commit message',
+ branch_name: unprotected_branch)
+ author = { email: "email@example.com", time: Time.now, name: "Example Git User" }
+
+ merge_index = rugged.merge_commits(target_branch, source_branch)
+ Rugged::Commit.create(rugged, author: author, committer: author, message: "commit message", parents: [target_branch, source_branch], tree: merge_index.write_tree(rugged))
end
end
@@ -935,6 +934,16 @@ describe Gitlab::GitAccess do
# There is still an N+1 query with protected branches
expect { access.check('git-receive-pack', changes) }.not_to exceed_query_limit(control_count).with_threshold(1)
end
+
+ it 'raises TimeoutError when #check_single_change_access raises a timeout error' do
+ message = "Push operation timed out\n\nTiming information for debugging purposes:\nRunning checks for ref: wow"
+
+ expect_next_instance_of(Gitlab::Checks::ChangeAccess) do |check|
+ expect(check).to receive(:exec).and_raise(Gitlab::Checks::TimedLogger::TimeoutError)
+ end
+
+ expect { access.check('git-receive-pack', changes) }.to raise_error(described_class::TimeoutError, message)
+ end
end
end
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index 54f2ea33f90..d7bd757149d 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -19,7 +19,14 @@ describe Gitlab::GitalyClient::CommitService do
right_commit_id: commit.id,
collapse_diffs: false,
enforce_limits: true,
- **Gitlab::Git::DiffCollection.collection_limits.to_h
+ # Tests limitation parameters explicitly
+ max_files: 100,
+ max_lines: 5000,
+ max_bytes: 512000,
+ safe_max_files: 100,
+ safe_max_lines: 5000,
+ safe_max_bytes: 512000,
+ max_patch_bytes: 102400
)
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash))
@@ -37,7 +44,14 @@ describe Gitlab::GitalyClient::CommitService do
right_commit_id: initial_commit.id,
collapse_diffs: false,
enforce_limits: true,
- **Gitlab::Git::DiffCollection.collection_limits.to_h
+ # Tests limitation parameters explicitly
+ max_files: 100,
+ max_lines: 5000,
+ max_bytes: 512000,
+ safe_max_files: 100,
+ safe_max_lines: 5000,
+ safe_max_bytes: 512000,
+ max_patch_bytes: 102400
)
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash))
@@ -104,6 +118,22 @@ describe Gitlab::GitalyClient::CommitService do
end
end
+ describe '#diff_stats' do
+ let(:left_commit_id) { 'master' }
+ let(:right_commit_id) { 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660' }
+
+ it 'sends an RPC request' do
+ request = Gitaly::DiffStatsRequest.new(repository: repository_message,
+ left_commit_id: left_commit_id,
+ right_commit_id: right_commit_id)
+
+ expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:diff_stats)
+ .with(request, kind_of(Hash)).and_return([])
+
+ described_class.new(repository).diff_stats(left_commit_id, right_commit_id)
+ end
+ end
+
describe '#tree_entries' do
let(:path) { '/' }
diff --git a/spec/lib/gitlab/gitaly_client/diff_spec.rb b/spec/lib/gitlab/gitaly_client/diff_spec.rb
index 00a31ac0b96..ec7ab2fdedb 100644
--- a/spec/lib/gitlab/gitaly_client/diff_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/diff_spec.rb
@@ -9,7 +9,9 @@ describe Gitlab::GitalyClient::Diff do
new_mode: 0100644,
from_id: '357406f3075a57708d0163752905cc1576fceacc',
to_id: '8e5177d718c561d36efde08bad36b43687ee6bf0',
- patch: 'a' * 100
+ patch: 'a' * 100,
+ collapsed: false,
+ too_large: false
}
end
@@ -22,6 +24,8 @@ describe Gitlab::GitalyClient::Diff do
it { is_expected.to respond_to(:from_id) }
it { is_expected.to respond_to(:to_id) }
it { is_expected.to respond_to(:patch) }
+ it { is_expected.to respond_to(:collapsed) }
+ it { is_expected.to respond_to(:too_large) }
describe '#==' do
it { expect(subject).to eq(described_class.new(diff_fields)) }
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
index eaf64e3c9b4..b37fe2686b6 100644
--- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
@@ -335,4 +335,37 @@ describe Gitlab::GitalyClient::OperationService do
end
end
end
+
+ describe '#user_commit_patches' do
+ let(:patches_folder) { Rails.root.join('spec/fixtures/patchfiles') }
+ let(:patch_content) do
+ patch_names.map { |name| File.read(File.join(patches_folder, name)) }.join("\n")
+ end
+ let(:patch_names) { %w(0001-This-does-not-apply-to-the-feature-branch.patch) }
+ let(:branch_name) { 'branch-with-patches' }
+
+ subject(:commit_patches) do
+ client.user_commit_patches(user, branch_name, patch_content)
+ end
+
+ it 'applies the patch correctly' do
+ branch_update = commit_patches
+
+ expect(branch_update).to be_branch_created
+
+ commit = repository.commit(branch_update.newrev)
+ expect(commit.author_email).to eq('patchuser@gitlab.org')
+ expect(commit.committer_email).to eq(user.email)
+ expect(commit.message.chomp).to eq('This does not apply to the `feature` branch')
+ end
+
+ context 'when the patch could not be applied' do
+ let(:patch_names) { %w(0001-This-does-not-apply-to-the-feature-branch.patch) }
+ let(:branch_name) { 'feature' }
+
+ it 'raises the correct error' do
+ expect { commit_patches }.to raise_error(GRPC::FailedPrecondition)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/gitaly_client/remote_service_spec.rb b/spec/lib/gitlab/gitaly_client/remote_service_spec.rb
index f03c7e3f04b..9030a49983d 100644
--- a/spec/lib/gitlab/gitaly_client/remote_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/remote_service_spec.rb
@@ -45,6 +45,26 @@ describe Gitlab::GitalyClient::RemoteService do
end
end
+ describe '#find_remote_root_ref' do
+ it 'sends an find_remote_root_ref message and returns the root ref' do
+ expect_any_instance_of(Gitaly::RemoteService::Stub)
+ .to receive(:find_remote_root_ref)
+ .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
+ .and_return(double(ref: 'master'))
+
+ expect(client.find_remote_root_ref('origin')).to eq 'master'
+ end
+
+ it 'ensure ref is a valid UTF-8 string' do
+ expect_any_instance_of(Gitaly::RemoteService::Stub)
+ .to receive(:find_remote_root_ref)
+ .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
+ .and_return(double(ref: "an_invalid_ref_\xE5"))
+
+ expect(client.find_remote_root_ref('origin')).to eq "an_invalid_ref_å"
+ end
+ end
+
describe '#update_remote_mirror' do
let(:ref_name) { 'remote_mirror_1' }
let(:only_branches_matching) { ['my-branch', 'master'] }
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index 1547d447197..d605fcbafee 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Gitlab::GitalyClient::RepositoryService do
+ using RSpec::Parameterized::TableSyntax
+
let(:project) { create(:project) }
let(:storage_name) { project.repository_storage }
let(:relative_path) { project.disk_path + '.git' }
@@ -107,16 +109,67 @@ describe Gitlab::GitalyClient::RepositoryService do
end
describe '#fetch_remote' do
- let(:ssh_auth) { double(:ssh_auth, ssh_import?: true, ssh_key_auth?: false, ssh_known_hosts: nil) }
- let(:import_url) { 'ssh://example.com' }
+ let(:remote) { 'remote-name' }
it 'sends a fetch_remote_request message' do
+ expected_request = gitaly_request_with_params(
+ remote: remote,
+ ssh_key: '',
+ known_hosts: '',
+ force: false,
+ no_tags: false,
+ no_prune: false
+ )
+
expect_any_instance_of(Gitaly::RepositoryService::Stub)
.to receive(:fetch_remote)
- .with(gitaly_request_with_params(no_prune: false), kind_of(Hash))
+ .with(expected_request, kind_of(Hash))
.and_return(double(value: true))
- client.fetch_remote(import_url, ssh_auth: ssh_auth, forced: false, no_tags: false, timeout: 60)
+ client.fetch_remote(remote, ssh_auth: nil, forced: false, no_tags: false, timeout: 1)
+ end
+
+ context 'SSH auth' do
+ where(:ssh_import, :ssh_key_auth, :ssh_private_key, :ssh_known_hosts, :expected_params) do
+ false | false | 'key' | 'known_hosts' | {}
+ false | true | 'key' | 'known_hosts' | {}
+ true | false | 'key' | 'known_hosts' | { known_hosts: 'known_hosts' }
+ true | true | 'key' | 'known_hosts' | { ssh_key: 'key', known_hosts: 'known_hosts' }
+ true | true | 'key' | nil | { ssh_key: 'key' }
+ true | true | nil | 'known_hosts' | { known_hosts: 'known_hosts' }
+ true | true | nil | nil | {}
+ true | true | '' | '' | {}
+ end
+
+ with_them do
+ let(:ssh_auth) do
+ double(
+ :ssh_auth,
+ ssh_import?: ssh_import,
+ ssh_key_auth?: ssh_key_auth,
+ ssh_private_key: ssh_private_key,
+ ssh_known_hosts: ssh_known_hosts
+ )
+ end
+
+ it do
+ expected_request = gitaly_request_with_params({
+ remote: remote,
+ ssh_key: '',
+ known_hosts: '',
+ force: false,
+ no_tags: false,
+ no_prune: false
+ }.update(expected_params))
+
+ expect_any_instance_of(Gitaly::RepositoryService::Stub)
+ .to receive(:fetch_remote)
+ .with(expected_request, kind_of(Hash))
+ .and_return(double(value: true))
+
+ client.fetch_remote(remote, ssh_auth: ssh_auth, forced: false, no_tags: false, timeout: 1)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
index 5f67fe6b952..d82c9c28da0 100644
--- a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
@@ -39,6 +39,10 @@ describe Gitlab::GitalyClient::WikiService do
expect(wiki_page.title).to eq('My Page')
expect(wiki_page.raw_data).to eq('ab')
expect(wiki_page_version.format).to eq('markdown')
+
+ expect(wiki_page.title).to be_utf8
+ expect(wiki_page.path).to be_utf8
+ expect(wiki_page.name).to be_utf8
end
end
diff --git a/spec/lib/gitlab/github_import/bulk_importing_spec.rb b/spec/lib/gitlab/github_import/bulk_importing_spec.rb
index 91229d9c7d4..861710f7e9b 100644
--- a/spec/lib/gitlab/github_import/bulk_importing_spec.rb
+++ b/spec/lib/gitlab/github_import/bulk_importing_spec.rb
@@ -58,5 +58,17 @@ describe Gitlab::GithubImport::BulkImporting do
importer.bulk_insert(model, rows, batch_size: 5)
end
+
+ it 'calls pre_hook for each slice if given' do
+ rows = [{ title: 'Foo' }] * 10
+ model = double(:model, table_name: 'kittens')
+ pre_hook = double('pre_hook', call: nil)
+ allow(Gitlab::Database).to receive(:bulk_insert)
+
+ expect(pre_hook).to receive(:call).with(rows[0..4])
+ expect(pre_hook).to receive(:call).with(rows[5..9])
+
+ importer.bulk_insert(model, rows, batch_size: 5, pre_hook: pre_hook)
+ end
end
end
diff --git a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
index 81fe97c1e49..65a2e1cb5cb 100644
--- a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
@@ -78,6 +78,11 @@ describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redis_cach
.to receive(:id_for)
.with(issue)
.and_return(milestone.id)
+
+ allow(importer.user_finder)
+ .to receive(:author_id_for)
+ .with(issue)
+ .and_return([user.id, true])
end
context 'when the issue author could be found' do
@@ -87,7 +92,7 @@ describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redis_cach
.with(issue)
.and_return([user.id, true])
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.with(
{
@@ -116,7 +121,7 @@ describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redis_cach
.with(issue)
.and_return([project.creator_id, false])
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.with(
{
@@ -145,7 +150,7 @@ describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redis_cach
.with(issue)
.and_return([user.id, true])
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.and_raise(ActiveRecord::InvalidForeignKey, 'invalid foreign key')
@@ -172,6 +177,23 @@ describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redis_cach
expect(importer.create_issue).to be_a_kind_of(Numeric)
end
+
+ it 'triggers internal_id functionality to track greatest iids' do
+ allow(importer.user_finder)
+ .to receive(:author_id_for)
+ .with(issue)
+ .and_return([user.id, true])
+
+ issue = build_stubbed(:issue, project: project)
+ allow(importer)
+ .to receive(:insert_and_return_id)
+ .and_return(issue.id)
+ allow(project.issues).to receive(:find).with(issue.id).and_return(issue)
+
+ expect(issue).to receive(:ensure_project_iid!)
+
+ importer.create_issue
+ end
end
describe '#create_assignees' do
diff --git a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
index b1cac3b6e46..db0be760c7b 100644
--- a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
@@ -29,13 +29,25 @@ describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis
expect(importer)
.to receive(:bulk_insert)
- .with(Milestone, [milestone_hash])
+ .with(Milestone, [milestone_hash], any_args)
expect(importer)
.to receive(:build_milestones_cache)
importer.execute
end
+
+ it 'tracks internal ids' do
+ milestone_hash = { iid: 1, title: '1.0', project_id: project.id }
+ allow(importer)
+ .to receive(:build_milestones)
+ .and_return([milestone_hash])
+
+ expect(InternalId).to receive(:track_greatest)
+ .with(nil, { project: project }, :milestones, 1, any_args)
+
+ importer.execute
+ end
end
describe '#build_milestones' do
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
index 3422a1e82fc..efca8564894 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
@@ -80,7 +80,7 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
end
it 'imports the pull request with the pull request author as the merge request author' do
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.with(
{
@@ -111,6 +111,16 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
expect(mr).to be_instance_of(MergeRequest)
expect(exists).to eq(false)
end
+
+ it 'triggers internal_id functionality to track greatest iids' do
+ mr = build_stubbed(:merge_request, source_project: project, target_project: project)
+ allow(importer).to receive(:insert_and_return_id).and_return(mr.id)
+ allow(project.merge_requests).to receive(:find).with(mr.id).and_return(mr)
+
+ expect(mr).to receive(:ensure_target_project_iid!)
+
+ importer.create_merge_request
+ end
end
context 'when the author could not be found' do
@@ -125,7 +135,7 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
.with(pull_request)
.and_return(user.id)
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.with(
{
@@ -171,7 +181,7 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
.to receive(:source_branch)
.and_return('master')
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.with(
{
@@ -209,7 +219,7 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
.with(pull_request)
.and_return(user.id)
- expect(Gitlab::GithubImport)
+ expect(importer)
.to receive(:insert_and_return_id)
.and_raise(ActiveRecord::InvalidForeignKey, 'invalid foreign key')
@@ -230,7 +240,12 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
.and_return(user.id)
end
- it 'returns the existing merge request' do
+ # TODO: remove rails5-only after removing rails4 tests
+ # rails 4 can not handle multiple indexes on the same column set if
+ # index was added by 't.index' - t.index is used by default in schema.rb in
+ # rails 5. Let's run this test only in rails 5 env:
+ # see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_113602758
+ it 'returns the existing merge request', :rails5 do
mr1, exists1 = importer.create_merge_request
mr2, exists2 = importer.create_merge_request
diff --git a/spec/lib/gitlab/github_import_spec.rb b/spec/lib/gitlab/github_import_spec.rb
index 51414800e8c..496244c91bf 100644
--- a/spec/lib/gitlab/github_import_spec.rb
+++ b/spec/lib/gitlab/github_import_spec.rb
@@ -27,39 +27,6 @@ describe Gitlab::GithubImport do
end
end
- describe '.insert_and_return_id' do
- let(:attributes) { { iid: 1, title: 'foo' } }
- let(:project) { create(:project) }
-
- context 'on PostgreSQL' do
- it 'returns the ID returned by the query' do
- expect(Gitlab::Database)
- .to receive(:bulk_insert)
- .with(Issue.table_name, [attributes], return_ids: true)
- .and_return([10])
-
- id = described_class.insert_and_return_id(attributes, project.issues)
-
- expect(id).to eq(10)
- end
- end
-
- context 'on MySQL' do
- it 'uses a separate query to retrieve the ID' do
- issue = create(:issue, project: project, iid: attributes[:iid])
-
- expect(Gitlab::Database)
- .to receive(:bulk_insert)
- .with(Issue.table_name, [attributes], return_ids: true)
- .and_return([])
-
- id = described_class.insert_and_return_id(attributes, project.issues)
-
- expect(id).to eq(issue.id)
- end
- end
- end
-
describe '.ghost_user_id', :clean_gitlab_redis_cache do
it 'returns the ID of the ghost user' do
expect(described_class.ghost_user_id).to eq(User.ghost.id)
diff --git a/spec/lib/gitlab/gon_helper_spec.rb b/spec/lib/gitlab/gon_helper_spec.rb
new file mode 100644
index 00000000000..c6f09ca2112
--- /dev/null
+++ b/spec/lib/gitlab/gon_helper_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::GonHelper do
+ let(:helper) do
+ Class.new do
+ include Gitlab::GonHelper
+ end.new
+ end
+
+ describe '#push_frontend_feature_flag' do
+ it 'pushes a feature flag to the frontend' do
+ gon = instance_double('gon')
+
+ allow(helper)
+ .to receive(:gon)
+ .and_return(gon)
+
+ expect(Feature)
+ .to receive(:enabled?)
+ .with(:my_feature_flag, 10)
+ .and_return(true)
+
+ expect(gon)
+ .to receive(:push)
+ .with({ features: { 'myFeatureFlag' => true } }, true)
+
+ helper.push_frontend_feature_flag(:my_feature_flag, 10)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/gpg_spec.rb b/spec/lib/gitlab/gpg_spec.rb
index 47f37cae98f..39d09c49989 100644
--- a/spec/lib/gitlab/gpg_spec.rb
+++ b/spec/lib/gitlab/gpg_spec.rb
@@ -96,7 +96,7 @@ describe Gitlab::Gpg do
expect(described_class.current_home_dir).to eq default_home_dir
end
- it 'returns the explicitely set home dir' do
+ it 'returns the explicitly set home dir' do
GPGME::Engine.home_dir = '/tmp/gpg'
expect(described_class.current_home_dir).to eq '/tmp/gpg'
@@ -104,7 +104,7 @@ describe Gitlab::Gpg do
GPGME::Engine.home_dir = GPGME::Engine.dirinfo('homedir')
end
- it 'returns the default value when explicitely setting the home dir to nil' do
+ it 'returns the default value when explicitly setting the home dir to nil' do
GPGME::Engine.home_dir = nil
expect(described_class.current_home_dir).to eq default_home_dir
diff --git a/spec/lib/gitlab/highlight_spec.rb b/spec/lib/gitlab/highlight_spec.rb
index 29e61d15726..fe0e9702f8a 100644
--- a/spec/lib/gitlab/highlight_spec.rb
+++ b/spec/lib/gitlab/highlight_spec.rb
@@ -5,44 +5,85 @@ describe Gitlab::Highlight do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
- let(:commit) { project.commit(sample_commit.id) }
-
- describe 'custom highlighting from .gitattributes' do
- let(:branch) { 'gitattributes' }
- let(:blob) { repository.blob_at_branch(branch, path) }
+ describe 'language provided' do
let(:highlighter) do
- described_class.new(blob.path, blob.data, repository: repository)
+ described_class.new('foo.erb', 'bar', language: 'erb?parent=json')
end
- before do
- project.change_head('gitattributes')
+ it 'sets correct lexer' do
+ expect(highlighter.lexer.tag).to eq 'erb'
+ expect(highlighter.lexer.parent.tag).to eq 'json'
end
+ end
- describe 'basic language selection' do
- let(:path) { 'custom-highlighting/test.gitlab-custom' }
- it 'highlights as ruby' do
- expect(highlighter.lexer.tag).to eq 'ruby'
- end
+ describe '#highlight' do
+ let(:file_name) { 'test.lisp' }
+ let(:no_context_content) { ":type \"assem\"))" }
+ let(:content) { "(make-pathname :defaults name\n#{no_context_content}" }
+ let(:multiline_content) do
+ %q(
+ def test(input):
+ """This is line 1 of a multi-line comment.
+ This is line 2.
+ """
+ )
+ end
+
+ it 'highlights' do
+ expected = %Q[<span id="LC1" class="line" lang="common_lisp"><span class="p">(</span><span class="nb">make-pathname</span> <span class="ss">:defaults</span> <span class="nv">name</span></span>
+<span id="LC2" class="line" lang="common_lisp"><span class="ss">:type</span> <span class="s">"assem"</span><span class="p">))</span></span>]
+
+ expect(described_class.highlight(file_name, content)).to eq(expected)
+ end
+
+ it 'returns plain version for unknown lexer context' do
+ result = described_class.highlight(file_name, no_context_content)
+
+ expect(result).to eq(%[<span id="LC1" class="line" lang="">:type "assem"))</span>])
+ end
+
+ it 'returns plain version for long content' do
+ stub_const('Gitlab::Highlight::MAXIMUM_TEXT_HIGHLIGHT_SIZE', 1)
+ result = described_class.highlight(file_name, content)
+
+ expect(result).to eq(%[<span id="LC1" class="line" lang="">(make-pathname :defaults name</span>\n<span id="LC2" class="line" lang="">:type "assem"))</span>])
+ end
+
+ it 'highlights multi-line comments' do
+ result = described_class.highlight(file_name, multiline_content)
+ html = Nokogiri::HTML(result)
+ lines = html.search('.s')
+
+ expect(lines.count).to eq(3)
+ expect(lines[0].text).to eq('"""This is line 1 of a multi-line comment.')
+ expect(lines[1].text).to eq(' This is line 2.')
+ expect(lines[2].text).to eq(' """')
end
- describe 'cgi options' do
- let(:path) { 'custom-highlighting/test.gitlab-cgi' }
+ context 'diff highlighting' do
+ let(:file_name) { 'test.diff' }
+ let(:content) { "+aaa\n+bbb\n- ccc\n ddd\n"}
+ let(:expected) do
+ %q(<span id="LC1" class="line" lang="diff"><span class="gi">+aaa</span></span>
+<span id="LC2" class="line" lang="diff"><span class="gi">+bbb</span></span>
+<span id="LC3" class="line" lang="diff"><span class="gd">- ccc</span></span>
+<span id="LC4" class="line" lang="diff"> ddd</span>)
+ end
+
+ it 'highlights each line properly' do
+ result = described_class.highlight(file_name, content)
- it 'highlights as json with erb' do
- expect(highlighter.lexer.tag).to eq 'erb'
- expect(highlighter.lexer.parent.tag).to eq 'json'
+ expect(result).to eq(expected)
end
end
- end
- describe '#highlight' do
describe 'with CRLF' do
let(:branch) { 'crlf-diff' }
let(:path) { 'files/whitespace' }
let(:blob) { repository.blob_at_branch(branch, path) }
let(:lines) do
- described_class.highlight(blob.path, blob.data, repository: repository).lines
+ described_class.highlight(blob.path, blob.data).lines
end
it 'strips extra LFs' do
@@ -56,5 +97,22 @@ describe Gitlab::Highlight do
described_class.highlight('file.name', 'Contents')
end
+
+ context 'timeout' do
+ subject { described_class.new('file.name', 'Contents') }
+
+ it 'utilizes timeout for web' do
+ expect(Timeout).to receive(:timeout).with(described_class::TIMEOUT_FOREGROUND).and_call_original
+
+ subject.highlight("Content")
+ end
+
+ it 'utilizes longer timeout for sidekiq' do
+ allow(Sidekiq).to receive(:server?).and_return(true)
+ expect(Timeout).to receive(:timeout).with(described_class::TIMEOUT_BACKGROUND).and_call_original
+
+ subject.highlight("Content")
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/hook_data/base_builder_spec.rb b/spec/lib/gitlab/hook_data/base_builder_spec.rb
index a921dd766c3..e3c5ee3b905 100644
--- a/spec/lib/gitlab/hook_data/base_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/base_builder_spec.rb
@@ -8,57 +8,94 @@ describe Gitlab::HookData::BaseBuilder do
end
end
- subject { subclass.new(nil) }
-
using RSpec::Parameterized::TableSyntax
- where do
- {
- 'relative image URL' => {
- input: '![an image](foo.png)',
- output: "![an image](#{Gitlab.config.gitlab.url}/foo.png)"
- },
- 'HTTP URL' => {
- input: '![an image](http://example.com/foo.png)',
- output: '![an image](http://example.com/foo.png)'
- },
- 'HTTPS URL' => {
- input: '![an image](https://example.com/foo.png)',
- output: '![an image](https://example.com/foo.png)'
- },
- 'protocol-relative URL' => {
- input: '![an image](//example.com/foo.png)',
- output: '![an image](//example.com/foo.png)'
- },
- 'URL reference by title' => {
- input: "![foo]\n\n[foo]: foo.png",
- output: "![foo]\n\n[foo]: foo.png"
- },
- 'URL reference by label' => {
- input: "![][foo]\n\n[foo]: foo.png",
- output: "![][foo]\n\n[foo]: foo.png"
- },
- 'in Markdown inline code block' => {
- input: '`![an image](foo.png)`',
- output: "`![an image](#{Gitlab.config.gitlab.url}/foo.png)`"
- },
- 'in HTML tag on the same line' => {
- input: '<p>![an image](foo.png)</p>',
- output: "<p>![an image](#{Gitlab.config.gitlab.url}/foo.png)</p>"
- },
- 'in Markdown multi-line code block' => {
- input: "```\n![an image](foo.png)\n```",
- output: "```\n![an image](foo.png)\n```"
- },
- 'in HTML tag on different lines' => {
- input: "<p>\n![an image](foo.png)\n</p>",
- output: "<p>\n![an image](foo.png)\n</p>"
+ context 'with an upload prefix specified' do
+ let(:project_with_path) { double(full_path: 'baz/bar') }
+ let(:object_with_project) { double(project: project_with_path) }
+ subject { subclass.new(object_with_project) }
+
+ where do
+ {
+ 'relative image URL' => {
+ input: '![an image](foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/foo.png)"
+ },
+ 'absolute upload URL' => {
+ input: '![an image](/uploads/foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/baz/bar/uploads/foo.png)"
+ },
+ 'absolute non-upload URL' => {
+ input: '![an image](/downloads/foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/downloads/foo.png)"
+ }
}
- }
+ end
+
+ with_them do
+ it { expect(subject.absolute_image_urls(input)).to eq(output) }
+ end
end
- with_them do
- it { expect(subject.absolute_image_urls(input)).to eq(output) }
+ context 'without an upload prefix specified' do
+ subject { subclass.new(nil) }
+
+ where do
+ {
+ 'relative image URL' => {
+ input: '![an image](foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/foo.png)"
+ },
+ 'absolute upload URL' => {
+ input: '![an image](/uploads/foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/uploads/foo.png)"
+ },
+ 'absolute non-upload URL' => {
+ input: '![an image](/downloads/foo.png)',
+ output: "![an image](#{Gitlab.config.gitlab.url}/downloads/foo.png)"
+ },
+ 'HTTP URL' => {
+ input: '![an image](http://example.com/foo.png)',
+ output: '![an image](http://example.com/foo.png)'
+ },
+ 'HTTPS URL' => {
+ input: '![an image](https://example.com/foo.png)',
+ output: '![an image](https://example.com/foo.png)'
+ },
+ 'protocol-relative URL' => {
+ input: '![an image](//example.com/foo.png)',
+ output: '![an image](//example.com/foo.png)'
+ },
+ 'URL reference by title' => {
+ input: "![foo]\n\n[foo]: foo.png",
+ output: "![foo]\n\n[foo]: foo.png"
+ },
+ 'URL reference by label' => {
+ input: "![][foo]\n\n[foo]: foo.png",
+ output: "![][foo]\n\n[foo]: foo.png"
+ },
+ 'in Markdown inline code block' => {
+ input: '`![an image](foo.png)`',
+ output: "`![an image](#{Gitlab.config.gitlab.url}/foo.png)`"
+ },
+ 'in HTML tag on the same line' => {
+ input: '<p>![an image](foo.png)</p>',
+ output: "<p>![an image](#{Gitlab.config.gitlab.url}/foo.png)</p>"
+ },
+ 'in Markdown multi-line code block' => {
+ input: "```\n![an image](foo.png)\n```",
+ output: "```\n![an image](foo.png)\n```"
+ },
+ 'in HTML tag on different lines' => {
+ input: "<p>\n![an image](foo.png)\n</p>",
+ output: "<p>\n![an image](foo.png)\n</p>"
+ }
+ }
+ end
+
+ with_them do
+ it { expect(subject.absolute_image_urls(input)).to eq(output) }
+ end
end
end
end
diff --git a/spec/lib/gitlab/hook_data/issue_builder_spec.rb b/spec/lib/gitlab/hook_data/issue_builder_spec.rb
index 60093474f8a..f066c0e3813 100644
--- a/spec/lib/gitlab/hook_data/issue_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/issue_builder_spec.rb
@@ -46,7 +46,10 @@ describe Gitlab::HookData::IssueBuilder do
let(:builder) { described_class.new(issue_with_description) }
it 'sets the image to use an absolute URL' do
- expect(data[:description]).to eq("test![Issue_Image](#{Settings.gitlab.url}/uploads/abc/Issue_Image.png)")
+ expected_path = "#{issue_with_description.project.path_with_namespace}/uploads/abc/Issue_Image.png"
+
+ expect(data[:description])
+ .to eq("test![Issue_Image](#{Settings.gitlab.url}/#{expected_path})")
end
end
end
diff --git a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
index dd586af6118..9ce697adbba 100644
--- a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
@@ -58,11 +58,14 @@ describe Gitlab::HookData::MergeRequestBuilder do
end
context 'when the MR has an image in the description' do
- let(:mr_with_description) { create(:merge_request, description: 'test![Issue_Image](/uploads/abc/Issue_Image.png)') }
+ let(:mr_with_description) { create(:merge_request, description: 'test![MR_Image](/uploads/abc/MR_Image.png)') }
let(:builder) { described_class.new(mr_with_description) }
it 'sets the image to use an absolute URL' do
- expect(data[:description]).to eq("test![Issue_Image](#{Settings.gitlab.url}/uploads/abc/Issue_Image.png)")
+ expected_path = "#{mr_with_description.project.path_with_namespace}/uploads/abc/MR_Image.png"
+
+ expect(data[:description])
+ .to eq("test![MR_Image](#{Settings.gitlab.url}/#{expected_path})")
end
end
end
diff --git a/spec/lib/gitlab/http_spec.rb b/spec/lib/gitlab/http_spec.rb
index d0dadfa78da..6c37c157f5d 100644
--- a/spec/lib/gitlab/http_spec.rb
+++ b/spec/lib/gitlab/http_spec.rb
@@ -46,4 +46,30 @@ describe Gitlab::HTTP do
end
end
end
+
+ describe 'handle redirect loops' do
+ before do
+ WebMock.stub_request(:any, "http://example.org").to_raise(HTTParty::RedirectionTooDeep.new("Redirection Too Deep"))
+ end
+
+ it 'handles GET requests' do
+ expect { described_class.get('http://example.org') }.to raise_error(Gitlab::HTTP::RedirectionTooDeep)
+ end
+
+ it 'handles POST requests' do
+ expect { described_class.post('http://example.org') }.to raise_error(Gitlab::HTTP::RedirectionTooDeep)
+ end
+
+ it 'handles PUT requests' do
+ expect { described_class.put('http://example.org') }.to raise_error(Gitlab::HTTP::RedirectionTooDeep)
+ end
+
+ it 'handles DELETE requests' do
+ expect { described_class.delete('http://example.org') }.to raise_error(Gitlab::HTTP::RedirectionTooDeep)
+ end
+
+ it 'handles HEAD requests' do
+ expect { described_class.head('http://example.org') }.to raise_error(Gitlab::HTTP::RedirectionTooDeep)
+ end
+ end
end
diff --git a/spec/lib/gitlab/identifier_spec.rb b/spec/lib/gitlab/identifier_spec.rb
index 0385dd762c2..1e583f4cee2 100644
--- a/spec/lib/gitlab/identifier_spec.rb
+++ b/spec/lib/gitlab/identifier_spec.rb
@@ -11,11 +11,8 @@ describe Gitlab::Identifier do
describe '#identify' do
context 'without an identifier' do
- it 'identifies the user using a commit' do
- expect(identifier).to receive(:identify_using_commit)
- .with(project, '123')
-
- identifier.identify('', project, '123')
+ it 'returns nil' do
+ expect(identifier.identify('')).to be nil
end
end
@@ -24,7 +21,7 @@ describe Gitlab::Identifier do
expect(identifier).to receive(:identify_using_user)
.with("user-#{user.id}")
- identifier.identify("user-#{user.id}", project, '123')
+ identifier.identify("user-#{user.id}")
end
end
@@ -33,49 +30,11 @@ describe Gitlab::Identifier do
expect(identifier).to receive(:identify_using_ssh_key)
.with("key-#{key.id}")
- identifier.identify("key-#{key.id}", project, '123')
+ identifier.identify("key-#{key.id}")
end
end
end
- describe '#identify_using_commit' do
- it "returns the User for an existing commit author's Email address" do
- commit = double(:commit, author: user, author_email: user.email)
-
- expect(project).to receive(:commit).with('123').and_return(commit)
-
- expect(identifier.identify_using_commit(project, '123')).to eq(user)
- end
-
- it 'returns nil when no user could be found' do
- allow(project).to receive(:commit).with('123').and_return(nil)
-
- expect(identifier.identify_using_commit(project, '123')).to be_nil
- end
-
- it 'returns nil when the commit does not have an author Email' do
- commit = double(:commit, author_email: nil)
-
- expect(project).to receive(:commit).with('123').and_return(commit)
-
- expect(identifier.identify_using_commit(project, '123')).to be_nil
- end
-
- it 'caches the found users per Email' do
- commit = double(:commit, author: user, author_email: user.email)
-
- expect(project).to receive(:commit).with('123').twice.and_return(commit)
-
- 2.times do
- expect(identifier.identify_using_commit(project, '123')).to eq(user)
- end
- end
-
- it 'returns nil if the project & ref are not present' do
- expect(identifier.identify_using_commit(nil, nil)).to be_nil
- end
- end
-
describe '#identify_using_user' do
it 'returns the User for an existing ID in the identifier' do
found = identifier.identify_using_user("user-#{user.id}")
diff --git a/spec/lib/gitlab/import/database_helpers_spec.rb b/spec/lib/gitlab/import/database_helpers_spec.rb
new file mode 100644
index 00000000000..e716155b7d5
--- /dev/null
+++ b/spec/lib/gitlab/import/database_helpers_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Import::DatabaseHelpers do
+ let(:database_helper) do
+ Class.new do
+ include Gitlab::Import::DatabaseHelpers
+ end
+ end
+
+ subject { database_helper.new }
+
+ describe '.insert_and_return_id' do
+ let(:attributes) { { iid: 1, title: 'foo' } }
+ let(:project) { create(:project) }
+
+ context 'on PostgreSQL' do
+ it 'returns the ID returned by the query' do
+ expect(Gitlab::Database)
+ .to receive(:bulk_insert)
+ .with(Issue.table_name, [attributes], return_ids: true)
+ .and_return([10])
+
+ id = subject.insert_and_return_id(attributes, project.issues)
+
+ expect(id).to eq(10)
+ end
+ end
+
+ context 'on MySQL' do
+ it 'uses a separate query to retrieve the ID' do
+ issue = create(:issue, project: project, iid: attributes[:iid])
+
+ expect(Gitlab::Database)
+ .to receive(:bulk_insert)
+ .with(Issue.table_name, [attributes], return_ids: true)
+ .and_return([])
+
+ id = subject.insert_and_return_id(attributes, project.issues)
+
+ expect(id).to eq(issue.id)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import/merge_request_creator_spec.rb b/spec/lib/gitlab/import/merge_request_creator_spec.rb
new file mode 100644
index 00000000000..7c73e9b39f7
--- /dev/null
+++ b/spec/lib/gitlab/import/merge_request_creator_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Import::MergeRequestCreator do
+ let(:project) { create(:project, :repository) }
+
+ subject { described_class.new(project) }
+
+ describe '#execute' do
+ context 'merge request already exists' do
+ let(:merge_request) { create(:merge_request, target_project: project, source_project: project) }
+ let(:commits) { merge_request.merge_request_diffs.first.commits }
+ let(:attributes) { HashWithIndifferentAccess.new(merge_request.attributes.except("merge_params")) }
+
+ it 'updates the data' do
+ commits_count = commits.count
+ merge_request.merge_request_diffs.destroy_all # rubocop: disable DestroyAll
+
+ expect(merge_request.merge_request_diffs.count).to eq(0)
+
+ subject.execute(attributes)
+
+ expect(merge_request.reload.merge_request_diffs.count).to eq(1)
+ expect(merge_request.reload.merge_request_diffs.first.commits.count).to eq(commits_count)
+ end
+ end
+
+ context 'new merge request' do
+ let(:merge_request) { build(:merge_request, target_project: project, source_project: project) }
+ let(:attributes) { HashWithIndifferentAccess.new(merge_request.attributes.except("merge_params")) }
+
+ it 'creates a new merge request' do
+ attributes.delete(:id)
+
+ expect { subject.execute(attributes) }.to change { MergeRequest.count }.by(1)
+
+ new_mr = MergeRequest.last
+ expect(new_mr.merge_request_diffs.count).to eq(1)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_object_storage_spec.rb b/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_object_storage_spec.rb
deleted file mode 100644
index 5059d68e54b..00000000000
--- a/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_object_storage_spec.rb
+++ /dev/null
@@ -1,105 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::ImportExport::AfterExportStrategies::BaseAfterExportStrategy do
- let!(:service) { described_class.new }
- let!(:project) { create(:project, :with_object_export) }
- let(:shared) { project.import_export_shared }
- let!(:user) { create(:user) }
-
- describe '#execute' do
- before do
- allow(service).to receive(:strategy_execute)
- stub_feature_flags(import_export_object_storage: true)
- end
-
- it 'returns if project exported file is not found' do
- allow(project).to receive(:export_project_object_exists?).and_return(false)
-
- expect(service).not_to receive(:strategy_execute)
-
- service.execute(user, project)
- end
-
- it 'creates a lock file in the export dir' do
- allow(service).to receive(:delete_after_export_lock)
-
- service.execute(user, project)
-
- expect(lock_path_exist?).to be_truthy
- end
-
- context 'when the method succeeds' do
- it 'removes the lock file' do
- service.execute(user, project)
-
- expect(lock_path_exist?).to be_falsey
- end
- end
-
- context 'when the method fails' do
- before do
- allow(service).to receive(:strategy_execute).and_call_original
- end
-
- context 'when validation fails' do
- before do
- allow(service).to receive(:invalid?).and_return(true)
- end
-
- it 'does not create the lock file' do
- expect(service).not_to receive(:create_or_update_after_export_lock)
-
- service.execute(user, project)
- end
-
- it 'does not execute main logic' do
- expect(service).not_to receive(:strategy_execute)
-
- service.execute(user, project)
- end
-
- it 'logs validation errors in shared context' do
- expect(service).to receive(:log_validation_errors)
-
- service.execute(user, project)
- end
- end
-
- context 'when an exception is raised' do
- it 'removes the lock' do
- expect { service.execute(user, project) }.to raise_error(NotImplementedError)
-
- expect(lock_path_exist?).to be_falsey
- end
- end
- end
- end
-
- describe '#log_validation_errors' do
- it 'add the message to the shared context' do
- errors = %w(test_message test_message2)
-
- allow(service).to receive(:invalid?).and_return(true)
- allow(service.errors).to receive(:full_messages).and_return(errors)
-
- expect(shared).to receive(:add_error_message).twice.and_call_original
-
- service.execute(user, project)
-
- expect(shared.errors).to eq errors
- end
- end
-
- describe '#to_json' do
- it 'adds the current strategy class to the serialized attributes' do
- params = { param1: 1 }
- result = params.merge(klass: described_class.to_s).to_json
-
- expect(described_class.new(params).to_json).to eq result
- end
- end
-
- def lock_path_exist?
- File.exist?(described_class.lock_file_path(project))
- end
-end
diff --git a/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb b/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb
index 566b7f46c87..9a442de2900 100644
--- a/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb
+++ b/spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb
@@ -9,11 +9,10 @@ describe Gitlab::ImportExport::AfterExportStrategies::BaseAfterExportStrategy do
describe '#execute' do
before do
allow(service).to receive(:strategy_execute)
- stub_feature_flags(import_export_object_storage: false)
end
it 'returns if project exported file is not found' do
- allow(project).to receive(:export_project_path).and_return(nil)
+ allow(project).to receive(:export_file_exists?).and_return(false)
expect(service).not_to receive(:strategy_execute)
diff --git a/spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb b/spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb
index 7f2e0a4ee2c..ec17ad8541f 100644
--- a/spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb
+++ b/spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb
@@ -24,34 +24,13 @@ describe Gitlab::ImportExport::AfterExportStrategies::WebUploadStrategy do
end
describe '#execute' do
- context 'without object storage' do
- before do
- stub_feature_flags(import_export_object_storage: false)
- end
-
- it 'removes the exported project file after the upload' do
- allow(strategy).to receive(:send_file)
- allow(strategy).to receive(:handle_response_error)
-
- expect(project).to receive(:remove_exported_project_file)
-
- strategy.execute(user, project)
- end
- end
-
- context 'with object storage' do
- before do
- stub_feature_flags(import_export_object_storage: true)
- end
+ it 'removes the exported project file after the upload' do
+ allow(strategy).to receive(:send_file)
+ allow(strategy).to receive(:handle_response_error)
- it 'removes the exported project file after the upload' do
- allow(strategy).to receive(:send_file)
- allow(strategy).to receive(:handle_response_error)
+ expect(project).to receive(:remove_exports)
- expect(project).to receive(:remove_exported_project_file)
-
- strategy.execute(user, project)
- end
+ strategy.execute(user, project)
end
end
end
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index e9a1932407d..1d184375a52 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -117,6 +117,7 @@ pipelines:
- retryable_builds
- cancelable_statuses
- manual_actions
+- scheduled_actions
- artifacts
- pipeline_schedule
- merge_requests
@@ -197,6 +198,7 @@ project:
- last_event
- services
- campfire_service
+- discord_service
- drone_ci_service
- emails_on_push_service
- pipelines_email_service
@@ -210,7 +212,6 @@ project:
- flowdock_service
- assembla_service
- asana_service
-- gemnasium_service
- slack_service
- microsoft_teams_service
- mattermost_service
@@ -229,9 +230,8 @@ project:
- mock_ci_service
- mock_deployment_service
- mock_monitoring_service
-- forked_project_link
+- forked_to_members
- forked_from_project
-- forked_project_links
- forks
- merge_requests
- fork_merge_requests
@@ -289,6 +289,7 @@ project:
- fork_network_member
- fork_network
- custom_attributes
+- prometheus_metrics
- lfs_file_locks
- project_badges
- source_of_merge_requests
@@ -299,11 +300,14 @@ project:
- ci_cd_settings
- import_export_upload
- repository_languages
+- pool_repository
award_emoji:
- awardable
- user
priorities:
- label
+prometheus_metrics:
+- project
timelogs:
- issue
- merge_request
@@ -322,3 +326,9 @@ metrics:
- latest_closed_by
- merged_by
- pipeline
+resource_label_events:
+- user
+- issue
+- merge_request
+- epic
+- label
diff --git a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
index 65f073b2df3..87ab81d8169 100644
--- a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
+++ b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
@@ -23,15 +23,23 @@ describe 'Import/Export attribute configuration' do
let(:safe_attributes_file) { 'spec/lib/gitlab/import_export/safe_model_attributes.yml' }
let(:safe_model_attributes) { YAML.load_file(safe_attributes_file) }
+ let(:ee_safe_attributes_file) { 'ee/spec/lib/gitlab/import_export/safe_model_attributes.yml' }
+ let(:ee_safe_model_attributes) { File.exist?(ee_safe_attributes_file) ? YAML.load_file(ee_safe_attributes_file) : {} }
+
it 'has no new columns' do
relation_names.each do |relation_name|
relation_class = relation_class_for_name(relation_name)
relation_attributes = relation_class.new.attributes.keys
- expect(safe_model_attributes[relation_class.to_s]).not_to be_nil, "Expected exported class #{relation_class} to exist in safe_model_attributes"
-
current_attributes = parsed_attributes(relation_name, relation_attributes)
- safe_attributes = safe_model_attributes[relation_class.to_s]
+ safe_attributes = safe_model_attributes[relation_class.to_s].dup || []
+
+ ee_safe_model_attributes[relation_class.to_s].to_a.each do |attribute|
+ safe_attributes << attribute
+ end
+
+ expect(safe_attributes).not_to be_nil, "Expected exported class #{relation_class} to exist in safe_model_attributes"
+
new_attributes = current_attributes - safe_attributes
expect(new_attributes).to be_empty, failure_message(relation_class.to_s, new_attributes)
@@ -43,6 +51,7 @@ describe 'Import/Export attribute configuration' do
It looks like #{relation_class}, which is exported using the project Import/Export, has new attributes: #{new_attributes.join(',')}
Please add the attribute(s) to SAFE_MODEL_ATTRIBUTES if you consider this can be exported.
+ #{"If the model/associations are EE-specific, use `#{File.expand_path(ee_safe_attributes_file)}`.\n" if ee_safe_model_attributes.any?}
Otherwise, please blacklist the attribute(s) in IMPORT_EXPORT_CONFIG by adding it to its correspondent
model in the +excluded_attributes+ section.
diff --git a/spec/lib/gitlab/import_export/avatar_restorer_spec.rb b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb
index 4897d604bc1..e44ff6bbcbd 100644
--- a/spec/lib/gitlab/import_export/avatar_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb
@@ -6,22 +6,35 @@ describe Gitlab::ImportExport::AvatarRestorer do
let(:shared) { project.import_export_shared }
let(:project) { create(:project) }
- before do
- allow_any_instance_of(described_class).to receive(:avatar_export_file)
- .and_return(uploaded_image_temp_path)
- end
-
after do
project.remove_avatar!
end
- it 'restores a project avatar' do
- expect(described_class.new(project: project, shared: shared).restore).to be true
+ context 'with avatar' do
+ before do
+ allow_any_instance_of(described_class).to receive(:avatar_export_file)
+ .and_return(uploaded_image_temp_path)
+ end
+
+ it 'restores a project avatar' do
+ expect(described_class.new(project: project, shared: shared).restore).to be true
+ end
+
+ it 'saves the avatar into the project' do
+ described_class.new(project: project, shared: shared).restore
+
+ expect(project.reload.avatar.file.exists?).to be true
+ end
end
- it 'saves the avatar into the project' do
- described_class.new(project: project, shared: shared).restore
+ it 'does not break if there is just a directory' do
+ Dir.mktmpdir do |tmpdir|
+ FileUtils.mkdir_p("#{tmpdir}/a/b")
+
+ allow_any_instance_of(described_class).to receive(:avatar_export_path)
+ .and_return("#{tmpdir}/a")
- expect(project.reload.avatar.file.exists?).to be true
+ expect(described_class.new(project: project, shared: shared).restore).to be true
+ end
end
end
diff --git a/spec/lib/gitlab/import_export/avatar_saver_spec.rb b/spec/lib/gitlab/import_export/avatar_saver_spec.rb
index 90e6d653d34..2bd1b9924c6 100644
--- a/spec/lib/gitlab/import_export/avatar_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/avatar_saver_spec.rb
@@ -8,8 +8,7 @@ describe Gitlab::ImportExport::AvatarSaver do
before do
FileUtils.mkdir_p("#{shared.export_path}/avatar/")
- allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- stub_feature_flags(import_export_object_storage: false)
+ allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:export_path).and_return(export_path)
end
after do
@@ -19,7 +18,7 @@ describe Gitlab::ImportExport::AvatarSaver do
it 'saves a project avatar' do
described_class.new(project: project_with_avatar, shared: shared).save
- expect(File).to exist("#{shared.export_path}/avatar/dk.png")
+ expect(File).to exist(Dir["#{shared.export_path}/avatar/**/dk.png"].first)
end
it 'is fine not to have an avatar' do
diff --git a/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
deleted file mode 100644
index 287745eb40e..00000000000
--- a/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::ImportExport::FileImporter do
- let(:shared) { Gitlab::ImportExport::Shared.new(nil) }
- let(:storage_path) { "#{Dir.tmpdir}/file_importer_spec" }
- let(:valid_file) { "#{shared.export_path}/valid.json" }
- let(:symlink_file) { "#{shared.export_path}/invalid.json" }
- let(:hidden_symlink_file) { "#{shared.export_path}/.hidden" }
- let(:subfolder_symlink_file) { "#{shared.export_path}/subfolder/invalid.json" }
- let(:evil_symlink_file) { "#{shared.export_path}/.\nevil" }
-
- before do
- stub_const('Gitlab::ImportExport::FileImporter::MAX_RETRIES', 0)
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(FileUploader)
-
- allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(storage_path)
- allow_any_instance_of(Gitlab::ImportExport::CommandLineUtil).to receive(:untar_zxf).and_return(true)
- allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('test')
- allow(SecureRandom).to receive(:hex).and_return('abcd')
- setup_files
- end
-
- after do
- FileUtils.rm_rf(storage_path)
- end
-
- context 'normal run' do
- before do
- described_class.import(project: build(:project), archive_file: '', shared: shared)
- end
-
- it 'removes symlinks in root folder' do
- expect(File.exist?(symlink_file)).to be false
- end
-
- it 'removes hidden symlinks in root folder' do
- expect(File.exist?(hidden_symlink_file)).to be false
- end
-
- it 'removes evil symlinks in root folder' do
- expect(File.exist?(evil_symlink_file)).to be false
- end
-
- it 'removes symlinks in subfolders' do
- expect(File.exist?(subfolder_symlink_file)).to be false
- end
-
- it 'does not remove a valid file' do
- expect(File.exist?(valid_file)).to be true
- end
-
- it 'creates the file in the right subfolder' do
- expect(shared.export_path).to include('test/abcd')
- end
- end
-
- context 'error' do
- before do
- allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
- described_class.import(project: build(:project), archive_file: '', shared: shared)
- end
-
- it 'removes symlinks in root folder' do
- expect(File.exist?(symlink_file)).to be false
- end
-
- it 'removes hidden symlinks in root folder' do
- expect(File.exist?(hidden_symlink_file)).to be false
- end
-
- it 'removes symlinks in subfolders' do
- expect(File.exist?(subfolder_symlink_file)).to be false
- end
-
- it 'does not remove a valid file' do
- expect(File.exist?(valid_file)).to be true
- end
- end
-
- def setup_files
- FileUtils.mkdir_p("#{shared.export_path}/subfolder/")
- FileUtils.touch(valid_file)
- FileUtils.ln_s(valid_file, symlink_file)
- FileUtils.ln_s(valid_file, subfolder_symlink_file)
- FileUtils.ln_s(valid_file, hidden_symlink_file)
- FileUtils.ln_s(valid_file, evil_symlink_file)
- end
-end
diff --git a/spec/lib/gitlab/import_export/file_importer_spec.rb b/spec/lib/gitlab/import_export/file_importer_spec.rb
index 78fccdf1dfc..bf34cefe18f 100644
--- a/spec/lib/gitlab/import_export/file_importer_spec.rb
+++ b/spec/lib/gitlab/import_export/file_importer_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Gitlab::ImportExport::FileImporter do
let(:shared) { Gitlab::ImportExport::Shared.new(nil) }
- let(:export_path) { "#{Dir.tmpdir}/file_importer_spec" }
+ let(:storage_path) { "#{Dir.tmpdir}/file_importer_spec" }
let(:valid_file) { "#{shared.export_path}/valid.json" }
let(:symlink_file) { "#{shared.export_path}/invalid.json" }
let(:hidden_symlink_file) { "#{shared.export_path}/.hidden" }
@@ -11,7 +11,9 @@ describe Gitlab::ImportExport::FileImporter do
before do
stub_const('Gitlab::ImportExport::FileImporter::MAX_RETRIES', 0)
- allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
+ stub_uploads_object_storage(FileUploader)
+
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(storage_path)
allow_any_instance_of(Gitlab::ImportExport::CommandLineUtil).to receive(:untar_zxf).and_return(true)
allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('test')
allow(SecureRandom).to receive(:hex).and_return('abcd')
@@ -19,12 +21,12 @@ describe Gitlab::ImportExport::FileImporter do
end
after do
- FileUtils.rm_rf(export_path)
+ FileUtils.rm_rf(storage_path)
end
context 'normal run' do
before do
- described_class.import(project: nil, archive_file: '', shared: shared)
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
@@ -55,7 +57,7 @@ describe Gitlab::ImportExport::FileImporter do
context 'error' do
before do
allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
- described_class.import(project: nil, archive_file: '', shared: shared)
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
diff --git a/spec/lib/gitlab/import_export/importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
deleted file mode 100644
index 24a994b3611..00000000000
--- a/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
+++ /dev/null
@@ -1,115 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::ImportExport::Importer do
- let(:user) { create(:user) }
- let(:test_path) { "#{Dir.tmpdir}/importer_spec" }
- let(:shared) { project.import_export_shared }
- let(:project) { create(:project) }
- let(:import_file) { fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') }
-
- subject(:importer) { described_class.new(project) }
-
- before do
- allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
- allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(FileUploader)
-
- FileUtils.mkdir_p(shared.export_path)
- ImportExportUpload.create(project: project, import_file: import_file)
- end
-
- after do
- FileUtils.rm_rf(test_path)
- end
-
- describe '#execute' do
- it 'succeeds' do
- importer.execute
-
- expect(shared.errors).to be_empty
- end
-
- it 'extracts the archive' do
- expect(Gitlab::ImportExport::FileImporter).to receive(:import).and_call_original
-
- importer.execute
- end
-
- it 'checks the version' do
- expect(Gitlab::ImportExport::VersionChecker).to receive(:check!).and_call_original
-
- importer.execute
- end
-
- context 'all restores are executed' do
- [
- Gitlab::ImportExport::AvatarRestorer,
- Gitlab::ImportExport::RepoRestorer,
- Gitlab::ImportExport::WikiRestorer,
- Gitlab::ImportExport::UploadsRestorer,
- Gitlab::ImportExport::LfsRestorer,
- Gitlab::ImportExport::StatisticsRestorer
- ].each do |restorer|
- it "calls the #{restorer}" do
- fake_restorer = double(restorer.to_s)
-
- expect(fake_restorer).to receive(:restore).and_return(true).at_least(1)
- expect(restorer).to receive(:new).and_return(fake_restorer).at_least(1)
-
- importer.execute
- end
- end
-
- it 'restores the ProjectTree' do
- expect(Gitlab::ImportExport::ProjectTreeRestorer).to receive(:new).and_call_original
-
- importer.execute
- end
-
- it 'removes the import file' do
- expect(importer).to receive(:remove_import_file).and_call_original
-
- importer.execute
-
- expect(project.import_export_upload.import_file&.file).to be_nil
- end
- end
-
- context 'when project successfully restored' do
- let!(:existing_project) { create(:project, namespace: user.namespace) }
- let(:project) { create(:project, namespace: user.namespace, name: 'whatever', path: 'whatever') }
-
- before do
- restorers = double(:restorers, all?: true)
-
- allow(subject).to receive(:import_file).and_return(true)
- allow(subject).to receive(:check_version!).and_return(true)
- allow(subject).to receive(:restorers).and_return(restorers)
- allow(project).to receive(:import_data).and_return(double(data: { 'original_path' => existing_project.path }))
- end
-
- context 'when import_data' do
- context 'has original_path' do
- it 'overwrites existing project' do
- expect_any_instance_of(::Projects::OverwriteProjectService).to receive(:execute).with(existing_project)
-
- subject.execute
- end
- end
-
- context 'has not original_path' do
- before do
- allow(project).to receive(:import_data).and_return(double(data: {}))
- end
-
- it 'does not call the overwrite service' do
- expect_any_instance_of(::Projects::OverwriteProjectService).not_to receive(:execute).with(existing_project)
-
- subject.execute
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/import_export/importer_spec.rb b/spec/lib/gitlab/import_export/importer_spec.rb
index f07946824c4..11f98d782b1 100644
--- a/spec/lib/gitlab/import_export/importer_spec.rb
+++ b/spec/lib/gitlab/import_export/importer_spec.rb
@@ -4,16 +4,18 @@ describe Gitlab::ImportExport::Importer do
let(:user) { create(:user) }
let(:test_path) { "#{Dir.tmpdir}/importer_spec" }
let(:shared) { project.import_export_shared }
- let(:project) { create(:project, import_source: File.join(test_path, 'test_project_export.tar.gz')) }
+ let(:project) { create(:project) }
+ let(:import_file) { fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') }
subject(:importer) { described_class.new(project) }
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
+ stub_uploads_object_storage(FileUploader)
FileUtils.mkdir_p(shared.export_path)
- FileUtils.cp(Rails.root.join('spec/features/projects/import_export/test_project_export.tar.gz'), test_path)
+ ImportExportUpload.create(project: project, import_file: import_file)
end
after do
@@ -63,6 +65,24 @@ describe Gitlab::ImportExport::Importer do
importer.execute
end
+
+ it 'removes the import file' do
+ expect(importer).to receive(:remove_import_file).and_call_original
+
+ importer.execute
+
+ expect(project.import_export_upload.import_file&.file).to be_nil
+ end
+
+ it 'sets the correct visibility_level when visibility level is a string' do
+ project.create_or_update_import_data(
+ data: { override_params: { visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s } }
+ )
+
+ importer.execute
+
+ expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
+ end
end
context 'when project successfully restored' do
@@ -75,7 +95,6 @@ describe Gitlab::ImportExport::Importer do
allow(subject).to receive(:import_file).and_return(true)
allow(subject).to receive(:check_version!).and_return(true)
allow(subject).to receive(:restorers).and_return(restorers)
- allow(restorers).to receive(:all?).and_return(true)
allow(project).to receive(:import_data).and_return(double(data: { 'original_path' => existing_project.path }))
end
diff --git a/spec/lib/gitlab/import_export/model_configuration_spec.rb b/spec/lib/gitlab/import_export/model_configuration_spec.rb
index 5cb8f2589c8..2e28f978c3a 100644
--- a/spec/lib/gitlab/import_export/model_configuration_spec.rb
+++ b/spec/lib/gitlab/import_export/model_configuration_spec.rb
@@ -16,14 +16,30 @@ describe 'Import/Export model configuration' do
# - User, Author... Models we do not care about for checking models
names.flatten.uniq - %w(milestones labels user author) + ['project']
end
+ let(:ce_models_yml) { 'spec/lib/gitlab/import_export/all_models.yml' }
+ let(:ce_models_hash) { YAML.load_file(ce_models_yml) }
+
+ let(:ee_models_yml) { 'ee/spec/lib/gitlab/import_export/all_models.yml' }
+ let(:ee_models_hash) { File.exist?(ee_models_yml) ? YAML.load_file(ee_models_yml) : {} }
- let(:all_models_yml) { 'spec/lib/gitlab/import_export/all_models.yml' }
- let(:all_models) { YAML.load_file(all_models_yml) }
let(:current_models) { setup_models }
+ let(:all_models_hash) do
+ all_models_hash = ce_models_hash.dup
+
+ all_models_hash.each do |model, associations|
+ associations.concat(ee_models_hash[model] || [])
+ end
+
+ ee_models_hash.each do |model, associations|
+ all_models_hash[model] ||= associations
+ end
+
+ all_models_hash
+ end
it 'has no new models' do
model_names.each do |model_name|
- new_models = Array(current_models[model_name]) - Array(all_models[model_name])
+ new_models = Array(current_models[model_name]) - Array(all_models_hash[model_name])
expect(new_models).to be_empty, failure_message(model_name.classify, new_models)
end
end
@@ -31,27 +47,21 @@ describe 'Import/Export model configuration' do
# List of current models between models, in the format of
# {model: [model_2, model3], ...}
def setup_models
- all_models_hash = {}
-
- model_names.each do |model_name|
- model_class = relation_class_for_name(model_name)
-
- all_models_hash[model_name] = associations_for(model_class) - ['project']
+ model_names.each_with_object({}) do |model_name, hash|
+ hash[model_name] = associations_for(relation_class_for_name(model_name)) - ['project']
end
-
- all_models_hash
end
def failure_message(parent_model_name, new_models)
- <<-MSG
+ <<~MSG
New model(s) <#{new_models.join(',')}> have been added, related to #{parent_model_name}, which is exported by
the Import/Export feature.
- If you think this model should be included in the export, please add it to IMPORT_EXPORT_CONFIG.
- Definitely add it to MODELS_JSON to signal that you've handled this error and to prevent it from showing up in the future.
+ If you think this model should be included in the export, please add it to `#{Gitlab::ImportExport.config_file}`.
- MODELS_JSON: #{File.expand_path(all_models_yml)}
- IMPORT_EXPORT_CONFIG: #{Gitlab::ImportExport.config_file}
+ Definitely add it to `#{File.expand_path(ce_models_yml)}`
+ #{"or `#{File.expand_path(ee_models_yml)}` if the model/associations are EE-specific\n" if ee_models_hash.any?}
+ to signal that you've handled this error and to prevent it from showing up in the future.
MSG
end
end
diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json
index 1b7fa11cb3c..58949f76bd6 100644
--- a/spec/lib/gitlab/import_export/project.json
+++ b/spec/lib/gitlab/import_export/project.json
@@ -331,6 +331,28 @@
},
"events": []
}
+ ],
+ "resource_label_events": [
+ {
+ "id":244,
+ "action":"remove",
+ "issue_id":40,
+ "merge_request_id":null,
+ "label_id":2,
+ "user_id":1,
+ "created_at":"2018-08-28T08:24:00.494Z",
+ "label": {
+ "id": 2,
+ "title": "test2",
+ "color": "#428bca",
+ "project_id": 8,
+ "created_at": "2016-07-22T08:55:44.161Z",
+ "updated_at": "2016-07-22T08:55:44.161Z",
+ "template": false,
+ "description": "",
+ "type": "ProjectLabel"
+ }
+ }
]
},
{
@@ -2515,6 +2537,17 @@
"events": []
}
],
+ "resource_label_events": [
+ {
+ "id":243,
+ "action":"add",
+ "issue_id":null,
+ "merge_request_id":27,
+ "label_id":null,
+ "user_id":1,
+ "created_at":"2018-08-28T08:24:00.494Z"
+ }
+ ],
"merge_request_diff": {
"id": 27,
"state": "collected",
@@ -2523,7 +2556,7 @@
"merge_request_diff_id": 27,
"relative_order": 0,
"sha": "bb5206fee213d983da88c47f9cf4cc6caf9c66dc",
- "message": "Feature conflcit added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n",
+ "message": "Feature conflict added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n",
"authored_date": "2014-08-06T08:35:52.000+02:00",
"author_name": "Dmitriy Zaporozhets",
"author_email": "dmitriy.zaporozhets@gmail.com",
@@ -3572,7 +3605,7 @@
"merge_request_diff_id": 14,
"relative_order": 8,
"sha": "08f22f255f082689c0d7d39d19205085311542bc",
- "message": "remove emtpy file.(beacase git ignore empty file)\nadd whitespace test file.\n",
+ "message": "remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n",
"authored_date": "2015-11-13T06:00:16.000+01:00",
"author_name": "윤민식",
"author_email": "minsik.yoon@samsung.com",
@@ -4257,7 +4290,7 @@
"merge_request_diff_id": 13,
"relative_order": 8,
"sha": "08f22f255f082689c0d7d39d19205085311542bc",
- "message": "remove emtpy file.(beacase git ignore empty file)\nadd whitespace test file.\n",
+ "message": "remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n",
"authored_date": "2015-11-13T06:00:16.000+01:00",
"author_name": "윤민식",
"author_email": "minsik.yoon@samsung.com",
@@ -4766,7 +4799,7 @@
"merge_request_diff_id": 12,
"relative_order": 8,
"sha": "08f22f255f082689c0d7d39d19205085311542bc",
- "message": "remove emtpy file.(beacase git ignore empty file)\nadd whitespace test file.\n",
+ "message": "remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n",
"authored_date": "2015-11-13T06:00:16.000+01:00",
"author_name": "윤민식",
"author_email": "minsik.yoon@samsung.com",
@@ -5474,7 +5507,7 @@
"merge_request_diff_id": 10,
"relative_order": 8,
"sha": "08f22f255f082689c0d7d39d19205085311542bc",
- "message": "remove emtpy file.(beacase git ignore empty file)\nadd whitespace test file.\n",
+ "message": "remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n",
"authored_date": "2015-11-13T06:00:16.000+01:00",
"author_name": "윤민식",
"author_email": "minsik.yoon@samsung.com",
@@ -6110,7 +6143,7 @@
"id": 36,
"project_id": 5,
"ref": "master",
- "sha": "be93687618e4b132087f430a4d8fc3a609c9b77c",
+ "sha": "sha-notes",
"before_sha": null,
"push_data": null,
"created_at": "2016-03-22T15:20:35.755Z",
@@ -6121,6 +6154,7 @@
"status": "failed",
"started_at": null,
"finished_at": null,
+ "user_id": 9999,
"duration": null,
"notes": [
{
@@ -6320,6 +6354,7 @@
},
{
"id": 38,
+ "iid": 1,
"project_id": 5,
"ref": "master",
"sha": "5f923865dde3436854e9ceb9cdb7815618d4e849",
diff --git a/spec/lib/gitlab/import_export/project.light.json b/spec/lib/gitlab/import_export/project.light.json
index ba2248073f5..2971ca0f0f8 100644
--- a/spec/lib/gitlab/import_export/project.light.json
+++ b/spec/lib/gitlab/import_export/project.light.json
@@ -101,6 +101,28 @@
]
}
],
+ "services": [
+ {
+ "id": 100,
+ "title": "JetBrains TeamCity CI",
+ "project_id": 5,
+ "created_at": "2016-06-14T15:01:51.315Z",
+ "updated_at": "2016-06-14T15:01:51.315Z",
+ "active": false,
+ "properties": {},
+ "template": true,
+ "push_events": true,
+ "issues_events": true,
+ "merge_requests_events": true,
+ "tag_push_events": true,
+ "note_events": true,
+ "job_events": true,
+ "type": "TeamcityService",
+ "category": "ci",
+ "default": false,
+ "wiki_page_events": true
+ }
+ ],
"snippets": [],
"hooks": []
}
diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
index a88ac0a091e..7171e12a849 100644
--- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
@@ -59,7 +59,11 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end
it 'creates a valid pipeline note' do
- expect(Ci::Pipeline.first.notes).not_to be_empty
+ expect(Ci::Pipeline.find_by_sha('sha-notes').notes).not_to be_empty
+ end
+
+ it 'pipeline has the correct user ID' do
+ expect(Ci::Pipeline.find_by_sha('sha-notes').user_id).to eq(@user.id)
end
it 'restores pipelines with missing ref' do
@@ -89,6 +93,14 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
expect(ProtectedTag.first.create_access_levels).not_to be_empty
end
+ it 'restores issue resource label events' do
+ expect(Issue.find_by(title: 'Voluptatem').resource_label_events).not_to be_empty
+ end
+
+ it 'restores merge requests resource label events' do
+ expect(MergeRequest.find_by(title: 'MR1').resource_label_events).not_to be_empty
+ end
+
context 'event at forth level of the tree' do
let(:event) { Event.where(action: 6).first }
@@ -285,7 +297,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
issues: 1,
labels: 1,
milestones: 1,
- first_issue_labels: 1
+ first_issue_labels: 1,
+ services: 1
context 'project.json file access check' do
it 'does not read a symlink' do
@@ -309,7 +322,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end
end
- context 'when the project has overriden params in import data' do
+ context 'when the project has overridden params in import data' do
it 'overwrites the params stored in the JSON' do
project.create_import_data(data: { override_params: { description: "Overridden" } })
@@ -323,7 +336,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
restored_project_json
- expect(project.lfs_enabled).to be_nil
+ expect(project.lfs_enabled).to be_falsey
end
end
@@ -370,6 +383,12 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
project_tree_restorer.instance_variable_set(:@path, "spec/lib/gitlab/import_export/project.light.json")
end
+ it 'does not import any templated services' do
+ restored_project_json
+
+ expect(project.services.where(template: true).count).to eq(0)
+ end
+
it 'imports labels' do
create(:group_label, name: 'Another label', group: project.group)
diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
index fec8a2af9ab..5dc372263ad 100644
--- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
@@ -169,6 +169,14 @@ describe Gitlab::ImportExport::ProjectTreeSaver do
expect(priorities.flatten).not_to be_empty
end
+ it 'has issue resource label events' do
+ expect(saved_project_json['issues'].first['resource_label_events']).not_to be_empty
+ end
+
+ it 'has merge request resource label events' do
+ expect(saved_project_json['merge_requests'].first['resource_label_events']).not_to be_empty
+ end
+
it 'saves the correct service type' do
expect(saved_project_json['services'].first['type']).to eq('CustomIssueTrackerService')
end
@@ -291,6 +299,9 @@ describe Gitlab::ImportExport::ProjectTreeSaver do
project: project,
commit_id: ci_build.pipeline.sha)
+ create(:resource_label_event, label: project_label, issue: issue)
+ create(:resource_label_event, label: group_label, merge_request: merge_request)
+
create(:event, :created, target: milestone, project: project, author: user)
create(:service, project: project, type: 'CustomIssueTrackerService', category: 'issue_tracker', properties: { one: 'value' })
diff --git a/spec/lib/gitlab/import_export/relation_factory_spec.rb b/spec/lib/gitlab/import_export/relation_factory_spec.rb
index cf9e0f71910..a31f77484d8 100644
--- a/spec/lib/gitlab/import_export/relation_factory_spec.rb
+++ b/spec/lib/gitlab/import_export/relation_factory_spec.rb
@@ -191,9 +191,7 @@ describe Gitlab::ImportExport::RelationFactory do
"author" => {
"name" => "Administrator"
},
- "events" => [
-
- ]
+ "events" => []
}
end
diff --git a/spec/lib/gitlab/import_export/repo_restorer_spec.rb b/spec/lib/gitlab/import_export/repo_restorer_spec.rb
index 7ffa84f906d..8a699eb1461 100644
--- a/spec/lib/gitlab/import_export/repo_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/repo_restorer_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Gitlab::ImportExport::RepoRestorer do
+ include GitHelpers
+
describe 'bundle a project Git repo' do
let(:user) { create(:user) }
let!(:project_with_repo) { create(:project, :repository, name: 'test-repo-restorer', path: 'test-repo-restorer') }
@@ -36,9 +38,7 @@ describe Gitlab::ImportExport::RepoRestorer do
it 'has the webhooks' do
restorer.restore
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- expect(Gitlab::Git::Hook.new('post-receive', project.repository.raw_repository)).to exist
- end
+ expect(project_hook_exists?(project)).to be true
end
end
end
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 0a1e3eb83d3..f7935149b23 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -300,6 +300,7 @@ CommitStatus:
- retried
- protected
- failure_reason
+- scheduled_at
Ci::Variable:
- id
- project_id
@@ -416,6 +417,7 @@ ProjectHook:
- type
- service_id
- push_events
+- push_events_branch_filter
- issues_events
- merge_requests_events
- tag_push_events
@@ -491,6 +493,7 @@ ProjectFeature:
- snippets_access_level
- builds_access_level
- repository_access_level
+- pages_access_level
- created_at
- updated_at
ProtectedBranch::MergeAccessLevel:
@@ -554,6 +557,19 @@ ProjectCustomAttribute:
- project_id
- key
- value
+PrometheusMetric:
+- id
+- created_at
+- updated_at
+- project_id
+- y_label
+- unit
+- legend
+- title
+- query
+- group
+- common
+- identifier
Badge:
- id
- link_url
@@ -565,3 +581,11 @@ Badge:
- type
ProjectCiCdSetting:
- group_runners_enabled
+ResourceLabelEvent:
+- id
+- action
+- issue_id
+- merge_request_id
+- label_id
+- user_id
+- created_at
diff --git a/spec/lib/gitlab/import_export/saver_spec.rb b/spec/lib/gitlab/import_export/saver_spec.rb
index 02f1a4b81aa..d185ff2dfcc 100644
--- a/spec/lib/gitlab/import_export/saver_spec.rb
+++ b/spec/lib/gitlab/import_export/saver_spec.rb
@@ -18,26 +18,12 @@ describe Gitlab::ImportExport::Saver do
FileUtils.rm_rf(export_path)
end
- context 'local archive' do
- it 'saves the repo to disk' do
- stub_feature_flags(import_export_object_storage: false)
+ it 'saves the repo using object storage' do
+ stub_uploads_object_storage(ImportExportUploader)
- subject.save
+ subject.save
- expect(shared.errors).to be_empty
- expect(Dir.empty?(shared.archive_path)).to be false
- end
- end
-
- context 'object storage' do
- it 'saves the repo using object storage' do
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(ImportExportUploader)
-
- subject.save
-
- expect(ImportExportUpload.find_by(project: project).export_file.url)
- .to match(%r[\/uploads\/-\/system\/import_export_upload\/export_file.*])
- end
+ expect(ImportExportUpload.find_by(project: project).export_file.url)
+ .to match(%r[\/uploads\/-\/system\/import_export_upload\/export_file.*])
end
end
diff --git a/spec/lib/gitlab/import_export/uploads_manager_spec.rb b/spec/lib/gitlab/import_export/uploads_manager_spec.rb
index 9c3870a0af8..792117e1df1 100644
--- a/spec/lib/gitlab/import_export/uploads_manager_spec.rb
+++ b/spec/lib/gitlab/import_export/uploads_manager_spec.rb
@@ -4,6 +4,7 @@ describe Gitlab::ImportExport::UploadsManager do
let(:shared) { project.import_export_shared }
let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" }
let(:project) { create(:project) }
+ let(:upload) { create(:upload, :issuable_upload, :object_storage, model: project) }
let(:exported_file_path) { "#{shared.export_path}/uploads/#{upload.secret}/#{File.basename(upload.path)}" }
subject(:manager) { described_class.new(project: project, shared: shared) }
@@ -36,45 +37,53 @@ describe Gitlab::ImportExport::UploadsManager do
expect(File).to exist(exported_file_path)
end
- end
- context 'using object storage' do
- let!(:upload) { create(:upload, :issuable_upload, :object_storage, model: project) }
+ context 'with orphaned project upload files' do
+ let(:orphan_path) { File.join(FileUploader.absolute_base_dir(project), 'f93f088ddf492ffd950cf059002cbbb6', 'orphan.jpg') }
+ let(:exported_orphan_path) { "#{shared.export_path}/uploads/f93f088ddf492ffd950cf059002cbbb6/orphan.jpg" }
- before do
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(FileUploader)
- end
-
- it 'saves the file' do
- fake_uri = double
+ before do
+ FileUtils.mkdir_p(File.dirname(orphan_path))
+ FileUtils.touch(orphan_path)
+ end
- expect(fake_uri).to receive(:open).and_return(StringIO.new('File content'))
- expect(URI).to receive(:parse).and_return(fake_uri)
+ after do
+ File.delete(orphan_path) if File.exist?(orphan_path)
+ end
- manager.save
+ it 'excludes orphaned upload files' do
+ manager.save
- expect(File.read(exported_file_path)).to eq('File content')
+ expect(File).not_to exist(exported_orphan_path)
+ end
end
- end
- describe '#restore' do
- context 'using object storage' do
+ context 'with an upload missing its file' do
before do
- stub_feature_flags(import_export_object_storage: true)
- stub_uploads_object_storage(FileUploader)
-
- FileUtils.mkdir_p(File.join(shared.export_path, 'uploads/72a497a02fe3ee09edae2ed06d390038'))
- FileUtils.touch(File.join(shared.export_path, 'uploads/72a497a02fe3ee09edae2ed06d390038', "dummy.txt"))
+ File.delete(upload.absolute_path)
end
- it 'restores the file' do
- manager.restore
+ it 'does not cause errors' do
+ manager.save
- expect(project.uploads.size).to eq(1)
- expect(project.uploads.first.build_uploader.filename).to eq('dummy.txt')
+ expect(shared.errors).to be_empty
end
end
end
end
+
+ describe '#restore' do
+ before do
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(File.join(shared.export_path, 'uploads/72a497a02fe3ee09edae2ed06d390038'))
+ FileUtils.touch(File.join(shared.export_path, 'uploads/72a497a02fe3ee09edae2ed06d390038', "dummy.txt"))
+ end
+
+ it 'restores the file' do
+ manager.restore
+
+ expect(project.uploads.map { |u| u.build_uploader.filename }).to include('dummy.txt')
+ end
+ end
end
diff --git a/spec/lib/gitlab/import_export/uploads_restorer_spec.rb b/spec/lib/gitlab/import_export/uploads_restorer_spec.rb
index acef97459b8..6072f18b8c7 100644
--- a/spec/lib/gitlab/import_export/uploads_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/uploads_restorer_spec.rb
@@ -8,7 +8,7 @@ describe Gitlab::ImportExport::UploadsRestorer do
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
FileUtils.mkdir_p(File.join(shared.export_path, 'uploads/random'))
- FileUtils.touch(File.join(shared.export_path, 'uploads/random', "dummy.txt"))
+ FileUtils.touch(File.join(shared.export_path, 'uploads/random', 'dummy.txt'))
end
after do
@@ -27,9 +27,7 @@ describe Gitlab::ImportExport::UploadsRestorer do
it 'copies the uploads to the project path' do
subject.restore
- uploads = Dir.glob(File.join(subject.uploads_path, '**/*')).map { |file| File.basename(file) }
-
- expect(uploads).to include('dummy.txt')
+ expect(project.uploads.map { |u| u.build_uploader.filename }).to include('dummy.txt')
end
end
@@ -45,9 +43,7 @@ describe Gitlab::ImportExport::UploadsRestorer do
it 'copies the uploads to the project path' do
subject.restore
- uploads = Dir.glob(File.join(subject.uploads_path, '**/*')).map { |file| File.basename(file) }
-
- expect(uploads).to include('dummy.txt')
+ expect(project.uploads.map { |u| u.build_uploader.filename }).to include('dummy.txt')
end
end
end
diff --git a/spec/lib/gitlab/import_export/uploads_saver_spec.rb b/spec/lib/gitlab/import_export/uploads_saver_spec.rb
index c716edd9397..24993460e51 100644
--- a/spec/lib/gitlab/import_export/uploads_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/uploads_saver_spec.rb
@@ -7,7 +7,6 @@ describe Gitlab::ImportExport::UploadsSaver do
let(:shared) { project.import_export_shared }
before do
- stub_feature_flags(import_export_object_storage: false)
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
end
diff --git a/spec/lib/gitlab/kubernetes/cluster_role_binding_spec.rb b/spec/lib/gitlab/kubernetes/cluster_role_binding_spec.rb
new file mode 100644
index 00000000000..4a669408025
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/cluster_role_binding_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Kubernetes::ClusterRoleBinding do
+ let(:cluster_role_binding) { described_class.new(name, cluster_role_name, subjects) }
+ let(:name) { 'cluster-role-binding-name' }
+ let(:cluster_role_name) { 'cluster-admin' }
+
+ let(:subjects) { [{ kind: 'ServiceAccount', name: 'sa', namespace: 'ns' }] }
+
+ describe '#generate' do
+ let(:role_ref) do
+ {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'ClusterRole',
+ name: cluster_role_name
+ }
+ end
+
+ let(:resource) do
+ ::Kubeclient::Resource.new(
+ metadata: { name: name },
+ roleRef: role_ref,
+ subjects: subjects
+ )
+ end
+
+ subject { cluster_role_binding.generate }
+
+ it 'should build a Kubeclient Resource' do
+ is_expected.to eq(resource)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/kubernetes/helm/api_spec.rb b/spec/lib/gitlab/kubernetes/helm/api_spec.rb
index 341f71a3e49..8bce7a4cdf5 100644
--- a/spec/lib/gitlab/kubernetes/helm/api_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/api_spec.rb
@@ -5,9 +5,18 @@ describe Gitlab::Kubernetes::Helm::Api do
let(:helm) { described_class.new(client) }
let(:gitlab_namespace) { Gitlab::Kubernetes::Helm::NAMESPACE }
let(:namespace) { Gitlab::Kubernetes::Namespace.new(gitlab_namespace, client) }
- let(:application) { create(:clusters_applications_prometheus) }
-
- let(:command) { application.install_command }
+ let(:application_name) { 'app-name' }
+ let(:rbac) { false }
+ let(:files) { {} }
+
+ let(:command) do
+ Gitlab::Kubernetes::Helm::InstallCommand.new(
+ name: application_name,
+ chart: 'chart-name',
+ rbac: rbac,
+ files: files
+ )
+ end
subject { helm }
@@ -27,7 +36,10 @@ describe Gitlab::Kubernetes::Helm::Api do
describe '#install' do
before do
allow(client).to receive(:create_pod).and_return(nil)
+ allow(client).to receive(:get_config_map).and_return(nil)
allow(client).to receive(:create_config_map).and_return(nil)
+ allow(client).to receive(:create_service_account).and_return(nil)
+ allow(client).to receive(:create_cluster_role_binding).and_return(nil)
allow(namespace).to receive(:ensure_exists!).once
end
@@ -39,13 +51,152 @@ describe Gitlab::Kubernetes::Helm::Api do
end
context 'with a ConfigMap' do
- let(:resource) { Gitlab::Kubernetes::ConfigMap.new(application.name, application.files).generate }
+ let(:resource) { Gitlab::Kubernetes::ConfigMap.new(application_name, files).generate }
it 'creates a ConfigMap on kubeclient' do
expect(client).to receive(:create_config_map).with(resource).once
subject.install(command)
end
+
+ context 'config map already exists' do
+ before do
+ expect(client).to receive(:get_config_map).with("values-content-configuration-#{application_name}", gitlab_namespace).and_return(resource)
+ end
+
+ it 'updates the config map' do
+ expect(client).to receive(:update_config_map).with(resource).once
+
+ subject.install(command)
+ end
+ end
+ end
+
+ context 'without a service account' do
+ it 'does not create a service account on kubeclient' do
+ expect(client).not_to receive(:create_service_account)
+ expect(client).not_to receive(:create_cluster_role_binding)
+
+ subject.install(command)
+ end
+ end
+
+ context 'with a service account' do
+ let(:command) { Gitlab::Kubernetes::Helm::InitCommand.new(name: application_name, files: files, rbac: rbac) }
+
+ context 'rbac-enabled cluster' do
+ let(:rbac) { true }
+
+ let(:service_account_resource) do
+ Kubeclient::Resource.new(metadata: { name: 'tiller', namespace: 'gitlab-managed-apps' })
+ end
+
+ let(:cluster_role_binding_resource) do
+ Kubeclient::Resource.new(
+ metadata: { name: 'tiller-admin' },
+ roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'ClusterRole', name: 'cluster-admin' },
+ subjects: [{ kind: 'ServiceAccount', name: 'tiller', namespace: 'gitlab-managed-apps' }]
+ )
+ end
+
+ context 'service account and cluster role binding does not exist' do
+ before do
+ expect(client).to receive(:get_service_account).with('tiller', 'gitlab-managed-apps').and_raise(Kubeclient::ResourceNotFoundError.new(404, 'Not found', nil))
+ expect(client).to receive(:get_cluster_role_binding).with('tiller-admin').and_raise(Kubeclient::ResourceNotFoundError.new(404, 'Not found', nil))
+ end
+
+ it 'creates a service account, followed the cluster role binding on kubeclient' do
+ expect(client).to receive(:create_service_account).with(service_account_resource).once.ordered
+ expect(client).to receive(:create_cluster_role_binding).with(cluster_role_binding_resource).once.ordered
+
+ subject.install(command)
+ end
+ end
+
+ context 'service account already exists' do
+ before do
+ expect(client).to receive(:get_service_account).with('tiller', 'gitlab-managed-apps').and_return(service_account_resource)
+ expect(client).to receive(:get_cluster_role_binding).with('tiller-admin').and_raise(Kubeclient::ResourceNotFoundError.new(404, 'Not found', nil))
+ end
+
+ it 'updates the service account, followed by creating the cluster role binding' do
+ expect(client).to receive(:update_service_account).with(service_account_resource).once.ordered
+ expect(client).to receive(:create_cluster_role_binding).with(cluster_role_binding_resource).once.ordered
+
+ subject.install(command)
+ end
+ end
+
+ context 'service account and cluster role binding already exists' do
+ before do
+ expect(client).to receive(:get_service_account).with('tiller', 'gitlab-managed-apps').and_return(service_account_resource)
+ expect(client).to receive(:get_cluster_role_binding).with('tiller-admin').and_return(cluster_role_binding_resource)
+ end
+
+ it 'updates the service account, followed by creating the cluster role binding' do
+ expect(client).to receive(:update_service_account).with(service_account_resource).once.ordered
+ expect(client).to receive(:update_cluster_role_binding).with(cluster_role_binding_resource).once.ordered
+
+ subject.install(command)
+ end
+ end
+
+ context 'a non-404 error is thrown' do
+ before do
+ expect(client).to receive(:get_service_account).with('tiller', 'gitlab-managed-apps').and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil))
+ end
+
+ it 'raises an error' do
+ expect { subject.install(command) }.to raise_error(Kubeclient::HttpError)
+ end
+ end
+ end
+
+ context 'legacy abac cluster' do
+ it 'does not create a service account on kubeclient' do
+ expect(client).not_to receive(:create_service_account)
+ expect(client).not_to receive(:create_cluster_role_binding)
+
+ subject.install(command)
+ end
+ end
+ end
+ end
+
+ describe '#update' do
+ let(:rbac) { false }
+
+ let(:command) do
+ Gitlab::Kubernetes::Helm::UpgradeCommand.new(
+ application_name,
+ chart: 'chart-name',
+ files: files,
+ rbac: rbac
+ )
+ end
+
+ before do
+ allow(namespace).to receive(:ensure_exists!).once
+
+ allow(client).to receive(:update_config_map).and_return(nil)
+ allow(client).to receive(:create_pod).and_return(nil)
+ end
+
+ it 'ensures the namespace exists before creating the pod' do
+ expect(namespace).to receive(:ensure_exists!).once.ordered
+ expect(client).to receive(:create_pod).once.ordered
+
+ subject.update(command)
+ end
+
+ it 'updates the config map on kubeclient when one exists' do
+ resource = Gitlab::Kubernetes::ConfigMap.new(
+ application_name, files
+ ).generate
+
+ expect(client).to receive(:update_config_map).with(resource).once
+
+ subject.update(command)
end
end
@@ -78,4 +229,25 @@ describe Gitlab::Kubernetes::Helm::Api do
subject.delete_pod!(command.pod_name)
end
end
+
+ describe '#get_config_map' do
+ before do
+ allow(namespace).to receive(:ensure_exists!).once
+ allow(client).to receive(:get_config_map).and_return(nil)
+ end
+
+ it 'ensures the namespace exists before retrieving the config map' do
+ expect(namespace).to receive(:ensure_exists!).once
+
+ subject.get_config_map('example-config-map-name')
+ end
+
+ it 'gets the config map on kubeclient' do
+ expect(client).to receive(:get_config_map)
+ .with('example-config-map-name', namespace.name)
+ .once
+
+ subject.get_config_map('example-config-map-name')
+ end
+ end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/base_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/base_command_spec.rb
index d50616e95e8..aacae78be43 100644
--- a/spec/lib/gitlab/kubernetes/helm/base_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/base_command_spec.rb
@@ -2,14 +2,24 @@ require 'spec_helper'
describe Gitlab::Kubernetes::Helm::BaseCommand do
let(:application) { create(:clusters_applications_helm) }
+ let(:rbac) { false }
+
let(:test_class) do
Class.new do
include Gitlab::Kubernetes::Helm::BaseCommand
+ def initialize(rbac)
+ @rbac = rbac
+ end
+
def name
"test-class-name"
end
+ def rbac?
+ @rbac
+ end
+
def files
{
some: 'value'
@@ -19,7 +29,7 @@ describe Gitlab::Kubernetes::Helm::BaseCommand do
end
let(:base_command) do
- test_class.new
+ test_class.new(rbac)
end
subject { base_command }
@@ -34,6 +44,14 @@ describe Gitlab::Kubernetes::Helm::BaseCommand do
it 'should returns a kubeclient resoure with pod content for application' do
is_expected.to be_an_instance_of ::Kubeclient::Resource
end
+
+ context 'when rbac is true' do
+ let(:rbac) { true }
+
+ it 'also returns a kubeclient resource' do
+ is_expected.to be_an_instance_of ::Kubeclient::Resource
+ end
+ end
end
describe '#pod_name' do
diff --git a/spec/lib/gitlab/kubernetes/helm/init_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/init_command_spec.rb
index dcbc046cf00..4a3b9d4bf6a 100644
--- a/spec/lib/gitlab/kubernetes/helm/init_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/init_command_spec.rb
@@ -2,9 +2,135 @@ require 'spec_helper'
describe Gitlab::Kubernetes::Helm::InitCommand do
let(:application) { create(:clusters_applications_helm) }
- let(:commands) { 'helm init --tiller-tls --tiller-tls-verify --tls-ca-cert /data/helm/helm/config/ca.pem --tiller-tls-cert /data/helm/helm/config/cert.pem --tiller-tls-key /data/helm/helm/config/key.pem >/dev/null' }
+ let(:rbac) { false }
+ let(:files) { {} }
+ let(:init_command) { described_class.new(name: application.name, files: files, rbac: rbac) }
- subject { described_class.new(name: application.name, files: {}) }
+ let(:commands) do
+ <<~EOS
+ helm init --tiller-tls --tiller-tls-verify --tls-ca-cert /data/helm/helm/config/ca.pem --tiller-tls-cert /data/helm/helm/config/cert.pem --tiller-tls-key /data/helm/helm/config/key.pem
+ EOS
+ end
+
+ subject { init_command }
it_behaves_like 'helm commands'
+
+ context 'on a rbac-enabled cluster' do
+ let(:rbac) { true }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --tiller-tls --tiller-tls-verify --tls-ca-cert /data/helm/helm/config/ca.pem --tiller-tls-cert /data/helm/helm/config/cert.pem --tiller-tls-key /data/helm/helm/config/key.pem --service-account tiller
+ EOS
+ end
+ end
+ end
+
+ describe '#rbac?' do
+ subject { init_command.rbac? }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#config_map_resource' do
+ let(:metadata) do
+ {
+ name: 'values-content-configuration-helm',
+ namespace: 'gitlab-managed-apps',
+ labels: { name: 'values-content-configuration-helm' }
+ }
+ end
+
+ let(:resource) { ::Kubeclient::Resource.new(metadata: metadata, data: files) }
+
+ subject { init_command.config_map_resource }
+
+ it 'returns a KubeClient resource with config map content for the application' do
+ is_expected.to eq(resource)
+ end
+ end
+
+ describe '#pod_resource' do
+ subject { init_command.pod_resource }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it 'generates a pod that uses the tiller serviceAccountName' do
+ expect(subject.spec.serviceAccountName).to eq('tiller')
+ end
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it 'generates a pod that uses the default serviceAccountName' do
+ expect(subject.spec.serviceAcccountName).to be_nil
+ end
+ end
+ end
+
+ describe '#service_account_resource' do
+ let(:resource) do
+ Kubeclient::Resource.new(metadata: { name: 'tiller', namespace: 'gitlab-managed-apps' })
+ end
+
+ subject { init_command.service_account_resource }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it 'generates a Kubeclient resource for the tiller ServiceAccount' do
+ is_expected.to eq(resource)
+ end
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it 'generates nothing' do
+ is_expected.to be_nil
+ end
+ end
+ end
+
+ describe '#cluster_role_binding_resource' do
+ let(:resource) do
+ Kubeclient::Resource.new(
+ metadata: { name: 'tiller-admin' },
+ roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'ClusterRole', name: 'cluster-admin' },
+ subjects: [{ kind: 'ServiceAccount', name: 'tiller', namespace: 'gitlab-managed-apps' }]
+ )
+ end
+
+ subject { init_command.cluster_role_binding_resource }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it 'generates a Kubeclient resource for the ClusterRoleBinding for tiller' do
+ is_expected.to eq(resource)
+ end
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it 'generates nothing' do
+ is_expected.to be_nil
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
index 982e2f41043..39852b7fe29 100644
--- a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
@@ -3,14 +3,21 @@ require 'rails_helper'
describe Gitlab::Kubernetes::Helm::InstallCommand do
let(:files) { { 'ca.pem': 'some file content' } }
let(:repository) { 'https://repository.example.com' }
+ let(:rbac) { false }
let(:version) { '1.2.3' }
+ let(:preinstall) { nil }
+ let(:postinstall) { nil }
let(:install_command) do
described_class.new(
name: 'app-name',
chart: 'chart-name',
+ rbac: rbac,
files: files,
- version: version, repository: repository
+ version: version,
+ repository: repository,
+ preinstall: preinstall,
+ postinstall: postinstall
)
end
@@ -19,21 +26,131 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --client-only >/dev/null
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
helm repo add app-name https://repository.example.com
- helm install chart-name --name app-name --tls --tls-ca-cert /data/helm/app-name/config/ca.pem --tls-cert /data/helm/app-name/config/cert.pem --tls-key /data/helm/app-name/config/key.pem --version 1.2.3 --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml >/dev/null
+ helm repo update
+ #{helm_install_comand}
+ EOS
+ end
+
+ let(:helm_install_comand) do
+ <<~EOS.squish
+ helm install chart-name
+ --name app-name
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
+ --version 1.2.3
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
EOS
end
end
+ context 'when rbac is true' do
+ let(:rbac) { true }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add app-name https://repository.example.com
+ helm repo update
+ #{helm_install_command}
+ EOS
+ end
+
+ let(:helm_install_command) do
+ <<~EOS.squish
+ helm install chart-name
+ --name app-name
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
+ --version 1.2.3
+ --set rbac.create\\=true,rbac.enabled\\=true
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
+ EOS
+ end
+ end
+ end
+
context 'when there is no repository' do
let(:repository) { nil }
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --client-only >/dev/null
- helm install chart-name --name app-name --tls --tls-ca-cert /data/helm/app-name/config/ca.pem --tls-cert /data/helm/app-name/config/cert.pem --tls-key /data/helm/app-name/config/key.pem --version 1.2.3 --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml >/dev/null
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ #{helm_install_command}
+ EOS
+ end
+
+ let(:helm_install_command) do
+ <<~EOS.squish
+ helm install chart-name
+ --name app-name
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
+ --version 1.2.3
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ context 'when there is a pre-install script' do
+ let(:preinstall) { ['/bin/date', '/bin/true'] }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add app-name https://repository.example.com
+ helm repo update
+ #{helm_install_command}
+ EOS
+ end
+
+ let(:helm_install_command) do
+ <<~EOS.strip
+ /bin/date
+ /bin/true
+ helm install chart-name --name app-name --tls --tls-ca-cert /data/helm/app-name/config/ca.pem --tls-cert /data/helm/app-name/config/cert.pem --tls-key /data/helm/app-name/config/key.pem --version 1.2.3 --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ context 'when there is a post-install script' do
+ let(:postinstall) { ['/bin/date', "/bin/false\n"] }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add app-name https://repository.example.com
+ helm repo update
+ #{helm_install_command}
+ EOS
+ end
+
+ let(:helm_install_command) do
+ <<~EOS.strip
+ helm install chart-name --name app-name --tls --tls-ca-cert /data/helm/app-name/config/ca.pem --tls-cert /data/helm/app-name/config/cert.pem --tls-key /data/helm/app-name/config/key.pem --version 1.2.3 --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml
+ /bin/date
+ /bin/false
EOS
end
end
@@ -45,9 +162,21 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --client-only >/dev/null
- helm repo add app-name https://repository.example.com
- helm install chart-name --name app-name --version 1.2.3 --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml >/dev/null
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add app-name https://repository.example.com
+ helm repo update
+ #{helm_install_command}
+ EOS
+ end
+
+ let(:helm_install_command) do
+ <<~EOS.squish
+ helm install chart-name
+ --name app-name
+ --version 1.2.3
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
EOS
end
end
@@ -59,11 +188,62 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --client-only >/dev/null
- helm repo add app-name https://repository.example.com
- helm install chart-name --name app-name --tls --tls-ca-cert /data/helm/app-name/config/ca.pem --tls-cert /data/helm/app-name/config/cert.pem --tls-key /data/helm/app-name/config/key.pem --namespace gitlab-managed-apps -f /data/helm/app-name/config/values.yaml >/dev/null
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add app-name https://repository.example.com
+ helm repo update
+ #{helm_install_command}
EOS
end
+
+ let(:helm_install_command) do
+ <<~EOS.squish
+ helm install chart-name
+ --name app-name
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ describe '#rbac?' do
+ subject { install_command.rbac? }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#pod_resource' do
+ subject { install_command.pod_resource }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it 'generates a pod that uses the tiller serviceAccountName' do
+ expect(subject.spec.serviceAccountName).to eq('tiller')
+ end
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it 'generates a pod that uses the default serviceAccountName' do
+ expect(subject.spec.serviceAcccountName).to be_nil
+ end
end
end
@@ -84,4 +264,20 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
is_expected.to eq(resource)
end
end
+
+ describe '#service_account_resource' do
+ subject { install_command.service_account_resource }
+
+ it 'returns nothing' do
+ is_expected.to be_nil
+ end
+ end
+
+ describe '#cluster_role_binding_resource' do
+ subject { install_command.cluster_role_binding_resource }
+
+ it 'returns nothing' do
+ is_expected.to be_nil
+ end
+ end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/pod_spec.rb b/spec/lib/gitlab/kubernetes/helm/pod_spec.rb
index ec64193c0b2..2dd3a570a1d 100644
--- a/spec/lib/gitlab/kubernetes/helm/pod_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/pod_spec.rb
@@ -5,8 +5,9 @@ describe Gitlab::Kubernetes::Helm::Pod do
let(:app) { create(:clusters_applications_prometheus) }
let(:command) { app.install_command }
let(:namespace) { Gitlab::Kubernetes::Helm::NAMESPACE }
+ let(:service_account_name) { nil }
- subject { described_class.new(command, namespace) }
+ subject { described_class.new(command, namespace, service_account_name: service_account_name) }
context 'with a command' do
it 'should generate a Kubeclient::Resource' do
@@ -29,7 +30,7 @@ describe Gitlab::Kubernetes::Helm::Pod do
it 'should generate the appropriate specifications for the container' do
container = subject.generate.spec.containers.first
expect(container.name).to eq('helm')
- expect(container.image).to eq('alpine:3.6')
+ expect(container.image).to eq('registry.gitlab.com/gitlab-org/cluster-integration/helm-install-image/releases/2.11.0-kube-1.11.0')
expect(container.env.count).to eq(3)
expect(container.env.map(&:name)).to match_array([:HELM_VERSION, :TILLER_NAMESPACE, :COMMAND_SCRIPT])
expect(container.command).to match_array(["/bin/sh"])
@@ -58,6 +59,20 @@ describe Gitlab::Kubernetes::Helm::Pod do
expect(volume.configMap['items'].first['key']).to eq(:'values.yaml')
expect(volume.configMap['items'].first['path']).to eq(:'values.yaml')
end
+
+ it 'should have no serviceAccountName' do
+ spec = subject.generate.spec
+ expect(spec.serviceAccountName).to be_nil
+ end
+
+ context 'with a service_account_name' do
+ let(:service_account_name) { 'sa' }
+
+ it 'should use the serviceAccountName provided' do
+ spec = subject.generate.spec
+ expect(spec.serviceAccountName).to eq(service_account_name)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/upgrade_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/upgrade_command_spec.rb
new file mode 100644
index 00000000000..9b201dae417
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/helm/upgrade_command_spec.rb
@@ -0,0 +1,140 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Gitlab::Kubernetes::Helm::UpgradeCommand do
+ let(:application) { build(:clusters_applications_prometheus) }
+ let(:files) { { 'ca.pem': 'some file content' } }
+ let(:namespace) { ::Gitlab::Kubernetes::Helm::NAMESPACE }
+ let(:rbac) { false }
+ let(:upgrade_command) do
+ described_class.new(
+ application.name,
+ chart: application.chart,
+ files: files,
+ rbac: rbac
+ )
+ end
+
+ subject { upgrade_command }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm upgrade #{application.name} #{application.chart} --tls --tls-ca-cert /data/helm/#{application.name}/config/ca.pem --tls-cert /data/helm/#{application.name}/config/cert.pem --tls-key /data/helm/#{application.name}/config/key.pem --reset-values --install --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml
+ EOS
+ end
+ end
+
+ context 'rbac is true' do
+ let(:rbac) { true }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm upgrade #{application.name} #{application.chart} --tls --tls-ca-cert /data/helm/#{application.name}/config/ca.pem --tls-cert /data/helm/#{application.name}/config/cert.pem --tls-key /data/helm/#{application.name}/config/key.pem --reset-values --install --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ context 'with an application with a repository' do
+ let(:ci_runner) { create(:ci_runner) }
+ let(:application) { build(:clusters_applications_runner, runner: ci_runner) }
+ let(:upgrade_command) do
+ described_class.new(
+ application.name,
+ chart: application.chart,
+ files: files,
+ rbac: rbac,
+ repository: application.repository
+ )
+ end
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm repo add #{application.name} #{application.repository}
+ helm upgrade #{application.name} #{application.chart} --tls --tls-ca-cert /data/helm/#{application.name}/config/ca.pem --tls-cert /data/helm/#{application.name}/config/cert.pem --tls-key /data/helm/#{application.name}/config/key.pem --reset-values --install --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ context 'when there is no ca.pem file' do
+ let(:files) { { 'file.txt': 'some content' } }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version && break; sleep 1s; echo "Retrying ($i)..."; done
+ helm upgrade #{application.name} #{application.chart} --reset-values --install --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ describe '#pod_resource' do
+ subject { upgrade_command.pod_resource }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it 'generates a pod that uses the tiller serviceAccountName' do
+ expect(subject.spec.serviceAccountName).to eq('tiller')
+ end
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it 'generates a pod that uses the default serviceAccountName' do
+ expect(subject.spec.serviceAcccountName).to be_nil
+ end
+ end
+ end
+
+ describe '#config_map_resource' do
+ let(:metadata) do
+ {
+ name: "values-content-configuration-#{application.name}",
+ namespace: namespace,
+ labels: { name: "values-content-configuration-#{application.name}" }
+ }
+ end
+ let(:resource) { ::Kubeclient::Resource.new(metadata: metadata, data: files) }
+
+ it 'returns a KubeClient resource with config map content for the application' do
+ expect(subject.config_map_resource).to eq(resource)
+ end
+ end
+
+ describe '#rbac?' do
+ subject { upgrade_command.rbac? }
+
+ context 'rbac is enabled' do
+ let(:rbac) { true }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'rbac is not enabled' do
+ let(:rbac) { false }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#pod_name' do
+ it 'returns the pod name' do
+ expect(subject.pod_name).to eq("upgrade-#{application.name}")
+ end
+ end
+end
diff --git a/spec/lib/gitlab/kubernetes/kube_client_spec.rb b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
new file mode 100644
index 00000000000..3979a43216c
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
@@ -0,0 +1,186 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Kubernetes::KubeClient do
+ include KubernetesHelpers
+
+ let(:api_url) { 'https://kubernetes.example.com/prefix' }
+ let(:kubeclient_options) { { auth_options: { bearer_token: 'xyz' } } }
+
+ let(:client) { described_class.new(api_url, kubeclient_options) }
+
+ before do
+ stub_kubeclient_discover(api_url)
+ end
+
+ shared_examples 'a Kubeclient' do
+ it 'is a Kubeclient::Client' do
+ is_expected.to be_an_instance_of Kubeclient::Client
+ end
+
+ it 'has the kubeclient options' do
+ expect(subject.auth_options).to eq({ bearer_token: 'xyz' })
+ end
+ end
+
+ describe '#core_client' do
+ subject { client.core_client }
+
+ it_behaves_like 'a Kubeclient'
+
+ it 'has the core API endpoint' do
+ expect(subject.api_endpoint.to_s).to match(%r{\/api\Z})
+ end
+
+ it 'has the api_version' do
+ expect(subject.instance_variable_get(:@api_version)).to eq('v1')
+ end
+ end
+
+ describe '#rbac_client' do
+ subject { client.rbac_client }
+
+ it_behaves_like 'a Kubeclient'
+
+ it 'has the RBAC API group endpoint' do
+ expect(subject.api_endpoint.to_s).to match(%r{\/apis\/rbac.authorization.k8s.io\Z})
+ end
+
+ it 'has the api_version' do
+ expect(subject.instance_variable_get(:@api_version)).to eq('v1')
+ end
+ end
+
+ describe '#extensions_client' do
+ subject { client.extensions_client }
+
+ it_behaves_like 'a Kubeclient'
+
+ it 'has the extensions API group endpoint' do
+ expect(subject.api_endpoint.to_s).to match(%r{\/apis\/extensions\Z})
+ end
+
+ it 'has the api_version' do
+ expect(subject.instance_variable_get(:@api_version)).to eq('v1beta1')
+ end
+ end
+
+ describe '#knative_client' do
+ subject { client.knative_client }
+
+ it_behaves_like 'a Kubeclient'
+
+ it 'has the extensions API group endpoint' do
+ expect(subject.api_endpoint.to_s).to match(%r{\/apis\/serving.knative.dev\Z})
+ end
+
+ it 'has the api_version' do
+ expect(subject.instance_variable_get(:@api_version)).to eq('v1alpha1')
+ end
+ end
+
+ describe 'core API' do
+ let(:core_client) { client.core_client }
+
+ [
+ :get_pods,
+ :get_secrets,
+ :get_config_map,
+ :get_pod,
+ :get_namespace,
+ :get_secret,
+ :get_service,
+ :get_service_account,
+ :delete_pod,
+ :create_config_map,
+ :create_namespace,
+ :create_pod,
+ :create_secret,
+ :create_service_account,
+ :update_config_map,
+ :update_service_account
+ ].each do |method|
+ describe "##{method}" do
+ it 'delegates to the core client' do
+ expect(client).to delegate_method(method).to(:core_client)
+ end
+
+ it 'responds to the method' do
+ expect(client).to respond_to method
+ end
+ end
+ end
+ end
+
+ describe 'rbac API group' do
+ let(:rbac_client) { client.rbac_client }
+
+ [
+ :create_cluster_role_binding,
+ :get_cluster_role_binding,
+ :update_cluster_role_binding
+ ].each do |method|
+ describe "##{method}" do
+ it 'delegates to the rbac client' do
+ expect(client).to delegate_method(method).to(:rbac_client)
+ end
+
+ it 'responds to the method' do
+ expect(client).to respond_to method
+ end
+ end
+ end
+ end
+
+ describe 'extensions API group' do
+ let(:api_groups) { ['apis/extensions'] }
+ let(:extensions_client) { client.extensions_client }
+
+ describe '#get_deployments' do
+ it 'delegates to the extensions client' do
+ expect(client).to delegate_method(:get_deployments).to(:extensions_client)
+ end
+
+ it 'responds to the method' do
+ expect(client).to respond_to :get_deployments
+ end
+ end
+ end
+
+ describe 'non-entity methods' do
+ it 'does not proxy for non-entity methods' do
+ expect(client).not_to respond_to :proxy_url
+ end
+
+ it 'throws an error' do
+ expect { client.proxy_url }.to raise_error(NoMethodError)
+ end
+ end
+
+ describe '#get_pod_log' do
+ let(:core_client) { client.core_client }
+
+ it 'is delegated to the core client' do
+ expect(client).to delegate_method(:get_pod_log).to(:core_client)
+ end
+ end
+
+ describe '#watch_pod_log' do
+ let(:core_client) { client.core_client }
+
+ it 'is delegated to the core client' do
+ expect(client).to delegate_method(:watch_pod_log).to(:core_client)
+ end
+ end
+
+ describe 'methods that do not exist on any client' do
+ it 'throws an error' do
+ expect { client.non_existent_method }.to raise_error(NoMethodError)
+ end
+
+ it 'returns false for respond_to' do
+ expect(client.respond_to?(:non_existent_method)).to be_falsey
+ end
+ end
+end
diff --git a/spec/lib/gitlab/kubernetes/namespace_spec.rb b/spec/lib/gitlab/kubernetes/namespace_spec.rb
index e098612f6fb..e1c35c355f4 100644
--- a/spec/lib/gitlab/kubernetes/namespace_spec.rb
+++ b/spec/lib/gitlab/kubernetes/namespace_spec.rb
@@ -9,7 +9,7 @@ describe Gitlab::Kubernetes::Namespace do
describe '#exists?' do
context 'when namespace do not exits' do
- let(:exception) { ::Kubeclient::HttpError.new(404, "namespace #{name} not found", nil) }
+ let(:exception) { ::Kubeclient::ResourceNotFoundError.new(404, "namespace #{name} not found", nil) }
it 'returns false' do
expect(client).to receive(:get_namespace).with(name).once.and_raise(exception)
diff --git a/spec/lib/gitlab/kubernetes/role_binding_spec.rb b/spec/lib/gitlab/kubernetes/role_binding_spec.rb
new file mode 100644
index 00000000000..a1a59533bfb
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/role_binding_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Kubernetes::RoleBinding, '#generate' do
+ let(:role_name) { 'edit' }
+ let(:namespace) { 'my-namespace' }
+ let(:service_account_name) { 'my-service-account' }
+
+ let(:subjects) do
+ [
+ {
+ kind: 'ServiceAccount',
+ name: service_account_name,
+ namespace: namespace
+ }
+ ]
+ end
+
+ let(:role_ref) do
+ {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'ClusterRole',
+ name: role_name
+ }
+ end
+
+ let(:resource) do
+ ::Kubeclient::Resource.new(
+ metadata: { name: "gitlab-#{namespace}", namespace: namespace },
+ roleRef: role_ref,
+ subjects: subjects
+ )
+ end
+
+ subject do
+ described_class.new(
+ name: "gitlab-#{namespace}",
+ role_name: role_name,
+ namespace: namespace,
+ service_account_name: service_account_name
+ ).generate
+ end
+
+ it 'should build a Kubeclient Resource' do
+ is_expected.to eq(resource)
+ end
+end
diff --git a/spec/lib/gitlab/kubernetes/service_account_spec.rb b/spec/lib/gitlab/kubernetes/service_account_spec.rb
new file mode 100644
index 00000000000..8da9e932dc3
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/service_account_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Kubernetes::ServiceAccount do
+ let(:name) { 'a_service_account' }
+ let(:namespace_name) { 'a_namespace' }
+ let(:service_account) { described_class.new(name, namespace_name) }
+
+ it { expect(service_account.name).to eq(name) }
+ it { expect(service_account.namespace_name).to eq(namespace_name) }
+
+ describe '#generate' do
+ let(:resource) do
+ ::Kubeclient::Resource.new(metadata: { name: name, namespace: namespace_name })
+ end
+
+ subject { service_account.generate }
+
+ it 'should build a Kubeclient Resource' do
+ is_expected.to eq(resource)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/kubernetes/service_account_token_spec.rb b/spec/lib/gitlab/kubernetes/service_account_token_spec.rb
new file mode 100644
index 00000000000..0773d3d9aec
--- /dev/null
+++ b/spec/lib/gitlab/kubernetes/service_account_token_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Kubernetes::ServiceAccountToken do
+ let(:name) { 'token-name' }
+ let(:service_account_name) { 'a_service_account' }
+ let(:namespace_name) { 'a_namespace' }
+ let(:service_account_token) { described_class.new(name, service_account_name, namespace_name) }
+
+ it { expect(service_account_token.name).to eq(name) }
+ it { expect(service_account_token.service_account_name).to eq(service_account_name) }
+ it { expect(service_account_token.namespace_name).to eq(namespace_name) }
+
+ describe '#generate' do
+ let(:resource) do
+ ::Kubeclient::Resource.new(
+ metadata: {
+ name: name,
+ namespace: namespace_name,
+ annotations: {
+ 'kubernetes.io/service-account.name': service_account_name
+ }
+ },
+ type: 'kubernetes.io/service-account-token'
+ )
+ end
+
+ subject { service_account_token.generate }
+
+ it 'should build a Kubeclient Resource' do
+ is_expected.to eq(resource)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/language_data_spec.rb b/spec/lib/gitlab/language_data_spec.rb
new file mode 100644
index 00000000000..b08150855fe
--- /dev/null
+++ b/spec/lib/gitlab/language_data_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::LanguageData do
+ describe '#extensions' do
+ before do
+ described_class.clear_extensions!
+ end
+
+ it 'loads the extensions once' do
+ expect(YAML).to receive(:load_file).once.and_call_original
+
+ 2.times do
+ expect(described_class.extensions).to be_a(Set)
+ expect(described_class.extensions.count).to be > 0
+ # Sanity check for known extensions
+ expect(described_class.extensions).to include(*%w(.rb .yml .json))
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index 4e7bd433a9c..ee6d6fc961f 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -42,6 +42,65 @@ describe Gitlab::Metrics::Subscribers::ActiveRecord do
subscriber.sql(event)
end
+
+ context 'events are internal to Rails or irrelevant' do
+ let(:schema_event) do
+ double(
+ :event,
+ name: 'sql.active_record',
+ payload: {
+ sql: "SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass",
+ name: 'SCHEMA',
+ connection_id: 135,
+ statement_name: nil,
+ binds: []
+ },
+ duration: 0.7
+ )
+ end
+
+ let(:begin_event) do
+ double(
+ :event,
+ name: 'sql.active_record',
+ payload: {
+ sql: "BEGIN",
+ name: nil,
+ connection_id: 231,
+ statement_name: nil,
+ binds: []
+ },
+ duration: 1.1
+ )
+ end
+
+ let(:commit_event) do
+ double(
+ :event,
+ name: 'sql.active_record',
+ payload: {
+ sql: "COMMIT",
+ name: nil,
+ connection_id: 212,
+ statement_name: nil,
+ binds: []
+ },
+ duration: 1.6
+ )
+ end
+
+ it 'skips schema/begin/commit sql commands' do
+ expect(subscriber).to receive(:current_transaction)
+ .at_least(:once)
+ .and_return(transaction)
+
+ expect(transaction).not_to receive(:increment)
+
+ subscriber.sql(schema_event)
+ subscriber.sql(begin_event)
+ subscriber.sql(commit_event)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/middleware/multipart_spec.rb b/spec/lib/gitlab/middleware/multipart_spec.rb
index f788f8ee276..daf454665b0 100644
--- a/spec/lib/gitlab/middleware/multipart_spec.rb
+++ b/spec/lib/gitlab/middleware/multipart_spec.rb
@@ -75,6 +75,26 @@ describe Gitlab::Middleware::Multipart do
it_behaves_like 'multipart upload files'
end
+ it 'allows files in uploads/tmp directory' do
+ Dir.mktmpdir do |dir|
+ uploads_dir = File.join(dir, 'public/uploads/tmp')
+ FileUtils.mkdir_p(uploads_dir)
+
+ allow(Rails).to receive(:root).and_return(dir)
+ allow(Dir).to receive(:tmpdir).and_return(File.join(Dir.tmpdir, 'tmpsubdir'))
+
+ Tempfile.open('top-level', uploads_dir) do |tempfile|
+ env = post_env({ 'file' => tempfile.path }, { 'file.name' => original_filename, 'file.path' => tempfile.path }, Gitlab::Workhorse.secret, 'gitlab-workhorse')
+
+ expect(app).to receive(:call) do |env|
+ expect(Rack::Request.new(env).params['file']).to be_a(::UploadedFile)
+ end
+
+ middleware.call(env)
+ end
+ end
+ end
+
it 'allows symlinks for uploads dir' do
Tempfile.open('two-levels') do |tempfile|
symlinked_dir = '/some/dir/uploads'
diff --git a/spec/lib/gitlab/middleware/read_only_spec.rb b/spec/lib/gitlab/middleware/read_only_spec.rb
index 8fbeaa065fa..ac3bc6b2dfe 100644
--- a/spec/lib/gitlab/middleware/read_only_spec.rb
+++ b/spec/lib/gitlab/middleware/read_only_spec.rb
@@ -34,7 +34,7 @@ describe Gitlab::Middleware::ReadOnly do
end
end
- context 'normal requests to a read-only Gitlab instance' do
+ context 'normal requests to a read-only GitLab instance' do
let(:fake_app) { lambda { |env| [200, { 'Content-Type' => 'text/plain' }, ['OK']] } }
before do
diff --git a/spec/lib/gitlab/null_request_store_spec.rb b/spec/lib/gitlab/null_request_store_spec.rb
new file mode 100644
index 00000000000..c023dac53ad
--- /dev/null
+++ b/spec/lib/gitlab/null_request_store_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::NullRequestStore do
+ let(:null_store) { described_class.new }
+
+ describe '#store' do
+ it 'returns an empty hash' do
+ expect(null_store.store).to eq({})
+ end
+ end
+
+ describe '#active?' do
+ it 'returns falsey' do
+ expect(null_store.active?).to be_falsey
+ end
+ end
+
+ describe '#read' do
+ it 'returns nil' do
+ expect(null_store.read('foo')).to be nil
+ end
+ end
+
+ describe '#[]' do
+ it 'returns nil' do
+ expect(null_store['foo']).to be nil
+ end
+ end
+
+ describe '#write' do
+ it 'returns the same value' do
+ expect(null_store.write('key', 'value')).to eq('value')
+ end
+ end
+
+ describe '#[]=' do
+ it 'returns the same value' do
+ expect(null_store['key'] = 'value').to eq('value')
+ end
+ end
+
+ describe '#exist?' do
+ it 'returns falsey' do
+ expect(null_store.exist?('foo')).to be_falsey
+ end
+ end
+
+ describe '#fetch' do
+ it 'returns the block result' do
+ expect(null_store.fetch('key') { 'block result' }).to eq('block result')
+ end
+ end
+
+ describe '#delete' do
+ context 'when a block is given' do
+ it 'yields the key to the block' do
+ expect do |b|
+ null_store.delete('foo', &b)
+ end.to yield_with_args('foo')
+ end
+
+ it 'returns the block result' do
+ expect(null_store.delete('foo') { |key| 'block result' }).to eq('block result')
+ end
+ end
+
+ context 'when a block is not given' do
+ it 'returns nil' do
+ expect(null_store.delete('foo')).to be nil
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/patch/draw_route_spec.rb b/spec/lib/gitlab/patch/draw_route_spec.rb
new file mode 100644
index 00000000000..4009b903dc3
--- /dev/null
+++ b/spec/lib/gitlab/patch/draw_route_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+describe Gitlab::Patch::DrawRoute do
+ subject do
+ Class.new do
+ include Gitlab::Patch::DrawRoute
+
+ def route_path(route_name)
+ File.expand_path("../../../../#{route_name}", __dir__)
+ end
+ end.new
+ end
+
+ before do
+ allow(subject).to receive(:instance_eval)
+ end
+
+ it 'evaluates CE only route' do
+ subject.draw(:help)
+
+ expect(subject).to have_received(:instance_eval)
+ .with(File.read(subject.route_path('config/routes/help.rb')))
+ .once
+
+ expect(subject).to have_received(:instance_eval)
+ .once
+ end
+end
diff --git a/spec/lib/gitlab/patch/prependable_spec.rb b/spec/lib/gitlab/patch/prependable_spec.rb
new file mode 100644
index 00000000000..725d733d176
--- /dev/null
+++ b/spec/lib/gitlab/patch/prependable_spec.rb
@@ -0,0 +1,234 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+# Patching ActiveSupport::Concern
+require_relative '../../../../config/initializers/0_as_concern'
+
+describe Gitlab::Patch::Prependable do
+ before do
+ @prepended_modules = []
+ end
+
+ let(:ee) do
+ # So that block in Module.new could see them
+ prepended_modules = @prepended_modules
+
+ Module.new do
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def class_name
+ super.tr('C', 'E')
+ end
+ end
+
+ this = self
+ prepended do
+ prepended_modules << [self, this]
+ end
+
+ def name
+ super.tr('c', 'e')
+ end
+ end
+ end
+
+ let(:ce) do
+ # So that block in Module.new could see them
+ prepended_modules = @prepended_modules
+ ee_ = ee
+
+ Module.new do
+ extend ActiveSupport::Concern
+ prepend ee_
+
+ class_methods do
+ def class_name
+ 'CE'
+ end
+ end
+
+ this = self
+ prepended do
+ prepended_modules << [self, this]
+ end
+
+ def name
+ 'ce'
+ end
+ end
+ end
+
+ describe 'a class including a concern prepending a concern' do
+ subject { Class.new.include(ce) }
+
+ it 'returns values from prepended module ee' do
+ expect(subject.new.name).to eq('ee')
+ expect(subject.class_name).to eq('EE')
+ end
+
+ it 'has the expected ancestors' do
+ expect(subject.ancestors.take(3)).to eq([subject, ee, ce])
+ expect(subject.singleton_class.ancestors.take(3))
+ .to eq([subject.singleton_class,
+ ee.const_get(:ClassMethods),
+ ce.const_get(:ClassMethods)])
+ end
+
+ it 'prepends only once even if called twice' do
+ 2.times { ce.prepend(ee) }
+
+ subject
+
+ expect(@prepended_modules).to eq([[ce, ee]])
+ end
+
+ context 'overriding methods' do
+ before do
+ subject.module_eval do
+ def self.class_name
+ 'Custom'
+ end
+
+ def name
+ 'custom'
+ end
+ end
+ end
+
+ it 'returns values from the class' do
+ expect(subject.new.name).to eq('custom')
+ expect(subject.class_name).to eq('Custom')
+ end
+ end
+ end
+
+ describe 'a class prepending a concern prepending a concern' do
+ subject { Class.new.prepend(ce) }
+
+ it 'returns values from prepended module ee' do
+ expect(subject.new.name).to eq('ee')
+ expect(subject.class_name).to eq('EE')
+ end
+
+ it 'has the expected ancestors' do
+ expect(subject.ancestors.take(3)).to eq([ee, ce, subject])
+ expect(subject.singleton_class.ancestors.take(3))
+ .to eq([ee.const_get(:ClassMethods),
+ ce.const_get(:ClassMethods),
+ subject.singleton_class])
+ end
+
+ it 'prepends only once' do
+ subject.prepend(ce)
+
+ expect(@prepended_modules).to eq([[ce, ee], [subject, ce]])
+ end
+ end
+
+ describe 'a class prepending a concern' do
+ subject do
+ ee_ = ee
+
+ Class.new do
+ prepend ee_
+
+ def self.class_name
+ 'CE'
+ end
+
+ def name
+ 'ce'
+ end
+ end
+ end
+
+ it 'returns values from prepended module ee' do
+ expect(subject.new.name).to eq('ee')
+ expect(subject.class_name).to eq('EE')
+ end
+
+ it 'has the expected ancestors' do
+ expect(subject.ancestors.take(2)).to eq([ee, subject])
+ expect(subject.singleton_class.ancestors.take(2))
+ .to eq([ee.const_get(:ClassMethods),
+ subject.singleton_class])
+ end
+
+ it 'prepends only once' do
+ subject.prepend(ee)
+
+ expect(@prepended_modules).to eq([[subject, ee]])
+ end
+ end
+
+ describe 'simple case' do
+ subject do
+ foo_ = foo
+
+ Class.new do
+ prepend foo_
+
+ def value
+ 10
+ end
+ end
+ end
+
+ let(:foo) do
+ Module.new do
+ extend ActiveSupport::Concern
+
+ prepended do
+ def self.class_value
+ 20
+ end
+ end
+
+ def value
+ super * 10
+ end
+ end
+ end
+
+ context 'class methods' do
+ it "has a method" do
+ expect(subject).to respond_to(:class_value)
+ end
+
+ it 'can execute a method' do
+ expect(subject.class_value).to eq(20)
+ end
+ end
+
+ context 'instance methods' do
+ it "has a method" do
+ expect(subject.new).to respond_to(:value)
+ end
+
+ it 'chains a method execution' do
+ expect(subject.new.value).to eq(100)
+ end
+ end
+ end
+
+ context 'having two prepended blocks' do
+ subject do
+ Module.new do
+ extend ActiveSupport::Concern
+
+ prepended do
+ end
+
+ prepended do
+ end
+ end
+ end
+
+ it "raises an error" do
+ expect { subject }
+ .to raise_error(described_class::MultiplePrependedBlocks)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/private_commit_email_spec.rb b/spec/lib/gitlab/private_commit_email_spec.rb
new file mode 100644
index 00000000000..10bf624bbdd
--- /dev/null
+++ b/spec/lib/gitlab/private_commit_email_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::PrivateCommitEmail do
+ let(:hostname) { Gitlab::CurrentSettings.current_application_settings.commit_email_hostname }
+ let(:id) { 1 }
+ let(:valid_email) { "#{id}-foo@#{hostname}" }
+ let(:invalid_email) { "#{id}-foo@users.noreply.bar.com" }
+
+ context '.regex' do
+ subject { described_class.regex }
+
+ it { is_expected.to match("1-foo@#{hostname}") }
+ it { is_expected.not_to match("1-foo@#{hostname}.foo") }
+ it { is_expected.not_to match('1-foo@users.noreply.gitlab.com') }
+ it { is_expected.not_to match('foo-1@users.noreply.gitlab.com') }
+ it { is_expected.not_to match('foobar@gitlab.com') }
+ end
+
+ context '.user_id_for_email' do
+ it 'parses user id from email' do
+ expect(described_class.user_id_for_email(valid_email)).to eq(id)
+ end
+
+ it 'returns nil on invalid commit email' do
+ expect(described_class.user_id_for_email(invalid_email)).to be_nil
+ end
+ end
+
+ context '.user_ids_for_email' do
+ it 'returns deduplicated user IDs for each valid email' do
+ result = described_class.user_ids_for_emails([valid_email, valid_email, invalid_email])
+
+ expect(result).to eq([id])
+ end
+
+ it 'returns an empty array with no valid emails' do
+ result = described_class.user_ids_for_emails([invalid_email])
+ expect(result).to eq([])
+ end
+ end
+
+ context '.for_user' do
+ it 'returns email in the format id-username@hostname' do
+ user = create(:user)
+
+ expect(described_class.for_user(user)).to eq("#{user.id}-#{user.username}@#{hostname}")
+ end
+ end
+end
diff --git a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb
index 5589db92b1d..1a108003bc2 100644
--- a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb
+++ b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb
@@ -6,7 +6,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser do
let(:parser_error_class) { Gitlab::Prometheus::ParsingError }
describe '#load_groups_from_yaml' do
- subject { described_class.load_groups_from_yaml }
+ subject { described_class.load_groups_from_yaml('dummy.yaml') }
describe 'parsing sample yaml' do
let(:sample_yaml) do
diff --git a/spec/lib/gitlab/prometheus/metric_group_spec.rb b/spec/lib/gitlab/prometheus/metric_group_spec.rb
new file mode 100644
index 00000000000..e7d16e73663
--- /dev/null
+++ b/spec/lib/gitlab/prometheus/metric_group_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Gitlab::Prometheus::MetricGroup do
+ describe '.common_metrics' do
+ let!(:project_metric) { create(:prometheus_metric) }
+ let!(:common_metric_group_a) { create(:prometheus_metric, :common, group: :aws_elb) }
+ let!(:common_metric_group_b_q1) { create(:prometheus_metric, :common, group: :kubernetes) }
+ let!(:common_metric_group_b_q2) { create(:prometheus_metric, :common, group: :kubernetes) }
+
+ subject { described_class.common_metrics }
+
+ it 'returns exactly two groups' do
+ expect(subject.map(&:name)).to contain_exactly(
+ 'Response metrics (AWS ELB)', 'System metrics (Kubernetes)')
+ end
+
+ it 'returns exactly three metric queries' do
+ expect(subject.map(&:metrics).flatten.map(&:id)).to contain_exactly(
+ common_metric_group_a.id, common_metric_group_b_q1.id,
+ common_metric_group_b_q2.id)
+ end
+ end
+
+ describe '.for_project' do
+ let!(:other_project) { create(:project) }
+ let!(:project_metric) { create(:prometheus_metric) }
+ let!(:common_metric) { create(:prometheus_metric, :common, group: :aws_elb) }
+
+ subject do
+ described_class.for_project(other_project)
+ .map(&:metrics).flatten
+ .map(&:id)
+ end
+
+ it 'returns exactly one common metric' do
+ is_expected.to contain_exactly(common_metric.id)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/quick_actions/command_definition_spec.rb b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
index b03c1e23ca3..5dae82a63b4 100644
--- a/spec/lib/gitlab/quick_actions/command_definition_spec.rb
+++ b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
@@ -210,6 +210,19 @@ describe Gitlab::QuickActions::CommandDefinition do
end
end
+ context 'when warning is set' do
+ before do
+ subject.explanation = 'Explanation'
+ subject.warning = 'dangerous!'
+ end
+
+ it 'returns this static string' do
+ result = subject.explain({}, nil)
+
+ expect(result).to eq 'Explanation (dangerous!)'
+ end
+ end
+
context 'when the explanation is dynamic' do
before do
subject.explanation = proc { |arg| "Dynamic #{arg}" }
diff --git a/spec/lib/gitlab/quick_actions/dsl_spec.rb b/spec/lib/gitlab/quick_actions/dsl_spec.rb
index 067a30fd7e2..fd4df8694ba 100644
--- a/spec/lib/gitlab/quick_actions/dsl_spec.rb
+++ b/spec/lib/gitlab/quick_actions/dsl_spec.rb
@@ -12,6 +12,7 @@ describe Gitlab::QuickActions::Dsl do
params 'The first argument'
explanation 'Static explanation'
+ warning 'Possible problem!'
command :explanation_with_aliases, :once, :first do |arg|
arg
end
@@ -64,6 +65,7 @@ describe Gitlab::QuickActions::Dsl do
expect(no_args_def.condition_block).to be_nil
expect(no_args_def.action_block).to be_a_kind_of(Proc)
expect(no_args_def.parse_params_block).to be_nil
+ expect(no_args_def.warning).to eq('')
expect(explanation_with_aliases_def.name).to eq(:explanation_with_aliases)
expect(explanation_with_aliases_def.aliases).to eq([:once, :first])
@@ -73,6 +75,7 @@ describe Gitlab::QuickActions::Dsl do
expect(explanation_with_aliases_def.condition_block).to be_nil
expect(explanation_with_aliases_def.action_block).to be_a_kind_of(Proc)
expect(explanation_with_aliases_def.parse_params_block).to be_nil
+ expect(explanation_with_aliases_def.warning).to eq('Possible problem!')
expect(dynamic_description_def.name).to eq(:dynamic_description)
expect(dynamic_description_def.aliases).to eq([])
@@ -82,6 +85,7 @@ describe Gitlab::QuickActions::Dsl do
expect(dynamic_description_def.condition_block).to be_nil
expect(dynamic_description_def.action_block).to be_a_kind_of(Proc)
expect(dynamic_description_def.parse_params_block).to be_nil
+ expect(dynamic_description_def.warning).to eq('')
expect(cc_def.name).to eq(:cc)
expect(cc_def.aliases).to eq([])
@@ -91,6 +95,7 @@ describe Gitlab::QuickActions::Dsl do
expect(cc_def.condition_block).to be_nil
expect(cc_def.action_block).to be_nil
expect(cc_def.parse_params_block).to be_nil
+ expect(cc_def.warning).to eq('')
expect(cond_action_def.name).to eq(:cond_action)
expect(cond_action_def.aliases).to eq([])
@@ -100,6 +105,7 @@ describe Gitlab::QuickActions::Dsl do
expect(cond_action_def.condition_block).to be_a_kind_of(Proc)
expect(cond_action_def.action_block).to be_a_kind_of(Proc)
expect(cond_action_def.parse_params_block).to be_nil
+ expect(cond_action_def.warning).to eq('')
expect(with_params_parsing_def.name).to eq(:with_params_parsing)
expect(with_params_parsing_def.aliases).to eq([])
@@ -109,6 +115,7 @@ describe Gitlab::QuickActions::Dsl do
expect(with_params_parsing_def.condition_block).to be_nil
expect(with_params_parsing_def.action_block).to be_a_kind_of(Proc)
expect(with_params_parsing_def.parse_params_block).to be_a_kind_of(Proc)
+ expect(with_params_parsing_def.warning).to eq('')
expect(substitution_def.name).to eq(:something)
expect(substitution_def.aliases).to eq([])
@@ -118,6 +125,7 @@ describe Gitlab::QuickActions::Dsl do
expect(substitution_def.condition_block).to be_nil
expect(substitution_def.action_block.call('text')).to eq('text Some complicated thing you want in here')
expect(substitution_def.parse_params_block).to be_nil
+ expect(substitution_def.warning).to eq('')
end
end
end
diff --git a/spec/lib/gitlab/quick_actions/extractor_spec.rb b/spec/lib/gitlab/quick_actions/extractor_spec.rb
index 0166f6c2ee0..873bb359d6e 100644
--- a/spec/lib/gitlab/quick_actions/extractor_spec.rb
+++ b/spec/lib/gitlab/quick_actions/extractor_spec.rb
@@ -272,5 +272,24 @@ describe Gitlab::QuickActions::Extractor do
expect(commands).to be_empty
expect(msg).to eq expected
end
+
+ it 'limits to passed commands when they are passed' do
+ msg = <<~MSG.strip
+ Hello, we should only extract the commands passed
+ /reopen
+ /labels hello world
+ /power
+ MSG
+ expected_msg = <<~EXPECTED.strip
+ Hello, we should only extract the commands passed
+ /power
+ EXPECTED
+ expected_commands = [['reopen'], ['labels', 'hello world']]
+
+ msg, commands = extractor.extract_commands(msg, only: [:open, :labels])
+
+ expect(commands).to eq(expected_commands)
+ expect(msg).to eq expected_msg
+ end
end
end
diff --git a/spec/lib/gitlab/repository_cache_adapter_spec.rb b/spec/lib/gitlab/repository_cache_adapter_spec.rb
index 5bd4d6c6a48..0295138fc3a 100644
--- a/spec/lib/gitlab/repository_cache_adapter_spec.rb
+++ b/spec/lib/gitlab/repository_cache_adapter_spec.rb
@@ -65,6 +65,144 @@ describe Gitlab::RepositoryCacheAdapter do
end
end
+ describe '#cache_method_output_asymmetrically', :use_clean_rails_memory_store_caching, :request_store do
+ let(:request_store_cache) { repository.send(:request_store_cache) }
+
+ context 'with a non-existing repository' do
+ let(:project) { create(:project) } # No repository
+ let(:object) { double }
+
+ subject do
+ repository.cache_method_output_asymmetrically(:cats) do
+ object.cats_call_stub
+ end
+ end
+
+ it 'returns the output of the original method' do
+ expect(object).to receive(:cats_call_stub).and_return('output')
+
+ expect(subject).to eq('output')
+ end
+ end
+
+ context 'with a method throwing a non-existing-repository error' do
+ subject do
+ repository.cache_method_output_asymmetrically(:cats) do
+ raise Gitlab::Git::Repository::NoRepository
+ end
+ end
+
+ it 'returns nil' do
+ expect(subject).to eq(nil)
+ end
+
+ it 'does not cache the data' do
+ subject
+
+ expect(repository.instance_variable_defined?(:@cats)).to eq(false)
+ expect(cache.exist?(:cats)).to eq(false)
+ end
+ end
+
+ context 'with an existing repository' do
+ let(:object) { double }
+
+ context 'when it returns truthy' do
+ before do
+ expect(object).to receive(:cats).once.and_return('truthy output')
+ end
+
+ it 'caches the output in RequestStore' do
+ expect do
+ repository.cache_method_output_asymmetrically(:cats) { object.cats }
+ end.to change { request_store_cache.read(:cats) }.from(nil).to('truthy output')
+ end
+
+ it 'caches the output in RepositoryCache' do
+ expect do
+ repository.cache_method_output_asymmetrically(:cats) { object.cats }
+ end.to change { cache.read(:cats) }.from(nil).to('truthy output')
+ end
+ end
+
+ context 'when it returns false' do
+ before do
+ expect(object).to receive(:cats).once.and_return(false)
+ end
+
+ it 'caches the output in RequestStore' do
+ expect do
+ repository.cache_method_output_asymmetrically(:cats) { object.cats }
+ end.to change { request_store_cache.read(:cats) }.from(nil).to(false)
+ end
+
+ it 'does NOT cache the output in RepositoryCache' do
+ expect do
+ repository.cache_method_output_asymmetrically(:cats) { object.cats }
+ end.not_to change { cache.read(:cats) }.from(nil)
+ end
+ end
+ end
+ end
+
+ describe '#memoize_method_output' do
+ let(:fallback) { 10 }
+
+ context 'with a non-existing repository' do
+ let(:project) { create(:project) } # No repository
+
+ subject do
+ repository.memoize_method_output(:cats, fallback: fallback) do
+ repository.cats_call_stub
+ end
+ end
+
+ it 'returns the fallback value' do
+ expect(subject).to eq(fallback)
+ end
+
+ it 'avoids calling the original method' do
+ expect(repository).not_to receive(:cats_call_stub)
+
+ subject
+ end
+
+ it 'does not set the instance variable' do
+ subject
+
+ expect(repository.instance_variable_defined?(:@cats)).to eq(false)
+ end
+ end
+
+ context 'with a method throwing a non-existing-repository error' do
+ subject do
+ repository.memoize_method_output(:cats, fallback: fallback) do
+ raise Gitlab::Git::Repository::NoRepository
+ end
+ end
+
+ it 'returns the fallback value' do
+ expect(subject).to eq(fallback)
+ end
+
+ it 'does not set the instance variable' do
+ subject
+
+ expect(repository.instance_variable_defined?(:@cats)).to eq(false)
+ end
+ end
+
+ context 'with an existing repository' do
+ it 'sets the instance variable' do
+ repository.memoize_method_output(:cats, fallback: fallback) do
+ 'block output'
+ end
+
+ expect(repository.instance_variable_get(:@cats)).to eq('block output')
+ end
+ end
+ end
+
describe '#expire_method_caches' do
it 'expires the caches of the given methods' do
expect(cache).to receive(:expire).with(:rendered_readme)
diff --git a/spec/lib/gitlab/repository_cache_spec.rb b/spec/lib/gitlab/repository_cache_spec.rb
index fc259cf1208..1b9a8b4ab0d 100644
--- a/spec/lib/gitlab/repository_cache_spec.rb
+++ b/spec/lib/gitlab/repository_cache_spec.rb
@@ -4,14 +4,14 @@ describe Gitlab::RepositoryCache do
let(:backend) { double('backend').as_null_object }
let(:project) { create(:project) }
let(:repository) { project.repository }
- let(:namespace) { "#{repository.full_path}:#{project.id}" }
+ let(:namespace) { "project:#{project.id}" }
let(:cache) { described_class.new(repository, backend: backend) }
describe '#cache_key' do
subject { cache.cache_key(:foo) }
it 'includes the namespace' do
- expect(subject).to eq "foo:#{namespace}"
+ expect(subject).to eq "#{namespace}:foo"
end
context 'with a given namespace' do
@@ -22,7 +22,7 @@ describe Gitlab::RepositoryCache do
end
it 'includes the full namespace' do
- expect(subject).to eq "foo:#{namespace}:#{extra_namespace}"
+ expect(subject).to eq "#{namespace}:#{extra_namespace}:foo"
end
end
end
@@ -30,21 +30,106 @@ describe Gitlab::RepositoryCache do
describe '#expire' do
it 'expires the given key from the cache' do
cache.expire(:foo)
- expect(backend).to have_received(:delete).with("foo:#{namespace}")
+ expect(backend).to have_received(:delete).with("#{namespace}:foo")
end
end
describe '#fetch' do
it 'fetches the given key from the cache' do
cache.fetch(:bar)
- expect(backend).to have_received(:fetch).with("bar:#{namespace}")
+ expect(backend).to have_received(:fetch).with("#{namespace}:bar")
end
it 'accepts a block' do
p = -> {}
cache.fetch(:baz, &p)
- expect(backend).to have_received(:fetch).with("baz:#{namespace}", &p)
+ expect(backend).to have_received(:fetch).with("#{namespace}:baz", &p)
+ end
+ end
+
+ describe '#fetch_without_caching_false', :use_clean_rails_memory_store_caching do
+ let(:key) { :foo }
+ let(:backend) { Rails.cache }
+
+ it 'requires a block' do
+ expect do
+ cache.fetch_without_caching_false(key)
+ end.to raise_error(LocalJumpError)
+ end
+
+ context 'when the key does not exist in the cache' do
+ context 'when the result of the block is truthy' do
+ it 'returns the result of the block' do
+ result = cache.fetch_without_caching_false(key) { true }
+
+ expect(result).to be true
+ end
+
+ it 'caches the value' do
+ expect(backend).to receive(:write).with("#{namespace}:#{key}", true)
+
+ cache.fetch_without_caching_false(key) { true }
+ end
+ end
+
+ context 'when the result of the block is falsey' do
+ let(:p) { -> { false } }
+
+ it 'returns the result of the block' do
+ result = cache.fetch_without_caching_false(key, &p)
+
+ expect(result).to be false
+ end
+
+ it 'does not cache the value' do
+ expect(backend).not_to receive(:write).with("#{namespace}:#{key}", true)
+
+ cache.fetch_without_caching_false(key, &p)
+ end
+ end
+ end
+
+ context 'when the cached value is truthy' do
+ before do
+ backend.write("#{namespace}:#{key}", true)
+ end
+
+ it 'returns the cached value' do
+ result = cache.fetch_without_caching_false(key) { 'block result' }
+
+ expect(result).to be true
+ end
+
+ it 'does not execute the block' do
+ expect do |b|
+ cache.fetch_without_caching_false(key, &b)
+ end.not_to yield_control
+ end
+
+ it 'does not write to the cache' do
+ expect(backend).not_to receive(:write)
+
+ cache.fetch_without_caching_false(key) { 'block result' }
+ end
+ end
+
+ context 'when the cached value is falsey' do
+ before do
+ backend.write("#{namespace}:#{key}", false)
+ end
+
+ it 'returns the result of the block' do
+ result = cache.fetch_without_caching_false(key) { 'block result' }
+
+ expect(result).to eq 'block result'
+ end
+
+ it 'writes the truthy value to the cache' do
+ expect(backend).to receive(:write).with("#{namespace}:#{key}", 'block result')
+
+ cache.fetch_without_caching_false(key) { 'block result' }
+ end
end
end
end
diff --git a/spec/lib/gitlab/safe_request_store_spec.rb b/spec/lib/gitlab/safe_request_store_spec.rb
new file mode 100644
index 00000000000..c797171dbe2
--- /dev/null
+++ b/spec/lib/gitlab/safe_request_store_spec.rb
@@ -0,0 +1,245 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::SafeRequestStore do
+ describe '.store' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect(described_class.store).to eq(RequestStore)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect(described_class.store).to be_a(Gitlab::NullRequestStore)
+ end
+ end
+ end
+
+ describe '.begin!' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:begin!)
+
+ described_class.begin!
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:begin!)
+
+ described_class.begin!
+ end
+ end
+ end
+
+ describe '.clear!' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:clear!).twice.and_call_original
+
+ described_class.clear!
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:clear!).and_call_original
+
+ described_class.clear!
+ end
+ end
+ end
+
+ describe '.end!' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:end!).twice.and_call_original
+
+ described_class.end!
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'uses RequestStore' do
+ expect(RequestStore).to receive(:end!).and_call_original
+
+ described_class.end!
+ end
+ end
+ end
+
+ describe '.write' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ described_class.write('foo', true)
+ end.to change { described_class.read('foo') }.from(nil).to(true)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect do
+ described_class.write('foo', true)
+ end.not_to change { described_class.read('foo') }.from(nil)
+ end
+ end
+ end
+
+ describe '.[]=' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ described_class['foo'] = true
+ end.to change { described_class.read('foo') }.from(nil).to(true)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect do
+ described_class['foo'] = true
+ end.not_to change { described_class.read('foo') }.from(nil)
+ end
+ end
+ end
+
+ describe '.read' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ RequestStore.write('foo', true)
+ end.to change { described_class.read('foo') }.from(nil).to(true)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect do
+ RequestStore.write('foo', true)
+ end.not_to change { described_class.read('foo') }.from(nil)
+
+ RequestStore.clear! # Clean up
+ end
+ end
+ end
+
+ describe '.[]' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ RequestStore.write('foo', true)
+ end.to change { described_class['foo'] }.from(nil).to(true)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect do
+ RequestStore.write('foo', true)
+ end.not_to change { described_class['foo'] }.from(nil)
+
+ RequestStore.clear! # Clean up
+ end
+ end
+ end
+
+ describe '.exist?' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ RequestStore.write('foo', 'not nil')
+ end.to change { described_class.exist?('foo') }.from(false).to(true)
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ expect do
+ RequestStore.write('foo', 'not nil')
+ end.not_to change { described_class.exist?('foo') }.from(false)
+
+ RequestStore.clear! # Clean up
+ end
+ end
+ end
+
+ describe '.fetch' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ expect do
+ described_class.fetch('foo') { 'block result' }
+ end.to change { described_class.read('foo') }.from(nil).to('block result')
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ it 'does not use RequestStore' do
+ RequestStore.clear! # Ensure clean
+
+ expect do
+ described_class.fetch('foo') { 'block result' }
+ end.not_to change { described_class.read('foo') }.from(nil)
+
+ RequestStore.clear! # Clean up
+ end
+ end
+ end
+
+ describe '.delete' do
+ context 'when RequestStore is active', :request_store do
+ it 'uses RequestStore' do
+ described_class.write('foo', true)
+
+ expect do
+ described_class.delete('foo')
+ end.to change { described_class.read('foo') }.from(true).to(nil)
+ end
+
+ context 'when given a block and the key exists' do
+ it 'does not execute the block' do
+ described_class.write('foo', true)
+
+ expect do |b|
+ described_class.delete('foo', &b)
+ end.not_to yield_control
+ end
+ end
+
+ context 'when given a block and the key does not exist' do
+ it 'yields the key and returns the block result' do
+ result = described_class.delete('foo') { |key| "#{key} block result" }
+
+ expect(result).to eq('foo block result')
+ end
+ end
+ end
+
+ context 'when RequestStore is NOT active' do
+ before do
+ RequestStore.write('foo', true)
+ end
+
+ after do
+ RequestStore.clear! # Clean up
+ end
+
+ it 'does not use RequestStore' do
+ expect do
+ described_class.delete('foo')
+ end.not_to change { RequestStore.read('foo') }.from(true)
+ end
+
+ context 'when given a block' do
+ it 'yields the key and returns the block result' do
+ result = described_class.delete('foo') { |key| "#{key} block result" }
+
+ expect(result).to eq('foo block result')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sentry_spec.rb b/spec/lib/gitlab/sentry_spec.rb
index 499757da061..d3b41b27b80 100644
--- a/spec/lib/gitlab/sentry_spec.rb
+++ b/spec/lib/gitlab/sentry_spec.rb
@@ -52,4 +52,28 @@ describe Gitlab::Sentry do
end
end
end
+
+ context '.track_acceptable_exception' do
+ let(:exception) { RuntimeError.new('boom') }
+
+ before do
+ allow(described_class).to receive(:enabled?).and_return(true)
+ end
+
+ it 'calls Raven.capture_exception' do
+ expected_extras = {
+ some_other_info: 'info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-ce/issues/1'
+ }
+
+ expect(Raven).to receive(:capture_exception)
+ .with(exception, extra: a_hash_including(expected_extras))
+
+ described_class.track_acceptable_exception(
+ exception,
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-ce/issues/1',
+ extra: { some_other_info: 'info' }
+ )
+ end
+ end
end
diff --git a/spec/lib/gitlab/shell_spec.rb b/spec/lib/gitlab/shell_spec.rb
index f8bf896950e..6ce9d515a0f 100644
--- a/spec/lib/gitlab/shell_spec.rb
+++ b/spec/lib/gitlab/shell_spec.rb
@@ -7,15 +7,10 @@ describe Gitlab::Shell do
let(:repository) { project.repository }
let(:gitlab_shell) { described_class.new }
let(:popen_vars) { { 'GIT_TERMINAL_PROMPT' => ENV['GIT_TERMINAL_PROMPT'] } }
- let(:gitlab_projects) { double('gitlab_projects') }
let(:timeout) { Gitlab.config.gitlab_shell.git_timeout }
before do
allow(Project).to receive(:find).and_return(project)
-
- allow(gitlab_shell).to receive(:gitlab_projects)
- .with(project.repository_storage, project.disk_path + '.git')
- .and_return(gitlab_projects)
end
it { is_expected.to respond_to :add_key }
@@ -503,126 +498,6 @@ describe Gitlab::Shell do
end
end
- describe '#fetch_remote' do
- def fetch_remote(ssh_auth = nil, prune = true)
- gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', ssh_auth: ssh_auth, prune: prune)
- end
-
- def expect_call(fail, options = {})
- receive_fetch_remote =
- if fail
- receive(:fetch_remote).and_raise(GRPC::NotFound)
- else
- receive(:fetch_remote).and_return(true)
- end
-
- expect_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive_fetch_remote
- end
-
- def build_ssh_auth(opts = {})
- defaults = {
- ssh_import?: true,
- ssh_key_auth?: false,
- ssh_known_hosts: nil,
- ssh_private_key: nil
- }
-
- double(:ssh_auth, defaults.merge(opts))
- end
-
- it 'returns true when the command succeeds' do
- expect_call(false, force: false, tags: true, prune: true)
-
- expect(fetch_remote).to be_truthy
- end
-
- it 'returns true when the command succeeds' do
- expect_call(false, force: false, tags: true, prune: false)
-
- expect(fetch_remote(nil, false)).to be_truthy
- end
-
- it 'raises an exception when the command fails' do
- expect_call(true, force: false, tags: true, prune: true)
-
- expect { fetch_remote }.to raise_error(Gitlab::Shell::Error)
- end
-
- it 'allows forced and no_tags to be changed' do
- expect_call(false, force: true, tags: false, prune: true)
-
- result = gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', forced: true, no_tags: true, prune: true)
- expect(result).to be_truthy
- end
-
- context 'SSH auth' do
- it 'passes the SSH key if specified' do
- expect_call(false, force: false, tags: true, prune: true, ssh_key: 'foo')
-
- ssh_auth = build_ssh_auth(ssh_key_auth?: true, ssh_private_key: 'foo')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
-
- it 'does not pass an empty SSH key' do
- expect_call(false, force: false, tags: true, prune: true)
-
- ssh_auth = build_ssh_auth(ssh_key_auth: true, ssh_private_key: '')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
-
- it 'does not pass the key unless SSH key auth is to be used' do
- expect_call(false, force: false, tags: true, prune: true)
-
- ssh_auth = build_ssh_auth(ssh_key_auth: false, ssh_private_key: 'foo')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
-
- it 'passes the known_hosts data if specified' do
- expect_call(false, force: false, tags: true, prune: true, known_hosts: 'foo')
-
- ssh_auth = build_ssh_auth(ssh_known_hosts: 'foo')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
-
- it 'does not pass empty known_hosts data' do
- expect_call(false, force: false, tags: true, prune: true)
-
- ssh_auth = build_ssh_auth(ssh_known_hosts: '')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
-
- it 'does not pass known_hosts data unless SSH is to be used' do
- expect_call(false, force: false, tags: true, prune: true)
-
- ssh_auth = build_ssh_auth(ssh_import?: false, ssh_known_hosts: 'foo')
-
- expect(fetch_remote(ssh_auth)).to be_truthy
- end
- end
-
- context 'gitaly call' do
- let(:remote_name) { 'remote-name' }
- let(:ssh_auth) { double(:ssh_auth) }
-
- subject do
- gitlab_shell.fetch_remote(repository.raw_repository, remote_name,
- forced: true, no_tags: true, ssh_auth: ssh_auth)
- end
-
- it 'passes the correct params to the gitaly service' do
- expect(repository.gitaly_repository_client).to receive(:fetch_remote)
- .with(remote_name, ssh_auth: ssh_auth, forced: true, no_tags: true, prune: true, timeout: timeout)
-
- subject
- end
- end
- end
-
describe '#import_repository' do
let(:import_url) { 'https://gitlab.com/gitlab-org/gitlab-ce.git' }
diff --git a/spec/lib/gitlab/sidekiq_throttler_spec.rb b/spec/lib/gitlab/sidekiq_throttler_spec.rb
deleted file mode 100644
index 2dbb7bb7c34..00000000000
--- a/spec/lib/gitlab/sidekiq_throttler_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::SidekiqThrottler do
- describe '#execute!' do
- context 'when job throttling is enabled' do
- before do
- Sidekiq.options[:concurrency] = 35
-
- stub_application_setting(
- sidekiq_throttling_enabled: true,
- sidekiq_throttling_factor: 0.1,
- sidekiq_throttling_queues: %w[build project_cache]
- )
- end
-
- it 'requires sidekiq-limit_fetch' do
- expect(described_class).to receive(:require).with('sidekiq-limit_fetch').and_call_original
-
- described_class.execute!
- end
-
- it 'sets limits on the selected queues' do
- described_class.execute!
-
- expect(Sidekiq::Queue['build'].limit).to eq 4
- expect(Sidekiq::Queue['project_cache'].limit).to eq 4
- end
-
- it 'does not set limits on other queues' do
- described_class.execute!
-
- expect(Sidekiq::Queue['merge'].limit).to be_nil
- end
- end
-
- context 'when job throttling is disabled' do
- it 'does not require sidekiq-limit_fetch' do
- expect(described_class).not_to receive(:require).with('sidekiq-limit_fetch')
-
- described_class.execute!
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/slash_commands/command_spec.rb b/spec/lib/gitlab/slash_commands/command_spec.rb
index 194cae8c645..eceacac58af 100644
--- a/spec/lib/gitlab/slash_commands/command_spec.rb
+++ b/spec/lib/gitlab/slash_commands/command_spec.rb
@@ -44,7 +44,7 @@ describe Gitlab::SlashCommands::Command do
let!(:build) { create(:ci_build, pipeline: pipeline) }
let!(:pipeline) { create(:ci_pipeline, project: project) }
let!(:staging) { create(:environment, name: 'staging', project: project) }
- let!(:deployment) { create(:deployment, environment: staging, deployable: build) }
+ let!(:deployment) { create(:deployment, :success, environment: staging, deployable: build) }
let!(:manual) do
create(:ci_build, :manual, pipeline: pipeline,
diff --git a/spec/lib/gitlab/slash_commands/deploy_spec.rb b/spec/lib/gitlab/slash_commands/deploy_spec.rb
index 0d57334aa4c..25f3e8a0409 100644
--- a/spec/lib/gitlab/slash_commands/deploy_spec.rb
+++ b/spec/lib/gitlab/slash_commands/deploy_spec.rb
@@ -31,7 +31,7 @@ describe Gitlab::SlashCommands::Deploy do
let!(:staging) { create(:environment, name: 'staging', project: project) }
let!(:pipeline) { create(:ci_pipeline, project: project) }
let!(:build) { create(:ci_build, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, environment: staging, deployable: build) }
+ let!(:deployment) { create(:deployment, :success, environment: staging, deployable: build) }
context 'without actions' do
it 'does not execute an action' do
diff --git a/spec/lib/gitlab/storage_check/cli_spec.rb b/spec/lib/gitlab/storage_check/cli_spec.rb
deleted file mode 100644
index 6db0925899c..00000000000
--- a/spec/lib/gitlab/storage_check/cli_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::StorageCheck::CLI do
- let(:options) { Gitlab::StorageCheck::Options.new('unix://tmp/socket.sock', nil, 1, false) }
- subject(:runner) { described_class.new(options) }
-
- describe '#update_settings' do
- it 'updates the interval when changed in a valid response and logs the change' do
- fake_response = double
- expect(fake_response).to receive(:valid?).and_return(true)
- expect(fake_response).to receive(:check_interval).and_return(42)
- expect(runner.logger).to receive(:info)
-
- runner.update_settings(fake_response)
-
- expect(options.interval).to eq(42)
- end
- end
-end
diff --git a/spec/lib/gitlab/storage_check/gitlab_caller_spec.rb b/spec/lib/gitlab/storage_check/gitlab_caller_spec.rb
deleted file mode 100644
index d869022fd31..00000000000
--- a/spec/lib/gitlab/storage_check/gitlab_caller_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::StorageCheck::GitlabCaller do
- let(:options) { Gitlab::StorageCheck::Options.new('unix://tmp/socket.sock', nil, nil, false) }
- subject(:gitlab_caller) { described_class.new(options) }
-
- describe '#call!' do
- context 'when a socket is given' do
- it 'calls a socket' do
- fake_connection = double
- expect(fake_connection).to receive(:post)
- expect(Excon).to receive(:new).with('unix://tmp/socket.sock', socket: "tmp/socket.sock") { fake_connection }
-
- gitlab_caller.call!
- end
- end
-
- context 'when a host is given' do
- let(:options) { Gitlab::StorageCheck::Options.new('http://localhost:8080', nil, nil, false) }
-
- it 'it calls a http response' do
- fake_connection = double
- expect(Excon).to receive(:new).with('http://localhost:8080', socket: nil) { fake_connection }
- expect(fake_connection).to receive(:post)
-
- gitlab_caller.call!
- end
- end
- end
-
- describe '#headers' do
- it 'Adds the JSON header' do
- headers = gitlab_caller.headers
-
- expect(headers['Content-Type']).to eq('application/json')
- end
-
- context 'when a token was provided' do
- let(:options) { Gitlab::StorageCheck::Options.new('unix://tmp/socket.sock', 'atoken', nil, false) }
-
- it 'adds it to the headers' do
- expect(gitlab_caller.headers['TOKEN']).to eq('atoken')
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/storage_check/option_parser_spec.rb b/spec/lib/gitlab/storage_check/option_parser_spec.rb
deleted file mode 100644
index cad4dfbefcf..00000000000
--- a/spec/lib/gitlab/storage_check/option_parser_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::StorageCheck::OptionParser do
- describe '.parse!' do
- it 'assigns all options' do
- args = %w(--target unix://tmp/hello/world.sock --token thetoken --interval 42)
-
- options = described_class.parse!(args)
-
- expect(options.token).to eq('thetoken')
- expect(options.interval).to eq(42)
- expect(options.target).to eq('unix://tmp/hello/world.sock')
- end
-
- it 'requires the interval to be a number' do
- args = %w(--target unix://tmp/hello/world.sock --interval fortytwo)
-
- expect { described_class.parse!(args) }.to raise_error(OptionParser::InvalidArgument)
- end
-
- it 'raises an error if the scheme is not included' do
- args = %w(--target tmp/hello/world.sock)
-
- expect { described_class.parse!(args) }.to raise_error(OptionParser::InvalidArgument)
- end
-
- it 'raises an error if both socket and host are missing' do
- expect { described_class.parse!([]) }.to raise_error(OptionParser::InvalidArgument)
- end
- end
-end
diff --git a/spec/lib/gitlab/storage_check/response_spec.rb b/spec/lib/gitlab/storage_check/response_spec.rb
deleted file mode 100644
index 0ff2963e443..00000000000
--- a/spec/lib/gitlab/storage_check/response_spec.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::StorageCheck::Response do
- let(:fake_json) do
- {
- check_interval: 42,
- results: [
- { storage: 'working', success: true },
- { storage: 'skipped', success: nil },
- { storage: 'failing', success: false }
- ]
- }.to_json
- end
-
- let(:fake_http_response) do
- fake_response = instance_double("Excon::Response - Status check")
- allow(fake_response).to receive(:status).and_return(200)
- allow(fake_response).to receive(:body).and_return(fake_json)
- allow(fake_response).to receive(:headers).and_return('Content-Type' => 'application/json')
-
- fake_response
- end
- let(:response) { described_class.new(fake_http_response) }
-
- describe '#valid?' do
- it 'is valid for a success response with parseable JSON' do
- expect(response).to be_valid
- end
- end
-
- describe '#check_interval' do
- it 'returns the result from the JSON' do
- expect(response.check_interval).to eq(42)
- end
- end
-
- describe '#responsive_shards' do
- it 'contains the names of working shards' do
- expect(response.responsive_shards).to contain_exactly('working')
- end
- end
-
- describe '#skipped_shards' do
- it 'contains the names of skipped shards' do
- expect(response.skipped_shards).to contain_exactly('skipped')
- end
- end
-
- describe '#failing_shards' do
- it 'contains the name of failing shards' do
- expect(response.failing_shards).to contain_exactly('failing')
- end
- end
-end
diff --git a/spec/lib/gitlab/template/finders/repo_template_finders_spec.rb b/spec/lib/gitlab/template/finders/repo_template_finders_spec.rb
new file mode 100644
index 00000000000..2eabccd5dff
--- /dev/null
+++ b/spec/lib/gitlab/template/finders/repo_template_finders_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+describe Gitlab::Template::Finders::RepoTemplateFinder do
+ set(:project) { create(:project, :repository) }
+
+ let(:categories) { { 'HTML' => 'html' } }
+
+ subject(:finder) { described_class.new(project, 'files/', '.html', categories) }
+
+ describe '#read' do
+ it 'returns the content of the given path' do
+ result = finder.read('files/html/500.html')
+
+ expect(result).to be_present
+ end
+
+ it 'raises an error if the path does not exist' do
+ expect { finder.read('does/not/exist') }.to raise_error(described_class::FileNotFoundError)
+ end
+ end
+
+ describe '#find' do
+ it 'returns the full path of the found template' do
+ result = finder.find('500')
+
+ expect(result).to eq('files/html/500.html')
+ end
+ end
+
+ describe '#list_files_for' do
+ it 'returns the full path of the found files' do
+ result = finder.list_files_for('files/html')
+
+ expect(result).to contain_exactly('files/html/500.html')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb b/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
index e2fa76522bc..fe46c67a920 100644
--- a/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
+++ b/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
@@ -40,7 +40,7 @@ describe Gitlab::Template::GitlabCiYmlTemplate do
describe '#content' do
it 'loads the full file' do
- gitignore = subject.new(Rails.root.join('vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml'))
+ gitignore = subject.new(Rails.root.join('lib/gitlab/ci/templates/Ruby.gitlab-ci.yml'))
expect(gitignore.name).to eq 'Ruby'
expect(gitignore.content).to start_with('#')
diff --git a/spec/lib/gitlab/tree_summary_spec.rb b/spec/lib/gitlab/tree_summary_spec.rb
new file mode 100644
index 00000000000..7ffcef2baef
--- /dev/null
+++ b/spec/lib/gitlab/tree_summary_spec.rb
@@ -0,0 +1,202 @@
+require 'spec_helper'
+
+describe Gitlab::TreeSummary do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:project) { create(:project, :empty_repo) }
+ let(:repo) { project.repository }
+ let(:commit) { repo.head_commit }
+
+ let(:path) { nil }
+ let(:offset) { nil }
+ let(:limit) { nil }
+
+ subject(:summary) { described_class.new(commit, project, path: path, offset: offset, limit: limit) }
+
+ describe '#initialize' do
+ it 'defaults offset to 0' do
+ expect(summary.offset).to eq(0)
+ end
+
+ it 'defaults limit to 25' do
+ expect(summary.limit).to eq(25)
+ end
+ end
+
+ describe '#summarize' do
+ let(:project) { create(:project, :custom_repo, files: { 'a.txt' => '' }) }
+
+ subject(:summarized) { summary.summarize }
+
+ it 'returns an array of entries, and an array of commits' do
+ expect(summarized).to be_a(Array)
+ expect(summarized.size).to eq(2)
+
+ entries, commits = *summarized
+ aggregate_failures do
+ expect(entries).to contain_exactly(
+ a_hash_including(file_name: 'a.txt', commit: have_attributes(id: commit.id))
+ )
+
+ expect(commits).to match_array(entries.map { |entry| entry[:commit] })
+ end
+ end
+ end
+
+ describe '#summarize (entries)' do
+ let(:limit) { 2 }
+
+ custom_files = {
+ 'a.txt' => '',
+ 'b.txt' => '',
+ 'directory/c.txt' => ''
+ }
+
+ let(:project) { create(:project, :custom_repo, files: custom_files) }
+ let(:commit) { repo.head_commit }
+
+ subject(:entries) { summary.summarize.first }
+
+ it 'summarizes the entries within the window' do
+ is_expected.to contain_exactly(
+ a_hash_including(type: :tree, file_name: 'directory'),
+ a_hash_including(type: :blob, file_name: 'a.txt')
+ # b.txt is excluded by the limit
+ )
+ end
+
+ it 'references the commit and commit path in entries' do
+ entry = entries.first
+ expected_commit_path = Gitlab::Routing.url_helpers.project_commit_path(project, commit)
+
+ expect(entry[:commit]).to be_a(::Commit)
+ expect(entry[:commit_path]).to eq expected_commit_path
+ end
+
+ context 'in a good subdirectory' do
+ let(:path) { 'directory' }
+
+ it 'summarizes the entries in the subdirectory' do
+ is_expected.to contain_exactly(a_hash_including(type: :blob, file_name: 'c.txt'))
+ end
+ end
+
+ context 'in a non-existent subdirectory' do
+ let(:path) { 'tmp' }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'custom offset and limit' do
+ let(:offset) { 2 }
+
+ it 'returns entries from the offset' do
+ is_expected.to contain_exactly(a_hash_including(type: :blob, file_name: 'b.txt'))
+ end
+ end
+ end
+
+ describe '#summarize (commits)' do
+ # This is a commit in the master branch of the gitlab-test repository that
+ # satisfies certain assumptions these tests depend on
+ let(:test_commit_sha) { '7975be0116940bf2ad4321f79d02a55c5f7779aa' }
+ let(:whitespace_commit_sha) { '66eceea0db202bb39c4e445e8ca28689645366c5' }
+
+ let(:project) { create(:project, :repository) }
+ let(:commit) { repo.commit(test_commit_sha) }
+ let(:limit) { nil }
+ let(:entries) { summary.summarize.first }
+
+ subject(:commits) do
+ summary.summarize.last
+ end
+
+ it 'returns an Array of ::Commit objects' do
+ is_expected.not_to be_empty
+ is_expected.to all(be_kind_of(::Commit))
+ end
+
+ it 'deduplicates commits when multiple entries reference the same commit' do
+ expect(commits.size).to be < entries.size
+ end
+
+ context 'in a subdirectory' do
+ let(:path) { 'files' }
+
+ it 'returns commits for entries in the subdirectory' do
+ expect(commits).to satisfy_one { |c| c.id == whitespace_commit_sha }
+ end
+ end
+ end
+
+ describe '#more?' do
+ let(:path) { 'tmp/more' }
+
+ where(:num_entries, :offset, :limit, :expected_result) do
+ 0 | 0 | 0 | false
+ 0 | 0 | 1 | false
+
+ 1 | 0 | 0 | true
+ 1 | 0 | 1 | false
+ 1 | 1 | 0 | false
+ 1 | 1 | 1 | false
+
+ 2 | 0 | 0 | true
+ 2 | 0 | 1 | true
+ 2 | 0 | 2 | false
+ 2 | 0 | 3 | false
+ 2 | 1 | 0 | true
+ 2 | 1 | 1 | false
+ 2 | 2 | 0 | false
+ 2 | 2 | 1 | false
+ end
+
+ with_them do
+ before do
+ create_file('dummy', path: 'other') if num_entries.zero?
+ 1.upto(num_entries) { |n| create_file(n, path: path) }
+ end
+
+ subject { summary.more? }
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+
+ describe '#next_offset' do
+ let(:path) { 'tmp/next_offset' }
+
+ where(:num_entries, :offset, :limit, :expected_result) do
+ 0 | 0 | 0 | 0
+ 0 | 0 | 1 | 1
+ 0 | 1 | 0 | 1
+ 0 | 1 | 1 | 1
+
+ 1 | 0 | 0 | 0
+ 1 | 0 | 1 | 1
+ 1 | 1 | 0 | 1
+ 1 | 1 | 1 | 2
+ end
+
+ with_them do
+ before do
+ create_file('dummy', path: 'other') if num_entries.zero?
+ 1.upto(num_entries) { |n| create_file(n, path: path) }
+ end
+
+ subject { summary.next_offset }
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+
+ def create_file(unique, path:)
+ repo.create_file(
+ project.creator,
+ "#{path}/file-#{unique}.txt",
+ 'content',
+ message: "Commit message #{unique}",
+ branch_name: 'master'
+ )
+ end
+end
diff --git a/spec/lib/gitlab/url_blocker_spec.rb b/spec/lib/gitlab/url_blocker_spec.rb
index 6f5f9938eca..8df0facdab3 100644
--- a/spec/lib/gitlab/url_blocker_spec.rb
+++ b/spec/lib/gitlab/url_blocker_spec.rb
@@ -1,3 +1,4 @@
+# coding: utf-8
require 'spec_helper'
describe Gitlab::UrlBlocker do
@@ -28,6 +29,16 @@ describe Gitlab::UrlBlocker do
expect(described_class.blocked_url?('https://gitlab.com/foo/foo.git', protocols: ['http'])).to be true
end
+ it 'returns true for localhost IPs' do
+ expect(described_class.blocked_url?('https://0.0.0.0/foo/foo.git')).to be true
+ expect(described_class.blocked_url?('https://[::1]/foo/foo.git')).to be true
+ expect(described_class.blocked_url?('https://127.0.0.1/foo/foo.git')).to be true
+ end
+
+ it 'returns true for loopback IP' do
+ expect(described_class.blocked_url?('https://127.0.0.2/foo/foo.git')).to be true
+ end
+
it 'returns true for alternative version of 127.0.0.1 (0177.1)' do
expect(described_class.blocked_url?('https://0177.1:65535/foo/foo.git')).to be true
end
@@ -82,6 +93,27 @@ describe Gitlab::UrlBlocker do
expect(described_class).not_to be_blocked_url("http://#{ip}")
end
end
+
+ it 'allows localhost endpoints' do
+ expect(described_class).not_to be_blocked_url('http://0.0.0.0', allow_localhost: true)
+ expect(described_class).not_to be_blocked_url('http://localhost', allow_localhost: true)
+ expect(described_class).not_to be_blocked_url('http://127.0.0.1', allow_localhost: true)
+ end
+
+ it 'allows loopback endpoints' do
+ expect(described_class).not_to be_blocked_url('http://127.0.0.2', allow_localhost: true)
+ end
+
+ it 'allows IPv4 link-local endpoints' do
+ expect(described_class).not_to be_blocked_url('http://169.254.169.254')
+ expect(described_class).not_to be_blocked_url('http://169.254.168.100')
+ end
+
+ # This is blocked due to the hostname check: https://gitlab.com/gitlab-org/gitlab-ce/issues/50227
+ it 'blocks IPv6 link-local endpoints' do
+ expect(described_class).to be_blocked_url('http://[::ffff:169.254.169.254]')
+ expect(described_class).to be_blocked_url('http://[::ffff:169.254.168.100]')
+ end
end
context 'false' do
@@ -96,10 +128,21 @@ describe Gitlab::UrlBlocker do
expect(described_class).to be_blocked_url("http://#{ip}", allow_local_network: false)
end
end
+
+ it 'blocks IPv4 link-local endpoints' do
+ expect(described_class).to be_blocked_url('http://169.254.169.254', allow_local_network: false)
+ expect(described_class).to be_blocked_url('http://169.254.168.100', allow_local_network: false)
+ end
+
+ it 'blocks IPv6 link-local endpoints' do
+ expect(described_class).to be_blocked_url('http://[::ffff:169.254.169.254]', allow_local_network: false)
+ expect(described_class).to be_blocked_url('http://[::ffff:169.254.168.100]', allow_local_network: false)
+ expect(described_class).to be_blocked_url('http://[FE80::C800:EFF:FE74:8]', allow_local_network: false)
+ end
end
def stub_domain_resolv(domain, ip)
- allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([double(ip_address: ip, ipv4_private?: true)])
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([double(ip_address: ip, ipv4_private?: true, ipv6_link_local?: false, ipv4_loopback?: false, ipv6_loopback?: false)])
end
def unstub_domain_resolv
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index a19b3c0ba66..b212d2b05f2 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -8,6 +8,7 @@ describe Gitlab::UsageData do
before do
create(:jira_service, project: projects[0])
create(:jira_service, project: projects[1])
+ create(:jira_cloud_service, project: projects[2])
create(:prometheus_service, project: projects[1])
create(:service, project: projects[0], type: 'SlackSlashCommandsService', active: true)
create(:service, project: projects[1], type: 'SlackService', active: true)
@@ -20,6 +21,7 @@ describe Gitlab::UsageData do
create(:clusters_applications_ingress, :installed, cluster: gcp_cluster)
create(:clusters_applications_prometheus, :installed, cluster: gcp_cluster)
create(:clusters_applications_runner, :installed, cluster: gcp_cluster)
+ create(:clusters_applications_knative, :installed, cluster: gcp_cluster)
end
subject { described_class.data }
@@ -46,6 +48,7 @@ describe Gitlab::UsageData do
git
database
avg_cycle_analytics
+ web_ide_commits
))
end
@@ -56,6 +59,7 @@ describe Gitlab::UsageData do
expect(count_data[:projects]).to eq(3)
expect(count_data.keys).to match_array(%i(
+ assignee_lists
boards
ci_builds
ci_internal_pipelines
@@ -79,18 +83,23 @@ describe Gitlab::UsageData do
clusters_applications_ingress
clusters_applications_prometheus
clusters_applications_runner
+ clusters_applications_knative
in_review_folder
groups
issues
keys
+ label_lists
labels
lfs_objects
merge_requests
+ milestone_lists
milestones
notes
projects
projects_imported_from_github
projects_jira_active
+ projects_jira_server_active
+ projects_jira_cloud_active
projects_slack_notifications_active
projects_slack_slash_active
projects_prometheus_active
@@ -110,7 +119,9 @@ describe Gitlab::UsageData do
expect(count_data[:projects]).to eq(3)
expect(count_data[:projects_prometheus_active]).to eq(1)
- expect(count_data[:projects_jira_active]).to eq(2)
+ expect(count_data[:projects_jira_active]).to eq(3)
+ expect(count_data[:projects_jira_server_active]).to eq(2)
+ expect(count_data[:projects_jira_cloud_active]).to eq(1)
expect(count_data[:projects_slack_notifications_active]).to eq(2)
expect(count_data[:projects_slack_slash_active]).to eq(1)
@@ -122,6 +133,14 @@ describe Gitlab::UsageData do
expect(count_data[:clusters_applications_ingress]).to eq(1)
expect(count_data[:clusters_applications_prometheus]).to eq(1)
expect(count_data[:clusters_applications_runner]).to eq(1)
+ expect(count_data[:clusters_applications_knative]).to eq(1)
+ end
+
+ it 'works when queries time out' do
+ allow_any_instance_of(ActiveRecord::Relation)
+ .to receive(:count).and_raise(ActiveRecord::StatementInvalid.new(''))
+
+ expect { subject }.not_to raise_error
end
end
@@ -163,4 +182,20 @@ describe Gitlab::UsageData do
expect(subject[:recorded_at]).to be_a(Time)
end
end
+
+ describe '#count' do
+ let(:relation) { double(:relation) }
+
+ it 'returns the count when counting succeeds' do
+ allow(relation).to receive(:count).and_return(1)
+
+ expect(described_class.count(relation)).to eq(1)
+ end
+
+ it 'returns the fallback value when counting fails' do
+ allow(relation).to receive(:count).and_raise(ActiveRecord::StatementInvalid.new(''))
+
+ expect(described_class.count(relation, fallback: 15)).to eq(15)
+ end
+ end
end
diff --git a/spec/lib/gitlab/user_extractor_spec.rb b/spec/lib/gitlab/user_extractor_spec.rb
new file mode 100644
index 00000000000..fcc05ab3a0c
--- /dev/null
+++ b/spec/lib/gitlab/user_extractor_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::UserExtractor do
+ let(:text) do
+ <<~TXT
+ This is a long texth that mentions some users.
+ @user-1, @user-2 and user@gitlab.org take a walk in the park.
+ There they meet @user-4 that was out with other-user@gitlab.org.
+ @user-1 thought it was late, so went home straight away
+ TXT
+ end
+ subject(:extractor) { described_class.new(text) }
+
+ describe '#users' do
+ it 'returns an empty relation when nil was passed' do
+ extractor = described_class.new(nil)
+
+ expect(extractor.users).to be_empty
+ expect(extractor.users).to be_a(ActiveRecord::Relation)
+ end
+
+ it 'returns the user case insensitive for usernames' do
+ user = create(:user, username: "USER-4")
+
+ expect(extractor.users).to include(user)
+ end
+
+ it 'returns users by primary email' do
+ user = create(:user, email: 'user@gitlab.org')
+
+ expect(extractor.users).to include(user)
+ end
+
+ it 'returns users by secondary email' do
+ user = create(:email, email: 'other-user@gitlab.org').user
+
+ expect(extractor.users).to include(user)
+ end
+ end
+
+ describe '#matches' do
+ it 'includes all mentioned email adresses' do
+ expect(extractor.matches[:emails]).to contain_exactly('user@gitlab.org', 'other-user@gitlab.org')
+ end
+
+ it 'includes all mentioned usernames' do
+ expect(extractor.matches[:usernames]).to contain_exactly('user-1', 'user-2', 'user-4')
+ end
+ end
+
+ describe '#references' do
+ it 'includes all user-references once' do
+ expect(extractor.references).to contain_exactly('user-1', 'user-2', 'user@gitlab.org', 'user-4', 'other-user@gitlab.org')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb
index 4ba99009855..ad2c9d7f2af 100644
--- a/spec/lib/gitlab/utils_spec.rb
+++ b/spec/lib/gitlab/utils_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Gitlab::Utils do
delegate :to_boolean, :boolean_to_yes_no, :slugify, :random_string, :which, :ensure_array_from_string,
- :bytes_to_megabytes, to: :described_class
+ :bytes_to_megabytes, :append_path, to: :described_class
describe '.slugify' do
{
@@ -106,4 +106,25 @@ describe Gitlab::Utils do
expect(bytes_to_megabytes(bytes)).to eq(1)
end
end
+
+ describe '.append_path' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:host, :path, :result) do
+ 'http://test/' | '/foo/bar' | 'http://test/foo/bar'
+ 'http://test/' | '//foo/bar' | 'http://test/foo/bar'
+ 'http://test//' | '/foo/bar' | 'http://test/foo/bar'
+ 'http://test' | 'foo/bar' | 'http://test/foo/bar'
+ 'http://test//' | '' | 'http://test/'
+ 'http://test//' | nil | 'http://test/'
+ '' | '/foo/bar' | '/foo/bar'
+ nil | '/foo/bar' | '/foo/bar'
+ end
+
+ with_them do
+ it 'makes sure there is only one slash as path separator' do
+ expect(append_path(host, path)).to eq(result)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb
index c8a1e433d59..30035c79e58 100644
--- a/spec/lib/gitlab/version_info_spec.rb
+++ b/spec/lib/gitlab/version_info_spec.rb
@@ -57,6 +57,9 @@ describe 'Gitlab::VersionInfo' do
context 'parse' do
it { expect(Gitlab::VersionInfo.parse("1.0.0")).to eq(@v1_0_0) }
it { expect(Gitlab::VersionInfo.parse("1.0.0.1")).to eq(@v1_0_0) }
+ it { expect(Gitlab::VersionInfo.parse("1.0.0-ee")).to eq(@v1_0_0) }
+ it { expect(Gitlab::VersionInfo.parse("1.0.0-rc1")).to eq(@v1_0_0) }
+ it { expect(Gitlab::VersionInfo.parse("1.0.0-rc1-ee")).to eq(@v1_0_0) }
it { expect(Gitlab::VersionInfo.parse("git 1.0.0b1")).to eq(@v1_0_0) }
it { expect(Gitlab::VersionInfo.parse("git 1.0b1")).not_to be_valid }
end
diff --git a/spec/lib/gitlab/view/presenter/base_spec.rb b/spec/lib/gitlab/view/presenter/base_spec.rb
index 4eca53032a2..02c2fd47197 100644
--- a/spec/lib/gitlab/view/presenter/base_spec.rb
+++ b/spec/lib/gitlab/view/presenter/base_spec.rb
@@ -40,7 +40,7 @@ describe Gitlab::View::Presenter::Base do
end
end
- context 'subject is overriden' do
+ context 'subject is overridden' do
it 'returns true' do
presenter = presenter_class.new(build_stubbed(:project, :public))
diff --git a/spec/lib/gitlab/web_ide_commits_counter_spec.rb b/spec/lib/gitlab/web_ide_commits_counter_spec.rb
new file mode 100644
index 00000000000..c51889a1c63
--- /dev/null
+++ b/spec/lib/gitlab/web_ide_commits_counter_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::WebIdeCommitsCounter, :clean_gitlab_redis_shared_state do
+ describe '.increment' do
+ it 'increments the web ide commits counter by 1' do
+ expect do
+ described_class.increment
+ end.to change { described_class.total_count }.from(0).to(1)
+ end
+ end
+
+ describe '.total_count' do
+ it 'returns the total amount of web ide commits' do
+ expect(described_class.total_count).to eq(0)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb
index 23869f3d2da..b3f55a2e1bd 100644
--- a/spec/lib/gitlab/workhorse_spec.rb
+++ b/spec/lib/gitlab/workhorse_spec.rb
@@ -336,6 +336,22 @@ describe Gitlab::Workhorse do
it { expect { subject }.to raise_exception('Unsupported action: download') }
end
end
+
+ context 'when receive_max_input_size has been updated' do
+ it 'returns custom git config' do
+ allow(Gitlab::CurrentSettings).to receive(:receive_max_input_size) { 1 }
+
+ expect(subject[:GitConfigOptions]).to be_present
+ end
+ end
+
+ context 'when receive_max_input_size is empty' do
+ it 'returns an empty git config' do
+ allow(Gitlab::CurrentSettings).to receive(:receive_max_input_size) { nil }
+
+ expect(subject[:GitConfigOptions]).to be_empty
+ end
+ end
end
describe '.set_key_and_notify' do
diff --git a/spec/lib/google_api/cloud_platform/client_spec.rb b/spec/lib/google_api/cloud_platform/client_spec.rb
index 27cb3198e5b..e2134dc279c 100644
--- a/spec/lib/google_api/cloud_platform/client_spec.rb
+++ b/spec/lib/google_api/cloud_platform/client_spec.rb
@@ -66,25 +66,30 @@ describe GoogleApi::CloudPlatform::Client do
describe '#projects_zones_clusters_create' do
subject do
client.projects_zones_clusters_create(
- spy, spy, cluster_name, cluster_size, machine_type: machine_type)
+ project_id, zone, cluster_name, cluster_size, machine_type: machine_type, legacy_abac: legacy_abac)
end
+ let(:project_id) { 'project-123' }
+ let(:zone) { 'us-central1-a' }
let(:cluster_name) { 'test-cluster' }
let(:cluster_size) { 1 }
let(:machine_type) { 'n1-standard-2' }
+ let(:legacy_abac) { true }
+ let(:create_cluster_request_body) { double('Google::Apis::ContainerV1::CreateClusterRequest') }
let(:operation) { double }
before do
allow_any_instance_of(Google::Apis::ContainerV1::ContainerService)
- .to receive(:create_cluster).with(any_args, options: user_agent_options)
+ .to receive(:create_cluster).with(any_args)
.and_return(operation)
end
- it { is_expected.to eq(operation) }
-
it 'sets corresponded parameters' do
- expect_any_instance_of(Google::Apis::ContainerV1::CreateClusterRequest)
- .to receive(:initialize).with(
+ expect_any_instance_of(Google::Apis::ContainerV1::ContainerService)
+ .to receive(:create_cluster).with(project_id, zone, create_cluster_request_body, options: user_agent_options)
+
+ expect(Google::Apis::ContainerV1::CreateClusterRequest)
+ .to receive(:new).with(
{
"cluster": {
"name": cluster_name,
@@ -96,9 +101,35 @@ describe GoogleApi::CloudPlatform::Client do
"enabled": true
}
}
- } )
+ } ).and_return(create_cluster_request_body)
+
+ expect(subject).to eq operation
+ end
+
+ context 'create without legacy_abac' do
+ let(:legacy_abac) { false }
+
+ it 'sets corresponded parameters' do
+ expect_any_instance_of(Google::Apis::ContainerV1::ContainerService)
+ .to receive(:create_cluster).with(project_id, zone, create_cluster_request_body, options: user_agent_options)
+
+ expect(Google::Apis::ContainerV1::CreateClusterRequest)
+ .to receive(:new).with(
+ {
+ "cluster": {
+ "name": cluster_name,
+ "initial_node_count": cluster_size,
+ "node_config": {
+ "machine_type": machine_type
+ },
+ "legacy_abac": {
+ "enabled": false
+ }
+ }
+ } ).and_return(create_cluster_request_body)
- subject
+ expect(subject).to eq operation
+ end
end
end
diff --git a/spec/lib/json_web_token/hmac_token_spec.rb b/spec/lib/json_web_token/hmac_token_spec.rb
new file mode 100644
index 00000000000..f2cbc381967
--- /dev/null
+++ b/spec/lib/json_web_token/hmac_token_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'timecop'
+
+describe JSONWebToken::HMACToken do
+ let(:secret) { 'shh secret squirrel' }
+
+ shared_examples 'a valid, non-expired token' do
+ it 'is an Array with two elements' do
+ expect(decoded_token).to be_a(Array)
+ expect(decoded_token.count).to eq(2)
+ end
+
+ it 'contains the following keys in the first Array element Hash - jti, iat, nbf, exp' do
+ expect(decoded_token[0].keys).to include('jti', 'iat', 'nbf', 'exp')
+ end
+
+ it 'contains the following keys in the second Array element Hash - typ and alg' do
+ expect(decoded_token[1]['typ']).to eql('JWT')
+ expect(decoded_token[1]['alg']).to eql('HS256')
+ end
+ end
+
+ describe '.decode' do
+ let(:leeway) { described_class::IAT_LEEWAY }
+ let(:decoded_token) { described_class.decode(encoded_token, secret, leeway: leeway) }
+
+ context 'with an invalid token' do
+ context 'that is junk' do
+ let(:encoded_token) { 'junk' }
+
+ it "raises exception saying 'Not enough or too many segments'" do
+ expect { decoded_token }.to raise_error(JWT::DecodeError, 'Not enough or too many segments')
+ end
+ end
+
+ context 'that has been fiddled with' do
+ let(:encoded_token) do
+ described_class.new(secret).encoded.tap { |token| token[0] = 'E' }
+ end
+
+ it "raises exception saying 'Invalid segment encoding'" do
+ expect { decoded_token }.to raise_error(JWT::DecodeError, 'Invalid segment encoding')
+ end
+ end
+
+ context 'that was generated using a different secret' do
+ let(:encoded_token) { described_class.new('some other secret').encoded }
+
+ it "raises exception saying 'Signature verification raised" do
+ expect { decoded_token }.to raise_error(JWT::VerificationError, 'Signature verification raised')
+ end
+ end
+
+ context 'that is expired' do
+ # Needs the ! so Timecop.freeze() is effective
+ let!(:encoded_token) { described_class.new(secret).encoded }
+
+ it "raises exception saying 'Signature has expired'" do
+ # Needs to be 120 seconds, because the default expiry is 60 seconds
+ # with an additional 60 second leeway.
+ Timecop.freeze(Time.now + 120) do
+ expect { decoded_token }.to raise_error(JWT::ExpiredSignature, 'Signature has expired')
+ end
+ end
+ end
+ end
+
+ context 'with a valid token' do
+ let(:encoded_token) do
+ hmac_token = described_class.new(secret)
+ hmac_token.expire_time = Time.now + expire_time
+ hmac_token.encoded
+ end
+
+ context 'that has expired' do
+ let(:expire_time) { 0 }
+
+ context 'with the default leeway' do
+ Timecop.freeze(Time.now + 1) do
+ it_behaves_like 'a valid, non-expired token'
+ end
+ end
+
+ context 'with a leeway of 0 seconds' do
+ let(:leeway) { 0 }
+
+ it "raises exception saying 'Signature has expired'" do
+ Timecop.freeze(Time.now + 1) do
+ expect { decoded_token }.to raise_error(JWT::ExpiredSignature, 'Signature has expired')
+ end
+ end
+ end
+ end
+
+ context 'that has not expired' do
+ let(:expire_time) { described_class::DEFAULT_EXPIRE_TIME }
+
+ it_behaves_like 'a valid, non-expired token'
+ end
+ end
+ end
+
+ describe '#encoded' do
+ let(:decoded_token) { described_class.decode(encoded_token, secret) }
+
+ context 'without data' do
+ let(:encoded_token) { described_class.new(secret).encoded }
+
+ it_behaves_like 'a valid, non-expired token'
+ end
+
+ context 'with data' do
+ let(:data) { { secret_key: 'secret value' }.to_json }
+ let(:encoded_token) do
+ ec = described_class.new(secret)
+ ec[:data] = data
+ ec.encoded
+ end
+
+ it_behaves_like 'a valid, non-expired token'
+
+ it "contains the 'data' key in the first Array element Hash" do
+ expect(decoded_token[0]).to have_key('data')
+ end
+
+ it 'can re-read back the data' do
+ expect(decoded_token[0]['data']).to eql(data)
+ end
+ end
+ end
+end
diff --git a/spec/lib/mattermost/session_spec.rb b/spec/lib/mattermost/session_spec.rb
index b7687d48c68..f18f97a9c6a 100644
--- a/spec/lib/mattermost/session_spec.rb
+++ b/spec/lib/mattermost/session_spec.rb
@@ -82,7 +82,7 @@ describe Mattermost::Session, type: :request do
.to_return(headers: { Authorization: 'token thisworksnow' }, status: 200)
end
- it 'can setup a session' do
+ it 'can set up a session' do
subject.with_session do |session|
end
@@ -106,7 +106,7 @@ describe Mattermost::Session, type: :request do
expect_to_obtain_exclusive_lease(lease_key, 'uuid')
expect_to_cancel_exclusive_lease(lease_key, 'uuid')
- # Cannot setup a session, but we should still cancel the lease
+ # Cannot set up a session, but we should still cancel the lease
expect { subject.with_session }.to raise_error(Mattermost::NoSessionError)
end
diff --git a/spec/lib/microsoft_teams/notifier_spec.rb b/spec/lib/microsoft_teams/notifier_spec.rb
index c9756544bd6..2aaa7c24ad8 100644
--- a/spec/lib/microsoft_teams/notifier_spec.rb
+++ b/spec/lib/microsoft_teams/notifier_spec.rb
@@ -48,7 +48,7 @@ describe MicrosoftTeams::Notifier do
stub_request(:post, webhook_url).with(body: JSON(body), headers: { 'Content-Type' => 'application/json' }).to_return(status: 200, body: "", headers: {})
end
- it 'expects to receive successfull answer' do
+ it 'expects to receive successful answer' do
expect(subject.ping(options)).to be true
end
end
diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb
index e0569218d78..1024e1a25ea 100644
--- a/spec/lib/object_storage/direct_upload_spec.rb
+++ b/spec/lib/object_storage/direct_upload_spec.rb
@@ -61,6 +61,8 @@ describe ObjectStorage::DirectUpload do
expect(subject[:GetURL]).to start_with(storage_url)
expect(subject[:StoreURL]).to start_with(storage_url)
expect(subject[:DeleteURL]).to start_with(storage_url)
+ expect(subject[:CustomPutHeaders]).to be_truthy
+ expect(subject[:PutHeaders]).to eq({})
end
end
@@ -81,6 +83,16 @@ describe ObjectStorage::DirectUpload do
expect(subject[:MultipartUpload][:AbortURL]).to start_with(storage_url)
expect(subject[:MultipartUpload][:AbortURL]).to include('uploadId=myUpload')
end
+
+ it 'uses only strings in query parameters' do
+ expect(direct_upload.send(:connection)).to receive(:signed_url).at_least(:once) do |params|
+ if params[:query]
+ expect(params[:query].keys.all? { |key| key.is_a?(String) }).to be_truthy
+ end
+ end
+
+ subject
+ end
end
shared_examples 'a valid upload without multipart data' do
diff --git a/spec/lib/quality/helm_client_spec.rb b/spec/lib/quality/helm_client_spec.rb
new file mode 100644
index 00000000000..7abb9688d5a
--- /dev/null
+++ b/spec/lib/quality/helm_client_spec.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Quality::HelmClient do
+ let(:namespace) { 'review-apps-ee' }
+ let(:release_name) { 'my-release' }
+ let(:raw_helm_list_page1) do
+ <<~OUTPUT
+ {"Next":"review-6709-group-t40qbv",
+ "Releases":[
+ {"Name":"review-qa-60-reor-1mugd1", "Revision":1,"Updated":"Thu Oct 4 17:52:31 2018","Status":"FAILED", "Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-7846-fix-s-261vd6","Revision":1,"Updated":"Thu Oct 4 17:33:29 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-7867-snowp-lzo3iy","Revision":1,"Updated":"Thu Oct 4 17:22:14 2018","Status":"DEPLOYED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-rename-geo-o4a780","Revision":1,"Updated":"Thu Oct 4 17:14:57 2018","Status":"DEPLOYED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-5781-opera-0k93fx","Revision":1,"Updated":"Thu Oct 4 17:06:15 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-6709-group-2pzeec","Revision":1,"Updated":"Thu Oct 4 16:36:59 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-ce-to-ee-2-l554mn","Revision":1,"Updated":"Thu Oct 4 16:27:02 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-epics-e2e-m690eb","Revision":1,"Updated":"Thu Oct 4 16:08:26 2018","Status":"DEPLOYED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-7126-admin-06fae2","Revision":1,"Updated":"Thu Oct 4 15:56:35 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"},
+ {"Name":"review-6983-promo-xyou11","Revision":1,"Updated":"Thu Oct 4 15:15:34 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"}
+ ]}
+ OUTPUT
+ end
+ let(:raw_helm_list_page2) do
+ <<~OUTPUT
+ {"Releases":[
+ {"Name":"review-6709-group-t40qbv","Revision":1,"Updated":"Thu Oct 4 17:52:31 2018","Status":"FAILED","Chart":"gitlab-1.1.3","AppVersion":"master","Namespace":"#{namespace}"}
+ ]}
+ OUTPUT
+ end
+
+ subject { described_class.new(namespace: namespace) }
+
+ describe '#releases' do
+ it 'raises an error if the Helm command fails' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json)])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: false)))
+
+ expect { subject.releases.to_a }.to raise_error(described_class::CommandFailedError)
+ end
+
+ it 'calls helm list with default arguments' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json)])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: true)))
+
+ subject.releases.to_a
+ end
+
+ it 'calls helm list with extra arguments' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json --deployed)])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: true)))
+
+ subject.releases(args: ['--deployed']).to_a
+ end
+
+ it 'returns a list of Release objects' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json --deployed)])
+ .and_return(Gitlab::Popen::Result.new([], raw_helm_list_page2, '', double(success?: true)))
+
+ releases = subject.releases(args: ['--deployed']).to_a
+
+ expect(releases.size).to eq(1)
+ expect(releases[0]).to have_attributes(
+ name: 'review-6709-group-t40qbv',
+ revision: 1,
+ last_update: Time.parse('Thu Oct 4 17:52:31 2018'),
+ status: 'FAILED',
+ chart: 'gitlab-1.1.3',
+ app_version: 'master',
+ namespace: namespace
+ )
+ end
+
+ it 'automatically paginates releases' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail).ordered
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json)])
+ .and_return(Gitlab::Popen::Result.new([], raw_helm_list_page1, '', double(success?: true)))
+ expect(Gitlab::Popen).to receive(:popen_with_detail).ordered
+ .with([%(helm list --namespace "#{namespace}" --tiller-namespace "#{namespace}" --output json --offset review-6709-group-t40qbv)])
+ .and_return(Gitlab::Popen::Result.new([], raw_helm_list_page2, '', double(success?: true)))
+
+ releases = subject.releases.to_a
+
+ expect(releases.size).to eq(11)
+ expect(releases.last.name).to eq('review-6709-group-t40qbv')
+ end
+ end
+
+ describe '#delete' do
+ it 'raises an error if the Helm command fails' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm delete --tiller-namespace "#{namespace}" --purge #{release_name})])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: false)))
+
+ expect { subject.delete(release_name: release_name) }.to raise_error(described_class::CommandFailedError)
+ end
+
+ it 'calls helm delete with default arguments' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(helm delete --tiller-namespace "#{namespace}" --purge #{release_name})])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: true)))
+
+ expect(subject.delete(release_name: release_name)).to eq('')
+ end
+ end
+end
diff --git a/spec/lib/quality/kubernetes_client_spec.rb b/spec/lib/quality/kubernetes_client_spec.rb
new file mode 100644
index 00000000000..f35d9464d48
--- /dev/null
+++ b/spec/lib/quality/kubernetes_client_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Quality::KubernetesClient do
+ let(:namespace) { 'review-apps-ee' }
+ let(:release_name) { 'my-release' }
+
+ subject { described_class.new(namespace: namespace) }
+
+ describe '#cleanup' do
+ it 'raises an error if the Kubernetes command fails' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(kubectl --namespace "#{namespace}" delete ) \
+ 'ingress,svc,pdb,hpa,deploy,statefulset,job,pod,secret,configmap,pvc,secret,clusterrole,clusterrolebinding,role,rolebinding,sa ' \
+ "--now -l release=\"#{release_name}\""])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: false)))
+
+ expect { subject.cleanup(release_name: release_name) }.to raise_error(described_class::CommandFailedError)
+ end
+
+ it 'calls kubectl with the correct arguments' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with([%(kubectl --namespace "#{namespace}" delete ) \
+ 'ingress,svc,pdb,hpa,deploy,statefulset,job,pod,secret,configmap,pvc,secret,clusterrole,clusterrolebinding,role,rolebinding,sa ' \
+ "--now -l release=\"#{release_name}\""])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: true)))
+
+ # We're not verifying the output here, just silencing it
+ expect { subject.cleanup(release_name: release_name) }.to output.to_stdout
+ end
+ end
+end
diff --git a/spec/lib/system_check/simple_executor_spec.rb b/spec/lib/system_check/simple_executor_spec.rb
index 9da3648400e..e71e9da369d 100644
--- a/spec/lib/system_check/simple_executor_spec.rb
+++ b/spec/lib/system_check/simple_executor_spec.rb
@@ -98,15 +98,6 @@ describe SystemCheck::SimpleExecutor do
end
end
- before do
- @rainbow = Rainbow.enabled
- Rainbow.enabled = false
- end
-
- after do
- Rainbow.enabled = @rainbow
- end
-
describe '#component' do
it 'returns stored component name' do
expect(subject.component).to eq('Test')
diff --git a/spec/mailers/emails/auto_devops_spec.rb b/spec/mailers/emails/auto_devops_spec.rb
new file mode 100644
index 00000000000..839caf3f50e
--- /dev/null
+++ b/spec/mailers/emails/auto_devops_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Emails::AutoDevops do
+ include EmailSpec::Matchers
+
+ describe '#auto_devops_disabled_email' do
+ let(:owner) { create(:user) }
+ let(:namespace) { create(:namespace, owner: owner) }
+ let(:project) { create(:project, :repository, :auto_devops) }
+ let(:pipeline) { create(:ci_pipeline, :failed, project: project) }
+
+ subject { Notify.autodevops_disabled_email(pipeline, owner.email) }
+
+ it 'sents email with correct subject' do
+ is_expected.to have_subject("#{project.name} | Auto DevOps pipeline was disabled for #{project.name}")
+ end
+
+ it 'sents an email to the user' do
+ recipient = subject.header[:to].addrs.map(&:address).first
+
+ expect(recipient).to eq(owner.email)
+ end
+
+ it 'is sent as GitLab email' do
+ sender = subject.header[:from].addrs[0].address
+
+ expect(sender).to match(/gitlab/)
+ end
+ end
+end
diff --git a/spec/migrations/add_pages_access_level_to_project_feature_spec.rb b/spec/migrations/add_pages_access_level_to_project_feature_spec.rb
new file mode 100644
index 00000000000..3946602c5be
--- /dev/null
+++ b/spec/migrations/add_pages_access_level_to_project_feature_spec.rb
@@ -0,0 +1,30 @@
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180423204600_add_pages_access_level_to_project_feature.rb')
+
+describe AddPagesAccessLevelToProjectFeature, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:features) { table(:project_features) }
+ let!(:namespace) { namespaces.create(name: 'gitlab', path: 'gitlab') }
+ let!(:first_project) { projects.create(name: 'gitlab1', path: 'gitlab1', namespace_id: namespace.id) }
+ let!(:first_project_features) { features.create(project_id: first_project.id) }
+ let!(:second_project) { projects.create(name: 'gitlab2', path: 'gitlab2', namespace_id: namespace.id) }
+ let!(:second_project_features) { features.create(project_id: second_project.id) }
+
+ it 'correctly migrate pages for old projects to be public' do
+ migrate!
+
+ # For old projects pages should be public
+ expect(first_project_features.reload.pages_access_level).to eq ProjectFeature::PUBLIC
+ expect(second_project_features.reload.pages_access_level).to eq ProjectFeature::PUBLIC
+ end
+
+ it 'after migration pages are enabled as default' do
+ migrate!
+
+ # For new project default is enabled
+ third_project = projects.create(name: 'gitlab3', path: 'gitlab3', namespace_id: namespace.id)
+ third_project_features = features.create(project_id: third_project.id)
+ expect(third_project_features.reload.pages_access_level).to eq ProjectFeature::ENABLED
+ end
+end
diff --git a/spec/migrations/delete_inconsistent_internal_id_records_spec.rb b/spec/migrations/delete_inconsistent_internal_id_records_spec.rb
new file mode 100644
index 00000000000..4af51217031
--- /dev/null
+++ b/spec/migrations/delete_inconsistent_internal_id_records_spec.rb
@@ -0,0 +1,134 @@
+# frozen_string_literal: true
+# rubocop:disable RSpec/FactoriesInMigrationSpecs
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20180723130817_delete_inconsistent_internal_id_records.rb')
+
+describe DeleteInconsistentInternalIdRecords, :migration do
+ let!(:project1) { create(:project) }
+ let!(:project2) { create(:project) }
+ let!(:project3) { create(:project) }
+
+ let(:internal_id_query) { ->(project) { InternalId.where(usage: InternalId.usages[scope.to_s.tableize], project: project) } }
+
+ let(:create_models) do
+ 3.times { create(scope, project: project1) }
+ 3.times { create(scope, project: project2) }
+ 3.times { create(scope, project: project3) }
+ end
+
+ shared_examples_for 'deleting inconsistent internal_id records' do
+ before do
+ create_models
+
+ internal_id_query.call(project1).first.tap do |iid|
+ iid.last_value = iid.last_value - 2
+ # This is an inconsistent record
+ iid.save!
+ end
+
+ internal_id_query.call(project3).first.tap do |iid|
+ iid.last_value = iid.last_value + 2
+ # This is a consistent record
+ iid.save!
+ end
+ end
+
+ it "deletes inconsistent issues" do
+ expect { migrate! }.to change { internal_id_query.call(project1).size }.from(1).to(0)
+ end
+
+ it "retains consistent issues" do
+ expect { migrate! }.not_to change { internal_id_query.call(project2).size }
+ end
+
+ it "retains consistent records, especially those with a greater last_value" do
+ expect { migrate! }.not_to change { internal_id_query.call(project3).size }
+ end
+ end
+
+ context 'for issues' do
+ let(:scope) { :issue }
+ it_behaves_like 'deleting inconsistent internal_id records'
+ end
+
+ context 'for merge_requests' do
+ let(:scope) { :merge_request }
+
+ let(:create_models) do
+ 3.times { |i| create(scope, target_project: project1, source_project: project1, source_branch: i.to_s) }
+ 3.times { |i| create(scope, target_project: project2, source_project: project2, source_branch: i.to_s) }
+ 3.times { |i| create(scope, target_project: project3, source_project: project3, source_branch: i.to_s) }
+ end
+
+ it_behaves_like 'deleting inconsistent internal_id records'
+ end
+
+ context 'for deployments' do
+ let(:scope) { :deployment }
+ let(:deployments) { table(:deployments) }
+ let(:internal_ids) { table(:internal_ids) }
+
+ before do
+ internal_ids.create!(project_id: project1.id, usage: 2, last_value: 2)
+ internal_ids.create!(project_id: project2.id, usage: 2, last_value: 2)
+ internal_ids.create!(project_id: project3.id, usage: 2, last_value: 2)
+ end
+
+ let(:create_models) do
+ 3.times { |i| deployments.create!(project_id: project1.id, iid: i, environment_id: 1, ref: 'master', sha: 'a', tag: false) }
+ 3.times { |i| deployments.create!(project_id: project2.id, iid: i, environment_id: 1, ref: 'master', sha: 'a', tag: false) }
+ 3.times { |i| deployments.create!(project_id: project3.id, iid: i, environment_id: 1, ref: 'master', sha: 'a', tag: false) }
+ end
+
+ it_behaves_like 'deleting inconsistent internal_id records'
+ end
+
+ context 'for milestones (by project)' do
+ let(:scope) { :milestone }
+ it_behaves_like 'deleting inconsistent internal_id records'
+ end
+
+ context 'for ci_pipelines' do
+ let(:scope) { :ci_pipeline }
+ it_behaves_like 'deleting inconsistent internal_id records'
+ end
+
+ context 'for milestones (by group)' do
+ # milestones (by group) is a little different than all of the other models
+ let!(:group1) { create(:group) }
+ let!(:group2) { create(:group) }
+ let!(:group3) { create(:group) }
+
+ let(:internal_id_query) { ->(group) { InternalId.where(usage: InternalId.usages['milestones'], namespace: group) } }
+
+ before do
+ 3.times { create(:milestone, group: group1) }
+ 3.times { create(:milestone, group: group2) }
+ 3.times { create(:milestone, group: group3) }
+
+ internal_id_query.call(group1).first.tap do |iid|
+ iid.last_value = iid.last_value - 2
+ # This is an inconsistent record
+ iid.save!
+ end
+
+ internal_id_query.call(group3).first.tap do |iid|
+ iid.last_value = iid.last_value + 2
+ # This is a consistent record
+ iid.save!
+ end
+ end
+
+ it "deletes inconsistent issues" do
+ expect { migrate! }.to change { internal_id_query.call(group1).size }.from(1).to(0)
+ end
+
+ it "retains consistent issues" do
+ expect { migrate! }.not_to change { internal_id_query.call(group2).size }
+ end
+
+ it "retains consistent records, especially those with a greater last_value" do
+ expect { migrate! }.not_to change { internal_id_query.call(group3).size }
+ end
+ end
+end
diff --git a/spec/migrations/drop_duplicate_protected_tags_spec.rb b/spec/migrations/drop_duplicate_protected_tags_spec.rb
new file mode 100644
index 00000000000..acfb6850722
--- /dev/null
+++ b/spec/migrations/drop_duplicate_protected_tags_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180711103851_drop_duplicate_protected_tags.rb')
+
+describe DropDuplicateProtectedTags, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:protected_tags) { table(:protected_tags) }
+
+ before do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
+
+ namespaces.create(id: 1, name: 'gitlab-org', path: 'gitlab-org')
+ projects.create!(id: 1, namespace_id: 1, name: 'gitlab1', path: 'gitlab1')
+ projects.create!(id: 2, namespace_id: 1, name: 'gitlab2', path: 'gitlab2')
+ end
+
+ it 'removes duplicated protected tags' do
+ protected_tags.create!(id: 1, project_id: 1, name: 'foo')
+ tag2 = protected_tags.create!(id: 2, project_id: 1, name: 'foo1')
+ protected_tags.create!(id: 3, project_id: 1, name: 'foo')
+ tag4 = protected_tags.create!(id: 4, project_id: 1, name: 'foo')
+ tag5 = protected_tags.create!(id: 5, project_id: 2, name: 'foo')
+
+ migrate!
+
+ expect(protected_tags.all.count).to eq 3
+ expect(protected_tags.all.pluck(:id)).to contain_exactly(tag2.id, tag4.id, tag5.id)
+ end
+
+ it 'does not remove unique protected tags' do
+ tag1 = protected_tags.create!(id: 1, project_id: 1, name: 'foo1')
+ tag2 = protected_tags.create!(id: 2, project_id: 1, name: 'foo2')
+ tag3 = protected_tags.create!(id: 3, project_id: 1, name: 'foo3')
+
+ migrate!
+
+ expect(protected_tags.all.count).to eq 3
+ expect(protected_tags.all.pluck(:id)).to contain_exactly(tag1.id, tag2.id, tag3.id)
+ end
+end
diff --git a/spec/migrations/enqueue_redact_links_spec.rb b/spec/migrations/enqueue_redact_links_spec.rb
new file mode 100644
index 00000000000..a5da76977b7
--- /dev/null
+++ b/spec/migrations/enqueue_redact_links_spec.rb
@@ -0,0 +1,42 @@
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20181014121030_enqueue_redact_links.rb')
+
+describe EnqueueRedactLinks, :migration, :sidekiq do
+ let(:merge_requests) { table(:merge_requests) }
+ let(:issues) { table(:issues) }
+ let(:notes) { table(:notes) }
+ let(:projects) { table(:projects) }
+ let(:namespaces) { table(:namespaces) }
+ let(:snippets) { table(:snippets) }
+ let(:users) { table(:users) }
+ let(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 1)
+
+ text = 'some text /sent_notifications/00000000000000000000000000000000/unsubscribe more text'
+ group = namespaces.create!(name: 'gitlab', path: 'gitlab')
+ project = projects.create!(namespace_id: group.id)
+
+ merge_requests.create!(id: 1, target_project_id: project.id, source_project_id: project.id, target_branch: 'feature', source_branch: 'master', description: text)
+ issues.create!(id: 1, description: text)
+ notes.create!(id: 1, note: text)
+ notes.create!(id: 2, note: text)
+ snippets.create!(id: 1, description: text, author_id: user.id)
+ end
+
+ it 'correctly schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ Timecop.freeze do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, "Note", "note", 1, 1)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(10.minutes, "Note", "note", 2, 2)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, "Issue", "description", 1, 1)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, "MergeRequest", "description", 1, 1)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, "Snippet", "description", 1, 1)
+ expect(BackgroundMigrationWorker.jobs.size).to eq 5
+ end
+ end
+ end
+end
diff --git a/spec/migrations/fill_empty_finished_at_in_deployments_spec.rb b/spec/migrations/fill_empty_finished_at_in_deployments_spec.rb
new file mode 100644
index 00000000000..cf5c10f77e1
--- /dev/null
+++ b/spec/migrations/fill_empty_finished_at_in_deployments_spec.rb
@@ -0,0 +1,70 @@
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20181030135124_fill_empty_finished_at_in_deployments')
+
+describe FillEmptyFinishedAtInDeployments, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:environments) { table(:environments) }
+ let(:deployments) { table(:deployments) }
+
+ context 'when a deployment row does not have a value on finished_at' do
+ context 'when a deployment succeeded' do
+ before do
+ namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
+ projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
+ environments.create!(id: 1, name: 'production', slug: 'production', project_id: 1)
+ deployments.create!(id: 1, iid: 1, project_id: 1, environment_id: 1, ref: 'master', sha: 'xxx', tag: false)
+ end
+
+ it 'correctly replicates finished_at by created_at' do
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).to be_nil
+
+ migrate!
+
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).to eq(deployments.last.created_at)
+ end
+ end
+
+ context 'when a deployment is running' do
+ before do
+ namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
+ projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
+ environments.create!(id: 1, name: 'production', slug: 'production', project_id: 1)
+ deployments.create!(id: 1, iid: 1, project_id: 1, environment_id: 1, ref: 'master', sha: 'xxx', tag: false, status: 1)
+ end
+
+ it 'does not fill finished_at' do
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).to be_nil
+
+ migrate!
+
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).to be_nil
+ end
+ end
+ end
+
+ context 'when a deployment row does has a value on finished_at' do
+ let(:finished_at) { '2018-10-30 11:12:02 UTC' }
+
+ before do
+ namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
+ projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
+ environments.create!(id: 1, name: 'production', slug: 'production', project_id: 1)
+ deployments.create!(id: 1, iid: 1, project_id: 1, environment_id: 1, ref: 'master', sha: 'xxx', tag: false, finished_at: finished_at)
+ end
+
+ it 'does not affect existing value' do
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).not_to be_nil
+
+ migrate!
+
+ expect(deployments.last.created_at).not_to be_nil
+ expect(deployments.last.finished_at).to eq(finished_at)
+ end
+ end
+end
diff --git a/spec/migrations/import_common_metrics_spec.rb b/spec/migrations/import_common_metrics_spec.rb
new file mode 100644
index 00000000000..1001629007c
--- /dev/null
+++ b/spec/migrations/import_common_metrics_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180831164910_import_common_metrics.rb')
+
+describe ImportCommonMetrics, :migration do
+ describe '#up' do
+ it "imports all prometheus metrics" do
+ expect(PrometheusMetric.common).to be_empty
+
+ migrate!
+
+ expect(PrometheusMetric.common).not_to be_empty
+ end
+ end
+end
diff --git a/spec/migrations/migrate_legacy_artifacts_to_job_artifacts_spec.rb b/spec/migrations/migrate_legacy_artifacts_to_job_artifacts_spec.rb
new file mode 100644
index 00000000000..df82672f254
--- /dev/null
+++ b/spec/migrations/migrate_legacy_artifacts_to_job_artifacts_spec.rb
@@ -0,0 +1,73 @@
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20180816161409_migrate_legacy_artifacts_to_job_artifacts.rb')
+
+describe MigrateLegacyArtifactsToJobArtifacts, :migration, :sidekiq do
+ let(:migration_class) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts }
+ let(:migration_name) { migration_class.to_s.demodulize }
+
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:pipelines) { table(:ci_pipelines) }
+ let(:jobs) { table(:ci_builds) }
+ let(:job_artifacts) { table(:ci_job_artifacts) }
+ let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
+ let(:project) { projects.create!(name: 'gitlab', path: 'gitlab-ce', namespace_id: namespace.id) }
+ let(:pipeline) { pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a') }
+ let(:archive_file_type) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::ARCHIVE_FILE_TYPE }
+ let(:metadata_file_type) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::METADATA_FILE_TYPE }
+ let(:local_store) { ::ObjectStorage::Store::LOCAL }
+ let(:remote_store) { ::ObjectStorage::Store::REMOTE }
+ let(:legacy_location) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::LEGACY_PATH_FILE_LOCATION }
+
+ context 'when legacy artifacts exist' do
+ before do
+ jobs.create!(id: 1, commit_id: pipeline.id, project_id: project.id, status: :success, artifacts_file: 'archive.zip')
+ jobs.create!(id: 2, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_metadata: 'metadata.gz')
+ jobs.create!(id: 3, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_file: 'archive.zip', artifacts_metadata: 'metadata.gz')
+ jobs.create!(id: 4, commit_id: pipeline.id, project_id: project.id, status: :running)
+ jobs.create!(id: 5, commit_id: pipeline.id, project_id: project.id, status: :success, artifacts_file: 'archive.zip', artifacts_file_store: remote_store, artifacts_metadata: 'metadata.gz')
+ jobs.create!(id: 6, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_file: 'archive.zip', artifacts_metadata: 'metadata.gz')
+ end
+
+ it 'schedules a background migration' do
+ Sidekiq::Testing.fake! do
+ Timecop.freeze do
+ migrate!
+
+ expect(migration_name).to be_scheduled_delayed_migration(5.minutes, 1, 6)
+ expect(BackgroundMigrationWorker.jobs.size).to eq 1
+ end
+ end
+ end
+
+ it 'migrates legacy artifacts to ci_job_artifacts table' do
+ migrate!
+
+ expect(job_artifacts.order(:job_id, :file_type).pluck('project_id, job_id, file_type, file_store, size, expire_at, file, file_sha256, file_location'))
+ .to eq([[project.id, 1, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
+ [project.id, 3, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
+ [project.id, 3, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location],
+ [project.id, 5, archive_file_type, remote_store, nil, nil, 'archive.zip', nil, legacy_location],
+ [project.id, 5, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location],
+ [project.id, 6, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
+ [project.id, 6, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location]])
+ end
+ end
+
+ context 'when legacy artifacts do not exist' do
+ before do
+ jobs.create!(id: 1, commit_id: pipeline.id, project_id: project.id, status: :success)
+ jobs.create!(id: 2, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_metadata: 'metadata.gz')
+ end
+
+ it 'does not schedule background migrations' do
+ Sidekiq::Testing.fake! do
+ Timecop.freeze do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq 0
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/migrate_null_wiki_access_levels_spec.rb b/spec/migrations/migrate_null_wiki_access_levels_spec.rb
new file mode 100644
index 00000000000..f99273072a2
--- /dev/null
+++ b/spec/migrations/migrate_null_wiki_access_levels_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20180809195358_migrate_null_wiki_access_levels.rb')
+
+describe MigrateNullWikiAccessLevels, :migration do
+ let(:namespaces) { table('namespaces') }
+ let(:projects) { table(:projects) }
+ let(:project_features) { table(:project_features) }
+ let(:migration) { described_class.new }
+
+ before do
+ namespace = namespaces.create(name: 'foo', path: 'foo')
+
+ projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1', namespace_id: namespace.id)
+ projects.create!(id: 2, name: 'gitlab2', path: 'gitlab2', namespace_id: namespace.id)
+ projects.create!(id: 3, name: 'gitlab3', path: 'gitlab3', namespace_id: namespace.id)
+
+ project_features.create!(id: 1, project_id: 1, wiki_access_level: nil)
+ project_features.create!(id: 2, project_id: 2, wiki_access_level: 10)
+ project_features.create!(id: 3, project_id: 3, wiki_access_level: 20)
+ end
+
+ describe '#up' do
+ it 'migrates existing project_features with wiki_access_level NULL to 20' do
+ expect { migration.up }.to change { project_features.where(wiki_access_level: 20).count }.by(1)
+ end
+ end
+end
diff --git a/spec/migrations/migrate_old_artifacts_spec.rb b/spec/migrations/migrate_old_artifacts_spec.rb
index 4187ab149a5..af77d64fdbf 100644
--- a/spec/migrations/migrate_old_artifacts_spec.rb
+++ b/spec/migrations/migrate_old_artifacts_spec.rb
@@ -76,7 +76,7 @@ describe MigrateOldArtifacts do
end
end
- context 'when there are aritfacts in old and new directory' do
+ context 'when there are artifacts in old and new directory' do
before do
store_artifacts_in_legacy_path(build2)
diff --git a/spec/migrations/remove_orphaned_label_links_spec.rb b/spec/migrations/remove_orphaned_label_links_spec.rb
new file mode 100644
index 00000000000..13b8919343e
--- /dev/null
+++ b/spec/migrations/remove_orphaned_label_links_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20180906051323_remove_orphaned_label_links.rb')
+
+describe RemoveOrphanedLabelLinks, :migration do
+ let(:label_links) { table(:label_links) }
+ let(:labels) { table(:labels) }
+
+ let(:project) { create(:project) } # rubocop:disable RSpec/FactoriesInMigrationSpecs
+ let(:label) { create_label }
+
+ context 'add foreign key on label_id' do
+ let!(:label_link_with_label) { create_label_link(label_id: label.id) }
+ let!(:label_link_without_label) { create_label_link(label_id: nil) }
+
+ it 'removes orphaned labels without corresponding label' do
+ expect { migrate! }.to change { LabelLink.count }.from(2).to(1)
+ end
+
+ it 'does not remove entries with valid label_id' do
+ expect { migrate! }.not_to change { label_link_with_label.reload }
+ end
+ end
+
+ def create_label(**opts)
+ labels.create!(
+ project_id: project.id,
+ **opts
+ )
+ end
+
+ def create_label_link(**opts)
+ label_links.create!(
+ target_id: 1,
+ target_type: 'Issue',
+ **opts
+ )
+ end
+end
diff --git a/spec/migrations/rename_more_reserved_project_names_spec.rb b/spec/migrations/rename_more_reserved_project_names_spec.rb
index 034e8a6a4e5..baf16c2ce53 100644
--- a/spec/migrations/rename_more_reserved_project_names_spec.rb
+++ b/spec/migrations/rename_more_reserved_project_names_spec.rb
@@ -31,7 +31,16 @@ describe RenameMoreReservedProjectNames, :delete do
context 'when exception is raised during rename' do
before do
- allow(project).to receive(:rename_repo).and_raise(StandardError)
+ service = instance_double('service')
+
+ allow(service)
+ .to receive(:execute)
+ .and_raise(Projects::AfterRenameService::RenameFailedError)
+
+ allow(Projects::AfterRenameService)
+ .to receive(:new)
+ .with(project)
+ .and_return(service)
end
it 'captures exception from project rename' do
diff --git a/spec/migrations/rename_reserved_project_names_spec.rb b/spec/migrations/rename_reserved_project_names_spec.rb
index 592ac2b5fb9..7818aa0d560 100644
--- a/spec/migrations/rename_reserved_project_names_spec.rb
+++ b/spec/migrations/rename_reserved_project_names_spec.rb
@@ -35,7 +35,16 @@ describe RenameReservedProjectNames, :migration, schema: :latest do
context 'when exception is raised during rename' do
before do
- allow(project).to receive(:rename_repo).and_raise(StandardError)
+ service = instance_double('service')
+
+ allow(service)
+ .to receive(:execute)
+ .and_raise(Projects::AfterRenameService::RenameFailedError)
+
+ allow(Projects::AfterRenameService)
+ .to receive(:new)
+ .with(project)
+ .and_return(service)
end
it 'captures exception from project rename' do
diff --git a/spec/migrations/schedule_create_gpg_key_subkeys_from_gpg_keys_spec.rb b/spec/migrations/schedule_create_gpg_key_subkeys_from_gpg_keys_spec.rb
index 96bef107599..c4427910518 100644
--- a/spec/migrations/schedule_create_gpg_key_subkeys_from_gpg_keys_spec.rb
+++ b/spec/migrations/schedule_create_gpg_key_subkeys_from_gpg_keys_spec.rb
@@ -6,7 +6,7 @@ describe ScheduleCreateGpgKeySubkeysFromGpgKeys, :migration, :sidekiq do
create(:gpg_key, id: 1, key: GpgHelpers::User1.public_key) # rubocop:disable RSpec/FactoriesInMigrationSpecs
create(:gpg_key, id: 2, key: GpgHelpers::User3.public_key) # rubocop:disable RSpec/FactoriesInMigrationSpecs
# Delete all subkeys so they can be recreated
- GpgKeySubkey.destroy_all
+ GpgKeySubkey.destroy_all # rubocop: disable DestroyAll
end
it 'correctly schedules background migrations' do
diff --git a/spec/migrations/schedule_digest_personal_access_tokens_spec.rb b/spec/migrations/schedule_digest_personal_access_tokens_spec.rb
new file mode 100644
index 00000000000..6d155f78342
--- /dev/null
+++ b/spec/migrations/schedule_digest_personal_access_tokens_spec.rb
@@ -0,0 +1,46 @@
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20180913142237_schedule_digest_personal_access_tokens.rb')
+
+describe ScheduleDigestPersonalAccessTokens, :migration, :sidekiq do
+ let(:personal_access_tokens) { table(:personal_access_tokens) }
+ let(:users) { table(:users) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 4)
+
+ users.create(id: 1, email: 'user@example.com', projects_limit: 10)
+
+ personal_access_tokens.create!(id: 1, user_id: 1, name: 'pat-01', token: 'token-01')
+ personal_access_tokens.create!(id: 2, user_id: 1, name: 'pat-02', token: 'token-02')
+ personal_access_tokens.create!(id: 3, user_id: 1, name: 'pat-03', token_digest: 'token_digest')
+ personal_access_tokens.create!(id: 4, user_id: 1, name: 'pat-04', token: 'token-04')
+ personal_access_tokens.create!(id: 5, user_id: 1, name: 'pat-05', token: 'token-05')
+ personal_access_tokens.create!(id: 6, user_id: 1, name: 'pat-06', token: 'token-06')
+ end
+
+ it 'correctly schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ migrate!
+
+ expect(described_class::MIGRATION).to(
+ be_scheduled_delayed_migration(
+ 5.minutes, 'PersonalAccessToken', 'token', 'token_digest', 1, 5))
+ expect(described_class::MIGRATION).to(
+ be_scheduled_delayed_migration(
+ 10.minutes, 'PersonalAccessToken', 'token', 'token_digest', 6, 6))
+ expect(BackgroundMigrationWorker.jobs.size).to eq 2
+ end
+ end
+
+ it 'schedules background migrations' do
+ perform_enqueued_jobs do
+ plain_text_token = 'token IS NOT NULL'
+
+ expect(personal_access_tokens.where(plain_text_token).count).to eq 5
+
+ migrate!
+
+ expect(personal_access_tokens.where(plain_text_token).count).to eq 0
+ end
+ end
+end
diff --git a/spec/migrations/steal_fill_store_upload_spec.rb b/spec/migrations/steal_fill_store_upload_spec.rb
new file mode 100644
index 00000000000..ed809baf2b5
--- /dev/null
+++ b/spec/migrations/steal_fill_store_upload_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20181105201455_steal_fill_store_upload.rb')
+
+describe StealFillStoreUpload, :migration do
+ let(:uploads) { table(:uploads) }
+
+ describe '#up' do
+ it 'steals the FillStoreUpload background migration' do
+ expect(Gitlab::BackgroundMigration).to receive(:steal).with('FillStoreUpload').and_call_original
+
+ migrate!
+ end
+
+ it 'does not run migration if not needed' do
+ uploads.create(size: 100.kilobytes,
+ uploader: 'AvatarUploader',
+ path: 'uploads/-/system/avatar.jpg',
+ store: 1)
+
+ expect_any_instance_of(Gitlab::BackgroundMigration::FillStoreUpload).not_to receive(:perform)
+
+ migrate!
+ end
+
+ it 'ensures all rows are migrated' do
+ uploads.create(size: 100.kilobytes,
+ uploader: 'AvatarUploader',
+ path: 'uploads/-/system/avatar.jpg',
+ store: nil)
+
+ expect_any_instance_of(Gitlab::BackgroundMigration::FillStoreUpload).to receive(:perform).and_call_original
+
+ expect do
+ migrate!
+ end.to change { uploads.where(store: nil).count }.from(1).to(0)
+ end
+ end
+end
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 02f74e2ea54..96aa9a82b71 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -25,6 +25,9 @@ describe ApplicationSetting do
it { is_expected.to allow_value(https).for(:after_sign_out_path) }
it { is_expected.not_to allow_value(ftp).for(:after_sign_out_path) }
+ it { is_expected.to allow_value("dev.gitlab.com").for(:commit_email_hostname) }
+ it { is_expected.not_to allow_value("@dev.gitlab").for(:commit_email_hostname) }
+
describe 'default_artifacts_expire_in' do
it 'sets an error if it cannot parse' do
setting.update(default_artifacts_expire_in: 'a')
@@ -107,6 +110,14 @@ describe ApplicationSetting do
it { expect(setting.repository_storages).to eq(['default']) }
end
+ context '#commit_email_hostname' do
+ it 'returns configured gitlab hostname if commit_email_hostname is not defined' do
+ setting.update(commit_email_hostname: nil)
+
+ expect(setting.commit_email_hostname).to eq("users.noreply.#{Gitlab.config.gitlab.host}")
+ end
+ end
+
context 'auto_devops_domain setting' do
context 'when auto_devops_enabled? is true' do
before do
@@ -141,19 +152,6 @@ describe ApplicationSetting do
end
end
- context 'circuitbreaker settings' do
- [:circuitbreaker_failure_count_threshold,
- :circuitbreaker_check_interval,
- :circuitbreaker_failure_reset_time,
- :circuitbreaker_storage_timeout].each do |field|
- it "Validates #{field} as number" do
- is_expected.to validate_numericality_of(field)
- .only_integer
- .is_greater_than_or_equal_to(0)
- end
- end
- end
-
context 'repository storages' do
before do
storages = {
@@ -305,6 +303,36 @@ describe ApplicationSetting do
end
end
+ describe 'setting Sentry DSNs' do
+ context 'server DSN' do
+ it 'strips leading and trailing whitespace' do
+ subject.update(sentry_dsn: ' http://test ')
+
+ expect(subject.sentry_dsn).to eq('http://test')
+ end
+
+ it 'handles nil values' do
+ subject.update(sentry_dsn: nil)
+
+ expect(subject.sentry_dsn).to be_nil
+ end
+ end
+
+ context 'client-side DSN' do
+ it 'strips leading and trailing whitespace' do
+ subject.update(clientside_sentry_dsn: ' http://test ')
+
+ expect(subject.clientside_sentry_dsn).to eq('http://test')
+ end
+
+ it 'handles nil values' do
+ subject.update(clientside_sentry_dsn: nil)
+
+ expect(subject.clientside_sentry_dsn).to be_nil
+ end
+ end
+ end
+
describe '#disabled_oauth_sign_in_sources=' do
before do
allow(Devise).to receive(:omniauth_providers).and_return([:github])
@@ -538,4 +566,63 @@ describe ApplicationSetting do
expect(setting.allow_signup?).to be_falsey
end
end
+
+ describe '#user_default_internal_regex_enabled?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:user_default_external, :user_default_internal_regex, :result) do
+ false | nil | false
+ false | '' | false
+ false | '^(?:(?!\.ext@).)*$\r?\n?' | false
+ true | '' | false
+ true | nil | false
+ true | '^(?:(?!\.ext@).)*$\r?\n?' | true
+ end
+
+ with_them do
+ before do
+ setting.update(user_default_external: user_default_external)
+ setting.update(user_default_internal_regex: user_default_internal_regex)
+ end
+
+ subject { setting.user_default_internal_regex_enabled? }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ context 'diff limit settings' do
+ describe '#diff_max_patch_bytes' do
+ context 'validations' do
+ it { is_expected.to validate_presence_of(:diff_max_patch_bytes) }
+
+ it do
+ is_expected.to validate_numericality_of(:diff_max_patch_bytes)
+ .only_integer
+ .is_greater_than_or_equal_to(Gitlab::Git::Diff::DEFAULT_MAX_PATCH_BYTES)
+ .is_less_than_or_equal_to(Gitlab::Git::Diff::MAX_PATCH_BYTES_UPPER_BOUND)
+ end
+ end
+ end
+ end
+
+ describe '#archive_builds_older_than' do
+ subject { setting.archive_builds_older_than }
+
+ context 'when the archive_builds_in_seconds is set' do
+ before do
+ setting.archive_builds_in_seconds = 3600
+ end
+
+ it { is_expected.to be_within(1.minute).of(1.hour.ago) }
+ end
+
+ context 'when the archive_builds_in_seconds is set' do
+ before do
+ setting.archive_builds_in_seconds = nil
+ end
+
+ it { is_expected.to be_nil }
+ end
+ end
end
diff --git a/spec/models/award_emoji_spec.rb b/spec/models/award_emoji_spec.rb
index b909e04dfc3..3f52091698c 100644
--- a/spec/models/award_emoji_spec.rb
+++ b/spec/models/award_emoji_spec.rb
@@ -77,4 +77,27 @@ describe AwardEmoji do
end
end
end
+
+ describe '.award_counts_for_user' do
+ let(:user) { create(:user) }
+
+ before do
+ create(:award_emoji, user: user, name: 'thumbsup')
+ create(:award_emoji, user: user, name: 'thumbsup')
+ create(:award_emoji, user: user, name: 'thumbsdown')
+ create(:award_emoji, user: user, name: '+1')
+ end
+
+ it 'returns the awarded emoji in descending order' do
+ awards = described_class.award_counts_for_user(user)
+
+ expect(awards).to eq('thumbsup' => 2, 'thumbsdown' => 1, '+1' => 1)
+ end
+
+ it 'limits the returned number of rows' do
+ awards = described_class.award_counts_for_user(user, 1)
+
+ expect(awards).to eq('thumbsup' => 2)
+ end
+ end
end
diff --git a/spec/models/blob_viewer/gitlab_ci_yml_spec.rb b/spec/models/blob_viewer/gitlab_ci_yml_spec.rb
index bed364a8c14..01c555a7a90 100644
--- a/spec/models/blob_viewer/gitlab_ci_yml_spec.rb
+++ b/spec/models/blob_viewer/gitlab_ci_yml_spec.rb
@@ -2,22 +2,24 @@ require 'spec_helper'
describe BlobViewer::GitlabCiYml do
include FakeBlobHelpers
+ include RepoHelpers
- let(:project) { build_stubbed(:project) }
+ let(:project) { create(:project, :repository) }
let(:data) { File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) }
let(:blob) { fake_blob(path: '.gitlab-ci.yml', data: data) }
+ let(:sha) { sample_commit.id }
subject { described_class.new(blob) }
describe '#validation_message' do
it 'calls prepare! on the viewer' do
expect(subject).to receive(:prepare!)
- subject.validation_message
+ subject.validation_message(project, sha)
end
context 'when the configuration is valid' do
it 'returns nil' do
- expect(subject.validation_message).to be_nil
+ expect(subject.validation_message(project, sha)).to be_nil
end
end
@@ -25,7 +27,7 @@ describe BlobViewer::GitlabCiYml do
let(:data) { 'oof' }
it 'returns the error message' do
- expect(subject.validation_message).to eq('Invalid configuration format')
+ expect(subject.validation_message(project, sha)).to eq('Invalid configuration format')
end
end
end
diff --git a/spec/models/blob_viewer/package_json_spec.rb b/spec/models/blob_viewer/package_json_spec.rb
index 5ed2f4400bc..fbaa8d47a71 100644
--- a/spec/models/blob_viewer/package_json_spec.rb
+++ b/spec/models/blob_viewer/package_json_spec.rb
@@ -40,13 +40,14 @@ describe BlobViewer::PackageJson do
end
context 'when package.json has "private": true' do
+ let(:homepage) { 'http://example.com' }
let(:data) do
<<-SPEC.strip_heredoc
{
"name": "module-name",
"version": "10.3.1",
"private": true,
- "homepage": "myawesomepackage.com"
+ "homepage": #{homepage.to_json}
}
SPEC
end
@@ -54,10 +55,22 @@ describe BlobViewer::PackageJson do
subject { described_class.new(blob) }
describe '#package_url' do
- it 'returns homepage if any' do
- expect(subject).to receive(:prepare!)
+ context 'when the homepage has a valid URL' do
+ it 'returns homepage URL' do
+ expect(subject).to receive(:prepare!)
+
+ expect(subject.package_url).to eq(homepage)
+ end
+ end
+
+ context 'when the homepage has an invalid URL' do
+ let(:homepage) { 'javascript:alert()' }
+
+ it 'returns nil' do
+ expect(subject).to receive(:prepare!)
- expect(subject.package_url).to eq('myawesomepackage.com')
+ expect(subject.package_url).to be_nil
+ end
end
end
diff --git a/spec/models/board_group_recent_visit_spec.rb b/spec/models/board_group_recent_visit_spec.rb
new file mode 100644
index 00000000000..59ad4e5417e
--- /dev/null
+++ b/spec/models/board_group_recent_visit_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe BoardGroupRecentVisit do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:board) { create(:board, group: group) }
+
+ describe 'relationships' do
+ it { is_expected.to belong_to(:user) }
+ it { is_expected.to belong_to(:group) }
+ it { is_expected.to belong_to(:board) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:user) }
+ it { is_expected.to validate_presence_of(:group) }
+ it { is_expected.to validate_presence_of(:board) }
+ end
+
+ describe '#visited' do
+ it 'creates a visit if one does not exists' do
+ expect { described_class.visited!(user, board) }.to change(described_class, :count).by(1)
+ end
+
+ shared_examples 'was visited previously' do
+ let!(:visit) { create :board_group_recent_visit, group: board.group, board: board, user: user, updated_at: 7.days.ago }
+
+ it 'updates the timestamp' do
+ Timecop.freeze do
+ described_class.visited!(user, board)
+
+ expect(described_class.count).to eq 1
+ expect(described_class.first.updated_at).to be_like_time(Time.zone.now)
+ end
+ end
+ end
+
+ it_behaves_like 'was visited previously'
+
+ context 'when we try to create a visit that is not unique' do
+ before do
+ expect(described_class).to receive(:find_or_create_by).and_raise(ActiveRecord::RecordNotUnique, 'record not unique')
+ expect(described_class).to receive(:find_or_create_by).and_return(visit)
+ end
+
+ it_behaves_like 'was visited previously'
+ end
+ end
+
+ describe '#latest' do
+ it 'returns the most recent visited' do
+ board2 = create(:board, group: group)
+ board3 = create(:board, group: group)
+
+ create :board_group_recent_visit, group: board.group, board: board, user: user, updated_at: 7.days.ago
+ create :board_group_recent_visit, group: board2.group, board: board2, user: user, updated_at: 5.days.ago
+ recent = create :board_group_recent_visit, group: board3.group, board: board3, user: user, updated_at: 1.day.ago
+
+ expect(described_class.latest(user, group)).to eq recent
+ end
+ end
+end
diff --git a/spec/models/board_project_recent_visit_spec.rb b/spec/models/board_project_recent_visit_spec.rb
new file mode 100644
index 00000000000..275581945fa
--- /dev/null
+++ b/spec/models/board_project_recent_visit_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe BoardProjectRecentVisit do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:board) { create(:board, project: project) }
+
+ describe 'relationships' do
+ it { is_expected.to belong_to(:user) }
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:board) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:user) }
+ it { is_expected.to validate_presence_of(:project) }
+ it { is_expected.to validate_presence_of(:board) }
+ end
+
+ describe '#visited' do
+ it 'creates a visit if one does not exists' do
+ expect { described_class.visited!(user, board) }.to change(described_class, :count).by(1)
+ end
+
+ shared_examples 'was visited previously' do
+ let!(:visit) { create :board_project_recent_visit, project: board.project, board: board, user: user, updated_at: 7.days.ago }
+
+ it 'updates the timestamp' do
+ Timecop.freeze do
+ described_class.visited!(user, board)
+
+ expect(described_class.count).to eq 1
+ expect(described_class.first.updated_at).to be_like_time(Time.zone.now)
+ end
+ end
+ end
+
+ it_behaves_like 'was visited previously'
+
+ context 'when we try to create a visit that is not unique' do
+ before do
+ expect(described_class).to receive(:find_or_create_by).and_raise(ActiveRecord::RecordNotUnique, 'record not unique')
+ expect(described_class).to receive(:find_or_create_by).and_return(visit)
+ end
+
+ it_behaves_like 'was visited previously'
+ end
+ end
+
+ describe '#latest' do
+ it 'returns the most recent visited' do
+ board2 = create(:board, project: project)
+ board3 = create(:board, project: project)
+
+ create :board_project_recent_visit, project: board.project, board: board, user: user, updated_at: 7.days.ago
+ create :board_project_recent_visit, project: board2.project, board: board2, user: user, updated_at: 5.days.ago
+ recent = create :board_project_recent_visit, project: board3.project, board: board3, user: user, updated_at: 1.day.ago
+
+ expect(described_class.latest(user, project)).to eq recent
+ end
+ end
+end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 42b627b6823..d02c3a5765f 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -17,8 +17,8 @@ describe Ci::Build do
it { is_expected.to belong_to(:runner) }
it { is_expected.to belong_to(:trigger_request) }
it { is_expected.to belong_to(:erased_by) }
- it { is_expected.to have_many(:deployments) }
it { is_expected.to have_many(:trace_sections)}
+ it { is_expected.to have_one(:deployment) }
it { is_expected.to have_one(:runner_session)}
it { is_expected.to validate_presence_of(:ref) }
it { is_expected.to respond_to(:has_trace?) }
@@ -176,9 +176,7 @@ describe Ci::Build do
it 'does not execute a query for selecting job artifact one by one' do
recorded = ActiveRecord::QueryRecorder.new do
subject.each do |build|
- Ci::JobArtifact::TEST_REPORT_FILE_TYPES.each do |file_type|
- build.public_send("job_artifacts_#{file_type}").file.exists?
- end
+ build.job_artifacts.map { |a| a.file.exists? }
end
end
@@ -211,6 +209,143 @@ describe Ci::Build do
end
end
+ describe '#schedulable?' do
+ subject { build.schedulable? }
+
+ context 'when build is schedulable' do
+ let(:build) { create(:ci_build, :created, :schedulable, project: project) }
+
+ it { expect(subject).to be_truthy }
+ end
+
+ context 'when build is not schedulable' do
+ let(:build) { create(:ci_build, :created, project: project) }
+
+ it { expect(subject).to be_falsy }
+ end
+ end
+
+ describe '#schedule' do
+ subject { build.schedule }
+
+ before do
+ project.add_developer(user)
+ end
+
+ let(:build) { create(:ci_build, :created, :schedulable, user: user, project: project) }
+
+ it 'transits to scheduled' do
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+
+ subject
+
+ expect(build).to be_scheduled
+ end
+
+ it 'updates scheduled_at column' do
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+
+ subject
+
+ expect(build.scheduled_at).not_to be_nil
+ end
+
+ it 'schedules BuildScheduleWorker at the right time' do
+ Timecop.freeze do
+ expect(Ci::BuildScheduleWorker)
+ .to receive(:perform_at).with(be_like_time(1.minute.since), build.id)
+
+ subject
+ end
+ end
+ end
+
+ describe '#unschedule' do
+ subject { build.unschedule }
+
+ context 'when build is scheduled' do
+ let(:build) { create(:ci_build, :scheduled, pipeline: pipeline) }
+
+ it 'cleans scheduled_at column' do
+ subject
+
+ expect(build.scheduled_at).to be_nil
+ end
+
+ it 'transits to manual' do
+ subject
+
+ expect(build).to be_manual
+ end
+ end
+
+ context 'when build is not scheduled' do
+ let(:build) { create(:ci_build, :created, pipeline: pipeline) }
+
+ it 'does not transit status' do
+ subject
+
+ expect(build).to be_created
+ end
+ end
+ end
+
+ describe '#options_scheduled_at' do
+ subject { build.options_scheduled_at }
+
+ let(:build) { build_stubbed(:ci_build, options: option) }
+
+ context 'when start_in is 1 day' do
+ let(:option) { { start_in: '1 day' } }
+
+ it 'returns date after 1 day' do
+ Timecop.freeze do
+ is_expected.to eq(1.day.since)
+ end
+ end
+ end
+
+ context 'when start_in is 1 week' do
+ let(:option) { { start_in: '1 week' } }
+
+ it 'returns date after 1 week' do
+ Timecop.freeze do
+ is_expected.to eq(1.week.since)
+ end
+ end
+ end
+ end
+
+ describe '#enqueue_scheduled' do
+ subject { build.enqueue_scheduled }
+
+ context 'when build is scheduled and the right time has not come yet' do
+ let(:build) { create(:ci_build, :scheduled, pipeline: pipeline) }
+
+ it 'does not transits the status' do
+ subject
+
+ expect(build).to be_scheduled
+ end
+ end
+
+ context 'when build is scheduled and the right time has already come' do
+ let(:build) { create(:ci_build, :expired_scheduled, pipeline: pipeline) }
+
+ it 'cleans scheduled_at column' do
+ subject
+
+ expect(build.scheduled_at).to be_nil
+ end
+
+ it 'transits to pending' do
+ subject
+
+ expect(build).to be_pending
+ end
+ end
+ end
+
describe '#any_runners_online?' do
subject { build.any_runners_online? }
@@ -550,44 +685,22 @@ describe Ci::Build do
end
end
- describe '#has_test_reports?' do
- subject { build.has_test_reports? }
+ describe '#has_job_artifacts?' do
+ subject { build.has_job_artifacts? }
- context 'when build has a test report' do
- let(:build) { create(:ci_build, :test_reports) }
+ context 'when build has a job artifact' do
+ let(:build) { create(:ci_build, :artifacts) }
it { is_expected.to be_truthy }
end
- context 'when build does not have test reports' do
- let(:build) { create(:ci_build, :artifacts) }
+ context 'when build does not have job artifacts' do
+ let(:build) { create(:ci_build, :legacy_artifacts) }
it { is_expected.to be_falsy }
end
end
- describe '#erase_test_reports!' do
- subject { build.erase_test_reports! }
-
- context 'when build has a test report' do
- let!(:build) { create(:ci_build, :test_reports) }
-
- it 'removes a test report' do
- subject
-
- expect(build.has_test_reports?).to be_falsy
- end
- end
-
- context 'when build does not have test reports' do
- let!(:build) { create(:ci_build, :artifacts) }
-
- it 'does not erase anything' do
- expect { subject }.not_to change { Ci::JobArtifact.count }
- end
- end
- end
-
describe '#has_old_trace?' do
subject { build.has_old_trace? }
@@ -686,17 +799,100 @@ describe Ci::Build do
end
end
+ describe 'state transition as a deployable' do
+ let!(:build) { create(:ci_build, :start_review_app) }
+ let(:deployment) { build.deployment }
+ let(:environment) { deployment.environment }
+
+ it 'has deployments record with created status' do
+ expect(deployment).to be_created
+ expect(environment.name).to eq('review/master')
+ end
+
+ context 'when transits to running' do
+ before do
+ build.run!
+ end
+
+ it 'transits deployment status to running' do
+ expect(deployment).to be_running
+ end
+ end
+
+ context 'when transits to success' do
+ before do
+ allow(Deployments::SuccessWorker).to receive(:perform_async)
+ build.success!
+ end
+
+ it 'transits deployment status to success' do
+ expect(deployment).to be_success
+ end
+ end
+
+ context 'when transits to failed' do
+ before do
+ build.drop!
+ end
+
+ it 'transits deployment status to failed' do
+ expect(deployment).to be_failed
+ end
+ end
+
+ context 'when transits to skipped' do
+ before do
+ build.skip!
+ end
+
+ it 'transits deployment status to canceled' do
+ expect(deployment).to be_canceled
+ end
+ end
+
+ context 'when transits to canceled' do
+ before do
+ build.cancel!
+ end
+
+ it 'transits deployment status to canceled' do
+ expect(deployment).to be_canceled
+ end
+ end
+ end
+
+ describe '#on_stop' do
+ subject { build.on_stop }
+
+ context 'when a job has a specification that it can be stopped from the other job' do
+ let(:build) { create(:ci_build, :start_review_app) }
+
+ it 'returns the other job name' do
+ is_expected.to eq('stop_review_app')
+ end
+ end
+
+ context 'when a job does not have environment information' do
+ let(:build) { create(:ci_build) }
+
+ it 'returns nil' do
+ is_expected.to be_nil
+ end
+ end
+ end
+
describe 'deployment' do
- describe '#last_deployment' do
- subject { build.last_deployment }
+ describe '#has_deployment?' do
+ subject { build.has_deployment? }
- context 'when multiple deployments are created' do
- let!(:deployment1) { create(:deployment, deployable: build) }
- let!(:deployment2) { create(:deployment, deployable: build) }
+ context 'when build has a deployment' do
+ let!(:deployment) { create(:deployment, deployable: build) }
- it 'returns the latest one' do
- is_expected.to eq(deployment2)
- end
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when build does not have a deployment' do
+ it { is_expected.to be_falsy }
end
end
@@ -705,14 +901,14 @@ describe Ci::Build do
context 'when build succeeded' do
let(:build) { create(:ci_build, :success) }
- let!(:deployment) { create(:deployment, deployable: build) }
+ let!(:deployment) { create(:deployment, :success, deployable: build) }
context 'current deployment is latest' do
it { is_expected.to be_falsey }
end
context 'current deployment is not latest on environment' do
- let!(:deployment2) { create(:deployment, environment: deployment.environment) }
+ let!(:deployment2) { create(:deployment, :success, environment: deployment.environment) }
it { is_expected.to be_truthy }
end
@@ -850,8 +1046,8 @@ describe Ci::Build do
expect(build.artifacts_metadata.exists?).to be_falsy
end
- it 'removes test reports' do
- expect(build.job_artifacts.test_reports.count).to eq(0)
+ it 'removes all job_artifacts' do
+ expect(build.job_artifacts.count).to eq(0)
end
it 'erases build trace in trace file' do
@@ -1022,6 +1218,32 @@ describe Ci::Build do
end
end
+ describe '#erase_erasable_artifacts!' do
+ let!(:build) { create(:ci_build, :success) }
+
+ subject { build.erase_erasable_artifacts! }
+
+ before do
+ Ci::JobArtifact.file_types.keys.each do |file_type|
+ create(:ci_job_artifact, job: build, file_type: file_type, file_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS[file_type.to_sym])
+ end
+ end
+
+ it "erases erasable artifacts" do
+ subject
+
+ expect(build.job_artifacts.erasable).to be_empty
+ end
+
+ it "keeps non erasable artifacts" do
+ subject
+
+ Ci::JobArtifact::NON_ERASABLE_FILE_TYPES.each do |file_type|
+ expect(build.send("job_artifacts_#{file_type}")).not_to be_nil
+ end
+ end
+ end
+
describe '#first_pending' do
let!(:first) { create(:ci_build, pipeline: pipeline, status: 'pending', created_at: Date.yesterday) }
let!(:second) { create(:ci_build, pipeline: pipeline, status: 'pending') }
@@ -1175,6 +1397,14 @@ describe Ci::Build do
it { is_expected.not_to be_retryable }
end
+
+ context 'when build is degenerated' do
+ before do
+ build.degenerate!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
end
end
@@ -1191,6 +1421,12 @@ describe Ci::Build do
it { is_expected.to be_truthy }
end
+ context 'when is set to delayed' do
+ let(:value) { 'delayed' }
+
+ it { is_expected.to be_truthy }
+ end
+
context 'when set to something else' do
let(:value) { 'something else' }
@@ -1236,21 +1472,127 @@ describe Ci::Build do
end
describe '#retries_max' do
- context 'when max retries value is defined' do
- subject { create(:ci_build, options: { retry: 1 }) }
+ context 'with retries max config option' do
+ subject { create(:ci_build, options: { retry: { max: 1 } }) }
- it 'returns a number of configured max retries' do
+ it 'returns the number of configured max retries' do
expect(subject.retries_max).to eq 1
end
end
- context 'when max retries value is not defined' do
+ context 'without retries max config option' do
subject { create(:ci_build) }
it 'returns zero' do
expect(subject.retries_max).to eq 0
end
end
+
+ context 'when build is degenerated' do
+ subject { create(:ci_build, :degenerated) }
+
+ it 'returns zero' do
+ expect(subject.retries_max).to eq 0
+ end
+ end
+
+ context 'with integer only config option' do
+ subject { create(:ci_build, options: { retry: 1 }) }
+
+ it 'returns the number of configured max retries' do
+ expect(subject.retries_max).to eq 1
+ end
+ end
+ end
+
+ describe '#retry_when' do
+ context 'with retries when config option' do
+ subject { create(:ci_build, options: { retry: { when: ['some_reason'] } }) }
+
+ it 'returns the configured when' do
+ expect(subject.retry_when).to eq ['some_reason']
+ end
+ end
+
+ context 'without retries when config option' do
+ subject { create(:ci_build) }
+
+ it 'returns always array' do
+ expect(subject.retry_when).to eq ['always']
+ end
+ end
+
+ context 'with integer only config option' do
+ subject { create(:ci_build, options: { retry: 1 }) }
+
+ it 'returns always array' do
+ expect(subject.retry_when).to eq ['always']
+ end
+ end
+ end
+
+ describe '#retry_failure?' do
+ subject { create(:ci_build) }
+
+ context 'when retries max is zero' do
+ before do
+ expect(subject).to receive(:retries_max).at_least(:once).and_return(0)
+ end
+
+ it 'returns false' do
+ expect(subject.retry_failure?).to eq false
+ end
+ end
+
+ context 'when retries max equals retries count' do
+ before do
+ expect(subject).to receive(:retries_max).at_least(:once).and_return(1)
+ expect(subject).to receive(:retries_count).at_least(:once).and_return(1)
+ end
+
+ it 'returns false' do
+ expect(subject.retry_failure?).to eq false
+ end
+ end
+
+ context 'when retries max is higher than retries count' do
+ before do
+ expect(subject).to receive(:retries_max).at_least(:once).and_return(2)
+ expect(subject).to receive(:retries_count).at_least(:once).and_return(1)
+ end
+
+ context 'and retry when is always' do
+ before do
+ expect(subject).to receive(:retry_when).at_least(:once).and_return(['always'])
+ end
+
+ it 'returns true' do
+ expect(subject.retry_failure?).to eq true
+ end
+ end
+
+ context 'and retry when includes the failure_reason' do
+ before do
+ expect(subject).to receive(:failure_reason).at_least(:once).and_return('some_reason')
+ expect(subject).to receive(:retry_when).at_least(:once).and_return(['some_reason'])
+ end
+
+ it 'returns true' do
+ expect(subject.retry_failure?).to eq true
+ end
+ end
+
+ context 'and retry when does not include failure_reason' do
+ before do
+ expect(subject).to receive(:failure_reason).at_least(:once).and_return('some_reason')
+ expect(subject).to receive(:retry_when).at_least(:once).and_return(['some', 'other failure'])
+ end
+
+ it 'returns false' do
+ expect(subject.retry_failure?).to eq false
+ end
+ end
+ end
end
end
@@ -1276,6 +1618,19 @@ describe Ci::Build do
end
end
+ describe '#artifacts_file_for_type' do
+ let(:build) { create(:ci_build, :artifacts) }
+ let(:file_type) { :archive }
+
+ subject { build.artifacts_file_for_type(file_type) }
+
+ it 'queries artifacts for type' do
+ expect(build).to receive_message_chain(:job_artifacts, :find_by).with(file_type: Ci::JobArtifact.file_types[file_type])
+
+ subject
+ end
+ end
+
describe '#merge_request' do
def create_mr(build, pipeline, factory: :merge_request, created_at: Time.now)
create(factory, source_project: pipeline.project,
@@ -1353,11 +1708,11 @@ describe Ci::Build do
end
end
- describe '#other_actions' do
+ describe '#other_manual_actions' do
let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
let!(:other_build) { create(:ci_build, :manual, pipeline: pipeline, name: 'other action') }
- subject { build.other_actions }
+ subject { build.other_manual_actions }
before do
project.add_developer(user)
@@ -1388,6 +1743,48 @@ describe Ci::Build do
end
end
+ describe '#other_scheduled_actions' do
+ let(:build) { create(:ci_build, :scheduled, pipeline: pipeline) }
+
+ subject { build.other_scheduled_actions }
+
+ before do
+ project.add_developer(user)
+ end
+
+ context "when other build's status is success" do
+ let!(:other_build) { create(:ci_build, :schedulable, :success, pipeline: pipeline, name: 'other action') }
+
+ it 'returns other actions' do
+ is_expected.to contain_exactly(other_build)
+ end
+ end
+
+ context "when other build's status is failed" do
+ let!(:other_build) { create(:ci_build, :schedulable, :failed, pipeline: pipeline, name: 'other action') }
+
+ it 'returns other actions' do
+ is_expected.to contain_exactly(other_build)
+ end
+ end
+
+ context "when other build's status is running" do
+ let!(:other_build) { create(:ci_build, :schedulable, :running, pipeline: pipeline, name: 'other action') }
+
+ it 'does not return other actions' do
+ is_expected.to be_empty
+ end
+ end
+
+ context "when other build's status is scheduled" do
+ let!(:other_build) { create(:ci_build, :scheduled, pipeline: pipeline, name: 'other action') }
+
+ it 'does not return other actions' do
+ is_expected.to contain_exactly(other_build)
+ end
+ end
+ end
+
describe '#persisted_environment' do
let!(:environment) do
create(:environment, project: project, name: "foo-#{project.default_branch}")
@@ -1459,6 +1856,18 @@ describe Ci::Build do
it { is_expected.to be_playable }
end
+
+ context 'when build is a manual and degenerated' do
+ subject { build_stubbed(:ci_build, :manual, :degenerated, status: :manual) }
+
+ it { is_expected.not_to be_playable }
+ end
+ end
+
+ context 'when build is scheduled' do
+ subject { build_stubbed(:ci_build, :scheduled) }
+
+ it { is_expected.to be_playable }
end
context 'when build is not a manual action' do
@@ -1519,12 +1928,26 @@ describe Ci::Build do
describe '#repo_url' do
subject { build.repo_url }
- it { is_expected.to be_a(String) }
- it { is_expected.to end_with(".git") }
- it { is_expected.to start_with(project.web_url[0..6]) }
- it { is_expected.to include(build.token) }
- it { is_expected.to include('gitlab-ci-token') }
- it { is_expected.to include(project.web_url[7..-1]) }
+ context 'when token is set' do
+ before do
+ build.ensure_token
+ end
+
+ it { is_expected.to be_a(String) }
+ it { is_expected.to end_with(".git") }
+ it { is_expected.to start_with(project.web_url[0..6]) }
+ it { is_expected.to include(build.token) }
+ it { is_expected.to include('gitlab-ci-token') }
+ it { is_expected.to include(project.web_url[7..-1]) }
+ end
+
+ context 'when token is empty' do
+ before do
+ build.token = nil
+ end
+
+ it { is_expected.to be_nil}
+ end
end
describe '#stuck?' do
@@ -1634,7 +2057,8 @@ describe Ci::Build do
end
context 'use from gitlab-ci.yml' do
- let(:pipeline) { create(:ci_pipeline) }
+ let(:project) { create(:project, :repository) }
+ let(:pipeline) { create(:ci_pipeline, project: project) }
before do
stub_ci_pipeline_yaml_file(config)
@@ -1676,51 +2100,6 @@ describe Ci::Build do
describe '#variables' do
let(:container_registry_enabled) { false }
- let(:predefined_variables) do
- [
- { key: 'CI_PIPELINE_ID', value: pipeline.id.to_s, public: true },
- { key: 'CI_PIPELINE_URL', value: project.web_url + "/pipelines/#{pipeline.id}", public: true },
- { key: 'CI_JOB_ID', value: build.id.to_s, public: true },
- { key: 'CI_JOB_URL', value: project.web_url + "/-/jobs/#{build.id}", public: true },
- { key: 'CI_JOB_TOKEN', value: build.token, public: false },
- { key: 'CI_BUILD_ID', value: build.id.to_s, public: true },
- { key: 'CI_BUILD_TOKEN', value: build.token, public: false },
- { key: 'CI_REGISTRY_USER', value: 'gitlab-ci-token', public: true },
- { key: 'CI_REGISTRY_PASSWORD', value: build.token, public: false },
- { key: 'CI_REPOSITORY_URL', value: build.repo_url, public: false },
- { key: 'CI', value: 'true', public: true },
- { key: 'GITLAB_CI', value: 'true', public: true },
- { key: 'GITLAB_FEATURES', value: project.licensed_features.join(','), public: true },
- { key: 'CI_SERVER_NAME', value: 'GitLab', public: true },
- { key: 'CI_SERVER_VERSION', value: Gitlab::VERSION, public: true },
- { key: 'CI_SERVER_REVISION', value: Gitlab.revision, public: true },
- { key: 'CI_JOB_NAME', value: 'test', public: true },
- { key: 'CI_JOB_STAGE', value: 'test', public: true },
- { key: 'CI_COMMIT_SHA', value: build.sha, public: true },
- { key: 'CI_COMMIT_BEFORE_SHA', value: build.before_sha, public: true },
- { key: 'CI_COMMIT_REF_NAME', value: build.ref, public: true },
- { key: 'CI_COMMIT_REF_SLUG', value: build.ref_slug, public: true },
- { key: 'CI_BUILD_REF', value: build.sha, public: true },
- { key: 'CI_BUILD_BEFORE_SHA', value: build.before_sha, public: true },
- { key: 'CI_BUILD_REF_NAME', value: build.ref, public: true },
- { key: 'CI_BUILD_REF_SLUG', value: build.ref_slug, public: true },
- { key: 'CI_BUILD_NAME', value: 'test', public: true },
- { key: 'CI_BUILD_STAGE', value: 'test', public: true },
- { key: 'CI_PROJECT_ID', value: project.id.to_s, public: true },
- { key: 'CI_PROJECT_NAME', value: project.path, public: true },
- { key: 'CI_PROJECT_PATH', value: project.full_path, public: true },
- { key: 'CI_PROJECT_PATH_SLUG', value: project.full_path_slug, public: true },
- { key: 'CI_PROJECT_NAMESPACE', value: project.namespace.full_path, public: true },
- { key: 'CI_PROJECT_URL', value: project.web_url, public: true },
- { key: 'CI_PROJECT_VISIBILITY', value: 'private', public: true },
- { key: 'CI_PIPELINE_IID', value: pipeline.iid.to_s, public: true },
- { key: 'CI_CONFIG_PATH', value: pipeline.ci_yaml_file_path, public: true },
- { key: 'CI_PIPELINE_SOURCE', value: pipeline.source, public: true },
- { key: 'CI_COMMIT_MESSAGE', value: pipeline.git_commit_message, public: true },
- { key: 'CI_COMMIT_TITLE', value: pipeline.git_commit_title, public: true },
- { key: 'CI_COMMIT_DESCRIPTION', value: pipeline.git_commit_description, public: true }
- ]
- end
before do
stub_container_registry_config(enabled: container_registry_enabled, host_port: 'registry.example.com')
@@ -1729,11 +2108,174 @@ describe Ci::Build do
subject { build.variables }
context 'returns variables' do
+ let(:predefined_variables) do
+ [
+ { key: 'CI_PIPELINE_ID', value: pipeline.id.to_s, public: true },
+ { key: 'CI_PIPELINE_URL', value: project.web_url + "/pipelines/#{pipeline.id}", public: true },
+ { key: 'CI_JOB_ID', value: build.id.to_s, public: true },
+ { key: 'CI_JOB_URL', value: project.web_url + "/-/jobs/#{build.id}", public: true },
+ { key: 'CI_JOB_TOKEN', value: 'my-token', public: false },
+ { key: 'CI_BUILD_ID', value: build.id.to_s, public: true },
+ { key: 'CI_BUILD_TOKEN', value: 'my-token', public: false },
+ { key: 'CI_REGISTRY_USER', value: 'gitlab-ci-token', public: true },
+ { key: 'CI_REGISTRY_PASSWORD', value: 'my-token', public: false },
+ { key: 'CI_REPOSITORY_URL', value: build.repo_url, public: false },
+ { key: 'CI', value: 'true', public: true },
+ { key: 'GITLAB_CI', value: 'true', public: true },
+ { key: 'GITLAB_FEATURES', value: project.licensed_features.join(','), public: true },
+ { key: 'CI_SERVER_NAME', value: 'GitLab', public: true },
+ { key: 'CI_SERVER_VERSION', value: Gitlab::VERSION, public: true },
+ { key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s, public: true },
+ { key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s, public: true },
+ { key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s, public: true },
+ { key: 'CI_SERVER_REVISION', value: Gitlab.revision, public: true },
+ { key: 'CI_JOB_NAME', value: 'test', public: true },
+ { key: 'CI_JOB_STAGE', value: 'test', public: true },
+ { key: 'CI_COMMIT_SHA', value: build.sha, public: true },
+ { key: 'CI_COMMIT_BEFORE_SHA', value: build.before_sha, public: true },
+ { key: 'CI_COMMIT_REF_NAME', value: build.ref, public: true },
+ { key: 'CI_COMMIT_REF_SLUG', value: build.ref_slug, public: true },
+ { key: 'CI_NODE_TOTAL', value: '1', public: true },
+ { key: 'CI_BUILD_REF', value: build.sha, public: true },
+ { key: 'CI_BUILD_BEFORE_SHA', value: build.before_sha, public: true },
+ { key: 'CI_BUILD_REF_NAME', value: build.ref, public: true },
+ { key: 'CI_BUILD_REF_SLUG', value: build.ref_slug, public: true },
+ { key: 'CI_BUILD_NAME', value: 'test', public: true },
+ { key: 'CI_BUILD_STAGE', value: 'test', public: true },
+ { key: 'CI_PROJECT_ID', value: project.id.to_s, public: true },
+ { key: 'CI_PROJECT_NAME', value: project.path, public: true },
+ { key: 'CI_PROJECT_PATH', value: project.full_path, public: true },
+ { key: 'CI_PROJECT_PATH_SLUG', value: project.full_path_slug, public: true },
+ { key: 'CI_PROJECT_NAMESPACE', value: project.namespace.full_path, public: true },
+ { key: 'CI_PROJECT_URL', value: project.web_url, public: true },
+ { key: 'CI_PROJECT_VISIBILITY', value: 'private', public: true },
+ { key: 'CI_PIPELINE_IID', value: pipeline.iid.to_s, public: true },
+ { key: 'CI_CONFIG_PATH', value: pipeline.ci_yaml_file_path, public: true },
+ { key: 'CI_PIPELINE_SOURCE', value: pipeline.source, public: true },
+ { key: 'CI_COMMIT_MESSAGE', value: pipeline.git_commit_message, public: true },
+ { key: 'CI_COMMIT_TITLE', value: pipeline.git_commit_title, public: true },
+ { key: 'CI_COMMIT_DESCRIPTION', value: pipeline.git_commit_description, public: true }
+ ]
+ end
+
before do
+ build.token = 'my-token'
build.yaml_variables = []
end
it { is_expected.to include(*predefined_variables) }
+
+ context 'when yaml variables are undefined' do
+ let(:pipeline) do
+ create(:ci_pipeline, project: project,
+ sha: project.commit.id,
+ ref: project.default_branch)
+ end
+
+ before do
+ build.yaml_variables = nil
+ end
+
+ context 'use from gitlab-ci.yml' do
+ before do
+ stub_ci_pipeline_yaml_file(config)
+ end
+
+ context 'when config is not found' do
+ let(:config) { nil }
+
+ it { is_expected.to include(*predefined_variables) }
+ end
+
+ context 'when config does not have a questioned job' do
+ let(:config) do
+ YAML.dump({
+ test_other: {
+ script: 'Hello World'
+ }
+ })
+ end
+
+ it { is_expected.to include(*predefined_variables) }
+ end
+
+ context 'when config has variables' do
+ let(:config) do
+ YAML.dump({
+ test: {
+ script: 'Hello World',
+ variables: {
+ KEY: 'value'
+ }
+ }
+ })
+ end
+
+ let(:variables) do
+ [{ key: 'KEY', value: 'value', public: true }]
+ end
+
+ it { is_expected.to include(*predefined_variables) }
+ it { is_expected.to include(*variables) }
+ end
+ end
+ end
+
+ describe 'variables ordering' do
+ context 'when variables hierarchy is stubbed' do
+ let(:build_pre_var) { { key: 'build', value: 'value', public: true } }
+ let(:project_pre_var) { { key: 'project', value: 'value', public: true } }
+ let(:pipeline_pre_var) { { key: 'pipeline', value: 'value', public: true } }
+ let(:build_yaml_var) { { key: 'yaml', value: 'value', public: true } }
+
+ before do
+ allow(build).to receive(:predefined_variables) { [build_pre_var] }
+ allow(build).to receive(:yaml_variables) { [build_yaml_var] }
+ allow(build).to receive(:persisted_variables) { [] }
+
+ allow_any_instance_of(Project)
+ .to receive(:predefined_variables) { [project_pre_var] }
+
+ project.variables.create!(key: 'secret', value: 'value')
+
+ allow_any_instance_of(Ci::Pipeline)
+ .to receive(:predefined_variables) { [pipeline_pre_var] }
+ end
+
+ it 'returns variables in order depending on resource hierarchy' do
+ is_expected.to eq(
+ [build_pre_var,
+ project_pre_var,
+ pipeline_pre_var,
+ build_yaml_var,
+ { key: 'secret', value: 'value', public: false }])
+ end
+ end
+
+ context 'when build has environment and user-provided variables' do
+ let(:expected_variables) do
+ predefined_variables.map { |variable| variable.fetch(:key) } +
+ %w[YAML_VARIABLE CI_ENVIRONMENT_NAME CI_ENVIRONMENT_SLUG
+ CI_ENVIRONMENT_URL]
+ end
+
+ before do
+ create(:environment, project: build.project,
+ name: 'staging')
+
+ build.yaml_variables = [{ key: 'YAML_VARIABLE',
+ value: 'var',
+ public: true }]
+ build.environment = 'staging'
+ end
+
+ it 'matches explicit variables ordering' do
+ received_variables = subject.map { |variable| variable.fetch(:key) }
+
+ expect(received_variables).to eq expected_variables
+ end
+ end
+ end
end
context 'when build has user' do
@@ -1847,17 +2389,17 @@ describe Ci::Build do
it { is_expected.to include(tag_variable) }
end
- context 'when secret variable is defined' do
- let(:secret_variable) do
+ context 'when CI variable is defined' do
+ let(:ci_variable) do
{ key: 'SECRET_KEY', value: 'secret_value', public: false }
end
before do
create(:ci_variable,
- secret_variable.slice(:key, :value).merge(project: project))
+ ci_variable.slice(:key, :value).merge(project: project))
end
- it { is_expected.to include(secret_variable) }
+ it { is_expected.to include(ci_variable) }
end
context 'when protected variable is defined' do
@@ -1892,17 +2434,17 @@ describe Ci::Build do
end
end
- context 'when group secret variable is defined' do
- let(:secret_variable) do
+ context 'when group CI variable is defined' do
+ let(:ci_variable) do
{ key: 'SECRET_KEY', value: 'secret_value', public: false }
end
before do
create(:ci_group_variable,
- secret_variable.slice(:key, :value).merge(group: group))
+ ci_variable.slice(:key, :value).merge(group: group))
end
- it { is_expected.to include(secret_variable) }
+ it { is_expected.to include(ci_variable) }
end
context 'when group protected variable is defined' do
@@ -1995,75 +2537,20 @@ describe Ci::Build do
end
before do
- pipeline_schedule.pipelines << pipeline
+ pipeline_schedule.pipelines << pipeline.reload
pipeline_schedule.reload
end
it { is_expected.to include(pipeline_schedule_variable.to_runner_variable) }
end
- context 'when yaml_variables are undefined' do
- let(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: project.commit.id,
- ref: project.default_branch)
- end
-
- before do
- build.yaml_variables = nil
- end
-
- context 'use from gitlab-ci.yml' do
- before do
- stub_ci_pipeline_yaml_file(config)
- end
-
- context 'when config is not found' do
- let(:config) { nil }
-
- it { is_expected.to include(*predefined_variables) }
- end
-
- context 'when config does not have a questioned job' do
- let(:config) do
- YAML.dump({
- test_other: {
- script: 'Hello World'
- }
- })
- end
-
- it { is_expected.to include(*predefined_variables) }
- end
-
- context 'when config has variables' do
- let(:config) do
- YAML.dump({
- test: {
- script: 'Hello World',
- variables: {
- KEY: 'value'
- }
- }
- })
- end
- let(:variables) do
- [{ key: 'KEY', value: 'value', public: true }]
- end
-
- it { is_expected.to include(*predefined_variables) }
- it { is_expected.to include(*variables) }
- end
- end
- end
-
context 'when container registry is enabled' do
let(:container_registry_enabled) { true }
let(:ci_registry) do
- { key: 'CI_REGISTRY', value: 'registry.example.com', public: true }
+ { key: 'CI_REGISTRY', value: 'registry.example.com', public: true }
end
let(:ci_registry_image) do
- { key: 'CI_REGISTRY_IMAGE', value: project.container_registry_url, public: true }
+ { key: 'CI_REGISTRY_IMAGE', value: project.container_registry_url, public: true }
end
context 'and is disabled for project' do
@@ -2161,63 +2648,26 @@ describe Ci::Build do
end
end
- describe 'variables ordering' do
- context 'when variables hierarchy is stubbed' do
- let(:build_pre_var) { { key: 'build', value: 'value', public: true } }
- let(:project_pre_var) { { key: 'project', value: 'value', public: true } }
- let(:pipeline_pre_var) { { key: 'pipeline', value: 'value', public: true } }
- let(:build_yaml_var) { { key: 'yaml', value: 'value', public: true } }
-
- before do
- allow(build).to receive(:predefined_variables) { [build_pre_var] }
- allow(build).to receive(:yaml_variables) { [build_yaml_var] }
- allow(build).to receive(:persisted_variables) { [] }
-
- allow_any_instance_of(Project)
- .to receive(:predefined_variables) { [project_pre_var] }
-
- allow_any_instance_of(Project)
- .to receive(:secret_variables_for)
- .with(ref: 'master', environment: nil) do
- [create(:ci_variable, key: 'secret', value: 'value')]
- end
-
- allow_any_instance_of(Ci::Pipeline)
- .to receive(:predefined_variables) { [pipeline_pre_var] }
- end
+ context 'when build is parallelized' do
+ let(:total) { 5 }
+ let(:index) { 3 }
- it 'returns variables in order depending on resource hierarchy' do
- is_expected.to eq(
- [build_pre_var,
- project_pre_var,
- pipeline_pre_var,
- build_yaml_var,
- { key: 'secret', value: 'value', public: false }])
- end
+ before do
+ build.options[:parallel] = total
+ build.options[:instance] = index
+ build.name = "#{build.name} #{index}/#{total}"
end
- context 'when build has environment and user-provided variables' do
- let(:expected_variables) do
- predefined_variables.map { |variable| variable.fetch(:key) } +
- %w[YAML_VARIABLE CI_ENVIRONMENT_NAME CI_ENVIRONMENT_SLUG
- CI_ENVIRONMENT_URL]
- end
-
- before do
- create(:environment, project: build.project,
- name: 'staging')
-
- build.yaml_variables = [{ key: 'YAML_VARIABLE',
- value: 'var',
- public: true }]
- build.environment = 'staging'
- end
-
- it 'matches explicit variables ordering' do
- received_variables = subject.map { |variable| variable.fetch(:key) }
+ it 'includes CI_NODE_INDEX' do
+ is_expected.to include(
+ { key: 'CI_NODE_INDEX', value: index.to_s, public: true }
+ )
+ end
- expect(received_variables).to eq expected_variables
- end
+ it 'includes correct CI_NODE_TOTAL' do
+ is_expected.to include(
+ { key: 'CI_NODE_TOTAL', value: total.to_s, public: true }
+ )
end
end
@@ -2328,7 +2778,7 @@ describe Ci::Build do
end
describe '#scoped_variables_hash' do
- context 'when overriding secret variables' do
+ context 'when overriding CI variables' do
before do
project.variables.create!(key: 'MY_VAR', value: 'my value 1')
pipeline.variables.create!(key: 'MY_VAR', value: 'my value 2')
@@ -2548,7 +2998,7 @@ describe Ci::Build do
end
context 'when build is configured to be retried' do
- subject { create(:ci_build, :running, options: { retry: 3 }, project: project, user: user) }
+ subject { create(:ci_build, :running, options: { retry: { max: 3 } }, project: project, user: user) }
it 'retries build and assigns the same user to it' do
expect(described_class).to receive(:retry)
@@ -2844,16 +3294,10 @@ describe Ci::Build do
end
it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::Ci::Parsers::Junit::JunitParserError)
+ expect { subject }.to raise_error(Gitlab::Ci::Parsers::Test::Junit::JunitParserError)
end
end
end
-
- context 'when build does not have test reports' do
- it 'raises an error' do
- expect { subject }.to raise_error(NoMethodError)
- end
- end
end
describe '#artifacts_metadata_entry' do
@@ -2981,4 +3425,93 @@ describe Ci::Build do
end
end
end
+
+ describe '#deployment_status' do
+ before do
+ allow_any_instance_of(described_class).to receive(:create_deployment)
+ end
+
+ context 'when build is a last deployment' do
+ let(:build) { create(:ci_build, :success, environment: 'production') }
+ let(:environment) { create(:environment, name: 'production', project: build.project) }
+ let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) }
+
+ it { expect(build.deployment_status).to eq(:last) }
+ end
+
+ context 'when there is a newer build with deployment' do
+ let(:build) { create(:ci_build, :success, environment: 'production') }
+ let(:environment) { create(:environment, name: 'production', project: build.project) }
+ let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) }
+ let!(:last_deployment) { create(:deployment, :success, environment: environment, project: environment.project) }
+
+ it { expect(build.deployment_status).to eq(:out_of_date) }
+ end
+
+ context 'when build with deployment has failed' do
+ let(:build) { create(:ci_build, :failed, environment: 'production') }
+ let(:environment) { create(:environment, name: 'production', project: build.project) }
+ let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) }
+
+ it { expect(build.deployment_status).to eq(:failed) }
+ end
+
+ context 'when build with deployment is running' do
+ let(:build) { create(:ci_build, environment: 'production') }
+ let(:environment) { create(:environment, name: 'production', project: build.project) }
+ let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) }
+
+ it { expect(build.deployment_status).to eq(:creating) }
+ end
+ end
+
+ describe '#degenerated?' do
+ context 'when build is degenerated' do
+ subject { create(:ci_build, :degenerated) }
+
+ it { is_expected.to be_degenerated }
+ end
+
+ context 'when build is valid' do
+ subject { create(:ci_build) }
+
+ it { is_expected.not_to be_degenerated }
+
+ context 'and becomes degenerated' do
+ before do
+ subject.degenerate!
+ end
+
+ it { is_expected.to be_degenerated }
+ end
+ end
+ end
+
+ describe '#archived?' do
+ context 'when build is degenerated' do
+ subject { create(:ci_build, :degenerated) }
+
+ it { is_expected.to be_archived }
+ end
+
+ context 'for old build' do
+ subject { create(:ci_build, created_at: 1.day.ago) }
+
+ context 'when archive_builds_in is set' do
+ before do
+ stub_application_setting(archive_builds_in_seconds: 3600)
+ end
+
+ it { is_expected.to be_archived }
+ end
+
+ context 'when archive_builds_in is not set' do
+ before do
+ stub_application_setting(archive_builds_in_seconds: nil)
+ end
+
+ it { is_expected.not_to be_archived }
+ end
+ end
+ end
end
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 1bf338f4c70..fb5bec4108a 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -31,6 +31,22 @@ describe Ci::JobArtifact do
end
end
+ describe '.erasable' do
+ subject { described_class.erasable }
+
+ context 'when there is an erasable artifact' do
+ let!(:artifact) { create(:ci_job_artifact, :junit) }
+
+ it { is_expected.to eq([artifact]) }
+ end
+
+ context 'when there are no erasable artifacts' do
+ let!(:artifact) { create(:ci_job_artifact, :trace) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
describe 'callbacks' do
subject { create(:ci_job_artifact, :archive) }
@@ -106,34 +122,46 @@ describe Ci::JobArtifact do
describe 'validates file format' do
subject { artifact }
- context 'when archive type with zip format' do
- let(:artifact) { build(:ci_job_artifact, :archive, file_format: :zip) }
+ described_class::TYPE_AND_FORMAT_PAIRS.except(:trace).each do |file_type, file_format|
+ context "when #{file_type} type with #{file_format} format" do
+ let(:artifact) { build(:ci_job_artifact, file_type: file_type, file_format: file_format) }
- it { is_expected.to be_valid }
- end
+ it { is_expected.to be_valid }
+ end
- context 'when archive type with gzip format' do
- let(:artifact) { build(:ci_job_artifact, :archive, file_format: :gzip) }
+ context "when #{file_type} type without format specification" do
+ let(:artifact) { build(:ci_job_artifact, file_type: file_type, file_format: nil) }
- it { is_expected.not_to be_valid }
- end
+ it { is_expected.not_to be_valid }
+ end
- context 'when archive type without format specification' do
- let(:artifact) { build(:ci_job_artifact, :archive, file_format: nil) }
+ context "when #{file_type} type with other formats" do
+ described_class.file_formats.except(file_format).values.each do |other_format|
+ let(:artifact) { build(:ci_job_artifact, file_type: file_type, file_format: other_format) }
- it { is_expected.not_to be_valid }
+ it { is_expected.not_to be_valid }
+ end
+ end
end
+ end
- context 'when junit type with zip format' do
- let(:artifact) { build(:ci_job_artifact, :junit, file_format: :zip) }
+ describe 'validates DEFAULT_FILE_NAMES' do
+ subject { described_class::DEFAULT_FILE_NAMES }
- it { is_expected.not_to be_valid }
+ described_class.file_types.each do |file_type, _|
+ it "expects #{file_type} to be included" do
+ is_expected.to include(file_type.to_sym)
+ end
end
+ end
- context 'when junit type with gzip format' do
- let(:artifact) { build(:ci_job_artifact, :junit, file_format: :gzip) }
+ describe 'validates TYPE_AND_FORMAT_PAIRS' do
+ subject { described_class::TYPE_AND_FORMAT_PAIRS }
- it { is_expected.to be_valid }
+ described_class.file_types.each do |file_type, _|
+ it "expects #{file_type} to be included" do
+ expect(described_class.file_formats).to include(subject[file_type.to_sym])
+ end
end
end
@@ -166,6 +194,14 @@ describe Ci::JobArtifact do
end
end
+ context 'when file format is raw' do
+ let(:artifact) { build(:ci_job_artifact, :codequality, file_format: :raw) }
+
+ it 'iterates blob once' do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.once
+ end
+ end
+
context 'when there are no adapters for the file format' do
let(:artifact) { build(:ci_job_artifact, :junit, file_format: :zip) }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 77b7332a761..9e6146b8a44 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -75,6 +75,18 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe '#delay' do
+ subject { pipeline.delay }
+
+ let(:pipeline) { build(:ci_pipeline, status: :created) }
+
+ it 'changes pipeline status to schedule' do
+ subject
+
+ expect(pipeline).to be_scheduled
+ end
+ end
+
describe '#valid_commit_sha' do
context 'commit.sha can not start with 00000000' do
before do
@@ -767,6 +779,41 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe 'ref_exists?' do
+ context 'when repository exists' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:project) { create(:project, :repository) }
+
+ where(:tag, :ref, :result) do
+ false | 'master' | true
+ false | 'non-existent-branch' | false
+ true | 'v1.1.0' | true
+ true | 'non-existent-tag' | false
+ end
+
+ with_them do
+ let(:pipeline) do
+ create(:ci_empty_pipeline, project: project, tag: tag, ref: ref)
+ end
+
+ it "correctly detects ref" do
+ expect(pipeline.ref_exists?).to be result
+ end
+ end
+ end
+
+ context 'when repository does not exist' do
+ let(:pipeline) do
+ create(:ci_empty_pipeline, project: project, ref: 'master')
+ end
+
+ it 'always returns false' do
+ expect(pipeline.ref_exists?).to eq false
+ end
+ end
+ end
+
context 'with non-empty project' do
let(:project) { create(:project, :repository) }
@@ -825,6 +872,57 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe '#branch_updated?' do
+ context 'when pipeline has before SHA' do
+ before do
+ pipeline.update_column(:before_sha, 'a1b2c3d4')
+ end
+
+ it 'runs on a branch update push' do
+ expect(pipeline.before_sha).not_to be Gitlab::Git::BLANK_SHA
+ expect(pipeline.branch_updated?).to be true
+ end
+ end
+
+ context 'when pipeline does not have before SHA' do
+ before do
+ pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
+ end
+
+ it 'does not run on a branch updating push' do
+ expect(pipeline.branch_updated?).to be false
+ end
+ end
+ end
+
+ describe '#modified_paths' do
+ context 'when old and new revisions are set' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ pipeline.update(before_sha: '1234abcd', sha: '2345bcde')
+ end
+
+ it 'fetches stats for changes between commits' do
+ expect(project.repository)
+ .to receive(:diff_stats).with('1234abcd', '2345bcde')
+ .and_call_original
+
+ pipeline.modified_paths
+ end
+ end
+
+ context 'when either old or new revision is missing' do
+ before do
+ pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
+ end
+
+ it 'raises an error' do
+ expect { pipeline.modified_paths }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
describe '#has_kubernetes_active?' do
context 'when kubernetes is active' do
shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
@@ -945,6 +1043,11 @@ describe Ci::Pipeline, :mailer do
expect(described_class.newest_first.pluck(:status))
.to eq(%w[skipped failed success canceled])
end
+
+ it 'searches limited backlog' do
+ expect(described_class.newest_first(limit: 1).pluck(:status))
+ .to eq(%w[skipped])
+ end
end
describe '.latest_status' do
@@ -1050,6 +1153,19 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe '.latest_successful_ids_per_project' do
+ let(:projects) { create_list(:project, 2) }
+ let!(:pipeline1) { create(:ci_pipeline, :success, project: projects[0]) }
+ let!(:pipeline2) { create(:ci_pipeline, :success, project: projects[0]) }
+ let!(:pipeline3) { create(:ci_pipeline, :failed, project: projects[0]) }
+ let!(:pipeline4) { create(:ci_pipeline, :success, project: projects[1]) }
+
+ it 'returns expected pipeline ids' do
+ expect(described_class.latest_successful_ids_per_project)
+ .to contain_exactly(pipeline2, pipeline4)
+ end
+ end
+
describe '.internal_sources' do
subject { described_class.internal_sources }
@@ -1151,7 +1267,11 @@ describe Ci::Pipeline, :mailer do
end
describe '#set_config_source' do
- context 'when pipelines does not contain needed data' do
+ context 'when pipelines does not contain needed data and auto devops is disabled' do
+ before do
+ stub_application_setting(auto_devops_enabled: false)
+ end
+
it 'defines source to be unknown' do
pipeline.set_config_source
@@ -1196,7 +1316,6 @@ describe Ci::Pipeline, :mailer do
context 'auto devops enabled' do
before do
- stub_application_setting(auto_devops_enabled: true)
allow(project).to receive(:ci_config_path) { 'custom' }
end
@@ -1285,6 +1404,19 @@ describe Ci::Pipeline, :mailer do
end
end
+ context 'when updating status to scheduled' do
+ before do
+ allow(pipeline)
+ .to receive_message_chain(:statuses, :latest, :status)
+ .and_return(:scheduled)
+ end
+
+ it 'updates pipeline status to scheduled' do
+ expect { pipeline.update_status }
+ .to change { pipeline.reload.status }.to 'scheduled'
+ end
+ end
+
context 'when statuses status was not recognized' do
before do
allow(pipeline)
@@ -1743,7 +1875,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_pipeline, config: { rspec: { script: 'rake test' } })
end
- it 'does not containyaml errors' do
+ it 'does not contain yaml errors' do
expect(pipeline).not_to have_yaml_errors
end
end
@@ -1941,4 +2073,58 @@ describe Ci::Pipeline, :mailer do
expect(pipeline.total_size).to eq(5)
end
end
+
+ describe '#status' do
+ context 'when transitioning to failed' do
+ context 'when pipeline has autodevops as source' do
+ let(:pipeline) { create(:ci_pipeline, :running, :auto_devops_source) }
+
+ it 'calls autodevops disable service' do
+ expect(AutoDevops::DisableWorker).to receive(:perform_async).with(pipeline.id)
+
+ pipeline.drop
+ end
+ end
+
+ context 'when pipeline has other source' do
+ let(:pipeline) { create(:ci_pipeline, :running, :repository_source) }
+
+ it 'does not call auto devops disable service' do
+ expect(AutoDevops::DisableWorker).not_to receive(:perform_async)
+
+ pipeline.drop
+ end
+ end
+ end
+ end
+
+ describe '#default_branch?' do
+ let(:default_branch) { 'master'}
+
+ subject { pipeline.default_branch? }
+
+ before do
+ allow(project).to receive(:default_branch).and_return(default_branch)
+ end
+
+ context 'when pipeline ref is the default branch of the project' do
+ let(:pipeline) do
+ build(:ci_empty_pipeline, status: :created, project: project, ref: default_branch)
+ end
+
+ it "returns true" do
+ expect(subject).to be_truthy
+ end
+ end
+
+ context 'when pipeline ref is not the default branch of the project' do
+ let(:pipeline) do
+ build(:ci_empty_pipeline, status: :created, project: project, ref: 'another_branch')
+ end
+
+ it "returns false" do
+ expect(subject).to be_falsey
+ end
+ end
+ end
end
diff --git a/spec/models/ci/pipeline_variable_spec.rb b/spec/models/ci/pipeline_variable_spec.rb
index 889c243c8d8..03d09cb31d6 100644
--- a/spec/models/ci/pipeline_variable_spec.rb
+++ b/spec/models/ci/pipeline_variable_spec.rb
@@ -5,4 +5,13 @@ describe Ci::PipelineVariable do
it { is_expected.to include_module(HasVariable) }
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:pipeline_id) }
+
+ describe '#hook_attrs' do
+ let(:variable) { create(:ci_pipeline_variable, key: 'foo', value: 'bar') }
+
+ subject { variable.hook_attrs }
+
+ it { is_expected.to be_a(Hash) }
+ it { is_expected.to eq({ key: 'foo', value: 'bar' }) }
+ end
end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 953af2c4710..b545e036aa1 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -223,7 +223,7 @@ describe Ci::Runner do
subject { described_class.online }
before do
- @runner1 = create(:ci_runner, :instance, contacted_at: 1.year.ago)
+ @runner1 = create(:ci_runner, :instance, contacted_at: 1.hour.ago)
@runner2 = create(:ci_runner, :instance, contacted_at: 1.second.ago)
end
@@ -300,6 +300,17 @@ describe Ci::Runner do
end
end
+ describe '.offline' do
+ subject { described_class.offline }
+
+ before do
+ @runner1 = create(:ci_runner, :instance, contacted_at: 1.hour.ago)
+ @runner2 = create(:ci_runner, :instance, contacted_at: 1.second.ago)
+ end
+
+ it { is_expected.to eq([@runner1])}
+ end
+
describe '#can_pick?' do
set(:pipeline) { create(:ci_pipeline) }
let(:build) { create(:ci_build, pipeline: pipeline) }
@@ -786,4 +797,22 @@ describe Ci::Runner do
expect { subject.destroy }.to change { described_class.count }.by(-1)
end
end
+
+ describe '.order_by' do
+ it 'supports ordering by the contact date' do
+ runner1 = create(:ci_runner, contacted_at: 1.year.ago)
+ runner2 = create(:ci_runner, contacted_at: 1.month.ago)
+ runners = described_class.order_by('contacted_asc')
+
+ expect(runners).to eq([runner1, runner2])
+ end
+
+ it 'supports ordering by the creation date' do
+ runner1 = create(:ci_runner, created_at: 1.year.ago)
+ runner2 = create(:ci_runner, created_at: 1.month.ago)
+ runners = described_class.order_by('created_asc')
+
+ expect(runners).to eq([runner2, runner1])
+ end
+ end
end
diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb
index 22a4556c10c..5076f7faeac 100644
--- a/spec/models/ci/stage_spec.rb
+++ b/spec/models/ci/stage_spec.rb
@@ -89,6 +89,18 @@ describe Ci::Stage, :models do
end
end
+ context 'when stage is scheduled because of scheduled builds' do
+ before do
+ create(:ci_build, :scheduled, stage_id: stage.id)
+ end
+
+ it 'updates status to scheduled' do
+ expect { stage.update_status }
+ .to change { stage.reload.status }
+ .to 'scheduled'
+ end
+ end
+
context 'when stage is skipped because is empty' do
it 'updates status to skipped' do
expect { stage.update_status }
@@ -188,6 +200,18 @@ describe Ci::Stage, :models do
end
end
+ describe '#delay' do
+ subject { stage.delay }
+
+ let(:stage) { create(:ci_stage_entity, status: :created) }
+
+ it 'updates stage status' do
+ subject
+
+ expect(stage).to be_scheduled
+ end
+ end
+
describe '#position' do
context 'when stage has been imported and does not have position index set' do
before do
diff --git a/spec/models/clusters/applications/helm_spec.rb b/spec/models/clusters/applications/helm_spec.rb
index e5b2bdc8a4e..2c37cd20ecc 100644
--- a/spec/models/clusters/applications/helm_spec.rb
+++ b/spec/models/clusters/applications/helm_spec.rb
@@ -47,5 +47,19 @@ describe Clusters::Applications::Helm do
cert = OpenSSL::X509::Certificate.new(subject.files[:'cert.pem'])
expect(cert.not_after).to be > 999.years.from_now
end
+
+ describe 'rbac' do
+ context 'non rbac cluster' do
+ it { expect(subject).not_to be_rbac }
+ end
+
+ context 'rbac cluster' do
+ before do
+ helm.cluster.platform_kubernetes.rbac!
+ end
+
+ it { expect(subject).to be_rbac }
+ end
+ end
end
end
diff --git a/spec/models/clusters/applications/ingress_spec.rb b/spec/models/clusters/applications/ingress_spec.rb
index 21f75ced8c3..6b0b23eeab3 100644
--- a/spec/models/clusters/applications/ingress_spec.rb
+++ b/spec/models/clusters/applications/ingress_spec.rb
@@ -4,7 +4,8 @@ describe Clusters::Applications::Ingress do
let(:ingress) { create(:clusters_applications_ingress) }
include_examples 'cluster application core specs', :clusters_applications_ingress
- include_examples 'cluster application status specs', :cluster_application_ingress
+ include_examples 'cluster application status specs', :clusters_applications_ingress
+ include_examples 'cluster application helm specs', :clusters_applications_knative
before do
allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_in)
@@ -88,9 +89,18 @@ describe Clusters::Applications::Ingress do
expect(subject.name).to eq('ingress')
expect(subject.chart).to eq('stable/nginx-ingress')
expect(subject.version).to eq('0.23.0')
+ expect(subject).not_to be_rbac
expect(subject.files).to eq(ingress.files)
end
+ context 'on a rbac enabled cluster' do
+ before do
+ ingress.cluster.platform_kubernetes.rbac!
+ end
+
+ it { is_expected.to be_rbac }
+ end
+
context 'application failed to install previously' do
let(:ingress) { create(:clusters_applications_ingress, :errored, version: 'nginx') }
@@ -112,28 +122,5 @@ describe Clusters::Applications::Ingress do
expect(values).to include('stats')
expect(values).to include('podAnnotations')
end
-
- context 'when the helm application does not have a ca_cert' do
- before do
- application.cluster.application_helm.ca_cert = nil
- end
-
- it 'should not include cert files' do
- expect(subject[:'ca.pem']).not_to be_present
- expect(subject[:'cert.pem']).not_to be_present
- expect(subject[:'key.pem']).not_to be_present
- end
- end
-
- it 'should include cert files' do
- expect(subject[:'ca.pem']).to be_present
- expect(subject[:'ca.pem']).to eq(application.cluster.application_helm.ca_cert)
-
- expect(subject[:'cert.pem']).to be_present
- expect(subject[:'key.pem']).to be_present
-
- cert = OpenSSL::X509::Certificate.new(subject[:'cert.pem'])
- expect(cert.not_after).to be < 60.minutes.from_now
- end
end
end
diff --git a/spec/models/clusters/applications/jupyter_spec.rb b/spec/models/clusters/applications/jupyter_spec.rb
index 027b732681b..faaabafddb7 100644
--- a/spec/models/clusters/applications/jupyter_spec.rb
+++ b/spec/models/clusters/applications/jupyter_spec.rb
@@ -2,6 +2,7 @@ require 'rails_helper'
describe Clusters::Applications::Jupyter do
include_examples 'cluster application core specs', :clusters_applications_jupyter
+ include_examples 'cluster application helm specs', :clusters_applications_knative
it { is_expected.to belong_to(:oauth_application) }
@@ -51,10 +52,19 @@ describe Clusters::Applications::Jupyter do
expect(subject.name).to eq('jupyter')
expect(subject.chart).to eq('jupyter/jupyterhub')
expect(subject.version).to eq('v0.6')
+ expect(subject).not_to be_rbac
expect(subject.repository).to eq('https://jupyterhub.github.io/helm-chart/')
expect(subject.files).to eq(jupyter.files)
end
+ context 'on a rbac enabled cluster' do
+ before do
+ jupyter.cluster.platform_kubernetes.rbac!
+ end
+
+ it { is_expected.to be_rbac }
+ end
+
context 'application failed to install previously' do
let(:jupyter) { create(:clusters_applications_jupyter, :errored, version: '0.0.1') }
@@ -70,37 +80,21 @@ describe Clusters::Applications::Jupyter do
subject { application.files }
- it 'should include cert files' do
- expect(subject[:'ca.pem']).to be_present
- expect(subject[:'ca.pem']).to eq(application.cluster.application_helm.ca_cert)
-
- expect(subject[:'cert.pem']).to be_present
- expect(subject[:'key.pem']).to be_present
-
- cert = OpenSSL::X509::Certificate.new(subject[:'cert.pem'])
- expect(cert.not_after).to be < 60.minutes.from_now
- end
-
- context 'when the helm application does not have a ca_cert' do
- before do
- application.cluster.application_helm.ca_cert = nil
- end
-
- it 'should not include cert files' do
- expect(subject[:'ca.pem']).not_to be_present
- expect(subject[:'cert.pem']).not_to be_present
- expect(subject[:'key.pem']).not_to be_present
- end
- end
-
it 'should include valid values' do
expect(values).to include('ingress')
expect(values).to include('hub')
expect(values).to include('rbac')
expect(values).to include('proxy')
expect(values).to include('auth')
+ expect(values).to include('singleuser')
expect(values).to match(/clientId: '?#{application.oauth_application.uid}/)
expect(values).to match(/callbackUrl: '?#{application.callback_url}/)
end
+
+ context 'when cluster belongs to a project' do
+ it 'sets GitLab project id' do
+ expect(values).to match(/GITLAB_CLUSTER_ID: '?#{application.cluster.id}/)
+ end
+ end
end
end
diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb
new file mode 100644
index 00000000000..be2a91d566b
--- /dev/null
+++ b/spec/models/clusters/applications/knative_spec.rb
@@ -0,0 +1,77 @@
+require 'rails_helper'
+
+describe Clusters::Applications::Knative do
+ let(:knative) { create(:clusters_applications_knative) }
+
+ include_examples 'cluster application core specs', :clusters_applications_knative
+ include_examples 'cluster application status specs', :clusters_applications_knative
+ include_examples 'cluster application helm specs', :clusters_applications_knative
+
+ describe '.installed' do
+ subject { described_class.installed }
+
+ let!(:cluster) { create(:clusters_applications_knative, :installed) }
+
+ before do
+ create(:clusters_applications_knative, :errored)
+ end
+
+ it { is_expected.to contain_exactly(cluster) }
+ end
+
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_knative, :scheduled, version: '0.1.3') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('0.1.3')
+ end
+ end
+ end
+
+ describe '#make_installed' do
+ subject { described_class.installed }
+
+ let!(:cluster) { create(:clusters_applications_knative, :installed) }
+
+ before do
+ create(:clusters_applications_knative, :errored)
+ end
+
+ it { is_expected.to contain_exactly(cluster) }
+ end
+
+ describe '#install_command' do
+ subject { knative.install_command }
+
+ it 'should be an instance of Helm::InstallCommand' do
+ expect(subject).to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand)
+ end
+
+ it 'should be initialized with knative arguments' do
+ expect(subject.name).to eq('knative')
+ expect(subject.chart).to eq('knative/knative')
+ expect(subject.version).to eq('0.1.3')
+ expect(subject.files).to eq(knative.files)
+ end
+ end
+
+ describe '#files' do
+ let(:application) { knative }
+ let(:values) { subject[:'values.yaml'] }
+
+ subject { application.files }
+
+ it 'should include knative specific keys in the values.yaml file' do
+ expect(values).to include('domain')
+ end
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:hostname) }
+ end
+end
diff --git a/spec/models/clusters/applications/prometheus_spec.rb b/spec/models/clusters/applications/prometheus_spec.rb
index 7454be3ab2f..b5aa1dcece5 100644
--- a/spec/models/clusters/applications/prometheus_spec.rb
+++ b/spec/models/clusters/applications/prometheus_spec.rb
@@ -1,8 +1,11 @@
require 'rails_helper'
describe Clusters::Applications::Prometheus do
+ include KubernetesHelpers
+
include_examples 'cluster application core specs', :clusters_applications_prometheus
- include_examples 'cluster application status specs', :cluster_application_prometheus
+ include_examples 'cluster application status specs', :clusters_applications_prometheus
+ include_examples 'cluster application helm specs', :clusters_applications_knative
describe '.installed' do
subject { described_class.installed }
@@ -32,7 +35,7 @@ describe Clusters::Applications::Prometheus do
describe 'transition to installed' do
let(:project) { create(:project) }
- let(:cluster) { create(:cluster, projects: [project]) }
+ let(:cluster) { create(:cluster, :with_installed_helm, projects: [project]) }
let(:prometheus_service) { double('prometheus_service') }
subject { create(:clusters_applications_prometheus, :installing, cluster: cluster) }
@@ -107,26 +110,20 @@ describe Clusters::Applications::Prometheus do
end
context 'cluster has kubeclient' do
- let(:kubernetes_url) { 'http://example.com' }
- let(:k8s_discover_response) do
- {
- resources: [
- {
- name: 'service',
- kind: 'Service'
- }
- ]
- }
- end
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+ let(:kubernetes_url) { subject.cluster.platform_kubernetes.api_url }
+ let(:kube_client) { subject.cluster.kubeclient.core_client }
- let(:kube_client) { Kubeclient::Client.new(kubernetes_url) }
-
- let(:cluster) { create(:cluster) }
subject { create(:clusters_applications_prometheus, cluster: cluster) }
before do
- allow(kube_client.rest_client).to receive(:get).and_return(k8s_discover_response.to_json)
- allow(subject.cluster).to receive(:kubeclient).and_return(kube_client)
+ subject.cluster.platform_kubernetes.namespace = 'a-namespace'
+ stub_kubeclient_discover(cluster.platform_kubernetes.api_url)
+
+ create(:cluster_kubernetes_namespace,
+ cluster: cluster,
+ cluster_project: cluster.cluster_project,
+ project: cluster.cluster_project.project)
end
it 'creates proxy prometheus rest client' do
@@ -134,7 +131,7 @@ describe Clusters::Applications::Prometheus do
end
it 'creates proper url' do
- expect(subject.prometheus_client.url).to eq('http://example.com/api/v1/namespaces/gitlab-managed-apps/service/prometheus-prometheus-server:80/proxy')
+ expect(subject.prometheus_client.url).to eq("#{kubernetes_url}/api/v1/namespaces/gitlab-managed-apps/services/prometheus-prometheus-server:80/proxy")
end
it 'copies options and headers from kube client to proxy client' do
@@ -154,20 +151,26 @@ describe Clusters::Applications::Prometheus do
end
describe '#install_command' do
- let(:kubeclient) { double('kubernetes client') }
let(:prometheus) { create(:clusters_applications_prometheus) }
- it 'returns an instance of Gitlab::Kubernetes::Helm::InstallCommand' do
- expect(prometheus.install_command).to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand)
- end
+ subject { prometheus.install_command }
+
+ it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand) }
it 'should be initialized with 3 arguments' do
- command = prometheus.install_command
+ expect(subject.name).to eq('prometheus')
+ expect(subject.chart).to eq('stable/prometheus')
+ expect(subject.version).to eq('6.7.3')
+ expect(subject).not_to be_rbac
+ expect(subject.files).to eq(prometheus.files)
+ end
+
+ context 'on a rbac enabled cluster' do
+ before do
+ prometheus.cluster.platform_kubernetes.rbac!
+ end
- expect(command.name).to eq('prometheus')
- expect(command.chart).to eq('stable/prometheus')
- expect(command.version).to eq('6.7.3')
- expect(command.files).to eq(prometheus.files)
+ it { is_expected.to be_rbac }
end
context 'application failed to install previously' do
@@ -185,29 +188,6 @@ describe Clusters::Applications::Prometheus do
subject { application.files }
- it 'should include cert files' do
- expect(subject[:'ca.pem']).to be_present
- expect(subject[:'ca.pem']).to eq(application.cluster.application_helm.ca_cert)
-
- expect(subject[:'cert.pem']).to be_present
- expect(subject[:'key.pem']).to be_present
-
- cert = OpenSSL::X509::Certificate.new(subject[:'cert.pem'])
- expect(cert.not_after).to be < 60.minutes.from_now
- end
-
- context 'when the helm application does not have a ca_cert' do
- before do
- application.cluster.application_helm.ca_cert = nil
- end
-
- it 'should not include cert files' do
- expect(subject[:'ca.pem']).not_to be_present
- expect(subject[:'cert.pem']).not_to be_present
- expect(subject[:'key.pem']).not_to be_present
- end
- end
-
it 'should include prometheus valid values' do
expect(values).to include('alertmanager')
expect(values).to include('kubeStateMetrics')
diff --git a/spec/models/clusters/applications/runner_spec.rb b/spec/models/clusters/applications/runner_spec.rb
index d84f125e246..052cfdbc4b1 100644
--- a/spec/models/clusters/applications/runner_spec.rb
+++ b/spec/models/clusters/applications/runner_spec.rb
@@ -4,7 +4,8 @@ describe Clusters::Applications::Runner do
let(:ci_runner) { create(:ci_runner) }
include_examples 'cluster application core specs', :clusters_applications_runner
- include_examples 'cluster application status specs', :cluster_application_runner
+ include_examples 'cluster application status specs', :clusters_applications_runner
+ include_examples 'cluster application helm specs', :clusters_applications_knative
it { is_expected.to belong_to(:runner) }
@@ -17,7 +18,7 @@ describe Clusters::Applications::Runner do
let(:application) { create(:clusters_applications_runner, :scheduled, version: '0.1.30') }
it 'updates the application version' do
- expect(application.reload.version).to eq('0.1.31')
+ expect(application.reload.version).to eq('0.1.35')
end
end
end
@@ -45,16 +46,25 @@ describe Clusters::Applications::Runner do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('runner')
expect(subject.chart).to eq('runner/gitlab-runner')
- expect(subject.version).to eq('0.1.31')
+ expect(subject.version).to eq('0.1.35')
+ expect(subject).not_to be_rbac
expect(subject.repository).to eq('https://charts.gitlab.io')
expect(subject.files).to eq(gitlab_runner.files)
end
+ context 'on a rbac enabled cluster' do
+ before do
+ gitlab_runner.cluster.platform_kubernetes.rbac!
+ end
+
+ it { is_expected.to be_rbac }
+ end
+
context 'application failed to install previously' do
let(:gitlab_runner) { create(:clusters_applications_runner, :errored, runner: ci_runner, version: '0.1.13') }
it 'should be initialized with the locked version' do
- expect(subject.version).to eq('0.1.31')
+ expect(subject.version).to eq('0.1.35')
end
end
end
@@ -65,29 +75,6 @@ describe Clusters::Applications::Runner do
subject { application.files }
- it 'should include cert files' do
- expect(subject[:'ca.pem']).to be_present
- expect(subject[:'ca.pem']).to eq(application.cluster.application_helm.ca_cert)
-
- expect(subject[:'cert.pem']).to be_present
- expect(subject[:'key.pem']).to be_present
-
- cert = OpenSSL::X509::Certificate.new(subject[:'cert.pem'])
- expect(cert.not_after).to be < 60.minutes.from_now
- end
-
- context 'when the helm application does not have a ca_cert' do
- before do
- application.cluster.application_helm.ca_cert = nil
- end
-
- it 'should not include cert files' do
- expect(subject[:'ca.pem']).not_to be_present
- expect(subject[:'cert.pem']).not_to be_present
- expect(subject[:'key.pem']).not_to be_present
- end
- end
-
it 'should include runner valid values' do
expect(values).to include('concurrent')
expect(values).to include('checkInterval')
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb
index 6f66515b45f..98d7e799d67 100644
--- a/spec/models/clusters/cluster_spec.rb
+++ b/spec/models/clusters/cluster_spec.rb
@@ -1,18 +1,33 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Clusters::Cluster do
it { is_expected.to belong_to(:user) }
+ it { is_expected.to have_many(:cluster_projects) }
it { is_expected.to have_many(:projects) }
+ it { is_expected.to have_many(:cluster_groups) }
+ it { is_expected.to have_many(:groups) }
it { is_expected.to have_one(:provider_gcp) }
it { is_expected.to have_one(:platform_kubernetes) }
it { is_expected.to have_one(:application_helm) }
it { is_expected.to have_one(:application_ingress) }
it { is_expected.to have_one(:application_prometheus) }
it { is_expected.to have_one(:application_runner) }
+ it { is_expected.to have_many(:kubernetes_namespaces) }
+ it { is_expected.to have_one(:kubernetes_namespace) }
+ it { is_expected.to have_one(:cluster_project) }
+
it { is_expected.to delegate_method(:status).to(:provider) }
it { is_expected.to delegate_method(:status_reason).to(:provider) }
it { is_expected.to delegate_method(:status_name).to(:provider) }
it { is_expected.to delegate_method(:on_creation?).to(:provider) }
+ it { is_expected.to delegate_method(:active?).to(:platform_kubernetes).with_prefix }
+ it { is_expected.to delegate_method(:rbac?).to(:platform_kubernetes).with_prefix }
+ it { is_expected.to delegate_method(:available?).to(:application_helm).with_prefix }
+ it { is_expected.to delegate_method(:available?).to(:application_ingress).with_prefix }
+ it { is_expected.to delegate_method(:available?).to(:application_prometheus).with_prefix }
+
it { is_expected.to respond_to :project }
describe '.enabled' do
@@ -167,6 +182,53 @@ describe Clusters::Cluster do
it { expect(cluster.update(enabled: false)).to be_truthy }
end
end
+
+ describe 'cluster_type validations' do
+ let(:instance_cluster) { create(:cluster, :instance) }
+ let(:group_cluster) { create(:cluster, :group) }
+ let(:project_cluster) { create(:cluster, :project) }
+
+ it 'validates presence' do
+ cluster = build(:cluster, :project, cluster_type: nil)
+
+ expect(cluster).not_to be_valid
+ expect(cluster.errors.full_messages).to include("Cluster type can't be blank")
+ end
+
+ context 'project_type cluster' do
+ it 'does not allow setting group' do
+ project_cluster.groups << build(:group)
+
+ expect(project_cluster).not_to be_valid
+ expect(project_cluster.errors.full_messages).to include('Cluster cannot have groups assigned')
+ end
+ end
+
+ context 'group_type cluster' do
+ it 'does not allow setting project' do
+ group_cluster.projects << build(:project)
+
+ expect(group_cluster).not_to be_valid
+ expect(group_cluster.errors.full_messages).to include('Cluster cannot have projects assigned')
+ end
+ end
+
+ context 'instance_type cluster' do
+ it 'does not allow setting group' do
+ instance_cluster.groups << build(:group)
+
+ expect(instance_cluster).not_to be_valid
+ expect(instance_cluster.errors.full_messages).to include('Cluster cannot have groups assigned')
+ end
+
+ it 'does not allow setting project' do
+ instance_cluster.projects << build(:project)
+
+ expect(instance_cluster).not_to be_valid
+ expect(instance_cluster.errors.full_messages).to include('Cluster cannot have projects assigned')
+ end
+ end
+ end
end
describe '#provider' do
@@ -218,6 +280,23 @@ describe Clusters::Cluster do
end
end
+ describe '#group' do
+ subject { cluster.group }
+
+ context 'when cluster belongs to a group' do
+ let(:cluster) { create(:cluster, :group) }
+ let(:group) { cluster.groups.first }
+
+ it { is_expected.to eq(group) }
+ end
+
+ context 'when cluster does not belong to any group' do
+ let(:cluster) { create(:cluster) }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
describe '#applications' do
set(:cluster) { create(:cluster) }
@@ -235,9 +314,10 @@ describe Clusters::Cluster do
let!(:prometheus) { create(:clusters_applications_prometheus, cluster: cluster) }
let!(:runner) { create(:clusters_applications_runner, cluster: cluster) }
let!(:jupyter) { create(:clusters_applications_jupyter, cluster: cluster) }
+ let!(:knative) { create(:clusters_applications_knative, cluster: cluster) }
it 'returns a list of created applications' do
- is_expected.to contain_exactly(helm, ingress, prometheus, runner, jupyter)
+ is_expected.to contain_exactly(helm, ingress, prometheus, runner, jupyter, knative)
end
end
end
@@ -263,4 +343,26 @@ describe Clusters::Cluster do
it { is_expected.to eq(false) }
end
end
+
+ describe '#allow_user_defined_namespace?' do
+ let(:cluster) { create(:cluster, :provided_by_gcp) }
+
+ subject { cluster.allow_user_defined_namespace? }
+
+ context 'project type cluster' do
+ it { is_expected.to be_truthy }
+ end
+
+ context 'group type cluster' do
+ let(:cluster) { create(:cluster, :provided_by_gcp, :group) }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'instance type cluster' do
+ let(:cluster) { create(:cluster, :provided_by_gcp, :instance) }
+
+ it { is_expected.to be_falsey }
+ end
+ end
end
diff --git a/spec/models/clusters/group_spec.rb b/spec/models/clusters/group_spec.rb
new file mode 100644
index 00000000000..ba145342cb8
--- /dev/null
+++ b/spec/models/clusters/group_spec.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Group do
+ it { is_expected.to belong_to(:cluster) }
+ it { is_expected.to belong_to(:group) }
+end
diff --git a/spec/models/clusters/kubernetes_namespace_spec.rb b/spec/models/clusters/kubernetes_namespace_spec.rb
new file mode 100644
index 00000000000..56c98d016c9
--- /dev/null
+++ b/spec/models/clusters/kubernetes_namespace_spec.rb
@@ -0,0 +1,123 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::KubernetesNamespace, type: :model do
+ it { is_expected.to belong_to(:cluster_project) }
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:cluster) }
+ it { is_expected.to have_one(:platform_kubernetes) }
+
+ describe 'has_service_account_token' do
+ subject { described_class.has_service_account_token }
+
+ context 'namespace has service_account_token' do
+ let!(:namespace) { create(:cluster_kubernetes_namespace, :with_token) }
+
+ it { is_expected.to include(namespace) }
+ end
+
+ context 'namespace has no service_account_token' do
+ let!(:namespace) { create(:cluster_kubernetes_namespace) }
+
+ it { is_expected.not_to include(namespace) }
+ end
+ end
+
+ describe 'namespace uniqueness validation' do
+ let(:cluster_project) { create(:cluster_project) }
+ let(:kubernetes_namespace) { build(:cluster_kubernetes_namespace, namespace: 'my-namespace') }
+
+ subject { kubernetes_namespace }
+
+ context 'when cluster is using the namespace' do
+ before do
+ create(:cluster_kubernetes_namespace,
+ cluster: kubernetes_namespace.cluster,
+ namespace: 'my-namespace')
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when cluster is not using the namespace' do
+ it { is_expected.to be_valid }
+ end
+ end
+
+ describe '#set_defaults' do
+ let(:kubernetes_namespace) { build(:cluster_kubernetes_namespace) }
+ let(:cluster) { kubernetes_namespace.cluster }
+ let(:platform) { kubernetes_namespace.platform_kubernetes }
+
+ subject { kubernetes_namespace.set_defaults }
+
+ describe '#namespace' do
+ before do
+ platform.update_column(:namespace, namespace)
+ end
+
+ context 'when platform has a namespace assigned' do
+ let(:namespace) { 'platform-namespace' }
+
+ it 'should copy the namespace' do
+ subject
+
+ expect(kubernetes_namespace.namespace).to eq('platform-namespace')
+ end
+ end
+
+ context 'when platform does not have namespace assigned' do
+ let(:project) { kubernetes_namespace.project }
+ let(:namespace) { nil }
+ let(:project_slug) { "#{project.path}-#{project.id}" }
+
+ it 'should fallback to project namespace' do
+ subject
+
+ expect(kubernetes_namespace.namespace).to eq(project_slug)
+ end
+ end
+ end
+
+ describe '#service_account_name' do
+ let(:service_account_name) { "#{kubernetes_namespace.namespace}-service-account" }
+
+ it 'should set a service account name based on namespace' do
+ subject
+
+ expect(kubernetes_namespace.service_account_name).to eq(service_account_name)
+ end
+ end
+ end
+
+ describe '#predefined_variables' do
+ let(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, cluster: cluster, service_account_token: token) }
+ let(:cluster) { create(:cluster, :project, platform_kubernetes: platform) }
+ let(:platform) { create(:cluster_platform_kubernetes, api_url: api_url, ca_cert: ca_pem, token: token) }
+
+ let(:api_url) { 'https://kube.domain.com' }
+ let(:ca_pem) { 'CA PEM DATA' }
+ let(:token) { 'token' }
+
+ let(:kubeconfig) do
+ config_file = expand_fixture_path('config/kubeconfig.yml')
+ config = YAML.safe_load(File.read(config_file))
+ config.dig('users', 0, 'user')['token'] = token
+ config.dig('contexts', 0, 'context')['namespace'] = kubernetes_namespace.namespace
+ config.dig('clusters', 0, 'cluster')['certificate-authority-data'] =
+ Base64.strict_encode64(ca_pem)
+
+ YAML.dump(config)
+ end
+
+ it 'sets the variables' do
+ expect(kubernetes_namespace.predefined_variables).to include(
+ { key: 'KUBE_SERVICE_ACCOUNT', value: kubernetes_namespace.service_account_name, public: true },
+ { key: 'KUBE_NAMESPACE', value: kubernetes_namespace.namespace, public: true },
+ { key: 'KUBE_TOKEN', value: kubernetes_namespace.service_account_token, public: false },
+ { key: 'KUBECONFIG', value: kubeconfig, public: false, file: true }
+ )
+ end
+ end
+end
diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb
index ab7f89f9bf4..99fd6ccc4d8 100644
--- a/spec/models/clusters/platforms/kubernetes_spec.rb
+++ b/spec/models/clusters/platforms/kubernetes_spec.rb
@@ -9,6 +9,15 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { is_expected.to be_kind_of(ReactiveCaching) }
it { is_expected.to respond_to :ca_pem }
+ it { is_expected.to validate_exclusion_of(:namespace).in_array(%w(gitlab-managed-apps)) }
+ it { is_expected.to validate_presence_of(:api_url) }
+ it { is_expected.to validate_presence_of(:token) }
+
+ it { is_expected.to delegate_method(:project).to(:cluster) }
+ it { is_expected.to delegate_method(:enabled?).to(:cluster) }
+ it { is_expected.to delegate_method(:managed?).to(:cluster) }
+ it { is_expected.to delegate_method(:kubernetes_namespace).to(:cluster) }
+
describe 'before_validation' do
context 'when namespace includes upper case' do
let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) }
@@ -49,6 +58,18 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { is_expected.to be_truthy }
end
+
+ context 'for group cluster' do
+ let(:namespace) { 'namespace-123' }
+ let(:cluster) { build(:cluster, :group, :provided_by_user) }
+ let(:kubernetes) { cluster.platform_kubernetes }
+
+ before do
+ kubernetes.namespace = namespace
+ end
+
+ it { is_expected.to be_falsey }
+ end
end
context 'when validates api_url' do
@@ -90,78 +111,141 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { expect(kubernetes.save).to be_falsey }
end
end
- end
- describe '#actual_namespace' do
- subject { kubernetes.actual_namespace }
+ describe 'when using reserved namespaces' do
+ subject { build(:cluster_platform_kubernetes, namespace: namespace) }
- let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
- let(:project) { cluster.project }
- let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) }
+ context 'when no namespace is manually assigned' do
+ let(:namespace) { nil }
- context 'when namespace is present' do
- let(:namespace) { 'namespace-123' }
+ it { is_expected.to be_valid }
+ end
- it { is_expected.to eq(namespace) }
+ context 'when no reserved namespace is assigned' do
+ let(:namespace) { 'my-namespace' }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when reserved namespace is assigned' do
+ let(:namespace) { 'gitlab-managed-apps' }
+
+ it { is_expected.not_to be_valid }
+ end
end
+ end
- context 'when namespace is not present' do
- let(:namespace) { nil }
+ describe '#kubeclient' do
+ let(:cluster) { create(:cluster, :project) }
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :configured, namespace: 'a-namespace', cluster: cluster) }
- it { is_expected.to eq("#{project.path}-#{project.id}") }
+ subject { kubernetes.kubeclient }
+
+ before do
+ create(:cluster_kubernetes_namespace,
+ cluster: kubernetes.cluster,
+ cluster_project: kubernetes.cluster.cluster_project,
+ project: kubernetes.cluster.cluster_project.project)
end
+
+ it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::KubeClient) }
end
- describe '#default_namespace' do
- subject { kubernetes.send(:default_namespace) }
+ describe '#rbac?' do
+ subject { kubernetes.rbac? }
- let(:kubernetes) { create(:cluster_platform_kubernetes, :configured) }
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :configured) }
- context 'when cluster belongs to a project' do
- let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
- let(:project) { cluster.project }
+ context 'when authorization type is rbac' do
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :rbac_enabled, :configured) }
- it { is_expected.to eq("#{project.path}-#{project.id}") }
+ it { is_expected.to be_truthy }
end
- context 'when cluster belongs to nothing' do
- let!(:cluster) { create(:cluster, platform_kubernetes: kubernetes) }
+ context 'when authorization type is nil' do
+ it { is_expected.to be_falsey }
+ end
+ end
- it { is_expected.to be_nil }
+ describe '#actual_namespace' do
+ let(:cluster) { create(:cluster, :project) }
+ let(:project) { cluster.project }
+
+ let(:platform) do
+ create(:cluster_platform_kubernetes,
+ cluster: cluster,
+ namespace: namespace)
+ end
+
+ subject { platform.actual_namespace }
+
+ context 'with a namespace assigned' do
+ let(:namespace) { 'namespace-123' }
+
+ it { is_expected.to eq(namespace) }
+ end
+
+ context 'with no namespace assigned' do
+ let(:namespace) { nil }
+
+ context 'when kubernetes namespace is present' do
+ let(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, cluster: cluster) }
+
+ before do
+ kubernetes_namespace
+ end
+
+ it { is_expected.to eq(kubernetes_namespace.namespace) }
+ end
+
+ context 'when kubernetes namespace is not present' do
+ it { is_expected.to eq("#{project.path}-#{project.id}") }
+ end
end
end
describe '#predefined_variables' do
let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
- let(:kubernetes) { create(:cluster_platform_kubernetes, api_url: api_url, ca_cert: ca_pem, token: token) }
+ let(:kubernetes) { create(:cluster_platform_kubernetes, api_url: api_url, ca_cert: ca_pem) }
let(:api_url) { 'https://kube.domain.com' }
let(:ca_pem) { 'CA PEM DATA' }
- let(:token) { 'token' }
- let(:kubeconfig) do
- config_file = expand_fixture_path('config/kubeconfig.yml')
- config = YAML.load(File.read(config_file))
- config.dig('users', 0, 'user')['token'] = token
- config.dig('contexts', 0, 'context')['namespace'] = namespace
- config.dig('clusters', 0, 'cluster')['certificate-authority-data'] =
- Base64.strict_encode64(ca_pem)
-
- YAML.dump(config)
- end
+ subject { kubernetes.predefined_variables(project: cluster.project) }
shared_examples 'setting variables' do
it 'sets the variables' do
- expect(kubernetes.predefined_variables).to include(
+ expect(subject).to include(
{ key: 'KUBE_URL', value: api_url, public: true },
- { key: 'KUBE_TOKEN', value: token, public: false },
- { key: 'KUBE_NAMESPACE', value: namespace, public: true },
- { key: 'KUBECONFIG', value: kubeconfig, public: false, file: true },
{ key: 'KUBE_CA_PEM', value: ca_pem, public: true },
{ key: 'KUBE_CA_PEM_FILE', value: ca_pem, public: true, file: true }
)
end
end
+ context 'kubernetes namespace is created with no service account token' do
+ let!(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, cluster: cluster) }
+
+ it_behaves_like 'setting variables'
+
+ it 'sets KUBE_TOKEN' do
+ expect(subject).to include(
+ { key: 'KUBE_TOKEN', value: kubernetes.token, public: false }
+ )
+ end
+ end
+
+ context 'kubernetes namespace is created with no service account token' do
+ let!(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, :with_token, cluster: cluster) }
+
+ it_behaves_like 'setting variables'
+
+ it 'sets KUBE_TOKEN' do
+ expect(subject).to include(
+ { key: 'KUBE_TOKEN', value: kubernetes_namespace.service_account_token, public: false }
+ )
+ end
+ end
+
context 'namespace is provided' do
let(:namespace) { 'my-project' }
@@ -170,6 +254,12 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
end
it_behaves_like 'setting variables'
+
+ it 'sets KUBE_TOKEN' do
+ expect(subject).to include(
+ { key: 'KUBE_TOKEN', value: kubernetes.token, public: false }
+ )
+ end
end
context 'no namespace provided' do
@@ -177,11 +267,10 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it_behaves_like 'setting variables'
- it 'sets the KUBE_NAMESPACE' do
- kube_namespace = kubernetes.predefined_variables.find { |h| h[:key] == 'KUBE_NAMESPACE' }
-
- expect(kube_namespace).not_to be_nil
- expect(kube_namespace[:value]).to match(/\A#{Gitlab::PathRegex::PATH_REGEX_STR}-\d+\z/)
+ it 'sets KUBE_TOKEN' do
+ expect(subject).to include(
+ { key: 'KUBE_TOKEN', value: kubernetes.token, public: false }
+ )
end
end
end
@@ -266,4 +355,27 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { is_expected.to include(pods: []) }
end
end
+
+ describe '#update_kubernetes_namespace' do
+ let(:cluster) { create(:cluster, :provided_by_gcp) }
+ let(:platform) { cluster.platform }
+
+ context 'when namespace is updated' do
+ it 'should call ConfigureWorker' do
+ expect(ClusterPlatformConfigureWorker).to receive(:perform_async).with(cluster.id).once
+
+ platform.namespace = 'new-namespace'
+ platform.save
+ end
+ end
+
+ context 'when namespace is not updated' do
+ it 'should not call ConfigureWorker' do
+ expect(ClusterPlatformConfigureWorker).not_to receive(:perform_async)
+
+ platform.username = "new-username"
+ platform.save
+ end
+ end
+ end
end
diff --git a/spec/models/clusters/project_spec.rb b/spec/models/clusters/project_spec.rb
index 7d75d6ab345..82ef5a23c18 100644
--- a/spec/models/clusters/project_spec.rb
+++ b/spec/models/clusters/project_spec.rb
@@ -3,4 +3,6 @@ require 'spec_helper'
describe Clusters::Project do
it { is_expected.to belong_to(:cluster) }
it { is_expected.to belong_to(:project) }
+ it { is_expected.to have_many(:kubernetes_namespaces) }
+ it { is_expected.to have_one(:kubernetes_namespace) }
end
diff --git a/spec/models/clusters/providers/gcp_spec.rb b/spec/models/clusters/providers/gcp_spec.rb
index b38b5e6bcad..d134608b538 100644
--- a/spec/models/clusters/providers/gcp_spec.rb
+++ b/spec/models/clusters/providers/gcp_spec.rb
@@ -74,6 +74,24 @@ describe Clusters::Providers::Gcp do
end
end
+ describe '#legacy_abac?' do
+ let(:gcp) { build(:cluster_provider_gcp) }
+
+ subject { gcp }
+
+ it 'should default to true' do
+ is_expected.to be_legacy_abac
+ end
+
+ context 'legacy_abac is set to false' do
+ let(:gcp) { build(:cluster_provider_gcp, legacy_abac: false) }
+
+ it 'is false' do
+ is_expected.not_to be_legacy_abac
+ end
+ end
+ end
+
describe '#state_machine' do
context 'when any => [:created]' do
let(:gcp) { build(:cluster_provider_gcp, :creating) }
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 5157d8fc645..2a0039a0635 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -65,13 +65,14 @@ describe Commit do
key = "Commit:author:#{commit.author_email.downcase}"
- expect(RequestStore.store[key]).to eq(user)
+ expect(Gitlab::SafeRequestStore[key]).to eq(user)
expect(commit.author).to eq(user)
end
context 'using eager loading' do
let!(:alice) { create(:user, email: 'alice@example.com') }
let!(:bob) { create(:user, email: 'hunter2@example.com') }
+ let!(:jeff) { create(:user) }
let(:alice_commit) do
described_class.new(RepoHelpers.sample_commit, project).tap do |c|
@@ -93,7 +94,14 @@ describe Commit do
end
end
- let!(:commits) { [alice_commit, bob_commit, eve_commit] }
+ let(:jeff_commit) do
+ # The commit for Jeff uses his private commit email
+ described_class.new(RepoHelpers.sample_commit, project).tap do |c|
+ c.author_email = jeff.private_commit_email
+ end
+ end
+
+ let!(:commits) { [alice_commit, bob_commit, eve_commit, jeff_commit] }
before do
create(:email, user: bob, email: 'bob@example.com')
@@ -125,6 +133,20 @@ describe Commit do
expect(bob_commit.author).to eq(bob)
end
+ it "preloads the authors for Commits using a User's private commit Email" do
+ commits.each(&:lazy_author)
+
+ expect(jeff_commit.author).to eq(jeff)
+ end
+
+ it "preloads the authors for Commits using a User's outdated private commit Email" do
+ jeff.update!(username: 'new-username')
+
+ commits.each(&:lazy_author)
+
+ expect(jeff_commit.author).to eq(jeff)
+ end
+
it 'sets the author to Nil if an author could not be found for a Commit' do
commits.each(&:lazy_author)
@@ -225,6 +247,12 @@ eos
end
describe 'description' do
+ it 'returns no_commit_message when safe_message is blank' do
+ allow(commit).to receive(:safe_message).and_return(nil)
+
+ expect(commit.description).to eq('--no commit message')
+ end
+
it 'returns description of commit message if title less than 100 characters' do
message = <<eos
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales id felis id blandit.
@@ -264,11 +292,11 @@ eos
let(:issue) { create :issue, project: project }
let(:other_project) { create(:project, :public) }
let(:other_issue) { create :issue, project: other_project }
- let(:commiter) { create :user }
+ let(:committer) { create :user }
before do
- project.add_developer(commiter)
- other_project.add_developer(commiter)
+ project.add_developer(committer)
+ other_project.add_developer(committer)
end
it 'detects issues that this commit is marked as closing' do
@@ -276,7 +304,7 @@ eos
allow(commit).to receive_messages(
safe_message: "Fixes ##{issue.iid} and #{ext_ref}",
- committer_email: commiter.email
+ committer_email: committer.email
)
expect(commit.closes_issues).to include(issue)
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index f3f2bc28d2c..917685399d4 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -129,6 +129,20 @@ describe CommitStatus do
end
end
+ describe '#cancel' do
+ subject { job.cancel }
+
+ context 'when status is scheduled' do
+ let(:job) { build(:commit_status, :scheduled) }
+
+ it 'updates the status' do
+ subject
+
+ expect(job).to be_canceled
+ end
+ end
+ end
+
describe '#auto_canceled?' do
subject { commit_status.auto_canceled? }
@@ -564,6 +578,12 @@ describe CommitStatus do
it_behaves_like 'commit status enqueued'
end
+
+ context 'when initial state is :scheduled' do
+ let(:commit_status) { create(:commit_status, :scheduled) }
+
+ it_behaves_like 'commit status enqueued'
+ end
end
describe '#present' do
diff --git a/spec/models/compare_spec.rb b/spec/models/compare_spec.rb
index 8e88bb81162..0bc3ee014e6 100644
--- a/spec/models/compare_spec.rb
+++ b/spec/models/compare_spec.rb
@@ -92,4 +92,33 @@ describe Compare do
expect(subject.diff_refs.head_sha).to eq(head_commit.id)
end
end
+
+ describe '#modified_paths' do
+ context 'changes are present' do
+ let(:raw_compare) do
+ Gitlab::Git::Compare.new(
+ project.repository.raw_repository, 'before-create-delete-modify-move', 'after-create-delete-modify-move'
+ )
+ end
+
+ it 'returns affected file paths, without duplication' do
+ expect(subject.modified_paths).to contain_exactly(*%w{
+ foo/for_move.txt
+ foo/bar/for_move.txt
+ foo/for_create.txt
+ foo/for_delete.txt
+ foo/for_edit.txt
+ })
+ end
+ end
+
+ context 'changes are absent' do
+ let(:start_commit) { sample_commit }
+ let(:head_commit) { sample_commit }
+
+ it 'returns empty array' do
+ expect(subject.modified_paths).to eq([])
+ end
+ end
+ end
end
diff --git a/spec/models/concerns/avatarable_spec.rb b/spec/models/concerns/avatarable_spec.rb
index 76f734079b7..7d617cb7b19 100644
--- a/spec/models/concerns/avatarable_spec.rb
+++ b/spec/models/concerns/avatarable_spec.rb
@@ -12,6 +12,26 @@ describe Avatarable do
stub_config_setting(relative_url_root: relative_url_root)
end
+ describe '#update' do
+ let(:validator) { project._validators[:avatar].detect { |v| v.is_a?(FileSizeValidator) } }
+
+ context 'when avatar changed' do
+ it 'validates the file size' do
+ expect(validator).to receive(:validate_each).and_call_original
+
+ project.update(avatar: 'uploads/avatar.png')
+ end
+ end
+
+ context 'when avatar was not changed' do
+ it 'skips validation of file size' do
+ expect(validator).not_to receive(:validate_each)
+
+ project.update(name: 'Hello world')
+ end
+ end
+ end
+
describe '#avatar_path' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/models/concerns/awardable_spec.rb b/spec/models/concerns/awardable_spec.rb
index a980cff28fb..5713106418d 100644
--- a/spec/models/concerns/awardable_spec.rb
+++ b/spec/models/concerns/awardable_spec.rb
@@ -24,13 +24,29 @@ describe Awardable do
end
end
- describe ".awarded" do
+ describe "#awarded" do
it "filters by user and emoji name" do
expect(Issue.awarded(award_emoji.user, "thumbsup")).to be_empty
expect(Issue.awarded(award_emoji.user, "thumbsdown")).to eq [issue]
expect(Issue.awarded(award_emoji2.user, "thumbsup")).to eq [issue2]
expect(Issue.awarded(award_emoji2.user, "thumbsdown")).to be_empty
end
+
+ it "filters by user and any emoji" do
+ issue3 = create(:issue)
+ create(:award_emoji, awardable: issue3, name: "star", user: award_emoji.user)
+ create(:award_emoji, awardable: issue3, name: "star", user: award_emoji2.user)
+
+ expect(Issue.awarded(award_emoji.user)).to contain_exactly(issue, issue3)
+ expect(Issue.awarded(award_emoji2.user)).to contain_exactly(issue2, issue3)
+ end
+ end
+
+ describe "#not_awarded" do
+ it "returns issues not awarded by user" do
+ expect(Issue.not_awarded(award_emoji.user)).to eq [issue2]
+ expect(Issue.not_awarded(award_emoji2.user)).to eq [issue]
+ end
end
end
@@ -53,21 +69,14 @@ describe Awardable do
issue.project.add_guest(user)
end
- it 'does not allow upvoting or downvoting your own issue' do
- issue.update!(author: user)
-
- expect(issue.user_can_award?(user, AwardEmoji::DOWNVOTE_NAME)).to be_falsy
- expect(issue.user_can_award?(user, AwardEmoji::UPVOTE_NAME)).to be_falsy
- end
-
it 'is truthy when the user is allowed to award emoji' do
- expect(issue.user_can_award?(user, AwardEmoji::UPVOTE_NAME)).to be_truthy
+ expect(issue.user_can_award?(user)).to be_truthy
end
it 'is falsy when the project is archived' do
issue.project.update!(archived: true)
- expect(issue.user_can_award?(user, AwardEmoji::UPVOTE_NAME)).to be_falsy
+ expect(issue.user_can_award?(user)).to be_falsy
end
end
diff --git a/spec/models/concerns/blob_language_from_git_attributes_spec.rb b/spec/models/concerns/blob_language_from_git_attributes_spec.rb
new file mode 100644
index 00000000000..7f05073b08e
--- /dev/null
+++ b/spec/models/concerns/blob_language_from_git_attributes_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe BlobLanguageFromGitAttributes do
+ include FakeBlobHelpers
+
+ let(:project) { build(:project, :repository) }
+
+ describe '#language_from_gitattributes' do
+ subject(:blob) { fake_blob(path: 'file.md') }
+
+ it 'returns return value from gitattribute' do
+ expect(blob.project.repository).to receive(:gitattribute).with(blob.path, 'gitlab-language').and_return('erb?parent=json')
+
+ expect(blob.language_from_gitattributes).to eq('erb?parent=json')
+ end
+
+ it 'returns nil if project is absent' do
+ allow(blob).to receive(:project).and_return(nil)
+
+ expect(blob.language_from_gitattributes).to eq(nil)
+ end
+ end
+end
diff --git a/spec/models/concerns/cache_markdown_field_spec.rb b/spec/models/concerns/cache_markdown_field_spec.rb
index da26d802688..f8d50e89d40 100644
--- a/spec/models/concerns/cache_markdown_field_spec.rb
+++ b/spec/models/concerns/cache_markdown_field_spec.rb
@@ -331,11 +331,12 @@ describe CacheMarkdownField do
end
context 'with a project' do
- let(:thing) { thing_subclass(:project).new(foo: markdown, foo_html: html, project: :project_value) }
+ let(:project) { create(:project, group: create(:group)) }
+ let(:thing) { thing_subclass(:project).new(foo: markdown, foo_html: html, project: project) }
it 'sets the project in the context' do
is_expected.to have_key(:project)
- expect(context[:project]).to eq(:project_value)
+ expect(context[:project]).to eq(project)
end
it 'invalidates the cache when project changes' do
diff --git a/spec/models/concerns/cacheable_attributes_spec.rb b/spec/models/concerns/cacheable_attributes_spec.rb
index f8c2e29fadd..827fbc9d7d5 100644
--- a/spec/models/concerns/cacheable_attributes_spec.rb
+++ b/spec/models/concerns/cacheable_attributes_spec.rb
@@ -41,7 +41,7 @@ describe CacheableAttributes do
expect(minimal_test_class.current_without_cache).to eq(minimal_test_class.last)
end
- it 'can be overriden' do
+ it 'can be overridden' do
minimal_test_class.define_singleton_method(:current_without_cache) do
first
end
@@ -64,7 +64,7 @@ describe CacheableAttributes do
context 'with defaults defined' do
include_context 'with defaults'
- it 'can be overriden' do
+ it 'can be overridden' do
expect(minimal_test_class.defaults).to eq({ foo: 'a', bar: 'b', baz: 'c' })
end
end
diff --git a/spec/models/concerns/case_sensitivity_spec.rb b/spec/models/concerns/case_sensitivity_spec.rb
index 5c0dfaeb4d3..1bf6c9b3404 100644
--- a/spec/models/concerns/case_sensitivity_spec.rb
+++ b/spec/models/concerns/case_sensitivity_spec.rb
@@ -3,186 +3,50 @@ require 'spec_helper'
describe CaseSensitivity do
describe '.iwhere' do
let(:connection) { ActiveRecord::Base.connection }
- let(:model) { Class.new { include CaseSensitivity } }
-
- describe 'using PostgreSQL' do
- before do
- allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
- allow(Gitlab::Database).to receive(:mysql?).and_return(false)
- end
-
- describe 'with a single column/value pair' do
- it 'returns the criteria for a column and a value' do
- criteria = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:foo)
- .and_return('"foo"')
-
- expect(model).to receive(:where)
- .with(%q{LOWER("foo") = LOWER(:value)}, value: 'bar')
- .and_return(criteria)
-
- expect(model.iwhere(foo: 'bar')).to eq(criteria)
- end
-
- it 'returns the criteria for a column with a table, and a value' do
- criteria = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.bar')
- .and_return('"foo"."bar"')
-
- expect(model).to receive(:where)
- .with(%q{LOWER("foo"."bar") = LOWER(:value)}, value: 'bar')
- .and_return(criteria)
-
- expect(model.iwhere('foo.bar'.to_sym => 'bar')).to eq(criteria)
- end
- end
-
- describe 'with multiple column/value pairs' do
- it 'returns the criteria for a column and a value' do
- initial = double(:criteria)
- final = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:foo)
- .and_return('"foo"')
-
- expect(connection).to receive(:quote_table_name)
- .with(:bar)
- .and_return('"bar"')
-
- expect(model).to receive(:where)
- .with(%q{LOWER("foo") = LOWER(:value)}, value: 'bar')
- .and_return(initial)
-
- expect(initial).to receive(:where)
- .with(%q{LOWER("bar") = LOWER(:value)}, value: 'baz')
- .and_return(final)
-
- got = model.iwhere(foo: 'bar', bar: 'baz')
-
- expect(got).to eq(final)
- end
-
- it 'returns the criteria for a column with a table, and a value' do
- initial = double(:criteria)
- final = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.bar')
- .and_return('"foo"."bar"')
-
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.baz')
- .and_return('"foo"."baz"')
-
- expect(model).to receive(:where)
- .with(%q{LOWER("foo"."bar") = LOWER(:value)}, value: 'bar')
- .and_return(initial)
-
- expect(initial).to receive(:where)
- .with(%q{LOWER("foo"."baz") = LOWER(:value)}, value: 'baz')
- .and_return(final)
-
- got = model.iwhere('foo.bar'.to_sym => 'bar',
- 'foo.baz'.to_sym => 'baz')
-
- expect(got).to eq(final)
- end
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ include CaseSensitivity
+ self.table_name = 'namespaces'
end
end
- describe 'using MySQL' do
- before do
- allow(Gitlab::Database).to receive(:postgresql?).and_return(false)
- allow(Gitlab::Database).to receive(:mysql?).and_return(true)
- end
-
- describe 'with a single column/value pair' do
- it 'returns the criteria for a column and a value' do
- criteria = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:foo)
- .and_return('`foo`')
-
- expect(model).to receive(:where)
- .with(%q{`foo` = :value}, value: 'bar')
- .and_return(criteria)
+ let!(:model_1) { model.create(path: 'mOdEl-1', name: 'mOdEl 1') }
+ let!(:model_2) { model.create(path: 'mOdEl-2', name: 'mOdEl 2') }
- expect(model.iwhere(foo: 'bar')).to eq(criteria)
- end
+ it 'finds a single instance by a single attribute regardless of case' do
+ expect(model.iwhere(path: 'MODEL-1')).to contain_exactly(model_1)
+ end
- it 'returns the criteria for a column with a table, and a value' do
- criteria = double(:criteria)
+ it 'finds multiple instances by a single attribute regardless of case' do
+ expect(model.iwhere(path: %w(MODEL-1 model-2))).to contain_exactly(model_1, model_2)
+ end
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.bar')
- .and_return('`foo`.`bar`')
+ it 'finds instances by multiple attributes' do
+ expect(model.iwhere(path: %w(MODEL-1 model-2), name: 'model 1'))
+ .to contain_exactly(model_1)
+ end
- expect(model).to receive(:where)
- .with(%q{`foo`.`bar` = :value}, value: 'bar')
- .and_return(criteria)
+ # Using `mysql` & `postgresql` metadata-tags here because both adapters build
+ # the query slightly differently
+ context 'for MySQL', :mysql do
+ it 'builds a simple query' do
+ query = model.iwhere(path: %w(MODEL-1 model-2), name: 'model 1').to_sql
+ expected_query = <<~QRY.strip
+ SELECT `namespaces`.* FROM `namespaces` WHERE (`namespaces`.`path` IN ('MODEL-1', 'model-2')) AND (`namespaces`.`name` = 'model 1')
+ QRY
- expect(model.iwhere('foo.bar'.to_sym => 'bar'))
- .to eq(criteria)
- end
+ expect(query).to eq(expected_query)
end
+ end
- describe 'with multiple column/value pairs' do
- it 'returns the criteria for a column and a value' do
- initial = double(:criteria)
- final = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:foo)
- .and_return('`foo`')
-
- expect(connection).to receive(:quote_table_name)
- .with(:bar)
- .and_return('`bar`')
-
- expect(model).to receive(:where)
- .with(%q{`foo` = :value}, value: 'bar')
- .and_return(initial)
-
- expect(initial).to receive(:where)
- .with(%q{`bar` = :value}, value: 'baz')
- .and_return(final)
-
- got = model.iwhere(foo: 'bar', bar: 'baz')
-
- expect(got).to eq(final)
- end
-
- it 'returns the criteria for a column with a table, and a value' do
- initial = double(:criteria)
- final = double(:criteria)
-
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.bar')
- .and_return('`foo`.`bar`')
-
- expect(connection).to receive(:quote_table_name)
- .with(:'foo.baz')
- .and_return('`foo`.`baz`')
-
- expect(model).to receive(:where)
- .with(%q{`foo`.`bar` = :value}, value: 'bar')
- .and_return(initial)
-
- expect(initial).to receive(:where)
- .with(%q{`foo`.`baz` = :value}, value: 'baz')
- .and_return(final)
-
- got = model.iwhere('foo.bar'.to_sym => 'bar',
- 'foo.baz'.to_sym => 'baz')
+ context 'for PostgreSQL', :postgresql do
+ it 'builds a query using LOWER' do
+ query = model.iwhere(path: %w(MODEL-1 model-2), name: 'model 1').to_sql
+ expected_query = <<~QRY.strip
+ SELECT \"namespaces\".* FROM \"namespaces\" WHERE (LOWER(\"namespaces\".\"path\") IN (LOWER('MODEL-1'), LOWER('model-2'))) AND (LOWER(\"namespaces\".\"name\") = LOWER('model 1'))
+ QRY
- expect(got).to eq(final)
- end
+ expect(query).to eq(expected_query)
end
end
end
diff --git a/spec/models/concerns/deployable_spec.rb b/spec/models/concerns/deployable_spec.rb
new file mode 100644
index 00000000000..6951be903fe
--- /dev/null
+++ b/spec/models/concerns/deployable_spec.rb
@@ -0,0 +1,74 @@
+require 'rails_helper'
+
+describe Deployable do
+ describe '#create_deployment' do
+ let(:deployment) { job.deployment }
+ let(:environment) { deployment&.environment }
+
+ before do
+ job.reload
+ end
+
+ context 'when the deployable object will deploy to production' do
+ let!(:job) { create(:ci_build, :start_review_app) }
+
+ it 'creates a deployment and environment record' do
+ expect(deployment.project).to eq(job.project)
+ expect(deployment.ref).to eq(job.ref)
+ expect(deployment.tag).to eq(job.tag)
+ expect(deployment.sha).to eq(job.sha)
+ expect(deployment.user).to eq(job.user)
+ expect(deployment.deployable).to eq(job)
+ expect(deployment.on_stop).to eq('stop_review_app')
+ expect(environment.name).to eq('review/master')
+ end
+ end
+
+ context 'when the deployable object will stop an environment' do
+ let!(:job) { create(:ci_build, :stop_review_app) }
+
+ it 'does not create a deployment record' do
+ expect(deployment).to be_nil
+ end
+ end
+
+ context 'when the deployable object has already had a deployment' do
+ let!(:job) { create(:ci_build, :start_review_app, deployment: race_deployment) }
+ let!(:race_deployment) { create(:deployment, :success) }
+
+ it 'does not create a new deployment' do
+ expect(deployment).to eq(race_deployment)
+ end
+ end
+
+ context 'when the deployable object will not deploy' do
+ let!(:job) { create(:ci_build) }
+
+ it 'does not create a deployment and environment record' do
+ expect(deployment).to be_nil
+ expect(environment).to be_nil
+ end
+ end
+
+ context 'when environment scope contains invalid character' do
+ let(:job) do
+ create(
+ :ci_build,
+ name: 'job:deploy-to-test-site',
+ environment: '$CI_JOB_NAME',
+ options: {
+ environment: {
+ name: '$CI_JOB_NAME',
+ url: 'http://staging.example.com/$CI_JOB_NAME',
+ on_stop: 'stop_review_app'
+ }
+ })
+ end
+
+ it 'does not create a deployment and environment record' do
+ expect(deployment).to be_nil
+ expect(environment).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/models/concerns/each_batch_spec.rb b/spec/models/concerns/each_batch_spec.rb
index 951690a217b..17224c09693 100644
--- a/spec/models/concerns/each_batch_spec.rb
+++ b/spec/models/concerns/each_batch_spec.rb
@@ -14,40 +14,45 @@ describe EachBatch do
5.times { create(:user, updated_at: 1.day.ago) }
end
- it 'yields an ActiveRecord::Relation when a block is given' do
- model.each_batch do |relation|
- expect(relation).to be_a_kind_of(ActiveRecord::Relation)
+ shared_examples 'each_batch handling' do |kwargs|
+ it 'yields an ActiveRecord::Relation when a block is given' do
+ model.each_batch(kwargs) do |relation|
+ expect(relation).to be_a_kind_of(ActiveRecord::Relation)
+ end
end
- end
- it 'yields a batch index as the second argument' do
- model.each_batch do |_, index|
- expect(index).to eq(1)
+ it 'yields a batch index as the second argument' do
+ model.each_batch(kwargs) do |_, index|
+ expect(index).to eq(1)
+ end
end
- end
- it 'accepts a custom batch size' do
- amount = 0
+ it 'accepts a custom batch size' do
+ amount = 0
- model.each_batch(of: 1) { amount += 1 }
+ model.each_batch(kwargs.merge({ of: 1 })) { amount += 1 }
- expect(amount).to eq(5)
- end
+ expect(amount).to eq(5)
+ end
- it 'does not include ORDER BYs in the yielded relations' do
- model.each_batch do |relation|
- expect(relation.to_sql).not_to include('ORDER BY')
+ it 'does not include ORDER BYs in the yielded relations' do
+ model.each_batch do |relation|
+ expect(relation.to_sql).not_to include('ORDER BY')
+ end
end
- end
- it 'allows updating of the yielded relations' do
- time = Time.now
+ it 'allows updating of the yielded relations' do
+ time = Time.now
- model.each_batch do |relation|
- relation.update_all(updated_at: time)
- end
+ model.each_batch do |relation|
+ relation.update_all(updated_at: time)
+ end
- expect(model.where(updated_at: time).count).to eq(5)
+ expect(model.where(updated_at: time).count).to eq(5)
+ end
end
+
+ it_behaves_like 'each_batch handling', {}
+ it_behaves_like 'each_batch handling', { order_hint: :updated_at }
end
end
diff --git a/spec/models/concerns/from_union_spec.rb b/spec/models/concerns/from_union_spec.rb
new file mode 100644
index 00000000000..ee427a667c6
--- /dev/null
+++ b/spec/models/concerns/from_union_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe FromUnion do
+ describe '.from_union' do
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ self.table_name = 'users'
+
+ include FromUnion
+ end
+ end
+
+ it 'selects from the results of the UNION' do
+ query = model.from_union([model.where(id: 1), model.where(id: 2)])
+
+ expect(query.to_sql).to match(/FROM \(SELECT.+UNION.+SELECT.+\) users/m)
+ end
+
+ it 'supports the use of a custom alias for the sub query' do
+ query = model.from_union(
+ [model.where(id: 1), model.where(id: 2)],
+ alias_as: 'kittens'
+ )
+
+ expect(query.to_sql).to match(/FROM \(SELECT.+UNION.+SELECT.+\) kittens/m)
+ end
+
+ it 'supports keeping duplicate rows' do
+ query = model.from_union(
+ [model.where(id: 1), model.where(id: 2)],
+ remove_duplicates: false
+ )
+
+ expect(query.to_sql)
+ .to match(/FROM \(SELECT.+UNION ALL.+SELECT.+\) users/m)
+ end
+ end
+end
diff --git a/spec/models/concerns/has_status_spec.rb b/spec/models/concerns/has_status_spec.rb
index 6866b43432c..6b1038cb8fd 100644
--- a/spec/models/concerns/has_status_spec.rb
+++ b/spec/models/concerns/has_status_spec.rb
@@ -270,11 +270,11 @@ describe HasStatus do
describe '.cancelable' do
subject { CommitStatus.cancelable }
- %i[running pending created].each do |status|
+ %i[running pending created scheduled].each do |status|
it_behaves_like 'containing the job', status
end
- %i[failed success skipped canceled].each do |status|
+ %i[failed success skipped canceled manual].each do |status|
it_behaves_like 'not containing the job', status
end
end
@@ -290,6 +290,18 @@ describe HasStatus do
it_behaves_like 'not containing the job', status
end
end
+
+ describe '.scheduled' do
+ subject { CommitStatus.scheduled }
+
+ %i[scheduled].each do |status|
+ it_behaves_like 'containing the job', status
+ end
+
+ %i[failed success skipped canceled].each do |status|
+ it_behaves_like 'not containing the job', status
+ end
+ end
end
describe '::DEFAULT_STATUS' do
@@ -300,7 +312,41 @@ describe HasStatus do
describe '::BLOCKED_STATUS' do
it 'is a status manual' do
- expect(described_class::BLOCKED_STATUS).to eq 'manual'
+ expect(described_class::BLOCKED_STATUS).to eq %w[manual scheduled]
+ end
+ end
+
+ describe 'blocked?' do
+ subject { object.blocked? }
+
+ %w[ci_pipeline ci_stage ci_build generic_commit_status].each do |type|
+ let(:object) { build(type, status: status) }
+
+ context 'when status is scheduled' do
+ let(:status) { :scheduled }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when status is manual' do
+ let(:status) { :manual }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when status is created' do
+ let(:status) { :created }
+
+ it { is_expected.to be_falsy }
+ end
+ end
+ end
+
+ describe '.status_sql' do
+ subject { Ci::Build.status_sql }
+
+ it 'returns SQL' do
+ puts subject
end
end
end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index ec6374f3963..a4bf3e2350a 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -519,7 +519,7 @@ describe Issuable do
end
end
- context 'substracting time' do
+ context 'subtracting time' do
before do
spend_time(1800)
end
@@ -530,7 +530,7 @@ describe Issuable do
expect(issue.total_time_spent).to eq(900)
end
- context 'when time to substract exceeds the total time spent' do
+ context 'when time to subtract exceeds the total time spent' do
it 'raise a validation error' do
Timecop.travel(1.minute.from_now) do
expect do
diff --git a/spec/models/concerns/optionally_search_spec.rb b/spec/models/concerns/optionally_search_spec.rb
new file mode 100644
index 00000000000..ff4212ddf18
--- /dev/null
+++ b/spec/models/concerns/optionally_search_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe OptionallySearch do
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ self.table_name = 'users'
+
+ include OptionallySearch
+ end
+ end
+
+ describe '.search' do
+ it 'raises NotImplementedError' do
+ expect { model.search('foo') }.to raise_error(NotImplementedError)
+ end
+ end
+
+ describe '.optionally_search' do
+ context 'when a query is given' do
+ it 'delegates to the search method' do
+ expect(model)
+ .to receive(:search)
+ .with('foo')
+
+ model.optionally_search('foo')
+ end
+ end
+
+ context 'when no query is given' do
+ it 'returns the current relation' do
+ expect(model.optionally_search).to be_a_kind_of(ActiveRecord::Relation)
+ end
+ end
+
+ context 'when an empty query is given' do
+ it 'returns the current relation' do
+ expect(model.optionally_search(''))
+ .to be_a_kind_of(ActiveRecord::Relation)
+ end
+ end
+ end
+end
diff --git a/spec/models/concerns/redactable_spec.rb b/spec/models/concerns/redactable_spec.rb
new file mode 100644
index 00000000000..7d320edd492
--- /dev/null
+++ b/spec/models/concerns/redactable_spec.rb
@@ -0,0 +1,69 @@
+require 'spec_helper'
+
+describe Redactable do
+ shared_examples 'model with redactable field' do
+ it 'redacts unsubscribe token' do
+ model[field] = 'some text /sent_notifications/00000000000000000000000000000000/unsubscribe more text'
+
+ model.save!
+
+ expect(model[field]).to eq 'some text /sent_notifications/REDACTED/unsubscribe more text'
+ end
+
+ it 'ignores not hexadecimal tokens' do
+ text = 'some text /sent_notifications/token/unsubscribe more text'
+ model[field] = text
+
+ model.save!
+
+ expect(model[field]).to eq text
+ end
+
+ it 'ignores not matching texts' do
+ text = 'some text /sent_notifications/.*/unsubscribe more text'
+ model[field] = text
+
+ model.save!
+
+ expect(model[field]).to eq text
+ end
+
+ it 'redacts the field when saving the model before creating markdown cache' do
+ model[field] = 'some text /sent_notifications/00000000000000000000000000000000/unsubscribe more text'
+
+ model.save!
+
+ expected = 'some text /sent_notifications/REDACTED/unsubscribe more text'
+ expect(model[field]).to eq expected
+ expect(model["#{field}_html"]).to eq "<p dir=\"auto\">#{expected}</p>"
+ end
+ end
+
+ context 'when model is an issue' do
+ it_behaves_like 'model with redactable field' do
+ let(:model) { create(:issue) }
+ let(:field) { :description }
+ end
+ end
+
+ context 'when model is a merge request' do
+ it_behaves_like 'model with redactable field' do
+ let(:model) { create(:merge_request) }
+ let(:field) { :description }
+ end
+ end
+
+ context 'when model is a note' do
+ it_behaves_like 'model with redactable field' do
+ let(:model) { create(:note) }
+ let(:field) { :note }
+ end
+ end
+
+ context 'when model is a snippet' do
+ it_behaves_like 'model with redactable field' do
+ let(:model) { create(:snippet) }
+ let(:field) { :description }
+ end
+ end
+end
diff --git a/spec/models/concerns/relative_positioning_spec.rb b/spec/models/concerns/relative_positioning_spec.rb
index 729056b6abc..66c1f47d12b 100644
--- a/spec/models/concerns/relative_positioning_spec.rb
+++ b/spec/models/concerns/relative_positioning_spec.rb
@@ -6,9 +6,13 @@ describe RelativePositioning do
let(:issue1) { create(:issue, project: project) }
let(:new_issue) { create(:issue, project: project) }
- before do
- [issue, issue1].each do |issue|
- issue.move_to_end && issue.save
+ describe '.move_to_end' do
+ it 'moves the object to the end' do
+ Issue.move_to_end([issue, issue1])
+
+ expect(issue1.prev_relative_position).to eq issue.relative_position
+ expect(issue.prev_relative_position).to eq nil
+ expect(issue1.next_relative_position).to eq nil
end
end
@@ -59,6 +63,12 @@ describe RelativePositioning do
end
describe '#move_to_end' do
+ before do
+ [issue, issue1].each do |issue|
+ issue.move_to_end && issue.save
+ end
+ end
+
it 'moves issue to the end' do
new_issue.move_to_end
@@ -67,6 +77,12 @@ describe RelativePositioning do
end
describe '#shift_after?' do
+ before do
+ [issue, issue1].each do |issue|
+ issue.move_to_end && issue.save
+ end
+ end
+
it 'returns true' do
issue.update(relative_position: issue1.relative_position - 1)
@@ -81,6 +97,12 @@ describe RelativePositioning do
end
describe '#shift_before?' do
+ before do
+ [issue, issue1].each do |issue|
+ issue.move_to_end && issue.save
+ end
+ end
+
it 'returns true' do
issue.update(relative_position: issue1.relative_position + 1)
@@ -95,6 +117,12 @@ describe RelativePositioning do
end
describe '#move_between' do
+ before do
+ [issue, issue1].each do |issue|
+ issue.move_to_end && issue.save
+ end
+ end
+
it 'positions issue between two other' do
new_issue.move_between(issue, issue1)
diff --git a/spec/models/concerns/token_authenticatable_spec.rb b/spec/models/concerns/token_authenticatable_spec.rb
index 9b804429138..782687516ae 100644
--- a/spec/models/concerns/token_authenticatable_spec.rb
+++ b/spec/models/concerns/token_authenticatable_spec.rb
@@ -2,8 +2,6 @@ require 'spec_helper'
shared_examples 'TokenAuthenticatable' do
describe 'dynamically defined methods' do
- it { expect(described_class).to be_private_method_defined(:generate_token) }
- it { expect(described_class).to be_private_method_defined(:write_new_token) }
it { expect(described_class).to respond_to("find_by_#{token_field}") }
it { is_expected.to respond_to("ensure_#{token_field}") }
it { is_expected.to respond_to("set_#{token_field}") }
@@ -66,13 +64,275 @@ describe ApplicationSetting, 'TokenAuthenticatable' do
end
describe 'multiple token fields' do
- before do
+ before(:all) do
described_class.send(:add_authentication_token_field, :yet_another_token)
end
- describe '.token_fields' do
- subject { described_class.authentication_token_fields }
- it { is_expected.to include(:runners_registration_token, :yet_another_token) }
+ it { is_expected.to respond_to(:ensure_runners_registration_token) }
+ it { is_expected.to respond_to(:ensure_yet_another_token) }
+ end
+
+ describe 'setting same token field multiple times' do
+ subject { described_class.send(:add_authentication_token_field, :runners_registration_token) }
+
+ it 'raises error' do
+ expect {subject}.to raise_error(ArgumentError)
+ end
+ end
+end
+
+describe PersonalAccessToken, 'TokenAuthenticatable' do
+ let(:personal_access_token_name) { 'test-pat-01' }
+ let(:token_value) { 'token' }
+ let(:user) { create(:user) }
+ let(:personal_access_token) do
+ described_class.new(name: personal_access_token_name,
+ user_id: user.id,
+ scopes: [:api],
+ token: token,
+ token_digest: token_digest)
+ end
+
+ before do
+ allow(Devise).to receive(:friendly_token).and_return(token_value)
+ end
+
+ describe '.find_by_token' do
+ subject { PersonalAccessToken.find_by_token(token_value) }
+
+ before do
+ personal_access_token.save
+ end
+
+ context 'token_digest already exists' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256(token_value) }
+
+ it 'finds the token' do
+ expect(subject).not_to be_nil
+ expect(subject.name).to eql(personal_access_token_name)
+ end
+ end
+
+ context 'token_digest does not exist' do
+ let(:token) { token_value }
+ let(:token_digest) { nil }
+
+ it 'finds the token' do
+ expect(subject).not_to be_nil
+ expect(subject.name).to eql(personal_access_token_name)
+ end
+ end
+ end
+
+ describe '#set_token' do
+ let(:new_token_value) { 'new-token' }
+ subject { personal_access_token.set_token(new_token_value) }
+
+ context 'token_digest already exists' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256(token_value) }
+
+ it 'overwrites token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(new_token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(new_token_value))
+ end
+ end
+
+ context 'token_digest does not exist but token does' do
+ let(:token) { token_value }
+ let(:token_digest) { nil }
+
+ it 'creates new token_digest and clears token' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(new_token_value)
+ expect(personal_access_token.token_digest).to eql(Gitlab::CryptoHelper.sha256(new_token_value))
+ end
+ end
+
+ context 'token_digest does not exist, nor token' do
+ let(:token) { nil }
+ let(:token_digest) { nil }
+
+ it 'creates new token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(new_token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(new_token_value))
+ end
+ end
+ end
+
+ describe '#ensure_token' do
+ subject { personal_access_token.ensure_token }
+
+ context 'token_digest already exists' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256(token_value) }
+
+ it 'does not change token fields' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to be_nil
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token_digest does not exist but token does' do
+ let(:token) { token_value }
+ let(:token_digest) { nil }
+
+ it 'does not change token fields' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to eql(token_value)
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to be_nil
+ end
+ end
+
+ context 'token_digest does not exist, nor token' do
+ let(:token) { nil }
+ let(:token_digest) { nil }
+
+ it 'creates token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+ end
+
+ describe '#ensure_token!' do
+ subject { personal_access_token.ensure_token! }
+
+ context 'token_digest already exists' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256(token_value) }
+
+ it 'does not change token fields' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to be_nil
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token_digest does not exist but token does' do
+ let(:token) { token_value }
+ let(:token_digest) { nil }
+
+ it 'does not change token fields' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to eql(token_value)
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to be_nil
+ end
+ end
+
+ context 'token_digest does not exist, nor token' do
+ let(:token) { nil }
+ let(:token_digest) { nil }
+
+ it 'creates token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+ end
+
+ describe '#reset_token!' do
+ subject { personal_access_token.reset_token! }
+
+ context 'token_digest already exists' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256('old-token') }
+
+ it 'creates new token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token_digest does not exist but token does' do
+ let(:token) { 'old-token' }
+ let(:token_digest) { nil }
+
+ it 'creates new token_digest and clears token' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql(Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token_digest does not exist, nor token' do
+ let(:token) { nil }
+ let(:token_digest) { nil }
+
+ it 'creates new token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token_digest exists and newly generated token would be the same' do
+ let(:token) { nil }
+ let(:token_digest) { Gitlab::CryptoHelper.sha256('old-token') }
+
+ before do
+ personal_access_token.save
+ allow(Devise).to receive(:friendly_token).and_return(
+ 'old-token', token_value, 'boom!')
+ end
+
+ it 'regenerates a new token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
+ end
+
+ context 'token exists and newly generated token would be the same' do
+ let(:token) { 'old-token' }
+ let(:token_digest) { nil }
+
+ before do
+ personal_access_token.save
+ allow(Devise).to receive(:friendly_token).and_return(
+ 'old-token', token_value, 'boom!')
+ end
+
+ it 'regenerates a new token_digest' do
+ subject
+
+ expect(personal_access_token.read_attribute('token')).to be_nil
+ expect(personal_access_token.token).to eql(token_value)
+ expect(personal_access_token.token_digest).to eql( Gitlab::CryptoHelper.sha256(token_value))
+ end
end
end
end
diff --git a/spec/models/concerns/triggerable_hooks_spec.rb b/spec/models/concerns/triggerable_hooks_spec.rb
index 621d2d38eae..265abd6bd72 100644
--- a/spec/models/concerns/triggerable_hooks_spec.rb
+++ b/spec/models/concerns/triggerable_hooks_spec.rb
@@ -40,4 +40,28 @@ RSpec.describe TriggerableHooks do
end
end
end
+
+ describe '.select_active' do
+ it 'returns hooks that match the active filter' do
+ TestableHook.create!(url: 'http://example1.com', push_events: true)
+ TestableHook.create!(url: 'http://example2.com', push_events: true)
+ filter1 = double(:filter1)
+ filter2 = double(:filter2)
+ allow(ActiveHookFilter).to receive(:new).exactly(2).times.and_return(filter1, filter2)
+ expect(filter1).to receive(:matches?).and_return(true)
+ expect(filter2).to receive(:matches?).and_return(false)
+
+ hooks = TestableHook.push_hooks.order_id_asc
+ expect(hooks.select_active(:push_hooks, {})).to eq [hooks.first]
+ end
+
+ it 'returns empty list if no hooks match the active filter' do
+ TestableHook.create!(url: 'http://example1.com', push_events: true)
+ filter = double(:filter)
+ allow(ActiveHookFilter).to receive(:new).and_return(filter)
+ expect(filter).to receive(:matches?).and_return(false)
+
+ expect(TestableHook.push_hooks.select_active(:push_hooks, {})).to eq []
+ end
+ end
end
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index b335e0fbeb3..270b2767c68 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -16,6 +16,22 @@ describe Deployment do
it { is_expected.to validate_presence_of(:ref) }
it { is_expected.to validate_presence_of(:sha) }
+ describe '#scheduled_actions' do
+ subject { deployment.scheduled_actions }
+
+ let(:project) { create(:project, :repository) }
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+ let(:deployment) { create(:deployment, deployable: build) }
+
+ it 'delegates to other_scheduled_actions' do
+ expect_any_instance_of(Ci::Build)
+ .to receive(:other_scheduled_actions)
+
+ subject
+ end
+ end
+
describe 'modules' do
it_behaves_like 'AtomicInternalId' do
let(:internal_id_attribute) { :iid }
@@ -26,16 +42,197 @@ describe Deployment do
end
end
- describe 'after_create callbacks' do
- let(:environment) { create(:environment) }
- let(:store) { Gitlab::EtagCaching::Store.new }
+ describe '.success' do
+ subject { described_class.success }
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it { is_expected.to eq([deployment]) }
+ end
+
+ context 'when deployment status is created' do
+ let(:deployment) { create(:deployment, :created) }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'when deployment status is running' do
+ let(:deployment) { create(:deployment, :running) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
+ describe 'state machine' do
+ context 'when deployment runs' do
+ let(:deployment) { create(:deployment) }
+
+ before do
+ deployment.run!
+ end
+
+ it 'starts running' do
+ Timecop.freeze do
+ expect(deployment).to be_running
+ expect(deployment.finished_at).to be_nil
+ end
+ end
+ end
- it 'invalidates the environment etag cache' do
- old_value = store.get(environment.etag_cache_key)
+ context 'when deployment succeeded' do
+ let(:deployment) { create(:deployment, :running) }
- create(:deployment, environment: environment)
+ it 'has correct status' do
+ Timecop.freeze do
+ deployment.succeed!
- expect(store.get(environment.etag_cache_key)).not_to eq(old_value)
+ expect(deployment).to be_success
+ expect(deployment.finished_at).to be_like_time(Time.now)
+ end
+ end
+
+ it 'executes Deployments::SuccessWorker asynchronously' do
+ expect(Deployments::SuccessWorker)
+ .to receive(:perform_async).with(deployment.id)
+
+ deployment.succeed!
+ end
+ end
+
+ context 'when deployment failed' do
+ let(:deployment) { create(:deployment, :running) }
+
+ it 'has correct status' do
+ Timecop.freeze do
+ deployment.drop!
+
+ expect(deployment).to be_failed
+ expect(deployment.finished_at).to be_like_time(Time.now)
+ end
+ end
+ end
+
+ context 'when deployment was canceled' do
+ let(:deployment) { create(:deployment, :running) }
+
+ it 'has correct status' do
+ Timecop.freeze do
+ deployment.cancel!
+
+ expect(deployment).to be_canceled
+ expect(deployment.finished_at).to be_like_time(Time.now)
+ end
+ end
+ end
+ end
+
+ describe '#success?' do
+ subject { deployment.success? }
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when deployment status is failed' do
+ let(:deployment) { create(:deployment, :failed) }
+
+ it { is_expected.to be_falsy }
+ end
+ end
+
+ describe '#status_name' do
+ subject { deployment.status_name }
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it { is_expected.to eq(:success) }
+ end
+
+ context 'when deployment status is failed' do
+ let(:deployment) { create(:deployment, :failed) }
+
+ it { is_expected.to eq(:failed) }
+ end
+ end
+
+ describe '#finished_at' do
+ subject { deployment.finished_at }
+
+ context 'when deployment status is created' do
+ let(:deployment) { create(:deployment) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it { is_expected.to eq(deployment.read_attribute(:finished_at)) }
+ end
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success, finished_at: nil) }
+
+ before do
+ deployment.update_column(:finished_at, nil)
+ end
+
+ it { is_expected.to eq(deployment.read_attribute(:created_at)) }
+ end
+
+ context 'when deployment status is running' do
+ let(:deployment) { create(:deployment, :running) }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe '#deployed_at' do
+ subject { deployment.deployed_at }
+
+ context 'when deployment status is created' do
+ let(:deployment) { create(:deployment) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when deployment status is success' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it { is_expected.to eq(deployment.read_attribute(:finished_at)) }
+ end
+
+ context 'when deployment status is running' do
+ let(:deployment) { create(:deployment, :running) }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe 'scopes' do
+ describe 'last_for_environment' do
+ let(:production) { create(:environment) }
+ let(:staging) { create(:environment) }
+ let(:testing) { create(:environment) }
+
+ let!(:deployments) do
+ [
+ create(:deployment, environment: production),
+ create(:deployment, environment: staging),
+ create(:deployment, environment: production)
+ ]
+ end
+
+ it 'retrieves last deployments for environments' do
+ last_deployments = described_class.last_for_environment([staging, production, testing])
+
+ expect(last_deployments.size).to eq(2)
+ expect(last_deployments).to match_array(deployments.last(2))
+ end
end
end
@@ -73,7 +270,7 @@ describe Deployment do
end
describe '#metrics' do
- let(:deployment) { create(:deployment) }
+ let(:deployment) { create(:deployment, :success) }
let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) }
subject { deployment.metrics }
@@ -102,7 +299,7 @@ describe Deployment do
describe '#additional_metrics' do
let(:project) { create(:project, :repository) }
- let(:deployment) { create(:deployment, project: project) }
+ let(:deployment) { create(:deployment, :succeed, project: project) }
subject { deployment.additional_metrics }
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index c65e0b81451..9a3f1f1c5a1 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -53,6 +53,25 @@ describe Environment do
end
end
+ describe '.with_deployment' do
+ subject { described_class.with_deployment(sha) }
+
+ let(:environment) { create(:environment) }
+ let(:sha) { RepoHelpers.sample_commit.id }
+
+ context 'when deployment has the specified sha' do
+ let!(:deployment) { create(:deployment, environment: environment, sha: sha) }
+
+ it { is_expected.to eq([environment]) }
+ end
+
+ context 'when deployment does not have the specified sha' do
+ let!(:deployment) { create(:deployment, environment: environment, sha: 'abc') }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
describe '#folder_name' do
context 'when it is inside a folder' do
subject(:environment) do
@@ -95,7 +114,7 @@ describe Environment do
context 'with a last deployment' do
let!(:deployment) do
- create(:deployment, environment: environment, sha: project.commit('master').id)
+ create(:deployment, :success, environment: environment, sha: project.commit('master').id)
end
context 'in the same branch' do
@@ -136,8 +155,8 @@ describe Environment do
describe '#first_deployment_for' do
let(:project) { create(:project, :repository) }
- let!(:deployment) { create(:deployment, environment: environment, ref: commit.parent.id) }
- let!(:deployment1) { create(:deployment, environment: environment, ref: commit.id) }
+ let!(:deployment) { create(:deployment, :succeed, environment: environment, ref: commit.parent.id) }
+ let!(:deployment1) { create(:deployment, :succeed, environment: environment, ref: commit.id) }
let(:head_commit) { project.commit }
let(:commit) { project.commit.parent }
@@ -181,7 +200,8 @@ describe Environment do
let(:build) { create(:ci_build) }
let!(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
deployable: build,
on_stop: 'close_app')
end
@@ -249,7 +269,8 @@ describe Environment do
let(:build) { create(:ci_build, pipeline: pipeline) }
let!(:deployment) do
- create(:deployment, environment: environment,
+ create(:deployment, :success,
+ environment: environment,
deployable: build,
on_stop: 'close_app')
end
@@ -304,7 +325,7 @@ describe Environment do
context 'when last deployment to environment is the most recent one' do
before do
- create(:deployment, environment: environment, ref: 'feature')
+ create(:deployment, :success, environment: environment, ref: 'feature')
end
it { is_expected.to be true }
@@ -312,8 +333,8 @@ describe Environment do
context 'when last deployment to environment is not the most recent' do
before do
- create(:deployment, environment: environment, ref: 'feature')
- create(:deployment, environment: environment, ref: 'master')
+ create(:deployment, :success, environment: environment, ref: 'feature')
+ create(:deployment, :success, environment: environment, ref: 'master')
end
it { is_expected.to be false }
@@ -321,7 +342,7 @@ describe Environment do
end
describe '#actions_for' do
- let(:deployment) { create(:deployment, environment: environment) }
+ let(:deployment) { create(:deployment, :success, environment: environment) }
let(:pipeline) { deployment.deployable.pipeline }
let!(:review_action) { create(:ci_build, :manual, name: 'review-apps', pipeline: pipeline, environment: 'review/$CI_COMMIT_REF_NAME' )}
let!(:production_action) { create(:ci_build, :manual, name: 'production', pipeline: pipeline, environment: 'production' )}
@@ -331,14 +352,78 @@ describe Environment do
end
end
+ describe '.deployments' do
+ subject { environment.deployments }
+
+ context 'when there is a deployment record with created status' do
+ let(:deployment) { create(:deployment, :created, environment: environment) }
+
+ it 'does not return the record' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there is a deployment record with running status' do
+ let(:deployment) { create(:deployment, :running, environment: environment) }
+
+ it 'does not return the record' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there is a deployment record with success status' do
+ let(:deployment) { create(:deployment, :success, environment: environment) }
+
+ it 'returns the record' do
+ is_expected.to eq([deployment])
+ end
+ end
+ end
+
+ describe '.last_deployment' do
+ subject { environment.last_deployment }
+
+ before do
+ allow_any_instance_of(Deployment).to receive(:create_ref)
+ end
+
+ context 'when there is an old deployment record' do
+ let!(:previous_deployment) { create(:deployment, :success, environment: environment) }
+
+ context 'when there is a deployment record with created status' do
+ let!(:deployment) { create(:deployment, environment: environment) }
+
+ it 'returns the previous deployment' do
+ is_expected.to eq(previous_deployment)
+ end
+ end
+
+ context 'when there is a deployment record with running status' do
+ let!(:deployment) { create(:deployment, :running, environment: environment) }
+
+ it 'returns the previous deployment' do
+ is_expected.to eq(previous_deployment)
+ end
+ end
+
+ context 'when there is a deployment record with success status' do
+ let!(:deployment) { create(:deployment, :success, environment: environment) }
+
+ it 'returns the latest successful deployment' do
+ is_expected.to eq(deployment)
+ end
+ end
+ end
+ end
+
describe '#has_terminals?' do
subject { environment.has_terminals? }
- context 'when the enviroment is available' do
+ context 'when the environment is available' do
context 'with a deployment service' do
shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
context 'and a deployment' do
- let!(:deployment) { create(:deployment, environment: environment) }
+ let!(:deployment) { create(:deployment, :success, environment: environment) }
it { is_expected.to be_truthy }
end
@@ -447,7 +532,7 @@ describe Environment do
describe '#has_metrics?' do
subject { environment.has_metrics? }
- context 'when the enviroment is available' do
+ context 'when the environment is available' do
context 'with a deployment service' do
let(:project) { create(:prometheus_project) }
@@ -456,8 +541,8 @@ describe Environment do
it { is_expected.to be_truthy }
end
- context 'but no deployments' do
- it { is_expected.to be_falsy }
+ context 'and no deployments' do
+ it { is_expected.to be_truthy }
end
end
@@ -504,39 +589,6 @@ describe Environment do
end
end
- describe '#has_metrics?' do
- subject { environment.has_metrics? }
-
- context 'when the enviroment is available' do
- context 'with a deployment service' do
- let(:project) { create(:prometheus_project) }
-
- context 'and a deployment' do
- let!(:deployment) { create(:deployment, environment: environment) }
- it { is_expected.to be_truthy }
- end
-
- context 'but no deployments' do
- it { is_expected.to be_falsy }
- end
- end
-
- context 'without a monitoring service' do
- it { is_expected.to be_falsy }
- end
- end
-
- context 'when the environment is unavailable' do
- let(:project) { create(:prometheus_project) }
-
- before do
- environment.stop
- end
-
- it { is_expected.to be_falsy }
- end
- end
-
describe '#additional_metrics' do
let(:project) { create(:prometheus_project) }
subject { environment.additional_metrics }
diff --git a/spec/models/environment_status_spec.rb b/spec/models/environment_status_spec.rb
new file mode 100644
index 00000000000..90f7e4a4590
--- /dev/null
+++ b/spec/models/environment_status_spec.rb
@@ -0,0 +1,165 @@
+require 'spec_helper'
+
+describe EnvironmentStatus do
+ include ProjectForksHelper
+
+ let(:deployment) { create(:deployment, :succeed, :review_app) }
+ let(:environment) { deployment.environment }
+ let(:project) { deployment.project }
+ let(:merge_request) { create(:merge_request, :deployed_review_app, deployment: deployment) }
+ let(:sha) { deployment.sha }
+
+ subject(:environment_status) { described_class.new(environment, merge_request, sha) }
+
+ it { is_expected.to delegate_method(:id).to(:environment) }
+ it { is_expected.to delegate_method(:name).to(:environment) }
+ it { is_expected.to delegate_method(:project).to(:environment) }
+ it { is_expected.to delegate_method(:deployed_at).to(:deployment) }
+ it { is_expected.to delegate_method(:status).to(:deployment) }
+
+ describe '#project' do
+ subject { environment_status.project }
+
+ it { is_expected.to eq(project) }
+ end
+
+ describe '#merge_request' do
+ subject { environment_status.merge_request }
+
+ it { is_expected.to eq(merge_request) }
+ end
+
+ describe '#deployment' do
+ subject { environment_status.deployment }
+
+ it { is_expected.to eq(deployment) }
+ end
+
+ # $ git diff --stat pages-deploy-target...pages-deploy
+ # .gitlab/route-map.yml | 5 +++++
+ # files/html/500.html | 13 -------------
+ # files/html/page.html | 3 +++
+ # files/js/application.js | 3 +++
+ # files/markdown/ruby-style-guide.md | 4 ++++
+ # pages-deploy.txt | 1 +
+ #
+ # $ cat .gitlab/route-map.yml
+ # - source: /files\/markdown\/(.+)\.md$/
+ # public: '\1.html'
+ #
+ # - source: /files\/(.+)/
+ # public: '\1'
+ describe '#changes' do
+ it 'contains only added and modified public pages' do
+ expect(environment_status.changes).to contain_exactly(
+ {
+ path: 'ruby-style-guide.html',
+ external_url: "#{environment.external_url}/ruby-style-guide.html"
+ }, {
+ path: 'html/page.html',
+ external_url: "#{environment.external_url}/html/page.html"
+ }
+ )
+ end
+ end
+
+ describe '.for_merge_request' do
+ let(:admin) { create(:admin) }
+ let(:pipeline) { create(:ci_pipeline, sha: sha) }
+
+ it 'is based on merge_request.diff_head_sha' do
+ expect(merge_request).to receive(:diff_head_sha)
+ expect(merge_request).not_to receive(:merge_commit_sha)
+
+ described_class.for_merge_request(merge_request, admin)
+ end
+ end
+
+ describe '.after_merge_request' do
+ let(:admin) { create(:admin) }
+ let(:pipeline) { create(:ci_pipeline, sha: sha) }
+
+ before do
+ merge_request.mark_as_merged!
+ end
+
+ it 'is based on merge_request.merge_commit_sha' do
+ expect(merge_request).to receive(:merge_commit_sha)
+ expect(merge_request).not_to receive(:diff_head_sha)
+
+ described_class.after_merge_request(merge_request, admin)
+ end
+ end
+
+ describe '.build_environments_status' do
+ subject { described_class.send(:build_environments_status, merge_request, user, sha) }
+
+ let!(:build) { create(:ci_build, :deploy_to_production, pipeline: pipeline) }
+ let(:environment) { build.deployment.environment }
+ let(:user) { project.owner }
+
+ before do
+ build.deployment&.update!(sha: sha)
+ end
+
+ context 'when environment is created on a forked project' do
+ let(:project) { create(:project, :repository) }
+ let(:forked) { fork_project(project, user, repository: true) }
+ let(:sha) { forked.commit.sha }
+ let(:pipeline) { create(:ci_pipeline, sha: sha, project: forked) }
+
+ let(:merge_request) do
+ create(:merge_request,
+ source_project: forked,
+ target_project: project,
+ target_branch: 'master',
+ head_pipeline: pipeline)
+ end
+
+ it 'returns environment status' do
+ expect(subject.count).to eq(1)
+ expect(subject[0].environment).to eq(environment)
+ expect(subject[0].merge_request).to eq(merge_request)
+ expect(subject[0].sha).to eq(sha)
+ end
+ end
+
+ context 'when environment is created on a target project' do
+ let(:project) { create(:project, :repository) }
+ let(:sha) { project.commit.sha }
+ let(:pipeline) { create(:ci_pipeline, sha: sha, project: project) }
+
+ let(:merge_request) do
+ create(:merge_request,
+ source_project: project,
+ source_branch: 'feature',
+ target_project: project,
+ target_branch: 'master',
+ head_pipeline: pipeline)
+ end
+
+ it 'returns environment status' do
+ expect(subject.count).to eq(1)
+ expect(subject[0].environment).to eq(environment)
+ expect(subject[0].merge_request).to eq(merge_request)
+ expect(subject[0].sha).to eq(sha)
+ end
+
+ context 'when the build stops an environment' do
+ let!(:build) { create(:ci_build, :stop_review_app, pipeline: pipeline) }
+
+ it 'does not return environment status' do
+ expect(subject.count).to eq(0)
+ end
+ end
+
+ context 'when user does not have a permission to see the environment' do
+ let(:user) { create(:user) }
+
+ it 'does not return environment status' do
+ expect(subject.count).to eq(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/event_collection_spec.rb b/spec/models/event_collection_spec.rb
index e0a87c18cc7..6078f429bdc 100644
--- a/spec/models/event_collection_spec.rb
+++ b/spec/models/event_collection_spec.rb
@@ -41,7 +41,7 @@ describe EventCollection do
end
it 'allows filtering of events using an EventFilter' do
- filter = EventFilter.new(EventFilter.issue)
+ filter = EventFilter.new(EventFilter::ISSUE)
events = described_class.new(projects, filter: filter).to_a
expect(events.length).to eq(1)
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index c1eac4fa489..81748681528 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -148,9 +148,14 @@ describe Event do
let(:admin) { create(:admin) }
let(:issue) { create(:issue, project: project, author: author, assignees: [assignee]) }
let(:confidential_issue) { create(:issue, :confidential, project: project, author: author, assignees: [assignee]) }
+ let(:project_snippet) { create(:project_snippet, :public, project: project, author: author) }
+ let(:personal_snippet) { create(:personal_snippet, :public, author: author) }
let(:note_on_commit) { create(:note_on_commit, project: project) }
let(:note_on_issue) { create(:note_on_issue, noteable: issue, project: project) }
let(:note_on_confidential_issue) { create(:note_on_issue, noteable: confidential_issue, project: project) }
+ let(:note_on_project_snippet) { create(:note_on_project_snippet, author: author, noteable: project_snippet, project: project) }
+ let(:note_on_personal_snippet) { create(:note_on_personal_snippet, author: author, noteable: personal_snippet, project: nil) }
+ let(:milestone_on_project) { create(:milestone, project: project) }
let(:event) { described_class.new(project: project, target: target, author_id: author.id) }
before do
@@ -268,6 +273,125 @@ describe Event do
end
end
end
+
+ context 'milestone event' do
+ let(:target) { milestone_on_project }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_truthy
+ expect(event.visible_to_user?(non_member)).to be_truthy
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+
+ context 'on public project with private issue tracker and merge requests' do
+ let(:project) { create(:project, :public, :issues_private, :merge_requests_private) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_falsy
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+ end
+
+ context 'on private project' do
+ let(:project) { create(:project, :private) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_falsy
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+ end
+ end
+
+ context 'project snippet note event' do
+ let(:target) { note_on_project_snippet }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_truthy
+ expect(event.visible_to_user?(non_member)).to be_truthy
+ expect(event.visible_to_user?(author)).to be_truthy
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+
+ context 'on public project with private snippets' do
+ let(:project) { create(:project, :public, :snippets_private) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_falsy
+
+ # Normally, we'd expect the author of a comment to be able to view it.
+ # However, this doesn't seem to be the case for comments on snippets.
+ expect(event.visible_to_user?(author)).to be_falsy
+
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+ end
+
+ context 'on private project' do
+ let(:project) { create(:project, :private) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_falsy
+
+ # Normally, we'd expect the author of a comment to be able to view it.
+ # However, this doesn't seem to be the case for comments on snippets.
+ expect(event.visible_to_user?(author)).to be_falsy
+
+ expect(event.visible_to_user?(member)).to be_truthy
+ expect(event.visible_to_user?(guest)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+ end
+ end
+
+ context 'personal snippet note event' do
+ let(:target) { note_on_personal_snippet }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_truthy
+ expect(event.visible_to_user?(non_member)).to be_truthy
+ expect(event.visible_to_user?(author)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+
+ context 'on internal snippet' do
+ let(:personal_snippet) { create(:personal_snippet, :internal, author: author) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_truthy
+ expect(event.visible_to_user?(author)).to be_truthy
+ expect(event.visible_to_user?(admin)).to be_truthy
+ end
+ end
+
+ context 'on private snippet' do
+ let(:personal_snippet) { create(:personal_snippet, :private, author: author) }
+
+ it do
+ expect(event.visible_to_user?(nil)).to be_falsy
+ expect(event.visible_to_user?(non_member)).to be_falsy
+ expect(event.visible_to_user?(author)).to be_truthy
+
+ # It is very unexpected that a private personal snippet is not visible
+ # to an instance administrator. This should be fixed in the future.
+ expect(event.visible_to_user?(admin)).to be_falsy
+ end
+ end
+ end
end
describe '.limit_recent' do
diff --git a/spec/models/fork_network_member_spec.rb b/spec/models/fork_network_member_spec.rb
index 25bf596fddc..60d04562e6c 100644
--- a/spec/models/fork_network_member_spec.rb
+++ b/spec/models/fork_network_member_spec.rb
@@ -11,7 +11,7 @@ describe ForkNetworkMember do
let(:fork_network) { fork_network_member.fork_network }
it 'removes the fork network if it was the last member' do
- fork_network.fork_network_members.destroy_all
+ fork_network.fork_network_members.destroy_all # rubocop: disable DestroyAll
expect(ForkNetwork.count).to eq(0)
end
diff --git a/spec/models/forked_project_link_spec.rb b/spec/models/forked_project_link_spec.rb
deleted file mode 100644
index 32e33e8f42f..00000000000
--- a/spec/models/forked_project_link_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-require 'spec_helper'
-
-describe ForkedProjectLink, "add link on fork" do
- include ProjectForksHelper
-
- let(:project_from) { create(:project, :repository) }
- let(:project_to) { fork_project(project_from, user) }
- let(:user) { create(:user) }
-
- before do
- project_from.add_reporter(user)
- end
-
- it 'project_from knows its forks' do
- _ = project_to
-
- expect(project_from.forks.count).to eq(1)
- end
-
- it "project_to knows it is forked" do
- expect(project_to.forked?).to be_truthy
- end
-
- it "project knows who it is forked from" do
- expect(project_to.forked_from_project).to eq(project_from)
- end
-
- context 'project_to is pending_delete' do
- before do
- project_to.update!(pending_delete: true)
- end
-
- it { expect(project_from.forks.count).to eq(0) }
- end
-
- context 'project_from is pending_delete' do
- before do
- project_from.update!(pending_delete: true)
- end
-
- it { expect(project_to.forked_from_project).to be_nil }
- end
-
- describe '#forked?' do
- let(:project_to) { create(:project, :repository, forked_project_link: forked_project_link) }
- let(:forked_project_link) { create(:forked_project_link) }
-
- before do
- forked_project_link.forked_from_project = project_from
- forked_project_link.forked_to_project = project_to
- forked_project_link.save!
- end
-
- it "project_to knows it is forked" do
- expect(project_to.forked?).to be_truthy
- end
-
- it "project_from is not forked" do
- expect(project_from.forked?).to be_falsey
- end
-
- it "project_to.destroy destroys fork_link" do
- project_to.destroy
-
- expect(ForkedProjectLink.exists?(id: forked_project_link.id)).to eq(false)
- end
- end
-end
diff --git a/spec/models/global_milestone_spec.rb b/spec/models/global_milestone_spec.rb
index ab58f5c5021..b6355455c1d 100644
--- a/spec/models/global_milestone_spec.rb
+++ b/spec/models/global_milestone_spec.rb
@@ -92,41 +92,6 @@ describe GlobalMilestone do
end
end
- describe '.states_count' do
- context 'when the projects have milestones' do
- before do
- create(:closed_milestone, title: 'Active Group Milestone', project: project3)
- create(:active_milestone, title: 'Active Group Milestone', project: project1)
- create(:active_milestone, title: 'Active Group Milestone', project: project2)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project1)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project2)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project3)
- end
-
- it 'returns the quantity of global milestones in each possible state' do
- expected_count = { opened: 1, closed: 2, all: 2 }
-
- count = described_class.states_count(Project.all)
-
- expect(count).to eq(expected_count)
- end
- end
-
- context 'when the projects do not have milestones' do
- before do
- project1
- end
-
- it 'returns 0 as the quantity of global milestones in each state' do
- expected_count = { opened: 0, closed: 0, all: 0 }
-
- count = described_class.states_count(Project.all)
-
- expect(count).to eq(expected_count)
- end
- end
- end
-
describe '#initialize' do
let(:milestone1_project1) { create(:milestone, title: "Milestone v1.2", project: project1) }
let(:milestone1_project2) { create(:milestone, title: "Milestone v1.2", project: project2) }
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 0729eb99e78..ada00f03928 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -19,6 +19,8 @@ describe Group do
it { is_expected.to have_one(:chat_team) }
it { is_expected.to have_many(:custom_attributes).class_name('GroupCustomAttribute') }
it { is_expected.to have_many(:badges).class_name('GroupBadge') }
+ it { is_expected.to have_many(:cluster_groups).class_name('Clusters::Group') }
+ it { is_expected.to have_many(:clusters).class_name('Clusters::Cluster') }
describe '#members & #requesters' do
let(:requester) { create(:user) }
@@ -169,22 +171,42 @@ describe Group do
end
end
- describe '.visible_to_user' do
- let!(:group) { create(:group) }
- let!(:user) { create(:user) }
+ describe '.public_or_visible_to_user' do
+ let!(:private_group) { create(:group, :private) }
+ let!(:internal_group) { create(:group, :internal) }
- subject { described_class.visible_to_user(user) }
+ subject { described_class.public_or_visible_to_user(user) }
- describe 'when the user has access to a group' do
- before do
- group.add_user(user, Gitlab::Access::MAINTAINER)
- end
+ context 'when user is nil' do
+ let!(:user) { nil }
- it { is_expected.to eq([group]) }
+ it { is_expected.to match_array([group]) }
end
- describe 'when the user does not have access to any groups' do
- it { is_expected.to eq([]) }
+ context 'when user' do
+ let!(:user) { create(:user) }
+
+ context 'when user does not have access to any private group' do
+ it { is_expected.to match_array([internal_group, group]) }
+ end
+
+ context 'when user is a member of private group' do
+ before do
+ private_group.add_user(user, Gitlab::Access::DEVELOPER)
+ end
+
+ it { is_expected.to match_array([private_group, internal_group, group]) }
+ end
+
+ context 'when user is a member of private subgroup', :postgresql do
+ let!(:private_subgroup) { create(:group, :private, parent: private_group) }
+
+ before do
+ private_subgroup.add_user(user, Gitlab::Access::DEVELOPER)
+ end
+
+ it { is_expected.to match_array([private_subgroup, internal_group, group]) }
+ end
end
end
@@ -631,10 +653,10 @@ describe Group do
end
end
- describe '#secret_variables_for' do
+ describe '#ci_variables_for' do
let(:project) { create(:project, group: group) }
- let!(:secret_variable) do
+ let!(:ci_variable) do
create(:ci_group_variable, value: 'secret', group: group)
end
@@ -642,11 +664,11 @@ describe Group do
create(:ci_group_variable, :protected, value: 'protected', group: group)
end
- subject { group.secret_variables_for('ref', project) }
+ subject { group.ci_variables_for('ref', project) }
shared_examples 'ref is protected' do
it 'contains all the variables' do
- is_expected.to contain_exactly(secret_variable, protected_variable)
+ is_expected.to contain_exactly(ci_variable, protected_variable)
end
end
@@ -656,8 +678,8 @@ describe Group do
default_branch_protection: Gitlab::Access::PROTECTION_NONE)
end
- it 'contains only the secret variables' do
- is_expected.to contain_exactly(secret_variable)
+ it 'contains only the CI variables' do
+ is_expected.to contain_exactly(ci_variable)
end
end
@@ -690,9 +712,9 @@ describe Group do
end
it 'returns all variables belong to the group and parent groups' do
- expected_array1 = [protected_variable, secret_variable]
+ expected_array1 = [protected_variable, ci_variable]
expected_array2 = [variable_child, variable_child_2, variable_child_3]
- got_array = group_child_3.secret_variables_for('ref', project).to_a
+ got_array = group_child_3.ci_variables_for('ref', project).to_a
expect(got_array.shift(2)).to contain_exactly(*expected_array1)
expect(got_array).to eq(expected_array2)
diff --git a/spec/models/hooks/active_hook_filter_spec.rb b/spec/models/hooks/active_hook_filter_spec.rb
new file mode 100644
index 00000000000..df7edda2213
--- /dev/null
+++ b/spec/models/hooks/active_hook_filter_spec.rb
@@ -0,0 +1,68 @@
+require 'spec_helper'
+
+describe ActiveHookFilter do
+ subject(:filter) { described_class.new(hook) }
+
+ describe '#matches?' do
+ context 'for push event hooks' do
+ let(:hook) do
+ create(:project_hook, push_events: true, push_events_branch_filter: branch_filter)
+ end
+
+ context 'branch filter is specified' do
+ let(:branch_filter) { 'master' }
+
+ it 'returns true if branch matches' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/master' })).to be true
+ end
+
+ it 'returns false if branch does not match' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/my_branch' })).to be false
+ end
+
+ it 'returns false if ref is nil' do
+ expect(filter.matches?(:push_hooks, {})).to be false
+ end
+
+ context 'branch filter contains wildcard' do
+ let(:branch_filter) { 'features/*' }
+
+ it 'returns true if branch matches' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/features/my-branch' })).to be true
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/features/my-branch/something' })).to be true
+ end
+
+ it 'returns false if branch does not match' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/master' })).to be false
+ end
+ end
+ end
+
+ context 'branch filter is not specified' do
+ let(:branch_filter) { nil }
+
+ it 'returns true' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/master' })).to be true
+ end
+ end
+
+ context 'branch filter is empty string' do
+ let(:branch_filter) { '' }
+
+ it 'acts like branch is not specified' do
+ expect(filter.matches?(:push_hooks, { ref: 'refs/heads/master' })).to be true
+ end
+ end
+ end
+
+ context 'for non-push-events hooks' do
+ let(:hook) do
+ create(:project_hook, issues_events: true, push_events: false, push_events_branch_filter: '')
+ end
+
+ it 'returns true as branch filters are not yet supported for these' do
+ expect(filter.matches?(:issues_events, { ref: 'refs/heads/master' })).to be true
+ end
+ end
+ end
+end
diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb
index 01129df1107..edd1cb455af 100644
--- a/spec/models/hooks/system_hook_spec.rb
+++ b/spec/models/hooks/system_hook_spec.rb
@@ -73,7 +73,7 @@ describe SystemHook do
it "project_destroy hook" do
project.add_maintainer(user)
- project.project_members.destroy_all
+ project.project_members.destroy_all # rubocop: disable DestroyAll
expect(WebMock).to have_requested(:post, system_hook.url).with(
body: /user_remove_from_team/,
@@ -110,7 +110,7 @@ describe SystemHook do
it 'group member destroy hook' do
group.add_maintainer(user)
- group.group_members.destroy_all
+ group.group_members.destroy_all # rubocop: disable DestroyAll
expect(WebMock).to have_requested(:post, system_hook.url).with(
body: /user_remove_from_group/,
diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb
index ea6d6e53ef5..a308ac6e33a 100644
--- a/spec/models/hooks/web_hook_spec.rb
+++ b/spec/models/hooks/web_hook_spec.rb
@@ -35,6 +35,32 @@ describe WebHook do
it { is_expected.not_to allow_values("foo\nbar", "foo\r\nbar").for(:token) }
end
+
+ describe 'push_events_branch_filter' do
+ it { is_expected.to allow_values("good_branch_name", "another/good-branch_name").for(:push_events_branch_filter) }
+ it { is_expected.to allow_values("").for(:push_events_branch_filter) }
+ it { is_expected.not_to allow_values("bad branch name", "bad~branchname").for(:push_events_branch_filter) }
+
+ it 'gets rid of whitespace' do
+ hook.push_events_branch_filter = ' branch '
+ hook.save
+
+ expect(hook.push_events_branch_filter).to eq('branch')
+ end
+
+ it 'stores whitespace only as empty' do
+ hook.push_events_branch_filter = ' '
+ hook.save
+
+ expect(hook.push_events_branch_filter).to eq('')
+ end
+ end
+ end
+
+ describe 'encrypted attributes' do
+ subject { described_class.encrypted_attributes.keys }
+
+ it { is_expected.to contain_exactly(:token, :url) }
end
describe 'execute' do
diff --git a/spec/models/instance_configuration_spec.rb b/spec/models/instance_configuration_spec.rb
index 8548fff5c76..cb3d6c7cda2 100644
--- a/spec/models/instance_configuration_spec.rb
+++ b/spec/models/instance_configuration_spec.rb
@@ -1,11 +1,11 @@
require 'spec_helper'
-RSpec.describe InstanceConfiguration do
+describe InstanceConfiguration do
context 'without cache' do
describe '#settings' do
describe '#ssh_algorithms_hashes' do
- let(:md5) { '54:e0:f8:70:d6:4f:4c:b1:b3:02:44:77:cf:cd:0d:fc' }
- let(:sha256) { '9327f0d15a48c4d9f6a3aee65a1825baf9a3412001c98169c5fd022ac27762fc' }
+ let(:md5) { '5a:65:6c:4d:d4:4c:6d:e6:59:25:b8:cf:ba:34:e7:64' }
+ let(:sha256) { 'SHA256:2KJDT7xf2i68mBgJ3TVsjISntg4droLbXYLfQj0VvSY' }
it 'does not return anything if file does not exist' do
stub_pub_file(exist: false)
@@ -52,7 +52,7 @@ RSpec.describe InstanceConfiguration do
expect(gitlab_pages).to eq(Settings.pages.symbolize_keys)
end
- it 'returns the Gitlab\'s pages host ip address' do
+ it 'returns the GitLab\'s pages host ip address' do
expect(gitlab_pages.keys).to include(:ip_address)
end
diff --git a/spec/models/internal_id_spec.rb b/spec/models/internal_id_spec.rb
index 20600f5fa38..52c00a74b4b 100644
--- a/spec/models/internal_id_spec.rb
+++ b/spec/models/internal_id_spec.rb
@@ -30,7 +30,7 @@ describe InternalId do
context 'with existing issues' do
before do
- rand(1..10).times { create(:issue, project: project) }
+ create_list(:issue, 2, project: project)
described_class.delete_all
end
@@ -54,7 +54,7 @@ describe InternalId do
end
it 'generates a strictly monotone, gapless sequence' do
- seq = (0..rand(100)).map do
+ seq = Array.new(10).map do
described_class.generate_next(issue, scope, usage, init)
end
normalized = seq.map { |i| i - seq.min }
@@ -65,7 +65,8 @@ describe InternalId do
context 'with an insufficient schema version' do
before do
described_class.reset_column_information
- expect(ActiveRecord::Migrator).to receive(:current_version).and_return(InternalId::REQUIRED_SCHEMA_VERSION - 1)
+ # Project factory will also call the current_version
+ expect(ActiveRecord::Migrator).to receive(:current_version).twice.and_return(InternalId::REQUIRED_SCHEMA_VERSION - 1)
end
let(:init) { double('block') }
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 84edfc3ff00..6f900a60213 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -84,15 +84,32 @@ describe Issue do
end
end
- describe '#closed_at' do
- it 'sets closed_at to Time.now when issue is closed' do
- issue = create(:issue, state: 'opened')
+ describe '#close' do
+ subject(:issue) { create(:issue, state: 'opened') }
- expect(issue.closed_at).to be_nil
+ it 'sets closed_at to Time.now when an issue is closed' do
+ expect { issue.close }.to change { issue.closed_at }.from(nil)
+ end
+
+ it 'changes the state to closed' do
+ expect { issue.close }.to change { issue.state }.from('opened').to('closed')
+ end
+ end
- issue.close
+ describe '#reopen' do
+ let(:user) { create(:user) }
+ let(:issue) { create(:issue, state: 'closed', closed_at: Time.now, closed_by: user) }
+
+ it 'sets closed_at to nil when an issue is reopend' do
+ expect { issue.reopen }.to change { issue.closed_at }.to(nil)
+ end
- expect(issue.closed_at).to be_present
+ it 'sets closed_by to nil when an issue is reopend' do
+ expect { issue.reopen }.to change { issue.closed_by }.from(user).to(nil)
+ end
+
+ it 'changes the state to opened' do
+ expect { issue.reopen }.to change { issue.state }.from('closed').to('opened')
end
end
@@ -188,98 +205,6 @@ describe Issue do
end
end
- describe '#closed_by_merge_requests' do
- let(:project) { create(:project, :repository) }
- let(:issue) { create(:issue, project: project)}
- let(:closed_issue) { build(:issue, :closed, project: project)}
-
- let(:mr) do
- opts = {
- title: 'Awesome merge_request',
- description: "Fixes #{issue.to_reference}",
- source_branch: 'feature',
- target_branch: 'master'
- }
- MergeRequests::CreateService.new(project, project.owner, opts).execute
- end
-
- let(:closed_mr) do
- opts = {
- title: 'Awesome merge_request 2',
- description: "Fixes #{issue.to_reference}",
- source_branch: 'feature',
- target_branch: 'master',
- state: 'closed'
- }
- MergeRequests::CreateService.new(project, project.owner, opts).execute
- end
-
- it 'returns the merge request to close this issue' do
- expect(issue.closed_by_merge_requests(mr.author)).to eq([mr])
- end
-
- it "returns an empty array when the merge request is closed already" do
- expect(issue.closed_by_merge_requests(closed_mr.author)).to eq([])
- end
-
- it "returns an empty array when the current issue is closed already" do
- expect(closed_issue.closed_by_merge_requests(closed_issue.author)).to eq([])
- end
- end
-
- describe '#referenced_merge_requests' do
- let(:project) { create(:project, :public) }
- let(:issue) do
- create(:issue, description: merge_request.to_reference, project: project)
- end
- let!(:merge_request) do
- create(:merge_request,
- source_project: project,
- source_branch: 'master',
- target_branch: 'feature')
- end
-
- it 'returns the referenced merge requests' do
- mr2 = create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_branch: 'master')
-
- create(:note_on_issue,
- noteable: issue,
- note: mr2.to_reference,
- project_id: project.id)
-
- expect(issue.referenced_merge_requests).to eq([merge_request, mr2])
- end
-
- it 'returns cross project referenced merge requests' do
- other_project = create(:project, :public)
- cross_project_merge_request = create(:merge_request, source_project: other_project)
- create(:note_on_issue,
- noteable: issue,
- note: cross_project_merge_request.to_reference(issue.project),
- project_id: issue.project.id)
-
- expect(issue.referenced_merge_requests).to eq([merge_request, cross_project_merge_request])
- end
-
- it 'excludes cross project references if the user cannot read cross project' do
- user = create(:user)
- allow(Ability).to receive(:allowed?).and_call_original
- expect(Ability).to receive(:allowed?).with(user, :read_cross_project) { false }
-
- other_project = create(:project, :public)
- cross_project_merge_request = create(:merge_request, source_project: other_project)
- create(:note_on_issue,
- noteable: issue,
- note: cross_project_merge_request.to_reference(issue.project),
- project_id: issue.project.id)
-
- expect(issue.referenced_merge_requests(user)).to eq([merge_request])
- end
- end
-
describe '#can_move?' do
let(:user) { create(:user) }
let(:issue) { create(:issue) }
@@ -343,40 +268,6 @@ describe Issue do
end
end
- describe '#related_branches' do
- let(:user) { create(:admin) }
-
- before do
- allow(subject.project.repository).to receive(:branch_names)
- .and_return(["mpempe", "#{subject.iid}mepmep", subject.to_branch_name, "#{subject.iid}-branch"])
-
- # Without this stub, the `create(:merge_request)` above fails because it can't find
- # the source branch. This seems like a reasonable compromise, in comparison with
- # setting up a full repo here.
- allow_any_instance_of(MergeRequest).to receive(:create_merge_request_diff)
- end
-
- it "selects the right branches when there are no referenced merge requests" do
- expect(subject.related_branches(user)).to eq([subject.to_branch_name, "#{subject.iid}-branch"])
- end
-
- it "selects the right branches when there is a referenced merge request" do
- merge_request = create(:merge_request, { description: "Closes ##{subject.iid}",
- source_project: subject.project,
- source_branch: "#{subject.iid}-branch" })
- merge_request.create_cross_references!(user)
- expect(subject.referenced_merge_requests(user)).not_to be_empty
- expect(subject.related_branches(user)).to eq([subject.to_branch_name])
- end
-
- it 'excludes stable branches from the related branches' do
- allow(subject.project.repository).to receive(:branch_names)
- .and_return(["#{subject.iid}-0-stable"])
-
- expect(subject.related_branches(user)).to eq []
- end
- end
-
describe '#suggested_branch_name' do
let(:repository) { double }
diff --git a/spec/models/label_note_spec.rb b/spec/models/label_note_spec.rb
new file mode 100644
index 00000000000..f69874d94aa
--- /dev/null
+++ b/spec/models/label_note_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe LabelNote do
+ set(:project) { create(:project, :repository) }
+ set(:user) { create(:user) }
+ set(:label) { create(:label, project: project) }
+ set(:label2) { create(:label, project: project) }
+ let(:resource_parent) { project }
+
+ context 'when resource is issue' do
+ set(:resource) { create(:issue, project: project) }
+
+ it_behaves_like 'label note created from events'
+ end
+
+ context 'when resource is merge request' do
+ set(:resource) { create(:merge_request, source_project: project, target_project: project) }
+
+ it_behaves_like 'label note created from events'
+ end
+end
diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb
index 99670af786a..3fc6c06b7fa 100644
--- a/spec/models/label_spec.rb
+++ b/spec/models/label_spec.rb
@@ -155,4 +155,40 @@ describe Label do
expect(described_class.search('feature')).to be_empty
end
end
+
+ describe '.subscribed_by' do
+ let!(:user) { create(:user) }
+ let!(:label) { create(:label) }
+ let!(:label2) { create(:label) }
+
+ before do
+ label.subscribe(user)
+ end
+
+ it 'returns subscribed labels' do
+ expect(described_class.subscribed_by(user.id)).to eq([label])
+ end
+
+ it 'returns nothing' do
+ expect(described_class.subscribed_by(0)).to be_empty
+ end
+ end
+
+ describe '.optionally_subscribed_by' do
+ let!(:user) { create(:user) }
+ let!(:label) { create(:label) }
+ let!(:label2) { create(:label) }
+
+ before do
+ label.subscribe(user)
+ end
+
+ it 'returns subscribed labels' do
+ expect(described_class.optionally_subscribed_by(user.id)).to eq([label])
+ end
+
+ it 'returns all labels if user_id is nil' do
+ expect(described_class.optionally_subscribed_by(nil)).to match_array([label, label2])
+ end
+ end
end
diff --git a/spec/models/lfs_object_spec.rb b/spec/models/lfs_object_spec.rb
index 6e35511e848..3f929710862 100644
--- a/spec/models/lfs_object_spec.rb
+++ b/spec/models/lfs_object_spec.rb
@@ -2,19 +2,13 @@ require 'spec_helper'
describe LfsObject do
describe '#local_store?' do
- it 'returns true when file_store is nil' do
- subject.file_store = nil
-
- expect(subject.local_store?).to eq true
- end
-
it 'returns true when file_store is equal to LfsObjectUploader::Store::LOCAL' do
subject.file_store = LfsObjectUploader::Store::LOCAL
expect(subject.local_store?).to eq true
end
- it 'returns false whe file_store is equal to LfsObjectUploader::Store::REMOTE' do
+ it 'returns false when file_store is equal to LfsObjectUploader::Store::REMOTE' do
subject.file_store = LfsObjectUploader::Store::REMOTE
expect(subject.local_store?).to eq false
@@ -83,19 +77,6 @@ describe LfsObject do
describe 'file is being stored' do
let(:lfs_object) { create(:lfs_object, :with_file) }
- context 'when object has nil store' do
- before do
- lfs_object.update_column(:file_store, nil)
- lfs_object.reload
- end
-
- it 'is stored locally' do
- expect(lfs_object.file_store).to be(nil)
- expect(lfs_object.file).to be_file_storage
- expect(lfs_object.file.object_store).to eq(ObjectStorage::Store::LOCAL)
- end
- end
-
context 'when existing object has local store' do
it 'is stored locally' do
expect(lfs_object.file_store).to be(ObjectStorage::Store::LOCAL)
diff --git a/spec/models/license_template_spec.rb b/spec/models/license_template_spec.rb
new file mode 100644
index 00000000000..dd912eefac1
--- /dev/null
+++ b/spec/models/license_template_spec.rb
@@ -0,0 +1,59 @@
+require 'spec_helper'
+
+describe LicenseTemplate do
+ describe '#content' do
+ it 'calls a proc exactly once if provided' do
+ lazy = build_template(-> { 'bar' })
+ content = lazy.content
+
+ expect(content).to eq('bar')
+ expect(content.object_id).to eq(lazy.content.object_id)
+
+ content.replace('foo')
+ expect(lazy.content).to eq('foo')
+ end
+
+ it 'returns a string if provided' do
+ lazy = build_template('bar')
+
+ expect(lazy.content).to eq('bar')
+ end
+ end
+
+ describe '#resolve!' do
+ let(:content) do
+ <<~TEXT
+ Pretend License
+
+ [project]
+
+ Copyright (c) [year] [fullname]
+ TEXT
+ end
+
+ let(:expected) do
+ <<~TEXT
+ Pretend License
+
+ Foo Project
+
+ Copyright (c) 1985 Nick Thomas
+ TEXT
+ end
+
+ let(:template) { build_template(content) }
+
+ it 'updates placeholders in a copy of the template content' do
+ expect(template.content.object_id).to eq(content.object_id)
+
+ template.resolve!(project_name: "Foo Project", fullname: "Nick Thomas", year: "1985")
+
+ expect(template.content).to eq(expected)
+ expect(template.content.object_id).not_to eq(content.object_id)
+ end
+ end
+
+ def build_template(content)
+ described_class.new(key: 'foo', name: 'foo', category: :Other, content: content)
+ end
+end
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index 90cce826b6c..cbe60b3a4a5 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -52,9 +52,9 @@ describe MergeRequestDiff do
context 'when it was not cleaned by the system' do
it 'returns persisted diffs' do
- expect(diff).to receive(:load_diffs)
+ expect(diff).to receive(:load_diffs).and_call_original
- diff.diffs
+ diff.diffs.diff_files
end
end
@@ -76,19 +76,19 @@ describe MergeRequestDiff do
end
it 'returns persisted diffs if cannot compare with diff refs' do
- expect(diff).to receive(:load_diffs)
+ expect(diff).to receive(:load_diffs).and_call_original
diff.update!(head_commit_sha: 'invalid-sha')
- diff.diffs
+ diff.diffs.diff_files
end
it 'returns persisted diffs if diff refs does not exist' do
- expect(diff).to receive(:load_diffs)
+ expect(diff).to receive(:load_diffs).and_call_original
diff.update!(start_commit_sha: nil, base_commit_sha: nil)
- diff.diffs
+ diff.diffs.diff_files
end
end
end
@@ -211,4 +211,38 @@ describe MergeRequestDiff do
expect(diff_with_commits.commits_count).to eq(29)
end
end
+
+ describe '#commits_by_shas' do
+ let(:commit_shas) { diff_with_commits.commit_shas }
+
+ it 'returns empty if no SHAs were provided' do
+ expect(diff_with_commits.commits_by_shas([])).to be_empty
+ end
+
+ it 'returns one SHA' do
+ commits = diff_with_commits.commits_by_shas([commit_shas.first, Gitlab::Git::BLANK_SHA])
+
+ expect(commits.count).to eq(1)
+ end
+
+ it 'returns all matching SHAs' do
+ commits = diff_with_commits.commits_by_shas(commit_shas)
+
+ expect(commits.count).to eq(commit_shas.count)
+ expect(commits.map(&:sha)).to match_array(commit_shas)
+ end
+ end
+
+ describe '#modified_paths' do
+ subject do
+ diff = create(:merge_request_diff)
+ create(:merge_request_diff_file, :new_file, merge_request_diff: diff)
+ create(:merge_request_diff_file, :renamed_file, merge_request_diff: diff)
+ diff
+ end
+
+ it 'returns affected file paths' do
+ expect(subject.modified_paths).to eq(%w{foo bar baz})
+ end
+ end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 6258bfa232f..a58dc8e25e8 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -13,6 +13,20 @@ describe MergeRequest do
it { is_expected.to belong_to(:merge_user).class_name("User") }
it { is_expected.to belong_to(:assignee) }
it { is_expected.to have_many(:merge_request_diffs) }
+
+ context 'for forks' do
+ let!(:project) { create(:project) }
+ let!(:fork) { fork_project(project) }
+ let!(:merge_request) { create(:merge_request, target_project: project, source_project: fork) }
+
+ it 'does not load another project due to inverse relationship' do
+ expect(project.merge_requests.first.target_project.object_id).to eq(project.object_id)
+ end
+
+ it 'finds the associated merge request' do
+ expect(project.merge_requests.find(merge_request.id)).to eq(merge_request)
+ end
+ end
end
describe '#squash_in_progress?' do
@@ -538,9 +552,9 @@ describe MergeRequest do
it 'delegates to the MR diffs' do
merge_request.save
- expect(merge_request.merge_request_diff).to receive(:raw_diffs).with(hash_including(options))
+ expect(merge_request.merge_request_diff).to receive(:raw_diffs).with(hash_including(options)).and_call_original
- merge_request.diffs(options)
+ merge_request.diffs(options).diff_files
end
end
@@ -617,6 +631,44 @@ describe MergeRequest do
end
end
+ describe '#modified_paths' do
+ let(:paths) { double(:paths) }
+ subject(:merge_request) { build(:merge_request) }
+
+ before do
+ expect(diff).to receive(:modified_paths).and_return(paths)
+ end
+
+ context 'when past_merge_request_diff is specified' do
+ let(:another_diff) { double(:merge_request_diff) }
+ let(:diff) { another_diff }
+
+ it 'returns affected file paths from specified past_merge_request_diff' do
+ expect(merge_request.modified_paths(past_merge_request_diff: another_diff)).to eq(paths)
+ end
+ end
+
+ context 'when compare is present' do
+ let(:compare) { double(:compare) }
+ let(:diff) { compare }
+
+ it 'returns affected file paths from compare' do
+ merge_request.compare = compare
+
+ expect(merge_request.modified_paths).to eq(paths)
+ end
+ end
+
+ context 'when no arguments provided' do
+ let(:diff) { merge_request.merge_request_diff }
+ subject(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master') }
+
+ it 'returns affected file paths for merge_request_diff' do
+ expect(merge_request.modified_paths).to eq(paths)
+ end
+ end
+ end
+
describe "#related_notes" do
let!(:merge_request) { create(:merge_request) }
@@ -746,7 +798,7 @@ describe MergeRequest do
end
describe "#wipless_title" do
- ['WIP ', 'WIP:', 'WIP: ', '[WIP]', '[WIP] ', ' [WIP] WIP [WIP] WIP: WIP '].each do |wip_prefix|
+ ['WIP ', 'WIP:', 'WIP: ', '[WIP]', '[WIP] ', '[WIP] WIP [WIP] WIP: WIP '].each do |wip_prefix|
it "removes the '#{wip_prefix}' prefix" do
wipless_title = subject.title
subject.title = "#{wip_prefix}#{subject.title}"
@@ -1058,6 +1110,26 @@ describe MergeRequest do
end
end
+ describe '#merge_pipeline' do
+ it 'returns nil when not merged' do
+ expect(subject.merge_pipeline).to be_nil
+ end
+
+ context 'when the MR is merged' do
+ let(:sha) { subject.target_project.commit.id }
+ let(:pipeline) { create(:ci_empty_pipeline, sha: sha, ref: subject.target_branch, project: subject.target_project) }
+
+ before do
+ subject.mark_as_merged!
+ subject.update_attribute(:merge_commit_sha, pipeline.sha)
+ end
+
+ it 'returns the post-merge pipeline' do
+ expect(subject.merge_pipeline).to eq(pipeline)
+ end
+ end
+ end
+
describe '#has_ci?' do
let(:merge_request) { build_stubbed(:merge_request) }
@@ -1710,7 +1782,7 @@ describe MergeRequest do
allow(subject).to receive(:head_pipeline) { nil }
end
- it { expect(subject.mergeable_ci_state?).to be_truthy }
+ it { expect(subject.mergeable_ci_state?).to be_falsey }
end
end
@@ -1764,7 +1836,7 @@ describe MergeRequest do
context 'with no discussions' do
before do
- merge_request.notes.destroy_all
+ merge_request.notes.destroy_all # rubocop: disable DestroyAll
end
it 'returns true' do
@@ -1802,8 +1874,8 @@ describe MergeRequest do
let(:environments) { create_list(:environment, 3, project: project) }
before do
- create(:deployment, environment: environments.first, ref: 'master', sha: project.commit('master').id)
- create(:deployment, environment: environments.second, ref: 'feature', sha: project.commit('feature').id)
+ create(:deployment, :success, environment: environments.first, ref: 'master', sha: project.commit('master').id)
+ create(:deployment, :success, environment: environments.second, ref: 'feature', sha: project.commit('feature').id)
end
it 'selects deployed environments' do
@@ -1823,7 +1895,7 @@ describe MergeRequest do
let(:source_environment) { create(:environment, project: source_project) }
before do
- create(:deployment, environment: source_environment, ref: 'feature', sha: merge_request.diff_head_sha)
+ create(:deployment, :success, environment: source_environment, ref: 'feature', sha: merge_request.diff_head_sha)
end
it 'selects deployed environments' do
@@ -1834,7 +1906,7 @@ describe MergeRequest do
let(:target_environment) { create(:environment, project: project) }
before do
- create(:deployment, environment: target_environment, tag: true, sha: merge_request.diff_head_sha)
+ create(:deployment, :success, environment: target_environment, tag: true, sha: merge_request.diff_head_sha)
end
it 'selects deployed environments' do
@@ -2577,6 +2649,36 @@ describe MergeRequest do
end
end
+ describe '#includes_any_commits?' do
+ it 'returns false' do
+ expect(subject.includes_any_commits?([])).to be_falsey
+ end
+
+ it 'returns false' do
+ expect(subject.includes_any_commits?([Gitlab::Git::BLANK_SHA])).to be_falsey
+ end
+
+ it 'returns true' do
+ expect(subject.includes_any_commits?([subject.merge_request_diff.head_commit_sha])).to be_truthy
+ end
+
+ it 'returns true even when there is a non-existent comit' do
+ expect(subject.includes_any_commits?([Gitlab::Git::BLANK_SHA, subject.merge_request_diff.head_commit_sha])).to be_truthy
+ end
+
+ context 'unpersisted merge request' do
+ let(:new_mr) { build(:merge_request) }
+
+ it 'returns false' do
+ expect(new_mr.includes_any_commits?([Gitlab::Git::BLANK_SHA])).to be_falsey
+ end
+
+ it 'returns true' do
+ expect(new_mr.includes_any_commits?([subject.merge_request_diff.head_commit_sha])).to be_truthy
+ end
+ end
+ end
+
describe '#can_allow_collaboration?' do
let(:target_project) { create(:project, :public) }
let(:source_project) { fork_project(target_project) }
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 55b984faecf..d11eb46159e 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -95,6 +95,24 @@ describe Milestone do
end
end
+ describe '.order_by_name_asc' do
+ it 'sorts by name ascending' do
+ milestone1 = create(:milestone, title: 'Foo')
+ milestone2 = create(:milestone, title: 'Bar')
+
+ expect(described_class.order_by_name_asc).to eq([milestone2, milestone1])
+ end
+ end
+
+ describe '.reorder_by_due_date_asc' do
+ it 'reorders the input relation' do
+ milestone1 = create(:milestone, due_date: Date.new(2018, 9, 30))
+ milestone2 = create(:milestone, due_date: Date.new(2018, 10, 20))
+
+ expect(described_class.reorder_by_due_date_asc).to eq([milestone1, milestone2])
+ end
+ end
+
describe "#percent_complete" do
it "does not count open issues" do
milestone.issues << issue
@@ -330,4 +348,41 @@ describe Milestone do
end
end
end
+
+ describe '.states_count' do
+ context 'when the projects have milestones' do
+ before do
+ project_1 = create(:project)
+ project_2 = create(:project)
+ group_1 = create(:group)
+ group_2 = create(:group)
+
+ create(:active_milestone, title: 'Active Group Milestone', project: project_1)
+ create(:closed_milestone, title: 'Closed Group Milestone', project: project_1)
+ create(:active_milestone, title: 'Active Group Milestone', project: project_2)
+ create(:closed_milestone, title: 'Closed Group Milestone', project: project_2)
+ create(:closed_milestone, title: 'Active Group Milestone', group: group_1)
+ create(:closed_milestone, title: 'Closed Group Milestone', group: group_1)
+ create(:closed_milestone, title: 'Active Group Milestone', group: group_2)
+ create(:closed_milestone, title: 'Closed Group Milestone', group: group_2)
+ end
+
+ it 'returns the quantity of milestones in each possible state' do
+ expected_count = { opened: 5, closed: 6, all: 11 }
+
+ count = described_class.states_count(Project.all, Group.all)
+ expect(count).to eq(expected_count)
+ end
+ end
+
+ context 'when the projects do not have milestones' do
+ it 'returns 0 as the quantity of global milestones in each state' do
+ expected_count = { opened: 0, closed: 0, all: 0 }
+
+ count = described_class.states_count([project])
+
+ expect(count).to eq(expected_count)
+ end
+ end
+ end
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 9b7f932ec3a..2db42fe802a 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe Namespace do
include ProjectForksHelper
+ include GitHelpers
let!(:namespace) { create(:namespace) }
let(:gitlab_shell) { Gitlab::Shell.new }
@@ -82,6 +83,27 @@ describe Namespace do
it { expect(namespace.human_name).to eq(namespace.owner_name) }
end
+ describe '#first_project_with_container_registry_tags' do
+ let(:container_repository) { create(:container_repository) }
+ let!(:project) { create(:project, namespace: namespace, container_repositories: [container_repository]) }
+
+ before do
+ stub_container_registry_config(enabled: true)
+ end
+
+ it 'returns the project' do
+ stub_container_registry_tags(repository: :any, tags: ['tag'])
+
+ expect(namespace.first_project_with_container_registry_tags).to eq(project)
+ end
+
+ it 'returns no project' do
+ stub_container_registry_tags(repository: :any, tags: nil)
+
+ expect(namespace.first_project_with_container_registry_tags).to be_nil
+ end
+ end
+
describe '.search' do
let(:namespace) { create(:namespace) }
@@ -184,7 +206,8 @@ describe Namespace do
end
it 'raises an error about not movable project' do
- expect { namespace.move_dir }.to raise_error(/Namespace cannot be moved/)
+ expect { namespace.move_dir }.to raise_error(Gitlab::UpdatePathError,
+ /Namespace .* cannot be moved/)
end
end
end
@@ -339,9 +362,7 @@ describe Namespace do
end
def project_rugged(project)
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
+ rugged_repo(project.repository)
end
end
@@ -394,12 +415,6 @@ describe Namespace do
child.destroy
end
end
-
- it 'removes the exports folder' do
- expect(namespace).to receive(:remove_exports!)
-
- namespace.destroy
- end
end
context 'hashed storage' do
@@ -414,12 +429,6 @@ describe Namespace do
expect(File.exist?(deleted_path_in_dir)).to be(false)
end
-
- it 'removes the exports folder' do
- expect(namespace).to receive(:remove_exports!)
-
- namespace.destroy
- end
end
end
@@ -553,6 +562,17 @@ describe Namespace do
it { expect(group.all_projects.to_a).to match_array([project2, project1]) }
end
+ describe '#all_pipelines' do
+ let(:group) { create(:group) }
+ let(:child) { create(:group, parent: group) }
+ let!(:project1) { create(:project_empty_repo, namespace: group) }
+ let!(:project2) { create(:project_empty_repo, namespace: child) }
+ let!(:pipeline1) { create(:ci_empty_pipeline, project: project1) }
+ let!(:pipeline2) { create(:ci_empty_pipeline, project: project2) }
+
+ it { expect(group.all_pipelines.to_a).to match_array([pipeline1, pipeline2]) }
+ end
+
describe '#share_with_group_lock with subgroups', :nested_groups do
context 'when creating a subgroup' do
let(:subgroup) { create(:group, parent: root_group )}
@@ -706,26 +726,6 @@ describe Namespace do
end
end
- describe '#remove_exports' do
- let(:legacy_project) { create(:project, :with_export, :legacy_storage, namespace: namespace) }
- let(:hashed_project) { create(:project, :with_export, namespace: namespace) }
- let(:export_path) { Dir.mktmpdir('namespace_remove_exports_spec') }
- let(:legacy_export) { legacy_project.export_project_path }
- let(:hashed_export) { hashed_project.export_project_path }
-
- it 'removes exports for legacy and hashed projects' do
- allow(Gitlab::ImportExport).to receive(:storage_path) { export_path }
-
- expect(File.exist?(legacy_export)).to be_truthy
- expect(File.exist?(hashed_export)).to be_truthy
-
- namespace.remove_exports!
-
- expect(File.exist?(legacy_export)).to be_falsy
- expect(File.exist?(hashed_export)).to be_falsy
- end
- end
-
describe '#full_path_was' do
context 'when the group has no parent' do
it 'should return the path was' do
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 947be44c903..f9be61e4768 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -231,33 +231,60 @@ describe Note do
let(:ext_proj) { create(:project, :public) }
let(:ext_issue) { create(:issue, project: ext_proj) }
- let(:note) do
- create :note,
- noteable: ext_issue, project: ext_proj,
- note: "mentioned in issue #{private_issue.to_reference(ext_proj)}",
- system: true
- end
+ shared_examples "checks references" do
+ it "returns true" do
+ expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_truthy
+ end
- it "returns true" do
- expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_truthy
- end
+ it "returns false" do
+ expect(note.cross_reference_not_visible_for?(private_user)).to be_falsy
+ end
- it "returns false" do
- expect(note.cross_reference_not_visible_for?(private_user)).to be_falsy
+ it "returns false if user visible reference count set" do
+ note.user_visible_reference_count = 1
+ note.total_reference_count = 1
+
+ expect(note).not_to receive(:reference_mentionables)
+ expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_falsy
+ end
+
+ it "returns true if ref count is 0" do
+ note.user_visible_reference_count = 0
+
+ expect(note).not_to receive(:reference_mentionables)
+ expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_truthy
+ end
end
- it "returns false if user visible reference count set" do
- note.user_visible_reference_count = 1
+ context "when there is one reference in note" do
+ let(:note) do
+ create :note,
+ noteable: ext_issue, project: ext_proj,
+ note: "mentioned in issue #{private_issue.to_reference(ext_proj)}",
+ system: true
+ end
- expect(note).not_to receive(:reference_mentionables)
- expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_falsy
+ it_behaves_like "checks references"
end
- it "returns true if ref count is 0" do
- note.user_visible_reference_count = 0
+ context "when there are two references in note" do
+ let(:note) do
+ create :note,
+ noteable: ext_issue, project: ext_proj,
+ note: "mentioned in issue #{private_issue.to_reference(ext_proj)} and " \
+ "public issue #{ext_issue.to_reference(ext_proj)}",
+ system: true
+ end
+
+ it_behaves_like "checks references"
- expect(note).not_to receive(:reference_mentionables)
- expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_truthy
+ it "returns true if user visible reference count set and there is a private reference" do
+ note.user_visible_reference_count = 1
+ note.total_reference_count = 2
+
+ expect(note).not_to receive(:reference_mentionables)
+ expect(note.cross_reference_not_visible_for?(ext_issue.author)).to be_truthy
+ end
end
end
@@ -269,7 +296,7 @@ describe Note do
end
context 'when the note might contain cross references' do
- SystemNoteMetadata::TYPES_WITH_CROSS_REFERENCES.each do |type|
+ SystemNoteMetadata.new.cross_reference_types.each do |type|
let(:note) { create(:note, :system) }
let!(:metadata) { create(:system_note_metadata, note: note, action: type) }
@@ -838,5 +865,29 @@ describe Note do
note.save!
end
end
+
+ describe '#with_notes_filter' do
+ let!(:comment) { create(:note) }
+ let!(:system_note) { create(:note, system: true) }
+
+ context 'when notes filter is nil' do
+ subject { described_class.with_notes_filter(nil) }
+
+ it { is_expected.to include(comment, system_note) }
+ end
+
+ context 'when notes filter is set to all notes' do
+ subject { described_class.with_notes_filter(UserPreference::NOTES_FILTERS[:all_notes]) }
+
+ it { is_expected.to include(comment, system_note) }
+ end
+
+ context 'when notes filter is set to only comments' do
+ subject { described_class.with_notes_filter(UserPreference::NOTES_FILTERS[:only_comments]) }
+
+ it { is_expected.to include(comment) }
+ it { is_expected.not_to include(system_note) }
+ end
+ end
end
end
diff --git a/spec/models/notification_setting_spec.rb b/spec/models/notification_setting_spec.rb
index 77c475b9f52..e545b674b4f 100644
--- a/spec/models/notification_setting_spec.rb
+++ b/spec/models/notification_setting_spec.rb
@@ -94,9 +94,39 @@ RSpec.describe NotificationSetting do
end
end
- context 'email events' do
- it 'includes EXCLUDED_WATCHER_EVENTS in EMAIL_EVENTS' do
- expect(described_class::EMAIL_EVENTS).to include(*described_class::EXCLUDED_WATCHER_EVENTS)
+ describe '.email_events' do
+ subject { described_class.email_events }
+
+ it 'returns email events' do
+ expect(subject).to include(
+ :new_note,
+ :new_issue,
+ :reopen_issue,
+ :close_issue,
+ :reassign_issue,
+ :new_merge_request,
+ :reopen_merge_request,
+ :close_merge_request,
+ :reassign_merge_request,
+ :merge_merge_request,
+ :failed_pipeline,
+ :success_pipeline
+ )
+ end
+
+ it 'includes EXCLUDED_WATCHER_EVENTS' do
+ expect(subject).to include(*described_class::EXCLUDED_WATCHER_EVENTS)
+ end
+ end
+
+ describe '#email_events' do
+ let(:source) { build(:group) }
+
+ subject { build(:notification_setting, source: source) }
+
+ it 'calls email_events' do
+ expect(described_class).to receive(:email_events).with(source)
+ subject.email_events
end
end
end
diff --git a/spec/models/personal_access_token_spec.rb b/spec/models/personal_access_token_spec.rb
index 2bb1c49b740..c82ab9c9e62 100644
--- a/spec/models/personal_access_token_spec.rb
+++ b/spec/models/personal_access_token_spec.rb
@@ -49,18 +49,36 @@ describe PersonalAccessToken do
describe 'Redis storage' do
let(:user_id) { 123 }
- let(:token) { 'abc000foo' }
+ let(:token) { 'KS3wegQYXBLYhQsciwsj' }
- before do
- subject.redis_store!(user_id, token)
+ context 'reading encrypted data' do
+ before do
+ subject.redis_store!(user_id, token)
+ end
+
+ it 'returns stored data' do
+ expect(subject.redis_getdel(user_id)).to eq(token)
+ end
end
- it 'returns stored data' do
- expect(subject.redis_getdel(user_id)).to eq(token)
+ context 'reading unencrypted data' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(described_class.redis_shared_state_key(user_id),
+ token,
+ ex: PersonalAccessToken::REDIS_EXPIRY_TIME)
+ end
+ end
+
+ it 'returns stored data unmodified' do
+ expect(subject.redis_getdel(user_id)).to eq(token)
+ end
end
context 'after deletion' do
before do
+ subject.redis_store!(user_id, token)
+
expect(subject.redis_getdel(user_id)).to eq(token)
end
diff --git a/spec/models/postgresql/replication_slot_spec.rb b/spec/models/postgresql/replication_slot_spec.rb
index 919a7526803..e100af7ddc7 100644
--- a/spec/models/postgresql/replication_slot_spec.rb
+++ b/spec/models/postgresql/replication_slot_spec.rb
@@ -3,7 +3,27 @@
require 'spec_helper'
describe Postgresql::ReplicationSlot, :postgresql do
+ describe '.in_use?' do
+ it 'returns true when replication slots are present' do
+ expect(described_class).to receive(:exists?).and_return(true)
+ expect(described_class.in_use?).to be_truthy
+ end
+
+ it 'returns false when replication slots are not present' do
+ expect(described_class.in_use?).to be_falsey
+ end
+
+ it 'returns false if the existence check is invalid' do
+ expect(described_class).to receive(:exists?).and_raise(ActiveRecord::StatementInvalid.new('PG::FeatureNotSupported'))
+ expect(described_class.in_use?).to be_falsey
+ end
+ end
+
describe '.lag_too_great?' do
+ before do
+ expect(described_class).to receive(:in_use?).and_return(true)
+ end
+
it 'returns true when replication lag is too great' do
expect(described_class)
.to receive(:pluck)
diff --git a/spec/models/project_auto_devops_spec.rb b/spec/models/project_auto_devops_spec.rb
index 749b2094787..342798f730b 100644
--- a/spec/models/project_auto_devops_spec.rb
+++ b/spec/models/project_auto_devops_spec.rb
@@ -70,24 +70,31 @@ describe ProjectAutoDevops do
end
context 'when deploy_strategy is manual' do
- let(:domain) { 'example.com' }
-
- before do
- auto_devops.deploy_strategy = 'manual'
+ let(:auto_devops) { build_stubbed(:project_auto_devops, :manual_deployment, project: project) }
+ let(:expected_variables) do
+ [
+ { key: 'INCREMENTAL_ROLLOUT_MODE', value: 'manual' },
+ { key: 'STAGING_ENABLED', value: '1' },
+ { key: 'INCREMENTAL_ROLLOUT_ENABLED', value: '1' }
+ ]
end
+ it { expect(auto_devops.predefined_variables).to include(*expected_variables) }
+ end
+
+ context 'when deploy_strategy is continuous' do
+ let(:auto_devops) { build_stubbed(:project_auto_devops, :continuous_deployment, project: project) }
+
it do
expect(auto_devops.predefined_variables.map { |var| var[:key] })
- .to include("STAGING_ENABLED", "INCREMENTAL_ROLLOUT_ENABLED")
+ .not_to include("STAGING_ENABLED", "INCREMENTAL_ROLLOUT_ENABLED")
end
end
- context 'when deploy_strategy is continuous' do
- let(:domain) { 'example.com' }
+ context 'when deploy_strategy is timed_incremental' do
+ let(:auto_devops) { build_stubbed(:project_auto_devops, :timed_incremental_deployment, project: project) }
- before do
- auto_devops.deploy_strategy = 'continuous'
- end
+ it { expect(auto_devops.predefined_variables).to include(key: 'INCREMENTAL_ROLLOUT_MODE', value: 'timed') }
it do
expect(auto_devops.predefined_variables.map { |var| var[:key] })
@@ -100,7 +107,7 @@ describe ProjectAutoDevops do
end
end
- describe '#set_gitlab_deploy_token' do
+ describe '#create_gitlab_deploy_token' do
let(:auto_devops) { build(:project_auto_devops, project: project) }
context 'when the project is public' do
@@ -144,9 +151,9 @@ describe ProjectAutoDevops do
end
end
- context 'when autodevops is enabled at instancel level' do
+ context 'when autodevops is enabled at instance level' do
let(:project) { create(:project, :repository, :internal) }
- let(:auto_devops) { build(:project_auto_devops, :disabled, project: project) }
+ let(:auto_devops) { build(:project_auto_devops, enabled: nil, project: project) }
it 'should create a deploy token' do
allow(Gitlab::CurrentSettings).to receive(:auto_devops_enabled?).and_return(true)
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index 10617edec0f..fee7d65c217 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -17,7 +17,7 @@ describe ProjectFeature do
end
describe '#feature_available?' do
- let(:features) { %w(issues wiki builds merge_requests snippets repository) }
+ let(:features) { %w(issues wiki builds merge_requests snippets repository pages) }
context 'when features are disabled' do
it "returns false" do
@@ -73,6 +73,22 @@ describe ProjectFeature do
end
end
end
+
+ context 'when feature is disabled by a feature flag' do
+ it 'returns false' do
+ stub_feature_flags(issues: false)
+
+ expect(project.feature_available?(:issues, user)).to eq(false)
+ end
+ end
+
+ context 'when feature is enabled by a feature flag' do
+ it 'returns true' do
+ stub_feature_flags(issues: true)
+
+ expect(project.feature_available?(:issues, user)).to eq(true)
+ end
+ end
end
context 'repository related features' do
@@ -96,6 +112,19 @@ describe ProjectFeature do
end
end
+ context 'public features' do
+ it "does not allow public for other than pages" do
+ features = %w(issues wiki builds merge_requests snippets repository)
+ project_feature = project.project_feature
+
+ features.each do |feature|
+ field = "#{feature}_access_level".to_sym
+ project_feature.update_attribute(field, ProjectFeature::PUBLIC)
+ expect(project_feature.valid?).to be_falsy
+ end
+ end
+ end
+
describe '#*_enabled?' do
let(:features) { %w(wiki builds merge_requests) }
@@ -119,46 +148,4 @@ describe ProjectFeature do
end
end
end
-
- context 'Site Statistics' do
- set(:project_with_wiki) { create(:project, :wiki_enabled) }
- set(:project_without_wiki) { create(:project, :wiki_disabled) }
-
- context 'when creating a project' do
- it 'tracks wiki availability when wikis are enabled by default' do
- expect { create(:project) }.to change { SiteStatistic.fetch.wikis_count }.by(1)
- end
-
- it 'does not track wiki availability when wikis are disabled by default' do
- expect { create(:project, :wiki_disabled) }.not_to change { SiteStatistic.fetch.wikis_count }
- end
- end
-
- context 'when updating a project_feature' do
- it 'untracks wiki availability when disabling wiki access' do
- expect { project_with_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::DISABLED) }
- .to change { SiteStatistic.fetch.wikis_count }.by(-1)
- end
-
- it 'tracks again wiki availability when re-enabling wiki access as public' do
- expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::ENABLED) }
- .to change { SiteStatistic.fetch.wikis_count }.by(1)
- end
-
- it 'tracks again wiki availability when re-enabling wiki access as private' do
- expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::PRIVATE) }
- .to change { SiteStatistic.fetch.wikis_count }.by(1)
- end
- end
-
- context 'when removing a project' do
- it 'untracks wiki availability when removing a project with previous wiki access' do
- expect { project_with_wiki.destroy }.to change { SiteStatistic.fetch.wikis_count }.by(-1)
- end
-
- it 'does not untrack wiki availability when removing a project without wiki access' do
- expect { project_without_wiki.destroy }.not_to change { SiteStatistic.fetch.wikis_count }
- end
- end
- end
end
diff --git a/spec/models/project_group_link_spec.rb b/spec/models/project_group_link_spec.rb
index 1fccf92627a..5bea21427d4 100644
--- a/spec/models/project_group_link_spec.rb
+++ b/spec/models/project_group_link_spec.rb
@@ -41,7 +41,7 @@ describe ProjectGroupLink do
project.project_group_links.create(group: group)
group_users.each { |user| expect(user.authorized_projects).to include(project) }
- project.project_group_links.destroy_all
+ project.project_group_links.destroy_all # rubocop: disable DestroyAll
group_users.each { |user| expect(user.authorized_projects).not_to include(project) }
end
end
diff --git a/spec/models/project_services/bamboo_service_spec.rb b/spec/models/project_services/bamboo_service_spec.rb
index f4f7afb1b92..ee84fa95f0e 100644
--- a/spec/models/project_services/bamboo_service_spec.rb
+++ b/spec/models/project_services/bamboo_service_spec.rb
@@ -245,6 +245,7 @@ describe BambooService, :use_clean_rails_memory_store_caching do
end
def bamboo_response(result_key: 42, build_state: 'success', size: 1)
- %Q({"results":{"results":{"size":"#{size}","result":{"buildState":"#{build_state}","planResultKey":{"key":"#{result_key}"}}}}})
+ # reference: https://docs.atlassian.com/atlassian-bamboo/REST/6.2.5/#d2e786
+ %Q({"results":{"results":{"size":"#{size}","result":[{"buildState":"#{build_state}","planResultKey":{"key":"#{result_key}"}}]}}})
end
end
diff --git a/spec/models/project_services/chat_message/merge_message_spec.rb b/spec/models/project_services/chat_message/merge_message_spec.rb
index 184a07ae0f9..7997b5bb6b9 100644
--- a/spec/models/project_services/chat_message/merge_message_spec.rb
+++ b/spec/models/project_services/chat_message/merge_message_spec.rb
@@ -27,13 +27,30 @@ describe ChatMessage::MergeMessage do
}
end
+ # Integration point in EE
+ context 'when state is overridden' do
+ it 'respects the overridden state' do
+ allow(subject).to receive(:state_or_action_text) { 'devoured' }
+
+ aggregate_failures do
+ expect(subject.summary).not_to include('opened')
+ expect(subject.summary).to include('devoured')
+
+ activity_title = subject.activity[:title]
+
+ expect(activity_title).not_to include('opened')
+ expect(activity_title).to include('devoured')
+ end
+ end
+ end
+
context 'without markdown' do
let(:color) { '#345' }
context 'open' do
it 'returns a message regarding opening of merge requests' do
expect(subject.pretext).to eq(
- 'Test User (test.user) opened <http://somewhere.com/merge_requests/100|!100 *Merge Request title*> in <http://somewhere.com|project_name>: *Merge Request title*')
+ 'Test User (test.user) opened <http://somewhere.com/merge_requests/100|!100 *Merge Request title*> in <http://somewhere.com|project_name>')
expect(subject.attachments).to be_empty
end
end
@@ -44,7 +61,7 @@ describe ChatMessage::MergeMessage do
end
it 'returns a message regarding closing of merge requests' do
expect(subject.pretext).to eq(
- 'Test User (test.user) closed <http://somewhere.com/merge_requests/100|!100 *Merge Request title*> in <http://somewhere.com|project_name>: *Merge Request title*')
+ 'Test User (test.user) closed <http://somewhere.com/merge_requests/100|!100 *Merge Request title*> in <http://somewhere.com|project_name>')
expect(subject.attachments).to be_empty
end
end
@@ -58,7 +75,7 @@ describe ChatMessage::MergeMessage do
context 'open' do
it 'returns a message regarding opening of merge requests' do
expect(subject.pretext).to eq(
- 'Test User (test.user) opened [!100 *Merge Request title*](http://somewhere.com/merge_requests/100) in [project_name](http://somewhere.com): *Merge Request title*')
+ 'Test User (test.user) opened [!100 *Merge Request title*](http://somewhere.com/merge_requests/100) in [project_name](http://somewhere.com)')
expect(subject.attachments).to be_empty
expect(subject.activity).to eq({
title: 'Merge Request opened by Test User (test.user)',
@@ -76,7 +93,7 @@ describe ChatMessage::MergeMessage do
it 'returns a message regarding closing of merge requests' do
expect(subject.pretext).to eq(
- 'Test User (test.user) closed [!100 *Merge Request title*](http://somewhere.com/merge_requests/100) in [project_name](http://somewhere.com): *Merge Request title*')
+ 'Test User (test.user) closed [!100 *Merge Request title*](http://somewhere.com/merge_requests/100) in [project_name](http://somewhere.com)')
expect(subject.attachments).to be_empty
expect(subject.activity).to eq({
title: 'Merge Request closed by Test User (test.user)',
diff --git a/spec/models/project_services/chat_message/push_message_spec.rb b/spec/models/project_services/chat_message/push_message_spec.rb
index 19c2862264f..973d6bdb2a0 100644
--- a/spec/models/project_services/chat_message/push_message_spec.rb
+++ b/spec/models/project_services/chat_message/push_message_spec.rb
@@ -48,12 +48,12 @@ describe ChatMessage::PushMessage do
'test.user pushed to branch [master](http://url.com/commits/master) of [project_name](http://url.com) ([Compare changes](http://url.com/compare/before...after))')
expect(subject.attachments).to eq(
"[abcdefgh](http://url1.com): message1 - author1\n\n[12345678](http://url2.com): message2 - author2")
- expect(subject.activity).to eq({
- title: 'test.user pushed to branch',
+ expect(subject.activity).to eq(
+ title: 'test.user pushed to branch [master](http://url.com/commits/master)',
subtitle: 'in [project_name](http://url.com)',
text: '[Compare changes](http://url.com/compare/before...after)',
image: 'http://someavatar.com'
- })
+ )
end
end
end
@@ -89,12 +89,53 @@ describe ChatMessage::PushMessage do
expect(subject.pretext).to eq(
'test.user pushed new tag [new_tag](http://url.com/commits/new_tag) to [project_name](http://url.com)')
expect(subject.attachments).to be_empty
- expect(subject.activity).to eq({
- title: 'test.user created tag',
+ expect(subject.activity).to eq(
+ title: 'test.user pushed new tag [new_tag](http://url.com/commits/new_tag)',
subtitle: 'in [project_name](http://url.com)',
text: '[Compare changes](http://url.com/compare/0000000000000000000000000000000000000000...after)',
image: 'http://someavatar.com'
- })
+ )
+ end
+ end
+ end
+
+ context 'removed tag' do
+ let(:args) do
+ {
+ after: Gitlab::Git::BLANK_SHA,
+ before: 'before',
+ project_name: 'project_name',
+ ref: 'refs/tags/new_tag',
+ user_name: 'test.user',
+ user_avatar: 'http://someavatar.com',
+ project_url: 'http://url.com'
+ }
+ end
+
+ context 'without markdown' do
+ it 'returns a message regarding removal of tags' do
+ expect(subject.pretext).to eq('test.user removed tag ' \
+ 'new_tag from ' \
+ '<http://url.com|project_name>')
+ expect(subject.attachments).to be_empty
+ end
+ end
+
+ context 'with markdown' do
+ before do
+ args[:markdown] = true
+ end
+
+ it 'returns a message regarding removal of tags' do
+ expect(subject.pretext).to eq(
+ 'test.user removed tag new_tag from [project_name](http://url.com)')
+ expect(subject.attachments).to be_empty
+ expect(subject.activity).to eq(
+ title: 'test.user removed tag new_tag',
+ subtitle: 'in [project_name](http://url.com)',
+ text: '[Compare changes](http://url.com/compare/before...0000000000000000000000000000000000000000)',
+ image: 'http://someavatar.com'
+ )
end
end
end
@@ -122,12 +163,12 @@ describe ChatMessage::PushMessage do
expect(subject.pretext).to eq(
'test.user pushed new branch [master](http://url.com/commits/master) to [project_name](http://url.com)')
expect(subject.attachments).to be_empty
- expect(subject.activity).to eq({
- title: 'test.user created branch',
+ expect(subject.activity).to eq(
+ title: 'test.user pushed new branch [master](http://url.com/commits/master)',
subtitle: 'in [project_name](http://url.com)',
text: '[Compare changes](http://url.com/compare/0000000000000000000000000000000000000000...after)',
image: 'http://someavatar.com'
- })
+ )
end
end
end
@@ -154,12 +195,12 @@ describe ChatMessage::PushMessage do
expect(subject.pretext).to eq(
'test.user removed branch master from [project_name](http://url.com)')
expect(subject.attachments).to be_empty
- expect(subject.activity).to eq({
- title: 'test.user removed branch',
+ expect(subject.activity).to eq(
+ title: 'test.user removed branch master',
subtitle: 'in [project_name](http://url.com)',
text: '[Compare changes](http://url.com/compare/before...0000000000000000000000000000000000000000)',
image: 'http://someavatar.com'
- })
+ )
end
end
end
diff --git a/spec/models/project_services/chat_notification_service_spec.rb b/spec/models/project_services/chat_notification_service_spec.rb
index 3aa1039d8bf..46713df77da 100644
--- a/spec/models/project_services/chat_notification_service_spec.rb
+++ b/spec/models/project_services/chat_notification_service_spec.rb
@@ -26,4 +26,54 @@ describe ChatNotificationService do
end
end
end
+
+ describe '#execute' do
+ let(:chat_service) { described_class.new }
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
+ let(:webhook_url) { 'https://example.gitlab.com/' }
+
+ before do
+ allow(chat_service).to receive_messages(
+ project: project,
+ project_id: project.id,
+ service_hook: true,
+ webhook: webhook_url
+ )
+
+ WebMock.stub_request(:post, webhook_url)
+
+ subject.active = true
+ end
+
+ context 'with a repository' do
+ it 'returns true' do
+ subject.project = project
+ data = Gitlab::DataBuilder::Push.build_sample(project, user)
+
+ expect(Slack::Notifier).to receive(:new)
+ .with(webhook_url, {})
+ .and_return(
+ double(:slack_service).as_null_object
+ )
+
+ expect(chat_service.execute(data)).to be true
+ end
+ end
+
+ context 'with an empty repository' do
+ it 'returns true' do
+ subject.project = create(:project, :empty_repo)
+ data = Gitlab::DataBuilder::Push.build_sample(subject.project, user)
+
+ expect(Slack::Notifier).to receive(:new)
+ .with(webhook_url, {})
+ .and_return(
+ double(:slack_service).as_null_object
+ )
+
+ expect(chat_service.execute(data)).to be true
+ end
+ end
+ end
end
diff --git a/spec/models/project_services/discord_service_spec.rb b/spec/models/project_services/discord_service_spec.rb
new file mode 100644
index 00000000000..be82f223478
--- /dev/null
+++ b/spec/models/project_services/discord_service_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+describe DiscordService do
+ it_behaves_like "chat service", "Discord notifications" do
+ let(:client) { Discordrb::Webhooks::Client }
+ let(:client_arguments) { { url: webhook_url } }
+ let(:content_key) { :content }
+ end
+end
diff --git a/spec/models/project_services/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb
deleted file mode 100644
index 6e417323e40..00000000000
--- a/spec/models/project_services/gemnasium_service_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-require 'spec_helper'
-
-describe GemnasiumService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe 'Validations' do
- context 'when service is active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of(:token) }
- it { is_expected.to validate_presence_of(:api_key) }
- end
-
- context 'when service is inactive' do
- before do
- subject.active = false
- end
-
- it { is_expected.not_to validate_presence_of(:token) }
- it { is_expected.not_to validate_presence_of(:api_key) }
- end
- end
-
- describe "deprecated?" do
- let(:project) { create(:project, :repository) }
- let(:gemnasium_service) { described_class.new }
-
- before do
- allow(gemnasium_service).to receive_messages(
- project_id: project.id,
- project: project,
- service_hook: true,
- token: 'verySecret',
- api_key: 'GemnasiumUserApiKey'
- )
- end
-
- it "is true" do
- expect(gemnasium_service.deprecated?).to be true
- end
-
- it "can't create a new service" do
- expect(gemnasium_service.save).to be false
- expect(gemnasium_service.errors[:base].first)
- .to eq('Gemnasium has been acquired by GitLab in January 2018. Since May 15, 2018, the service provided by Gemnasium is no longer available.')
- end
- end
-
- describe "Execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:gemnasium_service) { described_class.new }
- let(:sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
-
- before do
- allow(gemnasium_service).to receive_messages(
- project_id: project.id,
- project: project,
- service_hook: true,
- token: 'verySecret',
- api_key: 'GemnasiumUserApiKey'
- )
- end
- it "calls Gemnasium service" do
- expect(Gemnasium::GitlabService).to receive(:execute).with(an_instance_of(Hash)).once
- gemnasium_service.execute(sample_data)
- end
- end
-end
diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb
index cfa55188a64..0505ac9b49c 100644
--- a/spec/models/project_services/hangouts_chat_service_spec.rb
+++ b/spec/models/project_services/hangouts_chat_service_spec.rb
@@ -1,246 +1,11 @@
-require 'spec_helper'
+# frozen_string_literal: true
-describe HangoutsChatService do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe 'Validations' do
- context 'when service is active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of(:webhook) }
- it_behaves_like 'issue tracker service URL attribute', :webhook
- end
-
- context 'when service is inactive' do
- before do
- subject.active = false
- end
-
- it { is_expected.not_to validate_presence_of(:webhook) }
- end
- end
-
- describe '#execute' do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:webhook_url) { 'https://example.gitlab.com/' }
-
- before do
- allow(subject).to receive_messages(
- project: project,
- project_id: project.id,
- service_hook: true,
- webhook: webhook_url
- )
-
- WebMock.stub_request(:post, webhook_url)
- end
-
- shared_examples 'Hangouts Chat service' do
- it 'calls Hangouts Chat API' do
- subject.execute(sample_data)
-
- expect(WebMock)
- .to have_requested(:post, webhook_url)
- .with { |req| req.body =~ /\A{"text":.+}\Z/ }
- .once
- end
- end
-
- context 'with push events' do
- let(:sample_data) do
- Gitlab::DataBuilder::Push.build_sample(project, user)
- end
-
- it_behaves_like 'Hangouts Chat service'
-
- it 'specifies the webhook when it is configured' do
- expect(HangoutsChat::Sender).to receive(:new).with(webhook_url).and_return(double(:hangouts_chat_service).as_null_object)
-
- subject.execute(sample_data)
- end
-
- context 'with not default branch' do
- let(:sample_data) do
- Gitlab::DataBuilder::Push.build(project, user, nil, nil, 'not-the-default-branch')
- end
-
- context 'when notify_only_default_branch enabled' do
- before do
- subject.notify_only_default_branch = true
- end
-
- it 'does not call the Hangouts Chat API' do
- result = subject.execute(sample_data)
-
- expect(result).to be_falsy
- end
- end
-
- context 'when notify_only_default_branch disabled' do
- before do
- subject.notify_only_default_branch = false
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
- end
- end
-
- context 'with issue events' do
- let(:opts) { { title: 'Awesome issue', description: 'please fix' } }
- let(:sample_data) do
- service = Issues::CreateService.new(project, user, opts)
- issue = service.execute
- service.hook_data(issue, 'open')
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with merge events' do
- let(:opts) do
- {
- title: 'Awesome merge_request',
- description: 'please fix',
- source_branch: 'feature',
- target_branch: 'master'
- }
- end
-
- let(:sample_data) do
- service = MergeRequests::CreateService.new(project, user, opts)
- merge_request = service.execute
- service.hook_data(merge_request, 'open')
- end
-
- before do
- project.add_developer(user)
- end
+require "spec_helper"
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with wiki page events' do
- let(:opts) do
- {
- title: 'Awesome wiki_page',
- content: 'Some text describing some thing or another',
- format: 'md',
- message: 'user created page: Awesome wiki_page'
- }
- end
- let(:wiki_page) { create(:wiki_page, wiki: project.wiki, attrs: opts) }
- let(:sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') }
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with note events' do
- let(:sample_data) { Gitlab::DataBuilder::Note.build(note, user) }
-
- context 'with commit comment' do
- let(:note) do
- create(:note_on_commit, author: user,
- project: project,
- commit_id: project.repository.commit.id,
- note: 'a comment on a commit')
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with merge request comment' do
- let(:note) do
- create(:note_on_merge_request, project: project,
- note: 'merge request note')
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with issue comment' do
- let(:note) do
- create(:note_on_issue, project: project, note: 'issue note')
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with snippet comment' do
- let(:note) do
- create(:note_on_project_snippet, project: project,
- note: 'snippet note')
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
- end
-
- context 'with pipeline events' do
- let(:pipeline) do
- create(:ci_pipeline,
- project: project, status: status,
- sha: project.commit.sha, ref: project.default_branch)
- end
- let(:sample_data) { Gitlab::DataBuilder::Pipeline.build(pipeline) }
-
- context 'with failed pipeline' do
- let(:status) { 'failed' }
-
- it_behaves_like 'Hangouts Chat service'
- end
-
- context 'with succeeded pipeline' do
- let(:status) { 'success' }
-
- context 'with default notify_only_broken_pipelines' do
- it 'does not call Hangouts Chat API' do
- result = subject.execute(sample_data)
-
- expect(result).to be_falsy
- end
- end
-
- context 'when notify_only_broken_pipelines is false' do
- before do
- subject.notify_only_broken_pipelines = false
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
- end
-
- context 'with not default branch' do
- let(:pipeline) do
- create(:ci_pipeline, project: project, status: 'failed', ref: 'not-the-default-branch')
- end
-
- context 'when notify_only_default_branch enabled' do
- before do
- subject.notify_only_default_branch = true
- end
-
- it 'does not call the Hangouts Chat API' do
- result = subject.execute(sample_data)
-
- expect(result).to be_falsy
- end
- end
-
- context 'when notify_only_default_branch disabled' do
- before do
- subject.notify_only_default_branch = false
- end
-
- it_behaves_like 'Hangouts Chat service'
- end
- end
- end
+describe HangoutsChatService do
+ it_behaves_like "chat service", "Hangouts Chat" do
+ let(:client) { HangoutsChat::Sender }
+ let(:client_arguments) { webhook_url }
+ let(:content_key) { :text }
end
end
diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb
index 0cd712e2f40..b0fd2ceead0 100644
--- a/spec/models/project_services/hipchat_service_spec.rb
+++ b/spec/models/project_services/hipchat_service_spec.rb
@@ -387,4 +387,22 @@ describe HipchatService do
end
end
end
+
+ context 'with UrlBlocker' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
+ let(:hipchat) { described_class.new(project: project) }
+ let(:push_sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
+
+ describe '#execute' do
+ before do
+ hipchat.server = 'http://localhost:9123'
+ end
+
+ it 'raises UrlBlocker for localhost' do
+ expect(Gitlab::UrlBlocker).to receive(:validate!).and_call_original
+ expect { hipchat.execute(push_sample_data) }.to raise_error(Gitlab::HTTP::BlockedUrlError)
+ end
+ end
+ end
end
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index ac9ff59b9b5..788b3179b01 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -27,13 +27,13 @@ describe JiraService do
end
end
- describe "Associations" do
+ describe 'Associations' do
it { is_expected.to belong_to :project }
it { is_expected.to have_one :service_hook }
it { is_expected.to allow_value(nil).for(:jira_issue_transition_id) }
- it { is_expected.to allow_value("1,2,3").for(:jira_issue_transition_id) }
- it { is_expected.to allow_value("1;2;3").for(:jira_issue_transition_id) }
- it { is_expected.not_to allow_value("a,b,cd").for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value('1,2,3').for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value('1;2;3').for(:jira_issue_transition_id) }
+ it { is_expected.not_to allow_value('a,b,cd').for(:jira_issue_transition_id) }
end
describe 'Validations' do
@@ -116,143 +116,142 @@ describe JiraService do
describe '#close_issue' do
let(:custom_base_url) { 'http://custom_url' }
let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:merge_request) { create(:merge_request) }
-
- before do
- @jira_service = described_class.new
- allow(@jira_service).to receive_messages(
- project_id: project.id,
- project: project,
- service_hook: true,
- url: 'http://jira.example.com',
- username: 'gitlab_jira_username',
- password: 'gitlab_jira_password',
- jira_issue_transition_id: "999"
- )
+ let(:project) { create(:project, :repository) }
- # These stubs are needed to test JiraService#close_issue.
- # We close the issue then do another request to API to check if it got closed.
- # Here is stubbed the API return with a closed and an opened issues.
- open_issue = JIRA::Resource::Issue.new(@jira_service.client, attrs: { "id" => "JIRA-123" })
- closed_issue = open_issue.dup
- allow(open_issue).to receive(:resolution).and_return(false)
- allow(closed_issue).to receive(:resolution).and_return(true)
- allow(JIRA::Resource::Issue).to receive(:find).and_return(open_issue, closed_issue)
-
- allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return("JIRA-123")
- allow(JIRA::Resource::Remotelink).to receive(:all).and_return([])
-
- @jira_service.save
-
- project_issues_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123'
- @transitions_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/transitions'
- @comment_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/comment'
- @remote_link_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/remotelink'
-
- WebMock.stub_request(:get, project_issues_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @comment_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @remote_link_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- end
+ shared_examples 'close_issue' do
+ before do
+ @jira_service = described_class.new
+ allow(@jira_service).to receive_messages(
+ project_id: project.id,
+ project: project,
+ service_hook: true,
+ url: 'http://jira.example.com',
+ username: 'gitlab_jira_username',
+ password: 'gitlab_jira_password',
+ jira_issue_transition_id: '999'
+ )
- it "calls JIRA API" do
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ # These stubs are needed to test JiraService#close_issue.
+ # We close the issue then do another request to API to check if it got closed.
+ # Here is stubbed the API return with a closed and an opened issues.
+ open_issue = JIRA::Resource::Issue.new(@jira_service.client, attrs: { 'id' => 'JIRA-123' })
+ closed_issue = open_issue.dup
+ allow(open_issue).to receive(:resolution).and_return(false)
+ allow(closed_issue).to receive(:resolution).and_return(true)
+ allow(JIRA::Resource::Issue).to receive(:find).and_return(open_issue, closed_issue)
- expect(WebMock).to have_requested(:post, @comment_url).with(
- body: /Issue solved with/
- ).once
- end
+ allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return('JIRA-123')
+ allow(JIRA::Resource::Remotelink).to receive(:all).and_return([])
- # Check https://developer.atlassian.com/jiradev/jira-platform/guides/other/guide-jira-remote-issue-links/fields-in-remote-issue-links
- # for more information
- it "creates Remote Link reference in JIRA for comment" do
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
-
- favicon_path = "http://localhost/assets/#{find_asset('favicon.png').digest_path}"
-
- # Creates comment
- expect(WebMock).to have_requested(:post, @comment_url)
- # Creates Remote Link in JIRA issue fields
- expect(WebMock).to have_requested(:post, @remote_link_url).with(
- body: hash_including(
- GlobalID: "GitLab",
- object: {
- url: "#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{merge_request.diff_head_sha}",
- title: "GitLab: Solved by commit #{merge_request.diff_head_sha}.",
- icon: { title: "GitLab", url16x16: favicon_path },
- status: { resolved: true }
- }
- )
- ).once
- end
+ @jira_service.save
- it "does not send comment or remote links to issues already closed" do
- allow_any_instance_of(JIRA::Resource::Issue).to receive(:resolution).and_return(true)
+ project_issues_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123'
+ @transitions_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/transitions'
+ @comment_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/comment'
+ @remote_link_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/remotelink'
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ WebMock.stub_request(:get, project_issues_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ WebMock.stub_request(:post, @comment_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ WebMock.stub_request(:post, @remote_link_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ end
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
- end
+ it 'calls JIRA API' do
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
- it "does not send comment or remote links to issues with unknown resolution" do
- allow_any_instance_of(JIRA::Resource::Issue).to receive(:respond_to?).with(:resolution).and_return(false)
+ expect(WebMock).to have_requested(:post, @comment_url).with(
+ body: /Issue solved with/
+ ).once
+ end
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ # Check https://developer.atlassian.com/jiradev/jira-platform/guides/other/guide-jira-remote-issue-links/fields-in-remote-issue-links
+ # for more information
+ it 'creates Remote Link reference in JIRA for comment' do
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
+
+ favicon_path = "http://localhost/assets/#{find_asset('favicon.png').digest_path}"
+
+ # Creates comment
+ expect(WebMock).to have_requested(:post, @comment_url)
+ # Creates Remote Link in JIRA issue fields
+ expect(WebMock).to have_requested(:post, @remote_link_url).with(
+ body: hash_including(
+ GlobalID: 'GitLab',
+ object: {
+ url: "#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{commit_id}",
+ title: "GitLab: Solved by commit #{commit_id}.",
+ icon: { title: 'GitLab', url16x16: favicon_path },
+ status: { resolved: true }
+ }
+ )
+ ).once
+ end
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
- end
+ it 'does not send comment or remote links to issues already closed' do
+ allow_any_instance_of(JIRA::Resource::Issue).to receive(:resolution).and_return(true)
- it "references the GitLab commit/merge request" do
- stub_config_setting(base_url: custom_base_url)
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ expect(WebMock).not_to have_requested(:post, @comment_url)
+ expect(WebMock).not_to have_requested(:post, @remote_link_url)
+ end
- expect(WebMock).to have_requested(:post, @comment_url).with(
- body: %r{#{custom_base_url}/#{project.full_path}/commit/#{merge_request.diff_head_sha}}
- ).once
- end
+ it 'does not send comment or remote links to issues with unknown resolution' do
+ allow_any_instance_of(JIRA::Resource::Issue).to receive(:respond_to?).with(:resolution).and_return(false)
- it "references the GitLab commit/merge request (relative URL)" do
- stub_config_setting(relative_url_root: '/gitlab')
- stub_config_setting(url: Settings.send(:build_gitlab_url))
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
- allow(described_class).to receive(:default_url_options) do
- { script_name: '/gitlab' }
+ expect(WebMock).not_to have_requested(:post, @comment_url)
+ expect(WebMock).not_to have_requested(:post, @remote_link_url)
end
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ it 'references the GitLab commit' do
+ stub_config_setting(base_url: custom_base_url)
- expect(WebMock).to have_requested(:post, @comment_url).with(
- body: %r{#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{merge_request.diff_head_sha}}
- ).once
- end
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
+
+ expect(WebMock).to have_requested(:post, @comment_url).with(
+ body: %r{#{custom_base_url}/#{project.full_path}/commit/#{commit_id}}
+ ).once
+ end
+
+ it 'references the GitLab commit' do
+ stub_config_setting(relative_url_root: '/gitlab')
+ stub_config_setting(url: Settings.send(:build_gitlab_url))
+
+ allow(described_class).to receive(:default_url_options) do
+ { script_name: '/gitlab' }
+ end
+
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
- context '#close_issue' do
- it "logs exception when transition id is not valid" do
- allow(Rails.logger).to receive(:info)
+ expect(WebMock).to have_requested(:post, @comment_url).with(
+ body: %r{#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{commit_id}}
+ ).once
+ end
+
+ it 'logs exception when transition id is not valid' do
+ allow(@jira_service).to receive(:log_error)
WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).and_raise("Bad Request")
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
- expect(Rails.logger).to have_received(:info).with("JiraService Issue Transition failed message ERROR: http://jira.example.com - Bad Request")
+ expect(@jira_service).to have_received(:log_error).with("Issue transition failed", error: "Bad Request", client_url: "http://jira.example.com")
end
- it "calls the api with jira_issue_transition_id" do
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ it 'calls the api with jira_issue_transition_id' do
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
expect(WebMock).to have_requested(:post, @transitions_url).with(
body: /999/
).once
end
- context "when have multiple transition ids" do
- it "calls the api with transition ids separated by comma" do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: "1,2,3")
+ context 'when have multiple transition ids' do
+ it 'calls the api with transition ids separated by comma' do
+ allow(@jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
1.upto(3) do |transition_id|
expect(WebMock).to have_requested(:post, @transitions_url).with(
@@ -261,10 +260,10 @@ describe JiraService do
end
end
- it "calls the api with transition ids separated by semicolon" do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: "1;2;3")
+ it 'calls the api with transition ids separated by semicolon' do
+ allow(@jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project))
1.upto(3) do |transition_id|
expect(WebMock).to have_requested(:post, @transitions_url).with(
@@ -274,6 +273,20 @@ describe JiraService do
end
end
end
+
+ context 'when resource is a merge request' do
+ let(:resource) { create(:merge_request) }
+ let(:commit_id) { resource.diff_head_sha }
+
+ it_behaves_like 'close_issue'
+ end
+
+ context 'when resource is a commit' do
+ let(:resource) { project.commit('master') }
+ let(:commit_id) { resource.id }
+
+ it_behaves_like 'close_issue'
+ end
end
describe '#test_settings' do
@@ -321,17 +334,17 @@ describe JiraService do
end
end
- describe "Stored password invalidation" do
+ describe 'Stored password invalidation' do
let(:project) { create(:project) }
- context "when a password was previously set" do
+ context 'when a password was previously set' do
before do
@jira_service = described_class.create!(
project: project,
properties: {
url: 'http://jira.example.com/web',
username: 'mic',
- password: "password"
+ password: 'password'
}
)
end
@@ -370,10 +383,10 @@ describe JiraService do
@jira_service.url = 'http://jira_edited.example.com/rweb'
@jira_service.save
- expect(@jira_service.password).to eq("password")
+ expect(@jira_service.password).to eq('password')
end
- it 'reset password if api url set to ""' do
+ it 'reset password if api url set to empty' do
@jira_service.api_url = ''
@jira_service.save
@@ -440,7 +453,7 @@ describe JiraService do
it 'is initialized' do
expect(@service.title).to eq('JIRA')
- expect(@service.description).to eq("Jira issue tracker")
+ expect(@service.description).to eq('Jira issue tracker')
end
end
@@ -454,7 +467,7 @@ describe JiraService do
@service.destroy!
end
- it "is correct" do
+ it 'is correct' do
expect(@service.title).to eq('Jira One')
expect(@service.description).to eq('Jira One issue tracker')
end
@@ -476,7 +489,7 @@ describe JiraService do
it 'is initialized' do
expect(@service.options[:use_cookies]).to eq(true)
- expect(@service.options[:additional_cookies]).to eq(["OBBasicAuth=fromDialog"])
+ expect(@service.options[:additional_cookies]).to eq(['OBBasicAuth=fromDialog'])
end
end
end
diff --git a/spec/models/project_services/kubernetes_service_spec.rb b/spec/models/project_services/kubernetes_service_spec.rb
index 68ab9fd08ec..9c27357ffaf 100644
--- a/spec/models/project_services/kubernetes_service_spec.rb
+++ b/spec/models/project_services/kubernetes_service_spec.rb
@@ -253,7 +253,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do
end
end
- describe '#predefined_variables' do
+ describe '#predefined_variable' do
let(:kubeconfig) do
config_file = expand_fixture_path('config/kubeconfig.yml')
config = YAML.load(File.read(config_file))
@@ -274,7 +274,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do
shared_examples 'setting variables' do
it 'sets the variables' do
- expect(subject.predefined_variables).to include(
+ expect(subject.predefined_variables(project: project)).to include(
{ key: 'KUBE_URL', value: 'https://kube.domain.com', public: true },
{ key: 'KUBE_TOKEN', value: 'token', public: false },
{ key: 'KUBE_NAMESPACE', value: namespace, public: true },
@@ -301,7 +301,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do
it_behaves_like 'setting variables'
it 'sets the KUBE_NAMESPACE' do
- kube_namespace = subject.predefined_variables.find { |h| h[:key] == 'KUBE_NAMESPACE' }
+ kube_namespace = subject.predefined_variables(project: project).find { |h| h[:key] == 'KUBE_NAMESPACE' }
expect(kube_namespace).not_to be_nil
expect(kube_namespace[:value]).to match(/\A#{Gitlab::PathRegex::PATH_REGEX_STR}-\d+\z/)
diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb
index 7afb1b4a8e3..f2cb927df37 100644
--- a/spec/models/project_services/prometheus_service_spec.rb
+++ b/spec/models/project_services/prometheus_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe PrometheusService, :use_clean_rails_memory_store_caching do
@@ -83,13 +85,22 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
end
end
- describe '#prometheus_installed?' do
+ describe '#prometheus_available?' do
context 'clusters with installed prometheus' do
let!(:cluster) { create(:cluster, projects: [project]) }
let!(:prometheus) { create(:clusters_applications_prometheus, :installed, cluster: cluster) }
it 'returns true' do
- expect(service.prometheus_installed?).to be(true)
+ expect(service.prometheus_available?).to be(true)
+ end
+ end
+
+ context 'clusters with updated prometheus' do
+ let!(:cluster) { create(:cluster, projects: [project]) }
+ let!(:prometheus) { create(:clusters_applications_prometheus, :updated, cluster: cluster) }
+
+ it 'returns true' do
+ expect(service.prometheus_available?).to be(true)
end
end
@@ -98,7 +109,7 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
let!(:prometheus) { create(:clusters_applications_prometheus, cluster: cluster) }
it 'returns false' do
- expect(service.prometheus_installed?).to be(false)
+ expect(service.prometheus_available?).to be(false)
end
end
@@ -106,13 +117,13 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
let(:cluster) { create(:cluster, projects: [project]) }
it 'returns false' do
- expect(service.prometheus_installed?).to be(false)
+ expect(service.prometheus_available?).to be(false)
end
end
context 'no clusters' do
it 'returns false' do
- expect(service.prometheus_installed?).to be(false)
+ expect(service.prometheus_available?).to be(false)
end
end
end
@@ -150,7 +161,7 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
context 'with prometheus installed in the cluster' do
before do
- allow(service).to receive(:prometheus_installed?).and_return(true)
+ allow(service).to receive(:prometheus_available?).and_return(true)
end
context 'when service is inactive' do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 076de06cf99..51278836604 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2,11 +2,13 @@ require 'spec_helper'
describe Project do
include ProjectForksHelper
+ include GitHelpers
describe 'associations' do
it { is_expected.to belong_to(:group) }
it { is_expected.to belong_to(:namespace) }
it { is_expected.to belong_to(:creator).class_name('User') }
+ it { is_expected.to belong_to(:pool_repository) }
it { is_expected.to have_many(:users) }
it { is_expected.to have_many(:services) }
it { is_expected.to have_many(:events) }
@@ -22,7 +24,6 @@ describe Project do
it { is_expected.to have_many(:deploy_keys) }
it { is_expected.to have_many(:hooks) }
it { is_expected.to have_many(:protected_branches) }
- it { is_expected.to have_one(:forked_project_link) }
it { is_expected.to have_one(:slack_service) }
it { is_expected.to have_one(:microsoft_teams_service) }
it { is_expected.to have_one(:mattermost_service) }
@@ -32,6 +33,7 @@ describe Project do
it { is_expected.to have_one(:asana_service) }
it { is_expected.to have_many(:boards) }
it { is_expected.to have_one(:campfire_service) }
+ it { is_expected.to have_one(:discord_service) }
it { is_expected.to have_one(:drone_ci_service) }
it { is_expected.to have_one(:emails_on_push_service) }
it { is_expected.to have_one(:pipelines_email_service) }
@@ -42,7 +44,6 @@ describe Project do
it { is_expected.to have_one(:assembla_service) }
it { is_expected.to have_one(:slack_slash_commands_service) }
it { is_expected.to have_one(:mattermost_slash_commands_service) }
- it { is_expected.to have_one(:gemnasium_service) }
it { is_expected.to have_one(:buildkite_service) }
it { is_expected.to have_one(:bamboo_service) }
it { is_expected.to have_one(:teamcity_service) }
@@ -56,7 +57,7 @@ describe Project do
it { is_expected.to have_one(:statistics).class_name('ProjectStatistics') }
it { is_expected.to have_one(:import_data).class_name('ProjectImportData') }
it { is_expected.to have_one(:last_event).class_name('Event') }
- it { is_expected.to have_one(:forked_from_project).through(:forked_project_link) }
+ it { is_expected.to have_one(:forked_from_project).through(:fork_network_member) }
it { is_expected.to have_one(:auto_devops).class_name('ProjectAutoDevops') }
it { is_expected.to have_many(:commit_statuses) }
it { is_expected.to have_many(:pipelines) }
@@ -77,7 +78,8 @@ describe Project do
it { is_expected.to have_many(:lfs_objects_projects) }
it { is_expected.to have_many(:project_group_links) }
it { is_expected.to have_many(:notification_settings).dependent(:delete_all) }
- it { is_expected.to have_many(:forks).through(:forked_project_links) }
+ it { is_expected.to have_many(:forked_to_members).class_name('ForkNetworkMember') }
+ it { is_expected.to have_many(:forks).through(:forked_to_members) }
it { is_expected.to have_many(:uploads) }
it { is_expected.to have_many(:pipeline_schedules) }
it { is_expected.to have_many(:members_and_requesters) }
@@ -88,6 +90,10 @@ describe Project do
it { is_expected.to have_many(:project_deploy_tokens) }
it { is_expected.to have_many(:deploy_tokens).through(:project_deploy_tokens) }
+ it 'has an inverse relationship with merge requests' do
+ expect(described_class.reflect_on_association(:merge_requests).has_inverse?).to eq(:target_project)
+ end
+
context 'after initialized' do
it "has a project_feature" do
expect(described_class.new.project_feature).to be_present
@@ -229,54 +235,75 @@ describe Project do
end
it 'does not allow an invalid URI as import_url' do
- project2 = build(:project, import_url: 'invalid://')
+ project = build(:project, import_url: 'invalid://')
- expect(project2).not_to be_valid
+ expect(project).not_to be_valid
+ end
+
+ it 'does allow a SSH URI as import_url for persisted projects' do
+ project = create(:project)
+ project.import_url = 'ssh://test@gitlab.com/project.git'
+
+ expect(project).to be_valid
+ end
+
+ it 'does not allow a SSH URI as import_url for new projects' do
+ project = build(:project, import_url: 'ssh://test@gitlab.com/project.git')
+
+ expect(project).not_to be_valid
end
it 'does allow a valid URI as import_url' do
- project2 = build(:project, import_url: 'ssh://test@gitlab.com/project.git')
+ project = build(:project, import_url: 'http://gitlab.com/project.git')
- expect(project2).to be_valid
+ expect(project).to be_valid
end
it 'allows an empty URI' do
- project2 = build(:project, import_url: '')
+ project = build(:project, import_url: '')
- expect(project2).to be_valid
+ expect(project).to be_valid
end
it 'does not produce import data on an empty URI' do
- project2 = build(:project, import_url: '')
+ project = build(:project, import_url: '')
- expect(project2.import_data).to be_nil
+ expect(project.import_data).to be_nil
end
it 'does not produce import data on an invalid URI' do
- project2 = build(:project, import_url: 'test://')
+ project = build(:project, import_url: 'test://')
- expect(project2.import_data).to be_nil
+ expect(project.import_data).to be_nil
end
it "does not allow import_url pointing to localhost" do
- project2 = build(:project, import_url: 'http://localhost:9000/t.git')
+ project = build(:project, import_url: 'http://localhost:9000/t.git')
- expect(project2).to be_invalid
- expect(project2.errors[:import_url].first).to include('Requests to localhost are not allowed')
+ expect(project).to be_invalid
+ expect(project.errors[:import_url].first).to include('Requests to localhost are not allowed')
end
- it "does not allow import_url with invalid ports" do
- project2 = build(:project, import_url: 'http://github.com:25/t.git')
+ it "does not allow import_url with invalid ports for new projects" do
+ project = build(:project, import_url: 'http://github.com:25/t.git')
- expect(project2).to be_invalid
- expect(project2.errors[:import_url].first).to include('Only allowed ports are 22, 80, 443')
+ expect(project).to be_invalid
+ expect(project.errors[:import_url].first).to include('Only allowed ports are 80, 443')
+ end
+
+ it "does not allow import_url with invalid ports for persisted projects" do
+ project = create(:project)
+ project.import_url = 'http://github.com:25/t.git'
+
+ expect(project).to be_invalid
+ expect(project.errors[:import_url].first).to include('Only allowed ports are 22, 80, 443')
end
it "does not allow import_url with invalid user" do
- project2 = build(:project, import_url: 'http://$user:password@github.com/t.git')
+ project = build(:project, import_url: 'http://$user:password@github.com/t.git')
- expect(project2).to be_invalid
- expect(project2.errors[:import_url].first).to include('Username needs to start with an alphanumeric character')
+ expect(project).to be_invalid
+ expect(project.errors[:import_url].first).to include('Username needs to start with an alphanumeric character')
end
describe 'project pending deletion' do
@@ -506,28 +533,28 @@ describe Project do
end
describe "#readme_url" do
- let(:project) { create(:project, :repository, path: "somewhere") }
-
context 'with a non-existing repository' do
- it 'returns nil' do
- allow(project.repository).to receive(:tree).with(:head).and_return(nil)
+ let(:project) { create(:project) }
+ it 'returns nil' do
expect(project.readme_url).to be_nil
end
end
context 'with an existing repository' do
context 'when no README exists' do
- it 'returns nil' do
- allow_any_instance_of(Tree).to receive(:readme).and_return(nil)
+ let(:project) { create(:project, :empty_repo) }
+ it 'returns nil' do
expect(project.readme_url).to be_nil
end
end
context 'when a README exists' do
+ let(:project) { create(:project, :repository) }
+
it 'returns the README' do
- expect(project.readme_url).to eql("#{Gitlab.config.gitlab.url}/#{project.namespace.full_path}/somewhere/blob/master/README.md")
+ expect(project.readme_url).to eq("#{project.web_url}/blob/master/README.md")
end
end
end
@@ -1073,6 +1100,18 @@ describe Project do
it { expect(project.builds_enabled?).to be_truthy }
end
+ describe '.sort_by_attribute' do
+ it 'reorders the input relation by start count desc' do
+ project1 = create(:project, star_count: 2)
+ project2 = create(:project, star_count: 1)
+ project3 = create(:project)
+
+ projects = described_class.sort_by_attribute(:stars_desc)
+
+ expect(projects).to eq([project1, project2, project3])
+ end
+ end
+
describe '.with_shared_runners' do
subject { described_class.with_shared_runners }
@@ -1347,7 +1386,7 @@ describe Project do
context 'when checking on forked project' do
let(:project) { create(:project, :internal) }
- let(:forked_project) { create(:project, forked_from_project: project) }
+ let(:forked_project) { fork_project(project) }
it { expect(forked_project.visibility_level_allowed?(Gitlab::VisibilityLevel::PRIVATE)).to be_truthy }
it { expect(forked_project.visibility_level_allowed?(Gitlab::VisibilityLevel::INTERNAL)).to be_truthy }
@@ -1478,6 +1517,53 @@ describe Project do
end
end
+ describe '.optionally_search' do
+ let(:project) { create(:project) }
+
+ it 'searches for projects matching the query if one is given' do
+ relation = described_class.optionally_search(project.name)
+
+ expect(relation).to eq([project])
+ end
+
+ it 'returns the current relation if no search query is given' do
+ relation = described_class.where(id: project.id)
+
+ expect(relation.optionally_search).to eq(relation)
+ end
+ end
+
+ describe '.paginate_in_descending_order_using_id' do
+ let!(:project1) { create(:project) }
+ let!(:project2) { create(:project) }
+
+ it 'orders the relation in descending order' do
+ expect(described_class.paginate_in_descending_order_using_id)
+ .to eq([project2, project1])
+ end
+
+ it 'applies a limit to the relation' do
+ expect(described_class.paginate_in_descending_order_using_id(limit: 1))
+ .to eq([project2])
+ end
+
+ it 'limits projects by and ID when given' do
+ expect(described_class.paginate_in_descending_order_using_id(before: project2.id))
+ .to eq([project1])
+ end
+ end
+
+ describe '.including_namespace_and_owner' do
+ it 'eager loads the namespace and namespace owner' do
+ create(:project)
+
+ row = described_class.eager_load_namespace_and_owner.to_a.first
+ recorder = ActiveRecord::QueryRecorder.new { row.namespace.owner }
+
+ expect(recorder.count).to be_zero
+ end
+ end
+
describe '#expire_caches_before_rename' do
let(:project) { create(:project, :repository) }
let(:repo) { double(:repo, exists?: true) }
@@ -1912,9 +1998,12 @@ describe Project do
let(:import_jid) { '123' }
context 'forked' do
- let(:forked_project_link) { create(:forked_project_link, :forked_to_empty_project) }
- let(:forked_from_project) { forked_project_link.forked_from_project }
- let(:project) { forked_project_link.forked_to_project }
+ let(:forked_from_project) { create(:project, :repository) }
+ let(:project) { create(:project) }
+
+ before do
+ fork_project(forked_from_project, nil, target_project: project)
+ end
it 'schedules a RepositoryForkWorker job' do
expect(RepositoryForkWorker).to receive(:perform_async).with(project.id).and_return(import_jid)
@@ -2201,6 +2290,12 @@ describe Project do
end
end
+ describe '#forks' do
+ it 'includes direct forks of the project' do
+ expect(project.forks).to contain_exactly(forked_project)
+ end
+ end
+
describe '#lfs_storage_project' do
it 'returns self for non-forks' do
expect(project.lfs_storage_project).to eq project
@@ -2312,12 +2407,24 @@ describe Project do
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
- context 'when user configured kubernetes from CI/CD > Clusters' do
+ context 'when user configured kubernetes from CI/CD > Clusters and KubernetesNamespace migration has not been executed' do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
+
+ context 'when user configured kubernetes from CI/CD > Clusters and KubernetesNamespace migration has been executed' do
+ let!(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, :with_token) }
+ let!(:cluster) { kubernetes_namespace.cluster }
+ let(:project) { kubernetes_namespace.project }
+
+ it 'should return token from kubernetes namespace' do
+ expect(project.deployment_variables).to include(
+ { key: 'KUBE_TOKEN', value: kubernetes_namespace.service_account_token, public: false }
+ )
+ end
+ end
end
end
@@ -2343,10 +2450,10 @@ describe Project do
end
end
- describe '#secret_variables_for' do
+ describe '#ci_variables_for' do
let(:project) { create(:project) }
- let!(:secret_variable) do
+ let!(:ci_variable) do
create(:ci_variable, value: 'secret', project: project)
end
@@ -2354,7 +2461,7 @@ describe Project do
create(:ci_variable, :protected, value: 'protected', project: project)
end
- subject { project.reload.secret_variables_for(ref: 'ref') }
+ subject { project.reload.ci_variables_for(ref: 'ref') }
before do
stub_application_setting(
@@ -2363,13 +2470,13 @@ describe Project do
shared_examples 'ref is protected' do
it 'contains all the variables' do
- is_expected.to contain_exactly(secret_variable, protected_variable)
+ is_expected.to contain_exactly(ci_variable, protected_variable)
end
end
context 'when the ref is not protected' do
- it 'contains only the secret variables' do
- is_expected.to contain_exactly(secret_variable)
+ it 'contains only the CI variables' do
+ is_expected.to contain_exactly(ci_variable)
end
end
@@ -2657,7 +2764,7 @@ describe Project do
.to raise_error(ActiveRecord::RecordNotSaved, error_message)
end
- it 'updates the project succesfully' do
+ it 'updates the project successfully' do
merge_request = create(:merge_request, target_project: project, source_project: project)
expect { project.append_or_update_attribute(:merge_requests, [merge_request]) }
@@ -2808,73 +2915,12 @@ describe Project do
end
describe '#remove_export' do
- let(:legacy_project) { create(:project, :legacy_storage, :with_export) }
let(:project) { create(:project, :with_export) }
- before do
- stub_feature_flags(import_export_object_storage: false)
- end
-
- it 'removes the exports directory for the project' do
- expect(File.exist?(project.export_path)).to be_truthy
-
- allow(FileUtils).to receive(:rm_rf).and_call_original
- expect(FileUtils).to receive(:rm_rf).with(project.export_path).and_call_original
+ it 'removes the export' do
project.remove_exports
- expect(File.exist?(project.export_path)).to be_falsy
- end
-
- it 'is a no-op on legacy projects when there is no namespace' do
- export_path = legacy_project.export_path
-
- legacy_project.namespace.delete
- legacy_project.reload
-
- expect(FileUtils).not_to receive(:rm_rf).with(export_path)
-
- legacy_project.remove_exports
-
- expect(File.exist?(export_path)).to be_truthy
- end
-
- it 'runs on hashed storage projects when there is no namespace' do
- export_path = project.export_path
-
- project.namespace.delete
- legacy_project.reload
-
- allow(FileUtils).to receive(:rm_rf).and_call_original
- expect(FileUtils).to receive(:rm_rf).with(export_path).and_call_original
-
- project.remove_exports
-
- expect(File.exist?(export_path)).to be_falsy
- end
-
- it 'is run when the project is destroyed' do
- expect(project).to receive(:remove_exports).and_call_original
-
- project.destroy
- end
- end
-
- describe '#remove_exported_project_file' do
- let(:project) { create(:project, :with_export) }
-
- it 'removes the exported project file' do
- stub_feature_flags(import_export_object_storage: false)
-
- exported_file = project.export_project_path
-
- expect(File.exist?(exported_file)).to be_truthy
-
- allow(FileUtils).to receive(:rm_rf).and_call_original
- expect(FileUtils).to receive(:rm_rf).with(exported_file).and_call_original
-
- project.remove_exported_project_file
-
- expect(File.exist?(exported_file)).to be_falsy
+ expect(project.export_file_exists?).to be_falsey
end
end
@@ -2937,87 +2983,6 @@ describe Project do
end
end
- describe '#rename_repo' do
- before do
- # Project#gitlab_shell returns a new instance of Gitlab::Shell on every
- # call. This makes testing a bit easier.
- allow(project).to receive(:gitlab_shell).and_return(gitlab_shell)
- allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
- end
-
- it 'renames a repository' do
- stub_container_registry_config(enabled: false)
-
- expect(gitlab_shell).to receive(:mv_repository)
- .ordered
- .with(project.repository_storage, "#{project.namespace.full_path}/foo", "#{project.full_path}")
- .and_return(true)
-
- expect(gitlab_shell).to receive(:mv_repository)
- .ordered
- .with(project.repository_storage, "#{project.namespace.full_path}/foo.wiki", "#{project.full_path}.wiki")
- .and_return(true)
-
- expect_any_instance_of(SystemHooksService)
- .to receive(:execute_hooks_for)
- .with(project, :rename)
-
- expect_any_instance_of(Gitlab::UploadsTransfer)
- .to receive(:rename_project)
- .with('foo', project.path, project.namespace.full_path)
-
- expect(project).to receive(:expire_caches_before_rename)
-
- project.rename_repo
- end
-
- context 'container registry with images' do
- let(:container_repository) { create(:container_repository) }
-
- before do
- stub_container_registry_config(enabled: true)
- stub_container_registry_tags(repository: :any, tags: ['tag'])
- project.container_repositories << container_repository
- end
-
- subject { project.rename_repo }
-
- it { expect { subject }.to raise_error(StandardError) }
- end
-
- context 'gitlab pages' do
- before do
- expect(project_storage).to receive(:rename_repo) { true }
- end
-
- it 'moves pages folder to new location' do
- expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
-
- project.rename_repo
- end
- end
-
- context 'attachments' do
- before do
- expect(project_storage).to receive(:rename_repo) { true }
- end
-
- it 'moves uploads folder to new location' do
- expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project)
-
- project.rename_repo
- end
- end
-
- it 'updates project full path in .git/config' do
- allow(project_storage).to receive(:rename_repo).and_return(true)
-
- project.rename_repo
-
- expect(rugged_config['gitlab.fullpath']).to eq(project.full_path)
- end
- end
-
describe '#pages_path' do
it 'returns a path where pages are stored' do
expect(project.pages_path).to eq(File.join(Settings.pages.path, project.namespace.full_path, project.path))
@@ -3108,90 +3073,6 @@ describe Project do
end
end
- describe '#rename_repo' do
- before do
- # Project#gitlab_shell returns a new instance of Gitlab::Shell on every
- # call. This makes testing a bit easier.
- allow(project).to receive(:gitlab_shell).and_return(gitlab_shell)
- allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
- end
-
- context 'migration to hashed storage' do
- it 'calls HashedStorageMigrationService with correct options' do
- project = create(:project, :repository, :legacy_storage)
- allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
-
- expect_next_instance_of(::Projects::HashedStorageMigrationService) do |service|
- expect(service).to receive(:execute).and_return(true)
- end
-
- project.rename_repo
- end
- end
-
- it 'renames a repository' do
- stub_container_registry_config(enabled: false)
-
- expect(gitlab_shell).not_to receive(:mv_repository)
-
- expect_any_instance_of(SystemHooksService)
- .to receive(:execute_hooks_for)
- .with(project, :rename)
-
- expect(project).to receive(:expire_caches_before_rename)
-
- project.rename_repo
- end
-
- context 'container registry with images' do
- let(:container_repository) { create(:container_repository) }
-
- before do
- stub_container_registry_config(enabled: true)
- stub_container_registry_tags(repository: :any, tags: ['tag'])
- project.container_repositories << container_repository
- end
-
- subject { project.rename_repo }
-
- it { expect { subject }.to raise_error(StandardError) }
- end
-
- context 'gitlab pages' do
- it 'moves pages folder to new location' do
- expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
-
- project.rename_repo
- end
- end
-
- context 'attachments' do
- it 'keeps uploads folder location unchanged' do
- expect_any_instance_of(Gitlab::UploadsTransfer).not_to receive(:rename_project)
-
- project.rename_repo
- end
-
- context 'when not rolled out' do
- let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) }
-
- it 'moves pages folder to hashed storage' do
- expect_next_instance_of(Projects::HashedStorage::MigrateAttachmentsService) do |service|
- expect(service).to receive(:execute)
- end
-
- project.rename_repo
- end
- end
- end
-
- it 'updates project full path in .git/config' do
- project.rename_repo
-
- expect(rugged_config['gitlab.fullpath']).to eq(project.full_path)
- end
- end
-
describe '#pages_path' do
it 'returns a path where pages are stored' do
expect(project.pages_path).to eq(File.join(Settings.pages.path, project.namespace.full_path, project.path))
@@ -3206,6 +3087,14 @@ describe Project do
it 'does not flag as read-only' do
expect { project.migrate_to_hashed_storage! }.not_to change { project.repository_read_only }
end
+
+ context 'when partially migrated' do
+ it 'returns true' do
+ project = create(:project, storage_version: 1, skip_disk_validation: true)
+
+ expect(project.migrate_to_hashed_storage!).to be_truthy
+ end
+ end
end
end
@@ -3242,23 +3131,28 @@ describe Project do
expect(repository).to receive(:gitlab_ci_yml) { nil }
end
- it "CI is not available" do
- expect(project).not_to have_ci
+ it "CI is available" do
+ expect(project).to have_ci
end
- context 'when auto devops is enabled' do
+ context 'when auto devops is disabled' do
before do
- stub_application_setting(auto_devops_enabled: true)
+ stub_application_setting(auto_devops_enabled: false)
end
- it "CI is available" do
- expect(project).to have_ci
+ it "CI is not available" do
+ expect(project).not_to have_ci
end
end
end
end
describe '#auto_devops_enabled?' do
+ before do
+ allow(Feature).to receive(:enabled?).and_call_original
+ Feature.get(:force_autodevops_on_by_default).enable_percentage_of_actors(0)
+ end
+
set(:project) { create(:project) }
subject { project.auto_devops_enabled? }
@@ -3268,19 +3162,14 @@ describe Project do
stub_application_setting(auto_devops_enabled: true)
end
- it 'auto devops is implicitly enabled' do
- expect(project.auto_devops).to be_nil
- expect(project).to be_auto_devops_enabled
- end
+ it { is_expected.to be_truthy }
context 'when explicitly enabled' do
before do
create(:project_auto_devops, project: project)
end
- it "auto devops is enabled" do
- expect(project).to be_auto_devops_enabled
- end
+ it { is_expected.to be_truthy }
end
context 'when explicitly disabled' do
@@ -3288,9 +3177,7 @@ describe Project do
create(:project_auto_devops, project: project, enabled: false)
end
- it "auto devops is disabled" do
- expect(project).not_to be_auto_devops_enabled
- end
+ it { is_expected.to be_falsey }
end
end
@@ -3299,19 +3186,22 @@ describe Project do
stub_application_setting(auto_devops_enabled: false)
end
- it 'auto devops is implicitly disabled' do
- expect(project.auto_devops).to be_nil
- expect(project).not_to be_auto_devops_enabled
- end
+ it { is_expected.to be_falsey }
context 'when explicitly enabled' do
before do
create(:project_auto_devops, project: project)
end
- it "auto devops is enabled" do
- expect(project).to be_auto_devops_enabled
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when force_autodevops_on_by_default is enabled for the project' do
+ before do
+ Feature.get(:force_autodevops_on_by_default).enable_percentage_of_actors(100)
end
+
+ it { is_expected.to be_truthy }
end
end
end
@@ -3361,6 +3251,11 @@ describe Project do
end
describe '#has_auto_devops_implicitly_disabled?' do
+ before do
+ allow(Feature).to receive(:enabled?).and_call_original
+ Feature.get(:force_autodevops_on_by_default).enable_percentage_of_actors(0)
+ end
+
set(:project) { create(:project) }
context 'when enabled in settings' do
@@ -3382,6 +3277,16 @@ describe Project do
expect(project).to have_auto_devops_implicitly_disabled
end
+ context 'when force_autodevops_on_by_default is enabled for the project' do
+ before do
+ Feature.get(:force_autodevops_on_by_default).enable_percentage_of_actors(100)
+ end
+
+ it 'does not have auto devops implicitly disabled' do
+ expect(project).not_to have_auto_devops_implicitly_disabled
+ end
+ end
+
context 'when explicitly disabled' do
before do
create(:project_auto_devops, project: project, enabled: false)
@@ -3435,7 +3340,7 @@ describe Project do
end
end
- context 'when explicitely enabled' do
+ context 'when explicitly enabled' do
context 'when domain is empty' do
before do
create(:project_auto_devops, project: project, domain: nil)
@@ -3670,21 +3575,45 @@ describe Project do
end
describe '#execute_hooks' do
- it 'executes the projects hooks with the specified scope' do
- hook1 = create(:project_hook, merge_requests_events: true, tag_push_events: false)
- hook2 = create(:project_hook, merge_requests_events: false, tag_push_events: true)
- project = create(:project, hooks: [hook1, hook2])
+ let(:data) { { ref: 'refs/heads/master', data: 'data' } }
+ it 'executes active projects hooks with the specified scope' do
+ hook = create(:project_hook, merge_requests_events: false, push_events: true)
+ expect(ProjectHook).to receive(:select_active)
+ .with(:push_hooks, data)
+ .and_return([hook])
+ project = create(:project, hooks: [hook])
expect_any_instance_of(ProjectHook).to receive(:async_execute).once
- project.execute_hooks({}, :tag_push_hooks)
+ project.execute_hooks(data, :push_hooks)
+ end
+
+ it 'does not execute project hooks that dont match the specified scope' do
+ hook = create(:project_hook, merge_requests_events: true, push_events: false)
+ project = create(:project, hooks: [hook])
+
+ expect_any_instance_of(ProjectHook).not_to receive(:async_execute).once
+
+ project.execute_hooks(data, :push_hooks)
+ end
+
+ it 'does not execute project hooks which are not active' do
+ hook = create(:project_hook, push_events: true)
+ expect(ProjectHook).to receive(:select_active)
+ .with(:push_hooks, data)
+ .and_return([])
+ project = create(:project, hooks: [hook])
+
+ expect_any_instance_of(ProjectHook).not_to receive(:async_execute).once
+
+ project.execute_hooks(data, :push_hooks)
end
it 'executes the system hooks with the specified scope' do
- expect_any_instance_of(SystemHooksService).to receive(:execute_hooks).with({ data: 'data' }, :merge_request_hooks)
+ expect_any_instance_of(SystemHooksService).to receive(:execute_hooks).with(data, :merge_request_hooks)
project = build(:project)
- project.execute_hooks({ data: 'data' }, :merge_request_hooks)
+ project.execute_hooks(data, :merge_request_hooks)
end
it 'executes the system hooks when inside a transaction' do
@@ -3699,7 +3628,7 @@ describe Project do
# actually get to the `after_commit` hook that queues these jobs.
expect do
project.transaction do
- project.execute_hooks({ data: 'data' }, :merge_request_hooks)
+ project.execute_hooks(data, :merge_request_hooks)
end
end.not_to raise_error # Sidekiq::Worker::EnqueueFromTransactionError
end
@@ -3956,9 +3885,163 @@ describe Project do
end
end
- def rugged_config
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged.config
+ context '#members_among' do
+ let(:users) { create_list(:user, 3) }
+ set(:group) { create(:group) }
+ set(:project) { create(:project, namespace: group) }
+
+ before do
+ project.add_guest(users.first)
+ project.group.add_maintainer(users.last)
+ end
+
+ context 'when users is an Array' do
+ it 'returns project members among the users' do
+ expect(project.members_among(users)).to eq([users.first, users.last])
+ end
+
+ it 'maintains input order' do
+ expect(project.members_among(users.reverse)).to eq([users.last, users.first])
+ end
+
+ it 'returns empty array if users is empty' do
+ result = project.members_among([])
+
+ expect(result).to be_empty
+ end
end
+
+ context 'when users is a relation' do
+ it 'returns project members among the users' do
+ result = project.members_among(User.where(id: users.map(&:id)))
+
+ expect(result).to be_a(ActiveRecord::Relation)
+ expect(result).to eq([users.first, users.last])
+ end
+
+ it 'returns empty relation if users is empty' do
+ result = project.members_among(User.none)
+
+ expect(result).to be_a(ActiveRecord::Relation)
+ expect(result).to be_empty
+ end
+ end
+ end
+
+ describe "#find_or_initialize_services" do
+ subject { build(:project) }
+
+ it 'returns only enabled services' do
+ allow(Service).to receive(:available_services_names).and_return(%w(prometheus pushover))
+ allow(subject).to receive(:disabled_services).and_return(%w(prometheus))
+
+ services = subject.find_or_initialize_services
+
+ expect(services.count).to eq 1
+ expect(services).to include(PushoverService)
+ end
+ end
+
+ describe "#find_or_initialize_service" do
+ subject { build(:project) }
+
+ it 'avoids N+1 database queries' do
+ allow(Service).to receive(:available_services_names).and_return(%w(prometheus pushover))
+
+ control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_service('prometheus') }.count
+
+ allow(Service).to receive(:available_services_names).and_call_original
+
+ expect { subject.find_or_initialize_service('prometheus') }.not_to exceed_query_limit(control_count)
+ end
+
+ it 'returns nil if service is disabled' do
+ allow(subject).to receive(:disabled_services).and_return(%w(prometheus))
+
+ expect(subject.find_or_initialize_service('prometheus')).to be_nil
+ end
+ end
+
+ describe '.find_without_deleted' do
+ it 'returns nil if the project is about to be removed' do
+ project = create(:project, pending_delete: true)
+
+ expect(described_class.find_without_deleted(project.id)).to be_nil
+ end
+
+ it 'returns a project when it is not about to be removed' do
+ project = create(:project)
+
+ expect(described_class.find_without_deleted(project.id)).to eq(project)
+ end
+ end
+
+ describe '.for_group' do
+ it 'returns the projects for a given group' do
+ group = create(:group)
+ project = create(:project, namespace: group)
+
+ expect(described_class.for_group(group)).to eq([project])
+ end
+ end
+
+ describe '.deployments' do
+ subject { project.deployments }
+
+ let(:project) { create(:project) }
+
+ before do
+ allow_any_instance_of(Deployment).to receive(:create_ref)
+ end
+
+ context 'when there is a deployment record with created status' do
+ let(:deployment) { create(:deployment, :created, project: project) }
+
+ it 'does not return the record' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there is a deployment record with running status' do
+ let(:deployment) { create(:deployment, :running, project: project) }
+
+ it 'does not return the record' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there is a deployment record with success status' do
+ let(:deployment) { create(:deployment, :success, project: project) }
+
+ it 'returns the record' do
+ is_expected.to eq([deployment])
+ end
+ end
+ end
+
+ describe '#snippets_visible?' do
+ it 'returns true when a logged in user can read snippets' do
+ project = create(:project, :public)
+ user = create(:user)
+
+ expect(project.snippets_visible?(user)).to eq(true)
+ end
+
+ it 'returns true when an anonymous user can read snippets' do
+ project = create(:project, :public)
+
+ expect(project.snippets_visible?).to eq(true)
+ end
+
+ it 'returns false when a user can not read snippets' do
+ project = create(:project, :private)
+ user = create(:user)
+
+ expect(project.snippets_visible?(user)).to eq(false)
+ end
+ end
+
+ def rugged_config
+ rugged_repo(project.repository).config
end
end
diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb
index 528f5b610d7..cc5e34782ec 100644
--- a/spec/models/project_wiki_spec.rb
+++ b/spec/models/project_wiki_spec.rb
@@ -2,12 +2,13 @@
require "spec_helper"
describe ProjectWiki do
- let(:project) { create(:project, :wiki_repo) }
+ let(:user) { create(:user, :commit_email) }
+ let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:repository) { project.repository }
- let(:user) { project.owner }
let(:gitlab_shell) { Gitlab::Shell.new }
let(:project_wiki) { described_class.new(project, user) }
let(:raw_repository) { Gitlab::Git::Repository.new(project.repository_storage, subject.disk_path + '.git', 'foo') }
+ let(:commit) { project_wiki.repository.head_commit }
subject { project_wiki }
@@ -144,7 +145,7 @@ describe ProjectWiki do
end
it "returns nil if the page does not exist" do
- expect(subject.find_page("non-existant")).to eq(nil)
+ expect(subject.find_page("non-existent")).to eq(nil)
end
it "can find a page by slug" do
@@ -225,7 +226,7 @@ describe ProjectWiki do
end
it 'returns nil if the page does not exist' do
- expect(subject.find_file('non-existant')).to eq(nil)
+ expect(subject.find_file('non-existent')).to eq(nil)
end
it 'returns a Gitlab::Git::WikiFile instance' do
@@ -276,6 +277,14 @@ describe ProjectWiki do
expect(subject.pages.first.page.version.message).to eq("commit message")
end
+ it 'sets the correct commit email' do
+ subject.create_page('test page', 'content')
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+
it 'updates project activity' do
subject.create_page('Test Page', 'This is content')
@@ -320,6 +329,12 @@ describe ProjectWiki do
expect(@page.version.message).to eq("updated page")
end
+ it 'sets the correct commit email' do
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+
it 'updates project activity' do
subject.update_page(
@gitlab_git_wiki_page,
@@ -347,6 +362,14 @@ describe ProjectWiki do
expect(subject.pages.count).to eq(0)
end
+ it 'sets the correct commit email' do
+ subject.delete_page(@page)
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+
it 'updates project activity' do
subject.delete_page(@page)
@@ -420,7 +443,7 @@ describe ProjectWiki do
end
def commit_details
- Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.email, "test commit")
+ Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.commit_email, "test commit")
end
def create_page(name, content)
diff --git a/spec/models/prometheus_metric_spec.rb b/spec/models/prometheus_metric_spec.rb
new file mode 100644
index 00000000000..a83a31ae88c
--- /dev/null
+++ b/spec/models/prometheus_metric_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe PrometheusMetric do
+ subject { build(:prometheus_metric) }
+ let(:other_project) { build(:project) }
+
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to validate_presence_of(:title) }
+ it { is_expected.to validate_presence_of(:query) }
+ it { is_expected.to validate_presence_of(:group) }
+
+ describe 'common metrics' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:common, :project, :result) do
+ false | other_project | true
+ false | nil | false
+ true | other_project | false
+ true | nil | true
+ end
+
+ with_them do
+ before do
+ subject.common = common
+ subject.project = project
+ end
+
+ it { expect(subject.valid?).to eq(result) }
+ end
+ end
+
+ describe '#query_series' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:legend, :type) do
+ 'Some other legend' | NilClass
+ 'Status Code' | Array
+ end
+
+ with_them do
+ before do
+ subject.legend = legend
+ end
+
+ it { expect(subject.query_series).to be_a(type) }
+ end
+ end
+
+ describe '#group_title' do
+ shared_examples 'group_title' do |group, title|
+ subject { build(:prometheus_metric, group: group).group_title }
+
+ it "returns text #{title} for group #{group}" do
+ expect(subject).to eq(title)
+ end
+ end
+
+ it_behaves_like 'group_title', :business, 'Business metrics (Custom)'
+ it_behaves_like 'group_title', :response, 'Response metrics (Custom)'
+ it_behaves_like 'group_title', :system, 'System metrics (Custom)'
+ end
+
+ describe '#to_query_metric' do
+ it 'converts to queryable metric object' do
+ expect(subject.to_query_metric).to be_instance_of(Gitlab::Prometheus::Metric)
+ end
+
+ it 'queryable metric object has title' do
+ expect(subject.to_query_metric.title).to eq(subject.title)
+ end
+
+ it 'queryable metric object has y_label' do
+ expect(subject.to_query_metric.y_label).to eq(subject.y_label)
+ end
+
+ it 'queryable metric has no required_metric' do
+ expect(subject.to_query_metric.required_metrics).to eq([])
+ end
+
+ it 'queryable metric has weight 0' do
+ expect(subject.to_query_metric.weight).to eq(0)
+ end
+
+ it 'queryable metrics has query description' do
+ queries = [
+ {
+ query_range: subject.query,
+ unit: subject.unit,
+ label: subject.legend
+ }
+ ]
+
+ expect(subject.to_query_metric.queries).to eq(queries)
+ end
+ end
+end
diff --git a/spec/models/remote_mirror_spec.rb b/spec/models/remote_mirror_spec.rb
index c2ef0435c8e..3d316fb3c5b 100644
--- a/spec/models/remote_mirror_spec.rb
+++ b/spec/models/remote_mirror_spec.rb
@@ -1,6 +1,8 @@
require 'rails_helper'
describe RemoteMirror do
+ include GitHelpers
+
describe 'URL validation' do
context 'with a valid URL' do
it 'should be valid' do
@@ -74,9 +76,7 @@ describe RemoteMirror do
mirror.update_attribute(:url, 'http://foo:baz@test.com')
- config = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repo.raw_repository.rugged.config
- end
+ config = rugged_repo(repo).config
expect(config["remote.#{mirror.remote_name}.url"]).to eq('http://foo:baz@test.com')
end
@@ -220,6 +220,18 @@ describe RemoteMirror do
end
end
+ context '#ensure_remote!' do
+ let(:remote_mirror) { create(:project, :repository, :remote_mirror).remote_mirrors.first }
+
+ it 'adds a remote multiple times with no errors' do
+ expect(remote_mirror.project.repository).to receive(:add_remote).with(remote_mirror.remote_name, remote_mirror.url).twice.and_call_original
+
+ 2.times do
+ remote_mirror.ensure_remote!
+ end
+ end
+ end
+
context '#updated_since?' do
let(:remote_mirror) { create(:project, :repository, :remote_mirror).remote_mirrors.first }
let(:timestamp) { Time.now - 5.minutes }
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 52ec8dbe25a..56edb0fd6da 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2,6 +2,8 @@ require 'spec_helper'
describe Repository do
include RepoHelpers
+ include GitHelpers
+
TestBlob = Struct.new(:path)
let(:project) { create(:project, :repository) }
@@ -28,7 +30,7 @@ describe Repository do
def expect_to_raise_storage_error
expect { yield }.to raise_error do |exception|
- storage_exceptions = [Gitlab::Git::Storage::Inaccessible, Gitlab::Git::CommandError, GRPC::Unavailable]
+ storage_exceptions = [Gitlab::Git::CommandError, GRPC::Unavailable]
known_exception = storage_exceptions.select { |e| exception.is_a?(e) }
expect(known_exception).not_to be_nil
@@ -137,9 +139,7 @@ describe Repository do
options = { message: 'test tag message\n',
tagger: { name: 'John Smith', email: 'john@gmail.com' } }
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options)
- end
+ rugged_repo(repository).tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options)
double_first = double(committed_date: Time.now - 1.second)
double_last = double(committed_date: Time.now)
@@ -151,9 +151,7 @@ describe Repository do
it { is_expected.to eq(['v1.1.0', 'v1.0.0', annotated_tag_name]) }
after do
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged.tags.delete(annotated_tag_name)
- end
+ rugged_repo(repository).tags.delete(annotated_tag_name)
end
end
end
@@ -188,6 +186,57 @@ describe Repository do
end
end
+ describe '#list_last_commits_for_tree' do
+ let(:path_to_commit) do
+ {
+ "encoding" => "913c66a37b4a45b9769037c55c2d238bd0942d2e",
+ "files" => "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
+ ".gitignore" => "c1acaa58bbcbc3eafe538cb8274ba387047b69f8",
+ ".gitmodules" => "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9",
+ "CHANGELOG" => "913c66a37b4a45b9769037c55c2d238bd0942d2e",
+ "CONTRIBUTING.md" => "6d394385cf567f80a8fd85055db1ab4c5295806f",
+ "Gemfile.zip" => "ae73cb07c9eeaf35924a10f713b364d32b2dd34f",
+ "LICENSE" => "1a0b36b3cdad1d2ee32457c102a8c0b7056fa863",
+ "MAINTENANCE.md" => "913c66a37b4a45b9769037c55c2d238bd0942d2e",
+ "PROCESS.md" => "913c66a37b4a45b9769037c55c2d238bd0942d2e",
+ "README.md" => "1a0b36b3cdad1d2ee32457c102a8c0b7056fa863",
+ "VERSION" => "913c66a37b4a45b9769037c55c2d238bd0942d2e",
+ "gitlab-shell" => "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9",
+ "six" => "cfe32cf61b73a0d5e9f13e774abde7ff789b1660"
+ }
+ end
+
+ subject { repository.list_last_commits_for_tree(sample_commit.id, '.').id }
+
+ it 'returns the last commits for every entry in the current path' do
+ result = repository.list_last_commits_for_tree(sample_commit.id, '.')
+
+ result.each do |key, value|
+ result[key] = value.id
+ end
+
+ expect(result).to include(path_to_commit)
+ end
+
+ it 'returns the last commits for every entry in the current path starting from the offset' do
+ result = repository.list_last_commits_for_tree(sample_commit.id, '.', offset: path_to_commit.size - 1)
+
+ expect(result.size).to eq(1)
+ end
+
+ it 'returns a limited number of last commits for every entry in the current path starting from the offset' do
+ result = repository.list_last_commits_for_tree(sample_commit.id, '.', limit: 1)
+
+ expect(result.size).to eq(1)
+ end
+
+ it 'returns an empty hash when offset is out of bounds' do
+ result = repository.list_last_commits_for_tree(sample_commit.id, '.', offset: path_to_commit.size)
+
+ expect(result.size).to eq(0)
+ end
+ end
+
describe '#last_commit_for_path' do
shared_examples 'getting last commit for path' do
subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id }
@@ -296,41 +345,31 @@ describe Repository do
end
describe '#new_commits' do
- shared_examples 'finding unreferenced commits' do
- set(:project) { create(:project, :repository) }
- let(:repository) { project.repository }
+ set(:project) { create(:project, :repository) }
+ let(:repository) { project.repository }
- subject { repository.new_commits(rev) }
+ subject { repository.new_commits(rev) }
- context 'when there are no new commits' do
- let(:rev) { repository.commit.id }
+ context 'when there are no new commits' do
+ let(:rev) { repository.commit.id }
- it 'returns an empty array' do
- expect(subject).to eq([])
- end
+ it 'returns an empty array' do
+ expect(subject).to eq([])
end
+ end
- context 'when new commits are found' do
- let(:branch) { 'orphaned-branch' }
- let!(:rev) { repository.commit(branch).id }
+ context 'when new commits are found' do
+ let(:branch) { 'orphaned-branch' }
+ let!(:rev) { repository.commit(branch).id }
- it 'returns the commits' do
- repository.delete_branch(branch)
+ it 'returns the commits' do
+ repository.delete_branch(branch)
- expect(subject).not_to be_empty
- expect(subject).to all( be_a(::Commit) )
- expect(subject.size).to eq(1)
- end
+ expect(subject).not_to be_empty
+ expect(subject).to all( be_a(::Commit) )
+ expect(subject.size).to eq(1)
end
end
-
- context 'when Gitaly handles the request' do
- it_behaves_like 'finding unreferenced commits'
- end
-
- context 'when Gitaly is disabled', :disable_gitaly do
- it_behaves_like 'finding unreferenced commits'
- end
end
describe '#commits_by' do
@@ -422,6 +461,24 @@ describe Repository do
it { is_expected.to be_nil }
end
+
+ context 'regular blob' do
+ subject { repository.blob_at(repository.head_commit.sha, '.gitignore') }
+
+ it { is_expected.to be_an_instance_of(::Blob) }
+ end
+
+ context 'readme blob on HEAD' do
+ subject { repository.blob_at(repository.head_commit.sha, 'README.md') }
+
+ it { is_expected.to be_an_instance_of(::ReadmeBlob) }
+ end
+
+ context 'readme blob not on HEAD' do
+ subject { repository.blob_at(repository.find_branch('feature').target, 'README.md') }
+
+ it { is_expected.to be_an_instance_of(::Blob) }
+ end
end
describe '#merged_to_root_ref?' do
@@ -1038,208 +1095,61 @@ describe Repository do
end
end
- describe '#update_branch_with_hooks' do
- let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature
- let(:new_rev) { 'a74ae73c1ccde9b974a70e82b901588071dc142a' } # commit whose parent is old_rev
- let(:updating_ref) { 'refs/heads/feature' }
- let(:target_project) { project }
- let(:target_repository) { target_project.repository }
-
- around do |example|
- # TODO Gitlab::Git::OperationService will be moved to gitaly-ruby and disappear from this repo
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
+ describe '#exists?' do
+ it 'returns true when a repository exists' do
+ expect(repository.exists?).to be(true)
end
- context 'when pre hooks were successful' do
- before do
- service = Gitlab::Git::HooksService.new
- expect(Gitlab::Git::HooksService).to receive(:new).and_return(service)
- expect(service).to receive(:execute)
- .with(git_user, target_repository.raw_repository, old_rev, new_rev, updating_ref)
- .and_yield(service).and_return(true)
- end
-
- it 'runs without errors' do
- expect do
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch('feature') do
- new_rev
- end
- end.not_to raise_error
- end
-
- it 'ensures the autocrlf Git option is set to :input' do
- service = Gitlab::Git::OperationService.new(git_user, repository.raw_repository)
+ it 'returns false if no full path can be constructed' do
+ allow(repository).to receive(:full_path).and_return(nil)
- expect(service).to receive(:update_autocrlf_option)
+ expect(repository.exists?).to be(false)
+ end
- service.with_branch('feature') { new_rev }
+ context 'with broken storage', :broken_storage do
+ it 'should raise a storage error' do
+ expect_to_raise_storage_error { broken_repository.exists? }
end
+ end
- context "when the branch wasn't empty" do
- it 'updates the head' do
- expect(repository.find_branch('feature').dereferenced_target.id).to eq(old_rev)
-
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch('feature') do
- new_rev
- end
+ context 'asymmetric caching', :use_clean_rails_memory_store_caching, :request_store do
+ let(:cache) { repository.send(:cache) }
+ let(:request_store_cache) { repository.send(:request_store_cache) }
- expect(repository.find_branch('feature').dereferenced_target.id).to eq(new_rev)
+ context 'when it returns true' do
+ before do
+ expect(repository.raw_repository).to receive(:exists?).once.and_return(true)
end
- end
-
- context 'when target project does not have the commit' do
- let(:target_project) { create(:project, :empty_repo) }
- let(:old_rev) { Gitlab::Git::BLANK_SHA }
- let(:new_rev) { project.commit('feature').sha }
- let(:updating_ref) { 'refs/heads/master' }
- it 'fetch_ref and create the branch' do
- expect(target_project.repository.raw_repository).to receive(:fetch_ref)
- .and_call_original
-
- Gitlab::Git::OperationService.new(git_user, target_repository.raw_repository)
- .with_branch(
- 'master',
- start_repository: project.repository.raw_repository,
- start_branch_name: 'feature') { new_rev }
-
- expect(target_repository.branch_names).to contain_exactly('master')
+ it 'caches the output in RequestStore' do
+ expect do
+ repository.exists?
+ end.to change { request_store_cache.read(:exists?) }.from(nil).to(true)
end
- end
- context 'when target project already has the commit' do
- let(:target_project) { create(:project, :repository) }
-
- it 'does not fetch_ref and just pass the commit' do
- expect(target_repository).not_to receive(:fetch_ref)
-
- Gitlab::Git::OperationService.new(git_user, target_repository.raw_repository)
- .with_branch('feature', start_repository: project.repository.raw_repository) { new_rev }
+ it 'caches the output in RepositoryCache' do
+ expect do
+ repository.exists?
+ end.to change { cache.read(:exists?) }.from(nil).to(true)
end
end
- end
-
- context 'when temporary ref failed to be created from other project' do
- let(:target_project) { create(:project, :empty_repo) }
-
- before do
- expect(target_project.repository.raw_repository).to receive(:run_git)
- end
-
- it 'raises Rugged::ReferenceError' do
- expect do
- Gitlab::Git::OperationService.new(git_user, target_project.repository.raw_repository)
- .with_branch('feature',
- start_repository: project.repository.raw_repository,
- &:itself)
- end.to raise_error(Gitlab::Git::CommandError)
- end
- end
-
- context 'when the update adds more than one commit' do
- let(:old_rev) { '33f3729a45c02fc67d00adb1b8bca394b0e761d9' }
-
- it 'runs without errors' do
- # old_rev is an ancestor of new_rev
- expect(repository.merge_base(old_rev, new_rev)).to eq(old_rev)
-
- # old_rev is not a direct ancestor (parent) of new_rev
- expect(repository.rugged.lookup(new_rev).parent_ids).not_to include(old_rev)
-
- branch = 'feature-ff-target'
- repository.add_branch(user, branch, old_rev)
-
- expect do
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch(branch) do
- new_rev
- end
- end.not_to raise_error
- end
- end
-
- context 'when the update would remove commits from the target branch' do
- let(:branch) { 'master' }
- let(:old_rev) { repository.find_branch(branch).dereferenced_target.sha }
-
- it 'raises an exception' do
- # The 'master' branch is NOT an ancestor of new_rev.
- expect(repository.merge_base(old_rev, new_rev)).not_to eq(old_rev)
-
- # Updating 'master' to new_rev would lose the commits on 'master' that
- # are not contained in new_rev. This should not be allowed.
- expect do
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch(branch) do
- new_rev
- end
- end.to raise_error(Gitlab::Git::CommitError)
- end
- end
-
- context 'when pre hooks failed' do
- it 'gets an error' do
- allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
-
- expect do
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch('feature') do
- new_rev
- end
- end.to raise_error(Gitlab::Git::PreReceiveError)
- end
- end
- context 'when target branch is different from source branch' do
- before do
- allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
- end
-
- subject do
- Gitlab::Git::OperationService.new(git_user, repository.raw_repository).with_branch('new-feature') do
- new_rev
+ context 'when it returns false' do
+ before do
+ expect(repository.raw_repository).to receive(:exists?).once.and_return(false)
end
- end
-
- it 'returns branch_created as true' do
- expect(subject).not_to be_repo_created
- expect(subject).to be_branch_created
- end
- end
- context 'when repository is empty' do
- before do
- allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
- end
-
- it 'expires creation and branch cache' do
- empty_repository = create(:project, :empty_repo).repository
-
- expect(empty_repository).to receive(:expire_exists_cache)
- expect(empty_repository).to receive(:expire_root_ref_cache)
- expect(empty_repository).to receive(:expire_emptiness_caches)
- expect(empty_repository).to receive(:expire_branches_cache)
-
- empty_repository.create_file(user, 'CHANGELOG', 'Changelog!',
- message: 'Updates file content',
- branch_name: 'master')
- end
- end
- end
-
- describe '#exists?' do
- it 'returns true when a repository exists' do
- expect(repository.exists?).to be(true)
- end
-
- it 'returns false if no full path can be constructed' do
- allow(repository).to receive(:full_path).and_return(nil)
-
- expect(repository.exists?).to be(false)
- end
+ it 'caches the output in RequestStore' do
+ expect do
+ repository.exists?
+ end.to change { request_store_cache.read(:exists?) }.from(nil).to(false)
+ end
- context 'with broken storage', :broken_storage do
- it 'should raise a storage error' do
- expect_to_raise_storage_error { broken_repository.exists? }
+ it 'does NOT cache the output in RepositoryCache' do
+ expect do
+ repository.exists?
+ end.not_to change { cache.read(:exists?) }.from(nil)
+ end
end
end
end
@@ -1308,40 +1218,6 @@ describe Repository do
end
end
- describe '#update_autocrlf_option' do
- around do |example|
- # TODO Gitlab::Git::OperationService will be moved to gitaly-ruby and disappear from this repo
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
- describe 'when autocrlf is not already set to :input' do
- before do
- repository.raw_repository.autocrlf = true
- end
-
- it 'sets autocrlf to :input' do
- Gitlab::Git::OperationService.new(nil, repository.raw_repository).send(:update_autocrlf_option)
-
- expect(repository.raw_repository.autocrlf).to eq(:input)
- end
- end
-
- describe 'when autocrlf is already set to :input' do
- before do
- repository.raw_repository.autocrlf = :input
- end
-
- it 'does nothing' do
- expect(repository.raw_repository).not_to receive(:autocrlf=)
- .with(:input)
-
- Gitlab::Git::OperationService.new(nil, repository.raw_repository).send(:update_autocrlf_option)
- end
- end
- end
-
describe '#empty?' do
let(:empty_repository) { create(:project_empty_repo).repository }
@@ -1709,7 +1585,6 @@ describe Repository do
:license_blob,
:license_key,
:gitignore,
- :koding_yml,
:gitlab_ci_yml,
:branch_names,
:tag_names,
@@ -1818,10 +1693,7 @@ describe Repository do
it 'returns the number of branches' do
expect(repository.branch_count).to be_an(Integer)
- # NOTE: Until rugged goes away, make sure rugged and gitaly are in sync
- rugged_count = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.raw_repository.rugged.branches.count
- end
+ rugged_count = rugged_repo(repository).branches.count
expect(repository.branch_count).to eq(rugged_count)
end
@@ -1831,10 +1703,7 @@ describe Repository do
it 'returns the number of tags' do
expect(repository.tag_count).to be_an(Integer)
- # NOTE: Until rugged goes away, make sure rugged and gitaly are in sync
- rugged_count = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.raw_repository.rugged.tags.count
- end
+ rugged_count = rugged_repo(repository).tags.count
expect(repository.tag_count).to eq(rugged_count)
end
@@ -1948,12 +1817,19 @@ describe Repository do
describe '#expire_exists_cache' do
let(:cache) { repository.send(:cache) }
+ let(:request_store_cache) { repository.send(:request_store_cache) }
it 'expires the cache' do
expect(cache).to receive(:expire).with(:exists?)
repository.expire_exists_cache
end
+
+ it 'expires the request store cache', :request_store do
+ expect(request_store_cache).to receive(:expire).with(:exists?)
+
+ repository.expire_exists_cache
+ end
end
describe '#xcode_project?' do
@@ -2015,26 +1891,23 @@ describe Repository do
File.delete(path)
end
- end
- describe '#update_ref' do
- around do |example|
- # TODO Gitlab::Git::OperationService will be moved to gitaly-ruby and disappear from this repo
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
+ context 'for multiple SHAs' do
+ it 'skips non-existent SHAs' do
+ repository.keep_around('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', sample_commit.id)
+
+ expect(repository.kept_around?(sample_commit.id)).to be_truthy
end
- end
- it 'can create a ref' do
- Gitlab::Git::OperationService.new(nil, repository.raw_repository).send(:update_ref, 'refs/heads/foobar', 'refs/heads/master', Gitlab::Git::BLANK_SHA)
+ it 'skips already-kept-around SHAs' do
+ repository.keep_around(sample_commit.id)
- expect(repository.find_branch('foobar')).not_to be_nil
- end
+ expect(repository.raw_repository).to receive(:write_ref).exactly(1).and_call_original
- it 'raises CommitError when the ref update fails' do
- expect do
- Gitlab::Git::OperationService.new(nil, repository.raw_repository).send(:update_ref, 'refs/heads/master', 'refs/heads/master', Gitlab::Git::BLANK_SHA)
- end.to raise_error(Gitlab::Git::CommitError)
+ repository.keep_around(sample_commit.id, another_sample_commit.id)
+
+ expect(repository.kept_around?(another_sample_commit.id)).to be_truthy
+ end
end
end
@@ -2065,38 +1938,27 @@ describe Repository do
end
end
- describe '#koding_yml', :use_clean_rails_memory_store_caching do
- it 'returns and caches the output' do
- expect(repository).to receive(:file_on_head)
- .with(:koding)
- .and_return(Gitlab::Git::Tree.new(path: '.koding.yml'))
- .once
-
- 2.times do
- expect(repository.koding_yml).to be_an_instance_of(Gitlab::Git::Tree)
- end
- end
- end
-
describe '#readme', :use_clean_rails_memory_store_caching do
context 'with a non-existing repository' do
- it 'returns nil' do
- allow(repository).to receive(:tree).with(:head).and_return(nil)
+ let(:project) { create(:project) }
+ it 'returns nil' do
expect(repository.readme).to be_nil
end
end
context 'with an existing repository' do
context 'when no README exists' do
- it 'returns nil' do
- allow_any_instance_of(Tree).to receive(:readme).and_return(nil)
+ let(:project) { create(:project, :empty_repo) }
+ it 'returns nil' do
expect(repository.readme).to be_nil
end
end
context 'when a README exists' do
+ let(:project) { create(:project, :repository) }
+
it 'returns the README' do
expect(repository.readme).to be_an_instance_of(ReadmeBlob)
end
@@ -2127,7 +1989,7 @@ describe Repository do
match[1].to_sym if match
end.compact
- expect(methods).to match_array(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS)
+ expect(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS).to include(*methods)
end
end
@@ -2320,9 +2182,7 @@ describe Repository do
end
def create_remote_branch(remote_name, branch_name, target)
- rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- repository.rugged
- end
+ rugged = rugged_repo(repository)
rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
end
@@ -2532,4 +2392,33 @@ describe Repository do
end
end
end
+
+ describe '#merge_base' do
+ set(:project) { create(:project, :repository) }
+ subject(:repository) { project.repository }
+
+ it 'only makes one gitaly call' do
+ expect(Gitlab::GitalyClient).to receive(:call).once.and_call_original
+
+ repository.merge_base('master', 'fix')
+ end
+ end
+
+ describe '#cache' do
+ subject(:cache) { repository.send(:cache) }
+
+ it 'returns a RepositoryCache' do
+ expect(subject).to be_kind_of Gitlab::RepositoryCache
+ end
+
+ it 'when is_wiki it includes wiki as part of key' do
+ allow(repository).to receive(:is_wiki) { true }
+
+ expect(subject.namespace).to include('wiki')
+ end
+
+ it 'when is_wiki is false extra_namespace is nil' do
+ expect(subject.namespace).not_to include('wiki')
+ end
+ end
end
diff --git a/spec/models/resource_label_event_spec.rb b/spec/models/resource_label_event_spec.rb
index 4756caa1b97..da6e1b5610d 100644
--- a/spec/models/resource_label_event_spec.rb
+++ b/spec/models/resource_label_event_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe ResourceLabelEvent, type: :model do
- subject { build(:resource_label_event) }
+ subject { build(:resource_label_event, issue: issue) }
let(:issue) { create(:issue) }
let(:merge_request) { create(:merge_request) }
@@ -16,8 +16,6 @@ RSpec.describe ResourceLabelEvent, type: :model do
describe 'validations' do
it { is_expected.to be_valid }
- it { is_expected.to validate_presence_of(:label) }
- it { is_expected.to validate_presence_of(:user) }
describe 'Issuable validation' do
it 'is invalid if issue_id and merge_request_id are missing' do
@@ -45,4 +43,52 @@ RSpec.describe ResourceLabelEvent, type: :model do
end
end
end
+
+ describe '#expire_etag_cache' do
+ def expect_expiration(issue)
+ expect_any_instance_of(Gitlab::EtagCaching::Store)
+ .to receive(:touch)
+ .with("/#{issue.project.namespace.to_param}/#{issue.project.to_param}/noteable/issue/#{issue.id}/notes")
+ end
+
+ it 'expires resource note etag cache on event save' do
+ expect_expiration(subject.issuable)
+
+ subject.save!
+ end
+
+ it 'expires resource note etag cache on event destroy' do
+ subject.save!
+
+ expect_expiration(subject.issuable)
+
+ subject.destroy!
+ end
+ end
+
+ describe '#outdated_markdown?' do
+ it 'returns true if label is missing and reference is not empty' do
+ subject.attributes = { reference: 'ref', label_id: nil }
+
+ expect(subject.outdated_markdown?).to be true
+ end
+
+ it 'returns true if reference is not set yet' do
+ subject.attributes = { reference: nil }
+
+ expect(subject.outdated_markdown?).to be true
+ end
+
+ it 'returns true markdown is outdated' do
+ subject.attributes = { cached_markdown_version: 0 }
+
+ expect(subject.outdated_markdown?).to be true
+ end
+
+ it 'returns false if label and reference are set' do
+ subject.attributes = { reference: 'whatever', cached_markdown_version: CacheMarkdownField::CACHE_COMMONMARK_VERSION }
+
+ expect(subject.outdated_markdown?).to be false
+ end
+ end
end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index 029ad7f3e9f..25eecb3f909 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -345,4 +345,31 @@ describe Service do
expect(service.api_field_names).to eq(['safe_field'])
end
end
+
+ context 'logging' do
+ let(:project) { create(:project) }
+ let(:service) { create(:service, project: project) }
+ let(:test_message) { "test message" }
+ let(:arguments) do
+ {
+ service_class: service.class.name,
+ project_path: project.full_path,
+ project_id: project.id,
+ message: test_message,
+ additional_argument: 'some argument'
+ }
+ end
+
+ it 'logs info messages using json logger' do
+ expect(Gitlab::JsonLogger).to receive(:info).with(arguments)
+
+ service.log_info(test_message, additional_argument: 'some argument')
+ end
+
+ it 'logs error messages using json logger' do
+ expect(Gitlab::JsonLogger).to receive(:error).with(arguments)
+
+ service.log_error(test_message, additional_argument: 'some argument')
+ end
+ end
end
diff --git a/spec/models/shard_spec.rb b/spec/models/shard_spec.rb
new file mode 100644
index 00000000000..83104711b55
--- /dev/null
+++ b/spec/models/shard_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literals: true
+require 'spec_helper'
+
+describe Shard do
+ describe '.populate!' do
+ it 'creates shards based on the config file' do
+ expect(described_class.all).to be_empty
+
+ stub_storage_settings(foo: {}, bar: {}, baz: {})
+
+ described_class.populate!
+
+ expect(described_class.all.map(&:name)).to match_array(%w[default foo bar baz])
+ end
+ end
+
+ describe '.by_name' do
+ let(:default_shard) { described_class.find_by(name: 'default') }
+
+ before do
+ described_class.populate!
+ end
+
+ it 'returns an existing shard' do
+ expect(described_class.by_name('default')).to eq(default_shard)
+ end
+
+ it 'creates a new shard' do
+ result = described_class.by_name('foo')
+
+ expect(result).not_to eq(default_shard)
+ expect(result.name).to eq('foo')
+ end
+
+ it 'retries if creation races' do
+ expect(described_class)
+ .to receive(:find_or_create_by)
+ .with(name: 'default')
+ .and_raise(ActiveRecord::RecordNotUnique, 'fail')
+ .once
+
+ expect(described_class)
+ .to receive(:find_or_create_by)
+ .with(name: 'default')
+ .and_call_original
+
+ expect(described_class.by_name('default')).to eq(default_shard)
+ end
+ end
+end
diff --git a/spec/models/site_statistic_spec.rb b/spec/models/site_statistic_spec.rb
index 9b056fbf332..0e739900065 100644
--- a/spec/models/site_statistic_spec.rb
+++ b/spec/models/site_statistic_spec.rb
@@ -25,7 +25,6 @@ describe SiteStatistic do
it 'increases the attribute counter' do
expect { described_class.track('repositories_count') }.to change { statistics.reload.repositories_count }.by(1)
- expect { described_class.track('wikis_count') }.to change { statistics.reload.wikis_count }.by(1)
end
it 'doesnt increase the attribute counter when an exception happens during transaction' do
@@ -56,7 +55,6 @@ describe SiteStatistic do
it 'decreases the attribute counter' do
expect { described_class.untrack('repositories_count') }.to change { statistics.reload.repositories_count }.by(-1)
- expect { described_class.untrack('wikis_count') }.to change { statistics.reload.wikis_count }.by(-1)
end
it 'doesnt decrease the attribute counter when an exception happens during transaction' do
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index e09d89d235d..7a7272ccb60 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -131,6 +131,217 @@ describe Snippet do
end
end
+ describe '.with_optional_visibility' do
+ context 'when a visibility level is provided' do
+ it 'returns snippets with the given visibility' do
+ create(:snippet, :private)
+
+ snippet = create(:snippet, :public)
+ snippets = described_class
+ .with_optional_visibility(Gitlab::VisibilityLevel::PUBLIC)
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ context 'when a visibility level is not provided' do
+ it 'returns all snippets' do
+ snippet1 = create(:snippet, :public)
+ snippet2 = create(:snippet, :private)
+ snippets = described_class.with_optional_visibility
+
+ expect(snippets).to include(snippet1, snippet2)
+ end
+ end
+ end
+
+ describe '.only_global_snippets' do
+ it 'returns snippets not associated with any projects' do
+ create(:project_snippet)
+
+ snippet = create(:snippet)
+ snippets = described_class.only_global_snippets
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ describe '.only_include_projects_visible_to' do
+ let!(:project1) { create(:project, :public) }
+ let!(:project2) { create(:project, :internal) }
+ let!(:project3) { create(:project, :private) }
+ let!(:snippet1) { create(:project_snippet, project: project1) }
+ let!(:snippet2) { create(:project_snippet, project: project2) }
+ let!(:snippet3) { create(:project_snippet, project: project3) }
+
+ context 'when a user is provided' do
+ it 'returns snippets visible to the user' do
+ user = create(:user)
+
+ snippets = described_class.only_include_projects_visible_to(user)
+
+ expect(snippets).to include(snippet1, snippet2)
+ expect(snippets).not_to include(snippet3)
+ end
+ end
+
+ context 'when a user is not provided' do
+ it 'returns snippets visible to anonymous users' do
+ snippets = described_class.only_include_projects_visible_to
+
+ expect(snippets).to include(snippet1)
+ expect(snippets).not_to include(snippet2, snippet3)
+ end
+ end
+ end
+
+ describe 'only_include_projects_with_snippets_enabled' do
+ context 'when the include_private option is enabled' do
+ it 'includes snippets for projects with snippets set to private' do
+ project = create(:project)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::PRIVATE)
+
+ snippet = create(:project_snippet, project: project)
+
+ snippets = described_class
+ .only_include_projects_with_snippets_enabled(include_private: true)
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ context 'when the include_private option is not enabled' do
+ it 'does not include snippets for projects that have snippets set to private' do
+ project = create(:project)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::PRIVATE)
+
+ create(:project_snippet, project: project)
+
+ snippets = described_class.only_include_projects_with_snippets_enabled
+
+ expect(snippets).to be_empty
+ end
+ end
+
+ it 'includes snippets for projects with snippets enabled' do
+ project = create(:project)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::ENABLED)
+
+ snippet = create(:project_snippet, project: project)
+ snippets = described_class.only_include_projects_with_snippets_enabled
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ describe '.only_include_authorized_projects' do
+ it 'only includes snippets for projects the user is authorized to see' do
+ user = create(:user)
+ project1 = create(:project, :private)
+ project2 = create(:project, :private)
+
+ project1.team.add_developer(user)
+
+ create(:project_snippet, project: project2)
+
+ snippet = create(:project_snippet, project: project1)
+ snippets = described_class.only_include_authorized_projects(user)
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ describe '.for_project_with_user' do
+ context 'when a user is provided' do
+ it 'returns an empty collection if the user can not view the snippets' do
+ project = create(:project, :private)
+ user = create(:user)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::ENABLED)
+
+ create(:project_snippet, :public, project: project)
+
+ expect(described_class.for_project_with_user(project, user)).to be_empty
+ end
+
+ it 'returns the snippets if the user is a member of the project' do
+ project = create(:project, :private)
+ user = create(:user)
+ snippet = create(:project_snippet, project: project)
+
+ project.team.add_developer(user)
+
+ snippets = described_class.for_project_with_user(project, user)
+
+ expect(snippets).to eq([snippet])
+ end
+
+ it 'returns public snippets for a public project the user is not a member of' do
+ project = create(:project, :public)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::ENABLED)
+
+ user = create(:user)
+ snippet = create(:project_snippet, :public, project: project)
+
+ create(:project_snippet, :private, project: project)
+
+ snippets = described_class.for_project_with_user(project, user)
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+
+ context 'when a user is not provided' do
+ it 'returns an empty collection for a private project' do
+ project = create(:project, :private)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::ENABLED)
+
+ create(:project_snippet, :public, project: project)
+
+ expect(described_class.for_project_with_user(project)).to be_empty
+ end
+
+ it 'returns public snippets for a public project' do
+ project = create(:project, :public)
+ snippet = create(:project_snippet, :public, project: project)
+
+ project.project_feature
+ .update(snippets_access_level: ProjectFeature::PUBLIC)
+
+ create(:project_snippet, :private, project: project)
+
+ snippets = described_class.for_project_with_user(project)
+
+ expect(snippets).to eq([snippet])
+ end
+ end
+ end
+
+ describe '.visible_to_or_authored_by' do
+ it 'returns snippets visible to the user' do
+ user = create(:user)
+ snippet1 = create(:snippet, :public)
+ snippet2 = create(:snippet, :private, author: user)
+ snippet3 = create(:snippet, :private)
+
+ snippets = described_class.visible_to_or_authored_by(user)
+
+ expect(snippets).to include(snippet1, snippet2)
+ expect(snippets).not_to include(snippet3)
+ end
+ end
+
describe '#participants' do
let(:project) { create(:project, :public) }
let(:snippet) { create(:snippet, content: 'foo', project: project) }
diff --git a/spec/models/ssh_host_key_spec.rb b/spec/models/ssh_host_key_spec.rb
new file mode 100644
index 00000000000..75db43b3d56
--- /dev/null
+++ b/spec/models/ssh_host_key_spec.rb
@@ -0,0 +1,164 @@
+require 'spec_helper'
+
+describe SshHostKey do
+ using RSpec::Parameterized::TableSyntax
+ include ReactiveCachingHelpers
+
+ let(:key1) do
+ 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3UpyF2iLqy1d63M6k3jH1vuEnq/NWtE+o' \
+ 'rJe1Xn7JoRbduKd6zpsJ0JhBGWgcQK0ph0aGW5PcudzzBSc+SlYfCc4GTaxDtmj41hW0o72m' \
+ 'NiuDW3oKXXShOiVRde2ZOquH8Z865jGiZIC8BI/bXZD29IGUih0hPu7Rjp70VYiE+35QRf/p' \
+ 'sD0Ddrz8QUIG3A/2dMzLI5F5ZORk3BIX2F3mJwJOvZxRhR/SqyphDMZ5eZ0EzqbFBCDE6HAB' \
+ 'Woz9ck8RBGLvCIggmDHj3FmMLcQGMDiy6wKp7QdnBtxjCP6vtE6YPUM223AqsWt+9NTtCfB8' \
+ 'YdNAH7YcHHOR1FgtSk1x'
+ end
+
+ let(:key2) do
+ 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLIp+4ciR2YO9f9rpldc7InNQw/TBUtcNb' \
+ 'J2XR0rr15/5ytz7YM16xXG0Qjx576PNSmqs4gbTrvTuFZak+v1Jx/9deHRq/yqp9f+tv33+i' \
+ 'aJGCQCX/+OVY7aWgV2R9YsS7XQ4mnv4XlOTEssib/rGAIT+ATd/GcdYSEOO+dh4O09/6O/jI' \
+ 'MGSeP+NNetgn1nPCnLOjrXFZUnUtNDi6EEKeIlrliJjSb7Jr4f7gjvZnv4RskWHHFo8FgAAq' \
+ 't0gOMT6EmKrnypBe2vLGSAXbtkXr01q6/DNPH+n9VA1LTV6v1KN/W5CN5tQV11wRSKiM8g5O' \
+ 'Ebi86VjJRi2sOuYoXQU1'
+ end
+
+ # Purposefully ordered so that `sort` will make changes
+ let(:known_hosts) do
+ <<~EOF
+ example.com #{key1} git@localhost
+ @revoked other.example.com #{key2} git@localhost
+ EOF
+ end
+
+ let(:extra) { known_hosts + "foo\nbar\n" }
+ let(:reversed) { known_hosts.lines.reverse.join }
+
+ let(:compare_host_keys) { nil }
+
+ def stub_ssh_keyscan(args, status: true, stdout: "", stderr: "")
+ stdin = StringIO.new
+ stdout = double(:stdout, read: stdout)
+ stderr = double(:stderr, read: stderr)
+ wait_thr = double(:wait_thr, value: double(success?: status))
+
+ expect(Open3).to receive(:popen3).with({}, 'ssh-keyscan', *args).and_yield(stdin, stdout, stderr, wait_thr)
+
+ stdin
+ end
+
+ let(:project) { build(:project) }
+
+ subject(:ssh_host_key) { described_class.new(project: project, url: 'ssh://example.com:2222', compare_host_keys: compare_host_keys) }
+
+ describe '#fingerprints', :use_clean_rails_memory_store_caching do
+ it 'returns an array of indexed fingerprints when the cache is filled' do
+ stub_reactive_cache(ssh_host_key, known_hosts: known_hosts)
+
+ expected = [key1, key2]
+ .map { |data| Gitlab::SSHPublicKey.new(data) }
+ .each_with_index
+ .map { |key, i| { bits: key.bits, fingerprint: key.fingerprint, type: key.type, index: i } }
+
+ expect(ssh_host_key.fingerprints.as_json).to eq(expected)
+ end
+
+ it 'returns an empty array when the cache is empty' do
+ expect(ssh_host_key.fingerprints).to eq([])
+ end
+ end
+
+ describe '#fingerprints', :use_clean_rails_memory_store_caching do
+ it 'returns an array of indexed fingerprints when the cache is filled' do
+ stub_reactive_cache(ssh_host_key, known_hosts: known_hosts)
+
+ expect(ssh_host_key.fingerprints.as_json).to eq(
+ [
+ { bits: 2048, fingerprint: Gitlab::SSHPublicKey.new(key1).fingerprint, type: :rsa, index: 0 },
+ { bits: 2048, fingerprint: Gitlab::SSHPublicKey.new(key2).fingerprint, type: :rsa, index: 1 }
+ ]
+ )
+ end
+
+ it 'returns an empty array when the cache is empty' do
+ expect(ssh_host_key.fingerprints).to eq([])
+ end
+ end
+
+ describe '#host_keys_changed?' do
+ where(:known_hosts_a, :known_hosts_b, :result) do
+ known_hosts | extra | true
+ known_hosts | "foo\n" | true
+ known_hosts | '' | true
+ known_hosts | nil | true
+ known_hosts | known_hosts | false
+ reversed | known_hosts | false
+ extra | "foo\n" | true
+ '' | '' | false
+ nil | nil | false
+ '' | nil | false
+ end
+
+ with_them do
+ let(:compare_host_keys) { known_hosts_b }
+
+ subject { ssh_host_key.host_keys_changed? }
+
+ context '(normal)' do
+ let(:compare_host_keys) { known_hosts_b }
+
+ before do
+ expect(ssh_host_key).to receive(:known_hosts).and_return(known_hosts_a)
+ end
+
+ it { is_expected.to eq(result) }
+ end
+
+ # Comparisons should be symmetrical, so test the reverse too
+ context '(reversed)' do
+ let(:compare_host_keys) { known_hosts_a }
+
+ before do
+ expect(ssh_host_key).to receive(:known_hosts).and_return(known_hosts_b)
+ end
+
+ it { is_expected.to eq(result) }
+ end
+ end
+ end
+
+ describe '#calculate_reactive_cache' do
+ subject(:cache) { ssh_host_key.calculate_reactive_cache }
+
+ it 'writes the hostname to STDIN' do
+ stdin = stub_ssh_keyscan(%w[-T 5 -p 2222 -f-])
+
+ cache
+
+ expect(stdin.string).to eq("example.com\n")
+ end
+
+ context 'successful key scan' do
+ it 'stores the cleaned known_hosts data' do
+ stub_ssh_keyscan(%w[-T 5 -p 2222 -f-], stdout: "KEY 1\nKEY 1\n\n# comment\nKEY 2\n")
+
+ is_expected.to eq(known_hosts: "KEY 1\nKEY 2\n")
+ end
+ end
+
+ context 'failed key scan (exit code 1)' do
+ it 'returns a generic error' do
+ stub_ssh_keyscan(%w[-T 5 -p 2222 -f-], stdout: 'blarg', status: false)
+
+ is_expected.to eq(error: 'Failed to detect SSH host keys')
+ end
+ end
+
+ context 'failed key scan (exit code 0)' do
+ it 'returns a generic error' do
+ stub_ssh_keyscan(%w[-T 5 -p 2222 -f-], stderr: 'Unknown host')
+
+ is_expected.to eq(error: 'Failed to detect SSH host keys')
+ end
+ end
+ end
+end
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index f29abcf536e..82ff2a002e0 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -173,4 +173,129 @@ describe Todo do
expect(subject).not_to be_self_assigned
end
end
+
+ describe '.for_action' do
+ it 'returns the todos for a given action' do
+ create(:todo, action: Todo::MENTIONED)
+
+ todo = create(:todo, action: Todo::ASSIGNED)
+
+ expect(described_class.for_action(Todo::ASSIGNED)).to eq([todo])
+ end
+ end
+
+ describe '.for_author' do
+ it 'returns the todos for a given author' do
+ user1 = create(:user)
+ user2 = create(:user)
+ todo = create(:todo, author: user1)
+
+ create(:todo, author: user2)
+
+ expect(described_class.for_author(user1)).to eq([todo])
+ end
+ end
+
+ describe '.for_project' do
+ it 'returns the todos for a given project' do
+ project1 = create(:project)
+ project2 = create(:project)
+ todo = create(:todo, project: project1)
+
+ create(:todo, project: project2)
+
+ expect(described_class.for_project(project1)).to eq([todo])
+ end
+ end
+
+ describe '.for_group' do
+ it 'returns the todos for a given group' do
+ group1 = create(:group)
+ group2 = create(:group)
+ todo = create(:todo, group: group1)
+
+ create(:todo, group: group2)
+
+ expect(described_class.for_group(group1)).to eq([todo])
+ end
+ end
+
+ describe '.for_type' do
+ it 'returns the todos for a given target type' do
+ todo = create(:todo, target: create(:issue))
+
+ create(:todo, target: create(:merge_request))
+
+ expect(described_class.for_type(Issue.name)).to eq([todo])
+ end
+ end
+
+ describe '.for_target' do
+ it 'returns the todos for a given target' do
+ todo = create(:todo, target: create(:issue))
+
+ create(:todo, target: create(:merge_request))
+
+ expect(described_class.for_target(todo.target)).to eq([todo])
+ end
+ end
+
+ describe '.for_commit' do
+ it 'returns the todos for a commit ID' do
+ todo = create(:todo, commit_id: '123')
+
+ create(:todo, commit_id: '456')
+
+ expect(described_class.for_commit('123')).to eq([todo])
+ end
+ end
+
+ describe '.for_group_and_descendants' do
+ it 'returns the todos for a group and its descendants' do
+ parent_group = create(:group)
+ child_group = create(:group, parent: parent_group)
+
+ todo1 = create(:todo, group: parent_group)
+ todo2 = create(:todo, group: child_group)
+ todos = described_class.for_group_and_descendants(parent_group)
+
+ expect(todos).to include(todo1)
+
+ # Nested groups only work on PostgreSQL, so on MySQL todo2 won't be
+ # present.
+ expect(todos).to include(todo2) if Gitlab::Database.postgresql?
+ end
+ end
+
+ describe '.any_for_target?' do
+ it 'returns true if there are todos for a given target' do
+ todo = create(:todo)
+
+ expect(described_class.any_for_target?(todo.target)).to eq(true)
+ end
+
+ it 'returns false if there are no todos for a given target' do
+ issue = create(:issue)
+
+ expect(described_class.any_for_target?(issue)).to eq(false)
+ end
+ end
+
+ describe '.update_state' do
+ it 'updates the state of todos' do
+ todo = create(:todo, :pending)
+ ids = described_class.update_state(:done)
+
+ todo.reload
+
+ expect(ids).to eq([todo.id])
+ expect(todo.state).to eq('done')
+ end
+
+ it 'does not update todos that already have the given state' do
+ create(:todo, :pending)
+
+ expect(described_class.update_state(:pending)).to be_empty
+ end
+ end
end
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index 36b8e5d304f..5a0df9fbbb0 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -21,7 +21,8 @@ describe Upload do
path: __FILE__,
size: described_class::CHECKSUM_THRESHOLD + 1.kilobyte,
model: build_stubbed(:user),
- uploader: double('ExampleUploader')
+ uploader: double('ExampleUploader'),
+ store: ObjectStorage::Store::LOCAL
)
expect(UploadChecksumWorker)
@@ -35,7 +36,8 @@ describe Upload do
path: __FILE__,
size: described_class::CHECKSUM_THRESHOLD,
model: build_stubbed(:user),
- uploader: double('ExampleUploader')
+ uploader: double('ExampleUploader'),
+ store: ObjectStorage::Store::LOCAL
)
expect { upload.save }
@@ -60,7 +62,7 @@ describe Upload do
describe '#absolute_path' do
it 'returns the path directly when already absolute' do
path = '/path/to/namespace/project/secret/file.jpg'
- upload = described_class.new(path: path)
+ upload = described_class.new(path: path, store: ObjectStorage::Store::LOCAL)
expect(upload).not_to receive(:uploader_class)
@@ -69,7 +71,7 @@ describe Upload do
it "delegates to the uploader's absolute_path method" do
uploader = spy('FakeUploader')
- upload = described_class.new(path: 'secret/file.jpg')
+ upload = described_class.new(path: 'secret/file.jpg', store: ObjectStorage::Store::LOCAL)
expect(upload).to receive(:uploader_class).and_return(uploader)
upload.absolute_path
@@ -81,7 +83,8 @@ describe Upload do
describe '#calculate_checksum!' do
let(:upload) do
described_class.new(path: __FILE__,
- size: described_class::CHECKSUM_THRESHOLD - 1.megabyte)
+ size: described_class::CHECKSUM_THRESHOLD - 1.megabyte,
+ store: ObjectStorage::Store::LOCAL)
end
it 'sets `checksum` to SHA256 sum of the file' do
@@ -91,7 +94,7 @@ describe Upload do
.to change { upload.checksum }.from(nil).to(expected)
end
- it 'sets `checksum` to nil for a non-existant file' do
+ it 'sets `checksum` to nil for a non-existent file' do
expect(upload).to receive(:exist?).and_return(false)
checksum = Digest::SHA256.file(__FILE__).hexdigest
@@ -104,15 +107,56 @@ describe Upload do
describe '#exist?' do
it 'returns true when the file exists' do
- upload = described_class.new(path: __FILE__)
+ upload = described_class.new(path: __FILE__, store: ObjectStorage::Store::LOCAL)
expect(upload).to exist
end
- it 'returns false when the file does not exist' do
- upload = described_class.new(path: "#{__FILE__}-nope")
+ context 'when the file does not exist' do
+ it 'returns false' do
+ upload = described_class.new(path: "#{__FILE__}-nope", store: ObjectStorage::Store::LOCAL)
- expect(upload).not_to exist
+ expect(upload).not_to exist
+ end
+
+ context 'when the record is persisted' do
+ it 'sends a message to Sentry' do
+ upload = create(:upload, :issuable_upload)
+
+ expect(Gitlab::Sentry).to receive(:enabled?).and_return(true)
+ expect(Raven).to receive(:capture_message).with("Upload file does not exist", extra: upload.attributes)
+
+ upload.exist?
+ end
+
+ it 'increments a metric counter to signal a problem' do
+ upload = create(:upload, :issuable_upload)
+
+ counter = double(:counter)
+ expect(counter).to receive(:increment)
+ expect(Gitlab::Metrics).to receive(:counter).with(:upload_file_does_not_exist_total, 'The number of times an upload record could not find its file').and_return(counter)
+
+ upload.exist?
+ end
+ end
+
+ context 'when the record is not persisted' do
+ it 'does not send a message to Sentry' do
+ upload = described_class.new(path: "#{__FILE__}-nope", store: ObjectStorage::Store::LOCAL)
+
+ expect(Raven).not_to receive(:capture_message)
+
+ upload.exist?
+ end
+
+ it 'does not increment a metric counter' do
+ upload = described_class.new(path: "#{__FILE__}-nope", store: ObjectStorage::Store::LOCAL)
+
+ expect(Gitlab::Metrics).not_to receive(:counter)
+
+ upload.exist?
+ end
+ end
end
end
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
new file mode 100644
index 00000000000..2898613545c
--- /dev/null
+++ b/spec/models/user_preference_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe UserPreference do
+ describe '#set_notes_filter' do
+ let(:issuable) { build_stubbed(:issue) }
+ let(:user_preference) { create(:user_preference) }
+
+ shared_examples 'setting system notes' do
+ it 'returns updated discussion filter' do
+ filter_name =
+ user_preference.set_notes_filter(filter, issuable)
+
+ expect(filter_name).to eq(filter)
+ end
+
+ it 'updates discussion filter for issuable class' do
+ user_preference.set_notes_filter(filter, issuable)
+
+ expect(user_preference.reload.issue_notes_filter).to eq(filter)
+ end
+ end
+
+ context 'when filter is set to all notes' do
+ let(:filter) { described_class::NOTES_FILTERS[:all_notes] }
+
+ it_behaves_like 'setting system notes'
+ end
+
+ context 'when filter is set to only comments' do
+ let(:filter) { described_class::NOTES_FILTERS[:only_comments] }
+
+ it_behaves_like 'setting system notes'
+ end
+
+ context 'when filter is set to only activity' do
+ let(:filter) { described_class::NOTES_FILTERS[:only_activity] }
+
+ it_behaves_like 'setting system notes'
+ end
+
+ context 'when notes_filter parameter is invalid' do
+ let(:only_comments) { described_class::NOTES_FILTERS[:only_comments] }
+
+ it 'returns the current notes filter' do
+ user_preference.set_notes_filter(only_comments, issuable)
+
+ expect(user_preference.set_notes_filter(9999, issuable)).to eq(only_comments)
+ end
+ end
+ end
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index f5e2c977104..733c1c49f08 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -167,6 +167,61 @@ describe User do
subject { build(:user).tap { |user| user.emails << build(:email, email: email_value) } }
end
+ describe '#commit_email' do
+ subject(:user) { create(:user) }
+
+ it 'defaults to the primary email' do
+ expect(user.email).to be_present
+ expect(user.commit_email).to eq(user.email)
+ end
+
+ it 'defaults to the primary email when the column in the database is null' do
+ user.update_column(:commit_email, nil)
+
+ found_user = described_class.find_by(id: user.id)
+
+ expect(found_user.commit_email).to eq(user.email)
+ end
+
+ it 'returns the private commit email when commit_email has _private' do
+ user.update_column(:commit_email, Gitlab::PrivateCommitEmail::TOKEN)
+
+ expect(user.commit_email).to eq(user.private_commit_email)
+ end
+
+ it 'can be set to a confirmed email' do
+ confirmed = create(:email, :confirmed, user: user)
+ user.commit_email = confirmed.email
+
+ expect(user).to be_valid
+ expect(user.commit_email).to eq(confirmed.email)
+ end
+
+ it 'can not be set to an unconfirmed email' do
+ unconfirmed = create(:email, user: user)
+ user.commit_email = unconfirmed.email
+
+ # This should set the commit_email attribute to the primary email
+ expect(user).to be_valid
+ expect(user.commit_email).to eq(user.email)
+ end
+
+ it 'can not be set to a non-existent email' do
+ user.commit_email = 'non-existent-email@nonexistent.nonexistent'
+
+ # This should set the commit_email attribute to the primary email
+ expect(user).to be_valid
+ expect(user.commit_email).to eq(user.email)
+ end
+
+ it 'can not be set to an invalid email, even if confirmed' do
+ confirmed = create(:email, :confirmed, :skip_validate, user: user, email: 'invalid')
+ user.commit_email = confirmed.email
+
+ expect(user).not_to be_valid
+ end
+ end
+
describe 'email' do
context 'when no signup domains whitelisted' do
before do
@@ -284,6 +339,40 @@ describe User do
expect(user).to be_valid
end
end
+
+ context 'set_commit_email' do
+ it 'keeps commit email when private commit email is being used' do
+ user = create(:user, commit_email: Gitlab::PrivateCommitEmail::TOKEN)
+
+ expect(user.read_attribute(:commit_email)).to eq(Gitlab::PrivateCommitEmail::TOKEN)
+ end
+
+ it 'keeps the commit email when nil' do
+ user = create(:user, commit_email: nil)
+
+ expect(user.read_attribute(:commit_email)).to be_nil
+ end
+
+ it 'reverts to nil when email is not verified' do
+ user = create(:user, commit_email: "foo@bar.com")
+
+ expect(user.read_attribute(:commit_email)).to be_nil
+ end
+ end
+
+ context 'owns_commit_email' do
+ it 'accepts private commit email' do
+ user = build(:user, commit_email: Gitlab::PrivateCommitEmail::TOKEN)
+
+ expect(user).to be_valid
+ end
+
+ it 'accepts nil commit email' do
+ user = build(:user, commit_email: nil)
+
+ expect(user).to be_valid
+ end
+ end
end
end
@@ -315,6 +404,14 @@ describe User do
expect(users_with_two_factor).to eq([user_with_2fa.id])
expect(users_with_two_factor).not_to include(user_without_2fa.id)
end
+
+ it 'works with ORDER BY' do
+ user_with_2fa = create(:user, :two_factor_via_otp, :two_factor_via_u2f)
+
+ expect(described_class
+ .with_two_factor
+ .reorder_by_name).to eq([user_with_2fa])
+ end
end
describe ".without_two_factor" do
@@ -346,17 +443,72 @@ describe User do
end
end
- describe '.todo_authors' do
- it 'filters users' do
- create :user
- user_2 = create :user
- user_3 = create :user
- current_user = create :user
- create(:todo, user: current_user, author: user_2, state: :done)
- create(:todo, user: current_user, author: user_3, state: :pending)
+ describe '.limit_to_todo_authors' do
+ context 'when filtering by todo authors' do
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+
+ before do
+ create(:todo, user: user1, author: user1, state: :done)
+ create(:todo, user: user2, author: user2, state: :pending)
+ end
+
+ it 'only returns users that have authored todos' do
+ users = described_class.limit_to_todo_authors(
+ user: user2,
+ with_todos: true,
+ todo_state: :pending
+ )
+
+ expect(users).to eq([user2])
+ end
+
+ it 'ignores users that do not have a todo in the matching state' do
+ users = described_class.limit_to_todo_authors(
+ user: user1,
+ with_todos: true,
+ todo_state: :pending
+ )
+
+ expect(users).to be_empty
+ end
+ end
+
+ context 'when not filtering by todo authors' do
+ it 'returns the input relation' do
+ user1 = create(:user)
+ user2 = create(:user)
+ rel = described_class.limit_to_todo_authors(user: user1)
+
+ expect(rel).to include(user1, user2)
+ end
+ end
+
+ context 'when no user is provided' do
+ it 'returns the input relation' do
+ user1 = create(:user)
+ user2 = create(:user)
+ rel = described_class.limit_to_todo_authors
+
+ expect(rel).to include(user1, user2)
+ end
+ end
+ end
+
+ describe '.by_username' do
+ it 'finds users regardless of the case passed' do
+ user = create(:user, username: 'CaMeLcAsEd')
+ user2 = create(:user, username: 'UPPERCASE')
+
+ expect(described_class.by_username(%w(CAMELCASED uppercase)))
+ .to contain_exactly(user, user2)
+ end
+
+ it 'finds a single user regardless of the case passed' do
+ user = create(:user, username: 'CaMeLcAsEd')
- expect(described_class.todo_authors(current_user.id, 'pending')).to eq [user_3]
- expect(described_class.todo_authors(current_user.id, 'done')).to eq [user_2]
+ expect(described_class.by_username('CAMELCASED'))
+ .to contain_exactly(user)
end
end
end
@@ -603,12 +755,29 @@ describe User do
end
end
+ describe 'ensure user preference' do
+ it 'has user preference upon user initialization' do
+ user = build(:user)
+
+ expect(user.user_preference).to be_present
+ expect(user.user_preference).not_to be_persisted
+ end
+ end
+
describe 'ensure incoming email token' do
it 'has incoming email token' do
user = create(:user)
expect(user.incoming_email_token).not_to be_blank
end
+
+ it 'uses SecureRandom to generate the incoming email token' do
+ expect(SecureRandom).to receive(:hex).and_return('3b8ca303')
+
+ user = create(:user)
+
+ expect(user.incoming_email_token).to eql('gitlab')
+ end
end
describe '#ensure_user_rights_and_limits' do
@@ -946,6 +1115,14 @@ describe User do
end
describe '.find_by_any_email' do
+ it 'finds user through private commit email' do
+ user = create(:user)
+ private_email = user.private_commit_email
+
+ expect(described_class.find_by_any_email(private_email)).to eq(user)
+ expect(described_class.find_by_any_email(private_email, confirmed: true)).to eq(user)
+ end
+
it 'finds by primary email' do
user = create(:user, email: 'foo@example.com')
@@ -953,6 +1130,13 @@ describe User do
expect(described_class.find_by_any_email(user.email, confirmed: true)).to eq user
end
+ it 'finds by uppercased email' do
+ user = create(:user, email: 'foo@example.com')
+
+ expect(described_class.find_by_any_email(user.email.upcase)).to eq user
+ expect(described_class.find_by_any_email(user.email.upcase, confirmed: true)).to eq user
+ end
+
it 'finds by secondary email' do
email = create(:email, email: 'foo@example.com')
user = email.user
@@ -990,6 +1174,22 @@ describe User do
expect(described_class.by_any_email(user.email, confirmed: true)).to eq([user])
end
+
+ it 'finds user through a private commit email' do
+ user = create(:user)
+ private_email = user.private_commit_email
+
+ expect(described_class.by_any_email(private_email)).to eq([user])
+ expect(described_class.by_any_email(private_email, confirmed: true)).to eq([user])
+ end
+
+ it 'finds user through a private commit email in an array' do
+ user = create(:user)
+ private_email = user.private_commit_email
+
+ expect(described_class.by_any_email([private_email])).to eq([user])
+ expect(described_class.by_any_email([private_email], confirmed: true)).to eq([user])
+ end
end
describe '.search' do
@@ -1317,7 +1517,12 @@ describe User do
email_unconfirmed = create :email, user: user
user.reload
- expect(user.all_emails).to match_array([user.email, email_unconfirmed.email, email_confirmed.email])
+ expect(user.all_emails).to contain_exactly(
+ user.email,
+ user.private_commit_email,
+ email_unconfirmed.email,
+ email_confirmed.email
+ )
end
end
@@ -1327,9 +1532,12 @@ describe User do
it 'returns only confirmed emails' do
email_confirmed = create :email, user: user, confirmed_at: Time.now
create :email, user: user
- user.reload
- expect(user.verified_emails).to match_array([user.email, email_confirmed.email])
+ expect(user.verified_emails).to contain_exactly(
+ user.email,
+ user.private_commit_email,
+ email_confirmed.email
+ )
end
end
@@ -1345,6 +1553,18 @@ describe User do
expect(user.verified_email?(email_confirmed.email.titlecase)).to be_truthy
end
+ it 'returns true when user is found through private commit email' do
+ expect(user.verified_email?(user.private_commit_email)).to be_truthy
+ end
+
+ it 'returns true for an outdated private commit email' do
+ old_email = user.private_commit_email
+
+ user.update!(username: 'changed-username')
+
+ expect(user.verified_email?(old_email)).to be_truthy
+ end
+
it 'returns false when the email is not verified/confirmed' do
email_unconfirmed = create :email, user: user
user.reload
@@ -1540,6 +1760,24 @@ describe User do
end
end
+ describe '.find_by_private_commit_email' do
+ context 'with email' do
+ set(:user) { create(:user) }
+
+ it 'returns user through private commit email' do
+ expect(described_class.find_by_private_commit_email(user.private_commit_email)).to eq(user)
+ end
+
+ it 'returns nil when email other than private_commit_email is used' do
+ expect(described_class.find_by_private_commit_email(user.email)).to be_nil
+ end
+ end
+
+ it 'returns nil when email is nil' do
+ expect(described_class.find_by_private_commit_email(nil)).to be_nil
+ end
+ end
+
describe '#sort_by_attribute' do
before do
described_class.delete_all
@@ -2432,6 +2670,34 @@ describe User do
end
end
+ describe '#assigned_open_merge_requests_count' do
+ it 'returns number of open merge requests from non-archived projects' do
+ user = create(:user)
+ project = create(:project, :public)
+ archived_project = create(:project, :public, :archived)
+
+ create(:merge_request, source_project: project, author: user, assignee: user)
+ create(:merge_request, :closed, source_project: project, author: user, assignee: user)
+ create(:merge_request, source_project: archived_project, author: user, assignee: user)
+
+ expect(user.assigned_open_merge_requests_count(force: true)).to eq 1
+ end
+ end
+
+ describe '#assigned_open_issues_count' do
+ it 'returns number of open issues from non-archived projects' do
+ user = create(:user)
+ project = create(:project, :public)
+ archived_project = create(:project, :public, :archived)
+
+ create(:issue, project: project, author: user, assignees: [user])
+ create(:issue, :closed, project: project, author: user, assignees: [user])
+ create(:issue, project: archived_project, author: user, assignees: [user])
+
+ expect(user.assigned_open_issues_count(force: true)).to eq 1
+ end
+ end
+
describe '#personal_projects_count' do
it 'returns the number of personal projects using a single query' do
user = build(:user)
@@ -2894,6 +3160,48 @@ describe User do
end
end
+ describe '#requires_usage_stats_consent?' do
+ let(:user) { create(:user, created_at: 8.days.ago) }
+
+ before do
+ allow(user).to receive(:has_current_license?).and_return false
+ end
+
+ context 'in single-user environment' do
+ it 'requires user consent after one week' do
+ create(:user, ghost: true)
+
+ expect(user.requires_usage_stats_consent?).to be true
+ end
+
+ it 'requires user consent after one week if there is another ghost user' do
+ expect(user.requires_usage_stats_consent?).to be true
+ end
+
+ it 'does not require consent in the first week' do
+ user.created_at = 6.days.ago
+
+ expect(user.requires_usage_stats_consent?).to be false
+ end
+
+ it 'does not require consent if usage stats were set by this user' do
+ allow(Gitlab::CurrentSettings).to receive(:usage_stats_set_by_user_id).and_return(user.id)
+
+ expect(user.requires_usage_stats_consent?).to be false
+ end
+ end
+
+ context 'in multi-user environment' do
+ before do
+ create(:user)
+ end
+
+ it 'does not require consent' do
+ expect(user.requires_usage_stats_consent?).to be false
+ end
+ end
+ end
+
context 'with uploads' do
it_behaves_like 'model with mounted uploader', false do
let(:model_object) { create(:user, :with_avatar) }
@@ -2901,4 +3209,86 @@ describe User do
let(:uploader_class) { AttachmentUploader }
end
end
+
+ describe '.union_with_user' do
+ context 'when no user ID is provided' do
+ it 'returns the input relation' do
+ user = create(:user)
+
+ expect(described_class.union_with_user).to eq([user])
+ end
+ end
+
+ context 'when a user ID is provided' do
+ it 'includes the user object in the returned relation' do
+ user1 = create(:user)
+ user2 = create(:user)
+ users = described_class.where(id: user1.id).union_with_user(user2.id)
+
+ expect(users).to include(user1)
+ expect(users).to include(user2)
+ end
+
+ it 'does not re-apply any WHERE conditions on the outer query' do
+ relation = described_class.where(id: 1).union_with_user(2)
+
+ expect(relation.arel.where_sql).to be_nil
+ end
+ end
+ end
+
+ describe '.optionally_search' do
+ context 'using nil as the argument' do
+ it 'returns the current relation' do
+ user = create(:user)
+
+ expect(described_class.optionally_search).to eq([user])
+ end
+ end
+
+ context 'using an empty String as the argument' do
+ it 'returns the current relation' do
+ user = create(:user)
+
+ expect(described_class.optionally_search('')).to eq([user])
+ end
+ end
+
+ context 'using a non-empty String' do
+ it 'returns users matching the search query' do
+ user1 = create(:user)
+ create(:user)
+
+ expect(described_class.optionally_search(user1.name)).to eq([user1])
+ end
+ end
+ end
+
+ describe '.where_not_in' do
+ context 'without an argument' do
+ it 'returns the current relation' do
+ user = create(:user)
+
+ expect(described_class.where_not_in).to eq([user])
+ end
+ end
+
+ context 'using a list of user IDs' do
+ it 'excludes the users from the returned relation' do
+ user1 = create(:user)
+ user2 = create(:user)
+
+ expect(described_class.where_not_in([user2.id])).to eq([user1])
+ end
+ end
+ end
+
+ describe '.reorder_by_name' do
+ it 'reorders the input relation' do
+ user1 = create(:user, name: 'A')
+ user2 = create(:user, name: 'B')
+
+ expect(described_class.reorder_by_name).to eq([user1, user2])
+ end
+ end
end
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 63850939be1..b87a2d871e5 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -77,7 +77,7 @@ describe WikiPage do
end
describe "#initialize" do
- context "when initialized with an existing gollum page" do
+ context "when initialized with an existing page" do
before do
create_page("test page", "test content")
@page = wiki.wiki.page(title: "test page")
@@ -126,23 +126,34 @@ describe WikiPage do
end
end
- before do
- @wiki_attr = { title: "Index", content: "Home Page", format: "markdown" }
- end
-
describe "#create" do
+ let(:wiki_attr) do
+ {
+ title: "Index",
+ content: "Home Page",
+ format: "markdown",
+ message: 'Custom Commit Message'
+ }
+ end
+
after do
destroy_page("Index")
end
context "with valid attributes" do
it "saves the wiki page" do
- subject.create(@wiki_attr)
+ subject.create(wiki_attr)
expect(wiki.find_page("Index")).not_to be_nil
end
it "returns true" do
- expect(subject.create(@wiki_attr)).to eq(true)
+ expect(subject.create(wiki_attr)).to eq(true)
+ end
+
+ it 'saves the wiki page with message' do
+ subject.create(wiki_attr)
+
+ expect(wiki.find_page("Index").message).to eq 'Custom Commit Message'
end
end
end
@@ -457,6 +468,12 @@ describe WikiPage do
end
describe '#historical?' do
+ let(:page) { wiki.find_page('Update') }
+ let(:old_version) { page.versions.last.id }
+ let(:old_page) { wiki.find_page('Update', old_version) }
+ let(:latest_version) { page.versions.first.id }
+ let(:latest_page) { wiki.find_page('Update', latest_version) }
+
before do
create_page('Update', 'content')
@page = wiki.find_page('Update')
@@ -468,23 +485,27 @@ describe WikiPage do
end
it 'returns true when requesting an old version' do
- old_version = @page.versions.last.id
- old_page = wiki.find_page('Update', old_version)
-
- expect(old_page.historical?).to eq true
+ expect(old_page.historical?).to be_truthy
end
it 'returns false when requesting latest version' do
- latest_version = @page.versions.first.id
- latest_page = wiki.find_page('Update', latest_version)
-
- expect(latest_page.historical?).to eq false
+ expect(latest_page.historical?).to be_falsy
end
it 'returns false when version is nil' do
- latest_page = wiki.find_page('Update', nil)
+ expect(latest_page.historical?).to be_falsy
+ end
+
+ it 'returns false when the last version is nil' do
+ expect(old_page).to receive(:last_version) { nil }
+
+ expect(old_page.historical?).to be_falsy
+ end
+
+ it 'returns false when the version is nil' do
+ expect(old_page).to receive(:version) { nil }
- expect(latest_page.historical?).to eq false
+ expect(old_page.historical?).to be_falsy
end
end
diff --git a/spec/policies/ci/pipeline_policy_spec.rb b/spec/policies/ci/pipeline_policy_spec.rb
index bd32faf06ef..8022f61e67d 100644
--- a/spec/policies/ci/pipeline_policy_spec.rb
+++ b/spec/policies/ci/pipeline_policy_spec.rb
@@ -74,5 +74,23 @@ describe Ci::PipelinePolicy, :models do
expect(policy).to be_allowed :update_pipeline
end
end
+
+ describe 'destroy_pipeline' do
+ let(:project) { create(:project, :public) }
+
+ context 'when user has owner access' do
+ let(:user) { project.owner }
+
+ it 'is enabled' do
+ expect(policy).to be_allowed :destroy_pipeline
+ end
+ end
+
+ context 'when user is not owner' do
+ it 'is disabled' do
+ expect(policy).not_to be_allowed :destroy_pipeline
+ end
+ end
+ end
end
end
diff --git a/spec/policies/clusters/cluster_policy_spec.rb b/spec/policies/clusters/cluster_policy_spec.rb
index ced969830d8..b2f0ca1bc30 100644
--- a/spec/policies/clusters/cluster_policy_spec.rb
+++ b/spec/policies/clusters/cluster_policy_spec.rb
@@ -24,5 +24,47 @@ describe Clusters::ClusterPolicy, :models do
it { expect(policy).to be_allowed :update_cluster }
it { expect(policy).to be_allowed :admin_cluster }
end
+
+ context 'group cluster' do
+ let(:cluster) { create(:cluster, :group) }
+ let(:group) { cluster.group }
+ let(:project) { create(:project, namespace: group) }
+
+ context 'when group developer' do
+ before do
+ group.add_developer(user)
+ end
+
+ it { expect(policy).to be_disallowed :update_cluster }
+ it { expect(policy).to be_disallowed :admin_cluster }
+ end
+
+ context 'when group maintainer' do
+ before do
+ group.add_maintainer(user)
+ end
+
+ it { expect(policy).to be_allowed :update_cluster }
+ it { expect(policy).to be_allowed :admin_cluster }
+ end
+
+ context 'when project maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { expect(policy).to be_disallowed :update_cluster }
+ it { expect(policy).to be_disallowed :admin_cluster }
+ end
+
+ context 'when project developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it { expect(policy).to be_disallowed :update_cluster }
+ it { expect(policy).to be_disallowed :admin_cluster }
+ end
+ end
end
end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index 35951251bc5..9d0093e8159 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -17,11 +17,15 @@ describe GroupPolicy do
let(:reporter_permissions) { [:admin_label] }
- let(:developer_permissions) { [:admin_milestones] }
+ let(:developer_permissions) { [:admin_milestone] }
let(:maintainer_permissions) do
[
- :create_projects
+ :create_projects,
+ :read_cluster,
+ :create_cluster,
+ :update_cluster,
+ :admin_cluster
]
end
@@ -31,6 +35,7 @@ describe GroupPolicy do
:admin_namespace,
:admin_group_member,
:change_visibility_level,
+ :set_note_created_at,
(Gitlab::Database.postgresql? ? :create_subgroup : nil)
].compact
end
@@ -205,7 +210,7 @@ describe GroupPolicy do
nested_group.add_guest(developer)
nested_group.add_guest(maintainer)
- group.owners.destroy_all
+ group.owners.destroy_all # rubocop: disable DestroyAll
group.add_guest(owner)
nested_group.add_owner(owner)
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 793b724bfca..008d118b557 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -112,6 +112,7 @@ describe IssuePolicy do
let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
let(:issue_no_assignee) { create(:issue, project: project) }
+ let(:issue_locked) { create(:issue, :locked, project: project, author: author, assignees: [assignee]) }
before do
project.add_guest(guest)
@@ -124,36 +125,49 @@ describe IssuePolicy do
it 'allows guests to read issues' do
expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid)
- expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue)
+ expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue)
expect(permissions(guest, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
- expect(permissions(guest, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue)
+ expect(permissions(guest, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue)
+
+ expect(permissions(guest, issue_locked)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(guest, issue_locked)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue)
end
- it 'allows reporters to read, update, and admin issues' do
- expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
- expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ it 'allows reporters to read, update, reopen, and admin issues' do
+ expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue)
+ expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue)
+ expect(permissions(reporter, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ expect(permissions(reporter, issue_locked)).to be_disallowed(:reopen_issue)
end
- it 'allows reporters from group links to read, update, and admin issues' do
- expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
- expect(permissions(reporter_from_group_link, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ it 'allows reporters from group links to read, update, reopen and admin issues' do
+ expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue)
+ expect(permissions(reporter_from_group_link, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue)
+ expect(permissions(reporter_from_group_link, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ expect(permissions(reporter_from_group_link, issue_locked)).to be_disallowed(:reopen_issue)
end
- it 'allows issue authors to read and update their issues' do
- expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ it 'allows issue authors to read, reopen and update their issues' do
+ expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue)
expect(permissions(author, issue)).to be_disallowed(:admin_issue)
expect(permissions(author, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
- expect(permissions(author, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue)
+ expect(permissions(author, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue)
+
+ expect(permissions(author, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(author, issue_locked)).to be_disallowed(:admin_issue, :reopen_issue)
end
- it 'allows issue assignees to read and update their issues' do
- expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ it 'allows issue assignees to read, reopen and update their issues' do
+ expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue)
expect(permissions(assignee, issue)).to be_disallowed(:admin_issue)
expect(permissions(assignee, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
- expect(permissions(assignee, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue)
+ expect(permissions(assignee, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue)
+
+ expect(permissions(assignee, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(assignee, issue_locked)).to be_disallowed(:admin_issue, :reopen_issue)
end
context 'with confidential issues' do
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index dd3fa4e6a51..d6bc67a9d70 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -64,6 +64,7 @@ describe ProjectPolicy do
%i[
change_namespace change_visibility_level rename_project remove_project
archive_project remove_fork_project destroy_merge_request destroy_issue
+ set_issue_iid set_issue_created_at set_note_created_at
]
end
@@ -162,7 +163,7 @@ describe ProjectPolicy do
:create_build, :read_build, :update_build, :admin_build, :destroy_build,
:create_pipeline_schedule, :read_pipeline_schedule, :update_pipeline_schedule, :admin_pipeline_schedule, :destroy_pipeline_schedule,
:create_environment, :read_environment, :update_environment, :admin_environment, :destroy_environment,
- :create_cluster, :read_cluster, :update_cluster, :admin_cluster, :destroy_cluster,
+ :create_cluster, :read_cluster, :update_cluster, :admin_cluster,
:create_deployment, :read_deployment, :update_deployment, :admin_deployment, :destroy_deployment
]
@@ -181,7 +182,7 @@ describe ProjectPolicy do
:create_build, :read_build, :update_build, :admin_build, :destroy_build,
:create_pipeline_schedule, :read_pipeline_schedule, :update_pipeline_schedule, :admin_pipeline_schedule, :destroy_pipeline_schedule,
:create_environment, :read_environment, :update_environment, :admin_environment, :destroy_environment,
- :create_cluster, :read_cluster, :update_cluster, :admin_cluster, :destroy_cluster,
+ :create_cluster, :read_cluster, :update_cluster, :admin_cluster,
:create_deployment, :read_deployment, :update_deployment, :admin_deployment, :destroy_deployment
]
diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb
new file mode 100644
index 00000000000..e85e7a41017
--- /dev/null
+++ b/spec/presenters/blob_presenter_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe BlobPresenter, :seed_helper do
+ let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+
+ let(:git_blob) do
+ Gitlab::Git::Blob.find(
+ repository,
+ 'fa1b1e6c004a68b7d8763b86455da9e6b23e36d6',
+ 'files/ruby/regex.rb'
+ )
+ end
+ let(:blob) { Blob.new(git_blob) }
+
+ describe '#highlight' do
+ subject { described_class.new(blob) }
+
+ it 'returns highlighted content' do
+ expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: nil, language: nil)
+
+ subject.highlight
+ end
+
+ it 'returns plain content when :plain is true' do
+ expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: true, language: nil)
+
+ subject.highlight(plain: true)
+ end
+
+ context 'gitlab-language contains a match' do
+ before do
+ allow(blob).to receive(:language_from_gitattributes).and_return('ruby')
+ end
+
+ it 'passes language to inner call' do
+ expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: nil, language: 'ruby')
+
+ subject.highlight
+ end
+ end
+ end
+end
diff --git a/spec/presenters/ci/build_presenter_spec.rb b/spec/presenters/ci/build_presenter_spec.rb
index 6dfaa3b72f7..676835b3880 100644
--- a/spec/presenters/ci/build_presenter_spec.rb
+++ b/spec/presenters/ci/build_presenter_spec.rb
@@ -78,7 +78,7 @@ describe Ci::BuildPresenter do
it 'returns the reason of failure' do
status_title = presenter.status_title
- expect(status_title).to eq('Failed <br> (unknown failure)')
+ expect(status_title).to eq('Failed - (unknown failure)')
end
end
@@ -89,7 +89,7 @@ describe Ci::BuildPresenter do
status_title = presenter.status_title
expect(status_title).not_to include('(retried)')
- expect(status_title).to eq('Failed <br> (unknown failure)')
+ expect(status_title).to eq('Failed - (unknown failure)')
end
end
@@ -99,7 +99,7 @@ describe Ci::BuildPresenter do
it 'returns the reason of failure' do
status_title = presenter.status_title
- expect(status_title).to eq('Failed <br> (unknown failure)')
+ expect(status_title).to eq('Failed - (unknown failure)')
end
end
@@ -173,7 +173,7 @@ describe Ci::BuildPresenter do
it 'returns the reason of failure' do
tooltip = subject.tooltip_message
- expect(tooltip).to eq("#{build.name} - failed <br> (script failure)")
+ expect(tooltip).to eq("#{build.name} - failed - (script failure)")
end
end
@@ -183,7 +183,7 @@ describe Ci::BuildPresenter do
it 'should include the reason of failure and the retried title' do
tooltip = subject.tooltip_message
- expect(tooltip).to eq("#{build.name} - failed <br> (script failure) (retried)")
+ expect(tooltip).to eq("#{build.name} - failed - (script failure) (retried)")
end
end
@@ -193,7 +193,7 @@ describe Ci::BuildPresenter do
it 'should include the reason of failure' do
tooltip = subject.tooltip_message
- expect(tooltip).to eq("#{build.name} - failed <br> (script failure) (allowed to fail)")
+ expect(tooltip).to eq("#{build.name} - failed - (script failure) (allowed to fail)")
end
end
@@ -218,6 +218,42 @@ describe Ci::BuildPresenter do
end
end
+ describe '#execute_in' do
+ subject { presenter.execute_in }
+
+ context 'when build is scheduled' do
+ context 'when schedule is not expired' do
+ let(:build) { create(:ci_build, :scheduled) }
+
+ it 'returns execution time' do
+ Timecop.freeze do
+ is_expected.to be_like_time(60.0)
+ end
+ end
+ end
+
+ context 'when schedule is expired' do
+ let(:build) { create(:ci_build, :expired_scheduled) }
+
+ it 'returns execution time' do
+ Timecop.freeze do
+ is_expected.to eq(0)
+ end
+ end
+ end
+ end
+
+ context 'when build is not delayed' do
+ let(:build) { create(:ci_build) }
+
+ it 'does not return execution time' do
+ Timecop.freeze do
+ is_expected.to be_falsy
+ end
+ end
+ end
+ end
+
describe '#callout_failure_message' do
let(:build) { create(:ci_build, :failed, :api_failure) }
@@ -231,7 +267,7 @@ describe Ci::BuildPresenter do
let(:build) { create(:ci_build, :failed, :script_failure) }
context 'when is a script or missing dependency failure' do
- let(:failure_reasons) { %w(script_failure missing_dependency_failure) }
+ let(:failure_reasons) { %w(script_failure missing_dependency_failure archived_failure) }
it 'should return false' do
failure_reasons.each do |failure_reason|
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index e7019b990dd..170e0ac5717 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -3,7 +3,6 @@ require 'spec_helper'
describe Ci::BuildRunnerPresenter do
let(:presenter) { described_class.new(build) }
let(:archive) { { paths: ['sample.txt'] } }
- let(:junit) { { junit: ['junit.xml'] } }
let(:archive_expectation) do
{
@@ -14,16 +13,6 @@ describe Ci::BuildRunnerPresenter do
}
end
- let(:junit_expectation) do
- {
- name: 'junit.xml',
- artifact_type: :junit,
- artifact_format: :gzip,
- paths: ['junit.xml'],
- when: 'always'
- }
- end
-
describe '#artifacts' do
context "when option contains archive-type artifacts" do
let(:build) { create(:ci_build, options: { artifacts: archive } ) }
@@ -49,20 +38,46 @@ describe Ci::BuildRunnerPresenter do
end
end
- context "when option has 'junit' keyword" do
- let(:build) { create(:ci_build, options: { artifacts: { reports: junit } } ) }
-
- it 'presents correct hash' do
- expect(presenter.artifacts.first).to include(junit_expectation)
+ context "with reports" do
+ Ci::JobArtifact::DEFAULT_FILE_NAMES.each do |file_type, filename|
+ context file_type.to_s do
+ let(:report) { { "#{file_type}": [filename] } }
+ let(:build) { create(:ci_build, options: { artifacts: { reports: report } } ) }
+
+ let(:report_expectation) do
+ {
+ name: filename,
+ artifact_type: :"#{file_type}",
+ artifact_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(file_type),
+ paths: [filename],
+ when: 'always'
+ }
+ end
+
+ it 'presents correct hash' do
+ expect(presenter.artifacts.first).to include(report_expectation)
+ end
+ end
end
end
context "when option has both archive and reports specification" do
- let(:build) { create(:ci_build, options: { script: 'echo', artifacts: { **archive, reports: junit } } ) }
+ let(:report) { { junit: ['junit.xml'] } }
+ let(:build) { create(:ci_build, options: { script: 'echo', artifacts: { **archive, reports: report } } ) }
+
+ let(:report_expectation) do
+ {
+ name: 'junit.xml',
+ artifact_type: :junit,
+ artifact_format: :gzip,
+ paths: ['junit.xml'],
+ when: 'always'
+ }
+ end
it 'presents correct hash' do
expect(presenter.artifacts.first).to include(archive_expectation)
- expect(presenter.artifacts.second).to include(junit_expectation)
+ expect(presenter.artifacts.second).to include(report_expectation)
end
context "when archive specifies 'expire_in' keyword" do
@@ -70,7 +85,7 @@ describe Ci::BuildRunnerPresenter do
it 'inherits expire_in from archive' do
expect(presenter.artifacts.first).to include({ **archive_expectation, expire_in: '3 mins 4 sec' })
- expect(presenter.artifacts.second).to include({ **junit_expectation, expire_in: '3 mins 4 sec' })
+ expect(presenter.artifacts.second).to include({ **report_expectation, expire_in: '3 mins 4 sec' })
end
end
end
diff --git a/spec/presenters/clusterable_presenter_spec.rb b/spec/presenters/clusterable_presenter_spec.rb
new file mode 100644
index 00000000000..4f4ae5e07c5
--- /dev/null
+++ b/spec/presenters/clusterable_presenter_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ClusterablePresenter do
+ include Gitlab::Routing.url_helpers
+
+ describe '.fabricate' do
+ let(:project) { create(:project) }
+
+ subject { described_class.fabricate(project) }
+
+ it 'creates an object from a descendant presenter' do
+ expect(subject).to be_kind_of(ProjectClusterablePresenter)
+ end
+ end
+end
diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb
index e96dbfb73c0..72c5eac3ede 100644
--- a/spec/presenters/clusters/cluster_presenter_spec.rb
+++ b/spec/presenters/clusters/cluster_presenter_spec.rb
@@ -1,7 +1,9 @@
require 'spec_helper'
describe Clusters::ClusterPresenter do
- let(:cluster) { create(:cluster, :provided_by_gcp) }
+ include Gitlab::Routing.url_helpers
+
+ let(:cluster) { create(:cluster, :provided_by_gcp, :project) }
subject(:presenter) do
described_class.new(cluster)
@@ -71,4 +73,21 @@ describe Clusters::ClusterPresenter do
it { is_expected.to eq(false) }
end
end
+
+ describe '#show_path' do
+ subject { described_class.new(cluster).show_path }
+
+ context 'project_type cluster' do
+ let(:project) { cluster.project }
+
+ it { is_expected.to eq(project_cluster_path(project, cluster)) }
+ end
+
+ context 'group_type cluster' do
+ let(:group) { cluster.group }
+ let(:cluster) { create(:cluster, :provided_by_gcp, :group) }
+
+ it { is_expected.to eq(group_cluster_path(group, cluster)) }
+ end
+ end
end
diff --git a/spec/presenters/group_clusterable_presenter_spec.rb b/spec/presenters/group_clusterable_presenter_spec.rb
new file mode 100644
index 00000000000..205160742bf
--- /dev/null
+++ b/spec/presenters/group_clusterable_presenter_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe GroupClusterablePresenter do
+ include Gitlab::Routing.url_helpers
+
+ let(:presenter) { described_class.new(group) }
+ let(:cluster) { create(:cluster, :provided_by_gcp, :group) }
+ let(:group) { cluster.group }
+
+ describe '#can_create_cluster?' do
+ let(:user) { create(:user) }
+
+ subject { presenter.can_create_cluster? }
+
+ before do
+ allow(presenter).to receive(:current_user).and_return(user)
+ end
+
+ context 'when user can create' do
+ before do
+ group.add_maintainer(user)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user cannot create' do
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#index_path' do
+ subject { presenter.index_path }
+
+ it { is_expected.to eq(group_clusters_path(group)) }
+ end
+
+ describe '#new_path' do
+ subject { presenter.new_path }
+
+ it { is_expected.to eq(new_group_cluster_path(group)) }
+ end
+
+ describe '#create_user_clusters_path' do
+ subject { presenter.create_user_clusters_path }
+
+ it { is_expected.to eq(create_user_group_clusters_path(group)) }
+ end
+
+ describe '#create_gcp_clusters_path' do
+ subject { presenter.create_gcp_clusters_path }
+
+ it { is_expected.to eq(create_gcp_group_clusters_path(group)) }
+ end
+
+ describe '#cluster_status_cluster_path' do
+ subject { presenter.cluster_status_cluster_path(cluster) }
+
+ it { is_expected.to eq(cluster_status_group_cluster_path(group, cluster)) }
+ end
+
+ describe '#install_applications_cluster_path' do
+ let(:application) { :helm }
+
+ subject { presenter.install_applications_cluster_path(cluster, application) }
+
+ it { is_expected.to eq(install_applications_group_cluster_path(group, cluster, application)) }
+ end
+
+ describe '#cluster_path' do
+ subject { presenter.cluster_path(cluster) }
+
+ it { is_expected.to eq(group_cluster_path(group, cluster)) }
+ end
+end
diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb
index a1b52d8692d..bafcddebbb7 100644
--- a/spec/presenters/merge_request_presenter_spec.rb
+++ b/spec/presenters/merge_request_presenter_spec.rb
@@ -403,6 +403,15 @@ describe MergeRequestPresenter do
is_expected
.to eq("<a href=\"/#{resource.source_project.full_path}/tree/#{resource.source_branch}\">#{resource.source_branch}</a>")
end
+
+ it 'escapes html, when source_branch does not exist' do
+ xss_attempt = "<img src='x' onerror=alert('bad stuff') />"
+
+ allow(resource).to receive(:source_branch) { xss_attempt }
+ allow(resource).to receive(:source_branch_exists?) { false }
+
+ is_expected.to eq(ERB::Util.html_escape(xss_attempt))
+ end
end
describe '#rebase_path' do
diff --git a/spec/presenters/project_clusterable_presenter_spec.rb b/spec/presenters/project_clusterable_presenter_spec.rb
new file mode 100644
index 00000000000..c50d90ae1e8
--- /dev/null
+++ b/spec/presenters/project_clusterable_presenter_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ProjectClusterablePresenter do
+ include Gitlab::Routing.url_helpers
+
+ let(:presenter) { described_class.new(project) }
+ let(:project) { create(:project) }
+ let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
+
+ describe '#can_create_cluster?' do
+ let(:user) { create(:user) }
+
+ subject { presenter.can_create_cluster? }
+
+ before do
+ allow(presenter).to receive(:current_user).and_return(user)
+ end
+
+ context 'when user can create' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user cannot create' do
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#index_path' do
+ subject { presenter.index_path }
+
+ it { is_expected.to eq(project_clusters_path(project)) }
+ end
+
+ describe '#new_path' do
+ subject { presenter.new_path }
+
+ it { is_expected.to eq(new_project_cluster_path(project)) }
+ end
+
+ describe '#create_user_clusters_path' do
+ subject { presenter.create_user_clusters_path }
+
+ it { is_expected.to eq(create_user_project_clusters_path(project)) }
+ end
+
+ describe '#create_gcp_clusters_path' do
+ subject { presenter.create_gcp_clusters_path }
+
+ it { is_expected.to eq(create_gcp_project_clusters_path(project)) }
+ end
+
+ describe '#cluster_status_cluster_path' do
+ subject { presenter.cluster_status_cluster_path(cluster) }
+
+ it { is_expected.to eq(cluster_status_project_cluster_path(project, cluster)) }
+ end
+
+ describe '#install_applications_cluster_path' do
+ let(:application) { :helm }
+
+ subject { presenter.install_applications_cluster_path(cluster, application) }
+
+ it { is_expected.to eq(install_applications_project_cluster_path(project, cluster, application)) }
+ end
+
+ describe '#cluster_path' do
+ subject { presenter.cluster_path(cluster) }
+
+ it { is_expected.to eq(project_cluster_path(project, cluster)) }
+ end
+end
diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb
index 01085dbcb49..7b0192fa9c8 100644
--- a/spec/presenters/project_presenter_spec.rb
+++ b/spec/presenters/project_presenter_spec.rb
@@ -159,39 +159,76 @@ describe ProjectPresenter do
end
end
+ context 'statistics anchors (empty repo)' do
+ let(:project) { create(:project, :empty_repo) }
+ let(:presenter) { described_class.new(project, current_user: user) }
+
+ describe '#files_anchor_data' do
+ it 'returns files data' do
+ expect(presenter.files_anchor_data).to have_attributes(enabled: true,
+ label: 'Files (0 Bytes)',
+ link: nil)
+ end
+ end
+
+ describe '#commits_anchor_data' do
+ it 'returns commits data' do
+ expect(presenter.commits_anchor_data).to have_attributes(enabled: true,
+ label: 'Commits (0)',
+ link: nil)
+ end
+ end
+
+ describe '#branches_anchor_data' do
+ it 'returns branches data' do
+ expect(presenter.branches_anchor_data).to have_attributes(enabled: true,
+ label: "Branches (0)",
+ link: nil)
+ end
+ end
+
+ describe '#tags_anchor_data' do
+ it 'returns tags data' do
+ expect(presenter.tags_anchor_data).to have_attributes(enabled: true,
+ label: "Tags (0)",
+ link: nil)
+ end
+ end
+ end
+
context 'statistics anchors' do
let(:project) { create(:project, :repository) }
let(:presenter) { described_class.new(project, current_user: user) }
describe '#files_anchor_data' do
it 'returns files data' do
- expect(presenter.files_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Files (0 Bytes)',
- link: presenter.project_tree_path(project)))
+ expect(presenter.files_anchor_data).to have_attributes(enabled: true,
+ label: 'Files (0 Bytes)',
+ link: presenter.project_tree_path(project))
end
end
describe '#commits_anchor_data' do
it 'returns commits data' do
- expect(presenter.commits_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Commits (0)',
- link: presenter.project_commits_path(project, project.repository.root_ref)))
+ expect(presenter.commits_anchor_data).to have_attributes(enabled: true,
+ label: 'Commits (0)',
+ link: presenter.project_commits_path(project, project.repository.root_ref))
end
end
describe '#branches_anchor_data' do
it 'returns branches data' do
- expect(presenter.branches_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: "Branches (#{project.repository.branches.size})",
- link: presenter.project_branches_path(project)))
+ expect(presenter.branches_anchor_data).to have_attributes(enabled: true,
+ label: "Branches (#{project.repository.branches.size})",
+ link: presenter.project_branches_path(project))
end
end
describe '#tags_anchor_data' do
it 'returns tags data' do
- expect(presenter.tags_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: "Tags (#{project.repository.tags.size})",
- link: presenter.project_tags_path(project)))
+ expect(presenter.tags_anchor_data).to have_attributes(enabled: true,
+ label: "Tags (#{project.repository.tags.size})",
+ link: presenter.project_tags_path(project))
end
end
@@ -199,10 +236,10 @@ describe ProjectPresenter do
it 'returns new file data if user can push' do
project.add_developer(user)
- expect(presenter.new_file_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: "New file",
- link: presenter.project_new_blob_path(project, 'master'),
- class_modifier: 'new'))
+ expect(presenter.new_file_anchor_data).to have_attributes(enabled: false,
+ label: "New file",
+ link: presenter.project_new_blob_path(project, 'master'),
+ class_modifier: 'success')
end
it 'returns nil if user cannot push' do
@@ -227,9 +264,9 @@ describe ProjectPresenter do
project.add_developer(user)
allow(project.repository).to receive(:readme).and_return(nil)
- expect(presenter.readme_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Add Readme',
- link: presenter.add_readme_path))
+ expect(presenter.readme_anchor_data).to have_attributes(enabled: false,
+ label: 'Add Readme',
+ link: presenter.add_readme_path)
end
end
@@ -237,9 +274,9 @@ describe ProjectPresenter do
it 'returns anchor data' do
allow(project.repository).to receive(:readme).and_return(double(name: 'readme'))
- expect(presenter.readme_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Readme',
- link: presenter.readme_path))
+ expect(presenter.readme_anchor_data).to have_attributes(enabled: true,
+ label: 'Readme',
+ link: presenter.readme_path)
end
end
end
@@ -250,9 +287,9 @@ describe ProjectPresenter do
project.add_developer(user)
allow(project.repository).to receive(:changelog).and_return(nil)
- expect(presenter.changelog_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Add Changelog',
- link: presenter.add_changelog_path))
+ expect(presenter.changelog_anchor_data).to have_attributes(enabled: false,
+ label: 'Add Changelog',
+ link: presenter.add_changelog_path)
end
end
@@ -260,9 +297,9 @@ describe ProjectPresenter do
it 'returns anchor data' do
allow(project.repository).to receive(:changelog).and_return(double(name: 'foo'))
- expect(presenter.changelog_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Changelog',
- link: presenter.changelog_path))
+ expect(presenter.changelog_anchor_data).to have_attributes(enabled: true,
+ label: 'Changelog',
+ link: presenter.changelog_path)
end
end
end
@@ -273,9 +310,9 @@ describe ProjectPresenter do
project.add_developer(user)
allow(project.repository).to receive(:license_blob).and_return(nil)
- expect(presenter.license_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Add License',
- link: presenter.add_license_path))
+ expect(presenter.license_anchor_data).to have_attributes(enabled: false,
+ label: 'Add license',
+ link: presenter.add_license_path)
end
end
@@ -283,9 +320,9 @@ describe ProjectPresenter do
it 'returns anchor data' do
allow(project.repository).to receive(:license_blob).and_return(double(name: 'foo'))
- expect(presenter.license_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: presenter.license_short_name,
- link: presenter.license_path))
+ expect(presenter.license_anchor_data).to have_attributes(enabled: true,
+ label: presenter.license_short_name,
+ link: presenter.license_path)
end
end
end
@@ -296,9 +333,9 @@ describe ProjectPresenter do
project.add_developer(user)
allow(project.repository).to receive(:contribution_guide).and_return(nil)
- expect(presenter.contribution_guide_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Add Contribution guide',
- link: presenter.add_contribution_guide_path))
+ expect(presenter.contribution_guide_anchor_data).to have_attributes(enabled: false,
+ label: 'Add Contribution guide',
+ link: presenter.add_contribution_guide_path)
end
end
@@ -306,9 +343,9 @@ describe ProjectPresenter do
it 'returns anchor data' do
allow(project.repository).to receive(:contribution_guide).and_return(double(name: 'foo'))
- expect(presenter.contribution_guide_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Contribution guide',
- link: presenter.contribution_guide_path))
+ expect(presenter.contribution_guide_anchor_data).to have_attributes(enabled: true,
+ label: 'Contribution guide',
+ link: presenter.contribution_guide_path)
end
end
end
@@ -318,9 +355,9 @@ describe ProjectPresenter do
it 'returns anchor data' do
allow(project).to receive(:auto_devops_enabled?).and_return(true)
- expect(presenter.autodevops_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Auto DevOps enabled',
- link: nil))
+ expect(presenter.autodevops_anchor_data).to have_attributes(enabled: true,
+ label: 'Auto DevOps enabled',
+ link: nil)
end
end
@@ -330,9 +367,9 @@ describe ProjectPresenter do
allow(project).to receive(:auto_devops_enabled?).and_return(false)
allow(project.repository).to receive(:gitlab_ci_yml).and_return(nil)
- expect(presenter.autodevops_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Enable Auto DevOps',
- link: presenter.project_settings_ci_cd_path(project, anchor: 'autodevops-settings')))
+ expect(presenter.autodevops_anchor_data).to have_attributes(enabled: false,
+ label: 'Enable Auto DevOps',
+ link: presenter.project_settings_ci_cd_path(project, anchor: 'autodevops-settings'))
end
end
end
@@ -343,9 +380,9 @@ describe ProjectPresenter do
project.add_maintainer(user)
cluster = create(:cluster, projects: [project])
- expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Kubernetes configured',
- link: presenter.project_cluster_path(project, cluster)))
+ expect(presenter.kubernetes_cluster_anchor_data).to have_attributes(enabled: true,
+ label: 'Kubernetes configured',
+ link: presenter.project_cluster_path(project, cluster))
end
it 'returns link to clusters page if more than one exists' do
@@ -353,17 +390,17 @@ describe ProjectPresenter do
create(:cluster, :production_environment, projects: [project])
create(:cluster, projects: [project])
- expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: true,
- label: 'Kubernetes configured',
- link: presenter.project_clusters_path(project)))
+ expect(presenter.kubernetes_cluster_anchor_data).to have_attributes(enabled: true,
+ label: 'Kubernetes configured',
+ link: presenter.project_clusters_path(project))
end
it 'returns link to create a cluster if no cluster exists' do
project.add_maintainer(user)
- expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Add Kubernetes cluster',
- link: presenter.new_project_cluster_path(project)))
+ expect(presenter.kubernetes_cluster_anchor_data).to have_attributes(enabled: false,
+ label: 'Add Kubernetes cluster',
+ link: presenter.new_project_cluster_path(project))
end
end
@@ -373,36 +410,5 @@ describe ProjectPresenter do
end
end
end
-
- describe '#koding_anchor_data' do
- it 'returns link to setup Koding if user can push and no koding YML exists' do
- project.add_developer(user)
- allow(project.repository).to receive(:koding_yml).and_return(nil)
- allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(true)
-
- expect(presenter.koding_anchor_data).to eq(OpenStruct.new(enabled: false,
- label: 'Set up Koding',
- link: presenter.add_koding_stack_path))
- end
-
- it 'returns nil if user cannot push' do
- expect(presenter.koding_anchor_data).to be_nil
- end
-
- it 'returns nil if koding is not enabled' do
- project.add_developer(user)
- allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(false)
-
- expect(presenter.koding_anchor_data).to be_nil
- end
-
- it 'returns nil if koding YML already exists' do
- project.add_developer(user)
- allow(project.repository).to receive(:koding_yml).and_return(double)
- allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(true)
-
- expect(presenter.koding_anchor_data).to be_nil
- end
- end
end
end
diff --git a/spec/rack_servers/configs/config.ru b/spec/rack_servers/configs/config.ru
new file mode 100644
index 00000000000..63daeb9eec5
--- /dev/null
+++ b/spec/rack_servers/configs/config.ru
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+app = proc do |env|
+ if env['REQUEST_METHOD'] == 'GET'
+ [200, {}, ["#{Process.pid}"]]
+ else
+ Process.kill(env['QUERY_STRING'], Process.pid)
+ [200, {}, ['Bye!']]
+ end
+end
+
+run app
diff --git a/spec/rack_servers/configs/puma.rb b/spec/rack_servers/configs/puma.rb
new file mode 100644
index 00000000000..d6b6d83d648
--- /dev/null
+++ b/spec/rack_servers/configs/puma.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+# Note: this file is used for testing puma in `spec/rack_servers/puma_spec.rb` only
+# Note: as per the convention in `config/puma.example.development.rb`,
+# this file will replace `/home/git` with the actual working directory
+
+directory '/home/git'
+threads 1, 10
+queue_requests false
+pidfile '/home/git/gitlab/tmp/pids/puma.pid'
+bind 'unix:///home/git/gitlab/tmp/tests/puma.socket'
+workers 1
+preload_app!
+worker_timeout 60
+
+require_relative "/home/git/gitlab/lib/gitlab/cluster/lifecycle_events"
+require_relative "/home/git/gitlab/lib/gitlab/cluster/puma_worker_killer_initializer"
+
+before_fork do
+ Gitlab::Cluster::PumaWorkerKillerInitializer.start @config.options
+ Gitlab::Cluster::LifecycleEvents.do_before_fork
+end
+
+Gitlab::Cluster::LifecycleEvents.set_puma_options @config.options
+on_worker_boot do
+ Gitlab::Cluster::LifecycleEvents.do_worker_start
+ File.write('/home/git/gitlab/tmp/tests/puma-worker-ready', Process.pid)
+end
+
+on_restart do
+ Gitlab::Cluster::LifecycleEvents.do_master_restart
+end
diff --git a/spec/rack_servers/puma_spec.rb b/spec/rack_servers/puma_spec.rb
new file mode 100644
index 00000000000..431fab87857
--- /dev/null
+++ b/spec/rack_servers/puma_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'fileutils'
+
+require 'excon'
+
+require 'spec_helper'
+
+describe 'Puma' do
+ before(:all) do
+ project_root = File.expand_path('../..', __dir__)
+
+ config_lines = File.read('spec/rack_servers/configs/puma.rb')
+ .gsub('/home/git/gitlab', project_root)
+ .gsub('/home/git', project_root)
+
+ config_path = File.join(project_root, "tmp/tests/puma.rb")
+ @socket_path = File.join(project_root, 'tmp/tests/puma.socket')
+
+ File.write(config_path, config_lines)
+
+ cmd = %W[puma -e test -C #{config_path} #{File.join(__dir__, 'configs/config.ru')}]
+ @puma_master_pid = spawn(*cmd)
+ wait_puma_boot!(@puma_master_pid, File.join(project_root, 'tmp/tests/puma-worker-ready'))
+ WebMock.allow_net_connect!
+ end
+
+ %w[SIGQUIT SIGTERM SIGKILL].each do |signal|
+ it "has a worker that self-terminates on signal #{signal}" do
+ response = Excon.get('unix://', socket: @socket_path)
+ expect(response.status).to eq(200)
+
+ worker_pid = response.body.to_i
+ expect(worker_pid).to be > 0
+
+ begin
+ Excon.post("unix://?#{signal}", socket: @socket_path)
+ rescue Excon::Error::Socket
+ # The connection may be closed abruptly
+ end
+
+ expect(pid_gone?(worker_pid)).to eq(true)
+ end
+ end
+
+ after(:all) do
+ begin
+ WebMock.disable_net_connect!(allow_localhost: true)
+ Process.kill('TERM', @puma_master_pid)
+ rescue Errno::ESRCH
+ end
+ end
+
+ def wait_puma_boot!(master_pid, ready_file)
+ # We have seen the boot timeout after 2 minutes in CI so let's set it to 5 minutes.
+ timeout = 5 * 60
+ timeout.times do
+ return if File.exist?(ready_file)
+
+ pid = Process.waitpid(master_pid, Process::WNOHANG)
+ raise "puma failed to boot: #{$?}" unless pid.nil?
+
+ sleep 1
+ end
+
+ raise "puma boot timed out after #{timeout} seconds"
+ end
+
+ def pid_gone?(pid)
+ # Worker termination should take less than a second. That makes 10
+ # seconds a generous timeout.
+ 10.times do
+ begin
+ Process.kill(0, pid)
+ rescue Errno::ESRCH
+ return true
+ end
+
+ sleep 1
+ end
+
+ false
+ end
+end
diff --git a/spec/unicorn/unicorn_spec.rb b/spec/rack_servers/unicorn_spec.rb
index a4cf479a339..6a02ebcd048 100644
--- a/spec/unicorn/unicorn_spec.rb
+++ b/spec/rack_servers/unicorn_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'fileutils'
require 'excon'
@@ -6,12 +8,16 @@ require 'spec_helper'
describe 'Unicorn' do
before(:all) do
- config_lines = File.read('config/unicorn.rb.example').split("\n")
+ project_root = File.expand_path('../..', __dir__)
+
+ config_lines = File.read('config/unicorn.rb.example')
+ .gsub('/home/git/gitlab', project_root)
+ .gsub('/home/git', project_root)
+ .split("\n")
# Remove these because they make setup harder.
config_lines = config_lines.reject do |line|
%w[
- working_directory
worker_processes
listen
pid
@@ -26,33 +32,18 @@ describe 'Unicorn' do
# predictable which process will handle our requests.
config_lines << 'worker_processes 1'
- @socket_path = File.join(Dir.pwd, 'tmp/tests/unicorn.socket')
+ @socket_path = File.join(project_root, 'tmp/tests/unicorn.socket')
config_lines << "listen '#{@socket_path}'"
- ready_file = 'tmp/tests/unicorn-worker-ready'
+ ready_file = File.join(project_root, 'tmp/tests/unicorn-worker-ready')
FileUtils.rm_f(ready_file)
after_fork_index = config_lines.index { |l| l.start_with?('after_fork') }
config_lines.insert(after_fork_index + 1, "File.write('#{ready_file}', Process.pid)")
- config_path = 'tmp/tests/unicorn.rb'
+ config_path = File.join(project_root, 'tmp/tests/unicorn.rb')
File.write(config_path, config_lines.join("\n") + "\n")
- rackup_path = 'tmp/tests/config.ru'
- File.write(rackup_path, <<~EOS)
- app =
- proc do |env|
- if env['REQUEST_METHOD'] == 'GET'
- [200, {}, [Process.pid]]
- else
- Process.kill(env['QUERY_STRING'], Process.pid)
- [200, {}, ['Bye!']]
- end
- end
-
- run app
- EOS
-
- cmd = %W[unicorn -E test -c #{config_path} #{rackup_path}]
+ cmd = %W[unicorn -E test -c #{config_path} spec/rack_servers/configs/config.ru]
@unicorn_master_pid = spawn(*cmd)
wait_unicorn_boot!(@unicorn_master_pid, ready_file)
WebMock.allow_net_connect!
diff --git a/spec/requests/api/applications_spec.rb b/spec/requests/api/applications_spec.rb
index f56bc932f40..270e12bf201 100644
--- a/spec/requests/api/applications_spec.rb
+++ b/spec/requests/api/applications_spec.rb
@@ -5,6 +5,7 @@ describe API::Applications, :api do
let(:admin_user) { create(:user, admin: true) }
let(:user) { create(:user, admin: false) }
+ let!(:application) { create(:application, name: 'another_application', redirect_uri: 'http://other_application.url', scopes: '') }
describe 'POST /applications' do
context 'authenticated and authorized user' do
@@ -15,7 +16,7 @@ describe API::Applications, :api do
application = Doorkeeper::Application.find_by(name: 'application_name', redirect_uri: 'http://application.url')
- expect(response).to have_http_status 201
+ expect(response).to have_gitlab_http_status(201)
expect(json_response).to be_a Hash
expect(json_response['application_id']).to eq application.uid
expect(json_response['secret']).to eq application.secret
@@ -27,7 +28,7 @@ describe API::Applications, :api do
post api('/applications', admin_user), name: 'application_name', redirect_uri: 'wrong_url_format', scopes: ''
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 400
+ expect(response).to have_gitlab_http_status(400)
expect(json_response).to be_a Hash
expect(json_response['message']['redirect_uri'][0]).to eq('must be an absolute URI.')
end
@@ -37,7 +38,7 @@ describe API::Applications, :api do
post api('/applications', admin_user), redirect_uri: 'http://application.url', scopes: ''
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 400
+ expect(response).to have_gitlab_http_status(400)
expect(json_response).to be_a Hash
expect(json_response['error']).to eq('name is missing')
end
@@ -47,7 +48,7 @@ describe API::Applications, :api do
post api('/applications', admin_user), name: 'application_name', scopes: ''
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 400
+ expect(response).to have_gitlab_http_status(400)
expect(json_response).to be_a Hash
expect(json_response['error']).to eq('redirect_uri is missing')
end
@@ -57,7 +58,7 @@ describe API::Applications, :api do
post api('/applications', admin_user), name: 'application_name', redirect_uri: 'http://application.url'
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 400
+ expect(response).to have_gitlab_http_status(400)
expect(json_response).to be_a Hash
expect(json_response['error']).to eq('scopes is missing')
end
@@ -69,7 +70,7 @@ describe API::Applications, :api do
post api('/applications', user), name: 'application_name', redirect_uri: 'http://application.url', scopes: ''
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 403
+ expect(response).to have_gitlab_http_status(403)
end
end
@@ -79,7 +80,62 @@ describe API::Applications, :api do
post api('/applications'), name: 'application_name', redirect_uri: 'http://application.url'
end.not_to change { Doorkeeper::Application.count }
- expect(response).to have_http_status 401
+ expect(response).to have_gitlab_http_status(401)
+ end
+ end
+ end
+
+ describe 'GET /applications' do
+ context 'authenticated and authorized user' do
+ it 'can list application' do
+ get api('/applications', admin_user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to be_a(Array)
+ end
+ end
+
+ context 'authorized user without authorization' do
+ it 'cannot list application' do
+ get api('/applications', user)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'non-authenticated user' do
+ it 'cannot list application' do
+ get api('/applications')
+
+ expect(response).to have_gitlab_http_status(401)
+ end
+ end
+ end
+
+ describe 'DELETE /applications/:id' do
+ context 'authenticated and authorized user' do
+ it 'can delete an application' do
+ expect do
+ delete api("/applications/#{application.id}", admin_user)
+ end.to change { Doorkeeper::Application.count }.by(-1)
+
+ expect(response).to have_gitlab_http_status(204)
+ end
+ end
+
+ context 'authorized user without authorization' do
+ it 'cannot delete an application' do
+ delete api("/applications/#{application.id}", user)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'non-authenticated user' do
+ it 'cannot delete an application' do
+ delete api("/applications/#{application.id}")
+
+ expect(response).to have_gitlab_http_status(401)
end
end
end
diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb
index 0921fecb933..7f3f3ab0977 100644
--- a/spec/requests/api/award_emoji_spec.rb
+++ b/spec/requests/api/award_emoji_spec.rb
@@ -167,12 +167,6 @@ describe API::AwardEmoji do
expect(response).to have_gitlab_http_status(401)
end
- it "returns a 404 error if the user authored issue" do
- post api("/projects/#{project.id}/issues/#{issue2.id}/award_emoji", user), name: 'thumbsup'
-
- expect(response).to have_gitlab_http_status(404)
- end
-
it "normalizes +1 as thumbsup award" do
post api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji", user), name: '+1'
@@ -215,12 +209,6 @@ describe API::AwardEmoji do
expect(json_response['user']['username']).to eq(user.username)
end
- it "it returns 404 error when user authored note" do
- post api("/projects/#{project.id}/issues/#{issue.iid}/notes/#{note2.id}/award_emoji", user), name: 'thumbsup'
-
- expect(response).to have_gitlab_http_status(404)
- end
-
it "normalizes +1 as thumbsup award" do
post api("/projects/#{project.id}/issues/#{issue.iid}/notes/#{note.id}/award_emoji", user), name: '+1'
diff --git a/spec/requests/api/circuit_breakers_spec.rb b/spec/requests/api/circuit_breakers_spec.rb
index fe76f057115..6c7cb151c74 100644
--- a/spec/requests/api/circuit_breakers_spec.rb
+++ b/spec/requests/api/circuit_breakers_spec.rb
@@ -1,8 +1,8 @@
require 'spec_helper'
describe API::CircuitBreakers do
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
+ set(:user) { create(:user) }
+ set(:admin) { create(:admin) }
describe 'GET circuit_breakers/repository_storage' do
it 'returns a 401 for anonymous users' do
@@ -18,37 +18,26 @@ describe API::CircuitBreakers do
end
it 'returns an Array of storages' do
- expect(Gitlab::Git::Storage::Health).to receive(:for_all_storages) do
- [Gitlab::Git::Storage::Health.new('broken', [{ name: 'prefix:broken:web01', failure_count: 4 }])]
- end
-
get api('/circuit_breakers/repository_storage', admin)
expect(response).to have_gitlab_http_status(200)
expect(json_response).to be_kind_of(Array)
- expect(json_response.first['storage_name']).to eq('broken')
- expect(json_response.first['failing_on_hosts']).to eq(['web01'])
- expect(json_response.first['total_failures']).to eq(4)
+ expect(json_response).to be_empty
end
describe 'GET circuit_breakers/repository_storage/failing' do
it 'returns an array of failing storages' do
- expect(Gitlab::Git::Storage::Health).to receive(:for_failing_storages) do
- [Gitlab::Git::Storage::Health.new('broken', [{ name: 'prefix:broken:web01', failure_count: 4 }])]
- end
-
get api('/circuit_breakers/repository_storage/failing', admin)
expect(response).to have_gitlab_http_status(200)
expect(json_response).to be_kind_of(Array)
+ expect(json_response).to be_empty
end
end
end
describe 'DELETE circuit_breakers/repository_storage' do
it 'clears all circuit_breakers' do
- expect(Gitlab::Git::Storage::FailureInfo).to receive(:reset_all!)
-
delete api('/circuit_breakers/repository_storage', admin)
expect(response).to have_gitlab_http_status(204)
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 246947e58a8..329d069ef3d 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -238,7 +238,7 @@ describe API::Commits do
describe 'create' do
let(:message) { 'Created file' }
- let!(:invalid_c_params) do
+ let(:invalid_c_params) do
{
branch: 'master',
commit_message: message,
@@ -251,7 +251,7 @@ describe API::Commits do
]
}
end
- let!(:valid_c_params) do
+ let(:valid_c_params) do
{
branch: 'master',
commit_message: message,
@@ -264,7 +264,7 @@ describe API::Commits do
]
}
end
- let!(:valid_utf8_c_params) do
+ let(:valid_utf8_c_params) do
{
branch: 'master',
commit_message: message,
@@ -278,6 +278,12 @@ describe API::Commits do
}
end
+ it 'does not increment the usage counters using access token authentication' do
+ expect(::Gitlab::WebIdeCommitsCounter).not_to receive(:increment)
+
+ post api(url, user), valid_c_params
+ end
+
it 'a new file in project repo' do
post api(url, user), valid_c_params
@@ -315,7 +321,7 @@ describe API::Commits do
describe 'delete' do
let(:message) { 'Deleted file' }
- let!(:invalid_d_params) do
+ let(:invalid_d_params) do
{
branch: 'markdown',
commit_message: message,
@@ -327,7 +333,7 @@ describe API::Commits do
]
}
end
- let!(:valid_d_params) do
+ let(:valid_d_params) do
{
branch: 'markdown',
commit_message: message,
@@ -356,7 +362,7 @@ describe API::Commits do
describe 'move' do
let(:message) { 'Moved file' }
- let!(:invalid_m_params) do
+ let(:invalid_m_params) do
{
branch: 'feature',
commit_message: message,
@@ -370,7 +376,7 @@ describe API::Commits do
]
}
end
- let!(:valid_m_params) do
+ let(:valid_m_params) do
{
branch: 'feature',
commit_message: message,
@@ -401,7 +407,7 @@ describe API::Commits do
describe 'update' do
let(:message) { 'Updated file' }
- let!(:invalid_u_params) do
+ let(:invalid_u_params) do
{
branch: 'master',
commit_message: message,
@@ -414,7 +420,7 @@ describe API::Commits do
]
}
end
- let!(:valid_u_params) do
+ let(:valid_u_params) do
{
branch: 'master',
commit_message: message,
@@ -442,9 +448,57 @@ describe API::Commits do
end
end
+ describe 'chmod' do
+ let(:message) { 'Chmod +x file' }
+ let(:file_path) { 'files/ruby/popen.rb' }
+ let(:execute_filemode) { true }
+ let(:params) do
+ {
+ branch: 'master',
+ commit_message: message,
+ actions: [
+ {
+ action: 'chmod',
+ file_path: file_path,
+ execute_filemode: execute_filemode
+ }
+ ]
+ }
+ end
+
+ it 'responds with success' do
+ post api(url, user), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['title']).to eq(message)
+ end
+
+ context 'when execute_filemode is false' do
+ let(:execute_filemode) { false }
+
+ it 'responds with success' do
+ post api(url, user), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['title']).to eq(message)
+ end
+ end
+
+ context "when the file doesn't exists" do
+ let(:file_path) { 'foo/bar.baz' }
+
+ it "responds with 400" do
+ post api(url, user), params
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response['message']).to eq("A file with this name doesn't exist")
+ end
+ end
+ end
+
describe 'multiple operations' do
let(:message) { 'Multiple actions' }
- let!(:invalid_mo_params) do
+ let(:invalid_mo_params) do
{
branch: 'master',
commit_message: message,
@@ -468,11 +522,16 @@ describe API::Commits do
action: 'update',
file_path: 'foo/bar.baz',
content: 'puts 8'
+ },
+ {
+ action: 'chmod',
+ file_path: 'files/ruby/popen.rb',
+ execute_filemode: true
}
]
}
end
- let!(:valid_mo_params) do
+ let(:valid_mo_params) do
{
branch: 'master',
commit_message: message,
@@ -496,18 +555,37 @@ describe API::Commits do
action: 'update',
file_path: 'files/ruby/popen.rb',
content: 'puts 8'
+ },
+ {
+ action: 'chmod',
+ file_path: 'files/ruby/popen.rb',
+ execute_filemode: true
}
]
}
end
- it 'are commited as one in project repo' do
+ it 'are committed as one in project repo' do
post api(url, user), valid_mo_params
expect(response).to have_gitlab_http_status(201)
expect(json_response['title']).to eq(message)
end
+ it 'includes the commit stats' do
+ post api(url, user), valid_mo_params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response).to include 'stats'
+ end
+
+ it "doesn't include the commit stats when stats is false" do
+ post api(url, user), valid_mo_params.merge(stats: false)
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response).not_to include 'stats'
+ end
+
it 'return a 400 bad request if there are any issues' do
post api(url, user), invalid_mo_params
@@ -1040,6 +1118,14 @@ describe API::Commits do
end
end
+ context 'when branch is empty' do
+ ['', ' '].each do |branch|
+ it_behaves_like '400 response' do
+ let(:request) { post api(route, current_user), branch: branch }
+ end
+ end
+ end
+
context 'when branch does not exist' do
it_behaves_like '404 response' do
let(:request) { post api(route, current_user), branch: 'foo' }
@@ -1122,6 +1208,118 @@ describe API::Commits do
end
end
+ describe 'POST :id/repository/commits/:sha/revert' do
+ let(:commit_id) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' }
+ let(:commit) { project.commit(commit_id) }
+ let(:branch) { 'master' }
+ let(:route) { "/projects/#{project_id}/repository/commits/#{commit_id}/revert" }
+
+ shared_examples_for 'ref revert' do
+ context 'when ref exists' do
+ it 'reverts the ref commit' do
+ post api(route, current_user), branch: branch
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(response).to match_response_schema('public_api/v4/commit/basic')
+
+ expect(json_response['message']).to eq(commit.revert_message(user))
+ expect(json_response['author_name']).to eq(user.name)
+ expect(json_response['committer_name']).to eq(user.name)
+ expect(json_response['parent_ids']).to contain_exactly(commit_id)
+ end
+ end
+
+ context 'when repository is disabled' do
+ include_context 'disabled repository'
+
+ it_behaves_like '403 response' do
+ let(:request) { post api(route, current_user), branch: branch }
+ end
+ end
+ end
+
+ context 'when unauthenticated', 'and project is public' do
+ let(:project) { create(:project, :public, :repository) }
+
+ it_behaves_like '403 response' do
+ let(:request) { post api(route), branch: branch }
+ end
+ end
+
+ context 'when unauthenticated', 'and project is private' do
+ it_behaves_like '404 response' do
+ let(:request) { post api(route), branch: branch }
+ let(:message) { '404 Project Not Found' }
+ end
+ end
+
+ context 'when authenticated', 'as an owner' do
+ let(:current_user) { user }
+
+ it_behaves_like 'ref revert'
+
+ context 'when ref does not exist' do
+ let(:commit_id) { 'unknown' }
+
+ it_behaves_like '404 response' do
+ let(:request) { post api(route, current_user), branch: branch }
+ let(:message) { '404 Commit Not Found' }
+ end
+ end
+
+ context 'when branch is missing' do
+ it_behaves_like '400 response' do
+ let(:request) { post api(route, current_user) }
+ end
+ end
+
+ context 'when branch is empty' do
+ ['', ' '].each do |branch|
+ it_behaves_like '400 response' do
+ let(:request) { post api(route, current_user), branch: branch }
+ end
+ end
+ end
+
+ context 'when branch does not exist' do
+ it_behaves_like '404 response' do
+ let(:request) { post api(route, current_user), branch: 'foo' }
+ let(:message) { '404 Branch Not Found' }
+ end
+ end
+
+ context 'when ref contains a dot' do
+ let(:commit_id) { branch_with_dot.name }
+ let(:commit) { project.repository.commit(commit_id) }
+
+ it_behaves_like '400 response' do
+ let(:request) { post api(route, current_user) }
+ end
+ end
+ end
+
+ context 'when authenticated', 'as a developer' do
+ let(:current_user) { user }
+
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when branch is protected' do
+ before do
+ create(:protected_branch, project: project, name: 'feature')
+ end
+
+ it 'returns 400 if you are not allowed to push to the target branch' do
+ post api(route, current_user), branch: 'feature'
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['message']).to match(/You are not allowed to push into this branch/)
+ end
+ end
+ end
+ end
+
describe 'POST /projects/:id/repository/commits/:sha/comments' do
let(:commit) { project.repository.commit }
let(:commit_id) { commit.id }
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index 61ae053cea7..3dac7225b7a 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -10,9 +10,9 @@ describe API::Deployments do
describe 'GET /projects/:id/deployments' do
let(:project) { create(:project) }
- let!(:deployment_1) { create(:deployment, project: project, iid: 11, ref: 'master', created_at: Time.now) }
- let!(:deployment_2) { create(:deployment, project: project, iid: 12, ref: 'feature', created_at: 1.day.ago) }
- let!(:deployment_3) { create(:deployment, project: project, iid: 8, ref: 'feature', created_at: 2.days.ago) }
+ let!(:deployment_1) { create(:deployment, :success, project: project, iid: 11, ref: 'master', created_at: Time.now) }
+ let!(:deployment_2) { create(:deployment, :success, project: project, iid: 12, ref: 'feature', created_at: 1.day.ago) }
+ let!(:deployment_3) { create(:deployment, :success, project: project, iid: 8, ref: 'patch', created_at: 2.days.ago) }
context 'as member of the project' do
it 'returns projects deployments sorted by id asc' do
@@ -53,8 +53,8 @@ describe API::Deployments do
'id' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
'iid' | 'asc' | [:deployment_3, :deployment_1, :deployment_2]
'iid' | 'desc' | [:deployment_2, :deployment_1, :deployment_3]
- 'ref' | 'asc' | [:deployment_2, :deployment_3, :deployment_1]
- 'ref' | 'desc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3]
+ 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2]
end
with_them do
@@ -76,7 +76,7 @@ describe API::Deployments do
describe 'GET /projects/:id/deployments/:deployment_id' do
let(:project) { deployment.environment.project }
- let!(:deployment) { create(:deployment) }
+ let!(:deployment) { create(:deployment, :success) }
context 'as a member of the project' do
it 'returns the projects deployment' do
diff --git a/spec/requests/api/events_spec.rb b/spec/requests/api/events_spec.rb
index e6a61fdcf39..573eebe314d 100644
--- a/spec/requests/api/events_spec.rb
+++ b/spec/requests/api/events_spec.rb
@@ -2,9 +2,9 @@ require 'spec_helper'
describe API::Events do
include ApiHelpers
+
let(:user) { create(:user) }
let(:non_member) { create(:user) }
- let(:other_user) { create(:user, username: 'otheruser') }
let(:private_project) { create(:project, :private, creator_id: user.id, namespace: user.namespace) }
let(:closed_issue) { create(:closed_issue, project: private_project, author: user) }
let!(:closed_issue_event) { create(:event, project: private_project, author: user, target: closed_issue, action: Event::CLOSED, created_at: Date.new(2016, 12, 30)) }
@@ -28,12 +28,52 @@ describe API::Events do
expect(json_response.size).to eq(1)
end
end
+
+ context 'when the requesting token has "read_user" scope' do
+ let(:token) { create(:personal_access_token, scopes: ['read_user'], user: user) }
+
+ it 'returns users events' do
+ get api('/events?action=closed&target_type=issue&after=2016-12-1&before=2016-12-31', personal_access_token: token)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.size).to eq(1)
+ end
+ end
+
+ context 'when the requesting token does not have "read_user" or "api" scope' do
+ let(:token_without_scopes) { create(:personal_access_token, scopes: ['read_repository'], user: user) }
+
+ it 'returns a "403" response' do
+ get api('/events', personal_access_token: token_without_scopes)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
end
describe 'GET /users/:id/events' do
- context "as a user that cannot see the event's project" do
- it 'returns no events' do
- get api("/users/#{user.id}/events", other_user)
+ context "as a user that cannot see another user" do
+ it 'returns a "404" response' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(non_member, :read_user, user).and_return(false)
+
+ get api("/users/#{user.id}/events", non_member)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to be_empty
+ end
+ end
+
+ context "as a user token that cannot see another user" do
+ let(:non_member_token) { create(:personal_access_token, scopes: ['read_user'], user: non_member) }
+
+ it 'returns a "404" response' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(non_member, :read_user, user).and_return(false)
+
+ get api("/users/#{user.id}/events", personal_access_token: non_member_token)
expect(response).to have_gitlab_http_status(200)
expect(json_response).to be_empty
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 0aec186f738..a2b41d56b8b 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -313,7 +313,7 @@ describe API::Files do
describe "POST /projects/:id/repository/files/:file_path" do
let!(:file_path) { "new_subfolder%2Fnewfile%2Erb" }
- let(:valid_params) do
+ let(:params) do
{
branch: "master",
content: "puts 8",
@@ -322,7 +322,7 @@ describe API::Files do
end
it "creates a new file in project repo" do
- post api(route(file_path), user), valid_params
+ post api(route(file_path), user), params
expect(response).to have_gitlab_http_status(201)
expect(json_response["file_path"]).to eq(CGI.unescape(file_path))
@@ -337,20 +337,28 @@ describe API::Files do
expect(response).to have_gitlab_http_status(400)
end
+ it 'returns a 400 bad request if the commit message is empty' do
+ params[:commit_message] = ''
+
+ post api(route(file_path), user), params
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
it "returns a 400 if editor fails to create file" do
allow_any_instance_of(Repository).to receive(:create_file)
.and_raise(Gitlab::Git::CommitError, 'Cannot create file')
- post api(route("any%2Etxt"), user), valid_params
+ post api(route("any%2Etxt"), user), params
expect(response).to have_gitlab_http_status(400)
end
context "when specifying an author" do
it "creates a new file with the specified author" do
- valid_params.merge!(author_email: author_email, author_name: author_name)
+ params.merge!(author_email: author_email, author_name: author_name)
- post api(route("new_file_with_author%2Etxt"), user), valid_params
+ post api(route("new_file_with_author%2Etxt"), user), params
expect(response).to have_gitlab_http_status(201)
expect(response.content_type).to eq('application/json')
@@ -364,7 +372,7 @@ describe API::Files do
let!(:project) { create(:project_empty_repo, namespace: user.namespace ) }
it "creates a new file in project repo" do
- post api(route("newfile%2Erb"), user), valid_params
+ post api(route("newfile%2Erb"), user), params
expect(response).to have_gitlab_http_status(201)
expect(json_response['file_path']).to eq('newfile.rb')
@@ -376,7 +384,7 @@ describe API::Files do
end
describe "PUT /projects/:id/repository/files" do
- let(:valid_params) do
+ let(:params) do
{
branch: 'master',
content: 'puts 8',
@@ -385,7 +393,7 @@ describe API::Files do
end
it "updates existing file in project repo" do
- put api(route(file_path), user), valid_params
+ put api(route(file_path), user), params
expect(response).to have_gitlab_http_status(200)
expect(json_response['file_path']).to eq(CGI.unescape(file_path))
@@ -394,8 +402,16 @@ describe API::Files do
expect(last_commit.author_name).to eq(user.name)
end
+ it 'returns a 400 bad request if the commit message is empty' do
+ params[:commit_message] = ''
+
+ put api(route(file_path), user), params
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
it "returns a 400 bad request if update existing file with stale last commit id" do
- params_with_stale_id = valid_params.merge(last_commit_id: 'stale')
+ params_with_stale_id = params.merge(last_commit_id: 'stale')
put api(route(file_path), user), params_with_stale_id
@@ -406,7 +422,7 @@ describe API::Files do
it "updates existing file in project repo with accepts correct last commit id" do
last_commit = Gitlab::Git::Commit
.last_for_path(project.repository, 'master', URI.unescape(file_path))
- params_with_correct_id = valid_params.merge(last_commit_id: last_commit.id)
+ params_with_correct_id = params.merge(last_commit_id: last_commit.id)
put api(route(file_path), user), params_with_correct_id
@@ -421,9 +437,9 @@ describe API::Files do
context "when specifying an author" do
it "updates a file with the specified author" do
- valid_params.merge!(author_email: author_email, author_name: author_name, content: "New content")
+ params.merge!(author_email: author_email, author_name: author_name, content: "New content")
- put api(route(file_path), user), valid_params
+ put api(route(file_path), user), params
expect(response).to have_gitlab_http_status(200)
last_commit = project.repository.commit.raw
@@ -434,7 +450,7 @@ describe API::Files do
end
describe "DELETE /projects/:id/repository/files" do
- let(:valid_params) do
+ let(:params) do
{
branch: 'master',
commit_message: 'Changed file'
@@ -442,7 +458,7 @@ describe API::Files do
end
it "deletes existing file in project repo" do
- delete api(route(file_path), user), valid_params
+ delete api(route(file_path), user), params
expect(response).to have_gitlab_http_status(204)
end
@@ -453,19 +469,27 @@ describe API::Files do
expect(response).to have_gitlab_http_status(400)
end
+ it 'returns a 400 bad request if the commit message is empty' do
+ params[:commit_message] = ''
+
+ delete api(route(file_path), user), params
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
it "returns a 400 if fails to delete file" do
allow_any_instance_of(Repository).to receive(:delete_file).and_raise(Gitlab::Git::CommitError, 'Cannot delete file')
- delete api(route(file_path), user), valid_params
+ delete api(route(file_path), user), params
expect(response).to have_gitlab_http_status(400)
end
context "when specifying an author" do
it "removes a file with the specified author" do
- valid_params.merge!(author_email: author_email, author_name: author_name)
+ params.merge!(author_email: author_email, author_name: author_name)
- delete api(route(file_path), user), valid_params
+ delete api(route(file_path), user), params
expect(response).to have_gitlab_http_status(204)
end
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 3a8948f8477..3802b5c6848 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -155,7 +155,7 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(response_groups).to eq(Group.visible_to_user(user1).order(:name).pluck(:name))
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(:name).pluck(:name))
end
it "sorts in descending order when passed" do
@@ -164,7 +164,7 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(response_groups).to eq(Group.visible_to_user(user1).order(name: :desc).pluck(:name))
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(name: :desc).pluck(:name))
end
it "sorts by path in order_by param" do
@@ -173,7 +173,7 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(response_groups).to eq(Group.visible_to_user(user1).order(:path).pluck(:name))
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(:path).pluck(:name))
end
it "sorts by id in the order_by param" do
@@ -182,7 +182,7 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(response_groups).to eq(Group.visible_to_user(user1).order(:id).pluck(:name))
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(:id).pluck(:name))
end
it "sorts also by descending id with pagination fix" do
@@ -191,7 +191,7 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(response_groups).to eq(Group.visible_to_user(user1).order(id: :desc).pluck(:name))
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(id: :desc).pluck(:name))
end
it "sorts identical keys by id for good pagination" do
@@ -211,6 +211,10 @@ describe API::Groups do
expect(json_response).to be_an Array
expect(response_groups_ids).to eq(Group.select { |group| group['name'] == 'same-name' }.map { |group| group['id'] }.sort)
end
+
+ def groups_visible_to_user(user)
+ Group.where(id: user.authorized_groups.select(:id).reorder(nil))
+ end
end
context 'when using owned in the request' do
diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb
index 0a789d58fd8..cca449e9e56 100644
--- a/spec/requests/api/helpers_spec.rb
+++ b/spec/requests/api/helpers_spec.rb
@@ -368,6 +368,14 @@ describe API::Helpers do
it_behaves_like 'successful sudo'
end
+ context 'when providing username (case insensitive)' do
+ before do
+ env[API::Helpers::SUDO_HEADER] = user.username.upcase
+ end
+
+ it_behaves_like 'successful sudo'
+ end
+
context 'when providing user ID' do
before do
env[API::Helpers::SUDO_HEADER] = user.id.to_s
@@ -386,6 +394,14 @@ describe API::Helpers do
it_behaves_like 'successful sudo'
end
+ context 'when providing username (case insensitive)' do
+ before do
+ set_param(API::Helpers::SUDO_PARAM, user.username.upcase)
+ end
+
+ it_behaves_like 'successful sudo'
+ end
+
context 'when providing user ID' do
before do
set_param(API::Helpers::SUDO_PARAM, user.id.to_s)
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index 85c93f35c20..2ebcb787d06 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -369,6 +369,26 @@ describe API::Internal do
expect(user.reload.last_activity_on).to be_nil
end
end
+
+ context 'when receive_max_input_size has been updated' do
+ it 'returns custom git config' do
+ allow(Gitlab::CurrentSettings).to receive(:receive_max_input_size) { 1 }
+
+ push(key, project)
+
+ expect(json_response["git_config_options"]).to be_present
+ end
+ end
+
+ context 'when receive_max_input_size is empty' do
+ it 'returns an empty git config' do
+ allow(Gitlab::CurrentSettings).to receive(:receive_max_input_size) { nil }
+
+ push(key, project)
+
+ expect(json_response["git_config_options"]).to be_empty
+ end
+ end
end
end
@@ -381,7 +401,7 @@ describe API::Internal do
it do
pull(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(401)
expect(json_response["status"]).to be_falsey
expect(user.reload.last_activity_on).to be_nil
end
@@ -391,13 +411,61 @@ describe API::Internal do
it do
push(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(401)
expect(json_response["status"]).to be_falsey
expect(user.reload.last_activity_on).to be_nil
end
end
end
+ context "custom action" do
+ let(:access_checker) { double(Gitlab::GitAccess) }
+ let(:message) { 'CustomActionError message' }
+ let(:payload) do
+ {
+ 'action' => 'geo_proxy_to_primary',
+ 'data' => {
+ 'api_endpoints' => %w{geo/proxy_git_push_ssh/info_refs geo/proxy_git_push_ssh/push},
+ 'gl_username' => 'testuser',
+ 'primary_repo' => 'http://localhost:3000/testuser/repo.git'
+ }
+ }
+ end
+
+ let(:custom_action_result) { Gitlab::GitAccessResult::CustomAction.new(payload, message) }
+
+ before do
+ project.add_guest(user)
+ expect(Gitlab::GitAccess).to receive(:new).with(
+ key,
+ project,
+ 'ssh',
+ {
+ authentication_abilities: [:read_project, :download_code, :push_code],
+ namespace_path: project.namespace.name,
+ project_path: project.path,
+ redirected_path: nil
+ }
+ ).and_return(access_checker)
+ expect(access_checker).to receive(:check).with(
+ 'git-receive-pack',
+ 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master'
+ ).and_return(custom_action_result)
+ end
+
+ context "git push" do
+ it do
+ push(key, project)
+
+ expect(response).to have_gitlab_http_status(300)
+ expect(json_response['status']).to be_truthy
+ expect(json_response['message']).to eql(message)
+ expect(json_response['payload']).to eql(payload)
+ expect(user.reload.last_activity_on).to be_nil
+ end
+ end
+ end
+
context "blocked user" do
let(:personal_project) { create(:project, namespace: user.namespace) }
@@ -409,7 +477,7 @@ describe API::Internal do
it do
pull(key, personal_project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(401)
expect(json_response["status"]).to be_falsey
expect(user.reload.last_activity_on).to be_nil
end
@@ -419,13 +487,31 @@ describe API::Internal do
it do
push(key, personal_project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(401)
expect(json_response["status"]).to be_falsey
expect(user.reload.last_activity_on).to be_nil
end
end
end
+ context 'request times out' do
+ context 'git push' do
+ it 'responds with a gateway timeout' do
+ personal_project = create(:project, namespace: user.namespace)
+
+ expect_next_instance_of(Gitlab::GitAccess) do |access|
+ expect(access).to receive(:check).and_raise(Gitlab::GitAccess::TimeoutError, "Foo")
+ end
+ push(key, personal_project)
+
+ expect(response).to have_gitlab_http_status(503)
+ expect(json_response['status']).to be_falsey
+ expect(json_response['message']).to eq("Foo")
+ expect(user.reload.last_activity_on).to be_nil
+ end
+ end
+ end
+
context "archived project" do
before do
project.add_developer(user)
@@ -445,7 +531,7 @@ describe API::Internal do
it do
push(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(401)
expect(json_response["status"]).to be_falsey
end
end
@@ -477,7 +563,7 @@ describe API::Internal do
it do
archive(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(404)
expect(json_response["status"]).to be_falsey
end
end
@@ -489,7 +575,7 @@ describe API::Internal do
pull(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(404)
expect(json_response["status"]).to be_falsey
end
end
@@ -498,7 +584,7 @@ describe API::Internal do
it do
pull(OpenStruct.new(id: 0), project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(404)
expect(json_response["status"]).to be_falsey
end
end
@@ -511,7 +597,7 @@ describe API::Internal do
it 'rejects the SSH push' do
push(key, project)
- expect(response.status).to eq(200)
+ expect(response.status).to eq(401)
expect(json_response['status']).to be_falsey
expect(json_response['message']).to eq 'Git access over SSH is not allowed'
end
@@ -519,7 +605,7 @@ describe API::Internal do
it 'rejects the SSH pull' do
pull(key, project)
- expect(response.status).to eq(200)
+ expect(response.status).to eq(401)
expect(json_response['status']).to be_falsey
expect(json_response['message']).to eq 'Git access over SSH is not allowed'
end
@@ -533,7 +619,7 @@ describe API::Internal do
it 'rejects the HTTP push' do
push(key, project, 'http')
- expect(response.status).to eq(200)
+ expect(response.status).to eq(401)
expect(json_response['status']).to be_falsey
expect(json_response['message']).to eq 'Git access over HTTP is not allowed'
end
@@ -541,7 +627,7 @@ describe API::Internal do
it 'rejects the HTTP pull' do
pull(key, project, 'http')
- expect(response.status).to eq(200)
+ expect(response.status).to eq(401)
expect(json_response['status']).to be_falsey
expect(json_response['message']).to eq 'Git access over HTTP is not allowed'
end
@@ -571,14 +657,14 @@ describe API::Internal do
it 'rejects the push' do
push(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(404)
expect(json_response['status']).to be_falsy
end
it 'rejects the SSH pull' do
pull(key, project)
- expect(response).to have_gitlab_http_status(200)
+ expect(response).to have_gitlab_http_status(404)
expect(json_response['status']).to be_falsy
end
end
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
index 28ba00c7293..3d532dd83c7 100644
--- a/spec/requests/api/issues_spec.rb
+++ b/spec/requests/api/issues_spec.rb
@@ -55,7 +55,8 @@ describe API::Issues do
end
let!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
- let(:no_milestone_title) { URI.escape(Milestone::None.title) }
+ let(:no_milestone_title) { "None" }
+ let(:any_milestone_title) { "Any" }
before(:all) do
project.add_reporter(user)
@@ -168,16 +169,53 @@ describe API::Issues do
expect(first_issue['id']).to eq(issue2.id)
end
- it 'returns issues reacted by the authenticated user by the given emoji' do
- issue2 = create(:issue, project: project, author: user, assignees: [user])
- award_emoji = create(:award_emoji, awardable: issue2, user: user2, name: 'star')
+ it 'returns issues with no assignee' do
+ issue2 = create(:issue, author: user2, project: project)
- get api('/issues', user2), my_reaction_emoji: award_emoji.name, scope: 'all'
+ get api('/issues', user), assignee_id: 0, scope: 'all'
expect_paginated_array_response(size: 1)
expect(first_issue['id']).to eq(issue2.id)
end
+ it 'returns issues with no assignee' do
+ issue2 = create(:issue, author: user2, project: project)
+
+ get api('/issues', user), assignee_id: 'None', scope: 'all'
+
+ expect_paginated_array_response(size: 1)
+ expect(first_issue['id']).to eq(issue2.id)
+ end
+
+ it 'returns issues with any assignee' do
+ # This issue without assignee should not be returned
+ create(:issue, author: user2, project: project)
+
+ get api('/issues', user), assignee_id: 'Any', scope: 'all'
+
+ expect_paginated_array_response(size: 3)
+ end
+
+ it 'returns issues reacted by the authenticated user' do
+ issue2 = create(:issue, project: project, author: user, assignees: [user])
+ create(:award_emoji, awardable: issue2, user: user2, name: 'star')
+
+ create(:award_emoji, awardable: issue, user: user2, name: 'thumbsup')
+
+ get api('/issues', user2), my_reaction_emoji: 'Any', scope: 'all'
+
+ expect_paginated_array_response(size: 2)
+ end
+
+ it 'returns issues not reacted by the authenticated user' do
+ issue2 = create(:issue, project: project, author: user, assignees: [user])
+ create(:award_emoji, awardable: issue2, user: user2, name: 'star')
+
+ get api('/issues', user2), my_reaction_emoji: 'None', scope: 'all'
+
+ expect_paginated_array_response(size: 2)
+ end
+
it 'returns issues matching given search string for title' do
get api("/issues", user), search: issue.title
@@ -802,6 +840,15 @@ describe API::Issues do
expect(json_response.first['id']).to eq(confidential_issue.id)
end
+ it 'returns an array of issues with any milestone' do
+ get api("#{base_url}/issues?milestone=#{any_milestone_title}", user)
+
+ response_ids = json_response.map { |issue| issue['id'] }
+
+ expect_paginated_array_response(size: 2)
+ expect(response_ids).to contain_exactly(closed_issue.id, issue.id)
+ end
+
it 'sorts by created_at descending by default' do
get api("#{base_url}/issues", user)
@@ -1023,6 +1070,20 @@ describe API::Issues do
end
end
+ context 'by a group owner' do
+ let(:group) { create(:group) }
+ let(:group_project) { create(:project, :public, namespace: group) }
+
+ it 'sets the internal ID on the new issue' do
+ group.add_owner(user2)
+ post api("/projects/#{group_project.id}/issues", user2),
+ title: 'new issue', iid: 9001
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['iid']).to eq 9001
+ end
+ end
+
context 'by another user' do
it 'ignores the given internal ID' do
post api("/projects/#{project.id}/issues", user2),
@@ -1154,14 +1215,47 @@ describe API::Issues do
end
end
- context 'when an admin or owner makes the request' do
- it 'accepts the creation date to be set' do
- creation_time = 2.weeks.ago
- post api("/projects/#{project.id}/issues", user),
- title: 'new issue', labels: 'label, label2', created_at: creation_time
+ context 'setting created_at' do
+ let(:creation_time) { 2.weeks.ago }
+ let(:params) { { title: 'new issue', labels: 'label, label2', created_at: creation_time } }
- expect(response).to have_gitlab_http_status(201)
- expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ context 'by an admin' do
+ it 'sets the creation time on the new issue' do
+ post api("/projects/#{project.id}/issues", admin), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ end
+ end
+
+ context 'by a project owner' do
+ it 'sets the creation time on the new issue' do
+ post api("/projects/#{project.id}/issues", user), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ end
+ end
+
+ context 'by a group owner' do
+ it 'sets the creation time on the new issue' do
+ group = create(:group)
+ group_project = create(:project, :public, namespace: group)
+ group.add_owner(user2)
+ post api("/projects/#{group_project.id}/issues", user2), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ end
+ end
+
+ context 'by another user' do
+ it 'ignores the given creation time' do
+ post api("/projects/#{project.id}/issues", user2), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(Time.parse(json_response['created_at'])).not_to be_like_time(creation_time)
+ end
end
end
@@ -1707,6 +1801,74 @@ describe API::Issues do
end
end
+ describe 'GET :id/issues/:issue_iid/related_merge_requests' do
+ def get_related_merge_requests(project_id, issue_iid, user = nil)
+ get api("/projects/#{project_id}/issues/#{issue_iid}/related_merge_requests", user)
+ end
+
+ def create_referencing_mr(user, project, issue)
+ attributes = {
+ author: user,
+ source_project: project,
+ target_project: project,
+ source_branch: "master",
+ target_branch: "test",
+ description: "See #{issue.to_reference}"
+ }
+ create(:merge_request, attributes).tap do |merge_request|
+ create(:note, :system, project: project, noteable: issue, author: user, note: merge_request.to_reference(full: true))
+ end
+ end
+
+ let!(:related_mr) { create_referencing_mr(user, project, issue) }
+
+ context 'when unauthenticated' do
+ it 'return list of referenced merge requests from issue' do
+ get_related_merge_requests(project.id, issue.iid)
+
+ expect_paginated_array_response(size: 1)
+ end
+
+ it 'renders 404 if project is not visible' do
+ private_project = create(:project, :private)
+ private_issue = create(:issue, project: private_project)
+ create_referencing_mr(user, private_project, private_issue)
+
+ get_related_merge_requests(private_project.id, private_issue.iid)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ it 'returns merge requests that mentioned a issue' do
+ create(:merge_request,
+ :simple,
+ author: user,
+ source_project: project,
+ target_project: project,
+ description: "Some description")
+
+ get_related_merge_requests(project.id, issue.iid, user)
+
+ expect_paginated_array_response(size: 1)
+ expect(json_response.first['id']).to eq(related_mr.id)
+ end
+
+ context 'no merge request mentioned a issue' do
+ it 'returns empty array' do
+ get_related_merge_requests(project.id, closed_issue.iid, user)
+
+ expect_paginated_array_response(size: 0)
+ end
+ end
+
+ it "returns 404 when issue doesn't exists" do
+ get_related_merge_requests(project.id, 999999, user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
describe "GET /projects/:id/issues/:issue_iid/user_agent_detail" do
let!(:user_agent_detail) { create(:user_agent_detail, subject: issue) }
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index 5814d834572..8770365c893 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -3,6 +3,32 @@ require 'spec_helper'
describe API::Jobs do
include HttpIOHelpers
+ shared_examples 'a job with artifacts and trace' do |result_is_array: true|
+ context 'with artifacts and trace' do
+ let!(:second_job) { create(:ci_build, :trace_artifact, :artifacts, :test_reports, pipeline: pipeline) }
+
+ it 'returns artifacts and trace data', :skip_before_request do
+ get api(api_endpoint, api_user)
+ json_job = result_is_array ? json_response.select { |job| job['id'] == second_job.id }.first : json_response
+
+ expect(json_job['artifacts_file']).not_to be_nil
+ expect(json_job['artifacts_file']).not_to be_empty
+ expect(json_job['artifacts_file']['filename']).to eq(second_job.artifacts_file.filename)
+ expect(json_job['artifacts_file']['size']).to eq(second_job.artifacts_file.size)
+ expect(json_job['artifacts']).not_to be_nil
+ expect(json_job['artifacts']).to be_an Array
+ expect(json_job['artifacts'].size).to eq(second_job.job_artifacts.length)
+ json_job['artifacts'].each do |artifact|
+ expect(artifact).not_to be_nil
+ file_type = Ci::JobArtifact.file_types[artifact['file_type']]
+ expect(artifact['size']).to eq(second_job.job_artifacts.where(file_type: file_type).first.size)
+ expect(artifact['filename']).to eq(second_job.job_artifacts.where(file_type: file_type).first.filename)
+ expect(artifact['file_format']).to eq(second_job.job_artifacts.where(file_type: file_type).first.file_format)
+ end
+ end
+ end
+ end
+
set(:project) do
create(:project, :repository, public_builds: false)
end
@@ -49,6 +75,20 @@ describe API::Jobs do
expect(Time.parse(json_response.first['artifacts_expire_at'])).to be_like_time(job.artifacts_expire_at)
end
+ context 'without artifacts and trace' do
+ it 'returns no artifacts nor trace data' do
+ json_job = json_response.first
+
+ expect(json_job['artifacts_file']).to be_nil
+ expect(json_job['artifacts']).to be_an Array
+ expect(json_job['artifacts']).to be_empty
+ end
+ end
+
+ it_behaves_like 'a job with artifacts and trace' do
+ let(:api_endpoint) { "/projects/#{project.id}/jobs" }
+ end
+
it 'returns pipeline data' do
json_job = json_response.first
@@ -60,7 +100,7 @@ describe API::Jobs do
end
it 'avoids N+1 queries', :skip_before_request do
- first_build = create(:ci_build, :artifacts, pipeline: pipeline)
+ first_build = create(:ci_build, :trace_artifact, :artifacts, :test_reports, pipeline: pipeline)
first_build.runner = create(:ci_runner)
first_build.user = create(:user)
first_build.save
@@ -68,7 +108,7 @@ describe API::Jobs do
control_count = ActiveRecord::QueryRecorder.new { go }.count
second_pipeline = create(:ci_empty_pipeline, project: project, sha: project.commit.id, ref: project.default_branch)
- second_build = create(:ci_build, :artifacts, pipeline: second_pipeline)
+ second_build = create(:ci_build, :trace_artifact, :artifacts, :test_reports, pipeline: second_pipeline)
second_build.runner = create(:ci_runner)
second_build.user = create(:user)
second_build.save
@@ -117,9 +157,11 @@ describe API::Jobs do
describe 'GET /projects/:id/pipelines/:pipeline_id/jobs' do
let(:query) { Hash.new }
- before do
- job
- get api("/projects/#{project.id}/pipelines/#{pipeline.id}/jobs", api_user), query
+ before do |example|
+ unless example.metadata[:skip_before_request]
+ job
+ get api("/projects/#{project.id}/pipelines/#{pipeline.id}/jobs", api_user), query
+ end
end
context 'authorized user' do
@@ -133,6 +175,13 @@ describe API::Jobs do
expect(json_response).not_to be_empty
expect(json_response.first['commit']['id']).to eq project.commit.id
expect(Time.parse(json_response.first['artifacts_expire_at'])).to be_like_time(job.artifacts_expire_at)
+ expect(json_response.first['artifacts_file']).to be_nil
+ expect(json_response.first['artifacts']).to be_an Array
+ expect(json_response.first['artifacts']).to be_empty
+ end
+
+ it_behaves_like 'a job with artifacts and trace' do
+ let(:api_endpoint) { "/projects/#{project.id}/pipelines/#{pipeline.id}/jobs" }
end
it 'returns pipeline data' do
@@ -183,7 +232,7 @@ describe API::Jobs do
get api("/projects/#{project.id}/pipelines/#{pipeline.id}/jobs", api_user), query
end.count
- 3.times { create(:ci_build, :artifacts, pipeline: pipeline) }
+ 3.times { create(:ci_build, :trace_artifact, :artifacts, :test_reports, pipeline: pipeline) }
expect do
get api("/projects/#{project.id}/pipelines/#{pipeline.id}/jobs", api_user), query
@@ -201,8 +250,10 @@ describe API::Jobs do
end
describe 'GET /projects/:id/jobs/:job_id' do
- before do
- get api("/projects/#{project.id}/jobs/#{job.id}", api_user)
+ before do |example|
+ unless example.metadata[:skip_before_request]
+ get api("/projects/#{project.id}/jobs/#{job.id}", api_user)
+ end
end
context 'authorized user' do
@@ -219,10 +270,17 @@ describe API::Jobs do
expect(Time.parse(json_response['started_at'])).to be_like_time(job.started_at)
expect(Time.parse(json_response['finished_at'])).to be_like_time(job.finished_at)
expect(Time.parse(json_response['artifacts_expire_at'])).to be_like_time(job.artifacts_expire_at)
+ expect(json_response['artifacts_file']).to be_nil
+ expect(json_response['artifacts']).to be_an Array
+ expect(json_response['artifacts']).to be_empty
expect(json_response['duration']).to eq(job.duration)
expect(json_response['web_url']).to be_present
end
+ it_behaves_like 'a job with artifacts and trace', result_is_array: false do
+ let(:api_endpoint) { "/projects/#{project.id}/jobs/#{second_job.id}" }
+ end
+
it 'returns pipeline data' do
json_job = json_response
@@ -663,7 +721,7 @@ describe API::Jobs do
expect(job.trace.exist?).to be_falsy
expect(job.artifacts_file.exists?).to be_falsy
expect(job.artifacts_metadata.exists?).to be_falsy
- expect(job.has_test_reports?).to be_falsy
+ expect(job.has_job_artifacts?).to be_falsy
end
it 'updates job' do
diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb
index a4220f5b2be..b8a4a04a7e4 100644
--- a/spec/requests/api/labels_spec.rb
+++ b/spec/requests/api/labels_spec.rb
@@ -306,16 +306,16 @@ describe API::Labels do
end
it 'returns 400 for too long color code' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
+ put api("/projects/#{project.id}/labels", user),
+ name: 'label1',
color: '#FFAAFFFF'
expect(response).to have_gitlab_http_status(400)
expect(json_response['message']['color']).to eq(['must be a valid color code'])
end
it 'returns 400 for invalid priority' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
+ put api("/projects/#{project.id}/labels", user),
+ name: 'label1',
priority: 'foo'
expect(response).to have_gitlab_http_status(400)
diff --git a/spec/requests/api/markdown_spec.rb b/spec/requests/api/markdown_spec.rb
index a55796cf343..e369c1435f0 100644
--- a/spec/requests/api/markdown_spec.rb
+++ b/spec/requests/api/markdown_spec.rb
@@ -106,6 +106,52 @@ describe API::Markdown do
.and include("#1</a>")
end
end
+
+ context 'with a public project and confidential issue' do
+ let(:public_project) { create(:project, :public) }
+ let(:confidential_issue) { create(:issue, :confidential, project: public_project, title: 'Confidential title') }
+
+ let(:text) { ":tada: Hello world! :100: #{confidential_issue.to_reference}" }
+ let(:params) { { text: text, gfm: true, project: public_project.full_path } }
+
+ shared_examples 'user without proper access' do
+ it 'does not render the title or link' do
+ expect(response).to have_http_status(201)
+ expect(json_response["html"]).not_to include('Confidential title')
+ expect(json_response["html"]).not_to include('<a href=')
+ expect(json_response["html"]).to include('Hello world!')
+ .and include('data-name="tada"')
+ .and include('data-name="100"')
+ .and include('#1</p>')
+ end
+ end
+
+ context 'when not logged in' do
+ let(:user) { }
+
+ it_behaves_like 'user without proper access'
+ end
+
+ context 'when logged in as user without access' do
+ let(:user) { create(:user) }
+
+ it_behaves_like 'user without proper access'
+ end
+
+ context 'when logged in as author' do
+ let(:user) { confidential_issue.author }
+
+ it 'renders the title or link' do
+ expect(response).to have_http_status(201)
+ expect(json_response["html"]).to include('Confidential title')
+ expect(json_response["html"]).to include('Hello world!')
+ .and include('data-name="tada"')
+ .and include('data-name="100"')
+ .and include("<a href=\"#{IssuesHelper.url_for_issue(confidential_issue.iid, public_project)}\"")
+ .and include("#1</a>")
+ end
+ end
+ end
end
end
end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 4de834bf93a..e4e0ca285e0 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -81,6 +81,35 @@ describe API::MergeRequests do
let(:user2) { create(:user) }
it 'returns an array of all merge requests except unauthorized ones' do
+ get api('/merge_requests', user), scope: :all
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |mr| mr['id'] })
+ .to contain_exactly(merge_request.id, merge_request_closed.id, merge_request_merged.id, merge_request_locked.id, merge_request2.id)
+ end
+
+ it "returns an array of no merge_requests when wip=yes" do
+ get api("/merge_requests", user), wip: 'yes'
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(0)
+ end
+
+ it "returns an array of no merge_requests when wip=no" do
+ get api("/merge_requests", user), wip: 'no'
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |mr| mr['id'] })
+ .to contain_exactly(merge_request.id, merge_request_closed.id, merge_request_merged.id, merge_request_locked.id, merge_request2.id)
+ end
+
+ it 'does not return unauthorized merge requests' do
private_project = create(:project, :private)
merge_request3 = create(:merge_request, :simple, source_project: private_project, target_project: private_project, source_branch: 'other-branch')
@@ -114,6 +143,23 @@ describe API::MergeRequests do
expect_response_ordered_exactly(merge_request3)
end
+ it 'returns an array of merge requests with no assignee' do
+ merge_request3 = create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, source_branch: 'other-branch')
+
+ get api('/merge_requests', user), assignee_id: 'None', scope: :all
+
+ expect_response_ordered_exactly(merge_request3)
+ end
+
+ it 'returns an array of merge requests with any assignee' do
+ # This MR with no assignee should not be returned
+ create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, source_branch: 'other-branch')
+
+ get api('/merge_requests', user), assignee_id: 'Any', scope: :all
+
+ expect_response_contain_exactly(merge_request, merge_request2, merge_request_closed, merge_request_merged, merge_request_locked)
+ end
+
it 'returns an array of merge requests assigned to me' do
merge_request3 = create(:merge_request, :simple, author: user, assignee: user2, source_project: project2, target_project: project2, source_branch: 'other-branch')
@@ -244,6 +290,15 @@ describe API::MergeRequests do
expect(response).to have_gitlab_http_status(404)
end
+ it "returns an array of no merge_requests when wip=yes" do
+ get api("/projects/#{project.id}/merge_requests", user), wip: 'yes'
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(0)
+ end
+
it 'returns merge_request by "iids" array' do
get api(endpoint_path, user), iids: [merge_request.iid, merge_request_closed.iid]
@@ -353,6 +408,15 @@ describe API::MergeRequests do
end
end
+ it 'returns the commits behind the target branch when include_diverged_commits_count is present' do
+ allow_any_instance_of(merge_request.class).to receive(:diverged_commits_count).and_return(1)
+
+ get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user), include_diverged_commits_count: true
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['diverged_commits_count']).to eq(1)
+ end
+
it "returns a 404 error if merge_request_iid not found" do
get api("/projects/#{project.id}/merge_requests/999", user)
expect(response).to have_gitlab_http_status(404)
diff --git a/spec/requests/api/pages/internal_access_spec.rb b/spec/requests/api/pages/internal_access_spec.rb
new file mode 100644
index 00000000000..c41eabe0a48
--- /dev/null
+++ b/spec/requests/api/pages/internal_access_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe "Internal Project Pages Access" do
+ using RSpec::Parameterized::TableSyntax
+ include AccessMatchers
+
+ set(:group) { create(:group) }
+ set(:project) { create(:project, :internal, pages_access_level: ProjectFeature::ENABLED, namespace: group) }
+
+ set(:admin) { create(:admin) }
+ set(:owner) { create(:user) }
+ set(:master) { create(:user) }
+ set(:developer) { create(:user) }
+ set(:reporter) { create(:user) }
+ set(:guest) { create(:user) }
+ set(:user) { create(:user) }
+
+ before do
+ allow(Gitlab.config.pages).to receive(:access_control).and_return(true)
+ group.add_owner(owner)
+ project.add_master(master)
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ describe "Project should be internal" do
+ describe '#internal?' do
+ subject { project.internal? }
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe "GET /projects/:id/pages_access" do
+ context 'access depends on the level' do
+ where(:pages_access_level, :with_user, :expected_result) do
+ ProjectFeature::DISABLED | "admin" | 403
+ ProjectFeature::DISABLED | "owner" | 403
+ ProjectFeature::DISABLED | "master" | 403
+ ProjectFeature::DISABLED | "developer" | 403
+ ProjectFeature::DISABLED | "reporter" | 403
+ ProjectFeature::DISABLED | "guest" | 403
+ ProjectFeature::DISABLED | "user" | 403
+ ProjectFeature::DISABLED | nil | 404
+ ProjectFeature::PUBLIC | "admin" | 200
+ ProjectFeature::PUBLIC | "owner" | 200
+ ProjectFeature::PUBLIC | "master" | 200
+ ProjectFeature::PUBLIC | "developer" | 200
+ ProjectFeature::PUBLIC | "reporter" | 200
+ ProjectFeature::PUBLIC | "guest" | 200
+ ProjectFeature::PUBLIC | "user" | 200
+ ProjectFeature::PUBLIC | nil | 404
+ ProjectFeature::ENABLED | "admin" | 200
+ ProjectFeature::ENABLED | "owner" | 200
+ ProjectFeature::ENABLED | "master" | 200
+ ProjectFeature::ENABLED | "developer" | 200
+ ProjectFeature::ENABLED | "reporter" | 200
+ ProjectFeature::ENABLED | "guest" | 200
+ ProjectFeature::ENABLED | "user" | 200
+ ProjectFeature::ENABLED | nil | 404
+ ProjectFeature::PRIVATE | "admin" | 200
+ ProjectFeature::PRIVATE | "owner" | 200
+ ProjectFeature::PRIVATE | "master" | 200
+ ProjectFeature::PRIVATE | "developer" | 200
+ ProjectFeature::PRIVATE | "reporter" | 200
+ ProjectFeature::PRIVATE | "guest" | 200
+ ProjectFeature::PRIVATE | "user" | 403
+ ProjectFeature::PRIVATE | nil | 404
+ end
+
+ with_them do
+ before do
+ project.project_feature.update(pages_access_level: pages_access_level)
+ end
+ it "correct return value" do
+ if !with_user.nil?
+ user = public_send(with_user)
+ get api("/projects/#{project.id}/pages_access", user)
+ else
+ get api("/projects/#{project.id}/pages_access")
+ end
+
+ expect(response).to have_gitlab_http_status(expected_result)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/pages/private_access_spec.rb b/spec/requests/api/pages/private_access_spec.rb
new file mode 100644
index 00000000000..d69c15b0477
--- /dev/null
+++ b/spec/requests/api/pages/private_access_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe "Private Project Pages Access" do
+ using RSpec::Parameterized::TableSyntax
+ include AccessMatchers
+
+ set(:group) { create(:group) }
+ set(:project) { create(:project, :private, pages_access_level: ProjectFeature::ENABLED, namespace: group) }
+
+ set(:admin) { create(:admin) }
+ set(:owner) { create(:user) }
+ set(:master) { create(:user) }
+ set(:developer) { create(:user) }
+ set(:reporter) { create(:user) }
+ set(:guest) { create(:user) }
+ set(:user) { create(:user) }
+
+ before do
+ allow(Gitlab.config.pages).to receive(:access_control).and_return(true)
+ group.add_owner(owner)
+ project.add_master(master)
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ describe "Project should be private" do
+ describe '#private?' do
+ subject { project.private? }
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe "GET /projects/:id/pages_access" do
+ context 'access depends on the level' do
+ where(:pages_access_level, :with_user, :expected_result) do
+ ProjectFeature::DISABLED | "admin" | 403
+ ProjectFeature::DISABLED | "owner" | 403
+ ProjectFeature::DISABLED | "master" | 403
+ ProjectFeature::DISABLED | "developer" | 403
+ ProjectFeature::DISABLED | "reporter" | 403
+ ProjectFeature::DISABLED | "guest" | 403
+ ProjectFeature::DISABLED | "user" | 404
+ ProjectFeature::DISABLED | nil | 404
+ ProjectFeature::PUBLIC | "admin" | 200
+ ProjectFeature::PUBLIC | "owner" | 200
+ ProjectFeature::PUBLIC | "master" | 200
+ ProjectFeature::PUBLIC | "developer" | 200
+ ProjectFeature::PUBLIC | "reporter" | 200
+ ProjectFeature::PUBLIC | "guest" | 200
+ ProjectFeature::PUBLIC | "user" | 404
+ ProjectFeature::PUBLIC | nil | 404
+ ProjectFeature::ENABLED | "admin" | 200
+ ProjectFeature::ENABLED | "owner" | 200
+ ProjectFeature::ENABLED | "master" | 200
+ ProjectFeature::ENABLED | "developer" | 200
+ ProjectFeature::ENABLED | "reporter" | 200
+ ProjectFeature::ENABLED | "guest" | 200
+ ProjectFeature::ENABLED | "user" | 404
+ ProjectFeature::ENABLED | nil | 404
+ ProjectFeature::PRIVATE | "admin" | 200
+ ProjectFeature::PRIVATE | "owner" | 200
+ ProjectFeature::PRIVATE | "master" | 200
+ ProjectFeature::PRIVATE | "developer" | 200
+ ProjectFeature::PRIVATE | "reporter" | 200
+ ProjectFeature::PRIVATE | "guest" | 200
+ ProjectFeature::PRIVATE | "user" | 404
+ ProjectFeature::PRIVATE | nil | 404
+ end
+
+ with_them do
+ before do
+ project.project_feature.update(pages_access_level: pages_access_level)
+ end
+ it "correct return value" do
+ if !with_user.nil?
+ user = public_send(with_user)
+ get api("/projects/#{project.id}/pages_access", user)
+ else
+ get api("/projects/#{project.id}/pages_access")
+ end
+
+ expect(response).to have_gitlab_http_status(expected_result)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/pages/public_access_spec.rb b/spec/requests/api/pages/public_access_spec.rb
new file mode 100644
index 00000000000..882ca26ac51
--- /dev/null
+++ b/spec/requests/api/pages/public_access_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe "Public Project Pages Access" do
+ using RSpec::Parameterized::TableSyntax
+ include AccessMatchers
+
+ set(:group) { create(:group) }
+ set(:project) { create(:project, :public, pages_access_level: ProjectFeature::ENABLED, namespace: group) }
+
+ set(:admin) { create(:admin) }
+ set(:owner) { create(:user) }
+ set(:master) { create(:user) }
+ set(:developer) { create(:user) }
+ set(:reporter) { create(:user) }
+ set(:guest) { create(:user) }
+ set(:user) { create(:user) }
+
+ before do
+ allow(Gitlab.config.pages).to receive(:access_control).and_return(true)
+ group.add_owner(owner)
+ project.add_master(master)
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ describe "Project should be public" do
+ describe '#public?' do
+ subject { project.public? }
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe "GET /projects/:id/pages_access" do
+ context 'access depends on the level' do
+ where(:pages_access_level, :with_user, :expected_result) do
+ ProjectFeature::DISABLED | "admin" | 403
+ ProjectFeature::DISABLED | "owner" | 403
+ ProjectFeature::DISABLED | "master" | 403
+ ProjectFeature::DISABLED | "developer" | 403
+ ProjectFeature::DISABLED | "reporter" | 403
+ ProjectFeature::DISABLED | "guest" | 403
+ ProjectFeature::DISABLED | "user" | 403
+ ProjectFeature::DISABLED | nil | 403
+ ProjectFeature::PUBLIC | "admin" | 200
+ ProjectFeature::PUBLIC | "owner" | 200
+ ProjectFeature::PUBLIC | "master" | 200
+ ProjectFeature::PUBLIC | "developer" | 200
+ ProjectFeature::PUBLIC | "reporter" | 200
+ ProjectFeature::PUBLIC | "guest" | 200
+ ProjectFeature::PUBLIC | "user" | 200
+ ProjectFeature::PUBLIC | nil | 200
+ ProjectFeature::ENABLED | "admin" | 200
+ ProjectFeature::ENABLED | "owner" | 200
+ ProjectFeature::ENABLED | "master" | 200
+ ProjectFeature::ENABLED | "developer" | 200
+ ProjectFeature::ENABLED | "reporter" | 200
+ ProjectFeature::ENABLED | "guest" | 200
+ ProjectFeature::ENABLED | "user" | 200
+ ProjectFeature::ENABLED | nil | 200
+ ProjectFeature::PRIVATE | "admin" | 200
+ ProjectFeature::PRIVATE | "owner" | 200
+ ProjectFeature::PRIVATE | "master" | 200
+ ProjectFeature::PRIVATE | "developer" | 200
+ ProjectFeature::PRIVATE | "reporter" | 200
+ ProjectFeature::PRIVATE | "guest" | 200
+ ProjectFeature::PRIVATE | "user" | 403
+ ProjectFeature::PRIVATE | nil | 403
+ end
+
+ with_them do
+ before do
+ project.project_feature.update(pages_access_level: pages_access_level)
+ end
+ it "correct return value" do
+ if !with_user.nil?
+ user = public_send(with_user)
+ get api("/projects/#{project.id}/pages_access", user)
+ else
+ get api("/projects/#{project.id}/pages_access")
+ end
+
+ expect(response).to have_gitlab_http_status(expected_result)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/pipelines_spec.rb b/spec/requests/api/pipelines_spec.rb
index 342a97b6a69..638cc9767d4 100644
--- a/spec/requests/api/pipelines_spec.rb
+++ b/spec/requests/api/pipelines_spec.rb
@@ -370,12 +370,18 @@ describe API::Pipelines do
end
context 'without gitlab-ci.yml' do
- it 'fails to create pipeline' do
- post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch
+ context 'without auto devops enabled' do
+ before do
+ project.update!(auto_devops_attributes: { enabled: false })
+ end
- expect(response).to have_gitlab_http_status(400)
- expect(json_response['message']['base'].first).to eq 'Missing .gitlab-ci.yml file'
- expect(json_response).not_to be_an Array
+ it 'fails to create pipeline' do
+ post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response['message']['base'].first).to eq 'Missing .gitlab-ci.yml file'
+ expect(json_response).not_to be_an Array
+ end
end
end
end
@@ -432,6 +438,67 @@ describe API::Pipelines do
end
end
+ describe 'DELETE /projects/:id/pipelines/:pipeline_id' do
+ context 'authorized user' do
+ let(:owner) { project.owner }
+
+ it 'destroys the pipeline' do
+ delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", owner)
+
+ expect(response).to have_gitlab_http_status(204)
+ expect { pipeline.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'returns 404 when it does not exist' do
+ delete api("/projects/#{project.id}/pipelines/123456", owner)
+
+ expect(response).to have_gitlab_http_status(404)
+ expect(json_response['message']).to eq '404 Not found'
+ end
+
+ it 'logs an audit event' do
+ expect { delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", owner) }.to change { SecurityEvent.count }.by(1)
+ end
+
+ context 'when the pipeline has jobs' do
+ let!(:build) { create(:ci_build, project: project, pipeline: pipeline) }
+
+ it 'destroys associated jobs' do
+ delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", owner)
+
+ expect(response).to have_gitlab_http_status(204)
+ expect { build.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+
+ context 'unauthorized user' do
+ context 'when user is not member' do
+ it 'should return a 404' do
+ delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", non_member)
+
+ expect(response).to have_gitlab_http_status(404)
+ expect(json_response['message']).to eq '404 Project Not Found'
+ end
+ end
+
+ context 'when user is developer' do
+ let(:developer) { create(:user) }
+
+ before do
+ project.add_developer(developer)
+ end
+
+ it 'should return a 403' do
+ delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", developer)
+
+ expect(response).to have_gitlab_http_status(403)
+ expect(json_response['message']).to eq '403 Forbidden'
+ end
+ end
+ end
+ end
+
describe 'POST /projects/:id/pipelines/:pipeline_id/retry' do
context 'authorized user' do
let!(:pipeline) do
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 45e4e35d773..0586025956f 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -4,8 +4,8 @@ describe API::ProjectExport do
set(:project) { create(:project) }
set(:project_none) { create(:project) }
set(:project_started) { create(:project) }
- set(:project_finished) { create(:project) }
- set(:project_after_export) { create(:project) }
+ let(:project_finished) { create(:project, :with_export) }
+ let(:project_after_export) { create(:project, :with_export) }
set(:user) { create(:user) }
set(:admin) { create(:admin) }
@@ -29,13 +29,7 @@ describe API::ProjectExport do
# simulate exporting work directory
FileUtils.mkdir_p File.join(project_started.export_path, 'securerandom-hex')
- # simulate exported
- FileUtils.mkdir_p project_finished.export_path
- FileUtils.touch File.join(project_finished.export_path, '_export.tar.gz')
-
# simulate in after export action
- FileUtils.mkdir_p project_after_export.export_path
- FileUtils.touch File.join(project_after_export.export_path, '_export.tar.gz')
FileUtils.touch Gitlab::ImportExport::AfterExportStrategies::BaseAfterExportStrategy.lock_file_path(project_after_export)
end
@@ -191,14 +185,11 @@ describe API::ProjectExport do
context 'when upload complete' do
before do
- FileUtils.rm_rf(project_after_export.export_path)
-
- if project_after_export.export_project_object_exists?
- upload = project_after_export.import_export_upload
+ project_after_export.remove_exports
+ end
- upload.remove_export_file!
- upload.save
- end
+ it 'has removed the export' do
+ expect(project_after_export.export_file_exists?).to be_falsey
end
it_behaves_like '404 response' do
@@ -273,13 +264,13 @@ describe API::ProjectExport do
before do
stub_uploads_object_storage(ImportExportUploader)
- [project, project_finished, project_after_export].each do |p|
- p.add_maintainer(user)
+ project.add_maintainer(user)
+ project_finished.add_maintainer(user)
+ project_after_export.add_maintainer(user)
- upload = ImportExportUpload.new(project: p)
- upload.export_file = fixture_file_upload('spec/fixtures/project_export.tar.gz', "`/tar.gz")
- upload.save!
- end
+ upload = ImportExportUpload.new(project: project)
+ upload.export_file = fixture_file_upload('spec/fixtures/project_export.tar.gz', "`/tar.gz")
+ upload.save!
end
it_behaves_like 'get project download by strategy'
diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb
index bc45a63d9f1..87997a48dc9 100644
--- a/spec/requests/api/project_hooks_spec.rb
+++ b/spec/requests/api/project_hooks_spec.rb
@@ -9,7 +9,8 @@ describe API::ProjectHooks, 'ProjectHooks' do
:all_events_enabled,
project: project,
url: 'http://example.com',
- enable_ssl_verification: true)
+ enable_ssl_verification: true,
+ push_events_branch_filter: 'master')
end
before do
@@ -38,6 +39,7 @@ describe API::ProjectHooks, 'ProjectHooks' do
expect(json_response.first['pipeline_events']).to eq(true)
expect(json_response.first['wiki_page_events']).to eq(true)
expect(json_response.first['enable_ssl_verification']).to eq(true)
+ expect(json_response.first['push_events_branch_filter']).to eq('master')
end
end
@@ -83,11 +85,6 @@ describe API::ProjectHooks, 'ProjectHooks' do
expect(response).to have_gitlab_http_status(403)
end
end
-
- it "returns a 404 error if hook id is not available" do
- get api("/projects/#{project.id}/hooks/1234", user)
- expect(response).to have_gitlab_http_status(404)
- end
end
describe "POST /projects/:id/hooks" do
@@ -95,7 +92,7 @@ describe API::ProjectHooks, 'ProjectHooks' do
expect do
post api("/projects/#{project.id}/hooks", user),
url: "http://example.com", issues_events: true, confidential_issues_events: true, wiki_page_events: true,
- job_events: true
+ job_events: true, push_events_branch_filter: 'some-feature-branch'
end.to change {project.hooks.count}.by(1)
expect(response).to have_gitlab_http_status(201)
@@ -111,6 +108,7 @@ describe API::ProjectHooks, 'ProjectHooks' do
expect(json_response['pipeline_events']).to eq(false)
expect(json_response['wiki_page_events']).to eq(true)
expect(json_response['enable_ssl_verification']).to eq(true)
+ expect(json_response['push_events_branch_filter']).to eq('some-feature-branch')
expect(json_response).not_to include('token')
end
@@ -137,7 +135,12 @@ describe API::ProjectHooks, 'ProjectHooks' do
end
it "returns a 422 error if url not valid" do
- post api("/projects/#{project.id}/hooks", user), "url" => "ftp://example.com"
+ post api("/projects/#{project.id}/hooks", user), url: "ftp://example.com"
+ expect(response).to have_gitlab_http_status(422)
+ end
+
+ it "returns a 422 error if branch filter is not valid" do
+ post api("/projects/#{project.id}/hooks", user), url: "http://example.com", push_events_branch_filter: '~badbranchname/'
expect(response).to have_gitlab_http_status(422)
end
end
diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb
index e3fb6cecce9..c8fa4754810 100644
--- a/spec/requests/api/project_import_spec.rb
+++ b/spec/requests/api/project_import_spec.rb
@@ -7,7 +7,6 @@ describe API::ProjectImport do
let(:namespace) { create(:group) }
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- stub_feature_flags(import_export_object_storage: true)
stub_uploads_object_storage(FileUploader)
namespace.add_owner(user)
@@ -42,7 +41,7 @@ describe API::ProjectImport do
expect(response).to have_gitlab_http_status(201)
end
- it 'does not shedule an import for a nampespace that does not exist' do
+ it 'does not schedule an import for a namespace that does not exist' do
expect_any_instance_of(Project).not_to receive(:import_schedule)
expect(::Projects::CreateService).not_to receive(:new)
diff --git a/spec/requests/api/project_milestones_spec.rb b/spec/requests/api/project_milestones_spec.rb
index 6c05c166bd6..62613aa5938 100644
--- a/spec/requests/api/project_milestones_spec.rb
+++ b/spec/requests/api/project_milestones_spec.rb
@@ -39,19 +39,6 @@ describe API::ProjectMilestones do
expect(response).to have_gitlab_http_status(404)
end
-
- it "rejects a member with reporter access from deleting a milestone" do
- delete api("/projects/#{project.id}/milestones/#{milestone.id}", reporter)
-
- expect(response).to have_gitlab_http_status(403)
- end
-
- it 'deletes the milestone when the user has developer access to the project' do
- delete api("/projects/#{project.id}/milestones/#{milestone.id}", user)
-
- expect(project.milestones.find_by_id(milestone.id)).to be_nil
- expect(response).to have_gitlab_http_status(204)
- end
end
describe 'PUT /projects/:id/milestones/:milestone_id to test observer on close' do
diff --git a/spec/requests/api/project_snippets_spec.rb b/spec/requests/api/project_snippets_spec.rb
index a3b5e8c6223..5dec0bc778c 100644
--- a/spec/requests/api/project_snippets_spec.rb
+++ b/spec/requests/api/project_snippets_spec.rb
@@ -116,6 +116,14 @@ describe API::ProjectSnippets do
expect(response).to have_gitlab_http_status(400)
end
+ it 'returns 400 for empty code field' do
+ params[:code] = ''
+
+ post api("/projects/#{project.id}/snippets/", admin), params
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
context 'when the snippet is spam' do
def create_snippet(project, snippet_params = {})
project.add_developer(user)
@@ -180,6 +188,14 @@ describe API::ProjectSnippets do
expect(response).to have_gitlab_http_status(400)
end
+ it 'returns 400 for empty code field' do
+ new_content = ''
+
+ put api("/projects/#{snippet.project.id}/snippets/#{snippet.id}/", admin), code: new_content
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
context 'when the snippet is spam' do
def update_snippet(snippet_params = {})
put api("/projects/#{snippet.project.id}/snippets/#{snippet.id}", admin), snippet_params
diff --git a/spec/requests/api/project_templates_spec.rb b/spec/requests/api/project_templates_spec.rb
new file mode 100644
index 00000000000..86e33f23951
--- /dev/null
+++ b/spec/requests/api/project_templates_spec.rb
@@ -0,0 +1,145 @@
+require 'spec_helper'
+
+describe API::ProjectTemplates do
+ let(:public_project) { create(:project, :public) }
+ let(:private_project) { create(:project, :private) }
+ let(:developer) { create(:user) }
+
+ before do
+ private_project.add_developer(developer)
+ end
+
+ describe 'GET /projects/:id/templates/:type' do
+ it 'returns dockerfiles' do
+ get api("/projects/#{public_project.id}/templates/dockerfiles")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ expect(json_response).to satisfy_one { |template| template['key'] == 'Binary' }
+ end
+
+ it 'returns gitignores' do
+ get api("/projects/#{public_project.id}/templates/gitignores")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ expect(json_response).to satisfy_one { |template| template['key'] == 'Actionscript' }
+ end
+
+ it 'returns gitlab_ci_ymls' do
+ get api("/projects/#{public_project.id}/templates/gitlab_ci_ymls")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ expect(json_response).to satisfy_one { |template| template['key'] == 'Android' }
+ end
+
+ it 'returns licenses' do
+ get api("/projects/#{public_project.id}/templates/licenses")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ expect(json_response).to satisfy_one { |template| template['key'] == 'mit' }
+ end
+
+ it 'returns 400 for an unknown template type' do
+ get api("/projects/#{public_project.id}/templates/unknown")
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'denies access to an anonymous user on a private project' do
+ get api("/projects/#{private_project.id}/templates/licenses")
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'permits access to a developer on a private project' do
+ get api("/projects/#{private_project.id}/templates/licenses", developer)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ end
+ end
+
+ describe 'GET /projects/:id/templates/licenses' do
+ it 'returns key and name for the listed licenses' do
+ get api("/projects/#{public_project.id}/templates/licenses")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/template_list')
+ end
+ end
+
+ describe 'GET /projects/:id/templates/:type/:key' do
+ it 'returns a specific dockerfile' do
+ get api("/projects/#{public_project.id}/templates/dockerfiles/Binary")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/template')
+ expect(json_response['name']).to eq('Binary')
+ end
+
+ it 'returns a specific gitignore' do
+ get api("/projects/#{public_project.id}/templates/gitignores/Actionscript")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/template')
+ expect(json_response['name']).to eq('Actionscript')
+ end
+
+ it 'returns a specific gitlab_ci_yml' do
+ get api("/projects/#{public_project.id}/templates/gitlab_ci_ymls/Android")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/template')
+ expect(json_response['name']).to eq('Android')
+ end
+
+ it 'returns a specific license' do
+ get api("/projects/#{public_project.id}/templates/licenses/mit")
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/license')
+ end
+
+ it 'returns 404 for an unknown specific template' do
+ get api("/projects/#{public_project.id}/templates/licenses/unknown")
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'denies access to an anonymous user on a private project' do
+ get api("/projects/#{private_project.id}/templates/licenses/mit")
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'permits access to a developer on a private project' do
+ get api("/projects/#{private_project.id}/templates/licenses/mit", developer)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/license')
+ end
+ end
+
+ describe 'GET /projects/:id/templates/licenses/:key' do
+ it 'fills placeholders in the license' do
+ get api("/projects/#{public_project.id}/templates/licenses/agpl-3.0"),
+ project: 'Project Placeholder',
+ fullname: 'Fullname Placeholder'
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('public_api/v4/license')
+
+ content = json_response['content']
+
+ expect(content).to include('Project Placeholder')
+ expect(content).to include("Copyright (C) #{Time.now.year} Fullname Placeholder")
+ end
+ end
+end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index eb41750bf47..62b6a3ce42e 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -20,7 +20,6 @@ describe API::Projects do
let(:admin) { create(:admin) }
let(:project) { create(:project, :repository, namespace: user.namespace) }
let(:project2) { create(:project, namespace: user.namespace) }
- let(:snippet) { create(:project_snippet, :public, author: user, project: project, title: 'example') }
let(:project_member) { create(:project_member, :developer, user: user3, project: project) }
let(:user4) { create(:user) }
let(:project3) do
@@ -149,6 +148,16 @@ describe API::Projects do
expect(json_response.first.keys).to include('open_issues_count')
end
+ it 'does not include projects marked for deletion' do
+ project.update(pending_delete: true)
+
+ get api('/projects', user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to be_an Array
+ expect(json_response.map { |p| p['id'] }).not_to include(project.id)
+ end
+
it 'does not include open_issues_count if issues are disabled' do
project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED)
@@ -191,6 +200,24 @@ describe API::Projects do
expect(json_response.first).to include 'statistics'
end
+ it "does not include license by default" do
+ get api('/projects', user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.first).not_to include('license', 'license_url')
+ end
+
+ it "does not include license if requested" do
+ get api('/projects', user), license: true
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.first).not_to include('license', 'license_url')
+ end
+
context 'when external issue tracker is enabled' do
let!(:jira_service) { create(:jira_service, project: project) }
@@ -403,7 +430,7 @@ describe API::Projects do
context 'and with min_access_level' do
before do
- project2.add_master(user2)
+ project2.add_maintainer(user2)
project3.add_developer(user2)
project4.add_reporter(user2)
end
@@ -558,6 +585,14 @@ describe API::Projects do
expect(json_response['visibility']).to eq('private')
end
+ it 'creates a new project initialized with a README.md' do
+ project = attributes_for(:project, initialize_with_readme: 1, name: 'somewhere')
+
+ post api('/projects', user), project
+
+ expect(json_response['readme_url']).to eql("#{Gitlab.config.gitlab.url}/#{json_response['namespace']['full_path']}/somewhere/blob/master/README.md")
+ end
+
it 'sets tag list to a project' do
project = attributes_for(:project, tag_list: %w[tagFirst tagSecond])
@@ -575,7 +610,7 @@ describe API::Projects do
expect(json_response['avatar_url']).to eq("http://localhost/uploads/-/system/project/avatar/#{project_id}/banana_sample.gif")
end
- it 'sets a project as allowing outdated diff discussions to automatically resolve' do
+ it 'sets a project as not allowing outdated diff discussions to automatically resolve' do
project = attributes_for(:project, resolve_outdated_diff_discussions: false)
post api('/projects', user), project
@@ -583,7 +618,7 @@ describe API::Projects do
expect(json_response['resolve_outdated_diff_discussions']).to be_falsey
end
- it 'sets a project as allowing outdated diff discussions to automatically resolve if resolve_outdated_diff_discussions' do
+ it 'sets a project as allowing outdated diff discussions to automatically resolve' do
project = attributes_for(:project, resolve_outdated_diff_discussions: true)
post api('/projects', user), project
@@ -698,7 +733,7 @@ describe API::Projects do
expect(json_response.map { |project| project['id'] }).to contain_exactly(public_project.id)
end
- it 'returns projects filetered by minimal access level' do
+ it 'returns projects filtered by minimal access level' do
private_project1 = create(:project, :private, name: 'private_project1', creator_id: user4.id, namespace: user4.namespace)
private_project2 = create(:project, :private, name: 'private_project2', creator_id: user4.id, namespace: user4.namespace)
private_project1.add_developer(user2)
@@ -789,7 +824,7 @@ describe API::Projects do
expect(json_response['visibility']).to eq('private')
end
- it 'sets a project as allowing outdated diff discussions to automatically resolve' do
+ it 'sets a project as not allowing outdated diff discussions to automatically resolve' do
project = attributes_for(:project, resolve_outdated_diff_discussions: false)
post api("/projects/user/#{user.id}", admin), project
@@ -914,12 +949,28 @@ describe API::Projects do
expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id)
expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name)
expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
+ expect(json_response['shared_with_groups'][0]['expires_at']).to be_nil
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to eq(project.only_allow_merge_if_pipeline_succeeds)
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
expect(json_response['merge_method']).to eq(project.merge_method.to_s)
expect(json_response['readme_url']).to eq(project.readme_url)
end
+ it 'returns a group link with expiration date' do
+ group = create(:group)
+ expires_at = 5.days.from_now.to_date
+ link = create(:project_group_link, project: project, group: group, expires_at: expires_at)
+
+ get api("/projects/#{project.id}", user)
+
+ expect(json_response['shared_with_groups']).to be_an Array
+ expect(json_response['shared_with_groups'].length).to eq(1)
+ expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id)
+ expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name)
+ expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
+ expect(json_response['shared_with_groups'][0]['expires_at']).to eq(expires_at.to_s)
+ end
+
it 'returns a project by path name' do
get api("/projects/#{project.id}", user)
expect(response).to have_gitlab_http_status(200)
@@ -961,6 +1012,26 @@ describe API::Projects do
})
end
+ it "does not include license fields by default" do
+ get api("/projects/#{project.id}", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).not_to include('license', 'license_url')
+ end
+
+ it 'includes license fields when requested' do
+ get api("/projects/#{project.id}", user), license: true
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['license']).to eq({
+ 'key' => project.repository.license.key,
+ 'name' => project.repository.license.name,
+ 'nickname' => project.repository.license.nickname,
+ 'html_url' => project.repository.license.url,
+ 'source_url' => project.repository.license.meta['source']
+ })
+ end
+
it "does not include statistics by default" do
get api("/projects/#{project.id}", user)
@@ -989,6 +1060,15 @@ describe API::Projects do
expect(json_response).not_to include("import_error")
end
+ it 'returns 404 when project is marked for deletion' do
+ project.update(pending_delete: true)
+
+ get api("/projects/#{project.id}", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ expect(json_response['message']).to eq('404 Project Not Found')
+ end
+
context 'links exposure' do
it 'exposes related resources full URIs' do
get api("/projects/#{project.id}", user)
@@ -1119,144 +1199,90 @@ describe API::Projects do
end
end
- describe 'GET /projects/:id/snippets' do
- before do
- snippet
- end
-
- it 'returns an array of project snippets' do
- get api("/projects/#{project.id}/snippets", user)
-
- expect(response).to have_gitlab_http_status(200)
- expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(snippet.title)
- end
- end
-
- describe 'GET /projects/:id/snippets/:snippet_id' do
- it 'returns a project snippet' do
- get api("/projects/#{project.id}/snippets/#{snippet.id}", user)
- expect(response).to have_gitlab_http_status(200)
- expect(json_response['title']).to eq(snippet.title)
- end
+ describe 'fork management' do
+ let(:project_fork_target) { create(:project) }
+ let(:project_fork_source) { create(:project, :public) }
+ let(:private_project_fork_source) { create(:project, :private) }
- it 'returns a 404 error if snippet id not found' do
- get api("/projects/#{project.id}/snippets/1234", user)
- expect(response).to have_gitlab_http_status(404)
- end
- end
+ describe 'POST /projects/:id/fork/:forked_from_id' do
+ context 'user is a developer' do
+ before do
+ project_fork_target.add_developer(user)
+ end
- describe 'POST /projects/:id/snippets' do
- it 'creates a new project snippet' do
- post api("/projects/#{project.id}/snippets", user),
- title: 'api test', file_name: 'sample.rb', code: 'test', visibility: 'private'
- expect(response).to have_gitlab_http_status(201)
- expect(json_response['title']).to eq('api test')
- end
+ it 'denies project to be forked from an existing project' do
+ post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user)
- it 'returns a 400 error if invalid snippet is given' do
- post api("/projects/#{project.id}/snippets", user)
- expect(status).to eq(400)
- end
- end
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
- describe 'PUT /projects/:id/snippets/:snippet_id' do
- it 'updates an existing project snippet' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- code: 'updated code'
- expect(response).to have_gitlab_http_status(200)
- expect(json_response['title']).to eq('example')
- expect(snippet.reload.content).to eq('updated code')
- end
+ it 'refreshes the forks count cache' do
+ expect(project_fork_source.forks_count).to be_zero
+ end
- it 'updates an existing project snippet with new title' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- title: 'other api test'
- expect(response).to have_gitlab_http_status(200)
- expect(json_response['title']).to eq('other api test')
- end
- end
+ context 'user is maintainer' do
+ before do
+ project_fork_target.add_maintainer(user)
+ end
- describe 'DELETE /projects/:id/snippets/:snippet_id' do
- before do
- snippet
- end
+ it 'allows project to be forked from an existing project' do
+ expect(project_fork_target).not_to be_forked
- it 'deletes existing project snippet' do
- expect do
- delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
+ post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user)
+ project_fork_target.reload
- expect(response).to have_gitlab_http_status(204)
- end.to change { Snippet.count }.by(-1)
- end
+ expect(response).to have_gitlab_http_status(201)
+ expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
+ expect(project_fork_target.fork_network_member).to be_present
+ expect(project_fork_target).to be_forked
+ end
- it 'returns 404 when deleting unknown snippet id' do
- delete api("/projects/#{project.id}/snippets/1234", user)
- expect(response).to have_gitlab_http_status(404)
- end
+ it 'denies project to be forked from a private project' do
+ post api("/projects/#{project_fork_target.id}/fork/#{private_project_fork_source.id}", user)
- it_behaves_like '412 response' do
- let(:request) { api("/projects/#{project.id}/snippets/#{snippet.id}", user) }
- end
- end
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
- describe 'GET /projects/:id/snippets/:snippet_id/raw' do
- it 'gets a raw project snippet' do
- get api("/projects/#{project.id}/snippets/#{snippet.id}/raw", user)
- expect(response).to have_gitlab_http_status(200)
- end
+ context 'user is admin' do
+ it 'allows project to be forked from an existing project' do
+ expect(project_fork_target).not_to be_forked
- it 'returns a 404 error if raw project snippet not found' do
- get api("/projects/#{project.id}/snippets/5555/raw", user)
- expect(response).to have_gitlab_http_status(404)
- end
- end
+ post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- describe 'fork management' do
- let(:project_fork_target) { create(:project) }
- let(:project_fork_source) { create(:project, :public) }
+ expect(response).to have_gitlab_http_status(201)
+ end
- describe 'POST /projects/:id/fork/:forked_from_id' do
- let(:new_project_fork_source) { create(:project, :public) }
+ it 'allows project to be forked from a private project' do
+ post api("/projects/#{project_fork_target.id}/fork/#{private_project_fork_source.id}", admin)
- it "is not available for non admin users" do
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user)
- expect(response).to have_gitlab_http_status(403)
- end
+ expect(response).to have_gitlab_http_status(201)
+ end
- it 'allows project to be forked from an existing project' do
- expect(project_fork_target.forked?).not_to be_truthy
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- expect(response).to have_gitlab_http_status(201)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- expect(project_fork_target.forked_project_link).not_to be_nil
- expect(project_fork_target.forked?).to be_truthy
- end
+ it 'refreshes the forks count cachce' do
+ expect do
+ post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
+ end.to change(project_fork_source, :forks_count).by(1)
+ end
- it 'refreshes the forks count cachce' do
- expect(project_fork_source.forks_count).to be_zero
+ it 'fails if forked_from project which does not exist' do
+ post api("/projects/#{project_fork_target.id}/fork/9999", admin)
+ expect(response).to have_gitlab_http_status(404)
+ end
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
+ it 'fails with 409 if already forked' do
+ other_project_fork_source = create(:project, :public)
- expect(project_fork_source.forks_count).to eq(1)
- end
+ Projects::ForkService.new(project_fork_source, admin).execute(project_fork_target)
- it 'fails if forked_from project which does not exist' do
- post api("/projects/#{project_fork_target.id}/fork/9999", admin)
- expect(response).to have_gitlab_http_status(404)
- end
+ post api("/projects/#{project_fork_target.id}/fork/#{other_project_fork_source.id}", admin)
+ project_fork_target.reload
- it 'fails with 409 if already forked' do
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- post api("/projects/#{project_fork_target.id}/fork/#{new_project_fork_source.id}", admin)
- expect(response).to have_gitlab_http_status(409)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- expect(project_fork_target.forked?).to be_truthy
+ expect(response).to have_gitlab_http_status(409)
+ expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
+ expect(project_fork_target).to be_forked
+ end
end
end
@@ -1278,8 +1304,8 @@ describe API::Projects do
before do
post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
project_fork_target.reload
- expect(project_fork_target.forked_from_project).not_to be_nil
- expect(project_fork_target.forked?).to be_truthy
+ expect(project_fork_target.forked_from_project).to be_present
+ expect(project_fork_target).to be_forked
end
it 'makes forked project unforked' do
@@ -1288,7 +1314,7 @@ describe API::Projects do
expect(response).to have_gitlab_http_status(204)
project_fork_target.reload
expect(project_fork_target.forked_from_project).to be_nil
- expect(project_fork_target.forked?).not_to be_truthy
+ expect(project_fork_target).not_to be_forked
end
it_behaves_like '412 response' do
@@ -1323,8 +1349,8 @@ describe API::Projects do
before do
post api("/projects/#{private_fork.id}/fork/#{project_fork_source.id}", admin)
private_fork.reload
- expect(private_fork.forked_from_project).not_to be_nil
- expect(private_fork.forked?).to be_truthy
+ expect(private_fork.forked_from_project).to be_present
+ expect(private_fork).to be_forked
project_fork_source.reload
expect(project_fork_source.forks.length).to eq(1)
expect(project_fork_source.forks).to include(private_fork)
diff --git a/spec/requests/api/protected_tags_spec.rb b/spec/requests/api/protected_tags_spec.rb
new file mode 100644
index 00000000000..f4f3ef31bc3
--- /dev/null
+++ b/spec/requests/api/protected_tags_spec.rb
@@ -0,0 +1,202 @@
+require 'spec_helper'
+
+describe API::ProtectedTags do
+ let(:user) { create(:user) }
+ let!(:project) { create(:project, :repository) }
+ let(:project2) { create(:project, path: 'project2', namespace: user.namespace) }
+ let(:protected_name) { 'feature' }
+ let(:tag_name) { protected_name }
+ let!(:protected_tag) do
+ create(:protected_tag, project: project, name: protected_name)
+ end
+
+ describe 'GET /projects/:id/protected_tags' do
+ let(:route) { "/projects/#{project.id}/protected_tags" }
+
+ shared_examples_for 'protected tags' do
+ it 'returns the protected tags' do
+ get api(route, user), per_page: 100
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+
+ protected_tag_names = json_response.map { |x| x['name'] }
+ expected_tags_names = project.protected_tags.map { |x| x['name'] }
+ expect(protected_tag_names).to match_array(expected_tags_names)
+ end
+ end
+
+ context 'when authenticated as a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it_behaves_like 'protected tags'
+ end
+
+ context 'when authenticated as a guest' do
+ before do
+ project.add_guest(user)
+ end
+
+ it_behaves_like '403 response' do
+ let(:request) { get api(route, user) }
+ end
+ end
+ end
+
+ describe 'GET /projects/:id/protected_tags/:tag' do
+ let(:route) { "/projects/#{project.id}/protected_tags/#{tag_name}" }
+
+ shared_examples_for 'protected tag' do
+ it 'returns the protected tag' do
+ get api(route, user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['name']).to eq(tag_name)
+ expect(json_response['create_access_levels'][0]['access_level']).to eq(::Gitlab::Access::MAINTAINER)
+ end
+
+ context 'when protected tag does not exist' do
+ let(:tag_name) { 'unknown' }
+
+ it_behaves_like '404 response' do
+ let(:request) { get api(route, user) }
+ let(:message) { '404 Not found' }
+ end
+ end
+ end
+
+ context 'when authenticated as a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it_behaves_like 'protected tag'
+
+ context 'when protected tag contains a wildcard' do
+ let(:protected_name) { 'feature*' }
+
+ it_behaves_like 'protected tag'
+ end
+ end
+
+ context 'when authenticated as a guest' do
+ before do
+ project.add_guest(user)
+ end
+
+ it_behaves_like '403 response' do
+ let(:request) { get api(route, user) }
+ end
+ end
+ end
+
+ describe 'POST /projects/:id/protected_tags' do
+ let(:tag_name) { 'new_tag' }
+
+ context 'when authenticated as a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'protects a single tag with maintainers can create tags' do
+ post api("/projects/#{project.id}/protected_tags", user), name: tag_name
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['name']).to eq(tag_name)
+ expect(json_response['create_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
+ end
+
+ it 'protects a single tag with developers can create tags' do
+ post api("/projects/#{project.id}/protected_tags", user),
+ name: tag_name, create_access_level: 30
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['name']).to eq(tag_name)
+ expect(json_response['create_access_levels'][0]['access_level']).to eq(Gitlab::Access::DEVELOPER)
+ end
+
+ it 'protects a single tag with no one can create tags' do
+ post api("/projects/#{project.id}/protected_tags", user),
+ name: tag_name, create_access_level: 0
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['name']).to eq(tag_name)
+ expect(json_response['create_access_levels'][0]['access_level']).to eq(Gitlab::Access::NO_ACCESS)
+ end
+
+ it 'returns a 422 error if the same tag is protected twice' do
+ post api("/projects/#{project.id}/protected_tags", user), name: protected_name
+
+ expect(response).to have_gitlab_http_status(422)
+ expect(json_response['message'][0]).to eq('Name has already been taken')
+ end
+
+ it 'returns 201 if the same tag is proteted on different projects' do
+ post api("/projects/#{project.id}/protected_tags", user), name: protected_name
+ post api("/projects/#{project2.id}/protected_tags", user), name: protected_name
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['name']).to eq(protected_name)
+ end
+
+ context 'when tag has a wildcard in its name' do
+ let(:tag_name) { 'feature/*' }
+
+ it 'protects multiple tags with a wildcard in the name' do
+ post api("/projects/#{project.id}/protected_tags", user), name: tag_name
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['name']).to eq(tag_name)
+ expect(json_response['create_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
+ end
+ end
+ end
+
+ context 'when authenticated as a guest' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns a 403 error if guest' do
+ post api("/projects/#{project.id}/protected_tags/", user), name: tag_name
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+ end
+
+ describe 'DELETE /projects/:id/protected_tags/unprotect/:tag' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'unprotects a single tag' do
+ delete api("/projects/#{project.id}/protected_tags/#{tag_name}", user)
+
+ expect(response).to have_gitlab_http_status(204)
+ end
+
+ it_behaves_like '412 response' do
+ let(:request) { api("/projects/#{project.id}/protected_tags/#{tag_name}", user) }
+ end
+
+ it "returns 404 if tag does not exist" do
+ delete api("/projects/#{project.id}/protected_tags/barfoo", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ context 'when tag has a wildcard in its name' do
+ let(:protected_name) { 'feature*' }
+
+ it 'unprotects a wildcard tag' do
+ delete api("/projects/#{project.id}/protected_tags/#{tag_name}", user)
+
+ expect(response).to have_gitlab_http_status(204)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/redacted_events_spec.rb b/spec/requests/api/redacted_events_spec.rb
new file mode 100644
index 00000000000..086dd3df9ba
--- /dev/null
+++ b/spec/requests/api/redacted_events_spec.rb
@@ -0,0 +1,68 @@
+require 'spec_helper'
+
+describe 'Redacted events in API::Events' do
+ shared_examples 'private events are redacted' do
+ it 'redacts events the user does not have access to' do
+ expect_any_instance_of(Event).to receive(:visible_to_user?).and_call_original
+
+ get api(path), user
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to contain_exactly(
+ 'project_id' => nil,
+ 'action_name' => nil,
+ 'target_id' => nil,
+ 'target_iid' => nil,
+ 'target_type' => nil,
+ 'author_id' => nil,
+ 'target_title' => 'Confidential event',
+ 'created_at' => nil,
+ 'author_username' => nil
+ )
+ end
+ end
+
+ describe '/users/:id/events' do
+ let(:project) { create(:project, :public) }
+ let(:path) { "/users/#{project.owner.id}/events" }
+ let(:issue) { create(:issue, :confidential, project: project) }
+
+ before do
+ EventCreateService.new.open_issue(issue, issue.author)
+ end
+
+ context 'unauthenticated user views another user with private events' do
+ let(:user) { nil }
+
+ include_examples 'private events are redacted'
+ end
+
+ context 'authenticated user without access views another user with private events' do
+ let(:user) { create(:user) }
+
+ include_examples 'private events are redacted'
+ end
+ end
+
+ describe '/projects/:id/events' do
+ let(:project) { create(:project, :public) }
+ let(:path) { "/projects/#{project.id}/events" }
+ let(:issue) { create(:issue, :confidential, project: project) }
+
+ before do
+ EventCreateService.new.open_issue(issue, issue.author)
+ end
+
+ context 'unauthenticated user views public project' do
+ let(:user) { nil }
+
+ include_examples 'private events are redacted'
+ end
+
+ context 'authenticated user without access views public project' do
+ let(:user) { create(:user) }
+
+ include_examples 'private events are redacted'
+ end
+ end
+end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 519638ebb82..fa38751fe58 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -468,7 +468,7 @@ describe API::Repositories do
describe 'GET :id/repository/merge_base' do
let(:refs) do
- %w(304d257dcb821665ab5110318fc58a007bd104ed 0031876facac3f2b2702a0e53a26e89939a42209)
+ %w(304d257dcb821665ab5110318fc58a007bd104ed 0031876facac3f2b2702a0e53a26e89939a42209 570e7b2abdd848b95f2f578043fc23bd6f6fd24d)
end
subject(:request) do
@@ -534,7 +534,7 @@ describe API::Repositories do
request
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']).to eq('Provide exactly 2 refs')
+ expect(json_response['message']).to eq('Provide at least 2 refs')
end
end
end
diff --git a/spec/requests/api/resource_label_events_spec.rb b/spec/requests/api/resource_label_events_spec.rb
new file mode 100644
index 00000000000..b7d4a5152cc
--- /dev/null
+++ b/spec/requests/api/resource_label_events_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe API::ResourceLabelEvents do
+ set(:user) { create(:user) }
+ set(:project) { create(:project, :public, :repository, namespace: user.namespace) }
+ set(:private_user) { create(:user) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ shared_examples 'resource_label_events API' do |parent_type, eventable_type, id_name|
+ describe "GET /#{parent_type}/:id/#{eventable_type}/:noteable_id/resource_label_events" do
+ it "returns an array of resource label events" do
+ get api("/#{parent_type}/#{parent.id}/#{eventable_type}/#{eventable[id_name]}/resource_label_events", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.first['id']).to eq(event.id)
+ end
+
+ it "returns a 404 error when eventable id not found" do
+ get api("/#{parent_type}/#{parent.id}/#{eventable_type}/12345/resource_label_events", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it "returns 404 when not authorized" do
+ parent.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+
+ get api("/#{parent_type}/#{parent.id}/#{eventable_type}/#{eventable[id_name]}/resource_label_events", private_user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ describe "GET /#{parent_type}/:id/#{eventable_type}/:noteable_id/resource_label_events/:event_id" do
+ it "returns a resource label event by id" do
+ get api("/#{parent_type}/#{parent.id}/#{eventable_type}/#{eventable[id_name]}/resource_label_events/#{event.id}", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['id']).to eq(event.id)
+ end
+
+ it "returns a 404 error if resource label event not found" do
+ get api("/#{parent_type}/#{parent.id}/#{eventable_type}/#{eventable[id_name]}/resource_label_events/12345", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ context 'when eventable is an Issue' do
+ let(:issue) { create(:issue, project: project, author: user) }
+
+ it_behaves_like 'resource_label_events API', 'projects', 'issues', 'iid' do
+ let(:parent) { project }
+ let(:eventable) { issue }
+ let!(:event) { create(:resource_label_event, issue: issue) }
+ end
+ end
+
+ context 'when eventable is a Merge Request' do
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) }
+
+ it_behaves_like 'resource_label_events API', 'projects', 'merge_requests', 'iid' do
+ let(:parent) { project }
+ let(:eventable) { merge_request }
+ let!(:event) { create(:resource_label_event, merge_request: merge_request) }
+ end
+ end
+end
diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb
index 43ceb332cfb..909703a8d47 100644
--- a/spec/requests/api/runner_spec.rb
+++ b/spec/requests/api/runner_spec.rb
@@ -797,6 +797,24 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
it { expect(job).to be_runner_system_failure }
end
+
+ context 'when failure_reason is unrecognized value' do
+ before do
+ update_job(state: 'failed', failure_reason: 'what_is_this')
+ job.reload
+ end
+
+ it { expect(job).to be_unknown_failure }
+ end
+
+ context 'when failure_reason is job_execution_timeout' do
+ before do
+ update_job(state: 'failed', failure_reason: 'job_execution_timeout')
+ job.reload
+ end
+
+ it { expect(job).to be_job_execution_timeout }
+ end
end
context 'when trace is given' do
diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb
index 3ebdb54f71f..49a79d2ccf9 100644
--- a/spec/requests/api/runners_spec.rb
+++ b/spec/requests/api/runners_spec.rb
@@ -25,36 +25,71 @@ describe API::Runners do
describe 'GET /runners' do
context 'authorized user' do
- it 'returns user available runners' do
+ it 'returns response status and headers' do
get api('/runners', user)
- shared = json_response.any? { |r| r['is_shared'] }
- descriptions = json_response.map { |runner| runner['description'] }
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response[0]).to have_key('ip_address')
- expect(descriptions).to contain_exactly(
- 'Project runner', 'Two projects runner', 'Group runner'
- )
- expect(shared).to be_falsey
+ end
+
+ it 'returns user available runners' do
+ get api('/runners', user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner'),
+ a_hash_including('description' => 'Group runner')
+ ]
end
it 'filters runners by scope' do
- get api('/runners?scope=active', user)
+ create(:ci_runner, :project, :inactive, description: 'Inactive project runner', projects: [project])
+
+ get api('/runners?scope=paused', user)
- shared = json_response.any? { |r| r['is_shared'] }
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response[0]).to have_key('ip_address')
- expect(shared).to be_falsey
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Inactive project runner')
+ ]
end
it 'avoids filtering if scope is invalid' do
get api('/runners?scope=unknown', user)
expect(response).to have_gitlab_http_status(400)
end
+
+ it 'filters runners by type' do
+ get api('/runners?type=project_type', user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner')
+ ]
+ end
+
+ it 'does not filter by invalid type' do
+ get api('/runners?type=bogus', user)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'filters runners by status' do
+ create(:ci_runner, :project, :inactive, description: 'Inactive project runner', projects: [project])
+
+ get api('/runners?status=paused', user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Inactive project runner')
+ ]
+ end
+
+ it 'does not filter by invalid status' do
+ get api('/runners?status=bogus', user)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
end
context 'unauthorized user' do
@@ -69,51 +104,91 @@ describe API::Runners do
describe 'GET /runners/all' do
context 'authorized user' do
context 'with admin privileges' do
+ it 'returns response status and headers' do
+ get api('/runners/all', admin)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ end
+
it 'returns all runners' do
get api('/runners/all', admin)
- shared = json_response.any? { |r| r['is_shared'] }
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner'),
+ a_hash_including('description' => 'Group runner'),
+ a_hash_including('description' => 'Shared runner')
+ ]
+ end
+
+ it 'filters runners by scope' do
+ get api('/runners/all?scope=shared', admin)
+
+ shared = json_response.all? { |r| r['is_shared'] }
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(json_response[0]).to have_key('ip_address')
expect(shared).to be_truthy
end
- end
- context 'without admin privileges' do
- it 'does not return runners list' do
- get api('/runners/all', user)
+ it 'filters runners by scope' do
+ get api('/runners/all?scope=specific', admin)
- expect(response).to have_gitlab_http_status(403)
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner'),
+ a_hash_including('description' => 'Group runner')
+ ]
end
- end
- it 'filters runners by scope' do
- get api('/runners/all?scope=shared', admin)
+ it 'avoids filtering if scope is invalid' do
+ get api('/runners/all?scope=unknown', admin)
+ expect(response).to have_gitlab_http_status(400)
+ end
- shared = json_response.all? { |r| r['is_shared'] }
- expect(response).to have_gitlab_http_status(200)
- expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response[0]).to have_key('ip_address')
- expect(shared).to be_truthy
- end
+ it 'filters runners by type' do
+ get api('/runners/all?type=project_type', admin)
- it 'filters runners by scope' do
- get api('/runners/all?scope=specific', admin)
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner')
+ ]
+ end
- shared = json_response.any? { |r| r['is_shared'] }
- expect(response).to have_gitlab_http_status(200)
- expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response[0]).to have_key('ip_address')
- expect(shared).to be_falsey
+ it 'does not filter by invalid type' do
+ get api('/runners/all?type=bogus', admin)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'filters runners by status' do
+ create(:ci_runner, :project, :inactive, description: 'Inactive project runner', projects: [project])
+
+ get api('/runners/all?status=paused', admin)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Inactive project runner')
+ ]
+ end
+
+ it 'does not filter by invalid status' do
+ get api('/runners/all?status=bogus', admin)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
end
- it 'avoids filtering if scope is invalid' do
- get api('/runners?scope=unknown', admin)
- expect(response).to have_gitlab_http_status(400)
+ context 'without admin privileges' do
+ it 'does not return runners list' do
+ get api('/runners/all', user)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
end
end
@@ -577,15 +652,69 @@ describe API::Runners do
describe 'GET /projects/:id/runners' do
context 'authorized user with maintainer privileges' do
- it "returns project's runners" do
+ it 'returns response status and headers' do
+ get api('/runners/all', admin)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ end
+
+ it 'returns all runners' do
get api("/projects/#{project.id}/runners", user)
- shared = json_response.any? { |r| r['is_shared'] }
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner'),
+ a_hash_including('description' => 'Shared runner')
+ ]
+ end
+
+ it 'filters runners by scope' do
+ get api("/projects/#{project.id}/runners?scope=specific", user)
+
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response[0]).to have_key('ip_address')
- expect(shared).to be_truthy
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner')
+ ]
+ end
+
+ it 'avoids filtering if scope is invalid' do
+ get api("/projects/#{project.id}/runners?scope=unknown", user)
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'filters runners by type' do
+ get api("/projects/#{project.id}/runners?type=project_type", user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Project runner'),
+ a_hash_including('description' => 'Two projects runner')
+ ]
+ end
+
+ it 'does not filter by invalid type' do
+ get api("/projects/#{project.id}/runners?type=bogus", user)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'filters runners by status' do
+ create(:ci_runner, :project, :inactive, description: 'Inactive project runner', projects: [project])
+
+ get api("/projects/#{project.id}/runners?status=paused", user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Inactive project runner')
+ ]
+ end
+
+ it 'does not filter by invalid status' do
+ get api("/projects/#{project.id}/runners?status=bogus", user)
+
+ expect(response).to have_gitlab_http_status(400)
end
end
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 3e0f47b84a1..84c7210f6bb 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -2,18 +2,17 @@ require 'spec_helper'
describe API::Settings, 'Settings' do
let(:user) { create(:user) }
- let(:admin) { create(:admin) }
+ set(:admin) { create(:admin) }
describe "GET /application/settings" do
it "returns application settings" do
get api("/application/settings", admin)
+
expect(response).to have_gitlab_http_status(200)
expect(json_response).to be_an Hash
expect(json_response['default_projects_limit']).to eq(42)
expect(json_response['password_authentication_enabled_for_web']).to be_truthy
expect(json_response['repository_storages']).to eq(['default'])
- expect(json_response['koding_enabled']).to be_falsey
- expect(json_response['koding_url']).to be_nil
expect(json_response['plantuml_enabled']).to be_falsey
expect(json_response['plantuml_url']).to be_nil
expect(json_response['default_project_visibility']).to be_a String
@@ -23,7 +22,6 @@ describe API::Settings, 'Settings' do
expect(json_response['dsa_key_restriction']).to eq(0)
expect(json_response['ecdsa_key_restriction']).to eq(0)
expect(json_response['ed25519_key_restriction']).to eq(0)
- expect(json_response['circuitbreaker_failure_count_threshold']).not_to be_nil
expect(json_response['performance_bar_allowed_group_id']).to be_nil
expect(json_response['instance_statistics_visibility_private']).to be(false)
expect(json_response).not_to have_key('performance_bar_allowed_group_path')
@@ -47,8 +45,6 @@ describe API::Settings, 'Settings' do
default_projects_limit: 3,
password_authentication_enabled_for_web: false,
repository_storages: ['custom'],
- koding_enabled: true,
- koding_url: 'http://koding.example.com',
plantuml_enabled: true,
plantuml_url: 'http://plantuml.example.com',
default_snippet_visibility: 'internal',
@@ -62,18 +58,16 @@ describe API::Settings, 'Settings' do
dsa_key_restriction: 2048,
ecdsa_key_restriction: 384,
ed25519_key_restriction: 256,
- circuitbreaker_check_interval: 2,
enforce_terms: true,
terms: 'Hello world!',
performance_bar_allowed_group_path: group.full_path,
- instance_statistics_visibility_private: true
+ instance_statistics_visibility_private: true,
+ diff_max_patch_bytes: 150_000
expect(response).to have_gitlab_http_status(200)
expect(json_response['default_projects_limit']).to eq(3)
expect(json_response['password_authentication_enabled_for_web']).to be_falsey
expect(json_response['repository_storages']).to eq(['custom'])
- expect(json_response['koding_enabled']).to be_truthy
- expect(json_response['koding_url']).to eq('http://koding.example.com')
expect(json_response['plantuml_enabled']).to be_truthy
expect(json_response['plantuml_url']).to eq('http://plantuml.example.com')
expect(json_response['default_snippet_visibility']).to eq('internal')
@@ -87,11 +81,11 @@ describe API::Settings, 'Settings' do
expect(json_response['dsa_key_restriction']).to eq(2048)
expect(json_response['ecdsa_key_restriction']).to eq(384)
expect(json_response['ed25519_key_restriction']).to eq(256)
- expect(json_response['circuitbreaker_check_interval']).to eq(2)
expect(json_response['enforce_terms']).to be(true)
expect(json_response['terms']).to eq('Hello world!')
expect(json_response['performance_bar_allowed_group_id']).to eq(group.id)
expect(json_response['instance_statistics_visibility_private']).to be(true)
+ expect(json_response['diff_max_patch_bytes']).to eq(150_000)
end
end
@@ -112,15 +106,6 @@ describe API::Settings, 'Settings' do
expect(json_response['performance_bar_allowed_group_id']).to be_nil
end
- context "missing koding_url value when koding_enabled is true" do
- it "returns a blank parameter error message" do
- put api("/application/settings", admin), koding_enabled: true
-
- expect(response).to have_gitlab_http_status(400)
- expect(json_response['error']).to eq('koding_url is missing')
- end
- end
-
context "missing plantuml_url value when plantuml_enabled is true" do
it "returns a blank parameter error message" do
put api("/application/settings", admin), plantuml_enabled: true
diff --git a/spec/requests/api/submodules_spec.rb b/spec/requests/api/submodules_spec.rb
new file mode 100644
index 00000000000..fa447c028c2
--- /dev/null
+++ b/spec/requests/api/submodules_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe API::Submodules do
+ let(:user) { create(:user) }
+ let!(:project) { create(:project, :repository, namespace: user.namespace ) }
+ let(:guest) { create(:user) { |u| project.add_guest(u) } }
+ let(:submodule) { 'six' }
+ let(:commit_sha) { 'e25eda1fece24ac7a03624ed1320f82396f35bd8' }
+ let(:branch) { 'master' }
+ let(:commit_message) { 'whatever' }
+
+ let(:params) do
+ {
+ submodule: submodule,
+ commit_sha: commit_sha,
+ branch: branch,
+ commit_message: commit_message
+ }
+ end
+
+ before do
+ project.add_developer(user)
+ end
+
+ def route(submodule = nil)
+ "/projects/#{project.id}/repository/submodules/#{submodule}"
+ end
+
+ describe "PUT /projects/:id/repository/submodule/:submodule" do
+ context 'when unauthenticated' do
+ it 'returns 401' do
+ put api(route(submodule)), params
+
+ expect(response).to have_gitlab_http_status(401)
+ end
+ end
+
+ context 'when authenticated', 'as a guest' do
+ it 'returns 403' do
+ put api(route(submodule), guest), params
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'when authenticated', 'as a developer' do
+ it 'returns 400 if params is missing' do
+ put api(route(submodule), user)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'returns 400 if branch is missing' do
+ put api(route(submodule), user), params.except(:branch)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'returns 400 if commit_sha is missing' do
+ put api(route(submodule), user), params.except(:commit_sha)
+
+ expect(response).to have_gitlab_http_status(400)
+ end
+
+ it 'returns the commmit' do
+ head_commit = project.repository.commit.id
+
+ put api(route(submodule), user), params
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['message']).to eq commit_message
+ expect(json_response['author_name']).to eq user.name
+ expect(json_response['committer_name']).to eq user.name
+ expect(json_response['parent_ids'].first).to eq head_commit
+ end
+
+ context 'when the submodule name is urlencoded' do
+ let(:submodule) { 'test_inside_folder/another_folder/six' }
+ let(:branch) { 'submodule_inside_folder' }
+ let(:encoded_submodule) { CGI.escape(submodule) }
+
+ it 'returns the commmit' do
+ expect(Submodules::UpdateService)
+ .to receive(:new)
+ .with(any_args, hash_including(submodule: submodule))
+ .and_call_original
+
+ put api(route(encoded_submodule), user), params
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['id']).to eq project.repository.commit(branch).id
+ expect(project.repository.blob_at(branch, submodule).id).to eq commit_sha
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/templates_spec.rb b/spec/requests/api/templates_spec.rb
index 6bb53fdc98d..d1e16ab9ca9 100644
--- a/spec/requests/api/templates_spec.rb
+++ b/spec/requests/api/templates_spec.rb
@@ -56,6 +56,8 @@ describe API::Templates do
end
it 'returns a license template' do
+ expect(response).to have_gitlab_http_status(200)
+
expect(json_response['key']).to eq('mit')
expect(json_response['name']).to eq('MIT License')
expect(json_response['nickname']).to be_nil
@@ -181,6 +183,7 @@ describe API::Templates do
it 'replaces the copyright owner placeholder with the name of the current user' do
get api('/templates/licenses/mit', user)
+ expect(response).to have_gitlab_http_status(200)
expect(json_response['content']).to include("Copyright (c) #{Time.now.year} #{user.name}")
end
end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index d48d577afa1..bb913ae0e79 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -51,6 +51,15 @@ describe API::Users do
expect(json_response[0]['username']).to eq(user.username)
end
+ it "returns the user when a valid `username` parameter is passed (case insensitive)" do
+ get api("/users"), username: user.username.upcase
+
+ expect(response).to match_response_schema('public_api/v4/user/basics')
+ expect(json_response.size).to eq(1)
+ expect(json_response[0]['id']).to eq(user.id)
+ expect(json_response[0]['username']).to eq(user.username)
+ end
+
it "returns an empty response when an invalid `username` parameter is passed" do
get api("/users"), username: 'invalid'
@@ -132,6 +141,14 @@ describe API::Users do
expect(json_response.first['username']).to eq(omniauth_user.username)
end
+ it "returns one user (case insensitive)" do
+ get api("/users?username=#{omniauth_user.username.upcase}", user)
+
+ expect(response).to match_response_schema('public_api/v4/user/basics')
+ expect(response).to include_pagination_headers
+ expect(json_response.first['username']).to eq(omniauth_user.username)
+ end
+
it "returns a 403 when non-admin user searches by external UID" do
get api("/users?extern_uid=#{omniauth_user.identities.first.extern_uid}&provider=#{omniauth_user.identities.first.provider}", user)
@@ -343,6 +360,12 @@ describe API::Users do
let(:path) { "/users/#{user.username}/status" }
end
end
+
+ context 'when finding the user by username (case insensitive)' do
+ it_behaves_like 'rendering user status' do
+ let(:path) { "/users/#{user.username.upcase}/status" }
+ end
+ end
end
describe "POST /users" do
@@ -528,6 +551,18 @@ describe API::Users do
expect(json_response['message']).to eq('Username has already been taken')
end
+ it 'returns 409 conflict error if same username exists (case insensitive)' do
+ expect do
+ post api('/users', admin),
+ name: 'foo',
+ email: 'foo@example.com',
+ password: 'password',
+ username: 'TEST'
+ end.to change { User.count }.by(0)
+ expect(response).to have_gitlab_http_status(409)
+ expect(json_response['message']).to eq('Username has already been taken')
+ end
+
it 'creates user with new identity' do
post api("/users", admin), attributes_for(:user, provider: 'github', extern_uid: '67890')
@@ -749,6 +784,14 @@ describe API::Users do
expect(response).to have_gitlab_http_status(409)
expect(@user.reload.username).to eq(@user.username)
end
+
+ it 'returns 409 conflict error if username taken (case insensitive)' do
+ @user_id = User.all.last.id
+ put api("/users/#{@user.id}", admin), username: 'TEST'
+
+ expect(response).to have_gitlab_http_status(409)
+ expect(@user.reload.username).to eq(@user.username)
+ end
end
end
@@ -785,35 +828,25 @@ describe API::Users do
end
describe 'GET /user/:id/keys' do
- before do
- admin
- end
+ it 'returns 404 for non-existing user' do
+ user_id = not_existing_user_id
- context 'when unauthenticated' do
- it 'returns authentication error' do
- get api("/users/#{user.id}/keys")
- expect(response).to have_gitlab_http_status(401)
- end
- end
+ get api("/users/#{user_id}/keys")
- context 'when authenticated' do
- it 'returns 404 for non-existing user' do
- get api('/users/999999/keys', admin)
- expect(response).to have_gitlab_http_status(404)
- expect(json_response['message']).to eq('404 User Not Found')
- end
+ expect(response).to have_gitlab_http_status(404)
+ expect(json_response['message']).to eq('404 User Not Found')
+ end
- it 'returns array of ssh keys' do
- user.keys << key
- user.save
+ it 'returns array of ssh keys' do
+ user.keys << key
+ user.save
- get api("/users/#{user.id}/keys", admin)
+ get api("/users/#{user.id}/keys")
- expect(response).to have_gitlab_http_status(200)
- expect(response).to include_pagination_headers
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(key.title)
- end
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.first['title']).to eq(key.title)
end
end
@@ -1031,11 +1064,14 @@ describe API::Users do
expect(json_response['error']).to eq('email is missing')
end
- it "creates email" do
+ it "creates unverified email" do
email_attrs = attributes_for :email
expect do
post api("/users/#{user.id}/emails", admin), email_attrs
end.to change { user.emails.count }.by(1)
+
+ email = Email.find_by(user_id: user.id, email: email_attrs[:email])
+ expect(email).not_to be_confirmed
end
it "returns a 400 for invalid ID" do
@@ -1043,6 +1079,18 @@ describe API::Users do
expect(response).to have_gitlab_http_status(400)
end
+
+ it "creates verified email" do
+ email_attrs = attributes_for :email
+ email_attrs[:skip_confirmation] = true
+
+ post api("/users/#{user.id}/emails", admin), email_attrs
+
+ expect(response).to have_gitlab_http_status(201)
+
+ email = Email.find_by(user_id: user.id, email: email_attrs[:email])
+ expect(email).to be_confirmed
+ end
end
describe 'GET /user/:id/emails' do
@@ -1970,11 +2018,11 @@ describe API::Users do
expect(json_response['message']).to eq('403 Forbidden')
end
- it 'returns a personal access token' do
+ it 'returns an impersonation token' do
get api("/users/#{user.id}/impersonation_tokens/#{impersonation_token.id}", admin)
expect(response).to have_gitlab_http_status(200)
- expect(json_response['token']).to be_present
+ expect(json_response['token']).not_to be_present
expect(json_response['impersonation']).to be_truthy
end
end
diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb
index 489cb001b82..08bada44178 100644
--- a/spec/requests/api/wikis_spec.rb
+++ b/spec/requests/api/wikis_spec.rb
@@ -139,6 +139,37 @@ describe API::Wikis do
end
end
+ shared_examples_for 'uploads wiki attachment' do
+ it 'pushes attachment to the wiki repository' do
+ allow(SecureRandom).to receive(:hex).and_return('fixed_hex')
+
+ post(api(url, user), payload)
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response).to eq result_hash.deep_stringify_keys
+ end
+
+ it 'responds with validation error on empty file' do
+ payload.delete(:file)
+
+ post(api(url, user), payload)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response.size).to eq(1)
+ expect(json_response['error']).to eq('file is missing')
+ end
+
+ it 'responds with validation error on invalid temp file' do
+ payload[:file] = { tempfile: '/etc/hosts' }
+
+ post(api(url, user), payload)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response.size).to eq(1)
+ expect(json_response['error']).to eq('file is invalid')
+ end
+ end
+
describe 'GET /projects/:id/wikis' do
let(:url) { "/projects/#{project.id}/wikis" }
@@ -698,4 +729,107 @@ describe API::Wikis do
include_examples '204 No Content'
end
end
+
+ describe 'POST /projects/:id/wikis/attachments' do
+ let(:payload) { { file: fixture_file_upload('spec/fixtures/dk.png') } }
+ let(:url) { "/projects/#{project.id}/wikis/attachments" }
+ let(:file_path) { "#{Wikis::CreateAttachmentService::ATTACHMENT_PATH}/fixed_hex/dk.png" }
+ let(:result_hash) do
+ {
+ file_name: 'dk.png',
+ file_path: file_path,
+ branch: 'master',
+ link: {
+ url: file_path,
+ markdown: "![dk](#{file_path})"
+ }
+ }
+ end
+
+ context 'when wiki is disabled' do
+ let(:project) { create(:project, :wiki_disabled, :wiki_repo) }
+
+ context 'when user is guest' do
+ before do
+ post(api(url), payload)
+ end
+
+ include_examples '404 Project Not Found'
+ end
+
+ context 'when user is developer' do
+ before do
+ project.add_developer(user)
+ post(api(url, user), payload)
+ end
+
+ include_examples '403 Forbidden'
+ end
+
+ context 'when user is maintainer' do
+ before do
+ project.add_maintainer(user)
+ post(api(url, user), payload)
+ end
+
+ include_examples '403 Forbidden'
+ end
+ end
+
+ context 'when wiki is available only for team members' do
+ let(:project) { create(:project, :wiki_private, :wiki_repo) }
+
+ context 'when user is guest' do
+ before do
+ post(api(url), payload)
+ end
+
+ include_examples '404 Project Not Found'
+ end
+
+ context 'when user is developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ include_examples 'uploads wiki attachment'
+ end
+
+ context 'when user is maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ include_examples 'uploads wiki attachment'
+ end
+ end
+
+ context 'when wiki is available for everyone with access' do
+ let(:project) { create(:project, :wiki_repo) }
+
+ context 'when user is guest' do
+ before do
+ post(api(url), payload)
+ end
+
+ include_examples '404 Project Not Found'
+ end
+
+ context 'when user is developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ include_examples 'uploads wiki attachment'
+ end
+
+ context 'when user is maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ include_examples 'uploads wiki attachment'
+ end
+ end
+ end
end
diff --git a/spec/requests/openid_connect_spec.rb b/spec/requests/openid_connect_spec.rb
index b14d4b8fb6e..b1cf7a531f4 100644
--- a/spec/requests/openid_connect_spec.rb
+++ b/spec/requests/openid_connect_spec.rb
@@ -121,7 +121,7 @@ describe 'OpenID Connect requests' do
expect(@payload).to match(a_hash_including(id_token_claims))
end
- it 'includes the Gitlab root URL' do
+ it 'includes the GitLab root URL' do
expect(@payload['iss']).to eq Gitlab.config.gitlab.url
end
diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb
index 98df5f787f7..77baaef7afd 100644
--- a/spec/routing/admin_routing_spec.rb
+++ b/spec/routing/admin_routing_spec.rb
@@ -103,11 +103,11 @@ describe Admin::HooksController, "routing" do
end
end
-# admin_hook_hook_log_retry GET /admin/hooks/:hook_id/hook_logs/:id/retry(.:format) admin/hook_logs#retry
+# admin_hook_hook_log_retry POST /admin/hooks/:hook_id/hook_logs/:id/retry(.:format) admin/hook_logs#retry
# admin_hook_hook_log GET /admin/hooks/:hook_id/hook_logs/:id(.:format) admin/hook_logs#show
describe Admin::HookLogsController, 'routing' do
it 'to #retry' do
- expect(get('/admin/hooks/1/hook_logs/1/retry')).to route_to('admin/hook_logs#retry', hook_id: '1', id: '1')
+ expect(post('/admin/hooks/1/hook_logs/1/retry')).to route_to('admin/hook_logs#retry', hook_id: '1', id: '1')
end
it 'to #show' do
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 70a7707826e..bdfb12dc5df 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -133,8 +133,9 @@ describe 'project routing' do
# labels_namespace_project_autocomplete_sources_path GET /:project_id/autocomplete_sources/labels(.:format) projects/autocomplete_sources#labels
# milestones_namespace_project_autocomplete_sources_path GET /:project_id/autocomplete_sources/milestones(.:format) projects/autocomplete_sources#milestones
# commands_namespace_project_autocomplete_sources_path GET /:project_id/autocomplete_sources/commands(.:format) projects/autocomplete_sources#commands
+ # snippets_namespace_project_autocomplete_sources_path GET /:project_id/autocomplete_sources/snippets(.:format) projects/autocomplete_sources#snippets
describe Projects::AutocompleteSourcesController, 'routing' do
- [:members, :issues, :merge_requests, :labels, :milestones, :commands].each do |action|
+ [:members, :issues, :merge_requests, :labels, :milestones, :commands, :snippets].each do |action|
it "to ##{action}" do
expect(get("/gitlab/gitlabhq/autocomplete_sources/#{action}")).to route_to("projects/autocomplete_sources##{action}", namespace_id: 'gitlab', project_id: 'gitlabhq')
end
@@ -258,10 +259,10 @@ describe 'project routing' do
end
it 'to #logs_tree' do
- expect(get('/gitlab/gitlabhq/refs/stable/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable')
- expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45')
- expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45')
- expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45')
+ expect(get('/gitlab/gitlabhq/refs/stable/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable')
+ expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45')
+ expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45')
+ expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45')
expect(get('/gitlab/gitlabhq/refs/stable/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable', path: 'foo/bar/baz')
expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45', path: 'foo/bar/baz')
expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45', path: 'foo/bar/baz')
@@ -381,7 +382,7 @@ describe 'project routing' do
end
end
- # test_project_hook GET /:project_id/hooks/:id/test(.:format) hooks#test
+ # test_project_hook POST /:project_id/hooks/:id/test(.:format) hooks#test
# project_hooks GET /:project_id/hooks(.:format) hooks#index
# POST /:project_id/hooks(.:format) hooks#create
# edit_project_hook GET /:project_id/hooks/:id/edit(.:format) hooks#edit
@@ -398,11 +399,11 @@ describe 'project routing' do
end
end
- # retry_namespace_project_hook_hook_log GET /:project_id/hooks/:hook_id/hook_logs/:id/retry(.:format) projects/hook_logs#retry
+ # retry_namespace_project_hook_hook_log POST /:project_id/hooks/:hook_id/hook_logs/:id/retry(.:format) projects/hook_logs#retry
# namespace_project_hook_hook_log GET /:project_id/hooks/:hook_id/hook_logs/:id(.:format) projects/hook_logs#show
describe Projects::HookLogsController, 'routing' do
it 'to #retry' do
- expect(get('/gitlab/gitlabhq/hooks/1/hook_logs/1/retry')).to route_to('projects/hook_logs#retry', namespace_id: 'gitlab', project_id: 'gitlabhq', hook_id: '1', id: '1')
+ expect(post('/gitlab/gitlabhq/hooks/1/hook_logs/1/retry')).to route_to('projects/hook_logs#retry', namespace_id: 'gitlab', project_id: 'gitlabhq', hook_id: '1', id: '1')
end
it 'to #show' do
diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb
index dd8f6239587..a170bb14144 100644
--- a/spec/routing/routing_spec.rb
+++ b/spec/routing/routing_spec.rb
@@ -140,13 +140,6 @@ describe HelpController, "routing" do
end
end
-# koding GET /koding(.:format) koding#index
-describe KodingController, "routing" do
- it "to #index" do
- expect(get("/koding")).to route_to('koding#index')
- end
-end
-
# profile_account GET /profile/account(.:format) profile#account
# profile_history GET /profile/history(.:format) profile#history
# profile_password PUT /profile/password(.:format) profile#password_update
diff --git a/spec/rubocop/code_reuse_helpers_spec.rb b/spec/rubocop/code_reuse_helpers_spec.rb
new file mode 100644
index 00000000000..2720141aad2
--- /dev/null
+++ b/spec/rubocop/code_reuse_helpers_spec.rb
@@ -0,0 +1,249 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'parser/current'
+require_relative '../../rubocop/code_reuse_helpers'
+
+describe RuboCop::CodeReuseHelpers do
+ def parse_source(source, path = 'foo.rb')
+ buffer = Parser::Source::Buffer.new(path)
+ buffer.source = source
+
+ builder = RuboCop::AST::Builder.new
+ parser = Parser::CurrentRuby.new(builder)
+
+ parser.parse(buffer)
+ end
+
+ let(:cop) do
+ Class.new do
+ include RuboCop::CodeReuseHelpers
+ end.new
+ end
+
+ describe '#send_to_constant?' do
+ it 'returns true when sending to a constant' do
+ node = parse_source('Foo.bar')
+
+ expect(cop.send_to_constant?(node)).to eq(true)
+ end
+
+ it 'returns false when sending to something other than a constant' do
+ node = parse_source('10')
+
+ expect(cop.send_to_constant?(node)).to eq(false)
+ end
+ end
+
+ describe '#send_receiver_name_ends_with?' do
+ it 'returns true when the receiver ends with a suffix' do
+ node = parse_source('FooFinder.new')
+
+ expect(cop.send_receiver_name_ends_with?(node, 'Finder')).to eq(true)
+ end
+
+ it 'returns false when the receiver is the same as a suffix' do
+ node = parse_source('Finder.new')
+
+ expect(cop.send_receiver_name_ends_with?(node, 'Finder')).to eq(false)
+ end
+ end
+
+ describe '#file_path_for_node' do
+ it 'returns the file path of a node' do
+ node = parse_source('10')
+ path = cop.file_path_for_node(node)
+
+ expect(path).to eq('foo.rb')
+ end
+ end
+
+ describe '#name_of_constant' do
+ it 'returns the name of a constant' do
+ node = parse_source('Foo')
+
+ expect(cop.name_of_constant(node)).to eq(:Foo)
+ end
+ end
+
+ describe '#in_finder?' do
+ it 'returns true for a node in the finders directory' do
+ node = parse_source('10', Rails.root.join('app', 'finders', 'foo.rb'))
+
+ expect(cop.in_finder?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the finders directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_finder?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_model?' do
+ it 'returns true for a node in the models directory' do
+ node = parse_source('10', Rails.root.join('app', 'models', 'foo.rb'))
+
+ expect(cop.in_model?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the models directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_model?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_service_class?' do
+ it 'returns true for a node in the services directory' do
+ node = parse_source('10', Rails.root.join('app', 'services', 'foo.rb'))
+
+ expect(cop.in_service_class?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the services directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_service_class?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_presenter?' do
+ it 'returns true for a node in the presenters directory' do
+ node = parse_source('10', Rails.root.join('app', 'presenters', 'foo.rb'))
+
+ expect(cop.in_presenter?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the presenters directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_presenter?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_serializer?' do
+ it 'returns true for a node in the serializers directory' do
+ node = parse_source('10', Rails.root.join('app', 'serializers', 'foo.rb'))
+
+ expect(cop.in_serializer?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the serializers directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_serializer?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_worker?' do
+ it 'returns true for a node in the workers directory' do
+ node = parse_source('10', Rails.root.join('app', 'workers', 'foo.rb'))
+
+ expect(cop.in_worker?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the workers directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_worker?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_api?' do
+ it 'returns true for a node in the API directory' do
+ node = parse_source('10', Rails.root.join('lib', 'api', 'foo.rb'))
+
+ expect(cop.in_api?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the API directory' do
+ node = parse_source('10', Rails.root.join('lib', 'foo', 'foo.rb'))
+
+ expect(cop.in_api?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_directory?' do
+ it 'returns true for a directory in the CE app/ directory' do
+ node = parse_source('10', Rails.root.join('app', 'models', 'foo.rb'))
+
+ expect(cop.in_directory?(node, 'models')).to eq(true)
+ end
+
+ it 'returns true for a directory in the EE app/ directory' do
+ node =
+ parse_source('10', Rails.root.join('ee', 'app', 'models', 'foo.rb'))
+
+ expect(cop.in_directory?(node, 'models')).to eq(true)
+ end
+
+ it 'returns false for a directory in the lib/ directory' do
+ node =
+ parse_source('10', Rails.root.join('lib', 'models', 'foo.rb'))
+
+ expect(cop.in_directory?(node, 'models')).to eq(false)
+ end
+ end
+
+ describe '#name_of_receiver' do
+ it 'returns the name of a send receiver' do
+ node = parse_source('Foo.bar')
+
+ expect(cop.name_of_receiver(node)).to eq('Foo')
+ end
+ end
+
+ describe '#each_class_method' do
+ it 'yields every class method to the supplied block' do
+ node = parse_source(<<~RUBY)
+ class Foo
+ class << self
+ def first
+ end
+ end
+
+ def self.second
+ end
+ end
+ RUBY
+
+ nodes = cop.each_class_method(node).to_a
+
+ expect(nodes.length).to eq(2)
+
+ expect(nodes[0].children[0]).to eq(:first)
+ expect(nodes[1].children[1]).to eq(:second)
+ end
+ end
+
+ describe '#each_send_node' do
+ it 'yields every send node to the supplied block' do
+ node = parse_source("foo\nbar")
+ nodes = cop.each_send_node(node).to_a
+
+ expect(nodes.length).to eq(2)
+ expect(nodes[0].children[1]).to eq(:foo)
+ expect(nodes[1].children[1]).to eq(:bar)
+ end
+ end
+
+ describe '#disallow_send_to' do
+ it 'disallows sending a message to a constant' do
+ def_node = parse_source(<<~RUBY)
+ def foo
+ FooFinder.new
+ end
+ RUBY
+
+ send_node = def_node.each_child_node(:send).first
+
+ expect(cop)
+ .to receive(:add_offense)
+ .with(send_node, location: :expression, message: 'oops')
+
+ cop.disallow_send_to(def_node, 'Finder', 'oops')
+ end
+ end
+end
diff --git a/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
new file mode 100644
index 00000000000..c9eb61ccc72
--- /dev/null
+++ b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require_relative '../../../rubocop/cop/avoid_route_redirect_leading_slash'
+
+describe RuboCop::Cop::AvoidRouteRedirectLeadingSlash do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ before do
+ allow(cop).to receive(:in_routes?).and_return(true)
+ end
+
+ it 'registers an offense when redirect has a leading slash' do
+ expect_offense(<<~PATTERN.strip_indent)
+ root to: redirect("/-/route")
+ ^^^^^^^^^^^^^^^^^^^^ Do not use a leading "/" in route redirects
+ PATTERN
+ end
+
+ it 'does not register an offense when redirect does not have a leading slash' do
+ expect_no_offenses(<<~PATTERN.strip_indent)
+ root to: redirect("-/route")
+ PATTERN
+ end
+
+ it 'autocorrect `/-/route` to `-/route`' do
+ expect(autocorrect_source('redirect("/-/route")')).to eq('redirect("-/route")')
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/active_record_spec.rb b/spec/rubocop/cop/code_reuse/active_record_spec.rb
new file mode 100644
index 00000000000..a30fc52d26f
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/active_record_spec.rb
@@ -0,0 +1,138 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/active_record'
+
+describe RuboCop::Cop::CodeReuse::ActiveRecord do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of "where" without any arguments' do
+ expect_offense(<<~SOURCE)
+ def foo
+ User.where
+ ^^^^^ This method can only be used inside an ActiveRecord model
+ end
+ SOURCE
+ end
+
+ it 'flags the use of "where" with arguments' do
+ expect_offense(<<~SOURCE)
+ def foo
+ User.where(id: 10)
+ ^^^^^ This method can only be used inside an ActiveRecord model
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of "group" without any arguments' do
+ expect_no_offenses(<<~SOURCE)
+ def foo
+ project.group
+ end
+ SOURCE
+ end
+
+ it 'flags the use of "group" with arguments' do
+ expect_offense(<<~SOURCE)
+ def foo
+ project.group(:name)
+ ^^^^^ This method can only be used inside an ActiveRecord model
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of ActiveRecord models in a model' do
+ path = Rails.root.join('app', 'models', 'foo.rb').to_s
+
+ expect_no_offenses(<<~SOURCE, path)
+ def foo
+ project.group(:name)
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of ActiveRecord models in a spec' do
+ path = Rails.root.join('spec', 'foo_spec.rb').to_s
+
+ expect_no_offenses(<<~SOURCE, path)
+ def foo
+ project.group(:name)
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of ActiveRecord models in a background migration' do
+ path = Rails
+ .root
+ .join('lib', 'gitlab', 'background_migration', 'foo.rb')
+ .to_s
+
+ expect_no_offenses(<<~SOURCE, path)
+ def foo
+ project.group(:name)
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of ActiveRecord models in lib/gitlab/database' do
+ path = Rails.root.join('lib', 'gitlab', 'database', 'foo.rb').to_s
+
+ expect_no_offenses(<<~SOURCE, path)
+ def foo
+ project.group(:name)
+ end
+ SOURCE
+ end
+
+ it 'autocorrects offenses in instance methods by whitelisting them' do
+ corrected = autocorrect_source(<<~SOURCE)
+ def foo
+ User.where
+ end
+ SOURCE
+
+ expect(corrected).to eq(<<~SOURCE)
+ # rubocop: disable CodeReuse/ActiveRecord
+ def foo
+ User.where
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ SOURCE
+ end
+
+ it 'autocorrects offenses in class methods by whitelisting them' do
+ corrected = autocorrect_source(<<~SOURCE)
+ def self.foo
+ User.where
+ end
+ SOURCE
+
+ expect(corrected).to eq(<<~SOURCE)
+ # rubocop: disable CodeReuse/ActiveRecord
+ def self.foo
+ User.where
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ SOURCE
+ end
+
+ it 'autocorrects offenses in blocks by whitelisting them' do
+ corrected = autocorrect_source(<<~SOURCE)
+ get '/' do
+ User.where
+ end
+ SOURCE
+
+ expect(corrected).to eq(<<~SOURCE)
+ # rubocop: disable CodeReuse/ActiveRecord
+ get '/' do
+ User.where
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/finder_spec.rb b/spec/rubocop/cop/code_reuse/finder_spec.rb
new file mode 100644
index 00000000000..b04e053a4c3
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/finder_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/finder'
+
+describe RuboCop::Cop::CodeReuse::Finder do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of a Finder inside another Finder' do
+ allow(cop)
+ .to receive(:in_finder?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooFinder
+ def execute
+ BarFinder.new.execute
+ ^^^^^^^^^^^^^ Finders can not be used inside a Finder.
+ end
+ end
+ SOURCE
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'flags the use of a Finder inside a model class method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User
+ class << self
+ def second_method
+ BarFinder.new
+ ^^^^^^^^^^^^^ Finders can not be used inside model class methods.
+ end
+ end
+
+ def self.second_method
+ FooFinder.new
+ ^^^^^^^^^^^^^ Finders can not be used inside model class methods.
+ end
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of a Finder in a non Finder file' do
+ expect_no_offenses(<<~SOURCE)
+ class FooFinder
+ def execute
+ BarFinder.new.execute
+ end
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of a Finder in a regular class method' do
+ expect_no_offenses(<<~SOURCE)
+ class User
+ class << self
+ def second_method
+ BarFinder.new
+ end
+ end
+
+ def self.second_method
+ FooFinder.new
+ end
+ end
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/presenter_spec.rb b/spec/rubocop/cop/code_reuse/presenter_spec.rb
new file mode 100644
index 00000000000..4fe72619273
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/presenter_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/presenter'
+
+describe RuboCop::Cop::CodeReuse::Presenter do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of a Presenter in a Service class' do
+ allow(cop)
+ .to receive(:in_service_class?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooService
+ def execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a Service class.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Presenter in a Finder' do
+ allow(cop)
+ .to receive(:in_finder?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooFinder
+ def execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a Finder.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Service class in a Presenter' do
+ allow(cop)
+ .to receive(:in_presenter?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooPresenter
+ def execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a Presenter.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Presenter in a Serializer' do
+ allow(cop)
+ .to receive(:in_serializer?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooSerializer
+ def execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a Serializer.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Presenter in a model instance method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Base
+ def execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a model.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Presenter in a model class method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Base
+ def self.execute
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a model.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Presenter in a worker' do
+ allow(cop)
+ .to receive(:in_worker?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooWorker
+ def perform
+ FooPresenter.new.execute
+ ^^^^^^^^^^^^^^^^ Presenters can not be used in a worker.
+ end
+ end
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/serializer_spec.rb b/spec/rubocop/cop/code_reuse/serializer_spec.rb
new file mode 100644
index 00000000000..4530b15eed7
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/serializer_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/serializer'
+
+describe RuboCop::Cop::CodeReuse::Serializer do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of a Serializer in a Service class' do
+ allow(cop)
+ .to receive(:in_service_class?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooService
+ def execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a Service class.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a Finder' do
+ allow(cop)
+ .to receive(:in_finder?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooFinder
+ def execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a Finder.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a Presenter' do
+ allow(cop)
+ .to receive(:in_presenter?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooPresenter
+ def execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a Presenter.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a Serializer' do
+ allow(cop)
+ .to receive(:in_serializer?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooSerializer
+ def execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a Serializer.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a model instance method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Base
+ def execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a model.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a model class method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Base
+ def self.execute
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a model.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Serializer in a worker' do
+ allow(cop)
+ .to receive(:in_worker?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooWorker
+ def perform
+ FooSerializer.new.execute
+ ^^^^^^^^^^^^^^^^^ Serializers can not be used in a worker.
+ end
+ end
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/service_class_spec.rb b/spec/rubocop/cop/code_reuse/service_class_spec.rb
new file mode 100644
index 00000000000..7b8d82f332e
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/service_class_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/service_class'
+
+describe RuboCop::Cop::CodeReuse::ServiceClass do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of a Service class in a Finder' do
+ allow(cop)
+ .to receive(:in_finder?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooFinder
+ def execute
+ FooService.new.execute
+ ^^^^^^^^^^^^^^ Service classes can not be used in a Finder.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Service class in a Presenter' do
+ allow(cop)
+ .to receive(:in_presenter?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooPresenter
+ def execute
+ FooService.new.execute
+ ^^^^^^^^^^^^^^ Service classes can not be used in a Presenter.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Service class in a Serializer' do
+ allow(cop)
+ .to receive(:in_serializer?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooSerializer
+ def execute
+ FooService.new.execute
+ ^^^^^^^^^^^^^^ Service classes can not be used in a Serializer.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a Service class in a model' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Model
+ class << self
+ def first
+ FooService.new.execute
+ ^^^^^^^^^^^^^^ Service classes can not be used in a model.
+ end
+ end
+
+ def second
+ FooService.new.execute
+ ^^^^^^^^^^^^^^ Service classes can not be used in a model.
+ end
+ end
+ SOURCE
+ end
+
+ it 'does not flag the use of a Service class in a regular class' do
+ expect_no_offenses(<<~SOURCE)
+ class Foo
+ def execute
+ FooService.new.execute
+ end
+ end
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/code_reuse/worker_spec.rb b/spec/rubocop/cop/code_reuse/worker_spec.rb
new file mode 100644
index 00000000000..97acaeb7643
--- /dev/null
+++ b/spec/rubocop/cop/code_reuse/worker_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/code_reuse/worker'
+
+describe RuboCop::Cop::CodeReuse::Worker do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of a worker in a controller' do
+ allow(cop)
+ .to receive(:in_controller?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooController
+ def index
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in a controller.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a worker in an API' do
+ allow(cop)
+ .to receive(:in_api?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class Foo < Grape::API
+ resource :projects do
+ get '/' do
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in a Grape API.
+ end
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a worker in a Finder' do
+ allow(cop)
+ .to receive(:in_finder?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooFinder
+ def execute
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in a Finder.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a worker in a Presenter' do
+ allow(cop)
+ .to receive(:in_presenter?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooPresenter
+ def execute
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in a Presenter.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a worker in a Serializer' do
+ allow(cop)
+ .to receive(:in_serializer?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class FooSerializer
+ def execute
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in a Serializer.
+ end
+ end
+ SOURCE
+ end
+
+ it 'flags the use of a worker in a model class method' do
+ allow(cop)
+ .to receive(:in_model?)
+ .and_return(true)
+
+ expect_offense(<<~SOURCE)
+ class User < ActiveRecord::Base
+ def self.execute
+ FooWorker.perform_async
+ ^^^^^^^^^^^^^^^^^^^^^^^ Workers can not be used in model class methods.
+ end
+ end
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/destroy_all_spec.rb b/spec/rubocop/cop/destroy_all_spec.rb
new file mode 100644
index 00000000000..b0bc40552b3
--- /dev/null
+++ b/spec/rubocop/cop/destroy_all_spec.rb
@@ -0,0 +1,43 @@
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../rubocop/cop/destroy_all'
+
+describe RuboCop::Cop::DestroyAll do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of destroy_all with a send receiver' do
+ inspect_source('foo.destroy_all # rubocop: disable DestroyAll')
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'flags the use of destroy_all with a constant receiver' do
+ inspect_source('User.destroy_all # rubocop: disable DestroyAll')
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'flags the use of destroy_all when passing arguments' do
+ inspect_source('User.destroy_all([])')
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'flags the use of destroy_all with a local variable receiver' do
+ inspect_source(<<~RUBY)
+ users = User.all
+ users.destroy_all # rubocop: disable DestroyAll
+ RUBY
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'does not flag the use of delete_all' do
+ inspect_source('foo.delete_all')
+
+ expect(cop.offenses).to be_empty
+ end
+end
diff --git a/spec/rubocop/cop/gitlab/union_spec.rb b/spec/rubocop/cop/gitlab/union_spec.rb
new file mode 100644
index 00000000000..5b06f30b25f
--- /dev/null
+++ b/spec/rubocop/cop/gitlab/union_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/gitlab/union'
+
+describe RuboCop::Cop::Gitlab::Union do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of Gitlab::SQL::Union.new' do
+ expect_offense(<<~SOURCE)
+ Gitlab::SQL::Union.new([foo])
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use the `FromUnion` concern, instead of using `Gitlab::SQL::Union` directly
+ SOURCE
+ end
+
+ it 'does not flag the use of Gitlab::SQL::Union in a spec' do
+ allow(cop).to receive(:in_spec?).and_return(true)
+
+ expect_no_offenses('Gitlab::SQL::Union.new([foo])')
+ end
+end
diff --git a/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb b/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb
new file mode 100644
index 00000000000..7b5235a3da7
--- /dev/null
+++ b/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../rubocop/cop/group_public_or_visible_to_user'
+
+describe RuboCop::Cop::GroupPublicOrVisibleToUser do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of Group.public_or_visible_to_user with a constant receiver' do
+ inspect_source('Group.public_or_visible_to_user')
+
+ expect(cop.offenses.size).to eq(1)
+ end
+
+ it 'does not flat the use of public_or_visible_to_user with a constant that is not Group' do
+ inspect_source('Project.public_or_visible_to_user')
+
+ expect(cop.offenses.size).to eq(0)
+ end
+
+ it 'does not flag the use of Group.public_or_visible_to_user with a send receiver' do
+ inspect_source('foo.public_or_visible_to_user')
+
+ expect(cop.offenses.size).to eq(0)
+ end
+end
diff --git a/spec/rubocop/cop/line_break_around_conditional_block_spec.rb b/spec/rubocop/cop/line_break_around_conditional_block_spec.rb
index 03eeffe6483..892b393c307 100644
--- a/spec/rubocop/cop/line_break_around_conditional_block_spec.rb
+++ b/spec/rubocop/cop/line_break_around_conditional_block_spec.rb
@@ -328,6 +328,22 @@ describe RuboCop::Cop::LineBreakAroundConditionalBlock do
expect(cop.offenses).to be_empty
end
+ it "doesn't flag violation for #{conditional} preceded by a rescue" do
+ source = <<~RUBY
+ def a_method
+ do_something
+ rescue
+ #{conditional} condition
+ do_something
+ end
+ end
+ RUBY
+
+ inspect_source(source)
+
+ expect(cop.offenses).to be_empty
+ end
+
it "doesn't flag violation for #{conditional} followed by a rescue" do
source = <<~RUBY
def a_method
diff --git a/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
new file mode 100644
index 00000000000..4739f0e6c47
--- /dev/null
+++ b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../rubocop/cop/prefer_class_methods_over_module'
+
+describe RuboCop::Cop::PreferClassMethodsOverModule do
+ include CopHelper
+
+ subject(:cop) { described_class.new }
+
+ it 'flags violation when using module ClassMethods' do
+ expect_offense(<<~RUBY)
+ module Foo
+ extend ActiveSupport::Concern
+
+ module ClassMethods
+ ^^^^^^^^^^^^^^^^^^^ Do not use module ClassMethods, use class_methods block instead.
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ end
+
+ it "doesn't flag violation when using class_methods" do
+ expect_no_offenses(<<~RUBY)
+ module Foo
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ end
+
+ it "doesn't flag violation when module is not extending ActiveSupport::Concern" do
+ expect_no_offenses(<<~RUBY)
+ module Foo
+ module ClassMethods
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ end
+
+ it "doesn't flag violation when ClassMethods is used inside a class" do
+ expect_no_offenses(<<~RUBY)
+ class Foo
+ module ClassMethods
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ end
+
+ it "doesn't flag violation when not using either class_methods or ClassMethods" do
+ expect_no_offenses(<<~RUBY)
+ module Foo
+ extend ActiveSupport::Concern
+
+ def a_method
+ end
+ end
+ RUBY
+ end
+
+ it 'autocorrects ClassMethods into class_methods' do
+ source = <<~RUBY
+ module Foo
+ extend ActiveSupport::Concern
+
+ module ClassMethods
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ autocorrected = autocorrect_source(source)
+
+ expected_source = <<~RUBY
+ module Foo
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def a_class_method
+ end
+ end
+ end
+ RUBY
+ expect(autocorrected).to eq(expected_source)
+ end
+end
diff --git a/spec/rubocop/cop/qa/element_with_pattern_spec.rb b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
new file mode 100644
index 00000000000..c5beb40f9fd
--- /dev/null
+++ b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
@@ -0,0 +1,50 @@
+require 'spec_helper'
+
+require 'rubocop'
+require 'rubocop/rspec/support'
+
+require_relative '../../../../rubocop/cop/qa/element_with_pattern'
+
+describe RuboCop::Cop::QA::ElementWithPattern do
+ include CopHelper
+
+ let(:source_file) { 'qa/page.rb' }
+
+ subject(:cop) { described_class.new }
+
+ context 'in a QA file' do
+ before do
+ allow(cop).to receive(:in_qa_file?).and_return(true)
+ end
+
+ it "registers an offense for elements with a pattern" do
+ expect_offense(<<-RUBY)
+ view 'app/views/shared/groups/_search_form.html.haml' do
+ element :groups_filter, 'search_field_tag :filter'
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't use a pattern for element, create a corresponding `qa-groups-filter` instead.
+ element :groups_filter_placeholder, /Search by name/
+ ^^^^^^^^^^^^^^^^ Don't use a pattern for element, create a corresponding `qa-groups-filter-placeholder` instead.
+ end
+ RUBY
+ end
+
+ it "does not register an offense for element without a pattern" do
+ expect_no_offenses(<<-RUBY)
+ view 'app/views/shared/groups/_search_form.html.haml' do
+ element :groups_filter
+ element :groups_filter_placeholder
+ end
+ RUBY
+ end
+ end
+
+ context 'outside of a migration spec file' do
+ it "does not register an offense" do
+ expect_no_offenses(<<-RUBY)
+ describe 'foo' do
+ let(:user) { create(:user) }
+ end
+ RUBY
+ end
+ end
+end
diff --git a/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb
new file mode 100644
index 00000000000..7bd50866577
--- /dev/null
+++ b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require 'rubocop'
+require 'rubocop/rspec/support'
+
+require_relative '../../../rubocop/cop/ruby_interpolation_in_translation'
+
+# Disabling interpolation check as we deliberately want to have #{} in strings.
+# rubocop:disable Lint/InterpolationCheck
+describe RuboCop::Cop::RubyInterpolationInTranslation do
+ subject(:cop) { described_class.new }
+
+ it 'does not add an offence for a regular messages' do
+ inspect_source('_("Hello world")')
+
+ expect(cop.offenses).to be_empty
+ end
+
+ it 'adds the correct offence when using interpolation in a string' do
+ inspect_source('_("Hello #{world}")')
+
+ offense = cop.offenses.first
+
+ expect(offense.location.source).to eq('#{world}')
+ expect(offense.message).to eq('Don\'t use ruby interpolation #{} inside translated strings, instead use %{}')
+ end
+
+ it 'detects when using a ruby interpolation in the first argument of a pluralized string' do
+ inspect_source('n_("Hello #{world}", "Hello world")')
+
+ expect(cop.offenses).not_to be_empty
+ end
+
+ it 'detects when using a ruby interpolation in the second argument of a pluralized string' do
+ inspect_source('n_("Hello world", "Hello #{world}")')
+
+ expect(cop.offenses).not_to be_empty
+ end
+
+ it 'detects when using interpolation in a namespaced translation' do
+ inspect_source('s_("Hello|#{world}")')
+
+ expect(cop.offenses).not_to be_empty
+ end
+
+ it 'does not add an offence for messages defined over multiple lines' do
+ source = <<~SRC
+ _("Hello "\
+ "world ")
+ SRC
+
+ inspect_source(source)
+ expect(cop.offenses).to be_empty
+ end
+
+ it 'adds an offence for violations in a message defined over multiple lines' do
+ source = <<~SRC
+ _("Hello "\
+ "\#{world} ")
+ SRC
+
+ inspect_source(source)
+ expect(cop.offenses).not_to be_empty
+ end
+end
+# rubocop:enable Lint/InterpolationCheck
diff --git a/spec/rubocop/qa_helpers_spec.rb b/spec/rubocop/qa_helpers_spec.rb
new file mode 100644
index 00000000000..26e4c1ca6f0
--- /dev/null
+++ b/spec/rubocop/qa_helpers_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rubocop'
+require_relative '../../rubocop/qa_helpers'
+
+describe RuboCop::QAHelpers do
+ def parse_source(source, path = 'foo.rb')
+ buffer = Parser::Source::Buffer.new(path)
+ buffer.source = source
+
+ builder = RuboCop::AST::Builder.new
+ parser = Parser::CurrentRuby.new(builder)
+
+ parser.parse(buffer)
+ end
+
+ let(:cop) do
+ Class.new do
+ include RuboCop::QAHelpers
+ end.new
+ end
+
+ describe '#in_qa_file?' do
+ it 'returns true for a node in the qa/ directory' do
+ node = parse_source('10', Rails.root.join('qa', 'qa', 'page', 'dashboard', 'groups.rb'))
+
+ expect(cop.in_qa_file?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the qa/ directory' do
+ node = parse_source('10', Rails.root.join('app', 'foo', 'foo.rb'))
+
+ expect(cop.in_qa_file?(node)).to eq(false)
+ end
+ end
+end
diff --git a/spec/serializers/build_action_entity_spec.rb b/spec/serializers/build_action_entity_spec.rb
index 15720d86583..ea88951ebc6 100644
--- a/spec/serializers/build_action_entity_spec.rb
+++ b/spec/serializers/build_action_entity_spec.rb
@@ -22,5 +22,21 @@ describe BuildActionEntity do
it 'contains whether it is playable' do
expect(subject[:playable]).to eq job.playable?
end
+
+ context 'when job is scheduled' do
+ let(:job) { create(:ci_build, :scheduled) }
+
+ it 'returns scheduled' do
+ expect(subject[:scheduled]).to be_truthy
+ end
+
+ it 'returns scheduled_at' do
+ expect(subject[:scheduled_at]).to eq(job.scheduled_at)
+ end
+
+ it 'returns unschedule path' do
+ expect(subject[:unschedule_path]).to include "jobs/#{job.id}/unschedule"
+ end
+ end
end
end
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
index 52459cd369d..302ef147eb2 100644
--- a/spec/serializers/build_serializer_spec.rb
+++ b/spec/serializers/build_serializer_spec.rb
@@ -37,7 +37,7 @@ describe BuildSerializer do
it 'serializes only status' do
expect(subject[:text]).to eq(status.text)
expect(subject[:label]).to eq('failed')
- expect(subject[:tooltip]).to eq('failed <br> (unknown failure)')
+ expect(subject[:tooltip]).to eq('failed - (unknown failure)')
expect(subject[:icon]).to eq(status.icon)
expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.png")
end
diff --git a/spec/serializers/commit_entity_spec.rb b/spec/serializers/commit_entity_spec.rb
index 04247c78549..b9995818e98 100644
--- a/spec/serializers/commit_entity_spec.rb
+++ b/spec/serializers/commit_entity_spec.rb
@@ -1,10 +1,11 @@
require 'spec_helper'
describe CommitEntity do
+ SIGNATURE_HTML = 'TEST'.freeze
+
let(:entity) do
described_class.new(commit, request: request)
end
-
let(:request) { double('request') }
let(:project) { create(:project, :repository) }
let(:commit) { project.commit }
@@ -12,7 +13,11 @@ describe CommitEntity do
subject { entity.as_json }
before do
+ render = double('render')
+ allow(render).to receive(:call).and_return(SIGNATURE_HTML)
+
allow(request).to receive(:project).and_return(project)
+ allow(request).to receive(:render).and_return(render)
end
context 'when commit author is a user' do
@@ -51,4 +56,56 @@ describe CommitEntity do
it 'exposes gravatar url that belongs to author' do
expect(subject.fetch(:author_gravatar_url)).to match /gravatar/
end
+
+ context 'when type is not set' do
+ it 'does not expose extra properties' do
+ expect(subject).not_to include(:description_html)
+ expect(subject).not_to include(:title_html)
+ end
+ end
+
+ context 'when type is "full"' do
+ let(:entity) do
+ described_class.new(commit, request: request, type: :full, pipeline_ref: project.default_branch, pipeline_project: project)
+ end
+
+ it 'exposes extra properties' do
+ expect(subject).to include(:description_html)
+ expect(subject).to include(:title_html)
+ expect(subject.fetch(:description_html)).not_to be_nil
+ expect(subject.fetch(:title_html)).not_to be_nil
+ end
+
+ context 'when commit has signature' do
+ let(:commit) { project.commit(TestEnv::BRANCH_SHA['signed-commits']) }
+
+ it 'exposes "signature_html"' do
+ expect(request.render).to receive(:call)
+ expect(subject.fetch(:signature_html)).to be SIGNATURE_HTML
+ end
+ end
+
+ context 'when commit has pipeline' do
+ before do
+ create(:ci_pipeline, project: project, sha: commit.id)
+ end
+
+ it 'exposes "pipeline_status_path"' do
+ expect(subject.fetch(:pipeline_status_path)).not_to be_nil
+ end
+ end
+ end
+
+ context 'when commit_url_params is set' do
+ let(:entity) do
+ params = { merge_request_iid: 3 }
+
+ described_class.new(commit, request: request, commit_url_params: params)
+ end
+
+ it 'adds commit_url_params to url and path' do
+ expect(subject[:commit_path]).to include "?merge_request_iid=3"
+ expect(subject[:commit_url]).to include "?merge_request_iid=3"
+ end
+ end
end
diff --git a/spec/serializers/deployment_entity_spec.rb b/spec/serializers/deployment_entity_spec.rb
index 522c92ce295..8793a762f9d 100644
--- a/spec/serializers/deployment_entity_spec.rb
+++ b/spec/serializers/deployment_entity_spec.rb
@@ -22,4 +22,26 @@ describe DeploymentEntity do
it 'exposes creation date' do
expect(subject).to include(:created_at)
end
+
+ describe 'scheduled_actions' do
+ let(:project) { create(:project, :repository) }
+ let(:pipeline) { create(:ci_pipeline, project: project, user: user) }
+ let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+ let(:deployment) { create(:deployment, deployable: build) }
+
+ context 'when the same pipeline has a scheduled action' do
+ let(:other_build) { create(:ci_build, :schedulable, :success, pipeline: pipeline, name: 'other build') }
+ let!(:other_deployment) { create(:deployment, deployable: other_build) }
+
+ it 'returns other scheduled actions' do
+ expect(subject[:scheduled_actions][0][:name]).to eq 'other build'
+ end
+ end
+
+ context 'when the same pipeline does not have a scheduled action' do
+ it 'does not return other actions' do
+ expect(subject[:scheduled_actions]).to be_empty
+ end
+ end
+ end
end
diff --git a/spec/serializers/deployment_serializer_spec.rb b/spec/serializers/deployment_serializer_spec.rb
new file mode 100644
index 00000000000..4834f5ede3c
--- /dev/null
+++ b/spec/serializers/deployment_serializer_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe DeploymentSerializer do
+ set(:project) { create(:project, :repository) }
+ set(:user) { create(:user, email: project.commit.author_email) }
+
+ let(:resource) { create(:deployment, project: project, sha: project.commit.id) }
+ let(:serializer) { described_class.new(request) }
+
+ shared_examples 'json schema' do
+ let(:json_entity) { subject.as_json }
+
+ it 'matches deployment entity schema' do
+ expect(json_entity).to match_schema('deployment')
+ end
+ end
+
+ describe '#represent' do
+ subject { serializer.represent(resource) }
+
+ let(:request) { { project: project, current_user: user } }
+
+ it_behaves_like 'json schema'
+ end
+
+ describe '#represent_concise' do
+ subject { serializer.represent_concise(resource) }
+
+ let(:request) { { project: project } }
+
+ it_behaves_like 'json schema'
+ end
+end
diff --git a/spec/serializers/status_entity_spec.rb b/spec/serializers/detailed_status_entity_spec.rb
index 0b010ebd507..62f57ca8689 100644
--- a/spec/serializers/status_entity_spec.rb
+++ b/spec/serializers/detailed_status_entity_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe StatusEntity do
+describe DetailedStatusEntity do
let(:entity) { described_class.new(status) }
let(:status) do
diff --git a/spec/serializers/diff_file_entity_spec.rb b/spec/serializers/diff_file_entity_spec.rb
index 00b2146dc86..7497b8f27bd 100644
--- a/spec/serializers/diff_file_entity_spec.rb
+++ b/spec/serializers/diff_file_entity_spec.rb
@@ -26,6 +26,11 @@ describe DiffFileEntity do
)
end
+ it 'includes viewer' do
+ expect(subject[:viewer].with_indifferent_access)
+ .to match_schema('entities/diff_viewer')
+ end
+
# Converted diff files from GitHub import does not contain blob file
# and content sha.
context 'when diff file does not have a blob and content sha' do
@@ -67,4 +72,21 @@ describe DiffFileEntity do
end
end
end
+
+ context '#parallel_diff_lines' do
+ it 'exposes parallel diff lines correctly' do
+ response = subject
+
+ lines = response[:parallel_diff_lines]
+
+ # make sure at least one line is present for each side
+ expect(lines.map { |line| line[:right] }.compact).to be_present
+ expect(lines.map { |line| line[:left] }.compact).to be_present
+ # make sure all lines are in correct format
+ lines.each do |parallel_line|
+ expect(parallel_line[:left].as_json).to match_schema('entities/diff_line') if parallel_line[:left]
+ expect(parallel_line[:right].as_json).to match_schema('entities/diff_line') if parallel_line[:right]
+ end
+ end
+ end
end
diff --git a/spec/serializers/diff_line_entity_spec.rb b/spec/serializers/diff_line_entity_spec.rb
new file mode 100644
index 00000000000..2549f64bcd3
--- /dev/null
+++ b/spec/serializers/diff_line_entity_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe DiffLineEntity do
+ include RepoHelpers
+
+ let(:code) { 'hello world' }
+ let(:line) { Gitlab::Diff::Line.new(code, 'new', 1, nil, 1) }
+ let(:entity) { described_class.new(line, request: {}) }
+
+ subject { entity.as_json }
+
+ it 'exposes correct attributes' do
+ expect(subject).to include(
+ :line_code, :type, :old_line, :new_line, :text, :meta_data, :rich_text
+ )
+ end
+
+ describe '#rich_text' do
+ let(:code) { '<h2 onmouseover="alert(2)">Test</h2>' }
+ let(:rich_text_value) { nil }
+
+ before do
+ line.instance_variable_set(:@rich_text, rich_text_value)
+ end
+
+ shared_examples 'escapes html tags' do
+ it do
+ expect(subject[:rich_text]).to eq html_escape(code)
+ expect(subject[:rich_text]).to be_html_safe
+ end
+ end
+
+ context 'when rich_line is present' do
+ let(:rich_text_value) { code }
+
+ it_behaves_like 'escapes html tags'
+ end
+
+ context 'when rich_line is not present' do
+ it_behaves_like 'escapes html tags'
+ end
+ end
+end
diff --git a/spec/serializers/diff_line_serializer_spec.rb b/spec/serializers/diff_line_serializer_spec.rb
new file mode 100644
index 00000000000..6dd8abd0579
--- /dev/null
+++ b/spec/serializers/diff_line_serializer_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe DiffLineSerializer do
+ let(:line) { Gitlab::Diff::Line.new('hello world', 'new', 1, nil, 1) }
+ let(:serializer) { described_class.new.represent(line) }
+
+ describe '#to_json' do
+ subject { serializer.to_json }
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/diff_line')
+ end
+
+ context 'when lines are parallel' do
+ let(:right_line) { Gitlab::Diff::Line.new('right line', 'new', 1, nil, 1) }
+ let(:left_line) { Gitlab::Diff::Line.new('left line', 'match', 1, nil, 1) }
+ let(:parallel_line) { [{ right: right_line, left: left_line }] }
+ let(:serializer) { described_class.new.represent(parallel_line, {}, DiffLineParallelEntity) }
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/diff_line_parallel')
+ end
+ end
+ end
+end
diff --git a/spec/serializers/diff_viewer_entity_spec.rb b/spec/serializers/diff_viewer_entity_spec.rb
new file mode 100644
index 00000000000..66ac6ef2adc
--- /dev/null
+++ b/spec/serializers/diff_viewer_entity_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe DiffViewerEntity do
+ include RepoHelpers
+
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository }
+ let(:commit) { project.commit(sample_commit.id) }
+ let(:diff_refs) { commit.diff_refs }
+ let(:diff) { commit.raw_diffs.first }
+ let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: diff_refs, repository: repository) }
+ let(:viewer) { diff_file.simple_viewer }
+
+ subject { described_class.new(viewer).as_json }
+
+ it 'serializes diff file viewer' do
+ expect(subject.with_indifferent_access).to match_schema('entities/diff_viewer')
+ end
+end
diff --git a/spec/serializers/discussion_entity_spec.rb b/spec/serializers/discussion_entity_spec.rb
index 378540a35b6..0590304e832 100644
--- a/spec/serializers/discussion_entity_spec.rb
+++ b/spec/serializers/discussion_entity_spec.rb
@@ -36,6 +36,13 @@ describe DiscussionEntity do
)
end
+ it 'resolved_by matches note_user_entity schema' do
+ Notes::ResolveService.new(note.project, user).execute(note)
+
+ expect(subject[:resolved_by].with_indifferent_access)
+ .to match_schema('entities/note_user_entity')
+ end
+
context 'when is LegacyDiffDiscussion' do
let(:project) { create(:project) }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb
index 0f0ab5ac796..87493a28d1f 100644
--- a/spec/serializers/environment_serializer_spec.rb
+++ b/spec/serializers/environment_serializer_spec.rb
@@ -14,7 +14,8 @@ describe EnvironmentSerializer do
let(:project) { create(:project, :repository) }
let(:deployable) { create(:ci_build) }
let(:deployment) do
- create(:deployment, deployable: deployable,
+ create(:deployment, :success,
+ deployable: deployable,
user: user,
project: project,
sha: project.commit.id)
diff --git a/spec/serializers/environment_status_entity_spec.rb b/spec/serializers/environment_status_entity_spec.rb
new file mode 100644
index 00000000000..8a6a38fe5f8
--- /dev/null
+++ b/spec/serializers/environment_status_entity_spec.rb
@@ -0,0 +1,79 @@
+require 'spec_helper'
+
+describe EnvironmentStatusEntity do
+ let(:user) { create(:user) }
+ let(:request) { double('request') }
+
+ let(:deployment) { create(:deployment, :succeed, :review_app) }
+ let(:environment) { deployment.environment }
+ let(:project) { deployment.project }
+ let(:merge_request) { create(:merge_request, :deployed_review_app, deployment: deployment) }
+
+ let(:environment_status) { EnvironmentStatus.new(environment, merge_request, merge_request.diff_head_sha) }
+ let(:entity) { described_class.new(environment_status, request: request) }
+
+ subject { entity.as_json }
+
+ before do
+ deployment.update(sha: merge_request.diff_head_sha)
+ allow(request).to receive(:current_user).and_return(user)
+ end
+
+ it { is_expected.to include(:id) }
+ it { is_expected.to include(:name) }
+ it { is_expected.to include(:url) }
+ it { is_expected.to include(:external_url) }
+ it { is_expected.to include(:external_url_formatted) }
+ it { is_expected.to include(:deployed_at) }
+ it { is_expected.to include(:deployed_at_formatted) }
+ it { is_expected.to include(:changes) }
+ it { is_expected.to include(:status) }
+
+ it { is_expected.not_to include(:stop_url) }
+ it { is_expected.not_to include(:metrics_url) }
+ it { is_expected.not_to include(:metrics_monitoring_url) }
+
+ context 'when the user is project maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { is_expected.to include(:stop_url) }
+ end
+
+ context 'when deployment has metrics' do
+ let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) }
+
+ let(:simple_metrics) do
+ {
+ success: true,
+ metrics: {},
+ last_update: 42
+ }
+ end
+
+ before do
+ project.add_maintainer(user)
+ allow(deployment).to receive(:prometheus_adapter).and_return(prometheus_adapter)
+ allow(prometheus_adapter).to receive(:query).with(:deployment, deployment).and_return(simple_metrics)
+ allow(entity).to receive(:deployment).and_return(deployment)
+ end
+
+ context 'when deployment succeeded' do
+ let(:deployment) { create(:deployment, :succeed, :review_app) }
+
+ it 'returns metrics url' do
+ expect(subject[:metrics_url])
+ .to eq("/#{project.namespace.name}/#{project.name}/environments/#{environment.id}/deployments/#{deployment.iid}/metrics")
+ end
+ end
+
+ context 'when deployment is running' do
+ let(:deployment) { create(:deployment, :running, :review_app) }
+
+ it 'does not return metrics url' do
+ expect(subject[:metrics_url]).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/serializers/job_entity_spec.rb b/spec/serializers/job_entity_spec.rb
index a5581a34517..851b41a7f7e 100644
--- a/spec/serializers/job_entity_spec.rb
+++ b/spec/serializers/job_entity_spec.rb
@@ -109,6 +109,19 @@ describe JobEntity do
end
end
+ context 'when job is scheduled' do
+ let(:job) { create(:ci_build, :scheduled) }
+
+ it 'contains path to unschedule action' do
+ expect(subject).to include(:unschedule_path)
+ end
+
+ it 'contains scheduled_at' do
+ expect(subject[:scheduled]).to be_truthy
+ expect(subject[:scheduled_at]).to eq(job.scheduled_at)
+ end
+ end
+
context 'when job is generic commit status' do
let(:job) { create(:generic_commit_status, target_url: 'http://google.com') }
@@ -142,7 +155,7 @@ describe JobEntity do
end
it 'should indicate the failure reason on tooltip' do
- expect(subject[:status][:tooltip]).to eq('failed <br> (API failure)')
+ expect(subject[:status][:tooltip]).to eq('failed - (API failure)')
end
it 'should include a callout message with a verbose output' do
@@ -166,7 +179,7 @@ describe JobEntity do
end
it 'should indicate the failure reason on tooltip' do
- expect(subject[:status][:tooltip]).to eq('failed <br> (API failure) (allowed to fail)')
+ expect(subject[:status][:tooltip]).to eq('failed - (API failure) (allowed to fail)')
end
it 'should include a callout message with a verbose output' do
diff --git a/spec/serializers/merge_request_widget_entity_spec.rb b/spec/serializers/merge_request_widget_entity_spec.rb
index 0ba2539a717..561421d5ac8 100644
--- a/spec/serializers/merge_request_widget_entity_spec.rb
+++ b/spec/serializers/merge_request_widget_entity_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe MergeRequestWidgetEntity do
+ include ProjectForksHelper
+
let(:project) { create :project, :repository }
let(:resource) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
@@ -50,6 +52,40 @@ describe MergeRequestWidgetEntity do
end
end
+ describe 'merge_pipeline' do
+ it 'returns nil' do
+ expect(subject[:merge_pipeline]).to be_nil
+ end
+
+ context 'when is merged' do
+ let(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) }
+ let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns merge_pipeline' do
+ pipeline.reload
+ pipeline_payload = PipelineDetailsEntity
+ .represent(pipeline, request: request)
+ .as_json
+
+ expect(subject[:merge_pipeline]).to eq(pipeline_payload)
+ end
+
+ context 'when user cannot read pipelines on target project' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns nil' do
+ expect(subject[:merge_pipeline]).to be_nil
+ end
+ end
+ end
+ end
+
describe 'metrics' do
context 'when metrics record exists with merged data' do
before do
@@ -206,12 +242,12 @@ describe MergeRequestWidgetEntity do
describe 'when source project is deleted' do
let(:project) { create(:project, :repository) }
- let(:fork_project) { create(:project, :repository, forked_from_project: project) }
- let(:merge_request) { create(:merge_request, source_project: fork_project, target_project: project) }
+ let(:forked_project) { fork_project(project) }
+ let(:merge_request) { create(:merge_request, source_project: forked_project, target_project: project) }
it 'returns a blank rebase_path' do
allow(merge_request).to receive(:should_be_rebased?).and_return(true)
- fork_project.destroy
+ forked_project.destroy
merge_request.reload
entity = described_class.new(merge_request, request: request).as_json
diff --git a/spec/serializers/move_to_project_entity_spec.rb b/spec/serializers/move_to_project_entity_spec.rb
new file mode 100644
index 00000000000..ac495eadb68
--- /dev/null
+++ b/spec/serializers/move_to_project_entity_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe MoveToProjectEntity do
+ describe '#as_json' do
+ let(:project) { build(:project, id: 1) }
+
+ subject { described_class.new(project).as_json }
+
+ it 'includes the project ID' do
+ expect(subject[:id]).to eq(project.id)
+ end
+
+ it 'includes the full path' do
+ expect(subject[:name_with_namespace]).to eq(project.name_with_namespace)
+ end
+ end
+end
diff --git a/spec/serializers/move_to_project_serializer_spec.rb b/spec/serializers/move_to_project_serializer_spec.rb
new file mode 100644
index 00000000000..841ac969eeb
--- /dev/null
+++ b/spec/serializers/move_to_project_serializer_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe MoveToProjectSerializer do
+ describe '#represent' do
+ it 'includes the name and name with namespace' do
+ project = build(:project, id: 1)
+ output = described_class.new.represent(project)
+
+ expect(output).to include(:id, :name_with_namespace)
+ end
+ end
+end
diff --git a/spec/serializers/pipeline_details_entity_spec.rb b/spec/serializers/pipeline_details_entity_spec.rb
index 45e18086894..8e73a3e67c6 100644
--- a/spec/serializers/pipeline_details_entity_spec.rb
+++ b/spec/serializers/pipeline_details_entity_spec.rb
@@ -29,7 +29,7 @@ describe PipelineDetailsEntity do
expect(subject[:details])
.to include :duration, :finished_at
expect(subject[:details])
- .to include :stages, :artifacts, :manual_actions
+ .to include :stages, :artifacts, :manual_actions, :scheduled_actions
expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
end
diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb
index 6337ee7d724..daf5dfba6b1 100644
--- a/spec/services/application_settings/update_service_spec.rb
+++ b/spec/services/application_settings/update_service_spec.rb
@@ -10,6 +10,9 @@ describe ApplicationSettings::UpdateService do
before do
# So the caching behaves like it would in production
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
+
+ # Creating these settings first ensures they're used by other factories
+ application_settings
end
describe 'updating terms' do
diff --git a/spec/services/applications/create_service_spec.rb b/spec/services/applications/create_service_spec.rb
index 9c43b56744b..c8134087fa1 100644
--- a/spec/services/applications/create_service_spec.rb
+++ b/spec/services/applications/create_service_spec.rb
@@ -1,17 +1,14 @@
+# frozen_string_literal: true
+
require "spec_helper"
describe ::Applications::CreateService do
+ include TestRequestHelpers
+
let(:user) { create(:user) }
let(:params) { attributes_for(:application) }
- let(:request) do
- if Gitlab.rails5?
- ActionController::TestRequest.new({ remote_ip: "127.0.0.1" }, ActionController::TestSession.new)
- else
- ActionController::TestRequest.new(remote_ip: "127.0.0.1")
- end
- end
subject { described_class.new(user, params) }
- it { expect { subject.execute(request) }.to change { Doorkeeper::Application.count }.by(1) }
+ it { expect { subject.execute(test_request) }.to change { Doorkeeper::Application.count }.by(1) }
end
diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb
new file mode 100644
index 00000000000..32fd98e6ef9
--- /dev/null
+++ b/spec/services/audit_event_service_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe AuditEventService do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+ let(:project_member) { create(:project_member, user: user) }
+ let(:service) { described_class.new(user, project, { action: :destroy }) }
+ let(:logger) { instance_double(Gitlab::AuditJsonLogger) }
+
+ describe '#security_event' do
+ before do
+ expect(service).to receive(:file_logger).and_return(logger)
+ end
+
+ it 'creates an event and logs to a file' do
+ expect(logger).to receive(:info).with(author_id: user.id,
+ entity_id: project.id,
+ entity_type: "Project",
+ action: :destroy)
+
+ expect { service.security_event }.to change(SecurityEvent, :count).by(1)
+ end
+ end
+end
diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb
index c7f88e45c84..f2e9799452a 100644
--- a/spec/services/auth/container_registry_authentication_service_spec.rb
+++ b/spec/services/auth/container_registry_authentication_service_spec.rb
@@ -145,7 +145,7 @@ describe Auth::ContainerRegistryAuthenticationService do
{ scopes: ["registry:catalog:*"] }
end
- context 'disallow browsing for users without Gitlab admin rights' do
+ context 'disallow browsing for users without GitLab admin rights' do
it_behaves_like 'an inaccessible'
it_behaves_like 'not a container repository factory'
end
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index 27a7bf0e605..010679b5360 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -24,7 +24,7 @@ describe Boards::Issues::ListService do
let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) }
- let!(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Issue 3' ) }
+ let!(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Reopened Issue 1' ) }
let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) }
let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) }
@@ -44,12 +44,19 @@ describe Boards::Issues::ListService do
end
it_behaves_like 'issues list service'
+
+ context 'when project is archived' do
+ let(:project) { create(:project, :archived) }
+
+ it_behaves_like 'issues list service'
+ end
end
context 'when parent is a group' do
let(:user) { create(:user) }
let(:project) { create(:project, :empty_repo, namespace: group) }
let(:project1) { create(:project, :empty_repo, namespace: group) }
+ let(:project_archived) { create(:project, :empty_repo, :archived, namespace: group) }
let(:m1) { create(:milestone, group: group) }
let(:m2) { create(:milestone, group: group) }
@@ -77,7 +84,8 @@ describe Boards::Issues::ListService do
let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2, p2_project]) }
- let!(:reopened_issue1) { create(:issue, state: 'opened', project: project, title: 'Issue 3', closed_at: Time.now ) }
+ let!(:opened_issue3) { create(:labeled_issue, project: project_archived, milestone: m1, title: 'Issue 3', labels: [bug]) }
+ let!(:reopened_issue1) { create(:issue, state: 'opened', project: project, title: 'Reopened Issue 1', closed_at: Time.now ) }
let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, p2_project, development]) }
let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) }
diff --git a/spec/services/boards/visits/create_service_spec.rb b/spec/services/boards/visits/create_service_spec.rb
new file mode 100644
index 00000000000..6baf7ac9deb
--- /dev/null
+++ b/spec/services/boards/visits/create_service_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Boards::Visits::CreateService do
+ describe '#execute' do
+ let(:user) { create(:user) }
+
+ context 'when a project board' do
+ let(:project) { create(:project) }
+ let(:project_board) { create(:board, project: project) }
+
+ subject(:service) { described_class.new(project_board.parent, user) }
+
+ it 'returns nil when there is no user' do
+ service.current_user = nil
+
+ expect(service.execute(project_board)).to eq nil
+ end
+
+ it 'returns nil when database is read only' do
+ allow(Gitlab::Database).to receive(:read_only?) { true }
+
+ expect(service.execute(project_board)).to eq nil
+ end
+
+ it 'records the visit' do
+ expect(BoardProjectRecentVisit).to receive(:visited!).once
+
+ service.execute(project_board)
+ end
+ end
+
+ context 'when a group board' do
+ let(:group) { create(:group) }
+ let(:group_board) { create(:board, group: group) }
+
+ subject(:service) { described_class.new(group_board.parent, user) }
+
+ it 'returns nil when there is no user' do
+ service.current_user = nil
+
+ expect(service.execute(group_board)).to eq nil
+ end
+
+ it 'records the visit' do
+ expect(BoardGroupRecentVisit).to receive(:visited!).once
+
+ service.execute(group_board)
+ end
+ end
+ end
+end
diff --git a/spec/services/boards/visits/latest_service_spec.rb b/spec/services/boards/visits/latest_service_spec.rb
new file mode 100644
index 00000000000..e55d599e2cc
--- /dev/null
+++ b/spec/services/boards/visits/latest_service_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Boards::Visits::LatestService do
+ describe '#execute' do
+ let(:user) { create(:user) }
+
+ context 'when a project board' do
+ let(:project) { create(:project) }
+ let(:project_board) { create(:board, project: project) }
+
+ subject(:service) { described_class.new(project_board.parent, user) }
+
+ it 'returns nil when there is no user' do
+ service.current_user = nil
+
+ expect(service.execute).to eq nil
+ end
+
+ it 'queries for most recent visit' do
+ expect(BoardProjectRecentVisit).to receive(:latest).once
+
+ service.execute
+ end
+ end
+
+ context 'when a group board' do
+ let(:group) { create(:group) }
+ let(:group_board) { create(:board, group: group) }
+
+ subject(:service) { described_class.new(group_board.parent, user) }
+
+ it 'returns nil when there is no user' do
+ service.current_user = nil
+
+ expect(service.execute).to eq nil
+ end
+
+ it 'queries for most recent visit' do
+ expect(BoardGroupRecentVisit).to receive(:latest).once
+
+ service.execute
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 054b7b1561c..4d9c5aabbda 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -387,15 +387,24 @@ describe Ci::CreatePipelineService do
context 'with environment' do
before do
- config = YAML.dump(deploy: { environment: { name: "review/$CI_COMMIT_REF_NAME" }, script: 'ls' })
+ config = YAML.dump(
+ deploy: {
+ environment: { name: "review/$CI_COMMIT_REF_NAME" },
+ script: 'ls',
+ tags: ['hello']
+ })
+
stub_ci_pipeline_yaml_file(config)
end
- it 'creates the environment' do
+ it 'creates the environment with tags' do
result = execute_service
expect(result).to be_persisted
expect(Environment.find_by(name: "review/master")).to be_present
+ expect(result.builds.first.tag_list).to contain_exactly('hello')
+ expect(result.builds.first.deployment).to be_persisted
+ expect(result.builds.first.deployment.deployable).to be_a(Ci::Build)
end
end
@@ -435,16 +444,34 @@ describe Ci::CreatePipelineService do
end
context 'when builds with auto-retries are configured' do
- before do
- config = YAML.dump(rspec: { script: 'rspec', retry: 2 })
- stub_ci_pipeline_yaml_file(config)
+ context 'as an integer' do
+ before do
+ config = YAML.dump(rspec: { script: 'rspec', retry: 2 })
+ stub_ci_pipeline_yaml_file(config)
+ end
+
+ it 'correctly creates builds with auto-retry value configured' do
+ pipeline = execute_service
+
+ expect(pipeline).to be_persisted
+ expect(pipeline.builds.find_by(name: 'rspec').retries_max).to eq 2
+ expect(pipeline.builds.find_by(name: 'rspec').retry_when).to eq ['always']
+ end
end
- it 'correctly creates builds with auto-retry value configured' do
- pipeline = execute_service
+ context 'as hash' do
+ before do
+ config = YAML.dump(rspec: { script: 'rspec', retry: { max: 2, when: 'runner_system_failure' } })
+ stub_ci_pipeline_yaml_file(config)
+ end
+
+ it 'correctly creates builds with auto-retry value configured' do
+ pipeline = execute_service
- expect(pipeline).to be_persisted
- expect(pipeline.builds.find_by(name: 'rspec').retries_max).to eq 2
+ expect(pipeline).to be_persisted
+ expect(pipeline.builds.find_by(name: 'rspec').retries_max).to eq 2
+ expect(pipeline.builds.find_by(name: 'rspec').retry_when).to eq ['runner_system_failure']
+ end
end
end
@@ -581,5 +608,53 @@ describe Ci::CreatePipelineService do
.to eq variables_attributes.map(&:with_indifferent_access)
end
end
+
+ context 'when pipeline has a job with environment' do
+ let(:pipeline) { execute_service }
+
+ before do
+ stub_ci_pipeline_yaml_file(YAML.dump(config))
+ end
+
+ context 'when environment name is valid' do
+ let(:config) do
+ {
+ review_app: {
+ script: 'deploy',
+ environment: {
+ name: 'review/${CI_COMMIT_REF_NAME}',
+ url: 'http://${CI_COMMIT_REF_SLUG}-staging.example.com'
+ }
+ }
+ }
+ end
+
+ it 'has a job with environment' do
+ expect(pipeline.builds.count).to eq(1)
+ expect(pipeline.builds.first.persisted_environment.name).to eq('review/master')
+ expect(pipeline.builds.first.deployment).to be_created
+ end
+ end
+
+ context 'when environment name is invalid' do
+ let(:config) do
+ {
+ 'job:deploy-to-test-site': {
+ script: 'deploy',
+ environment: {
+ name: '${CI_JOB_NAME}',
+ url: 'https://$APP_URL'
+ }
+ }
+ }
+ end
+
+ it 'has a job without environment' do
+ expect(pipeline.builds.count).to eq(1)
+ expect(pipeline.builds.first.persisted_environment).to be_nil
+ expect(pipeline.builds.first.deployment).to be_nil
+ end
+ end
+ end
end
end
diff --git a/spec/services/ci/destroy_pipeline_service_spec.rb b/spec/services/ci/destroy_pipeline_service_spec.rb
new file mode 100644
index 00000000000..097daf67feb
--- /dev/null
+++ b/spec/services/ci/destroy_pipeline_service_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ::Ci::DestroyPipelineService do
+ let(:project) { create(:project) }
+ let!(:pipeline) { create(:ci_pipeline, project: project) }
+
+ subject { described_class.new(project, user).execute(pipeline) }
+
+ context 'user is owner' do
+ let(:user) { project.owner }
+
+ it 'destroys the pipeline' do
+ subject
+
+ expect { pipeline.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'logs an audit event' do
+ expect { subject }.to change { SecurityEvent.count }.by(1)
+ end
+
+ context 'when the pipeline has jobs' do
+ let!(:build) { create(:ci_build, project: project, pipeline: pipeline) }
+
+ it 'destroys associated jobs' do
+ subject
+
+ expect { build.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'destroys associated stages' do
+ stages = pipeline.stages
+
+ subject
+
+ expect(stages).to all(raise_error(ActiveRecord::RecordNotFound))
+ end
+
+ context 'when job has artifacts' do
+ let!(:artifact) { create(:ci_job_artifact, :archive, job: build) }
+
+ it 'destroys associated artifacts' do
+ subject
+
+ expect { artifact.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+ end
+
+ context 'user is not owner' do
+ let(:user) { create(:user) }
+
+ it 'raises an exception' do
+ expect { subject }.to raise_error(Gitlab::Access::AccessDeniedError)
+ end
+ end
+end
diff --git a/spec/services/ci/enqueue_build_service_spec.rb b/spec/services/ci/enqueue_build_service_spec.rb
deleted file mode 100644
index e41b8e4800b..00000000000
--- a/spec/services/ci/enqueue_build_service_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-describe Ci::EnqueueBuildService, '#execute' do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:ci_build) { create(:ci_build, :created) }
-
- subject { described_class.new(project, user).execute(ci_build) }
-
- it 'enqueues the build' do
- subject
-
- expect(ci_build.pending?).to be_truthy
- end
-end
diff --git a/spec/services/ci/fetch_kubernetes_token_service_spec.rb b/spec/services/ci/fetch_kubernetes_token_service_spec.rb
deleted file mode 100644
index 1d05c9671a9..00000000000
--- a/spec/services/ci/fetch_kubernetes_token_service_spec.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-require 'spec_helper'
-
-describe Ci::FetchKubernetesTokenService do
- describe '#execute' do
- subject { described_class.new(api_url, ca_pem, username, password).execute }
-
- let(:api_url) { 'http://111.111.111.111' }
- let(:ca_pem) { '' }
- let(:username) { 'admin' }
- let(:password) { 'xxx' }
-
- context 'when params correct' do
- let(:token) { 'xxx.token.xxx' }
-
- let(:secrets_json) do
- [
- {
- 'metadata': {
- name: metadata_name
- },
- 'data': {
- 'token': Base64.encode64(token)
- }
- }
- ]
- end
-
- before do
- allow_any_instance_of(Kubeclient::Client)
- .to receive(:get_secrets).and_return(secrets_json)
- end
-
- context 'when default-token exists' do
- let(:metadata_name) { 'default-token-123' }
-
- it { is_expected.to eq(token) }
- end
-
- context 'when default-token does not exist' do
- let(:metadata_name) { 'another-token-123' }
-
- it { is_expected.to be_nil }
- end
- end
-
- context 'when api_url is nil' do
- let(:api_url) { nil }
-
- it { expect { subject }.to raise_error("Incomplete settings") }
- end
-
- context 'when username is nil' do
- let(:username) { nil }
-
- it { expect { subject }.to raise_error("Incomplete settings") }
- end
-
- context 'when password is nil' do
- let(:password) { nil }
-
- it { expect { subject }.to raise_error("Incomplete settings") }
- end
- end
-end
diff --git a/spec/services/ci/process_build_service_spec.rb b/spec/services/ci/process_build_service_spec.rb
new file mode 100644
index 00000000000..704685417bb
--- /dev/null
+++ b/spec/services/ci/process_build_service_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Ci::ProcessBuildService, '#execute' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+
+ subject { described_class.new(project, user).execute(build, current_status) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'when build has on_success option' do
+ let(:build) { create(:ci_build, :created, when: :on_success, user: user, project: project) }
+
+ context 'when current status is success' do
+ let(:current_status) { 'success' }
+
+ it 'changes the build status' do
+ expect { subject }.to change { build.status }.to('pending')
+ end
+ end
+
+ context 'when current status is failed' do
+ let(:current_status) { 'failed' }
+
+ it 'does not change the build status' do
+ expect { subject }.to change { build.status }.to('skipped')
+ end
+ end
+ end
+
+ context 'when build has on_failure option' do
+ let(:build) { create(:ci_build, :created, when: :on_failure, user: user, project: project) }
+
+ context 'when current status is success' do
+ let(:current_status) { 'success' }
+
+ it 'changes the build status' do
+ expect { subject }.to change { build.status }.to('skipped')
+ end
+ end
+
+ context 'when current status is failed' do
+ let(:current_status) { 'failed' }
+
+ it 'does not change the build status' do
+ expect { subject }.to change { build.status }.to('pending')
+ end
+ end
+ end
+
+ context 'when build has always option' do
+ let(:build) { create(:ci_build, :created, when: :always, user: user, project: project) }
+
+ context 'when current status is success' do
+ let(:current_status) { 'success' }
+
+ it 'changes the build status' do
+ expect { subject }.to change { build.status }.to('pending')
+ end
+ end
+
+ context 'when current status is failed' do
+ let(:current_status) { 'failed' }
+
+ it 'does not change the build status' do
+ expect { subject }.to change { build.status }.to('pending')
+ end
+ end
+ end
+
+ context 'when build has manual option' do
+ let(:build) { create(:ci_build, :created, :actionable, user: user, project: project) }
+
+ context 'when current status is success' do
+ let(:current_status) { 'success' }
+
+ it 'changes the build status' do
+ expect { subject }.to change { build.status }.to('manual')
+ end
+ end
+
+ context 'when current status is failed' do
+ let(:current_status) { 'failed' }
+
+ it 'does not change the build status' do
+ expect { subject }.to change { build.status }.to('skipped')
+ end
+ end
+ end
+
+ context 'when build has delayed option' do
+ before do
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at) { }
+ end
+
+ let(:build) { create(:ci_build, :created, :schedulable, user: user, project: project) }
+
+ context 'when current status is success' do
+ let(:current_status) { 'success' }
+
+ it 'changes the build status' do
+ expect { subject }.to change { build.status }.to('scheduled')
+ end
+ end
+
+ context 'when current status is failed' do
+ let(:current_status) { 'failed' }
+
+ it 'does not change the build status' do
+ expect { subject }.to change { build.status }.to('skipped')
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/process_pipeline_service_spec.rb b/spec/services/ci/process_pipeline_service_spec.rb
index feb5120bc68..538992b621e 100644
--- a/spec/services/ci/process_pipeline_service_spec.rb
+++ b/spec/services/ci/process_pipeline_service_spec.rb
@@ -31,17 +31,14 @@ describe Ci::ProcessPipelineService, '#execute' do
succeed_pending
expect(builds.success.count).to eq(2)
- expect(process_pipeline).to be_truthy
succeed_pending
expect(builds.success.count).to eq(4)
- expect(process_pipeline).to be_truthy
succeed_pending
expect(builds.success.count).to eq(5)
- expect(process_pipeline).to be_falsey
end
it 'does not process pipeline if existing stage is running' do
@@ -242,6 +239,187 @@ describe Ci::ProcessPipelineService, '#execute' do
end
end
+ context 'when delayed jobs are defined' do
+ context 'when the scene is timed incremental rollout' do
+ before do
+ create_build('build', stage_idx: 0)
+ create_build('rollout10%', **delayed_options, stage_idx: 1)
+ create_build('rollout100%', **delayed_options, stage_idx: 2)
+ create_build('cleanup', stage_idx: 3)
+
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+ end
+
+ context 'when builds are successful' do
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'build': 'pending' })
+
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'scheduled' })
+
+ enqueue_scheduled('rollout10%')
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'success', 'rollout100%': 'scheduled' })
+
+ enqueue_scheduled('rollout100%')
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'success', 'rollout100%': 'success', 'cleanup': 'pending' })
+
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'success', 'rollout100%': 'success', 'cleanup': 'success' })
+ expect(pipeline.reload.status).to eq 'success'
+ end
+ end
+
+ context 'when build job fails' do
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'build': 'pending' })
+
+ fail_running_or_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'failed' })
+ expect(pipeline.reload.status).to eq 'failed'
+ end
+ end
+
+ context 'when rollout 10% is unscheduled' do
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'build': 'pending' })
+
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'scheduled' })
+
+ unschedule
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'manual' })
+ expect(pipeline.reload.status).to eq 'manual'
+ end
+
+ context 'when user plays rollout 10%' do
+ it 'schedules rollout100%' do
+ process_pipeline
+ succeed_pending
+ unschedule
+ play_manual_action('rollout10%')
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'success', 'rollout100%': 'scheduled' })
+ expect(pipeline.reload.status).to eq 'scheduled'
+ end
+ end
+ end
+
+ context 'when rollout 10% fails' do
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'build': 'pending' })
+
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'scheduled' })
+
+ enqueue_scheduled('rollout10%')
+ fail_running_or_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'failed' })
+ expect(pipeline.reload.status).to eq 'failed'
+ end
+
+ context 'when user retries rollout 10%' do
+ it 'does not schedule rollout10% again' do
+ process_pipeline
+ succeed_pending
+ enqueue_scheduled('rollout10%')
+ fail_running_or_pending
+ retry_build('rollout10%')
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'pending' })
+ expect(pipeline.reload.status).to eq 'running'
+ end
+ end
+ end
+
+ context 'when rollout 10% is played immidiately' do
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'build': 'pending' })
+
+ succeed_pending
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'scheduled' })
+
+ play_manual_action('rollout10%')
+
+ expect(builds_names_and_statuses).to eq({ 'build': 'success', 'rollout10%': 'pending' })
+ expect(pipeline.reload.status).to eq 'running'
+ end
+ end
+ end
+
+ context 'when only one scheduled job exists in a pipeline' do
+ before do
+ create_build('delayed', **delayed_options, stage_idx: 0)
+
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+ end
+
+ it 'properly processes the pipeline' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'delayed': 'scheduled' })
+
+ expect(pipeline.reload.status).to eq 'scheduled'
+ end
+ end
+
+ context 'when there are two delayed jobs in a stage' do
+ before do
+ create_build('delayed1', **delayed_options, stage_idx: 0)
+ create_build('delayed2', **delayed_options, stage_idx: 0)
+ create_build('job', stage_idx: 1)
+
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+ end
+
+ it 'blocks the stage until all scheduled jobs finished' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'delayed1': 'scheduled', 'delayed2': 'scheduled' })
+
+ enqueue_scheduled('delayed1')
+
+ expect(builds_names_and_statuses).to eq({ 'delayed1': 'pending', 'delayed2': 'scheduled' })
+ expect(pipeline.reload.status).to eq 'running'
+ end
+ end
+
+ context 'when a delayed job is allowed to fail' do
+ before do
+ create_build('delayed', **delayed_options, allow_failure: true, stage_idx: 0)
+ create_build('job', stage_idx: 1)
+
+ allow(Ci::BuildScheduleWorker).to receive(:perform_at)
+ end
+
+ it 'blocks the stage and continues after it failed' do
+ expect(process_pipeline).to be_truthy
+ expect(builds_names_and_statuses).to eq({ 'delayed': 'scheduled' })
+
+ enqueue_scheduled('delayed')
+ fail_running_or_pending
+
+ expect(builds_names_and_statuses).to eq({ 'delayed': 'failed', 'job': 'pending' })
+ expect(pipeline.reload.status).to eq 'pending'
+ end
+ end
+ end
+
context 'when there are manual action in earlier stages' do
context 'when first stage has only optional manual actions' do
before do
@@ -493,9 +671,9 @@ describe Ci::ProcessPipelineService, '#execute' do
context 'when builds with auto-retries are configured' do
before do
- create_build('build:1', stage_idx: 0, user: user, options: { retry: 2 })
+ create_build('build:1', stage_idx: 0, user: user, options: { retry: { max: 2 } })
create_build('test:1', stage_idx: 1, user: user, when: :on_failure)
- create_build('test:2', stage_idx: 1, user: user, options: { retry: 1 })
+ create_build('test:2', stage_idx: 1, user: user, options: { retry: { max: 1 } })
end
it 'automatically retries builds in a valid order' do
@@ -536,6 +714,13 @@ describe Ci::ProcessPipelineService, '#execute' do
builds.pluck(:name)
end
+ def builds_names_and_statuses
+ builds.each_with_object({}) do |b, h|
+ h[b.name.to_sym] = b.status
+ h
+ end
+ end
+
def all_builds_names
all_builds.pluck(:name)
end
@@ -549,7 +734,7 @@ describe Ci::ProcessPipelineService, '#execute' do
end
def succeed_pending
- builds.pending.update_all(status: 'success')
+ builds.pending.map(&:success)
end
def succeed_running_or_pending
@@ -568,6 +753,14 @@ describe Ci::ProcessPipelineService, '#execute' do
builds.find_by(name: name).play(user)
end
+ def enqueue_scheduled(name)
+ builds.scheduled.find_by(name: name).enqueue
+ end
+
+ def retry_build(name)
+ Ci::Build.retry(builds.find_by(name: name), user)
+ end
+
def manual_actions
pipeline.manual_actions(true)
end
@@ -575,4 +768,12 @@ describe Ci::ProcessPipelineService, '#execute' do
def create_build(name, **opts)
create(:ci_build, :created, pipeline: pipeline, name: name, **opts)
end
+
+ def delayed_options
+ { when: 'delayed', options: { start_in: '1 minute' } }
+ end
+
+ def unschedule
+ pipeline.builds.scheduled.map(&:unschedule)
+ end
end
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index a6565709641..56e2a405bcd 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -478,6 +478,20 @@ module Ci
it_behaves_like 'validation is not active'
end
end
+
+ context 'when build is degenerated' do
+ let!(:pending_job) { create(:ci_build, :pending, :degenerated, pipeline: pipeline) }
+
+ subject { execute(specific_runner, {}) }
+
+ it 'does not pick the build and drops the build' do
+ expect(subject).to be_nil
+
+ pending_job.reload
+ expect(pending_job).to be_failed
+ expect(pending_job).to be_archived_failure
+ end
+ end
end
describe '#register_success' do
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
index 18d52082399..e779675744c 100644
--- a/spec/services/ci/retry_build_service_spec.rb
+++ b/spec/services/ci/retry_build_service_spec.rb
@@ -24,11 +24,15 @@ describe Ci::RetryBuildService do
artifacts_file artifacts_metadata artifacts_size created_at
updated_at started_at finished_at queued_at erased_by
erased_at auto_canceled_by job_artifacts job_artifacts_archive
- job_artifacts_metadata job_artifacts_trace job_artifacts_junit].freeze
+ job_artifacts_metadata job_artifacts_trace job_artifacts_junit
+ job_artifacts_sast job_artifacts_dependency_scanning
+ job_artifacts_container_scanning job_artifacts_dast
+ job_artifacts_license_management job_artifacts_performance
+ job_artifacts_codequality scheduled_at].freeze
IGNORE_ACCESSORS =
%i[type lock_version target_url base_tags trace_sections
- commit_id deployments erased_by_id last_deployment project_id
+ commit_id deployment erased_by_id project_id
runner_id tag_taggings taggings tags trigger_request_id
user_id auto_canceled_by_id retried failure_reason
artifacts_file_store artifacts_metadata_store
@@ -38,11 +42,11 @@ describe Ci::RetryBuildService do
let(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
let(:build) do
- create(:ci_build, :failed, :artifacts, :test_reports, :expired, :erased,
- :queued, :coverage, :tags, :allowed_to_fail, :on_tag,
- :triggered, :trace_artifact, :teardown_environment,
+ create(:ci_build, :failed, :expired, :erased, :queued, :coverage, :tags,
+ :allowed_to_fail, :on_tag, :triggered, :teardown_environment,
description: 'my-job', stage: 'test', stage_id: stage.id,
- pipeline: pipeline, auto_canceled_by: another_pipeline)
+ pipeline: pipeline, auto_canceled_by: another_pipeline,
+ scheduled_at: 10.seconds.since)
end
before do
@@ -50,6 +54,15 @@ describe Ci::RetryBuildService do
# can reset one of the fields when assigning another. We plan to deprecate
# and remove legacy `stage` column in the future.
build.update(stage: 'test', stage_id: stage.id)
+
+ # Make sure we have one instance for every possible job_artifact_X
+ # associations to check they are correctly rejected on build duplication.
+ Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.each do |file_type, file_format|
+ create(:ci_job_artifact, file_format,
+ file_type: file_type, job: build, expire_at: build.artifacts_expire_at)
+ end
+
+ build.reload
end
describe 'clone accessors' do
diff --git a/spec/services/ci/run_scheduled_build_service_spec.rb b/spec/services/ci/run_scheduled_build_service_spec.rb
new file mode 100644
index 00000000000..be2aad33ef4
--- /dev/null
+++ b/spec/services/ci/run_scheduled_build_service_spec.rb
@@ -0,0 +1,62 @@
+require 'spec_helper'
+
+describe Ci::RunScheduledBuildService do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ subject { described_class.new(project, user).execute(build) }
+
+ context 'when user can update build' do
+ before do
+ project.add_developer(user)
+
+ create(:protected_branch, :developers_can_merge,
+ name: pipeline.ref, project: project)
+ end
+
+ context 'when build is scheduled' do
+ context 'when scheduled_at is expired' do
+ let(:build) { create(:ci_build, :expired_scheduled, user: user, project: project, pipeline: pipeline) }
+
+ it 'can run the build' do
+ expect { subject }.not_to raise_error
+
+ expect(build).to be_pending
+ end
+ end
+
+ context 'when scheduled_at is not expired' do
+ let(:build) { create(:ci_build, :scheduled, user: user, project: project, pipeline: pipeline) }
+
+ it 'can not run the build' do
+ expect { subject }.to raise_error(StateMachines::InvalidTransition)
+
+ expect(build).to be_scheduled
+ end
+ end
+ end
+
+ context 'when build is not scheduled' do
+ let(:build) { create(:ci_build, :created, user: user, project: project, pipeline: pipeline) }
+
+ it 'can not run the build' do
+ expect { subject }.to raise_error(StateMachines::InvalidTransition)
+
+ expect(build).to be_created
+ end
+ end
+ end
+
+ context 'when user can not update build' do
+ context 'when build is scheduled' do
+ let(:build) { create(:ci_build, :scheduled, user: user, project: project, pipeline: pipeline) }
+
+ it 'can not run the build' do
+ expect { subject }.to raise_error(Gitlab::Access::AccessDeniedError)
+
+ expect(build).to be_scheduled
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/applications/check_installation_progress_service_spec.rb b/spec/services/clusters/applications/check_installation_progress_service_spec.rb
index 986f11410fd..ea17f2bb423 100644
--- a/spec/services/clusters/applications/check_installation_progress_service_spec.rb
+++ b/spec/services/clusters/applications/check_installation_progress_service_spec.rb
@@ -19,6 +19,10 @@ describe Clusters::Applications::CheckInstallationProgressService do
shared_examples 'a not yet terminated installation' do |a_phase|
let(:phase) { a_phase }
+ before do
+ expect(service).to receive(:installation_phase).once.and_return(phase)
+ end
+
context "when phase is #{a_phase}" do
context 'when not timeouted' do
it 'reschedule a new check' do
@@ -50,8 +54,6 @@ describe Clusters::Applications::CheckInstallationProgressService do
end
before do
- expect(service).to receive(:installation_phase).once.and_return(phase)
-
allow(service).to receive(:installation_errors).and_return(errors)
allow(service).to receive(:remove_installation_pod).and_return(nil)
end
@@ -60,6 +62,10 @@ describe Clusters::Applications::CheckInstallationProgressService do
context 'when installation POD succeeded' do
let(:phase) { Gitlab::Kubernetes::Pod::SUCCEEDED }
+ before do
+ expect(service).to receive(:installation_phase).once.and_return(phase)
+ end
+
it_behaves_like 'a terminated installation'
it 'make the application installed' do
@@ -76,16 +82,37 @@ describe Clusters::Applications::CheckInstallationProgressService do
let(:phase) { Gitlab::Kubernetes::Pod::FAILED }
let(:errors) { 'test installation failed' }
+ before do
+ expect(service).to receive(:installation_phase).once.and_return(phase)
+ end
+
it_behaves_like 'a terminated installation'
it 'make the application errored' do
service.execute
expect(application).to be_errored
- expect(application.status_reason).to eq(errors)
+ expect(application.status_reason).to eq("Installation failed")
end
end
RESCHEDULE_PHASES.each { |phase| it_behaves_like 'a not yet terminated installation', phase }
+
+ context 'when installation raises a Kubeclient::HttpError' do
+ let(:cluster) { create(:cluster, :provided_by_user, :project) }
+
+ before do
+ application.update!(cluster: cluster)
+
+ expect(service).to receive(:installation_phase).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil))
+ end
+
+ it 'shows the response code from the error' do
+ service.execute
+
+ expect(application).to be_errored
+ expect(application.status_reason).to eq('Kubernetes error: 401')
+ end
+ end
end
end
diff --git a/spec/services/clusters/applications/create_service_spec.rb b/spec/services/clusters/applications/create_service_spec.rb
new file mode 100644
index 00000000000..0bd7719345e
--- /dev/null
+++ b/spec/services/clusters/applications/create_service_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Applications::CreateService do
+ include TestRequestHelpers
+
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+ let(:user) { create(:user) }
+ let(:params) { { application: 'helm' } }
+ let(:service) { described_class.new(cluster, user, params) }
+
+ describe '#execute' do
+ before do
+ allow(ClusterInstallAppWorker).to receive(:perform_async)
+ end
+
+ subject { service.execute(test_request) }
+
+ it 'creates an application' do
+ expect do
+ subject
+
+ cluster.reload
+ end.to change(cluster, :application_helm)
+ end
+
+ it 'schedules an install via worker' do
+ expect(ClusterInstallAppWorker).to receive(:perform_async).with('helm', anything).once
+
+ subject
+ end
+
+ context 'jupyter application' do
+ let(:params) do
+ {
+ application: 'jupyter',
+ hostname: 'example.com'
+ }
+ end
+
+ before do
+ allow_any_instance_of(Clusters::Applications::ScheduleInstallationService).to receive(:execute)
+ end
+
+ it 'creates the application' do
+ expect do
+ subject
+
+ cluster.reload
+ end.to change(cluster, :application_jupyter)
+ end
+
+ it 'sets the hostname' do
+ expect(subject.hostname).to eq('example.com')
+ end
+
+ it 'sets the oauth_application' do
+ expect(subject.oauth_application).to be_present
+ end
+ end
+
+ context 'knative application' do
+ let(:params) do
+ {
+ application: 'knative',
+ hostname: 'example.com'
+ }
+ end
+
+ before do
+ allow_any_instance_of(Clusters::Applications::ScheduleInstallationService).to receive(:execute)
+ end
+
+ it 'creates the application' do
+ expect do
+ subject
+
+ cluster.reload
+ end.to change(cluster, :application_knative)
+ end
+
+ it 'sets the hostname' do
+ expect(subject.hostname).to eq('example.com')
+ end
+ end
+
+ context 'invalid application' do
+ let(:params) { { application: 'non-existent' } }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Clusters::Applications::CreateService::InvalidApplicationError)
+ end
+ end
+
+ context 'group cluster' do
+ let(:cluster) { create(:cluster, :provided_by_gcp, :group) }
+
+ using RSpec::Parameterized::TableSyntax
+
+ before do
+ allow_any_instance_of(Clusters::Applications::ScheduleInstallationService).to receive(:execute)
+ end
+
+ where(:application, :association, :allowed) do
+ 'helm' | :application_helm | true
+ 'ingress' | :application_ingress | true
+ 'runner' | :application_runner | false
+ 'jupyter' | :application_jupyter | false
+ 'prometheus' | :application_prometheus | false
+ end
+
+ with_them do
+ let(:params) { { application: application } }
+
+ it 'executes for each application' do
+ if allowed
+ expect do
+ subject
+
+ cluster.reload
+ end.to change(cluster, association)
+ else
+ expect { subject }.to raise_error(Clusters::Applications::CreateService::InvalidApplicationError)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/applications/install_service_spec.rb b/spec/services/clusters/applications/install_service_spec.rb
index a744ec30b65..2f801d019fe 100644
--- a/spec/services/clusters/applications/install_service_spec.rb
+++ b/spec/services/clusters/applications/install_service_spec.rb
@@ -42,7 +42,7 @@ describe Clusters::Applications::InstallService do
service.execute
expect(application).to be_errored
- expect(application.status_reason).to match(/kubernetes error:/i)
+ expect(application.status_reason).to match('Kubernetes error: 500')
end
end
diff --git a/spec/services/clusters/applications/schedule_installation_service_spec.rb b/spec/services/clusters/applications/schedule_installation_service_spec.rb
index bca1e71bef2..21797edd533 100644
--- a/spec/services/clusters/applications/schedule_installation_service_spec.rb
+++ b/spec/services/clusters/applications/schedule_installation_service_spec.rb
@@ -10,14 +10,13 @@ describe Clusters::Applications::ScheduleInstallationService do
expect(ClusterInstallAppWorker).not_to receive(:perform_async)
count_before = count_scheduled
- expect { service.execute(application) }.to raise_error(StandardError)
+ expect { service.execute }.to raise_error(StandardError)
expect(count_scheduled).to eq(count_before)
end
end
describe '#execute' do
- let(:project) { double(:project) }
- let(:service) { described_class.new(project, nil) }
+ let(:service) { described_class.new(application) }
context 'when application is installable' do
let(:application) { create(:clusters_applications_helm, :installable) }
@@ -25,7 +24,7 @@ describe Clusters::Applications::ScheduleInstallationService do
it 'make the application scheduled' do
expect(ClusterInstallAppWorker).to receive(:perform_async).with(application.name, kind_of(Numeric)).once
- expect { service.execute(application) }.to change { application.class.with_status(:scheduled).count }.by(1)
+ expect { service.execute }.to change { application.class.with_status(:scheduled).count }.by(1)
end
end
diff --git a/spec/services/clusters/create_service_spec.rb b/spec/services/clusters/create_service_spec.rb
index 1685dc748bd..274880f2c49 100644
--- a/spec/services/clusters/create_service_spec.rb
+++ b/spec/services/clusters/create_service_spec.rb
@@ -5,18 +5,43 @@ describe Clusters::CreateService do
let(:project) { create(:project) }
let(:user) { create(:user) }
- subject { described_class.new(project, user, params).execute(access_token) }
+ subject { described_class.new(user, params).execute(access_token: access_token) }
context 'when provider is gcp' do
context 'when project has no clusters' do
context 'when correct params' do
- include_context 'valid cluster create params'
+ let(:params) do
+ {
+ name: 'test-cluster',
+ provider_type: :gcp,
+ provider_gcp_attributes: {
+ gcp_project_id: 'gcp-project',
+ zone: 'us-central1-a',
+ num_nodes: 1,
+ machine_type: 'machine_type-a',
+ legacy_abac: 'true'
+ },
+ clusterable: project
+ }
+ end
include_examples 'create cluster service success'
end
context 'when invalid params' do
- include_context 'invalid cluster create params'
+ let(:params) do
+ {
+ name: 'test-cluster',
+ provider_type: :gcp,
+ provider_gcp_attributes: {
+ gcp_project_id: '!!!!!!!',
+ zone: 'us-central1-a',
+ num_nodes: 1,
+ machine_type: 'machine_type-a'
+ },
+ clusterable: project
+ }
+ end
include_examples 'create cluster service error'
end
diff --git a/spec/services/clusters/gcp/fetch_operation_service_spec.rb b/spec/services/clusters/gcp/fetch_operation_service_spec.rb
index e2fa93904c5..55f123ee786 100644
--- a/spec/services/clusters/gcp/fetch_operation_service_spec.rb
+++ b/spec/services/clusters/gcp/fetch_operation_service_spec.rb
@@ -24,7 +24,7 @@ describe Clusters::Gcp::FetchOperationService do
end
end
- context 'when suceeded to fetch operation' do
+ context 'when succeeded to fetch operation' do
before do
stub_cloud_platform_get_zone_operation(gcp_project_id, zone, operation_id)
end
diff --git a/spec/services/clusters/gcp/finalize_creation_service_spec.rb b/spec/services/clusters/gcp/finalize_creation_service_spec.rb
index 0cf91307589..efee158739d 100644
--- a/spec/services/clusters/gcp/finalize_creation_service_spec.rb
+++ b/spec/services/clusters/gcp/finalize_creation_service_spec.rb
@@ -1,111 +1,176 @@
+# frozen_string_literal: true
+
require 'spec_helper'
-describe Clusters::Gcp::FinalizeCreationService do
+describe Clusters::Gcp::FinalizeCreationService, '#execute' do
include GoogleApi::CloudPlatformHelpers
include KubernetesHelpers
- describe '#execute' do
- let(:cluster) { create(:cluster, :project, :providing_by_gcp) }
- let(:provider) { cluster.provider }
- let(:platform) { cluster.platform }
- let(:gcp_project_id) { provider.gcp_project_id }
- let(:zone) { provider.zone }
- let(:cluster_name) { cluster.name }
+ let(:cluster) { create(:cluster, :project, :providing_by_gcp) }
+ let(:provider) { cluster.provider }
+ let(:platform) { cluster.platform }
+ let(:endpoint) { '111.111.111.111' }
+ let(:api_url) { 'https://' + endpoint }
+ let(:username) { 'sample-username' }
+ let(:password) { 'sample-password' }
+ let(:secret_name) { 'gitlab-token' }
+ let(:token) { 'sample-token' }
+ let(:namespace) { "#{cluster.project.path}-#{cluster.project.id}" }
- shared_examples 'success' do
- it 'configures provider and kubernetes' do
- described_class.new.execute(provider)
+ subject { described_class.new.execute(provider) }
- expect(provider).to be_created
- end
+ shared_examples 'success' do
+ it 'configures provider and kubernetes' do
+ subject
+
+ expect(provider).to be_created
end
- shared_examples 'error' do
- it 'sets an error to provider object' do
- described_class.new.execute(provider)
+ it 'properly configures database models' do
+ subject
- expect(provider.reload).to be_errored
- end
+ cluster.reload
+
+ expect(provider.endpoint).to eq(endpoint)
+ expect(platform.api_url).to eq(api_url)
+ expect(platform.ca_cert).to eq(Base64.decode64(load_sample_cert).strip)
+ expect(platform.username).to eq(username)
+ expect(platform.password).to eq(password)
+ expect(platform.token).to eq(token)
end
- context 'when suceeded to fetch gke cluster info' do
- let(:endpoint) { '111.111.111.111' }
- let(:api_url) { 'https://' + endpoint }
- let(:username) { 'sample-username' }
- let(:password) { 'sample-password' }
+ it 'creates kubernetes namespace model' do
+ subject
- before do
- stub_cloud_platform_get_zone_cluster(
- gcp_project_id, zone, cluster_name,
- {
- endpoint: endpoint,
- username: username,
- password: password
- }
- )
-
- stub_kubeclient_discover(api_url)
- end
+ kubernetes_namespace = cluster.reload.kubernetes_namespace
+ expect(kubernetes_namespace).to be_persisted
+ expect(kubernetes_namespace.namespace).to eq(namespace)
+ expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account")
+ expect(kubernetes_namespace.service_account_token).to be_present
+ end
+ end
- context 'when suceeded to fetch kuberenetes token' do
- let(:token) { 'sample-token' }
-
- before do
- stub_kubeclient_get_secrets(
- api_url,
- {
- token: Base64.encode64(token)
- } )
- end
-
- it_behaves_like 'success'
-
- it 'has corresponded data' do
- described_class.new.execute(provider)
- cluster.reload
- provider.reload
- platform.reload
-
- expect(provider.endpoint).to eq(endpoint)
- expect(platform.api_url).to eq(api_url)
- expect(platform.ca_cert).to eq(Base64.decode64(load_sample_cert))
- expect(platform.username).to eq(username)
- expect(platform.password).to eq(password)
- expect(platform.token).to eq(token)
- end
- end
+ shared_examples 'error' do
+ it 'sets an error to provider object' do
+ subject
- context 'when default-token is not found' do
- before do
- stub_kubeclient_get_secrets(api_url, metadata_name: 'aaaa')
- end
+ expect(provider.reload).to be_errored
+ end
+ end
- it_behaves_like 'error'
+ shared_examples 'kubernetes information not successfully fetched' do
+ context 'when failed to fetch gke cluster info' do
+ before do
+ stub_cloud_platform_get_zone_cluster_error(provider.gcp_project_id, provider.zone, cluster.name)
end
- context 'when token is empty' do
- before do
- stub_kubeclient_get_secrets(api_url, token: '')
- end
+ it_behaves_like 'error'
+ end
- it_behaves_like 'error'
- end
+ context 'when token is empty' do
+ let(:token) { '' }
- context 'when failed to fetch kuberenetes token' do
- before do
- stub_kubeclient_get_secrets_error(api_url)
- end
+ it_behaves_like 'error'
+ end
- it_behaves_like 'error'
+ context 'when failed to fetch kubernetes token' do
+ before do
+ stub_kubeclient_get_secret_error(api_url, secret_name, namespace: 'default')
end
+
+ it_behaves_like 'error'
end
- context 'when failed to fetch gke cluster info' do
+ context 'when service account fails to create' do
before do
- stub_cloud_platform_get_zone_cluster_error(gcp_project_id, zone, cluster_name)
+ stub_kubeclient_create_service_account_error(api_url, namespace: 'default')
end
it_behaves_like 'error'
end
end
+
+ shared_context 'kubernetes information successfully fetched' do
+ before do
+ stub_cloud_platform_get_zone_cluster(
+ provider.gcp_project_id, provider.zone, cluster.name,
+ {
+ endpoint: endpoint,
+ username: username,
+ password: password
+ }
+ )
+
+ stub_kubeclient_discover(api_url)
+ stub_kubeclient_get_namespace(api_url)
+ stub_kubeclient_create_namespace(api_url)
+ stub_kubeclient_create_service_account(api_url)
+ stub_kubeclient_create_secret(api_url)
+
+ stub_kubeclient_get_secret(
+ api_url,
+ {
+ metadata_name: secret_name,
+ token: Base64.encode64(token),
+ namespace: 'default'
+ }
+ )
+
+ stub_kubeclient_get_namespace(api_url, namespace: namespace)
+ stub_kubeclient_create_service_account(api_url, namespace: namespace)
+ stub_kubeclient_create_secret(api_url, namespace: namespace)
+
+ stub_kubeclient_get_secret(
+ api_url,
+ {
+ metadata_name: "#{namespace}-token",
+ token: Base64.encode64(token),
+ namespace: namespace
+ }
+ )
+ end
+ end
+
+ context 'With a legacy ABAC cluster' do
+ before do
+ provider.legacy_abac = true
+ end
+
+ include_context 'kubernetes information successfully fetched'
+
+ it_behaves_like 'success'
+
+ it 'uses ABAC authorization type' do
+ subject
+ cluster.reload
+
+ expect(platform).to be_abac
+ expect(platform.authorization_type).to eq('abac')
+ end
+
+ it_behaves_like 'kubernetes information not successfully fetched'
+ end
+
+ context 'With an RBAC cluster' do
+ before do
+ provider.legacy_abac = false
+
+ stub_kubeclient_create_cluster_role_binding(api_url)
+ stub_kubeclient_create_role_binding(api_url, namespace: namespace)
+ end
+
+ include_context 'kubernetes information successfully fetched'
+
+ it_behaves_like 'success'
+
+ it 'uses RBAC authorization type' do
+ subject
+ cluster.reload
+
+ expect(platform).to be_rbac
+ expect(platform.authorization_type).to eq('rbac')
+ end
+
+ it_behaves_like 'kubernetes information not successfully fetched'
+ end
end
diff --git a/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb
new file mode 100644
index 00000000000..661364ac765
--- /dev/null
+++ b/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb
@@ -0,0 +1,115 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService, '#execute' do
+ include KubernetesHelpers
+
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+ let(:platform) { cluster.platform }
+ let(:api_url) { 'https://kubernetes.example.com' }
+ let(:project) { cluster.project }
+ let(:cluster_project) { cluster.cluster_project }
+
+ subject do
+ described_class.new(
+ cluster: cluster,
+ kubernetes_namespace: kubernetes_namespace
+ ).execute
+ end
+
+ shared_context 'kubernetes requests' do
+ before do
+ stub_kubeclient_discover(api_url)
+ stub_kubeclient_get_namespace(api_url)
+ stub_kubeclient_create_service_account(api_url)
+ stub_kubeclient_create_secret(api_url)
+
+ stub_kubeclient_get_namespace(api_url, namespace: namespace)
+ stub_kubeclient_create_service_account(api_url, namespace: namespace)
+ stub_kubeclient_create_secret(api_url, namespace: namespace)
+
+ stub_kubeclient_get_secret(
+ api_url,
+ {
+ metadata_name: "#{namespace}-token",
+ token: Base64.encode64('sample-token'),
+ namespace: namespace
+ }
+ )
+ end
+ end
+
+ context 'when kubernetes namespace is not persisted' do
+ let(:namespace) { "#{project.path}-#{project.id}" }
+
+ let(:kubernetes_namespace) do
+ create(:cluster_kubernetes_namespace,
+ cluster: cluster,
+ project: cluster_project.project,
+ cluster_project: cluster_project)
+ end
+
+ include_context 'kubernetes requests'
+
+ it 'creates a Clusters::KubernetesNamespace' do
+ expect do
+ subject
+ end.to change(Clusters::KubernetesNamespace, :count).by(1)
+ end
+
+ it 'creates project service account' do
+ expect_any_instance_of(Clusters::Gcp::Kubernetes::CreateServiceAccountService).to receive(:execute).once
+
+ subject
+ end
+
+ it 'configures kubernetes token' do
+ subject
+
+ kubernetes_namespace.reload
+ expect(kubernetes_namespace.namespace).to eq(namespace)
+ expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account")
+ expect(kubernetes_namespace.encrypted_service_account_token).to be_present
+ end
+ end
+
+ context 'when there is a Kubernetes Namespace associated' do
+ let(:namespace) { 'new-namespace' }
+
+ let(:kubernetes_namespace) do
+ create(:cluster_kubernetes_namespace,
+ cluster: cluster,
+ project: cluster_project.project,
+ cluster_project: cluster_project)
+ end
+
+ include_context 'kubernetes requests'
+
+ before do
+ platform.update_column(:namespace, 'new-namespace')
+ end
+
+ it 'does not create any Clusters::KubernetesNamespace' do
+ subject
+
+ expect(cluster.kubernetes_namespace).to eq(kubernetes_namespace)
+ end
+
+ it 'creates project service account' do
+ expect_any_instance_of(Clusters::Gcp::Kubernetes::CreateServiceAccountService).to receive(:execute).once
+
+ subject
+ end
+
+ it 'updates Clusters::KubernetesNamespace' do
+ subject
+
+ kubernetes_namespace.reload
+
+ expect(kubernetes_namespace.namespace).to eq(namespace)
+ expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account")
+ expect(kubernetes_namespace.encrypted_service_account_token).to be_present
+ end
+ end
+end
diff --git a/spec/services/clusters/gcp/kubernetes/create_service_account_service_spec.rb b/spec/services/clusters/gcp/kubernetes/create_service_account_service_spec.rb
new file mode 100644
index 00000000000..588edff85d4
--- /dev/null
+++ b/spec/services/clusters/gcp/kubernetes/create_service_account_service_spec.rb
@@ -0,0 +1,166 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Clusters::Gcp::Kubernetes::CreateServiceAccountService do
+ include KubernetesHelpers
+
+ let(:api_url) { 'http://111.111.111.111' }
+ let(:platform_kubernetes) { cluster.platform_kubernetes }
+ let(:cluster_project) { cluster.cluster_project }
+ let(:project) { cluster_project.project }
+ let(:cluster) do
+ create(:cluster,
+ :project, :provided_by_gcp,
+ platform_kubernetes: create(:cluster_platform_kubernetes, :configured))
+ end
+
+ let(:kubeclient) do
+ Gitlab::Kubernetes::KubeClient.new(
+ api_url,
+ auth_options: { username: 'admin', password: 'xxx' }
+ )
+ end
+
+ shared_examples 'creates service account and token' do
+ it 'creates a kubernetes service account' do
+ subject
+
+ expect(WebMock).to have_requested(:post, api_url + "/api/v1/namespaces/#{namespace}/serviceaccounts").with(
+ body: hash_including(
+ kind: 'ServiceAccount',
+ metadata: { name: service_account_name, namespace: namespace }
+ )
+ )
+ end
+
+ it 'creates a kubernetes secret' do
+ subject
+
+ expect(WebMock).to have_requested(:post, api_url + "/api/v1/namespaces/#{namespace}/secrets").with(
+ body: hash_including(
+ kind: 'Secret',
+ metadata: {
+ name: token_name,
+ namespace: namespace,
+ annotations: {
+ 'kubernetes.io/service-account.name': service_account_name
+ }
+ },
+ type: 'kubernetes.io/service-account-token'
+ )
+ )
+ end
+ end
+
+ before do
+ stub_kubeclient_discover(api_url)
+ stub_kubeclient_get_namespace(api_url, namespace: namespace)
+ stub_kubeclient_create_service_account(api_url, namespace: namespace )
+ stub_kubeclient_create_secret(api_url, namespace: namespace)
+ end
+
+ describe '.gitlab_creator' do
+ let(:namespace) { 'default' }
+ let(:service_account_name) { 'gitlab' }
+ let(:token_name) { 'gitlab-token' }
+
+ subject { described_class.gitlab_creator(kubeclient, rbac: rbac).execute }
+
+ context 'with ABAC cluster' do
+ let(:rbac) { false }
+
+ it_behaves_like 'creates service account and token'
+ end
+
+ context 'with RBAC cluster' do
+ let(:rbac) { true }
+
+ before do
+ cluster.platform_kubernetes.rbac!
+
+ stub_kubeclient_create_cluster_role_binding(api_url)
+ end
+
+ it_behaves_like 'creates service account and token'
+
+ it 'should create a cluster role binding with cluster-admin access' do
+ subject
+
+ expect(WebMock).to have_requested(:post, api_url + "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings").with(
+ body: hash_including(
+ kind: 'ClusterRoleBinding',
+ metadata: { name: 'gitlab-admin' },
+ roleRef: {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'ClusterRole',
+ name: 'cluster-admin'
+ },
+ subjects: [
+ {
+ kind: 'ServiceAccount',
+ name: service_account_name,
+ namespace: namespace
+ }
+ ]
+ )
+ )
+ end
+ end
+ end
+
+ describe '.namespace_creator' do
+ let(:namespace) { "#{project.path}-#{project.id}" }
+ let(:service_account_name) { "#{namespace}-service-account" }
+ let(:token_name) { "#{namespace}-token" }
+
+ subject do
+ described_class.namespace_creator(
+ kubeclient,
+ service_account_name: service_account_name,
+ service_account_namespace: namespace,
+ rbac: rbac
+ ).execute
+ end
+
+ context 'with ABAC cluster' do
+ let(:rbac) { false }
+
+ it_behaves_like 'creates service account and token'
+ end
+
+ context 'With RBAC enabled cluster' do
+ let(:rbac) { true }
+
+ before do
+ cluster.platform_kubernetes.rbac!
+
+ stub_kubeclient_create_role_binding(api_url, namespace: namespace)
+ end
+
+ it_behaves_like 'creates service account and token'
+
+ it 'creates a namespaced role binding with edit access' do
+ subject
+
+ expect(WebMock).to have_requested(:post, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/rolebindings").with(
+ body: hash_including(
+ kind: 'RoleBinding',
+ metadata: { name: "gitlab-#{namespace}", namespace: "#{namespace}" },
+ roleRef: {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'ClusterRole',
+ name: 'edit'
+ },
+ subjects: [
+ {
+ kind: 'ServiceAccount',
+ name: service_account_name,
+ namespace: namespace
+ }
+ ]
+ )
+ )
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/gcp/kubernetes/fetch_kubernetes_token_service_spec.rb b/spec/services/clusters/gcp/kubernetes/fetch_kubernetes_token_service_spec.rb
new file mode 100644
index 00000000000..a5806559b14
--- /dev/null
+++ b/spec/services/clusters/gcp/kubernetes/fetch_kubernetes_token_service_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Gcp::Kubernetes::FetchKubernetesTokenService do
+ include KubernetesHelpers
+
+ describe '#execute' do
+ let(:api_url) { 'http://111.111.111.111' }
+ let(:namespace) { 'my-namespace' }
+ let(:service_account_token_name) { 'gitlab-token' }
+
+ let(:kubeclient) do
+ Gitlab::Kubernetes::KubeClient.new(
+ api_url,
+ auth_options: { username: 'admin', password: 'xxx' }
+ )
+ end
+
+ subject { described_class.new(kubeclient, service_account_token_name, namespace).execute }
+
+ before do
+ stub_kubeclient_discover(api_url)
+ end
+
+ context 'when params correct' do
+ let(:decoded_token) { 'xxx.token.xxx' }
+ let(:token) { Base64.encode64(decoded_token) }
+
+ context 'when gitlab-token exists' do
+ before do
+ stub_kubeclient_get_secret(
+ api_url,
+ {
+ metadata_name: service_account_token_name,
+ namespace: namespace,
+ token: token
+ }
+ )
+ end
+
+ it { is_expected.to eq(decoded_token) }
+ end
+
+ context 'when there is a 500 error' do
+ before do
+ stub_kubeclient_get_secret_error(api_url, service_account_token_name, namespace: namespace, status: 500)
+ end
+
+ it { expect { subject }.to raise_error(Kubeclient::HttpError) }
+ end
+
+ context 'when gitlab-token does not exist' do
+ before do
+ stub_kubeclient_get_secret_error(api_url, service_account_token_name, namespace: namespace, status: 404)
+ end
+
+ it { is_expected.to be_nil }
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/gcp/provision_service_spec.rb b/spec/services/clusters/gcp/provision_service_spec.rb
index f48afdc83b2..c0bdac40938 100644
--- a/spec/services/clusters/gcp/provision_service_spec.rb
+++ b/spec/services/clusters/gcp/provision_service_spec.rb
@@ -26,7 +26,7 @@ describe Clusters::Gcp::ProvisionService do
end
end
- context 'when suceeded to request provision' do
+ context 'when succeeded to request provision' do
before do
stub_cloud_platform_create_cluster(gcp_project_id, zone)
end
diff --git a/spec/services/clusters/update_service_spec.rb b/spec/services/clusters/update_service_spec.rb
index 2d91a21035d..73f9be242a3 100644
--- a/spec/services/clusters/update_service_spec.rb
+++ b/spec/services/clusters/update_service_spec.rb
@@ -1,8 +1,10 @@
require 'spec_helper'
describe Clusters::UpdateService do
+ include KubernetesHelpers
+
describe '#execute' do
- subject { described_class.new(cluster.project, cluster.user, params).execute(cluster) }
+ subject { described_class.new(cluster.user, params).execute(cluster) }
let(:cluster) { create(:cluster, :project, :provided_by_user) }
@@ -34,6 +36,11 @@ describe Clusters::UpdateService do
}
end
+ before do
+ allow(ClusterPlatformConfigureWorker).to receive(:perform_async)
+ stub_kubeclient_get_namespace('https://kubernetes.example.com', namespace: 'my-namespace')
+ end
+
it 'updates namespace' do
is_expected.to eq(true)
expect(cluster.platform.namespace).to eq('custom-namespace')
@@ -55,5 +62,32 @@ describe Clusters::UpdateService do
expect(cluster.errors[:"platform_kubernetes.namespace"]).to be_present
end
end
+
+ context 'when cluster is provided by GCP' do
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+
+ let(:params) do
+ {
+ name: 'my-new-name'
+ }
+ end
+
+ it 'does not change cluster name' do
+ is_expected.to eq(false)
+
+ cluster.reload
+ expect(cluster.name).to eq('test-cluster')
+ end
+
+ context 'when cluster is being created' do
+ let(:cluster) { create(:cluster, :providing_by_gcp) }
+
+ it 'rejects changes' do
+ is_expected.to eq(false)
+
+ expect(cluster.errors.full_messages).to include('cannot modify during creation')
+ end
+ end
+ end
end
end
diff --git a/spec/services/commits/commit_patch_service_spec.rb b/spec/services/commits/commit_patch_service_spec.rb
new file mode 100644
index 00000000000..f4fcec2fbc2
--- /dev/null
+++ b/spec/services/commits/commit_patch_service_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Commits::CommitPatchService do
+ describe '#execute' do
+ let(:patches) do
+ patches_folder = Rails.root.join('spec/fixtures/patchfiles')
+ content_1 = File.read(File.join(patches_folder, "0001-This-does-not-apply-to-the-feature-branch.patch"))
+ content_2 = File.read(File.join(patches_folder, "0001-A-commit-from-a-patch.patch"))
+
+ [content_1, content_2]
+ end
+ let(:user) { project.creator }
+ let(:branch_name) { 'branch-with-patches' }
+ let(:project) { create(:project, :repository) }
+ let(:start_branch) { nil }
+ let(:params) { { branch_name: branch_name, patches: patches, start_branch: start_branch } }
+
+ subject(:service) do
+ described_class.new(project, user, params)
+ end
+
+ it 'returns a successful result' do
+ result = service.execute
+
+ branch = project.repository.find_branch(branch_name)
+
+ expect(result[:status]).to eq(:success)
+ expect(result[:result]).to eq(branch.target)
+ end
+
+ it 'is based off HEAD when no start ref is passed' do
+ service.execute
+
+ merge_base = project.repository.merge_base(project.repository.root_ref, branch_name)
+
+ expect(merge_base).to eq(project.repository.commit('HEAD').sha)
+ end
+
+ context 'when specifying a different start branch' do
+ let(:start_branch) { 'with-codeowners' }
+
+ it 'is based of the correct branch' do
+ service.execute
+
+ merge_base = project.repository.merge_base(start_branch, branch_name)
+
+ expect(merge_base).to eq(project.repository.commit(start_branch).sha)
+ end
+ end
+
+ shared_examples 'an error response' do |expected_message|
+ it 'returns the correct error' do
+ result = service.execute
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to match(expected_message)
+ end
+ end
+
+ context 'when the user does not have access' do
+ let(:user) { create(:user) }
+
+ it_behaves_like 'an error response',
+ 'You are not allowed to push into this branch'
+ end
+
+ context 'when the patches are not valid' do
+ let(:patches) { "a" * 2.1.megabytes }
+
+ it_behaves_like 'an error response', 'Patches are too big'
+ end
+
+ context 'when the new branch name is invalid' do
+ let(:branch_name) { 'HEAD' }
+
+ it_behaves_like 'an error response', 'Branch name is invalid'
+ end
+
+ context 'when the patches do not apply' do
+ let(:branch_name) { 'feature' }
+
+ it_behaves_like 'an error response', 'Patch failed at'
+ end
+
+ context 'when specifying a non existent start branch' do
+ let(:start_branch) { 'does-not-exist' }
+
+ it_behaves_like 'an error response', 'Invalid reference name'
+ end
+ end
+end
diff --git a/spec/services/create_deployment_service_spec.rb b/spec/services/create_deployment_service_spec.rb
deleted file mode 100644
index b9bfbb11511..00000000000
--- a/spec/services/create_deployment_service_spec.rb
+++ /dev/null
@@ -1,335 +0,0 @@
-require 'spec_helper'
-
-describe CreateDeploymentService do
- let(:user) { create(:user) }
- let(:options) { nil }
-
- let(:job) do
- create(:ci_build,
- ref: 'master',
- tag: false,
- environment: 'production',
- options: { environment: options })
- end
-
- let(:project) { job.project }
-
- let!(:environment) do
- create(:environment, project: project, name: 'production')
- end
-
- let(:service) { described_class.new(job) }
-
- before do
- allow_any_instance_of(Deployment).to receive(:create_ref)
- end
-
- describe '#execute' do
- subject { service.execute }
-
- context 'when environment exists' do
- it 'creates a deployment' do
- expect(subject).to be_persisted
- end
- end
-
- context 'when environment does not exist' do
- let(:environment) {}
-
- it 'does not create a deployment' do
- expect do
- expect(subject).to be_nil
- end.not_to change { Deployment.count }
- end
- end
-
- context 'when start action is defined' do
- let(:options) { { action: 'start' } }
-
- context 'and environment is stopped' do
- before do
- environment.stop
- end
-
- it 'makes environment available' do
- subject
-
- expect(environment.reload).to be_available
- end
-
- it 'creates a deployment' do
- expect(subject).to be_persisted
- end
- end
- end
-
- context 'when stop action is defined' do
- let(:options) { { action: 'stop' } }
-
- context 'and environment is available' do
- before do
- environment.start
- end
-
- it 'makes environment stopped' do
- subject
-
- expect(environment.reload).to be_stopped
- end
-
- it 'does not create a deployment' do
- expect(subject).to be_nil
- end
- end
- end
-
- context 'when variables are used' do
- let(:options) do
- { name: 'review-apps/$CI_COMMIT_REF_NAME',
- url: 'http://$CI_COMMIT_REF_NAME.review-apps.gitlab.com' }
- end
-
- before do
- environment.update(name: 'review-apps/master')
- job.update(environment: 'review-apps/$CI_COMMIT_REF_NAME')
- end
-
- it 'creates a new deployment' do
- expect(subject).to be_persisted
- end
-
- it 'does not create a new environment' do
- expect { subject }.not_to change { Environment.count }
- end
-
- it 'updates external url' do
- subject
-
- expect(subject.environment.name).to eq('review-apps/master')
- expect(subject.environment.external_url).to eq('http://master.review-apps.gitlab.com')
- end
- end
-
- context 'when project was removed' do
- let(:environment) {}
-
- before do
- job.update(project: nil)
- end
-
- it 'does not create deployment or environment' do
- expect { subject }.not_to raise_error
-
- expect(Environment.count).to be_zero
- expect(Deployment.count).to be_zero
- end
- end
- end
-
- describe '#expanded_environment_url' do
- subject { service.send(:expanded_environment_url) }
-
- context 'when yaml environment uses $CI_COMMIT_REF_NAME' do
- let(:job) do
- create(:ci_build,
- ref: 'master',
- options: { environment: { url: 'http://review/$CI_COMMIT_REF_NAME' } })
- end
-
- it { is_expected.to eq('http://review/master') }
- end
-
- context 'when yaml environment uses $CI_ENVIRONMENT_SLUG' do
- let(:job) do
- create(:ci_build,
- ref: 'master',
- environment: 'production',
- options: { environment: { url: 'http://review/$CI_ENVIRONMENT_SLUG' } })
- end
-
- let!(:environment) do
- create(:environment,
- project: job.project,
- name: 'production',
- slug: 'prod-slug',
- external_url: 'http://review/old')
- end
-
- it { is_expected.to eq('http://review/prod-slug') }
- end
-
- context 'when yaml environment uses yaml_variables containing symbol keys' do
- let(:job) do
- create(:ci_build,
- yaml_variables: [{ key: :APP_HOST, value: 'host' }],
- options: { environment: { url: 'http://review/$APP_HOST' } })
- end
-
- it { is_expected.to eq('http://review/host') }
- end
-
- context 'when yaml environment does not have url' do
- let(:job) { create(:ci_build, environment: 'staging') }
-
- let!(:environment) do
- create(:environment, project: job.project, name: job.environment)
- end
-
- it 'returns the external_url from persisted environment' do
- is_expected.to be_nil
- end
- end
- end
-
- describe 'processing of builds' do
- shared_examples 'does not create deployment' do
- it 'does not create a new deployment' do
- expect { subject }.not_to change { Deployment.count }
- end
-
- it 'does not call a service' do
- expect_any_instance_of(described_class).not_to receive(:execute)
-
- subject
- end
- end
-
- shared_examples 'creates deployment' do
- it 'creates a new deployment' do
- expect { subject }.to change { Deployment.count }.by(1)
- end
-
- it 'calls a service' do
- expect_any_instance_of(described_class).to receive(:execute)
-
- subject
- end
-
- it 'is set as deployable' do
- subject
-
- expect(Deployment.last.deployable).to eq(deployable)
- end
-
- it 'updates environment URL' do
- subject
-
- expect(Deployment.last.environment.external_url).not_to be_nil
- end
- end
-
- context 'without environment specified' do
- let(:job) { create(:ci_build) }
-
- it_behaves_like 'does not create deployment' do
- subject { job.success }
- end
- end
-
- context 'when environment is specified' do
- let(:deployable) { job }
-
- let(:options) do
- { environment: { name: 'production', url: 'http://gitlab.com' } }
- end
-
- context 'when job succeeds' do
- it_behaves_like 'creates deployment' do
- subject { job.success }
- end
- end
-
- context 'when job fails' do
- it_behaves_like 'does not create deployment' do
- subject { job.drop }
- end
- end
-
- context 'when job is retried' do
- it_behaves_like 'creates deployment' do
- before do
- stub_not_protect_default_branch
-
- project.add_developer(user)
- end
-
- let(:deployable) { Ci::Build.retry(job, user) }
-
- subject { deployable.success }
- end
- end
- end
- end
-
- describe "merge request metrics" do
- let(:merge_request) { create(:merge_request, target_branch: 'master', source_branch: 'feature', source_project: project) }
-
- context "while updating the 'first_deployed_to_production_at' time" do
- before do
- merge_request.metrics.update!(merged_at: Time.now)
- end
-
- context "for merge requests merged before the current deploy" do
- it "sets the time if the deploy's environment is 'production'" do
- time = Time.now
- Timecop.freeze(time) { service.execute }
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(time)
- end
-
- it "doesn't set the time if the deploy's environment is not 'production'" do
- job.update(environment: 'staging')
- service = described_class.new(job)
- service.execute
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_nil
- end
-
- it 'does not raise errors if the merge request does not have a metrics record' do
- merge_request.metrics.destroy
-
- expect(merge_request.reload.metrics).to be_nil
- expect { service.execute }.not_to raise_error
- end
- end
-
- context "for merge requests merged before the previous deploy" do
- context "if the 'first_deployed_to_production_at' time is already set" do
- it "does not overwrite the older 'first_deployed_to_production_at' time" do
- # Previous deploy
- time = Time.now
- Timecop.freeze(time) { service.execute }
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(time)
-
- # Current deploy
- service = described_class.new(job)
- Timecop.freeze(time + 12.hours) { service.execute }
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(time)
- end
- end
-
- context "if the 'first_deployed_to_production_at' time is not already set" do
- it "does not overwrite the older 'first_deployed_to_production_at' time" do
- # Previous deploy
- time = 5.minutes.from_now
- Timecop.freeze(time) { service.execute }
-
- expect(merge_request.reload.metrics.merged_at).to be < merge_request.reload.metrics.first_deployed_to_production_at
-
- merge_request.reload.metrics.update(first_deployed_to_production_at: nil)
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_nil
-
- # Current deploy
- service = described_class.new(job)
- Timecop.freeze(time + 12.hours) { service.execute }
-
- expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_nil
- end
- end
- end
- end
- end
-end
diff --git a/spec/services/files/create_service_spec.rb b/spec/services/files/create_service_spec.rb
index 30d94e4318d..751b7160276 100644
--- a/spec/services/files/create_service_spec.rb
+++ b/spec/services/files/create_service_spec.rb
@@ -3,7 +3,7 @@ require "spec_helper"
describe Files::CreateService do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
- let(:user) { create(:user) }
+ let(:user) { create(:user, :commit_email) }
let(:file_content) { 'Test file content' }
let(:branch_name) { project.default_branch }
let(:start_branch) { branch_name }
@@ -20,6 +20,8 @@ describe Files::CreateService do
}
end
+ let(:commit) { repository.head_commit }
+
subject { described_class.new(project, user, commit_params) }
before do
@@ -75,4 +77,16 @@ describe Files::CreateService do
end
end
end
+
+ context 'commit attribute' do
+ let(:file_path) { 'test-commit-attributes.txt' }
+
+ it 'uses the commit email' do
+ subject.execute
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+ end
end
diff --git a/spec/services/files/delete_service_spec.rb b/spec/services/files/delete_service_spec.rb
index 73566afe8c8..309802ce733 100644
--- a/spec/services/files/delete_service_spec.rb
+++ b/spec/services/files/delete_service_spec.rb
@@ -4,10 +4,11 @@ describe Files::DeleteService do
subject { described_class.new(project, user, commit_params) }
let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
+ let(:user) { create(:user, :commit_email) }
let(:file_path) { 'files/ruby/popen.rb' }
let(:branch_name) { project.default_branch }
let(:last_commit_sha) { nil }
+ let(:commit) { project.repository.head_commit }
let(:commit_params) do
{
@@ -34,6 +35,14 @@ describe Files::DeleteService do
expect(blob).to be_nil
end
+
+ it 'uses the commit email' do
+ subject.execute
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
end
before do
diff --git a/spec/services/files/multi_service_spec.rb b/spec/services/files/multi_service_spec.rb
index 3bdedaf3770..5f3c8e82715 100644
--- a/spec/services/files/multi_service_spec.rb
+++ b/spec/services/files/multi_service_spec.rb
@@ -11,6 +11,7 @@ describe Files::MultiService do
let(:new_file_path) { 'files/ruby/popen.rb' }
let(:file_content) { 'New content' }
let(:action) { 'update' }
+ let(:commit_message) { 'Update File' }
let!(:original_commit_id) do
Gitlab::Git::Commit.last_for_path(project.repository, branch_name, original_file_path).sha
@@ -30,7 +31,7 @@ describe Files::MultiService do
let(:commit_params) do
{
- commit_message: "Update File",
+ commit_message: commit_message,
branch_name: branch_name,
start_branch: branch_name,
actions: actions
@@ -84,6 +85,39 @@ describe Files::MultiService do
end
end
+ describe 'changing execute_filemode of a file' do
+ let(:commit_message) { 'Chmod +x file' }
+ let(:file_path) { original_file_path }
+ let(:default_action) do
+ {
+ action: 'chmod',
+ file_path: file_path,
+ execute_filemode: true
+ }
+ end
+
+ it 'accepts the commit' do
+ results = subject.execute
+
+ expect(results[:status]).to eq(:success)
+ end
+
+ it 'updates the execute_filemode of the file' do
+ expect { subject.execute }.to change { repository.blob_at_branch(branch_name, file_path).mode }.from('100644').to('100755')
+ end
+
+ context "when the file doesn't exists" do
+ let(:file_path) { 'files/wrong_path.rb' }
+
+ it 'rejects the commit' do
+ results = subject.execute
+
+ expect(results[:status]).to eq(:error)
+ expect(results[:message]).to eq("A file with this name doesn't exist")
+ end
+ end
+ end
+
context 'when moving a file' do
let(:action) { 'move' }
let(:new_file_path) { 'files/ruby/new_popen.rb' }
diff --git a/spec/services/files/update_service_spec.rb b/spec/services/files/update_service_spec.rb
index e01fe487ffa..23db35c2418 100644
--- a/spec/services/files/update_service_spec.rb
+++ b/spec/services/files/update_service_spec.rb
@@ -4,11 +4,12 @@ describe Files::UpdateService do
subject { described_class.new(project, user, commit_params) }
let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
+ let(:user) { create(:user, :commit_email) }
let(:file_path) { 'files/ruby/popen.rb' }
let(:new_contents) { 'New Content' }
let(:branch_name) { project.default_branch }
let(:last_commit_sha) { nil }
+ let(:commit) { project.repository.commit }
let(:commit_params) do
{
@@ -54,6 +55,14 @@ describe Files::UpdateService do
expect(results.data).to eq(new_contents)
end
+
+ it 'uses the commit email' do
+ subject.execute
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
end
context "when the last_commit_sha is not supplied" do
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index a3c9a660c2f..45ef26aebbd 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -204,16 +204,37 @@ describe GitPushService, services: true do
end
describe "Push Event" do
- let!(:push_data) { push_data_from_service(project, user, oldrev, newrev, ref) }
- let(:event) { Event.find_by_action(Event::PUSHED) }
+ context "with an existing branch" do
+ let!(:push_data) { push_data_from_service(project, user, oldrev, newrev, ref) }
+ let(:event) { Event.find_by_action(Event::PUSHED) }
- it { expect(event).to be_an_instance_of(PushEvent) }
- it { expect(event.project).to eq(project) }
- it { expect(event.action).to eq(Event::PUSHED) }
- it { expect(event.push_event_payload).to be_an_instance_of(PushEventPayload) }
- it { expect(event.push_event_payload.commit_from).to eq(oldrev) }
- it { expect(event.push_event_payload.commit_to).to eq(newrev) }
- it { expect(event.push_event_payload.ref).to eq('master') }
+ it 'generates a push event with one commit' do
+ expect(event).to be_an_instance_of(PushEvent)
+ expect(event.project).to eq(project)
+ expect(event.action).to eq(Event::PUSHED)
+ expect(event.push_event_payload).to be_an_instance_of(PushEventPayload)
+ expect(event.push_event_payload.commit_from).to eq(oldrev)
+ expect(event.push_event_payload.commit_to).to eq(newrev)
+ expect(event.push_event_payload.ref).to eq('master')
+ expect(event.push_event_payload.commit_count).to eq(1)
+ end
+ end
+
+ context "with a new branch" do
+ let!(:new_branch_data) { push_data_from_service(project, user, Gitlab::Git::BLANK_SHA, newrev, ref) }
+ let(:event) { Event.find_by_action(Event::PUSHED) }
+
+ it 'generates a push event with more than one commit' do
+ expect(event).to be_an_instance_of(PushEvent)
+ expect(event.project).to eq(project)
+ expect(event.action).to eq(Event::PUSHED)
+ expect(event.push_event_payload).to be_an_instance_of(PushEventPayload)
+ expect(event.push_event_payload.commit_from).to be_nil
+ expect(event.push_event_payload.commit_to).to eq(newrev)
+ expect(event.push_event_payload.ref).to eq('master')
+ expect(event.push_event_payload.commit_count).to be > 1
+ end
+ end
context "Updates merge requests" do
it "when pushing a new branch for the first time" do
@@ -223,10 +244,17 @@ describe GitPushService, services: true do
end
end
- context "Sends System Push data" do
- it "when pushing on a branch" do
- expect(SystemHookPushWorker).to receive(:perform_async).with(push_data, :push_hooks)
+ describe 'system hooks' do
+ let!(:push_data) { push_data_from_service(project, user, oldrev, newrev, ref) }
+ let!(:system_hooks_service) { SystemHooksService.new }
+
+ it "sends a system hook after pushing a branch" do
+ allow(SystemHooksService).to receive(:new).and_return(system_hooks_service)
+ allow(system_hooks_service).to receive(:execute_hooks)
+
execute_service(project, user, oldrev, newrev, ref)
+
+ expect(system_hooks_service).to have_received(:execute_hooks).with(push_data, :push_hooks)
end
end
end
diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb
index 92159e1e372..2699f6e7bcd 100644
--- a/spec/services/git_tag_push_service_spec.rb
+++ b/spec/services/git_tag_push_service_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe GitTagPushService do
include RepoHelpers
+ include GitHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
@@ -118,9 +119,7 @@ describe GitTagPushService do
before do
# Create the lightweight tag
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.raw_repository.rugged.tags.create(tag_name, newrev)
- end
+ rugged_repo(project.repository).tags.create(tag_name, newrev)
# Clear tag list cache
project.repository.expire_tags_cache
diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb
index b54491cf5f9..d80d0f5a8a8 100644
--- a/spec/services/groups/destroy_service_spec.rb
+++ b/spec/services/groups/destroy_service_spec.rb
@@ -135,6 +135,17 @@ describe Groups::DestroyService do
it_behaves_like 'group destruction', false
end
+ context 'repository removal status is taken into account' do
+ it 'raises exception' do
+ expect_next_instance_of(::Projects::DestroyService) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(false)
+ end
+
+ expect { destroy_group(group, user, false) }
+ .to raise_error(Groups::DestroyService::DestroyError, "Project #{project.id} can't be deleted" )
+ end
+ end
+
describe 'repository removal' do
before do
destroy_group(group, user, false)
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 999677cfaaa..dd8a1cee074 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -22,7 +22,7 @@ describe Groups::TransferService, :postgresql do
end
end
- context "when there's an exception on Gitlab shell directories" do
+ context "when there's an exception on GitLab shell directories" do
let(:new_parent_group) { create(:group, :public) }
before do
@@ -177,7 +177,7 @@ describe Groups::TransferService, :postgresql do
it 'should add an error on group' do
transfer_service.execute(new_parent_group)
- expect(transfer_service.error).to eq('Transfer failed: Validation failed: Path has already been taken')
+ expect(transfer_service.error).to eq('Transfer failed: Validation failed: Group URL has already been taken')
end
end
@@ -347,7 +347,7 @@ describe Groups::TransferService, :postgresql do
end
end
- context 'when transfering a group with nested groups and projects' do
+ context 'when transferring a group with nested groups and projects' do
let!(:group) { create(:group, :public) }
let!(:project1) { create(:project, :repository, :private, namespace: group) }
let!(:subgroup1) { create(:group, :private, parent: group) }
diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb
index 7c5c7409cc1..84cfa53ea05 100644
--- a/spec/services/groups/update_service_spec.rb
+++ b/spec/services/groups/update_service_spec.rb
@@ -24,6 +24,12 @@ describe Groups::UpdateService do
expect(TodosDestroyer::GroupPrivateWorker).not_to receive(:perform_in)
end
+
+ it "returns false if save failed" do
+ allow(public_group).to receive(:save).and_return(false)
+
+ expect(service.execute).to be_falsey
+ end
end
context "internal group with internal project" do
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index 53c85f73cde..f0b0f7956ce 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Issuable::BulkUpdateService do
let(:user) { create(:user) }
- let(:project) { create(:project, namespace: user.namespace) }
+ let(:project) { create(:project, :repository, namespace: user.namespace) }
def bulk_update(issuables, extra_params = {})
bulk_update_params = extra_params
diff --git a/spec/services/issuable/clone/attributes_rewriter_spec.rb b/spec/services/issuable/clone/attributes_rewriter_spec.rb
new file mode 100644
index 00000000000..20bda6984bd
--- /dev/null
+++ b/spec/services/issuable/clone/attributes_rewriter_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Issuable::Clone::AttributesRewriter do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:project1) { create(:project, :public, group: group) }
+ let(:project2) { create(:project, :public, group: group) }
+ let(:original_issue) { create(:issue, project: project1) }
+ let(:new_issue) { create(:issue, project: project2) }
+
+ subject { described_class.new(user, original_issue, new_issue) }
+
+ context 'setting labels' do
+ it 'sets labels present in the new project and group labels' do
+ project1_label_1 = create(:label, title: 'label1', project: project1)
+ project1_label_2 = create(:label, title: 'label2', project: project1)
+ project2_label_1 = create(:label, title: 'label1', project: project2)
+ group_label = create(:group_label, title: 'group_label', group: group)
+ create(:label, title: 'label3', project: project2)
+
+ original_issue.update(labels: [project1_label_1, project1_label_2, group_label])
+
+ subject.execute
+
+ expect(new_issue.reload.labels).to match_array([project2_label_1, group_label])
+ end
+
+ it 'does not set any labels when not used on the original issue' do
+ subject.execute
+
+ expect(new_issue.reload.labels).to be_empty
+ end
+
+ it 'copies the resource label events' do
+ resource_label_events = create_list(:resource_label_event, 2, issue: original_issue)
+
+ subject.execute
+
+ expected = resource_label_events.map(&:label_id)
+
+ expect(new_issue.resource_label_events.map(&:label_id)).to match_array(expected)
+ end
+ end
+
+ context 'setting milestones' do
+ it 'sets milestone to nil when old issue milestone is not in the new project' do
+ milestone = create(:milestone, title: 'milestone', project: project1)
+
+ original_issue.update(milestone: milestone)
+
+ subject.execute
+
+ expect(new_issue.reload.milestone).to be_nil
+ end
+
+ it 'copies the milestone when old issue milestone title is in the new project' do
+ milestone_project1 = create(:milestone, title: 'milestone', project: project1)
+ milestone_project2 = create(:milestone, title: 'milestone', project: project2)
+
+ original_issue.update(milestone: milestone_project1)
+
+ subject.execute
+
+ expect(new_issue.reload.milestone).to eq(milestone_project2)
+ end
+
+ it 'copies the milestone when old issue milestone is a group milestone' do
+ milestone = create(:milestone, title: 'milestone', group: group)
+
+ original_issue.update(milestone: milestone)
+
+ subject.execute
+
+ expect(new_issue.reload.milestone).to eq(milestone)
+ end
+ end
+end
diff --git a/spec/services/issuable/clone/content_rewriter_spec.rb b/spec/services/issuable/clone/content_rewriter_spec.rb
new file mode 100644
index 00000000000..4d3cb0bd254
--- /dev/null
+++ b/spec/services/issuable/clone/content_rewriter_spec.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Issuable::Clone::ContentRewriter do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:project1) { create(:project, :public, group: group) }
+ let(:project2) { create(:project, :public, group: group) }
+
+ let(:other_issue) { create(:issue, project: project1) }
+ let(:merge_request) { create(:merge_request) }
+
+ subject { described_class.new(user, original_issue, new_issue)}
+
+ let(:description) { 'Simple text' }
+ let(:original_issue) { create(:issue, description: description, project: project1) }
+ let(:new_issue) { create(:issue, project: project2) }
+
+ context 'rewriting award emojis' do
+ it 'copies the award emojis' do
+ create(:award_emoji, awardable: original_issue, name: 'thumbsup')
+ create(:award_emoji, awardable: original_issue, name: 'thumbsdown')
+
+ expect { subject.execute }.to change { AwardEmoji.count }.by(2)
+
+ expect(new_issue.award_emoji.map(&:name)).to match_array(%w(thumbsup thumbsdown))
+ end
+ end
+
+ context 'rewriting description' do
+ before do
+ subject.execute
+ end
+
+ context 'when description is a simple text' do
+ it 'does not rewrite the description' do
+ expect(new_issue.reload.description).to eq(original_issue.description)
+ end
+ end
+
+ context 'when description contains a local reference' do
+ let(:description) { "See ##{other_issue.iid}" }
+
+ it 'rewrites the local reference correctly' do
+ expected_description = "See #{project1.path}##{other_issue.iid}"
+
+ expect(new_issue.reload.description).to eq(expected_description)
+ end
+ end
+
+ context 'when description contains a cross reference' do
+ let(:description) { "See #{merge_request.project.full_path}!#{merge_request.iid}" }
+
+ it 'rewrites the cross reference correctly' do
+ expected_description = "See #{merge_request.project.full_path}!#{merge_request.iid}"
+
+ expect(new_issue.reload.description).to eq(expected_description)
+ end
+ end
+
+ context 'when description contains a user reference' do
+ let(:description) { "FYU #{user.to_reference}" }
+
+ it 'works with a user reference' do
+ expect(new_issue.reload.description).to eq("FYU #{user.to_reference}")
+ end
+ end
+
+ context 'when description contains uploads' do
+ let(:uploader) { build(:file_uploader, project: project1) }
+ let(:description) { "Text and #{uploader.markdown_link}" }
+
+ it 'rewrites uploads in the description' do
+ upload = Upload.last
+
+ expect(new_issue.description).not_to eq(description)
+ expect(new_issue.description).to match(/Text and #{FileUploader::MARKDOWN_PATTERN}/)
+ expect(upload.secret).not_to eq(uploader.secret)
+ expect(new_issue.description).to include(upload.secret)
+ expect(new_issue.description).to include(upload.path)
+ end
+ end
+ end
+
+ context 'rewriting notes' do
+ context 'simple notes' do
+ let!(:notes) do
+ [
+ create(:note, noteable: original_issue, project: project1,
+ created_at: 2.weeks.ago, updated_at: 1.week.ago),
+ create(:note, noteable: original_issue, project: project1),
+ create(:note, system: true, noteable: original_issue, project: project1)
+ ]
+ end
+ let!(:system_note_metadata) { create(:system_note_metadata, note: notes.last) }
+ let!(:award_emoji) { create(:award_emoji, awardable: notes.first, name: 'thumbsup')}
+
+ before do
+ subject.execute
+ end
+
+ it 'rewrites existing notes in valid order' do
+ expect(new_issue.notes.order('id ASC').pluck(:note).first(3)).to eq(notes.map(&:note))
+ end
+
+ it 'copies all the issue notes' do
+ expect(new_issue.notes.count).to eq(3)
+ end
+
+ it 'does not change the note attributes' do
+ subject.execute
+
+ new_note = new_issue.notes.first
+
+ expect(new_note.note).to eq(notes.first.note)
+ expect(new_note.author).to eq(notes.first.author)
+ end
+
+ it 'copies the award emojis' do
+ subject.execute
+
+ new_note = new_issue.notes.first
+ new_note.award_emoji.first.name = 'thumbsup'
+ end
+
+ it 'copies system_note_metadata for system note' do
+ new_note = new_issue.notes.last
+
+ expect(new_note.system_note_metadata.action).to eq(system_note_metadata.action)
+ expect(new_note.system_note_metadata.id).not_to eq(system_note_metadata.id)
+ end
+ end
+
+ context 'notes with reference' do
+ let(:text) do
+ "See ##{other_issue.iid} and #{merge_request.project.full_path}!#{merge_request.iid}"
+ end
+ let!(:note) { create(:note, noteable: original_issue, note: text, project: project1) }
+
+ it 'rewrites the references correctly' do
+ subject.execute
+
+ new_note = new_issue.notes.first
+
+ expected_text = "See #{other_issue.project.path}##{other_issue.iid} and #{merge_request.project.full_path}!#{merge_request.iid}"
+
+ expect(new_note.note).to eq(expected_text)
+ expect(new_note.author).to eq(note.author)
+ end
+ end
+ end
+end
diff --git a/spec/services/issuable/common_system_notes_service_spec.rb b/spec/services/issuable/common_system_notes_service_spec.rb
index dcf4503ef9c..fa1a421d528 100644
--- a/spec/services/issuable/common_system_notes_service_spec.rb
+++ b/spec/services/issuable/common_system_notes_service_spec.rb
@@ -12,12 +12,21 @@ describe Issuable::CommonSystemNotesService do
it_behaves_like 'system note creation', { time_estimate: 5 }, 'changed time estimate'
context 'when new label is added' do
+ let(:label) { create(:label, project: project) }
+
before do
- label = create(:label, project: project)
issuable.labels << label
+ issuable.save
end
- it_behaves_like 'system note creation', {}, /added ~\w+ label/
+ it 'creates a resource label event' do
+ described_class.new(project, user).execute(issuable, [])
+ event = issuable.reload.resource_label_events.last
+
+ expect(event).not_to be_nil
+ expect(event.label_id).to eq label.id
+ expect(event.user_id).to eq user.id
+ end
end
context 'when new milestone is assigned' do
diff --git a/spec/services/issues/fetch_referenced_merge_requests_service_spec.rb b/spec/services/issues/fetch_referenced_merge_requests_service_spec.rb
deleted file mode 100644
index 4e58179f45f..00000000000
--- a/spec/services/issues/fetch_referenced_merge_requests_service_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-require 'spec_helper.rb'
-
-describe Issues::FetchReferencedMergeRequestsService do
- let(:project) { create(:project) }
- let(:issue) { create(:issue, project: project) }
- let(:other_project) { create(:project) }
-
- let(:mr) { create(:merge_request, source_project: project, target_project: project, id: 2)}
- let(:other_mr) { create(:merge_request, source_project: other_project, target_project: other_project, id: 1)}
-
- let(:user) { create(:user) }
- let(:service) { described_class.new(project, user) }
-
- context 'with mentioned merge requests' do
- it 'returns a list of sorted merge requests' do
- allow(issue).to receive(:referenced_merge_requests).with(user).and_return([other_mr, mr])
-
- mrs, closed_by_mrs = service.execute(issue)
-
- expect(mrs).to match_array([mr, other_mr])
- expect(closed_by_mrs).to match_array([])
- end
- end
-
- context 'with closed-by merge requests' do
- it 'returns a list of sorted merge requests' do
- allow(issue).to receive(:closed_by_merge_requests).with(user).and_return([other_mr, mr])
-
- mrs, closed_by_mrs = service.execute(issue)
-
- expect(mrs).to match_array([])
- expect(closed_by_mrs).to match_array([mr, other_mr])
- end
- end
-end
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 609eef76d2c..1e088bc7d9b 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -10,11 +10,9 @@ describe Issues::MoveService do
let(:sub_group_2) { create(:group, :private, parent: group) }
let(:old_project) { create(:project, namespace: sub_group_1) }
let(:new_project) { create(:project, namespace: sub_group_2) }
- let(:milestone1) { create(:milestone, project_id: old_project.id, title: 'v9.0') }
let(:old_issue) do
- create(:issue, title: title, description: description,
- project: old_project, author: author, milestone: milestone1)
+ create(:issue, title: title, description: description, project: old_project, author: author)
end
subject(:move_service) do
@@ -25,16 +23,6 @@ describe Issues::MoveService do
before do
old_project.add_reporter(user)
new_project.add_reporter(user)
-
- labels = Array.new(2) { |x| "label%d" % (x + 1) }
-
- labels.each do |label|
- old_issue.labels << create(:label,
- project_id: old_project.id,
- title: label)
-
- new_project.labels << create(:label, title: label)
- end
end
end
@@ -48,80 +36,6 @@ describe Issues::MoveService do
context 'issue movable' do
include_context 'user can move issue'
- context 'move to new milestone' do
- let(:new_issue) { move_service.execute(old_issue, new_project) }
-
- context 'project milestone' do
- let!(:milestone2) do
- create(:milestone, project_id: new_project.id, title: 'v9.0')
- end
-
- it 'assigns milestone to new issue' do
- expect(new_issue.reload.milestone.title).to eq 'v9.0'
- expect(new_issue.reload.milestone).to eq(milestone2)
- end
- end
-
- context 'group milestones' do
- let!(:group) { create(:group, :private) }
- let!(:group_milestone_1) do
- create(:milestone, group_id: group.id, title: 'v9.0_group')
- end
-
- before do
- old_issue.update(milestone: group_milestone_1)
- old_project.update(namespace: group)
- new_project.update(namespace: group)
-
- group.add_users([user], GroupMember::DEVELOPER)
- end
-
- context 'when moving to a project of the same group' do
- it 'keeps the same group milestone' do
- expect(new_issue.reload.project).to eq(new_project)
- expect(new_issue.reload.milestone).to eq(group_milestone_1)
- end
- end
-
- context 'when moving to a project of a different group' do
- let!(:group_2) { create(:group, :private) }
-
- let!(:group_milestone_2) do
- create(:milestone, group_id: group_2.id, title: 'v9.0_group')
- end
-
- before do
- old_issue.update(milestone: group_milestone_1)
- new_project.update(namespace: group_2)
-
- group_2.add_users([user], GroupMember::DEVELOPER)
- end
-
- it 'assigns to new group milestone of same title' do
- expect(new_issue.reload.project).to eq(new_project)
- expect(new_issue.reload.milestone).to eq(group_milestone_2)
- end
- end
- end
- end
-
- context 'issue with group labels', :nested_groups do
- it 'assigns group labels to new issue' do
- label = create(:group_label, group: group)
- label_issue = create(:labeled_issue, description: description, project: old_project,
- milestone: milestone1, labels: [label])
- old_project.add_reporter(user)
- new_project.add_reporter(user)
-
- new_issue = move_service.execute(label_issue, new_project)
-
- expect(new_issue).to have_attributes(
- project: new_project,
- labels: include(label)
- )
- end
- end
-
context 'generic issue' do
include_context 'issue move executed'
@@ -129,18 +43,6 @@ describe Issues::MoveService do
expect(new_issue.project).to eq new_project
end
- it 'assign labels to new issue' do
- expected_label_titles = new_issue.reload.labels.map(&:title)
- expect(expected_label_titles).to include 'label1'
- expect(expected_label_titles).to include 'label2'
- expect(expected_label_titles.size).to eq 2
-
- new_issue.labels.each do |label|
- expect(new_project.labels).to include(label)
- expect(old_project.labels).not_to include(label)
- end
- end
-
it 'rewrites issue title' do
expect(new_issue.title).to eq title
end
@@ -192,140 +94,25 @@ describe Issues::MoveService do
end
end
- context 'issue with notes' do
- context 'notes without references' do
- let(:notes_params) do
- [{ system: false, note: 'Some comment 1' },
- { system: true, note: 'Some system note' },
- { system: false, note: 'Some comment 2' }]
- end
- let(:award_names) { %w(thumbsup thumbsdown facepalm) }
- let(:notes_contents) { notes_params.map { |n| n[:note] } }
-
- before do
- note_params = { noteable: old_issue, project: old_project, author: author }
- notes_params.each_with_index do |note, index|
- new_note = create(:note, note_params.merge(note))
- award_emoji_params = { awardable: new_note, name: award_names[index] }
- create(:award_emoji, award_emoji_params)
- end
- end
-
- include_context 'issue move executed'
-
- let(:all_notes) { new_issue.notes.order('id ASC') }
- let(:system_notes) { all_notes.system }
- let(:user_notes) { all_notes.user }
-
- it 'rewrites existing notes in valid order' do
- expect(all_notes.pluck(:note).first(3)).to eq notes_contents
- end
-
- it 'creates new emojis for the new notes' do
- expect(all_notes.map(&:award_emoji).to_a.flatten.map(&:name)).to eq award_names
- end
-
- it 'adds a system note about move after rewritten notes' do
- expect(system_notes.last.note).to match /^moved from/
- end
-
- it 'preserves orignal author of comment' do
- expect(user_notes.pluck(:author_id)).to all(eq(author.id))
- end
- end
-
- context 'note that has been updated' do
- let!(:note) do
- create(:note, noteable: old_issue, project: old_project,
- author: author, updated_at: Date.yesterday,
- created_at: Date.yesterday)
- end
-
- include_context 'issue move executed'
-
- it 'preserves time when note has been created at' do
- expect(new_issue.notes.first.created_at).to eq note.created_at
- end
-
- it 'preserves time when note has been updated at' do
- expect(new_issue.notes.first.updated_at).to eq note.updated_at
- end
- end
+ context 'issue with assignee' do
+ let(:assignee) { create(:user) }
- context 'issue with assignee' do
- let(:assignee) { create(:user) }
-
- before do
- old_issue.assignees = [assignee]
- end
-
- it 'preserves assignee with access to the new issue' do
- new_project.add_reporter(assignee)
-
- new_issue = move_service.execute(old_issue, new_project)
-
- expect(new_issue.assignees).to eq([assignee])
- end
-
- it 'ignores assignee without access to the new issue' do
- new_issue = move_service.execute(old_issue, new_project)
-
- expect(new_issue.assignees).to be_empty
- end
- end
-
- context 'notes with references' do
- before do
- create(:merge_request, source_project: old_project)
- create(:note, noteable: old_issue, project: old_project, author: author,
- note: 'Note with reference to merge request !1')
- end
-
- include_context 'issue move executed'
- let(:new_note) { new_issue.notes.first }
-
- it 'rewrites references using a cross reference to old project' do
- expect(new_note.note)
- .to eq "Note with reference to merge request #{old_project.to_reference(new_project)}!1"
- end
- end
-
- context 'issue description with uploads' do
- let(:uploader) { build(:file_uploader, project: old_project) }
- let(:description) { "Text and #{uploader.markdown_link}" }
-
- include_context 'issue move executed'
-
- it 'rewrites uploads in description' do
- expect(new_issue.description).not_to eq description
- expect(new_issue.description)
- .to match(/Text and #{FileUploader::MARKDOWN_PATTERN}/)
- expect(new_issue.description).not_to include uploader.secret
- end
+ before do
+ old_issue.assignees = [assignee]
end
- end
- describe 'rewriting references' do
- include_context 'issue move executed'
+ it 'preserves assignee with access to the new issue' do
+ new_project.add_reporter(assignee)
- context 'issue references' do
- let(:another_issue) { create(:issue, project: old_project) }
- let(:description) { "Some description #{another_issue.to_reference}" }
+ new_issue = move_service.execute(old_issue, new_project)
- it 'rewrites referenced issues creating cross project reference' do
- expect(new_issue.description)
- .to eq "Some description #{another_issue.to_reference(new_project)}"
- end
+ expect(new_issue.assignees).to eq([assignee])
end
- context "user references" do
- let(:another_issue) { create(:issue, project: old_project) }
- let(:description) { "Some description #{user.to_reference}" }
+ it 'ignores assignee without access to the new issue' do
+ new_issue = move_service.execute(old_issue, new_project)
- it "doesn't throw any errors for issues containing user references" do
- expect(new_issue.description)
- .to eq "Some description #{user.to_reference}"
- end
+ expect(new_issue.assignees).to be_empty
end
end
@@ -405,25 +192,5 @@ describe Issues::MoveService do
it { expect { move }.to raise_error(StandardError, /permissions/) }
end
end
-
- context 'movable issue with no assigned labels' do
- before do
- old_project.add_reporter(user)
- new_project.add_reporter(user)
-
- labels = Array.new(2) { |x| "label%d" % (x + 1) }
-
- labels.each do |label|
- new_project.labels << create(:label, title: label)
- end
- end
-
- include_context 'issue move executed'
-
- it 'does not assign labels to new issue' do
- expected_label_titles = new_issue.reload.labels.map(&:title)
- expect(expected_label_titles.size).to eq 0
- end
- end
end
end
diff --git a/spec/services/issues/referenced_merge_requests_service_spec.rb b/spec/services/issues/referenced_merge_requests_service_spec.rb
new file mode 100644
index 00000000000..61d1612829f
--- /dev/null
+++ b/spec/services/issues/referenced_merge_requests_service_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'spec_helper.rb'
+
+describe Issues::ReferencedMergeRequestsService do
+ def create_referencing_mr(attributes = {})
+ create(:merge_request, attributes).tap do |merge_request|
+ create(:note, :system, project: project, noteable: issue, author: user, note: merge_request.to_reference(full: true))
+ end
+ end
+
+ def create_closing_mr(attributes = {})
+ create_referencing_mr(attributes).tap do |merge_request|
+ create(:merge_requests_closing_issues, issue: issue, merge_request: merge_request)
+ end
+ end
+
+ set(:user) { create(:user) }
+ set(:project) { create(:project, :public, :repository) }
+ set(:other_project) { create(:project, :public, :repository) }
+ set(:issue) { create(:issue, author: user, project: project) }
+
+ set(:closing_mr) { create_closing_mr(source_project: project) }
+ set(:closing_mr_other_project) { create_closing_mr(source_project: other_project) }
+
+ set(:referencing_mr) { create_referencing_mr(source_project: project, source_branch: 'csv') }
+ set(:referencing_mr_other_project) { create_referencing_mr(source_project: other_project, source_branch: 'csv') }
+
+ let(:service) { described_class.new(project, user) }
+
+ describe '#execute' do
+ it 'returns a list of sorted merge requests' do
+ mrs, closed_by_mrs = service.execute(issue)
+
+ expect(mrs).to eq([closing_mr, referencing_mr, closing_mr_other_project, referencing_mr_other_project])
+ expect(closed_by_mrs).to eq([closing_mr, closing_mr_other_project])
+ end
+
+ context 'performance' do
+ it 'does not run extra queries when extra namespaces are included', :use_clean_rails_memory_store_caching do
+ service.execute(issue) # warm cache
+ control_count = ActiveRecord::QueryRecorder.new { service.execute(issue) }.count
+
+ third_project = create(:project, :public)
+ create_closing_mr(source_project: third_project)
+ service.execute(issue) # warm cache
+
+ expect { service.execute(issue) }.not_to exceed_query_limit(control_count)
+ end
+
+ it 'preloads the head pipeline for each merge request, and its routes' do
+ # Hack to ensure no data is preserved on issue before starting the spec,
+ # to avoid false negatives
+ reloaded_issue = Issue.find(issue.id)
+
+ pipeline_routes = lambda do |merge_requests|
+ merge_requests.map { |mr| mr.head_pipeline&.project&.full_path }
+ end
+
+ closing_mr_other_project.update!(head_pipeline: create(:ci_pipeline))
+ control_count = ActiveRecord::QueryRecorder.new { service.execute(reloaded_issue).each(&pipeline_routes) }
+
+ closing_mr.update!(head_pipeline: create(:ci_pipeline))
+
+ expect { service.execute(issue).each(&pipeline_routes) }
+ .not_to exceed_query_limit(control_count)
+ end
+
+ it 'only loads issue notes once' do
+ expect(issue).to receive(:notes).once.and_call_original
+
+ service.execute(issue)
+ end
+ end
+ end
+
+ describe '#referenced_merge_requests' do
+ it 'returns the referenced merge requests' do
+ expect(service.referenced_merge_requests(issue)).to match_array([
+ closing_mr,
+ closing_mr_other_project,
+ referencing_mr,
+ referencing_mr_other_project
+ ])
+ end
+
+ it 'excludes cross project references if the user cannot read cross project' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ expect(Ability).to receive(:allowed?).with(user, :read_cross_project).at_least(:once).and_return(false)
+
+ expect(service.referenced_merge_requests(issue)).not_to include(closing_mr_other_project)
+ expect(service.referenced_merge_requests(issue)).not_to include(referencing_mr_other_project)
+ end
+
+ context 'performance' do
+ it 'does not run a query for each note author', :use_clean_rails_memory_store_caching do
+ service.referenced_merge_requests(issue) # warm cache
+ control_count = ActiveRecord::QueryRecorder.new { service.referenced_merge_requests(issue) }.count
+
+ create(:note, project: project, noteable: issue, author: create(:user))
+ service.referenced_merge_requests(issue) # warm cache
+
+ expect { service.referenced_merge_requests(issue) }.not_to exceed_query_limit(control_count)
+ end
+ end
+ end
+
+ describe '#closed_by_merge_requests' do
+ let(:closed_issue) { build(:issue, :closed, project: project)}
+
+ it 'returns the open merge requests that close this issue' do
+ create_closing_mr(source_project: project, state: 'closed')
+
+ expect(service.closed_by_merge_requests(issue)).to match_array([closing_mr, closing_mr_other_project])
+ end
+
+ it 'returns an empty array when the current issue is closed already' do
+ expect(service.closed_by_merge_requests(closed_issue)).to eq([])
+ end
+
+ context 'performance' do
+ it 'does not run a query for each note author', :use_clean_rails_memory_store_caching do
+ service.closed_by_merge_requests(issue) # warm cache
+ control_count = ActiveRecord::QueryRecorder.new { service.closed_by_merge_requests(issue) }.count
+
+ create(:note, :system, project: project, noteable: issue, author: create(:user))
+ service.closed_by_merge_requests(issue) # warm cache
+
+ expect { service.closed_by_merge_requests(issue) }.not_to exceed_query_limit(control_count)
+ end
+ end
+ end
+end
diff --git a/spec/services/issues/related_branches_service_spec.rb b/spec/services/issues/related_branches_service_spec.rb
new file mode 100644
index 00000000000..c2e1eba6a63
--- /dev/null
+++ b/spec/services/issues/related_branches_service_spec.rb
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe Issues::RelatedBranchesService do
+ let(:user) { create(:admin) }
+ let(:issue) { create(:issue) }
+
+ subject { described_class.new(issue.project, user) }
+
+ describe '#execute' do
+ before do
+ allow(issue.project.repository).to receive(:branch_names).and_return(["mpempe", "#{issue.iid}mepmep", issue.to_branch_name, "#{issue.iid}-branch"])
+ end
+
+ it "selects the right branches when there are no referenced merge requests" do
+ expect(subject.execute(issue)).to eq([issue.to_branch_name, "#{issue.iid}-branch"])
+ end
+
+ it "selects the right branches when there is a referenced merge request" do
+ merge_request = create(:merge_request, { description: "Closes ##{issue.iid}",
+ source_project: issue.project,
+ source_branch: "#{issue.iid}-branch" })
+ merge_request.create_cross_references!(user)
+
+ referenced_merge_requests = Issues::ReferencedMergeRequestsService
+ .new(issue.project, user)
+ .referenced_merge_requests(issue)
+
+ expect(referenced_merge_requests).not_to be_empty
+ expect(subject.execute(issue)).to eq([issue.to_branch_name])
+ end
+
+ it 'excludes stable branches from the related branches' do
+ allow(issue.project.repository).to receive(:branch_names)
+ .and_return(["#{issue.iid}-0-stable"])
+
+ expect(subject.execute(issue)).to eq []
+ end
+ end
+end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 5bcfef46b75..bd519e7f077 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -189,11 +189,12 @@ describe Issues::UpdateService, :mailer do
expect(note.note).to include "assigned to #{user2.to_reference}"
end
- it 'creates system note about issue label edit' do
- note = find_note('added ~')
+ it 'creates a resource label event' do
+ event = issue.resource_label_events.last
- expect(note).not_to be_nil
- expect(note.note).to include "added #{label.to_reference} label"
+ expect(event).not_to be_nil
+ expect(event.label_id).to eq label.id
+ expect(event.user_id).to eq user.id
end
it 'creates system note about title change' do
@@ -342,7 +343,42 @@ describe Issues::UpdateService, :mailer do
end
end
- context 'when the milestone change' do
+ context 'when the milestone is removed' do
+ let!(:non_subscriber) { create(:user) }
+
+ let!(:subscriber) do
+ create(:user) do |u|
+ issue.toggle_subscription(u, project)
+ project.add_developer(u)
+ end
+ end
+
+ it_behaves_like 'system notes for milestones'
+
+ it 'sends notifications for subscribers of changed milestone' do
+ issue.milestone = create(:milestone)
+
+ issue.save
+
+ perform_enqueued_jobs do
+ update_issue(milestone_id: "")
+ end
+
+ should_email(subscriber)
+ should_not_email(non_subscriber)
+ end
+ end
+
+ context 'when the milestone is changed' do
+ let!(:non_subscriber) { create(:user) }
+
+ let!(:subscriber) do
+ create(:user) do |u|
+ issue.toggle_subscription(u, project)
+ project.add_developer(u)
+ end
+ end
+
it 'marks todos as done' do
update_issue(milestone: create(:milestone))
@@ -350,6 +386,15 @@ describe Issues::UpdateService, :mailer do
end
it_behaves_like 'system notes for milestones'
+
+ it 'sends notifications for subscribers of changed milestone' do
+ perform_enqueued_jobs do
+ update_issue(milestone: create(:milestone))
+ end
+
+ should_email(subscriber)
+ should_not_email(non_subscriber)
+ end
end
context 'when the labels change' do
@@ -373,7 +418,7 @@ describe Issues::UpdateService, :mailer do
let!(:non_subscriber) { create(:user) }
let!(:subscriber) do
- create(:user).tap do |u|
+ create(:user) do |u|
label.toggle_subscription(u, project)
project.add_developer(u)
end
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index 6aed481939e..c9a668994eb 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -13,6 +13,8 @@ describe MergeRequests::BuildService do
let(:description) { nil }
let(:source_branch) { 'feature-branch' }
let(:target_branch) { 'master' }
+ let(:milestone_id) { nil }
+ let(:label_ids) { [] }
let(:merge_request) { service.execute }
let(:compare) { double(:compare, commits: commits) }
let(:commit_1) { double(:commit_1, sha: 'f00ba7', safe_message: "Initial commit\n\nCreate the app") }
@@ -25,7 +27,9 @@ describe MergeRequests::BuildService do
source_branch: source_branch,
target_branch: target_branch,
source_project: source_project,
- target_project: target_project)
+ target_project: target_project,
+ milestone_id: milestone_id,
+ label_ids: label_ids)
end
before do
@@ -169,12 +173,43 @@ describe MergeRequests::BuildService do
end
end
+ it 'uses the title of the commit as the title of the merge request' do
+ expect(merge_request.title).to eq('Initial commit')
+ end
+
it 'appends the closing description' do
expected_description = [commit_description, closing_message].compact.join("\n\n")
expect(merge_request.description).to eq(expected_description)
end
end
+
+ context 'when the source branch matches an internal issue' do
+ let(:label) { create(:label, project: project) }
+ let(:milestone) { create(:milestone, project: project) }
+ let(:source_branch) { '123-fix-issue' }
+
+ before do
+ issue.update!(iid: 123, labels: [label], milestone: milestone)
+ end
+
+ it 'assigns the issue label and milestone' do
+ expect(merge_request.milestone).to eq(milestone)
+ expect(merge_request.labels).to match_array([label])
+ end
+
+ context 'when milestone_id and label_ids are shared in the params' do
+ let(:label2) { create(:label, project: project) }
+ let(:milestone2) { create(:milestone, project: project) }
+ let(:label_ids) { [label2.id] }
+ let(:milestone_id) { milestone2.id }
+
+ it 'assigns milestone_id and label_ids instead of issue labels and milestone' do
+ expect(merge_request.milestone).to eq(milestone2)
+ expect(merge_request.labels).to match_array([label2])
+ end
+ end
+ end
end
end
@@ -357,5 +392,13 @@ describe MergeRequests::BuildService do
expect(merge_request.source_project).to eq(project)
end
end
+
+ context 'when specifying target branch in the description' do
+ let(:description) { "A merge request targeting another branch\n\n/target_branch with-codeowners" }
+
+ it 'sets the attribute from the quick actions' do
+ expect(merge_request.target_branch).to eq('with-codeowners')
+ end
+ end
end
end
diff --git a/spec/services/merge_requests/create_from_issue_service_spec.rb b/spec/services/merge_requests/create_from_issue_service_spec.rb
index b1882df732d..393299cce00 100644
--- a/spec/services/merge_requests/create_from_issue_service_spec.rb
+++ b/spec/services/merge_requests/create_from_issue_service_spec.rb
@@ -61,7 +61,15 @@ describe MergeRequests::CreateFromIssueService do
expect(project.repository.branch_exists?(custom_source_branch)).to be_truthy
end
- it 'creates a system note' do
+ it 'creates the new_merge_request system note' do
+ expect(SystemNoteService).to receive(:new_merge_request).with(issue, project, user, instance_of(MergeRequest))
+
+ service.execute
+ end
+
+ it 'creates the new_issue_branch system note when the branch could be created but the merge_request cannot be created' do
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::DISABLED)
+
expect(SystemNoteService).to receive(:new_issue_branch).with(issue, project, user, issue.to_branch_name)
service.execute
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index 06fb61baf33..74bcc15f912 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -134,9 +134,11 @@ describe MergeRequests::CreateService do
let!(:pipeline_3) { create(:ci_pipeline, project: project, ref: "other_branch", project_id: project.id) }
before do
+ # rubocop: disable DestroyAll
project.merge_requests
.where(source_branch: opts[:source_branch], target_branch: opts[:target_branch])
.destroy_all
+ # rubocop: enable DestroyAll
end
it 'sets head pipeline' do
diff --git a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb
index 1c632847940..6268c149fc6 100644
--- a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb
+++ b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb
@@ -46,10 +46,12 @@ describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_
end
it 'schedules no removal if there is no non-latest diffs' do
+ # rubocop: disable DestroyAll
merge_request
.merge_request_diffs
.where.not(id: merge_request.latest_merge_request_diff_id)
.destroy_all
+ # rubocop: enable DestroyAll
expect(DeleteDiffFilesWorker).not_to receive(:bulk_perform_in)
diff --git a/spec/services/merge_requests/rebase_service_spec.rb b/spec/services/merge_requests/rebase_service_spec.rb
index 2703da7ae44..427a2d63a88 100644
--- a/spec/services/merge_requests/rebase_service_spec.rb
+++ b/spec/services/merge_requests/rebase_service_spec.rb
@@ -87,7 +87,7 @@ describe MergeRequests::RebaseService do
expect(merge_request.reload.rebase_commit_sha).to eq(head_sha)
end
- it 'logs correct author and commiter' do
+ it 'logs correct author and committer' do
head_commit = merge_request.source_project.repository.commit(merge_request.source_branch)
expect(head_commit.author_email).to eq('dmitriy.zaporozhets@gmail.com')
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 2536c6e2514..61c6ba7d550 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -306,6 +306,66 @@ describe MergeRequests::RefreshService do
end
end
+ context 'forked projects with the same source branch name as target branch' do
+ let!(:first_commit) do
+ @fork_project.repository.create_file(@user, 'test1.txt', 'Test data',
+ message: 'Test commit',
+ branch_name: 'master')
+ end
+ let!(:second_commit) do
+ @fork_project.repository.create_file(@user, 'test2.txt', 'More test data',
+ message: 'Second test commit',
+ branch_name: 'master')
+ end
+ let!(:forked_master_mr) do
+ create(:merge_request,
+ source_project: @fork_project,
+ source_branch: 'master',
+ target_branch: 'master',
+ target_project: @project)
+ end
+ let(:force_push_commit) { @project.commit('feature').id }
+
+ it 'should reload a new diff for a push to the forked project' do
+ expect do
+ service.new(@fork_project, @user).execute(@oldrev, first_commit, 'refs/heads/master')
+ reload_mrs
+ end.to change { forked_master_mr.merge_request_diffs.count }.by(1)
+ end
+
+ it 'should reload a new diff for a force push to the source branch' do
+ expect do
+ service.new(@fork_project, @user).execute(@oldrev, force_push_commit, 'refs/heads/master')
+ reload_mrs
+ end.to change { forked_master_mr.merge_request_diffs.count }.by(1)
+ end
+
+ it 'should reload a new diff for a force push to the target branch' do
+ expect do
+ service.new(@project, @user).execute(@oldrev, force_push_commit, 'refs/heads/master')
+ reload_mrs
+ end.to change { forked_master_mr.merge_request_diffs.count }.by(1)
+ end
+
+ it 'should reload a new diff for a push to the target project that contains a commit in the MR' do
+ expect do
+ service.new(@project, @user).execute(@oldrev, first_commit, 'refs/heads/master')
+ reload_mrs
+ end.to change { forked_master_mr.merge_request_diffs.count }.by(1)
+ end
+
+ it 'should not increase the diff count for a new push to target branch' do
+ new_commit = @project.repository.create_file(@user, 'new-file.txt', 'A new file',
+ message: 'This is a test',
+ branch_name: 'master')
+
+ expect do
+ service.new(@project, @user).execute(@newrev, new_commit, 'refs/heads/master')
+ reload_mrs
+ end.not_to change { forked_master_mr.merge_request_diffs.count }
+ end
+ end
+
context 'push to origin repo target branch after fork project was removed' do
before do
@fork_project.destroy
diff --git a/spec/services/merge_requests/reload_diffs_service_spec.rb b/spec/services/merge_requests/reload_diffs_service_spec.rb
index a0a27d247fc..5acd01828cb 100644
--- a/spec/services/merge_requests/reload_diffs_service_spec.rb
+++ b/spec/services/merge_requests/reload_diffs_service_spec.rb
@@ -31,34 +31,25 @@ describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_cachin
end
context 'cache clearing' do
- before do
- allow_any_instance_of(Gitlab::Diff::File).to receive(:text?).and_return(true)
- allow_any_instance_of(Gitlab::Diff::File).to receive(:diffable?).and_return(true)
- end
-
- it 'retrieves the diff files to cache the highlighted result' do
- new_diff = merge_request.create_merge_request_diff
- cache_key = new_diff.diffs_collection.cache_key
-
- expect(merge_request).to receive(:create_merge_request_diff).and_return(new_diff)
- expect(Rails.cache).to receive(:read).with(cache_key).and_call_original
- expect(Rails.cache).to receive(:write).with(cache_key, anything, anything).and_call_original
-
- subject.execute
- end
-
it 'clears the cache for older diffs on the merge request' do
old_diff = merge_request.merge_request_diff
old_cache_key = old_diff.diffs_collection.cache_key
- new_diff = merge_request.create_merge_request_diff
- new_cache_key = new_diff.diffs_collection.cache_key
- expect(merge_request).to receive(:create_merge_request_diff).and_return(new_diff)
expect(Rails.cache).to receive(:delete).with(old_cache_key).and_call_original
- expect(Rails.cache).to receive(:read).with(new_cache_key).and_call_original
- expect(Rails.cache).to receive(:write).with(new_cache_key, anything, anything).and_call_original
+
subject.execute
end
+
+ it 'avoids N+1 queries', :request_store do
+ current_user
+ merge_request
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ subject.execute
+ end.count
+
+ expect { subject.execute }.not_to exceed_query_limit(control_count)
+ end
end
end
end
diff --git a/spec/services/merge_requests/squash_service_spec.rb b/spec/services/merge_requests/squash_service_spec.rb
index 8ab09412f55..53bce15735c 100644
--- a/spec/services/merge_requests/squash_service_spec.rb
+++ b/spec/services/merge_requests/squash_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe MergeRequests::SquashService do
+ include GitHelpers
+
let(:service) { described_class.new(project, user, {}) }
let(:user) { project.owner }
let(:project) { create(:project, :repository) }
@@ -63,9 +65,7 @@ describe MergeRequests::SquashService do
end
it 'has the same diff as the merge request, but a different SHA' do
- rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
+ rugged = rugged_repo(project.repository)
mr_diff = rugged.diff(merge_request.diff_base_sha, merge_request.diff_head_sha)
squash_diff = rugged.diff(merge_request.diff_start_sha, squash_sha)
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index f0029af83cc..be5ad849ba7 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -109,11 +109,12 @@ describe MergeRequests::UpdateService, :mailer do
expect(note.note).to include "assigned to #{user2.to_reference}"
end
- it 'creates system note about merge_request label edit' do
- note = find_note('added ~')
+ it 'creates a resource label event' do
+ event = merge_request.resource_label_events.last
- expect(note).not_to be_nil
- expect(note.note).to include "added #{label.to_reference} label"
+ expect(event).not_to be_nil
+ expect(event.label_id).to eq label.id
+ expect(event.user_id).to eq user.id
end
it 'creates system note about title change' do
@@ -314,7 +315,42 @@ describe MergeRequests::UpdateService, :mailer do
end
end
- context 'when the milestone change' do
+ context 'when the milestone is removed' do
+ let!(:non_subscriber) { create(:user) }
+
+ let!(:subscriber) do
+ create(:user) do |u|
+ merge_request.toggle_subscription(u, project)
+ project.add_developer(u)
+ end
+ end
+
+ it_behaves_like 'system notes for milestones'
+
+ it 'sends notifications for subscribers of changed milestone' do
+ merge_request.milestone = create(:milestone)
+
+ merge_request.save
+
+ perform_enqueued_jobs do
+ update_merge_request(milestone_id: "")
+ end
+
+ should_email(subscriber)
+ should_not_email(non_subscriber)
+ end
+ end
+
+ context 'when the milestone is changed' do
+ let!(:non_subscriber) { create(:user) }
+
+ let!(:subscriber) do
+ create(:user) do |u|
+ merge_request.toggle_subscription(u, project)
+ project.add_developer(u)
+ end
+ end
+
it 'marks pending todos as done' do
update_merge_request({ milestone: create(:milestone) })
@@ -322,6 +358,15 @@ describe MergeRequests::UpdateService, :mailer do
end
it_behaves_like 'system notes for milestones'
+
+ it 'sends notifications for subscribers of changed milestone' do
+ perform_enqueued_jobs do
+ update_merge_request(milestone: create(:milestone))
+ end
+
+ should_email(subscriber)
+ should_not_email(non_subscriber)
+ end
end
context 'when the labels change' do
@@ -548,8 +593,8 @@ describe MergeRequests::UpdateService, :mailer do
end
context 'setting `allow_collaboration`' do
- let(:target_project) { create(:project, :public) }
- let(:source_project) { fork_project(target_project) }
+ let(:target_project) { create(:project, :repository, :public) }
+ let(:source_project) { fork_project(target_project, nil, repository: true) }
let(:user) { create(:user) }
let(:merge_request) do
create(:merge_request,
diff --git a/spec/services/milestones/destroy_service_spec.rb b/spec/services/milestones/destroy_service_spec.rb
index 6f3612501f4..9d2be30c636 100644
--- a/spec/services/milestones/destroy_service_spec.rb
+++ b/spec/services/milestones/destroy_service_spec.rb
@@ -2,10 +2,8 @@ require 'spec_helper'
describe Milestones::DestroyService do
let(:user) { create(:user) }
- let(:project) { create(:project) }
+ let(:project) { create(:project, :repository) }
let(:milestone) { create(:milestone, title: 'Milestone v1.0', project: project) }
- let!(:issue) { create(:issue, project: project, milestone: milestone) }
- let!(:merge_request) { create(:merge_request, source_project: project, milestone: milestone) }
before do
project.add_maintainer(user)
@@ -23,12 +21,23 @@ describe Milestones::DestroyService do
end
it 'deletes milestone id from issuables' do
+ issue = create(:issue, project: project, milestone: milestone)
+ merge_request = create(:merge_request, source_project: project, milestone: milestone)
+
service.execute(milestone)
expect(issue.reload.milestone).to be_nil
expect(merge_request.reload.milestone).to be_nil
end
+ it 'logs destroy event' do
+ service.execute(milestone)
+
+ event = Event.where(project_id: milestone.project_id, target_type: 'Milestone')
+
+ expect(event.count).to eq(1)
+ end
+
context 'group milestones' do
let(:group) { create(:group) }
let(:group_milestone) { create(:milestone, group: group) }
@@ -38,13 +47,20 @@ describe Milestones::DestroyService do
group.add_developer(user)
end
- it { expect(service.execute(group_milestone)).to be_nil }
+ it { expect(service.execute(group_milestone)).to eq(group_milestone) }
- it 'does not update milestone issuables' do
- expect(MergeRequests::UpdateService).not_to receive(:new)
- expect(Issues::UpdateService).not_to receive(:new)
+ it 'deletes milestone id from issuables' do
+ issue = create(:issue, project: project, milestone: group_milestone)
+ merge_request = create(:merge_request, source_project: project, milestone: group_milestone)
service.execute(group_milestone)
+
+ expect(issue.reload.milestone).to be_nil
+ expect(merge_request.reload.milestone).to be_nil
+ end
+
+ it 'does not log destroy event' do
+ expect { service.execute(group_milestone) }.not_to change { Event.count }
end
end
end
diff --git a/spec/services/notes/build_service_spec.rb b/spec/services/notes/build_service_spec.rb
index 6e1c1fe6c02..ff85c261cd4 100644
--- a/spec/services/notes/build_service_spec.rb
+++ b/spec/services/notes/build_service_spec.rb
@@ -4,6 +4,8 @@ describe Notes::BuildService do
let(:note) { create(:discussion_note_on_issue) }
let(:project) { note.project }
let(:author) { note.author }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+ let(:mr_note) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project, author: author) }
describe '#execute' do
context 'when in_reply_to_discussion_id is specified' do
@@ -12,6 +14,19 @@ describe Notes::BuildService do
new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute
expect(new_note).to be_valid
expect(new_note.in_reply_to?(note)).to be_truthy
+ expect(new_note.resolved?).to be_falsey
+ end
+
+ context 'when discussion is resolved' do
+ before do
+ mr_note.resolve!(author)
+ end
+
+ it 'resolves the note' do
+ new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: mr_note.discussion_id).execute
+ expect(new_note).to be_valid
+ expect(new_note.resolved?).to be_truthy
+ end
end
end
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index b1290fd0d47..80b015d4cd0 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -57,6 +57,57 @@ describe Notes::CreateService do
end
end
+ context 'noteable highlight cache clearing' do
+ let(:project_with_repo) { create(:project, :repository) }
+ let(:merge_request) do
+ create(:merge_request, source_project: project_with_repo,
+ target_project: project_with_repo)
+ end
+
+ let(:position) do
+ Gitlab::Diff::Position.new(old_path: "files/ruby/popen.rb",
+ new_path: "files/ruby/popen.rb",
+ old_line: nil,
+ new_line: 14,
+ diff_refs: merge_request.diff_refs)
+ end
+
+ let(:new_opts) do
+ opts.merge(in_reply_to_discussion_id: nil,
+ type: 'DiffNote',
+ noteable_type: 'MergeRequest',
+ noteable_id: merge_request.id,
+ position: position.to_h)
+ end
+
+ before do
+ allow_any_instance_of(Gitlab::Diff::Position)
+ .to receive(:unfolded_diff?) { true }
+ end
+
+ it 'clears noteable diff cache when it was unfolded for the note position' do
+ expect_any_instance_of(Gitlab::Diff::HighlightCache).to receive(:clear)
+
+ described_class.new(project_with_repo, user, new_opts).execute
+ end
+
+ it 'does not clear cache when note is not the first of the discussion' do
+ prev_note =
+ create(:diff_note_on_merge_request, noteable: merge_request,
+ project: project_with_repo)
+ reply_opts =
+ opts.merge(in_reply_to_discussion_id: prev_note.discussion_id,
+ type: 'DiffNote',
+ noteable_type: 'MergeRequest',
+ noteable_id: merge_request.id,
+ position: position.to_h)
+
+ expect(merge_request).not_to receive(:diffs)
+
+ described_class.new(project_with_repo, user, reply_opts).execute
+ end
+ end
+
context 'note diff file' do
let(:project_with_repo) { create(:project, :repository) }
let(:merge_request) do
diff --git a/spec/services/notes/destroy_service_spec.rb b/spec/services/notes/destroy_service_spec.rb
index 64445be560e..b1f4e87e8ea 100644
--- a/spec/services/notes/destroy_service_spec.rb
+++ b/spec/services/notes/destroy_service_spec.rb
@@ -21,5 +21,38 @@ describe Notes::DestroyService do
expect { described_class.new(project, user).execute(note) }
.to change { user.todos_pending_count }.from(1).to(0)
end
+
+ context 'noteable highlight cache clearing' do
+ let(:repo_project) { create(:project, :repository) }
+ let(:merge_request) do
+ create(:merge_request, source_project: repo_project,
+ target_project: repo_project)
+ end
+
+ let(:note) do
+ create(:diff_note_on_merge_request, project: repo_project,
+ noteable: merge_request)
+ end
+
+ before do
+ allow(note.position).to receive(:unfolded_diff?) { true }
+ end
+
+ it 'clears noteable diff cache when it was unfolded for the note position' do
+ expect(merge_request).to receive_message_chain(:diffs, :clear_cache)
+
+ described_class.new(repo_project, user).execute(note)
+ end
+
+ it 'does not clear cache when note is not the first of the discussion' do
+ reply_note = create(:diff_note_on_merge_request, in_reply_to: note,
+ project: repo_project,
+ noteable: merge_request)
+
+ expect(merge_request).not_to receive(:diffs)
+
+ described_class.new(repo_project, user).execute(reply_note)
+ end
+ end
end
end
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index a8c994c101c..14d62763a5b 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Notes::QuickActionsService do
shared_context 'note on noteable' do
- let(:project) { create(:project) }
+ let(:project) { create(:project, :repository) }
let(:maintainer) { create(:user).tap { |u| project.add_maintainer(u) } }
let(:assignee) { create(:user) }
diff --git a/spec/services/notification_recipient_service_spec.rb b/spec/services/notification_recipient_service_spec.rb
index 14ba6b7bed2..cea5ea125b9 100644
--- a/spec/services/notification_recipient_service_spec.rb
+++ b/spec/services/notification_recipient_service_spec.rb
@@ -10,27 +10,50 @@ describe NotificationRecipientService do
let(:issue) { create(:issue, project: project, assignees: [assignee]) }
let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id) }
- def create_watcher
- watcher = create(:user)
- create(:notification_setting, source: project, user: watcher, level: :watch)
+ shared_examples 'no N+1 queries' do
+ it 'avoids N+1 queries', :request_store do
+ create_user
- other_projects.each do |other_project|
- create(:notification_setting, source: other_project, user: watcher, level: :watch)
+ service.build_new_note_recipients(note)
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ service.build_new_note_recipients(note)
+ end
+
+ create_user
+
+ expect { service.build_new_note_recipients(note) }.not_to exceed_query_limit(control_count)
end
end
- it 'avoids N+1 queries', :request_store do
- create_watcher
+ context 'when there are multiple watchers' do
+ def create_user
+ watcher = create(:user)
+ create(:notification_setting, source: project, user: watcher, level: :watch)
+
+ other_projects.each do |other_project|
+ create(:notification_setting, source: other_project, user: watcher, level: :watch)
+ end
+ end
- service.build_new_note_recipients(note)
+ include_examples 'no N+1 queries'
+ end
- control_count = ActiveRecord::QueryRecorder.new do
- service.build_new_note_recipients(note)
+ context 'when there are multiple subscribers' do
+ def create_user
+ subscriber = create(:user)
+ issue.subscriptions.create(user: subscriber, project: project, subscribed: true)
end
- create_watcher
+ include_examples 'no N+1 queries'
- expect { service.build_new_note_recipients(note) }.not_to exceed_query_limit(control_count)
+ context 'when the project is private' do
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ include_examples 'no N+1 queries'
+ end
end
end
end
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index c442f6fe32f..2d8da7673dc 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -13,6 +13,54 @@ describe NotificationService, :mailer do
end
end
+ shared_examples 'altered milestone notification on issue' do
+ it 'sends the email to the correct people' do
+ should_email(subscriber_to_new_milestone)
+ issue.assignees.each do |a|
+ should_email(a)
+ end
+ should_email(@u_watcher)
+ should_email(@u_guest_watcher)
+ should_email(@u_participant_mentioned)
+ should_email(@subscriber)
+ should_email(@subscribed_participant)
+ should_email(@watcher_and_subscriber)
+ should_not_email(@u_guest_custom)
+ should_not_email(@u_committer)
+ should_not_email(@unsubscriber)
+ should_not_email(@u_participating)
+ should_not_email(@u_lazy_participant)
+ should_not_email(issue.author)
+ should_not_email(@u_disabled)
+ should_not_email(@u_custom_global)
+ should_not_email(@u_mentioned)
+ end
+ end
+
+ shared_examples 'altered milestone notification on merge request' do
+ it 'sends the email to the correct people' do
+ should_email(subscriber_to_new_milestone)
+ merge_request.assignees.each do |a|
+ should_email(a)
+ end
+ should_email(@u_watcher)
+ should_email(@u_guest_watcher)
+ should_email(@u_participant_mentioned)
+ should_email(@subscriber)
+ should_email(@subscribed_participant)
+ should_email(@watcher_and_subscriber)
+ should_not_email(@u_guest_custom)
+ should_not_email(@u_committer)
+ should_not_email(@unsubscriber)
+ should_not_email(@u_participating)
+ should_not_email(@u_lazy_participant)
+ should_not_email(merge_request.author)
+ should_not_email(@u_disabled)
+ should_not_email(@u_custom_global)
+ should_not_email(@u_mentioned)
+ end
+ end
+
shared_examples 'notifications for new mentions' do
it 'sends no emails when no new mentions are present' do
send_notifications
@@ -952,6 +1000,96 @@ describe NotificationService, :mailer do
end
end
+ describe '#removed_milestone_issue' do
+ it_behaves_like 'altered milestone notification on issue' do
+ let(:milestone) { create(:milestone, project: project, issues: [issue]) }
+ let!(:subscriber_to_new_milestone) { create(:user) { |u| issue.toggle_subscription(u, project) } }
+
+ before do
+ notification.removed_milestone_issue(issue, issue.author)
+ end
+ end
+
+ context 'confidential issues' do
+ let(:author) { create(:user) }
+ let(:assignee) { create(:user) }
+ let(:non_member) { create(:user) }
+ let(:member) { create(:user) }
+ let(:guest) { create(:user) }
+ let(:admin) { create(:admin) }
+ let(:confidential_issue) { create(:issue, :confidential, project: project, title: 'Confidential issue', author: author, assignees: [assignee]) }
+ let(:milestone) { create(:milestone, project: project, issues: [confidential_issue]) }
+
+ it "emails subscribers of the issue's milestone that can read the issue" do
+ project.add_developer(member)
+ project.add_guest(guest)
+
+ confidential_issue.subscribe(non_member, project)
+ confidential_issue.subscribe(author, project)
+ confidential_issue.subscribe(assignee, project)
+ confidential_issue.subscribe(member, project)
+ confidential_issue.subscribe(guest, project)
+ confidential_issue.subscribe(admin, project)
+
+ reset_delivered_emails!
+
+ notification.removed_milestone_issue(confidential_issue, @u_disabled)
+
+ should_not_email(non_member)
+ should_not_email(guest)
+ should_email(author)
+ should_email(assignee)
+ should_email(member)
+ should_email(admin)
+ end
+ end
+ end
+
+ describe '#changed_milestone_issue' do
+ it_behaves_like 'altered milestone notification on issue' do
+ let(:new_milestone) { create(:milestone, project: project, issues: [issue]) }
+ let!(:subscriber_to_new_milestone) { create(:user) { |u| issue.toggle_subscription(u, project) } }
+
+ before do
+ notification.changed_milestone_issue(issue, new_milestone, issue.author)
+ end
+ end
+
+ context 'confidential issues' do
+ let(:author) { create(:user) }
+ let(:assignee) { create(:user) }
+ let(:non_member) { create(:user) }
+ let(:member) { create(:user) }
+ let(:guest) { create(:user) }
+ let(:admin) { create(:admin) }
+ let(:confidential_issue) { create(:issue, :confidential, project: project, title: 'Confidential issue', author: author, assignees: [assignee]) }
+ let(:new_milestone) { create(:milestone, project: project, issues: [confidential_issue]) }
+
+ it "emails subscribers of the issue's milestone that can read the issue" do
+ project.add_developer(member)
+ project.add_guest(guest)
+
+ confidential_issue.subscribe(non_member, project)
+ confidential_issue.subscribe(author, project)
+ confidential_issue.subscribe(assignee, project)
+ confidential_issue.subscribe(member, project)
+ confidential_issue.subscribe(guest, project)
+ confidential_issue.subscribe(admin, project)
+
+ reset_delivered_emails!
+
+ notification.changed_milestone_issue(confidential_issue, new_milestone, @u_disabled)
+
+ should_not_email(non_member)
+ should_not_email(guest)
+ should_email(author)
+ should_email(assignee)
+ should_email(member)
+ should_email(admin)
+ end
+ end
+ end
+
describe '#close_issue' do
before do
update_custom_notification(:close_issue, @u_guest_custom, resource: project)
@@ -1304,6 +1442,28 @@ describe NotificationService, :mailer do
end
end
+ describe '#removed_milestone_merge_request' do
+ it_behaves_like 'altered milestone notification on merge request' do
+ let(:milestone) { create(:milestone, project: project, merge_requests: [merge_request]) }
+ let!(:subscriber_to_new_milestone) { create(:user) { |u| merge_request.toggle_subscription(u, project) } }
+
+ before do
+ notification.removed_milestone_merge_request(merge_request, merge_request.author)
+ end
+ end
+ end
+
+ describe '#changed_milestone_merge_request' do
+ it_behaves_like 'altered milestone notification on merge request' do
+ let(:new_milestone) { create(:milestone, project: project, merge_requests: [merge_request]) }
+ let!(:subscriber_to_new_milestone) { create(:user) { |u| merge_request.toggle_subscription(u, project) } }
+
+ before do
+ notification.changed_milestone_merge_request(merge_request, new_milestone, merge_request.author)
+ end
+ end
+ end
+
describe '#merge_request_unmergeable' do
it "sends email to merge request author" do
notification.merge_request_unmergeable(merge_request)
@@ -1969,6 +2129,23 @@ describe NotificationService, :mailer do
end
end
+ context 'Auto DevOps notifications' do
+ describe '#autodevops_disabled' do
+ let(:owner) { create(:user) }
+ let(:namespace) { create(:namespace, owner: owner) }
+ let(:project) { create(:project, :repository, :auto_devops, namespace: namespace) }
+ let(:pipeline_user) { create(:user) }
+ let(:pipeline) { create(:ci_pipeline, :failed, project: project, user: pipeline_user) }
+
+ it 'emails project owner and user that triggered the pipeline' do
+ notification.autodevops_disabled(pipeline, [owner.email, pipeline_user.email])
+
+ should_email(owner)
+ should_email(pipeline_user)
+ end
+ end
+ end
+
def build_team(project)
@u_watcher = create_global_setting_for(create(:user), :watch)
@u_participating = create_global_setting_for(create(:user), :participating)
diff --git a/spec/services/preview_markdown_service_spec.rb b/spec/services/preview_markdown_service_spec.rb
index 507909d9231..b69977c812a 100644
--- a/spec/services/preview_markdown_service_spec.rb
+++ b/spec/services/preview_markdown_service_spec.rb
@@ -101,4 +101,11 @@ describe PreviewMarkdownService do
expect(result[:markdown_engine]).to eq :common_mark
end
+
+ it 'honors the legacy_render parameter' do
+ service = described_class.new(project, user, { legacy_render: '1' })
+ result = service.execute
+
+ expect(result[:markdown_engine]).to eq :redcarpet
+ end
end
diff --git a/spec/services/projects/after_import_service_spec.rb b/spec/services/projects/after_import_service_spec.rb
index cd52bc88f4c..4dd6c6dab86 100644
--- a/spec/services/projects/after_import_service_spec.rb
+++ b/spec/services/projects/after_import_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Projects::AfterImportService do
+ include GitHelpers
+
subject { described_class.new(project) }
let(:project) { create(:project, :repository) }
@@ -53,7 +55,7 @@ describe Projects::AfterImportService do
end
def rugged
- Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged }
+ rugged_repo(repository)
end
end
end
diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb
new file mode 100644
index 00000000000..b4718a07204
--- /dev/null
+++ b/spec/services/projects/after_rename_service_spec.rb
@@ -0,0 +1,198 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::AfterRenameService do
+ let(:rugged_config) { rugged_repo(project.repository).config }
+
+ describe '#execute' do
+ context 'using legacy storage' do
+ let(:project) { create(:project, :repository, :legacy_storage) }
+ let(:gitlab_shell) { Gitlab::Shell.new }
+ let(:project_storage) { project.send(:storage) }
+
+ before do
+ # Project#gitlab_shell returns a new instance of Gitlab::Shell on every
+ # call. This makes testing a bit easier.
+ allow(project).to receive(:gitlab_shell).and_return(gitlab_shell)
+
+ allow(project)
+ .to receive(:previous_changes)
+ .and_return('path' => ['foo'])
+
+ allow(project)
+ .to receive(:path_was)
+ .and_return('foo')
+
+ stub_feature_flags(skip_hashed_storage_upgrade: false)
+ end
+
+ it 'renames a repository' do
+ stub_container_registry_config(enabled: false)
+
+ expect(gitlab_shell).to receive(:mv_repository)
+ .ordered
+ .with(project.repository_storage, "#{project.namespace.full_path}/foo", "#{project.full_path}")
+ .and_return(true)
+
+ expect(gitlab_shell).to receive(:mv_repository)
+ .ordered
+ .with(project.repository_storage, "#{project.namespace.full_path}/foo.wiki", "#{project.full_path}.wiki")
+ .and_return(true)
+
+ expect_any_instance_of(SystemHooksService)
+ .to receive(:execute_hooks_for)
+ .with(project, :rename)
+
+ expect_any_instance_of(Gitlab::UploadsTransfer)
+ .to receive(:rename_project)
+ .with('foo', project.path, project.namespace.full_path)
+
+ expect(project).to receive(:expire_caches_before_rename)
+
+ described_class.new(project).execute
+ end
+
+ context 'container registry with images' do
+ let(:container_repository) { create(:container_repository) }
+
+ before do
+ stub_container_registry_config(enabled: true)
+ stub_container_registry_tags(repository: :any, tags: ['tag'])
+ project.container_repositories << container_repository
+ end
+
+ it 'raises a RenameFailedError' do
+ expect { described_class.new(project).execute }
+ .to raise_error(described_class::RenameFailedError)
+ end
+ end
+
+ context 'gitlab pages' do
+ before do
+ expect(project_storage).to receive(:rename_repo) { true }
+ end
+
+ it 'moves pages folder to new location' do
+ expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+
+ described_class.new(project).execute
+ end
+ end
+
+ context 'attachments' do
+ before do
+ expect(project_storage).to receive(:rename_repo) { true }
+ end
+
+ it 'moves uploads folder to new location' do
+ expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project)
+
+ described_class.new(project).execute
+ end
+ end
+
+ it 'updates project full path in .git/config' do
+ allow(project_storage).to receive(:rename_repo).and_return(true)
+
+ described_class.new(project).execute
+
+ expect(rugged_config['gitlab.fullpath']).to eq(project.full_path)
+ end
+ end
+
+ context 'using hashed storage' do
+ let(:project) { create(:project, :repository, skip_disk_validation: true) }
+ let(:gitlab_shell) { Gitlab::Shell.new }
+ let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) }
+ let(:hashed_prefix) { File.join('@hashed', hash[0..1], hash[2..3]) }
+ let(:hashed_path) { File.join(hashed_prefix, hash) }
+
+ before do
+ # Project#gitlab_shell returns a new instance of Gitlab::Shell on every
+ # call. This makes testing a bit easier.
+ allow(project).to receive(:gitlab_shell).and_return(gitlab_shell)
+ allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
+
+ stub_feature_flags(skip_hashed_storage_upgrade: false)
+ stub_application_setting(hashed_storage_enabled: true)
+ end
+
+ context 'migration to hashed storage' do
+ it 'calls HashedStorageMigrationService with correct options' do
+ project = create(:project, :repository, :legacy_storage)
+ allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
+
+ expect_next_instance_of(::Projects::HashedStorageMigrationService) do |service|
+ expect(service).to receive(:execute).and_return(true)
+ end
+
+ described_class.new(project).execute
+ end
+ end
+
+ it 'renames a repository' do
+ stub_container_registry_config(enabled: false)
+
+ expect(gitlab_shell).not_to receive(:mv_repository)
+
+ expect_any_instance_of(SystemHooksService)
+ .to receive(:execute_hooks_for)
+ .with(project, :rename)
+
+ expect(project).to receive(:expire_caches_before_rename)
+
+ described_class.new(project).execute
+ end
+
+ context 'container registry with images' do
+ let(:container_repository) { create(:container_repository) }
+
+ before do
+ stub_container_registry_config(enabled: true)
+ stub_container_registry_tags(repository: :any, tags: ['tag'])
+ project.container_repositories << container_repository
+ end
+
+ it 'raises a RenameFailedError' do
+ expect { described_class.new(project).execute }
+ .to raise_error(described_class::RenameFailedError)
+ end
+ end
+
+ context 'gitlab pages' do
+ it 'moves pages folder to new location' do
+ expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+
+ described_class.new(project).execute
+ end
+ end
+
+ context 'attachments' do
+ it 'keeps uploads folder location unchanged' do
+ expect_any_instance_of(Gitlab::UploadsTransfer).not_to receive(:rename_project)
+
+ described_class.new(project).execute
+ end
+
+ context 'when not rolled out' do
+ let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) }
+
+ it 'moves pages folder to hashed storage' do
+ expect_next_instance_of(Projects::HashedStorage::MigrateAttachmentsService) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ described_class.new(project).execute
+ end
+ end
+ end
+
+ it 'updates project full path in .git/config' do
+ described_class.new(project).execute
+
+ expect(rugged_config['gitlab.fullpath']).to eq(project.full_path)
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/auto_devops/disable_service_spec.rb b/spec/services/projects/auto_devops/disable_service_spec.rb
new file mode 100644
index 00000000000..76977d7a1a7
--- /dev/null
+++ b/spec/services/projects/auto_devops/disable_service_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Projects::AutoDevops::DisableService, '#execute' do
+ let(:project) { create(:project, :repository, :auto_devops) }
+ let(:auto_devops) { project.auto_devops }
+
+ subject { described_class.new(project).execute }
+
+ context 'when Auto DevOps disabled at instance level' do
+ before do
+ stub_application_setting(auto_devops_enabled: false)
+ end
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when Auto DevOps enabled at instance level' do
+ before do
+ stub_application_setting(auto_devops_enabled: true)
+ end
+
+ context 'when Auto DevOps explicitly enabled on project' do
+ before do
+ auto_devops.update!(enabled: true)
+ end
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when Auto DevOps explicitly disabled on project' do
+ before do
+ auto_devops.update!(enabled: false)
+ end
+
+ it { is_expected.to be_falsy }
+ end
+
+ context 'when Auto DevOps is implicitly enabled' do
+ before do
+ auto_devops.update!(enabled: nil)
+ end
+
+ context 'when is the first pipeline failure' do
+ before do
+ create(:ci_pipeline, :failed, :auto_devops_source, project: project)
+ end
+
+ it 'should disable Auto DevOps for project' do
+ subject
+
+ expect(auto_devops.enabled).to eq(false)
+ end
+ end
+
+ context 'when it is not the first pipeline failure' do
+ before do
+ create_list(:ci_pipeline, 2, :failed, :auto_devops_source, project: project)
+ end
+
+ it 'should explicitly disable Auto DevOps for project' do
+ subject
+
+ expect(auto_devops.reload.enabled).to eq(false)
+ end
+ end
+
+ context 'when an Auto DevOps pipeline has succeeded before' do
+ before do
+ create(:ci_pipeline, :success, :auto_devops_source, project: project)
+ end
+
+ it 'should not disable Auto DevOps for project' do
+ subject
+
+ expect(auto_devops.reload.enabled).to be_nil
+ end
+ end
+ end
+
+ context 'when project does not have an Auto DevOps record related' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ create(:ci_pipeline, :failed, :auto_devops_source, project: project)
+ end
+
+ it 'should disable Auto DevOps for project' do
+ subject
+ auto_devops = project.reload.auto_devops
+
+ expect(auto_devops.enabled).to eq(false)
+ end
+
+ it 'should create a ProjectAutoDevops record' do
+ expect { subject }.to change { ProjectAutoDevops.count }.from(0).to(1)
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/autocomplete_service_spec.rb b/spec/services/projects/autocomplete_service_spec.rb
index e98df375d48..373fe7cb7dd 100644
--- a/spec/services/projects/autocomplete_service_spec.rb
+++ b/spec/services/projects/autocomplete_service_spec.rb
@@ -148,7 +148,7 @@ describe Projects::AutocompleteService do
let!(:label1) { create(:label, project: project) }
let!(:label2) { create(:label, project: project) }
let!(:sub_group_label) { create(:group_label, group: sub_group) }
- let!(:parent_group_label) { create(:group_label, group: group.parent) }
+ let!(:parent_group_label) { create(:group_label, group: group.parent, group_id: group.id) }
before do
create(:group_member, group: group, user: user)
@@ -156,7 +156,7 @@ describe Projects::AutocompleteService do
it 'returns labels from project and ancestor groups' do
service = described_class.new(project, user)
- results = service.labels_as_hash
+ results = service.labels_as_hash(nil)
expected_labels = [label1, label2, parent_group_label]
expect_labels_to_equal(results, expected_labels)
diff --git a/spec/services/projects/container_repository/destroy_service_spec.rb b/spec/services/projects/container_repository/destroy_service_spec.rb
new file mode 100644
index 00000000000..affcc66d2bb
--- /dev/null
+++ b/spec/services/projects/container_repository/destroy_service_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::ContainerRepository::DestroyService do
+ set(:user) { create(:user) }
+ set(:project) { create(:project, :private) }
+
+ subject { described_class.new(project, user) }
+
+ before do
+ stub_container_registry_config(enabled: true)
+ end
+
+ context 'when user does not have access to registry' do
+ let!(:repository) { create(:container_repository, :root, project: project) }
+
+ it 'does not delete a repository' do
+ expect { subject.execute(repository) }.not_to change { ContainerRepository.all.count }
+ end
+ end
+
+ context 'when user has access to registry' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when root container repository exists' do
+ let!(:repository) { create(:container_repository, :root, project: project) }
+
+ before do
+ stub_container_registry_tags(repository: :any, tags: [])
+ end
+
+ it 'deletes the repository' do
+ expect(repository).to receive(:delete_tags!).and_call_original
+ expect { described_class.new(project, user).execute(repository) }.to change { ContainerRepository.all.count }.by(-1)
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index bb3f1501f0e..08de27ca44a 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Projects::CreateService, '#execute' do
+ include GitHelpers
+
let(:gitlab_shell) { Gitlab::Shell.new }
let(:user) { create :user }
let(:opts) do
@@ -293,11 +295,20 @@ describe Projects::CreateService, '#execute' do
end
end
+ it 'calls the passed block' do
+ fake_block = double('block')
+ opts[:relations_block] = fake_block
+
+ expect_next_instance_of(Project) do |project|
+ expect(fake_block).to receive(:call).with(project)
+ end
+
+ create_project(user, opts)
+ end
+
it 'writes project full path to .git/config' do
project = create_project(user, opts)
- rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
+ rugged = rugged_repo(project.repository)
expect(rugged.config['gitlab.fullpath']).to eq project.full_path
end
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index e428808ab68..12ddf8447bd 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -65,10 +65,12 @@ describe Projects::DestroyService do
context 'Sidekiq inline' do
before do
- # Run sidekiq immediatly to check that renamed repository will be removed
+ # Run sidekiq immediately to check that renamed repository will be removed
perform_enqueued_jobs { destroy_project(project, user, {}) }
end
+ it_behaves_like 'deleting the project'
+
context 'when has remote mirrors' do
let!(:project) do
create(:project, :repository, namespace: user.namespace).tap do |project|
@@ -82,13 +84,28 @@ describe Projects::DestroyService do
end
end
- it_behaves_like 'deleting the project'
-
it 'invalidates personal_project_count cache' do
expect(user).to receive(:invalidate_personal_projects_count)
destroy_project(project, user)
end
+
+ context 'when project has exports' do
+ let!(:project_with_export) do
+ create(:project, :repository, namespace: user.namespace).tap do |project|
+ create(:import_export_upload,
+ project: project,
+ export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz'))
+ end
+ end
+ let!(:async) { true }
+
+ it 'destroys project and export' do
+ expect { destroy_project(project_with_export, user) }.to change(ImportExportUpload, :count).by(-1)
+
+ expect(Project.all).not_to include(project_with_export)
+ end
+ end
end
context 'Sidekiq fake' do
@@ -204,7 +221,7 @@ describe Projects::DestroyService do
context 'when image repository deletion fails' do
it 'raises an exception' do
expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_return(false)
+ .to receive(:delete_tags!).and_raise(RuntimeError)
expect(destroy_project(project, user)).to be false
end
@@ -242,7 +259,6 @@ describe Projects::DestroyService do
before do
project.lfs_objects << create(:lfs_object)
- forked_project.forked_project_link.destroy
forked_project.reload
end
diff --git a/spec/services/projects/detect_repository_languages_service_spec.rb b/spec/services/projects/detect_repository_languages_service_spec.rb
index f90d558938f..deea1189cdf 100644
--- a/spec/services/projects/detect_repository_languages_service_spec.rb
+++ b/spec/services/projects/detect_repository_languages_service_spec.rb
@@ -5,10 +5,6 @@ describe Projects::DetectRepositoryLanguagesService, :clean_gitlab_redis_shared_
subject { described_class.new(project, project.owner) }
- before do
- allow(Feature).to receive(:disabled?).and_return(false)
- end
-
describe '#execute' do
context 'without previous detection' do
it 'inserts new programming languages in the database' do
diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb
index f89f9b54f53..a3d24ae312a 100644
--- a/spec/services/projects/fork_service_spec.rb
+++ b/spec/services/projects/fork_service_spec.rb
@@ -31,6 +31,10 @@ describe Projects::ForkService do
it { is_expected.not_to be_persisted }
it { expect(subject.errors[:forked_from_project_id]).to eq(['is forbidden']) }
+
+ it 'does not create a fork network' do
+ expect { subject }.not_to change { @from_project.reload.fork_network }
+ end
end
describe "successfully creates project in the user namespace" do
@@ -70,6 +74,12 @@ describe Projects::ForkService do
expect(fork_network.root_project).to eq(@from_project)
expect(fork_network.projects).to contain_exactly(@from_project, to_project)
end
+
+ it 'imports the repository of the forked project' do
+ to_project = fork_project(@from_project, @to_user, repository: true)
+
+ expect(to_project.empty_repo?).to be_falsy
+ end
end
context 'creating a fork of a fork' do
@@ -247,11 +257,13 @@ describe Projects::ForkService do
context 'if project is not forked' do
it 'creates fork relation' do
- expect(fork_to_project.forked?).to be false
+ expect(fork_to_project.forked?).to be_falsy
expect(forked_from_project(fork_to_project)).to be_nil
subject.execute(fork_to_project)
+ fork_to_project.reload
+
expect(fork_to_project.forked?).to be true
expect(forked_from_project(fork_to_project)).to eq fork_from_project
expect(fork_to_project.forked_from_project).to eq fork_from_project
@@ -264,6 +276,25 @@ describe Projects::ForkService do
expect(fork_from_project.forks_count).to eq(1)
end
+
+ it 'leaves no LFS objects dangling' do
+ create(:lfs_objects_project, project: fork_to_project)
+
+ expect { subject.execute(fork_to_project) }
+ .to change { fork_to_project.lfs_objects_projects.count }
+ .to(0)
+ end
+
+ context 'if the fork is not allowed' do
+ let(:fork_from_project) { create(:project, :private) }
+
+ it 'does not delete the LFS objects' do
+ create(:lfs_objects_project, project: fork_to_project)
+
+ expect { subject.execute(fork_to_project) }
+ .not_to change { fork_to_project.lfs_objects_projects.size }
+ end
+ end
end
end
end
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
index 5f67c325223..0e82194e9ee 100644
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Projects::HashedStorage::MigrateRepositoryService do
+ include GitHelpers
+
let(:gitlab_shell) { Gitlab::Shell.new }
let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo) }
let(:legacy_storage) { Storage::LegacyProject.new(project) }
@@ -38,9 +40,7 @@ describe Projects::HashedStorage::MigrateRepositoryService do
it 'writes project full path to .git/config' do
service.execute
- rugged_config = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged.config['gitlab.fullpath']
- end
+ rugged_config = rugged_repo(project.repository).config['gitlab.fullpath']
expect(rugged_config).to eq project.full_path
end
diff --git a/spec/services/projects/import_service_spec.rb b/spec/services/projects/import_service_spec.rb
index e2a600d12d1..06f865dc848 100644
--- a/spec/services/projects/import_service_spec.rb
+++ b/spec/services/projects/import_service_spec.rb
@@ -125,7 +125,7 @@ describe Projects::ImportService do
project.import_type = 'bitbucket'
end
- it 'succeeds if repository import is successfull' do
+ it 'succeeds if repository import is successful' do
expect_any_instance_of(Gitlab::Shell).to receive(:import_repository).and_return(true)
expect_any_instance_of(Gitlab::BitbucketImport::Importer).to receive(:execute).and_return(true)
expect_any_instance_of(Projects::LfsPointers::LfsImportService).to receive(:execute).and_return({})
@@ -235,7 +235,7 @@ describe Projects::ImportService do
result = described_class.new(project, user).execute
expect(result[:status]).to eq :error
- expect(result[:message]).to include('Only allowed ports are 22, 80, 443')
+ expect(result[:message]).to include('Only allowed ports are 80, 443')
end
end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index 1a85c52fc97..2e07d4f8013 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe Projects::TransferService do
+ include GitHelpers
+
let(:gitlab_shell) { Gitlab::Shell.new }
let(:user) { create(:user) }
let(:group) { create(:group) }
@@ -123,7 +125,7 @@ describe Projects::TransferService do
it { expect(project.errors.messages[:new_namespace].first).to eq 'Please select a new namespace for your project.' }
end
- context 'disallow transfering of project with tags' do
+ context 'disallow transferring of project with tags' do
let(:container_repository) { create(:container_repository) }
before do
@@ -169,6 +171,35 @@ describe Projects::TransferService do
it { expect(project.errors[:new_namespace]).to include('Cannot move project') }
end
+ context 'target namespace containing the same project name' do
+ before do
+ group.add_owner(user)
+ project.update(name: 'new_name')
+
+ create(:project, name: 'new_name', group: group, path: 'other')
+
+ @result = transfer_project(project, user, group)
+ end
+
+ it { expect(@result).to eq false }
+ it { expect(project.namespace).to eq(user.namespace) }
+ it { expect(project.errors[:new_namespace]).to include('Project with same name or path in target namespace already exists') }
+ end
+
+ context 'target namespace containing the same project path' do
+ before do
+ group.add_owner(user)
+
+ create(:project, name: 'other-name', path: project.path, group: group)
+
+ @result = transfer_project(project, user, group)
+ end
+
+ it { expect(@result).to eq false }
+ it { expect(project.namespace).to eq(user.namespace) }
+ it { expect(project.errors[:new_namespace]).to include('Project with same name or path in target namespace already exists') }
+ end
+
def transfer_project(project, user, new_namespace)
service = Projects::TransferService.new(project, user)
@@ -262,8 +293,6 @@ describe Projects::TransferService do
end
def rugged_config
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged.config
- end
+ rugged_repo(project.repository).config
end
end
diff --git a/spec/services/projects/unlink_fork_service_spec.rb b/spec/services/projects/unlink_fork_service_spec.rb
index 3ec6139bfa6..014aab44281 100644
--- a/spec/services/projects/unlink_fork_service_spec.rb
+++ b/spec/services/projects/unlink_fork_service_spec.rb
@@ -5,13 +5,12 @@ describe Projects::UnlinkForkService do
subject { described_class.new(forked_project, user) }
- let(:fork_link) { forked_project.forked_project_link }
let(:project) { create(:project, :public) }
let(:forked_project) { fork_project(project, user) }
let(:user) { create(:user) }
context 'with opened merge request on the source project' do
- let(:merge_request) { create(:merge_request, source_project: forked_project, target_project: fork_link.forked_from_project) }
+ let(:merge_request) { create(:merge_request, source_project: forked_project, target_project: forked_project.forked_from_project) }
let(:merge_request2) { create(:merge_request, source_project: forked_project, target_project: fork_project(project)) }
let(:merge_request_in_fork) { create(:merge_request, source_project: forked_project, target_project: forked_project) }
@@ -35,12 +34,6 @@ describe Projects::UnlinkForkService do
end
end
- it 'remove fork relation' do
- expect(forked_project.forked_project_link).to receive(:destroy)
-
- subject.execute
- end
-
it 'removes the link to the fork network' do
expect(forked_project.fork_network_member).to be_present
expect(forked_project.fork_network).to be_present
diff --git a/spec/services/projects/update_remote_mirror_service_spec.rb b/spec/services/projects/update_remote_mirror_service_spec.rb
index 5c2e79ff9af..cd903bfe8a5 100644
--- a/spec/services/projects/update_remote_mirror_service_spec.rb
+++ b/spec/services/projects/update_remote_mirror_service_spec.rb
@@ -1,106 +1,88 @@
require 'spec_helper'
describe Projects::UpdateRemoteMirrorService do
- set(:project) { create(:project, :repository) }
- let(:owner) { project.owner }
+ let(:project) { create(:project, :repository) }
let(:remote_project) { create(:forked_project_with_submodules) }
- let(:repository) { project.repository }
- let(:raw_repository) { repository.raw }
let(:remote_mirror) { project.remote_mirrors.create!(url: remote_project.http_url_to_repo, enabled: true, only_protected_branches: false) }
+ let(:remote_name) { remote_mirror.remote_name }
- subject { described_class.new(project, project.creator) }
+ subject(:service) { described_class.new(project, project.creator) }
describe "#execute" do
before do
- repository.add_branch(owner, 'existing-branch', 'master')
+ project.repository.add_branch(project.owner, 'existing-branch', 'master')
allow(remote_mirror).to receive(:update_repository).and_return(true)
end
+ it "ensures the remote exists" do
+ stub_fetch_remote(project, remote_name: remote_name)
+
+ expect(remote_mirror).to receive(:ensure_remote!)
+
+ service.execute(remote_mirror)
+ end
+
it "fetches the remote repository" do
- expect(repository).to receive(:fetch_remote).with(remote_mirror.remote_name, no_tags: true) do
- sync_remote(repository, remote_mirror.remote_name, local_branch_names)
- end
+ expect(project.repository)
+ .to receive(:fetch_remote)
+ .with(remote_mirror.remote_name, no_tags: true)
- subject.execute(remote_mirror)
+ service.execute(remote_mirror)
end
- it "succeeds" do
- allow(repository).to receive(:fetch_remote) { sync_remote(repository, remote_mirror.remote_name, local_branch_names) }
+ it "returns success when updated succeeds" do
+ stub_fetch_remote(project, remote_name: remote_name)
- result = subject.execute(remote_mirror)
+ result = service.execute(remote_mirror)
expect(result[:status]).to eq(:success)
end
context 'when syncing all branches' do
it "push all the branches the first time" do
- allow(repository).to receive(:fetch_remote)
+ stub_fetch_remote(project, remote_name: remote_name)
expect(remote_mirror).to receive(:update_repository).with({})
- subject.execute(remote_mirror)
+ service.execute(remote_mirror)
end
end
context 'when only syncing protected branches' do
- let(:unprotected_branch_name) { 'existing-branch' }
- let(:protected_branch_name) do
- project.repository.branch_names.find { |n| n != unprotected_branch_name }
- end
- let!(:protected_branch) do
- create(:protected_branch, project: project, name: protected_branch_name)
- end
-
- before do
- project.reload
+ it "sync updated protected branches" do
+ stub_fetch_remote(project, remote_name: remote_name)
+ protected_branch = create_protected_branch(project)
remote_mirror.only_protected_branches = true
- end
- it "sync updated protected branches" do
- allow(repository).to receive(:fetch_remote)
- expect(remote_mirror).to receive(:update_repository).with(only_branches_matching: [protected_branch_name])
+ expect(remote_mirror)
+ .to receive(:update_repository)
+ .with(only_branches_matching: [protected_branch.name])
- subject.execute(remote_mirror)
+ service.execute(remote_mirror)
end
- end
- end
- def sync_remote(repository, remote_name, local_branch_names)
- local_branch_names.each do |branch|
- commit = repository.commit(branch)
- repository.write_ref("refs/remotes/#{remote_name}/#{branch}", commit.id) if commit
+ def create_protected_branch(project)
+ branch_name = project.repository.branch_names.find { |n| n != 'existing-branch' }
+ create(:protected_branch, project: project, name: branch_name)
+ end
end
end
- def update_remote_branch(repository, remote_name, branch)
- masterrev = repository.commit('master').id
-
- repository.write_ref("refs/remotes/#{remote_name}/#{branch}", masterrev, force: true)
- repository.expire_branches_cache
+ def stub_fetch_remote(project, remote_name:)
+ allow(project.repository)
+ .to receive(:fetch_remote)
+ .with(remote_name, no_tags: true) { fetch_remote(project.repository, remote_name) }
end
- def update_branch(repository, branch)
- masterrev = repository.commit('master').id
-
- repository.write_ref("refs/heads/#{branch}", masterrev, force: true)
- repository.expire_branches_cache
- end
-
- def generate_tags(repository, *tag_names)
- tag_names.each_with_object([]) do |name, tags|
- tag = repository.find_tag(name)
- target = tag.try(:target)
- target_commit = tag.try(:dereferenced_target)
- tags << Gitlab::Git::Tag.new(repository.raw_repository, {
- name: name,
- target: target,
- target_commit: target_commit
- })
+ def fetch_remote(repository, remote_name)
+ local_branch_names(repository).each do |branch|
+ commit = repository.commit(branch)
+ repository.write_ref("refs/remotes/#{remote_name}/#{branch}", commit.id) if commit
end
end
- def local_branch_names
+ def local_branch_names(repository)
branch_names = repository.branches.map(&:name)
# we want the protected branch to be pushed first
branch_names.unshift(branch_names.delete('master'))
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index 9572b4110d5..d58ff2cedc0 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -249,9 +249,20 @@ describe Projects::UpdateService do
expect(project.errors.messages[:base]).to include('There is already a repository with that name on disk')
end
- context 'when hashed storage enabled' do
+ it 'renames the project without upgrading it' do
+ result = update_project(project, admin, path: 'new-path')
+
+ expect(result).not_to include(status: :error)
+ expect(project).to be_valid
+ expect(project.errors).to be_empty
+ expect(project.disk_path).to include('new-path')
+ expect(project.reload.hashed_storage?(:repository)).to be_falsey
+ end
+
+ context 'when hashed storage is enabled' do
before do
stub_application_setting(hashed_storage_enabled: true)
+ stub_feature_flags(skip_hashed_storage_upgrade: false)
end
it 'migrates project to a hashed storage instead of renaming the repo to another legacy name' do
@@ -262,6 +273,22 @@ describe Projects::UpdateService do
expect(project.errors).to be_empty
expect(project.reload.hashed_storage?(:repository)).to be_truthy
end
+
+ context 'when skip_hashed_storage_upgrade feature flag is enabled' do
+ before do
+ stub_feature_flags(skip_hashed_storage_upgrade: true)
+ end
+
+ it 'renames the project without upgrading it' do
+ result = update_project(project, admin, path: 'new-path')
+
+ expect(result).not_to include(status: :error)
+ expect(project).to be_valid
+ expect(project.errors).to be_empty
+ expect(project.disk_path).to include('new-path')
+ expect(project.reload.hashed_storage?(:repository)).to be_falsey
+ end
+ end
end
end
@@ -313,6 +340,27 @@ describe Projects::UpdateService do
call_service
end
end
+
+ context 'when updating #pages_access_level' do
+ subject(:call_service) do
+ update_project(project, admin, project_feature_attributes: { pages_access_level: ProjectFeature::PRIVATE })
+ end
+
+ it 'updates the attribute' do
+ expect { call_service }
+ .to change { project.project_feature.pages_access_level }
+ .to(ProjectFeature::PRIVATE)
+ end
+
+ it 'calls Projects::UpdatePagesConfigurationService' do
+ expect(Projects::UpdatePagesConfigurationService)
+ .to receive(:new)
+ .with(project)
+ .and_call_original
+
+ call_service
+ end
+ end
end
describe '#run_auto_devops_pipeline?' do
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index bf1c157c4a2..938764f40b0 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe QuickActions::InterpretService do
@@ -272,6 +274,28 @@ describe QuickActions::InterpretService do
end
end
+ shared_examples 'lock command' do
+ let(:issue) { create(:issue, project: project, discussion_locked: false) }
+ let(:merge_request) { create(:merge_request, source_project: project, discussion_locked: false) }
+
+ it 'returns discussion_locked: true if content contains /lock' do
+ _, updates = service.execute(content, issuable)
+
+ expect(updates).to eq(discussion_locked: true)
+ end
+ end
+
+ shared_examples 'unlock command' do
+ let(:issue) { create(:issue, project: project, discussion_locked: true) }
+ let(:merge_request) { create(:merge_request, source_project: project, discussion_locked: true) }
+
+ it 'returns discussion_locked: true if content contains /unlock' do
+ _, updates = service.execute(content, issuable)
+
+ expect(updates).to eq(discussion_locked: false)
+ end
+ end
+
shared_examples 'empty command' do
it 'populates {} if content contains an unsupported command' do
_, updates = service.execute(content, issuable)
@@ -291,7 +315,7 @@ describe QuickActions::InterpretService do
end
shared_examples 'award command' do
- it 'toggle award 100 emoji if content containts /award :100:' do
+ it 'toggle award 100 emoji if content contains /award :100:' do
_, updates = service.execute(content, issuable)
expect(updates).to eq(emoji_award: "100")
@@ -356,6 +380,14 @@ describe QuickActions::InterpretService do
end
end
+ shared_examples 'assign command' do
+ it 'assigns to a single user' do
+ _, updates = service.execute(content, issuable)
+
+ expect(updates).to eq(assignee_ids: [developer.id])
+ end
+ end
+
it_behaves_like 'reopen command' do
let(:content) { '/reopen' }
let(:issuable) { issue }
@@ -450,67 +482,56 @@ describe QuickActions::InterpretService do
let(:issuable) { issue }
end
- context 'assign command' do
- let(:content) { "/assign @#{developer.username}" }
-
- context 'Issue' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, issue)
-
- expect(updates[:assignee_ids]).to match_array([developer.id])
- end
+ context 'assign command with one user' do
+ it_behaves_like 'assign command' do
+ let(:content) { "/assign @#{developer.username}" }
+ let(:issuable) { issue }
end
- context 'Merge Request' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, merge_request)
-
- expect(updates).to eq(assignee_ids: [developer.id])
- end
+ it_behaves_like 'assign command' do
+ let(:content) { "/assign @#{developer.username}" }
+ let(:issuable) { merge_request }
end
end
+ # CE does not have multiple assignees
context 'assign command with multiple assignees' do
- let(:content) { "/assign @#{developer.username} @#{developer2.username}" }
-
before do
project.add_developer(developer2)
end
- context 'Issue' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, issue)
-
- expect(updates[:assignee_ids]).to match_array([developer.id])
- end
+ it_behaves_like 'assign command' do
+ let(:content) { "/assign @#{developer.username} @#{developer2.username}" }
+ let(:issuable) { issue }
end
- context 'Merge Request' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, merge_request)
-
- expect(updates).to eq(assignee_ids: [developer.id])
- end
+ it_behaves_like 'assign command' do
+ let(:content) { "/assign @#{developer.username} @#{developer2.username}" }
+ let(:issuable) { merge_request }
end
end
context 'assign command with me alias' do
- let(:content) { "/assign me" }
-
- context 'Issue' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, issue)
+ it_behaves_like 'assign command' do
+ let(:content) { '/assign me' }
+ let(:issuable) { issue }
+ end
- expect(updates).to eq(assignee_ids: [developer.id])
- end
+ it_behaves_like 'assign command' do
+ let(:content) { '/assign me' }
+ let(:issuable) { merge_request }
end
+ end
- context 'Merge Request' do
- it 'fetches assignee and populates assignee_ids if content contains /assign' do
- _, updates = service.execute(content, merge_request)
+ context 'assign command with me alias and whitespace' do
+ it_behaves_like 'assign command' do
+ let(:content) { '/assign me ' }
+ let(:issuable) { issue }
+ end
- expect(updates).to eq(assignee_ids: [developer.id])
- end
+ it_behaves_like 'assign command' do
+ let(:content) { '/assign me ' }
+ let(:issuable) { merge_request }
end
end
@@ -786,6 +807,26 @@ describe QuickActions::InterpretService do
let(:issuable) { issue }
end
+ it_behaves_like 'lock command' do
+ let(:content) { '/lock' }
+ let(:issuable) { issue }
+ end
+
+ it_behaves_like 'lock command' do
+ let(:content) { '/lock' }
+ let(:issuable) { merge_request }
+ end
+
+ it_behaves_like 'unlock command' do
+ let(:content) { '/unlock' }
+ let(:issuable) { issue }
+ end
+
+ it_behaves_like 'unlock command' do
+ let(:content) { '/unlock' }
+ let(:issuable) { merge_request }
+ end
+
context '/todo' do
let(:content) { '/todo' }
@@ -821,6 +862,13 @@ describe QuickActions::InterpretService do
let(:source_issuable) { create(:labeled_issue, project: project, labels: [inreview_label, todo_label]) }
let(:content) { "/copy_metadata #{source_issuable.to_reference}" }
+ let(:issuable) { build(:issue, project: project) }
+ end
+
+ it_behaves_like 'copy_metadata command' do
+ let(:source_issuable) { create(:labeled_issue, project: project, labels: [inreview_label, todo_label]) }
+
+ let(:content) { "/copy_metadata #{source_issuable.to_reference}" }
let(:issuable) { issue }
end
@@ -961,6 +1009,16 @@ describe QuickActions::InterpretService do
let(:content) { '/duplicate #{issue.to_reference}' }
let(:issuable) { issue }
end
+
+ it_behaves_like 'empty command' do
+ let(:content) { '/lock' }
+ let(:issuable) { issue }
+ end
+
+ it_behaves_like 'empty command' do
+ let(:content) { '/unlock' }
+ let(:issuable) { issue }
+ end
end
context '/award command' do
@@ -1155,6 +1213,46 @@ describe QuickActions::InterpretService do
end
end
end
+
+ it 'limits to commands passed ' do
+ content = "/shrug\n/close"
+
+ text, commands = service.execute(content, issue, only: [:shrug])
+
+ expect(commands).to be_empty
+ expect(text).to eq("#{described_class::SHRUG}\n/close")
+ end
+
+ context '/create_merge_request command' do
+ let(:branch_name) { '1-feature' }
+ let(:content) { "/create_merge_request #{branch_name}" }
+ let(:issuable) { issue }
+
+ context 'if issuable is not an Issue' do
+ let(:issuable) { merge_request }
+
+ it_behaves_like 'empty command'
+ end
+
+ context "when logged user cannot create_merge_requests in the project" do
+ let(:project) { create(:project, :archived) }
+
+ it_behaves_like 'empty command'
+ end
+
+ context 'when logged user cannot push code to the project' do
+ let(:project) { create(:project, :private) }
+ let(:service) { described_class.new(project, create(:user)) }
+
+ it_behaves_like 'empty command'
+ end
+
+ it 'populates create_merge_request with branch_name and issue iid' do
+ _, updates = service.execute(content, issuable)
+
+ expect(updates).to eq(create_merge_request: { branch_name: branch_name, issue_iid: issuable.iid })
+ end
+ end
end
describe '#explain' do
@@ -1337,7 +1435,7 @@ describe QuickActions::InterpretService do
it 'includes the formatted duration and proper verb' do
_, explanations = service.explain(content, issue)
- expect(explanations).to eq(['Substracts 2h spent time.'])
+ expect(explanations).to eq(['Subtracts 2h spent time.'])
end
end
@@ -1406,5 +1504,27 @@ describe QuickActions::InterpretService do
end
end
end
+
+ describe 'create a merge request' do
+ context 'with no branch name' do
+ let(:content) { '/create_merge_request' }
+
+ it 'uses the default branch name' do
+ _, explanations = service.explain(content, issue)
+
+ expect(explanations).to eq(['Creates a branch and a merge request to resolve this issue'])
+ end
+ end
+
+ context 'with a branch name' do
+ let(:content) { '/create_merge_request foo' }
+
+ it 'uses the given branch name' do
+ _, explanations = service.explain(content, issue)
+
+ expect(explanations).to eq(["Creates branch 'foo' and a merge request to resolve this issue"])
+ end
+ end
+ end
end
end
diff --git a/spec/services/resource_events/change_labels_service_spec.rb b/spec/services/resource_events/change_labels_service_spec.rb
index 41b0fb3eea3..4c9138fb1ef 100644
--- a/spec/services/resource_events/change_labels_service_spec.rb
+++ b/spec/services/resource_events/change_labels_service_spec.rb
@@ -18,6 +18,14 @@ describe ResourceEvents::ChangeLabelsService do
expect(event.action).to eq(action)
end
+ it 'expires resource note etag cache' do
+ expect_any_instance_of(Gitlab::EtagCaching::Store)
+ .to receive(:touch)
+ .with("/#{resource.project.namespace.to_param}/#{resource.project.to_param}/noteable/issue/#{resource.id}/notes")
+
+ described_class.new(resource, author).execute(added_labels: [labels[0]])
+ end
+
context 'when adding a label' do
let(:added) { [labels[0]] }
let(:removed) { [] }
diff --git a/spec/services/resource_events/merge_into_notes_service_spec.rb b/spec/services/resource_events/merge_into_notes_service_spec.rb
new file mode 100644
index 00000000000..c76f6e6f77e
--- /dev/null
+++ b/spec/services/resource_events/merge_into_notes_service_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ResourceEvents::MergeIntoNotesService do
+ def create_event(params)
+ event_params = { action: :add, label: label, issue: resource,
+ user: user }
+
+ create(:resource_label_event, event_params.merge(params))
+ end
+
+ def create_note(params)
+ opts = { noteable: resource, project: project }
+
+ create(:note_on_issue, opts.merge(params))
+ end
+
+ set(:project) { create(:project) }
+ set(:user) { create(:user) }
+ set(:resource) { create(:issue, project: project) }
+ set(:label) { create(:label, project: project) }
+ set(:label2) { create(:label, project: project) }
+ let(:time) { Time.now }
+
+ describe '#execute' do
+ it 'merges label events into notes in order of created_at' do
+ note1 = create_note(created_at: 4.days.ago)
+ note2 = create_note(created_at: 2.days.ago)
+ event1 = create_event(created_at: 3.days.ago)
+ event2 = create_event(created_at: 1.day.ago)
+
+ notes = described_class.new(resource, user).execute([note1, note2])
+
+ expected = [note1, event1, note2, event2].map(&:discussion_id)
+ expect(notes.map(&:discussion_id)).to eq expected
+ end
+
+ it 'squashes events with same time and author into single note' do
+ user2 = create(:user)
+
+ create_event(created_at: time)
+ create_event(created_at: time, label: label2, action: :remove)
+ create_event(created_at: time, user: user2)
+ create_event(created_at: 1.day.ago, label: label2)
+
+ notes = described_class.new(resource, user).execute()
+
+ expected = [
+ "added #{label.to_reference} label and removed #{label2.to_reference} label",
+ "added #{label.to_reference} label",
+ "added #{label2.to_reference} label"
+ ]
+
+ expect(notes.count).to eq 3
+ expect(notes.map(&:note)).to match_array expected
+ end
+
+ it 'fetches only notes created after last_fetched_at' do
+ create_event(created_at: 4.days.ago)
+ event = create_event(created_at: 1.day.ago)
+
+ notes = described_class.new(resource, user,
+ last_fetched_at: 2.days.ago.to_i).execute()
+
+ expect(notes.count).to eq 1
+ expect(notes.first.discussion_id).to eq event.discussion_id
+ end
+
+ it "preloads the note author's status" do
+ event = create_event(created_at: time)
+ create(:user_status, user: event.user)
+
+ notes = described_class.new(resource, user).execute
+
+ expect(notes.first.author.association(:status)).to be_loaded
+ end
+ end
+end
diff --git a/spec/services/submodules/update_service_spec.rb b/spec/services/submodules/update_service_spec.rb
new file mode 100644
index 00000000000..cf92350c1b2
--- /dev/null
+++ b/spec/services/submodules/update_service_spec.rb
@@ -0,0 +1,212 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Submodules::UpdateService do
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository }
+ let(:user) { create(:user, :commit_email) }
+ let(:branch_name) { project.default_branch }
+ let(:submodule) { 'six' }
+ let(:commit_sha) { 'e25eda1fece24ac7a03624ed1320f82396f35bd8' }
+ let(:commit_message) { 'whatever' }
+ let(:current_sha) { repository.blob_at('HEAD', submodule).id }
+ let(:commit_params) do
+ {
+ submodule: submodule,
+ commit_message: commit_message,
+ commit_sha: commit_sha,
+ branch_name: branch_name
+ }
+ end
+
+ subject { described_class.new(project, user, commit_params) }
+
+ describe "#execute" do
+ shared_examples 'returns error result' do
+ it do
+ result = subject.execute
+
+ expect(result[:status]).to eq :error
+ expect(result[:message]).to eq error_message
+ end
+ end
+
+ context 'when the user is not authorized' do
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'You are not allowed to push into this branch' }
+ end
+ end
+
+ context 'when the user is authorized' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'when the branch is protected' do
+ before do
+ create(:protected_branch, :no_one_can_push, project: project, name: branch_name)
+ end
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'You are not allowed to push into this branch' }
+ end
+ end
+
+ context 'validations' do
+ context 'when submodule' do
+ context 'is empty' do
+ let(:submodule) { '' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+
+ context 'is not present' do
+ let(:submodule) { nil }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+
+ context 'is invalid' do
+ let(:submodule) { 'VERSION' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid submodule path' }
+ end
+ end
+
+ context 'does not exist' do
+ let(:submodule) { 'non-existent-submodule' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid submodule path' }
+ end
+ end
+
+ context 'has traversal path' do
+ let(:submodule) { '../six' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+ end
+
+ context 'commit_sha' do
+ context 'is empty' do
+ let(:commit_sha) { '' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+
+ context 'is not present' do
+ let(:commit_sha) { nil }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+
+ context 'is invalid' do
+ let(:commit_sha) { '1' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'Invalid parameters' }
+ end
+ end
+
+ context 'is the same as the current ref' do
+ let(:commit_sha) { current_sha }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { "The submodule #{submodule} is already at #{commit_sha}" }
+ end
+ end
+ end
+
+ context 'branch_name' do
+ context 'is empty' do
+ let(:branch_name) { '' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'You can only create or edit files when you are on a branch' }
+ end
+ end
+
+ context 'is not present' do
+ let(:branch_name) { nil }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'You can only create or edit files when you are on a branch' }
+ end
+ end
+
+ context 'does not exist' do
+ let(:branch_name) { 'non/existent-branch' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'You can only create or edit files when you are on a branch' }
+ end
+ end
+
+ context 'when commit message is empty' do
+ let(:commit_message) { '' }
+
+ it 'a default commit message is set' do
+ message = "Update submodule #{submodule} with oid #{commit_sha}"
+
+ expect(repository).to receive(:update_submodule).with(any_args, hash_including(message: message))
+
+ subject.execute
+ end
+ end
+ end
+ end
+
+ context 'when there is an unexpected error' do
+ before do
+ allow(repository).to receive(:update_submodule).and_raise(StandardError, 'error message')
+ end
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'error message' }
+ end
+ end
+
+ it 'updates the submodule reference' do
+ result = subject.execute
+
+ expect(result[:status]).to eq :success
+ expect(result[:result]).to eq repository.head_commit.id
+ expect(repository.blob_at('HEAD', submodule).id).to eq commit_sha
+ end
+
+ context 'when submodule is inside a directory' do
+ let(:submodule) { 'test_inside_folder/another_folder/six' }
+ let(:branch_name) { 'submodule_inside_folder' }
+
+ it 'updates the submodule reference' do
+ expect(repository.blob_at(branch_name, submodule).id).not_to eq commit_sha
+
+ subject.execute
+
+ expect(repository.blob_at(branch_name, submodule).id).to eq commit_sha
+ end
+ end
+
+ context 'when repository is empty' do
+ let(:project) { create(:project, :empty_repo) }
+ let(:branch_name) { 'master' }
+
+ it_behaves_like 'returns error result' do
+ let(:error_message) { 'The repository is empty' }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb
index e0335880e8e..81b2c17fdb5 100644
--- a/spec/services/system_hooks_service_spec.rb
+++ b/spec/services/system_hooks_service_spec.rb
@@ -32,7 +32,7 @@ describe SystemHooksService do
end
it do
- project.old_path_with_namespace = 'transfered_from_path'
+ project.old_path_with_namespace = 'transferred_from_path'
expect(event_data(project, :transfer)).to include(
:event_name, :name, :created_at, :updated_at, :path, :project_id,
:owner_name, :owner_email, :project_visibility,
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 442de61f69b..0fbfcb34e50 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -197,45 +197,6 @@ describe SystemNoteService do
end
end
- describe '.change_label' do
- subject { described_class.change_label(noteable, project, author, added, removed) }
-
- let(:labels) { create_list(:label, 2, project: project) }
- let(:added) { [] }
- let(:removed) { [] }
-
- it_behaves_like 'a system note' do
- let(:action) { 'label' }
- end
-
- context 'with added labels' do
- let(:added) { labels }
- let(:removed) { [] }
-
- it 'sets the note text' do
- expect(subject.note).to eq "added ~#{labels[0].id} ~#{labels[1].id} labels"
- end
- end
-
- context 'with removed labels' do
- let(:added) { [] }
- let(:removed) { labels }
-
- it 'sets the note text' do
- expect(subject.note).to eq "removed ~#{labels[0].id} ~#{labels[1].id} labels"
- end
- end
-
- context 'with added and removed labels' do
- let(:added) { [labels[0]] }
- let(:removed) { [labels[1]] }
-
- it 'sets the note text' do
- expect(subject.note).to eq "added ~#{labels[0].id} and removed ~#{labels[1].id} labels"
- end
- end
- end
-
describe '.change_milestone' do
context 'for a project milestone' do
subject { described_class.change_milestone(noteable, project, author, milestone) }
@@ -288,6 +249,30 @@ describe SystemNoteService do
end
end
+ describe '.change_due_date' do
+ subject { described_class.change_due_date(noteable, project, author, due_date) }
+
+ let(:due_date) { Date.today }
+
+ it_behaves_like 'a system note' do
+ let(:action) { 'due_date' }
+ end
+
+ context 'when due date added' do
+ it 'sets the note text' do
+ expect(subject.note).to eq "changed due date to #{Date.today.to_s(:long)}"
+ end
+ end
+
+ context 'when due date removed' do
+ let(:due_date) { nil }
+
+ it 'sets the note text' do
+ expect(subject.note).to eq 'removed due date'
+ end
+ end
+ end
+
describe '.change_status' do
subject { described_class.change_status(noteable, project, author, status, source) }
@@ -339,7 +324,7 @@ describe SystemNoteService do
end
it "posts the 'merge when pipeline succeeds' system note" do
- expect(subject.note).to eq "canceled the automatic merge"
+ expect(subject.note).to eq "canceled the automatic merge"
end
end
@@ -447,6 +432,20 @@ describe SystemNoteService do
end
end
+ describe '.new_merge_request' do
+ subject { described_class.new_merge_request(noteable, project, author, merge_request) }
+
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
+
+ it_behaves_like 'a system note' do
+ let(:action) { 'merge' }
+ end
+
+ it 'sets the new merge request note text' do
+ expect(subject.note).to eq("created merge request #{merge_request.to_reference} to address this issue")
+ end
+ end
+
describe '.cross_reference' do
subject { described_class.cross_reference(noteable, mentioner, author) }
@@ -725,7 +724,7 @@ describe SystemNoteService do
let(:jira_tracker) { project.jira_service }
let(:commit) { project.commit }
let(:comment_url) { jira_api_comment_url(jira_issue.id) }
- let(:success_message) { "JiraService SUCCESS: Successfully posted to http://jira.example.net." }
+ let(:success_message) { "SUCCESS: Successfully posted to http://jira.example.net." }
before do
stub_jira_urls(jira_issue.id)
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index 9a51c873b30..c52515aefd8 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -10,7 +10,7 @@ describe TodoService do
let(:john_doe) { create(:user) }
let(:skipped) { create(:user) }
let(:skip_users) { [skipped] }
- let(:project) { create(:project) }
+ let(:project) { create(:project, :repository) }
let(:mentions) { 'FYI: ' + [author, assignee, john_doe, member, guest, non_member, admin, skipped].map(&:to_reference).join(' ') }
let(:directly_addressed) { [author, assignee, john_doe, member, guest, non_member, admin, skipped].map(&:to_reference).join(' ') }
let(:directly_addressed_and_mentioned) { member.to_reference + ", what do you think? cc: " + [guest, admin, skipped].map(&:to_reference).join(' ') }
@@ -280,7 +280,7 @@ describe TodoService do
end
it 'does not create a todo if unassigned' do
- issue.assignees.destroy_all
+ issue.assignees.destroy_all # rubocop: disable DestroyAll
should_not_create_any_todo { service.reassigned_issue(issue, author) }
end
diff --git a/spec/services/update_deployment_service_spec.rb b/spec/services/update_deployment_service_spec.rb
new file mode 100644
index 00000000000..3c55dd9659a
--- /dev/null
+++ b/spec/services/update_deployment_service_spec.rb
@@ -0,0 +1,217 @@
+require 'spec_helper'
+
+describe UpdateDeploymentService do
+ let(:user) { create(:user) }
+ let(:options) { { name: 'production' } }
+
+ let(:job) do
+ create(:ci_build,
+ ref: 'master',
+ tag: false,
+ environment: 'production',
+ options: { environment: options },
+ project: project)
+ end
+
+ let(:project) { create(:project, :repository) }
+ let(:environment) { deployment.environment }
+ let(:deployment) { job.deployment }
+ let(:service) { described_class.new(deployment) }
+
+ before do
+ job.success! # Create/Succeed deployment
+ end
+
+ describe '#execute' do
+ subject { service.execute }
+
+ let(:store) { Gitlab::EtagCaching::Store.new }
+
+ it 'invalidates the environment etag cache' do
+ old_value = store.get(environment.etag_cache_key)
+
+ subject
+
+ expect(store.get(environment.etag_cache_key)).not_to eq(old_value)
+ end
+
+ it 'creates ref' do
+ expect_any_instance_of(Repository)
+ .to receive(:create_ref)
+ .with(deployment.ref, deployment.send(:ref_path))
+
+ subject
+ end
+
+ it 'updates merge request metrics' do
+ expect_any_instance_of(Deployment)
+ .to receive(:update_merge_request_metrics!)
+
+ subject
+ end
+
+ context 'when start action is defined' do
+ let(:options) { { name: 'production', action: 'start' } }
+
+ context 'and environment is stopped' do
+ before do
+ environment.stop
+ end
+
+ it 'makes environment available' do
+ subject
+
+ expect(environment.reload).to be_available
+ end
+ end
+ end
+
+ context 'when variables are used' do
+ let(:options) do
+ { name: 'review-apps/$CI_COMMIT_REF_NAME',
+ url: 'http://$CI_COMMIT_REF_NAME.review-apps.gitlab.com' }
+ end
+
+ before do
+ environment.update(name: 'review-apps/master')
+ job.update(environment: 'review-apps/$CI_COMMIT_REF_NAME')
+ end
+
+ it 'does not create a new environment' do
+ expect { subject }.not_to change { Environment.count }
+ end
+
+ it 'updates external url' do
+ subject
+
+ expect(subject.environment.name).to eq('review-apps/master')
+ expect(subject.environment.external_url).to eq('http://master.review-apps.gitlab.com')
+ end
+ end
+ end
+
+ describe '#expanded_environment_url' do
+ subject { service.send(:expanded_environment_url) }
+
+ context 'when yaml environment uses $CI_COMMIT_REF_NAME' do
+ let(:job) do
+ create(:ci_build,
+ ref: 'master',
+ environment: 'production',
+ project: project,
+ options: { environment: { name: 'production', url: 'http://review/$CI_COMMIT_REF_NAME' } })
+ end
+
+ it { is_expected.to eq('http://review/master') }
+ end
+
+ context 'when yaml environment uses $CI_ENVIRONMENT_SLUG' do
+ let(:job) do
+ create(:ci_build,
+ ref: 'master',
+ environment: 'prod-slug',
+ project: project,
+ options: { environment: { name: 'prod-slug', url: 'http://review/$CI_ENVIRONMENT_SLUG' } })
+ end
+
+ it { is_expected.to eq('http://review/prod-slug') }
+ end
+
+ context 'when yaml environment uses yaml_variables containing symbol keys' do
+ let(:job) do
+ create(:ci_build,
+ yaml_variables: [{ key: :APP_HOST, value: 'host' }],
+ environment: 'production',
+ project: project,
+ options: { environment: { name: 'production', url: 'http://review/$APP_HOST' } })
+ end
+
+ it { is_expected.to eq('http://review/host') }
+ end
+
+ context 'when yaml environment does not have url' do
+ let(:job) { create(:ci_build, environment: 'staging', project: project) }
+
+ it 'returns the external_url from persisted environment' do
+ is_expected.to be_nil
+ end
+ end
+ end
+
+ describe "merge request metrics" do
+ let(:merge_request) { create(:merge_request, target_branch: 'master', source_branch: 'feature', source_project: project) }
+
+ context "while updating the 'first_deployed_to_production_at' time" do
+ before do
+ merge_request.metrics.update!(merged_at: 1.hour.ago)
+ end
+
+ context "for merge requests merged before the current deploy" do
+ it "sets the time if the deploy's environment is 'production'" do
+ service.execute
+
+ expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(deployment.finished_at)
+ end
+
+ context 'when job deploys to staging' do
+ let(:job) do
+ create(:ci_build,
+ ref: 'master',
+ tag: false,
+ environment: 'staging',
+ options: { environment: { name: 'staging' } },
+ project: project)
+ end
+
+ it "doesn't set the time if the deploy's environment is not 'production'" do
+ service.execute
+
+ expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_nil
+ end
+ end
+
+ it 'does not raise errors if the merge request does not have a metrics record' do
+ merge_request.metrics.destroy
+
+ expect(merge_request.reload.metrics).to be_nil
+ expect { service.execute }.not_to raise_error
+ end
+ end
+
+ context "for merge requests merged before the previous deploy" do
+ context "if the 'first_deployed_to_production_at' time is already set" do
+ it "does not overwrite the older 'first_deployed_to_production_at' time" do
+ # Previous deploy
+ service.execute
+
+ expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(deployment.finished_at)
+
+ # Current deploy
+ Timecop.travel(12.hours.from_now) do
+ service.execute
+
+ expect(merge_request.reload.metrics.first_deployed_to_production_at).to be_like_time(deployment.finished_at)
+ end
+ end
+ end
+
+ context "if the 'first_deployed_to_production_at' time is not already set" do
+ it "does not overwrite the older 'first_deployed_to_production_at' time" do
+ # Previous deploy
+ time = 5.minutes.from_now
+ Timecop.freeze(time) { service.execute }
+
+ expect(merge_request.reload.metrics.merged_at).to be < merge_request.reload.metrics.first_deployed_to_production_at
+
+ previous_time = merge_request.reload.metrics.first_deployed_to_production_at
+
+ # Current deploy
+ Timecop.freeze(time + 12.hours) { service.execute }
+
+ expect(merge_request.reload.metrics.first_deployed_to_production_at).to eq(previous_time)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/users/build_service_spec.rb b/spec/services/users/build_service_spec.rb
index 677d4a622e1..b7b9817efdb 100644
--- a/spec/services/users/build_service_spec.rb
+++ b/spec/services/users/build_service_spec.rb
@@ -8,11 +8,107 @@ describe Users::BuildService do
context 'with an admin user' do
let(:admin_user) { create(:admin) }
- let(:service) { described_class.new(admin_user, params) }
+ let(:service) { described_class.new(admin_user, ActionController::Parameters.new(params).permit!) }
it 'returns a valid user' do
expect(service.execute).to be_valid
end
+
+ context 'allowed params' do
+ let(:params) do
+ {
+ access_level: 1,
+ admin: 1,
+ avatar: anything,
+ bio: 1,
+ can_create_group: 1,
+ color_scheme_id: 1,
+ email: 1,
+ external: 1,
+ force_random_password: 1,
+ hide_no_password: 1,
+ hide_no_ssh_key: 1,
+ linkedin: 1,
+ name: 1,
+ password: 1,
+ password_automatically_set: 1,
+ password_expires_at: 1,
+ projects_limit: 1,
+ remember_me: 1,
+ skip_confirmation: 1,
+ skype: 1,
+ theme_id: 1,
+ twitter: 1,
+ username: 1,
+ website_url: 1,
+ private_profile: 1,
+ organization: 1,
+ location: 1,
+ public_email: 1
+ }
+ end
+
+ it 'sets all allowed attributes' do
+ admin_user # call first so the admin gets created before setting `expect`
+
+ expect(User).to receive(:new).with(hash_including(params)).and_call_original
+
+ service.execute
+ end
+ end
+
+ context 'with "user_default_external" application setting' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:user_default_external, :external, :email, :user_default_internal_regex, :result) do
+ true | nil | 'fl@example.com' | nil | true
+ true | true | 'fl@example.com' | nil | true
+ true | false | 'fl@example.com' | nil | false
+
+ true | nil | 'fl@example.com' | '' | true
+ true | true | 'fl@example.com' | '' | true
+ true | false | 'fl@example.com' | '' | false
+
+ true | nil | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ true | true | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ true | false | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+
+ true | nil | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ true | true | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ true | false | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+
+ false | nil | 'fl@example.com' | nil | false
+ false | true | 'fl@example.com' | nil | true
+ false | false | 'fl@example.com' | nil | false
+
+ false | nil | 'fl@example.com' | '' | false
+ false | true | 'fl@example.com' | '' | true
+ false | false | 'fl@example.com' | '' | false
+
+ false | nil | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | true | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ false | false | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+
+ false | nil | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | true | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ false | false | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ end
+
+ with_them do
+ before do
+ stub_application_setting(user_default_external: user_default_external)
+ stub_application_setting(user_default_internal_regex: user_default_internal_regex)
+
+ params.merge!({ external: external, email: email }.compact)
+ end
+
+ subject(:user) { service.execute }
+
+ it 'correctly sets user.external' do
+ expect(user.external).to eq(result)
+ end
+ end
+ end
end
context 'with non admin user' do
@@ -50,6 +146,59 @@ describe Users::BuildService do
expect(service.execute).to be_confirmed
end
end
+
+ context 'with "user_default_external" application setting' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:user_default_external, :external, :email, :user_default_internal_regex, :result) do
+ true | nil | 'fl@example.com' | nil | true
+ true | true | 'fl@example.com' | nil | true
+ true | false | 'fl@example.com' | nil | true
+
+ true | nil | 'fl@example.com' | '' | true
+ true | true | 'fl@example.com' | '' | true
+ true | false | 'fl@example.com' | '' | true
+
+ true | nil | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ true | true | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ true | false | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+
+ true | nil | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ true | true | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+ true | false | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | true
+
+ false | nil | 'fl@example.com' | nil | false
+ false | true | 'fl@example.com' | nil | false
+ false | false | 'fl@example.com' | nil | false
+
+ false | nil | 'fl@example.com' | '' | false
+ false | true | 'fl@example.com' | '' | false
+ false | false | 'fl@example.com' | '' | false
+
+ false | nil | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | true | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | false | 'fl@example.com' | '^(?:(?!\.ext@).)*$\r?' | false
+
+ false | nil | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | true | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ false | false | 'tester.ext@domain.com' | '^(?:(?!\.ext@).)*$\r?' | false
+ end
+
+ with_them do
+ before do
+ stub_application_setting(user_default_external: user_default_external)
+ stub_application_setting(user_default_internal_regex: user_default_internal_regex)
+
+ params.merge!({ external: external, email: email }.compact)
+ end
+
+ subject(:user) { service.execute }
+
+ it 'sets the value of Gitlab::CurrentSettings.user_default_external' do
+ expect(user.external).to eq(result)
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/users/destroy_service_spec.rb b/spec/services/users/destroy_service_spec.rb
index 3bae8bfbd42..83f1495a1c6 100644
--- a/spec/services/users/destroy_service_spec.rb
+++ b/spec/services/users/destroy_service_spec.rb
@@ -20,7 +20,7 @@ describe Users::DestroyService do
it 'will delete the project' do
expect_next_instance_of(Projects::DestroyService) do |destroy_service|
- expect(destroy_service).to receive(:execute).once
+ expect(destroy_service).to receive(:execute).once.and_return(true)
end
service.execute(user)
@@ -35,7 +35,7 @@ describe Users::DestroyService do
it 'destroys a project in pending_delete' do
expect_next_instance_of(Projects::DestroyService) do |destroy_service|
- expect(destroy_service).to receive(:execute).once
+ expect(destroy_service).to receive(:execute).once.and_return(true)
end
service.execute(user)
@@ -172,23 +172,36 @@ describe Users::DestroyService do
end
describe "user personal's repository removal" do
- before do
- perform_enqueued_jobs { service.execute(user) }
- end
+ context 'storages' do
+ before do
+ perform_enqueued_jobs { service.execute(user) }
+ end
+
+ context 'legacy storage' do
+ let!(:project) { create(:project, :empty_repo, :legacy_storage, namespace: user.namespace) }
+
+ it 'removes repository' do
+ expect(gitlab_shell.exists?(project.repository_storage, "#{project.disk_path}.git")).to be_falsey
+ end
+ end
- context 'legacy storage' do
- let!(:project) { create(:project, :empty_repo, :legacy_storage, namespace: user.namespace) }
+ context 'hashed storage' do
+ let!(:project) { create(:project, :empty_repo, namespace: user.namespace) }
- it 'removes repository' do
- expect(gitlab_shell.exists?(project.repository_storage, "#{project.disk_path}.git")).to be_falsey
+ it 'removes repository' do
+ expect(gitlab_shell.exists?(project.repository_storage, "#{project.disk_path}.git")).to be_falsey
+ end
end
end
- context 'hashed storage' do
- let!(:project) { create(:project, :empty_repo, namespace: user.namespace) }
+ context 'repository removal status is taken into account' do
+ it 'raises exception' do
+ expect_next_instance_of(::Projects::DestroyService) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(false)
+ end
- it 'removes repository' do
- expect(gitlab_shell.exists?(project.repository_storage, "#{project.disk_path}.git")).to be_falsey
+ expect { service.execute(user) }
+ .to raise_error(Users::DestroyService::DestroyError, "Project #{project.id} can't be deleted" )
end
end
end
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index 622e56e1da5..b1cc6d2eb83 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -97,7 +97,7 @@ describe WebHookService do
end
it 'handles exceptions' do
- exceptions = [SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::OpenTimeout, Net::ReadTimeout, Gitlab::HTTP::BlockedUrlError]
+ exceptions = [SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::OpenTimeout, Net::ReadTimeout, Gitlab::HTTP::BlockedUrlError, Gitlab::HTTP::RedirectionTooDeep]
exceptions.each do |exception_class|
exception = exception_class.new('Exception message')
diff --git a/spec/services/wikis/create_attachment_service_spec.rb b/spec/services/wikis/create_attachment_service_spec.rb
new file mode 100644
index 00000000000..f5899f292c8
--- /dev/null
+++ b/spec/services/wikis/create_attachment_service_spec.rb
@@ -0,0 +1,224 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe Wikis::CreateAttachmentService do
+ let(:project) { create(:project, :wiki_repo) }
+ let(:user) { create(:user) }
+ let(:file_name) { 'filename.txt' }
+ let(:file_path_regex) { %r{#{described_class::ATTACHMENT_PATH}/\h{32}/#{file_name}} }
+
+ let(:file_opts) do
+ {
+ file_name: file_name,
+ file_content: 'Content of attachment'
+ }
+ end
+ let(:opts) { file_opts }
+
+ subject(:service) { described_class.new(project, user, opts) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ describe 'initialization' do
+ context 'author commit info' do
+ it 'does not raise error if user is nil' do
+ service = described_class.new(project, nil, opts)
+
+ expect(service.instance_variable_get(:@author_email)).to be_nil
+ expect(service.instance_variable_get(:@author_name)).to be_nil
+ end
+
+ it 'fills file_path from the repository uploads folder' do
+ expect(service.instance_variable_get(:@file_path)).to match(file_path_regex)
+ end
+
+ context 'when no author info provided' do
+ it 'fills author_email and author_name from current_user info' do
+ expect(service.instance_variable_get(:@author_email)).to eq user.email
+ expect(service.instance_variable_get(:@author_name)).to eq user.name
+ end
+ end
+
+ context 'when author info provided' do
+ let(:author_email) { 'author_email' }
+ let(:author_name) { 'author_name' }
+ let(:opts) { file_opts.merge(author_email: author_email, author_name: author_name) }
+
+ it 'fills author_email and author_name from params' do
+ expect(service.instance_variable_get(:@author_email)).to eq author_email
+ expect(service.instance_variable_get(:@author_name)).to eq author_name
+ end
+ end
+ end
+
+ context 'commit message' do
+ context 'when no commit message provided' do
+ it 'sets a default commit message' do
+ expect(service.instance_variable_get(:@commit_message)).to eq "Upload attachment #{opts[:file_name]}"
+ end
+ end
+
+ context 'when commit message provided' do
+ let(:commit_message) { 'whatever' }
+ let(:opts) { file_opts.merge(commit_message: commit_message) }
+
+ it 'use the commit message from params' do
+ expect(service.instance_variable_get(:@commit_message)).to eq commit_message
+ end
+ end
+ end
+
+ context 'branch name' do
+ context 'when no branch provided' do
+ it 'sets the branch from the wiki default_branch' do
+ expect(service.instance_variable_get(:@branch_name)).to eq project.wiki.default_branch
+ end
+ end
+
+ context 'when branch provided' do
+ let(:branch_name) { 'whatever' }
+ let(:opts) { file_opts.merge(branch_name: branch_name) }
+
+ it 'use the commit message from params' do
+ expect(service.instance_variable_get(:@branch_name)).to eq branch_name
+ end
+ end
+ end
+ end
+
+ describe '#parse_file_name' do
+ context 'when file_name' do
+ context 'has white spaces' do
+ let(:file_name) { 'file with spaces' }
+
+ it "replaces all of them with '_'" do
+ result = service.execute
+
+ expect(result[:status]).to eq :success
+ expect(result[:result][:file_name]).to eq 'file_with_spaces'
+ end
+ end
+
+ context 'has other invalid characters' do
+ let(:file_name) { "file\twith\tinvalid chars" }
+
+ it "replaces all of them with '_'" do
+ result = service.execute
+
+ expect(result[:status]).to eq :success
+ expect(result[:result][:file_name]).to eq 'file_with_invalid_chars'
+ end
+ end
+
+ context 'is not present' do
+ let(:file_name) { nil }
+
+ it 'returns error' do
+ result = service.execute
+
+ expect(result[:status]).to eq :error
+ expect(result[:message]).to eq 'The file name cannot be empty'
+ end
+ end
+
+ context 'length' do
+ context 'is bigger than 255' do
+ let(:file_name) { "#{'0' * 256}.jpg" }
+
+ it 'truncates file name' do
+ result = service.execute
+
+ expect(result[:status]).to eq :success
+ expect(result[:result][:file_name].length).to eq 255
+ expect(result[:result][:file_name]).to match(/0{251}\.jpg/)
+ end
+ end
+
+ context 'is less or equal to 255 does not return error' do
+ let(:file_name) { '0' * 255 }
+
+ it 'does not return error' do
+ result = service.execute
+
+ expect(result[:status]).to eq :success
+ end
+ end
+ end
+ end
+
+ context 'when user' do
+ shared_examples 'wiki attachment user validations' do
+ it 'returns error' do
+ result = described_class.new(project, user2, opts).execute
+
+ expect(result[:status]).to eq :error
+ expect(result[:message]).to eq 'You are not allowed to push to the wiki'
+ end
+ end
+
+ context 'does not have permission' do
+ let(:user2) { create(:user) }
+
+ it_behaves_like 'wiki attachment user validations'
+ end
+
+ context 'is nil' do
+ let(:user2) { nil }
+
+ it_behaves_like 'wiki attachment user validations'
+ end
+ end
+ end
+
+ describe '#execute' do
+ let(:wiki) { project.wiki }
+ subject(:service_execute) { service.execute[:result] }
+
+ context 'creates branch if it does not exists' do
+ let(:branch_name) { 'new_branch' }
+ let(:opts) { file_opts.merge(branch_name: branch_name) }
+
+ it do
+ expect(wiki.repository.branches).to be_empty
+ expect { service.execute }.to change { wiki.repository.branches.count }.by(1)
+ expect(wiki.repository.branches.first.name).to eq branch_name
+ end
+ end
+
+ it 'adds file to the repository' do
+ expect(wiki.repository.ls_files('HEAD')).to be_empty
+
+ service.execute
+
+ files = wiki.repository.ls_files('HEAD')
+ expect(files.count).to eq 1
+ expect(files.first).to match(file_path_regex)
+ end
+
+ context 'returns' do
+ before do
+ allow(SecureRandom).to receive(:hex).and_return('fixed_hex')
+
+ service_execute
+ end
+
+ it 'returns the file name' do
+ expect(service_execute[:file_name]).to eq file_name
+ end
+
+ it 'returns the path where file was stored' do
+ expect(service_execute[:file_path]).to eq 'uploads/fixed_hex/filename.txt'
+ end
+
+ it 'returns the branch where the file was pushed' do
+ expect(service_execute[:branch]).to eq wiki.default_branch
+ end
+
+ it 'returns the commit id' do
+ expect(service_execute[:commit]).not_to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index bd564cc60a6..3fedb9ed48c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -29,10 +29,16 @@ end
# require rainbow gem String monkeypatch, so we can test SystemChecks
require 'rainbow/ext/string'
+Rainbow.enabled = false
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
# Requires helpers, and shared contexts/examples first since they're used in other support files
+
+# Load these first since they may be required by other helpers
+require Rails.root.join("spec/support/helpers/git_helpers.rb")
+
+# Then the rest
Dir[Rails.root.join("spec/support/helpers/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/support/shared_contexts/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/support/shared_examples/*.rb")].each { |f| require f }
@@ -41,6 +47,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.use_instantiated_fixtures = false
+ config.fixture_path = Rails.root
config.verbose_retry = true
config.display_try_failure_messages = true
@@ -111,6 +118,13 @@ RSpec.configure do |config|
config.before(:example) do
# Enable all features by default for testing
allow(Feature).to receive(:enabled?) { true }
+
+ # The following can be removed when we remove the staged rollout strategy
+ # and we can just enable it using instance wide settings
+ # (ie. ApplicationSetting#auto_devops_enabled)
+ allow(Feature).to receive(:enabled?)
+ .with(:force_autodevops_on_by_default, anything)
+ .and_return(false)
end
config.before(:example, :request_store) do
@@ -126,6 +140,10 @@ RSpec.configure do |config|
Fog.unmock! if Fog.mock?
end
+ config.after(:example) do
+ Gitlab::CurrentSettings.clear_in_memory_application_settings!
+ end
+
config.before(:example, :mailer) do
reset_delivered_emails!
end
@@ -217,6 +235,10 @@ RSpec.configure do |config|
example.run if Gitlab::Database.mysql?
end
+ config.around(:each, :rails5) do |example|
+ example.run if Gitlab.rails5?
+ end
+
# This makes sure the `ApplicationController#can?` method is stubbed with the
# original implementation for all view specs.
config.before(:each, type: :view) do
diff --git a/spec/support/api/milestones_shared_examples.rb b/spec/support/api/milestones_shared_examples.rb
index a15189db35f..3bebb7aae90 100644
--- a/spec/support/api/milestones_shared_examples.rb
+++ b/spec/support/api/milestones_shared_examples.rb
@@ -102,14 +102,6 @@ shared_examples_for 'group and project milestones' do |route_definition|
expect(json_response['iid']).to eq(milestone.iid)
end
- it 'returns a milestone by id' do
- get api(resource_route, user)
-
- expect(response).to have_gitlab_http_status(200)
- expect(json_response['title']).to eq(milestone.title)
- expect(json_response['iid']).to eq(milestone.iid)
- end
-
it 'returns 401 error if user not authenticated' do
get api(resource_route)
@@ -204,6 +196,24 @@ shared_examples_for 'group and project milestones' do |route_definition|
end
end
+ describe "DELETE #{route_definition}/:milestone_id" do
+ it "rejects a member with reporter access from deleting a milestone" do
+ reporter = create(:user)
+ milestone.parent.add_reporter(reporter)
+
+ delete api(resource_route, reporter)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+
+ it 'deletes the milestone when the user has developer access to the project' do
+ delete api(resource_route, user)
+
+ expect(project.milestones.find_by_id(milestone.id)).to be_nil
+ expect(response).to have_gitlab_http_status(204)
+ end
+ end
+
describe "GET #{route_definition}/:milestone_id/issues" do
let(:issues_route) { "#{route}/#{milestone.id}/issues" }
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index c0ceb0f6605..18a7a392c12 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -100,7 +100,7 @@ RSpec.configure do |config|
# capybara/rspec already calls Capybara.reset_sessions! in an `after` hook,
# but `block_and_wait_for_requests_complete` is called before it so by
- # calling it explicitely here, we prevent any new requests from being fired
+ # calling it explicitly here, we prevent any new requests from being fired
# See https://github.com/teamcapybara/capybara/blob/ffb41cfad620de1961bb49b1562a9fa9b28c0903/lib/capybara/rspec.rb#L20-L25
# We don't reset the session when the example failed, because we need capybara-screenshot to have access to it.
Capybara.reset_sessions! unless example.exception
diff --git a/spec/support/controllers/githubish_import_controller_shared_examples.rb b/spec/support/controllers/githubish_import_controller_shared_examples.rb
index 1c1b68c12a2..140490f2dc2 100644
--- a/spec/support/controllers/githubish_import_controller_shared_examples.rb
+++ b/spec/support/controllers/githubish_import_controller_shared_examples.rb
@@ -22,6 +22,18 @@ shared_examples 'a GitHub-ish import controller: POST personal_access_token' do
expect(session[:"#{provider}_access_token"]).to eq(token)
expect(controller).to redirect_to(status_import_url)
end
+
+ it "strips access token with spaces" do
+ token = 'asdfasdf9876'
+
+ allow_any_instance_of(Gitlab::LegacyGithubImport::Client)
+ .to receive(:user).and_return(true)
+
+ post :personal_access_token, personal_access_token: " #{token} "
+
+ expect(session[:"#{provider}_access_token"]).to eq(token)
+ expect(controller).to redirect_to(status_import_url)
+ end
end
shared_examples 'a GitHub-ish import controller: GET new' do
diff --git a/spec/support/features/discussion_comments_shared_example.rb b/spec/support/features/discussion_comments_shared_example.rb
index 80604395adf..18cf08f0b9e 100644
--- a/spec/support/features/discussion_comments_shared_example.rb
+++ b/spec/support/features/discussion_comments_shared_example.rb
@@ -150,17 +150,25 @@ shared_examples 'discussion comments' do |resource_name|
end
if resource_name == 'merge request'
- let(:note_id) { find("#{comments_selector} .note", match: :first)['data-note-id'] }
+ let(:note_id) { find("#{comments_selector} .note:first-child", match: :first)['data-note-id'] }
+ let(:reply_id) { find("#{comments_selector} .note:last-child", match: :first)['data-note-id'] }
it 'shows resolved discussion when toggled' do
+ find("#{comments_selector} .js-vue-discussion-reply").click
+ find("#{comments_selector} .note-textarea").send_keys('a')
+
+ click_button "Comment"
+ wait_for_requests
+
click_button "Resolve discussion"
+ wait_for_requests
expect(page).to have_selector(".note-row-#{note_id}", visible: true)
refresh
- click_button "Toggle discussion"
+ click_button "1 reply"
- expect(page).to have_selector(".note-row-#{note_id}", visible: true)
+ expect(page).to have_selector(".note-row-#{reply_id}", visible: true)
end
end
end
diff --git a/spec/support/features/issuable_slash_commands_shared_examples.rb b/spec/support/features/issuable_quick_actions_shared_examples.rb
index 9b44c532ff6..2a883ce1074 100644
--- a/spec/support/features/issuable_slash_commands_shared_examples.rb
+++ b/spec/support/features/issuable_quick_actions_shared_examples.rb
@@ -55,7 +55,7 @@ shared_examples 'issuable record that supports quick actions in its description
describe "note on #{issuable_type}", :js do
before do
- visit public_send("namespace_project_#{issuable_type}_path", project.namespace, project, issuable)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
end
context 'with a note containing commands' do
@@ -77,6 +77,15 @@ shared_examples 'issuable record that supports quick actions in its description
expect(issuable.labels).to eq [label_bug]
expect(issuable.milestone).to eq milestone
end
+
+ it 'removes the quick action from note and explains it in the preview' do
+ preview_note("Awesome!\n\n/close")
+
+ expect(page).to have_content 'Awesome!'
+ expect(page).not_to have_content '/close'
+ issuable_name = issuable.is_a?(Issue) ? 'issue' : 'merge request'
+ expect(page).to have_content "Closes this #{issuable_name}."
+ end
end
context 'with a note containing only commands' do
@@ -121,7 +130,7 @@ shared_examples 'issuable record that supports quick actions in its description
gitlab_sign_out
gitlab_sign_in(guest)
- visit public_send("namespace_project_#{issuable_type}_path", project.namespace, project, issuable)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
end
it "does not close the #{issuable_type}" do
@@ -158,7 +167,7 @@ shared_examples 'issuable record that supports quick actions in its description
gitlab_sign_out
gitlab_sign_in(guest)
- visit public_send("namespace_project_#{issuable_type}_path", project.namespace, project, issuable)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
end
it "does not reopen the #{issuable_type}" do
@@ -190,7 +199,7 @@ shared_examples 'issuable record that supports quick actions in its description
gitlab_sign_out
gitlab_sign_in(guest)
- visit public_send("namespace_project_#{issuable_type}_path", project.namespace, project, issuable)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
end
it "does not change the #{issuable_type} title" do
@@ -285,13 +294,87 @@ shared_examples 'issuable record that supports quick actions in its description
expect(issuable.reload.assignees).to eq [maintainer]
end
end
+
+ context "with a note locking the #{issuable_type} discussion" do
+ before do
+ issuable.update(discussion_locked: false)
+ expect(issuable).not_to be_discussion_locked
+ end
+
+ context "when current user can lock #{issuable_type} discussion" do
+ it "locks the #{issuable_type} discussion" do
+ add_note("/lock")
+
+ expect(page).not_to have_content '/lock'
+ expect(page).to have_content 'Commands applied'
+
+ expect(issuable.reload).to be_discussion_locked
+ end
+ end
+
+ context "when current user cannot lock #{issuable_type}" do
+ before do
+ guest = create(:user)
+ project.add_guest(guest)
+
+ gitlab_sign_out
+ sign_in(guest)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
+ end
+
+ it "does not lock the #{issuable_type} discussion" do
+ add_note("/lock")
+
+ expect(page).not_to have_content 'Commands applied'
+
+ expect(issuable).not_to be_discussion_locked
+ end
+ end
+ end
+
+ context "with a note unlocking the #{issuable_type} discussion" do
+ before do
+ issuable.update(discussion_locked: true)
+ expect(issuable).to be_discussion_locked
+ end
+
+ context "when current user can unlock #{issuable_type} discussion" do
+ it "unlocks the #{issuable_type} discussion" do
+ add_note("/unlock")
+
+ expect(page).not_to have_content '/unlock'
+ expect(page).to have_content 'Commands applied'
+
+ expect(issuable.reload).not_to be_discussion_locked
+ end
+ end
+
+ context "when current user cannot unlock #{issuable_type}" do
+ before do
+ guest = create(:user)
+ project.add_guest(guest)
+
+ gitlab_sign_out
+ sign_in(guest)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
+ end
+
+ it "does not unlock the #{issuable_type} discussion" do
+ add_note("/unlock")
+
+ expect(page).not_to have_content 'Commands applied'
+
+ expect(issuable).to be_discussion_locked
+ end
+ end
+ end
end
describe "preview of note on #{issuable_type}", :js do
it 'removes quick actions from note and explains them' do
create(:user, username: 'bob')
- visit public_send("namespace_project_#{issuable_type}_path", project.namespace, project, issuable)
+ visit public_send("project_#{issuable_type}_path", project, issuable)
page.within('.js-main-target-form') do
fill_in 'note[note]', with: "Awesome!\n/assign @bob "
diff --git a/spec/support/features/reportable_note_shared_examples.rb b/spec/support/features/reportable_note_shared_examples.rb
index 89a5518239d..8cfce49da8a 100644
--- a/spec/support/features/reportable_note_shared_examples.rb
+++ b/spec/support/features/reportable_note_shared_examples.rb
@@ -20,7 +20,7 @@ shared_examples 'reportable note' do |type|
dropdown = comment.find(more_actions_selector)
open_dropdown(dropdown)
- expect(dropdown).to have_link('Report as abuse', href: abuse_report_path)
+ expect(dropdown).to have_link('Report abuse to GitLab', href: abuse_report_path)
if type == 'issue' || type == 'merge_request'
expect(dropdown).to have_button('Delete comment')
@@ -33,7 +33,7 @@ shared_examples 'reportable note' do |type|
dropdown = comment.find(more_actions_selector)
open_dropdown(dropdown)
- dropdown.click_link('Report as abuse')
+ dropdown.click_link('Report abuse to GitLab')
expect(find('#user_name')['value']).to match(note.author.username)
expect(find('#abuse_report_message')['value']).to match(noteable_note_url(note))
diff --git a/spec/support/features/variable_list_shared_examples.rb b/spec/support/features/variable_list_shared_examples.rb
index f7f851eb1eb..bce1fb01355 100644
--- a/spec/support/features/variable_list_shared_examples.rb
+++ b/spec/support/features/variable_list_shared_examples.rb
@@ -5,7 +5,7 @@ shared_examples 'variable list' do
end
end
- it 'adds new secret variable' do
+ it 'adds new CI variable' do
page.within('.js-ci-variable-list-section .js-row:last-child') do
find('.js-ci-variable-input-key').set('key')
find('.js-ci-variable-input-value').set('key value')
diff --git a/spec/support/helpers/ci_artifact_metadata_generator.rb b/spec/support/helpers/ci_artifact_metadata_generator.rb
new file mode 100644
index 00000000000..ef638d59d2d
--- /dev/null
+++ b/spec/support/helpers/ci_artifact_metadata_generator.rb
@@ -0,0 +1,48 @@
+# frozen_sting_literal: true
+
+# This generates fake CI metadata .gz for testing
+# Based off https://gitlab.com/gitlab-org/gitlab-workhorse/blob/master/internal/zipartifacts/metadata.go
+class CiArtifactMetadataGenerator
+ attr_accessor :entries, :output
+
+ ARTIFACT_METADATA = "GitLab Build Artifacts Metadata 0.0.2\n".freeze
+
+ def initialize(stream)
+ @entries = {}
+ @output = Zlib::GzipWriter.new(stream)
+ end
+
+ def add_entry(filename)
+ @entries[filename] = { CRC: rand(0xfffffff), Comment: FFaker::Lorem.sentence(10) }
+ end
+
+ def write
+ write_version
+ write_errors
+ write_entries
+ output.close
+ end
+
+ private
+
+ def write_version
+ write_string(ARTIFACT_METADATA)
+ end
+
+ def write_errors
+ write_string('{}')
+ end
+
+ def write_entries
+ entries.each do |filename, metadata|
+ write_string(filename)
+ write_string(metadata.to_json + "\n")
+ end
+ end
+
+ def write_string(data)
+ bytes = [data.length].pack('L>')
+ output.write(bytes)
+ output.write(data)
+ end
+end
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index c228bd2393b..ecefdc23811 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -1,4 +1,6 @@
module CycleAnalyticsHelpers
+ include GitHelpers
+
def create_commit_referencing_issue(issue, branch_name: generate(:branch))
project.repository.add_branch(user, branch_name, 'master')
create_commit("Commit for ##{issue.iid}", issue.project, user, branch_name)
@@ -9,7 +11,7 @@ module CycleAnalyticsHelpers
oldrev = repository.commit(branch_name)&.sha || Gitlab::Git::BLANK_SHA
if Timecop.frozen? && Gitlab::GitalyClient.feature_enabled?(:operation_user_commit_files)
- mock_gitaly_multi_action_dates(repository.raw, commit_time)
+ mock_gitaly_multi_action_dates(repository, commit_time)
end
commit_shas = Array.new(count) do |index|
@@ -65,7 +67,9 @@ module CycleAnalyticsHelpers
end
def merge_merge_requests_closing_issue(user, project, issue)
- merge_requests = issue.closed_by_merge_requests(user)
+ merge_requests = Issues::ReferencedMergeRequestsService
+ .new(project, user)
+ .closed_by_merge_requests(issue)
merge_requests.each { |merge_request| MergeRequests::MergeService.new(project, user).execute(merge_request) }
end
@@ -81,7 +85,7 @@ module CycleAnalyticsHelpers
raise ArgumentError
end
- CreateDeploymentService.new(dummy_job).execute
+ dummy_job.success! # State machine automatically update associated deployment/environment record
end
def dummy_production_job(user, project)
@@ -93,7 +97,7 @@ module CycleAnalyticsHelpers
end
def dummy_pipeline(project)
- Ci::Pipeline.new(
+ create(:ci_pipeline,
sha: project.repository.commit('master').sha,
ref: 'master',
source: :push,
@@ -102,9 +106,7 @@ module CycleAnalyticsHelpers
end
def new_dummy_job(user, project, environment)
- project.environments.find_or_create_by(name: environment)
-
- Ci::Build.new(
+ create(:ci_build,
project: project,
user: user,
environment: environment,
@@ -116,18 +118,15 @@ module CycleAnalyticsHelpers
protected: false)
end
- def mock_gitaly_multi_action_dates(raw_repository, commit_time)
- allow(raw_repository).to receive(:multi_action).and_wrap_original do |m, *args|
+ def mock_gitaly_multi_action_dates(repository, commit_time)
+ allow(repository.raw).to receive(:multi_action).and_wrap_original do |m, *args|
new_date = commit_time || Time.now
branch_update = m.call(*args)
if branch_update.newrev
_, opts = args
- commit = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- rugged = raw_repository.rugged
- rugged.rev_parse(branch_update.newrev)
- end
+ commit = rugged_repo(repository).rev_parse(branch_update.newrev)
branch_update.newrev = commit.amend(
update_ref: "#{Gitlab::Git::BRANCH_REF_PREFIX}#{opts[:branch_name]}",
diff --git a/spec/support/helpers/devise_helpers.rb b/spec/support/helpers/devise_helpers.rb
index 66874e10f38..d32bc2424c0 100644
--- a/spec/support/helpers/devise_helpers.rb
+++ b/spec/support/helpers/devise_helpers.rb
@@ -8,8 +8,15 @@ module DeviseHelpers
end
def env_from_context(context)
+ # When we modify env_config, that is on the global
+ # Rails.application, and we need to stub it and allow it to be
+ # modified in-place, without polluting later tests.
if context.respond_to?(:env_config)
- context.env_config
+ context.env_config.deep_dup.tap do |env|
+ allow(context).to receive(:env_config).and_return(env)
+ end
+ # When we modify env, then the context is a request, or something
+ # else that only lives for a single spec.
elsif context.respond_to?(:env)
context.env
end
diff --git a/spec/support/helpers/filter_item_select_helper.rb b/spec/support/helpers/filter_item_select_helper.rb
deleted file mode 100644
index 519e84d359e..00000000000
--- a/spec/support/helpers/filter_item_select_helper.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# Helper allows you to select value from filter-items
-#
-# Params
-# value - value for select
-# selector - css selector of item
-#
-# Usage:
-#
-# filter_item_select('Any Author', '.js-author-search')
-#
-module FilterItemSelectHelper
- def filter_item_select(value, selector)
- find(selector).click
- wait_for_requests
- page.within('.dropdown-content') do
- click_link value
- end
- end
-end
diff --git a/spec/support/helpers/filtered_search_helpers.rb b/spec/support/helpers/filtered_search_helpers.rb
index 5f42ff77fb2..6569feec39b 100644
--- a/spec/support/helpers/filtered_search_helpers.rb
+++ b/spec/support/helpers/filtered_search_helpers.rb
@@ -120,8 +120,12 @@ module FilteredSearchHelpers
create_token('Label', label_name, symbol)
end
- def emoji_token(emoji_name = nil)
- { name: 'My-Reaction', emoji_name: emoji_name }
+ def reaction_token(reaction_name = nil, is_emoji = true)
+ if is_emoji
+ { name: 'My-Reaction', emoji_name: reaction_name }
+ else
+ create_token('My-Reaction', reaction_name)
+ end
end
def default_placeholder
diff --git a/spec/support/helpers/git_helpers.rb b/spec/support/helpers/git_helpers.rb
new file mode 100644
index 00000000000..99a7c39852e
--- /dev/null
+++ b/spec/support/helpers/git_helpers.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module GitHelpers
+ def rugged_repo(repository)
+ path = File.join(TestEnv.repos_path, repository.disk_path + '.git')
+
+ Rugged::Repository.new(path)
+ end
+
+ def project_hook_exists?(project)
+ Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ project_path = project.repository.raw_repository.path
+
+ File.exist?(File.join(project_path, 'hooks', 'post-receive'))
+ end
+ end
+end
diff --git a/spec/support/helpers/kubernetes_helpers.rb b/spec/support/helpers/kubernetes_helpers.rb
index 683a64504a1..ccaf86aa3a6 100644
--- a/spec/support/helpers/kubernetes_helpers.rb
+++ b/spec/support/helpers/kubernetes_helpers.rb
@@ -16,6 +16,8 @@ module KubernetesHelpers
def stub_kubeclient_discover(api_url)
WebMock.stub_request(:get, api_url + '/api/v1').to_return(kube_response(kube_v1_discovery_body))
WebMock.stub_request(:get, api_url + '/apis/extensions/v1beta1').to_return(kube_response(kube_v1beta1_discovery_body))
+ WebMock.stub_request(:get, api_url + '/apis/rbac.authorization.k8s.io/v1').to_return(kube_response(kube_v1_rbac_authorization_discovery_body))
+ WebMock.stub_request(:get, api_url + '/apis/serving.knative.dev/v1alpha1').to_return(kube_response(kube_v1alpha1_serving_knative_discovery_body))
end
def stub_kubeclient_pods(response = nil)
@@ -32,31 +34,65 @@ module KubernetesHelpers
WebMock.stub_request(:get, deployments_url).to_return(response || kube_deployments_response)
end
- def stub_kubeclient_get_secrets(api_url, **options)
- WebMock.stub_request(:get, api_url + '/api/v1/secrets')
- .to_return(kube_response(kube_v1_secrets_body(options)))
+ def stub_kubeclient_get_secret(api_url, **options)
+ options[:metadata_name] ||= "default-token-1"
+ options[:namespace] ||= "default"
+
+ WebMock.stub_request(:get, api_url + "/api/v1/namespaces/#{options[:namespace]}/secrets/#{options[:metadata_name]}")
+ .to_return(kube_response(kube_v1_secret_body(options)))
+ end
+
+ def stub_kubeclient_get_secret_error(api_url, name, namespace: 'default', status: 404)
+ WebMock.stub_request(:get, api_url + "/api/v1/namespaces/#{namespace}/secrets/#{name}")
+ .to_return(status: [status, "Internal Server Error"])
+ end
+
+ def stub_kubeclient_create_service_account(api_url, namespace: 'default')
+ WebMock.stub_request(:post, api_url + "/api/v1/namespaces/#{namespace}/serviceaccounts")
+ .to_return(kube_response({}))
+ end
+
+ def stub_kubeclient_create_service_account_error(api_url, namespace: 'default')
+ WebMock.stub_request(:post, api_url + "/api/v1/namespaces/#{namespace}/serviceaccounts")
+ .to_return(status: [500, "Internal Server Error"])
+ end
+
+ def stub_kubeclient_create_secret(api_url, namespace: 'default')
+ WebMock.stub_request(:post, api_url + "/api/v1/namespaces/#{namespace}/secrets")
+ .to_return(kube_response({}))
end
- def stub_kubeclient_get_secrets_error(api_url)
- WebMock.stub_request(:get, api_url + '/api/v1/secrets')
- .to_return(status: [404, "Internal Server Error"])
+ def stub_kubeclient_create_cluster_role_binding(api_url)
+ WebMock.stub_request(:post, api_url + '/apis/rbac.authorization.k8s.io/v1/clusterrolebindings')
+ .to_return(kube_response({}))
end
- def kube_v1_secrets_body(**options)
+ def stub_kubeclient_create_role_binding(api_url, namespace: 'default')
+ WebMock.stub_request(:post, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/rolebindings")
+ .to_return(kube_response({}))
+ end
+
+ def stub_kubeclient_create_namespace(api_url)
+ WebMock.stub_request(:post, api_url + "/api/v1/namespaces")
+ .to_return(kube_response({}))
+ end
+
+ def stub_kubeclient_get_namespace(api_url, namespace: 'default')
+ WebMock.stub_request(:get, api_url + "/api/v1/namespaces/#{namespace}")
+ .to_return(kube_response({}))
+ end
+
+ def kube_v1_secret_body(**options)
{
"kind" => "SecretList",
"apiVersion": "v1",
- "items" => [
- {
- "metadata": {
- "name": options[:metadata_name] || "default-token-1",
- "namespace": "kube-system"
- },
- "data": {
- "token": options[:token] || Base64.encode64('token-sample-123')
- }
- }
- ]
+ "metadata": {
+ "name": options[:metadata_name] || "default-token-1",
+ "namespace": "kube-system"
+ },
+ "data": {
+ "token": options[:token] || Base64.encode64('token-sample-123')
+ }
}
end
@@ -66,7 +102,10 @@ module KubernetesHelpers
"resources" => [
{ "name" => "pods", "namespaced" => true, "kind" => "Pod" },
{ "name" => "deployments", "namespaced" => true, "kind" => "Deployment" },
- { "name" => "secrets", "namespaced" => true, "kind" => "Secret" }
+ { "name" => "secrets", "namespaced" => true, "kind" => "Secret" },
+ { "name" => "serviceaccounts", "namespaced" => true, "kind" => "ServiceAccount" },
+ { "name" => "services", "namespaced" => true, "kind" => "Service" },
+ { "name" => "namespaces", "namespaced" => true, "kind" => "Namespace" }
]
}
end
@@ -77,7 +116,33 @@ module KubernetesHelpers
"resources" => [
{ "name" => "pods", "namespaced" => true, "kind" => "Pod" },
{ "name" => "deployments", "namespaced" => true, "kind" => "Deployment" },
- { "name" => "secrets", "namespaced" => true, "kind" => "Secret" }
+ { "name" => "secrets", "namespaced" => true, "kind" => "Secret" },
+ { "name" => "serviceaccounts", "namespaced" => true, "kind" => "ServiceAccount" },
+ { "name" => "services", "namespaced" => true, "kind" => "Service" }
+ ]
+ }
+ end
+
+ def kube_v1_rbac_authorization_discovery_body
+ {
+ "kind" => "APIResourceList",
+ "resources" => [
+ { "name" => "clusterrolebindings", "namespaced" => false, "kind" => "ClusterRoleBinding" },
+ { "name" => "clusterroles", "namespaced" => false, "kind" => "ClusterRole" },
+ { "name" => "rolebindings", "namespaced" => true, "kind" => "RoleBinding" },
+ { "name" => "roles", "namespaced" => true, "kind" => "Role" }
+ ]
+ }
+ end
+
+ def kube_v1alpha1_serving_knative_discovery_body
+ {
+ "kind" => "APIResourceList",
+ "resources" => [
+ { "name" => "revisions", "namespaced" => true, "kind" => "Revision" },
+ { "name" => "services", "namespaced" => true, "kind" => "Service" },
+ { "name" => "configurations", "namespaced" => true, "kind" => "Configuration" },
+ { "name" => "routes", "namespaced" => true, "kind" => "Route" }
]
}
end
diff --git a/spec/support/helpers/ldap_helpers.rb b/spec/support/helpers/ldap_helpers.rb
index b90bbc4b106..66ca5d7f0a3 100644
--- a/spec/support/helpers/ldap_helpers.rb
+++ b/spec/support/helpers/ldap_helpers.rb
@@ -37,6 +37,23 @@ module LdapHelpers
.to receive(:find_by_uid).with(uid, any_args).and_return(return_value)
end
+ def stub_ldap_person_find_by_dn(entry, provider = 'ldapmain')
+ person = ::Gitlab::Auth::LDAP::Person.new(entry, provider) if entry.present?
+
+ allow(::Gitlab::Auth::LDAP::Person)
+ .to receive(:find_by_dn)
+ .and_return(person)
+ end
+
+ def stub_ldap_person_find_by_email(email, entry, provider = 'ldapmain')
+ person = ::Gitlab::Auth::LDAP::Person.new(entry, provider) if entry.present?
+
+ allow(::Gitlab::Auth::LDAP::Person)
+ .to receive(:find_by_email)
+ .with(email, anything)
+ .and_return(person)
+ end
+
# Create a simple LDAP user entry.
def ldap_user_entry(uid)
entry = Net::LDAP::Entry.new
diff --git a/spec/support/helpers/markdown_feature.rb b/spec/support/helpers/markdown_feature.rb
index 346f5b1cc4d..96401379cf0 100644
--- a/spec/support/helpers/markdown_feature.rb
+++ b/spec/support/helpers/markdown_feature.rb
@@ -10,6 +10,12 @@
class MarkdownFeature
include FactoryBot::Syntax::Methods
+ attr_reader :fixture_path
+
+ def initialize(fixture_path = Rails.root.join('spec/fixtures/markdown.md.erb'))
+ @fixture_path = fixture_path
+ end
+
def user
@user ||= create(:user)
end
@@ -122,7 +128,7 @@ class MarkdownFeature
end
def raw_markdown
- markdown = File.read(Rails.root.join('spec/fixtures/markdown.md.erb'))
+ markdown = File.read(fixture_path)
ERB.new(markdown).result(binding)
end
end
diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb
index 0bc235701eb..5887c3eab74 100644
--- a/spec/support/helpers/migrations_helpers.rb
+++ b/spec/support/helpers/migrations_helpers.rb
@@ -1,8 +1,16 @@
module MigrationsHelpers
+ def active_record_base
+ ActiveRecord::Base
+ end
+
def table(name)
- Class.new(ActiveRecord::Base) do
+ Class.new(active_record_base) do
self.table_name = name
self.inheritance_column = :_type_disabled
+
+ def self.name
+ table_name.singularize.camelcase
+ end
end
end
@@ -15,7 +23,7 @@ module MigrationsHelpers
end
def clear_schema_cache!
- ActiveRecord::Base.connection_pool.connections.each do |conn|
+ active_record_base.connection_pool.connections.each do |conn|
conn.schema_cache.clear!
end
end
@@ -36,11 +44,18 @@ module MigrationsHelpers
# Reset column information for the most offending classes **after** we
# migrated the schema up, otherwise, column information could be
# outdated. We have a separate method for this so we can override it in EE.
- ActiveRecord::Base.descendants.each(&method(:reset_column_information))
+ active_record_base.descendants.each(&method(:reset_column_information))
+ end
- # Without that, we get errors because of missing attributes, e.g.
+ def refresh_attribute_methods
+ # Without this, we get errors because of missing attributes, e.g.
# super: no superclass method `elasticsearch_indexing' for #<ApplicationSetting:0x00007f85628508d8>
- ApplicationSetting.define_attribute_methods
+ # attr_encrypted also expects ActiveRecord attribute methods to be
+ # defined, or it will override the accessors:
+ # https://gitlab.com/gitlab-org/gitlab-ee/issues/8234#note_113976421
+ [ApplicationSetting, SystemHook].each do |model|
+ model.define_attribute_methods
+ end
end
def reset_column_information(klass)
@@ -80,6 +95,7 @@ module MigrationsHelpers
end
reset_column_in_all_models
+ refresh_attribute_methods
end
def disable_migrations_output
diff --git a/spec/support/helpers/project_forks_helper.rb b/spec/support/helpers/project_forks_helper.rb
index 2c501a2a27c..9a86560da2a 100644
--- a/spec/support/helpers/project_forks_helper.rb
+++ b/spec/support/helpers/project_forks_helper.rb
@@ -24,7 +24,7 @@ module ProjectForksHelper
allow(service).to receive(:gitlab_shell).and_return(shell)
end
- forked_project = service.execute
+ forked_project = service.execute(params[:target_project])
# Reload the both projects so they know about their newly created fork_network
if forked_project.persisted?
@@ -35,7 +35,7 @@ module ProjectForksHelper
if create_repository
# The call to project.repository.after_import in RepositoryForkWorker does
# not reset the @exists variable of this forked_project.repository
- # so we have to explicitely call this method to clear the @exists variable.
+ # so we have to explicitly call this method to clear the @exists variable.
# of the instance we're returning here.
forked_project.repository.after_import
end
diff --git a/spec/support/helpers/reference_parser_helpers.rb b/spec/support/helpers/reference_parser_helpers.rb
index c01897ed1a1..9f27502aa52 100644
--- a/spec/support/helpers/reference_parser_helpers.rb
+++ b/spec/support/helpers/reference_parser_helpers.rb
@@ -3,7 +3,7 @@ module ReferenceParserHelpers
Nokogiri::HTML.fragment('<a></a>').children[0]
end
- shared_examples 'no N+1 queries' do
+ shared_examples 'no project N+1 queries' do
it 'avoids N+1 queries in #nodes_visible_to_user', :request_store do
context = Banzai::RenderContext.new(project, user)
@@ -19,6 +19,10 @@ module ReferenceParserHelpers
expect(actual.count).to be <= control.count
expect(actual.cached_count).to be <= control.cached_count
end
+ end
+
+ shared_examples 'no N+1 queries' do
+ it_behaves_like 'no project N+1 queries'
it 'avoids N+1 queries in #records_for_nodes', :request_store do
context = Banzai::RenderContext.new(project, user)
diff --git a/spec/support/helpers/seed_helper.rb b/spec/support/helpers/seed_helper.rb
index 25781f5e679..90d7f60fdeb 100644
--- a/spec/support/helpers/seed_helper.rb
+++ b/spec/support/helpers/seed_helper.rb
@@ -1,15 +1,18 @@
+# frozen_string_literal: true
+
require_relative 'test_env'
# This file is specific to specs in spec/lib/gitlab/git/
SEED_STORAGE_PATH = TestEnv.repos_path
-TEST_REPO_PATH = 'gitlab-git-test.git'.freeze
-TEST_NORMAL_REPO_PATH = 'not-bare-repo.git'.freeze
-TEST_MUTABLE_REPO_PATH = 'mutable-repo.git'.freeze
-TEST_BROKEN_REPO_PATH = 'broken-repo.git'.freeze
+TEST_REPO_PATH = 'gitlab-git-test.git'
+TEST_NORMAL_REPO_PATH = 'not-bare-repo.git'
+TEST_MUTABLE_REPO_PATH = 'mutable-repo.git'
+TEST_BROKEN_REPO_PATH = 'broken-repo.git'
+TEST_GITATTRIBUTES_REPO_PATH = 'with-git-attributes.git'
module SeedHelper
- GITLAB_GIT_TEST_REPO_URL = File.expand_path('../gitlab-git-test.git', __dir__).freeze
+ GITLAB_GIT_TEST_REPO_URL = File.expand_path('../gitlab-git-test.git', __dir__)
def ensure_seeds
if File.exist?(SEED_STORAGE_PATH)
@@ -66,6 +69,11 @@ module SeedHelper
end
def create_git_attributes
+ system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{TEST_REPO_PATH} #{TEST_GITATTRIBUTES_REPO_PATH}),
+ chdir: SEED_STORAGE_PATH,
+ out: '/dev/null',
+ err: '/dev/null')
+
dir = File.join(SEED_STORAGE_PATH, 'with-git-attributes.git', 'info')
FileUtils.mkdir_p(dir)
@@ -82,6 +90,8 @@ foo/bar.* foo
*.cgi key=value?p1=v1&p2=v2
/*.png gitlab-language=png
*.binary binary
+/custom-highlighting/*.gitlab-custom gitlab-language=ruby
+/custom-highlighting/*.gitlab-cgi gitlab-language=erb?parent=json
# This uses a tab instead of spaces to ensure the parser also supports this.
*.md\tgitlab-language=markdown
diff --git a/spec/support/helpers/stub_configuration.rb b/spec/support/helpers/stub_configuration.rb
index 1823099dd9c..776119564ec 100644
--- a/spec/support/helpers/stub_configuration.rb
+++ b/spec/support/helpers/stub_configuration.rb
@@ -1,5 +1,8 @@
require 'active_support/core_ext/hash/transform_values'
require 'active_support/hash_with_indifferent_access'
+require 'active_support/dependencies'
+
+require_dependency 'gitlab'
module StubConfiguration
def stub_application_setting(messages)
@@ -68,6 +71,10 @@ module StubConfiguration
allow(Gitlab.config.repositories).to receive(:storages).and_return(Settingslogic.new(messages))
end
+ def stub_kerberos_setting(messages)
+ allow(Gitlab.config.kerberos).to receive_messages(to_settings(messages))
+ end
+
private
# Modifies stubbed messages to also stub possible predicate versions
diff --git a/spec/support/helpers/stub_feature_flags.rb b/spec/support/helpers/stub_feature_flags.rb
index b96338bf548..4061a8d1bc9 100644
--- a/spec/support/helpers/stub_feature_flags.rb
+++ b/spec/support/helpers/stub_feature_flags.rb
@@ -1,8 +1,11 @@
module StubFeatureFlags
+ # Stub Feature flags with `flag_name: true/false`
+ #
+ # @param [Hash] features where key is feature name and value is boolean whether enabled or not
def stub_feature_flags(features)
features.each do |feature_name, enabled|
- allow(Feature).to receive(:enabled?).with(feature_name) { enabled }
- allow(Feature).to receive(:enabled?).with(feature_name.to_s) { enabled }
+ allow(Feature).to receive(:enabled?).with(feature_name, any_args) { enabled }
+ allow(Feature).to receive(:enabled?).with(feature_name.to_s, any_args) { enabled }
end
end
end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index f392660d2c7..1f00cdf7e92 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -31,6 +31,8 @@ module TestEnv
'symlink-expand-diff' => '81e6355',
'expand-collapse-files' => '025db92',
'expand-collapse-lines' => '238e82d',
+ 'pages-deploy' => '7897d5b',
+ 'pages-deploy-target' => '7975be0',
'video' => '8879059',
'add-balsamiq-file' => 'b89b56d',
'crlf-diff' => '5938907',
@@ -52,7 +54,12 @@ module TestEnv
'add_images_and_changes' => '010d106',
'update-gitlab-shell-v-6-0-1' => '2f61d70',
'update-gitlab-shell-v-6-0-3' => 'de78448',
- '2-mb-file' => 'bf12d25'
+ '2-mb-file' => 'bf12d25',
+ 'before-create-delete-modify-move' => '845009f',
+ 'between-create-delete-modify-move' => '3f5f443',
+ 'after-create-delete-modify-move' => 'ba3faa7',
+ 'with-codeowners' => '219560e',
+ 'submodule_inside_folder' => 'b491b92'
}.freeze
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
@@ -83,7 +90,7 @@ module TestEnv
clean_test_path
- # Setup GitLab shell for test instance
+ # Set up GitLab shell for test instance
setup_gitlab_shell
setup_gitaly
@@ -105,10 +112,6 @@ module TestEnv
.and_call_original
end
- def disable_pre_receive
- allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
- end
-
# Clean /tmp/tests
#
# Keeps gitlab-shell and gitlab-test
@@ -157,13 +160,11 @@ module TestEnv
component_timed_setup('Gitaly',
install_dir: gitaly_dir,
version: Gitlab::GitalyClient.expected_server_version,
- task: "gitlab:gitaly:install[#{gitaly_dir}]") do
-
- # Always re-create config, in case it's outdated. This is fast anyway.
- Gitlab::SetupHelper.create_gitaly_configuration(gitaly_dir, force: true)
+ task: "gitlab:gitaly:install[#{gitaly_dir},#{repos_path}]") do
- start_gitaly(gitaly_dir)
- end
+ Gitlab::SetupHelper.create_gitaly_configuration(gitaly_dir, { 'default' => repos_path }, force: true)
+ start_gitaly(gitaly_dir)
+ end
end
def start_gitaly(gitaly_dir)
@@ -172,6 +173,8 @@ module TestEnv
return
end
+ FileUtils.mkdir_p("tmp/tests/second_storage") unless File.exist?("tmp/tests/second_storage")
+
spawn_script = Rails.root.join('scripts/gitaly-test-spawn').to_s
Bundler.with_original_env do
raise "gitaly spawn failed" unless system(spawn_script)
@@ -364,7 +367,7 @@ module TestEnv
FileUtils.rm_rf(install_dir)
exit 1
ensure
- puts " #{component} setup in #{Time.now - start} seconds...\n"
+ puts " #{component} set up in #{Time.now - start} seconds...\n"
end
def ensure_component_dir_name_is_correct!(component, path)
diff --git a/spec/support/helpers/test_request_helpers.rb b/spec/support/helpers/test_request_helpers.rb
new file mode 100644
index 00000000000..187a0e07891
--- /dev/null
+++ b/spec/support/helpers/test_request_helpers.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module TestRequestHelpers
+ def test_request(remote_ip: '127.0.0.1')
+ if Gitlab.rails5?
+ ActionController::TestRequest.new({ remote_ip: remote_ip }, ActionController::TestSession.new)
+ else
+ ActionController::TestRequest.new(remote_ip: remote_ip)
+ end
+ end
+end
diff --git a/spec/support/helpers/user_login_helper.rb b/spec/support/helpers/user_login_helper.rb
new file mode 100644
index 00000000000..36c002f53af
--- /dev/null
+++ b/spec/support/helpers/user_login_helper.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module UserLoginHelper
+ def ensure_tab_pane_correctness(visit_path = true)
+ if visit_path
+ visit new_user_session_path
+ end
+
+ ensure_tab_pane_counts
+ ensure_one_active_tab
+ ensure_one_active_pane
+ end
+
+ def ensure_tab_pane_counts
+ tabs_count = page.all('[role="tab"]').size
+ expect(page).to have_selector('[role="tabpanel"]', count: tabs_count)
+ end
+
+ def ensure_one_active_tab
+ expect(page).to have_selector('ul.new-session-tabs > li > a.active', count: 1)
+ end
+
+ def ensure_one_active_pane
+ expect(page).to have_selector('.tab-pane.active', count: 1)
+ end
+end
diff --git a/spec/support/helpers/wiki_helpers.rb b/spec/support/helpers/wiki_helpers.rb
new file mode 100644
index 00000000000..8165403cb60
--- /dev/null
+++ b/spec/support/helpers/wiki_helpers.rb
@@ -0,0 +1,13 @@
+module WikiHelpers
+ extend self
+
+ def upload_file_to_wiki(project, user, file_name)
+ opts = {
+ file_name: file_name,
+ file_content: File.read(expand_fixture_path(file_name))
+ }
+
+ ::Wikis::CreateAttachmentService.new(project, user, opts)
+ .execute[:result][:file_path]
+ end
+end
diff --git a/spec/support/import_export/export_file_helper.rb b/spec/support/import_export/export_file_helper.rb
index 4d925ac77f4..d9ed405baf4 100644
--- a/spec/support/import_export/export_file_helper.rb
+++ b/spec/support/import_export/export_file_helper.rb
@@ -52,7 +52,7 @@ module ExportFileHelper
# Expands the compressed file for an exported project into +tmpdir+
def in_directory_with_expanded_export(project)
Dir.mktmpdir do |tmpdir|
- export_file = project.export_project_path
+ export_file = project.export_file.path
_output, exit_status = Gitlab::Popen.popen(%W{tar -zxf #{export_file} -C #{tmpdir}})
yield(exit_status, tmpdir)
diff --git a/spec/support/rspec.rb b/spec/support/rspec.rb
index 9b8bcebcb3a..b38c5dfe60b 100644
--- a/spec/support/rspec.rb
+++ b/spec/support/rspec.rb
@@ -11,6 +11,4 @@ RSpec.configure do |config|
config.include StubMetrics
config.include StubObjectStorage
config.include StubENV
-
- config.fixture_path = Rails.root if defined?(Rails)
end
diff --git a/spec/support/services/clusters/create_service_shared.rb b/spec/support/services/clusters/create_service_shared.rb
index 43a2fd05498..b0bf942aa09 100644
--- a/spec/support/services/clusters/create_service_shared.rb
+++ b/spec/support/services/clusters/create_service_shared.rb
@@ -7,7 +7,8 @@ shared_context 'valid cluster create params' do
gcp_project_id: 'gcp-project',
zone: 'us-central1-a',
num_nodes: 1,
- machine_type: 'machine_type-a'
+ machine_type: 'machine_type-a',
+ legacy_abac: 'true'
}
}
end
@@ -44,6 +45,7 @@ shared_examples 'create cluster service success' do
expect(subject.provider.num_nodes).to eq(1)
expect(subject.provider.machine_type).to eq('machine_type-a')
expect(subject.provider.access_token).to eq(access_token)
+ expect(subject.provider).to be_legacy_abac
expect(subject.platform).to be_nil
end
end
diff --git a/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb b/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb
new file mode 100644
index 00000000000..95e69328080
--- /dev/null
+++ b/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb
@@ -0,0 +1,66 @@
+shared_examples 'issuable notes filter' do
+ it 'sets discussion filter' do
+ notes_filter = UserPreference::NOTES_FILTERS[:only_comments]
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid, notes_filter: notes_filter
+
+ expect(user.reload.notes_filter_for(issuable)).to eq(notes_filter)
+ expect(UserPreference.count).to eq(1)
+ end
+
+ it 'expires notes e-tag cache for issuable if filter changed' do
+ notes_filter = UserPreference::NOTES_FILTERS[:only_comments]
+
+ expect_any_instance_of(issuable.class).to receive(:expire_note_etag_cache)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid, notes_filter: notes_filter
+ end
+
+ it 'does not expires notes e-tag cache for issuable if filter did not change' do
+ notes_filter = UserPreference::NOTES_FILTERS[:only_comments]
+ user.set_notes_filter(notes_filter, issuable)
+
+ expect_any_instance_of(issuable.class).not_to receive(:expire_note_etag_cache)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid, notes_filter: notes_filter
+ end
+
+ it 'does not set notes filter when database is in read only mode' do
+ allow(Gitlab::Database).to receive(:read_only?).and_return(true)
+ notes_filter = UserPreference::NOTES_FILTERS[:only_comments]
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid, notes_filter: notes_filter
+
+ expect(user.reload.notes_filter_for(issuable)).to eq(0)
+ end
+
+ it 'returns only user comments' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_comments], issuable)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid
+ discussions = JSON.parse(response.body)
+
+ expect(discussions.count).to eq(1)
+ expect(discussions.first["notes"].first["system"]).to be(false)
+ end
+
+ it 'returns only activity notes' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_activity], issuable)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid
+ discussions = JSON.parse(response.body)
+
+ expect(discussions.count).to eq(1)
+ expect(discussions.first["notes"].first["system"]).to be(true)
+ end
+
+ context 'when filter is set to "only_comments"' do
+ it 'does not merge label event notes' do
+ user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_comments], issuable)
+
+ expect(ResourceEvents::MergeIntoNotesService).not_to receive(:new)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issuable.iid
+ end
+ end
+end
diff --git a/spec/support/shared_examples/controllers/repository_lfs_file_load_examples.rb b/spec/support/shared_examples/controllers/repository_lfs_file_load_examples.rb
new file mode 100644
index 00000000000..a3d31e26498
--- /dev/null
+++ b/spec/support/shared_examples/controllers/repository_lfs_file_load_examples.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+# Shared examples for controllers that load and send files from the git repository
+# (like Projects::RawController or Projects::AvatarsController)
+
+# These examples requires the following variables:
+# - `project`
+# - `filename`: filename of the file
+# - `filepath`: path of the file (contains filename)
+# - `subject`: the request to be made to the controller. Example:
+# subject { get :show, namespace_id: project.namespace, project_id: project }
+shared_examples 'repository lfs file load' do
+ context 'when file is stored in lfs' do
+ let(:lfs_oid) { '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897' }
+ let(:lfs_size) { '1575078' }
+ let!(:lfs_object) { create(:lfs_object, oid: lfs_oid, size: lfs_size) }
+
+ context 'when lfs is enabled' do
+ before do
+ allow_any_instance_of(Project).to receive(:lfs_enabled?).and_return(true)
+ end
+
+ context 'when project has access' do
+ before do
+ project.lfs_objects << lfs_object
+ allow_any_instance_of(LfsObjectUploader).to receive(:exists?).and_return(true)
+ allow(controller).to receive(:send_file) { controller.head :ok }
+ end
+
+ it 'serves the file' do
+ expect(controller).to receive(:send_file).with("#{LfsObjectUploader.root}/91/ef/f75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", filename: filename, disposition: 'attachment')
+
+ subject
+
+ expect(response).to have_gitlab_http_status(200)
+ end
+
+ context 'and lfs uses object storage' do
+ let(:lfs_object) { create(:lfs_object, :with_file, oid: lfs_oid, size: lfs_size) }
+
+ before do
+ stub_lfs_object_storage
+ lfs_object.file.migrate!(LfsObjectUploader::Store::REMOTE)
+ end
+
+ it 'responds with redirect to file' do
+ subject
+
+ expect(response).to have_gitlab_http_status(302)
+ expect(response.location).to include(lfs_object.reload.file.path)
+ end
+
+ it 'sets content disposition' do
+ subject
+
+ file_uri = URI.parse(response.location)
+ params = CGI.parse(file_uri.query)
+
+ expect(params["response-content-disposition"].first).to eq "attachment;filename=\"#{filename}\""
+ end
+ end
+ end
+
+ context 'when project does not have access' do
+ it 'does not serve the file' do
+ subject
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ context 'when lfs is not enabled' do
+ before do
+ allow_any_instance_of(Project).to receive(:lfs_enabled?).and_return(false)
+ end
+
+ it 'delivers ASCII file' do
+ subject
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.header['Content-Type']).to eq('text/plain; charset=utf-8')
+ expect(response.header['Content-Disposition'])
+ .to eq('inline')
+ expect(response.header[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with('git-blob:')
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/diff_file_collections.rb b/spec/support/shared_examples/diff_file_collections.rb
new file mode 100644
index 00000000000..55ce160add0
--- /dev/null
+++ b/spec/support/shared_examples/diff_file_collections.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+shared_examples 'diff statistics' do |test_include_stats_flag: true|
+ def stub_stats_find_by_path(path, stats_mock)
+ expect_next_instance_of(Gitlab::Git::DiffStatsCollection) do |collection|
+ allow(collection).to receive(:find_by_path).and_call_original
+ expect(collection).to receive(:find_by_path).with(path).and_return(stats_mock)
+ end
+ end
+
+ context 'when should request diff stats' do
+ it 'Repository#diff_stats is called' do
+ subject = described_class.new(diffable, collection_default_args)
+
+ expect(diffable.project.repository)
+ .to receive(:diff_stats)
+ .with(diffable.diff_refs.base_sha, diffable.diff_refs.head_sha)
+ .and_call_original
+
+ subject.diff_files
+ end
+
+ it 'Gitlab::Diff::File is initialized with diff stats' do
+ subject = described_class.new(diffable, collection_default_args)
+
+ stats_mock = double(Gitaly::DiffStats, path: '.gitignore', additions: 758, deletions: 120)
+ stub_stats_find_by_path(stub_path, stats_mock)
+
+ diff_file = subject.diff_files.find { |file| file.new_path == stub_path }
+
+ expect(diff_file.added_lines).to eq(stats_mock.additions)
+ expect(diff_file.removed_lines).to eq(stats_mock.deletions)
+ end
+ end
+
+ context 'when should not request diff stats' do
+ it 'Repository#diff_stats is not called' do
+ collection_default_args[:diff_options][:include_stats] = false
+
+ subject = described_class.new(diffable, collection_default_args)
+
+ expect(diffable.project.repository).not_to receive(:diff_stats)
+
+ subject.diff_files
+ end
+ end
+end
diff --git a/spec/support/shared_examples/dirty_submit_form_shared_examples.rb b/spec/support/shared_examples/dirty_submit_form_shared_examples.rb
new file mode 100644
index 00000000000..ba363593120
--- /dev/null
+++ b/spec/support/shared_examples/dirty_submit_form_shared_examples.rb
@@ -0,0 +1,24 @@
+shared_examples 'dirty submit form' do |selector_args|
+ selectors = selector_args.is_a?(Array) ? selector_args : [selector_args]
+
+ selectors.each do |selector|
+ it "disables #{selector[:form]} submit until there are changes", :js do
+ form = find(selector[:form])
+ submit = form.first('.js-dirty-submit')
+ input = form.first(selector[:input])
+ original_value = input.value
+
+ expect(submit.disabled?).to be true
+
+ input.set("#{original_value} changes")
+
+ form.find('.js-dirty-submit:not([disabled])', match: :first)
+ expect(submit.disabled?).to be false
+
+ input.set(original_value)
+
+ form.find('.js-dirty-submit[disabled]', match: :first)
+ expect(submit.disabled?).to be true
+ end
+ end
+end
diff --git a/spec/support/shared_examples/fast_destroy_all.rb b/spec/support/shared_examples/fast_destroy_all.rb
index 5448ddcfe33..a8079b6d864 100644
--- a/spec/support/shared_examples/fast_destroy_all.rb
+++ b/spec/support/shared_examples/fast_destroy_all.rb
@@ -4,8 +4,8 @@ shared_examples_for 'fast destroyable' do
expect(external_data_counter).to be > 0
expect(subjects.count).to be > 0
- expect { subjects.first.destroy }.to raise_error('`destroy` and `destroy_all` are forbbiden. Please use `fast_destroy_all`')
- expect { subjects.destroy_all }.to raise_error('`destroy` and `destroy_all` are forbbiden. Please use `fast_destroy_all`')
+ expect { subjects.first.destroy }.to raise_error('`destroy` and `destroy_all` are forbidden. Please use `fast_destroy_all`')
+ expect { subjects.destroy_all }.to raise_error('`destroy` and `destroy_all` are forbidden. Please use `fast_destroy_all`') # rubocop: disable DestroyAll
expect(subjects.count).to be > 0
expect(external_data_counter).to be > 0
diff --git a/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb b/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
index 3057845061b..a096627ee62 100644
--- a/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
+++ b/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
@@ -73,9 +73,13 @@ RSpec.shared_examples 'an editable merge request' do
it 'description has autocomplete', :js do
find('#merge_request_description').native.send_keys('')
- fill_in 'merge_request_description', with: '@'
+ fill_in 'merge_request_description', with: user.to_reference[0..4]
- expect(page).to have_selector('.atwho-view')
+ wait_for_requests
+
+ page.within('.atwho-view') do
+ expect(page).to have_content(user2.name)
+ end
end
it 'has class js-quick-submit in form' do
diff --git a/spec/support/shared_examples/helm_generated_script.rb b/spec/support/shared_examples/helm_generated_script.rb
index ef9bb7f5533..ba9b7d3bdcf 100644
--- a/spec/support/shared_examples/helm_generated_script.rb
+++ b/spec/support/shared_examples/helm_generated_script.rb
@@ -2,18 +2,12 @@ shared_examples 'helm commands' do
describe '#generate_script' do
let(:helm_setup) do
<<~EOS
- set -eo pipefail
- ALPINE_VERSION=$(cat /etc/alpine-release | cut -d '.' -f 1,2)
- echo http://mirror.clarkson.edu/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
- echo http://mirror1.hs-esslingen.de/pub/Mirrors/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
- apk add -U wget ca-certificates openssl >/dev/null
- wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v2.7.2-linux-amd64.tar.gz | tar zxC /tmp >/dev/null
- mv /tmp/linux-amd64/helm /usr/bin/
+ set -xeo pipefail
EOS
end
it 'should return appropriate command' do
- expect(subject.generate_script).to eq(helm_setup + commands)
+ expect(subject.generate_script.strip).to eq((helm_setup + commands).strip)
end
end
end
diff --git a/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb b/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb
index 5334af841e1..8ea307c7c61 100644
--- a/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb
+++ b/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb
@@ -5,6 +5,8 @@ shared_examples 'instance statistics availability' do
before do
sign_in(user)
+
+ stub_application_setting(usage_ping_enabled: true)
end
describe 'GET #index' do
diff --git a/spec/support/shared_examples/models/chat_service_spec.rb b/spec/support/shared_examples/models/chat_service_spec.rb
new file mode 100644
index 00000000000..cf1d52a9616
--- /dev/null
+++ b/spec/support/shared_examples/models/chat_service_spec.rb
@@ -0,0 +1,242 @@
+require "spec_helper"
+
+shared_examples_for "chat service" do |service_name|
+ describe "Associations" do
+ it { is_expected.to belong_to :project }
+ it { is_expected.to have_one :service_hook }
+ end
+
+ describe "Validations" do
+ context "when service is active" do
+ before do
+ subject.active = true
+ end
+
+ it { is_expected.to validate_presence_of(:webhook) }
+ it_behaves_like "issue tracker service URL attribute", :webhook
+ end
+
+ context "when service is inactive" do
+ before do
+ subject.active = false
+ end
+
+ it { is_expected.not_to validate_presence_of(:webhook) }
+ end
+ end
+
+ describe "#execute" do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
+ let(:webhook_url) { "https://example.gitlab.com/" }
+
+ before do
+ allow(subject).to receive_messages(
+ project: project,
+ project_id: project.id,
+ service_hook: true,
+ webhook: webhook_url
+ )
+
+ WebMock.stub_request(:post, webhook_url)
+ end
+
+ shared_examples "#{service_name} service" do
+ it "calls #{service_name} API" do
+ subject.execute(sample_data)
+
+ expect(WebMock).to have_requested(:post, webhook_url).with { |req| req.body =~ /\A{"#{content_key}":.+}\Z/ }.once
+ end
+ end
+
+ context "with push events" do
+ let(:sample_data) do
+ Gitlab::DataBuilder::Push.build_sample(project, user)
+ end
+
+ it_behaves_like "#{service_name} service"
+
+ it "specifies the webhook when it is configured" do
+ expect(client).to receive(:new).with(client_arguments).and_return(double(:chat_service).as_null_object)
+
+ subject.execute(sample_data)
+ end
+
+ context "with not default branch" do
+ let(:sample_data) do
+ Gitlab::DataBuilder::Push.build(project, user, nil, nil, "not-the-default-branch")
+ end
+
+ context "when notify_only_default_branch enabled" do
+ before do
+ subject.notify_only_default_branch = true
+ end
+
+ it "does not call the Discord Webhooks API" do
+ result = subject.execute(sample_data)
+
+ expect(result).to be_falsy
+ end
+ end
+
+ context "when notify_only_default_branch disabled" do
+ before do
+ subject.notify_only_default_branch = false
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+ end
+ end
+
+ context "with issue events" do
+ let(:opts) { { title: "Awesome issue", description: "please fix" } }
+ let(:sample_data) do
+ service = Issues::CreateService.new(project, user, opts)
+ issue = service.execute
+ service.hook_data(issue, "open")
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with merge events" do
+ let(:opts) do
+ {
+ title: "Awesome merge_request",
+ description: "please fix",
+ source_branch: "feature",
+ target_branch: "master"
+ }
+ end
+
+ let(:sample_data) do
+ service = MergeRequests::CreateService.new(project, user, opts)
+ merge_request = service.execute
+ service.hook_data(merge_request, "open")
+ end
+
+ before do
+ project.add_developer(user)
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with wiki page events" do
+ let(:opts) do
+ {
+ title: "Awesome wiki_page",
+ content: "Some text describing some thing or another",
+ format: "md",
+ message: "user created page: Awesome wiki_page"
+ }
+ end
+ let(:wiki_page) { create(:wiki_page, wiki: project.wiki, attrs: opts) }
+ let(:sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, "create") }
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with note events" do
+ let(:sample_data) { Gitlab::DataBuilder::Note.build(note, user) }
+
+ context "with commit comment" do
+ let(:note) do
+ create(:note_on_commit,
+ author: user,
+ project: project,
+ commit_id: project.repository.commit.id,
+ note: "a comment on a commit")
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with merge request comment" do
+ let(:note) do
+ create(:note_on_merge_request, project: project, note: "merge request note")
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with issue comment" do
+ let(:note) do
+ create(:note_on_issue, project: project, note: "issue note")
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with snippet comment" do
+ let(:note) do
+ create(:note_on_project_snippet, project: project, note: "snippet note")
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+ end
+
+ context "with pipeline events" do
+ let(:pipeline) do
+ create(:ci_pipeline,
+ project: project, status: status,
+ sha: project.commit.sha, ref: project.default_branch)
+ end
+ let(:sample_data) { Gitlab::DataBuilder::Pipeline.build(pipeline) }
+
+ context "with failed pipeline" do
+ let(:status) { "failed" }
+
+ it_behaves_like "#{service_name} service"
+ end
+
+ context "with succeeded pipeline" do
+ let(:status) { "success" }
+
+ context "with default notify_only_broken_pipelines" do
+ it "does not call Discord Webhooks API" do
+ result = subject.execute(sample_data)
+
+ expect(result).to be_falsy
+ end
+ end
+
+ context "when notify_only_broken_pipelines is false" do
+ before do
+ subject.notify_only_broken_pipelines = false
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+ end
+
+ context "with not default branch" do
+ let(:pipeline) do
+ create(:ci_pipeline, project: project, status: "failed", ref: "not-the-default-branch")
+ end
+
+ context "when notify_only_default_branch enabled" do
+ before do
+ subject.notify_only_default_branch = true
+ end
+
+ it "does not call the Discord Webhooks API" do
+ result = subject.execute(sample_data)
+
+ expect(result).to be_falsy
+ end
+ end
+
+ context "when notify_only_default_branch disabled" do
+ before do
+ subject.notify_only_default_branch = false
+ end
+
+ it_behaves_like "#{service_name} service"
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/cluster_application_core_shared_examples.rb b/spec/support/shared_examples/models/cluster_application_core_shared_examples.rb
index 87d12a784ba..1f76b981292 100644
--- a/spec/support/shared_examples/models/cluster_application_core_shared_examples.rb
+++ b/spec/support/shared_examples/models/cluster_application_core_shared_examples.rb
@@ -11,60 +11,4 @@ shared_examples 'cluster application core specs' do |application_name|
expect(Clusters::Cluster::APPLICATIONS[subject.name]).to eq(described_class)
end
end
-
- describe 'status state machine' do
- describe '#make_installing' do
- subject { create(application_name, :scheduled) }
-
- it 'is installing' do
- subject.make_installing!
-
- expect(subject).to be_installing
- end
- end
-
- describe '#make_installed' do
- subject { create(application_name, :installing) }
-
- it 'is installed' do
- subject.make_installed
-
- expect(subject).to be_installed
- end
- end
-
- describe '#make_errored' do
- subject { create(application_name, :installing) }
- let(:reason) { 'some errors' }
-
- it 'is errored' do
- subject.make_errored(reason)
-
- expect(subject).to be_errored
- expect(subject.status_reason).to eq(reason)
- end
- end
-
- describe '#make_scheduled' do
- subject { create(application_name, :installable) }
-
- it 'is scheduled' do
- subject.make_scheduled
-
- expect(subject).to be_scheduled
- end
-
- describe 'when was errored' do
- subject { create(application_name, :errored) }
-
- it 'clears #status_reason' do
- expect(subject.status_reason).not_to be_nil
-
- subject.make_scheduled!
-
- expect(subject.status_reason).to be_nil
- end
- end
- end
- end
end
diff --git a/spec/support/shared_examples/models/cluster_application_helm_cert_examples.rb b/spec/support/shared_examples/models/cluster_application_helm_cert_examples.rb
new file mode 100644
index 00000000000..d87b3181e80
--- /dev/null
+++ b/spec/support/shared_examples/models/cluster_application_helm_cert_examples.rb
@@ -0,0 +1,25 @@
+shared_examples 'cluster application helm specs' do |application_name|
+ let(:application) { create(application_name) }
+
+ describe '#files' do
+ subject { application.files }
+
+ context 'when the helm application does not have a ca_cert' do
+ before do
+ application.cluster.application_helm.ca_cert = nil
+ end
+
+ it 'should not include cert files when there is no ca_cert entry' do
+ expect(subject).not_to include(:'ca.pem', :'cert.pem', :'key.pem')
+ end
+ end
+
+ it 'should include cert files when there is a ca_cert entry' do
+ expect(subject).to include(:'ca.pem', :'cert.pem', :'key.pem')
+ expect(subject[:'ca.pem']).to eq(application.cluster.application_helm.ca_cert)
+
+ cert = OpenSSL::X509::Certificate.new(subject[:'cert.pem'])
+ expect(cert.not_after).to be < 60.minutes.from_now
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb b/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb
index 765dd32f4ba..c391cc48f4e 100644
--- a/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb
+++ b/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb
@@ -28,4 +28,117 @@ shared_examples 'cluster application status specs' do |application_name|
end
end
end
+
+ describe 'status state machine' do
+ describe '#make_installing' do
+ subject { create(application_name, :scheduled) }
+
+ it 'is installing' do
+ subject.make_installing!
+
+ expect(subject).to be_installing
+ end
+ end
+
+ describe '#make_installed' do
+ subject { create(application_name, :installing) }
+
+ it 'is installed' do
+ subject.make_installed!
+
+ expect(subject).to be_installed
+ end
+
+ it 'updates helm version' do
+ subject.cluster.application_helm.update!(version: '1.2.3')
+
+ subject.make_installed!
+
+ subject.cluster.application_helm.reload
+
+ expect(subject.cluster.application_helm.version).to eq(Gitlab::Kubernetes::Helm::HELM_VERSION)
+ end
+ end
+
+ describe '#make_updated' do
+ subject { create(application_name, :updating) }
+
+ it 'is updated' do
+ subject.make_updated!
+
+ expect(subject).to be_updated
+ end
+
+ it 'updates helm version' do
+ subject.cluster.application_helm.update!(version: '1.2.3')
+
+ subject.make_updated!
+
+ subject.cluster.application_helm.reload
+
+ expect(subject.cluster.application_helm.version).to eq(Gitlab::Kubernetes::Helm::HELM_VERSION)
+ end
+ end
+
+ describe '#make_errored' do
+ subject { create(application_name, :installing) }
+ let(:reason) { 'some errors' }
+
+ it 'is errored' do
+ subject.make_errored(reason)
+
+ expect(subject).to be_errored
+ expect(subject.status_reason).to eq(reason)
+ end
+ end
+
+ describe '#make_scheduled' do
+ subject { create(application_name, :installable) }
+
+ it 'is scheduled' do
+ subject.make_scheduled
+
+ expect(subject).to be_scheduled
+ end
+
+ describe 'when was errored' do
+ subject { create(application_name, :errored) }
+
+ it 'clears #status_reason' do
+ expect(subject.status_reason).not_to be_nil
+
+ subject.make_scheduled!
+
+ expect(subject.status_reason).to be_nil
+ end
+ end
+ end
+ end
+
+ describe '#available?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:trait, :available) do
+ :not_installable | false
+ :installable | false
+ :scheduled | false
+ :installing | false
+ :installed | true
+ :updating | false
+ :updated | true
+ :errored | false
+ :update_errored | false
+ :timeouted | false
+ end
+
+ with_them do
+ subject { build(application_name, trait) }
+
+ if params[:available]
+ it { is_expected.to be_available }
+ else
+ it { is_expected.not_to be_available }
+ end
+ end
+ end
end
diff --git a/spec/support/shared_examples/models/label_note_shared_examples.rb b/spec/support/shared_examples/models/label_note_shared_examples.rb
new file mode 100644
index 00000000000..406385c13bd
--- /dev/null
+++ b/spec/support/shared_examples/models/label_note_shared_examples.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+shared_examples 'label note created from events' do
+ def create_event(params = {})
+ event_params = { action: :add, label: label, user: user }
+ resource_key = resource.class.name.underscore.to_s
+ event_params[resource_key] = resource
+
+ build(:resource_label_event, event_params.merge(params))
+ end
+
+ def label_refs(events)
+ labels = events.map(&:label).compact
+
+ labels.map { |l| l.to_reference}.sort.join(' ')
+ end
+
+ let(:time) { Time.now }
+ let(:local_label_ids) { [label.id, label2.id] }
+
+ describe '.from_events' do
+ it 'returns system note with expected attributes' do
+ event = create_event
+
+ note = described_class.from_events([event, create_event])
+
+ expect(note.system).to be true
+ expect(note.author_id).to eq event.user_id
+ expect(note.discussion_id).to eq event.discussion_id
+ expect(note.noteable).to eq event.issuable
+ expect(note.note).to be_present
+ expect(note.note_html).to be_present
+ end
+
+ it 'updates markdown cache if reference is not set yet' do
+ event = create_event(reference: nil)
+
+ described_class.from_events([event])
+
+ expect(event.reference).not_to be_nil
+ end
+
+ it 'updates markdown cache if label was deleted' do
+ event = create_event(reference: 'some_ref', label: nil)
+
+ described_class.from_events([event])
+
+ expect(event.reference).to eq ''
+ end
+
+ it 'returns html note' do
+ events = [create_event(created_at: time)]
+
+ note = described_class.from_events(events)
+
+ expect(note.note_html).to include label.title
+ end
+
+ it 'returns text note for added labels' do
+ events = [create_event(created_at: time),
+ create_event(created_at: time, label: label2),
+ create_event(created_at: time, label: nil)]
+
+ note = described_class.from_events(events)
+
+ expect(note.note).to eq "added #{label_refs(events)} + 1 deleted label"
+ end
+
+ it 'returns text note for removed labels' do
+ events = [create_event(action: :remove, created_at: time),
+ create_event(action: :remove, created_at: time, label: label2),
+ create_event(action: :remove, created_at: time, label: nil)]
+
+ note = described_class.from_events(events)
+
+ expect(note.note).to eq "removed #{label_refs(events)} + 1 deleted label"
+ end
+
+ it 'returns text note for added and removed labels' do
+ add_events = [create_event(created_at: time),
+ create_event(created_at: time, label: nil)]
+
+ remove_events = [create_event(action: :remove, created_at: time),
+ create_event(action: :remove, created_at: time, label: nil)]
+
+ note = described_class.from_events(add_events + remove_events)
+
+ expect(note.note).to eq "added #{label_refs(add_events)} + 1 deleted label and removed #{label_refs(remove_events)} + 1 deleted label"
+ end
+
+ it 'returns text note for cross-project label' do
+ other_label = create(:label)
+ event = create_event(label: other_label)
+
+ note = described_class.from_events([event])
+
+ expect(note.note).to eq "added #{other_label.to_reference(resource_parent)} label"
+ end
+
+ it 'returns text note for cross-group label' do
+ other_label = create(:group_label)
+ event = create_event(label: other_label)
+
+ note = described_class.from_events([event])
+
+ expect(note.note).to eq "added #{other_label.to_reference(other_label.group, target_project: project, full: true)} label"
+ end
+ end
+end
diff --git a/spec/support/shared_examples/notify_shared_examples.rb b/spec/support/shared_examples/notify_shared_examples.rb
index 5fb9ced3b63..66536e80db2 100644
--- a/spec/support/shared_examples/notify_shared_examples.rb
+++ b/spec/support/shared_examples/notify_shared_examples.rb
@@ -45,6 +45,20 @@ shared_examples 'an email that contains a header with author username' do
end
end
+shared_examples 'an email with X-GitLab headers containing IDs' do
+ it 'has X-GitLab-*-ID header' do
+ is_expected.to have_header "X-GitLab-#{model.class.name}-ID", "#{model.id}"
+ end
+
+ it 'has X-GitLab-*-IID header if model has iid defined' do
+ if model.respond_to?(:iid)
+ is_expected.to have_header "X-GitLab-#{model.class.name}-IID", "#{model.iid}"
+ else
+ expect(subject.header["X-GitLab-#{model.class.name}-IID"]).to eq nil
+ end
+ end
+end
+
shared_examples 'an email with X-GitLab headers containing project details' do
it 'has X-GitLab-Project headers' do
aggregate_failures do
@@ -69,6 +83,7 @@ end
shared_examples 'a thread answer email with reply-by-email enabled' do
include_examples 'an email with X-GitLab headers containing project details'
+ include_examples 'an email with X-GitLab headers containing IDs'
it 'has the characteristics of a threaded reply' do
host = Gitlab.config.gitlab.host
@@ -85,6 +100,7 @@ end
shared_examples 'an email starting a new thread with reply-by-email enabled' do
include_examples 'an email with X-GitLab headers containing project details'
+ include_examples 'an email with X-GitLab headers containing IDs'
include_examples 'a new thread email with reply-by-email enabled'
it 'includes "Reply to this email directly or <View it on GitLab>"' do
@@ -109,6 +125,7 @@ end
shared_examples 'an answer to an existing thread with reply-by-email enabled' do
include_examples 'an email with X-GitLab headers containing project details'
+ include_examples 'an email with X-GitLab headers containing IDs'
include_examples 'a thread answer email with reply-by-email enabled'
context 'when reply-by-email is enabled with incoming address with %{key}' do
diff --git a/spec/support/shared_examples/requests/api/merge_requests_list.rb b/spec/support/shared_examples/requests/api/merge_requests_list.rb
index 1aed8ab0113..668a390b5d2 100644
--- a/spec/support/shared_examples/requests/api/merge_requests_list.rb
+++ b/spec/support/shared_examples/requests/api/merge_requests_list.rb
@@ -16,7 +16,12 @@ shared_examples 'merge requests list' do
create(:merge_request, state: 'closed', milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: 'Test', created_at: base_time)
- create(:merge_request, milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: 'Test', created_at: base_time)
+ merge_request = create(:merge_request, milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: 'Test', created_at: base_time)
+
+ merge_request.metrics.update!(merged_by: user,
+ latest_closed_by: user,
+ latest_closed_at: 1.hour.ago,
+ merged_at: 2.hours.ago)
expect do
get api(endpoint_path, user)
diff --git a/spec/support/shared_examples/requests/api/notes.rb b/spec/support/shared_examples/requests/api/notes.rb
index 1b563021244..0e20dfe0725 100644
--- a/spec/support/shared_examples/requests/api/notes.rb
+++ b/spec/support/shared_examples/requests/api/notes.rb
@@ -111,17 +111,79 @@ shared_examples 'noteable API' do |parent_type, noteable_type, id_name|
post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), body: 'hi!'
end
- context 'when an admin or owner makes the request' do
- it 'accepts the creation date to be set' do
- creation_time = 2.weeks.ago
- post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user),
- body: 'hi!', created_at: creation_time
+ context 'setting created_at' do
+ let(:creation_time) { 2.weeks.ago }
+ let(:params) { { body: 'hi!', created_at: creation_time } }
+
+ context 'by an admin' do
+ it 'sets the creation time on the new note' do
+ admin = create(:admin)
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", admin), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['author']['username']).to eq(admin.username)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ expect(Time.parse(json_response['updated_at'])).to be_like_time(creation_time)
+ end
+ end
- expect(response).to have_gitlab_http_status(201)
- expect(json_response['body']).to eq('hi!')
- expect(json_response['author']['username']).to eq(user.username)
- expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
- expect(Time.parse(json_response['updated_at'])).to be_like_time(creation_time)
+ if parent_type == 'projects'
+ context 'by a project owner' do
+ it 'sets the creation time on the new note' do
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['author']['username']).to eq(user.username)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ expect(Time.parse(json_response['updated_at'])).to be_like_time(creation_time)
+ end
+ end
+
+ context 'by a group owner' do
+ it 'sets the creation time on the new note' do
+ user2 = create(:user)
+ group = create(:group)
+ group.add_owner(user2)
+ parent.update!(namespace: group)
+ user2.refresh_authorized_projects
+
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user2), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['author']['username']).to eq(user2.username)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ expect(Time.parse(json_response['updated_at'])).to be_like_time(creation_time)
+ end
+ end
+ elsif parent_type == 'groups'
+ context 'by a group owner' do
+ it 'sets the creation time on the new note' do
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['author']['username']).to eq(user.username)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(creation_time)
+ expect(Time.parse(json_response['updated_at'])).to be_like_time(creation_time)
+ end
+ end
+ end
+
+ context 'by another user' do
+ it 'ignores the given creation time' do
+ user2 = create(:user)
+ parent.add_developer(user2)
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user2), params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['author']['username']).to eq(user2.username)
+ expect(Time.parse(json_response['created_at'])).not_to be_like_time(creation_time)
+ expect(Time.parse(json_response['updated_at'])).not_to be_like_time(creation_time)
+ end
end
end
diff --git a/spec/support/shared_examples/services/boards/issues_move_service.rb b/spec/support/shared_examples/services/boards/issues_move_service.rb
index 6d29a97c56d..ec44b99d10e 100644
--- a/spec/support/shared_examples/services/boards/issues_move_service.rb
+++ b/spec/support/shared_examples/services/boards/issues_move_service.rb
@@ -34,7 +34,7 @@ shared_examples 'issues move service' do |group|
described_class.new(parent, user, params).execute(issue)
issue.reload
- expect(issue.labels).to contain_exactly(bug)
+ expect(issue.labels).to contain_exactly(bug, regression)
expect(issue).to be_closed
end
end
diff --git a/spec/support/shared_examples/services/boards/lists_move_service.rb b/spec/support/shared_examples/services/boards/lists_move_service.rb
index 07c98cb29b7..2cdb968a45d 100644
--- a/spec/support/shared_examples/services/boards/lists_move_service.rb
+++ b/spec/support/shared_examples/services/boards/lists_move_service.rb
@@ -14,7 +14,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [0, 1, 2, 3]
end
- it 'keeps position of lists when new positon is equal to old position' do
+ it 'keeps position of lists when new position is equal to old position' do
service = described_class.new(parent, user, position: planning.position)
service.execute(planning)
@@ -22,7 +22,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [0, 1, 2, 3]
end
- it 'keeps position of lists when new positon is negative' do
+ it 'keeps position of lists when new position is negative' do
service = described_class.new(parent, user, position: -1)
service.execute(planning)
@@ -30,7 +30,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [0, 1, 2, 3]
end
- it 'keeps position of lists when new positon is equal to number of labels lists' do
+ it 'keeps position of lists when new position is equal to number of labels lists' do
service = described_class.new(parent, user, position: board.lists.label.size)
service.execute(planning)
@@ -38,7 +38,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [0, 1, 2, 3]
end
- it 'keeps position of lists when new positon is greater than number of labels lists' do
+ it 'keeps position of lists when new position is greater than number of labels lists' do
service = described_class.new(parent, user, position: board.lists.label.size + 1)
service.execute(planning)
@@ -46,7 +46,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [0, 1, 2, 3]
end
- it 'increments position of intermediate lists when new positon is equal to first position' do
+ it 'increments position of intermediate lists when new position is equal to first position' do
service = described_class.new(parent, user, position: 0)
service.execute(staging)
@@ -54,7 +54,7 @@ shared_examples 'lists move service' do
expect(current_list_positions).to eq [1, 2, 3, 0]
end
- it 'decrements position of intermediate lists when new positon is equal to last position' do
+ it 'decrements position of intermediate lists when new position is equal to last position' do
service = described_class.new(parent, user, position: board.lists.label.last.position)
service.execute(planning)
diff --git a/spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb b/spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb
index 93c21a99e59..1190863d88e 100644
--- a/spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb
+++ b/spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb
@@ -33,6 +33,14 @@ shared_examples "builds correct paths" do |**patterns|
it_behaves_like "matches the method pattern", :upload_path
end
+ describe "#relative_path" do
+ it 'is relative' do
+ skip 'Path not set, skipping.' unless subject.path
+
+ expect(Pathname.new(subject.relative_path)).to be_relative
+ end
+ end
+
describe ".absolute_path" do
it_behaves_like "matches the method pattern", :absolute_path do
let(:target) { subject.class }
diff --git a/spec/support/shared_examples/wiki_file_attachments_examples.rb b/spec/support/shared_examples/wiki_file_attachments_examples.rb
new file mode 100644
index 00000000000..b6fb2a66b0e
--- /dev/null
+++ b/spec/support/shared_examples/wiki_file_attachments_examples.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+# Requires a context containing:
+# project
+
+shared_examples 'wiki file attachments' do
+ include DropzoneHelper
+
+ context 'uploading attachments', :js do
+ let(:wiki) { project.wiki }
+
+ def attach_with_dropzone(wait = false)
+ dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, wait)
+ end
+
+ context 'before uploading' do
+ it 'shows "Attach a file" button' do
+ expect(page).to have_button('Attach a file')
+ expect(page).not_to have_selector('.uploading-progress-container', visible: true)
+ end
+ end
+
+ context 'uploading is in progress' do
+ it 'cancels uploading on clicking to "Cancel" button' do
+ slow_requests do
+ attach_with_dropzone
+
+ click_button 'Cancel'
+ end
+
+ expect(page).to have_button('Attach a file')
+ expect(page).not_to have_button('Cancel')
+ expect(page).not_to have_selector('.uploading-progress-container', visible: true)
+ end
+
+ it 'shows "Attaching a file" message on uploading 1 file' do
+ slow_requests do
+ attach_with_dropzone
+
+ expect(page).to have_selector('.attaching-file-message', visible: true, text: 'Attaching a file -')
+ end
+ end
+ end
+
+ context 'uploading is complete' do
+ it 'shows "Attach a file" button on uploading complete' do
+ attach_with_dropzone
+ wait_for_requests
+
+ expect(page).to have_button('Attach a file')
+ expect(page).not_to have_selector('.uploading-progress-container', visible: true)
+ end
+
+ it 'the markdown link is added to the page' do
+ fill_in(:wiki_content, with: '')
+ attach_with_dropzone(true)
+ wait_for_requests
+
+ expect(page.find('#wiki_content').value)
+ .to match(%r{\!\[dk\]\(uploads/\h{32}/dk\.png\)$})
+ end
+
+ it 'the links point to the wiki root url' do
+ attach_with_dropzone(true)
+ wait_for_requests
+
+ find('.js-md-preview-button').click
+ file_path = page.find('input[name="files[]"]', visible: :hidden).value
+ link = page.find('a.no-attachment-icon')['href']
+ img_link = page.find('a.no-attachment-icon img')['src']
+
+ expect(link).to eq img_link
+ expect(URI.parse(link).path).to eq File.join(wiki.wiki_base_path, file_path)
+ end
+
+ it 'the file has been added to the wiki repository' do
+ expect do
+ attach_with_dropzone(true)
+ wait_for_requests
+ end.to change { wiki.repository.ls_files('HEAD').count }.by(1)
+
+ file_path = page.find('input[name="files[]"]', visible: :hidden).value
+
+ expect(wiki.find_file(file_path, 'HEAD').path).not_to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/support/sidekiq.rb b/spec/support/sidekiq.rb
index d143014692d..6c4e11910d3 100644
--- a/spec/support/sidekiq.rb
+++ b/spec/support/sidekiq.rb
@@ -1,7 +1,27 @@
require 'sidekiq/testing/inline'
+# If Sidekiq::Testing.inline! is used, SQL transactions done inside
+# Sidekiq worker are included in the SQL query limit (in a real
+# deployment sidekiq worker is executed separately). To avoid
+# increasing SQL limit counter, the request is marked as whitelisted
+# during Sidekiq block
+class DisableQueryLimit
+ def call(worker_instance, msg, queue)
+ transaction = Gitlab::QueryLimiting::Transaction.current
+
+ if !transaction.respond_to?(:whitelisted) || transaction.whitelisted
+ yield
+ else
+ transaction.whitelisted = true
+ yield
+ transaction.whitelisted = false
+ end
+ end
+end
+
Sidekiq::Testing.server_middleware do |chain|
chain.add Gitlab::SidekiqStatus::ServerMiddleware
+ chain.add DisableQueryLimit
end
RSpec.configure do |config|
diff --git a/spec/support/stored_repositories.rb b/spec/support/stored_repositories.rb
index 26f823cb6ef..55212355daa 100644
--- a/spec/support/stored_repositories.rb
+++ b/spec/support/stored_repositories.rb
@@ -1,30 +1,7 @@
RSpec.configure do |config|
- config.before(:all, :broken_storage) do
- FileUtils.rm_rf Gitlab.config.repositories.storages.broken.legacy_disk_path
- end
-
config.before(:each, :broken_storage) do
allow(Gitlab::GitalyClient).to receive(:call) do
raise GRPC::Unavailable.new('Gitaly broken in this spec')
end
-
- # Track the maximum number of failures
- first_failure = Time.parse("2017-11-14 17:52:30")
- last_failure = Time.parse("2017-11-14 18:54:37")
- failure_count = Gitlab::CurrentSettings.circuitbreaker_failure_count_threshold + 1
- cache_key = "#{Gitlab::Git::Storage::REDIS_KEY_PREFIX}broken:#{Gitlab::Environment.hostname}"
-
- Gitlab::Git::Storage.redis.with do |redis|
- redis.pipelined do
- redis.zadd(Gitlab::Git::Storage::REDIS_KNOWN_KEYS, 0, cache_key)
- redis.hset(cache_key, :first_failure, first_failure.to_i)
- redis.hset(cache_key, :last_failure, last_failure.to_i)
- redis.hset(cache_key, :failure_count, failure_count.to_i)
- end
- end
- end
-
- config.after(:each, :broken_storage) do
- Gitlab::Git::Storage.redis.with(&:flushall)
end
end
diff --git a/spec/support/stub_version.rb b/spec/support/stub_version.rb
new file mode 100644
index 00000000000..594ab64e7c6
--- /dev/null
+++ b/spec/support/stub_version.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+module StubVersion
+ def stub_version(version, revision)
+ stub_const('Gitlab::VERSION', version)
+ allow(Gitlab).to receive(:revision).and_return(revision)
+ end
+end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 3ba6caf1337..8c4360d4cf0 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -251,7 +251,7 @@ describe 'gitlab:app namespace rake task' do
allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
- # Avoid asking gitaly about the root ref (which will fail beacuse of the
+ # Avoid asking gitaly about the root ref (which will fail because of the
# mocked storages)
allow_any_instance_of(Repository).to receive(:empty?).and_return(false)
end
diff --git a/spec/tasks/gitlab/cleanup_rake_spec.rb b/spec/tasks/gitlab/cleanup_rake_spec.rb
index cc2cca10f58..19794227d9f 100644
--- a/spec/tasks/gitlab/cleanup_rake_spec.rb
+++ b/spec/tasks/gitlab/cleanup_rake_spec.rb
@@ -6,6 +6,8 @@ describe 'gitlab:cleanup rake tasks' do
end
describe 'cleanup namespaces and repos' do
+ let(:gitlab_shell) { Gitlab::Shell.new }
+ let(:storage) { storages.keys.first }
let(:storages) do
{
'default' => Gitlab::GitalyClient::StorageSettings.new(@default_storage_hash.merge('path' => 'tmp/tests/default_storage'))
@@ -17,53 +19,56 @@ describe 'gitlab:cleanup rake tasks' do
end
before do
- FileUtils.mkdir(Settings.absolute('tmp/tests/default_storage'))
allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
end
after do
- FileUtils.rm_rf(Settings.absolute('tmp/tests/default_storage'))
+ Gitlab::GitalyClient::StorageService.new(storage).delete_all_repositories
end
describe 'cleanup:repos' do
before do
- FileUtils.mkdir_p(Settings.absolute('tmp/tests/default_storage/broken/project.git'))
- FileUtils.mkdir_p(Settings.absolute('tmp/tests/default_storage/@hashed/12/34/5678.git'))
+ gitlab_shell.add_namespace(storage, 'broken/project.git')
+ gitlab_shell.add_namespace(storage, '@hashed/12/34/5678.git')
end
it 'moves it to an orphaned path' do
- run_rake_task('gitlab:cleanup:repos')
- repo_list = Dir['tmp/tests/default_storage/broken/*']
+ now = Time.now
+
+ Timecop.freeze(now) do
+ run_rake_task('gitlab:cleanup:repos')
+ repo_list = Gitlab::GitalyClient::StorageService.new(storage).list_directories(depth: 0)
- expect(repo_list.first).to include('+orphaned+')
+ expect(repo_list.last).to include("broken+orphaned+#{now.to_i}")
+ end
end
it 'ignores @hashed repos' do
run_rake_task('gitlab:cleanup:repos')
- expect(Dir.exist?(Settings.absolute('tmp/tests/default_storage/@hashed/12/34/5678.git'))).to be_truthy
+ expect(gitlab_shell.exists?(storage, '@hashed/12/34/5678.git')).to be(true)
end
end
describe 'cleanup:dirs' do
it 'removes missing namespaces' do
- FileUtils.mkdir_p(Settings.absolute("tmp/tests/default_storage/namespace_1/project.git"))
- FileUtils.mkdir_p(Settings.absolute("tmp/tests/default_storage/namespace_2/project.git"))
- allow(Namespace).to receive(:pluck).and_return('namespace_1')
+ gitlab_shell.add_namespace(storage, "namespace_1/project.git")
+ gitlab_shell.add_namespace(storage, "namespace_2/project.git")
+ allow(Namespace).to receive(:pluck).and_return(['namespace_1'])
stub_env('REMOVE', 'true')
run_rake_task('gitlab:cleanup:dirs')
- expect(Dir.exist?(Settings.absolute('tmp/tests/default_storage/namespace_1'))).to be_truthy
- expect(Dir.exist?(Settings.absolute('tmp/tests/default_storage/namespace_2'))).to be_falsey
+ expect(gitlab_shell.exists?(storage, 'namespace_1')).to be(true)
+ expect(gitlab_shell.exists?(storage, 'namespace_2')).to be(false)
end
it 'ignores @hashed directory' do
- FileUtils.mkdir_p(Settings.absolute('tmp/tests/default_storage/@hashed/12/34/5678.git'))
+ gitlab_shell.add_namespace(storage, '@hashed/12/34/5678.git')
run_rake_task('gitlab:cleanup:dirs')
- expect(Dir.exist?(Settings.absolute('tmp/tests/default_storage/@hashed/12/34/5678.git'))).to be_truthy
+ expect(gitlab_shell.exists?(storage, '@hashed/12/34/5678.git')).to be(true)
end
end
end
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index b81aea23306..5818892d56a 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -61,6 +61,39 @@ describe 'gitlab:db namespace rake task' do
expect(Rake::Task['db:migrate']).not_to receive(:invoke)
expect { run_rake_task('gitlab:db:configure') }.to raise_error(RuntimeError, 'error')
end
+
+ context 'SKIP_POST_DEPLOYMENT_MIGRATIONS environment variable set' do
+ let(:rails_paths) { { 'db' => ['db'], 'db/migrate' => ['db/migrate'] } }
+
+ before do
+ allow(ENV).to receive(:[]).and_call_original
+ allow(ENV).to receive(:[]).with('SKIP_POST_DEPLOYMENT_MIGRATIONS').and_return true
+
+ # Our environment has already been loaded, so we need to pretend like post_migrations were not
+ allow(Rails.application.config).to receive(:paths).and_return(rails_paths)
+ allow(ActiveRecord::Migrator).to receive(:migrations_paths).and_return(rails_paths['db/migrate'].dup)
+ end
+
+ it 'adds post deployment migrations before schema load if the schema is not already loaded' do
+ allow(ActiveRecord::Base.connection).to receive(:tables).and_return([])
+ expect(Gitlab::Database).to receive(:add_post_migrate_path_to_rails).and_call_original
+ expect(Rake::Task['db:schema:load']).to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+ expect(Rake::Task['db:migrate']).not_to receive(:invoke)
+ expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
+ expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(true)
+ end
+
+ it 'ignores post deployment migrations when schema has already been loaded' do
+ allow(ActiveRecord::Base.connection).to receive(:tables).and_return(%w[table1 table2])
+ expect(Rake::Task['db:migrate']).to receive(:invoke)
+ expect(Gitlab::Database).not_to receive(:add_post_migrate_path_to_rails)
+ expect(Rake::Task['db:schema:load']).not_to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
+ expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
+ expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(false)
+ end
+ end
end
def run_rake_task(task_name)
diff --git a/spec/tasks/gitlab/gitaly_rake_spec.rb b/spec/tasks/gitlab/gitaly_rake_spec.rb
index 4545226d78c..e6e4d9504d9 100644
--- a/spec/tasks/gitlab/gitaly_rake_spec.rb
+++ b/spec/tasks/gitlab/gitaly_rake_spec.rb
@@ -8,13 +8,23 @@ describe 'gitlab:gitaly namespace rake task' do
describe 'install' do
let(:repo) { 'https://gitlab.com/gitlab-org/gitaly.git' }
let(:clone_path) { Rails.root.join('tmp/tests/gitaly').to_s }
+ let(:storage_path) { Rails.root.join('tmp/tests/repositories').to_s }
let(:version) { File.read(Rails.root.join(Gitlab::GitalyClient::SERVER_VERSION_FILE)).chomp }
+ subject { run_rake_task('gitlab:gitaly:install', clone_path, storage_path) }
+
context 'no dir given' do
it 'aborts and display a help message' do
# avoid writing task output to spec progress
allow($stderr).to receive :write
- expect { run_rake_task('gitlab:gitaly:install') }.to raise_error /Please specify the directory where you want to install gitaly/
+ expect { run_rake_task('gitlab:gitaly:install') }.to raise_error /Please specify the directory where you want to install gitaly and the path for the default storage/
+ end
+ end
+
+ context 'no storage path given' do
+ it 'aborts and display a help message' do
+ allow($stderr).to receive :write
+ expect { run_rake_task('gitlab:gitaly:install', clone_path) }.to raise_error /Please specify the directory where you want to install gitaly and the path for the default storage/
end
end
@@ -23,7 +33,7 @@ describe 'gitlab:gitaly namespace rake task' do
expect(main_object)
.to receive(:checkout_or_clone_version).and_raise 'Git error'
- expect { run_rake_task('gitlab:gitaly:install', clone_path) }.to raise_error 'Git error'
+ expect { subject }.to raise_error 'Git error'
end
end
@@ -36,7 +46,7 @@ describe 'gitlab:gitaly namespace rake task' do
expect(main_object)
.to receive(:checkout_or_clone_version).with(version: version, repo: repo, target_dir: clone_path)
- run_rake_task('gitlab:gitaly:install', clone_path)
+ subject
end
end
@@ -59,7 +69,7 @@ describe 'gitlab:gitaly namespace rake task' do
expect(Gitlab::Popen).to receive(:popen).with(%w[which gmake]).and_return(['/usr/bin/gmake', 0])
expect(main_object).to receive(:run_command!).with(command_preamble + %w[gmake]).and_return(true)
- run_rake_task('gitlab:gitaly:install', clone_path)
+ subject
end
end
@@ -72,7 +82,7 @@ describe 'gitlab:gitaly namespace rake task' do
it 'calls make in the gitaly directory' do
expect(main_object).to receive(:run_command!).with(command_preamble + %w[make]).and_return(true)
- run_rake_task('gitlab:gitaly:install', clone_path)
+ subject
end
context 'when Rails.env is test' do
@@ -89,55 +99,10 @@ describe 'gitlab:gitaly namespace rake task' do
it 'calls make in the gitaly directory with --no-deployment flag for bundle' do
expect(main_object).to receive(:run_command!).with(command_preamble + command).and_return(true)
- run_rake_task('gitlab:gitaly:install', clone_path)
+ subject
end
end
end
end
end
-
- describe 'storage_config' do
- it 'prints storage configuration in a TOML format' do
- config = {
- 'default' => Gitlab::GitalyClient::StorageSettings.new(
- 'path' => '/path/to/default',
- 'gitaly_address' => 'unix:/path/to/my.socket'
- ),
- 'nfs_01' => Gitlab::GitalyClient::StorageSettings.new(
- 'path' => '/path/to/nfs_01',
- 'gitaly_address' => 'unix:/path/to/my.socket'
- )
- }
- allow(Gitlab.config.repositories).to receive(:storages).and_return(config)
- allow(Rails.env).to receive(:test?).and_return(false)
-
- expected_output = ''
- Timecop.freeze do
- expected_output = <<~TOML
- # Gitaly storage configuration generated from #{Gitlab.config.source} on #{Time.current.to_s(:long)}
- # This is in TOML format suitable for use in Gitaly's config.toml file.
- bin_dir = "tmp/tests/gitaly"
- socket_path = "/path/to/my.socket"
- [gitlab-shell]
- dir = "#{Gitlab.config.gitlab_shell.path}"
- [[storage]]
- name = "default"
- path = "/path/to/default"
- [[storage]]
- name = "nfs_01"
- path = "/path/to/nfs_01"
- TOML
- end
-
- expect { run_rake_task('gitlab:gitaly:storage_config')}
- .to output(expected_output).to_stdout
-
- parsed_output = TomlRB.parse(expected_output)
- config.each do |name, params|
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- expect(parsed_output['storage']).to include({ 'name' => name, 'path' => params.legacy_disk_path })
- end
- end
- end
- end
end
diff --git a/spec/tasks/gitlab/site_statistics_rake_spec.rb b/spec/tasks/gitlab/site_statistics_rake_spec.rb
new file mode 100644
index 00000000000..c43ce25a540
--- /dev/null
+++ b/spec/tasks/gitlab/site_statistics_rake_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+require 'rake_helper'
+
+describe 'rake gitlab:refresh_site_statistics' do
+ before do
+ Rake.application.rake_require 'tasks/gitlab/site_statistics'
+
+ create(:project)
+ SiteStatistic.fetch.update(repositories_count: 0)
+ end
+
+ let(:task) { 'gitlab:refresh_site_statistics' }
+
+ it 'recalculates existing counters' do
+ run_rake_task(task)
+
+ expect(SiteStatistic.fetch.repositories_count).to eq(1)
+ end
+
+ it 'displays message listing counters' do
+ expect { run_rake_task(task) }.to output(/Updating Site Statistics counters:.* Repositories\.\.\. OK!/m).to_stdout
+ end
+end
diff --git a/spec/tasks/gitlab/traces_rake_spec.rb b/spec/tasks/gitlab/traces_rake_spec.rb
index bd18e8ffc1e..aaf0d7242dd 100644
--- a/spec/tasks/gitlab/traces_rake_spec.rb
+++ b/spec/tasks/gitlab/traces_rake_spec.rb
@@ -5,51 +5,109 @@ describe 'gitlab:traces rake tasks' do
Rake.application.rake_require 'tasks/gitlab/traces'
end
- shared_examples 'passes the job id to worker' do
- it do
- expect(ArchiveTraceWorker).to receive(:bulk_perform_async).with([[job.id]])
+ describe 'gitlab:traces:archive' do
+ shared_examples 'passes the job id to worker' do
+ it do
+ expect(ArchiveTraceWorker).to receive(:bulk_perform_async).with([[job.id]])
- run_rake_task('gitlab:traces:archive')
+ run_rake_task('gitlab:traces:archive')
+ end
end
- end
- shared_examples 'does not pass the job id to worker' do
- it do
- expect(ArchiveTraceWorker).not_to receive(:bulk_perform_async)
+ shared_examples 'does not pass the job id to worker' do
+ it do
+ expect(ArchiveTraceWorker).not_to receive(:bulk_perform_async)
- run_rake_task('gitlab:traces:archive')
+ run_rake_task('gitlab:traces:archive')
+ end
end
- end
- context 'when trace file stored in default path' do
- let!(:job) { create(:ci_build, :success, :trace_live) }
+ context 'when trace file stored in default path' do
+ let!(:job) { create(:ci_build, :success, :trace_live) }
- it_behaves_like 'passes the job id to worker'
- end
+ it_behaves_like 'passes the job id to worker'
+ end
- context 'when trace is stored in database' do
- let!(:job) { create(:ci_build, :success) }
+ context 'when trace is stored in database' do
+ let!(:job) { create(:ci_build, :success) }
- before do
- job.update_column(:trace, 'trace in db')
+ before do
+ job.update_column(:trace, 'trace in db')
+ end
+
+ it_behaves_like 'passes the job id to worker'
end
- it_behaves_like 'passes the job id to worker'
+ context 'when job has trace artifact' do
+ let!(:job) { create(:ci_build, :success) }
+
+ before do
+ create(:ci_job_artifact, :trace, job: job)
+ end
+
+ it_behaves_like 'does not pass the job id to worker'
+ end
+
+ context 'when job is not finished yet' do
+ let!(:build) { create(:ci_build, :running, :trace_live) }
+
+ it_behaves_like 'does not pass the job id to worker'
+ end
end
- context 'when job has trace artifact' do
- let!(:job) { create(:ci_build, :success) }
+ describe 'gitlab:traces:migrate' do
+ let(:object_storage_enabled) { false }
before do
- create(:ci_job_artifact, :trace, job: job)
+ stub_artifacts_object_storage(enabled: object_storage_enabled)
end
- it_behaves_like 'does not pass the job id to worker'
- end
+ subject { run_rake_task('gitlab:traces:migrate') }
- context 'when job is not finished yet' do
- let!(:build) { create(:ci_build, :running, :trace_live) }
+ let!(:job_trace) { create(:ci_job_artifact, :trace, file_store: store) }
- it_behaves_like 'does not pass the job id to worker'
+ context 'when local storage is used' do
+ let(:store) { ObjectStorage::Store::LOCAL }
+
+ context 'and job does not have file store defined' do
+ let(:object_storage_enabled) { true }
+ let(:store) { nil }
+
+ it "migrates file to remote storage" do
+ subject
+
+ expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
+ end
+ end
+
+ context 'and remote storage is defined' do
+ let(:object_storage_enabled) { true }
+
+ it "migrates file to remote storage" do
+ subject
+
+ expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
+ end
+ end
+
+ context 'and remote storage is not defined' do
+ it "fails to migrate to remote storage" do
+ subject
+
+ expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
+ end
+ end
+ end
+
+ context 'when remote storage is used' do
+ let(:object_storage_enabled) { true }
+ let(:store) { ObjectStorage::Store::REMOTE }
+
+ it "file stays on remote storage" do
+ subject
+
+ expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
+ end
+ end
end
end
diff --git a/spec/tasks/gitlab/uploads/migrate_rake_spec.rb b/spec/tasks/gitlab/uploads/migrate_rake_spec.rb
index 6fcfae358ec..9588e8be5dc 100644
--- a/spec/tasks/gitlab/uploads/migrate_rake_spec.rb
+++ b/spec/tasks/gitlab/uploads/migrate_rake_spec.rb
@@ -38,14 +38,6 @@ describe 'gitlab:uploads:migrate rake tasks' do
let!(:projects) { create_list(:project, 10, :with_avatar) }
it_behaves_like 'enqueue jobs in batch', batch: 4
-
- context 'Upload has store = nil' do
- before do
- Upload.where(model: projects).update_all(store: nil)
- end
-
- it_behaves_like 'enqueue jobs in batch', batch: 4
- end
end
context "for Group" do
diff --git a/spec/uploaders/avatar_uploader_spec.rb b/spec/uploaders/avatar_uploader_spec.rb
index b0468bc35ff..6aaec7a4fef 100644
--- a/spec/uploaders/avatar_uploader_spec.rb
+++ b/spec/uploaders/avatar_uploader_spec.rb
@@ -35,5 +35,13 @@ describe AvatarUploader do
it_behaves_like "migrates", to_store: described_class::Store::REMOTE
it_behaves_like "migrates", from_store: described_class::Store::REMOTE, to_store: described_class::Store::LOCAL
+
+ it 'sets the right absolute path' do
+ storage_path = Gitlab.config.uploads.storage_path
+ absolute_path = File.join(storage_path, upload.path)
+
+ expect(uploader.absolute_path.scan(storage_path).size).to eq(1)
+ expect(uploader.absolute_path).to eq(absolute_path)
+ end
end
end
diff --git a/spec/uploaders/file_uploader_spec.rb b/spec/uploaders/file_uploader_spec.rb
index 7e24efda5dd..c74e0bf1955 100644
--- a/spec/uploaders/file_uploader_spec.rb
+++ b/spec/uploaders/file_uploader_spec.rb
@@ -81,19 +81,24 @@ describe FileUploader do
end
describe 'copy_to' do
+ let(:new_project) { create(:project) }
+ let(:moved) { described_class.copy_to(subject, new_project) }
+
shared_examples 'returns a valid uploader' do
describe 'returned uploader' do
- let(:new_project) { create(:project) }
- let(:moved) { described_class.copy_to(subject, new_project) }
-
it 'generates a new secret' do
expect(subject).to be
expect(described_class).to receive(:generate_secret).once.and_call_original
expect(moved).to be
end
- it 'create new upload' do
- expect(moved.upload).not_to eq(subject.upload)
+ it 'creates new upload correctly' do
+ upload = moved.upload
+
+ expect(upload).not_to eq(subject.upload)
+ expect(upload.model).to eq(new_project)
+ expect(upload.uploader).to eq('FileUploader')
+ expect(upload.secret).not_to eq(subject.upload.secret)
end
it 'copies the file' do
@@ -111,6 +116,12 @@ describe FileUploader do
end
include_examples 'returns a valid uploader'
+
+ it 'copies the file to the correct location' do
+ expect(moved.upload.path).to eq("#{moved.upload.secret}/dk.png")
+ expect(moved.file.path).to end_with("public/uploads/#{new_project.disk_path}/#{moved.upload.secret}/dk.png")
+ expect(moved.filename).to eq('dk.png')
+ end
end
context 'files are stored remotely' do
@@ -121,6 +132,12 @@ describe FileUploader do
end
include_examples 'returns a valid uploader'
+
+ it 'copies the file to the correct location' do
+ expect(moved.upload.path).to eq("#{new_project.disk_path}/#{moved.upload.secret}/dk.png")
+ expect(moved.file.path).to eq("#{new_project.disk_path}/#{moved.upload.secret}/dk.png")
+ expect(moved.filename).to eq('dk.png')
+ end
end
end
diff --git a/spec/uploaders/job_artifact_uploader_spec.rb b/spec/uploaders/job_artifact_uploader_spec.rb
index 3ad5fe7e3b3..061432f082a 100644
--- a/spec/uploaders/job_artifact_uploader_spec.rb
+++ b/spec/uploaders/job_artifact_uploader_spec.rb
@@ -40,6 +40,53 @@ describe JobArtifactUploader do
it { is_expected.to end_with("ci_build_artifacts.zip") }
end
+ describe '#dynamic_segment' do
+ let(:uploaded_content) { File.binread(Rails.root + 'spec/fixtures/ci_build_artifacts.zip') }
+ let(:model) { uploader.model }
+
+ shared_examples_for 'Read file from legacy path' do
+ it 'store_path returns the legacy path' do
+ expect(model.file.store_path).to eq(File.join(model.created_at.utc.strftime('%Y_%m'), model.project_id.to_s, model.job_id.to_s, 'ci_build_artifacts.zip'))
+ end
+
+ it 'has exactly the same content' do
+ expect(::File.binread(model.file.path)).to eq(uploaded_content)
+ end
+ end
+
+ shared_examples_for 'Read file from hashed path' do
+ it 'store_path returns hashed path' do
+ expect(model.file.store_path).to eq(File.join(disk_hash[0..1], disk_hash[2..3], disk_hash, creation_date, model.job_id.to_s, model.id.to_s, 'ci_build_artifacts.zip'))
+ end
+
+ it 'has exactly the same content' do
+ expect(::File.binread(model.file.path)).to eq(uploaded_content)
+ end
+ end
+
+ context 'when a job artifact is stored in legacy_path' do
+ let(:job_artifact) { create(:ci_job_artifact, :legacy_archive) }
+
+ it_behaves_like 'Read file from legacy path'
+ end
+
+ context 'when the artifact file is stored in hashed_path' do
+ let(:job_artifact) { create(:ci_job_artifact, :archive) }
+ let(:disk_hash) { Digest::SHA2.hexdigest(model.project_id.to_s) }
+ let(:creation_date) { model.created_at.utc.strftime('%Y_%m_%d') }
+
+ it_behaves_like 'Read file from hashed path'
+
+ context 'when file_location column is empty' do
+ before do
+ job_artifact.update_column(:file_location, nil)
+ end
+
+ it_behaves_like 'Read file from hashed path'
+ end
+ end
+ end
+
describe "#migrate!" do
before do
uploader.store!(fixture_file_upload('spec/fixtures/trace/sample_trace'))
diff --git a/spec/uploaders/namespace_file_uploader_spec.rb b/spec/uploaders/namespace_file_uploader_spec.rb
index 71fe2c353c0..d09725ee4be 100644
--- a/spec/uploaders/namespace_file_uploader_spec.rb
+++ b/spec/uploaders/namespace_file_uploader_spec.rb
@@ -26,6 +26,26 @@ describe NamespaceFileUploader do
upload_path: IDENTIFIER
end
+ context '.base_dir' do
+ it 'returns local storage base_dir without store param' do
+ expect(described_class.base_dir(group)).to eq("uploads/-/system/namespace/#{group.id}")
+ end
+
+ it 'returns local storage base_dir when store param is Store::LOCAL' do
+ expect(described_class.base_dir(group, ObjectStorage::Store::LOCAL)).to eq("uploads/-/system/namespace/#{group.id}")
+ end
+
+ it 'returns remote base_dir when store param is Store::REMOTE' do
+ expect(described_class.base_dir(group, ObjectStorage::Store::REMOTE)).to eq("namespace/#{group.id}")
+ end
+ end
+
+ describe '#workhorse_local_upload_path' do
+ it 'returns the correct path in uploads directory' do
+ expect(described_class.workhorse_local_upload_path).to end_with('/uploads/tmp/uploads')
+ end
+ end
+
describe "#migrate!" do
before do
uploader.store!(fixture_file_upload(File.join('spec/fixtures/doc_sample.txt')))
@@ -35,4 +55,62 @@ describe NamespaceFileUploader do
it_behaves_like "migrates", to_store: described_class::Store::REMOTE
it_behaves_like "migrates", from_store: described_class::Store::REMOTE, to_store: described_class::Store::LOCAL
end
+
+ describe 'copy_to' do
+ let(:group) { create(:group) }
+ let(:moved) { described_class.copy_to(subject, group) }
+
+ shared_examples 'returns a valid uploader' do
+ it 'generates a new secret' do
+ expect(subject).to be
+ expect(described_class).to receive(:generate_secret).once.and_call_original
+ expect(moved).to be
+ end
+
+ it 'creates new upload correctly' do
+ upload = moved.upload
+
+ expect(upload).not_to eq(subject.upload)
+ expect(upload.model).to eq(group)
+ expect(upload.uploader).to eq('NamespaceFileUploader')
+ expect(upload.secret).not_to eq(subject.upload.secret)
+ end
+
+ it 'copies the file' do
+ expect(subject.file).to exist
+ expect(moved.file).to exist
+ expect(subject.file).not_to eq(moved.file)
+ expect(subject.object_store).to eq(moved.object_store)
+ end
+ end
+
+ context 'files are stored locally' do
+ before do
+ subject.store!(fixture_file_upload('spec/fixtures/dk.png'))
+ end
+
+ include_examples 'returns a valid uploader'
+
+ it 'copies the file to the correct location' do
+ expect(moved.upload.path).to eq("#{moved.upload.secret}/dk.png")
+ expect(moved.file.path).to end_with("system/namespace/#{group.id}/#{moved.upload.secret}/dk.png")
+ expect(moved.filename).to eq('dk.png')
+ end
+ end
+
+ context 'files are stored remotely' do
+ before do
+ stub_uploads_object_storage
+ subject.store!(fixture_file_upload('spec/fixtures/dk.png'))
+ subject.migrate!(ObjectStorage::Store::REMOTE)
+ end
+
+ include_examples 'returns a valid uploader'
+
+ it 'copies the file to the correct location' do
+ expect(moved.file.path).to eq("namespace/#{group.id}/#{moved.upload.secret}/dk.png")
+ expect(moved.filename).to eq('dk.png')
+ end
+ end
+ end
end
diff --git a/spec/uploaders/uploader_helper_spec.rb b/spec/uploaders/uploader_helper_spec.rb
index 33da93cc9d0..fd6712d4645 100644
--- a/spec/uploaders/uploader_helper_spec.rb
+++ b/spec/uploaders/uploader_helper_spec.rb
@@ -11,27 +11,10 @@ describe UploaderHelper do
example_uploader.new
end
- def upload_fixture(filename)
- fixture_file_upload(File.join('spec', 'fixtures', filename))
- end
-
- describe '#image_or_video?' do
- it 'returns true for an image file' do
- uploader.store!(upload_fixture('dk.png'))
-
- expect(uploader).to be_image_or_video
- end
-
- it 'it returns true for a video file' do
- uploader.store!(upload_fixture('video_sample.mp4'))
-
- expect(uploader).to be_image_or_video
- end
-
- it 'returns false for other extensions' do
- uploader.store!(upload_fixture('doc_sample.txt'))
-
- expect(uploader).not_to be_image_or_video
+ describe '#extension_match?' do
+ it 'returns false if file does not exists' do
+ expect(uploader.file).to be_nil
+ expect(uploader.send(:extension_match?, 'jpg')).to eq false
end
end
end
diff --git a/spec/validators/branch_filter_validator_spec.rb b/spec/validators/branch_filter_validator_spec.rb
new file mode 100644
index 00000000000..3be54827431
--- /dev/null
+++ b/spec/validators/branch_filter_validator_spec.rb
@@ -0,0 +1,42 @@
+require 'spec_helper'
+
+describe BranchFilterValidator do
+ let(:validator) { described_class.new(attributes: [:push_events_branch_filter]) }
+ let(:hook) { build(:project_hook) }
+
+ describe '#validates_each' do
+ it 'allows valid branch names' do
+ validator.validate_each(hook, :push_events_branch_filter, "good_branch_name")
+ validator.validate_each(hook, :push_events_branch_filter, "another/good_branch_name")
+ expect(hook.errors.empty?).to be true
+ end
+
+ it 'disallows bad branch names' do
+ validator.validate_each(hook, :push_events_branch_filter, "bad branch~name")
+ expect(hook.errors[:push_events_branch_filter].empty?).to be false
+ end
+
+ it 'allows wildcards' do
+ validator.validate_each(hook, :push_events_branch_filter, "features/*")
+ validator.validate_each(hook, :push_events_branch_filter, "features/*/bla")
+ validator.validate_each(hook, :push_events_branch_filter, "*-stable")
+ expect(hook.errors.empty?).to be true
+ end
+
+ it 'gets rid of whitespace' do
+ filter = ' master '
+ validator.validate_each(hook, :push_events_branch_filter, filter)
+
+ expect(filter).to eq 'master'
+ end
+
+ # Branch names can be quite long but in practice aren't over 255 so 4000 should
+ # be enough space for a list of branch names but we can increase if needed.
+ it 'limits length to 4000 chars' do
+ filter = 'a' * 4001
+ validator.validate_each(hook, :push_events_branch_filter, filter)
+
+ expect(hook.errors[:push_events_branch_filter].empty?).to be false
+ end
+ end
+end
diff --git a/spec/validators/js_regex_validator_spec.rb b/spec/validators/js_regex_validator_spec.rb
new file mode 100644
index 00000000000..aeb55cdc0e5
--- /dev/null
+++ b/spec/validators/js_regex_validator_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe JsRegexValidator do
+ describe '#validates_each' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:validator) { described_class.new(attributes: [:user_default_internal_regex]) }
+ let(:application_setting) { build(:application_setting, user_default_external: true) }
+
+ where(:user_default_internal_regex, :result) do
+ nil | []
+ '' | []
+ '(?#comment)' | ['Regex Pattern (?#comment) can not be expressed in Javascript']
+ '(?(a)b|c)' | ['invalid conditional pattern: /(?(a)b|c)/i']
+ '[a-z&&[^uo]]' | ["Dropped unsupported set intersection '[a-z&&[^uo]]' at index 0",
+ "Dropped unsupported nested negative set data '[^uo]' at index 6"]
+ end
+
+ with_them do
+ it 'generates correct errors' do
+ validator.validate_each(application_setting, :user_default_internal_regex, user_default_internal_regex)
+
+ expect(application_setting.errors[:user_default_internal_regex]).to eq result
+ end
+ end
+ end
+end
diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb
index 93fe013d11c..ab6100509a6 100644
--- a/spec/validators/url_validator_spec.rb
+++ b/spec/validators/url_validator_spec.rb
@@ -24,6 +24,21 @@ describe UrlValidator do
expect(badge.errors.empty?).to be true
end
+
+ it 'strips urls' do
+ badge.link_url = "\n\r\n\nhttps://127.0.0.1\r\n\r\n\n\n\n"
+
+ # It's unusual for a validator to modify its arguments. Some extensions,
+ # such as attr_encrypted, freeze the string to signal that modifications
+ # will not be persisted, so freeze this string to ensure the scheme is
+ # compatible with them.
+ badge.link_url.freeze
+
+ subject
+
+ expect(badge.errors).to be_empty
+ expect(badge.link_url).to eq('https://127.0.0.1')
+ end
end
context 'when allow_localhost is set to false' do
diff --git a/spec/views/help/index.html.haml_spec.rb b/spec/views/help/index.html.haml_spec.rb
index 836d452304c..34e93d929a7 100644
--- a/spec/views/help/index.html.haml_spec.rb
+++ b/spec/views/help/index.html.haml_spec.rb
@@ -1,11 +1,18 @@
+# frozen_string_literal: true
+
require 'rails_helper'
describe 'help/index' do
+ include StubVersion
+
describe 'version information' do
+ before do
+ stub_helpers
+ end
+
it 'is hidden from guests' do
stub_user(nil)
stub_version('8.0.2', 'abcdefg')
- stub_helpers
render
@@ -13,15 +20,28 @@ describe 'help/index' do
expect(rendered).not_to match 'abcdefg'
end
- it 'is shown to users' do
- stub_user
- stub_version('8.0.2', 'abcdefg')
- stub_helpers
+ context 'when logged in' do
+ before do
+ stub_user
+ end
- render
+ it 'shows a link to the tag to users' do
+ stub_version('8.0.2', 'abcdefg')
+
+ render
+
+ expect(rendered).to match '8.0.2'
+ expect(rendered).to have_link('8.0.2', href: %r{https://gitlab.com/gitlab-org/gitlab-(ce|ee)/tags/v8.0.2})
+ end
+
+ it 'shows a link to the commit for pre-releases' do
+ stub_version('8.0.2-pre', 'abcdefg')
- expect(rendered).to match '8.0.2'
- expect(rendered).to have_link('abcdefg', 'https://gitlab.com/gitlab-org/gitlab-ce/commits/abcdefg')
+ render
+
+ expect(rendered).to match '8.0.2'
+ expect(rendered).to have_link('abcdefg', href: %r{https://gitlab.com/gitlab-org/gitlab-(ce|ee)/commits/abcdefg})
+ end
end
end
@@ -29,7 +49,7 @@ describe 'help/index' do
it 'is visible to guests' do
render
- expect(rendered).to have_link(nil, help_instance_configuration_url)
+ expect(rendered).to have_link(nil, href: help_instance_configuration_url)
end
end
@@ -37,11 +57,6 @@ describe 'help/index' do
allow(view).to receive(:user_signed_in?).and_return(user)
end
- def stub_version(version, revision)
- stub_const('Gitlab::VERSION', version)
- allow(Gitlab).to receive(:revision).and_return(revision)
- end
-
def stub_helpers
allow(view).to receive(:markdown).and_return('')
allow(view).to receive(:version_status_badge).and_return('')
diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb
index b56940a9613..fc1fe5739c3 100644
--- a/spec/views/projects/_home_panel.html.haml_spec.rb
+++ b/spec/views/projects/_home_panel.html.haml_spec.rb
@@ -9,6 +9,7 @@ describe 'projects/_home_panel' do
allow(view).to receive(:current_user).and_return(user)
allow(view).to receive(:can?).with(user, :read_project, project).and_return(false)
+ allow(project).to receive(:license_anchor_data).and_return(false)
end
context 'when user is signed in' do
@@ -63,6 +64,7 @@ describe 'projects/_home_panel' do
allow(view).to receive(:current_user).and_return(user)
allow(view).to receive(:can?).with(user, :read_project, project).and_return(false)
+ allow(project).to receive(:license_anchor_data).and_return(false)
end
context 'has no badges' do
@@ -71,8 +73,7 @@ describe 'projects/_home_panel' do
it 'should not render any badge' do
render
- expect(rendered).to have_selector('.project-badges')
- expect(rendered).not_to have_selector('.project-badges > a')
+ expect(rendered).not_to have_selector('.project-badges')
end
end
@@ -118,6 +119,7 @@ describe 'projects/_home_panel' do
assign(:project, project)
allow(view).to receive(:current_user).and_return(user)
+ allow(project).to receive(:license_anchor_data).and_return(false)
end
context 'user can read project' do
diff --git a/spec/views/projects/blob/_viewer.html.haml_spec.rb b/spec/views/projects/blob/_viewer.html.haml_spec.rb
index aedbaa66d34..95f7f87d37b 100644
--- a/spec/views/projects/blob/_viewer.html.haml_spec.rb
+++ b/spec/views/projects/blob/_viewer.html.haml_spec.rb
@@ -29,6 +29,8 @@ describe 'projects/blob/_viewer.html.haml' do
controller.params[:namespace_id] = project.namespace.to_param
controller.params[:project_id] = project.to_param
controller.params[:id] = File.join('master', blob.path)
+
+ allow(project.repository).to receive(:gitattribute).and_return(nil)
end
def render_view
diff --git a/spec/views/projects/jobs/show.html.haml_spec.rb b/spec/views/projects/jobs/show.html.haml_spec.rb
index c93152b88e3..e06a9ecb98b 100644
--- a/spec/views/projects/jobs/show.html.haml_spec.rb
+++ b/spec/views/projects/jobs/show.html.haml_spec.rb
@@ -18,161 +18,6 @@ describe 'projects/jobs/show' do
allow(view).to receive(:can?).and_return(true)
end
- describe 'environment info in job view' do
- context 'job with latest deployment' do
- let(:build) do
- create(:ci_build, :success, :trace_artifact, environment: 'staging')
- end
-
- before do
- create(:environment, name: 'staging')
- create(:deployment, deployable: build)
- end
-
- it 'shows deployment message' do
- expected_text = 'This job is the most recent deployment'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- end
- end
-
- context 'job with outdated deployment' do
- let(:build) do
- create(:ci_build, :success, :trace_artifact, environment: 'staging', pipeline: pipeline)
- end
-
- let(:second_build) do
- create(:ci_build, :success, :trace_artifact, environment: 'staging', pipeline: pipeline)
- end
-
- let(:environment) do
- create(:environment, name: 'staging', project: project)
- end
-
- let!(:first_deployment) do
- create(:deployment, environment: environment, deployable: build)
- end
-
- let!(:second_deployment) do
- create(:deployment, environment: environment, deployable: second_build)
- end
-
- it 'shows deployment message' do
- expected_text = 'This job is an out-of-date deployment ' \
- "to staging.\nView the most recent deployment ##{second_deployment.iid}."
- render
-
- expect(rendered).to have_css('.environment-information', text: expected_text)
- end
- end
-
- context 'job failed to deploy' do
- let(:build) do
- create(:ci_build, :failed, :trace_artifact, environment: 'staging', pipeline: pipeline)
- end
-
- let!(:environment) do
- create(:environment, name: 'staging', project: project)
- end
-
- it 'shows deployment message' do
- expected_text = 'The deployment of this job to staging did not succeed.'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- end
- end
-
- context 'job will deploy' do
- let(:build) do
- create(:ci_build, :running, :trace_live, environment: 'staging', pipeline: pipeline)
- end
-
- context 'when environment exists' do
- let!(:environment) do
- create(:environment, name: 'staging', project: project)
- end
-
- it 'shows deployment message' do
- expected_text = 'This job is creating a deployment to staging'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- end
-
- context 'when it has deployment' do
- let!(:deployment) do
- create(:deployment, environment: environment)
- end
-
- it 'shows that deployment will be overwritten' do
- expected_text = 'This job is creating a deployment to staging'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- expect(rendered).to have_css(
- '.environment-information', text: 'latest deployment')
- end
- end
- end
-
- context 'when environment does not exist' do
- it 'shows deployment message' do
- expected_text = 'This job is creating a deployment to staging'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- expect(rendered).not_to have_css(
- '.environment-information', text: 'latest deployment')
- end
- end
- end
-
- context 'job that failed to deploy and environment has not been created' do
- let(:build) do
- create(:ci_build, :failed, :trace_artifact, environment: 'staging', pipeline: pipeline)
- end
-
- let!(:environment) do
- create(:environment, name: 'staging', project: project)
- end
-
- it 'shows deployment message' do
- expected_text = 'The deployment of this job to staging did not succeed'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- end
- end
-
- context 'job that will deploy and environment has not been created' do
- let(:build) do
- create(:ci_build, :running, :trace_live, environment: 'staging', pipeline: pipeline)
- end
-
- let!(:environment) do
- create(:environment, name: 'staging', project: project)
- end
-
- it 'shows deployment message' do
- expected_text = 'This job is creating a deployment to staging'
- render
-
- expect(rendered).to have_css(
- '.environment-information', text: expected_text)
- expect(rendered).not_to have_css(
- '.environment-information', text: 'latest deployment')
- end
- end
- end
-
context 'when job is running' do
let(:build) { create(:ci_build, :trace_live, :running, pipeline: pipeline) }
@@ -188,40 +33,4 @@ describe 'projects/jobs/show' do
expect(rendered).not_to have_link('New issue')
end
end
-
- context 'when incomplete trigger_request is used' do
- before do
- build.trigger_request = FactoryBot.build(:ci_trigger_request, trigger: nil)
- end
-
- it 'test should not render token block' do
- render
-
- expect(rendered).not_to have_content('Token')
- end
- end
-
- context 'when complete trigger_request is used' do
- before do
- build.trigger_request = FactoryBot.build(:ci_trigger_request)
- end
-
- it 'should render token' do
- render
-
- expect(rendered).to have_content('Token')
- expect(rendered).to have_content(build.trigger_request.trigger.short_token)
- end
- end
-
- describe 'commit title in sidebar' do
- let(:commit_title) { project.commit.title }
-
- it 'shows commit title and not show commit message' do
- render
-
- expect(rendered).to have_css('p.build-light-text.append-bottom-0',
- text: /\A\n#{Regexp.escape(commit_title)}\n\Z/)
- end
- end
end
diff --git a/spec/views/projects/merge_requests/_commits.html.haml_spec.rb b/spec/views/projects/merge_requests/_commits.html.haml_spec.rb
index b1c6565c08a..a7628548de6 100644
--- a/spec/views/projects/merge_requests/_commits.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/_commits.html.haml_spec.rb
@@ -20,6 +20,7 @@ describe 'projects/merge_requests/_commits.html.haml' do
assign(:merge_request, merge_request)
assign(:commits, merge_request.commits)
+ assign(:hidden_commit_count, 0)
end
it 'shows commits from source project' do
@@ -30,4 +31,16 @@ describe 'projects/merge_requests/_commits.html.haml' do
expect(rendered).to have_link(href: href)
end
+
+ context 'when there are hidden commits' do
+ before do
+ assign(:hidden_commit_count, 1)
+ end
+
+ it 'shows notice about omitted commits' do
+ render
+
+ expect(rendered).to match(/1 additional commit has been omitted to prevent performance issues/)
+ end
+ end
end
diff --git a/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb b/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
index 9ab105c3238..0206928a211 100644
--- a/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
@@ -9,7 +9,10 @@ describe 'projects/merge_requests/creations/_new_submit.html.haml' do
assign(:merge_request, merge_request)
assign(:commits, merge_request.commits)
+ assign(:hidden_commit_count, 0)
+ assign(:total_commit_count, merge_request.commits.count)
assign(:project, merge_request.target_project)
+ assign(:mr_presenter, merge_request.present(current_user: merge_request.author))
allow(view).to receive(:can?).and_return(true)
allow(view).to receive(:url_for).and_return('#')
@@ -29,4 +32,17 @@ describe 'projects/merge_requests/creations/_new_submit.html.haml' do
expect(rendered).not_to have_text('Builds')
end
end
+
+ context 'when there are hidden commits' do
+ before do
+ assign(:pipelines, Ci::Pipeline.none)
+ assign(:hidden_commit_count, 2)
+ end
+
+ it 'shows notice about omitted commits' do
+ render
+
+ expect(rendered).to match(/2 additional commits have been omitted to prevent performance issues/)
+ end
+ end
end
diff --git a/spec/views/projects/merge_requests/edit.html.haml_spec.rb b/spec/views/projects/merge_requests/edit.html.haml_spec.rb
index 9b74a7e1946..c13eab30054 100644
--- a/spec/views/projects/merge_requests/edit.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/edit.html.haml_spec.rb
@@ -24,6 +24,7 @@ describe 'projects/merge_requests/edit.html.haml' do
before do
assign(:project, project)
assign(:merge_request, closed_merge_request)
+ assign(:mr_presenter, closed_merge_request.present(current_user: user))
allow(view).to receive(:can?).and_return(true)
allow(view).to receive(:current_user)
diff --git a/spec/views/projects/notes/_more_actions_dropdown.html.haml_spec.rb b/spec/views/projects/notes/_more_actions_dropdown.html.haml_spec.rb
index 9c0be249a50..8a9ab02eaca 100644
--- a/spec/views/projects/notes/_more_actions_dropdown.html.haml_spec.rb
+++ b/spec/views/projects/notes/_more_actions_dropdown.html.haml_spec.rb
@@ -12,10 +12,10 @@ describe 'projects/notes/_more_actions_dropdown' do
assign(:project, project)
end
- it 'shows Report as abuse button if not editable and not current users comment' do
+ it 'shows Report abuse to GitLab button if not editable and not current users comment' do
render 'projects/notes/more_actions_dropdown', current_user: not_author_user, note_editable: false, note: note
- expect(rendered).to have_link('Report as abuse')
+ expect(rendered).to have_link('Report abuse to GitLab')
end
it 'does not show the More actions button if not editable and current users comment' do
@@ -24,10 +24,10 @@ describe 'projects/notes/_more_actions_dropdown' do
expect(rendered).not_to have_selector('.dropdown.more-actions')
end
- it 'shows Report as abuse and Delete buttons if editable and not current users comment' do
+ it 'shows Report abuse to GitLab and Delete buttons if editable and not current users comment' do
render 'projects/notes/more_actions_dropdown', current_user: not_author_user, note_editable: true, note: note
- expect(rendered).to have_link('Report as abuse')
+ expect(rendered).to have_link('Report abuse to GitLab')
expect(rendered).to have_link('Delete comment')
end
diff --git a/spec/views/projects/tree/_blob_item.html.haml_spec.rb b/spec/views/projects/tree/_tree_row.html.haml_spec.rb
index 6a477c712ff..3353b7665e2 100644
--- a/spec/views/projects/tree/_blob_item.html.haml_spec.rb
+++ b/spec/views/projects/tree/_tree_row.html.haml_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe 'projects/tree/_blob_item' do
+describe 'projects/tree/_tree_row' do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:blob_item) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID, 'files/ruby').first }
@@ -31,10 +31,7 @@ describe 'projects/tree/_blob_item' do
end
end
- def render_partial(blob_item)
- render partial: 'projects/tree/blob_item', locals: {
- blob_item: blob_item,
- type: 'blob'
- }
+ def render_partial(items)
+ render partial: 'projects/tree/tree_row', collection: [items].flatten
end
end
diff --git a/spec/views/shared/runners/show.html.haml_spec.rb b/spec/views/shared/runners/show.html.haml_spec.rb
new file mode 100644
index 00000000000..5e92928b143
--- /dev/null
+++ b/spec/views/shared/runners/show.html.haml_spec.rb
@@ -0,0 +1,155 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'shared/runners/show.html.haml' do
+ include PageLayoutHelper
+
+ let(:runner) do
+ create(:ci_runner, name: 'test runner',
+ version: '11.4.0',
+ ip_address: '127.1.2.3',
+ revision: 'abcd1234',
+ architecture: 'amd64' )
+ end
+
+ before do
+ assign(:runner, runner)
+ end
+
+ subject do
+ render
+ rendered
+ end
+
+ describe 'Page title' do
+ before do
+ expect_any_instance_of(PageLayoutHelper).to receive(:page_title).with("#{runner.description} ##{runner.id}", 'Runners')
+ end
+
+ it 'sets proper page title' do
+ render
+ end
+ end
+
+ describe 'Runner id and type' do
+ context 'when runner is of type instance' do
+ it { is_expected.to have_content("Runner ##{runner.id} Shared") }
+ end
+
+ context 'when runner is of type group' do
+ let(:runner) { create(:ci_runner, :group) }
+
+ it { is_expected.to have_content("Runner ##{runner.id} Group") }
+ end
+
+ context 'when runner is of type project' do
+ let(:runner) { create(:ci_runner, :project) }
+
+ it { is_expected.to have_content("Runner ##{runner.id} Specific") }
+ end
+ end
+
+ describe 'Active value' do
+ context 'when runner is active' do
+ it { is_expected.to have_content('Active Yes') }
+ end
+
+ context 'when runner is inactive' do
+ let(:runner) { create(:ci_runner, :inactive) }
+
+ it { is_expected.to have_content('Active No') }
+ end
+ end
+
+ describe 'Protected value' do
+ context 'when runner is not protected' do
+ it { is_expected.to have_content('Protected No') }
+ end
+
+ context 'when runner is protected' do
+ let(:runner) { create(:ci_runner, :ref_protected) }
+
+ it { is_expected.to have_content('Protected Yes') }
+ end
+ end
+
+ describe 'Can run untagged jobs value' do
+ context 'when runner run untagged job is set' do
+ it { is_expected.to have_content('Can run untagged jobs Yes') }
+ end
+
+ context 'when runner run untagged job is unset' do
+ let(:runner) { create(:ci_runner, :tagged_only) }
+
+ it { is_expected.to have_content('Can run untagged jobs No') }
+ end
+ end
+
+ describe 'Locked to this project value' do
+ context 'when runner locked is not set' do
+ it { is_expected.to have_content('Locked to this project No') }
+
+ context 'when runner is of type group' do
+ let(:runner) { create(:ci_runner, :group) }
+
+ it { is_expected.not_to have_content('Locked to this project') }
+ end
+ end
+
+ context 'when runner locked is set' do
+ let(:runner) { create(:ci_runner, :locked) }
+
+ it { is_expected.to have_content('Locked to this project Yes') }
+
+ context 'when runner is of type group' do
+ let(:runner) { create(:ci_runner, :group, :locked) }
+
+ it { is_expected.not_to have_content('Locked to this project') }
+ end
+ end
+ end
+
+ describe 'Tags value' do
+ context 'when runner does not have tags' do
+ it { is_expected.to have_content('Tags') }
+ it { is_expected.not_to have_selector('span.badge.badge-primary')}
+ end
+
+ context 'when runner have tags' do
+ let(:runner) { create(:ci_runner, tag_list: %w(tag2 tag3 tag1)) }
+
+ it { is_expected.to have_content('Tags tag1 tag2 tag3') }
+ it { is_expected.to have_selector('span.badge.badge-primary')}
+ end
+ end
+
+ describe 'Metadata values' do
+ it { is_expected.to have_content("Name #{runner.name}") }
+ it { is_expected.to have_content("Version #{runner.version}") }
+ it { is_expected.to have_content("IP Address #{runner.ip_address}") }
+ it { is_expected.to have_content("Revision #{runner.revision}") }
+ it { is_expected.to have_content("Platform #{runner.platform}") }
+ it { is_expected.to have_content("Architecture #{runner.architecture}") }
+ it { is_expected.to have_content("Description #{runner.description}") }
+ end
+
+ describe 'Maximum job timeout value' do
+ let(:runner) { create(:ci_runner, maximum_timeout: 5400) }
+
+ it { is_expected.to have_content('Maximum job timeout 1h 30m') }
+ end
+
+ describe 'Last contact value' do
+ context 'when runner have not contacted yet' do
+ it { is_expected.to have_content('Last contact Never') }
+ end
+
+ context 'when runner have already contacted' do
+ let(:runner) { create(:ci_runner, contacted_at: DateTime.now - 6.days) }
+ let(:expected_contacted_at) { I18n.localize(runner.contacted_at, format: "%b %d, %Y") }
+
+ it { is_expected.to have_content("Last contact #{expected_contacted_at}") }
+ end
+ end
+end
diff --git a/spec/workers/auto_devops/disable_worker_spec.rb b/spec/workers/auto_devops/disable_worker_spec.rb
new file mode 100644
index 00000000000..800a07e41a5
--- /dev/null
+++ b/spec/workers/auto_devops/disable_worker_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe AutoDevops::DisableWorker, '#perform' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository, :auto_devops) }
+ let(:auto_devops) { project.auto_devops }
+ let(:pipeline) { create(:ci_pipeline, :failed, :auto_devops_source, project: project, user: user) }
+
+ subject { described_class.new }
+
+ before do
+ stub_application_setting(auto_devops_enabled: true)
+ auto_devops.update_attribute(:enabled, nil)
+ end
+
+ it 'disables auto devops for project' do
+ subject.perform(pipeline.id)
+
+ expect(auto_devops.reload.enabled).to eq(false)
+ end
+
+ context 'when project owner is a user' do
+ let(:owner) { create(:user) }
+ let(:namespace) { create(:namespace, owner: owner) }
+ let(:project) { create(:project, :repository, :auto_devops, namespace: namespace) }
+
+ it 'sends an email to pipeline user and project owner' do
+ expect(NotificationService).to receive_message_chain(:new, :autodevops_disabled).with(pipeline, [user.email, owner.email])
+
+ subject.perform(pipeline.id)
+ end
+ end
+
+ context 'when project does not have owner' do
+ let(:group) { create(:group) }
+ let(:project) { create(:project, :repository, :auto_devops, namespace: group) }
+
+ it 'sends an email to pipeline user' do
+ expect(NotificationService).to receive_message_chain(:new, :autodevops_disabled).with(pipeline, [user.email])
+
+ subject.perform(pipeline.id)
+ end
+ end
+
+ context 'when pipeline is not related to a user and project does not have owner' do
+ let(:group) { create(:group) }
+ let(:project) { create(:project, :repository, :auto_devops, namespace: group) }
+ let(:pipeline) { create(:ci_pipeline, :failed, project: project) }
+
+ it 'does not send an email' do
+ expect(NotificationService).not_to receive(:new)
+
+ subject.perform(pipeline.id)
+ end
+ end
+end
diff --git a/spec/workers/build_success_worker_spec.rb b/spec/workers/build_success_worker_spec.rb
index dba70883130..5eb9709ded9 100644
--- a/spec/workers/build_success_worker_spec.rb
+++ b/spec/workers/build_success_worker_spec.rb
@@ -2,15 +2,39 @@ require 'spec_helper'
describe BuildSuccessWorker do
describe '#perform' do
+ subject { described_class.new.perform(build.id) }
+
+ before do
+ allow_any_instance_of(Deployment).to receive(:create_ref)
+ end
+
context 'when build exists' do
- context 'when build belogs to the environment' do
- let!(:build) { create(:ci_build, environment: 'production') }
+ context 'when deployment was not created with the build creation' do # An edge case during the transition period
+ let!(:build) { create(:ci_build, :deploy_to_production) }
+
+ before do
+ Deployment.delete_all
+ build.reload
+ end
- it 'executes deployment service' do
- expect_any_instance_of(CreateDeploymentService)
- .to receive(:execute)
+ it 'creates a successful deployment' do
+ expect(build).not_to be_has_deployment
- described_class.new.perform(build.id)
+ subject
+
+ build.reload
+ expect(build).to be_has_deployment
+ expect(build.deployment).to be_success
+ end
+ end
+
+ context 'when deployment was created with the build creation' do # Counter part of the above edge case
+ let!(:build) { create(:ci_build, :deploy_to_production) }
+
+ it 'does not create a new deployment' do
+ expect(build).to be_has_deployment
+
+ expect { subject }.not_to change { Deployment.count }
end
end
@@ -18,10 +42,22 @@ describe BuildSuccessWorker do
let!(:build) { create(:ci_build, project: nil) }
it 'does not create deployment' do
- expect_any_instance_of(CreateDeploymentService)
- .not_to receive(:execute)
+ subject
+
+ expect(build.reload).not_to be_has_deployment
+ end
+ end
+
+ context 'when the build will stop an environment' do
+ let!(:build) { create(:ci_build, :stop_review_app, environment: environment.name, project: environment.project) }
+ let(:environment) { create(:environment, state: :available) }
+
+ it 'stops the environment' do
+ expect(environment).to be_available
+
+ subject
- described_class.new.perform(build.id)
+ expect(environment.reload).to be_stopped
end
end
end
diff --git a/spec/workers/ci/build_schedule_worker_spec.rb b/spec/workers/ci/build_schedule_worker_spec.rb
new file mode 100644
index 00000000000..4a3fe84d7f7
--- /dev/null
+++ b/spec/workers/ci/build_schedule_worker_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe Ci::BuildScheduleWorker do
+ subject { described_class.new.perform(build.id) }
+
+ context 'when build is found' do
+ context 'when build is scheduled' do
+ let(:build) { create(:ci_build, :scheduled) }
+
+ it 'executes RunScheduledBuildService' do
+ expect_any_instance_of(Ci::RunScheduledBuildService)
+ .to receive(:execute).once
+
+ subject
+ end
+ end
+
+ context 'when build is not scheduled' do
+ let(:build) { create(:ci_build, :created) }
+
+ it 'executes RunScheduledBuildService' do
+ expect_any_instance_of(Ci::RunScheduledBuildService)
+ .not_to receive(:execute)
+
+ subject
+ end
+ end
+ end
+
+ context 'when build is not found' do
+ let(:build) { build_stubbed(:ci_build, :scheduled) }
+
+ it 'does nothing' do
+ expect_any_instance_of(Ci::RunScheduledBuildService)
+ .not_to receive(:execute)
+
+ subject
+ end
+ end
+end
diff --git a/spec/workers/cluster_platform_configure_worker_spec.rb b/spec/workers/cluster_platform_configure_worker_spec.rb
new file mode 100644
index 00000000000..b51f6e07c6a
--- /dev/null
+++ b/spec/workers/cluster_platform_configure_worker_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ClusterPlatformConfigureWorker, '#execute' do
+ context 'when provider type is gcp' do
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+
+ it 'configures kubernetes platform' do
+ expect_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute)
+
+ described_class.new.perform(cluster.id)
+ end
+ end
+
+ context 'when provider type is user' do
+ let(:cluster) { create(:cluster, :project, :provided_by_user) }
+
+ it 'configures kubernetes platform' do
+ expect_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute)
+
+ described_class.new.perform(cluster.id)
+ end
+ end
+
+ context 'when cluster does not exist' do
+ it 'does not provision a cluster' do
+ expect_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).not_to receive(:execute)
+
+ described_class.new.perform(123)
+ end
+ end
+
+ context 'when kubeclient raises error' do
+ let(:cluster) { create(:cluster, :project) }
+
+ it 'rescues and logs the error' do
+ allow_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute).and_raise(::Kubeclient::HttpError.new(500, 'something baaaad happened', ''))
+
+ expect(Rails.logger)
+ .to receive(:error)
+ .with("Failed to create/update Kubernetes namespace for cluster_id: #{cluster.id} with error: something baaaad happened")
+
+ described_class.new.perform(cluster.id)
+ end
+ end
+end
diff --git a/spec/workers/cluster_provision_worker_spec.rb b/spec/workers/cluster_provision_worker_spec.rb
index 8054ec11a48..0a2dfef36a4 100644
--- a/spec/workers/cluster_provision_worker_spec.rb
+++ b/spec/workers/cluster_provision_worker_spec.rb
@@ -14,18 +14,25 @@ describe ClusterProvisionWorker do
end
context 'when provider type is user' do
- let(:cluster) { create(:cluster, provider_type: :user) }
+ let(:cluster) { create(:cluster, :provided_by_user) }
it 'does not provision a cluster' do
expect_any_instance_of(Clusters::Gcp::ProvisionService).not_to receive(:execute)
described_class.new.perform(cluster.id)
end
+
+ it 'configures kubernetes platform' do
+ expect(ClusterPlatformConfigureWorker).to receive(:perform_async).with(cluster.id)
+
+ described_class.new.perform(cluster.id)
+ end
end
context 'when cluster does not exist' do
it 'does not provision a cluster' do
expect_any_instance_of(Clusters::Gcp::ProvisionService).not_to receive(:execute)
+ expect(ClusterPlatformConfigureWorker).not_to receive(:perform_async)
described_class.new.perform(123)
end
diff --git a/spec/workers/delete_container_repository_worker_spec.rb b/spec/workers/delete_container_repository_worker_spec.rb
new file mode 100644
index 00000000000..8c40611a959
--- /dev/null
+++ b/spec/workers/delete_container_repository_worker_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe DeleteContainerRepositoryWorker do
+ let(:registry) { create(:container_repository) }
+ let(:project) { registry.project }
+ let(:user) { project.owner }
+
+ subject { described_class.new }
+
+ describe '#perform' do
+ it 'executes the destroy service' do
+ service = instance_double(Projects::ContainerRepository::DestroyService)
+ expect(service).to receive(:execute)
+ expect(Projects::ContainerRepository::DestroyService).to receive(:new).with(project, user).and_return(service)
+
+ subject.perform(user.id, registry.id)
+ end
+
+ it 'does not raise error when user could not be found' do
+ expect do
+ subject.perform(-1, registry.id)
+ end.not_to raise_error
+ end
+
+ it 'does not raise error when registry could not be found' do
+ expect do
+ subject.perform(user.id, -1)
+ end.not_to raise_error
+ end
+ end
+end
diff --git a/spec/workers/deployments/success_worker_spec.rb b/spec/workers/deployments/success_worker_spec.rb
new file mode 100644
index 00000000000..ba7d45eca01
--- /dev/null
+++ b/spec/workers/deployments/success_worker_spec.rb
@@ -0,0 +1,36 @@
+require 'spec_helper'
+
+describe Deployments::SuccessWorker do
+ subject { described_class.new.perform(deployment&.id) }
+
+ context 'when successful deployment' do
+ let(:deployment) { create(:deployment, :success) }
+
+ it 'executes UpdateDeploymentService' do
+ expect(UpdateDeploymentService)
+ .to receive(:new).with(deployment).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when canceled deployment' do
+ let(:deployment) { create(:deployment, :canceled) }
+
+ it 'does not execute UpdateDeploymentService' do
+ expect(UpdateDeploymentService).not_to receive(:new)
+
+ subject
+ end
+ end
+
+ context 'when deploy record does not exist' do
+ let(:deployment) { nil }
+
+ it 'does not execute UpdateDeploymentService' do
+ expect(UpdateDeploymentService).not_to receive(:new)
+
+ subject
+ end
+ end
+end
diff --git a/spec/workers/email_receiver_worker_spec.rb b/spec/workers/email_receiver_worker_spec.rb
index e4e77c667b3..045135255d6 100644
--- a/spec/workers/email_receiver_worker_spec.rb
+++ b/spec/workers/email_receiver_worker_spec.rb
@@ -46,6 +46,21 @@ describe EmailReceiverWorker, :mailer do
should_not_email_anyone
end
end
+
+ context 'when the error is Gitlab::Email::InvalidAttachment' do
+ let(:error) { Gitlab::Email::InvalidAttachment.new("Could not deal with that") }
+
+ it 'reports the error to the sender' do
+ perform_enqueued_jobs do
+ described_class.new.perform(raw_message)
+ end
+
+ email = ActionMailer::Base.deliveries.last
+ expect(email).not_to be_nil
+ expect(email.to).to eq(["jake@adventuretime.ooo"])
+ expect(email.body.parts.last.to_s).to include("Could not deal with that")
+ end
+ end
end
end
diff --git a/spec/workers/emails_on_push_worker_spec.rb b/spec/workers/emails_on_push_worker_spec.rb
index f17c5ac6aac..05b4fb49ea3 100644
--- a/spec/workers/emails_on_push_worker_spec.rb
+++ b/spec/workers/emails_on_push_worker_spec.rb
@@ -101,7 +101,7 @@ describe EmailsOnPushWorker, :mailer do
context "when there are multiple recipients" do
before do
- # This is a hack because we modify the mail object before sending, for efficency,
+ # This is a hack because we modify the mail object before sending, for efficiency,
# but the TestMailer adapter just appends the objects to an array. To clone a mail
# object, create a new one!
# https://github.com/mikel/mail/issues/314#issuecomment-12750108
diff --git a/spec/workers/git_garbage_collect_worker_spec.rb b/spec/workers/git_garbage_collect_worker_spec.rb
index 30e67e67e0e..a159f24f876 100644
--- a/spec/workers/git_garbage_collect_worker_spec.rb
+++ b/spec/workers/git_garbage_collect_worker_spec.rb
@@ -3,6 +3,8 @@ require 'fileutils'
require 'spec_helper'
describe GitGarbageCollectWorker do
+ include GitHelpers
+
let(:project) { create(:project, :repository) }
let(:shell) { Gitlab::Shell.new }
let!(:lease_uuid) { SecureRandom.uuid }
@@ -197,9 +199,7 @@ describe GitGarbageCollectWorker do
# Create a new commit on a random new branch
def create_objects(project)
- rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
+ rugged = rugged_repo(project.repository)
old_commit = rugged.branches.first.target
new_commit_sha = Rugged::Commit.create(
rugged,
diff --git a/spec/workers/namespaceless_project_destroy_worker_spec.rb b/spec/workers/namespaceless_project_destroy_worker_spec.rb
index eec110dfbfb..2f21a1321e1 100644
--- a/spec/workers/namespaceless_project_destroy_worker_spec.rb
+++ b/spec/workers/namespaceless_project_destroy_worker_spec.rb
@@ -71,10 +71,10 @@ describe NamespacelessProjectDestroyWorker do
expect(merge_request.reload).to be_closed
end
- it 'destroys the link' do
+ it 'destroys fork network members' do
subject.perform(project.id)
- expect(parent_project.forked_project_links).to be_empty
+ expect(parent_project.forked_to_members).to be_empty
end
end
end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index cd6661f09a1..9176eb12b12 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -6,7 +6,7 @@ describe PostReceive do
let(:base64_changes) { Base64.encode64(wrongly_encoded_changes) }
let(:gl_repository) { "project-#{project.id}" }
let(:key) { create(:key, user: project.owner) }
- let(:key_id) { key.shell_id }
+ let!(:key_id) { key.shell_id }
let(:project) do
create(:project, :repository, auto_cancel_pending_pipelines: 'disabled')
@@ -31,85 +31,108 @@ describe PostReceive do
end
describe "#process_project_changes" do
- before do
- allow_any_instance_of(Gitlab::GitPostReceive).to receive(:identify).and_return(project.owner)
+ context 'empty changes' do
+ it "does not call any PushService but runs after project hooks" do
+ expect(GitPushService).not_to receive(:new)
+ expect(GitTagPushService).not_to receive(:new)
+ expect_next_instance_of(SystemHooksService) { |service| expect(service).to receive(:execute_hooks) }
+
+ described_class.new.perform(gl_repository, key_id, "")
+ end
end
- context "branches" do
- let(:changes) { "123456 789012 refs/heads/tést" }
+ context 'unidentified user' do
+ let!(:key_id) { "" }
- it "calls GitTagPushService" do
- expect_any_instance_of(GitPushService).to receive(:execute).and_return(true)
- expect_any_instance_of(GitTagPushService).not_to receive(:execute)
- described_class.new.perform(gl_repository, key_id, base64_changes)
+ it 'returns false' do
+ expect(GitPushService).not_to receive(:new)
+ expect(GitTagPushService).not_to receive(:new)
+
+ expect(described_class.new.perform(gl_repository, key_id, base64_changes)).to be false
end
end
- context "tags" do
- let(:changes) { "123456 789012 refs/tags/tag" }
+ context 'with changes' do
+ before do
+ allow_any_instance_of(Gitlab::GitPostReceive).to receive(:identify).and_return(project.owner)
+ end
+
+ context "branches" do
+ let(:changes) { "123456 789012 refs/heads/tést" }
- it "calls GitTagPushService" do
- expect_any_instance_of(GitPushService).not_to receive(:execute)
- expect_any_instance_of(GitTagPushService).to receive(:execute).and_return(true)
- described_class.new.perform(gl_repository, key_id, base64_changes)
+ it "calls GitPushService" do
+ expect_any_instance_of(GitPushService).to receive(:execute).and_return(true)
+ expect_any_instance_of(GitTagPushService).not_to receive(:execute)
+ described_class.new.perform(gl_repository, key_id, base64_changes)
+ end
end
- end
- context "merge-requests" do
- let(:changes) { "123456 789012 refs/merge-requests/123" }
+ context "tags" do
+ let(:changes) { "123456 789012 refs/tags/tag" }
- it "does not call any of the services" do
- expect_any_instance_of(GitPushService).not_to receive(:execute)
- expect_any_instance_of(GitTagPushService).not_to receive(:execute)
- described_class.new.perform(gl_repository, key_id, base64_changes)
+ it "calls GitTagPushService" do
+ expect_any_instance_of(GitPushService).not_to receive(:execute)
+ expect_any_instance_of(GitTagPushService).to receive(:execute).and_return(true)
+ described_class.new.perform(gl_repository, key_id, base64_changes)
+ end
end
- end
- context "gitlab-ci.yml" do
- let(:changes) { "123456 789012 refs/heads/feature\n654321 210987 refs/tags/tag" }
+ context "merge-requests" do
+ let(:changes) { "123456 789012 refs/merge-requests/123" }
- subject { described_class.new.perform(gl_repository, key_id, base64_changes) }
+ it "does not call any of the services" do
+ expect_any_instance_of(GitPushService).not_to receive(:execute)
+ expect_any_instance_of(GitTagPushService).not_to receive(:execute)
+ described_class.new.perform(gl_repository, key_id, base64_changes)
+ end
+ end
- context "creates a Ci::Pipeline for every change" do
- before do
- stub_ci_pipeline_to_return_yaml_file
+ context "gitlab-ci.yml" do
+ let(:changes) { "123456 789012 refs/heads/feature\n654321 210987 refs/tags/tag" }
- allow_any_instance_of(Project)
- .to receive(:commit)
- .and_return(project.commit)
+ subject { described_class.new.perform(gl_repository, key_id, base64_changes) }
- allow_any_instance_of(Repository)
- .to receive(:branch_exists?)
- .and_return(true)
- end
+ context "creates a Ci::Pipeline for every change" do
+ before do
+ stub_ci_pipeline_to_return_yaml_file
- it { expect { subject }.to change { Ci::Pipeline.count }.by(2) }
- end
+ allow_any_instance_of(Project)
+ .to receive(:commit)
+ .and_return(project.commit)
- context "does not create a Ci::Pipeline" do
- before do
- stub_ci_pipeline_yaml_file(nil)
+ allow_any_instance_of(Repository)
+ .to receive(:branch_exists?)
+ .and_return(true)
+ end
+
+ it { expect { subject }.to change { Ci::Pipeline.count }.by(2) }
end
- it { expect { subject }.not_to change { Ci::Pipeline.count } }
+ context "does not create a Ci::Pipeline" do
+ before do
+ stub_ci_pipeline_yaml_file(nil)
+ end
+
+ it { expect { subject }.not_to change { Ci::Pipeline.count } }
+ end
end
- end
- context 'after project changes hooks' do
- let(:changes) { '123456 789012 refs/heads/tést' }
- let(:fake_hook_data) { Hash.new(event_name: 'repository_update') }
+ context 'after project changes hooks' do
+ let(:changes) { '123456 789012 refs/heads/tést' }
+ let(:fake_hook_data) { Hash.new(event_name: 'repository_update') }
- before do
- allow_any_instance_of(Gitlab::DataBuilder::Repository).to receive(:update).and_return(fake_hook_data)
- # silence hooks so we can isolate
- allow_any_instance_of(Key).to receive(:post_create_hook).and_return(true)
- allow_any_instance_of(GitPushService).to receive(:execute).and_return(true)
- end
+ before do
+ allow_any_instance_of(Gitlab::DataBuilder::Repository).to receive(:update).and_return(fake_hook_data)
+ # silence hooks so we can isolate
+ allow_any_instance_of(Key).to receive(:post_create_hook).and_return(true)
+ allow_any_instance_of(GitPushService).to receive(:execute).and_return(true)
+ end
- it 'calls SystemHooksService' do
- expect_any_instance_of(SystemHooksService).to receive(:execute_hooks).with(fake_hook_data, :repository_update_hooks).and_return(true)
+ it 'calls SystemHooksService' do
+ expect_any_instance_of(SystemHooksService).to receive(:execute_hooks).with(fake_hook_data, :repository_update_hooks).and_return(true)
- described_class.new.perform(gl_repository, key_id, base64_changes)
+ described_class.new.perform(gl_repository, key_id, base64_changes)
+ end
end
end
end
diff --git a/spec/workers/project_destroy_worker_spec.rb b/spec/workers/project_destroy_worker_spec.rb
index 42e1d86e3bb..6132f145f8d 100644
--- a/spec/workers/project_destroy_worker_spec.rb
+++ b/spec/workers/project_destroy_worker_spec.rb
@@ -18,13 +18,6 @@ describe ProjectDestroyWorker do
expect(Dir.exist?(path)).to be_falsey
end
- it 'deletes the project but skips repo deletion' do
- subject.perform(project.id, project.owner.id, { "skip_repo" => true })
-
- expect(Project.all).not_to include(project)
- expect(Dir.exist?(path)).to be_truthy
- end
-
it 'does not raise error when project could not be found' do
expect do
subject.perform(-1, project.owner.id, {})
diff --git a/spec/workers/project_service_worker_spec.rb b/spec/workers/project_service_worker_spec.rb
new file mode 100644
index 00000000000..56934f122e4
--- /dev/null
+++ b/spec/workers/project_service_worker_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe ProjectServiceWorker, '#perform' do
+ let(:worker) { described_class.new }
+ let(:service) { JiraService.new }
+
+ before do
+ allow(Service).to receive(:find).and_return(service)
+ end
+
+ it 'executes service with given data' do
+ data = { test: 'test' }
+ expect(service).to receive(:execute).with(data)
+
+ worker.perform(1, data)
+ end
+
+ it 'logs error messages' do
+ allow(service).to receive(:execute).and_raise(StandardError, 'invalid URL')
+ expect(Sidekiq.logger).to receive(:error).with({ class: described_class.name, service_class: service.class.name, message: "invalid URL" })
+
+ worker.perform(1, {})
+ end
+end
diff --git a/spec/workers/prune_old_events_worker_spec.rb b/spec/workers/prune_old_events_worker_spec.rb
index ea974355050..b999a6fd5b6 100644
--- a/spec/workers/prune_old_events_worker_spec.rb
+++ b/spec/workers/prune_old_events_worker_spec.rb
@@ -4,23 +4,29 @@ describe PruneOldEventsWorker do
describe '#perform' do
let(:user) { create(:user) }
- let!(:expired_event) { create(:event, :closed, author: user, created_at: 13.months.ago) }
- let!(:not_expired_event) { create(:event, :closed, author: user, created_at: 1.day.ago) }
- let!(:exactly_12_months_event) { create(:event, :closed, author: user, created_at: 12.months.ago) }
+ let!(:expired_event) { create(:event, :closed, author: user, created_at: 25.months.ago) }
+ let!(:not_expired_1_day_event) { create(:event, :closed, author: user, created_at: 1.day.ago) }
+ let!(:not_expired_13_month_event) { create(:event, :closed, author: user, created_at: 13.months.ago) }
+ let!(:not_expired_2_years_event) { create(:event, :closed, author: user, created_at: 2.years.ago) }
- it 'prunes events older than 12 months' do
+ it 'prunes events older than 2 years' do
expect { subject.perform }.to change { Event.count }.by(-1)
expect(Event.find_by(id: expired_event.id)).to be_nil
end
it 'leaves fresh events' do
subject.perform
- expect(not_expired_event.reload).to be_present
+ expect(not_expired_1_day_event.reload).to be_present
end
- it 'leaves events from exactly 12 months ago' do
+ it 'leaves events from 13 months ago' do
subject.perform
- expect(exactly_12_months_event).to be_present
+ expect(not_expired_13_month_event.reload).to be_present
+ end
+
+ it 'leaves events from 2 years ago' do
+ subject.perform
+ expect(not_expired_2_years_event).to be_present
end
end
end
diff --git a/spec/workers/rebase_worker_spec.rb b/spec/workers/rebase_worker_spec.rb
index 20aff020dbb..936b9deaecc 100644
--- a/spec/workers/rebase_worker_spec.rb
+++ b/spec/workers/rebase_worker_spec.rb
@@ -1,25 +1,23 @@
require 'spec_helper'
describe RebaseWorker, '#perform' do
+ include ProjectForksHelper
+
context 'when rebasing an MR from a fork where upstream has protected branches' do
let(:upstream_project) { create(:project, :repository) }
- let(:fork_project) { create(:project, :repository) }
+ let(:forked_project) { fork_project(upstream_project, nil, repository: true) }
let(:merge_request) do
create(:merge_request,
- source_project: fork_project,
+ source_project: forked_project,
source_branch: 'feature_conflict',
target_project: upstream_project,
target_branch: 'master')
end
- before do
- create(:forked_project_link, forked_to_project: fork_project, forked_from_project: upstream_project)
- end
-
it 'sets the correct project for running hooks' do
expect(MergeRequests::RebaseService)
- .to receive(:new).with(fork_project, merge_request.author).and_call_original
+ .to receive(:new).with(forked_project, merge_request.author).and_call_original
subject.perform(merge_request, merge_request.author)
end
diff --git a/spec/workers/repository_check/batch_worker_spec.rb b/spec/workers/repository_check/batch_worker_spec.rb
index ede271b2cdd..50b93fce2dc 100644
--- a/spec/workers/repository_check/batch_worker_spec.rb
+++ b/spec/workers/repository_check/batch_worker_spec.rb
@@ -51,7 +51,7 @@ describe RepositoryCheck::BatchWorker do
it 'does nothing when shard is unhealthy' do
shard_name = 'broken'
- create(:project, created_at: 1.week.ago, repository_storage: shard_name)
+ create(:project, :broken_storage, created_at: 1.week.ago)
expect(subject.perform(shard_name)).to eq(nil)
end
diff --git a/spec/workers/repository_check/single_repository_worker_spec.rb b/spec/workers/repository_check/single_repository_worker_spec.rb
index 22fc64c1536..f11875cffd1 100644
--- a/spec/workers/repository_check/single_repository_worker_spec.rb
+++ b/spec/workers/repository_check/single_repository_worker_spec.rb
@@ -6,7 +6,7 @@ describe RepositoryCheck::SingleRepositoryWorker do
it 'skips when the project has no push events' do
project = create(:project, :repository, :wiki_disabled)
- project.events.destroy_all
+ project.events.destroy_all # rubocop: disable DestroyAll
break_project(project)
expect(worker).not_to receive(:git_fsck)
diff --git a/spec/workers/repository_fork_worker_spec.rb b/spec/workers/repository_fork_worker_spec.rb
index ac8716ecfb1..781f91ac9ca 100644
--- a/spec/workers/repository_fork_worker_spec.rb
+++ b/spec/workers/repository_fork_worker_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe RepositoryForkWorker do
+ include ProjectForksHelper
+
describe 'modules' do
it 'includes ProjectImportOptions' do
expect(described_class).to include_module(ProjectImportOptions)
@@ -8,9 +10,13 @@ describe RepositoryForkWorker do
end
describe "#perform" do
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :public, :repository) }
let(:shell) { Gitlab::Shell.new }
- let(:fork_project) { create(:project, :repository, :import_scheduled, forked_from_project: project) }
+ let(:forked_project) { create(:project, :repository, :import_scheduled) }
+
+ before do
+ fork_project(project, forked_project.creator, target_project: forked_project, repository: true)
+ end
shared_examples 'RepositoryForkWorker performing' do
before do
@@ -21,8 +27,8 @@ describe RepositoryForkWorker do
expect(shell).to receive(:fork_repository).with(
'default',
project.disk_path,
- fork_project.repository_storage,
- fork_project.disk_path
+ forked_project.repository_storage,
+ forked_project.disk_path
)
end
@@ -49,28 +55,28 @@ describe RepositoryForkWorker do
perform!
- expect(fork_project.protected_branches.first.name).to eq(fork_project.default_branch)
+ expect(forked_project.protected_branches.first.name).to eq(forked_project.default_branch)
end
it 'flushes various caches' do
expect_fork_repository.and_return(true)
# Works around https://github.com/rspec/rspec-mocks/issues/910
- expect(Project).to receive(:find).with(fork_project.id).and_return(fork_project)
- expect(fork_project.repository).to receive(:expire_emptiness_caches)
+ expect(Project).to receive(:find).with(forked_project.id).and_return(forked_project)
+ expect(forked_project.repository).to receive(:expire_emptiness_caches)
.and_call_original
- expect(fork_project.repository).to receive(:expire_exists_cache)
+ expect(forked_project.repository).to receive(:expire_exists_cache)
.and_call_original
- expect(fork_project.wiki.repository).to receive(:expire_emptiness_caches)
+ expect(forked_project.wiki.repository).to receive(:expire_emptiness_caches)
.and_call_original
- expect(fork_project.wiki.repository).to receive(:expire_exists_cache)
+ expect(forked_project.wiki.repository).to receive(:expire_exists_cache)
.and_call_original
perform!
end
it "handles bad fork" do
- error_message = "Unable to fork project #{fork_project.id} for repository #{project.disk_path} -> #{fork_project.disk_path}"
+ error_message = "Unable to fork project #{forked_project.id} for repository #{project.disk_path} -> #{forked_project.disk_path}"
expect_fork_repository.and_return(false)
@@ -80,7 +86,7 @@ describe RepositoryForkWorker do
context 'only project ID passed' do
def perform!
- subject.perform(fork_project.id)
+ subject.perform(forked_project.id)
end
it_behaves_like 'RepositoryForkWorker performing'
@@ -88,7 +94,7 @@ describe RepositoryForkWorker do
context 'project ID, storage and repo paths passed' do
def perform!
- subject.perform(fork_project.id, TestEnv.repos_path, project.disk_path)
+ subject.perform(forked_project.id, TestEnv.repos_path, project.disk_path)
end
it_behaves_like 'RepositoryForkWorker performing'
diff --git a/spec/workers/repository_remove_remote_worker_spec.rb b/spec/workers/repository_remove_remote_worker_spec.rb
index a653f6f926c..6ddb653d142 100644
--- a/spec/workers/repository_remove_remote_worker_spec.rb
+++ b/spec/workers/repository_remove_remote_worker_spec.rb
@@ -2,6 +2,7 @@ require 'rails_helper'
describe RepositoryRemoveRemoteWorker do
include ExclusiveLeaseHelpers
+ include GitHelpers
describe '#perform' do
let!(:project) { create(:project, :repository) }
@@ -50,9 +51,7 @@ describe RepositoryRemoveRemoteWorker do
end
def create_remote_branch(remote_name, branch_name, target)
- rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- project.repository.rugged
- end
+ rugged = rugged_repo(project.repository)
rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
end
diff --git a/spec/workers/stuck_ci_jobs_worker_spec.rb b/spec/workers/stuck_ci_jobs_worker_spec.rb
index 856886e3df5..557934346c9 100644
--- a/spec/workers/stuck_ci_jobs_worker_spec.rb
+++ b/spec/workers/stuck_ci_jobs_worker_spec.rb
@@ -127,6 +127,47 @@ describe StuckCiJobsWorker do
end
end
+ describe 'drop stale scheduled builds' do
+ let(:status) { 'scheduled' }
+ let(:updated_at) { }
+
+ context 'when scheduled at 2 hours ago but it is not executed yet' do
+ let!(:job) { create(:ci_build, :scheduled, scheduled_at: 2.hours.ago) }
+
+ it 'drops the stale scheduled build' do
+ expect(Ci::Build.scheduled.count).to eq(1)
+ expect(job).to be_scheduled
+
+ worker.perform
+ job.reload
+
+ expect(Ci::Build.scheduled.count).to eq(0)
+ expect(job).to be_failed
+ expect(job).to be_stale_schedule
+ end
+ end
+
+ context 'when scheduled at 30 minutes ago but it is not executed yet' do
+ let!(:job) { create(:ci_build, :scheduled, scheduled_at: 30.minutes.ago) }
+
+ it 'does not drop the stale scheduled build yet' do
+ expect(Ci::Build.scheduled.count).to eq(1)
+ expect(job).to be_scheduled
+
+ worker.perform
+
+ expect(Ci::Build.scheduled.count).to eq(1)
+ expect(job).to be_scheduled
+ end
+ end
+
+ context 'when there are no stale scheduled builds' do
+ it 'does not drop the stale scheduled build yet' do
+ expect { worker.perform }.not_to raise_error
+ end
+ end
+ end
+
describe 'exclusive lease' do
let(:status) { 'running' }
let(:updated_at) { 2.days.ago }
diff --git a/spec/workers/stuck_import_jobs_worker_spec.rb b/spec/workers/stuck_import_jobs_worker_spec.rb
index 2169c14218b..e94d2be9850 100644
--- a/spec/workers/stuck_import_jobs_worker_spec.rb
+++ b/spec/workers/stuck_import_jobs_worker_spec.rb
@@ -8,29 +8,29 @@ describe StuckImportJobsWorker do
context 'when the import status was already updated' do
before do
allow(Gitlab::SidekiqStatus).to receive(:completed_jids) do
- project.import_start
- project.import_finish
+ import_state.start
+ import_state.finish
- [project.import_jid]
+ [import_state.jid]
end
end
it 'does not mark the project as failed' do
worker.perform
- expect(project.reload.import_status).to eq('finished')
+ expect(import_state.reload.status).to eq('finished')
end
end
context 'when the import status was not updated' do
before do
- allow(Gitlab::SidekiqStatus).to receive(:completed_jids).and_return([project.import_jid])
+ allow(Gitlab::SidekiqStatus).to receive(:completed_jids).and_return([import_state.jid])
end
it 'marks the project as failed' do
worker.perform
- expect(project.reload.import_status).to eq('failed')
+ expect(import_state.reload.status).to eq('failed')
end
end
end
@@ -41,27 +41,27 @@ describe StuckImportJobsWorker do
end
it 'does not mark the project as failed' do
- expect { worker.perform }.not_to change { project.reload.import_status }
+ expect { worker.perform }.not_to change { import_state.reload.status }
end
end
end
describe 'with scheduled import_status' do
it_behaves_like 'project import job detection' do
- let(:project) { create(:project, :import_scheduled) }
+ let(:import_state) { create(:project, :import_scheduled).import_state }
before do
- project.import_state.update(jid: '123')
+ import_state.update(jid: '123')
end
end
end
describe 'with started import_status' do
it_behaves_like 'project import job detection' do
- let(:project) { create(:project, :import_started) }
+ let(:import_state) { create(:project, :import_started).import_state }
before do
- project.import_state.update(jid: '123')
+ import_state.update(jid: '123')
end
end
end